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
diff options
context:
space:
mode:
-rw-r--r--.gitmodules2
-rw-r--r--CMakeLists.txt53
-rw-r--r--GNUmakefile32
-rw-r--r--build_files/build_environment/CMakeLists.txt24
-rw-r--r--build_files/build_environment/cmake/embree.cmake69
-rw-r--r--build_files/build_environment/cmake/ffi.cmake2
-rw-r--r--build_files/build_environment/cmake/ffmpeg.cmake1
-rw-r--r--build_files/build_environment/cmake/harvest.cmake5
-rw-r--r--build_files/build_environment/cmake/opencollada.cmake8
-rw-r--r--build_files/build_environment/cmake/openvdb.cmake9
-rw-r--r--build_files/build_environment/cmake/options.cmake3
-rw-r--r--build_files/build_environment/cmake/osl.cmake15
-rw-r--r--build_files/build_environment/cmake/python.cmake31
-rw-r--r--build_files/build_environment/cmake/sdl.cmake1
-rw-r--r--build_files/build_environment/cmake/ssl.cmake12
-rw-r--r--build_files/build_environment/cmake/ssl.conf9
-rw-r--r--build_files/build_environment/cmake/versions.cmake6
-rw-r--r--build_files/build_environment/cmake/zlib.cmake2
-rwxr-xr-xbuild_files/build_environment/install_deps.sh413
-rw-r--r--build_files/build_environment/patches/ffi.diff11
-rw-r--r--build_files/build_environment/patches/install_deps_llvm.diff11
-rw-r--r--build_files/build_environment/patches/install_deps_osl.diff12
-rw-r--r--build_files/build_environment/patches/opencolorio.diff20
-rw-r--r--build_files/build_environment/patches/sdl.diff22
-rw-r--r--build_files/build_environment/windows/build_deps.cmd22
-rw-r--r--build_files/buildbot/config/blender_linux.cmake8
-rw-r--r--build_files/buildbot/slave_compile.py2
-rw-r--r--build_files/cmake/Modules/FindEmbree.cmake108
-rw-r--r--build_files/cmake/Modules/FindJeMalloc.cmake9
-rw-r--r--build_files/cmake/Modules/FindOpenColorIO.cmake2
-rw-r--r--build_files/cmake/Modules/FindOpenJPEG.cmake13
-rw-r--r--build_files/cmake/Modules/FindPCRE.cmake7
-rw-r--r--build_files/cmake/Modules/FindPythonLibsUnix.cmake2
-rw-r--r--build_files/cmake/clang_array_check.py2
-rwxr-xr-xbuild_files/cmake/cmake_consistency_check.py4
-rwxr-xr-xbuild_files/cmake/cmake_netbeans_project.py2
-rw-r--r--build_files/cmake/cmake_print_build_options.py25
-rwxr-xr-xbuild_files/cmake/cmake_qtcreator_project.py2
-rw-r--r--build_files/cmake/config/blender_full.cmake2
-rw-r--r--build_files/cmake/config/blender_headless.cmake2
-rw-r--r--build_files/cmake/config/blender_release.cmake3
-rw-r--r--build_files/cmake/config/bpy_module.cmake2
-rw-r--r--build_files/cmake/macros.cmake38
-rw-r--r--build_files/cmake/platform/platform_apple.cmake49
-rw-r--r--build_files/cmake/platform/platform_apple_xcode.cmake4
-rw-r--r--build_files/cmake/platform/platform_unix.cmake6
-rw-r--r--build_files/cmake/platform/platform_win32.cmake64
-rwxr-xr-xbuild_files/utils/build_tgz.sh2
-rw-r--r--build_files/windows/check_libraries.cmd2
-rw-r--r--build_files/windows/configure_msbuild.cmd8
-rw-r--r--build_files/windows/detect_msvc_classic.cmd2
-rw-r--r--build_files/windows/find_dependencies.cmd8
-rw-r--r--build_files/windows/parse_arguments.cmd5
-rw-r--r--build_files/windows/reset_variables.cmd2
-rw-r--r--build_files/windows/show_help.cmd2
-rw-r--r--build_files/windows/update_sources.cmd6
-rwxr-xr-xdoc/blender_file_format/BlendFileDnaExporter_25.py2
-rw-r--r--doc/blender_file_format/README4
-rw-r--r--doc/blender_file_format/mystery_of_the_blend.html4
-rw-r--r--doc/doxygen/doxygen.source.h4
-rw-r--r--doc/guides/blender-guardedalloc.txt2
-rw-r--r--doc/guides/interface_API.txt12
-rw-r--r--doc/python_api/examples/bpy.app.handlers.1.py2
-rw-r--r--doc/python_api/examples/bpy.types.Menu.3.py38
-rw-r--r--doc/python_api/examples/bpy.types.Object.py27
-rw-r--r--doc/python_api/examples/gpu.1.py107
-rw-r--r--doc/python_api/examples/gpu.2.py19
-rw-r--r--doc/python_api/examples/gpu.3.py44
-rw-r--r--doc/python_api/examples/gpu.4.py28
-rw-r--r--doc/python_api/examples/gpu.5.py33
-rw-r--r--doc/python_api/examples/gpu.6.py24
-rw-r--r--doc/python_api/examples/gpu.7.py31
-rw-r--r--doc/python_api/examples/gpu.8.py84
-rw-r--r--doc/python_api/examples/gpu.9.py52
-rw-r--r--doc/python_api/examples/gpu.offscreen.1.py193
-rw-r--r--doc/python_api/examples/gpu.shader.py35
-rw-r--r--doc/python_api/examples/gpu.types.GPUOffScreen.py267
-rw-r--r--doc/python_api/examples/mathutils.Color.py4
-rw-r--r--doc/python_api/examples/mathutils.Quaternion.py2
-rw-r--r--doc/python_api/rst/bgl.rst2
-rw-r--r--doc/python_api/rst/gpu.rst20
-rw-r--r--doc/python_api/rst/include__bmesh.rst2
-rw-r--r--doc/python_api/rst/info_api_reference.rst2
-rw-r--r--doc/python_api/rst/info_best_practice.rst16
-rw-r--r--doc/python_api/rst/info_gotcha.rst53
-rw-r--r--doc/python_api/rst/info_tips_and_tricks.rst2
-rw-r--r--doc/python_api/rst_from_bmesh_opdefines.py6
-rw-r--r--doc/python_api/sphinx_changelog_gen.py6
-rw-r--r--doc/python_api/sphinx_doc_gen.py38
-rwxr-xr-xdoc/python_api/sphinx_doc_gen.sh7
-rw-r--r--extern/CMakeLists.txt4
-rw-r--r--extern/libopenjpeg/README.blender5
-rw-r--r--extern/libopenjpeg/bio.c187
-rw-r--r--extern/libopenjpeg/bio.h125
-rw-r--r--extern/libopenjpeg/cidx_manager.c211
-rw-r--r--extern/libopenjpeg/cidx_manager.h56
-rw-r--r--extern/libopenjpeg/cio.c199
-rw-r--r--extern/libopenjpeg/cio.h93
-rw-r--r--extern/libopenjpeg/dwt.c858
-rw-r--r--extern/libopenjpeg/dwt.h113
-rw-r--r--extern/libopenjpeg/event.c121
-rw-r--r--extern/libopenjpeg/event.h58
-rw-r--r--extern/libopenjpeg/fix.h64
-rw-r--r--extern/libopenjpeg/image.c89
-rw-r--r--extern/libopenjpeg/image.h48
-rw-r--r--extern/libopenjpeg/indexbox_manager.h118
-rw-r--r--extern/libopenjpeg/int.h119
-rw-r--r--extern/libopenjpeg/j2k.c2699
-rw-r--r--extern/libopenjpeg/j2k.h446
-rw-r--r--extern/libopenjpeg/j2k_lib.c59
-rw-r--r--extern/libopenjpeg/j2k_lib.h54
-rw-r--r--extern/libopenjpeg/jp2.c1325
-rw-r--r--extern/libopenjpeg/jp2.h234
-rw-r--r--extern/libopenjpeg/jpt.c155
-rw-r--r--extern/libopenjpeg/jpt.h75
-rw-r--r--extern/libopenjpeg/license.txt30
-rw-r--r--extern/libopenjpeg/mct.c190
-rw-r--r--extern/libopenjpeg/mct.h98
-rw-r--r--extern/libopenjpeg/mqc.c592
-rw-r--r--extern/libopenjpeg/mqc.h200
-rw-r--r--extern/libopenjpeg/openjpeg.c343
-rw-r--r--extern/libopenjpeg/openjpeg.h914
-rw-r--r--extern/libopenjpeg/opj_config.h39
-rw-r--r--extern/libopenjpeg/opj_includes.h139
-rw-r--r--extern/libopenjpeg/opj_malloc.h165
-rw-r--r--extern/libopenjpeg/phix_manager.c170
-rw-r--r--extern/libopenjpeg/pi.c963
-rw-r--r--extern/libopenjpeg/pi.h156
-rw-r--r--extern/libopenjpeg/ppix_manager.c173
-rw-r--r--extern/libopenjpeg/raw.c87
-rw-r--r--extern/libopenjpeg/raw.h100
-rw-r--r--extern/libopenjpeg/t1.c1585
-rw-r--r--extern/libopenjpeg/t1.h147
-rw-r--r--extern/libopenjpeg/t1_luts.h143
-rw-r--r--extern/libopenjpeg/t2.c825
-rw-r--r--extern/libopenjpeg/t2.h105
-rw-r--r--extern/libopenjpeg/tcd.c1601
-rw-r--r--extern/libopenjpeg/tcd.h286
-rw-r--r--extern/libopenjpeg/tgt.c213
-rw-r--r--extern/libopenjpeg/tgt.h114
-rw-r--r--extern/libopenjpeg/thix_manager.c120
-rw-r--r--extern/libopenjpeg/tpix_manager.c153
-rw-r--r--intern/cycles/CMakeLists.txt25
-rw-r--r--intern/cycles/app/CMakeLists.txt8
-rw-r--r--intern/cycles/app/cycles_xml.h2
-rw-r--r--intern/cycles/blender/CCL_api.h2
-rw-r--r--intern/cycles/blender/addon/engine.py47
-rw-r--r--intern/cycles/blender/addon/properties.py45
-rw-r--r--intern/cycles/blender/addon/ui.py670
-rw-r--r--intern/cycles/blender/blender_curves.cpp30
-rw-r--r--intern/cycles/blender/blender_logging.cpp2
-rw-r--r--intern/cycles/blender/blender_mesh.cpp182
-rw-r--r--intern/cycles/blender/blender_object.cpp19
-rw-r--r--intern/cycles/blender/blender_object_cull.h2
-rw-r--r--intern/cycles/blender/blender_python.cpp12
-rw-r--r--intern/cycles/blender/blender_session.cpp90
-rw-r--r--intern/cycles/blender/blender_session.h11
-rw-r--r--intern/cycles/blender/blender_shader.cpp4
-rw-r--r--intern/cycles/blender/blender_sync.cpp87
-rw-r--r--intern/cycles/blender/blender_sync.h8
-rw-r--r--intern/cycles/blender/blender_util.h19
-rw-r--r--intern/cycles/bvh/CMakeLists.txt2
-rw-r--r--intern/cycles/bvh/bvh.cpp11
-rw-r--r--intern/cycles/bvh/bvh.h8
-rw-r--r--intern/cycles/bvh/bvh2.h2
-rw-r--r--intern/cycles/bvh/bvh4.h2
-rw-r--r--intern/cycles/bvh/bvh8.cpp31
-rw-r--r--intern/cycles/bvh/bvh8.h2
-rw-r--r--intern/cycles/bvh/bvh_build.h3
-rw-r--r--intern/cycles/bvh/bvh_embree.cpp884
-rw-r--r--intern/cycles/bvh/bvh_embree.h79
-rw-r--r--intern/cycles/bvh/bvh_node.h2
-rw-r--r--intern/cycles/bvh/bvh_params.h14
-rw-r--r--intern/cycles/bvh/bvh_sort.h2
-rw-r--r--intern/cycles/bvh/bvh_split.h2
-rw-r--r--intern/cycles/bvh/bvh_unaligned.h2
-rw-r--r--intern/cycles/cmake/external_libs.cmake6
-rw-r--r--intern/cycles/device/device.cpp2
-rw-r--r--intern/cycles/device/device.h11
-rw-r--r--intern/cycles/device/device_cpu.cpp62
-rw-r--r--intern/cycles/device/device_cuda.cpp46
-rw-r--r--intern/cycles/device/device_denoising.cpp10
-rw-r--r--intern/cycles/device/device_denoising.h2
-rw-r--r--intern/cycles/device/device_intern.h12
-rw-r--r--intern/cycles/device/device_memory.h3
-rw-r--r--intern/cycles/device/device_multi.cpp8
-rw-r--r--intern/cycles/device/device_network.cpp5
-rw-r--r--intern/cycles/device/device_network.h2
-rw-r--r--intern/cycles/device/device_opencl.cpp7
-rw-r--r--intern/cycles/device/device_split_kernel.h2
-rw-r--r--intern/cycles/device/device_task.h4
-rw-r--r--intern/cycles/device/opencl/opencl.h4
-rw-r--r--intern/cycles/device/opencl/opencl_base.cpp57
-rw-r--r--intern/cycles/device/opencl/opencl_mega.cpp4
-rw-r--r--intern/cycles/device/opencl/opencl_split.cpp6
-rw-r--r--intern/cycles/device/opencl/opencl_util.cpp8
-rw-r--r--intern/cycles/graph/node.h2
-rw-r--r--intern/cycles/graph/node_type.h2
-rw-r--r--intern/cycles/kernel/CMakeLists.txt6
-rw-r--r--intern/cycles/kernel/bvh/bvh.h171
-rw-r--r--intern/cycles/kernel/bvh/bvh_embree.h126
-rw-r--r--intern/cycles/kernel/bvh/bvh_local.h7
-rw-r--r--intern/cycles/kernel/bvh/bvh_shadow_all.h4
-rw-r--r--intern/cycles/kernel/bvh/bvh_traversal.h4
-rw-r--r--intern/cycles/kernel/bvh/bvh_volume.h4
-rw-r--r--intern/cycles/kernel/bvh/bvh_volume_all.h4
-rw-r--r--intern/cycles/kernel/bvh/obvh_local.h11
-rw-r--r--intern/cycles/kernel/bvh/obvh_shadow_all.h8
-rw-r--r--intern/cycles/kernel/bvh/obvh_traversal.h10
-rw-r--r--intern/cycles/kernel/bvh/obvh_volume.h6
-rw-r--r--intern/cycles/kernel/bvh/obvh_volume_all.h6
-rw-r--r--intern/cycles/kernel/bvh/qbvh_local.h9
-rw-r--r--intern/cycles/kernel/bvh/qbvh_shadow_all.h7
-rw-r--r--intern/cycles/kernel/bvh/qbvh_traversal.h10
-rw-r--r--intern/cycles/kernel/bvh/qbvh_volume.h6
-rw-r--r--intern/cycles/kernel/bvh/qbvh_volume_all.h6
-rw-r--r--intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h2
-rw-r--r--intern/cycles/kernel/closure/bsdf_ashikhmin_velvet.h2
-rw-r--r--intern/cycles/kernel/closure/bsdf_diffuse.h2
-rw-r--r--intern/cycles/kernel/closure/bsdf_diffuse_ramp.h4
-rw-r--r--intern/cycles/kernel/closure/bsdf_hair.h2
-rw-r--r--intern/cycles/kernel/closure/bsdf_hair_principled.h8
-rw-r--r--intern/cycles/kernel/closure/bsdf_microfacet.h2
-rw-r--r--intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h8
-rw-r--r--intern/cycles/kernel/closure/bsdf_oren_nayar.h2
-rw-r--r--intern/cycles/kernel/closure/bsdf_phong_ramp.h4
-rw-r--r--intern/cycles/kernel/closure/bsdf_principled_diffuse.h2
-rw-r--r--intern/cycles/kernel/closure/bsdf_principled_sheen.h2
-rw-r--r--intern/cycles/kernel/closure/bsdf_reflection.h2
-rw-r--r--intern/cycles/kernel/closure/bsdf_refraction.h2
-rw-r--r--intern/cycles/kernel/closure/bsdf_toon.h2
-rw-r--r--intern/cycles/kernel/closure/bsdf_transparent.h2
-rw-r--r--intern/cycles/kernel/closure/bsdf_util.h2
-rw-r--r--intern/cycles/kernel/closure/bssrdf.h2
-rw-r--r--intern/cycles/kernel/filter/filter.h2
-rw-r--r--intern/cycles/kernel/filter/filter_defines.h2
-rw-r--r--intern/cycles/kernel/filter/filter_nlm_cpu.h139
-rw-r--r--intern/cycles/kernel/geom/geom_curve_intersect.h26
-rw-r--r--intern/cycles/kernel/geom/geom_object.h24
-rw-r--r--intern/cycles/kernel/geom/geom_subd_triangle.h4
-rw-r--r--intern/cycles/kernel/geom/geom_triangle_intersect.h2
-rw-r--r--intern/cycles/kernel/kernel.h2
-rw-r--r--intern/cycles/kernel/kernel_color.h2
-rw-r--r--intern/cycles/kernel/kernel_compat_cpu.h2
-rw-r--r--intern/cycles/kernel/kernel_compat_cuda.h2
-rw-r--r--intern/cycles/kernel/kernel_compat_opencl.h2
-rw-r--r--intern/cycles/kernel/kernel_globals.h8
-rw-r--r--intern/cycles/kernel/kernel_id_passes.h94
-rw-r--r--intern/cycles/kernel/kernel_math.h2
-rw-r--r--intern/cycles/kernel/kernel_montecarlo.h99
-rw-r--r--intern/cycles/kernel/kernel_passes.h47
-rw-r--r--intern/cycles/kernel/kernel_path.h8
-rw-r--r--intern/cycles/kernel/kernel_path_volume.h8
-rw-r--r--intern/cycles/kernel/kernel_queues.h2
-rw-r--r--intern/cycles/kernel/kernel_random.h2
-rw-r--r--intern/cycles/kernel/kernel_shader.h5
-rw-r--r--intern/cycles/kernel/kernel_shadow.h2
-rw-r--r--intern/cycles/kernel/kernel_types.h49
-rw-r--r--intern/cycles/kernel/kernel_volume.h8
-rw-r--r--intern/cycles/kernel/kernels/cpu/filter_cpu.h1
-rw-r--r--intern/cycles/kernel/kernels/cpu/filter_cpu_impl.h3
-rw-r--r--intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h4
-rw-r--r--intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h10
-rw-r--r--intern/cycles/kernel/kernels/cuda/filter.cu23
-rw-r--r--intern/cycles/kernel/kernels/cuda/kernel.cu30
-rw-r--r--intern/cycles/kernel/kernels/opencl/filter.cl23
-rw-r--r--intern/cycles/kernel/kernels/opencl/kernel.cl12
-rw-r--r--intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h2
-rw-r--r--intern/cycles/kernel/osl/osl_closures.h2
-rw-r--r--intern/cycles/kernel/osl/osl_globals.h2
-rw-r--r--intern/cycles/kernel/osl/osl_services.cpp32
-rw-r--r--intern/cycles/kernel/osl/osl_services.h9
-rw-r--r--intern/cycles/kernel/osl/osl_shader.cpp2
-rw-r--r--intern/cycles/kernel/osl/osl_shader.h2
-rw-r--r--intern/cycles/kernel/shaders/oslutil.h2
-rw-r--r--intern/cycles/kernel/shaders/stdosl.h68
-rw-r--r--intern/cycles/kernel/split/kernel_buffer_update.h13
-rw-r--r--intern/cycles/kernel/split/kernel_shader_sort.h4
-rw-r--r--intern/cycles/kernel/split/kernel_split_data.h4
-rw-r--r--intern/cycles/kernel/split/kernel_split_data_types.h4
-rw-r--r--intern/cycles/kernel/svm/svm.h4
-rw-r--r--intern/cycles/kernel/svm/svm_closure.h190
-rw-r--r--intern/cycles/kernel/svm/svm_hsv.h2
-rw-r--r--intern/cycles/kernel/svm/svm_ramp.h2
-rw-r--r--intern/cycles/kernel/svm/svm_ramp_util.h2
-rw-r--r--intern/cycles/kernel/svm/svm_types.h2
-rw-r--r--intern/cycles/kernel/svm/svm_wave.h2
-rw-r--r--intern/cycles/render/CMakeLists.txt2
-rw-r--r--intern/cycles/render/attribute.h2
-rw-r--r--intern/cycles/render/background.h2
-rw-r--r--intern/cycles/render/bake.h2
-rw-r--r--intern/cycles/render/buffers.cpp74
-rw-r--r--intern/cycles/render/buffers.h6
-rw-r--r--intern/cycles/render/camera.cpp2
-rw-r--r--intern/cycles/render/camera.h3
-rw-r--r--intern/cycles/render/constant_fold.h2
-rw-r--r--intern/cycles/render/coverage.cpp143
-rw-r--r--intern/cycles/render/coverage.h49
-rw-r--r--intern/cycles/render/curves.h4
-rw-r--r--intern/cycles/render/film.cpp37
-rw-r--r--intern/cycles/render/film.h15
-rw-r--r--intern/cycles/render/graph.h2
-rw-r--r--intern/cycles/render/image.h2
-rw-r--r--intern/cycles/render/integrator.h2
-rw-r--r--intern/cycles/render/light.h2
-rw-r--r--intern/cycles/render/mesh.cpp54
-rw-r--r--intern/cycles/render/mesh.h3
-rw-r--r--intern/cycles/render/nodes.h3
-rw-r--r--intern/cycles/render/object.cpp39
-rw-r--r--intern/cycles/render/object.h8
-rw-r--r--intern/cycles/render/osl.cpp2
-rw-r--r--intern/cycles/render/osl.h3
-rw-r--r--intern/cycles/render/particles.h4
-rw-r--r--intern/cycles/render/scene.cpp17
-rw-r--r--intern/cycles/render/scene.h6
-rw-r--r--intern/cycles/render/session.cpp9
-rw-r--r--intern/cycles/render/session.h4
-rw-r--r--intern/cycles/render/shader.cpp22
-rw-r--r--intern/cycles/render/shader.h4
-rw-r--r--intern/cycles/render/sobol.h2
-rw-r--r--intern/cycles/render/stats.h2
-rw-r--r--intern/cycles/render/svm.cpp2
-rw-r--r--intern/cycles/render/svm.h3
-rw-r--r--intern/cycles/render/tables.h2
-rw-r--r--intern/cycles/render/tile.h2
-rw-r--r--intern/cycles/subd/subd_dice.h2
-rw-r--r--intern/cycles/subd/subd_patch.h2
-rw-r--r--intern/cycles/subd/subd_patch_table.cpp4
-rw-r--r--intern/cycles/subd/subd_patch_table.h4
-rw-r--r--intern/cycles/subd/subd_split.h2
-rw-r--r--intern/cycles/test/CMakeLists.txt6
-rw-r--r--intern/cycles/test/render_graph_finalize_test.cpp1
-rw-r--r--intern/cycles/test/util_path_test.cpp4
-rw-r--r--intern/cycles/util/CMakeLists.txt3
-rw-r--r--intern/cycles/util/util_algorithm.h2
-rw-r--r--intern/cycles/util/util_args.h2
-rw-r--r--intern/cycles/util/util_array.h289
-rw-r--r--intern/cycles/util/util_atomic.h32
-rw-r--r--intern/cycles/util/util_avxb.h72
-rw-r--r--intern/cycles/util/util_avxf.h10
-rw-r--r--intern/cycles/util/util_boundbox.h2
-rw-r--r--intern/cycles/util/util_color.h2
-rw-r--r--intern/cycles/util/util_debug.h2
-rw-r--r--intern/cycles/util/util_defines.h12
-rw-r--r--intern/cycles/util/util_foreach.h2
-rw-r--r--intern/cycles/util/util_function.h2
-rw-r--r--intern/cycles/util/util_guarded_allocator.cpp4
-rw-r--r--intern/cycles/util/util_guarded_allocator.h6
-rw-r--r--intern/cycles/util/util_half.h2
-rw-r--r--intern/cycles/util/util_hash.h2
-rw-r--r--intern/cycles/util/util_ies.cpp7
-rw-r--r--intern/cycles/util/util_ies.h2
-rw-r--r--intern/cycles/util/util_image.h2
-rw-r--r--intern/cycles/util/util_list.h2
-rw-r--r--intern/cycles/util/util_logging.cpp2
-rw-r--r--intern/cycles/util/util_logging.h6
-rw-r--r--intern/cycles/util/util_map.h2
-rw-r--r--intern/cycles/util/util_math.h30
-rw-r--r--intern/cycles/util/util_math_cdf.h2
-rw-r--r--intern/cycles/util/util_math_fast.h28
-rw-r--r--intern/cycles/util/util_math_float2.h2
-rw-r--r--intern/cycles/util/util_math_float3.h2
-rw-r--r--intern/cycles/util/util_math_float4.h14
-rw-r--r--intern/cycles/util/util_math_int2.h2
-rw-r--r--intern/cycles/util/util_math_int3.h2
-rw-r--r--intern/cycles/util/util_math_int4.h42
-rw-r--r--intern/cycles/util/util_math_intersect.h2
-rw-r--r--intern/cycles/util/util_md5.h2
-rw-r--r--intern/cycles/util/util_murmurhash.cpp127
-rw-r--r--intern/cycles/util/util_murmurhash.h30
-rw-r--r--intern/cycles/util/util_opengl.h2
-rw-r--r--intern/cycles/util/util_optimization.h2
-rw-r--r--intern/cycles/util/util_param.h2
-rw-r--r--intern/cycles/util/util_path.cpp2
-rw-r--r--intern/cycles/util/util_progress.h10
-rw-r--r--intern/cycles/util/util_projection.h4
-rw-r--r--intern/cycles/util/util_queue.h2
-rw-r--r--intern/cycles/util/util_rect.h2
-rw-r--r--intern/cycles/util/util_set.h2
-rw-r--r--intern/cycles/util/util_simd.h14
-rw-r--r--intern/cycles/util/util_sky_model.h2
-rw-r--r--intern/cycles/util/util_sseb.h2
-rw-r--r--intern/cycles/util/util_ssef.h12
-rw-r--r--intern/cycles/util/util_stack_allocator.h4
-rw-r--r--intern/cycles/util/util_static_assert.h2
-rw-r--r--intern/cycles/util/util_stats.h2
-rw-r--r--intern/cycles/util/util_string.h2
-rw-r--r--intern/cycles/util/util_system.cpp4
-rw-r--r--intern/cycles/util/util_system.h2
-rw-r--r--intern/cycles/util/util_texture.h2
-rw-r--r--intern/cycles/util/util_thread.cpp2
-rw-r--r--intern/cycles/util/util_thread.h6
-rw-r--r--intern/cycles/util/util_transform.h27
-rw-r--r--intern/cycles/util/util_types.h2
-rw-r--r--intern/cycles/util/util_types_float3.h4
-rw-r--r--intern/cycles/util/util_types_float3_impl.h4
-rw-r--r--intern/cycles/util/util_types_float4.h4
-rw-r--r--intern/cycles/util/util_types_float4_impl.h4
-rw-r--r--intern/cycles/util/util_types_float8.h6
-rw-r--r--intern/cycles/util/util_types_float8_impl.h4
-rw-r--r--intern/cycles/util/util_types_int3.h4
-rw-r--r--intern/cycles/util/util_types_int3_impl.h4
-rw-r--r--intern/cycles/util/util_types_int4.h6
-rw-r--r--intern/cycles/util/util_types_int4_impl.h14
-rw-r--r--intern/cycles/util/util_vector.h296
-rw-r--r--intern/cycles/util/util_version.h2
-rw-r--r--intern/cycles/util/util_view.cpp2
-rw-r--r--intern/cycles/util/util_view.h8
-rw-r--r--intern/cycles/util/util_windows.h2
-rw-r--r--intern/cycles/util/util_xml.h2
-rw-r--r--intern/dualcon/dualcon.h2
-rw-r--r--intern/ghost/GHOST_C-api.h5
-rw-r--r--intern/ghost/GHOST_ISystem.h5
-rw-r--r--intern/ghost/intern/GHOST_C-api.cpp6
-rw-r--r--intern/ghost/intern/GHOST_Context.h7
-rw-r--r--intern/ghost/intern/GHOST_DropTargetWin32.cpp4
-rw-r--r--intern/ghost/intern/GHOST_System.cpp6
-rw-r--r--intern/ghost/intern/GHOST_System.h17
-rw-r--r--intern/ghost/intern/GHOST_SystemCocoa.mm12
-rw-r--r--intern/ghost/intern/GHOST_SystemWin32.cpp6
-rw-r--r--intern/ghost/intern/GHOST_SystemX11.cpp2
-rw-r--r--intern/ghost/intern/GHOST_SystemX11.h2
-rw-r--r--intern/ghost/intern/GHOST_Window.h6
-rw-r--r--intern/ghost/intern/GHOST_WindowCocoa.mm19
-rw-r--r--intern/ghost/intern/GHOST_WindowWin32.cpp13
-rw-r--r--intern/ghost/intern/GHOST_WindowWin32.h4
-rw-r--r--intern/ghost/intern/GHOST_WindowX11.cpp10
-rw-r--r--intern/guardedalloc/CMakeLists.txt5
-rw-r--r--intern/guardedalloc/intern/mallocn.c7
-rw-r--r--intern/locale/boost_locale_wrapper.cpp12
-rw-r--r--intern/opensubdiv/CMakeLists.txt2
-rw-r--r--intern/opensubdiv/internal/opensubdiv_converter_factory.cc24
-rw-r--r--intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc39
-rw-r--r--intern/opensubdiv/internal/opensubdiv_topology_refiner.cc50
-rw-r--r--intern/opensubdiv/internal/opensubdiv_util.h2
-rw-r--r--intern/opensubdiv/opensubdiv_capi_type.h9
-rw-r--r--intern/opensubdiv/opensubdiv_converter_capi.h2
-rw-r--r--intern/opensubdiv/opensubdiv_topology_refiner_capi.h15
-rw-r--r--intern/opensubdiv/stub/opensubdiv_topology_refiner_stub.cc2
-rw-r--r--release/datafiles/blender_icons.svg99955
-rw-r--r--release/datafiles/blender_icons16/icon16_30.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_action.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_action_tweak.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_add.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_alembic.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_aliased.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_align.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_align_bottom.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_align_center.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_align_flush.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_align_justify.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_align_left.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_align_middle.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_align_right.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_align_top.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_anim.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_anim_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_antialiased.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_append_blend.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_armature_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_arrow_leftright.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_asset_manager.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_auto.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_automerge_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_automerge_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_axis_front.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_axis_side.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_axis_top.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_back.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_bbox.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_blender.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_boids.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_bold.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_bone_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_bookmarks.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_border_lasso.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_border_rect.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_bordermove.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_brush_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_buts.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_camera_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_camera_stereo.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_cancel.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_center_only.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_checkbox_dehlt.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_checkbox_hlt.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_clip.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_clipuv_dehlt.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_clipuv_hlt.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_collapsemenu.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_color.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_color_blue.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_color_green.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_color_red.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_console.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_constraint.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_constraint_bone.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_constraint_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_copy_id.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_copydown.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_cursor.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_curve_bezcircle.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_curve_bezcurve.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_curve_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_curve_ncircle.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_curve_ncurve.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_curve_path.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_decorate.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_decorate_animate.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_decorate_driver.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_decorate_keyframe.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_decorate_library_override.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_decorate_linked.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_decorate_locked.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_decorate_override.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_decorate_unlocked.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_disclosure_tri_down.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_disclosure_tri_right.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_disk_drive.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_dot.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_dotsdown.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_dotsup.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_downarrow_hlt.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_driver.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_driver_distance.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_driver_rotational_difference.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_driver_transform.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_duplicate.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_edgesel.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_edit.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_editmode_hlt.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_empty_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_error.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_export.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_external_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_eyedropper.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_face_maps.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_facesel.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_facesel_hlt.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_fake_user.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_fake_user_off.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_fake_user_on.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_fcurve.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ff.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file_backup.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file_blank.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file_blend.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file_folder.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file_font.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file_hidden.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file_image.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file_movie.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file_new.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file_parent.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file_refresh.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file_script.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file_sound.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file_text.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_file_tick.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_filebrowser.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_filesel.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_filter.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_font_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_fontpreview.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_force_boid.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_force_charge.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_force_curve.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_force_drag.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_force_force.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_force_harmonic.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_force_lennardjones.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_force_magnetic.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_force_smokeflow.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_force_texture.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_force_turbulence.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_force_vortex.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_force_wind.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_forward.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_frame_next.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_frame_prev.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_freeze.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_fullscreen.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_fullscreen_enter.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_fullscreen_exit.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_game.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_gear.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ghost.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ghost_disabled.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ghost_enabled.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_go_left.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_gp_empty.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_gp_multiframe_editing.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_gp_only_selected.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_gp_select_points.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_gp_select_strokes.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_gp_stroke.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_graph.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_greasepencil.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_greasepencil_stroke_paint.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_grid.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_grip.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_group.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_group_bone.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_group_uvs.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_group_vcol.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_group_vertex.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_hair.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_hand.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_heart.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_help.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_hide_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_hide_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_hook.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_image.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_image_alpha.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_image_col.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_image_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_image_rgb.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_image_rgb_alpha.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_image_zdepth.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_imagefile.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_imasel.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_imgdisplay.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_import.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_info.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_inlink.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_back.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_bezier.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_bounce.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_circ.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_constant.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_cubic.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_ease_in.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_ease_in_out.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_ease_out.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_elastic.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_expo.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_linear.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_quad.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_quart.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_quint.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ipo_sine.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_italic.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_key_dehlt.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_key_hlt.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_keyframe.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_keyframe_hlt.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_keyingset.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_lamp.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_lamp_area.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_lamp_data.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_lamp_hemi.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_lamp_point.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_lamp_spot.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_lamp_sun.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_lattice_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_layer_active.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_layer_used.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_library_data_broken.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_library_data_direct.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_library_data_indirect.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_library_data_override.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_light.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_light_area.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_light_data.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_light_hemi.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_light_point.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_light_spot.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_light_sun.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_lightpaint.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_lightprobe_cubemap.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_lightprobe_grid.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_lightprobe_planar.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_lincurve.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_line_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_linenumbers_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_linenumbers_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_link.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_link_area.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_link_blend.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_linked.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_load_factory.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_locked.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_lockview_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_lockview_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_logic.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_longdisplay.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_loop_back.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_loop_forwards.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_loopsel.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_man_rot.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_man_scale.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_man_trans.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_manipul.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_marker.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_marker_hlt.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mat_sphere_sky.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_matcloth.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_matcube.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_material.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_material_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_matfluid.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_matplane.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_matshaderball.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_matsphere.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_menu_panel.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mesh_capsule.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mesh_circle.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mesh_cone.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mesh_cube.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mesh_cylinder.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mesh_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mesh_grid.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mesh_icosphere.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mesh_monkey.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mesh_plane.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mesh_torus.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mesh_uvsphere.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_meta_ball.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_meta_capsule.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_meta_cube.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_meta_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_meta_ellipsoid.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_meta_empty.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_meta_plane.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_armature.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_array.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_bevel.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_boolean.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_build.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_cast.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_cloth.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_curve.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_data_transfer.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_decim.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_displace.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_dynamicpaint.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_edgesplit.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_explode.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_fluidsim.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_hue_saturation.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_instance.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_lattice.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_mask.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_meshdeform.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_mirror.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_multires.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_noise.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_normaledit.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_ocean.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_offset.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_opacity.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_particle_instance.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_particles.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_physics.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_remesh.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_screw.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_shrinkwrap.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_simpledeform.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_simplify.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_skin.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_smoke.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_smooth.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_soft.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_solidify.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_subsurf.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_thickness.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_time.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_tint.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_triangulate.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_uvproject.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_vertex_weight.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_warp.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_wave.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mod_wireframe.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_modifier.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_modifier_off.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_modifier_on.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_monkey.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mouse_drag.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mouse_lmb.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mouse_lmb_drag.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mouse_mmb.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mouse_mmb_drag.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mouse_move.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mouse_rmb.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mouse_rmb_drag.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mute_ipo_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_mute_ipo_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ndof_dom.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ndof_fly.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ndof_trans.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ndof_turn.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_new.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_newfolder.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_next_keyframe.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_nla.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_nla_pushdown.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_nocurve.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_node.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_node_compositing.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_node_corner.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_node_insert_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_node_insert_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_node_insert_top.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_node_material.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_node_sel.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_node_side.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_node_texture.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_node_top.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_nodetree.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_normalize_fcurves.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_normals_face.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_normals_vertex.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_normals_vertex_face.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_object_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_object_datamode.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_object_origin.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_onionskin_off.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_onionskin_on.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_oops.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_open_recent.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_orientation_gimbal.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_orientation_global.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_orientation_local.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_orientation_normal.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_orientation_view.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_orphan_data.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ortho.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_data_armature.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_data_camera.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_data_curve.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_data_empty.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_data_font.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_data_greasepencil.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_data_lamp.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_data_lattice.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_data_light.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_data_mesh.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_data_meta.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_data_pose.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_data_speaker.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_data_surface.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_armature.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_camera.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_curve.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_empty.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_font.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_force_field.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_greasepencil.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_group_instance.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_image.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_lamp.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_lattice.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_light.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_lightprobe.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_mesh.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_meta.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_speaker.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_outliner_ob_surface.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_overlay.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_package.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_panel_close.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_particle_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_particle_path.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_particle_point.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_particle_tip.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_particlemode.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_particles.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_pastedown.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_pasteflipdown.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_pasteflipup.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_pause.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_physics.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_pinned.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_pivot_active.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_pivot_boundbox.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_pivot_cursor.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_pivot_individual.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_pivot_median.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_play.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_play_audio.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_play_reverse.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_plug.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_plugin.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_plus.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_pmarker.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_pmarker_act.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_pmarker_sel.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_pose_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_pose_hlt.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_potato.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_preferences.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_preset.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_preset_new.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_prev_keyframe.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_preview_range.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_prop_con.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_prop_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_prop_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_properties.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_question.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_quit.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_radio.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_radiobut_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_radiobut_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_rec.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_recover_auto.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_recover_last.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_remove.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_render_animation.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_render_region.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_render_result.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_render_still.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_renderlayers.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_restrict_color_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_restrict_color_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_restrict_render_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_restrict_render_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_restrict_select_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_restrict_select_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_restrict_view_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_restrict_view_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_retopo.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_rew.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_rightarrow.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_rightarrow_thin.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_rna.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_rna_add.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_rndcurve.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_rootcurve.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_rotactive.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_rotate.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_rotatecenter.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_rotatecollection.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_save_as.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_save_copy.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_save_prefs.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_scene.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_scene_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_screen_back.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_script.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_scriptplugins.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_scriptwin.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_sculpt_dyntopo.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_sculptmode_hlt.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_sealed.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_seq_chroma_scope.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_seq_histogram.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_seq_luma_waveform.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_seq_preview.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_seq_sequencer.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_seq_splitview.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_sequence.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_settings.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_shaderfx.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_shading_bbox.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_shading_rendered.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_shading_solid.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_shading_texture.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_shading_wire.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_shapekey_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_sharpcurve.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_shortdisplay.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_small_caps.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_smooth.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_smoothcurve.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_snap_edge.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_snap_face.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_snap_grid.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_snap_increment.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_snap_normal.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_snap_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_snap_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_snap_peel_object.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_snap_surface.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_snap_vertex.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_snap_volume.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_solid.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_solo_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_solo_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_sort_asc.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_sort_desc.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_sortalpha.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_sortbyext.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_sortsize.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_sorttime.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_sound.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_space2.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_space3.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_speaker.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_spherecurve.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_splitscreen.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_sticky_uvs_disable.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_sticky_uvs_loc.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_sticky_uvs_vert.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_strands.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_stylus_pressure.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_surface_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_surface_ncircle.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_surface_ncurve.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_surface_ncylinder.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_surface_nsphere.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_surface_nsurface.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_surface_ntorus.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_syntax_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_syntax_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_system.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_temperature.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_text.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_texture.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_texture_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_texture_shaded.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_three_dots.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_time.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tool_settings.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tpaint_hlt.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tracking.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tracking_backwards.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tracking_backwards_single.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tracking_clear_backwards.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tracking_clear_forwards.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tracking_forwards.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tracking_forwards_single.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tracking_refine_backwards.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tracking_refine_forwards.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tria_down.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tria_down_bar.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tria_left.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tria_left_bar.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tria_right.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tria_right_bar.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tria_up.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_tria_up_bar.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_uglypackage.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_ui.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_underline.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_unlinked.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_unlocked.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_unpinned.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_url.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_user.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_uv.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_uv_edgesel.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_uv_facesel.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_uv_islandsel.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_uv_sync_select.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_uv_vertexsel.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_vertexsel.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_view3d.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_view_camera.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_view_ortho.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_view_pan.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_view_perspective.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_view_zoom.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_viewzoom.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_vis_sel_00.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_vis_sel_01.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_vis_sel_10.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_vis_sel_11.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_visible_ipo_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_visible_ipo_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_volume.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_vpaint_hlt.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_window.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_wire.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_wordwrap_off.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_wordwrap_on.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_workspace.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_world.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_world_data.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_wpaint_hlt.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_x.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_xray.datbin0 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_zoom_all.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_zoom_in.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_zoom_out.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_zoom_previous.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_zoom_selected.datbin1048 -> 1048 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_zoomin.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons16/icon16_zoomout.datbin1048 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_30.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_action.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_action_tweak.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_add.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_alembic.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_aliased.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_align.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_align_bottom.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_align_center.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_align_flush.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_align_justify.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_align_left.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_align_middle.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_align_right.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_align_top.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_anim.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_anim_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_antialiased.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_append_blend.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_armature_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_arrow_leftright.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_asset_manager.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_auto.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_automerge_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_automerge_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_axis_front.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_axis_side.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_axis_top.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_back.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_bbox.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_blender.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_boids.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_bold.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_bone_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_bookmarks.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_border_lasso.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_border_rect.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_bordermove.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_brush_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_buts.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_camera_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_camera_stereo.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_cancel.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_center_only.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_checkbox_dehlt.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_checkbox_hlt.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_clip.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_clipuv_dehlt.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_clipuv_hlt.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_collapsemenu.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_color.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_color_blue.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_color_green.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_color_red.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_console.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_constraint.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_constraint_bone.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_constraint_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_copy_id.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_copydown.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_cursor.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_curve_bezcircle.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_curve_bezcurve.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_curve_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_curve_ncircle.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_curve_ncurve.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_curve_path.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_decorate.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_decorate_animate.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_decorate_driver.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_decorate_keyframe.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_decorate_library_override.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_decorate_linked.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_decorate_locked.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_decorate_override.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_decorate_unlocked.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_disclosure_tri_down.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_disclosure_tri_right.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_disk_drive.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_dot.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_dotsdown.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_dotsup.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_downarrow_hlt.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_driver.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_driver_distance.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_driver_rotational_difference.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_driver_transform.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_duplicate.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_edgesel.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_edit.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_editmode_hlt.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_empty_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_error.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_export.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_external_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_eyedropper.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_face_maps.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_facesel.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_facesel_hlt.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_fake_user.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_fake_user_off.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_fake_user_on.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_fcurve.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ff.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file_backup.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file_blank.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file_blend.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file_folder.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file_font.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file_hidden.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file_image.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file_movie.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file_new.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file_parent.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file_refresh.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file_script.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file_sound.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file_text.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_file_tick.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_filebrowser.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_filesel.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_filter.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_font_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_fontpreview.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_force_boid.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_force_charge.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_force_curve.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_force_drag.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_force_force.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_force_harmonic.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_force_lennardjones.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_force_magnetic.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_force_smokeflow.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_force_texture.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_force_turbulence.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_force_vortex.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_force_wind.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_forward.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_frame_next.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_frame_prev.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_freeze.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_fullscreen.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_fullscreen_enter.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_fullscreen_exit.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_game.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_gear.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ghost.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ghost_disabled.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ghost_enabled.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_go_left.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_gp_empty.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_gp_multiframe_editing.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_gp_only_selected.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_gp_select_points.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_gp_select_strokes.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_gp_stroke.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_graph.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_greasepencil.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_greasepencil_stroke_paint.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_grid.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_grip.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_group.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_group_bone.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_group_uvs.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_group_vcol.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_group_vertex.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_hair.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_hand.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_heart.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_help.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_hide_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_hide_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_hook.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_image.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_image_alpha.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_image_col.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_image_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_image_rgb.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_image_rgb_alpha.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_image_zdepth.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_imagefile.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_imasel.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_imgdisplay.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_import.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_info.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_inlink.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_back.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_bezier.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_bounce.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_circ.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_constant.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_cubic.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_ease_in.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_ease_in_out.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_ease_out.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_elastic.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_expo.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_linear.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_quad.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_quart.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_quint.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ipo_sine.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_italic.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_key_dehlt.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_key_hlt.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_keyframe.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_keyframe_hlt.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_keyingset.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_lamp.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_lamp_area.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_lamp_data.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_lamp_hemi.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_lamp_point.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_lamp_spot.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_lamp_sun.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_lattice_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_layer_active.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_layer_used.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_library_data_broken.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_library_data_direct.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_library_data_indirect.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_library_data_override.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_light.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_light_area.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_light_data.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_light_hemi.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_light_point.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_light_spot.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_light_sun.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_lightpaint.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_lightprobe_cubemap.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_lightprobe_grid.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_lightprobe_planar.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_lincurve.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_line_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_linenumbers_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_linenumbers_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_link.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_link_area.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_link_blend.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_linked.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_load_factory.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_locked.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_lockview_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_lockview_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_logic.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_longdisplay.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_loop_back.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_loop_forwards.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_loopsel.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_man_rot.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_man_scale.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_man_trans.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_manipul.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_marker.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_marker_hlt.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mat_sphere_sky.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_matcloth.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_matcube.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_material.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_material_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_matfluid.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_matplane.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_matshaderball.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_matsphere.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_menu_panel.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mesh_capsule.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mesh_circle.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mesh_cone.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mesh_cube.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mesh_cylinder.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mesh_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mesh_grid.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mesh_icosphere.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mesh_monkey.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mesh_plane.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mesh_torus.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mesh_uvsphere.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_meta_ball.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_meta_capsule.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_meta_cube.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_meta_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_meta_ellipsoid.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_meta_empty.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_meta_plane.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_armature.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_array.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_bevel.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_boolean.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_build.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_cast.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_cloth.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_curve.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_data_transfer.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_decim.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_displace.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_dynamicpaint.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_edgesplit.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_explode.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_fluidsim.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_hue_saturation.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_instance.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_lattice.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_mask.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_meshdeform.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_mirror.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_multires.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_noise.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_normaledit.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_ocean.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_offset.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_opacity.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_particle_instance.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_particles.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_physics.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_remesh.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_screw.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_shrinkwrap.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_simpledeform.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_simplify.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_skin.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_smoke.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_smooth.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_soft.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_solidify.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_subsurf.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_thickness.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_time.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_tint.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_triangulate.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_uvproject.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_vertex_weight.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_warp.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_wave.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mod_wireframe.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_modifier.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_modifier_off.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_modifier_on.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_monkey.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mouse_drag.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mouse_lmb.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mouse_lmb_drag.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mouse_mmb.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mouse_mmb_drag.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mouse_move.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mouse_rmb.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mouse_rmb_drag.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mute_ipo_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_mute_ipo_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ndof_dom.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ndof_fly.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ndof_trans.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ndof_turn.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_new.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_newfolder.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_next_keyframe.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_nla.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_nla_pushdown.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_nocurve.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_node.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_node_compositing.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_node_corner.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_node_insert_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_node_insert_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_node_insert_top.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_node_material.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_node_sel.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_node_side.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_node_texture.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_node_top.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_nodetree.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_normalize_fcurves.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_normals_face.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_normals_vertex.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_normals_vertex_face.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_object_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_object_datamode.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_object_origin.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_onionskin_off.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_onionskin_on.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_oops.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_open_recent.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_orientation_gimbal.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_orientation_global.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_orientation_local.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_orientation_normal.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_orientation_view.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_orphan_data.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ortho.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_data_armature.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_data_camera.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_data_curve.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_data_empty.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_data_font.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_data_greasepencil.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_data_lamp.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_data_lattice.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_data_light.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_data_mesh.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_data_meta.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_data_pose.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_data_speaker.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_data_surface.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_armature.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_camera.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_curve.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_empty.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_font.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_force_field.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_greasepencil.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_group_instance.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_image.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_lamp.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_lattice.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_light.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_lightprobe.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_mesh.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_meta.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_speaker.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_outliner_ob_surface.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_overlay.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_package.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_panel_close.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_particle_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_particle_path.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_particle_point.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_particle_tip.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_particlemode.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_particles.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_pastedown.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_pasteflipdown.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_pasteflipup.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_pause.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_physics.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_pinned.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_pivot_active.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_pivot_boundbox.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_pivot_cursor.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_pivot_individual.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_pivot_median.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_play.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_play_audio.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_play_reverse.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_plug.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_plugin.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_plus.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_pmarker.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_pmarker_act.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_pmarker_sel.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_pose_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_pose_hlt.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_potato.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_preferences.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_preset.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_preset_new.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_prev_keyframe.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_preview_range.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_prop_con.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_prop_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_prop_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_properties.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_question.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_quit.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_radio.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_radiobut_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_radiobut_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_rec.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_recover_auto.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_recover_last.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_remove.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_render_animation.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_render_region.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_render_result.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_render_still.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_renderlayers.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_restrict_color_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_restrict_color_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_restrict_render_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_restrict_render_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_restrict_select_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_restrict_select_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_restrict_view_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_restrict_view_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_retopo.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_rew.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_rightarrow.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_rightarrow_thin.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_rna.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_rna_add.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_rndcurve.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_rootcurve.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_rotactive.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_rotate.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_rotatecenter.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_rotatecollection.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_save_as.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_save_copy.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_save_prefs.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_scene.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_scene_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_screen_back.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_script.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_scriptplugins.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_scriptwin.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_sculpt_dyntopo.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_sculptmode_hlt.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_sealed.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_seq_chroma_scope.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_seq_histogram.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_seq_luma_waveform.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_seq_preview.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_seq_sequencer.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_seq_splitview.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_sequence.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_settings.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_shaderfx.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_shading_bbox.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_shading_rendered.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_shading_solid.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_shading_texture.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_shading_wire.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_shapekey_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_sharpcurve.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_shortdisplay.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_small_caps.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_smooth.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_smoothcurve.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_snap_edge.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_snap_face.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_snap_grid.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_snap_increment.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_snap_normal.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_snap_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_snap_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_snap_peel_object.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_snap_surface.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_snap_vertex.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_snap_volume.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_solid.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_solo_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_solo_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_sort_asc.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_sort_desc.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_sortalpha.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_sortbyext.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_sortsize.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_sorttime.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_sound.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_space2.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_space3.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_speaker.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_spherecurve.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_splitscreen.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_sticky_uvs_disable.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_sticky_uvs_loc.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_sticky_uvs_vert.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_strands.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_stylus_pressure.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_surface_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_surface_ncircle.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_surface_ncurve.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_surface_ncylinder.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_surface_nsphere.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_surface_nsurface.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_surface_ntorus.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_syntax_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_syntax_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_system.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_temperature.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_text.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_texture.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_texture_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_texture_shaded.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_three_dots.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_time.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tool_settings.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tpaint_hlt.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tracking.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tracking_backwards.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tracking_backwards_single.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tracking_clear_backwards.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tracking_clear_forwards.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tracking_forwards.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tracking_forwards_single.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tracking_refine_backwards.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tracking_refine_forwards.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tria_down.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tria_down_bar.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tria_left.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tria_left_bar.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tria_right.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tria_right_bar.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tria_up.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_tria_up_bar.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_uglypackage.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_ui.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_underline.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_unlinked.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_unlocked.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_unpinned.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_url.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_user.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_uv.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_uv_edgesel.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_uv_facesel.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_uv_islandsel.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_uv_sync_select.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_uv_vertexsel.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_vertexsel.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_view3d.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_view_camera.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_view_ortho.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_view_pan.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_view_perspective.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_view_zoom.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_viewzoom.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_vis_sel_00.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_vis_sel_01.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_vis_sel_10.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_vis_sel_11.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_visible_ipo_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_visible_ipo_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_volume.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_vpaint_hlt.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_window.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_wire.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_wordwrap_off.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_wordwrap_on.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_workspace.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_world.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_world_data.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_wpaint_hlt.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_x.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_xray.datbin0 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_zoom_all.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_zoom_in.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_zoom_out.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_zoom_previous.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_zoom_selected.datbin4120 -> 4120 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_zoomin.datbin4120 -> 0 bytes
-rw-r--r--release/datafiles/blender_icons32/icon32_zoomout.datbin4120 -> 0 bytes
-rwxr-xr-xrelease/datafiles/blender_icons_update.py3
-rw-r--r--release/datafiles/brushicons/add.pngbin8154 -> 0 bytes
-rw-r--r--release/datafiles/brushicons/darken.pngbin7280 -> 0 bytes
-rw-r--r--release/datafiles/brushicons/lighten.pngbin7025 -> 0 bytes
-rw-r--r--release/datafiles/brushicons/subtract.pngbin7510 -> 0 bytes
-rw-r--r--release/datafiles/brushicons/vertexdraw.pngbin7697 -> 0 bytes
-rw-r--r--release/datafiles/colormanagement/config.ocio2
-rw-r--r--release/datafiles/icons/brush.gpencil.draw.eraser_hard.datbin1250 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.gpencil.draw.eraser_soft.datbin1484 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.gpencil.draw.eraser_stroke.datbin1970 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.gpencil.draw_block.datbin710 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.gpencil.draw_fill.datbin4076 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.gpencil.draw_ink.datbin1610 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.gpencil.draw_marker.datbin1502 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.gpencil.draw_noise.datbin2312 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.gpencil.draw_pen.datbin1970 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.gpencil.draw_pencil.datbin1412 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.gpencil_draw.draw.datbin0 -> 404 bytes
-rw-r--r--release/datafiles/icons/brush.gpencil_draw.erase.datbin0 -> 332 bytes
-rw-r--r--release/datafiles/icons/brush.gpencil_draw.fill.datbin0 -> 3662 bytes
-rw-r--r--release/datafiles/icons/brush.paint_texture.clone.datbin24380 -> 440 bytes
-rw-r--r--release/datafiles/icons/brush.paint_texture.draw.datbin25388 -> 3518 bytes
-rw-r--r--release/datafiles/icons/brush.paint_texture.fill.datbin31202 -> 3644 bytes
-rw-r--r--release/datafiles/icons/brush.paint_texture.mask.datbin24254 -> 944 bytes
-rw-r--r--release/datafiles/icons/brush.paint_texture.masklort.datbin0 -> 1952 bytes
-rw-r--r--release/datafiles/icons/brush.paint_texture.smear.datbin25028 -> 1196 bytes
-rw-r--r--release/datafiles/icons/brush.paint_texture.soften.datbin22850 -> 1988 bytes
-rw-r--r--release/datafiles/icons/brush.paint_vertex.alpha.datbin6452 -> 8 bytes
-rw-r--r--release/datafiles/icons/brush.paint_vertex.average.datbin0 -> 62 bytes
-rw-r--r--release/datafiles/icons/brush.paint_vertex.blur.datbin5300 -> 1988 bytes
-rw-r--r--release/datafiles/icons/brush.paint_vertex.draw.datbin0 -> 3518 bytes
-rw-r--r--release/datafiles/icons/brush.paint_vertex.mix.datbin6956 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.paint_vertex.smear.datbin7334 -> 1196 bytes
-rw-r--r--release/datafiles/icons/brush.paint_weight.average.datbin0 -> 62 bytes
-rw-r--r--release/datafiles/icons/brush.paint_weight.blur.datbin17864 -> 1988 bytes
-rw-r--r--release/datafiles/icons/brush.paint_weight.darken.datbin23174 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.paint_weight.draw.datbin24830 -> 3518 bytes
-rw-r--r--release/datafiles/icons/brush.paint_weight.lighten.datbin22904 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.paint_weight.mix.datbin26432 -> 21680 bytes
-rw-r--r--release/datafiles/icons/brush.paint_weight.multiply.datbin24110 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.paint_weight.smear.datbin0 -> 1196 bytes
-rw-r--r--release/datafiles/icons/brush.particle.weight.datbin3356 -> 2924 bytes
-rw-r--r--release/datafiles/icons/brush.sculpt.simplify.datbin0 -> 3032 bytes
-rw-r--r--release/datafiles/icons/brush.vertex.average.datbin5210 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.weight.add.datbin28664 -> 0 bytes
-rw-r--r--release/datafiles/icons/brush.weight.subtract.datbin23174 -> 0 bytes
-rw-r--r--release/datafiles/icons/ops.armature.bone.roll.datbin1646 -> 1628 bytes
-rw-r--r--release/datafiles/icons/ops.armature.extrude_cursor.datbin0 -> 1502 bytes
-rw-r--r--release/datafiles/icons/ops.armature.extrude_move.datbin0 -> 1250 bytes
-rw-r--r--release/datafiles/icons/ops.curve.draw.datbin6416 -> 2546 bytes
-rw-r--r--release/datafiles/icons/ops.curve.extrude_cursor.datbin0 -> 1844 bytes
-rw-r--r--release/datafiles/icons/ops.curve.extrude_move.datbin0 -> 1754 bytes
-rw-r--r--release/datafiles/icons/ops.generic.select_border.datbin2240 -> 0 bytes
-rw-r--r--release/datafiles/icons/ops.generic.select_box.datbin0 -> 2276 bytes
-rw-r--r--release/datafiles/icons/ops.generic.select_circle.datbin2528 -> 2564 bytes
-rw-r--r--release/datafiles/icons/ops.generic.select_lasso.datbin3536 -> 5840 bytes
-rw-r--r--release/datafiles/icons/ops.gpencil.primitive_box.datbin0 -> 152 bytes
-rw-r--r--release/datafiles/icons/ops.gpencil.primitive_circle.datbin0 -> 1160 bytes
-rw-r--r--release/datafiles/icons/ops.gpencil.primitive_line.datbin0 -> 44 bytes
-rw-r--r--release/datafiles/icons/ops.mesh.rip.datbin728 -> 944 bytes
-rw-r--r--release/datafiles/icons/ops.mesh.rip_edge.datbin944 -> 890 bytes
-rw-r--r--release/datafiles/icons/ops.paint.weight_fill.datbin30860 -> 3644 bytes
-rw-r--r--release/datafiles/icons/ops.paint.weight_gradient.datbin14642 -> 584 bytes
-rw-r--r--release/datafiles/icons/ops.paint.weight_sample.datbin0 -> 782 bytes
-rw-r--r--release/datafiles/icons/ops.paint.weight_sample_group.datbin0 -> 602 bytes
-rw-r--r--release/datafiles/icons/ops.pose.breakdowner.datbin0 -> 1538 bytes
-rw-r--r--release/datafiles/icons/ops.pose.push.datbin0 -> 2204 bytes
-rw-r--r--release/datafiles/icons/ops.pose.relax.datbin0 -> 1106 bytes
-rw-r--r--release/datafiles/icons/ops.transform.bone_envelope.datbin0 -> 1718 bytes
-rw-r--r--release/datafiles/icons/ops.transform.bone_size.datbin0 -> 1034 bytes
-rw-r--r--release/datafiles/preview.blendbin721736 -> 0 bytes
-rw-r--r--release/datafiles/startup.blendbin1192460 -> 627236 bytes
-rw-r--r--release/datafiles/userdef/userdef_default_theme.c180
m---------release/scripts/addons0
m---------release/scripts/addons_contrib0
-rw-r--r--release/scripts/freestyle/modules/freestyle/shaders.py2
-rw-r--r--release/scripts/freestyle/modules/parameter_editor.py8
-rw-r--r--release/scripts/modules/addon_utils.py15
-rw-r--r--release/scripts/modules/animsys_refactor.py2
-rw-r--r--release/scripts/modules/bl_i18n_utils/bl_extract_messages.py10
-rw-r--r--release/scripts/modules/bl_i18n_utils/settings.py30
-rw-r--r--release/scripts/modules/bl_i18n_utils/utils.py4
-rwxr-xr-xrelease/scripts/modules/bl_i18n_utils/utils_rtl.py4
-rwxr-xr-xrelease/scripts/modules/blend_render_info.py2
-rw-r--r--release/scripts/modules/bpy/ops.py40
-rw-r--r--release/scripts/modules/bpy/path.py2
-rw-r--r--release/scripts/modules/bpy/utils/__init__.py61
-rw-r--r--release/scripts/modules/bpy/utils/toolsystem.py23
-rw-r--r--release/scripts/modules/bpy_extras/anim_utils.py25
-rw-r--r--release/scripts/modules/bpy_extras/image_utils.py2
-rw-r--r--release/scripts/modules/bpy_extras/io_utils.py91
-rw-r--r--release/scripts/modules/bpy_extras/keyconfig_utils.py99
-rw-r--r--release/scripts/modules/bpy_extras/keyconfig_utils_experimental.py20
-rw-r--r--release/scripts/modules/bpy_extras/mesh_utils.py194
-rw-r--r--release/scripts/modules/bpy_extras/node_shader_utils.py774
-rw-r--r--release/scripts/modules/bpy_extras/object_utils.py20
-rw-r--r--release/scripts/modules/bpy_extras/wm_utils/progress_report.py (renamed from release/scripts/modules/progress_report.py)0
-rw-r--r--release/scripts/modules/bpy_types.py71
-rw-r--r--release/scripts/modules/console/complete_import.py2
-rw-r--r--release/scripts/modules/console/complete_namespace.py2
-rw-r--r--release/scripts/modules/console_python.py2
-rw-r--r--release/scripts/modules/gpu_extras/__init__.py (renamed from extern/libopenjpeg/CMakeLists.txt)73
-rw-r--r--release/scripts/modules/gpu_extras/batch.py62
-rw-r--r--release/scripts/modules/gpu_extras/presets.py44
-rw-r--r--release/scripts/modules/rna_info.py6
-rw-r--r--release/scripts/modules/rna_keymap_ui.py10
-rw-r--r--release/scripts/modules/rna_prop_ui.py2
-rw-r--r--release/scripts/modules/rna_xml.py6
-rw-r--r--release/scripts/presets/gpencil_material/fill_only.py2
-rw-r--r--release/scripts/presets/gpencil_material/stroke_and_fill.py2
-rw-r--r--release/scripts/presets/gpencil_material/stroke_only.py2
-rw-r--r--release/scripts/presets/interface_theme/blender_dark.xml6
-rw-r--r--release/scripts/presets/interface_theme/blender_light.xml (renamed from release/scripts/presets/interface_theme/flatty_light.xml)0
-rw-r--r--release/scripts/presets/keyconfig/3dsmax.py56
-rw-r--r--release/scripts/presets/keyconfig/blender.py12
-rw-r--r--release/scripts/presets/keyconfig/blender_27x.py8650
-rw-r--r--release/scripts/presets/keyconfig/keymap_data/blender_default.py4938
-rw-r--r--release/scripts/presets/keyconfig/maya.py54
-rw-r--r--release/scripts/presets/units_length/centimeters.py5
-rw-r--r--release/scripts/presets/units_length/feet.py5
-rw-r--r--release/scripts/presets/units_length/inches.py5
-rw-r--r--release/scripts/presets/units_length/kilometers.py5
-rw-r--r--release/scripts/presets/units_length/meters.py5
-rw-r--r--release/scripts/presets/units_length/miles.py5
-rw-r--r--release/scripts/presets/units_length/millimeters.py5
-rw-r--r--release/scripts/startup/bl_app_templates_system/2D_Animation/startup.blendbin0 -> 698040 bytes
-rw-r--r--release/scripts/startup/bl_app_templates_system/Sculpting/__init__.py23
-rw-r--r--release/scripts/startup/bl_app_templates_system/Sculpting/startup.blendbin0 -> 394852 bytes
-rw-r--r--release/scripts/startup/bl_app_templates_system/VFX/startup.blendbin0 -> 505236 bytes
-rw-r--r--release/scripts/startup/bl_app_templates_system/Video_Editing/startup.blendbin0 -> 405320 bytes
-rw-r--r--release/scripts/startup/bl_operators/__init__.py1
-rw-r--r--release/scripts/startup/bl_operators/add_mesh_torus.py10
-rw-r--r--release/scripts/startup/bl_operators/anim.py4
-rw-r--r--release/scripts/startup/bl_operators/clip.py16
-rw-r--r--release/scripts/startup/bl_operators/constraint.py76
-rw-r--r--release/scripts/startup/bl_operators/freestyle.py8
-rw-r--r--release/scripts/startup/bl_operators/image.py2
-rw-r--r--release/scripts/startup/bl_operators/mesh.py83
-rw-r--r--release/scripts/startup/bl_operators/object.py62
-rw-r--r--release/scripts/startup/bl_operators/object_quick_effects.py9
-rw-r--r--release/scripts/startup/bl_operators/object_randomize_transform.py2
-rw-r--r--release/scripts/startup/bl_operators/presets.py50
-rw-r--r--release/scripts/startup/bl_operators/rigidbody.py10
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_follow_active.py50
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_lightmap.py63
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_smart_project.py92
-rw-r--r--release/scripts/startup/bl_operators/vertexpaint_dirt.py4
-rw-r--r--release/scripts/startup/bl_operators/wm.py255
-rw-r--r--release/scripts/startup/bl_ui/__init__.py1
-rw-r--r--release/scripts/startup/bl_ui/properties_animviz.py89
-rw-r--r--release/scripts/startup/bl_ui/properties_constraint.py59
-rw-r--r--release/scripts/startup/bl_ui/properties_data_armature.py44
-rw-r--r--release/scripts/startup/bl_ui/properties_data_bone.py31
-rw-r--r--release/scripts/startup/bl_ui/properties_data_camera.py30
-rw-r--r--release/scripts/startup/bl_ui/properties_data_curve.py20
-rw-r--r--release/scripts/startup/bl_ui/properties_data_empty.py14
-rw-r--r--release/scripts/startup/bl_ui/properties_data_gpencil.py106
-rw-r--r--release/scripts/startup/bl_ui/properties_data_light.py1
-rw-r--r--release/scripts/startup/bl_ui/properties_data_lightprobe.py9
-rw-r--r--release/scripts/startup/bl_ui/properties_data_mesh.py111
-rw-r--r--release/scripts/startup/bl_ui/properties_data_metaball.py3
-rw-r--r--release/scripts/startup/bl_ui/properties_data_modifier.py432
-rw-r--r--release/scripts/startup/bl_ui/properties_data_shaderfx.py50
-rw-r--r--release/scripts/startup/bl_ui/properties_data_speaker.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_freestyle.py23
-rw-r--r--release/scripts/startup/bl_ui/properties_grease_pencil_common.py160
-rw-r--r--release/scripts/startup/bl_ui/properties_mask_common.py91
-rw-r--r--release/scripts/startup/bl_ui/properties_material.py39
-rw-r--r--release/scripts/startup/bl_ui/properties_material_gpencil.py46
-rw-r--r--release/scripts/startup/bl_ui/properties_object.py80
-rw-r--r--release/scripts/startup/bl_ui/properties_output.py523
-rw-r--r--release/scripts/startup/bl_ui/properties_paint_common.py70
-rw-r--r--release/scripts/startup/bl_ui/properties_particle.py132
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_cloth.py257
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_common.py10
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py10
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_field.py11
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_fracture.py18
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_smoke.py14
-rw-r--r--release/scripts/startup/bl_ui/properties_render.py635
-rw-r--r--release/scripts/startup/bl_ui/properties_scene.py188
-rw-r--r--release/scripts/startup/bl_ui/properties_texture.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_view_layer.py24
-rw-r--r--release/scripts/startup/bl_ui/space_clip.py540
-rw-r--r--release/scripts/startup/bl_ui/space_dopesheet.py112
-rw-r--r--release/scripts/startup/bl_ui/space_filebrowser.py6
-rw-r--r--release/scripts/startup/bl_ui/space_graph.py49
-rw-r--r--release/scripts/startup/bl_ui/space_image.py360
-rw-r--r--release/scripts/startup/bl_ui/space_info.py7
-rw-r--r--release/scripts/startup/bl_ui/space_nla.py20
-rw-r--r--release/scripts/startup/bl_ui/space_node.py24
-rw-r--r--release/scripts/startup/bl_ui/space_outliner.py8
-rw-r--r--release/scripts/startup/bl_ui/space_properties.py21
-rw-r--r--release/scripts/startup/bl_ui/space_sequencer.py180
-rw-r--r--release/scripts/startup/bl_ui/space_statusbar.py13
-rw-r--r--release/scripts/startup/bl_ui/space_time.py4
-rw-r--r--release/scripts/startup/bl_ui/space_toolsystem_common.py246
-rw-r--r--release/scripts/startup/bl_ui/space_toolsystem_toolbar.py876
-rw-r--r--release/scripts/startup/bl_ui/space_topbar.py665
-rw-r--r--release/scripts/startup/bl_ui/space_userpref.py214
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py710
-rw-r--r--release/scripts/startup/bl_ui/space_view3d_toolbar.py666
-rw-r--r--release/scripts/startup/keyingsets_builtins.py6
-rw-r--r--release/scripts/templates_py/background_job.py2
-rw-r--r--release/scripts/templates_py/batch_export.py6
-rw-r--r--release/scripts/templates_py/builtin_keyingset.py2
-rw-r--r--release/scripts/templates_py/gizmo_custom_geometry.py3
-rw-r--r--release/scripts/templates_py/gizmo_operator.py26
-rw-r--r--release/scripts/templates_py/operator_modal_view3d.py4
-rw-r--r--release/scripts/templates_py/operator_modal_view3d_raycast.py2
-rw-r--r--release/scripts/templates_py/ui_tool_simple.py35
-rw-r--r--release/text/readme.html6
-rw-r--r--source/blender/alembic/intern/abc_archive.h2
-rw-r--r--source/blender/alembic/intern/abc_curves.cc2
-rw-r--r--source/blender/alembic/intern/abc_customdata.cc10
-rw-r--r--source/blender/alembic/intern/abc_exporter.cc2
-rw-r--r--source/blender/alembic/intern/abc_exporter.h2
-rw-r--r--source/blender/alembic/intern/abc_hair.cc3
-rw-r--r--source/blender/alembic/intern/abc_mball.cc2
-rw-r--r--source/blender/alembic/intern/abc_mesh.cc14
-rw-r--r--source/blender/alembic/intern/abc_nurbs.cc4
-rw-r--r--source/blender/alembic/intern/abc_points.cc8
-rw-r--r--source/blender/alembic/intern/abc_util.h4
-rw-r--r--source/blender/alembic/intern/alembic_capi.cc44
-rw-r--r--source/blender/avi/intern/avi.c67
-rw-r--r--source/blender/blenfont/intern/blf_dir.c26
-rw-r--r--source/blender/blenfont/intern/blf_font.c156
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h106
-rw-r--r--source/blender/blenkernel/BKE_action.h2
-rw-r--r--source/blender/blenkernel/BKE_anim.h21
-rw-r--r--source/blender/blenkernel/BKE_animsys.h11
-rw-r--r--source/blender/blenkernel/BKE_appdir.h2
-rw-r--r--source/blender/blenkernel/BKE_armature.h44
-rw-r--r--source/blender/blenkernel/BKE_blender_version.h2
-rw-r--r--source/blender/blenkernel/BKE_bmfont.h61
-rw-r--r--source/blender/blenkernel/BKE_brush.h10
-rw-r--r--source/blender/blenkernel/BKE_bvhutils.h6
-rw-r--r--source/blender/blenkernel/BKE_ccg.h3
-rw-r--r--source/blender/blenkernel/BKE_cdderivedmesh.h27
-rw-r--r--source/blender/blenkernel/BKE_cloth.h51
-rw-r--r--source/blender/blenkernel/BKE_collection.h1
-rw-r--r--source/blender/blenkernel/BKE_collision.h3
-rw-r--r--source/blender/blenkernel/BKE_constraint.h22
-rw-r--r--source/blender/blenkernel/BKE_context.h6
-rw-r--r--source/blender/blenkernel/BKE_customdata.h25
-rw-r--r--source/blender/blenkernel/BKE_displist.h11
-rw-r--r--source/blender/blenkernel/BKE_dynamicpaint.h7
-rw-r--r--source/blender/blenkernel/BKE_editmesh.h10
-rw-r--r--source/blender/blenkernel/BKE_editmesh_cache.h (renamed from source/blender/blenkernel/BKE_bmfont_types.h)44
-rw-r--r--source/blender/blenkernel/BKE_fcurve.h14
-rw-r--r--source/blender/blenkernel/BKE_global.h24
-rw-r--r--source/blender/blenkernel/BKE_gpencil.h7
-rw-r--r--source/blender/blenkernel/BKE_gpencil_modifier.h34
-rw-r--r--source/blender/blenkernel/BKE_image.h6
-rw-r--r--source/blender/blenkernel/BKE_key.h12
-rw-r--r--source/blender/blenkernel/BKE_lattice.h28
-rw-r--r--source/blender/blenkernel/BKE_layer.h9
-rw-r--r--source/blender/blenkernel/BKE_library.h34
-rw-r--r--source/blender/blenkernel/BKE_library_override.h3
-rw-r--r--source/blender/blenkernel/BKE_library_query.h2
-rw-r--r--source/blender/blenkernel/BKE_main.h30
-rw-r--r--source/blender/blenkernel/BKE_mball.h17
-rw-r--r--source/blender/blenkernel/BKE_mesh.h31
-rw-r--r--source/blender/blenkernel/BKE_mesh_runtime.h7
-rw-r--r--source/blender/blenkernel/BKE_mesh_tangent.h4
-rw-r--r--source/blender/blenkernel/BKE_modifier.h153
-rw-r--r--source/blender/blenkernel/BKE_movieclip.h2
-rw-r--r--source/blender/blenkernel/BKE_multires.h26
-rw-r--r--source/blender/blenkernel/BKE_nla.h12
-rw-r--r--source/blender/blenkernel/BKE_node.h6
-rw-r--r--source/blender/blenkernel/BKE_object.h3
-rw-r--r--source/blender/blenkernel/BKE_paint.h38
-rw-r--r--source/blender/blenkernel/BKE_particle.h6
-rw-r--r--source/blender/blenkernel/BKE_pbvh.h4
-rw-r--r--source/blender/blenkernel/BKE_pointcache.h2
-rw-r--r--source/blender/blenkernel/BKE_screen.h11
-rw-r--r--source/blender/blenkernel/BKE_shader_fx.h8
-rw-r--r--source/blender/blenkernel/BKE_shrinkwrap.h72
-rw-r--r--source/blender/blenkernel/BKE_smoke.h9
-rw-r--r--source/blender/blenkernel/BKE_subdiv.h313
-rw-r--r--source/blender/blenkernel/BKE_subdiv_ccg.h249
-rw-r--r--source/blender/blenkernel/BKE_subdiv_eval.h127
-rw-r--r--source/blender/blenkernel/BKE_subdiv_foreach.h181
-rw-r--r--source/blender/blenkernel/BKE_subdiv_mesh.h56
-rw-r--r--source/blender/blenkernel/BKE_text.h4
-rw-r--r--source/blender/blenkernel/BKE_unit.h15
-rw-r--r--source/blender/blenkernel/BKE_workspace.h3
-rw-r--r--source/blender/blenkernel/BKE_world.h2
-rw-r--r--source/blender/blenkernel/CMakeLists.txt17
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf.c1
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf_intern.h2
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c12
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c54
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c1583
-rw-r--r--source/blender/blenkernel/intern/action.c6
-rw-r--r--source/blender/blenkernel/intern/anim.c96
-rw-r--r--source/blender/blenkernel/intern/anim_sys.c264
-rw-r--r--source/blender/blenkernel/intern/appdir.c147
-rw-r--r--source/blender/blenkernel/intern/armature.c582
-rw-r--r--source/blender/blenkernel/intern/armature_update.c12
-rw-r--r--source/blender/blenkernel/intern/blender.c1
-rw-r--r--source/blender/blenkernel/intern/blender_undo.c5
-rw-r--r--source/blender/blenkernel/intern/blendfile.c30
-rw-r--r--source/blender/blenkernel/intern/bmfont.c293
-rw-r--r--source/blender/blenkernel/intern/boids.c2
-rw-r--r--source/blender/blenkernel/intern/boolean.c2
-rw-r--r--source/blender/blenkernel/intern/bpath.c7
-rw-r--r--source/blender/blenkernel/intern/brush.c60
-rw-r--r--source/blender/blenkernel/intern/bvhutils.c220
-rw-r--r--source/blender/blenkernel/intern/camera.c5
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c873
-rw-r--r--source/blender/blenkernel/intern/cloth.c668
-rw-r--r--source/blender/blenkernel/intern/collection.c116
-rw-r--r--source/blender/blenkernel/intern/collision.c1434
-rw-r--r--source/blender/blenkernel/intern/colorband.c2
-rw-r--r--source/blender/blenkernel/intern/colortools.c49
-rw-r--r--source/blender/blenkernel/intern/constraint.c407
-rw-r--r--source/blender/blenkernel/intern/context.c14
-rw-r--r--source/blender/blenkernel/intern/crazyspace.c54
-rw-r--r--source/blender/blenkernel/intern/curve.c127
-rw-r--r--source/blender/blenkernel/intern/customdata.c58
-rw-r--r--source/blender/blenkernel/intern/customdata_file.c10
-rw-r--r--source/blender/blenkernel/intern/data_transfer.c2
-rw-r--r--source/blender/blenkernel/intern/deform.c5
-rw-r--r--source/blender/blenkernel/intern/displist.c82
-rw-r--r--source/blender/blenkernel/intern/dynamicpaint.c263
-rw-r--r--source/blender/blenkernel/intern/editderivedmesh.c1008
-rw-r--r--source/blender/blenkernel/intern/editmesh.c45
-rw-r--r--source/blender/blenkernel/intern/editmesh_cache.c120
-rw-r--r--source/blender/blenkernel/intern/effect.c325
-rw-r--r--source/blender/blenkernel/intern/fcurve.c231
-rw-r--r--source/blender/blenkernel/intern/fmodifier.c25
-rw-r--r--source/blender/blenkernel/intern/font.c121
-rw-r--r--source/blender/blenkernel/intern/fracture.c19
-rw-r--r--source/blender/blenkernel/intern/fracture_automerge.c14
-rw-r--r--source/blender/blenkernel/intern/fracture_constraints.c4
-rw-r--r--source/blender/blenkernel/intern/fracture_external.c8
-rw-r--r--source/blender/blenkernel/intern/gpencil.c142
-rw-r--r--source/blender/blenkernel/intern/gpencil_modifier.c103
-rw-r--r--source/blender/blenkernel/intern/icons.c20
-rw-r--r--source/blender/blenkernel/intern/idcode.c78
-rw-r--r--source/blender/blenkernel/intern/image.c57
-rw-r--r--source/blender/blenkernel/intern/ipo.c2
-rw-r--r--source/blender/blenkernel/intern/key.c242
-rw-r--r--source/blender/blenkernel/intern/lattice.c2
-rw-r--r--source/blender/blenkernel/intern/layer.c54
-rw-r--r--source/blender/blenkernel/intern/library.c589
-rw-r--r--source/blender/blenkernel/intern/library_idmap.c1
-rw-r--r--source/blender/blenkernel/intern/library_override.c27
-rw-r--r--source/blender/blenkernel/intern/library_query.c32
-rw-r--r--source/blender/blenkernel/intern/library_remap.c127
-rw-r--r--source/blender/blenkernel/intern/lightprobe.c3
-rw-r--r--source/blender/blenkernel/intern/main.c446
-rw-r--r--source/blender/blenkernel/intern/mask.c41
-rw-r--r--source/blender/blenkernel/intern/mask_rasterize.c20
-rw-r--r--source/blender/blenkernel/intern/material.c109
-rw-r--r--source/blender/blenkernel/intern/mball.c134
-rw-r--r--source/blender/blenkernel/intern/mball_tessellate.c21
-rw-r--r--source/blender/blenkernel/intern/mesh.c94
-rw-r--r--source/blender/blenkernel/intern/mesh_convert.c47
-rw-r--r--source/blender/blenkernel/intern/mesh_evaluate.c70
-rw-r--r--source/blender/blenkernel/intern/mesh_iterators.c116
-rw-r--r--source/blender/blenkernel/intern/mesh_mapping.c2
-rw-r--r--source/blender/blenkernel/intern/mesh_merge.c12
-rw-r--r--source/blender/blenkernel/intern/mesh_remap.c20
-rw-r--r--source/blender/blenkernel/intern/mesh_runtime.c11
-rw-r--r--source/blender/blenkernel/intern/mesh_tangent.c22
-rw-r--r--source/blender/blenkernel/intern/mesh_validate.c149
-rw-r--r--source/blender/blenkernel/intern/modifier.c387
-rw-r--r--source/blender/blenkernel/intern/movieclip.c1
-rw-r--r--source/blender/blenkernel/intern/multires.c246
-rw-r--r--source/blender/blenkernel/intern/multires_inline.h68
-rw-r--r--source/blender/blenkernel/intern/multires_reshape.c990
-rw-r--r--source/blender/blenkernel/intern/multires_subdiv.c2
-rw-r--r--source/blender/blenkernel/intern/nla.c87
-rw-r--r--source/blender/blenkernel/intern/node.c100
-rw-r--r--source/blender/blenkernel/intern/object.c303
-rw-r--r--source/blender/blenkernel/intern/object_deform.c6
-rw-r--r--source/blender/blenkernel/intern/object_dupli.c152
-rw-r--r--source/blender/blenkernel/intern/object_update.c29
-rw-r--r--source/blender/blenkernel/intern/ocean.c51
-rw-r--r--source/blender/blenkernel/intern/packedFile.c30
-rw-r--r--source/blender/blenkernel/intern/paint.c376
-rw-r--r--source/blender/blenkernel/intern/paint_toolslots.c140
-rw-r--r--source/blender/blenkernel/intern/particle.c59
-rw-r--r--source/blender/blenkernel/intern/particle_child.c8
-rw-r--r--source/blender/blenkernel/intern/particle_distribute.c18
-rw-r--r--source/blender/blenkernel/intern/particle_system.c19
-rw-r--r--source/blender/blenkernel/intern/pbvh.c51
-rw-r--r--source/blender/blenkernel/intern/pbvh_bmesh.c22
-rw-r--r--source/blender/blenkernel/intern/pbvh_intern.h7
-rw-r--r--source/blender/blenkernel/intern/pointcache.c22
-rw-r--r--source/blender/blenkernel/intern/report.c2
-rw-r--r--source/blender/blenkernel/intern/rigidbody.c12
-rw-r--r--source/blender/blenkernel/intern/scene.c27
-rw-r--r--source/blender/blenkernel/intern/screen.c79
-rw-r--r--source/blender/blenkernel/intern/seqeffects.c88
-rw-r--r--source/blender/blenkernel/intern/sequencer.c45
-rw-r--r--source/blender/blenkernel/intern/shader_fx.c4
-rw-r--r--source/blender/blenkernel/intern/shrinkwrap.c971
-rw-r--r--source/blender/blenkernel/intern/smoke.c436
-rw-r--r--source/blender/blenkernel/intern/softbody.c204
-rw-r--r--source/blender/blenkernel/intern/subdiv.c29
-rw-r--r--source/blender/blenkernel/intern/subdiv_ccg.c1188
-rw-r--r--source/blender/blenkernel/intern/subdiv_ccg_mask.c197
-rw-r--r--source/blender/blenkernel/intern/subdiv_converter.c15
-rw-r--r--source/blender/blenkernel/intern/subdiv_converter.h6
-rw-r--r--source/blender/blenkernel/intern/subdiv_converter_mesh.c8
-rw-r--r--source/blender/blenkernel/intern/subdiv_displacement_multires.c90
-rw-r--r--source/blender/blenkernel/intern/subdiv_eval.c3
-rw-r--r--source/blender/blenkernel/intern/subdiv_foreach.c36
-rw-r--r--source/blender/blenkernel/intern/subdiv_inline.h80
-rw-r--r--source/blender/blenkernel/intern/subdiv_mesh.c13
-rw-r--r--source/blender/blenkernel/intern/subdiv_stats.c8
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c136
-rw-r--r--source/blender/blenkernel/intern/suggestions.c4
-rw-r--r--source/blender/blenkernel/intern/text.c4
-rw-r--r--source/blender/blenkernel/intern/tracking.c6
-rw-r--r--source/blender/blenkernel/intern/tracking_region_tracker.c2
-rw-r--r--source/blender/blenkernel/intern/tracking_stabilize.c14
-rw-r--r--source/blender/blenkernel/intern/undo_system.c5
-rw-r--r--source/blender/blenkernel/intern/unit.c240
-rw-r--r--source/blender/blenkernel/intern/workspace.c29
-rw-r--r--source/blender/blenkernel/intern/world.c6
-rw-r--r--source/blender/blenkernel/intern/writeavi.c1
-rw-r--r--source/blender/blenkernel/intern/writeffmpeg.c44
-rw-r--r--source/blender/blenkernel/nla_private.h12
-rw-r--r--source/blender/blenlib/BLI_bitmap.h3
-rw-r--r--source/blender/blenlib/BLI_expr_pylike_eval.h66
-rw-r--r--source/blender/blenlib/BLI_heap.h1
-rw-r--r--source/blender/blenlib/BLI_heap_simple.h44
-rw-r--r--source/blender/blenlib/BLI_kdopbvh.h8
-rw-r--r--source/blender/blenlib/BLI_link_utils.h9
-rw-r--r--source/blender/blenlib/BLI_listbase.h1
-rw-r--r--source/blender/blenlib/BLI_math_geom.h7
-rw-r--r--source/blender/blenlib/BLI_math_solvers.h14
-rw-r--r--source/blender/blenlib/BLI_math_statistics.h6
-rw-r--r--source/blender/blenlib/BLI_math_vector.h3
-rw-r--r--source/blender/blenlib/BLI_path_util.h3
-rw-r--r--source/blender/blenlib/BLI_rect.h7
-rw-r--r--source/blender/blenlib/BLI_utildefines.h8
-rw-r--r--source/blender/blenlib/BLI_vfontdata.h3
-rw-r--r--source/blender/blenlib/CMakeLists.txt4
-rw-r--r--source/blender/blenlib/intern/BLI_array.c5
-rw-r--r--source/blender/blenlib/intern/BLI_ghash.c51
-rw-r--r--source/blender/blenlib/intern/BLI_ghash_utils.c10
-rw-r--r--source/blender/blenlib/intern/BLI_heap.c39
-rw-r--r--source/blender/blenlib/intern/BLI_heap_simple.c247
-rw-r--r--source/blender/blenlib/intern/BLI_kdopbvh.c337
-rw-r--r--source/blender/blenlib/intern/DLRB_tree.c2
-rw-r--r--source/blender/blenlib/intern/array_store.c4
-rw-r--r--source/blender/blenlib/intern/array_store_utils.c4
-rw-r--r--source/blender/blenlib/intern/astar.c28
-rw-r--r--source/blender/blenlib/intern/edgehash.c43
-rw-r--r--source/blender/blenlib/intern/expr_pylike_eval.c1003
-rw-r--r--source/blender/blenlib/intern/freetypefont.c86
-rw-r--r--source/blender/blenlib/intern/listbase.c20
-rw-r--r--source/blender/blenlib/intern/math_geom.c204
-rw-r--r--source/blender/blenlib/intern/math_interp.c2
-rw-r--r--source/blender/blenlib/intern/math_matrix.c10
-rw-r--r--source/blender/blenlib/intern/math_rotation.c17
-rw-r--r--source/blender/blenlib/intern/math_solvers.c95
-rw-r--r--source/blender/blenlib/intern/math_vector_inline.c39
-rw-r--r--source/blender/blenlib/intern/noise.c33
-rw-r--r--source/blender/blenlib/intern/path_util.c79
-rw-r--r--source/blender/blenlib/intern/rand.c2
-rw-r--r--source/blender/blenlib/intern/rct.c8
-rw-r--r--source/blender/blenlib/intern/scanfill.c32
-rw-r--r--source/blender/blenlib/intern/storage.c2
-rw-r--r--source/blender/blenlib/intern/string_utils.c8
-rw-r--r--source/blender/blenlib/intern/task.c4
-rw-r--r--source/blender/blenloader/BLO_readfile.h5
-rw-r--r--source/blender/blenloader/CMakeLists.txt1
-rw-r--r--source/blender/blenloader/intern/readfile.c107
-rw-r--r--source/blender/blenloader/intern/undofile.c1
-rw-r--r--source/blender/blenloader/intern/versioning_250.c9
-rw-r--r--source/blender/blenloader/intern/versioning_260.c2
-rw-r--r--source/blender/blenloader/intern/versioning_280.c536
-rw-r--r--source/blender/blenloader/intern/versioning_defaults.c178
-rw-r--r--source/blender/blenloader/intern/versioning_userdef.c374
-rw-r--r--source/blender/blenloader/intern/writefile.c41
-rw-r--r--source/blender/blentranslation/intern/blt_lang.c2
-rw-r--r--source/blender/blentranslation/intern/blt_translation.c9
-rw-r--r--source/blender/bmesh/CMakeLists.txt1
-rw-r--r--source/blender/bmesh/intern/bmesh_callback_generic.c6
-rw-r--r--source/blender/bmesh/intern/bmesh_callback_generic.h6
-rw-r--r--source/blender/bmesh/intern/bmesh_interp.c50
-rw-r--r--source/blender/bmesh/intern/bmesh_log.c60
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh.c45
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh.h21
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh_conv.c167
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh_conv.h6
-rw-r--r--source/blender/bmesh/intern/bmesh_opdefines.c119
-rw-r--r--source/blender/bmesh/intern/bmesh_operators.h10
-rw-r--r--source/blender/bmesh/intern/bmesh_operators_private.h3
-rw-r--r--source/blender/bmesh/intern/bmesh_polygon.c55
-rw-r--r--source/blender/bmesh/intern/bmesh_polygon.h2
-rw-r--r--source/blender/bmesh/intern/bmesh_private.h6
-rw-r--r--source/blender/bmesh/intern/bmesh_query.c50
-rw-r--r--source/blender/bmesh/intern/bmesh_query.h2
-rw-r--r--source/blender/bmesh/operators/bmo_connect_pair.c24
-rw-r--r--source/blender/bmesh/operators/bmo_dupe.c73
-rw-r--r--source/blender/bmesh/operators/bmo_extrude.c20
-rw-r--r--source/blender/bmesh/operators/bmo_similar.c667
-rw-r--r--source/blender/bmesh/operators/bmo_smooth_laplacian.c6
-rw-r--r--source/blender/bmesh/operators/bmo_subdivide.c39
-rw-r--r--source/blender/bmesh/operators/bmo_subdivide_edgering.c6
-rw-r--r--source/blender/bmesh/tools/bmesh_bevel.c15
-rw-r--r--source/blender/bmesh/tools/bmesh_decimate_collapse.c4
-rw-r--r--source/blender/bmesh/tools/bmesh_intersect.c4
-rw-r--r--source/blender/bmesh/tools/bmesh_path.c56
-rw-r--r--source/blender/bmesh/tools/bmesh_wireframe.c1
-rw-r--r--source/blender/collada/AnimationExporter.cpp8
-rw-r--r--source/blender/collada/AnimationImporter.h11
-rw-r--r--source/blender/collada/ArmatureExporter.cpp6
-rw-r--r--source/blender/collada/ArmatureImporter.cpp60
-rw-r--r--source/blender/collada/ControllerExporter.cpp11
-rw-r--r--source/blender/collada/DocumentImporter.cpp15
-rw-r--r--source/blender/collada/DocumentImporter.h2
-rw-r--r--source/blender/collada/ErrorHandler.cpp4
-rw-r--r--source/blender/collada/GeometryExporter.cpp7
-rw-r--r--source/blender/collada/GeometryExporter.h2
-rw-r--r--source/blender/collada/ImageExporter.cpp2
-rw-r--r--source/blender/collada/MeshImporter.cpp21
-rw-r--r--source/blender/collada/SceneExporter.cpp2
-rw-r--r--source/blender/collada/collada_utils.cpp119
-rw-r--r--source/blender/collada/collada_utils.h14
-rw-r--r--source/blender/compositor/COM_compositor.h128
-rw-r--r--source/blender/compositor/COM_defines.h44
-rw-r--r--source/blender/compositor/intern/COM_CPUDevice.h8
-rw-r--r--source/blender/compositor/intern/COM_CompositorContext.cpp2
-rw-r--r--source/blender/compositor/intern/COM_CompositorContext.h74
-rw-r--r--source/blender/compositor/intern/COM_Converter.cpp2
-rw-r--r--source/blender/compositor/intern/COM_Converter.h32
-rw-r--r--source/blender/compositor/intern/COM_Device.h14
-rw-r--r--source/blender/compositor/intern/COM_ExecutionGroup.cpp8
-rw-r--r--source/blender/compositor/intern/COM_ExecutionGroup.h250
-rw-r--r--source/blender/compositor/intern/COM_ExecutionSystem.h56
-rw-r--r--source/blender/compositor/intern/COM_MemoryBuffer.h60
-rw-r--r--source/blender/compositor/intern/COM_MemoryProxy.h36
-rw-r--r--source/blender/compositor/intern/COM_Node.h82
-rw-r--r--source/blender/compositor/intern/COM_NodeConverter.h49
-rw-r--r--source/blender/compositor/intern/COM_NodeGraph.cpp2
-rw-r--r--source/blender/compositor/intern/COM_NodeOperation.cpp2
-rw-r--r--source/blender/compositor/intern/COM_NodeOperation.h176
-rw-r--r--source/blender/compositor/intern/COM_OpenCLDevice.h36
-rw-r--r--source/blender/compositor/intern/COM_SocketReader.h54
-rw-r--r--source/blender/compositor/intern/COM_WorkPackage.h16
-rw-r--r--source/blender/compositor/intern/COM_WorkScheduler.cpp12
-rw-r--r--source/blender/compositor/intern/COM_WorkScheduler.h36
-rw-r--r--source/blender/compositor/nodes/COM_AlphaOverNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_BilateralBlurNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_BlurNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_BokehBlurNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_BokehImageNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_BoxMaskNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_BrightnessNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ChannelMatteNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ChromaMatteNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ColorBalanceNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ColorCorrectionNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ColorCurveNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ColorMatteNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ColorNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ColorRampNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ColorSpillNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ColorToBWNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_CompositorNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ConvertAlphaNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_CornerPinNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_CropNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_CryptomatteNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_DefocusNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_DespeckleNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_DifferenceMatteNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_DilateErodeNode.h6
-rw-r--r--source/blender/compositor/nodes/COM_DirectionalBlurNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_DisplaceNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_DistanceMatteNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_EllipseMaskNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_FilterNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_FlipNode.cpp2
-rw-r--r--source/blender/compositor/nodes/COM_FlipNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_GammaNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_GlareNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_HueSaturationValueNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_IDMaskNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ImageNode.cpp2
-rw-r--r--source/blender/compositor/nodes/COM_ImageNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_InpaintNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_InvertNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_KeyingNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_KeyingScreenNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_LensDistortionNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_LuminanceMatteNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_MapRangeNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_MapUVNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_MapValueNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_MaskNode.cpp1
-rw-r--r--source/blender/compositor/nodes/COM_MaskNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_MathNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_MixNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_MovieClipNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_MovieDistortionNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_NormalNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_NormalizeNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_OutputFileNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_PixelateNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_PlaneTrackDeformNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_RenderLayersNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_RotateNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ScaleNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_SetAlphaNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_SocketProxyNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_SplitViewerNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_Stabilize2dNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_SunBeamsNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_SwitchNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_SwitchViewNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_TextureNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_TimeNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_TonemapNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_TrackPositionNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_TransformNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_TranslateNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ValueNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_VectorBlurNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_VectorCurveNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ViewLevelsNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ViewerNode.h4
-rw-r--r--source/blender/compositor/nodes/COM_ZCombineNode.h4
-rw-r--r--source/blender/compositor/operations/COM_AntiAliasOperation.h6
-rw-r--r--source/blender/compositor/operations/COM_BokehImageOperation.h52
-rw-r--r--source/blender/compositor/operations/COM_CalculateMeanOperation.h6
-rw-r--r--source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h4
-rw-r--r--source/blender/compositor/operations/COM_CompositorOperation.cpp1
-rw-r--r--source/blender/compositor/operations/COM_CompositorOperation.h26
-rw-r--r--source/blender/compositor/operations/COM_ConvertColorProfileOperation.h6
-rw-r--r--source/blender/compositor/operations/COM_DotproductOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.h6
-rw-r--r--source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.h2
-rw-r--r--source/blender/compositor/operations/COM_GaussianXBlurOperation.h6
-rw-r--r--source/blender/compositor/operations/COM_GaussianYBlurOperation.h2
-rw-r--r--source/blender/compositor/operations/COM_GlareBaseOperation.h4
-rw-r--r--source/blender/compositor/operations/COM_GlareThresholdOperation.h4
-rw-r--r--source/blender/compositor/operations/COM_ImageOperation.h2
-rw-r--r--source/blender/compositor/operations/COM_MapValueOperation.h2
-rw-r--r--source/blender/compositor/operations/COM_MaskOperation.cpp4
-rw-r--r--source/blender/compositor/operations/COM_MaskOperation.h2
-rw-r--r--source/blender/compositor/operations/COM_NormalizeOperation.h8
-rw-r--r--source/blender/compositor/operations/COM_OutputFileMultiViewOperation.cpp5
-rw-r--r--source/blender/compositor/operations/COM_OutputFileOperation.cpp6
-rw-r--r--source/blender/compositor/operations/COM_OutputFileOperation.h4
-rw-r--r--source/blender/compositor/operations/COM_PixelateOperation.h22
-rw-r--r--source/blender/compositor/operations/COM_PreviewOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_PreviewOperation.h4
-rw-r--r--source/blender/compositor/operations/COM_ReadBufferOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_ReadBufferOperation.h2
-rw-r--r--source/blender/compositor/operations/COM_RenderLayersProg.h6
-rw-r--r--source/blender/compositor/operations/COM_ScaleOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_SetColorOperation.h8
-rw-r--r--source/blender/compositor/operations/COM_SetValueOperation.h2
-rw-r--r--source/blender/compositor/operations/COM_SetVectorOperation.h8
-rw-r--r--source/blender/compositor/operations/COM_SunBeamsOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_TextureOperation.h2
-rw-r--r--source/blender/compositor/operations/COM_TonemapOperation.h18
-rw-r--r--source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_VectorBlurOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_VectorBlurOperation.h4
-rw-r--r--source/blender/compositor/operations/COM_ViewerOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_ViewerOperation.h4
-rw-r--r--source/blender/compositor/operations/COM_WriteBufferOperation.h6
-rwxr-xr-xsource/blender/datatoc/datatoc_icon_split.py17
-rw-r--r--source/blender/depsgraph/DEG_depsgraph.h6
-rw-r--r--source/blender/depsgraph/DEG_depsgraph_build.h11
-rw-r--r--source/blender/depsgraph/DEG_depsgraph_query.h4
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder.cc36
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_cycle.cc10
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_map.cc1
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc266
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.h54
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc48
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc2
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc123
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.h5
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc118
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_transitive.cc15
-rw-r--r--source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc1
-rw-r--r--source/blender/depsgraph/intern/debug/deg_debug_stats_gnuplot.cc3
-rw-r--r--source/blender/depsgraph/intern/depsgraph.cc2
-rw-r--r--source/blender/depsgraph/intern/depsgraph.h2
-rw-r--r--source/blender/depsgraph/intern/depsgraph_build.cc80
-rw-r--r--source/blender/depsgraph/intern/depsgraph_debug.cc6
-rw-r--r--source/blender/depsgraph/intern/depsgraph_eval.cc8
-rw-r--r--source/blender/depsgraph/intern/depsgraph_intern.h4
-rw-r--r--source/blender/depsgraph/intern/depsgraph_query.cc4
-rw-r--r--source/blender/depsgraph/intern/depsgraph_query_filter.cc14
-rw-r--r--source/blender/depsgraph/intern/depsgraph_query_foreach.cc17
-rw-r--r--source/blender/depsgraph/intern/depsgraph_query_iter.cc6
-rw-r--r--source/blender/depsgraph/intern/depsgraph_tag.cc131
-rw-r--r--source/blender/depsgraph/intern/depsgraph_type_defines.cc3
-rw-r--r--source/blender/depsgraph/intern/depsgraph_types.h13
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval.cc14
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc14
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h2
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_flush.cc42
-rw-r--r--source/blender/depsgraph/intern/nodes/deg_node.h8
-rw-r--r--source/blender/depsgraph/intern/nodes/deg_node_component.cc14
-rw-r--r--source/blender/depsgraph/intern/nodes/deg_node_component.h8
-rw-r--r--source/blender/depsgraph/intern/nodes/deg_node_id.cc24
-rw-r--r--source/blender/depsgraph/intern/nodes/deg_node_id.h17
-rw-r--r--source/blender/depsgraph/intern/nodes/deg_node_operation.cc1
-rw-r--r--source/blender/depsgraph/intern/nodes/deg_node_operation.h1
-rw-r--r--source/blender/depsgraph/util/deg_util_function.h4
-rw-r--r--source/blender/draw/CMakeLists.txt18
-rw-r--r--source/blender/draw/DRW_engine.h5
-rw-r--r--source/blender/draw/engines/basic/basic_engine.c24
-rw-r--r--source/blender/draw/engines/eevee/eevee_depth_of_field.c71
-rw-r--r--source/blender/draw/engines/eevee/eevee_effects.c138
-rw-r--r--source/blender/draw/engines/eevee/eevee_engine.c21
-rw-r--r--source/blender/draw/engines/eevee/eevee_lightcache.c88
-rw-r--r--source/blender/draw/engines/eevee/eevee_lightprobes.c32
-rw-r--r--source/blender/draw/engines/eevee/eevee_lights.c222
-rw-r--r--source/blender/draw/engines/eevee/eevee_lookdev.c20
-rw-r--r--source/blender/draw/engines/eevee/eevee_materials.c218
-rw-r--r--source/blender/draw/engines/eevee/eevee_motion_blur.c2
-rw-r--r--source/blender/draw/engines/eevee/eevee_occlusion.c10
-rw-r--r--source/blender/draw/engines/eevee/eevee_private.h51
-rw-r--r--source/blender/draw/engines/eevee/eevee_render.c84
-rw-r--r--source/blender/draw/engines/eevee/eevee_screen_raytrace.c4
-rw-r--r--source/blender/draw/engines/eevee/eevee_subsurface.c49
-rw-r--r--source/blender/draw/engines/eevee/eevee_temporal_sampling.c44
-rw-r--r--source/blender/draw/engines/eevee/eevee_volumes.c26
-rw-r--r--source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl5
-rw-r--r--source/blender/draw/engines/eevee/shaders/background_vert.glsl10
-rw-r--r--source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl9
-rw-r--r--source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl10
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl81
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl13
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_minmaxz_frag.glsl9
-rw-r--r--source/blender/draw/engines/eevee/shaders/lamps_lib.glsl46
-rw-r--r--source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl35
-rw-r--r--source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl58
-rw-r--r--source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl9
-rw-r--r--source/blender/draw/engines/eevee/shaders/prepass_frag.glsl5
-rw-r--r--source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl7
-rw-r--r--source/blender/draw/engines/eevee/shaders/shadow_copy_frag.glsl58
-rw-r--r--source/blender/draw/engines/eevee/shaders/shadow_store_frag.glsl155
-rw-r--r--source/blender/draw/engines/eevee/shaders/shadow_vert.glsl2
-rw-r--r--source/blender/draw/engines/eevee/shaders/volumetric_geom.glsl18
-rw-r--r--source/blender/draw/engines/eevee/shaders/volumetric_integration_frag.glsl2
-rw-r--r--source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl3
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_cache_utils.c161
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c154
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_draw_utils.c298
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_engine.c119
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_engine.h25
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_render.c32
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_shader_fx.c424
-rw-r--r--source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl55
-rw-r--r--source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl68
-rw-r--r--source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl46
-rw-r--r--source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_light_frag.glsl3
-rw-r--r--source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_pixel_frag.glsl3
-rw-r--r--source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_rim_prepare_frag.glsl3
-rw-r--r--source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_shadow_prepare_frag.glsl97
-rw-r--r--source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_shadow_resolve_frag.glsl32
-rw-r--r--source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_swirl_frag.glsl3
-rw-r--r--source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl3
-rw-r--r--source/blender/draw/engines/gpencil/shaders/gpencil_point_frag.glsl2
-rw-r--r--source/blender/draw/engines/gpencil/shaders/gpencil_point_vert.glsl3
-rw-r--r--source/blender/draw/engines/gpencil/shaders/gpencil_stroke_frag.glsl3
-rw-r--r--source/blender/draw/engines/gpencil/shaders/gpencil_stroke_vert.glsl3
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_checkerboard_depth_frag.glsl3
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl6
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl125
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl8
-rw-r--r--source/blender/draw/engines/workbench/workbench_data.c4
-rw-r--r--source/blender/draw/engines/workbench/workbench_deferred.c18
-rw-r--r--source/blender/draw/engines/workbench/workbench_forward.c51
-rw-r--r--source/blender/draw/engines/workbench/workbench_private.h2
-rw-r--r--source/blender/draw/engines/workbench/workbench_render.c4
-rw-r--r--source/blender/draw/engines/workbench/workbench_volume.c152
-rw-r--r--source/blender/draw/intern/DRW_render.h27
-rw-r--r--source/blender/draw/intern/draw_anim_viz.c4
-rw-r--r--source/blender/draw/intern/draw_armature.c269
-rw-r--r--source/blender/draw/intern/draw_cache.c157
-rw-r--r--source/blender/draw/intern/draw_cache.h12
-rw-r--r--source/blender/draw/intern/draw_cache_impl.h72
-rw-r--r--source/blender/draw/intern/draw_cache_impl_curve.c197
-rw-r--r--source/blender/draw/intern/draw_cache_impl_lattice.c5
-rw-r--r--source/blender/draw/intern/draw_cache_impl_mesh.c2252
-rw-r--r--source/blender/draw/intern/draw_cache_impl_particles.c10
-rw-r--r--source/blender/draw/intern/draw_common.c145
-rw-r--r--source/blender/draw/intern/draw_common.h21
-rw-r--r--source/blender/draw/intern/draw_debug.c13
-rw-r--r--source/blender/draw/intern/draw_hair.c2
-rw-r--r--source/blender/draw/intern/draw_instance_data.c4
-rw-r--r--source/blender/draw/intern/draw_manager.c180
-rw-r--r--source/blender/draw/intern/draw_manager.h18
-rw-r--r--source/blender/draw/intern/draw_manager_data.c79
-rw-r--r--source/blender/draw/intern/draw_manager_exec.c31
-rw-r--r--source/blender/draw/intern/draw_manager_profiling.c2
-rw-r--r--source/blender/draw/intern/draw_manager_shader.c14
-rw-r--r--source/blender/draw/intern/draw_manager_text.c7
-rw-r--r--source/blender/draw/intern/draw_manager_text.h2
-rw-r--r--source/blender/draw/intern/draw_view.c24
-rw-r--r--source/blender/draw/modes/draw_mode_engines.h1
-rw-r--r--source/blender/draw/modes/edit_curve_mode.c146
-rw-r--r--source/blender/draw/modes/edit_lattice_mode.c2
-rw-r--r--source/blender/draw/modes/edit_mesh_mode.c258
-rw-r--r--source/blender/draw/modes/edit_mesh_mode_text.c77
-rw-r--r--source/blender/draw/modes/edit_metaball_mode.c15
-rw-r--r--source/blender/draw/modes/edit_surface_mode.c251
-rw-r--r--source/blender/draw/modes/edit_text_mode.c72
-rw-r--r--source/blender/draw/modes/object_mode.c169
-rw-r--r--source/blender/draw/modes/overlay_mode.c118
-rw-r--r--source/blender/draw/modes/paint_texture_mode.c3
-rw-r--r--source/blender/draw/modes/paint_vertex_mode.c4
-rw-r--r--source/blender/draw/modes/paint_weight_mode.c34
-rw-r--r--source/blender/draw/modes/sculpt_mode.c2
-rw-r--r--source/blender/draw/modes/shaders/armature_axes_vert.glsl2
-rw-r--r--source/blender/draw/modes/shaders/armature_dof_vert.glsl30
-rw-r--r--source/blender/draw/modes/shaders/armature_envelope_outline_vert.glsl2
-rw-r--r--source/blender/draw/modes/shaders/armature_envelope_solid_vert.glsl2
-rw-r--r--source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl2
-rw-r--r--source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl2
-rw-r--r--source/blender/draw/modes/shaders/armature_sphere_outline_vert.glsl2
-rw-r--r--source/blender/draw/modes/shaders/armature_sphere_solid_vert.glsl2
-rw-r--r--source/blender/draw/modes/shaders/armature_stick_vert.glsl22
-rw-r--r--source/blender/draw/modes/shaders/common_globals_lib.glsl9
-rw-r--r--source/blender/draw/modes/shaders/common_hair_lib.glsl2
-rw-r--r--source/blender/draw/modes/shaders/edit_curve_overlay_frag.glsl22
-rw-r--r--source/blender/draw/modes/shaders/edit_curve_overlay_handle_geom.glsl119
-rw-r--r--source/blender/draw/modes/shaders/edit_curve_overlay_handle_vert.glsl15
-rw-r--r--source/blender/draw/modes/shaders/edit_curve_overlay_loosevert_vert.glsl42
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl28
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_vert.glsl2
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl17
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl110
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl42
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl233
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl52
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl41
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl96
-rw-r--r--source/blender/draw/modes/shaders/object_empty_axes_vert.glsl2
-rw-r--r--source/blender/draw/modes/shaders/object_empty_image_frag.glsl12
-rw-r--r--source/blender/draw/modes/shaders/object_empty_image_vert.glsl2
-rw-r--r--source/blender/draw/modes/shaders/object_grid_frag.glsl33
-rw-r--r--source/blender/draw/modes/shaders/object_mball_handles_vert.glsl2
-rw-r--r--source/blender/draw/modes/shaders/object_outline_prepass_geom.glsl2
-rw-r--r--source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl38
-rw-r--r--source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl69
-rw-r--r--source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl97
-rw-r--r--source/blender/draw/modes/shaders/paint_vertex_frag.glsl7
-rw-r--r--source/blender/draw/modes/shaders/paint_weight_frag.glsl97
-rw-r--r--source/blender/draw/modes/shaders/paint_weight_vert.glsl15
-rw-r--r--source/blender/editors/animation/anim_channels_defines.c28
-rw-r--r--source/blender/editors/animation/anim_channels_edit.c100
-rw-r--r--source/blender/editors/animation/anim_deps.c16
-rw-r--r--source/blender/editors/animation/anim_draw.c9
-rw-r--r--source/blender/editors/animation/anim_filter.c6
-rw-r--r--source/blender/editors/animation/anim_markers.c84
-rw-r--r--source/blender/editors/animation/anim_ops.c24
-rw-r--r--source/blender/editors/animation/drivers.c16
-rw-r--r--source/blender/editors/animation/fmodifier_ui.c4
-rw-r--r--source/blender/editors/animation/keyframes_draw.c740
-rw-r--r--source/blender/editors/animation/keyframes_edit.c20
-rw-r--r--source/blender/editors/animation/keyframes_general.c13
-rw-r--r--source/blender/editors/animation/keyframing.c126
-rw-r--r--source/blender/editors/animation/keyingsets.c13
-rw-r--r--source/blender/editors/armature/armature_add.c703
-rw-r--r--source/blender/editors/armature/armature_edit.c865
-rw-r--r--source/blender/editors/armature/armature_intern.h9
-rw-r--r--source/blender/editors/armature/armature_naming.c147
-rw-r--r--source/blender/editors/armature/armature_ops.c209
-rw-r--r--source/blender/editors/armature/armature_relations.c189
-rw-r--r--source/blender/editors/armature/armature_select.c410
-rw-r--r--source/blender/editors/armature/armature_skinning.c6
-rw-r--r--source/blender/editors/armature/armature_utils.c60
-rw-r--r--source/blender/editors/armature/editarmature_retarget.c6
-rw-r--r--source/blender/editors/armature/pose_edit.c134
-rw-r--r--source/blender/editors/armature/pose_lib.c9
-rw-r--r--source/blender/editors/armature/pose_select.c348
-rw-r--r--source/blender/editors/armature/pose_slide.c291
-rw-r--r--source/blender/editors/armature/pose_transform.c8
-rw-r--r--source/blender/editors/armature/pose_utils.c149
-rw-r--r--source/blender/editors/curve/curve_intern.h7
-rw-r--r--source/blender/editors/curve/curve_ops.c134
-rw-r--r--source/blender/editors/curve/editcurve.c1559
-rw-r--r--source/blender/editors/curve/editcurve_add.c20
-rw-r--r--source/blender/editors/curve/editcurve_paint.c20
-rw-r--r--source/blender/editors/curve/editcurve_select.c696
-rw-r--r--source/blender/editors/curve/editcurve_undo.c3
-rw-r--r--source/blender/editors/curve/editfont.c16
-rw-r--r--source/blender/editors/datafiles/CMakeLists.txt217
-rw-r--r--source/blender/editors/gizmo_library/CMakeLists.txt4
-rw-r--r--source/blender/editors/gizmo_library/geometry/geom_arrow_gizmo.c2
-rw-r--r--source/blender/editors/gizmo_library/geometry/geom_cube_gizmo.c2
-rw-r--r--source/blender/editors/gizmo_library/geometry/geom_dial_gizmo.c2
-rw-r--r--source/blender/editors/gizmo_library/gizmo_draw_utils.c2
-rw-r--r--source/blender/editors/gizmo_library/gizmo_geometry.h2
-rw-r--r--source/blender/editors/gizmo_library/gizmo_group_types/value2d_gizmo_group.c176
-rw-r--r--source/blender/editors/gizmo_library/gizmo_library_intern.h2
-rw-r--r--source/blender/editors/gizmo_library/gizmo_library_presets.c6
-rw-r--r--source/blender/editors/gizmo_library/gizmo_library_utils.c31
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/arrow2d_gizmo.c2
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c43
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c2
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c31
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c15
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c9
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c404
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c (renamed from source/blender/editors/gizmo_library/gizmo_types/grab3d_gizmo.c)255
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c2
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/value2d_gizmo.c198
-rw-r--r--source/blender/editors/gpencil/annotate_draw.c65
-rw-r--r--source/blender/editors/gpencil/annotate_paint.c90
-rw-r--r--source/blender/editors/gpencil/drawgpencil.c173
-rw-r--r--source/blender/editors/gpencil/editaction_gpencil.c10
-rw-r--r--source/blender/editors/gpencil/gpencil_add_monkey.c5
-rw-r--r--source/blender/editors/gpencil/gpencil_add_stroke.c3
-rw-r--r--source/blender/editors/gpencil/gpencil_armature.c43
-rw-r--r--source/blender/editors/gpencil/gpencil_brush.c111
-rw-r--r--source/blender/editors/gpencil/gpencil_convert.c125
-rw-r--r--source/blender/editors/gpencil/gpencil_data.c351
-rw-r--r--source/blender/editors/gpencil/gpencil_edit.c209
-rw-r--r--source/blender/editors/gpencil/gpencil_fill.c111
-rw-r--r--source/blender/editors/gpencil/gpencil_intern.h41
-rw-r--r--source/blender/editors/gpencil/gpencil_interpolate.c3
-rw-r--r--source/blender/editors/gpencil/gpencil_old.c20
-rw-r--r--source/blender/editors/gpencil/gpencil_ops.c484
-rw-r--r--source/blender/editors/gpencil/gpencil_paint.c453
-rw-r--r--source/blender/editors/gpencil/gpencil_primitive.c67
-rw-r--r--source/blender/editors/gpencil/gpencil_select.c123
-rw-r--r--source/blender/editors/gpencil/gpencil_utils.c355
-rw-r--r--source/blender/editors/include/ED_anim_api.h2
-rw-r--r--source/blender/editors/include/ED_armature.h9
-rw-r--r--source/blender/editors/include/ED_curve.h9
-rw-r--r--source/blender/editors/include/ED_datafiles.h3
-rw-r--r--source/blender/editors/include/ED_gizmo_library.h45
-rw-r--r--source/blender/editors/include/ED_gizmo_utils.h46
-rw-r--r--source/blender/editors/include/ED_gpencil.h10
-rw-r--r--source/blender/editors/include/ED_keyframes_draw.h119
-rw-r--r--source/blender/editors/include/ED_keyframing.h12
-rw-r--r--source/blender/editors/include/ED_keymap_templates.h32
-rw-r--r--source/blender/editors/include/ED_markers.h3
-rw-r--r--source/blender/editors/include/ED_mask.h2
-rw-r--r--source/blender/editors/include/ED_mball.h7
-rw-r--r--source/blender/editors/include/ED_mesh.h30
-rw-r--r--source/blender/editors/include/ED_numinput.h2
-rw-r--r--source/blender/editors/include/ED_object.h18
-rw-r--r--source/blender/editors/include/ED_particle.h2
-rw-r--r--source/blender/editors/include/ED_screen.h34
-rw-r--r--source/blender/editors/include/ED_select_utils.h11
-rw-r--r--source/blender/editors/include/ED_space_api.h1
-rw-r--r--source/blender/editors/include/ED_transform.h5
-rw-r--r--source/blender/editors/include/ED_types.h2
-rw-r--r--source/blender/editors/include/ED_uvedit.h8
-rw-r--r--source/blender/editors/include/ED_view3d.h34
-rw-r--r--source/blender/editors/include/UI_icons.h1284
-rw-r--r--source/blender/editors/include/UI_interface.h37
-rw-r--r--source/blender/editors/include/UI_interface_icons.h6
-rw-r--r--source/blender/editors/include/UI_resources.h25
-rw-r--r--source/blender/editors/include/UI_view2d.h13
-rw-r--r--source/blender/editors/interface/CMakeLists.txt1
-rw-r--r--source/blender/editors/interface/interface.c134
-rw-r--r--source/blender/editors/interface/interface_align.c26
-rw-r--r--source/blender/editors/interface/interface_anim.c4
-rw-r--r--source/blender/editors/interface/interface_context_menu.c11
-rw-r--r--source/blender/editors/interface/interface_draw.c107
-rw-r--r--source/blender/editors/interface/interface_eyedropper.c18
-rw-r--r--source/blender/editors/interface/interface_eyedropper_color.c2
-rw-r--r--source/blender/editors/interface/interface_eyedropper_datablock.c5
-rw-r--r--source/blender/editors/interface/interface_eyedropper_depth.c9
-rw-r--r--source/blender/editors/interface/interface_handlers.c683
-rw-r--r--source/blender/editors/interface/interface_icons.c345
-rw-r--r--source/blender/editors/interface/interface_icons_event.c1
-rw-r--r--source/blender/editors/interface/interface_intern.h8
-rw-r--r--source/blender/editors/interface/interface_layout.c191
-rw-r--r--source/blender/editors/interface/interface_ops.c97
-rw-r--r--source/blender/editors/interface/interface_panel.c239
-rw-r--r--source/blender/editors/interface/interface_query.c8
-rw-r--r--source/blender/editors/interface/interface_region_color_picker.c1
-rw-r--r--source/blender/editors/interface/interface_region_hud.c60
-rw-r--r--source/blender/editors/interface/interface_region_menu_pie.c1
-rw-r--r--source/blender/editors/interface/interface_region_menu_popup.c1
-rw-r--r--source/blender/editors/interface/interface_region_popover.c15
-rw-r--r--source/blender/editors/interface/interface_region_popup.c3
-rw-r--r--source/blender/editors/interface/interface_region_search.c7
-rw-r--r--source/blender/editors/interface/interface_region_tooltip.c396
-rw-r--r--source/blender/editors/interface/interface_style.c23
-rw-r--r--source/blender/editors/interface/interface_templates.c241
-rw-r--r--source/blender/editors/interface/interface_utils.c15
-rw-r--r--source/blender/editors/interface/interface_widgets.c142
-rw-r--r--source/blender/editors/interface/resources.c348
-rw-r--r--source/blender/editors/interface/view2d.c116
-rw-r--r--source/blender/editors/interface/view2d_ops.c103
-rw-r--r--source/blender/editors/io/io_collada.c2
-rw-r--r--source/blender/editors/lattice/editlattice_select.c180
-rw-r--r--source/blender/editors/lattice/editlattice_tools.c259
-rw-r--r--source/blender/editors/lattice/lattice_ops.c24
-rw-r--r--source/blender/editors/mask/mask_edit.c107
-rw-r--r--source/blender/editors/mask/mask_editaction.c8
-rw-r--r--source/blender/editors/mask/mask_intern.h2
-rw-r--r--source/blender/editors/mask/mask_select.c20
-rw-r--r--source/blender/editors/mesh/CMakeLists.txt6
-rw-r--r--source/blender/editors/mesh/editmesh_add.c50
-rw-r--r--source/blender/editors/mesh/editmesh_add_gizmo.c114
-rw-r--r--source/blender/editors/mesh/editmesh_bisect.c162
-rw-r--r--source/blender/editors/mesh/editmesh_extrude.c352
-rw-r--r--source/blender/editors/mesh/editmesh_extrude_gizmo.c407
-rw-r--r--source/blender/editors/mesh/editmesh_extrude_spin.c445
-rw-r--r--source/blender/editors/mesh/editmesh_extrude_spin_gizmo.c1080
-rw-r--r--source/blender/editors/mesh/editmesh_intersect.c2
-rw-r--r--source/blender/editors/mesh/editmesh_knife.c40
-rw-r--r--source/blender/editors/mesh/editmesh_knife_project.c2
-rw-r--r--source/blender/editors/mesh/editmesh_loopcut.c3
-rw-r--r--source/blender/editors/mesh/editmesh_path.c44
-rw-r--r--source/blender/editors/mesh/editmesh_polybuild.c347
-rw-r--r--source/blender/editors/mesh/editmesh_preselect_edgering.c (renamed from source/blender/editors/mesh/editmesh_preselect.c)2
-rw-r--r--source/blender/editors/mesh/editmesh_preselect_elem.c218
-rw-r--r--source/blender/editors/mesh/editmesh_rip.c24
-rw-r--r--source/blender/editors/mesh/editmesh_rip_edge.c2
-rw-r--r--source/blender/editors/mesh/editmesh_select.c575
-rw-r--r--source/blender/editors/mesh/editmesh_select_similar.c1376
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c722
-rw-r--r--source/blender/editors/mesh/editmesh_utils.c21
-rw-r--r--source/blender/editors/mesh/mesh_data.c14
-rw-r--r--source/blender/editors/mesh/mesh_intern.h6
-rw-r--r--source/blender/editors/mesh/mesh_mirror.c5
-rw-r--r--source/blender/editors/mesh/mesh_ops.c212
-rw-r--r--source/blender/editors/mesh/meshtools.c76
-rw-r--r--source/blender/editors/metaball/mball_edit.c522
-rw-r--r--source/blender/editors/metaball/mball_ops.c30
-rw-r--r--source/blender/editors/object/object_add.c210
-rw-r--r--source/blender/editors/object/object_bake.c18
-rw-r--r--source/blender/editors/object/object_bake_api.c6
-rw-r--r--source/blender/editors/object/object_collection.c2
-rw-r--r--source/blender/editors/object/object_constraint.c106
-rw-r--r--source/blender/editors/object/object_data_transfer.c4
-rw-r--r--source/blender/editors/object/object_edit.c42
-rw-r--r--source/blender/editors/object/object_facemap_ops.c1
-rw-r--r--source/blender/editors/object/object_gpencil_modifier.c15
-rw-r--r--source/blender/editors/object/object_hook.c4
-rw-r--r--source/blender/editors/object/object_modes.c16
-rw-r--r--source/blender/editors/object/object_modifier.c240
-rw-r--r--source/blender/editors/object/object_ops.c217
-rw-r--r--source/blender/editors/object/object_random.c63
-rw-r--r--source/blender/editors/object/object_relations.c95
-rw-r--r--source/blender/editors/object/object_select.c6
-rw-r--r--source/blender/editors/object/object_shader_fx.c2
-rw-r--r--source/blender/editors/object/object_shapekey.c5
-rw-r--r--source/blender/editors/object/object_vgroup.c29
-rw-r--r--source/blender/editors/physics/dynamicpaint_ops.c2
-rw-r--r--source/blender/editors/physics/particle_edit.c30
-rw-r--r--source/blender/editors/physics/particle_object.c4
-rw-r--r--source/blender/editors/physics/physics_fluid.c5
-rw-r--r--source/blender/editors/physics/physics_ops.c58
-rw-r--r--source/blender/editors/physics/physics_pointcache.c10
-rw-r--r--source/blender/editors/physics/rigidbody_constraint.c1
-rw-r--r--source/blender/editors/physics/rigidbody_object.c1
-rw-r--r--source/blender/editors/render/render_internal.c36
-rw-r--r--source/blender/editors/render/render_opengl.c8
-rw-r--r--source/blender/editors/render/render_preview.c113
-rw-r--r--source/blender/editors/render/render_shading.c13
-rw-r--r--source/blender/editors/render/render_update.c31
-rw-r--r--source/blender/editors/scene/scene_edit.c1
-rw-r--r--source/blender/editors/screen/CMakeLists.txt1
-rw-r--r--source/blender/editors/screen/area.c103
-rw-r--r--source/blender/editors/screen/area_utils.c89
-rw-r--r--source/blender/editors/screen/glutil.c8
-rw-r--r--source/blender/editors/screen/screen_context.c44
-rw-r--r--source/blender/editors/screen/screen_edit.c8
-rw-r--r--source/blender/editors/screen/screen_ops.c302
-rw-r--r--source/blender/editors/screen/screendump.c2
-rw-r--r--source/blender/editors/screen/workspace_edit.c183
-rw-r--r--source/blender/editors/sculpt_paint/paint_cursor.c49
-rw-r--r--source/blender/editors/sculpt_paint/paint_curve.c2
-rw-r--r--source/blender/editors/sculpt_paint/paint_hide.c7
-rw-r--r--source/blender/editors/sculpt_paint/paint_image.c16
-rw-r--r--source/blender/editors/sculpt_paint/paint_image_2d.c8
-rw-r--r--source/blender/editors/sculpt_paint/paint_image_proj.c246
-rw-r--r--source/blender/editors/sculpt_paint/paint_intern.h24
-rw-r--r--source/blender/editors/sculpt_paint/paint_mask.c2
-rw-r--r--source/blender/editors/sculpt_paint/paint_ops.c547
-rw-r--r--source/blender/editors/sculpt_paint/paint_stroke.c24
-rw-r--r--source/blender/editors/sculpt_paint/paint_utils.c11
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c190
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex_color_ops.c2
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex_color_utils.c42
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex_proj.c11
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c4
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c42
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c38
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_undo.c60
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_uv.c11
-rw-r--r--source/blender/editors/sound/sound_ops.c6
-rw-r--r--source/blender/editors/space_action/action_data.c8
-rw-r--r--source/blender/editors/space_action/action_draw.c60
-rw-r--r--source/blender/editors/space_action/action_edit.c19
-rw-r--r--source/blender/editors/space_action/action_intern.h2
-rw-r--r--source/blender/editors/space_action/action_ops.c168
-rw-r--r--source/blender/editors/space_action/action_select.c66
-rw-r--r--source/blender/editors/space_action/space_action.c4
-rw-r--r--source/blender/editors/space_api/spacetypes.c14
-rw-r--r--source/blender/editors/space_buttons/buttons_context.c86
-rw-r--r--source/blender/editors/space_buttons/buttons_intern.h3
-rw-r--r--source/blender/editors/space_buttons/buttons_ops.c6
-rw-r--r--source/blender/editors/space_buttons/buttons_texture.c2
-rw-r--r--source/blender/editors/space_buttons/space_buttons.c82
-rw-r--r--source/blender/editors/space_clip/clip_buttons.c1
-rw-r--r--source/blender/editors/space_clip/clip_dopesheet_draw.c9
-rw-r--r--source/blender/editors/space_clip/clip_draw.c8
-rw-r--r--source/blender/editors/space_clip/clip_editor.c4
-rw-r--r--source/blender/editors/space_clip/clip_graph_ops.c32
-rw-r--r--source/blender/editors/space_clip/clip_intern.h4
-rw-r--r--source/blender/editors/space_clip/clip_ops.c14
-rw-r--r--source/blender/editors/space_clip/space_clip.c291
-rw-r--r--source/blender/editors/space_clip/tracking_ops_detect.c8
-rw-r--r--source/blender/editors/space_clip/tracking_ops_solve.c6
-rw-r--r--source/blender/editors/space_clip/tracking_select.c20
-rw-r--r--source/blender/editors/space_console/space_console.c84
-rw-r--r--source/blender/editors/space_file/file_draw.c16
-rw-r--r--source/blender/editors/space_file/file_intern.h2
-rw-r--r--source/blender/editors/space_file/file_ops.c36
-rw-r--r--source/blender/editors/space_file/filelist.c21
-rw-r--r--source/blender/editors/space_file/filelist.h18
-rw-r--r--source/blender/editors/space_file/fsmenu.c21
-rw-r--r--source/blender/editors/space_file/space_file.c135
-rw-r--r--source/blender/editors/space_graph/graph_buttons.c48
-rw-r--r--source/blender/editors/space_graph/graph_draw.c16
-rw-r--r--source/blender/editors/space_graph/graph_edit.c19
-rw-r--r--source/blender/editors/space_graph/graph_intern.h2
-rw-r--r--source/blender/editors/space_graph/graph_ops.c224
-rw-r--r--source/blender/editors/space_graph/graph_select.c40
-rw-r--r--source/blender/editors/space_graph/space_graph.c4
-rw-r--r--source/blender/editors/space_image/image_buttons.c49
-rw-r--r--source/blender/editors/space_image/image_edit.c12
-rw-r--r--source/blender/editors/space_image/image_ops.c35
-rw-r--r--source/blender/editors/space_image/space_image.c138
-rw-r--r--source/blender/editors/space_info/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_info/info_intern.h2
-rw-r--r--source/blender/editors/space_info/info_ops.c36
-rw-r--r--source/blender/editors/space_info/info_report.c24
-rw-r--r--source/blender/editors/space_info/info_stats.c60
-rw-r--r--source/blender/editors/space_info/space_info.c28
-rw-r--r--source/blender/editors/space_logic/space_logic.c12
-rw-r--r--source/blender/editors/space_nla/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_nla/nla_buttons.c2
-rw-r--r--source/blender/editors/space_nla/nla_channels.c29
-rw-r--r--source/blender/editors/space_nla/nla_draw.c12
-rw-r--r--source/blender/editors/space_nla/nla_edit.c115
-rw-r--r--source/blender/editors/space_nla/nla_intern.h2
-rw-r--r--source/blender/editors/space_nla/nla_ops.c172
-rw-r--r--source/blender/editors/space_nla/nla_select.c52
-rw-r--r--source/blender/editors/space_nla/space_nla.c4
-rw-r--r--source/blender/editors/space_node/drawnode.c19
-rw-r--r--source/blender/editors/space_node/node_buttons.c4
-rw-r--r--source/blender/editors/space_node/node_draw.c4
-rw-r--r--source/blender/editors/space_node/node_edit.c10
-rw-r--r--source/blender/editors/space_node/node_gizmo.c10
-rw-r--r--source/blender/editors/space_node/node_intern.h2
-rw-r--r--source/blender/editors/space_node/node_ops.c154
-rw-r--r--source/blender/editors/space_node/node_relationships.c8
-rw-r--r--source/blender/editors/space_node/node_select.c29
-rw-r--r--source/blender/editors/space_node/node_templates.c17
-rw-r--r--source/blender/editors/space_node/node_view.c2
-rw-r--r--source/blender/editors/space_node/space_node.c9
-rw-r--r--source/blender/editors/space_outliner/outliner_collections.c11
-rw-r--r--source/blender/editors/space_outliner/outliner_dragdrop.c232
-rw-r--r--source/blender/editors/space_outliner/outliner_draw.c158
-rw-r--r--source/blender/editors/space_outliner/outliner_edit.c2
-rw-r--r--source/blender/editors/space_outliner/outliner_intern.h12
-rw-r--r--source/blender/editors/space_outliner/outliner_ops.c90
-rw-r--r--source/blender/editors/space_outliner/outliner_select.c28
-rw-r--r--source/blender/editors/space_outliner/outliner_tools.c36
-rw-r--r--source/blender/editors/space_outliner/outliner_tree.c12
-rw-r--r--source/blender/editors/space_outliner/space_outliner.c2
-rw-r--r--source/blender/editors/space_script/script_edit.c22
-rw-r--r--source/blender/editors/space_script/script_intern.h1
-rw-r--r--source/blender/editors/space_script/script_ops.c1
-rw-r--r--source/blender/editors/space_sequencer/sequencer_add.c6
-rw-r--r--source/blender/editors/space_sequencer/sequencer_draw.c34
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c49
-rw-r--r--source/blender/editors/space_sequencer/sequencer_intern.h2
-rw-r--r--source/blender/editors/space_sequencer/sequencer_ops.c233
-rw-r--r--source/blender/editors/space_sequencer/sequencer_select.c32
-rw-r--r--source/blender/editors/space_sequencer/space_sequencer.c31
-rw-r--r--source/blender/editors/space_text/space_text.c156
-rw-r--r--source/blender/editors/space_text/text_format_lua.c4
-rw-r--r--source/blender/editors/space_text/text_format_osl.c6
-rw-r--r--source/blender/editors/space_text/text_format_pov.c8
-rw-r--r--source/blender/editors/space_text/text_format_pov_ini.c4
-rw-r--r--source/blender/editors/space_text/text_format_py.c6
-rw-r--r--source/blender/editors/space_text/text_ops.c4
-rw-r--r--source/blender/editors/space_text/text_undo.c1
-rw-r--r--source/blender/editors/space_time/time_ops.c10
-rw-r--r--source/blender/editors/space_topbar/space_topbar.c8
-rw-r--r--source/blender/editors/space_view3d/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_view3d/drawobject.c504
-rw-r--r--source/blender/editors/space_view3d/drawvolume.c853
-rw-r--r--source/blender/editors/space_view3d/space_view3d.c126
-rw-r--r--source/blender/editors/space_view3d/view3d_buttons.c16
-rw-r--r--source/blender/editors/space_view3d/view3d_camera_control.c4
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c148
-rw-r--r--source/blender/editors/space_view3d/view3d_draw_legacy.c20
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c90
-rw-r--r--source/blender/editors/space_view3d/view3d_fly.c54
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_armature.c8
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_camera.c4
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_empty.c19
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_lamp.c4
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_navigate.c92
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_navigate_type.c79
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_preselect.c57
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c262
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_ruler.c132
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c154
-rw-r--r--source/blender/editors/space_view3d/view3d_intern.h21
-rw-r--r--source/blender/editors/space_view3d/view3d_iterators.c34
-rw-r--r--source/blender/editors/space_view3d/view3d_ops.c314
-rw-r--r--source/blender/editors/space_view3d/view3d_project.c70
-rw-r--r--source/blender/editors/space_view3d/view3d_ruler.c106
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c112
-rw-r--r--source/blender/editors/space_view3d/view3d_snap.c279
-rw-r--r--source/blender/editors/space_view3d/view3d_view.c57
-rw-r--r--source/blender/editors/space_view3d/view3d_walk.c63
-rw-r--r--source/blender/editors/transform/transform.c240
-rw-r--r--source/blender/editors/transform/transform.h30
-rw-r--r--source/blender/editors/transform/transform_constraints.c4
-rw-r--r--source/blender/editors/transform/transform_conversions.c190
-rw-r--r--source/blender/editors/transform/transform_generics.c94
-rw-r--r--source/blender/editors/transform/transform_gizmo_2d.c146
-rw-r--r--source/blender/editors/transform/transform_gizmo_3d.c570
-rw-r--r--source/blender/editors/transform/transform_input.c17
-rw-r--r--source/blender/editors/transform/transform_ops.c272
-rw-r--r--source/blender/editors/transform/transform_orientations.c26
-rw-r--r--source/blender/editors/transform/transform_snap.c11
-rw-r--r--source/blender/editors/transform/transform_snap_object.c191
-rw-r--r--source/blender/editors/undo/CMakeLists.txt1
-rw-r--r--source/blender/editors/undo/ed_undo.c61
-rw-r--r--source/blender/editors/undo/memfile_undo.c2
-rw-r--r--source/blender/editors/util/CMakeLists.txt2
-rw-r--r--source/blender/editors/util/ed_transverts.c5
-rw-r--r--source/blender/editors/util/ed_util.c21
-rw-r--r--source/blender/editors/util/gizmo_utils.c76
-rw-r--r--source/blender/editors/util/numinput.c52
-rw-r--r--source/blender/editors/util/select_utils.c57
-rw-r--r--source/blender/editors/uvedit/uvedit_buttons.c4
-rw-r--r--source/blender/editors/uvedit/uvedit_draw.c1076
-rw-r--r--source/blender/editors/uvedit/uvedit_ops.c1656
-rw-r--r--source/blender/editors/uvedit/uvedit_parametrizer.c111
-rw-r--r--source/blender/editors/uvedit/uvedit_parametrizer.h3
-rw-r--r--source/blender/editors/uvedit/uvedit_smart_stitch.c308
-rw-r--r--source/blender/editors/uvedit/uvedit_unwrap_ops.c231
-rw-r--r--source/blender/freestyle/intern/application/AppCanvas.h2
-rw-r--r--source/blender/freestyle/intern/application/AppConfig.h2
-rw-r--r--source/blender/freestyle/intern/application/Controller.cpp10
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp2
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h3
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp4
-rw-r--r--source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp3
-rw-r--r--source/blender/freestyle/intern/geometry/Grid.h11
-rw-r--r--source/blender/freestyle/intern/geometry/SweepLine.h2
-rw-r--r--source/blender/freestyle/intern/image/GaussianFilter.h22
-rw-r--r--source/blender/freestyle/intern/image/ImagePyramid.cpp2
-rw-r--r--source/blender/freestyle/intern/python/BPy_Convert.h90
-rw-r--r--source/blender/freestyle/intern/python/BPy_IntegrationType.cpp2
-rw-r--r--source/blender/freestyle/intern/python/BPy_Interface1D.cpp8
-rw-r--r--source/blender/freestyle/intern/python/BPy_SShape.cpp2
-rw-r--r--source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp8
-rw-r--r--source/blender/freestyle/intern/scene_graph/IndexedFaceSet.h2
-rw-r--r--source/blender/freestyle/intern/scene_graph/NodeCamera.h4
-rw-r--r--source/blender/freestyle/intern/stroke/AdvancedStrokeShaders.h4
-rw-r--r--source/blender/freestyle/intern/stroke/BasicStrokeShaders.h4
-rw-r--r--source/blender/freestyle/intern/stroke/Stroke.h4
-rw-r--r--source/blender/freestyle/intern/system/PythonInterpreter.h2
-rw-r--r--source/blender/freestyle/intern/view_map/Interface0D.cpp10
-rw-r--r--source/blender/freestyle/intern/view_map/ViewMap.h20
-rw-r--r--source/blender/freestyle/intern/view_map/ViewMapIO.cpp16
-rw-r--r--source/blender/freestyle/intern/winged_edge/WEdge.h22
-rw-r--r--source/blender/freestyle/intern/winged_edge/WXEdge.h22
-rw-r--r--source/blender/gpencil_modifiers/CMakeLists.txt3
-rw-r--r--source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h3
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c34
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencil_util.h6
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c15
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c341
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c37
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilcolor.c11
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilhook.c14
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilinstance.c244
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c13
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c10
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c26
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c13
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilopacity.c10
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilsimplify.c11
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c14
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilsubdiv.c11
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilthick.c19
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpenciltime.c190
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpenciltint.c11
-rw-r--r--source/blender/gpu/CMakeLists.txt22
-rw-r--r--source/blender/gpu/GPU_batch_presets.h1
-rw-r--r--source/blender/gpu/GPU_buffers.h7
-rw-r--r--source/blender/gpu/GPU_context.h2
-rw-r--r--source/blender/gpu/GPU_draw.h1
-rw-r--r--source/blender/gpu/GPU_element.h1
-rw-r--r--source/blender/gpu/GPU_extensions.h9
-rw-r--r--source/blender/gpu/GPU_immediate.h50
-rw-r--r--source/blender/gpu/GPU_immediate_util.h7
-rw-r--r--source/blender/gpu/GPU_legacy_stubs.h6
-rw-r--r--source/blender/gpu/GPU_material.h8
-rw-r--r--source/blender/gpu/GPU_shader.h39
-rw-r--r--source/blender/gpu/GPU_shader_interface.h1
-rw-r--r--source/blender/gpu/GPU_state.h4
-rw-r--r--source/blender/gpu/GPU_texture.h2
-rw-r--r--source/blender/gpu/GPU_vertex_format.h4
-rw-r--r--source/blender/gpu/GPU_viewport.h2
-rw-r--r--source/blender/gpu/intern/gpu_attr_binding_private.h4
-rw-r--r--source/blender/gpu/intern/gpu_batch.c23
-rw-r--r--source/blender/gpu/intern/gpu_batch_presets.c28
-rw-r--r--source/blender/gpu/intern/gpu_batch_utils.c1
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c348
-rw-r--r--source/blender/gpu/intern/gpu_codegen.c339
-rw-r--r--source/blender/gpu/intern/gpu_codegen.h6
-rw-r--r--source/blender/gpu/intern/gpu_context_private.h2
-rw-r--r--source/blender/gpu/intern/gpu_draw.c390
-rw-r--r--source/blender/gpu/intern/gpu_element.c43
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c105
-rw-r--r--source/blender/gpu/intern/gpu_framebuffer.c60
-rw-r--r--source/blender/gpu/intern/gpu_immediate.c140
-rw-r--r--source/blender/gpu/intern/gpu_immediate_util.c84
-rw-r--r--source/blender/gpu/intern/gpu_material.c33
-rw-r--r--source/blender/gpu/intern/gpu_matrix.c2
-rw-r--r--source/blender/gpu/intern/gpu_select_private.h14
-rw-r--r--source/blender/gpu/intern/gpu_shader.c721
-rw-r--r--source/blender/gpu/intern/gpu_shader_interface.c1
-rw-r--r--source/blender/gpu/intern/gpu_state.c29
-rw-r--r--source/blender/gpu/intern/gpu_texture.c100
-rw-r--r--source/blender/gpu/intern/gpu_uniformbuffer.c2
-rw-r--r--source/blender/gpu/intern/gpu_vertex_buffer.c2
-rw-r--r--source/blender/gpu/intern/gpu_vertex_format.c170
-rw-r--r--source/blender/gpu/intern/gpu_viewport.c6
-rw-r--r--source/blender/gpu/shaders/gpu_shader_2D_edituvs_edges_vert.glsl29
-rw-r--r--source/blender/gpu/shaders/gpu_shader_2D_edituvs_facedots_vert.glsl17
-rw-r--r--source/blender/gpu/shaders/gpu_shader_2D_edituvs_faces_vert.glsl24
-rw-r--r--source/blender/gpu/shaders/gpu_shader_2D_edituvs_points_vert.glsl42
-rw-r--r--source/blender/gpu/shaders/gpu_shader_2D_edituvs_stretch_vert.glsl49
-rw-r--r--source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl12
-rw-r--r--source/blender/gpu/shaders/gpu_shader_fire_frag.glsl15
-rw-r--r--source/blender/gpu/shaders/gpu_shader_gpencil_stroke_vert.glsl3
-rw-r--r--source/blender/gpu/shaders/gpu_shader_image_alpha_color_frag.glsl2
-rw-r--r--source/blender/gpu/shaders/gpu_shader_instance_camera_vert.glsl2
-rw-r--r--source/blender/gpu/shaders/gpu_shader_instance_distance_line_vert.glsl2
-rw-r--r--source/blender/gpu/shaders/gpu_shader_instance_objectspace_variying_color_vert.glsl2
-rw-r--r--source/blender/gpu/shaders/gpu_shader_instance_screen_aligned_vert.glsl2
-rw-r--r--source/blender/gpu/shaders/gpu_shader_instance_screenspace_variying_color_vert.glsl2
-rw-r--r--source/blender/gpu/shaders/gpu_shader_instance_variying_size_variying_color_vert.glsl2
-rw-r--r--source/blender/gpu/shaders/gpu_shader_instance_variying_size_variying_id_vert.glsl2
-rw-r--r--source/blender/gpu/shaders/gpu_shader_instance_vert.glsl2
-rw-r--r--source/blender/gpu/shaders/gpu_shader_keyframe_diamond_frag.glsl108
-rw-r--r--source/blender/gpu/shaders/gpu_shader_keyframe_diamond_vert.glsl81
-rw-r--r--source/blender/gpu/shaders/gpu_shader_material.glsl413
-rw-r--r--source/blender/gpu/shaders/gpu_shader_point_varying_color_varying_outline_aa_frag.glsl30
-rw-r--r--source/blender/gpu/shaders/gpu_shader_smoke_frag.glsl47
-rw-r--r--source/blender/gpu/shaders/gpu_shader_smoke_vert.glsl15
-rw-r--r--source/blender/ikplugin/intern/ikplugin_api.c4
-rw-r--r--source/blender/ikplugin/intern/iksolver_plugin.c24
-rw-r--r--source/blender/ikplugin/intern/iksolver_plugin.h2
-rw-r--r--source/blender/imbuf/IMB_imbuf_types.h6
-rw-r--r--source/blender/imbuf/intern/allocimbuf.c8
-rw-r--r--source/blender/imbuf/intern/anim_movie.c2
-rw-r--r--source/blender/imbuf/intern/colormanagement.c2
-rw-r--r--source/blender/imbuf/intern/dds/BlockDXT.cpp4
-rw-r--r--source/blender/imbuf/intern/dds/ColorBlock.cpp42
-rw-r--r--source/blender/imbuf/intern/dds/ColorBlock.h4
-rw-r--r--source/blender/imbuf/intern/dds/DirectDrawSurface.cpp12
-rw-r--r--source/blender/imbuf/intern/dds/Image.cpp6
-rw-r--r--source/blender/imbuf/intern/dds/Image.h10
-rw-r--r--source/blender/imbuf/intern/filetype.c2
-rw-r--r--source/blender/imbuf/intern/imageprocess.c4
-rw-r--r--source/blender/imbuf/intern/iris.c19
-rw-r--r--source/blender/imbuf/intern/jp2.c1023
-rw-r--r--source/blender/imbuf/intern/moviecache.c2
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.cpp10
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.h1
-rw-r--r--source/blender/imbuf/intern/targa.c2
-rw-r--r--source/blender/imbuf/intern/thumbs.c8
-rw-r--r--source/blender/imbuf/intern/thumbs_blend.c1
-rw-r--r--source/blender/imbuf/intern/tiff.c8
-rw-r--r--source/blender/makesdna/DNA_ID.h8
-rw-r--r--source/blender/makesdna/DNA_action_types.h12
-rw-r--r--source/blender/makesdna/DNA_anim_types.h44
-rw-r--r--source/blender/makesdna/DNA_armature_types.h16
-rw-r--r--source/blender/makesdna/DNA_brush_types.h69
-rw-r--r--source/blender/makesdna/DNA_cloth_types.h27
-rw-r--r--source/blender/makesdna/DNA_color_types.h5
-rw-r--r--source/blender/makesdna/DNA_constraint_types.h43
-rw-r--r--source/blender/makesdna/DNA_curve_types.h9
-rw-r--r--source/blender/makesdna/DNA_dynamicpaint_types.h4
-rw-r--r--source/blender/makesdna/DNA_gpencil_modifier_types.h101
-rw-r--r--source/blender/makesdna/DNA_gpencil_types.h71
-rw-r--r--source/blender/makesdna/DNA_key_types.h11
-rw-r--r--source/blender/makesdna/DNA_layer_types.h2
-rw-r--r--source/blender/makesdna/DNA_mask_types.h2
-rw-r--r--source/blender/makesdna/DNA_material_types.h6
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h21
-rw-r--r--source/blender/makesdna/DNA_meshdata_types.h6
-rw-r--r--source/blender/makesdna/DNA_meta_types.h3
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h29
-rw-r--r--source/blender/makesdna/DNA_node_types.h2
-rw-r--r--source/blender/makesdna/DNA_object_enums.h2
-rw-r--r--source/blender/makesdna/DNA_object_fluidsim_types.h2
-rw-r--r--source/blender/makesdna/DNA_object_force_types.h10
-rw-r--r--source/blender/makesdna/DNA_object_types.h23
-rw-r--r--source/blender/makesdna/DNA_particle_types.h8
-rw-r--r--source/blender/makesdna/DNA_rigidbody_types.h2
-rw-r--r--source/blender/makesdna/DNA_scene_types.h85
-rw-r--r--source/blender/makesdna/DNA_screen_types.h9
-rw-r--r--source/blender/makesdna/DNA_sequence_types.h2
-rw-r--r--source/blender/makesdna/DNA_shader_fx_types.h68
-rw-r--r--source/blender/makesdna/DNA_smoke_types.h17
-rw-r--r--source/blender/makesdna/DNA_space_types.h13
-rw-r--r--source/blender/makesdna/DNA_tracking_types.h2
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h39
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h68
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h5
-rw-r--r--source/blender/makesdna/DNA_workspace_types.h11
-rw-r--r--source/blender/makesdna/intern/dna_genfile.c10
-rw-r--r--source/blender/makesdna/intern/makesdna.c4
-rw-r--r--source/blender/makesrna/RNA_access.h169
-rw-r--r--source/blender/makesrna/RNA_define.h6
-rw-r--r--source/blender/makesrna/RNA_enum_types.h4
-rw-r--r--source/blender/makesrna/RNA_types.h6
-rw-r--r--source/blender/makesrna/intern/makesrna.c5
-rw-r--r--source/blender/makesrna/intern/rna_ID.c105
-rw-r--r--source/blender/makesrna/intern/rna_access.c32
-rw-r--r--source/blender/makesrna/intern/rna_action.c28
-rw-r--r--source/blender/makesrna/intern/rna_animation.c55
-rw-r--r--source/blender/makesrna/intern/rna_armature.c151
-rw-r--r--source/blender/makesrna/intern/rna_brush.c351
-rw-r--r--source/blender/makesrna/intern/rna_camera.c22
-rw-r--r--source/blender/makesrna/intern/rna_cloth.c270
-rw-r--r--source/blender/makesrna/intern/rna_collection.c7
-rw-r--r--source/blender/makesrna/intern/rna_color.c7
-rw-r--r--source/blender/makesrna/intern/rna_constraint.c400
-rw-r--r--source/blender/makesrna/intern/rna_curve.c54
-rw-r--r--source/blender/makesrna/intern/rna_define.c13
-rw-r--r--source/blender/makesrna/intern/rna_depsgraph.c102
-rw-r--r--source/blender/makesrna/intern/rna_dynamicpaint.c2
-rw-r--r--source/blender/makesrna/intern/rna_fcurve.c37
-rw-r--r--source/blender/makesrna/intern/rna_gpencil.c212
-rw-r--r--source/blender/makesrna/intern/rna_gpencil_modifier.c437
-rw-r--r--source/blender/makesrna/intern/rna_image.c4
-rw-r--r--source/blender/makesrna/intern/rna_internal.h2
-rw-r--r--source/blender/makesrna/intern/rna_key.c2
-rw-r--r--source/blender/makesrna/intern/rna_lattice.c2
-rw-r--r--source/blender/makesrna/intern/rna_layer.c72
-rw-r--r--source/blender/makesrna/intern/rna_lightprobe.c4
-rw-r--r--source/blender/makesrna/intern/rna_linestyle.c2
-rw-r--r--source/blender/makesrna/intern/rna_main.c307
-rw-r--r--source/blender/makesrna/intern/rna_main_api.c54
-rw-r--r--source/blender/makesrna/intern/rna_mask.c9
-rw-r--r--source/blender/makesrna/intern/rna_material.c118
-rw-r--r--source/blender/makesrna/intern/rna_mesh.c1004
-rw-r--r--source/blender/makesrna/intern/rna_mesh_api.c17
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c65
-rw-r--r--source/blender/makesrna/intern/rna_movieclip.c10
-rw-r--r--source/blender/makesrna/intern/rna_nla.c34
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c51
-rw-r--r--source/blender/makesrna/intern/rna_object.c114
-rw-r--r--source/blender/makesrna/intern/rna_object_api.c94
-rw-r--r--source/blender/makesrna/intern/rna_object_force.c39
-rw-r--r--source/blender/makesrna/intern/rna_particle.c18
-rw-r--r--source/blender/makesrna/intern/rna_pose.c97
-rw-r--r--source/blender/makesrna/intern/rna_render.c21
-rw-r--r--source/blender/makesrna/intern/rna_rna.c9
-rw-r--r--source/blender/makesrna/intern/rna_scene.c329
-rw-r--r--source/blender/makesrna/intern/rna_scene_api.c6
-rw-r--r--source/blender/makesrna/intern/rna_screen.c24
-rw-r--r--source/blender/makesrna/intern/rna_sculpt_paint.c154
-rw-r--r--source/blender/makesrna/intern/rna_sequencer.c40
-rw-r--r--source/blender/makesrna/intern/rna_sequencer_api.c3
-rw-r--r--source/blender/makesrna/intern/rna_shader_fx.c178
-rw-r--r--source/blender/makesrna/intern/rna_smoke.c24
-rw-r--r--source/blender/makesrna/intern/rna_space.c491
-rw-r--r--source/blender/makesrna/intern/rna_texture.c19
-rw-r--r--source/blender/makesrna/intern/rna_ui.c62
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c47
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c127
-rw-r--r--source/blender/makesrna/intern/rna_wm.c2
-rw-r--r--source/blender/makesrna/intern/rna_wm_gizmo.c84
-rw-r--r--source/blender/makesrna/intern/rna_wm_gizmo_api.c6
-rw-r--r--source/blender/makesrna/intern/rna_workspace.c31
-rw-r--r--source/blender/makesrna/intern/rna_workspace_api.c80
-rw-r--r--source/blender/modifiers/intern/MOD_armature.c2
-rw-r--r--source/blender/modifiers/intern/MOD_array.c9
-rw-r--r--source/blender/modifiers/intern/MOD_bevel.c5
-rw-r--r--source/blender/modifiers/intern/MOD_boolean.c31
-rw-r--r--source/blender/modifiers/intern/MOD_build.c36
-rw-r--r--source/blender/modifiers/intern/MOD_cast.c2
-rw-r--r--source/blender/modifiers/intern/MOD_cloth.c2
-rw-r--r--source/blender/modifiers/intern/MOD_collision.c153
-rw-r--r--source/blender/modifiers/intern/MOD_correctivesmooth.c2
-rw-r--r--source/blender/modifiers/intern/MOD_curve.c5
-rw-r--r--source/blender/modifiers/intern/MOD_datatransfer.c6
-rw-r--r--source/blender/modifiers/intern/MOD_decimate.c13
-rw-r--r--source/blender/modifiers/intern/MOD_displace.c2
-rw-r--r--source/blender/modifiers/intern/MOD_dynamicpaint.c19
-rw-r--r--source/blender/modifiers/intern/MOD_edgesplit.c5
-rw-r--r--source/blender/modifiers/intern/MOD_explode.c365
-rw-r--r--source/blender/modifiers/intern/MOD_fluidsim.c2
-rw-r--r--source/blender/modifiers/intern/MOD_fluidsim_util.c11
-rw-r--r--source/blender/modifiers/intern/MOD_fluidsim_util.h2
-rw-r--r--source/blender/modifiers/intern/MOD_fracture.c4
-rw-r--r--source/blender/modifiers/intern/MOD_hook.c2
-rw-r--r--source/blender/modifiers/intern/MOD_laplaciandeform.c10
-rw-r--r--source/blender/modifiers/intern/MOD_laplaciansmooth.c8
-rw-r--r--source/blender/modifiers/intern/MOD_lattice.c2
-rw-r--r--source/blender/modifiers/intern/MOD_mask.c40
-rw-r--r--source/blender/modifiers/intern/MOD_meshcache.c7
-rw-r--r--source/blender/modifiers/intern/MOD_meshdeform.c13
-rw-r--r--source/blender/modifiers/intern/MOD_meshsequencecache.c9
-rw-r--r--source/blender/modifiers/intern/MOD_mirror.c4
-rw-r--r--source/blender/modifiers/intern/MOD_multires.c109
-rw-r--r--source/blender/modifiers/intern/MOD_none.c2
-rw-r--r--source/blender/modifiers/intern/MOD_normal_edit.c4
-rw-r--r--source/blender/modifiers/intern/MOD_ocean.c35
-rw-r--r--source/blender/modifiers/intern/MOD_particleinstance.c2
-rw-r--r--source/blender/modifiers/intern/MOD_particlesystem.c18
-rw-r--r--source/blender/modifiers/intern/MOD_remesh.c2
-rw-r--r--source/blender/modifiers/intern/MOD_screw.c12
-rw-r--r--source/blender/modifiers/intern/MOD_shapekey.c2
-rw-r--r--source/blender/modifiers/intern/MOD_shrinkwrap.c21
-rw-r--r--source/blender/modifiers/intern/MOD_simpledeform.c8
-rw-r--r--source/blender/modifiers/intern/MOD_skin.c18
-rw-r--r--source/blender/modifiers/intern/MOD_smoke.c20
-rw-r--r--source/blender/modifiers/intern/MOD_smooth.c4
-rw-r--r--source/blender/modifiers/intern/MOD_softbody.c2
-rw-r--r--source/blender/modifiers/intern/MOD_solidify.c4
-rw-r--r--source/blender/modifiers/intern/MOD_subsurf.c93
-rw-r--r--source/blender/modifiers/intern/MOD_surface.c2
-rw-r--r--source/blender/modifiers/intern/MOD_surfacedeform.c4
-rw-r--r--source/blender/modifiers/intern/MOD_triangulate.c13
-rw-r--r--source/blender/modifiers/intern/MOD_util.c4
-rw-r--r--source/blender/modifiers/intern/MOD_uvproject.c2
-rw-r--r--source/blender/modifiers/intern/MOD_uvwarp.c2
-rw-r--r--source/blender/modifiers/intern/MOD_warp.c4
-rw-r--r--source/blender/modifiers/intern/MOD_wave.c2
-rw-r--r--source/blender/modifiers/intern/MOD_weighted_normal.c12
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgedit.c2
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgmix.c2
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgproximity.c4
-rw-r--r--source/blender/modifiers/intern/MOD_wireframe.c5
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_image.c4
-rw-r--r--source/blender/nodes/shader/node_shader_tree.c89
-rw-r--r--source/blender/nodes/shader/node_shader_util.c2
-rw-r--r--source/blender/nodes/shader/node_shader_util.h2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.c3
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c3
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.c3
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_bump.c20
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_normal.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_brick.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_checker.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_coord.c17
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_environment.c39
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_gradient.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_image.c44
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_magic.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_musgrave.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_noise.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_voronoi.c6
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_wave.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_wireframe.c12
-rw-r--r--source/blender/nodes/texture/node_texture_tree.c2
-rw-r--r--source/blender/nodes/texture/node_texture_util.h1
-rw-r--r--source/blender/physics/intern/BPH_mass_spring.cpp187
-rw-r--r--source/blender/physics/intern/ConstrainedConjugateGradient.h2
-rw-r--r--source/blender/physics/intern/implicit.h10
-rw-r--r--source/blender/physics/intern/implicit_blender.c215
-rw-r--r--source/blender/physics/intern/implicit_eigen.cpp6
-rw-r--r--source/blender/python/BPY_extern.h12
-rw-r--r--source/blender/python/bmesh/bmesh_py_api.c20
-rw-r--r--source/blender/python/bmesh/bmesh_py_ops_call.c2
-rw-r--r--source/blender/python/bmesh/bmesh_py_types.c23
-rw-r--r--source/blender/python/bmesh/bmesh_py_types_customdata.c2
-rw-r--r--source/blender/python/bmesh/bmesh_py_types_meshdata.c11
-rw-r--r--source/blender/python/bmesh/bmesh_py_utils.c2
-rw-r--r--source/blender/python/generic/bgl.c34
-rw-r--r--source/blender/python/generic/blf_py_api.c2
-rw-r--r--source/blender/python/generic/bpy_internal_import.c2
-rw-r--r--source/blender/python/generic/idprop_py_api.c32
-rw-r--r--source/blender/python/generic/py_capi_utils.c132
-rw-r--r--source/blender/python/generic/py_capi_utils.h52
-rw-r--r--source/blender/python/gpu/CMakeLists.txt18
-rw-r--r--source/blender/python/gpu/gpu_py_api.c48
-rw-r--r--source/blender/python/gpu/gpu_py_api.h8
-rw-r--r--source/blender/python/gpu/gpu_py_batch.c368
-rw-r--r--source/blender/python/gpu/gpu_py_batch.h48
-rw-r--r--source/blender/python/gpu/gpu_py_element.c241
-rw-r--r--source/blender/python/gpu/gpu_py_element.h39
-rw-r--r--source/blender/python/gpu/gpu_py_matrix.c (renamed from source/blender/python/intern/gpu_py_matrix.c)235
-rw-r--r--source/blender/python/gpu/gpu_py_matrix.h (renamed from source/blender/python/intern/gpu.h)23
-rw-r--r--source/blender/python/gpu/gpu_py_offscreen.c344
-rw-r--r--source/blender/python/gpu/gpu_py_offscreen.h41
-rw-r--r--source/blender/python/gpu/gpu_py_primitive.c81
-rw-r--r--source/blender/python/gpu/gpu_py_primitive.h30
-rw-r--r--source/blender/python/gpu/gpu_py_select.c (renamed from source/blender/python/intern/gpu_py_select.c)29
-rw-r--r--source/blender/python/gpu/gpu_py_select.h30
-rw-r--r--source/blender/python/gpu/gpu_py_shader.c878
-rw-r--r--source/blender/python/gpu/gpu_py_shader.h41
-rw-r--r--source/blender/python/gpu/gpu_py_types.c791
-rw-r--r--source/blender/python/gpu/gpu_py_types.h44
-rw-r--r--source/blender/python/gpu/gpu_py_vertex_buffer.c352
-rw-r--r--source/blender/python/gpu/gpu_py_vertex_buffer.h42
-rw-r--r--source/blender/python/gpu/gpu_py_vertex_format.c242
-rw-r--r--source/blender/python/gpu/gpu_py_vertex_format.h41
-rw-r--r--source/blender/python/intern/CMakeLists.txt9
-rw-r--r--source/blender/python/intern/bpy_app.c41
-rw-r--r--source/blender/python/intern/bpy_app_handlers.c4
-rw-r--r--source/blender/python/intern/bpy_app_icons.c8
-rw-r--r--source/blender/python/intern/bpy_driver.c4
-rw-r--r--source/blender/python/intern/bpy_gizmo_wrap.c13
-rw-r--r--source/blender/python/intern/bpy_interface.c49
-rw-r--r--source/blender/python/intern/bpy_library_load.c6
-rw-r--r--source/blender/python/intern/bpy_library_write.c1
-rw-r--r--source/blender/python/intern/bpy_operator.c85
-rw-r--r--source/blender/python/intern/bpy_path.c2
-rw-r--r--source/blender/python/intern/bpy_props.c7
-rw-r--r--source/blender/python/intern/bpy_rna.c41
-rw-r--r--source/blender/python/intern/bpy_rna_anim.c4
-rw-r--r--source/blender/python/intern/bpy_rna_callback.c193
-rw-r--r--source/blender/python/intern/bpy_rna_gizmo.c2
-rw-r--r--source/blender/python/intern/bpy_rna_id_collection.c3
-rw-r--r--source/blender/python/intern/bpy_utils_units.c3
-rw-r--r--source/blender/python/intern/gpu.c107
-rw-r--r--source/blender/python/intern/gpu_offscreen.c414
-rw-r--r--source/blender/python/mathutils/mathutils.c11
-rw-r--r--source/blender/python/mathutils/mathutils.h2
-rw-r--r--source/blender/python/mathutils/mathutils_Color.c8
-rw-r--r--source/blender/python/mathutils/mathutils_Euler.c6
-rw-r--r--source/blender/python/mathutils/mathutils_Matrix.c6
-rw-r--r--source/blender/python/mathutils/mathutils_Quaternion.c4
-rw-r--r--source/blender/python/mathutils/mathutils_Vector.c22
-rw-r--r--source/blender/python/mathutils/mathutils_bvhtree.c34
-rw-r--r--source/blender/python/mathutils/mathutils_geometry.c2
-rw-r--r--source/blender/render/extern/include/RE_engine.h2
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h11
-rw-r--r--source/blender/render/extern/include/RE_render_ext.h1
-rw-r--r--source/blender/render/intern/include/render_types.h1
-rw-r--r--source/blender/render/intern/source/bake_api.c101
-rw-r--r--source/blender/render/intern/source/external_engine.c27
-rw-r--r--source/blender/render/intern/source/initrender.c19
-rw-r--r--source/blender/render/intern/source/pipeline.c31
-rw-r--r--source/blender/render/intern/source/render_result.c5
-rw-r--r--source/blender/render/intern/source/render_texture.c5
-rw-r--r--source/blender/shader_fx/CMakeLists.txt2
-rw-r--r--source/blender/shader_fx/FX_shader_types.h2
-rw-r--r--source/blender/shader_fx/intern/FX_shader_glow.c78
-rw-r--r--source/blender/shader_fx/intern/FX_shader_pixel.c1
-rw-r--r--source/blender/shader_fx/intern/FX_shader_rim.c4
-rw-r--r--source/blender/shader_fx/intern/FX_shader_shadow.c113
-rw-r--r--source/blender/shader_fx/intern/FX_shader_util.c2
-rw-r--r--source/blender/windowmanager/CMakeLists.txt2
-rw-r--r--source/blender/windowmanager/WM_api.h45
-rw-r--r--source/blender/windowmanager/WM_keymap.h46
-rw-r--r--source/blender/windowmanager/WM_toolsystem.h22
-rw-r--r--source/blender/windowmanager/WM_types.h6
-rw-r--r--source/blender/windowmanager/gizmo/WM_gizmo_api.h21
-rw-r--r--source/blender/windowmanager/gizmo/WM_gizmo_types.h61
-rw-r--r--source/blender/windowmanager/gizmo/intern/wm_gizmo.c18
-rw-r--r--source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c78
-rw-r--r--source/blender/windowmanager/gizmo/intern/wm_gizmo_group_type.c10
-rw-r--r--source/blender/windowmanager/gizmo/intern/wm_gizmo_intern.h2
-rw-r--r--source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c27
-rw-r--r--source/blender/windowmanager/gizmo/intern/wm_gizmo_target_props.c2
-rw-r--r--source/blender/windowmanager/gizmo/wm_gizmo_fn.h2
-rw-r--r--source/blender/windowmanager/intern/wm.c4
-rw-r--r--source/blender/windowmanager/intern/wm_cursors.c2
-rw-r--r--source/blender/windowmanager/intern/wm_dragdrop.c6
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c45
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c107
-rw-r--r--source/blender/windowmanager/intern/wm_files.c257
-rw-r--r--source/blender/windowmanager/intern/wm_files_link.c19
-rw-r--r--source/blender/windowmanager/intern/wm_gesture_ops.c18
-rw-r--r--source/blender/windowmanager/intern/wm_init_exit.c9
-rw-r--r--source/blender/windowmanager/intern/wm_jobs.c8
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c308
-rw-r--r--source/blender/windowmanager/intern/wm_keymap_utils.c364
-rw-r--r--source/blender/windowmanager/intern/wm_menu_type.c1
-rw-r--r--source/blender/windowmanager/intern/wm_operator_props.c25
-rw-r--r--source/blender/windowmanager/intern/wm_operator_type.c1
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c395
-rw-r--r--source/blender/windowmanager/intern/wm_stereo.c26
-rw-r--r--source/blender/windowmanager/intern/wm_toolsystem.c273
-rw-r--r--source/blender/windowmanager/intern/wm_tooltip.c45
-rw-r--r--source/blender/windowmanager/intern/wm_uilist_type.c1
-rw-r--r--source/blender/windowmanager/intern/wm_window.c30
-rw-r--r--source/blender/windowmanager/wm.h3
-rw-r--r--source/blender/windowmanager/wm_event_system.h2
-rw-r--r--source/blender/windowmanager/wm_event_types.h7
-rw-r--r--source/blender/windowmanager/wm_window.h2
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c772
-rw-r--r--source/creator/CMakeLists.txt18
-rw-r--r--source/creator/creator.c2
-rw-r--r--source/creator/creator_args.c39
m---------source/tools0
-rw-r--r--tests/gtests/alembic/abc_export_test.cc4
-rw-r--r--tests/gtests/alembic/abc_matrix_test.cc2
-rw-r--r--tests/gtests/blenlib/BLI_expr_pylike_eval_test.cc310
-rw-r--r--tests/gtests/blenlib/BLI_ghash_performance_test.cc40
-rw-r--r--tests/gtests/blenlib/BLI_ghash_test.cc28
-rw-r--r--tests/gtests/blenlib/BLI_heap_simple_test.cc117
-rw-r--r--tests/gtests/blenlib/BLI_heap_test.cc25
-rw-r--r--tests/gtests/blenlib/BLI_kdopbvh_test.cc24
-rw-r--r--tests/gtests/blenlib/BLI_linklist_lockfree_test.cc4
-rw-r--r--tests/gtests/blenlib/CMakeLists.txt2
-rw-r--r--tests/python/CMakeLists.txt2
-rw-r--r--tests/python/bl_keymap_completeness.py6
-rw-r--r--tests/python/bl_mesh_modifiers.py4
-rw-r--r--tests/python/bl_run_operators.py2
-rw-r--r--tests/python/bl_test.py2
-rwxr-xr-xtests/python/modules/render_report.py11
-rwxr-xr-xtests/python/opengl_draw_tests.py3
-rw-r--r--tests/python/view_layer/test_evaluation_selectability_a.py2
-rw-r--r--tests/python/view_layer/test_evaluation_selectability_b.py2
-rw-r--r--tests/python/view_layer/test_evaluation_selectability_c.py2
-rw-r--r--tests/python/view_layer/test_evaluation_selectability_d.py2
-rw-r--r--tests/python/view_layer/test_evaluation_selectability_e.py2
-rw-r--r--tests/python/view_layer/test_evaluation_selectability_f.py2
-rw-r--r--tests/python/view_layer/test_group_e.py4
-rw-r--r--tests/python/view_layer/test_make_single_user.py2
-rw-r--r--tests/python/view_layer/test_object_copy.py2
-rw-r--r--tests/python/view_layer/test_scene_copy_e.py2
-rw-r--r--tests/python/view_layer/view_layer_common.py2
3472 files changed, 82807 insertions, 172895 deletions
diff --git a/.gitmodules b/.gitmodules
index 02875320630..73ee23b2e1d 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -6,7 +6,7 @@
[submodule "release/scripts/addons_contrib"]
path = release/scripts/addons_contrib
url = ../blender-addons-contrib.git
- branch = master
+ branch = blender2.8
ignore = all
[submodule "release/datafiles/locale"]
path = release/datafiles/locale
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0379dff2db8..399181838c8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -166,7 +166,6 @@ option_defaults_init(
_init_SDL
_init_FFTW3
_init_OPENSUBDIV
- _init_SYSTEM_OPENJPG
)
# customize...
@@ -183,13 +182,11 @@ if(UNIX AND NOT APPLE)
set(_init_SDL OFF)
set(_init_FFTW3 OFF)
set(_init_OPENSUBDIV OFF)
- set(_init_SYSTEM_OPENJPG OFF)
elseif(WIN32)
set(_init_JACK OFF)
elseif(APPLE)
set(_init_JACK OFF)
set(_init_OPENSUBDIV OFF)
- set(_init_SYSTEM_OPENJPG OFF)
endif()
@@ -209,10 +206,10 @@ option(WITH_INTERNATIONAL "Enable I18N (International fonts and text)" ON)
option(WITH_PYTHON "Enable Embedded Python API (only disable for development)" ON)
option(WITH_PYTHON_SECURITY "Disables execution of scripts within blend files by default" ON)
-mark_as_advanced(WITH_PYTHON) # dont want people disabling this unless they really know what they are doing.
+mark_as_advanced(WITH_PYTHON) # don't want people disabling this unless they really know what they are doing.
mark_as_advanced(WITH_PYTHON_SECURITY) # some distributions see this as a security issue, rather than have them patch it, make a build option.
-option(WITH_PYTHON_SAFETY "Enable internal API error checking to track invalid data to prevent crash on access (at the expense of some effeciency, only enable for development)." OFF)
+option(WITH_PYTHON_SAFETY "Enable internal API error checking to track invalid data to prevent crash on access (at the expense of some efficiency, only enable for development)." OFF)
mark_as_advanced(WITH_PYTHON_SAFETY)
option(WITH_PYTHON_MODULE "Enable building as a python module which runs without a user interface, like running regular blender in background mode (experimental, only enable for development), installs to PYTHON_SITE_PACKAGES (or CMAKE_INSTALL_PREFIX if WITH_INSTALL_PORTABLE is enabled)." OFF)
if(APPLE)
@@ -224,8 +221,8 @@ if(${CMAKE_VERSION} VERSION_LESS 2.8.8)
# add_library OBJECT arg unsupported
set(WITH_BUILDINFO OFF)
endif()
-set(BUILDINFO_OVERRIDE_DATE "" CACHE STRING "Use instead of the current date for reproducable builds (empty string disables this option)")
-set(BUILDINFO_OVERRIDE_TIME "" CACHE STRING "Use instead of the current time for reproducable builds (empty string disables this option)")
+set(BUILDINFO_OVERRIDE_DATE "" CACHE STRING "Use instead of the current date for reproducible builds (empty string disables this option)")
+set(BUILDINFO_OVERRIDE_TIME "" CACHE STRING "Use instead of the current time for reproducible builds (empty string disables this option)")
set(CPACK_OVERRIDE_PACKAGENAME "" CACHE STRING "Use instead of the standard packagename (empty string disables this option)")
mark_as_advanced(CPACK_OVERRIDE_PACKAGENAME)
mark_as_advanced(BUILDINFO_OVERRIDE_DATE)
@@ -300,9 +297,6 @@ else()
endif()
-# (unix defaults to System OpenJPEG On)
-option(WITH_SYSTEM_OPENJPEG "Use the operating systems OpenJPEG library" ${_init_SYSTEM_OPENJPG})
-
if(UNIX AND NOT APPLE)
option(WITH_SYSTEM_EIGEN3 "Use the systems Eigen3 library" OFF)
endif()
@@ -386,7 +380,9 @@ if(UNIX AND NOT APPLE)
endif()
option(WITH_PYTHON_INSTALL "Copy system python into the blender install folder" ON)
-if(WITH_PYTHON_INSTALL OR (WITH_AUDASPACE AND NOT WITH_SYSTEM_AUDASPACE))
+if(WIN32 OR APPLE)
+ # Windows and macOS have this bundled with Python libraries.
+elseif(WITH_PYTHON_INSTALL OR (WITH_AUDASPACE AND NOT WITH_SYSTEM_AUDASPACE))
set(PYTHON_NUMPY_PATH "" CACHE PATH "Path to python site-packages or dist-packages containing 'numpy' module")
mark_as_advanced(PYTHON_NUMPY_PATH)
set(PYTHON_NUMPY_INCLUDE_DIRS ${PYTHON_NUMPY_PATH}/numpy/core/include CACHE PATH "Path to the include directory of the numpy module")
@@ -410,6 +406,7 @@ option(WITH_CYCLES "Enable Cycles Render Engine" ON)
option(WITH_CYCLES_STANDALONE "Build Cycles standalone application" OFF)
option(WITH_CYCLES_STANDALONE_GUI "Build Cycles standalone with GUI" OFF)
option(WITH_CYCLES_OSL "Build Cycles with OSL support" ${_init_CYCLES_OSL})
+option(WITH_CYCLES_EMBREE "Build Cycles with Embree support" OFF)
option(WITH_CYCLES_OPENSUBDIV "Build Cycles with OpenSubdiv support" ${_init_CYCLES_OPENSUBDIV})
option(WITH_CYCLES_CUDA_BINARIES "Build Cycles CUDA binaries" OFF)
option(WITH_CYCLES_CUBIN_COMPILER "Build cubins with nvrtc based compiler instead of nvcc" OFF)
@@ -572,6 +569,9 @@ if(WIN32)
option(WINDOWS_USE_VISUAL_STUDIO_FOLDERS "Organize the visual studio project according to source folders." ON)
mark_as_advanced(WINDOWS_USE_VISUAL_STUDIO_FOLDERS)
+
+ option(WINDOWS_PYTHON_DEBUG "Include the files needed for debugging python scripts with visual studio 2017+." OFF)
+ mark_as_advanced(WINDOWS_PYTHON_DEBUG)
endif()
# avoid using again
@@ -843,7 +843,7 @@ if(WITH_X11)
endif()
if(WITH_X11_XF86VMODE)
- # XXX, why dont cmake make this available?
+ # XXX, why doesn't cmake make this available?
find_library(X11_Xxf86vmode_LIB Xxf86vm ${X11_LIB_SEARCH_PATH})
mark_as_advanced(X11_Xxf86vmode_LIB)
if(X11_Xxf86vmode_LIB)
@@ -940,7 +940,7 @@ endif()
if(SUPPORT_SSE2_BUILD)
set(PLATFORM_CFLAGS " ${PLATFORM_CFLAGS} ${COMPILER_SSE2_FLAG}")
add_definitions(-D__SSE2__)
- if(NOT SUPPORT_SSE_BUILD) # dont double up
+ if(NOT SUPPORT_SSE_BUILD) # don't double up
add_definitions(-D__MMX__)
endif()
endif()
@@ -953,7 +953,7 @@ if(MSVC)
# OSX-Note: as we do cross-compiling with specific set architecture,
# endianess-detection and auto-setting is counterproductive
-# so we just set endianess according CMAKE_OSX_ARCHITECTURES
+# so we just set endianness according CMAKE_OSX_ARCHITECTURES
elseif(CMAKE_OSX_ARCHITECTURES MATCHES i386 OR CMAKE_OSX_ARCHITECTURES MATCHES x86_64)
add_definitions(-D__LITTLE_ENDIAN__)
@@ -971,16 +971,11 @@ else()
unset(_SYSTEM_BIG_ENDIAN)
endif()
if(WITH_IMAGE_OPENJPEG)
- if(WITH_SYSTEM_OPENJPEG)
- # dealt with above
- set(OPENJPEG_DEFINES "")
- else()
- set(OPENJPEG_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/extern/libopenjpeg")
- set(OPENJPEG_DEFINES "-DOPJ_STATIC")
- endif()
# Special handling of Windows platform where openjpeg is always static.
if(WIN32)
set(OPENJPEG_DEFINES "-DOPJ_STATIC")
+ else()
+ set(OPENJPEG_DEFINES "")
endif()
endif()
@@ -1464,6 +1459,7 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC")
"/wd4305" # truncation from 'type1' to 'type2'
"/wd4800" # forcing value to bool 'true' or 'false'
"/wd4828" # The file contains a character that is illegal
+ "/wd4996" # identifier was declared deprecated
# errors:
"/we4013" # 'function' undefined; assuming extern returning int
"/we4133" # incompatible pointer types
@@ -1489,14 +1485,14 @@ if(WITH_PYTHON)
)
endif()
- if(WIN32)
- # pass, we have this in an archive to extract
+ if(WIN32 OR APPLE)
+ # Windows and macOS have this bundled with Python libraries.
elseif((WITH_PYTHON_INSTALL AND WITH_PYTHON_INSTALL_NUMPY) OR (WITH_AUDASPACE AND NOT WITH_SYSTEM_AUDASPACE))
if(("${PYTHON_NUMPY_PATH}" STREQUAL "") OR (${PYTHON_NUMPY_PATH} MATCHES NOTFOUND))
find_python_package(numpy)
unset(PYTHON_NUMPY_INCLUDE_DIRS CACHE)
set(PYTHON_NUMPY_INCLUDE_DIRS ${PYTHON_NUMPY_PATH}/numpy/core/include CACHE PATH "Path to the include directory of the numpy module")
- mark_as_advanced(PYTHON_NUMPY_INCLUDE_DIRS)
+ mark_as_advanced(PYTHON_NUMPY_INCLUDE_DIRS)
endif()
endif()
@@ -1527,12 +1523,8 @@ if(
(CMAKE_C_COMPILER_ID MATCHES "Clang" AND (NOT MSVC)) OR
(CMAKE_C_COMPILER_ID MATCHES "Intel")
)
- # Use C99 + GNU extensions, works with GCC, Clang, ICC
- if(WITH_C11)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
- else()
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
- endif()
+ # Use C11 + GNU extensions, works with GCC, Clang, ICC
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
endif()
# Include warnings first, so its possible to disable them with user defined flags
@@ -1680,7 +1672,6 @@ if(FIRST_RUN)
info_cfg_option(WITH_MEM_JEMALLOC)
info_cfg_option(WITH_MEM_VALGRIND)
info_cfg_option(WITH_SYSTEM_GLEW)
- info_cfg_option(WITH_SYSTEM_OPENJPEG)
info_cfg_text("Image Formats:")
info_cfg_option(WITH_OPENIMAGEIO)
diff --git a/GNUmakefile b/GNUmakefile
index 4b90e07cda6..f692daed600 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -45,12 +45,18 @@ endif
# Dependencies DIR's
DEPS_SOURCE_DIR:=$(BLENDER_DIR)/build_files/build_environment
-DEPS_BUILD_DIR:=$(BUILD_DIR)/deps
-DEPS_INSTALL_DIR:=$(shell dirname "$(BLENDER_DIR)")/lib/$(OS_NCASE)
-ifneq ($(OS_NCASE),darwin)
- # Add processor type to directory name
- DEPS_INSTALL_DIR:=$(DEPS_INSTALL_DIR)_$(shell uname -p)
+ifndef DEPS_BUILD_DIR
+ DEPS_BUILD_DIR:=$(BUILD_DIR)/deps
+endif
+
+ifndef DEPS_INSTALL_DIR
+ DEPS_INSTALL_DIR:=$(shell dirname "$(BLENDER_DIR)")/lib/$(OS_NCASE)
+
+ ifneq ($(OS_NCASE),darwin)
+ # Add processor type to directory name
+ DEPS_INSTALL_DIR:=$(DEPS_INSTALL_DIR)_$(shell uname -p)
+ endif
endif
# Allow to use alternative binary (pypy3, etc)
@@ -452,8 +458,9 @@ update: .FORCE
fi
git pull --rebase
git submodule update --init --recursive
- git submodule foreach git checkout master
- git submodule foreach git pull --rebase origin master
+ # Use blender2.8 branch for submodules that have it.
+ git submodule foreach "git checkout blender2.8 || git checkout master"
+ git submodule foreach git pull --rebase origin
# -----------------------------------------------------------------------------
@@ -462,6 +469,7 @@ update: .FORCE
# Simple version of ./doc/python_api/sphinx_doc_gen.sh with no PDF generation.
doc_py: .FORCE
+ ASAN_OPTIONS=halt_on_error=0 \
$(BLENDER_BIN) --background -noaudio --factory-startup \
--python doc/python_api/sphinx_doc_gen.py
cd doc/python_api ; sphinx-build -b html sphinx-in sphinx-out
@@ -480,15 +488,7 @@ doc_man: .FORCE
$(PYTHON) doc/manpage/blender.1.py $(BLENDER_BIN) blender.1
help_features: .FORCE
- @$(PYTHON) -c \
- "import re; \
- print('\n'.join([ \
- w for l in open('"$(BLENDER_DIR)"/CMakeLists.txt', 'r').readlines() \
- if not l.lstrip().startswith('#') \
- for w in (re.sub(\
- r'.*\boption\s*\(\s*(WITH_[a-zA-Z0-9_]+)\s+(\".*\")\s*.*', r'\g<1> - \g<2>', l).strip('() \n'),) \
- if w.startswith('WITH_')]))" | uniq
-
+ @$(PYTHON) "$(BLENDER_DIR)/build_files/cmake/cmake_print_build_options.py" $(BLENDER_DIR)"/CMakeLists.txt"
clean: .FORCE
$(MAKE) -C "$(BUILD_DIR)" clean
diff --git a/build_files/build_environment/CMakeLists.txt b/build_files/build_environment/CMakeLists.txt
index 5270a2e2b3d..8c1d38c0635 100644
--- a/build_files/build_environment/CMakeLists.txt
+++ b/build_files/build_environment/CMakeLists.txt
@@ -19,10 +19,10 @@
####################################################################################################
#
# This is a build system used by platform maintainers to build library dependencies on
-# Windows and macOS. There is some support for Linux as well, but not ready for releases.
+# Windows, macOS and Linux.
#
-# Windows and macOS users should download the precompiled libraries in lib/, Linux users
-# should run install_deps.sh for building dependencies.
+# For users building Blender, we recommend using the precompiled libraries from lib/ on
+# Windows and macOS, and install_deps.sh on Linux.
#
# WINDOWS USAGE:
# Don't call this cmake file your self, use build_deps.cmd
@@ -30,7 +30,7 @@
# build_deps 2015 x64 / build_deps 2015 x86
#
# MAC OS X USAGE:
-# Install with homebrew: brew install autoconf automake libtool yasm openssl xz
+# Install with homebrew: brew install autoconf automake libtool yasm nasm
# Run "make deps" from main Blender directory
#
# LINUX USAGE:
@@ -96,14 +96,20 @@ include(cmake/pugixml.cmake)
if(WITH_WEBP)
include(cmake/webp.cmake)
endif()
+
+if(WITH_EMBREE)
+ include(cmake/embree.cmake)
+endif()
+
if(WIN32)
- #hmd_branch_deps
+ # HMD branch deps
include(cmake/hidapi.cmake)
- #ocio deps
+ # OCIO deps
include(cmake/tinyxml.cmake)
include(cmake/yamlcpp.cmake)
- #lcms is an ocio dep, but only if you build the apps, leaving it here for convenience
+ # LCMS is an OCIO dep, but only if you build the apps, leaving it here for convenience
#include(cmake/lcms.cmake)
+
endif()
if(NOT WIN32 OR ENABLE_MINGW64)
@@ -128,16 +134,16 @@ if(NOT WIN32 OR ENABLE_MINGW64)
endif()
if(UNIX)
include(cmake/flac.cmake)
+ include(cmake/xml2.cmake)
if(NOT APPLE)
include(cmake/spnav.cmake)
include(cmake/jemalloc.cmake)
- include(cmake/xml2.cmake)
endif()
endif()
endif()
endif()
-if(UNIX AND NOT APPLE)
+if(UNIX)
include(cmake/bzip2.cmake)
include(cmake/ffi.cmake)
include(cmake/lzma.cmake)
diff --git a/build_files/build_environment/cmake/embree.cmake b/build_files/build_environment/cmake/embree.cmake
new file mode 100644
index 00000000000..8c523e25f0c
--- /dev/null
+++ b/build_files/build_environment/cmake/embree.cmake
@@ -0,0 +1,69 @@
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ***** END GPL LICENSE BLOCK *****
+
+# Note the utility apps may use png/tiff/gif system libraries, but the
+# library itself does not depend on them, so should give no problems.
+
+set(EMBREE_EXTRA_ARGS
+ -DEMBREE_ISPC_SUPPORT=OFF
+ -DEMBREE_TUTORIALS=OFF
+ -DEMBREE_STATIC_LIB=ON
+ -DEMBREE_RAY_MASK=ON
+ -DEMBREE_FILTER_FUNCTION=ON
+ -DEMBREE_BACKFACE_CULLING=OFF
+ -DEMBREE_TASKING_SYSTEM=INTERNAL
+ -DEMBREE_MAX_ISA=AVX2
+)
+
+if(WIN32)
+ set(EMBREE_BUILD_DIR ${BUILD_MODE}/)
+else()
+ set(EMBREE_BUILD_DIR)
+endif()
+
+ExternalProject_Add(external_embree
+ URL ${EMBREE_URI}
+ DOWNLOAD_DIR ${DOWNLOAD_DIR}
+ URL_HASH MD5=${EMBREE_HASH}
+ PREFIX ${BUILD_DIR}/embree
+ CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/embree ${DEFAULT_CMAKE_FLAGS} ${EMBREE_EXTRA_ARGS}
+ INSTALL_DIR ${LIBDIR}/embree
+)
+if(WIN32)
+
+ if(BUILD_MODE STREQUAL Release)
+ ExternalProject_Add_Step(external_embree after_install
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/embree ${HARVEST_TARGET}/embree
+ DEPENDEES install
+ )
+ else()
+ ExternalProject_Add_Step(external_embree after_install
+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/lib/embree3.lib ${HARVEST_TARGET}/embree/lib/embree3_d.lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/lib/embree_avx.lib ${HARVEST_TARGET}/embree/lib/embree_avx_d.lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/lib/embree_avx2.lib ${HARVEST_TARGET}/embree/lib/embree_avx2_d.lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/lib/embree_sse42.lib ${HARVEST_TARGET}/embree/lib/embree_sse42_d.lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/lib/lexers.lib ${HARVEST_TARGET}/embree/lib/lexers_d.lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/lib/math.lib ${HARVEST_TARGET}/embree/lib/math_d.lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/lib/simd.lib ${HARVEST_TARGET}/embree/lib/simd_d.lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/lib/sys.lib ${HARVEST_TARGET}/embree/lib/sys_d.lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/embree/lib/tasking.lib ${HARVEST_TARGET}/embree/lib/tasking_d.lib
+ DEPENDEES install
+ )
+ endif()
+
+endif()
diff --git a/build_files/build_environment/cmake/ffi.cmake b/build_files/build_environment/cmake/ffi.cmake
index 18531fd7906..bc0932022cb 100644
--- a/build_files/build_environment/cmake/ffi.cmake
+++ b/build_files/build_environment/cmake/ffi.cmake
@@ -25,8 +25,10 @@ ExternalProject_Add(external_ffi
--enable-shared=no
--enable-static=yes
--with-pic
+ --libdir=${LIBDIR}/ffi/lib/
BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/ffi/src/external_ffi/ && make -j${MAKE_THREADS}
INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/ffi/src/external_ffi/ && make install
+ PATCH_COMMAND ${PATCH_CMD} -p 0 -d ${BUILD_DIR}/ffi/src/external_ffi < ${PATCH_DIR}/ffi.diff
INSTALL_DIR ${LIBDIR}/ffi
)
diff --git a/build_files/build_environment/cmake/ffmpeg.cmake b/build_files/build_environment/cmake/ffmpeg.cmake
index 5c8347cd40e..2a8e3fd5d33 100644
--- a/build_files/build_environment/cmake/ffmpeg.cmake
+++ b/build_files/build_environment/cmake/ffmpeg.cmake
@@ -112,6 +112,7 @@ ExternalProject_Add(external_ffmpeg
--disable-indev=alsa
--disable-outdev=alsa
--disable-crystalhd
+ --disable-sndio
BUILD_COMMAND ${CONFIGURE_ENV_NO_PERL} && cd ${BUILD_DIR}/ffmpeg/src/external_ffmpeg/ && make -j${MAKE_THREADS}
INSTALL_COMMAND ${CONFIGURE_ENV_NO_PERL} && cd ${BUILD_DIR}/ffmpeg/src/external_ffmpeg/ && make install
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/ffmpeg ${DEFAULT_CMAKE_FLAGS}
diff --git a/build_files/build_environment/cmake/harvest.cmake b/build_files/build_environment/cmake/harvest.cmake
index d47a5e65d3c..f2e9c2fa8db 100644
--- a/build_files/build_environment/cmake/harvest.cmake
+++ b/build_files/build_environment/cmake/harvest.cmake
@@ -57,7 +57,7 @@ if(BUILD_MODE STREQUAL Release)
# hidapi
${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/hidapi/ ${HARVEST_TARGET}/hidapi/ &&
# webp, straight up copy
- ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/webp ${HARVEST_TARGET}/webp
+ ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/webp ${HARVEST_TARGET}/webp &&
DEPENDS
)
endif()
@@ -110,6 +110,7 @@ endfunction()
harvest(alembic/include alembic/include "*.h")
harvest(alembic/lib/libAlembic.a alembic/lib/libAlembic.a)
+harvest(alembic/bin alembic/bin "*")
harvest(boost/include boost/include "*")
harvest(boost/lib boost/lib "*.a")
harvest(ffmpeg/include ffmpeg/include "*.h")
@@ -190,5 +191,7 @@ harvest(vpx/lib ffmpeg/lib "*.a")
harvest(webp/lib ffmpeg/lib "*.a")
harvest(x264/lib ffmpeg/lib "*.a")
harvest(xvidcore/lib ffmpeg/lib "*.a")
+harvest(embree/include embree/include "*.h")
+harvest(embree/lib embree/lib "*.a")
endif()
diff --git a/build_files/build_environment/cmake/opencollada.cmake b/build_files/build_environment/cmake/opencollada.cmake
index 2f5360ba958..ec3dcde1607 100644
--- a/build_files/build_environment/cmake/opencollada.cmake
+++ b/build_files/build_environment/cmake/opencollada.cmake
@@ -16,7 +16,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-if(UNIX AND NOT APPLE)
+if(UNIX)
set(OPENCOLLADA_EXTRA_ARGS
-DLIBXML2_INCLUDE_DIR=${LIBDIR}/xml2/include/libxml2
-DLIBXML2_LIBRARIES=${LIBDIR}/xml2/lib/libxml2.a)
@@ -32,7 +32,7 @@ ExternalProject_Add(external_opencollada
INSTALL_DIR ${LIBDIR}/opencollada
)
-if(UNIX AND NOT APPLE)
+if(UNIX)
add_dependencies(
external_opencollada
external_xml2
@@ -48,7 +48,7 @@ if(WIN32)
endif()
if(BUILD_MODE STREQUAL Debug)
ExternalProject_Add_Step(external_opencollada after_install
- COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencollada/lib/opencollada/buffer.lib ${HARVEST_TARGET}/opencollada/lib/opencollada/buffer_d.lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencollada/lib/opencollada/buffer.lib ${HARVEST_TARGET}/opencollada/lib/opencollada/buffer_d.lib
COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencollada/lib/opencollada/ftoa.lib ${HARVEST_TARGET}/opencollada/lib/opencollada/ftoa_d.lib
COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencollada/lib/opencollada/GeneratedSaxParser.lib ${HARVEST_TARGET}/opencollada/lib/opencollada/GeneratedSaxParser_d.lib
COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencollada/lib/opencollada/MathMLSolver.lib ${HARVEST_TARGET}/opencollada/lib/opencollada/MathMLSolver_d.lib
@@ -62,4 +62,4 @@ if(WIN32)
DEPENDEES install
)
endif()
-endif() \ No newline at end of file
+endif()
diff --git a/build_files/build_environment/cmake/openvdb.cmake b/build_files/build_environment/cmake/openvdb.cmake
index a550ed5decb..ccdc00ee0d8 100644
--- a/build_files/build_environment/cmake/openvdb.cmake
+++ b/build_files/build_environment/cmake/openvdb.cmake
@@ -29,9 +29,7 @@ set(OPENVDB_EXTRA_ARGS
-DBoost_NO_SYSTEM_PATHS=ON
-DZLIB_LIBRARY=${LIBDIR}/zlib/lib/${ZLIB_LIBRARY}
-DZLIB_INCLUDE_DIR=${LIBDIR}/zlib/include/
- -DWITH_BLOSC=ON
-DBLOSC_INCLUDE_DIR=${LIBDIR}/blosc/include/
- -DBLOSC_LIBRARY=${LIBDIR}/blosc/lib/libblosc${BLOSC_POST}${LIBEXT}
-DBLOSC_blosc_LIBRARY=${LIBDIR}/blosc/lib/libblosc${BLOSC_POST}${LIBEXT}
-DOPENVDB_ENABLE_3_ABI_COMPATIBLE=OFF
-DOPENVDB_BUILD_UNITTESTS=Off
@@ -48,14 +46,13 @@ set(OPENVDB_EXTRA_ARGS
-DOpenexr_ILMIMF_LIBRARY=${LIBDIR}/openexr/lib/${LIBPREFIX}IlmImf${OPENEXR_VERSION_POSTFIX}${LIBEXT}
-DTBB_LIBRARYDIR=${LIBDIR}/tbb/lib
-DTbb_TBB_LIBRARY=${LIBDIR}/tbb/lib/${LIBPREFIX}tbb_static${LIBEXT}
- -DTBB_LIBRARY_DIR=${LIBDIR}/tbb/lib
-DTBB_LIBRARY_PATH=${LIBDIR}/tbb/lib
)
if(WIN32)
- #Namespaces seem to be buggy and cause linker erorrs due to things not
- #being in the correct namespace
- #needs to link pthreads due to it being a blosc dependency
+ # Namespaces seem to be buggy and cause linker errors due to things not
+ # being in the correct namespace
+ # needs to link pthreads due to it being a blosc dependency
set(OPENVDB_EXTRA_ARGS ${OPENVDB_EXTRA_ARGS}
-DOPENEXR_NAMESPACE_VERSIONING=OFF
-DEXTRA_LIBS:FILEPATH=${LIBDIR}/pthreads/lib/pthreadVC2.lib
diff --git a/build_files/build_environment/cmake/options.cmake b/build_files/build_environment/cmake/options.cmake
index 7bf971208ae..20e9750bed6 100644
--- a/build_files/build_environment/cmake/options.cmake
+++ b/build_files/build_environment/cmake/options.cmake
@@ -20,6 +20,7 @@ if(WIN32)
option(ENABLE_MINGW64 "Enable building of ffmpeg/iconv/libsndfile/lapack/fftw3 by installing mingw64" ON)
endif()
option(WITH_WEBP "Enable building of oiio with webp support" OFF)
+option(WITH_EMBREE "Enable building of Embree" OFF)
set(MAKE_THREADS 1 CACHE STRING "Number of threads to run make with")
if(NOT BUILD_MODE)
@@ -143,7 +144,7 @@ else()
set(PLATFORM_CXXFLAGS "-std=c++11 -fPIC")
set(PLATFORM_LDFLAGS)
set(PLATFORM_BUILD_TARGET)
- set(PLATFORM_CMAKE_FLAGS)
+ set(PLATFORM_CMAKE_FLAGS -DCMAKE_INSTALL_LIBDIR=lib)
endif()
if(WITH_OPTIMIZED_DEBUG)
diff --git a/build_files/build_environment/cmake/osl.cmake b/build_files/build_environment/cmake/osl.cmake
index eaf6a62d18a..795892f29e2 100644
--- a/build_files/build_environment/cmake/osl.cmake
+++ b/build_files/build_environment/cmake/osl.cmake
@@ -77,10 +77,17 @@ set(OSL_EXTRA_ARGS
)
if(WIN32)
-set(OSL_EXTRA_ARGS
- ${OSL_EXTRA_FLAGS}
- -DPUGIXML_HOME=${LIBDIR}/pugixml
-)
+ set(OSL_EXTRA_ARGS
+ ${OSL_EXTRA_ARGS}
+ -DPUGIXML_HOME=${LIBDIR}/pugixml
+ )
+elseif(APPLE)
+ # Make symbol hiding consistent with OIIO which defaults to OFF,
+ # avoids linker warnings on macOS
+ set(OSL_EXTRA_ARGS
+ ${OSL_EXTRA_ARGS}
+ -DHIDE_SYMBOLS=OFF
+ )
endif()
ExternalProject_Add(external_osl
diff --git a/build_files/build_environment/cmake/python.cmake b/build_files/build_environment/cmake/python.cmake
index 22b4052189e..89cbe8c6ae2 100644
--- a/build_files/build_environment/cmake/python.cmake
+++ b/build_files/build_environment/cmake/python.cmake
@@ -67,9 +67,6 @@ if(WIN32)
message("POutput = ${PYTHON_OUTPUTDIR}")
else()
if(APPLE)
- # we need to add homebrew pkgconfig directories to get ssl, xz
-
- set(BREW_PKG_CONFIG "/usr/local/opt/openssl/lib/pkgconfig:/usr/local/opt/xz/lib/pkgconfig")
# disable functions that can be in 10.13 sdk but aren't available on 10.9 target
set(PYTHON_FUNC_CONFIGS
export ac_cv_func_futimens=no &&
@@ -83,25 +80,23 @@ else()
export ac_cv_func_mkostemp=no &&
export ac_cv_func_mkostemps=no &&
export ac_cv_func_timingsafe_bcmp=no)
-
- set(PYTHON_CONFIGURE_ENV ${CONFIGURE_ENV} && export PKG_CONFIG_PATH=${BREW_PKG_CONFIG} && ${PYTHON_FUNC_CONFIGS})
+ set(PYTHON_CONFIGURE_ENV ${CONFIGURE_ENV} && ${PYTHON_FUNC_CONFIGS})
set(PYTHON_BINARY ${BUILD_DIR}/python/src/external_python/python.exe)
- set(PYTHON_PATCH echo .)
- set(PYTHON_CONFIGURE_EXTRA_ENV echo .)
- set(PYTHON_CONFIGURE_EXTRA_ARGS)
else()
- set(PYTHON_CONFIGURE_EXTRA_ARGS "--with-openssl=${LIBDIR}/ssl")
set(PYTHON_CONFIGURE_ENV ${CONFIGURE_ENV})
- set(PYTHON_CFLAGS "-I${LIBDIR}/sqlite/include -I${LIBDIR}/bzip2/include -I${LIBDIR}/lzma/include -I${LIBDIR}/zlib/include")
- set(PYTHON_LDFLAGS "-L${LIBDIR}/sqlite/lib -L${LIBDIR}/bzip2/lib -L${LIBDIR}/lzma/lib -L${LIBDIR}/zlib/lib")
- set(PYTHON_CONFIGURE_EXTRA_ENV
- export CFLAGS=${PYTHON_CFLAGS} &&
- export CPPFLAGS=${PYTHON_CFLAGS} &&
- export LDFLAGS=${PYTHON_LDFLAGS})
set(PYTHON_BINARY ${BUILD_DIR}/python/src/external_python/python)
- set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_linux.diff)
endif()
+ set(PYTHON_CONFIGURE_EXTRA_ARGS "--with-openssl=${LIBDIR}/ssl")
+ set(PYTHON_CFLAGS "-I${LIBDIR}/sqlite/include -I${LIBDIR}/bzip2/include -I${LIBDIR}/lzma/include -I${LIBDIR}/zlib/include")
+ set(PYTHON_LDFLAGS "-L${LIBDIR}/ffi/lib -L${LIBDIR}/sqlite/lib -L${LIBDIR}/bzip2/lib -L${LIBDIR}/lzma/lib -L${LIBDIR}/zlib/lib")
+ set(PYTHON_CONFIGURE_EXTRA_ENV
+ export CFLAGS=${PYTHON_CFLAGS} &&
+ export CPPFLAGS=${PYTHON_CFLAGS} &&
+ export LDFLAGS=${PYTHON_LDFLAGS} &&
+ export PKG_CONFIG_PATH=${LIBDIR}/ffi/lib/pkgconfig)
+ set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_linux.diff)
+
ExternalProject_Add(external_python
URL ${PYTHON_URI}
DOWNLOAD_DIR ${DOWNLOAD_DIR}
@@ -147,7 +142,7 @@ if(MSVC)
COMMAND ${CMAKE_COMMAND} -E copy "${PYTHON_OUTPUTDIR}/select${PYTHON_POSTFIX}.pyd" ${BUILD_DIR}/python/src/external_python/redist/lib/select${PYTHON_POSTFIX}.pyd
COMMAND ${CMAKE_COMMAND} -E copy "${PYTHON_OUTPUTDIR}/unicodedata${PYTHON_POSTFIX}.pyd" ${BUILD_DIR}/python/src/external_python/redist/lib/unicodedata${PYTHON_POSTFIX}.pyd
COMMAND ${CMAKE_COMMAND} -E copy "${PYTHON_OUTPUTDIR}/winsound${PYTHON_POSTFIX}.pyd" ${BUILD_DIR}/python/src/external_python/redist/lib/winsound${PYTHON_POSTFIX}.pyd
- #xxlimited is an example extention module, we don't need to ship it and debug doesn't build it
+ #xxlimited is an example extension module, we don't need to ship it and debug doesn't build it
#leaving it commented out, so I won't get confused again with the next update.
#COMMAND ${CMAKE_COMMAND} -E copy "${PYTHON_OUTPUTDIR}/xxlimited${PYTHON_POSTFIX}.pyd" ${BUILD_DIR}/python/src/external_python/redist/lib/xxlimited${PYTHON_POSTFIX}.pyd
COMMAND ${CMAKE_COMMAND} -E copy "${PYTHON_OUTPUTDIR}/libssl-1_1${SSL_POSTFIX}.dll" ${BUILD_DIR}/python/src/external_python/redist/lib/libssl-1_1${SSL_POSTFIX}.dll
@@ -172,7 +167,7 @@ if(MSVC)
add_custom_target(Make_Python_Environment ALL DEPENDS ${BUILD_DIR}/python/src/external_python/run/python${PYTHON_POSTFIX}.exe Package_Python)
endif()
-if(UNIX AND NOT APPLE)
+if(UNIX)
add_dependencies(
external_python
external_bzip2
diff --git a/build_files/build_environment/cmake/sdl.cmake b/build_files/build_environment/cmake/sdl.cmake
index 8383c5a5a79..ab81ad130e8 100644
--- a/build_files/build_environment/cmake/sdl.cmake
+++ b/build_files/build_environment/cmake/sdl.cmake
@@ -25,6 +25,7 @@ else()
-DSDL_STATIC=ON
-DSDL_SHARED=OFF
-DSDL_VIDEO=OFF
+ -DSNDIO=OFF
)
endif()
diff --git a/build_files/build_environment/cmake/ssl.cmake b/build_files/build_environment/cmake/ssl.cmake
index dd1b9957cc2..993e6f3ff6a 100644
--- a/build_files/build_environment/cmake/ssl.cmake
+++ b/build_files/build_environment/cmake/ssl.cmake
@@ -19,11 +19,15 @@
set(SSL_CONFIGURE_COMMAND ./Configure)
set(SSL_PATCH_CMD echo .)
-if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
- set(SSL_EXTRA_ARGS enable-ec_nistp_64_gcc_128)
- set(SSL_OS_COMPILER "blender-x86_64")
+if (APPLE)
+ set(SSL_OS_COMPILER "blender-darwin-x86_64")
else()
- set(SSL_OS_COMPILER "blender-x86")
+ if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
+ set(SSL_EXTRA_ARGS enable-ec_nistp_64_gcc_128)
+ set(SSL_OS_COMPILER "blender-linux-x86_64")
+ else()
+ set(SSL_OS_COMPILER "blender-linux-x86")
+ endif()
endif()
ExternalProject_Add(external_ssl
diff --git a/build_files/build_environment/cmake/ssl.conf b/build_files/build_environment/cmake/ssl.conf
index a9534e56291..91f4357f8d8 100644
--- a/build_files/build_environment/cmake/ssl.conf
+++ b/build_files/build_environment/cmake/ssl.conf
@@ -1,10 +1,15 @@
%targets = (
- "blender-x86" => {
+
+ "blender-linux-x86" => {
inherit_from => [ "linux-x86" ],
cflags => add("-fPIC"),
},
- "blender-x86_64" => {
+ "blender-linux-x86_64" => {
inherit_from => [ "linux-x86_64" ],
cflags => add("-fPIC"),
},
+ "blender-darwin-x86_64" => {
+ inherit_from => [ "darwin64-x86_64-cc" ],
+ cflags => add("-fPIC"),
+ },
);
diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake
index 7ede80a2be9..85f59762ef2 100644
--- a/build_files/build_environment/cmake/versions.cmake
+++ b/build_files/build_environment/cmake/versions.cmake
@@ -21,7 +21,7 @@ set(ZLIB_URI https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz)
set(ZLIB_HASH 1c9f62f0778697a09d36121ead88e08e)
set(OPENAL_VERSION 1.18.2)
-set(OPENAL_URI http://kcat.strangesoft.net/openal-releases/openal-soft-${OPENAL_VERSION}.tar.bz2)
+set(OPENAL_URI http://openal-soft.org/openal-releases/openal-soft-${OPENAL_VERSION}.tar.bz2)
set(OPENAL_HASH d4eeb0889812e2fdeaa1843523d76190)
set(PNG_VERSION 1.6.35)
@@ -298,3 +298,7 @@ set(SSL_HASH ebbfc844a8c8cc0ea5dc10b86c9ce97f401837f3fa08c17b2cdadc118253cf99)
set(SQLITE_VERSION 3.24.0)
set(SQLITE_URI https://www.sqlite.org/2018/sqlite-src-3240000.zip)
set(SQLITE_HASH fb558c49ee21a837713c4f1e7e413309aabdd9c7)
+
+set(EMBREE_VERSION 3.2.4)
+set(EMBREE_URI https://github.com/embree/embree/archive/v${EMBREE_VERSION}.zip)
+set(EMBREE_HASH 3d4a1147002ff43939d45140aa9d6fb8)
diff --git a/build_files/build_environment/cmake/zlib.cmake b/build_files/build_environment/cmake/zlib.cmake
index 7bf1c45e359..396bb3a318e 100644
--- a/build_files/build_environment/cmake/zlib.cmake
+++ b/build_files/build_environment/cmake/zlib.cmake
@@ -46,7 +46,7 @@ else()
DEPENDEES install
)
endif()
- if (UNIX AND NOT APPLE)
+ if (UNIX)
ExternalProject_Add_Step(external_zlib after_install
COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/zlib/lib/libz.a ${LIBDIR}/zlib/lib/libz_pic.a
DEPENDEES install
diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh
index d590a80bcac..6ce5fd9a8fb 100755
--- a/build_files/build_environment/install_deps.sh
+++ b/build_files/build_environment/install_deps.sh
@@ -26,17 +26,17 @@ ARGS=$( \
getopt \
-o s:i:t:h \
--long source:,install:,tmp:,info:,threads:,help,show-deps,no-sudo,no-build,no-confirm,\
-with-all,with-opencollada,with-jack,\
+with-all,with-opencollada,with-jack,with-embree,\
ver-ocio:,ver-oiio:,ver-llvm:,ver-osl:,ver-osd:,ver-openvdb:,\
force-all,force-python,force-numpy,force-boost,\
force-ocio,force-openexr,force-oiio,force-llvm,force-osl,force-osd,force-openvdb,\
-force-ffmpeg,force-opencollada,force-alembic,\
+force-ffmpeg,force-opencollada,force-alembic,force-embree,\
build-all,build-python,build-numpy,build-boost,\
build-ocio,build-openexr,build-oiio,build-llvm,build-osl,build-osd,build-openvdb,\
-build-ffmpeg,build-opencollada,build-alembic,\
+build-ffmpeg,build-opencollada,build-alembic,build-embree,\
skip-python,skip-numpy,skip-boost,\
skip-ocio,skip-openexr,skip-oiio,skip-llvm,skip-osl,skip-osd,skip-openvdb,\
-skip-ffmpeg,skip-opencollada,skip-alembic \
+skip-ffmpeg,skip-opencollada,skip-alembic,skip-embree \
-- "$@" \
)
@@ -54,8 +54,9 @@ SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
# Do not install some optional, potentially conflicting libs by default...
WITH_ALL=false
-# Do not yet enable opencollada, use --with-opencollada (or --with-all) option to try it.
+# Do not yet enable opencollada or embree, use --with-opencollada/--with-embree (or --with-all) option to try it.
WITH_OPENCOLLADA=false
+WITH_EMBREE=false
THREADS=$(nproc)
@@ -67,6 +68,7 @@ or use --source/--install options, if you want to use other paths!
Number of threads for building: \$THREADS (automatically detected, use --threads=<nbr> to override it).
Full install: \$WITH_ALL (use --with-all option to enable it).
Building OpenCOLLADA: \$WITH_OPENCOLLADA (use --with-opencollada option to enable it).
+Building Embree: \$WITH_EMBREE (use --with-embree option to enable it).
Example:
Full install without OpenCOLLADA: --with-all --skip-opencollada
@@ -113,6 +115,9 @@ ARGUMENTS_INFO="\"COMMAND LINE ARGUMENTS:
--with-opencollada
Build and install the OpenCOLLADA libraries.
+ --with-embree
+ Build and install the Embree libraries.
+
--with-jack
Install the jack libraries.
@@ -177,6 +182,9 @@ ARGUMENTS_INFO="\"COMMAND LINE ARGUMENTS:
--build-opencollada
Force the build of OpenCOLLADA.
+ --build-embree
+ Force the build of Embree.
+
--build-ffmpeg
Force the build of FFMpeg.
@@ -229,6 +237,9 @@ ARGUMENTS_INFO="\"COMMAND LINE ARGUMENTS:
--force-opencollada
Force the rebuild of OpenCOLLADA.
+ --force-embree
+ Force the rebuild of Embree.
+
--force-ffmpeg
Force the rebuild of FFMpeg.
@@ -274,6 +285,9 @@ ARGUMENTS_INFO="\"COMMAND LINE ARGUMENTS:
--skip-opencollada
Unconditionally skip OpenCOLLADA installation/building.
+ --skip-Embree
+ Unconditionally skip Embree installation/building.
+
--skip-ffmpeg
Unconditionally skip FFMpeg installation/building.\""
@@ -287,89 +301,95 @@ NO_BUILD=false
NO_CONFIRM=false
USE_CXX11=true
-PYTHON_VERSION="3.6.2"
-PYTHON_VERSION_MIN="3.6"
+PYTHON_VERSION="3.7.0"
+PYTHON_VERSION_MIN="3.7"
PYTHON_FORCE_BUILD=false
PYTHON_FORCE_REBUILD=false
PYTHON_SKIP=false
-NUMPY_VERSION="1.13.1"
+NUMPY_VERSION="1.15.0"
NUMPY_VERSION_MIN="1.8"
NUMPY_FORCE_BUILD=false
NUMPY_FORCE_REBUILD=false
NUMPY_SKIP=false
-BOOST_VERSION="1.60.0"
+BOOST_VERSION="1.68.0"
BOOST_VERSION_MIN="1.49"
BOOST_FORCE_BUILD=false
BOOST_FORCE_REBUILD=false
BOOST_SKIP=false
-OCIO_VERSION="1.0.9"
+OCIO_VERSION="1.1.0"
OCIO_VERSION_MIN="1.0"
OCIO_FORCE_BUILD=false
OCIO_FORCE_REBUILD=false
OCIO_SKIP=false
-OPENEXR_VERSION="2.2.0"
+OPENEXR_VERSION="2.3.0"
OPENEXR_VERSION_MIN="2.0.1"
-ILMBASE_VERSION="2.2.0"
-ILMBASE_VERSION_MIN="2.2"
+ILMBASE_VERSION="2.3.0"
+ILMBASE_VERSION_MIN="2.3"
OPENEXR_FORCE_BUILD=false
OPENEXR_FORCE_REBUILD=false
OPENEXR_SKIP=false
_with_built_openexr=false
-OIIO_VERSION="1.7.15"
-OIIO_VERSION_MIN="1.7.15"
-OIIO_VERSION_MAX="1.9.0" # UNKNOWN currently # Not supported by current OSL...
+OIIO_VERSION="1.8.13"
+OIIO_VERSION_MIN="1.8.13"
+OIIO_VERSION_MAX="99.99.0" # UNKNOWN currently # Not supported by current OSL...
OIIO_FORCE_BUILD=false
OIIO_FORCE_REBUILD=false
OIIO_SKIP=false
-LLVM_VERSION="3.4"
-LLVM_VERSION_MIN="3.4"
+LLVM_VERSION="6.0.1"
+LLVM_VERSION_MIN="6.0"
LLVM_VERSION_FOUND=""
LLVM_FORCE_BUILD=false
LLVM_FORCE_REBUILD=false
LLVM_SKIP=false
# OSL needs to be compiled for now!
-OSL_VERSION="1.7.5"
+OSL_VERSION="1.9.9"
OSL_VERSION_MIN=$OSL_VERSION
OSL_FORCE_BUILD=false
OSL_FORCE_REBUILD=false
OSL_SKIP=false
# OpenSubdiv needs to be compiled for now
-OSD_VERSION="3.1.1"
+OSD_VERSION="3.3.3"
OSD_VERSION_MIN=$OSD_VERSION
OSD_FORCE_BUILD=false
OSD_FORCE_REBUILD=false
OSD_SKIP=false
# OpenVDB needs to be compiled for now
-OPENVDB_BLOSC_VERSION="1.7.0"
+OPENVDB_BLOSC_VERSION="1.14.4"
-OPENVDB_VERSION="3.1.0"
+OPENVDB_VERSION="5.1.0"
OPENVDB_VERSION_MIN=$OPENVDB_VERSION
OPENVDB_FORCE_BUILD=false
OPENVDB_FORCE_REBUILD=false
OPENVDB_SKIP=false
# Alembic needs to be compiled for now
-ALEMBIC_VERSION="1.7.1"
+ALEMBIC_VERSION="1.7.8"
ALEMBIC_VERSION_MIN=$ALEMBIC_VERSION
ALEMBIC_FORCE_BUILD=false
ALEMBIC_FORCE_REBUILD=false
ALEMBIC_SKIP=false
-OPENCOLLADA_VERSION="1.6.51"
+OPENCOLLADA_VERSION="1.6.63"
OPENCOLLADA_FORCE_BUILD=false
OPENCOLLADA_FORCE_REBUILD=false
OPENCOLLADA_SKIP=false
-FFMPEG_VERSION="3.2.1"
+
+EMBREE_VERSION="3.2.4"
+EMBREE_FORCE_BUILD=false
+EMBREE_FORCE_REBUILD=false
+EMBREE_SKIP=false
+
+FFMPEG_VERSION="4.0.2"
FFMPEG_VERSION_MIN="2.8.4"
FFMPEG_FORCE_BUILD=false
FFMPEG_FORCE_REBUILD=false
@@ -502,6 +522,9 @@ while true; do
--with-opencollada)
WITH_OPENCOLLADA=true; shift; continue
;;
+ --with-embree)
+ WITH_EMBREE=true; shift; continue
+ ;;
--with-jack)
WITH_JACK=true; shift; continue;
;;
@@ -547,6 +570,7 @@ while true; do
OSD_FORCE_BUILD=true
OPENVDB_FORCE_BUILD=true
OPENCOLLADA_FORCE_BUILD=true
+ EMBREE_FORCE_BUILD=true
FFMPEG_FORCE_BUILD=true
ALEMBIC_FORCE_BUILD=true
shift; continue
@@ -588,6 +612,9 @@ while true; do
--build-opencollada)
OPENCOLLADA_FORCE_BUILD=true; shift; continue
;;
+ --build-embree)
+ EMBREE_FORCE_BUILD=true; shift; continue
+ ;;
--build-ffmpeg)
FFMPEG_FORCE_BUILD=true; shift; continue
;;
@@ -606,6 +633,7 @@ while true; do
OSD_FORCE_REBUILD=true
OPENVDB_FORCE_REBUILD=true
OPENCOLLADA_FORCE_REBUILD=true
+ EMBREE_FORCE_REBUILD=true
FFMPEG_FORCE_REBUILD=true
ALEMBIC_FORCE_REBUILD=true
shift; continue
@@ -645,6 +673,9 @@ while true; do
--force-opencollada)
OPENCOLLADA_FORCE_REBUILD=true; shift; continue
;;
+ --force-embree)
+ EMBREE_FORCE_REBUILD=true; shift; continue
+ ;;
--force-ffmpeg)
FFMPEG_FORCE_REBUILD=true; shift; continue
;;
@@ -684,6 +715,9 @@ while true; do
--skip-opencollada)
OPENCOLLADA_SKIP=true; shift; continue
;;
+ --skip-embree)
+ EMBREE_SKIP=true; shift; continue
+ ;;
--skip-ffmpeg)
FFMPEG_SKIP=true; shift; continue
;;
@@ -708,6 +742,9 @@ done
if [ "$WITH_ALL" = true -a "$OPENCOLLADA_SKIP" = false ]; then
WITH_OPENCOLLADA=true
fi
+if [ "$WITH_ALL" = true -a "$EMBREE_SKIP" = false ]; then
+ WITH_EMBREE=true
+fi
if [ "$WITH_ALL" = true ]; then
WITH_JACK=true
fi
@@ -737,43 +774,45 @@ _boost_version_nodots=`echo "$BOOST_VERSION" | sed -r 's/\./_/g'`
BOOST_SOURCE=( "http://sourceforge.net/projects/boost/files/boost/$BOOST_VERSION/boost_$_boost_version_nodots.tar.bz2/download" )
BOOST_BUILD_MODULES="--with-system --with-filesystem --with-thread --with-regex --with-locale --with-date_time --with-wave --with-iostreams --with-python --with-program_options"
-OCIO_USE_REPO=true
-OCIO_SOURCE=( "https://github.com/imageworks/OpenColorIO/tarball/v$OCIO_VERSION" )
-OCIO_SOURCE_REPO=( "https://github.com/imageworks/OpenColorIO.git" )
-OCIO_SOURCE_REPO_UID="6de971097c7f552300f669ed69ca0b6cf5a70843"
+OCIO_USE_REPO=false
+OCIO_SOURCE=( "https://github.com/imageworks/OpenColorIO/archive/v$OCIO_VERSION.tar.gz")
+#~ OCIO_SOURCE_REPO=( "https://github.com/imageworks/OpenColorIO.git" )
+#~ OCIO_SOURCE_REPO_UID="6de971097c7f552300f669ed69ca0b6cf5a70843"
OPENEXR_USE_REPO=false
-OPENEXR_SOURCE=( "http://download.savannah.nongnu.org/releases/openexr/openexr-$OPENEXR_VERSION.tar.gz" )
-OPENEXR_SOURCE_REPO=( "https://github.com/mont29/openexr.git" )
-OPENEXR_SOURCE_REPO_UID="2787aa1cf652d244ed45ae124eb1553f6cff11ee"
-ILMBASE_SOURCE=( "http://download.savannah.nongnu.org/releases/openexr/ilmbase-$ILMBASE_VERSION.tar.gz" )
+#~ OPENEXR_SOURCE=( "https://github.com/openexr/openexr/releases/download/v$OPENEXR_VERSION/openexr-$OPENEXR_VERSION.tar.gz" )
+OPENEXR_SOURCE_REPO_UID="0ac2ea34c8f3134148a5df4052e40f155b76f6fb"
+OPENEXR_SOURCE=( "https://github.com/openexr/openexr/archive/$OPENEXR_SOURCE_REPO_UID.tar.gz" )
+#~ OPENEXR_SOURCE_REPO=( "https://github.com/mont29/openexr.git" )
+ILMBASE_SOURCE=( "https://github.com/openexr/openexr/releases/download/v$ILMBASE_VERSION/ilmbase-$ILMBASE_VERSION.tar.gz" )
OIIO_USE_REPO=false
OIIO_SOURCE=( "https://github.com/OpenImageIO/oiio/archive/Release-$OIIO_VERSION.tar.gz" )
-OIIO_SOURCE_REPO=( "https://github.com/OpenImageIO/oiio.git" )
-OIIO_SOURCE_REPO_UID="c9e67275a0b248ead96152f6d2221cc0c0f278a4"
+#~ OIIO_SOURCE_REPO=( "https://github.com/OpenImageIO/oiio.git" )
+#~ OIIO_SOURCE_REPO_UID="c9e67275a0b248ead96152f6d2221cc0c0f278a4"
-LLVM_SOURCE=( "http://releases.llvm.org/$LLVM_VERSION/llvm-$LLVM_VERSION.src.tar.gz" )
-LLVM_CLANG_SOURCE=( "http://releases.llvm.org/$LLVM_VERSION/clang-$LLVM_VERSION.src.tar.gz" "http://llvm.org/releases/$LLVM_VERSION/cfe-$LLVM_VERSION.src.tar.gz" )
+LLVM_SOURCE=( "http://releases.llvm.org/$LLVM_VERSION/llvm-$LLVM_VERSION.src.tar.xz" )
+LLVM_CLANG_SOURCE=( "http://releases.llvm.org/$LLVM_VERSION/clang-$LLVM_VERSION.src.tar.xz" "http://llvm.org/releases/$LLVM_VERSION/cfe-$LLVM_VERSION.src.tar.xz" )
OSL_USE_REPO=false
OSL_SOURCE=( "https://github.com/imageworks/OpenShadingLanguage/archive/Release-$OSL_VERSION.tar.gz" )
-#~ OSL_SOURCE=( "https://github.com/Nazg-Gul/OpenShadingLanguage/archive/Release-1.5.11.tar.gz" )
#~ OSL_SOURCE_REPO=( "https://github.com/imageworks/OpenShadingLanguage.git" )
+#~ OSL_SOURCE_REPO_BRANCH="master"
+#~ OSL_SOURCE_REPO_UID="85179714e1bc69cd25ecb6bb711c1a156685d395"
+#~ OSL_SOURCE=( "https://github.com/Nazg-Gul/OpenShadingLanguage/archive/Release-1.5.11.tar.gz" )
#~ OSL_SOURCE_REPO=( "https://github.com/mont29/OpenShadingLanguage.git" )
#~ OSL_SOURCE_REPO_UID="85179714e1bc69cd25ecb6bb711c1a156685d395"
-#~ OSL_SOURCE_REPO_BRANCH="master"
-OSL_SOURCE_REPO=( "https://github.com/Nazg-Gul/OpenShadingLanguage.git" )
-OSL_SOURCE_REPO_UID="7d40ff5fe8e47b030042afb92d0e955f5aa96f48"
-OSL_SOURCE_REPO_BRANCH="blender-fixes"
+#~ OSL_SOURCE_REPO=( "https://github.com/Nazg-Gul/OpenShadingLanguage.git" )
+#~ OSL_SOURCE_REPO_UID="7d40ff5fe8e47b030042afb92d0e955f5aa96f48"
+#~ OSL_SOURCE_REPO_BRANCH="blender-fixes"
OSD_USE_REPO=false
# Script foo to make the version string compliant with the archive name:
# ${Varname//SearchForThisChar/ReplaceWithThisChar}
OSD_SOURCE=( "https://github.com/PixarAnimationStudios/OpenSubdiv/archive/v${OSD_VERSION//./_}.tar.gz" )
-OSD_SOURCE_REPO=( "https://github.com/PixarAnimationStudios/OpenSubdiv.git" )
-OSD_SOURCE_REPO_UID="404659fffa659da075d1c9416e4fc939139a84ee"
-OSD_SOURCE_REPO_BRANCH="dev"
+#~ OSD_SOURCE_REPO=( "https://github.com/PixarAnimationStudios/OpenSubdiv.git" )
+#~ OSD_SOURCE_REPO_UID="404659fffa659da075d1c9416e4fc939139a84ee"
+#~ OSD_SOURCE_REPO_BRANCH="dev"
OPENVDB_USE_REPO=false
OPENVDB_BLOSC_SOURCE=( "https://github.com/Blosc/c-blosc/archive/v${OPENVDB_BLOSC_VERSION}.tar.gz" )
@@ -788,9 +827,18 @@ ALEMBIC_SOURCE=( "https://github.com/alembic/alembic/archive/${ALEMBIC_VERSION}.
# ALEMBIC_SOURCE_REPO_UID="e6c90d4faa32c4550adeaaf3f556dad4b73a92bb"
# ALEMBIC_SOURCE_REPO_BRANCH="master"
-OPENCOLLADA_SOURCE=( "https://github.com/KhronosGroup/OpenCOLLADA.git" )
-OPENCOLLADA_REPO_UID="0c2cdc17c22cf42050e4d42154bed2176363549c"
-OPENCOLLADA_REPO_BRANCH="master"
+OPENCOLLADA_USE_REPO=false
+OPENCOLLADA_SOURCE=( "https://github.com/KhronosGroup/OpenCOLLADA/archive/v${OPENCOLLADA_VERSION}.tar.gz" )
+#~ OPENCOLLADA_SOURCE_REPO=( "https://github.com/KhronosGroup/OpenCOLLADA.git" )
+#~ OPENCOLLADA_REPO_UID="e937c3897b86fc0da53cde97257f5156"
+#~ OPENCOLLADA_REPO_BRANCH="master"
+
+EMBREE_USE_REPO=false
+EMBREE_SOURCE=( "https://github.com/embree/embree/archive/v${EMBREE_VERSION}.tar.gz" )
+#~ EMBREE_SOURCE_REPO=( "https://github.com/embree/embree.git" )
+#~ EMBREE_REPO_UID="4a12bfed63c90e85b6eab98b8cdd8dd2a3ba5809"
+#~ EMBREE_REPO_BRANCH="master"
+
FFMPEG_SOURCE=( "http://ffmpeg.org/releases/ffmpeg-$FFMPEG_VERSION.tar.bz2" )
@@ -807,7 +855,7 @@ DEPS_COMMON_INFO="\"COMMON DEPENDENCIES:
Those libraries should be available as packages in all recent distributions (optional ones are [between brackets]):
* Basics of dev environment (cmake, gcc, svn , git, ...).
- * libjpeg, libpng, libtiff, [libopenjpeg], [libopenal].
+ * libjpeg, libpng, libtiff, [openjpeg2], [libopenal].
* libx11, libxcursor, libxi, libxrandr, libxinerama (and other libx... as needed).
* libsqlite3, libbz2, libssl, libfftw3, libxml2, libtinyxml, yasm, libyaml-cpp.
* libsdl1.2, libglew, [libglewmx].\""
@@ -831,7 +879,8 @@ You may also want to build them yourself (optional ones are [between brackets]):
* [OpenShadingLanguage $OSL_VERSION_MIN] (from $OSL_SOURCE_REPO, branch $OSL_SOURCE_REPO_BRANCH, commit $OSL_SOURCE_REPO_UID).
* [OpenSubDiv $OSD_VERSION_MIN] (from $OSD_SOURCE_REPO, branch $OSD_SOURCE_REPO_BRANCH, commit $OSD_SOURCE_REPO_UID).
* [OpenVDB $OPENVDB_VERSION_MIN] (from $OPENVDB_SOURCE), [Blosc $OPENVDB_BLOSC_VERSION] (from $OPENVDB_BLOSC_SOURCE).
- * [OpenCollada] (from $OPENCOLLADA_SOURCE, branch $OPENCOLLADA_REPO_BRANCH, commit $OPENCOLLADA_REPO_UID).
+ * [OpenCollada $OPENCOLLADA_VERSION] (from $OPENCOLLADA_SOURCE).
+ * [Embree $EMBREE_VERSION] (from $EMBREE_SOURCE).
* [Alembic $ALEMBIC_VERSION] (from $ALEMBIC_SOURCE).\""
if [ "$DO_SHOW_DEPS" = true ]; then
@@ -1196,7 +1245,7 @@ compile_Boost() {
if [ ! -d $_inst ]; then
INFO "Building Boost-$BOOST_VERSION"
- # Rebuild dependecies as well!
+ # Rebuild dependencies as well!
OIIO_FORCE_BUILD=true
OIIO_FORCE_REBUILD=true
OSL_FORCE_BUILD=true
@@ -1315,12 +1364,14 @@ compile_OCIO() {
cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
cmake_d="$cmake_d -D OCIO_BUILD_APPS=OFF"
cmake_d="$cmake_d -D OCIO_BUILD_PYGLUE=OFF"
+ cmake_d="$cmake_d -D STOP_ON_WARNING=OFF"
if file /bin/cp | grep -q '32-bit'; then
cflags="-fPIC -m32 -march=i686"
else
cflags="-fPIC"
fi
+ cflags="$cflags -Wno-error=unused-function -Wno-error=deprecated-declarations"
cmake $cmake_d -D CMAKE_CXX_FLAGS="$cflags" -D CMAKE_EXE_LINKER_FLAGS="-lgcc_s -lgcc" ..
@@ -1387,7 +1438,7 @@ compile_ILMBASE() {
if [ ! -d $_openexr_inst ]; then
INFO "Building ILMBase-$ILMBASE_VERSION"
- # Rebuild dependecies as well!
+ # Rebuild dependencies as well!
OPENEXR_FORCE_BUILD=true
OPENEXR_FORCE_REBUILD=true
@@ -1483,7 +1534,7 @@ compile_OPENEXR() {
if [ ! -d $_inst ]; then
INFO "Building OpenEXR-$OPENEXR_VERSION"
- # Rebuild dependecies as well!
+ # Rebuild dependencies as well!
OIIO_FORCE_BUILD=true
OIIO_FORCE_REBUILD=true
@@ -1597,7 +1648,7 @@ compile_OIIO() {
if [ ! -d $_inst ]; then
INFO "Building OpenImageIO-$OIIO_VERSION"
- # Rebuild dependecies as well!
+ # Rebuild dependencies as well!
OSL_FORCE_BUILD=true
OSL_FORCE_REBUILD=true
@@ -1655,6 +1706,7 @@ compile_OIIO() {
cmake_d="$cmake_d -D USE_QT=OFF"
cmake_d="$cmake_d -D USE_PYTHON=OFF"
cmake_d="$cmake_d -D USE_FFMPEG=OFF"
+ cmake_d="$cmake_d -D USE_OPENCV=OFF"
cmake_d="$cmake_d -D BUILD_TESTING=OFF"
cmake_d="$cmake_d -D OIIO_BUILD_TESTS=OFF"
cmake_d="$cmake_d -D OIIO_BUILD_TOOLS=OFF"
@@ -1738,7 +1790,7 @@ compile_LLVM() {
if [ ! -d $_inst ]; then
INFO "Building LLVM-$LLVM_VERSION (CLANG included!)"
- # Rebuild dependecies as well!
+ # Rebuild dependencies as well!
OSL_FORCE_BUILD=true
OSL_FORCE_REBUILD=true
@@ -1746,23 +1798,20 @@ compile_LLVM() {
if [ ! -d $_src -o true ]; then
mkdir -p $SRC
- download LLVM_SOURCE[@] "$_src.tar.gz"
- download LLVM_CLANG_SOURCE[@] "$_src_clang.tar.gz"
+ download LLVM_SOURCE[@] "$_src.tar.xz"
+ download LLVM_CLANG_SOURCE[@] "$_src_clang.tar.xz"
INFO "Unpacking LLVM-$LLVM_VERSION"
tar -C $SRC --transform "s,([^/]*/?)llvm-[^/]*(.*),\1LLVM-$LLVM_VERSION\2,x" \
- -xf $_src.tar.gz
+ -xf $_src.tar.xz
INFO "Unpacking CLANG-$LLVM_VERSION to $_src/tools/clang"
# Stupid clang guys renamed 'clang' to 'cfe' for now handle both cases... :(
tar -C $_src/tools \
--transform "s,([^/]*/?)(clang|cfe)-[^/]*(.*),\1clang\3,x" \
- -xf $_src_clang.tar.gz
+ -xf $_src_clang.tar.xz
cd $_src
- # XXX Ugly patching hack!
- patch -p1 -i "$SCRIPT_DIR/patches/install_deps_llvm.diff"
-
cd $CWD
fi
@@ -1865,9 +1914,6 @@ compile_OSL() {
# Stick to same rev as windows' libs...
git checkout $OSL_SOURCE_REPO_UID
git reset --hard
-
- # XXX Ugly patching hack!
- patch -p1 -i "$SCRIPT_DIR/patches/install_deps_osl.diff"
fi
# Always refresh the whole build!
@@ -2070,7 +2116,7 @@ compile_BLOSC() {
if [ ! -d $_inst ]; then
INFO "Building Blosc-$OPENVDB_BLOSC_VERSION"
- # Rebuild dependecies as well!
+ # Rebuild dependencies as well!
OPENVDB_FORCE_BUILD=true
OPENVDB_FORCE_REBUILD=true
@@ -2354,17 +2400,24 @@ compile_OpenCOLLADA() {
if [ ! -d $_src ]; then
mkdir -p $SRC
- git clone $OPENCOLLADA_SOURCE $_src
+ if [ "$OPENCOLLADA_USE_REPO" = true ]; then
+ git clone $OPENCOLLADA_SOURCE_REPO $_src
+ else
+ download OPENCOLLADA_SOURCE[@] "$_src.tar.gz"
+ INFO "Unpacking OpenCOLLADA-$OPENCOLLADA_VERSION"
+ tar -C $SRC -xf $_src.tar.gz
+ fi
fi
cd $_src
- # XXX For now, always update from latest repo...
- git pull origin $OPENCOLLADA_REPO_BRANCH
+ if [ "$OPENCOLLADA_USE_REPO" = true ]; then
+ git pull origin $OPENCOLLADA_REPO_BRANCH
- # Stick to same rev as windows' libs...
- git checkout $OPENCOLLADA_REPO_UID
- git reset --hard
+ # Stick to same rev as windows' libs...
+ git checkout $OPENCOLLADA_REPO_UID
+ git reset --hard
+ fi
# Always refresh the whole build!
if [ -d build ]; then
@@ -2403,6 +2456,101 @@ compile_OpenCOLLADA() {
fi
}
+#### Build Embree ####
+_init_embree() {
+ _src=$SRC/embree-$EMBREE_VERSION
+ _git=true
+ _inst=$INST/embree-$EMBREE_VERSION
+ _inst_shortcut=$INST/embree
+}
+
+clean_Embree() {
+ _init_embree
+ _clean
+}
+
+compile_Embree() {
+ if [ "$NO_BUILD" = true ]; then
+ WARNING "--no-build enabled, Embree will not be compiled!"
+ return
+ fi
+
+ # To be changed each time we make edits that would modify the compiled results!
+ embree_magic=9
+ _init_embree
+
+ # Clean install if needed!
+ magic_compile_check embree-$EMBREE_VERSION $embree_magic
+ if [ $? -eq 1 -o "$EMBREE_FORCE_REBUILD" = true ]; then
+ clean_Embree
+ fi
+
+ if [ ! -d $_inst ]; then
+ INFO "Building Embree-$EMBREE_VERSION"
+
+ prepare_opt
+
+ if [ ! -d $_src ]; then
+ mkdir -p $SRC
+ if [ "EMBREE_USE_REPO" = true ]; then
+ git clone $EMBREE_SOURCE_REPO $_src
+ else
+ download EMBREE_SOURCE[@] "$_src.tar.gz"
+ INFO "Unpacking Embree-$EMBREE_VERSION"
+ tar -C $SRC -xf $_src.tar.gz
+ fi
+ fi
+
+ cd $_src
+
+ if [ "$EMBREE_USE_REPO" = true ]; then
+ git pull origin $EMBREE_REPO_BRANCH
+
+ # Stick to same rev as windows' libs...
+ git checkout $EMBREE_REPO_UID
+ git reset --hard
+ fi
+
+ # Always refresh the whole build!
+ if [ -d build ]; then
+ rm -rf build
+ fi
+ mkdir build
+ cd build
+
+ cmake_d="-D CMAKE_BUILD_TYPE=Release"
+ cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
+ cmake_d="$cmake_d -D EMBREE_ISPC_SUPPORT=OFF"
+ cmake_d="$cmake_d -D EMBREE_TUTORIALS=OFF"
+ cmake_d="$cmake_d -D EMBREE_STATIC_LIB=ON"
+ cmake_d="$cmake_d -D EMBREE_RAY_MASK=ON"
+ cmake_d="$cmake_d -D EMBREE_FILTER_FUNCTION=ON"
+ cmake_d="$cmake_d -D EMBREE_BACKFACE_CULLING=OFF"
+ cmake_d="$cmake_d -D EMBREE_TASKING_SYSTEM=INTERNAL"
+ cmake_d="$cmake_d -D EMBREE_MAX_ISA=AVX2"
+
+ cmake $cmake_d ../
+
+ make -j$THREADS && make install
+ make clean
+
+ if [ -d $_inst ]; then
+ _create_inst_shortcut
+ else
+ ERROR "Embree-$EMBREE_VERSION failed to compile, exiting"
+ exit 1
+ fi
+
+ magic_compile_set embree-$EMBREE_VERSION $embree_magic
+
+ cd $CWD
+ INFO "Done compiling Embree-$EMBREE_VERSION!"
+ else
+ INFO "Own Embree-$EMBREE_VERSION is up to date, nothing to do!"
+ INFO "If you want to force rebuild of this lib, use the --force-embree option."
+ fi
+}
+
#### Build FFMPEG ####
_init_ffmpeg() {
_src=$SRC/ffmpeg-$FFMPEG_VERSION
@@ -2620,8 +2768,8 @@ install_DEB() {
THEORA_USE=true
PRINT ""
- # New Ubuntu crap (17.04 and more) have no openjpeg lib!
- OPENJPEG_DEV="libopenjpeg-dev"
+ # We need openjp2, libopenjpeg is an old version
+ OPENJPEG_DEV="libopenjp2-7-dev"
check_package_DEB $OPENJPEG_DEV
if [ $? -eq 0 ]; then
_packages="$_packages $OPENJPEG_DEV"
@@ -2766,6 +2914,7 @@ install_DEB() {
fi
if $_do_compile_python; then
+ install_packages_DEB libffi-dev
compile_Python
PRINT ""
if [ "$NUMPY_SKIP" = true ]; then
@@ -2862,11 +3011,11 @@ install_DEB() {
INFO "Forced LLVM building, as requested..."
_do_compile_llvm=true
else
- check_package_DEB clang-$LLVM_VERSION
+ check_package_DEB clang-$LLVM_VERSION_MIN
if [ $? -eq 0 ]; then
- install_packages_DEB llvm-$LLVM_VERSION-dev clang-$LLVM_VERSION
+ install_packages_DEB llvm-$LLVM_VERSION_MIN-dev clang-$LLVM_VERSION_MIN
have_llvm=true
- LLVM_VERSION_FOUND=$LLVM_VERSION
+ LLVM_VERSION_FOUND=$LLVM_VERSION_MIN
clean_LLVM
else
_do_compile_llvm=true
@@ -2969,6 +3118,23 @@ install_DEB() {
fi
fi
+ if [ "$WITH_EMBREE" = true ]; then
+ _do_compile_embree=false
+ PRINT ""
+ if [ "$EMBREE_SKIP" = true ]; then
+ WARNING "Skipping Embree installation, as requested..."
+ elif [ "$EMBREE_FORCE_BUILD" = true ]; then
+ INFO "Forced Embree building, as requested..."
+ _do_compile_embree=true
+ else
+ # No package currently!
+ _do_compile_embree=true
+ fi
+
+ if [ "$_do_compile_embree" = true ]; then
+ compile_Embree
+ fi
+ fi
PRINT ""
if [ "$FFMPEG_SKIP" = true ]; then
@@ -3157,7 +3323,7 @@ install_RPM() {
fi
# These libs should always be available in fedora/suse official repository...
- OPENJPEG_DEV="openjpeg-devel"
+ OPENJPEG_DEV="openjpeg2-devel"
VORBIS_DEV="libvorbis-devel"
OGG_DEV="libogg-devel"
THEORA_DEV="libtheora-devel"
@@ -3304,6 +3470,7 @@ install_RPM() {
fi
if [ "$_do_compile_python" = true ]; then
+ install_packages_RPM libffi-devel
compile_Python
PRINT ""
if [ "$NUMPY_SKIP" = true ]; then
@@ -3414,16 +3581,15 @@ install_RPM() {
else
CLANG_DEV="clang-devel"
fi
- # XXX RHEL has 3.4 in repo but OSL complains about not finding MCJIT_LIBRARY, so compile for now...
- #check_package_version_match_RPM $CLANG_DEV $LLVM_VERSION
- #if [ $? -eq 0 ]; then
- # install_packages_RPM llvm-devel $CLANG_DEV
- # have_llvm=true
- # LLVM_VERSION_FOUND=$LLVM_VERSION
- # clean_LLVM
- #else
+ check_package_version_match_RPM $CLANG_DEV $LLVM_VERSION
+ if [ $? -eq 0 ]; then
+ install_packages_RPM llvm-devel $CLANG_DEV
+ have_llvm=true
+ LLVM_VERSION_FOUND=$LLVM_VERSION
+ clean_LLVM
+ else
_do_compile_llvm=true
- #fi
+ fi
fi
if [ "$_do_compile_llvm" = true ]; then
@@ -3516,6 +3682,23 @@ install_RPM() {
fi
fi
+ if [ "$WITH_EMBREE" = true ]; then
+ PRINT ""
+ _do_compile_embree=false
+ if [ "$OPENCOLLADA_SKIP" = true ]; then
+ WARNING "Skipping Embree installation, as requested..."
+ elif [ "$EMBREE_FORCE_BUILD" = true ]; then
+ INFO "Forced Embree building, as requested..."
+ _do_compile_embree=true
+ else
+ # No package...
+ _do_compile_embree=true
+ fi
+
+ if [ "$_do_compile_embree" = true ]; then
+ compile_Embree
+ fi
+ fi
PRINT ""
if [ "$FFMPEG_SKIP" = true ]; then
@@ -3627,7 +3810,7 @@ install_ARCH() {
fi
# These libs should always be available in arch official repository...
- OPENJPEG_DEV="openjpeg"
+ OPENJPEG_DEV="openjpeg2"
VORBIS_DEV="libvorbis"
OGG_DEV="libogg"
THEORA_DEV="libtheora"
@@ -3733,6 +3916,7 @@ install_ARCH() {
fi
if [ "$_do_compile_python" = true ]; then
+ install_packages_ARCH libffi
compile_Python
PRINT ""
if [ "$NUMPY_SKIP" = true ]; then
@@ -3823,11 +4007,11 @@ install_ARCH() {
INFO "Forced LLVM building, as requested..."
_do_compile_llvm=true
else
- check_package_version_match_ARCH llvm35 $LLVM_VERSION_MIN
+ check_package_version_match_ARCH llvm $LLVM_VERSION_MIN
if [ $? -eq 0 ]; then
- install_packages_ARCH llvm35 clang35
+ install_packages_ARCH llvm clang
have_llvm=true
- LLVM_VERSION=`get_package_version_ARCH llvm35`
+ LLVM_VERSION=`get_package_version_ARCH llvm`
LLVM_VERSION_FOUND=$LLVM_VERSION
clean_LLVM
else
@@ -3945,6 +4129,28 @@ install_ARCH() {
fi
fi
+ if [ "$WITH_EMBREE" = true ]; then
+ PRINT ""
+ _do_compile_embree=false
+ if [ "$EMBREE_SKIP" = true ]; then
+ WARNING "Skipping Embree installation, as requested..."
+ elif [ "$EMBREE_FORCE_BUILD" = true ]; then
+ INFO "Forced Embree building, as requested..."
+ _do_compile_embree=true
+ else
+ check_package_ARCH embree
+ if [ $? -eq 0 ]; then
+ install_packages_ARCH embree
+ clean_Embree
+ else
+ _do_compile_embree=true
+ fi
+ fi
+
+ if [ "$_do_compile_embree" = true ]; then
+ compile_Embree
+ fi
+ fi
PRINT ""
if [ "$FFMPEG_SKIP" = true ]; then
@@ -4116,6 +4322,21 @@ install_OTHER() {
fi
fi
+ if [ "$WITH_EMBREE" = true ]; then
+ _do_compile_embree=false
+ PRINT ""
+ if [ "$EMBREE_SKIP" = true ]; then
+ WARNING "Skipping Embree installation, as requested..."
+ elif [ "$EMBREE_FORCE_BUILD" = true ]; then
+ INFO "Forced Embree building, as requested..."
+ _do_compile_embree=true
+ fi
+
+ if [ "$_do_compile_embree" = true ]; then
+ PRINT ""
+ compile_Embree
+ fi
+ fi
PRINT ""
if [ "$FFMPEG_SKIP" = true ]; then
@@ -4311,6 +4532,12 @@ print_info() {
_buildargs="$_buildargs $_1"
fi
+ if [ "$WITH_EMBREE" = true ]; then
+ _1="-D WITH_CYCLES_EMBREE=ON"
+ PRINT " $_1"
+ _buildargs="$_buildargs $_1"
+ fi
+
if [ "$WITH_JACK" = true ]; then
_1="-D WITH_JACK=ON"
_2="-D WITH_JACK_DYNLOAD=ON"
@@ -4352,6 +4579,10 @@ print_info() {
PRINT ""
PRINT "Or even simpler, just run (in your blender-source dir):"
PRINT " make -j$THREADS BUILD_CMAKE_ARGS=\"$_buildargs\""
+
+ PRINT ""
+ PRINT "Or in all your build directories:"
+ PRINT " cmake $_buildargs ."
}
#### "Main" ####
diff --git a/build_files/build_environment/patches/ffi.diff b/build_files/build_environment/patches/ffi.diff
new file mode 100644
index 00000000000..84e7f0407e2
--- /dev/null
+++ b/build_files/build_environment/patches/ffi.diff
@@ -0,0 +1,11 @@
+--- Makefile.in 2014-11-12 06:59:58.000000000 -0500
++++ Makefile.in 2018-09-17 13:36:10.974086554 -0400
+@@ -600,7 +600,7 @@
+ target_os = @target_os@
+ target_vendor = @target_vendor@
+ toolexecdir = @toolexecdir@
+-toolexeclibdir = @toolexeclibdir@
++toolexeclibdir = $(libdir)
+ top_build_prefix = @top_build_prefix@
+ top_builddir = @top_builddir@
+ top_srcdir = @top_srcdir@
diff --git a/build_files/build_environment/patches/install_deps_llvm.diff b/build_files/build_environment/patches/install_deps_llvm.diff
deleted file mode 100644
index 968f011e57c..00000000000
--- a/build_files/build_environment/patches/install_deps_llvm.diff
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -14,7 +14,7 @@
- set(LLVM_VERSION_MINOR 4)
-
- if (NOT PACKAGE_VERSION)
-- set(PACKAGE_VERSION "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}svn")
-+ set(PACKAGE_VERSION "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")
- endif()
-
- option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in the 'install' target." OFF)
diff --git a/build_files/build_environment/patches/install_deps_osl.diff b/build_files/build_environment/patches/install_deps_osl.diff
deleted file mode 100644
index 3b52403f740..00000000000
--- a/build_files/build_environment/patches/install_deps_osl.diff
+++ /dev/null
@@ -1,12 +0,0 @@
---- a/src/shaders/CMakeLists.txt
-+++ b/src/shaders/CMakeLists.txt
-@@ -27,7 +27,7 @@ macro (osl_compile oslsrc objlist headers)
- message (STATUS "cmd: ${CMAKE_CURRENT_BINARY_DIR}/../oslc/oslc ${oslsrc}")
- endif ()
- add_custom_command (OUTPUT ${osofile}
-- COMMAND "${CMAKE_CURRENT_BINARY_DIR}/../oslc/oslc" ${oslsrc}
-+ COMMAND "${CMAKE_CURRENT_BINARY_DIR}/../oslc/oslc" "-o" ${osofile} ${oslsrc}
- MAIN_DEPENDENCY ${oslsrc}
- DEPENDS ${${headers}} ${oslsrc} "${CMAKE_CURRENT_BINARY_DIR}/stdosl.h" "${CMAKE_CURRENT_BINARY_DIR}/../oslc/oslc"
- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
-
diff --git a/build_files/build_environment/patches/opencolorio.diff b/build_files/build_environment/patches/opencolorio.diff
index 65901f969ca..c76c62c1057 100644
--- a/build_files/build_environment/patches/opencolorio.diff
+++ b/build_files/build_environment/patches/opencolorio.diff
@@ -11,3 +11,23 @@ index 1eb691b..cff9bd8 100644
endif()
# SHARED
+--- a/CMakeLists.txt 2018-09-10 22:15:29.000000000 +0200
++++ b/CMakeLists.txt 2018-09-10 22:17:40.000000000 +0200
+@@ -229,7 +229,7 @@
+ PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-whitespace ${TINYXML_PATCHFILE}
+ BINARY_DIR ext/build/tinyxml
+ INSTALL_DIR ext/dist
+- CMAKE_ARGS ${TINYXML_CMAKE_ARGS}
++ CMAKE_ARGS ${TINYXML_CMAKE_ARGS} -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG} -DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE} -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG} -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
+ )
+ if(WIN32)
+ set(TINYXML_STATIC_LIBRARIES ${PROJECT_BINARY_DIR}/ext/dist/lib/tinyxml.lib)
+@@ -343,7 +343,7 @@
+ PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-whitespace ${YAML_CPP_PATCHFILE}
+ BINARY_DIR ext/build/yaml-cpp
+ INSTALL_DIR ext/dist
+- CMAKE_ARGS ${YAML_CPP_CMAKE_ARGS}
++ CMAKE_ARGS ${YAML_CPP_CMAKE_ARGS} -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG} -DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE} -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG} -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
+ )
+ set(YAML_CPP_INCLUDE_DIRS ${PROJECT_BINARY_DIR}/ext/dist/include)
+ set(YAML_CPP_LIBRARY_DIRS ${PROJECT_BINARY_DIR}/ext/dist/lib)
diff --git a/build_files/build_environment/patches/sdl.diff b/build_files/build_environment/patches/sdl.diff
index d0a3bca863d..742183ecb4c 100644
--- a/build_files/build_environment/patches/sdl.diff
+++ b/build_files/build_environment/patches/sdl.diff
@@ -1,4 +1,4 @@
-diff -ru /Users/brecht/dev/lib/deps/Downloads/SDL2-2.0.4/src/video/SDL_video.c ./src/video/SDL_video.c
+diff -ru ./src/video/SDL_video.c ./src/video/SDL_video.c
--- CMakeLists.txt.old 2016-01-02 12:56:31 -0700
+++ CMakeLists.txt 2016-10-03 11:24:24 -0600
@@ -609,7 +609,7 @@
@@ -10,3 +10,23 @@ diff -ru /Users/brecht/dev/lib/deps/Downloads/SDL2-2.0.4/src/video/SDL_video.c .
if(HAVE_LIBICONV)
list(APPEND EXTRA_LIBS iconv)
set(HAVE_ICONV 1)
+--- src/video/SDL_video.c 2018-09-10 23:27:57.000000000 +0200
++++ src/video/SDL_video.c 2018-09-10 23:28:09.000000000 +0200
+@@ -1176,7 +1176,7 @@
+ return 0;
+ }
+
+-#ifdef __MACOSX__
++#if defined(__MACOSX__) && SDL_VIDEO_DRIVER_COCOA
+ /* if the window is going away and no resolution change is necessary,
+ do nothing, or else we may trigger an ugly double-transition
+ */
+@@ -2563,7 +2563,7 @@
+ return SDL_FALSE;
+ }
+
+-#ifdef __MACOSX__
++#if defined(__MACOSX__) && SDL_VIDEO_DRIVER_COCOA
+ if (SDL_strcmp(_this->name, "cocoa") == 0) { /* don't do this for X11, etc */
+ if (Cocoa_IsWindowInFullscreenSpace(window)) {
+ return SDL_FALSE;
diff --git a/build_files/build_environment/windows/build_deps.cmd b/build_files/build_environment/windows/build_deps.cmd
index 500e689cdc8..bb9dda81435 100644
--- a/build_files/build_environment/windows/build_deps.cmd
+++ b/build_files/build_environment/windows/build_deps.cmd
@@ -68,6 +68,8 @@ goto usage
setlocal ENABLEEXTENSIONS
set CMAKE_DEBUG_OPTIONS=-DWITH_OPTIMIZED_DEBUG=On
if "%3" == "debug" set CMAKE_DEBUG_OPTIONS=-DWITH_OPTIMIZED_DEBUG=Off
+set dobuild=1
+if "%4" == "nobuild" set dobuild=0
set SOURCE_DIR=%~dp0\..
set BUILD_DIR=%cd%\build
@@ -117,20 +119,24 @@ cd %Staging%\%BuildDir%%ARCH%R
echo %DATE% %TIME% : Start > %StatusFile%
cmake -G "%CMAKE_BUILDER%" %SOURCE_DIR% -DDOWNLOAD_DIR=%BUILD_DIR%/downloads -DBUILD_MODE=Release -DHARVEST_TARGET=%HARVEST_DIR%/%HARVESTROOT%%VSVER_SHORT%/
echo %DATE% %TIME% : Release Configuration done >> %StatusFile%
-msbuild /m "ll.vcxproj" /p:Configuration=Release /fl /flp:logfile=BlenderDeps_llvm.log;Verbosity=normal
-msbuild /m "BlenderDependencies.sln" /p:Configuration=Release /fl /flp:logfile=BlenderDeps.log;Verbosity=minimal /verbosity:minimal
-echo %DATE% %TIME% : Release Build done >> %StatusFile%
-cmake --build . --target Harvest_Release_Results > Harvest_Release.txt
+if "%dobuild%" == "1" (
+ msbuild /m "ll.vcxproj" /p:Configuration=Release /fl /flp:logfile=BlenderDeps_llvm.log;Verbosity=normal
+ msbuild /m "BlenderDependencies.sln" /p:Configuration=Release /fl /flp:logfile=BlenderDeps.log;Verbosity=minimal /verbosity:minimal
+ echo %DATE% %TIME% : Release Build done >> %StatusFile%
+ cmake --build . --target Harvest_Release_Results > Harvest_Release.txt
+)
echo %DATE% %TIME% : Release Harvest done >> %StatusFile%
cd %BUILD_DIR%
mkdir %STAGING%\%BuildDir%%ARCH%D
cd %Staging%\%BuildDir%%ARCH%D
cmake -G "%CMAKE_BUILDER%" %SOURCE_DIR% -DDOWNLOAD_DIR=%BUILD_DIR%/downloads -DCMAKE_BUILD_TYPE=Debug -DBUILD_MODE=Debug -DHARVEST_TARGET=%HARVEST_DIR%/%HARVESTROOT%%VSVER_SHORT%/ %CMAKE_DEBUG_OPTIONS%
echo %DATE% %TIME% : Debug Configuration done >> %StatusFile%
-msbuild /m "ll.vcxproj" /p:Configuration=Debug /fl /flp:logfile=BlenderDeps_llvm.log;;Verbosity=normal
-msbuild /m "BlenderDependencies.sln" /p:Configuration=Debug /verbosity:n /fl /flp:logfile=BlenderDeps.log;;Verbosity=normal
-echo %DATE% %TIME% : Debug Build done >> %StatusFile%
-cmake --build . --target Harvest_Debug_Results> Harvest_Debug.txt
+if "%dobuild%" == "1" (
+ msbuild /m "ll.vcxproj" /p:Configuration=Debug /fl /flp:logfile=BlenderDeps_llvm.log;;Verbosity=normal
+ msbuild /m "BlenderDependencies.sln" /p:Configuration=Debug /verbosity:n /fl /flp:logfile=BlenderDeps.log;;Verbosity=normal
+ echo %DATE% %TIME% : Debug Build done >> %StatusFile%
+ cmake --build . --target Harvest_Debug_Results> Harvest_Debug.txt
+)
echo %DATE% %TIME% : Debug Harvest done >> %StatusFile%
cd %BUILD_DIR%
diff --git a/build_files/buildbot/config/blender_linux.cmake b/build_files/buildbot/config/blender_linux.cmake
index 71811fd23e2..44048f70135 100644
--- a/build_files/buildbot/config/blender_linux.cmake
+++ b/build_files/buildbot/config/blender_linux.cmake
@@ -1,6 +1,6 @@
# ######## Global feature set settings ########
-include("${CMAKE_CURRENT_LIST_DIR}/../../cmake/config/blender_full.cmake")
+include("${CMAKE_CURRENT_LIST_DIR}/../../cmake/config/blender_release.cmake")
# Detect which libc we'll be linking against.
# Some of the paths will depend on this
@@ -171,10 +171,6 @@ set(PYTHON_VERSION 3.7 CACHE BOOL "" FORCE)
set(Boost_USE_STATIC_LIBS ON CACHE BOOL "" FORCE)
-# TODO(sergey): Move up to the rest of WITH_SYSTEM and DYNLOAD configuration,
-# once old chroot is officially retired.
-set(WITH_SYSTEM_OPENJPEG ON CACHE BOOL "" FORCE)
-
# We need to link OpenCOLLADA against PCRE library. Even though it is not installed
# on /usr, we do not really care -- all we care is PCRE_FOUND be TRUE and its
# library pointing to a valid one.
@@ -184,4 +180,4 @@ set(PCRE_LIBRARY "${LIBDIR}/opencollada/lib/libpcre.a" CACHE STRING
endif()
# Additional linking libraries
-set(CMAKE_EXE_LINKER_FLAGS "-lrt -static-libstdc++" CACHE STRING "" FORCE)
+set(CMAKE_EXE_LINKER_FLAGS "-lrt -static-libstdc++ -no-pie" CACHE STRING "" FORCE)
diff --git a/build_files/buildbot/slave_compile.py b/build_files/buildbot/slave_compile.py
index ce4d0c8de66..61ce11bbe0c 100644
--- a/build_files/buildbot/slave_compile.py
+++ b/build_files/buildbot/slave_compile.py
@@ -59,7 +59,7 @@ if 'cmake' in builder:
bits = 64
# Config file to be used (relative to blender's sources root)
- cmake_config_file = "build_files/cmake/config/blender_full.cmake"
+ cmake_config_file = "build_files/cmake/config/blender_release.cmake"
cmake_cuda_config_file = None
# Set build options.
diff --git a/build_files/cmake/Modules/FindEmbree.cmake b/build_files/cmake/Modules/FindEmbree.cmake
new file mode 100644
index 00000000000..d3ef8c6eb4c
--- /dev/null
+++ b/build_files/cmake/Modules/FindEmbree.cmake
@@ -0,0 +1,108 @@
+# - Find Embree library
+# Find the native Embree includes and library
+# This module defines
+# EMBREE_INCLUDE_DIRS, where to find rtcore.h, Set when
+# EMBREE_INCLUDE_DIR is found.
+# EMBREE_LIBRARIES, libraries to link against to use Embree.
+# EMBREE_ROOT_DIR, The base directory to search for Embree.
+# This can also be an environment variable.
+# EMBREEFOUND, If false, do not try to use Embree.
+#
+# also defined, but not for general use are
+# EMBREE_LIBRARY, where to find the Embree library.
+
+#=============================================================================
+# Copyright 2018 Blender Foundation.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+
+# If EMBREE_ROOT_DIR was defined in the environment, use it.
+IF(NOT EMBREE_ROOT_DIR AND NOT $ENV{EMBREE_ROOT_DIR} STREQUAL "")
+ SET(EMBREE_ROOT_DIR $ENV{EMBREE_ROOT_DIR})
+ENDIF()
+
+SET(_embree_SEARCH_DIRS
+ ${EMBREE_ROOT_DIR}
+ /usr/local
+ /sw # Fink
+ /opt/local # DarwinPorts
+ /opt/embree
+ /opt/lib/embree
+)
+
+FIND_PATH(EMBREE_INCLUDE_DIR
+ NAMES
+ embree3/rtcore.h
+ HINTS
+ ${_embree_SEARCH_DIRS}
+ PATH_SUFFIXES
+ include
+)
+
+
+SET(_embree_FIND_COMPONENTS
+ embree_avx
+ embree_avx2
+ embree_sse42
+ embree3
+ lexers
+ math
+ simd
+ sys
+ tasking
+)
+
+SET(_embree_LIBRARIES)
+FOREACH(COMPONENT ${_embree_FIND_COMPONENTS})
+ STRING(TOUPPER ${COMPONENT} UPPERCOMPONENT)
+
+ FIND_LIBRARY(EMBREE_${UPPERCOMPONENT}_LIBRARY
+ NAMES
+ ${COMPONENT}
+ HINTS
+ ${_embree_SEARCH_DIRS}
+ PATH_SUFFIXES
+ lib64 lib
+ )
+ LIST(APPEND _embree_LIBRARIES "${EMBREE_${UPPERCOMPONENT}_LIBRARY}")
+ENDFOREACH()
+
+
+FIND_LIBRARY(EMBREE_LIBRARY
+ NAMES
+ libembree3
+ HINTS
+ ${_embree_SEARCH_DIRS}
+ PATH_SUFFIXES
+ lib64 lib
+)
+
+# handle the QUIETLY and REQUIRED arguments and set EMBREE_FOUND to TRUE if
+# all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(EMBREE DEFAULT_MSG
+ _embree_LIBRARIES EMBREE_INCLUDE_DIR)
+
+IF(EMBREE_FOUND)
+ SET(EMBREE_LIBRARIES ${_embree_LIBRARIES})
+ SET(EMBREE_INCLUDE_DIRS ${EMBREE_INCLUDE_DIR})
+ENDIF(EMBREE_FOUND)
+
+MARK_AS_ADVANCED(
+ EMBREE_INCLUDE_DIR
+)
+
+FOREACH(COMPONENT ${_embree_FIND_COMPONENTS})
+ STRING(TOUPPER ${COMPONENT} UPPERCOMPONENT)
+ MARK_AS_ADVANCED(EMBREE_${UPPERCOMPONENT}_LIBRARY)
+ENDFOREACH()
+
+UNSET(_embree_SEARCH_DIRS)
+UNSET(_embree_FIND_COMPONENTS)
+UNSET(_embree_LIBRARIES)
diff --git a/build_files/cmake/Modules/FindJeMalloc.cmake b/build_files/cmake/Modules/FindJeMalloc.cmake
index 506892b34ba..0abe103cd2e 100644
--- a/build_files/cmake/Modules/FindJeMalloc.cmake
+++ b/build_files/cmake/Modules/FindJeMalloc.cmake
@@ -53,6 +53,15 @@ FIND_LIBRARY(JEMALLOC_LIBRARY
lib64 lib
)
+if(JEMALLOC_INCLUDE_DIR)
+ SET(_version_regex "^#define[ \t]+JEMALLOC_VERSION[ \t]+\"([^\"]+)\".*")
+ file(STRINGS "${JEMALLOC_INCLUDE_DIR}/jemalloc.h"
+ JEMALLOC_VERSION REGEX "${_version_regex}")
+ string(REGEX REPLACE "${_version_regex}" "\\1"
+ JEMALLOC_VERSION "${JEMALLOC_VERSION}")
+ unset(_version_regex)
+endif()
+
# handle the QUIETLY and REQUIRED arguments and set JEMALLOC_FOUND to TRUE if
# all listed variables are TRUE
INCLUDE(FindPackageHandleStandardArgs)
diff --git a/build_files/cmake/Modules/FindOpenColorIO.cmake b/build_files/cmake/Modules/FindOpenColorIO.cmake
index 1d26d6b0f86..218b5f721bc 100644
--- a/build_files/cmake/Modules/FindOpenColorIO.cmake
+++ b/build_files/cmake/Modules/FindOpenColorIO.cmake
@@ -60,7 +60,7 @@ FOREACH(COMPONENT ${_opencolorio_FIND_COMPONENTS})
HINTS
${_opencolorio_SEARCH_DIRS}
PATH_SUFFIXES
- lib64 lib
+ lib64 lib lib64/static lib/static
)
IF(OPENCOLORIO_${UPPERCOMPONENT}_LIBRARY)
LIST(APPEND _opencolorio_LIBRARIES "${OPENCOLORIO_${UPPERCOMPONENT}_LIBRARY}")
diff --git a/build_files/cmake/Modules/FindOpenJPEG.cmake b/build_files/cmake/Modules/FindOpenJPEG.cmake
index a6c28be6782..0f1d0d0a865 100644
--- a/build_files/cmake/Modules/FindOpenJPEG.cmake
+++ b/build_files/cmake/Modules/FindOpenJPEG.cmake
@@ -41,12 +41,21 @@ FIND_PATH(OPENJPEG_INCLUDE_DIR
${_openjpeg_SEARCH_DIRS}
PATH_SUFFIXES
include
- include/openjpeg-1.5
+ # Support future versions
+ openjpeg-2.9
+ openjpeg-2.8
+ openjpeg-2.7
+ openjpeg-2.6
+ openjpeg-2.5
+ openjpeg-2.4
+ openjpeg-2.3
+ openjpeg-2.2
+ openjpeg-2.1
+ openjpeg-2.0
)
FIND_LIBRARY(OPENJPEG_LIBRARY
NAMES
- openjpeg
openjp2
HINTS
${_openjpeg_SEARCH_DIRS}
diff --git a/build_files/cmake/Modules/FindPCRE.cmake b/build_files/cmake/Modules/FindPCRE.cmake
index 20b5c1d5c28..1fd56dc1234 100644
--- a/build_files/cmake/Modules/FindPCRE.cmake
+++ b/build_files/cmake/Modules/FindPCRE.cmake
@@ -56,8 +56,13 @@ INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(PCRE DEFAULT_MSG
PCRE_LIBRARY PCRE_INCLUDE_DIR)
+# With 'make deps' precompiled libs, opencollada ships with a copy of libpcre
+# but not the headers, ${PCRE_LIBRARY} will be valid in this case
+# but PCRE_FOUND will be FALSE. So we set this variable outside of
+# the IF(PCRE_FOUND) below to allow blender to successfully link.
+SET(PCRE_LIBRARIES ${PCRE_LIBRARY})
+
IF(PCRE_FOUND)
- SET(PCRE_LIBRARIES ${PCRE_LIBRARY})
SET(PCRE_INCLUDE_DIRS ${PCRE_INCLUDE_DIR})
ENDIF(PCRE_FOUND)
diff --git a/build_files/cmake/Modules/FindPythonLibsUnix.cmake b/build_files/cmake/Modules/FindPythonLibsUnix.cmake
index a6924972e42..84e1fbdb35c 100644
--- a/build_files/cmake/Modules/FindPythonLibsUnix.cmake
+++ b/build_files/cmake/Modules/FindPythonLibsUnix.cmake
@@ -75,7 +75,7 @@ SET(_python_SEARCH_DIRS
"/opt/lib/python-${PYTHON_VERSION}"
)
-# only search for the dirs if we havn't already
+# only search for the dirs if we haven't already
IF((NOT _IS_INC_DEF) OR (NOT _IS_INC_CONF_DEF) OR (NOT _IS_LIB_DEF) OR (NOT _IS_LIB_PATH_DEF))
SET(_PYTHON_ABI_FLAGS_TEST
"m;mu;u; " # release
diff --git a/build_files/cmake/clang_array_check.py b/build_files/cmake/clang_array_check.py
index 6eaaebce52f..ad7974e2176 100644
--- a/build_files/cmake/clang_array_check.py
+++ b/build_files/cmake/clang_array_check.py
@@ -130,7 +130,7 @@ def function_parm_wash_tokens(parm):
)
"""
- Return tolens without trailing commads and 'const'
+ Return tolens without trailing commands and 'const'
"""
tokens = [t for t in parm.get_tokens()]
diff --git a/build_files/cmake/cmake_consistency_check.py b/build_files/cmake/cmake_consistency_check.py
index 443657532de..ab87095874f 100755
--- a/build_files/cmake/cmake_consistency_check.py
+++ b/build_files/cmake/cmake_consistency_check.py
@@ -285,7 +285,7 @@ def main():
ignore_used = [False] * len(IGNORE)
# now check on files not accounted for.
- print("\nC/C++ Files CMake doesnt know about...")
+ print("\nC/C++ Files CMake does not know about...")
for cf in sorted(source_list(SOURCE_DIR, is_c)):
if not is_ignore(cf, ignore_used):
if cf not in global_c:
@@ -302,7 +302,7 @@ def main():
print("bad_c: ", cf)
'''
- print("\nC/C++ Headers CMake doesnt know about...")
+ print("\nC/C++ Headers CMake does not know about...")
for hf in sorted(source_list(SOURCE_DIR, is_c_header)):
if not is_ignore(hf, ignore_used):
if hf not in global_h:
diff --git a/build_files/cmake/cmake_netbeans_project.py b/build_files/cmake/cmake_netbeans_project.py
index 97eb6b245f5..02a800fe6f1 100755
--- a/build_files/cmake/cmake_netbeans_project.py
+++ b/build_files/cmake/cmake_netbeans_project.py
@@ -71,7 +71,7 @@ def create_nb_project_main():
if (includes, defines) == (None, None):
return
- # for some reason it doesnt give all internal includes
+ # for some reason it doesn't give all internal includes
includes = list(set(includes) | set(dirname(f) for f in files if is_c_header(f)))
includes.sort()
diff --git a/build_files/cmake/cmake_print_build_options.py b/build_files/cmake/cmake_print_build_options.py
new file mode 100644
index 00000000000..fb7a5b33bf0
--- /dev/null
+++ b/build_files/cmake/cmake_print_build_options.py
@@ -0,0 +1,25 @@
+# Apache License, Version 2.0
+
+# Simple utility that prints all WITH_* options in a CMakeLists.txt
+# Called by 'make help_features'
+
+import re
+import sys
+
+cmakelists_file = sys.argv[-1]
+
+def main():
+ options = []
+ for l in open(cmakelists_file, 'r').readlines():
+ if not l.lstrip().startswith('#'):
+ l_option = re.sub(r'.*\boption\s*\(\s*(WITH_[a-zA-Z0-9_]+)\s+\"(.*)\"\s*.*', r'\g<1> - \g<2>', l)
+ if l_option != l:
+ l_option = l_option.strip()
+ if l_option.startswith('WITH_'):
+ options.append(l_option)
+
+ print('\n'.join(options))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/build_files/cmake/cmake_qtcreator_project.py b/build_files/cmake/cmake_qtcreator_project.py
index 231784df588..ee9f2e3f58e 100755
--- a/build_files/cmake/cmake_qtcreator_project.py
+++ b/build_files/cmake/cmake_qtcreator_project.py
@@ -85,7 +85,7 @@ def create_qtc_project_main(name):
if (includes, defines) == (None, None):
return
- # for some reason it doesnt give all internal includes
+ # for some reason it doesn't give all internal includes
includes = list(set(includes) | set(os.path.dirname(f)
for f in files_rel if is_c_header(f)))
includes.sort()
diff --git a/build_files/cmake/config/blender_full.cmake b/build_files/cmake/config/blender_full.cmake
index 62a26d27834..e645fcf4932 100644
--- a/build_files/cmake/config/blender_full.cmake
+++ b/build_files/cmake/config/blender_full.cmake
@@ -1,4 +1,4 @@
-# Turn everything ON thats expected for an official release builds.
+# Turn everything ON that's expected for an official release builds.
#
# Example usage:
# cmake -C../blender/build_files/cmake/config/blender_full.cmake ../blender
diff --git a/build_files/cmake/config/blender_headless.cmake b/build_files/cmake/config/blender_headless.cmake
index 73b43272643..a07a3a7f66c 100644
--- a/build_files/cmake/config/blender_headless.cmake
+++ b/build_files/cmake/config/blender_headless.cmake
@@ -8,7 +8,7 @@
set(WITH_HEADLESS ON CACHE BOOL "" FORCE)
# disable audio, its possible some devs may want this but for now disable
-# so the python module doesnt hold the audio device and loads quickly.
+# so the python module doesn't hold the audio device and loads quickly.
set(WITH_AUDASPACE OFF CACHE BOOL "" FORCE)
set(WITH_FFTW3 OFF CACHE BOOL "" FORCE)
set(WITH_JACK OFF CACHE BOOL "" FORCE)
diff --git a/build_files/cmake/config/blender_release.cmake b/build_files/cmake/config/blender_release.cmake
index 08272cef9f6..8edbd1b9b85 100644
--- a/build_files/cmake/config/blender_release.cmake
+++ b/build_files/cmake/config/blender_release.cmake
@@ -1,10 +1,11 @@
-# Turn everything ON thats expected for an official release builds.
+# Turn everything ON that's expected for an official release builds.
#
# Example usage:
# cmake -C../blender/build_files/cmake/config/blender_release.cmake ../blender
#
set(WITH_ALEMBIC ON CACHE BOOL "" FORCE)
+set(WITH_ASSERT_ABORT OFF CACHE BOOL "" FORCE)
set(WITH_BUILDINFO ON CACHE BOOL "" FORCE)
set(WITH_BULLET ON CACHE BOOL "" FORCE)
set(WITH_CODEC_AVI ON CACHE BOOL "" FORCE)
diff --git a/build_files/cmake/config/bpy_module.cmake b/build_files/cmake/config/bpy_module.cmake
index 2371d3f0d76..64f7f78a286 100644
--- a/build_files/cmake/config/bpy_module.cmake
+++ b/build_files/cmake/config/bpy_module.cmake
@@ -13,7 +13,7 @@ set(WITH_INSTALL_PORTABLE OFF CACHE BOOL "" FORCE)
set(WITH_PYTHON_INSTALL OFF CACHE BOOL "" FORCE)
# disable audio, its possible some devs may want this but for now disable
-# so the python module doesnt hold the audio device and loads quickly.
+# so the python module doesn't hold the audio device and loads quickly.
set(WITH_AUDASPACE OFF CACHE BOOL "" FORCE)
set(WITH_FFTW3 OFF CACHE BOOL "" FORCE)
set(WITH_JACK OFF CACHE BOOL "" FORCE)
diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index e7515f9d14f..35ed4975514 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -199,7 +199,7 @@ endfunction()
# Support per-target CMake flags
# Read from: CMAKE_C_FLAGS_**** (made upper case) when set.
#
-# 'name' should alway match the target name,
+# 'name' should always match the target name,
# use this macro before add_library or add_executable.
#
# Optionally takes an arg passed to set(), eg PARENT_SCOPE.
@@ -435,6 +435,9 @@ function(setup_liblinks
if(WITH_CYCLES_OSL)
target_link_libraries(${target} ${OSL_LIBRARIES})
endif()
+ if(WITH_CYCLES_EMBREE)
+ target_link_libraries(${target} ${EMBREE_LIBRARIES})
+ endif()
if(WITH_BOOST)
target_link_libraries(${target} ${BOOST_LIBRARIES})
if(Boost_USE_STATIC_LIBS AND Boost_USE_ICU)
@@ -448,7 +451,7 @@ function(setup_liblinks
if(WITH_IMAGE_OPENEXR)
target_link_libraries(${target} ${OPENEXR_LIBRARIES})
endif()
- if(WITH_IMAGE_OPENJPEG AND WITH_SYSTEM_OPENJPEG)
+ if(WITH_IMAGE_OPENJPEG)
target_link_libraries(${target} ${OPENJPEG_LIBRARIES})
endif()
if(WITH_CODEC_FFMPEG)
@@ -509,7 +512,7 @@ function(setup_liblinks
target_link_libraries(${target} ${GFLAGS_LIBRARIES})
endif()
- # We put CLEW and CUEW here because OPENSUBDIV_LIBRARIES dpeends on them..
+ # We put CLEW and CUEW here because OPENSUBDIV_LIBRARIES depends on them..
if(WITH_CYCLES OR WITH_COMPOSITOR OR WITH_OPENSUBDIV)
target_link_libraries(${target} "extern_clew")
if(WITH_CUDA_DYNLOAD)
@@ -595,7 +598,6 @@ function(SETUP_BLENDER_SORTED_LIBS)
bf_editor_space_clip
bf_editor_transform
- bf_editor_util
bf_editor_uvedit
bf_editor_curve
bf_editor_interface
@@ -616,6 +618,7 @@ function(SETUP_BLENDER_SORTED_LIBS)
bf_editor_datafiles
bf_editor_mask
bf_editor_io
+ bf_editor_util
bf_render
bf_python
@@ -656,26 +659,11 @@ function(SETUP_BLENDER_SORTED_LIBS)
bf_intern_guardedalloc
bf_intern_ctr
bf_intern_utfconv
- ge_blen_routines
- ge_converter
- ge_phys_dummy
- ge_phys_bullet
bf_intern_smoke
extern_lzma
extern_curve_fit_nd
- ge_logic_ketsji
- extern_recastnavigation
- ge_logic
- ge_rasterizer
- ge_oglrasterizer
- ge_logic_expressions
- ge_scenegraph
- ge_logic_network
- ge_logic_ngnetwork
- ge_logic_loopbacknetwork
bf_intern_moto
extern_openjpeg
- ge_videotex
bf_dna
bf_blenfont
@@ -687,10 +675,10 @@ function(SETUP_BLENDER_SORTED_LIBS)
bf_intern_mikktspace
bf_intern_dualcon
bf_intern_cycles
+ cycles_device
cycles_render
cycles_graph
cycles_bvh
- cycles_device
cycles_kernel
cycles_util
cycles_subd
@@ -770,7 +758,7 @@ function(SETUP_BLENDER_SORTED_LIBS)
endif()
if(WITH_BULLET AND NOT WITH_SYSTEM_BULLET)
- list_insert_after(BLENDER_SORTED_LIBS "ge_logic_ngnetwork" "extern_bullet")
+ list_insert_after(BLENDER_SORTED_LIBS "extern_openjpeg" "extern_bullet")
endif()
if(WIN32)
@@ -1214,7 +1202,11 @@ function(delayed_do_install
foreach(i RANGE ${n})
list(GET files ${i} f)
list(GET destinations ${i} d)
- install(FILES ${f} DESTINATION ${targetdir}/${d})
+ if(NOT IS_ABSOLUTE ${d})
+ install(FILES ${f} DESTINATION ${targetdir}/${d})
+ else()
+ install(FILES ${f} DESTINATION ${d})
+ endif()
endforeach()
endif()
endfunction()
@@ -1251,6 +1243,8 @@ function(data_to_c_simple
get_filename_component(_file_to ${CMAKE_CURRENT_BINARY_DIR}/${file_from}.c REALPATH)
list(APPEND ${list_to_add} ${_file_to})
+ source_group(Generated FILES ${_file_to})
+ list(APPEND ${list_to_add} ${file_from})
set(${list_to_add} ${${list_to_add}} PARENT_SCOPE)
get_filename_component(_file_to_path ${_file_to} PATH)
diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake
index c2c2efd0fc9..bbd1b1fcac6 100644
--- a/build_files/cmake/platform/platform_apple.cmake
+++ b/build_files/cmake/platform/platform_apple.cmake
@@ -87,8 +87,8 @@ if(WITH_CODEC_SNDFILE)
endif()
if(WITH_PYTHON)
- # we use precompiled libraries for py 3.5 and up by default
- set(PYTHON_VERSION 3.6)
+ # we use precompiled libraries for py 3.7 and up by default
+ set(PYTHON_VERSION 3.7)
if(NOT WITH_PYTHON_MODULE AND NOT WITH_PYTHON_FRAMEWORK)
# normally cached but not since we include them with blender
set(PYTHON_INCLUDE_DIR "${LIBDIR}/python/include/python${PYTHON_VERSION}m")
@@ -114,7 +114,7 @@ if(WITH_PYTHON)
set(PYTHON_LIBRARIES "${PYTHON_LIBRARY}")
# needed for Audaspace, numpy is installed into python site-packages
- set(NUMPY_INCLUDE_DIRS "${PYTHON_LIBPATH}/site-packages/numpy/core/include")
+ set(PYTHON_NUMPY_INCLUDE_DIRS "${PYTHON_LIBPATH}/site-packages/numpy/core/include")
if(NOT EXISTS "${PYTHON_EXECUTABLE}")
message(FATAL_ERROR "Python executable missing: ${PYTHON_EXECUTABLE}")
@@ -144,13 +144,12 @@ if(WITH_IMAGE_OPENEXR)
set(OPENEXR ${LIBDIR}/openexr)
set(OPENEXR_INCLUDE_DIR ${OPENEXR}/include)
set(OPENEXR_INCLUDE_DIRS ${OPENEXR_INCLUDE_DIR} ${OPENEXR}/include/OpenEXR)
- set(OPENEXR_POSTFIX -2_2)
set(OPENEXR_LIBRARIES
- Iex${OPENEXR_POSTFIX}
+ Iex
Half
- IlmImf${OPENEXR_POSTFIX}
- Imath${OPENEXR_POSTFIX}
- IlmThread${OPENEXR_POSTFIX})
+ IlmImf
+ Imath
+ IlmThread)
set(OPENEXR_LIBPATH ${OPENEXR}/lib)
endif()
@@ -159,23 +158,18 @@ if(WITH_CODEC_FFMPEG)
set(FFMPEG_INCLUDE_DIRS ${FFMPEG}/include)
set(FFMPEG_LIBRARIES
avcodec avdevice avformat avutil
- mp3lame swscale x264 xvidcore theora theoradec theoraenc vorbis vorbisenc vorbisfile ogg
- )
- # commenting out until libs are updated on svn. schroedinger and orc
- # will be removed then
- # set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} vpx webp swresample)
- set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} schroedinger orc vpx webp swresample)
+ mp3lame swscale x264 xvidcore
+ theora theoradec theoraenc
+ vorbis vorbisenc vorbisfile ogg
+ vpx swresample)
set(FFMPEG_LIBPATH ${FFMPEG}/lib)
endif()
if(WITH_IMAGE_OPENJPEG OR WITH_CODEC_FFMPEG)
# use openjpeg from libdir that is linked into ffmpeg
set(OPENJPEG ${LIBDIR}/openjpeg)
- set(WITH_SYSTEM_OPENJPEG ON)
set(OPENJPEG_INCLUDE_DIRS ${OPENJPEG}/include)
- # same as with ffmpeg libs, update when svn are updated
- #set(OPENJPEG_LIBRARIES ${OPENJPEG}/lib/libopenjp2.a)
- set(OPENJPEG_LIBRARIES ${OPENJPEG}/lib/libopenjpeg.a)
+ set(OPENJPEG_LIBRARIES ${OPENJPEG}/lib/libopenjp2.a)
endif()
find_library(SYSTEMSTUBS_LIBRARY
@@ -223,17 +217,14 @@ if(WITH_OPENCOLLADA)
-lOpenCOLLADAStreamWriter
-lMathMLSolver
-lGeneratedSaxParser
- -lxml2 -lbuffer -lftoa
+ -lbuffer -lftoa -lUTF
+ ${OPENCOLLADA_LIBPATH}/libxml2.a
)
- # Use UTF functions from collada if LLVM is not enabled
- if(NOT WITH_LLVM)
- list(APPEND OPENCOLLADA_LIBRARIES -lUTF)
- endif()
- # pcre is bundled with openCollada
+ # PCRE is bundled with openCollada
#set(PCRE ${LIBDIR}/pcre)
#set(PCRE_LIBPATH ${PCRE}/lib)
set(PCRE_LIBRARIES pcre)
- #libxml2 is used
+ # libxml2 is used
#set(EXPAT ${LIBDIR}/expat)
#set(EXPAT_LIBPATH ${EXPAT}/lib)
set(EXPAT_LIB)
@@ -303,7 +294,6 @@ if(WITH_OPENIMAGEIO)
${OPENJPEG_LIBRARIES}
${ZLIB_LIBRARIES}
)
- set(OPENIMAGEIO_LIBRARIES ${OPENIMAGEIO_LIBRARIES} ${LIBDIR}/ffmpeg/lib/libwebp.a)
set(OPENIMAGEIO_LIBPATH
${OPENIMAGEIO}/lib
${JPEG_LIBPATH}
@@ -390,6 +380,11 @@ if(WITH_CYCLES_OSL)
endif()
endif()
+if(WITH_CYCLES_EMBREE)
+ find_package(Embree 3.2.4 REQUIRED)
+ set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -Xlinker -stack_size -Xlinker 0x100000")
+endif()
+
if(WITH_OPENMP)
execute_process(COMMAND ${CMAKE_C_COMPILER} --version OUTPUT_VARIABLE COMPILER_VENDOR)
string(SUBSTRING "${COMPILER_VENDOR}" 0 5 VENDOR_NAME) # truncate output
@@ -420,7 +415,7 @@ if(${XCODE_VERSION} VERSION_EQUAL 5 OR ${XCODE_VERSION} VERSION_GREATER 5)
# Xcode 5 is always using CLANG, which has too low template depth of 128 for libmv
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftemplate-depth=1024")
endif()
-# Get rid of eventually clashes, we export some symbols explicite as local
+# Get rid of eventually clashes, we export some symbols explicitly as local
set(PLATFORM_LINKFLAGS
"${PLATFORM_LINKFLAGS} -Xlinker -unexported_symbols_list -Xlinker '${CMAKE_SOURCE_DIR}/source/creator/osx_locals.map'"
)
diff --git a/build_files/cmake/platform/platform_apple_xcode.cmake b/build_files/cmake/platform/platform_apple_xcode.cmake
index 7af69c092cc..04fda25b7f5 100644
--- a/build_files/cmake/platform/platform_apple_xcode.cmake
+++ b/build_files/cmake/platform/platform_apple_xcode.cmake
@@ -83,7 +83,7 @@ if(${XCODE_VERSION} VERSION_LESS 4.3)
# use guaranteed existing sdk
set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX${OSX_SYSTEM}.sdk CACHE PATH "" FORCE)
else()
- # note: xcode-select path could be ambigous,
+ # note: xcode-select path could be ambiguous,
# cause /Applications/Xcode.app/Contents/Developer or /Applications/Xcode.app would be allowed
# so i use a selfcomposed bundlepath here
set(OSX_SYSROOT_PREFIX ${XCODE_BUNDLE}/Contents/Developer/Platforms/MacOSX.platform)
@@ -97,7 +97,7 @@ else()
endif()
if(OSX_SYSTEM MATCHES 10.9)
- # make sure syslibs and headers are looked up in sdk ( expecially for 10.9 openGL atm. )
+ # make sure syslibs and headers are looked up in sdk ( especially for 10.9 openGL atm. )
set(CMAKE_FIND_ROOT_PATH ${CMAKE_OSX_SYSROOT})
endif()
diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake
index fc9e09b73fd..14bcf4090ad 100644
--- a/build_files/cmake/platform/platform_unix.cmake
+++ b/build_files/cmake/platform/platform_unix.cmake
@@ -305,7 +305,7 @@ if(WITH_BOOST)
if(Boost_USE_STATIC_LIBS AND WITH_BOOST_ICU)
find_package(IcuLinux)
endif()
- mark_as_advanced(Boost_DIR) # why doesnt boost do this?
+ mark_as_advanced(Boost_DIR) # why doesn't boost do this?
endif()
set(BOOST_INCLUDE_DIR ${Boost_INCLUDE_DIRS})
@@ -359,6 +359,10 @@ if(WITH_OPENCOLORIO)
endif()
endif()
+if(WITH_CYCLES_EMBREE)
+ find_package(Embree 3.2.4 REQUIRED)
+endif()
+
if(WITH_LLVM)
if(EXISTS ${LIBDIR})
set(LLVM_STATIC ON)
diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake
index 0c1175df39b..8c3ddefa68e 100644
--- a/build_files/cmake/platform/platform_win32.cmake
+++ b/build_files/cmake/platform/platform_win32.cmake
@@ -606,3 +606,67 @@ if(WITH_CYCLES_OSL)
set(WITH_CYCLES_OSL OFF)
endif()
endif()
+
+if(WITH_CYCLES_EMBREE)
+ windows_find_package(Embree)
+ if(NOT EMBREE_FOUND)
+ set(EMBREE_INCLUDE_DIRS ${LIBDIR}/embree/include)
+ set(EMBREE_LIBRARIES
+ optimized ${LIBDIR}/embree/lib/embree3.lib
+ optimized ${LIBDIR}/embree/lib/embree_avx2.lib
+ optimized ${LIBDIR}/embree/lib/embree_avx.lib
+ optimized ${LIBDIR}/embree/lib/embree_sse42.lib
+ optimized ${LIBDIR}/embree/lib/lexers.lib
+ optimized ${LIBDIR}/embree/lib/math.lib
+ optimized ${LIBDIR}/embree/lib/simd.lib
+ optimized ${LIBDIR}/embree/lib/sys.lib
+ optimized ${LIBDIR}/embree/lib/tasking.lib
+
+ debug ${LIBDIR}/embree/lib/embree3_d.lib
+ debug ${LIBDIR}/embree/lib/embree_avx2_d.lib
+ debug ${LIBDIR}/embree/lib/embree_avx_d.lib
+ debug ${LIBDIR}/embree/lib/embree_sse42_d.lib
+ debug ${LIBDIR}/embree/lib/lexers_d.lib
+ debug ${LIBDIR}/embree/lib/math_d.lib
+ debug ${LIBDIR}/embree/lib/simd_d.lib
+ debug ${LIBDIR}/embree/lib/sys_d.lib
+ debug ${LIBDIR}/embree/lib/tasking_d.lib)
+ endif()
+endif()
+
+if (WINDOWS_PYTHON_DEBUG)
+ # Include the system scripts in the blender_python_system_scripts project.
+ FILE(GLOB_RECURSE inFiles "${CMAKE_SOURCE_DIR}/release/scripts/*.*" )
+ ADD_CUSTOM_TARGET(blender_python_system_scripts SOURCES ${inFiles})
+ foreach(_source IN ITEMS ${inFiles})
+ get_filename_component(_source_path "${_source}" PATH)
+ string(REPLACE "${CMAKE_SOURCE_DIR}/release/scripts/" "" _source_path "${_source_path}")
+ string(REPLACE "/" "\\" _group_path "${_source_path}")
+ source_group("${_group_path}" FILES "${_source}")
+ endforeach()
+ # Include the user scripts from the profile folder in the blender_python_user_scripts project.
+ set(USER_SCRIPTS_ROOT "$ENV{appdata}/blender foundation/blender/${BLENDER_VERSION}")
+ file(TO_CMAKE_PATH ${USER_SCRIPTS_ROOT} USER_SCRIPTS_ROOT)
+ FILE(GLOB_RECURSE inFiles "${USER_SCRIPTS_ROOT}/scripts/*.*" )
+ ADD_CUSTOM_TARGET(blender_python_user_scripts SOURCES ${inFiles})
+ foreach(_source IN ITEMS ${inFiles})
+ get_filename_component(_source_path "${_source}" PATH)
+ string(REPLACE "${USER_SCRIPTS_ROOT}/scripts" "" _source_path "${_source_path}")
+ string(REPLACE "/" "\\" _group_path "${_source_path}")
+ source_group("${_group_path}" FILES "${_source}")
+ endforeach()
+ set_target_properties(blender_python_system_scripts PROPERTIES FOLDER "scripts")
+ set_target_properties(blender_python_user_scripts PROPERTIES FOLDER "scripts")
+ # Set the default debugging options for the project, only write this file once so the user
+ # is free to override them at their own perril.
+ set(USER_PROPS_FILE "${CMAKE_CURRENT_BINARY_DIR}/source/creator/blender.Cpp.user.props")
+ if(NOT EXISTS ${USER_PROPS_FILE})
+ # Layout below is messy, because otherwise the generated file will look messy.
+ file(WRITE ${USER_PROPS_FILE} "<?xml version=\"1.0\" encoding=\"utf-8\"?>
+<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">
+ <PropertyGroup>
+ <LocalDebuggerCommandArguments>-con --env-system-scripts \"${CMAKE_SOURCE_DIR}/release/scripts\" </LocalDebuggerCommandArguments>
+ </PropertyGroup>
+</Project>")
+ endif()
+endif()
diff --git a/build_files/utils/build_tgz.sh b/build_files/utils/build_tgz.sh
index c568d17db1c..203e58d5a68 100755
--- a/build_files/utils/build_tgz.sh
+++ b/build_files/utils/build_tgz.sh
@@ -63,7 +63,7 @@ echo "OK"
# Create checksum file
cd "$BASE_DIR"
-echo -n "Createing checksum: \"$BASE_DIR/$TARBALL.md5sum\" ..."
+echo -n "Creating checksum: \"$BASE_DIR/$TARBALL.md5sum\" ..."
md5sum "$TARBALL" > "$TARBALL.md5sum"
echo "OK"
diff --git a/build_files/windows/check_libraries.cmd b/build_files/windows/check_libraries.cmd
index 90c50293720..506728a194f 100644
--- a/build_files/windows/check_libraries.cmd
+++ b/build_files/windows/check_libraries.cmd
@@ -26,7 +26,7 @@ if NOT EXIST %BUILD_VS_LIBDIR% (
:RETRY
"%SVN%" checkout https://svn.blender.org/svnroot/bf-blender/trunk/lib/%BUILD_VS_SVNDIR% %BUILD_VS_LIBDIR%
if errorlevel 1 (
- set /p LibRetry= "Error during donwload, retry? y/n"
+ set /p LibRetry= "Error during download, retry? y/n"
if /I "!LibRetry!"=="Y" (
cd %BUILD_VS_LIBDIR%
"%SVN%" cleanup
diff --git a/build_files/windows/configure_msbuild.cmd b/build_files/windows/configure_msbuild.cmd
index f8c2a87de8e..bdd4ecc227a 100644
--- a/build_files/windows/configure_msbuild.cmd
+++ b/build_files/windows/configure_msbuild.cmd
@@ -19,7 +19,11 @@ if "%WITH_CLANG%"=="1" (
exit /b 1
)
)
-set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% -G "Visual Studio %BUILD_VS_VER% %BUILD_VS_YEAR%%WINDOWS_ARCH%" %TESTS_CMAKE_ARGS% %CLANG_CMAKE_ARGS% %ASAN_CMAKE_ARGS%
+
+if "%WITH_PYDEBUG%"=="1" (
+ set PYDEBUG_CMAKE_ARGS=-DWINDOWS_PYTHON_DEBUG=On
+)
+set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% -G "Visual Studio %BUILD_VS_VER% %BUILD_VS_YEAR%%WINDOWS_ARCH%" %TESTS_CMAKE_ARGS% %CLANG_CMAKE_ARGS% %ASAN_CMAKE_ARGS% %PYDEBUG_CMAKE_ARGS%
if NOT EXIST %BUILD_DIR%\nul (
mkdir %BUILD_DIR%
@@ -41,7 +45,7 @@ if "%NOBUILD%"=="1" set MUST_CONFIGURE=1
if "%MUST_CONFIGURE%"=="1" (
if NOT "%verbose%" == "" (
- echo %CMAKE% %BUILD_CMAKE_ARGS% -H%BLENDER_DIR% -B%BUILD_DIR%
+ echo "%CMAKE% %BUILD_CMAKE_ARGS% -H%BLENDER_DIR% -B%BUILD_DIR%"
)
cmake ^
diff --git a/build_files/windows/detect_msvc_classic.cmd b/build_files/windows/detect_msvc_classic.cmd
index 61bfcf92ddf..2910e3b7305 100644
--- a/build_files/windows/detect_msvc_classic.cmd
+++ b/build_files/windows/detect_msvc_classic.cmd
@@ -64,6 +64,6 @@ exit /b 1
:DetectionComplete
if NOT "%verbose%" == "" (
- echo Visual Studio %BUILD_VS_YEAR% Detected successfuly
+ echo Visual Studio %BUILD_VS_YEAR% Detected successfully
)
exit /b 0
diff --git a/build_files/windows/find_dependencies.cmd b/build_files/windows/find_dependencies.cmd
index 219e9801831..a861cf1c98b 100644
--- a/build_files/windows/find_dependencies.cmd
+++ b/build_files/windows/find_dependencies.cmd
@@ -1,11 +1,11 @@
-REM find all dependencies and set the corresponding environement variables.
+REM find all dependencies and set the corresponding environment variables.
for %%X in (svn.exe) do (set SVN=%%~$PATH:X)
for %%X in (cmake.exe) do (set CMAKE=%%~$PATH:X)
for %%X in (git.exe) do (set GIT=%%~$PATH:X)
if NOT "%verbose%" == "" (
- echo svn : %SVN%
- echo cmake : %CMAKE%
- echo git : %GIT%
+ echo svn : "%SVN%"
+ echo cmake : "%CMAKE%"
+ echo git : "%GIT%"
)
if "%CMAKE%" == "" (
echo Cmake not found in path, required for building, exiting...
diff --git a/build_files/windows/parse_arguments.cmd b/build_files/windows/parse_arguments.cmd
index e8caddaf4ea..2c80a4d0b02 100644
--- a/build_files/windows/parse_arguments.cmd
+++ b/build_files/windows/parse_arguments.cmd
@@ -12,9 +12,6 @@ if NOT "%1" == "" (
if "%1" == "debug" (
set BUILD_TYPE=Debug
REM Build Configurations
- ) else if "%1" == "noge" (
- set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% -DWITH_GAMEENGINE=OFF -DWITH_PLAYER=OFF
- set BUILD_NGE=_noge
) else if "%1" == "builddir" (
set BUILD_DIR_OVERRRIDE="%BLENDER_DIR%..\%2"
shift /1
@@ -64,6 +61,8 @@ if NOT "%1" == "" (
shift /1
) else if "%1" == "nobuild" (
set NOBUILD=1
+ ) else if "%1" == "pydebug" (
+ set WITH_PYDEBUG=1
) else if "%1" == "showhash" (
SET BUILD_SHOW_HASHES=1
REM Non-Build Commands
diff --git a/build_files/windows/reset_variables.cmd b/build_files/windows/reset_variables.cmd
index a522ed7407f..ba584a7f34a 100644
--- a/build_files/windows/reset_variables.cmd
+++ b/build_files/windows/reset_variables.cmd
@@ -25,3 +25,5 @@ set WITH_CLANG=
set WITH_ASAN=
set CLANG_CMAKE_ARGS=
set ASAN_CMAKE_ARGS=
+set WITH_PYDEBUG=
+set PYDEBUG_CMAKE_ARGS=
diff --git a/build_files/windows/show_help.cmd b/build_files/windows/show_help.cmd
index 694b28c88ed..984c1ccfbeb 100644
--- a/build_files/windows/show_help.cmd
+++ b/build_files/windows/show_help.cmd
@@ -16,7 +16,7 @@ echo.
echo Configuration options
echo - verbose ^(enable diagnostic output during configuration^)
echo - with_tests ^(enable building unit tests^)
-echo - noge ^(disable building game enginge and player^)
+echo - noge ^(disable building game engine and player^)
echo - debug ^(Build an unoptimized debuggable build^)
echo - packagename [newname] ^(override default cpack package name^)
echo - buildir [newdir] ^(override default build folder^)
diff --git a/build_files/windows/update_sources.cmd b/build_files/windows/update_sources.cmd
index 22d93fabb95..be5303ad1b5 100644
--- a/build_files/windows/update_sources.cmd
+++ b/build_files/windows/update_sources.cmd
@@ -11,6 +11,10 @@ if "%GIT%" == "" (
goto EOF
)
"%GIT%" pull --rebase
-"%GIT%" submodule foreach git pull --rebase origin master
+"%GIT%" submodule update --init --recursive
+rem Use blender2.8 branch for submodules that have it.
+"%GIT%" submodule foreach "git checkout blender2.8 || git checkout master"
+"%GIT%" submodule foreach git pull --rebase origin
+
:EOF \ No newline at end of file
diff --git a/doc/blender_file_format/BlendFileDnaExporter_25.py b/doc/blender_file_format/BlendFileDnaExporter_25.py
index a9da79f04d8..54a3bd56eef 100755
--- a/doc/blender_file_format/BlendFileDnaExporter_25.py
+++ b/doc/blender_file_format/BlendFileDnaExporter_25.py
@@ -383,7 +383,7 @@ def usage():
print("Options:")
print("\t--dna-keep-blend: doesn't delete the produced blend file DNA export to html")
print("\t--dna-debug: sets the logging level to DEBUG (lots of additional info)")
- print("\t--dna-versioned saves version informations in the html and blend filenames")
+ print("\t--dna-versioned saves version information in the html and blend filenames")
print("\t--dna-overwrite-css overwrite dna.css, useful when modifying css in the script")
print("Examples:")
print("\tdefault: % blender2.5 --background -noaudio --python BlendFileDnaExporter_25.py")
diff --git a/doc/blender_file_format/README b/doc/blender_file_format/README
index f28d4b3f6b6..531756eb34a 100644
--- a/doc/blender_file_format/README
+++ b/doc/blender_file_format/README
@@ -8,7 +8,7 @@ where "blender2.5" is your blender executable or a symlink to it.
This creates a temporary dna.blend to be inspected and it produces two new files:
* dna.html: the list of all the structures saved in a blend file with the blender2.5
- executable you have used. If you enable build informations when you build blender,
+ executable you have used. If you enable build information when you build blender,
the dna.html file will also show which svn revision the html refers to.
* dna.css: the css for the html above
@@ -20,7 +20,7 @@ Usage:
Options:
--dna-keep-blend: doesn't delete the produced blend file DNA export to html
--dna-debug: sets the logging level to DEBUG (lots of additional info)
- --dna-versioned saves version informations in the html and blend filenames
+ --dna-versioned saves version information in the html and blend filenames
--dna-overwrite-css overwrite dna.css, useful when modifying css in the script
Examples:
default: % blender2.5 --background -noaudio --python BlendFileDnaExporter_25.py
diff --git a/doc/blender_file_format/mystery_of_the_blend.html b/doc/blender_file_format/mystery_of_the_blend.html
index 599cb4a05bc..74c59cd0414 100644
--- a/doc/blender_file_format/mystery_of_the_blend.html
+++ b/doc/blender_file_format/mystery_of_the_blend.html
@@ -204,7 +204,7 @@ Nowadays, little-endian is the most commonly used.
<a name="example-endianess"></a>
<div class="box">
<p onclick="location.href='#example-endianess'" class="box-title">
-Endianess Example
+Endianness Example
</p>
<p>
Writing the integer <code class="evidence">0x4A3B2C1Dh</code>, will be ordered:
@@ -826,7 +826,7 @@ Note
</p>
<p>
A file-block containing a list refers to the DNA structure and has a count larger
-than 1. For example Vertexes and Faces are stored in this way.
+than 1. For example Vertices and Faces are stored in this way.
</p>
</div>
diff --git a/doc/doxygen/doxygen.source.h b/doc/doxygen/doxygen.source.h
index 69271e68e79..861f34cc49d 100644
--- a/doc/doxygen/doxygen.source.h
+++ b/doc/doxygen/doxygen.source.h
@@ -132,6 +132,10 @@
* \ingroup editors
*/
+/** \defgroup edgizmolib gizmo library
+ * \ingroup editors
+ */
+
/** \defgroup edgpencil gpencil
* \ingroup editors
*/
diff --git a/doc/guides/blender-guardedalloc.txt b/doc/guides/blender-guardedalloc.txt
index 2e49f25bd92..14425ec2677 100644
--- a/doc/guides/blender-guardedalloc.txt
+++ b/doc/guides/blender-guardedalloc.txt
@@ -5,7 +5,7 @@ NOTE: This file does not cover memutil and smart pointers and reference counted
garbage collection, which are contained in the memutil module.
Blender takes care of dynamic memory allocation using a set of own functions
-which are recognizeable through their MEM_ prefix. All memory allocation and
+which are recognizable through their MEM_ prefix. All memory allocation and
deallocation in blender is done through these functions.
The following functions are available through MEM_guardedalloc.h:
diff --git a/doc/guides/interface_API.txt b/doc/guides/interface_API.txt
index 1874519db8d..631f2098a22 100644
--- a/doc/guides/interface_API.txt
+++ b/doc/guides/interface_API.txt
@@ -35,7 +35,7 @@ Contents
4.4 specials
15. KEYEVT
16. LINK and INLINK
-4.5 uiButton control fuctions
+4.5 uiButton control functions
----------------1. General notes
@@ -130,7 +130,7 @@ It walks through the lists in a rather complex manner:
/* so we create a 2nd loop for it */
- while first block is a menu
- if block is a menu and not initialized:
- - initalize 'saveunder'
+ - initialize 'saveunder'
- draw it
- get event from queue
- call uiDoBlock (handles buttons for single block)
@@ -177,7 +177,7 @@ font:
With the new truetype option in Blender, this is used for all font families
When a uiBlock is created, each uiButton that is defined gets the uiBlock properties.
-Changing Block properties inbetween will affact uiButtons defined thereafter.
+Changing Block properties in between will affact uiButtons defined thereafter.
@@ -217,7 +217,7 @@ void uiBlockSetButmFunc(uiBlock *block, void (*menufunc)(void *arg, int event),
void uiAutoBlock(uiBlock *block, float minx, float miny, float sizex, float sizey, UI_BLOCK_ROWS)
Sets the buttons in this block to automatically align, and fit within boundaries.
- Internally it allows multiple colums or rows as well. Only 'row order' has been implemented.
+ Internally it allows multiple columns or rows as well. Only 'row order' has been implemented.
The uiDefBut definitions don't need coordinates as input here, but instead:
- first value (x1) to indicate row number
- width and height values (if filled in) will be used to define a relative width/height.
@@ -253,7 +253,7 @@ In Blender a button can do four things:
Internally, each button or menu item is a 'uiButton', with a generic API and handling:
ui_def_but(block, type, retval, str, x1, y1, x2, y2, poin, min, max, a1, a2, tip);
-Beacause a lot of obscure generic (re-use) happens here, translation calls have been made
+Because a lot of obscure generic (re-use) happens here, translation calls have been made
for each most button types individually.
@@ -442,7 +442,7 @@ uiDefIconBut(block, INLINK, 0, ICON_INLINK, x1, y1, w, h, void *poin, short from
-------------- 4.5 uiButton control fuctions
+------------- 4.5 uiButton control functions
void uiButSetFunc(uiBut *but, void (*func)(void *arg1, void *arg2), void *arg1, void *arg2)
diff --git a/doc/python_api/examples/bpy.app.handlers.1.py b/doc/python_api/examples/bpy.app.handlers.1.py
index 34b16c27b86..cd24873fcbc 100644
--- a/doc/python_api/examples/bpy.app.handlers.1.py
+++ b/doc/python_api/examples/bpy.app.handlers.1.py
@@ -3,7 +3,7 @@ Persistent Handler Example
++++++++++++++++++++++++++
By default handlers are freed when loading new files, in some cases you may
-wan't the handler stay running across multiple files (when the handler is
+want the handler stay running across multiple files (when the handler is
part of an add-on for example).
For this the :data:`bpy.app.handlers.persistent` decorator needs to be used.
diff --git a/doc/python_api/examples/bpy.types.Menu.3.py b/doc/python_api/examples/bpy.types.Menu.3.py
index 9fe39535bbf..285052f2e20 100644
--- a/doc/python_api/examples/bpy.types.Menu.3.py
+++ b/doc/python_api/examples/bpy.types.Menu.3.py
@@ -7,7 +7,7 @@ to perform the common task of managing presets.
This example shows how you can add a preset menu.
-This example uses the object draw options,
+This example uses the object display options,
however you can use properties defined by your own scripts too.
"""
@@ -16,18 +16,18 @@ from bpy.types import Operator, Menu
from bl_operators.presets import AddPresetBase
-class OBJECT_MT_draw_presets(Menu):
- bl_label = "Object Draw Presets"
- preset_subdir = "object/draw"
+class OBJECT_MT_display_presets(Menu):
+ bl_label = "Object Display Presets"
+ preset_subdir = "object/display"
preset_operator = "script.execute_preset"
- draw = Menu.draw_preset
+ display = Menu.display_preset
-class AddPresetObjectDraw(AddPresetBase, Operator):
- '''Add a Object Draw Preset'''
- bl_idname = "camera.object_draw_preset_add"
- bl_label = "Add Object Draw Preset"
- preset_menu = "OBJECT_MT_draw_presets"
+class AddPresetObjectDisplay(AddPresetBase, Operator):
+ '''Add a Object Display Preset'''
+ bl_idname = "camera.object_display_preset_add"
+ bl_label = "Add Object Display Preset"
+ preset_menu = "OBJECT_MT_display_presets"
# variable used for all preset values
preset_defines = [
@@ -36,31 +36,31 @@ class AddPresetObjectDraw(AddPresetBase, Operator):
# properties to store in the preset
preset_values = [
- "obj.draw_type",
+ "obj.display_type",
"obj.show_bounds",
- "obj.draw_bounds_type",
+ "obj.display_bounds_type",
"obj.show_name",
"obj.show_axis",
"obj.show_wire",
]
# where to store the preset
- preset_subdir = "object/draw"
+ preset_subdir = "object/display"
-# Draw into an existing panel
+# Display into an existing panel
def panel_func(self, context):
layout = self.layout
row = layout.row(align=True)
- row.menu(OBJECT_MT_draw_presets.__name__, text=OBJECT_MT_draw_presets.bl_label)
- row.operator(AddPresetObjectDraw.bl_idname, text="", icon='ZOOMIN')
- row.operator(AddPresetObjectDraw.bl_idname, text="", icon='ZOOMOUT').remove_active = True
+ row.menu(OBJECT_MT_display_presets.__name__, text=OBJECT_MT_display_presets.bl_label)
+ row.operator(AddPresetObjectDisplay.bl_idname, text="", icon='ZOOMIN')
+ row.operator(AddPresetObjectDisplay.bl_idname, text="", icon='ZOOMOUT').remove_active = True
classes = (
- OBJECT_MT_draw_presets,
- AddPresetObjectDraw,
+ OBJECT_MT_display_presets,
+ AddPresetObjectDisplay,
)
diff --git a/doc/python_api/examples/bpy.types.Object.py b/doc/python_api/examples/bpy.types.Object.py
index 90c50bcfad7..743322492b4 100644
--- a/doc/python_api/examples/bpy.types.Object.py
+++ b/doc/python_api/examples/bpy.types.Object.py
@@ -3,26 +3,27 @@ Basic Object Operations Example
+++++++++++++++++++++++++++++++
This script demonstrates basic operations on object like creating new
-object, placing it into scene, selecting it and making it active.
+object, placing it into a view layer, selecting it and making it active.
"""
import bpy
from mathutils import Matrix
-scene = bpy.context.scene
+view_layer = bpy.context.view_layer
-# Create new lamp datablock
-lamp_data = bpy.data.lamps.new(name="New Lamp", type='POINT')
+# Create new light datablock.
+light_data = bpy.data.lights.new(name="New Light", type='POINT')
-# Create new object with our lamp datablock
-lamp_object = bpy.data.objects.new(name="New Lamp", object_data=lamp_data)
+# Create new object with our light datablock.
+light_object = bpy.data.objects.new(name="New Light", object_data=light_data)
-# Link lamp object to the scene so it'll appear in this scene
-scene.objects.link(lamp_object)
+# Link light object to the active collection of current view layer,
+# so that it'll appear in the current scene.
+view_layer.active_layer_collection.collection.objects.link(light_object)
-# Place lamp to a specified location
-lamp_object.location = (5.0, 5.0, 5.0)
+# Place light to a specified location.
+light_object.location = (5.0, 5.0, 5.0)
-# And finally select it make active
-lamp_object.select = True
-scene.objects.active = lamp_object
+# And finally select it and make it active.
+light_object.select_set(True)
+view_layer.objects.active = light_object
diff --git a/doc/python_api/examples/gpu.1.py b/doc/python_api/examples/gpu.1.py
new file mode 100644
index 00000000000..c8ae3b01ee3
--- /dev/null
+++ b/doc/python_api/examples/gpu.1.py
@@ -0,0 +1,107 @@
+"""
+Geometry Batches
+++++++++++++++++
+
+Geometry is drawn in batches.
+A batch contains the necessary data to perform the drawing.
+That includes an obligatory *Vertex Buffer* and an optional *Index Buffer*, each of which is described in more detail in the following sections.
+A batch also defines a draw type.
+Typical draw types are `POINTS`, `LINES` and `TRIS`.
+The draw type determines how the data will be interpreted and drawn.
+
+Vertex Buffers
+++++++++++++++
+
+A *Vertex Buffer Object* (VBO) (:class:`gpu.types.GPUVertBuf`) is an array that contains the vertex attributes needed for drawing using a specific shader.
+Typical vertex attributes are *location*, *normal*, *color*, and *uv*.
+Every vertex buffer has a *Vertex Format* (:class:`gpu.types.GPUVertFormat`) and a length corresponding to the number of vertices in the buffer.
+A vertex format describes the attributes stored per vertex and their types.
+
+The following code demonstrates the creation of a vertex buffer that contains 6 vertices.
+For each vertex 2 attributes will be stored: The position and the normal::
+
+ import gpu
+ vertex_positions = [(0, 0, 0), ...]
+ vertex_normals = [(0, 0, 1), ...]
+
+ fmt = gpu.types.GPUVertFormat()
+ fmt.attr_add(id="pos", comp_type='F32', len=3, fetch_mode='FLOAT')
+ fmt.attr_add(id="normal", comp_type='F32', len=3, fetch_mode='FLOAT')
+
+ vbo = gpu.types.GPUVertBuf(len=6, format=fmt)
+ vbo.attr_fill(id="pos", data=vertex_positions)
+ vbo.attr_fill(id="normal", data=vertex_normals)
+
+This vertex buffer could be used to draw 6 points, 3 separate lines, 5 consecutive lines, 2 separate triangles, ...
+E.g. in the case of lines, each two consecutive vertices define a line.
+The type that will actually be drawn is determined when the batch is created later.
+
+Index Buffers
++++++++++++++
+
+Often triangles and lines share one or more vertices.
+With only a vertex buffer one would have to store all attributes for the these vertices multiple times.
+This is very inefficient because in a connected triangle mesh every vertex is used 6 times on average.
+A more efficient approach would be to use an *Index Buffer* (IBO) (:class:`gpu.types.GPUIndexBuf`), sometimes referred to as *Element Buffer*.
+An *Index Buffer* is an array that references vertices based on their index in the vertex buffer.
+For instance, to draw a rectangle composed of two triangles, one could use an index buffer::
+
+ positions = (
+ (-1, 1), (1, 1),
+ (-1, -1), (1, -1))
+
+ indices = ((0, 1, 2), (2, 1, 3))
+
+ ibo = gpu.types.GPUIndexBuf(type='TRIS', seq=indices)
+
+Here the first tuple in `indices` describes which vertices should be used for the first triangle (same for the second tuple).
+Note how the diagonal vertices 1 and 2 are shared between both triangles.
+
+Shaders
++++++++
+
+A shader is a program that runs on the GPU (written in GLSL in our case).
+There are multiple types of shaders.
+The most important ones are *Vertex Shaders* and *Fragment Shaders*.
+Typically multiple shaders are linked together into a *Program*.
+However, in the Blender Python API the term *Shader* refers to an OpenGL Program.
+Every :class:`gpu.types.GPUShader` consists of a vertex shader, a fragment shader and an optional geometry shader.
+For common drawing tasks there are some built-in shaders accessible from :class:`gpu.shader.from_builtin` with an identifier such as `2D_UNIFORM_COLOR` or `3D_FLAT_COLOR`.
+
+Every shader defines a set of attributes and uniforms that have to be set in order to use the shader.
+Attributes are properties that are set using a vertex buffer and can be different for individual vertices.
+Uniforms are properties that are constant per draw call.
+They can be set using the `shader.uniform_*` functions after the shader has been bound.
+
+Batch Creation
+++++++++++++++
+
+Batches can be creates by first manually creating VBOs and IBOs.
+However, it is recommended to use the :class:`gpu_extras.batch.batch_for_shader` function.
+It makes sure that all the vertex attributes necessary for a specific shader are provided.
+Consequently, the shader has to be passed to the function as well.
+When using this function one rarely has to care about the vertex format, VBOs and IBOs created in the background.
+This is still something one should know when drawing stuff though.
+
+Since batches can be drawn multiple times, they should be cached and reused whenever possible.
+
+Offscreen Rendering
++++++++++++++++++++
+
+What one can see on the screen after rendering is called the *Front Buffer*.
+When draw calls are issued, batches are drawn on a *Back Buffer* that will only be displayed when all drawing is done and the current back buffer will become the new front buffer.
+Sometimes, one might want to draw the batches into a distinct buffer that could be used as texture to display on another object or to be saved as image on disk.
+This is called Offscreen Rendering.
+In Blender Offscreen Rendering is done using the :class:`gpu.types.GPUOffScreen` type.
+
+.. warning::
+ `GPUOffScreen` objects are bound to the OpenGL context they have been created in.
+ This means that once Blender discards this context (i.e. the window is closed), the offscreen instance will be freed.
+
+Examples
+++++++++
+
+To try these examples, just copy them into Blenders text editor and execute them.
+To keep the examples relatively small, they just register a draw function that can't easily be removed anymore.
+Blender has to be restarted in order to delete the draw handlers.
+""" \ No newline at end of file
diff --git a/doc/python_api/examples/gpu.2.py b/doc/python_api/examples/gpu.2.py
new file mode 100644
index 00000000000..8188110d096
--- /dev/null
+++ b/doc/python_api/examples/gpu.2.py
@@ -0,0 +1,19 @@
+"""
+3D Lines with Single Color
+--------------------------
+"""
+import bpy
+import gpu
+from gpu_extras.batch import batch_for_shader
+
+coords = [(1, 1, 1), (-2, 0, 0), (-2, -1, 3), (0, 1, 1)]
+shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR')
+batch = batch_for_shader(shader, 'LINES', {"pos" : coords})
+
+def draw():
+ shader.bind()
+ shader.uniform_float("color", (1, 1, 0, 1))
+ batch.draw(shader)
+
+bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_VIEW')
+
diff --git a/doc/python_api/examples/gpu.3.py b/doc/python_api/examples/gpu.3.py
new file mode 100644
index 00000000000..30f340c30ff
--- /dev/null
+++ b/doc/python_api/examples/gpu.3.py
@@ -0,0 +1,44 @@
+"""
+Triangle with Custom Shader
+---------------------------
+"""
+import bpy
+import gpu
+from gpu_extras.batch import batch_for_shader
+
+vertex_shader = '''
+ uniform mat4 viewProjectionMatrix;
+
+ in vec3 position;
+ out vec3 pos;
+
+ void main()
+ {
+ pos = position;
+ gl_Position = viewProjectionMatrix * vec4(position, 1.0f);
+ }
+'''
+
+fragment_shader = '''
+ uniform float brightness;
+
+ in vec3 pos;
+
+ void main()
+ {
+ gl_FragColor = vec4(pos * brightness, 1.0);
+ }
+'''
+
+coords = [(1, 1, 1), (2, 0, 0), (-2, -1, 3)]
+shader = gpu.types.GPUShader(vertex_shader, fragment_shader)
+batch = batch_for_shader(shader, 'TRIS', {"position" : coords})
+
+def draw():
+ shader.bind()
+ matrix = bpy.context.region_data.perspective_matrix
+ shader.uniform_float("viewProjectionMatrix", matrix)
+ shader.uniform_float("brightness", 0.5)
+ batch.draw(shader)
+
+bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_VIEW') \ No newline at end of file
diff --git a/doc/python_api/examples/gpu.4.py b/doc/python_api/examples/gpu.4.py
new file mode 100644
index 00000000000..392f010e7c2
--- /dev/null
+++ b/doc/python_api/examples/gpu.4.py
@@ -0,0 +1,28 @@
+"""
+Wireframe Cube using Index Buffer
+---------------------------------
+"""
+import bpy
+import gpu
+from gpu_extras.batch import batch_for_shader
+
+coords = (
+ (-1, -1, -1), ( 1, -1, -1),
+ (-1, 1, -1), ( 1, 1, -1),
+ (-1, -1, 1), ( 1, -1, 1),
+ (-1, 1, 1), ( 1, 1, 1))
+
+indices = (
+ (0, 1), (0, 2), (1, 3), (2, 3),
+ (4, 5), (4, 6), (5, 7), (6, 7),
+ (0, 4), (1, 5), (2, 6), (3, 7))
+
+shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR')
+batch = batch_for_shader(shader, 'LINES', {"pos" : coords}, indices=indices)
+
+def draw():
+ shader.bind()
+ shader.uniform_float("color", (1, 0, 0, 1))
+ batch.draw(shader)
+
+bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_VIEW') \ No newline at end of file
diff --git a/doc/python_api/examples/gpu.5.py b/doc/python_api/examples/gpu.5.py
new file mode 100644
index 00000000000..7af3a518457
--- /dev/null
+++ b/doc/python_api/examples/gpu.5.py
@@ -0,0 +1,33 @@
+"""
+Mesh with Random Vertex Colors
+------------------------------
+"""
+import bpy
+import gpu
+import numpy as np
+from random import random
+from gpu_extras.batch import batch_for_shader
+
+mesh = bpy.context.active_object.data
+mesh.calc_loop_triangles()
+
+vertices = np.empty((len(mesh.vertices), 3), 'f')
+indices = np.empty((len(mesh.loop_triangles), 3), 'i')
+
+mesh.vertices.foreach_get("co",
+ np.reshape(vertices, len(mesh.vertices) * 3))
+mesh.loop_triangles.foreach_get("vertices",
+ np.reshape(indices, len(mesh.loop_triangles) * 3))
+
+vertex_colors = [(random(), random(), random(), 1) for _ in range(len(mesh.vertices))]
+
+shader = gpu.shader.from_builtin('3D_SMOOTH_COLOR')
+batch = batch_for_shader(shader, 'TRIS',
+ {"pos" : vertices,
+ "color" : vertex_colors},
+ indices=indices)
+
+def draw():
+ batch.draw(shader)
+
+bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_VIEW') \ No newline at end of file
diff --git a/doc/python_api/examples/gpu.6.py b/doc/python_api/examples/gpu.6.py
new file mode 100644
index 00000000000..df28d801960
--- /dev/null
+++ b/doc/python_api/examples/gpu.6.py
@@ -0,0 +1,24 @@
+"""
+2D Rectangle
+------------
+"""
+import bpy
+import gpu
+from gpu_extras.batch import batch_for_shader
+
+vertices = (
+ (100, 100), (300, 100),
+ (100, 200), (300, 200))
+
+indices = (
+ (0, 1, 2), (2, 1, 3))
+
+shader = gpu.shader.from_builtin('2D_UNIFORM_COLOR')
+batch = batch_for_shader(shader, 'TRIS', {"pos" : vertices}, indices=indices)
+
+def draw():
+ shader.bind()
+ shader.uniform_float("color", (0, 0.5, 0.5, 1.0))
+ batch.draw(shader)
+
+bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_PIXEL') \ No newline at end of file
diff --git a/doc/python_api/examples/gpu.7.py b/doc/python_api/examples/gpu.7.py
new file mode 100644
index 00000000000..486ed5fd411
--- /dev/null
+++ b/doc/python_api/examples/gpu.7.py
@@ -0,0 +1,31 @@
+"""
+2D Image
+--------
+
+To use this example you have to provide an image that should be displayed.
+"""
+import bpy
+import gpu
+import bgl
+from gpu_extras.batch import batch_for_shader
+
+IMAGE_NAME = "Untitled"
+image = bpy.data.images[IMAGE_NAME]
+
+shader = gpu.shader.from_builtin('2D_IMAGE')
+batch = batch_for_shader(shader, 'TRI_FAN',
+ {"pos" : ((100, 100), (200, 100), (200, 200), (100, 200)),
+ "texCoord" : ((0, 0), (1, 0), (1, 1), (0, 1))})
+
+if image.gl_load():
+ raise Exception()
+
+def draw():
+ bgl.glActiveTexture(bgl.GL_TEXTURE0)
+ bgl.glBindTexture(bgl.GL_TEXTURE_2D, image.bindcode)
+
+ shader.bind()
+ shader.uniform_int("image", 0)
+ batch.draw(shader)
+
+bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_PIXEL') \ No newline at end of file
diff --git a/doc/python_api/examples/gpu.8.py b/doc/python_api/examples/gpu.8.py
new file mode 100644
index 00000000000..7e41164fc7e
--- /dev/null
+++ b/doc/python_api/examples/gpu.8.py
@@ -0,0 +1,84 @@
+"""
+Generate a texture using Offscreen Rendering
+--------------------------------------------
+
+1. Create an :class:`gpu.types.GPUOffScreen` object.
+2. Draw some circles into it.
+3. Make a new shader for drawing a planar texture in 3D.
+4. Draw the generated texture using the new shader.
+"""
+import bpy
+import gpu
+import bgl
+from mathutils import Matrix
+from gpu_extras.batch import batch_for_shader
+from gpu_extras.presets import draw_circle_2d
+
+# Create and fill offscreen
+##########################################
+
+offscreen = gpu.types.GPUOffScreen(512, 512)
+
+offscreen.bind()
+try:
+ bgl.glClear(bgl.GL_COLOR_BUFFER_BIT)
+ with gpu.matrix.push_pop():
+ # reset matrices -> use normalized device coordinates [-1, 1]
+ gpu.matrix.load_matrix(Matrix.Identity(4))
+ gpu.matrix.load_projection_matrix(Matrix.Identity(4))
+
+ amount = 10
+ for i in range(-amount, amount + 1):
+ x_pos = i / amount
+ draw_circle_2d((x_pos, 0.0), (1, 1, 1, 1), 0.5, 200)
+finally:
+ offscreen.unbind()
+
+
+# Drawing the generated texture in 3D space
+#############################################
+
+vertex_shader = '''
+ uniform mat4 modelMatrix;
+ uniform mat4 viewProjectionMatrix;
+
+ in vec2 position;
+ in vec2 uv;
+
+ out vec2 uvInterp;
+
+ void main()
+ {
+ uvInterp = uv;
+ gl_Position = viewProjectionMatrix * modelMatrix * vec4(position, 0.0, 1.0);
+ }
+'''
+
+fragment_shader = '''
+ uniform sampler2D image;
+
+ in vec2 uvInterp;
+
+ void main()
+ {
+ gl_FragColor = texture(image, uvInterp);
+ }
+'''
+
+shader = gpu.types.GPUShader(vertex_shader, fragment_shader)
+batch = batch_for_shader(shader, 'TRI_FAN',
+ {"position" : ((-1, -1), (1, -1), (1, 1), (-1, 1)),
+ "uv" : ((0, 0), (1, 0), (1, 1), (0, 1))})
+
+
+def draw():
+ bgl.glActiveTexture(bgl.GL_TEXTURE0)
+ bgl.glBindTexture(bgl.GL_TEXTURE_2D, offscreen.color_texture)
+
+ shader.bind()
+ shader.uniform_float("modelMatrix", Matrix.Translation((1, 2, 3)) @ Matrix.Scale(3, 4))
+ shader.uniform_float("viewProjectionMatrix", bpy.context.region_data.perspective_matrix)
+ shader.uniform_float("image", 0)
+ batch.draw(shader)
+
+bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_VIEW') \ No newline at end of file
diff --git a/doc/python_api/examples/gpu.9.py b/doc/python_api/examples/gpu.9.py
new file mode 100644
index 00000000000..a281534765a
--- /dev/null
+++ b/doc/python_api/examples/gpu.9.py
@@ -0,0 +1,52 @@
+"""
+Copy Offscreen Rendering result back to RAM
+-------------------------------------------
+
+This will create a new image with the given name.
+If it already exists, it will override the existing one.
+
+Currently almost all of the execution time is spent in the last line.
+In the future this will hopefully be solved by implementing the Python buffer protocol for `bgl.Buffer` and `Image.pixels` (aka `bpy_prop_array`).
+"""
+import bpy
+import gpu
+import bgl
+import random
+from mathutils import Matrix
+from gpu_extras.presets import draw_circle_2d
+
+IMAGE_NAME = "Generated Image"
+WIDTH = 512
+HEIGHT = 512
+RING_AMOUNT = 10
+
+
+offscreen = gpu.types.GPUOffScreen(WIDTH, HEIGHT)
+
+offscreen.bind()
+try:
+ bgl.glClear(bgl.GL_COLOR_BUFFER_BIT)
+ with gpu.matrix.push_pop():
+ # reset matrices -> use normalized device coordinates [-1, 1]
+ gpu.matrix.load_matrix(Matrix.Identity(4))
+ gpu.matrix.load_projection_matrix(Matrix.Identity(4))
+
+ for i in range(RING_AMOUNT):
+ draw_circle_2d(
+ (random.uniform(-1, 1), random.uniform(-1, 1)),
+ (1, 1, 1, 1), random.uniform(0.1, 1), 20)
+
+
+ buffer = bgl.Buffer(bgl.GL_BYTE, WIDTH * HEIGHT * 4)
+ bgl.glReadBuffer(bgl.GL_BACK)
+ bgl.glReadPixels(0, 0, WIDTH, HEIGHT, bgl.GL_RGBA, bgl.GL_UNSIGNED_BYTE, buffer)
+finally:
+ offscreen.unbind()
+ offscreen.free()
+
+
+if not IMAGE_NAME in bpy.data.images:
+ bpy.data.images.new(IMAGE_NAME, WIDTH, HEIGHT)
+image = bpy.data.images[IMAGE_NAME]
+image.scale(WIDTH, HEIGHT)
+image.pixels = [v / 255 for v in buffer] \ No newline at end of file
diff --git a/doc/python_api/examples/gpu.offscreen.1.py b/doc/python_api/examples/gpu.offscreen.1.py
deleted file mode 100644
index bb34603bd23..00000000000
--- a/doc/python_api/examples/gpu.offscreen.1.py
+++ /dev/null
@@ -1,193 +0,0 @@
-# Draws an off-screen buffer and display it in the corner of the view.
-import bpy
-from bgl import *
-
-
-class OffScreenDraw(bpy.types.Operator):
- bl_idname = "view3d.offscreen_draw"
- bl_label = "View3D Offscreen Draw"
-
- _handle_calc = None
- _handle_draw = None
- is_enabled = False
-
- # manage draw handler
- @staticmethod
- def draw_callback_px(self, context):
- scene = context.scene
- aspect_ratio = scene.render.resolution_x / scene.render.resolution_y
-
- self._update_offscreen(context, self._offscreen)
- self._opengl_draw(context, self._texture, aspect_ratio, 0.2)
-
- @staticmethod
- def handle_add(self, context):
- OffScreenDraw._handle_draw = bpy.types.SpaceView3D.draw_handler_add(
- self.draw_callback_px, (self, context),
- 'WINDOW', 'POST_PIXEL',
- )
-
- @staticmethod
- def handle_remove():
- if OffScreenDraw._handle_draw is not None:
- bpy.types.SpaceView3D.draw_handler_remove(OffScreenDraw._handle_draw, 'WINDOW')
-
- OffScreenDraw._handle_draw = None
-
- # off-screen buffer
- @staticmethod
- def _setup_offscreen(context):
- import gpu
- scene = context.scene
- aspect_ratio = scene.render.resolution_x / scene.render.resolution_y
-
- try:
- offscreen = gpu.offscreen.new(512, int(512 / aspect_ratio))
- except Exception as e:
- print(e)
- offscreen = None
-
- return offscreen
-
- @staticmethod
- def _update_offscreen(context, offscreen):
- scene = context.scene
- render_layer = context.render_layer
- render = scene.render
- camera = scene.camera
-
- modelview_matrix = camera.matrix_world.inverted()
- projection_matrix = camera.calc_matrix_camera(
- render.resolution_x,
- render.resolution_y,
- render.pixel_aspect_x,
- render.pixel_aspect_y,
- )
-
- offscreen.draw_view3d(
- scene,
- render_layer,
- context.space_data,
- context.region,
- projection_matrix,
- modelview_matrix,
- )
-
- @staticmethod
- def _opengl_draw(context, texture, aspect_ratio, scale):
- """
- OpenGL code to draw a rectangle in the viewport
- """
-
- glDisable(GL_DEPTH_TEST)
-
- # view setup
- glMatrixMode(GL_PROJECTION)
- glPushMatrix()
- glLoadIdentity()
-
- glMatrixMode(GL_MODELVIEW)
- glPushMatrix()
- glLoadIdentity()
-
- glOrtho(-1, 1, -1, 1, -15, 15)
- gluLookAt(0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
-
- act_tex = Buffer(GL_INT, 1)
- glGetIntegerv(GL_TEXTURE_2D, act_tex)
-
- viewport = Buffer(GL_INT, 4)
- glGetIntegerv(GL_VIEWPORT, viewport)
-
- width = int(scale * viewport[2])
- height = int(width / aspect_ratio)
-
- glViewport(viewport[0], viewport[1], width, height)
- glScissor(viewport[0], viewport[1], width, height)
-
- # draw routine
- glEnable(GL_TEXTURE_2D)
- glActiveTexture(GL_TEXTURE0)
-
- glBindTexture(GL_TEXTURE_2D, texture)
-
- texco = [(1, 1), (0, 1), (0, 0), (1, 0)]
- verco = [(1.0, 1.0), (-1.0, 1.0), (-1.0, -1.0), (1.0, -1.0)]
-
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
-
- glColor4f(1.0, 1.0, 1.0, 1.0)
-
- glBegin(GL_QUADS)
- for i in range(4):
- glTexCoord3f(texco[i][0], texco[i][1], 0.0)
- glVertex2f(verco[i][0], verco[i][1])
- glEnd()
-
- # restoring settings
- glBindTexture(GL_TEXTURE_2D, act_tex[0])
-
- glDisable(GL_TEXTURE_2D)
-
- # reset view
- glMatrixMode(GL_PROJECTION)
- glPopMatrix()
-
- glMatrixMode(GL_MODELVIEW)
- glPopMatrix()
-
- glViewport(viewport[0], viewport[1], viewport[2], viewport[3])
- glScissor(viewport[0], viewport[1], viewport[2], viewport[3])
-
- # operator functions
- @classmethod
- def poll(cls, context):
- return context.area.type == 'VIEW_3D'
-
- def modal(self, context, event):
- if context.area:
- context.area.tag_redraw()
-
- return {'PASS_THROUGH'}
-
- def invoke(self, context, event):
- if OffScreenDraw.is_enabled:
- self.cancel(context)
-
- return {'FINISHED'}
-
- else:
- self._offscreen = OffScreenDraw._setup_offscreen(context)
- if self._offscreen:
- self._texture = self._offscreen.color_texture
- else:
- self.report({'ERROR'}, "Error initializing offscreen buffer. More details in the console")
- return {'CANCELLED'}
-
- OffScreenDraw.handle_add(self, context)
- OffScreenDraw.is_enabled = True
-
- if context.area:
- context.area.tag_redraw()
-
- context.window_manager.modal_handler_add(self)
- return {'RUNNING_MODAL'}
-
- def cancel(self, context):
- OffScreenDraw.handle_remove()
- OffScreenDraw.is_enabled = False
-
- if context.area:
- context.area.tag_redraw()
-
-
-def register():
- bpy.utils.register_class(OffScreenDraw)
-
-
-def unregister():
- bpy.utils.unregister_class(OffScreenDraw)
-
-
-if __name__ == "__main__":
- register()
diff --git a/doc/python_api/examples/gpu.shader.py b/doc/python_api/examples/gpu.shader.py
new file mode 100644
index 00000000000..7ffd3fe85c8
--- /dev/null
+++ b/doc/python_api/examples/gpu.shader.py
@@ -0,0 +1,35 @@
+"""
+Built-in shaders
+++++++++++++++++
+
+All built-in shaders have the ``mat4 ModelViewProjectionMatrix`` uniform.
+The value of it can only be modified using the :class:`gpu.matrix` module.
+"""
+
+2D_UNIFORM_COLOR:
+ attributes: vec3 pos
+ uniforms: vec4 color
+
+2D_FLAT_COLOR:
+ attributes: vec3 pos, vec4 color
+ uniforms: -
+
+2D_SMOOTH_COLOR:
+ attributes: vec3 pos, vec4 color
+ uniforms: -
+
+2D_IMAGE:
+ attributes: vec3 pos, vec2 texCoord
+ uniforms: sampler2D image
+
+3D_UNIFORM_COLOR:
+ attributes: vec3 pos
+ uniforms: vec4 color
+
+3D_FLAT_COLOR:
+ attributes: vec3 pos, vec4 color
+ uniforms: -
+
+3D_SMOOTH_COLOR:
+ attributes: vec3 pos, vec4 color
+ uniforms: -
diff --git a/doc/python_api/examples/gpu.types.GPUOffScreen.py b/doc/python_api/examples/gpu.types.GPUOffScreen.py
new file mode 100644
index 00000000000..ac95c75bf6c
--- /dev/null
+++ b/doc/python_api/examples/gpu.types.GPUOffScreen.py
@@ -0,0 +1,267 @@
+# Draws an off-screen buffer and display it in the corner of the view.
+import bpy
+import bgl
+import gpu
+import numpy as np
+
+g_imageVertSrc = '''
+in vec2 texCoord;
+in vec2 pos;
+
+out vec2 texCoord_interp;
+
+void main()
+{
+ gl_Position = vec4(pos.xy, 0.0f, 1.0);
+ gl_Position.z = 1.0f;
+ texCoord_interp = texCoord;
+}
+'''
+
+g_imageFragSrc = '''
+in vec2 texCoord_interp;
+out vec4 fragColor;
+
+uniform sampler2D image;
+
+void main()
+{
+ fragColor = texture(image, texCoord_interp);
+}
+'''
+
+g_plane_vertices = np.array([
+ ([-1.0, -1.0], [0.0, 0.0]),
+ ([1.0, -1.0], [1.0, 0.0]),
+ ([1.0, 1.0], [1.0, 1.0]),
+ ([1.0, 1.0], [1.0, 1.0]),
+ ([-1.0, 1.0], [0.0, 1.0]),
+ ([-1.0, -1.0], [0.0, 0.0]),
+], [('pos', 'f4', 2), ('uv', 'f4', 2)])
+
+
+class VIEW3D_OT_draw_offscreen(bpy.types.Operator):
+ bl_idname = "view3d.offscreen_draw"
+ bl_label = "Viewport Offscreen Draw"
+
+ _handle_calc = None
+ _handle_draw = None
+ is_enabled = False
+
+ global_shader = None
+ batch_plane = None
+ uniform_image = -1
+ shader = None
+
+ # manage draw handler
+ @staticmethod
+ def draw_callback_px(self, context):
+ scene = context.scene
+ aspect_ratio = scene.render.resolution_x / scene.render.resolution_y
+
+ self._update_offscreen(context, self._offscreen)
+ self._opengl_draw(context, self._texture, aspect_ratio, 0.2)
+
+ @staticmethod
+ def handle_add(self, context):
+ VIEW3D_OT_draw_offscreen._handle_draw = bpy.types.SpaceView3D.draw_handler_add(
+ self.draw_callback_px, (self, context),
+ 'WINDOW', 'POST_PIXEL',
+ )
+
+ @staticmethod
+ def handle_remove():
+ if VIEW3D_OT_draw_offscreen._handle_draw is not None:
+ bpy.types.SpaceView3D.draw_handler_remove(VIEW3D_OT_draw_offscreen._handle_draw, 'WINDOW')
+
+ VIEW3D_OT_draw_offscreen._handle_draw = None
+
+ # off-screen buffer
+ @staticmethod
+ def _setup_offscreen(context):
+ scene = context.scene
+ aspect_ratio = scene.render.resolution_x / scene.render.resolution_y
+
+ try:
+ offscreen = gpu.types.GPUOffScreen(512, int(512 / aspect_ratio))
+ except Exception as ex:
+ print(ex)
+ offscreen = None
+
+ return offscreen
+
+ @staticmethod
+ def _update_offscreen(context, offscreen):
+ scene = context.scene
+ view_layer = context.view_layer
+ render = scene.render
+ camera = scene.camera
+
+ view_matrix = camera.matrix_world.inverted()
+ projection_matrix = camera.calc_matrix_camera(
+ context.depsgraph,
+ x=render.resolution_x,
+ y=render.resolution_y,
+ scale_x=render.pixel_aspect_x,
+ scale_y=render.pixel_aspect_y,
+ )
+
+ offscreen.draw_view3d(
+ scene,
+ view_layer,
+ context.space_data,
+ context.region,
+ projection_matrix,
+ view_matrix,
+ )
+
+ def _opengl_draw(self, context, texture, aspect_ratio, scale):
+ """
+ OpenGL code to draw a rectangle in the viewport
+ """
+ # view setup
+ bgl.glDisable(bgl.GL_DEPTH_TEST)
+
+ viewport = bgl.Buffer(bgl.GL_INT, 4)
+ bgl.glGetIntegerv(bgl.GL_VIEWPORT, viewport)
+
+ active_texture = bgl.Buffer(bgl.GL_INT, 1)
+ bgl.glGetIntegerv(bgl.GL_TEXTURE_2D, active_texture)
+
+ width = int(scale * viewport[2])
+ height = int(width / aspect_ratio)
+
+ bgl.glViewport(viewport[0], viewport[1], width, height)
+ bgl.glScissor(viewport[0], viewport[1], width, height)
+
+ # draw routine
+ batch_plane = self.get_batch_plane()
+
+ shader = VIEW3D_OT_draw_offscreen.shader
+ # bind it so we can pass the new uniform values
+ shader.bind()
+
+ bgl.glEnable(bgl.GL_TEXTURE_2D)
+ bgl.glActiveTexture(bgl.GL_TEXTURE0)
+ bgl.glBindTexture(bgl.GL_TEXTURE_2D, texture)
+
+ # # TODO, support passing ints
+ # shader.uniform_int(VIEW3D_OT_draw_offscreen.uniform_image, 0)
+ shader.uniform_int("image", 0)
+ batch_plane.draw()
+
+ # restoring settings
+ bgl.glBindTexture(bgl.GL_TEXTURE_2D, active_texture[0])
+ bgl.glDisable(bgl.GL_TEXTURE_2D)
+
+ # reset view
+ bgl.glViewport(viewport[0], viewport[1], viewport[2], viewport[3])
+ bgl.glScissor(viewport[0], viewport[1], viewport[2], viewport[3])
+
+ def get_batch_plane(self):
+ if self.batch_plane is None:
+ global g_plane_vertices
+
+ format = gpu.types.GPUVertFormat()
+ pos_id = format.attr_add(
+ id="pos",
+ comp_type='F32',
+ len=2,
+ fetch_mode='FLOAT',
+ )
+ uv_id = format.attr_add(
+ id="texCoord",
+ comp_type='F32',
+ len=2,
+ fetch_mode='FLOAT',
+ )
+ vbo = gpu.types.GPUVertBuf(
+ len=len(g_plane_vertices),
+ format=format,
+ )
+
+ vbo.attr_fill(id=pos_id, data=g_plane_vertices["pos"])
+ vbo.attr_fill(id=uv_id, data=g_plane_vertices["uv"])
+
+ batch_plane = gpu.types.GPUBatch(type="TRIS", buf=vbo)
+ shader = self.global_shader
+
+ VIEW3D_OT_draw_offscreen.shader = shader
+ VIEW3D_OT_draw_offscreen.uniform_image = shader.uniform_from_name("image")
+
+ batch_plane.program_set(shader)
+ VIEW3D_OT_draw_offscreen.batch_plane = batch_plane
+ return VIEW3D_OT_draw_offscreen.batch_plane
+
+ # operator functions
+ @classmethod
+ def poll(cls, context):
+ return context.area.type == 'VIEW_3D'
+
+ def modal(self, context, event):
+ if context.area:
+ context.area.tag_redraw()
+
+ if event.type in {'RIGHTMOUSE', 'ESC'}:
+ self.cancel(context)
+ return {'CANCELLED'}
+
+ return {'PASS_THROUGH'}
+
+ def invoke(self, context, event):
+ if VIEW3D_OT_draw_offscreen.is_enabled:
+ self.cancel(context)
+ return {'FINISHED'}
+ else:
+ self._offscreen = VIEW3D_OT_draw_offscreen._setup_offscreen(context)
+ if self._offscreen:
+ self._texture = self._offscreen.color_texture
+ else:
+ self.report({'ERROR'}, "Error initializing offscreen buffer. More details in the console")
+ return {'CANCELLED'}
+
+ VIEW3D_OT_draw_offscreen.handle_add(self, context)
+ VIEW3D_OT_draw_offscreen.is_enabled = True
+
+ if context.area:
+ context.area.tag_redraw()
+
+ context.window_manager.modal_handler_add(self)
+ return {'RUNNING_MODAL'}
+
+ def cancel(self, context):
+ VIEW3D_OT_draw_offscreen.handle_remove()
+ VIEW3D_OT_draw_offscreen.is_enabled = False
+
+ if VIEW3D_OT_draw_offscreen.batch_plane is not None:
+ del VIEW3D_OT_draw_offscreen.batch_plane
+ VIEW3D_OT_draw_offscreen.batch_plane = None
+
+ VIEW3D_OT_draw_offscreen.shader = None
+
+ if context.area:
+ context.area.tag_redraw()
+
+
+def register():
+ shader = gpu.types.GPUShader(g_imageVertSrc, g_imageFragSrc)
+ VIEW3D_OT_draw_offscreen.global_shader = shader
+
+ bpy.utils.register_class(VIEW3D_OT_draw_offscreen)
+
+
+def unregister():
+ bpy.utils.unregister_class(VIEW3D_OT_draw_offscreen)
+ VIEW3D_OT_draw_offscreen.global_shader = None
+
+
+if __name__ == "__main__":
+ try:
+ unregister()
+ except RuntimeError:
+ pass
+ else:
+ if hasattr(bpy.types, "VIEW3D_OT_draw_offscreen"):
+ del bpy.types.VIEW3D_OT_draw_offscreen.global_shader
+
+ register()
diff --git a/doc/python_api/examples/mathutils.Color.py b/doc/python_api/examples/mathutils.Color.py
index a55f1195bf6..cedda98ae53 100644
--- a/doc/python_api/examples/mathutils.Color.py
+++ b/doc/python_api/examples/mathutils.Color.py
@@ -26,5 +26,5 @@ col += mathutils.Color((0.25, 0.0, 0.0))
# can printed as integers
print("Color: %d, %d, %d" % (col * 255.0)[:])
-# This example prints the color as hexidecimal
-print("Hexidecimal: %.2x%.2x%.2x" % (col * 255.0)[:])
+# This example prints the color as hexadecimal
+print("Hexadecimal: %.2x%.2x%.2x" % (col * 255.0)[:])
diff --git a/doc/python_api/examples/mathutils.Quaternion.py b/doc/python_api/examples/mathutils.Quaternion.py
index 7e5538b7a96..8a40389a8d6 100644
--- a/doc/python_api/examples/mathutils.Quaternion.py
+++ b/doc/python_api/examples/mathutils.Quaternion.py
@@ -15,7 +15,7 @@ quat_a = mathutils.Quaternion((0.0, 1.0, 0.0), math.radians(90.0))
quat_b = mathutils.Quaternion((0.0, 0.0, 1.0), math.radians(45.0))
quat_out = quat_a * quat_b
-# print the quat, euler degrees for mear mortals and (axis, angle)
+# print the quat, euler degrees for mere mortals and (axis, angle)
print("Final Rotation:")
print(quat_out)
print("%.2f, %.2f, %.2f" % tuple(math.degrees(a) for a in quat_out.to_euler()))
diff --git a/doc/python_api/rst/bgl.rst b/doc/python_api/rst/bgl.rst
index 0b31e62963c..90a1442edeb 100644
--- a/doc/python_api/rst/bgl.rst
+++ b/doc/python_api/rst/bgl.rst
@@ -69,7 +69,7 @@ offers a set of extensive examples, including advanced features.
.. function:: glBegin(mode):
- Delimit the vertices of a primitive or a group of like primatives
+ Delimit the vertices of a primitive or a group of like primitives
.. seealso:: `OpenGL Docs <https://www.opengl.org/sdk/docs/man2/xhtml/glBegin.xml>`__
diff --git a/doc/python_api/rst/gpu.rst b/doc/python_api/rst/gpu.rst
deleted file mode 100644
index d4860da4770..00000000000
--- a/doc/python_api/rst/gpu.rst
+++ /dev/null
@@ -1,20 +0,0 @@
-*******************
-GPU functions (gpu)
-*******************
-
-.. module:: gpu
-
-Functions for GPU offscreen rendering, matrix stacks and selection.
-
-Submodules:
-
-.. toctree::
- :maxdepth: 1
-
- gpu.offscreen.rst
-
-
-Intro
-=====
-
-Module to provide functions concerning the GPU implementation in Blender.
diff --git a/doc/python_api/rst/include__bmesh.rst b/doc/python_api/rst/include__bmesh.rst
index bed374bf7b6..d1356a5e5d9 100644
--- a/doc/python_api/rst/include__bmesh.rst
+++ b/doc/python_api/rst/include__bmesh.rst
@@ -83,7 +83,7 @@ When writing scripts that operate on editmode data you will normally want to re-
running the script, this needs to be called explicitly.
The BMesh its self does not store the triangulated faces, they are stored in the :class:`bpy.types.Mesh`,
-to refresh tessellation faces call :class:`bpy.types.Mesh.calc_tessface`.
+to refresh tessellation triangles call :class:`bpy.types.Mesh.calc_loop_triangles`.
CustomData Access
diff --git a/doc/python_api/rst/info_api_reference.rst b/doc/python_api/rst/info_api_reference.rst
index 5d5d38bf18b..cc7128f3b5d 100644
--- a/doc/python_api/rst/info_api_reference.rst
+++ b/doc/python_api/rst/info_api_reference.rst
@@ -53,7 +53,7 @@ Here are some characteristics ID Data-Blocks share.
Simple Data Access
------------------
-Lets start with a simple case, say you want a python script to adjust the objects location.
+Lets start with a simple case, say you want a python script to adjust the object's location.
Start by finding this setting in the interface ``Properties Window -> Object -> Transform -> Location``
diff --git a/doc/python_api/rst/info_best_practice.rst b/doc/python_api/rst/info_best_practice.rst
index 418f636030c..b9c9f234b72 100644
--- a/doc/python_api/rst/info_best_practice.rst
+++ b/doc/python_api/rst/info_best_practice.rst
@@ -164,26 +164,26 @@ for list removal, but these are slower.
Sometimes its faster (but more memory hungry) to just rebuild the list.
-Say you want to remove all triangular faces in a list.
+Say you want to remove all triangular polygons in a list.
Rather than...
.. code-block:: python
- faces = mesh.tessfaces[:] # make a list copy of the meshes faces
- f_idx = len(faces) # Loop backwards
- while f_idx: # while the value is not 0
- f_idx -= 1
+ polygons = mesh.polygons[:] # make a list copy of the meshes polygons
+ p_idx = len(polygons) # Loop backwards
+ while p_idx: # while the value is not 0
+ p_idx -= 1
- if len(faces[f_idx].vertices) == 3:
- faces.pop(f_idx) # remove the triangle
+ if len(polygons[p_idx].vertices) == 3:
+ polygons.pop(p_idx) # remove the triangle
It's faster to build a new list with list comprehension.
.. code-block:: python
- faces = [f for f in mesh.tessfaces if len(f.vertices) != 3]
+ polygons = [p for p in mesh.polygons if len(p.vertices) != 3]
Adding List Items
diff --git a/doc/python_api/rst/info_gotcha.rst b/doc/python_api/rst/info_gotcha.rst
index 2b361d476da..bbccc27b227 100644
--- a/doc/python_api/rst/info_gotcha.rst
+++ b/doc/python_api/rst/info_gotcha.rst
@@ -145,8 +145,8 @@ that happens to redraw but is more flexible and integrates better with Blenders
**Ok, Ok! I still want to draw from Python**
-If you insist - yes its possible, but scripts that use this hack wont be considered
-for inclusion in Blender and any issues with using it wont be considered bugs,
+If you insist - yes its possible, but scripts that use this hack won't be considered
+for inclusion in Blender and any issues with using it won't be considered bugs,
this is also not guaranteed to work in future releases.
.. code-block:: python
@@ -173,25 +173,25 @@ In this situation you can...
.. _info_gotcha_mesh_faces:
-N-Gons and Tessellation Faces
-=============================
+N-Gons and Tessellation
+=======================
Since 2.63 NGons are supported, this adds some complexity
-since in some cases you need to access triangles/quads still (some exporters for example).
+since in some cases you need to access triangles still (some exporters for example).
There are now 3 ways to access faces:
- :class:`bpy.types.MeshPolygon` -
this is the data structure which now stores faces in object mode
(access as ``mesh.polygons`` rather than ``mesh.faces``).
-- :class:`bpy.types.MeshTessFace` -
- the result of triangulating (tessellated) polygons,
- the main method of face access in 2.62 or older (access as ``mesh.tessfaces``).
+- :class:`bpy.types.MeshLoopTriangle` -
+ the result of tessellating polygons into triangles
+ (access as ``mesh.loop_triangles``).
- :class:`bmesh.types.BMFace` -
the polygons as used in editmode.
For the purpose of the following documentation,
-these will be referred to as polygons, tessfaces and bmesh-faces respectively.
+these will be referred to as polygons, loop triangles and bmesh-faces respectively.
5+ sided faces will be referred to as ``ngons``.
@@ -234,13 +234,8 @@ All 3 datatypes can be used for face creation.
- polygons are the most efficient way to create faces but the data structure is _very_ rigid and inflexible,
you must have all your vertes and faces ready and create them all at once.
- This is further complicated by the fact that each polygon does not store its own verts (as with tessfaces),
+ This is further complicated by the fact that each polygon does not store its own verts,
rather they reference an index and size in :class:`bpy.types.Mesh.loops` which are a fixed array too.
-- tessfaces ideally should not be used for creating faces since they are really only tessellation cache of polygons,
- however for scripts upgrading from 2.62 this is by far the most straightforward option.
- This works by creating tessfaces and when finished -
- they can be converted into polygons by calling :class:`bpy.types.Mesh.update`.
- The obvious limitation is ngons can't be created this way.
- bmesh-faces are most likely the easiest way for new scripts to create faces,
since faces can be added one by one and the api has features intended for mesh manipulation.
While :class:`bmesh.types.BMesh` uses more memory it can be managed by only operating on one mesh at a time.
@@ -265,36 +260,12 @@ All 3 data types can be used for exporting,
the choice mostly depends on whether the target format supports ngons or not.
- Polygons are the most direct & efficient way to export providing they convert into the output format easily enough.
-- Tessfaces work well for exporting to formats which dont support ngons,
+- Tessfaces work well for exporting to formats which don't support ngons,
in fact this is the only place where their use is encouraged.
- BMesh-Faces can work for exporting too but may not be necessary if polygons can be used
since using bmesh gives some overhead because its not the native storage format in object mode.
-Upgrading Importers from 2.62
------------------------------
-
-Importers can be upgraded to work with only minor changes.
-
-The main change to be made is used the tessellation versions of each attribute.
-
-- mesh.faces --> :class:`bpy.types.Mesh.tessfaces`
-- mesh.uv_textures --> :class:`bpy.types.Mesh.tessface_uv_textures`
-- mesh.vertex_colors --> :class:`bpy.types.Mesh.tessface_vertex_colors`
-
-Once the data is created call :class:`bpy.types.Mesh.update` to convert the tessfaces into polygons.
-
-
-Upgrading Exporters from 2.62
------------------------------
-
-For exporters the most direct way to upgrade is to use tessfaces as with importing
-however its important to know that tessfaces may **not** exist for a mesh,
-the array will be empty as if there are no faces.
-
-So before accessing tessface data call: :class:`bpy.types.Mesh.update` ``(calc_tessface=True)``.
-
-
EditBones, PoseBones, Bone... Bones
===================================
@@ -551,7 +522,7 @@ to avoid getting stuck too deep in encoding problems - here are some suggestions
.. note::
- Sometimes it's preferrable to avoid string encoding issues by using bytes instead of Python strings,
+ Sometimes it's preferable to avoid string encoding issues by using bytes instead of Python strings,
when reading some input its less trouble to read it as binary data
though you will still need to decide how to treat any strings you want to use with Blender,
some importers do this.
diff --git a/doc/python_api/rst/info_tips_and_tricks.rst b/doc/python_api/rst/info_tips_and_tricks.rst
index b7137fcbdea..332716087a7 100644
--- a/doc/python_api/rst/info_tips_and_tricks.rst
+++ b/doc/python_api/rst/info_tips_and_tricks.rst
@@ -209,7 +209,7 @@ Bundled Python & Extensions
===========================
The Blender releases distributed from blender.org include a complete Python installation on all platforms,
-this has the disadvantage that any extensions you have installed in your systems Python wont be found by Blender.
+this has the disadvantage that any extensions you have installed in your systems Python won't be found by Blender.
There are 2 ways around this:
diff --git a/doc/python_api/rst_from_bmesh_opdefines.py b/doc/python_api/rst_from_bmesh_opdefines.py
index d9e2f7f12e7..c4e97d1f38b 100644
--- a/doc/python_api/rst_from_bmesh_opdefines.py
+++ b/doc/python_api/rst_from_bmesh_opdefines.py
@@ -346,7 +346,7 @@ def main():
elif tp_sub == BMO_OP_SLOT_SUBTYPE_PTR_MESH:
tp_str = ":class:`bpy.types.Mesh`"
else:
- print("Cant find", vars_dict_reverse[tp_sub])
+ print("Can't find", vars_dict_reverse[tp_sub])
assert(0)
elif tp == BMO_OP_SLOT_ELEMENT_BUF:
@@ -383,10 +383,10 @@ def main():
elif tp_sub == BMO_OP_SLOT_SUBTYPE_MAP_INTERNAL:
tp_str += "unknown internal data, not compatible with python"
else:
- print("Cant find", vars_dict_reverse[tp_sub])
+ print("Can't find", vars_dict_reverse[tp_sub])
assert(0)
else:
- print("Cant find", vars_dict_reverse[tp])
+ print("Can't find", vars_dict_reverse[tp])
assert(0)
args_wash.append((name, tp_str, comment))
diff --git a/doc/python_api/sphinx_changelog_gen.py b/doc/python_api/sphinx_changelog_gen.py
index 8758590dbae..c96412b9d65 100644
--- a/doc/python_api/sphinx_changelog_gen.py
+++ b/doc/python_api/sphinx_changelog_gen.py
@@ -113,7 +113,7 @@ def api_dump():
)
del props
- # python props, tricky since we dont know much about them.
+ # python props, tricky since we don't know much about them.
for prop_id, attr in struct_info.get_py_properties():
dump_class[prop_id] = (
@@ -289,7 +289,7 @@ def api_changelog(api_from, api_to, api_out):
if props_old:
write_title("Removed", "^")
for prop_id in props_old:
- fw("* **%s**\n" % prop_id) # cant link to remvoed docs
+ fw("* **%s**\n" % prop_id) # can't link to removed docs
fw("\n")
if props_moved:
@@ -351,7 +351,7 @@ def main():
"--api_out", dest="api_out", metavar='FILE',
help="Output sphinx changelog")
- args = parser.parse_args(argv) # In this example we wont use the args
+ args = parser.parse_args(argv) # In this example we won't use the args
if not argv:
print("No args given!")
diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py
index 6e7d2e45f3a..ae6e53491fd 100644
--- a/doc/python_api/sphinx_doc_gen.py
+++ b/doc/python_api/sphinx_doc_gen.py
@@ -235,7 +235,9 @@ else:
"bpy.utils.previews",
"bpy_extras",
"gpu",
- "gpu.offscreen",
+ "gpu.types",
+ "gpu.matrix",
+ "gpu.select",
"idprop.types",
"mathutils",
"mathutils.bvhtree",
@@ -461,7 +463,7 @@ if ARGS.sphinx_build_pdf:
# --------------------------------API DUMP--------------------------------------
-# lame, python wont give some access
+# lame, python won't give some access
ClassMethodDescriptorType = type(dict.__dict__['fromkeys'])
MethodDescriptorType = type(dict.get)
GetSetDescriptorType = type(int.real)
@@ -640,12 +642,12 @@ def pyfunc2sphinx(ident, fw, module_name, type_name, identifier, py_func, is_cla
if type(py_func) == MethodType:
return
- arg_str = inspect.formatargspec(*inspect.getfullargspec(py_func))
+ arg_str = str(inspect.signature(py_func))
if not is_class:
func_type = "function"
- # ther rest are class methods
+ # the rest are class methods
elif arg_str.startswith("(self, ") or arg_str == "(self)":
arg_str = "()" if (arg_str == "(self)") else ("(" + arg_str[7:])
func_type = "method"
@@ -779,7 +781,7 @@ def pymodule2sphinx(basepath, module_name, module, title):
fw(".. module:: %s\n\n" % module_name)
if module.__doc__:
- # Note, may contain sphinx syntax, dont mangle!
+ # Note, may contain sphinx syntax, don't mangle!
fw(module.__doc__.strip())
fw("\n\n")
@@ -977,6 +979,7 @@ def pymodule2sphinx(basepath, module_name, module, title):
# Changes in Blender will force errors here
context_type_map = {
+ # context_member: (RNA type, is_collection)
"active_base": ("ObjectBase", False),
"active_bone": ("EditBone", False),
"active_gpencil_brush": ("GPencilSculptBrush", False),
@@ -1038,6 +1041,7 @@ context_type_map = {
"selected_nodes": ("Node", True),
"selected_objects": ("Object", True),
"selected_pose_bones": ("PoseBone", True),
+ "selected_pose_bones_from_active_object": ("PoseBone", True),
"selected_sequences": ("Sequence", True),
"sequences": ("Sequence", True),
"smoke": ("SmokeModifier", False),
@@ -1047,6 +1051,7 @@ context_type_map = {
"texture_slot": ("MaterialTextureSlot", False),
"texture_user": ("ID", False),
"texture_user_property": ("Property", False),
+ "uv_sculpt_object": ("Object", False),
"vertex_paint_object": ("Object", False),
"visible_bases": ("ObjectBase", True),
"visible_bones": ("EditBone", True),
@@ -1076,7 +1081,7 @@ def pycontext2sphinx(basepath):
def write_contex_cls():
fw(title_string("Global Context", "-"))
- fw("These properties are avilable in any contexts.\n\n")
+ fw("These properties are available in any contexts.\n\n")
# very silly. could make these global and only access once.
# structs, funcs, ops, props = rna_info.BuildRNAInfo()
@@ -1100,7 +1105,7 @@ def pycontext2sphinx(basepath):
if prop.description:
fw(" %s\n\n" % prop.description)
- # special exception, cant use genric code here for enums
+ # special exception, can't use generic code here for enums
if prop.type == "enum":
enum_text = pyrna_enum2sphinx(prop)
if enum_text:
@@ -1222,7 +1227,7 @@ def pyrna2sphinx(basepath):
if prop.name or prop.description:
fw(ident + " " + ", ".join(val for val in (prop.name, prop.description) if val) + "\n\n")
- # special exception, cant use genric code here for enums
+ # special exception, can't use generic code here for enums
if enum_text:
write_indented_lines(ident + " ", fw, enum_text)
fw("\n")
@@ -1321,7 +1326,7 @@ def pyrna2sphinx(basepath):
if prop.description:
fw(" %s\n\n" % prop.description)
- # special exception, cant use genric code here for enums
+ # special exception, can't use generic code here for enums
if prop.type == "enum":
enum_text = pyrna_enum2sphinx(prop)
if enum_text:
@@ -1354,7 +1359,7 @@ def pyrna2sphinx(basepath):
elif func.return_values: # multiple return values
fw(" :return (%s):\n" % ", ".join(prop.identifier for prop in func.return_values))
for prop in func.return_values:
- # TODO, pyrna_enum2sphinx for multiple return values... actually dont
+ # TODO, pyrna_enum2sphinx for multiple return values... actually don't
# think we even use this but still!!!
type_descr = prop.get_type_description(
as_ret=True, class_fmt=":class:`%s`", collection_id=_BPY_PROP_COLLECTION_ID)
@@ -1716,7 +1721,7 @@ def write_rst_contents(basepath):
standalone_modules = (
# submodules are added in parent page
- "mathutils", "freestyle", "bgl", "blf", "gpu",
+ "mathutils", "freestyle", "bgl", "blf", "gpu", "gpu_extras",
"aud", "bpy_extras", "idprop.types", "bmesh",
)
@@ -1818,11 +1823,16 @@ def write_rst_importable_modules(basepath):
"bpy.path": "Path Utilities",
"bpy.utils": "Utilities",
"bpy_extras": "Extra Utilities",
+ "gpu_extras": "GPU Utilities",
# C_modules
"aud": "Audio System",
"blf": "Font Drawing",
- "gpu.offscreen": "GPU Off-Screen Buffer",
+ "gpu": "GPU Shader Module",
+ "gpu.types": "GPU Types",
+ "gpu.matrix": "GPU Matrix",
+ "gpu.select": "GPU Select",
+ "gpu.shader": "GPU Shader",
"bmesh": "BMesh Module",
"bmesh.types": "BMesh Types",
"bmesh.utils": "BMesh Utilities",
@@ -1830,8 +1840,7 @@ def write_rst_importable_modules(basepath):
"bpy.app": "Application Data",
"bpy.app.handlers": "Application Handlers",
"bpy.app.translations": "Application Translations",
- # TODO(campbell)
- # "bpy.app.icons": "Application Icons",
+ "bpy.app.icons": "Application Icons",
"bpy.props": "Property Definitions",
"idprop.types": "ID Property Access",
"mathutils": "Math Types & Utilities",
@@ -1865,7 +1874,6 @@ def copy_handwritten_rsts(basepath):
# TODO put this docs in Blender's code and use import as per modules above
handwritten_modules = [
"bgl", # "Blender OpenGl wrapper"
- "gpu", # "GPU Shader Module"
"bmesh.ops", # generated by rst_from_bmesh_opdefines.py
# includes...
diff --git a/doc/python_api/sphinx_doc_gen.sh b/doc/python_api/sphinx_doc_gen.sh
index 0c1f531ffac..4b7569f7d54 100755
--- a/doc/python_api/sphinx_doc_gen.sh
+++ b/doc/python_api/sphinx_doc_gen.sh
@@ -58,7 +58,10 @@ SPHINX_WORKDIR="$(mktemp --directory --suffix=.sphinx)"
# Generate reStructuredText (blender/python only)
if $DO_EXE_BLENDER ; then
- # dont delete existing docs, now partial updates are used for quick builds.
+ # Don't delete existing docs, now partial updates are used for quick builds.
+ #
+ # Disable ASAN error halt since it results in nonzero exit code on any minor issue.
+ ASAN_OPTIONS=halt_on_error=0 \
$BLENDER_BIN \
--background \
-noaudio \
@@ -89,7 +92,7 @@ if $DO_OUT_HTML ; then
# and zip up there, for now this is OK
rm -rf sphinx-out/.doctrees
- # incase we have a zip already
+ # in case we have a zip already
rm -f blender_python_reference_$BLENDER_VERSION.zip
# ------------------------------------------------------------------------
diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt
index c8ee96ef3d0..dcc2965d420 100644
--- a/extern/CMakeLists.txt
+++ b/extern/CMakeLists.txt
@@ -63,10 +63,6 @@ if(NOT WITH_SYSTEM_GLEW)
endif()
endif()
-if(WITH_IMAGE_OPENJPEG AND (NOT WITH_SYSTEM_OPENJPEG))
- add_subdirectory(libopenjpeg)
-endif()
-
if(WITH_LZO AND NOT WITH_SYSTEM_LZO)
add_subdirectory(lzo)
endif()
diff --git a/extern/libopenjpeg/README.blender b/extern/libopenjpeg/README.blender
deleted file mode 100644
index 5aa213c7707..00000000000
--- a/extern/libopenjpeg/README.blender
+++ /dev/null
@@ -1,5 +0,0 @@
-Project: OpenJPEG
-URL: http://www.openjpeg.org
-License: BSD 2-Clause
-Upstream version: 1.5.2
-Local modifications:
diff --git a/extern/libopenjpeg/bio.c b/extern/libopenjpeg/bio.c
deleted file mode 100644
index f04f3e503fb..00000000000
--- a/extern/libopenjpeg/bio.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "opj_includes.h"
-
-/** @defgroup BIO BIO - Individual bit input-output stream */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-/**
-Write a bit
-@param bio BIO handle
-@param b Bit to write (0 or 1)
-*/
-static void bio_putbit(opj_bio_t *bio, unsigned int b);
-/**
-Read a bit
-@param bio BIO handle
-@return Returns the read bit
-*/
-static int bio_getbit(opj_bio_t *bio);
-/**
-Write a byte
-@param bio BIO handle
-@return Returns 0 if successful, returns 1 otherwise
-*/
-static int bio_byteout(opj_bio_t *bio);
-/**
-Read a byte
-@param bio BIO handle
-@return Returns 0 if successful, returns 1 otherwise
-*/
-static int bio_bytein(opj_bio_t *bio);
-
-/*@}*/
-
-/*@}*/
-
-/*
-==========================================================
- local functions
-==========================================================
-*/
-
-static int bio_byteout(opj_bio_t *bio) {
- bio->buf = (bio->buf << 8) & 0xffff;
- bio->ct = bio->buf == 0xff00 ? 7 : 8;
- if (bio->bp >= bio->end) {
- return 1;
- }
- *bio->bp++ = (unsigned char)(bio->buf >> 8);
- return 0;
-}
-
-static int bio_bytein(opj_bio_t *bio) {
- bio->buf = (bio->buf << 8) & 0xffff;
- bio->ct = bio->buf == 0xff00 ? 7 : 8;
- if (bio->bp >= bio->end) {
- return 1;
- }
- bio->buf |= *bio->bp++;
- return 0;
-}
-
-static void bio_putbit(opj_bio_t *bio, unsigned int b) {
- if (bio->ct == 0) {
- bio_byteout(bio);
- }
- bio->ct--;
- bio->buf |= b << bio->ct;
-}
-
-static int bio_getbit(opj_bio_t *bio) {
- if (bio->ct == 0) {
- bio_bytein(bio);
- }
- bio->ct--;
- return (bio->buf >> bio->ct) & 1;
-}
-
-/*
-==========================================================
- Bit Input/Output interface
-==========================================================
-*/
-
-opj_bio_t* bio_create(void) {
- opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));
- return bio;
-}
-
-void bio_destroy(opj_bio_t *bio) {
- if(bio) {
- opj_free(bio);
- }
-}
-
-int bio_numbytes(opj_bio_t *bio) {
- return (int)(bio->bp - bio->start);
-}
-
-void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) {
- bio->start = bp;
- bio->end = bp + len;
- bio->bp = bp;
- bio->buf = 0;
- bio->ct = 8;
-}
-
-void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) {
- bio->start = bp;
- bio->end = bp + len;
- bio->bp = bp;
- bio->buf = 0;
- bio->ct = 0;
-}
-
-void bio_write(opj_bio_t *bio, int v, int n) {
- int i;
- for (i = n - 1; i >= 0; i--) {
- bio_putbit(bio, (v >> i) & 1);
- }
-}
-
-int bio_read(opj_bio_t *bio, int n) {
- int i, v;
- v = 0;
- for (i = n - 1; i >= 0; i--) {
- v += bio_getbit(bio) << i;
- }
- return v;
-}
-
-int bio_flush(opj_bio_t *bio) {
- bio->ct = 0;
- if (bio_byteout(bio)) {
- return 1;
- }
- if (bio->ct == 7) {
- bio->ct = 0;
- if (bio_byteout(bio)) {
- return 1;
- }
- }
- return 0;
-}
-
-int bio_inalign(opj_bio_t *bio) {
- bio->ct = 0;
- if ((bio->buf & 0xff) == 0xff) {
- if (bio_bytein(bio)) {
- return 1;
- }
- bio->ct = 0;
- }
- return 0;
-}
diff --git a/extern/libopenjpeg/bio.h b/extern/libopenjpeg/bio.h
deleted file mode 100644
index 764d7cb2e92..00000000000
--- a/extern/libopenjpeg/bio.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __BIO_H
-#define __BIO_H
-/**
-@file bio.h
-@brief Implementation of an individual bit input-output (BIO)
-
-The functions in BIO.C have for goal to realize an individual bit input - output.
-*/
-
-/** @defgroup BIO BIO - Individual bit input-output stream */
-/*@{*/
-
-/**
-Individual bit input-output stream (BIO)
-*/
-typedef struct opj_bio {
- /** pointer to the start of the buffer */
- unsigned char *start;
- /** pointer to the end of the buffer */
- unsigned char *end;
- /** pointer to the present position in the buffer */
- unsigned char *bp;
- /** temporary place where each byte is read or written */
- unsigned int buf;
- /** coder : number of bits free to write. decoder : number of bits read */
- int ct;
-} opj_bio_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a new BIO handle
-@return Returns a new BIO handle if successful, returns NULL otherwise
-*/
-opj_bio_t* bio_create(void);
-/**
-Destroy a previously created BIO handle
-@param bio BIO handle to destroy
-*/
-void bio_destroy(opj_bio_t *bio);
-/**
-Number of bytes written.
-@param bio BIO handle
-@return Returns the number of bytes written
-*/
-int bio_numbytes(opj_bio_t *bio);
-/**
-Init encoder
-@param bio BIO handle
-@param bp Output buffer
-@param len Output buffer length
-*/
-void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len);
-/**
-Init decoder
-@param bio BIO handle
-@param bp Input buffer
-@param len Input buffer length
-*/
-void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len);
-/**
-Write bits
-@param bio BIO handle
-@param v Value of bits
-@param n Number of bits to write
-*/
-void bio_write(opj_bio_t *bio, int v, int n);
-/**
-Read bits
-@param bio BIO handle
-@param n Number of bits to read
-@return Returns the corresponding read number
-*/
-int bio_read(opj_bio_t *bio, int n);
-/**
-Flush bits
-@param bio BIO handle
-@return Returns 1 if successful, returns 0 otherwise
-*/
-int bio_flush(opj_bio_t *bio);
-/**
-Passes the ending bits (coming from flushing)
-@param bio BIO handle
-@return Returns 1 if successful, returns 0 otherwise
-*/
-int bio_inalign(opj_bio_t *bio);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __BIO_H */
-
diff --git a/extern/libopenjpeg/cidx_manager.c b/extern/libopenjpeg/cidx_manager.c
deleted file mode 100644
index f3b251ffa09..00000000000
--- a/extern/libopenjpeg/cidx_manager.c
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * $Id: cidx_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
- *
- * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2011, Professor Benoit Macq
- * Copyright (c) 2003-2004, Yannick Verschueren
- * Copyright (c) 2010-2011, Kaori Hagihara
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "opj_includes.h"
-
-
-/*
- * Write CPTR Codestream finder box
- *
- * @param[in] coff offset of j2k codestream
- * @param[in] clen length of j2k codestream
- * @param[in] cio file output handle
- */
-void write_cptr(int coff, int clen, opj_cio_t *cio);
-
-
-/*
- * Write main header index table (box)
- *
- * @param[in] coff offset of j2k codestream
- * @param[in] cstr_info codestream information
- * @param[in] cio file output handle
- * @return length of mainmhix box
- */
-int write_mainmhix( int coff, opj_codestream_info_t cstr_info, opj_cio_t *cio);
-
-
-/*
- * Check if EPH option is used
- *
- * @param[in] coff offset of j2k codestream
- * @param[in] markers marker information
- * @param[in] marknum number of markers
- * @param[in] cio file output handle
- * @return true if EPH is used
- */
-opj_bool check_EPHuse( int coff, opj_marker_info_t *markers, int marknum, opj_cio_t *cio);
-
-
-int write_cidx( int offset, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t cstr_info, int j2klen)
-{
- int len, i, lenp;
- opj_jp2_box_t *box;
- int num_box = 0;
- opj_bool EPHused;
- (void)image; /* unused ? */
-
- lenp = -1;
- box = (opj_jp2_box_t *)opj_calloc( 32, sizeof(opj_jp2_box_t));
-
- for (i=0;i<2;i++){
-
- if(i)
- cio_seek( cio, lenp);
-
- lenp = cio_tell( cio);
-
- cio_skip( cio, 4); /* L [at the end] */
- cio_write( cio, JPIP_CIDX, 4); /* CIDX */
- write_cptr( offset, cstr_info.codestream_size, cio);
-
- write_manf( i, num_box, box, cio);
-
- num_box = 0;
- box[num_box].length = write_mainmhix( offset, cstr_info, cio);
- box[num_box].type = JPIP_MHIX;
- num_box++;
-
- box[num_box].length = write_tpix( offset, cstr_info, j2klen, cio);
- box[num_box].type = JPIP_TPIX;
- num_box++;
-
- box[num_box].length = write_thix( offset, cstr_info, cio);
- box[num_box].type = JPIP_THIX;
- num_box++;
-
- EPHused = check_EPHuse( offset, cstr_info.marker, cstr_info.marknum, cio);
-
- box[num_box].length = write_ppix( offset, cstr_info, EPHused, j2klen, cio);
- box[num_box].type = JPIP_PPIX;
- num_box++;
-
- box[num_box].length = write_phix( offset, cstr_info, EPHused, j2klen, cio);
- box[num_box].type = JPIP_PHIX;
- num_box++;
-
- len = cio_tell( cio)-lenp;
- cio_seek( cio, lenp);
- cio_write( cio, len, 4); /* L */
- cio_seek( cio, lenp+len);
- }
-
- opj_free( box);
-
- return len;
-}
-
-void write_cptr(int coff, int clen, opj_cio_t *cio)
-{
- int len, lenp;
-
- lenp = cio_tell( cio);
- cio_skip( cio, 4); /* L [at the end] */
- cio_write( cio, JPIP_CPTR, 4); /* T */
- cio_write( cio, 0, 2); /* DR A PRECISER !! */
- cio_write( cio, 0, 2); /* CONT */
- cio_write( cio, coff, 8); /* COFF A PRECISER !! */
- cio_write( cio, clen, 8); /* CLEN */
- len = cio_tell( cio) - lenp;
- cio_seek( cio, lenp);
- cio_write( cio, len, 4); /* L */
- cio_seek( cio, lenp+len);
-}
-
-void write_manf(int second, int v, opj_jp2_box_t *box, opj_cio_t *cio)
-{
- int len, lenp, i;
-
- lenp = cio_tell( cio);
- cio_skip( cio, 4); /* L [at the end] */
- cio_write( cio, JPIP_MANF,4); /* T */
-
- if (second){ /* Write only during the second pass */
- for( i=0; i<v; i++){
- cio_write( cio, box[i].length, 4); /* Box length */
- cio_write( cio, box[i].type, 4); /* Box type */
- }
- }
-
- len = cio_tell( cio) - lenp;
- cio_seek( cio, lenp);
- cio_write( cio, len, 4); /* L */
- cio_seek( cio, lenp+len);
-}
-
-int write_mainmhix( int coff, opj_codestream_info_t cstr_info, opj_cio_t *cio)
-{
- int i;
- int len, lenp;
-
- lenp = cio_tell( cio);
- cio_skip( cio, 4); /* L [at the end] */
- cio_write( cio, JPIP_MHIX, 4); /* MHIX */
-
- cio_write( cio, cstr_info.main_head_end-cstr_info.main_head_start+1, 8); /* TLEN */
-
- for(i = 1; i < cstr_info.marknum; i++){ /* Marker restricted to 1 apparition, skip SOC marker */
- cio_write( cio, cstr_info.marker[i].type, 2);
- cio_write( cio, 0, 2);
- cio_write( cio, cstr_info.marker[i].pos-coff, 8);
- cio_write( cio, cstr_info.marker[i].len, 2);
- }
-
- len = cio_tell( cio) - lenp;
- cio_seek( cio, lenp);
- cio_write( cio, len, 4); /* L */
- cio_seek( cio, lenp+len);
-
- return len;
-}
-
-opj_bool check_EPHuse( int coff, opj_marker_info_t *markers, int marknum, opj_cio_t *cio)
-{
- opj_bool EPHused = OPJ_FALSE;
- int i=0;
- int org_pos;
- unsigned int Scod;
-
- for(i = 0; i < marknum; i++){
- if( markers[i].type == J2K_MS_COD){
- org_pos = cio_tell( cio);
- cio_seek( cio, coff+markers[i].pos+2);
-
- Scod = cio_read( cio, 1);
- if( ((Scod >> 2) & 1))
- EPHused = OPJ_TRUE;
- cio_seek( cio, org_pos);
-
- break;
- }
- }
- return EPHused;
-}
diff --git a/extern/libopenjpeg/cidx_manager.h b/extern/libopenjpeg/cidx_manager.h
deleted file mode 100644
index 23eebd52baa..00000000000
--- a/extern/libopenjpeg/cidx_manager.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * $Id: cidx_manager.h 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
- *
- * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2011, Professor Benoit Macq
- * Copyright (c) 2003-2004, Yannick Verschueren
- * Copyright (c) 2010-2011, Kaori Hagihara
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*! \file
- * \brief Modification of jpip.h from 2KAN indexer
- */
-
-
-#ifndef CIDX_MANAGER_H_
-# define CIDX_MANAGER_H_
-
-#include "openjpeg.h"
-
-
-/*
- * Write Codestream index box (superbox)
- *
- * @param[in] offset offset of j2k codestream
- * @param[in] cio file output handle
- * @param[in] image image data
- * @param[in] cstr_info codestream information
- * @param[in] j2klen length of j2k codestream
- * @return length of cidx box
- */
-int write_cidx( int offset, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t cstr_info, int j2klen);
-
-
-#endif /* !CIDX_MANAGER_H_ */
diff --git a/extern/libopenjpeg/cio.c b/extern/libopenjpeg/cio.c
deleted file mode 100644
index 97cccea6dee..00000000000
--- a/extern/libopenjpeg/cio.c
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "opj_includes.h"
-#include <assert.h>
-
-/* ----------------------------------------------------------------------- */
-
-opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length) {
- opj_cp_t *cp = NULL;
- opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t));
- if(!cio) return NULL;
- cio->cinfo = cinfo;
- if(buffer && length) {
- /* wrap a user buffer containing the encoded image */
- cio->openmode = OPJ_STREAM_READ;
- cio->buffer = buffer;
- cio->length = length;
- }
- else if(!buffer && !length && cinfo) {
- /* allocate a buffer for the encoded image */
- cio->openmode = OPJ_STREAM_WRITE;
- switch(cinfo->codec_format) {
- case CODEC_J2K:
- cp = ((opj_j2k_t*)cinfo->j2k_handle)->cp;
- break;
- case CODEC_JP2:
- cp = ((opj_jp2_t*)cinfo->jp2_handle)->j2k->cp;
- break;
- default:
- opj_free(cio);
- return NULL;
- }
- cio->length = (unsigned int) (0.1625 * cp->img_size + 2000); /* 0.1625 = 1.3/8 and 2000 bytes as a minimum for headers */
- cio->buffer = (unsigned char *)opj_malloc(cio->length);
- if(!cio->buffer) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error allocating memory for compressed bitstream\n");
- opj_free(cio);
- return NULL;
- }
- }
- else {
- opj_free(cio);
- return NULL;
- }
-
- /* Initialize byte IO */
- cio->start = cio->buffer;
- cio->end = cio->buffer + cio->length;
- cio->bp = cio->buffer;
-
- return cio;
-}
-
-void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio) {
- if(cio) {
- if(cio->openmode == OPJ_STREAM_WRITE) {
- /* destroy the allocated buffer */
- opj_free(cio->buffer);
- }
- /* destroy the cio */
- opj_free(cio);
- }
-}
-
-
-/* ----------------------------------------------------------------------- */
-
-/*
- * Get position in byte stream.
- */
-int OPJ_CALLCONV cio_tell(opj_cio_t *cio) {
- return cio->bp - cio->start;
-}
-
-/*
- * Set position in byte stream.
- *
- * pos : position, in number of bytes, from the beginning of the stream
- */
-void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos) {
- assert((cio->start + pos) <= cio->end);
- cio->bp = cio->start + pos;
-}
-
-/*
- * Number of bytes left before the end of the stream.
- */
-int cio_numbytesleft(opj_cio_t *cio) {
- assert((cio->end - cio->bp) >= 0);
- return cio->end - cio->bp;
-}
-
-/*
- * Get pointer to the current position in the stream.
- */
-unsigned char *cio_getbp(opj_cio_t *cio) {
- return cio->bp;
-}
-
-/*
- * Write a byte.
- */
-opj_bool cio_byteout(opj_cio_t *cio, unsigned char v) {
- if (cio->bp >= cio->end) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "write error\n");
- return OPJ_FALSE;
- }
- *cio->bp++ = v;
- return OPJ_TRUE;
-}
-
-/*
- * Read a byte.
- */
-unsigned char cio_bytein(opj_cio_t *cio) {
- assert(cio->bp >= cio->start);
- if (cio->bp >= cio->end) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "read error: passed the end of the codestream (start = %d, current = %d, end = %d\n", cio->start, cio->bp, cio->end);
- return 0;
- }
- return *cio->bp++;
-}
-
-/*
- * Write some bytes.
- *
- * v : value to write
- * n : number of bytes to write
- */
-unsigned int cio_write(opj_cio_t *cio, unsigned int64 v, int n) {
- int i;
- for (i = n - 1; i >= 0; i--) {
- if( !cio_byteout(cio, (unsigned char) ((v >> (i << 3)) & 0xff)) )
- return 0;
- }
- return n;
-}
-
-/*
- * Read some bytes.
- *
- * n : number of bytes to read
- *
- * return : value of the n bytes read
- */
-unsigned int cio_read(opj_cio_t *cio, int n) {
- int i;
- unsigned int v;
- v = 0;
- for (i = n - 1; i >= 0; i--) {
- v += (unsigned int)cio_bytein(cio) << (i << 3);
- }
- return v;
-}
-
-/*
- * Skip some bytes.
- *
- * n : number of bytes to skip
- */
-void cio_skip(opj_cio_t *cio, int n) {
- assert((cio->bp + n) >= cio->bp);
- if (((cio->bp + n) < cio->start) || ((cio->bp + n) > cio->end)) {
- assert(0);
- }
- cio->bp += n;
-}
-
-
-
diff --git a/extern/libopenjpeg/cio.h b/extern/libopenjpeg/cio.h
deleted file mode 100644
index e62743141ca..00000000000
--- a/extern/libopenjpeg/cio.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __CIO_H
-#define __CIO_H
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-#define int64 __int64
-#else
-#define int64 long long
-#endif
-
-/**
-@file cio.h
-@brief Implementation of a byte input-output process (CIO)
-
-The functions in CIO.C have for goal to realize a byte input / output process.
-*/
-
-/** @defgroup CIO CIO - byte input-output stream */
-/*@{*/
-
-/** @name Exported functions (see also openjpeg.h) */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Number of bytes left before the end of the stream
-@param cio CIO handle
-@return Returns the number of bytes before the end of the stream
-*/
-int cio_numbytesleft(opj_cio_t *cio);
-/**
-Get pointer to the current position in the stream
-@param cio CIO handle
-@return Returns a pointer to the current position
-*/
-unsigned char *cio_getbp(opj_cio_t *cio);
-/**
-Write some bytes
-@param cio CIO handle
-@param v Value to write
-@param n Number of bytes to write
-@return Returns the number of bytes written or 0 if an error occured
-*/
-unsigned int cio_write(opj_cio_t *cio, unsigned int64 v, int n);
-/**
-Read some bytes
-@param cio CIO handle
-@param n Number of bytes to read
-@return Returns the value of the n bytes read
-*/
-unsigned int cio_read(opj_cio_t *cio, int n);
-/**
-Skip some bytes
-@param cio CIO handle
-@param n Number of bytes to skip
-*/
-void cio_skip(opj_cio_t *cio, int n);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __CIO_H */
-
diff --git a/extern/libopenjpeg/dwt.c b/extern/libopenjpeg/dwt.c
deleted file mode 100644
index 0fbfc2033fe..00000000000
--- a/extern/libopenjpeg/dwt.c
+++ /dev/null
@@ -1,858 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2007, Jonathan Ballard <dzonatas@dzonux.net>
- * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifdef __SSE__
-#include <xmmintrin.h>
-#endif
-
-#include "opj_includes.h"
-
-/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
-/*@{*/
-
-#define WS(i) v->mem[(i)*2]
-#define WD(i) v->mem[(1+(i)*2)]
-
-/** @name Local data structures */
-/*@{*/
-
-typedef struct dwt_local {
- int* mem;
- int dn;
- int sn;
- int cas;
-} dwt_t;
-
-typedef union {
- float f[4];
-} v4;
-
-typedef struct v4dwt_local {
- v4* wavelet ;
- int dn ;
- int sn ;
- int cas ;
-} v4dwt_t ;
-
-static const float dwt_alpha = 1.586134342f; /* 12994 */
-static const float dwt_beta = 0.052980118f; /* 434 */
-static const float dwt_gamma = -0.882911075f; /* -7233 */
-static const float dwt_delta = -0.443506852f; /* -3633 */
-
-static const float K = 1.230174105f; /* 10078 */
-/* FIXME: What is this constant? */
-static const float c13318 = 1.625732422f;
-
-/*@}*/
-
-/**
-Virtual function type for wavelet transform in 1-D
-*/
-typedef void (*DWT1DFN)(dwt_t* v);
-
-/** @name Local static functions */
-/*@{*/
-
-/**
-Forward lazy transform (horizontal)
-*/
-static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas);
-/**
-Forward lazy transform (vertical)
-*/
-static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas);
-/**
-Inverse lazy transform (horizontal)
-*/
-static void dwt_interleave_h(dwt_t* h, int *a);
-/**
-Inverse lazy transform (vertical)
-*/
-static void dwt_interleave_v(dwt_t* v, int *a, int x);
-/**
-Forward 5-3 wavelet transform in 1-D
-*/
-static void dwt_encode_1(int *a, int dn, int sn, int cas);
-/**
-Inverse 5-3 wavelet transform in 1-D
-*/
-static void dwt_decode_1(dwt_t *v);
-/**
-Forward 9-7 wavelet transform in 1-D
-*/
-static void dwt_encode_1_real(int *a, int dn, int sn, int cas);
-/**
-Explicit calculation of the Quantization Stepsizes
-*/
-static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize);
-/**
-Inverse wavelet transform in 2-D.
-*/
-static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int i, DWT1DFN fn);
-
-/*@}*/
-
-/*@}*/
-
-#define S(i) a[(i)*2]
-#define D(i) a[(1+(i)*2)]
-#define S_(i) ((i)<0?S(0):((i)>=sn?S(sn-1):S(i)))
-#define D_(i) ((i)<0?D(0):((i)>=dn?D(dn-1):D(i)))
-/* new */
-#define SS_(i) ((i)<0?S(0):((i)>=dn?S(dn-1):S(i)))
-#define DD_(i) ((i)<0?D(0):((i)>=sn?D(sn-1):D(i)))
-
-/* <summary> */
-/* This table contains the norms of the 5-3 wavelets for different bands. */
-/* </summary> */
-static const double dwt_norms[4][10] = {
- {1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3},
- {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
- {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
- {.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93}
-};
-
-/* <summary> */
-/* This table contains the norms of the 9-7 wavelets for different bands. */
-/* </summary> */
-static const double dwt_norms_real[4][10] = {
- {1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9},
- {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
- {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
- {2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2}
-};
-
-/*
-==========================================================
- local functions
-==========================================================
-*/
-
-/* <summary> */
-/* Forward lazy transform (horizontal). */
-/* </summary> */
-static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas) {
- int i;
- for (i=0; i<sn; i++) b[i]=a[2*i+cas];
- for (i=0; i<dn; i++) b[sn+i]=a[(2*i+1-cas)];
-}
-
-/* <summary> */
-/* Forward lazy transform (vertical). */
-/* </summary> */
-static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas) {
- int i;
- for (i=0; i<sn; i++) b[i*x]=a[2*i+cas];
- for (i=0; i<dn; i++) b[(sn+i)*x]=a[(2*i+1-cas)];
-}
-
-/* <summary> */
-/* Inverse lazy transform (horizontal). */
-/* </summary> */
-static void dwt_interleave_h(dwt_t* h, int *a) {
- int *ai = a;
- int *bi = h->mem + h->cas;
- int i = h->sn;
- while( i-- ) {
- *bi = *(ai++);
- bi += 2;
- }
- ai = a + h->sn;
- bi = h->mem + 1 - h->cas;
- i = h->dn ;
- while( i-- ) {
- *bi = *(ai++);
- bi += 2;
- }
-}
-
-/* <summary> */
-/* Inverse lazy transform (vertical). */
-/* </summary> */
-static void dwt_interleave_v(dwt_t* v, int *a, int x) {
- int *ai = a;
- int *bi = v->mem + v->cas;
- int i = v->sn;
- while( i-- ) {
- *bi = *ai;
- bi += 2;
- ai += x;
- }
- ai = a + (v->sn * x);
- bi = v->mem + 1 - v->cas;
- i = v->dn ;
- while( i-- ) {
- *bi = *ai;
- bi += 2;
- ai += x;
- }
-}
-
-
-/* <summary> */
-/* Forward 5-3 wavelet transform in 1-D. */
-/* </summary> */
-static void dwt_encode_1(int *a, int dn, int sn, int cas) {
- int i;
-
- if (!cas) {
- if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
- for (i = 0; i < dn; i++) D(i) -= (S_(i) + S_(i + 1)) >> 1;
- for (i = 0; i < sn; i++) S(i) += (D_(i - 1) + D_(i) + 2) >> 2;
- }
- } else {
- if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */
- S(0) *= 2;
- else {
- for (i = 0; i < dn; i++) S(i) -= (DD_(i) + DD_(i - 1)) >> 1;
- for (i = 0; i < sn; i++) D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2;
- }
- }
-}
-
-/* <summary> */
-/* Inverse 5-3 wavelet transform in 1-D. */
-/* </summary> */
-static void dwt_decode_1_(int *a, int dn, int sn, int cas) {
- int i;
-
- if (!cas) {
- if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
- for (i = 0; i < sn; i++) S(i) -= (D_(i - 1) + D_(i) + 2) >> 2;
- for (i = 0; i < dn; i++) D(i) += (S_(i) + S_(i + 1)) >> 1;
- }
- } else {
- if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */
- S(0) /= 2;
- else {
- for (i = 0; i < sn; i++) D(i) -= (SS_(i) + SS_(i + 1) + 2) >> 2;
- for (i = 0; i < dn; i++) S(i) += (DD_(i) + DD_(i - 1)) >> 1;
- }
- }
-}
-
-/* <summary> */
-/* Inverse 5-3 wavelet transform in 1-D. */
-/* </summary> */
-static void dwt_decode_1(dwt_t *v) {
- dwt_decode_1_(v->mem, v->dn, v->sn, v->cas);
-}
-
-/* <summary> */
-/* Forward 9-7 wavelet transform in 1-D. */
-/* </summary> */
-static void dwt_encode_1_real(int *a, int dn, int sn, int cas) {
- int i;
- if (!cas) {
- if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
- for (i = 0; i < dn; i++)
- D(i) -= fix_mul(S_(i) + S_(i + 1), 12993);
- for (i = 0; i < sn; i++)
- S(i) -= fix_mul(D_(i - 1) + D_(i), 434);
- for (i = 0; i < dn; i++)
- D(i) += fix_mul(S_(i) + S_(i + 1), 7233);
- for (i = 0; i < sn; i++)
- S(i) += fix_mul(D_(i - 1) + D_(i), 3633);
- for (i = 0; i < dn; i++)
- D(i) = fix_mul(D(i), 5038); /*5038 */
- for (i = 0; i < sn; i++)
- S(i) = fix_mul(S(i), 6659); /*6660 */
- }
- } else {
- if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */
- for (i = 0; i < dn; i++)
- S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993);
- for (i = 0; i < sn; i++)
- D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434);
- for (i = 0; i < dn; i++)
- S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233);
- for (i = 0; i < sn; i++)
- D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633);
- for (i = 0; i < dn; i++)
- S(i) = fix_mul(S(i), 5038); /*5038 */
- for (i = 0; i < sn; i++)
- D(i) = fix_mul(D(i), 6659); /*6660 */
- }
- }
-}
-
-static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize) {
- int p, n;
- p = int_floorlog2(stepsize) - 13;
- n = 11 - int_floorlog2(stepsize);
- bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff;
- bandno_stepsize->expn = numbps - p;
-}
-
-/*
-==========================================================
- DWT interface
-==========================================================
-*/
-
-/* <summary> */
-/* Forward 5-3 wavelet transform in 2-D. */
-/* </summary> */
-void dwt_encode(opj_tcd_tilecomp_t * tilec) {
- int i, j, k;
- int *a = NULL;
- int *aj = NULL;
- int *bj = NULL;
- int w, l;
-
- w = tilec->x1-tilec->x0;
- l = tilec->numresolutions-1;
- a = tilec->data;
-
- for (i = 0; i < l; i++) {
- int rw; /* width of the resolution level computed */
- int rh; /* height of the resolution level computed */
- int rw1; /* width of the resolution level once lower than computed one */
- int rh1; /* height of the resolution level once lower than computed one */
- int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
- int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
- int dn, sn;
-
- rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
- rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
- rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
- rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
-
- cas_row = tilec->resolutions[l - i].x0 % 2;
- cas_col = tilec->resolutions[l - i].y0 % 2;
-
- sn = rh1;
- dn = rh - rh1;
- bj = (int*)opj_malloc(rh * sizeof(int));
- for (j = 0; j < rw; j++) {
- aj = a + j;
- for (k = 0; k < rh; k++) bj[k] = aj[k*w];
- dwt_encode_1(bj, dn, sn, cas_col);
- dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
- }
- opj_free(bj);
-
- sn = rw1;
- dn = rw - rw1;
- bj = (int*)opj_malloc(rw * sizeof(int));
- for (j = 0; j < rh; j++) {
- aj = a + j * w;
- for (k = 0; k < rw; k++) bj[k] = aj[k];
- dwt_encode_1(bj, dn, sn, cas_row);
- dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
- }
- opj_free(bj);
- }
-}
-
-
-/* <summary> */
-/* Inverse 5-3 wavelet transform in 2-D. */
-/* </summary> */
-void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres) {
- dwt_decode_tile(tilec, numres, &dwt_decode_1);
-}
-
-
-/* <summary> */
-/* Get gain of 5-3 wavelet transform. */
-/* </summary> */
-int dwt_getgain(int orient) {
- if (orient == 0)
- return 0;
- if (orient == 1 || orient == 2)
- return 1;
- return 2;
-}
-
-/* <summary> */
-/* Get norm of 5-3 wavelet. */
-/* </summary> */
-double dwt_getnorm(int level, int orient) {
- return dwt_norms[orient][level];
-}
-
-/* <summary> */
-/* Forward 9-7 wavelet transform in 2-D. */
-/* </summary> */
-
-void dwt_encode_real(opj_tcd_tilecomp_t * tilec) {
- int i, j, k;
- int *a = NULL;
- int *aj = NULL;
- int *bj = NULL;
- int w, l;
-
- w = tilec->x1-tilec->x0;
- l = tilec->numresolutions-1;
- a = tilec->data;
-
- for (i = 0; i < l; i++) {
- int rw; /* width of the resolution level computed */
- int rh; /* height of the resolution level computed */
- int rw1; /* width of the resolution level once lower than computed one */
- int rh1; /* height of the resolution level once lower than computed one */
- int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
- int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
- int dn, sn;
-
- rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
- rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
- rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
- rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
-
- cas_row = tilec->resolutions[l - i].x0 % 2;
- cas_col = tilec->resolutions[l - i].y0 % 2;
-
- sn = rh1;
- dn = rh - rh1;
- bj = (int*)opj_malloc(rh * sizeof(int));
- for (j = 0; j < rw; j++) {
- aj = a + j;
- for (k = 0; k < rh; k++) bj[k] = aj[k*w];
- dwt_encode_1_real(bj, dn, sn, cas_col);
- dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
- }
- opj_free(bj);
-
- sn = rw1;
- dn = rw - rw1;
- bj = (int*)opj_malloc(rw * sizeof(int));
- for (j = 0; j < rh; j++) {
- aj = a + j * w;
- for (k = 0; k < rw; k++) bj[k] = aj[k];
- dwt_encode_1_real(bj, dn, sn, cas_row);
- dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
- }
- opj_free(bj);
- }
-}
-
-
-/* <summary> */
-/* Get gain of 9-7 wavelet transform. */
-/* </summary> */
-int dwt_getgain_real(int orient) {
- (void)orient;
- return 0;
-}
-
-/* <summary> */
-/* Get norm of 9-7 wavelet. */
-/* </summary> */
-double dwt_getnorm_real(int level, int orient) {
- return dwt_norms_real[orient][level];
-}
-
-void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec) {
- int numbands, bandno;
- numbands = 3 * tccp->numresolutions - 2;
- for (bandno = 0; bandno < numbands; bandno++) {
- double stepsize;
- int resno, level, orient, gain;
-
- resno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1);
- orient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1);
- level = tccp->numresolutions - 1 - resno;
- gain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) || (orient == 2)) ? 1 : 2));
- if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
- stepsize = 1.0;
- } else {
- double norm = dwt_norms_real[orient][level];
- stepsize = (1 << (gain)) / norm;
- }
- dwt_encode_stepsize((int) floor(stepsize * 8192.0), prec + gain, &tccp->stepsizes[bandno]);
- }
-}
-
-
-/* <summary> */
-/* Determine maximum computed resolution level for inverse wavelet transform */
-/* </summary> */
-static int dwt_decode_max_resolution(opj_tcd_resolution_t* restrict r, int i) {
- int mr = 1;
- int w;
- while( --i ) {
- r++;
- if( mr < ( w = r->x1 - r->x0 ) )
- mr = w ;
- if( mr < ( w = r->y1 - r->y0 ) )
- mr = w ;
- }
- return mr ;
-}
-
-
-/* <summary> */
-/* Inverse wavelet transform in 2-D. */
-/* </summary> */
-static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int numres, DWT1DFN dwt_1D) {
- dwt_t h;
- dwt_t v;
-
- opj_tcd_resolution_t* tr = tilec->resolutions;
-
- int rw = tr->x1 - tr->x0; /* width of the resolution level computed */
- int rh = tr->y1 - tr->y0; /* height of the resolution level computed */
-
- int w = tilec->x1 - tilec->x0;
-
- h.mem = (int*)opj_aligned_malloc(dwt_decode_max_resolution(tr, numres) * sizeof(int));
- v.mem = h.mem;
-
- while( --numres) {
- int * restrict tiledp = tilec->data;
- int j;
-
- ++tr;
- h.sn = rw;
- v.sn = rh;
-
- rw = tr->x1 - tr->x0;
- rh = tr->y1 - tr->y0;
-
- h.dn = rw - h.sn;
- h.cas = tr->x0 % 2;
-
- for(j = 0; j < rh; ++j) {
- dwt_interleave_h(&h, &tiledp[j*w]);
- (dwt_1D)(&h);
- memcpy(&tiledp[j*w], h.mem, rw * sizeof(int));
- }
-
- v.dn = rh - v.sn;
- v.cas = tr->y0 % 2;
-
- for(j = 0; j < rw; ++j){
- int k;
- dwt_interleave_v(&v, &tiledp[j], w);
- (dwt_1D)(&v);
- for(k = 0; k < rh; ++k) {
- tiledp[k * w + j] = v.mem[k];
- }
- }
- }
- opj_aligned_free(h.mem);
-}
-
-static void v4dwt_interleave_h(v4dwt_t* restrict w, float* restrict a, int x, int size){
- float* restrict bi = (float*) (w->wavelet + w->cas);
- int count = w->sn;
- int i, k;
- for(k = 0; k < 2; ++k){
- if (count + 3 * x < size && ((size_t) a & 0x0f) == 0 && ((size_t) bi & 0x0f) == 0 && (x & 0x0f) == 0) {
- /* Fast code path */
- for(i = 0; i < count; ++i){
- int j = i;
- bi[i*8 ] = a[j];
- j += x;
- bi[i*8 + 1] = a[j];
- j += x;
- bi[i*8 + 2] = a[j];
- j += x;
- bi[i*8 + 3] = a[j];
- }
- } else {
- /* Slow code path */
- for(i = 0; i < count; ++i){
- int j = i;
- bi[i*8 ] = a[j];
- j += x;
- if(j > size) continue;
- bi[i*8 + 1] = a[j];
- j += x;
- if(j > size) continue;
- bi[i*8 + 2] = a[j];
- j += x;
- if(j > size) continue;
- bi[i*8 + 3] = a[j];
- }
- }
- bi = (float*) (w->wavelet + 1 - w->cas);
- a += w->sn;
- size -= w->sn;
- count = w->dn;
- }
-}
-
-static void v4dwt_interleave_v(v4dwt_t* restrict v , float* restrict a , int x){
- v4* restrict bi = v->wavelet + v->cas;
- int i;
- for(i = 0; i < v->sn; ++i){
- memcpy(&bi[i*2], &a[i*x], 4 * sizeof(float));
- }
- a += v->sn * x;
- bi = v->wavelet + 1 - v->cas;
- for(i = 0; i < v->dn; ++i){
- memcpy(&bi[i*2], &a[i*x], 4 * sizeof(float));
- }
-}
-
-#ifdef __SSE__
-
-static void v4dwt_decode_step1_sse(v4* w, int count, const __m128 c){
- __m128* restrict vw = (__m128*) w;
- int i;
- /* 4x unrolled loop */
- for(i = 0; i < count >> 2; ++i){
- *vw = _mm_mul_ps(*vw, c);
- vw += 2;
- *vw = _mm_mul_ps(*vw, c);
- vw += 2;
- *vw = _mm_mul_ps(*vw, c);
- vw += 2;
- *vw = _mm_mul_ps(*vw, c);
- vw += 2;
- }
- count &= 3;
- for(i = 0; i < count; ++i){
- *vw = _mm_mul_ps(*vw, c);
- vw += 2;
- }
-}
-
-static void v4dwt_decode_step2_sse(v4* l, v4* w, int k, int m, __m128 c){
- __m128* restrict vl = (__m128*) l;
- __m128* restrict vw = (__m128*) w;
- int i;
- __m128 tmp1, tmp2, tmp3;
- tmp1 = vl[0];
- for(i = 0; i < m; ++i){
- tmp2 = vw[-1];
- tmp3 = vw[ 0];
- vw[-1] = _mm_add_ps(tmp2, _mm_mul_ps(_mm_add_ps(tmp1, tmp3), c));
- tmp1 = tmp3;
- vw += 2;
- }
- vl = vw - 2;
- if(m >= k){
- return;
- }
- c = _mm_add_ps(c, c);
- c = _mm_mul_ps(c, vl[0]);
- for(; m < k; ++m){
- __m128 tmp = vw[-1];
- vw[-1] = _mm_add_ps(tmp, c);
- vw += 2;
- }
-}
-
-#else
-
-static void v4dwt_decode_step1(v4* w, int count, const float c){
- float* restrict fw = (float*) w;
- int i;
- for(i = 0; i < count; ++i){
- float tmp1 = fw[i*8 ];
- float tmp2 = fw[i*8 + 1];
- float tmp3 = fw[i*8 + 2];
- float tmp4 = fw[i*8 + 3];
- fw[i*8 ] = tmp1 * c;
- fw[i*8 + 1] = tmp2 * c;
- fw[i*8 + 2] = tmp3 * c;
- fw[i*8 + 3] = tmp4 * c;
- }
-}
-
-static void v4dwt_decode_step2(v4* l, v4* w, int k, int m, float c){
- float* restrict fl = (float*) l;
- float* restrict fw = (float*) w;
- int i;
- for(i = 0; i < m; ++i){
- float tmp1_1 = fl[0];
- float tmp1_2 = fl[1];
- float tmp1_3 = fl[2];
- float tmp1_4 = fl[3];
- float tmp2_1 = fw[-4];
- float tmp2_2 = fw[-3];
- float tmp2_3 = fw[-2];
- float tmp2_4 = fw[-1];
- float tmp3_1 = fw[0];
- float tmp3_2 = fw[1];
- float tmp3_3 = fw[2];
- float tmp3_4 = fw[3];
- fw[-4] = tmp2_1 + ((tmp1_1 + tmp3_1) * c);
- fw[-3] = tmp2_2 + ((tmp1_2 + tmp3_2) * c);
- fw[-2] = tmp2_3 + ((tmp1_3 + tmp3_3) * c);
- fw[-1] = tmp2_4 + ((tmp1_4 + tmp3_4) * c);
- fl = fw;
- fw += 8;
- }
- if(m < k){
- float c1;
- float c2;
- float c3;
- float c4;
- c += c;
- c1 = fl[0] * c;
- c2 = fl[1] * c;
- c3 = fl[2] * c;
- c4 = fl[3] * c;
- for(; m < k; ++m){
- float tmp1 = fw[-4];
- float tmp2 = fw[-3];
- float tmp3 = fw[-2];
- float tmp4 = fw[-1];
- fw[-4] = tmp1 + c1;
- fw[-3] = tmp2 + c2;
- fw[-2] = tmp3 + c3;
- fw[-1] = tmp4 + c4;
- fw += 8;
- }
- }
-}
-
-#endif
-
-/* <summary> */
-/* Inverse 9-7 wavelet transform in 1-D. */
-/* </summary> */
-static void v4dwt_decode(v4dwt_t* restrict dwt){
- int a, b;
- if(dwt->cas == 0) {
- if(!((dwt->dn > 0) || (dwt->sn > 1))){
- return;
- }
- a = 0;
- b = 1;
- }else{
- if(!((dwt->sn > 0) || (dwt->dn > 1))) {
- return;
- }
- a = 1;
- b = 0;
- }
-#ifdef __SSE__
- v4dwt_decode_step1_sse(dwt->wavelet+a, dwt->sn, _mm_set1_ps(K));
- v4dwt_decode_step1_sse(dwt->wavelet+b, dwt->dn, _mm_set1_ps(c13318));
- v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(dwt_delta));
- v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(dwt_gamma));
- v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(dwt_beta));
- v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(dwt_alpha));
-#else
- v4dwt_decode_step1(dwt->wavelet+a, dwt->sn, K);
- v4dwt_decode_step1(dwt->wavelet+b, dwt->dn, c13318);
- v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), dwt_delta);
- v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), dwt_gamma);
- v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), dwt_beta);
- v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), dwt_alpha);
-#endif
-}
-
-/* <summary> */
-/* Inverse 9-7 wavelet transform in 2-D. */
-/* </summary> */
-void dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, int numres){
- v4dwt_t h;
- v4dwt_t v;
-
- opj_tcd_resolution_t* res = tilec->resolutions;
-
- int rw = res->x1 - res->x0; /* width of the resolution level computed */
- int rh = res->y1 - res->y0; /* height of the resolution level computed */
-
- int w = tilec->x1 - tilec->x0;
-
- h.wavelet = (v4*) opj_aligned_malloc((dwt_decode_max_resolution(res, numres)+5) * sizeof(v4));
- v.wavelet = h.wavelet;
-
- while( --numres) {
- float * restrict aj = (float*) tilec->data;
- int bufsize = (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0);
- int j;
-
- h.sn = rw;
- v.sn = rh;
-
- ++res;
-
- rw = res->x1 - res->x0; /* width of the resolution level computed */
- rh = res->y1 - res->y0; /* height of the resolution level computed */
-
- h.dn = rw - h.sn;
- h.cas = res->x0 % 2;
-
- for(j = rh; j > 3; j -= 4){
- int k;
- v4dwt_interleave_h(&h, aj, w, bufsize);
- v4dwt_decode(&h);
- for(k = rw; --k >= 0;){
- aj[k ] = h.wavelet[k].f[0];
- aj[k+w ] = h.wavelet[k].f[1];
- aj[k+w*2] = h.wavelet[k].f[2];
- aj[k+w*3] = h.wavelet[k].f[3];
- }
- aj += w*4;
- bufsize -= w*4;
- }
- if (rh & 0x03) {
- int k;
- j = rh & 0x03;
- v4dwt_interleave_h(&h, aj, w, bufsize);
- v4dwt_decode(&h);
- for(k = rw; --k >= 0;){
- switch(j) {
- case 3: aj[k+w*2] = h.wavelet[k].f[2];
- case 2: aj[k+w ] = h.wavelet[k].f[1];
- case 1: aj[k ] = h.wavelet[k].f[0];
- }
- }
- }
-
- v.dn = rh - v.sn;
- v.cas = res->y0 % 2;
-
- aj = (float*) tilec->data;
- for(j = rw; j > 3; j -= 4){
- int k;
- v4dwt_interleave_v(&v, aj, w);
- v4dwt_decode(&v);
- for(k = 0; k < rh; ++k){
- memcpy(&aj[k*w], &v.wavelet[k], 4 * sizeof(float));
- }
- aj += 4;
- }
- if (rw & 0x03){
- int k;
- j = rw & 0x03;
- v4dwt_interleave_v(&v, aj, w);
- v4dwt_decode(&v);
- for(k = 0; k < rh; ++k){
- memcpy(&aj[k*w], &v.wavelet[k], j * sizeof(float));
- }
- }
- }
-
- opj_aligned_free(h.wavelet);
-}
-
diff --git a/extern/libopenjpeg/dwt.h b/extern/libopenjpeg/dwt.h
deleted file mode 100644
index adf73e54400..00000000000
--- a/extern/libopenjpeg/dwt.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __DWT_H
-#define __DWT_H
-/**
-@file dwt.h
-@brief Implementation of a discrete wavelet transform (DWT)
-
-The functions in DWT.C have for goal to realize forward and inverse discret wavelet
-transform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in
-DWT.C are used by some function in TCD.C.
-*/
-
-/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
-/*@{*/
-
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Forward 5-3 wavelet tranform in 2-D.
-Apply a reversible DWT transform to a component of an image.
-@param tilec Tile component information (current tile)
-*/
-void dwt_encode(opj_tcd_tilecomp_t * tilec);
-/**
-Inverse 5-3 wavelet tranform in 2-D.
-Apply a reversible inverse DWT transform to a component of an image.
-@param tilec Tile component information (current tile)
-@param numres Number of resolution levels to decode
-*/
-void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres);
-/**
-Get the gain of a subband for the reversible 5-3 DWT.
-@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
-@return Returns 0 if orient = 0, returns 1 if orient = 1 or 2, returns 2 otherwise
-*/
-int dwt_getgain(int orient);
-/**
-Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT.
-@param level Level of the wavelet function
-@param orient Band of the wavelet function
-@return Returns the norm of the wavelet function
-*/
-double dwt_getnorm(int level, int orient);
-/**
-Forward 9-7 wavelet transform in 2-D.
-Apply an irreversible DWT transform to a component of an image.
-@param tilec Tile component information (current tile)
-*/
-void dwt_encode_real(opj_tcd_tilecomp_t * tilec);
-/**
-Inverse 9-7 wavelet transform in 2-D.
-Apply an irreversible inverse DWT transform to a component of an image.
-@param tilec Tile component information (current tile)
-@param numres Number of resolution levels to decode
-*/
-void dwt_decode_real(opj_tcd_tilecomp_t* tilec, int numres);
-/**
-Get the gain of a subband for the irreversible 9-7 DWT.
-@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
-@return Returns the gain of the 9-7 wavelet transform
-*/
-int dwt_getgain_real(int orient);
-/**
-Get the norm of a wavelet function of a subband at a specified level for the irreversible 9-7 DWT
-@param level Level of the wavelet function
-@param orient Band of the wavelet function
-@return Returns the norm of the 9-7 wavelet
-*/
-double dwt_getnorm_real(int level, int orient);
-/**
-Explicit calculation of the Quantization Stepsizes
-@param tccp Tile-component coding parameters
-@param prec Precint analyzed
-*/
-void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __DWT_H */
diff --git a/extern/libopenjpeg/event.c b/extern/libopenjpeg/event.c
deleted file mode 100644
index 38db33a9432..00000000000
--- a/extern/libopenjpeg/event.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "opj_includes.h"
-
-/* ==========================================================
- Utility functions
- ==========================================================*/
-
-#ifdef OPJ_CODE_NOT_USED
-#ifndef _WIN32
-static char*
-i2a(unsigned i, char *a, unsigned r) {
- if (i/r > 0) a = i2a(i/r,a,r);
- *a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i%r];
- return a+1;
-}
-
-/**
- Transforms integer i into an ascii string and stores the result in a;
- string is encoded in the base indicated by r.
- @param i Number to be converted
- @param a String result
- @param r Base of value; must be in the range 2 - 36
- @return Returns a
-*/
-static char *
-_itoa(int i, char *a, int r) {
- r = ((r < 2) || (r > 36)) ? 10 : r;
- if(i < 0) {
- *a = '-';
- *i2a(-i, a+1, r) = 0;
- }
- else *i2a(i, a, r) = 0;
- return a;
-}
-
-#endif /* !_WIN32 */
-#endif
-/* ----------------------------------------------------------------------- */
-
-opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context) {
- if(cinfo) {
- opj_event_mgr_t *previous = cinfo->event_mgr;
- cinfo->event_mgr = event_mgr;
- cinfo->client_data = context;
- return previous;
- }
-
- return NULL;
-}
-
-opj_bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) {
-#define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */
- opj_msg_callback msg_handler = NULL;
-
- opj_event_mgr_t *event_mgr = cinfo->event_mgr;
- if(event_mgr != NULL) {
- switch(event_type) {
- case EVT_ERROR:
- msg_handler = event_mgr->error_handler;
- break;
- case EVT_WARNING:
- msg_handler = event_mgr->warning_handler;
- break;
- case EVT_INFO:
- msg_handler = event_mgr->info_handler;
- break;
- default:
- break;
- }
- if(msg_handler == NULL) {
- return OPJ_FALSE;
- }
- } else {
- return OPJ_FALSE;
- }
-
- if ((fmt != NULL) && (event_mgr != NULL)) {
- va_list arg;
- int str_length/*, i, j*/; /* UniPG */
- char message[MSG_SIZE];
- /* initialize the optional parameter list */
- va_start(arg, fmt);
- /* parse the format string and put the result in 'message' */
- str_length = vsnprintf(message, MSG_SIZE, fmt, arg); /* UniPG */
- /* deinitialize the optional parameter list */
- va_end(arg);
-
- /* output the message to the user program */
- if( str_length > -1 && str_length < MSG_SIZE )
- msg_handler(message, cinfo->client_data);
- else return OPJ_FALSE;
- }
-
- return OPJ_TRUE;
-}
-
diff --git a/extern/libopenjpeg/event.h b/extern/libopenjpeg/event.h
deleted file mode 100644
index 9c59787caf3..00000000000
--- a/extern/libopenjpeg/event.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __EVENT_H
-#define __EVENT_H
-/**
-@file event.h
-@brief Implementation of a event callback system
-
-The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user.
-*/
-
-#define EVT_ERROR 1 /**< Error event type */
-#define EVT_WARNING 2 /**< Warning event type */
-#define EVT_INFO 4 /**< Debug event type */
-
-/** @defgroup EVENT EVENT - Implementation of a event callback system */
-/*@{*/
-
-/** @name Exported functions (see also openjpeg.h) */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Write formatted data to a string and send the string to a user callback.
-@param cinfo Codec context info
-@param event_type Event type or callback to use to send the message
-@param fmt Format-control string (plus optionnal arguments)
-@return Returns true if successful, returns false otherwise
-*/
-opj_bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __EVENT_H */
diff --git a/extern/libopenjpeg/fix.h b/extern/libopenjpeg/fix.h
deleted file mode 100644
index bcb2acb54c8..00000000000
--- a/extern/libopenjpeg/fix.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __FIX_H
-#define __FIX_H
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-#define int64 __int64
-#else
-#define int64 long long
-#endif
-
-/**
-@file fix.h
-@brief Implementation of operations of specific multiplication (FIX)
-
-The functions in FIX.H have for goal to realize specific multiplication.
-*/
-
-/** @defgroup FIX FIX - Implementation of operations of specific multiplication */
-/*@{*/
-
-/**
-Multiply two fixed-precision rational numbers.
-@param a
-@param b
-@return Returns a * b
-*/
-static INLINE int fix_mul(int a, int b) {
- int64 temp = (int64) a * (int64) b ;
- temp += temp & 4096;
- return (int) (temp >> 13) ;
-}
-
-/*@}*/
-
-#endif /* __FIX_H */
diff --git a/extern/libopenjpeg/image.c b/extern/libopenjpeg/image.c
deleted file mode 100644
index 579fd73d718..00000000000
--- a/extern/libopenjpeg/image.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "opj_includes.h"
-
-opj_image_t* opj_image_create0(void) {
- opj_image_t *image = (opj_image_t*)opj_calloc(1, sizeof(opj_image_t));
- return image;
-}
-
-opj_image_t* OPJ_CALLCONV opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {
- int compno;
- opj_image_t *image = NULL;
-
- image = (opj_image_t*) opj_calloc(1, sizeof(opj_image_t));
- if(image) {
- image->color_space = clrspc;
- image->numcomps = numcmpts;
- /* allocate memory for the per-component information */
- image->comps = (opj_image_comp_t*)opj_calloc(1,image->numcomps * sizeof(opj_image_comp_t));
- if(!image->comps) {
- fprintf(stderr,"Unable to allocate memory for image.\n");
- opj_image_destroy(image);
- return NULL;
- }
- /* create the individual image components */
- for(compno = 0; compno < numcmpts; compno++) {
- opj_image_comp_t *comp = &image->comps[compno];
- comp->dx = cmptparms[compno].dx;
- comp->dy = cmptparms[compno].dy;
- comp->w = cmptparms[compno].w;
- comp->h = cmptparms[compno].h;
- comp->x0 = cmptparms[compno].x0;
- comp->y0 = cmptparms[compno].y0;
- comp->prec = cmptparms[compno].prec;
- comp->bpp = cmptparms[compno].bpp;
- comp->sgnd = cmptparms[compno].sgnd;
- comp->data = (int*) opj_calloc(comp->w * comp->h, sizeof(int));
- if(!comp->data) {
- fprintf(stderr,"Unable to allocate memory for image.\n");
- opj_image_destroy(image);
- return NULL;
- }
- }
- }
-
- return image;
-}
-
-void OPJ_CALLCONV opj_image_destroy(opj_image_t *image) {
- int i;
- if(image) {
- if(image->comps) {
- /* image components */
- for(i = 0; i < image->numcomps; i++) {
- opj_image_comp_t *image_comp = &image->comps[i];
- if(image_comp->data) {
- opj_free(image_comp->data);
- }
- }
- opj_free(image->comps);
- }
- opj_free(image);
- }
-}
-
diff --git a/extern/libopenjpeg/image.h b/extern/libopenjpeg/image.h
deleted file mode 100644
index f828b5b77c8..00000000000
--- a/extern/libopenjpeg/image.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __IMAGE_H
-#define __IMAGE_H
-/**
-@file image.h
-@brief Implementation of operations on images (IMAGE)
-
-The functions in IMAGE.C have for goal to realize operations on images.
-*/
-
-/** @defgroup IMAGE IMAGE - Implementation of operations on images */
-/*@{*/
-
-/**
-Create an empty image
-@todo this function should be removed
-@return returns an empty image if successful, returns NULL otherwise
-*/
-opj_image_t* opj_image_create0(void);
-
-/*@}*/
-
-#endif /* __IMAGE_H */
-
diff --git a/extern/libopenjpeg/indexbox_manager.h b/extern/libopenjpeg/indexbox_manager.h
deleted file mode 100644
index 7364df62c22..00000000000
--- a/extern/libopenjpeg/indexbox_manager.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * $Id: indexbox_manager.h 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
- *
- * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2011, Professor Benoit Macq
- * Copyright (c) 2003-2004, Yannick Verschueren
- * Copyright (c) 2010-2011, Kaori Hagihara
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*! \file
- * \brief Modification of jpip.c from 2KAN indexer
- */
-
-#ifndef INDEXBOX_MANAGER_H_
-# define INDEXBOX_MANAGER_H_
-
-#include "openjpeg.h"
-#include "j2k.h" /* needed to use jp2.h */
-#include "jp2.h"
-
-#define JPIP_CIDX 0x63696478 /* Codestream index */
-#define JPIP_CPTR 0x63707472 /* Codestream Finder Box */
-#define JPIP_MANF 0x6d616e66 /* Manifest Box */
-#define JPIP_FAIX 0x66616978 /* Fragment array Index box */
-#define JPIP_MHIX 0x6d686978 /* Main Header Index Table */
-#define JPIP_TPIX 0x74706978 /* Tile-part Index Table box */
-#define JPIP_THIX 0x74686978 /* Tile header Index Table box */
-#define JPIP_PPIX 0x70706978 /* Precinct Packet Index Table box */
-#define JPIP_PHIX 0x70686978 /* Packet Header index Table */
-#define JPIP_FIDX 0x66696478 /* File Index */
-#define JPIP_FPTR 0x66707472 /* File Finder */
-#define JPIP_PRXY 0x70727879 /* Proxy boxes */
-#define JPIP_IPTR 0x69707472 /* Index finder box */
-#define JPIP_PHLD 0x70686c64 /* Place holder */
-
-
-/*
- * Write tile-part Index table box (superbox)
- *
- * @param[in] coff offset of j2k codestream
- * @param[in] cstr_info codestream information
- * @param[in] j2klen length of j2k codestream
- * @param[in] cio file output handle
- * @return length of tpix box
- */
-int write_tpix( int coff, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio);
-
-
-/*
- * Write tile header index table box (superbox)
- *
- * @param[in] coff offset of j2k codestream
- * @param[in] cstr_info codestream information pointer
- * @param[in] cio file output handle
- * @return length of thix box
- */
-int write_thix( int coff, opj_codestream_info_t cstr_info, opj_cio_t *cio);
-
-
-/*
- * Write precinct packet index table box (superbox)
- *
- * @param[in] coff offset of j2k codestream
- * @param[in] cstr_info codestream information
- * @param[in] EPHused true if EPH option used
- * @param[in] j2klen length of j2k codestream
- * @param[in] cio file output handle
- * @return length of ppix box
- */
-int write_ppix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio);
-
-
-/*
- * Write packet header index table box (superbox)
- *
- * @param[in] coff offset of j2k codestream
- * @param[in] cstr_info codestream information
- * @param[in] EPHused true if EPH option used
- * @param[in] j2klen length of j2k codestream
- * @param[in] cio file output handle
- * @return length of ppix box
- */
-int write_phix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio);
-
-/*
- * Wriet manifest box (box)
- *
- * @param[in] second number to be visited
- * @param[in] v number of boxes
- * @param[in] box box to be manifested
- * @param[in] cio file output handle
- */
-void write_manf(int second, int v, opj_jp2_box_t *box, opj_cio_t *cio);
-
-
-#endif /* !INDEXBOX_MANAGER_H_ */
diff --git a/extern/libopenjpeg/int.h b/extern/libopenjpeg/int.h
deleted file mode 100644
index 4e5fe08eb76..00000000000
--- a/extern/libopenjpeg/int.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __INT_H
-#define __INT_H
-/**
-@file int.h
-@brief Implementation of operations on integers (INT)
-
-The functions in INT.H have for goal to realize operations on integers.
-*/
-
-/** @defgroup INT INT - Implementation of operations on integers */
-/*@{*/
-
-/** @name Exported functions (see also openjpeg.h) */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Get the minimum of two integers
-@return Returns a if a < b else b
-*/
-static INLINE int int_min(int a, int b) {
- return a < b ? a : b;
-}
-/**
-Get the maximum of two integers
-@return Returns a if a > b else b
-*/
-static INLINE int int_max(int a, int b) {
- return (a > b) ? a : b;
-}
-/**
-Clamp an integer inside an interval
-@return
-<ul>
-<li>Returns a if (min < a < max)
-<li>Returns max if (a > max)
-<li>Returns min if (a < min)
-</ul>
-*/
-static INLINE int int_clamp(int a, int min, int max) {
- if (a < min)
- return min;
- if (a > max)
- return max;
- return a;
-}
-/**
-@return Get absolute value of integer
-*/
-static INLINE int int_abs(int a) {
- return a < 0 ? -a : a;
-}
-/**
-Divide an integer and round upwards
-@return Returns a divided by b
-*/
-static INLINE int int_ceildiv(int a, int b) {
- return (a + b - 1) / b;
-}
-/**
-Divide an integer by a power of 2 and round upwards
-@return Returns a divided by 2^b
-*/
-static INLINE int int_ceildivpow2(int a, int b) {
- return (a + (1 << b) - 1) >> b;
-}
-/**
-Divide an integer by a power of 2 and round downwards
-@return Returns a divided by 2^b
-*/
-static INLINE int int_floordivpow2(int a, int b) {
- return a >> b;
-}
-/**
-Get logarithm of an integer and round downwards
-@return Returns log2(a)
-*/
-static INLINE int int_floorlog2(int a) {
- int l;
- for (l = 0; a > 1; l++) {
- a >>= 1;
- }
- return l;
-}
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif
diff --git a/extern/libopenjpeg/j2k.c b/extern/libopenjpeg/j2k.c
deleted file mode 100644
index 93e5c9eb80a..00000000000
--- a/extern/libopenjpeg/j2k.c
+++ /dev/null
@@ -1,2699 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2006-2007, Parvatha Elangovan
- * Copyright (c) 2010-2011, Kaori Hagihara
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "opj_includes.h"
-#include <assert.h>
-
-/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-/**
-Write the SOC marker (Start Of Codestream)
-@param j2k J2K handle
-*/
-static void j2k_write_soc(opj_j2k_t *j2k);
-/**
-Read the SOC marker (Start of Codestream)
-@param j2k J2K handle
-*/
-static void j2k_read_soc(opj_j2k_t *j2k);
-/**
-Write the SIZ marker (image and tile size)
-@param j2k J2K handle
-*/
-static void j2k_write_siz(opj_j2k_t *j2k);
-/**
-Read the SIZ marker (image and tile size)
-@param j2k J2K handle
-*/
-static void j2k_read_siz(opj_j2k_t *j2k);
-/**
-Write the COM marker (comment)
-@param j2k J2K handle
-*/
-static void j2k_write_com(opj_j2k_t *j2k);
-/**
-Read the COM marker (comment)
-@param j2k J2K handle
-*/
-static void j2k_read_com(opj_j2k_t *j2k);
-/**
-Write the value concerning the specified component in the marker COD and COC
-@param j2k J2K handle
-@param compno Number of the component concerned by the information written
-*/
-static void j2k_write_cox(opj_j2k_t *j2k, int compno);
-/**
-Read the value concerning the specified component in the marker COD and COC
-@param j2k J2K handle
-@param compno Number of the component concerned by the information read
-*/
-static void j2k_read_cox(opj_j2k_t *j2k, int compno);
-/**
-Write the COD marker (coding style default)
-@param j2k J2K handle
-*/
-static void j2k_write_cod(opj_j2k_t *j2k);
-/**
-Read the COD marker (coding style default)
-@param j2k J2K handle
-*/
-static void j2k_read_cod(opj_j2k_t *j2k);
-/**
-Write the COC marker (coding style component)
-@param j2k J2K handle
-@param compno Number of the component concerned by the information written
-*/
-static void j2k_write_coc(opj_j2k_t *j2k, int compno);
-/**
-Read the COC marker (coding style component)
-@param j2k J2K handle
-*/
-static void j2k_read_coc(opj_j2k_t *j2k);
-/**
-Write the value concerning the specified component in the marker QCD and QCC
-@param j2k J2K handle
-@param compno Number of the component concerned by the information written
-*/
-static void j2k_write_qcx(opj_j2k_t *j2k, int compno);
-/**
-Read the value concerning the specified component in the marker QCD and QCC
-@param j2k J2K handle
-@param compno Number of the component concern by the information read
-@param len Length of the information in the QCX part of the marker QCD/QCC
-*/
-static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len);
-/**
-Write the QCD marker (quantization default)
-@param j2k J2K handle
-*/
-static void j2k_write_qcd(opj_j2k_t *j2k);
-/**
-Read the QCD marker (quantization default)
-@param j2k J2K handle
-*/
-static void j2k_read_qcd(opj_j2k_t *j2k);
-/**
-Write the QCC marker (quantization component)
-@param j2k J2K handle
-@param compno Number of the component concerned by the information written
-*/
-static void j2k_write_qcc(opj_j2k_t *j2k, int compno);
-/**
-Read the QCC marker (quantization component)
-@param j2k J2K handle
-*/
-static void j2k_read_qcc(opj_j2k_t *j2k);
-/**
-Write the POC marker (progression order change)
-@param j2k J2K handle
-*/
-static void j2k_write_poc(opj_j2k_t *j2k);
-/**
-Read the POC marker (progression order change)
-@param j2k J2K handle
-*/
-static void j2k_read_poc(opj_j2k_t *j2k);
-/**
-Read the CRG marker (component registration)
-@param j2k J2K handle
-*/
-static void j2k_read_crg(opj_j2k_t *j2k);
-/**
-Read the TLM marker (tile-part lengths)
-@param j2k J2K handle
-*/
-static void j2k_read_tlm(opj_j2k_t *j2k);
-/**
-Read the PLM marker (packet length, main header)
-@param j2k J2K handle
-*/
-static void j2k_read_plm(opj_j2k_t *j2k);
-/**
-Read the PLT marker (packet length, tile-part header)
-@param j2k J2K handle
-*/
-static void j2k_read_plt(opj_j2k_t *j2k);
-/**
-Read the PPM marker (packet packet headers, main header)
-@param j2k J2K handle
-*/
-static void j2k_read_ppm(opj_j2k_t *j2k);
-/**
-Read the PPT marker (packet packet headers, tile-part header)
-@param j2k J2K handle
-*/
-static void j2k_read_ppt(opj_j2k_t *j2k);
-/**
-Write the TLM marker (Mainheader)
-@param j2k J2K handle
-*/
-static void j2k_write_tlm(opj_j2k_t *j2k);
-/**
-Write the SOT marker (start of tile-part)
-@param j2k J2K handle
-*/
-static void j2k_write_sot(opj_j2k_t *j2k);
-/**
-Read the SOT marker (start of tile-part)
-@param j2k J2K handle
-*/
-static void j2k_read_sot(opj_j2k_t *j2k);
-/**
-Write the SOD marker (start of data)
-@param j2k J2K handle
-@param tile_coder Pointer to a TCD handle
-*/
-static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder);
-/**
-Read the SOD marker (start of data)
-@param j2k J2K handle
-*/
-static void j2k_read_sod(opj_j2k_t *j2k);
-/**
-Write the RGN marker (region-of-interest)
-@param j2k J2K handle
-@param compno Number of the component concerned by the information written
-@param tileno Number of the tile concerned by the information written
-*/
-static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno);
-/**
-Read the RGN marker (region-of-interest)
-@param j2k J2K handle
-*/
-static void j2k_read_rgn(opj_j2k_t *j2k);
-/**
-Write the EOC marker (end of codestream)
-@param j2k J2K handle
-*/
-static void j2k_write_eoc(opj_j2k_t *j2k);
-/**
-Read the EOC marker (end of codestream)
-@param j2k J2K handle
-*/
-static void j2k_read_eoc(opj_j2k_t *j2k);
-/**
-Read an unknown marker
-@param j2k J2K handle
-*/
-static void j2k_read_unk(opj_j2k_t *j2k);
-/**
-Add main header marker information
-@param cstr_info Codestream information structure
-@param type marker type
-@param pos byte offset of marker segment
-@param len length of marker segment
- */
-static void j2k_add_mhmarker(opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len);
-/**
-Add tile header marker information
-@param tileno tile index number
-@param cstr_info Codestream information structure
-@param type marker type
-@param pos byte offset of marker segment
-@param len length of marker segment
- */
-static void j2k_add_tlmarker( int tileno, opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len);
-
-/*@}*/
-
-/*@}*/
-
-/* ----------------------------------------------------------------------- */
-typedef struct j2k_prog_order{
- OPJ_PROG_ORDER enum_prog;
- char str_prog[5];
-}j2k_prog_order_t;
-
-j2k_prog_order_t j2k_prog_order_list[] = {
- {CPRL, "CPRL"},
- {LRCP, "LRCP"},
- {PCRL, "PCRL"},
- {RLCP, "RLCP"},
- {RPCL, "RPCL"},
- {(OPJ_PROG_ORDER)-1, ""}
-};
-
-char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order){
- j2k_prog_order_t *po;
- for(po = j2k_prog_order_list; po->enum_prog != -1; po++ ){
- if(po->enum_prog == prg_order){
- break;
- }
- }
- return po->str_prog;
-}
-
-/* ----------------------------------------------------------------------- */
-static int j2k_get_num_tp(opj_cp_t *cp,int pino,int tileno){
- char *prog;
- int i;
- int tpnum=1,tpend=0;
- opj_tcp_t *tcp = &cp->tcps[tileno];
- prog = j2k_convert_progression_order(tcp->prg);
-
- if(cp->tp_on == 1){
- for(i=0;i<4;i++){
- if(tpend!=1){
- if( cp->tp_flag == prog[i] ){
- tpend=1;cp->tp_pos=i;
- }
- switch(prog[i]){
- case 'C':
- tpnum= tpnum * tcp->pocs[pino].compE;
- break;
- case 'R':
- tpnum= tpnum * tcp->pocs[pino].resE;
- break;
- case 'P':
- tpnum= tpnum * tcp->pocs[pino].prcE;
- break;
- case 'L':
- tpnum= tpnum * tcp->pocs[pino].layE;
- break;
- }
- }
- }
- }else{
- tpnum=1;
- }
- return tpnum;
-}
-
-/** mem allocation for TLM marker*/
-int j2k_calculate_tp(opj_cp_t *cp,int img_numcomp,opj_image_t *image,opj_j2k_t *j2k ){
- int pino,tileno,totnum_tp=0;
-
- OPJ_ARG_NOT_USED(img_numcomp);
-
- j2k->cur_totnum_tp = (int *) opj_malloc(cp->tw * cp->th * sizeof(int));
- for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
- int cur_totnum_tp = 0;
- opj_tcp_t *tcp = &cp->tcps[tileno];
- for(pino = 0; pino <= tcp->numpocs; pino++) {
- int tp_num=0;
- opj_pi_iterator_t *pi = pi_initialise_encode(image, cp, tileno,FINAL_PASS);
- if(!pi) { return -1;}
- tp_num = j2k_get_num_tp(cp,pino,tileno);
- totnum_tp = totnum_tp + tp_num;
- cur_totnum_tp = cur_totnum_tp + tp_num;
- pi_destroy(pi, cp, tileno);
- }
- j2k->cur_totnum_tp[tileno] = cur_totnum_tp;
- /* INDEX >> */
- if (j2k->cstr_info) {
- j2k->cstr_info->tile[tileno].num_tps = cur_totnum_tp;
- j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t));
- }
- /* << INDEX */
- }
- return totnum_tp;
-}
-
-static void j2k_write_soc(opj_j2k_t *j2k) {
- opj_cio_t *cio = j2k->cio;
- cio_write(cio, J2K_MS_SOC, 2);
-
- if(j2k->cstr_info)
- j2k_add_mhmarker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio), 0);
-
-/* UniPG>> */
-#ifdef USE_JPWL
-
- /* update markers struct */
- j2k_add_marker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio) - 2, 2);
-#endif /* USE_JPWL */
-/* <<UniPG */
-}
-
-static void j2k_read_soc(opj_j2k_t *j2k) {
- j2k->state = J2K_STATE_MHSIZ;
- /* Index */
- if (j2k->cstr_info) {
- j2k->cstr_info->main_head_start = cio_tell(j2k->cio) - 2;
- j2k->cstr_info->codestream_size = cio_numbytesleft(j2k->cio) + 2 - j2k->cstr_info->main_head_start;
- }
-}
-
-static void j2k_write_siz(opj_j2k_t *j2k) {
- int i;
- int lenp, len;
-
- opj_cio_t *cio = j2k->cio;
- opj_image_t *image = j2k->image;
- opj_cp_t *cp = j2k->cp;
-
- cio_write(cio, J2K_MS_SIZ, 2); /* SIZ */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- cio_write(cio, cp->rsiz, 2); /* Rsiz (capabilities) */
- cio_write(cio, image->x1, 4); /* Xsiz */
- cio_write(cio, image->y1, 4); /* Ysiz */
- cio_write(cio, image->x0, 4); /* X0siz */
- cio_write(cio, image->y0, 4); /* Y0siz */
- cio_write(cio, cp->tdx, 4); /* XTsiz */
- cio_write(cio, cp->tdy, 4); /* YTsiz */
- cio_write(cio, cp->tx0, 4); /* XT0siz */
- cio_write(cio, cp->ty0, 4); /* YT0siz */
- cio_write(cio, image->numcomps, 2); /* Csiz */
- for (i = 0; i < image->numcomps; i++) {
- cio_write(cio, image->comps[i].prec - 1 + (image->comps[i].sgnd << 7), 1); /* Ssiz_i */
- cio_write(cio, image->comps[i].dx, 1); /* XRsiz_i */
- cio_write(cio, image->comps[i].dy, 1); /* YRsiz_i */
- }
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lsiz */
- cio_seek(cio, lenp + len);
-
- if(j2k->cstr_info)
- j2k_add_mhmarker(j2k->cstr_info, J2K_MS_SIZ, lenp, len);
-}
-
-static void j2k_read_siz(opj_j2k_t *j2k) {
- int len, i;
- int n_comps;
-
- opj_cio_t *cio = j2k->cio;
- opj_image_t *image = j2k->image;
- opj_cp_t *cp = j2k->cp;
-
- len = cio_read(cio, 2); /* Lsiz */
- cio_read(cio, 2); /* Rsiz (capabilities) */
- image->x1 = cio_read(cio, 4); /* Xsiz */
- image->y1 = cio_read(cio, 4); /* Ysiz */
- image->x0 = cio_read(cio, 4); /* X0siz */
- image->y0 = cio_read(cio, 4); /* Y0siz */
- cp->tdx = cio_read(cio, 4); /* XTsiz */
- cp->tdy = cio_read(cio, 4); /* YTsiz */
- cp->tx0 = cio_read(cio, 4); /* XT0siz */
- cp->ty0 = cio_read(cio, 4); /* YT0siz */
-
- if ((image->x0<0)||(image->x1<0)||(image->y0<0)||(image->y1<0)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "invalid image size (x0:%d, x1:%d, y0:%d, y1:%d)\n",
- image->x0,image->x1,image->y0,image->y1);
- return;
- }
-
- n_comps = (len - 36 - 2 ) / 3;
- assert( (len - 36 - 2 ) % 3 == 0 );
- image->numcomps = cio_read(cio, 2); /* Csiz */
- assert( n_comps == image->numcomps );
- (void)n_comps;
-
- /* testcase 4035.pdf.SIGSEGV.d8b.3375 */
- if (image->x0 > image->x1 || image->y0 > image->y1) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Error with SIZ marker: negative image size (%d x %d)\n", image->x1 - image->x0, image->y1 - image->y0);
- return;
- }
- /* testcase 2539.pdf.SIGFPE.706.1712 (also 3622.pdf.SIGFPE.706.2916 and 4008.pdf.SIGFPE.706.3345 and maybe more) */
- if (!(cp->tdx * cp->tdy)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Error with SIZ marker: invalid tile size (tdx: %d, tdy: %d)\n", cp->tdx, cp->tdy);
- return;
- }
-
- /* testcase 1610.pdf.SIGSEGV.59c.681 */
- if (((int64)image->x1) * ((int64)image->y1) != (image->x1 * image->y1)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Prevent buffer overflow (x1: %d, y1: %d)\n", image->x1, image->y1);
- return;
- }
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
- /* if JPWL is on, we check whether TX errors have damaged
- too much the SIZ parameters */
- if (!(image->x1 * image->y1)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: bad image size (%d x %d)\n",
- image->x1, image->y1);
- if (!JPWL_ASSUME || JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- }
- if (image->numcomps != ((len - 38) / 3)) {
- opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
- "JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n",
- image->numcomps, ((len - 38) / 3));
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- /* we try to correct */
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n");
- if (image->numcomps < ((len - 38) / 3)) {
- len = 38 + 3 * image->numcomps;
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting Lsiz to %d => HYPOTHESIS!!!\n",
- len);
- } else {
- image->numcomps = ((len - 38) / 3);
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting Csiz to %d => HYPOTHESIS!!!\n",
- image->numcomps);
- }
- }
-
- /* update components number in the jpwl_exp_comps filed */
- cp->exp_comps = image->numcomps;
- }
-#else
- (void)len;
-#endif /* USE_JPWL */
-
- /* prevent division by zero */
- if (!(cp->tdx * cp->tdy)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "invalid tile size (tdx: %d, tdy: %d)\n", cp->tdx, cp->tdy);
- return;
- }
-
- image->comps = (opj_image_comp_t*) opj_calloc(image->numcomps, sizeof(opj_image_comp_t));
- for (i = 0; i < image->numcomps; i++) {
- int tmp;
- tmp = cio_read(cio, 1); /* Ssiz_i */
- image->comps[i].prec = (tmp & 0x7f) + 1;
- image->comps[i].sgnd = tmp >> 7;
- image->comps[i].dx = cio_read(cio, 1); /* XRsiz_i */
- image->comps[i].dy = cio_read(cio, 1); /* YRsiz_i */
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
- /* if JPWL is on, we check whether TX errors have damaged
- too much the SIZ parameters, again */
- if (!(image->comps[i].dx * image->comps[i].dy)) {
- opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
- "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n",
- i, i, image->comps[i].dx, image->comps[i].dy);
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- /* we try to correct */
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n");
- if (!image->comps[i].dx) {
- image->comps[i].dx = 1;
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n",
- i, image->comps[i].dx);
- }
- if (!image->comps[i].dy) {
- image->comps[i].dy = 1;
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n",
- i, image->comps[i].dy);
- }
- }
-
- }
-#endif /* USE_JPWL */
-
- /* prevent division by zero */
- if (!(image->comps[i].dx * image->comps[i].dy)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: invalid component size (dx: %d, dy: %d)\n", image->comps[i].dx, image->comps[i].dy);
- return;
- }
-
- image->comps[i].resno_decoded = 0; /* number of resolution decoded */
- image->comps[i].factor = cp->reduce; /* reducing factor per component */
- }
-
- cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx);
- cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy);
-
- /* gdal_fuzzer_check_number_of_tiles.jp2 */
- if (cp->tw == 0 || cp->th == 0 || cp->tw > 65535 / cp->th) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n",
- cp->tw, cp->th);
- return;
- }
-
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
- /* if JPWL is on, we check whether TX errors have damaged
- too much the SIZ parameters */
- if ((cp->tw < 1) || (cp->th < 1) || (cp->tw > cp->max_tiles) || (cp->th > cp->max_tiles)) {
- opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
- "JPWL: bad number of tiles (%d x %d)\n",
- cp->tw, cp->th);
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- /* we try to correct */
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n");
- if (cp->tw < 1) {
- cp->tw= 1;
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting %d tiles in x => HYPOTHESIS!!!\n",
- cp->tw);
- }
- if (cp->tw > cp->max_tiles) {
- cp->tw= 1;
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- too large x, increase expectance of %d\n"
- "- setting %d tiles in x => HYPOTHESIS!!!\n",
- cp->max_tiles, cp->tw);
- }
- if (cp->th < 1) {
- cp->th= 1;
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting %d tiles in y => HYPOTHESIS!!!\n",
- cp->th);
- }
- if (cp->th > cp->max_tiles) {
- cp->th= 1;
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- too large y, increase expectance of %d to continue\n",
- "- setting %d tiles in y => HYPOTHESIS!!!\n",
- cp->max_tiles, cp->th);
- }
- }
- }
-#endif /* USE_JPWL */
-
- cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
- if (cp->tcps == NULL)
- {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Out of memory\n");
- return;
- }
- cp->tileno = (int*) opj_malloc(cp->tw * cp->th * sizeof(int));
- if (cp->tileno == NULL)
- {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Out of memory\n");
- return;
- }
- cp->tileno_size = 0;
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
- if (!cp->tcps) {
- opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
- "JPWL: could not alloc tcps field of cp\n");
- if (!JPWL_ASSUME || JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- }
- }
-#endif /* USE_JPWL */
-
- for (i = 0; i < cp->tw * cp->th; i++) {
- cp->tcps[i].POC = 0;
- cp->tcps[i].numpocs = 0;
- cp->tcps[i].first = 1;
- }
-
- /* Initialization for PPM marker */
- cp->ppm = 0;
- cp->ppm_data = NULL;
- cp->ppm_data_first = NULL;
- cp->ppm_previous = 0;
- cp->ppm_store = 0;
-
- j2k->default_tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
- for (i = 0; i < cp->tw * cp->th; i++) {
- cp->tcps[i].tccps = (opj_tccp_t*) opj_malloc(image->numcomps * sizeof(opj_tccp_t));
- }
- j2k->tile_data = (unsigned char**) opj_calloc(cp->tw * cp->th, sizeof(unsigned char*));
- j2k->tile_len = (int*) opj_calloc(cp->tw * cp->th, sizeof(int));
- j2k->state = J2K_STATE_MH;
-
- /* Index */
- if (j2k->cstr_info) {
- opj_codestream_info_t *cstr_info = j2k->cstr_info;
- cstr_info->image_w = image->x1 - image->x0;
- cstr_info->image_h = image->y1 - image->y0;
- cstr_info->numcomps = image->numcomps;
- cstr_info->tw = cp->tw;
- cstr_info->th = cp->th;
- cstr_info->tile_x = cp->tdx;
- cstr_info->tile_y = cp->tdy;
- cstr_info->tile_Ox = cp->tx0;
- cstr_info->tile_Oy = cp->ty0;
- cstr_info->tile = (opj_tile_info_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tile_info_t));
- }
-}
-
-static void j2k_write_com(opj_j2k_t *j2k) {
- unsigned int i;
- int lenp, len;
-
- if(j2k->cp->comment) {
- opj_cio_t *cio = j2k->cio;
- char *comment = j2k->cp->comment;
-
- cio_write(cio, J2K_MS_COM, 2);
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- cio_write(cio, 1, 2); /* General use (IS 8859-15:1999 (Latin) values) */
- for (i = 0; i < strlen(comment); i++) {
- cio_write(cio, comment[i], 1);
- }
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2);
- cio_seek(cio, lenp + len);
-
-
- if(j2k->cstr_info)
- j2k_add_mhmarker(j2k->cstr_info, J2K_MS_COM, lenp, len);
-
- }
-}
-
-static void j2k_read_com(opj_j2k_t *j2k) {
- int len;
-
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2);
- cio_skip(cio, len - 2);
-}
-
-static void j2k_write_cox(opj_j2k_t *j2k, int compno) {
- int i;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_cio_t *cio = j2k->cio;
-
- cio_write(cio, tccp->numresolutions - 1, 1); /* SPcox (D) */
- cio_write(cio, tccp->cblkw - 2, 1); /* SPcox (E) */
- cio_write(cio, tccp->cblkh - 2, 1); /* SPcox (F) */
- cio_write(cio, tccp->cblksty, 1); /* SPcox (G) */
- cio_write(cio, tccp->qmfbid, 1); /* SPcox (H) */
-
- if (tccp->csty & J2K_CCP_CSTY_PRT) {
- for (i = 0; i < tccp->numresolutions; i++) {
- cio_write(cio, tccp->prcw[i] + (tccp->prch[i] << 4), 1); /* SPcox (I_i) */
- }
- }
-}
-
-static void j2k_read_cox(opj_j2k_t *j2k, int compno) {
- int i;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_cio_t *cio = j2k->cio;
-
- tccp->numresolutions = cio_read(cio, 1) + 1; /* SPcox (D) */
-
- /* If user wants to remove more resolutions than the codestream contains, return error*/
- if (cp->reduce >= tccp->numresolutions) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions to remove is higher than the number "
- "of resolutions of this component\nModify the cp_reduce parameter.\n\n", compno);
- j2k->state |= J2K_STATE_ERR;
- }
- if( tccp->numresolutions > J2K_MAXRLVLS ) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions is too big: %d vs max= %d. Truncating.\n\n",
- compno, tccp->numresolutions, J2K_MAXRLVLS);
- j2k->state |= J2K_STATE_ERR;
- tccp->numresolutions = J2K_MAXRLVLS;
- }
-
- tccp->cblkw = cio_read(cio, 1) + 2; /* SPcox (E) */
- tccp->cblkh = cio_read(cio, 1) + 2; /* SPcox (F) */
- tccp->cblksty = cio_read(cio, 1); /* SPcox (G) */
- tccp->qmfbid = cio_read(cio, 1); /* SPcox (H) */
- if (tccp->csty & J2K_CP_CSTY_PRT) {
- for (i = 0; i < tccp->numresolutions; i++) {
- int tmp = cio_read(cio, 1); /* SPcox (I_i) */
- tccp->prcw[i] = tmp & 0xf;
- tccp->prch[i] = tmp >> 4;
- }
- }
-
- /* INDEX >> */
- if(j2k->cstr_info && compno == 0) {
- for (i = 0; i < tccp->numresolutions; i++) {
- if (tccp->csty & J2K_CP_CSTY_PRT) {
- j2k->cstr_info->tile[j2k->curtileno].pdx[i] = tccp->prcw[i];
- j2k->cstr_info->tile[j2k->curtileno].pdy[i] = tccp->prch[i];
- }
- else {
- j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15;
- j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15;
- }
- }
- }
- /* << INDEX */
-}
-
-static void j2k_write_cod(opj_j2k_t *j2k) {
- opj_cp_t *cp = NULL;
- opj_tcp_t *tcp = NULL;
- int lenp, len;
-
- opj_cio_t *cio = j2k->cio;
-
- cio_write(cio, J2K_MS_COD, 2); /* COD */
-
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
-
- cp = j2k->cp;
- tcp = &cp->tcps[j2k->curtileno];
-
- cio_write(cio, tcp->csty, 1); /* Scod */
- cio_write(cio, tcp->prg, 1); /* SGcod (A) */
- cio_write(cio, tcp->numlayers, 2); /* SGcod (B) */
- cio_write(cio, tcp->mct, 1); /* SGcod (C) */
-
- j2k_write_cox(j2k, 0);
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lcod */
- cio_seek(cio, lenp + len);
-
- if(j2k->cstr_info)
- j2k_add_mhmarker(j2k->cstr_info, J2K_MS_COD, lenp, len);
-
-}
-
-static void j2k_read_cod(opj_j2k_t *j2k) {
- int len, i, pos;
-
- opj_cio_t *cio = j2k->cio;
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
- opj_image_t *image = j2k->image;
-
- len = cio_read(cio, 2); /* Lcod */
- (void)len;
- tcp->csty = cio_read(cio, 1); /* Scod */
- tcp->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* SGcod (A) */
- tcp->numlayers = cio_read(cio, 2); /* SGcod (B) */
- tcp->mct = cio_read(cio, 1); /* SGcod (C) */
-
- pos = cio_tell(cio);
- for (i = 0; i < image->numcomps; i++) {
- tcp->tccps[i].csty = tcp->csty & J2K_CP_CSTY_PRT;
- cio_seek(cio, pos);
- j2k_read_cox(j2k, i);
- }
-
- /* Index */
- if (j2k->cstr_info) {
- opj_codestream_info_t *cstr_info = j2k->cstr_info;
- cstr_info->prog = tcp->prg;
- cstr_info->numlayers = tcp->numlayers;
- cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int));
- for (i = 0; i < image->numcomps; i++) {
- cstr_info->numdecompos[i] = tcp->tccps[i].numresolutions - 1;
- }
- }
-}
-
-static void j2k_write_coc(opj_j2k_t *j2k, int compno) {
- int lenp, len;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
- opj_image_t *image = j2k->image;
- opj_cio_t *cio = j2k->cio;
-
- cio_write(cio, J2K_MS_COC, 2); /* COC */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- cio_write(cio, compno, image->numcomps <= 256 ? 1 : 2); /* Ccoc */
- cio_write(cio, tcp->tccps[compno].csty, 1); /* Scoc */
- j2k_write_cox(j2k, compno);
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lcoc */
- cio_seek(cio, lenp + len);
-}
-
-static void j2k_read_coc(opj_j2k_t *j2k) {
- int len, compno;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
- opj_image_t *image = j2k->image;
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2); /* Lcoc */
- (void)len;
- compno = cio_read(cio, image->numcomps <= 256 ? 1 : 2); /* Ccoc */
- if (compno >= image->numcomps) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "bad component number in COC (%d out of a maximum of %d)\n",
- compno, image->numcomps);
- return;
- }
- tcp->tccps[compno].csty = cio_read(cio, 1); /* Scoc */
- j2k_read_cox(j2k, compno);
-}
-
-static void j2k_write_qcx(opj_j2k_t *j2k, int compno) {
- int bandno, numbands;
- int expn, mant;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_cio_t *cio = j2k->cio;
-
- cio_write(cio, tccp->qntsty + (tccp->numgbits << 5), 1); /* Sqcx */
- numbands = tccp->qntsty == J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 - 2;
-
- for (bandno = 0; bandno < numbands; bandno++) {
- expn = tccp->stepsizes[bandno].expn;
- mant = tccp->stepsizes[bandno].mant;
-
- if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
- cio_write(cio, expn << 3, 1); /* SPqcx_i */
- } else {
- cio_write(cio, (expn << 11) + mant, 2); /* SPqcx_i */
- }
- }
-}
-
-static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len) {
- int tmp;
- int bandno, numbands;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_cio_t *cio = j2k->cio;
-
- tmp = cio_read(cio, 1); /* Sqcx */
- tccp->qntsty = tmp & 0x1f;
- tccp->numgbits = tmp >> 5;
- numbands = (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ?
- 1 : ((tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ? len - 1 : (len - 1) / 2);
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
-
- /* if JPWL is on, we check whether there are too many subbands */
- if ((numbands < 0) || (numbands >= J2K_MAXBANDS)) {
- opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
- "JPWL: bad number of subbands in Sqcx (%d)\n",
- numbands);
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- /* we try to correct */
- numbands = 1;
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n"
- "- setting number of bands to %d => HYPOTHESIS!!!\n",
- numbands);
- };
-
- };
-
-#else
- /* We check whether there are too many subbands */
- if ((numbands < 0) || (numbands >= J2K_MAXBANDS)) {
- opj_event_msg(j2k->cinfo, EVT_WARNING ,
- "bad number of subbands in Sqcx (%d) regarding to J2K_MAXBANDS (%d) \n"
- "- limiting number of bands to J2K_MAXBANDS and try to move to the next markers\n", numbands, J2K_MAXBANDS);
- /* edf_c2_1013627.jp2 */
- numbands = 1;
- }
-
-#endif /* USE_JPWL */
-
- for (bandno = 0; bandno < numbands; bandno++) {
- int expn, mant;
- if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
- expn = cio_read(cio, 1) >> 3; /* SPqcx_i */
- mant = 0;
- } else {
- tmp = cio_read(cio, 2); /* SPqcx_i */
- expn = tmp >> 11;
- mant = tmp & 0x7ff;
- }
- if (bandno < J2K_MAXBANDS){
- tccp->stepsizes[bandno].expn = expn;
- tccp->stepsizes[bandno].mant = mant;
- }
- }
-
- /* Add Antonin : if scalar_derived -> compute other stepsizes */
- if (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
- for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) {
- tccp->stepsizes[bandno].expn =
- ((tccp->stepsizes[0].expn) - ((bandno - 1) / 3) > 0) ?
- (tccp->stepsizes[0].expn) - ((bandno - 1) / 3) : 0;
- tccp->stepsizes[bandno].mant = tccp->stepsizes[0].mant;
- }
- }
- /* ddA */
-}
-
-static void j2k_write_qcd(opj_j2k_t *j2k) {
- int lenp, len;
-
- opj_cio_t *cio = j2k->cio;
-
- cio_write(cio, J2K_MS_QCD, 2); /* QCD */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- j2k_write_qcx(j2k, 0);
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lqcd */
- cio_seek(cio, lenp + len);
-
- if(j2k->cstr_info)
- j2k_add_mhmarker(j2k->cstr_info, J2K_MS_QCD, lenp, len);
-}
-
-static void j2k_read_qcd(opj_j2k_t *j2k) {
- int len, i, pos;
-
- opj_cio_t *cio = j2k->cio;
- opj_image_t *image = j2k->image;
-
- len = cio_read(cio, 2); /* Lqcd */
- pos = cio_tell(cio);
- for (i = 0; i < image->numcomps; i++) {
- cio_seek(cio, pos);
- j2k_read_qcx(j2k, i, len - 2);
- }
-}
-
-static void j2k_write_qcc(opj_j2k_t *j2k, int compno) {
- int lenp, len;
-
- opj_cio_t *cio = j2k->cio;
-
- cio_write(cio, J2K_MS_QCC, 2); /* QCC */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- cio_write(cio, compno, j2k->image->numcomps <= 256 ? 1 : 2); /* Cqcc */
- j2k_write_qcx(j2k, compno);
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lqcc */
- cio_seek(cio, lenp + len);
-}
-
-static void j2k_read_qcc(opj_j2k_t *j2k) {
- int len, compno;
- int numcomp = j2k->image->numcomps;
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2); /* Lqcc */
- compno = cio_read(cio, numcomp <= 256 ? 1 : 2); /* Cqcc */
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
-
- static int backup_compno = 0;
-
- /* compno is negative or larger than the number of components!!! */
- if ((compno < 0) || (compno >= numcomp)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: bad component number in QCC (%d out of a maximum of %d)\n",
- compno, numcomp);
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- /* we try to correct */
- compno = backup_compno % numcomp;
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"
- "- setting component number to %d\n",
- compno);
- }
-
- /* keep your private count of tiles */
- backup_compno++;
- }
-#endif /* USE_JPWL */
-
- if ((compno < 0) || (compno >= numcomp)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "bad component number in QCC (%d out of a maximum of %d)\n",
- compno, j2k->image->numcomps);
- return;
- }
-
- j2k_read_qcx(j2k, compno, len - 2 - (numcomp <= 256 ? 1 : 2));
-}
-
-static void j2k_write_poc(opj_j2k_t *j2k) {
- int len, numpchgs, i;
-
- int numcomps = j2k->image->numcomps;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
- opj_tccp_t *tccp = &tcp->tccps[0];
- opj_cio_t *cio = j2k->cio;
-
- numpchgs = 1 + tcp->numpocs;
- cio_write(cio, J2K_MS_POC, 2); /* POC */
- len = 2 + (5 + 2 * (numcomps <= 256 ? 1 : 2)) * numpchgs;
- cio_write(cio, len, 2); /* Lpoc */
- for (i = 0; i < numpchgs; i++) {
- opj_poc_t *poc = &tcp->pocs[i];
- cio_write(cio, poc->resno0, 1); /* RSpoc_i */
- cio_write(cio, poc->compno0, (numcomps <= 256 ? 1 : 2)); /* CSpoc_i */
- cio_write(cio, poc->layno1, 2); /* LYEpoc_i */
- poc->layno1 = int_min(poc->layno1, tcp->numlayers);
- cio_write(cio, poc->resno1, 1); /* REpoc_i */
- poc->resno1 = int_min(poc->resno1, tccp->numresolutions);
- cio_write(cio, poc->compno1, (numcomps <= 256 ? 1 : 2)); /* CEpoc_i */
- poc->compno1 = int_min(poc->compno1, numcomps);
- cio_write(cio, poc->prg, 1); /* Ppoc_i */
- }
-}
-
-static void j2k_read_poc(opj_j2k_t *j2k) {
- int len, numpchgs, i, old_poc;
-
- int numcomps = j2k->image->numcomps;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
- opj_cio_t *cio = j2k->cio;
-
- old_poc = tcp->POC ? tcp->numpocs + 1 : 0;
- tcp->POC = 1;
- len = cio_read(cio, 2); /* Lpoc */
- numpchgs = (len - 2) / (5 + 2 * (numcomps <= 256 ? 1 : 2));
-
- if( numpchgs >= 32 )
- {
- /* edf_c2_1103421.jp2 */
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "bad number of POCS (%d out of a maximum of %d)\n",
- numpchgs, 32);
- numpchgs = 0;
- }
-
- for (i = old_poc; i < numpchgs + old_poc; i++) {
- opj_poc_t *poc;
- poc = &tcp->pocs[i];
- poc->resno0 = cio_read(cio, 1); /* RSpoc_i */
- poc->compno0 = cio_read(cio, numcomps <= 256 ? 1 : 2); /* CSpoc_i */
- poc->layno1 = cio_read(cio, 2); /* LYEpoc_i */
- poc->resno1 = cio_read(cio, 1); /* REpoc_i */
- poc->compno1 = int_min(
- cio_read(cio, numcomps <= 256 ? 1 : 2), (unsigned int) numcomps); /* CEpoc_i */
- poc->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* Ppoc_i */
- }
-
- tcp->numpocs = numpchgs + old_poc - 1;
-}
-
-static void j2k_read_crg(opj_j2k_t *j2k) {
- int len, i, Xcrg_i, Ycrg_i;
-
- opj_cio_t *cio = j2k->cio;
- int numcomps = j2k->image->numcomps;
-
- len = cio_read(cio, 2); /* Lcrg */
- (void)len;
- for (i = 0; i < numcomps; i++) {
- Xcrg_i = cio_read(cio, 2); /* Xcrg_i */
- (void)Xcrg_i;
- Ycrg_i = cio_read(cio, 2); /* Ycrg_i */
- (void)Ycrg_i;
- }
-}
-
-static void j2k_read_tlm(opj_j2k_t *j2k) {
- int len, Ztlm, Stlm, ST, SP, tile_tlm, i;
- long int Ttlm_i, Ptlm_i;
-
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2); /* Ltlm */
- Ztlm = cio_read(cio, 1); /* Ztlm */
- (void)Ztlm;
- Stlm = cio_read(cio, 1); /* Stlm */
- ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02);
- SP = (Stlm >> 6) & 0x01;
- tile_tlm = (len - 4) / ((SP + 1) * 2 + ST);
- for (i = 0; i < tile_tlm; i++) {
- Ttlm_i = cio_read(cio, ST); /* Ttlm_i */
- (void)Ttlm_i;
- Ptlm_i = cio_read(cio, SP ? 4 : 2); /* Ptlm_i */
- (void)Ptlm_i;
- }
-}
-
-static void j2k_read_plm(opj_j2k_t *j2k) {
- int len, i, Zplm, Nplm, add, packet_len = 0;
-
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2); /* Lplm */
- Zplm = cio_read(cio, 1); /* Zplm */
- (void)Zplm;
- len -= 3;
- while (len > 0) {
- Nplm = cio_read(cio, 4); /* Nplm */
- len -= 4;
- for (i = Nplm; i > 0; i--) {
- add = cio_read(cio, 1);
- len--;
- packet_len = (packet_len << 7) + add; /* Iplm_ij */
- if ((add & 0x80) == 0) {
- /* New packet */
- packet_len = 0;
- }
- if (len <= 0)
- break;
- }
- }
-}
-
-static void j2k_read_plt(opj_j2k_t *j2k) {
- int len, i, Zplt, packet_len = 0, add;
-
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2); /* Lplt */
- Zplt = cio_read(cio, 1); /* Zplt */
- (void)Zplt;
- for (i = len - 3; i > 0; i--) {
- add = cio_read(cio, 1);
- packet_len = (packet_len << 7) + add; /* Iplt_i */
- if ((add & 0x80) == 0) {
- /* New packet */
- packet_len = 0;
- }
- }
-}
-
-static void j2k_read_ppm(opj_j2k_t *j2k) {
- int len, Z_ppm, i, j;
- int N_ppm;
-
- opj_cp_t *cp = j2k->cp;
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2);
- cp->ppm = 1;
-
- Z_ppm = cio_read(cio, 1); /* Z_ppm */
- len -= 3;
- while (len > 0) {
- if (cp->ppm_previous == 0) {
- N_ppm = cio_read(cio, 4); /* N_ppm */
- len -= 4;
- } else {
- N_ppm = cp->ppm_previous;
- }
- j = cp->ppm_store;
- if (Z_ppm == 0) { /* First PPM marker */
- cp->ppm_data = (unsigned char *) opj_malloc(N_ppm * sizeof(unsigned char));
- cp->ppm_data_first = cp->ppm_data;
- cp->ppm_len = N_ppm;
- } else { /* NON-first PPM marker */
- cp->ppm_data = (unsigned char *) opj_realloc(cp->ppm_data, (N_ppm + cp->ppm_store) * sizeof(unsigned char));
-
-#ifdef USE_JPWL
- /* this memory allocation check could be done even in non-JPWL cases */
- if (cp->correct) {
- if (!cp->ppm_data) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: failed memory allocation during PPM marker parsing (pos. %x)\n",
- cio_tell(cio));
- if (!JPWL_ASSUME || JPWL_ASSUME) {
- opj_free(cp->ppm_data);
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- }
- }
-#endif
-
- cp->ppm_data_first = cp->ppm_data;
- cp->ppm_len = N_ppm + cp->ppm_store;
- }
- for (i = N_ppm; i > 0; i--) { /* Read packet header */
- cp->ppm_data[j] = cio_read(cio, 1);
- j++;
- len--;
- if (len == 0)
- break; /* Case of non-finished packet header in present marker but finished in next one */
- }
- cp->ppm_previous = i - 1;
- cp->ppm_store = j;
- }
-}
-
-static void j2k_read_ppt(opj_j2k_t *j2k) {
- int len, Z_ppt, i, j = 0;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = cp->tcps + j2k->curtileno;
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2);
- Z_ppt = cio_read(cio, 1);
- tcp->ppt = 1;
- if (Z_ppt == 0) { /* First PPT marker */
- tcp->ppt_data = (unsigned char *) opj_malloc((len - 3) * sizeof(unsigned char));
- tcp->ppt_data_first = tcp->ppt_data;
- tcp->ppt_store = 0;
- tcp->ppt_len = len - 3;
- } else { /* NON-first PPT marker */
- tcp->ppt_data = (unsigned char *) opj_realloc(tcp->ppt_data, (len - 3 + tcp->ppt_store) * sizeof(unsigned char));
- tcp->ppt_data_first = tcp->ppt_data;
- tcp->ppt_len = len - 3 + tcp->ppt_store;
- }
- j = tcp->ppt_store;
- for (i = len - 3; i > 0; i--) {
- tcp->ppt_data[j] = cio_read(cio, 1);
- j++;
- }
- tcp->ppt_store = j;
-}
-
-static void j2k_write_tlm(opj_j2k_t *j2k){
- int lenp;
- opj_cio_t *cio = j2k->cio;
- j2k->tlm_start = cio_tell(cio);
- cio_write(cio, J2K_MS_TLM, 2);/* TLM */
- lenp = 4 + (5*j2k->totnum_tp);
- cio_write(cio,lenp,2); /* Ltlm */
- cio_write(cio, 0,1); /* Ztlm=0*/
- cio_write(cio,80,1); /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */
- cio_skip(cio,5*j2k->totnum_tp);
-}
-
-static void j2k_write_sot(opj_j2k_t *j2k) {
- int lenp, len;
-
- opj_cio_t *cio = j2k->cio;
-
- j2k->sot_start = cio_tell(cio);
- cio_write(cio, J2K_MS_SOT, 2); /* SOT */
- lenp = cio_tell(cio);
- cio_skip(cio, 2); /* Lsot (further) */
- cio_write(cio, j2k->curtileno, 2); /* Isot */
- cio_skip(cio, 4); /* Psot (further in j2k_write_sod) */
- cio_write(cio, j2k->cur_tp_num , 1); /* TPsot */
- cio_write(cio, j2k->cur_totnum_tp[j2k->curtileno], 1); /* TNsot */
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lsot */
- cio_seek(cio, lenp + len);
-
- /* UniPG>> */
-#ifdef USE_JPWL
- /* update markers struct */
- j2k_add_marker(j2k->cstr_info, J2K_MS_SOT, j2k->sot_start, len + 2);
-#endif /* USE_JPWL */
- /* <<UniPG */
-
- if( j2k->cstr_info && j2k->cur_tp_num==0){
- j2k_add_tlmarker( j2k->curtileno, j2k->cstr_info, J2K_MS_SOT, lenp, len);
- }
-}
-
-static void j2k_read_sot(opj_j2k_t *j2k) {
- int len, tileno, totlen, partno, numparts, i;
- opj_tcp_t *tcp = NULL;
- char status = 0;
-
- opj_cp_t *cp = j2k->cp;
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2);
- (void)len;
- tileno = cio_read(cio, 2);
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
-
- static int backup_tileno = 0;
-
- /* tileno is negative or larger than the number of tiles!!! */
- if ((tileno < 0) || (tileno >= (cp->tw * cp->th))) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: bad tile number (%d out of a maximum of %d)\n",
- tileno, (cp->tw * cp->th));
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- /* we try to correct */
- tileno = backup_tileno;
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"
- "- setting tile number to %d\n",
- tileno);
- }
-
- /* keep your private count of tiles */
- backup_tileno++;
- }
- else
-#endif /* USE_JPWL */
- {
- /* tileno is negative or larger than the number of tiles!!! */
- if ((tileno < 0) || (tileno >= (cp->tw * cp->th))) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: bad tile number (%d out of a maximum of %d)\n",
- tileno, (cp->tw * cp->th));
- return;
- }
- }
-
- if (cp->tileno_size == 0) {
- cp->tileno[cp->tileno_size] = tileno;
- cp->tileno_size++;
- } else {
- i = 0;
- while (i < cp->tileno_size && status == 0) {
- status = cp->tileno[i] == tileno ? 1 : 0;
- i++;
- }
- if (status == 0) {
- cp->tileno[cp->tileno_size] = tileno;
- cp->tileno_size++;
- }
- }
-
- totlen = cio_read(cio, 4);
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
-
- /* totlen is negative or larger than the bytes left!!! */
- if ((totlen < 0) || (totlen > (cio_numbytesleft(cio) + 8))) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: bad tile byte size (%d bytes against %d bytes left)\n",
- totlen, cio_numbytesleft(cio) + 8);
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- /* we try to correct */
- totlen = 0;
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"
- "- setting Psot to %d => assuming it is the last tile\n",
- totlen);
- }
-
- }
- else
-#endif /* USE_JPWL */
- {
- /* totlen is negative or larger than the bytes left!!! */
- if ((totlen < 0) || (totlen > (cio_numbytesleft(cio) + 8))) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: bad tile byte size (%d bytes against %d bytes left)\n",
- totlen, cio_numbytesleft(cio) + 8);
- return;
- }
- }
-
- if (!totlen)
- totlen = cio_numbytesleft(cio) + 8;
-
- partno = cio_read(cio, 1);
- numparts = cio_read(cio, 1);
-
- if (partno >= numparts) {
- opj_event_msg(j2k->cinfo, EVT_WARNING, "SOT marker inconsistency in tile %d: tile-part index greater (%d) than number of tile-parts (%d)\n", tileno, partno, numparts);
- numparts = partno+1;
- }
-
- j2k->curtileno = tileno;
- j2k->cur_tp_num = partno;
- j2k->eot = cio_getbp(cio) - 12 + totlen;
- j2k->state = J2K_STATE_TPH;
- tcp = &cp->tcps[j2k->curtileno];
-
- /* Index */
- if (j2k->cstr_info) {
- if (tcp->first) {
- if (tileno == 0)
- j2k->cstr_info->main_head_end = cio_tell(cio) - 13;
- j2k->cstr_info->tile[tileno].tileno = tileno;
- j2k->cstr_info->tile[tileno].start_pos = cio_tell(cio) - 12;
- j2k->cstr_info->tile[tileno].end_pos = j2k->cstr_info->tile[tileno].start_pos + totlen - 1;
- } else {
- j2k->cstr_info->tile[tileno].end_pos += totlen;
- }
- j2k->cstr_info->tile[tileno].num_tps = numparts;
- if (numparts)
- j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_realloc(j2k->cstr_info->tile[tileno].tp, numparts * sizeof(opj_tp_info_t));
- else
- j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_realloc(j2k->cstr_info->tile[tileno].tp, 10 * sizeof(opj_tp_info_t)); /* Fixme (10)*/
- j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = cio_tell(cio) - 12;
- j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos =
- j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1;
- }
-
- if (tcp->first == 1) {
- /* Initialization PPT */
- opj_tccp_t *tmp = tcp->tccps;
- memcpy(tcp, j2k->default_tcp, sizeof(opj_tcp_t));
- tcp->ppt = 0;
- tcp->ppt_data = NULL;
- tcp->ppt_data_first = NULL;
- tcp->tccps = tmp;
-
- for (i = 0; i < j2k->image->numcomps; i++) {
- tcp->tccps[i] = j2k->default_tcp->tccps[i];
- }
- cp->tcps[j2k->curtileno].first = 0;
- }
-}
-
-static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder) {
- int l, layno;
- int totlen;
- opj_tcp_t *tcp = NULL;
- opj_codestream_info_t *cstr_info = NULL;
-
- opj_tcd_t *tcd = (opj_tcd_t*)tile_coder; /* cast is needed because of conflicts in header inclusions */
- opj_cp_t *cp = j2k->cp;
- opj_cio_t *cio = j2k->cio;
-
- tcd->tp_num = j2k->tp_num ;
- tcd->cur_tp_num = j2k->cur_tp_num;
-
- cio_write(cio, J2K_MS_SOD, 2);
-
- if( j2k->cstr_info && j2k->cur_tp_num==0){
- j2k_add_tlmarker( j2k->curtileno, j2k->cstr_info, J2K_MS_SOD, cio_tell(cio), 0);
- }
-
- if (j2k->curtileno == 0) {
- j2k->sod_start = cio_tell(cio) + j2k->pos_correction;
- }
-
- /* INDEX >> */
- cstr_info = j2k->cstr_info;
- if (cstr_info) {
- if (!j2k->cur_tp_num ) {
- cstr_info->tile[j2k->curtileno].end_header = cio_tell(cio) + j2k->pos_correction - 1;
- j2k->cstr_info->tile[j2k->curtileno].tileno = j2k->curtileno;
- }
- else{
- if(cstr_info->tile[j2k->curtileno].packet[cstr_info->packno - 1].end_pos < cio_tell(cio))
- cstr_info->tile[j2k->curtileno].packet[cstr_info->packno].start_pos = cio_tell(cio);
- }
- /* UniPG>> */
-#ifdef USE_JPWL
- /* update markers struct */
- j2k_add_marker(j2k->cstr_info, J2K_MS_SOD, j2k->sod_start, 2);
-#endif /* USE_JPWL */
- /* <<UniPG */
- }
- /* << INDEX */
-
- tcp = &cp->tcps[j2k->curtileno];
- for (layno = 0; layno < tcp->numlayers; layno++) {
- if (tcp->rates[layno]>(j2k->sod_start / (cp->th * cp->tw))) {
- tcp->rates[layno]-=(j2k->sod_start / (cp->th * cp->tw));
- } else if (tcp->rates[layno]) {
- tcp->rates[layno]=1;
- }
- }
- if(j2k->cur_tp_num == 0){
- tcd->tcd_image->tiles->packno = 0;
- if(cstr_info)
- cstr_info->packno = 0;
- }
-
- l = tcd_encode_tile(tcd, j2k->curtileno, cio_getbp(cio), cio_numbytesleft(cio) - 2, cstr_info);
-
- /* Writing Psot in SOT marker */
- totlen = cio_tell(cio) + l - j2k->sot_start;
- cio_seek(cio, j2k->sot_start + 6);
- cio_write(cio, totlen, 4);
- cio_seek(cio, j2k->sot_start + totlen);
- /* Writing Ttlm and Ptlm in TLM marker */
- if(cp->cinema){
- cio_seek(cio, j2k->tlm_start + 6 + (5*j2k->cur_tp_num));
- cio_write(cio, j2k->curtileno, 1);
- cio_write(cio, totlen, 4);
- }
- cio_seek(cio, j2k->sot_start + totlen);
-}
-
-static void j2k_read_sod(opj_j2k_t *j2k) {
- int len, truncate = 0, i;
- unsigned char *data = NULL, *data_ptr = NULL;
-
- opj_cio_t *cio = j2k->cio;
- int curtileno = j2k->curtileno;
-
- /* Index */
- if (j2k->cstr_info) {
- j2k->cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header =
- cio_tell(cio) + j2k->pos_correction - 1;
- if (j2k->cur_tp_num == 0)
- j2k->cstr_info->tile[j2k->curtileno].end_header = cio_tell(cio) + j2k->pos_correction - 1;
- j2k->cstr_info->packno = 0;
- }
-
- len = int_min(j2k->eot - cio_getbp(cio), cio_numbytesleft(cio) + 1);
-
- if (len == cio_numbytesleft(cio) + 1) {
- truncate = 1; /* Case of a truncate codestream */
- }
-
- data = j2k->tile_data[curtileno];
- data_ptr = data; /* store in case of failure */
- data = (unsigned char*) opj_realloc(data, (j2k->tile_len[curtileno] + len) * sizeof(unsigned char));
- if( data == NULL ) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not reallocated\n" );
- opj_free( data_ptr );
- return;
- }
-
- data_ptr = data + j2k->tile_len[curtileno];
- for (i = 0; i < len; i++) {
- data_ptr[i] = cio_read(cio, 1);
- }
-
- j2k->tile_len[curtileno] += len;
- j2k->tile_data[curtileno] = data;
-
- if (!truncate) {
- j2k->state = J2K_STATE_TPHSOT;
- } else {
- j2k->state = J2K_STATE_NEOC; /* RAJOUTE !! */
- }
- j2k->cur_tp_num++;
-}
-
-static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno) {
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = &cp->tcps[tileno];
- opj_cio_t *cio = j2k->cio;
- int numcomps = j2k->image->numcomps;
-
- cio_write(cio, J2K_MS_RGN, 2); /* RGN */
- cio_write(cio, numcomps <= 256 ? 5 : 6, 2); /* Lrgn */
- cio_write(cio, compno, numcomps <= 256 ? 1 : 2); /* Crgn */
- cio_write(cio, 0, 1); /* Srgn */
- cio_write(cio, tcp->tccps[compno].roishift, 1); /* SPrgn */
-}
-
-static void j2k_read_rgn(opj_j2k_t *j2k) {
- int len, compno, roisty;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
- opj_cio_t *cio = j2k->cio;
- int numcomps = j2k->image->numcomps;
-
- len = cio_read(cio, 2); /* Lrgn */
- (void)len;
- compno = cio_read(cio, numcomps <= 256 ? 1 : 2); /* Crgn */
- roisty = cio_read(cio, 1); /* Srgn */
- (void)roisty;
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
- /* totlen is negative or larger than the bytes left!!! */
- if (compno >= numcomps) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: bad component number in RGN (%d when there are only %d)\n",
- compno, numcomps);
- if (!JPWL_ASSUME || JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- }
- };
-#endif /* USE_JPWL */
-
- if (compno >= numcomps) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "bad component number in RGN (%d out of a maximum of %d)\n",
- compno, j2k->image->numcomps);
- return;
- }
-
- tcp->tccps[compno].roishift = cio_read(cio, 1); /* SPrgn */
-}
-
-static void j2k_write_eoc(opj_j2k_t *j2k) {
- opj_cio_t *cio = j2k->cio;
- /* opj_event_msg(j2k->cinfo, "%.8x: EOC\n", cio_tell(cio) + j2k->pos_correction); */
- cio_write(cio, J2K_MS_EOC, 2);
-
-/* UniPG>> */
-#ifdef USE_JPWL
- /* update markers struct */
- j2k_add_marker(j2k->cstr_info, J2K_MS_EOC, cio_tell(cio) - 2, 2);
-#endif /* USE_JPWL */
-/* <<UniPG */
-}
-
-static void j2k_read_eoc(opj_j2k_t *j2k) {
- int i, tileno;
- opj_bool success = OPJ_FALSE;
-
- /* if packets should be decoded */
- if (j2k->cp->limit_decoding != DECODE_ALL_BUT_PACKETS) {
- opj_tcd_t *tcd = tcd_create(j2k->cinfo);
- tcd_malloc_decode(tcd, j2k->image, j2k->cp);
- for (i = 0; i < j2k->cp->tileno_size; i++) {
- tcd_malloc_decode_tile(tcd, j2k->image, j2k->cp, i, j2k->cstr_info);
- if (j2k->cp->tileno[i] != -1)
- {
- tileno = j2k->cp->tileno[i];
- success = tcd_decode_tile(tcd, j2k->tile_data[tileno], j2k->tile_len[tileno], tileno, j2k->cstr_info);
- assert( tileno != -1 );
- opj_free(j2k->tile_data[tileno]);
- j2k->tile_data[tileno] = NULL;
- tcd_free_decode_tile(tcd, i);
- }
- else
- success = OPJ_FALSE;
- if (success == OPJ_FALSE) {
- j2k->state |= J2K_STATE_ERR;
- break;
- }
- }
- tcd_free_decode(tcd);
- tcd_destroy(tcd);
- }
- /* if packets should not be decoded */
- else {
- for (i = 0; i < j2k->cp->tileno_size; i++) {
- tileno = j2k->cp->tileno[i];
- opj_free(j2k->tile_data[tileno]);
- j2k->tile_data[tileno] = NULL;
- }
- }
- if (j2k->state & J2K_STATE_ERR)
- j2k->state = J2K_STATE_MT + J2K_STATE_ERR;
- else
- j2k->state = J2K_STATE_MT;
-}
-
-typedef struct opj_dec_mstabent {
- /** marker value */
- int id;
- /** value of the state when the marker can appear */
- int states;
- /** action linked to the marker */
- void (*handler) (opj_j2k_t *j2k);
-} opj_dec_mstabent_t;
-
-opj_dec_mstabent_t j2k_dec_mstab[] = {
- {J2K_MS_SOC, J2K_STATE_MHSOC, j2k_read_soc},
- {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, j2k_read_sot},
- {J2K_MS_SOD, J2K_STATE_TPH, j2k_read_sod},
- {J2K_MS_EOC, J2K_STATE_TPHSOT, j2k_read_eoc},
- {J2K_MS_SIZ, J2K_STATE_MHSIZ, j2k_read_siz},
- {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_cod},
- {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_coc},
- {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_rgn},
- {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcd},
- {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcc},
- {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_poc},
- {J2K_MS_TLM, J2K_STATE_MH, j2k_read_tlm},
- {J2K_MS_PLM, J2K_STATE_MH, j2k_read_plm},
- {J2K_MS_PLT, J2K_STATE_TPH, j2k_read_plt},
- {J2K_MS_PPM, J2K_STATE_MH, j2k_read_ppm},
- {J2K_MS_PPT, J2K_STATE_TPH, j2k_read_ppt},
- {J2K_MS_SOP, 0, 0},
- {J2K_MS_CRG, J2K_STATE_MH, j2k_read_crg},
- {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_com},
-
-#ifdef USE_JPWL
- {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc},
- {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb},
- {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd},
- {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red},
-#endif /* USE_JPWL */
-#ifdef USE_JPSEC
- {J2K_MS_SEC, J2K_STATE_MH, j2k_read_sec},
- {J2K_MS_INSEC, 0, j2k_read_insec},
-#endif /* USE_JPSEC */
-
- {0, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_unk}
-};
-
-static void j2k_read_unk(opj_j2k_t *j2k) {
- opj_event_msg(j2k->cinfo, EVT_WARNING, "Unknown marker\n");
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
- int m = 0, id, i;
- int min_id = 0, min_dist = 17, cur_dist = 0, tmp_id;
- cio_seek(j2k->cio, cio_tell(j2k->cio) - 2);
- id = cio_read(j2k->cio, 2);
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: really don't know this marker %x\n",
- id);
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "- possible synch loss due to uncorrectable codestream errors => giving up\n");
- return;
- }
- /* OK, activate this at your own risk!!! */
- /* we look for the marker at the minimum hamming distance from this */
- while (j2k_dec_mstab[m].id) {
-
- /* 1's where they differ */
- tmp_id = j2k_dec_mstab[m].id ^ id;
-
- /* compute the hamming distance between our id and the current */
- cur_dist = 0;
- for (i = 0; i < 16; i++) {
- if ((tmp_id >> i) & 0x0001) {
- cur_dist++;
- }
- }
-
- /* if current distance is smaller, set the minimum */
- if (cur_dist < min_dist) {
- min_dist = cur_dist;
- min_id = j2k_dec_mstab[m].id;
- }
-
- /* jump to the next marker */
- m++;
- }
-
- /* do we substitute the marker? */
- if (min_dist < JPWL_MAXIMUM_HAMMING) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "- marker %x is at distance %d from the read %x\n",
- min_id, min_dist, id);
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "- trying to substitute in place and crossing fingers!\n");
- cio_seek(j2k->cio, cio_tell(j2k->cio) - 2);
- cio_write(j2k->cio, min_id, 2);
-
- /* rewind */
- cio_seek(j2k->cio, cio_tell(j2k->cio) - 2);
-
- }
-
- };
-#endif /* USE_JPWL */
-
-}
-
-/**
-Read the lookup table containing all the marker, status and action
-@param id Marker value
-*/
-static opj_dec_mstabent_t *j2k_dec_mstab_lookup(int id) {
- opj_dec_mstabent_t *e;
- for (e = j2k_dec_mstab; e->id != 0; e++) {
- if (e->id == id) {
- break;
- }
- }
- return e;
-}
-
-/* ----------------------------------------------------------------------- */
-/* J2K / JPT decoder interface */
-/* ----------------------------------------------------------------------- */
-
-opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo) {
- opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
- if(!j2k)
- return NULL;
-
- j2k->default_tcp = (opj_tcp_t*) opj_calloc(1, sizeof(opj_tcp_t));
- if(!j2k->default_tcp) {
- opj_free(j2k);
- return NULL;
- }
-
- j2k->cinfo = cinfo;
- j2k->tile_data = NULL;
-
- return j2k;
-}
-
-void j2k_destroy_decompress(opj_j2k_t *j2k) {
- int i = 0;
-
- if(j2k->tile_len != NULL) {
- opj_free(j2k->tile_len);
- }
- if(j2k->tile_data != NULL) {
- if(j2k->cp != NULL) {
- for (i = 0; i < j2k->cp->tileno_size; i++) {
- int tileno = j2k->cp->tileno[i];
- if( tileno != -1 )
- {
- opj_free(j2k->tile_data[tileno]);
- j2k->tile_data[tileno] = NULL;
- }
- }
- }
-
- opj_free(j2k->tile_data);
- }
- if(j2k->default_tcp != NULL) {
- opj_tcp_t *default_tcp = j2k->default_tcp;
- if(default_tcp->ppt_data_first != NULL) {
- opj_free(default_tcp->ppt_data_first);
- }
- if(j2k->default_tcp->tccps != NULL) {
- opj_free(j2k->default_tcp->tccps);
- }
- opj_free(j2k->default_tcp);
- }
- if(j2k->cp != NULL) {
- opj_cp_t *cp = j2k->cp;
- if(cp->tcps != NULL) {
- for(i = 0; i < cp->tw * cp->th; i++) {
- if(cp->tcps[i].ppt_data_first != NULL) {
- opj_free(cp->tcps[i].ppt_data_first);
- }
- if(cp->tcps[i].tccps != NULL) {
- opj_free(cp->tcps[i].tccps);
- }
- }
- opj_free(cp->tcps);
- }
- if(cp->ppm_data_first != NULL) {
- opj_free(cp->ppm_data_first);
- }
- if(cp->tileno != NULL) {
- opj_free(cp->tileno);
- }
- if(cp->comment != NULL) {
- opj_free(cp->comment);
- }
-
- opj_free(cp);
- }
- opj_free(j2k);
-}
-
-void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters) {
- if(j2k && parameters) {
- /* create and initialize the coding parameters structure */
- opj_cp_t *cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t));
- cp->reduce = parameters->cp_reduce;
- cp->layer = parameters->cp_layer;
- cp->limit_decoding = parameters->cp_limit_decoding;
-
-#ifdef USE_JPWL
- cp->correct = parameters->jpwl_correct;
- cp->exp_comps = parameters->jpwl_exp_comps;
- cp->max_tiles = parameters->jpwl_max_tiles;
-#endif /* USE_JPWL */
-
-
- /* keep a link to cp so that we can destroy it later in j2k_destroy_decompress */
- j2k->cp = cp;
- }
-}
-
-opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info) {
- opj_image_t *image = NULL;
-
- opj_common_ptr cinfo = j2k->cinfo;
-
- j2k->cio = cio;
- j2k->cstr_info = cstr_info;
- if (cstr_info)
- memset(cstr_info, 0, sizeof(opj_codestream_info_t));
-
- /* create an empty image */
- image = opj_image_create0();
- j2k->image = image;
-
- j2k->state = J2K_STATE_MHSOC;
-
- for (;;) {
- opj_dec_mstabent_t *e;
- int id = cio_read(cio, 2);
-
-#ifdef USE_JPWL
- /* we try to honor JPWL correction power */
- if (j2k->cp->correct) {
-
- int orig_pos = cio_tell(cio);
- opj_bool status;
-
- /* call the corrector */
- status = jpwl_correct(j2k);
-
- /* go back to where you were */
- cio_seek(cio, orig_pos - 2);
-
- /* re-read the marker */
- id = cio_read(cio, 2);
-
- /* check whether it begins with ff */
- if (id >> 8 != 0xff) {
- opj_event_msg(cinfo, EVT_ERROR,
- "JPWL: possible bad marker %x at %d\n",
- id, cio_tell(cio) - 2);
- if (!JPWL_ASSUME) {
- opj_image_destroy(image);
- opj_event_msg(cinfo, EVT_ERROR, "JPWL: giving up\n");
- return 0;
- }
- /* we try to correct */
- id = id | 0xff00;
- cio_seek(cio, cio_tell(cio) - 2);
- cio_write(cio, id, 2);
- opj_event_msg(cinfo, EVT_WARNING, "- trying to adjust this\n"
- "- setting marker to %x\n",
- id);
- }
-
- }
-#endif /* USE_JPWL */
-
- if (id >> 8 != 0xff) {
- if(cio_numbytesleft(cio) != 0) /* not end of file reached and no EOC */
- {
- opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id);
- opj_image_destroy(image);
- return 0;
- }
- opj_event_msg(cinfo, EVT_WARNING, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id);
- j2k->state = J2K_STATE_NEOC;
- break;
- }
- e = j2k_dec_mstab_lookup(id);
- /* Check if the marker is known*/
- if (!(j2k->state & e->states)) {
- opj_image_destroy(image);
- opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", cio_tell(cio) - 2, id);
- return 0;
- }
- /* Check if the decoding is limited to the main header*/
- if (e->id == J2K_MS_SOT && j2k->cp->limit_decoding == LIMIT_TO_MAIN_HEADER) {
- opj_event_msg(cinfo, EVT_INFO, "Main Header decoded.\n");
- return image;
- }
-
- if (e->handler) {
- (*e->handler)(j2k);
- }
- if (j2k->state & J2K_STATE_ERR)
- {
- opj_image_destroy(image);
- return NULL;
- }
-
- if (j2k->state == J2K_STATE_MT) {
- break;
- }
- if (j2k->state == J2K_STATE_NEOC) {
- break;
- }
- }
- if (j2k->state == J2K_STATE_NEOC) {
- j2k_read_eoc(j2k);
- /* Check one last time for errors during decoding before returning */
- if (j2k->state & J2K_STATE_ERR) {
- opj_image_destroy(image);
- return NULL;
- }
- }
-
- if (j2k->state != J2K_STATE_MT) {
- opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n");
- }
- return image;
-}
-
-/*
-* Read a JPT-stream and decode file
-*
-*/
-opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info) {
- opj_image_t *image = NULL;
- opj_jpt_msg_header_t header;
- int position;
- opj_common_ptr cinfo = j2k->cinfo;
-
- OPJ_ARG_NOT_USED(cstr_info);
-
- j2k->cio = cio;
-
- /* create an empty image */
- image = opj_image_create0();
- j2k->image = image;
-
- j2k->state = J2K_STATE_MHSOC;
-
- /* Initialize the header */
- jpt_init_msg_header(&header);
- /* Read the first header of the message */
- jpt_read_msg_header(cinfo, cio, &header);
-
- position = cio_tell(cio);
- if (header.Class_Id != 6) { /* 6 : Main header data-bin message */
- opj_image_destroy(image);
- opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Main header first [class_Id %d] !\n", header.Class_Id);
- return 0;
- }
-
- for (;;) {
- opj_dec_mstabent_t *e = NULL;
- int id;
-
- if (!cio_numbytesleft(cio)) {
- j2k_read_eoc(j2k);
- return image;
- }
- /* data-bin read -> need to read a new header */
- if ((unsigned int) (cio_tell(cio) - position) == header.Msg_length) {
- jpt_read_msg_header(cinfo, cio, &header);
- position = cio_tell(cio);
- if (header.Class_Id != 4) { /* 4 : Tile data-bin message */
- opj_image_destroy(image);
- opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Tile info !\n");
- return 0;
- }
- }
-
- id = cio_read(cio, 2);
- if (id >> 8 != 0xff) {
- if(cio_numbytesleft(cio) != 0) /* no end of file reached and no EOC */
- {
- opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id);
- opj_image_destroy(image);
- return 0;
- }
- opj_event_msg(cinfo, EVT_WARNING, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id);
- j2k->state = J2K_STATE_NEOC;
- break;
- }
- e = j2k_dec_mstab_lookup(id);
- if (!(j2k->state & e->states)) {
- opj_image_destroy(image);
- opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", cio_tell(cio) - 2, id);
- return 0;
- }
- if (e->handler) {
- (*e->handler)(j2k);
- }
- if (j2k->state == J2K_STATE_MT) {
- break;
- }
- if (j2k->state == J2K_STATE_NEOC) {
- break;
- }
- }
- if (j2k->state == J2K_STATE_NEOC) {
- j2k_read_eoc(j2k);
- }
-
- if (j2k->state != J2K_STATE_MT) {
- opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n");
- }
-
- return image;
-}
-
-/* ----------------------------------------------------------------------- */
-/* J2K encoder interface */
-/* ----------------------------------------------------------------------- */
-
-opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo) {
- opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
- if(j2k) {
- j2k->cinfo = cinfo;
- }
- return j2k;
-}
-
-void j2k_destroy_compress(opj_j2k_t *j2k) {
- int tileno;
-
- if(!j2k) return;
- if(j2k->cp != NULL) {
- opj_cp_t *cp = j2k->cp;
-
- if(cp->comment) {
- opj_free(cp->comment);
- }
- if(cp->matrice) {
- opj_free(cp->matrice);
- }
- for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
- opj_free(cp->tcps[tileno].tccps);
- }
- opj_free(cp->tcps);
- opj_free(cp);
- }
-
- opj_free(j2k);
-}
-
-void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image) {
- int i, j, tileno, numpocs_tile;
- opj_cp_t *cp = NULL;
-
- if(!j2k || !parameters || ! image) {
- return;
- }
-
- /* create and initialize the coding parameters structure */
- cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t));
-
- /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */
- j2k->cp = cp;
-
- /* set default values for cp */
- cp->tw = 1;
- cp->th = 1;
-
- /*
- copy user encoding parameters
- */
- cp->cinema = parameters->cp_cinema;
- cp->max_comp_size = parameters->max_comp_size;
- cp->rsiz = parameters->cp_rsiz;
- cp->disto_alloc = parameters->cp_disto_alloc;
- cp->fixed_alloc = parameters->cp_fixed_alloc;
- cp->fixed_quality = parameters->cp_fixed_quality;
-
- /* mod fixed_quality */
- if(parameters->cp_matrice) {
- size_t array_size = parameters->tcp_numlayers * parameters->numresolution * 3 * sizeof(int);
- cp->matrice = (int *) opj_malloc(array_size);
- memcpy(cp->matrice, parameters->cp_matrice, array_size);
- }
-
- /* tiles */
- cp->tdx = parameters->cp_tdx;
- cp->tdy = parameters->cp_tdy;
-
- /* tile offset */
- cp->tx0 = parameters->cp_tx0;
- cp->ty0 = parameters->cp_ty0;
-
- /* comment string */
- if(parameters->cp_comment) {
- cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1);
- if(cp->comment) {
- strcpy(cp->comment, parameters->cp_comment);
- }
- }
-
- /*
- calculate other encoding parameters
- */
-
- if (parameters->tile_size_on) {
- cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx);
- cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy);
- } else {
- cp->tdx = image->x1 - cp->tx0;
- cp->tdy = image->y1 - cp->ty0;
- }
-
- if(parameters->tp_on){
- cp->tp_flag = parameters->tp_flag;
- cp->tp_on = 1;
- }
-
- cp->img_size = 0;
- for(i=0;i<image->numcomps ;i++){
- cp->img_size += (image->comps[i].w *image->comps[i].h * image->comps[i].prec);
- }
-
-
-#ifdef USE_JPWL
- /*
- calculate JPWL encoding parameters
- */
-
- if (parameters->jpwl_epc_on) {
- int i;
-
- /* set JPWL on */
- cp->epc_on = OPJ_TRUE;
- cp->info_on = OPJ_FALSE; /* no informative technique */
-
- /* set EPB on */
- if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) {
- cp->epb_on = OPJ_TRUE;
-
- cp->hprot_MH = parameters->jpwl_hprot_MH;
- for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
- cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i];
- cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i];
- }
- /* if tile specs are not specified, copy MH specs */
- if (cp->hprot_TPH[0] == -1) {
- cp->hprot_TPH_tileno[0] = 0;
- cp->hprot_TPH[0] = parameters->jpwl_hprot_MH;
- }
- for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
- cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i];
- cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i];
- cp->pprot[i] = parameters->jpwl_pprot[i];
- }
- }
-
- /* set ESD writing */
- if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) {
- cp->esd_on = OPJ_TRUE;
-
- cp->sens_size = parameters->jpwl_sens_size;
- cp->sens_addr = parameters->jpwl_sens_addr;
- cp->sens_range = parameters->jpwl_sens_range;
-
- cp->sens_MH = parameters->jpwl_sens_MH;
- for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
- cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i];
- cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i];
- }
- }
-
- /* always set RED writing to false: we are at the encoder */
- cp->red_on = OPJ_FALSE;
-
- } else {
- cp->epc_on = OPJ_FALSE;
- }
-#endif /* USE_JPWL */
-
-
- /* initialize the mutiple tiles */
- /* ---------------------------- */
- cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
-
- for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
- opj_tcp_t *tcp = &cp->tcps[tileno];
- tcp->numlayers = parameters->tcp_numlayers;
- for (j = 0; j < tcp->numlayers; j++) {
- if(cp->cinema){
- if (cp->fixed_quality) {
- tcp->distoratio[j] = parameters->tcp_distoratio[j];
- }
- tcp->rates[j] = parameters->tcp_rates[j];
- }else{
- if (cp->fixed_quality) { /* add fixed_quality */
- tcp->distoratio[j] = parameters->tcp_distoratio[j];
- } else {
- tcp->rates[j] = parameters->tcp_rates[j];
- }
- }
- }
- tcp->csty = parameters->csty;
- tcp->prg = parameters->prog_order;
- tcp->mct = parameters->tcp_mct;
-
- numpocs_tile = 0;
- tcp->POC = 0;
- if (parameters->numpocs) {
- /* initialisation of POC */
- tcp->POC = 1;
- for (i = 0; i < parameters->numpocs; i++) {
- if((tileno == parameters->POC[i].tile - 1) || (parameters->POC[i].tile == -1)) {
- opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];
- tcp_poc->resno0 = parameters->POC[numpocs_tile].resno0;
- tcp_poc->compno0 = parameters->POC[numpocs_tile].compno0;
- tcp_poc->layno1 = parameters->POC[numpocs_tile].layno1;
- tcp_poc->resno1 = parameters->POC[numpocs_tile].resno1;
- tcp_poc->compno1 = parameters->POC[numpocs_tile].compno1;
- tcp_poc->prg1 = parameters->POC[numpocs_tile].prg1;
- tcp_poc->tile = parameters->POC[numpocs_tile].tile;
- numpocs_tile++;
- }
- }
- tcp->numpocs = numpocs_tile -1 ;
- }else{
- tcp->numpocs = 0;
- }
-
- tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
-
- for (i = 0; i < image->numcomps; i++) {
- opj_tccp_t *tccp = &tcp->tccps[i];
- tccp->csty = parameters->csty & 0x01; /* 0 => one precinct || 1 => custom precinct */
- tccp->numresolutions = parameters->numresolution;
- tccp->cblkw = int_floorlog2(parameters->cblockw_init);
- tccp->cblkh = int_floorlog2(parameters->cblockh_init);
- tccp->cblksty = parameters->mode;
- tccp->qmfbid = parameters->irreversible ? 0 : 1;
- tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT;
- tccp->numgbits = 2;
- if (i == parameters->roi_compno) {
- tccp->roishift = parameters->roi_shift;
- } else {
- tccp->roishift = 0;
- }
-
- if(parameters->cp_cinema)
- {
- /*Precinct size for lowest frequency subband=128*/
- tccp->prcw[0] = 7;
- tccp->prch[0] = 7;
- /*Precinct size at all other resolutions = 256*/
- for (j = 1; j < tccp->numresolutions; j++) {
- tccp->prcw[j] = 8;
- tccp->prch[j] = 8;
- }
- }else{
- if (parameters->csty & J2K_CCP_CSTY_PRT) {
- int p = 0;
- for (j = tccp->numresolutions - 1; j >= 0; j--) {
- if (p < parameters->res_spec) {
-
- if (parameters->prcw_init[p] < 1) {
- tccp->prcw[j] = 1;
- } else {
- tccp->prcw[j] = int_floorlog2(parameters->prcw_init[p]);
- }
-
- if (parameters->prch_init[p] < 1) {
- tccp->prch[j] = 1;
- }else {
- tccp->prch[j] = int_floorlog2(parameters->prch_init[p]);
- }
-
- } else {
- int res_spec = parameters->res_spec;
- int size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));
- int size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1));
-
- if (size_prcw < 1) {
- tccp->prcw[j] = 1;
- } else {
- tccp->prcw[j] = int_floorlog2(size_prcw);
- }
-
- if (size_prch < 1) {
- tccp->prch[j] = 1;
- } else {
- tccp->prch[j] = int_floorlog2(size_prch);
- }
- }
- p++;
- /*printf("\nsize precinct for level %d : %d,%d\n", j,tccp->prcw[j], tccp->prch[j]); */
- } /*end for*/
- } else {
- for (j = 0; j < tccp->numresolutions; j++) {
- tccp->prcw[j] = 15;
- tccp->prch[j] = 15;
- }
- }
- }
-
- dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);
- }
- }
-}
-
-opj_bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
- int tileno, compno;
- opj_cp_t *cp = NULL;
-
- opj_tcd_t *tcd = NULL; /* TCD component */
-
- j2k->cio = cio;
- j2k->image = image;
-
- cp = j2k->cp;
-
- /* INDEX >> */
- j2k->cstr_info = cstr_info;
- if (cstr_info) {
- int compno;
- cstr_info->tile = (opj_tile_info_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tile_info_t));
- cstr_info->image_w = image->x1 - image->x0;
- cstr_info->image_h = image->y1 - image->y0;
- cstr_info->prog = (&cp->tcps[0])->prg;
- cstr_info->tw = cp->tw;
- cstr_info->th = cp->th;
- cstr_info->tile_x = cp->tdx; /* new version parser */
- cstr_info->tile_y = cp->tdy; /* new version parser */
- cstr_info->tile_Ox = cp->tx0; /* new version parser */
- cstr_info->tile_Oy = cp->ty0; /* new version parser */
- cstr_info->numcomps = image->numcomps;
- cstr_info->numlayers = (&cp->tcps[0])->numlayers;
- cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int));
- for (compno=0; compno < image->numcomps; compno++) {
- cstr_info->numdecompos[compno] = (&cp->tcps[0])->tccps->numresolutions - 1;
- }
- cstr_info->D_max = 0.0; /* ADD Marcela */
- cstr_info->main_head_start = cio_tell(cio); /* position of SOC */
- cstr_info->maxmarknum = 100;
- cstr_info->marker = (opj_marker_info_t *) opj_malloc(cstr_info->maxmarknum * sizeof(opj_marker_info_t));
- cstr_info->marknum = 0;
- }
- /* << INDEX */
-
- j2k_write_soc(j2k);
- j2k_write_siz(j2k);
- j2k_write_cod(j2k);
- j2k_write_qcd(j2k);
-
- if(cp->cinema){
- for (compno = 1; compno < image->numcomps; compno++) {
- j2k_write_coc(j2k, compno);
- j2k_write_qcc(j2k, compno);
- }
- }
-
- for (compno = 0; compno < image->numcomps; compno++) {
- opj_tcp_t *tcp = &cp->tcps[0];
- if (tcp->tccps[compno].roishift)
- j2k_write_rgn(j2k, compno, 0);
- }
- if (cp->comment != NULL) {
- j2k_write_com(j2k);
- }
-
- j2k->totnum_tp = j2k_calculate_tp(cp,image->numcomps,image,j2k);
- /* TLM Marker*/
- if(cp->cinema){
- j2k_write_tlm(j2k);
- if (cp->cinema == CINEMA4K_24) {
- j2k_write_poc(j2k);
- }
- }
-
- /* uncomment only for testing JPSEC marker writing */
- /* j2k_write_sec(j2k); */
-
- /* INDEX >> */
- if(cstr_info) {
- cstr_info->main_head_end = cio_tell(cio) - 1;
- }
- /* << INDEX */
- /**** Main Header ENDS here ***/
-
- /* create the tile encoder */
- tcd = tcd_create(j2k->cinfo);
-
- /* encode each tile */
- for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
- int pino;
- int tilepartno=0;
- /* UniPG>> */
- int acc_pack_num = 0;
- /* <<UniPG */
-
-
- opj_tcp_t *tcp = &cp->tcps[tileno];
- opj_event_msg(j2k->cinfo, EVT_INFO, "tile number %d / %d\n", tileno + 1, cp->tw * cp->th);
-
- j2k->curtileno = tileno;
- j2k->cur_tp_num = 0;
- tcd->cur_totnum_tp = j2k->cur_totnum_tp[j2k->curtileno];
- /* initialisation before tile encoding */
- if (tileno == 0) {
- tcd_malloc_encode(tcd, image, cp, j2k->curtileno);
- } else {
- tcd_init_encode(tcd, image, cp, j2k->curtileno);
- }
-
- /* INDEX >> */
- if(cstr_info) {
- cstr_info->tile[j2k->curtileno].start_pos = cio_tell(cio) + j2k->pos_correction;
- cstr_info->tile[j2k->curtileno].maxmarknum = 10;
- cstr_info->tile[j2k->curtileno].marker = (opj_marker_info_t *) opj_malloc(cstr_info->tile[j2k->curtileno].maxmarknum * sizeof(opj_marker_info_t));
- cstr_info->tile[j2k->curtileno].marknum = 0;
- }
- /* << INDEX */
-
- for(pino = 0; pino <= tcp->numpocs; pino++) {
- int tot_num_tp;
- tcd->cur_pino=pino;
-
- /*Get number of tile parts*/
- tot_num_tp = j2k_get_num_tp(cp,pino,tileno);
- tcd->tp_pos = cp->tp_pos;
-
- for(tilepartno = 0; tilepartno < tot_num_tp ; tilepartno++){
- j2k->tp_num = tilepartno;
- /* INDEX >> */
- if(cstr_info)
- cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pos =
- cio_tell(cio) + j2k->pos_correction;
- /* << INDEX */
- j2k_write_sot(j2k);
-
- if(j2k->cur_tp_num == 0 && cp->cinema == 0){
- for (compno = 1; compno < image->numcomps; compno++) {
- j2k_write_coc(j2k, compno);
- j2k_write_qcc(j2k, compno);
- }
- if (cp->tcps[tileno].numpocs) {
- j2k_write_poc(j2k);
- }
- }
-
- /* INDEX >> */
- if(cstr_info)
- cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header =
- cio_tell(cio) + j2k->pos_correction + 1;
- /* << INDEX */
-
- j2k_write_sod(j2k, tcd);
-
- /* INDEX >> */
- if(cstr_info) {
- cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_pos =
- cio_tell(cio) + j2k->pos_correction - 1;
- cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pack =
- acc_pack_num;
- cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_numpacks =
- cstr_info->packno - acc_pack_num;
- acc_pack_num = cstr_info->packno;
- }
- /* << INDEX */
-
- j2k->cur_tp_num++;
- }
- }
- if(cstr_info) {
- cstr_info->tile[j2k->curtileno].end_pos = cio_tell(cio) + j2k->pos_correction - 1;
- }
-
-
- /*
- if (tile->PPT) { // BAD PPT !!!
- FILE *PPT_file;
- int i;
- PPT_file=fopen("PPT","rb");
- fprintf(stderr,"%c%c%c%c",255,97,tile->len_ppt/256,tile->len_ppt%256);
- for (i=0;i<tile->len_ppt;i++) {
- unsigned char elmt;
- fread(&elmt, 1, 1, PPT_file);
- fwrite(&elmt,1,1,f);
- }
- fclose(PPT_file);
- unlink("PPT");
- }
- */
-
- }
-
- /* destroy the tile encoder */
- tcd_free_encode(tcd);
- tcd_destroy(tcd);
-
- opj_free(j2k->cur_totnum_tp);
-
- j2k_write_eoc(j2k);
-
- if(cstr_info) {
- cstr_info->codestream_size = cio_tell(cio) + j2k->pos_correction;
- /* UniPG>> */
- /* The following adjustment is done to adjust the codestream size */
- /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */
- /* the first bunch of bytes is not in the codestream */
- cstr_info->codestream_size -= cstr_info->main_head_start;
- /* <<UniPG */
- }
-
-#ifdef USE_JPWL
- /*
- preparation of JPWL marker segments
- */
- if(cp->epc_on) {
-
- /* encode according to JPWL */
- jpwl_encode(j2k, cio, image);
-
- }
-#endif /* USE_JPWL */
-
- return OPJ_TRUE;
-}
-
-static void j2k_add_mhmarker(opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len) {
-
- if (!cstr_info)
- return;
-
- /* expand the list? */
- if ((cstr_info->marknum + 1) > cstr_info->maxmarknum) {
- cstr_info->maxmarknum = 100 + (int) ((float) cstr_info->maxmarknum * 1.0F);
- cstr_info->marker = (opj_marker_info_t*)opj_realloc(cstr_info->marker, cstr_info->maxmarknum);
- }
-
- /* add the marker */
- cstr_info->marker[cstr_info->marknum].type = type;
- cstr_info->marker[cstr_info->marknum].pos = pos;
- cstr_info->marker[cstr_info->marknum].len = len;
- cstr_info->marknum++;
-
-}
-
-static void j2k_add_tlmarker( int tileno, opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len) {
-
- opj_marker_info_t *marker;
-
- if (!cstr_info)
- return;
-
- /* expand the list? */
- if ((cstr_info->tile[tileno].marknum + 1) > cstr_info->tile[tileno].maxmarknum) {
- cstr_info->tile[tileno].maxmarknum = 100 + (int) ((float) cstr_info->tile[tileno].maxmarknum * 1.0F);
- cstr_info->tile[tileno].marker = (opj_marker_info_t*)opj_realloc(cstr_info->tile[tileno].marker, cstr_info->maxmarknum);
- }
-
- marker = &(cstr_info->tile[tileno].marker[cstr_info->tile[tileno].marknum]);
-
- /* add the marker */
- marker->type = type;
- marker->pos = pos;
- marker->len = len;
- cstr_info->tile[tileno].marknum++;
-}
diff --git a/extern/libopenjpeg/j2k.h b/extern/libopenjpeg/j2k.h
deleted file mode 100644
index 6338c290dfd..00000000000
--- a/extern/libopenjpeg/j2k.h
+++ /dev/null
@@ -1,446 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2006-2007, Parvatha Elangovan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __J2K_H
-#define __J2K_H
-/**
-@file j2k.h
-@brief The JPEG-2000 Codestream Reader/Writer (J2K)
-
-The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data.
-*/
-
-/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
-/*@{*/
-
-#define J2K_CP_CSTY_PRT 0x01
-#define J2K_CP_CSTY_SOP 0x02
-#define J2K_CP_CSTY_EPH 0x04
-#define J2K_CCP_CSTY_PRT 0x01
-#define J2K_CCP_CBLKSTY_LAZY 0x01 /**< Selective arithmetic coding bypass */
-#define J2K_CCP_CBLKSTY_RESET 0x02 /**< Reset context probabilities on coding pass boundaries */
-#define J2K_CCP_CBLKSTY_TERMALL 0x04 /**< Termination on each coding pass */
-#define J2K_CCP_CBLKSTY_VSC 0x08 /**< Vertically stripe causal context */
-#define J2K_CCP_CBLKSTY_PTERM 0x10 /**< Predictable termination */
-#define J2K_CCP_CBLKSTY_SEGSYM 0x20 /**< Segmentation symbols are used */
-#define J2K_CCP_QNTSTY_NOQNT 0
-#define J2K_CCP_QNTSTY_SIQNT 1
-#define J2K_CCP_QNTSTY_SEQNT 2
-
-/* ----------------------------------------------------------------------- */
-
-#define J2K_MS_SOC 0xff4f /**< SOC marker value */
-#define J2K_MS_SOT 0xff90 /**< SOT marker value */
-#define J2K_MS_SOD 0xff93 /**< SOD marker value */
-#define J2K_MS_EOC 0xffd9 /**< EOC marker value */
-#define J2K_MS_SIZ 0xff51 /**< SIZ marker value */
-#define J2K_MS_COD 0xff52 /**< COD marker value */
-#define J2K_MS_COC 0xff53 /**< COC marker value */
-#define J2K_MS_RGN 0xff5e /**< RGN marker value */
-#define J2K_MS_QCD 0xff5c /**< QCD marker value */
-#define J2K_MS_QCC 0xff5d /**< QCC marker value */
-#define J2K_MS_POC 0xff5f /**< POC marker value */
-#define J2K_MS_TLM 0xff55 /**< TLM marker value */
-#define J2K_MS_PLM 0xff57 /**< PLM marker value */
-#define J2K_MS_PLT 0xff58 /**< PLT marker value */
-#define J2K_MS_PPM 0xff60 /**< PPM marker value */
-#define J2K_MS_PPT 0xff61 /**< PPT marker value */
-#define J2K_MS_SOP 0xff91 /**< SOP marker value */
-#define J2K_MS_EPH 0xff92 /**< EPH marker value */
-#define J2K_MS_CRG 0xff63 /**< CRG marker value */
-#define J2K_MS_COM 0xff64 /**< COM marker value */
-/* UniPG>> */
-#ifdef USE_JPWL
-#define J2K_MS_EPC 0xff68 /**< EPC marker value (Part 11: JPEG 2000 for Wireless) */
-#define J2K_MS_EPB 0xff66 /**< EPB marker value (Part 11: JPEG 2000 for Wireless) */
-#define J2K_MS_ESD 0xff67 /**< ESD marker value (Part 11: JPEG 2000 for Wireless) */
-#define J2K_MS_RED 0xff69 /**< RED marker value (Part 11: JPEG 2000 for Wireless) */
-#endif /* USE_JPWL */
-#ifdef USE_JPSEC
-#define J2K_MS_SEC 0xff65 /**< SEC marker value (Part 8: Secure JPEG 2000) */
-#define J2K_MS_INSEC 0xff94 /**< INSEC marker value (Part 8: Secure JPEG 2000) */
-#endif /* USE_JPSEC */
-/* <<UniPG */
-
-
-/* ----------------------------------------------------------------------- */
-
-/**
-Values that specify the status of the decoding process when decoding the main header.
-These values may be combined with a | operator.
-*/
-typedef enum J2K_STATUS {
- J2K_STATE_MHSOC = 0x0001, /**< a SOC marker is expected */
- J2K_STATE_MHSIZ = 0x0002, /**< a SIZ marker is expected */
- J2K_STATE_MH = 0x0004, /**< the decoding process is in the main header */
- J2K_STATE_TPHSOT = 0x0008, /**< the decoding process is in a tile part header and expects a SOT marker */
- J2K_STATE_TPH = 0x0010, /**< the decoding process is in a tile part header */
- J2K_STATE_MT = 0x0020, /**< the EOC marker has just been read */
- J2K_STATE_NEOC = 0x0040, /**< the decoding process must not expect a EOC marker because the codestream is truncated */
- J2K_STATE_ERR = 0x0080 /**< the decoding process has encountered an error */
-} J2K_STATUS;
-
-/* ----------------------------------------------------------------------- */
-
-/**
-T2 encoding mode
-*/
-typedef enum T2_MODE {
- THRESH_CALC = 0, /** Function called in Rate allocation process*/
- FINAL_PASS = 1 /** Function called in Tier 2 process*/
-}J2K_T2_MODE;
-
-/**
-Quantization stepsize
-*/
-typedef struct opj_stepsize {
- /** exponent */
- int expn;
- /** mantissa */
- int mant;
-} opj_stepsize_t;
-
-/**
-Tile-component coding parameters
-*/
-typedef struct opj_tccp {
- /** coding style */
- int csty;
- /** number of resolutions */
- int numresolutions;
- /** code-blocks width */
- int cblkw;
- /** code-blocks height */
- int cblkh;
- /** code-block coding style */
- int cblksty;
- /** discrete wavelet transform identifier */
- int qmfbid;
- /** quantisation style */
- int qntsty;
- /** stepsizes used for quantization */
- opj_stepsize_t stepsizes[J2K_MAXBANDS];
- /** number of guard bits */
- int numgbits;
- /** Region Of Interest shift */
- int roishift;
- /** precinct width */
- int prcw[J2K_MAXRLVLS];
- /** precinct height */
- int prch[J2K_MAXRLVLS];
-} opj_tccp_t;
-
-/**
-Tile coding parameters :
-this structure is used to store coding/decoding parameters common to all
-tiles (information like COD, COC in main header)
-*/
-typedef struct opj_tcp {
- /** 1 : first part-tile of a tile */
- int first;
- /** coding style */
- int csty;
- /** progression order */
- OPJ_PROG_ORDER prg;
- /** number of layers */
- int numlayers;
- /** multi-component transform identifier */
- int mct;
- /** rates of layers */
- float rates[100];
- /** number of progression order changes */
- int numpocs;
- /** indicates if a POC marker has been used O:NO, 1:YES */
- int POC;
- /** progression order changes */
- opj_poc_t pocs[32];
- /** packet header store there for futur use in t2_decode_packet */
- unsigned char *ppt_data;
- /** pointer remaining on the first byte of the first header if ppt is used */
- unsigned char *ppt_data_first;
- /** If ppt == 1 --> there was a PPT marker for the present tile */
- int ppt;
- /** used in case of multiple marker PPT (number of info already stored) */
- int ppt_store;
- /** ppmbug1 */
- int ppt_len;
- /** add fixed_quality */
- float distoratio[100];
- /** tile-component coding parameters */
- opj_tccp_t *tccps;
-} opj_tcp_t;
-
-/**
-Coding parameters
-*/
-typedef struct opj_cp {
- /** Digital cinema profile*/
- OPJ_CINEMA_MODE cinema;
- /** Maximum rate for each component. If == 0, component size limitation is not considered */
- int max_comp_size;
- /** Size of the image in bits*/
- int img_size;
- /** Rsiz*/
- OPJ_RSIZ_CAPABILITIES rsiz;
- /** Enabling Tile part generation*/
- char tp_on;
- /** Flag determining tile part generation*/
- char tp_flag;
- /** Position of tile part flag in progression order*/
- int tp_pos;
- /** allocation by rate/distortion */
- int disto_alloc;
- /** allocation by fixed layer */
- int fixed_alloc;
- /** add fixed_quality */
- int fixed_quality;
- /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
- int reduce;
- /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
- int layer;
- /** if == NO_LIMITATION, decode entire codestream; if == LIMIT_TO_MAIN_HEADER then only decode the main header */
- OPJ_LIMIT_DECODING limit_decoding;
- /** XTOsiz */
- int tx0;
- /** YTOsiz */
- int ty0;
- /** XTsiz */
- int tdx;
- /** YTsiz */
- int tdy;
- /** comment for coding */
- char *comment;
- /** number of tiles in width */
- int tw;
- /** number of tiles in heigth */
- int th;
- /** ID number of the tiles present in the codestream */
- int *tileno;
- /** size of the vector tileno */
- int tileno_size;
- /** packet header store there for futur use in t2_decode_packet */
- unsigned char *ppm_data;
- /** pointer remaining on the first byte of the first header if ppm is used */
- unsigned char *ppm_data_first;
- /** if ppm == 1 --> there was a PPM marker for the present tile */
- int ppm;
- /** use in case of multiple marker PPM (number of info already store) */
- int ppm_store;
- /** use in case of multiple marker PPM (case on non-finished previous info) */
- int ppm_previous;
- /** ppmbug1 */
- int ppm_len;
- /** tile coding parameters */
- opj_tcp_t *tcps;
- /** fixed layer */
- int *matrice;
-/* UniPG>> */
-#ifdef USE_JPWL
- /** enables writing of EPC in MH, thus activating JPWL */
- opj_bool epc_on;
- /** enables writing of EPB, in case of activated JPWL */
- opj_bool epb_on;
- /** enables writing of ESD, in case of activated JPWL */
- opj_bool esd_on;
- /** enables writing of informative techniques of ESD, in case of activated JPWL */
- opj_bool info_on;
- /** enables writing of RED, in case of activated JPWL */
- opj_bool red_on;
- /** error protection method for MH (0,1,16,32,37-128) */
- int hprot_MH;
- /** tile number of header protection specification (>=0) */
- int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
- /** error protection methods for TPHs (0,1,16,32,37-128) */
- int hprot_TPH[JPWL_MAX_NO_TILESPECS];
- /** tile number of packet protection specification (>=0) */
- int pprot_tileno[JPWL_MAX_NO_PACKSPECS];
- /** packet number of packet protection specification (>=0) */
- int pprot_packno[JPWL_MAX_NO_PACKSPECS];
- /** error protection methods for packets (0,1,16,32,37-128) */
- int pprot[JPWL_MAX_NO_PACKSPECS];
- /** enables writing of ESD, (0/2/4 bytes) */
- int sens_size;
- /** sensitivity addressing size (0=auto/2/4 bytes) */
- int sens_addr;
- /** sensitivity range (0-3) */
- int sens_range;
- /** sensitivity method for MH (-1,0-7) */
- int sens_MH;
- /** tile number of sensitivity specification (>=0) */
- int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
- /** sensitivity methods for TPHs (-1,0-7) */
- int sens_TPH[JPWL_MAX_NO_TILESPECS];
- /** enables JPWL correction at the decoder */
- opj_bool correct;
- /** expected number of components at the decoder */
- int exp_comps;
- /** maximum number of tiles at the decoder */
- int max_tiles;
-#endif /* USE_JPWL */
-/* <<UniPG */
-} opj_cp_t;
-
-/**
-JPEG-2000 codestream reader/writer
-*/
-typedef struct opj_j2k {
- /** codec context */
- opj_common_ptr cinfo;
-
- /** locate in which part of the codestream the decoder is (main header, tile header, end) */
- int state;
- /** number of the tile curently concern by coding/decoding */
- int curtileno;
- /** Tile part number*/
- int tp_num;
- /** Tilepart number currently coding*/
- int cur_tp_num;
- /** Total number of tileparts of the current tile*/
- int *cur_totnum_tp;
- /**
- locate the start position of the TLM marker
- after encoding the tilepart, a jump (in j2k_write_sod) is done to the TLM marker to store the value of its length.
- */
- int tlm_start;
- /** Total num of tile parts in whole image = num tiles* num tileparts in each tile*/
- /** used in TLMmarker*/
- int totnum_tp;
- /**
- locate the position of the end of the tile in the codestream,
- used to detect a truncated codestream (in j2k_read_sod)
- */
- unsigned char *eot;
- /**
- locate the start position of the SOT marker of the current coded tile:
- after encoding the tile, a jump (in j2k_write_sod) is done to the SOT marker to store the value of its length.
- */
- int sot_start;
- int sod_start;
- /**
- as the J2K-file is written in several parts during encoding,
- it enables to make the right correction in position return by cio_tell
- */
- int pos_correction;
- /** array used to store the data of each tile */
- unsigned char **tile_data;
- /** array used to store the length of each tile */
- int *tile_len;
- /**
- decompression only :
- store decoding parameters common to all tiles (information like COD, COC in main header)
- */
- opj_tcp_t *default_tcp;
- /** pointer to the encoded / decoded image */
- opj_image_t *image;
- /** pointer to the coding parameters */
- opj_cp_t *cp;
- /** helper used to write the index file */
- opj_codestream_info_t *cstr_info;
- /** pointer to the byte i/o stream */
- opj_cio_t *cio;
-} opj_j2k_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Creates a J2K decompression structure
-@param cinfo Codec context info
-@return Returns a handle to a J2K decompressor if successful, returns NULL otherwise
-*/
-opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo);
-/**
-Destroy a J2K decompressor handle
-@param j2k J2K decompressor handle to destroy
-*/
-void j2k_destroy_decompress(opj_j2k_t *j2k);
-/**
-Setup the decoder decoding parameters using user parameters.
-Decoding parameters are returned in j2k->cp.
-@param j2k J2K decompressor handle
-@param parameters decompression parameters
-*/
-void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);
-/**
-Decode an image from a JPEG-2000 codestream
-@param j2k J2K decompressor handle
-@param cio Input buffer stream
-@param cstr_info Codestream information structure if required, NULL otherwise
-@return Returns a decoded image if successful, returns NULL otherwise
-*/
-opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info);
-/**
-Decode an image form a JPT-stream (JPEG 2000, JPIP)
-@param j2k J2K decompressor handle
-@param cio Input buffer stream
-@param cstr_info Codestream information structure if required, NULL otherwise
-@return Returns a decoded image if successful, returns NULL otherwise
-*/
-opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info);
-/**
-Creates a J2K compression structure
-@param cinfo Codec context info
-@return Returns a handle to a J2K compressor if successful, returns NULL otherwise
-*/
-opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo);
-/**
-Destroy a J2K compressor handle
-@param j2k J2K compressor handle to destroy
-*/
-void j2k_destroy_compress(opj_j2k_t *j2k);
-/**
-Setup the encoder parameters using the current image and using user parameters.
-Coding parameters are returned in j2k->cp.
-@param j2k J2K compressor handle
-@param parameters compression parameters
-@param image input filled image
-*/
-void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image);
-/**
-Converts an enum type progression order to string type
-*/
-char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order);
-/**
-Encode an image into a JPEG-2000 codestream
-@param j2k J2K compressor handle
-@param cio Output buffer stream
-@param image Image to encode
-@param cstr_info Codestream information structure if required, NULL otherwise
-@return Returns true if successful, returns false otherwise
-*/
-opj_bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __J2K_H */
diff --git a/extern/libopenjpeg/j2k_lib.c b/extern/libopenjpeg/j2k_lib.c
deleted file mode 100644
index a66e31e9afb..00000000000
--- a/extern/libopenjpeg/j2k_lib.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifdef _WIN32
-#include <windows.h>
-#else
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/times.h>
-#endif /* _WIN32 */
-#include "opj_includes.h"
-
-double opj_clock(void) {
-#ifdef _WIN32
- /* _WIN32: use QueryPerformance (very accurate) */
- LARGE_INTEGER freq , t ;
- /* freq is the clock speed of the CPU */
- QueryPerformanceFrequency(&freq) ;
- /* cout << "freq = " << ((double) freq.QuadPart) << endl; */
- /* t is the high resolution performance counter (see MSDN) */
- QueryPerformanceCounter ( & t ) ;
- return ( t.QuadPart /(double) freq.QuadPart ) ;
-#else
- /* Unix or Linux: use resource usage */
- struct rusage t;
- double procTime;
- /* (1) Get the rusage data structure at this moment (man getrusage) */
- getrusage(0,&t);
- /* (2) What is the elapsed time ? - CPU time = User time + System time */
- /* (2a) Get the seconds */
- procTime = t.ru_utime.tv_sec + t.ru_stime.tv_sec;
- /* (2b) More precisely! Get the microseconds part ! */
- return ( procTime + (t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ;
-#endif
-}
-
diff --git a/extern/libopenjpeg/j2k_lib.h b/extern/libopenjpeg/j2k_lib.h
deleted file mode 100644
index 5f3406e5106..00000000000
--- a/extern/libopenjpeg/j2k_lib.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __J2K_LIB_H
-#define __J2K_LIB_H
-/**
-@file j2k_lib.h
-@brief Internal functions
-
-The functions in J2K_LIB.C are internal utilities mainly used for timing.
-*/
-
-/** @defgroup MISC MISC - Miscellaneous internal functions */
-/*@{*/
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-
-/**
-Difference in successive opj_clock() calls tells you the elapsed time
-@return Returns time in seconds
-*/
-double opj_clock(void);
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __J2K_LIB_H */
-
diff --git a/extern/libopenjpeg/jp2.c b/extern/libopenjpeg/jp2.c
deleted file mode 100644
index d3322603c8b..00000000000
--- a/extern/libopenjpeg/jp2.c
+++ /dev/null
@@ -1,1325 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2010-2011, Kaori Hagihara
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#include "opj_includes.h"
-#include <assert.h>
-
-/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-/**
-Read box headers
-@param cinfo Codec context info
-@param cio Input stream
-@param box
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box);
-/*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/
-/**
-Read the IHDR box - Image Header box
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio);
-static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio);
-static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio);
-static opj_bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio);
-static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio);
-/**
-Write the FTYP box - File type box
-@param jp2 JP2 handle
-@param cio Output buffer stream
-*/
-static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio);
-/**
-Read the FTYP box - File type box
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio);
-static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
-static opj_bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset);
-static void jp2_write_jp(opj_cio_t *cio);
-/**
-Read the JP box - JPEG 2000 signature
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio);
-/**
-Decode the structure of a JP2 file
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@param color Collector for profile, cdef and pclr data
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_color_t *color);
-/**
-Apply collected palette data
-@param color Collector for profile, cdef and pclr data
-@param image
-*/
-static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image, opj_common_ptr cinfo);
-/**
-Collect palette data
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@param box
-@param color Collector for profile, cdef and pclr data
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, opj_jp2_color_t *color);
-/**
-Collect component mapping data
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@param box
-@param color Collector for profile, cdef and pclr data
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, opj_jp2_color_t *color);
-/**
-Collect colour specification data
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@param box
-@param color Collector for profile, cdef and pclr data
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, opj_jp2_color_t *color);
-/**
-Write file Index (superbox)
-@param[in] offset_jp2c offset of jp2c box
-@param[in] length_jp2c length of jp2c box
-@param[in] offset_idx offset of cidx box
-@param[in] length_idx length of cidx box
-@param[in] cio file output handle
-@return length of fidx box
-*/
-static int write_fidx( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio);
-/**
-Write index Finder box
-@param[in] offset offset of fidx box
-@param[in] length length of fidx box
-@param[in] cio file output handle
-*/
-static void write_iptr( int offset, int length, opj_cio_t *cio);
-/**
-Write proxy box
-@param[in] offset_jp2c offset of jp2c box
-@param[in] length_jp2c length of jp2c box
-@param[in] offset_idx offset of cidx box
-@param[in] length_idx length of cidx box
-@param[in] cio file output handle
-*/
-static void write_prxy( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio);
-/*@}*/
-
-/*@}*/
-
-/* ----------------------------------------------------------------------- */
-
-static opj_bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box) {
- box->init_pos = cio_tell(cio);
- box->length = cio_read(cio, 4);
- box->type = cio_read(cio, 4);
- if (box->length == 1) {
- if (cio_read(cio, 4) != 0) {
- opj_event_msg(cinfo, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n");
- return OPJ_FALSE;
- }
- box->length = cio_read(cio, 4);
- if (box->length == 0)
- box->length = cio_numbytesleft(cio) + 12;
- }
- else if (box->length == 0) {
- box->length = cio_numbytesleft(cio) + 8;
- } else if (box->length < 0) {
- opj_event_msg(cinfo, EVT_ERROR, "Integer overflow in box->length\n");
- return OPJ_FALSE; /* TODO: actually check jp2_read_boxhdr's return value */
- }
-
- return OPJ_TRUE;
-}
-
-#if 0
-static void jp2_write_url(opj_cio_t *cio, char *Idx_file) {
- unsigned int i;
- opj_jp2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_URL, 4); /* DBTL */
- cio_write(cio, 0, 1); /* VERS */
- cio_write(cio, 0, 3); /* FLAG */
-
- if(Idx_file) {
- for (i = 0; i < strlen(Idx_file); i++) {
- cio_write(cio, Idx_file[i], 1);
- }
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-#endif
-
-static opj_bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) {
- opj_jp2_box_t box;
-
- opj_common_ptr cinfo = jp2->cinfo;
-
- if(jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) {
- opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n");
- return OPJ_FALSE;
- }
- if (JP2_IHDR != box.type) {
- opj_event_msg(cinfo, EVT_ERROR, "Expected IHDR Marker\n");
- return OPJ_FALSE;
- }
-
- jp2->h = cio_read(cio, 4); /* HEIGHT */
- jp2->w = cio_read(cio, 4); /* WIDTH */
- jp2->numcomps = cio_read(cio, 2); /* NC */
- jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
-
- jp2->bpc = cio_read(cio, 1); /* BPC */
-
- jp2->C = cio_read(cio, 1); /* C */
- jp2->UnkC = cio_read(cio, 1); /* UnkC */
- jp2->IPR = cio_read(cio, 1); /* IPR */
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cinfo, EVT_ERROR, "Error with IHDR Box\n");
- return OPJ_FALSE;
- }
-
- return OPJ_TRUE;
-}
-
-static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) {
- opj_jp2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_IHDR, 4); /* IHDR */
-
- cio_write(cio, jp2->h, 4); /* HEIGHT */
- cio_write(cio, jp2->w, 4); /* WIDTH */
- cio_write(cio, jp2->numcomps, 2); /* NC */
-
- cio_write(cio, jp2->bpc, 1); /* BPC */
-
- cio_write(cio, jp2->C, 1); /* C : Always 7 */
- cio_write(cio, jp2->UnkC, 1); /* UnkC, colorspace unknown */
- cio_write(cio, jp2->IPR, 1); /* IPR, no intellectual property */
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) {
- unsigned int i;
- opj_jp2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_BPCC, 4); /* BPCC */
-
- for (i = 0; i < jp2->numcomps; i++) {
- cio_write(cio, jp2->comps[i].bpcc, 1);
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-
-static opj_bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) {
- unsigned int i;
- opj_jp2_box_t box;
-
- opj_common_ptr cinfo = jp2->cinfo;
-
- if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) {
- opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n");
- return OPJ_FALSE;
- }
- if (JP2_BPCC != box.type) {
- opj_event_msg(cinfo, EVT_ERROR, "Expected BPCC Marker\n");
- return OPJ_FALSE;
- }
-
- for (i = 0; i < jp2->numcomps; i++) {
- jp2->comps[i].bpcc = cio_read(cio, 1);
- }
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cinfo, EVT_ERROR, "Error with BPCC Box\n");
- return OPJ_FALSE;
- }
-
- return OPJ_TRUE;
-}
-
-static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio) {
- opj_jp2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_COLR, 4); /* COLR */
-
- cio_write(cio, jp2->meth, 1); /* METH */
- cio_write(cio, jp2->precedence, 1); /* PRECEDENCE */
- cio_write(cio, jp2->approx, 1); /* APPROX */
-
- if(jp2->meth == 2)
- jp2->enumcs = 0;
-
- cio_write(cio, jp2->enumcs, 4); /* EnumCS */
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-static void jp2_free_pclr(opj_jp2_color_t *color)
-{
- opj_free(color->jp2_pclr->channel_sign);
- opj_free(color->jp2_pclr->channel_size);
- opj_free(color->jp2_pclr->entries);
-
- if(color->jp2_pclr->cmap) opj_free(color->jp2_pclr->cmap);
-
- opj_free(color->jp2_pclr); color->jp2_pclr = NULL;
-}
-
-static void free_color_data(opj_jp2_color_t *color)
-{
- if(color->jp2_pclr)
- {
- jp2_free_pclr(color);
- }
- if(color->jp2_cdef)
- {
- if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info);
- opj_free(color->jp2_cdef);
- }
- if(color->icc_profile_buf) opj_free(color->icc_profile_buf);
-}
-
-static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image, opj_common_ptr cinfo)
-{
- opj_image_comp_t *old_comps, *new_comps;
- unsigned char *channel_size, *channel_sign;
- unsigned int *entries;
- opj_jp2_cmap_comp_t *cmap;
- int *src, *dst;
- unsigned int j, max;
- unsigned short i, nr_channels, cmp, pcol;
- int k, top_k;
-
- channel_size = color->jp2_pclr->channel_size;
- channel_sign = color->jp2_pclr->channel_sign;
- entries = color->jp2_pclr->entries;
- cmap = color->jp2_pclr->cmap;
- nr_channels = color->jp2_pclr->nr_channels;
-
- old_comps = image->comps;
- new_comps = (opj_image_comp_t*)
- opj_malloc(nr_channels * sizeof(opj_image_comp_t));
-
- for(i = 0; i < nr_channels; ++i)
- {
- pcol = cmap[i].pcol; cmp = cmap[i].cmp;
-
- if( pcol < nr_channels )
- new_comps[pcol] = old_comps[cmp];
- else
- {
- opj_event_msg(cinfo, EVT_ERROR, "Error with pcol value %d (max: %d). skipping\n", pcol, nr_channels);
- continue;
- }
-
- if(cmap[i].mtyp == 0) /* Direct use */
- {
- old_comps[cmp].data = NULL; continue;
- }
-/* Palette mapping: */
- new_comps[pcol].data = (int*)
- opj_malloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(int));
- new_comps[pcol].prec = channel_size[i];
- new_comps[pcol].sgnd = channel_sign[i];
- }
- top_k = color->jp2_pclr->nr_entries - 1;
-
- for(i = 0; i < nr_channels; ++i)
- {
-/* Direct use: */
- if(cmap[i].mtyp == 0) continue;
-
-/* Palette mapping: */
- cmp = cmap[i].cmp; pcol = cmap[i].pcol;
- src = old_comps[cmp].data;
- dst = new_comps[pcol].data;
- max = new_comps[pcol].w * new_comps[pcol].h;
-
- for(j = 0; j < max; ++j)
- {
-/* The index */
- if((k = src[j]) < 0) k = 0; else if(k > top_k) k = top_k;
-/* The colour */
- dst[j] = entries[k * nr_channels + pcol];
- }
- }
- max = image->numcomps;
- for(i = 0; i < max; ++i)
- {
- if(old_comps[i].data) opj_free(old_comps[i].data);
- }
- opj_free(old_comps);
- image->comps = new_comps;
- image->numcomps = nr_channels;
-
- jp2_free_pclr(color);
-
-}/* apply_pclr() */
-
-static opj_bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, opj_jp2_color_t *color)
-{
- opj_jp2_pclr_t *jp2_pclr;
- unsigned char *channel_size, *channel_sign;
- unsigned int *entries;
- unsigned short nr_entries, nr_channels;
- unsigned short i, j;
- unsigned char uc;
-
- OPJ_ARG_NOT_USED(box);
- OPJ_ARG_NOT_USED(jp2);
-
-/* Part 1, I.5.3.4: 'There shall be at most one Palette box inside
- * a JP2 Header box' :
-*/
- if(color->jp2_pclr) return OPJ_FALSE;
-
- nr_entries = (unsigned short)cio_read(cio, 2); /* NE */
- nr_channels = (unsigned short)cio_read(cio, 1);/* NPC */
-
- entries = (unsigned int*)
- opj_malloc(nr_channels * nr_entries * sizeof(unsigned int));
- channel_size = (unsigned char*)opj_malloc(nr_channels);
- channel_sign = (unsigned char*)opj_malloc(nr_channels);
-
- jp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t));
- jp2_pclr->channel_sign = channel_sign;
- jp2_pclr->channel_size = channel_size;
- jp2_pclr->entries = entries;
- jp2_pclr->nr_entries = nr_entries;
- jp2_pclr->nr_channels = nr_channels;
- jp2_pclr->cmap = NULL;
-
- color->jp2_pclr = jp2_pclr;
-
- for(i = 0; i < nr_channels; ++i)
- {
- uc = cio_read(cio, 1); /* Bi */
- channel_size[i] = (uc & 0x7f) + 1;
- channel_sign[i] = (uc & 0x80)?1:0;
- }
-
- for(j = 0; j < nr_entries; ++j)
- {
- for(i = 0; i < nr_channels; ++i)
- {
-/* Cji */
- *entries++ = cio_read(cio, (channel_size[i]+7)>>3);
- }
- }
-
- return OPJ_TRUE;
-}/* jp2_read_pclr() */
-
-static opj_bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, opj_jp2_color_t *color)
-{
- opj_jp2_cmap_comp_t *cmap;
- unsigned short i, nr_channels;
-
- OPJ_ARG_NOT_USED(box);
- OPJ_ARG_NOT_USED(jp2);
-
-/* Need nr_channels: */
- if(color->jp2_pclr == NULL) return OPJ_FALSE;
-
-/* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box
- * inside a JP2 Header box' :
-*/
- if(color->jp2_pclr->cmap) return OPJ_FALSE;
-
- nr_channels = color->jp2_pclr->nr_channels;
- cmap = (opj_jp2_cmap_comp_t*)
- opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t));
-
- for(i = 0; i < nr_channels; ++i)
- {
- cmap[i].cmp = (unsigned short)cio_read(cio, 2);
- cmap[i].mtyp = cio_read(cio, 1);
- cmap[i].pcol = cio_read(cio, 1);
-
- }
- color->jp2_pclr->cmap = cmap;
-
- return OPJ_TRUE;
-}/* jp2_read_cmap() */
-
-static void jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color)
-{
- opj_jp2_cdef_info_t *info;
- unsigned short i, n, cn, typ, asoc, acn;
-
- info = color->jp2_cdef->info;
- n = color->jp2_cdef->n;
-
- for(i = 0; i < n; ++i)
- {
-/* WATCH: acn = asoc - 1 ! */
- if((asoc = info[i].asoc) == 0) continue;
-
- cn = info[i].cn; typ = info[i].typ; acn = asoc - 1;
- (void)typ;
-
- if(cn != acn)
- {
- opj_image_comp_t saved;
-
- memcpy(&saved, &image->comps[cn], sizeof(opj_image_comp_t));
- memcpy(&image->comps[cn], &image->comps[acn], sizeof(opj_image_comp_t));
- memcpy(&image->comps[acn], &saved, sizeof(opj_image_comp_t));
-
- info[i].asoc = cn + 1;
- info[acn].asoc = info[acn].cn + 1;
- }
- }
- if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info);
-
- opj_free(color->jp2_cdef); color->jp2_cdef = NULL;
-
-}/* jp2_apply_cdef() */
-
-static opj_bool jp2_read_cdef(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, opj_jp2_color_t *color)
-{
- opj_jp2_cdef_info_t *info;
- unsigned short i, n;
-
- OPJ_ARG_NOT_USED(box);
- OPJ_ARG_NOT_USED(jp2);
-
-/* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box
- * inside a JP2 Header box.'
-*/
- if(color->jp2_cdef) return OPJ_FALSE;
-
- if((n = (unsigned short)cio_read(cio, 2)) == 0) return OPJ_FALSE; /* szukw000: FIXME */
-
- info = (opj_jp2_cdef_info_t*)
- opj_malloc(n * sizeof(opj_jp2_cdef_info_t));
-
- color->jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
- color->jp2_cdef->info = info;
- color->jp2_cdef->n = n;
-
- for(i = 0; i < n; ++i)
- {
- info[i].cn = (unsigned short)cio_read(cio, 2);
- info[i].typ = (unsigned short)cio_read(cio, 2);
- info[i].asoc = (unsigned short)cio_read(cio, 2);
-
- }
- return OPJ_TRUE;
-}/* jp2_read_cdef() */
-
-static opj_bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, opj_jp2_color_t *color)
-{
- int skip_len;
- opj_common_ptr cinfo;
-
-/* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour
- * Specification boxes after the first.'
-*/
- if(color->jp2_has_colr) return OPJ_FALSE;
-
- cinfo = jp2->cinfo;
-
- jp2->meth = cio_read(cio, 1); /* METH */
- jp2->precedence = cio_read(cio, 1); /* PRECEDENCE */
- jp2->approx = cio_read(cio, 1); /* APPROX */
-
- if (jp2->meth == 1)
- {
- jp2->enumcs = cio_read(cio, 4); /* EnumCS */
- }
- else
- if (jp2->meth == 2)
- {
-/* skip PROFILE */
- skip_len = box->init_pos + box->length - cio_tell(cio);
- if (skip_len < 0)
- {
- opj_event_msg(cinfo, EVT_ERROR, "Error with COLR box size\n");
- return OPJ_FALSE;
- }
- if(skip_len > 0)
- {
- unsigned char *start;
-
- start = cio_getbp(cio);
- color->icc_profile_buf = (unsigned char*)opj_malloc(skip_len);
- color->icc_profile_len = skip_len;
-
- cio_skip(cio, box->init_pos + box->length - cio_tell(cio));
-
- memcpy(color->icc_profile_buf, start, skip_len);
- }
- }
-
- if (cio_tell(cio) - box->init_pos != box->length)
- {
- opj_event_msg(cinfo, EVT_ERROR, "Error with COLR Box\n");
- return OPJ_FALSE;
- }
- color->jp2_has_colr = 1;
-
- return OPJ_TRUE;
-}/* jp2_read_colr() */
-
-opj_bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color)
-{
- opj_jp2_box_t box;
- int jp2h_end;
-
- opj_common_ptr cinfo = jp2->cinfo;
-
- if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE;
- do {
- if (JP2_JP2H != box.type)
- {
- if (box.type == JP2_JP2C)
- {
- opj_event_msg(cinfo, EVT_ERROR, "Expected JP2H Marker\n");
- return OPJ_FALSE;
- }
- if (box.length <= 8) return OPJ_FALSE;
- cio_skip(cio, box.length - 8);
-
- if(cio->bp >= cio->end) return OPJ_FALSE;
-
- if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE;
- }
- } while(JP2_JP2H != box.type);
-
- if (!jp2_read_ihdr(jp2, cio))
- return OPJ_FALSE;
- jp2h_end = box.init_pos + box.length;
-
- if (jp2->bpc == 255)
- {
- if (!jp2_read_bpcc(jp2, cio))
- return OPJ_FALSE;
- }
- if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE;
-
- while(cio_tell(cio) < jp2h_end)
- {
- if(box.type == JP2_COLR)
- {
- if( !jp2_read_colr(jp2, cio, &box, color))
- {
- if (box.length <= 8) return OPJ_FALSE;
- cio_seek(cio, box.init_pos + 8);
- cio_skip(cio, box.length - 8);
- }
- if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE;
- continue;
- }
- if(box.type == JP2_CDEF && !jp2->ignore_pclr_cmap_cdef)
- {
- if( !jp2_read_cdef(jp2, cio, &box, color))
- {
- if (box.length <= 8) return OPJ_FALSE;
- cio_seek(cio, box.init_pos + 8);
- cio_skip(cio, box.length - 8);
- }
- if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE;
- continue;
- }
- if(box.type == JP2_PCLR && !jp2->ignore_pclr_cmap_cdef)
- {
- if( !jp2_read_pclr(jp2, cio, &box, color))
- {
- if (box.length <= 8) return OPJ_FALSE;
- cio_seek(cio, box.init_pos + 8);
- cio_skip(cio, box.length - 8);
- }
- if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE;
- continue;
- }
- if(box.type == JP2_CMAP && !jp2->ignore_pclr_cmap_cdef)
- {
- if( !jp2_read_cmap(jp2, cio, &box, color))
- {
- if (box.length <= 8) return OPJ_FALSE;
- cio_seek(cio, box.init_pos + 8);
- cio_skip(cio, box.length - 8);
- }
- if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE;
- continue;
- }
- if (box.length <= 8) return OPJ_FALSE;
- cio_seek(cio, box.init_pos + 8);
- cio_skip(cio, box.length - 8);
- if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE;
-
- }/* while(cio_tell(cio) < box_end) */
-
- cio_seek(cio, jp2h_end);
-
- /* Part 1, I.5.3.3 : 'must contain at least one' */
- return (color->jp2_has_colr == 1);
-
-}/* jp2_read_jp2h() */
-
-static opj_bool opj_jp2_check_color(opj_image_t *image, opj_jp2_color_t *color, opj_common_ptr cinfo)
-{
- int i;
-
- /* testcase 4149.pdf.SIGSEGV.cf7.3501 */
- if (color->jp2_cdef) {
- opj_jp2_cdef_info_t *info = color->jp2_cdef->info;
- int n = color->jp2_cdef->n;
-
- for (i = 0; i < n; i++) {
- if (info[i].cn >= image->numcomps) {
- opj_event_msg(cinfo, EVT_ERROR, "Invalid component index %d (>= %d).\n", info[i].cn, image->numcomps);
- return OPJ_FALSE;
- }
- if (info[i].asoc > 0 && (info[i].asoc - 1) >= image->numcomps) {
- opj_event_msg(cinfo, EVT_ERROR, "Invalid component index %d (>= %d).\n", info[i].asoc - 1, image->numcomps);
- return OPJ_FALSE;
- }
- }
- }
-
- /* testcases 451.pdf.SIGSEGV.f4c.3723, 451.pdf.SIGSEGV.5b5.3723 and
- 66ea31acbb0f23a2bbc91f64d69a03f5_signal_sigsegv_13937c0_7030_5725.pdf */
- if (color->jp2_pclr && color->jp2_pclr->cmap) {
- int nr_channels = color->jp2_pclr->nr_channels;
- opj_jp2_cmap_comp_t *cmap = color->jp2_pclr->cmap;
- opj_bool *pcol_usage, is_sane = OPJ_TRUE;
-
- /* verify that all original components match an existing one */
- for (i = 0; i < nr_channels; i++) {
- if (cmap[i].cmp >= image->numcomps) {
- opj_event_msg(cinfo, EVT_ERROR, "Invalid component index %d (>= %d).\n", cmap[i].cmp, image->numcomps);
- is_sane = OPJ_FALSE;
- }
- }
-
- pcol_usage = opj_calloc(nr_channels, sizeof(opj_bool));
- if (!pcol_usage) {
- opj_event_msg(cinfo, EVT_ERROR, "Unexpected OOM.\n");
- return OPJ_FALSE;
- }
- /* verify that no component is targeted more than once */
- for (i = 0; i < nr_channels; i++) {
- int pcol = cmap[i].pcol;
- assert(cmap[i].mtyp == 0 || cmap[i].mtyp == 1);
- if (pcol >= nr_channels) {
- opj_event_msg(cinfo, EVT_ERROR, "Invalid component/palette index for direct mapping %d.\n", pcol);
- is_sane = OPJ_FALSE;
- }
- else if (pcol_usage[pcol] && cmap[i].mtyp == 1) {
- opj_event_msg(cinfo, EVT_ERROR, "Component %d is mapped twice.\n", pcol);
- is_sane = OPJ_FALSE;
- }
- else if (cmap[i].mtyp == 0 && cmap[i].pcol != 0) {
- /* I.5.3.5 PCOL: If the value of the MTYP field for this channel is 0, then
- * the value of this field shall be 0. */
- opj_event_msg(cinfo, EVT_ERROR, "Direct use at #%d however pcol=%d.\n", i, pcol);
- is_sane = OPJ_FALSE;
- }
- else
- pcol_usage[pcol] = OPJ_TRUE;
- }
- /* verify that all components are targeted at least once */
- for (i = 0; i < nr_channels; i++) {
- if (!pcol_usage[i] && cmap[i].mtyp != 0) {
- opj_event_msg(cinfo, EVT_ERROR, "Component %d doesn't have a mapping.\n", i);
- is_sane = OPJ_FALSE;
- }
- }
- opj_free(pcol_usage);
- if (!is_sane) {
- return OPJ_FALSE;
- }
- }
-
- return OPJ_TRUE;
-}
-
-opj_image_t* opj_jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_codestream_info_t *cstr_info)
-{
- opj_common_ptr cinfo;
- opj_image_t *image = NULL;
- opj_jp2_color_t color;
-
- if(!jp2 || !cio)
- {
- return NULL;
- }
- memset(&color, 0, sizeof(opj_jp2_color_t));
- cinfo = jp2->cinfo;
-
-/* JP2 decoding */
- if(!jp2_read_struct(jp2, cio, &color))
- {
- free_color_data(&color);
- opj_event_msg(cinfo, EVT_ERROR, "Failed to decode jp2 structure\n");
- return NULL;
- }
-
-/* J2K decoding */
- image = j2k_decode(jp2->j2k, cio, cstr_info);
-
- if(!image)
- {
- free_color_data(&color);
- opj_event_msg(cinfo, EVT_ERROR, "Failed to decode J2K image\n");
- return NULL;
- }
-
- if (!jp2->ignore_pclr_cmap_cdef){
- if (!opj_jp2_check_color(image, &color, cinfo)) {
- opj_event_msg(cinfo, EVT_ERROR, "Failed to decode PCRL box\n");
- return NULL;
- }
-
- /* Set Image Color Space */
- if (jp2->enumcs == 16)
- image->color_space = CLRSPC_SRGB;
- else if (jp2->enumcs == 17)
- image->color_space = CLRSPC_GRAY;
- else if (jp2->enumcs == 18)
- image->color_space = CLRSPC_SYCC;
- else
- image->color_space = CLRSPC_UNKNOWN;
-
- if(color.jp2_cdef)
- {
- jp2_apply_cdef(image, &color);
- }
- if(color.jp2_pclr)
- {
-/* Part 1, I.5.3.4: Either both or none : */
- if( !color.jp2_pclr->cmap)
- jp2_free_pclr(&color);
- else
- jp2_apply_pclr(&color, image, cinfo);
- }
- if(color.icc_profile_buf)
- {
- image->icc_profile_buf = color.icc_profile_buf;
- color.icc_profile_buf = NULL;
- image->icc_profile_len = color.icc_profile_len;
- }
- }
-
- return image;
-
-}/* opj_jp2_decode() */
-
-
-void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) {
- opj_jp2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_JP2H, 4); /* JP2H */
-
- jp2_write_ihdr(jp2, cio);
-
- if (jp2->bpc == 255) {
- jp2_write_bpcc(jp2, cio);
- }
- jp2_write_colr(jp2, cio);
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) {
- unsigned int i;
- opj_jp2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_FTYP, 4); /* FTYP */
-
- cio_write(cio, jp2->brand, 4); /* BR */
- cio_write(cio, jp2->minversion, 4); /* MinV */
-
- for (i = 0; i < jp2->numcl; i++) {
- cio_write(cio, jp2->cl[i], 4); /* CL */
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-static opj_bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) {
- int i;
- opj_jp2_box_t box;
-
- opj_common_ptr cinfo = jp2->cinfo;
-
- if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) {
- opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n");
- return OPJ_FALSE;
- }
- if (JP2_FTYP != box.type) {
- opj_event_msg(cinfo, EVT_ERROR, "Expected FTYP Marker\n");
- return OPJ_FALSE;
- }
-
- jp2->brand = cio_read(cio, 4); /* BR */
- jp2->minversion = cio_read(cio, 4); /* MinV */
- jp2->numcl = (box.length - 16) / 4;
-
- /* edf_c2_1673169.jp2 */
- if (cio_numbytesleft(cio) < ((int)jp2->numcl * 4)) {
- opj_event_msg(cinfo, EVT_ERROR, "Not enough bytes in FTYP Box "
- "(expected %d, but only %d left)\n",
- ((int)jp2->numcl * 4), cio_numbytesleft(cio));
- return OPJ_FALSE;
- }
- jp2->cl = (unsigned int *) opj_malloc(jp2->numcl * sizeof(unsigned int));
-
- for (i = 0; i < (int)jp2->numcl; i++) {
- jp2->cl[i] = cio_read(cio, 4); /* CLi */
- }
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cinfo, EVT_ERROR, "Error with FTYP Box\n");
- return OPJ_FALSE;
- }
-
- return OPJ_TRUE;
-}
-
-static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
- unsigned int j2k_codestream_offset, j2k_codestream_length;
- opj_jp2_box_t box;
-
- opj_j2k_t *j2k = jp2->j2k;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_JP2C, 4); /* JP2C */
-
- /* J2K encoding */
- j2k_codestream_offset = cio_tell(cio);
- if(!j2k_encode(j2k, cio, image, cstr_info)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Failed to encode image\n");
- return 0;
- }
- j2k_codestream_length = cio_tell(cio) - j2k_codestream_offset;
-
- jp2->j2k_codestream_offset = j2k_codestream_offset;
- jp2->j2k_codestream_length = j2k_codestream_length;
-
- box.length = 8 + jp2->j2k_codestream_length;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-
- return box.length;
-}
-
-static opj_bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset) {
- opj_jp2_box_t box;
-
- opj_common_ptr cinfo = jp2->cinfo;
-
- if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) {
- opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n");
- return OPJ_FALSE;
- }
- do {
- if(JP2_JP2C != box.type) {
- if (box.length <= 8) return OPJ_FALSE;
- cio_skip(cio, box.length - 8);
- if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE;
- }
- } while(JP2_JP2C != box.type);
-
- *j2k_codestream_offset = cio_tell(cio);
- if (box.length <= 8) return OPJ_FALSE;
- *j2k_codestream_length = box.length - 8;
-
- return OPJ_TRUE;
-}
-
-static void jp2_write_jp(opj_cio_t *cio) {
- opj_jp2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_JP, 4); /* JP2 signature */
- cio_write(cio, 0x0d0a870a, 4);
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-static opj_bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio) {
- opj_jp2_box_t box;
-
- opj_common_ptr cinfo = jp2->cinfo;
-
- if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) {
- opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n");
- return OPJ_FALSE;
- }
- if (JP2_JP != box.type) {
- opj_event_msg(cinfo, EVT_ERROR, "Expected JP Marker\n");
- return OPJ_FALSE;
- }
- if (0x0d0a870a != cio_read(cio, 4)) {
- opj_event_msg(cinfo, EVT_ERROR, "Error with JP Marker\n");
- return OPJ_FALSE;
- }
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cinfo, EVT_ERROR, "Error with JP Box size\n");
- return OPJ_FALSE;
- }
-
- return OPJ_TRUE;
-}
-
-
-static opj_bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_color_t *color) {
- if (!jp2_read_jp(jp2, cio))
- return OPJ_FALSE;
- if (!jp2_read_ftyp(jp2, cio))
- return OPJ_FALSE;
- if (!jp2_read_jp2h(jp2, cio, color))
- return OPJ_FALSE;
- if (!jp2_read_jp2c(jp2, cio, &jp2->j2k_codestream_length, &jp2->j2k_codestream_offset))
- return OPJ_FALSE;
-
- return OPJ_TRUE;
-}
-
-
-static int write_fidx( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio)
-{
- int len, lenp;
-
- lenp = cio_tell( cio);
- cio_skip( cio, 4); /* L [at the end] */
- cio_write( cio, JPIP_FIDX, 4); /* IPTR */
-
- write_prxy( offset_jp2c, length_jp2c, offset_idx, length_idx, cio);
-
- len = cio_tell( cio)-lenp;
- cio_seek( cio, lenp);
- cio_write( cio, len, 4); /* L */
- cio_seek( cio, lenp+len);
-
- return len;
-}
-
-static void write_prxy( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio)
-{
- int len, lenp;
-
- lenp = cio_tell( cio);
- cio_skip( cio, 4); /* L [at the end] */
- cio_write( cio, JPIP_PRXY, 4); /* IPTR */
-
- cio_write( cio, offset_jp2c, 8); /* OOFF */
- cio_write( cio, length_jp2c, 4); /* OBH part 1 */
- cio_write( cio, JP2_JP2C, 4); /* OBH part 2 */
-
- cio_write( cio, 1,1); /* NI */
-
- cio_write( cio, offset_idx, 8); /* IOFF */
- cio_write( cio, length_idx, 4); /* IBH part 1 */
- cio_write( cio, JPIP_CIDX, 4); /* IBH part 2 */
-
- len = cio_tell( cio)-lenp;
- cio_seek( cio, lenp);
- cio_write( cio, len, 4); /* L */
- cio_seek( cio, lenp+len);
-}
-
-static void write_iptr( int offset, int length, opj_cio_t *cio)
-{
- int len, lenp;
-
- lenp = cio_tell( cio);
- cio_skip( cio, 4); /* L [at the end] */
- cio_write( cio, JPIP_IPTR, 4); /* IPTR */
-
- cio_write( cio, offset, 8);
- cio_write( cio, length, 8);
-
- len = cio_tell( cio)-lenp;
- cio_seek( cio, lenp);
- cio_write( cio, len, 4); /* L */
- cio_seek( cio, lenp+len);
-}
-
-
-/* ----------------------------------------------------------------------- */
-/* JP2 decoder interface */
-/* ----------------------------------------------------------------------- */
-
-opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo) {
- opj_jp2_t *jp2 = (opj_jp2_t*) opj_calloc(1, sizeof(opj_jp2_t));
- if(jp2) {
- jp2->cinfo = cinfo;
- /* create the J2K codec */
- jp2->j2k = j2k_create_decompress(cinfo);
- if(jp2->j2k == NULL) {
- jp2_destroy_decompress(jp2);
- return NULL;
- }
- }
- return jp2;
-}
-
-void jp2_destroy_decompress(opj_jp2_t *jp2) {
- if(jp2) {
- /* destroy the J2K codec */
- j2k_destroy_decompress(jp2->j2k);
-
- if(jp2->comps) {
- opj_free(jp2->comps);
- }
- if(jp2->cl) {
- opj_free(jp2->cl);
- }
- opj_free(jp2);
- }
-}
-
-void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters) {
- /* setup the J2K codec */
- j2k_setup_decoder(jp2->j2k, parameters);
- /* further JP2 initializations go here */
- jp2->ignore_pclr_cmap_cdef = parameters->flags & OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
-}
-
-/* ----------------------------------------------------------------------- */
-/* JP2 encoder interface */
-/* ----------------------------------------------------------------------- */
-
-opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo) {
- opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t));
- if(jp2) {
- memset(jp2, 0, sizeof(opj_jp2_t));
- jp2->cinfo = cinfo;
- /* create the J2K codec */
- jp2->j2k = j2k_create_compress(cinfo);
- if(jp2->j2k == NULL) {
- jp2_destroy_compress(jp2);
- return NULL;
- }
- }
- return jp2;
-}
-
-void jp2_destroy_compress(opj_jp2_t *jp2) {
- if(jp2) {
- /* destroy the J2K codec */
- j2k_destroy_compress(jp2->j2k);
-
- if(jp2->comps) {
- opj_free(jp2->comps);
- }
- if(jp2->cl) {
- opj_free(jp2->cl);
- }
- opj_free(jp2);
- }
-}
-
-void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image) {
- int i;
- int depth_0, sign;
-
- if(!jp2 || !parameters || !image)
- return;
-
- /* setup the J2K codec */
- /* ------------------- */
-
- /* Check if number of components respects standard */
- if (image->numcomps < 1 || image->numcomps > 16384) {
- opj_event_msg(jp2->cinfo, EVT_ERROR, "Invalid number of components specified while setting up JP2 encoder\n");
- return;
- }
-
- j2k_setup_encoder(jp2->j2k, parameters, image);
-
- /* setup the JP2 codec */
- /* ------------------- */
-
- /* Profile box */
-
- jp2->brand = JP2_JP2; /* BR */
- jp2->minversion = 0; /* MinV */
- jp2->numcl = 1;
- jp2->cl = (unsigned int*) opj_malloc(jp2->numcl * sizeof(unsigned int));
- jp2->cl[0] = JP2_JP2; /* CL0 : JP2 */
-
- /* Image Header box */
-
- jp2->numcomps = image->numcomps; /* NC */
- jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
- jp2->h = image->y1 - image->y0; /* HEIGHT */
- jp2->w = image->x1 - image->x0; /* WIDTH */
- /* BPC */
- depth_0 = image->comps[0].prec - 1;
- sign = image->comps[0].sgnd;
- jp2->bpc = depth_0 + (sign << 7);
- for (i = 1; i < image->numcomps; i++) {
- int depth = image->comps[i].prec - 1;
- sign = image->comps[i].sgnd;
- if (depth_0 != depth)
- jp2->bpc = 255;
- }
- jp2->C = 7; /* C : Always 7 */
- jp2->UnkC = 0; /* UnkC, colorspace specified in colr box */
- jp2->IPR = 0; /* IPR, no intellectual property */
-
- /* BitsPerComponent box */
-
- for (i = 0; i < image->numcomps; i++) {
- jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7);
- }
- jp2->meth = 1;
- if (image->color_space == 1)
- jp2->enumcs = 16; /* sRGB as defined by IEC 61966-2.1 */
- else if (image->color_space == 2)
- jp2->enumcs = 17; /* greyscale */
- else if (image->color_space == 3)
- jp2->enumcs = 18; /* YUV */
- jp2->precedence = 0; /* PRECEDENCE */
- jp2->approx = 0; /* APPROX */
-
- jp2->jpip_on = parameters->jpip_on;
-}
-
-opj_bool opj_jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
-
- int pos_iptr, pos_cidx, pos_jp2c, len_jp2c, len_cidx, end_pos, pos_fidx, len_fidx;
- pos_jp2c = pos_iptr = -1; /* remove a warning */
-
- /* JP2 encoding */
-
- /* JPEG 2000 Signature box */
- jp2_write_jp(cio);
- /* File Type box */
- jp2_write_ftyp(jp2, cio);
- /* JP2 Header box */
- jp2_write_jp2h(jp2, cio);
-
- if( jp2->jpip_on){
- pos_iptr = cio_tell( cio);
- cio_skip( cio, 24); /* IPTR further ! */
-
- pos_jp2c = cio_tell( cio);
- }
-
- /* J2K encoding */
- if(!(len_jp2c = jp2_write_jp2c( jp2, cio, image, cstr_info))){
- opj_event_msg(jp2->cinfo, EVT_ERROR, "Failed to encode image\n");
- return OPJ_FALSE;
- }
-
- if( jp2->jpip_on){
- pos_cidx = cio_tell( cio);
-
- len_cidx = write_cidx( pos_jp2c+8, cio, image, *cstr_info, len_jp2c-8);
-
- pos_fidx = cio_tell( cio);
- len_fidx = write_fidx( pos_jp2c, len_jp2c, pos_cidx, len_cidx, cio);
-
- end_pos = cio_tell( cio);
-
- cio_seek( cio, pos_iptr);
- write_iptr( pos_fidx, len_fidx, cio);
-
- cio_seek( cio, end_pos);
- }
-
- return OPJ_TRUE;
-}
diff --git a/extern/libopenjpeg/jp2.h b/extern/libopenjpeg/jp2.h
deleted file mode 100644
index acb643cad77..00000000000
--- a/extern/libopenjpeg/jp2.h
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __JP2_H
-#define __JP2_H
-/**
-@file jp2.h
-@brief The JPEG-2000 file format Reader/Writer (JP2)
-
-*/
-
-/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
-/*@{*/
-
-#define JPIP_JPIP 0x6a706970
-
-#define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */
-#define JP2_FTYP 0x66747970 /**< File type box */
-#define JP2_JP2H 0x6a703268 /**< JP2 header box */
-#define JP2_IHDR 0x69686472 /**< Image header box */
-#define JP2_COLR 0x636f6c72 /**< Colour specification box */
-#define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */
-#define JP2_URL 0x75726c20 /**< URL box */
-#define JP2_DTBL 0x6474626c /**< Data Reference box */
-#define JP2_BPCC 0x62706363 /**< Bits per component box */
-#define JP2_JP2 0x6a703220 /**< File type fields */
-#define JP2_PCLR 0x70636c72 /**< Palette box */
-#define JP2_CMAP 0x636d6170 /**< Component Mapping box */
-#define JP2_CDEF 0x63646566 /**< Channel Definition box */
-
-/* ----------------------------------------------------------------------- */
-/**
-Channel description: channel index, type, assocation
-*/
-typedef struct opj_jp2_cdef_info
-{
- unsigned short cn, typ, asoc;
-} opj_jp2_cdef_info_t;
-
-/**
-Channel descriptions and number of descriptions
-*/
-typedef struct opj_jp2_cdef
-{
- opj_jp2_cdef_info_t *info;
- unsigned short n;
-} opj_jp2_cdef_t;
-
-/**
-Component mappings: channel index, mapping type, palette index
-*/
-typedef struct opj_jp2_cmap_comp
-{
- unsigned short cmp;
- unsigned char mtyp, pcol;
-} opj_jp2_cmap_comp_t;
-
-/**
-Palette data: table entries, palette columns
-*/
-typedef struct opj_jp2_pclr
-{
- unsigned int *entries;
- unsigned char *channel_sign;
- unsigned char *channel_size;
- opj_jp2_cmap_comp_t *cmap;
- unsigned short nr_entries, nr_channels;
-} opj_jp2_pclr_t;
-
-/**
-Collector for ICC profile, palette, component mapping, channel description
-*/
-typedef struct opj_jp2_color
-{
- unsigned char *icc_profile_buf;
- int icc_profile_len;
-
- opj_jp2_cdef_t *jp2_cdef;
- opj_jp2_pclr_t *jp2_pclr;
- unsigned char jp2_has_colr;
-} opj_jp2_color_t;
-
-/**
-JP2 component
-*/
-typedef struct opj_jp2_comps {
- int depth;
- int sgnd;
- int bpcc;
-} opj_jp2_comps_t;
-
-/**
-JPEG-2000 file format reader/writer
-*/
-typedef struct opj_jp2 {
- /** codec context */
- opj_common_ptr cinfo;
- /** handle to the J2K codec */
- opj_j2k_t *j2k;
- unsigned int w;
- unsigned int h;
- unsigned int numcomps;
- unsigned int bpc;
- unsigned int C;
- unsigned int UnkC;
- unsigned int IPR;
- unsigned int meth;
- unsigned int approx;
- unsigned int enumcs;
- unsigned int precedence;
- unsigned int brand;
- unsigned int minversion;
- unsigned int numcl;
- unsigned int *cl;
- opj_jp2_comps_t *comps;
- unsigned int j2k_codestream_offset;
- unsigned int j2k_codestream_length;
- opj_bool jpip_on;
- opj_bool ignore_pclr_cmap_cdef;
-} opj_jp2_t;
-
-/**
-JP2 Box
-*/
-typedef struct opj_jp2_box {
- int length;
- int type;
- int init_pos;
-} opj_jp2_box_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Write the JP2H box - JP2 Header box (used in MJ2)
-@param jp2 JP2 handle
-@param cio Output buffer stream
-*/
-void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio);
-/**
-Read the JP2H box - JP2 Header box (used in MJ2)
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@param ext Collector for profile, cdef and pclr data
-@return Returns true if successful, returns false otherwise
-*/
-opj_bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color);
-/**
-Creates a JP2 decompression structure
-@param cinfo Codec context info
-@return Returns a handle to a JP2 decompressor if successful, returns NULL otherwise
-*/
-opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo);
-/**
-Destroy a JP2 decompressor handle
-@param jp2 JP2 decompressor handle to destroy
-*/
-void jp2_destroy_decompress(opj_jp2_t *jp2);
-/**
-Setup the decoder decoding parameters using user parameters.
-Decoding parameters are returned in jp2->j2k->cp.
-@param jp2 JP2 decompressor handle
-@param parameters decompression parameters
-*/
-void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters);
-/**
-Decode an image from a JPEG-2000 file stream
-@param jp2 JP2 decompressor handle
-@param cio Input buffer stream
-@param cstr_info Codestream information structure if required, NULL otherwise
-@return Returns a decoded image if successful, returns NULL otherwise
-*/
-opj_image_t* opj_jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, opj_codestream_info_t *cstr_info);
-/**
-Creates a JP2 compression structure
-@param cinfo Codec context info
-@return Returns a handle to a JP2 compressor if successful, returns NULL otherwise
-*/
-opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo);
-/**
-Destroy a JP2 compressor handle
-@param jp2 JP2 compressor handle to destroy
-*/
-void jp2_destroy_compress(opj_jp2_t *jp2);
-/**
-Setup the encoder parameters using the current image and using user parameters.
-Coding parameters are returned in jp2->j2k->cp.
-@param jp2 JP2 compressor handle
-@param parameters compression parameters
-@param image input filled image
-*/
-void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image);
-/**
-Encode an image into a JPEG-2000 file stream
-@param jp2 JP2 compressor handle
-@param cio Output buffer stream
-@param image Image to encode
-@param cstr_info Codestream information structure if required, NULL otherwise
-@return Returns true if successful, returns false otherwise
-*/
-opj_bool opj_jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __JP2_H */
-
diff --git a/extern/libopenjpeg/jpt.c b/extern/libopenjpeg/jpt.c
deleted file mode 100644
index a2566ea8872..00000000000
--- a/extern/libopenjpeg/jpt.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "opj_includes.h"
-
-/*
- * Read the information contains in VBAS [JPP/JPT stream message header]
- * Store information (7 bits) in value
- *
- */
-unsigned int jpt_read_VBAS_info(opj_cio_t *cio, unsigned int value) {
- unsigned char elmt;
-
- elmt = cio_read(cio, 1);
- while ((elmt >> 7) == 1) {
- value = (value << 7);
- value |= (elmt & 0x7f);
- elmt = cio_read(cio, 1);
- }
- value = (value << 7);
- value |= (elmt & 0x7f);
-
- return value;
-}
-
-/*
- * Initialize the value of the message header structure
- *
- */
-void jpt_init_msg_header(opj_jpt_msg_header_t * header) {
- header->Id = 0; /* In-class Identifier */
- header->last_byte = 0; /* Last byte information */
- header->Class_Id = 0; /* Class Identifier */
- header->CSn_Id = 0; /* CSn : index identifier */
- header->Msg_offset = 0; /* Message offset */
- header->Msg_length = 0; /* Message length */
- header->Layer_nb = 0; /* Auxiliary for JPP case */
-}
-
-/*
- * Re-initialize the value of the message header structure
- *
- * Only parameters always present in message header
- *
- */
-void jpt_reinit_msg_header(opj_jpt_msg_header_t * header) {
- header->Id = 0; /* In-class Identifier */
- header->last_byte = 0; /* Last byte information */
- header->Msg_offset = 0; /* Message offset */
- header->Msg_length = 0; /* Message length */
-}
-
-/*
- * Read the message header for a JPP/JPT - stream
- *
- */
-void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header) {
- unsigned char elmt, Class = 0, CSn = 0;
- jpt_reinit_msg_header(header);
-
- /* ------------- */
- /* VBAS : Bin-ID */
- /* ------------- */
- elmt = cio_read(cio, 1);
-
- /* See for Class and CSn */
- switch ((elmt >> 5) & 0x03) {
- case 0:
- opj_event_msg(cinfo, EVT_ERROR, "Forbidden value encounter in message header !!\n");
- break;
- case 1:
- Class = 0;
- CSn = 0;
- break;
- case 2:
- Class = 1;
- CSn = 0;
- break;
- case 3:
- Class = 1;
- CSn = 1;
- break;
- default:
- break;
- }
-
- /* see information on bits 'c' [p 10 : A.2.1 general, ISO/IEC FCD 15444-9] */
- if (((elmt >> 4) & 0x01) == 1)
- header->last_byte = 1;
-
- /* In-class identifier */
- header->Id |= (elmt & 0x0f);
- if ((elmt >> 7) == 1)
- header->Id = jpt_read_VBAS_info(cio, header->Id);
-
- /* ------------ */
- /* VBAS : Class */
- /* ------------ */
- if (Class == 1) {
- header->Class_Id = 0;
- header->Class_Id = jpt_read_VBAS_info(cio, header->Class_Id);
- }
-
- /* ---------- */
- /* VBAS : CSn */
- /* ---------- */
- if (CSn == 1) {
- header->CSn_Id = 0;
- header->CSn_Id = jpt_read_VBAS_info(cio, header->CSn_Id);
- }
-
- /* ----------------- */
- /* VBAS : Msg_offset */
- /* ----------------- */
- header->Msg_offset = jpt_read_VBAS_info(cio, header->Msg_offset);
-
- /* ----------------- */
- /* VBAS : Msg_length */
- /* ----------------- */
- header->Msg_length = jpt_read_VBAS_info(cio, header->Msg_length);
-
- /* ---------- */
- /* VBAS : Aux */
- /* ---------- */
- if ((header->Class_Id & 0x01) == 1) {
- header->Layer_nb = 0;
- header->Layer_nb = jpt_read_VBAS_info(cio, header->Layer_nb);
- }
-}
diff --git a/extern/libopenjpeg/jpt.h b/extern/libopenjpeg/jpt.h
deleted file mode 100644
index eb01f98eb85..00000000000
--- a/extern/libopenjpeg/jpt.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __JPT_H
-#define __JPT_H
-/**
-@file jpt.h
-@brief JPT-stream reader (JPEG 2000, JPIP)
-
-JPT-stream functions are implemented in J2K.C.
-*/
-
-/**
-Message Header JPT stream structure
-*/
-typedef struct opj_jpt_msg_header {
- /** In-class Identifier */
- unsigned int Id;
- /** Last byte information */
- unsigned int last_byte;
- /** Class Identifier */
- unsigned int Class_Id;
- /** CSn : index identifier */
- unsigned int CSn_Id;
- /** Message offset */
- unsigned int Msg_offset;
- /** Message length */
- unsigned int Msg_length;
- /** Auxiliary for JPP case */
- unsigned int Layer_nb;
-} opj_jpt_msg_header_t;
-
-/* ----------------------------------------------------------------------- */
-
-/**
-Initialize the value of the message header structure
-@param header Message header structure
-*/
-void jpt_init_msg_header(opj_jpt_msg_header_t * header);
-
-/**
-Read the message header for a JPP/JPT - stream
-@param cinfo Codec context info
-@param cio CIO handle
-@param header Message header structure
-*/
-void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header);
-
-#endif
diff --git a/extern/libopenjpeg/license.txt b/extern/libopenjpeg/license.txt
deleted file mode 100644
index d1e5b6a5333..00000000000
--- a/extern/libopenjpeg/license.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */ \ No newline at end of file
diff --git a/extern/libopenjpeg/mct.c b/extern/libopenjpeg/mct.c
deleted file mode 100644
index 870993b06d2..00000000000
--- a/extern/libopenjpeg/mct.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifdef __SSE__
-#include <xmmintrin.h>
-#endif
-
-#include "opj_includes.h"
-
-/* <summary> */
-/* This table contains the norms of the basis function of the reversible MCT. */
-/* </summary> */
-static const double mct_norms[3] = { 1.732, .8292, .8292 };
-
-/* <summary> */
-/* This table contains the norms of the basis function of the irreversible MCT. */
-/* </summary> */
-static const double mct_norms_real[3] = { 1.732, 1.805, 1.573 };
-
-/* <summary> */
-/* Foward reversible MCT. */
-/* </summary> */
-void mct_encode(
- int* restrict c0,
- int* restrict c1,
- int* restrict c2,
- int n)
-{
- int i;
- for(i = 0; i < n; ++i) {
- int r = c0[i];
- int g = c1[i];
- int b = c2[i];
- int y = (r + (g * 2) + b) >> 2;
- int u = b - g;
- int v = r - g;
- c0[i] = y;
- c1[i] = u;
- c2[i] = v;
- }
-}
-
-/* <summary> */
-/* Inverse reversible MCT. */
-/* </summary> */
-void mct_decode(
- int* restrict c0,
- int* restrict c1,
- int* restrict c2,
- int n)
-{
- int i;
- for (i = 0; i < n; ++i) {
- int y = c0[i];
- int u = c1[i];
- int v = c2[i];
- int g = y - ((u + v) >> 2);
- int r = v + g;
- int b = u + g;
- c0[i] = r;
- c1[i] = g;
- c2[i] = b;
- }
-}
-
-/* <summary> */
-/* Get norm of basis function of reversible MCT. */
-/* </summary> */
-double mct_getnorm(int compno) {
- return mct_norms[compno];
-}
-
-/* <summary> */
-/* Foward irreversible MCT. */
-/* </summary> */
-void mct_encode_real(
- int* restrict c0,
- int* restrict c1,
- int* restrict c2,
- int n)
-{
- int i;
- for(i = 0; i < n; ++i) {
- int r = c0[i];
- int g = c1[i];
- int b = c2[i];
- int y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934);
- int u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096);
- int v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666);
- c0[i] = y;
- c1[i] = u;
- c2[i] = v;
- }
-}
-
-/* <summary> */
-/* Inverse irreversible MCT. */
-/* </summary> */
-void mct_decode_real(
- float* restrict c0,
- float* restrict c1,
- float* restrict c2,
- int n)
-{
- int i;
-#ifdef __SSE__
- __m128 vrv, vgu, vgv, vbu;
- vrv = _mm_set1_ps(1.402f);
- vgu = _mm_set1_ps(0.34413f);
- vgv = _mm_set1_ps(0.71414f);
- vbu = _mm_set1_ps(1.772f);
- for (i = 0; i < (n >> 3); ++i) {
- __m128 vy, vu, vv;
- __m128 vr, vg, vb;
-
- vy = _mm_load_ps(c0);
- vu = _mm_load_ps(c1);
- vv = _mm_load_ps(c2);
- vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
- vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
- vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
- _mm_store_ps(c0, vr);
- _mm_store_ps(c1, vg);
- _mm_store_ps(c2, vb);
- c0 += 4;
- c1 += 4;
- c2 += 4;
-
- vy = _mm_load_ps(c0);
- vu = _mm_load_ps(c1);
- vv = _mm_load_ps(c2);
- vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
- vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
- vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
- _mm_store_ps(c0, vr);
- _mm_store_ps(c1, vg);
- _mm_store_ps(c2, vb);
- c0 += 4;
- c1 += 4;
- c2 += 4;
- }
- n &= 7;
-#endif
- for(i = 0; i < n; ++i) {
- float y = c0[i];
- float u = c1[i];
- float v = c2[i];
- float r = y + (v * 1.402f);
- float g = y - (u * 0.34413f) - (v * (0.71414f));
- float b = y + (u * 1.772f);
- c0[i] = r;
- c1[i] = g;
- c2[i] = b;
- }
-}
-
-/* <summary> */
-/* Get norm of basis function of irreversible MCT. */
-/* </summary> */
-double mct_getnorm_real(int compno) {
- return mct_norms_real[compno];
-}
diff --git a/extern/libopenjpeg/mct.h b/extern/libopenjpeg/mct.h
deleted file mode 100644
index 84e3f8add19..00000000000
--- a/extern/libopenjpeg/mct.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __MCT_H
-#define __MCT_H
-/**
-@file mct.h
-@brief Implementation of a multi-component transforms (MCT)
-
-The functions in MCT.C have for goal to realize reversible and irreversible multicomponent
-transform. The functions in MCT.C are used by some function in TCD.C.
-*/
-
-/** @defgroup MCT MCT - Implementation of a multi-component transform */
-/*@{*/
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Apply a reversible multi-component transform to an image
-@param c0 Samples for red component
-@param c1 Samples for green component
-@param c2 Samples blue component
-@param n Number of samples for each component
-*/
-void mct_encode(int *c0, int *c1, int *c2, int n);
-/**
-Apply a reversible multi-component inverse transform to an image
-@param c0 Samples for luminance component
-@param c1 Samples for red chrominance component
-@param c2 Samples for blue chrominance component
-@param n Number of samples for each component
-*/
-void mct_decode(int *c0, int *c1, int *c2, int n);
-/**
-Get norm of the basis function used for the reversible multi-component transform
-@param compno Number of the component (0->Y, 1->U, 2->V)
-@return
-*/
-double mct_getnorm(int compno);
-
-/**
-Apply an irreversible multi-component transform to an image
-@param c0 Samples for red component
-@param c1 Samples for green component
-@param c2 Samples blue component
-@param n Number of samples for each component
-*/
-void mct_encode_real(int *c0, int *c1, int *c2, int n);
-/**
-Apply an irreversible multi-component inverse transform to an image
-@param c0 Samples for luminance component
-@param c1 Samples for red chrominance component
-@param c2 Samples for blue chrominance component
-@param n Number of samples for each component
-*/
-void mct_decode_real(float* c0, float* c1, float* c2, int n);
-/**
-Get norm of the basis function used for the irreversible multi-component transform
-@param compno Number of the component (0->Y, 1->U, 2->V)
-@return
-*/
-double mct_getnorm_real(int compno);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __MCT_H */
diff --git a/extern/libopenjpeg/mqc.c b/extern/libopenjpeg/mqc.c
deleted file mode 100644
index 14129fbf4e5..00000000000
--- a/extern/libopenjpeg/mqc.c
+++ /dev/null
@@ -1,592 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "opj_includes.h"
-
-/** @defgroup MQC MQC - Implementation of an MQ-Coder */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-/**
-Output a byte, doing bit-stuffing if necessary.
-After a 0xff byte, the next byte must be smaller than 0x90.
-@param mqc MQC handle
-*/
-static void mqc_byteout(opj_mqc_t *mqc);
-/**
-Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000
-@param mqc MQC handle
-*/
-static void mqc_renorme(opj_mqc_t *mqc);
-/**
-Encode the most probable symbol
-@param mqc MQC handle
-*/
-static void mqc_codemps(opj_mqc_t *mqc);
-/**
-Encode the most least symbol
-@param mqc MQC handle
-*/
-static void mqc_codelps(opj_mqc_t *mqc);
-/**
-Fill mqc->c with 1's for flushing
-@param mqc MQC handle
-*/
-static void mqc_setbits(opj_mqc_t *mqc);
-/**
-FIXME: documentation ???
-@param mqc MQC handle
-@return
-*/
-static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc);
-/**
-FIXME: documentation ???
-@param mqc MQC handle
-@return
-*/
-static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc);
-/**
-Input a byte
-@param mqc MQC handle
-*/
-static INLINE void mqc_bytein(opj_mqc_t *const mqc);
-/**
-Renormalize mqc->a and mqc->c while decoding
-@param mqc MQC handle
-*/
-static INLINE void mqc_renormd(opj_mqc_t *const mqc);
-/*@}*/
-
-/*@}*/
-
-/* <summary> */
-/* This array defines all the possible states for a context. */
-/* </summary> */
-static opj_mqc_state_t mqc_states[47 * 2] = {
- {0x5601, 0, &mqc_states[2], &mqc_states[3]},
- {0x5601, 1, &mqc_states[3], &mqc_states[2]},
- {0x3401, 0, &mqc_states[4], &mqc_states[12]},
- {0x3401, 1, &mqc_states[5], &mqc_states[13]},
- {0x1801, 0, &mqc_states[6], &mqc_states[18]},
- {0x1801, 1, &mqc_states[7], &mqc_states[19]},
- {0x0ac1, 0, &mqc_states[8], &mqc_states[24]},
- {0x0ac1, 1, &mqc_states[9], &mqc_states[25]},
- {0x0521, 0, &mqc_states[10], &mqc_states[58]},
- {0x0521, 1, &mqc_states[11], &mqc_states[59]},
- {0x0221, 0, &mqc_states[76], &mqc_states[66]},
- {0x0221, 1, &mqc_states[77], &mqc_states[67]},
- {0x5601, 0, &mqc_states[14], &mqc_states[13]},
- {0x5601, 1, &mqc_states[15], &mqc_states[12]},
- {0x5401, 0, &mqc_states[16], &mqc_states[28]},
- {0x5401, 1, &mqc_states[17], &mqc_states[29]},
- {0x4801, 0, &mqc_states[18], &mqc_states[28]},
- {0x4801, 1, &mqc_states[19], &mqc_states[29]},
- {0x3801, 0, &mqc_states[20], &mqc_states[28]},
- {0x3801, 1, &mqc_states[21], &mqc_states[29]},
- {0x3001, 0, &mqc_states[22], &mqc_states[34]},
- {0x3001, 1, &mqc_states[23], &mqc_states[35]},
- {0x2401, 0, &mqc_states[24], &mqc_states[36]},
- {0x2401, 1, &mqc_states[25], &mqc_states[37]},
- {0x1c01, 0, &mqc_states[26], &mqc_states[40]},
- {0x1c01, 1, &mqc_states[27], &mqc_states[41]},
- {0x1601, 0, &mqc_states[58], &mqc_states[42]},
- {0x1601, 1, &mqc_states[59], &mqc_states[43]},
- {0x5601, 0, &mqc_states[30], &mqc_states[29]},
- {0x5601, 1, &mqc_states[31], &mqc_states[28]},
- {0x5401, 0, &mqc_states[32], &mqc_states[28]},
- {0x5401, 1, &mqc_states[33], &mqc_states[29]},
- {0x5101, 0, &mqc_states[34], &mqc_states[30]},
- {0x5101, 1, &mqc_states[35], &mqc_states[31]},
- {0x4801, 0, &mqc_states[36], &mqc_states[32]},
- {0x4801, 1, &mqc_states[37], &mqc_states[33]},
- {0x3801, 0, &mqc_states[38], &mqc_states[34]},
- {0x3801, 1, &mqc_states[39], &mqc_states[35]},
- {0x3401, 0, &mqc_states[40], &mqc_states[36]},
- {0x3401, 1, &mqc_states[41], &mqc_states[37]},
- {0x3001, 0, &mqc_states[42], &mqc_states[38]},
- {0x3001, 1, &mqc_states[43], &mqc_states[39]},
- {0x2801, 0, &mqc_states[44], &mqc_states[38]},
- {0x2801, 1, &mqc_states[45], &mqc_states[39]},
- {0x2401, 0, &mqc_states[46], &mqc_states[40]},
- {0x2401, 1, &mqc_states[47], &mqc_states[41]},
- {0x2201, 0, &mqc_states[48], &mqc_states[42]},
- {0x2201, 1, &mqc_states[49], &mqc_states[43]},
- {0x1c01, 0, &mqc_states[50], &mqc_states[44]},
- {0x1c01, 1, &mqc_states[51], &mqc_states[45]},
- {0x1801, 0, &mqc_states[52], &mqc_states[46]},
- {0x1801, 1, &mqc_states[53], &mqc_states[47]},
- {0x1601, 0, &mqc_states[54], &mqc_states[48]},
- {0x1601, 1, &mqc_states[55], &mqc_states[49]},
- {0x1401, 0, &mqc_states[56], &mqc_states[50]},
- {0x1401, 1, &mqc_states[57], &mqc_states[51]},
- {0x1201, 0, &mqc_states[58], &mqc_states[52]},
- {0x1201, 1, &mqc_states[59], &mqc_states[53]},
- {0x1101, 0, &mqc_states[60], &mqc_states[54]},
- {0x1101, 1, &mqc_states[61], &mqc_states[55]},
- {0x0ac1, 0, &mqc_states[62], &mqc_states[56]},
- {0x0ac1, 1, &mqc_states[63], &mqc_states[57]},
- {0x09c1, 0, &mqc_states[64], &mqc_states[58]},
- {0x09c1, 1, &mqc_states[65], &mqc_states[59]},
- {0x08a1, 0, &mqc_states[66], &mqc_states[60]},
- {0x08a1, 1, &mqc_states[67], &mqc_states[61]},
- {0x0521, 0, &mqc_states[68], &mqc_states[62]},
- {0x0521, 1, &mqc_states[69], &mqc_states[63]},
- {0x0441, 0, &mqc_states[70], &mqc_states[64]},
- {0x0441, 1, &mqc_states[71], &mqc_states[65]},
- {0x02a1, 0, &mqc_states[72], &mqc_states[66]},
- {0x02a1, 1, &mqc_states[73], &mqc_states[67]},
- {0x0221, 0, &mqc_states[74], &mqc_states[68]},
- {0x0221, 1, &mqc_states[75], &mqc_states[69]},
- {0x0141, 0, &mqc_states[76], &mqc_states[70]},
- {0x0141, 1, &mqc_states[77], &mqc_states[71]},
- {0x0111, 0, &mqc_states[78], &mqc_states[72]},
- {0x0111, 1, &mqc_states[79], &mqc_states[73]},
- {0x0085, 0, &mqc_states[80], &mqc_states[74]},
- {0x0085, 1, &mqc_states[81], &mqc_states[75]},
- {0x0049, 0, &mqc_states[82], &mqc_states[76]},
- {0x0049, 1, &mqc_states[83], &mqc_states[77]},
- {0x0025, 0, &mqc_states[84], &mqc_states[78]},
- {0x0025, 1, &mqc_states[85], &mqc_states[79]},
- {0x0015, 0, &mqc_states[86], &mqc_states[80]},
- {0x0015, 1, &mqc_states[87], &mqc_states[81]},
- {0x0009, 0, &mqc_states[88], &mqc_states[82]},
- {0x0009, 1, &mqc_states[89], &mqc_states[83]},
- {0x0005, 0, &mqc_states[90], &mqc_states[84]},
- {0x0005, 1, &mqc_states[91], &mqc_states[85]},
- {0x0001, 0, &mqc_states[90], &mqc_states[86]},
- {0x0001, 1, &mqc_states[91], &mqc_states[87]},
- {0x5601, 0, &mqc_states[92], &mqc_states[92]},
- {0x5601, 1, &mqc_states[93], &mqc_states[93]},
-};
-
-/*
-==========================================================
- local functions
-==========================================================
-*/
-
-static void mqc_byteout(opj_mqc_t *mqc) {
- if (*mqc->bp == 0xff) {
- mqc->bp++;
- *mqc->bp = mqc->c >> 20;
- mqc->c &= 0xfffff;
- mqc->ct = 7;
- } else {
- if ((mqc->c & 0x8000000) == 0) { /* ((mqc->c&0x8000000)==0) CHANGE */
- mqc->bp++;
- *mqc->bp = mqc->c >> 19;
- mqc->c &= 0x7ffff;
- mqc->ct = 8;
- } else {
- (*mqc->bp)++;
- if (*mqc->bp == 0xff) {
- mqc->c &= 0x7ffffff;
- mqc->bp++;
- *mqc->bp = mqc->c >> 20;
- mqc->c &= 0xfffff;
- mqc->ct = 7;
- } else {
- mqc->bp++;
- *mqc->bp = mqc->c >> 19;
- mqc->c &= 0x7ffff;
- mqc->ct = 8;
- }
- }
- }
-}
-
-static void mqc_renorme(opj_mqc_t *mqc) {
- do {
- mqc->a <<= 1;
- mqc->c <<= 1;
- mqc->ct--;
- if (mqc->ct == 0) {
- mqc_byteout(mqc);
- }
- } while ((mqc->a & 0x8000) == 0);
-}
-
-static void mqc_codemps(opj_mqc_t *mqc) {
- mqc->a -= (*mqc->curctx)->qeval;
- if ((mqc->a & 0x8000) == 0) {
- if (mqc->a < (*mqc->curctx)->qeval) {
- mqc->a = (*mqc->curctx)->qeval;
- } else {
- mqc->c += (*mqc->curctx)->qeval;
- }
- *mqc->curctx = (*mqc->curctx)->nmps;
- mqc_renorme(mqc);
- } else {
- mqc->c += (*mqc->curctx)->qeval;
- }
-}
-
-static void mqc_codelps(opj_mqc_t *mqc) {
- mqc->a -= (*mqc->curctx)->qeval;
- if (mqc->a < (*mqc->curctx)->qeval) {
- mqc->c += (*mqc->curctx)->qeval;
- } else {
- mqc->a = (*mqc->curctx)->qeval;
- }
- *mqc->curctx = (*mqc->curctx)->nlps;
- mqc_renorme(mqc);
-}
-
-static void mqc_setbits(opj_mqc_t *mqc) {
- unsigned int tempc = mqc->c + mqc->a;
- mqc->c |= 0xffff;
- if (mqc->c >= tempc) {
- mqc->c -= 0x8000;
- }
-}
-
-static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc) {
- int d;
- if (mqc->a < (*mqc->curctx)->qeval) {
- d = 1 - (*mqc->curctx)->mps;
- *mqc->curctx = (*mqc->curctx)->nlps;
- } else {
- d = (*mqc->curctx)->mps;
- *mqc->curctx = (*mqc->curctx)->nmps;
- }
-
- return d;
-}
-
-static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc) {
- int d;
- if (mqc->a < (*mqc->curctx)->qeval) {
- mqc->a = (*mqc->curctx)->qeval;
- d = (*mqc->curctx)->mps;
- *mqc->curctx = (*mqc->curctx)->nmps;
- } else {
- mqc->a = (*mqc->curctx)->qeval;
- d = 1 - (*mqc->curctx)->mps;
- *mqc->curctx = (*mqc->curctx)->nlps;
- }
-
- return d;
-}
-
-#ifdef MQC_PERF_OPT
-static INLINE void mqc_bytein(opj_mqc_t *const mqc) {
- unsigned int i = *((unsigned int *) mqc->bp);
- mqc->c += i & 0xffff00;
- mqc->ct = i & 0x0f;
- mqc->bp += (i >> 2) & 0x04;
-}
-#else
-static void mqc_bytein(opj_mqc_t *const mqc) {
- if (mqc->bp != mqc->end) {
- unsigned int c;
- if (mqc->bp + 1 != mqc->end) {
- c = *(mqc->bp + 1);
- } else {
- c = 0xff;
- }
- if (*mqc->bp == 0xff) {
- if (c > 0x8f) {
- mqc->c += 0xff00;
- mqc->ct = 8;
- } else {
- mqc->bp++;
- mqc->c += c << 9;
- mqc->ct = 7;
- }
- } else {
- mqc->bp++;
- mqc->c += c << 8;
- mqc->ct = 8;
- }
- } else {
- mqc->c += 0xff00;
- mqc->ct = 8;
- }
-}
-#endif
-
-static INLINE void mqc_renormd(opj_mqc_t *const mqc) {
- do {
- if (mqc->ct == 0) {
- mqc_bytein(mqc);
- }
- mqc->a <<= 1;
- mqc->c <<= 1;
- mqc->ct--;
- } while (mqc->a < 0x8000);
-}
-
-/*
-==========================================================
- MQ-Coder interface
-==========================================================
-*/
-
-opj_mqc_t* mqc_create(void) {
- opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));
-#ifdef MQC_PERF_OPT
- mqc->buffer = NULL;
-#endif
- return mqc;
-}
-
-void mqc_destroy(opj_mqc_t *mqc) {
- if(mqc) {
-#ifdef MQC_PERF_OPT
- if (mqc->buffer) {
- opj_free(mqc->buffer);
- }
-#endif
- opj_free(mqc);
- }
-}
-
-int mqc_numbytes(opj_mqc_t *mqc) {
- return mqc->bp - mqc->start;
-}
-
-void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp) {
- mqc_setcurctx(mqc, 0);
- mqc->a = 0x8000;
- mqc->c = 0;
- mqc->bp = bp - 1;
- mqc->ct = 12;
- if (*mqc->bp == 0xff) {
- mqc->ct = 13;
- }
- mqc->start = bp;
-}
-
-void mqc_encode(opj_mqc_t *mqc, int d) {
- if ((*mqc->curctx)->mps == d) {
- mqc_codemps(mqc);
- } else {
- mqc_codelps(mqc);
- }
-}
-
-void mqc_flush(opj_mqc_t *mqc) {
- mqc_setbits(mqc);
- mqc->c <<= mqc->ct;
- mqc_byteout(mqc);
- mqc->c <<= mqc->ct;
- mqc_byteout(mqc);
-
- if (*mqc->bp != 0xff) {
- mqc->bp++;
- }
-}
-
-void mqc_bypass_init_enc(opj_mqc_t *mqc) {
- mqc->c = 0;
- mqc->ct = 8;
- /*if (*mqc->bp == 0xff) {
- mqc->ct = 7;
- } */
-}
-
-void mqc_bypass_enc(opj_mqc_t *mqc, int d) {
- mqc->ct--;
- mqc->c = mqc->c + (d << mqc->ct);
- if (mqc->ct == 0) {
- mqc->bp++;
- *mqc->bp = mqc->c;
- mqc->ct = 8;
- if (*mqc->bp == 0xff) {
- mqc->ct = 7;
- }
- mqc->c = 0;
- }
-}
-
-int mqc_bypass_flush_enc(opj_mqc_t *mqc) {
- unsigned char bit_padding;
-
- bit_padding = 0;
-
- if (mqc->ct != 0) {
- while (mqc->ct > 0) {
- mqc->ct--;
- mqc->c += bit_padding << mqc->ct;
- bit_padding = (bit_padding + 1) & 0x01;
- }
- mqc->bp++;
- *mqc->bp = mqc->c;
- mqc->ct = 8;
- mqc->c = 0;
- }
-
- return 1;
-}
-
-void mqc_reset_enc(opj_mqc_t *mqc) {
- mqc_resetstates(mqc);
- mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
- mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
- mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
-}
-
-int mqc_restart_enc(opj_mqc_t *mqc) {
- int correction = 1;
-
- /* <flush part> */
- int n = 27 - 15 - mqc->ct;
- mqc->c <<= mqc->ct;
- while (n > 0) {
- mqc_byteout(mqc);
- n -= mqc->ct;
- mqc->c <<= mqc->ct;
- }
- mqc_byteout(mqc);
-
- return correction;
-}
-
-void mqc_restart_init_enc(opj_mqc_t *mqc) {
- /* <Re-init part> */
- mqc_setcurctx(mqc, 0);
- mqc->a = 0x8000;
- mqc->c = 0;
- mqc->ct = 12;
- mqc->bp--;
- if (*mqc->bp == 0xff) {
- mqc->ct = 13;
- }
-}
-
-void mqc_erterm_enc(opj_mqc_t *mqc) {
- int k = 11 - mqc->ct + 1;
-
- while (k > 0) {
- mqc->c <<= mqc->ct;
- mqc->ct = 0;
- mqc_byteout(mqc);
- k -= mqc->ct;
- }
-
- if (*mqc->bp != 0xff) {
- mqc_byteout(mqc);
- }
-}
-
-void mqc_segmark_enc(opj_mqc_t *mqc) {
- int i;
- mqc_setcurctx(mqc, 18);
-
- for (i = 1; i < 5; i++) {
- mqc_encode(mqc, i % 2);
- }
-}
-
-void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) {
- mqc_setcurctx(mqc, 0);
- mqc->start = bp;
- mqc->end = bp + len;
- mqc->bp = bp;
- if (len==0) mqc->c = 0xff << 16;
- else mqc->c = *mqc->bp << 16;
-
-#ifdef MQC_PERF_OPT
- {
- unsigned int c;
- unsigned int *ip;
- unsigned char *end = mqc->end - 1;
- mqc->buffer = opj_realloc(mqc->buffer, (len + 1) * sizeof(unsigned int));
- ip = (unsigned int *) mqc->buffer;
-
- while (bp < end) {
- c = *(bp + 1);
- if (*bp == 0xff) {
- if (c > 0x8f) {
- break;
- } else {
- *ip = 0x00000017 | (c << 9);
- }
- } else {
- *ip = 0x00000018 | (c << 8);
- }
- bp++;
- ip++;
- }
-
- /* Handle last byte of data */
- c = 0xff;
- if (*bp == 0xff) {
- *ip = 0x0000ff18;
- } else {
- bp++;
- *ip = 0x00000018 | (c << 8);
- }
- ip++;
-
- *ip = 0x0000ff08;
- mqc->bp = mqc->buffer;
- }
-#endif
- mqc_bytein(mqc);
- mqc->c <<= 7;
- mqc->ct -= 7;
- mqc->a = 0x8000;
-}
-
-int mqc_decode(opj_mqc_t *const mqc) {
- int d;
- mqc->a -= (*mqc->curctx)->qeval;
- if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
- d = mqc_lpsexchange(mqc);
- mqc_renormd(mqc);
- } else {
- mqc->c -= (*mqc->curctx)->qeval << 16;
- if ((mqc->a & 0x8000) == 0) {
- d = mqc_mpsexchange(mqc);
- mqc_renormd(mqc);
- } else {
- d = (*mqc->curctx)->mps;
- }
- }
-
- return d;
-}
-
-void mqc_resetstates(opj_mqc_t *mqc) {
- int i;
- for (i = 0; i < MQC_NUMCTXS; i++) {
- mqc->ctxs[i] = mqc_states;
- }
-}
-
-void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob) {
- mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)];
-}
-
-
diff --git a/extern/libopenjpeg/mqc.h b/extern/libopenjpeg/mqc.h
deleted file mode 100644
index d00cd1067d8..00000000000
--- a/extern/libopenjpeg/mqc.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __MQC_H
-#define __MQC_H
-/**
-@file mqc.h
-@brief Implementation of an MQ-Coder (MQC)
-
-The functions in MQC.C have for goal to realize the MQ-coder operations. The functions
-in MQC.C are used by some function in T1.C.
-*/
-
-/** @defgroup MQC MQC - Implementation of an MQ-Coder */
-/*@{*/
-
-/**
-This struct defines the state of a context.
-*/
-typedef struct opj_mqc_state {
- /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */
- unsigned int qeval;
- /** the Most Probable Symbol (0 or 1) */
- int mps;
- /** next state if the next encoded symbol is the MPS */
- struct opj_mqc_state *nmps;
- /** next state if the next encoded symbol is the LPS */
- struct opj_mqc_state *nlps;
-} opj_mqc_state_t;
-
-#define MQC_NUMCTXS 19
-
-/**
-MQ coder
-*/
-typedef struct opj_mqc {
- unsigned int c;
- unsigned int a;
- unsigned int ct;
- unsigned char *bp;
- unsigned char *start;
- unsigned char *end;
- opj_mqc_state_t *ctxs[MQC_NUMCTXS];
- opj_mqc_state_t **curctx;
-#ifdef MQC_PERF_OPT
- unsigned char *buffer;
-#endif
-} opj_mqc_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a new MQC handle
-@return Returns a new MQC handle if successful, returns NULL otherwise
-*/
-opj_mqc_t* mqc_create(void);
-/**
-Destroy a previously created MQC handle
-@param mqc MQC handle to destroy
-*/
-void mqc_destroy(opj_mqc_t *mqc);
-/**
-Return the number of bytes written/read since initialisation
-@param mqc MQC handle
-@return Returns the number of bytes already encoded
-*/
-int mqc_numbytes(opj_mqc_t *mqc);
-/**
-Reset the states of all the context of the coder/decoder
-(each context is set to a state where 0 and 1 are more or less equiprobable)
-@param mqc MQC handle
-*/
-void mqc_resetstates(opj_mqc_t *mqc);
-/**
-Set the state of a particular context
-@param mqc MQC handle
-@param ctxno Number that identifies the context
-@param msb The MSB of the new state of the context
-@param prob Number that identifies the probability of the symbols for the new state of the context
-*/
-void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob);
-/**
-Initialize the encoder
-@param mqc MQC handle
-@param bp Pointer to the start of the buffer where the bytes will be written
-*/
-void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp);
-/**
-Set the current context used for coding/decoding
-@param mqc MQC handle
-@param ctxno Number that identifies the context
-*/
-#define mqc_setcurctx(mqc, ctxno) (mqc)->curctx = &(mqc)->ctxs[(int)(ctxno)]
-/**
-Encode a symbol using the MQ-coder
-@param mqc MQC handle
-@param d The symbol to be encoded (0 or 1)
-*/
-void mqc_encode(opj_mqc_t *mqc, int d);
-/**
-Flush the encoder, so that all remaining data is written
-@param mqc MQC handle
-*/
-void mqc_flush(opj_mqc_t *mqc);
-/**
-BYPASS mode switch, initialization operation.
-JPEG 2000 p 505.
-<h2>Not fully implemented and tested !!</h2>
-@param mqc MQC handle
-*/
-void mqc_bypass_init_enc(opj_mqc_t *mqc);
-/**
-BYPASS mode switch, coding operation.
-JPEG 2000 p 505.
-<h2>Not fully implemented and tested !!</h2>
-@param mqc MQC handle
-@param d The symbol to be encoded (0 or 1)
-*/
-void mqc_bypass_enc(opj_mqc_t *mqc, int d);
-/**
-BYPASS mode switch, flush operation
-<h2>Not fully implemented and tested !!</h2>
-@param mqc MQC handle
-@return Returns 1 (always)
-*/
-int mqc_bypass_flush_enc(opj_mqc_t *mqc);
-/**
-RESET mode switch
-@param mqc MQC handle
-*/
-void mqc_reset_enc(opj_mqc_t *mqc);
-/**
-RESTART mode switch (TERMALL)
-@param mqc MQC handle
-@return Returns 1 (always)
-*/
-int mqc_restart_enc(opj_mqc_t *mqc);
-/**
-RESTART mode switch (TERMALL) reinitialisation
-@param mqc MQC handle
-*/
-void mqc_restart_init_enc(opj_mqc_t *mqc);
-/**
-ERTERM mode switch (PTERM)
-@param mqc MQC handle
-*/
-void mqc_erterm_enc(opj_mqc_t *mqc);
-/**
-SEGMARK mode switch (SEGSYM)
-@param mqc MQC handle
-*/
-void mqc_segmark_enc(opj_mqc_t *mqc);
-/**
-Initialize the decoder
-@param mqc MQC handle
-@param bp Pointer to the start of the buffer from which the bytes will be read
-@param len Length of the input buffer
-*/
-void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len);
-/**
-Decode a symbol
-@param mqc MQC handle
-@return Returns the decoded symbol (0 or 1)
-*/
-int mqc_decode(opj_mqc_t *const mqc);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __MQC_H */
diff --git a/extern/libopenjpeg/openjpeg.c b/extern/libopenjpeg/openjpeg.c
deleted file mode 100644
index 180cc844ab5..00000000000
--- a/extern/libopenjpeg/openjpeg.c
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifdef _WIN32
-#include <windows.h>
-#endif /* _WIN32 */
-
-#include "opj_config.h"
-#include "opj_includes.h"
-
-/* ---------------------------------------------------------------------- */
-#ifdef _WIN32
-#ifndef OPJ_STATIC
-BOOL APIENTRY
-DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
-
- OPJ_ARG_NOT_USED(lpReserved);
- OPJ_ARG_NOT_USED(hModule);
-
- switch (ul_reason_for_call) {
- case DLL_PROCESS_ATTACH :
- break;
- case DLL_PROCESS_DETACH :
- break;
- case DLL_THREAD_ATTACH :
- case DLL_THREAD_DETACH :
- break;
- }
-
- return TRUE;
-}
-#endif /* OPJ_STATIC */
-#endif /* _WIN32 */
-
-/* ---------------------------------------------------------------------- */
-
-
-const char* OPJ_CALLCONV opj_version(void) {
- return PACKAGE_VERSION;
-}
-
-opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format) {
- opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_calloc(1, sizeof(opj_dinfo_t));
- if(!dinfo) return NULL;
- dinfo->is_decompressor = OPJ_TRUE;
- switch(format) {
- case CODEC_J2K:
- case CODEC_JPT:
- /* get a J2K decoder handle */
- dinfo->j2k_handle = (void*)j2k_create_decompress((opj_common_ptr)dinfo);
- if(!dinfo->j2k_handle) {
- opj_free(dinfo);
- return NULL;
- }
- break;
- case CODEC_JP2:
- /* get a JP2 decoder handle */
- dinfo->jp2_handle = (void*)jp2_create_decompress((opj_common_ptr)dinfo);
- if(!dinfo->jp2_handle) {
- opj_free(dinfo);
- return NULL;
- }
- break;
- case CODEC_UNKNOWN:
- default:
- opj_free(dinfo);
- return NULL;
- }
-
- dinfo->codec_format = format;
-
- return dinfo;
-}
-
-void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo) {
- if(dinfo) {
- /* destroy the codec */
- switch(dinfo->codec_format) {
- case CODEC_J2K:
- case CODEC_JPT:
- j2k_destroy_decompress((opj_j2k_t*)dinfo->j2k_handle);
- break;
- case CODEC_JP2:
- jp2_destroy_decompress((opj_jp2_t*)dinfo->jp2_handle);
- break;
- case CODEC_UNKNOWN:
- default:
- break;
- }
- /* destroy the decompressor */
- opj_free(dinfo);
- }
-}
-
-void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters) {
- if(parameters) {
- memset(parameters, 0, sizeof(opj_dparameters_t));
- /* default decoding parameters */
- parameters->cp_layer = 0;
- parameters->cp_reduce = 0;
- parameters->cp_limit_decoding = NO_LIMITATION;
-
- parameters->decod_format = -1;
- parameters->cod_format = -1;
- parameters->flags = 0;
-/* UniPG>> */
-#ifdef USE_JPWL
- parameters->jpwl_correct = OPJ_FALSE;
- parameters->jpwl_exp_comps = JPWL_EXPECTED_COMPONENTS;
- parameters->jpwl_max_tiles = JPWL_MAXIMUM_TILES;
-#endif /* USE_JPWL */
-/* <<UniPG */
- }
-}
-
-void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters) {
- if(dinfo && parameters) {
- switch(dinfo->codec_format) {
- case CODEC_J2K:
- case CODEC_JPT:
- j2k_setup_decoder((opj_j2k_t*)dinfo->j2k_handle, parameters);
- break;
- case CODEC_JP2:
- jp2_setup_decoder((opj_jp2_t*)dinfo->jp2_handle, parameters);
- break;
- case CODEC_UNKNOWN:
- default:
- break;
- }
- }
-}
-
-opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio) {
- return opj_decode_with_info(dinfo, cio, NULL);
-}
-
-opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *cio, opj_codestream_info_t *cstr_info) {
- if(dinfo && cio) {
- switch(dinfo->codec_format) {
- case CODEC_J2K:
- return j2k_decode((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info);
- case CODEC_JPT:
- return j2k_decode_jpt_stream((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info);
- case CODEC_JP2:
- return opj_jp2_decode((opj_jp2_t*)dinfo->jp2_handle, cio, cstr_info);
- case CODEC_UNKNOWN:
- default:
- break;
- }
- }
- return NULL;
-}
-
-opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format) {
- opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_calloc(1, sizeof(opj_cinfo_t));
- if(!cinfo) return NULL;
- cinfo->is_decompressor = OPJ_FALSE;
- switch(format) {
- case CODEC_J2K:
- /* get a J2K coder handle */
- cinfo->j2k_handle = (void*)j2k_create_compress((opj_common_ptr)cinfo);
- if(!cinfo->j2k_handle) {
- opj_free(cinfo);
- return NULL;
- }
- break;
- case CODEC_JP2:
- /* get a JP2 coder handle */
- cinfo->jp2_handle = (void*)jp2_create_compress((opj_common_ptr)cinfo);
- if(!cinfo->jp2_handle) {
- opj_free(cinfo);
- return NULL;
- }
- break;
- case CODEC_JPT:
- case CODEC_UNKNOWN:
- default:
- opj_free(cinfo);
- return NULL;
- }
-
- cinfo->codec_format = format;
-
- return cinfo;
-}
-
-void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo) {
- if(cinfo) {
- /* destroy the codec */
- switch(cinfo->codec_format) {
- case CODEC_J2K:
- j2k_destroy_compress((opj_j2k_t*)cinfo->j2k_handle);
- break;
- case CODEC_JP2:
- jp2_destroy_compress((opj_jp2_t*)cinfo->jp2_handle);
- break;
- case CODEC_JPT:
- case CODEC_UNKNOWN:
- default:
- break;
- }
- /* destroy the decompressor */
- opj_free(cinfo);
- }
-}
-
-void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters) {
- if(parameters) {
- memset(parameters, 0, sizeof(opj_cparameters_t));
- /* default coding parameters */
- parameters->cp_cinema = OFF;
- parameters->max_comp_size = 0;
- parameters->numresolution = 6;
- parameters->cp_rsiz = STD_RSIZ;
- parameters->cblockw_init = 64;
- parameters->cblockh_init = 64;
- parameters->prog_order = LRCP;
- parameters->roi_compno = -1; /* no ROI */
- parameters->subsampling_dx = 1;
- parameters->subsampling_dy = 1;
- parameters->tp_on = 0;
- parameters->decod_format = -1;
- parameters->cod_format = -1;
- parameters->tcp_rates[0] = 0;
- parameters->tcp_numlayers = 0;
- parameters->cp_disto_alloc = 0;
- parameters->cp_fixed_alloc = 0;
- parameters->cp_fixed_quality = 0;
- parameters->jpip_on = OPJ_FALSE;
-/* UniPG>> */
-#ifdef USE_JPWL
- parameters->jpwl_epc_on = OPJ_FALSE;
- parameters->jpwl_hprot_MH = -1; /* -1 means unassigned */
- {
- int i;
- for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
- parameters->jpwl_hprot_TPH_tileno[i] = -1; /* unassigned */
- parameters->jpwl_hprot_TPH[i] = 0; /* absent */
- }
- };
- {
- int i;
- for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
- parameters->jpwl_pprot_tileno[i] = -1; /* unassigned */
- parameters->jpwl_pprot_packno[i] = -1; /* unassigned */
- parameters->jpwl_pprot[i] = 0; /* absent */
- }
- };
- parameters->jpwl_sens_size = 0; /* 0 means no ESD */
- parameters->jpwl_sens_addr = 0; /* 0 means auto */
- parameters->jpwl_sens_range = 0; /* 0 means packet */
- parameters->jpwl_sens_MH = -1; /* -1 means unassigned */
- {
- int i;
- for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
- parameters->jpwl_sens_TPH_tileno[i] = -1; /* unassigned */
- parameters->jpwl_sens_TPH[i] = -1; /* absent */
- }
- };
-#endif /* USE_JPWL */
-/* <<UniPG */
- }
-}
-
-void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image) {
- if(cinfo && parameters && image) {
- switch(cinfo->codec_format) {
- case CODEC_J2K:
- j2k_setup_encoder((opj_j2k_t*)cinfo->j2k_handle, parameters, image);
- break;
- case CODEC_JP2:
- jp2_setup_encoder((opj_jp2_t*)cinfo->jp2_handle, parameters, image);
- break;
- case CODEC_JPT:
- case CODEC_UNKNOWN:
- default:
- break;
- }
- }
-}
-
-opj_bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index) {
- if (index != NULL)
- opj_event_msg((opj_common_ptr)cinfo, EVT_WARNING, "Set index to NULL when calling the opj_encode function.\n"
- "To extract the index, use the opj_encode_with_info() function.\n"
- "No index will be generated during this encoding\n");
- return opj_encode_with_info(cinfo, cio, image, NULL);
-}
-
-opj_bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
- if(cinfo && cio && image) {
- switch(cinfo->codec_format) {
- case CODEC_J2K:
- return j2k_encode((opj_j2k_t*)cinfo->j2k_handle, cio, image, cstr_info);
- case CODEC_JP2:
- return opj_jp2_encode((opj_jp2_t*)cinfo->jp2_handle, cio, image, cstr_info);
- case CODEC_JPT:
- case CODEC_UNKNOWN:
- default:
- break;
- }
- }
- return OPJ_FALSE;
-}
-
-void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info) {
- if (cstr_info) {
- int tileno;
- for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
- opj_tile_info_t *tile_info = &cstr_info->tile[tileno];
- opj_free(tile_info->thresh);
- opj_free(tile_info->packet);
- opj_free(tile_info->tp);
- opj_free(tile_info->marker);
- }
- opj_free(cstr_info->tile);
- opj_free(cstr_info->marker);
- opj_free(cstr_info->numdecompos);
- }
-}
diff --git a/extern/libopenjpeg/openjpeg.h b/extern/libopenjpeg/openjpeg.h
deleted file mode 100644
index 59147c8b3d1..00000000000
--- a/extern/libopenjpeg/openjpeg.h
+++ /dev/null
@@ -1,914 +0,0 @@
- /*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2006-2007, Parvatha Elangovan
- * Copyright (c) 2010-2011, Kaori Hagihara
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef OPENJPEG_H
-#define OPENJPEG_H
-
-
-/*
-==========================================================
- Compiler directives
-==========================================================
-*/
-
-#if defined(OPJ_STATIC) || !defined(_WIN32)
-#define OPJ_API
-#define OPJ_CALLCONV
-#else
-#define OPJ_CALLCONV __stdcall
-/*
-The following ifdef block is the standard way of creating macros which make exporting
-from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS
-symbol defined on the command line. this symbol should not be defined on any project
-that uses this DLL. This way any other project whose source files include this file see
-OPJ_API functions as being imported from a DLL, wheras this DLL sees symbols
-defined with this macro as being exported.
-*/
-#if defined(OPJ_EXPORTS) || defined(DLL_EXPORT)
-#define OPJ_API __declspec(dllexport)
-#else
-#define OPJ_API __declspec(dllimport)
-#endif /* OPJ_EXPORTS */
-#endif /* !OPJ_STATIC || !_WIN32 */
-
-typedef int opj_bool;
-#define OPJ_TRUE 1
-#define OPJ_FALSE 0
-
-/* Avoid compile-time warning because parameter is not used */
-#define OPJ_ARG_NOT_USED(x) (void)(x)
-/*
-==========================================================
- Useful constant definitions
-==========================================================
-*/
-
-#define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */
-
-#define J2K_MAXRLVLS 33 /**< Number of maximum resolution level authorized */
-#define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /**< Number of maximum sub-band linked to number of resolution level */
-
-/* UniPG>> */
-#define JPWL_MAX_NO_TILESPECS 16 /**< Maximum number of tile parts expected by JPWL: increase at your will */
-#define JPWL_MAX_NO_PACKSPECS 16 /**< Maximum number of packet parts expected by JPWL: increase at your will */
-#define JPWL_MAX_NO_MARKERS 512 /**< Maximum number of JPWL markers: increase at your will */
-#define JPWL_PRIVATEINDEX_NAME "jpwl_index_privatefilename" /**< index file name used when JPWL is on */
-#define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */
-#define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */
-#define JPWL_MAXIMUM_HAMMING 2 /**< Expect this maximum number of bit errors in marker id's */
-#define JPWL_MAXIMUM_EPB_ROOM 65450 /**< Expect this maximum number of bytes for composition of EPBs */
-/* <<UniPG */
-
-/*
-==========================================================
- enum definitions
-==========================================================
-*/
-/**
-Rsiz Capabilities
-*/
-typedef enum RSIZ_CAPABILITIES {
- STD_RSIZ = 0, /** Standard JPEG2000 profile*/
- CINEMA2K = 3, /** Profile name for a 2K image*/
- CINEMA4K = 4 /** Profile name for a 4K image*/
-} OPJ_RSIZ_CAPABILITIES;
-
-/**
-Digital cinema operation mode
-*/
-typedef enum CINEMA_MODE {
- OFF = 0, /** Not Digital Cinema*/
- CINEMA2K_24 = 1, /** 2K Digital Cinema at 24 fps*/
- CINEMA2K_48 = 2, /** 2K Digital Cinema at 48 fps*/
- CINEMA4K_24 = 3 /** 4K Digital Cinema at 24 fps*/
-}OPJ_CINEMA_MODE;
-
-/**
-Progression order
-*/
-typedef enum PROG_ORDER {
- PROG_UNKNOWN = -1, /**< place-holder */
- LRCP = 0, /**< layer-resolution-component-precinct order */
- RLCP = 1, /**< resolution-layer-component-precinct order */
- RPCL = 2, /**< resolution-precinct-component-layer order */
- PCRL = 3, /**< precinct-component-resolution-layer order */
- CPRL = 4 /**< component-precinct-resolution-layer order */
-} OPJ_PROG_ORDER;
-
-/**
-Supported image color spaces
-*/
-typedef enum COLOR_SPACE {
- CLRSPC_UNKNOWN = -1, /**< not supported by the library */
- CLRSPC_UNSPECIFIED = 0, /**< not specified in the codestream */
- CLRSPC_SRGB = 1, /**< sRGB */
- CLRSPC_GRAY = 2, /**< grayscale */
- CLRSPC_SYCC = 3 /**< YUV */
-} OPJ_COLOR_SPACE;
-
-#define ENUMCS_SRGB 16
-#define ENUMCS_GRAY 17
-#define ENUMCS_SYCC 18
-
-/**
-Supported codec
-*/
-typedef enum CODEC_FORMAT {
- CODEC_UNKNOWN = -1, /**< place-holder */
- CODEC_J2K = 0, /**< JPEG-2000 codestream : read/write */
- CODEC_JPT = 1, /**< JPT-stream (JPEG 2000, JPIP) : read only */
- CODEC_JP2 = 2 /**< JPEG-2000 file format : read/write */
-} OPJ_CODEC_FORMAT;
-
-/**
-Limit decoding to certain portions of the codestream.
-*/
-typedef enum LIMIT_DECODING {
- NO_LIMITATION = 0, /**< No limitation for the decoding. The entire codestream will de decoded */
- LIMIT_TO_MAIN_HEADER = 1, /**< The decoding is limited to the Main Header */
- DECODE_ALL_BUT_PACKETS = 2 /**< Decode everything except the JPEG 2000 packets */
-} OPJ_LIMIT_DECODING;
-
-/*
-==========================================================
- event manager typedef definitions
-==========================================================
-*/
-
-/**
-Callback function prototype for events
-@param msg Event message
-@param client_data
-*/
-typedef void (*opj_msg_callback) (const char *msg, void *client_data);
-
-/**
-Message handler object
-used for
-<ul>
-<li>Error messages
-<li>Warning messages
-<li>Debugging messages
-</ul>
-*/
-typedef struct opj_event_mgr {
- /** Error message callback if available, NULL otherwise */
- opj_msg_callback error_handler;
- /** Warning message callback if available, NULL otherwise */
- opj_msg_callback warning_handler;
- /** Debug message callback if available, NULL otherwise */
- opj_msg_callback info_handler;
-} opj_event_mgr_t;
-
-
-/*
-==========================================================
- codec typedef definitions
-==========================================================
-*/
-
-/**
-Progression order changes
-*/
-typedef struct opj_poc {
- /** Resolution num start, Component num start, given by POC */
- int resno0, compno0;
- /** Layer num end,Resolution num end, Component num end, given by POC */
- int layno1, resno1, compno1;
- /** Layer num start,Precinct num start, Precinct num end */
- int layno0, precno0, precno1;
- /** Progression order enum*/
- OPJ_PROG_ORDER prg1,prg;
- /** Progression order string*/
- char progorder[5];
- /** Tile number */
- int tile;
- /** Start and end values for Tile width and height*/
- int tx0,tx1,ty0,ty1;
- /** Start value, initialised in pi_initialise_encode*/
- int layS, resS, compS, prcS;
- /** End value, initialised in pi_initialise_encode */
- int layE, resE, compE, prcE;
- /** Start and end values of Tile width and height, initialised in pi_initialise_encode*/
- int txS,txE,tyS,tyE,dx,dy;
- /** Temporary values for Tile parts, initialised in pi_create_encode */
- int lay_t, res_t, comp_t, prc_t,tx0_t,ty0_t;
-} opj_poc_t;
-
-/**
-Compression parameters
-*/
-typedef struct opj_cparameters {
- /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */
- opj_bool tile_size_on;
- /** XTOsiz */
- int cp_tx0;
- /** YTOsiz */
- int cp_ty0;
- /** XTsiz */
- int cp_tdx;
- /** YTsiz */
- int cp_tdy;
- /** allocation by rate/distortion */
- int cp_disto_alloc;
- /** allocation by fixed layer */
- int cp_fixed_alloc;
- /** add fixed_quality */
- int cp_fixed_quality;
- /** fixed layer */
- int *cp_matrice;
- /** comment for coding */
- char *cp_comment;
- /** csty : coding style */
- int csty;
- /** progression order (default LRCP) */
- OPJ_PROG_ORDER prog_order;
- /** progression order changes */
- opj_poc_t POC[32];
- /** number of progression order changes (POC), default to 0 */
- int numpocs;
- /** number of layers */
- int tcp_numlayers;
- /** rates of layers */
- float tcp_rates[100];
- /** different psnr for successive layers */
- float tcp_distoratio[100];
- /** number of resolutions */
- int numresolution;
- /** initial code block width, default to 64 */
- int cblockw_init;
- /** initial code block height, default to 64 */
- int cblockh_init;
- /** mode switch (cblk_style) */
- int mode;
- /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */
- int irreversible;
- /** region of interest: affected component in [0..3], -1 means no ROI */
- int roi_compno;
- /** region of interest: upshift value */
- int roi_shift;
- /* number of precinct size specifications */
- int res_spec;
- /** initial precinct width */
- int prcw_init[J2K_MAXRLVLS];
- /** initial precinct height */
- int prch_init[J2K_MAXRLVLS];
-
- /**@name command line encoder parameters (not used inside the library) */
- /*@{*/
- /** input file name */
- char infile[OPJ_PATH_LEN];
- /** output file name */
- char outfile[OPJ_PATH_LEN];
- /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
- int index_on;
- /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
- char index[OPJ_PATH_LEN];
- /** subimage encoding: origin image offset in x direction */
- int image_offset_x0;
- /** subimage encoding: origin image offset in y direction */
- int image_offset_y0;
- /** subsampling value for dx */
- int subsampling_dx;
- /** subsampling value for dy */
- int subsampling_dy;
- /** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/
- int decod_format;
- /** output file format 0: J2K, 1: JP2, 2: JPT */
- int cod_format;
- /*@}*/
-
-/* UniPG>> */
- /**@name JPWL encoding parameters */
- /*@{*/
- /** enables writing of EPC in MH, thus activating JPWL */
- opj_bool jpwl_epc_on;
- /** error protection method for MH (0,1,16,32,37-128) */
- int jpwl_hprot_MH;
- /** tile number of header protection specification (>=0) */
- int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
- /** error protection methods for TPHs (0,1,16,32,37-128) */
- int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS];
- /** tile number of packet protection specification (>=0) */
- int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS];
- /** packet number of packet protection specification (>=0) */
- int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS];
- /** error protection methods for packets (0,1,16,32,37-128) */
- int jpwl_pprot[JPWL_MAX_NO_PACKSPECS];
- /** enables writing of ESD, (0=no/1/2 bytes) */
- int jpwl_sens_size;
- /** sensitivity addressing size (0=auto/2/4 bytes) */
- int jpwl_sens_addr;
- /** sensitivity range (0-3) */
- int jpwl_sens_range;
- /** sensitivity method for MH (-1=no,0-7) */
- int jpwl_sens_MH;
- /** tile number of sensitivity specification (>=0) */
- int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
- /** sensitivity methods for TPHs (-1=no,0-7) */
- int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS];
- /*@}*/
-/* <<UniPG */
-
- /** Digital Cinema compliance 0-not compliant, 1-compliant*/
- OPJ_CINEMA_MODE cp_cinema;
- /** Maximum rate for each component. If == 0, component size limitation is not considered */
- int max_comp_size;
- /** Profile name*/
- OPJ_RSIZ_CAPABILITIES cp_rsiz;
- /** Tile part generation*/
- char tp_on;
- /** Flag for Tile part generation*/
- char tp_flag;
- /** MCT (multiple component transform) */
- char tcp_mct;
- /** Enable JPIP indexing*/
- opj_bool jpip_on;
-} opj_cparameters_t;
-
-#define OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG 0x0001
-
-/**
-Decompression parameters
-*/
-typedef struct opj_dparameters {
- /**
- Set the number of highest resolution levels to be discarded.
- The image resolution is effectively divided by 2 to the power of the number of discarded levels.
- The reduce factor is limited by the smallest total number of decomposition levels among tiles.
- if != 0, then original dimension divided by 2^(reduce);
- if == 0 or not used, image is decoded to the full resolution
- */
- int cp_reduce;
- /**
- Set the maximum number of quality layers to decode.
- If there are less quality layers than the specified number, all the quality layers are decoded.
- if != 0, then only the first "layer" layers are decoded;
- if == 0 or not used, all the quality layers are decoded
- */
- int cp_layer;
-
- /**@name command line encoder parameters (not used inside the library) */
- /*@{*/
- /** input file name */
- char infile[OPJ_PATH_LEN];
- /** output file name */
- char outfile[OPJ_PATH_LEN];
- /** input file format 0: J2K, 1: JP2, 2: JPT */
- int decod_format;
- /** output file format 0: PGX, 1: PxM, 2: BMP */
- int cod_format;
- /*@}*/
-
-/* UniPG>> */
- /**@name JPWL decoding parameters */
- /*@{*/
- /** activates the JPWL correction capabilities */
- opj_bool jpwl_correct;
- /** expected number of components */
- int jpwl_exp_comps;
- /** maximum number of tiles */
- int jpwl_max_tiles;
- /*@}*/
-/* <<UniPG */
-
- /**
- Specify whether the decoding should be done on the entire codestream, or be limited to the main header
- Limiting the decoding to the main header makes it possible to extract the characteristics of the codestream
- if == NO_LIMITATION, the entire codestream is decoded;
- if == LIMIT_TO_MAIN_HEADER, only the main header is decoded;
- */
- OPJ_LIMIT_DECODING cp_limit_decoding;
-
- unsigned int flags;
-} opj_dparameters_t;
-
-/** Common fields between JPEG-2000 compression and decompression master structs. */
-
-#define opj_common_fields \
- opj_event_mgr_t *event_mgr; /**< pointer to the event manager */\
- void * client_data; /**< Available for use by application */\
- opj_bool is_decompressor; /**< So common code can tell which is which */\
- OPJ_CODEC_FORMAT codec_format; /**< selected codec */\
- void *j2k_handle; /**< pointer to the J2K codec */\
- void *jp2_handle; /**< pointer to the JP2 codec */\
- void *mj2_handle /**< pointer to the MJ2 codec */
-
-/* Routines that are to be used by both halves of the library are declared
- * to receive a pointer to this structure. There are no actual instances of
- * opj_common_struct_t, only of opj_cinfo_t and opj_dinfo_t.
- */
-typedef struct opj_common_struct {
- opj_common_fields; /* Fields common to both master struct types */
- /* Additional fields follow in an actual opj_cinfo_t or
- * opj_dinfo_t. All three structs must agree on these
- * initial fields! (This would be a lot cleaner in C++.)
- */
-} opj_common_struct_t;
-
-typedef opj_common_struct_t * opj_common_ptr;
-
-/**
-Compression context info
-*/
-typedef struct opj_cinfo {
- /** Fields shared with opj_dinfo_t */
- opj_common_fields;
- /* other specific fields go here */
-} opj_cinfo_t;
-
-/**
-Decompression context info
-*/
-typedef struct opj_dinfo {
- /** Fields shared with opj_cinfo_t */
- opj_common_fields;
- /* other specific fields go here */
-} opj_dinfo_t;
-
-/*
-==========================================================
- I/O stream typedef definitions
-==========================================================
-*/
-
-/*
- * Stream open flags.
- */
-/** The stream was opened for reading. */
-#define OPJ_STREAM_READ 0x0001
-/** The stream was opened for writing. */
-#define OPJ_STREAM_WRITE 0x0002
-
-/**
-Byte input-output stream (CIO)
-*/
-typedef struct opj_cio {
- /** codec context */
- opj_common_ptr cinfo;
-
- /** open mode (read/write) either OPJ_STREAM_READ or OPJ_STREAM_WRITE */
- int openmode;
- /** pointer to the start of the buffer */
- unsigned char *buffer;
- /** buffer size in bytes */
- int length;
-
- /** pointer to the start of the stream */
- unsigned char *start;
- /** pointer to the end of the stream */
- unsigned char *end;
- /** pointer to the current position */
- unsigned char *bp;
-} opj_cio_t;
-
-/*
-==========================================================
- image typedef definitions
-==========================================================
-*/
-
-/**
-Defines a single image component
-*/
-typedef struct opj_image_comp {
- /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
- int dx;
- /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
- int dy;
- /** data width */
- int w;
- /** data height */
- int h;
- /** x component offset compared to the whole image */
- int x0;
- /** y component offset compared to the whole image */
- int y0;
- /** precision */
- int prec;
- /** image depth in bits */
- int bpp;
- /** signed (1) / unsigned (0) */
- int sgnd;
- /** number of decoded resolution */
- int resno_decoded;
- /** number of division by 2 of the out image compared to the original size of image */
- int factor;
- /** image component data */
- int *data;
-} opj_image_comp_t;
-
-/**
-Defines image data and characteristics
-*/
-typedef struct opj_image {
- /** XOsiz: horizontal offset from the origin of the reference grid to the left side of the image area */
- int x0;
- /** YOsiz: vertical offset from the origin of the reference grid to the top side of the image area */
- int y0;
- /** Xsiz: width of the reference grid */
- int x1;
- /** Ysiz: height of the reference grid */
- int y1;
- /** number of components in the image */
- int numcomps;
- /** color space: sRGB, Greyscale or YUV */
- OPJ_COLOR_SPACE color_space;
- /** image components */
- opj_image_comp_t *comps;
- /** 'restricted' ICC profile */
- unsigned char *icc_profile_buf;
- /** size of ICC profile */
- int icc_profile_len;
-} opj_image_t;
-
-/**
-Component parameters structure used by the opj_image_create function
-*/
-typedef struct opj_image_comptparm {
- /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
- int dx;
- /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
- int dy;
- /** data width */
- int w;
- /** data height */
- int h;
- /** x component offset compared to the whole image */
- int x0;
- /** y component offset compared to the whole image */
- int y0;
- /** precision */
- int prec;
- /** image depth in bits */
- int bpp;
- /** signed (1) / unsigned (0) */
- int sgnd;
-} opj_image_cmptparm_t;
-
-/*
-==========================================================
- Information on the JPEG 2000 codestream
-==========================================================
-*/
-
-/**
-Index structure : Information concerning a packet inside tile
-*/
-typedef struct opj_packet_info {
- /** packet start position (including SOP marker if it exists) */
- int start_pos;
- /** end of packet header position (including EPH marker if it exists)*/
- int end_ph_pos;
- /** packet end position */
- int end_pos;
- /** packet distorsion */
- double disto;
-} opj_packet_info_t;
-
-
-/* UniPG>> */
-/**
-Marker structure
-*/
-typedef struct opj_marker_info_t {
- /** marker type */
- unsigned short int type;
- /** position in codestream */
- int pos;
- /** length, marker val included */
- int len;
-} opj_marker_info_t;
-/* <<UniPG */
-
-/**
-Index structure : Information concerning tile-parts
-*/
-typedef struct opj_tp_info {
- /** start position of tile part */
- int tp_start_pos;
- /** end position of tile part header */
- int tp_end_header;
- /** end position of tile part */
- int tp_end_pos;
- /** start packet of tile part */
- int tp_start_pack;
- /** number of packets of tile part */
- int tp_numpacks;
-} opj_tp_info_t;
-
-/**
-Index structure : information regarding tiles
-*/
-typedef struct opj_tile_info {
- /** value of thresh for each layer by tile cfr. Marcela */
- double *thresh;
- /** number of tile */
- int tileno;
- /** start position */
- int start_pos;
- /** end position of the header */
- int end_header;
- /** end position */
- int end_pos;
- /** precinct number for each resolution level (width) */
- int pw[33];
- /** precinct number for each resolution level (height) */
- int ph[33];
- /** precinct size (in power of 2), in X for each resolution level */
- int pdx[33];
- /** precinct size (in power of 2), in Y for each resolution level */
- int pdy[33];
- /** information concerning packets inside tile */
- opj_packet_info_t *packet;
- /** add fixed_quality */
- int numpix;
- /** add fixed_quality */
- double distotile;
- /** number of markers */
- int marknum;
- /** list of markers */
- opj_marker_info_t *marker;
- /** actual size of markers array */
- int maxmarknum;
- /** number of tile parts */
- int num_tps;
- /** information concerning tile parts */
- opj_tp_info_t *tp;
-} opj_tile_info_t;
-
-/**
-Index structure of the codestream
-*/
-typedef struct opj_codestream_info {
- /** maximum distortion reduction on the whole image (add for Marcela) */
- double D_max;
- /** packet number */
- int packno;
- /** writing the packet in the index with t2_encode_packets */
- int index_write;
- /** image width */
- int image_w;
- /** image height */
- int image_h;
- /** progression order */
- OPJ_PROG_ORDER prog;
- /** tile size in x */
- int tile_x;
- /** tile size in y */
- int tile_y;
- /** */
- int tile_Ox;
- /** */
- int tile_Oy;
- /** number of tiles in X */
- int tw;
- /** number of tiles in Y */
- int th;
- /** component numbers */
- int numcomps;
- /** number of layer */
- int numlayers;
- /** number of decomposition for each component */
- int *numdecompos;
-/* UniPG>> */
- /** number of markers */
- int marknum;
- /** list of markers */
- opj_marker_info_t *marker;
- /** actual size of markers array */
- int maxmarknum;
-/* <<UniPG */
- /** main header position */
- int main_head_start;
- /** main header position */
- int main_head_end;
- /** codestream's size */
- int codestream_size;
- /** information regarding tiles inside image */
- opj_tile_info_t *tile;
-} opj_codestream_info_t;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/*
-==========================================================
- openjpeg version
-==========================================================
-*/
-
-OPJ_API const char * OPJ_CALLCONV opj_version(void);
-
-/*
-==========================================================
- image functions definitions
-==========================================================
-*/
-
-/**
-Create an image
-@param numcmpts number of components
-@param cmptparms components parameters
-@param clrspc image color space
-@return returns a new image structure if successful, returns NULL otherwise
-*/
-OPJ_API opj_image_t* OPJ_CALLCONV opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
-
-/**
-Deallocate any resources associated with an image
-@param image image to be destroyed
-*/
-OPJ_API void OPJ_CALLCONV opj_image_destroy(opj_image_t *image);
-
-/*
-==========================================================
- stream functions definitions
-==========================================================
-*/
-
-/**
-Open and allocate a memory stream for read / write.
-On reading, the user must provide a buffer containing encoded data. The buffer will be
-wrapped by the returned CIO handle.
-On writing, buffer parameters must be set to 0: a buffer will be allocated by the library
-to contain encoded data.
-@param cinfo Codec context info
-@param buffer Reading: buffer address. Writing: NULL
-@param length Reading: buffer length. Writing: 0
-@return Returns a CIO handle if successful, returns NULL otherwise
-*/
-OPJ_API opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length);
-
-/**
-Close and free a CIO handle
-@param cio CIO handle to free
-*/
-OPJ_API void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio);
-
-/**
-Get position in byte stream
-@param cio CIO handle
-@return Returns the position in bytes
-*/
-OPJ_API int OPJ_CALLCONV cio_tell(opj_cio_t *cio);
-/**
-Set position in byte stream
-@param cio CIO handle
-@param pos Position, in number of bytes, from the beginning of the stream
-*/
-OPJ_API void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos);
-
-/*
-==========================================================
- event manager functions definitions
-==========================================================
-*/
-
-OPJ_API opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context);
-
-/*
-==========================================================
- codec functions definitions
-==========================================================
-*/
-/**
-Creates a J2K/JPT/JP2 decompression structure
-@param format Decoder to select
-@return Returns a handle to a decompressor if successful, returns NULL otherwise
-*/
-OPJ_API opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format);
-/**
-Destroy a decompressor handle
-@param dinfo decompressor handle to destroy
-*/
-OPJ_API void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo);
-/**
-Set decoding parameters to default values
-@param parameters Decompression parameters
-*/
-OPJ_API void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters);
-/**
-Setup the decoder decoding parameters using user parameters.
-Decoding parameters are returned in j2k->cp.
-@param dinfo decompressor handle
-@param parameters decompression parameters
-*/
-OPJ_API void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters);
-/**
-Decode an image from a JPEG-2000 codestream
-@param dinfo decompressor handle
-@param cio Input buffer stream
-@return Returns a decoded image if successful, returns NULL otherwise
-*/
-OPJ_API opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio);
-
-/**
-Decode an image from a JPEG-2000 codestream and extract the codestream information
-@param dinfo decompressor handle
-@param cio Input buffer stream
-@param cstr_info Codestream information structure if needed afterwards, NULL otherwise
-@return Returns a decoded image if successful, returns NULL otherwise
-*/
-OPJ_API opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *cio, opj_codestream_info_t *cstr_info);
-/**
-Creates a J2K/JP2 compression structure
-@param format Coder to select
-@return Returns a handle to a compressor if successful, returns NULL otherwise
-*/
-OPJ_API opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format);
-/**
-Destroy a compressor handle
-@param cinfo compressor handle to destroy
-*/
-OPJ_API void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo);
-/**
-Set encoding parameters to default values, that means :
-<ul>
-<li>Lossless
-<li>1 tile
-<li>Size of precinct : 2^15 x 2^15 (means 1 precinct)
-<li>Size of code-block : 64 x 64
-<li>Number of resolutions: 6
-<li>No SOP marker in the codestream
-<li>No EPH marker in the codestream
-<li>No sub-sampling in x or y direction
-<li>No mode switch activated
-<li>Progression order: LRCP
-<li>No index file
-<li>No ROI upshifted
-<li>No offset of the origin of the image
-<li>No offset of the origin of the tiles
-<li>Reversible DWT 5-3
-</ul>
-@param parameters Compression parameters
-*/
-OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters);
-/**
-Setup the encoder parameters using the current image and using user parameters.
-@param cinfo Compressor handle
-@param parameters Compression parameters
-@param image Input filled image
-*/
-OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image);
-/**
-Encode an image into a JPEG-2000 codestream
-3@param cinfo compressor handle
-@param cio Output buffer stream
-@param image Image to encode
-@param index Depreacted -> Set to NULL. To extract index, used opj_encode_wci()
-@return Returns true if successful, returns false otherwise
-*/
-OPJ_API opj_bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index);
-/**
-Encode an image into a JPEG-2000 codestream and extract the codestream information
-@param cinfo compressor handle
-@param cio Output buffer stream
-@param image Image to encode
-@param cstr_info Codestream information structure if needed afterwards, NULL otherwise
-@return Returns true if successful, returns false otherwise
-*/
-OPJ_API opj_bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
-/**
-Destroy Codestream information after compression or decompression
-@param cstr_info Codestream information structure
-*/
-OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* OPENJPEG_H */
diff --git a/extern/libopenjpeg/opj_config.h b/extern/libopenjpeg/opj_config.h
deleted file mode 100644
index 5d0a877b840..00000000000
--- a/extern/libopenjpeg/opj_config.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* for BLENDER - we hand-maintain this,
- * for the original OpenJpeg package it is generated,
- * the endian check is a blender define */
-
-/* create config.h for CMake */
-#define PACKAGE_VERSION "1.5.2"
-
-#define HAVE_INTTYPES_H
-#define HAVE_MEMORY_H
-#define HAVE_STDINT_H
-#define HAVE_STDLIB_H
-#define HAVE_STRINGS_H
-#define HAVE_STRING_H
-#define HAVE_SYS_STAT_H
-#define HAVE_SYS_TYPES_H
-#define HAVE_UNISTD_H
-/* #define HAVE_LIBPNG */
-/* #define HAVE_PNG_H */
-/* #define HAVE_LIBTIFF */
-/* #define HAVE_TIFF_H */
-
-/* #undef HAVE_LIBLCMS1 */
-/* #undef HAVE_LIBLCMS2 */
-/* #undef HAVE_LCMS1_H */
-/* #undef HAVE_LCMS2_H */
-/* #undef USE_SYSTEM_GETOPT */
-
-/* Byte order. */
-/* All compilers that support Mac OS X define either __BIG_ENDIAN__ or
-__LITTLE_ENDIAN__ to match the endianness of the architecture being
-compiled for. This is not necessarily the same as the architecture of the
-machine doing the building. In order to support Universal Binaries on
-Mac OS X, we prefer those defines to decide the endianness.
-On other platforms we use the result of the TRY_RUN. */
-#if defined(__BIG_ENDIAN__)
-# define OPJ_BIG_ENDIAN
-#else
-# undef OPJ_BIG_ENDIAN
-#endif
diff --git a/extern/libopenjpeg/opj_includes.h b/extern/libopenjpeg/opj_includes.h
deleted file mode 100644
index e9194fd9886..00000000000
--- a/extern/libopenjpeg/opj_includes.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef OPJ_INCLUDES_H
-#define OPJ_INCLUDES_H
-
-/*
- ==========================================================
- Standard includes used by the library
- ==========================================================
-*/
-#include <memory.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include <float.h>
-#include <time.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <ctype.h>
-
-/*
- ==========================================================
- OpenJPEG interface
- ==========================================================
- */
-#include "openjpeg.h"
-
-/*
- ==========================================================
- OpenJPEG modules
- ==========================================================
-*/
-
-/* Ignore GCC attributes if this is not GCC */
-#ifndef __GNUC__
- #define __attribute__(x) /* __attribute__(x) */
-#endif
-
-/*
-The inline keyword is supported by C99 but not by C90.
-Most compilers implement their own version of this keyword ...
-*/
-#ifndef INLINE
- #if defined(_MSC_VER)
- #define INLINE __forceinline
- #elif defined(__GNUC__)
- #define INLINE __inline__
- #elif defined(__MWERKS__)
- #define INLINE inline
- #else
- /* add other compilers here ... */
- #define INLINE
- #endif /* defined(<Compiler>) */
-#endif /* INLINE */
-
-/* Are restricted pointers available? (C99) */
-#if (__STDC_VERSION__ != 199901L)
- /* Not a C99 compiler */
- #ifdef __GNUC__
- #define restrict __restrict__
- #else
- #define restrict /* restrict */
- #endif
-#endif
-
-/* MSVC and Borland C do not have lrintf */
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-static INLINE long lrintf(float f){
-#ifdef _M_IX86
- long int i;
-
- _asm{
- fld f
- fistp i
- };
- return i;
-#else
- return (long)((f>0.0f) ? (f + 0.5f):(f -0.5f));
-#endif /* _M_IX86 */
-}
-#endif
-
-#include "j2k_lib.h"
-#include "opj_malloc.h"
-#include "event.h"
-#include "bio.h"
-#include "cio.h"
-
-#include "image.h"
-#include "j2k.h"
-#include "jp2.h"
-#include "jpt.h"
-
-#include "mqc.h"
-#include "raw.h"
-#include "bio.h"
-#include "tgt.h"
-#include "pi.h"
-#include "tcd.h"
-#include "t1.h"
-#include "dwt.h"
-#include "t2.h"
-#include "mct.h"
-#include "int.h"
-#include "fix.h"
-
-#include "cidx_manager.h"
-#include "indexbox_manager.h"
-
-/* JPWL>> */
-#ifdef USE_JPWL
-#include "./jpwl/jpwl.h"
-#endif /* USE_JPWL */
-/* <<JPWL */
-
-#endif /* OPJ_INCLUDES_H */
diff --git a/extern/libopenjpeg/opj_malloc.h b/extern/libopenjpeg/opj_malloc.h
deleted file mode 100644
index aef2ee3b8c9..00000000000
--- a/extern/libopenjpeg/opj_malloc.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __OPJ_MALLOC_H
-#define __OPJ_MALLOC_H
-/**
-@file opj_malloc.h
-@brief Internal functions
-
-The functions in opj_malloc.h are internal utilities used for memory management.
-*/
-
-/** @defgroup MISC MISC - Miscellaneous internal functions */
-/*@{*/
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-
-/**
-Allocate an uninitialized memory block
-@param size Bytes to allocate
-@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
-*/
-#ifdef ALLOC_PERF_OPT
-void * OPJ_CALLCONV opj_malloc(size_t size);
-#else
-#define opj_malloc(size) malloc(size)
-#endif
-
-/**
-Allocate a memory block with elements initialized to 0
-@param num Blocks to allocate
-@param size Bytes per block to allocate
-@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
-*/
-#ifdef ALLOC_PERF_OPT
-void * OPJ_CALLCONV opj_calloc(size_t _NumOfElements, size_t _SizeOfElements);
-#else
-#define opj_calloc(num, size) calloc(num, size)
-#endif
-
-/**
-Allocate memory aligned to a 16 byte boundry
-@param size Bytes to allocate
-@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
-*/
-/* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */
-#ifdef _WIN32
- /* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */
- #ifdef __GNUC__
- #include <mm_malloc.h>
- #define HAVE_MM_MALLOC
- #else /* MSVC, Intel C++ */
- #include <malloc.h>
- #ifdef _mm_malloc
- #define HAVE_MM_MALLOC
- #endif
- #endif
-#else /* Not _WIN32 */
- #if defined(__sun)
- #define HAVE_MEMALIGN
- #elif defined(__FreeBSD__)
- #define HAVE_POSIX_MEMALIGN
- /* Linux x86_64 and OSX always align allocations to 16 bytes */
- #elif !defined(__amd64__) && !defined(__APPLE__) && !defined(_AIX)
- #define HAVE_MEMALIGN
- #include <malloc.h>
- #endif
-#endif
-
-#define opj_aligned_malloc(size) malloc(size)
-#define opj_aligned_free(m) free(m)
-
-#ifdef HAVE_MM_MALLOC
- #undef opj_aligned_malloc
- #define opj_aligned_malloc(size) _mm_malloc(size, 16)
- #undef opj_aligned_free
- #define opj_aligned_free(m) _mm_free(m)
-#endif
-
-#ifdef HAVE_MEMALIGN
- extern void* memalign(size_t, size_t);
- #undef opj_aligned_malloc
- #define opj_aligned_malloc(size) memalign(16, (size))
- #undef opj_aligned_free
- #define opj_aligned_free(m) free(m)
-#endif
-
-#ifdef HAVE_POSIX_MEMALIGN
- #undef opj_aligned_malloc
- extern int posix_memalign(void**, size_t, size_t);
-
- static INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){
- void* mem = NULL;
- posix_memalign(&mem, 16, size);
- return mem;
- }
- #undef opj_aligned_free
- #define opj_aligned_free(m) free(m)
-#endif
-
-#ifdef ALLOC_PERF_OPT
- #undef opj_aligned_malloc
- #define opj_aligned_malloc(size) opj_malloc(size)
- #undef opj_aligned_free
- #define opj_aligned_free(m) opj_free(m)
-#endif
-
-/**
-Reallocate memory blocks.
-@param m Pointer to previously allocated memory block
-@param s New size in bytes
-@return Returns a void pointer to the reallocated (and possibly moved) memory block
-*/
-#ifdef ALLOC_PERF_OPT
-void * OPJ_CALLCONV opj_realloc(void * m, size_t s);
-#else
-#define opj_realloc(m, s) realloc(m, s)
-#endif
-
-/**
-Deallocates or frees a memory block.
-@param m Previously allocated memory block to be freed
-*/
-#ifdef ALLOC_PERF_OPT
-void OPJ_CALLCONV opj_free(void * m);
-#else
-#define opj_free(m) free(m)
-#endif
-
-#ifdef __GNUC__
-#pragma GCC poison malloc calloc realloc free
-#endif
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __OPJ_MALLOC_H */
-
diff --git a/extern/libopenjpeg/phix_manager.c b/extern/libopenjpeg/phix_manager.c
deleted file mode 100644
index 60a02811785..00000000000
--- a/extern/libopenjpeg/phix_manager.c
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * $Id: phix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
- *
- * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2011, Professor Benoit Macq
- * Copyright (c) 2003-2004, Yannick Verschueren
- * Copyright (c) 2010-2011, Kaori Hagihara
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*! \file
- * \brief Modification of jpip.c from 2KAN indexer
- */
-
-#include <stdlib.h>
-#include <math.h>
-#include "opj_includes.h"
-
-/*
- * Write faix box of phix
- *
- * @param[in] coff offset of j2k codestream
- * @param[in] compno component number
- * @param[in] cstr_info codestream information
- * @param[in] EPHused true if if EPH option used
- * @param[in] j2klen length of j2k codestream
- * @param[in] cio file output handle
- * @return length of faix box
- */
-int write_phixfaix( int coff, int compno, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio);
-
-int write_phix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio)
-{
- int len, lenp=0, compno, i;
- opj_jp2_box_t *box;
-
- box = (opj_jp2_box_t *)opj_calloc( cstr_info.numcomps, sizeof(opj_jp2_box_t));
-
- for( i=0;i<2;i++){
- if (i) cio_seek( cio, lenp);
-
- lenp = cio_tell( cio);
- cio_skip( cio, 4); /* L [at the end] */
- cio_write( cio, JPIP_PHIX, 4); /* PHIX */
-
- write_manf( i, cstr_info.numcomps, box, cio);
-
- for( compno=0; compno<cstr_info.numcomps; compno++){
- box[compno].length = write_phixfaix( coff, compno, cstr_info, EPHused, j2klen, cio);
- box[compno].type = JPIP_FAIX;
- }
-
- len = cio_tell( cio)-lenp;
- cio_seek( cio, lenp);
- cio_write( cio, len, 4); /* L */
- cio_seek( cio, lenp+len);
- }
-
- opj_free(box);
-
- return len;
-}
-
-int write_phixfaix( int coff, int compno, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio)
-{
- int len, lenp, tileno, version, i, nmax, size_of_coding; /* 4 or 8 */
- opj_tile_info_t *tile_Idx;
- opj_packet_info_t packet;
- int resno, precno, layno, num_packet;
- int numOfres, numOfprec, numOflayers;
- packet.end_ph_pos = packet.start_pos = -1;
- (void)EPHused; /* unused ? */
-
- if( j2klen > pow( 2, 32)){
- size_of_coding = 8;
- version = 1;
- }
- else{
- size_of_coding = 4;
- version = 0;
- }
-
- lenp = cio_tell( cio);
- cio_skip( cio, 4); /* L [at the end] */
- cio_write( cio, JPIP_FAIX, 4); /* FAIX */
- cio_write( cio, version,1); /* Version 0 = 4 bytes */
-
- nmax = 0;
- for( i=0; i<=cstr_info.numdecompos[compno]; i++)
- nmax += cstr_info.tile[0].ph[i] * cstr_info.tile[0].pw[i] * cstr_info.numlayers;
-
- cio_write( cio, nmax, size_of_coding); /* NMAX */
- cio_write( cio, cstr_info.tw*cstr_info.th, size_of_coding); /* M */
-
- for( tileno=0; tileno<cstr_info.tw*cstr_info.th; tileno++){
- tile_Idx = &cstr_info.tile[ tileno];
-
- num_packet = 0;
- numOfres = cstr_info.numdecompos[compno] + 1;
-
- for( resno=0; resno<numOfres ; resno++){
- numOfprec = tile_Idx->pw[resno]*tile_Idx->ph[resno];
- for( precno=0; precno<numOfprec; precno++){
- numOflayers = cstr_info.numlayers;
- for( layno=0; layno<numOflayers; layno++){
-
- switch ( cstr_info.prog){
- case LRCP:
- packet = tile_Idx->packet[ ((layno*numOfres+resno)*cstr_info.numcomps+compno)*numOfprec+precno];
- break;
- case RLCP:
- packet = tile_Idx->packet[ ((resno*numOflayers+layno)*cstr_info.numcomps+compno)*numOfprec+precno];
- break;
- case RPCL:
- packet = tile_Idx->packet[ ((resno*numOfprec+precno)*cstr_info.numcomps+compno)*numOflayers+layno];
- break;
- case PCRL:
- packet = tile_Idx->packet[ ((precno*cstr_info.numcomps+compno)*numOfres+resno)*numOflayers + layno];
- break;
- case CPRL:
- packet = tile_Idx->packet[ ((compno*numOfprec+precno)*numOfres+resno)*numOflayers + layno];
- break;
- default:
- fprintf( stderr, "failed to ppix indexing\n");
- }
-
- cio_write( cio, packet.start_pos-coff, size_of_coding); /* start position */
- cio_write( cio, packet.end_ph_pos-packet.start_pos+1, size_of_coding); /* length */
-
- num_packet++;
- }
- }
- }
-
- /* PADDING */
- while( num_packet < nmax){
- cio_write( cio, 0, size_of_coding); /* start position */
- cio_write( cio, 0, size_of_coding); /* length */
- num_packet++;
- }
- }
-
- len = cio_tell( cio)-lenp;
- cio_seek( cio, lenp);
- cio_write( cio, len, 4); /* L */
- cio_seek( cio, lenp+len);
-
- return len;
-}
diff --git a/extern/libopenjpeg/pi.c b/extern/libopenjpeg/pi.c
deleted file mode 100644
index e8e33bfe600..00000000000
--- a/extern/libopenjpeg/pi.c
+++ /dev/null
@@ -1,963 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2006-2007, Parvatha Elangovan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "opj_includes.h"
-
-/** @defgroup PI PI - Implementation of a packet iterator */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-/**
-Get next packet in layer-resolution-component-precinct order.
-@param pi packet iterator to modify
-@return returns false if pi pointed to the last packet or else returns true
-*/
-static opj_bool pi_next_lrcp(opj_pi_iterator_t * pi);
-/**
-Get next packet in resolution-layer-component-precinct order.
-@param pi packet iterator to modify
-@return returns false if pi pointed to the last packet or else returns true
-*/
-static opj_bool pi_next_rlcp(opj_pi_iterator_t * pi);
-/**
-Get next packet in resolution-precinct-component-layer order.
-@param pi packet iterator to modify
-@return returns false if pi pointed to the last packet or else returns true
-*/
-static opj_bool pi_next_rpcl(opj_pi_iterator_t * pi);
-/**
-Get next packet in precinct-component-resolution-layer order.
-@param pi packet iterator to modify
-@return returns false if pi pointed to the last packet or else returns true
-*/
-static opj_bool pi_next_pcrl(opj_pi_iterator_t * pi);
-/**
-Get next packet in component-precinct-resolution-layer order.
-@param pi packet iterator to modify
-@return returns false if pi pointed to the last packet or else returns true
-*/
-static opj_bool pi_next_cprl(opj_pi_iterator_t * pi);
-
-/*@}*/
-
-/*@}*/
-
-/*
-==========================================================
- local functions
-==========================================================
-*/
-
-static opj_bool pi_next_lrcp(opj_pi_iterator_t * pi) {
- opj_pi_comp_t *comp = NULL;
- opj_pi_resolution_t *res = NULL;
- long index = 0;
-
- if (!pi->first) {
- comp = &pi->comps[pi->compno];
- res = &comp->resolutions[pi->resno];
- goto LABEL_SKIP;
- } else {
- pi->first = 0;
- }
-
- for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
- for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1;
- pi->resno++) {
- for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
- comp = &pi->comps[pi->compno];
- if (pi->resno >= comp->numresolutions) {
- continue;
- }
- res = &comp->resolutions[pi->resno];
- if (!pi->tp_on){
- pi->poc.precno1 = res->pw * res->ph;
- }
- for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
- index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
- if (!pi->include[index]) {
- pi->include[index] = 1;
- return OPJ_TRUE;
- }
-LABEL_SKIP:;
- }
- }
- }
- }
-
- return OPJ_FALSE;
-}
-
-static opj_bool pi_next_rlcp(opj_pi_iterator_t * pi) {
- opj_pi_comp_t *comp = NULL;
- opj_pi_resolution_t *res = NULL;
- long index = 0;
-
- if (!pi->first) {
- comp = &pi->comps[pi->compno];
- res = &comp->resolutions[pi->resno];
- goto LABEL_SKIP;
- } else {
- pi->first = 0;
- }
-
- for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
- for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
- for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
- comp = &pi->comps[pi->compno];
- if (pi->resno >= comp->numresolutions) {
- continue;
- }
- res = &comp->resolutions[pi->resno];
- if(!pi->tp_on){
- pi->poc.precno1 = res->pw * res->ph;
- }
- for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
- index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
- if (!pi->include[index]) {
- pi->include[index] = 1;
- return OPJ_TRUE;
- }
-LABEL_SKIP:;
- }
- }
- }
- }
-
- return OPJ_FALSE;
-}
-
-static opj_bool pi_next_rpcl(opj_pi_iterator_t * pi) {
- opj_pi_comp_t *comp = NULL;
- opj_pi_resolution_t *res = NULL;
- long index = 0;
-
- if (!pi->first) {
- goto LABEL_SKIP;
- } else {
- int compno, resno;
- pi->first = 0;
- pi->dx = 0;
- pi->dy = 0;
- for (compno = 0; compno < pi->numcomps; compno++) {
- comp = &pi->comps[compno];
- for (resno = 0; resno < comp->numresolutions; resno++) {
- int dx, dy;
- res = &comp->resolutions[resno];
- dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
- dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
- pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
- pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
- }
- }
- }
-if (!pi->tp_on){
- pi->poc.ty0 = pi->ty0;
- pi->poc.tx0 = pi->tx0;
- pi->poc.ty1 = pi->ty1;
- pi->poc.tx1 = pi->tx1;
- }
- for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
- for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) {
- for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) {
- for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
- int levelno;
- int trx0, try0;
- int trx1, try1;
- int rpx, rpy;
- int prci, prcj;
- comp = &pi->comps[pi->compno];
- if (pi->resno >= comp->numresolutions) {
- continue;
- }
- res = &comp->resolutions[pi->resno];
- levelno = comp->numresolutions - 1 - pi->resno;
- trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
- try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
- trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
- try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
- rpx = res->pdx + levelno;
- rpy = res->pdy + levelno;
- if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
- continue;
- }
- if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
- continue;
- }
-
- if ((res->pw==0)||(res->ph==0)) continue;
-
- if ((trx0==trx1)||(try0==try1)) continue;
-
- prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
- - int_floordivpow2(trx0, res->pdx);
- prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
- - int_floordivpow2(try0, res->pdy);
- pi->precno = prci + prcj * res->pw;
- for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
- index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
- if (!pi->include[index]) {
- pi->include[index] = 1;
- return OPJ_TRUE;
- }
-LABEL_SKIP:;
- }
- }
- }
- }
- }
-
- return OPJ_FALSE;
-}
-
-static opj_bool pi_next_pcrl(opj_pi_iterator_t * pi) {
- opj_pi_comp_t *comp = NULL;
- opj_pi_resolution_t *res = NULL;
- long index = 0;
-
- if (!pi->first) {
- comp = &pi->comps[pi->compno];
- goto LABEL_SKIP;
- } else {
- int compno, resno;
- pi->first = 0;
- pi->dx = 0;
- pi->dy = 0;
- for (compno = 0; compno < pi->numcomps; compno++) {
- comp = &pi->comps[compno];
- for (resno = 0; resno < comp->numresolutions; resno++) {
- int dx, dy;
- res = &comp->resolutions[resno];
- dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
- dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
- pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
- pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
- }
- }
- }
- if (!pi->tp_on){
- pi->poc.ty0 = pi->ty0;
- pi->poc.tx0 = pi->tx0;
- pi->poc.ty1 = pi->ty1;
- pi->poc.tx1 = pi->tx1;
- }
- for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) {
- for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) {
- for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
- comp = &pi->comps[pi->compno];
- for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
- int levelno;
- int trx0, try0;
- int trx1, try1;
- int rpx, rpy;
- int prci, prcj;
- res = &comp->resolutions[pi->resno];
- levelno = comp->numresolutions - 1 - pi->resno;
- trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
- try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
- trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
- try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
- rpx = res->pdx + levelno;
- rpy = res->pdy + levelno;
- if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
- continue;
- }
- if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
- continue;
- }
-
- if ((res->pw==0)||(res->ph==0)) continue;
-
- if ((trx0==trx1)||(try0==try1)) continue;
-
- prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
- - int_floordivpow2(trx0, res->pdx);
- prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
- - int_floordivpow2(try0, res->pdy);
- pi->precno = prci + prcj * res->pw;
- for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
- index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
- if (!pi->include[index]) {
- pi->include[index] = 1;
- return OPJ_TRUE;
- }
-LABEL_SKIP:;
- }
- }
- }
- }
- }
-
- return OPJ_FALSE;
-}
-
-static opj_bool pi_next_cprl(opj_pi_iterator_t * pi) {
- opj_pi_comp_t *comp = NULL;
- opj_pi_resolution_t *res = NULL;
- long index = 0;
-
- if (!pi->first) {
- comp = &pi->comps[pi->compno];
- goto LABEL_SKIP;
- } else {
- pi->first = 0;
- }
-
- for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
- int resno;
- comp = &pi->comps[pi->compno];
- pi->dx = 0;
- pi->dy = 0;
- for (resno = 0; resno < comp->numresolutions; resno++) {
- int dx, dy;
- res = &comp->resolutions[resno];
- dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
- dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
- pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
- pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
- }
- if (!pi->tp_on){
- pi->poc.ty0 = pi->ty0;
- pi->poc.tx0 = pi->tx0;
- pi->poc.ty1 = pi->ty1;
- pi->poc.tx1 = pi->tx1;
- }
- for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) {
- for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) {
- for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
- int levelno;
- int trx0, try0;
- int trx1, try1;
- int rpx, rpy;
- int prci, prcj;
- res = &comp->resolutions[pi->resno];
- levelno = comp->numresolutions - 1 - pi->resno;
- trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
- try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
- trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
- try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
- rpx = res->pdx + levelno;
- rpy = res->pdy + levelno;
- if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
- continue;
- }
- if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
- continue;
- }
-
- if ((res->pw==0)||(res->ph==0)) continue;
-
- if ((trx0==trx1)||(try0==try1)) continue;
-
- prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
- - int_floordivpow2(trx0, res->pdx);
- prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
- - int_floordivpow2(try0, res->pdy);
- pi->precno = prci + prcj * res->pw;
- for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
- index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
- if (!pi->include[index]) {
- pi->include[index] = 1;
- return OPJ_TRUE;
- }
-LABEL_SKIP:;
- }
- }
- }
- }
- }
-
- return OPJ_FALSE;
-}
-
-/*
-==========================================================
- Packet iterator interface
-==========================================================
-*/
-
-opj_pi_iterator_t *pi_create_decode(opj_image_t *image, opj_cp_t *cp, int tileno) {
- int p, q;
- int compno, resno, pino;
- opj_pi_iterator_t *pi = NULL;
- opj_tcp_t *tcp = NULL;
- opj_tccp_t *tccp = NULL;
-
- tcp = &cp->tcps[tileno];
-
- pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), sizeof(opj_pi_iterator_t));
- if(!pi) {
- /* TODO: throw an error */
- return NULL;
- }
-
- for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */
- int maxres = 0;
- int maxprec = 0;
- p = tileno % cp->tw;
- q = tileno / cp->tw;
-
- pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
- pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
- pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
- pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
- pi[pino].numcomps = image->numcomps;
-
- pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t));
- if(!pi[pino].comps) {
- /* TODO: throw an error */
- pi_destroy(pi, cp, tileno);
- return NULL;
- }
-
- for (compno = 0; compno < pi->numcomps; compno++) {
- int tcx0, tcy0, tcx1, tcy1;
- opj_pi_comp_t *comp = &pi[pino].comps[compno];
- tccp = &tcp->tccps[compno];
- comp->dx = image->comps[compno].dx;
- comp->dy = image->comps[compno].dy;
- comp->numresolutions = tccp->numresolutions;
-
- comp->resolutions = (opj_pi_resolution_t*) opj_calloc(comp->numresolutions, sizeof(opj_pi_resolution_t));
- if(!comp->resolutions) {
- /* TODO: throw an error */
- pi_destroy(pi, cp, tileno);
- return NULL;
- }
-
- tcx0 = int_ceildiv(pi->tx0, comp->dx);
- tcy0 = int_ceildiv(pi->ty0, comp->dy);
- tcx1 = int_ceildiv(pi->tx1, comp->dx);
- tcy1 = int_ceildiv(pi->ty1, comp->dy);
- if (comp->numresolutions > maxres) {
- maxres = comp->numresolutions;
- }
-
- for (resno = 0; resno < comp->numresolutions; resno++) {
- int levelno;
- int rx0, ry0, rx1, ry1;
- int px0, py0, px1, py1;
- opj_pi_resolution_t *res = &comp->resolutions[resno];
- if (tccp->csty & J2K_CCP_CSTY_PRT) {
- res->pdx = tccp->prcw[resno];
- res->pdy = tccp->prch[resno];
- } else {
- res->pdx = 15;
- res->pdy = 15;
- }
- levelno = comp->numresolutions - 1 - resno;
- rx0 = int_ceildivpow2(tcx0, levelno);
- ry0 = int_ceildivpow2(tcy0, levelno);
- rx1 = int_ceildivpow2(tcx1, levelno);
- ry1 = int_ceildivpow2(tcy1, levelno);
- px0 = int_floordivpow2(rx0, res->pdx) << res->pdx;
- py0 = int_floordivpow2(ry0, res->pdy) << res->pdy;
- px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx;
- py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy;
- res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx);
- res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy);
-
- if (res->pw*res->ph > maxprec) {
- maxprec = res->pw*res->ph;
- }
-
- }
- }
-
- tccp = &tcp->tccps[0];
- pi[pino].step_p = 1;
- pi[pino].step_c = maxprec * pi[pino].step_p;
- pi[pino].step_r = image->numcomps * pi[pino].step_c;
- pi[pino].step_l = maxres * pi[pino].step_r;
-
- if (pino == 0) {
- pi[pino].include = (short int*) opj_calloc(image->numcomps * maxres * tcp->numlayers * maxprec, sizeof(short int));
- if(!pi[pino].include) {
- /* TODO: throw an error */
- pi_destroy(pi, cp, tileno);
- return NULL;
- }
- }
- else {
- pi[pino].include = pi[pino - 1].include;
- }
-
- if (tcp->POC == 0) {
- pi[pino].first = 1;
- pi[pino].poc.resno0 = 0;
- pi[pino].poc.compno0 = 0;
- pi[pino].poc.layno1 = tcp->numlayers;
- pi[pino].poc.resno1 = maxres;
- pi[pino].poc.compno1 = image->numcomps;
- pi[pino].poc.prg = tcp->prg;
- } else {
- pi[pino].first = 1;
- pi[pino].poc.resno0 = tcp->pocs[pino].resno0;
- pi[pino].poc.compno0 = tcp->pocs[pino].compno0;
- pi[pino].poc.layno1 = tcp->pocs[pino].layno1;
- pi[pino].poc.resno1 = tcp->pocs[pino].resno1;
- pi[pino].poc.compno1 = tcp->pocs[pino].compno1;
- pi[pino].poc.prg = tcp->pocs[pino].prg;
- }
- pi[pino].poc.layno0 = 0;
- pi[pino].poc.precno0 = 0;
- pi[pino].poc.precno1 = maxprec;
-
- }
-
- return pi;
-}
-
-
-opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, int tileno, J2K_T2_MODE t2_mode){
- int p, q, pino;
- int compno, resno;
- int maxres = 0;
- int maxprec = 0;
- opj_pi_iterator_t *pi = NULL;
- opj_tcp_t *tcp = NULL;
- opj_tccp_t *tccp = NULL;
-
- tcp = &cp->tcps[tileno];
-
- pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), sizeof(opj_pi_iterator_t));
- if(!pi) { return NULL;}
- pi->tp_on = cp->tp_on;
-
- for(pino = 0;pino < tcp->numpocs+1 ; pino ++){
- p = tileno % cp->tw;
- q = tileno / cp->tw;
-
- pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
- pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
- pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
- pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
- pi[pino].numcomps = image->numcomps;
-
- pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t));
- if(!pi[pino].comps) {
- pi_destroy(pi, cp, tileno);
- return NULL;
- }
-
- for (compno = 0; compno < pi[pino].numcomps; compno++) {
- int tcx0, tcy0, tcx1, tcy1;
- opj_pi_comp_t *comp = &pi[pino].comps[compno];
- tccp = &tcp->tccps[compno];
- comp->dx = image->comps[compno].dx;
- comp->dy = image->comps[compno].dy;
- comp->numresolutions = tccp->numresolutions;
-
- comp->resolutions = (opj_pi_resolution_t*) opj_malloc(comp->numresolutions * sizeof(opj_pi_resolution_t));
- if(!comp->resolutions) {
- pi_destroy(pi, cp, tileno);
- return NULL;
- }
-
- tcx0 = int_ceildiv(pi[pino].tx0, comp->dx);
- tcy0 = int_ceildiv(pi[pino].ty0, comp->dy);
- tcx1 = int_ceildiv(pi[pino].tx1, comp->dx);
- tcy1 = int_ceildiv(pi[pino].ty1, comp->dy);
- if (comp->numresolutions > maxres) {
- maxres = comp->numresolutions;
- }
-
- for (resno = 0; resno < comp->numresolutions; resno++) {
- int levelno;
- int rx0, ry0, rx1, ry1;
- int px0, py0, px1, py1;
- opj_pi_resolution_t *res = &comp->resolutions[resno];
- if (tccp->csty & J2K_CCP_CSTY_PRT) {
- res->pdx = tccp->prcw[resno];
- res->pdy = tccp->prch[resno];
- } else {
- res->pdx = 15;
- res->pdy = 15;
- }
- levelno = comp->numresolutions - 1 - resno;
- rx0 = int_ceildivpow2(tcx0, levelno);
- ry0 = int_ceildivpow2(tcy0, levelno);
- rx1 = int_ceildivpow2(tcx1, levelno);
- ry1 = int_ceildivpow2(tcy1, levelno);
- px0 = int_floordivpow2(rx0, res->pdx) << res->pdx;
- py0 = int_floordivpow2(ry0, res->pdy) << res->pdy;
- px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx;
- py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy;
- res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx);
- res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy);
-
- if (res->pw*res->ph > maxprec) {
- maxprec = res->pw * res->ph;
- }
- }
- }
-
- tccp = &tcp->tccps[0];
- pi[pino].step_p = 1;
- pi[pino].step_c = maxprec * pi[pino].step_p;
- pi[pino].step_r = image->numcomps * pi[pino].step_c;
- pi[pino].step_l = maxres * pi[pino].step_r;
-
- for (compno = 0; compno < pi->numcomps; compno++) {
- opj_pi_comp_t *comp = &pi->comps[compno];
- for (resno = 0; resno < comp->numresolutions; resno++) {
- int dx, dy;
- opj_pi_resolution_t *res = &comp->resolutions[resno];
- dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
- dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
- pi[pino].dx = !pi->dx ? dx : int_min(pi->dx, dx);
- pi[pino].dy = !pi->dy ? dy : int_min(pi->dy, dy);
- }
- }
-
- if (pino == 0) {
- pi[pino].include = (short int*) opj_calloc(tcp->numlayers * pi[pino].step_l, sizeof(short int));
- if(!pi[pino].include) {
- pi_destroy(pi, cp, tileno);
- return NULL;
- }
- }
- else {
- pi[pino].include = pi[pino - 1].include;
- }
-
- /* Generation of boundaries for each prog flag*/
- if(tcp->POC && ( cp->cinema || ((!cp->cinema) && (t2_mode == FINAL_PASS)))){
- tcp->pocs[pino].compS= tcp->pocs[pino].compno0;
- tcp->pocs[pino].compE= tcp->pocs[pino].compno1;
- tcp->pocs[pino].resS = tcp->pocs[pino].resno0;
- tcp->pocs[pino].resE = tcp->pocs[pino].resno1;
- tcp->pocs[pino].layE = tcp->pocs[pino].layno1;
- tcp->pocs[pino].prg = tcp->pocs[pino].prg1;
- if (pino > 0)
- tcp->pocs[pino].layS = (tcp->pocs[pino].layE > tcp->pocs[pino - 1].layE) ? tcp->pocs[pino - 1].layE : 0;
- }else {
- tcp->pocs[pino].compS= 0;
- tcp->pocs[pino].compE= image->numcomps;
- tcp->pocs[pino].resS = 0;
- tcp->pocs[pino].resE = maxres;
- tcp->pocs[pino].layS = 0;
- tcp->pocs[pino].layE = tcp->numlayers;
- tcp->pocs[pino].prg = tcp->prg;
- }
- tcp->pocs[pino].prcS = 0;
- tcp->pocs[pino].prcE = maxprec;;
- tcp->pocs[pino].txS = pi[pino].tx0;
- tcp->pocs[pino].txE = pi[pino].tx1;
- tcp->pocs[pino].tyS = pi[pino].ty0;
- tcp->pocs[pino].tyE = pi[pino].ty1;
- tcp->pocs[pino].dx = pi[pino].dx;
- tcp->pocs[pino].dy = pi[pino].dy;
- }
- return pi;
- }
-
-
-
-void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) {
- int compno, pino;
- opj_tcp_t *tcp = &cp->tcps[tileno];
- if(pi) {
- for (pino = 0; pino < tcp->numpocs + 1; pino++) {
- if(pi[pino].comps) {
- for (compno = 0; compno < pi->numcomps; compno++) {
- opj_pi_comp_t *comp = &pi[pino].comps[compno];
- if(comp->resolutions) {
- opj_free(comp->resolutions);
- }
- }
- opj_free(pi[pino].comps);
- }
- }
- if(pi->include) {
- opj_free(pi->include);
- }
- opj_free(pi);
- }
-}
-
-opj_bool pi_next(opj_pi_iterator_t * pi) {
- switch (pi->poc.prg) {
- case LRCP:
- return pi_next_lrcp(pi);
- case RLCP:
- return pi_next_rlcp(pi);
- case RPCL:
- return pi_next_rpcl(pi);
- case PCRL:
- return pi_next_pcrl(pi);
- case CPRL:
- return pi_next_cprl(pi);
- case PROG_UNKNOWN:
- return OPJ_FALSE;
- }
-
- return OPJ_FALSE;
-}
-
-opj_bool pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp){
- char prog[4];
- int i;
- int incr_top=1,resetX=0;
- opj_tcp_t *tcps =&cp->tcps[tileno];
- opj_poc_t *tcp= &tcps->pocs[pino];
-
- pi[pino].first = 1;
- pi[pino].poc.prg = tcp->prg;
-
- switch(tcp->prg){
- case CPRL: strncpy(prog, "CPRL",4);
- break;
- case LRCP: strncpy(prog, "LRCP",4);
- break;
- case PCRL: strncpy(prog, "PCRL",4);
- break;
- case RLCP: strncpy(prog, "RLCP",4);
- break;
- case RPCL: strncpy(prog, "RPCL",4);
- break;
- case PROG_UNKNOWN:
- return OPJ_TRUE;
- }
-
- if(!(cp->tp_on && ((!cp->cinema && (t2_mode == FINAL_PASS)) || cp->cinema))){
- pi[pino].poc.resno0 = tcp->resS;
- pi[pino].poc.resno1 = tcp->resE;
- pi[pino].poc.compno0 = tcp->compS;
- pi[pino].poc.compno1 = tcp->compE;
- pi[pino].poc.layno0 = tcp->layS;
- pi[pino].poc.layno1 = tcp->layE;
- pi[pino].poc.precno0 = tcp->prcS;
- pi[pino].poc.precno1 = tcp->prcE;
- pi[pino].poc.tx0 = tcp->txS;
- pi[pino].poc.ty0 = tcp->tyS;
- pi[pino].poc.tx1 = tcp->txE;
- pi[pino].poc.ty1 = tcp->tyE;
- }else {
- if( tpnum < cur_totnum_tp){
- for(i=3;i>=0;i--){
- switch(prog[i]){
- case 'C':
- if (i > tppos){
- pi[pino].poc.compno0 = tcp->compS;
- pi[pino].poc.compno1 = tcp->compE;
- }else{
- if (tpnum == 0){
- tcp->comp_t = tcp->compS;
- pi[pino].poc.compno0 = tcp->comp_t;
- pi[pino].poc.compno1 = tcp->comp_t+1;
- tcp->comp_t+=1;
- }else{
- if (incr_top == 1){
- if(tcp->comp_t ==tcp->compE){
- tcp->comp_t = tcp->compS;
- pi[pino].poc.compno0 = tcp->comp_t;
- pi[pino].poc.compno1 = tcp->comp_t+1;
- tcp->comp_t+=1;
- incr_top=1;
- }else{
- pi[pino].poc.compno0 = tcp->comp_t;
- pi[pino].poc.compno1 = tcp->comp_t+1;
- tcp->comp_t+=1;
- incr_top=0;
- }
- }else{
- pi[pino].poc.compno0 = tcp->comp_t-1;
- pi[pino].poc.compno1 = tcp->comp_t;
- }
- }
- }
- break;
-
- case 'R':
- if (i > tppos){
- pi[pino].poc.resno0 = tcp->resS;
- pi[pino].poc.resno1 = tcp->resE;
- }else{
- if (tpnum == 0){
- tcp->res_t = tcp->resS;
- pi[pino].poc.resno0 = tcp->res_t;
- pi[pino].poc.resno1 = tcp->res_t+1;
- tcp->res_t+=1;
- }else{
- if (incr_top == 1){
- if(tcp->res_t==tcp->resE){
- tcp->res_t = tcp->resS;
- pi[pino].poc.resno0 = tcp->res_t;
- pi[pino].poc.resno1 = tcp->res_t+1;
- tcp->res_t+=1;
- incr_top=1;
- }else{
- pi[pino].poc.resno0 = tcp->res_t;
- pi[pino].poc.resno1 = tcp->res_t+1;
- tcp->res_t+=1;
- incr_top=0;
- }
- }else{
- pi[pino].poc.resno0 = tcp->res_t - 1;
- pi[pino].poc.resno1 = tcp->res_t;
- }
- }
- }
- break;
-
- case 'L':
- if (i > tppos){
- pi[pino].poc.layno0 = tcp->layS;
- pi[pino].poc.layno1 = tcp->layE;
- }else{
- if (tpnum == 0){
- tcp->lay_t = tcp->layS;
- pi[pino].poc.layno0 = tcp->lay_t;
- pi[pino].poc.layno1 = tcp->lay_t+1;
- tcp->lay_t+=1;
- }else{
- if (incr_top == 1){
- if(tcp->lay_t == tcp->layE){
- tcp->lay_t = tcp->layS;
- pi[pino].poc.layno0 = tcp->lay_t;
- pi[pino].poc.layno1 = tcp->lay_t+1;
- tcp->lay_t+=1;
- incr_top=1;
- }else{
- pi[pino].poc.layno0 = tcp->lay_t;
- pi[pino].poc.layno1 = tcp->lay_t+1;
- tcp->lay_t+=1;
- incr_top=0;
- }
- }else{
- pi[pino].poc.layno0 = tcp->lay_t - 1;
- pi[pino].poc.layno1 = tcp->lay_t;
- }
- }
- }
- break;
-
- case 'P':
- switch(tcp->prg){
- case LRCP:
- case RLCP:
- if (i > tppos){
- pi[pino].poc.precno0 = tcp->prcS;
- pi[pino].poc.precno1 = tcp->prcE;
- }else{
- if (tpnum == 0){
- tcp->prc_t = tcp->prcS;
- pi[pino].poc.precno0 = tcp->prc_t;
- pi[pino].poc.precno1 = tcp->prc_t+1;
- tcp->prc_t+=1;
- }else{
- if (incr_top == 1){
- if(tcp->prc_t == tcp->prcE){
- tcp->prc_t = tcp->prcS;
- pi[pino].poc.precno0 = tcp->prc_t;
- pi[pino].poc.precno1 = tcp->prc_t+1;
- tcp->prc_t+=1;
- incr_top=1;
- }else{
- pi[pino].poc.precno0 = tcp->prc_t;
- pi[pino].poc.precno1 = tcp->prc_t+1;
- tcp->prc_t+=1;
- incr_top=0;
- }
- }else{
- pi[pino].poc.precno0 = tcp->prc_t - 1;
- pi[pino].poc.precno1 = tcp->prc_t;
- }
- }
- }
- break;
- default:
- if (i > tppos){
- pi[pino].poc.tx0 = tcp->txS;
- pi[pino].poc.ty0 = tcp->tyS;
- pi[pino].poc.tx1 = tcp->txE;
- pi[pino].poc.ty1 = tcp->tyE;
- }else{
- if (tpnum == 0){
- tcp->tx0_t = tcp->txS;
- tcp->ty0_t = tcp->tyS;
- pi[pino].poc.tx0 = tcp->tx0_t;
- pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx);
- pi[pino].poc.ty0 = tcp->ty0_t;
- pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy);
- tcp->tx0_t = pi[pino].poc.tx1;
- tcp->ty0_t = pi[pino].poc.ty1;
- }else{
- if (incr_top == 1){
- if(tcp->tx0_t >= tcp->txE){
- if(tcp->ty0_t >= tcp->tyE){
- tcp->ty0_t = tcp->tyS;
- pi[pino].poc.ty0 = tcp->ty0_t;
- pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy);
- tcp->ty0_t = pi[pino].poc.ty1;
- incr_top=1;resetX=1;
- }else{
- pi[pino].poc.ty0 = tcp->ty0_t;
- pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy);
- tcp->ty0_t = pi[pino].poc.ty1;
- incr_top=0;resetX=1;
- }
- if(resetX==1){
- tcp->tx0_t = tcp->txS;
- pi[pino].poc.tx0 = tcp->tx0_t;
- pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx);
- tcp->tx0_t = pi[pino].poc.tx1;
- }
- }else{
- pi[pino].poc.tx0 = tcp->tx0_t;
- pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx);
- tcp->tx0_t = pi[pino].poc.tx1;
- pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy);
- pi[pino].poc.ty1 = tcp->ty0_t ;
- incr_top=0;
- }
- }else{
- pi[pino].poc.tx0 = tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx);
- pi[pino].poc.tx1 = tcp->tx0_t ;
- pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy);
- pi[pino].poc.ty1 = tcp->ty0_t ;
- }
- }
- }
- break;
- }
- break;
- }
- }
- }
- }
- return OPJ_FALSE;
-}
-
diff --git a/extern/libopenjpeg/pi.h b/extern/libopenjpeg/pi.h
deleted file mode 100644
index cf9135fd1f5..00000000000
--- a/extern/libopenjpeg/pi.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __PI_H
-#define __PI_H
-/**
-@file pi.h
-@brief Implementation of a packet iterator (PI)
-
-The functions in PI.C have for goal to realize a packet iterator that permits to get the next
-packet following the progression order and change of it. The functions in PI.C are used
-by some function in T2.C.
-*/
-
-/** @defgroup PI PI - Implementation of a packet iterator */
-/*@{*/
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_pi_resolution {
- int pdx, pdy;
- int pw, ph;
-} opj_pi_resolution_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_pi_comp {
- int dx, dy;
- /** number of resolution levels */
- int numresolutions;
- opj_pi_resolution_t *resolutions;
-} opj_pi_comp_t;
-
-/**
-Packet iterator
-*/
-typedef struct opj_pi_iterator {
- /** Enabling Tile part generation*/
- char tp_on;
- /** precise if the packet has been already used (usefull for progression order change) */
- short int *include;
- /** layer step used to localize the packet in the include vector */
- int step_l;
- /** resolution step used to localize the packet in the include vector */
- int step_r;
- /** component step used to localize the packet in the include vector */
- int step_c;
- /** precinct step used to localize the packet in the include vector */
- int step_p;
- /** component that identify the packet */
- int compno;
- /** resolution that identify the packet */
- int resno;
- /** precinct that identify the packet */
- int precno;
- /** layer that identify the packet */
- int layno;
- /** 0 if the first packet */
- int first;
- /** progression order change information */
- opj_poc_t poc;
- /** number of components in the image */
- int numcomps;
- /** Components*/
- opj_pi_comp_t *comps;
- int tx0, ty0, tx1, ty1;
- int x, y, dx, dy;
-} opj_pi_iterator_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a packet iterator for Encoder
-@param image Raw image for which the packets will be listed
-@param cp Coding parameters
-@param tileno Number that identifies the tile for which to list the packets
-@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass
-@return Returns a packet iterator that points to the first packet of the tile
-@see pi_destroy
-*/
-opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, int tileno,J2K_T2_MODE t2_mode);
-/**
-Modify the packet iterator for enabling tile part generation
-@param pi Handle to the packet iterator generated in pi_initialise_encode
-@param cp Coding parameters
-@param tileno Number that identifies the tile for which to list the packets
-@param pino Iterator index for pi
-@param tpnum Tile part number of the current tile
-@param tppos The position of the tile part flag in the progression order
-@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass
-@param cur_totnum_tp The total number of tile parts in the current tile
-@return Returns true if an error is detected
-*/
-opj_bool pi_create_encode(opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp);
-/**
-Create a packet iterator for Decoder
-@param image Raw image for which the packets will be listed
-@param cp Coding parameters
-@param tileno Number that identifies the tile for which to list the packets
-@return Returns a packet iterator that points to the first packet of the tile
-@see pi_destroy
-*/
-opj_pi_iterator_t *pi_create_decode(opj_image_t * image, opj_cp_t * cp, int tileno);
-
-/**
-Destroy a packet iterator
-@param pi Previously created packet iterator
-@param cp Coding parameters
-@param tileno Number that identifies the tile for which the packets were listed
-@see pi_create
-*/
-void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno);
-
-/**
-Modify the packet iterator to point to the next packet
-@param pi Packet iterator to modify
-@return Returns false if pi pointed to the last packet or else returns true
-*/
-opj_bool pi_next(opj_pi_iterator_t * pi);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __PI_H */
diff --git a/extern/libopenjpeg/ppix_manager.c b/extern/libopenjpeg/ppix_manager.c
deleted file mode 100644
index 58d324ceb41..00000000000
--- a/extern/libopenjpeg/ppix_manager.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * $Id: ppix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
- *
- * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2011, Professor Benoit Macq
- * Copyright (c) 2003-2004, Yannick Verschueren
- * Copyright (c) 2010-2011, Kaori Hagihara
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*! \file
- * \brief Modification of jpip.c from 2KAN indexer
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include "opj_includes.h"
-
-/*
- * Write faix box of ppix
- *
- * @param[in] coff offset of j2k codestream
- * @param[in] compno component number
- * @param[in] cstr_info codestream information
- * @param[in] EPHused true if if EPH option used
- * @param[in] j2klen length of j2k codestream
- * @param[in] cio file output handle
- * @return length of faix box
- */
-int write_ppixfaix( int coff, int compno, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio);
-
-int write_ppix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio)
-{
- int len, lenp, compno, i;
- opj_jp2_box_t *box;
-
- /* printf("cstr_info.packno %d\n", cstr_info.packno); //NMAX? */
-
- lenp = -1;
- box = (opj_jp2_box_t *)opj_calloc( cstr_info.numcomps, sizeof(opj_jp2_box_t));
-
- for (i=0;i<2;i++){
- if (i) cio_seek( cio, lenp);
-
- lenp = cio_tell( cio);
- cio_skip( cio, 4); /* L [at the end] */
- cio_write( cio, JPIP_PPIX, 4); /* PPIX */
-
- write_manf( i, cstr_info.numcomps, box, cio);
-
- for (compno=0; compno<cstr_info.numcomps; compno++){
- box[compno].length = write_ppixfaix( coff, compno, cstr_info, EPHused, j2klen, cio);
- box[compno].type = JPIP_FAIX;
- }
-
- len = cio_tell( cio)-lenp;
- cio_seek( cio, lenp);
- cio_write( cio, len, 4); /* L */
- cio_seek( cio, lenp+len);
- }
-
- opj_free(box);
-
- return len;
-}
-
-int write_ppixfaix( int coff, int compno, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio)
-{
- int len, lenp, tileno, version, i, nmax, size_of_coding; /* 4 or 8*/
- opj_tile_info_t *tile_Idx;
- opj_packet_info_t packet;
- int resno, precno, layno, num_packet;
- int numOfres, numOfprec, numOflayers;
- packet.end_pos = packet.end_ph_pos = packet.start_pos = -1;
- (void)EPHused; /* unused ? */
-
- if( j2klen > pow( 2, 32)){
- size_of_coding = 8;
- version = 1;
- }
- else{
- size_of_coding = 4;
- version = 0;
- }
-
- lenp = cio_tell( cio);
- cio_skip( cio, 4); /* L [at the end] */
- cio_write( cio, JPIP_FAIX, 4); /* FAIX */
- cio_write( cio, version, 1); /* Version 0 = 4 bytes */
-
- nmax = 0;
- for( i=0; i<=cstr_info.numdecompos[compno]; i++)
- nmax += cstr_info.tile[0].ph[i] * cstr_info.tile[0].pw[i] * cstr_info.numlayers;
-
- cio_write( cio, nmax, size_of_coding); /* NMAX */
- cio_write( cio, cstr_info.tw*cstr_info.th, size_of_coding); /* M */
-
- for( tileno=0; tileno<cstr_info.tw*cstr_info.th; tileno++){
- tile_Idx = &cstr_info.tile[ tileno];
-
- num_packet=0;
- numOfres = cstr_info.numdecompos[compno] + 1;
-
- for( resno=0; resno<numOfres ; resno++){
- numOfprec = tile_Idx->pw[resno]*tile_Idx->ph[resno];
- for( precno=0; precno<numOfprec; precno++){
- numOflayers = cstr_info.numlayers;
- for( layno=0; layno<numOflayers; layno++){
-
- switch ( cstr_info.prog){
- case LRCP:
- packet = tile_Idx->packet[ ((layno*numOfres+resno)*cstr_info.numcomps+compno)*numOfprec+precno];
- break;
- case RLCP:
- packet = tile_Idx->packet[ ((resno*numOflayers+layno)*cstr_info.numcomps+compno)*numOfprec+precno];
- break;
- case RPCL:
- packet = tile_Idx->packet[ ((resno*numOfprec+precno)*cstr_info.numcomps+compno)*numOflayers+layno];
- break;
- case PCRL:
- packet = tile_Idx->packet[ ((precno*cstr_info.numcomps+compno)*numOfres+resno)*numOflayers + layno];
- break;
- case CPRL:
- packet = tile_Idx->packet[ ((compno*numOfprec+precno)*numOfres+resno)*numOflayers + layno];
- break;
- default:
- fprintf( stderr, "failed to ppix indexing\n");
- }
-
- cio_write( cio, packet.start_pos-coff, size_of_coding); /* start position */
- cio_write( cio, packet.end_pos-packet.start_pos+1, size_of_coding); /* length */
-
- num_packet++;
- }
- }
- }
-
- while( num_packet < nmax){ /* PADDING */
- cio_write( cio, 0, size_of_coding); /* start position */
- cio_write( cio, 0, size_of_coding); /* length */
- num_packet++;
- }
- }
-
- len = cio_tell( cio)-lenp;
- cio_seek( cio, lenp);
- cio_write( cio, len, 4); /* L */
- cio_seek( cio, lenp+len);
-
- return len;
-}
diff --git a/extern/libopenjpeg/raw.c b/extern/libopenjpeg/raw.c
deleted file mode 100644
index 3d231bfdc6b..00000000000
--- a/extern/libopenjpeg/raw.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "opj_includes.h"
-
-/*
-==========================================================
- local functions
-==========================================================
-*/
-
-
-/*
-==========================================================
- RAW encoding interface
-==========================================================
-*/
-
-opj_raw_t* raw_create(void) {
- opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t));
- return raw;
-}
-
-void raw_destroy(opj_raw_t *raw) {
- if(raw) {
- opj_free(raw);
- }
-}
-
-int raw_numbytes(opj_raw_t *raw) {
- return raw->bp - raw->start;
-}
-
-void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len) {
- raw->start = bp;
- raw->lenmax = len;
- raw->len = 0;
- raw->c = 0;
- raw->ct = 0;
-}
-
-int raw_decode(opj_raw_t *raw) {
- int d;
- if (raw->ct == 0) {
- raw->ct = 8;
- if (raw->len == raw->lenmax) {
- raw->c = 0xff;
- } else {
- if (raw->c == 0xff) {
- raw->ct = 7;
- }
- raw->c = *(raw->start + raw->len);
- raw->len++;
- }
- }
- raw->ct--;
- d = (raw->c >> raw->ct) & 0x01;
-
- return d;
-}
-
diff --git a/extern/libopenjpeg/raw.h b/extern/libopenjpeg/raw.h
deleted file mode 100644
index 3c4b372f3f6..00000000000
--- a/extern/libopenjpeg/raw.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __RAW_H
-#define __RAW_H
-/**
-@file raw.h
-@brief Implementation of operations for raw encoding (RAW)
-
-The functions in RAW.C have for goal to realize the operation of raw encoding linked
-with the corresponding mode switch.
-*/
-
-/** @defgroup RAW RAW - Implementation of operations for raw encoding */
-/*@{*/
-
-/**
-RAW encoding operations
-*/
-typedef struct opj_raw {
- /** temporary buffer where bits are coded or decoded */
- unsigned char c;
- /** number of bits already read or free to write */
- unsigned int ct;
- /** maximum length to decode */
- unsigned int lenmax;
- /** length decoded */
- unsigned int len;
- /** pointer to the current position in the buffer */
- unsigned char *bp;
- /** pointer to the start of the buffer */
- unsigned char *start;
- /** pointer to the end of the buffer */
- unsigned char *end;
-} opj_raw_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a new RAW handle
-@return Returns a new RAW handle if successful, returns NULL otherwise
-*/
-opj_raw_t* raw_create(void);
-/**
-Destroy a previously created RAW handle
-@param raw RAW handle to destroy
-*/
-void raw_destroy(opj_raw_t *raw);
-/**
-Return the number of bytes written/read since initialisation
-@param raw RAW handle to destroy
-@return Returns the number of bytes already encoded
-*/
-int raw_numbytes(opj_raw_t *raw);
-/**
-Initialize the decoder
-@param raw RAW handle
-@param bp Pointer to the start of the buffer from which the bytes will be read
-@param len Length of the input buffer
-*/
-void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len);
-/**
-Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN
-@param raw RAW handle
-@return Returns the decoded symbol (0 or 1)
-*/
-int raw_decode(opj_raw_t *raw);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __RAW_H */
diff --git a/extern/libopenjpeg/t1.c b/extern/libopenjpeg/t1.c
deleted file mode 100644
index ed9cdc3fea6..00000000000
--- a/extern/libopenjpeg/t1.c
+++ /dev/null
@@ -1,1585 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "opj_includes.h"
-#include "t1_luts.h"
-
-/** @defgroup T1 T1 - Implementation of the tier-1 coding */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-static INLINE char t1_getctxno_zc(int f, int orient);
-static char t1_getctxno_sc(int f);
-static INLINE int t1_getctxno_mag(int f);
-static char t1_getspb(int f);
-static short t1_getnmsedec_sig(int x, int bitpos);
-static short t1_getnmsedec_ref(int x, int bitpos);
-static void t1_updateflags(flag_t *flagsp, int s, int stride);
-/**
-Encode significant pass
-*/
-static void t1_enc_sigpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int bpno,
- int one,
- int *nmsedec,
- char type,
- int vsc);
-/**
-Decode significant pass
-*/
-static INLINE void t1_dec_sigpass_step_raw(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf,
- int vsc);
-static INLINE void t1_dec_sigpass_step_mqc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf);
-static INLINE void t1_dec_sigpass_step_mqc_vsc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf,
- int vsc);
-/**
-Encode significant pass
-*/
-static void t1_enc_sigpass(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int *nmsedec,
- char type,
- int cblksty);
-/**
-Decode significant pass
-*/
-static void t1_dec_sigpass_raw(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int cblksty);
-static void t1_dec_sigpass_mqc(
- opj_t1_t *t1,
- int bpno,
- int orient);
-static void t1_dec_sigpass_mqc_vsc(
- opj_t1_t *t1,
- int bpno,
- int orient);
-/**
-Encode refinement pass
-*/
-static void t1_enc_refpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int bpno,
- int one,
- int *nmsedec,
- char type,
- int vsc);
-/**
-Decode refinement pass
-*/
-static INLINE void t1_dec_refpass_step_raw(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int poshalf,
- int neghalf,
- int vsc);
-static INLINE void t1_dec_refpass_step_mqc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int poshalf,
- int neghalf);
-static INLINE void t1_dec_refpass_step_mqc_vsc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int poshalf,
- int neghalf,
- int vsc);
-
-/**
-Encode refinement pass
-*/
-static void t1_enc_refpass(
- opj_t1_t *t1,
- int bpno,
- int *nmsedec,
- char type,
- int cblksty);
-/**
-Decode refinement pass
-*/
-static void t1_dec_refpass_raw(
- opj_t1_t *t1,
- int bpno,
- int cblksty);
-static void t1_dec_refpass_mqc(
- opj_t1_t *t1,
- int bpno);
-static void t1_dec_refpass_mqc_vsc(
- opj_t1_t *t1,
- int bpno);
-/**
-Encode clean-up pass
-*/
-static void t1_enc_clnpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int bpno,
- int one,
- int *nmsedec,
- int partial,
- int vsc);
-/**
-Decode clean-up pass
-*/
-static void t1_dec_clnpass_step_partial(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf);
-static void t1_dec_clnpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf);
-static void t1_dec_clnpass_step_vsc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf,
- int partial,
- int vsc);
-/**
-Encode clean-up pass
-*/
-static void t1_enc_clnpass(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int *nmsedec,
- int cblksty);
-/**
-Decode clean-up pass
-*/
-static void t1_dec_clnpass(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int cblksty);
-static double t1_getwmsedec(
- int nmsedec,
- int compno,
- int level,
- int orient,
- int bpno,
- int qmfbid,
- double stepsize,
- int numcomps,
- int mct);
-/**
-Encode 1 code-block
-@param t1 T1 handle
-@param cblk Code-block coding parameters
-@param orient
-@param compno Component number
-@param level
-@param qmfbid
-@param stepsize
-@param cblksty Code-block style
-@param numcomps
-@param mct
-@param tile
-*/
-static void t1_encode_cblk(
- opj_t1_t *t1,
- opj_tcd_cblk_enc_t* cblk,
- int orient,
- int compno,
- int level,
- int qmfbid,
- double stepsize,
- int cblksty,
- int numcomps,
- int mct,
- opj_tcd_tile_t * tile);
-/**
-Decode 1 code-block
-@param t1 T1 handle
-@param cblk Code-block coding parameters
-@param orient
-@param roishift Region of interest shifting value
-@param cblksty Code-block style
-*/
-static void t1_decode_cblk(
- opj_t1_t *t1,
- opj_tcd_cblk_dec_t* cblk,
- int orient,
- int roishift,
- int cblksty);
-
-/*@}*/
-
-/*@}*/
-
-/* ----------------------------------------------------------------------- */
-
-static char t1_getctxno_zc(int f, int orient) {
- return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];
-}
-
-static char t1_getctxno_sc(int f) {
- return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
-}
-
-static int t1_getctxno_mag(int f) {
- int tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG;
- int tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1;
- return (tmp2);
-}
-
-static char t1_getspb(int f) {
- return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
-}
-
-static short t1_getnmsedec_sig(int x, int bitpos) {
- if (bitpos > T1_NMSEDEC_FRACBITS) {
- return lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];
- }
-
- return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
-}
-
-static short t1_getnmsedec_ref(int x, int bitpos) {
- if (bitpos > T1_NMSEDEC_FRACBITS) {
- return lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];
- }
-
- return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
-}
-
-static void t1_updateflags(flag_t *flagsp, int s, int stride) {
- flag_t *np = flagsp - stride;
- flag_t *sp = flagsp + stride;
-
- static const flag_t mod[] = {
- T1_SIG_S, T1_SIG_S|T1_SGN_S,
- T1_SIG_E, T1_SIG_E|T1_SGN_E,
- T1_SIG_W, T1_SIG_W|T1_SGN_W,
- T1_SIG_N, T1_SIG_N|T1_SGN_N
- };
-
- np[-1] |= T1_SIG_SE;
- np[0] |= mod[s];
- np[1] |= T1_SIG_SW;
-
- flagsp[-1] |= mod[s+2];
- flagsp[0] |= T1_SIG;
- flagsp[1] |= mod[s+4];
-
- sp[-1] |= T1_SIG_NE;
- sp[0] |= mod[s+6];
- sp[1] |= T1_SIG_NW;
-}
-
-static void t1_enc_sigpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int bpno,
- int one,
- int *nmsedec,
- char type,
- int vsc)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
- if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
- v = int_abs(*datap) & one ? 1 : 0;
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); /* ESSAI */
- if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
- mqc_bypass_enc(mqc, v);
- } else {
- mqc_encode(mqc, v);
- }
- if (v) {
- v = *datap < 0 ? 1 : 0;
- *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
- mqc_setcurctx(mqc, t1_getctxno_sc(flag)); /* ESSAI */
- if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
- mqc_bypass_enc(mqc, v);
- } else {
- mqc_encode(mqc, v ^ t1_getspb(flag));
- }
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- *flagsp |= T1_VISIT;
- }
-}
-
-static INLINE void t1_dec_sigpass_step_raw(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf,
- int vsc)
-{
- int v, flag;
- opj_raw_t *raw = t1->raw; /* RAW component */
-
- OPJ_ARG_NOT_USED(orient);
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
- if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
- if (raw_decode(raw)) {
- v = raw_decode(raw); /* ESSAI */
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- *flagsp |= T1_VISIT;
- }
-} /* VSC and BYPASS by Antonin */
-
-static INLINE void t1_dec_sigpass_step_mqc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = *flagsp;
- if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
- if (mqc_decode(mqc)) {
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- v = mqc_decode(mqc) ^ t1_getspb(flag);
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- *flagsp |= T1_VISIT;
- }
-} /* VSC and BYPASS by Antonin */
-
-static INLINE void t1_dec_sigpass_step_mqc_vsc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf,
- int vsc)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
- if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
- if (mqc_decode(mqc)) {
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- v = mqc_decode(mqc) ^ t1_getspb(flag);
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- *flagsp |= T1_VISIT;
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_enc_sigpass(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int *nmsedec,
- char type,
- int cblksty)
-{
- int i, j, k, one, vsc;
- *nmsedec = 0;
- one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- for (j = k; j < k + 4 && j < t1->h; ++j) {
- vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
- t1_enc_sigpass_step(
- t1,
- &t1->flags[((j+1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- orient,
- bpno,
- one,
- nmsedec,
- type,
- vsc);
- }
- }
- }
-}
-
-static void t1_dec_sigpass_raw(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int cblksty)
-{
- int i, j, k, one, half, oneplushalf, vsc;
- one = 1 << bpno;
- half = one >> 1;
- oneplushalf = one | half;
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- for (j = k; j < k + 4 && j < t1->h; ++j) {
- vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
- t1_dec_sigpass_step_raw(
- t1,
- &t1->flags[((j+1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- orient,
- oneplushalf,
- vsc);
- }
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_dec_sigpass_mqc(
- opj_t1_t *t1,
- int bpno,
- int orient)
-{
- int i, j, k, one, half, oneplushalf;
- int *data1 = t1->data;
- flag_t *flags1 = &t1->flags[1];
- one = 1 << bpno;
- half = one >> 1;
- oneplushalf = one | half;
- for (k = 0; k < (t1->h & ~3); k += 4) {
- for (i = 0; i < t1->w; ++i) {
- int *data2 = data1 + i;
- flag_t *flags2 = flags1 + i;
- flags2 += t1->flags_stride;
- t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- }
- data1 += t1->w << 2;
- flags1 += t1->flags_stride << 2;
- }
- for (i = 0; i < t1->w; ++i) {
- int *data2 = data1 + i;
- flag_t *flags2 = flags1 + i;
- for (j = k; j < t1->h; ++j) {
- flags2 += t1->flags_stride;
- t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_dec_sigpass_mqc_vsc(
- opj_t1_t *t1,
- int bpno,
- int orient)
-{
- int i, j, k, one, half, oneplushalf, vsc;
- one = 1 << bpno;
- half = one >> 1;
- oneplushalf = one | half;
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- for (j = k; j < k + 4 && j < t1->h; ++j) {
- vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
- t1_dec_sigpass_step_mqc_vsc(
- t1,
- &t1->flags[((j+1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- orient,
- oneplushalf,
- vsc);
- }
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_enc_refpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int bpno,
- int one,
- int *nmsedec,
- char type,
- int vsc)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
- if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
- *nmsedec += t1_getnmsedec_ref(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
- v = int_abs(*datap) & one ? 1 : 0;
- mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
- if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
- mqc_bypass_enc(mqc, v);
- } else {
- mqc_encode(mqc, v);
- }
- *flagsp |= T1_REFINE;
- }
-}
-
-static INLINE void t1_dec_refpass_step_raw(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int poshalf,
- int neghalf,
- int vsc)
-{
- int v, t, flag;
-
- opj_raw_t *raw = t1->raw; /* RAW component */
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
- if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
- v = raw_decode(raw);
- t = v ? poshalf : neghalf;
- *datap += *datap < 0 ? -t : t;
- *flagsp |= T1_REFINE;
- }
-} /* VSC and BYPASS by Antonin */
-
-static INLINE void t1_dec_refpass_step_mqc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int poshalf,
- int neghalf)
-{
- int v, t, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = *flagsp;
- if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
- mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
- v = mqc_decode(mqc);
- t = v ? poshalf : neghalf;
- *datap += *datap < 0 ? -t : t;
- *flagsp |= T1_REFINE;
- }
-} /* VSC and BYPASS by Antonin */
-
-static INLINE void t1_dec_refpass_step_mqc_vsc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int poshalf,
- int neghalf,
- int vsc)
-{
- int v, t, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
- if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
- mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
- v = mqc_decode(mqc);
- t = v ? poshalf : neghalf;
- *datap += *datap < 0 ? -t : t;
- *flagsp |= T1_REFINE;
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_enc_refpass(
- opj_t1_t *t1,
- int bpno,
- int *nmsedec,
- char type,
- int cblksty)
-{
- int i, j, k, one, vsc;
- *nmsedec = 0;
- one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- for (j = k; j < k + 4 && j < t1->h; ++j) {
- vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
- t1_enc_refpass_step(
- t1,
- &t1->flags[((j+1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- bpno,
- one,
- nmsedec,
- type,
- vsc);
- }
- }
- }
-}
-
-static void t1_dec_refpass_raw(
- opj_t1_t *t1,
- int bpno,
- int cblksty)
-{
- int i, j, k, one, poshalf, neghalf;
- int vsc;
- one = 1 << bpno;
- poshalf = one >> 1;
- neghalf = bpno > 0 ? -poshalf : -1;
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- for (j = k; j < k + 4 && j < t1->h; ++j) {
- vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
- t1_dec_refpass_step_raw(
- t1,
- &t1->flags[((j+1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- poshalf,
- neghalf,
- vsc);
- }
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_dec_refpass_mqc(
- opj_t1_t *t1,
- int bpno)
-{
- int i, j, k, one, poshalf, neghalf;
- int *data1 = t1->data;
- flag_t *flags1 = &t1->flags[1];
- one = 1 << bpno;
- poshalf = one >> 1;
- neghalf = bpno > 0 ? -poshalf : -1;
- for (k = 0; k < (t1->h & ~3); k += 4) {
- for (i = 0; i < t1->w; ++i) {
- int *data2 = data1 + i;
- flag_t *flags2 = flags1 + i;
- flags2 += t1->flags_stride;
- t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
- data2 += t1->w;
- }
- data1 += t1->w << 2;
- flags1 += t1->flags_stride << 2;
- }
- for (i = 0; i < t1->w; ++i) {
- int *data2 = data1 + i;
- flag_t *flags2 = flags1 + i;
- for (j = k; j < t1->h; ++j) {
- flags2 += t1->flags_stride;
- t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
- data2 += t1->w;
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_dec_refpass_mqc_vsc(
- opj_t1_t *t1,
- int bpno)
-{
- int i, j, k, one, poshalf, neghalf;
- int vsc;
- one = 1 << bpno;
- poshalf = one >> 1;
- neghalf = bpno > 0 ? -poshalf : -1;
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- for (j = k; j < k + 4 && j < t1->h; ++j) {
- vsc = ((j == k + 3 || j == t1->h - 1)) ? 1 : 0;
- t1_dec_refpass_step_mqc_vsc(
- t1,
- &t1->flags[((j+1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- poshalf,
- neghalf,
- vsc);
- }
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_enc_clnpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int bpno,
- int one,
- int *nmsedec,
- int partial,
- int vsc)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
- if (partial) {
- goto LABEL_PARTIAL;
- }
- if (!(*flagsp & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
- v = int_abs(*datap) & one ? 1 : 0;
- mqc_encode(mqc, v);
- if (v) {
-LABEL_PARTIAL:
- *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- v = *datap < 0 ? 1 : 0;
- mqc_encode(mqc, v ^ t1_getspb(flag));
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- }
- *flagsp &= ~T1_VISIT;
-}
-
-static void t1_dec_clnpass_step_partial(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf)
-{
- int v, flag;
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- OPJ_ARG_NOT_USED(orient);
-
- flag = *flagsp;
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- v = mqc_decode(mqc) ^ t1_getspb(flag);
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- *flagsp &= ~T1_VISIT;
-} /* VSC and BYPASS by Antonin */
-
-static void t1_dec_clnpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = *flagsp;
- if (!(flag & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
- if (mqc_decode(mqc)) {
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- v = mqc_decode(mqc) ^ t1_getspb(flag);
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- }
- *flagsp &= ~T1_VISIT;
-} /* VSC and BYPASS by Antonin */
-
-static void t1_dec_clnpass_step_vsc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf,
- int partial,
- int vsc)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
- if (partial) {
- goto LABEL_PARTIAL;
- }
- if (!(flag & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
- if (mqc_decode(mqc)) {
-LABEL_PARTIAL:
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- v = mqc_decode(mqc) ^ t1_getspb(flag);
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- }
- *flagsp &= ~T1_VISIT;
-}
-
-static void t1_enc_clnpass(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int *nmsedec,
- int cblksty)
-{
- int i, j, k, one, agg, runlen, vsc;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- *nmsedec = 0;
- one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- if (k + 3 < t1->h) {
- if (cblksty & J2K_CCP_CBLKSTY_VSC) {
- agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || (MACRO_t1_flags(1 + k + 3,1 + i)
- & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
- } else {
- agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
- }
- } else {
- agg = 0;
- }
- if (agg) {
- for (runlen = 0; runlen < 4; ++runlen) {
- if (int_abs(t1->data[((k + runlen)*t1->w) + i]) & one)
- break;
- }
- mqc_setcurctx(mqc, T1_CTXNO_AGG);
- mqc_encode(mqc, runlen != 4);
- if (runlen == 4) {
- continue;
- }
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- mqc_encode(mqc, runlen >> 1);
- mqc_encode(mqc, runlen & 1);
- } else {
- runlen = 0;
- }
- for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
- vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
- t1_enc_clnpass_step(
- t1,
- &t1->flags[((j+1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- orient,
- bpno,
- one,
- nmsedec,
- agg && (j == k + runlen),
- vsc);
- }
- }
- }
-}
-
-static void t1_dec_clnpass(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int cblksty)
-{
- int i, j, k, one, half, oneplushalf, agg, runlen, vsc;
- int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- one = 1 << bpno;
- half = one >> 1;
- oneplushalf = one | half;
- if (cblksty & J2K_CCP_CBLKSTY_VSC) {
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- if (k + 3 < t1->h) {
- agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || (MACRO_t1_flags(1 + k + 3,1 + i)
- & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
- } else {
- agg = 0;
- }
- if (agg) {
- mqc_setcurctx(mqc, T1_CTXNO_AGG);
- if (!mqc_decode(mqc)) {
- continue;
- }
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- runlen = mqc_decode(mqc);
- runlen = (runlen << 1) | mqc_decode(mqc);
- } else {
- runlen = 0;
- }
- for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
- vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
- t1_dec_clnpass_step_vsc(
- t1,
- &t1->flags[((j+1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- orient,
- oneplushalf,
- agg && (j == k + runlen),
- vsc);
- }
- }
- }
- } else {
- int *data1 = t1->data;
- flag_t *flags1 = &t1->flags[1];
- for (k = 0; k < (t1->h & ~3); k += 4) {
- for (i = 0; i < t1->w; ++i) {
- int *data2 = data1 + i;
- flag_t *flags2 = flags1 + i;
- agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
- if (agg) {
- mqc_setcurctx(mqc, T1_CTXNO_AGG);
- if (!mqc_decode(mqc)) {
- continue;
- }
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- runlen = mqc_decode(mqc);
- runlen = (runlen << 1) | mqc_decode(mqc);
- flags2 += runlen * t1->flags_stride;
- data2 += runlen * t1->w;
- for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
- flags2 += t1->flags_stride;
- if (agg && (j == k + runlen)) {
- t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf);
- } else {
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- }
- data2 += t1->w;
- }
- } else {
- flags2 += t1->flags_stride;
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- }
- }
- data1 += t1->w << 2;
- flags1 += t1->flags_stride << 2;
- }
- for (i = 0; i < t1->w; ++i) {
- int *data2 = data1 + i;
- flag_t *flags2 = flags1 + i;
- for (j = k; j < t1->h; ++j) {
- flags2 += t1->flags_stride;
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- }
- }
- }
-
- if (segsym) {
- int v = 0;
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- v = mqc_decode(mqc);
- v = (v << 1) | mqc_decode(mqc);
- v = (v << 1) | mqc_decode(mqc);
- v = (v << 1) | mqc_decode(mqc);
- /*
- if (v!=0xa) {
- opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);
- }
- */
- }
-} /* VSC and BYPASS by Antonin */
-
-
-/** mod fixed_quality */
-static double t1_getwmsedec(
- int nmsedec,
- int compno,
- int level,
- int orient,
- int bpno,
- int qmfbid,
- double stepsize,
- int numcomps,
- int mct)
-{
- double w1, w2, wmsedec;
- if (qmfbid == 1) {
- w1 = (mct && numcomps==3) ? mct_getnorm(compno) : 1.0;
- w2 = dwt_getnorm(level, orient);
- } else { /* if (qmfbid == 0) */
- w1 = (mct && numcomps==3) ? mct_getnorm_real(compno) : 1.0;
- w2 = dwt_getnorm_real(level, orient);
- }
- wmsedec = w1 * w2 * stepsize * (1 << bpno);
- wmsedec *= wmsedec * nmsedec / 8192.0;
-
- return wmsedec;
-}
-
-static opj_bool allocate_buffers(
- opj_t1_t *t1,
- int w,
- int h)
-{
- int datasize=w * h;
- int flagssize;
-
- if(datasize > t1->datasize){
- opj_aligned_free(t1->data);
- t1->data = (int*) opj_aligned_malloc(datasize * sizeof(int));
- if(!t1->data){
- return OPJ_FALSE;
- }
- t1->datasize=datasize;
- }
- memset(t1->data,0,datasize * sizeof(int));
-
- t1->flags_stride=w+2;
- flagssize=t1->flags_stride * (h+2);
-
- if(flagssize > t1->flagssize){
- opj_aligned_free(t1->flags);
- t1->flags = (flag_t*) opj_aligned_malloc(flagssize * sizeof(flag_t));
- if(!t1->flags){
- return OPJ_FALSE;
- }
- t1->flagssize=flagssize;
- }
- memset(t1->flags,0,flagssize * sizeof(flag_t));
-
- t1->w=w;
- t1->h=h;
-
- return OPJ_TRUE;
-}
-
-/** mod fixed_quality */
-static void t1_encode_cblk(
- opj_t1_t *t1,
- opj_tcd_cblk_enc_t* cblk,
- int orient,
- int compno,
- int level,
- int qmfbid,
- double stepsize,
- int cblksty,
- int numcomps,
- int mct,
- opj_tcd_tile_t * tile)
-{
- double cumwmsedec = 0.0;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- int passno, bpno, passtype;
- int nmsedec = 0;
- int i, max;
- char type = T1_TYPE_MQ;
- double tempwmsedec;
-
- max = 0;
- for (i = 0; i < t1->w * t1->h; ++i) {
- int tmp = abs(t1->data[i]);
- max = int_max(max, tmp);
- }
-
- cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0;
-
- bpno = cblk->numbps - 1;
- passtype = 2;
-
- mqc_resetstates(mqc);
- mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
- mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
- mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
- mqc_init_enc(mqc, cblk->data);
-
- for (passno = 0; bpno >= 0; ++passno) {
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- int correction = 3;
- type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
-
- switch (passtype) {
- case 0:
- t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty);
- break;
- case 1:
- t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty);
- break;
- case 2:
- t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty);
- /* code switch SEGMARK (i.e. SEGSYM) */
- if (cblksty & J2K_CCP_CBLKSTY_SEGSYM)
- mqc_segmark_enc(mqc);
- break;
- }
-
- /* fixed_quality */
- tempwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps, mct);
- cumwmsedec += tempwmsedec;
- tile->distotile += tempwmsedec;
-
- /* Code switch "RESTART" (i.e. TERMALL) */
- if ((cblksty & J2K_CCP_CBLKSTY_TERMALL) && !((passtype == 2) && (bpno - 1 < 0))) {
- if (type == T1_TYPE_RAW) {
- mqc_flush(mqc);
- correction = 1;
- /* correction = mqc_bypass_flush_enc(); */
- } else { /* correction = mqc_restart_enc(); */
- mqc_flush(mqc);
- correction = 1;
- }
- pass->term = 1;
- } else {
- if (((bpno < (cblk->numbps - 4) && (passtype > 0))
- || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) {
- if (type == T1_TYPE_RAW) {
- mqc_flush(mqc);
- correction = 1;
- /* correction = mqc_bypass_flush_enc(); */
- } else { /* correction = mqc_restart_enc(); */
- mqc_flush(mqc);
- correction = 1;
- }
- pass->term = 1;
- } else {
- pass->term = 0;
- }
- }
-
- if (++passtype == 3) {
- passtype = 0;
- bpno--;
- }
-
- if (pass->term && bpno > 0) {
- type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
- if (type == T1_TYPE_RAW)
- mqc_bypass_init_enc(mqc);
- else
- mqc_restart_init_enc(mqc);
- }
-
- pass->distortiondec = cumwmsedec;
- pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */
-
- /* Code-switch "RESET" */
- if (cblksty & J2K_CCP_CBLKSTY_RESET)
- mqc_reset_enc(mqc);
- }
-
- /* Code switch "ERTERM" (i.e. PTERM) */
- if (cblksty & J2K_CCP_CBLKSTY_PTERM)
- mqc_erterm_enc(mqc);
- else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY))
- mqc_flush(mqc);
-
- cblk->totalpasses = passno;
-
- for (passno = 0; passno<cblk->totalpasses; passno++) {
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- if (pass->rate > mqc_numbytes(mqc))
- pass->rate = mqc_numbytes(mqc);
- /*Preventing generation of FF as last data byte of a pass*/
- if((pass->rate>1) && (cblk->data[pass->rate - 1] == 0xFF)){
- pass->rate--;
- }
- pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
- }
-}
-
-static void t1_decode_cblk(
- opj_t1_t *t1,
- opj_tcd_cblk_dec_t* cblk,
- int orient,
- int roishift,
- int cblksty)
-{
- opj_raw_t *raw = t1->raw; /* RAW component */
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- int bpno, passtype;
- int segno, passno;
- char type = T1_TYPE_MQ; /* BYPASS mode */
-
- if(!allocate_buffers(
- t1,
- cblk->x1 - cblk->x0,
- cblk->y1 - cblk->y0))
- {
- return;
- }
-
- bpno = roishift + cblk->numbps - 1;
- passtype = 2;
-
- mqc_resetstates(mqc);
- mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
- mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
- mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
-
- for (segno = 0; segno < cblk->numsegs; ++segno) {
- opj_tcd_seg_t *seg = &cblk->segs[segno];
-
- /* BYPASS mode */
- type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
- /* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */
- if(seg->data == NULL){
- continue;
- }
- if (type == T1_TYPE_RAW) {
- raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len);
- } else {
- mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len);
- }
-
- for (passno = 0; passno < seg->numpasses; ++passno) {
- switch (passtype) {
- case 0:
- if (type == T1_TYPE_RAW) {
- t1_dec_sigpass_raw(t1, bpno+1, orient, cblksty);
- } else {
- if (cblksty & J2K_CCP_CBLKSTY_VSC) {
- t1_dec_sigpass_mqc_vsc(t1, bpno+1, orient);
- } else {
- t1_dec_sigpass_mqc(t1, bpno+1, orient);
- }
- }
- break;
- case 1:
- if (type == T1_TYPE_RAW) {
- t1_dec_refpass_raw(t1, bpno+1, cblksty);
- } else {
- if (cblksty & J2K_CCP_CBLKSTY_VSC) {
- t1_dec_refpass_mqc_vsc(t1, bpno+1);
- } else {
- t1_dec_refpass_mqc(t1, bpno+1);
- }
- }
- break;
- case 2:
- t1_dec_clnpass(t1, bpno+1, orient, cblksty);
- break;
- }
-
- if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
- mqc_resetstates(mqc);
- mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
- mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
- mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
- }
- if (++passtype == 3) {
- passtype = 0;
- bpno--;
- }
- }
- }
-}
-
-/* ----------------------------------------------------------------------- */
-
-opj_t1_t* t1_create(opj_common_ptr cinfo) {
- opj_t1_t *t1 = (opj_t1_t*) opj_malloc(sizeof(opj_t1_t));
- if(!t1)
- return NULL;
-
- t1->cinfo = cinfo;
- /* create MQC and RAW handles */
- t1->mqc = mqc_create();
- t1->raw = raw_create();
-
- t1->data=NULL;
- t1->flags=NULL;
- t1->datasize=0;
- t1->flagssize=0;
-
- return t1;
-}
-
-void t1_destroy(opj_t1_t *t1) {
- if(t1) {
- /* destroy MQC and RAW handles */
- mqc_destroy(t1->mqc);
- raw_destroy(t1->raw);
- opj_aligned_free(t1->data);
- opj_aligned_free(t1->flags);
- opj_free(t1);
- }
-}
-
-void t1_encode_cblks(
- opj_t1_t *t1,
- opj_tcd_tile_t *tile,
- opj_tcp_t *tcp)
-{
- int compno, resno, bandno, precno, cblkno;
-
- tile->distotile = 0; /* fixed_quality */
-
- for (compno = 0; compno < tile->numcomps; ++compno) {
- opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
- opj_tccp_t* tccp = &tcp->tccps[compno];
- int tile_w = tilec->x1 - tilec->x0;
-
- for (resno = 0; resno < tilec->numresolutions; ++resno) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- for (bandno = 0; bandno < res->numbands; ++bandno) {
- opj_tcd_band_t* restrict band = &res->bands[bandno];
- int bandconst = 8192 * 8192 / ((int) floor(band->stepsize * 8192));
-
- for (precno = 0; precno < res->pw * res->ph; ++precno) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) {
- opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
- int* restrict datap;
- int* restrict tiledp;
- int cblk_w;
- int cblk_h;
- int i, j;
-
- int x = cblk->x0 - band->x0;
- int y = cblk->y0 - band->y0;
- if (band->bandno & 1) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x += pres->x1 - pres->x0;
- }
- if (band->bandno & 2) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- y += pres->y1 - pres->y0;
- }
-
- if(!allocate_buffers(
- t1,
- cblk->x1 - cblk->x0,
- cblk->y1 - cblk->y0))
- {
- return;
- }
-
- datap=t1->data;
- cblk_w = t1->w;
- cblk_h = t1->h;
-
- tiledp=&tilec->data[(y * tile_w) + x];
- if (tccp->qmfbid == 1) {
- for (j = 0; j < cblk_h; ++j) {
- for (i = 0; i < cblk_w; ++i) {
- int tmp = tiledp[(j * tile_w) + i];
- datap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS;
- }
- }
- } else { /* if (tccp->qmfbid == 0) */
- for (j = 0; j < cblk_h; ++j) {
- for (i = 0; i < cblk_w; ++i) {
- int tmp = tiledp[(j * tile_w) + i];
- datap[(j * cblk_w) + i] =
- fix_mul(
- tmp,
- bandconst) >> (11 - T1_NMSEDEC_FRACBITS);
- }
- }
- }
-
- t1_encode_cblk(
- t1,
- cblk,
- band->bandno,
- compno,
- tilec->numresolutions - 1 - resno,
- tccp->qmfbid,
- band->stepsize,
- tccp->cblksty,
- tile->numcomps,
- tcp->mct,
- tile);
-
- } /* cblkno */
- } /* precno */
- } /* bandno */
- } /* resno */
- } /* compno */
-}
-
-void t1_decode_cblks(
- opj_t1_t* t1,
- opj_tcd_tilecomp_t* tilec,
- opj_tccp_t* tccp)
-{
- int resno, bandno, precno, cblkno;
-
- int tile_w = tilec->x1 - tilec->x0;
-
- for (resno = 0; resno < tilec->numresolutions; ++resno) {
- opj_tcd_resolution_t* res = &tilec->resolutions[resno];
-
- for (bandno = 0; bandno < res->numbands; ++bandno) {
- opj_tcd_band_t* restrict band = &res->bands[bandno];
-
- for (precno = 0; precno < res->pw * res->ph; ++precno) {
- opj_tcd_precinct_t* precinct = &band->precincts[precno];
-
- for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) {
- opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno];
- int* restrict datap;
- int cblk_w, cblk_h;
- int x, y;
- int i, j;
-
- t1_decode_cblk(
- t1,
- cblk,
- band->bandno,
- tccp->roishift,
- tccp->cblksty);
-
- x = cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- if (band->bandno & 1) {
- opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
- x += pres->x1 - pres->x0;
- }
- if (band->bandno & 2) {
- opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
- y += pres->y1 - pres->y0;
- }
-
- datap=t1->data;
- cblk_w = t1->w;
- cblk_h = t1->h;
-
- if (tccp->roishift) {
- int thresh = 1 << tccp->roishift;
- for (j = 0; j < cblk_h; ++j) {
- for (i = 0; i < cblk_w; ++i) {
- int val = datap[(j * cblk_w) + i];
- int mag = abs(val);
- if (mag >= thresh) {
- mag >>= tccp->roishift;
- datap[(j * cblk_w) + i] = val < 0 ? -mag : mag;
- }
- }
- }
- }
-
- if (tccp->qmfbid == 1) {
- int* restrict tiledp = &tilec->data[(y * tile_w) + x];
- for (j = 0; j < cblk_h; ++j) {
- for (i = 0; i < cblk_w; ++i) {
- int tmp = datap[(j * cblk_w) + i];
- ((int*)tiledp)[(j * tile_w) + i] = tmp / 2;
- }
- }
- } else { /* if (tccp->qmfbid == 0) */
- float* restrict tiledp = (float*) &tilec->data[(y * tile_w) + x];
- for (j = 0; j < cblk_h; ++j) {
- float* restrict tiledp2 = tiledp;
- for (i = 0; i < cblk_w; ++i) {
- float tmp = *datap * band->stepsize;
- *tiledp2 = tmp;
- datap++;
- tiledp2++;
- }
- tiledp += tile_w;
- }
- }
- opj_free(cblk->data);
- opj_free(cblk->segs);
- } /* cblkno */
- opj_free(precinct->cblks.dec);
- precinct->cblks.dec = NULL;
- } /* precno */
- } /* bandno */
- } /* resno */
-}
-
diff --git a/extern/libopenjpeg/t1.h b/extern/libopenjpeg/t1.h
deleted file mode 100644
index 572ec88d2f6..00000000000
--- a/extern/libopenjpeg/t1.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __T1_H
-#define __T1_H
-/**
-@file t1.h
-@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1)
-
-The functions in T1.C have for goal to realize the tier-1 coding operation. The functions
-in T1.C are used by some function in TCD.C.
-*/
-
-/** @defgroup T1 T1 - Implementation of the tier-1 coding */
-/*@{*/
-
-/* ----------------------------------------------------------------------- */
-#define T1_NMSEDEC_BITS 7
-
-#define T1_SIG_NE 0x0001 /**< Context orientation : North-East direction */
-#define T1_SIG_SE 0x0002 /**< Context orientation : South-East direction */
-#define T1_SIG_SW 0x0004 /**< Context orientation : South-West direction */
-#define T1_SIG_NW 0x0008 /**< Context orientation : North-West direction */
-#define T1_SIG_N 0x0010 /**< Context orientation : North direction */
-#define T1_SIG_E 0x0020 /**< Context orientation : East direction */
-#define T1_SIG_S 0x0040 /**< Context orientation : South direction */
-#define T1_SIG_W 0x0080 /**< Context orientation : West direction */
-#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW)
-#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W)
-
-#define T1_SGN_N 0x0100
-#define T1_SGN_E 0x0200
-#define T1_SGN_S 0x0400
-#define T1_SGN_W 0x0800
-#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W)
-
-#define T1_SIG 0x1000
-#define T1_REFINE 0x2000
-#define T1_VISIT 0x4000
-
-#define T1_NUMCTXS_ZC 9
-#define T1_NUMCTXS_SC 5
-#define T1_NUMCTXS_MAG 3
-#define T1_NUMCTXS_AGG 1
-#define T1_NUMCTXS_UNI 1
-
-#define T1_CTXNO_ZC 0
-#define T1_CTXNO_SC (T1_CTXNO_ZC+T1_NUMCTXS_ZC)
-#define T1_CTXNO_MAG (T1_CTXNO_SC+T1_NUMCTXS_SC)
-#define T1_CTXNO_AGG (T1_CTXNO_MAG+T1_NUMCTXS_MAG)
-#define T1_CTXNO_UNI (T1_CTXNO_AGG+T1_NUMCTXS_AGG)
-#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI)
-
-#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1)
-
-#define T1_TYPE_MQ 0 /**< Normal coding using entropy coder */
-#define T1_TYPE_RAW 1 /**< No encoding the information is store under raw format in codestream (mode switch RAW)*/
-
-/* ----------------------------------------------------------------------- */
-
-typedef short flag_t;
-
-/**
-Tier-1 coding (coding of code-block coefficients)
-*/
-typedef struct opj_t1 {
- /** codec context */
- opj_common_ptr cinfo;
-
- /** MQC component */
- opj_mqc_t *mqc;
- /** RAW component */
- opj_raw_t *raw;
-
- int *data;
- flag_t *flags;
- int w;
- int h;
- int datasize;
- int flagssize;
- int flags_stride;
-} opj_t1_t;
-
-#define MACRO_t1_flags(x,y) t1->flags[((x)*(t1->flags_stride))+(y)]
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a new T1 handle
-and initialize the look-up tables of the Tier-1 coder/decoder
-@return Returns a new T1 handle if successful, returns NULL otherwise
-@see t1_init_luts
-*/
-opj_t1_t* t1_create(opj_common_ptr cinfo);
-/**
-Destroy a previously created T1 handle
-@param t1 T1 handle to destroy
-*/
-void t1_destroy(opj_t1_t *t1);
-/**
-Encode the code-blocks of a tile
-@param t1 T1 handle
-@param tile The tile to encode
-@param tcp Tile coding parameters
-*/
-void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp);
-/**
-Decode the code-blocks of a tile
-@param t1 T1 handle
-@param tilec The tile to decode
-@param tccp Tile coding parameters
-*/
-void t1_decode_cblks(opj_t1_t* t1, opj_tcd_tilecomp_t* tilec, opj_tccp_t* tccp);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __T1_H */
diff --git a/extern/libopenjpeg/t1_luts.h b/extern/libopenjpeg/t1_luts.h
deleted file mode 100644
index e5e33f6656a..00000000000
--- a/extern/libopenjpeg/t1_luts.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/* This file was automatically generated by t1_generate_luts.c */
-
-static char lut_ctxno_zc[1024] = {
- 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 0, 3, 3, 6, 3, 6, 6, 8, 3, 6, 6, 8, 6, 8, 8, 8, 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8,
- 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
- 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
- 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
- 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
- 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
- 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
- 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8
-};
-
-static char lut_ctxno_sc[256] = {
- 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa,
- 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9,
- 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9,
- 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa,
- 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb,
- 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc,
- 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc,
- 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd
-};
-
-static char lut_spb[256] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0,
- 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1,
- 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-};
-
-static short lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0180, 0x0300, 0x0480, 0x0600, 0x0780, 0x0900, 0x0a80,
- 0x0c00, 0x0d80, 0x0f00, 0x1080, 0x1200, 0x1380, 0x1500, 0x1680,
- 0x1800, 0x1980, 0x1b00, 0x1c80, 0x1e00, 0x1f80, 0x2100, 0x2280,
- 0x2400, 0x2580, 0x2700, 0x2880, 0x2a00, 0x2b80, 0x2d00, 0x2e80,
- 0x3000, 0x3180, 0x3300, 0x3480, 0x3600, 0x3780, 0x3900, 0x3a80,
- 0x3c00, 0x3d80, 0x3f00, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680,
- 0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5100, 0x5280,
- 0x5400, 0x5580, 0x5700, 0x5880, 0x5a00, 0x5b80, 0x5d00, 0x5e80,
- 0x6000, 0x6180, 0x6300, 0x6480, 0x6600, 0x6780, 0x6900, 0x6a80,
- 0x6c00, 0x6d80, 0x6f00, 0x7080, 0x7200, 0x7380, 0x7500, 0x7680
-};
-
-static short lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080,
- 0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200,
- 0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400,
- 0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780,
- 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00,
- 0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180,
- 0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780,
- 0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00,
- 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x2680, 0x2780,
- 0x2880, 0x2980, 0x2b00, 0x2c00, 0x2d00, 0x2e80, 0x2f80, 0x3100,
- 0x3200, 0x3380, 0x3480, 0x3600, 0x3700, 0x3880, 0x3a00, 0x3b00,
- 0x3c80, 0x3e00, 0x3f80, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680,
- 0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5180, 0x5300,
- 0x5480, 0x5600, 0x5800, 0x5980, 0x5b00, 0x5d00, 0x5e80, 0x6080,
- 0x6200, 0x6400, 0x6580, 0x6780, 0x6900, 0x6b00, 0x6d00, 0x6e80,
- 0x7080, 0x7280, 0x7480, 0x7600, 0x7800, 0x7a00, 0x7c00, 0x7e00
-};
-
-static short lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {
- 0x1800, 0x1780, 0x1700, 0x1680, 0x1600, 0x1580, 0x1500, 0x1480,
- 0x1400, 0x1380, 0x1300, 0x1280, 0x1200, 0x1180, 0x1100, 0x1080,
- 0x1000, 0x0f80, 0x0f00, 0x0e80, 0x0e00, 0x0d80, 0x0d00, 0x0c80,
- 0x0c00, 0x0b80, 0x0b00, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880,
- 0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0500, 0x0480,
- 0x0400, 0x0380, 0x0300, 0x0280, 0x0200, 0x0180, 0x0100, 0x0080,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0080, 0x0100, 0x0180, 0x0200, 0x0280, 0x0300, 0x0380,
- 0x0400, 0x0480, 0x0500, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780,
- 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b00, 0x0b80,
- 0x0c00, 0x0c80, 0x0d00, 0x0d80, 0x0e00, 0x0e80, 0x0f00, 0x0f80,
- 0x1000, 0x1080, 0x1100, 0x1180, 0x1200, 0x1280, 0x1300, 0x1380,
- 0x1400, 0x1480, 0x1500, 0x1580, 0x1600, 0x1680, 0x1700, 0x1780
-};
-
-static short lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {
- 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x1b00, 0x1a80, 0x1980,
- 0x1880, 0x1780, 0x1700, 0x1600, 0x1500, 0x1480, 0x1380, 0x1300,
- 0x1200, 0x1180, 0x1080, 0x1000, 0x0f00, 0x0e80, 0x0e00, 0x0d00,
- 0x0c80, 0x0c00, 0x0b80, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880,
- 0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0580, 0x0500,
- 0x0480, 0x0400, 0x0400, 0x0380, 0x0300, 0x0300, 0x0280, 0x0280,
- 0x0200, 0x0200, 0x0180, 0x0180, 0x0100, 0x0100, 0x0100, 0x0080,
- 0x0080, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080,
- 0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200,
- 0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400,
- 0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780,
- 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00,
- 0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180,
- 0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780,
- 0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00
-};
-
diff --git a/extern/libopenjpeg/t2.c b/extern/libopenjpeg/t2.c
deleted file mode 100644
index 2585c3d56a6..00000000000
--- a/extern/libopenjpeg/t2.c
+++ /dev/null
@@ -1,825 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "opj_includes.h"
-#include <assert.h>
-
-/** @defgroup T2 T2 - Implementation of a tier-2 coding */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-static void t2_putcommacode(opj_bio_t *bio, int n);
-static int t2_getcommacode(opj_bio_t *bio);
-/**
-Variable length code for signalling delta Zil (truncation point)
-@param bio Bit Input/Output component
-@param n delta Zil
-*/
-static void t2_putnumpasses(opj_bio_t *bio, int n);
-static int t2_getnumpasses(opj_bio_t *bio);
-/**
-Encode a packet of a tile to a destination buffer
-@param tile Tile for which to write the packets
-@param tcp Tile coding parameters
-@param pi Packet identity
-@param dest Destination buffer
-@param len Length of the destination buffer
-@param cstr_info Codestream information structure
-@param tileno Number of the tile encoded
-@return
-*/
-static int t2_encode_packet(opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi, unsigned char *dest, int len, opj_codestream_info_t *cstr_info, int tileno);
-/**
-@param cblk
-@param index
-@param cblksty
-@param first
-*/
-static opj_bool t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty, int first);
-/**
-Decode a packet of a tile from a source buffer
-@param t2 T2 handle
-@param src Source buffer
-@param len Length of the source buffer
-@param tile Tile for which to write the packets
-@param tcp Tile coding parameters
-@param pi Packet identity
-@param pack_info Packet information
-@return
-*/
-static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile,
- opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info);
-
-/*@}*/
-
-/*@}*/
-
-/* ----------------------------------------------------------------------- */
-
-/* #define RESTART 0x04 */
-
-static void t2_putcommacode(opj_bio_t *bio, int n) {
- while (--n >= 0) {
- bio_write(bio, 1, 1);
- }
- bio_write(bio, 0, 1);
-}
-
-static int t2_getcommacode(opj_bio_t *bio) {
- int n;
- for (n = 0; bio_read(bio, 1); n++) {
- ;
- }
- return n;
-}
-
-static void t2_putnumpasses(opj_bio_t *bio, int n) {
- if (n == 1) {
- bio_write(bio, 0, 1);
- } else if (n == 2) {
- bio_write(bio, 2, 2);
- } else if (n <= 5) {
- bio_write(bio, 0xc | (n - 3), 4);
- } else if (n <= 36) {
- bio_write(bio, 0x1e0 | (n - 6), 9);
- } else if (n <= 164) {
- bio_write(bio, 0xff80 | (n - 37), 16);
- }
-}
-
-static int t2_getnumpasses(opj_bio_t *bio) {
- int n;
- if (!bio_read(bio, 1))
- return 1;
- if (!bio_read(bio, 1))
- return 2;
- if ((n = bio_read(bio, 2)) != 3)
- return (3 + n);
- if ((n = bio_read(bio, 5)) != 31)
- return (6 + n);
- return (37 + bio_read(bio, 7));
-}
-
-static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_iterator_t *pi, unsigned char *dest, int length, opj_codestream_info_t *cstr_info, int tileno) {
- int bandno, cblkno;
- unsigned char *c = dest;
-
- int compno = pi->compno; /* component value */
- int resno = pi->resno; /* resolution level value */
- int precno = pi->precno; /* precinct value */
- int layno = pi->layno; /* quality layer value */
-
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- opj_bio_t *bio = NULL; /* BIO component */
-
- /* <SOP 0xff91> */
- if (tcp->csty & J2K_CP_CSTY_SOP) {
- c[0] = 255;
- c[1] = 145;
- c[2] = 0;
- c[3] = 4;
- c[4] = (unsigned char)((tile->packno % 65536) / 256);
- c[5] = (unsigned char)((tile->packno % 65536) % 256);
- c += 6;
- }
- /* </SOP> */
-
- if (!layno) {
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- tgt_reset(prc->incltree);
- tgt_reset(prc->imsbtree);
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
- cblk->numpasses = 0;
- tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps);
- }
- }
- }
-
- bio = bio_create();
- bio_init_enc(bio, c, length);
- bio_write(bio, 1, 1); /* Empty header bit */
-
- /* Writing Packet header */
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
- opj_tcd_layer_t *layer = &cblk->layers[layno];
- if (!cblk->numpasses && layer->numpasses) {
- tgt_setvalue(prc->incltree, cblkno, layno);
- }
- }
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
- opj_tcd_layer_t *layer = &cblk->layers[layno];
- int increment = 0;
- int nump = 0;
- int len = 0, passno;
- /* cblk inclusion bits */
- if (!cblk->numpasses) {
- tgt_encode(bio, prc->incltree, cblkno, layno + 1);
- } else {
- bio_write(bio, layer->numpasses != 0, 1);
- }
- /* if cblk not included, go to the next cblk */
- if (!layer->numpasses) {
- continue;
- }
- /* if first instance of cblk --> zero bit-planes information */
- if (!cblk->numpasses) {
- cblk->numlenbits = 3;
- tgt_encode(bio, prc->imsbtree, cblkno, 999);
- }
- /* number of coding passes included */
- t2_putnumpasses(bio, layer->numpasses);
-
- /* computation of the increase of the length indicator and insertion in the header */
- for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) {
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- nump++;
- len += pass->len;
- if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
- increment = int_max(increment, int_floorlog2(len) + 1 - (cblk->numlenbits + int_floorlog2(nump)));
- len = 0;
- nump = 0;
- }
- }
- t2_putcommacode(bio, increment);
-
- /* computation of the new Length indicator */
- cblk->numlenbits += increment;
-
- /* insertion of the codeword segment length */
- for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) {
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- nump++;
- len += pass->len;
- if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
- bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump));
- len = 0;
- nump = 0;
- }
- }
- }
- }
-
- if (bio_flush(bio)) {
- bio_destroy(bio);
- return -999; /* modified to eliminate longjmp !! */
- }
-
- c += bio_numbytes(bio);
- bio_destroy(bio);
-
- /* <EPH 0xff92> */
- if (tcp->csty & J2K_CP_CSTY_EPH) {
- c[0] = 255;
- c[1] = 146;
- c += 2;
- }
- /* </EPH> */
-
- /* << INDEX */
- /* End of packet header position. Currently only represents the distance to start of packet
- // Will be updated later by incrementing with packet start value */
- if(cstr_info && cstr_info->index_write) {
- opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
- info_PK->end_ph_pos = (int)(c - dest);
- }
- /* INDEX >> */
-
- /* Writing the packet body */
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
- opj_tcd_layer_t *layer = &cblk->layers[layno];
- if (!layer->numpasses) {
- continue;
- }
- if (c + layer->len > dest + length) {
- return -999;
- }
-
- memcpy(c, layer->data, layer->len);
- cblk->numpasses += layer->numpasses;
- c += layer->len;
- /* << INDEX */
- if(cstr_info && cstr_info->index_write) {
- opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
- info_PK->disto += layer->disto;
- if (cstr_info->D_max < info_PK->disto) {
- cstr_info->D_max = info_PK->disto;
- }
- }
- /* INDEX >> */
- }
- }
-
- return (c - dest);
-}
-
-static opj_bool t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty, int first) {
- opj_tcd_seg_t* seg;
- opj_tcd_seg_t* segs;
- segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs, (index + 1) * sizeof(opj_tcd_seg_t));
-
- if (segs == NULL)
- {
- return OPJ_FALSE;
- }
- cblk->segs = segs;
-
- seg = &cblk->segs[index];
- seg->data = NULL;
- seg->dataindex = 0;
- seg->numpasses = 0;
- seg->len = 0;
- if (cblksty & J2K_CCP_CBLKSTY_TERMALL) {
- seg->maxpasses = 1;
- }
- else if (cblksty & J2K_CCP_CBLKSTY_LAZY) {
- if (first) {
- seg->maxpasses = 10;
- } else {
- seg->maxpasses = (((seg - 1)->maxpasses == 1) || ((seg - 1)->maxpasses == 10)) ? 2 : 1;
- }
- } else {
- seg->maxpasses = 109;
- }
-
- return OPJ_TRUE;
-}
-
-static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile,
- opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info) {
- int bandno, cblkno;
- unsigned char *c = src;
-
- opj_cp_t *cp = t2->cp;
-
- int compno = pi->compno; /* component value */
- int resno = pi->resno; /* resolution level value */
- int precno = pi->precno; /* precinct value */
- int layno = pi->layno; /* quality layer value */
-
- unsigned char *hd = NULL;
- int present;
-
- opj_bio_t *bio = NULL; /* BIO component */
-
- opj_tcd_resolution_t* res;
- assert(&tile->comps[compno] != NULL);
- res = &tile->comps[compno].resolutions[resno];
-
- if (layno == 0) {
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue;
-
- tgt_reset(prc->incltree);
- tgt_reset(prc->imsbtree);
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno];
- cblk->numsegs = 0;
- }
- }
- }
-
- /* SOP markers */
-
- if (tcp->csty & J2K_CP_CSTY_SOP) {
- if ((*c) != 0xff || (*(c + 1) != 0x91)) {
- opj_event_msg(t2->cinfo, EVT_WARNING, "Expected SOP marker\n");
- } else {
- c += 6;
- }
-
- /** TODO : check the Nsop value */
- }
-
- /*
- When the marker PPT/PPM is used the packet header are store in PPT/PPM marker
- This part deal with this caracteristic
- step 1: Read packet header in the saved structure
- step 2: Return to codestream for decoding
- */
-
- bio = bio_create();
-
- if (cp->ppm == 1) { /* PPM */
- hd = cp->ppm_data;
- bio_init_dec(bio, hd, cp->ppm_len);
- } else if (tcp->ppt == 1) { /* PPT */
- hd = tcp->ppt_data;
- bio_init_dec(bio, hd, tcp->ppt_len);
- } else { /* Normal Case */
- hd = c;
- bio_init_dec(bio, hd, src+len-hd);
- }
-
- present = bio_read(bio, 1);
-
- if (!present) {
- bio_inalign(bio);
- hd += bio_numbytes(bio);
- bio_destroy(bio);
-
- /* EPH markers */
-
- if (tcp->csty & J2K_CP_CSTY_EPH) {
- if ((*hd) != 0xff || (*(hd + 1) != 0x92)) {
- printf("Error : expected EPH marker\n");
- } else {
- hd += 2;
- }
- }
-
- /* << INDEX */
- /* End of packet header position. Currently only represents the distance to start of packet
- // Will be updated later by incrementing with packet start value*/
- if(pack_info) {
- pack_info->end_ph_pos = (int)(c - src);
- }
- /* INDEX >> */
-
- if (cp->ppm == 1) { /* PPM case */
- cp->ppm_len += cp->ppm_data-hd;
- cp->ppm_data = hd;
- return (c - src);
- }
- if (tcp->ppt == 1) { /* PPT case */
- tcp->ppt_len+=tcp->ppt_data-hd;
- tcp->ppt_data = hd;
- return (c - src);
- }
-
- return (hd - src);
- }
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue;
-
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- int included, increment, n, segno;
- opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno];
- /* if cblk not yet included before --> inclusion tagtree */
- if (!cblk->numsegs) {
- included = tgt_decode(bio, prc->incltree, cblkno, layno + 1);
- /* else one bit */
- } else {
- included = bio_read(bio, 1);
- }
- /* if cblk not included */
- if (!included) {
- cblk->numnewpasses = 0;
- continue;
- }
- /* if cblk not yet included --> zero-bitplane tagtree */
- if (!cblk->numsegs) {
- int i, numimsbs;
- for (i = 0; !tgt_decode(bio, prc->imsbtree, cblkno, i); i++) {
- ;
- }
- numimsbs = i - 1;
- cblk->numbps = band->numbps - numimsbs;
- cblk->numlenbits = 3;
- }
- /* number of coding passes */
- cblk->numnewpasses = t2_getnumpasses(bio);
- increment = t2_getcommacode(bio);
- /* length indicator increment */
- cblk->numlenbits += increment;
- segno = 0;
- if (!cblk->numsegs) {
- if (!t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 1))
- {
- opj_event_msg(t2->cinfo, EVT_ERROR, "Out of memory\n");
- bio_destroy(bio);
- return -999;
- }
- } else {
- segno = cblk->numsegs - 1;
- if (cblk->segs[segno].numpasses == cblk->segs[segno].maxpasses) {
- ++segno;
- if (!t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0))
- {
- opj_event_msg(t2->cinfo, EVT_ERROR, "Out of memory\n");
- bio_destroy(bio);
- return -999;
- }
- }
- }
- n = cblk->numnewpasses;
-
- do {
- cblk->segs[segno].numnewpasses = int_min(cblk->segs[segno].maxpasses - cblk->segs[segno].numpasses, n);
- cblk->segs[segno].newlen = bio_read(bio, cblk->numlenbits + int_floorlog2(cblk->segs[segno].numnewpasses));
- n -= cblk->segs[segno].numnewpasses;
- if (n > 0) {
- ++segno;
- if (!t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0))
- {
- opj_event_msg(t2->cinfo, EVT_ERROR, "Out of memory\n");
- bio_destroy(bio);
- return -999;
- }
- }
- } while (n > 0);
- }
- }
-
- if (bio_inalign(bio)) {
- bio_destroy(bio);
- return -999;
- }
-
- hd += bio_numbytes(bio);
- bio_destroy(bio);
-
- /* EPH markers */
- if (tcp->csty & J2K_CP_CSTY_EPH) {
- if ((*hd) != 0xff || (*(hd + 1) != 0x92)) {
- opj_event_msg(t2->cinfo, EVT_ERROR, "Expected EPH marker\n");
- return -999;
- } else {
- hd += 2;
- }
- }
-
- /* << INDEX */
- /* End of packet header position. Currently only represents the distance to start of packet
- // Will be updated later by incrementing with packet start value*/
- if(pack_info) {
- pack_info->end_ph_pos = (int)(hd - src);
- }
- /* INDEX >> */
-
- if (cp->ppm==1) {
- cp->ppm_len+=cp->ppm_data-hd;
- cp->ppm_data = hd;
- } else if (tcp->ppt == 1) {
- tcp->ppt_len+=tcp->ppt_data-hd;
- tcp->ppt_data = hd;
- } else {
- c=hd;
- }
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue;
-
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno];
- opj_tcd_seg_t *seg = NULL;
- if (!cblk->numnewpasses)
- continue;
- if (!cblk->numsegs) {
- seg = &cblk->segs[0];
- cblk->numsegs++;
- cblk->len = 0;
- } else {
- seg = &cblk->segs[cblk->numsegs - 1];
- if (seg->numpasses == seg->maxpasses) {
- seg++;
- cblk->numsegs++;
- }
- }
-
- do {
- if (c + seg->newlen > src + len) {
- return -999;
- }
-
-#ifdef USE_JPWL
- /* we need here a j2k handle to verify if making a check to
- the validity of cblocks parameters is selected from user (-W) */
-
- /* let's check that we are not exceeding */
- if ((cblk->len + seg->newlen) > 8192) {
- opj_event_msg(t2->cinfo, EVT_WARNING,
- "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
- seg->newlen, cblkno, precno, bandno, resno, compno);
- if (!JPWL_ASSUME) {
- opj_event_msg(t2->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return -999;
- }
- seg->newlen = 8192 - cblk->len;
- opj_event_msg(t2->cinfo, EVT_WARNING, " - truncating segment to %d\n", seg->newlen);
- break;
- };
-
-#endif /* USE_JPWL */
-
- cblk->data = (unsigned char*) opj_realloc(cblk->data, (cblk->len + seg->newlen) * sizeof(unsigned char));
- memcpy(cblk->data + cblk->len, c, seg->newlen);
- if (seg->numpasses == 0) {
- seg->data = &cblk->data;
- seg->dataindex = cblk->len;
- }
- c += seg->newlen;
- cblk->len += seg->newlen;
- seg->len += seg->newlen;
- seg->numpasses += seg->numnewpasses;
- cblk->numnewpasses -= seg->numnewpasses;
- if (cblk->numnewpasses > 0) {
- seg++;
- cblk->numsegs++;
- }
- } while (cblk->numnewpasses > 0);
- }
- }
-
- return (c - src);
-}
-
-/* ----------------------------------------------------------------------- */
-
-int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info,int tpnum, int tppos,int pino, J2K_T2_MODE t2_mode, int cur_totnum_tp){
- unsigned char *c = dest;
- int e = 0;
- int compno;
- opj_pi_iterator_t *pi = NULL;
- int poc;
- opj_image_t *image = t2->image;
- opj_cp_t *cp = t2->cp;
- opj_tcp_t *tcp = &cp->tcps[tileno];
- int pocno = cp->cinema == CINEMA4K_24? 2: 1;
- int maxcomp = cp->max_comp_size > 0 ? image->numcomps : 1;
-
- pi = pi_initialise_encode(image, cp, tileno, t2_mode);
- if(!pi) {
- /* TODO: throw an error */
- return -999;
- }
-
- if(t2_mode == THRESH_CALC ){ /* Calculating threshold */
- for(compno = 0; compno < maxcomp; compno++ ){
- for(poc = 0; poc < pocno ; poc++){
- int comp_len = 0;
- int tpnum = compno;
- if (pi_create_encode(pi, cp,tileno,poc,tpnum,tppos,t2_mode,cur_totnum_tp)) {
- opj_event_msg(t2->cinfo, EVT_ERROR, "Error initializing Packet Iterator\n");
- pi_destroy(pi, cp, tileno);
- return -999;
- }
- while (pi_next(&pi[poc])) {
- if (pi[poc].layno < maxlayers) {
- e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[poc], c, dest + len - c, cstr_info, tileno);
- comp_len = comp_len + e;
- if (e == -999) {
- break;
- } else {
- c += e;
- }
- }
- }
- if (e == -999) break;
- if (cp->max_comp_size){
- if (comp_len > cp->max_comp_size){
- e = -999;
- break;
- }
- }
- }
- if (e == -999) break;
- }
- }else{ /* t2_mode == FINAL_PASS */
- pi_create_encode(pi, cp,tileno,pino,tpnum,tppos,t2_mode,cur_totnum_tp);
- while (pi_next(&pi[pino])) {
- if (pi[pino].layno < maxlayers) {
- e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[pino], c, dest + len - c, cstr_info, tileno);
- if (e == -999) {
- break;
- } else {
- c += e;
- }
- /* INDEX >> */
- if(cstr_info) {
- if(cstr_info->index_write) {
- opj_tile_info_t *info_TL = &cstr_info->tile[tileno];
- opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno];
- if (!cstr_info->packno) {
- info_PK->start_pos = info_TL->end_header + 1;
- } else {
- info_PK->start_pos = ((cp->tp_on | tcp->POC)&& info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1;
- }
- info_PK->end_pos = info_PK->start_pos + e - 1;
- info_PK->end_ph_pos += info_PK->start_pos - 1; /* End of packet header which now only represents the distance
- // to start of packet is incremented by value of start of packet*/
- }
-
- cstr_info->packno++;
- }
- /* << INDEX */
- tile->packno++;
- }
- }
- }
-
- pi_destroy(pi, cp, tileno);
-
- if (e == -999) {
- return e;
- }
-
- return (c - dest);
-}
-
-int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info) {
- unsigned char *c = src;
- opj_pi_iterator_t *pi;
- int pino, e = 0;
- int n = 0, curtp = 0;
- int tp_start_packno;
-
- opj_image_t *image = t2->image;
- opj_cp_t *cp = t2->cp;
-
- /* create a packet iterator */
- pi = pi_create_decode(image, cp, tileno);
- if(!pi) {
- /* TODO: throw an error */
- return -999;
- }
-
- tp_start_packno = 0;
-
- for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) {
- while (pi_next(&pi[pino])) {
- if ((cp->layer==0) || (cp->layer>=((pi[pino].layno)+1))) {
- opj_packet_info_t *pack_info;
- if (cstr_info)
- pack_info = &cstr_info->tile[tileno].packet[cstr_info->packno];
- else
- pack_info = NULL;
- e = t2_decode_packet(t2, c, src + len - c, tile, &cp->tcps[tileno], &pi[pino], pack_info);
- } else {
- e = 0;
- }
- if(e == -999)
- {
- pi_destroy(pi, cp, tileno);
- return -999;
- }
- /* progression in resolution */
- image->comps[pi[pino].compno].resno_decoded =
- (e > 0) ?
- int_max(pi[pino].resno, image->comps[pi[pino].compno].resno_decoded)
- : image->comps[pi[pino].compno].resno_decoded;
- n++;
-
- /* INDEX >> */
- if(cstr_info) {
- opj_tile_info_t *info_TL = &cstr_info->tile[tileno];
- opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno];
- if (!cstr_info->packno) {
- info_PK->start_pos = info_TL->end_header + 1;
- } else if (info_TL->packet[cstr_info->packno-1].end_pos >= (int)cstr_info->tile[tileno].tp[curtp].tp_end_pos){ /* New tile part*/
- info_TL->tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; /* Number of packets in previous tile-part*/
- info_TL->tp[curtp].tp_start_pack = tp_start_packno;
- tp_start_packno = cstr_info->packno;
- curtp++;
- info_PK->start_pos = cstr_info->tile[tileno].tp[curtp].tp_end_header+1;
- } else {
- info_PK->start_pos = (cp->tp_on && info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1;
- }
- info_PK->end_pos = info_PK->start_pos + e - 1;
- info_PK->end_ph_pos += info_PK->start_pos - 1; /* End of packet header which now only represents the distance
- // to start of packet is incremented by value of start of packet*/
- cstr_info->packno++;
- }
- /* << INDEX */
-
- if (e == -999) { /* ADD */
- break;
- } else {
- c += e;
- }
- }
- }
- /* INDEX >> */
- if(cstr_info) {
- cstr_info->tile[tileno].tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; /* Number of packets in last tile-part*/
- cstr_info->tile[tileno].tp[curtp].tp_start_pack = tp_start_packno;
- }
- /* << INDEX */
-
- /* don't forget to release pi */
- pi_destroy(pi, cp, tileno);
-
- if (e == -999) {
- return e;
- }
-
- return (c - src);
-}
-
-/* ----------------------------------------------------------------------- */
-
-opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp) {
- /* create the tcd structure */
- opj_t2_t *t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t));
- if(!t2) return NULL;
- t2->cinfo = cinfo;
- t2->image = image;
- t2->cp = cp;
-
- return t2;
-}
-
-void t2_destroy(opj_t2_t *t2) {
- if(t2) {
- opj_free(t2);
- }
-}
-
-
-
-
-
diff --git a/extern/libopenjpeg/t2.h b/extern/libopenjpeg/t2.h
deleted file mode 100644
index 2151ba67f48..00000000000
--- a/extern/libopenjpeg/t2.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __T2_H
-#define __T2_H
-/**
-@file t2.h
-@brief Implementation of a tier-2 coding (packetization of code-block data) (T2)
-
-*/
-
-/** @defgroup T2 T2 - Implementation of a tier-2 coding */
-/*@{*/
-
-/**
-Tier-2 coding
-*/
-typedef struct opj_t2 {
- /** codec context */
- opj_common_ptr cinfo;
-
- /** Encoding: pointer to the src image. Decoding: pointer to the dst image. */
- opj_image_t *image;
- /** pointer to the image coding parameters */
- opj_cp_t *cp;
-} opj_t2_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-
-/**
-Encode the packets of a tile to a destination buffer
-@param t2 T2 handle
-@param tileno number of the tile encoded
-@param tile the tile for which to write the packets
-@param maxlayers maximum number of layers
-@param dest the destination buffer
-@param len the length of the destination buffer
-@param cstr_info Codestream information structure
-@param tpnum Tile part number of the current tile
-@param tppos The position of the tile part flag in the progression order
-@param pino
-@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass
-@param cur_totnum_tp The total number of tile parts in the current tile
-*/
-int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info,int tpnum, int tppos,int pino,J2K_T2_MODE t2_mode,int cur_totnum_tp);
-/**
-Decode the packets of a tile from a source buffer
-@param t2 T2 handle
-@param src the source buffer
-@param len length of the source buffer
-@param tileno number that identifies the tile for which to decode the packets
-@param tile tile for which to decode the packets
-@param cstr_info Codestream information structure
- */
-int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info);
-
-/**
-Create a T2 handle
-@param cinfo Codec context info
-@param image Source or destination image
-@param cp Image coding parameters
-@return Returns a new T2 handle if successful, returns NULL otherwise
-*/
-opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp);
-/**
-Destroy a T2 handle
-@param t2 T2 handle to destroy
-*/
-void t2_destroy(opj_t2_t *t2);
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __T2_H */
diff --git a/extern/libopenjpeg/tcd.c b/extern/libopenjpeg/tcd.c
deleted file mode 100644
index 62904eb2c65..00000000000
--- a/extern/libopenjpeg/tcd.c
+++ /dev/null
@@ -1,1601 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2006-2007, Parvatha Elangovan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#define _ISOC99_SOURCE /* lrintf is C99 */
-#include "opj_includes.h"
-#include <assert.h>
-
-void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) {
- int tileno, compno, resno, bandno, precno;/*, cblkno;*/
-
- fprintf(fd, "image {\n");
- fprintf(fd, " tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n",
- img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0, tcd->image->y1);
-
- for (tileno = 0; tileno < img->th * img->tw; tileno++) {
- opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno];
- fprintf(fd, " tile {\n");
- fprintf(fd, " x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n",
- tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps);
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- fprintf(fd, " tilec {\n");
- fprintf(fd,
- " x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n",
- tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions);
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
- fprintf(fd, "\n res {\n");
- fprintf(fd,
- " x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n",
- res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands);
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- fprintf(fd, " band {\n");
- fprintf(fd,
- " x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n",
- band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps);
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- opj_tcd_precinct_t *prec = &band->precincts[precno];
- fprintf(fd, " prec {\n");
- fprintf(fd,
- " x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n",
- prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch);
- /*
- for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) {
- opj_tcd_cblk_t *cblk = &prec->cblks[cblkno];
- fprintf(fd, " cblk {\n");
- fprintf(fd,
- " x0=%d, y0=%d, x1=%d, y1=%d\n",
- cblk->x0, cblk->y0, cblk->x1, cblk->y1);
- fprintf(fd, " }\n");
- }
- */
- fprintf(fd, " }\n");
- }
- fprintf(fd, " }\n");
- }
- fprintf(fd, " }\n");
- }
- fprintf(fd, " }\n");
- }
- fprintf(fd, " }\n");
- }
- fprintf(fd, "}\n");
-}
-
-/* ----------------------------------------------------------------------- */
-
-/**
-Create a new TCD handle
-*/
-opj_tcd_t* tcd_create(opj_common_ptr cinfo) {
- /* create the tcd structure */
- opj_tcd_t *tcd = (opj_tcd_t*)opj_malloc(sizeof(opj_tcd_t));
- if(!tcd) return NULL;
- tcd->cinfo = cinfo;
- tcd->tcd_image = (opj_tcd_image_t*)opj_malloc(sizeof(opj_tcd_image_t));
- if(!tcd->tcd_image) {
- opj_free(tcd);
- return NULL;
- }
-
- return tcd;
-}
-
-/**
-Destroy a previously created TCD handle
-*/
-void tcd_destroy(opj_tcd_t *tcd) {
- if(tcd) {
- opj_free(tcd->tcd_image);
- opj_free(tcd);
- }
-}
-
-/* ----------------------------------------------------------------------- */
-
-void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) {
- int tileno, compno, resno, bandno, precno, cblkno;
-
- tcd->image = image;
- tcd->cp = cp;
- tcd->tcd_image->tw = cp->tw;
- tcd->tcd_image->th = cp->th;
- tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t));
-
- for (tileno = 0; tileno < 1; tileno++) {
- opj_tcp_t *tcp = &cp->tcps[curtileno];
- int j;
-
- /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
- int p = curtileno % cp->tw; /* si numerotation matricielle .. */
- int q = curtileno / cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */
-
- /* opj_tcd_tile_t *tile=&tcd->tcd_image->tiles[tileno]; */
- opj_tcd_tile_t *tile = tcd->tcd_image->tiles;
-
- /* 4 borders of the tile rescale on the image if necessary */
- tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
- tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
- tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
- tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
- tile->numcomps = image->numcomps;
- /* tile->PPT=image->PPT; */
-
- /* Modification of the RATE >> */
- for (j = 0; j < tcp->numlayers; j++) {
- tcp->rates[j] = tcp->rates[j] ?
- cp->tp_on ?
- (((float) (tile->numcomps
- * (tile->x1 - tile->x0)
- * (tile->y1 - tile->y0)
- * image->comps[0].prec))
- /(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((tcd->cur_totnum_tp - 1) * 14 )/ tcp->numlayers)
- :
- ((float) (tile->numcomps
- * (tile->x1 - tile->x0)
- * (tile->y1 - tile->y0)
- * image->comps[0].prec))/
- (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)
- : 0;
-
- if (tcp->rates[j]) {
- if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) {
- tcp->rates[j] = tcp->rates[j - 1] + 20;
- } else {
- if (!j && tcp->rates[j] < 30)
- tcp->rates[j] = 30;
- }
-
- if(j == (tcp->numlayers-1)){
- tcp->rates[j] = tcp->rates[j]- 2;
- }
- }
- }
- /* << Modification of the RATE */
-
- tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(image->numcomps * sizeof(opj_tcd_tilecomp_t));
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tccp_t *tccp = &tcp->tccps[compno];
-
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
-
- /* border of each tile component (global) */
- tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
- tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);
- tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
- tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
-
- tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int));
- tilec->numresolutions = tccp->numresolutions;
-
- tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t));
-
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- int pdx, pdy;
- int levelno = tilec->numresolutions - 1 - resno;
- int tlprcxstart, tlprcystart, brprcxend, brprcyend;
- int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
- int cbgwidthexpn, cbgheightexpn;
- int cblkwidthexpn, cblkheightexpn;
-
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- /* border for each resolution level (global) */
- res->x0 = int_ceildivpow2(tilec->x0, levelno);
- res->y0 = int_ceildivpow2(tilec->y0, levelno);
- res->x1 = int_ceildivpow2(tilec->x1, levelno);
- res->y1 = int_ceildivpow2(tilec->y1, levelno);
-
- res->numbands = resno == 0 ? 1 : 3;
- /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
- if (tccp->csty & J2K_CCP_CSTY_PRT) {
- pdx = tccp->prcw[resno];
- pdy = tccp->prch[resno];
- } else {
- pdx = 15;
- pdy = 15;
- }
- /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
- tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
- tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
-
- brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
- brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
-
- res->pw = (brprcxend - tlprcxstart) >> pdx;
- res->ph = (brprcyend - tlprcystart) >> pdy;
-
- if (resno == 0) {
- tlcbgxstart = tlprcxstart;
- tlcbgystart = tlprcystart;
- brcbgxend = brprcxend;
- brcbgyend = brprcyend;
- cbgwidthexpn = pdx;
- cbgheightexpn = pdy;
- } else {
- tlcbgxstart = int_ceildivpow2(tlprcxstart, 1);
- tlcbgystart = int_ceildivpow2(tlprcystart, 1);
- brcbgxend = int_ceildivpow2(brprcxend, 1);
- brcbgyend = int_ceildivpow2(brprcyend, 1);
- cbgwidthexpn = pdx - 1;
- cbgheightexpn = pdy - 1;
- }
- (void)brcbgyend;
- (void)brcbgxend;
-
- cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn);
- cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn);
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- int x0b, y0b, i;
- int gain, numbps;
- opj_stepsize_t *ss = NULL;
-
- opj_tcd_band_t *band = &res->bands[bandno];
-
- band->bandno = resno == 0 ? 0 : bandno + 1;
- x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0;
- y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0;
-
- if (band->bandno == 0) {
- /* band border (global) */
- band->x0 = int_ceildivpow2(tilec->x0, levelno);
- band->y0 = int_ceildivpow2(tilec->y0, levelno);
- band->x1 = int_ceildivpow2(tilec->x1, levelno);
- band->y1 = int_ceildivpow2(tilec->y1, levelno);
- } else {
- /* band border (global) */
- band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1);
- band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1);
- band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1);
- band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1);
- }
-
- ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1];
- gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno);
- numbps = image->comps[compno].prec + gain;
-
- band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn));
- band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */
-
- band->precincts = (opj_tcd_precinct_t *) opj_malloc(3 * res->pw * res->ph * sizeof(opj_tcd_precinct_t));
-
- for (i = 0; i < res->pw * res->ph * 3; i++) {
- band->precincts[i].imsbtree = NULL;
- band->precincts[i].incltree = NULL;
- band->precincts[i].cblks.enc = NULL;
- }
-
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
-
- int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
- int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
- int cbgxend = cbgxstart + (1 << cbgwidthexpn);
- int cbgyend = cbgystart + (1 << cbgheightexpn);
-
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- /* precinct size (global) */
- prc->x0 = int_max(cbgxstart, band->x0);
- prc->y0 = int_max(cbgystart, band->y0);
- prc->x1 = int_min(cbgxend, band->x1);
- prc->y1 = int_min(cbgyend, band->y1);
-
- tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
- tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
- brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
- brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
- prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
- prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn;
-
- prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc((prc->cw * prc->ch), sizeof(opj_tcd_cblk_enc_t));
- prc->incltree = tgt_create(prc->cw, prc->ch);
- prc->imsbtree = tgt_create(prc->cw, prc->ch);
-
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
- int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
- int cblkxend = cblkxstart + (1 << cblkwidthexpn);
- int cblkyend = cblkystart + (1 << cblkheightexpn);
-
- opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
-
- /* code-block size (global) */
- cblk->x0 = int_max(cblkxstart, prc->x0);
- cblk->y0 = int_max(cblkystart, prc->y0);
- cblk->x1 = int_min(cblkxend, prc->x1);
- cblk->y1 = int_min(cblkyend, prc->y1);
- cblk->data = (unsigned char*) opj_calloc(9728+2, sizeof(unsigned char));
- /* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */
- cblk->data[0] = 0;
- cblk->data[1] = 0;
- cblk->data += 2;
- cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t));
- cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t));
- }
- }
- }
- }
- }
- }
-
- /* tcd_dump(stdout, tcd, &tcd->tcd_image); */
-}
-
-void tcd_free_encode(opj_tcd_t *tcd) {
- int tileno, compno, resno, bandno, precno, cblkno;
-
- for (tileno = 0; tileno < 1; tileno++) {
- opj_tcd_tile_t *tile = tcd->tcd_image->tiles;
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
-
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
-
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- if (prc->incltree != NULL) {
- tgt_destroy(prc->incltree);
- prc->incltree = NULL;
- }
- if (prc->imsbtree != NULL) {
- tgt_destroy(prc->imsbtree);
- prc->imsbtree = NULL;
- }
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_free(prc->cblks.enc[cblkno].data - 2);
- opj_free(prc->cblks.enc[cblkno].layers);
- opj_free(prc->cblks.enc[cblkno].passes);
- }
- opj_free(prc->cblks.enc);
- } /* for (precno */
- opj_free(band->precincts);
- band->precincts = NULL;
- } /* for (bandno */
- } /* for (resno */
- opj_free(tilec->resolutions);
- tilec->resolutions = NULL;
- } /* for (compno */
- opj_free(tile->comps);
- tile->comps = NULL;
- } /* for (tileno */
- opj_free(tcd->tcd_image->tiles);
- tcd->tcd_image->tiles = NULL;
-}
-
-void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) {
- int tileno, compno, resno, bandno, precno, cblkno;
-
- for (tileno = 0; tileno < 1; tileno++) {
- opj_tcp_t *tcp = &cp->tcps[curtileno];
- int j;
- /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
- int p = curtileno % cp->tw;
- int q = curtileno / cp->tw;
-
- opj_tcd_tile_t *tile = tcd->tcd_image->tiles;
-
- /* 4 borders of the tile rescale on the image if necessary */
- tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
- tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
- tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
- tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
-
- tile->numcomps = image->numcomps;
- /* tile->PPT=image->PPT; */
-
- /* Modification of the RATE >> */
- for (j = 0; j < tcp->numlayers; j++) {
- tcp->rates[j] = tcp->rates[j] ?
- cp->tp_on ?
- (((float) (tile->numcomps
- * (tile->x1 - tile->x0)
- * (tile->y1 - tile->y0)
- * image->comps[0].prec))
- /(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((tcd->cur_totnum_tp - 1) * 14 )/ tcp->numlayers)
- :
- ((float) (tile->numcomps
- * (tile->x1 - tile->x0)
- * (tile->y1 - tile->y0)
- * image->comps[0].prec))/
- (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)
- : 0;
-
- if (tcp->rates[j]) {
- if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) {
- tcp->rates[j] = tcp->rates[j - 1] + 20;
- } else {
- if (!j && tcp->rates[j] < 30)
- tcp->rates[j] = 30;
- }
- }
- }
- /* << Modification of the RATE */
-
- /* tile->comps=(opj_tcd_tilecomp_t*)opj_realloc(tile->comps,image->numcomps*sizeof(opj_tcd_tilecomp_t)); */
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tccp_t *tccp = &tcp->tccps[compno];
-
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
-
- /* border of each tile component (global) */
- tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
- tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);
- tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
- tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
-
- tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int));
- tilec->numresolutions = tccp->numresolutions;
- /* tilec->resolutions=(opj_tcd_resolution_t*)opj_realloc(tilec->resolutions,tilec->numresolutions*sizeof(opj_tcd_resolution_t)); */
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- int pdx, pdy;
-
- int levelno = tilec->numresolutions - 1 - resno;
- int tlprcxstart, tlprcystart, brprcxend, brprcyend;
- int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
- int cbgwidthexpn, cbgheightexpn;
- int cblkwidthexpn, cblkheightexpn;
-
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- /* border for each resolution level (global) */
- res->x0 = int_ceildivpow2(tilec->x0, levelno);
- res->y0 = int_ceildivpow2(tilec->y0, levelno);
- res->x1 = int_ceildivpow2(tilec->x1, levelno);
- res->y1 = int_ceildivpow2(tilec->y1, levelno);
- res->numbands = resno == 0 ? 1 : 3;
-
- /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
- if (tccp->csty & J2K_CCP_CSTY_PRT) {
- pdx = tccp->prcw[resno];
- pdy = tccp->prch[resno];
- } else {
- pdx = 15;
- pdy = 15;
- }
- /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
- tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
- tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
- brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
- brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
-
- res->pw = (brprcxend - tlprcxstart) >> pdx;
- res->ph = (brprcyend - tlprcystart) >> pdy;
-
- if (resno == 0) {
- tlcbgxstart = tlprcxstart;
- tlcbgystart = tlprcystart;
- brcbgxend = brprcxend;
- brcbgyend = brprcyend;
- cbgwidthexpn = pdx;
- cbgheightexpn = pdy;
- } else {
- tlcbgxstart = int_ceildivpow2(tlprcxstart, 1);
- tlcbgystart = int_ceildivpow2(tlprcystart, 1);
- brcbgxend = int_ceildivpow2(brprcxend, 1);
- brcbgyend = int_ceildivpow2(brprcyend, 1);
- cbgwidthexpn = pdx - 1;
- cbgheightexpn = pdy - 1;
- }
- (void)brcbgyend;
- (void)brcbgxend;
-
- cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn);
- cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn);
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- int x0b, y0b;
- int gain, numbps;
- opj_stepsize_t *ss = NULL;
-
- opj_tcd_band_t *band = &res->bands[bandno];
-
- band->bandno = resno == 0 ? 0 : bandno + 1;
- x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0;
- y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0;
-
- if (band->bandno == 0) {
- /* band border */
- band->x0 = int_ceildivpow2(tilec->x0, levelno);
- band->y0 = int_ceildivpow2(tilec->y0, levelno);
- band->x1 = int_ceildivpow2(tilec->x1, levelno);
- band->y1 = int_ceildivpow2(tilec->y1, levelno);
- } else {
- band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1);
- band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1);
- band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1);
- band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1);
- }
-
- ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1];
- gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno);
- numbps = image->comps[compno].prec + gain;
- band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn));
- band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */
-
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
-
- int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
- int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
- int cbgxend = cbgxstart + (1 << cbgwidthexpn);
- int cbgyend = cbgystart + (1 << cbgheightexpn);
-
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- /* precinct size (global) */
- prc->x0 = int_max(cbgxstart, band->x0);
- prc->y0 = int_max(cbgystart, band->y0);
- prc->x1 = int_min(cbgxend, band->x1);
- prc->y1 = int_min(cbgyend, band->y1);
-
- tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
- tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
- brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
- brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
- prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
- prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn;
-
- opj_free(prc->cblks.enc);
- prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc(prc->cw * prc->ch, sizeof(opj_tcd_cblk_enc_t));
-
- if (prc->incltree != NULL) {
- tgt_destroy(prc->incltree);
- }
- if (prc->imsbtree != NULL) {
- tgt_destroy(prc->imsbtree);
- }
-
- prc->incltree = tgt_create(prc->cw, prc->ch);
- prc->imsbtree = tgt_create(prc->cw, prc->ch);
-
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
- int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
- int cblkxend = cblkxstart + (1 << cblkwidthexpn);
- int cblkyend = cblkystart + (1 << cblkheightexpn);
-
- opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
-
- /* code-block size (global) */
- cblk->x0 = int_max(cblkxstart, prc->x0);
- cblk->y0 = int_max(cblkystart, prc->y0);
- cblk->x1 = int_min(cblkxend, prc->x1);
- cblk->y1 = int_min(cblkyend, prc->y1);
- cblk->data = (unsigned char*) opj_calloc(8192+2, sizeof(unsigned char));
- /* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */
- cblk->data[0] = 0;
- cblk->data[1] = 0;
- cblk->data += 2;
- cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t));
- cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t));
- }
- } /* precno */
- } /* bandno */
- } /* resno */
- } /* compno */
- } /* tileno */
-
- /* tcd_dump(stdout, tcd, &tcd->tcd_image); */
-}
-
-void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp) {
- int i, j, tileno, p, q;
- unsigned int x0 = 0, y0 = 0, x1 = 0, y1 = 0, w, h;
-
- tcd->image = image;
- tcd->tcd_image->tw = cp->tw;
- tcd->tcd_image->th = cp->th;
- tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_calloc(cp->tw * cp->th, sizeof(opj_tcd_tile_t));
-
- /*
- Allocate place to store the decoded data = final image
- Place limited by the tile really present in the codestream
- */
-
- for (j = 0; j < cp->tileno_size; j++) {
- opj_tcd_tile_t *tile;
-
- tileno = cp->tileno[j];
- tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]);
- tile->numcomps = image->numcomps;
- tile->comps = (opj_tcd_tilecomp_t*) opj_calloc(image->numcomps, sizeof(opj_tcd_tilecomp_t));
- }
-
- for (i = 0; i < image->numcomps; i++) {
- for (j = 0; j < cp->tileno_size; j++) {
- opj_tcd_tile_t *tile;
- opj_tcd_tilecomp_t *tilec;
-
- /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
-
- tileno = cp->tileno[j];
-
- tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]);
- tilec = &tile->comps[i];
-
- p = tileno % cp->tw; /* si numerotation matricielle .. */
- q = tileno / cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */
-
- /* 4 borders of the tile rescale on the image if necessary */
- tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
- tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
- tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
- tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
-
- tilec->x0 = int_ceildiv(tile->x0, image->comps[i].dx);
- tilec->y0 = int_ceildiv(tile->y0, image->comps[i].dy);
- tilec->x1 = int_ceildiv(tile->x1, image->comps[i].dx);
- tilec->y1 = int_ceildiv(tile->y1, image->comps[i].dy);
-
- x0 = j == 0 ? tilec->x0 : int_min(x0, (unsigned int) tilec->x0);
- y0 = j == 0 ? tilec->y0 : int_min(y0, (unsigned int) tilec->y0);
- x1 = j == 0 ? tilec->x1 : int_max(x1, (unsigned int) tilec->x1);
- y1 = j == 0 ? tilec->y1 : int_max(y1, (unsigned int) tilec->y1);
- }
-
- w = int_ceildivpow2(x1 - x0, image->comps[i].factor);
- h = int_ceildivpow2(y1 - y0, image->comps[i].factor);
-
- image->comps[i].w = w;
- image->comps[i].h = h;
- image->comps[i].x0 = x0;
- image->comps[i].y0 = y0;
- }
-}
-
-void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int tileno, opj_codestream_info_t *cstr_info) {
- int compno, resno, bandno, precno, cblkno;
- opj_tcp_t *tcp;
- opj_tcd_tile_t *tile;
-
- OPJ_ARG_NOT_USED(cstr_info);
-
- tcd->cp = cp;
-
- tcp = &(cp->tcps[cp->tileno[tileno]]);
- tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]);
-
- tileno = cp->tileno[tileno];
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
-
- if (tccp->numresolutions <= 0)
- {
- cp->tileno[tileno] = -1;
- return;
- }
-
- /* border of each tile component (global) */
- tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
- tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);
- tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
- tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
-
- tilec->numresolutions = tccp->numresolutions;
- tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t));
-
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- int pdx, pdy;
- int levelno = tilec->numresolutions - 1 - resno;
- int tlprcxstart, tlprcystart, brprcxend, brprcyend;
- int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
- int cbgwidthexpn, cbgheightexpn;
- int cblkwidthexpn, cblkheightexpn;
-
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- /* border for each resolution level (global) */
- res->x0 = int_ceildivpow2(tilec->x0, levelno);
- res->y0 = int_ceildivpow2(tilec->y0, levelno);
- res->x1 = int_ceildivpow2(tilec->x1, levelno);
- res->y1 = int_ceildivpow2(tilec->y1, levelno);
- res->numbands = resno == 0 ? 1 : 3;
-
- /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
- if (tccp->csty & J2K_CCP_CSTY_PRT) {
- pdx = tccp->prcw[resno];
- pdy = tccp->prch[resno];
- } else {
- pdx = 15;
- pdy = 15;
- }
-
- /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
- tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
- tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
- brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
- brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
-
- res->pw = (res->x0 == res->x1) ? 0 : ((brprcxend - tlprcxstart) >> pdx);
- res->ph = (res->y0 == res->y1) ? 0 : ((brprcyend - tlprcystart) >> pdy);
-
- if (resno == 0) {
- tlcbgxstart = tlprcxstart;
- tlcbgystart = tlprcystart;
- brcbgxend = brprcxend;
- brcbgyend = brprcyend;
- cbgwidthexpn = pdx;
- cbgheightexpn = pdy;
- } else {
- tlcbgxstart = int_ceildivpow2(tlprcxstart, 1);
- tlcbgystart = int_ceildivpow2(tlprcystart, 1);
- brcbgxend = int_ceildivpow2(brprcxend, 1);
- brcbgyend = int_ceildivpow2(brprcyend, 1);
- cbgwidthexpn = pdx - 1;
- cbgheightexpn = pdy - 1;
- }
- (void)brcbgyend;
- (void)brcbgxend;
-
- cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn);
- cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn);
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- int x0b, y0b;
- int gain, numbps;
- opj_stepsize_t *ss = NULL;
-
- opj_tcd_band_t *band = &res->bands[bandno];
- band->bandno = resno == 0 ? 0 : bandno + 1;
- x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0;
- y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0;
-
- if (band->bandno == 0) {
- /* band border (global) */
- band->x0 = int_ceildivpow2(tilec->x0, levelno);
- band->y0 = int_ceildivpow2(tilec->y0, levelno);
- band->x1 = int_ceildivpow2(tilec->x1, levelno);
- band->y1 = int_ceildivpow2(tilec->y1, levelno);
- } else {
- /* band border (global) */
- band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1);
- band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1);
- band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1);
- band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1);
- }
-
- ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1];
- gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno);
- numbps = image->comps[compno].prec + gain;
- band->stepsize = (float)(((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)) * 0.5);
- band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */
-
- band->precincts = (opj_tcd_precinct_t *) opj_malloc(res->pw * res->ph * sizeof(opj_tcd_precinct_t));
-
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
- int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
- int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
- int cbgxend = cbgxstart + (1 << cbgwidthexpn);
- int cbgyend = cbgystart + (1 << cbgheightexpn);
-
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- /* precinct size (global) */
- prc->x0 = int_max(cbgxstart, band->x0);
- prc->y0 = int_max(cbgystart, band->y0);
- prc->x1 = int_min(cbgxend, band->x1);
- prc->y1 = int_min(cbgyend, band->y1);
-
- tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
- tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
- brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
- brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
- prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
- prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn;
-
- prc->cblks.dec = (opj_tcd_cblk_dec_t*) opj_malloc(prc->cw * prc->ch * sizeof(opj_tcd_cblk_dec_t));
-
- prc->incltree = tgt_create(prc->cw, prc->ch);
- prc->imsbtree = tgt_create(prc->cw, prc->ch);
-
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
- int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
- int cblkxend = cblkxstart + (1 << cblkwidthexpn);
- int cblkyend = cblkystart + (1 << cblkheightexpn);
-
- opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno];
- cblk->data = NULL;
- cblk->segs = NULL;
- /* code-block size (global) */
- cblk->x0 = int_max(cblkxstart, prc->x0);
- cblk->y0 = int_max(cblkystart, prc->y0);
- cblk->x1 = int_min(cblkxend, prc->x1);
- cblk->y1 = int_min(cblkyend, prc->y1);
- cblk->numsegs = 0;
- }
- } /* precno */
- } /* bandno */
- } /* resno */
- } /* compno */
- /* tcd_dump(stdout, tcd, &tcd->tcd_image); */
-}
-
-void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final) {
- int compno, resno, bandno, precno, cblkno;
- int value; /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */
- int matrice[10][10][3];
- int i, j, k;
-
- opj_cp_t *cp = tcd->cp;
- opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
- opj_tcp_t *tcd_tcp = tcd->tcp;
-
- /*matrice=(int*)opj_malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolutions*3*sizeof(int)); */
-
- for (compno = 0; compno < tcd_tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
- for (i = 0; i < tcd_tcp->numlayers; i++) {
- for (j = 0; j < tilec->numresolutions; j++) {
- for (k = 0; k < 3; k++) {
- matrice[i][j][k] =
- (int) (cp->matrice[i * tilec->numresolutions * 3 + j * 3 + k]
- * (float) (tcd->image->comps[compno].prec / 16.0));
- }
- }
- }
-
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
- opj_tcd_layer_t *layer = &cblk->layers[layno];
- int n;
- int imsb = tcd->image->comps[compno].prec - cblk->numbps; /* number of bit-plan equal to zero */
- /* Correction of the matrix of coefficient to include the IMSB information */
- if (layno == 0) {
- value = matrice[layno][resno][bandno];
- if (imsb >= value) {
- value = 0;
- } else {
- value -= imsb;
- }
- } else {
- value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno];
- if (imsb >= matrice[layno - 1][resno][bandno]) {
- value -= (imsb - matrice[layno - 1][resno][bandno]);
- if (value < 0) {
- value = 0;
- }
- }
- }
-
- if (layno == 0) {
- cblk->numpassesinlayers = 0;
- }
-
- n = cblk->numpassesinlayers;
- if (cblk->numpassesinlayers == 0) {
- if (value != 0) {
- n = 3 * value - 2 + cblk->numpassesinlayers;
- } else {
- n = cblk->numpassesinlayers;
- }
- } else {
- n = 3 * value + cblk->numpassesinlayers;
- }
-
- layer->numpasses = n - cblk->numpassesinlayers;
-
- if (!layer->numpasses)
- continue;
-
- if (cblk->numpassesinlayers == 0) {
- layer->len = cblk->passes[n - 1].rate;
- layer->data = cblk->data;
- } else {
- layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate;
- layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
- }
- if (final)
- cblk->numpassesinlayers = n;
- }
- }
- }
- }
- }
-}
-
-void tcd_rateallocate_fixed(opj_tcd_t *tcd) {
- int layno;
- for (layno = 0; layno < tcd->tcp->numlayers; layno++) {
- tcd_makelayer_fixed(tcd, layno, 1);
- }
-}
-
-void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final) {
- int compno, resno, bandno, precno, cblkno, passno;
-
- opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
-
- tcd_tile->distolayer[layno] = 0; /* fixed_quality */
-
- for (compno = 0; compno < tcd_tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
- opj_tcd_layer_t *layer = &cblk->layers[layno];
-
- int n;
- if (layno == 0) {
- cblk->numpassesinlayers = 0;
- }
- n = cblk->numpassesinlayers;
- for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) {
- int dr;
- double dd;
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- if (n == 0) {
- dr = pass->rate;
- dd = pass->distortiondec;
- } else {
- dr = pass->rate - cblk->passes[n - 1].rate;
- dd = pass->distortiondec - cblk->passes[n - 1].distortiondec;
- }
- if (!dr) {
- if (dd != 0)
- n = passno + 1;
- continue;
- }
- if (dd / dr >= thresh)
- n = passno + 1;
- }
- layer->numpasses = n - cblk->numpassesinlayers;
-
- if (!layer->numpasses) {
- layer->disto = 0;
- continue;
- }
- if (cblk->numpassesinlayers == 0) {
- layer->len = cblk->passes[n - 1].rate;
- layer->data = cblk->data;
- layer->disto = cblk->passes[n - 1].distortiondec;
- } else {
- layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate;
- layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
- layer->disto = cblk->passes[n - 1].distortiondec - cblk->passes[cblk->numpassesinlayers - 1].distortiondec;
- }
-
- tcd_tile->distolayer[layno] += layer->disto; /* fixed_quality */
-
- if (final)
- cblk->numpassesinlayers = n;
- }
- }
- }
- }
- }
-}
-
-opj_bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) {
- int compno, resno, bandno, precno, cblkno, passno, layno;
- double min, max;
- double cumdisto[100]; /* fixed_quality */
- const double K = 1; /* 1.1; fixed_quality */
- double maxSE = 0;
-
- opj_cp_t *cp = tcd->cp;
- opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
- opj_tcp_t *tcd_tcp = tcd->tcp;
-
- min = DBL_MAX;
- max = 0;
-
- tcd_tile->numpix = 0; /* fixed_quality */
-
- for (compno = 0; compno < tcd_tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
- tilec->numpix = 0;
-
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
-
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
-
- for (passno = 0; passno < cblk->totalpasses; passno++) {
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- int dr;
- double dd, rdslope;
- if (passno == 0) {
- dr = pass->rate;
- dd = pass->distortiondec;
- } else {
- dr = pass->rate - cblk->passes[passno - 1].rate;
- dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec;
- }
- if (dr == 0) {
- continue;
- }
- rdslope = dd / dr;
- if (rdslope < min) {
- min = rdslope;
- }
- if (rdslope > max) {
- max = rdslope;
- }
- } /* passno */
-
- /* fixed_quality */
- tcd_tile->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
- tilec->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
- } /* cbklno */
- } /* precno */
- } /* bandno */
- } /* resno */
-
- maxSE += (((double)(1 << tcd->image->comps[compno].prec) - 1.0)
- * ((double)(1 << tcd->image->comps[compno].prec) -1.0))
- * ((double)(tilec->numpix));
- } /* compno */
-
- /* index file */
- if(cstr_info) {
- opj_tile_info_t *tile_info = &cstr_info->tile[tcd->tcd_tileno];
- tile_info->numpix = tcd_tile->numpix;
- tile_info->distotile = tcd_tile->distotile;
- tile_info->thresh = (double *) opj_malloc(tcd_tcp->numlayers * sizeof(double));
- }
-
- for (layno = 0; layno < tcd_tcp->numlayers; layno++) {
- double lo = min;
- double hi = max;
- int success = 0;
- int maxlen = tcd_tcp->rates[layno] ? int_min(((int) ceil(tcd_tcp->rates[layno])), len) : len;
- double goodthresh = 0;
- double stable_thresh = 0;
- int i;
- double distotarget; /* fixed_quality */
-
- /* fixed_quality */
- distotarget = tcd_tile->distotile - ((K * maxSE) / pow((float)10, tcd_tcp->distoratio[layno] / 10));
-
- /* Don't try to find an optimal threshold but rather take everything not included yet, if
- -r xx,yy,zz,0 (disto_alloc == 1 and rates == 0)
- -q xx,yy,zz,0 (fixed_quality == 1 and distoratio == 0)
- ==> possible to have some lossy layers and the last layer for sure lossless */
- if ( ((cp->disto_alloc==1) && (tcd_tcp->rates[layno]>0)) || ((cp->fixed_quality==1) && (tcd_tcp->distoratio[layno]>0))) {
- opj_t2_t *t2 = t2_create(tcd->cinfo, tcd->image, cp);
- double thresh = 0;
-
- for (i = 0; i < 128; i++) {
- int l = 0;
- double distoachieved = 0; /* fixed_quality */
- thresh = (lo + hi) / 2;
-
- tcd_makelayer(tcd, layno, thresh, 0);
-
- if (cp->fixed_quality) { /* fixed_quality */
- if(cp->cinema){
- l = t2_encode_packets(t2,tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC, tcd->cur_totnum_tp);
- if (l == -999) {
- lo = thresh;
- continue;
- }else{
- distoachieved = layno == 0 ?
- tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno];
- if (distoachieved < distotarget) {
- hi=thresh;
- stable_thresh = thresh;
- continue;
- }else{
- lo=thresh;
- }
- }
- }else{
- distoachieved = (layno == 0) ?
- tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
- if (distoachieved < distotarget) {
- hi = thresh;
- stable_thresh = thresh;
- continue;
- }
- lo = thresh;
- }
- } else {
- l = t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC, tcd->cur_totnum_tp);
- /* TODO: what to do with l ??? seek / tell ??? */
- /* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */
- if (l == -999) {
- lo = thresh;
- continue;
- }
- hi = thresh;
- stable_thresh = thresh;
- }
- }
- success = 1;
- goodthresh = stable_thresh == 0? thresh : stable_thresh;
- t2_destroy(t2);
- } else {
- success = 1;
- goodthresh = min;
- }
-
- if (!success) {
- return OPJ_FALSE;
- }
-
- if(cstr_info) { /* Threshold for Marcela Index */
- cstr_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh;
- }
- tcd_makelayer(tcd, layno, goodthresh, 1);
-
- /* fixed_quality */
- cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
- }
-
- return OPJ_TRUE;
-}
-
-int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) {
- int compno;
- int l, i, numpacks = 0;
- opj_tcd_tile_t *tile = NULL;
- opj_tcp_t *tcd_tcp = NULL;
- opj_cp_t *cp = NULL;
-
- opj_tcp_t *tcp = &tcd->cp->tcps[0];
- opj_tccp_t *tccp = &tcp->tccps[0];
- opj_image_t *image = tcd->image;
-
- opj_t1_t *t1 = NULL; /* T1 component */
- opj_t2_t *t2 = NULL; /* T2 component */
-
- tcd->tcd_tileno = tileno;
- tcd->tcd_tile = tcd->tcd_image->tiles;
- tcd->tcp = &tcd->cp->tcps[tileno];
-
- tile = tcd->tcd_tile;
- tcd_tcp = tcd->tcp;
- cp = tcd->cp;
-
- if(tcd->cur_tp_num == 0){
- tcd->encoding_time = opj_clock(); /* time needed to encode a tile */
- /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
- if(cstr_info) {
- opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0]; /* based on component 0 */
- for (i = 0; i < tilec_idx->numresolutions; i++) {
- opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[i];
-
- cstr_info->tile[tileno].pw[i] = res_idx->pw;
- cstr_info->tile[tileno].ph[i] = res_idx->ph;
-
- numpacks += res_idx->pw * res_idx->ph;
-
- cstr_info->tile[tileno].pdx[i] = tccp->prcw[i];
- cstr_info->tile[tileno].pdy[i] = tccp->prch[i];
- }
- cstr_info->tile[tileno].packet = (opj_packet_info_t*) opj_calloc(cstr_info->numcomps * cstr_info->numlayers * numpacks, sizeof(opj_packet_info_t));
- }
- /* << INDEX */
-
- /*---------------TILE-------------------*/
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- int x, y;
-
- int adjust = image->comps[compno].sgnd ? 0 : 1 << (image->comps[compno].prec - 1);
- int offset_x = int_ceildiv(image->x0, image->comps[compno].dx);
- int offset_y = int_ceildiv(image->y0, image->comps[compno].dy);
-
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- int tw = tilec->x1 - tilec->x0;
- int w = int_ceildiv(image->x1 - image->x0, image->comps[compno].dx);
-
- /* extract tile data */
-
- if (tcd_tcp->tccps[compno].qmfbid == 1) {
- for (y = tilec->y0; y < tilec->y1; y++) {
- /* start of the src tile scanline */
- int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w];
- /* start of the dst tile scanline */
- int *tile_data = &tilec->data[(y - tilec->y0) * tw];
- for (x = tilec->x0; x < tilec->x1; x++) {
- *tile_data++ = *data++ - adjust;
- }
- }
- } else if (tcd_tcp->tccps[compno].qmfbid == 0) {
- for (y = tilec->y0; y < tilec->y1; y++) {
- /* start of the src tile scanline */
- int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w];
- /* start of the dst tile scanline */
- int *tile_data = &tilec->data[(y - tilec->y0) * tw];
- for (x = tilec->x0; x < tilec->x1; x++) {
- *tile_data++ = (*data++ - adjust) << 11;
- }
-
- }
- }
- }
-
- /*----------------MCT-------------------*/
- if (tcd_tcp->mct) {
- int samples = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0);
- if (tcd_tcp->tccps[0].qmfbid == 0) {
- mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples);
- } else {
- mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples);
- }
- }
-
- /*----------------DWT---------------------*/
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- if (tcd_tcp->tccps[compno].qmfbid == 1) {
- dwt_encode(tilec);
- } else if (tcd_tcp->tccps[compno].qmfbid == 0) {
- dwt_encode_real(tilec);
- }
- }
-
- /*------------------TIER1-----------------*/
- t1 = t1_create(tcd->cinfo);
- t1_encode_cblks(t1, tile, tcd_tcp);
- t1_destroy(t1);
-
- /*-----------RATE-ALLOCATE------------------*/
-
- /* INDEX */
- if(cstr_info) {
- cstr_info->index_write = 0;
- }
- if (cp->disto_alloc || cp->fixed_quality) { /* fixed_quality */
- /* Normal Rate/distortion allocation */
- tcd_rateallocate(tcd, dest, len, cstr_info);
- } else {
- /* Fixed layer allocation */
- tcd_rateallocate_fixed(tcd);
- }
- }
- /*--------------TIER2------------------*/
-
- /* INDEX */
- if(cstr_info) {
- cstr_info->index_write = 1;
- }
-
- t2 = t2_create(tcd->cinfo, image, cp);
- l = t2_encode_packets(t2,tileno, tile, tcd_tcp->numlayers, dest, len, cstr_info,tcd->tp_num,tcd->tp_pos,tcd->cur_pino,FINAL_PASS,tcd->cur_totnum_tp);
- t2_destroy(t2);
-
- /*---------------CLEAN-------------------*/
-
-
- if(tcd->cur_tp_num == tcd->cur_totnum_tp - 1){
- tcd->encoding_time = opj_clock() - tcd->encoding_time;
- opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", tcd->encoding_time);
-
- /* cleaning memory */
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- opj_aligned_free(tilec->data);
- }
- }
-
- return l;
-}
-
-opj_bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info) {
- int l;
- int compno;
- int eof = 0;
- double tile_time, t1_time, dwt_time;
- opj_tcd_tile_t *tile = NULL;
-
- opj_t1_t *t1 = NULL; /* T1 component */
- opj_t2_t *t2 = NULL; /* T2 component */
-
- tcd->tcd_tileno = tileno;
- tcd->tcd_tile = &(tcd->tcd_image->tiles[tileno]);
- tcd->tcp = &(tcd->cp->tcps[tileno]);
- tile = tcd->tcd_tile;
-
- tile_time = opj_clock(); /* time needed to decode a tile */
- opj_event_msg(tcd->cinfo, EVT_INFO, "tile %d of %d\n", tileno + 1, tcd->cp->tw * tcd->cp->th);
-
- /* INDEX >> */
- if(cstr_info) {
- int resno, compno, numprec = 0;
- for (compno = 0; compno < cstr_info->numcomps; compno++) {
- opj_tcp_t *tcp = &tcd->cp->tcps[0];
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_tcd_tilecomp_t *tilec_idx = &tile->comps[compno];
- for (resno = 0; resno < tilec_idx->numresolutions; resno++) {
- opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno];
- cstr_info->tile[tileno].pw[resno] = res_idx->pw;
- cstr_info->tile[tileno].ph[resno] = res_idx->ph;
- numprec += res_idx->pw * res_idx->ph;
- if (tccp->csty & J2K_CP_CSTY_PRT) {
- cstr_info->tile[tileno].pdx[resno] = tccp->prcw[resno];
- cstr_info->tile[tileno].pdy[resno] = tccp->prch[resno];
- }
- else {
- cstr_info->tile[tileno].pdx[resno] = 15;
- cstr_info->tile[tileno].pdy[resno] = 15;
- }
- }
- }
- cstr_info->tile[tileno].packet = (opj_packet_info_t *) opj_malloc(cstr_info->numlayers * numprec * sizeof(opj_packet_info_t));
- cstr_info->packno = 0;
- }
- /* << INDEX */
-
- /*--------------TIER2------------------*/
-
- t2 = t2_create(tcd->cinfo, tcd->image, tcd->cp);
- l = t2_decode_packets(t2, src, len, tileno, tile, cstr_info);
- t2_destroy(t2);
-
- if (l == -999) {
- eof = 1;
- opj_event_msg(tcd->cinfo, EVT_ERROR, "tcd_decode: incomplete bistream\n");
- return OPJ_FALSE;
- }
-
- /*------------------TIER1-----------------*/
-
- t1_time = opj_clock(); /* time needed to decode a tile */
- t1 = t1_create(tcd->cinfo);
- if (t1 == NULL)
- {
- opj_event_msg(tcd->cinfo, EVT_ERROR, "Out of memory\n");
- t1_destroy(t1);
- return OPJ_FALSE;
- }
-
- for (compno = 0; compno < tile->numcomps; ++compno) {
- opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
- /* The +3 is headroom required by the vectorized DWT */
- tilec->data = (int*) opj_aligned_malloc((((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0))+3) * sizeof(int));
- if (tilec->data == NULL)
- {
- opj_event_msg(tcd->cinfo, EVT_ERROR, "Out of memory\n");
- t1_destroy(t1);
- return OPJ_FALSE;
- }
-
- t1_decode_cblks(t1, tilec, &tcd->tcp->tccps[compno]);
- }
- t1_destroy(t1);
- t1_time = opj_clock() - t1_time;
- opj_event_msg(tcd->cinfo, EVT_INFO, "- tiers-1 took %f s\n", t1_time);
-
- /*----------------DWT---------------------*/
-
- dwt_time = opj_clock(); /* time needed to decode a tile */
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- int numres2decode;
-
- if (tcd->cp->reduce != 0) {
- if ( tile->comps[compno].numresolutions < ( tcd->cp->reduce - 1 ) ) {
- opj_event_msg(tcd->cinfo, EVT_ERROR, "Error decoding tile. The number of resolutions to remove [%d+1] is higher than the number "
- " of resolutions in the original codestream [%d]\nModify the cp_reduce parameter.\n", tcd->cp->reduce, tile->comps[compno].numresolutions);
- return OPJ_FALSE;
- }
- else {
- tcd->image->comps[compno].resno_decoded =
- tile->comps[compno].numresolutions - tcd->cp->reduce - 1;
- }
- }
-
- numres2decode = tcd->image->comps[compno].resno_decoded + 1;
- if(numres2decode > 0){
- if (tcd->tcp->tccps[compno].qmfbid == 1) {
- dwt_decode(tilec, numres2decode);
- } else {
- dwt_decode_real(tilec, numres2decode);
- }
- }
- }
- dwt_time = opj_clock() - dwt_time;
- opj_event_msg(tcd->cinfo, EVT_INFO, "- dwt took %f s\n", dwt_time);
-
- /*----------------MCT-------------------*/
-
- if (tcd->tcp->mct) {
- int n = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0);
-
- if (tile->numcomps >= 3 ){
- /* testcase 1336.pdf.asan.47.376 */
- if ((tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0) < n ||
- ( tile->comps[1].x1 - tile->comps[1].x0) * (tile->comps[1].y1 - tile->comps[1].y0) < n ||
- ( tile->comps[2].x1 - tile->comps[2].x0) * (tile->comps[2].y1 - tile->comps[2].y0) < n) {
- opj_event_msg(tcd->cinfo, EVT_ERROR, "Tiles don't all have the same dimension. Skip the MCT step.\n");
- return OPJ_FALSE;
- }
- if (tcd->tcp->tccps[0].qmfbid == 1) {
- mct_decode(
- tile->comps[0].data,
- tile->comps[1].data,
- tile->comps[2].data,
- n);
- } else {
- mct_decode_real(
- (float*)tile->comps[0].data,
- (float*)tile->comps[1].data,
- (float*)tile->comps[2].data,
- n);
- }
- } else{
- opj_event_msg(tcd->cinfo, EVT_WARNING,"Number of components (%d) is inconsistent with a MCT. Skip the MCT step.\n",tile->numcomps);
- }
- }
-
- /*---------------TILE-------------------*/
-
- for (compno = 0; compno < tile->numcomps; ++compno) {
- opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
- opj_image_comp_t* imagec = &tcd->image->comps[compno];
- opj_tcd_resolution_t* res = &tilec->resolutions[imagec->resno_decoded];
- int adjust = imagec->sgnd ? 0 : 1 << (imagec->prec - 1);
- int min = imagec->sgnd ? -(1 << (imagec->prec - 1)) : 0;
- int max = imagec->sgnd ? (1 << (imagec->prec - 1)) - 1 : (1 << imagec->prec) - 1;
-
- int tw = tilec->x1 - tilec->x0;
- int w = imagec->w;
-
- int i, j;
- int offset_x = int_ceildivpow2(imagec->x0, imagec->factor);
- int offset_y = int_ceildivpow2(imagec->y0, imagec->factor);
- /* NR-DEC-2977.pdf.asan.67.2198.jp2-52-decode */
- if( res->x0 - offset_x < 0 || res->x1 - offset_x < 0
- || res->y0 - offset_y < 0 || res->y1 - offset_y < 0 )
- {
- opj_event_msg(tcd->cinfo, EVT_ERROR, "Impossible offsets %d / %d\n", offset_x, offset_y);
- return OPJ_FALSE;
- }
- assert( 0 <= res->x0 - offset_x && 0 <= res->x1 - offset_x );
- assert( 0 <= res->y0 - offset_y && 0 <= res->y1 - offset_y );
-
- if(!imagec->data){
- imagec->data = (int*) opj_malloc(imagec->w * imagec->h * sizeof(int));
- }
- if (!imagec->data)
- {
- opj_event_msg(tcd->cinfo, EVT_ERROR, "Out of memory\n");
- return OPJ_FALSE;
- }
- if(tcd->tcp->tccps[compno].qmfbid == 1) {
- for(j = res->y0; j < res->y1; ++j) {
- for(i = res->x0; i < res->x1; ++i) {
- int v = tilec->data[i - res->x0 + (j - res->y0) * tw];
- v += adjust;
- /*assert( (i - offset_x) + (j - offset_y) * w >= 0 );*/
- imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max);
- }
- }
- }else{
- for(j = res->y0; j < res->y1; ++j) {
- for(i = res->x0; i < res->x1; ++i) {
- float tmp = ((float*)tilec->data)[i - res->x0 + (j - res->y0) * tw];
- int v = lrintf(tmp);
- v += adjust;
- /*assert( (i - offset_x) + (j - offset_y) * w >= 0 );*/
- imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max);
- }
- }
- }
- opj_aligned_free(tilec->data);
- }
-
- tile_time = opj_clock() - tile_time; /* time needed to decode a tile */
- opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time);
-
- if (eof) {
- return OPJ_FALSE;
- }
-
- return OPJ_TRUE;
-}
-
-void tcd_free_decode(opj_tcd_t *tcd) {
- opj_tcd_image_t *tcd_image = tcd->tcd_image;
- int i = 0;
- for (i = 0; i < tcd_image->tw * tcd_image->th; i++)
- {
- tcd_free_decode_tile(tcd, i);
- }
-
- opj_free(tcd_image->tiles);
-}
-
-void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno) {
- int compno,resno,bandno,precno,cblkno;
-
- opj_tcd_image_t *tcd_image = tcd->tcd_image;
-
- opj_tcd_tile_t *tile = &tcd_image->tiles[tileno];
- if (tile->comps != NULL) {
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- for (precno = 0; precno < res->ph * res->pw; precno++) {
- opj_tcd_precinct_t *prec = &band->precincts[precno];
- if (prec->cblks.dec != NULL) {
- for (cblkno = 0; cblkno < prec->cw * prec->ch; ++cblkno) {
- opj_tcd_cblk_dec_t* cblk = &prec->cblks.dec[cblkno];
- opj_free(cblk->data);
- opj_free(cblk->segs);
- }
- opj_free(prec->cblks.dec);
- }
- if (prec->imsbtree != NULL) tgt_destroy(prec->imsbtree);
- if (prec->incltree != NULL) tgt_destroy(prec->incltree);
-
-
- }
- opj_free(band->precincts);
- }
- }
- opj_free(tilec->resolutions);
- }
- opj_free(tile->comps);
- tile->comps = NULL;
- }
-}
-
-
-
diff --git a/extern/libopenjpeg/tcd.h b/extern/libopenjpeg/tcd.h
deleted file mode 100644
index e3f93adc37f..00000000000
--- a/extern/libopenjpeg/tcd.h
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __TCD_H
-#define __TCD_H
-/**
-@file tcd.h
-@brief Implementation of a tile coder/decoder (TCD)
-
-The functions in TCD.C have for goal to encode or decode each tile independently from
-each other. The functions in TCD.C are used by some function in J2K.C.
-*/
-
-/** @defgroup TCD TCD - Implementation of a tile coder/decoder */
-/*@{*/
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_seg {
- unsigned char** data;
- int dataindex;
- int numpasses;
- int len;
- int maxpasses;
- int numnewpasses;
- int newlen;
-} opj_tcd_seg_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_pass {
- int rate;
- double distortiondec;
- int term, len;
-} opj_tcd_pass_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_layer {
- int numpasses; /* Number of passes in the layer */
- int len; /* len of information */
- double disto; /* add for index (Cfr. Marcela) */
- unsigned char *data; /* data */
-} opj_tcd_layer_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_cblk_enc {
- unsigned char* data; /* Data */
- opj_tcd_layer_t* layers; /* layer information */
- opj_tcd_pass_t* passes; /* information about the passes */
- int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
- int numbps;
- int numlenbits;
- int numpasses; /* number of pass already done for the code-blocks */
- int numpassesinlayers; /* number of passes in the layer */
- int totalpasses; /* total number of passes */
-} opj_tcd_cblk_enc_t;
-
-typedef struct opj_tcd_cblk_dec {
- unsigned char* data; /* Data */
- opj_tcd_seg_t* segs; /* segments informations */
- int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
- int numbps;
- int numlenbits;
- int len; /* length */
- int numnewpasses; /* number of pass added to the code-blocks */
- int numsegs; /* number of segments */
-} opj_tcd_cblk_dec_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_precinct {
- int x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
- int cw, ch; /* number of precinct in width and heigth */
- union{ /* code-blocks informations */
- opj_tcd_cblk_enc_t* enc;
- opj_tcd_cblk_dec_t* dec;
- } cblks;
- opj_tgt_tree_t *incltree; /* inclusion tree */
- opj_tgt_tree_t *imsbtree; /* IMSB tree */
-} opj_tcd_precinct_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_band {
- int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
- int bandno;
- opj_tcd_precinct_t *precincts; /* precinct information */
- int numbps;
- float stepsize;
-} opj_tcd_band_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_resolution {
- int x0, y0, x1, y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
- int pw, ph;
- int numbands; /* number sub-band for the resolution level */
- opj_tcd_band_t bands[3]; /* subband information */
-} opj_tcd_resolution_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_tilecomp {
- int x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
- int numresolutions; /* number of resolutions level */
- opj_tcd_resolution_t *resolutions; /* resolutions information */
- int *data; /* data of the component */
- int numpix; /* add fixed_quality */
-} opj_tcd_tilecomp_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_tile {
- int x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
- int numcomps; /* number of components in tile */
- opj_tcd_tilecomp_t *comps; /* Components information */
- int numpix; /* add fixed_quality */
- double distotile; /* add fixed_quality */
- double distolayer[100]; /* add fixed_quality */
- /** packet number */
- int packno;
-} opj_tcd_tile_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_image {
- int tw, th; /* number of tiles in width and heigth */
- opj_tcd_tile_t *tiles; /* Tiles information */
-} opj_tcd_image_t;
-
-/**
-Tile coder/decoder
-*/
-typedef struct opj_tcd {
- /** Position of the tilepart flag in Progression order*/
- int tp_pos;
- /** Tile part number*/
- int tp_num;
- /** Current tile part number*/
- int cur_tp_num;
- /** Total number of tileparts of the current tile*/
- int cur_totnum_tp;
- /** Current Packet iterator number */
- int cur_pino;
- /** codec context */
- opj_common_ptr cinfo;
-
- /** info on each image tile */
- opj_tcd_image_t *tcd_image;
- /** image */
- opj_image_t *image;
- /** coding parameters */
- opj_cp_t *cp;
- /** pointer to the current encoded/decoded tile */
- opj_tcd_tile_t *tcd_tile;
- /** coding/decoding parameters common to all tiles */
- opj_tcp_t *tcp;
- /** current encoded/decoded tile */
- int tcd_tileno;
- /** Time taken to encode a tile*/
- double encoding_time;
-} opj_tcd_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-
-/**
-Dump the content of a tcd structure
-*/
-void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);
-/**
-Create a new TCD handle
-@param cinfo Codec context info
-@return Returns a new TCD handle if successful returns NULL otherwise
-*/
-opj_tcd_t* tcd_create(opj_common_ptr cinfo);
-/**
-Destroy a previously created TCD handle
-@param tcd TCD handle to destroy
-*/
-void tcd_destroy(opj_tcd_t *tcd);
-/**
-Initialize the tile coder (allocate the memory)
-@param tcd TCD handle
-@param image Raw image
-@param cp Coding parameters
-@param curtileno Number that identifies the tile that will be encoded
-*/
-void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno);
-/**
-Free the memory allocated for encoding
-@param tcd TCD handle
-*/
-void tcd_free_encode(opj_tcd_t *tcd);
-/**
-Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode)
-@param tcd TCD handle
-@param image Raw image
-@param cp Coding parameters
-@param curtileno Number that identifies the tile that will be encoded
-*/
-void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno);
-/**
-Initialize the tile decoder
-@param tcd TCD handle
-@param image Raw image
-@param cp Coding parameters
-*/
-void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp);
-void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int tileno, opj_codestream_info_t *cstr_info);
-void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final);
-void tcd_rateallocate_fixed(opj_tcd_t *tcd);
-void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final);
-opj_bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info);
-/**
-Encode a tile from the raw image into a buffer
-@param tcd TCD handle
-@param tileno Number that identifies one of the tiles to be encoded
-@param dest Destination buffer
-@param len Length of destination buffer
-@param cstr_info Codestream information structure
-@return
-*/
-int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info);
-/**
-Decode a tile from a buffer into a raw image
-@param tcd TCD handle
-@param src Source buffer
-@param len Length of source buffer
-@param tileno Number that identifies one of the tiles to be decoded
-@param cstr_info Codestream information structure
-*/
-opj_bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info);
-/**
-Free the memory allocated for decoding
-@param tcd TCD handle
-*/
-void tcd_free_decode(opj_tcd_t *tcd);
-void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno);
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __TCD_H */
diff --git a/extern/libopenjpeg/tgt.c b/extern/libopenjpeg/tgt.c
deleted file mode 100644
index a5dbcd3cef4..00000000000
--- a/extern/libopenjpeg/tgt.c
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "opj_includes.h"
-
-/*
-==========================================================
- Tag-tree coder interface
-==========================================================
-*/
-
-opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv) {
- int nplh[32];
- int nplv[32];
- opj_tgt_node_t *node = NULL;
- opj_tgt_node_t *parentnode = NULL;
- opj_tgt_node_t *parentnode0 = NULL;
- opj_tgt_tree_t *tree = NULL;
- int i, j, k;
- int numlvls;
- int n;
-
- tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t));
- if(!tree) return NULL;
- tree->numleafsh = numleafsh;
- tree->numleafsv = numleafsv;
-
- numlvls = 0;
- nplh[0] = numleafsh;
- nplv[0] = numleafsv;
- tree->numnodes = 0;
- do {
- n = nplh[numlvls] * nplv[numlvls];
- nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2;
- nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2;
- tree->numnodes += n;
- ++numlvls;
- } while (n > 1);
-
- /* ADD */
- if (tree->numnodes == 0) {
- opj_free(tree);
- return NULL;
- }
-
- tree->nodes = (opj_tgt_node_t*) opj_calloc(tree->numnodes, sizeof(opj_tgt_node_t));
- if(!tree->nodes) {
- opj_free(tree);
- return NULL;
- }
-
- node = tree->nodes;
- parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv];
- parentnode0 = parentnode;
-
- for (i = 0; i < numlvls - 1; ++i) {
- for (j = 0; j < nplv[i]; ++j) {
- k = nplh[i];
- while (--k >= 0) {
- node->parent = parentnode;
- ++node;
- if (--k >= 0) {
- node->parent = parentnode;
- ++node;
- }
- ++parentnode;
- }
- if ((j & 1) || j == nplv[i] - 1) {
- parentnode0 = parentnode;
- } else {
- parentnode = parentnode0;
- parentnode0 += nplh[i];
- }
- }
- }
- node->parent = 0;
-
- tgt_reset(tree);
-
- return tree;
-}
-
-void tgt_destroy(opj_tgt_tree_t *tree) {
- opj_free(tree->nodes);
- opj_free(tree);
-}
-
-void tgt_reset(opj_tgt_tree_t *tree) {
- int i;
-
- if (NULL == tree)
- return;
-
- for (i = 0; i < tree->numnodes; i++) {
- tree->nodes[i].value = 999;
- tree->nodes[i].low = 0;
- tree->nodes[i].known = 0;
- }
-}
-
-void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value) {
- opj_tgt_node_t *node;
- node = &tree->nodes[leafno];
- while (node && node->value > value) {
- node->value = value;
- node = node->parent;
- }
-}
-
-void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) {
- opj_tgt_node_t *stk[31];
- opj_tgt_node_t **stkptr;
- opj_tgt_node_t *node;
- int low;
-
- stkptr = stk;
- node = &tree->nodes[leafno];
- while (node->parent) {
- *stkptr++ = node;
- node = node->parent;
- }
-
- low = 0;
- for (;;) {
- if (low > node->low) {
- node->low = low;
- } else {
- low = node->low;
- }
-
- while (low < threshold) {
- if (low >= node->value) {
- if (!node->known) {
- bio_write(bio, 1, 1);
- node->known = 1;
- }
- break;
- }
- bio_write(bio, 0, 1);
- ++low;
- }
-
- node->low = low;
- if (stkptr == stk)
- break;
- node = *--stkptr;
- }
-}
-
-int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) {
- opj_tgt_node_t *stk[31];
- opj_tgt_node_t **stkptr;
- opj_tgt_node_t *node;
- int low;
-
- stkptr = stk;
- node = &tree->nodes[leafno];
- while (node->parent) {
- *stkptr++ = node;
- node = node->parent;
- }
-
- low = 0;
- for (;;) {
- if (low > node->low) {
- node->low = low;
- } else {
- low = node->low;
- }
- while (low < threshold && low < node->value) {
- if (bio_read(bio, 1)) {
- node->value = low;
- } else {
- ++low;
- }
- }
- node->low = low;
- if (stkptr == stk) {
- break;
- }
- node = *--stkptr;
- }
-
- return (node->value < threshold) ? 1 : 0;
-}
diff --git a/extern/libopenjpeg/tgt.h b/extern/libopenjpeg/tgt.h
deleted file mode 100644
index c08c8da0af4..00000000000
--- a/extern/libopenjpeg/tgt.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2007, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __TGT_H
-#define __TGT_H
-/**
-@file tgt.h
-@brief Implementation of a tag-tree coder (TGT)
-
-The functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C
-are used by some function in T2.C.
-*/
-
-/** @defgroup TGT TGT - Implementation of a tag-tree coder */
-/*@{*/
-
-/**
-Tag node
-*/
-typedef struct opj_tgt_node {
- struct opj_tgt_node *parent;
- int value;
- int low;
- int known;
-} opj_tgt_node_t;
-
-/**
-Tag tree
-*/
-typedef struct opj_tgt_tree {
- int numleafsh;
- int numleafsv;
- int numnodes;
- opj_tgt_node_t *nodes;
-} opj_tgt_tree_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a tag-tree
-@param numleafsh Width of the array of leafs of the tree
-@param numleafsv Height of the array of leafs of the tree
-@return Returns a new tag-tree if successful, returns NULL otherwise
-*/
-opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv);
-/**
-Destroy a tag-tree, liberating memory
-@param tree Tag-tree to destroy
-*/
-void tgt_destroy(opj_tgt_tree_t *tree);
-/**
-Reset a tag-tree (set all leaves to 0)
-@param tree Tag-tree to reset
-*/
-void tgt_reset(opj_tgt_tree_t *tree);
-/**
-Set the value of a leaf of a tag-tree
-@param tree Tag-tree to modify
-@param leafno Number that identifies the leaf to modify
-@param value New value of the leaf
-*/
-void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value);
-/**
-Encode the value of a leaf of the tag-tree up to a given threshold
-@param bio Pointer to a BIO handle
-@param tree Tag-tree to modify
-@param leafno Number that identifies the leaf to encode
-@param threshold Threshold to use when encoding value of the leaf
-*/
-void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold);
-/**
-Decode the value of a leaf of the tag-tree up to a given threshold
-@param bio Pointer to a BIO handle
-@param tree Tag-tree to decode
-@param leafno Number that identifies the leaf to decode
-@param threshold Threshold to use when decoding value of the leaf
-@return Returns 1 if the node's value < threshold, returns 0 otherwise
-*/
-int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __TGT_H */
diff --git a/extern/libopenjpeg/thix_manager.c b/extern/libopenjpeg/thix_manager.c
deleted file mode 100644
index aa55f217c06..00000000000
--- a/extern/libopenjpeg/thix_manager.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * $Id: thix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
- *
- * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2011, Professor Benoit Macq
- * Copyright (c) 2003-2004, Yannick Verschueren
- * Copyright (c) 2010-2011, Kaori Hagihara
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*! \file
- * \brief Modification of jpip.c from 2KAN indexer
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include "opj_includes.h"
-
-/*
- * Write tile-part headers mhix box
- *
- * @param[in] coff offset of j2k codestream
- * @param[in] cstr_info codestream information
- * @param[in] tileno tile number
- * @param[in] cio file output handle
- * @return length of mhix box
- */
-int write_tilemhix( int coff, opj_codestream_info_t cstr_info, int tileno, opj_cio_t *cio);
-
-int write_thix( int coff, opj_codestream_info_t cstr_info, opj_cio_t *cio)
-{
- int len, lenp, i;
- int tileno;
- opj_jp2_box_t *box;
-
- lenp = 0;
- box = (opj_jp2_box_t *)opj_calloc( cstr_info.tw*cstr_info.th, sizeof(opj_jp2_box_t));
-
- for ( i = 0; i < 2 ; i++ ){
- if (i)
- cio_seek( cio, lenp);
-
- lenp = cio_tell( cio);
- cio_skip( cio, 4); /* L [at the end] */
- cio_write( cio, JPIP_THIX, 4); /* THIX */
- write_manf( i, cstr_info.tw*cstr_info.th, box, cio);
-
- for (tileno = 0; tileno < cstr_info.tw*cstr_info.th; tileno++){
- box[tileno].length = write_tilemhix( coff, cstr_info, tileno, cio);
- box[tileno].type = JPIP_MHIX;
- }
-
- len = cio_tell( cio)-lenp;
- cio_seek( cio, lenp);
- cio_write( cio, len, 4); /* L */
- cio_seek( cio, lenp+len);
- }
-
- opj_free(box);
-
- return len;
-}
-
-int write_tilemhix( int coff, opj_codestream_info_t cstr_info, int tileno, opj_cio_t *cio)
-{
- int i;
- opj_tile_info_t tile;
- opj_tp_info_t tp;
- int len, lenp;
- opj_marker_info_t *marker;
-
- lenp = cio_tell( cio);
- cio_skip( cio, 4); /* L [at the end] */
- cio_write( cio, JPIP_MHIX, 4); /* MHIX */
-
- tile = cstr_info.tile[tileno];
- tp = tile.tp[0];
-
- cio_write( cio, tp.tp_end_header-tp.tp_start_pos+1, 8); /* TLEN */
-
- marker = cstr_info.tile[tileno].marker;
-
- for( i=0; i<cstr_info.tile[tileno].marknum; i++){ /* Marker restricted to 1 apparition */
- cio_write( cio, marker[i].type, 2);
- cio_write( cio, 0, 2);
- cio_write( cio, marker[i].pos-coff, 8);
- cio_write( cio, marker[i].len, 2);
- }
-
- /* free( marker);*/
-
- len = cio_tell( cio) - lenp;
- cio_seek( cio, lenp);
- cio_write( cio, len, 4); /* L */
- cio_seek( cio, lenp+len);
-
- return len;
-}
diff --git a/extern/libopenjpeg/tpix_manager.c b/extern/libopenjpeg/tpix_manager.c
deleted file mode 100644
index 9ba9e7fdabc..00000000000
--- a/extern/libopenjpeg/tpix_manager.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * $Id: tpix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
- *
- * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2011, Professor Benoit Macq
- * Copyright (c) 2003-2004, Yannick Verschueren
- * Copyright (c) 2010-2011, Kaori Hagihara
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*! \file
- * \brief Modification of jpip.c from 2KAN indexer
- */
-
-#include <math.h>
-#include "opj_includes.h"
-
-#define MAX(a,b) ((a)>(b)?(a):(b))
-
-
-/*
- * Write faix box of tpix
- *
- * @param[in] coff offset of j2k codestream
- * @param[in] compno component number
- * @param[in] cstr_info codestream information
- * @param[in] j2klen length of j2k codestream
- * @param[in] cio file output handle
- * @return length of faix box
- */
-int write_tpixfaix( int coff, int compno, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio);
-
-
-int write_tpix( int coff, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio)
-{
- int len, lenp;
- lenp = cio_tell( cio);
- cio_skip( cio, 4); /* L [at the end] */
- cio_write( cio, JPIP_TPIX, 4); /* TPIX */
-
- write_tpixfaix( coff, 0, cstr_info, j2klen, cio);
-
- len = cio_tell( cio)-lenp;
- cio_seek( cio, lenp);
- cio_write( cio, len, 4); /* L */
- cio_seek( cio, lenp+len);
-
- return len;
-}
-
-
-/*
- * Get number of maximum tile parts per tile
- *
- * @param[in] cstr_info codestream information
- * @return number of maximum tile parts per tile
- */
-int get_num_max_tile_parts( opj_codestream_info_t cstr_info);
-
-int write_tpixfaix( int coff, int compno, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio)
-{
- int len, lenp;
- int i, j;
- int Aux;
- int num_max_tile_parts;
- int size_of_coding; /* 4 or 8 */
- opj_tp_info_t tp;
- int version;
-
- num_max_tile_parts = get_num_max_tile_parts( cstr_info);
-
- if( j2klen > pow( 2, 32)){
- size_of_coding = 8;
- version = num_max_tile_parts == 1 ? 1:3;
- }
- else{
- size_of_coding = 4;
- version = num_max_tile_parts == 1 ? 0:2;
- }
-
- lenp = cio_tell( cio);
- cio_skip( cio, 4); /* L [at the end] */
- cio_write( cio, JPIP_FAIX, 4); /* FAIX */
- cio_write( cio, version, 1); /* Version 0 = 4 bytes */
-
- cio_write( cio, num_max_tile_parts, size_of_coding); /* NMAX */
- cio_write( cio, cstr_info.tw*cstr_info.th, size_of_coding); /* M */
- for (i = 0; i < cstr_info.tw*cstr_info.th; i++){
- for (j = 0; j < cstr_info.tile[i].num_tps; j++){
- tp = cstr_info.tile[i].tp[j];
- cio_write( cio, tp.tp_start_pos-coff, size_of_coding); /* start position */
- cio_write( cio, tp.tp_end_pos-tp.tp_start_pos+1, size_of_coding); /* length */
- if (version & 0x02){
- if( cstr_info.tile[i].num_tps == 1 && cstr_info.numdecompos[compno] > 1)
- Aux = cstr_info.numdecompos[compno] + 1;
- else
- Aux = j + 1;
-
- cio_write( cio, Aux,4);
- /*cio_write(img.tile[i].tile_parts[j].num_reso_AUX,4);*/ /* Aux_i,j : Auxiliary value */
- /* fprintf(stderr,"AUX value %d\n",Aux);*/
- }
- /*cio_write(0,4);*/
- }
- /* PADDING */
- while (j < num_max_tile_parts){
- cio_write( cio, 0, size_of_coding); /* start position */
- cio_write( cio, 0, size_of_coding); /* length */
- if (version & 0x02)
- cio_write( cio, 0,4); /* Aux_i,j : Auxiliary value */
- j++;
- }
- }
-
- len = cio_tell( cio)-lenp;
- cio_seek( cio, lenp);
- cio_write( cio, len, 4); /* L */
- cio_seek( cio, lenp+len);
-
- return len;
-
-}
-
-int get_num_max_tile_parts( opj_codestream_info_t cstr_info)
-{
- int num_max_tp = 0, i;
-
- for( i=0; i<cstr_info.tw*cstr_info.th; i++)
- num_max_tp = MAX( cstr_info.tile[i].num_tps, num_max_tp);
-
- return num_max_tp;
-}
diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt
index 0147a4306f4..873bbfa36fa 100644
--- a/intern/cycles/CMakeLists.txt
+++ b/intern/cycles/CMakeLists.txt
@@ -3,7 +3,14 @@ if(NOT WITH_BLENDER AND WITH_CYCLES_STANDALONE)
set(CYCLES_INSTALL_PATH "")
else()
set(WITH_CYCLES_BLENDER ON)
- set(CYCLES_INSTALL_PATH "scripts/addons/cycles")
+ # WINDOWS_PYTHON_DEBUG needs to write into the user addons folder since it will
+ # be started with --env-system-scripts pointing to the release folder, which will
+ # lack the cycles addon, and we don't want to write into it.
+ if(NOT WINDOWS_PYTHON_DEBUG)
+ set(CYCLES_INSTALL_PATH "scripts/addons/cycles")
+ else()
+ set(CYCLES_INSTALL_PATH "$ENV{appdata}/blender foundation/blender/${BLENDER_VERSION}/scripts/addons/cycles")
+ endif()
endif()
# External Libraries
@@ -210,6 +217,15 @@ if(WITH_CYCLES_OSL)
)
endif()
+if(WITH_CYCLES_EMBREE)
+ add_definitions(-DWITH_EMBREE)
+ add_definitions(-DEMBREE_STATIC_LIB)
+ include_directories(
+ SYSTEM
+ ${EMBREE_INCLUDE_DIRS}
+ )
+endif()
+
if(WITH_CYCLES_OPENSUBDIV)
add_definitions(-DWITH_OPENSUBDIV)
include_directories(
@@ -283,12 +299,19 @@ if(WITH_CYCLES_CUDA_BINARIES AND (NOT WITH_CYCLES_CUBIN_COMPILER))
set(MAX_MSVC 1910)
elseif(${CUDA_VERSION} EQUAL "9.1")
set(MAX_MSVC 1911)
+ elseif(${CUDA_VERSION} EQUAL "10.0")
+ set(MAX_MSVC 1999)
endif()
if(NOT MSVC_VERSION LESS ${MAX_MSVC} OR CMAKE_C_COMPILER_ID MATCHES "Clang")
message(STATUS "nvcc not supported for this compiler version, using cycles_cubin_cc instead.")
set(WITH_CYCLES_CUBIN_COMPILER ON)
endif()
unset(MAX_MSVC)
+ elseif(APPLE)
+ if(${XCODE_VERSION} VERSION_GREATER_EQUAL 10.0)
+ message(STATUS "nvcc not supported for this compiler version, using cycles_cubin_cc instead.")
+ set(WITH_CYCLES_CUBIN_COMPILER ON)
+ endif()
endif()
endif()
diff --git a/intern/cycles/app/CMakeLists.txt b/intern/cycles/app/CMakeLists.txt
index 936da0075fe..35c54fff8a4 100644
--- a/intern/cycles/app/CMakeLists.txt
+++ b/intern/cycles/app/CMakeLists.txt
@@ -81,6 +81,9 @@ macro(cycles_target_link_libraries target)
if(WITH_CYCLES_OSL)
target_link_libraries(${target} ${OSL_LIBRARIES} ${LLVM_LIBRARIES})
endif()
+ if(WITH_CYCLES_EMBREE)
+ target_link_libraries(${target} ${EMBREE_LIBRARIES})
+ endif()
if(WITH_CYCLES_OPENSUBDIV)
target_link_libraries(${target} ${OPENSUBDIV_LIBRARIES})
endif()
@@ -134,7 +137,7 @@ if(WITH_CYCLES_CUBIN_COMPILER)
# to be build to compile the cubins.
if(MSVC AND NOT CMAKE_CL_64)
message("Building with CUDA not supported on 32 bit, skipped")
- set(WITH_CYCLES_CUDA_BINARIES OFF)
+ set(WITH_CYCLES_CUDA_BINARIES OFF CACHE BOOL "" FORCE)
else()
set(SRC
cycles_cubin_cc.cpp
@@ -147,6 +150,9 @@ if(WITH_CYCLES_CUBIN_COMPILER)
target_link_libraries(cycles_cubin_cc
extern_cuew
${OPENIMAGEIO_LIBRARIES}
+ ${OPENEXR_LIBRARIES}
+ ${PUGIXML_LIBRARIES}
+ ${BOOST_LIBRARIES}
${PLATFORM_LINKLIBS}
)
if(NOT CYCLES_STANDALONE_REPOSITORY)
diff --git a/intern/cycles/app/cycles_xml.h b/intern/cycles/app/cycles_xml.h
index 6a48980d8ea..a7bc1895d4e 100644
--- a/intern/cycles/app/cycles_xml.h
+++ b/intern/cycles/app/cycles_xml.h
@@ -29,4 +29,4 @@ void xml_read_file(Scene *scene, const char *filepath);
CCL_NAMESPACE_END
-#endif /* __CYCLES_XML_H__ */
+#endif /* __CYCLES_XML_H__ */
diff --git a/intern/cycles/blender/CCL_api.h b/intern/cycles/blender/CCL_api.h
index 233ffc8802c..b9750ad0c53 100644
--- a/intern/cycles/blender/CCL_api.h
+++ b/intern/cycles/blender/CCL_api.h
@@ -33,4 +33,4 @@ void CCL_logging_verbosity_set(int verbosity);
}
#endif
-#endif /* __CCL_API_H__ */
+#endif /* __CCL_API_H__ */
diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py
index 1604422211b..0b74150f981 100644
--- a/intern/cycles/blender/addon/engine.py
+++ b/intern/cycles/blender/addon/engine.py
@@ -257,21 +257,32 @@ def register_passes(engine, scene, srl):
if crl.use_pass_volume_indirect: engine.register_pass(scene, srl, "VolumeInd", 3, "RGB", 'COLOR')
cscene = scene.cycles
- if crl.use_denoising and crl.denoising_store_passes and not cscene.use_progressive_refine:
- engine.register_pass(scene, srl, "Denoising Normal", 3, "XYZ", 'VECTOR')
- engine.register_pass(scene, srl, "Denoising Normal Variance", 3, "XYZ", 'VECTOR')
- engine.register_pass(scene, srl, "Denoising Albedo", 3, "RGB", 'COLOR')
- engine.register_pass(scene, srl, "Denoising Albedo Variance", 3, "RGB", 'COLOR')
- engine.register_pass(scene, srl, "Denoising Depth", 1, "Z", 'VALUE')
- engine.register_pass(scene, srl, "Denoising Depth Variance", 1, "Z", 'VALUE')
- engine.register_pass(scene, srl, "Denoising Shadow A", 3, "XYV", 'VECTOR')
- engine.register_pass(scene, srl, "Denoising Shadow B", 3, "XYV", 'VECTOR')
- engine.register_pass(scene, srl, "Denoising Image", 3, "RGB", 'COLOR')
- engine.register_pass(scene, srl, "Denoising Image Variance", 3, "RGB", 'COLOR')
-
- clean_options = ("denoising_diffuse_direct", "denoising_diffuse_indirect",
- "denoising_glossy_direct", "denoising_glossy_indirect",
- "denoising_transmission_direct", "denoising_transmission_indirect",
- "denoising_subsurface_direct", "denoising_subsurface_indirect")
- if any(getattr(crl, option) for option in clean_options):
- engine.register_pass(scene, srl, "Denoising Clean", 3, "RGB", 'COLOR')
+
+ if crl.use_pass_crypto_object:
+ for i in range(0, crl.pass_crypto_depth, 2):
+ engine.register_pass(scene, srl, "CryptoObject" + '{:02d}'.format(i), 4, "RGBA", 'COLOR')
+ if crl.use_pass_crypto_material:
+ for i in range(0, crl.pass_crypto_depth, 2):
+ engine.register_pass(scene, srl, "CryptoMaterial" + '{:02d}'.format(i), 4, "RGBA", 'COLOR')
+ if srl.cycles.use_pass_crypto_asset:
+ for i in range(0, srl.cycles.pass_crypto_depth, 2):
+ engine.register_pass(scene, srl, "CryptoAsset" + '{:02d}'.format(i), 4, "RGBA", 'COLOR')
+
+ if crl.use_denoising or crl.denoising_store_passes:
+ engine.register_pass(scene, srl, "Noisy Image", 4, "RGBA", 'COLOR')
+ if crl.denoising_store_passes:
+ engine.register_pass(scene, srl, "Denoising Normal", 3, "XYZ", 'VECTOR')
+ engine.register_pass(scene, srl, "Denoising Normal Variance", 3, "XYZ", 'VECTOR')
+ engine.register_pass(scene, srl, "Denoising Albedo", 3, "RGB", 'COLOR')
+ engine.register_pass(scene, srl, "Denoising Albedo Variance", 3, "RGB", 'COLOR')
+ engine.register_pass(scene, srl, "Denoising Depth", 1, "Z", 'VALUE')
+ engine.register_pass(scene, srl, "Denoising Depth Variance", 1, "Z", 'VALUE')
+ engine.register_pass(scene, srl, "Denoising Shadow A", 3, "XYV", 'VECTOR')
+ engine.register_pass(scene, srl, "Denoising Shadow B", 3, "XYV", 'VECTOR')
+ engine.register_pass(scene, srl, "Denoising Image Variance", 3, "RGB", 'COLOR')
+ clean_options = ("denoising_diffuse_direct", "denoising_diffuse_indirect",
+ "denoising_glossy_direct", "denoising_glossy_indirect",
+ "denoising_transmission_direct", "denoising_transmission_indirect",
+ "denoising_subsurface_direct", "denoising_subsurface_indirect")
+ if any(getattr(crl, option) for option in clean_options):
+ engine.register_pass(scene, srl, "Denoising Clean", 3, "RGB", 'COLOR')
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index 3c82f5675c5..0d68138ffb4 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -529,6 +529,11 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
items=enum_bvh_types,
default='DYNAMIC_BVH',
)
+ use_bvh_embree: BoolProperty(
+ name="Use Embree",
+ description="Use Embree as ray accelerator",
+ default=False,
+ )
debug_use_spatial_splits: BoolProperty(
name="Use Spatial Splits",
description="Use BVH spatial splits: longer builder time, faster render",
@@ -1347,6 +1352,36 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
default=False,
update=update_render_passes,
)
+ use_pass_crypto_object: BoolProperty(
+ name="Cryptomatte Object",
+ description="Render cryptomatte object pass, for isolating objects in compositing",
+ default=False,
+ update=update_render_passes,
+ )
+ use_pass_crypto_material: BoolProperty(
+ name="Cryptomatte Material",
+ description="Render cryptomatte material pass, for isolating materials in compositing",
+ default=False,
+ update=update_render_passes,
+ )
+ use_pass_crypto_asset: BoolProperty(
+ name="Cryptomatte Asset",
+ description="Render cryptomatte asset pass, for isolating groups of objects with the same parent",
+ default=False,
+ update=update_render_passes,
+ )
+ pass_crypto_depth: IntProperty(
+ name="Cryptomatte Levels",
+ description="Sets how many unique objects can be distinguished per pixel",
+ default=6, min=2, max=16, step=2,
+ update=update_render_passes,
+ )
+ pass_crypto_accurate: BoolProperty(
+ name="Cryptomatte Accurate",
+ description="Generate a more accurate Cryptomatte pass. CPU only, may render slower and use more memory",
+ default=True,
+ update=update_render_passes,
+ )
@classmethod
def register(cls):
@@ -1362,12 +1397,10 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
class CyclesDeviceSettings(bpy.types.PropertyGroup):
- @classmethod
- def register(cls):
- cls.id = StringProperty(name="ID")
- cls.name = StringProperty(name="Name")
- cls.use = BoolProperty(name="Use", default=True)
- cls.type = EnumProperty(name="Type", items=enum_device_type, default='CUDA')
+ id: StringProperty(name="ID")
+ name: StringProperty(name="Name")
+ use: BoolProperty(name="Use", default=True)
+ type: EnumProperty(name="Type", items=enum_device_type, default='CUDA')
class CyclesPreferences(bpy.types.AddonPreferences):
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index 76706a83e30..6372a2f5eba 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -19,6 +19,7 @@
import bpy
from bpy_extras.node_utils import find_node_input
from bl_operators.presets import PresetMenu
+import _cycles
from bpy.types import (
Panel,
@@ -27,7 +28,7 @@ from bpy.types import (
)
-class CYCLES_MT_sampling_presets(PresetMenu):
+class CYCLES_PT_sampling_presets(PresetMenu):
bl_label = "Sampling Presets"
preset_subdir = "cycles/sampling"
preset_operator = "script.execute_preset"
@@ -35,7 +36,7 @@ class CYCLES_MT_sampling_presets(PresetMenu):
COMPAT_ENGINES = {'CYCLES'}
-class CYCLES_MT_integrator_presets(PresetMenu):
+class CYCLES_PT_integrator_presets(PresetMenu):
bl_label = "Integrator Presets"
preset_subdir = "cycles/integrator"
preset_operator = "script.execute_preset"
@@ -143,10 +144,9 @@ def draw_samples_info(layout, context):
class CYCLES_RENDER_PT_sampling(CyclesButtonsPanel, Panel):
bl_label = "Sampling"
- bl_options = {'DEFAULT_CLOSED'}
def draw_header_preset(self, context):
- CYCLES_MT_sampling_presets.draw_panel_header(self.layout)
+ CYCLES_PT_sampling_presets.draw_panel_header(self.layout)
def draw(self, context):
layout = self.layout
@@ -155,6 +155,7 @@ class CYCLES_RENDER_PT_sampling(CyclesButtonsPanel, Panel):
cscene = scene.cycles
layout.use_property_split = True
+ layout.use_property_decorate = False
layout.prop(cscene, "progressive")
@@ -162,51 +163,28 @@ class CYCLES_RENDER_PT_sampling(CyclesButtonsPanel, Panel):
col = layout.column(align=True)
col.prop(cscene, "samples", text="Render")
col.prop(cscene, "preview_samples", text="Viewport")
- col.separator()
- col.prop(cscene, "use_square_samples") # Duplicate below.
-
-class CYCLES_RENDER_PT_sampling_aa_samples(CyclesButtonsPanel, Panel):
- bl_label = "AA Samples"
- bl_parent_id = "CYCLES_RENDER_PT_sampling"
-
- @classmethod
- def poll(self, context):
- scene = context.scene
- cscene = scene.cycles
- if cscene.progressive == 'PATH' or use_branched_path(context) is False:
- return False
+ draw_samples_info(layout, context)
else:
- return True
-
- def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
-
- scene = context.scene
- cscene = scene.cycles
-
- col = layout.column(align=True)
- col.prop(cscene, "aa_samples", text="Render")
- col.prop(cscene, "preview_aa_samples", text="Preview")
+ col = layout.column(align=True)
+ col.prop(cscene, "aa_samples", text="Render")
+ col.prop(cscene, "preview_aa_samples", text="Viewport")
-class CYCLES_RENDER_PT_sampling_samples(CyclesButtonsPanel, Panel):
- bl_label = "Samples"
+class CYCLES_RENDER_PT_sampling_sub_samples(CyclesButtonsPanel, Panel):
+ bl_label = "Sub Samples"
bl_parent_id = "CYCLES_RENDER_PT_sampling"
@classmethod
def poll(self, context):
scene = context.scene
cscene = scene.cycles
- if cscene.progressive == 'PATH' or use_branched_path(context) is False:
- return False
- else:
- return True
+ return cscene.progressive != 'PATH' and use_branched_path(context)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
cscene = scene.cycles
@@ -222,53 +200,101 @@ class CYCLES_RENDER_PT_sampling_samples(CyclesButtonsPanel, Panel):
sub.prop(cscene, "mesh_light_samples", text="Mesh Light")
col.prop(cscene, "subsurface_samples", text="Subsurface")
col.prop(cscene, "volume_samples", text="Volume")
- col.separator()
- col.prop(cscene, "use_square_samples") # Duplicate above.
-
- col = layout.column(align=True)
- col.prop(cscene, "sample_all_lights_direct")
- col.prop(cscene, "sample_all_lights_indirect")
-
- row = layout.row(align=True)
- row.prop(cscene, "seed")
- row.prop(cscene, "use_animated_seed", text="", icon='TIME')
- layout.prop(cscene, "sampling_pattern", text="Pattern")
+ draw_samples_info(layout, context)
-class CYCLES_RENDER_PT_sampling_light(CyclesButtonsPanel, Panel):
- bl_label = "Light"
+class CYCLES_RENDER_PT_sampling_advanced(CyclesButtonsPanel, Panel):
+ bl_label = "Advanced"
bl_parent_id = "CYCLES_RENDER_PT_sampling"
bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
cscene = scene.cycles
+ row = layout.row(align=True)
+ row.prop(cscene, "seed")
+ row.prop(cscene, "use_animated_seed", text="", icon='TIME')
+
+ layout.prop(cscene, "sampling_pattern", text="Pattern")
+
+ layout.prop(cscene, "use_square_samples")
+
+ layout.separator()
+
col = layout.column(align=True)
col.prop(cscene, "light_sampling_threshold", text="Light Threshold")
- col = layout.column(align=True)
- col.prop(cscene, "sample_clamp_direct")
- col.prop(cscene, "sample_clamp_indirect")
+ if cscene.progressive != 'PATH' and use_branched_path(context):
+ col = layout.column(align=True)
+ col.prop(cscene, "sample_all_lights_direct")
+ col.prop(cscene, "sample_all_lights_indirect")
- draw_samples_info(layout, context)
+class CYCLES_RENDER_PT_sampling_total(CyclesButtonsPanel, Panel):
+ bl_label = "Total Samples"
+ bl_parent_id = "CYCLES_RENDER_PT_sampling"
-class CYCLES_RENDER_PT_geometry(CyclesButtonsPanel, Panel):
- bl_label = "Geometry"
- bl_options = {'DEFAULT_CLOSED'}
+ @classmethod
+ def poll(self, context):
+ scene = context.scene
+ cscene = scene.cycles
+
+ if cscene.use_square_samples:
+ return True
+
+ return cscene.progressive != 'PATH' and use_branched_path(context)
def draw(self, context):
- pass
+ layout = self.layout
+ cscene = context.scene.cycles
+ integrator = cscene.progressive
+
+ # Calculate sample values
+ if integrator == 'PATH':
+ aa = cscene.samples
+ if cscene.use_square_samples:
+ aa = aa * aa
+ else:
+ aa = cscene.aa_samples
+ d = cscene.diffuse_samples
+ g = cscene.glossy_samples
+ t = cscene.transmission_samples
+ ao = cscene.ao_samples
+ ml = cscene.mesh_light_samples
+ sss = cscene.subsurface_samples
+ vol = cscene.volume_samples
+
+ if cscene.use_square_samples:
+ aa = aa * aa
+ d = d * d
+ g = g * g
+ t = t * t
+ ao = ao * ao
+ ml = ml * ml
+ sss = sss * sss
+ vol = vol * vol
+
+ col = layout.column(align=True)
+ col.scale_y = 0.6
+ if integrator == 'PATH':
+ col.label(text="%s AA" % aa)
+ else:
+ col.label(text="%s AA, %s Diffuse, %s Glossy, %s Transmission" %
+ (aa, d * aa, g * aa, t * aa))
+ col.separator()
+ col.label(text="%s AO, %s Mesh Light, %s Subsurface, %s Volume" %
+ (ao * aa, ml * aa, sss * aa, vol * aa))
-class CYCLES_RENDER_PT_geometry_subdivision(CyclesButtonsPanel, Panel):
+class CYCLES_RENDER_PT_subdivision(CyclesButtonsPanel, Panel):
bl_label = "Subdivision"
- bl_parent_id = "CYCLES_RENDER_PT_geometry"
+ bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(self, context):
@@ -277,6 +303,7 @@ class CYCLES_RENDER_PT_geometry_subdivision(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
cscene = scene.cycles
@@ -294,26 +321,8 @@ class CYCLES_RENDER_PT_geometry_subdivision(CyclesButtonsPanel, Panel):
col.prop(cscene, "dicing_camera")
-class CYCLES_RENDER_PT_geometry_volume(CyclesButtonsPanel, Panel):
- bl_label = "Volume"
- bl_parent_id = "CYCLES_RENDER_PT_geometry"
-
- def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
-
- scene = context.scene
- cscene = scene.cycles
- ccscene = scene.cycles_curves
-
- col = layout.column()
- col.prop(cscene, "volume_step_size", text="Step Size")
- col.prop(cscene, "volume_max_steps", text="Max Steps")
-
-
-class CYCLES_RENDER_PT_geometry_hair(CyclesButtonsPanel, Panel):
+class CYCLES_RENDER_PT_hair(CyclesButtonsPanel, Panel):
bl_label = "Hair"
- bl_parent_id = "CYCLES_RENDER_PT_geometry"
bl_options = {'DEFAULT_CLOSED'}
def draw_header(self, context):
@@ -327,6 +336,7 @@ class CYCLES_RENDER_PT_geometry_hair(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
cscene = scene.cycles
@@ -348,12 +358,30 @@ class CYCLES_RENDER_PT_geometry_hair(CyclesButtonsPanel, Panel):
col.prop(ccscene, "subdivisions", text="Curve subdivisions")
+class CYCLES_RENDER_PT_volumes(CyclesButtonsPanel, Panel):
+ bl_label = "Volumes"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ scene = context.scene
+ cscene = scene.cycles
+ ccscene = scene.cycles_curves
+
+ col = layout.column()
+ col.prop(cscene, "volume_step_size", text="Step Size")
+ col.prop(cscene, "volume_max_steps", text="Max Steps")
+
+
class CYCLES_RENDER_PT_light_paths(CyclesButtonsPanel, Panel):
bl_label = "Light Paths"
bl_options = {'DEFAULT_CLOSED'}
def draw_header_preset(self, context):
- CYCLES_MT_integrator_presets.draw_panel_header(self.layout)
+ CYCLES_PT_integrator_presets.draw_panel_header(self.layout)
def draw(self, context):
pass
@@ -366,6 +394,7 @@ class CYCLES_RENDER_PT_light_paths_max_bounces(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
cscene = scene.cycles
@@ -381,14 +410,31 @@ class CYCLES_RENDER_PT_light_paths_max_bounces(CyclesButtonsPanel, Panel):
col.prop(cscene, "volume_bounces", text="Volume")
+class CYCLES_RENDER_PT_light_paths_clamping(CyclesButtonsPanel, Panel):
+ bl_label = "Clamping"
+ bl_parent_id = "CYCLES_RENDER_PT_light_paths"
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ scene = context.scene
+ cscene = scene.cycles
+
+ col = layout.column(align=True)
+ col.prop(cscene, "sample_clamp_direct", text="Direct Light")
+ col.prop(cscene, "sample_clamp_indirect", text="Indirect Light")
+
+
class CYCLES_RENDER_PT_light_paths_caustics(CyclesButtonsPanel, Panel):
bl_label = "Caustics"
bl_parent_id = "CYCLES_RENDER_PT_light_paths"
- bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
cscene = scene.cycles
@@ -411,6 +457,7 @@ class CYCLES_RENDER_PT_motion_blur(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
cscene = scene.cycles
@@ -435,6 +482,7 @@ class CYCLES_RENDER_PT_motion_blur_curve(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
cscene = scene.cycles
@@ -462,6 +510,7 @@ class CYCLES_RENDER_PT_film(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
cscene = scene.cycles
@@ -485,6 +534,7 @@ class CYCLES_RENDER_PT_film_transparency(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
cscene = scene.cycles
@@ -501,11 +551,11 @@ class CYCLES_RENDER_PT_film_transparency(CyclesButtonsPanel, Panel):
class CYCLES_RENDER_PT_film_pixel_filter(CyclesButtonsPanel, Panel):
bl_label = "Pixel Filter"
bl_parent_id = "CYCLES_RENDER_PT_film"
- bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
cscene = scene.cycles
@@ -520,20 +570,7 @@ class CYCLES_RENDER_PT_performance(CyclesButtonsPanel, Panel):
bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
-
- scene = context.scene
- rd = scene.render
- cscene = scene.cycles
-
- col = layout.column()
- col.active = show_device_active(context)
- col.prop(cscene, "device")
-
- from . import engine
- if engine.with_osl() and use_cpu(context):
- col.prop(cscene, "shading_system")
+ pass
class CYCLES_RENDER_PT_performance_threads(CyclesButtonsPanel, Panel):
@@ -543,6 +580,7 @@ class CYCLES_RENDER_PT_performance_threads(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
rd = scene.render
@@ -563,6 +601,7 @@ class CYCLES_RENDER_PT_performance_tiles(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
rd = scene.render
@@ -586,11 +625,11 @@ class CYCLES_RENDER_PT_performance_tiles(CyclesButtonsPanel, Panel):
class CYCLES_RENDER_PT_performance_acceleration_structure(CyclesButtonsPanel, Panel):
bl_label = "Acceleration Structure"
bl_parent_id = "CYCLES_RENDER_PT_performance"
- bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
rd = scene.render
@@ -598,21 +637,27 @@ class CYCLES_RENDER_PT_performance_acceleration_structure(CyclesButtonsPanel, Pa
col = layout.column()
+ if _cycles.with_embree:
+ row = col.row()
+ row.active = use_cpu(context)
+ row.prop(cscene, "use_bvh_embree")
col.prop(cscene, "debug_use_spatial_splits")
- col.prop(cscene, "debug_use_hair_bvh")
sub = col.column()
- sub.active = not cscene.debug_use_spatial_splits
+ sub.active = not cscene.use_bvh_embree or not _cycles.with_embree
+ sub.prop(cscene, "debug_use_hair_bvh")
+ sub = col.column()
+ sub.active = not cscene.debug_use_spatial_splits and not cscene.use_bvh_embree
sub.prop(cscene, "debug_bvh_time_steps")
class CYCLES_RENDER_PT_performance_final_render(CyclesButtonsPanel, Panel):
bl_label = "Final Render"
bl_parent_id = "CYCLES_RENDER_PT_performance"
- bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
rd = scene.render
@@ -627,11 +672,11 @@ class CYCLES_RENDER_PT_performance_final_render(CyclesButtonsPanel, Panel):
class CYCLES_RENDER_PT_performance_viewport(CyclesButtonsPanel, Panel):
bl_label = "Viewport"
bl_parent_id = "CYCLES_RENDER_PT_performance"
- bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
rd = scene.render
@@ -644,104 +689,200 @@ class CYCLES_RENDER_PT_performance_viewport(CyclesButtonsPanel, Panel):
class CYCLES_RENDER_PT_filter(CyclesButtonsPanel, Panel):
bl_label = "Filter"
+ bl_options = {'DEFAULT_CLOSED'}
bl_context = "view_layer"
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
with_freestyle = bpy.app.build_options.freestyle
scene = context.scene
rd = scene.render
view_layer = context.view_layer
- col = layout.column()
- col.prop(view_layer, "use_sky", text="Use Environment")
- col.prop(view_layer, "use_ao", text="Use Ambient Occlusion")
- col.prop(view_layer, "use_solid", text="Use Surfaces")
- col.prop(view_layer, "use_strand", text="Use Hair")
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+
+ col = flow.column()
+ col.prop(view_layer, "use_sky", text="Environment")
+ col = flow.column()
+ col.prop(view_layer, "use_ao", text="Ambient Occlusion")
+ col = flow.column()
+ col.prop(view_layer, "use_solid", text="Surfaces")
+ col = flow.column()
+ col.prop(view_layer, "use_strand", text="Hair")
if with_freestyle:
- row = col.row()
- row.prop(view_layer, "use_freestyle", text="Use Freestyle")
- row.active = rd.use_freestyle
+ col = flow.column()
+ col.prop(view_layer, "use_freestyle", text="Freestyle")
+ col.active = rd.use_freestyle
-class CYCLES_RENDER_PT_layer_passes(CyclesButtonsPanel, Panel):
+class CYCLES_RENDER_PT_passes(CyclesButtonsPanel, Panel):
bl_label = "Passes"
bl_context = "view_layer"
bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
- import _cycles
+ pass
+
+class CYCLES_RENDER_PT_passes_data(CyclesButtonsPanel, Panel):
+ bl_label = "Data"
+ bl_context = "view_layer"
+ bl_parent_id = "CYCLES_RENDER_PT_passes"
+
+ def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
rd = scene.render
view_layer = context.view_layer
cycles_view_layer = view_layer.cycles
- split = layout.split()
-
- col = split.column()
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+ col = flow.column()
col.prop(view_layer, "use_pass_combined")
+ col = flow.column()
col.prop(view_layer, "use_pass_z")
+ col = flow.column()
col.prop(view_layer, "use_pass_mist")
+ col = flow.column()
col.prop(view_layer, "use_pass_normal")
- row = col.row()
- row.prop(view_layer, "use_pass_vector")
- row.active = not rd.use_motion_blur
+ col = flow.column()
+ col.prop(view_layer, "use_pass_vector")
+ col.active = not rd.use_motion_blur
+ col = flow.column()
col.prop(view_layer, "use_pass_uv")
+ col = flow.column()
col.prop(view_layer, "use_pass_object_index")
+ col = flow.column()
col.prop(view_layer, "use_pass_material_index")
- col.separator()
- col.prop(view_layer, "use_pass_shadow")
- col.prop(view_layer, "use_pass_ambient_occlusion", text="Ambient Occlusion")
- col.separator()
- col.prop(view_layer, "pass_alpha_threshold")
- col = split.column()
- col.label(text="Diffuse:")
- row = col.row(align=True)
+ layout.separator()
+
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+ col = flow.column()
+ col.prop(cycles_view_layer, "denoising_store_passes", text="Denoising Data")
+ col = flow.column()
+ col.prop(cycles_view_layer, "pass_debug_render_time", text="Render Time")
+
+ layout.separator()
+
+ layout.prop(view_layer, "pass_alpha_threshold")
+
+
+class CYCLES_RENDER_PT_passes_light(CyclesButtonsPanel, Panel):
+ bl_label = "Light"
+ bl_context = "view_layer"
+ bl_parent_id = "CYCLES_RENDER_PT_passes"
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ scene = context.scene
+ view_layer = context.view_layer
+ cycles_view_layer = view_layer.cycles
+
+ split = layout.split(factor=0.35)
+ split.use_property_split = False
+ split.label(text="Diffuse")
+ row = split.row(align=True)
row.prop(view_layer, "use_pass_diffuse_direct", text="Direct", toggle=True)
row.prop(view_layer, "use_pass_diffuse_indirect", text="Indirect", toggle=True)
row.prop(view_layer, "use_pass_diffuse_color", text="Color", toggle=True)
- col.label(text="Glossy:")
- row = col.row(align=True)
+
+ split = layout.split(factor=0.35)
+ split.use_property_split = False
+ split.label(text="Glossy")
+ row = split.row(align=True)
row.prop(view_layer, "use_pass_glossy_direct", text="Direct", toggle=True)
row.prop(view_layer, "use_pass_glossy_indirect", text="Indirect", toggle=True)
row.prop(view_layer, "use_pass_glossy_color", text="Color", toggle=True)
- col.label(text="Transmission:")
- row = col.row(align=True)
+
+ split = layout.split(factor=0.35)
+ split.use_property_split = False
+ split.label(text="Transmission")
+ row = split.row(align=True)
row.prop(view_layer, "use_pass_transmission_direct", text="Direct", toggle=True)
row.prop(view_layer, "use_pass_transmission_indirect", text="Indirect", toggle=True)
row.prop(view_layer, "use_pass_transmission_color", text="Color", toggle=True)
- col.label(text="Subsurface:")
- row = col.row(align=True)
+
+ split = layout.split(factor=0.35)
+ split.use_property_split = False
+ split.label(text="Subsurface")
+ row = split.row(align=True)
row.prop(view_layer, "use_pass_subsurface_direct", text="Direct", toggle=True)
row.prop(view_layer, "use_pass_subsurface_indirect", text="Indirect", toggle=True)
row.prop(view_layer, "use_pass_subsurface_color", text="Color", toggle=True)
- col.label(text="Volume:")
- row = col.row(align=True)
+
+ split = layout.split(factor=0.35)
+ split.use_property_split = False
+ split.label(text="Volume")
+ row = split.row(align=True)
row.prop(cycles_view_layer, "use_pass_volume_direct", text="Direct", toggle=True)
row.prop(cycles_view_layer, "use_pass_volume_indirect", text="Indirect", toggle=True)
- col.separator()
+ col = layout.column(align=True)
col.prop(view_layer, "use_pass_emit", text="Emission")
col.prop(view_layer, "use_pass_environment")
+ col.prop(view_layer, "use_pass_shadow")
+ col.prop(view_layer, "use_pass_ambient_occlusion", text="Ambient Occlusion")
- if context.scene.cycles.feature_set == 'EXPERIMENTAL':
- col.separator()
- sub = col.column()
- sub.active = cycles_view_layer.use_denoising
- sub.prop(cycles_view_layer, "denoising_store_passes", text="Denoising")
- col = layout.column()
- col.prop(cycles_view_layer, "pass_debug_render_time")
- if _cycles.with_cycles_debug:
- col.prop(cycles_view_layer, "pass_debug_bvh_traversed_nodes")
- col.prop(cycles_view_layer, "pass_debug_bvh_traversed_instances")
- col.prop(cycles_view_layer, "pass_debug_bvh_intersections")
- col.prop(cycles_view_layer, "pass_debug_ray_bounces")
+class CYCLES_RENDER_PT_passes_crypto(CyclesButtonsPanel, Panel):
+ bl_label = "Cryptomatte"
+ bl_context = "view_layer"
+ bl_parent_id = "CYCLES_RENDER_PT_passes"
+
+ def draw(self, context):
+ import _cycles
+
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ cycles_view_layer = context.view_layer.cycles
+
+ row = layout.row(align=True)
+ row.use_property_split = False
+ row.prop(cycles_view_layer, "use_pass_crypto_object", text="Object", toggle=True)
+ row.prop(cycles_view_layer, "use_pass_crypto_material", text="Material", toggle=True)
+ row.prop(cycles_view_layer, "use_pass_crypto_asset", text="Asset", toggle=True)
+
+ layout.prop(cycles_view_layer, "pass_crypto_depth", text="Levels")
+
+ row = layout.row(align=True)
+ row.active = use_cpu(context)
+ row.prop(cycles_view_layer, "pass_crypto_accurate", text="Accurate Mode")
+
+
+class CYCLES_RENDER_PT_passes_debug(CyclesButtonsPanel, Panel):
+ bl_label = "Debug"
+ bl_context = "view_layer"
+ bl_parent_id = "CYCLES_RENDER_PT_passes"
+
+ @classmethod
+ def poll(cls, context):
+ import _cycles
+ return _cycles.with_cycles_debug
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ cycles_view_layer = context.view_layer.cycles
+
+ layout.prop(cycles_view_layer, "pass_debug_bvh_traversed_nodes")
+ layout.prop(cycles_view_layer, "pass_debug_bvh_traversed_instances")
+ layout.prop(cycles_view_layer, "pass_debug_bvh_intersections")
+ layout.prop(cycles_view_layer, "pass_debug_ray_bounces")
class CYCLES_RENDER_PT_denoising(CyclesButtonsPanel, Panel):
@@ -761,72 +902,67 @@ class CYCLES_RENDER_PT_denoising(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
cscene = scene.cycles
view_layer = context.view_layer
cycles_view_layer = view_layer.cycles
- layout.active = cycles_view_layer.use_denoising
-
- col = layout.column()
- sub = col.column()
- sub.prop(cycles_view_layer, "denoising_radius", text="Radius")
- sub.prop(cycles_view_layer, "denoising_strength", slider=True, text="Strength")
-
- sub = col.column(align=True)
- sub.prop(cycles_view_layer, "denoising_feature_strength", slider=True, text="Feature Strength")
- sub.prop(cycles_view_layer, "denoising_relative_pca")
+ split = layout.split()
+ split.active = cycles_view_layer.use_denoising
-# layout.use_property_split = False
+ layout = layout.column(align=True)
+ layout.prop(cycles_view_layer, "denoising_feature_strength", slider=True, text="Feature Strength")
+ layout.prop(cycles_view_layer, "denoising_relative_pca")
- """
layout.separator()
- col = layout.column(align=True)
- col.prop(cycles_view_layer, "denoising_diffuse_direct", text="Diffuse Direct")
- col.prop(cycles_view_layer, "denoising_diffuse_indirect", text="Indirect")
-
- col = layout.column(align=True)
- col.prop(cycles_view_layer, "denoising_glossy_direct", text="Glossy Direct")
- col.prop(cycles_view_layer, "denoising_glossy_indirect", text="Indirect")
-
- col = layout.column(align=True)
- col.prop(cycles_view_layer, "denoising_transmission_direct", text="Transmission Direct")
- col.prop(cycles_view_layer, "denoising_transmission_indirect", text="Indirect")
-
- col = layout.column(align=True)
- col.prop(cycles_view_layer, "denoising_subsurface_direct", text="Subsurface Direct")
- col.prop(cycles_view_layer, "denoising_subsurface_indirect", text="Indirect")
- """
-
- layout.use_property_split = False
-
split = layout.split(factor=0.5)
- split.label(text="Diffuse")
+ split.active = cycles_view_layer.use_denoising or cycles_view_layer.denoising_store_passes
+
col = split.column()
- row = col.row(align=True)
+ col.alignment = 'RIGHT'
+ col.label(text="Diffuse")
+
+ row = split.row(align=True)
+ row.use_property_split = False
row.prop(cycles_view_layer, "denoising_diffuse_direct", text="Direct", toggle=True)
row.prop(cycles_view_layer, "denoising_diffuse_indirect", text="Indirect", toggle=True)
split = layout.split(factor=0.5)
- split.label(text="Glossy")
+ split.active = cycles_view_layer.use_denoising or cycles_view_layer.denoising_store_passes
+
col = split.column()
- row = col.row(align=True)
+ col.alignment = 'RIGHT'
+ col.label(text="Glossy")
+
+ row = split.row(align=True)
+ row.use_property_split = False
row.prop(cycles_view_layer, "denoising_glossy_direct", text="Direct", toggle=True)
row.prop(cycles_view_layer, "denoising_glossy_indirect", text="Indirect", toggle=True)
split = layout.split(factor=0.5)
- split.label(text="Transmission")
+ split.active = cycles_view_layer.use_denoising or cycles_view_layer.denoising_store_passes
+
col = split.column()
- row = col.row(align=True)
+ col.alignment = 'RIGHT'
+ col.label(text="Transmission")
+
+ row = split.row(align=True)
+ row.use_property_split = False
row.prop(cycles_view_layer, "denoising_transmission_direct", text="Direct", toggle=True)
row.prop(cycles_view_layer, "denoising_transmission_indirect", text="Indirect", toggle=True)
split = layout.split(factor=0.5)
- split.label(text="Subsurface")
+ split.active = cycles_view_layer.use_denoising or cycles_view_layer.denoising_store_passes
+
col = split.column()
- row = col.row(align=True)
+ col.alignment = 'RIGHT'
+ col.label(text="Subsurface")
+
+ row = split.row(align=True)
+ row.use_property_split = False
row.prop(cycles_view_layer, "denoising_subsurface_direct", text="Direct", toggle=True)
row.prop(cycles_view_layer, "denoising_subsurface_indirect", text="Indirect", toggle=True)
@@ -834,10 +970,12 @@ class CYCLES_RENDER_PT_denoising(CyclesButtonsPanel, Panel):
class CYCLES_PT_post_processing(CyclesButtonsPanel, Panel):
bl_label = "Post Processing"
bl_options = {'DEFAULT_CLOSED'}
+ bl_context = "output"
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
rd = context.scene.render
@@ -957,8 +1095,8 @@ class CYCLES_PT_context_material(CyclesButtonsPanel, Panel):
row.template_list("MATERIAL_UL_matslots", "", ob, "material_slots", ob, "active_material_index", rows=rows)
col = row.column(align=True)
- col.operator("object.material_slot_add", icon='ZOOMIN', text="")
- col.operator("object.material_slot_remove", icon='ZOOMOUT', text="")
+ col.operator("object.material_slot_add", icon='ADD', text="")
+ col.operator("object.material_slot_remove", icon='REMOVE', text="")
col.menu("MATERIAL_MT_specials", icon='DOWNARROW_HLT', text="")
@@ -1048,7 +1186,18 @@ class CYCLES_OBJECT_PT_cycles_settings(CyclesButtonsPanel, Panel):
(ob.dupli_type == 'COLLECTION' and ob.dupli_group)))
def draw(self, context):
+ pass
+
+
+class CYCLES_OBJECT_PT_cycles_settings_ray_visibility(CyclesButtonsPanel, Panel):
+ bl_label = "Ray Visibility"
+ bl_parent_id = "CYCLES_OBJECT_PT_cycles_settings"
+ bl_context = "object"
+
+ def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
cscene = scene.cycles
@@ -1056,32 +1205,59 @@ class CYCLES_OBJECT_PT_cycles_settings(CyclesButtonsPanel, Panel):
cob = ob.cycles
visibility = ob.cycles_visibility
- layout.label(text="Ray Visibility:")
- flow = layout.column_flow()
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
- flow.prop(visibility, "camera")
- flow.prop(visibility, "diffuse")
- flow.prop(visibility, "glossy")
- flow.prop(visibility, "transmission")
- flow.prop(visibility, "scatter")
+ col = flow.column()
+ col.prop(visibility, "camera")
+ col = flow.column()
+ col.prop(visibility, "diffuse")
+ col = flow.column()
+ col.prop(visibility, "glossy")
+ col = flow.column()
+ col.prop(visibility, "transmission")
+ col = flow.column()
+ col.prop(visibility, "scatter")
if ob.type != 'LIGHT':
- flow.prop(visibility, "shadow")
+ col = flow.column()
+ col.prop(visibility, "shadow")
- row = layout.row()
- row.prop(cob, "is_shadow_catcher")
- row.prop(cob, "is_holdout")
+ layout.separator()
- col = layout.column()
- col.label(text="Performance:")
- row = col.row()
- sub = row.row()
- sub.active = scene.render.use_simplify and cscene.use_camera_cull
- sub.prop(cob, "use_camera_cull")
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+
+ col = flow.column()
+ col.prop(cob, "is_shadow_catcher")
+ col = flow.column()
+ col.prop(cob, "is_holdout")
+
+
+class CYCLES_OBJECT_PT_cycles_settings_performance(CyclesButtonsPanel, Panel):
+ bl_label = "Performance"
+ bl_parent_id = "CYCLES_OBJECT_PT_cycles_settings"
+ bl_context = "object"
+
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ scene = context.scene
+ cscene = scene.cycles
+ ob = context.object
+ cob = ob.cycles
+ visibility = ob.cycles_visibility
+
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
- sub = row.row()
- sub.active = scene.render.use_simplify and cscene.use_distance_cull
- sub.prop(cob, "use_distance_cull")
+ col = flow.column()
+ col.active = scene.render.use_simplify and cscene.use_camera_cull
+ col.prop(cob, "use_camera_cull")
+
+ col = flow.column()
+ col.active = scene.render.use_simplify and cscene.use_distance_cull
+ col.prop(cob, "use_distance_cull")
class CYCLES_OT_use_shading_nodes(Operator):
@@ -1163,6 +1339,7 @@ class CYCLES_LIGHT_PT_light(CyclesButtonsPanel, Panel):
layout.prop(light, "type", expand=True)
layout.use_property_split = True
+ layout.use_property_decorate = False
col = layout.column()
@@ -1229,6 +1406,7 @@ class CYCLES_LIGHT_PT_spot(CyclesButtonsPanel, Panel):
layout = self.layout
light = context.light
layout.use_property_split = True
+ layout.use_property_decorate = False
col = layout.column()
col.prop(light, "spot_size", text="Size")
@@ -1299,6 +1477,7 @@ class CYCLES_WORLD_PT_ambient_occlusion(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
light = context.world.light_settings
scene = context.scene
@@ -1373,6 +1552,7 @@ class CYCLES_WORLD_PT_settings(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
world = context.world
cworld = world.cycles
@@ -1393,6 +1573,7 @@ class CYCLES_WORLD_PT_settings_surface(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
world = context.world
cworld = world.cycles
@@ -1424,6 +1605,7 @@ class CYCLES_WORLD_PT_settings_volume(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
world = context.world
cworld = world.cycles
@@ -1504,6 +1686,7 @@ class CYCLES_MATERIAL_PT_displacement(CyclesButtonsPanel, Panel):
class CYCLES_MATERIAL_PT_settings(CyclesButtonsPanel, Panel):
bl_label = "Settings"
bl_context = "material"
+ bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
@@ -1512,6 +1695,7 @@ class CYCLES_MATERIAL_PT_settings(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
mat = context.material
cmat = mat.cycles
@@ -1531,6 +1715,7 @@ class CYCLES_MATERIAL_PT_settings_surface(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
mat = context.material
cmat = mat.cycles
@@ -1553,6 +1738,7 @@ class CYCLES_MATERIAL_PT_settings_volume(CyclesButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
mat = context.material
cmat = mat.cycles
@@ -1704,9 +1890,10 @@ class CYCLES_RENDER_PT_debug(CyclesButtonsPanel, Panel):
col.prop(cscene, "debug_bvh_type")
-class CYCLES_SCENE_PT_simplify(CyclesButtonsPanel, Panel):
+class CYCLES_RENDER_PT_simplify(CyclesButtonsPanel, Panel):
bl_label = "Simplify"
- bl_context = "scene"
+ bl_context = "render"
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'CYCLES'}
def draw_header(self, context):
@@ -1717,15 +1904,16 @@ class CYCLES_SCENE_PT_simplify(CyclesButtonsPanel, Panel):
pass
-class CYCLES_SCENE_PT_simplify_viewport(CyclesButtonsPanel, Panel):
+class CYCLES_RENDER_PT_simplify_viewport(CyclesButtonsPanel, Panel):
bl_label = "Viewport"
- bl_context = "scene"
- bl_parent_id = "CYCLES_SCENE_PT_simplify"
+ bl_context = "render"
+ bl_parent_id = "CYCLES_RENDER_PT_simplify"
COMPAT_ENGINES = {'CYCLES'}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
rd = scene.render
@@ -1740,15 +1928,16 @@ class CYCLES_SCENE_PT_simplify_viewport(CyclesButtonsPanel, Panel):
col.prop(cscene, "ao_bounces", text="AO Bounces")
-class CYCLES_SCENE_PT_simplify_render(CyclesButtonsPanel, Panel):
+class CYCLES_RENDER_PT_simplify_render(CyclesButtonsPanel, Panel):
bl_label = "Render"
- bl_context = "scene"
- bl_parent_id = "CYCLES_SCENE_PT_simplify"
+ bl_context = "render"
+ bl_parent_id = "CYCLES_RENDER_PT_simplify"
COMPAT_ENGINES = {'CYCLES'}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
rd = scene.render
@@ -1764,16 +1953,17 @@ class CYCLES_SCENE_PT_simplify_render(CyclesButtonsPanel, Panel):
col.prop(cscene, "ao_bounces_render", text="AO Bounces")
-class CYCLES_SCENE_PT_simplify_culling(CyclesButtonsPanel, Panel):
+class CYCLES_RENDER_PT_simplify_culling(CyclesButtonsPanel, Panel):
bl_label = "Culling"
- bl_context = "scene"
- bl_parent_id = "CYCLES_SCENE_PT_simplify"
+ bl_context = "render"
+ bl_parent_id = "CYCLES_RENDER_PT_simplify"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'CYCLES'}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
scene = context.scene
rd = scene.render
@@ -1798,6 +1988,7 @@ def draw_device(self, context):
scene = context.scene
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
if context.engine == 'CYCLES':
from . import engine
@@ -1806,6 +1997,16 @@ def draw_device(self, context):
col = layout.column()
col.prop(cscene, "feature_set")
+ scene = context.scene
+
+ col = layout.column()
+ col.active = show_device_active(context)
+ col.prop(cscene, "device")
+
+ from . import engine
+ if engine.with_osl() and use_cpu(context):
+ col.prop(cscene, "shading_system")
+
def draw_pause(self, context):
layout = self.layout
@@ -1832,7 +2033,7 @@ def get_panels():
'VIEWLAYER_PT_filter',
'VIEWLAYER_PT_layer_passes',
'RENDER_PT_post_processing',
- 'SCENE_PT_simplify',
+ 'RENDER_PT_simplify',
}
panels = []
@@ -1845,24 +2046,27 @@ def get_panels():
classes = (
- CYCLES_MT_sampling_presets,
- CYCLES_MT_integrator_presets,
+ CYCLES_PT_sampling_presets,
+ CYCLES_PT_integrator_presets,
CYCLES_RENDER_PT_sampling,
- CYCLES_RENDER_PT_sampling_aa_samples,
- CYCLES_RENDER_PT_sampling_samples,
- CYCLES_RENDER_PT_sampling_light,
- CYCLES_RENDER_PT_geometry,
- CYCLES_RENDER_PT_geometry_subdivision,
- CYCLES_RENDER_PT_geometry_volume,
- CYCLES_RENDER_PT_geometry_hair,
+ CYCLES_RENDER_PT_sampling_sub_samples,
+ CYCLES_RENDER_PT_sampling_advanced,
CYCLES_RENDER_PT_light_paths,
CYCLES_RENDER_PT_light_paths_max_bounces,
+ CYCLES_RENDER_PT_light_paths_clamping,
CYCLES_RENDER_PT_light_paths_caustics,
+ CYCLES_RENDER_PT_volumes,
+ CYCLES_RENDER_PT_subdivision,
+ CYCLES_RENDER_PT_hair,
+ CYCLES_RENDER_PT_simplify,
+ CYCLES_RENDER_PT_simplify_viewport,
+ CYCLES_RENDER_PT_simplify_render,
+ CYCLES_RENDER_PT_simplify_culling,
CYCLES_RENDER_PT_motion_blur,
CYCLES_RENDER_PT_motion_blur_curve,
CYCLES_RENDER_PT_film,
- CYCLES_RENDER_PT_film_transparency,
CYCLES_RENDER_PT_film_pixel_filter,
+ CYCLES_RENDER_PT_film_transparency,
CYCLES_RENDER_PT_performance,
CYCLES_RENDER_PT_performance_threads,
CYCLES_RENDER_PT_performance_tiles,
@@ -1870,7 +2074,11 @@ classes = (
CYCLES_RENDER_PT_performance_final_render,
CYCLES_RENDER_PT_performance_viewport,
CYCLES_RENDER_PT_filter,
- CYCLES_RENDER_PT_layer_passes,
+ CYCLES_RENDER_PT_passes,
+ CYCLES_RENDER_PT_passes_data,
+ CYCLES_RENDER_PT_passes_light,
+ CYCLES_RENDER_PT_passes_crypto,
+ CYCLES_RENDER_PT_passes_debug,
CYCLES_RENDER_PT_denoising,
CYCLES_PT_post_processing,
CYCLES_CAMERA_PT_dof,
@@ -1879,6 +2087,8 @@ classes = (
CYCLES_PT_context_material,
CYCLES_OBJECT_PT_motion_blur,
CYCLES_OBJECT_PT_cycles_settings,
+ CYCLES_OBJECT_PT_cycles_settings_ray_visibility,
+ CYCLES_OBJECT_PT_cycles_settings_performance,
CYCLES_OT_use_shading_nodes,
CYCLES_LIGHT_PT_preview,
CYCLES_LIGHT_PT_light,
@@ -1902,10 +2112,6 @@ classes = (
CYCLES_MATERIAL_PT_settings_volume,
CYCLES_RENDER_PT_bake,
CYCLES_RENDER_PT_debug,
- CYCLES_SCENE_PT_simplify,
- CYCLES_SCENE_PT_simplify_viewport,
- CYCLES_SCENE_PT_simplify_render,
- CYCLES_SCENE_PT_simplify_culling,
)
diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp
index a1fd153b4fd..5e4522af6e1 100644
--- a/intern/cycles/blender/blender_curves.cpp
+++ b/intern/cycles/blender/blender_curves.cpp
@@ -134,9 +134,9 @@ static bool ObtainCacheParticleData(Mesh *mesh,
if((b_part.render_type() == BL::ParticleSettings::render_type_PATH) && (b_part.type() == BL::ParticleSettings::type_HAIR)) {
int shader = clamp(b_part.material()-1, 0, mesh->used_shaders.size()-1);
- int draw_step = background ? b_part.render_step() : b_part.draw_step();
+ int display_step = background ? b_part.render_step() : b_part.display_step();
int totparts = b_psys.particles.length();
- int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f);
+ int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.display_percentage() / 100.0f);
int totcurves = totchild;
if(b_part.child_type() == 0 || totchild == 0)
@@ -145,7 +145,7 @@ static bool ObtainCacheParticleData(Mesh *mesh,
if(totcurves == 0)
continue;
- int ren_step = (1 << draw_step) + 1;
+ int ren_step = (1 << display_step) + 1;
if(b_part.kink() == BL::ParticleSettings::kink_SPIRAL)
ren_step += b_part.kink_extra_steps();
@@ -227,7 +227,7 @@ static bool ObtainCacheParticleUV(Mesh *mesh,
if((b_part.render_type() == BL::ParticleSettings::render_type_PATH) && (b_part.type() == BL::ParticleSettings::type_HAIR)) {
int totparts = b_psys.particles.length();
- int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f);
+ int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.display_percentage() / 100.0f);
int totcurves = totchild;
if(b_part.child_type() == 0 || totchild == 0)
@@ -247,11 +247,11 @@ static bool ObtainCacheParticleUV(Mesh *mesh,
b_psys.particles.begin(b_pa);
for(; pa_no < totparts+totchild; pa_no++) {
/* Add UVs */
- BL::Mesh::tessface_uv_textures_iterator l;
- b_mesh->tessface_uv_textures.begin(l);
+ BL::Mesh::uv_layers_iterator l;
+ b_mesh->uv_layers.begin(l);
float3 uv = make_float3(0.0f, 0.0f, 0.0f);
- if(b_mesh->tessface_uv_textures.length())
+ if(b_mesh->uv_layers.length())
b_psys.uv_on_emitter(psmd, *b_pa, pa_no, uv_num, &uv.x);
CData->curve_uv.push_back_slow(uv);
@@ -286,7 +286,7 @@ static bool ObtainCacheParticleVcol(Mesh *mesh,
if((b_part.render_type() == BL::ParticleSettings::render_type_PATH) && (b_part.type() == BL::ParticleSettings::type_HAIR)) {
int totparts = b_psys.particles.length();
- int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f);
+ int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.display_percentage() / 100.0f);
int totcurves = totchild;
if(b_part.child_type() == 0 || totchild == 0)
@@ -306,11 +306,11 @@ static bool ObtainCacheParticleVcol(Mesh *mesh,
b_psys.particles.begin(b_pa);
for(; pa_no < totparts+totchild; pa_no++) {
/* Add vertex colors */
- BL::Mesh::tessface_vertex_colors_iterator l;
- b_mesh->tessface_vertex_colors.begin(l);
+ BL::Mesh::vertex_colors_iterator l;
+ b_mesh->vertex_colors.begin(l);
float3 vcol = make_float3(0.0f, 0.0f, 0.0f);
- if(b_mesh->tessface_vertex_colors.length())
+ if(b_mesh->vertex_colors.length())
b_psys.mcol_on_emitter(psmd, *b_pa, pa_no, vcol_num, &vcol.x);
CData->curve_vcol.push_back_slow(vcol);
@@ -968,10 +968,10 @@ void BlenderSync::sync_curves(Mesh *mesh,
/* create vertex color attributes */
if(!motion) {
- BL::Mesh::tessface_vertex_colors_iterator l;
+ BL::Mesh::vertex_colors_iterator l;
int vcol_num = 0;
- for(b_mesh.tessface_vertex_colors.begin(l); l != b_mesh.tessface_vertex_colors.end(); ++l, vcol_num++) {
+ for(b_mesh.vertex_colors.begin(l); l != b_mesh.vertex_colors.end(); ++l, vcol_num++) {
if(!mesh->need_attribute(scene, ustring(l->name().c_str())))
continue;
@@ -1005,10 +1005,10 @@ void BlenderSync::sync_curves(Mesh *mesh,
/* create UV attributes */
if(!motion) {
- BL::Mesh::tessface_uv_textures_iterator l;
+ BL::Mesh::uv_layers_iterator l;
int uv_num = 0;
- for(b_mesh.tessface_uv_textures.begin(l); l != b_mesh.tessface_uv_textures.end(); ++l, uv_num++) {
+ for(b_mesh.uv_layers.begin(l); l != b_mesh.uv_layers.end(); ++l, uv_num++) {
bool active_render = l->active_render();
AttributeStandard std = (active_render)? ATTR_STD_UV: ATTR_STD_NONE;
ustring name = ustring(l->name().c_str());
diff --git a/intern/cycles/blender/blender_logging.cpp b/intern/cycles/blender/blender_logging.cpp
index d0f82e37662..3fca4efd097 100644
--- a/intern/cycles/blender/blender_logging.cpp
+++ b/intern/cycles/blender/blender_logging.cpp
@@ -22,7 +22,7 @@ void CCL_init_logging(const char *argv0)
ccl::util_logging_init(argv0);
}
-void CCL_start_debug_logging(void)
+void CCL_start_debug_logging()
{
ccl::util_logging_start();
}
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index c7378e71183..b97c250adf6 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -35,46 +35,6 @@
CCL_NAMESPACE_BEGIN
-/* Per-face bit flags. */
-enum {
- /* Face has no special flags. */
- FACE_FLAG_NONE = (0 << 0),
- /* Quad face was split using 1-3 diagonal. */
- FACE_FLAG_DIVIDE_13 = (1 << 0),
- /* Quad face was split using 2-4 diagonal. */
- FACE_FLAG_DIVIDE_24 = (1 << 1),
-};
-
-/* Get vertex indices to create triangles from a given face.
- *
- * Two triangles has vertex indices in the original Blender-side face.
- * If face is already a quad tri_b will not be initialized.
- */
-inline void face_split_tri_indices(const int face_flag,
- int tri_a[3],
- int tri_b[3])
-{
- if(face_flag & FACE_FLAG_DIVIDE_24) {
- tri_a[0] = 0;
- tri_a[1] = 1;
- tri_a[2] = 3;
-
- tri_b[0] = 2;
- tri_b[1] = 3;
- tri_b[2] = 1;
- }
- else {
- /* Quad with FACE_FLAG_DIVIDE_13 or single triangle. */
- tri_a[0] = 0;
- tri_a[1] = 1;
- tri_a[2] = 2;
-
- tri_b[0] = 0;
- tri_b[1] = 2;
- tri_b[2] = 3;
- }
-}
-
/* Tangent Space */
struct MikkUserData {
@@ -379,8 +339,6 @@ static void create_mesh_volume_attributes(Scene *scene,
static void attr_create_vertex_color(Scene *scene,
Mesh *mesh,
BL::Mesh& b_mesh,
- const vector<int>& nverts,
- const vector<int>& face_flags,
bool subdivision)
{
if(subdivision) {
@@ -401,15 +359,15 @@ static void attr_create_vertex_color(Scene *scene,
int n = p->loop_total();
for(int i = 0; i < n; i++) {
float3 color = get_float3(l->data[p->loop_start() + i].color());
- /* Encode vertex color using the sRGB curve. */
+ /* Compress/encode vertex color using the sRGB curve. */
*(cdata++) = color_float_to_byte(color_srgb_to_linear_v3(color));
}
}
}
}
else {
- BL::Mesh::tessface_vertex_colors_iterator l;
- for(b_mesh.tessface_vertex_colors.begin(l); l != b_mesh.tessface_vertex_colors.end(); ++l) {
+ BL::Mesh::vertex_colors_iterator l;
+ for(b_mesh.vertex_colors.begin(l); l != b_mesh.vertex_colors.end(); ++l) {
if(!mesh->need_attribute(scene, ustring(l->name().c_str())))
continue;
@@ -417,35 +375,20 @@ static void attr_create_vertex_color(Scene *scene,
TypeDesc::TypeColor,
ATTR_ELEMENT_CORNER_BYTE);
- BL::MeshColorLayer::data_iterator c;
+ BL::Mesh::loop_triangles_iterator t;
uchar4 *cdata = attr->data_uchar4();
- size_t i = 0;
-
- for(l->data.begin(c); c != l->data.end(); ++c, ++i) {
- int tri_a[3], tri_b[3];
- face_split_tri_indices(face_flags[i], tri_a, tri_b);
-
- /* Encode vertex color using the sRGB curve. */
- uchar4 colors[4];
- colors[0] = color_float_to_byte(color_srgb_to_linear_v3(get_float3(c->color1())));
- colors[1] = color_float_to_byte(color_srgb_to_linear_v3(get_float3(c->color2())));
- colors[2] = color_float_to_byte(color_srgb_to_linear_v3(get_float3(c->color3())));
- if(nverts[i] == 4) {
- colors[3] = color_float_to_byte(color_srgb_to_linear_v3(get_float3(c->color4())));
- }
- cdata[0] = colors[tri_a[0]];
- cdata[1] = colors[tri_a[1]];
- cdata[2] = colors[tri_a[2]];
-
- if(nverts[i] == 4) {
- cdata[3] = colors[tri_b[0]];
- cdata[4] = colors[tri_b[1]];
- cdata[5] = colors[tri_b[2]];
- cdata += 6;
- }
- else
- cdata += 3;
+ for(b_mesh.loop_triangles.begin(t); t != b_mesh.loop_triangles.end(); ++t) {
+ int3 li = get_int3(t->loops());
+ float3 c1 = get_float3(l->data[li[0]].color());
+ float3 c2 = get_float3(l->data[li[1]].color());
+ float3 c3 = get_float3(l->data[li[2]].color());
+
+ /* Compress/encode vertex color using the sRGB curve. */
+ cdata[0] = color_float_to_byte(color_srgb_to_linear_v3(c1));
+ cdata[1] = color_float_to_byte(color_srgb_to_linear_v3(c2));
+ cdata[2] = color_float_to_byte(color_srgb_to_linear_v3(c3));
+ cdata += 3;
}
}
}
@@ -454,14 +397,12 @@ static void attr_create_vertex_color(Scene *scene,
/* Create uv map attributes. */
static void attr_create_uv_map(Scene *scene,
Mesh *mesh,
- BL::Mesh& b_mesh,
- const vector<int>& nverts,
- const vector<int>& face_flags)
+ BL::Mesh& b_mesh)
{
- if(b_mesh.tessface_uv_textures.length() != 0) {
- BL::Mesh::tessface_uv_textures_iterator l;
+ if(b_mesh.uv_layers.length() != 0) {
+ BL::Mesh::uv_layers_iterator l;
- for(b_mesh.tessface_uv_textures.begin(l); l != b_mesh.tessface_uv_textures.end(); ++l) {
+ for(b_mesh.uv_layers.begin(l); l != b_mesh.uv_layers.end(); ++l) {
const bool active_render = l->active_render();
AttributeStandard uv_std = (active_render)? ATTR_STD_UV: ATTR_STD_NONE;
ustring uv_name = ustring(l->name().c_str());
@@ -493,33 +434,15 @@ static void attr_create_uv_map(Scene *scene,
ATTR_ELEMENT_CORNER);
}
- BL::MeshTextureFaceLayer::data_iterator t;
+ BL::Mesh::loop_triangles_iterator t;
float3 *fdata = uv_attr->data_float3();
- size_t i = 0;
-
- for(l->data.begin(t); t != l->data.end(); ++t, ++i) {
- int tri_a[3], tri_b[3];
- face_split_tri_indices(face_flags[i], tri_a, tri_b);
-
- float3 uvs[4];
- uvs[0] = get_float3(t->uv1());
- uvs[1] = get_float3(t->uv2());
- uvs[2] = get_float3(t->uv3());
- if(nverts[i] == 4) {
- uvs[3] = get_float3(t->uv4());
- }
- fdata[0] = uvs[tri_a[0]];
- fdata[1] = uvs[tri_a[1]];
- fdata[2] = uvs[tri_a[2]];
+ for(b_mesh.loop_triangles.begin(t); t != b_mesh.loop_triangles.end(); ++t) {
+ int3 li = get_int3(t->loops());
+ fdata[0] = get_float3(l->data[li[0]].uv());
+ fdata[1] = get_float3(l->data[li[1]].uv());
+ fdata[2] = get_float3(l->data[li[2]].uv());
fdata += 3;
-
- if(nverts[i] == 4) {
- fdata[0] = uvs[tri_b[0]];
- fdata[1] = uvs[tri_b[1]];
- fdata[2] = uvs[tri_b[2]];
- fdata += 3;
- }
}
}
@@ -822,7 +745,7 @@ static void create_mesh(Scene *scene,
{
/* count vertices and faces */
int numverts = b_mesh.vertices.length();
- int numfaces = (!subdivision) ? b_mesh.tessfaces.length() : b_mesh.polygons.length();
+ int numfaces = (!subdivision) ? b_mesh.loop_triangles.length() : b_mesh.polygons.length();
int numtris = 0;
int numcorners = 0;
int numngons = 0;
@@ -834,14 +757,10 @@ static void create_mesh(Scene *scene,
}
BL::Mesh::vertices_iterator v;
- BL::Mesh::tessfaces_iterator f;
BL::Mesh::polygons_iterator p;
if(!subdivision) {
- for(b_mesh.tessfaces.begin(f); f != b_mesh.tessfaces.end(); ++f) {
- int4 vi = get_int4(f->vertices_raw());
- numtris += (vi[3] == 0)? 1: 2;
- }
+ numtris = numfaces;
}
else {
for(b_mesh.polygons.begin(p); p != b_mesh.polygons.end(); ++p) {
@@ -869,7 +788,7 @@ static void create_mesh(Scene *scene,
/* create generated coordinates from undeformed coordinates */
const bool need_default_tangent =
(subdivision == false) &&
- (b_mesh.tessface_uv_textures.length() == 0) &&
+ (b_mesh.uv_layers.length() == 0) &&
(mesh->need_attribute(scene, ATTR_STD_UV_TANGENT));
if(mesh->need_attribute(scene, ATTR_STD_GENERATED) ||
need_default_tangent)
@@ -890,19 +809,21 @@ static void create_mesh(Scene *scene,
/* create faces */
vector<int> nverts(numfaces);
- vector<int> face_flags(numfaces, FACE_FLAG_NONE);
- int fi = 0;
if(!subdivision) {
- for(b_mesh.tessfaces.begin(f); f != b_mesh.tessfaces.end(); ++f, ++fi) {
- int4 vi = get_int4(f->vertices_raw());
- int n = (vi[3] == 0)? 3: 4;
- int shader = clamp(f->material_index(), 0, used_shaders.size()-1);
- bool smooth = f->use_smooth() || use_loop_normals;
+ BL::Mesh::loop_triangles_iterator t;
+ int ti = 0;
+
+ for(b_mesh.loop_triangles.begin(t); t != b_mesh.loop_triangles.end(); ++t, ++ti) {
+ BL::MeshPolygon p = b_mesh.polygons[t->polygon_index()];
+ int3 vi = get_int3(t->vertices());
+
+ int shader = clamp(p.material_index(), 0, used_shaders.size()-1);
+ bool smooth = p.use_smooth() || use_loop_normals;
if(use_loop_normals) {
- BL::Array<float, 12> loop_normals = f->split_normals();
- for(int i = 0; i < n; i++) {
+ BL::Array<float, 9> loop_normals = t->split_normals();
+ for(int i = 0; i < 3; i++) {
N[vi[i]] = make_float3(loop_normals[i * 3],
loop_normals[i * 3 + 1],
loop_normals[i * 3 + 2]);
@@ -913,25 +834,8 @@ static void create_mesh(Scene *scene,
*
* NOTE: Autosmooth is already taken care about.
*/
- if(n == 4) {
- if(is_zero(cross(mesh->verts[vi[1]] - mesh->verts[vi[0]], mesh->verts[vi[2]] - mesh->verts[vi[0]])) ||
- is_zero(cross(mesh->verts[vi[2]] - mesh->verts[vi[0]], mesh->verts[vi[3]] - mesh->verts[vi[0]])))
- {
- mesh->add_triangle(vi[0], vi[1], vi[3], shader, smooth);
- mesh->add_triangle(vi[2], vi[3], vi[1], shader, smooth);
- face_flags[fi] |= FACE_FLAG_DIVIDE_24;
- }
- else {
- mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth);
- mesh->add_triangle(vi[0], vi[2], vi[3], shader, smooth);
- face_flags[fi] |= FACE_FLAG_DIVIDE_13;
- }
- }
- else {
- mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth);
- }
-
- nverts[fi] = n;
+ mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth);
+ nverts[ti] = 3;
}
}
else {
@@ -957,13 +861,13 @@ static void create_mesh(Scene *scene,
* The calculate functions will check whether they're needed or not.
*/
attr_create_pointiness(scene, mesh, b_mesh, subdivision);
- attr_create_vertex_color(scene, mesh, b_mesh, nverts, face_flags, subdivision);
+ attr_create_vertex_color(scene, mesh, b_mesh, subdivision);
if(subdivision) {
attr_create_subd_uv_map(scene, mesh, b_mesh, subdivide_uvs);
}
else {
- attr_create_uv_map(scene, mesh, b_mesh, nverts, face_flags);
+ attr_create_uv_map(scene, mesh, b_mesh);
}
/* for volume objects, create a matrix to transform from object space to
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index a1f39d0848f..dcadc735b8e 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -424,6 +424,23 @@ Object *BlenderSync::sync_object(BL::Depsgraph& b_depsgraph,
object_updated = true;
}
+ /* sync the asset name for Cryptomatte */
+ BL::Object parent = b_ob.parent();
+ ustring parent_name;
+ if(parent) {
+ while(parent.parent()) {
+ parent = parent.parent();
+ }
+ parent_name = parent.name();
+ }
+ else {
+ parent_name = b_ob.name();
+ }
+ if(object->asset_name != parent_name) {
+ object->asset_name = parent_name;
+ object_updated = true;
+ }
+
/* object sync
* transform comparison should not be needed, but duplis don't work perfect
* in the depsgraph and may not signal changes, so this is a workaround */
@@ -444,8 +461,8 @@ Object *BlenderSync::sync_object(BL::Depsgraph& b_depsgraph,
if(scene->need_motion() == Scene::MOTION_BLUR) {
motion_steps = object_motion_steps(b_parent, b_ob);
+ mesh->motion_steps = motion_steps;
if(motion_steps && object_use_deform_motion(b_parent, b_ob)) {
- mesh->motion_steps = motion_steps;
mesh->use_motion_blur = true;
}
}
diff --git a/intern/cycles/blender/blender_object_cull.h b/intern/cycles/blender/blender_object_cull.h
index 2147877a860..6e2a22438ec 100644
--- a/intern/cycles/blender/blender_object_cull.h
+++ b/intern/cycles/blender/blender_object_cull.h
@@ -46,4 +46,4 @@ private:
CCL_NAMESPACE_END
-#endif /* __BLENDER_OBJECT_CULL_H__ */
+#endif /* __BLENDER_OBJECT_CULL_H__ */
diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp
index a79c28e43aa..ba9d6181e1c 100644
--- a/intern/cycles/blender/blender_python.cpp
+++ b/intern/cycles/blender/blender_python.cpp
@@ -843,10 +843,18 @@ void *CCL_python_module_init()
#ifdef WITH_NETWORK
PyModule_AddObject(mod, "with_network", Py_True);
Py_INCREF(Py_True);
-#else /* WITH_NETWORK */
+#else /* WITH_NETWORK */
PyModule_AddObject(mod, "with_network", Py_False);
Py_INCREF(Py_False);
-#endif /* WITH_NETWORK */
+#endif /* WITH_NETWORK */
+
+#ifdef WITH_EMBREE
+ PyModule_AddObject(mod, "with_embree", Py_True);
+ Py_INCREF(Py_True);
+#else /* WITH_EMBREE */
+ PyModule_AddObject(mod, "with_embree", Py_False);
+ Py_INCREF(Py_False);
+#endif /* WITH_EMBREE */
return (void*)mod;
}
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 4ac0e1f21c1..17da8b43d29 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -35,6 +35,7 @@
#include "util/util_function.h"
#include "util/util_hash.h"
#include "util/util_logging.h"
+#include "util/util_murmurhash.h"
#include "util/util_progress.h"
#include "util/util_time.h"
@@ -139,6 +140,7 @@ void BlenderSession::create_session()
/* create scene */
scene = new Scene(scene_params, session->device);
+ scene->name = b_scene.name();
/* setup callbacks for builtin image support */
scene->image_manager->builtin_image_info_cb = function_bind(&BlenderSession::builtin_image_info, this, _1, _2, _3);
@@ -382,6 +384,17 @@ void BlenderSession::update_render_tile(RenderTile& rtile, bool highlight)
do_write_update_render_tile(rtile, false, false);
}
+static void add_cryptomatte_layer(BL::RenderResult& b_rr, string name, string manifest)
+{
+ string identifier = string_printf("%08x", util_murmur_hash3(name.c_str(), name.length(), 0));
+ string prefix = "cryptomatte/" + identifier.substr(0, 7) + "/";
+
+ render_add_metadata(b_rr, prefix+"name", name);
+ render_add_metadata(b_rr, prefix+"hash", "MurmurHash3_32");
+ render_add_metadata(b_rr, prefix+"conversion", "uint32_to_float32");
+ render_add_metadata(b_rr, prefix+"manifest", manifest);
+}
+
void BlenderSession::render(BL::Depsgraph& b_depsgraph_)
{
b_depsgraph = b_depsgraph_;
@@ -405,19 +418,22 @@ void BlenderSession::render(BL::Depsgraph& b_depsgraph_)
BL::RenderResult::layers_iterator b_single_rlay;
b_rr.layers.begin(b_single_rlay);
BL::RenderLayer b_rlay = *b_single_rlay;
+ b_rlay_name = b_view_layer.name();
/* add passes */
- array<Pass> passes = sync->sync_render_passes(b_rlay, b_view_layer, session_params);
+ vector<Pass> passes = sync->sync_render_passes(b_rlay, b_view_layer, session_params);
buffer_params.passes = passes;
PointerRNA crl = RNA_pointer_get(&b_view_layer.ptr, "cycles");
bool use_denoising = get_boolean(crl, "use_denoising");
+ bool denoising_passes = use_denoising || get_boolean(crl, "denoising_store_passes");
session->tile_manager.schedule_denoising = use_denoising;
- buffer_params.denoising_data_pass = use_denoising;
+ buffer_params.denoising_data_pass = denoising_passes;
buffer_params.denoising_clean_pass = (scene->film->denoising_flags & DENOISING_CLEAN_ALL_PASSES);
session->params.use_denoising = use_denoising;
+ session->params.denoising_passes = denoising_passes;
session->params.denoising_radius = get_int(crl, "denoising_radius");
session->params.denoising_strength = get_float(crl, "denoising_strength");
session->params.denoising_feature_strength = get_float(crl, "denoising_feature_strength");
@@ -438,7 +454,6 @@ void BlenderSession::render(BL::Depsgraph& b_depsgraph_)
BL::RenderResult::views_iterator b_view_iter;
int view_index = 0;
for(b_rr.views.begin(b_view_iter); b_view_iter != b_rr.views.end(); ++b_view_iter, ++view_index) {
- b_rlay_name = b_view_layer.name();
b_rview_name = b_view_iter->name();
/* set the current view */
@@ -455,6 +470,11 @@ void BlenderSession::render(BL::Depsgraph& b_depsgraph_)
&python_thread_state);
builtin_images_load();
+ /* Attempt to free all data which is held by Blender side, since at this
+ * point we knwo that we've got everything to render current view layer.
+ */
+ free_blender_memory_if_possible();
+
/* Make sure all views have different noise patterns. - hardcoded value just to make it random */
if(view_index != 0) {
scene->integrator->seed += hash_int_2d(scene->integrator->seed, hash_int(view_index * 0xdeadbeef));
@@ -498,6 +518,20 @@ void BlenderSession::render(BL::Depsgraph& b_depsgraph_)
*/
}
+ /* Write cryptomatte metadata. */
+ if(scene->film->cryptomatte_passes & CRYPT_OBJECT) {
+ add_cryptomatte_layer(b_rr, b_rlay_name+".CryptoObject",
+ scene->object_manager->get_cryptomatte_objects(scene));
+ }
+ if(scene->film->cryptomatte_passes & CRYPT_MATERIAL) {
+ add_cryptomatte_layer(b_rr, b_rlay_name+".CryptoMaterial",
+ scene->shader_manager->get_cryptomatte_materials(scene));
+ }
+ if(scene->film->cryptomatte_passes & CRYPT_ASSET) {
+ add_cryptomatte_layer(b_rr, b_rlay_name+".CryptoAsset",
+ scene->object_manager->get_cryptomatte_assets(scene));
+ }
+
/* free result without merging */
end_render_result(b_engine, b_rr, true, true, false);
@@ -711,7 +745,7 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
bool read = false;
if(pass_type != PASS_NONE) {
/* copy pixels */
- read = buffers->get_pass_rect(pass_type, exposure, sample, components, &pixels[0]);
+ read = buffers->get_pass_rect(pass_type, exposure, sample, components, &pixels[0], b_pass.name());
}
else {
int denoising_offset = BlenderSync::get_denoising_pass(b_pass);
@@ -730,7 +764,7 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
else {
/* copy combined pass */
BL::RenderPass b_combined_pass(b_rlay.passes.find_by_name("Combined", b_rview_name.c_str()));
- if(buffers->get_pass_rect(PASS_COMBINED, exposure, sample, 4, &pixels[0]))
+ if(buffers->get_pass_rect(PASS_COMBINED, exposure, sample, 4, &pixels[0], "Combined"))
b_combined_pass.rect(&pixels[0]);
}
@@ -922,7 +956,7 @@ void BlenderSession::update_bake_progress()
void BlenderSession::update_status_progress()
{
string timestatus, status, substatus;
- string scene = "";
+ string scene_status = "";
float progress;
double total_time, remaining_time = 0, render_time;
char time_str[128];
@@ -936,35 +970,31 @@ void BlenderSession::update_status_progress()
remaining_time = (1.0 - (double)progress) * (render_time / (double)progress);
if(background) {
- scene += " | " + b_scene.name();
+ scene_status += " | " + scene->name;
if(b_rlay_name != "")
- scene += ", " + b_rlay_name;
+ scene_status += ", " + b_rlay_name;
if(b_rview_name != "")
- scene += ", " + b_rview_name;
- }
- else {
- BLI_timecode_string_from_time_simple(time_str, sizeof(time_str), total_time);
- timestatus = "Time:" + string(time_str) + " | ";
- }
+ scene_status += ", " + b_rview_name;
- if(remaining_time > 0) {
- BLI_timecode_string_from_time_simple(time_str, sizeof(time_str), remaining_time);
- timestatus += "Remaining:" + string(time_str) + " | ";
- }
+ if(remaining_time > 0) {
+ BLI_timecode_string_from_time_simple(time_str, sizeof(time_str), remaining_time);
+ timestatus += "Remaining:" + string(time_str) + " | ";
+ }
- timestatus += string_printf("Mem:%.2fM, Peak:%.2fM", (double)mem_used, (double)mem_peak);
+ timestatus += string_printf("Mem:%.2fM, Peak:%.2fM", (double)mem_used, (double)mem_peak);
- if(status.size() > 0)
- status = " | " + status;
- if(substatus.size() > 0)
- status += " | " + substatus;
+ if(status.size() > 0)
+ status = " | " + status;
+ if(substatus.size() > 0)
+ status += " | " + substatus;
+ }
double current_time = time_dt();
/* When rendering in a window, redraw the status at least once per second to keep the elapsed and remaining time up-to-date.
* For headless rendering, only report when something significant changes to keep the console output readable. */
if(status != last_status || (!headless && (current_time - last_status_time) > 1.0)) {
- b_engine.update_stats("", (timestatus + scene + status).c_str());
+ b_engine.update_stats("", (timestatus + scene_status + status).c_str());
b_engine.update_memory_stats(mem_used, mem_peak);
last_status = status;
last_status_time = current_time;
@@ -1381,4 +1411,16 @@ void BlenderSession::update_resumable_tile_manager(int num_samples)
session->tile_manager.range_num_samples = range_num_samples;
}
+void BlenderSession::free_blender_memory_if_possible()
+{
+ if (!background) {
+ /* During interactive render we can not free anything: attempts to save
+ * memory would cause things to be allocated and evaluated for every
+ * updated sample.
+ */
+ return;
+ }
+ b_engine.free_blender_memory();
+}
+
CCL_NAMESPACE_END
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index 2be57f293b4..fdeba7b2f81 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -106,6 +106,9 @@ public:
BL::BlendData b_data;
BL::RenderSettings b_render;
BL::Depsgraph b_depsgraph;
+ /* NOTE: Blender's scene might become invalid after call
+ * free_blender_memory_if_possible().
+ */
BL::Scene b_scene;
BL::SpaceView3D b_v3d;
BL::RegionView3D b_rv3d;
@@ -172,8 +175,14 @@ protected:
/* Update tile manager to reflect resumable render settings. */
void update_resumable_tile_manager(int num_samples);
+
+ /* Is used after each render layer synchronization is done with the goal
+ * of freeing render engine data which is held from Blender side (for
+ * example, dependency graph).
+ */
+ void free_blender_memory_if_possible();
};
CCL_NAMESPACE_END
-#endif /* __BLENDER_SESSION_H__ */
+#endif /* __BLENDER_SESSION_H__ */
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index 439f6bdd32e..b89e3004403 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -628,8 +628,8 @@ static ShaderNode *add_node(Scene *scene,
}
}
#else
- (void)b_data;
- (void)b_ntree;
+ (void) b_data;
+ (void) b_ntree;
#endif
}
else if(b_node.is_a(&RNA_ShaderNodeTexImage)) {
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 4989746ae6a..33c45de8d70 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -40,6 +40,8 @@
CCL_NAMESPACE_BEGIN
+static const char *cryptomatte_prefix = "Crypto";
+
/* Constructor */
BlenderSync::BlenderSync(BL::RenderEngine& b_engine,
@@ -449,6 +451,9 @@ PassType BlenderSync::get_pass_type(BL::RenderPass& b_pass)
MAP_PASS("Debug Ray Bounces", PASS_RAY_BOUNCES);
#endif
MAP_PASS("Debug Render Time", PASS_RENDER_TIME);
+ if(string_startswith(name, cryptomatte_prefix)) {
+ return PASS_CRYPTOMATTE;
+ }
#undef MAP_PASS
return PASS_NONE;
@@ -457,6 +462,9 @@ PassType BlenderSync::get_pass_type(BL::RenderPass& b_pass)
int BlenderSync::get_denoising_pass(BL::RenderPass& b_pass)
{
string name = b_pass.name();
+
+ if(name == "Noisy Image") return DENOISING_PASS_COLOR;
+
if(name.substr(0, 10) != "Denoising ") {
return -1;
}
@@ -471,7 +479,6 @@ int BlenderSync::get_denoising_pass(BL::RenderPass& b_pass)
MAP_PASS("Depth Variance", DENOISING_PASS_DEPTH_VAR);
MAP_PASS("Shadow A", DENOISING_PASS_SHADOW_A);
MAP_PASS("Shadow B", DENOISING_PASS_SHADOW_B);
- MAP_PASS("Image", DENOISING_PASS_COLOR);
MAP_PASS("Image Variance", DENOISING_PASS_COLOR_VAR);
MAP_PASS("Clean", DENOISING_PASS_CLEAN);
#undef MAP_PASS
@@ -479,11 +486,11 @@ int BlenderSync::get_denoising_pass(BL::RenderPass& b_pass)
return -1;
}
-array<Pass> BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay,
- BL::ViewLayer& b_view_layer,
- const SessionParams &session_params)
+vector<Pass> BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay,
+ BL::ViewLayer& b_view_layer,
+ const SessionParams &session_params)
{
- array<Pass> passes;
+ vector<Pass> passes;
Pass::add(PASS_COMBINED, passes);
if(!session_params.device.advanced_shading) {
@@ -503,22 +510,11 @@ array<Pass> BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay,
Pass::add(pass_type, passes);
}
- scene->film->denoising_flags = 0;
PointerRNA crp = RNA_pointer_get(&b_view_layer.ptr, "cycles");
- if(get_boolean(crp, "denoising_store_passes") &&
- get_boolean(crp, "use_denoising"))
- {
- b_engine.add_pass("Denoising Normal", 3, "XYZ", b_view_layer.name().c_str());
- b_engine.add_pass("Denoising Normal Variance", 3, "XYZ", b_view_layer.name().c_str());
- b_engine.add_pass("Denoising Albedo", 3, "RGB", b_view_layer.name().c_str());
- b_engine.add_pass("Denoising Albedo Variance", 3, "RGB", b_view_layer.name().c_str());
- b_engine.add_pass("Denoising Depth", 1, "Z", b_view_layer.name().c_str());
- b_engine.add_pass("Denoising Depth Variance", 1, "Z", b_view_layer.name().c_str());
- b_engine.add_pass("Denoising Shadow A", 3, "XYV", b_view_layer.name().c_str());
- b_engine.add_pass("Denoising Shadow B", 3, "XYV", b_view_layer.name().c_str());
- b_engine.add_pass("Denoising Image", 3, "RGB", b_view_layer.name().c_str());
- b_engine.add_pass("Denoising Image Variance", 3, "RGB", b_view_layer.name().c_str());
-
+ bool use_denoising = get_boolean(crp, "use_denoising");
+ bool store_denoising_passes = get_boolean(crp, "denoising_store_passes");
+ scene->film->denoising_flags = 0;
+ if(use_denoising || store_denoising_passes) {
#define MAP_OPTION(name, flag) if(!get_boolean(crp, name)) scene->film->denoising_flags |= flag;
MAP_OPTION("denoising_diffuse_direct", DENOISING_CLEAN_DIFFUSE_DIR);
MAP_OPTION("denoising_diffuse_indirect", DENOISING_CLEAN_DIFFUSE_IND);
@@ -529,9 +525,22 @@ array<Pass> BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay,
MAP_OPTION("denoising_subsurface_direct", DENOISING_CLEAN_SUBSURFACE_DIR);
MAP_OPTION("denoising_subsurface_indirect", DENOISING_CLEAN_SUBSURFACE_IND);
#undef MAP_OPTION
+ b_engine.add_pass("Noisy Image", 4, "RGBA", b_view_layer.name().c_str());
+ }
+
+ if(store_denoising_passes) {
+ b_engine.add_pass("Denoising Normal", 3, "XYZ", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Normal Variance", 3, "XYZ", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Albedo", 3, "RGB", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Albedo Variance", 3, "RGB", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Depth", 1, "Z", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Depth Variance", 1, "Z", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Shadow A", 3, "XYV", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Shadow B", 3, "XYV", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Image Variance", 3, "RGB", b_view_layer.name().c_str());
if(scene->film->denoising_flags & DENOISING_CLEAN_ALL_PASSES) {
- b_engine.add_pass("Denoising Clean", 3, "RGB", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Clean", 3, "RGB", b_view_layer.name().c_str());
}
}
#ifdef __KERNEL_DEBUG__
@@ -565,6 +574,39 @@ array<Pass> BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay,
Pass::add(PASS_VOLUME_INDIRECT, passes);
}
+ /* Cryptomatte stores two ID/weight pairs per RGBA layer.
+ * User facing paramter is the number of pairs. */
+ int crypto_depth = min(16, get_int(crp, "pass_crypto_depth")) / 2;
+ scene->film->cryptomatte_depth = crypto_depth;
+ scene->film->cryptomatte_passes = CRYPT_NONE;
+ if(get_boolean(crp, "use_pass_crypto_object")) {
+ for(int i = 0; i < crypto_depth; ++i) {
+ string passname = cryptomatte_prefix + string_printf("Object%02d", i);
+ b_engine.add_pass(passname.c_str(), 4, "RGBA", b_view_layer.name().c_str());
+ Pass::add(PASS_CRYPTOMATTE, passes, passname.c_str());
+ }
+ scene->film->cryptomatte_passes = (CryptomatteType)(scene->film->cryptomatte_passes | CRYPT_OBJECT);
+ }
+ if(get_boolean(crp, "use_pass_crypto_material")) {
+ for(int i = 0; i < crypto_depth; ++i) {
+ string passname = cryptomatte_prefix + string_printf("Material%02d", i);
+ b_engine.add_pass(passname.c_str(), 4, "RGBA", b_view_layer.name().c_str());
+ Pass::add(PASS_CRYPTOMATTE, passes, passname.c_str());
+ }
+ scene->film->cryptomatte_passes = (CryptomatteType)(scene->film->cryptomatte_passes | CRYPT_MATERIAL);
+ }
+ if(get_boolean(crp, "use_pass_crypto_asset")) {
+ for(int i = 0; i < crypto_depth; ++i) {
+ string passname = cryptomatte_prefix + string_printf("Asset%02d", i);
+ b_engine.add_pass(passname.c_str(), 4, "RGBA", b_view_layer.name().c_str());
+ Pass::add(PASS_CRYPTOMATTE, passes, passname.c_str());
+ }
+ scene->film->cryptomatte_passes = (CryptomatteType)(scene->film->cryptomatte_passes | CRYPT_ASSET);
+ }
+ if(get_boolean(crp, "pass_crypto_accurate") && scene->film->cryptomatte_passes != CRYPT_NONE) {
+ scene->film->cryptomatte_passes = (CryptomatteType)(scene->film->cryptomatte_passes | CRYPT_ACCURATE);
+ }
+
return passes;
}
@@ -645,6 +687,9 @@ SceneParams BlenderSync::get_scene_params(BL::Scene& b_scene,
params.bvh_layout = DebugFlags().cpu.bvh_layout;
}
+#ifdef WITH_EMBREE
+ params.bvh_layout = RNA_boolean_get(&cscene, "use_bvh_embree") ? BVH_LAYOUT_EMBREE : params.bvh_layout;
+#endif
return params;
}
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index e63ef9e5e47..ddc5e00cf9d 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -67,9 +67,9 @@ public:
int width, int height,
void **python_thread_state);
void sync_view_layer(BL::SpaceView3D& b_v3d, BL::ViewLayer& b_view_layer);
- array<Pass> sync_render_passes(BL::RenderLayer& b_render_layer,
- BL::ViewLayer& b_view_layer,
- const SessionParams &session_params);
+ vector<Pass> sync_render_passes(BL::RenderLayer& b_render_layer,
+ BL::ViewLayer& b_view_layer,
+ const SessionParams &session_params);
void sync_integrator();
void sync_camera(BL::RenderSettings& b_render,
BL::Object& b_override,
@@ -208,4 +208,4 @@ private:
CCL_NAMESPACE_END
-#endif /* __BLENDER_SYNC_H__ */
+#endif /* __BLENDER_SYNC_H__ */
diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h
index 4e754d22984..53800cab90d 100644
--- a/intern/cycles/blender/blender_util.h
+++ b/intern/cycles/blender/blender_util.h
@@ -20,6 +20,7 @@
#include "render/mesh.h"
#include "util/util_algorithm.h"
+#include "util/util_array.h"
#include "util/util_map.h"
#include "util/util_path.h"
#include "util/util_set.h"
@@ -32,7 +33,7 @@
extern "C" {
size_t BLI_timecode_string_from_time_simple(char *str, size_t maxlen, double time_seconds);
-void BKE_image_user_frame_calc(void *iuser, int cfra, int fieldnr);
+void BKE_image_user_frame_calc(void *iuser, int cfra);
void BKE_image_user_file_path(void *iuser, void *ima, char *path);
unsigned char *BKE_image_get_pixels_for_frame(void *image, int frame);
float *BKE_image_get_float_pixels_for_frame(void *image, int frame);
@@ -64,7 +65,7 @@ static inline BL::Mesh object_to_mesh(BL::BlendData& data,
subsurf_mod.show_viewport(false);
}
- BL::Mesh me = data.meshes.new_from_object(depsgraph, object, apply_modifiers, false, calc_undeformed);
+ BL::Mesh me = data.meshes.new_from_object(depsgraph, object, apply_modifiers, calc_undeformed);
if(subdivision_type != Mesh::SUBDIVISION_NONE) {
BL::Modifier subsurf_mod = object.modifiers[object.modifiers.length()-1];
@@ -83,7 +84,7 @@ static inline BL::Mesh object_to_mesh(BL::BlendData& data,
}
}
if(subdivision_type == Mesh::SUBDIVISION_NONE) {
- me.calc_tessface(true);
+ me.calc_loop_triangles();
}
}
return me;
@@ -220,14 +221,14 @@ static inline string image_user_file_path(BL::ImageUser& iuser,
int cfra)
{
char filepath[1024];
- BKE_image_user_frame_calc(iuser.ptr.data, cfra, 0);
+ BKE_image_user_frame_calc(iuser.ptr.data, cfra);
BKE_image_user_file_path(iuser.ptr.data, ima.ptr.data, filepath);
return string(filepath);
}
static inline int image_user_frame_number(BL::ImageUser& iuser, int cfra)
{
- BKE_image_user_frame_calc(iuser.ptr.data, cfra, 0);
+ BKE_image_user_frame_calc(iuser.ptr.data, cfra);
return iuser.frame_current();
}
@@ -243,6 +244,12 @@ static inline float *image_get_float_pixels_for_frame(BL::Image& image,
return BKE_image_get_float_pixels_for_frame(image.ptr.data, frame);
}
+static inline void render_add_metadata(BL::RenderResult& b_rr, string name, string value)
+{
+ b_rr.stamp_data_add_field(name.c_str(), value.c_str());
+}
+
+
/* Utilities */
static inline Transform get_transform(const BL::Array<float, 16>& array)
@@ -832,4 +839,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __BLENDER_UTIL_H__ */
+#endif /* __BLENDER_UTIL_H__ */
diff --git a/intern/cycles/bvh/CMakeLists.txt b/intern/cycles/bvh/CMakeLists.txt
index fcd28572fdf..6014624f395 100644
--- a/intern/cycles/bvh/CMakeLists.txt
+++ b/intern/cycles/bvh/CMakeLists.txt
@@ -13,6 +13,7 @@ set(SRC
bvh8.cpp
bvh_binning.cpp
bvh_build.cpp
+ bvh_embree.cpp
bvh_node.cpp
bvh_sort.cpp
bvh_split.cpp
@@ -26,6 +27,7 @@ set(SRC_HEADERS
bvh8.h
bvh_binning.h
bvh_build.h
+ bvh_embree.h
bvh_node.h
bvh_params.h
bvh_sort.h
diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
index bc73a3ad264..ac0614e3659 100644
--- a/intern/cycles/bvh/bvh.cpp
+++ b/intern/cycles/bvh/bvh.cpp
@@ -26,6 +26,10 @@
#include "bvh/bvh_build.h"
#include "bvh/bvh_node.h"
+#ifdef WITH_EMBREE
+#include "bvh/bvh_embree.h"
+#endif
+
#include "util/util_foreach.h"
#include "util/util_logging.h"
#include "util/util_progress.h"
@@ -41,6 +45,7 @@ const char *bvh_layout_name(BVHLayout layout)
case BVH_LAYOUT_BVH4: return "BVH4";
case BVH_LAYOUT_BVH8: return "BVH8";
case BVH_LAYOUT_NONE: return "NONE";
+ case BVH_LAYOUT_EMBREE: return "EMBREE";
case BVH_LAYOUT_ALL: return "ALL";
}
LOG(DFATAL) << "Unsupported BVH layout was passed.";
@@ -96,6 +101,10 @@ BVH *BVH::create(const BVHParams& params, const vector<Object*>& objects)
return new BVH4(params, objects);
case BVH_LAYOUT_BVH8:
return new BVH8(params, objects);
+ case BVH_LAYOUT_EMBREE:
+#ifdef WITH_EMBREE
+ return new BVHEmbree(params, objects);
+#endif
case BVH_LAYOUT_NONE:
case BVH_LAYOUT_ALL:
break;
@@ -106,7 +115,7 @@ BVH *BVH::create(const BVHParams& params, const vector<Object*>& objects)
/* Building */
-void BVH::build(Progress& progress)
+void BVH::build(Progress& progress, Stats*)
{
progress.set_substatus("Building BVH");
diff --git a/intern/cycles/bvh/bvh.h b/intern/cycles/bvh/bvh.h
index 86be0bae4be..c8ad29004d7 100644
--- a/intern/cycles/bvh/bvh.h
+++ b/intern/cycles/bvh/bvh.h
@@ -19,12 +19,13 @@
#define __BVH_H__
#include "bvh/bvh_params.h"
-
+#include "util/util_array.h"
#include "util/util_types.h"
#include "util/util_vector.h"
CCL_NAMESPACE_BEGIN
+class Stats;
class BVHNode;
struct BVHStackEntry;
class BVHParams;
@@ -35,7 +36,6 @@ class Progress;
#define BVH_ALIGN 4096
#define TRI_NODE_SIZE 3
-
/* Packed BVH
*
* BVH stored as it will be used for traversal on the rendering device. */
@@ -91,7 +91,7 @@ public:
static BVH *create(const BVHParams& params, const vector<Object*>& objects);
virtual ~BVH() {}
- void build(Progress& progress);
+ virtual void build(Progress& progress, Stats *stats=NULL);
void refit(Progress& progress);
protected:
@@ -126,4 +126,4 @@ struct BVHStackEntry
CCL_NAMESPACE_END
-#endif /* __BVH_H__ */
+#endif /* __BVH_H__ */
diff --git a/intern/cycles/bvh/bvh2.h b/intern/cycles/bvh/bvh2.h
index df65ddca5b7..ecc697567bb 100644
--- a/intern/cycles/bvh/bvh2.h
+++ b/intern/cycles/bvh/bvh2.h
@@ -84,4 +84,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __BVH2_H__ */
+#endif /* __BVH2_H__ */
diff --git a/intern/cycles/bvh/bvh4.h b/intern/cycles/bvh/bvh4.h
index 310909a37e1..28bab2fe327 100644
--- a/intern/cycles/bvh/bvh4.h
+++ b/intern/cycles/bvh/bvh4.h
@@ -84,4 +84,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __BVH4_H__ */
+#endif /* __BVH4_H__ */
diff --git a/intern/cycles/bvh/bvh8.cpp b/intern/cycles/bvh/bvh8.cpp
index 70d003d938a..b95fe572e27 100644
--- a/intern/cycles/bvh/bvh8.cpp
+++ b/intern/cycles/bvh/bvh8.cpp
@@ -124,6 +124,7 @@ void BVH8::pack_aligned_node(int idx,
data[0].a = __uint_as_float(visibility & ~PATH_RAY_NODE_UNALIGNED);
data[0].b = time_from;
data[0].c = time_to;
+
for(int i = 0; i < num; i++) {
float3 bb_min = bounds[i].min;
float3 bb_max = bounds[i].max;
@@ -140,8 +141,8 @@ void BVH8::pack_aligned_node(int idx,
for(int i = num; i < 8; i++) {
/* We store BB which would never be recorded as intersection
- * so kernel might safely assume there are always 4 child nodes.
- */
+ * so kernel might safely assume there are always 4 child nodes.
+ */
data[1][i] = FLT_MAX;
data[2][i] = -FLT_MAX;
@@ -153,6 +154,7 @@ void BVH8::pack_aligned_node(int idx,
data[7][i] = __int_as_float(0);
}
+
memcpy(&pack.nodes[idx], data, sizeof(float4)*BVH_ONODE_SIZE);
}
@@ -189,6 +191,7 @@ void BVH8::pack_unaligned_node(int idx,
{
float8 data[BVH_UNALIGNED_ONODE_SIZE];
memset(data, 0, sizeof(data));
+
data[0].a = __uint_as_float(visibility | PATH_RAY_NODE_UNALIGNED);
data[0].b = time_from;
data[0].c = time_to;
@@ -222,21 +225,21 @@ void BVH8::pack_unaligned_node(int idx,
* so kernel might safely assume there are always 4 child nodes.
*/
- data[1][i] = 1.0f;
- data[2][i] = 0.0f;
- data[3][i] = 0.0f;
+ data[1][i] = NAN;
+ data[2][i] = NAN;
+ data[3][i] = NAN;
- data[4][i] = 0.0f;
- data[5][i] = 0.0f;
- data[6][i] = 0.0f;
+ data[4][i] = NAN;
+ data[5][i] = NAN;
+ data[6][i] = NAN;
- data[7][i] = 0.0f;
- data[8][i] = 0.0f;
- data[9][i] = 0.0f;
+ data[7][i] = NAN;
+ data[8][i] = NAN;
+ data[9][i] = NAN;
- data[10][i] = -FLT_MAX;
- data[11][i] = -FLT_MAX;
- data[12][i] = -FLT_MAX;
+ data[10][i] = NAN;
+ data[11][i] = NAN;
+ data[12][i] = NAN;
data[13][i] = __int_as_float(0);
}
diff --git a/intern/cycles/bvh/bvh8.h b/intern/cycles/bvh/bvh8.h
index 274a2442c7e..834daf3abce 100644
--- a/intern/cycles/bvh/bvh8.h
+++ b/intern/cycles/bvh/bvh8.h
@@ -95,4 +95,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __BVH8_H__ */
+#endif /* __BVH8_H__ */
diff --git a/intern/cycles/bvh/bvh_build.h b/intern/cycles/bvh/bvh_build.h
index 7b245139819..dd95a5cc0e8 100644
--- a/intern/cycles/bvh/bvh_build.h
+++ b/intern/cycles/bvh/bvh_build.h
@@ -23,6 +23,7 @@
#include "bvh/bvh_params.h"
#include "bvh/bvh_unaligned.h"
+#include "util/util_array.h"
#include "util/util_task.h"
#include "util/util_vector.h"
@@ -142,4 +143,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __BVH_BUILD_H__ */
+#endif /* __BVH_BUILD_H__ */
diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
new file mode 100644
index 00000000000..7489fe8ea42
--- /dev/null
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -0,0 +1,884 @@
+/*
+ * Copyright 2018, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* This class implemens a ray accelerator for Cycles using Intel's Embree library.
+ * It supports triangles, curves, object and deformation blur and instancing.
+ * Not supported are thick line segments, those have no native equivalent in Embree.
+ * They could be implemented using Embree's thick curves, at the expense of wasted memory.
+ * User defined intersections for Embree could also be an option, but since Embree only uses aligned BVHs
+ * for user geometry, this would come with reduced performance and/or higher memory usage.
+ *
+ * Since Embree allows object to be either curves or triangles but not both, Cycles object IDs are maapped
+ * to Embree IDs by multiplying by two and adding one for curves.
+ *
+ * This implementation shares RTCDevices between Cycles instances. Eventually each instance should get
+ * a separate RTCDevice to correctly keep track of memory usage.
+ *
+ * Vertex and index buffers are duplicated between Cycles device arrays and Embree. These could be merged,
+ * which would requrie changes to intersection refinement, shader setup, mesh light sampling and a few
+ * other places in Cycles where direct access to vertex data is required.
+ */
+
+#ifdef WITH_EMBREE
+
+#include <pmmintrin.h>
+#include <xmmintrin.h>
+#include <embree3/rtcore_geometry.h>
+
+#include "bvh/bvh_embree.h"
+
+/* Kernel includes are necessary so that the filter function for Embree can access the packed BVH. */
+#include "kernel/bvh/bvh_embree.h"
+#include "kernel/kernel_compat_cpu.h"
+#include "kernel/split/kernel_split_data_types.h"
+#include "kernel/kernel_globals.h"
+#include "kernel/kernel_random.h"
+
+#include "render/mesh.h"
+#include "render/object.h"
+#include "util/util_foreach.h"
+#include "util/util_logging.h"
+#include "util/util_progress.h"
+
+CCL_NAMESPACE_BEGIN
+
+#define IS_HAIR(x) (x & 1)
+
+/* This gets called by Embree at every valid ray/object intersection.
+ * Things like recording subsurface or shadow hits for later evaluation
+ * as well as filtering for volume objects happen here.
+ * Cycles' own BVH does that directly inside the traversal calls.
+ */
+static void rtc_filter_func(const RTCFilterFunctionNArguments *args)
+{
+ /* Current implementation in Cycles assumes only single-ray intersection queries. */
+ assert(args->N == 1);
+
+ const RTCRay *ray = (RTCRay*)args->ray;
+ const RTCHit *hit = (RTCHit*)args->hit;
+ CCLIntersectContext *ctx = ((IntersectContext*)args->context)->userRayExt;
+ KernelGlobals *kg = ctx->kg;
+
+ /* Check if there is backfacing hair to ignore. */
+ if(IS_HAIR(hit->geomID) && (kernel_data.curve.curveflags & CURVE_KN_INTERPOLATE)
+ && !(kernel_data.curve.curveflags & CURVE_KN_BACKFACING)
+ && !(kernel_data.curve.curveflags & CURVE_KN_RIBBONS)) {
+ if(dot(make_float3(ray->dir_x, ray->dir_y, ray->dir_z), make_float3(hit->Ng_x, hit->Ng_y, hit->Ng_z)) > 0.0f) {
+ *args->valid = 0;
+ return;
+ }
+ }
+}
+
+static void rtc_filter_occluded_func(const RTCFilterFunctionNArguments* args)
+{
+ assert(args->N == 1);
+
+ const RTCRay *ray = (RTCRay*)args->ray;
+ RTCHit *hit = (RTCHit*)args->hit;
+ CCLIntersectContext *ctx = ((IntersectContext*)args->context)->userRayExt;
+ KernelGlobals *kg = ctx->kg;
+
+ /* For all ray types: Check if there is backfacing hair to ignore */
+ if(IS_HAIR(hit->geomID) && (kernel_data.curve.curveflags & CURVE_KN_INTERPOLATE)
+ && !(kernel_data.curve.curveflags & CURVE_KN_BACKFACING)
+ && !(kernel_data.curve.curveflags & CURVE_KN_RIBBONS)) {
+ if(dot(make_float3(ray->dir_x, ray->dir_y, ray->dir_z), make_float3(hit->Ng_x, hit->Ng_y, hit->Ng_z)) > 0.0f) {
+ *args->valid = 0;
+ return;
+ }
+ }
+
+ switch(ctx->type) {
+ case CCLIntersectContext::RAY_SHADOW_ALL: {
+ /* Append the intersection to the end of the array. */
+ if(ctx->num_hits < ctx->max_hits) {
+ Intersection current_isect;
+ kernel_embree_convert_hit(kg, ray, hit, &current_isect);
+ for(size_t i = 0; i < ctx->max_hits; ++i) {
+ if(current_isect.object == ctx->isect_s[i].object &&
+ current_isect.prim == ctx->isect_s[i].prim &&
+ current_isect.t == ctx->isect_s[i].t) {
+ /* This intersection was already recorded, skip it. */
+ *args->valid = 0;
+ break;
+ }
+ }
+ Intersection *isect = &ctx->isect_s[ctx->num_hits];
+ ++ctx->num_hits;
+ *isect = current_isect;
+ int prim = kernel_tex_fetch(__prim_index, isect->prim);
+ int shader = 0;
+ if(kernel_tex_fetch(__prim_type, isect->prim) & PRIMITIVE_ALL_TRIANGLE) {
+ shader = kernel_tex_fetch(__tri_shader, prim);
+ }
+ else {
+ float4 str = kernel_tex_fetch(__curves, prim);
+ shader = __float_as_int(str.z);
+ }
+ int flag = kernel_tex_fetch(__shaders, shader & SHADER_MASK).flags;
+ /* If no transparent shadows, all light is blocked. */
+ if(flag & (SD_HAS_TRANSPARENT_SHADOW)) {
+ /* This tells Embree to continue tracing. */
+ *args->valid = 0;
+ }
+ }
+ else {
+ /* Increase the number of hits beyond ray.max_hits
+ * so that the caller can detect this as opaque. */
+ ++ctx->num_hits;
+ }
+ break;
+ }
+ case CCLIntersectContext::RAY_SSS: {
+ /* No intersection information requested, just return a hit. */
+ if(ctx->max_hits == 0) {
+ break;
+ }
+
+ /* See triangle_intersect_subsurface() for the native equivalent. */
+ for(int i = min(ctx->max_hits, ctx->ss_isect->num_hits) - 1; i >= 0; --i) {
+ if(ctx->ss_isect->hits[i].t == ray->tfar) {
+ /* This tells Embree to continue tracing. */
+ *args->valid = 0;
+ break;
+ }
+ }
+
+ ++ctx->ss_isect->num_hits;
+ int hit_idx;
+
+ if(ctx->ss_isect->num_hits <= ctx->max_hits) {
+ hit_idx = ctx->ss_isect->num_hits - 1;
+ }
+ else {
+ /* reservoir sampling: if we are at the maximum number of
+ * hits, randomly replace element or skip it */
+ hit_idx = lcg_step_uint(ctx->lcg_state) % ctx->ss_isect->num_hits;
+
+ if(hit_idx >= ctx->max_hits) {
+ /* This tells Embree to continue tracing. */
+ *args->valid = 0;
+ break;
+ }
+ }
+ /* record intersection */
+ kernel_embree_convert_local_hit(kg, ray, hit, &ctx->ss_isect->hits[hit_idx], ctx->sss_object_id);
+ ctx->ss_isect->Ng[hit_idx].x = hit->Ng_x;
+ ctx->ss_isect->Ng[hit_idx].y = hit->Ng_y;
+ ctx->ss_isect->Ng[hit_idx].z = hit->Ng_z;
+ ctx->ss_isect->Ng[hit_idx] = normalize(ctx->ss_isect->Ng[hit_idx]);
+ /* This tells Embree to continue tracing .*/
+ *args->valid = 0;
+ break;
+ }
+ case CCLIntersectContext::RAY_VOLUME_ALL: {
+ /* Append the intersection to the end of the array. */
+ if(ctx->num_hits < ctx->max_hits) {
+ Intersection current_isect;
+ kernel_embree_convert_hit(kg, ray, hit, &current_isect);
+ for(size_t i = 0; i < ctx->max_hits; ++i) {
+ if(current_isect.object == ctx->isect_s[i].object &&
+ current_isect.prim == ctx->isect_s[i].prim &&
+ current_isect.t == ctx->isect_s[i].t) {
+ /* This intersection was already recorded, skip it. */
+ *args->valid = 0;
+ break;
+ }
+ }
+ Intersection *isect = &ctx->isect_s[ctx->num_hits];
+ ++ctx->num_hits;
+ *isect = current_isect;
+ /* Only primitives from volume object. */
+ uint tri_object = (isect->object == OBJECT_NONE) ?
+ kernel_tex_fetch(__prim_object, isect->prim) : isect->object;
+ int object_flag = kernel_tex_fetch(__object_flag, tri_object);
+ if((object_flag & SD_OBJECT_HAS_VOLUME) == 0) {
+ --ctx->num_hits;
+ }
+ /* This tells Embree to continue tracing. */
+ *args->valid = 0;
+ break;
+ }
+ }
+ case CCLIntersectContext::RAY_REGULAR:
+ default:
+ /* Nothing to do here. */
+ break;
+ }
+}
+
+static size_t unaccounted_mem = 0;
+
+static bool rtc_memory_monitor_func(void* userPtr, const ssize_t bytes, const bool)
+{
+ Stats *stats = (Stats*)userPtr;
+ if(stats) {
+ if(bytes > 0) {
+ stats->mem_alloc(bytes);
+ }
+ else {
+ stats->mem_free(-bytes);
+ }
+ }
+ else {
+ /* A stats pointer may not yet be available. Keep track of the memory usage for later. */
+ if(bytes >= 0) {
+ atomic_add_and_fetch_z(&unaccounted_mem, bytes);
+ }
+ else {
+ atomic_sub_and_fetch_z(&unaccounted_mem, -bytes);
+ }
+ }
+ return true;
+}
+
+static void rtc_error_func(void*, enum RTCError, const char* str)
+{
+ VLOG(1) << str;
+}
+
+static double progress_start_time = 0.0f;
+
+static bool rtc_progress_func(void* user_ptr, const double n)
+{
+ Progress *progress = (Progress*)user_ptr;
+
+ if(time_dt() - progress_start_time < 0.25) {
+ return true;
+ }
+
+ string msg = string_printf("Building BVH %.0f%%", n * 100.0);
+ progress->set_substatus(msg);
+ progress_start_time = time_dt();
+
+ return !progress->get_cancel();
+}
+
+/* This is to have a shared device between all BVH instances.
+ It would be useful to actually to use a separte RTCDevice per Cycles instance. */
+RTCDevice BVHEmbree::rtc_shared_device = NULL;
+int BVHEmbree::rtc_shared_users = 0;
+thread_mutex BVHEmbree::rtc_shared_mutex;
+
+BVHEmbree::BVHEmbree(const BVHParams& params_, const vector<Object*>& objects_)
+: BVH(params_, objects_), scene(NULL), mem_used(0), top_level(NULL), stats(NULL),
+ curve_subdivisions(params.curve_subdivisions), build_quality(RTC_BUILD_QUALITY_REFIT),
+ use_curves(params_.curve_flags & CURVE_KN_INTERPOLATE),
+ use_ribbons(params.curve_flags & CURVE_KN_RIBBONS), dynamic_scene(true)
+{
+ _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
+ _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
+ thread_scoped_lock lock(rtc_shared_mutex);
+ if(rtc_shared_users == 0) {
+ rtc_shared_device = rtcNewDevice("verbose=0");
+ /* Check here if Embree was built with the correct flags. */
+ ssize_t ret = rtcGetDeviceProperty (rtc_shared_device,RTC_DEVICE_PROPERTY_RAY_MASK_SUPPORTED);
+ if(ret != 1) {
+ assert(0);
+ VLOG(1) << "Embree is compiled without the RTC_DEVICE_PROPERTY_RAY_MASK_SUPPORTED flag."\
+ "Ray visiblity will not work.";
+ }
+ ret = rtcGetDeviceProperty (rtc_shared_device,RTC_DEVICE_PROPERTY_FILTER_FUNCTION_SUPPORTED);
+ if(ret != 1) {
+ assert(0);
+ VLOG(1) << "Embree is compiled without the RTC_DEVICE_PROPERTY_FILTER_FUNCTION_SUPPORTED flag."\
+ "Renders may not look as expected.";
+ }
+ ret = rtcGetDeviceProperty (rtc_shared_device,RTC_DEVICE_PROPERTY_CURVE_GEOMETRY_SUPPORTED);
+ if(ret != 1) {
+ assert(0);
+ VLOG(1) << "Embree is compiled without the RTC_DEVICE_PROPERTY_CURVE_GEOMETRY_SUPPORTED flag. "\
+ "Line primitives will not be rendered.";
+ }
+ ret = rtcGetDeviceProperty (rtc_shared_device,RTC_DEVICE_PROPERTY_TRIANGLE_GEOMETRY_SUPPORTED);
+ if(ret != 1) {
+ assert(0);
+ VLOG(1) << "Embree is compiled without the RTC_DEVICE_PROPERTY_TRIANGLE_GEOMETRY_SUPPORTED flag. "\
+ "Triangle primitives will not be rendered.";
+ }
+ ret = rtcGetDeviceProperty (rtc_shared_device,RTC_DEVICE_PROPERTY_BACKFACE_CULLING_ENABLED);
+ if(ret != 0) {
+ assert(0);
+ VLOG(1) << "Embree is compiled with the RTC_DEVICE_PROPERTY_BACKFACE_CULLING_ENABLED flag. "\
+ "Renders may not look as expected.";
+ }
+ }
+ ++rtc_shared_users;
+
+ rtcSetDeviceErrorFunction(rtc_shared_device, rtc_error_func, NULL);
+
+ pack.root_index = -1;
+}
+
+BVHEmbree::~BVHEmbree()
+{
+ if(!params.top_level) {
+ destroy(scene);
+ }
+}
+
+void BVHEmbree::destroy(RTCScene scene)
+{
+ if(scene) {
+ rtcReleaseScene(scene);
+ scene = NULL;
+ }
+ thread_scoped_lock lock(rtc_shared_mutex);
+ --rtc_shared_users;
+ if(rtc_shared_users == 0) {
+ rtcReleaseDevice (rtc_shared_device);
+ rtc_shared_device = NULL;
+ }
+}
+
+void BVHEmbree::delete_rtcScene()
+{
+ if(scene) {
+ /* When this BVH is used as an instance in a top level BVH, don't delete now
+ * Let the top_level BVH know that it should delete it later. */
+ if(top_level) {
+ top_level->add_delayed_delete_scene(scene);
+ }
+ else {
+ rtcReleaseScene(scene);
+ if(delayed_delete_scenes.size()) {
+ foreach(RTCScene s, delayed_delete_scenes) {
+ rtcReleaseScene(s);
+ }
+ }
+ delayed_delete_scenes.clear();
+ }
+ scene = NULL;
+ }
+}
+
+void BVHEmbree::build(Progress& progress, Stats *stats_)
+{
+ assert(rtc_shared_device);
+ stats = stats_;
+ rtcSetDeviceMemoryMonitorFunction(rtc_shared_device, rtc_memory_monitor_func, stats);
+
+ progress.set_substatus("Building BVH");
+
+ if(scene) {
+ rtcReleaseScene(scene);
+ scene = NULL;
+ }
+
+ const bool dynamic = params.bvh_type == SceneParams::BVH_DYNAMIC;
+
+ scene = rtcNewScene(rtc_shared_device);
+ const RTCSceneFlags scene_flags = (dynamic ? RTC_SCENE_FLAG_DYNAMIC : RTC_SCENE_FLAG_NONE) |
+ RTC_SCENE_FLAG_COMPACT | RTC_SCENE_FLAG_ROBUST;
+ rtcSetSceneFlags(scene, scene_flags);
+ build_quality = dynamic ? RTC_BUILD_QUALITY_LOW :
+ (params.use_spatial_split ? RTC_BUILD_QUALITY_HIGH : RTC_BUILD_QUALITY_MEDIUM);
+ rtcSetSceneBuildQuality(scene, build_quality);
+
+ int i = 0;
+
+ pack.object_node.clear();
+
+ foreach(Object *ob, objects) {
+ if(params.top_level) {
+ if(!ob->is_traceable()) {
+ ++i;
+ continue;
+ }
+ if(!ob->mesh->is_instanced()) {
+ add_object(ob, i);
+ }
+ else {
+ add_instance(ob, i);
+ }
+ }
+ else {
+ add_object(ob, i);
+ }
+ ++i;
+ if(progress.get_cancel()) return;
+ }
+
+ if(progress.get_cancel()) {
+ delete_rtcScene();
+ stats = NULL;
+ return;
+ }
+
+ rtcSetSceneProgressMonitorFunction(scene, rtc_progress_func, &progress);
+ rtcCommitScene(scene);
+
+ pack_primitives();
+
+ if(progress.get_cancel()) {
+ delete_rtcScene();
+ stats = NULL;
+ return;
+ }
+
+ progress.set_substatus("Packing geometry");
+ pack_nodes(NULL);
+
+ stats = NULL;
+}
+
+void BVHEmbree::add_object(Object *ob, int i)
+{
+ Mesh *mesh = ob->mesh;
+ if(params.primitive_mask & PRIMITIVE_ALL_TRIANGLE && mesh->num_triangles() > 0) {
+ add_triangles(ob, i);
+ }
+ if(params.primitive_mask & PRIMITIVE_ALL_CURVE && mesh->num_curves() > 0) {
+ add_curves(ob, i);
+ }
+}
+
+void BVHEmbree::add_instance(Object *ob, int i)
+{
+ if(!ob || !ob->mesh) {
+ assert(0);
+ return;
+ }
+ BVHEmbree *instance_bvh = (BVHEmbree*)(ob->mesh->bvh);
+
+ if(instance_bvh->top_level != this) {
+ instance_bvh->top_level = this;
+ }
+
+ const size_t num_motion_steps = ob->use_motion() ? ob->motion.size() : 1;
+ RTCGeometry geom_id = rtcNewGeometry(rtc_shared_device, RTC_GEOMETRY_TYPE_INSTANCE);
+ rtcSetGeometryInstancedScene(geom_id, instance_bvh->scene);
+ rtcSetGeometryTimeStepCount(geom_id, num_motion_steps);
+
+ if(ob->use_motion()) {
+ for(size_t step = 0; step < num_motion_steps; ++step) {
+ rtcSetGeometryTransform(geom_id, step, RTC_FORMAT_FLOAT3X4_ROW_MAJOR, (const float*)&ob->motion[step]);
+ }
+ }
+ else {
+ rtcSetGeometryTransform(geom_id, 0, RTC_FORMAT_FLOAT3X4_ROW_MAJOR, (const float*)&ob->tfm);
+ }
+
+ pack.prim_index.push_back_slow(-1);
+ pack.prim_object.push_back_slow(i);
+ pack.prim_type.push_back_slow(PRIMITIVE_NONE);
+ pack.prim_tri_index.push_back_slow(-1);
+
+ rtcSetGeometryUserData(geom_id, (void*) instance_bvh->scene);
+ rtcSetGeometryMask(geom_id, ob->visibility);
+
+ rtcCommitGeometry(geom_id);
+ rtcAttachGeometryByID(scene, geom_id, i*2);
+ rtcReleaseGeometry(geom_id);
+}
+
+void BVHEmbree::add_triangles(Object *ob, int i)
+{
+ size_t prim_offset = pack.prim_index.size();
+ Mesh *mesh = ob->mesh;
+ const Attribute *attr_mP = NULL;
+ size_t num_motion_steps = 1;
+ if(mesh->has_motion_blur()) {
+ attr_mP = mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
+ if(attr_mP) {
+ num_motion_steps = mesh->motion_steps;
+ if(num_motion_steps > RTC_MAX_TIME_STEP_COUNT) {
+ assert(0);
+ num_motion_steps = RTC_MAX_TIME_STEP_COUNT;
+ }
+ }
+ }
+
+ const size_t num_triangles = mesh->num_triangles();
+ RTCGeometry geom_id = rtcNewGeometry(rtc_shared_device, RTC_GEOMETRY_TYPE_TRIANGLE);
+ rtcSetGeometryBuildQuality(geom_id, build_quality);
+ rtcSetGeometryTimeStepCount(geom_id, num_motion_steps);
+
+ unsigned *rtc_indices = (unsigned*)rtcSetNewGeometryBuffer(geom_id, RTC_BUFFER_TYPE_INDEX, 0,
+ RTC_FORMAT_UINT3, sizeof (int) * 3, num_triangles);
+ assert(rtc_indices);
+ if(!rtc_indices) {
+ VLOG(1) << "Embree could not create new geometry buffer for mesh " << mesh->name.c_str() << ".\n";
+ return;
+ }
+ for(size_t j = 0; j < num_triangles; ++j) {
+ Mesh::Triangle t = mesh->get_triangle(j);
+ rtc_indices[j*3] = t.v[0];
+ rtc_indices[j*3+1] = t.v[1];
+ rtc_indices[j*3+2] = t.v[2];
+ }
+
+ update_tri_vertex_buffer(geom_id, mesh);
+
+ pack.prim_object.reserve(pack.prim_object.size() + num_triangles);
+ pack.prim_type.reserve(pack.prim_type.size() + num_triangles);
+ pack.prim_index.reserve(pack.prim_index.size() + num_triangles);
+ pack.prim_tri_index.reserve(pack.prim_index.size() + num_triangles);
+ for(size_t j = 0; j < num_triangles; ++j) {
+ pack.prim_object.push_back_reserved(i);
+ pack.prim_type.push_back_reserved(num_motion_steps > 1 ? PRIMITIVE_MOTION_TRIANGLE : PRIMITIVE_TRIANGLE);
+ pack.prim_index.push_back_reserved(j);
+ pack.prim_tri_index.push_back_reserved(j);
+ }
+
+ rtcSetGeometryUserData(geom_id, (void*) prim_offset);
+ rtcSetGeometryIntersectFilterFunction(geom_id, rtc_filter_func);
+ rtcSetGeometryOccludedFilterFunction(geom_id, rtc_filter_occluded_func);
+ rtcSetGeometryMask(geom_id, ob->visibility);
+
+ rtcCommitGeometry(geom_id);
+ rtcAttachGeometryByID(scene, geom_id, i*2);
+ rtcReleaseGeometry(geom_id);
+}
+
+void BVHEmbree::update_tri_vertex_buffer(RTCGeometry geom_id, const Mesh* mesh)
+{
+ const Attribute *attr_mP = NULL;
+ size_t num_motion_steps = 1;
+ int t_mid = 0;
+ if(mesh->has_motion_blur()) {
+ attr_mP = mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
+ if(attr_mP) {
+ num_motion_steps = mesh->motion_steps;
+ t_mid = (num_motion_steps - 1) / 2;
+ if(num_motion_steps > RTC_MAX_TIME_STEP_COUNT) {
+ assert(0);
+ num_motion_steps = RTC_MAX_TIME_STEP_COUNT;
+ }
+ }
+ }
+ const size_t num_verts = mesh->verts.size();
+
+ for(int t = 0; t < num_motion_steps; ++t) {
+ const float3 *verts;
+ if(t == t_mid) {
+ verts = &mesh->verts[0];
+ }
+ else {
+ int t_ = (t > t_mid) ? (t - 1) : t;
+ verts = &attr_mP->data_float3()[t_ * num_verts];
+ }
+
+ float *rtc_verts = (float*) rtcSetNewGeometryBuffer(geom_id, RTC_BUFFER_TYPE_VERTEX, t,
+ RTC_FORMAT_FLOAT3, sizeof(float) * 3, num_verts + 1);
+ assert(rtc_verts);
+ if(rtc_verts) {
+ for(size_t j = 0; j < num_verts; ++j) {
+ rtc_verts[0] = verts[j].x;
+ rtc_verts[1] = verts[j].y;
+ rtc_verts[2] = verts[j].z;
+ rtc_verts += 3;
+ }
+ }
+ }
+}
+
+void BVHEmbree::update_curve_vertex_buffer(RTCGeometry geom_id, const Mesh* mesh)
+{
+ const Attribute *attr_mP = NULL;
+ size_t num_motion_steps = 1;
+ if(mesh->has_motion_blur()) {
+ attr_mP = mesh->curve_attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
+ if(attr_mP) {
+ num_motion_steps = mesh->motion_steps;
+ }
+ }
+
+ const size_t num_curves = mesh->num_curves();
+ size_t num_keys = 0;
+ for(size_t j = 0; j < num_curves; ++j) {
+ const Mesh::Curve c = mesh->get_curve(j);
+ num_keys += c.num_keys;
+ }
+
+ /* Copy the CV data to Embree */
+ const int t_mid = (num_motion_steps - 1) / 2;
+ const float *curve_radius = &mesh->curve_radius[0];
+ for(int t = 0; t < num_motion_steps; ++t) {
+ const float3 *verts;
+ if(t == t_mid || attr_mP == NULL) {
+ verts = &mesh->curve_keys[0];
+ }
+ else {
+ int t_ = (t > t_mid) ? (t - 1) : t;
+ verts = &attr_mP->data_float3()[t_ * num_keys];
+ }
+
+ float4 *rtc_verts = (float4*)rtcSetNewGeometryBuffer(geom_id, RTC_BUFFER_TYPE_VERTEX, t,
+ RTC_FORMAT_FLOAT4, sizeof (float) * 4, num_keys);
+ float4 *rtc_tangents = NULL;
+ if(use_curves) {
+ rtc_tangents = (float4*)rtcSetNewGeometryBuffer(geom_id, RTC_BUFFER_TYPE_TANGENT, t,
+ RTC_FORMAT_FLOAT4, sizeof (float) * 4, num_keys);
+ assert(rtc_tangents);
+ }
+ assert(rtc_verts);
+ if(rtc_verts) {
+ if(use_curves && rtc_tangents) {
+ const size_t num_curves = mesh->num_curves();
+ for(size_t j = 0; j < num_curves; ++j) {
+ Mesh::Curve c = mesh->get_curve(j);
+ int fk = c.first_key;
+ rtc_verts[0] = float3_to_float4(verts[fk]);
+ rtc_verts[0].w = curve_radius[fk];
+ rtc_tangents[0] = float3_to_float4(verts[fk + 1] - verts[fk]);
+ rtc_tangents[0].w = curve_radius[fk + 1] - curve_radius[fk];
+ ++fk;
+ int k = 1;
+ for(;k < c.num_segments(); ++k, ++fk) {
+ rtc_verts[k] = float3_to_float4(verts[fk]);
+ rtc_verts[k].w = curve_radius[fk];
+ rtc_tangents[k] = float3_to_float4((verts[fk + 1] - verts[fk - 1]) * 0.5f);
+ rtc_tangents[k].w = (curve_radius[fk + 1] - curve_radius[fk - 1]) * 0.5f;
+ }
+ rtc_verts[k] = float3_to_float4(verts[fk]);
+ rtc_verts[k].w = curve_radius[fk];
+ rtc_tangents[k] = float3_to_float4(verts[fk] - verts[fk - 1]);
+ rtc_tangents[k].w = curve_radius[fk] - curve_radius[fk - 1];
+ rtc_verts += c.num_keys;
+ rtc_tangents += c.num_keys;
+ }
+ }
+ else {
+ for(size_t j = 0; j < num_keys; ++j) {
+ rtc_verts[j] = float3_to_float4(verts[j]);
+ rtc_verts[j].w = curve_radius[j];
+ }
+ }
+ }
+ }
+}
+
+void BVHEmbree::add_curves(Object *ob, int i)
+{
+ size_t prim_offset = pack.prim_index.size();
+ const Mesh *mesh = ob->mesh;
+ const Attribute *attr_mP = NULL;
+ size_t num_motion_steps = 1;
+ if(mesh->has_motion_blur()) {
+ attr_mP = mesh->curve_attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
+ if(attr_mP) {
+ num_motion_steps = mesh->motion_steps;
+ }
+ }
+
+ const size_t num_curves = mesh->num_curves();
+ size_t num_segments = 0;
+ for(size_t j = 0; j < num_curves; ++j) {
+ Mesh::Curve c = mesh->get_curve(j);
+ assert(c.num_segments() > 0);
+ num_segments += c.num_segments();
+ }
+
+ /* Make room for Cycles specific data. */
+ pack.prim_object.reserve(pack.prim_object.size() + num_segments);
+ pack.prim_type.reserve(pack.prim_type.size() + num_segments);
+ pack.prim_index.reserve(pack.prim_index.size() + num_segments);
+ pack.prim_tri_index.reserve(pack.prim_index.size() + num_segments);
+
+ enum RTCGeometryType type = (!use_curves) ? RTC_GEOMETRY_TYPE_FLAT_LINEAR_CURVE :
+ (use_ribbons ? RTC_GEOMETRY_TYPE_FLAT_HERMITE_CURVE :
+ RTC_GEOMETRY_TYPE_ROUND_HERMITE_CURVE);
+
+ RTCGeometry geom_id = rtcNewGeometry(rtc_shared_device, type);
+ rtcSetGeometryTessellationRate(geom_id, curve_subdivisions);
+ unsigned *rtc_indices = (unsigned*) rtcSetNewGeometryBuffer(geom_id, RTC_BUFFER_TYPE_INDEX, 0,
+ RTC_FORMAT_UINT, sizeof (int), num_segments);
+ size_t rtc_index = 0;
+ for(size_t j = 0; j < num_curves; ++j) {
+ Mesh::Curve c = mesh->get_curve(j);
+ for(size_t k = 0; k < c.num_segments(); ++k) {
+ rtc_indices[rtc_index] = c.first_key + k;
+ /* Cycles specific data. */
+ pack.prim_object.push_back_reserved(i);
+ pack.prim_type.push_back_reserved(PRIMITIVE_PACK_SEGMENT(num_motion_steps > 1 ?
+ PRIMITIVE_MOTION_CURVE : PRIMITIVE_CURVE, k));
+ pack.prim_index.push_back_reserved(j);
+ pack.prim_tri_index.push_back_reserved(rtc_index);
+
+ ++rtc_index;
+ }
+ }
+
+ rtcSetGeometryBuildQuality(geom_id, build_quality);
+ rtcSetGeometryTimeStepCount(geom_id, num_motion_steps);
+
+ update_curve_vertex_buffer(geom_id, mesh);
+
+ rtcSetGeometryUserData(geom_id, (void*) prim_offset);
+ rtcSetGeometryIntersectFilterFunction(geom_id, rtc_filter_func);
+ rtcSetGeometryOccludedFilterFunction(geom_id, rtc_filter_occluded_func);
+ rtcSetGeometryMask(geom_id, ob->visibility);
+
+ rtcCommitGeometry(geom_id);
+ rtcAttachGeometryByID(scene, geom_id, i * 2 + 1);
+ rtcReleaseGeometry(geom_id);
+}
+
+void BVHEmbree::pack_nodes(const BVHNode *)
+{
+ /* Quite a bit of this code is for compatibility with Cycles' native BVH. */
+ if(!params.top_level) {
+ return;
+ }
+
+ for(size_t i = 0; i < pack.prim_index.size(); ++i) {
+ if(pack.prim_index[i] != -1) {
+ if(pack.prim_type[i] & PRIMITIVE_ALL_CURVE)
+ pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->curve_offset;
+ else
+ pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->tri_offset;
+ }
+ }
+
+ size_t prim_offset = pack.prim_index.size();
+
+ /* reserve */
+ size_t prim_index_size = pack.prim_index.size();
+ size_t prim_tri_verts_size = pack.prim_tri_verts.size();
+
+ size_t pack_prim_index_offset = prim_index_size;
+ size_t pack_prim_tri_verts_offset = prim_tri_verts_size;
+ size_t object_offset = 0;
+
+ map<Mesh*, int> mesh_map;
+
+ foreach(Object *ob, objects) {
+ Mesh *mesh = ob->mesh;
+ BVH *bvh = mesh->bvh;
+
+ if(mesh->need_build_bvh()) {
+ if(mesh_map.find(mesh) == mesh_map.end()) {
+ prim_index_size += bvh->pack.prim_index.size();
+ prim_tri_verts_size += bvh->pack.prim_tri_verts.size();
+ mesh_map[mesh] = 1;
+ }
+ }
+ }
+
+ mesh_map.clear();
+
+ pack.prim_index.resize(prim_index_size);
+ pack.prim_type.resize(prim_index_size);
+ pack.prim_object.resize(prim_index_size);
+ pack.prim_visibility.clear();
+ pack.prim_tri_verts.resize(prim_tri_verts_size);
+ pack.prim_tri_index.resize(prim_index_size);
+ pack.object_node.resize(objects.size());
+
+ int *pack_prim_index = (pack.prim_index.size())? &pack.prim_index[0]: NULL;
+ int *pack_prim_type = (pack.prim_type.size())? &pack.prim_type[0]: NULL;
+ int *pack_prim_object = (pack.prim_object.size())? &pack.prim_object[0]: NULL;
+ float4 *pack_prim_tri_verts = (pack.prim_tri_verts.size())? &pack.prim_tri_verts[0]: NULL;
+ uint *pack_prim_tri_index = (pack.prim_tri_index.size())? &pack.prim_tri_index[0]: NULL;
+
+ /* merge */
+ foreach(Object *ob, objects) {
+ Mesh *mesh = ob->mesh;
+
+ /* We assume that if mesh doesn't need own BVH it was already included
+ * into a top-level BVH and no packing here is needed.
+ */
+ if(!mesh->need_build_bvh()) {
+ pack.object_node[object_offset++] = prim_offset;
+ continue;
+ }
+
+ /* if mesh already added once, don't add it again, but used set
+ * node offset for this object */
+ map<Mesh*, int>::iterator it = mesh_map.find(mesh);
+
+ if(mesh_map.find(mesh) != mesh_map.end()) {
+ int noffset = it->second;
+ pack.object_node[object_offset++] = noffset;
+ continue;
+ }
+
+ BVHEmbree *bvh = (BVHEmbree*)mesh->bvh;
+
+ rtc_memory_monitor_func(stats, unaccounted_mem, true);
+ unaccounted_mem = 0;
+
+ int mesh_tri_offset = mesh->tri_offset;
+ int mesh_curve_offset = mesh->curve_offset;
+
+ /* fill in node indexes for instances */
+ pack.object_node[object_offset++] = prim_offset;
+
+ mesh_map[mesh] = pack.object_node[object_offset-1];
+
+ /* merge primitive, object and triangle indexes */
+ if(bvh->pack.prim_index.size()) {
+ size_t bvh_prim_index_size = bvh->pack.prim_index.size();
+ int *bvh_prim_index = &bvh->pack.prim_index[0];
+ int *bvh_prim_type = &bvh->pack.prim_type[0];
+ uint *bvh_prim_tri_index = &bvh->pack.prim_tri_index[0];
+
+ for(size_t i = 0; i < bvh_prim_index_size; ++i) {
+ if(bvh->pack.prim_type[i] & PRIMITIVE_ALL_CURVE) {
+ pack_prim_index[pack_prim_index_offset] = bvh_prim_index[i] + mesh_curve_offset;
+ pack_prim_tri_index[pack_prim_index_offset] = -1;
+ }
+ else {
+ pack_prim_index[pack_prim_index_offset] = bvh_prim_index[i] + mesh_tri_offset;
+ pack_prim_tri_index[pack_prim_index_offset] =
+ bvh_prim_tri_index[i] + pack_prim_tri_verts_offset;
+ }
+
+ pack_prim_type[pack_prim_index_offset] = bvh_prim_type[i];
+ pack_prim_object[pack_prim_index_offset] = 0;
+
+ ++pack_prim_index_offset;
+ }
+ }
+
+ /* Merge triangle vertices data. */
+ if(bvh->pack.prim_tri_verts.size()) {
+ const size_t prim_tri_size = bvh->pack.prim_tri_verts.size();
+ memcpy(pack_prim_tri_verts + pack_prim_tri_verts_offset,
+ &bvh->pack.prim_tri_verts[0],
+ prim_tri_size*sizeof(float4));
+ pack_prim_tri_verts_offset += prim_tri_size;
+ }
+
+ prim_offset += bvh->pack.prim_index.size();
+ }
+}
+
+void BVHEmbree::refit_nodes()
+{
+ /* Update all vertex buffers, then tell Embree to rebuild/-fit the BVHs. */
+ unsigned geom_id = 0;
+ foreach(Object *ob, objects) {
+ if(!params.top_level || (ob->is_traceable() && !ob->mesh->is_instanced())) {
+ if(params.primitive_mask & PRIMITIVE_ALL_TRIANGLE && ob->mesh->num_triangles() > 0) {
+ update_tri_vertex_buffer(rtcGetGeometry(scene, geom_id), ob->mesh);
+ rtcCommitGeometry(rtcGetGeometry(scene,geom_id));
+ }
+
+ if(params.primitive_mask & PRIMITIVE_ALL_CURVE && ob->mesh->num_curves() > 0) {
+ update_curve_vertex_buffer(rtcGetGeometry(scene, geom_id+1), ob->mesh);
+ rtcCommitGeometry(rtcGetGeometry(scene,geom_id+1));
+ }
+ }
+ geom_id += 2;
+ }
+ rtcCommitScene(scene);
+}
+CCL_NAMESPACE_END
+
+#endif /* WITH_EMBREE */
diff --git a/intern/cycles/bvh/bvh_embree.h b/intern/cycles/bvh/bvh_embree.h
new file mode 100644
index 00000000000..9990826ba98
--- /dev/null
+++ b/intern/cycles/bvh/bvh_embree.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2018, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BVH_EMBREE_H__
+#define __BVH_EMBREE_H__
+
+#ifdef WITH_EMBREE
+
+#include <embree3/rtcore.h>
+#include <embree3/rtcore_scene.h>
+
+#include "bvh/bvh.h"
+#include "bvh/bvh_params.h"
+
+#include "util/util_thread.h"
+#include "util/util_types.h"
+#include "util/util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Mesh;
+
+class BVHEmbree : public BVH
+{
+public:
+ virtual void build(Progress& progress, Stats *stats) override;
+ virtual ~BVHEmbree();
+ RTCScene scene;
+ static void destroy(RTCScene);
+protected:
+ friend class BVH;
+ BVHEmbree(const BVHParams& params, const vector<Object*>& objects);
+
+ virtual void pack_nodes(const BVHNode*) override;
+ virtual void refit_nodes() override;
+
+ void add_object(Object *ob, int i);
+ void add_instance(Object *ob, int i);
+ void add_curves(Object *ob, int i);
+ void add_triangles(Object *ob, int i);
+
+ ssize_t mem_used;
+
+ void add_delayed_delete_scene(RTCScene scene) { delayed_delete_scenes.push_back(scene); }
+ BVHEmbree *top_level;
+private:
+ void delete_rtcScene();
+ void update_tri_vertex_buffer(RTCGeometry geom_id, const Mesh* mesh);
+ void update_curve_vertex_buffer(RTCGeometry geom_id, const Mesh* mesh);
+
+ static RTCDevice rtc_shared_device;
+ static int rtc_shared_users;
+ static thread_mutex rtc_shared_mutex;
+
+ Stats *stats;
+ vector<RTCScene> delayed_delete_scenes;
+ int curve_subdivisions;
+ enum RTCBuildQuality build_quality;
+ bool use_curves, use_ribbons, dynamic_scene;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* WITH_EMBREE */
+
+#endif /* __BVH_EMBREE_H__ */
diff --git a/intern/cycles/bvh/bvh_node.h b/intern/cycles/bvh/bvh_node.h
index ed89d52a50a..65d5df01158 100644
--- a/intern/cycles/bvh/bvh_node.h
+++ b/intern/cycles/bvh/bvh_node.h
@@ -169,4 +169,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __BVH_NODE_H__ */
+#endif /* __BVH_NODE_H__ */
diff --git a/intern/cycles/bvh/bvh_params.h b/intern/cycles/bvh/bvh_params.h
index d8dd7df6ba1..6408d56da80 100644
--- a/intern/cycles/bvh/bvh_params.h
+++ b/intern/cycles/bvh/bvh_params.h
@@ -90,6 +90,13 @@ public:
/* Same as above, but for triangle primitives. */
int num_motion_triangle_steps;
+ /* Same as in SceneParams. */
+ int bvh_type;
+
+ /* These are needed for Embree. */
+ int curve_flags;
+ int curve_subdivisions;
+
/* fixed parameters */
enum {
MAX_DEPTH = 64,
@@ -123,6 +130,11 @@ public:
num_motion_curve_steps = 0;
num_motion_triangle_steps = 0;
+
+ bvh_type = 0;
+
+ curve_flags = 0;
+ curve_subdivisions = 4;
}
/* SAH costs */
@@ -274,4 +286,4 @@ struct BVHSpatialStorage {
CCL_NAMESPACE_END
-#endif /* __BVH_PARAMS_H__ */
+#endif /* __BVH_PARAMS_H__ */
diff --git a/intern/cycles/bvh/bvh_sort.h b/intern/cycles/bvh/bvh_sort.h
index 936401d8607..6910cc1e9b4 100644
--- a/intern/cycles/bvh/bvh_sort.h
+++ b/intern/cycles/bvh/bvh_sort.h
@@ -35,4 +35,4 @@ void bvh_reference_sort(int start,
CCL_NAMESPACE_END
-#endif /* __BVH_SORT_H__ */
+#endif /* __BVH_SORT_H__ */
diff --git a/intern/cycles/bvh/bvh_split.h b/intern/cycles/bvh/bvh_split.h
index a874a118b99..cb47deab211 100644
--- a/intern/cycles/bvh/bvh_split.h
+++ b/intern/cycles/bvh/bvh_split.h
@@ -259,4 +259,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __BVH_SPLIT_H__ */
+#endif /* __BVH_SPLIT_H__ */
diff --git a/intern/cycles/bvh/bvh_unaligned.h b/intern/cycles/bvh/bvh_unaligned.h
index c3ece051cd5..bcfb6ed68da 100644
--- a/intern/cycles/bvh/bvh_unaligned.h
+++ b/intern/cycles/bvh/bvh_unaligned.h
@@ -77,4 +77,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __BVH_UNALIGNED_H__ */
+#endif /* __BVH_UNALIGNED_H__ */
diff --git a/intern/cycles/cmake/external_libs.cmake b/intern/cycles/cmake/external_libs.cmake
index 2e386a6bfc5..d0f473a2939 100644
--- a/intern/cycles/cmake/external_libs.cmake
+++ b/intern/cycles/cmake/external_libs.cmake
@@ -133,6 +133,12 @@ if(CYCLES_STANDALONE_REPOSITORY)
set(BOOST_DEFINITIONS "-DBOOST_ALL_NO_LIB")
####
+ # embree
+ if(WITH_CYCLES_EMBREE)
+ find_package(embree 3.2.4 REQUIRED)
+ endif()
+
+ ####
# Logging
if(WITH_CYCLES_LOGGING)
find_package(Glog REQUIRED)
diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp
index 906c01c619d..428cd4158bc 100644
--- a/intern/cycles/device/device.cpp
+++ b/intern/cycles/device/device.cpp
@@ -504,7 +504,6 @@ DeviceInfo Device::get_multi_device(const vector<DeviceInfo>& subdevices, int th
info.has_half_images = true;
info.has_volume_decoupled = true;
- info.bvh_layout_mask = BVH_LAYOUT_ALL;
info.has_osl = true;
foreach(const DeviceInfo &device, subdevices) {
@@ -539,7 +538,6 @@ DeviceInfo Device::get_multi_device(const vector<DeviceInfo>& subdevices, int th
/* Accumulate device info. */
info.has_half_images &= device.has_half_images;
info.has_volume_decoupled &= device.has_volume_decoupled;
- info.bvh_layout_mask = device.bvh_layout_mask & info.bvh_layout_mask;
info.has_osl &= device.has_osl;
}
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index 585d9802279..5d1308c3030 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -58,7 +58,6 @@ public:
bool advanced_shading; /* Supports full shading system. */
bool has_half_images; /* Support half-float textures. */
bool has_volume_decoupled; /* Decoupled volume shading. */
- BVHLayoutMask bvh_layout_mask; /* Bitmask of supported BVH layouts. */
bool has_osl; /* Support Open Shading Language. */
bool use_split_kernel; /* Use split or mega kernel. */
int cpu_threads;
@@ -74,7 +73,6 @@ public:
advanced_shading = true;
has_half_images = false;
has_volume_decoupled = false;
- bvh_layout_mask = BVH_LAYOUT_NONE;
has_osl = false;
use_split_kernel = false;
}
@@ -183,7 +181,7 @@ public:
/* Convert the requested features structure to a build options,
* which could then be passed to compilers.
*/
- string get_build_options(void) const
+ string get_build_options() const
{
string build_options = "";
if(experimental) {
@@ -242,8 +240,8 @@ std::ostream& operator <<(std::ostream &os,
/* Device */
struct DeviceDrawParams {
- function<void(void)> bind_display_space_shader_cb;
- function<void(void)> unbind_display_space_shader_cb;
+ function<void()> bind_display_space_shader_cb;
+ function<void()> unbind_display_space_shader_cb;
};
class Device {
@@ -294,6 +292,7 @@ public:
fflush(stderr);
}
virtual bool show_samples() const { return false; }
+ virtual BVHLayoutMask get_bvh_layout_mask() const = 0;
/* statistics */
Stats &stats;
@@ -375,4 +374,4 @@ private:
CCL_NAMESPACE_END
-#endif /* __DEVICE_H__ */
+#endif /* __DEVICE_H__ */
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index 7c72ab1a009..76f6466bbde 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -41,6 +41,7 @@
#include "kernel/osl/osl_globals.h"
#include "render/buffers.h"
+#include "render/coverage.h"
#include "util/util_debug.h"
#include "util/util_foreach.h"
@@ -80,11 +81,11 @@ public:
/* Silence potential warnings about unused variables
* when compiling without some architectures. */
- (void)kernel_sse2;
- (void)kernel_sse3;
- (void)kernel_sse41;
- (void)kernel_avx;
- (void)kernel_avx2;
+ (void) kernel_sse2;
+ (void) kernel_sse3;
+ (void) kernel_sse41;
+ (void) kernel_avx;
+ (void) kernel_avx2;
#ifdef WITH_CYCLES_OPTIMIZED_KERNEL_AVX2
if(DebugFlags().cpu.has_avx2() && system_cpu_support_avx2()) {
architecture_name = "AVX2";
@@ -184,11 +185,11 @@ public:
KernelFunctions<void(*)(int, int, float*, float*, float*, float*, int*, int)> filter_detect_outliers_kernel;
KernelFunctions<void(*)(int, int, float*, float*, float*, float*, int*, int)> filter_combine_halves_kernel;
- KernelFunctions<void(*)(int, int, float*, float*, float*, int*, int, int, float, float)> filter_nlm_calc_difference_kernel;
- KernelFunctions<void(*)(float*, float*, int*, int, int)> filter_nlm_blur_kernel;
- KernelFunctions<void(*)(float*, float*, int*, int, int)> filter_nlm_calc_weight_kernel;
- KernelFunctions<void(*)(int, int, float*, float*, float*, float*, int*, int, int)> filter_nlm_update_output_kernel;
- KernelFunctions<void(*)(float*, float*, int*, int)> filter_nlm_normalize_kernel;
+ KernelFunctions<void(*)(int, int, float*, float*, float*, int*, int, int, float, float)> filter_nlm_calc_difference_kernel;
+ KernelFunctions<void(*)(float*, float*, int*, int, int)> filter_nlm_blur_kernel;
+ KernelFunctions<void(*)(float*, float*, int*, int, int)> filter_nlm_calc_weight_kernel;
+ KernelFunctions<void(*)(int, int, float*, float*, float*, float*, float*, int*, int, int)> filter_nlm_update_output_kernel;
+ KernelFunctions<void(*)(float*, float*, int*, int)> filter_nlm_normalize_kernel;
KernelFunctions<void(*)(float*, int, int, int, float*, int*, int*, int, int, float)> filter_construct_transform_kernel;
KernelFunctions<void(*)(int, int, float*, float*, float*, int*, float*, float3*, int*, int*, int, int, int)> filter_nlm_construct_gramian_kernel;
@@ -277,6 +278,20 @@ public:
return (info.cpu_threads == 1);
}
+ virtual BVHLayoutMask get_bvh_layout_mask() const {
+ BVHLayoutMask bvh_layout_mask = BVH_LAYOUT_BVH2;
+ if(DebugFlags().cpu.has_sse2() && system_cpu_support_sse2()) {
+ bvh_layout_mask |= BVH_LAYOUT_BVH4;
+ }
+ if(DebugFlags().cpu.has_avx2() && system_cpu_support_avx2()) {
+ bvh_layout_mask |= BVH_LAYOUT_BVH8;
+ }
+#ifdef WITH_EMBREE
+ bvh_layout_mask |= BVH_LAYOUT_EMBREE;
+#endif /* WITH_EMBREE */
+ return bvh_layout_mask;
+ }
+
void load_texture_info()
{
if(need_texture_info) {
@@ -499,6 +514,7 @@ public:
filter_nlm_update_output_kernel()(dx, dy,
blurDifference,
(float*) image_ptr,
+ difference,
(float*) out_ptr,
weightAccum,
local_rect,
@@ -676,12 +692,22 @@ public:
void path_trace(DeviceTask &task, RenderTile &tile, KernelGlobals *kg)
{
+ const bool use_coverage = kernel_data.film.cryptomatte_passes & CRYPT_ACCURATE;
+
scoped_timer timer(&tile.buffers->render_time);
+ Coverage coverage(kg, tile);
+ if(use_coverage) {
+ coverage.init_path_trace();
+ }
+
float *render_buffer = (float*)tile.buffer;
int start_sample = tile.start_sample;
int end_sample = tile.start_sample + tile.num_samples;
+ _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
+ _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
+
for(int sample = start_sample; sample < end_sample; sample++) {
if(task.get_cancel() || task_pool.canceled()) {
if(task.need_finish_queue == false)
@@ -690,6 +716,9 @@ public:
for(int y = tile.y; y < tile.y + tile.h; y++) {
for(int x = tile.x; x < tile.x + tile.w; x++) {
+ if(use_coverage) {
+ coverage.init_pixel(x, y);
+ }
path_trace_kernel()(kg, render_buffer,
sample, x, y, tile.offset, tile.stride);
}
@@ -699,6 +728,9 @@ public:
task.update_progress(&tile, tile.w*tile.h);
}
+ if(use_coverage) {
+ coverage.finalize();
+ }
}
void denoise(DenoisingTask& denoising, RenderTile &tile)
@@ -759,7 +791,6 @@ public:
}
else if(tile.task == RenderTile::DENOISE) {
denoise(denoising, tile);
-
task.update_progress(&tile, tile.w*tile.h);
}
@@ -1027,13 +1058,6 @@ void device_cpu_info(vector<DeviceInfo>& devices)
info.id = "CPU";
info.num = 0;
info.advanced_shading = true;
- info.bvh_layout_mask = BVH_LAYOUT_BVH2;
- if(system_cpu_support_sse2()) {
- info.bvh_layout_mask |= BVH_LAYOUT_BVH4;
- }
- if(system_cpu_support_avx2()) {
- info.bvh_layout_mask |= BVH_LAYOUT_BVH8;
- }
info.has_volume_decoupled = true;
info.has_osl = true;
info.has_half_images = true;
@@ -1041,7 +1065,7 @@ void device_cpu_info(vector<DeviceInfo>& devices)
devices.insert(devices.begin(), info);
}
-string device_cpu_capabilities(void)
+string device_cpu_capabilities()
{
string capabilities = "";
capabilities += system_cpu_support_sse2() ? "SSE2 " : "";
diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp
index 830cc207d54..2da113f2edb 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -73,12 +73,12 @@ const char *cuewErrorString(CUresult result)
return error.c_str();
}
-const char *cuewCompilerPath(void)
+const char *cuewCompilerPath()
{
return CYCLES_CUDA_NVCC_EXECUTABLE;
}
-int cuewCompilerVersion(void)
+int cuewCompilerVersion()
{
return (CUDA_VERSION / 100) + (CUDA_VERSION % 100 / 10);
}
@@ -181,6 +181,10 @@ public:
return true;
}
+ virtual BVHLayoutMask get_bvh_layout_mask() const {
+ return BVH_LAYOUT_BVH2;
+ }
+
/*#ifdef NDEBUG
#define cuda_abort()
#else
@@ -207,7 +211,7 @@ public:
/*cuda_abort();*/ \
cuda_error_documentation(); \
} \
- } (void)0
+ } (void) 0
bool cuda_error_(CUresult result, const string& stmt)
{
@@ -1397,18 +1401,14 @@ public:
int h = task->reconstruction_state.source_h;
int stride = task->buffer.stride;
- int shift_stride = stride*h;
+ int pass_stride = task->buffer.pass_stride;
int num_shifts = (2*r+1)*(2*r+1);
- int mem_size = sizeof(float)*shift_stride*num_shifts;
-
- device_only_memory<uchar> temporary_mem(this, "Denoising temporary_mem");
- temporary_mem.alloc_to_device(2*mem_size);
if(have_error())
return false;
- CUdeviceptr difference = cuda_device_ptr(temporary_mem.device_pointer);
- CUdeviceptr blurDifference = difference + mem_size;
+ CUdeviceptr difference = cuda_device_ptr(task->buffer.temporary_mem.device_pointer);
+ CUdeviceptr blurDifference = difference + sizeof(float)*pass_stride*num_shifts;
{
CUfunction cuNLMCalcDifference, cuNLMBlur, cuNLMCalcWeight, cuNLMConstructGramian;
@@ -1426,9 +1426,9 @@ public:
task->reconstruction_state.source_w * task->reconstruction_state.source_h,
num_shifts);
- void *calc_difference_args[] = {&color_ptr, &color_variance_ptr, &difference, &w, &h, &stride, &shift_stride, &r, &task->buffer.pass_stride, &a, &k_2};
- void *blur_args[] = {&difference, &blurDifference, &w, &h, &stride, &shift_stride, &r, &f};
- void *calc_weight_args[] = {&blurDifference, &difference, &w, &h, &stride, &shift_stride, &r, &f};
+ void *calc_difference_args[] = {&color_ptr, &color_variance_ptr, &difference, &w, &h, &stride, &pass_stride, &r, &pass_stride, &a, &k_2};
+ void *blur_args[] = {&difference, &blurDifference, &w, &h, &stride, &pass_stride, &r, &f};
+ void *calc_weight_args[] = {&blurDifference, &difference, &w, &h, &stride, &pass_stride, &r, &f};
void *construct_gramian_args[] = {&blurDifference,
&task->buffer.mem.device_pointer,
&task->storage.transform.device_pointer,
@@ -1437,9 +1437,8 @@ public:
&task->storage.XtWY.device_pointer,
&task->reconstruction_state.filter_window,
&w, &h, &stride,
- &shift_stride, &r,
- &f,
- &task->buffer.pass_stride};
+ &pass_stride, &r,
+ &f};
CUDA_LAUNCH_KERNEL_1D(cuNLMCalcDifference, calc_difference_args);
CUDA_LAUNCH_KERNEL_1D(cuNLMBlur, blur_args);
@@ -1448,8 +1447,6 @@ public:
CUDA_LAUNCH_KERNEL_1D(cuNLMConstructGramian, construct_gramian_args);
}
- temporary_mem.free();
-
{
CUfunction cuFinalize;
cuda_assert(cuModuleGetFunction(&cuFinalize, cuFilterModule, "kernel_cuda_filter_finalize"));
@@ -1667,7 +1664,7 @@ public:
for(int sample = start_sample; sample < end_sample; sample += step_samples) {
/* Setup and copy work tile to device. */
wtile->start_sample = sample;
- wtile->num_samples = min(step_samples, end_sample - sample);;
+ wtile->num_samples = min(step_samples, end_sample - sample);
work_tiles.copy_to_device();
CUdeviceptr d_work_tiles = cuda_device_ptr(work_tiles.device_pointer);
@@ -2167,7 +2164,7 @@ public:
/*cuda_abort();*/ \
device->cuda_error_documentation(); \
} \
- } (void)0
+ } (void) 0
/* CUDA context scope. */
@@ -2376,7 +2373,7 @@ int2 CUDASplitKernel::split_kernel_global_size(device_memory& kg, device_memory&
return global_size;
}
-bool device_cuda_init(void)
+bool device_cuda_init()
{
#ifdef WITH_CUDA_DYNLOAD
static bool initialized = false;
@@ -2414,7 +2411,7 @@ bool device_cuda_init(void)
return result;
#else /* WITH_CUDA_DYNLOAD */
return true;
-#endif /* WITH_CUDA_DYNLOAD */
+#endif /* WITH_CUDA_DYNLOAD */
}
Device *device_cuda_create(DeviceInfo& info, Stats &stats, bool background)
@@ -2484,7 +2481,6 @@ void device_cuda_info(vector<DeviceInfo>& devices)
info.advanced_shading = (major >= 3);
info.has_half_images = (major >= 3);
info.has_volume_decoupled = false;
- info.bvh_layout_mask = BVH_LAYOUT_BVH2;
int pci_location[3] = {0, 0, 0};
cuDeviceGetAttribute(&pci_location[0], CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID, num);
@@ -2519,7 +2515,7 @@ void device_cuda_info(vector<DeviceInfo>& devices)
devices.insert(devices.end(), display_devices.begin(), display_devices.end());
}
-string device_cuda_capabilities(void)
+string device_cuda_capabilities()
{
CUresult result = device_cuda_safe_init();
if(result != CUDA_SUCCESS) {
@@ -2552,7 +2548,7 @@ string device_cuda_capabilities(void)
capabilities += string_printf("\t\tCU_DEVICE_ATTRIBUTE_" #attr "\t\t\t%d\n", \
value); \
} \
- } (void)0
+ } (void) 0
/* TODO(sergey): Strip all attributes which are not useful for us
* or does not depend on the driver.
*/
diff --git a/intern/cycles/device/device_denoising.cpp b/intern/cycles/device/device_denoising.cpp
index 23c18fa15b2..78c65a3d22d 100644
--- a/intern/cycles/device/device_denoising.cpp
+++ b/intern/cycles/device/device_denoising.cpp
@@ -99,14 +99,18 @@ void DenoisingTask::setup_denoising_buffer()
buffer.mem.alloc_to_device(mem_size, false);
/* CPUs process shifts sequentially while GPUs process them in parallel. */
- int num_shifts = 1;
+ int num_layers;
if(buffer.gpu_temporary_mem) {
/* Shadowing prefiltering uses a radius of 6, so allocate at least that much. */
int max_radius = max(radius, 6);
- num_shifts = (2*max_radius + 1) * (2*max_radius + 1);
+ int num_shifts = (2*max_radius + 1) * (2*max_radius + 1);
+ num_layers = 2*num_shifts + 1;
+ }
+ else {
+ num_layers = 3;
}
/* Allocate two layers per shift as well as one for the weight accumulation. */
- buffer.temporary_mem.alloc_to_device((2*num_shifts + 1) * buffer.pass_stride);
+ buffer.temporary_mem.alloc_to_device(num_layers * buffer.pass_stride);
}
void DenoisingTask::prefilter_shadowing()
diff --git a/intern/cycles/device/device_denoising.h b/intern/cycles/device/device_denoising.h
index 7474f71ff78..8e0666d0e59 100644
--- a/intern/cycles/device/device_denoising.h
+++ b/intern/cycles/device/device_denoising.h
@@ -166,4 +166,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __DEVICE_DENOISING_H__ */
+#endif /* __DEVICE_DENOISING_H__ */
diff --git a/intern/cycles/device/device_intern.h b/intern/cycles/device/device_intern.h
index 941be448101..e6495c2bff3 100644
--- a/intern/cycles/device/device_intern.h
+++ b/intern/cycles/device/device_intern.h
@@ -22,9 +22,9 @@ CCL_NAMESPACE_BEGIN
class Device;
Device *device_cpu_create(DeviceInfo& info, Stats &stats, bool background);
-bool device_opencl_init(void);
+bool device_opencl_init();
Device *device_opencl_create(DeviceInfo& info, Stats &stats, bool background);
-bool device_cuda_init(void);
+bool device_cuda_init();
Device *device_cuda_create(DeviceInfo& info, Stats &stats, bool background);
Device *device_network_create(DeviceInfo& info, Stats &stats, const char *address);
Device *device_multi_create(DeviceInfo& info, Stats &stats, bool background);
@@ -34,10 +34,10 @@ void device_opencl_info(vector<DeviceInfo>& devices);
void device_cuda_info(vector<DeviceInfo>& devices);
void device_network_info(vector<DeviceInfo>& devices);
-string device_cpu_capabilities(void);
-string device_opencl_capabilities(void);
-string device_cuda_capabilities(void);
+string device_cpu_capabilities();
+string device_opencl_capabilities();
+string device_cuda_capabilities();
CCL_NAMESPACE_END
-#endif /* __DEVICE_INTERN_H__ */
+#endif /* __DEVICE_INTERN_H__ */
diff --git a/intern/cycles/device/device_memory.h b/intern/cycles/device/device_memory.h
index 2b4835c9c65..e43834bdc8d 100644
--- a/intern/cycles/device/device_memory.h
+++ b/intern/cycles/device/device_memory.h
@@ -21,6 +21,7 @@
*
* Data types for allocating, copying and freeing device memory. */
+#include "util/util_array.h"
#include "util/util_half.h"
#include "util/util_texture.h"
#include "util/util_types.h"
@@ -496,4 +497,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __DEVICE_MEMORY_H__ */
+#endif /* __DEVICE_MEMORY_H__ */
diff --git a/intern/cycles/device/device_multi.cpp b/intern/cycles/device/device_multi.cpp
index 587840e551f..67f0f880287 100644
--- a/intern/cycles/device/device_multi.cpp
+++ b/intern/cycles/device/device_multi.cpp
@@ -103,6 +103,14 @@ public:
return devices.front().device->show_samples();
}
+ virtual BVHLayoutMask get_bvh_layout_mask() const {
+ BVHLayoutMask bvh_layout_mask = BVH_LAYOUT_ALL;
+ foreach(const SubDevice& sub_device, devices) {
+ bvh_layout_mask &= sub_device.device->get_bvh_layout_mask();
+ }
+ return bvh_layout_mask;
+ }
+
bool load_kernels(const DeviceRequestedFeatures& requested_features)
{
foreach(SubDevice& sub, devices)
diff --git a/intern/cycles/device/device_network.cpp b/intern/cycles/device/device_network.cpp
index 204e405421d..b6e18621f12 100644
--- a/intern/cycles/device/device_network.cpp
+++ b/intern/cycles/device/device_network.cpp
@@ -87,6 +87,10 @@ public:
snd.write();
}
+ virtual BVHLayoutMask get_bvh_layout_mask() const {
+ return BVH_LAYOUT_BVH2;
+ }
+
void mem_alloc(device_memory& mem)
{
if(mem.name) {
@@ -306,7 +310,6 @@ void device_network_info(vector<DeviceInfo>& devices)
/* todo: get this info from device */
info.advanced_shading = true;
info.has_volume_decoupled = false;
- info.bvh_layout_mask = BVH_LAYOUT_BVH2;
info.has_osl = false;
devices.push_back(info);
diff --git a/intern/cycles/device/device_network.h b/intern/cycles/device/device_network.h
index 96e0de742db..67626ae177f 100644
--- a/intern/cycles/device/device_network.h
+++ b/intern/cycles/device/device_network.h
@@ -488,4 +488,4 @@ CCL_NAMESPACE_END
#endif
-#endif /* __DEVICE_NETWORK_H__ */
+#endif /* __DEVICE_NETWORK_H__ */
diff --git a/intern/cycles/device/device_opencl.cpp b/intern/cycles/device/device_opencl.cpp
index be0f8f45399..71410f80d57 100644
--- a/intern/cycles/device/device_opencl.cpp
+++ b/intern/cycles/device/device_opencl.cpp
@@ -44,7 +44,7 @@ Device *device_opencl_create(DeviceInfo& info, Stats &stats, bool background)
}
}
-bool device_opencl_init(void)
+bool device_opencl_init()
{
static bool initialized = false;
static bool result = false;
@@ -136,7 +136,6 @@ void device_opencl_info(vector<DeviceInfo>& devices)
info.use_split_kernel = OpenCLInfo::kernel_use_split(platform_name,
device_type);
info.has_volume_decoupled = false;
- info.bvh_layout_mask = BVH_LAYOUT_BVH2;
info.id = id;
/* Check OpenCL extensions */
@@ -147,7 +146,7 @@ void device_opencl_info(vector<DeviceInfo>& devices)
}
}
-string device_opencl_capabilities(void)
+string device_opencl_capabilities()
{
if(OpenCLInfo::device_type() == 0) {
return "All OpenCL devices are forced to be OFF";
@@ -246,4 +245,4 @@ string device_opencl_capabilities(void)
CCL_NAMESPACE_END
-#endif /* WITH_OPENCL */
+#endif /* WITH_OPENCL */
diff --git a/intern/cycles/device/device_split_kernel.h b/intern/cycles/device/device_split_kernel.h
index 26ddce5bb22..5af4367d1b6 100644
--- a/intern/cycles/device/device_split_kernel.h
+++ b/intern/cycles/device/device_split_kernel.h
@@ -130,4 +130,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __DEVICE_SPLIT_KERNEL_H__ */
+#endif /* __DEVICE_SPLIT_KERNEL_H__ */
diff --git a/intern/cycles/device/device_task.h b/intern/cycles/device/device_task.h
index ec87aa8c560..861014373b3 100644
--- a/intern/cycles/device/device_task.h
+++ b/intern/cycles/device/device_task.h
@@ -64,7 +64,7 @@ public:
function<void(long, int)> update_progress_sample;
function<void(RenderTile&)> update_tile_sample;
function<void(RenderTile&)> release_tile;
- function<bool(void)> get_cancel;
+ function<bool()> get_cancel;
function<void(RenderTile*, Device*)> map_neighbor_tiles;
function<void(RenderTile*, Device*)> unmap_neighbor_tiles;
@@ -85,4 +85,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __DEVICE_TASK_H__ */
+#endif /* __DEVICE_TASK_H__ */
diff --git a/intern/cycles/device/opencl/opencl.h b/intern/cycles/device/opencl/opencl.h
index 6c73d10a376..8cb7f6d0b82 100644
--- a/intern/cycles/device/opencl/opencl.h
+++ b/intern/cycles/device/opencl/opencl.h
@@ -245,7 +245,7 @@ public:
(device)->set_error(message); \
fprintf(stderr, "%s\n", message.c_str()); \
} \
- } (void)0
+ } (void) 0
#define opencl_assert(stmt) \
{ \
@@ -257,7 +257,7 @@ public:
error_msg = message; \
fprintf(stderr, "%s\n", message.c_str()); \
} \
- } (void)0
+ } (void) 0
class OpenCLDeviceBase : public Device
{
diff --git a/intern/cycles/device/opencl/opencl_base.cpp b/intern/cycles/device/opencl/opencl_base.cpp
index 69a2bd7adcb..1e73d37d7a4 100644
--- a/intern/cycles/device/opencl/opencl_base.cpp
+++ b/intern/cycles/device/opencl/opencl_base.cpp
@@ -761,7 +761,7 @@ bool OpenCLDeviceBase::denoising_non_local_means(device_ptr image_ptr,
cl_mem variance_mem = CL_MEM_PTR(variance_ptr);
cl_mem out_mem = CL_MEM_PTR(out_ptr);
- mem_zero_kernel(*difference, sizeof(float)*pass_stride);
+ mem_zero_kernel(*weightAccum, sizeof(float)*pass_stride);
mem_zero_kernel(out_ptr, sizeof(float)*pass_stride);
cl_kernel ckNLMCalcDifference = denoising_program(ustring("filter_nlm_calc_difference"));
@@ -865,38 +865,38 @@ bool OpenCLDeviceBase::denoising_reconstruct(device_ptr color_ptr,
int h = task->reconstruction_state.source_h;
int stride = task->buffer.stride;
- int shift_stride = stride*h;
- int num_shifts = (2*task->radius + 1)*(2*task->radius + 1);
- int mem_size = sizeof(float)*shift_stride*num_shifts;
+ int r = task->radius;
+ int pass_stride = task->buffer.pass_stride;
+ int num_shifts = (2*r+1)*(2*r+1);
- cl_mem difference = clCreateBuffer(cxContext, CL_MEM_READ_WRITE, mem_size, NULL, &ciErr);
- opencl_assert_err(ciErr, "clCreateBuffer denoising_reconstruct");
- cl_mem blurDifference = clCreateBuffer(cxContext, CL_MEM_READ_WRITE, mem_size, NULL, &ciErr);
- opencl_assert_err(ciErr, "clCreateBuffer denoising_reconstruct");
+ device_sub_ptr difference(task->buffer.temporary_mem, 0, pass_stride*num_shifts);
+ device_sub_ptr blurDifference(task->buffer.temporary_mem, pass_stride*num_shifts, pass_stride*num_shifts);
+ cl_mem difference_mem = CL_MEM_PTR(*difference);
+ cl_mem blurDifference_mem = CL_MEM_PTR(*blurDifference);
kernel_set_args(ckNLMCalcDifference, 0,
color_mem,
color_variance_mem,
- difference,
+ difference_mem,
w, h, stride,
- shift_stride,
- task->radius,
- task->buffer.pass_stride,
+ pass_stride,
+ r,
+ pass_stride,
1.0f, task->nlm_k_2);
kernel_set_args(ckNLMBlur, 0,
- difference,
- blurDifference,
+ difference_mem,
+ blurDifference_mem,
w, h, stride,
- shift_stride,
- task->radius, 4);
+ pass_stride,
+ r, 4);
kernel_set_args(ckNLMCalcWeight, 0,
- blurDifference,
- difference,
+ blurDifference_mem,
+ difference_mem,
w, h, stride,
- shift_stride,
- task->radius, 4);
+ pass_stride,
+ r, 4);
kernel_set_args(ckNLMConstructGramian, 0,
- blurDifference,
+ blurDifference_mem,
buffer_mem,
transform_mem,
rank_mem,
@@ -904,9 +904,8 @@ bool OpenCLDeviceBase::denoising_reconstruct(device_ptr color_ptr,
XtWY_mem,
task->reconstruction_state.filter_window,
w, h, stride,
- shift_stride,
- task->radius, 4,
- task->buffer.pass_stride);
+ pass_stride,
+ r, 4);
enqueue_kernel(ckNLMCalcDifference, w*h, num_shifts, true);
enqueue_kernel(ckNLMBlur, w*h, num_shifts, true);
@@ -914,9 +913,6 @@ bool OpenCLDeviceBase::denoising_reconstruct(device_ptr color_ptr,
enqueue_kernel(ckNLMBlur, w*h, num_shifts, true);
enqueue_kernel(ckNLMConstructGramian, w*h, num_shifts, true, 256);
- opencl_assert(clReleaseMemObject(difference));
- opencl_assert(clReleaseMemObject(blurDifference));
-
kernel_set_args(ckFinalize, 0,
output_mem,
rank_mem,
@@ -1179,8 +1175,13 @@ string OpenCLDeviceBase::kernel_build_options(const string *debug_src)
build_options += "-g -s \"" + *debug_src + "\" ";
}
- if(OpenCLInfo::use_debug())
+ if(info.has_half_images) {
+ build_options += "-D__KERNEL_CL_KHR_FP16__ ";
+ }
+
+ if(OpenCLInfo::use_debug()) {
build_options += "-D__KERNEL_OPENCL_DEBUG__ ";
+ }
#ifdef WITH_CYCLES_DEBUG
build_options += "-D__KERNEL_DEBUG__ ";
diff --git a/intern/cycles/device/opencl/opencl_mega.cpp b/intern/cycles/device/opencl/opencl_mega.cpp
index e004c0b44f4..89001366d9d 100644
--- a/intern/cycles/device/opencl/opencl_mega.cpp
+++ b/intern/cycles/device/opencl/opencl_mega.cpp
@@ -43,6 +43,10 @@ public:
return true;
}
+ virtual BVHLayoutMask get_bvh_layout_mask() const {
+ return BVH_LAYOUT_BVH2;
+ }
+
virtual bool load_kernels(const DeviceRequestedFeatures& /*requested_features*/,
vector<OpenCLProgram*> &programs)
{
diff --git a/intern/cycles/device/opencl/opencl_split.cpp b/intern/cycles/device/opencl/opencl_split.cpp
index 66a4aa7e891..adb73bc6e2c 100644
--- a/intern/cycles/device/opencl/opencl_split.cpp
+++ b/intern/cycles/device/opencl/opencl_split.cpp
@@ -95,6 +95,10 @@ public:
return true;
}
+ virtual BVHLayoutMask get_bvh_layout_mask() const {
+ return BVH_LAYOUT_BVH2;
+ }
+
virtual bool load_kernels(const DeviceRequestedFeatures& requested_features,
vector<OpenCLDeviceBase::OpenCLProgram*> &programs)
{
@@ -459,4 +463,4 @@ Device *opencl_create_split_device(DeviceInfo& info, Stats& stats, bool backgrou
CCL_NAMESPACE_END
-#endif /* WITH_OPENCL */
+#endif /* WITH_OPENCL */
diff --git a/intern/cycles/device/opencl/opencl_util.cpp b/intern/cycles/device/opencl/opencl_util.cpp
index 895e4149a3a..4c9f3cd6ef7 100644
--- a/intern/cycles/device/opencl/opencl_util.cpp
+++ b/intern/cycles/device/opencl/opencl_util.cpp
@@ -106,7 +106,7 @@ cl_context OpenCLCache::get_context(cl_platform_id platform,
cl_int ciErr = clRetainContext(slot.context);
assert(ciErr == CL_SUCCESS);
- (void)ciErr;
+ (void) ciErr;
return slot.context;
}
@@ -153,7 +153,7 @@ cl_program OpenCLCache::get_program(cl_platform_id platform,
cl_int ciErr = clRetainProgram(entry.program);
assert(ciErr == CL_SUCCESS);
- (void)ciErr;
+ (void) ciErr;
return entry.program;
}
@@ -188,7 +188,7 @@ void OpenCLCache::store_context(cl_platform_id platform,
* The caller is going to release the object when done with it. */
cl_int ciErr = clRetainContext(context);
assert(ciErr == CL_SUCCESS);
- (void)ciErr;
+ (void) ciErr;
}
void OpenCLCache::store_program(cl_platform_id platform,
@@ -227,7 +227,7 @@ void OpenCLCache::store_program(cl_platform_id platform,
*/
cl_int ciErr = clRetainProgram(program);
assert(ciErr == CL_SUCCESS);
- (void)ciErr;
+ (void) ciErr;
}
string OpenCLCache::get_kernel_md5()
diff --git a/intern/cycles/graph/node.h b/intern/cycles/graph/node.h
index 11695a8631d..d50a3786139 100644
--- a/intern/cycles/graph/node.h
+++ b/intern/cycles/graph/node.h
@@ -18,9 +18,9 @@
#include "graph/node_type.h"
+#include "util/util_array.h"
#include "util/util_map.h"
#include "util/util_param.h"
-#include "util/util_vector.h"
CCL_NAMESPACE_BEGIN
diff --git a/intern/cycles/graph/node_type.h b/intern/cycles/graph/node_type.h
index 1d565794b27..7d6abae2314 100644
--- a/intern/cycles/graph/node_type.h
+++ b/intern/cycles/graph/node_type.h
@@ -17,7 +17,7 @@
#pragma once
#include "graph/node_enum.h"
-
+#include "util/util_array.h"
#include "util/util_map.h"
#include "util/util_param.h"
#include "util/util_string.h"
diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt
index c6e92c6d89d..92cb66bdec9 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -82,6 +82,7 @@ set(SRC_BVH_HEADERS
bvh/obvh_traversal.h
bvh/obvh_volume.h
bvh/obvh_volume_all.h
+ bvh/bvh_embree.h
)
set(SRC_HEADERS
@@ -96,6 +97,7 @@ set(SRC_HEADERS
kernel_emission.h
kernel_film.h
kernel_globals.h
+ kernel_id_passes.h
kernel_jitter.h
kernel_light.h
kernel_math.h
@@ -340,11 +342,11 @@ if(WITH_CYCLES_CUDA_BINARIES)
set(CUDA_VERSION "${CUDA_VERSION_MAJOR}${CUDA_VERSION_MINOR}")
# warn for other versions
- if(CUDA_VERSION MATCHES "80" OR CUDA_VERSION MATCHES "90")
+ if(CUDA_VERSION MATCHES "90" OR CUDA_VERSION MATCHES "91")
else()
message(WARNING
"CUDA version ${CUDA_VERSION_MAJOR}.${CUDA_VERSION_MINOR} detected, "
- "build may succeed but only CUDA 8.0 is officially supported")
+ "build may succeed but only CUDA 9.0 and 9.1 are officially supported")
endif()
# build for each arch
diff --git a/intern/cycles/kernel/bvh/bvh.h b/intern/cycles/kernel/bvh/bvh.h
index 2ad55d041bf..72bba8d968f 100644
--- a/intern/cycles/kernel/bvh/bvh.h
+++ b/intern/cycles/kernel/bvh/bvh.h
@@ -25,6 +25,10 @@
* the code has been extended and modified to support more primitives and work
* with CPU/CUDA/OpenCL. */
+#ifdef __EMBREE__
+# include "kernel/bvh/bvh_embree.h"
+#endif
+
CCL_NAMESPACE_BEGIN
#include "kernel/bvh/bvh_types.h"
@@ -32,9 +36,9 @@ CCL_NAMESPACE_BEGIN
/* Common QBVH functions. */
#ifdef __QBVH__
# include "kernel/bvh/qbvh_nodes.h"
-#ifdef __KERNEL_AVX2__
-# include "kernel/bvh/obvh_nodes.h"
-#endif
+# ifdef __KERNEL_AVX2__
+# include "kernel/bvh/obvh_nodes.h"
+# endif
#endif
/* Regular BVH traversal */
@@ -160,6 +164,19 @@ CCL_NAMESPACE_BEGIN
#undef BVH_NAME_EVAL
#undef BVH_FUNCTION_FULL_NAME
+ccl_device_inline bool scene_intersect_valid(const Ray *ray)
+{
+ /* NOTE: Due to some vectorization code non-finite origin point might
+ * cause lots of false-positive intersections which will overflow traversal
+ * stack.
+ * This code is a quick way to perform early output, to avoid crashes in
+ * such cases.
+ * From production scenes so far it seems it's enough to test first element
+ * only.
+ */
+ return isfinite(ray->P.x);
+}
+
/* Note: ray is passed by value to work around a possible CUDA compiler bug. */
ccl_device_intersect bool scene_intersect(KernelGlobals *kg,
const Ray ray,
@@ -169,39 +186,57 @@ ccl_device_intersect bool scene_intersect(KernelGlobals *kg,
float difl,
float extmax)
{
+ if (!scene_intersect_valid(&ray)) {
+ return false;
+ }
+#ifdef __EMBREE__
+ if(kernel_data.bvh.scene) {
+ isect->t = ray.t;
+ CCLIntersectContext ctx(kg, CCLIntersectContext::RAY_REGULAR);
+ IntersectContext rtc_ctx(&ctx);
+ RTCRayHit ray_hit;
+ kernel_embree_setup_rayhit(ray, ray_hit, visibility);
+ rtcIntersect1(kernel_data.bvh.scene, &rtc_ctx.context, &ray_hit);
+ if(ray_hit.hit.geomID != RTC_INVALID_GEOMETRY_ID && ray_hit.hit.primID != RTC_INVALID_GEOMETRY_ID) {
+ kernel_embree_convert_hit(kg, &ray_hit.ray, &ray_hit.hit, isect);
+ return true;
+ }
+ return false;
+ }
+#endif /* __EMBREE__ */
#ifdef __OBJECT_MOTION__
if(kernel_data.bvh.have_motion) {
# ifdef __HAIR__
if(kernel_data.bvh.have_curves)
return bvh_intersect_hair_motion(kg, &ray, isect, visibility, lcg_state, difl, extmax);
-# endif /* __HAIR__ */
+# endif /* __HAIR__ */
return bvh_intersect_motion(kg, &ray, isect, visibility);
}
-#endif /* __OBJECT_MOTION__ */
+#endif /* __OBJECT_MOTION__ */
#ifdef __HAIR__
if(kernel_data.bvh.have_curves)
return bvh_intersect_hair(kg, &ray, isect, visibility, lcg_state, difl, extmax);
-#endif /* __HAIR__ */
+#endif /* __HAIR__ */
#ifdef __KERNEL_CPU__
# ifdef __INSTANCING__
if(kernel_data.bvh.have_instancing)
return bvh_intersect_instancing(kg, &ray, isect, visibility);
-# endif /* __INSTANCING__ */
+# endif /* __INSTANCING__ */
return bvh_intersect(kg, &ray, isect, visibility);
-#else /* __KERNEL_CPU__ */
+#else /* __KERNEL_CPU__ */
# ifdef __INSTANCING__
return bvh_intersect_instancing(kg, &ray, isect, visibility);
# else
return bvh_intersect(kg, &ray, isect, visibility);
-# endif /* __INSTANCING__ */
+# endif /* __INSTANCING__ */
-#endif /* __KERNEL_CPU__ */
+#endif /* __KERNEL_CPU__ */
}
#ifdef __BVH_LOCAL__
@@ -213,6 +248,58 @@ ccl_device_intersect bool scene_intersect_local(KernelGlobals *kg,
uint *lcg_state,
int max_hits)
{
+ if (!scene_intersect_valid(&ray)) {
+ return false;
+ }
+#ifdef __EMBREE__
+ if(kernel_data.bvh.scene) {
+ CCLIntersectContext ctx(kg, CCLIntersectContext::RAY_SSS);
+ ctx.lcg_state = lcg_state;
+ ctx.max_hits = max_hits;
+ ctx.ss_isect = local_isect;
+ local_isect->num_hits = 0;
+ ctx.sss_object_id = local_object;
+ IntersectContext rtc_ctx(&ctx);
+ RTCRay rtc_ray;
+ kernel_embree_setup_ray(ray, rtc_ray, PATH_RAY_ALL_VISIBILITY);
+
+ /* Get the Embree scene for this intersection. */
+ RTCGeometry geom = rtcGetGeometry(kernel_data.bvh.scene, local_object * 2);
+ if(geom) {
+ float3 P = ray.P;
+ float3 dir = ray.D;
+ float3 idir = ray.D;
+ const int object_flag = kernel_tex_fetch(__object_flag, local_object);
+ if(!(object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
+ Transform ob_itfm;
+ rtc_ray.tfar = bvh_instance_motion_push(kg,
+ local_object,
+ &ray,
+ &P,
+ &dir,
+ &idir,
+ ray.t,
+ &ob_itfm);
+ /* bvh_instance_motion_push() returns the inverse transform but
+ * it's not needed here. */
+ (void) ob_itfm;
+
+ rtc_ray.org_x = P.x;
+ rtc_ray.org_y = P.y;
+ rtc_ray.org_z = P.z;
+ rtc_ray.dir_x = dir.x;
+ rtc_ray.dir_y = dir.y;
+ rtc_ray.dir_z = dir.z;
+ }
+ RTCScene scene = (RTCScene)rtcGetGeometryUserData(geom);
+ if(scene) {
+ rtcOccluded1(scene, &rtc_ctx.context, &rtc_ray);
+ }
+ }
+
+ return local_isect->num_hits > 0;
+ }
+#endif /* __EMBREE__ */
#ifdef __OBJECT_MOTION__
if(kernel_data.bvh.have_motion) {
return bvh_intersect_local_motion(kg,
@@ -222,7 +309,7 @@ ccl_device_intersect bool scene_intersect_local(KernelGlobals *kg,
lcg_state,
max_hits);
}
-#endif /* __OBJECT_MOTION__ */
+#endif /* __OBJECT_MOTION__ */
return bvh_intersect_local(kg,
&ray,
local_isect,
@@ -240,6 +327,27 @@ ccl_device_intersect bool scene_intersect_shadow_all(KernelGlobals *kg,
uint max_hits,
uint *num_hits)
{
+ if (!scene_intersect_valid(ray)) {
+ return false;
+ }
+# ifdef __EMBREE__
+ if(kernel_data.bvh.scene) {
+ CCLIntersectContext ctx(kg, CCLIntersectContext::RAY_SHADOW_ALL);
+ ctx.isect_s = isect;
+ ctx.max_hits = max_hits;
+ ctx.num_hits = 0;
+ IntersectContext rtc_ctx(&ctx);
+ RTCRay rtc_ray;
+ kernel_embree_setup_ray(*ray, rtc_ray, PATH_RAY_SHADOW);
+ rtcOccluded1(kernel_data.bvh.scene, &rtc_ctx.context, &rtc_ray);
+
+ if(ctx.num_hits > max_hits) {
+ return true;
+ }
+ *num_hits = ctx.num_hits;
+ return rtc_ray.tfar == -INFINITY;
+ }
+# endif
# ifdef __OBJECT_MOTION__
if(kernel_data.bvh.have_motion) {
# ifdef __HAIR__
@@ -251,7 +359,7 @@ ccl_device_intersect bool scene_intersect_shadow_all(KernelGlobals *kg,
max_hits,
num_hits);
}
-# endif /* __HAIR__ */
+# endif /* __HAIR__ */
return bvh_intersect_shadow_all_motion(kg,
ray,
@@ -260,7 +368,7 @@ ccl_device_intersect bool scene_intersect_shadow_all(KernelGlobals *kg,
max_hits,
num_hits);
}
-# endif /* __OBJECT_MOTION__ */
+# endif /* __OBJECT_MOTION__ */
# ifdef __HAIR__
if(kernel_data.bvh.have_curves) {
@@ -271,7 +379,7 @@ ccl_device_intersect bool scene_intersect_shadow_all(KernelGlobals *kg,
max_hits,
num_hits);
}
-# endif /* __HAIR__ */
+# endif /* __HAIR__ */
# ifdef __INSTANCING__
if(kernel_data.bvh.have_instancing) {
@@ -282,7 +390,7 @@ ccl_device_intersect bool scene_intersect_shadow_all(KernelGlobals *kg,
max_hits,
num_hits);
}
-# endif /* __INSTANCING__ */
+# endif /* __INSTANCING__ */
return bvh_intersect_shadow_all(kg,
ray,
@@ -299,24 +407,27 @@ ccl_device_intersect bool scene_intersect_volume(KernelGlobals *kg,
Intersection *isect,
const uint visibility)
{
+ if (!scene_intersect_valid(ray)) {
+ return false;
+ }
# ifdef __OBJECT_MOTION__
if(kernel_data.bvh.have_motion) {
return bvh_intersect_volume_motion(kg, ray, isect, visibility);
}
-# endif /* __OBJECT_MOTION__ */
+# endif /* __OBJECT_MOTION__ */
# ifdef __KERNEL_CPU__
# ifdef __INSTANCING__
if(kernel_data.bvh.have_instancing)
return bvh_intersect_volume_instancing(kg, ray, isect, visibility);
-# endif /* __INSTANCING__ */
+# endif /* __INSTANCING__ */
return bvh_intersect_volume(kg, ray, isect, visibility);
-# else /* __KERNEL_CPU__ */
+# else /* __KERNEL_CPU__ */
# ifdef __INSTANCING__
return bvh_intersect_volume_instancing(kg, ray, isect, visibility);
# else
return bvh_intersect_volume(kg, ray, isect, visibility);
-# endif /* __INSTANCING__ */
-# endif /* __KERNEL_CPU__ */
+# endif /* __INSTANCING__ */
+# endif /* __KERNEL_CPU__ */
}
#endif /* __VOLUME__ */
@@ -327,15 +438,31 @@ ccl_device_intersect uint scene_intersect_volume_all(KernelGlobals *kg,
const uint max_hits,
const uint visibility)
{
+ if (!scene_intersect_valid(ray)) {
+ return false;
+ }
+# ifdef __EMBREE__
+ if(kernel_data.bvh.scene) {
+ CCLIntersectContext ctx(kg, CCLIntersectContext::RAY_VOLUME_ALL);
+ ctx.isect_s = isect;
+ ctx.max_hits = max_hits;
+ ctx.num_hits = 0;
+ IntersectContext rtc_ctx(&ctx);
+ RTCRay rtc_ray;
+ kernel_embree_setup_ray(*ray, rtc_ray, visibility);
+ rtcOccluded1(kernel_data.bvh.scene, &rtc_ctx.context, &rtc_ray);
+ return rtc_ray.tfar == -INFINITY;
+ }
+# endif
# ifdef __OBJECT_MOTION__
if(kernel_data.bvh.have_motion) {
return bvh_intersect_volume_all_motion(kg, ray, isect, max_hits, visibility);
}
-# endif /* __OBJECT_MOTION__ */
+# endif /* __OBJECT_MOTION__ */
# ifdef __INSTANCING__
if(kernel_data.bvh.have_instancing)
return bvh_intersect_volume_all_instancing(kg, ray, isect, max_hits, visibility);
-# endif /* __INSTANCING__ */
+# endif /* __INSTANCING__ */
return bvh_intersect_volume_all(kg, ray, isect, max_hits, visibility);
}
#endif /* __VOLUME_RECORD_ALL__ */
diff --git a/intern/cycles/kernel/bvh/bvh_embree.h b/intern/cycles/kernel/bvh/bvh_embree.h
new file mode 100644
index 00000000000..34a099ebb4d
--- /dev/null
+++ b/intern/cycles/kernel/bvh/bvh_embree.h
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2018, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <embree3/rtcore_ray.h>
+#include <embree3/rtcore_scene.h>
+
+#include "kernel/kernel_compat_cpu.h"
+#include "kernel/split/kernel_split_data_types.h"
+#include "kernel/kernel_globals.h"
+#include "util/util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+struct CCLIntersectContext {
+ typedef enum {
+ RAY_REGULAR = 0,
+ RAY_SHADOW_ALL = 1,
+ RAY_SSS = 2,
+ RAY_VOLUME_ALL = 3,
+
+ } RayType;
+
+ KernelGlobals *kg;
+ RayType type;
+
+ /* for shadow rays */
+ Intersection *isect_s;
+ int max_hits;
+ int num_hits;
+
+ /* for SSS Rays: */
+ LocalIntersection *ss_isect;
+ int sss_object_id;
+ uint *lcg_state;
+
+ CCLIntersectContext(KernelGlobals *kg_, RayType type_)
+ {
+ kg = kg_;
+ type = type_;
+ max_hits = 1;
+ num_hits = 0;
+ isect_s = NULL;
+ ss_isect = NULL;
+ sss_object_id = -1;
+ lcg_state = NULL;
+ }
+};
+
+class IntersectContext
+{
+public:
+ IntersectContext(CCLIntersectContext* ctx)
+ {
+ rtcInitIntersectContext(&context);
+ userRayExt = ctx;
+ }
+ RTCIntersectContext context;
+ CCLIntersectContext* userRayExt;
+};
+
+ccl_device_inline void kernel_embree_setup_ray(const Ray& ray, RTCRay& rtc_ray, const uint visibility)
+{
+ rtc_ray.org_x = ray.P.x;
+ rtc_ray.org_y = ray.P.y;
+ rtc_ray.org_z = ray.P.z;
+ rtc_ray.dir_x = ray.D.x;
+ rtc_ray.dir_y = ray.D.y;
+ rtc_ray.dir_z = ray.D.z;
+ rtc_ray.tnear = 0.0f;
+ rtc_ray.tfar = ray.t;
+ rtc_ray.time = ray.time;
+ rtc_ray.mask = visibility;
+}
+
+ccl_device_inline void kernel_embree_setup_rayhit(const Ray& ray, RTCRayHit& rayhit, const uint visibility)
+{
+ kernel_embree_setup_ray(ray, rayhit.ray, visibility);
+ rayhit.hit.geomID = RTC_INVALID_GEOMETRY_ID;
+ rayhit.hit.primID = RTC_INVALID_GEOMETRY_ID;
+}
+
+ccl_device_inline void kernel_embree_convert_hit(KernelGlobals *kg, const RTCRay *ray, const RTCHit *hit, Intersection *isect)
+{
+ bool is_hair = hit->geomID & 1;
+ isect->u = is_hair ? hit->u : 1.0f - hit->v - hit->u;
+ isect->v = is_hair ? hit->v : hit->u;
+ isect->t = ray->tfar;
+ isect->Ng = make_float3(hit->Ng_x, hit->Ng_y, hit->Ng_z);
+ if(hit->instID[0] != RTC_INVALID_GEOMETRY_ID) {
+ RTCScene inst_scene = (RTCScene)rtcGetGeometryUserData(rtcGetGeometry(kernel_data.bvh.scene, hit->instID[0]));
+ isect->prim = hit->primID + (intptr_t)rtcGetGeometryUserData(rtcGetGeometry(inst_scene, hit->geomID)) + kernel_tex_fetch(__object_node, hit->instID[0]/2);
+ isect->object = hit->instID[0]/2;
+ }
+ else {
+ isect->prim = hit->primID + (intptr_t)rtcGetGeometryUserData(rtcGetGeometry(kernel_data.bvh.scene, hit->geomID));
+ isect->object = OBJECT_NONE;
+ }
+ isect->type = kernel_tex_fetch(__prim_type, isect->prim);
+}
+
+ccl_device_inline void kernel_embree_convert_local_hit(KernelGlobals *kg, const RTCRay *ray, const RTCHit *hit, Intersection *isect, int local_object_id)
+{
+ isect->u = 1.0f - hit->v - hit->u;
+ isect->v = hit->u;
+ isect->t = ray->tfar;
+ isect->Ng = make_float3(hit->Ng_x, hit->Ng_y, hit->Ng_z);
+ RTCScene inst_scene = (RTCScene)rtcGetGeometryUserData(rtcGetGeometry(kernel_data.bvh.scene, local_object_id * 2));
+ isect->prim = hit->primID + (intptr_t)rtcGetGeometryUserData(rtcGetGeometry(inst_scene, hit->geomID)) + kernel_tex_fetch(__object_node, local_object_id);
+ isect->object = local_object_id;
+ isect->type = kernel_tex_fetch(__prim_type, isect->prim);
+}
+
+CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/bvh/bvh_local.h b/intern/cycles/kernel/bvh/bvh_local.h
index 8def71bc890..8364bc3aa9a 100644
--- a/intern/cycles/kernel/bvh/bvh_local.h
+++ b/intern/cycles/kernel/bvh/bvh_local.h
@@ -73,10 +73,9 @@ bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
int object = OBJECT_NONE;
float isect_t = ray->t;
- if(local_isect) {
+ if(local_isect != NULL) {
local_isect->num_hits = 0;
}
-
kernel_assert((local_isect == NULL) == (max_hits == 0));
const int object_flag = kernel_tex_fetch(__object_flag, local_object);
@@ -137,7 +136,7 @@ bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
node_addr,
PATH_RAY_ALL_VISIBILITY,
dist);
-#else // __KERNEL_SSE2__
+#else // __KERNEL_SSE2__
traverse_mask = NODE_INTERSECT(kg,
P,
dir,
@@ -152,7 +151,7 @@ bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
node_addr,
PATH_RAY_ALL_VISIBILITY,
dist);
-#endif // __KERNEL_SSE2__
+#endif // __KERNEL_SSE2__
node_addr = __float_as_int(cnodes.z);
node_addr_child1 = __float_as_int(cnodes.w);
diff --git a/intern/cycles/kernel/bvh/bvh_shadow_all.h b/intern/cycles/kernel/bvh/bvh_shadow_all.h
index d525b29fd94..64eb2f3f659 100644
--- a/intern/cycles/kernel/bvh/bvh_shadow_all.h
+++ b/intern/cycles/kernel/bvh/bvh_shadow_all.h
@@ -124,7 +124,7 @@ bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
node_addr,
visibility,
dist);
-#else // __KERNEL_SSE2__
+#else // __KERNEL_SSE2__
traverse_mask = NODE_INTERSECT(kg,
P,
dir,
@@ -139,7 +139,7 @@ bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
node_addr,
visibility,
dist);
-#endif // __KERNEL_SSE2__
+#endif // __KERNEL_SSE2__
node_addr = __float_as_int(cnodes.z);
node_addr_child1 = __float_as_int(cnodes.w);
diff --git a/intern/cycles/kernel/bvh/bvh_traversal.h b/intern/cycles/kernel/bvh/bvh_traversal.h
index e95d2408201..af9f04db0ba 100644
--- a/intern/cycles/kernel/bvh/bvh_traversal.h
+++ b/intern/cycles/kernel/bvh/bvh_traversal.h
@@ -146,7 +146,7 @@ ccl_device_noinline bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
visibility,
dist);
}
-#else // __KERNEL_SSE2__
+#else // __KERNEL_SSE2__
# if BVH_FEATURE(BVH_HAIR_MINIMUM_WIDTH)
if(difl != 0.0f) {
traverse_mask = NODE_INTERSECT_ROBUST(kg,
@@ -184,7 +184,7 @@ ccl_device_noinline bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
visibility,
dist);
}
-#endif // __KERNEL_SSE2__
+#endif // __KERNEL_SSE2__
node_addr = __float_as_int(cnodes.z);
node_addr_child1 = __float_as_int(cnodes.w);
diff --git a/intern/cycles/kernel/bvh/bvh_volume.h b/intern/cycles/kernel/bvh/bvh_volume.h
index 7d03855cb8f..12d4c5eb94a 100644
--- a/intern/cycles/kernel/bvh/bvh_volume.h
+++ b/intern/cycles/kernel/bvh/bvh_volume.h
@@ -120,7 +120,7 @@ bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
node_addr,
visibility,
dist);
-#else // __KERNEL_SSE2__
+#else // __KERNEL_SSE2__
traverse_mask = NODE_INTERSECT(kg,
P,
dir,
@@ -135,7 +135,7 @@ bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
node_addr,
visibility,
dist);
-#endif // __KERNEL_SSE2__
+#endif // __KERNEL_SSE2__
node_addr = __float_as_int(cnodes.z);
node_addr_child1 = __float_as_int(cnodes.w);
diff --git a/intern/cycles/kernel/bvh/bvh_volume_all.h b/intern/cycles/kernel/bvh/bvh_volume_all.h
index 3d9b598914f..6205b9bcf7a 100644
--- a/intern/cycles/kernel/bvh/bvh_volume_all.h
+++ b/intern/cycles/kernel/bvh/bvh_volume_all.h
@@ -124,7 +124,7 @@ uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
node_addr,
visibility,
dist);
-#else // __KERNEL_SSE2__
+#else // __KERNEL_SSE2__
traverse_mask = NODE_INTERSECT(kg,
P,
dir,
@@ -139,7 +139,7 @@ uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
node_addr,
visibility,
dist);
-#endif // __KERNEL_SSE2__
+#endif // __KERNEL_SSE2__
node_addr = __float_as_int(cnodes.z);
node_addr_child1 = __float_as_int(cnodes.w);
diff --git a/intern/cycles/kernel/bvh/obvh_local.h b/intern/cycles/kernel/bvh/obvh_local.h
index 50bcfa79b6c..eb24a607caa 100644
--- a/intern/cycles/kernel/bvh/obvh_local.h
+++ b/intern/cycles/kernel/bvh/obvh_local.h
@@ -50,7 +50,10 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(OBVH)(KernelGlobals *kg,
int object = OBJECT_NONE;
float isect_t = ray->t;
- local_isect->num_hits = 0;
+ if(local_isect != NULL) {
+ local_isect->num_hits = 0;
+ }
+ kernel_assert((local_isect == NULL) == (max_hits == 0));
const int object_flag = kernel_tex_fetch(__object_flag, local_object);
if(!(object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
@@ -70,12 +73,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(OBVH)(KernelGlobals *kg,
object = local_object;
}
-#ifndef __KERNEL_SSE41__
- if(!isfinite(P.x)) {
- return false;
- }
-#endif
-
avxf tnear(0.0f), tfar(isect_t);
#if BVH_FEATURE(BVH_HAIR)
avx3f dir4(avxf(dir.x), avxf(dir.y), avxf(dir.z));
diff --git a/intern/cycles/kernel/bvh/obvh_shadow_all.h b/intern/cycles/kernel/bvh/obvh_shadow_all.h
index 3e877065127..8b739b3438a 100644
--- a/intern/cycles/kernel/bvh/obvh_shadow_all.h
+++ b/intern/cycles/kernel/bvh/obvh_shadow_all.h
@@ -66,12 +66,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(OBVH)(KernelGlobals *kg,
*num_hits = 0;
isect_array->t = tmax;
-#ifndef __KERNEL_SSE41__
- if(!isfinite(P.x)) {
- return false;
- }
-#endif
-
#if BVH_FEATURE(BVH_INSTANCING)
int num_hits_in_instance = 0;
#endif
@@ -103,7 +97,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(OBVH)(KernelGlobals *kg,
/* Traverse internal nodes. */
while(node_addr >= 0 && node_addr != ENTRYPOINT_SENTINEL) {
float4 inodes = kernel_tex_fetch(__bvh_nodes, node_addr+0);
- (void)inodes;
+ (void) inodes;
if(false
#ifdef __VISIBILITY_FLAG__
diff --git a/intern/cycles/kernel/bvh/obvh_traversal.h b/intern/cycles/kernel/bvh/obvh_traversal.h
index 2021d8e1143..6bb19eb1ed9 100644
--- a/intern/cycles/kernel/bvh/obvh_traversal.h
+++ b/intern/cycles/kernel/bvh/obvh_traversal.h
@@ -64,12 +64,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(OBVH)(KernelGlobals *kg,
Transform ob_itfm;
#endif
-#ifndef __KERNEL_SSE41__
- if(!isfinite(P.x)) {
- return false;
- }
-#endif
-
isect->t = ray->t;
isect->u = 0.0f;
isect->v = 0.0f;
@@ -103,7 +97,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(OBVH)(KernelGlobals *kg,
/* Traverse internal nodes. */
while(node_addr >= 0 && node_addr != ENTRYPOINT_SENTINEL) {
float4 inodes = kernel_tex_fetch(__bvh_nodes, node_addr+0);
- (void)inodes;
+ (void) inodes;
if(UNLIKELY(node_dist > isect->t)
#if BVH_FEATURE(BVH_MOTION)
@@ -179,7 +173,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(OBVH)(KernelGlobals *kg,
avxf cnodes;
/* TODO(sergey): Investigate whether moving cnodes upwards
* gives a speedup (will be different cache pattern but will
- * avoid extra check here),
+ * avoid extra check here).
*/
#if BVH_FEATURE(BVH_HAIR)
if(__float_as_uint(inodes.x) & PATH_RAY_NODE_UNALIGNED) {
diff --git a/intern/cycles/kernel/bvh/obvh_volume.h b/intern/cycles/kernel/bvh/obvh_volume.h
index da9ddbd4f24..80d09c59039 100644
--- a/intern/cycles/kernel/bvh/obvh_volume.h
+++ b/intern/cycles/kernel/bvh/obvh_volume.h
@@ -52,12 +52,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(OBVH)(KernelGlobals *kg,
Transform ob_itfm;
#endif
-#ifndef __KERNEL_SSE41__
- if(!isfinite(P.x)) {
- return false;
- }
-#endif
-
isect->t = ray->t;
isect->u = 0.0f;
isect->v = 0.0f;
diff --git a/intern/cycles/kernel/bvh/obvh_volume_all.h b/intern/cycles/kernel/bvh/obvh_volume_all.h
index a88573e6f86..87216127ddb 100644
--- a/intern/cycles/kernel/bvh/obvh_volume_all.h
+++ b/intern/cycles/kernel/bvh/obvh_volume_all.h
@@ -58,12 +58,6 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(OBVH)(KernelGlobals *kg,
uint num_hits = 0;
isect_array->t = tmax;
-#ifndef __KERNEL_SSE41__
- if(!isfinite(P.x)) {
- return 0;
- }
-#endif
-
#if BVH_FEATURE(BVH_INSTANCING)
int num_hits_in_instance = 0;
#endif
diff --git a/intern/cycles/kernel/bvh/qbvh_local.h b/intern/cycles/kernel/bvh/qbvh_local.h
index 0dc0575556c..22d434a8737 100644
--- a/intern/cycles/kernel/bvh/qbvh_local.h
+++ b/intern/cycles/kernel/bvh/qbvh_local.h
@@ -59,10 +59,9 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
int object = OBJECT_NONE;
float isect_t = ray->t;
- if(local_isect) {
+ if(local_isect != NULL) {
local_isect->num_hits = 0;
}
-
kernel_assert((local_isect == NULL) == (max_hits == 0));
const int object_flag = kernel_tex_fetch(__object_flag, local_object);
@@ -83,12 +82,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
object = local_object;
}
-#ifndef __KERNEL_SSE41__
- if(!isfinite(P.x)) {
- return false;
- }
-#endif
-
ssef tnear(0.0f), tfar(isect_t);
#if BVH_FEATURE(BVH_HAIR)
sse3f dir4(ssef(dir.x), ssef(dir.y), ssef(dir.z));
diff --git a/intern/cycles/kernel/bvh/qbvh_shadow_all.h b/intern/cycles/kernel/bvh/qbvh_shadow_all.h
index 46fd178aed6..37606e10b92 100644
--- a/intern/cycles/kernel/bvh/qbvh_shadow_all.h
+++ b/intern/cycles/kernel/bvh/qbvh_shadow_all.h
@@ -66,11 +66,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
*num_hits = 0;
isect_array->t = tmax;
-#ifndef __KERNEL_SSE41__
- if(!isfinite(P.x)) {
- return false;
- }
-#endif
#if BVH_FEATURE(BVH_INSTANCING)
int num_hits_in_instance = 0;
@@ -103,7 +98,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
/* Traverse internal nodes. */
while(node_addr >= 0 && node_addr != ENTRYPOINT_SENTINEL) {
float4 inodes = kernel_tex_fetch(__bvh_nodes, node_addr+0);
- (void)inodes;
+ (void) inodes;
if(false
#ifdef __VISIBILITY_FLAG__
diff --git a/intern/cycles/kernel/bvh/qbvh_traversal.h b/intern/cycles/kernel/bvh/qbvh_traversal.h
index 335a4afd47a..35c6e3aeec9 100644
--- a/intern/cycles/kernel/bvh/qbvh_traversal.h
+++ b/intern/cycles/kernel/bvh/qbvh_traversal.h
@@ -71,12 +71,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
Transform ob_itfm;
#endif
-#ifndef __KERNEL_SSE41__
- if(!isfinite(P.x)) {
- return false;
- }
-#endif
-
isect->t = ray->t;
isect->u = 0.0f;
isect->v = 0.0f;
@@ -112,7 +106,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
/* Traverse internal nodes. */
while(node_addr >= 0 && node_addr != ENTRYPOINT_SENTINEL) {
float4 inodes = kernel_tex_fetch(__bvh_nodes, node_addr+0);
- (void)inodes;
+ (void) inodes;
if(UNLIKELY(node_dist > isect->t)
#if BVH_FEATURE(BVH_MOTION)
@@ -188,7 +182,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
float4 cnodes;
/* TODO(sergey): Investigate whether moving cnodes upwards
* gives a speedup (will be different cache pattern but will
- * avoid extra check here),
+ * avoid extra check here).
*/
#if BVH_FEATURE(BVH_HAIR)
if(__float_as_uint(inodes.x) & PATH_RAY_NODE_UNALIGNED) {
diff --git a/intern/cycles/kernel/bvh/qbvh_volume.h b/intern/cycles/kernel/bvh/qbvh_volume.h
index 192ce009524..7ec264e5f78 100644
--- a/intern/cycles/kernel/bvh/qbvh_volume.h
+++ b/intern/cycles/kernel/bvh/qbvh_volume.h
@@ -58,12 +58,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
Transform ob_itfm;
#endif
-#ifndef __KERNEL_SSE41__
- if(!isfinite(P.x)) {
- return false;
- }
-#endif
-
isect->t = ray->t;
isect->u = 0.0f;
isect->v = 0.0f;
diff --git a/intern/cycles/kernel/bvh/qbvh_volume_all.h b/intern/cycles/kernel/bvh/qbvh_volume_all.h
index 1e454e4d36b..dd603d79334 100644
--- a/intern/cycles/kernel/bvh/qbvh_volume_all.h
+++ b/intern/cycles/kernel/bvh/qbvh_volume_all.h
@@ -64,12 +64,6 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
uint num_hits = 0;
isect_array->t = tmax;
-#ifndef __KERNEL_SSE41__
- if(!isfinite(P.x)) {
- return 0;
- }
-#endif
-
#if BVH_FEATURE(BVH_INSTANCING)
int num_hits_in_instance = 0;
#endif
diff --git a/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h b/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
index ff238b7a834..4e7425bd800 100644
--- a/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
+++ b/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
@@ -232,4 +232,4 @@ ccl_device int bsdf_ashikhmin_shirley_sample(const ShaderClosure *sc, float3 Ng,
CCL_NAMESPACE_END
-#endif /* __BSDF_ASHIKHMIN_SHIRLEY_H__ */
+#endif /* __BSDF_ASHIKHMIN_SHIRLEY_H__ */
diff --git a/intern/cycles/kernel/closure/bsdf_ashikhmin_velvet.h b/intern/cycles/kernel/closure/bsdf_ashikhmin_velvet.h
index b0bdea723b9..80fd9ba2b37 100644
--- a/intern/cycles/kernel/closure/bsdf_ashikhmin_velvet.h
+++ b/intern/cycles/kernel/closure/bsdf_ashikhmin_velvet.h
@@ -158,4 +158,4 @@ ccl_device int bsdf_ashikhmin_velvet_sample(const ShaderClosure *sc, float3 Ng,
CCL_NAMESPACE_END
-#endif /* __BSDF_ASHIKHMIN_VELVET_H__ */
+#endif /* __BSDF_ASHIKHMIN_VELVET_H__ */
diff --git a/intern/cycles/kernel/closure/bsdf_diffuse.h b/intern/cycles/kernel/closure/bsdf_diffuse.h
index ee6d4cdf2df..946c460a70e 100644
--- a/intern/cycles/kernel/closure/bsdf_diffuse.h
+++ b/intern/cycles/kernel/closure/bsdf_diffuse.h
@@ -139,4 +139,4 @@ ccl_device int bsdf_translucent_sample(const ShaderClosure *sc, float3 Ng, float
CCL_NAMESPACE_END
-#endif /* __BSDF_DIFFUSE_H__ */
+#endif /* __BSDF_DIFFUSE_H__ */
diff --git a/intern/cycles/kernel/closure/bsdf_diffuse_ramp.h b/intern/cycles/kernel/closure/bsdf_diffuse_ramp.h
index 35bb2fdf0e8..ca33a5b275c 100644
--- a/intern/cycles/kernel/closure/bsdf_diffuse_ramp.h
+++ b/intern/cycles/kernel/closure/bsdf_diffuse_ramp.h
@@ -103,8 +103,8 @@ ccl_device int bsdf_diffuse_ramp_sample(const ShaderClosure *sc, float3 Ng, floa
return LABEL_REFLECT|LABEL_DIFFUSE;
}
-#endif /* __OSL__ */
+#endif /* __OSL__ */
CCL_NAMESPACE_END
-#endif /* __BSDF_DIFFUSE_RAMP_H__ */
+#endif /* __BSDF_DIFFUSE_RAMP_H__ */
diff --git a/intern/cycles/kernel/closure/bsdf_hair.h b/intern/cycles/kernel/closure/bsdf_hair.h
index 7b44a23f05b..e1a0cfaa3f5 100644
--- a/intern/cycles/kernel/closure/bsdf_hair.h
+++ b/intern/cycles/kernel/closure/bsdf_hair.h
@@ -277,4 +277,4 @@ ccl_device int bsdf_hair_transmission_sample(const ShaderClosure *sc, float3 Ng,
CCL_NAMESPACE_END
-#endif /* __BSDF_HAIR_H__ */
+#endif /* __BSDF_HAIR_H__ */
diff --git a/intern/cycles/kernel/closure/bsdf_hair_principled.h b/intern/cycles/kernel/closure/bsdf_hair_principled.h
index b3b56be39ff..68335ee887a 100644
--- a/intern/cycles/kernel/closure/bsdf_hair_principled.h
+++ b/intern/cycles/kernel/closure/bsdf_hair_principled.h
@@ -229,7 +229,7 @@ ccl_device int bsdf_principled_hair_setup(ShaderData *sd, PrincipledHairBSDF *bs
return SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_NEEDS_LCG;
}
-#endif /* __HAIR__ */
+#endif /* __HAIR__ */
/* Given the Fresnel term and transmittance, generate the attenuation terms for each bounce. */
ccl_device_inline void hair_attenuation(KernelGlobals *kg,
@@ -296,7 +296,7 @@ ccl_device float3 bsdf_principled_hair_eval(KernelGlobals *kg,
float3 Y = float4_to_float3(bsdf->extra->geom);
float3 X = safe_normalize(sd->dPdu);
- kernel_assert(fabsf(dot(X, Y)) < 1e-4f);
+ kernel_assert(fabsf(dot(X, Y)) < 1e-3f);
float3 Z = safe_normalize(cross(X, Y));
float3 wo = make_float3(dot(sd->I, X), dot(sd->I, Y), dot(sd->I, Z));
@@ -378,7 +378,7 @@ ccl_device int bsdf_principled_hair_sample(KernelGlobals *kg,
float3 Y = float4_to_float3(bsdf->extra->geom);
float3 X = safe_normalize(sd->dPdu);
- kernel_assert(fabsf(dot(X, Y)) < 1e-4f);
+ kernel_assert(fabsf(dot(X, Y)) < 1e-3f);
float3 Z = safe_normalize(cross(X, Y));
float3 wo = make_float3(dot(sd->I, X), dot(sd->I, Y), dot(sd->I, Z));
@@ -499,4 +499,4 @@ ccl_device void bsdf_principled_hair_blur(ShaderClosure *sc, float roughness)
CCL_NAMESPACE_END
-#endif /* __BSDF_HAIR_PRINCIPLED_H__ */
+#endif /* __BSDF_HAIR_PRINCIPLED_H__ */
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h
index e74d5ebaa42..32b6e50b09a 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -1124,4 +1124,4 @@ ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals *kg, const ShaderCl
CCL_NAMESPACE_END
-#endif /* __BSDF_MICROFACET_H__ */
+#endif /* __BSDF_MICROFACET_H__ */
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h b/intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h
index e73915dbda7..5d300ef6db5 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h
@@ -76,7 +76,7 @@ ccl_device_forceinline float3 MF_FUNCTION_FULL_NAME(mf_eval)(
eval *= -lambda_r / (shadowing_lambda - lambda_r);
else
eval *= -lambda_r * beta(-lambda_r, shadowing_lambda+1.0f);
-#else /* MF_MULTI_GLOSSY */
+#else /* MF_MULTI_GLOSSY */
const float G2 = 1.0f / (1.0f - (lambda_r + 1.0f) + shadowing_lambda);
float val = G2 * 0.25f / wi.z;
if(alpha.x == alpha.y)
@@ -129,7 +129,7 @@ ccl_device_forceinline float3 MF_FUNCTION_FULL_NAME(mf_eval)(
phase = mf_eval_phase_glass(wr, lambda_r, wo, wo_outside, alpha, eta);
else
phase = mf_eval_phase_glass(wr, lambda_r, -wo, !wo_outside, alpha, 1.0f/eta);
-#else /* MF_MULTI_GLOSSY */
+#else /* MF_MULTI_GLOSSY */
phase = mf_eval_phase_glossy(wr, lambda_r, wo, alpha) * throughput;
#endif
eval += throughput * phase * mf_G1(wo_outside? wo: -wo, mf_C1((outside == wo_outside)? hr: -hr), shadowing_lambda);
@@ -153,7 +153,7 @@ ccl_device_forceinline float3 MF_FUNCTION_FULL_NAME(mf_eval)(
else if(use_fresnel && order > 0) {
throughput *= interpolate_fresnel_color(wi_prev, wm, eta, F0, cspec0);
}
-#else /* MF_MULTI_GLOSSY */
+#else /* MF_MULTI_GLOSSY */
if(use_fresnel && order > 0) {
throughput *= interpolate_fresnel_color(-wr, wm, eta, F0, cspec0);
}
@@ -248,7 +248,7 @@ ccl_device_forceinline float3 MF_FUNCTION_FULL_NAME(mf_sample)(
throughput *= t_color;
}
}
-#else /* MF_MULTI_GLOSSY */
+#else /* MF_MULTI_GLOSSY */
if(use_fresnel) {
float3 t_color = interpolate_fresnel_color(-wr, wm, eta, F0, cspec0);
diff --git a/intern/cycles/kernel/closure/bsdf_oren_nayar.h b/intern/cycles/kernel/closure/bsdf_oren_nayar.h
index 6b770fc0c16..3446d1609d9 100644
--- a/intern/cycles/kernel/closure/bsdf_oren_nayar.h
+++ b/intern/cycles/kernel/closure/bsdf_oren_nayar.h
@@ -108,4 +108,4 @@ ccl_device int bsdf_oren_nayar_sample(const ShaderClosure *sc, float3 Ng, float3
CCL_NAMESPACE_END
-#endif /* __BSDF_OREN_NAYAR_H__ */
+#endif /* __BSDF_OREN_NAYAR_H__ */
diff --git a/intern/cycles/kernel/closure/bsdf_phong_ramp.h b/intern/cycles/kernel/closure/bsdf_phong_ramp.h
index 91c7803346d..83da05ac435 100644
--- a/intern/cycles/kernel/closure/bsdf_phong_ramp.h
+++ b/intern/cycles/kernel/closure/bsdf_phong_ramp.h
@@ -135,8 +135,8 @@ ccl_device int bsdf_phong_ramp_sample(const ShaderClosure *sc, float3 Ng, float3
return LABEL_REFLECT|LABEL_GLOSSY;
}
-#endif /* __OSL__ */
+#endif /* __OSL__ */
CCL_NAMESPACE_END
-#endif /* __BSDF_PHONG_RAMP_H__ */
+#endif /* __BSDF_PHONG_RAMP_H__ */
diff --git a/intern/cycles/kernel/closure/bsdf_principled_diffuse.h b/intern/cycles/kernel/closure/bsdf_principled_diffuse.h
index 83be2b35a00..2f65fd54be2 100644
--- a/intern/cycles/kernel/closure/bsdf_principled_diffuse.h
+++ b/intern/cycles/kernel/closure/bsdf_principled_diffuse.h
@@ -122,4 +122,4 @@ ccl_device int bsdf_principled_diffuse_sample(const ShaderClosure *sc,
CCL_NAMESPACE_END
-#endif /* __BSDF_PRINCIPLED_DIFFUSE_H__ */
+#endif /* __BSDF_PRINCIPLED_DIFFUSE_H__ */
diff --git a/intern/cycles/kernel/closure/bsdf_principled_sheen.h b/intern/cycles/kernel/closure/bsdf_principled_sheen.h
index 8b7c4399516..ccdcb1babd2 100644
--- a/intern/cycles/kernel/closure/bsdf_principled_sheen.h
+++ b/intern/cycles/kernel/closure/bsdf_principled_sheen.h
@@ -108,4 +108,4 @@ ccl_device int bsdf_principled_sheen_sample(const ShaderClosure *sc,
CCL_NAMESPACE_END
-#endif /* __BSDF_PRINCIPLED_SHEEN_H__ */
+#endif /* __BSDF_PRINCIPLED_SHEEN_H__ */
diff --git a/intern/cycles/kernel/closure/bsdf_reflection.h b/intern/cycles/kernel/closure/bsdf_reflection.h
index b33b6e3597b..94f1c283af7 100644
--- a/intern/cycles/kernel/closure/bsdf_reflection.h
+++ b/intern/cycles/kernel/closure/bsdf_reflection.h
@@ -77,4 +77,4 @@ ccl_device int bsdf_reflection_sample(const ShaderClosure *sc, float3 Ng, float3
CCL_NAMESPACE_END
-#endif /* __BSDF_REFLECTION_H__ */
+#endif /* __BSDF_REFLECTION_H__ */
diff --git a/intern/cycles/kernel/closure/bsdf_refraction.h b/intern/cycles/kernel/closure/bsdf_refraction.h
index b181650e928..abdd01c7a1d 100644
--- a/intern/cycles/kernel/closure/bsdf_refraction.h
+++ b/intern/cycles/kernel/closure/bsdf_refraction.h
@@ -86,4 +86,4 @@ ccl_device int bsdf_refraction_sample(const ShaderClosure *sc, float3 Ng, float3
CCL_NAMESPACE_END
-#endif /* __BSDF_REFRACTION_H__ */
+#endif /* __BSDF_REFRACTION_H__ */
diff --git a/intern/cycles/kernel/closure/bsdf_toon.h b/intern/cycles/kernel/closure/bsdf_toon.h
index 6d8074b7130..097a56f22eb 100644
--- a/intern/cycles/kernel/closure/bsdf_toon.h
+++ b/intern/cycles/kernel/closure/bsdf_toon.h
@@ -215,4 +215,4 @@ ccl_device int bsdf_glossy_toon_sample(const ShaderClosure *sc, float3 Ng, float
CCL_NAMESPACE_END
-#endif /* __BSDF_TOON_H__ */
+#endif /* __BSDF_TOON_H__ */
diff --git a/intern/cycles/kernel/closure/bsdf_transparent.h b/intern/cycles/kernel/closure/bsdf_transparent.h
index f788dbcd0ff..060dff69f52 100644
--- a/intern/cycles/kernel/closure/bsdf_transparent.h
+++ b/intern/cycles/kernel/closure/bsdf_transparent.h
@@ -106,4 +106,4 @@ ccl_device int bsdf_transparent_sample(const ShaderClosure *sc, float3 Ng, float
CCL_NAMESPACE_END
-#endif /* __BSDF_TRANSPARENT_H__ */
+#endif /* __BSDF_TRANSPARENT_H__ */
diff --git a/intern/cycles/kernel/closure/bsdf_util.h b/intern/cycles/kernel/closure/bsdf_util.h
index b080e025d16..4f3453675c7 100644
--- a/intern/cycles/kernel/closure/bsdf_util.h
+++ b/intern/cycles/kernel/closure/bsdf_util.h
@@ -158,4 +158,4 @@ ccl_device_forceinline float3 interpolate_fresnel_color(float3 L, float3 H, floa
CCL_NAMESPACE_END
-#endif /* __BSDF_UTIL_H__ */
+#endif /* __BSDF_UTIL_H__ */
diff --git a/intern/cycles/kernel/closure/bssrdf.h b/intern/cycles/kernel/closure/bssrdf.h
index ba0c6ae8c61..98c7f23c288 100644
--- a/intern/cycles/kernel/closure/bssrdf.h
+++ b/intern/cycles/kernel/closure/bssrdf.h
@@ -499,4 +499,4 @@ ccl_device_forceinline float bssrdf_pdf(const ShaderClosure *sc, float r)
CCL_NAMESPACE_END
-#endif /* __KERNEL_BSSRDF_H__ */
+#endif /* __KERNEL_BSSRDF_H__ */
diff --git a/intern/cycles/kernel/filter/filter.h b/intern/cycles/kernel/filter/filter.h
index f6e474d6702..4209d69ee73 100644
--- a/intern/cycles/kernel/filter/filter.h
+++ b/intern/cycles/kernel/filter/filter.h
@@ -49,4 +49,4 @@ CCL_NAMESPACE_BEGIN
CCL_NAMESPACE_END
-#endif /* __FILTER_H__ */
+#endif /* __FILTER_H__ */
diff --git a/intern/cycles/kernel/filter/filter_defines.h b/intern/cycles/kernel/filter/filter_defines.h
index 1a2f22a6987..67f4e62ac0f 100644
--- a/intern/cycles/kernel/filter/filter_defines.h
+++ b/intern/cycles/kernel/filter/filter_defines.h
@@ -68,4 +68,4 @@ typedef struct TileInfo {
# define ccl_get_tile_buffer(id) (tile_info->buffers[id])
#endif
-#endif /* __FILTER_DEFINES_H__*/
+#endif /* __FILTER_DEFINES_H__*/
diff --git a/intern/cycles/kernel/filter/filter_nlm_cpu.h b/intern/cycles/kernel/filter/filter_nlm_cpu.h
index e2da0fd872b..af73c0dadf2 100644
--- a/intern/cycles/kernel/filter/filter_nlm_cpu.h
+++ b/intern/cycles/kernel/filter/filter_nlm_cpu.h
@@ -16,6 +16,9 @@
CCL_NAMESPACE_BEGIN
+#define load4_a(buf, ofs) (*((float4*) ((buf) + (ofs))))
+#define load4_u(buf, ofs) load_float4((buf)+(ofs))
+
ccl_device_inline void kernel_filter_nlm_calc_difference(int dx, int dy,
const float *ccl_restrict weight_image,
const float *ccl_restrict variance_image,
@@ -26,20 +29,28 @@ ccl_device_inline void kernel_filter_nlm_calc_difference(int dx, int dy,
float a,
float k_2)
{
+ /* Strides need to be aligned to 16 bytes. */
+ kernel_assert((stride % 4) == 0 && (channel_offset % 4) == 0);
+
+ int aligned_lowx = rect.x & (~3);
+ const int numChannels = (channel_offset > 0)? 3 : 1;
+ const float4 channel_fac = make_float4(1.0f / numChannels);
+
for(int y = rect.y; y < rect.w; y++) {
- for(int x = rect.x; x < rect.z; x++) {
- float diff = 0.0f;
- int numChannels = channel_offset? 3 : 1;
- for(int c = 0; c < numChannels; c++) {
- float cdiff = weight_image[c*channel_offset + y*stride + x] - weight_image[c*channel_offset + (y+dy)*stride + (x+dx)];
- float pvar = variance_image[c*channel_offset + y*stride + x];
- float qvar = variance_image[c*channel_offset + (y+dy)*stride + (x+dx)];
- diff += (cdiff*cdiff - a*(pvar + min(pvar, qvar))) / (1e-8f + k_2*(pvar+qvar));
- }
- if(numChannels > 1) {
- diff *= 1.0f/numChannels;
+ int idx_p = y*stride + aligned_lowx;
+ int idx_q = (y+dy)*stride + aligned_lowx + dx;
+ for(int x = aligned_lowx; x < rect.z; x += 4, idx_p += 4, idx_q += 4) {
+ float4 diff = make_float4(0.0f);
+ for(int c = 0, chan_ofs = 0; c < numChannels; c++, chan_ofs += channel_offset) {
+ /* idx_p is guaranteed to be aligned, but idx_q isn't. */
+ float4 color_p = load4_a(weight_image, idx_p + chan_ofs);
+ float4 color_q = load4_u(weight_image, idx_q + chan_ofs);
+ float4 cdiff = color_p - color_q;
+ float4 var_p = load4_a(variance_image, idx_p + chan_ofs);
+ float4 var_q = load4_u(variance_image, idx_q + chan_ofs);
+ diff += (cdiff*cdiff - a*(var_p + min(var_p, var_q))) / (make_float4(1e-8f) + k_2*(var_p+var_q));
}
- difference_image[y*stride + x] = diff;
+ load4_a(difference_image, idx_p) = diff*channel_fac;
}
}
}
@@ -50,52 +61,77 @@ ccl_device_inline void kernel_filter_nlm_blur(const float *ccl_restrict differen
int stride,
int f)
{
- int aligned_lowx = rect.x / 4;
- int aligned_highx = (rect.z + 3) / 4;
+ int aligned_lowx = round_down(rect.x, 4);
for(int y = rect.y; y < rect.w; y++) {
const int low = max(rect.y, y-f);
const int high = min(rect.w, y+f+1);
- for(int x = rect.x; x < rect.z; x++) {
- out_image[y*stride + x] = 0.0f;
+ for(int x = aligned_lowx; x < rect.z; x += 4) {
+ load4_a(out_image, y*stride + x) = make_float4(0.0f);
}
for(int y1 = low; y1 < high; y1++) {
- float4* out_image4 = (float4*)(out_image + y*stride);
- float4* difference_image4 = (float4*)(difference_image + y1*stride);
- for(int x = aligned_lowx; x < aligned_highx; x++) {
- out_image4[x] += difference_image4[x];
+ for(int x = aligned_lowx; x < rect.z; x += 4) {
+ load4_a(out_image, y*stride + x) += load4_a(difference_image, y1*stride + x);
}
}
- for(int x = rect.x; x < rect.z; x++) {
- out_image[y*stride + x] *= 1.0f/(high - low);
+ float fac = 1.0f/(high - low);
+ for(int x = aligned_lowx; x < rect.z; x += 4) {
+ load4_a(out_image, y*stride + x) *= fac;
}
}
}
-ccl_device_inline void kernel_filter_nlm_calc_weight(const float *ccl_restrict difference_image,
- float *out_image,
- int4 rect,
- int stride,
- int f)
+ccl_device_inline void nlm_blur_horizontal(const float *ccl_restrict difference_image,
+ float *out_image,
+ int4 rect,
+ int stride,
+ int f)
{
+ int aligned_lowx = round_down(rect.x, 4);
for(int y = rect.y; y < rect.w; y++) {
- for(int x = rect.x; x < rect.z; x++) {
- out_image[y*stride + x] = 0.0f;
+ for(int x = aligned_lowx; x < rect.z; x += 4) {
+ load4_a(out_image, y*stride + x) = make_float4(0.0f);
}
}
+
for(int dx = -f; dx <= f; dx++) {
- int pos_dx = max(0, dx);
- int neg_dx = min(0, dx);
+ aligned_lowx = round_down(rect.x - min(0, dx), 4);
+ int highx = rect.z - max(0, dx);
+ int4 lowx4 = make_int4(rect.x - min(0, dx));
+ int4 highx4 = make_int4(rect.z - max(0, dx));
for(int y = rect.y; y < rect.w; y++) {
- for(int x = rect.x-neg_dx; x < rect.z-pos_dx; x++) {
- out_image[y*stride + x] += difference_image[y*stride + x+dx];
+ for(int x = aligned_lowx; x < highx; x += 4) {
+ int4 x4 = make_int4(x) + make_int4(0, 1, 2, 3);
+ int4 active = (x4 >= lowx4) & (x4 < highx4);
+
+ float4 diff = load4_u(difference_image, y*stride + x + dx);
+ load4_a(out_image, y*stride + x) += mask(active, diff);
}
}
}
+
+ aligned_lowx = round_down(rect.x, 4);
for(int y = rect.y; y < rect.w; y++) {
- for(int x = rect.x; x < rect.z; x++) {
- const int low = max(rect.x, x-f);
- const int high = min(rect.z, x+f+1);
- out_image[y*stride + x] = fast_expf(-max(out_image[y*stride + x] * (1.0f/(high - low)), 0.0f));
+ for(int x = aligned_lowx; x < rect.z; x += 4) {
+ float4 x4 = make_float4(x) + make_float4(0.0f, 1.0f, 2.0f, 3.0f);
+ float4 low = max(make_float4(rect.x), x4 - make_float4(f));
+ float4 high = min(make_float4(rect.z), x4 + make_float4(f+1));
+ load4_a(out_image, y*stride + x) *= rcp(high - low);
+ }
+ }
+}
+
+ccl_device_inline void kernel_filter_nlm_calc_weight(const float *ccl_restrict difference_image,
+ float *out_image,
+ int4 rect,
+ int stride,
+ int f)
+{
+ nlm_blur_horizontal(difference_image, out_image, rect, stride, f);
+
+ int aligned_lowx = round_down(rect.x, 4);
+ for(int y = rect.y; y < rect.w; y++) {
+ for(int x = aligned_lowx; x < rect.z; x += 4) {
+ load4_a(out_image, y*stride + x) = fast_expf4(-max(load4_a(out_image, y*stride + x), make_float4(0.0f)));
}
}
}
@@ -103,23 +139,29 @@ ccl_device_inline void kernel_filter_nlm_calc_weight(const float *ccl_restrict d
ccl_device_inline void kernel_filter_nlm_update_output(int dx, int dy,
const float *ccl_restrict difference_image,
const float *ccl_restrict image,
+ float *temp_image,
float *out_image,
float *accum_image,
int4 rect,
int stride,
int f)
{
+ nlm_blur_horizontal(difference_image, temp_image, rect, stride, f);
+
+ int aligned_lowx = round_down(rect.x, 4);
for(int y = rect.y; y < rect.w; y++) {
- for(int x = rect.x; x < rect.z; x++) {
- const int low = max(rect.x, x-f);
- const int high = min(rect.z, x+f+1);
- float sum = 0.0f;
- for(int x1 = low; x1 < high; x1++) {
- sum += difference_image[y*stride + x1];
- }
- float weight = sum * (1.0f/(high - low));
- accum_image[y*stride + x] += weight;
- out_image[y*stride + x] += weight*image[(y+dy)*stride + (x+dx)];
+ for(int x = aligned_lowx; x < rect.z; x += 4) {
+ int4 x4 = make_int4(x) + make_int4(0, 1, 2, 3);
+ int4 active = (x4 >= make_int4(rect.x)) & (x4 < make_int4(rect.z));
+
+ int idx_p = y*stride + x, idx_q = (y+dy)*stride + (x+dx);
+
+ float4 weight = load4_a(temp_image, idx_p);
+ load4_a(accum_image, idx_p) += mask(active, weight);
+
+ float4 val = load4_u(image, idx_q);
+
+ load4_a(out_image, idx_p) += mask(active, weight*val);
}
}
}
@@ -177,4 +219,7 @@ ccl_device_inline void kernel_filter_nlm_normalize(float *out_image,
}
}
+#undef load4_a
+#undef load4_u
+
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/geom/geom_curve_intersect.h b/intern/cycles/kernel/geom/geom_curve_intersect.h
index 4cfbe21685c..b6b58b52a29 100644
--- a/intern/cycles/kernel/geom/geom_curve_intersect.h
+++ b/intern/cycles/kernel/geom/geom_curve_intersect.h
@@ -379,7 +379,7 @@ ccl_device_forceinline bool cardinal_curve_intersect(
float inv_mw_extension = 1.0f/mw_extension;
if(d0 >= 0)
coverage = (min(d1 * inv_mw_extension, 1.0f) - min(d0 * inv_mw_extension, 1.0f)) * 0.5f;
- else // inside
+ else // inside
coverage = (min(d1 * inv_mw_extension, 1.0f) + min(-d0 * inv_mw_extension, 1.0f)) * 0.5f;
}
@@ -817,16 +817,24 @@ ccl_device_inline float3 curve_refine(KernelGlobals *kg,
sd->Ng = normalize(-(D - tg * (dot(tg, D))));
}
else {
- /* direction from inside to surface of curve */
- float3 p_curr = curvepoint(isect->u, p[0], p[1], p[2], p[3]);
- sd->Ng = normalize(P - p_curr);
+#ifdef __EMBREE__
+ if(kernel_data.bvh.scene) {
+ sd->Ng = normalize(isect->Ng);
+ }
+ else
+#endif
+ {
+ /* direction from inside to surface of curve */
+ float3 p_curr = curvepoint(isect->u, p[0], p[1], p[2], p[3]);
+ sd->Ng = normalize(P - p_curr);
- /* adjustment for changing radius */
- float gd = isect->v;
+ /* adjustment for changing radius */
+ float gd = isect->v;
- if(gd != 0.0f) {
- sd->Ng = sd->Ng - gd * tg;
- sd->Ng = normalize(sd->Ng);
+ if(gd != 0.0f) {
+ sd->Ng = sd->Ng - gd * tg;
+ sd->Ng = normalize(sd->Ng);
+ }
}
}
diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h
index cfe17e63627..669c932d720 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -78,6 +78,12 @@ ccl_device_inline Transform object_fetch_transform_motion(KernelGlobals *kg, int
const uint num_steps = kernel_tex_fetch(__objects, object).numsteps * 2 + 1;
Transform tfm;
+#ifdef __EMBREE__
+ if(kernel_data.bvh.scene) {
+ transform_motion_array_interpolate_straight(&tfm, motion, num_steps, time);
+ }
+ else
+#endif
transform_motion_array_interpolate(&tfm, motion, num_steps, time);
return tfm;
@@ -304,6 +310,24 @@ ccl_device int shader_pass_id(KernelGlobals *kg, const ShaderData *sd)
return kernel_tex_fetch(__shaders, (sd->shader & SHADER_MASK)).pass_id;
}
+/* Cryptomatte ID */
+
+ccl_device_inline float object_cryptomatte_id(KernelGlobals *kg, int object)
+{
+ if(object == OBJECT_NONE)
+ return 0.0f;
+
+ return kernel_tex_fetch(__objects, object).cryptomatte_object;
+}
+
+ccl_device_inline float object_cryptomatte_asset_id(KernelGlobals *kg, int object)
+{
+ if(object == OBJECT_NONE)
+ return 0;
+
+ return kernel_tex_fetch(__objects, object).cryptomatte_asset;
+}
+
/* Particle data from which object was instanced */
ccl_device_inline uint particle_index(KernelGlobals *kg, int particle)
diff --git a/intern/cycles/kernel/geom/geom_subd_triangle.h b/intern/cycles/kernel/geom/geom_subd_triangle.h
index 00ce89ae567..8c0d0a9770e 100644
--- a/intern/cycles/kernel/geom/geom_subd_triangle.h
+++ b/intern/cycles/kernel/geom/geom_subd_triangle.h
@@ -146,7 +146,7 @@ ccl_device_noinline float subd_triangle_attribute_float(KernelGlobals *kg, const
return a;
}
else
-#endif /* __PATCH_EVAL__ */
+#endif /* __PATCH_EVAL__ */
if(desc.element == ATTR_ELEMENT_FACE) {
if(dx) *dx = 0.0f;
if(dy) *dy = 0.0f;
@@ -271,7 +271,7 @@ ccl_device_noinline float3 subd_triangle_attribute_float3(KernelGlobals *kg, con
return a;
}
else
-#endif /* __PATCH_EVAL__ */
+#endif /* __PATCH_EVAL__ */
if(desc.element == ATTR_ELEMENT_FACE) {
if(dx) *dx = make_float3(0.0f, 0.0f, 0.0f);
if(dy) *dy = make_float3(0.0f, 0.0f, 0.0f);
diff --git a/intern/cycles/kernel/geom/geom_triangle_intersect.h b/intern/cycles/kernel/geom/geom_triangle_intersect.h
index aa6b102a0f3..6b4fbcbbb7c 100644
--- a/intern/cycles/kernel/geom/geom_triangle_intersect.h
+++ b/intern/cycles/kernel/geom/geom_triangle_intersect.h
@@ -544,7 +544,7 @@ int triangle_intersect8(KernelGlobals *kg,
return result;
}
-#endif /* __KERNEL_AVX2__ */
+#endif /* __KERNEL_AVX2__ */
/* Special ray intersection routines for subsurface scattering. In that case we
* only want to intersect with primitives in the same object, and if case of
diff --git a/intern/cycles/kernel/kernel.h b/intern/cycles/kernel/kernel.h
index 373324afb01..1c8c91d15e6 100644
--- a/intern/cycles/kernel/kernel.h
+++ b/intern/cycles/kernel/kernel.h
@@ -63,4 +63,4 @@ void kernel_tex_copy(KernelGlobals *kg,
CCL_NAMESPACE_END
-#endif /* __KERNEL_H__ */
+#endif /* __KERNEL_H__ */
diff --git a/intern/cycles/kernel/kernel_color.h b/intern/cycles/kernel/kernel_color.h
index 990e798543a..ea478a8a5d3 100644
--- a/intern/cycles/kernel/kernel_color.h
+++ b/intern/cycles/kernel/kernel_color.h
@@ -35,4 +35,4 @@ ccl_device float linear_rgb_to_gray(KernelGlobals *kg, float3 c)
CCL_NAMESPACE_END
-#endif /* __KERNEL_COLOR_H__ */
+#endif /* __KERNEL_COLOR_H__ */
diff --git a/intern/cycles/kernel/kernel_compat_cpu.h b/intern/cycles/kernel/kernel_compat_cpu.h
index aa7a16afa1d..4ee80850402 100644
--- a/intern/cycles/kernel/kernel_compat_cpu.h
+++ b/intern/cycles/kernel/kernel_compat_cpu.h
@@ -153,4 +153,4 @@ typedef vector3<avxf> avx3f;
CCL_NAMESPACE_END
-#endif /* __KERNEL_COMPAT_CPU_H__ */
+#endif /* __KERNEL_COMPAT_CPU_H__ */
diff --git a/intern/cycles/kernel/kernel_compat_cuda.h b/intern/cycles/kernel/kernel_compat_cuda.h
index ac63bcf7ac9..8ed96bbae64 100644
--- a/intern/cycles/kernel/kernel_compat_cuda.h
+++ b/intern/cycles/kernel/kernel_compat_cuda.h
@@ -150,4 +150,4 @@ ccl_device_inline uint ccl_num_groups(uint d)
#define logf(x) __logf(((float)(x)))
#define expf(x) __expf(((float)(x)))
-#endif /* __KERNEL_COMPAT_CUDA_H__ */
+#endif /* __KERNEL_COMPAT_CUDA_H__ */
diff --git a/intern/cycles/kernel/kernel_compat_opencl.h b/intern/cycles/kernel/kernel_compat_opencl.h
index 3f7e264fbee..21a95098894 100644
--- a/intern/cycles/kernel/kernel_compat_opencl.h
+++ b/intern/cycles/kernel/kernel_compat_opencl.h
@@ -159,4 +159,4 @@
#include "util/util_half.h"
#include "util/util_types.h"
-#endif /* __KERNEL_COMPAT_OPENCL_H__ */
+#endif /* __KERNEL_COMPAT_OPENCL_H__ */
diff --git a/intern/cycles/kernel/kernel_globals.h b/intern/cycles/kernel/kernel_globals.h
index 74cfacb5bc1..37402f42863 100644
--- a/intern/cycles/kernel/kernel_globals.h
+++ b/intern/cycles/kernel/kernel_globals.h
@@ -21,6 +21,7 @@
#ifdef __KERNEL_CPU__
# include "util/util_vector.h"
+# include "util/util_map.h"
#endif
#ifdef __KERNEL_OPENCL__
@@ -42,6 +43,8 @@ struct OSLThreadData;
struct OSLShadingSystem;
# endif
+typedef unordered_map<float, float> CoverageMap;
+
struct Intersection;
struct VolumeStep;
@@ -68,6 +71,11 @@ typedef struct KernelGlobals {
VolumeStep *decoupled_volume_steps[2];
int decoupled_volume_steps_index;
+ /* A buffer for storing per-pixel coverage for Cryptomatte. */
+ CoverageMap *coverage_object;
+ CoverageMap *coverage_material;
+ CoverageMap *coverage_asset;
+
/* split kernel */
SplitData split_data;
SplitParams split_param_data;
diff --git a/intern/cycles/kernel/kernel_id_passes.h b/intern/cycles/kernel/kernel_id_passes.h
new file mode 100644
index 00000000000..0cd65b1f2e8
--- /dev/null
+++ b/intern/cycles/kernel/kernel_id_passes.h
@@ -0,0 +1,94 @@
+/*
+* Copyright 2018 Blender Foundation
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+CCL_NAMESPACE_BEGIN
+
+ccl_device_inline void kernel_write_id_slots(ccl_global float *buffer, int num_slots, float id, float weight)
+{
+ kernel_assert(id != ID_NONE);
+ if(weight == 0.0f) {
+ return;
+ }
+
+ for(int slot = 0; slot < num_slots; slot++) {
+ ccl_global float2 *id_buffer = (ccl_global float2*)buffer;
+#ifdef __ATOMIC_PASS_WRITE__
+ /* If the loop reaches an empty slot, the ID isn't in any slot yet - so add it! */
+ if(id_buffer[slot].x == ID_NONE) {
+ /* Use an atomic to claim this slot.
+ * If a different thread got here first, try again from this slot on. */
+ float old_id = atomic_compare_and_swap_float(buffer+slot*2, ID_NONE, id);
+ if(old_id != ID_NONE && old_id != id) {
+ continue;
+ }
+ atomic_add_and_fetch_float(buffer+slot*2+1, weight);
+ break;
+ }
+ /* If there already is a slot for that ID, add the weight.
+ * If no slot was found, add it to the last. */
+ else if(id_buffer[slot].x == id || slot == num_slots - 1) {
+ atomic_add_and_fetch_float(buffer+slot*2+1, weight);
+ break;
+ }
+#else /* __ATOMIC_PASS_WRITE__ */
+ /* If the loop reaches an empty slot, the ID isn't in any slot yet - so add it! */
+ if(id_buffer[slot].x == ID_NONE) {
+ id_buffer[slot].x = id;
+ id_buffer[slot].y = weight;
+ break;
+ }
+ /* If there already is a slot for that ID, add the weight.
+ * If no slot was found, add it to the last. */
+ else if(id_buffer[slot].x == id || slot == num_slots - 1) {
+ id_buffer[slot].y += weight;
+ break;
+ }
+#endif /* __ATOMIC_PASS_WRITE__ */
+ }
+}
+
+ccl_device_inline void kernel_sort_id_slots(ccl_global float *buffer, int num_slots)
+{
+ ccl_global float2 *id_buffer = (ccl_global float2*)buffer;
+ for(int slot = 1; slot < num_slots; ++slot) {
+ if(id_buffer[slot].x == ID_NONE) {
+ return;
+ }
+ /* Since we're dealing with a tiny number of elements, insertion sort should be fine. */
+ int i = slot;
+ while(i > 0 && id_buffer[i].y > id_buffer[i - 1].y) {
+ float2 swap = id_buffer[i];
+ id_buffer[i] = id_buffer[i - 1];
+ id_buffer[i - 1] = swap;
+ --i;
+ }
+ }
+}
+
+#ifdef __KERNEL_GPU__
+/* post-sorting for Cryptomatte */
+ccl_device void kernel_cryptomatte_post(KernelGlobals *kg, ccl_global float *buffer, uint sample, int x, int y, int offset, int stride)
+{
+ if(sample - 1 == kernel_data.integrator.aa_samples) {
+ int index = offset + x + y * stride;
+ int pass_stride = kernel_data.film.pass_stride;
+ ccl_global float *cryptomatte_buffer = buffer + index * pass_stride + kernel_data.film.pass_cryptomatte;
+ kernel_sort_id_slots(cryptomatte_buffer, 2 * kernel_data.film.cryptomatte_depth);
+ }
+}
+#endif
+
+CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/kernel_math.h b/intern/cycles/kernel/kernel_math.h
index 96391db7649..a8a43f3ea4a 100644
--- a/intern/cycles/kernel/kernel_math.h
+++ b/intern/cycles/kernel/kernel_math.h
@@ -25,4 +25,4 @@
#include "util/util_texture.h"
#include "util/util_transform.h"
-#endif /* __KERNEL_MATH_H__ */
+#endif /* __KERNEL_MATH_H__ */
diff --git a/intern/cycles/kernel/kernel_montecarlo.h b/intern/cycles/kernel/kernel_montecarlo.h
index 09a3fe8f23d..dde93844dd3 100644
--- a/intern/cycles/kernel/kernel_montecarlo.h
+++ b/intern/cycles/kernel/kernel_montecarlo.h
@@ -187,7 +187,10 @@ ccl_device float2 regular_polygon_sample(float corners, float rotation, float u,
ccl_device float3 ensure_valid_reflection(float3 Ng, float3 I, float3 N)
{
float3 R = 2*dot(N, I)*N - I;
- if(dot(Ng, R) >= 0.05f) {
+
+ /* Reflection rays may always be at least as shallow as the incoming ray. */
+ float threshold = min(0.9f*dot(Ng, I), 0.01f);
+ if(dot(Ng, R) >= threshold) {
return N;
}
@@ -195,24 +198,88 @@ ccl_device float3 ensure_valid_reflection(float3 Ng, float3 I, float3 N)
* The X axis is found by normalizing the component of N that's orthogonal to Ng.
* The Y axis isn't actually needed.
*/
- float3 X = normalize(N - dot(N, Ng)*Ng);
-
- /* Calculate N.z and N.x in the local coordinate system. */
- float Iz = dot(I, Ng);
- float Ix2 = sqr(dot(I, X)), Iz2 = sqr(Iz);
- float Ix2Iz2 = Ix2 + Iz2;
-
- float a = sqrtf(Ix2*(Ix2Iz2 - sqr(0.05f)));
- float b = Iz*0.05f + Ix2Iz2;
- float c = (a + b > 0.0f)? (a + b) : (-a + b);
+ float NdotNg = dot(N, Ng);
+ float3 X = normalize(N - NdotNg*Ng);
+
+ /* Calculate N.z and N.x in the local coordinate system.
+ *
+ * The goal of this computation is to find a N' that is rotated towards Ng just enough
+ * to lift R' above the threshold (here called t), therefore dot(R', Ng) = t.
+ *
+ * According to the standard reflection equation, this means that we want dot(2*dot(N', I)*N' - I, Ng) = t.
+ *
+ * Since the Z axis of our local coordinate system is Ng, dot(x, Ng) is just x.z, so we get 2*dot(N', I)*N'.z - I.z = t.
+ *
+ * The rotation is simple to express in the coordinate system we formed - since N lies in the X-Z-plane, we know that
+ * N' will also lie in the X-Z-plane, so N'.y = 0 and therefore dot(N', I) = N'.x*I.x + N'.z*I.z .
+ *
+ * Furthermore, we want N' to be normalized, so N'.x = sqrt(1 - N'.z^2).
+ *
+ * With these simplifications, we get the final equation 2*(sqrt(1 - N'.z^2)*I.x + N'.z*I.z)*N'.z - I.z = t.
+ *
+ * The only unknown here is N'.z, so we can solve for that.
+ *
+ * The equation has four solutions in general:
+ *
+ * N'.z = +-sqrt(0.5*(+-sqrt(I.x^2*(I.x^2 + I.z^2 - t^2)) + t*I.z + I.x^2 + I.z^2)/(I.x^2 + I.z^2))
+ * We can simplify this expression a bit by grouping terms:
+ *
+ * a = I.x^2 + I.z^2
+ * b = sqrt(I.x^2 * (a - t^2))
+ * c = I.z*t + a
+ * N'.z = +-sqrt(0.5*(+-b + c)/a)
+ *
+ * Two solutions can immediately be discarded because they're negative so N' would lie in the lower hemisphere.
+ */
+ float Ix = dot(I, X), Iz = dot(I, Ng);
+ float Ix2 = sqr(Ix), Iz2 = sqr(Iz);
+ float a = Ix2 + Iz2;
+
+ float b = safe_sqrtf(Ix2*(a - sqr(threshold)));
+ float c = Iz*threshold + a;
+
+ /* Evaluate both solutions.
+ * In many cases one can be immediately discarded (if N'.z would be imaginary or larger than one), so check for that first.
+ * If no option is viable (might happen in extreme cases like N being in the wrong hemisphere), give up and return Ng. */
+ float fac = 0.5f/a;
+ float N1_z2 = fac*(b+c), N2_z2 = fac*(-b+c);
+ bool valid1 = (N1_z2 > 1e-5f) && (N1_z2 <= (1.0f + 1e-5f));
+ bool valid2 = (N2_z2 > 1e-5f) && (N2_z2 <= (1.0f + 1e-5f));
+
+ float2 N_new;
+ if(valid1 && valid2) {
+ /* If both are possible, do the expensive reflection-based check. */
+ float2 N1 = make_float2(safe_sqrtf(1.0f - N1_z2), safe_sqrtf(N1_z2));
+ float2 N2 = make_float2(safe_sqrtf(1.0f - N2_z2), safe_sqrtf(N2_z2));
+
+ float R1 = 2*(N1.x*Ix + N1.y*Iz)*N1.y - Iz;
+ float R2 = 2*(N2.x*Ix + N2.y*Iz)*N2.y - Iz;
+
+ valid1 = (R1 >= 1e-5f);
+ valid2 = (R2 >= 1e-5f);
+ if(valid1 && valid2) {
+ /* If both solutions are valid, return the one with the shallower reflection since it will be closer to the input
+ * (if the original reflection wasn't shallow, we would not be in this part of the function). */
+ N_new = (R1 < R2)? N1 : N2;
+ }
+ else {
+ /* If only one reflection is valid (= positive), pick that one. */
+ N_new = (R1 > R2)? N1 : N2;
+ }
- float Nz = sqrtf(0.5f * c * (1.0f / Ix2Iz2));
- float Nx = sqrtf(1.0f - sqr(Nz));
+ }
+ else if(valid1 || valid2) {
+ /* Only one solution passes the N'.z criterium, so pick that one. */
+ float Nz2 = valid1? N1_z2 : N2_z2;
+ N_new = make_float2(safe_sqrtf(1.0f - Nz2), safe_sqrtf(Nz2));
+ }
+ else {
+ return Ng;
+ }
- /* Transform back into global coordinates. */
- return Nx*X + Nz*Ng;
+ return N_new.x*X + N_new.y*Ng;
}
CCL_NAMESPACE_END
-#endif /* __KERNEL_MONTECARLO_CL__ */
+#endif /* __KERNEL_MONTECARLO_CL__ */
diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
index 458aa6c2a97..1f5929e4938 100644
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@ -14,12 +14,14 @@
* limitations under the License.
*/
-CCL_NAMESPACE_BEGIN
-
#if defined(__SPLIT_KERNEL__) || defined(__KERNEL_CUDA__)
#define __ATOMIC_PASS_WRITE__
#endif
+#include "kernel/kernel_id_passes.h"
+
+CCL_NAMESPACE_BEGIN
+
ccl_device_inline void kernel_write_pass_float(ccl_global float *buffer, float value)
{
ccl_global float *buf = buffer;
@@ -108,7 +110,7 @@ ccl_device_inline void kernel_write_denoising_shadow(KernelGlobals *kg, ccl_glob
float value = path_total_shaded / max(path_total, 1e-7f);
kernel_write_pass_float(buffer+2, value*value);
}
-#endif /* __DENOISING_FEATURES__ */
+#endif /* __DENOISING_FEATURES__ */
ccl_device_inline void kernel_update_denoising_features(KernelGlobals *kg,
ShaderData *sd,
@@ -187,7 +189,24 @@ ccl_device_inline void kernel_write_debug_passes(KernelGlobals *kg,
L->debug_data.num_ray_bounces);
}
}
-#endif /* __KERNEL_DEBUG__ */
+#endif /* __KERNEL_DEBUG__ */
+
+#ifdef __KERNEL_CPU__
+#define WRITE_ID_SLOT(buffer, depth, id, matte_weight, name) kernel_write_id_pass_cpu(buffer, depth * 2, id, matte_weight, kg->coverage_##name)
+ccl_device_inline size_t kernel_write_id_pass_cpu(float *buffer, size_t depth, float id, float matte_weight, CoverageMap *map)
+{
+ if(map) {
+ (*map)[id] += matte_weight;
+ return 0;
+ }
+#else /* __KERNEL_CPU__ */
+#define WRITE_ID_SLOT(buffer, depth, id, matte_weight, name) kernel_write_id_slots_gpu(buffer, depth * 2, id, matte_weight)
+ccl_device_inline size_t kernel_write_id_slots_gpu(ccl_global float *buffer, size_t depth, float id, float matte_weight)
+{
+#endif /* __KERNEL_CPU__ */
+ kernel_write_id_slots(buffer, depth, id, matte_weight);
+ return depth * 2;
+}
ccl_device_inline void kernel_write_data_passes(KernelGlobals *kg, ccl_global float *buffer, PathRadiance *L,
ShaderData *sd, ccl_addr_space PathState *state, float3 throughput)
@@ -242,6 +261,26 @@ ccl_device_inline void kernel_write_data_passes(KernelGlobals *kg, ccl_global fl
}
}
+ if(kernel_data.film.cryptomatte_passes) {
+ const float matte_weight = average(throughput) * (1.0f - average(shader_bsdf_transparency(kg, sd)));
+ if(matte_weight > 0.0f) {
+ ccl_global float *cryptomatte_buffer = buffer + kernel_data.film.pass_cryptomatte;
+ if(kernel_data.film.cryptomatte_passes & CRYPT_OBJECT) {
+ float id = object_cryptomatte_id(kg, sd->object);
+ cryptomatte_buffer += WRITE_ID_SLOT(cryptomatte_buffer, kernel_data.film.cryptomatte_depth, id, matte_weight, object);
+ }
+ if(kernel_data.film.cryptomatte_passes & CRYPT_MATERIAL) {
+ float id = shader_cryptomatte_id(kg, sd->shader);
+ cryptomatte_buffer += WRITE_ID_SLOT(cryptomatte_buffer, kernel_data.film.cryptomatte_depth, id, matte_weight, material);
+ }
+ if(kernel_data.film.cryptomatte_passes & CRYPT_ASSET) {
+ float id = object_cryptomatte_asset_id(kg, sd->object);
+ cryptomatte_buffer += WRITE_ID_SLOT(cryptomatte_buffer, kernel_data.film.cryptomatte_depth, id, matte_weight, asset);
+ }
+ }
+ }
+
+
if(light_flag & PASSMASK_COMPONENT(DIFFUSE))
L->color_diffuse += shader_bsdf_diffuse(kg, sd)*throughput;
if(light_flag & PASSMASK_COMPONENT(GLOSSY))
diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h
index 5745762e183..cb1f410b09f 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -266,7 +266,7 @@ ccl_device_forceinline VolumeIntegrateResult kernel_path_volume(
}
#endif /* __VOLUME__ */
-#endif /* __SPLIT_KERNEL__ */
+#endif /* __SPLIT_KERNEL__ */
ccl_device_forceinline bool kernel_path_shader_apply(
KernelGlobals *kg,
@@ -434,7 +434,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg,
else if(result == VOLUME_PATH_MISSED) {
break;
}
-#endif /* __VOLUME__*/
+#endif /* __VOLUME__*/
/* Shade background. */
if(!hit) {
@@ -557,7 +557,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg,
#endif /* __SUBSURFACE__ */
}
-#endif /* defined(__BRANCHED_PATH__) || defined(__BAKING__) */
+#endif /* defined(__BRANCHED_PATH__) || defined(__BAKING__) */
ccl_device_forceinline void kernel_path_integrate(
KernelGlobals *kg,
@@ -605,7 +605,7 @@ ccl_device_forceinline void kernel_path_integrate(
else if(result == VOLUME_PATH_MISSED) {
break;
}
-#endif /* __VOLUME__*/
+#endif /* __VOLUME__*/
/* Shade background. */
if(!hit) {
diff --git a/intern/cycles/kernel/kernel_path_volume.h b/intern/cycles/kernel/kernel_path_volume.h
index feaea15d3c4..d2506fc1e7e 100644
--- a/intern/cycles/kernel/kernel_path_volume.h
+++ b/intern/cycles/kernel/kernel_path_volume.h
@@ -55,7 +55,7 @@ ccl_device_inline void kernel_path_volume_connect_light(
}
}
}
-#endif /* __EMISSION__ */
+#endif /* __EMISSION__ */
}
#ifdef __KERNEL_GPU__
@@ -277,10 +277,10 @@ ccl_device void kernel_branched_path_volume_connect_light(
}
}
}
-#endif /* __EMISSION__ */
+#endif /* __EMISSION__ */
}
-#endif /* __SPLIT_KERNEL__ */
+#endif /* __SPLIT_KERNEL__ */
-#endif /* __VOLUME_SCATTER__ */
+#endif /* __VOLUME_SCATTER__ */
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/kernel_queues.h b/intern/cycles/kernel/kernel_queues.h
index e32d4bbbc1b..de8cc4a0cef 100644
--- a/intern/cycles/kernel/kernel_queues.h
+++ b/intern/cycles/kernel/kernel_queues.h
@@ -145,4 +145,4 @@ ccl_device int dequeue_ray_index(
CCL_NAMESPACE_END
-#endif // __KERNEL_QUEUE_H__
+#endif // __KERNEL_QUEUE_H__
diff --git a/intern/cycles/kernel/kernel_random.h b/intern/cycles/kernel/kernel_random.h
index b33e4eba8a4..61ddf4a4f81 100644
--- a/intern/cycles/kernel/kernel_random.h
+++ b/intern/cycles/kernel/kernel_random.h
@@ -50,7 +50,7 @@ ccl_device uint sobol_dimension(KernelGlobals *kg, int index, int dimension)
return result;
}
-#endif /* __SOBOL__ */
+#endif /* __SOBOL__ */
ccl_device_forceinline float path_rng_1D(KernelGlobals *kg,
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
index e834b701f96..af883aa715b 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -1276,4 +1276,9 @@ ccl_device bool shader_transparent_shadow(KernelGlobals *kg, Intersection *isect
}
#endif /* __TRANSPARENT_SHADOWS__ */
+ccl_device float shader_cryptomatte_id(KernelGlobals *kg, int shader)
+{
+ return kernel_tex_fetch(__shaders, (shader & SHADER_MASK)).cryptomatte_id;
+}
+
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/kernel_shadow.h b/intern/cycles/kernel/kernel_shadow.h
index 8a0da6c3b13..fafa3ad4bfa 100644
--- a/intern/cycles/kernel/kernel_shadow.h
+++ b/intern/cycles/kernel/kernel_shadow.h
@@ -446,7 +446,7 @@ ccl_device bool shadow_blocked_transparent_stepped(
}
# endif /* __KERNEL_GPU__ || !__SHADOW_RECORD_ALL__ */
-#endif /* __TRANSPARENT_SHADOWS__ */
+#endif /* __TRANSPARENT_SHADOWS__ */
ccl_device_inline bool shadow_blocked(KernelGlobals *kg,
ShaderData *sd,
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index e93100a6442..864aa7c470a 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -17,6 +17,12 @@
#ifndef __KERNEL_TYPES_H__
#define __KERNEL_TYPES_H__
+#if !defined(__KERNEL_GPU__) && defined(WITH_EMBREE)
+# include <embree3/rtcore.h>
+# include <embree3/rtcore_scene.h>
+# define __EMBREE__
+#endif
+
#include "kernel/kernel_math.h"
#include "kernel/svm/svm_types.h"
#include "util/util_static_assert.h"
@@ -53,6 +59,7 @@ CCL_NAMESPACE_BEGIN
#define OBJECT_NONE (~0)
#define PRIM_NONE (~0)
#define LAMP_NONE (~0)
+#define ID_NONE (0.0f)
#define VOLUME_STACK_SIZE 32
@@ -415,6 +422,7 @@ typedef enum PassType {
PASS_RAY_BOUNCES,
#endif
PASS_RENDER_TIME,
+ PASS_CRYPTOMATTE,
PASS_CATEGORY_MAIN_END = 31,
PASS_MIST = 32,
@@ -443,6 +451,14 @@ typedef enum PassType {
#define PASS_ANY (~0)
+typedef enum CryptomatteType {
+ CRYPT_NONE = 0,
+ CRYPT_OBJECT = (1 << 0),
+ CRYPT_MATERIAL = (1 << 1),
+ CRYPT_ASSET = (1 << 2),
+ CRYPT_ACCURATE = (1 << 3),
+} CryptomatteType;
+
typedef enum DenoisingPassOffsets {
DENOISING_PASS_NORMAL = 0,
DENOISING_PASS_NORMAL_VAR = 3,
@@ -599,7 +615,7 @@ typedef ccl_addr_space struct PathRadiance {
#ifdef __KERNEL_DEBUG__
DebugData debug_data;
-#endif /* __KERNEL_DEBUG__ */
+#endif /* __KERNEL_DEBUG__ */
} PathRadiance;
typedef struct BsdfEval {
@@ -712,6 +728,9 @@ typedef struct Ray {
/* Intersection */
typedef struct Intersection {
+#ifdef __EMBREE__
+ float3 Ng;
+#endif
float t, u, v;
int prim;
int object;
@@ -1260,6 +1279,9 @@ typedef struct KernelFilm {
int pass_shadow;
float pass_shadow_scale;
int filter_table_offset;
+ int cryptomatte_passes;
+ int cryptomatte_depth;
+ int pass_cryptomatte;
int pass_mist;
float mist_start;
@@ -1270,8 +1292,6 @@ typedef struct KernelFilm {
int pass_denoising_clean;
int denoising_flags;
- int pad1, pad2, pad3;
-
/* XYZ to rendering color space transform. float4 instead of float3 to
* ensure consistent padding/alignment across devices. */
float4 xyz_to_r;
@@ -1385,20 +1405,29 @@ typedef enum KernelBVHLayout {
BVH_LAYOUT_BVH2 = (1 << 0),
BVH_LAYOUT_BVH4 = (1 << 1),
BVH_LAYOUT_BVH8 = (1 << 2),
-
+ BVH_LAYOUT_EMBREE = (1 << 3),
BVH_LAYOUT_DEFAULT = BVH_LAYOUT_BVH8,
BVH_LAYOUT_ALL = (unsigned int)(-1),
} KernelBVHLayout;
typedef struct KernelBVH {
- /* root node */
+ /* Own BVH */
int root;
int have_motion;
int have_curves;
int have_instancing;
int bvh_layout;
int use_bvh_steps;
+
+ /* Embree */
+#ifdef __EMBREE__
+ RTCScene scene;
+# ifndef __KERNEL_64_BIT__
+ int pad1;
+# endif
+#else
int pad1, pad2;
+#endif
} KernelBVH;
static_assert_align(KernelBVH, 16);
@@ -1460,7 +1489,11 @@ typedef struct KernelObject {
uint patch_map_offset;
uint attribute_map_offset;
uint motion_offset;
- uint pad;
+ uint pad1;
+
+ float cryptomatte_object;
+ float cryptomatte_asset;
+ float pad2, pad3;
} KernelObject;
static_assert_align(KernelObject, 16);
@@ -1540,7 +1573,7 @@ static_assert_align(KernelParticle, 16);
typedef struct KernelShader {
float constant_emission[3];
- float pad1;
+ float cryptomatte_id;
int flags;
int pass_id;
int pad2, pad3;
@@ -1672,4 +1705,4 @@ typedef struct WorkTile {
CCL_NAMESPACE_END
-#endif /* __KERNEL_TYPES_H__ */
+#endif /* __KERNEL_TYPES_H__ */
diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h
index d71761a97bc..d6d283c42c5 100644
--- a/intern/cycles/kernel/kernel_volume.h
+++ b/intern/cycles/kernel/kernel_volume.h
@@ -87,7 +87,7 @@ ccl_device_inline bool volume_shader_sample(KernelGlobals *kg,
return true;
}
-#endif /* __VOLUME__ */
+#endif /* __VOLUME__ */
ccl_device float3 volume_color_transmittance(float3 sigma, float t)
{
@@ -270,7 +270,7 @@ ccl_device_noinline void kernel_volume_shadow(KernelGlobals *kg,
kernel_volume_shadow_homogeneous(kg, state, ray, shadow_sd, throughput);
}
-#endif /* __VOLUME__ */
+#endif /* __VOLUME__ */
/* Equi-angular sampling as in:
* "Importance Sampling Techniques for Path Tracing in Participating Media" */
@@ -1075,7 +1075,7 @@ ccl_device VolumeIntegrateResult kernel_volume_decoupled_scatter(
return VOLUME_PATH_SCATTERED;
}
-#endif /* __SPLIT_KERNEL */
+#endif /* __SPLIT_KERNEL */
/* decide if we need to use decoupled or not */
ccl_device bool kernel_volume_use_decoupled(KernelGlobals *kg, bool heterogeneous, bool direct, int sampling_method)
@@ -1377,6 +1377,6 @@ ccl_device_inline void kernel_volume_clean_stack(KernelGlobals *kg,
}
}
-#endif /* __VOLUME__ */
+#endif /* __VOLUME__ */
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/kernels/cpu/filter_cpu.h b/intern/cycles/kernel/kernels/cpu/filter_cpu.h
index b62aa9663ec..e036b53b810 100644
--- a/intern/cycles/kernel/kernels/cpu/filter_cpu.h
+++ b/intern/cycles/kernel/kernels/cpu/filter_cpu.h
@@ -95,6 +95,7 @@ void KERNEL_FUNCTION_FULL_NAME(filter_nlm_update_output)(int dx,
int dy,
float *difference_image,
float *image,
+ float *temp_image,
float *out_image,
float *accum_image,
int* rect,
diff --git a/intern/cycles/kernel/kernels/cpu/filter_cpu_impl.h b/intern/cycles/kernel/kernels/cpu/filter_cpu_impl.h
index 26777fdabb2..4c758711481 100644
--- a/intern/cycles/kernel/kernels/cpu/filter_cpu_impl.h
+++ b/intern/cycles/kernel/kernels/cpu/filter_cpu_impl.h
@@ -191,6 +191,7 @@ void KERNEL_FUNCTION_FULL_NAME(filter_nlm_update_output)(int dx,
int dy,
float *difference_image,
float *image,
+ float *temp_image,
float *out_image,
float *accum_image,
int *rect,
@@ -200,7 +201,7 @@ void KERNEL_FUNCTION_FULL_NAME(filter_nlm_update_output)(int dx,
#ifdef KERNEL_STUB
STUB_ASSERT(KERNEL_ARCH, filter_nlm_update_output);
#else
- kernel_filter_nlm_update_output(dx, dy, difference_image, image, out_image, accum_image, load_int4(rect), stride, f);
+ kernel_filter_nlm_update_output(dx, dy, difference_image, image, temp_image, out_image, accum_image, load_int4(rect), stride, f);
#endif
}
diff --git a/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h b/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h
index b77b7350d86..ae4fd85780d 100644
--- a/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h
+++ b/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h
@@ -26,7 +26,7 @@ template<typename T> struct TextureInterpolator {
u[1] = (( 0.5f * t - 1.0f) * t ) * t + (2.0f/3.0f); \
u[2] = (( -0.5f * t + 0.5f) * t + 0.5f) * t + (1.0f/6.0f); \
u[3] = (1.0f / 6.0f) * t * t * t; \
- } (void)0
+ } (void) 0
static ccl_always_inline float4 read(float4 r)
{
@@ -540,4 +540,4 @@ ccl_device float4 kernel_tex_image_interp_3d(KernelGlobals *kg, int id, float x,
CCL_NAMESPACE_END
-#endif // __KERNEL_CPU_IMAGE_H__
+#endif // __KERNEL_CPU_IMAGE_H__
diff --git a/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h b/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h
index 5ec1655ab05..759b7e4c20d 100644
--- a/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h
+++ b/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h
@@ -97,7 +97,7 @@ void KERNEL_FUNCTION_FULL_NAME(path_trace)(KernelGlobals *kg,
{
kernel_path_trace(kg, buffer, sample, x, y, offset, stride);
}
-#endif /* KERNEL_STUB */
+#endif /* KERNEL_STUB */
}
/* Film */
@@ -120,7 +120,7 @@ void KERNEL_FUNCTION_FULL_NAME(convert_to_byte)(KernelGlobals *kg,
x, y,
offset,
stride);
-#endif /* KERNEL_STUB */
+#endif /* KERNEL_STUB */
}
void KERNEL_FUNCTION_FULL_NAME(convert_to_half_float)(KernelGlobals *kg,
@@ -141,7 +141,7 @@ void KERNEL_FUNCTION_FULL_NAME(convert_to_half_float)(KernelGlobals *kg,
x, y,
offset,
stride);
-#endif /* KERNEL_STUB */
+#endif /* KERNEL_STUB */
}
/* Shader Evaluate */
@@ -176,7 +176,7 @@ void KERNEL_FUNCTION_FULL_NAME(shader)(KernelGlobals *kg,
else {
kernel_background_evaluate(kg, input, output, i);
}
-#endif /* KERNEL_STUB */
+#endif /* KERNEL_STUB */
}
#else /* __SPLIT_KERNEL__ */
@@ -208,7 +208,7 @@ void KERNEL_FUNCTION_FULL_NAME(shader)(KernelGlobals *kg,
ccl_local type locals; \
kernel_##name(kg, &locals); \
}
-#endif /* KERNEL_STUB */
+#endif /* KERNEL_STUB */
DEFINE_SPLIT_KERNEL_FUNCTION(path_init)
DEFINE_SPLIT_KERNEL_FUNCTION(scene_intersect)
diff --git a/intern/cycles/kernel/kernels/cuda/filter.cu b/intern/cycles/kernel/kernels/cuda/filter.cu
index 0561c40e6b1..b856cbde45c 100644
--- a/intern/cycles/kernel/kernels/cuda/filter.cu
+++ b/intern/cycles/kernel/kernels/cuda/filter.cu
@@ -140,7 +140,7 @@ kernel_cuda_filter_nlm_calc_difference(const float *ccl_restrict weight_image,
int w,
int h,
int stride,
- int shift_stride,
+ int pass_stride,
int r,
int channel_offset,
float a,
@@ -148,7 +148,7 @@ kernel_cuda_filter_nlm_calc_difference(const float *ccl_restrict weight_image,
{
int4 co, rect;
int ofs;
- if(get_nlm_coords(w, h, r, shift_stride, &rect, &co, &ofs)) {
+ if(get_nlm_coords(w, h, r, pass_stride, &rect, &co, &ofs)) {
kernel_filter_nlm_calc_difference(co.x, co.y, co.z, co.w,
weight_image,
variance_image,
@@ -165,13 +165,13 @@ kernel_cuda_filter_nlm_blur(const float *ccl_restrict difference_image,
int w,
int h,
int stride,
- int shift_stride,
+ int pass_stride,
int r,
int f)
{
int4 co, rect;
int ofs;
- if(get_nlm_coords(w, h, r, shift_stride, &rect, &co, &ofs)) {
+ if(get_nlm_coords(w, h, r, pass_stride, &rect, &co, &ofs)) {
kernel_filter_nlm_blur(co.x, co.y,
difference_image + ofs,
out_image + ofs,
@@ -186,13 +186,13 @@ kernel_cuda_filter_nlm_calc_weight(const float *ccl_restrict difference_image,
int w,
int h,
int stride,
- int shift_stride,
+ int pass_stride,
int r,
int f)
{
int4 co, rect;
int ofs;
- if(get_nlm_coords(w, h, r, shift_stride, &rect, &co, &ofs)) {
+ if(get_nlm_coords(w, h, r, pass_stride, &rect, &co, &ofs)) {
kernel_filter_nlm_calc_weight(co.x, co.y,
difference_image + ofs,
out_image + ofs,
@@ -209,13 +209,13 @@ kernel_cuda_filter_nlm_update_output(const float *ccl_restrict difference_image,
int w,
int h,
int stride,
- int shift_stride,
+ int pass_stride,
int r,
int f)
{
int4 co, rect;
int ofs;
- if(get_nlm_coords(w, h, r, shift_stride, &rect, &co, &ofs)) {
+ if(get_nlm_coords(w, h, r, pass_stride, &rect, &co, &ofs)) {
kernel_filter_nlm_update_output(co.x, co.y, co.z, co.w,
difference_image + ofs,
image,
@@ -252,14 +252,13 @@ kernel_cuda_filter_nlm_construct_gramian(const float *ccl_restrict difference_im
int w,
int h,
int stride,
- int shift_stride,
+ int pass_stride,
int r,
- int f,
- int pass_stride)
+ int f)
{
int4 co, rect;
int ofs;
- if(get_nlm_coords_window(w, h, r, shift_stride, &rect, &co, &ofs, filter_window)) {
+ if(get_nlm_coords_window(w, h, r, pass_stride, &rect, &co, &ofs, filter_window)) {
kernel_filter_nlm_construct_gramian(co.x, co.y,
co.z, co.w,
difference_image + ofs,
diff --git a/intern/cycles/kernel/kernels/cuda/kernel.cu b/intern/cycles/kernel/kernels/cuda/kernel.cu
index 8a180a509e8..af311027f78 100644
--- a/intern/cycles/kernel/kernels/cuda/kernel.cu
+++ b/intern/cycles/kernel/kernels/cuda/kernel.cu
@@ -40,14 +40,21 @@ CUDA_LAUNCH_BOUNDS(CUDA_THREADS_BLOCK_WIDTH, CUDA_KERNEL_MAX_REGISTERS)
kernel_cuda_path_trace(WorkTile *tile, uint total_work_size)
{
int work_index = ccl_global_id(0);
-
- if(work_index < total_work_size) {
- uint x, y, sample;
+ bool thread_is_active = work_index < total_work_size;
+ uint x, y, sample;
+ KernelGlobals kg;
+ if(thread_is_active) {
get_work_pixel(tile, work_index, &x, &y, &sample);
- KernelGlobals kg;
kernel_path_trace(&kg, tile->buffer, sample, x, y, tile->offset, tile->stride);
}
+
+ if(kernel_data.film.cryptomatte_passes) {
+ __syncthreads();
+ if(thread_is_active) {
+ kernel_cryptomatte_post(&kg, tile->buffer, sample, x, y, tile->offset, tile->stride);
+ }
+ }
}
#ifdef __BRANCHED_PATH__
@@ -56,14 +63,21 @@ CUDA_LAUNCH_BOUNDS(CUDA_THREADS_BLOCK_WIDTH, CUDA_KERNEL_BRANCHED_MAX_REGISTERS)
kernel_cuda_branched_path_trace(WorkTile *tile, uint total_work_size)
{
int work_index = ccl_global_id(0);
-
- if(work_index < total_work_size) {
- uint x, y, sample;
+ bool thread_is_active = work_index < total_work_size;
+ uint x, y, sample;
+ KernelGlobals kg;
+ if(thread_is_active) {
get_work_pixel(tile, work_index, &x, &y, &sample);
- KernelGlobals kg;
kernel_branched_path_trace(&kg, tile->buffer, sample, x, y, tile->offset, tile->stride);
}
+
+ if(kernel_data.film.cryptomatte_passes) {
+ __syncthreads();
+ if(thread_is_active) {
+ kernel_cryptomatte_post(&kg, tile->buffer, sample, x, y, tile->offset, tile->stride);
+ }
+ }
}
#endif
diff --git a/intern/cycles/kernel/kernels/opencl/filter.cl b/intern/cycles/kernel/kernels/opencl/filter.cl
index 3c75754fb39..a550f97f4eb 100644
--- a/intern/cycles/kernel/kernels/opencl/filter.cl
+++ b/intern/cycles/kernel/kernels/opencl/filter.cl
@@ -132,7 +132,7 @@ __kernel void kernel_ocl_filter_nlm_calc_difference(const ccl_global float *ccl_
int w,
int h,
int stride,
- int shift_stride,
+ int pass_stride,
int r,
int channel_offset,
float a,
@@ -140,7 +140,7 @@ __kernel void kernel_ocl_filter_nlm_calc_difference(const ccl_global float *ccl_
{
int4 co, rect;
int ofs;
- if(get_nlm_coords(w, h, r, shift_stride, &rect, &co, &ofs)) {
+ if(get_nlm_coords(w, h, r, pass_stride, &rect, &co, &ofs)) {
kernel_filter_nlm_calc_difference(co.x, co.y, co.z, co.w,
weight_image,
variance_image,
@@ -155,13 +155,13 @@ __kernel void kernel_ocl_filter_nlm_blur(const ccl_global float *ccl_restrict di
int w,
int h,
int stride,
- int shift_stride,
+ int pass_stride,
int r,
int f)
{
int4 co, rect;
int ofs;
- if(get_nlm_coords(w, h, r, shift_stride, &rect, &co, &ofs)) {
+ if(get_nlm_coords(w, h, r, pass_stride, &rect, &co, &ofs)) {
kernel_filter_nlm_blur(co.x, co.y,
difference_image + ofs,
out_image + ofs,
@@ -174,13 +174,13 @@ __kernel void kernel_ocl_filter_nlm_calc_weight(const ccl_global float *ccl_rest
int w,
int h,
int stride,
- int shift_stride,
+ int pass_stride,
int r,
int f)
{
int4 co, rect;
int ofs;
- if(get_nlm_coords(w, h, r, shift_stride, &rect, &co, &ofs)) {
+ if(get_nlm_coords(w, h, r, pass_stride, &rect, &co, &ofs)) {
kernel_filter_nlm_calc_weight(co.x, co.y,
difference_image + ofs,
out_image + ofs,
@@ -195,13 +195,13 @@ __kernel void kernel_ocl_filter_nlm_update_output(const ccl_global float *ccl_re
int w,
int h,
int stride,
- int shift_stride,
+ int pass_stride,
int r,
int f)
{
int4 co, rect;
int ofs;
- if(get_nlm_coords(w, h, r, shift_stride, &rect, &co, &ofs)) {
+ if(get_nlm_coords(w, h, r, pass_stride, &rect, &co, &ofs)) {
kernel_filter_nlm_update_output(co.x, co.y, co.z, co.w,
difference_image + ofs,
image,
@@ -234,14 +234,13 @@ __kernel void kernel_ocl_filter_nlm_construct_gramian(const ccl_global float *cc
int w,
int h,
int stride,
- int shift_stride,
+ int pass_stride,
int r,
- int f,
- int pass_stride)
+ int f)
{
int4 co, rect;
int ofs;
- if(get_nlm_coords_window(w, h, r, shift_stride, &rect, &co, &ofs, filter_window)) {
+ if(get_nlm_coords_window(w, h, r, pass_stride, &rect, &co, &ofs, filter_window)) {
kernel_filter_nlm_construct_gramian(co.x, co.y,
co.z, co.w,
difference_image + ofs,
diff --git a/intern/cycles/kernel/kernels/opencl/kernel.cl b/intern/cycles/kernel/kernels/opencl/kernel.cl
index 63128d0aecf..de1f5088629 100644
--- a/intern/cycles/kernel/kernels/opencl/kernel.cl
+++ b/intern/cycles/kernel/kernels/opencl/kernel.cl
@@ -66,9 +66,17 @@ __kernel void kernel_ocl_path_trace(
int x = sx + ccl_global_id(0);
int y = sy + ccl_global_id(1);
-
- if(x < sx + sw && y < sy + sh)
+ bool thread_is_active = x < sx + sw && y < sy + sh;
+ if(thread_is_active) {
kernel_path_trace(kg, buffer, sample, x, y, offset, stride);
+ }
+ if(kernel_data.film.cryptomatte_passes) {
+ /* Make sure no thread is writing to the buffers. */
+ ccl_barrier(CCL_LOCAL_MEM_FENCE);
+ if(thread_is_active) {
+ kernel_cryptomatte_post(kg, buffer, sample, x, y, offset, stride);
+ }
+ }
}
#else /* __COMPILE_ONLY_MEGAKERNEL__ */
diff --git a/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h b/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h
index dd9d683e030..79af831c2fb 100644
--- a/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h
+++ b/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h
@@ -142,7 +142,7 @@ ccl_device_inline float svm_image_texture_frac(float x, int *ix)
u[1] = (( 0.5f * t - 1.0f) * t ) * t + (2.0f/3.0f); \
u[2] = (( -0.5f * t + 0.5f) * t + 0.5f) * t + (1.0f/6.0f); \
u[3] = (1.0f / 6.0f) * t * t * t; \
- } (void)0
+ } (void) 0
ccl_device float4 kernel_tex_image_interp(KernelGlobals *kg, int id, float x, float y)
{
diff --git a/intern/cycles/kernel/osl/osl_closures.h b/intern/cycles/kernel/osl/osl_closures.h
index d9aeb9ab9fb..2a50704b569 100644
--- a/intern/cycles/kernel/osl/osl_closures.h
+++ b/intern/cycles/kernel/osl/osl_closures.h
@@ -146,4 +146,4 @@ CCLOSURE_PREPARE_STATIC(bsdf_##lower##_prepare, Upper##Closure)
CCL_NAMESPACE_END
-#endif /* __OSL_CLOSURES_H__ */
+#endif /* __OSL_CLOSURES_H__ */
diff --git a/intern/cycles/kernel/osl/osl_globals.h b/intern/cycles/kernel/osl/osl_globals.h
index 30b29793e2d..88192fbcccb 100644
--- a/intern/cycles/kernel/osl/osl_globals.h
+++ b/intern/cycles/kernel/osl/osl_globals.h
@@ -94,4 +94,4 @@ CCL_NAMESPACE_END
#endif
-#endif /* __OSL_GLOBALS_H__ */
+#endif /* __OSL_GLOBALS_H__ */
diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp
index 7902381440b..5a82748f345 100644
--- a/intern/cycles/kernel/osl/osl_services.cpp
+++ b/intern/cycles/kernel/osl/osl_services.cpp
@@ -884,6 +884,23 @@ bool OSLRenderServices::has_userdata(ustring name, TypeDesc type, OSL::ShaderGlo
return false; /* never called by OSL */
}
+TextureSystem::TextureHandle *OSLRenderServices::get_texture_handle(ustring filename)
+{
+ if (filename.length() && filename[0] == '@') {
+ /* Dummy, we don't use texture handles for builtin textures but need
+ * to tell the OSL runtime optimizer that this is a valid texture. */
+ return NULL;
+ }
+ else {
+ return texturesys()->get_texture_handle(filename);
+ }
+}
+
+bool OSLRenderServices::good(TextureSystem::TextureHandle *texture_handle)
+{
+ return texturesys()->good(texture_handle);
+}
+
bool OSLRenderServices::texture(ustring filename,
TextureHandle *texture_handle,
TexturePerthread *texture_thread_info,
@@ -894,7 +911,8 @@ bool OSLRenderServices::texture(ustring filename,
int nchannels,
float *result,
float *dresultds,
- float *dresultdt)
+ float *dresultdt,
+ ustring *errormessage)
{
OSL::TextureSystem *ts = osl_ts;
ShaderData *sd = (ShaderData *)(sg->renderstate);
@@ -1035,7 +1053,7 @@ bool OSLRenderServices::texture(ustring filename,
* other nasty stuff happening.
*/
string err = ts->geterror();
- (void)err;
+ (void) err;
}
return status;
@@ -1114,7 +1132,7 @@ bool OSLRenderServices::texture3d(ustring filename,
* other nasty stuff happening.
*/
string err = ts->geterror();
- (void)err;
+ (void) err;
}
return status;
@@ -1156,7 +1174,13 @@ bool OSLRenderServices::get_texture_info(OSL::ShaderGlobals *sg, ustring filenam
TypeDesc datatype, void *data)
{
OSL::TextureSystem *ts = osl_ts;
- return ts->get_texture_info(filename, subimage, dataname, datatype, data);
+ if (filename.length() && filename[0] == '@') {
+ /* Special builtin textures. */
+ return false;
+ }
+ else {
+ return ts->get_texture_info(filename, subimage, dataname, datatype, data);
+ }
}
int OSLRenderServices::pointcloud_search(OSL::ShaderGlobals *sg, ustring filename, const OSL::Vec3 &center,
diff --git a/intern/cycles/kernel/osl/osl_services.h b/intern/cycles/kernel/osl/osl_services.h
index 50044746fd1..712b06b41b8 100644
--- a/intern/cycles/kernel/osl/osl_services.h
+++ b/intern/cycles/kernel/osl/osl_services.h
@@ -93,6 +93,10 @@ public:
bool getmessage(OSL::ShaderGlobals *sg, ustring source, ustring name,
TypeDesc type, void *val, bool derivatives);
+ TextureSystem::TextureHandle *get_texture_handle(ustring filename);
+
+ bool good(TextureSystem::TextureHandle *texture_handle);
+
bool texture(ustring filename,
TextureSystem::TextureHandle *texture_handle,
TexturePerthread *texture_thread_info,
@@ -103,7 +107,8 @@ public:
int nchannels,
float *result,
float *dresultds,
- float *dresultdt);
+ float *dresultdt,
+ ustring *errormessage);
bool texture3d(ustring filename,
TextureHandle *texture_handle,
@@ -194,4 +199,4 @@ private:
CCL_NAMESPACE_END
-#endif /* __OSL_SERVICES_H__ */
+#endif /* __OSL_SERVICES_H__ */
diff --git a/intern/cycles/kernel/osl/osl_shader.cpp b/intern/cycles/kernel/osl/osl_shader.cpp
index 6a690e880ad..a89bb3fd1a3 100644
--- a/intern/cycles/kernel/osl/osl_shader.cpp
+++ b/intern/cycles/kernel/osl/osl_shader.cpp
@@ -193,7 +193,7 @@ void OSLShader::eval_surface(KernelGlobals *kg, ShaderData *sd, PathState *state
float data[9];
bool found = kg->osl->services->get_attribute(sd, true, OSLRenderServices::u_empty, TypeDesc::TypeVector,
OSLRenderServices::u_geom_undisplaced, data);
- (void)found;
+ (void) found;
assert(found);
memcpy(&sd->P, data, sizeof(float)*3);
diff --git a/intern/cycles/kernel/osl/osl_shader.h b/intern/cycles/kernel/osl/osl_shader.h
index 571a3f502be..9824f966a44 100644
--- a/intern/cycles/kernel/osl/osl_shader.h
+++ b/intern/cycles/kernel/osl/osl_shader.h
@@ -66,4 +66,4 @@ CCL_NAMESPACE_END
#endif
-#endif /* __OSL_SHADER_H__ */
+#endif /* __OSL_SHADER_H__ */
diff --git a/intern/cycles/kernel/shaders/oslutil.h b/intern/cycles/kernel/shaders/oslutil.h
index 141e5d27e3a..592a8ad12d9 100644
--- a/intern/cycles/kernel/shaders/oslutil.h
+++ b/intern/cycles/kernel/shaders/oslutil.h
@@ -92,4 +92,4 @@ float wireframe(string edge_type, float line_width) { return wireframe(edge_type
float wireframe(string edge_type) { return wireframe(edge_type, 1.0, 1); }
float wireframe() { return wireframe("polygons", 1.0, 1); }
-#endif /* CCL_OSLUTIL_H */
+#endif /* CCL_OSLUTIL_H */
diff --git a/intern/cycles/kernel/shaders/stdosl.h b/intern/cycles/kernel/shaders/stdosl.h
index 4a8378796ba..7136c746321 100644
--- a/intern/cycles/kernel/shaders/stdosl.h
+++ b/intern/cycles/kernel/shaders/stdosl.h
@@ -284,33 +284,63 @@ point rotate (point p, float angle, point a, point b)
normal ensure_valid_reflection(normal Ng, vector I, normal N)
{
+ /* The implementation here mirrors the one in kernel_montecarlo.h,
+ * check there for an explanation of the algorithm. */
+
float sqr(float x) { return x*x; }
vector R = 2*dot(N, I)*N - I;
- if (dot(Ng, R) >= 0.05) {
+
+ float threshold = min(0.9*dot(Ng, I), 0.01);
+ if(dot(Ng, R) >= threshold) {
return N;
}
- /* Form coordinate system with Ng as the Z axis and N inside the X-Z-plane.
- * The X axis is found by normalizing the component of N that's orthogonal to Ng.
- * The Y axis isn't actually needed.
- */
- vector X = normalize(N - dot(N, Ng)*Ng);
+ float NdotNg = dot(N, Ng);
+ vector X = normalize(N - NdotNg*Ng);
- /* Calculate N.z and N.x in the local coordinate system. */
float Ix = dot(I, X), Iz = dot(I, Ng);
- float Ix2 = sqr(dot(I, X)), Iz2 = sqr(dot(I, Ng));
- float Ix2Iz2 = Ix2 + Iz2;
-
- float a = sqrt(Ix2*(Ix2Iz2 - sqr(0.05)));
- float b = Iz*0.05 + Ix2Iz2;
- float c = (a + b > 0.0)? (a + b) : (-a + b);
+ float Ix2 = sqr(Ix), Iz2 = sqr(Iz);
+ float a = Ix2 + Iz2;
+
+ float b = sqrt(Ix2*(a - sqr(threshold)));
+ float c = Iz*threshold + a;
+
+ float fac = 0.5/a;
+ float N1_z2 = fac*(b+c), N2_z2 = fac*(-b+c);
+ int valid1 = (N1_z2 > 1e-5) && (N1_z2 <= (1.0 + 1e-5));
+ int valid2 = (N2_z2 > 1e-5) && (N2_z2 <= (1.0 + 1e-5));
+
+ float N_new_x, N_new_z;
+ if(valid1 && valid2) {
+ float N1_x = sqrt(1.0 - N1_z2), N1_z = sqrt(N1_z2);
+ float N2_x = sqrt(1.0 - N2_z2), N2_z = sqrt(N2_z2);
+
+ float R1 = 2*(N1_x*Ix + N1_z*Iz)*N1_z - Iz;
+ float R2 = 2*(N2_x*Ix + N2_z*Iz)*N2_z - Iz;
+
+ valid1 = (R1 >= 1e-5);
+ valid2 = (R2 >= 1e-5);
+ if(valid1 && valid2) {
+ N_new_x = (R1 < R2)? N1_x : N2_x;
+ N_new_z = (R1 < R2)? N1_z : N2_z;
+ }
+ else {
+ N_new_x = (R1 > R2)? N1_x : N2_x;
+ N_new_z = (R1 > R2)? N1_z : N2_z;
+ }
- float Nz = sqrt(0.5 * c * (1.0 / Ix2Iz2));
- float Nx = sqrt(1.0 - sqr(Nz));
+ }
+ else if(valid1 || valid2) {
+ float Nz2 = valid1? N1_z2 : N2_z2;
+ N_new_x = sqrt(1.0 - Nz2);
+ N_new_z = sqrt(Nz2);
+ }
+ else {
+ return Ng;
+ }
- /* Transform back into global coordinates. */
- return Nx*X + Nz*Ng;
+ return N_new_x*X + N_new_z*Ng;
}
@@ -485,7 +515,7 @@ float smooth_linearstep (float edge0, float edge1, float x_, float eps_) {
else if (x >= eps && x <= 1.0-eps) result = x;
else if (x >= 1.0+eps) result = 1;
else if (x < eps) result = rampup (x+eps, 2.0*eps);
- else /* if (x < 1.0+eps) */ result = 1.0 - rampup (1.0+eps - x, 2.0*eps);
+ else /* if (x < 1.0+eps) */ result = 1.0 - rampup (1.0+eps - x, 2.0*eps);
} else {
result = step (edge0, x_);
}
@@ -656,4 +686,4 @@ int getmatrix (string fromspace, output matrix M) {
#undef PERCOMP2
#undef PERCOMP2F
-#endif /* CCL_STDOSL_H */
+#endif /* CCL_STDOSL_H */
diff --git a/intern/cycles/kernel/split/kernel_buffer_update.h b/intern/cycles/kernel/split/kernel_buffer_update.h
index 180c0b57077..18eec6372f1 100644
--- a/intern/cycles/kernel/split/kernel_buffer_update.h
+++ b/intern/cycles/kernel/split/kernel_buffer_update.h
@@ -80,8 +80,10 @@ ccl_device void kernel_buffer_update(KernelGlobals *kg,
PathRadiance *L = &kernel_split_state.path_radiance[ray_index];
ccl_global Ray *ray = &kernel_split_state.ray[ray_index];
ccl_global float3 *throughput = &kernel_split_state.throughput[ray_index];
+ bool ray_was_updated = false;
if(IS_STATE(ray_state, ray_index, RAY_UPDATE_BUFFER)) {
+ ray_was_updated = true;
uint sample = state->sample;
uint buffer_offset = kernel_split_state.buffer_offset[ray_index];
ccl_global float *buffer = kernel_split_params.tile.buffer + buffer_offset;
@@ -92,6 +94,17 @@ ccl_device void kernel_buffer_update(KernelGlobals *kg,
ASSIGN_RAY_STATE(ray_state, ray_index, RAY_TO_REGENERATE);
}
+ if(kernel_data.film.cryptomatte_passes) {
+ /* Make sure no thread is writing to the buffers. */
+ ccl_barrier(CCL_LOCAL_MEM_FENCE);
+ if(ray_was_updated && state->sample - 1 == kernel_data.integrator.aa_samples) {
+ uint buffer_offset = kernel_split_state.buffer_offset[ray_index];
+ ccl_global float *buffer = kernel_split_params.tile.buffer + buffer_offset;
+ ccl_global float *cryptomatte_buffer = buffer + kernel_data.film.pass_cryptomatte;
+ kernel_sort_id_slots(cryptomatte_buffer, 2 * kernel_data.film.cryptomatte_depth);
+ }
+ }
+
if(IS_STATE(ray_state, ray_index, RAY_TO_REGENERATE)) {
/* We have completed current work; So get next work */
ccl_global uint *work_pools = kernel_split_params.work_pools;
diff --git a/intern/cycles/kernel/split/kernel_shader_sort.h b/intern/cycles/kernel/split/kernel_shader_sort.h
index 2132c42220f..666355de334 100644
--- a/intern/cycles/kernel/split/kernel_shader_sort.h
+++ b/intern/cycles/kernel/split/kernel_shader_sort.h
@@ -78,7 +78,7 @@ ccl_device void kernel_shader_sort(KernelGlobals *kg,
}
}
}
-# endif /* __KERNEL_OPENCL__ */
+# endif /* __KERNEL_OPENCL__ */
/* copy to destination */
for(uint i = 0; i < SHADER_SORT_BLOCK_SIZE; i += SHADER_SORT_LOCAL_SIZE) {
@@ -91,7 +91,7 @@ ccl_device void kernel_shader_sort(KernelGlobals *kg,
kernel_split_state.queue_data[outi] = (value == (~0)) ? QUEUE_EMPTY_SLOT : kernel_split_state.queue_data[ini];
}
}
-#endif /* __KERNEL_CUDA__ */
+#endif /* __KERNEL_CUDA__ */
}
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/split/kernel_split_data.h b/intern/cycles/kernel/split/kernel_split_data.h
index 9297e1e0ad5..3f6b3977d79 100644
--- a/intern/cycles/kernel/split/kernel_split_data.h
+++ b/intern/cycles/kernel/split/kernel_split_data.h
@@ -24,7 +24,7 @@ CCL_NAMESPACE_BEGIN
ccl_device_inline uint64_t split_data_buffer_size(KernelGlobals *kg, size_t num_elements)
{
- (void)kg; /* Unused on CPU. */
+ (void) kg; /* Unused on CPU. */
uint64_t size = 0;
#define SPLIT_DATA_ENTRY(type, name, num) + align_up(num_elements * num * sizeof(type), 16)
@@ -48,7 +48,7 @@ ccl_device_inline void split_data_init(KernelGlobals *kg,
ccl_global void *data,
ccl_global char *ray_state)
{
- (void)kg; /* Unused on CPU. */
+ (void) kg; /* Unused on CPU. */
ccl_global char *p = (ccl_global char*)data;
diff --git a/intern/cycles/kernel/split/kernel_split_data_types.h b/intern/cycles/kernel/split/kernel_split_data_types.h
index 56194d9f857..83df1e2a0a6 100644
--- a/intern/cycles/kernel/split/kernel_split_data_types.h
+++ b/intern/cycles/kernel/split/kernel_split_data_types.h
@@ -86,14 +86,14 @@ typedef ccl_global struct SplitBranchedState {
SPLIT_DATA_ENTRY(ccl_global SubsurfaceIndirectRays, ss_rays, 1)
#else
# define SPLIT_DATA_SUBSURFACE_ENTRIES
-#endif /* __SUBSURFACE__ */
+#endif /* __SUBSURFACE__ */
#ifdef __VOLUME__
# define SPLIT_DATA_VOLUME_ENTRIES \
SPLIT_DATA_ENTRY(ccl_global PathState, state_shadow, 1)
#else
# define SPLIT_DATA_VOLUME_ENTRIES
-#endif /* __VOLUME__ */
+#endif /* __VOLUME__ */
#define SPLIT_DATA_ENTRIES \
SPLIT_DATA_ENTRY(ccl_global float3, throughput, 1) \
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index ab69afa051e..ccb9aef7a5b 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -313,7 +313,7 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_a
case NODE_LEAVE_BUMP_EVAL:
svm_node_leave_bump_eval(kg, sd, stack, node.y);
break;
-# endif /* NODES_FEATURE(NODE_FEATURE_BUMP_STATE) */
+# endif /* NODES_FEATURE(NODE_FEATURE_BUMP_STATE) */
# endif /* NODES_FEATURE(NODE_FEATURE_BUMP) */
case NODE_HSV:
svm_node_hsv(kg, sd, stack, node, &offset);
@@ -497,4 +497,4 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_a
CCL_NAMESPACE_END
-#endif /* __SVM_H__ */
+#endif /* __SVM_H__ */
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
index cce0e0eefe0..e834d75c513 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -258,39 +258,36 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
float3 spec_weight = weight * specular_weight;
MicrofacetBsdf *bsdf = (MicrofacetBsdf*)bsdf_alloc(sd, sizeof(MicrofacetBsdf), spec_weight);
- if(!bsdf) {
- break;
- }
-
- MicrofacetExtra *extra = (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra));
- if(!extra) {
- break;
- }
+ MicrofacetExtra *extra = (bsdf != NULL)
+ ? (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra))
+ : NULL;
- bsdf->N = N;
- bsdf->ior = (2.0f / (1.0f - safe_sqrtf(0.08f * specular))) - 1.0f;
- bsdf->T = T;
- bsdf->extra = extra;
+ if (bsdf && extra) {
+ bsdf->N = N;
+ bsdf->ior = (2.0f / (1.0f - safe_sqrtf(0.08f * specular))) - 1.0f;
+ bsdf->T = T;
+ bsdf->extra = extra;
- float aspect = safe_sqrtf(1.0f - anisotropic * 0.9f);
- float r2 = roughness * roughness;
+ float aspect = safe_sqrtf(1.0f - anisotropic * 0.9f);
+ float r2 = roughness * roughness;
- bsdf->alpha_x = r2 / aspect;
- bsdf->alpha_y = r2 * aspect;
+ bsdf->alpha_x = r2 / aspect;
+ bsdf->alpha_y = r2 * aspect;
- float m_cdlum = 0.3f * base_color.x + 0.6f * base_color.y + 0.1f * base_color.z; // luminance approx.
- float3 m_ctint = m_cdlum > 0.0f ? base_color / m_cdlum : make_float3(0.0f, 0.0f, 0.0f); // normalize lum. to isolate hue+sat
- float3 tmp_col = make_float3(1.0f, 1.0f, 1.0f) * (1.0f - specular_tint) + m_ctint * specular_tint;
+ float m_cdlum = 0.3f * base_color.x + 0.6f * base_color.y + 0.1f * base_color.z; // luminance approx.
+ float3 m_ctint = m_cdlum > 0.0f ? base_color / m_cdlum : make_float3(0.0f, 0.0f, 0.0f); // normalize lum. to isolate hue+sat
+ float3 tmp_col = make_float3(1.0f, 1.0f, 1.0f) * (1.0f - specular_tint) + m_ctint * specular_tint;
- bsdf->extra->cspec0 = (specular * 0.08f * tmp_col) * (1.0f - metallic) + base_color * metallic;
- bsdf->extra->color = base_color;
- bsdf->extra->clearcoat = 0.0f;
+ bsdf->extra->cspec0 = (specular * 0.08f * tmp_col) * (1.0f - metallic) + base_color * metallic;
+ bsdf->extra->color = base_color;
+ bsdf->extra->clearcoat = 0.0f;
- /* setup bsdf */
- if(distribution == CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID || roughness <= 0.075f) /* use single-scatter GGX */
- sd->flag |= bsdf_microfacet_ggx_aniso_fresnel_setup(bsdf, sd);
- else /* use multi-scatter GGX */
- sd->flag |= bsdf_microfacet_multi_ggx_aniso_fresnel_setup(bsdf, sd);
+ /* setup bsdf */
+ if(distribution == CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID || roughness <= 0.075f) /* use single-scatter GGX */
+ sd->flag |= bsdf_microfacet_ggx_aniso_fresnel_setup(bsdf, sd);
+ else /* use multi-scatter GGX */
+ sd->flag |= bsdf_microfacet_multi_ggx_aniso_fresnel_setup(bsdf, sd);
+ }
}
#ifdef __CAUSTICS_TRICKS__
}
@@ -313,29 +310,26 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
#endif
{
MicrofacetBsdf *bsdf = (MicrofacetBsdf*)bsdf_alloc(sd, sizeof(MicrofacetBsdf), glass_weight*fresnel);
- if(!bsdf) {
- break;
- }
-
- MicrofacetExtra *extra = (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra));
- if(!extra) {
- break;
- }
+ MicrofacetExtra *extra = (bsdf != NULL)
+ ? (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra))
+ : NULL;
- bsdf->N = N;
- bsdf->T = make_float3(0.0f, 0.0f, 0.0f);
- bsdf->extra = extra;
+ if (bsdf && extra) {
+ bsdf->N = N;
+ bsdf->T = make_float3(0.0f, 0.0f, 0.0f);
+ bsdf->extra = extra;
- bsdf->alpha_x = refl_roughness * refl_roughness;
- bsdf->alpha_y = refl_roughness * refl_roughness;
- bsdf->ior = ior;
+ bsdf->alpha_x = refl_roughness * refl_roughness;
+ bsdf->alpha_y = refl_roughness * refl_roughness;
+ bsdf->ior = ior;
- bsdf->extra->color = base_color;
- bsdf->extra->cspec0 = cspec0;
- bsdf->extra->clearcoat = 0.0f;
+ bsdf->extra->color = base_color;
+ bsdf->extra->cspec0 = cspec0;
+ bsdf->extra->clearcoat = 0.0f;
- /* setup bsdf */
- sd->flag |= bsdf_microfacet_ggx_fresnel_setup(bsdf, sd);
+ /* setup bsdf */
+ sd->flag |= bsdf_microfacet_ggx_fresnel_setup(bsdf, sd);
+ }
}
/* refraction */
@@ -344,52 +338,47 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
#endif
{
MicrofacetBsdf *bsdf = (MicrofacetBsdf*)bsdf_alloc(sd, sizeof(MicrofacetBsdf), base_color*glass_weight*(1.0f - fresnel));
- if(!bsdf) {
- break;
+ if(bsdf) {
+ bsdf->N = N;
+ bsdf->T = make_float3(0.0f, 0.0f, 0.0f);
+ bsdf->extra = NULL;
+
+ if(distribution == CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID)
+ transmission_roughness = 1.0f - (1.0f - refl_roughness) * (1.0f - transmission_roughness);
+ else
+ transmission_roughness = refl_roughness;
+
+ bsdf->alpha_x = transmission_roughness * transmission_roughness;
+ bsdf->alpha_y = transmission_roughness * transmission_roughness;
+ bsdf->ior = ior;
+
+ /* setup bsdf */
+ sd->flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
}
-
- bsdf->N = N;
- bsdf->T = make_float3(0.0f, 0.0f, 0.0f);
- bsdf->extra = NULL;
-
- if(distribution == CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID)
- transmission_roughness = 1.0f - (1.0f - refl_roughness) * (1.0f - transmission_roughness);
- else
- transmission_roughness = refl_roughness;
-
- bsdf->alpha_x = transmission_roughness * transmission_roughness;
- bsdf->alpha_y = transmission_roughness * transmission_roughness;
- bsdf->ior = ior;
-
- /* setup bsdf */
- sd->flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
}
}
else { /* use multi-scatter GGX */
MicrofacetBsdf *bsdf = (MicrofacetBsdf*)bsdf_alloc(sd, sizeof(MicrofacetBsdf), glass_weight);
- if(!bsdf) {
- break;
- }
-
- MicrofacetExtra *extra = (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra));
- if(!extra) {
- break;
- }
+ MicrofacetExtra *extra = (bsdf != NULL)
+ ? (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra))
+ : NULL;
- bsdf->N = N;
- bsdf->extra = extra;
- bsdf->T = make_float3(0.0f, 0.0f, 0.0f);
+ if(bsdf && extra) {
+ bsdf->N = N;
+ bsdf->extra = extra;
+ bsdf->T = make_float3(0.0f, 0.0f, 0.0f);
- bsdf->alpha_x = roughness * roughness;
- bsdf->alpha_y = roughness * roughness;
- bsdf->ior = ior;
+ bsdf->alpha_x = roughness * roughness;
+ bsdf->alpha_y = roughness * roughness;
+ bsdf->ior = ior;
- bsdf->extra->color = base_color;
- bsdf->extra->cspec0 = cspec0;
- bsdf->extra->clearcoat = 0.0f;
+ bsdf->extra->color = base_color;
+ bsdf->extra->cspec0 = cspec0;
+ bsdf->extra->clearcoat = 0.0f;
- /* setup bsdf */
- sd->flag |= bsdf_microfacet_multi_ggx_glass_fresnel_setup(bsdf, sd);
+ /* setup bsdf */
+ sd->flag |= bsdf_microfacet_multi_ggx_glass_fresnel_setup(bsdf, sd);
+ }
}
}
#ifdef __CAUSTICS_TRICKS__
@@ -402,29 +391,26 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
#endif
if(clearcoat > CLOSURE_WEIGHT_CUTOFF) {
MicrofacetBsdf *bsdf = (MicrofacetBsdf*)bsdf_alloc(sd, sizeof(MicrofacetBsdf), weight);
- if(!bsdf) {
- break;
- }
+ MicrofacetExtra *extra = (bsdf != NULL)
+ ? (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra))
+ : NULL;
- MicrofacetExtra *extra = (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra));
- if(!extra) {
- break;
- }
-
- bsdf->N = clearcoat_normal;
- bsdf->T = make_float3(0.0f, 0.0f, 0.0f);
- bsdf->ior = 1.5f;
- bsdf->extra = extra;
+ if(bsdf && extra) {
+ bsdf->N = clearcoat_normal;
+ bsdf->T = make_float3(0.0f, 0.0f, 0.0f);
+ bsdf->ior = 1.5f;
+ bsdf->extra = extra;
- bsdf->alpha_x = clearcoat_roughness * clearcoat_roughness;
- bsdf->alpha_y = clearcoat_roughness * clearcoat_roughness;
+ bsdf->alpha_x = clearcoat_roughness * clearcoat_roughness;
+ bsdf->alpha_y = clearcoat_roughness * clearcoat_roughness;
- bsdf->extra->color = make_float3(0.0f, 0.0f, 0.0f);
- bsdf->extra->cspec0 = make_float3(0.04f, 0.04f, 0.04f);
- bsdf->extra->clearcoat = clearcoat;
+ bsdf->extra->color = make_float3(0.0f, 0.0f, 0.0f);
+ bsdf->extra->cspec0 = make_float3(0.04f, 0.04f, 0.04f);
+ bsdf->extra->clearcoat = clearcoat;
- /* setup bsdf */
- sd->flag |= bsdf_microfacet_ggx_clearcoat_setup(bsdf, sd);
+ /* setup bsdf */
+ sd->flag |= bsdf_microfacet_ggx_clearcoat_setup(bsdf, sd);
+ }
}
#ifdef __CAUSTICS_TRICKS__
}
diff --git a/intern/cycles/kernel/svm/svm_hsv.h b/intern/cycles/kernel/svm/svm_hsv.h
index 27127b85323..41538d1138d 100644
--- a/intern/cycles/kernel/svm/svm_hsv.h
+++ b/intern/cycles/kernel/svm/svm_hsv.h
@@ -59,4 +59,4 @@ ccl_device void svm_node_hsv(KernelGlobals *kg, ShaderData *sd, float *stack, ui
CCL_NAMESPACE_END
-#endif /* __SVM_HSV_H__ */
+#endif /* __SVM_HSV_H__ */
diff --git a/intern/cycles/kernel/svm/svm_ramp.h b/intern/cycles/kernel/svm/svm_ramp.h
index a3e4b6e87cd..6f39391057e 100644
--- a/intern/cycles/kernel/svm/svm_ramp.h
+++ b/intern/cycles/kernel/svm/svm_ramp.h
@@ -108,4 +108,4 @@ ccl_device void svm_node_curves(KernelGlobals *kg, ShaderData *sd, float *stack,
CCL_NAMESPACE_END
-#endif /* __SVM_RAMP_H__ */
+#endif /* __SVM_RAMP_H__ */
diff --git a/intern/cycles/kernel/svm/svm_ramp_util.h b/intern/cycles/kernel/svm/svm_ramp_util.h
index a67689ff9d1..847108ff1c2 100644
--- a/intern/cycles/kernel/svm/svm_ramp_util.h
+++ b/intern/cycles/kernel/svm/svm_ramp_util.h
@@ -95,4 +95,4 @@ ccl_device float float_ramp_lookup(const float *ramp,
CCL_NAMESPACE_END
-#endif /* __SVM_RAMP_UTIL_H__ */
+#endif /* __SVM_RAMP_UTIL_H__ */
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index 910537a2539..0f1dfa4936b 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -531,4 +531,4 @@ typedef enum ClosureType {
CCL_NAMESPACE_END
-#endif /* __SVM_TYPES_H__ */
+#endif /* __SVM_TYPES_H__ */
diff --git a/intern/cycles/kernel/svm/svm_wave.h b/intern/cycles/kernel/svm/svm_wave.h
index 7b60ab6e6ae..80b63dc80cd 100644
--- a/intern/cycles/kernel/svm/svm_wave.h
+++ b/intern/cycles/kernel/svm/svm_wave.h
@@ -24,7 +24,7 @@ ccl_device_noinline float svm_wave(NodeWaveType type, NodeWaveProfile profile, f
if(type == NODE_WAVE_BANDS)
n = (p.x + p.y + p.z) * 10.0f;
- else /* NODE_WAVE_RINGS */
+ else /* NODE_WAVE_RINGS */
n = len(p) * 20.0f;
if(distortion != 0.0f)
diff --git a/intern/cycles/render/CMakeLists.txt b/intern/cycles/render/CMakeLists.txt
index 7d2220f37f9..c0ce7368771 100644
--- a/intern/cycles/render/CMakeLists.txt
+++ b/intern/cycles/render/CMakeLists.txt
@@ -15,6 +15,7 @@ set(SRC
buffers.cpp
camera.cpp
constant_fold.cpp
+ coverage.cpp
film.cpp
graph.cpp
image.cpp
@@ -46,6 +47,7 @@ set(SRC_HEADERS
buffers.h
camera.h
constant_fold.h
+ coverage.h
film.h
graph.h
image.h
diff --git a/intern/cycles/render/attribute.h b/intern/cycles/render/attribute.h
index 40e5be2e1b2..e7438f4513d 100644
--- a/intern/cycles/render/attribute.h
+++ b/intern/cycles/render/attribute.h
@@ -172,4 +172,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __ATTRIBUTE_H__ */
+#endif /* __ATTRIBUTE_H__ */
diff --git a/intern/cycles/render/background.h b/intern/cycles/render/background.h
index 3f56dedb2c8..17c3eaaaaf5 100644
--- a/intern/cycles/render/background.h
+++ b/intern/cycles/render/background.h
@@ -59,4 +59,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __BACKGROUND_H__ */
+#endif /* __BACKGROUND_H__ */
diff --git a/intern/cycles/render/bake.h b/intern/cycles/render/bake.h
index a811eac3327..fce8f2fa606 100644
--- a/intern/cycles/render/bake.h
+++ b/intern/cycles/render/bake.h
@@ -83,4 +83,4 @@ private:
CCL_NAMESPACE_END
-#endif /* __BAKE_H__ */
+#endif /* __BAKE_H__ */
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index de2b38340e9..b4e3c18e894 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -147,7 +147,7 @@ bool RenderBuffers::copy_from_device()
return true;
}
-bool RenderBuffers::get_denoising_pass_rect(int offset, float exposure, int sample, int components, float *pixels)
+bool RenderBuffers::get_denoising_pass_rect(int type, float exposure, int sample, int components, float *pixels)
{
if(buffer.data() == NULL) {
return false;
@@ -155,19 +155,20 @@ bool RenderBuffers::get_denoising_pass_rect(int offset, float exposure, int samp
float invsample = 1.0f/sample;
float scale = invsample;
- bool variance = (offset == DENOISING_PASS_NORMAL_VAR) ||
- (offset == DENOISING_PASS_ALBEDO_VAR) ||
- (offset == DENOISING_PASS_DEPTH_VAR) ||
- (offset == DENOISING_PASS_COLOR_VAR);
-
- if(offset == DENOISING_PASS_COLOR || offset == DENOISING_PASS_CLEAN) {
- scale *= exposure;
+ bool variance = (type == DENOISING_PASS_NORMAL_VAR) ||
+ (type == DENOISING_PASS_ALBEDO_VAR) ||
+ (type == DENOISING_PASS_DEPTH_VAR) ||
+ (type == DENOISING_PASS_COLOR_VAR);
+
+ float scale_exposure = scale;
+ if(type == DENOISING_PASS_COLOR || type == DENOISING_PASS_CLEAN) {
+ scale_exposure *= exposure;
}
- else if(offset == DENOISING_PASS_COLOR_VAR) {
- scale *= exposure*exposure;
+ else if(type == DENOISING_PASS_COLOR_VAR) {
+ scale_exposure *= exposure*exposure;
}
- offset += params.get_denoising_offset();
+ int offset = type + params.get_denoising_offset();
int pass_stride = params.get_passes_size();
int size = params.width*params.height;
@@ -181,14 +182,14 @@ bool RenderBuffers::get_denoising_pass_rect(int offset, float exposure, int samp
if(components == 1) {
for(int i = 0; i < size; i++, mean += pass_stride, var += pass_stride, pixels++) {
- pixels[0] = max(0.0f, var[0] - mean[0]*mean[0]*invsample)*scale;
+ pixels[0] = max(0.0f, var[0] - mean[0]*mean[0]*invsample)*scale_exposure;
}
}
else if(components == 3) {
for(int i = 0; i < size; i++, mean += pass_stride, var += pass_stride, pixels += 3) {
- pixels[0] = max(0.0f, var[0] - mean[0]*mean[0]*invsample)*scale;
- pixels[1] = max(0.0f, var[1] - mean[1]*mean[1]*invsample)*scale;
- pixels[2] = max(0.0f, var[2] - mean[2]*mean[2]*invsample)*scale;
+ pixels[0] = max(0.0f, var[0] - mean[0]*mean[0]*invsample)*scale_exposure;
+ pixels[1] = max(0.0f, var[1] - mean[1]*mean[1]*invsample)*scale_exposure;
+ pixels[2] = max(0.0f, var[2] - mean[2]*mean[2]*invsample)*scale_exposure;
}
}
else {
@@ -200,14 +201,28 @@ bool RenderBuffers::get_denoising_pass_rect(int offset, float exposure, int samp
if(components == 1) {
for(int i = 0; i < size; i++, in += pass_stride, pixels++) {
- pixels[0] = in[0]*scale;
+ pixels[0] = in[0]*scale_exposure;
}
}
else if(components == 3) {
for(int i = 0; i < size; i++, in += pass_stride, pixels += 3) {
- pixels[0] = in[0]*scale;
- pixels[1] = in[1]*scale;
- pixels[2] = in[2]*scale;
+ pixels[0] = in[0]*scale_exposure;
+ pixels[1] = in[1]*scale_exposure;
+ pixels[2] = in[2]*scale_exposure;
+ }
+ }
+ else if(components == 4) {
+ assert(type == DENOISING_PASS_COLOR);
+
+ /* Since the alpha channel is not involved in denoising, output the Combined alpha channel. */
+ assert(params.passes[0].type == PASS_COMBINED);
+ float *in_combined = buffer.data();
+
+ for(int i = 0; i < size; i++, in += pass_stride, in_combined += pass_stride, pixels += 4) {
+ pixels[0] = in[0]*scale_exposure;
+ pixels[1] = in[1]*scale_exposure;
+ pixels[2] = in[2]*scale_exposure;
+ pixels[3] = saturate(in_combined[3]*scale);
}
}
else {
@@ -218,7 +233,7 @@ bool RenderBuffers::get_denoising_pass_rect(int offset, float exposure, int samp
return true;
}
-bool RenderBuffers::get_pass_rect(PassType type, float exposure, int sample, int components, float *pixels)
+bool RenderBuffers::get_pass_rect(PassType type, float exposure, int sample, int components, float *pixels, const string &name)
{
if(buffer.data() == NULL) {
return false;
@@ -234,6 +249,14 @@ bool RenderBuffers::get_pass_rect(PassType type, float exposure, int sample, int
continue;
}
+ /* Tell Cryptomatte passes apart by their name. */
+ if(pass.type == PASS_CRYPTOMATTE) {
+ if(pass.name != name) {
+ pass_offset += pass.components;
+ continue;
+ }
+ }
+
float *in = buffer.data() + pass_offset;
int pass_stride = params.get_passes_size();
@@ -370,6 +393,17 @@ bool RenderBuffers::get_pass_rect(PassType type, float exposure, int sample, int
pixels[3] = f.w*invw;
}
}
+ else if(type == PASS_CRYPTOMATTE) {
+ for(int i = 0; i < size; i++, in += pass_stride, pixels += 4) {
+ float4 f = make_float4(in[0], in[1], in[2], in[3]);
+ /* x and z contain integer IDs, don't rescale them.
+ y and w contain matte weights, they get scaled. */
+ pixels[0] = f.x;
+ pixels[1] = f.y * scale;
+ pixels[2] = f.z;
+ pixels[3] = f.w * scale;
+ }
+ }
else {
for(int i = 0; i < size; i++, in += pass_stride, pixels += 4) {
float4 f = make_float4(in[0], in[1], in[2], in[3]);
diff --git a/intern/cycles/render/buffers.h b/intern/cycles/render/buffers.h
index 1b06ffe33a6..46c3b89bd84 100644
--- a/intern/cycles/render/buffers.h
+++ b/intern/cycles/render/buffers.h
@@ -50,7 +50,7 @@ public:
int full_height;
/* passes */
- array<Pass> passes;
+ vector<Pass> passes;
bool denoising_data_pass;
/* If only some light path types should be denoised, an additional pass is needed. */
bool denoising_clean_pass;
@@ -84,7 +84,7 @@ public:
void zero();
bool copy_from_device();
- bool get_pass_rect(PassType type, float exposure, int sample, int components, float *pixels);
+ bool get_pass_rect(PassType type, float exposure, int sample, int components, float *pixels, const string &name);
bool get_denoising_pass_rect(int offset, float exposure, int sample, int components, float *pixels);
};
@@ -146,4 +146,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __BUFFERS_H__ */
+#endif /* __BUFFERS_H__ */
diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp
index cc3dd1c923b..34066e1b024 100644
--- a/intern/cycles/render/camera.cpp
+++ b/intern/cycles/render/camera.cpp
@@ -716,7 +716,7 @@ float Camera::world_to_raster_size(float3 P)
float3 D = transform_point(&worldtocamera, P);
float dist = len(D);
- Ray ray;
+ Ray ray = {{0}};
/* Distortion can become so great that the results become meaningless, there
* may be a better way to do this, but calculating differentials from the
diff --git a/intern/cycles/render/camera.h b/intern/cycles/render/camera.h
index 323f2c61ca4..37f5dea624f 100644
--- a/intern/cycles/render/camera.h
+++ b/intern/cycles/render/camera.h
@@ -21,6 +21,7 @@
#include "graph/node.h"
+#include "util/util_array.h"
#include "util/util_boundbox.h"
#include "util/util_projection.h"
#include "util/util_transform.h"
@@ -212,4 +213,4 @@ private:
CCL_NAMESPACE_END
-#endif /* __CAMERA_H__ */
+#endif /* __CAMERA_H__ */
diff --git a/intern/cycles/render/constant_fold.h b/intern/cycles/render/constant_fold.h
index 26fa4e8b1c8..6ec94b055e3 100644
--- a/intern/cycles/render/constant_fold.h
+++ b/intern/cycles/render/constant_fold.h
@@ -70,4 +70,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __CONSTANT_FOLD_H__ */
+#endif /* __CONSTANT_FOLD_H__ */
diff --git a/intern/cycles/render/coverage.cpp b/intern/cycles/render/coverage.cpp
new file mode 100644
index 00000000000..72ef4cda3ff
--- /dev/null
+++ b/intern/cycles/render/coverage.cpp
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2018 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "render/coverage.h"
+#include "kernel/kernel_compat_cpu.h"
+#include "kernel/split/kernel_split_data.h"
+#include "kernel/kernel_globals.h"
+#include "kernel/kernel_id_passes.h"
+#include "kernel/kernel_types.h"
+#include "util/util_map.h"
+#include "util/util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+static bool crypomatte_comp(const pair<float, float>& i, const pair<float, float> j) { return i.first > j.first; }
+
+void Coverage::finalize()
+{
+ int pass_offset = 0;
+ if(kernel_data.film.cryptomatte_passes & CRYPT_OBJECT) {
+ finalize_buffer(coverage_object, pass_offset);
+ pass_offset += kernel_data.film.cryptomatte_depth * 4;
+ }
+ if(kernel_data.film.cryptomatte_passes & CRYPT_MATERIAL) {
+ finalize_buffer(coverage_material, pass_offset);
+ pass_offset += kernel_data.film.cryptomatte_depth * 4;
+ }
+ if(kernel_data.film.cryptomatte_passes & CRYPT_ASSET) {
+ finalize_buffer(coverage_asset, pass_offset);
+ }
+}
+
+void Coverage::init_path_trace()
+{
+ kg->coverage_object = kg->coverage_material = kg->coverage_asset = NULL;
+
+ if(kernel_data.film.cryptomatte_passes & CRYPT_ACCURATE) {
+ if(kernel_data.film.cryptomatte_passes & CRYPT_OBJECT) {
+ coverage_object.clear();
+ coverage_object.resize(tile.w * tile.h);
+ }
+ if(kernel_data.film.cryptomatte_passes & CRYPT_MATERIAL) {
+ coverage_material.clear();
+ coverage_material.resize(tile.w * tile.h);
+ }
+ if(kernel_data.film.cryptomatte_passes & CRYPT_ASSET) {
+ coverage_asset.clear();
+ coverage_asset.resize(tile.w * tile.h);
+ }
+ }
+}
+
+void Coverage::init_pixel(int x, int y)
+{
+ if(kernel_data.film.cryptomatte_passes & CRYPT_ACCURATE) {
+ const int pixel_index = tile.w * (y - tile.y) + x - tile.x;
+ if(kernel_data.film.cryptomatte_passes & CRYPT_OBJECT) {
+ kg->coverage_object = &coverage_object[pixel_index];
+ }
+ if(kernel_data.film.cryptomatte_passes & CRYPT_MATERIAL) {
+ kg->coverage_material = &coverage_material[pixel_index];
+ }
+ if(kernel_data.film.cryptomatte_passes & CRYPT_ASSET) {
+ kg->coverage_asset = &coverage_asset[pixel_index];
+ }
+ }
+}
+
+void Coverage::finalize_buffer(vector<CoverageMap> & coverage, const int pass_offset)
+{
+ if(kernel_data.film.cryptomatte_passes & CRYPT_ACCURATE) {
+ flatten_buffer(coverage, pass_offset);
+ }
+ else {
+ sort_buffer(pass_offset);
+ }
+}
+
+void Coverage::flatten_buffer(vector<CoverageMap> &coverage, const int pass_offset)
+{
+ /* Sort the coverage map and write it to the output */
+ int pixel_index = 0;
+ int pass_stride = tile.buffers->params.get_passes_size();
+ for(int y = 0; y < tile.h; ++y) {
+ for(int x = 0; x < tile.w; ++x) {
+ const CoverageMap& pixel = coverage[pixel_index];
+ if(!pixel.empty()) {
+ /* buffer offset */
+ int index = x + y * tile.stride;
+ float *buffer = (float*)tile.buffer + index*pass_stride;
+
+ /* sort the cryptomatte pixel */
+ vector<pair<float, float> > sorted_pixel;
+ for(CoverageMap::const_iterator it = pixel.begin(); it != pixel.end(); ++it) {
+ sorted_pixel.push_back(std::make_pair(it->second, it->first));
+ }
+ sort(sorted_pixel.begin(), sorted_pixel.end(), crypomatte_comp);
+ int num_slots = 2 * (kernel_data.film.cryptomatte_depth);
+ if(sorted_pixel.size() > num_slots) {
+ float leftover = 0.0f;
+ for(vector<pair<float, float> >::iterator it = sorted_pixel.begin()+num_slots; it != sorted_pixel.end(); ++it) {
+ leftover += it->first;
+ }
+ sorted_pixel[num_slots-1].first += leftover;
+ }
+ int limit = min(num_slots, sorted_pixel.size());
+ for(int i = 0; i < limit; ++i) {
+ kernel_write_id_slots(buffer + kernel_data.film.pass_cryptomatte + pass_offset, 2 * (kernel_data.film.cryptomatte_depth), sorted_pixel[i].second, sorted_pixel[i].first);
+ }
+ }
+ ++pixel_index;
+ }
+ }
+}
+
+void Coverage::sort_buffer(const int pass_offset)
+{
+ /* Sort the coverage map and write it to the output */
+ int pass_stride = tile.buffers->params.get_passes_size();
+ for(int y = 0; y < tile.h; ++y) {
+ for(int x = 0; x < tile.w; ++x) {
+ /* buffer offset */
+ int index = x + y*tile.stride;
+ float *buffer = (float*)tile.buffer + index*pass_stride;
+ kernel_sort_id_slots(buffer + kernel_data.film.pass_cryptomatte + pass_offset, 2 * (kernel_data.film.cryptomatte_depth));
+ }
+ }
+}
+
+CCL_NAMESPACE_END
diff --git a/intern/cycles/render/coverage.h b/intern/cycles/render/coverage.h
new file mode 100644
index 00000000000..9ee0bce7517
--- /dev/null
+++ b/intern/cycles/render/coverage.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2018 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "render/buffers.h"
+#include "kernel/kernel_compat_cpu.h"
+#include "kernel/split/kernel_split_data.h"
+#include "kernel/kernel_globals.h"
+#include "util/util_map.h"
+#include "util/util_vector.h"
+
+#ifndef __COVERAGE_H__
+#define __COVERAGE_H__
+
+CCL_NAMESPACE_BEGIN
+
+class Coverage {
+public:
+ Coverage(KernelGlobals *kg_, RenderTile &tile_) : kg(kg_), tile(tile_) { }
+ void init_path_trace();
+ void init_pixel(int x, int y);
+ void finalize();
+private:
+ vector<CoverageMap>coverage_object;
+ vector<CoverageMap>coverage_material;
+ vector<CoverageMap>coverage_asset;
+ KernelGlobals *kg;
+ RenderTile &tile;
+ void finalize_buffer(vector<CoverageMap>&coverage, const int pass_offset);
+ void flatten_buffer(vector<CoverageMap>&coverage, const int pass_offset);
+ void sort_buffer(const int pass_offset);
+};
+
+
+CCL_NAMESPACE_END
+
+#endif /* __COVERAGE_H__ */
diff --git a/intern/cycles/render/curves.h b/intern/cycles/render/curves.h
index 62066d8a809..cf75751c58f 100644
--- a/intern/cycles/render/curves.h
+++ b/intern/cycles/render/curves.h
@@ -17,8 +17,8 @@
#ifndef __CURVES_H__
#define __CURVES_H__
+#include "util/util_array.h"
#include "util/util_types.h"
-#include "util/util_vector.h"
CCL_NAMESPACE_BEGIN
@@ -119,4 +119,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __CURVES_H__ */
+#endif /* __CURVES_H__ */
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index 8f3596ade58..d0f15496e50 100644
--- a/intern/cycles/render/film.cpp
+++ b/intern/cycles/render/film.cpp
@@ -38,11 +38,14 @@ static bool compare_pass_order(const Pass& a, const Pass& b)
return (a.components > b.components);
}
-void Pass::add(PassType type, array<Pass>& passes)
+void Pass::add(PassType type, vector<Pass>& passes, const char *name)
{
- for(size_t i = 0; i < passes.size(); i++)
- if(passes[i].type == type)
+ for(size_t i = 0; i < passes.size(); i++) {
+ if(passes[i].type == type &&
+ (name ? (passes[i].name == name) : passes[i].name.empty())) {
return;
+ }
+ }
Pass pass;
@@ -50,6 +53,9 @@ void Pass::add(PassType type, array<Pass>& passes)
pass.filter = true;
pass.exposure = false;
pass.divide_type = PASS_NONE;
+ if(name) {
+ pass.name = name;
+ }
switch(type) {
case PASS_NONE:
@@ -155,13 +161,15 @@ void Pass::add(PassType type, array<Pass>& passes)
pass.components = 4;
pass.exposure = true;
break;
-
+ case PASS_CRYPTOMATTE:
+ pass.components = 4;
+ break;
default:
assert(false);
break;
}
- passes.push_back_slow(pass);
+ passes.push_back(pass);
/* order from by components, to ensure alignment so passes with size 4
* come first and then passes with size 1 */
@@ -171,19 +179,19 @@ void Pass::add(PassType type, array<Pass>& passes)
Pass::add(pass.divide_type, passes);
}
-bool Pass::equals(const array<Pass>& A, const array<Pass>& B)
+bool Pass::equals(const vector<Pass>& A, const vector<Pass>& B)
{
if(A.size() != B.size())
return false;
for(int i = 0; i < A.size(); i++)
- if(A[i].type != B[i].type)
+ if(A[i].type != B[i].type || A[i].name != B[i].name)
return false;
return true;
}
-bool Pass::contains(const array<Pass>& passes, PassType type)
+bool Pass::contains(const vector<Pass>& passes, PassType type)
{
for(size_t i = 0; i < passes.size(); i++)
if(passes[i].type == type)
@@ -290,6 +298,7 @@ Film::Film()
use_light_visibility = false;
filter_table_offset = TABLE_OFFSET_INVALID;
+ cryptomatte_passes = CRYPT_NONE;
need_update = true;
}
@@ -314,6 +323,8 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
kfilm->pass_stride = 0;
kfilm->use_light_pass = use_light_visibility || use_sample_clamp;
+ bool have_cryptomatte = false;
+
for(size_t i = 0; i < passes.size(); i++) {
Pass& pass = passes[i];
@@ -434,7 +445,10 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
#endif
case PASS_RENDER_TIME:
break;
-
+ case PASS_CRYPTOMATTE:
+ kfilm->pass_cryptomatte = have_cryptomatte ? min(kfilm->pass_cryptomatte, kfilm->pass_stride) : kfilm->pass_stride;
+ have_cryptomatte = true;
+ break;
default:
assert(false);
break;
@@ -471,6 +485,9 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
kfilm->mist_inv_depth = (mist_depth > 0.0f)? 1.0f/mist_depth: 0.0f;
kfilm->mist_falloff = mist_falloff;
+ kfilm->cryptomatte_passes = cryptomatte_passes;
+ kfilm->cryptomatte_depth = cryptomatte_depth;
+
pass_stride = kfilm->pass_stride;
denoising_data_offset = kfilm->pass_denoising_data;
denoising_clean_offset = kfilm->pass_denoising_clean;
@@ -490,7 +507,7 @@ bool Film::modified(const Film& film)
return !Node::equals(film) || !Pass::equals(passes, film.passes);
}
-void Film::tag_passes_update(Scene *scene, const array<Pass>& passes_)
+void Film::tag_passes_update(Scene *scene, const vector<Pass>& passes_)
{
if(Pass::contains(passes, PASS_UV) != Pass::contains(passes_, PASS_UV)) {
scene->mesh_manager->tag_update(scene);
diff --git a/intern/cycles/render/film.h b/intern/cycles/render/film.h
index 6ab2eea79b8..c597db4e4c5 100644
--- a/intern/cycles/render/film.h
+++ b/intern/cycles/render/film.h
@@ -45,10 +45,11 @@ public:
bool filter;
bool exposure;
PassType divide_type;
+ string name;
- static void add(PassType type, array<Pass>& passes);
- static bool equals(const array<Pass>& A, const array<Pass>& B);
- static bool contains(const array<Pass>& passes, PassType);
+ static void add(PassType type, vector<Pass>& passes, const char* name = NULL);
+ static bool equals(const vector<Pass>& A, const vector<Pass>& B);
+ static bool contains(const vector<Pass>& passes, PassType);
};
class Film : public Node {
@@ -56,7 +57,7 @@ public:
NODE_DECLARE
float exposure;
- array<Pass> passes;
+ vector<Pass> passes;
bool denoising_data_pass;
bool denoising_clean_pass;
int denoising_flags;
@@ -76,6 +77,8 @@ public:
bool use_light_visibility;
bool use_sample_clamp;
+ CryptomatteType cryptomatte_passes;
+ int cryptomatte_depth;
bool need_update;
@@ -86,10 +89,10 @@ public:
void device_free(Device *device, DeviceScene *dscene, Scene *scene);
bool modified(const Film& film);
- void tag_passes_update(Scene *scene, const array<Pass>& passes_);
+ void tag_passes_update(Scene *scene, const vector<Pass>& passes_);
void tag_update(Scene *scene);
};
CCL_NAMESPACE_END
-#endif /* __FILM_H__ */
+#endif /* __FILM_H__ */
diff --git a/intern/cycles/render/graph.h b/intern/cycles/render/graph.h
index 426522066b3..d14a59b4900 100644
--- a/intern/cycles/render/graph.h
+++ b/intern/cycles/render/graph.h
@@ -293,4 +293,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __GRAPH_H__ */
+#endif /* __GRAPH_H__ */
diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h
index 0bf06c322d0..5d4e99401b2 100644
--- a/intern/cycles/render/image.h
+++ b/intern/cycles/render/image.h
@@ -168,4 +168,4 @@ private:
CCL_NAMESPACE_END
-#endif /* __IMAGE_H__ */
+#endif /* __IMAGE_H__ */
diff --git a/intern/cycles/render/integrator.h b/intern/cycles/render/integrator.h
index f68400ac416..6a7e2056851 100644
--- a/intern/cycles/render/integrator.h
+++ b/intern/cycles/render/integrator.h
@@ -94,4 +94,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __INTEGRATOR_H__ */
+#endif /* __INTEGRATOR_H__ */
diff --git a/intern/cycles/render/light.h b/intern/cycles/render/light.h
index ec957c7cc68..b7f3a047ad7 100644
--- a/intern/cycles/render/light.h
+++ b/intern/cycles/render/light.h
@@ -140,4 +140,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __LIGHT_H__ */
+#endif /* __LIGHT_H__ */
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index ade575a52d6..5f884a3f871 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -39,6 +39,10 @@
#include "util/util_progress.h"
#include "util/util_set.h"
+#ifdef WITH_EMBREE
+# include "bvh/bvh_embree.h"
+#endif
+
CCL_NAMESPACE_BEGIN
/* Triangle */
@@ -1068,11 +1072,14 @@ void Mesh::compute_bvh(Device *device,
bparams.use_spatial_split = params->use_bvh_spatial_split;
bparams.bvh_layout = BVHParams::best_bvh_layout(
params->bvh_layout,
- device->info.bvh_layout_mask);
+ device->get_bvh_layout_mask());
bparams.use_unaligned_nodes = dscene->data.bvh.have_curves &&
params->use_bvh_unaligned_nodes;
bparams.num_motion_triangle_steps = params->num_bvh_time_steps;
bparams.num_motion_curve_steps = params->num_bvh_time_steps;
+ bparams.bvh_type = params->bvh_type;
+ bparams.curve_flags = dscene->data.curve.curveflags;
+ bparams.curve_subdivisions = dscene->data.curve.subdivisions;
delete bvh;
bvh = BVH::create(bparams, objects);
@@ -1284,9 +1291,9 @@ void MeshManager::update_osl_attributes(Device *device, Scene *scene, vector<Att
}
}
#else
- (void)device;
- (void)scene;
- (void)mesh_attributes;
+ (void) device;
+ (void) scene;
+ (void) mesh_attributes;
#endif
}
@@ -1855,20 +1862,38 @@ void MeshManager::device_update_bvh(Device *device, DeviceScene *dscene, Scene *
bparams.top_level = true;
bparams.bvh_layout = BVHParams::best_bvh_layout(
scene->params.bvh_layout,
- device->info.bvh_layout_mask);
+ device->get_bvh_layout_mask());
bparams.use_spatial_split = scene->params.use_bvh_spatial_split;
bparams.use_unaligned_nodes = dscene->data.bvh.have_curves &&
scene->params.use_bvh_unaligned_nodes;
bparams.num_motion_triangle_steps = scene->params.num_bvh_time_steps;
bparams.num_motion_curve_steps = scene->params.num_bvh_time_steps;
+ bparams.bvh_type = scene->params.bvh_type;
+ bparams.curve_flags = dscene->data.curve.curveflags;
+ bparams.curve_subdivisions = dscene->data.curve.subdivisions;
VLOG(1) << "Using " << bvh_layout_name(bparams.bvh_layout)
<< " layout.";
+#ifdef WITH_EMBREE
+ if(bparams.bvh_layout == BVH_LAYOUT_EMBREE) {
+ if(dscene->data.bvh.scene) {
+ BVHEmbree::destroy(dscene->data.bvh.scene);
+ }
+ }
+#endif
+
BVH *bvh = BVH::create(bparams, scene->objects);
- bvh->build(progress);
+ bvh->build(progress, &device->stats);
if(progress.get_cancel()) {
+#ifdef WITH_EMBREE
+ if(bparams.bvh_layout == BVH_LAYOUT_EMBREE) {
+ if(dscene->data.bvh.scene) {
+ BVHEmbree::destroy(dscene->data.bvh.scene);
+ }
+ }
+#endif
delete bvh;
return;
}
@@ -1923,6 +1948,16 @@ void MeshManager::device_update_bvh(Device *device, DeviceScene *dscene, Scene *
dscene->data.bvh.bvh_layout = bparams.bvh_layout;
dscene->data.bvh.use_bvh_steps = (scene->params.num_bvh_time_steps != 0);
+
+#ifdef WITH_EMBREE
+ if(bparams.bvh_layout == BVH_LAYOUT_EMBREE) {
+ dscene->data.bvh.scene = ((BVHEmbree*)bvh)->scene;
+ }
+ else {
+ dscene->data.bvh.scene = NULL;
+ }
+#endif
+
delete bvh;
}
@@ -2162,10 +2197,9 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen
num_bvh++;
}
}
- }
- /* TODO: properly handle cancel halfway displacement */
- if(progress.get_cancel()) return;
+ if(progress.get_cancel()) return;
+ }
/* Device re-update after displacement. */
if(displacement_done) {
@@ -2267,7 +2301,7 @@ void MeshManager::device_free(Device *device, DeviceScene *dscene)
og->object_names.clear();
}
#else
- (void)device;
+ (void) device;
#endif
}
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index 444f03a3664..7d36b2cd7ca 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -22,6 +22,7 @@
#include "render/attribute.h"
#include "render/shader.h"
+#include "util/util_array.h"
#include "util/util_boundbox.h"
#include "util/util_list.h"
#include "util/util_map.h"
@@ -390,4 +391,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __MESH_H__ */
+#endif /* __MESH_H__ */
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index c2cf13ad020..e77fb22f5ed 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -20,6 +20,7 @@
#include "render/graph.h"
#include "graph/node.h"
+#include "util/util_array.h"
#include "util/util_string.h"
CCL_NAMESPACE_BEGIN
@@ -1163,4 +1164,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __NODES_H__ */
+#endif /* __NODES_H__ */
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp
index e3f35c366d6..dc7a1043208 100644
--- a/intern/cycles/render/object.cpp
+++ b/intern/cycles/render/object.cpp
@@ -27,7 +27,9 @@
#include "util/util_logging.h"
#include "util/util_map.h"
#include "util/util_progress.h"
+#include "util/util_set.h"
#include "util/util_vector.h"
+#include "util/util_murmurhash.h"
#include "subd/subd_patch_table.h"
@@ -483,6 +485,10 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s
kobject.numverts = mesh->verts.size();
kobject.patch_map_offset = 0;
kobject.attribute_map_offset = 0;
+ uint32_t hash_name = util_murmur_hash3(ob->name.c_str(), ob->name.length(), 0);
+ uint32_t hash_asset = util_murmur_hash3(ob->asset_name.c_str(), ob->asset_name.length(), 0);
+ kobject.cryptomatte_object = util_hash_to_float(hash_name);
+ kobject.cryptomatte_asset = util_hash_to_float(hash_asset);
/* Object flag. */
if(ob->use_holdout) {
@@ -839,4 +845,37 @@ void ObjectManager::tag_update(Scene *scene)
scene->light_manager->need_update = true;
}
+string ObjectManager::get_cryptomatte_objects(Scene *scene)
+{
+ string manifest = "{";
+
+ unordered_set<ustring, ustringHash> objects;
+ foreach(Object *object, scene->objects) {
+ if(objects.count(object->name)) {
+ continue;
+ }
+ objects.insert(object->name);
+ uint32_t hash_name = util_murmur_hash3(object->name.c_str(), object->name.length(), 0);
+ manifest += string_printf("\"%s\":\"%08x\",", object->name.c_str(), hash_name);
+ }
+ manifest[manifest.size()-1] = '}';
+ return manifest;
+}
+
+string ObjectManager::get_cryptomatte_assets(Scene *scene)
+{
+ string manifest = "{";
+ unordered_set<ustring, ustringHash> assets;
+ foreach(Object *ob, scene->objects) {
+ if(assets.count(ob->asset_name)) {
+ continue;
+ }
+ assets.insert(ob->asset_name);
+ uint32_t hash_asset = util_murmur_hash3(ob->asset_name.c_str(), ob->asset_name.length(), 0);
+ manifest += string_printf("\"%s\":\"%08x\",", ob->asset_name.c_str(), hash_asset);
+ }
+ manifest[manifest.size()-1] = '}';
+ return manifest;
+}
+
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/object.h b/intern/cycles/render/object.h
index b80c4aef70b..87e6e6652ad 100644
--- a/intern/cycles/render/object.h
+++ b/intern/cycles/render/object.h
@@ -20,11 +20,13 @@
#include "graph/node.h"
#include "render/scene.h"
+#include "util/util_array.h"
#include "util/util_boundbox.h"
#include "util/util_param.h"
#include "util/util_transform.h"
#include "util/util_thread.h"
#include "util/util_types.h"
+#include "util/util_vector.h"
CCL_NAMESPACE_BEGIN
@@ -48,6 +50,7 @@ public:
BoundBox bounds;
uint random_id;
int pass_id;
+ ustring asset_name;
vector<ParamValue> attributes;
uint visibility;
array<Transform> motion;
@@ -115,6 +118,9 @@ public:
void apply_static_transforms(DeviceScene *dscene, Scene *scene, Progress& progress);
+ string get_cryptomatte_objects(Scene *scene);
+ string get_cryptomatte_assets(Scene *scene);
+
protected:
void device_update_object_transform(UpdateObjectTransformState *state,
Object *ob,
@@ -128,4 +134,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __OBJECT_H__ */
+#endif /* __OBJECT_H__ */
diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp
index 496e9d9491a..3fbc7d33a74 100644
--- a/intern/cycles/render/osl.cpp
+++ b/intern/cycles/render/osl.cpp
@@ -1255,6 +1255,6 @@ void OSLCompiler::parameter_color_array(const char * /*name*/, const array<float
{
}
-#endif /* WITH_OSL */
+#endif /* WITH_OSL */
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/osl.h b/intern/cycles/render/osl.h
index 966fc1965d7..e196e0be787 100644
--- a/intern/cycles/render/osl.h
+++ b/intern/cycles/render/osl.h
@@ -17,6 +17,7 @@
#ifndef __OSL_H__
#define __OSL_H__
+#include "util/util_array.h"
#include "util/util_set.h"
#include "util/util_string.h"
#include "util/util_thread.h"
@@ -171,4 +172,4 @@ private:
CCL_NAMESPACE_END
-#endif /* __OSL_H__ */
+#endif /* __OSL_H__ */
diff --git a/intern/cycles/render/particles.h b/intern/cycles/render/particles.h
index 7e7afd5d054..27821907af0 100644
--- a/intern/cycles/render/particles.h
+++ b/intern/cycles/render/particles.h
@@ -17,8 +17,8 @@
#ifndef __PARTICLES_H__
#define __PARTICLES_H__
+#include "util/util_array.h"
#include "util/util_types.h"
-#include "util/util_vector.h"
CCL_NAMESPACE_BEGIN
@@ -68,4 +68,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __PARTICLES_H__ */
+#endif /* __PARTICLES_H__ */
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
index 9f93fed139c..2241d8d9c69 100644
--- a/intern/cycles/render/scene.cpp
+++ b/intern/cycles/render/scene.cpp
@@ -83,7 +83,10 @@ DeviceScene::DeviceScene(Device *device)
}
Scene::Scene(const SceneParams& params_, Device *device)
-: device(device), dscene(device), params(params_)
+ : name("Scene"),
+ device(device),
+ dscene(device),
+ params(params_)
{
memset((void *)&dscene.data, 0, sizeof(dscene.data));
@@ -215,6 +218,11 @@ void Scene::device_update(Device *device_, Progress& progress)
object_manager->device_update(device, &dscene, this, progress);
if(progress.get_cancel() || device->have_error()) return;
+
+ progress.set_status("Updating Hair Systems");
+ curve_system_manager->device_update(device, &dscene, this, progress);
+
+ if(progress.get_cancel() || device->have_error()) return;
progress.set_status("Updating Particle Systems");
particle_system_manager->device_update(device, &dscene, this, progress);
@@ -240,12 +248,7 @@ void Scene::device_update(Device *device_, Progress& progress)
camera->device_update_volume(device, &dscene, this);
if(progress.get_cancel() || device->have_error()) return;
-
- progress.set_status("Updating Hair Systems");
- curve_system_manager->device_update(device, &dscene, this, progress);
-
- if(progress.get_cancel() || device->have_error()) return;
-
+
progress.set_status("Updating Lookup Tables");
lookup_tables->device_update(device, &dscene);
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index dd8069537eb..69cbfe9a324 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -166,7 +166,6 @@ public:
bool use_bvh_spatial_split;
bool use_bvh_unaligned_nodes;
int num_bvh_time_steps;
-
bool persistent_data;
int texture_limit;
@@ -197,6 +196,9 @@ public:
class Scene {
public:
+ /* Optional name. Is used for logging and reporting. */
+ string name;
+
/* data */
Camera *camera;
Camera *dicing_camera;
@@ -269,4 +271,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __SCENE_H__ */
+#endif /* __SCENE_H__ */
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index d0aa985b035..db13564037e 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -682,7 +682,10 @@ DeviceRequestedFeatures Session::get_requested_device_features()
BakeManager *bake_manager = scene->bake_manager;
requested_features.use_baking = bake_manager->get_baking();
requested_features.use_integrator_branched = (scene->integrator->method == Integrator::BRANCHED_PATH);
- requested_features.use_denoising = params.use_denoising;
+ if(params.denoising_passes) {
+ requested_features.use_denoising = true;
+ requested_features.use_shadow_tricks = true;
+ }
return requested_features;
}
@@ -918,10 +921,10 @@ void Session::update_status_time(bool show_pause, bool show_done)
num_samples);
if(show_pause) {
- status = "Paused";
+ status = "Rendering Paused";
}
else if(show_done) {
- status = "Done";
+ status = "Rendering Done";
progress.set_end_time(); /* Save end time so that further calls to get_time are accurate. */
}
else {
diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h
index 61f62f8e712..56a69919a7a 100644
--- a/intern/cycles/render/session.h
+++ b/intern/cycles/render/session.h
@@ -58,6 +58,7 @@ public:
bool display_buffer_linear;
bool use_denoising;
+ bool denoising_passes;
int denoising_radius;
float denoising_strength;
float denoising_feature_strength;
@@ -89,6 +90,7 @@ public:
threads = 0;
use_denoising = false;
+ denoising_passes = false;
denoising_radius = 8;
denoising_strength = 0.0f;
denoising_feature_strength = 0.0f;
@@ -236,4 +238,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __SESSION_H__ */
+#endif /* __SESSION_H__ */
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index e428e174712..11780062e44 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -30,6 +30,7 @@
#include "render/tables.h"
#include "util/util_foreach.h"
+#include "util/util_murmurhash.h"
#ifdef WITH_OCIO
# include <OpenColorIO/OpenColorIO.h>
@@ -388,7 +389,7 @@ ShaderManager *ShaderManager::create(Scene *scene, int shadingsystem)
{
ShaderManager *manager;
- (void)shadingsystem; /* Ignored when built without OSL. */
+ (void) shadingsystem; /* Ignored when built without OSL. */
#ifdef WITH_OSL
if(shadingsystem == SHADINGSYSTEM_OSL) {
@@ -524,12 +525,15 @@ void ShaderManager::device_update_common(Device *device,
if(shader->is_constant_emission(&constant_emission))
flag |= SD_HAS_CONSTANT_EMISSION;
+ uint32_t cryptomatte_id = util_murmur_hash3(shader->name.c_str(), shader->name.length(), 0);
+
/* regular shader */
kshader->flags = flag;
kshader->pass_id = shader->pass_id;
kshader->constant_emission[0] = constant_emission.x;
kshader->constant_emission[1] = constant_emission.y;
kshader->constant_emission[2] = constant_emission.z;
+ kshader->cryptomatte_id = util_hash_to_float(cryptomatte_id);
kshader++;
has_transparent_shadow |= (flag & SD_HAS_TRANSPARENT_SHADOW) != 0;
@@ -696,4 +700,20 @@ float ShaderManager::linear_rgb_to_gray(float3 c)
return dot(c, rgb_to_y);
}
+string ShaderManager::get_cryptomatte_materials(Scene *scene)
+{
+ string manifest = "{";
+ unordered_set<ustring, ustringHash> materials;
+ foreach(Shader *shader, scene->shaders) {
+ if(materials.count(shader->name)) {
+ continue;
+ }
+ materials.insert(shader->name);
+ uint32_t cryptomatte_id = util_murmur_hash3(shader->name.c_str(), shader->name.length(), 0);
+ manifest += string_printf("\"%s\":\"%08x\",", shader->name.c_str(), cryptomatte_id);
+ }
+ manifest[manifest.size()-1] = '}';
+ return manifest;
+}
+
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h
index e898d984f5a..05772b9a9cd 100644
--- a/intern/cycles/render/shader.h
+++ b/intern/cycles/render/shader.h
@@ -198,6 +198,8 @@ public:
float linear_rgb_to_gray(float3 c);
+ string get_cryptomatte_materials(Scene *scene);
+
protected:
ShaderManager();
@@ -223,4 +225,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __SHADER_H__ */
+#endif /* __SHADER_H__ */
diff --git a/intern/cycles/render/sobol.h b/intern/cycles/render/sobol.h
index d38857d2b35..ce7a28587f2 100644
--- a/intern/cycles/render/sobol.h
+++ b/intern/cycles/render/sobol.h
@@ -28,4 +28,4 @@ void sobol_generate_direction_vectors(uint vectors[][SOBOL_BITS], int dimensions
CCL_NAMESPACE_END
-#endif /* __SOBOL_H__ */
+#endif /* __SOBOL_H__ */
diff --git a/intern/cycles/render/stats.h b/intern/cycles/render/stats.h
index 72d5f1dd93d..2ff0ec3e0e9 100644
--- a/intern/cycles/render/stats.h
+++ b/intern/cycles/render/stats.h
@@ -101,4 +101,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __RENDER_STATS_H__ */
+#endif /* __RENDER_STATS_H__ */
diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp
index 44b7eeec6db..b380117e729 100644
--- a/intern/cycles/render/svm.cpp
+++ b/intern/cycles/render/svm.cpp
@@ -266,7 +266,7 @@ int SVMCompiler::stack_assign(ShaderInput *input)
add_node(NODE_VALUE_V, input->stack_offset);
add_node(NODE_VALUE_V, node->get_float3(input->socket_type));
}
- else /* should not get called for closure */
+ else /* should not get called for closure */
assert(0);
}
}
diff --git a/intern/cycles/render/svm.h b/intern/cycles/render/svm.h
index 1d0613bbfdc..af97a490a87 100644
--- a/intern/cycles/render/svm.h
+++ b/intern/cycles/render/svm.h
@@ -21,6 +21,7 @@
#include "render/graph.h"
#include "render/shader.h"
+#include "util/util_array.h"
#include "util/util_set.h"
#include "util/util_string.h"
#include "util/util_thread.h"
@@ -223,4 +224,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __SVM_H__ */
+#endif /* __SVM_H__ */
diff --git a/intern/cycles/render/tables.h b/intern/cycles/render/tables.h
index 09d961a9c3c..709333cb1b6 100644
--- a/intern/cycles/render/tables.h
+++ b/intern/cycles/render/tables.h
@@ -50,4 +50,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __TABLES_H__ */
+#endif /* __TABLES_H__ */
diff --git a/intern/cycles/render/tile.h b/intern/cycles/render/tile.h
index f72f653f4c2..2835c793073 100644
--- a/intern/cycles/render/tile.h
+++ b/intern/cycles/render/tile.h
@@ -154,4 +154,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __TILE_H__ */
+#endif /* __TILE_H__ */
diff --git a/intern/cycles/subd/subd_dice.h b/intern/cycles/subd/subd_dice.h
index 4617c782b3a..2bef8d4cf8d 100644
--- a/intern/cycles/subd/subd_dice.h
+++ b/intern/cycles/subd/subd_dice.h
@@ -134,4 +134,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __SUBD_DICE_H__ */
+#endif /* __SUBD_DICE_H__ */
diff --git a/intern/cycles/subd/subd_patch.h b/intern/cycles/subd/subd_patch.h
index 64ec8f70951..84100139f2c 100644
--- a/intern/cycles/subd/subd_patch.h
+++ b/intern/cycles/subd/subd_patch.h
@@ -56,4 +56,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __SUBD_PATCH_H__ */
+#endif /* __SUBD_PATCH_H__ */
diff --git a/intern/cycles/subd/subd_patch_table.cpp b/intern/cycles/subd/subd_patch_table.cpp
index 13a6f284542..0e9d3f37af4 100644
--- a/intern/cycles/subd/subd_patch_table.cpp
+++ b/intern/cycles/subd/subd_patch_table.cpp
@@ -252,8 +252,8 @@ void PackedPatchTable::pack(Far::PatchTable* patch_table, int offset)
build_patch_map(*this, patch_table, offset);
#else
- (void)patch_table;
- (void)offset;
+ (void) patch_table;
+ (void) offset;
#endif
}
diff --git a/intern/cycles/subd/subd_patch_table.h b/intern/cycles/subd/subd_patch_table.h
index 45be7051992..1765578c42e 100644
--- a/intern/cycles/subd/subd_patch_table.h
+++ b/intern/cycles/subd/subd_patch_table.h
@@ -17,8 +17,8 @@
#ifndef __SUBD_PATCH_TABLE_H__
#define __SUBD_PATCH_TABLE_H__
+#include "util/util_array.h"
#include "util/util_types.h"
-#include "util/util_vector.h"
#ifdef WITH_OPENSUBDIV
#ifdef _MSC_VER
@@ -59,4 +59,4 @@ struct PackedPatchTable {
CCL_NAMESPACE_END
-#endif /* __SUBD_PATCH_TABLE_H__ */
+#endif /* __SUBD_PATCH_TABLE_H__ */
diff --git a/intern/cycles/subd/subd_split.h b/intern/cycles/subd/subd_split.h
index 7a276b35382..3368c93944b 100644
--- a/intern/cycles/subd/subd_split.h
+++ b/intern/cycles/subd/subd_split.h
@@ -56,4 +56,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __SUBD_SPLIT_H__ */
+#endif /* __SUBD_SPLIT_H__ */
diff --git a/intern/cycles/test/CMakeLists.txt b/intern/cycles/test/CMakeLists.txt
index 332e0d8cc78..a2e527c7144 100644
--- a/intern/cycles/test/CMakeLists.txt
+++ b/intern/cycles/test/CMakeLists.txt
@@ -48,11 +48,7 @@ if(WITH_OPENCOLORIO)
)
endif()
if(WITH_IMAGE_OPENJPEG)
- if(WITH_SYSTEM_OPENJPEG)
- list(APPEND ALL_CYCLES_LIBRARIES ${OPENJPEG_LIBRARIES})
- else()
- list(APPEND ALL_CYCLES_LIBRARIES extern_openjpeg)
- endif()
+ list(APPEND ALL_CYCLES_LIBRARIES ${OPENJPEG_LIBRARIES})
endif()
if(WITH_CYCLES_OPENSUBDIV)
add_definitions(-DWITH_OPENSUBDIV)
diff --git a/intern/cycles/test/render_graph_finalize_test.cpp b/intern/cycles/test/render_graph_finalize_test.cpp
index b66a91adbda..cfdab7a6433 100644
--- a/intern/cycles/test/render_graph_finalize_test.cpp
+++ b/intern/cycles/test/render_graph_finalize_test.cpp
@@ -20,6 +20,7 @@
#include "render/graph.h"
#include "render/scene.h"
#include "render/nodes.h"
+#include "util/util_array.h"
#include "util/util_logging.h"
#include "util/util_string.h"
#include "util/util_vector.h"
diff --git a/intern/cycles/test/util_path_test.cpp b/intern/cycles/test/util_path_test.cpp
index c2f400c105d..1df568493d8 100644
--- a/intern/cycles/test/util_path_test.cpp
+++ b/intern/cycles/test/util_path_test.cpp
@@ -370,7 +370,7 @@ TEST(util_path_is_relative, relative_windir_on_unix)
bool is_relative = path_is_relative("tmp\\foo.txt");
EXPECT_TRUE(is_relative);
}
-#endif /* !_WIN32 */
+#endif /* !_WIN32 */
#ifdef _WIN32
TEST(util_path_is_relative, absolute_windows)
@@ -396,6 +396,6 @@ TEST(util_path_is_relative, relative_unixdir_on_windows)
bool is_relative = path_is_relative("tmp/foo.txt");
EXPECT_TRUE(is_relative);
}
-#endif /* _WIN32 */
+#endif /* _WIN32 */
CCL_NAMESPACE_END
diff --git a/intern/cycles/util/CMakeLists.txt b/intern/cycles/util/CMakeLists.txt
index 291f9a9fcae..77d47984ee7 100644
--- a/intern/cycles/util/CMakeLists.txt
+++ b/intern/cycles/util/CMakeLists.txt
@@ -15,6 +15,7 @@ set(SRC
util_logging.cpp
util_math_cdf.cpp
util_md5.cpp
+ util_murmurhash.cpp
util_path.cpp
util_string.cpp
util_simd.cpp
@@ -36,6 +37,7 @@ set(SRC_HEADERS
util_algorithm.h
util_aligned_malloc.h
util_args.h
+ util_array.h
util_atomic.h
util_boundbox.h
util_debug.h
@@ -64,6 +66,7 @@ set(SRC_HEADERS
util_math_int4.h
util_math_matrix.h
util_md5.h
+ util_murmurhash.h
util_opengl.h
util_optimization.h
util_param.h
diff --git a/intern/cycles/util/util_algorithm.h b/intern/cycles/util/util_algorithm.h
index eb874713d43..f9e6476cc52 100644
--- a/intern/cycles/util/util_algorithm.h
+++ b/intern/cycles/util/util_algorithm.h
@@ -29,4 +29,4 @@ using std::remove;
CCL_NAMESPACE_END
-#endif /* __UTIL_ALGORITHM_H__ */
+#endif /* __UTIL_ALGORITHM_H__ */
diff --git a/intern/cycles/util/util_args.h b/intern/cycles/util/util_args.h
index be6f2c2b9f1..9fe54b14d77 100644
--- a/intern/cycles/util/util_args.h
+++ b/intern/cycles/util/util_args.h
@@ -28,4 +28,4 @@ OIIO_NAMESPACE_USING
CCL_NAMESPACE_END
-#endif /* __UTIL_ARGS_H__ */
+#endif /* __UTIL_ARGS_H__ */
diff --git a/intern/cycles/util/util_array.h b/intern/cycles/util/util_array.h
new file mode 100644
index 00000000000..5f18d434c31
--- /dev/null
+++ b/intern/cycles/util/util_array.h
@@ -0,0 +1,289 @@
+/*
+ * Copyright 2011-2018 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UTIL_ARRAY_H__
+#define __UTIL_ARRAY_H__
+
+#include <cassert>
+#include <cstring>
+
+#include "util/util_aligned_malloc.h"
+#include "util/util_guarded_allocator.h"
+#include "util/util_types.h"
+#include "util/util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Simplified version of vector, serving multiple purposes:
+ * - somewhat faster in that it does not clear memory on resize/alloc,
+ * this was actually showing up in profiles quite significantly. it
+ * also does not run any constructors/destructors
+ * - if this is used, we are not tempted to use inefficient operations
+ * - aligned allocation for CPU native data types */
+
+template<typename T, size_t alignment = MIN_ALIGNMENT_CPU_DATA_TYPES>
+class array
+{
+public:
+ array()
+ : data_(NULL),
+ datasize_(0),
+ capacity_(0)
+ {}
+
+ explicit array(size_t newsize)
+ {
+ if(newsize == 0) {
+ data_ = NULL;
+ datasize_ = 0;
+ capacity_ = 0;
+ }
+ else {
+ data_ = mem_allocate(newsize);
+ datasize_ = newsize;
+ capacity_ = datasize_;
+ }
+ }
+
+ array(const array& from)
+ {
+ if(from.datasize_ == 0) {
+ data_ = NULL;
+ datasize_ = 0;
+ capacity_ = 0;
+ }
+ else {
+ data_ = mem_allocate(from.datasize_);
+ memcpy(data_, from.data_, from.datasize_*sizeof(T));
+ datasize_ = from.datasize_;
+ capacity_ = datasize_;
+ }
+ }
+
+ array& operator=(const array& from)
+ {
+ if(this != &from) {
+ resize(from.size());
+ memcpy((void*)data_, from.data_, datasize_*sizeof(T));
+ }
+
+ return *this;
+ }
+
+ array& operator=(const vector<T>& from)
+ {
+ resize(from.size());
+
+ if(from.size() > 0) {
+ memcpy(data_, &from[0], datasize_*sizeof(T));
+ }
+
+ return *this;
+ }
+
+ ~array()
+ {
+ mem_free(data_, capacity_);
+ }
+
+ bool operator==(const array<T>& other) const
+ {
+ if(datasize_ != other.datasize_) {
+ return false;
+ }
+
+ return memcmp(data_, other.data_, datasize_*sizeof(T)) == 0;
+ }
+
+ bool operator!=(const array<T>& other) const
+ {
+ return !(*this == other);
+ }
+
+ void steal_data(array& from)
+ {
+ if(this != &from) {
+ clear();
+
+ data_ = from.data_;
+ datasize_ = from.datasize_;
+ capacity_ = from.capacity_;
+
+ from.data_ = NULL;
+ from.datasize_ = 0;
+ from.capacity_ = 0;
+ }
+ }
+
+ T *steal_pointer()
+ {
+ T *ptr = data_;
+ data_ = NULL;
+ clear();
+ return ptr;
+ }
+
+ T* resize(size_t newsize)
+ {
+ if(newsize == 0) {
+ clear();
+ }
+ else if(newsize != datasize_) {
+ if(newsize > capacity_) {
+ T *newdata = mem_allocate(newsize);
+ if(newdata == NULL) {
+ /* Allocation failed, likely out of memory. */
+ clear();
+ return NULL;
+ }
+ else if(data_ != NULL) {
+ memcpy((void *)newdata,
+ data_,
+ ((datasize_ < newsize)? datasize_: newsize)*sizeof(T));
+ mem_free(data_, capacity_);
+ }
+ data_ = newdata;
+ capacity_ = newsize;
+ }
+ datasize_ = newsize;
+ }
+ return data_;
+ }
+
+ T* resize(size_t newsize, const T& value)
+ {
+ size_t oldsize = size();
+ resize(newsize);
+
+ for(size_t i = oldsize; i < size(); i++) {
+ data_[i] = value;
+ }
+
+ return data_;
+ }
+
+ void clear()
+ {
+ if(data_ != NULL) {
+ mem_free(data_, capacity_);
+ data_ = NULL;
+ }
+ datasize_ = 0;
+ capacity_ = 0;
+ }
+
+ size_t empty() const
+ {
+ return datasize_ == 0;
+ }
+
+ size_t size() const
+ {
+ return datasize_;
+ }
+
+ T* data()
+ {
+ return data_;
+ }
+
+ const T* data() const
+ {
+ return data_;
+ }
+
+ T& operator[](size_t i) const
+ {
+ assert(i < datasize_);
+ return data_[i];
+ }
+
+ void reserve(size_t newcapacity)
+ {
+ if(newcapacity > capacity_) {
+ T *newdata = mem_allocate(newcapacity);
+ if(data_ != NULL) {
+ memcpy(newdata, data_, ((datasize_ < newcapacity)? datasize_: newcapacity)*sizeof(T));
+ mem_free(data_, capacity_);
+ }
+ data_ = newdata;
+ capacity_ = newcapacity;
+ }
+ }
+
+ size_t capacity() const
+ {
+ return capacity_;
+ }
+
+ // do not use this method unless you are sure the code is not performance critical
+ void push_back_slow(const T& t)
+ {
+ if(capacity_ == datasize_)
+ {
+ reserve(datasize_ == 0 ? 1 : (size_t)((datasize_ + 1) * 1.2));
+ }
+
+ data_[datasize_++] = t;
+ }
+
+ void push_back_reserved(const T& t)
+ {
+ assert(datasize_ < capacity_);
+ push_back_slow(t);
+ }
+
+ void append(const array<T>& from)
+ {
+ if(from.size()) {
+ size_t old_size = size();
+ resize(old_size + from.size());
+ memcpy(data_ + old_size, from.data(), sizeof(T) * from.size());
+ }
+ }
+
+protected:
+ inline T* mem_allocate(size_t N)
+ {
+ if(N == 0) {
+ return NULL;
+ }
+ T *mem = (T*)util_aligned_malloc(sizeof(T)*N, alignment);
+ if(mem != NULL) {
+ util_guarded_mem_alloc(sizeof(T)*N);
+ }
+ else {
+ throw std::bad_alloc();
+ }
+ return mem;
+ }
+
+ inline void mem_free(T *mem, size_t N)
+ {
+ if(mem != NULL) {
+ util_guarded_mem_free(sizeof(T)*N);
+ util_aligned_free(mem);
+ }
+ }
+
+ T *data_;
+ size_t datasize_;
+ size_t capacity_;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_ARRAY_H__ */
diff --git a/intern/cycles/util/util_atomic.h b/intern/cycles/util/util_atomic.h
index f3c7ae546a0..477b667a6fe 100644
--- a/intern/cycles/util/util_atomic.h
+++ b/intern/cycles/util/util_atomic.h
@@ -23,12 +23,13 @@
#include "atomic_ops.h"
#define atomic_add_and_fetch_float(p, x) atomic_add_and_fetch_fl((p), (x))
+#define atomic_compare_and_swap_float(p, old_val, new_val) atomic_cas_float((p), (old_val), (new_val))
#define atomic_fetch_and_inc_uint32(p) atomic_fetch_and_add_uint32((p), 1)
#define atomic_fetch_and_dec_uint32(p) atomic_fetch_and_add_uint32((p), -1)
#define CCL_LOCAL_MEM_FENCE 0
-#define ccl_barrier(flags) (void)0
+#define ccl_barrier(flags) ((void) 0)
#else /* __KERNEL_GPU__ */
@@ -57,6 +58,20 @@ ccl_device_inline float atomic_add_and_fetch_float(volatile ccl_global float *so
return new_value.float_value;
}
+ccl_device_inline float atomic_compare_and_swap_float(volatile ccl_global float *dest,
+ const float old_val, const float new_val)
+{
+ union {
+ unsigned int int_value;
+ float float_value;
+ } new_value, prev_value, result;
+ prev_value.float_value = old_val;
+ new_value.float_value = new_val;
+ result.int_value = atomic_cmpxchg((volatile ccl_global unsigned int *)dest,
+ prev_value.int_value, new_value.int_value);
+ return result.float_value;
+}
+
#define atomic_fetch_and_add_uint32(p, x) atomic_add((p), (x))
#define atomic_fetch_and_inc_uint32(p) atomic_inc((p))
#define atomic_fetch_and_dec_uint32(p) atomic_dec((p))
@@ -75,6 +90,19 @@ ccl_device_inline float atomic_add_and_fetch_float(volatile ccl_global float *so
#define atomic_fetch_and_inc_uint32(p) atomic_fetch_and_add_uint32((p), 1)
#define atomic_fetch_and_dec_uint32(p) atomic_fetch_and_sub_uint32((p), 1)
+ccl_device_inline float atomic_compare_and_swap_float(volatile float *dest,
+ const float old_val, const float new_val)
+{
+ union {
+ unsigned int int_value;
+ float float_value;
+ } new_value, prev_value, result;
+ prev_value.float_value = old_val;
+ new_value.float_value = new_val;
+ result.int_value = atomicCAS((unsigned int *)dest, prev_value.int_value,new_value.int_value);
+ return result.float_value;
+}
+
#define CCL_LOCAL_MEM_FENCE
#define ccl_barrier(flags) __syncthreads()
@@ -82,4 +110,4 @@ ccl_device_inline float atomic_add_and_fetch_float(volatile ccl_global float *so
#endif /* __KERNEL_GPU__ */
-#endif /* __UTIL_ATOMIC_H__ */
+#endif /* __UTIL_ATOMIC_H__ */
diff --git a/intern/cycles/util/util_avxb.h b/intern/cycles/util/util_avxb.h
index 60d9bb44256..25ef39d39ae 100644
--- a/intern/cycles/util/util_avxb.h
+++ b/intern/cycles/util/util_avxb.h
@@ -44,23 +44,12 @@ struct avxb
__forceinline operator const __m256i( void ) const { return _mm256_castps_si256(m256); }
__forceinline operator const __m256d( void ) const { return _mm256_castps_pd(m256); }
- //__forceinline avxb ( bool a )
- // : m256(_mm_lookupmask_ps[(size_t(a) << 3) | (size_t(a) << 2) | (size_t(a) << 1) | size_t(a)]) {}
- //__forceinline avxb ( bool a, bool b)
- // : m256(_mm_lookupmask_ps[(size_t(b) << 3) | (size_t(a) << 2) | (size_t(b) << 1) | size_t(a)]) {}
- //__forceinline avxb ( bool a, bool b, bool c, bool d)
- // : m256(_mm_lookupmask_ps[(size_t(d) << 3) | (size_t(c) << 2) | (size_t(b) << 1) | size_t(a)]) {}
- //__forceinline avxb(int mask) {
- // assert(mask >= 0 && mask < 16);
- // m128 = _mm_lookupmask_ps[mask];
- //}
-
////////////////////////////////////////////////////////////////////////////////
/// Constants
////////////////////////////////////////////////////////////////////////////////
__forceinline avxb( FalseTy ) : m256(_mm256_setzero_ps()) {}
- __forceinline avxb( TrueTy ) : m256(_mm256_castsi256_ps(_mm256_cmpeq_epi32(_mm256_setzero_si256(), _mm256_setzero_si256()))) {}
+ __forceinline avxb( TrueTy ) : m256(_mm256_castsi256_ps(_mm256_set1_epi32(-1))) {}
////////////////////////////////////////////////////////////////////////////////
/// Array Access
@@ -97,7 +86,21 @@ __forceinline const avxb operator ^=( avxb& a, const avxb& b ) { return a = a ^
////////////////////////////////////////////////////////////////////////////////
__forceinline const avxb operator !=( const avxb& a, const avxb& b ) { return _mm256_xor_ps(a, b); }
-__forceinline const avxb operator ==( const avxb& a, const avxb& b ) { return _mm256_castsi256_ps(_mm256_cmpeq_epi32(a, b)); }
+__forceinline const avxb operator ==( const avxb& a, const avxb& b )
+{
+#ifdef __KERNEL_AVX2__
+ return _mm256_castsi256_ps(_mm256_cmpeq_epi32(a, b));
+#else
+ __m128i a_lo = _mm_castps_si128(_mm256_extractf128_ps(a, 0));
+ __m128i a_hi = _mm_castps_si128(_mm256_extractf128_ps(a, 1));
+ __m128i b_lo = _mm_castps_si128(_mm256_extractf128_ps(b, 0));
+ __m128i b_hi = _mm_castps_si128(_mm256_extractf128_ps(b, 1));
+ __m128i c_lo = _mm_cmpeq_epi32(a_lo, b_lo);
+ __m128i c_hi = _mm_cmpeq_epi32(a_hi, b_hi);
+ __m256i result = _mm256_insertf128_si256(_mm256_castsi128_si256(c_lo), c_hi, 1);
+ return _mm256_castsi256_ps(result);
+#endif
+}
__forceinline const avxb select( const avxb& m, const avxb& t, const avxb& f ) {
#if defined(__KERNEL_SSE41__)
@@ -114,47 +117,6 @@ __forceinline const avxb select( const avxb& m, const avxb& t, const avxb& f ) {
__forceinline const avxb unpacklo( const avxb& a, const avxb& b ) { return _mm256_unpacklo_ps(a, b); }
__forceinline const avxb unpackhi( const avxb& a, const avxb& b ) { return _mm256_unpackhi_ps(a, b); }
-#define _MM256_SHUFFLE(fp7,fp6,fp5,fp4,fp3,fp2,fp1,fp0) (((fp7) << 14) | ((fp6) << 12) | ((fp5) << 10) | ((fp4) << 8) | \
- ((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | ((fp0)))
-
-template<size_t i0, size_t i1, size_t i2, size_t i3, size_t i4, size_t i5, size_t i6, size_t i7>
-__forceinline const avxb shuffle( const avxb& a ) {
- return _mm256_cvtepi32_ps(_mm256_shuffle_epi32(a, _MM256_SHUFFLE(i7, i6, i5, i4, i3, i2, i1, i0)));
-}
-
-/*
-template<> __forceinline const avxb shuffle<0, 1, 0, 1, 0, 1, 0, 1>( const avxb& a ) {
- return _mm_movelh_ps(a, a);
-}
-
-template<> __forceinline const sseb shuffle<2, 3, 2, 3>( const sseb& a ) {
- return _mm_movehl_ps(a, a);
-}
-
-template<size_t i0, size_t i1, size_t i2, size_t i3> __forceinline const sseb shuffle( const sseb& a, const sseb& b ) {
- return _mm_shuffle_ps(a, b, _MM_SHUFFLE(i3, i2, i1, i0));
-}
-
-template<> __forceinline const sseb shuffle<0, 1, 0, 1>( const sseb& a, const sseb& b ) {
- return _mm_movelh_ps(a, b);
-}
-
-template<> __forceinline const sseb shuffle<2, 3, 2, 3>( const sseb& a, const sseb& b ) {
- return _mm_movehl_ps(b, a);
-}
-
-#if defined(__KERNEL_SSE3__)
-template<> __forceinline const sseb shuffle<0, 0, 2, 2>( const sseb& a ) { return _mm_moveldup_ps(a); }
-template<> __forceinline const sseb shuffle<1, 1, 3, 3>( const sseb& a ) { return _mm_movehdup_ps(a); }
-#endif
-
-#if defined(__KERNEL_SSE41__)
-template<size_t dst, size_t src, size_t clr> __forceinline const sseb insert( const sseb& a, const sseb& b ) { return _mm_insert_ps(a, b, (dst << 4) | (src << 6) | clr); }
-template<size_t dst, size_t src> __forceinline const sseb insert( const sseb& a, const sseb& b ) { return insert<dst, src, 0>(a, b); }
-template<size_t dst> __forceinline const sseb insert( const sseb& a, const bool b ) { return insert<dst,0>(a, sseb(b)); }
-#endif
-*/
-
////////////////////////////////////////////////////////////////////////////////
/// Reduction Operations
////////////////////////////////////////////////////////////////////////////////
@@ -180,7 +142,7 @@ __forceinline size_t movemask( const avxb& a ) { return _mm256_movemask_ps(a); }
ccl_device_inline void print_avxb(const char *label, const avxb &a)
{
- printf("%s: %df %df %df %df %df %df %df %d\n",
+ printf("%s: %d %d %d %d %d %d %d %d\n",
label, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
}
diff --git a/intern/cycles/util/util_avxf.h b/intern/cycles/util/util_avxf.h
index 5596702ca20..f00c722f25b 100644
--- a/intern/cycles/util/util_avxf.h
+++ b/intern/cycles/util/util_avxf.h
@@ -40,8 +40,8 @@ struct avxf
__forceinline avxf(const __m256 a) : m256(a) {}
__forceinline avxf(const __m256i a) : m256(_mm256_castsi256_ps (a)) {}
- __forceinline operator const __m256&(void) const { return m256; }
- __forceinline operator __m256&(void) { return m256; }
+ __forceinline operator const __m256&() const { return m256; }
+ __forceinline operator __m256&() { return m256; }
__forceinline avxf (float a) : m256(_mm256_set1_ps(a)) {}
@@ -214,17 +214,19 @@ __forceinline const avxf nmadd(const avxf& a, const avxf& b, const avxf& c) {
#endif
}
__forceinline const avxf msub(const avxf& a, const avxf& b, const avxf& c) {
+#ifdef __KERNEL_AVX2__
return _mm256_fmsub_ps(a, b, c);
+#else
+ return (a*b) - c;
+#endif
}
////////////////////////////////////////////////////////////////////////////////
/// Comparison Operators
////////////////////////////////////////////////////////////////////////////////
-#ifdef __KERNEL_AVX2__
__forceinline const avxb operator <=(const avxf& a, const avxf& b) {
return _mm256_cmp_ps(a.m256, b.m256, _CMP_LE_OS);
}
-#endif
#endif
diff --git a/intern/cycles/util/util_boundbox.h b/intern/cycles/util/util_boundbox.h
index b1bd5be0df3..fe89e398840 100644
--- a/intern/cycles/util/util_boundbox.h
+++ b/intern/cycles/util/util_boundbox.h
@@ -282,4 +282,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __UTIL_BOUNDBOX_H__ */
+#endif /* __UTIL_BOUNDBOX_H__ */
diff --git a/intern/cycles/util/util_color.h b/intern/cycles/util/util_color.h
index 826db469d25..e6efc7d73fc 100644
--- a/intern/cycles/util/util_color.h
+++ b/intern/cycles/util/util_color.h
@@ -240,4 +240,4 @@ ccl_device float4 color_srgb_to_linear_v4(float4 c)
CCL_NAMESPACE_END
-#endif /* __UTIL_COLOR_H__ */
+#endif /* __UTIL_COLOR_H__ */
diff --git a/intern/cycles/util/util_debug.h b/intern/cycles/util/util_debug.h
index f17f8a560ee..864089bb118 100644
--- a/intern/cycles/util/util_debug.h
+++ b/intern/cycles/util/util_debug.h
@@ -182,4 +182,4 @@ std::ostream& operator <<(std::ostream &os,
CCL_NAMESPACE_END
-#endif /* __UTIL_DEBUG_H__ */
+#endif /* __UTIL_DEBUG_H__ */
diff --git a/intern/cycles/util/util_defines.h b/intern/cycles/util/util_defines.h
index 8bce4aca699..429cfe647ef 100644
--- a/intern/cycles/util/util_defines.h
+++ b/intern/cycles/util/util_defines.h
@@ -72,7 +72,7 @@
# if defined(__GNUC__) && (__GNUC__ >= 7) /* gcc7.0+ only */
# define ATTR_FALLTHROUGH __attribute__((fallthrough))
# else
-# define ATTR_FALLTHROUGH ((void)0)
+# define ATTR_FALLTHROUGH ((void) 0)
# endif
#endif /* __KERNEL_GPU__ */
@@ -104,14 +104,14 @@ template<typename T> static inline T decltype_helper(T x) { return x; }
#define CHECK_TYPE(var, type) { \
TYPEOF(var) *__tmp; \
__tmp = (type *)NULL; \
- (void)__tmp; \
-} (void)0
+ (void) __tmp; \
+} (void) 0
#define CHECK_TYPE_PAIR(var_a, var_b) { \
TYPEOF(var_a) *__tmp; \
__tmp = (typeof(var_b) *)NULL; \
- (void)__tmp; \
-} (void)0
+ (void) __tmp; \
+} (void) 0
#else
# define CHECK_TYPE(var, type)
# define CHECK_TYPE_PAIR(var_a, var_b)
@@ -128,4 +128,4 @@ template<typename T> static inline T decltype_helper(T x) { return x; }
# define util_assert(statement)
#endif
-#endif /* __UTIL_DEFINES_H__ */
+#endif /* __UTIL_DEFINES_H__ */
diff --git a/intern/cycles/util/util_foreach.h b/intern/cycles/util/util_foreach.h
index 2a74ff0a55d..fd106d58b43 100644
--- a/intern/cycles/util/util_foreach.h
+++ b/intern/cycles/util/util_foreach.h
@@ -21,4 +21,4 @@
#define foreach(x, y) for(x : y)
-#endif /* __UTIL_FOREACH_H__ */
+#endif /* __UTIL_FOREACH_H__ */
diff --git a/intern/cycles/util/util_function.h b/intern/cycles/util/util_function.h
index f3cc00329ad..72c7ce43073 100644
--- a/intern/cycles/util/util_function.h
+++ b/intern/cycles/util/util_function.h
@@ -36,4 +36,4 @@ using std::placeholders::_9;
CCL_NAMESPACE_END
-#endif /* __UTIL_FUNCTION_H__ */
+#endif /* __UTIL_FUNCTION_H__ */
diff --git a/intern/cycles/util/util_guarded_allocator.cpp b/intern/cycles/util/util_guarded_allocator.cpp
index 54fa6a80df5..ae1d217c54f 100644
--- a/intern/cycles/util/util_guarded_allocator.cpp
+++ b/intern/cycles/util/util_guarded_allocator.cpp
@@ -35,12 +35,12 @@ void util_guarded_mem_free(size_t n)
/* Public API. */
-size_t util_guarded_get_mem_used(void)
+size_t util_guarded_get_mem_used()
{
return global_stats.mem_used;
}
-size_t util_guarded_get_mem_peak(void)
+size_t util_guarded_get_mem_peak()
{
return global_stats.mem_peak;
}
diff --git a/intern/cycles/util/util_guarded_allocator.h b/intern/cycles/util/util_guarded_allocator.h
index 87c1526dee4..2c6f1790fd0 100644
--- a/intern/cycles/util/util_guarded_allocator.h
+++ b/intern/cycles/util/util_guarded_allocator.h
@@ -47,7 +47,7 @@ public:
T *allocate(size_t n, const void *hint = 0)
{
- (void)hint;
+ (void) hint;
size_t size = n * sizeof(T);
util_guarded_mem_alloc(size);
if(n == 0) {
@@ -158,8 +158,8 @@ public:
};
/* Get memory usage and peak from the guarded STL allocator. */
-size_t util_guarded_get_mem_used(void);
-size_t util_guarded_get_mem_peak(void);
+size_t util_guarded_get_mem_used();
+size_t util_guarded_get_mem_peak();
/* Call given function and keep track if it runs out of memory.
*
diff --git a/intern/cycles/util/util_half.h b/intern/cycles/util/util_half.h
index 53b7f2472bd..3868509c21b 100644
--- a/intern/cycles/util/util_half.h
+++ b/intern/cycles/util/util_half.h
@@ -148,4 +148,4 @@ ccl_device_inline half float_to_half(float f)
CCL_NAMESPACE_END
-#endif /* __UTIL_HALF_H__ */
+#endif /* __UTIL_HALF_H__ */
diff --git a/intern/cycles/util/util_hash.h b/intern/cycles/util/util_hash.h
index a8a5076fbb3..f343252eaca 100644
--- a/intern/cycles/util/util_hash.h
+++ b/intern/cycles/util/util_hash.h
@@ -68,4 +68,4 @@ ccl_device_inline float hash_int_01(uint k)
CCL_NAMESPACE_END
-#endif /* __UTIL_HASH_H__ */
+#endif /* __UTIL_HASH_H__ */
diff --git a/intern/cycles/util/util_ies.cpp b/intern/cycles/util/util_ies.cpp
index e068957325b..e1de2e0c6e4 100644
--- a/intern/cycles/util/util_ies.cpp
+++ b/intern/cycles/util/util_ies.cpp
@@ -21,6 +21,13 @@
CCL_NAMESPACE_BEGIN
+// NOTE: For some reason gcc-7.2 does not instantiate this versio of allocator
+// gere (used in IESTextParser). Works fine for gcc-6, gcc-7.3 and gcc-8.
+//
+// TODO(sergey): Get to the root of this issue, or confirm this i a compiler
+// issue.
+template class GuardedAllocator<char>;
+
bool IESFile::load(ustring ies)
{
clear();
diff --git a/intern/cycles/util/util_ies.h b/intern/cycles/util/util_ies.h
index 5933cb3962a..663ad649a9c 100644
--- a/intern/cycles/util/util_ies.h
+++ b/intern/cycles/util/util_ies.h
@@ -58,4 +58,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __UTIL_IES_H__ */
+#endif /* __UTIL_IES_H__ */
diff --git a/intern/cycles/util/util_image.h b/intern/cycles/util/util_image.h
index 85bdb0d8050..da5f56271c8 100644
--- a/intern/cycles/util/util_image.h
+++ b/intern/cycles/util/util_image.h
@@ -102,6 +102,6 @@ inline half util_image_cast_from_float(float value)
CCL_NAMESPACE_END
-#endif /* __UTIL_IMAGE_H__ */
+#endif /* __UTIL_IMAGE_H__ */
#include "util/util_image_impl.h"
diff --git a/intern/cycles/util/util_list.h b/intern/cycles/util/util_list.h
index f555b001186..fcf8e4f5c74 100644
--- a/intern/cycles/util/util_list.h
+++ b/intern/cycles/util/util_list.h
@@ -25,4 +25,4 @@ using std::list;
CCL_NAMESPACE_END
-#endif /* __UTIL_LIST_H__ */
+#endif /* __UTIL_LIST_H__ */
diff --git a/intern/cycles/util/util_logging.cpp b/intern/cycles/util/util_logging.cpp
index f38683bf7de..b0922db32fb 100644
--- a/intern/cycles/util/util_logging.cpp
+++ b/intern/cycles/util/util_logging.cpp
@@ -45,7 +45,7 @@ void util_logging_init(const char *argv0)
#endif
}
-void util_logging_start(void)
+void util_logging_start()
{
#ifdef WITH_CYCLES_LOGGING
using CYCLES_GFLAGS_NAMESPACE::SetCommandLineOption;
diff --git a/intern/cycles/util/util_logging.h b/intern/cycles/util/util_logging.h
index 5c84b6593d3..f66d7c92dcc 100644
--- a/intern/cycles/util/util_logging.h
+++ b/intern/cycles/util/util_logging.h
@@ -41,7 +41,7 @@ public:
void operator&(StubStream&) { }
};
-# define LOG_SUPPRESS() (true) ? (void) 0 : LogMessageVoidify() & StubStream()
+# define LOG_SUPPRESS() (true) ? ((void) 0) : LogMessageVoidify() & StubStream()
# define LOG(severity) LOG_SUPPRESS()
# define VLOG(severity) LOG_SUPPRESS()
#endif
@@ -52,7 +52,7 @@ struct int2;
struct float3;
void util_logging_init(const char *argv0);
-void util_logging_start(void);
+void util_logging_start();
void util_logging_verbosity_set(int verbosity);
std::ostream& operator <<(std::ostream &os,
@@ -62,4 +62,4 @@ std::ostream& operator <<(std::ostream &os,
CCL_NAMESPACE_END
-#endif /* __UTIL_LOGGING_H__ */
+#endif /* __UTIL_LOGGING_H__ */
diff --git a/intern/cycles/util/util_map.h b/intern/cycles/util/util_map.h
index 3c9288417cf..1952d33ada8 100644
--- a/intern/cycles/util/util_map.h
+++ b/intern/cycles/util/util_map.h
@@ -28,4 +28,4 @@ using std::unordered_map;
CCL_NAMESPACE_END
-#endif /* __UTIL_MAP_H__ */
+#endif /* __UTIL_MAP_H__ */
diff --git a/intern/cycles/util/util_math.h b/intern/cycles/util/util_math.h
index 52aeb8d8599..6167119f873 100644
--- a/intern/cycles/util/util_math.h
+++ b/intern/cycles/util/util_math.h
@@ -157,7 +157,7 @@ ccl_device_inline T max4(const T& a, const T& b, const T& c, const T& d)
{
return max(max(a,b),max(c,d));
}
-#endif /* __KERNEL_GPU__ */
+#endif /* __KERNEL_GPU__ */
ccl_device_inline float min4(float a, float b, float c, float d)
{
@@ -220,7 +220,31 @@ ccl_device_inline float __uint_as_float(uint i)
u.i = i;
return u.f;
}
-#endif /* __KERNEL_OPENCL__ */
+
+ccl_device_inline int4 __float4_as_int4(float4 f)
+{
+#ifdef __KERNEL_SSE__
+ return int4(_mm_castps_si128(f.m128));
+ #else
+ return make_int4(__float_as_int(f.x),
+ __float_as_int(f.y),
+ __float_as_int(f.z),
+ __float_as_int(f.w));
+#endif
+}
+
+ccl_device_inline float4 __int4_as_float4(int4 i)
+{
+#ifdef __KERNEL_SSE__
+ return float4(_mm_castsi128_ps(i.m128));
+#else
+ return make_float4(__int_as_float(i.x),
+ __int_as_float(i.y),
+ __int_as_float(i.z),
+ __int_as_float(i.w));
+#endif
+}
+#endif /* __KERNEL_OPENCL__ */
/* Versions of functions which are safe for fast math. */
ccl_device_inline bool isnan_safe(float f)
@@ -615,4 +639,4 @@ ccl_device_inline float2 map_to_sphere(const float3 co)
CCL_NAMESPACE_END
-#endif /* __UTIL_MATH_H__ */
+#endif /* __UTIL_MATH_H__ */
diff --git a/intern/cycles/util/util_math_cdf.h b/intern/cycles/util/util_math_cdf.h
index 79643fe26e3..983855e3e9b 100644
--- a/intern/cycles/util/util_math_cdf.h
+++ b/intern/cycles/util/util_math_cdf.h
@@ -75,4 +75,4 @@ void util_cdf_inverted(const int resolution,
CCL_NAMESPACE_END
-#endif /* __UTIL_MATH_H_CDF__ */
+#endif /* __UTIL_MATH_H_CDF__ */
diff --git a/intern/cycles/util/util_math_fast.h b/intern/cycles/util/util_math_fast.h
index d3960deb3b4..323d40058e5 100644
--- a/intern/cycles/util/util_math_fast.h
+++ b/intern/cycles/util/util_math_fast.h
@@ -58,6 +58,11 @@ ccl_device_inline float madd(const float a, const float b, const float c)
return a * b + c;
}
+ccl_device_inline float4 madd4(const float4 a, const float4 b, const float4 c)
+{
+ return a * b + c;
+}
+
/*
* FAST & APPROXIMATE MATH
*
@@ -438,6 +443,29 @@ ccl_device_inline float fast_expf(float x)
return fast_exp2f(x / M_LN2_F);
}
+#ifndef __KERNEL_GPU__
+ccl_device float4 fast_exp2f4(float4 x)
+{
+ const float4 one = make_float4(1.0f);
+ const float4 limit = make_float4(126.0f);
+ x = clamp(x, -limit, limit);
+ int4 m = make_int4(x);
+ x = one - (one - (x - make_float4(m)));
+ float4 r = make_float4(1.33336498402e-3f);
+ r = madd4(x, r, make_float4(9.810352697968e-3f));
+ r = madd4(x, r, make_float4(5.551834031939e-2f));
+ r = madd4(x, r, make_float4(0.2401793301105f));
+ r = madd4(x, r, make_float4(0.693144857883f));
+ r = madd4(x, r, make_float4(1.0f));
+ return __int4_as_float4(__float4_as_int4(r) + (m << 23));
+}
+
+ccl_device_inline float4 fast_expf4(float4 x)
+{
+ return fast_exp2f4(x / M_LN2_F);
+}
+#endif
+
ccl_device_inline float fast_exp10(float x)
{
/* Examined 2217701018 values of exp10 on [-37.9290009,37.9290009]:
diff --git a/intern/cycles/util/util_math_float2.h b/intern/cycles/util/util_math_float2.h
index 6f9d0855d50..e937509367f 100644
--- a/intern/cycles/util/util_math_float2.h
+++ b/intern/cycles/util/util_math_float2.h
@@ -224,4 +224,4 @@ ccl_device_inline float2 interp(const float2& a, const float2& b, float t)
CCL_NAMESPACE_END
-#endif /* __UTIL_MATH_FLOAT2_H__ */
+#endif /* __UTIL_MATH_FLOAT2_H__ */
diff --git a/intern/cycles/util/util_math_float3.h b/intern/cycles/util/util_math_float3.h
index 75265c1c9a2..a54a3f3087c 100644
--- a/intern/cycles/util/util_math_float3.h
+++ b/intern/cycles/util/util_math_float3.h
@@ -419,4 +419,4 @@ ccl_device_inline float3 ensure_finite3(float3 v)
CCL_NAMESPACE_END
-#endif /* __UTIL_MATH_FLOAT3_H__ */
+#endif /* __UTIL_MATH_FLOAT3_H__ */
diff --git a/intern/cycles/util/util_math_float4.h b/intern/cycles/util/util_math_float4.h
index aa7e56fefe9..479ccf202ba 100644
--- a/intern/cycles/util/util_math_float4.h
+++ b/intern/cycles/util/util_math_float4.h
@@ -38,6 +38,7 @@ ccl_device_inline float4 operator+(const float4& a, const float4& b);
ccl_device_inline float4 operator-(const float4& a, const float4& b);
ccl_device_inline float4 operator+=(float4& a, const float4& b);
ccl_device_inline float4 operator*=(float4& a, const float4& b);
+ccl_device_inline float4 operator*=(float4& a, float f);
ccl_device_inline float4 operator/=(float4& a, float f);
ccl_device_inline int4 operator<(const float4& a, const float4& b);
@@ -58,6 +59,7 @@ ccl_device_inline float4 normalize(const float4& a);
ccl_device_inline float4 safe_normalize(const float4& a);
ccl_device_inline float4 min(const float4& a, const float4& b);
ccl_device_inline float4 max(const float4& a, const float4& b);
+ccl_device_inline float4 clamp(const float4& a, const float4& mn, const float4& mx);
ccl_device_inline float4 fabs(const float4& a);
#endif /* !__KERNEL_OPENCL__*/
@@ -168,6 +170,11 @@ ccl_device_inline float4 operator*=(float4& a, const float4& b)
return a = a * b;
}
+ccl_device_inline float4 operator*=(float4& a, float f)
+{
+ return a = a * f;
+}
+
ccl_device_inline float4 operator/=(float4& a, float f)
{
return a = a / f;
@@ -333,6 +340,11 @@ ccl_device_inline float4 max(const float4& a, const float4& b)
#endif
}
+ccl_device_inline float4 clamp(const float4& a, const float4& mn, const float4& mx)
+{
+ return min(max(a, mn), mx);
+}
+
ccl_device_inline float4 fabs(const float4& a)
{
#ifdef __KERNEL_SSE__
@@ -445,4 +457,4 @@ ccl_device_inline float4 load_float4(const float *v)
CCL_NAMESPACE_END
-#endif /* __UTIL_MATH_FLOAT4_H__ */
+#endif /* __UTIL_MATH_FLOAT4_H__ */
diff --git a/intern/cycles/util/util_math_int2.h b/intern/cycles/util/util_math_int2.h
index 828c49a131c..dd401d9a091 100644
--- a/intern/cycles/util/util_math_int2.h
+++ b/intern/cycles/util/util_math_int2.h
@@ -74,4 +74,4 @@ ccl_device_inline int2 operator/(const int2 &a, const int2 &b)
CCL_NAMESPACE_END
-#endif /* __UTIL_MATH_INT2_H__ */
+#endif /* __UTIL_MATH_INT2_H__ */
diff --git a/intern/cycles/util/util_math_int3.h b/intern/cycles/util/util_math_int3.h
index 81b10f31f4a..2f4752f90f1 100644
--- a/intern/cycles/util/util_math_int3.h
+++ b/intern/cycles/util/util_math_int3.h
@@ -113,4 +113,4 @@ ccl_device_inline int3 operator-(const int3 &a, const int3 &b)
CCL_NAMESPACE_END
-#endif /* __UTIL_MATH_INT3_H__ */
+#endif /* __UTIL_MATH_INT3_H__ */
diff --git a/intern/cycles/util/util_math_int4.h b/intern/cycles/util/util_math_int4.h
index 79a8c0841e7..763c42318d5 100644
--- a/intern/cycles/util/util_math_int4.h
+++ b/intern/cycles/util/util_math_int4.h
@@ -31,6 +31,10 @@ CCL_NAMESPACE_BEGIN
ccl_device_inline int4 operator+(const int4& a, const int4& b);
ccl_device_inline int4 operator+=(int4& a, const int4& b);
ccl_device_inline int4 operator>>(const int4& a, int i);
+ccl_device_inline int4 operator<<(const int4& a, int i);
+ccl_device_inline int4 operator<(const int4& a, const int4& b);
+ccl_device_inline int4 operator>=(const int4& a, const int4& b);
+ccl_device_inline int4 operator&(const int4& a, const int4& b);
ccl_device_inline int4 min(int4 a, int4 b);
ccl_device_inline int4 max(int4 a, int4 b);
ccl_device_inline int4 clamp(const int4& a, const int4& mn, const int4& mx);
@@ -65,6 +69,42 @@ ccl_device_inline int4 operator>>(const int4& a, int i)
#endif
}
+ccl_device_inline int4 operator<<(const int4& a, int i)
+{
+#ifdef __KERNEL_SSE__
+ return int4(_mm_slli_epi32(a.m128, i));
+#else
+ return make_int4(a.x << i, a.y << i, a.z << i, a.w << i);
+#endif
+}
+
+ccl_device_inline int4 operator<(const int4& a, const int4& b)
+{
+#ifdef __KERNEL_SSE__
+ return int4(_mm_cmplt_epi32(a.m128, b.m128));
+#else
+ return make_int4(a.x < b.x, a.y < b.y, a.z < b.z, a.w < b.w);
+#endif
+}
+
+ccl_device_inline int4 operator>=(const int4& a, const int4& b)
+{
+#ifdef __KERNEL_SSE__
+ return int4(_mm_xor_si128(_mm_set1_epi32(0xffffffff), _mm_cmplt_epi32(a.m128, b.m128)));
+#else
+ return make_int4(a.x >= b.x, a.y >= b.y, a.z >= b.z, a.w >= b.w);
+#endif
+}
+
+ccl_device_inline int4 operator&(const int4& a, const int4& b)
+{
+#ifdef __KERNEL_SSE__
+ return int4(_mm_and_si128(a.m128, b.m128));
+#else
+ return make_int4(a.x & b.x, a.y & b.y, a.z & b.z, a.w & b.w);
+#endif
+}
+
ccl_device_inline int4 min(int4 a, int4 b)
{
#if defined(__KERNEL_SSE__) && defined(__KERNEL_SSE41__)
@@ -116,4 +156,4 @@ ccl_device_inline int4 load_int4(const int *v)
CCL_NAMESPACE_END
-#endif /* __UTIL_MATH_INT4_H__ */
+#endif /* __UTIL_MATH_INT4_H__ */
diff --git a/intern/cycles/util/util_math_intersect.h b/intern/cycles/util/util_math_intersect.h
index bc3dd1500a9..aa75783d378 100644
--- a/intern/cycles/util/util_math_intersect.h
+++ b/intern/cycles/util/util_math_intersect.h
@@ -227,4 +227,4 @@ ccl_device bool ray_quad_intersect(float3 ray_P, float3 ray_D,
CCL_NAMESPACE_END
-#endif /* __UTIL_MATH_INTERSECT_H__ */
+#endif /* __UTIL_MATH_INTERSECT_H__ */
diff --git a/intern/cycles/util/util_md5.h b/intern/cycles/util/util_md5.h
index 9023ccee4c2..f8c0115d8ce 100644
--- a/intern/cycles/util/util_md5.h
+++ b/intern/cycles/util/util_md5.h
@@ -58,4 +58,4 @@ string util_md5_string(const string& str);
CCL_NAMESPACE_END
-#endif /* __UTIL_MD5_H__ */
+#endif /* __UTIL_MD5_H__ */
diff --git a/intern/cycles/util/util_murmurhash.cpp b/intern/cycles/util/util_murmurhash.cpp
new file mode 100644
index 00000000000..68b2f2031be
--- /dev/null
+++ b/intern/cycles/util/util_murmurhash.cpp
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2018 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* This is taken from alShaders/Cryptomatte/MurmurHash3.h:
+ *
+ * MurmurHash3 was written by Austin Appleby, and is placed in the public
+ * domain. The author hereby disclaims copyright to this source code.
+ *
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "util/util_algorithm.h"
+#include "util/util_murmurhash.h"
+
+#if defined(_MSC_VER)
+# define ROTL32(x,y) _rotl(x,y)
+# define ROTL64(x,y) _rotl64(x,y)
+# define BIG_CONSTANT(x) (x)
+#else
+ccl_device_inline uint32_t rotl32(uint32_t x, int8_t r)
+{
+ return (x << r) | (x >> (32 - r));
+}
+# define ROTL32(x,y) rotl32(x,y)
+# define BIG_CONSTANT(x) (x##LLU)
+#endif
+
+CCL_NAMESPACE_BEGIN
+
+/* Block read - if your platform needs to do endian-swapping or can only
+ * handle aligned reads, do the conversion here. */
+ccl_device_inline uint32_t mm_hash_getblock32(const uint32_t *p, int i)
+{
+ return p[i];
+}
+
+/* Finalization mix - force all bits of a hash block to avalanche */
+ccl_device_inline uint32_t mm_hash_fmix32 ( uint32_t h )
+{
+ h ^= h >> 16;
+ h *= 0x85ebca6b;
+ h ^= h >> 13;
+ h *= 0xc2b2ae35;
+ h ^= h >> 16;
+ return h;
+}
+
+uint32_t util_murmur_hash3(const void *key, int len, uint32_t seed)
+{
+ const uint8_t * data = (const uint8_t*)key;
+ const int nblocks = len / 4;
+
+ uint32_t h1 = seed;
+
+ const uint32_t c1 = 0xcc9e2d51;
+ const uint32_t c2 = 0x1b873593;
+
+ const uint32_t * blocks = (const uint32_t *)(data + nblocks*4);
+
+ for(int i = -nblocks; i; i++) {
+ uint32_t k1 = mm_hash_getblock32(blocks,i);
+
+ k1 *= c1;
+ k1 = ROTL32(k1,15);
+ k1 *= c2;
+
+ h1 ^= k1;
+ h1 = ROTL32(h1,13);
+ h1 = h1 * 5 + 0xe6546b64;
+ }
+
+ const uint8_t *tail = (const uint8_t*)(data + nblocks*4);
+
+ uint32_t k1 = 0;
+
+ switch(len & 3) {
+ case 3:
+ k1 ^= tail[2] << 16;
+ ATTR_FALLTHROUGH;
+ case 2:
+ k1 ^= tail[1] << 8;
+ ATTR_FALLTHROUGH;
+ case 1:
+ k1 ^= tail[0];
+ k1 *= c1;
+ k1 = ROTL32(k1,15);
+ k1 *= c2;
+ h1 ^= k1;
+ }
+
+ h1 ^= len;
+ h1 = mm_hash_fmix32(h1);
+ return h1;
+}
+
+/* This is taken from the cryptomatte specification 1.0 */
+float util_hash_to_float(uint32_t hash)
+{
+ uint32_t mantissa = hash & (( 1 << 23) - 1);
+ uint32_t exponent = (hash >> 23) & ((1 << 8) - 1);
+ exponent = max(exponent, (uint32_t) 1);
+ exponent = min(exponent, (uint32_t) 254);
+ exponent = exponent << 23;
+ uint32_t sign = (hash >> 31);
+ sign = sign << 31;
+ uint32_t float_bits = sign | exponent | mantissa;
+ float f;
+ memcpy(&f, &float_bits, sizeof(uint32_t));
+ return f;
+}
+
+CCL_NAMESPACE_END
diff --git a/intern/cycles/util/util_murmurhash.h b/intern/cycles/util/util_murmurhash.h
new file mode 100644
index 00000000000..3e7897d3ae6
--- /dev/null
+++ b/intern/cycles/util/util_murmurhash.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2018 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __UTIL_MURMURHASH_H__
+#define __UTIL_MURMURHASH_H__
+
+#include "util/util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+uint32_t util_murmur_hash3(const void *key, int len, uint32_t seed);
+float util_hash_to_float(uint32_t hash);
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_MURMURHASH_H__ */
diff --git a/intern/cycles/util/util_opengl.h b/intern/cycles/util/util_opengl.h
index 7a8d5eec1f9..04f0fbaf288 100644
--- a/intern/cycles/util/util_opengl.h
+++ b/intern/cycles/util/util_opengl.h
@@ -22,4 +22,4 @@
#include <GL/glew.h>
-#endif /* __UTIL_OPENGL_H__ */
+#endif /* __UTIL_OPENGL_H__ */
diff --git a/intern/cycles/util/util_optimization.h b/intern/cycles/util/util_optimization.h
index 3b3627242d5..5267bd9a97a 100644
--- a/intern/cycles/util/util_optimization.h
+++ b/intern/cycles/util/util_optimization.h
@@ -68,4 +68,4 @@
#endif
-#endif /* __UTIL_OPTIMIZATION_H__ */
+#endif /* __UTIL_OPTIMIZATION_H__ */
diff --git a/intern/cycles/util/util_param.h b/intern/cycles/util/util_param.h
index 246b5cb7d63..4453c66aae2 100644
--- a/intern/cycles/util/util_param.h
+++ b/intern/cycles/util/util_param.h
@@ -30,4 +30,4 @@ OIIO_NAMESPACE_USING
CCL_NAMESPACE_END
-#endif /* __UTIL_PARAM_H__ */
+#endif /* __UTIL_PARAM_H__ */
diff --git a/intern/cycles/util/util_path.cpp b/intern/cycles/util/util_path.cpp
index 51b7944705e..93080a6c80c 100644
--- a/intern/cycles/util/util_path.cpp
+++ b/intern/cycles/util/util_path.cpp
@@ -614,7 +614,7 @@ bool path_exists(const string& path)
return 0;
}
return st.st_mode != 0;
-#endif /* _WIN32 */
+#endif /* _WIN32 */
}
bool path_is_directory(const string& path)
diff --git a/intern/cycles/util/util_progress.h b/intern/cycles/util/util_progress.h
index 3ef15c5c09a..4ed9ebd60ff 100644
--- a/intern/cycles/util/util_progress.h
+++ b/intern/cycles/util/util_progress.h
@@ -114,7 +114,7 @@ public:
return cancel_message;
}
- void set_cancel_callback(function<void(void)> function)
+ void set_cancel_callback(function<void()> function)
{
cancel_cb = function;
}
@@ -323,7 +323,7 @@ public:
}
}
- void set_update_callback(function<void(void)> function)
+ void set_update_callback(function<void()> function)
{
update_cb = function;
}
@@ -331,8 +331,8 @@ public:
protected:
thread_mutex progress_mutex;
thread_mutex update_mutex;
- function<void(void)> update_cb;
- function<void(void)> cancel_cb;
+ function<void()> update_cb;
+ function<void()> cancel_cb;
/* pixel_samples counts how many samples have been rendered over all pixel, not just per pixel.
* This makes the progress estimate more accurate when tiles with different sizes are used.
@@ -365,4 +365,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __UTIL_PROGRESS_H__ */
+#endif /* __UTIL_PROGRESS_H__ */
diff --git a/intern/cycles/util/util_projection.h b/intern/cycles/util/util_projection.h
index 26b4843928c..d1af013ae3a 100644
--- a/intern/cycles/util/util_projection.h
+++ b/intern/cycles/util/util_projection.h
@@ -169,8 +169,8 @@ ccl_device_inline ProjectionTransform projection_orthographic(float znear, float
return ProjectionTransform(t);
}
-#endif /* __KERNEL_GPU__ */
+#endif /* __KERNEL_GPU__ */
CCL_NAMESPACE_END
-#endif /* __UTIL_PROJECTION_H__ */
+#endif /* __UTIL_PROJECTION_H__ */
diff --git a/intern/cycles/util/util_queue.h b/intern/cycles/util/util_queue.h
index 622f4fe3e47..0a2b7718f57 100644
--- a/intern/cycles/util/util_queue.h
+++ b/intern/cycles/util/util_queue.h
@@ -25,4 +25,4 @@ using std::queue;
CCL_NAMESPACE_END
-#endif /* __UTIL_LIST_H__ */
+#endif /* __UTIL_LIST_H__ */
diff --git a/intern/cycles/util/util_rect.h b/intern/cycles/util/util_rect.h
index d13baefe85e..389669acf2e 100644
--- a/intern/cycles/util/util_rect.h
+++ b/intern/cycles/util/util_rect.h
@@ -69,4 +69,4 @@ ccl_device_inline int rect_size(int4 rect)
CCL_NAMESPACE_END
-#endif /* __UTIL_RECT_H__ */
+#endif /* __UTIL_RECT_H__ */
diff --git a/intern/cycles/util/util_set.h b/intern/cycles/util/util_set.h
index 298e1f7729a..a9c56bb4919 100644
--- a/intern/cycles/util/util_set.h
+++ b/intern/cycles/util/util_set.h
@@ -31,4 +31,4 @@ using std::unordered_set;
CCL_NAMESPACE_END
-#endif /* __UTIL_SET_H__ */
+#endif /* __UTIL_SET_H__ */
diff --git a/intern/cycles/util/util_simd.h b/intern/cycles/util/util_simd.h
index cc7f436c8fe..565ea768089 100644
--- a/intern/cycles/util/util_simd.h
+++ b/intern/cycles/util/util_simd.h
@@ -219,9 +219,9 @@ __forceinline size_t __bscf(size_t& v)
return i;
}
-#endif /* __KERNEL_64_BIT__ */
+#endif /* __KERNEL_64_BIT__ */
-#else /* _WIN32 */
+#else /* _WIN32 */
__forceinline unsigned int __popcnt(unsigned int in) {
int r = 0; asm ("popcnt %1,%0" : "=r"(r) : "r"(in)); return r;
@@ -344,7 +344,7 @@ __forceinline size_t __bscf(size_t& v)
}
#endif
-#endif /* _WIN32 */
+#endif /* _WIN32 */
/* Test __KERNEL_SSE41__ for MSVC which does not define __SSE4_1__, and test
* __SSE4_1__ to avoid OpenImageIO conflicts with our emulation macros on other
@@ -442,7 +442,7 @@ __forceinline __m128 _mm_round_ps_emu( __m128 value, const int flags)
return value;
}
-#endif /* !(defined(__KERNEL_SSE41__) || defined(__SSE4_1__) || defined(__SSE4_2__)) */
+#endif /* !(defined(__KERNEL_SSE41__) || defined(__SSE4_1__) || defined(__SSE4_2__)) */
#else /* __KERNEL_SSE2__ */
@@ -470,7 +470,7 @@ ccl_device_inline int __bsr(int value)
return bit;
}
-#endif /* __KERNEL_SSE2__ */
+#endif /* __KERNEL_SSE2__ */
/* quiet unused define warnings */
#if defined(__KERNEL_SSE2__) || \
@@ -484,6 +484,6 @@ ccl_device_inline int __bsr(int value)
CCL_NAMESPACE_END
-#endif /* __KERNEL_GPU__ */
+#endif /* __KERNEL_GPU__ */
-#endif /* __UTIL_SIMD_TYPES_H__ */
+#endif /* __UTIL_SIMD_TYPES_H__ */
diff --git a/intern/cycles/util/util_sky_model.h b/intern/cycles/util/util_sky_model.h
index 237e4e61bf5..2e593f58c39 100644
--- a/intern/cycles/util/util_sky_model.h
+++ b/intern/cycles/util/util_sky_model.h
@@ -437,6 +437,6 @@ double arhosekskymodel_solar_radiance(ArHosekSkyModelState* state,
double wavelength);
-#endif // _SKY_MODEL_H_
+#endif // _SKY_MODEL_H_
CCL_NAMESPACE_END
diff --git a/intern/cycles/util/util_sseb.h b/intern/cycles/util/util_sseb.h
index 115b133c662..f6810505126 100644
--- a/intern/cycles/util/util_sseb.h
+++ b/intern/cycles/util/util_sseb.h
@@ -177,7 +177,7 @@ __forceinline size_t movemask( const sseb& a ) { return _mm_movemask_ps(a); }
ccl_device_inline void print_sseb(const char *label, const sseb &a)
{
- printf("%s: %df %df %df %d\n",
+ printf("%s: %d %d %d %d\n",
label, a[0], a[1], a[2], a[3]);
}
diff --git a/intern/cycles/util/util_ssef.h b/intern/cycles/util/util_ssef.h
index b5623860e33..66670c9a779 100644
--- a/intern/cycles/util/util_ssef.h
+++ b/intern/cycles/util/util_ssef.h
@@ -44,8 +44,8 @@ struct ssef
__forceinline ssef& operator=(const ssef& other) { m128 = other.m128; return *this; }
__forceinline ssef(const __m128 a) : m128(a) {}
- __forceinline operator const __m128&(void) const { return m128; }
- __forceinline operator __m128&(void) { return m128; }
+ __forceinline operator const __m128&() const { return m128; }
+ __forceinline operator __m128&() { return m128; }
__forceinline ssef (float a) : m128(_mm_set1_ps(a)) {}
__forceinline ssef (float a, float b, float c, float d) : m128(_mm_setr_ps(a, b, c, d)) {}
@@ -517,12 +517,12 @@ ccl_device_inline float len3(const ssef& a)
/* faster version for SSSE3 */
typedef ssei shuffle_swap_t;
-ccl_device_inline shuffle_swap_t shuffle_swap_identity(void)
+ccl_device_inline shuffle_swap_t shuffle_swap_identity()
{
return _mm_set_epi8(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
}
-ccl_device_inline shuffle_swap_t shuffle_swap_swap(void)
+ccl_device_inline shuffle_swap_t shuffle_swap_swap()
{
return _mm_set_epi8(7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8);
}
@@ -537,12 +537,12 @@ ccl_device_inline const ssef shuffle_swap(const ssef& a, const shuffle_swap_t& s
/* somewhat slower version for SSE2 */
typedef int shuffle_swap_t;
-ccl_device_inline shuffle_swap_t shuffle_swap_identity(void)
+ccl_device_inline shuffle_swap_t shuffle_swap_identity()
{
return 0;
}
-ccl_device_inline shuffle_swap_t shuffle_swap_swap(void)
+ccl_device_inline shuffle_swap_t shuffle_swap_swap()
{
return 1;
}
diff --git a/intern/cycles/util/util_stack_allocator.h b/intern/cycles/util/util_stack_allocator.h
index 79a535bd170..4e978e18bee 100644
--- a/intern/cycles/util/util_stack_allocator.h
+++ b/intern/cycles/util/util_stack_allocator.h
@@ -53,7 +53,7 @@ public:
T *allocate(size_t n, const void *hint = 0)
{
- (void)hint;
+ (void) hint;
if(n == 0) {
return NULL;
}
@@ -164,4 +164,4 @@ private:
CCL_NAMESPACE_END
-#endif /* __UTIL_GUARDED_ALLOCATOR_H__ */
+#endif /* __UTIL_STACK_ALLOCATOR_H__ */
diff --git a/intern/cycles/util/util_static_assert.h b/intern/cycles/util/util_static_assert.h
index dc3cb3f6ecc..b1c6c374693 100644
--- a/intern/cycles/util/util_static_assert.h
+++ b/intern/cycles/util/util_static_assert.h
@@ -47,4 +47,4 @@ CCL_NAMESPACE_BEGIN
CCL_NAMESPACE_END
-#endif /* __UTIL_STATIC_ASSERT_H__ */
+#endif /* __UTIL_STATIC_ASSERT_H__ */
diff --git a/intern/cycles/util/util_stats.h b/intern/cycles/util/util_stats.h
index 7667f58eb7d..0ba58422a67 100644
--- a/intern/cycles/util/util_stats.h
+++ b/intern/cycles/util/util_stats.h
@@ -44,4 +44,4 @@ public:
CCL_NAMESPACE_END
-#endif /* __UTIL_STATS_H__ */
+#endif /* __UTIL_STATS_H__ */
diff --git a/intern/cycles/util/util_string.h b/intern/cycles/util/util_string.h
index 3a4f4398158..f17112c30d2 100644
--- a/intern/cycles/util/util_string.h
+++ b/intern/cycles/util/util_string.h
@@ -74,4 +74,4 @@ string string_human_readable_number(size_t num);
CCL_NAMESPACE_END
-#endif /* __UTIL_STRING_H__ */
+#endif /* __UTIL_STRING_H__ */
diff --git a/intern/cycles/util/util_system.cpp b/intern/cycles/util/util_system.cpp
index 1b039888452..34f428f111c 100644
--- a/intern/cycles/util/util_system.cpp
+++ b/intern/cycles/util/util_system.cpp
@@ -52,14 +52,14 @@ int system_cpu_group_thread_count(int group)
util_windows_init_numa_groups();
return GetActiveProcessorCount(group);
#elif defined(__APPLE__)
- (void)group;
+ (void) group;
int count;
size_t len = sizeof(count);
int mib[2] = { CTL_HW, HW_NCPU };
sysctl(mib, 2, &count, &len, NULL, 0);
return count;
#else
- (void)group;
+ (void) group;
return sysconf(_SC_NPROCESSORS_ONLN);
#endif
}
diff --git a/intern/cycles/util/util_system.h b/intern/cycles/util/util_system.h
index 42ad72356b9..241ac897157 100644
--- a/intern/cycles/util/util_system.h
+++ b/intern/cycles/util/util_system.h
@@ -46,4 +46,4 @@ size_t system_physical_ram();
CCL_NAMESPACE_END
-#endif /* __UTIL_SYSTEM_H__ */
+#endif /* __UTIL_SYSTEM_H__ */
diff --git a/intern/cycles/util/util_texture.h b/intern/cycles/util/util_texture.h
index f752e81128d..233cfe33305 100644
--- a/intern/cycles/util/util_texture.h
+++ b/intern/cycles/util/util_texture.h
@@ -89,4 +89,4 @@ typedef struct TextureInfo {
CCL_NAMESPACE_END
-#endif /* __UTIL_TEXTURE_H__ */
+#endif /* __UTIL_TEXTURE_H__ */
diff --git a/intern/cycles/util/util_thread.cpp b/intern/cycles/util/util_thread.cpp
index 16a8591a8a9..37d8bdbd4b0 100644
--- a/intern/cycles/util/util_thread.cpp
+++ b/intern/cycles/util/util_thread.cpp
@@ -21,7 +21,7 @@
CCL_NAMESPACE_BEGIN
-thread::thread(function<void(void)> run_cb, int group)
+thread::thread(function<void()> run_cb, int group)
: run_cb_(run_cb),
joined_(false),
group_(group)
diff --git a/intern/cycles/util/util_thread.h b/intern/cycles/util/util_thread.h
index f39fcfb4279..6250bb95dcf 100644
--- a/intern/cycles/util/util_thread.h
+++ b/intern/cycles/util/util_thread.h
@@ -46,14 +46,14 @@ typedef std::condition_variable thread_condition_variable;
class thread {
public:
- thread(function<void(void)> run_cb, int group = -1);
+ thread(function<void()> run_cb, int group = -1);
~thread();
static void *run(void *arg);
bool join();
protected:
- function<void(void)> run_cb_;
+ function<void()> run_cb_;
std::thread thread_;
bool joined_;
int group_;
@@ -138,4 +138,4 @@ protected:
CCL_NAMESPACE_END
-#endif /* __UTIL_THREAD_H__ */
+#endif /* __UTIL_THREAD_H__ */
diff --git a/intern/cycles/util/util_transform.h b/intern/cycles/util/util_transform.h
index e781f85dded..e4cadd3e81a 100644
--- a/intern/cycles/util/util_transform.h
+++ b/intern/cycles/util/util_transform.h
@@ -424,6 +424,31 @@ ccl_device void transform_motion_array_interpolate(Transform *tfm,
#ifndef __KERNEL_GPU__
+#ifdef WITH_EMBREE
+ccl_device void transform_motion_array_interpolate_straight(Transform *tfm,
+ const ccl_global DecomposedTransform *motion,
+ uint numsteps,
+ float time)
+{
+ /* Figure out which steps we need to interpolate. */
+ int maxstep = numsteps - 1;
+ int step = min((int)(time*maxstep), maxstep - 1);
+ float t = time * maxstep - step;
+
+ const ccl_global DecomposedTransform *a = motion + step;
+ const ccl_global DecomposedTransform *b = motion + step + 1;
+ Transform step1, step2;
+
+ transform_compose(&step1, a);
+ transform_compose(&step2, b);
+
+ /* matrix lerp */
+ tfm->x = (1.0f - t) * step1.x + t * step2.x;
+ tfm->y = (1.0f - t) * step1.y + t * step2.y;
+ tfm->z = (1.0f - t) * step1.z + t * step2.z;
+}
+#endif
+
class BoundBox2D;
ccl_device_inline bool operator==(const DecomposedTransform& A, const DecomposedTransform& B)
@@ -470,4 +495,4 @@ OPENCL_TRANSFORM_ADDRSPACE_DECLARE(transform_direction_transposed)
CCL_NAMESPACE_END
-#endif /* __UTIL_TRANSFORM_H__ */
+#endif /* __UTIL_TRANSFORM_H__ */
diff --git a/intern/cycles/util/util_types.h b/intern/cycles/util/util_types.h
index 96c549b9be5..535048d8f8c 100644
--- a/intern/cycles/util/util_types.h
+++ b/intern/cycles/util/util_types.h
@@ -156,4 +156,4 @@ CCL_NAMESPACE_END
#endif
#endif
-#endif /* __UTIL_TYPES_H__ */
+#endif /* __UTIL_TYPES_H__ */
diff --git a/intern/cycles/util/util_types_float3.h b/intern/cycles/util/util_types_float3.h
index 28146ad04f7..ed2300e7996 100644
--- a/intern/cycles/util/util_types_float3.h
+++ b/intern/cycles/util/util_types_float3.h
@@ -35,8 +35,8 @@ struct ccl_try_align(16) float3 {
__forceinline float3(const float3& a);
__forceinline explicit float3(const __m128& a);
- __forceinline operator const __m128&(void) const;
- __forceinline operator __m128&(void);
+ __forceinline operator const __m128&() const;
+ __forceinline operator __m128&();
__forceinline float3& operator =(const float3& a);
#else /* __KERNEL_SSE__ */
diff --git a/intern/cycles/util/util_types_float3_impl.h b/intern/cycles/util/util_types_float3_impl.h
index 45f61767d3f..2e840a5c399 100644
--- a/intern/cycles/util/util_types_float3_impl.h
+++ b/intern/cycles/util/util_types_float3_impl.h
@@ -43,12 +43,12 @@ __forceinline float3::float3(const __m128& a)
{
}
-__forceinline float3::operator const __m128&(void) const
+__forceinline float3::operator const __m128&() const
{
return m128;
}
-__forceinline float3::operator __m128&(void)
+__forceinline float3::operator __m128&()
{
return m128;
}
diff --git a/intern/cycles/util/util_types_float4.h b/intern/cycles/util/util_types_float4.h
index 154391f6881..5c10d483c2e 100644
--- a/intern/cycles/util/util_types_float4.h
+++ b/intern/cycles/util/util_types_float4.h
@@ -36,8 +36,8 @@ struct ccl_try_align(16) float4 {
__forceinline float4();
__forceinline explicit float4(const __m128& a);
- __forceinline operator const __m128&(void) const;
- __forceinline operator __m128&(void);
+ __forceinline operator const __m128&() const;
+ __forceinline operator __m128&();
__forceinline float4& operator =(const float4& a);
diff --git a/intern/cycles/util/util_types_float4_impl.h b/intern/cycles/util/util_types_float4_impl.h
index a49fac65b10..a83148031f1 100644
--- a/intern/cycles/util/util_types_float4_impl.h
+++ b/intern/cycles/util/util_types_float4_impl.h
@@ -38,12 +38,12 @@ __forceinline float4::float4(const __m128& a)
{
}
-__forceinline float4::operator const __m128&(void) const
+__forceinline float4::operator const __m128&() const
{
return m128;
}
-__forceinline float4::operator __m128&(void)
+__forceinline float4::operator __m128&()
{
return m128;
}
diff --git a/intern/cycles/util/util_types_float8.h b/intern/cycles/util/util_types_float8.h
index 64ec5a71355..08720b8ff48 100644
--- a/intern/cycles/util/util_types_float8.h
+++ b/intern/cycles/util/util_types_float8.h
@@ -37,7 +37,7 @@ CCL_NAMESPACE_BEGIN
#ifndef __KERNEL_GPU__
-struct ccl_try_align(16) float8 {
+struct ccl_try_align(32) float8 {
#ifdef __KERNEL_AVX2__
union {
__m256 m256;
@@ -48,8 +48,8 @@ struct ccl_try_align(16) float8 {
__forceinline float8(const float8& a);
__forceinline explicit float8(const __m256& a);
- __forceinline operator const __m256&(void) const;
- __forceinline operator __m256&(void);
+ __forceinline operator const __m256&() const;
+ __forceinline operator __m256&();
__forceinline float8& operator =(const float8& a);
diff --git a/intern/cycles/util/util_types_float8_impl.h b/intern/cycles/util/util_types_float8_impl.h
index ebf8260bc7c..84fe233c334 100644
--- a/intern/cycles/util/util_types_float8_impl.h
+++ b/intern/cycles/util/util_types_float8_impl.h
@@ -55,12 +55,12 @@ __forceinline float8::float8(const __m256& f)
{
}
-__forceinline float8::operator const __m256&(void) const
+__forceinline float8::operator const __m256&() const
{
return m256;
}
-__forceinline float8::operator __m256&(void)
+__forceinline float8::operator __m256&()
{
return m256;
}
diff --git a/intern/cycles/util/util_types_int3.h b/intern/cycles/util/util_types_int3.h
index 9d43b201c02..f68074b982b 100644
--- a/intern/cycles/util/util_types_int3.h
+++ b/intern/cycles/util/util_types_int3.h
@@ -35,8 +35,8 @@ struct ccl_try_align(16) int3 {
__forceinline int3(const int3& a);
__forceinline explicit int3(const __m128i& a);
- __forceinline operator const __m128i&(void) const;
- __forceinline operator __m128i&(void);
+ __forceinline operator const __m128i&() const;
+ __forceinline operator __m128i&();
__forceinline int3& operator =(const int3& a);
#else /* __KERNEL_SSE__ */
diff --git a/intern/cycles/util/util_types_int3_impl.h b/intern/cycles/util/util_types_int3_impl.h
index ada50c4812c..1b195ca753f 100644
--- a/intern/cycles/util/util_types_int3_impl.h
+++ b/intern/cycles/util/util_types_int3_impl.h
@@ -43,12 +43,12 @@ __forceinline int3::int3(const int3& a)
{
}
-__forceinline int3::operator const __m128i&(void) const
+__forceinline int3::operator const __m128i&() const
{
return m128;
}
-__forceinline int3::operator __m128i&(void)
+__forceinline int3::operator __m128i&()
{
return m128;
}
diff --git a/intern/cycles/util/util_types_int4.h b/intern/cycles/util/util_types_int4.h
index cdd0ecbdae5..52e6fed8c14 100644
--- a/intern/cycles/util/util_types_int4.h
+++ b/intern/cycles/util/util_types_int4.h
@@ -26,6 +26,7 @@ CCL_NAMESPACE_BEGIN
#ifndef __KERNEL_GPU__
struct float3;
+struct float4;
struct ccl_try_align(16) int4 {
#ifdef __KERNEL_SSE__
@@ -38,8 +39,8 @@ struct ccl_try_align(16) int4 {
__forceinline int4(const int4& a);
__forceinline explicit int4(const __m128i& a);
- __forceinline operator const __m128i&(void) const;
- __forceinline operator __m128i&(void);
+ __forceinline operator const __m128i&() const;
+ __forceinline operator __m128i&();
__forceinline int4& operator=(const int4& a);
#else /* __KERNEL_SSE__ */
@@ -53,6 +54,7 @@ struct ccl_try_align(16) int4 {
ccl_device_inline int4 make_int4(int i);
ccl_device_inline int4 make_int4(int x, int y, int z, int w);
ccl_device_inline int4 make_int4(const float3& f);
+ccl_device_inline int4 make_int4(const float4& f);
ccl_device_inline void print_int4(const char *label, const int4& a);
#endif /* __KERNEL_GPU__ */
diff --git a/intern/cycles/util/util_types_int4_impl.h b/intern/cycles/util/util_types_int4_impl.h
index 07cdc88f2dc..c058f86c400 100644
--- a/intern/cycles/util/util_types_int4_impl.h
+++ b/intern/cycles/util/util_types_int4_impl.h
@@ -43,12 +43,12 @@ __forceinline int4::int4(const __m128i& a)
{
}
-__forceinline int4::operator const __m128i&(void) const
+__forceinline int4::operator const __m128i&() const
{
return m128;
}
-__forceinline int4::operator __m128i&(void)
+__forceinline int4::operator __m128i&()
{
return m128;
}
@@ -104,6 +104,16 @@ ccl_device_inline int4 make_int4(const float3& f)
return a;
}
+ccl_device_inline int4 make_int4(const float4& f)
+{
+#ifdef __KERNEL_SSE__
+ int4 a(_mm_cvtps_epi32(f.m128));
+#else
+ int4 a = {(int)f.x, (int)f.y, (int)f.z, (int)f.w};
+#endif
+ return a;
+}
+
ccl_device_inline void print_int4(const char *label, const int4& a)
{
printf("%s: %d %d %d %d\n", label, a.x, a.y, a.z, a.w);
diff --git a/intern/cycles/util/util_vector.h b/intern/cycles/util/util_vector.h
index 0b33221ad4d..18fa231d6e7 100644
--- a/intern/cycles/util/util_vector.h
+++ b/intern/cycles/util/util_vector.h
@@ -17,8 +17,6 @@
#ifndef __UTIL_VECTOR_H__
#define __UTIL_VECTOR_H__
-/* Vector */
-
#include <cassert>
#include <cstring>
#include <vector>
@@ -29,12 +27,9 @@
CCL_NAMESPACE_BEGIN
-/* Vector
- *
- * Own subclass-ed vestion of std::vector. Subclass is needed because:
+/* Own subclass-ed vestion of std::vector. Subclass is needed because:
*
* - Use own allocator which keeps track of used/peak memory.
- *
* - Have method to ensure capacity is re-set to 0.
*/
template<typename value_type,
@@ -42,30 +37,16 @@ template<typename value_type,
class vector : public std::vector<value_type, allocator_type>
{
public:
- /* Default constructor. */
- explicit vector() : std::vector<value_type, allocator_type>() { }
-
- /* Fill constructor. */
- explicit vector(size_t n, const value_type& val = value_type())
- : std::vector<value_type, allocator_type>(n, val) { }
-
- /* Range constructor. */
- template <class InputIterator>
- vector(InputIterator first, InputIterator last)
- : std::vector<value_type, allocator_type>(first, last) { }
-
- /* Copy constructor. */
- vector(const vector &x) : std::vector<value_type, allocator_type>(x) { }
+ typedef std::vector<value_type, allocator_type> BaseClass;
- void shrink_to_fit(void)
- {
- std::vector<value_type, allocator_type>::shrink_to_fit();
- }
+ /* Inherit all constructors from base class. */
+ using BaseClass::vector;
- void free_memory(void)
+ /* Try as hard as possible to use zero memory. */
+ void free_memory()
{
- std::vector<value_type, allocator_type>::resize(0);
- shrink_to_fit();
+ BaseClass::resize(0);
+ BaseClass::shrink_to_fit();
}
/* Some external API might demand working with std::vector. */
@@ -75,265 +56,6 @@ public:
}
};
-/* Array
- *
- * Simplified version of vector, serving multiple purposes:
- * - somewhat faster in that it does not clear memory on resize/alloc,
- * this was actually showing up in profiles quite significantly. it
- * also does not run any constructors/destructors
- * - if this is used, we are not tempted to use inefficient operations
- * - aligned allocation for CPU native data types */
-
-template<typename T, size_t alignment = MIN_ALIGNMENT_CPU_DATA_TYPES>
-class array
-{
-public:
- array()
- : data_(NULL),
- datasize_(0),
- capacity_(0)
- {}
-
- explicit array(size_t newsize)
- {
- if(newsize == 0) {
- data_ = NULL;
- datasize_ = 0;
- capacity_ = 0;
- }
- else {
- data_ = mem_allocate(newsize);
- datasize_ = newsize;
- capacity_ = datasize_;
- }
- }
-
- array(const array& from)
- {
- if(from.datasize_ == 0) {
- data_ = NULL;
- datasize_ = 0;
- capacity_ = 0;
- }
- else {
- data_ = mem_allocate(from.datasize_);
- memcpy(data_, from.data_, from.datasize_*sizeof(T));
- datasize_ = from.datasize_;
- capacity_ = datasize_;
- }
- }
-
- array& operator=(const array& from)
- {
- if(this != &from) {
- resize(from.size());
- memcpy((void*)data_, from.data_, datasize_*sizeof(T));
- }
-
- return *this;
- }
-
- array& operator=(const vector<T>& from)
- {
- resize(from.size());
-
- if(from.size() > 0) {
- memcpy(data_, &from[0], datasize_*sizeof(T));
- }
-
- return *this;
- }
-
- ~array()
- {
- mem_free(data_, capacity_);
- }
-
- bool operator==(const array<T>& other) const
- {
- if(datasize_ != other.datasize_) {
- return false;
- }
-
- return memcmp(data_, other.data_, datasize_*sizeof(T)) == 0;
- }
-
- bool operator!=(const array<T>& other) const
- {
- return !(*this == other);
- }
-
- void steal_data(array& from)
- {
- if(this != &from) {
- clear();
-
- data_ = from.data_;
- datasize_ = from.datasize_;
- capacity_ = from.capacity_;
-
- from.data_ = NULL;
- from.datasize_ = 0;
- from.capacity_ = 0;
- }
- }
-
- T *steal_pointer()
- {
- T *ptr = data_;
- data_ = NULL;
- clear();
- return ptr;
- }
-
- T* resize(size_t newsize)
- {
- if(newsize == 0) {
- clear();
- }
- else if(newsize != datasize_) {
- if(newsize > capacity_) {
- T *newdata = mem_allocate(newsize);
- if(newdata == NULL) {
- /* Allocation failed, likely out of memory. */
- clear();
- return NULL;
- }
- else if(data_ != NULL) {
- memcpy((void *)newdata,
- data_,
- ((datasize_ < newsize)? datasize_: newsize)*sizeof(T));
- mem_free(data_, capacity_);
- }
- data_ = newdata;
- capacity_ = newsize;
- }
- datasize_ = newsize;
- }
- return data_;
- }
-
- T* resize(size_t newsize, const T& value)
- {
- size_t oldsize = size();
- resize(newsize);
-
- for(size_t i = oldsize; i < size(); i++) {
- data_[i] = value;
- }
-
- return data_;
- }
-
- void clear()
- {
- if(data_ != NULL) {
- mem_free(data_, capacity_);
- data_ = NULL;
- }
- datasize_ = 0;
- capacity_ = 0;
- }
-
- size_t empty() const
- {
- return datasize_ == 0;
- }
-
- size_t size() const
- {
- return datasize_;
- }
-
- T* data()
- {
- return data_;
- }
-
- const T* data() const
- {
- return data_;
- }
-
- T& operator[](size_t i) const
- {
- assert(i < datasize_);
- return data_[i];
- }
-
- void reserve(size_t newcapacity)
- {
- if(newcapacity > capacity_) {
- T *newdata = mem_allocate(newcapacity);
- if(data_ != NULL) {
- memcpy(newdata, data_, ((datasize_ < newcapacity)? datasize_: newcapacity)*sizeof(T));
- mem_free(data_, capacity_);
- }
- data_ = newdata;
- capacity_ = newcapacity;
- }
- }
-
- size_t capacity() const
- {
- return capacity_;
- }
-
- // do not use this method unless you are sure the code is not performance critical
- void push_back_slow(const T& t)
- {
- if(capacity_ == datasize_)
- {
- reserve(datasize_ == 0 ? 1 : (size_t)((datasize_ + 1) * 1.2));
- }
-
- data_[datasize_++] = t;
- }
-
- void push_back_reserved(const T& t)
- {
- assert(datasize_ < capacity_);
- push_back_slow(t);
- }
-
- void append(const array<T>& from)
- {
- if(from.size()) {
- size_t old_size = size();
- resize(old_size + from.size());
- memcpy(data_ + old_size, from.data(), sizeof(T) * from.size());
- }
- }
-
-protected:
- inline T* mem_allocate(size_t N)
- {
- if(N == 0) {
- return NULL;
- }
- T *mem = (T*)util_aligned_malloc(sizeof(T)*N, alignment);
- if(mem != NULL) {
- util_guarded_mem_alloc(sizeof(T)*N);
- }
- else {
- throw std::bad_alloc();
- }
- return mem;
- }
-
- inline void mem_free(T *mem, size_t N)
- {
- if(mem != NULL) {
- util_guarded_mem_free(sizeof(T)*N);
- util_aligned_free(mem);
- }
- }
-
- T *data_;
- size_t datasize_;
- size_t capacity_;
-};
-
CCL_NAMESPACE_END
-#endif /* __UTIL_VECTOR_H__ */
+#endif /* __UTIL_VECTOR_H__ */
diff --git a/intern/cycles/util/util_version.h b/intern/cycles/util/util_version.h
index 112255f447b..980c5a269e6 100644
--- a/intern/cycles/util/util_version.h
+++ b/intern/cycles/util/util_version.h
@@ -34,4 +34,4 @@ CCL_NAMESPACE_BEGIN
CCL_NAMESPACE_END
-#endif /* __UTIL_VERSION_H__ */
+#endif /* __UTIL_VERSION_H__ */
diff --git a/intern/cycles/util/util_view.cpp b/intern/cycles/util/util_view.cpp
index 05094c7b327..c0ddc2a88bf 100644
--- a/intern/cycles/util/util_view.cpp
+++ b/intern/cycles/util/util_view.cpp
@@ -215,7 +215,7 @@ static void view_motion(int x, int y)
V.mouseY = y;
}
-static void view_idle(void)
+static void view_idle()
{
if(V.redraw) {
V.redraw = false;
diff --git a/intern/cycles/util/util_view.h b/intern/cycles/util/util_view.h
index e603e605776..ae50b098b39 100644
--- a/intern/cycles/util/util_view.h
+++ b/intern/cycles/util/util_view.h
@@ -22,10 +22,10 @@
CCL_NAMESPACE_BEGIN
-typedef void (*ViewInitFunc)(void);
-typedef void (*ViewExitFunc)(void);
+typedef void (*ViewInitFunc)();
+typedef void (*ViewExitFunc)();
typedef void (*ViewResizeFunc)(int width, int height);
-typedef void (*ViewDisplayFunc)(void);
+typedef void (*ViewDisplayFunc)();
typedef void (*ViewKeyboardFunc)(unsigned char key);
typedef void (*ViewMotionFunc)(int x, int y, int button);
@@ -40,4 +40,4 @@ void view_redraw();
CCL_NAMESPACE_END
-#endif /*__UTIL_VIEW_H__*/
+#endif /*__UTIL_VIEW_H__*/
diff --git a/intern/cycles/util/util_windows.h b/intern/cycles/util/util_windows.h
index 3b23ce8a3cb..9b9268fed7a 100644
--- a/intern/cycles/util/util_windows.h
+++ b/intern/cycles/util/util_windows.h
@@ -56,4 +56,4 @@ CCL_NAMESPACE_END
#endif /* WIN32 */
-#endif /* __UTIL_WINDOWS_H__ */
+#endif /* __UTIL_WINDOWS_H__ */
diff --git a/intern/cycles/util/util_xml.h b/intern/cycles/util/util_xml.h
index 6f06f17937b..c8a3a495f30 100644
--- a/intern/cycles/util/util_xml.h
+++ b/intern/cycles/util/util_xml.h
@@ -38,4 +38,4 @@ using PUGIXML_NAMESPACE::xml_parse_result;
CCL_NAMESPACE_END
-#endif /* __UTIL_XML_H__ */
+#endif /* __UTIL_XML_H__ */
diff --git a/intern/dualcon/dualcon.h b/intern/dualcon/dualcon.h
index 6ec63f4fdac..2e7616f3446 100644
--- a/intern/dualcon/dualcon.h
+++ b/intern/dualcon/dualcon.h
@@ -37,8 +37,6 @@ typedef unsigned int (*DualConTri)[3];
typedef unsigned int (*DualConLoop);
-struct DerivedMesh;
-
typedef struct DualConInput {
DualConLoop mloop;
diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h
index a911c4560e4..1ce051d2660 100644
--- a/intern/ghost/GHOST_C-api.h
+++ b/intern/ghost/GHOST_C-api.h
@@ -940,6 +940,11 @@ extern int GHOST_SupportsNativeDialogs(void);
extern int GHOST_UseNativePixels(void);
/**
+ * Focus window after opening, or put them in the background.
+ */
+extern void GHOST_UseWindowFocus(int use_focus);
+
+/**
* If window was opened using native pixel size, it returns scaling factor.
*/
extern float GHOST_GetNativePixelSize(GHOST_WindowHandle windowhandle);
diff --git a/intern/ghost/GHOST_ISystem.h b/intern/ghost/GHOST_ISystem.h
index 07273c40d17..42ae750e20a 100644
--- a/intern/ghost/GHOST_ISystem.h
+++ b/intern/ghost/GHOST_ISystem.h
@@ -321,6 +321,11 @@ public:
*/
virtual bool useNativePixel(void) = 0;
+ /**
+ * Focus window after opening, or put them in the background.
+ */
+ virtual void useWindowFocus(const bool use_focus) = 0;
+
/***************************************************************************************
* Event management functionality
***************************************************************************************/
diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp
index 90956cf541a..ab0e7b724b8 100644
--- a/intern/ghost/intern/GHOST_C-api.cpp
+++ b/intern/ghost/intern/GHOST_C-api.cpp
@@ -939,6 +939,12 @@ int GHOST_UseNativePixels(void)
return system->useNativePixel();
}
+void GHOST_UseWindowFocus(int use_focus)
+{
+ GHOST_ISystem *system = GHOST_ISystem::getSystem();
+ return system->useWindowFocus(use_focus);
+}
+
float GHOST_GetNativePixelSize(GHOST_WindowHandle windowhandle)
{
GHOST_IWindow *window = (GHOST_IWindow *) windowhandle;
diff --git a/intern/ghost/intern/GHOST_Context.h b/intern/ghost/intern/GHOST_Context.h
index 670b86d456f..327ecd4b245 100644
--- a/intern/ghost/intern/GHOST_Context.h
+++ b/intern/ghost/intern/GHOST_Context.h
@@ -117,9 +117,10 @@ public:
return GHOST_kFailure;
}
- /** Stereo visual created. Only necessary for 'real' stereo support,
- * ie quad buffered stereo. This is not always possible, depends on
- * the graphics h/w
+ /**
+ * Stereo visual created. Only necessary for 'real' stereo support,
+ * ie quad buffered stereo. This is not always possible, depends on
+ * the graphics h/w
*/
inline bool isStereoVisual() const {
return m_stereoVisual;
diff --git a/intern/ghost/intern/GHOST_DropTargetWin32.cpp b/intern/ghost/intern/GHOST_DropTargetWin32.cpp
index de12dfad815..72463b456c6 100644
--- a/intern/ghost/intern/GHOST_DropTargetWin32.cpp
+++ b/intern/ghost/intern/GHOST_DropTargetWin32.cpp
@@ -60,7 +60,7 @@ GHOST_DropTargetWin32::~GHOST_DropTargetWin32()
/*
- * IUnknown::QueryInterface
+ * IUnknown::QueryInterface
*/
HRESULT __stdcall GHOST_DropTargetWin32::QueryInterface(REFIID riid, void **ppvObj)
{
@@ -82,7 +82,7 @@ HRESULT __stdcall GHOST_DropTargetWin32::QueryInterface(REFIID riid, void **ppvO
/*
- * IUnknown::AddRef
+ * IUnknown::AddRef
*/
ULONG __stdcall GHOST_DropTargetWin32::AddRef(void)
diff --git a/intern/ghost/intern/GHOST_System.cpp b/intern/ghost/intern/GHOST_System.cpp
index 4a8a8c48018..fc69900acdf 100644
--- a/intern/ghost/intern/GHOST_System.cpp
+++ b/intern/ghost/intern/GHOST_System.cpp
@@ -48,6 +48,7 @@
GHOST_System::GHOST_System()
: m_nativePixel(false),
+ m_windowFocus(true),
m_displayManager(NULL),
m_timerManager(NULL),
m_windowManager(NULL),
@@ -394,3 +395,8 @@ bool GHOST_System::useNativePixel(void)
m_nativePixel = true;
return 1;
}
+
+void GHOST_System::useWindowFocus(const bool use_focus)
+{
+ m_windowFocus = use_focus;
+}
diff --git a/intern/ghost/intern/GHOST_System.h b/intern/ghost/intern/GHOST_System.h
index 2fd8603516d..ee3c30c35b4 100644
--- a/intern/ghost/intern/GHOST_System.h
+++ b/intern/ghost/intern/GHOST_System.h
@@ -177,6 +177,12 @@ public:
bool useNativePixel(void);
bool m_nativePixel;
+ /**
+ * Focus window after opening, or put them in the background.
+ */
+ void useWindowFocus(const bool use_focus);
+ bool m_windowFocus;
+
/***************************************************************************************
* Event management functionality
***************************************************************************************/
@@ -184,7 +190,7 @@ public:
/**
* Inherited from GHOST_ISystem but left pure virtual
*
- * virtual bool processEvents(bool waitForEvent) = 0;
+ * virtual bool processEvents(bool waitForEvent) = 0;
*/
@@ -213,9 +219,12 @@ public:
* Cursor management functionality
***************************************************************************************/
- /** Inherited from GHOST_ISystem but left pure virtual
- * GHOST_TSuccess getCursorPosition(GHOST_TInt32& x, GHOST_TInt32& y) const = 0;
- * GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y)
+ /**
+ * Inherited from GHOST_ISystem but left pure virtual
+ * <pre>
+ * GHOST_TSuccess getCursorPosition(GHOST_TInt32& x, GHOST_TInt32& y) const = 0;
+ * GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y)
+ * </pre>
*/
/***************************************************************************************
diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm
index 43ed30bd415..8672e298fe2 100644
--- a/intern/ghost/intern/GHOST_SystemCocoa.mm
+++ b/intern/ghost/intern/GHOST_SystemCocoa.mm
@@ -309,11 +309,13 @@ extern "C" int GHOST_HACK_getFirstFile(char buf[FIRSTFILEBUFLG])
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
- // raise application to front, convenient when starting from the terminal
- // and important for launching the animation player. we call this after the
- // application finishes launching, as doing it earlier can make us end up
- // with a frontmost window but an inactive application
- [NSApp activateIgnoringOtherApps:YES];
+ if (systemCocoa->m_windowFocus) {
+ // Raise application to front, convenient when starting from the terminal
+ // and important for launching the animation player. we call this after the
+ // application finishes launching, as doing it earlier can make us end up
+ // with a frontmost window but an inactive application.
+ [NSApp activateIgnoringOtherApps:YES];
+ }
}
- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp
index 99fa5026c03..bcf7d4e587a 100644
--- a/intern/ghost/intern/GHOST_SystemWin32.cpp
+++ b/intern/ghost/intern/GHOST_SystemWin32.cpp
@@ -1446,9 +1446,9 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
break;
case WM_DPICHANGED:
/* The WM_DPICHANGED message is sent when the effective dots per inch (dpi) for a window has changed.
- * The DPI is the scale factor for a window. There are multiple events that can cause the DPI to
- * change such as when the window is moved to a monitor with a different DPI.
- */
+ * The DPI is the scale factor for a window. There are multiple events that can cause the DPI to
+ * change such as when the window is moved to a monitor with a different DPI.
+ */
{
WORD newYAxisDPI = HIWORD(wParam);
WORD newXAxisDPI = LOWORD(wParam);
diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp
index 5d383f68e9d..37a2c50c442 100644
--- a/intern/ghost/intern/GHOST_SystemX11.cpp
+++ b/intern/ghost/intern/GHOST_SystemX11.cpp
@@ -1903,7 +1903,7 @@ ghost_key_from_keycode(const XkbDescPtr xkb_descr, const KeyCode keycode)
#endif
}
}
- else {
+ else if (keycode != 0) {
GHOST_ASSERT(false, "KeyCode out of range!");
}
return GHOST_kKeyUnknown;
diff --git a/intern/ghost/intern/GHOST_SystemX11.h b/intern/ghost/intern/GHOST_SystemX11.h
index 4564bebe4fc..ec6da53631d 100644
--- a/intern/ghost/intern/GHOST_SystemX11.h
+++ b/intern/ghost/intern/GHOST_SystemX11.h
@@ -397,7 +397,7 @@ private:
char m_keyboard_vector[32];
/* to prevent multiple warp, we store the time of the last warp event
- * and stop accumulating all events generated before that */
+ * and stop accumulating all events generated before that */
Time m_last_warp;
/* detect autorepeat glitch */
diff --git a/intern/ghost/intern/GHOST_Window.h b/intern/ghost/intern/GHOST_Window.h
index e6a4682ee7c..59d3123b9de 100644
--- a/intern/ghost/intern/GHOST_Window.h
+++ b/intern/ghost/intern/GHOST_Window.h
@@ -296,9 +296,9 @@ public:
}
/**
- * Returns the recommended DPI for this window.
- * \return The recommended DPI for this window.
- */
+ * Returns the recommended DPI for this window.
+ * \return The recommended DPI for this window.
+ */
virtual inline GHOST_TUns16 getDPIHint()
{
return 96;
diff --git a/intern/ghost/intern/GHOST_WindowCocoa.mm b/intern/ghost/intern/GHOST_WindowCocoa.mm
index 22dc772fff0..43695f3f774 100644
--- a/intern/ghost/intern/GHOST_WindowCocoa.mm
+++ b/intern/ghost/intern/GHOST_WindowCocoa.mm
@@ -551,7 +551,15 @@ GHOST_WindowCocoa::GHOST_WindowCocoa(
//Creates the OpenGL View inside the window
m_openGLView = [[CocoaOpenGLView alloc] initWithFrame:rect];
-
+
+ if (m_systemCocoa->m_nativePixel) {
+ // Needs to happen early when building with the 10.14 SDK, otherwise
+ // has no effect until resizeing the window.
+ if ([m_openGLView respondsToSelector:@selector(setWantsBestResolutionOpenGLSurface:)]) {
+ [m_openGLView setWantsBestResolutionOpenGLSurface:YES];
+ }
+ }
+
[m_openGLView setSystemAndWindowCocoa:systemCocoa windowCocoa:this];
[m_window setContentView:m_openGLView];
@@ -563,14 +571,9 @@ GHOST_WindowCocoa::GHOST_WindowCocoa(
updateDrawingContext();
activateDrawingContext();
- // XXX jwilkins: This seems like it belongs in GHOST_ContextCGL, but probably not GHOST_ContextEGL
if (m_systemCocoa->m_nativePixel) {
- if ([m_openGLView respondsToSelector:@selector(setWantsBestResolutionOpenGLSurface:)]) {
- [m_openGLView setWantsBestResolutionOpenGLSurface:YES];
-
- NSRect backingBounds = [m_openGLView convertRectToBacking:[m_openGLView bounds]];
- m_nativePixelSize = (float)backingBounds.size.width / (float)rect.size.width;
- }
+ NSRect backingBounds = [m_openGLView convertRectToBacking:[m_openGLView bounds]];
+ m_nativePixelSize = (float)backingBounds.size.width / (float)rect.size.width;
}
setTitle(title);
diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp
index 70edc66d570..8cd943d35df 100644
--- a/intern/ghost/intern/GHOST_WindowWin32.cpp
+++ b/intern/ghost/intern/GHOST_WindowWin32.cpp
@@ -201,6 +201,11 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system,
// Store a pointer to this class in the window structure
::SetWindowLongPtr(m_hWnd, GWLP_USERDATA, (LONG_PTR) this);
+ if (!m_system->m_windowFocus) {
+ // Lower to bottom and don't activate if we don't want focus
+ ::SetWindowPos(m_hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+ }
+
// Store the device context
m_hDC = ::GetDC(m_hWnd);
@@ -214,11 +219,11 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system,
nCmdShow = SW_SHOWMAXIMIZED;
break;
case GHOST_kWindowStateMinimized:
- nCmdShow = SW_SHOWMINIMIZED;
+ nCmdShow = (m_system->m_windowFocus) ? SW_SHOWMINIMIZED : SW_SHOWMINNOACTIVE;
break;
case GHOST_kWindowStateNormal:
default:
- nCmdShow = SW_SHOWNORMAL;
+ nCmdShow = (m_system->m_windowFocus) ? SW_SHOWNORMAL : SW_SHOWNOACTIVATE;
break;
}
@@ -1083,12 +1088,12 @@ GHOST_TSuccess GHOST_WindowWin32::endProgressBar()
#ifdef WITH_INPUT_IME
void GHOST_WindowWin32::beginIME(GHOST_TInt32 x, GHOST_TInt32 y, GHOST_TInt32 w, GHOST_TInt32 h, int completed)
{
- m_imeImput.BeginIME(m_hWnd, GHOST_Rect(x, y - h, x, y), (bool)completed);
+ m_imeInput.BeginIME(m_hWnd, GHOST_Rect(x, y - h, x, y), (bool)completed);
}
void GHOST_WindowWin32::endIME()
{
- m_imeImput.EndIME(m_hWnd);
+ m_imeInput.EndIME(m_hWnd);
}
#endif /* WITH_INPUT_IME */
diff --git a/intern/ghost/intern/GHOST_WindowWin32.h b/intern/ghost/intern/GHOST_WindowWin32.h
index c72669ed898..9907385154a 100644
--- a/intern/ghost/intern/GHOST_WindowWin32.h
+++ b/intern/ghost/intern/GHOST_WindowWin32.h
@@ -265,7 +265,7 @@ public:
bool m_inLiveResize;
#ifdef WITH_INPUT_IME
- GHOST_ImeWin32 *getImeInput() {return &m_imeImput;}
+ GHOST_ImeWin32 *getImeInput() {return &m_imeInput;}
void beginIME(
GHOST_TInt32 x, GHOST_TInt32 y,
@@ -369,7 +369,7 @@ private:
#ifdef WITH_INPUT_IME
/** Handle input method editors event */
- GHOST_ImeWin32 m_imeImput;
+ GHOST_ImeWin32 m_imeInput;
#endif
bool m_debug_context;
};
diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp
index 11aa2094997..01b4991ec72 100644
--- a/intern/ghost/intern/GHOST_WindowX11.cpp
+++ b/intern/ghost/intern/GHOST_WindowX11.cpp
@@ -517,7 +517,7 @@ GHOST_WindowX11(GHOST_SystemX11 *system,
natom++;
}
- if (m_system->m_atom.WM_TAKE_FOCUS) {
+ if (m_system->m_atom.WM_TAKE_FOCUS && m_system->m_windowFocus) {
atoms[natom] = m_system->m_atom.WM_TAKE_FOCUS;
natom++;
}
@@ -532,7 +532,7 @@ GHOST_WindowX11(GHOST_SystemX11 *system,
{
XWMHints *xwmhints = XAllocWMHints();
xwmhints->initial_state = NormalState;
- xwmhints->input = True;
+ xwmhints->input = (m_system->m_windowFocus) ? True : False;
xwmhints->flags = InputHint | StateHint;
XSetWMHints(display, m_window, xwmhints);
XFree(xwmhints);
@@ -586,11 +586,15 @@ GHOST_WindowX11(GHOST_SystemX11 *system,
setTitle(title);
- if (exclusive) {
+ if (exclusive && system->m_windowFocus) {
XMapRaised(m_display, m_window);
}
else {
XMapWindow(m_display, m_window);
+
+ if (!system->m_windowFocus) {
+ XLowerWindow(m_display, m_window);
+ }
}
GHOST_PRINT("Mapped window\n");
diff --git a/intern/guardedalloc/CMakeLists.txt b/intern/guardedalloc/CMakeLists.txt
index 10ed4287185..3cec2fd1016 100644
--- a/intern/guardedalloc/CMakeLists.txt
+++ b/intern/guardedalloc/CMakeLists.txt
@@ -53,6 +53,11 @@ if(WIN32 AND NOT UNIX)
)
endif()
+# Jemalloc 5.0.0+ needs extra configuration.
+if(WITH_MEM_JEMALLOC AND NOT ("${JEMALLOC_VERSION}" VERSION_LESS "5.0.0"))
+ add_definitions(-DWITH_JEMALLOC_CONF)
+endif()
+
blender_add_lib(bf_intern_guardedalloc "${SRC}" "${INC}" "${INC_SYS}")
# Override C++ alloc, optional.
diff --git a/intern/guardedalloc/intern/mallocn.c b/intern/guardedalloc/intern/mallocn.c
index a95cc9163c4..8c17da853e5 100644
--- a/intern/guardedalloc/intern/mallocn.c
+++ b/intern/guardedalloc/intern/mallocn.c
@@ -37,6 +37,13 @@
#include "mallocn_intern.h"
+#ifdef WITH_JEMALLOC_CONF
+/* If jemalloc is used, it reads this global variable and enables background
+ * threads to purge dirty pages. Otherwise we release memory too slowly or not
+ * at all if the thread that did the allocation stays inactive. */
+const char *malloc_conf = "background_thread:true,dirty_decay_ms:4000";
+#endif
+
size_t (*MEM_allocN_len)(const void *vmemh) = MEM_lockfree_allocN_len;
void (*MEM_freeN)(void *vmemh) = MEM_lockfree_freeN;
void *(*MEM_dupallocN)(const void *vmemh) = MEM_lockfree_dupallocN;
diff --git a/intern/locale/boost_locale_wrapper.cpp b/intern/locale/boost_locale_wrapper.cpp
index 0707c0dd3e3..058b6e9f5d9 100644
--- a/intern/locale/boost_locale_wrapper.cpp
+++ b/intern/locale/boost_locale_wrapper.cpp
@@ -112,13 +112,17 @@ const char *bl_locale_pgettext(const char *msgctxt, const char *msgid)
return r;
return msgid;
}
- catch(std::bad_cast const &e) { /* if std::has_facet<char_message_facet>(l) == false, LC_ALL = "C" case */
-// std::cout << "bl_locale_pgettext(" << msgid << "): " << e.what() << " \n";
+ catch(const std::bad_cast &e) { /* if std::has_facet<char_message_facet>(l) == false, LC_ALL = "C" case */
+#ifndef NDEBUG
+ std::cout << "bl_locale_pgettext(" << msgctxt << ", " << msgid << "): " << e.what() << " \n";
+#endif
(void)e;
return msgid;
}
- catch(std::exception const &e) {
-// std::cout << "bl_locale_pgettext(" << msgctxt << ", " << msgid << "): " << e.what() << " \n";
+ catch(const std::exception &e) {
+#ifndef NDEBUG
+ std::cout << "bl_locale_pgettext(" << msgctxt << ", " << msgid << "): " << e.what() << " \n";
+#endif
(void)e;
return msgid;
}
diff --git a/intern/opensubdiv/CMakeLists.txt b/intern/opensubdiv/CMakeLists.txt
index f11d9b4613a..e145500e019 100644
--- a/intern/opensubdiv/CMakeLists.txt
+++ b/intern/opensubdiv/CMakeLists.txt
@@ -69,12 +69,14 @@ if(WITH_OPENSUBDIV)
internal/opensubdiv_topology_refiner_internal.cc
internal/opensubdiv_util.cc
+ internal/opensubdiv_converter_factory.h
internal/opensubdiv_converter_internal.h
internal/opensubdiv_converter_orient.h
internal/opensubdiv_converter_orient_impl.h
internal/opensubdiv_device_context_cuda.h
internal/opensubdiv_device_context_opencl.h
internal/opensubdiv_evaluator_internal.h
+ internal/opensubdiv_gl_mesh_draw.h
internal/opensubdiv_gl_mesh_fvar.h
internal/opensubdiv_gl_mesh_internal.h
internal/opensubdiv_internal.h
diff --git a/intern/opensubdiv/internal/opensubdiv_converter_factory.cc b/intern/opensubdiv/internal/opensubdiv_converter_factory.cc
index 901a421314a..4f3fb1462f3 100644
--- a/intern/opensubdiv/internal/opensubdiv_converter_factory.cc
+++ b/intern/opensubdiv/internal/opensubdiv_converter_factory.cc
@@ -441,6 +441,26 @@ inline void TopologyRefinerFactory<TopologyRefinerData>::reportInvalidTopology(
namespace opensubdiv_capi {
+namespace {
+
+OpenSubdiv::Sdc::Options::VtxBoundaryInterpolation
+getVtxBoundaryInterpolationFromCAPI(
+ OpenSubdiv_VtxBoundaryInterpolation boundary_interpolation) {
+ using OpenSubdiv::Sdc::Options;
+ switch (boundary_interpolation) {
+ case OSD_VTX_BOUNDARY_NONE:
+ return Options::VTX_BOUNDARY_NONE;
+ case OSD_VTX_BOUNDARY_EDGE_ONLY:
+ return Options::VTX_BOUNDARY_EDGE_ONLY;
+ case OSD_VTX_BOUNDARY_EDGE_AND_CORNER:
+ return Options::VTX_BOUNDARY_EDGE_AND_CORNER;
+ }
+ assert(!"Unknown veretx boundary interpolation.");
+ return Options::VTX_BOUNDARY_EDGE_ONLY;
+}
+
+} // namespace
+
OpenSubdiv::Far::TopologyRefiner* createOSDTopologyRefinerFromConverter(
OpenSubdiv_Converter* converter) {
using OpenSubdiv::Sdc::Options;
@@ -451,7 +471,9 @@ OpenSubdiv::Far::TopologyRefiner* createOSDTopologyRefinerFromConverter(
getFVarLinearInterpolationFromCAPI(
converter->getFVarLinearInterpolation(converter));
Options options;
- options.SetVtxBoundaryInterpolation(Options::VTX_BOUNDARY_EDGE_ONLY);
+ options.SetVtxBoundaryInterpolation(
+ getVtxBoundaryInterpolationFromCAPI(
+ converter->getVtxBoundaryInterpolation(converter)));
options.SetCreasingMethod(Options::CREASE_UNIFORM);
options.SetFVarLinearInterpolation(linear_interpolation);
diff --git a/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc b/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc
index 33df7a45e39..8ebae7dda06 100644
--- a/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc
+++ b/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc
@@ -702,11 +702,10 @@ OpenSubdiv_EvaluatorInternal* openSubdiv_createEvaluatorInternal(
return NULL;
}
// TODO(sergey): Base this on actual topology.
- // const bool bas_varying_data = false;
+ const bool has_varying_data = false;
const int num_face_varying_channels = refiner->GetNumFVarChannels();
const bool has_face_varying_data = (num_face_varying_channels != 0);
const int level = topology_refiner->getSubdivisionLevel(topology_refiner);
- // TODO(sergey): Query from topology refiner.
const bool is_adaptive = topology_refiner->getIsAdaptive(topology_refiner);
// Refine the topology with given settings.
// TODO(sergey): What if topology is already refined?
@@ -733,13 +732,15 @@ OpenSubdiv_EvaluatorInternal* openSubdiv_createEvaluatorInternal(
// TODO(sergey): Seems currently varying stencils are always required in
// OpenSubdiv itself.
const StencilTable* varying_stencils = NULL;
- StencilTableFactory::Options varying_stencil_options;
- varying_stencil_options.generateOffsets = true;
- varying_stencil_options.generateIntermediateLevels = is_adaptive;
- varying_stencil_options.interpolationMode =
- StencilTableFactory::INTERPOLATE_VARYING;
- varying_stencils =
- StencilTableFactory::Create(*refiner, varying_stencil_options);
+ if (has_varying_data) {
+ StencilTableFactory::Options varying_stencil_options;
+ varying_stencil_options.generateOffsets = true;
+ varying_stencil_options.generateIntermediateLevels = is_adaptive;
+ varying_stencil_options.interpolationMode =
+ StencilTableFactory::INTERPOLATE_VARYING;
+ varying_stencils =
+ StencilTableFactory::Create(*refiner, varying_stencil_options);
+ }
// Face warying stencil.
vector<const StencilTable*> all_face_varying_stencils;
#ifdef OPENSUBDIV_HAS_FVAR_EVALUATION
@@ -769,6 +770,7 @@ vector<const StencilTable*> all_face_varying_stencils;
const PatchTable* patch_table = PatchTableFactory::Create(
*refiner, patch_options);
// Append local points stencils.
+ // Point stencils.
const StencilTable* local_point_stencil_table =
patch_table->GetLocalPointStencilTable();
if (local_point_stencil_table != NULL) {
@@ -778,14 +780,17 @@ vector<const StencilTable*> all_face_varying_stencils;
delete vertex_stencils;
vertex_stencils = table;
}
- const StencilTable* local_point_varying_stencil_table =
- patch_table->GetLocalPointVaryingStencilTable();
- if (local_point_varying_stencil_table != NULL) {
- const StencilTable* table =
- StencilTableFactory::AppendLocalPointStencilTable(
- *refiner, varying_stencils, local_point_varying_stencil_table);
- delete varying_stencils;
- varying_stencils = table;
+ // Varying stencils.
+ if (has_varying_data) {
+ const StencilTable* local_point_varying_stencil_table =
+ patch_table->GetLocalPointVaryingStencilTable();
+ if (local_point_varying_stencil_table != NULL) {
+ const StencilTable* table =
+ StencilTableFactory::AppendLocalPointStencilTable(
+ *refiner, varying_stencils, local_point_varying_stencil_table);
+ delete varying_stencils;
+ varying_stencils = table;
+ }
}
#ifdef OPENSUBDIV_HAS_FVAR_EVALUATION
for (int face_varying_channel = 0;
diff --git a/intern/opensubdiv/internal/opensubdiv_topology_refiner.cc b/intern/opensubdiv/internal/opensubdiv_topology_refiner.cc
index e334a4b0871..6ac8a67e3e6 100644
--- a/intern/opensubdiv/internal/opensubdiv_topology_refiner.cc
+++ b/intern/opensubdiv/internal/opensubdiv_topology_refiner.cc
@@ -64,6 +64,14 @@ int getNumFaces(const OpenSubdiv_TopologyRefiner* topology_refiner) {
////////////////////////////////////////////////////////////////////////////////
// PTex face geometry queries.
+static void convertArrayToRaw(
+ const OpenSubdiv::Far::ConstIndexArray& array,
+ int* raw_array) {
+ for (int i = 0; i < array.size(); ++i) {
+ raw_array[i] = array[i];
+ }
+}
+
int getNumFaceVertices(const OpenSubdiv_TopologyRefiner* topology_refiner,
const int face_index) {
const OpenSubdiv::Far::TopologyLevel* base_level =
@@ -71,6 +79,44 @@ int getNumFaceVertices(const OpenSubdiv_TopologyRefiner* topology_refiner,
return base_level->GetFaceVertices(face_index).size();
}
+void getFaceVertices(const OpenSubdiv_TopologyRefiner* topology_refiner,
+ const int face_index,
+ int* face_vertices_indices) {
+ const OpenSubdiv::Far::TopologyLevel* base_level =
+ getOSDTopologyBaseLevel(topology_refiner);
+ OpenSubdiv::Far::ConstIndexArray array =
+ base_level->GetFaceVertices(face_index);
+ convertArrayToRaw(array, face_vertices_indices);
+}
+
+int getNumFaceEdges(const OpenSubdiv_TopologyRefiner* topology_refiner,
+ const int face_index) {
+ const OpenSubdiv::Far::TopologyLevel* base_level =
+ getOSDTopologyBaseLevel(topology_refiner);
+ return base_level->GetFaceEdges(face_index).size();
+}
+
+void getFaceEdges(const OpenSubdiv_TopologyRefiner* topology_refiner,
+ const int face_index,
+ int* face_edges_indices) {
+ const OpenSubdiv::Far::TopologyLevel* base_level =
+ getOSDTopologyBaseLevel(topology_refiner);
+ OpenSubdiv::Far::ConstIndexArray array = base_level->GetFaceEdges(face_index);
+ convertArrayToRaw(array, face_edges_indices);
+}
+
+void getEdgeVertices(const OpenSubdiv_TopologyRefiner* topology_refiner,
+ const int edge_index,
+ int edge_vertices_indices[2]) {
+ const OpenSubdiv::Far::TopologyLevel* base_level =
+ getOSDTopologyBaseLevel(topology_refiner);
+ OpenSubdiv::Far::ConstIndexArray array =
+ base_level->GetEdgeVertices(edge_index);
+ assert(array.size() == 2);
+ edge_vertices_indices[0] = array[0];
+ edge_vertices_indices[1] = array[1];
+}
+
int getNumFacePtexFaces(const OpenSubdiv_TopologyRefiner* topology_refiner,
const int face_index) {
const int num_face_vertices =
@@ -147,6 +193,10 @@ void assignFunctionPointers(OpenSubdiv_TopologyRefiner* topology_refiner) {
topology_refiner->getNumEdges = getNumEdges;
topology_refiner->getNumFaces = getNumFaces;
topology_refiner->getNumFaceVertices = getNumFaceVertices;
+ topology_refiner->getFaceVertices = getFaceVertices;
+ topology_refiner->getNumFaceEdges = getNumFaceEdges;
+ topology_refiner->getFaceEdges = getFaceEdges;
+ topology_refiner->getEdgeVertices = getEdgeVertices;
// PTex face geometry.
topology_refiner->getNumFacePtexFaces = getNumFacePtexFaces;
topology_refiner->getNumPtexFaces = getNumPtexFaces;
diff --git a/intern/opensubdiv/internal/opensubdiv_util.h b/intern/opensubdiv/internal/opensubdiv_util.h
index db55504215d..1f5ddc00f01 100644
--- a/intern/opensubdiv/internal/opensubdiv_util.h
+++ b/intern/opensubdiv/internal/opensubdiv_util.h
@@ -28,7 +28,7 @@ namespace opensubdiv_capi {
using std::string;
using std::vector;
-#define foreach(x, y) for(x : y)
+#define foreach(x, y) for (x : y)
#define STRINGIFY_ARG(x) "" #x
#define STRINGIFY_APPEND(a, b) "" a #b
diff --git a/intern/opensubdiv/opensubdiv_capi_type.h b/intern/opensubdiv/opensubdiv_capi_type.h
index b326e53e168..57f62fd9888 100644
--- a/intern/opensubdiv/opensubdiv_capi_type.h
+++ b/intern/opensubdiv/opensubdiv_capi_type.h
@@ -40,6 +40,15 @@ typedef enum OpenSubdiv_SchemeType {
OSD_SCHEME_LOOP,
} OpenSubdiv_SchemeType;
+typedef enum OpenSubdiv_VtxBoundaryInterpolation {
+ // Do not interpolate boundaries
+ OSD_VTX_BOUNDARY_NONE,
+ // Sharpen edges.
+ OSD_VTX_BOUNDARY_EDGE_ONLY,
+ // sharpen edges and corners,
+ OSD_VTX_BOUNDARY_EDGE_AND_CORNER,
+} OpenSubdiv_VtxBoundaryInterpolation;
+
typedef enum OpenSubdiv_FVarLinearInterpolation {
OSD_FVAR_LINEAR_INTERPOLATION_NONE,
OSD_FVAR_LINEAR_INTERPOLATION_CORNERS_ONLY,
diff --git a/intern/opensubdiv/opensubdiv_converter_capi.h b/intern/opensubdiv/opensubdiv_converter_capi.h
index 9f559ee208b..389e16e0f3f 100644
--- a/intern/opensubdiv/opensubdiv_converter_capi.h
+++ b/intern/opensubdiv/opensubdiv_converter_capi.h
@@ -31,6 +31,8 @@ typedef struct OpenSubdiv_Converter {
OpenSubdiv_SchemeType (*getSchemeType)(
const struct OpenSubdiv_Converter* converter);
+ OpenSubdiv_VtxBoundaryInterpolation (*getVtxBoundaryInterpolation)(
+ const struct OpenSubdiv_Converter* converter);
OpenSubdiv_FVarLinearInterpolation (*getFVarLinearInterpolation)(
const struct OpenSubdiv_Converter* converter);
diff --git a/intern/opensubdiv/opensubdiv_topology_refiner_capi.h b/intern/opensubdiv/opensubdiv_topology_refiner_capi.h
index fe4db0ca67c..771eb8d62a8 100644
--- a/intern/opensubdiv/opensubdiv_topology_refiner_capi.h
+++ b/intern/opensubdiv/opensubdiv_topology_refiner_capi.h
@@ -66,6 +66,21 @@ typedef struct OpenSubdiv_TopologyRefiner {
int (*getNumFaceVertices)(
const struct OpenSubdiv_TopologyRefiner* topology_refiner,
const int face_index);
+ void (*getFaceVertices)(
+ const struct OpenSubdiv_TopologyRefiner* topology_refiner,
+ const int face_index,
+ int* face_vertices_indices);
+ int (*getNumFaceEdges)(
+ const struct OpenSubdiv_TopologyRefiner* topology_refiner,
+ const int face_index);
+ void (*getFaceEdges)(
+ const struct OpenSubdiv_TopologyRefiner* topology_refiner,
+ const int face_index,
+ int* face_edges_indices);
+ void (*getEdgeVertices)(
+ const struct OpenSubdiv_TopologyRefiner* topology_refiner,
+ const int edge_index,
+ int edge_vertices_indices[2]);
//////////////////////////////////////////////////////////////////////////////
// PTex face geometry queries.
diff --git a/intern/opensubdiv/stub/opensubdiv_topology_refiner_stub.cc b/intern/opensubdiv/stub/opensubdiv_topology_refiner_stub.cc
index de98b0b5eee..01d58837b2b 100644
--- a/intern/opensubdiv/stub/opensubdiv_topology_refiner_stub.cc
+++ b/intern/opensubdiv/stub/opensubdiv_topology_refiner_stub.cc
@@ -23,7 +23,7 @@
OpenSubdiv_TopologyRefiner* openSubdiv_createTopologyRefinerFromConverter(
OpenSubdiv_Converter* /*converter*/,
const OpenSubdiv_TopologyRefinerSettings* /*settings*/) {
- return NULL;
+ return NULL;
}
void openSubdiv_deleteTopologyRefiner(
diff --git a/release/datafiles/blender_icons.svg b/release/datafiles/blender_icons.svg
index e0df177e36a..e94a26e3eda 100644
--- a/release/datafiles/blender_icons.svg
+++ b/release/datafiles/blender_icons.svg
@@ -1,94153 +1,5860 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="602"
- height="640"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
- version="1.0"
- sodipodi:docname="blender_icons.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape"
- style="display:inline;enable-background:new"
- inkscape:export-filename="blender_icons16.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <title
- id="title49470">Blender icons v. 2.5.08</title>
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient18906">
- <stop
- id="stop18904"
- offset="0"
- style="stop-color:#ffb36b;stop-opacity:1" />
- <stop
- style="stop-color:#ff982a;stop-opacity:1;"
- offset="0.6832175"
- id="stop18902" />
- <stop
- id="stop18900"
- offset="1"
- style="stop-color:#b45d00;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient31767"
- inkscape:collect="always">
- <stop
- id="stop31769"
- offset="0"
- style="stop-color:#4d4d4d;stop-opacity:0" />
- <stop
- id="stop31771"
- offset="1"
- style="stop-color:#4d4d4d;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient20043">
- <stop
- style="stop-color:#f6e18c;stop-opacity:1;"
- offset="0"
- id="stop20045" />
- <stop
- style="stop-color:#f6e18c;stop-opacity:0;"
- offset="1"
- id="stop20047" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient20020">
- <stop
- style="stop-color:#f6e18c;stop-opacity:1;"
- offset="0"
- id="stop20022" />
- <stop
- style="stop-color:#f6e18c;stop-opacity:0;"
- offset="1"
- id="stop20024" />
- </linearGradient>
- <linearGradient
- id="linearGradient18512">
- <stop
- id="stop18514"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:1;" />
- <stop
- id="stop18516"
- offset="1"
- style="stop-color:#f20000;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient18495"
- inkscape:collect="always">
- <stop
- id="stop18497"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop18499"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient18479"
- inkscape:collect="always">
- <stop
- id="stop18481"
- offset="0"
- style="stop-color:#8d8d8d;stop-opacity:1;" />
- <stop
- id="stop18483"
- offset="1"
- style="stop-color:#8d8d8d;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient18414">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop18416" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop18418" />
- </linearGradient>
- <linearGradient
- id="linearGradient18370"
- inkscape:collect="always">
- <stop
- id="stop18372"
- offset="0"
- style="stop-color:#afafaf;stop-opacity:1;" />
- <stop
- id="stop18374"
- offset="1"
- style="stop-color:#afafaf;stop-opacity:0;" />
- </linearGradient>
- <marker
- inkscape:stockid="Arrow1Lstart"
- orient="auto"
- refY="0.0"
- refX="0.0"
- id="Arrow1Lstart"
- style="overflow:visible">
- <path
- id="path17576"
- d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
- style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
- transform="scale(0.8) translate(12.5,0)" />
- </marker>
- <linearGradient
- id="linearGradient17566"
- inkscape:collect="always">
- <stop
- id="stop17568"
- offset="0"
- style="stop-color:#cad8ee;stop-opacity:1;" />
- <stop
- id="stop17570"
- offset="1"
- style="stop-color:#cad8ee;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient17560">
- <stop
- id="stop17562"
- offset="0"
- style="stop-color:#ffe991;stop-opacity:1;" />
- <stop
- id="stop17564"
- offset="1"
- style="stop-color:#ffe991;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient17542"
- inkscape:collect="always">
- <stop
- id="stop17544"
- offset="0"
- style="stop-color:#799ed3;stop-opacity:1;" />
- <stop
- id="stop17546"
- offset="1"
- style="stop-color:#799ed3;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient17265">
- <stop
- style="stop-color:#ffb769;stop-opacity:1;"
- offset="0"
- id="stop17267" />
- <stop
- style="stop-color:#ffeeaa;stop-opacity:0;"
- offset="1"
- id="stop17269" />
- </linearGradient>
- <linearGradient
- id="linearGradient17073">
- <stop
- style="stop-color:#2561b7;stop-opacity:1;"
- offset="0"
- id="stop17075" />
- <stop
- style="stop-color:#f9fbff;stop-opacity:1;"
- offset="1"
- id="stop17077" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient18214">
- <stop
- style="stop-color:#ff0000;stop-opacity:1;"
- offset="0"
- id="stop18216" />
- <stop
- style="stop-color:#ff0000;stop-opacity:0;"
- offset="1"
- id="stop18218" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient18205">
- <stop
- style="stop-color:#00ffff;stop-opacity:1;"
- offset="0"
- id="stop18207" />
- <stop
- style="stop-color:#00ffff;stop-opacity:0;"
- offset="1"
- id="stop18210" />
- </linearGradient>
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 320 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="602 : 320 : 1"
- inkscape:persp3d-origin="301 : 213.33333 : 1"
- id="perspective29908" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient18134">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop18136" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop18138" />
- </linearGradient>
- <linearGradient
- id="linearGradient18118">
- <stop
- style="stop-color:#d297eb;stop-opacity:1;"
- offset="0"
- id="stop18120" />
- <stop
- style="stop-color:#a329d6;stop-opacity:1;"
- offset="1"
- id="stop18122" />
- </linearGradient>
- <linearGradient
- id="linearGradient18103">
- <stop
- id="stop18105"
- offset="0"
- style="stop-color:#42035d;stop-opacity:1" />
- <stop
- id="stop18108"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient16367">
- <stop
- id="stop16369"
- offset="0"
- style="stop-color:#3c3c3c;stop-opacity:1" />
- <stop
- id="stop16371"
- offset="1"
- style="stop-color:#5a5a5a;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient15806">
- <stop
- style="stop-color:#ffffff;stop-opacity:1"
- offset="0"
- id="stop15808" />
- <stop
- style="stop-color:#000000;stop-opacity:1"
- offset="1"
- id="stop15810" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient15796">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15798" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15800" />
- </linearGradient>
- <linearGradient
- id="linearGradient16595">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop16597" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop16599" />
- </linearGradient>
- <linearGradient
- id="linearGradient15647">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop15649" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop15651" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient30139">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop30141" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop30143" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient30131">
- <stop
- style="stop-color:#999999;stop-opacity:1;"
- offset="0"
- id="stop30133" />
- <stop
- style="stop-color:#999999;stop-opacity:0;"
- offset="1"
- id="stop30135" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient30122">
- <stop
- style="stop-color:#1e1e1e;stop-opacity:1;"
- offset="0"
- id="stop30124" />
- <stop
- style="stop-color:#1e1e1e;stop-opacity:0;"
- offset="1"
- id="stop30127" />
- </linearGradient>
- <linearGradient
- id="linearGradient30390">
- <stop
- style="stop-color:#3d3d3d;stop-opacity:1"
- offset="0"
- id="stop30392" />
- <stop
- style="stop-color:#5d5d5d;stop-opacity:1"
- offset="1"
- id="stop30394" />
- </linearGradient>
- <linearGradient
- id="linearGradient29870">
- <stop
- id="stop29872"
- offset="0"
- style="stop-color:#989898;stop-opacity:1" />
- <stop
- id="stop29874"
- offset="1"
- style="stop-color:#3d3d3d;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient29757">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop29759" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop29761" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16772">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16774" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16776" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16764">
- <stop
- style="stop-color:#1e1e1e;stop-opacity:1;"
- offset="0"
- id="stop16766" />
- <stop
- style="stop-color:#1e1e1e;stop-opacity:0;"
- offset="1"
- id="stop16768" />
- </linearGradient>
- <linearGradient
- id="linearGradient16723">
- <stop
- style="stop-color:#343434;stop-opacity:0.61960787;"
- offset="0"
- id="stop16725" />
- <stop
- style="stop-color:#3d3d3d;stop-opacity:1;"
- offset="1"
- id="stop16727" />
- </linearGradient>
- <linearGradient
- id="linearGradient107519">
- <stop
- style="stop-color:#f8c5bd;stop-opacity:1"
- offset="0"
- id="stop107521" />
- <stop
- style="stop-color:#a42f0e;stop-opacity:1"
- offset="1"
- id="stop107523" />
- </linearGradient>
- <linearGradient
- id="linearGradient107148">
- <stop
- id="stop107150"
- offset="0"
- style="stop-color:#ee7b68;stop-opacity:1" />
- <stop
- id="stop107152"
- offset="1"
- style="stop-color:#a42f0e;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient107142">
- <stop
- id="stop107144"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:1" />
- <stop
- id="stop107146"
- offset="1"
- style="stop-color:#f18d73;stop-opacity:0.2079646" />
- </linearGradient>
- <linearGradient
- id="linearGradient106427">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop106429" />
- <stop
- style="stop-color:#030303;stop-opacity:1"
- offset="1"
- id="stop106431" />
- </linearGradient>
- <linearGradient
- id="linearGradient16504">
- <stop
- id="stop16506"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:1" />
- <stop
- id="stop16508"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient17602">
- <stop
- id="stop17604"
- offset="0"
- style="stop-color:#592e00;stop-opacity:1" />
- <stop
- id="stop17606"
- offset="1"
- style="stop-color:#9e5200;stop-opacity:0.57431373" />
- </linearGradient>
- <linearGradient
- id="linearGradient17596">
- <stop
- style="stop-color:#ee7b00;stop-opacity:1"
- offset="0"
- id="stop17598" />
- <stop
- style="stop-color:#ffc280;stop-opacity:1"
- offset="1"
- id="stop17600" />
- </linearGradient>
- <linearGradient
- id="linearGradient17438">
- <stop
- style="stop-color:#ff9f37;stop-opacity:1"
- offset="0"
- id="stop17440" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop17442" />
- </linearGradient>
- <linearGradient
- id="linearGradient17430">
- <stop
- style="stop-color:#ff9f37;stop-opacity:1"
- offset="0"
- id="stop17432" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop17434" />
- </linearGradient>
- <linearGradient
- id="linearGradient30958">
- <stop
- id="stop30960"
- offset="0"
- style="stop-color:#fff9cf;stop-opacity:1;" />
- <stop
- id="stop30962"
- offset="1"
- style="stop-color:#c7bc52;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient29312">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop29314" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop29316" />
- </linearGradient>
- <linearGradient
- id="linearGradient29304">
- <stop
- style="stop-color:#11233f;stop-opacity:1;"
- offset="0"
- id="stop29306" />
- <stop
- style="stop-color:#162d50;stop-opacity:0;"
- offset="1"
- id="stop29308" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient27896">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop27898" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop27900" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient27854">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop27856" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop27858" />
- </linearGradient>
- <linearGradient
- id="linearGradient24343">
- <stop
- id="stop24345"
- offset="0"
- style="stop-color:#184990;stop-opacity:1;" />
- <stop
- id="stop24347"
- offset="1"
- style="stop-color:#c1d5f3;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient25417">
- <stop
- id="stop25419"
- offset="0"
- style="stop-color:#60553b;stop-opacity:1;" />
- <stop
- id="stop25421"
- offset="1"
- style="stop-color:#b0a17f;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient25108">
- <stop
- id="stop25110"
- offset="0"
- style="stop-color:white;stop-opacity:1;" />
- <stop
- id="stop25112"
- offset="1"
- style="stop-color:#c6c6c6;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient43807">
- <stop
- style="stop-color:#e31b1b;stop-opacity:1;"
- offset="0"
- id="stop43809" />
- <stop
- style="stop-color:#930000;stop-opacity:1;"
- offset="1"
- id="stop43811" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient38845">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop38847" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop38849" />
- </linearGradient>
- <linearGradient
- id="linearGradient38831">
- <stop
- style="stop-color:#182b42;stop-opacity:1;"
- offset="0"
- id="stop38833" />
- <stop
- id="stop38836"
- offset="0.38971797"
- style="stop-color:#598ac7;stop-opacity:1;" />
- <stop
- style="stop-color:#f1f1f1;stop-opacity:1;"
- offset="1"
- id="stop38838" />
- </linearGradient>
- <linearGradient
- id="linearGradient38256">
- <stop
- id="stop38258"
- offset="0"
- style="stop-color:#e7e0c7;stop-opacity:1;" />
- <stop
- id="stop38260"
- offset="1"
- style="stop-color:#f1eddf;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient71814">
- <stop
- style="stop-color:#6e0d00;stop-opacity:1;"
- offset="0"
- id="stop71816" />
- <stop
- style="stop-color:#6f2913;stop-opacity:0;"
- offset="1"
- id="stop71818" />
- </linearGradient>
- <linearGradient
- id="linearGradient37667">
- <stop
- id="stop37669"
- offset="0"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- id="stop37671"
- offset="1"
- style="stop-color:black;stop-opacity:0" />
- </linearGradient>
- <linearGradient
- id="linearGradient39080">
- <stop
- style="stop-color:#1a2a3d;stop-opacity:1;"
- offset="0"
- id="stop39082" />
- <stop
- id="stop39084"
- offset="0.5"
- style="stop-color:#95b0d1;stop-opacity:1;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop39086" />
- </linearGradient>
- <linearGradient
- id="linearGradient40809">
- <stop
- style="stop-color:#0059d7;stop-opacity:1;"
- offset="0"
- id="stop40811" />
- <stop
- style="stop-color:#b7d4ff;stop-opacity:1;"
- offset="1"
- id="stop40813" />
- </linearGradient>
- <linearGradient
- id="linearGradient40703">
- <stop
- style="stop-color:#143564;stop-opacity:1;"
- offset="0"
- id="stop40705" />
- <stop
- style="stop-color:#c1d7f8;stop-opacity:1;"
- offset="1"
- id="stop40707" />
- </linearGradient>
- <linearGradient
- id="linearGradient37925">
- <stop
- id="stop37927"
- offset="0"
- style="stop-color:#e7cbab;stop-opacity:1;" />
- <stop
- id="stop37929"
- offset="1"
- style="stop-color:#af7333;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient36273">
- <stop
- id="stop36275"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:1;" />
- <stop
- id="stop36277"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient35411">
- <stop
- id="stop35414"
- offset="0"
- style="stop-color:#2b5385;stop-opacity:1;" />
- <stop
- id="stop35416"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient31356">
- <stop
- id="stop31358"
- offset="0"
- style="stop-color:#1a1a1a;stop-opacity:1" />
- <stop
- id="stop31360"
- offset="1"
- style="stop-color:#1a1a1a;stop-opacity:0;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient28107"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.7228842,8.5733105e-8,-9.4831885e-8,0.7995973,71.917045,14.582004)"
- cx="256.49512"
- cy="81.396774"
- fx="256.49512"
- fy="81.396774"
- r="3.779551" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient28105"
- gradientUnits="userSpaceOnUse"
- x1="875.73486"
- y1="422.77902"
- x2="885.04938"
- y2="427.01648" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient28887"
- id="linearGradient28103"
- gradientUnits="userSpaceOnUse"
- x1="873.09998"
- y1="422.09964"
- x2="881.01172"
- y2="429.23453" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29149"
- id="radialGradient28101"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.6572588,1.2500456,-1.6473175,2.2058465,774.83033,-697.31982)"
- cx="76.180473"
- cy="500.20651"
- fx="76.180473"
- fy="500.20651"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29149"
- id="radialGradient28099"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.217888"
- cy="500.66806"
- fx="75.217888"
- fy="500.66806"
- r="3.1650217" />
- <linearGradient
- id="linearGradient28887">
- <stop
- style="stop-color:#2158a7;stop-opacity:1;"
- offset="0"
- id="stop28889" />
- <stop
- style="stop-color:#2f73d5;stop-opacity:0.19607843;"
- offset="1"
- id="stop28891" />
- </linearGradient>
- <linearGradient
- id="linearGradient24168">
- <stop
- id="stop24170"
- offset="0"
- style="stop-color:#182437;stop-opacity:1;" />
- <stop
- id="stop24172"
- offset="1"
- style="stop-color:#2b4163;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient24144">
- <stop
- id="stop24146"
- offset="0"
- style="stop-color:#3d361a;stop-opacity:1;" />
- <stop
- style="stop-color:#d1c595;stop-opacity:1;"
- offset="0.17958513"
- id="stop24148" />
- <stop
- id="stop24150"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient24101">
- <stop
- style="stop-color:#643400;stop-opacity:1;"
- offset="0"
- id="stop24103" />
- <stop
- id="stop24105"
- offset="0.22606115"
- style="stop-color:#ed983d;stop-opacity:1;" />
- <stop
- style="stop-color:#fff0d5;stop-opacity:1;"
- offset="1"
- id="stop24107" />
- </linearGradient>
- <linearGradient
- id="linearGradient24081">
- <stop
- id="stop24083"
- offset="0"
- style="stop-color:#b45d00;stop-opacity:1;" />
- <stop
- style="stop-color:#ff982a;stop-opacity:1;"
- offset="0.3167825"
- id="stop24085" />
- <stop
- id="stop24087"
- offset="1"
- style="stop-color:#ffedd5;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient23302">
- <stop
- id="stop23304"
- offset="0"
- style="stop-color:#b45d00;stop-opacity:1;" />
- <stop
- style="stop-color:#ff982a;stop-opacity:1;"
- offset="0.39332664"
- id="stop23306" />
- <stop
- id="stop23308"
- offset="1"
- style="stop-color:#ffedd5;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient24727">
- <stop
- style="stop-color:#3d361a;stop-opacity:1;"
- offset="0"
- id="stop24729" />
- <stop
- id="stop24731"
- offset="0.77520341"
- style="stop-color:#d1c595;stop-opacity:1;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop24733" />
- </linearGradient>
- <linearGradient
- id="linearGradient24711">
- <stop
- style="stop-color:#3d361a;stop-opacity:1;"
- offset="0"
- id="stop24713" />
- <stop
- id="stop24715"
- offset="0.21609697"
- style="stop-color:#d1c595;stop-opacity:1;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop24717" />
- </linearGradient>
- <linearGradient
- id="linearGradient24695">
- <stop
- style="stop-color:#3d361a;stop-opacity:1;"
- offset="0"
- id="stop24697" />
- <stop
- id="stop24699"
- offset="0.60401857"
- style="stop-color:#d1c595;stop-opacity:1;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop24701" />
- </linearGradient>
- <linearGradient
- id="linearGradient24687">
- <stop
- style="stop-color:#3d361a;stop-opacity:1;"
- offset="0"
- id="stop24689" />
- <stop
- id="stop24691"
- offset="0.59630167"
- style="stop-color:#d1c595;stop-opacity:1;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop24693" />
- </linearGradient>
- <linearGradient
- id="linearGradient24679">
- <stop
- style="stop-color:#3d361a;stop-opacity:1;"
- offset="0"
- id="stop24681" />
- <stop
- id="stop24683"
- offset="0.45537567"
- style="stop-color:#d1c595;stop-opacity:1;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop24685" />
- </linearGradient>
- <linearGradient
- id="linearGradient24671">
- <stop
- style="stop-color:#3d361a;stop-opacity:1;"
- offset="0"
- id="stop24673" />
- <stop
- id="stop24675"
- offset="0.29527253"
- style="stop-color:#d1c595;stop-opacity:1;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop24677" />
- </linearGradient>
- <linearGradient
- id="linearGradient23705">
- <stop
- id="stop23707"
- offset="0"
- style="stop-color:#d4d2bf;stop-opacity:1;" />
- <stop
- id="stop23709"
- offset="1"
- style="stop-color:#857f5d;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient23906">
- <stop
- id="stop23908"
- offset="0"
- style="stop-color:#ff921d;stop-opacity:1;" />
- <stop
- id="stop23910"
- offset="1"
- style="stop-color:#ffa751;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient42459">
- <stop
- style="stop-color:#e7dfab;stop-opacity:1;"
- offset="0"
- id="stop42461" />
- <stop
- style="stop-color:#af9d33;stop-opacity:1;"
- offset="1"
- id="stop42463" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient41723"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(744,397)"
- x1="-287"
- y1="-276.1875"
- x2="-281.4375"
- y2="-271.9375" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient41721"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.695652,0,0,0.869703,342.06514,-90.66358)"
- x1="171.42436"
- y1="259.71194"
- x2="170.20523"
- y2="244.96393" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24246"
- gradientUnits="userSpaceOnUse"
- x1="426.12415"
- y1="179.12074"
- x2="425"
- y2="179.12285" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24143"
- id="linearGradient24244"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(186,-105)"
- x1="246.12868"
- y1="283.63254"
- x2="237.75459"
- y2="266.34406" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24278"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(744,397)"
- x1="-287.56247"
- y1="-276.71042"
- x2="-282.59851"
- y2="-271.35284" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient24276"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.695652,0,0,0.869703,342.06514,-90.66358)"
- x1="190.33647"
- y1="266.7905"
- x2="170.9689"
- y2="247.58694" />
- <linearGradient
- id="linearGradient24143">
- <stop
- id="stop24145"
- offset="0"
- style="stop-color:#3d361a;stop-opacity:1;" />
- <stop
- style="stop-color:#d1c595;stop-opacity:1;"
- offset="0.5"
- id="stop24669" />
- <stop
- id="stop24147"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24687"
- id="linearGradient24238"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.043478,0,0,0.956667,304.84783,-86.57833)"
- x1="120.2969"
- y1="281.26645"
- x2="116.37123"
- y2="260.21841" />
- <linearGradient
- id="linearGradient24642">
- <stop
- style="stop-color:#d0dbe8;stop-opacity:1;"
- offset="0"
- id="stop24644" />
- <stop
- style="stop-color:#6ca3e9;stop-opacity:0;"
- offset="1"
- id="stop24646" />
- </linearGradient>
- <linearGradient
- id="linearGradient24632">
- <stop
- style="stop-color:#28394f;stop-opacity:1;"
- offset="0"
- id="stop24634" />
- <stop
- id="stop24636"
- offset="0.17637014"
- style="stop-color:#0d386a;stop-opacity:0.78431374;" />
- <stop
- id="stop24638"
- offset="0.35274029"
- style="stop-color:#18437d;stop-opacity:0.47058824;" />
- <stop
- style="stop-color:#154e94;stop-opacity:0;"
- offset="1"
- id="stop24640" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient22562"
- id="radialGradient23167"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9934369,-0.1143813,0.1033636,0.8977446,-30.451879,30.134649)"
- cx="-0.10810681"
- cy="294.60239"
- fx="-0.10810681"
- fy="294.60239"
- r="6.6750002" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient23201"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-61,0)"
- x1="22.75"
- y1="245"
- x2="24.25"
- y2="245" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient23199"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1,0)"
- x1="22.75"
- y1="245"
- x2="24.5"
- y2="245" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask23189">
- <g
- transform="translate(-28,49)"
- id="g23193">
- <rect
- y="237"
- x="22"
- height="16"
- width="9"
- id="rect23195"
- style="fill:url(#linearGradient23199);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- transform="scale(-1,1)"
- style="fill:url(#linearGradient23201);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect23197"
- width="9"
- height="16"
- x="-38"
- y="237" />
- </g>
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24208"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-46.000005,-117)"
- x1="257.75"
- y1="388"
- x2="272"
- y2="388" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24206"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-54.000005,-120)"
- x1="258.52756"
- y1="388"
- x2="279"
- y2="388" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24204"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-48.983883,-126)"
- x1="259.75"
- y1="388"
- x2="273"
- y2="388" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24202"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-52.983883,-129)"
- x1="258"
- y1="388"
- x2="273"
- y2="388" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient23379"
- gradientUnits="userSpaceOnUse"
- x1="126.37032"
- y1="110.87843"
- x2="139.86742"
- y2="126.57021" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15437"
- id="linearGradient23377"
- gradientUnits="userSpaceOnUse"
- x1="137.88235"
- y1="124.67203"
- x2="131.3092"
- y2="117.24104" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13938"
- id="linearGradient23375"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9995363,0,0,-1.0036971,220.01067,167.35026)"
- x1="52.06274"
- y1="96.767769"
- x2="44.999863"
- y2="103.57072" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14232"
- id="linearGradient23373"
- gradientUnits="userSpaceOnUse"
- x1="122.38876"
- y1="108.82882"
- x2="133.88583"
- y2="121.20407" />
- <linearGradient
- id="linearGradient23974">
- <stop
- id="stop23976"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop23978"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient40983">
- <stop
- style="stop-color:#6a9ae0;stop-opacity:1;"
- offset="0"
- id="stop40985" />
- <stop
- style="stop-color:#5189db;stop-opacity:0;"
- offset="1"
- id="stop40987" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient23280"
- gradientUnits="userSpaceOnUse"
- x1="127.60629"
- y1="112.12571"
- x2="140.72693"
- y2="126.72997" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient23278"
- gradientUnits="userSpaceOnUse"
- x1="125.01582"
- y1="110.86718"
- x2="132.46898"
- y2="119.54019" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient23276"
- gradientUnits="userSpaceOnUse"
- x1="139.37782"
- y1="126.3454"
- x2="131.71249"
- y2="118.34238" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14418"
- id="linearGradient23274"
- gradientUnits="userSpaceOnUse"
- x1="144.8255"
- y1="132.15414"
- x2="130.10634"
- y2="117.10313" />
- <filter
- inkscape:collect="always"
- x="-0.55821538"
- width="2.1164308"
- y="-1.0219563"
- height="3.0439126"
- id="filter20578"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="2.0410255"
- id="feGaussianBlur20580" />
- </filter>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath20586">
- <path
- sodipodi:type="arc"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path34889"
- sodipodi:cx="53"
- sodipodi:cy="554"
- sodipodi:rx="4.5"
- sodipodi:ry="2.25"
- d="m 57.5,554 a 4.5,2.25 0 1 1 -9,0 4.5,2.25 0 1 1 9,0 z"
- transform="matrix(1.870472,0.1894819,-0.6587894,2.4281336,319.59052,-798.11661)" />
- </clipPath>
- <radialGradient
- id="aigrd2"
- cx="20.892099"
- cy="114.5684"
- r="5.256"
- fx="20.892099"
- fy="114.5684"
- gradientUnits="userSpaceOnUse">
- <stop
- offset="0"
- style="stop-color:#F0F0F0"
- id="stop15566" />
- <stop
- offset="1.0000000"
- style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
- id="stop15568" />
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="602" height="640" id="svg2" sodipodi:version="0.32" inkscape:version="0.92.3 (2405546, 2018-03-11)" version="1.0" sodipodi:docname="blender_icons 2.8.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" style="display:inline;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Dysk Google\PROJEKTY BIEŻĄCE - Andrzej\ICONS - 2018.10.28.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+
+ <defs id="defs4">
+
+ <linearGradient inkscape:collect="always" id="linearGradient11146">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop11142"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop11144"/>
+ </linearGradient>
+ <linearGradient id="linearGradient18495" inkscape:collect="always">
+ <stop id="stop18497" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop18499" offset="1" style="stop-color:#000000;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient17265">
+ <stop style="stop-color:#ffb769;stop-opacity:1;" offset="0" id="stop17267"/>
+ <stop style="stop-color:#ffeeaa;stop-opacity:0;" offset="1" id="stop17269"/>
+ </linearGradient>
+ <linearGradient id="linearGradient17073">
+ <stop style="stop-color:#2561b7;stop-opacity:1;" offset="0" id="stop17075"/>
+ <stop style="stop-color:#f9fbff;stop-opacity:1;" offset="1" id="stop17077"/>
+ </linearGradient>
+ <linearGradient inkscape:collect="always" id="linearGradient18134">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop18136"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop18138"/>
+ </linearGradient>
+ <linearGradient id="linearGradient16595">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop16597"/>
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="1" id="stop16599"/>
+ </linearGradient>
+ <linearGradient id="linearGradient16723">
+ <stop style="stop-color:#343434;stop-opacity:0.61960787;" offset="0" id="stop16725"/>
+ <stop style="stop-color:#3d3d3d;stop-opacity:1;" offset="1" id="stop16727"/>
+ </linearGradient>
+ <linearGradient id="linearGradient106427">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop106429"/>
+ <stop style="stop-color:#030303;stop-opacity:1" offset="1" id="stop106431"/>
+ </linearGradient>
+ <linearGradient id="linearGradient29304">
+ <stop style="stop-color:#11233f;stop-opacity:1;" offset="0" id="stop29306"/>
+ <stop style="stop-color:#162d50;stop-opacity:0;" offset="1" id="stop29308"/>
+ </linearGradient>
+ <linearGradient id="linearGradient24343">
+ <stop id="stop24345" offset="0" style="stop-color:#184990;stop-opacity:1;"/>
+ <stop id="stop24347" offset="1" style="stop-color:#c1d5f3;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient25417">
+ <stop id="stop25419" offset="0" style="stop-color:#60553b;stop-opacity:1;"/>
+ <stop id="stop25421" offset="1" style="stop-color:#b0a17f;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient25108">
+ <stop id="stop25110" offset="0" style="stop-color:white;stop-opacity:1;"/>
+ <stop id="stop25112" offset="1" style="stop-color:#c6c6c6;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient43807">
+ <stop style="stop-color:#e31b1b;stop-opacity:1;" offset="0" id="stop43809"/>
+ <stop style="stop-color:#930000;stop-opacity:1;" offset="1" id="stop43811"/>
+ </linearGradient>
+ <linearGradient id="linearGradient38256">
+ <stop id="stop38258" offset="0" style="stop-color:#e7e0c7;stop-opacity:1;"/>
+ <stop id="stop38260" offset="1" style="stop-color:#f1eddf;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient40703">
+ <stop style="stop-color:#143564;stop-opacity:1;" offset="0" id="stop40705"/>
+ <stop style="stop-color:#c1d7f8;stop-opacity:1;" offset="1" id="stop40707"/>
+ </linearGradient>
+ <linearGradient id="linearGradient35411">
+ <stop id="stop35414" offset="0" style="stop-color:#2b5385;stop-opacity:1;"/>
+ <stop id="stop35416" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient28887">
+ <stop style="stop-color:#2158a7;stop-opacity:1;" offset="0" id="stop28889"/>
+ <stop style="stop-color:#2f73d5;stop-opacity:0.19607843;" offset="1" id="stop28891"/>
+ </linearGradient>
+ <linearGradient id="linearGradient24144">
+ <stop id="stop24146" offset="0" style="stop-color:#3d361a;stop-opacity:1;"/>
+ <stop style="stop-color:#d1c595;stop-opacity:1;" offset="0.17958513" id="stop24148"/>
+ <stop id="stop24150" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient24727">
+ <stop style="stop-color:#3d361a;stop-opacity:1;" offset="0" id="stop24729"/>
+ <stop id="stop24731" offset="0.77520341" style="stop-color:#d1c595;stop-opacity:1;"/>
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="1" id="stop24733"/>
+ </linearGradient>
+ <linearGradient id="linearGradient24711">
+ <stop style="stop-color:#3d361a;stop-opacity:1;" offset="0" id="stop24713"/>
+ <stop id="stop24715" offset="0.21609697" style="stop-color:#d1c595;stop-opacity:1;"/>
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="1" id="stop24717"/>
+ </linearGradient>
+ <linearGradient id="linearGradient24687">
+ <stop style="stop-color:#3d361a;stop-opacity:1;" offset="0" id="stop24689"/>
+ <stop id="stop24691" offset="0.59630167" style="stop-color:#d1c595;stop-opacity:1;"/>
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="1" id="stop24693"/>
+ </linearGradient>
+ <linearGradient id="linearGradient42459">
+ <stop style="stop-color:#e7dfab;stop-opacity:1;" offset="0" id="stop42461"/>
+ <stop style="stop-color:#af9d33;stop-opacity:1;" offset="1" id="stop42463"/>
+ </linearGradient>
+ <linearGradient id="linearGradient24143">
+ <stop id="stop24145" offset="0" style="stop-color:#3d361a;stop-opacity:1;"/>
+ <stop style="stop-color:#d1c595;stop-opacity:1;" offset="0.5" id="stop24669"/>
+ <stop id="stop24147" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient24642">
+ <stop style="stop-color:#d0dbe8;stop-opacity:1;" offset="0" id="stop24644"/>
+ <stop style="stop-color:#6ca3e9;stop-opacity:0;" offset="1" id="stop24646"/>
+ </linearGradient>
+ <linearGradient id="linearGradient24632">
+ <stop style="stop-color:#28394f;stop-opacity:1;" offset="0" id="stop24634"/>
+ <stop id="stop24636" offset="0.17637014" style="stop-color:#0d386a;stop-opacity:0.78431374;"/>
+ <stop id="stop24638" offset="0.35274029" style="stop-color:#18437d;stop-opacity:0.47058824;"/>
+ <stop style="stop-color:#154e94;stop-opacity:0;" offset="1" id="stop24640"/>
+ </linearGradient>
+ <linearGradient id="linearGradient23974">
+ <stop id="stop23976" offset="0" style="stop-color:#2561b7;stop-opacity:1;"/>
+ <stop id="stop23978" offset="1" style="stop-color:#f9fbff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient40983">
+ <stop style="stop-color:#6a9ae0;stop-opacity:1;" offset="0" id="stop40985"/>
+ <stop style="stop-color:#5189db;stop-opacity:0;" offset="1" id="stop40987"/>
+ </linearGradient>
+ <linearGradient id="linearGradient8864">
+ <stop id="stop8866" offset="0" style="stop-color:#b43214;stop-opacity:1;"/>
+ <stop id="stop8868" offset="1" style="stop-color:#e86830;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient22562">
+ <stop style="stop-color:#001e50;stop-opacity:1;" offset="0" id="stop22564"/>
+ <stop style="stop-color:#1e3e70;stop-opacity:0;" offset="1" id="stop22566"/>
+ </linearGradient>
+ <linearGradient id="linearGradient22882">
+ <stop style="stop-color:#323232;stop-opacity:0;" offset="0" id="stop22884"/>
+ <stop id="stop22886" offset="0.21233012" style="stop-color:#323232;stop-opacity:0.49803922;"/>
+ <stop id="stop22888" offset="0.54086536" style="stop-color:#323232;stop-opacity:1;"/>
+ <stop style="stop-color:#323232;stop-opacity:0.49803922;" offset="0.83381736" id="stop22890"/>
+ <stop style="stop-color:#323232;stop-opacity:0;" offset="1" id="stop22892"/>
+ </linearGradient>
+ <linearGradient id="linearGradient21609">
+ <stop id="stop21611" offset="0" style="stop-color:black;stop-opacity:1"/>
+ <stop id="stop21613" offset="1" style="stop-color:white;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient21609" id="linearGradient20961" gradientUnits="userSpaceOnUse" x1="162" y1="103.71875" x2="165" y2="103.75"/>
+
+ <linearGradient id="linearGradient18105">
+ <stop id="stop18107" offset="0" style="stop-color:#162d50;stop-opacity:1"/>
+ <stop id="stop18109" offset="1" style="stop-color:#1e3e70;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient21327">
+ <stop style="stop-color:#1e3e70;stop-opacity:1;" offset="0" id="stop21329"/>
+ <stop style="stop-color:#1e3e70;stop-opacity:0;" offset="1" id="stop21331"/>
+ </linearGradient>
+ <linearGradient id="linearGradient18821">
+ <stop style="stop-color:#fc6b58;stop-opacity:1;" offset="0" id="stop18823"/>
+ <stop style="stop-color:#fc6b58;stop-opacity:0;" offset="1" id="stop18825"/>
+ </linearGradient>
+ <linearGradient id="linearGradient29149">
+ <stop id="stop29151" offset="0" style="stop-color:#76adff;stop-opacity:1;"/>
+ <stop id="stop29153" offset="1" style="stop-color:#a5c9ff;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient15437">
+ <stop id="stop15439" offset="0" style="stop-color:#20529e;stop-opacity:1;"/>
+ <stop id="stop15441" offset="1" style="stop-color:#1d3f71;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient15425">
+ <stop style="stop-color:#8c0000;stop-opacity:1;" offset="0" id="stop15427"/>
+ <stop style="stop-color:#c80000;stop-opacity:0;" offset="1" id="stop15429"/>
+ </linearGradient>
+ <linearGradient id="linearGradient14262">
+ <stop id="stop14264" offset="0" style="stop-color:#2661b6;stop-opacity:1;"/>
+ <stop id="stop14266" offset="1" style="stop-color:#c1d7f8;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient5060">
+ <stop id="stop5062" offset="0" style="stop-color:black;stop-opacity:1;"/>
+ <stop id="stop5064" offset="1" style="stop-color:#000000;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient27957">
+ <stop id="stop27959" offset="0" style="stop-color:#ffffff;stop-opacity:0;"/>
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0.59290552" id="stop27963"/>
+ <stop id="stop27961" offset="1" style="stop-color:#ffffff;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient20756">
+ <stop style="stop-color:#932200;stop-opacity:1;" offset="0" id="stop20758"/>
+ <stop style="stop-color:#f8420a;stop-opacity:1;" offset="1" id="stop20760"/>
+ </linearGradient>
+ <linearGradient id="linearGradient47130">
+ <stop style="stop-color:#ed7b00;stop-opacity:1;" offset="0" id="stop47132"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop47134"/>
+ </linearGradient>
+ <linearGradient id="linearGradient32842">
+ <stop style="stop-color:#183e75;stop-opacity:1;" offset="0" id="stop32844"/>
+ <stop style="stop-color:#1d3f71;stop-opacity:0;" offset="1" id="stop32846"/>
+ </linearGradient>
+ <linearGradient id="linearGradient20973">
+ <stop id="stop20975" offset="0" style="stop-color:#15ff00;stop-opacity:1;"/>
+ <stop id="stop20977" offset="1" style="stop-color:#15ff00;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient20962">
+ <stop style="stop-color:#00a8ff;stop-opacity:1;" offset="0" id="stop20965"/>
+ <stop style="stop-color:#00a8ff;stop-opacity:0;" offset="1" id="stop20967"/>
+ </linearGradient>
+ <linearGradient id="linearGradient20036">
+ <stop style="stop-color:#ffb55e;stop-opacity:1;" offset="0" id="stop20038"/>
+ <stop style="stop-color:#ff8400;stop-opacity:0;" offset="1" id="stop20040"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10585">
+ <stop id="stop10587" offset="0.0000000" style="stop-color:#d7d7d7;stop-opacity:1.0000000;"/>
+ <stop id="stop10595" offset="1.0000000" style="stop-color:#000000;stop-opacity:1.0000000;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient31320">
+ <stop style="stop-color:white;stop-opacity:1;" offset="0" id="stop31322"/>
+ <stop style="stop-color:white;stop-opacity:0;" offset="1" id="stop31324"/>
+ </linearGradient>
+ <linearGradient id="linearGradient23178">
+ <stop style="stop-color:#ff992b;stop-opacity:1;" offset="0" id="stop23180"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop23182"/>
+ </linearGradient>
+ <linearGradient id="linearGradient13938">
+ <stop id="stop13940" offset="0" style="stop-color:#6e0c00;stop-opacity:1;"/>
+ <stop id="stop13942" offset="1" style="stop-color:#ee3800;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient14232">
+ <stop style="stop-color:#fff32a;stop-opacity:1;" offset="0" id="stop14234"/>
+ <stop style="stop-color:#fff551;stop-opacity:0;" offset="1" id="stop14236"/>
+ </linearGradient>
+ <linearGradient id="linearGradient14418">
+ <stop id="stop14420" offset="0" style="stop-color:#fa2509;stop-opacity:1;"/>
+ <stop id="stop14422" offset="1" style="stop-color:#fa2509;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient1610" id="linearGradient18670" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.2078427,0,0,1.0516432,-357.40769,69.427229)" x1="362.28571" y1="-45.098213" x2="352.46426" y2="-54.124699"/>
+
+ <linearGradient id="linearGradient31456">
+ <stop style="stop-color:#2b1600;stop-opacity:1;" offset="0" id="stop31458"/>
+ <stop style="stop-color:#6e3900;stop-opacity:0;" offset="1" id="stop31460"/>
+ </linearGradient>
+ <linearGradient id="linearGradient19425">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop19427"/>
+ <stop id="stop19431" offset="0.63109845" style="stop-color:#fffffe;stop-opacity:0.65789473;"/>
+ <stop style="stop-color:#fffffe;stop-opacity:0.0000000;" offset="1.0000000" id="stop19429"/>
+ </linearGradient>
+ <linearGradient id="linearGradient9030">
+ <stop style="stop-color:white;stop-opacity:1;" offset="0" id="stop9032"/>
+ <stop style="stop-color:white;stop-opacity:0;" offset="1" id="stop9034"/>
+ </linearGradient>
+ <linearGradient id="linearGradient1610">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542">
+ <stop id="stop37544" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient30124">
+ <stop style="stop-color:#1d4a8c;stop-opacity:1;" offset="0" id="stop30126"/>
+ <stop style="stop-color:#c1d4f2;stop-opacity:1;" offset="1" id="stop30128"/>
+ </linearGradient>
+ <linearGradient id="linearGradient15893">
+ <stop style="stop-color:#2968c3;stop-opacity:1;" offset="0" id="stop15895"/>
+ <stop id="stop15897" offset="0.37679368" style="stop-color:#b5ccf0;stop-opacity:1;"/>
+ <stop style="stop-color:#b5ccf0;stop-opacity:1;" offset="0.59786767" id="stop15899"/>
+ <stop style="stop-color:#2968c3;stop-opacity:1;" offset="1" id="stop15901"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073"/>
+ </linearGradient>
+ <linearGradient id="linearGradient32998">
+ <stop style="stop-color:#2968c3;stop-opacity:1;" offset="0" id="stop33000"/>
+ <stop style="stop-color:#c1d7f8;stop-opacity:1;" offset="1" id="stop33002"/>
+ </linearGradient>
+
+
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient1610" id="linearGradient69009" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.5466301,0,0,1.6489946,-293.01107,-16.485383)" x1="582" y1="49.294117" x2="582" y2="47.176472"/>
+
+ <linearGradient id="linearGradient39155">
+ <stop id="stop39157" offset="0" style="stop-color:white;stop-opacity:1;"/>
+ <stop id="stop39159" offset="1" style="stop-color:#dadada;stop-opacity:1;"/>
+ </linearGradient>
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient1610" id="linearGradient25381" gradientUnits="userSpaceOnUse" gradientTransform="translate(-1,21)" x1="342" y1="288.5" x2="344.5" y2="288.5"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient1610" id="linearGradient25383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,1,-1,0,638,-40)" x1="342" y1="288.5" x2="344.5" y2="288.5"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient1610" id="linearGradient25385" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-1,0,0,-1,699,599)" x1="342" y1="288.5" x2="344.5" y2="288.5"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient1610" id="linearGradient25387" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-1,1,0,60,660)" x1="342" y1="288.5" x2="344.5" y2="288.5"/>
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient1610" id="linearGradient32298" gradientUnits="userSpaceOnUse" x1="-117.5" y1="431.5" x2="-119.5" y2="429.5" gradientTransform="translate(258,-96.99999)"/>
+
+ <linearGradient id="linearGradient1610-7-6">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-4-1"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-0-4"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069-4-2">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-8-3"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-8-2"/>
+ </linearGradient>
+ <linearGradient id="linearGradient35411-4-27">
+ <stop id="stop35414-0-9" offset="0" style="stop-color:#2b5385;stop-opacity:1;"/>
+ <stop id="stop35416-9-5" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient35411-8-1-3">
+ <stop id="stop35414-2-7-1" offset="0" style="stop-color:#2b5385;stop-opacity:1;"/>
+ <stop id="stop35416-4-1-2" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient23974-5-4">
+ <stop id="stop23976-27-1" offset="0" style="stop-color:#2561b7;stop-opacity:1;"/>
+ <stop id="stop23978-6-1" offset="1" style="stop-color:#f9fbff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient1610-8">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-7"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-4"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-77">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-9"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-31"/>
+ </linearGradient>
+ <linearGradient id="linearGradient23974-4">
+ <stop id="stop23976-20" offset="0" style="stop-color:#2561b7;stop-opacity:1;"/>
+ <stop id="stop23978-9" offset="1" style="stop-color:#f9fbff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-37">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-2"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-60"/>
+ </linearGradient>
+
+ <linearGradient id="linearGradient1610-7409">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-488"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-2"/>
+ </linearGradient>
+ <linearGradient id="linearGradient40578-4-8-5">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop40580-8-9-5"/>
+ <stop style="stop-color:black;stop-opacity:0;" offset="1" id="stop40582-6-8-17"/>
+ </linearGradient>
+ <linearGradient id="linearGradient58334-1">
+ <stop id="stop58336-5" offset="0.0000000" style="stop-color:#ffffff;stop-opacity:0.87628865;"/>
+ <stop id="stop58338-27" offset="1.0000000" style="stop-color:#fffffe;stop-opacity:0.0000000;"/>
+ </linearGradient>
+
+ <linearGradient id="linearGradient1610-6">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-18"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-92"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069-9">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-5"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-43"/>
+ </linearGradient>
+ <linearGradient id="linearGradient21327-6">
+ <stop style="stop-color:#1e3e70;stop-opacity:1;" offset="0" id="stop21329-3"/>
+ <stop style="stop-color:#1e3e70;stop-opacity:0;" offset="1" id="stop21331-4"/>
+ </linearGradient>
+ <linearGradient id="linearGradient20055-8-4">
+ <stop id="stop20057-8-0" offset="0" style="stop-color:#0a2a5a;stop-opacity:1;"/>
+ <stop id="stop20059-2-0" offset="1" style="stop-color:#3771c8;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient39088">
+ <stop id="stop39090" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop39092" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient1610-83">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-24"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-11"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069-95">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-10"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-64"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069-3">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-87"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-42"/>
+ </linearGradient>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient1610-83" id="linearGradient38961" gradientUnits="userSpaceOnUse" x1="488.5" y1="568" x2="495" y2="568"/>
+
+ <linearGradient id="linearGradient319-46">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-03"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-62"/>
+ </linearGradient>
+
+ <linearGradient id="linearGradient1610-74-9-1">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-0-8-7"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-9-3-1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient58334-8-6-5">
+ <stop id="stop58336-8-9-2" offset="0.0000000" style="stop-color:#ffffff;stop-opacity:0.87628865;"/>
+ <stop id="stop58338-24-8-7" offset="1.0000000" style="stop-color:#fffffe;stop-opacity:0.0000000;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-5-6-2">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-761-2-1"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-89-7-6"/>
+ </linearGradient>
+ <linearGradient id="linearGradient13973-3-7-8">
+ <stop style="stop-color:#3c4c18;stop-opacity:1;" offset="0" id="stop13975-1-8-9"/>
+ <stop style="stop-color:#9aff31;stop-opacity:0;" offset="1" id="stop13977-2-0-2"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542-3-0-7-6">
+ <stop id="stop37544-1-6-6-5" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-2-1-7-0" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-34-8-7-0">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-11-9-8-0"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-38-3-1-6"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069-7-6-7-4">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-81-3-2-4"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-6-7-5-6"/>
+ </linearGradient>
+ <linearGradient id="linearGradient44627">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop44629"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop44631"/>
+ </linearGradient>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient44627" id="linearGradient43826" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-1,0,0,1,1444.9824,-215)" x1="689.47357" y1="427" x2="685.47357" y2="427"/>
+
+ <linearGradient id="linearGradient37542-7">
+ <stop id="stop37544-40" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-94" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542-5">
+ <stop id="stop37544-1" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-71" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069-9-71">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-5-1"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-43-5"/>
+ </linearGradient>
+ <linearGradient id="linearGradient23974-2">
+ <stop id="stop23976-2" offset="0" style="stop-color:#2561b7;stop-opacity:1;"/>
+ <stop id="stop23978-1" offset="1" style="stop-color:#f9fbff;stop-opacity:1"/>
+ </linearGradient>
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient23974-2" id="linearGradient28968" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.4646688,0,0,1.4650206,168.77325,-157.03253)" x1="-38.103703" y1="266.11719" x2="-20.826464" y2="253.23859"/>
+ <linearGradient id="linearGradient319-5">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-761"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-8"/>
+ </linearGradient>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient37542-7" id="linearGradient29424" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.4646688,0,0,1.4650206,168.77325,-157.03253)" x1="-26.511335" y1="257.99881" x2="-30.075666" y2="259.87677"/>
+
+ <linearGradient id="linearGradient21327-6-8">
+ <stop style="stop-color:#1e3e70;stop-opacity:1;" offset="0" id="stop21329-3-4"/>
+ <stop style="stop-color:#1e3e70;stop-opacity:0;" offset="1" id="stop21331-4-0"/>
+ </linearGradient>
+ <linearGradient id="linearGradient28526">
+ <stop id="stop28528" offset="0" style="stop-color:#2561b7;stop-opacity:1;"/>
+ <stop id="stop28530" offset="1" style="stop-color:#f9fbff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-62">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-90"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-4"/>
+ </linearGradient>
+ <linearGradient id="linearGradient1610-52-2">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-32-8"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-46-8"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-62-8">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-90-6"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-4-0"/>
+ </linearGradient>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient1610-52-2" id="radialGradient29805" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.94105289,0.01178942,-0.01073736,0.8570756,238.4669,249.70522)" cx="-30.028414" cy="19.425121" fx="-30.028414" fy="19.425121" r="7"/>
+
+
+ <radialGradient id="radialGradient16142-7" cx="20.892099" cy="64.567902" r="5.257" fx="20.892099" fy="64.567902" gradientUnits="userSpaceOnUse">
+ <stop offset="0" style="stop-color:#F0F0F0" id="stop16144-4"/>
+ <stop offset="1" style="stop-color:#474747" id="stop16146-0"/>
</radialGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath13106">
- <path
- style="fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;display:inline"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- id="path34850"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </clipPath>
- <linearGradient
- id="linearGradient58334">
- <stop
- id="stop58336"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:0.87628865;" />
- <stop
- id="stop58338"
- offset="1.0000000"
- style="stop-color:#fffffe;stop-opacity:0.0000000;" />
- </linearGradient>
- <linearGradient
- id="linearGradient8864">
- <stop
- id="stop8866"
- offset="0"
- style="stop-color:#b43214;stop-opacity:1;" />
- <stop
- id="stop8868"
- offset="1"
- style="stop-color:#e86830;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient20324">
- <stop
- id="stop20326"
- offset="0"
- style="stop-color:#35241b;stop-opacity:1;" />
- <stop
- style="stop-color:#69390e;stop-opacity:0.8392157;"
- offset="0.17637014"
- id="stop20328" />
- <stop
- style="stop-color:#6c5b15;stop-opacity:0.67843139;"
- offset="0.35274029"
- id="stop20330" />
- <stop
- id="stop20332"
- offset="1"
- style="stop-color:#947b15;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient37623">
- <stop
- id="stop37625"
- offset="0"
- style="stop-color:#e5e1ca;stop-opacity:1;" />
- <stop
- id="stop37627"
- offset="1"
- style="stop-color:#d6ca22;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient36116">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop36118" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop36120" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22852"
- gradientUnits="userSpaceOnUse"
- x1="133.94305"
- y1="116.00471"
- x2="117.29694"
- y2="133.14267" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient22850"
- gradientUnits="userSpaceOnUse"
- x1="136.55727"
- y1="125.87247"
- x2="129.70895"
- y2="118.00132" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22896"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.01387,0)"
- x1="441.98615"
- y1="77.44017"
- x2="424.75217"
- y2="75.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22846"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.01387,0)"
- x1="438.61115"
- y1="78"
- x2="424.75217"
- y2="75.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22844"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.01387,0)"
- x1="437.98615"
- y1="77"
- x2="424.75217"
- y2="75.5" />
- <linearGradient
- id="linearGradient22562">
- <stop
- style="stop-color:#001e50;stop-opacity:1;"
- offset="0"
- id="stop22564" />
- <stop
- style="stop-color:#1e3e70;stop-opacity:0;"
- offset="1"
- id="stop22566" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient22562"
- id="linearGradient22842"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(399.01387,-202)"
- x1="28.4375"
- y1="277"
- x2="23.25"
- y2="276.92188" />
- <linearGradient
- id="linearGradient22556">
- <stop
- id="stop22558"
- offset="0"
- style="stop-color:#6a9bef;stop-opacity:1" />
- <stop
- style="stop-color:#bccee8;stop-opacity:0.58450705;"
- offset="0.77941167"
- id="stop22568" />
- <stop
- id="stop22560"
- offset="1"
- style="stop-color:#ccdaed;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient22556"
- id="linearGradient22840"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.785748,0,0,0.78488,265.93616,46.1048)"
- x1="210.08989"
- y1="38.088879"
- x2="199.27217"
- y2="38.088879" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="radialGradient22838"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8128508,0,0,0.8128508,80.474142,14.46897)"
- cx="430.00003"
- cy="77.3125"
- fx="430.00003"
- fy="77.3125"
- r="8" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient22882"
- id="linearGradient22848"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1929722,0,0,0.5,-462.63135,-59)"
- x1="24"
- y1="285"
- x2="31.538462"
- y2="285" />
- <linearGradient
- id="linearGradient22882">
- <stop
- style="stop-color:#323232;stop-opacity:0;"
- offset="0"
- id="stop22884" />
- <stop
- id="stop22886"
- offset="0.21233012"
- style="stop-color:#323232;stop-opacity:0.49803922;" />
- <stop
- id="stop22888"
- offset="0.54086536"
- style="stop-color:#323232;stop-opacity:1;" />
- <stop
- style="stop-color:#323232;stop-opacity:0.49803922;"
- offset="0.83381736"
- id="stop22890" />
- <stop
- style="stop-color:#323232;stop-opacity:0;"
- offset="1"
- id="stop22892" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient22882"
- id="linearGradient22880"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0369025,0,0,1.5,-458.38567,-344)"
- x1="23.959812"
- y1="285"
- x2="31.498274"
- y2="285" />
- <linearGradient
- id="linearGradient35407">
- <stop
- id="stop35409"
- offset="0"
- style="stop-color:#a17306;stop-opacity:1;" />
- <stop
- style="stop-color:#cca649;stop-opacity:1;"
- offset="0.43277758"
- id="stop35411" />
- <stop
- id="stop35413"
- offset="1"
- style="stop-color:#f9f5e9;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient35391">
- <stop
- id="stop35393"
- offset="0"
- style="stop-color:#322800;stop-opacity:1;" />
- <stop
- id="stop35395"
- offset="1"
- style="stop-color:#6e4800;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient34157">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop34159" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop34161" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient38256"
- id="linearGradient22457"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-18)"
- x1="-25.5"
- y1="36.828632"
- x2="-25.5"
- y2="26.027344" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22455"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-354,-314.00002)"
- x1="308"
- y1="323"
- x2="343.26239"
- y2="340" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22453"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-18)"
- x1="-27.299919"
- y1="37"
- x2="-25.5"
- y2="23.414351" />
- <linearGradient
- id="linearGradient21609">
- <stop
- id="stop21611"
- offset="0"
- style="stop-color:black;stop-opacity:1" />
- <stop
- id="stop21613"
- offset="1"
- style="stop-color:white;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient21609"
- id="linearGradient20961"
- gradientUnits="userSpaceOnUse"
- x1="162"
- y1="103.71875"
- x2="165"
- y2="103.75" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask20957">
- <rect
- y="101"
- x="162"
- height="5"
- width="8"
- id="rect20959"
- style="fill:url(#linearGradient20961);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.29999995;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32335"
- gradientUnits="userSpaceOnUse"
- x1="285.39999"
- y1="323.80002"
- x2="286.60001"
- y2="325" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22081"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-157.00004,-233.00002)"
- x1="308"
- y1="323"
- x2="337.80573"
- y2="337.517" />
- <filter
- inkscape:collect="always"
- id="filter23214"
- x="-0.48015866"
- width="1.9603173"
- y="-0.47984189"
- height="1.9596838"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.53351805"
- id="feGaussianBlur23216" />
- </filter>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient19900">
- <stop
- style="stop-color:#1a1a1a;stop-opacity:1;"
- offset="0"
- id="stop19902" />
- <stop
- style="stop-color:#1a1a1a;stop-opacity:0;"
- offset="1"
- id="stop19904" />
- </linearGradient>
- <linearGradient
- id="linearGradient18105">
- <stop
- id="stop18107"
- offset="0"
- style="stop-color:#162d50;stop-opacity:1" />
- <stop
- id="stop18109"
- offset="1"
- style="stop-color:#1e3e70;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient18056">
- <stop
- id="stop18058"
- offset="0"
- style="stop-color:#162d50;stop-opacity:1" />
- <stop
- id="stop18060"
- offset="1"
- style="stop-color:#295498;stop-opacity:0.34057972;" />
- </linearGradient>
- <linearGradient
- id="linearGradient21327">
- <stop
- style="stop-color:#1e3e70;stop-opacity:1;"
- offset="0"
- id="stop21329" />
- <stop
- style="stop-color:#1e3e70;stop-opacity:0;"
- offset="1"
- id="stop21331" />
- </linearGradient>
- <linearGradient
- id="linearGradient19625">
- <stop
- id="stop19627"
- offset="0"
- style="stop-color:#2258a6;stop-opacity:1;" />
- <stop
- id="stop19629"
- offset="1"
- style="stop-color:#c1d7f8;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient35391"
- id="linearGradient20217"
- x1="408.75"
- y1="-35.483223"
- x2="408.75"
- y2="-40.000008"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient18821">
- <stop
- style="stop-color:#fc6b58;stop-opacity:1;"
- offset="0"
- id="stop18823" />
- <stop
- style="stop-color:#fc6b58;stop-opacity:0;"
- offset="1"
- id="stop18825" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient22187"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.554794"
- cy="500.26215"
- fx="75.554794"
- fy="500.26215"
- r="3.1650217" />
- <linearGradient
- id="linearGradient29149">
- <stop
- id="stop29151"
- offset="0"
- style="stop-color:#76adff;stop-opacity:1;" />
- <stop
- id="stop29153"
- offset="1"
- style="stop-color:#a5c9ff;stop-opacity:0;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29149"
- id="radialGradient21820"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.217888"
- cy="500.66806"
- fx="75.217888"
- fy="500.66806"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient21818"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.4624192,0,0,1.4467089,-36.975824,-224.99718)"
- cx="79.959885"
- cy="503.81497"
- fx="79.959885"
- fy="503.81497"
- r="2.9089756" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient21816"
- gradientUnits="userSpaceOnUse"
- x1="89.526657"
- y1="511.42972"
- x2="78.000008"
- y2="501.04794" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient21814"
- gradientUnits="userSpaceOnUse"
- x1="80.768944"
- y1="504.67188"
- x2="76.885078"
- y2="501.58331" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient21741"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3949409,0.3949425,-0.4243709,0.4254619,321.60762,256.85923)"
- cx="75.95578"
- cy="492.15359"
- fx="75.95578"
- fy="492.15359"
- r="3.1650217" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15809"
- id="linearGradient21773"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9281768,0,0,0.9971589,401.42265,-484.56523)"
- x1="88.874489"
- y1="502.71924"
- x2="41.311054"
- y2="501.10059" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient21776"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8666667,0,0,0.9166667,406.13333,-443.79167)"
- x1="108"
- y1="500"
- x2="54.8125"
- y2="500" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient22166"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8886193,0.8021825,-0.8051059,0.8972684,411.80247,-8.668512)"
- cx="74.518959"
- cy="499.99969"
- fx="74.518959"
- fy="499.99969"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient22164"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.4624192,0,0,1.4467089,-36.975824,-224.99718)"
- cx="79.959885"
- cy="503.81497"
- fx="79.959885"
- fy="503.81497"
- r="2.9089756" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22162"
- gradientUnits="userSpaceOnUse"
- x1="89.526657"
- y1="511.42972"
- x2="78.000008"
- y2="501.04794" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient22160"
- gradientUnits="userSpaceOnUse"
- x1="80.768944"
- y1="504.67188"
- x2="76.885078"
- y2="501.58331" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient22158"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3949409,0.3949425,-0.4243709,0.4254619,321.60762,256.85923)"
- cx="75.95578"
- cy="492.15359"
- fx="75.95578"
- fy="492.15359"
- r="3.1650217" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15809"
- id="linearGradient22156"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.9971589,396,-484.56523)"
- x1="88.874489"
- y1="502.71924"
- x2="41.311054"
- y2="501.10059" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient22154"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8666667,0,0,0.9166667,406.13333,-443.79167)"
- x1="108"
- y1="500"
- x2="54.8125"
- y2="500" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient15809">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop15811" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop15813" />
- </linearGradient>
- <linearGradient
- id="linearGradient15437">
- <stop
- id="stop15439"
- offset="0"
- style="stop-color:#20529e;stop-opacity:1;" />
- <stop
- id="stop15441"
- offset="1"
- style="stop-color:#1d3f71;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient15425">
- <stop
- style="stop-color:#8c0000;stop-opacity:1;"
- offset="0"
- id="stop15427" />
- <stop
- style="stop-color:#c80000;stop-opacity:0;"
- offset="1"
- id="stop15429" />
- </linearGradient>
- <linearGradient
- id="linearGradient14262">
- <stop
- id="stop14264"
- offset="0"
- style="stop-color:#2661b6;stop-opacity:1;" />
- <stop
- id="stop14266"
- offset="1"
- style="stop-color:#c1d7f8;stop-opacity:0;" />
- </linearGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath17188">
- <path
- style="fill:#d3d7cf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 240.5,-19.90625 c -1.87005,0 -3.40625,1.536202 -3.40625,3.40625 l 0,2 c 0,1.87005 1.53621,3.40625 3.40625,3.40625 l 0,-2.8125 c -0.33932,0 -0.59375,-0.254431 -0.59375,-0.59375 l 0,-2 c 0,-0.339319 0.25443,-0.59375 0.59375,-0.59375 l 0,-2.8125 z"
- id="path17190" />
- </clipPath>
- <linearGradient
- id="linearGradient18344">
- <stop
- style="stop-color:#6c6c6c;stop-opacity:1;"
- offset="0"
- id="stop18346" />
- <stop
- style="stop-color:#f0f0f0;stop-opacity:1;"
- offset="1"
- id="stop18348" />
- </linearGradient>
- <linearGradient
- id="linearGradient5060">
- <stop
- id="stop5062"
- offset="0"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- id="stop5064"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient27957">
- <stop
- id="stop27959"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:0;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0.59290552"
- id="stop27963" />
- <stop
- id="stop27961"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient23647">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop23649" />
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="1"
- id="stop23651" />
- </linearGradient>
- <linearGradient
- id="linearGradient23390">
- <stop
- style="stop-color:#000000;stop-opacity:1.0000000"
- offset="0.0000000"
- id="stop23392" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1.0000000"
- offset="1.0000000"
- id="stop23400" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16359">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16361" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16363" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15746"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.207032,0,0,0.903901,679.26,-38.98429)"
- x1="386.09836"
- y1="230.09529"
- x2="388.35962"
- y2="248.10277" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15744"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.207032,0,0,0.903901,679.30638,-38.92179)"
- x1="390.61163"
- y1="229.34804"
- x2="390.55936"
- y2="248.24983" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15683"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.203777,0,0,0.903901,837.9645,-18.01568)"
- x1="383.67041"
- y1="225.94354"
- x2="385.60632"
- y2="248.55901" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15681"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.207032,0,0,0.903901,839.2424,-18.01568)"
- x1="391.80222"
- y1="230.5647"
- x2="387.94211"
- y2="247.83209" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient13545"
- gradientUnits="userSpaceOnUse"
- x1="126.37006"
- y1="112.31642"
- x2="137.11284"
- y2="126.19643" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient15878"
- gradientUnits="userSpaceOnUse"
- x1="190.68166"
- y1="244.14676"
- x2="174.75458"
- y2="226.33672" />
- <linearGradient
- id="linearGradient20756">
- <stop
- style="stop-color:#932200;stop-opacity:1;"
- offset="0"
- id="stop20758" />
- <stop
- style="stop-color:#f8420a;stop-opacity:1;"
- offset="1"
- id="stop20760" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20756"
- id="linearGradient13543"
- gradientUnits="userSpaceOnUse"
- x1="126.45676"
- y1="110.59049"
- x2="134.94949"
- y2="122.08995" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15693"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1.253963,1,0,169,-94.7765)"
- x1="228.5468"
- y1="118.5"
- x2="235"
- y2="118.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15691"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.222225,0,0,1,-87.33412,169)"
- x1="215.07817"
- y1="109.00085"
- x2="235.90916"
- y2="121.88217" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15689"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1.253963,1,0,169,-94.7765)"
- x1="228.5468"
- y1="118.5"
- x2="235"
- y2="118.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15687"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.222225,0,0,1,-87.33412,169)"
- x1="217.22589"
- y1="107.25085"
- x2="235.90916"
- y2="121" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15854"
- gradientUnits="userSpaceOnUse"
- x1="381.56296"
- y1="234.59885"
- x2="393"
- y2="247.99632" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient31456"
- id="linearGradient13639"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8329616,0,0,0.8433415,58.576199,29.193917)"
- x1="399.987"
- y1="259.26602"
- x2="385.88068"
- y2="241.70195" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23178"
- id="linearGradient52023"
- gradientUnits="userSpaceOnUse"
- x1="390.75"
- y1="244.5312"
- x2="395.9375"
- y2="250.9062" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient31456"
- id="linearGradient14661"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8329616,0,0,0.8433415,58.576199,29.193917)"
- x1="400.88739"
- y1="257.4874"
- x2="385.88068"
- y2="241.70195" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23178"
- id="linearGradient52025"
- gradientUnits="userSpaceOnUse"
- x1="391.01859"
- y1="241.86644"
- x2="396.79285"
- y2="247.83134" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient31456"
- id="linearGradient15995"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8329616,0,0,0.8433415,58.576199,29.193917)"
- x1="399.08661"
- y1="257.41327"
- x2="385.88068"
- y2="241.70195" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15993"
- gradientUnits="userSpaceOnUse"
- x1="381.5"
- y1="231.7812"
- x2="393.4375"
- y2="247.1562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15997"
- gradientUnits="userSpaceOnUse"
- x1="381.5"
- y1="231.7812"
- x2="393.4375"
- y2="247.1562" />
- <linearGradient
- id="linearGradient47130">
- <stop
- style="stop-color:#ed7b00;stop-opacity:1;"
- offset="0"
- id="stop47132" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop47134" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23178"
- id="linearGradient52027"
- gradientUnits="userSpaceOnUse"
- x1="329.28757"
- y1="244.97151"
- x2="339.84518"
- y2="254.18553" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15436"
- gradientUnits="userSpaceOnUse"
- x1="319.75095"
- y1="234.63918"
- x2="333.94208"
- y2="248.68198" />
- <linearGradient
- id="linearGradient32842">
- <stop
- style="stop-color:#183e75;stop-opacity:1;"
- offset="0"
- id="stop32844" />
- <stop
- style="stop-color:#1d3f71;stop-opacity:0;"
- offset="1"
- id="stop32846" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient13900"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.2541045,-1.3755453,0.900369,1.4754358,-3699.4512,2858.7)"
- cx="2357.1072"
- cy="826.77924"
- fx="2357.1072"
- fy="826.77924"
- r="6.1896501" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40983"
- id="linearGradient38692"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(2226.9963,823)"
- x1="130.70599"
- y1="18.44199"
- x2="130.70599"
- y2="21.94199" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15717"
- gradientUnits="userSpaceOnUse"
- x1="328.38852"
- y1="33.505165"
- x2="331.44778"
- y2="36.739578" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15715"
- gradientUnits="userSpaceOnUse"
- x1="320.2735"
- y1="25.109356"
- x2="332.41409"
- y2="37.468754" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15713"
- gradientUnits="userSpaceOnUse"
- x1="329.18762"
- y1="34.005215"
- x2="331.44778"
- y2="36.739578" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15711"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(2.011921e-5,12.000013)"
- x1="326.483"
- y1="31.446384"
- x2="337.3125"
- y2="41.875" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15709"
- gradientUnits="userSpaceOnUse"
- x1="332.49747"
- y1="38.166924"
- x2="326.41843"
- y2="31.22842" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15707"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(2.011921e-5,12.000013)"
- x1="323.37836"
- y1="30.3883"
- x2="343.5636"
- y2="53.758793" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15646"
- gradientUnits="userSpaceOnUse"
- x1="279.00009"
- y1="-16.62501"
- x2="291.93054"
- y2="-6.3206272" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15644"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.000006,0,0,1,258.9997,-253)"
- x1="25.437477"
- y1="238.54002"
- x2="51.01355"
- y2="263.79816" />
- <linearGradient
- id="linearGradient20973">
- <stop
- id="stop20975"
- offset="0"
- style="stop-color:#15ff00;stop-opacity:1;" />
- <stop
- id="stop20977"
- offset="1"
- style="stop-color:#15ff00;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient20962">
- <stop
- style="stop-color:#00a8ff;stop-opacity:1;"
- offset="0"
- id="stop20965" />
- <stop
- style="stop-color:#00a8ff;stop-opacity:0;"
- offset="1"
- id="stop20967" />
- </linearGradient>
- <linearGradient
- id="linearGradient20036">
- <stop
- style="stop-color:#ffb55e;stop-opacity:1;"
- offset="0"
- id="stop20038" />
- <stop
- style="stop-color:#ff8400;stop-opacity:0;"
- offset="1"
- id="stop20040" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15574"
- gradientUnits="userSpaceOnUse"
- x1="197.63152"
- y1="169.14206"
- x2="190.41687"
- y2="160.02296" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15358"
- gradientUnits="userSpaceOnUse"
- x1="47.655102"
- y1="93.805557"
- x2="59.057678"
- y2="105.27895"
- gradientTransform="matrix(1.1000194,0,0,1.0998287,-4.6508478,-9.2334126)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15356"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9995967,0,0,1.0002103,-78.949724,-0.02739749)"
- x1="109.04134"
- y1="75.666725"
- x2="135.45256"
- y2="103.11092" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15362"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient15360"
- gradientUnits="userSpaceOnUse"
- x1="124.40742"
- y1="111.98244"
- x2="135.36497"
- y2="120.87388" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient21531"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2859754,0,0,1,39.669142,20)"
- x1="348.06064"
- y1="220.55545"
- x2="363.71661"
- y2="239.94608" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient14517"
- gradientUnits="userSpaceOnUse"
- x1="5.9836898"
- y1="71.51989"
- x2="18.01141"
- y2="84.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient14511"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.923955,0,0,1,-18.1369,-168)"
- x1="3.3959732"
- y1="216.62332"
- x2="35.029804"
- y2="248.37102" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient16069"
- gradientUnits="userSpaceOnUse"
- x1="5.9836898"
- y1="71.51989"
- x2="17.011419"
- y2="82.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient16067"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2859754,0,0,1,-440.36032,-147)"
- x1="348.06064"
- y1="220.55545"
- x2="363.71661"
- y2="239.94608" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient16063"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.923955,0,0,1,-18.1369,-168)"
- x1="6.9917974"
- y1="219.61856"
- x2="35.029804"
- y2="248.37102" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient16154"
- gradientUnits="userSpaceOnUse"
- x1="5.9836898"
- y1="71.51989"
- x2="18.51141"
- y2="85.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient16150"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.923955,0,0,1,-18.1369,-168)"
- x1="3.8504581"
- y1="217.4549"
- x2="33.15686"
- y2="247.71701" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15734"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8520698,0,0,0.7746114,324.58589,47.486124)"
- x1="9.5404434"
- y1="223.47467"
- x2="35.029804"
- y2="248.37102" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient16174"
- gradientUnits="userSpaceOnUse"
- x1="5.9836898"
- y1="71.51989"
- x2="18.51141"
- y2="85.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient16170"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.923955,0,0,1,-18.1369,-168)"
- x1="2.911078"
- y1="217.3624"
- x2="33.15686"
- y2="247.71701" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15736"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8520698,0,0,0.7746114,324.58589,47.486124)"
- x1="9.5404434"
- y1="223.47467"
- x2="35.029804"
- y2="248.37102" />
- <linearGradient
- id="linearGradient13998">
- <stop
- id="stop14000"
- offset="0"
- style="stop-color:#f57d07;stop-opacity:1;" />
- <stop
- id="stop14002"
- offset="1"
- style="stop-color:white;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15705"
- gradientUnits="userSpaceOnUse"
- x1="148.71947"
- y1="166.53206"
- x2="147"
- y2="165" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15703"
- gradientUnits="userSpaceOnUse"
- x1="146.80022"
- y1="158.34668"
- x2="150.08357"
- y2="162.03282" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15701"
- gradientUnits="userSpaceOnUse"
- x1="148.71947"
- y1="166.53206"
- x2="147"
- y2="165" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15699"
- gradientUnits="userSpaceOnUse"
- x1="122.84515"
- y1="126.83902"
- x2="149.88129"
- y2="164.94562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15742"
- gradientUnits="userSpaceOnUse"
- x1="392.0101"
- y1="224.99998"
- x2="392.0101"
- y2="249.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15721"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(19.97577,-6.0080883)"
- x1="227.57907"
- y1="118.47696"
- x2="235"
- y2="118.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15719"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(19.97577,-6.0080883)"
- x1="222.4996"
- y1="110.37873"
- x2="233.08319"
- y2="121" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15723"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-6.0080883)"
- x1="230.95012"
- y1="100.89436"
- x2="230.74091"
- y2="124.09359" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15778"
- gradientUnits="userSpaceOnUse"
- x1="126.37006"
- y1="112.31642"
- x2="135.54141"
- y2="122.0597" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient15780"
- gradientUnits="userSpaceOnUse"
- x1="190.68166"
- y1="244.14676"
- x2="174.75458"
- y2="226.33672" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15776"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,10.767079)"
- x1="132.35471"
- y1="246.32236"
- x2="129.81586"
- y2="243.70523" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15774"
- gradientUnits="userSpaceOnUse"
- x1="103.53399"
- y1="88.301094"
- x2="136.3542"
- y2="123.17216" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15450"
- gradientUnits="userSpaceOnUse"
- x1="126.37006"
- y1="112.31642"
- x2="144.22272"
- y2="129.82761" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient15452"
- gradientUnits="userSpaceOnUse"
- x1="190.68166"
- y1="244.14676"
- x2="174.75458"
- y2="226.33672" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient15448"
- gradientUnits="userSpaceOnUse"
- x1="132.12782"
- y1="246.32236"
- x2="129.24866"
- y2="243.31177" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15446"
- gradientUnits="userSpaceOnUse"
- x1="87.969383"
- y1="69.87941"
- x2="135.40274"
- y2="121.19196" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15124"
- gradientUnits="userSpaceOnUse"
- x1="328.38852"
- y1="33.505165"
- x2="331.44778"
- y2="36.739578" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30208"
- id="linearGradient15122"
- gradientUnits="userSpaceOnUse"
- x1="328.95557"
- y1="33.94022"
- x2="331.74063"
- y2="37.044456" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient16025"
- gradientUnits="userSpaceOnUse"
- x1="192.11751"
- y1="122.12527"
- x2="184.43379"
- y2="112.34031" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15580"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.395521,0,0,-0.3955,275.223,171.0515)"
- x1="213.51967"
- y1="121.417"
- x2="204.05295"
- y2="111.7235" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15578"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.607961,0,0,0.607967,64.49194,51.63899)"
- x1="213.53587"
- y1="122.66508"
- x2="203.33264"
- y2="112.67535" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15748"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,-241.7085,428.4841)"
- x1="349.04059"
- y1="143.70836"
- x2="336.72485"
- y2="117.00745" />
- <linearGradient
- id="linearGradient10585">
- <stop
- id="stop10587"
- offset="0.0000000"
- style="stop-color:#d7d7d7;stop-opacity:1.0000000;" />
- <stop
- id="stop10595"
- offset="1.0000000"
- style="stop-color:#000000;stop-opacity:1.0000000;" />
- </linearGradient>
- <linearGradient
- id="linearGradient4138">
- <stop
- style="stop-color:#6c432f;stop-opacity:1;"
- offset="0"
- id="stop4140" />
- <stop
- style="stop-color:#c0966d;stop-opacity:1;"
- offset="1"
- id="stop4142" />
- </linearGradient>
- <linearGradient
- id="linearGradient31320">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop31322" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop31324" />
- </linearGradient>
- <linearGradient
- id="linearGradient12678">
- <stop
- id="stop12680"
- offset="0"
- style="stop-color:#d40000;stop-opacity:1" />
- <stop
- id="stop12682"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient13991"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(1.691866,0.00341)"
- x1="86.452194"
- y1="101.22832"
- x2="110.48556"
- y2="81.14637" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient13520"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(1.401389,-3.2412)"
- x1="130.59862"
- y1="121.2412"
- x2="142.29109"
- y2="133.53448" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient23215"
- x1="147.07098"
- y1="134.18185"
- x2="129.67148"
- y2="115.54105"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient23178">
- <stop
- style="stop-color:#ff992b;stop-opacity:1;"
- offset="0"
- id="stop23180" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop23182" />
- </linearGradient>
- <linearGradient
- id="linearGradient13973">
- <stop
- style="stop-color:#3c4c18;stop-opacity:1;"
- offset="0"
- id="stop13975" />
- <stop
- style="stop-color:#9aff31;stop-opacity:0;"
- offset="1"
- id="stop13977" />
- </linearGradient>
- <linearGradient
- id="linearGradient13938">
- <stop
- id="stop13940"
- offset="0"
- style="stop-color:#6e0c00;stop-opacity:1;" />
- <stop
- id="stop13942"
- offset="1"
- style="stop-color:#ee3800;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient14232">
- <stop
- style="stop-color:#fff32a;stop-opacity:1;"
- offset="0"
- id="stop14234" />
- <stop
- style="stop-color:#fff551;stop-opacity:0;"
- offset="1"
- id="stop14236" />
- </linearGradient>
- <filter
- inkscape:collect="always"
- id="filter13996"
- x="-0.23644176"
- width="1.4728835"
- y="-0.24368355"
- height="1.4873672"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.29550651"
- id="feGaussianBlur13998" />
- </filter>
- <linearGradient
- id="linearGradient14418">
- <stop
- id="stop14420"
- offset="0"
- style="stop-color:#fa2509;stop-opacity:1;" />
- <stop
- id="stop14422"
- offset="1"
- style="stop-color:#fa2509;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient14935"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-26,2.9206276e-6)"
- x1="474"
- y1="73.999992"
- x2="477.25"
- y2="77.499992" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient14841"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-6,1.4603138e-6)"
- x1="474.84375"
- y1="75"
- x2="477.5"
- y2="77.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient18852"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-22)"
- x1="148.15451"
- y1="-216.25"
- x2="157.91019"
- y2="-216.25" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient18850"
- gradientUnits="userSpaceOnUse"
- x1="107.15463"
- y1="-227.83138"
- x2="105.81714"
- y2="-219.8996" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient18848"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20.000285,-20.002166)"
- x1="123.36729"
- y1="-219.24783"
- x2="136.51436"
- y2="-217.99782" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient18845"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20.000285,-20.002166)"
- x1="135.30351"
- y1="-219.54408"
- x2="123.63815"
- y2="-219.49783" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient18843"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-22)"
- x1="157.97339"
- y1="-215.99998"
- x2="146.36111"
- y2="-215.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient18901"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(279.04534,461.00001)"
- x1="151"
- y1="-234"
- x2="149.95467"
- y2="-239.14549" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient18904"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(280.04419,461)"
- x1="151"
- y1="-234"
- x2="150.25"
- y2="-236.85815" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient18898"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(280.99885,461)"
- x1="150.11926"
- y1="-235.21587"
- x2="145.20955"
- y2="-241.85452" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient18896"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(280,461)"
- x1="150.95467"
- y1="-234.00002"
- x2="147.41411"
- y2="-239.28557" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient17819"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(280,459)"
- x1="150.95467"
- y1="-234.00002"
- x2="147.41411"
- y2="-239.28557" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient17817"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(280,461)"
- x1="150.95467"
- y1="-234.00002"
- x2="147.41411"
- y2="-239.28557" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient17535"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-22)"
- x1="148.15451"
- y1="-216.25"
- x2="157.91019"
- y2="-216.25" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient17533"
- gradientUnits="userSpaceOnUse"
- x1="107.15463"
- y1="-227.83138"
- x2="105.81714"
- y2="-219.8996" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient17531"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20.000285,-20.002166)"
- x1="123.36729"
- y1="-219.24783"
- x2="136.51436"
- y2="-217.99782" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient17529"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20.000285,-20.002166)"
- x1="135.30351"
- y1="-219.54408"
- x2="123.63815"
- y2="-219.49783" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient17527"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-22)"
- x1="157.97339"
- y1="-215.99998"
- x2="146.36111"
- y2="-215.99998" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient18207">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop18209" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1"
- offset="1"
- id="stop18211" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18207"
- id="linearGradient18213"
- x1="481.46063"
- y1="219"
- x2="519.44189"
- y2="218.48816"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient17506"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-22)"
- x1="148.15451"
- y1="-216.25"
- x2="157.91019"
- y2="-216.25" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient17504"
- gradientUnits="userSpaceOnUse"
- x1="107.15463"
- y1="-227.83138"
- x2="105.81714"
- y2="-219.8996" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient17502"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20.000285,-20.002166)"
- x1="123.36729"
- y1="-219.24783"
- x2="136.51436"
- y2="-217.99782" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient17500"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20.000285,-20.002166)"
- x1="135.30351"
- y1="-219.54408"
- x2="123.63815"
- y2="-219.49783" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient17498"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-22)"
- x1="157.97339"
- y1="-215.99998"
- x2="146.36111"
- y2="-215.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient18670"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2078427,0,0,1.0516432,-357.40769,69.427229)"
- x1="362.28571"
- y1="-45.098213"
- x2="352.46426"
- y2="-54.124699" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask18666">
- <rect
- y="6"
- x="62.921577"
- height="14.000001"
- width="15.098035"
- id="rect18668"
- style="fill:url(#linearGradient18670);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient15592"
- gradientUnits="userSpaceOnUse"
- x1="127.50285"
- y1="114.74636"
- x2="132.35237"
- y2="118.69846" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient15590"
- gradientUnits="userSpaceOnUse"
- x1="127.50285"
- y1="114.74636"
- x2="135.54628"
- y2="120.58403" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient15596"
- gradientUnits="userSpaceOnUse"
- x1="124.52369"
- y1="112.22441"
- x2="131.10667"
- y2="118.10129" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient15594"
- gradientUnits="userSpaceOnUse"
- x1="127.50285"
- y1="114.74636"
- x2="134.62978"
- y2="120.14633" />
- <filter
- inkscape:collect="always"
- x="-0.71999419"
- width="2.4399884"
- y="-0.72000581"
- height="2.4400115"
- id="filter31351"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.83077614"
- id="feGaussianBlur31353" />
- </filter>
- <linearGradient
- id="linearGradient14219">
- <stop
- id="stop14221"
- offset="0"
- style="stop-color:#ff8605;stop-opacity:1;" />
- <stop
- id="stop14223"
- offset="1"
- style="stop-color:#9c6700;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient31456">
- <stop
- style="stop-color:#2b1600;stop-opacity:1;"
- offset="0"
- id="stop31458" />
- <stop
- style="stop-color:#6e3900;stop-opacity:0;"
- offset="1"
- id="stop31460" />
- </linearGradient>
- <linearGradient
- id="linearGradient19425">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop19427" />
- <stop
- id="stop19431"
- offset="0.63109845"
- style="stop-color:#fffffe;stop-opacity:0.65789473;" />
- <stop
- style="stop-color:#fffffe;stop-opacity:0.0000000;"
- offset="1.0000000"
- id="stop19429" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient30208">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop30210" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop30212" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15782"
- gradientUnits="userSpaceOnUse"
- x1="125.19086"
- y1="125.66204"
- x2="132.98256"
- y2="118" />
- <linearGradient
- id="linearGradient9030">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop9032" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop9034" />
- </linearGradient>
- <linearGradient
- id="linearGradient1610">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612" />
- </linearGradient>
- <linearGradient
- id="linearGradient37542">
- <stop
- id="stop37544"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient30124">
- <stop
- style="stop-color:#1d4a8c;stop-opacity:1;"
- offset="0"
- id="stop30126" />
- <stop
- style="stop-color:#c1d4f2;stop-opacity:1;"
- offset="1"
- id="stop30128" />
- </linearGradient>
- <linearGradient
- id="linearGradient15893">
- <stop
- style="stop-color:#2968c3;stop-opacity:1;"
- offset="0"
- id="stop15895" />
- <stop
- id="stop15897"
- offset="0.37679368"
- style="stop-color:#b5ccf0;stop-opacity:1;" />
- <stop
- style="stop-color:#b5ccf0;stop-opacity:1;"
- offset="0.59786767"
- id="stop15899" />
- <stop
- style="stop-color:#2968c3;stop-opacity:1;"
- offset="1"
- id="stop15901" />
- </linearGradient>
- <linearGradient
- id="linearGradient319">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient24000">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop24002" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop24004" />
- </linearGradient>
- <linearGradient
- id="linearGradient10069">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073" />
- </linearGradient>
- <linearGradient
- id="linearGradient32998">
- <stop
- style="stop-color:#2968c3;stop-opacity:1;"
- offset="0"
- id="stop33000" />
- <stop
- style="stop-color:#c1d7f8;stop-opacity:1;"
- offset="1"
- id="stop33002" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient21364"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,-32.5,115.5045)"
- x1="261.83936"
- y1="11.593864"
- x2="277.86761"
- y2="29.392145" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient21366"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,-32.9445,114.0045)"
- x1="272.05627"
- y1="24.537012"
- x2="283.42514"
- y2="37.115723" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient21368"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(124,-102.00001)"
- x1="85.1875"
- y1="239.125"
- x2="92.8125"
- y2="245.625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient21370"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,-32.5,115.5045)"
- x1="261.83936"
- y1="11.593864"
- x2="277.86761"
- y2="29.392145" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient21372"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,-32.9445,114.0045)"
- x1="272.05627"
- y1="24.537012"
- x2="283.42514"
- y2="37.115723" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient21374"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(124,-102.00001)"
- x1="85.1875"
- y1="239.125"
- x2="92.8125"
- y2="245.625" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="radialGradient21517"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.891843,0,0,0.909224,-173.99085,171.21624)"
- cx="350.5"
- cy="14.5"
- fx="350.5"
- fy="14.5"
- r="6.9000001" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient21641"
- gradientUnits="userSpaceOnUse"
- x1="127.50285"
- y1="114.74636"
- x2="133.62564"
- y2="120.24665" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient21643"
- gradientUnits="userSpaceOnUse"
- x1="126.15096"
- y1="113.21745"
- x2="132"
- y2="118" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient20796"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(159.9998,-41.00751)"
- x1="261.44702"
- y1="234.6606"
- x2="274.30609"
- y2="247.73561" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient20798"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(199.9999,105.99249)"
- x1="235.46884"
- y1="103"
- x2="228.71886"
- y2="94.53125" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient21862"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.923955,0,0,1,-18.1369,-168)"
- x1="3.2344713"
- y1="215.76874"
- x2="33.15686"
- y2="247.71701" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient21864"
- gradientUnits="userSpaceOnUse"
- x1="5.9836898"
- y1="71.51989"
- x2="19.011419"
- y2="86" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient21902"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.923955,0,0,1,-18.1369,-168)"
- x1="3.3268692"
- y1="215.35608"
- x2="33.15686"
- y2="247.71701" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient21904"
- gradientUnits="userSpaceOnUse"
- x1="5.9836898"
- y1="71.51989"
- x2="18.51141"
- y2="85.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient31646"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.000006,0,0,1,258.9997,-237)"
- x1="24.374985"
- y1="238.33629"
- x2="55.384842"
- y2="269.1373" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient31648"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,16)"
- x1="278.55817"
- y1="-16.978563"
- x2="291.577"
- y2="-5.8786855" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20036"
- id="radialGradient31650"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.816279,0,-3.646264e-6,0.779872,56.32029,28.34496)"
- cx="306.55292"
- cy="11.818644"
- fx="306.55292"
- fy="11.818644"
- r="4.25" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14418"
- id="radialGradient31652"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.580596,1.138426,-0.692447,0.961382,-175.3891,-329.6844)"
- cx="312.80765"
- cy="10.620173"
- fx="312.80765"
- fy="10.620173"
- r="4.25" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20962"
- id="radialGradient31654"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.48445,-0.00657397,0.00734631,1.660903,-154.1629,19.305572)"
- cx="313.74268"
- cy="15.619254"
- fx="313.74268"
- fy="15.619254"
- r="4.25" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20973"
- id="radialGradient31656"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.756245,0,-3.378096e-6,0.722516,72.63115,31.07857)"
- cx="309.0571"
- cy="15.518281"
- fx="309.0571"
- fy="15.518281"
- r="4.25" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient31664"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8579582,0,0,0.9285714,7.397998,-211.96428)"
- x1="-6.3249049"
- y1="205.0083"
- x2="32.351238"
- y2="248.75177" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient31666"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.9569715,-1,0,259,351.18743)"
- x1="347.6467"
- y1="216.75188"
- x2="345.98633"
- y2="243.92201" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient31668"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9166667,0,0,0.9166667,24.364541,-55.041665)"
- x1="5.9836898"
- y1="71.51989"
- x2="18.01141"
- y2="84.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient31672"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.9297203,-1.2117965,0,305.73028,342.22894)"
- x1="346.15555"
- y1="218.2382"
- x2="346.58698"
- y2="238.44429" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient31694"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9166695,0,0,0.9203753,-10.025729,345.78566)"
- x1="80.60067"
- y1="108.47212"
- x2="68.0271"
- y2="94.239906" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13938"
- id="linearGradient31696"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-15.983875,338)"
- x1="70.55275"
- y1="97.5"
- x2="79.355118"
- y2="107.18619" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient31698"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9998599,0,0,0.9960071,-15.972985,338.41149)"
- x1="64.998215"
- y1="90.951675"
- x2="86.00116"
- y2="112.03586" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient31932"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,105.5221,92.482413)"
- x1="257.0376"
- y1="10.838325"
- x2="277.61203"
- y2="31.019331" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient31934"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.7827973,0,0,0.9989462,77.082208,42.08484)"
- x1="332.03717"
- y1="68.624634"
- x2="346.08932"
- y2="83.002625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient31936"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(262,-125)"
- x1="79.329903"
- y1="236"
- x2="92.8125"
- y2="245.625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24000"
- id="linearGradient33666"
- gradientUnits="userSpaceOnUse"
- x1="124.14184"
- y1="126.23546"
- x2="132"
- y2="118" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient33668"
- gradientUnits="userSpaceOnUse"
- x1="125.45158"
- y1="125.94608"
- x2="133.53401"
- y2="116.55647" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient33670"
- gradientUnits="userSpaceOnUse"
- x1="142.97318"
- y1="107.64013"
- x2="130.82327"
- y2="119.554" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient33681"
- gradientUnits="userSpaceOnUse"
- x1="139.93341"
- y1="110.56118"
- x2="132"
- y2="118.66972" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient32842"
- id="linearGradient33700"
- gradientUnits="userSpaceOnUse"
- x1="149.55772"
- y1="98.630066"
- x2="123.9021"
- y2="127.60542" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient10540"
- gradientUnits="userSpaceOnUse"
- x1="130.95198"
- y1="117.09563"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient11333"
- gradientUnits="userSpaceOnUse"
- x1="119.1647"
- y1="106.08605"
- x2="133.01006"
- y2="119.79803" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient28057"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-425,393.99999)"
- x1="225.6198"
- y1="5.7625732"
- x2="236.47855"
- y2="14.103563" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30208"
- id="linearGradient28077"
- x1="306.26187"
- y1="272"
- x2="307"
- y2="263.55374"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient28474"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,10)"
- x1="431.05026"
- y1="121.42467"
- x2="446.26407"
- y2="110.49417" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient28528"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,10)"
- x1="442.69827"
- y1="107.56771"
- x2="450.27414"
- y2="122.95798" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient28530"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-474,158.25)"
- x1="437.57828"
- y1="104.34499"
- x2="447.96875"
- y2="117.90625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient28532"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,10)"
- x1="-38.103703"
- y1="266.11719"
- x2="-20.826464"
- y2="253.23859" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient10982"
- x1="207.04637"
- y1="182.09375"
- x2="213.7883"
- y2="182.52524"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient10984"
- x1="212.04637"
- y1="182.09375"
- x2="222.35799"
- y2="182.77524"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient11762"
- x1="371.98389"
- y1="203"
- x2="376.48389"
- y2="203"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient11764"
- x1="366.98389"
- y1="203"
- x2="370.98389"
- y2="202.75"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient11766"
- x1="391.62881"
- y1="243.48854"
- x2="386.13718"
- y2="244.68996"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="radialGradient12427"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.050372,0,0,1.050372,-3.551238,-0.730396)"
- cx="70.5"
- cy="14.5"
- fx="70.5"
- fy="14.5"
- r="1.5" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14219"
- id="radialGradient12429"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5007214,0.3131662,-0.3623683,0.5793905,300.02235,-93.056748)"
- cx="70.470596"
- cy="14.649424"
- fx="70.470596"
- fy="14.649424"
- r="5.5192375" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16359"
- id="linearGradient12602"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,-1,456.04574,-116.51416)"
- x1="88.079262"
- y1="66.110847"
- x2="95.954262"
- y2="58.272621" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient31456"
- id="linearGradient12114"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1438.0001,-418)"
- x1="1663.8125"
- y1="722"
- x2="1661.8125"
- y2="726.37006" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient19425"
- id="radialGradient12116"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.1378252,-0.2988982,2.5269117,1.1651875,-1830.2675,-33.64056)"
- cx="1662.2664"
- cy="722.19189"
- fx="1662.2664"
- fy="722.19189"
- r="5.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient12118"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,-1397.7474,-388.72044)"
- x1="1984.5453"
- y1="828.21777"
- x2="1978.11"
- y2="829.35315" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30208"
- id="linearGradient12213"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1297,-948)"
- x1="1663.8125"
- y1="722"
- x2="1661.8125"
- y2="726.37006" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient19425"
- id="radialGradient12215"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.1378252,-0.2988982,2.5269117,1.1651875,-1689.2674,-563.64056)"
- cx="1662.2664"
- cy="722.19189"
- fx="1662.2664"
- fy="722.19189"
- r="5.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient12217"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,-1256.7473,-918.72044)"
- x1="1984.3658"
- y1="827.77124"
- x2="1979.2772"
- y2="827.32849" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient12305"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2000005,0,0,1.1997014,-125.70008,-191.68873)"
- x1="257.24991"
- y1="147.38998"
- x2="262.24991"
- y2="152.46707" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient12307"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2000005,0,0,1.1997014,-125.70008,-191.68873)"
- x1="258.08322"
- y1="147.87068"
- x2="264.16571"
- y2="153.8233" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient13046"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(360,-161.99999)"
- x1="-80"
- y1="151"
- x2="-80"
- y2="152.24998" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask13041">
- <rect
- style="fill:url(#linearGradient13046);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect13043"
- width="7"
- height="8"
- x="276"
- y="-12" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient13056"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(360,-145.93749)"
- x1="-80"
- y1="151"
- x2="-80"
- y2="152.24998" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask13052">
- <rect
- y="4.0625"
- x="276"
- height="8"
- width="7"
- id="rect13054"
- style="fill:url(#linearGradient13056);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- transform="scale(1,-1)" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient14167"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-636.98388,52.01562)"
- x1="443.86667"
- y1="133.98936"
- x2="451.98389"
- y2="143.58749" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4138"
- id="linearGradient14169"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-635.98388,53.01562)"
- x1="456.03769"
- y1="135.76678"
- x2="453.61005"
- y2="133.00301" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient14171"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-636.98388,52.01562)"
- x1="449.14645"
- y1="136.18045"
- x2="453.24457"
- y2="138.7879" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4138"
- id="linearGradient14173"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-635.98388,53.01562)"
- x1="456.03769"
- y1="135.76678"
- x2="454.31345"
- y2="133.62801" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient13112"
- gradientUnits="userSpaceOnUse"
- x1="133.42287"
- y1="120.62622"
- x2="126.67323"
- y2="113.20281" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient13114"
- gradientUnits="userSpaceOnUse"
- x1="120.77391"
- y1="106.19939"
- x2="144.64095"
- y2="129.62753" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient16027"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8289081,0,0,2.1560411,236.27148,-864.45588)"
- x1="212"
- y1="435.59741"
- x2="211.99998"
- y2="435.32159" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23647"
- id="linearGradient16031"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1035181,0,0,1,158.18497,-359.77344)"
- x1="229.6875"
- y1="440.51562"
- x2="238.53125"
- y2="440.57812" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23390"
- id="radialGradient16034"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.8126517,-0.04317018,0.04642643,1.9485655,-18.817545,-774.28453)"
- cx="224.32494"
- cy="441.84744"
- fx="224.32494"
- fy="441.84744"
- r="6.7191267" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30208"
- id="linearGradient16036"
- gradientUnits="userSpaceOnUse"
- x1="211.99998"
- y1="435.7319"
- x2="211.99998"
- y2="436.07974"
- gradientTransform="matrix(0.9803611,0,0,2.1560411,204.16345,-864.45588)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23647"
- id="linearGradient16039"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(182,-359.75)"
- x1="221.96414"
- y1="439.75"
- x2="238.87605"
- y2="448.88205" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient17337"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.0041772,0,0,0.9688607,-81.584854,117.13687)"
- x1="-4.9152389"
- y1="252.69086"
- x2="-45.689278"
- y2="252.63284" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient17339"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9993234,0,0,1.0050357,-171.92846,305.72314)"
- x1="107.96875"
- y1="53.875"
- x2="117"
- y2="60.125" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient17656"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0008786,0,0,1.081555,-21.021535,-187.45087)"
- x1="-12.839478"
- y1="201"
- x2="44.522621"
- y2="256.70349" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient17658"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.099576,0,0,1.0999923,190.46996,204.85062)"
- x1="9.6310225"
- y1="76"
- x2="15"
- y2="81" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient17712"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.0041772,0,0,0.9688607,370.43125,-83.863716)"
- x1="-5.6700387"
- y1="250.87607"
- x2="-46.452946"
- y2="251.42462" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient17714"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9993234,0,0,1.0050357,280.08766,104.72255)"
- x1="102.61966"
- y1="50.742527"
- x2="117"
- y2="60.125" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient12655"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8193413,0,0,0.8193419,-388.72692,-564.02452)"
- x1="150.4086"
- y1="104.61366"
- x2="151.40744"
- y2="105.64391" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30208"
- id="linearGradient12658"
- gradientUnits="userSpaceOnUse"
- x1="150.4086"
- y1="104.61366"
- x2="151.40744"
- y2="105.64391"
- gradientTransform="matrix(0.8193413,0,0,0.8193419,141.28585,391.96271)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30208"
- id="linearGradient13511"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8193413,0,0,0.8193419,141.28585,391.96271)"
- x1="150.4086"
- y1="104.61366"
- x2="151.40744"
- y2="105.64391" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient13513"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8193413,0,0,0.8193419,-388.72692,-564.02452)"
- x1="150.4086"
- y1="104.61366"
- x2="151.40744"
- y2="105.64391" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30208"
- id="linearGradient13527"
- gradientUnits="userSpaceOnUse"
- x1="328.95557"
- y1="33.94022"
- x2="331.74063"
- y2="37.044456" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient13529"
- gradientUnits="userSpaceOnUse"
- x1="328.38852"
- y1="33.505165"
- x2="331.44778"
- y2="36.739578" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient14568"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(68.016116,127.00002)"
- x1="97.983887"
- y1="127.99998"
- x2="88.983887"
- y2="115.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient14570"
- gradientUnits="userSpaceOnUse"
- x1="94.485573"
- y1="122.13319"
- x2="89.207298"
- y2="125.83332" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient14572"
- gradientUnits="userSpaceOnUse"
- x1="88.560204"
- y1="127.88263"
- x2="94.011101"
- y2="123.83599" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient47130"
- id="linearGradient13699"
- x1="-162.89217"
- y1="245"
- x2="-174.18907"
- y2="224.99274"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13998"
- id="linearGradient26282"
- gradientUnits="userSpaceOnUse"
- x1="13.5"
- y1="57.827747"
- x2="11.472005"
- y2="53.875874" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13998"
- id="linearGradient26284"
- gradientUnits="userSpaceOnUse"
- x1="-18.600719"
- y1="501.96539"
- x2="-26.642899"
- y2="487.60382" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient26286"
- gradientUnits="userSpaceOnUse"
- x1="15.027407"
- y1="60.637787"
- x2="13.5"
- y2="57.750687" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient26288"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.03018343,0.1408617)"
- x1="-32.067383"
- y1="490.70178"
- x2="-22.25"
- y2="500" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient14198"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(218.01612,129)"
- x1="87.03125"
- y1="241"
- x2="92.8125"
- y2="245.625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient14204"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,61.53822,346.48241)"
- x1="246.89435"
- y1="-4.4418921"
- x2="277.68143"
- y2="30.743095" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15195"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9166695,0,0,0.9203753,-10.025729,345.78566)"
- x1="80.60067"
- y1="108.47212"
- x2="68.0271"
- y2="94.239906" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient71814"
- id="linearGradient15209"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-15.983875,338)"
- x1="70.55275"
- y1="97.5"
- x2="79.355118"
- y2="107.18619" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15211"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9998599,0,0,0.9960071,-15.972985,338.41149)"
- x1="61.465469"
- y1="88.058716"
- x2="86.00116"
- y2="112.03586" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient15363"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9999519,0,0,0.9998051,-33.993941,254.01926)"
- x1="101.21339"
- y1="68.783279"
- x2="135.45256"
- y2="103.11092" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15365"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1004102,0,0,1.0993832,40.331334,244.81698)"
- x1="47.655102"
- y1="93.805557"
- x2="59.057678"
- y2="105.27895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10585"
- id="linearGradient15367"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.032977,0,0,1,128.82015,107.77516)"
- x1="12.330792"
- y1="246.97107"
- x2="41.654194"
- y2="247.3784" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18207"
- id="linearGradient15383"
- gradientUnits="userSpaceOnUse"
- x1="-132.24858"
- y1="313.87549"
- x2="-171.01999"
- y2="223.69542" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient14377"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(1.691866,0.00341)"
- x1="86.452194"
- y1="101.22832"
- x2="110.48556"
- y2="81.14637" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient16638"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(42,0)"
- x1="108"
- y1="500"
- x2="54.8125"
- y2="500" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15809"
- id="linearGradient16640"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(42,0)"
- x1="85.874489"
- y1="501.74075"
- x2="26.561054"
- y2="498.48148" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient16642"
- gradientUnits="userSpaceOnUse"
- x1="80.768944"
- y1="504.67188"
- x2="76.885078"
- y2="501.58331" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient16644"
- gradientUnits="userSpaceOnUse"
- x1="89.526657"
- y1="511.42972"
- x2="78.000008"
- y2="501.04794" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient16646"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3949409,0.3949425,-0.4243709,0.4254619,300.60762,256.85923)"
- cx="75.95578"
- cy="492.15359"
- fx="75.95578"
- fy="492.15359"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient16648"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.4624192,0,0,1.4467089,-36.975824,-224.99718)"
- cx="79.959885"
- cy="503.81497"
- fx="79.959885"
- fy="503.81497"
- r="2.9089756" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient16650"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8886193,0.8021825,-0.8051059,0.8972684,411.80247,-8.668512)"
- cx="74.518959"
- cy="499.99969"
- fx="74.518959"
- fy="499.99969"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient32447"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.054749"
- cy="499.87418"
- fx="75.054749"
- fy="499.87418"
- r="3.1650217" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30231"
- gradientUnits="userSpaceOnUse"
- x1="441.48248"
- y1="105.03784"
- x2="446.73828"
- y2="111.74544" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24101"
- id="linearGradient30233"
- gradientUnits="userSpaceOnUse"
- x1="445.37457"
- y1="112.86145"
- x2="425.92511"
- y2="84.928581" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30235"
- gradientUnits="userSpaceOnUse"
- x1="440.68439"
- y1="106.0996"
- x2="446.00906"
- y2="110.93529" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30237"
- gradientUnits="userSpaceOnUse"
- x1="440.34833"
- y1="105.74502"
- x2="445.36435"
- y2="110.27587" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30239"
- gradientUnits="userSpaceOnUse"
- x1="440.7211"
- y1="104.97093"
- x2="445.36435"
- y2="110.27587" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23302"
- id="linearGradient30241"
- gradientUnits="userSpaceOnUse"
- x1="414.99771"
- y1="-35"
- x2="414.99771"
- y2="-36.625011" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24081"
- id="linearGradient30243"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.004608,0)"
- x1="416.00461"
- y1="-34"
- x2="415.94211"
- y2="-37.718761" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient30245"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.004608,0)"
- x1="416.5"
- y1="-29.933779"
- x2="416.5"
- y2="-37.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient30247"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1,0)"
- x1="416.41162"
- y1="-34.342831"
- x2="416.46497"
- y2="-39.140816" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30249"
- gradientUnits="userSpaceOnUse"
- x1="409.00003"
- y1="-40.99012"
- x2="413.49658"
- y2="-34.707108" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient30326"
- gradientUnits="userSpaceOnUse"
- x1="446.05634"
- y1="112.72269"
- x2="436.76331"
- y2="100.6615" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30328"
- gradientUnits="userSpaceOnUse"
- x1="440.03735"
- y1="103.53646"
- x2="446.73828"
- y2="111.74544" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient30330"
- gradientUnits="userSpaceOnUse"
- x1="447.06949"
- y1="114.61743"
- x2="432.36887"
- y2="94.07222" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30332"
- gradientUnits="userSpaceOnUse"
- x1="438.92477"
- y1="103.46223"
- x2="446.00906"
- y2="110.93529" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30334"
- gradientUnits="userSpaceOnUse"
- x1="439.0434"
- y1="104.06953"
- x2="445.36435"
- y2="110.27587" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30336"
- gradientUnits="userSpaceOnUse"
- x1="439.04333"
- y1="104.0401"
- x2="445.36435"
- y2="110.27587" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient30338"
- gradientUnits="userSpaceOnUse"
- x1="415.00003"
- y1="-33.99012"
- x2="415"
- y2="-36.25" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient30340"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.004608,0)"
- x1="415.41223"
- y1="-31.506163"
- x2="415.45193"
- y2="-37.520515" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient30342"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.004608,0)"
- x1="416.5"
- y1="-29.933779"
- x2="416.5"
- y2="-37.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient30344"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1,0)"
- x1="416.5"
- y1="-33.8125"
- x2="416.46497"
- y2="-39.140816" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30346"
- gradientUnits="userSpaceOnUse"
- x1="409.00003"
- y1="-40.99012"
- x2="413.49658"
- y2="-34.707108" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient30348"
- gradientUnits="userSpaceOnUse"
- x1="408.75"
- y1="-35.483223"
- x2="408.75"
- y2="-40.000008" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient30394"
- gradientUnits="userSpaceOnUse"
- x1="446.05634"
- y1="112.72269"
- x2="436.76331"
- y2="100.6615" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30396"
- gradientUnits="userSpaceOnUse"
- x1="440.03735"
- y1="103.53646"
- x2="446.73828"
- y2="111.74544" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient30398"
- gradientUnits="userSpaceOnUse"
- x1="447.06949"
- y1="114.61743"
- x2="432.36887"
- y2="94.07222" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30400"
- gradientUnits="userSpaceOnUse"
- x1="438.92477"
- y1="103.46223"
- x2="446.00906"
- y2="110.93529" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30402"
- gradientUnits="userSpaceOnUse"
- x1="439.0434"
- y1="104.06953"
- x2="445.36435"
- y2="110.27587" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30404"
- gradientUnits="userSpaceOnUse"
- x1="439.04333"
- y1="104.0401"
- x2="445.36435"
- y2="110.27587" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient30406"
- gradientUnits="userSpaceOnUse"
- x1="415.00003"
- y1="-33.99012"
- x2="415"
- y2="-36.25" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient30408"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.004608,0)"
- x1="415.41223"
- y1="-31.506163"
- x2="415.45193"
- y2="-37.520515" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient30410"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.004608,0)"
- x1="416.5"
- y1="-29.933779"
- x2="416.5"
- y2="-37.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient30412"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1,0)"
- x1="416.5"
- y1="-33.8125"
- x2="416.46497"
- y2="-39.140816" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30414"
- gradientUnits="userSpaceOnUse"
- x1="409.00003"
- y1="-40.99012"
- x2="413.49658"
- y2="-34.707108" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient30416"
- gradientUnits="userSpaceOnUse"
- x1="408.75"
- y1="-35.483223"
- x2="408.75"
- y2="-40.000008" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask17570">
- <path
- sodipodi:nodetypes="cccc"
- style="fill:#ffffff;fill-rule:evenodd;stroke:none"
- d="m -44,358 0,14 14,-14 -14,0 z"
- id="path17572" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient18682"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8461524,0,0,0.9230835,365.8517,-147.63686)"
- x1="27.405855"
- y1="189.20862"
- x2="35.029804"
- y2="248.37102" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient18690"
- gradientUnits="userSpaceOnUse"
- x1="29.972469"
- y1="164"
- x2="29.972469"
- y2="168"
- gradientTransform="translate(359.05264,-81.98142)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient18752"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.923955,0,0,1,-18.1369,-168)"
- x1="30.435225"
- y1="202.99998"
- x2="30.435225"
- y2="251.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient18756"
- gradientUnits="userSpaceOnUse"
- x1="5.9836898"
- y1="71.51989"
- x2="16.733877"
- y2="88"
- gradientTransform="matrix(1,0,0,1.2222204,0,-15.888744)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient18779"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6923077,0,0,-0.6923079,29.049874,351.11545)"
- x1="7.9951181"
- y1="264.90152"
- x2="32.267426"
- y2="237.9342" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient18823"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-122.98388,276)"
- x1="-55.936718"
- y1="77.808868"
- x2="-55.844753"
- y2="84.217026" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient18831"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5384613,0,0,0.538461,-189.69233,224.07704)"
- x1="29.142912"
- y1="161.42842"
- x2="29.142912"
- y2="252.42851" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient18841"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.462416,0,0,0.538461,-193.81309,224.07705)"
- x1="29.871567"
- y1="153.99983"
- x2="29.871567"
- y2="252.4285" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient18846"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.462416,0,0,0.461541,-193.81309,236.42243)"
- x1="29.871567"
- y1="174.58366"
- x2="29.871567"
- y2="259.08319" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient18854"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2500001,0,0,2.2000001,-102.35484,177)"
- x1="-55.936718"
- y1="77.808868"
- x2="-55.844753"
- y2="84.217026" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient18858"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.8000001,-122.98388,285.5)"
- x1="-55.936718"
- y1="77.808868"
- x2="-55.844753"
- y2="84.217026" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient18862"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.0000001,0,0,1.6000003,163.54205,53.499972)"
- x1="-60.266121"
- y1="74.0625"
- x2="-54.766121"
- y2="84.6875" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient32725"
- gradientUnits="userSpaceOnUse"
- x1="-88.0625"
- y1="364"
- x2="-44.983891"
- y2="411.9375" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32727"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9166695,0,0,0.9203753,-117.02574,313.78567)"
- x1="80.60067"
- y1="108.47212"
- x2="68.0271"
- y2="94.239906" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="linearGradient32729"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6666675,0,0,0.6666633,-101.32265,336.66698)"
- x1="61.983898"
- y1="88.999977"
- x2="89.770271"
- y2="121.709" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32731"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9998599,0,0,0.9960071,-122.97299,306.4115)"
- x1="61.465469"
- y1="88.058716"
- x2="86.00116"
- y2="112.03586" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient32749"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.081988,0,0,1.0833333,-123.05997,-52.467545)"
- x1="326.72092"
- y1="33.927608"
- x2="352.03485"
- y2="60.463093" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient32751"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-15.983875,338)"
- x1="-46.417774"
- y1="1.9796312"
- x2="-21.988398"
- y2="27" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32753"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0983862,0,0,1.0999999,-128.47957,-53.059225)"
- x1="324.13901"
- y1="28.882492"
- x2="333.96365"
- y2="39.250004" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient17135"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(18,0)"
- x1="-51.6875"
- y1="442.6875"
- x2="-42.377892"
- y2="452.20007" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient17177"
- gradientUnits="userSpaceOnUse"
- x1="28.322077"
- y1="160.10768"
- x2="32.679554"
- y2="164.34546" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient17179"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-6.8461644e-7,-1.8,1.1087755,0.00352366,-193.46828,187.54551)"
- cx="4.351675"
- cy="81.592964"
- fx="4.351675"
- fy="81.592964"
- r="5" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18344"
- id="radialGradient17181"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.5123107,0.9569981,-0.5028837,0.7946898,-131.57281,-236.33663)"
- cx="244.14325"
- cy="-14.13948"
- fx="244.14325"
- fy="-14.13948"
- r="3.4000001" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient17214"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.923955,0,0,1,-18.1369,-168)"
- x1="29.352921"
- y1="199"
- x2="29.352921"
- y2="250" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient17216"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.2222204,0,-15.888744)"
- x1="5.9836898"
- y1="71.51989"
- x2="16.733877"
- y2="88" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient17218"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.2859748,0,0,1,-272.87621,148)"
- x1="348.06064"
- y1="220.55545"
- x2="363.71661"
- y2="239.94608" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient17220"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4289612,0,0,1,-326.93899,144.5)"
- x1="348.06064"
- y1="220.55545"
- x2="363.71661"
- y2="239.94608" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient17222"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.923955,0,0,1,-18.1369,-168)"
- x1="29.352921"
- y1="199"
- x2="29.352921"
- y2="250" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient17224"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.2222204,0,-15.888744)"
- x1="5.9836898"
- y1="71.51989"
- x2="16.733877"
- y2="88" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient17226"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2868892,0,0,1,-644.69395,148)"
- x1="348.06064"
- y1="220.55545"
- x2="363.71661"
- y2="239.94608" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient17242"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.923955,0,0,1,-18.1369,-168)"
- x1="9.5404434"
- y1="223.47467"
- x2="36.247395"
- y2="249.62102" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient17244"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.2222204,0,-15.888744)"
- x1="5.9836898"
- y1="71.51989"
- x2="16.733877"
- y2="88" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient18712"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="103.65562"
- y1="49.547874"
- x2="120.79755"
- y2="57.84819" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient18721"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,244.3928,19.4113)"
- x1="-88.73024"
- y1="-120.6127"
- x2="-78.787354"
- y2="-128.30418" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient31320"
- id="linearGradient18728"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,222.97812,19.5574)"
- x1="68.688324"
- y1="51.42366"
- x2="72.671516"
- y2="55.501457" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="linearGradient18765"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,309.42934,-349.44584)"
- x1="-26.207859"
- y1="252.77303"
- x2="-5.4963508"
- y2="253.15045" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient34157"
- id="linearGradient35488"
- gradientUnits="userSpaceOnUse"
- x1="270.66064"
- y1="68.113258"
- x2="257.38638"
- y2="81.382545" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35490"
- gradientUnits="userSpaceOnUse"
- x1="256.38586"
- y1="80.515495"
- x2="262.43726"
- y2="74.562462" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29149"
- id="radialGradient35492"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.217888"
- cy="500.66806"
- fx="75.217888"
- fy="500.66806"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient35494"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.554794"
- cy="500.26215"
- fx="75.554794"
- fy="500.26215"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient35967"
- cx="257.35309"
- cy="79.598709"
- fx="257.35309"
- fy="79.598709"
- r="3.779551"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.656002,0,0,0.656002,88.923481,27.003843)" />
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath18524">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(-1.1435655,0,0,1.1436475,512.11415,45.72091)"
- d="m 262,78.5 a 3.5,3.5 0 1 1 -7,0 3.5,3.5 0 1 1 7,0 z"
- sodipodi:ry="3.5"
- sodipodi:rx="3.5"
- sodipodi:cy="78.5"
- sodipodi:cx="258.5"
- id="path18526"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.69954133;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
- sodipodi:type="arc"
- inkscape:transform-center-x="-6.3473305"
- inkscape:transform-center-y="-6.3853012" />
- </clipPath>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask18634">
- <path
- sodipodi:nodetypes="ccccscc"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 207,134 0,14 11,0 0,-7.5625 c -1.97252,-0.24738 -3.5,-1.89814 -3.5,-3.9375 0,-0.94675 0.35614,-1.81444 0.90625,-2.5 L 207,134 z"
- id="path18636" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient18478"
- gradientUnits="userSpaceOnUse"
- x1="172.5625"
- y1="601.5"
- x2="159.13864"
- y2="585.28772" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient18480"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-97.983877,565.25)"
- x1="249.64528"
- y1="1.5973248"
- x2="271.98389"
- y2="35.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35583"
- gradientUnits="userSpaceOnUse"
- x1="-0.78523314"
- y1="-33.408295"
- x2="4.952816"
- y2="-27.882322" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35585"
- gradientUnits="userSpaceOnUse"
- x1="-0.78523314"
- y1="-33.408295"
- x2="3.1666665"
- y2="-29.550003" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35587"
- gradientUnits="userSpaceOnUse"
- x1="-3.5"
- y1="-35.5"
- x2="2.6932251"
- y2="-29.488832" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient35589"
- gradientUnits="userSpaceOnUse"
- x1="4.9341426"
- y1="-29.678047"
- x2="4.8398785e-16"
- y2="-32.351803" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35591"
- gradientUnits="userSpaceOnUse"
- x1="0.5079475"
- y1="-32.317398"
- x2="4.2000003"
- y2="-28.597046" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="linearGradient35593"
- gradientUnits="userSpaceOnUse"
- x1="2.8144052"
- y1="-28.1"
- x2="-4.375"
- y2="-36.441402" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35595"
- gradientUnits="userSpaceOnUse"
- x1="-2.7708333"
- y1="-35.5"
- x2="1.1666667"
- y2="-32" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient35740"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.707654,0,0,0.707942,-206.46148,-296.13985)"
- x1="35.597904"
- y1="158.14117"
- x2="10.490564"
- y2="176.41806" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient35742"
- gradientUnits="userSpaceOnUse"
- x1="58.060974"
- y1="-23.721956"
- x2="40"
- y2="-35" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient35744"
- gradientUnits="userSpaceOnUse"
- x1="46.1875"
- y1="-28.59375"
- x2="41.099998"
- y2="-33.59375" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient36116"
- id="linearGradient35746"
- gradientUnits="userSpaceOnUse"
- x1="46"
- y1="-32"
- x2="43.883884"
- y2="-33.939339" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35748"
- gradientUnits="userSpaceOnUse"
- x1="41"
- y1="-29"
- x2="43"
- y2="-27" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient35750"
- gradientUnits="userSpaceOnUse"
- x1="48.662914"
- y1="-27.071922"
- x2="43.47097"
- y2="-32.337086" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35752"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(6.3,-4.7)"
- x1="39.200001"
- y1="-30.799999"
- x2="41.200001"
- y2="-28.640625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35754"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(5.315625,-3.75)"
- x1="39.200001"
- y1="-30.799999"
- x2="41.325001"
- y2="-28.765625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35756"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(3.3,0.3)"
- x1="38.700001"
- y1="-31.299999"
- x2="40.012501"
- y2="-29.799999" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient35772"
- gradientUnits="userSpaceOnUse"
- x1="51.912914"
- y1="-24.696922"
- x2="40.75"
- y2="-35.75"
- gradientTransform="translate(-0.75,4.75)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient51774"
- gradientUnits="userSpaceOnUse"
- x1="135.32962"
- y1="120.04005"
- x2="130.7244"
- y2="116.31882" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient51776"
- gradientUnits="userSpaceOnUse"
- x1="130.9015"
- y1="115.23484"
- x2="143.88347"
- y2="129.27184" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8864"
- id="linearGradient51804"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9993234,0,0,1.0050357,111.43697,300.37199)"
- x1="107.78085"
- y1="50.778313"
- x2="111.53449"
- y2="46.679707" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient51806"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9993234,0,0,1.0050357,111.55698,300.497)"
- x1="115.37703"
- y1="51.021076"
- x2="112.87534"
- y2="51.021076" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient51808"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9993234,0,0,1.0050357,111.35699,300.55457)"
- x1="110.57378"
- y1="50.963791"
- x2="108.07208"
- y2="50.963791" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient51810"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5192341,-0.5192341,0.5184617,0.5184617,100.36783,218.31526)"
- x1="-13.691219"
- y1="241.78653"
- x2="0.92051411"
- y2="237.27565" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient51812"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5192341,-0.5192341,0.5184617,0.5184617,100.13133,218.33837)"
- x1="-9.0782614"
- y1="249.96617"
- x2="-2.9318311"
- y2="240.68927" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient68937"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(439.89375,-187.79999)"
- x1="-5.3499999"
- y1="251.51265"
- x2="-8.5254431"
- y2="248.125" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient68939"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(439.89375,-187.79999)"
- x1="-10.35"
- y1="245.89999"
- x2="-13.091064"
- y2="242.8" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient68941"
- gradientUnits="userSpaceOnUse"
- x1="-41.065678"
- y1="240.10526"
- x2="-15.758821"
- y2="244.11874" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient68943"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(440.2082,-188.0039)"
- x1="-10.991813"
- y1="237.9574"
- x2="-7.0786314"
- y2="246.7774" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient68945"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(439.9582,-188.0039)"
- x1="-5.1338587"
- y1="244.08765"
- x2="-14.193665"
- y2="251.35759" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8864"
- id="linearGradient68947"
- gradientUnits="userSpaceOnUse"
- x1="-15.6"
- y1="247.38559"
- x2="-3.321322"
- y2="245.68124" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient68949"
- gradientUnits="userSpaceOnUse"
- x1="-5.3499999"
- y1="251.51265"
- x2="-8.7065439"
- y2="248.125" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient68951"
- gradientUnits="userSpaceOnUse"
- x1="-10.35"
- y1="245.89999"
- x2="-13.125"
- y2="242.81946" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient68953"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.25,0.2058042)"
- x1="-12.538609"
- y1="240.79787"
- x2="0.92051411"
- y2="237.27565" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient68955"
- gradientUnits="userSpaceOnUse"
- x1="-7.20822"
- y1="247.4906"
- x2="-1.7751017"
- y2="239.86711" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient69009"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.5466301,0,0,1.6489946,-293.01107,-16.485383)"
- x1="582"
- y1="49.294117"
- x2="582"
- y2="47.176472" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask69005">
- <rect
- style="fill:url(#linearGradient69009);fill-opacity:1;display:inline"
- id="rect69007"
- width="24.746082"
- height="26.383913"
- x="596.30127"
- y="39.580433" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient20269"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(12.999999,359)"
- x1="247"
- y1="99"
- x2="247"
- y2="94" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient20275"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(15.081669,359)"
- x1="245.63066"
- y1="106.28436"
- x2="245.80791"
- y2="94.440376" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient20283"
- x1="263.5"
- y1="455.25"
- x2="263.5"
- y2="460.5"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient20303"
- gradientUnits="userSpaceOnUse"
- x1="264"
- y1="452"
- x2="264"
- y2="460.6622"
- gradientTransform="matrix(1,0,0,0.6,-5,182.8)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient20309"
- x1="268"
- y1="462"
- x2="256"
- y2="459"
- gradientUnits="userSpaceOnUse" />
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath22590">
- <rect
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.20000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect22592"
- width="12"
- height="14"
- x="-30"
- y="490.00012" />
- </clipPath>
- <filter
- inkscape:collect="always"
- id="filter22979"
- x="-0.95999229"
- width="2.9199846"
- y="-0.96000773"
- height="2.9200156"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.1077015"
- id="feGaussianBlur22981" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter22999"
- x="-0.95999229"
- width="2.9199846"
- y="-0.96000773"
- height="2.9200156"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.1077015"
- id="feGaussianBlur23001" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter23007"
- x="-0.95999229"
- width="2.9199846"
- y="-0.96000773"
- height="2.9200156"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.1077015"
- id="feGaussianBlur23009" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter23015"
- x="-0.95999229"
- width="2.9199846"
- y="-0.96000773"
- height="2.9200156"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.1077015"
- id="feGaussianBlur23017" />
- </filter>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient23595"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.1666667,-737,357.33333)"
- x1="771.0965"
- y1="354.28479"
- x2="772"
- y2="358.85715" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask23591">
- <rect
- mask="none"
- style="fill:url(#linearGradient23595);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect23593"
- width="11"
- height="14"
- x="30"
- y="768" />
- </mask>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath23877">
- <rect
- transform="scale(1,-1)"
- y="-540"
- x="952"
- height="6"
- width="15"
- id="rect23879"
- style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- </clipPath>
- <linearGradient
- id="linearGradient39155">
- <stop
- id="stop39157"
- offset="0"
- style="stop-color:white;stop-opacity:1;" />
- <stop
- id="stop39159"
- offset="1"
- style="stop-color:#dadada;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient38718"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="121.22078"
- y2="56.357628" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient38721"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(207,-246.99988)"
- x1="-56.5"
- y1="342.0625"
- x2="-49"
- y2="341" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient39281"
- gradientUnits="userSpaceOnUse"
- x1="171"
- y1="71"
- x2="177"
- y2="77" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient39283"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1944456,0,0,1.2000039,-34.222431,-14.950295)"
- x1="175.17659"
- y1="74.972061"
- x2="176.40117"
- y2="76.182281" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient39285"
- gradientUnits="userSpaceOnUse"
- x1="165.19363"
- y1="64.53186"
- x2="176.15442"
- y2="76.210785" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient39287"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1718933,0,0,1.127086,-30.219387,-9.3173845)"
- x1="172.30418"
- y1="69.838829"
- x2="176.84593"
- y2="75.947906" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient39289"
- gradientUnits="userSpaceOnUse"
- x1="171"
- y1="70"
- x2="177"
- y2="77" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient39291"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1718933,0,0,1.127086,-30.219387,-9.3173845)"
- x1="175.1628"
- y1="74.125008"
- x2="176.84593"
- y2="75.947906" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient39293"
- gradientUnits="userSpaceOnUse"
- x1="171"
- y1="70"
- x2="177"
- y2="77" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient39295"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1718933,0,0,1.127086,-30.219387,-9.3173845)"
- x1="175.1628"
- y1="74.125008"
- x2="176.84593"
- y2="75.947906" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient39008"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="117.12428"
- y2="61.720783" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient39010"
- gradientUnits="userSpaceOnUse"
- x1="-56.5"
- y1="340.32199"
- x2="-56.5"
- y2="348" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient39012"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,13)"
- x1="-56.8125"
- y1="329.06256"
- x2="-47.214466"
- y2="329.26965" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient39014"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="117.12428"
- y2="61.720783" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient39016"
- gradientUnits="userSpaceOnUse"
- x1="-56.5"
- y1="340.32199"
- x2="-56.5"
- y2="348" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient39018"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,13)"
- x1="-56.8125"
- y1="329.06256"
- x2="-47.214466"
- y2="329.26965" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient39020"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="117.12428"
- y2="61.720783" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient39022"
- gradientUnits="userSpaceOnUse"
- x1="-56.5"
- y1="340.32199"
- x2="-56.5"
- y2="348" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient39024"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.7972867,61.99991,2.2419)"
- x1="260.67468"
- y1="108.02418"
- x2="273.9993"
- y2="126.37626" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient39026"
- x1="1127.7983"
- y1="448.375"
- x2="1153.0486"
- y2="430.25"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14418"
- id="linearGradient57417"
- gradientUnits="userSpaceOnUse"
- x1="146.82516"
- y1="134.65511"
- x2="130.10634"
- y2="117.10313" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient57419"
- gradientUnits="userSpaceOnUse"
- x1="139.37782"
- y1="126.3454"
- x2="131.71249"
- y2="118.34238" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient57421"
- gradientUnits="userSpaceOnUse"
- x1="125.01582"
- y1="110.86718"
- x2="132.46898"
- y2="119.54019" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient57423"
- gradientUnits="userSpaceOnUse"
- x1="127.60629"
- y1="112.12571"
- x2="140.72693"
- y2="126.72997" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient57454"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(258.00306,-231.00101)"
- x1="75.25"
- y1="393.25"
- x2="73.5"
- y2="391.5" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask57450">
- <rect
- y="154.99899"
- x="326.00305"
- height="15"
- width="15"
- id="rect57452"
- style="fill:url(#linearGradient57454);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient22891"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.728189,0,0,1.727271,-357.88848,243.63713)"
- x1="174.99828"
- y1="12.918247"
- x2="167.59578"
- y2="12.551482" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30124"
- id="linearGradient22893"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.728189,0,0,1.727271,-357.88848,243.63713)"
- x1="169.47711"
- y1="10.424105"
- x2="169.47711"
- y2="8.1183796" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30124"
- id="linearGradient22895"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.728189,0,0,1.727271,237.88848,243.63713)"
- x1="169.41847"
- y1="10.306772"
- x2="169.4877"
- y2="7.9604731" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22897"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-215.00008,249.00001)"
- x1="145.00008"
- y1="11.99999"
- x2="160.31258"
- y2="19.34374" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22899"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-215.00008,249.00001)"
- x1="149.00008"
- y1="10.924165"
- x2="171.37508"
- y2="19.12499" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient32842"
- id="linearGradient22901"
- gradientUnits="userSpaceOnUse"
- x1="-68.25"
- y1="263"
- x2="-56"
- y2="265.53439" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22903"
- gradientUnits="userSpaceOnUse"
- x1="-66"
- y1="264"
- x2="-57"
- y2="264.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient32998"
- id="linearGradient22905"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.728189,0,0,1.727271,-357.88848,243.63713)"
- x1="176.42079"
- y1="12.946938"
- x2="169.47711"
- y2="12.36799" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient22933"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(15.081669,359)"
- x1="245.63066"
- y1="106.28436"
- x2="245.80791"
- y2="94.440376" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22935"
- gradientUnits="userSpaceOnUse"
- x1="268"
- y1="462"
- x2="256"
- y2="459" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient22937"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(12.999999,359)"
- x1="247"
- y1="99"
- x2="247"
- y2="94" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22939"
- gradientUnits="userSpaceOnUse"
- x1="263.5"
- y1="455.25"
- x2="263.5"
- y2="460.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22941"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.6,-5,182.8)"
- x1="264"
- y1="452"
- x2="264"
- y2="460.6622" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22970"
- x1="-197.84375"
- y1="399.90625"
- x2="-191"
- y2="409"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient19625"
- id="linearGradient23241"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-6,0)"
- x1="480.09564"
- y1="163.08553"
- x2="476.76578"
- y2="162.94037" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient23243"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(342.00029,383.00889)"
- x1="123.36729"
- y1="-219.24783"
- x2="134.30893"
- y2="-218.00888" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient12678"
- id="radialGradient23245"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0982561,0,0,1.2662999,-45.858153,-42.45126)"
- cx="470.15939"
- cy="164.46814"
- fx="470.15939"
- fy="164.46814"
- r="3.500145" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient23247"
- gradientUnits="userSpaceOnUse"
- x1="128.7561"
- y1="115.77483"
- x2="132.35237"
- y2="118.69846" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient23250"
- gradientUnits="userSpaceOnUse"
- x1="127.30917"
- y1="111.48133"
- x2="138.30522"
- y2="124.69373" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient23445"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-6,0)"
- x1="480.09564"
- y1="163.08553"
- x2="475.50031"
- y2="162.92206" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient23447"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(342.00029,383.00889)"
- x1="123.36729"
- y1="-219.24783"
- x2="134.30893"
- y2="-218.00888" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient23531"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.728189,0,0,1.727271,-142.8884,-5.3628832)"
- x1="172.37032"
- y1="12.147777"
- x2="175.38158"
- y2="15.699567" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient23533"
- gradientUnits="userSpaceOnUse"
- x1="155.82454"
- y1="16.845156"
- x2="158.41653"
- y2="19.99999" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient40843"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.727201,9.075096e-6,0,1.728246,-147.7149,-10.37485)"
- x1="171.03941"
- y1="11.121979"
- x2="175.33569"
- y2="16.202652" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient40845"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.728189,0,0,1.727271,-142.8884,-5.3628832)"
- x1="172.18394"
- y1="11.912162"
- x2="176.46956"
- y2="16.427906" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40847"
- gradientUnits="userSpaceOnUse"
- x1="156.00008"
- y1="16.99999"
- x2="159.00008"
- y2="19.99999" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient40965"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-20,14)"
- x1="62.107086"
- y1="223.54628"
- x2="96.812675"
- y2="258.38593" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient32842"
- id="linearGradient40967"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-21,0)"
- x1="79.04213"
- y1="253.5"
- x2="60.155113"
- y2="234.7775" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient24098"
- x1="208.25"
- y1="-133.89581"
- x2="204.01923"
- y2="-111.15749"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient23510"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1000194,0,0,1.0998287,-4.3008215,-8.6726798)"
- x1="47.655102"
- y1="93.805557"
- x2="59.057678"
- y2="105.27895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient23512"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.728189,0,0,1.727271,-142.53857,-4.802156)"
- x1="110.16959"
- y1="57.061836"
- x2="117.55341"
- y2="64.995972" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient23514"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1000194,0,0,1.0998287,-4.3010161,-8.6726854)"
- x1="47.612946"
- y1="93.555946"
- x2="54.252415"
- y2="100.44998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient23550"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(1,0.01738631)"
- x1="468.07968"
- y1="275.27036"
- x2="510"
- y2="266.99997" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18105"
- id="linearGradient23555"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(1,3.959006e-5)"
- x1="492.95264"
- y1="267.42996"
- x2="496.73859"
- y2="270.36874" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient23581"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9993234,0,0,1.0050357,404.07104,216.722)"
- x1="116.75796"
- y1="52.264809"
- x2="103.18628"
- y2="55.747272" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient21327"
- id="linearGradient23585"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(1,-1.0000037)"
- x1="500.71924"
- y1="270.24997"
- x2="477"
- y2="274" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient32842"
- id="radialGradient23610"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5274943,0,0,0.7696585,194.81546,86.715119)"
- cx="412.10059"
- cy="375.96332"
- fx="412.10059"
- fy="375.96332"
- r="4.4262571" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24343"
- id="radialGradient23612"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0009003,-1.5278593,1.1592123,0.7594114,-59.938837,957.7287)"
- cx="409.55594"
- cy="52.367992"
- fx="409.55594"
- fy="52.367992"
- r="3.8798895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient23562"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1004102,0,0,1.0993832,461.68129,182.37748)"
- x1="47.612946"
- y1="93.555946"
- x2="56.524509"
- y2="101.25028" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient23565"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.728803,0,0,1.7265713,323.39462,186.24644)"
- x1="115.45872"
- y1="58.869785"
- x2="106.20376"
- y2="58.354706" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient22847"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.728803,0,0,1.7265713,347.39462,166.24644)"
- x1="110.54202"
- y1="56.645538"
- x2="115.53827"
- y2="63.567348" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22849"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.2445337,0,0,1.5876961,523.20711,115.4619)"
- x1="47.655102"
- y1="93.805557"
- x2="59.057678"
- y2="105.27895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22851"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1004102,0,0,1.0993832,503.28129,157.47747)"
- x1="29.506693"
- y1="100.66651"
- x2="34.276955"
- y2="105.98901" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24052"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="117.12428"
- y2="61.720783" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24054"
- gradientUnits="userSpaceOnUse"
- x1="-56.5"
- y1="340.32199"
- x2="-56.5"
- y2="348" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24056"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,13)"
- x1="-56.8125"
- y1="329.06256"
- x2="-47.214466"
- y2="329.26965" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient24066"
- x1="202.5"
- y1="143.84116"
- x2="202.5"
- y2="132.60213"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-259,202)" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="radialGradient23738"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.050372,0,0,1.050372,-3.551238,-0.730396)"
- cx="70.5"
- cy="14.5"
- fx="70.5"
- fy="14.5"
- r="1.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient23750"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.172144,59.49999,53.45766)"
- x1="445.5"
- y1="148.90862"
- x2="433.5"
- y2="148.69533" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient23752"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6499984,0,0,0.5439483,434.02514,137.87435)"
- x1="113.71248"
- y1="158.24995"
- x2="91.499992"
- y2="158.24994" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient23754"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0052083,0,0,0.5057472,778.49218,365.83334)"
- x1="-285.65732"
- y1="-274.23453"
- x2="-279.44821"
- y2="-268.04858" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient23914"
- gradientUnits="userSpaceOnUse"
- x1="29.200638"
- y1="160.18758"
- x2="32.928555"
- y2="164.13913" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient23916"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.02887268,-1.2550276,0.795821,0.01830762,8.763469,168.20647)"
- cx="11.708446"
- cy="81.275032"
- fx="11.708446"
- fy="81.275032"
- r="5" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient23918"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.01269957,-0.9297674,1.1086869,0.01514236,-16.51473,165.70609)"
- cx="4.7455525"
- cy="82.433929"
- fx="4.7455525"
- fy="82.433929"
- r="5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient24460"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(383,-37.999994)"
- x1="-80"
- y1="151"
- x2="-80"
- y2="152.24998" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask24456">
- <rect
- y="108"
- x="299"
- height="17"
- width="7"
- id="rect24458"
- style="fill:url(#linearGradient24460);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- mask="none" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient24470"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(360,-142.95536)"
- x1="-80"
- y1="151"
- x2="-80"
- y2="152.24998" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask24466">
- <rect
- transform="scale(1,-1)"
- style="fill:url(#linearGradient24470);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect24468"
- width="7"
- height="9"
- x="276"
- y="4.0625" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient23971"
- gradientUnits="userSpaceOnUse"
- x1="154.24324"
- y1="-11.628862"
- x2="134.08138"
- y2="-22.846634" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient23973"
- gradientUnits="userSpaceOnUse"
- x1="134.12642"
- y1="-21.522242"
- x2="132.29695"
- y2="-23.945318" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient23975"
- gradientUnits="userSpaceOnUse"
- x1="134.6615"
- y1="-21.3074"
- x2="131.69801"
- y2="-24.343456" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient24099"
- x1="137.5"
- y1="-18"
- x2="135.25"
- y2="-21"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient24539"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.728189,0,0,1.727271,-142.53857,-4.802156)"
- x1="107.39532"
- y1="58.065113"
- x2="127.70434"
- y2="58.065113" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24541"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.1000194,0,0,1.0998287,110.29549,-8.6726854)"
- x1="30.389694"
- y1="95.008034"
- x2="65.52562"
- y2="93.69249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient24543"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-6,0)"
- x1="483.00034"
- y1="163"
- x2="476.68781"
- y2="162.85956" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient24545"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(342.00029,383.00889)"
- x1="123.36729"
- y1="-219.24783"
- x2="134.30893"
- y2="-218.00888" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient24547"
- gradientUnits="userSpaceOnUse"
- x1="475.00034"
- y1="155"
- x2="469.75034"
- y2="155" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient24549"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-6,-6e-5)"
- x1="442.81525"
- y1="290.49384"
- x2="436.5"
- y2="290.5249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18105"
- id="linearGradient24551"
- gradientUnits="userSpaceOnUse"
- x1="445.99902"
- y1="288.5"
- x2="407.3793"
- y2="288.5" />
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath24168">
- <path
- style="fill:#808080;fill-rule:evenodd;stroke:none"
- d="m 134.27489,222.11125 c -3.9249,-6.46418 -7.61892,6.46419 -11.54381,0 l 0,0 -1.61614,0 0,8.77283 14.77608,0 0,-8.77283 -1.61613,0 z"
- id="path24170"
- sodipodi:nodetypes="cccccccc" />
- </clipPath>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient24112"
- gradientUnits="userSpaceOnUse"
- x1="124.40742"
- y1="111.98244"
- x2="135.36497"
- y2="120.87388" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24114"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient24116"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,1)"
- x1="302.84085"
- y1="243.23151"
- x2="308.82889"
- y2="244.70323" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24118"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6879084,0,0,0.6879446,216.19282,166.82605)"
- x1="121.7408"
- y1="115.90587"
- x2="130.01318"
- y2="116.60553" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient24121"
- gradientUnits="userSpaceOnUse"
- x1="135.698"
- y1="122.92034"
- x2="129.70906"
- y2="117.15551" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24123"
- gradientUnits="userSpaceOnUse"
- x1="125.81818"
- y1="111.81818"
- x2="143.88347"
- y2="129.27184" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient24189"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-93.937441,254)"
- x1="162.61801"
- y1="4.5569806"
- x2="180.11391"
- y2="23.410421" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24192"
- gradientUnits="userSpaceOnUse"
- x1="167.43744"
- y1="23.749996"
- x2="175.06059"
- y2="32.144764"
- gradientTransform="translate(-94.937441,240)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient24209"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-93.937441,254)"
- x1="166.86487"
- y1="12.306217"
- x2="173.93744"
- y2="19" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24268"
- gradientUnits="userSpaceOnUse"
- x1="186.74992"
- y1="10.795519"
- x2="189.24992"
- y2="9.0189686"
- gradientTransform="matrix(1,0,0,-0.985055,75.000075,275.63418)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient24272"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2000005,0,0,1.1817719,-50.700005,86.809844)"
- x1="258.08322"
- y1="148.24248"
- x2="264.99994"
- y2="154.24899" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient24277"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2000005,0,0,1.1817719,-50.700005,86.809844)"
- x1="258.08322"
- y1="148.24248"
- x2="264.99994"
- y2="154.24899" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient21327"
- id="linearGradient24395"
- x1="-27.5"
- y1="268.76776"
- x2="-39.875"
- y2="277.4375"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15893"
- id="linearGradient41127"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,594,-42.40625)"
- x1="409.45645"
- y1="52.77837"
- x2="402.30673"
- y2="55.86327" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27957"
- id="linearGradient41129"
- gradientUnits="userSpaceOnUse"
- x1="180.20316"
- y1="8.0551176"
- x2="192.75177"
- y2="12.942369" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient41170"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.9846154,-138.98388,3.9846124)"
- x1="266.93381"
- y1="199.60616"
- x2="291.45029"
- y2="230.76723" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient41172"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.01612278,0)"
- x1="268.21783"
- y1="200.66605"
- x2="284.9375"
- y2="224.1875" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="radialGradient41174"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.25,0,0,1.375,-66.483877,-73.5)"
- cx="269.99997"
- cy="197"
- fx="269.99997"
- fy="197"
- r="2" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42069"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.9846154,-138.98388,3.9846124)"
- x1="266.93381"
- y1="199.60616"
- x2="291.45029"
- y2="230.76723" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="radialGradient42091"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.25,0,0,1.375,-66.483877,-73.5)"
- cx="269.99997"
- cy="197"
- fx="269.99997"
- fy="197"
- r="2" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient42093"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.01612278,0)"
- x1="276.39999"
- y1="215.3125"
- x2="265.70886"
- y2="196.576" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="radialGradient42115"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.25,0,0,1.375,-66.483877,-73.5)"
- cx="269.99997"
- cy="197"
- fx="269.99997"
- fy="197"
- r="2" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42121"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(60,-342)"
- x1="206"
- y1="535"
- x2="212"
- y2="549" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42155"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.9846154,-138.98388,3.9846124)"
- x1="263"
- y1="193.93752"
- x2="296.25"
- y2="239.89455" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42290"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.01612278,0)"
- x1="265.98389"
- y1="195"
- x2="290.98389"
- y2="232" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="radialGradient42292"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.25,0,0,1.375,-66.483877,-73.5)"
- cx="269.99997"
- cy="197"
- fx="269.99997"
- fy="197"
- r="2" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient40722"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9819031,0,0,0.9481466,-88.271503,-83.584533)"
- x1="1.6577729"
- y1="253.01927"
- x2="-57.772419"
- y2="253.62515" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40724"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.977157,0,0,0.9835482,0.06815071,100.43848)"
- x1="107.84375"
- y1="57.374996"
- x2="116.99999"
- y2="60.125" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient40734"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,13)"
- x1="241.17908"
- y1="214.40446"
- x2="279.89563"
- y2="254.94975" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient40736"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6025789,0,0,0.668336,263.48819,85.675422)"
- x1="49.543404"
- y1="230.81766"
- x2="73.932747"
- y2="247.27646" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40738"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9120445,0,0,1,25.749745,8.9261515)"
- x1="305.12527"
- y1="239.03134"
- x2="308.97327"
- y2="242" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient40740"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.584271,0,0,0.661005,267.80323,78.438648)"
- x1="51.682816"
- y1="229.19724"
- x2="73.932762"
- y2="247.35141" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40742"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9103441,0,0,0.989031,29.299938,2.5312404)"
- x1="305.12527"
- y1="239.03134"
- x2="307.25021"
- y2="241.62509" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient40758"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(15.997359,-17.993456)"
- x1="199.4335"
- y1="294.81082"
- x2="196.00264"
- y2="259.99347" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40760"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.7501745,0,0,1.0021005,51.339144,-0.5240716)"
- x1="207.19595"
- y1="249.22464"
- x2="207.81319"
- y2="250.25" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40762"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.7501745,0,0,1.0021005,59.339161,-0.5240716)"
- x1="207.19595"
- y1="249.22464"
- x2="207.81319"
- y2="250.25" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient40788"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.043478,0,0,0.956667,-7.152175,20.92167)"
- x1="146.51619"
- y1="217.52046"
- x2="174.56255"
- y2="252.52081" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient40790"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(81.000002,13.499998)"
- x1="87.765625"
- y1="242.39062"
- x2="96"
- y2="251.40294" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18056"
- id="linearGradient40792"
- gradientUnits="userSpaceOnUse"
- x1="170.42908"
- y1="237.25"
- x2="170.71698"
- y2="249.15927" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient40794"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,10)"
- x1="168.5625"
- y1="249.55817"
- x2="168.5"
- y2="240.10249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40545"
- gradientUnits="userSpaceOnUse"
- x1="279.38629"
- y1="-16.946415"
- x2="293.80472"
- y2="-2.5475447" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40547"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9230687,0,0,0.9230801,261.38476,-234.15464)"
- x1="43.921535"
- y1="261.52924"
- x2="29.429007"
- y2="243.98439" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient23775"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.9230769,0,0,-0.9258123,59.615385,471.81593)"
- x1="-0.71355486"
- y1="209.97131"
- x2="37.5"
- y2="252.16492" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient23777"
- gradientUnits="userSpaceOnUse"
- x1="72.698921"
- y1="599.20789"
- x2="77.111115"
- y2="604.11108" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient23351"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.923955,0,0,1,82.8792,399.00004)"
- x1="-7.445384"
- y1="204.24995"
- x2="33.682159"
- y2="250.99995" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient23353"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(80.02752,483.00004)"
- x1="29.972469"
- y1="164"
- x2="36.972481"
- y2="168.00002" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient23355"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-224,-1290)"
- x1="113"
- y1="646"
- x2="111"
- y2="644" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient23357"
- gradientUnits="userSpaceOnUse"
- x1="113"
- y1="646"
- x2="111.5"
- y2="644.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient23599"
- x1="191"
- y1="158.72728"
- x2="196.59441"
- y2="167.67831"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.89375,0,0,0.89375,20.29375,17.10625)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient22692"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.6363637,0.6315788,0,-191.68403,523.2955)"
- x1="150.5"
- y1="647.75"
- x2="150.53571"
- y2="641.54156" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient22695"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.6363637,0,0,-0.6315788,314.2955,837.68414)"
- x1="150.5"
- y1="647.75"
- x2="150.53571"
- y2="641.54156" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient22698"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.6363637,-0.6315788,0,628.68411,331.70458)"
- x1="150.5"
- y1="647.75"
- x2="150.53571"
- y2="641.54156" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient22701"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6363637,0,0,0.6315788,122.70458,17.31597)"
- x1="150.5"
- y1="647.75"
- x2="150.53571"
- y2="641.54156" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient22704"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.6363637,0,0,-0.6315788,311.11368,825.05254)"
- x1="145.53571"
- y1="627.08325"
- x2="145.53571"
- y2="623.12494" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient22707"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.6363637,0.6315788,0,-179.05245,520.11368)"
- x1="145.53571"
- y1="627.08325"
- x2="145.53571"
- y2="623.12494" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient22711"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.6363637,-0.6315788,0,616.05253,334.8864)"
- x1="145.53571"
- y1="627.08325"
- x2="145.53571"
- y2="623.12494" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient22715"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6363637,0,0,0.6315788,125.8864,29.94755)"
- x1="145.53571"
- y1="627.08325"
- x2="145.53571"
- y2="623.12494" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23132"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.6357342,-0.636363,0,628.0905,358.45254)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23134"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.636363,0,0,-0.6357342,320.09081,851.14655)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23136"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.6357342,0.636363,0,-173.09051,543.4512)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23138"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.636363,0,0,0.6357342,134.90918,50.757191)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23140"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.636363,0,0,0.6357342,131.72737,31.593709)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23142"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.6357342,-0.636363,0,640.81777,348.82507)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23144"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.636363,0,0,-0.6357342,131.72737,857.41243)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23147"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.6357342,0.636363,0,-185.81777,540.18107)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23177"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,-1,0,850,297)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23179"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,-1,366,1072)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23181"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,1,0,-409,588)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23183"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(75,-187)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23185"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(70,-207)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23187"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,-1,0,870,292)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23189"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,-1,70,1092)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23191"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,1,0,-429,593)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23231"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.8181822,0.8181823,0,-304.90941,555.63645)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23235"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8181823,0,0,-0.8181822,103.36356,963.90937)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23239"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.8181822,-0.8181823,0,757.9094,309.36361)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23244"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8181823,0,0,0.8181822,103.36356,-98.909308)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23248"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8181823,0,0,0.8181822,107.45448,-82.54566)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23251"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.8181822,0.8181823,0,-288.54575,551.54554)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23254"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.8181823,0,0,-0.8181822,345.54553,947.54573)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23257"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.8181822,-0.8181823,0,741.54576,313.45452)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23563"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.8181822,-0.8181823,0,741.54576,313.45452)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23566"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.8181823,0,0,-0.8181822,345.54553,947.54573)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23568"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.8181822,0.8181823,0,-288.54575,551.54554)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23570"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8181823,0,0,0.8181822,107.45448,-82.54566)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23572"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8181823,0,0,0.8181822,103.36356,-98.909308)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23574"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.8181822,-0.8181823,0,757.9094,309.36361)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23576"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8181823,0,0,-0.8181822,103.36356,963.90937)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23578"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.8181822,0.8181823,0,-304.90941,555.63645)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23580"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,-1,0,850,297)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23582"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,-1,366,1072)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23587"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,1,0,-409,588)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23589"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(75,-187)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23591"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(70,-207)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23593"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,-1,0,870,292)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23597"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,-1,70,1092)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23600"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,1,0,-429,593)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23602"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6363637,0,0,0.6315788,125.8864,29.94755)"
- x1="145.53571"
- y1="627.08325"
- x2="145.53571"
- y2="623.12494" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23606"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.6363637,-0.6315788,0,616.05253,334.8864)"
- x1="145.53571"
- y1="627.08325"
- x2="145.53571"
- y2="623.12494" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23608"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.6363637,0.6315788,0,-179.05245,520.11368)"
- x1="145.53571"
- y1="627.08325"
- x2="145.53571"
- y2="623.12494" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23610"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.6363637,0,0,-0.6315788,311.11368,825.05254)"
- x1="145.53571"
- y1="627.08325"
- x2="145.53571"
- y2="623.12494" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23612"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6363637,0,0,0.6315788,122.70458,17.31597)"
- x1="150.5"
- y1="647.75"
- x2="150.53571"
- y2="641.54156" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23616"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.6363637,-0.6315788,0,628.68411,331.70458)"
- x1="150.5"
- y1="647.75"
- x2="150.53571"
- y2="641.54156" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23618"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.6363637,0,0,-0.6315788,314.2955,837.68414)"
- x1="150.5"
- y1="647.75"
- x2="150.53571"
- y2="641.54156" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23620"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.6363637,0.6315788,0,-191.68403,523.2955)"
- x1="150.5"
- y1="647.75"
- x2="150.53571"
- y2="641.54156" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23622"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.6357342,-0.636363,0,628.0905,358.45254)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23624"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.636363,0,0,-0.6357342,320.09081,851.14655)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23626"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.6357342,0.636363,0,-173.09051,543.4512)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20324"
- id="linearGradient23628"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.636363,0,0,0.6357342,134.90918,50.757191)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23630"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.636363,0,0,0.6357342,131.72737,31.593709)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23632"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.6357342,-0.636363,0,640.81777,348.82507)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23635"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.636363,0,0,-0.6357342,131.72737,857.41243)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37623"
- id="linearGradient23637"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.6357342,0.636363,0,-185.81777,540.18107)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23797"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.8181822,-0.8181823,0,741.54576,313.45452)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23799"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.8181823,0,0,-0.8181822,345.54553,947.54573)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23801"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.8181822,0.8181823,0,-288.54575,551.54554)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23803"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8181823,0,0,0.8181822,107.45448,-82.54566)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23805"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8181823,0,0,0.8181822,103.36356,-98.909308)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23807"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.8181822,-0.8181823,0,757.9094,309.36361)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23809"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8181823,0,0,-0.8181822,103.36356,963.90937)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23811"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.8181822,0.8181823,0,-304.90941,555.63645)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23813"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,-1,0,850,297)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23815"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,-1,366,1072)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23817"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,1,0,-409,588)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23819"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(75,-187)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23821"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(70,-207)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23823"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,-1,0,870,292)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23825"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,-1,70,1092)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23827"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,1,0,-429,593)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23829"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6363637,0,0,0.6315788,125.8864,29.94755)"
- x1="145.53571"
- y1="627.08325"
- x2="145.53571"
- y2="623.12494" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23831"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.6363637,-0.6315788,0,616.05253,334.8864)"
- x1="145.53571"
- y1="627.08325"
- x2="145.53571"
- y2="623.12494" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23833"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.6363637,0.6315788,0,-179.05245,520.11368)"
- x1="145.53571"
- y1="627.08325"
- x2="145.53571"
- y2="623.12494" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23835"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.6363637,0,0,-0.6315788,311.11368,825.05254)"
- x1="145.53571"
- y1="627.08325"
- x2="145.53571"
- y2="623.12494" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23837"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6363637,0,0,0.6315788,122.70458,17.31597)"
- x1="150.5"
- y1="647.75"
- x2="150.53571"
- y2="641.54156" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23839"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.6363637,-0.6315788,0,628.68411,331.70458)"
- x1="150.5"
- y1="647.75"
- x2="150.53571"
- y2="641.54156" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23841"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.6363637,0,0,-0.6315788,314.2955,837.68414)"
- x1="150.5"
- y1="647.75"
- x2="150.53571"
- y2="641.54156" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23843"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.6363637,0.6315788,0,-191.68403,523.2955)"
- x1="150.5"
- y1="647.75"
- x2="150.53571"
- y2="641.54156" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23845"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.6357342,-0.636363,0,628.0905,358.45254)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23847"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.636363,0,0,-0.6357342,320.09081,851.14655)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23849"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.6357342,0.636363,0,-173.09051,543.4512)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24632"
- id="linearGradient23851"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.636363,0,0,0.6357342,134.90918,50.757191)"
- x1="145.5"
- y1="627.5"
- x2="145.5"
- y2="623.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23853"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.636363,0,0,0.6357342,131.72737,31.593709)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23856"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,0.6357342,-0.636363,0,640.81777,348.82507)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23858"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.636363,0,0,-0.6357342,131.72737,857.41243)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24642"
- id="linearGradient23860"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-0.6357342,0.636363,0,-185.81777,540.18107)"
- x1="150.5"
- y1="647.75"
- x2="150.5"
- y2="642" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42685"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-52.983883,-129)"
- x1="258"
- y1="388"
- x2="273"
- y2="388" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42687"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-48.983883,-126)"
- x1="259.75"
- y1="388"
- x2="273"
- y2="388" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42689"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-54.000005,-120)"
- x1="258.52756"
- y1="388"
- x2="279"
- y2="388" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42691"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-46.000005,-117)"
- x1="257.75"
- y1="388"
- x2="272"
- y2="388" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23705"
- id="linearGradient22892"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(220,-20.00667)"
- x1="29.4034"
- y1="100.99999"
- x2="34.095703"
- y2="101.15624" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="linearGradient22917"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2,0,0,0.7333333,-467,262.53823)"
- x1="250.5"
- y1="90.253998"
- x2="250.5"
- y2="95.252274" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient22922"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.4564959,0.09949388,-0.06177986,1.3917691,-283.96093,-143.81911)"
- cx="135.14931"
- cy="332.10181"
- fx="135.14931"
- fy="332.10181"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient22928"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8750002,0,0,0.83767,7.3124969,247.00379)"
- x1="27.166666"
- y1="90.504448"
- x2="35.166668"
- y2="101.14744" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient22950"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.53241"
- cy="500.20956"
- fx="75.53241"
- fy="500.20956"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient22952"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6595012,0.7907318,-0.8990144,0.7498135,144.69896,-187.59854)"
- cx="262.67139"
- cy="74.072273"
- fx="262.67139"
- fy="74.072273"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24168"
- id="linearGradient22954"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.75,0,0,0.7516675,227.625,0.9640803)"
- x1="20.125"
- y1="88.642494"
- x2="34.125"
- y2="104.89799" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient23727"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.3687636,0.09935874,-0.05957343,1.3898788,-272.60513,-143.17133)"
- cx="140.33667"
- cy="333.05716"
- fx="140.33667"
- fy="333.05716"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37925"
- id="linearGradient23890"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(220,-20.00667)"
- x1="29.4034"
- y1="100.99999"
- x2="34.095703"
- y2="101.15624" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient22562"
- id="linearGradient23892"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.75,0,0,0.7516675,227.625,0.9640803)"
- x1="20.125"
- y1="88.642494"
- x2="34.125"
- y2="104.89799" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23906"
- id="radialGradient23894"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0553103,1.0606182,-1.2516598,1.280294,67.321819,-297.60493)"
- cx="262.07156"
- cy="74.306007"
- fx="262.07156"
- fy="74.306007"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient23896"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8750002,0,0,0.83767,7.3124969,247.00379)"
- x1="27.166666"
- y1="90.504448"
- x2="35.166668"
- y2="101.14744" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14232"
- id="radialGradient23898"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.53241"
- cy="500.20956"
- fx="75.53241"
- fy="500.20956"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient23900"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.4564959,0.09949388,-0.06177986,1.3917691,-283.96093,-143.81911)"
- cx="135.14931"
- cy="332.10181"
- fx="135.14931"
- fy="332.10181"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="linearGradient23902"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2,0,0,0.7333333,-467,262.53823)"
- x1="250.5"
- y1="90.253998"
- x2="250.5"
- y2="95.252274" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient23904"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.3687636,0.09935874,-0.05957343,1.3898788,-272.60513,-143.17133)"
- cx="140.33667"
- cy="333.05716"
- fx="140.33667"
- fy="333.05716"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient42459"
- id="linearGradient24090"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(220,-20.00667)"
- x1="29.4034"
- y1="100.99999"
- x2="34.095703"
- y2="101.15624" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient22562"
- id="linearGradient24092"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.75,0,0,0.7516675,227.625,0.9640803)"
- x1="20.125"
- y1="88.642494"
- x2="34.125"
- y2="104.89799" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient24094"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6595012,0.7907318,-0.8990144,0.7498135,144.69896,-187.59854)"
- cx="263.21707"
- cy="74.441246"
- fx="263.21707"
- fy="74.441246"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24096"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8750002,0,0,0.83767,7.3124969,247.00379)"
- x1="27.166666"
- y1="90.504448"
- x2="35.166668"
- y2="101.14744" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient24098"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.53241"
- cy="500.20956"
- fx="75.53241"
- fy="500.20956"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient24100"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.4564959,0.09949388,-0.06177986,1.3917691,-283.96093,-143.81911)"
- cx="135.14931"
- cy="332.10181"
- fx="135.14931"
- fy="332.10181"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="linearGradient24102"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2,0,0,0.7333333,-467,262.53823)"
- x1="250.5"
- y1="90.253998"
- x2="250.5"
- y2="95.252274" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient24104"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.3687636,0.09935874,-0.05957343,1.3898788,-272.60513,-143.17133)"
- cx="140.33667"
- cy="333.05716"
- fx="140.33667"
- fy="333.05716"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24317"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.831045,0,0,0.776773,36.146465,141.05131)"
- x1="71.762154"
- y1="239.83469"
- x2="76.956871"
- y2="252.05081" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24319"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.831045,0,0,0.776773,36.165705,133.02478)"
- x1="72.340698"
- y1="243.03008"
- x2="73.234337"
- y2="246.81651" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24321"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.831045,0,0,0.776773,36.165705,133.02478)"
- x1="66.954422"
- y1="240.03282"
- x2="68.458534"
- y2="246.96069" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24362"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-335,238.99245)"
- x1="426.12415"
- y1="179.12074"
- x2="425"
- y2="179.12285" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24143"
- id="linearGradient24367"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-149,133.99245)"
- x1="244.37868"
- y1="285.00754"
- x2="237.75459"
- y2="266.34406" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24695"
- id="linearGradient24374"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.043478,0,0,0.956667,-30.15217,152.41412)"
- x1="120.97597"
- y1="281.26645"
- x2="116.37123"
- y2="260.21841" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient24436"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,-1,-150.99992,596.00357)"
- x1="199.87271"
- y1="272.29477"
- x2="212.22493"
- y2="287.50357" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24679"
- id="linearGradient25073"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.043478,0,0,0.956667,-30.15217,152.41412)"
- x1="121.79003"
- y1="283.00519"
- x2="114.66669"
- y2="250.69945" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24671"
- id="linearGradient25075"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-149,133.99245)"
- x1="243.25"
- y1="283.94504"
- x2="235"
- y2="253.00755" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient25077"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-335,238.99245)"
- x1="426.12415"
- y1="179.12074"
- x2="425"
- y2="179.12285" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24679"
- id="linearGradient42055"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.043478,0,0,0.956667,-30.15217,152.41412)"
- x1="120.94298"
- y1="281.27435"
- x2="114.66669"
- y2="250.69945" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24671"
- id="linearGradient42057"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-149,133.99245)"
- x1="243.25"
- y1="283.94504"
- x2="235"
- y2="253.00755" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42059"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-335,238.99245)"
- x1="426.12415"
- y1="179.12074"
- x2="425"
- y2="179.12285" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24101"
- id="linearGradient24132"
- gradientUnits="userSpaceOnUse"
- x1="445.77841"
- y1="113.24564"
- x2="426.11459"
- y2="84.777061" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient24599"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1489145,-0.69297,0.4772363,0.7912359,-113.08929,303.20064)"
- cx="269.71231"
- cy="237.2262"
- fx="269.71231"
- fy="237.2262"
- r="7.03125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient24632"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.7236207,-0.7167103,1.004637,1.0143218,-131.254,253.93955)"
- cx="262.83905"
- cy="245.91792"
- fx="262.83905"
- fy="245.91792"
- r="7.03125" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient31456"
- id="linearGradient24797"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9897912,0,0,0.9897912,2.2765631,2.9503441)"
- x1="311.3967"
- y1="310.77368"
- x2="309.02371"
- y2="308.51169" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24820"
- x1="311.37668"
- y1="311.88205"
- x2="307.5"
- y2="308.21875"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20036"
- id="radialGradient43962"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4011721,0.3766097,-0.7099042,0.7562044,179.21454,-58.566632)"
- cx="207.04807"
- cy="78.473343"
- fx="207.04807"
- fy="78.473343"
- r="3.5" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20036"
- id="radialGradient43964"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4543499,0.4687811,-0.6244606,0.6052369,161.562,-65.729731)"
- cx="206.39249"
- cy="78.443413"
- fx="206.39249"
- fy="78.443413"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient62436"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1,0)"
- x1="248.69196"
- y1="279.72827"
- x2="269.3085"
- y2="303.10999" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient62558"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,1,0,-33.03632,32.03632)"
- x1="289.61554"
- y1="320.55179"
- x2="250.22783"
- y2="282.28745" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient62560"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,1,0,59,638)"
- x1="354.50601"
- y1="283.61511"
- x2="327.92044"
- y2="300.96124" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient25381"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1,21)"
- x1="342"
- y1="288.5"
- x2="344.5"
- y2="288.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient25383"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,-1,0,638,-40)"
- x1="342"
- y1="288.5"
- x2="344.5"
- y2="288.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient25385"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,-1,699,599)"
- x1="342"
- y1="288.5"
- x2="344.5"
- y2="288.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient25387"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,1,0,60,660)"
- x1="342"
- y1="288.5"
- x2="344.5"
- y2="288.5" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask25369">
- <g
- id="g25371"
- transform="translate(-21,-21)">
- <path
- style="fill:url(#linearGradient25381);fill-rule:evenodd;stroke:none"
- d="m 341,302 8,8 -8,8 0,-16 z"
- id="path25373"
- sodipodi:nodetypes="cccc"
- inkscape:transform-center-x="4" />
- <path
- inkscape:transform-center-y="-4"
- sodipodi:nodetypes="cccc"
- id="path25375"
- d="m 357,302 -8,8 -8,-8 16,0 z"
- style="fill:url(#linearGradient25383);fill-rule:evenodd;stroke:none" />
- <path
- inkscape:transform-center-x="-4"
- sodipodi:nodetypes="cccc"
- id="path25377"
- d="m 357,318 -8,-8 8,-8 0,16 z"
- style="fill:url(#linearGradient25385);fill-rule:evenodd;stroke:none" />
- <path
- inkscape:transform-center-y="4"
- sodipodi:nodetypes="cccc"
- id="path25379"
- d="m 341,318 8,-8 8,8 -16,0 z"
- style="fill:url(#linearGradient25387);fill-rule:evenodd;stroke:none" />
- </g>
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient25573"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1,21)"
- x1="342"
- y1="288.5"
- x2="344.01321"
- y2="288.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient25575"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,-1,0,638,-40)"
- x1="342"
- y1="288.5"
- x2="344.5"
- y2="288.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient25577"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,-1,699,599)"
- x1="342"
- y1="288.5"
- x2="344.5"
- y2="288.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient25579"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,1,0,60,660)"
- x1="342"
- y1="288.5"
- x2="344.5"
- y2="288.5" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask25561">
- <g
- transform="translate(-21,-21)"
- id="g25563">
- <path
- inkscape:transform-center-x="4"
- sodipodi:nodetypes="cccc"
- id="path25565"
- d="m 341,302 8,8 -8,8 0,-16 z"
- style="fill:url(#linearGradient25573);fill-rule:evenodd;stroke:none" />
- <path
- style="fill:url(#linearGradient25575);fill-rule:evenodd;stroke:none"
- d="m 357,302 -8,8 -8,-8 16,0 z"
- id="path25567"
- sodipodi:nodetypes="cccc"
- inkscape:transform-center-y="-4" />
- <path
- style="fill:url(#linearGradient25577);fill-rule:evenodd;stroke:none"
- d="m 357,318 -8,-8 8,-8 0,16 z"
- id="path25569"
- sodipodi:nodetypes="cccc"
- inkscape:transform-center-x="-4" />
- <path
- style="fill:url(#linearGradient25579);fill-rule:evenodd;stroke:none"
- d="m 341,318 8,-8 8,8 -16,0 z"
- id="path25571"
- sodipodi:nodetypes="cccc"
- inkscape:transform-center-y="4" />
- </g>
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient25872"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,513.5,328.50451)"
- x1="253.78497"
- y1="3.6831069"
- x2="278.25537"
- y2="30.023426" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334"
- id="linearGradient25874"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(670,111)"
- x1="87"
- y1="241.125"
- x2="93.0625"
- y2="249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient25886"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,673.5,170.50451)"
- x1="243.92192"
- y1="-2.6686089"
- x2="275.10107"
- y2="26.600887" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334"
- id="linearGradient25888"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(830,-47)"
- x1="87"
- y1="241.125"
- x2="93.0625"
- y2="249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13998"
- id="linearGradient25890"
- gradientUnits="userSpaceOnUse"
- x1="13.5"
- y1="57.827747"
- x2="11.472005"
- y2="53.875874" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13998"
- id="linearGradient25892"
- gradientUnits="userSpaceOnUse"
- x1="-18.600719"
- y1="501.96539"
- x2="-26.642899"
- y2="487.60382" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient25894"
- gradientUnits="userSpaceOnUse"
- x1="15.027407"
- y1="60.637787"
- x2="13.5"
- y2="57.750687" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient25897"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.03018343,0.1408617)"
- x1="-32.067383"
- y1="490.70178"
- x2="-22.25"
- y2="500" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient25899"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-72.000001)"
- x1="753.39417"
- y1="299.83005"
- x2="758"
- y2="305" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24679"
- id="linearGradient25927"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.043478,0,0,0.956667,-30.15217,152.41412)"
- x1="121.79003"
- y1="283.00519"
- x2="114.66669"
- y2="250.69945" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24671"
- id="linearGradient25929"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-149,133.99245)"
- x1="243.25"
- y1="283.94504"
- x2="235"
- y2="253.00755" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient25931"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-335,238.99245)"
- x1="426.12415"
- y1="179.12074"
- x2="425"
- y2="179.12285" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient25957"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,673.5,170.50451)"
- x1="253.78497"
- y1="3.6831069"
- x2="278.25537"
- y2="30.023426" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334"
- id="linearGradient25959"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(830,-47)"
- x1="87"
- y1="241.125"
- x2="93.0625"
- y2="249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient25961"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-136,-112)"
- x1="753.39417"
- y1="299.83005"
- x2="758"
- y2="305" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient25982"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,673.5,170.50451)"
- x1="253.78497"
- y1="3.6831069"
- x2="278.25537"
- y2="30.023426" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334"
- id="linearGradient25984"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(830,-47)"
- x1="87"
- y1="241.125"
- x2="93.0625"
- y2="249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient25986"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-136,-88.000005)"
- x1="753.39417"
- y1="299.83005"
- x2="758"
- y2="305" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient26011"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,673.5,170.50451)"
- x1="253.78497"
- y1="3.6831069"
- x2="278.25537"
- y2="30.023426" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334"
- id="linearGradient26013"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(830,-47)"
- x1="87"
- y1="241.125"
- x2="93.0625"
- y2="249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient26015"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-112,-76.000004)"
- x1="753.39417"
- y1="299.83005"
- x2="758"
- y2="305" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient26077"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.923955,0,0,1,82.8792,399.00004)"
- x1="-7.445384"
- y1="204.24995"
- x2="33.682159"
- y2="250.99995" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient26079"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(80.02752,483.00004)"
- x1="29.972469"
- y1="164"
- x2="36.972481"
- y2="168.00002" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient26081"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-224,-1290)"
- x1="113"
- y1="646"
- x2="111"
- y2="644" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient26083"
- gradientUnits="userSpaceOnUse"
- x1="113"
- y1="646"
- x2="111.5"
- y2="644.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient26126"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.831045,0,0,0.776773,36.146465,141.05131)"
- x1="71.762154"
- y1="239.83469"
- x2="76.956871"
- y2="252.05081" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient26128"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.831045,0,0,0.776773,36.165705,133.02478)"
- x1="72.340698"
- y1="243.03008"
- x2="73.234337"
- y2="246.81651" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient26130"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.831045,0,0,0.776773,36.165705,133.02478)"
- x1="68.383354"
- y1="239.95235"
- x2="69.285805"
- y2="247.29691" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="radialGradient27973"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.39459,-0.991726,0.917787,0.36517,234.80511,750.0215)"
- cx="450.06522"
- cy="25.190212"
- fx="450.06522"
- fy="25.190212"
- r="5.5" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient27975"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.121304,-0.696283,0.871429,0.151818,359.51331,621.7)"
- cx="450.72842"
- cy="19.250505"
- fx="450.72842"
- fy="19.250505"
- r="5.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient27977"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,883.51417,295)"
- x1="456.81198"
- y1="15.545153"
- x2="441.9628"
- y2="13.21724" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient28099"
- gradientUnits="userSpaceOnUse"
- x1="62.793919"
- y1="133.73566"
- x2="64.109718"
- y2="135.18265" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient28107"
- gradientUnits="userSpaceOnUse"
- x1="461.66425"
- y1="16.23234"
- x2="432.875"
- y2="14.936845"
- gradientTransform="translate(-19,294.91429)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient27448"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-19,294.91429)"
- x1="461.66425"
- y1="16.23234"
- x2="432.875"
- y2="14.936845" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient27450"
- gradientUnits="userSpaceOnUse"
- x1="62.793919"
- y1="133.73566"
- x2="64.109718"
- y2="135.18265" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="radialGradient27452"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.39459,-0.991726,0.917787,0.36517,234.80511,750.0215)"
- cx="450.06522"
- cy="25.190212"
- fx="450.06522"
- fy="25.190212"
- r="5.5" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient27454"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.121304,-0.696283,0.871429,0.151818,359.51331,621.7)"
- cx="450.72842"
- cy="19.250505"
- fx="450.72842"
- fy="19.250505"
- r="5.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient27456"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,883.51417,295)"
- x1="456.81198"
- y1="15.545153"
- x2="441.9628"
- y2="13.21724" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient27540"
- gradientUnits="userSpaceOnUse"
- x1="332.49747"
- y1="38.166924"
- x2="326.41843"
- y2="31.22842" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient27542"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(2.011921e-5,12.000013)"
- x1="326.483"
- y1="31.446384"
- x2="337.3125"
- y2="41.875" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient27544"
- gradientUnits="userSpaceOnUse"
- x1="329.18762"
- y1="34.005215"
- x2="331.44778"
- y2="36.739578" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23705"
- id="linearGradient27598"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(220,-20.00667)"
- x1="29.4034"
- y1="100.99999"
- x2="34.095703"
- y2="101.15624" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24168"
- id="linearGradient27600"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.75,0,0,0.7516675,227.625,0.9640803)"
- x1="20.125"
- y1="88.642494"
- x2="34.125"
- y2="104.89799" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient27602"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6595012,0.7907318,-0.8990144,0.7498135,144.69896,-187.59854)"
- cx="261.98364"
- cy="74.083908"
- fx="261.98364"
- fy="74.083908"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient27604"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8750002,0,0,0.83767,7.3124969,247.00379)"
- x1="27.166666"
- y1="90.504448"
- x2="35.166668"
- y2="101.14744" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient27606"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.53241"
- cy="500.20956"
- fx="75.53241"
- fy="500.20956"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient27608"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.4564959,0.09949388,-0.06177986,1.3917691,-283.96093,-143.81911)"
- cx="135.14931"
- cy="332.10181"
- fx="135.14931"
- fy="332.10181"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="linearGradient27610"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2,0,0,0.7333333,-467,262.53823)"
- x1="250.5"
- y1="90.253998"
- x2="250.5"
- y2="95.252274" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient27612"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.3687636,0.09935874,-0.05957343,1.3898788,-272.60513,-143.17133)"
- cx="140.33667"
- cy="333.05716"
- fx="140.33667"
- fy="333.05716"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient34157"
- id="linearGradient30389"
- gradientUnits="userSpaceOnUse"
- x1="270.60007"
- y1="68.519989"
- x2="258.00165"
- y2="81.245804" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30391"
- gradientUnits="userSpaceOnUse"
- x1="256.67459"
- y1="80.395966"
- x2="262.88068"
- y2="74.415245" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient30393"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4829018,0,0,0.4829018,133.47136,40.782399)"
- cx="257.35309"
- cy="79.598709"
- fx="257.35309"
- fy="79.598709"
- r="3.779551" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29149"
- id="radialGradient30395"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.217888"
- cy="500.66806"
- fx="75.217888"
- fy="500.66806"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient30397"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.554794"
- cy="500.26215"
- fx="75.554794"
- fy="500.26215"
- r="3.1650217" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient29129"
- gradientUnits="userSpaceOnUse"
- x1="732.9375"
- y1="412.8125"
- x2="753.40625"
- y2="418.33594" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient27767"
- gradientUnits="userSpaceOnUse"
- x1="125.99933"
- y1="111.2683"
- x2="134.91479"
- y2="122.36016" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient27769"
- gradientUnits="userSpaceOnUse"
- x1="126.72586"
- y1="112.53999"
- x2="134.91479"
- y2="122.36016" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13973"
- id="linearGradient27771"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(19.367382,0)"
- x1="112.18942"
- y1="114.71685"
- x2="99.628899"
- y2="99.029617" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient27773"
- gradientUnits="userSpaceOnUse"
- x1="127.63637"
- y1="114.2303"
- x2="143.69765"
- y2="131.03783" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="radialGradient31865"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.986122,0,0,0.986122,2.8033684,0.804927)"
- cx="202"
- cy="58"
- fx="202"
- fy="58"
- r="7" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask31861">
- <path
- sodipodi:type="arc"
- style="fill:url(#radialGradient31865);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path31863"
- sodipodi:cx="202"
- sodipodi:cy="58"
- sodipodi:rx="11"
- sodipodi:ry="11"
- d="m 213,58 a 11,11 0 1 1 -22,0 11,11 0 1 1 22,0 z" />
- </mask>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath31849">
- <path
- style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 232.13187,93.950853 4.84276,0 4.23742,4.237465 0,4.842822 -9.08018,0 0,-9.080287 0,0 z"
- id="path31851"
- sodipodi:nodetypes="cccccc" />
- </clipPath>
- <filter
- inkscape:collect="always"
- id="filter30544"
- x="-0.11968782"
- width="1.2393756"
- y="-0.12031381"
- height="1.2406276"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.59634694"
- id="feGaussianBlur30546" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter30552"
- x="-0.12"
- width="1.24"
- y="-0.12"
- height="1.24"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.4"
- id="feGaussianBlur30554" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter30556"
- x="-0.12"
- width="1.24"
- y="-0.12"
- height="1.24"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.4"
- id="feGaussianBlur30558" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter30564"
- x="-0.12000064"
- width="1.2400013"
- y="-0.11999936"
- height="1.2399987"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.36320908"
- id="feGaussianBlur30566" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter30580"
- x="-0.11981065"
- width="1.2396213"
- y="-0.12018995"
- height="1.2403799"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.479335"
- id="feGaussianBlur30582" />
- </filter>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient32298"
- gradientUnits="userSpaceOnUse"
- x1="-117.5"
- y1="431.5"
- x2="-119.5"
- y2="429.5"
- gradientTransform="translate(258,-96.99999)" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask32294">
- <rect
- y="323"
- x="134"
- height="16"
- width="9"
- id="rect32296"
- style="fill:url(#linearGradient32298);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- </mask>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="radialGradient32241"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.050372,0,0,1.050372,-3.551238,-0.730396)"
- cx="70.5"
- cy="14.5"
- fx="70.5"
- fy="14.5"
- r="1.5" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="radialGradient32243"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5399935,0.3131662,-0.3907892,0.5793905,38.141764,-16.056748)"
- cx="70.470596"
- cy="14.649424"
- fx="70.470596"
- fy="14.649424"
- r="5.5192375" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient53119"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.684011,0.3442329,-1.2972142,1.1562236,739.67527,-1155.7895)"
- cx="975.50568"
- cy="690.68732"
- fx="975.50568"
- fy="690.68732"
- r="2.333364" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient53121"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8008385,0,0,0.821004,429.95027,-161.55482)"
- x1="108.71671"
- y1="171.25618"
- x2="105.85706"
- y2="168.04703" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20756"
- id="linearGradient53123"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8008385,0,0,0.8956408,540.31118,-183.20693)"
- x1="-26.313976"
- y1="178.07901"
- x2="-28.432825"
- y2="175.87964" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient53125"
- gradientUnits="userSpaceOnUse"
- x1="510.29913"
- y1="-20.435461"
- x2="505.9494"
- y2="-17.546936" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient53127"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,-346.7085,428.4841)"
- x1="352.98236"
- y1="314.11398"
- x2="353.72073"
- y2="297.92099" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13938"
- id="linearGradient53129"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-15.983875,338)"
- x1="362.79037"
- y1="-159.88834"
- x2="373.83752"
- y2="-150.41035" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient53131"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9900316,0,0,1,2.450297,0.00704954)"
- x1="343.51892"
- y1="175.19124"
- x2="350.97491"
- y2="183.3365" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient53133"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.684011,0.3442329,-1.2972142,1.1562236,739.67527,-1155.7895)"
- cx="975.50568"
- cy="690.68732"
- fx="975.50568"
- fy="690.68732"
- r="2.333364" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient53135"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8008385,0,0,0.821004,429.95027,-161.55482)"
- x1="108.71671"
- y1="171.25618"
- x2="105.85706"
- y2="168.04703" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20756"
- id="linearGradient53137"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8008385,0,0,0.8956408,540.31118,-183.20693)"
- x1="-26.313976"
- y1="178.07901"
- x2="-28.432825"
- y2="175.87964" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient53139"
- gradientUnits="userSpaceOnUse"
- x1="510.29913"
- y1="-20.435461"
- x2="505.9494"
- y2="-17.546936" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient53141"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.684011,0.3442329,-1.2972142,1.1562236,739.67527,-1155.7895)"
- cx="975.50568"
- cy="690.68732"
- fx="975.50568"
- fy="690.68732"
- r="2.333364" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient53143"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8008385,0,0,0.821004,429.95027,-161.55482)"
- x1="108.71671"
- y1="171.25618"
- x2="105.85706"
- y2="168.04703" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20756"
- id="linearGradient53145"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8008385,0,0,0.8956408,540.31118,-183.20693)"
- x1="-26.313976"
- y1="178.07901"
- x2="-28.432825"
- y2="175.87964" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient53147"
- gradientUnits="userSpaceOnUse"
- x1="510.29913"
- y1="-20.435461"
- x2="505.9494"
- y2="-17.546936" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient42459"
- id="linearGradient53149"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(220,-20.00667)"
- x1="29.4034"
- y1="100.99999"
- x2="34.095703"
- y2="101.15624" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient22562"
- id="linearGradient53151"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.75,0,0,0.7516675,227.625,0.9640803)"
- x1="20.125"
- y1="88.642494"
- x2="34.125"
- y2="104.89799" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient53153"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6595012,0.7907318,-0.8990144,0.7498135,144.69896,-187.59854)"
- cx="261.98364"
- cy="74.083908"
- fx="261.98364"
- fy="74.083908"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient53155"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.75,0,0,0.7516675,115.625,254.97076)"
- x1="27.166666"
- y1="90.504448"
- x2="35.166668"
- y2="101.14744" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient53157"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.53241"
- cy="500.20956"
- fx="75.53241"
- fy="500.20956"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient53159"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.1055676,0.08927896,-0.05295416,1.2488779,-134.03789,-95.726825)"
- cx="135.14931"
- cy="332.10181"
- fx="135.14931"
- fy="332.10181"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="linearGradient53161"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-112,237.00668)"
- x1="250.5"
- y1="90.253998"
- x2="250.5"
- y2="95.252274" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient53163"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.1055676,0.08927896,-0.05295416,1.2488779,-134.03789,-95.726825)"
- cx="140.33667"
- cy="333.05716"
- fx="140.33667"
- fy="333.05716"
- r="3.5" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient53165"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.684011,0.3442329,-1.2972142,1.1562236,739.67527,-1155.7895)"
- cx="975.50568"
- cy="690.68732"
- fx="975.50568"
- fy="690.68732"
- r="2.333364" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient53167"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8008385,0,0,0.821004,429.95027,-161.55482)"
- x1="108.71671"
- y1="171.25618"
- x2="105.85706"
- y2="168.04703" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20756"
- id="linearGradient53169"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8008385,0,0,0.8956408,540.31118,-183.20693)"
- x1="-26.313976"
- y1="178.07901"
- x2="-28.432825"
- y2="175.87964" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient53171"
- gradientUnits="userSpaceOnUse"
- x1="510.29913"
- y1="-20.435461"
- x2="505.9494"
- y2="-17.546936" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23178"
- id="linearGradient50870"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(2e-6,0)"
- x1="-22.902081"
- y1="448"
- x2="-14.000002"
- y2="448" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient33427"
- gradientUnits="userSpaceOnUse"
- x1="124.40742"
- y1="111.98244"
- x2="136.04924"
- y2="121.25749" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient33429"
- gradientUnits="userSpaceOnUse"
- x1="132"
- y1="117.26753"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient33585"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.7071068,-0.7071068,0.7071067,0.7071067,-140.04288,401.30258)"
- x1="458.99997"
- y1="89.363937"
- x2="452.63602"
- y2="90.071045" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient31356"
- id="linearGradient33831"
- gradientUnits="userSpaceOnUse"
- x1="134.00002"
- y1="116"
- x2="142.00002"
- y2="108" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient33833"
- gradientUnits="userSpaceOnUse"
- x1="124.75568"
- y1="112.24533"
- x2="132.97911"
- y2="120.16792" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient33835"
- gradientUnits="userSpaceOnUse"
- x1="132"
- y1="117.26753"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient37472"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,-32.5,115.5045)"
- x1="254.19829"
- y1="2.1803131"
- x2="277.86761"
- y2="29.392145" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37475"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(124,-102.00001)"
- x1="85.1875"
- y1="239.125"
- x2="92.8125"
- y2="245.625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient37477"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,-32.5,115.5045)"
- x1="261.83936"
- y1="11.593864"
- x2="275.62497"
- y2="26.679274" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37479"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(124,-102.00001)"
- x1="85.1875"
- y1="239.125"
- x2="92.8125"
- y2="245.625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient34157"
- id="linearGradient37481"
- gradientUnits="userSpaceOnUse"
- x1="270.60007"
- y1="68.519989"
- x2="258.00165"
- y2="81.245804" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37483"
- gradientUnits="userSpaceOnUse"
- x1="256.67459"
- y1="80.395966"
- x2="262.88068"
- y2="74.415245" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient37485"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4829018,0,0,0.4829018,133.47136,40.782399)"
- cx="257.35309"
- cy="79.598709"
- fx="257.35309"
- fy="79.598709"
- r="3.779551" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29149"
- id="radialGradient37487"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.217888"
- cy="500.66806"
- fx="75.217888"
- fy="500.66806"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient37489"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.554794"
- cy="500.26215"
- fx="75.554794"
- fy="500.26215"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient37491"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.5793179,0,-1.0159927e-7,-1.6412688,666.67947,207.37331)"
- cx="258.47122"
- cy="78.512764"
- fx="258.47122"
- fy="78.512764"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient34157"
- id="linearGradient37493"
- gradientUnits="userSpaceOnUse"
- x1="270.66064"
- y1="68.113258"
- x2="257.38638"
- y2="81.382545" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37495"
- gradientUnits="userSpaceOnUse"
- x1="256.38586"
- y1="80.515495"
- x2="262.43726"
- y2="74.562462" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29149"
- id="radialGradient37497"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.217888"
- cy="500.66806"
- fx="75.217888"
- fy="500.66806"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient37499"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.554794"
- cy="500.26215"
- fx="75.554794"
- fy="500.26215"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient37501"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.08933014,-0.7764284,0.7350832,-0.08334857,57.410559,233.30156)"
- cx="135.83771"
- cy="117.97826"
- fx="135.83771"
- fy="117.97826"
- r="8" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37503"
- gradientUnits="userSpaceOnUse"
- x1="121.19734"
- y1="105.94044"
- x2="148.06364"
- y2="137.6748" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient34157"
- id="linearGradient37505"
- gradientUnits="userSpaceOnUse"
- x1="270.66064"
- y1="68.113258"
- x2="257.38638"
- y2="81.382545" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37507"
- gradientUnits="userSpaceOnUse"
- x1="256.38586"
- y1="80.515495"
- x2="262.43726"
- y2="74.562462" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29149"
- id="radialGradient37509"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.217888"
- cy="500.66806"
- fx="75.217888"
- fy="500.66806"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient37511"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.554794"
- cy="500.26215"
- fx="75.554794"
- fy="500.26215"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient37513"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.3336259,0,-8.5793649e-8,-1.3859393,603.17514,187.32668)"
- cx="258.47122"
- cy="78.512764"
- fx="258.47122"
- fy="78.512764"
- r="3.5" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient37515"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.3648614,0,-8.7803051e-8,-1.4184,611.24862,189.87526)"
- cx="258.47122"
- cy="78.512764"
- fx="258.47122"
- fy="78.512764"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient34157"
- id="linearGradient37517"
- gradientUnits="userSpaceOnUse"
- x1="270.66064"
- y1="68.113258"
- x2="257.38638"
- y2="81.382545" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37519"
- gradientUnits="userSpaceOnUse"
- x1="256.38586"
- y1="80.515495"
- x2="262.43726"
- y2="74.562462" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29149"
- id="radialGradient37521"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.217888"
- cy="500.66806"
- fx="75.217888"
- fy="500.66806"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient37523"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.554794"
- cy="500.26215"
- fx="75.554794"
- fy="500.26215"
- r="3.1650217" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30124"
- id="linearGradient37525"
- gradientUnits="userSpaceOnUse"
- x1="337.34329"
- y1="43.328976"
- x2="330.27045"
- y2="35.276588" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37527"
- gradientUnits="userSpaceOnUse"
- x1="329.9158"
- y1="35.5"
- x2="335.27429"
- y2="41.570362" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient37529"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0028571,0,0,0.9943503,-0.4404318,0.129119)"
- x1="166.89752"
- y1="9.0567484"
- x2="193.26451"
- y2="38.642647" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37531"
- gradientUnits="userSpaceOnUse"
- x1="127.93343"
- y1="122.8346"
- x2="133.77768"
- y2="116.99384" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37533"
- gradientUnits="userSpaceOnUse"
- x1="141.60255"
- y1="108.39205"
- x2="132"
- y2="118.66972" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37535"
- gradientUnits="userSpaceOnUse"
- x1="122.86111"
- y1="127.14286"
- x2="133.77768"
- y2="116.99384" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37537"
- gradientUnits="userSpaceOnUse"
- x1="141.60255"
- y1="108.39205"
- x2="132"
- y2="118.66972" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37539"
- gradientUnits="userSpaceOnUse"
- x1="266"
- y1="659"
- x2="285"
- y2="659" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient35391"
- id="linearGradient37541"
- gradientUnits="userSpaceOnUse"
- x1="244.21062"
- y1="600.74884"
- x2="244.21062"
- y2="602.96759" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient35407"
- id="linearGradient37543"
- gradientUnits="userSpaceOnUse"
- x1="235.29379"
- y1="588.43396"
- x2="245.93307"
- y2="604.52502" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient37545"
- gradientUnits="userSpaceOnUse"
- x1="510.25"
- y1="36"
- x2="494"
- y2="36"
- gradientTransform="matrix(-1,0,0,1,992,0)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37547"
- gradientUnits="userSpaceOnUse"
- x1="492"
- y1="33"
- x2="503"
- y2="43"
- gradientTransform="matrix(-1,0,0,1,992,0)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient37549"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,551,105)"
- x1="497.3125"
- y1="35"
- x2="483"
- y2="35" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient37551"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,551,105)"
- x1="497.3125"
- y1="35"
- x2="483"
- y2="35" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient37553"
- gradientUnits="userSpaceOnUse"
- x1="86.248604"
- y1="32"
- x2="68"
- y2="12" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient37555"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,1)"
- x1="81"
- y1="27"
- x2="64.5"
- y2="9.0000019" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient37557"
- gradientUnits="userSpaceOnUse"
- x1="70.78582"
- y1="15.659542"
- x2="79.465332"
- y2="24.480759" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="radialGradient37559"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5997527,0.4726093,-0.6665451,0.8458611,35.480681,-28.765852)"
- cx="63.013588"
- cy="14.60904"
- fx="63.013588"
- fy="14.60904"
- r="6.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient37571"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8666667,0,0,0.9166667,406.13333,-443.79167)"
- x1="108"
- y1="500"
- x2="54.8125"
- y2="500" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15809"
- id="linearGradient37573"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.9971589,396,-484.56523)"
- x1="83.261826"
- y1="502.54196"
- x2="41.311054"
- y2="501.10059" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient37575"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3949409,0.3949425,-0.4243709,0.4254619,321.60762,256.85923)"
- cx="75.95578"
- cy="492.15359"
- fx="75.95578"
- fy="492.15359"
- r="3.1650217" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient37578"
- gradientUnits="userSpaceOnUse"
- x1="80.768944"
- y1="504.67188"
- x2="76.885078"
- y2="501.58331" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37580"
- gradientUnits="userSpaceOnUse"
- x1="89.526657"
- y1="511.42972"
- x2="78.000008"
- y2="501.04794" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient37582"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.2665671,0.04035316,-0.03648524,1.99062,-82.893589,-502.25433)"
- cx="79.959885"
- cy="503.81497"
- fx="79.959885"
- fy="503.81497"
- r="2.9089756" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29149"
- id="radialGradient37584"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.217888"
- cy="500.66806"
- fx="75.217888"
- fy="500.66806"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient37586"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.554794"
- cy="500.26215"
- fx="75.554794"
- fy="500.26215"
- r="3.1650217" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37588"
- gradientUnits="userSpaceOnUse"
- x1="264.10001"
- y1="330.10001"
- x2="264.89999"
- y2="330.89999" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14232"
- id="linearGradient37590"
- gradientUnits="userSpaceOnUse"
- x1="122.38876"
- y1="108.82882"
- x2="133.88583"
- y2="121.20407" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient37592"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9995363,0,0,-1.0036971,220.01067,167.35026)"
- x1="51.37524"
- y1="96.955269"
- x2="44.999863"
- y2="103.57072" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15437"
- id="linearGradient37594"
- gradientUnits="userSpaceOnUse"
- x1="137.88235"
- y1="124.67203"
- x2="131.3092"
- y2="117.24104" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37596"
- gradientUnits="userSpaceOnUse"
- x1="126.37032"
- y1="110.87843"
- x2="139.86742"
- y2="126.57021" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient37608"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.684011,0.3442329,-1.2972142,1.1562236,739.67527,-1155.7895)"
- cx="975.50568"
- cy="690.68732"
- fx="975.50568"
- fy="690.68732"
- r="2.333364" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient37610"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8008385,0,0,0.821004,429.95027,-161.55482)"
- x1="108.71671"
- y1="171.25618"
- x2="105.85706"
- y2="168.04703" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20756"
- id="linearGradient37612"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8008385,0,0,0.8956408,540.31118,-183.20693)"
- x1="-26.313976"
- y1="178.07901"
- x2="-28.432825"
- y2="175.87964" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37614"
- gradientUnits="userSpaceOnUse"
- x1="510.29913"
- y1="-20.435461"
- x2="505.9494"
- y2="-17.546936" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient37636"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,-241.7085,428.4841)"
- x1="387.30396"
- y1="126.23978"
- x2="332.88193"
- y2="123.61623" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient37638"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,-346.7085,428.4841)"
- x1="352.98236"
- y1="314.11398"
- x2="353.72073"
- y2="297.92099" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37640"
- gradientUnits="userSpaceOnUse"
- x1="121.19734"
- y1="105.94044"
- x2="148.06364"
- y2="137.6748" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient42322"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9995967,0,0,1.0002103,-78.949724,-0.02739749)"
- x1="109.04134"
- y1="75.666725"
- x2="135.45256"
- y2="103.11092" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42324"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1000194,0,0,1.0998287,-4.6508478,-9.2334126)"
- x1="47.655102"
- y1="93.805557"
- x2="59.057678"
- y2="105.27895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient42326"
- gradientUnits="userSpaceOnUse"
- x1="124.8772"
- y1="110.75571"
- x2="133.97179"
- y2="117.77643" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient42328"
- gradientUnits="userSpaceOnUse"
- x1="129.32576"
- y1="223.61363"
- x2="123.33967"
- y2="217.06438" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42330"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="142.64723"
- y2="129.05313" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient42332"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.0041772,0,0,0.9688607,-81.584854,117.13687)"
- x1="-4.9152389"
- y1="252.69086"
- x2="-45.689278"
- y2="252.63284" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42334"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9993234,0,0,1.0050357,-171.92846,305.72314)"
- x1="107.96875"
- y1="53.875"
- x2="117"
- y2="60.125" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient42336"
- gradientUnits="userSpaceOnUse"
- x1="154.24324"
- y1="-11.628862"
- x2="134.08138"
- y2="-22.846634" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient42338"
- gradientUnits="userSpaceOnUse"
- x1="137.5"
- y1="-18"
- x2="135.25"
- y2="-21" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient42340"
- gradientUnits="userSpaceOnUse"
- x1="134.12642"
- y1="-21.522242"
- x2="132.29695"
- y2="-23.945318" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient42342"
- gradientUnits="userSpaceOnUse"
- x1="134.6615"
- y1="-21.3074"
- x2="131.69801"
- y2="-24.343456" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient42344"
- gradientUnits="userSpaceOnUse"
- x1="-69.457596"
- y1="31.914484"
- x2="-76.564636"
- y2="28.695114" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42346"
- gradientUnits="userSpaceOnUse"
- x1="-57.780041"
- y1="48.005856"
- x2="-78.812721"
- y2="31" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient42348"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9995967,0,0,1.0002103,-78.949724,-0.02739749)"
- x1="109.04134"
- y1="75.666725"
- x2="135.45256"
- y2="103.11092" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42350"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3000195,0,0,0.2998291,32.548709,64.760571)"
- x1="51.497997"
- y1="97.491707"
- x2="59.057678"
- y2="105.27895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42352"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3000195,0,0,0.1998289,32.548709,79.011866)"
- x1="51.497997"
- y1="94.987144"
- x2="59.057678"
- y2="105.27895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42354"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3000195,0,0,0.1998289,32.548709,83.013491)"
- x1="51.497997"
- y1="94.987129"
- x2="59.057678"
- y2="105.27895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42356"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.2,0,0,0.1998289,42.197983,83.013493)"
- x1="48.998543"
- y1="94.987114"
- x2="59.057678"
- y2="105.27895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42358"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.2,0,0,0.1998289,42.197981,79.010163)"
- x1="48.99855"
- y1="94.995667"
- x2="59.057678"
- y2="105.27895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42360"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.2,0,0,0.2999998,42.19798,64.743076)"
- x1="48.998554"
- y1="97.494553"
- x2="59.057678"
- y2="105.27895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42362"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.2,0,0,0.1998289,46.196563,83.013493)"
- x1="48.998539"
- y1="94.987114"
- x2="59.057678"
- y2="105.27895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42364"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.2,0,0,0.1998289,46.196561,79.010163)"
- x1="48.998547"
- y1="94.995667"
- x2="59.057678"
- y2="105.27895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42366"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.2,0,0,0.2999998,46.19656,64.743076)"
- x1="48.998554"
- y1="97.494553"
- x2="59.057678"
- y2="105.27895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient42368"
- gradientUnits="userSpaceOnUse"
- x1="-109.125"
- y1="52.625"
- x2="-121.73741"
- y2="38.387074" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient42370"
- gradientUnits="userSpaceOnUse"
- x1="112.48699"
- y1="99.873772"
- x2="136.44698"
- y2="123.20583" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42372"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient42374"
- gradientUnits="userSpaceOnUse"
- x1="102.83286"
- y1="85.825607"
- x2="138.25778"
- y2="124.59384" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient42376"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-41,98)"
- x1="-170.25"
- y1="65.5"
- x2="-181.375"
- y2="65.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient42378"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6962506,0,0,0.8034158,-66.833415,127.95312)"
- x1="-223.42456"
- y1="43.134327"
- x2="-202.33263"
- y2="39.110355" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42380"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6962506,0,0,0.8034158,-66.833415,127.95312)"
- x1="-219.98772"
- y1="40.355042"
- x2="-220.82353"
- y2="27.996962" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42382"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9098462,0,0,0.9414558,-57.134785,102.33514)"
- x1="-177.6924"
- y1="63.26775"
- x2="-170.82031"
- y2="62.441177" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42384"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2857143,0,0,0.787037,-92.714287,177.80092)"
- x1="-101"
- y1="-16"
- x2="-93.75"
- y2="-16.264704" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient42386"
- gradientUnits="userSpaceOnUse"
- x1="-211.04486"
- y1="193.68091"
- x2="-219.5"
- y2="185.8125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="radialGradient42388"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.6261963,-1.575549,0.4790575,0.7985147,261.90894,-304.15053)"
- cx="-216.5222"
- cy="188.13423"
- fx="-216.5222"
- fy="188.13423"
- r="6.9375" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="radialGradient42390"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.4767928,-0.2294888,0.06653313,0.7180687,315.70283,0.01290384)"
- cx="-221.88463"
- cy="182.64247"
- fx="-221.88463"
- fy="182.64247"
- r="3.4576657" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42392"
- gradientUnits="userSpaceOnUse"
- x1="-225.00002"
- y1="38.277779"
- x2="-213"
- y2="44.732624" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="radialGradient42394"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1226244,0.04761823,-0.1611956,3.8002759,59.188894,-553.59611)"
- cx="-215.0979"
- cy="201.01204"
- fx="-215.0979"
- fy="201.01204"
- r="5.8999949" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42396"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,4)"
- x1="-224"
- y1="201"
- x2="-214.39445"
- y2="195.27762" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient42398"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1142111,0,0,-1,-174.01401,596.00357)"
- x1="209.05762"
- y1="290.00357"
- x2="215.34009"
- y2="277.00357" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient42400"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1142111,0,0,-1,-174.01401,596.00357)"
- x1="178.77469"
- y1="550.50702"
- x2="198.57239"
- y2="559.03442" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42402"
- gradientUnits="userSpaceOnUse"
- x1="132"
- y1="120.4313"
- x2="93.029579"
- y2="78.9655" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient42404"
- gradientUnits="userSpaceOnUse"
- x1="112.48699"
- y1="99.873772"
- x2="136.44698"
- y2="123.20583" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42406"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient42408"
- gradientUnits="userSpaceOnUse"
- x1="102.83286"
- y1="85.825607"
- x2="138.25778"
- y2="124.59384" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42410"
- gradientUnits="userSpaceOnUse"
- x1="132"
- y1="120.4313"
- x2="93.029579"
- y2="78.9655" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient42412"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1142111,0,0,-1,-174.01401,596.00357)"
- x1="178.77469"
- y1="550.50702"
- x2="198.57239"
- y2="559.03442" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient42414"
- gradientUnits="userSpaceOnUse"
- x1="112.48699"
- y1="99.873772"
- x2="133.62697"
- y2="120.49951" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42416"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient42418"
- gradientUnits="userSpaceOnUse"
- x1="102.83286"
- y1="85.825607"
- x2="138.25778"
- y2="124.59384" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient42420"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-120,79)"
- x1="-170.25"
- y1="65.5"
- x2="-181.375"
- y2="65.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient42422"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6962506,0,0,0.8034158,-145.83341,108.95312)"
- x1="-223.42456"
- y1="43.134327"
- x2="-202.33263"
- y2="39.110355" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42424"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6962506,0,0,0.8034158,-145.83341,108.95312)"
- x1="-219.98772"
- y1="40.355042"
- x2="-220.82353"
- y2="27.996962" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42426"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9098462,0,0,0.9414558,-136.13478,83.33514)"
- x1="-177.6924"
- y1="63.26775"
- x2="-170.82031"
- y2="62.441177" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42428"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2857143,0,0,0.787037,-171.71429,158.80092)"
- x1="-101"
- y1="-16"
- x2="-93.75"
- y2="-16.264704" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30208"
- id="linearGradient42430"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1297,-948)"
- x1="1664.4413"
- y1="720.01788"
- x2="1661.8125"
- y2="726.37006" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient19425"
- id="radialGradient42432"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.1378252,-0.2988982,2.5269117,1.1651875,-1689.2674,-563.64056)"
- cx="1662.2664"
- cy="722.19189"
- fx="1662.2664"
- fy="722.19189"
- r="5.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42434"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,-1256.7473,-918.72044)"
- x1="1984.3658"
- y1="827.77124"
- x2="1977.4047"
- y2="829.72656" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient42436"
- gradientUnits="userSpaceOnUse"
- x1="-211.04486"
- y1="193.68091"
- x2="-219.5"
- y2="185.8125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="radialGradient42438"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.6261963,-1.575549,0.4790575,0.7985147,261.90894,-304.15053)"
- cx="-216.5222"
- cy="188.13423"
- fx="-216.5222"
- fy="188.13423"
- r="6.9375" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="radialGradient42440"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.4767928,-0.2294888,0.06653313,0.7180687,315.70283,0.01290384)"
- cx="-221.88463"
- cy="182.64247"
- fx="-221.88463"
- fy="182.64247"
- r="3.4576657" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42442"
- gradientUnits="userSpaceOnUse"
- x1="-225.00002"
- y1="38.277779"
- x2="-213"
- y2="44.732624" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient42444"
- gradientUnits="userSpaceOnUse"
- x1="124.8772"
- y1="110.75571"
- x2="133.97179"
- y2="117.77643" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42446"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="142.64723"
- y2="129.05313" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient42448"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1658027,0,0,1.1657997,-354.28972,51.94393)"
- x1="129.32576"
- y1="223.61363"
- x2="123.33967"
- y2="217.06438" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42462"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15425"
- id="linearGradient42464"
- gradientUnits="userSpaceOnUse"
- x1="123.26987"
- y1="108.56933"
- x2="138.25778"
- y2="124.59384" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42466"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient42468"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.8370074,0,0,0.8129865,84.784966,-149.92038)"
- x1="-4.9152389"
- y1="252.69086"
- x2="-45.689278"
- y2="252.63284" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42470"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,11.285548,8.325368)"
- x1="111.03847"
- y1="57.034107"
- x2="117.16058"
- y2="60.591385" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42472"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15425"
- id="linearGradient42474"
- gradientUnits="userSpaceOnUse"
- x1="123.26987"
- y1="108.56933"
- x2="138.25778"
- y2="124.59384" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42477"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient42479"
- gradientUnits="userSpaceOnUse"
- x1="-92.587807"
- y1="-18.005362"
- x2="-100.62162"
- y2="-17.998919" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42481"
- gradientUnits="userSpaceOnUse"
- x1="-101"
- y1="-16"
- x2="-93"
- y2="-17" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient42483"
- gradientUnits="userSpaceOnUse"
- x1="-87.491188"
- y1="-22.830606"
- x2="-102.96513"
- y2="-22.166544" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42485"
- gradientUnits="userSpaceOnUse"
- x1="-98.997849"
- y1="-23.173643"
- x2="-98.997849"
- y2="-25.872688" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42487"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15425"
- id="linearGradient42489"
- gradientUnits="userSpaceOnUse"
- x1="123.26987"
- y1="108.56933"
- x2="138.25778"
- y2="124.59384" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42491"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient42493"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5290924,0,0,0.5294132,-17.313533,46.110999)"
- x1="109.04134"
- y1="75.666725"
- x2="135.45256"
- y2="103.11092" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42495"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5350034,0,0,0.5349052,24.446207,45.843517)"
- x1="47.655102"
- y1="93.805557"
- x2="59.057678"
- y2="105.27895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42497"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15425"
- id="linearGradient42499"
- gradientUnits="userSpaceOnUse"
- x1="123.26987"
- y1="108.56933"
- x2="138.25778"
- y2="124.59384" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42501"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient42503"
- gradientUnits="userSpaceOnUse"
- x1="124.8772"
- y1="110.75571"
- x2="133.97179"
- y2="117.77643" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42505"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="142.64723"
- y2="129.05313" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42507"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15425"
- id="linearGradient42509"
- gradientUnits="userSpaceOnUse"
- x1="123.26987"
- y1="108.56933"
- x2="138.25778"
- y2="124.59384" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42511"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient42513"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4749148,1.0023386,-1.2226848,-0.4749148,213.62384,41.735193)"
- x1="118.95689"
- y1="106.42961"
- x2="135.14919"
- y2="119.05286" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42515"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5333554,1.1220467,-1.1447545,-0.5333554,196.63818,32.816067)"
- x1="130.39502"
- y1="116.31751"
- x2="147.95374"
- y2="134.687" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18207"
- id="linearGradient42517"
- gradientUnits="userSpaceOnUse"
- x1="-132.24858"
- y1="313.87549"
- x2="-171.01999"
- y2="223.69542" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient42519"
- gradientUnits="userSpaceOnUse"
- x1="114.15679"
- y1="100.93772"
- x2="137.5759"
- y2="124.47867" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42521"
- gradientUnits="userSpaceOnUse"
- x1="131.12576"
- y1="118"
- x2="140.19273"
- y2="125.82862" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient42523"
- gradientUnits="userSpaceOnUse"
- x1="190.68166"
- y1="244.14676"
- x2="174.75458"
- y2="226.33672" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42525"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9050931,-7.9558708e-4,0.00612764,0.9147058,26.488451,35.562258)"
- x1="299.70026"
- y1="408.49368"
- x2="322.08145"
- y2="429.53806" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35406"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15425"
- id="linearGradient35408"
- gradientUnits="userSpaceOnUse"
- x1="119.94563"
- y1="100.51657"
- x2="138.25778"
- y2="124.59384" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient35410"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9897912,0,0,0.9897912,2.2765631,2.9503441)"
- x1="311.90765"
- y1="311.2269"
- x2="308.84512"
- y2="308.51169" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient35412"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1377775,-0.7111077,0.4395239,0.7032404,-101.13916,328.96745)"
- cx="269.71231"
- cy="237.2262"
- fx="269.71231"
- fy="237.2262"
- r="7.03125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient35414"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.706663,-1.1377794,0.5688915,0.8533318,-282.47828,404.20327)"
- cx="262.83905"
- cy="245.91792"
- fx="262.83905"
- fy="245.91792"
- r="7.03125" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35416"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15425"
- id="linearGradient35418"
- gradientUnits="userSpaceOnUse"
- x1="119.94563"
- y1="100.51657"
- x2="138.25778"
- y2="124.59384" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient35420"
- gradientUnits="userSpaceOnUse"
- x1="220.14905"
- y1="291.80676"
- x2="226.09999"
- y2="286.2493" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient35422"
- gradientUnits="userSpaceOnUse"
- x1="223.12212"
- y1="296.15784"
- x2="219.06912"
- y2="291.99768" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35424"
- gradientUnits="userSpaceOnUse"
- x1="217.56451"
- y1="290.56451"
- x2="224.01613"
- y2="297.01614" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient35426"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3677588,0.3783715,-0.5696226,0.5536455,304.13863,47.532824)"
- cx="219.00334"
- cy="291.33972"
- fx="219.00334"
- fy="291.33972"
- r="4" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35468"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15425"
- id="linearGradient35470"
- gradientUnits="userSpaceOnUse"
- x1="119.94563"
- y1="100.51657"
- x2="138.25778"
- y2="124.59384" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient35472"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9897912,0,0,0.9897912,2.2765631,2.9503441)"
- x1="311.90765"
- y1="311.2269"
- x2="308.84512"
- y2="308.51169" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient35474"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1377775,-0.7111077,0.4395239,0.7032404,-101.13916,328.96745)"
- cx="269.71231"
- cy="237.2262"
- fx="269.71231"
- fy="237.2262"
- r="7.03125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient35476"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.706663,-1.1377794,0.5688915,0.8533318,-282.47828,404.20327)"
- cx="262.83905"
- cy="245.91792"
- fx="262.83905"
- fy="245.91792"
- r="7.03125" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35478"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15425"
- id="linearGradient35480"
- gradientUnits="userSpaceOnUse"
- x1="119.94563"
- y1="100.51657"
- x2="138.25778"
- y2="124.59384" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient35482"
- gradientUnits="userSpaceOnUse"
- x1="220.14905"
- y1="291.80676"
- x2="226.09999"
- y2="286.2493" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient35484"
- gradientUnits="userSpaceOnUse"
- x1="223.12212"
- y1="296.15784"
- x2="219.06912"
- y2="291.99768" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35486"
- gradientUnits="userSpaceOnUse"
- x1="217.56451"
- y1="290.56451"
- x2="224.01613"
- y2="297.01614" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient35488"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3677588,0.3783715,-0.5696226,0.5536455,304.13863,47.532824)"
- cx="219.00334"
- cy="291.33972"
- fx="219.00334"
- fy="291.33972"
- r="4" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient34618"
- gradientUnits="userSpaceOnUse"
- x1="125.59209"
- y1="112.6446"
- x2="133.11621"
- y2="119.21729" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient34620"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="141.83322"
- y2="132.30261" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient35411"
- id="linearGradient35446"
- gradientUnits="userSpaceOnUse"
- x1="31"
- y1="60.000004"
- x2="34"
- y2="54.000004" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient35411"
- id="linearGradient35448"
- gradientUnits="userSpaceOnUse"
- x1="135.46967"
- y1="118"
- x2="121.4286"
- y2="101.14284" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient35411"
- id="linearGradient35450"
- gradientUnits="userSpaceOnUse"
- x1="133.60002"
- y1="118"
- x2="128.8"
- y2="114.8" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient35411"
- id="linearGradient35452"
- gradientUnits="userSpaceOnUse"
- x1="132.30316"
- y1="123.05057"
- x2="128.8"
- y2="114.8" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient35411"
- id="linearGradient35454"
- gradientUnits="userSpaceOnUse"
- x1="136.35806"
- y1="124.27161"
- x2="130.48389"
- y2="118" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient35718"
- x1="28.130203"
- y1="65.791054"
- x2="32.5"
- y2="55.066181"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="radialGradient36452"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.050372,0,0,1.050372,-3.551238,-0.730396)"
- cx="70.5"
- cy="14.5"
- fx="70.5"
- fy="14.5"
- r="1.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient36273"
- id="linearGradient36454"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4000084,0,0,0.4000084,137.60085,-8.4035259)"
- x1="-103.37495"
- y1="417.87503"
- x2="-101.49999"
- y2="419.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient36273"
- id="linearGradient36456"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4000084,0,0,0.4000084,131.60084,3.5964741)"
- x1="-103.37495"
- y1="417.87503"
- x2="-101.49999"
- y2="419.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient36273"
- id="linearGradient36458"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4000084,0,0,0.4000084,143.60084,3.5964739)"
- x1="-103.37495"
- y1="417.87503"
- x2="-101.49999"
- y2="419.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient37095"
- gradientUnits="userSpaceOnUse"
- x1="125.75312"
- y1="111.40558"
- x2="143.16118"
- y2="129.27902" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient37097"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0028571,0,0,0.9943503,-0.4404318,0.129119)"
- x1="185.89514"
- y1="30.343155"
- x2="197.03207"
- y2="42.717522" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient36648"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-3,3)"
- x1="188"
- y1="40.25"
- x2="180.8125"
- y2="32.46875" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient36650"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-3,3)"
- x1="187.8125"
- y1="33.9375"
- x2="184.25"
- y2="30.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient36652"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-3.0999952,2.9000005)"
- x1="177.85001"
- y1="33.537502"
- x2="186.00626"
- y2="43.381248" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient19900"
- id="linearGradient36654"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9643891,0,0,0.9772371,6.188671,1.0072576)"
- x1="182.20605"
- y1="39.645184"
- x2="172.36885"
- y2="31.368597" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient36656"
- gradientUnits="userSpaceOnUse"
- x1="181.14906"
- y1="32.701904"
- x2="186.00002"
- y2="37.415516" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient19900"
- id="linearGradient36658"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9643891,0,0,0.9772371,9.438677,-2.4927424)"
- x1="181.9404"
- y1="40.924297"
- x2="175.82253"
- y2="34.272892" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient36468"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9166695,0,0,0.9203753,-10.025729,345.78566)"
- x1="80.60067"
- y1="108.47212"
- x2="68.0271"
- y2="94.239906" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13938"
- id="linearGradient36470"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-15.983875,338)"
- x1="68.361542"
- y1="95.337166"
- x2="88.785263"
- y2="116.62141" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient36472"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9998599,0,0,0.9960071,-15.972985,338.41149)"
- x1="58.761654"
- y1="84.330009"
- x2="81.383331"
- y2="108.06429" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient36713"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="117.12428"
- y2="61.720783" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient36715"
- gradientUnits="userSpaceOnUse"
- x1="-56.5"
- y1="340.32199"
- x2="-56.5"
- y2="348" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient36717"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,13)"
- x1="-56.8125"
- y1="329.06256"
- x2="-47.214466"
- y2="329.26965" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient36719"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="117.12428"
- y2="61.720783" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient36721"
- gradientUnits="userSpaceOnUse"
- x1="-56.5"
- y1="340.32199"
- x2="-56.5"
- y2="348" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient36723"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,13)"
- x1="-56.8125"
- y1="329.06256"
- x2="-47.214466"
- y2="329.26965" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient36725"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="117.12428"
- y2="61.720783" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient36727"
- gradientUnits="userSpaceOnUse"
- x1="-56.5"
- y1="340.32199"
- x2="-56.5"
- y2="348" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient36729"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.7972867,61.99991,2.2419)"
- x1="260.67468"
- y1="108.02418"
- x2="273.9993"
- y2="126.37626" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient37396"
- gradientUnits="userSpaceOnUse"
- x1="389.73953"
- y1="220.84622"
- x2="389.59052"
- y2="248.09296"
- gradientTransform="matrix(-1,0,0,1,780.92531,0)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37398"
- gradientUnits="userSpaceOnUse"
- x1="389.51059"
- y1="241.72565"
- x2="388.20074"
- y2="242.55887"
- gradientTransform="matrix(-1,0,0,1,780.92531,0)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient38570"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-2,0)"
- x1="-20"
- y1="283"
- x2="-20"
- y2="284.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient38572"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-2,-582)"
- x1="-20"
- y1="283"
- x2="-20"
- y2="284.5" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask38561">
- <g
- id="g38563">
- <rect
- y="278"
- x="-23"
- height="13"
- width="16"
- id="rect38565"
- style="fill:url(#linearGradient38570);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- transform="scale(1,-1)"
- style="fill:url(#linearGradient38572);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect38567"
- width="16"
- height="13"
- x="-23"
- y="-304" />
- </g>
- </mask>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-7">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-1" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-2" />
- </linearGradient>
- <linearGradient
- id="linearGradient1610-7-6">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-4-1" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-0-4" />
- </linearGradient>
- <linearGradient
- id="linearGradient10069-4-2">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-8-3" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-8-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient11871-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop11873-5" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop11875-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-7-6"
- id="linearGradient39048"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,-1,-83,199)"
- x1="96"
- y1="42"
- x2="68"
- y2="12" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-4-2"
- id="linearGradient39050"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,-1,-83,199)"
- x1="65"
- y1="20"
- x2="66"
- y2="12" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient11871-4"
- id="linearGradient39052"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,-1,-83,199)"
- x1="67.25"
- y1="18"
- x2="68"
- y2="16" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient35411-4-27"
- id="linearGradient39835-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8422958,0,0,0.8364537,82.535678,2.9394266)"
- x1="89.975014"
- y1="-32.339718"
- x2="88.492455"
- y2="-33.303608" />
- <linearGradient
- id="linearGradient35411-4-27">
- <stop
- id="stop35414-0-9"
- offset="0"
- style="stop-color:#2b5385;stop-opacity:1;" />
- <stop
- id="stop35416-9-5"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient35411-8-1-3"
- id="linearGradient39837-4"
- gradientUnits="userSpaceOnUse"
- x1="131.02808"
- y1="123.49161"
- x2="128.7139"
- y2="115.97001" />
- <linearGradient
- id="linearGradient35411-8-1-3">
- <stop
- id="stop35414-2-7-1"
- offset="0"
- style="stop-color:#2b5385;stop-opacity:1;" />
- <stop
- id="stop35416-4-1-2"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient35411-8-1-3"
- id="linearGradient39839-3"
- gradientUnits="userSpaceOnUse"
- x1="136.35806"
- y1="124.27161"
- x2="130.48389"
- y2="118" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974-5-4"
- id="linearGradient39841-3"
- gradientUnits="userSpaceOnUse"
- x1="115.15884"
- y1="88.476723"
- x2="109.18613"
- y2="82.308861" />
- <linearGradient
- id="linearGradient23974-5-4">
- <stop
- id="stop23976-27-1"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop23978-6-1"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-8"
- id="linearGradient39843-3"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(21,0)"
- x1="101"
- y1="84.25"
- x2="97.75"
- y2="81.5" />
- <linearGradient
- id="linearGradient1610-8">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-7" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-4" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-77"
- id="linearGradient39845-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(21,0)"
- x1="87.44548"
- y1="81.439644"
- x2="96.592278"
- y2="89.708977" />
- <linearGradient
- id="linearGradient319-77">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-9" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-31" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient22882"
- id="linearGradient41540"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0369025,0,0,1.5,-458.38567,-344)"
- x1="23.959812"
- y1="285"
- x2="31.498274"
- y2="285" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient22882"
- id="linearGradient41542"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1929722,0,0,0.5,-462.63135,-59)"
- x1="24"
- y1="285"
- x2="31.538462"
- y2="285" />
- <linearGradient
- id="linearGradient23974-4">
- <stop
- id="stop23976-20"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop23978-9"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-37"
- id="linearGradient32529-7"
- gradientUnits="userSpaceOnUse"
- x1="139.2112"
- y1="111.35809"
- x2="125.18381"
- y2="128" />
- <linearGradient
- id="linearGradient319-37">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-2" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-60" />
- </linearGradient>
- <linearGradient
- y2="125.77761"
- x2="139.07738"
- y1="115.76797"
- x1="129.62384"
- gradientUnits="userSpaceOnUse"
- id="linearGradient41582"
- xlink:href="#linearGradient23974-4"
- inkscape:collect="always" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="radialGradient41666"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8128508,0,0,0.8128508,80.474142,14.46897)"
- cx="430.00003"
- cy="77.3125"
- fx="430.00003"
- fy="77.3125"
- r="8" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient41668"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.785748,0,0,0.78488,265.93616,46.1048)"
- x1="210.08989"
- y1="38.088879"
- x2="199.27217"
- y2="38.088879" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="linearGradient41670"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(399.01387,-202)"
- x1="28.4375"
- y1="277"
- x2="23.25"
- y2="276.92188" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient41672"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.01387,0)"
- x1="437.98615"
- y1="77"
- x2="424.75217"
- y2="75.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient41674"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.01387,0)"
- x1="438.61115"
- y1="78"
- x2="424.75217"
- y2="75.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient41676"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.01387,0)"
- x1="441.98615"
- y1="77.44017"
- x2="424.75217"
- y2="75.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient42432"
- gradientUnits="userSpaceOnUse"
- x1="258.94861"
- y1="285.63672"
- x2="237.92474"
- y2="261.44183" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient42435"
- gradientUnits="userSpaceOnUse"
- x1="135.45557"
- y1="122.90726"
- x2="130.54761"
- y2="116.54932" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient42437"
- gradientUnits="userSpaceOnUse"
- x1="125.81818"
- y1="111.81818"
- x2="143.88347"
- y2="129.27184" />
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath42711">
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect42713"
- width="8.7252884"
- height="17.464855"
- x="127.4093"
- y="214.76154" />
- </clipPath>
- <linearGradient
- id="linearGradient38796-7-9">
- <stop
- style="stop-color:#fc9694;stop-opacity:1;"
- offset="0"
- id="stop38798-6-8" />
- <stop
- style="stop-color:#e71609;stop-opacity:1;"
- offset="1"
- id="stop38800-1-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient1610-87">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-78" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-3" />
- </linearGradient>
- <linearGradient
- id="linearGradient24679-1">
- <stop
- style="stop-color:#3d361a;stop-opacity:1;"
- offset="0"
- id="stop24681-0" />
- <stop
- id="stop24683-7"
- offset="0.45537567"
- style="stop-color:#d1c595;stop-opacity:1;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop24685-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient38719"
- gradientUnits="userSpaceOnUse"
- x1="125.99933"
- y1="111.2683"
- x2="134.91479"
- y2="122.36016" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient38722"
- gradientUnits="userSpaceOnUse"
- x1="126.72586"
- y1="112.53999"
- x2="134.91479"
- y2="122.36016" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13973"
- id="linearGradient38724"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(19.367382,0)"
- x1="111.46314"
- y1="113.45913"
- x2="99.628899"
- y2="99.029617" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient38726"
- gradientUnits="userSpaceOnUse"
- x1="127.63637"
- y1="114.2303"
- x2="143.69765"
- y2="131.03783" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient38005"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-157.00004,-233.00002)"
- x1="308"
- y1="323"
- x2="337.80573"
- y2="337.517" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient38007"
- gradientUnits="userSpaceOnUse"
- x1="285.39999"
- y1="323.80002"
- x2="286.60001"
- y2="325" />
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath43368-1">
- <rect
- style="fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect43370-7"
- width="16"
- height="16"
- x="-79"
- y="26" />
- </clipPath>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43276-0"
- id="radialGradient43410-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4098275,-0.6406034,2.5104141,1.6060416,-127.46107,-65.792415)"
- cx="-67.890839"
- cy="33.548397"
- fx="-67.890839"
- fy="33.548397"
- r="3.1501868" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient43276-0">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop43278-9" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop43280-4" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43276-0"
- id="radialGradient43412-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4098275,-0.7183766,2.5885772,1.4767588,-130.41049,-65.518114)"
- cx="-74.960228"
- cy="34.896461"
- fx="-74.960228"
- fy="34.896461"
- r="3.1501868" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient38796-7-9"
- id="linearGradient40270"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-21)"
- x1="59.622501"
- y1="54.1525"
- x2="60.981617"
- y2="55.566177" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-87"
- id="linearGradient40272"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.5,-21)"
- x1="60.25"
- y1="56.5"
- x2="57.789688"
- y2="54.130001" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-87"
- id="linearGradient40274"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.5,-21)"
- x1="60.25"
- y1="56.5"
- x2="56"
- y2="52.25" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-87"
- id="linearGradient40276"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1.54625,-1)"
- x1="63.666252"
- y1="37.960625"
- x2="60.676094"
- y2="34.685287" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24679-1"
- id="linearGradient40278"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-21)"
- x1="52.17437"
- y1="65.644958"
- x2="50.371208"
- y2="62.960247" />
- <linearGradient
- id="linearGradient24143-0">
- <stop
- id="stop24145-0"
- offset="0"
- style="stop-color:#2c2c2c;stop-opacity:1;" />
- <stop
- style="stop-color:#b3b3b3;stop-opacity:1;"
- offset="0.5"
- id="stop24669-1" />
- <stop
- id="stop24147-4"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-3-7"
- id="linearGradient39686-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(22,0)"
- x1="-70.605209"
- y1="-121.58411"
- x2="-28.177105"
- y2="-89.026711" />
- <linearGradient
- id="linearGradient1610-3-7">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-1-4" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-6-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-5-9-4"
- id="linearGradient39688-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(22,0)"
- x1="-74"
- y1="-124"
- x2="-55.5975"
- y2="-103.2075" />
- <linearGradient
- id="linearGradient319-5-9-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-761-8-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-89-24-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient37542-6">
- <stop
- id="stop37544-18"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-92"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient16500-3">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-3" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-41" />
- </linearGradient>
- <linearGradient
- id="linearGradient9030-1">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop9032-9" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop9034-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient59371">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop59373" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop59375" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-9-1"
- id="linearGradient42965-7"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(301.02752,449.99999)"
- x1="25.963812"
- y1="155.66899"
- x2="29.972469"
- y2="168" />
- <linearGradient
- id="linearGradient319-9-1">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-92-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-55-5" />
- </linearGradient>
- <filter
- inkscape:collect="always"
- id="filter24186-3-2"
- x="-0.12810811"
- width="1.2562162"
- y="-0.11285714"
- height="1.2257143"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.395"
- id="feGaussianBlur24188-3-7" />
- </filter>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-06-1"
- id="linearGradient42967-6"
- gradientUnits="userSpaceOnUse"
- x1="335.96875"
- y1="607.09375"
- x2="337.04251"
- y2="628.20752" />
- <linearGradient
- id="linearGradient1610-06-1">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-8-4" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-1-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient41266"
- gradientUnits="userSpaceOnUse"
- x1="98.858559"
- y1="80.045052"
- x2="135.00615"
- y2="122.92735" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient41268"
- gradientUnits="userSpaceOnUse"
- x1="130.75166"
- y1="245.03757"
- x2="129.24866"
- y2="243.31177" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient41270"
- gradientUnits="userSpaceOnUse"
- x1="126.37006"
- y1="112.31642"
- x2="144.22272"
- y2="129.82761" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient41272"
- gradientUnits="userSpaceOnUse"
- x1="190.68166"
- y1="244.14676"
- x2="174.75458"
- y2="226.33672" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient40918"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(146.00001,-20)"
- x1="108"
- y1="500"
- x2="54.8125"
- y2="500" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15809"
- id="linearGradient40920"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(146.00001,-20)"
- x1="88.874489"
- y1="502.71924"
- x2="41.311054"
- y2="501.10059" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient40922"
- gradientUnits="userSpaceOnUse"
- x1="80.768944"
- y1="504.67188"
- x2="76.885078"
- y2="501.58331" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40924"
- gradientUnits="userSpaceOnUse"
- x1="89.526657"
- y1="511.42972"
- x2="78.000008"
- y2="501.04794" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient40926"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3949409,0.3949425,-0.4243709,0.4254619,404.60763,237.35923)"
- cx="75.95578"
- cy="492.15359"
- fx="75.95578"
- fy="492.15359"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient40928"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.9435203,-2.1990242,1.1704696,1.0049395,-665.14472,173.40654)"
- cx="79.959885"
- cy="503.81497"
- fx="79.959885"
- fy="503.81497"
- r="2.9089756" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient40930"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8886193,0.8021825,-0.8051059,0.8972684,411.80247,-8.668512)"
- cx="74.518959"
- cy="499.99969"
- fx="74.518959"
- fy="499.99969"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient40932"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.054749"
- cy="499.87418"
- fx="75.054749"
- fy="499.87418"
- r="3.1650217" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-6"
- id="linearGradient36549"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.1511102,0,0,-1.1511102,152.68442,762.00423)"
- x1="-16.608393"
- y1="199.5118"
- x2="30.713354"
- y2="245.13458" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-3"
- id="radialGradient36551"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6959954,0.116912,-0.04402498,0.2620878,107.60035,414.99606)"
- cx="32.193073"
- cy="243.37001"
- fx="32.193073"
- fy="243.37001"
- r="6.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24143-0"
- id="linearGradient36553"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.9999993,0,0,-0.9821923,147.99998,720.60935)"
- x1="32.204613"
- y1="233.6039"
- x2="35.615856"
- y2="251.99768" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-3"
- id="linearGradient36555"
- gradientUnits="userSpaceOnUse"
- x1="148.76726"
- y1="134.53409"
- x2="114.11786"
- y2="101.28939" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40809"
- id="linearGradient36557"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.7500336,0,0,0.8546123,-239.89087,340.17205)"
- x1="481.60803"
- y1="163.09677"
- x2="477.10818"
- y2="163.00024" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient59371"
- id="linearGradient36559"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.7500181,0,0,0.8546123,-235.38338,339.18935)"
- x1="473.79471"
- y1="164.64572"
- x2="463.90472"
- y2="160.80888" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030-1"
- id="linearGradient36561"
- gradientUnits="userSpaceOnUse"
- x1="129.74713"
- y1="118"
- x2="144.33401"
- y2="132.61403" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-3"
- id="linearGradient36563"
- gradientUnits="userSpaceOnUse"
- x1="138.46678"
- y1="124.90586"
- x2="126.18426"
- y2="116.14438" />
- <linearGradient
- id="linearGradient9030-7-8-6">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop9032-4-9-2" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop9034-0-2-3" />
- </linearGradient>
- <linearGradient
- id="linearGradient40809-2-2">
- <stop
- style="stop-color:#0059d7;stop-opacity:1;"
- offset="0"
- id="stop40811-1-6" />
- <stop
- style="stop-color:#b7d4ff;stop-opacity:1;"
- offset="1"
- id="stop40813-4-2" />
- </linearGradient>
- <linearGradient
- id="linearGradient20055-7-5-5">
- <stop
- id="stop20057-1-7-7"
- offset="0"
- style="stop-color:#0a2a5a;stop-opacity:1;" />
- <stop
- id="stop20059-1-6-8"
- offset="1"
- style="stop-color:#3771c8;stop-opacity:1;" />
+ <linearGradient id="linearGradient37542-78">
+ <stop id="stop37544-2" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-78" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient9030-2">
+ <stop style="stop-color:white;stop-opacity:1;" offset="0" id="stop9032-0"/>
+ <stop style="stop-color:white;stop-opacity:0;" offset="1" id="stop9034-89"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542-04-82">
+ <stop id="stop37544-9-0" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-4-5" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient9030-38-2">
+ <stop style="stop-color:white;stop-opacity:1;" offset="0" id="stop9032-6-7"/>
+ <stop style="stop-color:white;stop-opacity:0;" offset="1" id="stop9034-9-6"/>
+ </linearGradient>
+ <linearGradient id="linearGradient30752-0">
+ <stop style="stop-color:#0c1b63;stop-opacity:1;" offset="0" id="stop30754-9"/>
+ <stop style="stop-color:#ffffff;stop-opacity:1" offset="1" id="stop30756-5"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542-7409-7-7-19-1">
+ <stop id="stop37544-48-6-1-8-9" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-82-1-0-6-8" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient44939-8-4-7-8-3-0-3">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop44941-8-5-40-2-4-2-4"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop44943-2-5-9-4-9-8-0"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069-9-7-5-4-6-5-0-3">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-5-4-58-5-9-1-2-1"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-43-0-4-0-8-0-4-9"/>
+ </linearGradient>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient37542-7409-7-7-0-9-9" id="radialGradient52641-2-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.39420438,-0.08239205,0.27256031,1.3040635,-361.27885,-161.73915)" cx="-302.79681" cy="462.0358" fx="-302.79681" fy="462.0358" r="8"/>
+ <linearGradient id="linearGradient37542-7409-7-7-0-9-9">
+ <stop id="stop37544-48-6-1-4-1-1" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-82-1-0-9-3-3" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-31-8-9-1">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-23-2-8-4"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-34-4-4-2"/>
+ </linearGradient>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient37542-7409-7-7-0-9-9" id="radialGradient52883-6-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.39420438,-0.08239205,0.27256031,1.3040635,-362.22886,-161.73912)" cx="-302.79681" cy="462.0358" fx="-302.79681" fy="462.0358" r="8"/>
+ <linearGradient id="linearGradient34488-1-8">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop34490-0-5-7"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop34492-4-0"/>
+ </linearGradient>
+ <linearGradient id="linearGradient32877-9-6-8">
+ <stop style="stop-color:#b3b3b3;stop-opacity:1;" offset="0" id="stop32879-8-1-1"/>
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="1" id="stop32881-4-3-9"/>
+ </linearGradient>
+ <linearGradient id="linearGradient33058-4-9-5">
+ <stop style="stop-color:#e5250b;stop-opacity:1;" offset="0" id="stop33060-3-3-9"/>
+ <stop style="stop-color:#460000;stop-opacity:1;" offset="1" id="stop33062-9-4-7"/>
+ </linearGradient>
+ <linearGradient id="linearGradient44939-8-4-8-6-8">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop44941-8-5-0-0-0"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop44943-2-5-8-6-1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient33058-2-7-1-7">
+ <stop style="stop-color:#e5250b;stop-opacity:1;" offset="0" id="stop33060-1-8-8-5"/>
+ <stop style="stop-color:#460000;stop-opacity:1;" offset="1" id="stop33062-4-3-4-5"/>
+ </linearGradient>
+ <linearGradient id="linearGradient4671-6-4-1-7">
+ <stop id="stop4673-7-6-4-1" offset="0" style="stop-color:#ffd43b;stop-opacity:1;"/>
+ <stop id="stop4675-8-0-8-1" offset="1" style="stop-color:#ffe873;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient4689-1-6-4-2">
+ <stop id="stop4691-6-2-6-7" offset="0" style="stop-color:#5a9fd4;stop-opacity:1;"/>
+ <stop id="stop4693-0-4-8-6" offset="1" style="stop-color:#306998;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-12-5">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-34-1"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-81-9"/>
+ </linearGradient>
+ <linearGradient id="linearGradient15425-8-7">
+ <stop style="stop-color:#8c0000;stop-opacity:1;" offset="0" id="stop15427-5-9"/>
+ <stop style="stop-color:#c80000;stop-opacity:0;" offset="1" id="stop15429-7-2"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-35-31-8">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-38-14-4"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-94-6-3"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-35-08-1">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-38-1-0"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-94-1-0"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-35-0">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-38-15"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-94-19"/>
+ </linearGradient>
+ <linearGradient id="linearGradient18105-2-9">
+ <stop id="stop18107-8-4" offset="0" style="stop-color:#162d50;stop-opacity:1"/>
+ <stop id="stop18109-1-4" offset="1" style="stop-color:#1e3e70;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient15531-9-5">
+ <stop style="stop-color:#20539d;stop-opacity:1" offset="0" id="stop15534-1-3"/>
+ <stop style="stop-color:#bdc9df;stop-opacity:1" offset="1" id="stop15537-7-5"/>
+ </linearGradient>
+ <linearGradient id="linearGradient23974-27-5">
+ <stop id="stop23976-25-8" offset="0" style="stop-color:#2561b7;stop-opacity:1;"/>
+ <stop id="stop23978-48-3" offset="1" style="stop-color:#f9fbff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient27277-1-8">
+ <stop id="stop27279-5-2" offset="0" style="stop-color:#444444;stop-opacity:1;"/>
+ <stop id="stop27281-4-1" offset="1" style="stop-color:#adadad;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient21327-63-5">
+ <stop style="stop-color:#1e3e70;stop-opacity:1;" offset="0" id="stop21329-9-2"/>
+ <stop style="stop-color:#1e3e70;stop-opacity:0;" offset="1" id="stop21331-6-4"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542-40-9">
+ <stop id="stop37544-6-0" offset="0" style="stop-color:#2561b7;stop-opacity:1"/>
+ <stop id="stop37546-3-3" offset="1" style="stop-color:#f9fbff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-84-1">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-78-7"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-30-96"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-84-3-2">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-78-3-8"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-30-9-8"/>
+ </linearGradient>
+ <linearGradient id="linearGradient15482-65">
+ <stop id="stop15484-4" offset="0" style="stop-color:#2869ab;stop-opacity:1"/>
+ <stop id="stop15486-2" offset="1" style="stop-color:#a7c8f0;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-6-11">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-73-0"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-51-9"/>
+ </linearGradient>
+ <linearGradient id="linearGradient15595-7">
+ <stop style="stop-color:#1b4685;stop-opacity:1;" offset="0" id="stop15597-5"/>
+ <stop style="stop-color:#183e75;stop-opacity:0;" offset="1" id="stop15599-3"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-6-1-5">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-73-4-5"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-51-8-0"/>
+ </linearGradient>
+ <linearGradient id="linearGradient1610-64-7">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-8-1"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-29-4"/>
+ </linearGradient>
+ <linearGradient id="linearGradient15275-9">
+ <stop id="stop15277-2" offset="0" style="stop-color:black;stop-opacity:1;"/>
+ <stop id="stop15279-1" offset="1" style="stop-color:white;stop-opacity:1;"/>
+ </linearGradient>
+
+ <linearGradient id="linearGradient15361-7">
+ <stop style="stop-color:#2766a6;stop-opacity:1;" offset="0" id="stop15363-7"/>
+ <stop style="stop-color:#6ba2e5;stop-opacity:1;" offset="1" id="stop15365-9"/>
+ </linearGradient>
+ <linearGradient id="linearGradient15320-0">
+ <stop style="stop-color:#0868f5;stop-opacity:1;" offset="0" id="stop15322-3"/>
+ <stop style="stop-color:#fbfdfe;stop-opacity:1;" offset="1" id="stop15324-8"/>
+ </linearGradient>
+ <linearGradient id="linearGradient23974-0-2">
+ <stop id="stop23976-22-8" offset="0" style="stop-color:#2561b7;stop-opacity:1;"/>
+ <stop id="stop23978-4-5" offset="1" style="stop-color:#f9fbff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient31320-4-3">
+ <stop style="stop-color:white;stop-opacity:1;" offset="0" id="stop31322-9-2"/>
+ <stop style="stop-color:white;stop-opacity:0;" offset="1" id="stop31324-3-5"/>
+ </linearGradient>
+ <linearGradient id="linearGradient14262-95-2">
+ <stop id="stop14264-2-2" offset="0" style="stop-color:#2661b6;stop-opacity:1;"/>
+ <stop id="stop14266-7-2" offset="1" style="stop-color:#c1d7f8;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-40-7">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-95-9"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-16-1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient23974-28-0-5">
+ <stop id="stop23976-64-2-3" offset="0" style="stop-color:#2561b7;stop-opacity:1;"/>
+ <stop id="stop23978-5-3-7" offset="1" style="stop-color:#f9fbff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-23-4">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-65-0"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-3-5"/>
+ </linearGradient>
+ <linearGradient id="linearGradient23974-48-9">
+ <stop id="stop23976-13-7" offset="0" style="stop-color:#2561b7;stop-opacity:1;"/>
+ <stop id="stop23978-28-3" offset="1" style="stop-color:#f9fbff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient20756-2-0">
+ <stop style="stop-color:#2968c3;stop-opacity:1;" offset="0" id="stop20758-7-2"/>
+ <stop style="stop-color:#b5ccf0;stop-opacity:1;" offset="1" id="stop20760-0-0"/>
+ </linearGradient>
+ <linearGradient id="linearGradient23974-1-2">
+ <stop id="stop23976-3-3" offset="0" style="stop-color:#3e7dd7;stop-opacity:0"/>
+ <stop style="stop-color:#8faedb;stop-opacity:1" offset="0.48394433" id="stop28407-8"/>
+ <stop id="stop23978-26-7" offset="1" style="stop-color:#f9fbff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient31320-0-3">
+ <stop style="stop-color:white;stop-opacity:1;" offset="0" id="stop31322-4-5"/>
+ <stop style="stop-color:white;stop-opacity:0;" offset="1" id="stop31324-9-8"/>
+ </linearGradient>
+ <linearGradient id="linearGradient14262-97-5">
+ <stop id="stop14264-0-6" offset="0" style="stop-color:#2661b6;stop-opacity:1;"/>
+ <stop id="stop14266-6-3" offset="1" style="stop-color:#c1d7f8;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-406-5">
+ <stop style="stop-color:#ffffff;stop-opacity:0" offset="0" id="stop320-76-8"/>
+ <stop style="stop-color:#ffffff;stop-opacity:1" offset="1" id="stop321-36-7"/>
+ </linearGradient>
+ <linearGradient id="linearGradient38363-7">
+ <stop id="stop38365-1" offset="0" style="stop-color:#1d4d91;stop-opacity:1"/>
+ <stop style="stop-color:#658fd4;stop-opacity:1;" offset="0.44217443" id="stop15519-3"/>
+ <stop id="stop38367-1" offset="1" style="stop-color:#c3d7ff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542-56-4">
+ <stop id="stop37544-88-5" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-9-2" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-528-2">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-68-7"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-86-7"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069-24-4">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-3-2"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-4-8"/>
+ </linearGradient>
+ <linearGradient id="linearGradient1610-67-6">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-75-5"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-31-3"/>
+ </linearGradient>
+ <linearGradient id="linearGradient9030-41-5">
+ <stop style="stop-color:white;stop-opacity:1;" offset="0" id="stop9032-2-0"/>
+ <stop style="stop-color:white;stop-opacity:0;" offset="1" id="stop9034-10-1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-76-2">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-3-9"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-18-2"/>
+ </linearGradient>
+ <linearGradient id="linearGradient24679-9-1">
+ <stop style="stop-color:#3d361a;stop-opacity:1;" offset="0" id="stop24681-7-0"/>
+ <stop id="stop24683-6-7" offset="0.45537567" style="stop-color:#d1c595;stop-opacity:1;"/>
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="1" id="stop24685-4-8"/>
+ </linearGradient>
+ <linearGradient id="linearGradient24671-1-3">
+ <stop style="stop-color:#3d361a;stop-opacity:1;" offset="0" id="stop24673-7-4"/>
+ <stop id="stop24675-7-4" offset="0.29527253" style="stop-color:#d1c595;stop-opacity:1;"/>
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="1" id="stop24677-5-5"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-16-6">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-683-4"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-08-2"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542-86-8">
+ <stop id="stop37544-39-4" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-7-6" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
</linearGradient>
- <linearGradient
- id="linearGradient16500-4-9-7">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-8-5-8" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-8-4-0" />
+ <linearGradient id="linearGradient319-0-3">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-15-31"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-26-3"/>
</linearGradient>
- <linearGradient
- id="linearGradient37829">
- <stop
- id="stop37831"
- offset="0"
- style="stop-color:#3d361a;stop-opacity:1;" />
- <stop
- style="stop-color:#d1c595;stop-opacity:1;"
- offset="0.5"
- id="stop37833" />
- <stop
- id="stop37835"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
+ <linearGradient id="linearGradient37542-86-0-1">
+ <stop id="stop37544-39-8-4" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-7-1-1" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
</linearGradient>
- <linearGradient
- id="linearGradient40578-4-8">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop40580-8-9" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop40582-6-8" />
+ <linearGradient id="linearGradient319-0-2-5">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-15-0-3"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-26-9-3"/>
</linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient39254"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,513.5,184.50451)"
- x1="253.78497"
- y1="3.6831069"
- x2="278.25537"
- y2="30.023426" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40578-4-8"
- id="radialGradient39256"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3817213,-0.4377393,0.4780868,0.4169055,368.09749,451.76937)"
- cx="756.83508"
- cy="206.40076"
- fx="756.83508"
- fy="206.40076"
- r="6.9000001" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334"
- id="linearGradient39258"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(670,-33)"
- x1="87"
- y1="241.125"
- x2="93.0625"
- y2="249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient39260"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-95.999998)"
- x1="754.28558"
- y1="300.83292"
- x2="758"
- y2="305" />
- <linearGradient
- id="linearGradient40455-7">
- <stop
- id="stop40457-6"
- offset="0"
- style="stop-color:#fff991;stop-opacity:1;" />
- <stop
- id="stop40459-1"
- offset="1"
- style="stop-color:#fffbb9;stop-opacity:0;" />
+ <linearGradient id="linearGradient37542-86-2-7">
+ <stop id="stop37544-39-5-3" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-7-2-9" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
</linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient36657"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,513.5,184.50451)"
- x1="253.78497"
- y1="3.6831069"
- x2="278.25537"
- y2="30.023426" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40578-4-8"
- id="radialGradient36659"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3817213,-0.4377393,0.4780868,0.4169055,368.09749,451.76937)"
- cx="756.83508"
- cy="206.40076"
- fx="756.83508"
- fy="206.40076"
- r="6.9000001" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334"
- id="linearGradient36661"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(670,-33)"
- x1="87"
- y1="241.125"
- x2="93.0625"
- y2="249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient36663"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-95.999998)"
- x1="754.28558"
- y1="300.83292"
- x2="758"
- y2="305" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37829"
- id="linearGradient37089"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.9999993,0,0,-0.9821923,165.4,716.20935)"
- x1="261.17639"
- y1="247.85646"
- x2="253.86414"
- y2="288.70752" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient39080"
- id="linearGradient37091"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.888884,0,0,-0.8730569,136.66557,688.20759)"
- x1="261.60016"
- y1="247.008"
- x2="263.60016"
- y2="262.27994" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030-7-8-6"
- id="linearGradient37093"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-124.99991,219.9903)"
- x1="19.923029"
- y1="232.59058"
- x2="50.485012"
- y2="265.9697" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40809-2-2"
- id="linearGradient37096"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.7500336,0,0,0.8546123,-239.89087,340.17205)"
- x1="199.26254"
- y1="144.5041"
- x2="193.7029"
- y2="144.5041" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20055-7-5-5"
- id="linearGradient37098"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-670.99999,411.99999)"
- x1="579.625"
- y1="54.299286"
- x2="576.4375"
- y2="49.84375" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-4-9-7"
- id="linearGradient37100"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-670.99999,411.99999)"
- x1="582.79974"
- y1="56.363762"
- x2="575.70361"
- y2="49.87711" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030-7-8-6"
- id="linearGradient37102"
- gradientUnits="userSpaceOnUse"
- x1="129.74713"
- y1="118"
- x2="144.33401"
- y2="132.61403" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-4-9-7"
- id="linearGradient37104"
- gradientUnits="userSpaceOnUse"
- x1="140.78264"
- y1="123.96156"
- x2="132.25548"
- y2="116.40535" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40455-7"
- id="radialGradient37553"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.7881042,0.01544832,-0.01690407,0.7184169,-16.705439,29.204304)"
- cx="-73.135666"
- cy="95.970413"
- fx="-73.135666"
- fy="95.970413"
- r="4.9999957" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37667"
- id="radialGradient37555"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4604901,-0.4901463,0.6187826,0.5813434,279.52277,457.42224)"
- cx="756.98285"
- cy="206.8443"
- fx="756.98285"
- fy="206.8443"
- r="6.9000001" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334"
- id="linearGradient37558"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(670,-33)"
- x1="89.012573"
- y1="243.96121"
- x2="93.0625"
- y2="249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient37561"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(1,-94.999998)"
- x1="754.28558"
- y1="300.83292"
- x2="758.62622"
- y2="305.53677" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40455-7-1"
- id="radialGradient37553-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.7881042,0.01544832,-0.01690407,0.7184169,-16.705439,29.204304)"
- cx="-73.227486"
- cy="95.949913"
- fx="-73.227486"
- fy="95.949913"
- r="4.9999957" />
- <linearGradient
- id="linearGradient40455-7-1">
- <stop
- id="stop40457-6-6"
- offset="0"
- style="stop-color:#fff991;stop-opacity:1;" />
- <stop
- id="stop40459-1-8"
- offset="1"
- style="stop-color:#fffbb9;stop-opacity:0;" />
+ <linearGradient id="linearGradient319-0-4-4">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-15-3-2"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-26-2-9"/>
</linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40578-4-8-7"
- id="radialGradient37555-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4769848,-0.5257394,0.6056598,0.5494938,269.68012,490.96577)"
- cx="756.83508"
- cy="206.40076"
- fx="756.83508"
- fy="206.40076"
- r="6.9000001" />
- <linearGradient
- id="linearGradient40578-4-8-7">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop40580-8-9-6" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop40582-6-8-1" />
+ <linearGradient id="linearGradient37542-86-0-6-8">
+ <stop id="stop37544-39-8-7-4" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-7-1-5-6" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
</linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334-9"
- id="linearGradient37558-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(670,-33)"
- x1="89.012573"
- y1="243.96121"
- x2="93.0625"
- y2="249" />
- <linearGradient
- id="linearGradient58334-9">
- <stop
- id="stop58336-27"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:0.87628865;" />
- <stop
- id="stop58338-9"
- offset="1.0000000"
- style="stop-color:#fffffe;stop-opacity:0.0000000;" />
+ <linearGradient id="linearGradient319-0-2-3-8">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-15-0-0-4"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-26-9-5-3"/>
</linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-4">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-31" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-23" />
+ <linearGradient id="linearGradient10069-5-1-4-8">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-9-18-9-9"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-8-252-1-7"/>
</linearGradient>
- <linearGradient
- y2="305"
- x2="758"
- y1="300.83292"
- x1="754.28558"
- gradientTransform="translate(1,-94.999998)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient37610-3"
- xlink:href="#linearGradient16500-4"
- inkscape:collect="always" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient71834"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9166695,0,0,0.9203753,-10.025729,345.78566)"
- x1="80.60067"
- y1="108.47212"
- x2="68.0271"
- y2="94.239906" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient71814"
- id="linearGradient71836"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-15.983875,338)"
- x1="70.55275"
- y1="97.5"
- x2="79.355118"
- y2="107.18619" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient71838"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9998599,0,0,0.9960071,-15.972985,338.41149)"
- x1="61.465469"
- y1="88.058716"
- x2="86.00116"
- y2="112.03586" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient38256"
- id="linearGradient37188"
- gradientUnits="userSpaceOnUse"
- x1="-22"
- y1="36.47311"
- x2="-18.85"
- y2="22.485678"
- gradientTransform="translate(522.00015,466)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37191"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(168.00015,169.99998)"
- x1="308"
- y1="323"
- x2="343.26239"
- y2="340" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37201"
- gradientUnits="userSpaceOnUse"
- x1="-26"
- y1="38"
- x2="-27"
- y2="30.200407"
- gradientTransform="translate(522.00015,466)" />
- <linearGradient
- id="linearGradient1610-7409">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-488" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-2" />
+ <linearGradient id="linearGradient36273-9-4-2-3">
+ <stop id="stop36275-9-0-3-3" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop36277-1-3-5-2" offset="1" style="stop-color:#ffffff;stop-opacity:1"/>
</linearGradient>
- <linearGradient
- id="linearGradient40578-4-8-5">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop40580-8-9-5" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop40582-6-8-17" />
+ <linearGradient id="linearGradient36273-9-4-22-0">
+ <stop id="stop36275-9-0-6-7" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop36277-1-3-6-9" offset="1" style="stop-color:#ffffff;stop-opacity:1"/>
</linearGradient>
- <linearGradient
- id="linearGradient58334-1">
- <stop
- id="stop58336-5"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:0.87628865;" />
- <stop
- id="stop58338-27"
- offset="1.0000000"
- style="stop-color:#fffffe;stop-opacity:0.0000000;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-14">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-23" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-22" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-7409"
- id="linearGradient37317"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,513.5,184.50451)"
- x1="253.78497"
- y1="3.6831069"
- x2="272.92456"
- y2="26.239208" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40578-4-8-5"
- id="radialGradient37319"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3817213,-0.4377393,0.4780868,0.4169055,368.09749,451.76937)"
- cx="756.83508"
- cy="206.40076"
- fx="756.83508"
- fy="206.40076"
- r="6.9000001" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334-1"
- id="linearGradient37321"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(670,-33)"
- x1="87"
- y1="241.125"
- x2="93.0625"
- y2="249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-14"
- id="linearGradient37323"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-95.999998)"
- x1="754.1275"
- y1="301.01553"
- x2="758.77625"
- y2="305.51749" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient37338"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(461.00015,453)"
- x1="37"
- y1="53"
- x2="36.74033"
- y2="44.322407" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient37132"
- gradientUnits="userSpaceOnUse"
- x1="510.25"
- y1="36"
- x2="494"
- y2="36"
- gradientTransform="matrix(-1,0,0,1,992,0)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37134"
- gradientUnits="userSpaceOnUse"
- x1="492"
- y1="33"
- x2="503"
- y2="43"
- gradientTransform="matrix(-1,0,0,1,992,0)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient37136"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,551,105)"
- x1="497.3125"
- y1="35"
- x2="483"
- y2="35" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient37138"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,551,105)"
- x1="497.3125"
- y1="35"
- x2="483"
- y2="35" />
- <linearGradient
- id="linearGradient40455-7-1-7">
- <stop
- id="stop40457-6-6-4"
- offset="0"
- style="stop-color:#fff991;stop-opacity:1;" />
- <stop
- id="stop40459-1-8-0"
- offset="1"
- style="stop-color:#fffbb9;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient38362"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.923955,0,0,1,2.85168,-84)"
- x1="-9.3937483"
- y1="203.3882"
- x2="28.275171"
- y2="249.73875" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40455-7-1-7"
- id="radialGradient38364"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1033468,0.01995877,-0.02366572,0.9281732,7.8124646,13.285893)"
- cx="-73.972397"
- cy="94.935921"
- fx="-73.972397"
- fy="94.935921"
- r="4.9999957" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient38367"
- gradientUnits="userSpaceOnUse"
- x1="19.210167"
- y1="143.17894"
- x2="38.580528"
- y2="167.11429"
- gradientTransform="matrix(1,0,0,0.8461542,0,25.615323)" />
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath43368-7">
- <rect
- style="fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect43370-1"
- width="16"
- height="16"
- x="-79"
- y="26" />
- </clipPath>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient43276-6">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop43278-0" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop43280-49" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43276-6"
- id="radialGradient38734"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4098275,-0.6406034,2.5104141,1.6060416,-127.46107,-65.792415)"
- cx="-67.890839"
- cy="33.548397"
- fx="-67.890839"
- fy="33.548397"
- r="3.1501868" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43276-6"
- id="radialGradient38736"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4098275,-0.7183766,2.5885772,1.4767588,-130.41049,-65.518114)"
- cx="-74.960228"
- cy="34.896461"
- fx="-74.960228"
- fy="34.896461"
- r="3.1501868" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient38049"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="121.22078"
- y2="56.357628" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient38051"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(207,-246.99988)"
- x1="-56.5"
- y1="342.0625"
- x2="-49"
- y2="341" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37530"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="121.22078"
- y2="56.357628" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient37534"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(207,-246.99988)"
- x1="-56.5"
- y1="342.0625"
- x2="-49"
- y2="341" />
- <linearGradient
- id="linearGradient1610-6">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-18" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-92" />
- </linearGradient>
- <linearGradient
- id="linearGradient10069-9">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-5" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-43" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9"
- id="linearGradient38254"
- gradientUnits="userSpaceOnUse"
- x1="124.19057"
- y1="111.30384"
- x2="134.62978"
- y2="120.14633" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-6"
- id="linearGradient37509"
- gradientUnits="userSpaceOnUse"
- x1="189.76083"
- y1="248.13905"
- x2="116.05637"
- y2="183.6826" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9"
- id="linearGradient37613"
- gradientUnits="userSpaceOnUse"
- x1="123.80045"
- y1="111.03492"
- x2="132.99687"
- y2="118.98331" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-6"
- id="linearGradient37615"
- gradientUnits="userSpaceOnUse"
- x1="189.76083"
- y1="248.13905"
- x2="116.05637"
- y2="183.6826" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15425-4-9-8"
- id="linearGradient38073-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,22)"
- x1="-14.752135"
- y1="101.82622"
- x2="-45.074585"
- y2="68.279541" />
- <linearGradient
- id="linearGradient15425-4-9-8">
- <stop
- style="stop-color:#960000;stop-opacity:1;"
- offset="0"
- id="stop15427-5-8-24" />
- <stop
- style="stop-color:#c80000;stop-opacity:0;"
- offset="1"
- id="stop15429-8-2-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060-1"
- id="linearGradient38075-5"
- gradientUnits="userSpaceOnUse"
- x1="137.33838"
- y1="124.67571"
- x2="131.35606"
- y2="118.00494" />
- <linearGradient
- id="linearGradient5060-1">
- <stop
- id="stop5062-7"
- offset="0"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- id="stop5064-1"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-52"
- id="linearGradient38077-1"
- gradientUnits="userSpaceOnUse"
- x1="127.15736"
- y1="111.48302"
- x2="146.01884"
- y2="136.15825" />
- <linearGradient
- id="linearGradient319-52">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-7614" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-232" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15425-4-9-8"
- id="linearGradient38079-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,22)"
- x1="-15"
- y1="101"
- x2="-22"
- y2="94" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14418-6"
- id="linearGradient14433-1"
- gradientUnits="userSpaceOnUse"
- x1="139.29807"
- y1="127.35454"
- x2="130.33557"
- y2="115.81818" />
- <linearGradient
- id="linearGradient14418-6">
- <stop
- id="stop14420-8"
- offset="0"
- style="stop-color:#fa2509;stop-opacity:1;" />
- <stop
- id="stop14422-5"
- offset="1"
- style="stop-color:#fa2509;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-52"
- id="linearGradient14435-7"
- gradientUnits="userSpaceOnUse"
- x1="125.36379"
- y1="110.81054"
- x2="135.22182"
- y2="120.76331" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-52"
- id="linearGradient14437-6"
- gradientUnits="userSpaceOnUse"
- x1="125.81818"
- y1="111.81818"
- x2="141.43347"
- y2="127.52184" />
- <filter
- inkscape:collect="always"
- id="filter15421-1"
- x="-0.23999846"
- width="1.4799969"
- y="-0.24000154"
- height="1.4800031"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.29233622"
- id="feGaussianBlur15423-8" />
- </filter>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-2"
- id="linearGradient14439-9"
- gradientUnits="userSpaceOnUse"
- x1="125.20553"
- y1="111.38132"
- x2="132.35237"
- y2="118.69846" />
- <linearGradient
- id="linearGradient10069-2">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-79" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-52"
- id="linearGradient14441-4"
- gradientUnits="userSpaceOnUse"
- x1="125.81818"
- y1="111.81818"
- x2="143.88347"
- y2="129.27184" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient48327-1"
- id="radialGradient38306-3"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.4461753,0.01083717,0.0036163,6.752143,-191.34795,-740.3814)"
- cx="131.99811"
- cy="126.63337"
- fx="131.99811"
- fy="126.63337"
- r="9.1978254" />
- <linearGradient
- id="linearGradient48327-1">
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="0"
- id="stop48329-23" />
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="1"
- id="stop48331-3" />
- </linearGradient>
- <linearGradient
- y2="118.69846"
- x2="132.35237"
- y1="111.38132"
- x1="125.20553"
- gradientUnits="userSpaceOnUse"
- id="linearGradient37646-4"
- xlink:href="#linearGradient10069-74-1"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient10069-74-1">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-0-1" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-9-3" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-7409-3-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-48-8-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-82-6-27" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-7409-3-7"
- id="linearGradient38313-7"
- gradientUnits="userSpaceOnUse"
- x1="125.81818"
- y1="111.81818"
- x2="143.88347"
- y2="129.27184" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-7409-3-7"
- id="linearGradient37677"
- gradientUnits="userSpaceOnUse"
- x1="130.60338"
- y1="115.87343"
- x2="143.88347"
- y2="129.27184" />
- <linearGradient
- id="linearGradient319-19">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-865" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-02" />
- </linearGradient>
- <linearGradient
- id="linearGradient10069-8-3-3">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-9-8-7" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-2-7-1" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-95-2-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-43-7-3" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-12-7-4" />
- </linearGradient>
- <linearGradient
- id="linearGradient21327-6">
- <stop
- style="stop-color:#1e3e70;stop-opacity:1;"
- offset="0"
- id="stop21329-3" />
- <stop
- style="stop-color:#1e3e70;stop-opacity:0;"
- offset="1"
- id="stop21331-4" />
- </linearGradient>
- <linearGradient
- id="linearGradient20055-8-4">
- <stop
- id="stop20057-8-0"
- offset="0"
- style="stop-color:#0a2a5a;stop-opacity:1;" />
- <stop
- id="stop20059-2-0"
- offset="1"
- style="stop-color:#3771c8;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient39088">
- <stop
- id="stop39090"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop39092"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient1610-83">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-24" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-11" />
- </linearGradient>
- <linearGradient
- id="linearGradient10069-95">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-10" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-64" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient11871-3">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop11873-0" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop11875-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient10069-3">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-87" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-42" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40171"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="120.06789"
- y2="54.6674" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40173"
- gradientUnits="userSpaceOnUse"
- x1="-56.5"
- y1="340.32199"
- x2="-56.5"
- y2="348" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40175"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,13)"
- x1="-56.8125"
- y1="329.06256"
- x2="-47.214466"
- y2="329.26965" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40280"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="120.06789"
- y2="54.6674" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40282"
- gradientUnits="userSpaceOnUse"
- x1="-56.5"
- y1="340.32199"
- x2="-56.5"
- y2="348" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40284"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,13)"
- x1="-56.8125"
- y1="329.06256"
- x2="-47.214466"
- y2="329.26965" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient38689"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-420,490.00041)"
- x1="301.5"
- y1="-105.87541"
- x2="340"
- y2="-65.250412" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient38693"
- gradientUnits="userSpaceOnUse"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient38695"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(6,0)"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient38697"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,6)"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient38701"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(6,6)"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-7"
- id="linearGradient38703"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(24,-6)"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient38706"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,-1,-157,821.03125)"
- x1="-90.5"
- y1="413.51562"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient38720"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3846148,0,0,1,-211.38442,490.00041)"
- x1="301.5"
- y1="-105.87541"
- x2="340"
- y2="-65.250412" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient38723"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(8,0)"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient38725"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(8,6)"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-7"
- id="linearGradient38727"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(24,-6)"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient38729"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,-1,-156,821.03125)"
- x1="-89.75"
- y1="413.98114"
- x2="-86.75"
- y2="416.32614" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-7"
- id="linearGradient38731"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(24,-2.4825165)"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient38736"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,-1,-156,824.54874)"
- x1="-89.75"
- y1="413.98114"
- x2="-86.75"
- y2="416.32614" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient39199"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-420,490.00041)"
- x1="301.5"
- y1="-105.87541"
- x2="340"
- y2="-65.250412" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient39201"
- gradientUnits="userSpaceOnUse"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient39203"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(6,0)"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient39205"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,6)"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient39207"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(6,6)"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient39246"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-420,490.00041)"
- x1="301.5"
- y1="-105.87541"
- x2="340"
- y2="-65.250412" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient39248"
- gradientUnits="userSpaceOnUse"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient39252"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(6,0)"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient39255"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,6)"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient39259"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(6,6)"
- x1="-97"
- y1="408"
- x2="-88"
- y2="413.51562" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-83"
- id="linearGradient38961"
- gradientUnits="userSpaceOnUse"
- x1="488.5"
- y1="568"
- x2="495"
- y2="568" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask38956">
- <rect
- style="fill:url(#linearGradient38961);stroke:none;stroke-width:2.79999995;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect38958"
- width="16"
- height="12"
- x="488"
- y="560"
- rx="0"
- ry="0" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-83"
- id="linearGradient39115"
- gradientUnits="userSpaceOnUse"
- x1="487.2518"
- y1="531.95105"
- x2="490.65796"
- y2="580.63715" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient11871-3"
- id="linearGradient39117"
- gradientUnits="userSpaceOnUse"
- x1="496.49335"
- y1="537.78113"
- x2="498.40021"
- y2="540.13623" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient11871-3"
- id="linearGradient39119"
- gradientUnits="userSpaceOnUse"
- x1="495.85294"
- y1="541.69116"
- x2="495.25"
- y2="539.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-3"
- id="linearGradient39122"
- gradientUnits="userSpaceOnUse"
- x1="494.38467"
- y1="532.42651"
- x2="496.21078"
- y2="541.02698" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40703"
- id="linearGradient39261"
- gradientUnits="userSpaceOnUse"
- x1="122.25188"
- y1="106.08706"
- x2="147.08464"
- y2="134.12131" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient39263"
- gradientUnits="userSpaceOnUse"
- x1="116.75861"
- y1="97.375854"
- x2="145.729"
- y2="137.52937" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient39265"
- gradientUnits="userSpaceOnUse"
- x1="190.68166"
- y1="244.14676"
- x2="174.75458"
- y2="226.33672" />
- <linearGradient
- id="linearGradient319-46">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-03" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-62" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-46"
- id="linearGradient39508"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-20,0)"
- x1="39.102718"
- y1="641.73358"
- x2="58.680996"
- y2="661.93829" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43807"
- id="linearGradient39518"
- gradientUnits="userSpaceOnUse"
- x1="648.09674"
- y1="355.85541"
- x2="634.09503"
- y2="341.23715" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient39088"
- id="linearGradient39520"
- gradientUnits="userSpaceOnUse"
- x1="696.63055"
- y1="403.93069"
- x2="643.71313"
- y2="349.93216" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-95"
- id="linearGradient39523"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8461524,0,0,0.8461523,99.385524,54.308237)"
- x1="633.10468"
- y1="338.95337"
- x2="649.69073"
- y2="354.92981" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient39716"
- gradientUnits="userSpaceOnUse"
- x1="121.80637"
- y1="106.4641"
- x2="142.1468"
- y2="132.44617" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient39718"
- gradientUnits="userSpaceOnUse"
- x1="190.68166"
- y1="244.14676"
- x2="174.75458"
- y2="226.33672" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40189"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9998599,0,0,0.9960071,131.027,-79.5885)"
- x1="57.347244"
- y1="82.75322"
- x2="86.00116"
- y2="112.03586" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40202"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9166695,0,0,0.9203753,136.97426,-72.21433)"
- x1="80.60067"
- y1="108.47212"
- x2="68.0271"
- y2="94.239906" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40295"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9166695,0,0,0.9203753,136.97426,-72.21433)"
- x1="80.60067"
- y1="108.47212"
- x2="68.0271"
- y2="94.239906" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient40297"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9998599,0,0,0.9960071,131.027,-79.5885)"
- x1="57.347244"
- y1="82.75322"
- x2="86.00116"
- y2="112.03586" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask40306">
- <path
- id="path40308"
- d="m 195,11.00001 0,14 0.5,0 13.5,-13.5 0,-0.5 -14,0 z"
- style="fill:#ffffff;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="cccccc" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40703-5-5"
- id="linearGradient39261-4-5"
- gradientUnits="userSpaceOnUse"
- x1="128.09367"
- y1="112.43961"
- x2="145.20987"
- y2="133.4879" />
- <linearGradient
- id="linearGradient40703-5-5">
- <stop
- style="stop-color:#143564;stop-opacity:1;"
- offset="0"
- id="stop40705-8-2" />
- <stop
- style="stop-color:#c1d7f8;stop-opacity:1;"
- offset="1"
- id="stop40707-8-7" />
- </linearGradient>
- <linearGradient
- id="linearGradient38252-9">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop38254-3" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop38256-1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-74-9-1"
- id="linearGradient40511-7-9-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,-270.46874,9.59825)"
- x1="256.14325"
- y1="5.6181068"
- x2="278.79254"
- y2="29.688427" />
- <linearGradient
- id="linearGradient1610-74-9-1">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-0-8-7" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-9-3-1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334-8-6-5"
- id="linearGradient40507-4-8-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-114,-208)"
- x1="87"
- y1="241.125"
- x2="93.0625"
- y2="249" />
- <linearGradient
- id="linearGradient58334-8-6-5">
- <stop
- id="stop58336-8-9-2"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:0.87628865;" />
- <stop
- id="stop58338-24-8-7"
- offset="1.0000000"
- style="stop-color:#fffffe;stop-opacity:0.0000000;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-5-6-1"
- id="radialGradient40649-2-6-6"
- cx="-27.749987"
- cy="32.615383"
- fx="-27.749987"
- fy="32.615383"
- r="5.5"
- gradientTransform="matrix(0.4545454,0.3636364,-0.3862167,0.4827711,-2.5397644,26.345139)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-5-6-1">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-17-2-4" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-11-3-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-5-6-1"
- id="linearGradient40502-7-8-3"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-784,-271)"
- x1="754"
- y1="300.5"
- x2="758"
- y2="305" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-5-6-2"
- id="linearGradient40635-7-2-2"
- gradientUnits="userSpaceOnUse"
- x1="125.99933"
- y1="111.2683"
- x2="134.91479"
- y2="122.36016" />
- <linearGradient
- id="linearGradient319-5-6-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-761-2-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-89-7-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-5-6-2"
- id="linearGradient40637-9-5-8"
- gradientUnits="userSpaceOnUse"
- x1="126.72586"
- y1="112.53999"
- x2="134.91479"
- y2="122.36016" />
- <filter
- inkscape:collect="always"
- id="filter13996-9-7-7"
- x="-0.23644176"
- width="1.4728835"
- y="-0.24368355"
- height="1.4873672"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.29550651"
- id="feGaussianBlur13998-5-8-6" />
- </filter>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13973-3-7-8"
- id="linearGradient40639-1-2-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(19.367382,0)"
- x1="111.2239"
- y1="112.62726"
- x2="99.628899"
- y2="99.029617" />
- <linearGradient
- id="linearGradient13973-3-7-8">
- <stop
- style="stop-color:#3c4c18;stop-opacity:1;"
- offset="0"
- id="stop13975-1-8-9" />
- <stop
- style="stop-color:#9aff31;stop-opacity:0;"
- offset="1"
- id="stop13977-2-0-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-5-6-2"
- id="linearGradient40641-9-2-7"
- gradientUnits="userSpaceOnUse"
- x1="127.63637"
- y1="114.2303"
- x2="143.69765"
- y2="131.03783" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-74-9-1"
- id="linearGradient41638-8-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,-270.46874,9.59825)"
- x1="256.14325"
- y1="5.6181068"
- x2="278.79254"
- y2="29.688427" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334-8-6-5"
- id="linearGradient41640-2-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-114,-208)"
- x1="87"
- y1="241.125"
- x2="93.0625"
- y2="249" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-5-6-1"
- id="radialGradient41642-5-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4545454,0.3636364,-0.3862167,0.4827711,-2.5397644,26.345139)"
- cx="-27.749987"
- cy="32.615383"
- fx="-27.749987"
- fy="32.615383"
- r="5.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-5-6-1"
- id="linearGradient41644-5-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-784,-271)"
- x1="754"
- y1="300.5"
- x2="758"
- y2="305" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-3-0-7-6"
- id="linearGradient40875-3-9-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.695652,0,0,0.869703,-44.93485,-114.66358)"
- x1="188.77448"
- y1="259.745"
- x2="164.0939"
- y2="242.22473" />
- <linearGradient
- id="linearGradient37542-3-0-7-6">
- <stop
- id="stop37544-1-6-6-5"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-2-1-7-0"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-34-8-7-0"
- id="linearGradient40877-5-5-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(357.00001,373)"
- x1="-287.75"
- y1="-276.75"
- x2="-276"
- y2="-264.875" />
- <linearGradient
- id="linearGradient319-34-8-7-0">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-11-9-8-0" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-38-3-1-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-3-0-7-6"
- id="linearGradient40879-9-8-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.608695,0,0,0.760996,-26.1305,-84.76968)"
- x1="130.70929"
- y1="210.78392"
- x2="171.50414"
- y2="248.54021" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-34-8-7-0"
- id="linearGradient40881-8-0-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(361.00001,376)"
- x1="-283"
- y1="-272"
- x2="-277.01501"
- y2="-267.26749" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-7-6-7-4"
- id="radialGradient40883-4-0-3"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.06118084,-0.8594818,2.4629674,-0.1753088,-259.40057,190.15309)"
- cx="77.721619"
- cy="104.09358"
- fx="77.721619"
- fy="104.09358"
- r="3.9999998" />
- <linearGradient
- id="linearGradient10069-7-6-7-4">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-81-3-2-4" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-6-7-5-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-3-0-7-6"
- id="linearGradient39136-2-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.695652,0,0,0.869703,-44.93485,-114.66358)"
- x1="188.77448"
- y1="259.745"
- x2="164.0939"
- y2="242.22473" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-34-8-7-0"
- id="linearGradient39138-8-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(357.00001,373)"
- x1="-287.75"
- y1="-276.75"
- x2="-276"
- y2="-264.875" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-3-0-7-6"
- id="linearGradient39140-6-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.608695,0,0,0.760996,-26.1305,-84.76968)"
- x1="130.70929"
- y1="210.78392"
- x2="174.35753"
- y2="250.6842" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-34-8-7-0"
- id="linearGradient39143-0-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(361.00001,376)"
- x1="-283"
- y1="-272"
- x2="-277.01501"
- y2="-267.26749" />
- <linearGradient
- id="linearGradient319-17-1-6">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-115-1-5" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-27-3-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-17-1-6"
- id="linearGradient40679"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.7972867,-259.00009,90.24189)"
- x1="255.63673"
- y1="99.513062"
- x2="275.1503"
- y2="129.36641" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient25417"
- id="linearGradient40731"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.997161,-259.00079,67.35344)"
- x1="280.0918"
- y1="129.28557"
- x2="267.20212"
- y2="116.41341" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-17-1-6"
- id="linearGradient40733"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.7972867,-259.00009,90.24189)"
- x1="255.63673"
- y1="99.513062"
- x2="275.1503"
- y2="129.36641" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-17-1-6-7"
- id="linearGradient40733-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.7972867,-259.00009,90.24189)"
- x1="255.63673"
- y1="99.513062"
- x2="275.1503"
- y2="129.36641" />
- <linearGradient
- id="linearGradient319-17-1-6-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-115-1-5-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-27-3-7-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-17-1-6-8"
- id="linearGradient40733-03"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.7972867,-259.00009,90.24189)"
- x1="255.63673"
- y1="99.513062"
- x2="275.1503"
- y2="129.36641" />
- <linearGradient
- id="linearGradient319-17-1-6-8">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-115-1-5-0" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-27-3-7-1" />
- </linearGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath40897">
- <rect
- y="198"
- x="-41"
- height="16"
- width="15"
- id="rect40899"
- style="opacity:0.45;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.29999995;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- transform="scale(-1,1)" />
- </clipPath>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath40902">
- <rect
- y="197"
- x="-22"
- height="17"
- width="15"
- id="rect40904"
- style="opacity:0.45;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.29999995;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- transform="scale(-1,1)" />
- </clipPath>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient38478"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(254.01612,-211.00101)"
- x1="96.824379"
- y1="393.90298"
- x2="94.246101"
- y2="391.21976" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask38474">
- <rect
- style="fill:url(#linearGradient38478);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect38476"
- width="15"
- height="15"
- x="343.01611"
- y="174.99901" />
- </mask>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="radialGradient44318"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.050372,0,0,1.050372,-3.551238,-0.730396)"
- cx="70.5"
- cy="14.5"
- fx="70.5"
- fy="14.5"
- r="1.5" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="radialGradient44320"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5399935,0.3131662,-0.3907892,0.5793905,38.141764,-16.056748)"
- cx="70.470596"
- cy="14.649424"
- fx="70.470596"
- fy="14.649424"
- r="5.5192375" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-19"
- id="linearGradient42988"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="121.22078"
- y2="56.357628" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-19"
- id="linearGradient42990"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(207,-246.99988)"
- x1="-56.5"
- y1="342.0625"
- x2="-49"
- y2="341" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-8-3-3"
- id="linearGradient42992"
- gradientUnits="userSpaceOnUse"
- x1="126.55782"
- y1="113.57294"
- x2="132.41052"
- y2="118.81034" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-95-2-7"
- id="linearGradient42994"
- gradientUnits="userSpaceOnUse"
- x1="132"
- y1="117.26753"
- x2="142.72656"
- y2="127.72736" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-8-3-3"
- id="linearGradient42996"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(4.9999967,20)"
- x1="-114.75"
- y1="546.5"
- x2="-110.5"
- y2="542.5" />
- <linearGradient
- id="linearGradient44627">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop44629" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop44631" />
- </linearGradient>
- <linearGradient
- id="linearGradient10069-9-7-4-74">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-5-4-5-0" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-43-0-5-9" />
- </linearGradient>
- <linearGradient
- id="linearGradient44939-8">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop44941-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop44943-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8"
- id="linearGradient44485"
- gradientUnits="userSpaceOnUse"
- x1="279.75"
- y1="101.5"
- x2="284.5"
- y2="106.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8"
- id="linearGradient44942"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-21)"
- x1="351.71875"
- y1="106.93575"
- x2="339.125"
- y2="105.092" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8"
- id="linearGradient44944"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,-1,698,183)"
- x1="351.15625"
- y1="108.35222"
- x2="336.40625"
- y2="106.19597" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8"
- id="linearGradient44950"
- gradientUnits="userSpaceOnUse"
- x1="279"
- y1="102"
- x2="281.75"
- y2="102"
- gradientTransform="matrix(-1,0,0,1,593.02125,-1.8e-6)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8"
- id="linearGradient44954"
- gradientUnits="userSpaceOnUse"
- x1="279.75"
- y1="101.5"
- x2="283"
- y2="105.5"
- gradientTransform="matrix(0,1,1,0,225,-182.99437)" />
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath45147">
- <path
- sodipodi:nodetypes="ccccccccccccccccccccccc"
- id="path45149"
- d="m 5,261 13,0 0,1 -1,0 0,1 1,0 0,1 -1,0 0,1 -1,0 0,2 2,0 0,-1 1,0 0,-1 1,0 0,1 1,0 0,-1 1,0 0,13 -17,0 0,-17 z"
- style="opacity:0.2;fill:#3771c8;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- </clipPath>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient45220"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,221,10)"
- x1="115.84575"
- y1="10.8125"
- x2="106.125"
- y2="19.9375" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient38252-9"
- id="linearGradient45283"
- gradientUnits="userSpaceOnUse"
- x1="125.86876"
- y1="111.85698"
- x2="130.88379"
- y2="121.70699" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient38252-9"
- id="linearGradient45285"
- gradientUnits="userSpaceOnUse"
- x1="134.78751"
- y1="122.29202"
- x2="132.60205"
- y2="117.96092" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-4-74"
- id="radialGradient45309"
- cx="336.42892"
- cy="611.10455"
- fx="336.42892"
- fy="611.10455"
- r="5.9852905"
- gradientTransform="matrix(1.0070601,0.03386866,-0.03770425,1.1211085,20.665977,-85.772965)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44627"
- id="linearGradient43826"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,1444.9824,-215)"
- x1="689.47357"
- y1="427"
- x2="685.47357"
- y2="427" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask43822">
- <rect
- y="208"
- x="754"
- height="9"
- width="12"
- id="rect43824"
- style="opacity:0.93999993;fill:url(#linearGradient43826);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient43856"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,61.53822,346.48241)"
- x1="246.89435"
- y1="-4.4418921"
- x2="277.68143"
- y2="30.743095" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient43858"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(218.01612,129)"
- x1="87.03125"
- y1="241"
- x2="92.8125"
- y2="245.625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient46780"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,140,-415)"
- x1="172.5625"
- y1="601.5"
- x2="159.13864"
- y2="585.28772" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient46782"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,237.98388,150.25)"
- x1="249.64528"
- y1="1.5973248"
- x2="271.98389"
- y2="35.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient46784"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,140,-415)"
- x1="172.5625"
- y1="601.5"
- x2="159.13864"
- y2="585.28772" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient46786"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,237.98388,150.25)"
- x1="249.64528"
- y1="1.5973248"
- x2="271.98389"
- y2="35.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient46818"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,140,-415)"
- x1="172.5625"
- y1="601.5"
- x2="159.13864"
- y2="585.28772" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient46820"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,237.98388,150.25)"
- x1="249.64528"
- y1="1.5973248"
- x2="271.98389"
- y2="35.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient46822"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,140,-415)"
- x1="172.5625"
- y1="601.5"
- x2="159.13864"
- y2="585.28772" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient46824"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,237.98388,150.25)"
- x1="249.64528"
- y1="1.5973248"
- x2="271.98389"
- y2="35.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient46990"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,140,-415)"
- x1="172.5625"
- y1="601.5"
- x2="159.13864"
- y2="585.28772" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient46992"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,237.98388,150.25)"
- x1="249.64528"
- y1="1.5973248"
- x2="271.98389"
- y2="35.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient46994"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,140,-415)"
- x1="172.5625"
- y1="601.5"
- x2="159.13864"
- y2="585.28772" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient46996"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,237.98388,150.25)"
- x1="249.64528"
- y1="1.5973248"
- x2="271.98389"
- y2="35.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient46998"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,140,-415)"
- x1="172.5625"
- y1="601.5"
- x2="159.13864"
- y2="585.28772" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient47000"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,237.98388,150.25)"
- x1="249.64528"
- y1="1.5973248"
- x2="271.98389"
- y2="35.75" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="radialGradient25048"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5274943,0,0,0.7696585,194.81546,86.715119)"
- cx="412.10059"
- cy="375.96332"
- fx="412.10059"
- fy="375.96332"
- r="4.4262571" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient25108"
- id="linearGradient25106"
- gradientUnits="userSpaceOnUse"
- x1="408.91928"
- y1="373.01221"
- x2="410.55432"
- y2="375.5058" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient25108"
- id="linearGradient25117"
- gradientUnits="userSpaceOnUse"
- x1="411.05389"
- y1="375.39175"
- x2="407.62576"
- y2="370.21317" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient25449"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,-346.7085,428.4841)"
- x1="352.98236"
- y1="314.11398"
- x2="353.72073"
- y2="297.92099" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient25108"
- id="linearGradient25451"
- gradientUnits="userSpaceOnUse"
- x1="436.54755"
- y1="524.30481"
- x2="434.49387"
- y2="519.46057" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient25108"
- id="linearGradient25453"
- gradientUnits="userSpaceOnUse"
- x1="432.0849"
- y1="524.97125"
- x2="433"
- y2="526" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="radialGradient25457"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5274943,0,0,0.7696585,194.81546,86.715119)"
- cx="410.73904"
- cy="370.11554"
- fx="410.73904"
- fy="370.11554"
- r="4.4262571" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8"
- id="linearGradient23543"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,1,0,225,-182.99437)"
- x1="279.75"
- y1="101.5"
- x2="283"
- y2="105.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8"
- id="linearGradient23557"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,1,0,225,-182.99437)"
- x1="279"
- y1="102"
- x2="281.75"
- y2="102" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8"
- id="linearGradient23559"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,1,0,225,-182.99437)"
- x1="292.25"
- y1="106.5"
- x2="289.5"
- y2="109.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24343"
- id="linearGradient24341"
- x1="413.9498"
- y1="386.45807"
- x2="406.7699"
- y2="374.42419"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24343"
- id="linearGradient24349"
- gradientUnits="userSpaceOnUse"
- x1="403.9577"
- y1="367.62839"
- x2="413.98795"
- y2="374.07153" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient21327-6"
- id="radialGradient24354"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6402148,-1.1088846,0.8413297,0.4857498,104.42892,800.46622)"
- cx="409.55594"
- cy="52.367992"
- fx="409.55594"
- fy="52.367992"
- r="3.8798895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient34157"
- id="linearGradient24511"
- gradientUnits="userSpaceOnUse"
- x1="270.66064"
- y1="68.113258"
- x2="257.38638"
- y2="81.382545" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient24513"
- gradientUnits="userSpaceOnUse"
- x1="256.90005"
- y1="80.100891"
- x2="262.43726"
- y2="74.562462" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29149"
- id="radialGradient24515"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.217888"
- cy="500.66806"
- fx="75.217888"
- fy="500.66806"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient24517"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.554794"
- cy="500.26215"
- fx="75.554794"
- fy="500.26215"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient24519"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6691529,0,4.3047361e-8,0.6954014,84.50351,24.951375)"
- cx="259.02887"
- cy="77.962585"
- fx="259.02887"
- fy="77.962585"
- r="3.5" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient24523"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.3879142,0,8.9286134e-8,1.4423572,-101.87942,-32.970267)"
- cx="259.55096"
- cy="77.188034"
- fx="259.55096"
- fy="77.188034"
- r="3.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30208"
- id="linearGradient25056"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1297,-948)"
- x1="1663.8125"
- y1="722"
- x2="1661.8125"
- y2="726.37006" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient19425"
- id="radialGradient25058"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.1378252,-0.2988982,2.5269117,1.1651875,-1689.2674,-563.64056)"
- cx="1662.2664"
- cy="722.19189"
- fx="1662.2664"
- fy="722.19189"
- r="5.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient25060"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,-1256.7473,-918.72044)"
- x1="1984.3658"
- y1="827.77124"
- x2="1979.2772"
- y2="827.32849" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient29407"
- gradientUnits="userSpaceOnUse"
- x1="98.858559"
- y1="80.045052"
- x2="135.00615"
- y2="122.92735" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient29409"
- gradientUnits="userSpaceOnUse"
- x1="130.75166"
- y1="245.03757"
- x2="129.24866"
- y2="243.31177" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient29411"
- gradientUnits="userSpaceOnUse"
- x1="126.37006"
- y1="112.31642"
- x2="144.22272"
- y2="129.82761" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient29413"
- gradientUnits="userSpaceOnUse"
- x1="190.68166"
- y1="244.14676"
- x2="174.75458"
- y2="226.33672" />
- <linearGradient
- id="linearGradient44939-8-7-1-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop44941-8-4-5-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop44943-2-0-2-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-7"
- id="linearGradient37396-1"
- gradientUnits="userSpaceOnUse"
- x1="389.73953"
- y1="220.84622"
- x2="389.59052"
- y2="248.09296"
- gradientTransform="matrix(-1,0,0,1,780.92531,0)" />
- <linearGradient
- id="linearGradient37542-7">
- <stop
- id="stop37544-40"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-94"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-5"
- id="linearGradient15742-5"
- gradientUnits="userSpaceOnUse"
- x1="392.0101"
- y1="222.99998"
- x2="392.0101"
- y2="247.99998"
- gradientTransform="matrix(0,1,-1,0,634.98585,-146.00607)" />
- <linearGradient
- id="linearGradient37542-5">
- <stop
- id="stop37544-1"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-71"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27854"
- id="linearGradient27860"
- x1="392.02036"
- y1="241.13428"
- x2="386.30408"
- y2="241.31801"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient27872"
- gradientUnits="userSpaceOnUse"
- x1="392.0101"
- y1="224.99998"
- x2="392.0101"
- y2="249.99998"
- gradientTransform="matrix(-1,0,0,1,782.02022,0)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27854"
- id="linearGradient27874"
- gradientUnits="userSpaceOnUse"
- x1="390.87131"
- y1="241.13428"
- x2="386.74603"
- y2="242.46706"
- gradientTransform="matrix(-1,0,0,1,782.02022,0)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-5"
- id="linearGradient27886"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,1,0,146.99795,-188.00607)"
- x1="392.0101"
- y1="222.99998"
- x2="392.0101"
- y2="247.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27896"
- id="linearGradient27902"
- x1="388.70071"
- y1="244.85669"
- x2="391.17557"
- y2="249.54126"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient10069-9-71">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-5-1" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-43-5" />
- </linearGradient>
- <linearGradient
- id="linearGradient23974-2">
- <stop
- id="stop23976-2"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop23978-1"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath28964">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="fill:url(#linearGradient28968);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline;enable-background:new"
- d="m 117.50984,228.63415 0,-15.01646 11.71735,5.49383 0,15.38271 -11.71735,-5.86008 z"
- id="path28966" />
- </clipPath>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974-2"
- id="linearGradient28968"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.4646688,0,0,1.4650206,168.77325,-157.03253)"
- x1="-38.103703"
- y1="266.11719"
- x2="-20.826464"
- y2="253.23859" />
- <linearGradient
- id="linearGradient319-5">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-761" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-7"
- id="linearGradient29424"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.4646688,0,0,1.4650206,168.77325,-157.03253)"
- x1="-26.511335"
- y1="257.99881"
- x2="-30.075666"
- y2="259.87677" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask29419">
- <path
- id="path29422"
- d="m 117.50984,229.00041 0,-15.38272 11.71735,5.49383 0,15.74897 -11.71735,-5.86008 z"
- style="opacity:0.5;fill:url(#linearGradient29424);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline;enable-background:new"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient29988"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,10)"
- x1="-35.153767"
- y1="271.58572"
- x2="-23.636715"
- y2="252.03563" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-5"
- id="linearGradient29990"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-113.93222,176.71918)"
- x1="446.93222"
- y1="105.28082"
- x2="441.93222"
- y2="120.28082" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-71"
- id="linearGradient29994"
- gradientUnits="userSpaceOnUse"
- x1="123.80045"
- y1="111.03492"
- x2="131.72171"
- y2="118.18078" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient21327-6-8"
- id="linearGradient29773-5"
- gradientUnits="userSpaceOnUse"
- x1="124.78239"
- y1="111.13178"
- x2="132.99687"
- y2="118.98331" />
- <linearGradient
- id="linearGradient21327-6-8">
- <stop
- style="stop-color:#1e3e70;stop-opacity:1;"
- offset="0"
- id="stop21329-3-4" />
- <stop
- style="stop-color:#1e3e70;stop-opacity:0;"
- offset="1"
- id="stop21331-4-0" />
- </linearGradient>
- <linearGradient
- id="linearGradient28526">
- <stop
- id="stop28528"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop28530"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-62">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-90" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-4" />
- </linearGradient>
- <linearGradient
- id="linearGradient1610-52-2">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-32-8" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-46-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-62-8">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-90-6" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-4-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient29334"
- gradientUnits="userSpaceOnUse"
- x1="121.74819"
- y1="104.14172"
- x2="140.18503"
- y2="126.89457" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069"
- id="linearGradient29336"
- gradientUnits="userSpaceOnUse"
- x1="155.10138"
- y1="91.071259"
- x2="122.40444"
- y2="127.60542" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24000"
- id="linearGradient29338"
- gradientUnits="userSpaceOnUse"
- x1="124.66362"
- y1="126.19594"
- x2="132"
- y2="118" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient29340"
- gradientUnits="userSpaceOnUse"
- x1="124.28249"
- y1="126.88889"
- x2="133.53401"
- y2="116.55647" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient29342"
- gradientUnits="userSpaceOnUse"
- x1="147.25899"
- y1="101.45953"
- x2="130.82327"
- y2="119.554" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient28574"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,-1,0,449.99999,1678)"
- x1="1138.1963"
- y1="287.70486"
- x2="1146.6705"
- y2="288.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient28577"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,-1,0,558.99999,1286)"
- x1="757.2467"
- y1="367.52411"
- x2="740.30865"
- y2="405.3895" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient28580"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,-1,0,558.99999,1288)"
- x1="745.48267"
- y1="396.45972"
- x2="737.62225"
- y2="401.90442" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500"
- id="linearGradient28583"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,1,0,-239.00001,1286)"
- x1="743"
- y1="402"
- x2="752"
- y2="400" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient38845"
- id="linearGradient28589"
- gradientUnits="userSpaceOnUse"
- x1="162.41054"
- y1="413.87982"
- x2="161.83331"
- y2="406.47784"
- gradientTransform="matrix(0,1,-1,0,574.99991,384.00001)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient38831"
- id="linearGradient28593"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,-1,0,558.99999,1288)"
- x1="743.87036"
- y1="396.04428"
- x2="744.1059"
- y2="423.54419" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient28600"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,-1,0,719.99999,383.00001)"
- x1="148.56801"
- y1="544.21143"
- x2="163.11441"
- y2="569.18829" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient38831"
- id="linearGradient28603"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,-1,0,449.99999,1678)"
- x1="1141.2856"
- y1="288.19919"
- x2="1146.2682"
- y2="291.35333" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-52-2"
- id="radialGradient29805"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.94105289,0.01178942,-0.01073736,0.8570756,238.4669,249.70522)"
- cx="-30.028414"
- cy="19.425121"
- fx="-30.028414"
- fy="19.425121"
- r="7" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask29801">
- <rect
- style="opacity:0.35;color:#000000;fill:url(#radialGradient29805);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.71217775;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
- id="rect29803"
- width="15"
- height="16"
- x="204"
- y="257" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-7"
- id="linearGradient29884"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,780.92531,0)"
- x1="389.73953"
- y1="220.84622"
- x2="389.59052"
- y2="248.09296" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient29886"
- gradientUnits="userSpaceOnUse"
- x1="391.62881"
- y1="243.48854"
- x2="386.13718"
- y2="244.68996" />
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath50172-0">
- <path
- id="path50174-8"
- d="m -177.34375,498 a 1.001098,1.001098 0 1 0 0.0937,2 l 3.65625,0 -4.25,5.9375 a 1.0001,1.0001 0 0 0 -0.1875,0.59375 l 0,0.5 a 1.0001,1.0001 0 0 0 1,1 L -171.75,508 a 1.0001,1.0001 0 1 0 0,-2 l -3.6875,0.0312 4.25,-5.9375 A 1.0001,1.0001 0 0 0 -171,499.5 l 0,-0.5 a 1.0001,1.0001 0 0 0 -1,-1 l -5.25,0 a 1.0001,1.0001 0 0 0 -0.0937,0 z"
- style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" />
- </clipPath>
- <filter
- color-interpolation-filters="sRGB"
- inkscape:collect="always"
- id="filter50168-9"
- x="-0.26459751"
- width="1.529195"
- y="-0.21958679"
- height="1.4391736">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.0769376"
- id="feGaussianBlur50170-2" />
- </filter>
- <radialGradient
- id="radialGradient16142-7"
- cx="20.892099"
- cy="64.567902"
- r="5.257"
- fx="20.892099"
- fy="64.567902"
- gradientUnits="userSpaceOnUse">
- <stop
- offset="0"
- style="stop-color:#F0F0F0"
- id="stop16144-4" />
- <stop
- offset="1"
- style="stop-color:#474747"
- id="stop16146-0" />
+ <linearGradient id="linearGradient10069-5-1-8">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-9-18-3"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-8-252-2"/>
+ </linearGradient>
+ <linearGradient id="linearGradient36273-9-4-8">
+ <stop id="stop36275-9-0-0" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop36277-1-3-8" offset="1" style="stop-color:#ffffff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069-5-12">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-9-7"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-8-4"/>
+ </linearGradient>
+ <linearGradient id="linearGradient36273-9-9">
+ <stop id="stop36275-9-8" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop36277-1-35" offset="1" style="stop-color:#ffffff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient15859-1-3">
+ <stop style="stop-color:#ff992b;stop-opacity:1" offset="0" id="stop15861-1-4"/>
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="1" id="stop15863-7-73"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-95">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-242"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-44"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542-1">
+ <stop id="stop37544-62" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-4" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-75">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-8"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-39"/>
+ </linearGradient>
+ <linearGradient id="linearGradient1610-36-6-5">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-1-9-6"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-5-9-8"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542-96">
+ <stop id="stop37544-7-1" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-0" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069-37">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-0"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-2"/>
+ </linearGradient>
+ <linearGradient id="linearGradient81143-4">
+ <stop style="stop-color:#2561b7;stop-opacity:1" offset="0" id="stop81145-0"/>
+ <stop style="stop-color:#f9fbff;stop-opacity:1" offset="1" id="stop81147-7"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542-7-8-6-0">
+ <stop id="stop37544-40-1-3-9" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop37546-94-7-0-7" offset="1" style="stop-color:#030303;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-488-8-2">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-13-8-8"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-67-2-2"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542-7-8-6-0-8">
+ <stop id="stop37544-40-1-3-9-3" offset="0" style="stop-color:#ffffff;stop-opacity:1;"/>
+ <stop id="stop37546-94-7-0-7-1" offset="1" style="stop-color:#030303;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient106427-3">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop106429-1"/>
+ <stop style="stop-color:#030303;stop-opacity:1" offset="1" id="stop106431-0"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-488-8-2-0">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-13-8-8-7"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-67-2-2-9"/>
+ </linearGradient>
+ <linearGradient id="linearGradient1610-36-6-7-9">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-1-9-4-5"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-5-9-87-3"/>
+ </linearGradient>
+ <linearGradient id="linearGradient1610-36-6-7-9-4">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-1-9-4-5-0"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-5-9-87-3-7"/>
+ </linearGradient>
+ <linearGradient id="linearGradient15097-0-8">
+ <stop style="stop-color:#c4c4c4;stop-opacity:1" offset="0" id="stop15099-1-83"/>
+ <stop style="stop-color:#868686;stop-opacity:1" offset="1" id="stop15101-9-3"/>
+ </linearGradient>
+ <linearGradient id="linearGradient23974-5-2-6-6">
+ <stop id="stop23976-9-2-7-6" offset="0" style="stop-color:#2561b7;stop-opacity:1;"/>
+ <stop id="stop23978-3-1-6-0" offset="1" style="stop-color:#f9fbff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient31320-5-2-6-7">
+ <stop style="stop-color:white;stop-opacity:1;" offset="0" id="stop31322-5-4-5-8"/>
+ <stop style="stop-color:white;stop-opacity:0;" offset="1" id="stop31324-0-8-5-8"/>
+ </linearGradient>
+ <linearGradient id="linearGradient14262-9-5-9-4">
+ <stop id="stop14264-5-2-9-0" offset="0" style="stop-color:#2661b6;stop-opacity:1;"/>
+ <stop id="stop14266-0-4-4-2" offset="1" style="stop-color:#c1d7f8;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-92-8-5-0">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-40-7-9-3"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-93-7-0-5"/>
+ </linearGradient>
+ <linearGradient id="linearGradient1610-36-6-7-9-4-3">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-1-9-4-5-0-6"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-5-9-87-3-7-8"/>
+ </linearGradient>
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient44627-7" id="linearGradient43054-6" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.3333333,0,0,1.2727273,2.6666667,29.454545)" x1="-4.2231579" y1="-92.440941" x2="-18.697306" y2="-115.04018"/>
+ <linearGradient id="linearGradient44627-7">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop44629-4"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop44631-0"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069-9-5-1-8-2-5">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-5-43-3-0-0-4"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-43-1-8-2-5-2"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069-9-7-4-74-1">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-5-4-5-0-5"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-43-0-5-9-2"/>
+ </linearGradient>
+ <linearGradient id="linearGradient44939-8-5">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop44941-8-1"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop44943-2-7"/>
+ </linearGradient>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient44627-7" id="radialGradient48820-9" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,1.0769231,0,5.9230769)" cx="-31" cy="-83.5" fx="-31" fy="-83.5" r="6.5"/>
+ <linearGradient id="linearGradient10069-9-7-4-4">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-5-4-5-8"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-43-0-5-6"/>
+ </linearGradient>
+ <linearGradient id="linearGradient44939-09">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop44941-0"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop44943-0"/>
+ </linearGradient>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient44627-7" id="radialGradient28589-9" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,1.0769231,0,5.9230769)" cx="-30.28125" cy="-84.341515" fx="-30.28125" fy="-84.341515" r="6.5"/>
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient43760-6-4" id="linearGradient43044-5" gradientUnits="userSpaceOnUse" x1="-44.709698" y1="-8.4836445" x2="-37.784756" y2="-18.517523" gradientTransform="translate(-0.04018164,0)"/>
+ <linearGradient id="linearGradient43760-6-4">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop43762-7-3"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop43764-8-1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient9030-71-3">
+ <stop style="stop-color:white;stop-opacity:1;" offset="0" id="stop9032-15-3"/>
+ <stop style="stop-color:white;stop-opacity:0;" offset="1" id="stop9034-276-4"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069-9-5-1-1">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-5-43-3-3"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-43-1-8-8"/>
+ </linearGradient>
+ <linearGradient id="linearGradient44939-2-8">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop44941-7-4"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop44943-7-0"/>
+ </linearGradient>
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient43760-7" id="linearGradient45875-0" gradientUnits="userSpaceOnUse" gradientTransform="translate(14,0)" x1="-34.051685" y1="-129.32457" x2="-32.542458" y2="-139.90228"/>
+ <linearGradient id="linearGradient43760-7">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop43762-79"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop43764-3"/>
+ </linearGradient>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient43760-7" id="radialGradient45877-1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1099414,-0.9422316,0.4519816,0.05273803,38.220416,-152.21215)" cx="-25.452209" cy="-136.46503" fx="-25.452209" fy="-136.46503" r="8.0066185"/>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient43760-7" id="radialGradient45451-2" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.9952162,167.99999,-60.91415)" cx="59.000011" cy="440.0191" fx="59.000011" fy="440.0191" r="6.5080619"/>
+ <linearGradient id="linearGradient319-42-9">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-32-8"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-21-6"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069-9-7-0">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-5-4-2"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-43-0-8"/>
+ </linearGradient>
+
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient1610-5-2" id="linearGradient43192-3" gradientUnits="userSpaceOnUse" x1="-47" y1="44" x2="-43" y2="44"/>
+ <linearGradient id="linearGradient1610-5-2">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-17-2"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-115-1"/>
+ </linearGradient>
+
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient1610-5-2" id="linearGradient43186-6" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-1,-1,0,6,6)" x1="-47" y1="44" x2="-43" y2="44"/>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient44627-7" id="radialGradient25025-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.8918342,0,0,0.8918344,-15.699877,27.900732)" cx="49" cy="254.64285" fx="49" fy="254.64285" r="6.5"/>
+ <linearGradient id="linearGradient10069-9-7-5-5">
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop10071-5-4-58-7"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-43-0-4-5"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-76-2-0">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-142-0"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-32-0"/>
+ </linearGradient>
+ <linearGradient id="linearGradient29761">
+ <stop style="stop-color:#b74125;stop-opacity:1;" offset="0" id="stop29763"/>
+ <stop style="stop-color:#f9fbff;stop-opacity:1" offset="1" id="stop29765"/>
+ </linearGradient>
+ <linearGradient id="linearGradient8864-1">
+ <stop id="stop8866-0" offset="0" style="stop-color:#b43214;stop-opacity:1;"/>
+ <stop id="stop8868-1" offset="1" style="stop-color:#e86830;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient1610-8-8">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-7-7"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-4-6"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-77-0">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-9-0"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-31-9"/>
+ </linearGradient>
+ <linearGradient id="linearGradient1610-4">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-64"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-20"/>
+ </linearGradient>
+ <linearGradient id="linearGradient1610-4-3">
+ <stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop1611-64-0"/>
+ <stop style="stop-color:white;stop-opacity:1;" offset="1" id="stop1612-20-3"/>
+ </linearGradient>
+ <linearGradient id="linearGradient16719">
+ <stop id="stop16721" offset="0" style="stop-color:#84d458;stop-opacity:1"/>
+ <stop style="stop-color:#5894d4;stop-opacity:1" offset="0.30000001" id="stop5079"/>
+ <stop id="stop16723" offset="1" style="stop-color:#afd1f5;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient11820">
+ <stop style="stop-color:#afd1f5;stop-opacity:1" offset="0" id="stop11822"/>
+ <stop id="stop11824" offset="0.44444144" style="stop-color:#5894d4;stop-opacity:1"/>
+ <stop style="stop-color:#5894d4;stop-opacity:1" offset="0.55555254" id="stop11826"/>
+ <stop style="stop-color:#ef79ef;stop-opacity:1" offset="1" id="stop11828"/>
+ </linearGradient>
+ <linearGradient id="linearGradient28147-1-4">
+ <stop id="stop28149-4-1" offset="0" style="stop-color:#afd1f5;stop-opacity:1"/>
+ <stop style="stop-color:#5894d4;stop-opacity:1" offset="0.18750006" id="stop5469"/>
+ <stop style="stop-color:#505050;stop-opacity:1" offset="0.40000001" id="stop28151-7-6"/>
+ <stop id="stop28153-8-4" offset="0.60000002" style="stop-color:#505050;stop-opacity:1"/>
+ <stop style="stop-color:#5894d4;stop-opacity:1" offset="0.81250006" id="stop5471"/>
+ <stop id="stop28155-2-6" offset="1" style="stop-color:#afd1f5;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-65-4-8-7">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-14-9-5-9"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-49-3-6-8"/>
+ </linearGradient>
+ <linearGradient id="linearGradient44939-8-53">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop44941-8-7"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop44943-2-5"/>
+ </linearGradient>
+ <linearGradient id="linearGradient44939-8-53-7">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop44941-8-7-6"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop44943-2-5-2"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-0">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-22"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-19"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542-29">
+ <stop id="stop37544-67" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-45" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-36">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-18"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-390"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542-29-1">
+ <stop id="stop37544-67-8" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-45-9" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542-29-7">
+ <stop id="stop37544-67-3" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-45-0" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-36-40">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-18-7"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-390-4"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37542-29-7-8">
+ <stop id="stop37544-67-3-0" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-45-0-9" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-36-40-2">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-18-7-8"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-390-4-6"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-36-40-2-4">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-18-7-8-5"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-390-4-6-6"/>
+ </linearGradient>
+ <linearGradient id="linearGradient23974-39">
+ <stop id="stop23976-8" offset="0" style="stop-color:#2561b7;stop-opacity:1;"/>
+ <stop id="stop23978-23" offset="1" style="stop-color:#f9fbff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient31320-9">
+ <stop style="stop-color:white;stop-opacity:1;" offset="0" id="stop31322-6"/>
+ <stop style="stop-color:white;stop-opacity:0;" offset="1" id="stop31324-2"/>
+ </linearGradient>
+ <linearGradient id="linearGradient14262-6">
+ <stop id="stop14264-29" offset="0" style="stop-color:#2661b6;stop-opacity:1;"/>
+ <stop id="stop14266-9" offset="1" style="stop-color:#c1d7f8;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-61">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-47"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-45"/>
+ </linearGradient>
+
+
+
+ <linearGradient id="linearGradient37542-55">
+ <stop id="stop37544-61" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-03" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-74">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-42"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-67"/>
+ </linearGradient>
+ <linearGradient id="linearGradient21609-6">
+ <stop id="stop21611-3" offset="0" style="stop-color:black;stop-opacity:1"/>
+ <stop id="stop21613-0" offset="1" style="stop-color:white;stop-opacity:1;"/>
+ </linearGradient>
+
+
+
+
+ <linearGradient id="linearGradient37542-91">
+ <stop id="stop37544-81" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop37546-75" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient319-223">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-84"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-34"/>
+ </linearGradient>
+ <linearGradient id="linearGradient21609-3">
+ <stop id="stop21611-9" offset="0" style="stop-color:black;stop-opacity:1"/>
+ <stop id="stop21613-8" offset="1" style="stop-color:white;stop-opacity:1;"/>
+ </linearGradient>
+
+ <linearGradient id="linearGradient1610-2">
+ <stop id="stop1611-8-9" offset="0" style="stop-color:black;stop-opacity:1;"/>
+ <stop style="stop-color:#000000;stop-opacity:1;" offset="0.5" id="stop6596"/>
+ <stop id="stop1612-0-6" offset="1" style="stop-color:#c8c8c8;stop-opacity:1;"/>
+ </linearGradient>
+
+ <linearGradient id="linearGradient18821-1-16">
+ <stop id="stop20589" offset="0" style="stop-color:#e3604f;stop-opacity:1;"/>
+ <stop id="stop20591" offset="1" style="stop-color:#e3604f;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient39155-0-813">
+ <stop style="stop-color:#e6e6e6;stop-opacity:1;" offset="0" id="stop20595"/>
+ <stop style="stop-color:#c4c4c4;stop-opacity:1;" offset="1" id="stop20597"/>
+ </linearGradient>
+
+
+
+
+
+
+ <radialGradient gradientUnits="userSpaceOnUse" fy="114.5684" fx="20.892099" r="5.256" cy="114.5684" cx="20.892099" id="aigrd2-3">
+ <stop id="stop15566-9" style="stop-color:#F0F0F0" offset="0"/>
+ <stop id="stop15568-7" style="stop-color:#9a9a9a;stop-opacity:1.0000000;" offset="1.0000000"/>
</radialGradient>
- <linearGradient
- id="linearGradient37542-78">
- <stop
- id="stop37544-2"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-78"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient9030-2">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop9032-0" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop9034-89" />
- </linearGradient>
- <linearGradient
- id="linearGradient37542-04-82">
- <stop
- id="stop37544-9-0"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-4-5"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient9030-38-2">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop9032-6-7" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop9034-9-6" />
- </linearGradient>
- <linearGradient
- id="linearGradient30766-8"
- inkscape:collect="always">
- <stop
- id="stop30768-7"
- offset="0"
- style="stop-color:#be0000;stop-opacity:1" />
- <stop
- id="stop30770-8"
- offset="1"
- style="stop-color:#ff5108;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient30752-0">
- <stop
- style="stop-color:#0c1b63;stop-opacity:1;"
- offset="0"
- id="stop30754-9" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1"
- offset="1"
- id="stop30756-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32140"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-64,-10)"
- x1="18.773417"
- y1="6.2494373"
- x2="6.9718256"
- y2="17.82831" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32142"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.701513,0.712657,0.712657,0.701513,50.5916,-449.6745)"
- x1="385.62408"
- y1="244.3396"
- x2="401.63013"
- y2="244.38875" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32144"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-65.00001,-10.749995)"
- x1="61.032951"
- y1="5.9830923"
- x2="46.491322"
- y2="20.147326" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32146"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.199998,0,0,1.199999,-74.19988,-12.499988)"
- x1="59.02124"
- y1="6.0129876"
- x2="44.509518"
- y2="20.110929" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32148"
- gradientUnits="userSpaceOnUse"
- x1="47.348152"
- y1="-25.553123"
- x2="53.567928"
- y2="-31.095215" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#radialGradient16142-7"
- id="linearGradient31946"
- gradientUnits="userSpaceOnUse"
- x1="-176.1799"
- y1="508.33572"
- x2="-193.07495"
- y2="482.27924" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#radialGradient16142"
- id="linearGradient31948"
- gradientUnits="userSpaceOnUse"
- x1="-178.00789"
- y1="505.36523"
- x2="-194.90294"
- y2="479.30875" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-78"
- id="linearGradient31950"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.043478,0,0,0.956667,-7.152175,20.92167)"
- x1="155.37498"
- y1="230.51552"
- x2="181.25543"
- y2="269.24564" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030-2"
- id="linearGradient31952"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(81.000002,13.499998)"
- x1="87.765625"
- y1="242.39062"
- x2="96"
- y2="251.40294" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-04-82"
- id="linearGradient31954"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.043478,0,0,0.956667,-354.13606,119.42158)"
- x1="148.47061"
- y1="217.28368"
- x2="171.77303"
- y2="250.87756" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030-38-2"
- id="linearGradient31956"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(81.000002,13.499998)"
- x1="-259.99872"
- y1="340.81195"
- x2="-253.90541"
- y2="345.10736" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30766-8"
- id="linearGradient31958"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0017964,0,0,0.99629977,-0.31613165,0.94171311)"
- x1="167.51979"
- y1="252.44223"
- x2="170.78137"
- y2="261.69635" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030-2"
- id="linearGradient31960"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(81.000002,13.499998)"
- x1="87.473038"
- y1="238.21507"
- x2="89.889603"
- y2="243.80345" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30752-0"
- id="linearGradient31962"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,10)"
- x1="168.53265"
- y1="244.52007"
- x2="168.53265"
- y2="239.5473" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient31964"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-237.5,45.5045)"
- x1="263.35254"
- y1="19.495501"
- x2="275.43362"
- y2="28.583914" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient31966"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-238,44.0045)"
- x1="271.69839"
- y1="22.713789"
- x2="283.37738"
- y2="36.874088" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient31968"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-243.5,51.5045)"
- x1="260.25369"
- y1="11.017987"
- x2="275.43362"
- y2="28.583914" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient31970"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-244,50.0045)"
- x1="271.69839"
- y1="22.713789"
- x2="283.37738"
- y2="36.874088" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient31972"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-57.00003,-165.99191)"
- x1="85.853188"
- y1="239.5473"
- x2="90.563423"
- y2="242.99191" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient31974"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-51,-172)"
- x1="88"
- y1="240.90625"
- x2="92.8125"
- y2="245.625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient28526"
- id="linearGradient32236"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(423,225)"
- x1="-175.72238"
- y1="66.323799"
- x2="-183.03308"
- y2="66.235535" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20055-8-4"
- id="linearGradient32238"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(423,225)"
- x1="-174.51762"
- y1="66.654762"
- x2="-183.58472"
- y2="65.917358" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-62"
- id="linearGradient32240"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9098462,0,0,0.9414558,406.86085,228.58514)"
- x1="-180.7581"
- y1="63.445515"
- x2="-169.07387"
- y2="62.182106" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-62-8"
- id="linearGradient32242"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2857143,0,0,0.787037,371.28571,304.80092)"
- x1="-101"
- y1="-16"
- x2="-96.861107"
- y2="-15.138513" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-62-8"
- id="linearGradient32244"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2857143,0,0,0.787037,371.28571,304.80092)"
- x1="-101"
- y1="-16"
- x2="-96.705353"
- y2="-15.562586" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29312"
- id="linearGradient32246"
- gradientUnits="userSpaceOnUse"
- x1="242.99834"
- y1="291.5047"
- x2="244.75"
- y2="291.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29304"
- id="linearGradient32248"
- gradientUnits="userSpaceOnUse"
- x1="245.20622"
- y1="294.49902"
- x2="243.5"
- y2="294.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32296"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-52.983883,-129)"
- x1="258"
- y1="388"
- x2="273"
- y2="388" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32299"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-48.983883,-126)"
- x1="259.75"
- y1="388"
- x2="273"
- y2="388" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32301"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-47.000005,-120)"
- x1="257.75"
- y1="388"
- x2="272"
- y2="388" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32303"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9166695,0,0,0.9203753,-9.025729,344.78566)"
- x1="80.60067"
- y1="108.47212"
- x2="68.0271"
- y2="94.239906" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13938"
- id="linearGradient32305"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-14.983875,337)"
- x1="68.361542"
- y1="95.337166"
- x2="88.785263"
- y2="116.62141" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32307"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9998599,0,0,0.9960071,-15.972985,338.41149)"
- x1="58.761654"
- y1="84.330009"
- x2="81.383331"
- y2="108.06429" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient32353"
- gradientUnits="userSpaceOnUse"
- x1="114.15679"
- y1="100.93772"
- x2="137.5759"
- y2="124.47867" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32355"
- gradientUnits="userSpaceOnUse"
- x1="131.12576"
- y1="118"
- x2="140.19273"
- y2="125.82862" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32357"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9050931,-7.9558708e-4,0.00612764,0.9147058,39.488451,313.56226)"
- x1="299.70026"
- y1="408.49368"
- x2="322.08145"
- y2="429.53806" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32359"
- gradientUnits="userSpaceOnUse"
- x1="131.12576"
- y1="118"
- x2="140.19273"
- y2="125.82862" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient32426"
- gradientUnits="userSpaceOnUse"
- x1="114.15679"
- y1="100.93772"
- x2="137.5759"
- y2="124.47867" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32428"
- gradientUnits="userSpaceOnUse"
- x1="131.12576"
- y1="118"
- x2="140.19273"
- y2="125.82862" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient32430"
- gradientUnits="userSpaceOnUse"
- x1="190.68166"
- y1="244.14676"
- x2="174.75458"
- y2="226.33672" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient32432"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.77915445,-6.9426235e-4,0.00527501,0.79821029,158.94945,341.39422)"
- x1="299.70026"
- y1="408.49368"
- x2="322.08145"
- y2="429.53806" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-7-1-7"
- id="linearGradient32434"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,-1,73,792.5)"
- x1="346"
- y1="128.5"
- x2="368"
- y2="123.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient31019"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,257.1483,118.6716)"
- x1="85.548706"
- y1="100.22395"
- x2="85.347076"
- y2="113.09817" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient31025"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.72300056,-0.72300056,0.72300056,0.72300056,254.24127,118.38327)"
- x1="85.548706"
- y1="100.22395"
- x2="85.347076"
- y2="113.09817" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient31055"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,257.1483,118.6716)"
- x1="85.548706"
- y1="100.22395"
- x2="85.347076"
- y2="113.09817" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient31057"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.72300056,-0.72300056,0.72300056,0.72300056,254.24127,118.38327)"
- x1="85.548706"
- y1="100.22395"
- x2="85.347076"
- y2="113.09817" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient31151"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,257.1483,118.6716)"
- x1="85.548706"
- y1="100.22395"
- x2="85.347076"
- y2="113.09817" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient31153"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.72300056,-0.72300056,0.72300056,0.72300056,254.24127,118.38327)"
- x1="85.548706"
- y1="100.22395"
- x2="84.95932"
- y2="122.23821" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30958"
- id="linearGradient31155"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,257.14826,118.6716)"
- x1="85.861206"
- y1="99.348953"
- x2="85.60022"
- y2="105.88815" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30958"
- id="linearGradient31157"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.74301467,-0.74301467,0.74301467,0.74301467,250.58064,118.02214)"
- x1="85.861206"
- y1="99.348953"
- x2="85.60022"
- y2="105.88815" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-7409-7-7-19-1"
- id="linearGradient32854-6-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.1666676,0,0,-1.1666676,119.15081,827.66691)"
- x1="262.04343"
- y1="233.0448"
- x2="273.85818"
- y2="247.32738" />
- <linearGradient
- id="linearGradient37542-7409-7-7-19-1">
- <stop
- id="stop37544-48-6-1-8-9"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-82-1-0-6-8"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-4-7-8-3-0-3"
- id="linearGradient32856-3-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.53706486,0,0,0.53706486,-249.10439,522.04547)"
- x1="97.616623"
- y1="39.47208"
- x2="94.157646"
- y2="35.759052" />
- <linearGradient
- id="linearGradient44939-8-4-7-8-3-0-3">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop44941-8-5-40-2-4-2-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop44943-2-5-9-4-9-8-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-5-4-6-5-0-3"
- id="linearGradient32858-7-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.53706486,0,0,0.53706486,144.9138,-563.9364)"
- x1="97.616623"
- y1="39.47208"
- x2="94.157646"
- y2="35.759052" />
- <linearGradient
- id="linearGradient10069-9-7-5-4-6-5-0-3">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-5-4-58-5-9-1-2-1" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-43-0-4-0-8-0-4-9" />
- </linearGradient>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask52637-8-8">
- <rect
- mask="none"
- style="fill:url(#radialGradient52641-2-8);fill-opacity:1;stroke:none;stroke-width:2.79999995000000010;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect52639-8-9"
- width="7.9918551"
- height="8.9366941"
- x="-354"
- y="458"
- rx="0"
- ry="0" />
- </mask>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-7409-7-7-0-9-9"
- id="radialGradient52641-2-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.39420438,-0.08239205,0.27256031,1.3040635,-361.27885,-161.73915)"
- cx="-302.79681"
- cy="462.0358"
- fx="-302.79681"
- fy="462.0358"
- r="8" />
- <linearGradient
- id="linearGradient37542-7409-7-7-0-9-9">
- <stop
- id="stop37544-48-6-1-4-1-1"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-82-1-0-9-3-3"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-31-8-9-1"
- id="linearGradient52998-5-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-42,0)"
- x1="-307"
- y1="475"
- x2="-303.00003"
- y2="463.92236" />
- <linearGradient
- id="linearGradient319-31-8-9-1">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-23-2-8-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-34-4-4-2" />
- </linearGradient>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask52879-0-5">
- <rect
- mask="none"
- style="fill:url(#radialGradient52883-6-8);fill-opacity:1;stroke:none;stroke-width:2.79999995000000010;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect52881-7-3"
- width="7.9918551"
- height="8.9366941"
- x="-354.95001"
- y="458"
- rx="0"
- ry="0" />
- </mask>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-7409-7-7-0-9-9"
- id="radialGradient52883-6-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.39420438,-0.08239205,0.27256031,1.3040635,-362.22886,-161.73912)"
- cx="-302.79681"
- cy="462.0358"
- fx="-302.79681"
- fy="462.0358"
- r="8" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-31-8-9-1"
- id="linearGradient53000-3-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-42,0)"
- x1="-308.7684"
- y1="476.0105"
- x2="-304.76843"
- y2="464.93286" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient34488-1-8"
- id="linearGradient53002-6-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-839.95,-273.25)"
- x1="469.49295"
- y1="-101.22778"
- x2="470.7515"
- y2="-102.52942" />
- <linearGradient
- id="linearGradient34488-1-8">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop34490-0-5-7" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop34492-4-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient32877-9-6-8"
- id="linearGradient32896-0-4"
- gradientUnits="userSpaceOnUse"
- x1="-217.1391"
- y1="626.39844"
- x2="-213.69197"
- y2="623.21643" />
- <linearGradient
- id="linearGradient32877-9-6-8">
- <stop
- style="stop-color:#b3b3b3;stop-opacity:1;"
- offset="0"
- id="stop32879-8-1-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop32881-4-3-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient33058-4-9-5"
- id="linearGradient32899-8-3"
- gradientUnits="userSpaceOnUse"
- x1="-180.37465"
- y1="650.94128"
- x2="-177.70576"
- y2="653.27765" />
- <linearGradient
- id="linearGradient33058-4-9-5">
- <stop
- style="stop-color:#e5250b;stop-opacity:1;"
- offset="0"
- id="stop33060-3-3-9" />
- <stop
- style="stop-color:#460000;stop-opacity:1;"
- offset="1"
- id="stop33062-9-4-7" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-4-8-6-8"
- id="radialGradient32901-4-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1748275,-1.7208853,0.51495275,0.35155123,-289.20197,69.961171)"
- cx="-197.66467"
- cy="630.61389"
- fx="-197.66467"
- fy="630.61389"
- r="7.03125" />
- <linearGradient
- id="linearGradient44939-8-4-8-6-8">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop44941-8-5-0-0-0" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop44943-2-5-8-6-1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient33058-2-7-1-7"
- id="linearGradient32903-6-4"
- gradientUnits="userSpaceOnUse"
- x1="-218.31921"
- y1="624.84143"
- x2="-215.31401"
- y2="628.46533" />
- <linearGradient
- id="linearGradient33058-2-7-1-7">
- <stop
- style="stop-color:#e5250b;stop-opacity:1;"
- offset="0"
- id="stop33060-1-8-8-5" />
- <stop
- style="stop-color:#460000;stop-opacity:1;"
- offset="1"
- id="stop33062-4-3-4-5" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-4-8-6-8"
- id="radialGradient32905-9-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.62164476,0.39733376,-0.55111069,0.86222272,269.0477,166.72227)"
- cx="-202.18748"
- cy="627"
- fx="-202.18748"
- fy="627"
- r="7.03125" />
- <linearGradient
- y2="-102.52942"
- x2="470.73633"
- y1="-101.3037"
- x1="469.52335"
- gradientTransform="translate(-829.95,-273.25)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient58927"
- xlink:href="#linearGradient34488-1-8"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient1610-71-6-9-7">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-26-8-5-4" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-04-8-8-0" />
- </linearGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath13106-9-2-9-9">
- <path
- inkscape:connector-curvature="0"
- style="fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;display:inline"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- id="path34850-4-7-0-4"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </clipPath>
- <linearGradient
- id="linearGradient5060-6-6-2-4">
- <stop
- id="stop5062-2-0-5-5"
- offset="0"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- id="stop5064-4-4-5-5"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient4671-6-4-1-7">
- <stop
- id="stop4673-7-6-4-1"
- offset="0"
- style="stop-color:#ffd43b;stop-opacity:1;" />
- <stop
- id="stop4675-8-0-8-1"
- offset="1"
- style="stop-color:#ffe873;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient4689-1-6-4-2">
- <stop
- id="stop4691-6-2-6-7"
- offset="0"
- style="stop-color:#5a9fd4;stop-opacity:1;" />
- <stop
- id="stop4693-0-4-8-6"
- offset="1"
- style="stop-color:#306998;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient3944-4-6-7-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop3946-2-4-4-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3948-3-5-0-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient3952-2-6-4-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop3954-1-1-8-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3956-6-5-8-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient3966-5-1-45-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop3968-7-9-5-5" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3970-6-6-1-5" />
- </linearGradient>
- <linearGradient
- id="linearGradient1610-1-1-9-4-7-1">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-74-7-2-2-2-1" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-09-4-7-5-1-5" />
- </linearGradient>
- <linearGradient
- id="linearGradient40578-4-8-4-0-5-2-4-7">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop40580-8-9-8-9-4-6-9-6" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop40582-6-8-8-4-3-8-9-1" />
- </linearGradient>
- <linearGradient
- id="linearGradient58334-24-8-2-6-0-2">
- <stop
- id="stop58336-55-8-3-6-3-3"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:0.87628865;" />
- <stop
- id="stop58338-17-2-3-3-0-2"
- offset="1.0000000"
- style="stop-color:#fffffe;stop-opacity:0.0000000;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-11-1-4-3-1">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-5-1-5-5-6" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-27-3-6-0-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient3944-1-7-5-7-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop3946-7-4-3-6-6" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3948-1-2-5-7-1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient3952-5-7-6-8-9">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop3954-2-9-1-3-2" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3956-7-3-4-6-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient3966-8-9-6-4-5">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop3968-2-8-2-4-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3970-4-6-6-1-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-4"
- id="linearGradient15131"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9999519,0,0,0.9998051,-33.244333,253.26813)"
- x1="101.21339"
- y1="68.783279"
- x2="135.45256"
- y2="103.11092" />
- <linearGradient
- id="linearGradient37542-4">
- <stop
- id="stop37544-180"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-62"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-2"
- id="linearGradient15133"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0910287,0,0,1.0900105,41.555722,244.97315)"
- x1="47.655102"
- y1="93.805557"
- x2="59.057678"
- y2="105.27895" />
- <linearGradient
- id="linearGradient319-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-6" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-72" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10585-5"
- id="linearGradient15135"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.032977,0,0,1,128.82015,107.77516)"
- x1="12.330792"
- y1="246.97107"
- x2="41.654194"
- y2="247.3784" />
- <linearGradient
- id="linearGradient10585-5">
- <stop
- id="stop10587-5"
- offset="0.0000000"
- style="stop-color:#d7d7d7;stop-opacity:1.0000000;" />
- <stop
- id="stop10595-5"
- offset="1.0000000"
- style="stop-color:#000000;stop-opacity:1.0000000;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-0"
- id="linearGradient15123"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,513.5,184.50451)"
- x1="253.78497"
- y1="3.6831069"
- x2="278.25537"
- y2="30.023426" />
- <linearGradient
- id="linearGradient1610-0">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-6" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-42" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40578-4-8-0"
- id="radialGradient15125"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3817213,-0.4377393,0.4780868,0.4169055,368.09749,451.76937)"
- cx="756.83508"
- cy="206.40076"
- fx="756.83508"
- fy="206.40076"
- r="6.9000001" />
- <linearGradient
- id="linearGradient40578-4-8-0">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop40580-8-9-61" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop40582-6-8-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334-46"
- id="linearGradient15127"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(670,-33)"
- x1="87"
- y1="241.125"
- x2="93.0625"
- y2="249" />
- <linearGradient
- id="linearGradient58334-46">
- <stop
- id="stop58336-9"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:0.87628865;" />
- <stop
- id="stop58338-5"
- offset="1.0000000"
- style="stop-color:#fffffe;stop-opacity:0.0000000;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-46"
- id="linearGradient15129"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-95.999998)"
- x1="754.28558"
- y1="300.83292"
- x2="758"
- y2="305" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-46">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-4" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-19-0-4"
- id="linearGradient14559-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="117.12428"
- y2="56.069553" />
- <linearGradient
- id="linearGradient319-19-0-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-865-0-7" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-02-0-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-19-0-4"
- id="linearGradient14561-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(207,-246.99988)"
- x1="-56.5"
- y1="342.0625"
- x2="-49"
- y2="341" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14482-2"
- id="linearGradient14563-3"
- gradientUnits="userSpaceOnUse"
- x1="149.55806"
- y1="94.884857"
- x2="149.53032"
- y2="101.436" />
- <linearGradient
- id="linearGradient14482-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop14484-6" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop14486-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-95-2-7-1-2"
- id="linearGradient14565-5"
- gradientUnits="userSpaceOnUse"
- x1="132"
- y1="117.26753"
- x2="142.72656"
- y2="127.72736" />
- <linearGradient
- id="linearGradient319-95-2-7-1-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:0.75675678;"
- offset="0"
- id="stop320-43-7-3-3-3" />
- <stop
- style="stop-color:#915515;stop-opacity:0;"
- offset="1"
- id="stop321-12-7-4-1-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-8-3-3-0-3"
- id="linearGradient14567-8"
- gradientUnits="userSpaceOnUse"
- x1="126.55782"
- y1="113.57294"
- x2="132.41052"
- y2="118.81034" />
- <linearGradient
- id="linearGradient10069-8-3-3-0-3">
- <stop
- style="stop-color:#764511;stop-opacity:1;"
- offset="0"
- id="stop10071-9-8-7-1-8" />
- <stop
- style="stop-color:#915515;stop-opacity:0;"
- offset="1"
- id="stop10073-2-7-1-0-5" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-19-0">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-865-0" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-02-0" />
- </linearGradient>
- <linearGradient
- id="linearGradient14482">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop14484" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop14486" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-95-2-7-1">
- <stop
- style="stop-color:#ffffff;stop-opacity:0.75675678;"
- offset="0"
- id="stop320-43-7-3-3" />
- <stop
- style="stop-color:#915515;stop-opacity:0;"
- offset="1"
- id="stop321-12-7-4-1" />
- </linearGradient>
- <linearGradient
- id="linearGradient10069-8-3-3-0">
- <stop
- style="stop-color:#764511;stop-opacity:1;"
- offset="0"
- id="stop10071-9-8-7-1" />
- <stop
- style="stop-color:#915515;stop-opacity:0;"
- offset="1"
- id="stop10073-2-7-1-0" />
- </linearGradient>
- <linearGradient
- id="linearGradient15098">
- <stop
- style="stop-color:#646464;stop-opacity:1;"
- offset="0"
- id="stop15100" />
- <stop
- style="stop-color:#fcfcfc;stop-opacity:1;"
- offset="1"
- id="stop15102" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13998-7-0"
- id="linearGradient26282-0-8"
- gradientUnits="userSpaceOnUse"
- x1="13.5"
- y1="57.827747"
- x2="11.472005"
- y2="53.875874" />
- <linearGradient
- id="linearGradient13998-7-0">
- <stop
- id="stop14000-1-1"
- offset="0"
- style="stop-color:#f57d07;stop-opacity:1;" />
- <stop
- id="stop14002-0-0"
- offset="1"
- style="stop-color:white;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13998-7-0"
- id="linearGradient26284-9-6"
- gradientUnits="userSpaceOnUse"
- x1="-18.600719"
- y1="501.96539"
- x2="-26.642899"
- y2="487.60382" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-7-2"
- id="linearGradient26286-4-5"
- gradientUnits="userSpaceOnUse"
- x1="15.027407"
- y1="60.637787"
- x2="13.5"
- y2="57.750687" />
- <linearGradient
- id="linearGradient319-7-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-5-6" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-5-1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-7-2"
- id="linearGradient26288-9-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.03018343,0.1408617)"
- x1="-32.067383"
- y1="490.70178"
- x2="-22.25"
- y2="500" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13998-7"
- id="linearGradient26282-0"
- gradientUnits="userSpaceOnUse"
- x1="13.5"
- y1="57.827747"
- x2="11.472005"
- y2="53.875874" />
- <linearGradient
- id="linearGradient13998-7">
- <stop
- id="stop14000-1"
- offset="0"
- style="stop-color:#f57d07;stop-opacity:1;" />
- <stop
- id="stop14002-0"
- offset="1"
- style="stop-color:white;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13998-7"
- id="linearGradient26284-9"
- gradientUnits="userSpaceOnUse"
- x1="-18.600719"
- y1="501.96539"
- x2="-26.642899"
- y2="487.60382" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-7"
- id="linearGradient26286-4"
- gradientUnits="userSpaceOnUse"
- x1="15.027407"
- y1="60.637787"
- x2="13.5"
- y2="57.750687" />
- <linearGradient
- id="linearGradient319-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-5" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-7"
- id="linearGradient26288-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.03018343,0.1408617)"
- x1="-32.067383"
- y1="490.70178"
- x2="-22.25"
- y2="500" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-4-74-8"
- id="radialGradient45309-0"
- cx="336.42892"
- cy="611.10455"
- fx="336.42892"
- fy="611.10455"
- r="5.9852905"
- gradientTransform="matrix(1.0070601,0.03386866,-0.03770425,1.1211085,20.665977,-85.772965)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient10069-9-7-4-74-8">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-5-4-5-0-1" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-43-0-5-9-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-9-1-2"
- id="linearGradient42965-7-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(301.02752,449.99999)"
- x1="25.963812"
- y1="155.66899"
- x2="29.972469"
- y2="168" />
- <linearGradient
- id="linearGradient319-9-1-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-92-1-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-55-5-8" />
- </linearGradient>
- <filter
- inkscape:collect="always"
- id="filter24186-3-2-5"
- x="-0.12810811"
- width="1.2562162"
- y="-0.11285714"
- height="1.2257143"
- color-interpolation-filters="sRGB">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.395"
- id="feGaussianBlur24188-3-7-6" />
- </filter>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-06-1-5"
- id="linearGradient42967-6-4"
- gradientUnits="userSpaceOnUse"
- x1="335.96875"
- y1="607.09375"
- x2="337.04251"
- y2="628.20752" />
- <linearGradient
- id="linearGradient1610-06-1-5">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-8-4-2" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-1-2-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-12-5"
- id="linearGradient42487-4-5"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- id="linearGradient319-12-5">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-34-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-81-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15425-8-7"
- id="linearGradient42489-5-9"
- gradientUnits="userSpaceOnUse"
- x1="123.26987"
- y1="108.56933"
- x2="138.25778"
- y2="124.59384" />
- <linearGradient
- id="linearGradient15425-8-7">
- <stop
- style="stop-color:#8c0000;stop-opacity:1;"
- offset="0"
- id="stop15427-5-9" />
- <stop
- style="stop-color:#c80000;stop-opacity:0;"
- offset="1"
- id="stop15429-7-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-12-5"
- id="linearGradient42491-0-9"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15425-8-7"
- id="linearGradient17232-8"
- gradientUnits="userSpaceOnUse"
- x1="123.26987"
- y1="108.56933"
- x2="141.64546"
- y2="130.81215" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-35-31-8"
- id="radialGradient37501-4-6-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.08933014,-0.7764284,0.7350832,-0.08334857,57.410559,233.30156)"
- cx="135.83771"
- cy="117.97826"
- fx="135.83771"
- fy="117.97826"
- r="8" />
- <linearGradient
- id="linearGradient319-35-31-8">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-38-14-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-94-6-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-35-31-8"
- id="linearGradient37503-1-1-1"
- gradientUnits="userSpaceOnUse"
- x1="121.19734"
- y1="105.94044"
- x2="148.06364"
- y2="137.6748" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-35-08-1"
- id="radialGradient37501-4-9-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.08933014,-0.7764284,0.7350832,-0.08334857,57.410559,233.30156)"
- cx="135.83771"
- cy="117.97826"
- fx="135.83771"
- fy="117.97826"
- r="8" />
- <linearGradient
- id="linearGradient319-35-08-1">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-38-1-0" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-94-1-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-35-08-1"
- id="linearGradient37503-1-9-9"
- gradientUnits="userSpaceOnUse"
- x1="121.19734"
- y1="105.94044"
- x2="148.06364"
- y2="137.6748" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-35-0"
- id="radialGradient37501-4-64"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.08933014,-0.7764284,0.7350832,-0.08334857,57.410559,233.30156)"
- cx="135.83771"
- cy="117.97826"
- fx="135.83771"
- fy="117.97826"
- r="8" />
- <linearGradient
- id="linearGradient319-35-0">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-38-15" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-94-19" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-35-0"
- id="linearGradient37503-1-7"
- gradientUnits="userSpaceOnUse"
- x1="121.19734"
- y1="105.94044"
- x2="148.06364"
- y2="137.6748" />
- <linearGradient
- id="linearGradient18105-2-9">
- <stop
- id="stop18107-8-4"
- offset="0"
- style="stop-color:#162d50;stop-opacity:1" />
- <stop
- id="stop18109-1-4"
- offset="1"
- style="stop-color:#1e3e70;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient15531-9-5">
- <stop
- style="stop-color:#20539d;stop-opacity:1"
- offset="0"
- id="stop15534-1-3" />
- <stop
- style="stop-color:#bdc9df;stop-opacity:1"
- offset="1"
- id="stop15537-7-5" />
- </linearGradient>
- <linearGradient
- id="linearGradient23974-27-5">
- <stop
- id="stop23976-25-8"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop23978-48-3"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient27277-1-8">
- <stop
- id="stop27279-5-2"
- offset="0"
- style="stop-color:#444444;stop-opacity:1;" />
- <stop
- id="stop27281-4-1"
- offset="1"
- style="stop-color:#adadad;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient21327-63-5">
- <stop
- style="stop-color:#1e3e70;stop-opacity:1;"
- offset="0"
- id="stop21329-9-2" />
- <stop
- style="stop-color:#1e3e70;stop-opacity:0;"
- offset="1"
- id="stop21331-6-4" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient27301-6-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop27303-3-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop27305-7-4" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15530-7"
- id="linearGradient15537-5"
- x1="223.00443"
- y1="252.2876"
- x2="222.72559"
- y2="247.07268"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1.1092502,-0.02900917)" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient15530-7">
- <stop
- style="stop-color:#16396d;stop-opacity:1"
- offset="0"
- id="stop15533-4" />
- <stop
- style="stop-color:#739ad4;stop-opacity:1"
- offset="1"
- id="stop15535-4" />
- </linearGradient>
- <linearGradient
- id="linearGradient37542-40-9">
- <stop
- id="stop37544-6-0"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1" />
- <stop
- id="stop37546-3-3"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-84-1">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-78-7" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-30-96" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-84-3-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-78-3-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-30-9-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient38342-8"
- id="linearGradient15502-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1386698,0,0,1.1421744,-30.9218,-35.447285)"
- x1="214.40482"
- y1="253.6573"
- x2="225.75406"
- y2="244.98485" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient38342-8">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop38344-5" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop38346-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15482-65"
- id="linearGradient15474-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.625,0,0,1,355.875,184)"
- x1="-174.15565"
- y1="68.784225"
- x2="-185.42635"
- y2="63.762562" />
- <linearGradient
- id="linearGradient15482-65">
- <stop
- id="stop15484-4"
- offset="0"
- style="stop-color:#2869ab;stop-opacity:1" />
- <stop
- id="stop15486-2"
- offset="1"
- style="stop-color:#a7c8f0;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-6-11"
- id="linearGradient15467-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.56865388,0,0,0.77023595,345.79076,197.07321)"
- x1="-182.5201"
- y1="63.631611"
- x2="-170.82031"
- y2="62.441177" />
- <linearGradient
- id="linearGradient319-6-11">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-73-0" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-51-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15595-7"
- id="linearGradient15601-9"
- x1="248.04936"
- y1="256.02081"
- x2="238.4982"
- y2="243.66418"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient15595-7">
- <stop
- style="stop-color:#1b4685;stop-opacity:1;"
- offset="0"
- id="stop15597-5" />
- <stop
- style="stop-color:#183e75;stop-opacity:0;"
- offset="1"
- id="stop15599-3" />
- </linearGradient>
- <linearGradient
- y2="65.529938"
- x2="-162.92078"
- y1="62.360832"
- x1="-191.30537"
- gradientTransform="matrix(0.56865388,0,0,0.9414558,346.44835,191.39968)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient15576-5"
- xlink:href="#linearGradient319-6-1-5"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient319-6-1-5">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-73-4-5" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-51-8-0" />
- </linearGradient>
- <linearGradient
- gradientTransform="translate(-0.04936017,-0.02079917)"
- inkscape:collect="always"
- xlink:href="#linearGradient15614-7"
- id="linearGradient15620-8"
- x1="194.98087"
- y1="238.83058"
- x2="195.88264"
- y2="253.1198"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient15614-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15616-7" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15618-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-64-7"
- id="linearGradient42432-3-3"
- gradientUnits="userSpaceOnUse"
- x1="248.20378"
- y1="275.71143"
- x2="238.40068"
- y2="262.12378" />
- <linearGradient
- id="linearGradient1610-64-7">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-8-1" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-29-4" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15275-9"
- id="linearGradient15281-5"
- gradientUnits="userSpaceOnUse"
- x1="238.25577"
- y1="263.93561"
- x2="244.04422"
- y2="281.74426" />
- <linearGradient
- id="linearGradient15275-9">
- <stop
- id="stop15277-2"
- offset="0"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- id="stop15279-1"
- offset="1"
- style="stop-color:white;stop-opacity:1;" />
- </linearGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath42711-8-1">
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect42713-4-3"
- width="8.7252884"
- height="17.464855"
- x="127.4093"
- y="214.76154" />
- </clipPath>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15361-7"
- id="linearGradient15368-7"
- x1="132.26923"
- y1="125.62637"
- x2="132.11778"
- y2="119.48639"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient15361-7">
- <stop
- style="stop-color:#2766a6;stop-opacity:1;"
- offset="0"
- id="stop15363-7" />
- <stop
- style="stop-color:#6ba2e5;stop-opacity:1;"
- offset="1"
- id="stop15365-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15320-0"
- id="linearGradient15326-8"
- x1="134.91025"
- y1="122.37094"
- x2="129.09338"
- y2="113.63851"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient15320-0">
- <stop
- style="stop-color:#0868f5;stop-opacity:1;"
- offset="0"
- id="stop15322-3" />
- <stop
- style="stop-color:#fbfdfe;stop-opacity:1;"
- offset="1"
- id="stop15324-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient23974-0-2">
- <stop
- id="stop23976-22-8"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop23978-4-5"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient31320-4-3">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop31322-9-2" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop31324-3-5" />
- </linearGradient>
- <linearGradient
- id="linearGradient14262-95-2">
- <stop
- id="stop14264-2-2"
- offset="0"
- style="stop-color:#2661b6;stop-opacity:1;" />
- <stop
- id="stop14266-7-2"
- offset="1"
- style="stop-color:#c1d7f8;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-40-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-95-9" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-16-1" />
- </linearGradient>
- <linearGradient
- id="linearGradient23974-28-0-5">
- <stop
- id="stop23976-64-2-3"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop23978-5-3-7"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-23-4"
- id="radialGradient53141-5-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.684011,0.3442329,-1.2972142,1.1562236,739.67527,-1155.7895)"
- cx="975.50568"
- cy="690.68732"
- fx="975.50568"
- fy="690.68732"
- r="2.333364" />
- <linearGradient
- id="linearGradient319-23-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-65-0" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-3-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974-48-9"
- id="linearGradient53143-6-3"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8008385,0,0,0.821004,429.95027,-161.55482)"
- x1="108.71671"
- y1="171.25618"
- x2="105.85706"
- y2="168.04703" />
- <linearGradient
- id="linearGradient23974-48-9">
- <stop
- id="stop23976-13-7"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop23978-28-3"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20756-2-0"
- id="linearGradient53145-1-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8008385,0,0,0.8956408,540.31118,-183.20693)"
- x1="-27.086565"
- y1="177.33885"
- x2="-28.929489"
- y2="175.48488" />
- <linearGradient
- id="linearGradient20756-2-0">
- <stop
- style="stop-color:#2968c3;stop-opacity:1;"
- offset="0"
- id="stop20758-7-2" />
- <stop
- style="stop-color:#b5ccf0;stop-opacity:1;"
- offset="1"
- id="stop20760-0-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-23-4"
- id="linearGradient53147-9-4"
- gradientUnits="userSpaceOnUse"
- x1="510.29913"
- y1="-20.435461"
- x2="505.9494"
- y2="-17.546936" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient28399-4"
- id="linearGradient28405-0"
- x1="329.46249"
- y1="-104.63468"
- x2="331.51218"
- y2="-102.69718"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient28399-4">
- <stop
- style="stop-color:#0b1728;stop-opacity:1;"
- offset="0"
- id="stop28401-2" />
- <stop
- style="stop-color:#0b1728;stop-opacity:0;"
- offset="1"
- id="stop28403-4" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974-1-2"
- id="linearGradient18721-1-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,244.3928,19.4113)"
- x1="-87.329895"
- y1="-122.61974"
- x2="-80.592239"
- y2="-126.83872" />
- <linearGradient
- id="linearGradient23974-1-2">
- <stop
- id="stop23976-3-3"
- offset="0"
- style="stop-color:#3e7dd7;stop-opacity:0" />
- <stop
- style="stop-color:#8faedb;stop-opacity:1"
- offset="0.48394433"
- id="stop28407-8" />
- <stop
- id="stop23978-26-7"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient31320-0-3"
- id="linearGradient18728-6-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,222.97812,19.5574)"
- x1="68.688324"
- y1="51.42366"
- x2="72.671516"
- y2="55.501457" />
- <linearGradient
- id="linearGradient31320-0-3">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop31322-4-5" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop31324-9-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262-97-5"
- id="linearGradient18765-0-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,309.42934,-349.44584)"
- x1="-20.377066"
- y1="250.63214"
- x2="-23.077509"
- y2="252.61113" />
- <linearGradient
- id="linearGradient14262-97-5">
- <stop
- id="stop14264-0-6"
- offset="0"
- style="stop-color:#2661b6;stop-opacity:1;" />
- <stop
- id="stop14266-6-3"
- offset="1"
- style="stop-color:#c1d7f8;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-406-5"
- id="linearGradient18712-0-7"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="111.30827"
- y1="56.21777"
- x2="106.06621"
- y2="52.58638" />
- <linearGradient
- id="linearGradient319-406-5">
- <stop
- style="stop-color:#ffffff;stop-opacity:0"
- offset="0"
- id="stop320-76-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1"
- offset="1"
- id="stop321-36-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15539-2"
- id="linearGradient15545-5"
- x1="220.10603"
- y1="248.22742"
- x2="219.99527"
- y2="254.01555"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1.1092502,-0.02900917)" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient15539-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15541-7" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15543-1" />
- </linearGradient>
- <linearGradient
- gradientTransform="translate(-0.04936017,-0.02079917)"
- inkscape:collect="always"
- xlink:href="#linearGradient15547-6"
- id="linearGradient15553-4"
- x1="216.16943"
- y1="248.86955"
- x2="216.65909"
- y2="252.40509"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient15547-6">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15549-6" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15551-1" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient38363-7"
- id="radialGradient15517-8"
- cx="217.74739"
- cy="253.99704"
- fx="217.74739"
- fy="253.99704"
- r="9.0099697"
- gradientTransform="matrix(2.3861605,-0.28739765,0.07141566,0.59293888,-320.08363,164.28237)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient38363-7">
- <stop
- id="stop38365-1"
- offset="0"
- style="stop-color:#1d4d91;stop-opacity:1" />
- <stop
- style="stop-color:#658fd4;stop-opacity:1;"
- offset="0.44217443"
- id="stop15519-3" />
- <stop
- id="stop38367-1"
- offset="1"
- style="stop-color:#c3d7ff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient38342-8"
- id="linearGradient38716-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1386698,0,0,1.1421744,-30.97116,-35.468084)"
- x1="209.90396"
- y1="249.06081"
- x2="234.13614"
- y2="251.62866" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-56-4"
- id="linearGradient17222-4-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.923955,0,0,1,-18.1369,-168)"
- x1="29.352921"
- y1="199"
- x2="29.352921"
- y2="250" />
- <linearGradient
- id="linearGradient37542-56-4">
- <stop
- id="stop37544-88-5"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-9-2"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-528-2"
- id="linearGradient17224-0-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.2222204,0,-15.888744)"
- x1="5.9836898"
- y1="71.51989"
- x2="16.733877"
- y2="88" />
- <linearGradient
- id="linearGradient319-528-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-68-7" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-86-7" />
- </linearGradient>
- <linearGradient
- id="linearGradient10069-24-4">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-3-2" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-4-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-67-6"
- id="linearGradient42519-8-7"
- gradientUnits="userSpaceOnUse"
- x1="114.15679"
- y1="100.93772"
- x2="137.5759"
- y2="124.47867" />
- <linearGradient
- id="linearGradient1610-67-6">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-75-5" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-31-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030-41-5"
- id="linearGradient42523-5-8"
- gradientUnits="userSpaceOnUse"
- x1="190.68166"
- y1="244.14676"
- x2="174.75458"
- y2="226.33672" />
- <linearGradient
- id="linearGradient9030-41-5">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop9032-2-0" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop9034-10-1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-76-2"
- id="linearGradient42521-3-0"
- gradientUnits="userSpaceOnUse"
- x1="131.12576"
- y1="118"
- x2="140.19273"
- y2="125.82862" />
- <linearGradient
- id="linearGradient319-76-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-3-9" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-18-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24679-9-1"
- id="linearGradient25927-1-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.043478,0,0,0.956667,-30.15217,152.41412)"
- x1="121.79003"
- y1="283.00519"
- x2="114.66669"
- y2="250.69945" />
- <linearGradient
- id="linearGradient24679-9-1">
- <stop
- style="stop-color:#3d361a;stop-opacity:1;"
- offset="0"
- id="stop24681-7-0" />
- <stop
- id="stop24683-6-7"
- offset="0.45537567"
- style="stop-color:#d1c595;stop-opacity:1;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop24685-4-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24671-1-3"
- id="linearGradient25929-7-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-149,133.99245)"
- x1="243.25"
- y1="283.94504"
- x2="235"
- y2="253.00755" />
- <linearGradient
- id="linearGradient24671-1-3">
- <stop
- style="stop-color:#3d361a;stop-opacity:1;"
- offset="0"
- id="stop24673-7-4" />
- <stop
- id="stop24675-7-4"
- offset="0.29527253"
- style="stop-color:#d1c595;stop-opacity:1;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop24677-5-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-16-6"
- id="linearGradient15963-3"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-335,238.99245)"
- x1="425.5929"
- y1="179.08949"
- x2="425"
- y2="179.12285" />
- <linearGradient
- id="linearGradient319-16-6">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-683-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-08-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-86-8"
- id="linearGradient15744-9-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.207032,0,0,0.903901,679.30638,-38.92179)"
- x1="390.61163"
- y1="229.34804"
- x2="390.55936"
- y2="248.24983" />
- <linearGradient
- id="linearGradient37542-86-8">
- <stop
- id="stop37544-39-4"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-7-6"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-0-3"
- id="linearGradient10982-8-5"
- x1="207.04637"
- y1="182.09375"
- x2="213.7883"
- y2="182.52524"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient319-0-3">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-15-31" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-26-3" />
- </linearGradient>
- <linearGradient
- y2="121"
- x2="235.90916"
- y1="107.25085"
- x1="217.22589"
- gradientTransform="matrix(1.0222226,0,0,0.73333282,-29.133504,-14.766607)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient16268-9"
- xlink:href="#linearGradient37542-86-0-1"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient37542-86-0-1">
- <stop
- id="stop37544-39-8-4"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-7-1-1"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- y2="118.5"
- x2="235"
- y1="118.5"
- x1="228.5468"
- gradientTransform="matrix(0,1.253963,1,0,-46.30656,-81.941791)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient16302-5"
- xlink:href="#linearGradient319-0-2-5"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient319-0-2-5">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-15-0-3" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-26-9-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-86-2-7"
- id="linearGradient15744-9-0-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.207032,0,0,0.903901,679.30638,-38.92179)"
- x1="388.85464"
- y1="230.24152"
- x2="390.55936"
- y2="248.24983" />
- <linearGradient
- id="linearGradient37542-86-2-7">
- <stop
- id="stop37544-39-5-3"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-7-2-9"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-0-4-4"
- id="linearGradient10982-8-9-5"
- x1="207.04637"
- y1="182.09375"
- x2="213.7883"
- y2="182.52524"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient319-0-4-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-15-3-2" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-26-2-9" />
- </linearGradient>
- <linearGradient
- y2="121"
- x2="235.90916"
- y1="107.25085"
- x1="217.22589"
- gradientTransform="matrix(1.0222226,0,0,0.73333282,-29.2335,-145.66661)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient16268-5-0"
- xlink:href="#linearGradient37542-86-0-6-8"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient37542-86-0-6-8">
- <stop
- id="stop37544-39-8-7-4"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-7-1-5-6"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- y2="118.5"
- x2="235"
- y1="118.5"
- x1="228.5468"
- gradientTransform="matrix(0,1.253963,-1,0,177.20656,-82.04179)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient16302-3-4"
- xlink:href="#linearGradient319-0-2-3-8"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient319-0-2-3-8">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-15-0-0-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-26-9-5-3" />
- </linearGradient>
- <linearGradient
- id="linearGradient15859-1">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop15861-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop15863-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17523-0-7-7"
- id="linearGradient27998-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(214.99838,108.99542)"
- x1="87.765633"
- y1="16.828125"
- x2="85.033081"
- y2="18.891191" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient17523-0-7-7">
- <stop
- style="stop-color:#323232;stop-opacity:1;"
- offset="0"
- id="stop17525-0-3-1" />
- <stop
- style="stop-color:#323232;stop-opacity:0;"
- offset="1"
- id="stop17527-5-9-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17515-1-4-4"
- id="linearGradient28000-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(206.99837,-42.004575)"
- x1="95.812523"
- y1="167.78125"
- x2="93.152969"
- y2="169.77431" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient17515-1-4-4">
- <stop
- style="stop-color:#8c8c8c;stop-opacity:1;"
- offset="0"
- id="stop17517-7-4-5" />
- <stop
- style="stop-color:#8c8c8c;stop-opacity:0;"
- offset="1"
- id="stop17519-6-7-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17532-0-9-1"
- id="linearGradient28002-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(206.99837,-42.004575)"
- x1="95.322037"
- y1="167.49391"
- x2="92.640839"
- y2="169.55806" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient17532-0-9-1">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop17534-2-2-5" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop17536-3-0-8" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-5-1-4-8"
- id="radialGradient28004-7"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.050372,0,0,1.050372,-3.551238,-0.730396)"
- cx="70.5"
- cy="14.5"
- fx="70.5"
- fy="14.5"
- r="1.5" />
- <linearGradient
- id="linearGradient10069-5-1-4-8">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-9-18-9-9" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-8-252-1-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient36273-9-4-2-3"
- id="linearGradient28006-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4000084,0,0,0.4000084,344.60085,-50.387906)"
- x1="-103.37495"
- y1="417.87503"
- x2="-101.49999"
- y2="419.75" />
- <linearGradient
- id="linearGradient36273-9-4-2-3">
- <stop
- id="stop36275-9-0-3-3"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:1;" />
- <stop
- id="stop36277-1-3-5-2"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient36273-9-4-22-0"
- id="linearGradient28008-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4000084,0,0,0.4000084,350.57878,-38.420763)"
- x1="-103.37495"
- y1="417.87503"
- x2="-101.49999"
- y2="419.75" />
- <linearGradient
- id="linearGradient36273-9-4-22-0">
- <stop
- id="stop36275-9-0-6-7"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:1;" />
- <stop
- id="stop36277-1-3-6-9"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17523-8"
- id="linearGradient27963-5"
- gradientUnits="userSpaceOnUse"
- x1="87.765633"
- y1="16.828125"
- x2="85.033081"
- y2="18.891191" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient17523-8">
- <stop
- style="stop-color:#323232;stop-opacity:1;"
- offset="0"
- id="stop17525-7" />
- <stop
- style="stop-color:#323232;stop-opacity:0;"
- offset="1"
- id="stop17527-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17515-0"
- id="linearGradient27965-1"
- gradientUnits="userSpaceOnUse"
- x1="95.812523"
- y1="167.78125"
- x2="93.152969"
- y2="169.77431" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient17515-0">
- <stop
- style="stop-color:#8c8c8c;stop-opacity:1;"
- offset="0"
- id="stop17517-3" />
- <stop
- style="stop-color:#8c8c8c;stop-opacity:0;"
- offset="1"
- id="stop17519-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17532-4"
- id="linearGradient27967-9"
- gradientUnits="userSpaceOnUse"
- x1="95.322037"
- y1="167.49391"
- x2="92.640839"
- y2="169.55806" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient17532-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop17534-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop17536-4" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-5-1-8"
- id="radialGradient27969-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.050372,0,0,1.050372,-3.551238,-0.730396)"
- cx="70.5"
- cy="14.5"
- fx="70.5"
- fy="14.5"
- r="1.5" />
- <linearGradient
- id="linearGradient10069-5-1-8">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-9-18-3" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-8-252-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient36273-9-4-8"
- id="linearGradient27971-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4000084,0,0,0.4000084,137.60085,-8.4035259)"
- x1="-103.37495"
- y1="417.87503"
- x2="-101.49999"
- y2="419.75" />
- <linearGradient
- id="linearGradient36273-9-4-8">
- <stop
- id="stop36275-9-0-0"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:1;" />
- <stop
- id="stop36277-1-3-8"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient36273-9-4-8"
- id="linearGradient27973-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4000084,0,0,0.4000084,143.60084,3.5964739)"
- x1="-103.37495"
- y1="417.87503"
- x2="-101.49999"
- y2="419.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17523-0-5"
- id="linearGradient17973-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(176.0221,109.0221)"
- x1="87.765633"
- y1="16.828125"
- x2="85.033081"
- y2="18.891191" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient17523-0-5">
- <stop
- style="stop-color:#323232;stop-opacity:1;"
- offset="0"
- id="stop17525-0-6" />
- <stop
- style="stop-color:#323232;stop-opacity:0;"
- offset="1"
- id="stop17527-5-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17515-1-9"
- id="linearGradient17975-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(168.02209,-41.977903)"
- x1="95.812523"
- y1="167.78125"
- x2="93.152969"
- y2="169.77431" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient17515-1-9">
- <stop
- style="stop-color:#8c8c8c;stop-opacity:1;"
- offset="0"
- id="stop17517-7-9" />
- <stop
- style="stop-color:#8c8c8c;stop-opacity:0;"
- offset="1"
- id="stop17519-6-1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17532-0-8"
- id="linearGradient17977-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(168.02209,-41.977903)"
- x1="95.322037"
- y1="167.49391"
- x2="92.640839"
- y2="169.55806" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient17532-0-8">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop17534-2-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop17536-3-8" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-5-12"
- id="radialGradient17979-7"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.050372,0,0,1.050372,-3.551238,-0.730396)"
- cx="70.5"
- cy="14.5"
- fx="70.5"
- fy="14.5"
- r="1.5" />
- <linearGradient
- id="linearGradient10069-5-12">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-9-7" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-8-4" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient36273-9-9"
- id="linearGradient17981-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4000084,0,0,0.4000084,305.60083,-50.403526)"
- x1="-103.37495"
- y1="417.87503"
- x2="-101.49999"
- y2="419.75" />
- <linearGradient
- id="linearGradient36273-9-9">
- <stop
- id="stop36275-9-8"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:1;" />
- <stop
- id="stop36277-1-35"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient36273-9-9"
- id="linearGradient17983-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4000084,0,0,0.4000084,311.60082,-38.403526)"
- x1="-103.37495"
- y1="417.87503"
- x2="-101.49999"
- y2="419.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030-4-6-0"
- id="linearGradient32430-7-9-7"
- gradientUnits="userSpaceOnUse"
- x1="190.68166"
- y1="244.14676"
- x2="174.75458"
- y2="226.33672" />
- <linearGradient
- id="linearGradient9030-4-6-0">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop9032-3-3-8" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop9034-1-6-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-7-1-7-2-5-2"
- id="linearGradient32434-5-8-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,-1,73,792.5)"
- x1="346"
- y1="128.5"
- x2="368"
- y2="123.5" />
- <linearGradient
- id="linearGradient44939-8-7-1-7-2-5-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop44941-8-4-5-4-7-8-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop44943-2-0-2-0-1-0-2" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40455-7-1-6-0"
- id="radialGradient15137-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.7881042,0.01544832,-0.01690407,0.7184169,-16.705439,29.204304)"
- cx="-73.227486"
- cy="95.949913"
- fx="-73.227486"
- fy="95.949913"
- r="4.9999957" />
- <linearGradient
- id="linearGradient40455-7-1-6-0">
- <stop
- id="stop40457-6-6-8-7"
- offset="0"
- style="stop-color:#fff991;stop-opacity:1;" />
- <stop
- id="stop40459-1-8-7-9"
- offset="1"
- style="stop-color:#fffbb9;stop-opacity:0;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40578-4-8-7-5-3"
- id="radialGradient15139-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.4769848,-0.5257394,0.6056598,0.5494938,269.68012,490.96577)"
- cx="756.83508"
- cy="206.40076"
- fx="756.83508"
- fy="206.40076"
- r="6.9000001" />
- <linearGradient
- id="linearGradient40578-4-8-7-5-3">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop40580-8-9-6-1-7" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop40582-6-8-1-8-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334-9-6-7"
- id="linearGradient15141-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(670,-33)"
- x1="89.012573"
- y1="243.96121"
- x2="93.0625"
- y2="249" />
- <linearGradient
- id="linearGradient58334-9-6-7">
- <stop
- id="stop58336-27-3-0"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:0.87628865;" />
- <stop
- id="stop58338-9-5-0"
- offset="1.0000000"
- style="stop-color:#fffffe;stop-opacity:0.0000000;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-4-1-4"
- id="linearGradient15143-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(1,-94.999998)"
- x1="754.28558"
- y1="300.83292"
- x2="758"
- y2="305" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-4-1-4">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-31-1-1" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-23-1-2" />
- </linearGradient>
- <linearGradient
- id="linearGradient44939-8-6-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop44941-8-0-7" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop44943-2-7-6" />
- </linearGradient>
- <linearGradient
- id="linearGradient44939-8-0-9">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop44941-8-1-2" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop44943-2-3-1" />
- </linearGradient>
- <linearGradient
- id="linearGradient25108-1-0">
- <stop
- id="stop25110-8-5"
- offset="0"
- style="stop-color:white;stop-opacity:1;" />
- <stop
- id="stop25112-1-0"
- offset="1"
- style="stop-color:#c6c6c6;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient44939-8-7-1-7-2-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop44941-8-4-5-4-7-86" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop44943-2-0-2-0-1-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-7-1-7-2-4"
- id="linearGradient55624"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,-1,73,792.5)"
- x1="346"
- y1="128.5"
- x2="368"
- y2="123.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15098"
- id="linearGradient55656"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,221,10)"
- x1="115.01612"
- y1="12"
- x2="106.125"
- y2="19.9375" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient25108-1-0"
- id="linearGradient55785"
- gradientUnits="userSpaceOnUse"
- x1="436.54755"
- y1="524.30481"
- x2="434.49387"
- y2="519.46057" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient25108-1-0"
- id="linearGradient55787"
- gradientUnits="userSpaceOnUse"
- x1="432.0849"
- y1="524.97125"
- x2="433"
- y2="526" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-19-0"
- id="linearGradient55950"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="117.12428"
- y2="56.069553" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-19-0"
- id="linearGradient55952"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(207,-246.99988)"
- x1="-56.5"
- y1="342.0625"
- x2="-49"
- y2="341" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14482"
- id="linearGradient55954"
- gradientUnits="userSpaceOnUse"
- x1="149.55806"
- y1="94.884857"
- x2="149.53032"
- y2="101.436" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-95-2-7-1"
- id="linearGradient55956"
- gradientUnits="userSpaceOnUse"
- x1="132"
- y1="117.26753"
- x2="142.72656"
- y2="127.72736" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-8-3-3-0"
- id="linearGradient55958"
- gradientUnits="userSpaceOnUse"
- x1="126.55782"
- y1="113.57294"
- x2="132.41052"
- y2="118.81034" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-0-9"
- id="linearGradient55988"
- gradientUnits="userSpaceOnUse"
- x1="279.75"
- y1="101.5"
- x2="284.5"
- y2="106.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-6-2"
- id="linearGradient55990"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,593.02125,-1.8e-6)"
- x1="279"
- y1="102"
- x2="281.75"
- y2="102" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient56084"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(210.99996,-273.00002)"
- x1="308"
- y1="323"
- x2="343.26239"
- y2="340" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-08"
- id="linearGradient56084-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(210.99996,-273.00002)"
- x1="308"
- y1="323"
- x2="343.26239"
- y2="340" />
- <linearGradient
- id="linearGradient319-08">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-36" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-21" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-08"
- id="linearGradient29129-4"
- gradientUnits="userSpaceOnUse"
- x1="732.9375"
- y1="412.8125"
- x2="753.40625"
- y2="418.33594" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-71"
- id="linearGradient56084-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(210.99996,-273.00002)"
- x1="308"
- y1="323"
- x2="343.26239"
- y2="340" />
- <linearGradient
- id="linearGradient319-71">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-33" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-71"
- id="linearGradient29129-1"
- gradientUnits="userSpaceOnUse"
- x1="732.9375"
- y1="412.8125"
- x2="753.40625"
- y2="418.33594" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-24-4"
- id="linearGradient56401"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2868892,0,0,1,-249.7433,-143.02079)"
- x1="348.06064"
- y1="220.55545"
- x2="363.71661"
- y2="239.94608" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-76-2"
- id="linearGradient56428"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9050931,-7.9558708e-4,0.00612764,0.9147058,27.439091,-300.45853)"
- x1="299.70026"
- y1="408.49368"
- x2="322.08145"
- y2="429.53806" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15859-1"
- id="linearGradient14951"
- gradientUnits="userSpaceOnUse"
- x1="4.1933641"
- y1="199.12067"
- x2="17.16466"
- y2="211.01585" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15859-1-3"
- id="linearGradient14951-4"
- gradientUnits="userSpaceOnUse"
- x1="12.602254"
- y1="206.13333"
- x2="26.167894"
- y2="220.66356" />
- <linearGradient
- id="linearGradient15859-1-3">
- <stop
- style="stop-color:#ff992b;stop-opacity:1"
- offset="0"
- id="stop15861-1-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop15863-7-73" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974-28-0-5"
- id="linearGradient15989"
- gradientUnits="userSpaceOnUse"
- x1="94.485573"
- y1="122.13319"
- x2="89.207298"
- y2="125.83332" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient31320-4-3"
- id="linearGradient15994"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,222.97812,19.5574)"
- x1="68.688324"
- y1="51.42366"
- x2="72.671516"
- y2="55.501457" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-40-7"
- id="linearGradient16002"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,69.29396,203.19342)"
- x1="103.65562"
- y1="49.547874"
- x2="120.79755"
- y2="57.84819" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262-95-2"
- id="linearGradient16005"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,139.37998,3.53336)"
- x1="-26.207859"
- y1="252.77303"
- x2="-5.4963508"
- y2="253.15045" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974-0-2"
- id="linearGradient16010"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,74.34344,372.3905)"
- x1="-88.73024"
- y1="-120.6127"
- x2="-78.787354"
- y2="-128.30418" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27301-6-2"
- id="linearGradient16558"
- gradientUnits="userSpaceOnUse"
- x1="497"
- y1="264"
- x2="507.125"
- y2="276.75"
- gradientTransform="translate(-0.04936017,-0.04091017)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient21327-63-5"
- id="linearGradient16561"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.04935997,0.97920913)"
- x1="500.71924"
- y1="270.24997"
- x2="477"
- y2="274" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27277-1-8"
- id="linearGradient16564"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.04935997,1.9965991)"
- x1="501.19104"
- y1="270.69452"
- x2="488.93024"
- y2="272.60611" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974-27-5"
- id="linearGradient16567"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9993234,0,0,1.0050357,383.02168,218.70121)"
- x1="116.41398"
- y1="53.197613"
- x2="104.06187"
- y2="53.601826" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15531-9-5"
- id="linearGradient16570"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9993234,0,0,1.0050357,383.02168,218.70121)"
- x1="116.41398"
- y1="53.197613"
- x2="109.72195"
- y2="43.434277" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18105-2-9"
- id="linearGradient16573"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.04935997,1.9792524)"
- x1="492.95264"
- y1="267.42996"
- x2="496.73859"
- y2="270.36874" />
- <linearGradient
- id="linearGradient1610-3-7-4">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-1-4-3" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-6-0-9" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-5-9-4-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-761-8-8-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-89-24-8-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-3-7-4"
- id="linearGradient16887"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(22,0)"
- x1="-70.605209"
- y1="-121.58411"
- x2="-28.177105"
- y2="-89.026711" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-5-9-4-2"
- id="linearGradient16889"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(22,0)"
- x1="-74"
- y1="-124"
- x2="-55.5975"
- y2="-103.2075" />
- <linearGradient
- id="linearGradient319-95">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-242" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-44" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-43"
- id="linearGradient22933-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(15.081669,359)"
- x1="245.63066"
- y1="106.28436"
- x2="245.80791"
- y2="94.440376" />
- <linearGradient
- id="linearGradient37542-43">
- <stop
- id="stop37544-7"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-12"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-48"
- id="linearGradient22935-6"
- gradientUnits="userSpaceOnUse"
- x1="268"
- y1="462"
- x2="256"
- y2="459" />
- <linearGradient
- id="linearGradient319-48">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-64" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-59"
- id="linearGradient22937-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(12.999999,359)"
- x1="247"
- y1="99"
- x2="247"
- y2="94" />
- <linearGradient
- id="linearGradient10069-59">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-30" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-48"
- id="linearGradient22939-8"
- gradientUnits="userSpaceOnUse"
- x1="263.5"
- y1="455.25"
- x2="263.5"
- y2="460.5" />
- <linearGradient
- y2="460.6622"
- x2="264"
- y1="452"
- x1="264"
- gradientTransform="matrix(1,0,0,0.6,-5,182.8)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient17039"
- xlink:href="#linearGradient319-48"
- inkscape:collect="always" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-43-6"
- id="linearGradient22933-6-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(15.081669,359)"
- x1="245.63066"
- y1="106.28436"
- x2="245.80791"
- y2="94.440376" />
- <linearGradient
- id="linearGradient37542-43-6">
- <stop
- id="stop37544-7-2"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-12-6"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-48-6"
- id="linearGradient22935-6-2"
- gradientUnits="userSpaceOnUse"
- x1="268"
- y1="462"
- x2="256"
- y2="459" />
- <linearGradient
- id="linearGradient319-48-6">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-64-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-6-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-59-3"
- id="linearGradient22937-4-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(12.999999,359)"
- x1="247"
- y1="99"
- x2="247"
- y2="94" />
- <linearGradient
- id="linearGradient10069-59-3">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-30-1" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-3-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-48-6"
- id="linearGradient22939-8-6"
- gradientUnits="userSpaceOnUse"
- x1="263.5"
- y1="455.25"
- x2="263.5"
- y2="460.5" />
- <linearGradient
- y2="460.6622"
- x2="264"
- y1="452"
- x1="264"
- gradientTransform="matrix(1,0,0,0.6,-5,182.8)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient17172"
- xlink:href="#linearGradient319-48-6"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient319-48-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-64-7" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-6-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-43-3"
- id="linearGradient22933-6-87"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(15.081669,359)"
- x1="245.63066"
- y1="106.28436"
- x2="245.80791"
- y2="94.440376" />
- <linearGradient
- id="linearGradient37542-43-3">
- <stop
- id="stop37544-7-8"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-12-4"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-48-5"
- id="linearGradient22935-6-22"
- gradientUnits="userSpaceOnUse"
- x1="268"
- y1="462"
- x2="256"
- y2="459" />
- <linearGradient
- id="linearGradient319-48-5">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-64-3" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-6-50" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-59-8"
- id="linearGradient22937-4-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(12.999999,359)"
- x1="247"
- y1="99"
- x2="247"
- y2="94" />
- <linearGradient
- id="linearGradient10069-59-8">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-30-2" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-3-06" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-48-5"
- id="linearGradient22939-8-3"
- gradientUnits="userSpaceOnUse"
- x1="263.5"
- y1="455.25"
- x2="263.5"
- y2="460.5" />
- <linearGradient
- y2="460.6622"
- x2="264"
- y1="452"
- x1="264"
- gradientTransform="matrix(1,0,0,0.6,-5,182.8)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient17172-9"
- xlink:href="#linearGradient319-48-5"
- inkscape:collect="always" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17438"
- id="linearGradient17582"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-42,-19)"
- x1="267.125"
- y1="462.1875"
- x2="267.25"
- y2="450" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17596"
- id="linearGradient17584"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-26.918331,340)"
- x1="245.91833"
- y1="101"
- x2="246.02513"
- y2="94.443054" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-48-4"
- id="linearGradient17586"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-42,-19)"
- x1="268"
- y1="462"
- x2="256"
- y2="459" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17602"
- id="linearGradient17588"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-29.000001,340)"
- x1="247"
- y1="102"
- x2="247"
- y2="95.409012" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17430"
- id="linearGradient17590"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-42,-19)"
- x1="270.5"
- y1="464.0625"
- x2="270.125"
- y2="447.0625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-48-4"
- id="linearGradient17592"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-42,-19)"
- x1="263.5"
- y1="455.25"
- x2="263.5"
- y2="460.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-48-4"
- id="linearGradient17594"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.6,-47,163.8)"
- x1="264"
- y1="452"
- x2="264"
- y2="460.6622" />
- <linearGradient
- id="linearGradient37542-1">
- <stop
- id="stop37544-62"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-4"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-75">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-39" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-1"
- id="linearGradient17715"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.88913256,0,0,0.96231883,-17.039429,-158.76811)"
- x1="30.435225"
- y1="202.99998"
- x2="30.435225"
- y2="251.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-75"
- id="linearGradient17717"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.92839719,0,0,1.1347062,0.81276468,-9.2113636)"
- x1="5.9836898"
- y1="71.51989"
- x2="18.903511"
- y2="81.589714" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-95"
- id="linearGradient17932"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,627.46943,130.00389)"
- x1="86.452194"
- y1="101.22832"
- x2="110.48556"
- y2="81.14637" />
- <linearGradient
- id="linearGradient37542-49">
- <stop
- id="stop37544-8"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-99"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-995">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-08" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-273" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-49"
- id="linearGradient20080"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.172144,-379,416.1659)"
- x1="42.033173"
- y1="164.51399"
- x2="75.32457"
- y2="164.51399" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-995"
- id="linearGradient20084"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.3333334,0,0,0.8333334,685.50001,836.08335)"
- x1="-285.65732"
- y1="-274.23453"
- x2="-279.44821"
- y2="-268.04858" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-49-3"
- id="linearGradient20080-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.172144,-379,416.1659)"
- x1="42.033173"
- y1="164.51399"
- x2="75.32457"
- y2="164.51399" />
- <linearGradient
- id="linearGradient37542-49-3">
- <stop
- id="stop37544-8-7"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-99-8"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-49-3"
- id="linearGradient20082-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(216,445.00002)"
- x1="118.1319"
- y1="157.11609"
- x2="85.577972"
- y2="157.54283" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-995-3"
- id="linearGradient20084-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.3333334,0,0,0.8333334,685.50001,836.08335)"
- x1="-285.65732"
- y1="-274.23453"
- x2="-279.44821"
- y2="-268.04858" />
- <linearGradient
- id="linearGradient319-995-3">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-08-6" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-273-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-49"
- id="linearGradient20199"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(209.99848,445.06252)"
- x1="118.1319"
- y1="157.11609"
- x2="85.577972"
- y2="157.54283" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-66-0-4-7"
- id="linearGradient16783-1-6-0-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.707654,0,0,0.707942,290.55464,214.86015)"
- x1="35.597904"
- y1="158.14117"
- x2="17.012707"
- y2="172.79289" />
- <linearGradient
- id="linearGradient37542-66-0-4-7">
- <stop
- id="stop37544-85-0-9-9"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-15-9-5-7"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4343-1-1-9-1"
- id="linearGradient16778-3-5-3-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5990464,-0.03583042,0.03242597,0.6546824,306.65287,109.38342)"
- x1="-12.264804"
- y1="333.22653"
- x2="-10.869003"
- y2="334.86029" />
- <linearGradient
- id="linearGradient4343-1-1-9-1">
- <stop
- id="stop4345-2-9-5-6"
- offset="0"
- style="stop-color:white;stop-opacity:1;" />
- <stop
- id="stop4347-1-5-5-1"
- offset="1"
- style="stop-color:#fff9f9;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-73-3-4-6"
- id="linearGradient16775-4-9-5-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(497.01612,511)"
- x1="-190.37566"
- y1="-180.13821"
- x2="-189.34792"
- y2="-182" />
- <linearGradient
- id="linearGradient319-73-3-4-6">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-87-5-2-2" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-66-3-7-3" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-65-4-8">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-14-9-5" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-49-3-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-65-4-8"
- id="linearGradient17904-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-97,-102)"
- x1="386.88852"
- y1="409.84152"
- x2="389.14081"
- y2="412.45016" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-65-4-8"
- id="linearGradient17893-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-106,-102)"
- x1="387"
- y1="409.86362"
- x2="388.86676"
- y2="411.88974" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-65-4-8"
- id="linearGradient18148"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-102,-94)"
- x1="387"
- y1="410"
- x2="388.78125"
- y2="411.78125" />
- <linearGradient
- id="linearGradient23974-3">
- <stop
- id="stop23976-6"
- offset="0"
- style="stop-color:#a3a3a3;stop-opacity:1" />
- <stop
- id="stop23978-2"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-47">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-85" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-48" />
- </linearGradient>
- <linearGradient
- id="linearGradient23974-3-78">
- <stop
- id="stop23976-6-5"
- offset="0"
- style="stop-color:#a3a3a3;stop-opacity:1" />
- <stop
- id="stop23978-2-4"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient16504-0">
- <stop
- id="stop16506-3"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:1" />
- <stop
- id="stop16508-0"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-47-9">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-85-3" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-48-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-36-6-5"
- id="linearGradient17833-9"
- gradientUnits="userSpaceOnUse"
- x1="209"
- y1="238"
- x2="226.625"
- y2="251.71078"
- gradientTransform="translate(144,188)" />
- <linearGradient
- id="linearGradient1610-36-6-5">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-1-9-6" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-5-9-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-36-6-7"
- id="linearGradient17833-8"
- gradientUnits="userSpaceOnUse"
- x1="209"
- y1="238"
- x2="226.625"
- y2="251.71078"
- gradientTransform="translate(144,188)" />
- <linearGradient
- id="linearGradient1610-36-6-7">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-1-9-4" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-5-9-87" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-96"
- id="linearGradient20796-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(159.9998,-41.00751)"
- x1="261.44702"
- y1="234.6606"
- x2="274.30609"
- y2="247.73561" />
- <linearGradient
- id="linearGradient37542-96">
- <stop
- id="stop37544-7-1"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-0"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-37"
- id="linearGradient20798-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(199.9999,105.99249)"
- x1="235.46884"
- y1="103"
- x2="228.71886"
- y2="94.53125" />
- <linearGradient
- id="linearGradient10069-37">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-0" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-9"
- id="linearGradient39254-3"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,513.5,184.50451)"
- x1="253.78497"
- y1="3.6831069"
- x2="278.25537"
- y2="30.023426" />
- <linearGradient
- id="linearGradient1610-9">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-4-7" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-09" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40578-4-8-9"
- id="radialGradient39256-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3817213,-0.4377393,0.4780868,0.4169055,368.09749,451.76937)"
- cx="756.83508"
- cy="206.40076"
- fx="756.83508"
- fy="206.40076"
- r="6.9000001" />
- <linearGradient
- id="linearGradient40578-4-8-9">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop40580-8-9-0" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop40582-6-8-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334-2"
- id="linearGradient39258-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(670,-33)"
- x1="87"
- y1="241.125"
- x2="93.0625"
- y2="249" />
- <linearGradient
- id="linearGradient58334-2">
- <stop
- id="stop58336-97"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:0.87628865;" />
- <stop
- id="stop58338-90"
- offset="1.0000000"
- style="stop-color:#fffffe;stop-opacity:0.0000000;" />
- </linearGradient>
- <linearGradient
- y2="305"
- x2="758"
- y1="300.83292"
- x1="754.28558"
- gradientTransform="translate(0,-95.999998)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient16151"
- xlink:href="#linearGradient16500-49"
- inkscape:collect="always" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-49">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-16" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-7409-7-7-19-1-1"
- id="linearGradient79029"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.1666676,0,0,-1.1666676,795.08409,370.66085)"
- x1="262.04343"
- y1="233.0448"
- x2="273.85818"
- y2="247.32738" />
- <linearGradient
- id="linearGradient37542-7409-7-7-19-1-1">
- <stop
- id="stop37544-48-6-1-8-9-3"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-82-1-0-6-8-2"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-4-7-8-3-0-3-6"
- id="linearGradient79025"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.53706486,0,0,0.53706486,426.82889,65.03941)"
- x1="97.616623"
- y1="39.47208"
- x2="94.157646"
- y2="35.759052" />
- <linearGradient
- id="linearGradient44939-8-4-7-8-3-0-3-6">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop44941-8-5-40-2-4-2-4-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop44943-2-5-9-4-9-8-0-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-5-4-6-5-0-3-6"
- id="linearGradient79020"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.53706486,0,0,-0.53706486,531.01948,106.93034)"
- x1="97.616623"
- y1="39.47208"
- x2="94.157646"
- y2="35.759052" />
- <linearGradient
- id="linearGradient10069-9-7-5-4-6-5-0-3-6">
- <stop
- style="stop-color:#252525;stop-opacity:1"
- offset="0"
- id="stop10071-5-4-58-5-9-1-2-1-9" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-43-0-4-0-8-0-4-9-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient81143-4"
- id="linearGradient80406-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.58017143,0,0,0.92830994,410.31278,270.33169)"
- x1="-187.57428"
- y1="63.340904"
- x2="-157.37125"
- y2="79.243309" />
- <linearGradient
- id="linearGradient81143-4">
- <stop
- style="stop-color:#2561b7;stop-opacity:1"
- offset="0"
- id="stop81145-0" />
- <stop
- style="stop-color:#f9fbff;stop-opacity:1"
- offset="1"
- id="stop81147-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15487-1-8-4-3"
- id="linearGradient80403-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.92827429,0,0,0.92830994,60.469415,101.37929)"
- x1="254.19243"
- y1="237.48314"
- x2="273.92343"
- y2="254.49823" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient15487-1-8-4-3">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15489-3-2-3-6" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15491-4-4-1-1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-40-9"
- id="linearGradient81258"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.99995186,0,0,0.99980511,154.9567,150.99846)"
- x1="123.80291"
- y1="90.165237"
- x2="142.64377"
- y2="105.8204" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-84-1"
- id="linearGradient81260"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1004102,0,0,1.0993832,229.31341,141.82572)"
- x1="45.107925"
- y1="91.099701"
- x2="51.546276"
- y2="96.026611" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-84-3-2"
- id="linearGradient81262"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1004102,0,0,1.0993832,235.27474,141.76351)"
- x1="46.007988"
- y1="90.678802"
- x2="50.907307"
- y2="95.401253" />
- <linearGradient
- id="linearGradient14829">
- <stop
- id="stop14831"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop14833"
- offset="1"
- style="stop-color:#757575;stop-opacity:1;" />
- </linearGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath13106-0">
- <path
- inkscape:connector-curvature="0"
- style="fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;display:inline"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- id="path34850-6"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </clipPath>
- <linearGradient
- id="linearGradient5060-9">
- <stop
- id="stop5062-0"
- offset="0"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- id="stop5064-7"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient18821-9">
- <stop
- style="stop-color:#fc6b58;stop-opacity:1;"
- offset="0"
- id="stop18823-1" />
- <stop
- style="stop-color:#fc6b58;stop-opacity:0;"
- offset="1"
- id="stop18825-4" />
- </linearGradient>
- <linearGradient
- id="linearGradient39155-5">
- <stop
- id="stop39157-4"
- offset="0"
- style="stop-color:white;stop-opacity:1;" />
- <stop
- id="stop39159-1"
- offset="1"
- style="stop-color:#dadada;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14829"
- id="linearGradient14800"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,-169.92789,274.92229)"
- x1="243.92192"
- y1="-2.6686089"
- x2="275.10107"
- y2="26.600887" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14605"
- id="linearGradient14802"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-13.427886,57.417785)"
- x1="87"
- y1="241.125"
- x2="90.764404"
- y2="243.87347" />
- <linearGradient
- id="linearGradient14605">
- <stop
- style="stop-color:#ffffff;stop-opacity:0.56485355;"
- offset="0"
- id="stop14607" />
- <stop
- style="stop-color:#fffffe;stop-opacity:0;"
- offset="1"
- id="stop14609" />
- </linearGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath22590-7">
- <rect
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.20000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect22592-5-0"
- width="12"
- height="14"
- x="-30"
- y="490.00012" />
- </clipPath>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13998-5"
- id="linearGradient14804"
- gradientUnits="userSpaceOnUse"
- x1="13.5"
- y1="57.827747"
- x2="11.472005"
- y2="53.875874" />
- <linearGradient
- id="linearGradient13998-5">
- <stop
- id="stop14000-00"
- offset="0"
- style="stop-color:#f57d07;stop-opacity:1;" />
- <stop
- id="stop14002-54"
- offset="1"
- style="stop-color:white;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient13998-5"
- id="linearGradient14806"
- gradientUnits="userSpaceOnUse"
- x1="-18.600719"
- y1="501.96539"
- x2="-26.642899"
- y2="487.60382" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-53"
- id="linearGradient14808"
- gradientUnits="userSpaceOnUse"
- x1="15.027407"
- y1="60.637787"
- x2="13.5"
- y2="57.750687" />
- <linearGradient
- id="linearGradient319-53">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-1-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-61" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-53"
- id="linearGradient14810"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.03018343,0.1408617)"
- x1="-32.067383"
- y1="490.70178"
- x2="-22.25"
- y2="500" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-1">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-41" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-4" />
- </linearGradient>
- <linearGradient
- y2="305"
- x2="758"
- y1="299.83005"
- x1="753.39417"
- gradientTransform="translate(-683.42789,-5.5822151)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient20368"
- xlink:href="#linearGradient16500-1"
- inkscape:collect="always" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-41-8-0-7-1"
- id="linearGradient16663-3-0-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-6.0080883)"
- x1="184.95361"
- y1="115.79691"
- x2="235.24524"
- y2="119.04691" />
- <linearGradient
- id="linearGradient37542-41-8-0-7-1">
- <stop
- id="stop37544-5-2-6-6-5"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-8-6-8-7-2"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-41-8-0-7-4"
- id="linearGradient16663-3-0-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-6.0080883)"
- x1="179.3838"
- y1="116.92558"
- x2="235.24524"
- y2="119.04691" />
- <linearGradient
- id="linearGradient37542-41-8-0-7-4">
- <stop
- id="stop37544-5-2-6-6-9"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-8-6-8-7-3"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-7-8-6-0"
- id="radialGradient106344-5"
- cx="386.68588"
- cy="247.46175"
- fx="386.68588"
- fy="247.46175"
- r="2.3794625"
- gradientTransform="matrix(4.5687397,-0.29531319,0.13355055,5.747731,-1415.8878,-1055.5606)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient37542-7-8-6-0">
- <stop
- id="stop37544-40-1-3-9"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:1;" />
- <stop
- id="stop37546-94-7-0-7"
- offset="1"
- style="stop-color:#030303;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- y2="245.04375"
- x2="400.77301"
- y1="243.97655"
- x1="385.67264"
- gradientUnits="userSpaceOnUse"
- id="linearGradient106307-2"
- xlink:href="#linearGradient319-488-8-2"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient319-488-8-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-13-8-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-67-2-2" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient106427"
- id="radialGradient106433"
- cx="383.96912"
- cy="249.87636"
- fx="383.96912"
- fy="249.87636"
- r="2.3794624"
- gradientTransform="matrix(4.5686863,-0.29541184,0.13359632,5.7477127,-1403.7889,-1070.199)"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-7-8-6-0-8"
- id="radialGradient106344-5-2"
- cx="386.68588"
- cy="247.46175"
- fx="386.68588"
- fy="247.46175"
- r="2.3794625"
- gradientTransform="matrix(4.5687397,-0.29531319,0.13355055,5.747731,-1415.8878,-1055.5606)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient37542-7-8-6-0-8">
- <stop
- id="stop37544-40-1-3-9-3"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:1;" />
- <stop
- id="stop37546-94-7-0-7-1"
- offset="1"
- style="stop-color:#030303;stop-opacity:1" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient106427-3"
- id="radialGradient106433-4"
- cx="383.96912"
- cy="249.87636"
- fx="383.96912"
- fy="249.87636"
- r="2.3794625"
- gradientTransform="matrix(4.5686863,-0.29541184,0.13359632,5.7477127,-1403.7889,-1070.199)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient106427-3">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop106429-1" />
- <stop
- style="stop-color:#030303;stop-opacity:1"
- offset="1"
- id="stop106431-0" />
- </linearGradient>
- <linearGradient
- y2="245.04375"
- x2="400.77301"
- y1="243.97655"
- x1="385.67264"
- gradientUnits="userSpaceOnUse"
- id="linearGradient106307-2-4"
- xlink:href="#linearGradient319-488-8-2-0"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient319-488-8-2-0">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-13-8-8-7" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-67-2-2-9" />
- </linearGradient>
- <linearGradient
- id="linearGradient1610-36-6-7-9">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-1-9-4-5" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-5-9-87-3" />
- </linearGradient>
- <linearGradient
- id="linearGradient1610-36-6-7-9-4">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-1-9-4-5-0" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-5-9-87-3-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-36-6-7-9"
- id="linearGradient106628"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(64,338)"
- x1="209"
- y1="238"
- x2="226.625"
- y2="251.71078" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-36-6-7-9-4"
- id="linearGradient106641"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(39.8125,337.625)"
- x1="209"
- y1="238"
- x2="226.625"
- y2="251.71078" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-1-1-9-4-7-1"
- id="linearGradient106804"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,513.5,184.50451)"
- x1="253.78497"
- y1="3.6831069"
- x2="278.40161"
- y2="29.679312" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40578-4-8-4-0-5-2-4-7"
- id="radialGradient106806"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3817213,-0.4377393,0.4780868,0.4169055,368.09749,451.76937)"
- cx="756.83508"
- cy="206.40076"
- fx="756.83508"
- fy="206.40076"
- r="6.9000001" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient58334-24-8-2-6-0-2"
- id="linearGradient106808"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(670,-33)"
- x1="87"
- y1="241.125"
- x2="93.0625"
- y2="249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-11-1-4-3-1"
- id="linearGradient106810"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-95.999998)"
- x1="754.28558"
- y1="300.83292"
- x2="758"
- y2="305" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3944-1-7-5-7-7"
- id="linearGradient106812"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-251,440.9872)"
- x1="215.99414"
- y1="592.95746"
- x2="218.99957"
- y2="601.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3952-5-7-6-8-9"
- id="linearGradient106814"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-251,440.9872)"
- x1="213.00005"
- y1="597.41553"
- x2="216.00003"
- y2="604.375" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3966-8-9-6-4-5"
- id="linearGradient106816"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-251,440.9872)"
- x1="218.06126"
- y1="601.83856"
- x2="219.5"
- y2="606.11218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3966-8-9-6-4-5"
- id="linearGradient106818"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-251,440.9872)"
- x1="219"
- y1="604.31494"
- x2="221"
- y2="609.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3944-4-6-7-7"
- id="linearGradient106820"
- gradientUnits="userSpaceOnUse"
- x1="215.99414"
- y1="592.95746"
- x2="218.99957"
- y2="601.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3952-2-6-4-4"
- id="linearGradient106822"
- gradientUnits="userSpaceOnUse"
- x1="213.00005"
- y1="597.41553"
- x2="216.00003"
- y2="604.375" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3966-5-1-45-4"
- id="linearGradient106824"
- gradientUnits="userSpaceOnUse"
- x1="218.06126"
- y1="601.83856"
- x2="219.5"
- y2="606.11218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3966-5-1-45-4"
- id="linearGradient106826"
- gradientUnits="userSpaceOnUse"
- x1="219"
- y1="604.31494"
- x2="221"
- y2="609.36218" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient107148"
- id="radialGradient107138"
- gradientUnits="userSpaceOnUse"
- cx="12.465761"
- cy="353.51611"
- fx="12.465761"
- fy="353.51611"
- r="2.91875"
- gradientTransform="matrix(0.84360011,0.04170664,-0.04937856,0.99878013,19.37109,-0.08239219)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient107142"
- id="linearGradient107140"
- gradientUnits="userSpaceOnUse"
- x1="11.695067"
- y1="352.60217"
- x2="16.773348"
- y2="358.90598" />
- <radialGradient
- r="2.91875"
- fy="353.59497"
- fx="12.128428"
- cy="353.59497"
- cx="12.128428"
- gradientTransform="matrix(0.2864009,1.1071441,-1.0639391,0.27522442,384.79448,242.64422)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient107490"
- xlink:href="#linearGradient107519"
- inkscape:collect="always" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15097-0-8"
- id="radialGradient15836-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.14826933,2.1671891,-2.0135104,-0.13775545,-42.975294,-475.30953)"
- cx="327.72662"
- cy="-102.09388"
- fx="327.72662"
- fy="-102.09388"
- r="3.3160801" />
- <linearGradient
- id="linearGradient15097-0-8">
- <stop
- style="stop-color:#c4c4c4;stop-opacity:1"
- offset="0"
- id="stop15099-1-83" />
- <stop
- style="stop-color:#868686;stop-opacity:1"
- offset="1"
- id="stop15101-9-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974-5-2-6-6"
- id="linearGradient15851-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.2185076,0,0,1.1902393,14.075854,397.20828)"
- x1="-88.73024"
- y1="-120.6127"
- x2="-78.787354"
- y2="-128.30418" />
- <linearGradient
- id="linearGradient23974-5-2-6-6">
- <stop
- id="stop23976-9-2-7-6"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop23978-3-1-6-0"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient31320-5-2-6-7"
- id="linearGradient15818-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,222.97812,19.5574)"
- x1="68.688324"
- y1="51.42366"
- x2="72.671516"
- y2="55.501457" />
- <linearGradient
- id="linearGradient31320-5-2-6-7">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop31322-5-4-5-8" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop31324-0-8-5-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262-9-5-9-4"
- id="linearGradient15846-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.2185076,0,0,1.1902393,92.990431,-50.358654)"
- x1="-20.864969"
- y1="250.35432"
- x2="-34.640823"
- y2="264.67712" />
- <linearGradient
- id="linearGradient14262-9-5-9-4">
- <stop
- id="stop14264-5-2-9-0"
- offset="0"
- style="stop-color:#2661b6;stop-opacity:1;" />
- <stop
- id="stop14266-0-4-4-2"
- offset="1"
- style="stop-color:#c1d7f8;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-92-8-5-0"
- id="linearGradient15843-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.99098745,0,0,1.0233007,7.9488742,191.90653)"
- x1="113.17896"
- y1="49.395184"
- x2="111.81031"
- y2="62.520573" />
- <linearGradient
- id="linearGradient319-92-8-5-0">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-40-7-9-3" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-93-7-0-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-92-8-5-0"
- id="linearGradient16562-7"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.99098745,0,0,1.0233007,7.9488742,191.90653)"
- x1="114.36164"
- y1="22.752264"
- x2="104.74062"
- y2="65.241188" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15959-9-5"
- id="linearGradient15773-7"
- gradientUnits="userSpaceOnUse"
- x1="113.07384"
- y1="252.04327"
- x2="119.9112"
- y2="249.41632"
- gradientTransform="matrix(1.2133883,0,0,1.2133883,-25.22919,-53.154498)" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient15959-9-5">
- <stop
- style="stop-color:#4d4d4d;stop-opacity:1;"
- offset="0"
- id="stop15961-9-6" />
- <stop
- style="stop-color:#4d4d4d;stop-opacity:0;"
- offset="1"
- id="stop15963-8-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16723"
- id="linearGradient16730"
- x1="112.5"
- y1="252.5"
- x2="116.5"
- y2="250"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16764"
- id="linearGradient16800"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,112.64335,0.1875)"
- x1="63.643349"
- y1="354.8125"
- x2="60.996902"
- y2="359.97281" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16772"
- id="linearGradient16802"
- gradientUnits="userSpaceOnUse"
- x1="63.847855"
- y1="353.1496"
- x2="61.116474"
- y2="360.82117" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23705-0"
- id="linearGradient22892-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(220,-20.00667)"
- x1="29.4034"
- y1="100.99999"
- x2="34.095703"
- y2="101.15624" />
- <linearGradient
- id="linearGradient23705-0">
- <stop
- id="stop23707-9"
- offset="0"
- style="stop-color:#d4d2bf;stop-opacity:1;" />
- <stop
- id="stop23709-4"
- offset="1"
- style="stop-color:#857f5d;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient24168-8"
- id="linearGradient22954-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.75,0,0,0.7516675,227.625,0.9640803)"
- x1="20.125"
- y1="88.642494"
- x2="34.125"
- y2="104.89799" />
- <linearGradient
- id="linearGradient24168-8">
- <stop
- id="stop24170-2"
- offset="0"
- style="stop-color:#182437;stop-opacity:1;" />
- <stop
- id="stop24172-4"
- offset="1"
- style="stop-color:#2b4163;stop-opacity:0;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-51"
- id="radialGradient22952-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6595012,0.7907318,-0.8990144,0.7498135,144.69896,-187.59854)"
- cx="262.67139"
- cy="74.072273"
- fx="262.67139"
- fy="74.072273"
- r="3.5" />
- <linearGradient
- id="linearGradient319-51">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-7" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-51"
- id="linearGradient22928-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8750002,0,0,0.83767,7.3124969,247.00379)"
- x1="27.166666"
- y1="90.504448"
- x2="35.166668"
- y2="101.14744" />
- <linearGradient
- id="linearGradient29791">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop29793" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop29795" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821-2"
- id="radialGradient22950-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.53241"
- cy="500.20956"
- fx="75.53241"
- fy="500.20956"
- r="3.1650217" />
- <linearGradient
- id="linearGradient18821-2">
- <stop
- style="stop-color:#fc6b58;stop-opacity:1;"
- offset="0"
- id="stop18823-7" />
- <stop
- style="stop-color:#fc6b58;stop-opacity:0;"
- offset="1"
- id="stop18825-6" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-51"
- id="radialGradient22922-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.4564959,0.09949388,-0.06177986,1.3917691,-283.96093,-143.81911)"
- cx="135.14931"
- cy="332.10181"
- fx="135.14931"
- fy="332.10181"
- r="3.5" />
- <linearGradient
- id="linearGradient29802">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop29804" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop29806" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060-2"
- id="linearGradient22917-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2,0,0,0.7333333,-467,262.53823)"
- x1="250.5"
- y1="90.253998"
- x2="250.5"
- y2="95.252274" />
- <linearGradient
- id="linearGradient5060-2">
- <stop
- id="stop5062-3"
- offset="0"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- id="stop5064-2"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-51"
- id="radialGradient23727-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.3687636,0.09935874,-0.05957343,1.3898788,-272.60513,-143.17133)"
- cx="140.33667"
- cy="333.05716"
- fx="140.33667"
- fy="333.05716"
- r="3.5" />
- <linearGradient
- id="linearGradient29813">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop29815" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop29817" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient107519"
- id="radialGradient30077"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.2864009,1.1071441,-1.0639391,0.27522442,384.79448,242.64422)"
- cx="12.128428"
- cy="353.59497"
- fx="12.128428"
- fy="353.59497"
- r="2.91875" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16764"
- id="linearGradient30079"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,112.64335,0.1875)"
- x1="63.643349"
- y1="354.8125"
- x2="60.996902"
- y2="359.97281" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16772"
- id="linearGradient30081"
- gradientUnits="userSpaceOnUse"
- x1="63.847855"
- y1="353.1496"
- x2="61.116474"
- y2="360.82117" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient107519"
- id="radialGradient30090"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.2864009,1.1071441,-1.0639391,0.27522442,384.79448,242.64422)"
- cx="12.128428"
- cy="353.59497"
- fx="12.128428"
- fy="353.59497"
- r="2.91875" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16764"
- id="linearGradient30092"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,112.64335,0.1875)"
- x1="63.643349"
- y1="354.8125"
- x2="60.996902"
- y2="359.97281" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16772"
- id="linearGradient30094"
- gradientUnits="userSpaceOnUse"
- x1="63.847855"
- y1="353.1496"
- x2="61.116474"
- y2="360.82117" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16772"
- id="linearGradient30097"
- gradientUnits="userSpaceOnUse"
- x1="63.847855"
- y1="353.1496"
- x2="61.116474"
- y2="360.82117"
- gradientTransform="matrix(-1,0,0,1,112.28991,0.1875)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16764"
- id="linearGradient30100"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,112.28991,0.1875)"
- x1="63.643349"
- y1="354.8125"
- x2="60.996902"
- y2="359.97281" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30122"
- id="linearGradient30129"
- x1="48.5"
- y1="354.75"
- x2="51"
- y2="360.25"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30131"
- id="linearGradient30137"
- x1="60.289909"
- y1="361.0625"
- x2="63.789909"
- y2="354.0625"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient30139"
- id="linearGradient30145"
- x1="63.789909"
- y1="355.0625"
- x2="61.039909"
- y2="360.0625"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-36-6-7-9-4-3"
- id="linearGradient106641-3"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(39.8125,337.625)"
- x1="209"
- y1="238"
- x2="226.625"
- y2="251.71078" />
- <linearGradient
- id="linearGradient1610-36-6-7-9-4-3">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-1-9-4-5-0-6" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-5-9-87-3-7-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient27496"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="121.22078"
- y2="56.357628" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient27498"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(207,-246.99988)"
- x1="-56.5"
- y1="342.0625"
- x2="-49"
- y2="341" />
- <linearGradient
- id="linearGradient37542-9">
- <stop
- id="stop37544-6"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-7"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient15541">
- <stop
- id="stop15543"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop15545"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-1">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-0" />
- </linearGradient>
- <linearGradient
- id="linearGradient37542-41-8-0-7-1-3">
- <stop
- id="stop37544-5-2-6-6-5-3"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-8-6-8-7-2-0"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-1-7"
- id="linearGradient15721-8-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(19.97577,-6.0080883)"
- x1="227.57907"
- y1="118.47696"
- x2="235"
- y2="118.5" />
- <linearGradient
- id="linearGradient319-1-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-4-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-0-0" />
- </linearGradient>
- <linearGradient
- y2="118.5"
- x2="235"
- y1="118.47696"
- x1="227.57907"
- gradientTransform="translate(265.62095,336.21475)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient15670-3"
- xlink:href="#linearGradient319-1-7-2"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient319-1-7-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-4-4-0" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-0-0-5" />
- </linearGradient>
- <linearGradient
- id="linearGradient37542-41-8-0-7-4-0">
- <stop
- id="stop37544-5-2-6-6-9-0"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-8-6-8-7-3-2"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient15647-2">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop15649-9" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop15651-4" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-1-7-0">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-4-4-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-0-0-2" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-1-7-2-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-4-4-0-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-0-0-5-4" />
- </linearGradient>
- <linearGradient
- id="linearGradient15647-1">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop15649-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop15651-2" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-1-7-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-4-4-9" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-0-0-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-1-7-2-7"
- id="linearGradient15975-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(267.4022,339.9335)"
- x1="227.57907"
- y1="118.47696"
- x2="235"
- y2="118.5" />
- <linearGradient
- id="linearGradient319-1-7-2-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-4-4-0-2" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-0-0-5-5" />
- </linearGradient>
- <linearGradient
- id="linearGradient15647-3">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop15649-12" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop15651-7" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-1-7-1">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-4-4-00" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-0-0-4" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-1-7-2-9">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-4-4-0-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-0-0-5-9" />
- </linearGradient>
- <linearGradient
- id="linearGradient37542-7-0">
- <stop
- id="stop37544-40-9"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-94-1"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-3">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-3" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-06" />
- </linearGradient>
- <linearGradient
- id="linearGradient15647-14">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop15649-7" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop15651-72" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-1-7-02">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-4-4-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-0-0-48" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-1-7-2-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-4-4-0-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-0-0-5-7" />
- </linearGradient>
- <linearGradient
- id="linearGradient1610-04">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-8" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient10069-7">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-9" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-28">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-23" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-2" />
- </linearGradient>
- <linearGradient
- id="linearGradient16389">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16391" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16393" />
- </linearGradient>
- <linearGradient
- id="linearGradient15647-14-2">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop15649-7-5" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop15651-72-3" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-1-7-02-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-4-4-8-3" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-0-0-48-7" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-1-7-2-4-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-4-4-0-4-6" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-0-0-5-7-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-1-7-5"
- id="linearGradient16591-3"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(266.10421,337.79176)"
- x1="224.37904"
- y1="118.78525"
- x2="236.37904"
- y2="118.78525" />
- <linearGradient
- id="linearGradient319-1-7-5">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-4-4-3" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-0-0-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15796"
- id="linearGradient15802"
- x1="192.4323"
- y1="348.13098"
- x2="208.33328"
- y2="359.81409"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15806"
- id="linearGradient15804"
- x1="212.0226"
- y1="361.34204"
- x2="194.68611"
- y2="348.34918"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient319-715">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-74" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-58" />
- </linearGradient>
- <linearGradient
- id="linearGradient15840">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15842" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15844" />
- </linearGradient>
- <linearGradient
- id="linearGradient15847">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15849" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15851" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-75">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-17" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-64" />
- </linearGradient>
- <linearGradient
- id="linearGradient15858">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15860" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15862" />
- </linearGradient>
- <linearGradient
- id="linearGradient5060-97">
- <stop
- id="stop5062-5"
- offset="0"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- id="stop5064-5"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient15869">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15871" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15873" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-8"
- id="linearGradient35740-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.707654,0,0,0.707942,-206.46148,-296.13985)"
- x1="35.597904"
- y1="158.14117"
- x2="10.490564"
- y2="176.41806" />
- <linearGradient
- id="linearGradient37542-8">
- <stop
- id="stop37544-64"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-5"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-93"
- id="linearGradient35742-9"
- gradientUnits="userSpaceOnUse"
- x1="58.060974"
- y1="-23.721956"
- x2="40"
- y2="-35" />
- <linearGradient
- id="linearGradient1610-93">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-83" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-75"
- id="linearGradient35744-6"
- gradientUnits="userSpaceOnUse"
- x1="46.1875"
- y1="-28.59375"
- x2="41.099998"
- y2="-33.59375" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient36116-7"
- id="linearGradient35746-7"
- gradientUnits="userSpaceOnUse"
- x1="46"
- y1="-32"
- x2="43.883884"
- y2="-33.939339" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient36116-7">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop36118-4" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop36120-1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-75"
- id="linearGradient35750-3"
- gradientUnits="userSpaceOnUse"
- x1="48.662914"
- y1="-27.071922"
- x2="43.47097"
- y2="-32.337086" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-715"
- id="linearGradient35752-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(6.3,-4.7)"
- x1="39.200001"
- y1="-30.799999"
- x2="41.200001"
- y2="-28.640625" />
- <linearGradient
- id="linearGradient15902">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15904" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15906" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-715"
- id="linearGradient35754-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(5.315625,-3.75)"
- x1="39.200001"
- y1="-30.799999"
- x2="41.325001"
- y2="-28.765625" />
- <linearGradient
- id="linearGradient15909">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15911" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15913" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-715"
- id="linearGradient35756-7"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(3.3,0.3)"
- x1="38.700001"
- y1="-31.299999"
- x2="40.012501"
- y2="-29.799999" />
- <linearGradient
- id="linearGradient15916">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15918" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15920" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-75"
- id="linearGradient35772-6"
- gradientUnits="userSpaceOnUse"
- x1="51.912914"
- y1="-24.696922"
- x2="40.75"
- y2="-35.75"
- gradientTransform="translate(-0.75,4.75)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-715"
- id="linearGradient35748-0"
- gradientUnits="userSpaceOnUse"
- x1="41"
- y1="-29"
- x2="43"
- y2="-27" />
- <linearGradient
- id="linearGradient15930">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15932" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15934" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-715"
- id="linearGradient16186"
- gradientUnits="userSpaceOnUse"
- x1="41"
- y1="-29"
- x2="43"
- y2="-27"
- gradientTransform="translate(412,489)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-75"
- id="linearGradient16189"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(411.25,493.75)"
- x1="51.912914"
- y1="-24.696922"
- x2="40.75"
- y2="-35.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-715"
- id="linearGradient16194"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(415.3,489.3)"
- x1="38.700001"
- y1="-31.299999"
- x2="40.012501"
- y2="-29.799999" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-715"
- id="linearGradient16197"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(417.31562,485.25)"
- x1="39.200001"
- y1="-30.799999"
- x2="41.325001"
- y2="-28.765625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-715"
- id="linearGradient16200"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(418.3,484.3)"
- x1="39.200001"
- y1="-30.799999"
- x2="41.200001"
- y2="-28.640625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-75"
- id="linearGradient16203"
- gradientUnits="userSpaceOnUse"
- x1="48.662914"
- y1="-27.071922"
- x2="43.47097"
- y2="-32.337086"
- gradientTransform="translate(412,489)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient36116-7"
- id="linearGradient16208"
- gradientUnits="userSpaceOnUse"
- x1="46"
- y1="-32"
- x2="43.883884"
- y2="-33.939339"
- gradientTransform="translate(412,489)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-75"
- id="linearGradient16211"
- gradientUnits="userSpaceOnUse"
- x1="46.1875"
- y1="-28.59375"
- x2="41.099998"
- y2="-33.59375"
- gradientTransform="translate(412,489)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-93"
- id="linearGradient16214"
- gradientUnits="userSpaceOnUse"
- x1="58.060974"
- y1="-23.721956"
- x2="40"
- y2="-35"
- gradientTransform="translate(412,489)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-715"
- id="linearGradient16252"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(417.31562,485.25)"
- x1="39.200001"
- y1="-30.799999"
- x2="41.325001"
- y2="-28.765625" />
- <linearGradient
- id="linearGradient319-6">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-87" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-64" />
- </linearGradient>
- <linearGradient
- id="linearGradient15804-5">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15806" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15808-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient15811">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15813-7" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15815" />
- </linearGradient>
- <linearGradient
- id="linearGradient15818">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15820" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15822" />
- </linearGradient>
- <linearGradient
- id="linearGradient15825">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15827" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15829" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-6"
- id="linearGradient15998"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-65.00001,-10.749995)"
- x1="61.032951"
- y1="5.9830923"
- x2="46.491322"
- y2="20.147326" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-6"
- id="linearGradient16000"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.199998,0,0,1.199999,-74.19988,-12.499988)"
- x1="59.02124"
- y1="6.0129876"
- x2="44.509518"
- y2="20.110929" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-6"
- id="linearGradient16003"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-64,-10)"
- x1="18.773417"
- y1="6.2494373"
- x2="6.9718256"
- y2="17.82831" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-6"
- id="linearGradient16006"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.701513,0.712657,0.712657,0.701513,50.5916,-449.6745)"
- x1="385.62408"
- y1="244.3396"
- x2="401.63013"
- y2="244.38875" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-6"
- id="linearGradient16056"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-64,-10)"
- x1="18.773417"
- y1="6.2494373"
- x2="6.9718256"
- y2="17.82831" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-6"
- id="linearGradient16058"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.701513,0.712657,0.712657,0.701513,50.5916,-449.6745)"
- x1="385.62408"
- y1="244.3396"
- x2="401.63013"
- y2="244.38875" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-6"
- id="linearGradient16084"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-65.00001,-10.749995)"
- x1="61.032951"
- y1="5.9830923"
- x2="46.491322"
- y2="20.147326" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-6"
- id="linearGradient16086"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.199998,0,0,1.199999,-74.19988,-12.499988)"
- x1="59.02124"
- y1="6.0129876"
- x2="44.509518"
- y2="20.110929" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient25417-9"
- id="linearGradient40731-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.997161,-259.00079,67.35344)"
- x1="280.0918"
- y1="129.28557"
- x2="267.20212"
- y2="116.41341" />
- <linearGradient
- id="linearGradient25417-9">
- <stop
- id="stop25419-9"
- offset="0"
- style="stop-color:#60553b;stop-opacity:1;" />
- <stop
- id="stop25421-2"
- offset="1"
- style="stop-color:#b0a17f;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-17-1-6-6"
- id="linearGradient40733-04"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.7972867,-259.00009,90.24189)"
- x1="255.63673"
- y1="99.513062"
- x2="275.1503"
- y2="129.36641" />
- <linearGradient
- id="linearGradient319-17-1-6-6">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-115-1-5-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-27-3-7-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-6-1">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-87-5" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-64-0" />
- </linearGradient>
- <linearGradient
- id="linearGradient16451">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16453" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16455" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-6-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-87-9" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-64-1" />
- </linearGradient>
- <linearGradient
- id="linearGradient16520">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16522" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16524" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-6-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-87-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-64-3" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-6-9">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-87-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-64-2" />
- </linearGradient>
- <linearGradient
- id="linearGradient16838">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16840" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16842" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-6-40">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-87-2" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-64-5" />
- </linearGradient>
- <linearGradient
- id="linearGradient16838-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16840-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16842-8" />
- </linearGradient>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask18666-3">
- <rect
- y="6"
- x="62.921577"
- height="14.000001"
- width="15.098035"
- id="rect18668-4"
- style="fill:url(#linearGradient18670-3);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.50000000000000000;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-08"
- id="linearGradient18670-3"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2078427,0,0,1.0516432,-357.40769,69.427229)"
- x1="362.28571"
- y1="-45.098213"
- x2="352.46426"
- y2="-54.124699" />
- <linearGradient
- id="linearGradient1610-08">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-2" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-48" />
- </linearGradient>
- <linearGradient
- id="linearGradient10069-33">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-7" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-36" />
- </linearGradient>
- <linearGradient
- id="linearGradient17205">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop17207" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop17209" />
- </linearGradient>
- <linearGradient
- id="linearGradient37542-0">
- <stop
- id="stop37544-77"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-2"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-14">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-27" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-629" />
- </linearGradient>
- <linearGradient
- id="linearGradient23974-0">
- <stop
- id="stop23976-205"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop23978-6"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-5-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-761-9" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-8-1" />
- </linearGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath28964-0">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="fill:url(#linearGradient28968);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline;enable-background:new"
- d="m 117.50984,228.63415 0,-15.01646 11.71735,5.49383 0,15.38271 -11.71735,-5.86008 z"
- id="path28966-5" />
- </clipPath>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask29419-5">
- <path
- inkscape:connector-curvature="0"
- id="path29422-9"
- d="m 117.50984,229.00041 0,-15.38272 11.71735,5.49383 0,15.74897 -11.71735,-5.86008 z"
- style="opacity:0.50000000000000000;fill:url(#linearGradient29424-4);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline;enable-background:new"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-7-8"
- id="linearGradient29424-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.4646688,0,0,1.4650206,168.77325,-157.03253)"
- x1="-26.511335"
- y1="257.99881"
- x2="-30.075666"
- y2="259.87677" />
- <linearGradient
- id="linearGradient37542-7-8">
- <stop
- id="stop37544-40-5"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-94-0"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient21327-6-8-9">
- <stop
- style="stop-color:#1e3e70;stop-opacity:1;"
- offset="0"
- id="stop21329-3-4-7" />
- <stop
- style="stop-color:#1e3e70;stop-opacity:0;"
- offset="1"
- id="stop21331-4-0-6" />
- </linearGradient>
- <linearGradient
- id="linearGradient10069-9-71-7">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-5-1-6" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-43-5-4" />
- </linearGradient>
- <linearGradient
- id="linearGradient10069-9-71-7-2">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-5-1-6-2" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-43-5-4-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient18118-8">
- <stop
- style="stop-color:#cd8ce9;stop-opacity:1"
- offset="0"
- id="stop18120-5" />
- <stop
- style="stop-color:#9425c1;stop-opacity:1"
- offset="1"
- id="stop18122-5" />
- </linearGradient>
- <linearGradient
- id="linearGradient18103-9">
- <stop
- id="stop18105-3"
- offset="0"
- style="stop-color:#42035d;stop-opacity:1" />
- <stop
- id="stop18108-4"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134-9"
- id="linearGradient18140-0"
- x1="121.48092"
- y1="105.24046"
- x2="137.67349"
- y2="126.34584"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient18134-9">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop18136-5" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop18138-9" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18118-8"
- id="radialGradient18260"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6671799,6.7886038e-8,-6.7869731e-8,0.66734014,43.604995,38.604049)"
- cx="129.99182"
- cy="114.84092"
- fx="129.99182"
- fy="114.84092"
- r="8.781251" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134-9"
- id="linearGradient18262"
- gradientUnits="userSpaceOnUse"
- x1="121.48092"
- y1="105.24046"
- x2="137.67349"
- y2="126.34584" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18103"
- id="linearGradient18264"
- gradientUnits="userSpaceOnUse"
- x1="123.80045"
- y1="111.03492"
- x2="130.94904"
- y2="118.11919" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18118"
- id="radialGradient18266"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.09893643,0.88659058,-0.70877161,0.07913125,199.3109,-8.5183197)"
- cx="129.83784"
- cy="115.58929"
- fx="129.83784"
- fy="115.58929"
- r="8.7812506" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134"
- id="linearGradient18268"
- gradientUnits="userSpaceOnUse"
- x1="121.48092"
- y1="105.24046"
- x2="136.95143"
- y2="123.69764" />
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath31849-4">
- <path
- inkscape:connector-curvature="0"
- style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 232.13187,93.950853 4.84276,0 4.23742,4.237465 0,4.842822 -9.08018,0 0,-9.080287 0,0 z"
- id="path31851-6"
- sodipodi:nodetypes="cccccc" />
- </clipPath>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18118-8-8"
- id="radialGradient18260-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6671799,6.7886038e-8,-6.7869731e-8,0.66734014,43.604995,38.604049)"
- cx="129.99182"
- cy="114.84092"
- fx="129.99182"
- fy="114.84092"
- r="8.781251" />
- <linearGradient
- id="linearGradient18118-8-8">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop18120-5-0" />
- <stop
- style="stop-color:#7b7b7b;stop-opacity:1;"
- offset="1"
- id="stop18122-5-4" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134-9-1"
- id="linearGradient18262-3"
- gradientUnits="userSpaceOnUse"
- x1="121.48092"
- y1="105.24046"
- x2="137.67349"
- y2="126.34584" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient18134-9-1">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop18136-5-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop18138-9-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18103-1"
- id="linearGradient18264-4"
- gradientUnits="userSpaceOnUse"
- x1="123.80045"
- y1="111.03492"
- x2="130.94904"
- y2="118.11919" />
- <linearGradient
- id="linearGradient18103-1">
- <stop
- id="stop18105-2"
- offset="0"
- style="stop-color:#42035d;stop-opacity:1" />
- <stop
- id="stop18108-8"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18118-0"
- id="radialGradient18266-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.09893643,0.88659058,-0.70877161,0.07913125,199.3109,-8.5183197)"
- cx="129.83784"
- cy="115.58929"
- fx="129.83784"
- fy="115.58929"
- r="8.781251" />
- <linearGradient
- id="linearGradient18118-0">
- <stop
- style="stop-color:#d297eb;stop-opacity:1;"
- offset="0"
- id="stop18120-4" />
- <stop
- style="stop-color:#a329d6;stop-opacity:1;"
- offset="1"
- id="stop18122-52" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134-0"
- id="linearGradient18268-0"
- gradientUnits="userSpaceOnUse"
- x1="121.48092"
- y1="105.24046"
- x2="136.95143"
- y2="123.69764" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient18134-0">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop18136-2" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop18138-5" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18118-8"
- id="radialGradient19005"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6671799,6.7886038e-8,-6.7869731e-8,0.66734014,43.604995,38.604049)"
- cx="129.99182"
- cy="114.84092"
- fx="129.99182"
- fy="114.84092"
- r="8.781251" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134-9"
- id="linearGradient19007"
- gradientUnits="userSpaceOnUse"
- x1="121.48092"
- y1="105.24046"
- x2="137.67349"
- y2="126.34584" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18103"
- id="linearGradient19009"
- gradientUnits="userSpaceOnUse"
- x1="123.80045"
- y1="111.03492"
- x2="130.94904"
- y2="118.11919" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18118"
- id="radialGradient19011"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.09893643,0.88659058,-0.70877161,0.07913125,199.3109,-8.5183197)"
- cx="129.83784"
- cy="115.58929"
- fx="129.83784"
- fy="115.58929"
- r="8.7812506" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134"
- id="linearGradient19013"
- gradientUnits="userSpaceOnUse"
- x1="121.48092"
- y1="105.24046"
- x2="136.95143"
- y2="123.69764" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18118-8"
- id="radialGradient19034"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6671799,6.7886038e-8,-6.7869731e-8,0.66734014,43.604995,38.604049)"
- cx="129.99182"
- cy="114.84092"
- fx="129.99182"
- fy="114.84092"
- r="8.781251" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134-9"
- id="linearGradient19036"
- gradientUnits="userSpaceOnUse"
- x1="121.48092"
- y1="105.24046"
- x2="137.67349"
- y2="126.34584" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18103"
- id="linearGradient19038"
- gradientUnits="userSpaceOnUse"
- x1="123.80045"
- y1="111.03492"
- x2="130.94904"
- y2="118.11919" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18118"
- id="radialGradient19040"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.09893643,0.88659058,-0.70877161,0.07913125,199.3109,-8.5183197)"
- cx="129.83784"
- cy="115.58929"
- fx="129.83784"
- fy="115.58929"
- r="8.7812506" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134"
- id="linearGradient19042"
- gradientUnits="userSpaceOnUse"
- x1="121.48092"
- y1="105.24046"
- x2="136.95143"
- y2="123.69764" />
- <linearGradient
- id="linearGradient40455-7-1-5">
- <stop
- id="stop40457-6-6-2"
- offset="0"
- style="stop-color:#fff991;stop-opacity:1;" />
- <stop
- id="stop40459-1-8-5"
- offset="1"
- style="stop-color:#fffbb9;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient40578-4-8-7-6">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop40580-8-9-6-8" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop40582-6-8-1-2" />
- </linearGradient>
- <linearGradient
- id="linearGradient58334-9-6">
- <stop
- id="stop58336-27-0"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:0.87628865;" />
- <stop
- id="stop58338-9-7"
- offset="1.0000000"
- style="stop-color:#fffffe;stop-opacity:0.0000000;" />
- </linearGradient>
- <linearGradient
- y2="305"
- x2="758"
- y1="300.83292"
- x1="754.28558"
- gradientTransform="translate(1,-94.999998)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient37610-3-9"
- xlink:href="#linearGradient16500-4-9"
- inkscape:collect="always" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-4-9">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-31-5" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-23-4" />
- </linearGradient>
- <linearGradient
- id="linearGradient40455-7-1-5-1">
- <stop
- id="stop40457-6-6-2-9"
- offset="0"
- style="stop-color:#fff991;stop-opacity:1;" />
- <stop
- id="stop40459-1-8-5-0"
- offset="1"
- style="stop-color:#fffbb9;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient40578-4-8-7-6-5">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop40580-8-9-6-8-2" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop40582-6-8-1-2-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient58334-9-6-3">
- <stop
- id="stop58336-27-0-6"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:0.87628865;" />
- <stop
- id="stop58338-9-7-0"
- offset="1.0000000"
- style="stop-color:#fffffe;stop-opacity:0.0000000;" />
- </linearGradient>
- <linearGradient
- y2="305"
- x2="758"
- y1="300.83292"
- x1="754.28558"
- gradientTransform="translate(1,-94.999998)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient15428-6"
- xlink:href="#linearGradient16500-4-9-3"
- inkscape:collect="always" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-4-9-3">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-31-5-8" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-23-4-6" />
- </linearGradient>
- <linearGradient
- id="linearGradient37542-8-6">
- <stop
- id="stop37544-64-8"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-5-9"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient1610-93-2">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-83-7" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-0-7" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-715-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-74-6" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-58-1" />
- </linearGradient>
- <linearGradient
- id="linearGradient15669">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15671" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15673" />
- </linearGradient>
- <linearGradient
- id="linearGradient15683-0">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15685" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15687" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-715-8">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-74-0" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-58-2" />
- </linearGradient>
- <linearGradient
- id="linearGradient15876">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15878" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15880" />
- </linearGradient>
- <linearGradient
- id="linearGradient15883">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15885" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15887" />
- </linearGradient>
- <linearGradient
- id="linearGradient15894">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15896" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15898" />
- </linearGradient>
- <linearGradient
- id="linearGradient5060-97-8">
- <stop
- id="stop5062-5-3"
- offset="0"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- id="stop5064-5-0"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient15905">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15907" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15909" />
- </linearGradient>
- <linearGradient
- id="linearGradient37542-8-7">
- <stop
- id="stop37544-64-6"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-5-6"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient1610-93-1">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-83-5" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-0-1" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-715-5">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-74-63" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-58-9" />
- </linearGradient>
- <linearGradient
- id="linearGradient16099">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16101" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16103-5" />
- </linearGradient>
- <linearGradient
- id="linearGradient16113">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16115" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16117" />
- </linearGradient>
- <linearGradient
- id="linearGradient37542-8-78">
- <stop
- id="stop37544-64-1"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-5-0"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient1610-93-9">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-83-8" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-0-3" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-715-9">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-74-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-58-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient16099-6">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16101-5" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16103-7" />
- </linearGradient>
- <linearGradient
- id="linearGradient16113-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16115-6" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16117-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15806"
- id="linearGradient15581"
- gradientUnits="userSpaceOnUse"
- x1="212.0226"
- y1="361.34204"
- x2="189.32315"
- y2="340.89514" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15796"
- id="linearGradient15583"
- gradientUnits="userSpaceOnUse"
- x1="192.4323"
- y1="348.13098"
- x2="208.33328"
- y2="359.81409" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15796"
- id="linearGradient16354"
- gradientUnits="userSpaceOnUse"
- x1="189.32315"
- y1="340.89514"
- x2="205.17293"
- y2="357.81213" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15806"
- id="linearGradient16399"
- gradientUnits="userSpaceOnUse"
- x1="212.0226"
- y1="361.34204"
- x2="189.32315"
- y2="340.89514" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15796"
- id="linearGradient16401"
- gradientUnits="userSpaceOnUse"
- x1="189.32315"
- y1="340.89514"
- x2="205.17293"
- y2="357.81213" />
- <linearGradient
- id="linearGradient319-57">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-20" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-83" />
- </linearGradient>
- <linearGradient
- id="linearGradient15625">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15627" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15629" />
- </linearGradient>
- <linearGradient
- id="linearGradient15632">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15634" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15636" />
- </linearGradient>
- <linearGradient
- id="linearGradient23974-3-78-2">
- <stop
- id="stop23976-6-5-7"
- offset="0"
- style="stop-color:#a3a3a3;stop-opacity:1" />
- <stop
- id="stop23978-2-4-4"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient16504-0-4">
- <stop
- id="stop16506-3-6"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:1" />
- <stop
- id="stop16508-0-1"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-47-9-0">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-85-3-9" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-48-3-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-12-5-0"
- id="linearGradient42487-4-5-2"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- id="linearGradient319-12-5-0">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-34-1-3" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-81-9-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15425-8-7-5"
- id="linearGradient42489-5-9-1"
- gradientUnits="userSpaceOnUse"
- x1="123.26987"
- y1="108.56933"
- x2="138.25778"
- y2="124.59384" />
- <linearGradient
- id="linearGradient15425-8-7-5">
- <stop
- style="stop-color:#8c0000;stop-opacity:1;"
- offset="0"
- id="stop15427-5-9-7" />
- <stop
- style="stop-color:#c80000;stop-opacity:0;"
- offset="1"
- id="stop15429-7-2-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-12-5-0"
- id="linearGradient42491-0-9-1"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="140.66667"
- y2="125.94853" />
- <linearGradient
- id="linearGradient15695">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop15697" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop15699" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15425-8-7-5"
- id="linearGradient17232-8-1"
- gradientUnits="userSpaceOnUse"
- x1="123.26987"
- y1="108.56933"
- x2="141.64546"
- y2="130.81215" />
- <linearGradient
- id="linearGradient15702">
- <stop
- style="stop-color:#8c0000;stop-opacity:1;"
- offset="0"
- id="stop15704" />
- <stop
- style="stop-color:#c80000;stop-opacity:0;"
- offset="1"
- id="stop15706" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-0"
- id="linearGradient42326-4"
- gradientUnits="userSpaceOnUse"
- x1="124.8772"
- y1="110.75571"
- x2="133.97179"
- y2="117.77643" />
- <linearGradient
- id="linearGradient10069-0">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-75" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-44"
- id="linearGradient42328-9"
- gradientUnits="userSpaceOnUse"
- x1="129.32576"
- y1="223.61363"
- x2="123.33967"
- y2="217.06438" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-44">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-2" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-54"
- id="linearGradient42330-3"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="142.64723"
- y2="129.05313" />
- <linearGradient
- id="linearGradient319-54">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-68" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-54"
- id="linearGradient16613"
- gradientUnits="userSpaceOnUse"
- x1="130.39502"
- y1="116.31751"
- x2="142.64723"
- y2="129.05313" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-07"
- id="linearGradient14167-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-636.98388,52.01562)"
- x1="443.86667"
- y1="133.98936"
- x2="451.98389"
- y2="143.58749" />
- <linearGradient
- id="linearGradient37542-07">
- <stop
- id="stop37544-66"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-6"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4138-3"
- id="linearGradient14169-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-635.98388,53.01562)"
- x1="456.03769"
- y1="135.76678"
- x2="453.61005"
- y2="133.00301" />
- <linearGradient
- id="linearGradient4138-3">
- <stop
- style="stop-color:#6c432f;stop-opacity:1;"
- offset="0"
- id="stop4140-2" />
- <stop
- style="stop-color:#c0966d;stop-opacity:1;"
- offset="1"
- id="stop4142-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-07"
- id="linearGradient14171-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-636.98388,52.01562)"
- x1="449.14645"
- y1="136.18045"
- x2="453.24457"
- y2="138.7879" />
- <linearGradient
- id="linearGradient16636">
- <stop
- id="stop16638"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop16640"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4138-3"
- id="linearGradient14173-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-635.98388,53.01562)"
- x1="456.03769"
- y1="135.76678"
- x2="454.31345"
- y2="133.62801" />
- <linearGradient
- id="linearGradient16643">
- <stop
- style="stop-color:#6c432f;stop-opacity:1;"
- offset="0"
- id="stop16645" />
- <stop
- style="stop-color:#c0966d;stop-opacity:1;"
- offset="1"
- id="stop16647" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-2"
- id="linearGradient14167-87"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-636.98388,52.01562)"
- x1="443.86667"
- y1="133.98936"
- x2="451.98389"
- y2="143.58749" />
- <linearGradient
- id="linearGradient37542-2">
- <stop
- id="stop37544-5"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-1"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4138-39"
- id="linearGradient14169-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-635.98388,53.01562)"
- x1="456.03769"
- y1="135.76678"
- x2="453.61005"
- y2="133.00301" />
- <linearGradient
- id="linearGradient4138-39">
- <stop
- style="stop-color:#6c432f;stop-opacity:1;"
- offset="0"
- id="stop4140-0" />
- <stop
- style="stop-color:#c0966d;stop-opacity:1;"
- offset="1"
- id="stop4142-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-2"
- id="linearGradient14171-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-636.98388,52.01562)"
- x1="449.14645"
- y1="136.18045"
- x2="453.24457"
- y2="138.7879" />
- <linearGradient
- id="linearGradient16738">
- <stop
- id="stop16740"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop16742"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4138-39"
- id="linearGradient14173-89"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-635.98388,53.01562)"
- x1="456.03769"
- y1="135.76678"
- x2="454.31345"
- y2="133.62801" />
- <linearGradient
- id="linearGradient16745">
- <stop
- style="stop-color:#6c432f;stop-opacity:1;"
- offset="0"
- id="stop16747" />
- <stop
- style="stop-color:#c0966d;stop-opacity:1;"
- offset="1"
- id="stop16749" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-07-7"
- id="linearGradient14167-8-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-636.98388,52.01562)"
- x1="443.86667"
- y1="133.98936"
- x2="451.98389"
- y2="143.58749" />
- <linearGradient
- id="linearGradient37542-07-7">
- <stop
- id="stop37544-66-6"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-6-7"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4138-3-7"
- id="linearGradient14169-0-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-635.98388,53.01562)"
- x1="456.03769"
- y1="135.76678"
- x2="453.61005"
- y2="133.00301" />
- <linearGradient
- id="linearGradient4138-3-7">
- <stop
- style="stop-color:#6c432f;stop-opacity:1;"
- offset="0"
- id="stop4140-2-0" />
- <stop
- style="stop-color:#c0966d;stop-opacity:1;"
- offset="1"
- id="stop4142-0-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-07-7"
- id="linearGradient14171-2-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-636.98388,52.01562)"
- x1="449.14645"
- y1="136.18045"
- x2="453.24457"
- y2="138.7879" />
- <linearGradient
- id="linearGradient16840">
- <stop
- id="stop16842-2"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop16844"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4138-3-7"
- id="linearGradient14173-8-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-635.98388,53.01562)"
- x1="456.03769"
- y1="135.76678"
- x2="454.31345"
- y2="133.62801" />
- <linearGradient
- id="linearGradient16847">
- <stop
- style="stop-color:#6c432f;stop-opacity:1;"
- offset="0"
- id="stop16849" />
- <stop
- style="stop-color:#c0966d;stop-opacity:1;"
- offset="1"
- id="stop16851" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-9"
- id="linearGradient42346-4"
- gradientUnits="userSpaceOnUse"
- x1="-57.780041"
- y1="48.005856"
- x2="-78.812721"
- y2="31" />
- <linearGradient
- id="linearGradient319-9">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-98" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-56" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-9"
- id="linearGradient42344-3"
- gradientUnits="userSpaceOnUse"
- x1="-69.457596"
- y1="31.914484"
- x2="-76.564636"
- y2="28.695114" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-9">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-21" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-22"
- id="linearGradient42346-5"
- gradientUnits="userSpaceOnUse"
- x1="-57.780041"
- y1="48.005856"
- x2="-78.812721"
- y2="31" />
- <linearGradient
- id="linearGradient319-22">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-61" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-3" />
- </linearGradient>
- <linearGradient
- y2="31"
- x2="-78.812721"
- y1="48.005856"
- x1="-57.780041"
- gradientUnits="userSpaceOnUse"
- id="linearGradient17071"
- xlink:href="#linearGradient319-22"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient319-91">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-01" />
- </linearGradient>
- <linearGradient
- id="linearGradient13938-6">
- <stop
- id="stop13940-6"
- offset="0"
- style="stop-color:#6e0c00;stop-opacity:1;" />
- <stop
- id="stop13942-0"
- offset="1"
- style="stop-color:#ee3800;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient29073">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop29075" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop29077" />
- </linearGradient>
- <linearGradient
- id="linearGradient16595-2">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop16597-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop16599-9" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-1-7-5-6">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-4-4-3-0" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-0-0-8-6" />
- </linearGradient>
- <linearGradient
- id="linearGradient1610-3">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-3" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-1" />
- </linearGradient>
- <linearGradient
- id="linearGradient40578-4-8-1">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop40580-8-9-2" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop40582-6-8-4" />
- </linearGradient>
- <linearGradient
- id="linearGradient58334-93">
- <stop
- id="stop58336-4"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:0.87628865;" />
- <stop
- id="stop58338-1"
- offset="1.0000000"
- style="stop-color:#fffffe;stop-opacity:0.0000000;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-5"
- id="linearGradient39260-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-95.999998)"
- x1="754.28558"
- y1="300.83292"
- x2="758"
- y2="305" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-5">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-311" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-5" />
- </linearGradient>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask43050-6">
- <rect
- y="-122"
- x="-24"
- height="14"
- width="16"
- id="rect43052-3"
- style="opacity:0.5;fill:url(#linearGradient43054-6);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44627-7"
- id="linearGradient43054-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.3333333,0,0,1.2727273,2.6666667,29.454545)"
- x1="-4.2231579"
- y1="-92.440941"
- x2="-18.697306"
- y2="-115.04018" />
- <linearGradient
- id="linearGradient44627-7">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop44629-4" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop44631-0" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-5-1-8-2-5"
- id="radialGradient24295-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1558466,-0.5928702,0.3902392,0.7608013,47.408342,-36.891937)"
- cx="-14.226811"
- cy="-115.06647"
- fx="-14.226811"
- fy="-115.06647"
- r="7.1500001" />
- <linearGradient
- id="linearGradient10069-9-5-1-8-2-5">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-5-43-3-0-0-4" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-43-1-8-2-5-2" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-5-1-8-2-5"
- id="radialGradient24297-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3236133,-0.01520056,0.01787935,0.3806433,-7.6938144,-72.764853)"
- cx="-20.110701"
- cy="-125.53457"
- fx="-20.110701"
- fy="-125.53457"
- r="7.1500001" />
- <linearGradient
- id="linearGradient13837">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop13839" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop13841" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-4-74-1"
- id="radialGradient24299-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.0312701,-2.5000045,2.468554,-0.03087567,251.90641,-216.06454)"
- cx="-39.154209"
- cy="-118.1383"
- fx="-39.154209"
- fy="-118.1383"
- r="1" />
- <linearGradient
- id="linearGradient10069-9-7-4-74-1">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-5-4-5-0-5" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-43-0-5-9-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-4-74-1"
- id="linearGradient33126-9"
- gradientUnits="userSpaceOnUse"
- x1="110.81759"
- y1="99.274445"
- x2="131.81595"
- y2="116.38528" />
- <linearGradient
- id="linearGradient13848">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop13850" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop13852" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-5"
- id="linearGradient33128-2"
- gradientUnits="userSpaceOnUse"
- x1="128.0486"
- y1="112.48544"
- x2="135.0885"
- y2="121.2344" />
- <linearGradient
- id="linearGradient44939-8-5">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop44941-8-1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop44943-2-7" />
- </linearGradient>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask48816-8">
- <rect
- y="-84"
- x="-44"
- height="14"
- width="13"
- id="rect48818-4"
- style="opacity:0.85;fill:url(#radialGradient48820-9);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
- </mask>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44627-7"
- id="radialGradient48820-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.0769231,0,5.9230769)"
- cx="-31"
- cy="-83.5"
- fx="-31"
- fy="-83.5"
- r="6.5" />
- <linearGradient
- id="linearGradient13861">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop13863" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop13865" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-4-4"
- id="linearGradient24279-6"
- gradientUnits="userSpaceOnUse"
- x1="122.80294"
- y1="107.95783"
- x2="133.00108"
- y2="118.79662" />
- <linearGradient
- id="linearGradient10069-9-7-4-4">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-5-4-5-8" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-43-0-5-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-09"
- id="linearGradient24281-3"
- gradientUnits="userSpaceOnUse"
- x1="127.94764"
- y1="111.77869"
- x2="139.37589"
- y2="126.95278" />
- <linearGradient
- id="linearGradient44939-09">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop44941-0" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop44943-0" />
- </linearGradient>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask13875">
- <rect
- y="-84"
- x="-44"
- height="14"
- width="13"
- id="rect13877"
- style="opacity:0.85;fill:url(#radialGradient48820-9);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
- </mask>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44627-7"
- id="radialGradient13879"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.0769231,0,5.9230769)"
- cx="-31"
- cy="-83.5"
- fx="-31"
- fy="-83.5"
- r="6.5" />
- <linearGradient
- id="linearGradient13881">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop13883" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop13885" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-4-4"
- id="linearGradient24283-7"
- gradientUnits="userSpaceOnUse"
- x1="122.80294"
- y1="107.95783"
- x2="133.00108"
- y2="118.79662" />
- <linearGradient
- id="linearGradient13888">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop13890" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop13892" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-09"
- id="linearGradient24285-8"
- gradientUnits="userSpaceOnUse"
- x1="127.94764"
- y1="111.77869"
- x2="139.90622"
- y2="126.33406" />
- <linearGradient
- id="linearGradient13895">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop13897" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop13899" />
- </linearGradient>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask28585-8">
- <rect
- style="opacity:0.85;fill:url(#radialGradient28589-9);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
- id="rect28587-2"
- width="13"
- height="14"
- x="-44"
- y="-84" />
- </mask>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44627-7"
- id="radialGradient28589-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.0769231,0,5.9230769)"
- cx="-30.28125"
- cy="-84.341515"
- fx="-30.28125"
- fy="-84.341515"
- r="6.5" />
- <linearGradient
- id="linearGradient13904">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop13906" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop13908" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-4-4"
- id="linearGradient24287-1"
- gradientUnits="userSpaceOnUse"
- x1="122.80294"
- y1="107.95783"
- x2="133.00108"
- y2="118.79662" />
- <linearGradient
- id="linearGradient13911">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop13913" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop13915" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-09"
- id="linearGradient24289-3"
- gradientUnits="userSpaceOnUse"
- x1="127.94764"
- y1="111.77869"
- x2="141.05528"
- y2="129.25089" />
- <linearGradient
- id="linearGradient13918">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop13920" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop13922" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-4-4"
- id="linearGradient24241-6"
- gradientUnits="userSpaceOnUse"
- x1="128.72093"
- y1="113.87833"
- x2="134.73141"
- y2="121.3562" />
- <linearGradient
- id="linearGradient13925">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop13927" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop13929" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-09"
- id="linearGradient24243-1"
- gradientUnits="userSpaceOnUse"
- x1="127.94764"
- y1="111.77869"
- x2="140.59081"
- y2="129.0453" />
- <linearGradient
- id="linearGradient13932">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop13934" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop13936" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-4-4"
- id="linearGradient24245-3"
- gradientUnits="userSpaceOnUse"
- x1="122.85946"
- y1="108.45374"
- x2="132.08098"
- y2="118.71043" />
- <linearGradient
- id="linearGradient13939">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop13941" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop13943" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-09"
- id="linearGradient24247-8"
- gradientUnits="userSpaceOnUse"
- x1="127.94764"
- y1="111.77869"
- x2="142.87355"
- y2="131.66185" />
- <linearGradient
- id="linearGradient13946">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop13948" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop13950" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43271-3"
- id="linearGradient24249-9"
- gradientUnits="userSpaceOnUse"
- x1="-38.5"
- y1="-52.5"
- x2="-37"
- y2="-54" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient43271-3">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop43273-4" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop43275-4" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43271-3"
- id="linearGradient24251-6"
- gradientUnits="userSpaceOnUse"
- x1="-43.5"
- y1="-56"
- x2="-39"
- y2="-52" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-09"
- id="linearGradient24253-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.2489483,0,0,0.2448135,-72.383415,-81.330431)"
- x1="135.91603"
- y1="121.04676"
- x2="125.4409"
- y2="99.924934" />
- <linearGradient
- id="linearGradient13964">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop13966" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop13968" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43271-3"
- id="linearGradient24255-6"
- gradientUnits="userSpaceOnUse"
- x1="130.92398"
- y1="110.40864"
- x2="122.93221"
- y2="108.93221" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-4-4"
- id="linearGradient24257-6"
- gradientUnits="userSpaceOnUse"
- x1="122.80294"
- y1="107.95783"
- x2="133.00108"
- y2="118.79662" />
- <linearGradient
- id="linearGradient13978">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop13980" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop13982" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-09"
- id="linearGradient24259-1"
- gradientUnits="userSpaceOnUse"
- x1="127.94764"
- y1="111.77869"
- x2="144.59082"
- y2="133.6703" />
- <linearGradient
- id="linearGradient13985">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop13987" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop13989" />
- </linearGradient>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask43040-7">
- <rect
- style="opacity:0.5;fill:url(#linearGradient43044-5);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect43042-9"
- width="15"
- height="16"
- x="-45.04018"
- y="-24"
- rx="0"
- ry="0" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43760-6-4"
- id="linearGradient43044-5"
- gradientUnits="userSpaceOnUse"
- x1="-44.709698"
- y1="-8.4836445"
- x2="-37.784756"
- y2="-18.517523"
- gradientTransform="translate(-0.04018164,0)" />
- <linearGradient
- id="linearGradient43760-6-4">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop43762-7-3" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop43764-8-1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030-71-3"
- id="linearGradient24236-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,-1,-242.99992,269.00357)"
- x1="202.85626"
- y1="276.47174"
- x2="212.82164"
- y2="288.37567" />
- <linearGradient
- id="linearGradient9030-71-3">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop9032-15-3" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop9034-276-4" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-5-1-1"
- id="linearGradient24239-1"
- gradientUnits="userSpaceOnUse"
- x1="125.93652"
- y1="111.8362"
- x2="132.65851"
- y2="117.92533" />
- <linearGradient
- id="linearGradient10069-9-5-1-1">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-5-43-3-3" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-43-1-8-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-5-1-1"
- id="linearGradient24230-5"
- gradientUnits="userSpaceOnUse"
- x1="117.00603"
- y1="104.51898"
- x2="132.99687"
- y2="118.98331" />
- <linearGradient
- id="linearGradient14006">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop14008" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop14010" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-2-8"
- id="linearGradient24232-9"
- gradientUnits="userSpaceOnUse"
- x1="128.0486"
- y1="112.48544"
- x2="139.58116"
- y2="126.8241" />
- <linearGradient
- id="linearGradient44939-2-8">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop44941-7-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop44943-7-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-5-1-1"
- id="linearGradient24234-7"
- gradientUnits="userSpaceOnUse"
- x1="117.00603"
- y1="104.51898"
- x2="132.99687"
- y2="118.98331" />
- <linearGradient
- id="linearGradient14017">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop14019" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop14021" />
- </linearGradient>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask45865-7">
- <g
- id="g45867-3"
- transform="translate(-14,0)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cssssssc"
- id="path45869-7"
- d="m -25.801826,-135.3217 c -0.907684,-0.32824 -0.906457,-1.55361 -0.440107,-2.23642 0.834186,-1.22138 2.593738,-1.15244 3.63669,-0.26277 1.530569,1.30563 1.388406,3.6923 0.08107,5.09763 -1.742467,1.8731 -4.73519,1.65156 -6.47424,-0.0993 -2.188413,-2.20322 -1.889457,-5.85971 0.277965,-7.95885 2.625036,-2.54234 6.931515,-2.199 9.311783,0.46129 2.764074,3.08924 2.372937,7.82808 -0.06591,10.77438"
- style="fill:none;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;enable-background:new"
- mask="none" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path45871-2"
- d="m -19.40866,-140.32008 c 2.764074,3.08924 2.372937,7.82808 -0.06591,10.77438"
- style="fill:none;stroke:url(#linearGradient45875-0);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;enable-background:new" />
- <path
- inkscape:connector-curvature="0"
- mask="none"
- style="fill:none;stroke:url(#radialGradient45877-1);stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;enable-background:new"
- d="m -25.801826,-135.3217 c -0.907684,-0.32824 -0.906457,-1.55361 -0.440107,-2.23642 0.834186,-1.22138 2.593738,-1.15244 3.63669,-0.26277"
- id="path45873-6"
- sodipodi:nodetypes="css" />
- </g>
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43760-7"
- id="linearGradient45875-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(14,0)"
- x1="-34.051685"
- y1="-129.32457"
- x2="-32.542458"
- y2="-139.90228" />
- <linearGradient
- id="linearGradient43760-7">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop43762-79" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop43764-3" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43760-7"
- id="radialGradient45877-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.1099414,-0.9422316,0.4519816,0.05273803,38.220416,-152.21215)"
- cx="-25.452209"
- cy="-136.46503"
- fx="-25.452209"
- fy="-136.46503"
- r="8.0066185" />
- <linearGradient
- id="linearGradient14033">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop14035" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop14037" />
- </linearGradient>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask45447-7">
- <rect
- ry="0"
- style="opacity:0.8;fill:url(#radialGradient45451-2);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect45449-4"
- width="15"
- height="15"
- x="216"
- y="366" />
- </mask>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43760-7"
- id="radialGradient45451-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.9952162,167.99999,-60.91415)"
- cx="59.000011"
- cy="440.0191"
- fx="59.000011"
- fy="440.0191"
- r="6.5080619" />
- <linearGradient
- id="linearGradient14042">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop14044" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop14046" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-42-9"
- id="linearGradient24218-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9166695,0,0,0.9203753,-10.025729,345.78566)"
- x1="80.60067"
- y1="108.47212"
- x2="68.0271"
- y2="94.239906" />
- <linearGradient
- id="linearGradient319-42-9">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-32-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-21-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-0"
- id="linearGradient24220-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-15.983875,338)"
- x1="70.55275"
- y1="97.5"
- x2="79.355118"
- y2="107.18619" />
- <linearGradient
- id="linearGradient10069-9-7-0">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-5-4-2" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-43-0-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-42-9"
- id="linearGradient24222-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9998599,0,0,0.9960071,-15.972985,338.41149)"
- x1="61.465469"
- y1="88.058716"
- x2="86.00116"
- y2="112.03586" />
- <linearGradient
- id="linearGradient14057">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop14059" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop14061" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-0"
- id="radialGradient24224-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.9952162,0,2.085841)"
- cx="60.007744"
- cy="441.04678"
- fx="60.007744"
- fy="441.04678"
- r="6.5080619" />
- <linearGradient
- id="linearGradient14064">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop14066" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop14068" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-4-4"
- id="linearGradient24226-2"
- gradientUnits="userSpaceOnUse"
- x1="113.01286"
- y1="99.778664"
- x2="132"
- y2="118" />
- <linearGradient
- id="linearGradient14071">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop14073" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop14075" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-09"
- id="linearGradient24228-5"
- gradientUnits="userSpaceOnUse"
- x1="128.0486"
- y1="112.48544"
- x2="136.08115"
- y2="122.99075" />
- <linearGradient
- id="linearGradient14078">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop14080" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop14082" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-4-4"
- id="linearGradient24214-1"
- gradientUnits="userSpaceOnUse"
- x1="118.73534"
- y1="106.55459"
- x2="133.00108"
- y2="118.79662" />
- <linearGradient
- id="linearGradient14085">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop14087" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop14089" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-09"
- id="linearGradient24216-4"
- gradientUnits="userSpaceOnUse"
- x1="127.94764"
- y1="111.77869"
- x2="140.59081"
- y2="129.0453" />
- <linearGradient
- id="linearGradient14092">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop14094" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop14096" />
- </linearGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath43135-6">
- <path
- inkscape:connector-curvature="0"
- id="path43137-1"
- d="m -46,52 16,-16 -16,0 0,16 z"
- style="opacity:0.5;fill:#ffff00;fill-rule:evenodd;stroke:none" />
- </clipPath>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask43188-4">
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.5;fill:url(#linearGradient43192-3);fill-rule:evenodd;stroke:none"
- d="m -46,52 16,-16 -16,0 0,16 z"
- id="path43190-2" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-5-2"
- id="linearGradient43192-3"
- gradientUnits="userSpaceOnUse"
- x1="-47"
- y1="44"
- x2="-43"
- y2="44" />
- <linearGradient
- id="linearGradient1610-5-2">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-17-2" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-115-1" />
- </linearGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath43178-6">
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.5;fill:#ffff00;fill-rule:evenodd;stroke:none"
- d="m -30,36 -1,0 -15,15 0,1 16,0 0,-16 z"
- id="path43180-8"
- sodipodi:nodetypes="cccccc" />
- </clipPath>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask43182-5">
- <path
- inkscape:connector-curvature="0"
- id="path43184-7"
- d="m -46,52 0,-1 15,-15 1,0 0,16 -16,0 z"
- style="opacity:0.5;fill:url(#linearGradient43186-6);fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="cccccc" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-5-2"
- id="linearGradient43186-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,-1,0,6,6)"
- x1="-47"
- y1="44"
- x2="-43"
- y2="44" />
- <linearGradient
- id="linearGradient14111">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop14113" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop14115" />
- </linearGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath14117">
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.5;fill:#ffff00;fill-rule:evenodd;stroke:none"
- d="m -30,36 -1,0 -15,15 0,1 16,0 0,-16 z"
- id="path14119"
- sodipodi:nodetypes="cccccc" />
- </clipPath>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask14121">
- <path
- inkscape:connector-curvature="0"
- id="path14123"
- d="m -46,52 0,-1 15,-15 1,0 0,16 -16,0 z"
- style="opacity:0.5;fill:url(#linearGradient43186-6);fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="cccccc" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-5-2"
- id="linearGradient14125"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,-1,0,6,6)"
- x1="-47"
- y1="44"
- x2="-43"
- y2="44" />
- <linearGradient
- id="linearGradient14127">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop14129" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop14131" />
- </linearGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath14133">
- <path
- inkscape:connector-curvature="0"
- id="path14135"
- d="m -46,52 16,-16 -16,0 0,16 z"
- style="opacity:0.5;fill:#ffff00;fill-rule:evenodd;stroke:none" />
- </clipPath>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask14137">
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.5;fill:url(#linearGradient43192-3);fill-rule:evenodd;stroke:none"
- d="m -46,52 16,-16 -16,0 0,16 z"
- id="path14139" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-5-2"
- id="linearGradient14141"
- gradientUnits="userSpaceOnUse"
- x1="-47"
- y1="44"
- x2="-43"
- y2="44" />
- <linearGradient
- id="linearGradient14143">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop14145" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop14147" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-4-74-1"
- id="linearGradient24210-1"
- gradientUnits="userSpaceOnUse"
- x1="110.81759"
- y1="99.274445"
- x2="131.81595"
- y2="116.38528" />
- <linearGradient
- id="linearGradient14150">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop14152" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop14154" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-5"
- id="linearGradient24212-8"
- gradientUnits="userSpaceOnUse"
- x1="128.0486"
- y1="112.48544"
- x2="135.0885"
- y2="121.2344" />
- <linearGradient
- id="linearGradient14157">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop14159" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop14161" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44627-7"
- id="linearGradient24044-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(21,0)"
- x1="44.380783"
- y1="251.66991"
- x2="36.415714"
- y2="247.47705" />
- <linearGradient
- id="linearGradient14164">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop14166" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop14168" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44627-7"
- id="linearGradient24046-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(21,0)"
- x1="35.434578"
- y1="250.11682"
- x2="34"
- y2="244" />
- <linearGradient
- id="linearGradient14171-1">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop14173" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop14175" />
- </linearGradient>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask25021-4">
- <rect
- style="fill:url(#radialGradient25025-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect25023-8"
- width="13"
- height="14"
- x="26"
- y="243" />
- </mask>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44627-7"
- id="radialGradient25025-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8918342,0,0,0.8918344,-15.699877,27.900732)"
- cx="49"
- cy="254.64285"
- fx="49"
- fy="254.64285"
- r="6.5" />
- <linearGradient
- id="linearGradient14180">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop14182" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop14184" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44627-7"
- id="radialGradient24048-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0474269,0.00526965,-0.00503098,0.9999873,-0.01415572,-0.141212)"
- cx="27.411026"
- cy="255.58899"
- fx="27.411026"
- fy="255.58899"
- r="5.9250002" />
- <linearGradient
- id="linearGradient14187">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop14189" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop14191" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44627-7"
- id="radialGradient24050-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0474269,0.00526965,-0.00503098,0.9999873,-0.01415572,-0.141212)"
- cx="27.411026"
- cy="255.58899"
- fx="27.411026"
- fy="255.58899"
- r="5.9250002" />
- <linearGradient
- id="linearGradient14194">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop14196" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop14198" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-5"
- id="linearGradient24053-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(21,0)"
- x1="44.751385"
- y1="254.98178"
- x2="34.110981"
- y2="244.60397" />
- <linearGradient
- id="linearGradient14201">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop14203" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop14205" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-4-74-1"
- id="linearGradient24055-1"
- gradientUnits="userSpaceOnUse"
- x1="110.81759"
- y1="99.274445"
- x2="131.81595"
- y2="116.38528" />
- <linearGradient
- id="linearGradient14208">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop14210" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop14212" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-5"
- id="linearGradient24057-7"
- gradientUnits="userSpaceOnUse"
- x1="128.0486"
- y1="112.48544"
- x2="137.44791"
- y2="125.06842" />
- <linearGradient
- id="linearGradient14215">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop14217" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop14219" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-9-7-5-5"
- id="linearGradient24022-6"
- gradientUnits="userSpaceOnUse"
- x1="-33.912659"
- y1="-143.20003"
- x2="-35.580078"
- y2="-159.1228" />
- <linearGradient
- id="linearGradient10069-9-7-5-5">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-5-4-58-7" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-43-0-4-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-5-2"
- id="linearGradient24024-4"
- gradientUnits="userSpaceOnUse"
- x1="-41.5"
- y1="-161.74199"
- x2="-40.654259"
- y2="-147.07195" />
- <linearGradient
- id="linearGradient14226">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop14228" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop14230" />
- </linearGradient>
- <linearGradient
- y2="-156.42979"
- x2="-37.567211"
- y1="-148.8125"
- x1="-34.09375"
- gradientUnits="userSpaceOnUse"
- id="linearGradient61917"
- xlink:href="#linearGradient319-76-2-0"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient319-76-2-0">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-142-0" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-32-0" />
- </linearGradient>
- <linearGradient
- y2="-156.42979"
- x2="-37.567211"
- y1="-148.8125"
- x1="-34.09375"
- gradientUnits="userSpaceOnUse"
- id="linearGradient14482-7"
- xlink:href="#linearGradient319-76-2-0"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient10069-8">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop10071-91" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop10073-30" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-50">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-368" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-54" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37829-7"
- id="linearGradient37089-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.9999993,0,0,-0.9821923,165.4,716.20935)"
- x1="261.17639"
- y1="247.85646"
- x2="253.86414"
- y2="288.70752" />
- <linearGradient
- id="linearGradient37829-7">
- <stop
- id="stop37831-4"
- offset="0"
- style="stop-color:#3d361a;stop-opacity:1;" />
- <stop
- style="stop-color:#d1c595;stop-opacity:1;"
- offset="0.5"
- id="stop37833-0" />
- <stop
- id="stop37835-9"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient39080-8"
- id="linearGradient37091-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.888884,0,0,-0.8730569,136.66557,688.20759)"
- x1="261.60016"
- y1="247.008"
- x2="263.60016"
- y2="262.27994" />
- <linearGradient
- id="linearGradient39080-8">
- <stop
- style="stop-color:#1a2a3d;stop-opacity:1;"
- offset="0"
- id="stop39082-8" />
- <stop
- id="stop39084-2"
- offset="0.5"
- style="stop-color:#95b0d1;stop-opacity:1;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="1"
- id="stop39086-4" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030-7-8-6-5"
- id="linearGradient37093-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-124.99991,219.9903)"
- x1="19.923029"
- y1="232.59058"
- x2="50.485012"
- y2="265.9697" />
- <linearGradient
- id="linearGradient9030-7-8-6-5">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop9032-4-9-2-1" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop9034-0-2-3-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient40809-2-2-1"
- id="linearGradient37096-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.7500336,0,0,0.8546123,-239.89087,340.17205)"
- x1="199.26254"
- y1="144.5041"
- x2="193.7029"
- y2="144.5041" />
- <linearGradient
- id="linearGradient40809-2-2-1">
- <stop
- style="stop-color:#0059d7;stop-opacity:1;"
- offset="0"
- id="stop40811-1-6-5" />
- <stop
- style="stop-color:#b7d4ff;stop-opacity:1;"
- offset="1"
- id="stop40813-4-2-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20055-7-5-5-6"
- id="linearGradient37098-7"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-670.99999,411.99999)"
- x1="579.625"
- y1="54.299286"
- x2="576.4375"
- y2="49.84375" />
- <linearGradient
- id="linearGradient20055-7-5-5-6">
- <stop
- id="stop20057-1-7-7-1"
- offset="0"
- style="stop-color:#0a2a5a;stop-opacity:1;" />
- <stop
- id="stop20059-1-6-8-4"
- offset="1"
- style="stop-color:#3771c8;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-4-9-7-3"
- id="linearGradient37100-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-670.99999,411.99999)"
- x1="582.79974"
- y1="56.363762"
- x2="575.70361"
- y2="49.87711" />
- <linearGradient
- id="linearGradient16500-4-9-7-3">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-8-5-8-2" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-8-4-0-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030-7-8-6-5"
- id="linearGradient37102-1"
- gradientUnits="userSpaceOnUse"
- x1="129.74713"
- y1="118"
- x2="144.33401"
- y2="132.61403" />
- <linearGradient
- id="linearGradient15945">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop15947" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop15949" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-4-9-7-3"
- id="linearGradient37104-6"
- gradientUnits="userSpaceOnUse"
- x1="140.78264"
- y1="123.96156"
- x2="132.25548"
- y2="116.40535" />
- <linearGradient
- id="linearGradient15952">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop15954" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop15956" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-1"
- id="linearGradient16638-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(42,0)"
- x1="108"
- y1="500"
- x2="54.8125"
- y2="500" />
- <linearGradient
- id="linearGradient1610-1">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-38" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15809-2"
- id="linearGradient16640-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(42,0)"
- x1="85.874489"
- y1="501.74075"
- x2="26.561054"
- y2="498.48148" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient15809-2">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop15811-7" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop15813-79" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-1"
- id="linearGradient16642-3"
- gradientUnits="userSpaceOnUse"
- x1="80.768944"
- y1="504.67188"
- x2="76.885078"
- y2="501.58331" />
- <linearGradient
- id="linearGradient16104">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16106" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop16108" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-98"
- id="linearGradient16644-1"
- gradientUnits="userSpaceOnUse"
- x1="89.526657"
- y1="511.42972"
- x2="78.000008"
- y2="501.04794" />
- <linearGradient
- id="linearGradient319-98">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-65" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-028" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262-0"
- id="radialGradient16646-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3949409,0.3949425,-0.4243709,0.4254619,300.60762,256.85923)"
- cx="75.95578"
- cy="492.15359"
- fx="75.95578"
- fy="492.15359"
- r="3.1650217" />
- <linearGradient
- id="linearGradient14262-0">
- <stop
- id="stop14264-2"
- offset="0"
- style="stop-color:#2661b6;stop-opacity:1;" />
- <stop
- id="stop14266-4"
- offset="1"
- style="stop-color:#c1d7f8;stop-opacity:0;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-98"
- id="radialGradient16648-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.4624192,0,0,1.4467089,-36.975824,-224.99718)"
- cx="79.959885"
- cy="503.81497"
- fx="79.959885"
- fy="503.81497"
- r="2.9089756" />
- <linearGradient
- id="linearGradient16119">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16121" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16123" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262-0"
- id="radialGradient16650-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8886193,0.8021825,-0.8051059,0.8972684,411.80247,-8.668512)"
- cx="74.518959"
- cy="499.99969"
- fx="74.518959"
- fy="499.99969"
- r="3.1650217" />
- <linearGradient
- id="linearGradient16126">
- <stop
- id="stop16128"
- offset="0"
- style="stop-color:#2661b6;stop-opacity:1;" />
- <stop
- id="stop16130"
- offset="1"
- style="stop-color:#c1d7f8;stop-opacity:0;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821-0"
- id="radialGradient32447-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.054749"
- cy="499.87418"
- fx="75.054749"
- fy="499.87418"
- r="3.1650217" />
- <linearGradient
- id="linearGradient18821-0">
- <stop
- style="stop-color:#fc6b58;stop-opacity:1;"
- offset="0"
- id="stop18823-9" />
- <stop
- style="stop-color:#fc6b58;stop-opacity:0;"
- offset="1"
- id="stop18825-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient16326"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(42,0)"
- x1="108"
- y1="500"
- x2="54.8125"
- y2="500" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15809"
- id="linearGradient16328"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(42,0)"
- x1="85.874489"
- y1="501.74075"
- x2="26.561054"
- y2="498.48148" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient16330"
- gradientUnits="userSpaceOnUse"
- x1="80.768944"
- y1="504.67188"
- x2="76.885078"
- y2="501.58331" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient16332"
- gradientUnits="userSpaceOnUse"
- x1="89.526657"
- y1="511.42972"
- x2="78.000008"
- y2="501.04794" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient16334"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3949409,0.3949425,-0.4243709,0.4254619,300.60762,256.85923)"
- cx="75.95578"
- cy="492.15359"
- fx="75.95578"
- fy="492.15359"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient16336"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.4624192,0,0,1.4467089,-36.975824,-224.99718)"
- cx="79.959885"
- cy="503.81497"
- fx="79.959885"
- fy="503.81497"
- r="2.9089756" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient16338"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8886193,0.8021825,-0.8051059,0.8972684,411.80247,-8.668512)"
- cx="74.518959"
- cy="499.99969"
- fx="74.518959"
- fy="499.99969"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient16340"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.054749"
- cy="499.87418"
- fx="75.054749"
- fy="499.87418"
- r="3.1650217" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient16365"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(42,0)"
- x1="108"
- y1="500"
- x2="54.8125"
- y2="500" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15809"
- id="linearGradient16368"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(42,0)"
- x1="85.874489"
- y1="501.74075"
- x2="26.561054"
- y2="498.48148" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient16370"
- gradientUnits="userSpaceOnUse"
- x1="80.768944"
- y1="504.67188"
- x2="76.885078"
- y2="501.58331" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient16372"
- gradientUnits="userSpaceOnUse"
- x1="89.526657"
- y1="511.42972"
- x2="78.000008"
- y2="501.04794" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient16374"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3949409,0.3949425,-0.4243709,0.4254619,300.60762,256.85923)"
- cx="75.95578"
- cy="492.15359"
- fx="75.95578"
- fy="492.15359"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient16376"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.4624192,0,0,1.4467089,-36.975824,-224.99718)"
- cx="79.959885"
- cy="503.81497"
- fx="79.959885"
- fy="503.81497"
- r="2.9089756" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient16378"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8886193,0.8021825,-0.8051059,0.8972684,411.80247,-8.668512)"
- cx="74.518959"
- cy="499.99969"
- fx="74.518959"
- fy="499.99969"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient16380"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.054749"
- cy="499.87418"
- fx="75.054749"
- fy="499.87418"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient16388"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.25944122,0.26285562,-0.27877413,0.28316794,597.6654,341.51983)"
- cx="75.95578"
- cy="492.15359"
- fx="75.95578"
- fy="492.15359"
- r="3.1650217" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15809"
- id="linearGradient16404"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6569115,0,0,0.66555416,427.78308,170.5661)"
- x1="85.874489"
- y1="501.74075"
- x2="26.561054"
- y2="498.48148" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient16407"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6569115,0,0,0.66555416,427.78308,170.5661)"
- x1="108"
- y1="500"
- x2="54.8125"
- y2="500" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821"
- id="radialGradient16409"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.054749"
- cy="499.87418"
- fx="75.054749"
- fy="499.87418"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient16411"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8886193,0.8021825,-0.8051059,0.8972684,411.80247,-8.668512)"
- cx="74.518959"
- cy="499.99969"
- fx="74.518959"
- fy="499.99969"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient16413"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.4624192,0,0,1.4467089,-36.975824,-224.99718)"
- cx="79.959885"
- cy="503.81497"
- fx="79.959885"
- fy="503.81497"
- r="2.9089756" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient16415"
- gradientUnits="userSpaceOnUse"
- x1="89.526657"
- y1="511.42972"
- x2="78.000008"
- y2="501.04794" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient16417"
- gradientUnits="userSpaceOnUse"
- x1="80.768944"
- y1="504.67188"
- x2="76.885078"
- y2="501.58331" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient17992"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3949409,0.3949425,-0.4243709,0.4254619,657.60762,257.85923)"
- cx="75.95578"
- cy="492.15359"
- fx="75.95578"
- fy="492.15359"
- r="3.1650217" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15809"
- id="linearGradient18008"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(399,1)"
- x1="85.874489"
- y1="501.74075"
- x2="26.561054"
- y2="498.48148" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient18011"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(399,1)"
- x1="108"
- y1="500"
- x2="54.8125"
- y2="500" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient18146"
- gradientUnits="userSpaceOnUse"
- x1="80.768944"
- y1="504.67188"
- x2="76.885078"
- y2="501.58331" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient18149"
- gradientUnits="userSpaceOnUse"
- x1="89.526657"
- y1="511.42972"
- x2="78.000008"
- y2="501.04794" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="radialGradient18151"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.4624192,0,0,1.4467089,-36.975824,-224.99718)"
- cx="79.959885"
- cy="503.81497"
- fx="79.959885"
- fy="503.81497"
- r="2.9089756" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262"
- id="radialGradient18153"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8886193,0.8021825,-0.8051059,0.8972684,411.80247,-8.668512)"
- cx="74.518959"
- cy="499.99969"
- fx="74.518959"
- fy="499.99969"
- r="3.1650217" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18821-4"
- id="radialGradient18161-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- cx="75.054749"
- cy="499.87418"
- fx="75.054749"
- fy="499.87418"
- r="3.1650217" />
- <linearGradient
- id="linearGradient18821-4">
- <stop
- style="stop-color:#fc6b58;stop-opacity:1;"
- offset="0"
- id="stop18823-0" />
- <stop
- style="stop-color:#fc6b58;stop-opacity:0;"
- offset="1"
- id="stop18825-1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18205"
- id="linearGradient18212"
- x1="75.46875"
- y1="502"
- x2="80.53125"
- y2="502"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18214"
- id="linearGradient18220"
- x1="75.46875"
- y1="502"
- x2="80.53125"
- y2="502"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29761"
- id="linearGradient28981"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8422958,0,0,0.8364537,82.535678,2.9394266)"
- x1="89.975014"
- y1="-32.339718"
- x2="88.492455"
- y2="-33.303608" />
- <linearGradient
- id="linearGradient29761">
- <stop
- style="stop-color:#b74125;stop-opacity:1;"
- offset="0"
- id="stop29763" />
- <stop
- style="stop-color:#f9fbff;stop-opacity:1"
- offset="1"
- id="stop29765" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29761"
- id="linearGradient28983"
- gradientUnits="userSpaceOnUse"
- x1="131.02808"
- y1="123.49161"
- x2="128.7139"
- y2="115.97001" />
- <linearGradient
- id="linearGradient67970">
- <stop
- style="stop-color:#b74125;stop-opacity:1;"
- offset="0"
- id="stop67972" />
- <stop
- style="stop-color:#f9fbff;stop-opacity:1"
- offset="1"
- id="stop67974" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29761"
- id="linearGradient28985"
- gradientUnits="userSpaceOnUse"
- x1="136.35806"
- y1="124.27161"
- x2="130.48389"
- y2="118" />
- <linearGradient
- id="linearGradient67977">
- <stop
- style="stop-color:#b74125;stop-opacity:1;"
- offset="0"
- id="stop67979" />
- <stop
- style="stop-color:#f9fbff;stop-opacity:1"
- offset="1"
- id="stop67981" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8864-1"
- id="linearGradient28987"
- gradientUnits="userSpaceOnUse"
- x1="115.15884"
- y1="88.476723"
- x2="109.18613"
- y2="82.308861" />
- <linearGradient
- id="linearGradient8864-1">
- <stop
- id="stop8866-0"
- offset="0"
- style="stop-color:#b43214;stop-opacity:1;" />
- <stop
- id="stop8868-1"
- offset="1"
- style="stop-color:#e86830;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-8-8"
- id="linearGradient28989"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(21,0)"
- x1="101"
- y1="84.25"
- x2="97.75"
- y2="81.5" />
- <linearGradient
- id="linearGradient1610-8-8">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-7-7" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-4-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-77-0"
- id="linearGradient28991"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(21,0)"
- x1="87.44548"
- y1="81.439644"
- x2="96.592278"
- y2="89.708977" />
- <linearGradient
- id="linearGradient319-77-0">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-9-0" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-31-9" />
- </linearGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath42711-1">
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect42713-9"
- width="8.7252884"
- height="17.464855"
- x="127.4093"
- y="214.76154" />
- </clipPath>
- <linearGradient
- id="linearGradient23974-26">
- <stop
- id="stop23976-5"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop23978-4"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-952">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-0" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-80" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-4"
- id="linearGradient42432-1"
- gradientUnits="userSpaceOnUse"
- x1="258.94861"
- y1="285.63672"
- x2="237.92474"
- y2="261.44183" />
- <linearGradient
- id="linearGradient1610-4">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-64" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-20" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-4-3"
- id="linearGradient42432-1-2"
- gradientUnits="userSpaceOnUse"
- x1="258.94861"
- y1="285.63672"
- x2="237.92474"
- y2="261.44183" />
- <linearGradient
- id="linearGradient1610-4-3">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-64-0" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-20-3" />
- </linearGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath42711-1-4">
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect42713-9-5"
- width="8.7252884"
- height="17.464855"
- x="127.4093"
- y="214.76154" />
- </clipPath>
- <linearGradient
- id="linearGradient23974-26-9">
- <stop
- id="stop23976-5-9"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop23978-4-3"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-952-9">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-0-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-80-4" />
- </linearGradient>
- <linearGradient
- id="linearGradient1610-4-3-5">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-64-0-8" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-20-3-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17073"
- id="linearGradient17037"
- x1="240.40633"
- y1="261.35129"
- x2="240.41891"
- y2="273.68066"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974-26-9-3"
- id="linearGradient17037-8"
- x1="236.60706"
- y1="267.99017"
- x2="243.94019"
- y2="267.99017"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient23974-26-9-3">
- <stop
- id="stop23976-5-9-4"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop23978-4-3-4"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- gradientTransform="translate(-341.96134,-472.09253)"
- inkscape:collect="always"
- xlink:href="#radialGradient16142-4"
- id="linearGradient16343"
- x1="349.53067"
- y1="480.05426"
- x2="365.46213"
- y2="461.89044"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- gradientUnits="userSpaceOnUse"
- fy="64.567902"
- fx="20.892099"
- r="5.257"
- cy="64.567902"
- cx="20.892099"
- id="radialGradient16142-4">
- <stop
- id="stop16144-7"
- style="stop-color:#F0F0F0"
- offset="0" />
- <stop
- id="stop16146-4"
- style="stop-color:#474747"
- offset="1" />
+ <linearGradient id="linearGradient319-367">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop320-53"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop321-562"/>
+ </linearGradient>
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient18134" id="linearGradient12353" gradientUnits="userSpaceOnUse" gradientTransform="translate(21,-39)" x1="19" y1="550" x2="-1.8890873" y2="529.28772"/>
+
+ <linearGradient id="linearGradient319-95-2-7-1-2">
+ <stop style="stop-color:#ffffff;stop-opacity:0.75675678;" offset="0" id="stop320-43-7-3-3-3"/>
+ <stop style="stop-color:#915515;stop-opacity:0;" offset="1" id="stop321-12-7-4-1-9"/>
+ </linearGradient>
+ <linearGradient id="linearGradient10069-8-3-3-0-3">
+ <stop style="stop-color:#764511;stop-opacity:1;" offset="0" id="stop10071-9-8-7-1-8"/>
+ <stop style="stop-color:#915515;stop-opacity:0;" offset="1" id="stop10073-2-7-1-0-5"/>
+ </linearGradient>
+ <linearGradient id="linearGradient13998-7-0">
+ <stop id="stop14000-1-1" offset="0" style="stop-color:#f57d07;stop-opacity:1;"/>
+ <stop id="stop14002-0-0" offset="1" style="stop-color:white;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="linearGradient11162" gradientUnits="userSpaceOnUse" x1="16.5" y1="686.50714" x2="6" y2="697"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="linearGradient11184" gradientUnits="userSpaceOnUse" x1="16.5" y1="686.50714" x2="6" y2="697" gradientTransform="translate(231,-399.00712)"/>
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="linearGradient11190" gradientUnits="userSpaceOnUse" gradientTransform="translate(21)" x1="16.5" y1="686.50714" x2="6" y2="697"/>
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="linearGradient11196" gradientUnits="userSpaceOnUse" gradientTransform="translate(42)" x1="16.5" y1="686.50714" x2="6" y2="697"/>
+
+
+
+
+
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient21517-3" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.891843,0,0,0.909224,-173.10957,172.3592)" cx="350.5" cy="14.5" fx="350.5" fy="14.5" r="6.9000001"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="linearGradient31019" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-45,271.82331,-251.06972)" x1="85.548706" y1="100.22395" x2="85.347076" y2="113.09817"/>
+ <linearGradient id="linearGradient30958">
+ <stop id="stop30960" offset="0" style="stop-color:#fff9cf;stop-opacity:1;"/>
+ <stop id="stop30962" offset="1" style="stop-color:#c7bc52;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient18495" id="linearGradient14207" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-0.9569715,-1,0,322,353.18743)" x1="347.6467" y1="216.75188" x2="345.98633" y2="243.92201"/>
+ <linearGradient gradientTransform="matrix(-1,0,0,1,194,-21)" inkscape:collect="always" xlink:href="#linearGradient35411" id="linearGradient35446-0" gradientUnits="userSpaceOnUse" x1="31" y1="60.000004" x2="34" y2="54.000004"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="linearGradient14238" gradientUnits="userSpaceOnUse" x1="132" y1="120.4313" x2="93.029579" y2="78.9655"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient319" id="linearGradient14413" gradientUnits="userSpaceOnUse" x1="132" y1="120.4313" x2="93.029579" y2="78.9655" gradientTransform="translate(-5e-8,-7.9962027e-6)"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient319" id="linearGradient14478" gradientUnits="userSpaceOnUse" gradientTransform="translate(0,-8e-6)" x1="132" y1="120.4313" x2="93.029579" y2="78.9655"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient319" id="linearGradient13559" gradientUnits="userSpaceOnUse" gradientTransform="translate(-1.0000001e-7,-8.5e-6)" x1="132" y1="120.4313" x2="93.029579" y2="78.9655"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient319" id="linearGradient14293" gradientUnits="userSpaceOnUse" x1="132" y1="120.4313" x2="93.029579" y2="78.9655"/>
+ <radialGradient id="radialGradient16824-1" cx="20.892099" cy="64.567902" r="5.257" fx="20.892099" fy="64.567902" gradientUnits="userSpaceOnUse">
+ <stop offset="0" style="stop-color:#b7b7b7;stop-opacity:1;" id="stop16826-5"/>
+ <stop id="stop16828-2" style="stop-color:#646464;stop-opacity:1;" offset="0.50338405"/>
+ <stop offset="1" style="stop-color:#b7b7b7;stop-opacity:1;" id="stop16830-7"/>
</radialGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#radialGradient16142-4"
- id="linearGradient16082"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,-1,550.17094,516.99093)"
- x1="349.53067"
- y1="480.05426"
- x2="365.46213"
- y2="461.89044" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43009"
- id="linearGradient16932"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.7118707,-0.00216237,-0.00556412,-1.3288889,198.24155,47.428048)"
- x1="5.6458621"
- y1="11.418204"
- x2="7.3551626"
- y2="13.092201" />
- <linearGradient
- id="linearGradient43009">
- <stop
- style="stop-color:#e9e9e9;stop-opacity:1;"
- offset="0"
- id="stop43011" />
- <stop
- id="stop16834"
- offset="0.30847755"
- style="stop-color:#e9e9e9;stop-opacity:0.49803922;" />
- <stop
- style="stop-color:#e9e9e9;stop-opacity:0;"
- offset="1"
- id="stop43013" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20756-2"
- id="linearGradient16935"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.0850614,-0.0361511,0.02414524,-1.0240584,193.00521,36.425288)"
- x1="4.155818"
- y1="5.3683834"
- x2="6.5799594"
- y2="7.7035389" />
- <linearGradient
- id="linearGradient20756-2">
- <stop
- style="stop-color:#00327d;stop-opacity:1;"
- offset="0"
- id="stop20758-7" />
- <stop
- style="stop-color:#65a1fb;stop-opacity:1;"
- offset="1"
- id="stop20760-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16850"
- id="linearGradient16939"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.0895881,0,0,-1.1205216,202.0323,36.300118)"
- x1="5.1938357"
- y1="8.7375145"
- x2="7.5092869"
- y2="11.3536" />
- <linearGradient
- id="linearGradient16850">
- <stop
- style="stop-color:#e9e9e9;stop-opacity:0;"
- offset="0"
- id="stop16852" />
- <stop
- id="stop16854"
- offset="0.38177863"
- style="stop-color:#e9e9e9;stop-opacity:1;" />
- <stop
- style="stop-color:#e9e9e9;stop-opacity:0;"
- offset="1"
- id="stop16856" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#radialGradient16824"
- id="linearGradient16942"
- gradientUnits="userSpaceOnUse"
- x1="4.9106402"
- y1="8.3244486"
- x2="8.5571098"
- y2="12.702949"
- gradientTransform="matrix(-1.1749798,0,0,-1.2083376,202.58771,37.243938)" />
- <radialGradient
- id="radialGradient16824"
- cx="20.892099"
- cy="64.567902"
- r="5.257"
- fx="20.892099"
- fy="64.567902"
- gradientUnits="userSpaceOnUse">
- <stop
- offset="0"
- style="stop-color:#b7b7b7;stop-opacity:1;"
- id="stop16826" />
- <stop
- id="stop16828"
- style="stop-color:#646464;stop-opacity:1;"
- offset="0.50338405" />
- <stop
- offset="1"
- style="stop-color:#b7b7b7;stop-opacity:1;"
- id="stop16830" />
+ <linearGradient id="linearGradient16850-5">
+ <stop style="stop-color:#e9e9e9;stop-opacity:0;" offset="0" id="stop16852-5"/>
+ <stop id="stop16854-1" offset="0.38177863" style="stop-color:#e9e9e9;stop-opacity:1;"/>
+ <stop style="stop-color:#e9e9e9;stop-opacity:0;" offset="1" id="stop16856-7"/>
+ </linearGradient>
+ <linearGradient id="linearGradient20756-2-8">
+ <stop style="stop-color:#00327d;stop-opacity:1;" offset="0" id="stop20758-7-8"/>
+ <stop style="stop-color:#65a1fb;stop-opacity:1;" offset="1" id="stop20760-7-2"/>
+ </linearGradient>
+ <linearGradient id="linearGradient43009-7">
+ <stop style="stop-color:#e9e9e9;stop-opacity:1;" offset="0" id="stop43011-4"/>
+ <stop id="stop16834-0" offset="0.30847755" style="stop-color:#e9e9e9;stop-opacity:0.49803922;"/>
+ <stop style="stop-color:#e9e9e9;stop-opacity:0;" offset="1" id="stop43013-9"/>
+ </linearGradient>
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="linearGradient13046" gradientUnits="userSpaceOnUse" gradientTransform="translate(360,-161.99999)" x1="-80" y1="151" x2="-80" y2="152.24998"/>
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="linearGradient13056" gradientUnits="userSpaceOnUse" gradientTransform="translate(360,-145.93749)" x1="-80" y1="151" x2="-80" y2="152.24998"/>
+ <linearGradient id="linearGradient18344">
+ <stop style="stop-color:#6c6c6c;stop-opacity:1;" offset="0" id="stop18346"/>
+ <stop style="stop-color:#f0f0f0;stop-opacity:1;" offset="1" id="stop18348"/>
+ </linearGradient>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <radialGradient gradientUnits="userSpaceOnUse" fy="114.5684" fx="20.892099" r="5.256" cy="114.5684" cx="20.892099" id="aigrd2-3-0">
+ <stop id="stop15566-9-5" style="stop-color:#F0F0F0" offset="0"/>
+ <stop id="stop15568-7-7" style="stop-color:#9a9a9a;stop-opacity:1.0000000;" offset="1.0000000"/>
</radialGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43009-7"
- id="linearGradient16932-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.7118707,-0.00216237,-0.00556412,-1.3288889,207.1884,56.557374)"
- x1="5.6458621"
- y1="11.418204"
- x2="7.3551626"
- y2="13.092201" />
- <linearGradient
- id="linearGradient43009-7">
- <stop
- style="stop-color:#e9e9e9;stop-opacity:1;"
- offset="0"
- id="stop43011-4" />
- <stop
- id="stop16834-0"
- offset="0.30847755"
- style="stop-color:#e9e9e9;stop-opacity:0.49803922;" />
- <stop
- style="stop-color:#e9e9e9;stop-opacity:0;"
- offset="1"
- id="stop43013-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20756-2-8"
- id="linearGradient16935-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.0850614,-0.0361511,0.02414524,-1.0240584,201.95206,45.554604)"
- x1="4.155818"
- y1="5.3683834"
- x2="6.5799594"
- y2="7.7035389" />
- <linearGradient
- id="linearGradient20756-2-8">
- <stop
- style="stop-color:#00327d;stop-opacity:1;"
- offset="0"
- id="stop20758-7-8" />
- <stop
- style="stop-color:#65a1fb;stop-opacity:1;"
- offset="1"
- id="stop20760-7-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16850-5"
- id="linearGradient16939-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.0895881,0,0,-1.1205216,210.97915,45.429444)"
- x1="5.1938357"
- y1="8.7375145"
- x2="7.5092869"
- y2="11.3536" />
- <linearGradient
- id="linearGradient16850-5">
- <stop
- style="stop-color:#e9e9e9;stop-opacity:0;"
- offset="0"
- id="stop16852-5" />
- <stop
- id="stop16854-1"
- offset="0.38177863"
- style="stop-color:#e9e9e9;stop-opacity:1;" />
- <stop
- style="stop-color:#e9e9e9;stop-opacity:0;"
- offset="1"
- id="stop16856-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#radialGradient16824-1"
- id="linearGradient16942-1"
- gradientUnits="userSpaceOnUse"
- x1="4.9106402"
- y1="8.3244486"
- x2="8.5571098"
- y2="12.702949"
- gradientTransform="matrix(-1.1749798,0,0,-1.2083376,211.53456,46.373264)" />
- <radialGradient
- id="radialGradient16824-1"
- cx="20.892099"
- cy="64.567902"
- r="5.257"
- fx="20.892099"
- fy="64.567902"
- gradientUnits="userSpaceOnUse">
- <stop
- offset="0"
- style="stop-color:#b7b7b7;stop-opacity:1;"
- id="stop16826-5" />
- <stop
- id="stop16828-2"
- style="stop-color:#646464;stop-opacity:1;"
- offset="0.50338405" />
- <stop
- offset="1"
- style="stop-color:#b7b7b7;stop-opacity:1;"
- id="stop16830-7" />
+ <radialGradient gradientUnits="userSpaceOnUse" fy="114.5684" fx="20.892099" r="5.256" cy="114.5684" cx="20.892099" id="radialGradient13905">
+ <stop id="stop13901" style="stop-color:#F0F0F0" offset="0"/>
+ <stop id="stop13903" style="stop-color:#9a9a9a;stop-opacity:1.0000000;" offset="1.0000000"/>
</radialGradient>
- <linearGradient
- id="linearGradient18748-9"
- inkscape:collect="always">
- <stop
- id="stop18750-7"
- offset="0"
- style="stop-color:#5894d4;stop-opacity:1" />
- <stop
- id="stop18752-0"
- offset="1"
- style="stop-color:#afd1f5;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient4980">
- <stop
- style="stop-color:#5894d4;stop-opacity:1"
- offset="0"
- id="stop4982" />
- <stop
- style="stop-color:#afd1f5;stop-opacity:1"
- offset="1"
- id="stop4984" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient8225-5-1-0-9-5">
- <stop
- style="stop-color:#84d458;stop-opacity:1"
- offset="0"
- id="stop8227-8-1-1-0-9" />
- <stop
- style="stop-color:#c8f5af;stop-opacity:1"
- offset="1"
- id="stop8229-7-3-1-4-4" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient6369-5">
- <stop
- style="stop-color:#0d1e00;stop-opacity:1"
- offset="0"
- id="stop6371-3" />
- <stop
- style="stop-color:#001128;stop-opacity:1"
- offset="1"
- id="stop6373-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient16719">
- <stop
- id="stop16721"
- offset="0"
- style="stop-color:#84d458;stop-opacity:1" />
- <stop
- style="stop-color:#5894d4;stop-opacity:1"
- offset="0.30000001"
- id="stop5079" />
- <stop
- id="stop16723"
- offset="1"
- style="stop-color:#afd1f5;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient6369-3-9">
- <stop
- style="stop-color:#0e1e00;stop-opacity:1"
- offset="0"
- id="stop6371-2-4" />
- <stop
- style="stop-color:#001d1e;stop-opacity:1"
- offset="1"
- id="stop6373-0-4" />
- </linearGradient>
- <linearGradient
- id="linearGradient7701-5"
- inkscape:collect="always">
- <stop
- id="stop7703-5"
- offset="0"
- style="stop-color:#84d458;stop-opacity:1" />
- <stop
- style="stop-color:#3dc0c7;stop-opacity:1"
- offset="0.40000027"
- id="stop5081" />
- <stop
- id="stop7705-2"
- offset="1"
- style="stop-color:#aff1f5;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient5153"
- inkscape:collect="always">
- <stop
- id="stop5155"
- offset="0"
- style="stop-color:#84d458;stop-opacity:1" />
- <stop
- id="stop5157"
- offset="1"
- style="stop-color:#c8f5af;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient6522-6">
- <stop
- style="stop-color:#0e1e00;stop-opacity:1"
- offset="0"
- id="stop6524-8" />
- <stop
- style="stop-color:#1b1f09;stop-opacity:1"
- offset="1"
- id="stop6526-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16332-1">
- <stop
- style="stop-color:#84d458;stop-opacity:1"
- offset="0"
- id="stop16334-5" />
- <stop
- id="stop5161"
- offset="0.37500033"
- style="stop-color:#b5d034;stop-opacity:1" />
- <stop
- style="stop-color:#e9f5af;stop-opacity:1"
- offset="1"
- id="stop16336-4" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient6541-9">
- <stop
- style="stop-color:#132701;stop-opacity:1"
- offset="0"
- id="stop6543-9" />
- <stop
- style="stop-color:#282100;stop-opacity:1"
- offset="1"
- id="stop6545-6" />
- </linearGradient>
- <linearGradient
- id="linearGradient15955-8"
- inkscape:collect="always">
- <stop
- id="stop15957-7"
- offset="0"
- style="stop-color:#90d868;stop-opacity:1" />
- <stop
- style="stop-color:#dacf2a;stop-opacity:1"
- offset="0.37500033"
- id="stop5163" />
- <stop
- id="stop15959-4"
- offset="1"
- style="stop-color:#f5f1af;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient6582-2">
- <stop
- style="stop-color:#282100;stop-opacity:1"
- offset="0"
- id="stop6584-4" />
- <stop
- style="stop-color:#201308;stop-opacity:1"
- offset="1"
- id="stop6586-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16021-1">
- <stop
- style="stop-color:#dacf2a;stop-opacity:1"
- offset="0"
- id="stop16023-4" />
- <stop
- id="stop5391"
- offset="0.37792677"
- style="stop-color:#ff9a2d;stop-opacity:1" />
- <stop
- style="stop-color:#f3c59d;stop-opacity:1"
- offset="1"
- id="stop16025-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient6590-1">
- <stop
- style="stop-color:#290b11;stop-opacity:1"
- offset="0"
- id="stop6592-1" />
- <stop
- style="stop-color:#271301;stop-opacity:1"
- offset="1"
- id="stop6594-7" />
- </linearGradient>
- <linearGradient
- id="linearGradient16066-6"
- inkscape:collect="always">
- <stop
- id="stop16068-8"
- offset="0"
- style="stop-color:#f13b60;stop-opacity:1" />
- <stop
- style="stop-color:#ff9a2d;stop-opacity:1"
- offset="0.49796259"
- id="stop4718" />
- <stop
- id="stop16070-9"
- offset="1"
- style="stop-color:#f3c59d;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient6668-2">
- <stop
- style="stop-color:#001128;stop-opacity:1"
- offset="0"
- id="stop6670-8" />
- <stop
- style="stop-color:#200820;stop-opacity:1"
- offset="1"
- id="stop6672-3" />
- </linearGradient>
- <linearGradient
- id="linearGradient12160"
- inkscape:collect="always">
- <stop
- id="stop12162"
- offset="0"
- style="stop-color:#5894d4;stop-opacity:1" />
- <stop
- style="stop-color:#ef79ef;stop-opacity:1"
- offset="0.72727275"
- id="stop12164" />
- <stop
- id="stop12166"
- offset="1"
- style="stop-color:#f7bcf7;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient5660"
- inkscape:collect="always">
- <stop
- id="stop5662"
- offset="0"
- style="stop-color:#001128;stop-opacity:1" />
- <stop
- id="stop5664"
- offset="1"
- style="stop-color:#200820;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient11820">
- <stop
- style="stop-color:#afd1f5;stop-opacity:1"
- offset="0"
- id="stop11822" />
- <stop
- id="stop11824"
- offset="0.44444144"
- style="stop-color:#5894d4;stop-opacity:1" />
- <stop
- style="stop-color:#5894d4;stop-opacity:1"
- offset="0.55555254"
- id="stop11826" />
- <stop
- style="stop-color:#ef79ef;stop-opacity:1"
- offset="1"
- id="stop11828" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient6668-0-4">
- <stop
- style="stop-color:#001128;stop-opacity:1"
- offset="0"
- id="stop6670-5-2" />
- <stop
- style="stop-color:#200820;stop-opacity:1"
- offset="1"
- id="stop6672-0-2" />
- </linearGradient>
- <linearGradient
- id="linearGradient10750"
- inkscape:collect="always">
- <stop
- id="stop10752"
- offset="0"
- style="stop-color:#afd1f5;stop-opacity:1" />
- <stop
- style="stop-color:#5894d4;stop-opacity:1"
- offset="0.43061388"
- id="stop10754" />
- <stop
- style="stop-color:#5894d4;stop-opacity:1"
- offset="0.77194387"
- id="stop10756" />
- <stop
- id="stop10758"
- offset="1"
- style="stop-color:#ef79ef;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient17527-8-91-7">
- <stop
- style="stop-color:#0a0a0a;stop-opacity:1"
- offset="0"
- id="stop17529-0-2-6" />
- <stop
- style="stop-color:#001128;stop-opacity:1"
- offset="1"
- id="stop17531-0-6-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient28135-1-17"
- inkscape:collect="always">
- <stop
- id="stop28137-7-06"
- offset="0"
- style="stop-color:#afd1f5;stop-opacity:1" />
- <stop
- style="stop-color:#5894d4;stop-opacity:1"
- offset="0.42811331"
- id="stop5393" />
- <stop
- id="stop28139-7-9"
- offset="1"
- style="stop-color:#505050;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient17533-0-8-9">
- <stop
- style="stop-color:#0a0a0a;stop-opacity:1"
- offset="0"
- id="stop17535-3-7-0" />
- <stop
- style="stop-color:#001128;stop-opacity:1"
- offset="1"
- id="stop17537-75-3-8" />
- </linearGradient>
- <linearGradient
- id="linearGradient28135-1-1"
- inkscape:collect="always">
- <stop
- id="stop28137-7-0"
- offset="0"
- style="stop-color:#afd1f5;stop-opacity:1" />
- <stop
- style="stop-color:#5894d4;stop-opacity:1"
- offset="0.42811331"
- id="stop5393-00" />
- <stop
- id="stop28139-7-43"
- offset="1"
- style="stop-color:#505050;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient17539-85-9-6">
- <stop
- style="stop-color:#000f3c;stop-opacity:1"
- offset="0"
- id="stop17541-1-5-6" />
- <stop
- id="stop17543-9-2-7"
- offset="0.41666666"
- style="stop-color:#0a0a0a;stop-opacity:1" />
- <stop
- id="stop17545-9-7-9"
- offset="0.58333331"
- style="stop-color:#0a0a0a;stop-opacity:1" />
- <stop
- style="stop-color:#001128;stop-opacity:1"
- offset="1"
- id="stop17547-04-5-5" />
- </linearGradient>
- <linearGradient
- id="linearGradient28147-1-4">
- <stop
- id="stop28149-4-1"
- offset="0"
- style="stop-color:#afd1f5;stop-opacity:1" />
- <stop
- style="stop-color:#5894d4;stop-opacity:1"
- offset="0.18750006"
- id="stop5469" />
- <stop
- style="stop-color:#505050;stop-opacity:1"
- offset="0.40000001"
- id="stop28151-7-6" />
- <stop
- id="stop28153-8-4"
- offset="0.60000002"
- style="stop-color:#505050;stop-opacity:1" />
- <stop
- style="stop-color:#5894d4;stop-opacity:1"
- offset="0.81250006"
- id="stop5471" />
- <stop
- id="stop28155-2-6"
- offset="1"
- style="stop-color:#afd1f5;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6668-2"
- id="linearGradient17013"
- gradientUnits="userSpaceOnUse"
- x1="156.7054"
- y1="957.10889"
- x2="162.14577"
- y2="957.10889" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient12160"
- id="linearGradient17015"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-21)"
- x1="155"
- y1="976.36127"
- x2="166"
- y2="976.36127" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4980"
- id="linearGradient17017"
- gradientUnits="userSpaceOnUse"
- x1="55"
- y1="959.36218"
- x2="55"
- y2="951.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18748-9"
- id="linearGradient17019"
- gradientUnits="userSpaceOnUse"
- x1="35"
- y1="959.36218"
- x2="35"
- y2="951.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6369-5"
- id="linearGradient17021"
- gradientUnits="userSpaceOnUse"
- x1="53"
- y1="961.36218"
- x2="59"
- y2="955.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16719"
- id="linearGradient17023"
- gradientUnits="userSpaceOnUse"
- x1="51"
- y1="960.36218"
- x2="60"
- y2="951.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6369-3-9"
- id="linearGradient17025"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,21)"
- x1="51"
- y1="939.36218"
- x2="61"
- y2="929.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient7701-5"
- id="linearGradient17027"
- gradientUnits="userSpaceOnUse"
- x1="51"
- y1="960.36218"
- x2="60"
- y2="951.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5153"
- id="linearGradient17029"
- gradientUnits="userSpaceOnUse"
- x1="51"
- y1="960.36218"
- x2="61"
- y2="951.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6541-9"
- id="linearGradient17031"
- gradientUnits="userSpaceOnUse"
- x1="54.8125"
- y1="961.73718"
- x2="61"
- y2="956.23718" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15955-8"
- id="linearGradient17033"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-21)"
- x1="53"
- y1="981.36218"
- x2="61"
- y2="972.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6582-2"
- id="linearGradient17035"
- gradientUnits="userSpaceOnUse"
- x1="54"
- y1="961.98718"
- x2="60.9375"
- y2="955.67468" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16021-1"
- id="linearGradient17038"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-21)"
- x1="53"
- y1="981.36218"
- x2="61"
- y2="971.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6590-1"
- id="linearGradient17040"
- gradientUnits="userSpaceOnUse"
- x1="53.6875"
- y1="961.48718"
- x2="60.5625"
- y2="956.04968" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16066-6"
- id="linearGradient17042"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-21)"
- x1="54"
- y1="981.36218"
- x2="61"
- y2="971.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5660"
- id="linearGradient17044"
- gradientUnits="userSpaceOnUse"
- x1="162.875"
- y1="955.48627"
- x2="162.875"
- y2="959.74042" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient11820"
- id="linearGradient17046"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-21)"
- x1="165"
- y1="971.36127"
- x2="165"
- y2="980.36127" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6668-0-4"
- id="linearGradient17048"
- gradientUnits="userSpaceOnUse"
- x1="164.43785"
- y1="955.23627"
- x2="158.9816"
- y2="955.23627" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10750"
- id="linearGradient17050"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-21)"
- x1="166.07713"
- y1="970.98602"
- x2="160.87317"
- y2="980.77435" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6522-6"
- id="linearGradient17052"
- gradientUnits="userSpaceOnUse"
- x1="54.268661"
- y1="962.13489"
- x2="61.251339"
- y2="955.94769" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16332-1"
- id="linearGradient17054"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-21)"
- x1="52"
- y1="981.36218"
- x2="61"
- y2="972.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17527-8-91-7"
- id="linearGradient17056"
- gradientUnits="userSpaceOnUse"
- x1="58.125019"
- y1="951.23718"
- x2="52.566891"
- y2="951.23718" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient28135-1-17"
- id="linearGradient17058"
- gradientUnits="userSpaceOnUse"
- x1="51"
- y1="960.36218"
- x2="57"
- y2="955.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17533-0-8-9"
- id="linearGradient17060"
- gradientUnits="userSpaceOnUse"
- x1="58.125019"
- y1="951.23718"
- x2="52.566891"
- y2="951.23718" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient28135-1-1"
- id="linearGradient17062"
- gradientUnits="userSpaceOnUse"
- x1="51"
- y1="960.36218"
- x2="57"
- y2="955.36218" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17539-85-9-6"
- id="linearGradient17064"
- gradientUnits="userSpaceOnUse"
- x1="49"
- y1="955.3623"
- x2="61"
- y2="955.3623" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient28147-1-4"
- id="linearGradient17066"
- gradientUnits="userSpaceOnUse"
- x1="50"
- y1="955.3623"
- x2="60"
- y2="955.3623" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8225-5-1-0-9-5"
- id="linearGradient17068"
- gradientUnits="userSpaceOnUse"
- x1="72"
- y1="960.36072"
- x2="80"
- y2="950.36072" />
- <linearGradient
- id="linearGradient319-65-4-8-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-14-9-5-9" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-49-3-6-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-65-4-8-7"
- id="linearGradient17904-1-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-105.84265,-101.96449)"
- x1="386.88852"
- y1="409.84152"
- x2="389.14081"
- y2="412.45016" />
- <linearGradient
- id="linearGradient16340">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16342" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16344" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-65-4-8-7"
- id="linearGradient17893-5-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-97.05081,-101.92897)"
- x1="387"
- y1="409.86362"
- x2="388.86676"
- y2="411.88974" />
- <linearGradient
- id="linearGradient16347">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16349" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16351" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-53"
- id="linearGradient44954-5"
- gradientUnits="userSpaceOnUse"
- x1="279.75"
- y1="101.5"
- x2="283"
- y2="105.5"
- gradientTransform="matrix(0,1,1,0,225,-182.99437)" />
- <linearGradient
- id="linearGradient44939-8-53">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop44941-8-7" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop44943-2-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-53"
- id="linearGradient16705"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,-1,0,430.6795,387.09358)"
- x1="280.20203"
- y1="101.27402"
- x2="283.77844"
- y2="97.589958" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient44939-8-53-7"
- id="linearGradient16705-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,-1,0,430.6795,387.09358)"
- x1="280.20203"
- y1="101.27402"
- x2="283.77844"
- y2="97.589958" />
- <linearGradient
- id="linearGradient44939-8-53-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop44941-8-7-6" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop44943-2-5-2" />
- </linearGradient>
- <linearGradient
- y2="97.589958"
- x2="283.77844"
- y1="101.27402"
- x1="280.20203"
- gradientTransform="matrix(0,-1,-1,0,430.6795,387.09358)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient16728"
- xlink:href="#linearGradient44939-8-53-7"
- inkscape:collect="always" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-0"
- id="linearGradient36725-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="117.12428"
- y2="61.720783" />
- <linearGradient
- id="linearGradient319-0">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-22" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-19" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-0"
- id="linearGradient36727-5"
- gradientUnits="userSpaceOnUse"
- x1="-56.5"
- y1="340.32199"
- x2="-56.5"
- y2="348" />
- <linearGradient
- id="linearGradient16404-5">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16406" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16408" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-0"
- id="linearGradient36729-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.7972867,61.99991,2.2419)"
- x1="260.67468"
- y1="108.02418"
- x2="273.9993"
- y2="126.37626" />
- <linearGradient
- id="linearGradient16411">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop16413" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop16415" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17265"
- id="radialGradient17275"
- cx="1130.7738"
- cy="440.25275"
- fx="1130.7738"
- fy="440.25275"
- r="3.5"
- gradientTransform="matrix(1.4878857,2.6976762,-1.4698319,0.81067624,95.409128,-2969.0604)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-5-7-1"
- id="linearGradient27886-9-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,1,0,146.99795,-188.00607)"
- x1="392.0101"
- y1="222.99998"
- x2="392.0101"
- y2="247.99998" />
- <linearGradient
- id="linearGradient37542-5-7-1">
- <stop
- id="stop37544-1-4-3"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-71-0-8"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27896-8-4"
- id="linearGradient27902-4-7"
- x1="388.70071"
- y1="244.85669"
- x2="391.17557"
- y2="249.54126"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient27896-8-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop27898-8-2" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop27900-2-7" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-5-7-3-9"
- id="linearGradient16731"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,1,0,146.99795,-188.00607)"
- x1="392.0101"
- y1="222.99998"
- x2="392.0101"
- y2="247.99998" />
- <linearGradient
- id="linearGradient37542-5-7-3-9">
- <stop
- id="stop37544-1-4-8-3"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-71-0-2-1"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27896-8-2-8"
- id="linearGradient27902-4-6-9"
- x1="388.70071"
- y1="244.85669"
- x2="391.17557"
- y2="249.54126"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient27896-8-2-8">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop27898-8-7-6" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop27900-2-5-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-5-7-7-4"
- id="linearGradient17449-1-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-271.98012,212.40154)"
- x1="392.0101"
- y1="222.99998"
- x2="392.0101"
- y2="247.99998" />
- <linearGradient
- id="linearGradient37542-5-7-7-4">
- <stop
- id="stop37544-1-4-40-3"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-71-0-9-1"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-5-7-5-8-3"
- id="linearGradient17451-4-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-271.98739,215.4952)"
- x1="392.0101"
- y1="222.99998"
- x2="392.0101"
- y2="247.99998" />
- <linearGradient
- id="linearGradient37542-5-7-5-8-3">
- <stop
- id="stop37544-1-4-4-8-3"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-71-0-3-2-4"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-5-7-7-4"
- id="linearGradient16559"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-271.98012,212.40154)"
- x1="392.0101"
- y1="222.99998"
- x2="392.0101"
- y2="247.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-5-7-5-8-3"
- id="linearGradient16562"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-271.98739,215.4952)"
- x1="392.0101"
- y1="222.99998"
- x2="392.0101"
- y2="247.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-29"
- id="linearGradient15742-2"
- gradientUnits="userSpaceOnUse"
- x1="392.0101"
- y1="224.99998"
- x2="392.0101"
- y2="249.99998" />
- <linearGradient
- id="linearGradient37542-29">
- <stop
- id="stop37544-67"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-45"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27854-0"
- id="linearGradient27860-8"
- x1="392.02036"
- y1="241.13428"
- x2="386.30408"
- y2="241.31801"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient27854-0">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop27856-5" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop27858-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-5-3"
- id="linearGradient27886-8"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,1,0,146.99795,-188.00607)"
- x1="392.0101"
- y1="222.99998"
- x2="392.0101"
- y2="247.99998" />
- <linearGradient
- id="linearGradient37542-5-3">
- <stop
- id="stop37544-1-6"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-71-6"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27896-9"
- id="linearGradient27902-9"
- x1="388.70071"
- y1="244.85669"
- x2="391.17557"
- y2="249.54126"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient27896-9">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop27898-2" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop27900-5" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-92"
- id="linearGradient27872-8"
- gradientUnits="userSpaceOnUse"
- x1="392.0101"
- y1="224.99998"
- x2="392.0101"
- y2="249.99998"
- gradientTransform="matrix(-1,0,0,1,782.02022,0)" />
- <linearGradient
- id="linearGradient37542-92">
- <stop
- id="stop37544-71"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-57"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27854-7"
- id="linearGradient27874-3"
- gradientUnits="userSpaceOnUse"
- x1="390.87131"
- y1="241.13428"
- x2="386.74603"
- y2="242.46706"
- gradientTransform="matrix(-1,0,0,1,782.02022,0)" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient27854-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop27856-6" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop27858-1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-5-3"
- id="linearGradient15742-5-4"
- gradientUnits="userSpaceOnUse"
- x1="392.0101"
- y1="222.99998"
- x2="392.0101"
- y2="247.99998"
- gradientTransform="matrix(0,1,-1,0,634.98585,-146.00607)" />
- <linearGradient
- id="linearGradient16550">
- <stop
- id="stop16552"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop16554"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-51"
- id="linearGradient15691-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.222225,0,0,1,-87.33412,169)"
- x1="215.07817"
- y1="109.00085"
- x2="235.90916"
- y2="121.88217" />
- <linearGradient
- id="linearGradient37542-51">
- <stop
- id="stop37544-63"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-08"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-36"
- id="linearGradient15693-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1.253963,1,0,169,-94.7765)"
- x1="228.5468"
- y1="118.5"
- x2="235"
- y2="118.5" />
- <linearGradient
- id="linearGradient319-36">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-18" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-390" />
- </linearGradient>
- <linearGradient
- y2="118.5"
- x2="235"
- y1="118.5"
- x1="228.5468"
- gradientTransform="matrix(0,1.253963,1,0,169,-94.7765)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient16667"
- xlink:href="#linearGradient319-36"
- inkscape:collect="always" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-51"
- id="linearGradient16712"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.222225,0,0,1,-87.33412,169)"
- x1="215.07817"
- y1="109.00085"
- x2="235.90916"
- y2="121.88217" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-36"
- id="linearGradient16714"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1.253963,1,0,169,-94.7765)"
- x1="228.5468"
- y1="118.5"
- x2="235"
- y2="118.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-51-7"
- id="linearGradient16712-3"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.222225,0,0,1,-87.33412,169)"
- x1="215.07817"
- y1="109.00085"
- x2="235.90916"
- y2="121.88217" />
- <linearGradient
- id="linearGradient37542-51-7">
- <stop
- id="stop37544-63-0"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-08-1"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-36-1"
- id="linearGradient16714-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1.253963,1,0,169,-94.7765)"
- x1="228.5468"
- y1="118.5"
- x2="235"
- y2="118.5" />
- <linearGradient
- id="linearGradient319-36-1">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-18-2" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-390-9" />
- </linearGradient>
- <linearGradient
- y2="119.8485"
- x2="228.5468"
- y1="118.94354"
- x1="228.5468"
- gradientTransform="matrix(0,-1.253963,1,0,169,484.55432)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient16763"
- xlink:href="#linearGradient319-36-1"
- inkscape:collect="always" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-29"
- id="linearGradient17562"
- gradientUnits="userSpaceOnUse"
- x1="392.0101"
- y1="224.99998"
- x2="392.0101"
- y2="249.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27854-0"
- id="linearGradient17564"
- gradientUnits="userSpaceOnUse"
- x1="392.02036"
- y1="241.13428"
- x2="386.30408"
- y2="241.31801" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27854-0"
- id="linearGradient17567"
- gradientUnits="userSpaceOnUse"
- x1="392.02036"
- y1="241.13428"
- x2="386.30408"
- y2="241.31801"
- gradientTransform="matrix(-1,0,0,1,461.01011,-167)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-29"
- id="linearGradient17570"
- gradientUnits="userSpaceOnUse"
- x1="392.0101"
- y1="224.99998"
- x2="392.0101"
- y2="249.99998"
- gradientTransform="matrix(-1,0,0,1,461.01011,-167)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-51"
- id="linearGradient17572"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.222225,0,0,1,-87.33412,169)"
- x1="215.07817"
- y1="109.00085"
- x2="235.90916"
- y2="121.88217" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-36"
- id="linearGradient17574"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1.253963,1,0,169,-94.7765)"
- x1="228.5468"
- y1="118.5"
- x2="235"
- y2="118.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-36"
- id="linearGradient17577"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1.1418188,0.91056814,0,-34.152024,-186.34771)"
- x1="228.5468"
- y1="118.5"
- x2="235"
- y2="118.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-51"
- id="linearGradient17580"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1129191,0,0,0.91056814,-179.57092,-34.152024)"
- x1="215.07817"
- y1="109.00085"
- x2="235.90916"
- y2="121.88217" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-29"
- id="linearGradient17610"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,865.01833,131.0342)"
- x1="392.0101"
- y1="224.99998"
- x2="392.0101"
- y2="249.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-36"
- id="linearGradient17612"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1.1418188,0.91056814,0,-34.152024,-186.34771)"
- x1="228.5468"
- y1="118.5"
- x2="235"
- y2="118.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27854-0"
- id="linearGradient17614"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,461.01011,-167)"
- x1="392.02036"
- y1="241.13428"
- x2="386.30408"
- y2="241.31801" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-29-1"
- id="linearGradient17610-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,461.01011,-167)"
- x1="409.93588"
- y1="249.99998"
- x2="385.11514"
- y2="249.99998" />
- <linearGradient
- id="linearGradient37542-29-1">
- <stop
- id="stop37544-67-8"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-45-9"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-36-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-18-4" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-390-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-29-7"
- id="linearGradient17610-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(128.00098,130.98191)"
- x1="392.0101"
- y1="224.99998"
- x2="392.0101"
- y2="249.99998" />
- <linearGradient
- id="linearGradient37542-29-7">
- <stop
- id="stop37544-67-3"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-45-0"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-36-40"
- id="linearGradient17612-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1.1418188,-0.91056814,0,182.56319,-186.34771)"
- x1="228.5468"
- y1="118.5"
- x2="235"
- y2="118.5" />
- <linearGradient
- id="linearGradient319-36-40">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-18-7" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-390-4" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27854-0-6"
- id="linearGradient17614-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,461.01011,-167)"
- x1="391.49002"
- y1="240.9575"
- x2="395.27548"
- y2="242.57755" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient27854-0-6">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop27856-5-3" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop27858-3-6" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-29-7-8"
- id="linearGradient17610-0-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,461.01011,-167)"
- x1="368.97806"
- y1="249.99998"
- x2="393.85385"
- y2="249.99998" />
- <linearGradient
- id="linearGradient37542-29-7-8">
- <stop
- id="stop37544-67-3-0"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-45-0-9"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-36-40-3">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-18-7-2" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-390-4-0" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27854-0-6-9"
- id="linearGradient17614-0-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,461.01011,-167)"
- x1="388.86502"
- y1="244.02"
- x2="391.43173"
- y2="239.2338" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient27854-0-6-9">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop27856-5-3-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop27858-3-6-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-36-40-2"
- id="linearGradient17612-5-3"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1.1418188,-0.91056814,0,182.56319,-186.34771)"
- x1="228.5468"
- y1="118.5"
- x2="235"
- y2="118.5" />
- <linearGradient
- id="linearGradient319-36-40-2">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-18-7-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-390-4-6" />
- </linearGradient>
- <linearGradient
- y2="119.99294"
- x2="228.5468"
- y1="118.91647"
- x1="228.5468"
- gradientTransform="matrix(1.180548,0,0,0.90042534,265.83288,265.61628)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient17838"
- xlink:href="#linearGradient319-36-40-2"
- inkscape:collect="always" />
- <linearGradient
- y2="119.99294"
- x2="228.5468"
- y1="118.91647"
- x1="228.5468"
- gradientTransform="matrix(1.180548,0,0,0.90042534,265.27784,265.13062)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient17838-1"
- xlink:href="#linearGradient319-36-40-2-4"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient319-36-40-2-4">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-18-7-8-5" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-390-4-6-6" />
- </linearGradient>
- <linearGradient
- y2="119.99294"
- x2="228.5468"
- y1="118.91647"
- x1="228.5468"
- gradientTransform="matrix(1.180548,0,0,0.90042534,223.81726,270.99473)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient17872"
- xlink:href="#linearGradient319-36-40-2-4"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient23974-41">
- <stop
- id="stop23976-66"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop23978-15"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient319-68">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-221" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-90" />
- </linearGradient>
- <linearGradient
- id="linearGradient1610-84">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop1611-86" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop1612-6" />
- </linearGradient>
- <linearGradient
- id="linearGradient9030-4">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop9032-3" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop9034-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16500-8">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop16502-0" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop16504-648" />
- </linearGradient>
- <linearGradient
- id="linearGradient16605">
- <stop
- id="stop16607"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop16609"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient18105-1">
- <stop
- id="stop18107-7"
- offset="0"
- style="stop-color:#162d50;stop-opacity:1" />
- <stop
- id="stop18109-8"
- offset="1"
- style="stop-color:#1e3e70;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17542"
- id="linearGradient18237"
- gradientUnits="userSpaceOnUse"
- x1="231.35262"
- y1="465.73871"
- x2="246.08743"
- y2="465.14655"
- gradientTransform="matrix(0.86988738,-0.49325039,0.49325039,0.86988738,0,0.02266763)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17566"
- id="linearGradient18239"
- gradientUnits="userSpaceOnUse"
- x1="430.78629"
- y1="290.24094"
- x2="440.83713"
- y2="286.97058" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974-41"
- id="linearGradient18243"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.728189,0,0,1.727271,-142.53857,-4.802156)"
- x1="107.39532"
- y1="58.065113"
- x2="127.70434"
- y2="58.065113" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-68"
- id="linearGradient18245"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.1000194,0,0,1.0998287,110.29549,-8.6726854)"
- x1="30.389694"
- y1="95.008034"
- x2="65.52562"
- y2="93.69249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-84"
- id="linearGradient18247"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-6,0)"
- x1="483.00034"
- y1="163"
- x2="476.68781"
- y2="162.85956" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030-4"
- id="linearGradient18249"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(342.00029,383.00889)"
- x1="123.36729"
- y1="-219.24783"
- x2="134.30893"
- y2="-218.00888" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16500-8"
- id="linearGradient18251"
- gradientUnits="userSpaceOnUse"
- x1="475.00034"
- y1="155"
- x2="469.75034"
- y2="155" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974-41"
- id="linearGradient18253"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(14.285126,-0.22103087)"
- x1="442.81525"
- y1="290.49384"
- x2="436.5"
- y2="290.5249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18105-1"
- id="linearGradient18255"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20.285126,-0.22097087)"
- x1="445.99902"
- y1="288.5"
- x2="407.3793"
- y2="288.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17560-4"
- id="linearGradient18241-0"
- gradientUnits="userSpaceOnUse"
- x1="327.77432"
- y1="251.04707"
- x2="335.80118"
- y2="247.0696" />
- <linearGradient
- id="linearGradient17560-4">
- <stop
- id="stop17562-3"
- offset="0"
- style="stop-color:#ffe991;stop-opacity:1;" />
- <stop
- id="stop17564-1"
- offset="1"
- style="stop-color:#ffe991;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18370"
- id="linearGradient18368"
- x1="432.83759"
- y1="289.15814"
- x2="441.44028"
- y2="283.54819"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- y2="245.78732"
- x2="335.8941"
- y1="251.04707"
- x1="327.77432"
- gradientUnits="userSpaceOnUse"
- id="linearGradient18313-9"
- xlink:href="#linearGradient17560-4-9"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient17560-4-9">
- <stop
- id="stop17562-3-7"
- offset="0"
- style="stop-color:#ffe991;stop-opacity:1;" />
- <stop
- id="stop17564-1-4"
- offset="1"
- style="stop-color:#ffe991;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18414"
- id="linearGradient18420"
- x1="333.8428"
- y1="253.4225"
- x2="327.0369"
- y2="243.12526"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18414-5"
- id="linearGradient18420-1"
- x1="333.8428"
- y1="253.4225"
- x2="327.0369"
- y2="243.12526"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient18414-5">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop18416-8" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop18418-4" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18479"
- id="linearGradient18476"
- x1="427.86765"
- y1="284.7648"
- x2="431.31277"
- y2="278.92789"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.46468729,2.0195829)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18495"
- id="linearGradient18493"
- x1="323.68958"
- y1="248.71513"
- x2="335.125"
- y2="245.5"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20020"
- id="linearGradient20026"
- x1="331.22147"
- y1="249.03816"
- x2="336.11465"
- y2="244.64084"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20043"
- id="linearGradient20049"
- x1="148.21956"
- y1="506.48343"
- x2="155.67555"
- y2="506.45177"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- y2="30.023426"
- x2="278.25537"
- y1="3.6831069"
- x1="253.78497"
- gradientTransform="matrix(0.888889,0,0,1,513.5,184.50451)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient39254-5"
- xlink:href="#linearGradient17555"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient17555">
- <stop
- style="stop-color:#000000;stop-opacity:0.49803922;"
- offset="0"
- id="stop17557" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0.49803922;"
- offset="1"
- id="stop17559" />
- </linearGradient>
- <radialGradient
- r="6.9000001"
- fy="206.40076"
- fx="756.83508"
- cy="206.40076"
- cx="756.83508"
- gradientTransform="matrix(0.3817213,-0.4377393,0.4780868,0.4169055,368.09749,451.76937)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient39256-9"
- xlink:href="#linearGradient17549"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient17549">
- <stop
- id="stop17551"
- offset="0"
- style="stop-color:#7f7f7f;stop-opacity:1;" />
- <stop
- id="stop17553"
- offset="1"
- style="stop-color:#7f7f7f;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- y2="249"
- x2="93.0625"
- y1="241.125"
- x1="87"
- gradientTransform="translate(670,-33)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient39258-0"
- xlink:href="#linearGradient17543"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient17543">
- <stop
- id="stop17545"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:0.87628865;" />
- <stop
- id="stop17547"
- offset="1.0000000"
- style="stop-color:#fffffe;stop-opacity:0.0000000;" />
- </linearGradient>
- <linearGradient
- y2="305"
- x2="758"
- y1="300.83292"
- x1="754.28558"
- gradientTransform="translate(0,-95.999998)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient16784"
- xlink:href="#linearGradient17530"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient17530">
- <stop
- style="stop-color:#7f7f7f;stop-opacity:1;"
- offset="0"
- id="stop17532" />
- <stop
- style="stop-color:#7f7f7f;stop-opacity:0;"
- offset="1"
- id="stop17534" />
- </linearGradient>
- <linearGradient
- y2="305"
- x2="758"
- y1="300.83292"
- x1="754.28558"
- gradientTransform="translate(0,-95.999998)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient16880"
- xlink:href="#linearGradient17530"
- inkscape:collect="always" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18370"
- id="linearGradient16720"
- gradientUnits="userSpaceOnUse"
- x1="432.83759"
- y1="289.15814"
- x2="441.44028"
- y2="283.54819" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-4"
- id="linearGradient16940"
- gradientUnits="userSpaceOnUse"
- x1="258.94861"
- y1="285.63672"
- x2="237.92474"
- y2="261.44183" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-4-3"
- id="linearGradient16943"
- gradientUnits="userSpaceOnUse"
- x1="258.94861"
- y1="285.63672"
- x2="237.92474"
- y2="261.44183" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17073"
- id="linearGradient16945"
- gradientUnits="userSpaceOnUse"
- x1="240.40633"
- y1="261.35129"
- x2="240.41891"
- y2="273.68066" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#radialGradient16824-1"
- id="linearGradient16947"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.1749798,0,0,-1.2083376,211.53456,46.373264)"
- x1="4.9106402"
- y1="8.3244486"
- x2="8.5571098"
- y2="12.702949" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16850-5"
- id="linearGradient16949"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.0895881,0,0,-1.1205216,210.97915,45.429444)"
- x1="5.1938357"
- y1="8.7375145"
- x2="7.5092869"
- y2="11.3536" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20756-2-8"
- id="linearGradient16951"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.0850614,-0.0361511,0.02414524,-1.0240584,201.95206,45.554604)"
- x1="4.155818"
- y1="5.3683834"
- x2="6.5799594"
- y2="7.7035389" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43009-7"
- id="linearGradient16953"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.7118707,-0.00216237,-0.00556412,-1.3288889,207.1884,56.557374)"
- x1="5.6458621"
- y1="11.418204"
- x2="7.3551626"
- y2="13.092201" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17073"
- id="linearGradient17001"
- gradientUnits="userSpaceOnUse"
- x1="240.40633"
- y1="261.35129"
- x2="240.41891"
- y2="273.68066" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#radialGradient16824-1"
- id="linearGradient17003"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.1749798,0,0,-1.2083376,211.53456,46.373264)"
- x1="4.9106402"
- y1="8.3244486"
- x2="8.5571098"
- y2="12.702949" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16850-5"
- id="linearGradient17005"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.0895881,0,0,-1.1205216,210.97915,45.429444)"
- x1="5.1938357"
- y1="8.7375145"
- x2="7.5092869"
- y2="11.3536" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20756-2-8"
- id="linearGradient17007"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.0850614,-0.0361511,0.02414524,-1.0240584,201.95206,45.554604)"
- x1="4.155818"
- y1="5.3683834"
- x2="6.5799594"
- y2="7.7035389" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43009-7"
- id="linearGradient17009"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.7118707,-0.00216237,-0.00556412,-1.3288889,207.1884,56.557374)"
- x1="5.6458621"
- y1="11.418204"
- x2="7.3551626"
- y2="13.092201" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient43009-7"
- id="linearGradient17014"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.7118707,0.00216237,0.00556412,1.3288889,342.98254,460.43356)"
- x1="5.6458621"
- y1="11.418204"
- x2="7.3551626"
- y2="13.092201" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20756-2-8"
- id="linearGradient17018"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0850614,0.0361511,-0.02414524,1.0240584,348.21888,471.43633)"
- x1="4.155818"
- y1="5.3683834"
- x2="6.5799594"
- y2="7.7035389" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16850-5"
- id="linearGradient17022"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0895881,0,0,1.1205216,339.19179,471.56149)"
- x1="5.1938357"
- y1="8.7375145"
- x2="7.5092869"
- y2="11.3536" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#radialGradient16824-1"
- id="linearGradient17026"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1749798,0,0,1.2083376,338.63638,470.61767)"
- x1="4.9106402"
- y1="8.3244486"
- x2="8.5571098"
- y2="12.702949" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17073"
- id="linearGradient17030"
- gradientUnits="userSpaceOnUse"
- x1="240.40633"
- y1="261.35129"
- x2="240.41891"
- y2="273.68066"
- gradientTransform="matrix(-0.9285719,0,0,-0.9072647,533.78355,492.13787)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17073"
- id="linearGradient17055"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.9285719,0,0,-0.9072647,533.78355,492.13787)"
- x1="240.40633"
- y1="261.35129"
- x2="240.41891"
- y2="273.68066" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-4"
- id="linearGradient17057"
- gradientUnits="userSpaceOnUse"
- x1="258.94861"
- y1="285.63672"
- x2="237.92474"
- y2="261.44183" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-4-3"
- id="linearGradient17059"
- gradientUnits="userSpaceOnUse"
- x1="258.94861"
- y1="285.63672"
- x2="237.92474"
- y2="261.44183" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17073"
- id="linearGradient17079"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.9285719,0,0,-0.9072647,533.78355,492.13787)"
- x1="240.40633"
- y1="261.35129"
- x2="240.41891"
- y2="273.68066" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-29-7-8"
- id="linearGradient17149"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,461.01011,-167)"
- x1="368.97806"
- y1="249.99998"
- x2="393.85385"
- y2="249.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27854-0-6-9"
- id="linearGradient17151"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,461.01011,-167)"
- x1="388.86502"
- y1="244.02"
- x2="391.43173"
- y2="239.2338" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-29-7-8"
- id="linearGradient17157"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,461.01011,-167)"
- x1="368.97806"
- y1="249.99998"
- x2="393.85385"
- y2="249.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27854-0-6-9"
- id="linearGradient17159"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,461.01011,-167)"
- x1="388.86502"
- y1="244.02"
- x2="391.43173"
- y2="239.2338" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27854-0-6-9"
- id="linearGradient17162"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,-1,0,783.04118,-13.977664)"
- x1="388.86502"
- y1="244.02"
- x2="391.43173"
- y2="239.2338" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-29-7-8"
- id="linearGradient17165"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,1,-1,0,783.04118,-13.977664)"
- x1="368.97806"
- y1="249.99998"
- x2="393.85385"
- y2="249.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-29-1"
- id="linearGradient17175"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,461.01011,-167)"
- x1="409.93588"
- y1="249.99998"
- x2="385.11514"
- y2="249.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-29-1"
- id="linearGradient17181"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,461.01011,-167)"
- x1="409.93588"
- y1="249.99998"
- x2="385.11514"
- y2="249.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-29-1"
- id="linearGradient17185"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0,-1,-1,0,741.04118,764.98366)"
- x1="409.93588"
- y1="249.99998"
- x2="385.11514"
- y2="249.99998" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18414"
- id="linearGradient17206"
- gradientUnits="userSpaceOnUse"
- x1="333.8428"
- y1="253.4225"
- x2="327.0369"
- y2="243.12526" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18479"
- id="linearGradient17208"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.46468729,2.0195829)"
- x1="427.86765"
- y1="284.7648"
- x2="431.31277"
- y2="278.92789" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18495"
- id="linearGradient17210"
- gradientUnits="userSpaceOnUse"
- x1="323.68958"
- y1="248.71513"
- x2="335.125"
- y2="245.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20020"
- id="linearGradient17212"
- gradientUnits="userSpaceOnUse"
- x1="331.22147"
- y1="249.03816"
- x2="336.11465"
- y2="244.64084" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17555"
- id="linearGradient17215"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,513.5,184.50451)"
- x1="253.78497"
- y1="3.6831069"
- x2="278.25537"
- y2="30.023426" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17549"
- id="radialGradient17217"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.3817213,-0.4377393,0.4780868,0.4169055,368.09749,451.76937)"
- cx="756.83508"
- cy="206.40076"
- fx="756.83508"
- fy="206.40076"
- r="6.9000001" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17543"
- id="linearGradient17219"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(670,-33)"
- x1="87"
- y1="241.125"
- x2="93.0625"
- y2="249" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient17530"
- id="linearGradient17221"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-95.999998)"
- x1="754.28558"
- y1="300.83292"
- x2="758"
- y2="305" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18370"
- id="linearGradient17223"
- gradientUnits="userSpaceOnUse"
- x1="432.83759"
- y1="289.15814"
- x2="441.44028"
- y2="283.54819" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18370"
- id="linearGradient17225"
- gradientUnits="userSpaceOnUse"
- x1="432.83759"
- y1="289.15814"
- x2="441.44028"
- y2="283.54819" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20020"
- id="linearGradient17236"
- gradientUnits="userSpaceOnUse"
- x1="331.22147"
- y1="249.03816"
- x2="336.11465"
- y2="244.64084"
- gradientTransform="translate(-0.01702303,0.01679543)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18495"
- id="linearGradient17239"
- gradientUnits="userSpaceOnUse"
- x1="323.68958"
- y1="248.71513"
- x2="335.125"
- y2="245.5"
- gradientTransform="translate(4.554861e-6,8.3724231e-8)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18479"
- id="linearGradient17243"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0087429,0,0,0.97482999,-108.39487,-30.511198)"
- x1="427.86765"
- y1="284.7648"
- x2="431.31277"
- y2="278.92789" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18414"
- id="linearGradient17247"
- gradientUnits="userSpaceOnUse"
- x1="333.8428"
- y1="253.4225"
- x2="327.0369"
- y2="243.12526"
- gradientTransform="translate(4.554861e-6,8.3724231e-8)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient17442"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.081988,0,0,1.0833333,-394.58897,440.54169)"
- x1="326.51352"
- y1="32.007874"
- x2="347.91187"
- y2="57.261913" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient17444"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0983862,0,0,1.0999999,-400.00857,439.95001)"
- x1="317.30908"
- y1="22.7787"
- x2="330.87869"
- y2="38.161732" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18105-2-9"
- id="linearGradient18618"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.04935997,1.9792524)"
- x1="492.95264"
- y1="267.42996"
- x2="496.73859"
- y2="270.36874" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15531-9-5"
- id="linearGradient18620"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9993234,0,0,1.0050357,383.02168,218.70121)"
- x1="116.41398"
- y1="53.197613"
- x2="109.72195"
- y2="43.434277" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974-27-5"
- id="linearGradient18622"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9993234,0,0,1.0050357,383.02168,218.70121)"
- x1="116.41398"
- y1="53.197613"
- x2="104.06187"
- y2="53.601826" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27277-1-8"
- id="linearGradient18624"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.04935997,1.9965991)"
- x1="501.19104"
- y1="270.69452"
- x2="488.93024"
- y2="272.60611" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient21327-63-5"
- id="linearGradient18626"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.04935997,0.97920913)"
- x1="500.71924"
- y1="270.24997"
- x2="477"
- y2="274" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient27301-6-2"
- id="linearGradient18628"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.04936017,-0.04091017)"
- x1="497"
- y1="264"
- x2="507.125"
- y2="276.75" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient18663"
- gradientUnits="userSpaceOnUse"
- x1="98.858559"
- y1="80.045052"
- x2="135.00615"
- y2="122.92735" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient18665"
- gradientUnits="userSpaceOnUse"
- x1="130.75166"
- y1="245.03757"
- x2="129.24866"
- y2="243.31177" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient18667"
- gradientUnits="userSpaceOnUse"
- x1="126.37006"
- y1="112.31642"
- x2="144.22272"
- y2="129.82761" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient18669"
- gradientUnits="userSpaceOnUse"
- x1="190.68166"
- y1="244.14676"
- x2="174.75458"
- y2="226.33672" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974-39"
- id="linearGradient18721-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,244.3928,19.4113)"
- x1="-88.73024"
- y1="-120.6127"
- x2="-78.787354"
- y2="-128.30418" />
- <linearGradient
- id="linearGradient23974-39">
- <stop
- id="stop23976-8"
- offset="0"
- style="stop-color:#2561b7;stop-opacity:1;" />
- <stop
- id="stop23978-23"
- offset="1"
- style="stop-color:#f9fbff;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient31320-9"
- id="linearGradient18728-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,222.97812,19.5574)"
- x1="68.688324"
- y1="51.42366"
- x2="72.671516"
- y2="55.501457" />
- <linearGradient
- id="linearGradient31320-9">
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="0"
- id="stop31322-6" />
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="1"
- id="stop31324-2" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262-6"
- id="linearGradient18765-5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,309.42934,-349.44584)"
- x1="-26.207859"
- y1="252.77303"
- x2="-5.4963508"
- y2="253.15045" />
- <linearGradient
- id="linearGradient14262-6">
- <stop
- id="stop14264-29"
- offset="0"
- style="stop-color:#2661b6;stop-opacity:1;" />
- <stop
- id="stop14266-9"
- offset="1"
- style="stop-color:#c1d7f8;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-61"
- id="linearGradient18712-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="103.65562"
- y1="49.547874"
- x2="120.79755"
- y2="57.84819" />
- <linearGradient
- id="linearGradient319-61">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-47" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-45" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974-39"
- id="linearGradient16862"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,244.3928,19.4113)"
- x1="-88.73024"
- y1="-120.6127"
- x2="-78.787354"
- y2="-128.30418" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient31320-9"
- id="linearGradient16864"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,222.97812,19.5574)"
- x1="68.688324"
- y1="51.42366"
- x2="72.671516"
- y2="55.501457" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14262-6"
- id="linearGradient16866"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1.004219,0,0,0.980922,309.42934,-349.44584)"
- x1="-26.207859"
- y1="252.77303"
- x2="-5.4963508"
- y2="253.15045" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-61"
- id="linearGradient16868"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="103.65562"
- y1="49.547874"
- x2="120.79755"
- y2="57.84819" />
- <filter
- style="color-interpolation-filters:sRGB"
- inkscape:collect="always"
- x="-0.71999419"
- width="2.4399884"
- y="-0.72000581"
- height="2.4400115"
- id="filter31351-1">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.83077614"
- id="feGaussianBlur31353-2" />
- </filter>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask43822-9">
- <rect
- y="208"
- x="754"
- height="9"
- width="12"
- id="rect43824-7"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.93999993;fill:url(#linearGradient43826);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient30825"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,60.913822,345.30299)"
- x1="246.89435"
- y1="-4.4418921"
- x2="277.68143"
- y2="30.743095" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient30827"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(217.4611,127.95934)"
- x1="87.03125"
- y1="241"
- x2="92.8125"
- y2="245.625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient30849"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,62.093241,347.52307)"
- x1="246.89435"
- y1="-4.4418921"
- x2="277.68143"
- y2="30.743095" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient31767"
- id="linearGradient17886"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-453.47657,163.11565)"
- x1="755.49371"
- y1="212.5"
- x2="759.46533"
- y2="212.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient31767"
- id="linearGradient17892"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-473.38792,258.10925)"
- x1="755.49371"
- y1="212.5"
- x2="759.46533"
- y2="212.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient31767"
- id="linearGradient17894"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-473.38792,258.10925)"
- x1="755.49371"
- y1="212.5"
- x2="759.46533"
- y2="212.5" />
- <filter
- inkscape:collect="always"
- style="color-interpolation-filters:sRGB"
- id="filter17889"
- x="-0.044615405"
- width="1.0892308"
- y="-0.091578864"
- height="1.1831577">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.25149387"
- id="feGaussianBlur17891" />
- </filter>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath15455">
- <rect
- style="color:#000000;fill:#d8d8d8;fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
- id="rect15457"
- width="16"
- height="16"
- x="301.96045"
- y="236.91833" />
- </clipPath>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask15700">
- <path
- style="color:#000000;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter15613);enable-background:new"
- d="m 302.9292,245.91834 -2.4375,-1.125 -0.53125,-9.84375 19.95312,-0.0469 0.0156,9.95313 -2.9375,1.09375 0,5.96875 -14,0 z"
- id="path15702"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccc" />
- </mask>
- <filter
- color-interpolation-filters="sRGB"
- inkscape:collect="always"
- id="filter15613"
- x="-0.092011765"
- width="1.1840235"
- y="-0.097762503"
- height="1.1955251">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.65175"
- id="feGaussianBlur15615" />
- </filter>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-55"
- id="linearGradient15678"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6025789,0,0,0.668336,262.51944,86.612922)"
- x1="49.543404"
- y1="230.81766"
- x2="73.932747"
- y2="247.27646" />
- <linearGradient
- id="linearGradient37542-55">
- <stop
- id="stop37544-61"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-03"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-74"
- id="linearGradient15680"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9120445,0,0,1,24.780995,9.8636515)"
- x1="305.12527"
- y1="239.03134"
- x2="308.97327"
- y2="242" />
- <linearGradient
- id="linearGradient319-74">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-42" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-67" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-55"
- id="linearGradient15682"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.584271,0,0,0.661005,267.80323,78.438648)"
- x1="51.682816"
- y1="229.19724"
- x2="73.932762"
- y2="247.35141" />
- <linearGradient
- id="linearGradient14195">
- <stop
- id="stop14197"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop14199"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-74"
- id="linearGradient15684"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9103441,0,0,0.989031,29.299938,2.5312404)"
- x1="305.12527"
- y1="239.03134"
- x2="307.25021"
- y2="241.62509" />
- <linearGradient
- id="linearGradient14202">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop14204" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop14206" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient21609-6"
- id="linearGradient15688"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6025789,0,0,0.668336,273.45693,86.644181)"
- x1="49.543404"
- y1="230.81766"
- x2="73.932747"
- y2="247.27646" />
- <linearGradient
- id="linearGradient21609-6">
- <stop
- id="stop21611-3"
- offset="0"
- style="stop-color:black;stop-opacity:1" />
- <stop
- id="stop21613-0"
- offset="1"
- style="stop-color:white;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29312-0"
- id="linearGradient15690"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9120445,0,0,1,35.718484,9.8949108)"
- x1="305.12527"
- y1="239.03134"
- x2="308.97327"
- y2="242" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient29312-0">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop29314-8" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop29316-3" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16019"
- id="linearGradient15692"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.59375,1.375)"
- x1="308.85309"
- y1="245.43437"
- x2="314.06238"
- y2="245.43437" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16019">
- <stop
- style="stop-color:#c6d7ef;stop-opacity:1"
- offset="0"
- id="stop16021" />
- <stop
- style="stop-color:#7fa4dc;stop-opacity:1"
- offset="1"
- id="stop16023" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15996"
- id="linearGradient15694"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.59375,1.375)"
- x1="304.86005"
- y1="245.47992"
- x2="310.04089"
- y2="245.47992" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient15996">
- <stop
- style="stop-color:#5f8dd3;stop-opacity:1"
- offset="0"
- id="stop15998" />
- <stop
- style="stop-color:#d7e3f4;stop-opacity:1"
- offset="1"
- id="stop16000" />
- </linearGradient>
- <clipPath
- clipPathUnits="userSpaceOnUse"
- id="clipPath15455-9">
- <rect
- style="color:#000000;fill:#d8d8d8;fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
- id="rect15457-6"
- width="16"
- height="16"
- x="301.96045"
- y="236.91833" />
- </clipPath>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask15700-4">
- <path
- style="color:#000000;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.20000005000000010;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter15613-8);enable-background:new"
- d="m 302.9292,245.91834 -2.4375,-1.125 -0.53125,-9.84375 19.95312,-0.0469 0.0156,9.95313 -2.9375,1.09375 0,5.96875 -14,0 z"
- id="path15702-5"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccc" />
- </mask>
- <filter
- color-interpolation-filters="sRGB"
- inkscape:collect="always"
- id="filter15613-8"
- x="-0.092011765"
- width="1.1840235"
- y="-0.097762503"
- height="1.1955251">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.65175"
- id="feGaussianBlur15615-1" />
- </filter>
- <filter
- color-interpolation-filters="sRGB"
- inkscape:label="Greyscale"
- id="filter15388">
- <feColorMatrix
- values="0.21 0.72 0.072 0 0 0.21 0.72 0.072 0 0 0.21 0.72 0.072 0 0 0 0 0 1 0 "
- id="feColorMatrix15390"
- result="fbSourceGraphic" />
- <feColorMatrix
- result="fbSourceGraphicAlpha"
- in="fbSourceGraphic"
- values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
- id="feColorMatrix15392" />
- <feColorMatrix
- id="feColorMatrix15394"
- values="0.21 0.72 0.072 0 0 0.21 0.72 0.072 0 0 0.21 0.72 0.072 0 0 0 0 0 1 0 "
- in="fbSourceGraphic" />
- </filter>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-91"
- id="linearGradient15371"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6025789,0,0,0.668336,262.51944,86.612922)"
- x1="49.543404"
- y1="230.81766"
- x2="73.932747"
- y2="247.27646" />
- <linearGradient
- id="linearGradient37542-91">
- <stop
- id="stop37544-81"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop37546-75"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-223"
- id="linearGradient15373"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9120445,0,0,1,24.780995,9.8636515)"
- x1="305.12527"
- y1="239.03134"
- x2="308.97327"
- y2="242" />
- <linearGradient
- id="linearGradient319-223">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-84" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-34" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542-91"
- id="linearGradient15375"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.584271,0,0,0.661005,267.80323,78.438648)"
- x1="51.682816"
- y1="229.19724"
- x2="73.932762"
- y2="247.35141" />
- <linearGradient
- id="linearGradient14275">
- <stop
- id="stop14277"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop14279"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-223"
- id="linearGradient15377"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9103441,0,0,0.989031,29.299938,2.5312404)"
- x1="305.12527"
- y1="239.03134"
- x2="307.25021"
- y2="241.62509" />
- <linearGradient
- id="linearGradient14282">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop14284" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop14286" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient21609-3"
- id="linearGradient15379"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.6025789,0,0,0.668336,273.45693,86.644181)"
- x1="49.543404"
- y1="230.81766"
- x2="73.932747"
- y2="247.27646" />
- <linearGradient
- id="linearGradient21609-3">
- <stop
- id="stop21611-9"
- offset="0"
- style="stop-color:black;stop-opacity:1" />
- <stop
- id="stop21613-8"
- offset="1"
- style="stop-color:white;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient29312-7"
- id="linearGradient15381"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9120445,0,0,1,35.718484,9.8949108)"
- x1="305.12527"
- y1="239.03134"
- x2="308.97327"
- y2="242" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient29312-7">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop29314-6" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop29316-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16019-5"
- id="linearGradient15384"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.59375,1.375)"
- x1="308.85309"
- y1="245.43437"
- x2="314.06238"
- y2="245.43437" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16019-5">
- <stop
- style="stop-color:#c6d7ef;stop-opacity:1"
- offset="0"
- id="stop16021-1" />
- <stop
- style="stop-color:#7fa4dc;stop-opacity:1"
- offset="1"
- id="stop16023-8" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15996-5"
- id="linearGradient15386"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0.59375,1.375)"
- x1="304.86005"
- y1="245.47992"
- x2="310.04089"
- y2="245.47992" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient15996-5">
- <stop
- style="stop-color:#5f8dd3;stop-opacity:1"
- offset="0"
- id="stop15998-9" />
- <stop
- style="stop-color:#d7e3f4;stop-opacity:1"
- offset="1"
- id="stop16000-1" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16023"
- id="radialGradient16031"
- cx="139"
- cy="137.5"
- fx="139"
- fy="137.5"
- r="7"
- gradientTransform="matrix(1.9285714,0,0,0.5,-129.07143,68.75)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient16023">
- <stop
- style="stop-color:#d8d8d8;stop-opacity:1"
- offset="0"
- id="stop16025" />
- <stop
- style="stop-color:#9a9a9a;stop-opacity:1"
- offset="1"
- id="stop16027" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16023"
- id="radialGradient14148"
- cx="139"
- cy="137.5"
- fx="139"
- fy="137.5"
- r="7"
- gradientTransform="matrix(1.9285714,0,0,0.5,-129.07143,68.75)"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16023"
- id="radialGradient14156"
- cx="139"
- cy="137.5"
- fx="139"
- fy="137.5"
- r="7"
- gradientTransform="matrix(1.9285714,0,0,0.5,-129.07143,68.75)"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16023"
- id="radialGradient14164"
- cx="139"
- cy="137.5"
- fx="139"
- fy="137.5"
- r="7"
- gradientTransform="matrix(1.9285714,0,0,0.5,-129.07143,68.75)"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16023"
- id="radialGradient14172"
- cx="139"
- cy="137.5"
- fx="139"
- fy="137.5"
- r="7"
- gradientTransform="matrix(1.9285714,0,0,0.5,-129.07143,68.75)"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16023"
- id="radialGradient14180"
- cx="139"
- cy="137.5"
- fx="139"
- fy="137.5"
- r="7"
- gradientTransform="matrix(1.9285714,0,0,0.5,-129.07143,68.75)"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15984"
- id="radialGradient15990"
- cx="139"
- cy="137.5"
- fx="139"
- fy="137.5"
- r="1"
- gradientTransform="matrix(14.5,0,0,5.5,-1876.5,-618.75)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient15984">
- <stop
- style="stop-color:#ffffff;stop-opacity:1"
- offset="0"
- id="stop15986" />
- <stop
- style="stop-color:#a8cafb;stop-opacity:1"
- offset="1"
- id="stop15988" />
- </linearGradient>
- <radialGradient
- r="7"
- fy="137.5"
- fx="139"
- cy="137.5"
- cx="139"
- gradientTransform="matrix(1.9285714,0,0,0.5,-129.07143,68.75)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient14206"
- xlink:href="#linearGradient16023"
- inkscape:collect="always" />
- <radialGradient
- r="7"
- fy="137.5"
- fx="139"
- cy="137.5"
- cx="139"
- gradientTransform="matrix(1.9285714,0,0,0.5,-129.07143,68.75)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient14208"
- xlink:href="#linearGradient16023"
- inkscape:collect="always" />
- <radialGradient
- r="7"
- fy="137.5"
- fx="139"
- cy="137.5"
- cx="139"
- gradientTransform="matrix(1.9285714,0,0,0.5,-129.07143,68.75)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient14210"
- xlink:href="#linearGradient16023"
- inkscape:collect="always" />
- <radialGradient
- r="7"
- fy="137.5"
- fx="139"
- cy="137.5"
- cx="139"
- gradientTransform="matrix(1.9285714,0,0,0.5,-129.07143,68.75)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient14212"
- xlink:href="#linearGradient16023"
- inkscape:collect="always" />
- <radialGradient
- r="7"
- fy="137.5"
- fx="139"
- cy="137.5"
- cx="139"
- gradientTransform="matrix(1.9285714,0,0,0.5,-129.07143,68.75)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient14214"
- xlink:href="#linearGradient16023"
- inkscape:collect="always" />
- <radialGradient
- r="1"
- fy="137.5"
- fx="139"
- cy="137.5"
- cx="139"
- gradientTransform="matrix(14.5,0,0,5.5,-1876.5,-618.75)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient14216"
- xlink:href="#linearGradient15984"
- inkscape:collect="always" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16023"
- id="radialGradient16945"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.9285714,0,0,0.5,-129.59176,68.75)"
- cx="139"
- cy="137.5"
- fx="139"
- fy="137.5"
- r="7" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16023"
- id="radialGradient16947"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.9285714,0,0,0.5,-128.51641,68.75)"
- cx="139"
- cy="137.5"
- fx="139"
- fy="137.5"
- r="7" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient31208"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-41,98)"
- x1="-170.25"
- y1="65.5"
- x2="-181.375"
- y2="65.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient31210"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.2857143,0,0,0.787037,-92.714287,177.80092)"
- x1="-101"
- y1="-16"
- x2="-93.75"
- y2="-16.264704" />
- <filter
- inkscape:label="Opacity"
- style="color-interpolation-filters:sRGB"
- id="filter17385">
- <feColorMatrix
- values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 5 -1 "
- result="colormatrix"
- id="feColorMatrix17387" />
- <feComposite
- k4="0"
- k3="0"
- k1="0"
- in2="colormatrix"
- operator="arithmetic"
- k2="0.24"
- result="composite"
- id="feComposite17389" />
- </filter>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134"
- id="radialGradient37501-3-6-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.08933014,-0.7764284,0.7350832,-0.08334857,57.410559,233.30156)"
- cx="135.83771"
- cy="117.97826"
- fx="135.83771"
- fy="117.97826"
- r="8" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134"
- id="radialGradient37501-3-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-0.08933014,-0.7764284,0.7350832,-0.08334857,57.410559,233.30156)"
- cx="135.83771"
- cy="117.97826"
- fx="135.83771"
- fy="117.97826"
- r="8" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134"
- id="linearGradient17463"
- gradientUnits="userSpaceOnUse"
- x1="121.19734"
- y1="105.94044"
- x2="148.06364"
- y2="137.6748" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16595"
- id="linearGradient17281"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(144,188)"
- x1="209"
- y1="238"
- x2="226.625"
- y2="251.71078" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134"
- id="linearGradient31399"
- gradientUnits="userSpaceOnUse"
- x1="62.793919"
- y1="133.73566"
- x2="64.109718"
- y2="135.18265" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient31452"
- gradientUnits="userSpaceOnUse"
- x1="121.19734"
- y1="105.94044"
- x2="148.06364"
- y2="137.6748" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-36-6-5"
- id="linearGradient31454"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(144,188)"
- x1="209"
- y1="238"
- x2="226.625"
- y2="251.71078" />
- <linearGradient
- y2="32.076183"
- x2="276.89801"
- y1="-14.103641"
- x1="236.94902"
- gradientTransform="matrix(2.4126967,0,0,2.7035619,-536.07088,379.29465)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient22274-8"
- xlink:href="#linearGradient1610-2"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient1610-2">
- <stop
- id="stop1611-8-9"
- offset="0"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0.5"
- id="stop6596" />
- <stop
- id="stop1612-0-6"
- offset="1"
- style="stop-color:#c8c8c8;stop-opacity:1;" />
- </linearGradient>
- <clipPath
- id="clipPath13106-5"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path34850-6-6"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <filter
- style="color-interpolation-filters:sRGB"
- id="filter63011-5"
- height="2.0133312"
- y="-0.50666559"
- width="1.9120018"
- x="-0.45600089"
- inkscape:collect="always">
- <feGaussianBlur
- id="feGaussianBlur63013-8"
- stdDeviation="1.899998"
- inkscape:collect="always" />
- </filter>
- <linearGradient
- y2="383.69843"
- x2="174.29811"
- y1="376.27383"
- x1="160.14388"
- gradientTransform="translate(-47.00001,58.00194)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient22276-5"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <clipPath
- id="clipPath6172"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path6174"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <radialGradient
- r="3.1650217"
- fy="500.26215"
- fx="75.554794"
- cy="500.26215"
- cx="75.554794"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient21442-6-790"
- xlink:href="#linearGradient18821-1-16"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient18821-1-16">
- <stop
- id="stop20589"
- offset="0"
- style="stop-color:#e3604f;stop-opacity:1;" />
- <stop
- id="stop20591"
- offset="1"
- style="stop-color:#e3604f;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- y2="34.375"
- x2="29.875"
- y1="18.875"
- x1="31.1875"
- gradientUnits="userSpaceOnUse"
- id="linearGradient21444-0-352"
- xlink:href="#linearGradient39155-0-813"
- inkscape:collect="always" />
- <linearGradient
- id="linearGradient39155-0-813">
- <stop
- style="stop-color:#e6e6e6;stop-opacity:1;"
- offset="0"
- id="stop20595" />
- <stop
- style="stop-color:#c4c4c4;stop-opacity:1;"
- offset="1"
- id="stop20597" />
- </linearGradient>
- <linearGradient
- y2="-458.05771"
- x2="190.46461"
- y1="193.33229"
- x1="185.9903"
- gradientTransform="matrix(0.06818845,0,0,0.06818845,22.51112,27.02885)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient21446-3-145"
- xlink:href="#linearGradient3564-2-380"
- inkscape:collect="always" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient3564-2-380">
- <stop
- style="stop-color:#e6e6e6;stop-opacity:1;"
- offset="0"
- id="stop20601" />
- <stop
- style="stop-color:#e6e6e6;stop-opacity:0;"
- offset="1"
- id="stop20603" />
- </linearGradient>
- <radialGradient
- r="20.278975"
- fy="19.668886"
- fx="26.109201"
- cy="19.668886"
- cx="26.109201"
- gradientTransform="matrix(1.647222,0,0,1.26792,-15.47413,-5.79794)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient21448-8-143"
- xlink:href="#linearGradient3564-2-380"
- inkscape:collect="always" />
- <linearGradient
- y2="32.902874"
- x2="278.34866"
- y1="-14.103641"
- x1="236.94902"
- gradientTransform="matrix(2.4126967,0,0,2.7035619,-536.07088,379.29465)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient21875-7-1-0-1"
- xlink:href="#linearGradient16595"
- inkscape:collect="always" />
- <clipPath
- id="clipPath13106-9-2-9-9-4"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path34850-4-7-0-4-0"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- inkscape:connector-curvature="0" />
- </clipPath>
- <filter
- style="color-interpolation-filters:sRGB"
- id="filter63011-6-7-0-8"
- height="2.0133312"
- y="-0.50666559"
- width="1.9120018"
- x="-0.45600089"
- inkscape:collect="always">
- <feGaussianBlur
- id="feGaussianBlur63013-0-1-0-8"
- stdDeviation="1.899998"
- inkscape:collect="always" />
- </filter>
- <linearGradient
- y2="383.69843"
- x2="174.29811"
- y1="376.27383"
- x1="160.14388"
- gradientTransform="translate(-47.00001,58.00194)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient21877-3-2-7-2"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <clipPath
- id="clipPath6208"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path6210"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- inkscape:connector-curvature="0" />
- </clipPath>
- <linearGradient
- y2="629.23273"
- x2="1659.0875"
- y1="639.65356"
- x1="1666.1765"
- gradientTransform="matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient34959-9-2-1"
- xlink:href="#linearGradient4671-6-4-1-7"
- inkscape:collect="always" />
- <linearGradient
- y2="626.40344"
- x2="1663.2872"
- y1="607.50525"
- x1="1641.4773"
- gradientTransform="matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient34961-3-6-5"
- xlink:href="#linearGradient4689-1-6-4-2"
- inkscape:collect="always" />
- <linearGradient
- y2="344.10001"
- x2="924.10608"
- y1="339.66599"
- x1="922.89703"
- gradientUnits="userSpaceOnUse"
- id="linearGradient34963-5-9-1"
- xlink:href="#linearGradient18134"
- inkscape:collect="always" />
- <linearGradient
- y2="355.75"
- x2="922.104"
- y1="345.42163"
- x1="919.09998"
- gradientUnits="userSpaceOnUse"
- id="linearGradient34965-1-5-2"
- xlink:href="#linearGradient18134"
- inkscape:collect="always" />
- <linearGradient
- y2="341.98108"
- x2="921.82654"
- y1="342.71866"
- x1="922.64624"
- gradientUnits="userSpaceOnUse"
- id="linearGradient34967-4-1-8"
- xlink:href="#linearGradient18134"
- inkscape:collect="always" />
- <linearGradient
- y2="353"
- x2="917.25"
- y1="355.5"
- x1="917.75"
- gradientUnits="userSpaceOnUse"
- id="linearGradient34969-4-4-1"
- xlink:href="#linearGradient18134"
- inkscape:collect="always" />
- <linearGradient
- y2="344.75"
- x2="923"
- y1="343.75"
- x1="923"
- gradientUnits="userSpaceOnUse"
- id="linearGradient34971-5-0-9"
- xlink:href="#linearGradient18134"
- inkscape:collect="always" />
- <radialGradient
- r="6"
- fy="349.20001"
- fx="924"
- cy="349.20001"
- cx="924"
- gradientTransform="matrix(2.4166677,-7.678944e-6,1.853542e-6,0.58333478,-1309.0016,145.80659)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient34973-2-5-7"
- xlink:href="#linearGradient18134"
- inkscape:collect="always" />
- <linearGradient
- y2="342.16492"
- x2="922.16492"
- y1="341.34042"
- x1="921.34045"
- gradientUnits="userSpaceOnUse"
- id="linearGradient34975-9-4-9"
- xlink:href="#linearGradient18134"
- inkscape:collect="always" />
- <linearGradient
- y2="349.81818"
- x2="45.021851"
- y1="437.02835"
- x1="59.158501"
- gradientTransform="matrix(1.043478,0,0,0.956667,765.84783,-274.57833)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient24867"
- xlink:href="#linearGradient24727"
- inkscape:collect="always" />
- <linearGradient
- y2="101.5"
- x2="841"
- y1="101.5"
- x1="807"
- gradientUnits="userSpaceOnUse"
- id="linearGradient24869"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <linearGradient
- y2="347.78201"
- x2="63.407566"
- y1="422.46088"
- x1="63.659767"
- gradientTransform="matrix(1.043478,0,0,0.956667,767.34783,-275.07833)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient24871"
- xlink:href="#linearGradient24711"
- inkscape:collect="always" />
- <linearGradient
- y2="114.99999"
- x2="936"
- y1="102"
- x1="954"
- gradientTransform="translate(-127,4e-6)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient24873"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <filter
- style="color-interpolation-filters:sRGB"
- inkscape:label="Drop Shadow"
- id="filter6146"
- x="-0.30000001"
- width="1.35"
- y="-0.15000001"
- height="1.4">
- <feFlood
- flood-opacity="0.40000000000000002"
- flood-color="rgb(0,0,0)"
- result="flood"
- id="feFlood6148" />
- <feComposite
- in="flood"
- in2="SourceGraphic"
- operator="in"
- result="composite1"
- id="feComposite6150" />
- <feGaussianBlur
- in="composite1"
- stdDeviation="1.5"
- result="blur"
- id="feGaussianBlur6152" />
- <feOffset
- dx="-2"
- dy="2"
- result="offset"
- id="feOffset6154" />
- <feComposite
- in="SourceGraphic"
- in2="offset"
- operator="over"
- result="composite2"
- id="feComposite6156" />
- </filter>
- <linearGradient
- y2="108.00847"
- x2="345.40625"
- y1="108.35222"
- x1="351.15625"
- gradientUnits="userSpaceOnUse"
- id="linearGradient44402"
- xlink:href="#linearGradient18134"
- inkscape:collect="always" />
- <linearGradient
- y2="106.7795"
- x2="347.1875"
- y1="106.93575"
- x1="351.71875"
- gradientUnits="userSpaceOnUse"
- id="linearGradient44404"
- xlink:href="#linearGradient18134"
- inkscape:collect="always" />
- <linearGradient
- y2="349.81818"
- x2="45.021851"
- y1="437.02835"
- x1="59.158501"
- gradientTransform="matrix(1.043478,0,0,0.956667,765.84783,-274.57833)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient24839"
- xlink:href="#linearGradient24727"
- inkscape:collect="always" />
- <linearGradient
- y2="101.5"
- x2="841"
- y1="101.5"
- x1="807"
- gradientUnits="userSpaceOnUse"
- id="linearGradient24841"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <linearGradient
- y2="347.78201"
- x2="63.407566"
- y1="419.06366"
- x1="64.019142"
- gradientTransform="matrix(1.043478,0,0,0.956667,767.34783,-275.07833)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient24843"
- xlink:href="#linearGradient24144"
- inkscape:collect="always" />
- <linearGradient
- y2="114.99999"
- x2="936"
- y1="102"
- x1="954"
- gradientTransform="translate(-127,4e-6)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient24845"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <linearGradient
- y2="349.81818"
- x2="45.021851"
- y1="437.02835"
- x1="59.158501"
- gradientTransform="matrix(1.043478,0,0,0.956667,765.84783,-274.57833)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient24809"
- xlink:href="#linearGradient24727"
- inkscape:collect="always" />
- <linearGradient
- y2="101.5"
- x2="841"
- y1="101.5"
- x1="807"
- gradientUnits="userSpaceOnUse"
- id="linearGradient24811"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <linearGradient
- y2="347.78201"
- x2="63.407566"
- y1="421.80756"
- x1="63.539974"
- gradientTransform="matrix(1.043478,0,0,0.956667,767.34783,-275.07833)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient24813"
- xlink:href="#linearGradient24711"
- inkscape:collect="always" />
- <linearGradient
- y2="114.99999"
- x2="936"
- y1="102"
- x1="954"
- gradientTransform="translate(-127,4e-6)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient24815"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <filter
- style="color-interpolation-filters:sRGB"
- inkscape:label="Drop Shadow"
- id="filter6078"
- x="-0.30000001"
- width="1.35"
- height="1.4"
- y="-0.15000001">
- <feFlood
- flood-opacity="0.40000000000000002"
- flood-color="rgb(0,0,0)"
- result="flood"
- id="feFlood6080" />
- <feComposite
- in="flood"
- in2="SourceGraphic"
- operator="in"
- result="composite1"
- id="feComposite6082" />
- <feGaussianBlur
- in="composite1"
- stdDeviation="1.5"
- result="blur"
- id="feGaussianBlur6084" />
- <feOffset
- dx="-2"
- dy="2"
- result="offset"
- id="feOffset6086" />
- <feComposite
- in="SourceGraphic"
- in2="offset"
- operator="over"
- result="composite2"
- id="feComposite6088" />
- </filter>
- <linearGradient
- y2="32.076183"
- x2="276.89801"
- y1="-14.103641"
- x1="236.94902"
- gradientTransform="matrix(2.4126967,0,0,2.7035619,-536.07088,379.29465)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient22274"
- xlink:href="#linearGradient16595"
- inkscape:collect="always" />
- <clipPath
- id="clipPath13106-7"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path34850-1"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <filter
- style="color-interpolation-filters:sRGB"
- id="filter63011"
- height="2.0133312"
- y="-0.50666559"
- width="1.9120018"
- x="-0.45600089"
- inkscape:collect="always">
- <feGaussianBlur
- id="feGaussianBlur63013"
- stdDeviation="1.899998"
- inkscape:collect="always" />
- </filter>
- <linearGradient
- y2="383.69843"
- x2="174.29811"
- y1="376.27383"
- x1="160.14388"
- gradientTransform="translate(-47.00001,58.00194)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient22276"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <clipPath
- id="clipPath6380"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path6382"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <radialGradient
- r="3.1650217"
- fy="500.26215"
- fx="75.554794"
- cy="500.26215"
- cx="75.554794"
- gradientTransform="matrix(0.8728692,0.8400852,-1.1671853,1.2200916,594.18579,-173.07738)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient21442"
- xlink:href="#linearGradient18821"
- inkscape:collect="always" />
- <linearGradient
- y2="34.375"
- x2="29.875"
- y1="18.875"
- x1="31.1875"
- gradientUnits="userSpaceOnUse"
- id="linearGradient21444"
- xlink:href="#linearGradient39155"
- inkscape:collect="always" />
- <linearGradient
- y2="-458.05771"
- x2="190.46461"
- y1="193.33229"
- x1="185.9903"
- gradientTransform="matrix(0.06818845,0,0,0.06818845,22.51112,27.02885)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient21446"
- xlink:href="#linearGradient18134"
- inkscape:collect="always" />
- <radialGradient
- r="20.278975"
- fy="19.668886"
- fx="26.109201"
- cy="19.668886"
- cx="26.109201"
- gradientTransform="matrix(1.647222,0,0,1.26792,-15.47413,-5.79794)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient21448"
- xlink:href="#linearGradient18134"
- inkscape:collect="always" />
- <linearGradient
- y2="31.515814"
- x2="276.89801"
- y1="-14.103641"
- x1="236.94902"
- gradientTransform="matrix(2.4126967,0,0,2.7035619,-536.07088,379.29465)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient23978"
- xlink:href="#linearGradient16595"
- inkscape:collect="always" />
- <clipPath
- id="clipPath6411"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path6413"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <linearGradient
- y2="383.69843"
- x2="174.29811"
- y1="376.27383"
- x1="160.14388"
- gradientTransform="translate(-47.00001,58.00194)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient23980"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <clipPath
- id="clipPath6426"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path6428"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <linearGradient
- y2="237"
- x2="150.5"
- y1="239.9987"
- x1="150.5"
- gradientTransform="matrix(1,0,0,0.733333,808.99997,-697.8)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient23982"
- xlink:href="#linearGradient18134"
- inkscape:collect="always" />
- <linearGradient
- y2="243.69914"
- x2="142.9375"
- y1="243.76387"
- x1="147.0625"
- gradientTransform="matrix(0,1,1,0,715,364)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient23986"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <linearGradient
- y2="244.11113"
- x2="144"
- y1="244.11113"
- x1="148"
- gradientTransform="matrix(1,0,0,1.2857143,364,645.14283)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient23988"
- xlink:href="#linearGradient30777"
- inkscape:collect="always" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient30777">
- <stop
- style="stop-color:#acacac;stop-opacity:1"
- offset="0"
- id="stop30779" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop30781" />
- </linearGradient>
- <clipPath
- id="clipPath23877-4"
- clipPathUnits="userSpaceOnUse">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect23879-6"
- width="15"
- height="6"
- x="952"
- y="-540"
- transform="scale(1,-1)" />
- </clipPath>
- <linearGradient
- y2="31.515814"
- x2="276.89801"
- y1="-14.103641"
- x1="236.94902"
- gradientTransform="matrix(2.4126967,0,0,2.7035619,-536.07088,379.29465)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient30368"
- xlink:href="#linearGradient16595"
- inkscape:collect="always" />
- <clipPath
- id="clipPath6455"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path6457"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <linearGradient
- y2="383.69843"
- x2="174.29811"
- y1="376.27383"
- x1="160.14388"
- gradientTransform="translate(-47.00001,58.00194)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient30370"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <clipPath
- id="clipPath6470"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path6472"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <clipPath
- id="clipPath20586-3"
- clipPathUnits="userSpaceOnUse">
- <ellipse
- ry="2.25"
- rx="4.5"
- cy="554"
- cx="53"
- transform="matrix(1.870472,0.1894819,-0.6587894,2.4281336,319.59052,-798.11661)"
- id="path34889-5"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate" />
- </clipPath>
- <filter
- style="color-interpolation-filters:sRGB"
- id="filter20578-5"
- height="3.0439126"
- y="-1.0219563"
- width="2.1164308"
- x="-0.55821538"
- inkscape:collect="always">
- <feGaussianBlur
- id="feGaussianBlur20580-2"
- stdDeviation="2.0410255"
- inkscape:collect="always" />
- </filter>
- <clipPath
- id="clipPath6482"
- clipPathUnits="userSpaceOnUse">
- <ellipse
- ry="2.25"
- rx="4.5"
- cy="554"
- cx="53"
- transform="matrix(1.870472,0.1894819,-0.6587894,2.4281336,319.59052,-798.11661)"
- id="path6484"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate" />
- </clipPath>
- <linearGradient
- y2="32.076183"
- x2="276.89801"
- y1="-14.103641"
- x1="236.94902"
- gradientTransform="matrix(2.4126967,0,0,2.7035619,-536.07088,379.29465)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient21594"
- xlink:href="#linearGradient16595"
- inkscape:collect="always" />
- <clipPath
- id="clipPath6497"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path6499"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <linearGradient
- y2="383.69843"
- x2="174.29811"
- y1="376.27383"
- x1="160.14388"
- gradientTransform="translate(-47.00001,58.00194)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient21596"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <clipPath
- id="clipPath6512"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path6514"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <linearGradient
- y2="31.515814"
- x2="276.89801"
- y1="-14.103641"
- x1="236.94902"
- gradientTransform="matrix(2.4126967,0,0,2.7035619,-536.07088,379.29465)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient21647"
- xlink:href="#linearGradient16595"
- inkscape:collect="always" />
- <clipPath
- id="clipPath6527"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path6529"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <linearGradient
- y2="383.69843"
- x2="174.29811"
- y1="376.27383"
- x1="160.14388"
- gradientTransform="translate(-47.00001,58.00194)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient21649"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <clipPath
- id="clipPath6542"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path6544"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <radialGradient
- r="5.256"
- fy="114.5684"
- fx="20.892099"
- cy="114.5684"
- cx="20.892099"
- gradientTransform="matrix(0.2798768,0,0,0.279916,6.0465962,-0.3619733)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient21565"
- xlink:href="#aigrd2-3"
- inkscape:collect="always" />
- <radialGradient
- gradientUnits="userSpaceOnUse"
- fy="114.5684"
- fx="20.892099"
- r="5.256"
- cy="114.5684"
- cx="20.892099"
- id="aigrd2-3">
- <stop
- id="stop15566-9"
- style="stop-color:#F0F0F0"
- offset="0" />
- <stop
- id="stop15568-7"
- style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
- offset="1.0000000" />
+
+
+
+
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient29805-5" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.94105289,0.01178942,-0.01073736,0.8570756,238.4669,249.70522)" cx="-30.028414" cy="19.425121" fx="-30.028414" fy="19.425121" r="7"/>
+
+
+ <linearGradient id="linearGradient17555">
+ <stop style="stop-color:#000000;stop-opacity:0.49803922;" offset="0" id="stop17557"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0.49803922;" offset="1" id="stop17559"/>
+ </linearGradient>
+ <linearGradient id="linearGradient17549">
+ <stop id="stop17551" offset="0" style="stop-color:#7f7f7f;stop-opacity:1;"/>
+ <stop id="stop17553" offset="1" style="stop-color:#7f7f7f;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient40455-7-1-6-0">
+ <stop id="stop40457-6-6-8-7" offset="0" style="stop-color:#fff991;stop-opacity:1;"/>
+ <stop id="stop40459-1-8-7-9" offset="1" style="stop-color:#fffbb9;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient14829">
+ <stop id="stop14831" offset="0" style="stop-color:#000000;stop-opacity:1;"/>
+ <stop id="stop14833" offset="1" style="stop-color:#757575;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient14605">
+ <stop style="stop-color:#ffffff;stop-opacity:0.56485355;" offset="0" id="stop14607"/>
+ <stop style="stop-color:#fffffe;stop-opacity:0;" offset="1" id="stop14609"/>
+ </linearGradient>
+
+ <linearGradient id="linearGradient10069-9-7-5-4-6-5-0-3-6">
+ <stop style="stop-color:#252525;stop-opacity:1" offset="0" id="stop10071-5-4-58-5-9-1-2-1-9"/>
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop10073-43-0-4-0-8-0-4-9-3"/>
+ </linearGradient>
+ <radialGradient id="radialGradient16142-7-6" cx="20.892099" cy="64.567902" r="5.257" fx="20.892099" fy="64.567902" gradientUnits="userSpaceOnUse">
+ <stop offset="0" style="stop-color:#F0F0F0" id="stop16144-4-6"/>
+ <stop offset="1" style="stop-color:#474747" id="stop16146-0-8"/>
</radialGradient>
- <radialGradient
- r="5.256"
- fy="114.5684"
- fx="20.892099"
- cy="114.5684"
- cx="20.892099"
- gradientTransform="matrix(0.2798768,0,0,0.279916,6.0465962,-0.3619733)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient21567"
- xlink:href="#aigrd2-3"
- inkscape:collect="always" />
- <radialGradient
- gradientUnits="userSpaceOnUse"
- fy="114.5684"
- fx="20.892099"
- r="5.256"
- cy="114.5684"
- cx="20.892099"
- id="radialGradient6555">
- <stop
- id="stop6557"
- style="stop-color:#F0F0F0"
- offset="0" />
- <stop
- id="stop6559"
- style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
- offset="1.0000000" />
+
+ <radialGradient gradientUnits="userSpaceOnUse" fy="64.567902" fx="20.892099" r="5.257" cy="64.567902" cx="20.892099" id="radialGradient16142">
+ <stop id="stop16144" style="stop-color:#F0F0F0" offset="0"/>
+ <stop id="stop16146" style="stop-color:#474747" offset="1"/>
</radialGradient>
- <linearGradient
- y2="31.515814"
- x2="276.89801"
- y1="-9.4293213"
- x1="240.70209"
- gradientTransform="matrix(2.4126967,0,0,2.7035619,-536.07088,379.29465)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient30321"
- xlink:href="#linearGradient16595"
- inkscape:collect="always" />
- <clipPath
- id="clipPath6568"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path6570"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <linearGradient
- y2="383.69843"
- x2="174.29811"
- y1="376.27383"
- x1="160.14388"
- gradientTransform="translate(-47.00001,58.00194)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient30323"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <clipPath
- id="clipPath6583"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path6585"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <linearGradient
- y2="31.515814"
- x2="276.89801"
- y1="-14.103641"
- x1="236.94902"
- gradientTransform="matrix(2.4126967,0,0,2.7035619,-536.07088,379.29465)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient21977"
- xlink:href="#linearGradient16595"
- inkscape:collect="always" />
- <clipPath
- id="clipPath6599"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path6601"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <linearGradient
- y2="383.69843"
- x2="174.29811"
- y1="376.27383"
- x1="160.14388"
- gradientTransform="translate(-47.00001,58.00194)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient21979"
- xlink:href="#linearGradient18495"
- inkscape:collect="always" />
- <clipPath
- id="clipPath6614"
- clipPathUnits="userSpaceOnUse">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path6616"
- d="m 125.5,433.5 23,0 0,41 -33,0 0,-31 10,-10 z"
- style="display:inline;fill:url(#linearGradient13110);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- </clipPath>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-6"
- id="linearGradient18199"
- gradientUnits="userSpaceOnUse"
- x1="189.76083"
- y1="248.13905"
- x2="116.05637"
- y2="183.6826"
- gradientTransform="translate(335.99871,21.048284)" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient22562"
- id="radialGradient23167-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.5950386,-0.0747115,0.06947956,0.55336879,432.31142,44.44399)"
- cx="-0.78262758"
- cy="294.63174"
- fx="-0.78262758"
- fy="294.63174"
- r="6.6750002" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient33897"
- id="radialGradient29130"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.6249996,2.7477764e-7,-3.1704883e-7,1.874986,-24.234082,-761.21063)"
- cx="39.528847"
- cy="871.2453"
- fx="39.528847"
- fy="871.2453"
- r="2.0000005" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient33897">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop33893" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop33895" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-367"
- id="linearGradient63713"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8167109,0,0,0.8433415,239.34332,-149.78578)"
- x1="104.90227"
- y1="53.227627"
- x2="114.94328"
- y2="60.73848" />
- <linearGradient
- id="linearGradient319-367">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop320-53" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop321-562" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-367"
- id="linearGradient63715"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(207,-246.99988)"
- x1="-56.65625"
- y1="342.03125"
- x2="-53.1875"
- y2="342.0625" />
- <linearGradient
- id="linearGradient3043">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop3045" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3047" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-367"
- id="linearGradient63886"
- x1="149.53125"
- y1="95.781372"
- x2="149.40625"
- y2="103.12512"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient3050">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop3052" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3054" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient63892"
- id="linearGradient63894"
- x1="127.85783"
- y1="115.03898"
- x2="137.88899"
- y2="121.44501"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient63892">
- <stop
- style="stop-color:#ba5d00;stop-opacity:1"
- offset="0"
- id="stop63888" />
- <stop
- id="stop63896"
- offset="0.5"
- style="stop-color:#fa9a3a;stop-opacity:1" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1"
- offset="1"
- id="stop63890" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-367"
- id="linearGradient63719"
- gradientUnits="userSpaceOnUse"
- x1="132"
- y1="117.26753"
- x2="142.72656"
- y2="127.72736" />
- <linearGradient
- id="linearGradient3062">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop3064" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3066" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18906"
- id="linearGradient14276"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-21)"
- x1="59.622501"
- y1="54.1525"
- x2="60.981617"
- y2="55.566177" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-2"
- id="linearGradient14278"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.5,-21)"
- x1="60.25"
- y1="56.5"
- x2="57.789688"
- y2="54.130001" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14829"
- id="linearGradient14280"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.5,-21)"
- x1="60.25"
- y1="56.5"
- x2="56"
- y2="52.25" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15859-1-3"
- id="linearGradient14283"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1.54625,-1)"
- x1="63.666252"
- y1="37.960625"
- x2="60.676094"
- y2="34.685287" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient63892"
- id="linearGradient14285"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-21)"
- x1="52.17437"
- y1="65.644958"
- x2="50.371208"
- y2="62.960247" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134"
- id="radialGradient53141-7"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.684011,0.3442329,-1.2972142,1.1562236,739.67527,-1155.7895)"
- cx="975.50568"
- cy="690.68732"
- fx="975.50568"
- fy="690.68732"
- r="2.333364" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask57450-1">
- <rect
- y="154.99899"
- x="326.00305"
- height="15"
- width="15"
- id="rect57452-3"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient57454);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974"
- id="linearGradient18738"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8008385,0,0,0.821004,429.95027,-161.55482)"
- x1="108.71671"
- y1="171.25618"
- x2="105.85706"
- y2="168.04703" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient20756"
- id="linearGradient18740"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8008385,0,0,0.8956408,540.31118,-183.20693)"
- x1="-26.313976"
- y1="178.07901"
- x2="-28.432825"
- y2="175.87964" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient18742"
- gradientUnits="userSpaceOnUse"
- x1="510.29913"
- y1="-20.435461"
- x2="505.9494"
- y2="-17.546936" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient25108-1-0"
- id="linearGradient18808"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-21)"
- x1="59.622501"
- y1="54.1525"
- x2="60.981617"
- y2="55.566177" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-2"
- id="linearGradient18810"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.5,-21)"
- x1="60.25"
- y1="56.5"
- x2="57.789688"
- y2="54.130001" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient14829"
- id="linearGradient18812"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-0.5,-21)"
- x1="60.25"
- y1="56.5"
- x2="56"
- y2="52.25" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient32877-9-6-8"
- id="linearGradient18814"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1.54625,-1)"
- x1="63.666252"
- y1="37.960625"
- x2="60.676094"
- y2="34.685287" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient23974-3-78-2"
- id="linearGradient18816"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-21)"
- x1="52.17437"
- y1="65.644958"
- x2="50.371208"
- y2="62.960247" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-6"
- id="linearGradient33545"
- gradientUnits="userSpaceOnUse"
- x1="189.76083"
- y1="248.13905"
- x2="116.05637"
- y2="183.6826" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9030"
- id="linearGradient33547"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-6,1.4603138e-6)"
- x1="474.84375"
- y1="75"
- x2="477.5"
- y2="77.5" />
- <linearGradient
- id="linearGradient32083">
- <stop
- style="stop-color:#3465a5;stop-opacity:1"
- offset="0"
- id="stop32075" />
- <stop
- id="stop32077"
- offset="0.4636974"
- style="stop-color:#6d92bf;stop-opacity:1" />
- <stop
- id="stop32079"
- offset="0.56071091"
- style="stop-color:#422200;stop-opacity:1" />
- <stop
- style="stop-color:#ae977b;stop-opacity:1"
- offset="1"
- id="stop32081" />
- </linearGradient>
- <linearGradient
- id="linearGradient20909">
- <stop
- id="stop20905"
- offset="0"
- style="stop-color:#f3b979;stop-opacity:1" />
- <stop
- id="stop20907"
- offset="1"
- style="stop-color:#be6405;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient16192">
- <stop
- style="stop-color:#b69f83;stop-opacity:1"
- offset="0"
- id="stop16188" />
- <stop
- style="stop-color:#422200;stop-opacity:1"
- offset="1"
- id="stop16190" />
- </linearGradient>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask25369-1">
- <g
- id="g25371-3"
- transform="translate(-21,-21)">
- <path
- inkscape:connector-curvature="0"
- style="fill:url(#linearGradient25381);fill-rule:evenodd;stroke:none"
- d="m 341,302 8,8 -8,8 z"
- id="path25373-1"
- sodipodi:nodetypes="cccc"
- inkscape:transform-center-x="4" />
- <path
- inkscape:connector-curvature="0"
- inkscape:transform-center-y="-4"
- sodipodi:nodetypes="cccc"
- id="path25375-1"
- d="m 357,302 -8,8 -8,-8 z"
- style="fill:url(#linearGradient25383-9);fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- inkscape:transform-center-x="-4"
- sodipodi:nodetypes="cccc"
- id="path25377-0"
- d="m 357,318 -8,-8 8,-8 z"
- style="fill:url(#linearGradient25385-1);fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- inkscape:transform-center-y="4"
- sodipodi:nodetypes="cccc"
- id="path25379-3"
- d="m 341,318 8,-8 8,8 z"
- style="fill:url(#linearGradient25387-9);fill-rule:evenodd;stroke:none" />
- </g>
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16595"
- id="linearGradient25383-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="rotate(90,339,299)"
- x1="342"
- y1="288.5"
- x2="344.5"
- y2="288.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16595"
- id="linearGradient25385-1"
- gradientUnits="userSpaceOnUse"
- gradientTransform="rotate(180,349.5,299.5)"
- x1="342"
- y1="288.5"
- x2="344.5"
- y2="288.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient16595"
- id="linearGradient25387-9"
- gradientUnits="userSpaceOnUse"
- gradientTransform="rotate(-90,360,300)"
- x1="342"
- y1="288.5"
- x2="344.5"
- y2="288.5" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask25369-1-6">
- <g
- id="g25371-3-4"
- transform="translate(-21,-21)">
- <path
- inkscape:connector-curvature="0"
- style="fill:url(#linearGradient25381);fill-rule:evenodd;stroke:none"
- d="m 341,302 8,8 -8,8 z"
- id="path25373-1-0"
- sodipodi:nodetypes="cccc"
- inkscape:transform-center-x="4" />
- <path
- inkscape:connector-curvature="0"
- inkscape:transform-center-y="-4"
- sodipodi:nodetypes="cccc"
- id="path25375-1-0"
- d="m 357,302 -8,8 -8,-8 z"
- style="fill:url(#linearGradient25383-9);fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- inkscape:transform-center-x="-4"
- sodipodi:nodetypes="cccc"
- id="path25377-0-4"
- d="m 357,318 -8,-8 8,-8 z"
- style="fill:url(#linearGradient25385-1);fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- inkscape:transform-center-y="4"
- sodipodi:nodetypes="cccc"
- id="path25379-3-6"
- d="m 341,318 8,-8 8,8 z"
- style="fill:url(#linearGradient25387-9);fill-rule:evenodd;stroke:none" />
- </g>
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient15405"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-19,294.91429)"
- x1="461.66425"
- y1="16.23234"
- x2="432.875"
- y2="14.936845" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient15407"
- gradientUnits="userSpaceOnUse"
- x1="62.793919"
- y1="133.73566"
- x2="64.109718"
- y2="135.18265" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-36-6-5"
- id="linearGradient15602"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(144,188)"
- x1="209"
- y1="238"
- x2="226.625"
- y2="251.71078" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18495"
- id="radialGradient27973-2-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.39459,-0.991726,0.917787,0.36517,234.80511,750.0215)"
- cx="450.06522"
- cy="25.190212"
- fx="450.06522"
- fy="25.190212"
- r="5.5" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134"
- id="radialGradient27975-7-6"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.121304,-0.696283,0.871429,0.151818,359.51331,621.7)"
- cx="450.72842"
- cy="19.250505"
- fx="450.72842"
- fy="19.250505"
- r="5.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610"
- id="linearGradient17086"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-19,294.91429)"
- x1="461.66425"
- y1="16.23234"
- x2="432.875"
- y2="14.936845" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient17088"
- gradientUnits="userSpaceOnUse"
- x1="62.793919"
- y1="133.73566"
- x2="64.109718"
- y2="135.18265" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient17090"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,883.51417,295)"
- x1="456.81198"
- y1="15.545153"
- x2="441.9628"
- y2="13.21724" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-36-6-5"
- id="linearGradient17092"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(144,188)"
- x1="209"
- y1="238"
- x2="226.625"
- y2="251.71078" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18495"
- id="radialGradient27973-2-2-2"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.39459,-0.991726,0.917787,0.36517,234.80511,750.0215)"
- cx="450.06522"
- cy="25.190212"
- fx="450.06522"
- fy="25.190212"
- r="5.5" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134"
- id="radialGradient27975-7-6-7"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.121304,-0.696283,0.871429,0.151818,359.51331,621.7)"
- cx="450.72842"
- cy="19.250505"
- fx="450.72842"
- fy="19.250505"
- r="5.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient17532"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,883.51417,295)"
- x1="456.81198"
- y1="15.545153"
- x2="441.9628"
- y2="13.21724" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-36-6-5"
- id="linearGradient17534"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(144,188)"
- x1="209"
- y1="238"
- x2="226.625"
- y2="251.71078" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-36-6-5"
- id="linearGradient17536"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(144,188)"
- x1="209"
- y1="238"
- x2="226.625"
- y2="251.71078" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18495"
- id="radialGradient27973-2-2-2-0"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.39459,-0.991726,0.917787,0.36517,234.80511,750.0215)"
- cx="450.06522"
- cy="25.190212"
- fx="450.06522"
- fy="25.190212"
- r="5.5" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18134"
- id="radialGradient27975-7-6-7-4"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.121304,-0.696283,0.871429,0.151818,359.51331,621.7)"
- cx="450.72842"
- cy="19.250505"
- fx="450.72842"
- fy="19.250505"
- r="5.5" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient17802"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-1,0,0,1,883.51417,295)"
- x1="456.81198"
- y1="15.545153"
- x2="441.9628"
- y2="13.21724" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-36-6-5"
- id="linearGradient17804"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(144,188)"
- x1="209"
- y1="238"
- x2="226.625"
- y2="251.71078" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient18495"
- id="radialGradient45309-02"
- cx="336.42892"
- cy="611.10455"
- fx="336.42892"
- fy="611.10455"
- r="5.9852905"
- gradientTransform="matrix(1.0070601,0.03386866,-0.03770425,1.1211085,20.665977,-85.772965)"
- gradientUnits="userSpaceOnUse" />
- <filter
- style="color-interpolation-filters:sRGB"
- inkscape:collect="always"
- id="filter24186-3-2-2"
- x="-0.12810811"
- width="1.2562162"
- y="-0.11285714"
- height="1.2257143">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.395"
- id="feGaussianBlur24188-3-7-2" />
- </filter>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-9-1"
- id="linearGradient42578"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(301.02752,449.99999)"
- x1="25.963812"
- y1="155.66899"
- x2="29.972469"
- y2="168" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1610-06-1-5"
- id="linearGradient42580"
- gradientUnits="userSpaceOnUse"
- x1="335.96875"
- y1="607.09375"
- x2="337.04251"
- y2="628.20752" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15859-1-3"
- id="linearGradient42617"
- gradientUnits="userSpaceOnUse"
- x1="12.602254"
- y1="206.13333"
- x2="26.167894"
- y2="220.66356" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient48327-1"
- id="radialGradient42840"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.4461753,0.01083717,0.0036163,6.752143,-191.34795,-740.3814)"
- cx="131.99811"
- cy="126.63337"
- fx="131.99811"
- fy="126.63337"
- r="9.1978254" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10069-74-1"
- id="linearGradient42842"
- gradientUnits="userSpaceOnUse"
- x1="125.20553"
- y1="111.38132"
- x2="132.35237"
- y2="118.69846" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-7409-3-7"
- id="linearGradient42844"
- gradientUnits="userSpaceOnUse"
- x1="130.60338"
- y1="115.87343"
- x2="143.88347"
- y2="129.27184" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319-7409-3-7"
- id="linearGradient42846"
- gradientUnits="userSpaceOnUse"
- x1="125.81818"
- y1="111.81818"
- x2="143.88347"
- y2="129.27184" />
- <filter
- style="color-interpolation-filters:sRGB"
- inkscape:collect="always"
- x="-0.71999419"
- width="2.4399884"
- y="-0.72000581"
- height="2.4400115"
- id="filter31351-7">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.83077614"
- id="feGaussianBlur31353-1" />
- </filter>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask43822-7">
- <rect
- y="208"
- x="754"
- height="9"
- width="12"
- id="rect43824-6"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.93999993;fill:url(#linearGradient43826);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new" />
- </mask>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37542"
- id="linearGradient43187"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.888889,0,0,1,61.53822,346.48241)"
- x1="246.89435"
- y1="-4.4418921"
- x2="277.68143"
- y2="30.743095" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient319"
- id="linearGradient43189"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(218.01612,129)"
- x1="87.03125"
- y1="241"
- x2="92.8125"
- y2="245.625" />
- <mask
- maskUnits="userSpaceOnUse"
- id="mask43822-5">
- <rect
- y="208"
- x="754"
- height="9"
- width="12"
- id="rect43824-61"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.93999993;fill:url(#linearGradient43826);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new" />
- </mask>
- <mask
- maskUnits="userSpaceOnUse"
- id="mask43822-7-6">
- <rect
- y="208"
- x="754"
- height="9"
- width="12"
- id="rect43824-6-2"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.93999993;fill:url(#linearGradient43826);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new" />
- </mask>
+
+
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="linearGradient23595" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,1.1666667,-737,357.33333)" x1="771.0965" y1="354.28479" x2="772" y2="358.85715"/>
+ <linearGradient id="linearGradient23647">
+ <stop style="stop-color:white;stop-opacity:1;" offset="0" id="stop23649"/>
+ <stop style="stop-color:black;stop-opacity:1;" offset="1" id="stop23651"/>
+ </linearGradient>
+ <linearGradient id="linearGradient48327-1">
+ <stop style="stop-color:black;stop-opacity:0;" offset="0" id="stop48329-23"/>
+ <stop style="stop-color:black;stop-opacity:1;" offset="1" id="stop48331-3"/>
+ </linearGradient>
+ <linearGradient id="linearGradient15425-4-9-8">
+ <stop style="stop-color:#960000;stop-opacity:1;" offset="0" id="stop15427-5-8-24"/>
+ <stop style="stop-color:#c80000;stop-opacity:0;" offset="1" id="stop15429-8-2-5"/>
+ </linearGradient>
+
+
+
+
+
+
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="linearGradient25573" gradientUnits="userSpaceOnUse" gradientTransform="translate(-1,21)" x1="342" y1="288.5" x2="344.01321" y2="288.5"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="linearGradient25575" gradientUnits="userSpaceOnUse" gradientTransform="rotate(90,339,299)" x1="342" y1="288.5" x2="344.5" y2="288.5"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="linearGradient25577" gradientUnits="userSpaceOnUse" gradientTransform="rotate(180,349.5,299.5)" x1="342" y1="288.5" x2="344.5" y2="288.5"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="linearGradient25579" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-90,360,300)" x1="342" y1="288.5" x2="344.5" y2="288.5"/>
+
+ <linearGradient id="linearGradient31356">
+ <stop id="stop31358" offset="0" style="stop-color:#1a1a1a;stop-opacity:1"/>
+ <stop id="stop31360" offset="1" style="stop-color:#1a1a1a;stop-opacity:0;"/>
+ </linearGradient>
+
+
+
+
+
+
+ <linearGradient gradientUnits="userSpaceOnUse" y2="91.058184" x2="56.916232" y1="91.058184" x1="45.115946" gradientTransform="matrix(0.99964634,0,0,1.0003538,-3.0966264e-8,-3.9490267e-6)" id="linearGradient23512">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop23508"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop23510"/>
+ </linearGradient>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient17073" id="linearGradient23615" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.728189,0,0,1.727271,-142.53857,-4.802156)" x1="110.16959" y1="57.061836" x2="117.55341" y2="64.995972"/>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient52641-2-8-6" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.39420438,-0.08239205,0.27256031,1.3040635,-361.27885,-161.73915)" cx="-302.79681" cy="462.0358" fx="-302.79681" fy="462.0358" r="8"/>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient52883-6-8-3" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.39420438,-0.08239205,0.27256031,1.3040635,-362.22886,-161.73912)" cx="-302.79681" cy="462.0358" fx="-302.79681" fy="462.0358" r="8"/>
+
+
+
+
+
+
+
+
+
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient48820-9-2" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,1.0769231,0,5.9230769)" cx="-31" cy="-83.5" fx="-31" fy="-83.5" r="6.5"/>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient24837" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,1.0769231,0,5.9230769)" cx="-31" cy="-83.5" fx="-31" fy="-83.5" r="6.5"/>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient28589-9-2" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,1.0769231,0,5.9230769)" cx="-30.28125" cy="-84.341515" fx="-30.28125" fy="-84.341515" r="6.5"/>
+
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient45877-1-9" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1099414,-0.9422316,0.4519816,0.05273803,38.220416,-152.21215)" cx="-25.452209" cy="-136.46503" fx="-25.452209" fy="-136.46503" r="8.0066185"/>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient45451-2-8" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.9952162,167.99999,-60.91415)" cx="59.000011" cy="440.0191" fx="59.000011" fy="440.0191" r="6.5080619"/>
+
+
+
+
+
+
+
+
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient25025-8-0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.8918342,0,0,0.8918344,-15.699877,27.900732)" cx="49" cy="254.64285" fx="49" fy="254.64285" r="6.5"/>
+
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient31865" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.986122,0,0,0.986122,2.8033684,0.804927)" cx="202" cy="58" fx="202" fy="58" r="7"/>
+
+
+ <linearGradient id="linearGradient23974-3-78-2">
+ <stop id="stop23976-6-5-7" offset="0" style="stop-color:#a3a3a3;stop-opacity:1"/>
+ <stop id="stop23978-2-4-4" offset="1" style="stop-color:#ffffff;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient23705">
+ <stop id="stop23707" offset="0" style="stop-color:#d4d2bf;stop-opacity:1;"/>
+ <stop id="stop23709" offset="1" style="stop-color:#857f5d;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient24168">
+ <stop id="stop24170" offset="0" style="stop-color:#182437;stop-opacity:1;"/>
+ <stop id="stop24172" offset="1" style="stop-color:#2b4163;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient18906">
+ <stop id="stop18904" offset="0" style="stop-color:#ffb36b;stop-opacity:1"/>
+ <stop style="stop-color:#ff982a;stop-opacity:1;" offset="0.6832175" id="stop18902"/>
+ <stop id="stop18900" offset="1" style="stop-color:#b45d00;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient17438">
+ <stop style="stop-color:#ff9f37;stop-opacity:1" offset="0" id="stop17440"/>
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="1" id="stop17442"/>
+ </linearGradient>
+ <linearGradient id="linearGradient17596">
+ <stop style="stop-color:#ee7b00;stop-opacity:1" offset="0" id="stop17598"/>
+ <stop style="stop-color:#ffc280;stop-opacity:1" offset="1" id="stop17600"/>
+ </linearGradient>
+ <linearGradient id="linearGradient17602">
+ <stop id="stop17604" offset="0" style="stop-color:#592e00;stop-opacity:1"/>
+ <stop id="stop17606" offset="1" style="stop-color:#9e5200;stop-opacity:0.57431373"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37925">
+ <stop id="stop37927" offset="0" style="stop-color:#e7cbab;stop-opacity:1;"/>
+ <stop id="stop37929" offset="1" style="stop-color:#af7333;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient23906">
+ <stop id="stop23908" offset="0" style="stop-color:#ff921d;stop-opacity:1;"/>
+ <stop id="stop23910" offset="1" style="stop-color:#ffa751;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient24101">
+ <stop style="stop-color:#643400;stop-opacity:1;" offset="0" id="stop24103"/>
+ <stop id="stop24105" offset="0.22606115" style="stop-color:#ed983d;stop-opacity:1;"/>
+ <stop style="stop-color:#fff0d5;stop-opacity:1;" offset="1" id="stop24107"/>
+ </linearGradient>
+ <linearGradient id="linearGradient23302">
+ <stop id="stop23304" offset="0" style="stop-color:#b45d00;stop-opacity:1;"/>
+ <stop style="stop-color:#ff982a;stop-opacity:1;" offset="0.39332664" id="stop23306"/>
+ <stop id="stop23308" offset="1" style="stop-color:#ffedd5;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient24081">
+ <stop id="stop24083" offset="0" style="stop-color:#b45d00;stop-opacity:1;"/>
+ <stop style="stop-color:#ff982a;stop-opacity:1;" offset="0.3167825" id="stop24085"/>
+ <stop id="stop24087" offset="1" style="stop-color:#ffedd5;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient20324">
+ <stop id="stop20326" offset="0" style="stop-color:#35241b;stop-opacity:1;"/>
+ <stop style="stop-color:#69390e;stop-opacity:0.8392157;" offset="0.17637014" id="stop20328"/>
+ <stop style="stop-color:#6c5b15;stop-opacity:0.67843139;" offset="0.35274029" id="stop20330"/>
+ <stop id="stop20332" offset="1" style="stop-color:#947b15;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient35391">
+ <stop id="stop35393" offset="0" style="stop-color:#322800;stop-opacity:1;"/>
+ <stop id="stop35395" offset="1" style="stop-color:#6e4800;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient14219">
+ <stop id="stop14221" offset="0" style="stop-color:#ff8605;stop-opacity:1;"/>
+ <stop id="stop14223" offset="1" style="stop-color:#9c6700;stop-opacity:0;"/>
+ </linearGradient>
+
+
+
+ <radialGradient id="radialGradient16824-1-2" cx="20.892099" cy="64.567902" r="5.257" fx="20.892099" fy="64.567902" gradientUnits="userSpaceOnUse">
+ <stop offset="0" style="stop-color:#b7b7b7;stop-opacity:1;" id="stop16826-5-7"/>
+ <stop id="stop16828-2-0" style="stop-color:#646464;stop-opacity:1;" offset="0.50338405"/>
+ <stop offset="1" style="stop-color:#b7b7b7;stop-opacity:1;" id="stop16830-7-0"/>
+ </radialGradient>
+
+
+ <linearGradient id="linearGradient24143-0">
+ <stop id="stop24145-0" offset="0" style="stop-color:#2c2c2c;stop-opacity:1;"/>
+ <stop style="stop-color:#b3b3b3;stop-opacity:1;" offset="0.5" id="stop24669-1"/>
+ <stop id="stop24147-4" offset="1" style="stop-color:#ffffff;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient40809">
+ <stop style="stop-color:#0059d7;stop-opacity:1;" offset="0" id="stop40811"/>
+ <stop style="stop-color:#b7d4ff;stop-opacity:1;" offset="1" id="stop40813"/>
+ </linearGradient>
+ <linearGradient id="linearGradient38796-7-9">
+ <stop style="stop-color:#fc9694;stop-opacity:1;" offset="0" id="stop38798-6-8"/>
+ <stop style="stop-color:#e71609;stop-opacity:1;" offset="1" id="stop38800-1-8"/>
+ </linearGradient>
+
+ <linearGradient id="linearGradient35407">
+ <stop id="stop35409" offset="0" style="stop-color:#a17306;stop-opacity:1;"/>
+ <stop style="stop-color:#cca649;stop-opacity:1;" offset="0.43277758" id="stop35411"/>
+ <stop id="stop35413" offset="1" style="stop-color:#f9f5e9;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="linearGradient14472" gradientUnits="userSpaceOnUse" x1="80.768944" y1="504.67188" x2="76.885078" y2="501.58331"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="linearGradient14474" gradientUnits="userSpaceOnUse" x1="89.526657" y1="511.42972" x2="78.000008" y2="501.04794"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="radialGradient14476" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.4624192,0,0,1.4467089,-36.975824,-224.99718)" cx="79.959885" cy="503.81497" fx="79.959885" fy="503.81497" r="2.9089756"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient14262" id="radialGradient14478" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.8886193,0.8021825,-0.8051059,0.8972684,411.80247,-8.668512)" cx="74.518959" cy="499.99969" fx="74.518959" fy="499.99969" r="3.1650217"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="radialGradient28864" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.4624192,0,0,1.4467089,-36.975824,-224.99718)" cx="79.959885" cy="503.81497" fx="79.959885" fy="503.81497" r="2.9089756"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient14262" id="radialGradient28872" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.8886193,0.8021825,-0.8051059,0.8972684,411.80247,-8.668512)" cx="74.518959" cy="499.99969" fx="74.518959" fy="499.99969" r="3.1650217"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="radialGradient28896" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.4624192,0,0,1.4467089,-36.975824,-224.99718)" cx="79.959885" cy="503.81497" fx="79.959885" fy="503.81497" r="2.9089756"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient14262" id="radialGradient28904" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.8886193,0.8021825,-0.8051059,0.8972684,411.80247,-8.668512)" cx="74.518959" cy="499.99969" fx="74.518959" fy="499.99969" r="3.1650217"/>
+
+ <linearGradient id="linearGradient39080">
+ <stop style="stop-color:#1a2a3d;stop-opacity:1;" offset="0" id="stop39082"/>
+ <stop id="stop39084" offset="0.5" style="stop-color:#95b0d1;stop-opacity:1;"/>
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="1" id="stop39086"/>
+ </linearGradient>
+ <linearGradient id="linearGradient37623">
+ <stop id="stop37625" offset="0" style="stop-color:#e5e1ca;stop-opacity:1;"/>
+ <stop id="stop37627" offset="1" style="stop-color:#d6ca22;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient19625">
+ <stop id="stop19627" offset="0" style="stop-color:#2258a6;stop-opacity:1;"/>
+ <stop id="stop19629" offset="1" style="stop-color:#c1d7f8;stop-opacity:1;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient12678">
+ <stop id="stop12680" offset="0" style="stop-color:#d40000;stop-opacity:1"/>
+ <stop id="stop12682" offset="1" style="stop-color:#000000;stop-opacity:0;"/>
+ </linearGradient>
+ <linearGradient id="linearGradient71814">
+ <stop style="stop-color:#6e0d00;stop-opacity:1;" offset="0" id="stop71816"/>
+ <stop style="stop-color:#6f2913;stop-opacity:0;" offset="1" id="stop71818"/>
+ </linearGradient>
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="linearGradient57454" gradientUnits="userSpaceOnUse" gradientTransform="translate(258.00306,-231.00101)" x1="75.25" y1="393.25" x2="73.5" y2="391.5"/>
+
+
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="linearGradient38478" gradientUnits="userSpaceOnUse" gradientTransform="translate(254.01612,-211.00101)" x1="96.824379" y1="393.90298" x2="94.246101" y2="391.21976"/>
+ <linearGradient id="linearGradient4138">
+ <stop style="stop-color:#6c432f;stop-opacity:1;" offset="0" id="stop4140"/>
+ <stop style="stop-color:#c0966d;stop-opacity:1;" offset="1" id="stop4142"/>
+ </linearGradient>
+ <linearGradient id="linearGradient38831">
+ <stop style="stop-color:#182b42;stop-opacity:1;" offset="0" id="stop38833"/>
+ <stop id="stop38836" offset="0.38971797" style="stop-color:#598ac7;stop-opacity:1;"/>
+ <stop style="stop-color:#f1f1f1;stop-opacity:1;" offset="1" id="stop38838"/>
+ </linearGradient>
+
+ <linearGradient id="linearGradient18056">
+ <stop id="stop18058" offset="0" style="stop-color:#162d50;stop-opacity:1"/>
+ <stop id="stop18060" offset="1" style="stop-color:#295498;stop-opacity:0.34057972;"/>
+ </linearGradient>
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="linearGradient23199" gradientUnits="userSpaceOnUse" gradientTransform="translate(-1)" x1="22.75" y1="245" x2="24.5" y2="245"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="linearGradient23201" gradientUnits="userSpaceOnUse" gradientTransform="translate(-61)" x1="22.75" y1="245" x2="24.25" y2="245"/>
+ <linearGradient id="linearGradient24695">
+ <stop style="stop-color:#3d361a;stop-opacity:1;" offset="0" id="stop24697"/>
+ <stop id="stop24699" offset="0.60401857" style="stop-color:#d1c595;stop-opacity:1;"/>
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="1" id="stop24701"/>
+ </linearGradient>
+ <linearGradient id="linearGradient22556">
+ <stop id="stop22558" offset="0" style="stop-color:#6a9bef;stop-opacity:1"/>
+ <stop style="stop-color:#bccee8;stop-opacity:0.58450705;" offset="0.77941167" id="stop22568"/>
+ <stop id="stop22560" offset="1" style="stop-color:#ccdaed;stop-opacity:0;"/>
+ </linearGradient>
+
+ <linearGradient id="linearGradient4343-1-1-9-1">
+ <stop id="stop4345-2-9-5-6" offset="0" style="stop-color:white;stop-opacity:1;"/>
+ <stop id="stop4347-1-5-5-1" offset="1" style="stop-color:#fff9f9;stop-opacity:0;"/>
+ </linearGradient>
+
+
+
+
+ <linearGradient gradientUnits="userSpaceOnUse" y2="91.058182" x2="56.916233" y1="91.058182" x1="45.115948" gradientTransform="matrix(0.99964634,0,0,1.0003538,-3.0966264e-8,-8.1179537e-6)" id="linearGradient23512-7">
+ <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop23508-4"/>
+ <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop23510-3"/>
+ </linearGradient>
+
+
+
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient48820-9-2-1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,1.0769231,0,5.9230769)" cx="-31" cy="-83.5" fx="-31" fy="-83.5" r="6.5"/>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient55620" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,1.0769231,0,5.9230769)" cx="-31" cy="-83.5" fx="-31" fy="-83.5" r="6.5"/>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient28589-9-2-0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,1.0769231,0,5.9230769)" cx="-30.28125" cy="-84.341515" fx="-30.28125" fy="-84.341515" r="6.5"/>
+
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient45877-1-9-2" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1099414,-0.9422316,0.4519816,0.05273803,38.220416,-152.21215)" cx="-25.452209" cy="-136.46503" fx="-25.452209" fy="-136.46503" r="8.0066185"/>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient45451-2-8-4" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.9952162,167.99999,-60.91415)" cx="59.000011" cy="440.0191" fx="59.000011" fy="440.0191" r="6.5080619"/>
+
+
+
+
+
+
+
+
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient25025-8-0-1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.8918342,0,0,0.8918344,-15.699877,27.900732)" cx="49" cy="254.64285" fx="49" fy="254.64285" r="6.5"/>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient52641-2-8-6-3" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.39420438,-0.08239205,0.27256031,1.3040635,-361.27885,-161.73915)" cx="-302.79681" cy="462.0358" fx="-302.79681" fy="462.0358" r="8"/>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient52883-6-8-3-0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.39420438,-0.08239205,0.27256031,1.3040635,-362.22886,-161.73912)" cx="-302.79681" cy="462.0358" fx="-302.79681" fy="462.0358" r="8"/>
+
+
+
+
+
+
+
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="linearGradient34189-1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.695652,0,0,0.869703,170.06515,482.33642)" x1="188.77448" y1="259.745" x2="164.0939" y2="242.22473"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="linearGradient34191-9" gradientUnits="userSpaceOnUse" gradientTransform="translate(572.00001,970)" x1="-287.75" y1="-276.75" x2="-276" y2="-264.875"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="linearGradient40879-9-8-1-3" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.608695,0,0,0.760996,188.8695,512.23032)" x1="130.70929" y1="210.78392" x2="171.50414" y2="248.54021"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="linearGradient34193-9" gradientUnits="userSpaceOnUse" gradientTransform="translate(576.00001,973)" x1="-283" y1="-272" x2="-277.01501" y2="-267.26749"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient18495" id="radialGradient40883-4-0-3-9" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-0.06118084,-0.8594818,2.4629674,-0.1753088,-44.40057,787.15309)" cx="77.721619" cy="104.09358" fx="77.721619" fy="104.09358" r="3.9999998"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient24562" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0474269,0.00526965,-0.00503098,0.9999873,209.98584,104.8287)" cx="27.411026" cy="255.58899" fx="27.411026" fy="255.58899" r="5.9250002"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient22563" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0474269,0.00526965,-0.00503098,0.9999873,209.98584,104.8287)" cx="27.411026" cy="255.58899" fx="27.411026" fy="255.58899" r="5.9250002"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient22577" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0474269,0.00526965,-0.00503098,0.9999873,209.98584,104.8287)" cx="27.411026" cy="255.58899" fx="27.411026" fy="255.58899" r="5.9250002"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="linearGradient22732-4" gradientUnits="userSpaceOnUse" x1="496.49335" y1="537.78113" x2="498.40021" y2="540.13623" gradientTransform="translate(42.000001,63)"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="linearGradient22781" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-0.99999997,0,0,0.99999996,-2.7720701e-6,20.999999)" x1="496.49335" y1="537.78113" x2="498.40021" y2="540.13623"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="linearGradient22785" gradientUnits="userSpaceOnUse" gradientTransform="translate(21,42)" x1="496.49335" y1="537.78113" x2="498.40021" y2="540.13623"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="linearGradient22785-7" gradientUnits="userSpaceOnUse" gradientTransform="translate(21,42)" x1="496.49335" y1="537.78113" x2="498.40021" y2="540.13623"/>
+ <linearGradient inkscape:collect="always" xlink:href="#linearGradient11146" id="linearGradient22939" gradientUnits="userSpaceOnUse" gradientTransform="translate(21,42)" x1="496.49335" y1="537.78113" x2="498.40021" y2="540.13623"/>
+
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient12953" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.891843,0,0,0.909224,-152.50957,149.2592)" cx="350.5" cy="14.5" fx="350.5" fy="14.5" r="6.9000001"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient22596" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0474269,0.00526965,-0.00503098,0.9999873,209.98584,83.828695)" cx="27.411026" cy="255.58899" fx="27.411026" fy="255.58899" r="5.9250002"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient22598" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0474269,0.00526965,-0.00503098,0.9999873,209.98584,83.828695)" cx="27.411026" cy="255.58899" fx="27.411026" fy="255.58899" r="5.9250002"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient16595" id="radialGradient22600" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0474269,0.00526965,-0.00503098,0.9999873,209.98584,83.828695)" cx="27.411026" cy="255.58899" fx="27.411026" fy="255.58899" r="5.9250002"/>
</defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10000"
- objecttolerance="10000"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="2.499733"
- inkscape:cx="368.97199"
- inkscape:cy="160.72383"
- inkscape:document-units="px"
- inkscape:current-layer="ICON_LIBRARY_DATA_DIRECT-3"
- showgrid="true"
- inkscape:window-width="1920"
- inkscape:window-height="981"
- inkscape:window-x="0"
- inkscape:window-y="28"
- inkscape:snap-nodes="true"
- inkscape:snap-bbox="true"
- showguides="true"
- inkscape:guide-bbox="true"
- inkscape:object-nodes="false"
- inkscape:object-paths="false"
- inkscape:snap-intersection-line-segments="true"
- inkscape:snap-intersection-grid-guide="false"
- inkscape:window-maximized="1"
- inkscape:bbox-paths="false"
- inkscape:snap-global="true"
- inkscape:snap-bbox-midpoints="false"
- inkscape:snap-grids="false"
- inkscape:snap-to-guides="false"
- inkscape:snap-page="false"
- units="pt"
- inkscape:snap-center="false"
- inkscape:snap-object-midpoints="true"
- inkscape:snap-midpoints="false"
- inkscape:snap-others="false">
- <inkscape:grid
- type="xygrid"
- id="grid17394"
- visible="true"
- enabled="true"
- spacingx="0.25"
- spacingy="0.25"
- empspacing="4"
- color="#808080"
- opacity="0.09803922"
- dotted="false"
- empcolor="#7f7f7f"
- empopacity="0.25098039"
- snapvisiblegridlinesonly="true"
- originx="0"
- originy="-2.7755576e-17" />
- </sodipodi:namedview>
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title>Blender icons v. 2.5.08</dc:title>
- <dc:date>21.05.2012</dc:date>
- <dc:creator>
- <cc:Agent>
- <dc:title>Andrzej Ambroż</dc:title>
- </cc:Agent>
- </dc:creator>
- <dc:rights>
- <cc:Agent>
- <dc:title>Andrzej Ambroż</dc:title>
- </cc:Agent>
- </dc:rights>
- <dc:publisher>
- <cc:Agent>
- <dc:title>Andrzej Ambroż</dc:title>
- </cc:Agent>
- </dc:publisher>
- <dc:coverage />
- <cc:license
- rdf:resource="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html" />
- <dc:description>GNU General Public License, version 2 or later.</dc:description>
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:groupmode="layer"
- id="layer3"
- inkscape:label="bckgrnd"
- style="display:none"
- sodipodi:insensitive="true">
- <rect
- style="fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect20607"
- width="1083.874"
- height="650"
- x="-4"
- y="-4" />
+
+
+ <path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" id="path23417" sodipodi:nodetypes="cc" d=""/>
+ <path style="fill:none;stroke:#ffffff;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" id="path23347" sodipodi:nodetypes="cc" d=""/>
+ <g inkscape:groupmode="layer" id="layer5" inkscape:label="grid" style="display:inline;opacity:0.3" sodipodi:insensitive="true">
+ <g id="g40174" transform="translate(0,2)">
+ <g id="g22995">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect22955" width="1" height="7" x="422" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="401" height="7" width="1" id="rect22957" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect22959" width="1" height="7" x="380" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="359" height="7" width="1" id="rect22961" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect22963" width="1" height="7" x="338" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="317" height="7" width="1" id="rect22965" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect22967" width="1" height="7" x="296" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="275" height="7" width="1" id="rect22969" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect22971" width="1" height="7" x="254" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="233" height="7" width="1" id="rect22973" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect22975" width="1" height="7" x="212" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="191" height="7" width="1" id="rect22977" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect22979" width="1" height="7" x="170" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="149" height="7" width="1" id="rect22981" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect22983" width="1" height="7" x="128" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="107" height="7" width="1" id="rect22985" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect22987" width="1" height="7" x="86" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="65" height="7" width="1" id="rect22989" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect22991" width="1" height="7" x="44" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="23" height="7" width="1" id="rect22993" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect ry="0" rx="0" y="0" x="506" height="7" width="1" id="rect23024" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect23026" width="1" height="7" x="485" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="464" height="7" width="1" id="rect23028" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect23030" width="1" height="7" x="443" y="0" rx="0" ry="0"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect10985" width="1" height="7" x="527" y="0" rx="0" ry="0"/>
+ </g>
+ <g id="g24954">
+ <g id="g23711" transform="translate(0,462)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect23713" width="6" height="1" x="0" y="26" rx="0" ry="0"/>
+ <g id="g23715">
+ <path id="path23717" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23719" inkscape:connector-curvature="0"/>
+ <path id="path23721" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23723" inkscape:connector-curvature="0"/>
+ <path id="path23725" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23727" inkscape:connector-curvature="0"/>
+ <path id="path23729" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23731" inkscape:connector-curvature="0"/>
+ <path id="path23733" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23735" inkscape:connector-curvature="0"/>
+ <path id="path23737" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23739" inkscape:connector-curvature="0"/>
+ <path id="path23741" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23743" inkscape:connector-curvature="0"/>
+ <path id="path23745" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23747" inkscape:connector-curvature="0"/>
+ <path id="path23749" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23751" inkscape:connector-curvature="0"/>
+ <path id="path23753" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23755" inkscape:connector-curvature="0"/>
+ <path id="path23757" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23759" inkscape:connector-curvature="0"/>
+ <path id="path23761" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23763" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path10987" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g23765" transform="translate(0,441)">
+ <rect ry="0" rx="0" y="26" x="0" height="1" width="6" id="rect23767" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <g id="g23769">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23771" inkscape:connector-curvature="0"/>
+ <path id="path23773" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23775" inkscape:connector-curvature="0"/>
+ <path id="path23777" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23779" inkscape:connector-curvature="0"/>
+ <path id="path23781" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23783" inkscape:connector-curvature="0"/>
+ <path id="path23785" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23787" inkscape:connector-curvature="0"/>
+ <path id="path23789" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23791" inkscape:connector-curvature="0"/>
+ <path id="path23793" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23795" inkscape:connector-curvature="0"/>
+ <path id="path23797" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23799" inkscape:connector-curvature="0"/>
+ <path id="path23801" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23803" inkscape:connector-curvature="0"/>
+ <path id="path23805" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23807" inkscape:connector-curvature="0"/>
+ <path id="path23809" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23811" inkscape:connector-curvature="0"/>
+ <path id="path23813" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23815" inkscape:connector-curvature="0"/>
+ <path id="path23817" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10990" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g23819" transform="translate(0,420)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect23821" width="6" height="1" x="0" y="26" rx="0" ry="0"/>
+ <g id="g23823">
+ <path id="path23825" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23827" inkscape:connector-curvature="0"/>
+ <path id="path23829" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23831" inkscape:connector-curvature="0"/>
+ <path id="path23833" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23835" inkscape:connector-curvature="0"/>
+ <path id="path23837" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23839" inkscape:connector-curvature="0"/>
+ <path id="path23841" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23843" inkscape:connector-curvature="0"/>
+ <path id="path23845" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23847" inkscape:connector-curvature="0"/>
+ <path id="path23849" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23851" inkscape:connector-curvature="0"/>
+ <path id="path23853" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23855" inkscape:connector-curvature="0"/>
+ <path id="path23857" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23859" inkscape:connector-curvature="0"/>
+ <path id="path23861" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23863" inkscape:connector-curvature="0"/>
+ <path id="path23865" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23867" inkscape:connector-curvature="0"/>
+ <path id="path23869" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23871" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path10992" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g23873" transform="translate(0,399)">
+ <rect ry="0" rx="0" y="26" x="0" height="1" width="6" id="rect23875" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <g id="g23877">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23879" inkscape:connector-curvature="0"/>
+ <path id="path23881" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23883" inkscape:connector-curvature="0"/>
+ <path id="path23885" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23887" inkscape:connector-curvature="0"/>
+ <path id="path23889" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23891" inkscape:connector-curvature="0"/>
+ <path id="path23893" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23895" inkscape:connector-curvature="0"/>
+ <path id="path23897" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23899" inkscape:connector-curvature="0"/>
+ <path id="path23901" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23903" inkscape:connector-curvature="0"/>
+ <path id="path23905" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23907" inkscape:connector-curvature="0"/>
+ <path id="path23909" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23911" inkscape:connector-curvature="0"/>
+ <path id="path23913" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23915" inkscape:connector-curvature="0"/>
+ <path id="path23917" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23919" inkscape:connector-curvature="0"/>
+ <path id="path23921" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23923" inkscape:connector-curvature="0"/>
+ <path id="path23925" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10994" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g23927" transform="translate(0,378)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect23929" width="6" height="1" x="0" y="26" rx="0" ry="0"/>
+ <g id="g23931">
+ <path id="path23933" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23935" inkscape:connector-curvature="0"/>
+ <path id="path23937" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23939" inkscape:connector-curvature="0"/>
+ <path id="path23941" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23943" inkscape:connector-curvature="0"/>
+ <path id="path23945" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23947" inkscape:connector-curvature="0"/>
+ <path id="path23949" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23951" inkscape:connector-curvature="0"/>
+ <path id="path23953" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23955" inkscape:connector-curvature="0"/>
+ <path id="path23957" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23959" inkscape:connector-curvature="0"/>
+ <path id="path23961" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23963" inkscape:connector-curvature="0"/>
+ <path id="path23965" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23967" inkscape:connector-curvature="0"/>
+ <path id="path23969" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23971" inkscape:connector-curvature="0"/>
+ <path id="path23973" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23975" inkscape:connector-curvature="0"/>
+ <path id="path23977" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23979" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path10996" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g23981" transform="translate(0,357)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect23983" width="6" height="1" x="0" y="26" rx="0" ry="0"/>
+ <g id="g23985">
+ <path id="path23987" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23989" inkscape:connector-curvature="0"/>
+ <path id="path23991" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23993" inkscape:connector-curvature="0"/>
+ <path id="path23995" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path23997" inkscape:connector-curvature="0"/>
+ <path id="path23999" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24001" inkscape:connector-curvature="0"/>
+ <path id="path24003" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24005" inkscape:connector-curvature="0"/>
+ <path id="path24007" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24009" inkscape:connector-curvature="0"/>
+ <path id="path24011" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24013" inkscape:connector-curvature="0"/>
+ <path id="path24015" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24017" inkscape:connector-curvature="0"/>
+ <path id="path24019" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24021" inkscape:connector-curvature="0"/>
+ <path id="path24023" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24025" inkscape:connector-curvature="0"/>
+ <path id="path24027" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24029" inkscape:connector-curvature="0"/>
+ <path id="path24031" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24033" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path10998" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24035" transform="translate(0,336)">
+ <rect ry="0" rx="0" y="26" x="0" height="1" width="6" id="rect24037" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <g id="g24039">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24041" inkscape:connector-curvature="0"/>
+ <path id="path24043" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24045" inkscape:connector-curvature="0"/>
+ <path id="path24047" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24049" inkscape:connector-curvature="0"/>
+ <path id="path24051" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24053" inkscape:connector-curvature="0"/>
+ <path id="path24055" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24057" inkscape:connector-curvature="0"/>
+ <path id="path24059" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24061" inkscape:connector-curvature="0"/>
+ <path id="path24063" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24065" inkscape:connector-curvature="0"/>
+ <path id="path24067" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24069" inkscape:connector-curvature="0"/>
+ <path id="path24071" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24073" inkscape:connector-curvature="0"/>
+ <path id="path24075" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24077" inkscape:connector-curvature="0"/>
+ <path id="path24079" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24081" inkscape:connector-curvature="0"/>
+ <path id="path24083" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24085" inkscape:connector-curvature="0"/>
+ <path id="path24087" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path11000" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24089" transform="translate(0,315)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect24091" width="6" height="1" x="0" y="26" rx="0" ry="0"/>
+ <g id="g24093">
+ <path id="path24095" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24097" inkscape:connector-curvature="0"/>
+ <path id="path24099" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24101" inkscape:connector-curvature="0"/>
+ <path id="path24103" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24105" inkscape:connector-curvature="0"/>
+ <path id="path24107" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24109" inkscape:connector-curvature="0"/>
+ <path id="path24111" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24113" inkscape:connector-curvature="0"/>
+ <path id="path24115" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24117" inkscape:connector-curvature="0"/>
+ <path id="path24119" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24121" inkscape:connector-curvature="0"/>
+ <path id="path24123" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24125" inkscape:connector-curvature="0"/>
+ <path id="path24127" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24129" inkscape:connector-curvature="0"/>
+ <path id="path24131" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24133" inkscape:connector-curvature="0"/>
+ <path id="path24135" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24137" inkscape:connector-curvature="0"/>
+ <path id="path24139" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24141" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path11002" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24143" transform="translate(0,294)">
+ <rect ry="0" rx="0" y="26" x="0" height="1" width="6" id="rect24145" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <g id="g24147">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24149" inkscape:connector-curvature="0"/>
+ <path id="path24151" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24153" inkscape:connector-curvature="0"/>
+ <path id="path24155" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24157" inkscape:connector-curvature="0"/>
+ <path id="path24159" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24161" inkscape:connector-curvature="0"/>
+ <path id="path24163" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24165" inkscape:connector-curvature="0"/>
+ <path id="path24167" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24169" inkscape:connector-curvature="0"/>
+ <path id="path24171" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24173" inkscape:connector-curvature="0"/>
+ <path id="path24175" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24177" inkscape:connector-curvature="0"/>
+ <path id="path24179" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24181" inkscape:connector-curvature="0"/>
+ <path id="path24183" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24185" inkscape:connector-curvature="0"/>
+ <path id="path24187" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24189" inkscape:connector-curvature="0"/>
+ <path id="path24191" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24193" inkscape:connector-curvature="0"/>
+ <path id="path24195" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path11004" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24197" transform="translate(0,273)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect24199" width="6" height="1" x="0" y="26" rx="0" ry="0"/>
+ <g id="g24201">
+ <path id="path24203" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24205" inkscape:connector-curvature="0"/>
+ <path id="path24207" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24209" inkscape:connector-curvature="0"/>
+ <path id="path24211" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24213" inkscape:connector-curvature="0"/>
+ <path id="path24215" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24217" inkscape:connector-curvature="0"/>
+ <path id="path24219" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24221" inkscape:connector-curvature="0"/>
+ <path id="path24223" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24225" inkscape:connector-curvature="0"/>
+ <path id="path24227" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24229" inkscape:connector-curvature="0"/>
+ <path id="path24231" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24233" inkscape:connector-curvature="0"/>
+ <path id="path24235" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24237" inkscape:connector-curvature="0"/>
+ <path id="path24239" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24241" inkscape:connector-curvature="0"/>
+ <path id="path24243" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24245" inkscape:connector-curvature="0"/>
+ <path id="path24247" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24249" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path11006" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24251" transform="translate(0,252)">
+ <rect ry="0" rx="0" y="26" x="0" height="1" width="6" id="rect24253" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <g id="g24255">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24257" inkscape:connector-curvature="0"/>
+ <path id="path24259" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24261" inkscape:connector-curvature="0"/>
+ <path id="path24263" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24265" inkscape:connector-curvature="0"/>
+ <path id="path24267" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24269" inkscape:connector-curvature="0"/>
+ <path id="path24271" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24273" inkscape:connector-curvature="0"/>
+ <path id="path24275" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24277" inkscape:connector-curvature="0"/>
+ <path id="path24279" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24281" inkscape:connector-curvature="0"/>
+ <path id="path24283" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24285" inkscape:connector-curvature="0"/>
+ <path id="path24287" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24289" inkscape:connector-curvature="0"/>
+ <path id="path24291" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24293" inkscape:connector-curvature="0"/>
+ <path id="path24295" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24297" inkscape:connector-curvature="0"/>
+ <path id="path24299" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24301" inkscape:connector-curvature="0"/>
+ <path id="path24303" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path11008" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24305" transform="translate(0,231)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect24307" width="6" height="1" x="0" y="26" rx="0" ry="0"/>
+ <g id="g24309">
+ <path id="path24311" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24313" inkscape:connector-curvature="0"/>
+ <path id="path24315" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24317" inkscape:connector-curvature="0"/>
+ <path id="path24319" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24321" inkscape:connector-curvature="0"/>
+ <path id="path24323" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24325" inkscape:connector-curvature="0"/>
+ <path id="path24327" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24329" inkscape:connector-curvature="0"/>
+ <path id="path24331" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24333" inkscape:connector-curvature="0"/>
+ <path id="path24335" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24337" inkscape:connector-curvature="0"/>
+ <path id="path24339" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24341" inkscape:connector-curvature="0"/>
+ <path id="path24343" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24345" inkscape:connector-curvature="0"/>
+ <path id="path24347" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24349" inkscape:connector-curvature="0"/>
+ <path id="path24351" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24353" inkscape:connector-curvature="0"/>
+ <path id="path24355" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24357" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path11010" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24359" transform="translate(0,210)">
+ <rect ry="0" rx="0" y="26" x="0" height="1" width="6" id="rect24361" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <g id="g24363">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24365" inkscape:connector-curvature="0"/>
+ <path id="path24367" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24369" inkscape:connector-curvature="0"/>
+ <path id="path24371" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24373" inkscape:connector-curvature="0"/>
+ <path id="path24375" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24377" inkscape:connector-curvature="0"/>
+ <path id="path24379" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24381" inkscape:connector-curvature="0"/>
+ <path id="path24383" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24385" inkscape:connector-curvature="0"/>
+ <path id="path24387" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24389" inkscape:connector-curvature="0"/>
+ <path id="path24391" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24393" inkscape:connector-curvature="0"/>
+ <path id="path24395" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24397" inkscape:connector-curvature="0"/>
+ <path id="path24399" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24401" inkscape:connector-curvature="0"/>
+ <path id="path24403" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24405" inkscape:connector-curvature="0"/>
+ <path id="path24407" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24409" inkscape:connector-curvature="0"/>
+ <path id="path24411" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path11012" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24413" transform="translate(0,189)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect24415" width="6" height="1" x="0" y="26" rx="0" ry="0"/>
+ <g id="g24417">
+ <path id="path24419" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24421" inkscape:connector-curvature="0"/>
+ <path id="path24423" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24425" inkscape:connector-curvature="0"/>
+ <path id="path24427" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24429" inkscape:connector-curvature="0"/>
+ <path id="path24431" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24433" inkscape:connector-curvature="0"/>
+ <path id="path24435" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24437" inkscape:connector-curvature="0"/>
+ <path id="path24439" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24441" inkscape:connector-curvature="0"/>
+ <path id="path24443" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24445" inkscape:connector-curvature="0"/>
+ <path id="path24447" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24449" inkscape:connector-curvature="0"/>
+ <path id="path24451" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24453" inkscape:connector-curvature="0"/>
+ <path id="path24455" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24457" inkscape:connector-curvature="0"/>
+ <path id="path24459" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24461" inkscape:connector-curvature="0"/>
+ <path id="path24463" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24465" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path11014" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24467" transform="translate(0,168)">
+ <rect ry="0" rx="0" y="26" x="0" height="1" width="6" id="rect24469" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <g id="g24471">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24473" inkscape:connector-curvature="0"/>
+ <path id="path24475" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24477" inkscape:connector-curvature="0"/>
+ <path id="path24479" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24481" inkscape:connector-curvature="0"/>
+ <path id="path24483" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24485" inkscape:connector-curvature="0"/>
+ <path id="path24487" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24489" inkscape:connector-curvature="0"/>
+ <path id="path24491" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24493" inkscape:connector-curvature="0"/>
+ <path id="path24495" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24497" inkscape:connector-curvature="0"/>
+ <path id="path24499" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24501" inkscape:connector-curvature="0"/>
+ <path id="path24503" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24505" inkscape:connector-curvature="0"/>
+ <path id="path24507" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24509" inkscape:connector-curvature="0"/>
+ <path id="path24511" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24513" inkscape:connector-curvature="0"/>
+ <path id="path24515" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24517" inkscape:connector-curvature="0"/>
+ <path id="path24519" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path11016" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24521" transform="translate(0,147)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect24523" width="6" height="1" x="0" y="26" rx="0" ry="0"/>
+ <g id="g24525">
+ <path id="path24527" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24529" inkscape:connector-curvature="0"/>
+ <path id="path24531" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24533" inkscape:connector-curvature="0"/>
+ <path id="path24535" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24537" inkscape:connector-curvature="0"/>
+ <path id="path24539" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24541" inkscape:connector-curvature="0"/>
+ <path id="path24543" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24545" inkscape:connector-curvature="0"/>
+ <path id="path24547" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24549" inkscape:connector-curvature="0"/>
+ <path id="path24551" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24553" inkscape:connector-curvature="0"/>
+ <path id="path24555" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24557" inkscape:connector-curvature="0"/>
+ <path id="path24559" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24561" inkscape:connector-curvature="0"/>
+ <path id="path24563" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24565" inkscape:connector-curvature="0"/>
+ <path id="path24567" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24569" inkscape:connector-curvature="0"/>
+ <path id="path24571" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24573" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path11018" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24575" transform="translate(0,126)">
+ <rect ry="0" rx="0" y="26" x="0" height="1" width="6" id="rect24577" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <g id="g24579">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24581" inkscape:connector-curvature="0"/>
+ <path id="path24583" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24585" inkscape:connector-curvature="0"/>
+ <path id="path24587" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24589" inkscape:connector-curvature="0"/>
+ <path id="path24591" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24593" inkscape:connector-curvature="0"/>
+ <path id="path24595" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24597" inkscape:connector-curvature="0"/>
+ <path id="path24599" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24601" inkscape:connector-curvature="0"/>
+ <path id="path24603" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24605" inkscape:connector-curvature="0"/>
+ <path id="path24607" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24609" inkscape:connector-curvature="0"/>
+ <path id="path24611" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24613" inkscape:connector-curvature="0"/>
+ <path id="path24615" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24617" inkscape:connector-curvature="0"/>
+ <path id="path24619" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24621" inkscape:connector-curvature="0"/>
+ <path id="path24623" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24625" inkscape:connector-curvature="0"/>
+ <path id="path24627" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path11020" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24630" transform="translate(0,105)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect24632" width="6" height="1" x="0" y="26" rx="0" ry="0"/>
+ <g id="g24634">
+ <path id="path24636" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24638" inkscape:connector-curvature="0"/>
+ <path id="path24640" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24642" inkscape:connector-curvature="0"/>
+ <path id="path24644" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24646" inkscape:connector-curvature="0"/>
+ <path id="path24648" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24650" inkscape:connector-curvature="0"/>
+ <path id="path24652" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24654" inkscape:connector-curvature="0"/>
+ <path id="path24656" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24658" inkscape:connector-curvature="0"/>
+ <path id="path24660" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24662" inkscape:connector-curvature="0"/>
+ <path id="path24664" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24666" inkscape:connector-curvature="0"/>
+ <path id="path24668" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24670" inkscape:connector-curvature="0"/>
+ <path id="path24672" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24674" inkscape:connector-curvature="0"/>
+ <path id="path24676" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24678" inkscape:connector-curvature="0"/>
+ <path id="path24680" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24682" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path11022" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24684" transform="translate(0,84)">
+ <rect ry="0" rx="0" y="26" x="0" height="1" width="6" id="rect24686" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <g id="g24688">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24690" inkscape:connector-curvature="0"/>
+ <path id="path24692" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24694" inkscape:connector-curvature="0"/>
+ <path id="path24696" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24698" inkscape:connector-curvature="0"/>
+ <path id="path24700" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24702" inkscape:connector-curvature="0"/>
+ <path id="path24704" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24706" inkscape:connector-curvature="0"/>
+ <path id="path24708" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24710" inkscape:connector-curvature="0"/>
+ <path id="path24712" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24714" inkscape:connector-curvature="0"/>
+ <path id="path24716" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24718" inkscape:connector-curvature="0"/>
+ <path id="path24720" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24722" inkscape:connector-curvature="0"/>
+ <path id="path24724" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24726" inkscape:connector-curvature="0"/>
+ <path id="path24728" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24730" inkscape:connector-curvature="0"/>
+ <path id="path24732" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24734" inkscape:connector-curvature="0"/>
+ <path id="path24736" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path11024" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24738" transform="translate(0,63)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect24740" width="6" height="1" x="0" y="26" rx="0" ry="0"/>
+ <g id="g24742">
+ <path id="path24744" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24746" inkscape:connector-curvature="0"/>
+ <path id="path24748" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24750" inkscape:connector-curvature="0"/>
+ <path id="path24752" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24754" inkscape:connector-curvature="0"/>
+ <path id="path24756" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24758" inkscape:connector-curvature="0"/>
+ <path id="path24760" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24762" inkscape:connector-curvature="0"/>
+ <path id="path24764" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24766" inkscape:connector-curvature="0"/>
+ <path id="path24768" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24770" inkscape:connector-curvature="0"/>
+ <path id="path24772" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24774" inkscape:connector-curvature="0"/>
+ <path id="path24776" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24778" inkscape:connector-curvature="0"/>
+ <path id="path24780" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24782" inkscape:connector-curvature="0"/>
+ <path id="path24784" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24786" inkscape:connector-curvature="0"/>
+ <path id="path24788" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24790" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path11026" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24792" transform="translate(0,42)">
+ <rect ry="0" rx="0" y="26" x="0" height="1" width="6" id="rect24794" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <g id="g24796">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24798" inkscape:connector-curvature="0"/>
+ <path id="path24800" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24802" inkscape:connector-curvature="0"/>
+ <path id="path24804" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24806" inkscape:connector-curvature="0"/>
+ <path id="path24808" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24810" inkscape:connector-curvature="0"/>
+ <path id="path24812" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24814" inkscape:connector-curvature="0"/>
+ <path id="path24816" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24818" inkscape:connector-curvature="0"/>
+ <path id="path24820" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24822" inkscape:connector-curvature="0"/>
+ <path id="path24824" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24826" inkscape:connector-curvature="0"/>
+ <path id="path24828" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24830" inkscape:connector-curvature="0"/>
+ <path id="path24832" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24834" inkscape:connector-curvature="0"/>
+ <path id="path24836" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24838" inkscape:connector-curvature="0"/>
+ <path id="path24840" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24842" inkscape:connector-curvature="0"/>
+ <path id="path24844" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path11028" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24846" transform="translate(0,21)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect24848" width="6" height="1" x="0" y="26" rx="0" ry="0"/>
+ <g id="g24850">
+ <path id="path24852" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24854" inkscape:connector-curvature="0"/>
+ <path id="path24856" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24858" inkscape:connector-curvature="0"/>
+ <path id="path24860" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24862" inkscape:connector-curvature="0"/>
+ <path id="path24864" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24866" inkscape:connector-curvature="0"/>
+ <path id="path24868" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24870" inkscape:connector-curvature="0"/>
+ <path id="path24872" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24874" inkscape:connector-curvature="0"/>
+ <path id="path24876" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24878" inkscape:connector-curvature="0"/>
+ <path id="path24880" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24882" inkscape:connector-curvature="0"/>
+ <path id="path24884" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24886" inkscape:connector-curvature="0"/>
+ <path id="path24888" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24890" inkscape:connector-curvature="0"/>
+ <path id="path24892" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24894" inkscape:connector-curvature="0"/>
+ <path id="path24896" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24898" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path11030" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g24900">
+ <rect ry="0" rx="0" y="26" x="0" height="1" width="6" id="rect24902" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <g id="g24904">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24906" inkscape:connector-curvature="0"/>
+ <path id="path24908" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24910" inkscape:connector-curvature="0"/>
+ <path id="path24912" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24914" inkscape:connector-curvature="0"/>
+ <path id="path24916" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24918" inkscape:connector-curvature="0"/>
+ <path id="path24920" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24922" inkscape:connector-curvature="0"/>
+ <path id="path24924" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24926" inkscape:connector-curvature="0"/>
+ <path id="path24928" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24930" inkscape:connector-curvature="0"/>
+ <path id="path24932" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24934" inkscape:connector-curvature="0"/>
+ <path id="path24936" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24938" inkscape:connector-curvature="0"/>
+ <path id="path24940" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24942" inkscape:connector-curvature="0"/>
+ <path id="path24944" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24946" inkscape:connector-curvature="0"/>
+ <path id="path24948" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path24950" inkscape:connector-curvature="0"/>
+ <path id="path24952" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path11032" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g transform="translate(0,483)" id="g39833">
+ <rect ry="0" rx="0" y="26" x="0" height="1" width="6" id="rect39835" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <g id="g39837">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39840" inkscape:connector-curvature="0"/>
+ <path id="path39842" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39844" inkscape:connector-curvature="0"/>
+ <path id="path39846" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39848" inkscape:connector-curvature="0"/>
+ <path id="path39850" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39852" inkscape:connector-curvature="0"/>
+ <path id="path39854" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39856" inkscape:connector-curvature="0"/>
+ <path id="path39858" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39860" inkscape:connector-curvature="0"/>
+ <path id="path39862" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39864" inkscape:connector-curvature="0"/>
+ <path id="path39866" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39868" inkscape:connector-curvature="0"/>
+ <path id="path39870" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39872" inkscape:connector-curvature="0"/>
+ <path id="path39874" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39876" inkscape:connector-curvature="0"/>
+ <path id="path39878" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39880" inkscape:connector-curvature="0"/>
+ <path id="path39882" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39884" inkscape:connector-curvature="0"/>
+ <path id="path39888" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path39890" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g39892" transform="translate(0,504)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect39894" width="6" height="1" x="0" y="26" rx="0" ry="0"/>
+ <g id="g39896">
+ <path id="path39898" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39900" inkscape:connector-curvature="0"/>
+ <path id="path39902" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39904" inkscape:connector-curvature="0"/>
+ <path id="path39907" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39909" inkscape:connector-curvature="0"/>
+ <path id="path39911" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39913" inkscape:connector-curvature="0"/>
+ <path id="path39915" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39917" inkscape:connector-curvature="0"/>
+ <path id="path39919" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39921" inkscape:connector-curvature="0"/>
+ <path id="path39923" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39925" inkscape:connector-curvature="0"/>
+ <path id="path39927" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39929" inkscape:connector-curvature="0"/>
+ <path id="path39931" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39933" inkscape:connector-curvature="0"/>
+ <path id="path39935" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39937" inkscape:connector-curvature="0"/>
+ <path id="path39939" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39941" inkscape:connector-curvature="0"/>
+ <path id="path39943" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39945" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39947" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g transform="translate(0,525)" id="g39949">
+ <rect ry="0" rx="0" y="26" x="0" height="1" width="6" id="rect39951" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <g id="g39953">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39955" inkscape:connector-curvature="0"/>
+ <path id="path39957" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39959" inkscape:connector-curvature="0"/>
+ <path id="path39961" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39963" inkscape:connector-curvature="0"/>
+ <path id="path39965" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39967" inkscape:connector-curvature="0"/>
+ <path id="path39969" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39971" inkscape:connector-curvature="0"/>
+ <path id="path39973" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39975" inkscape:connector-curvature="0"/>
+ <path id="path39977" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39979" inkscape:connector-curvature="0"/>
+ <path id="path39981" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39983" inkscape:connector-curvature="0"/>
+ <path id="path39985" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39987" inkscape:connector-curvature="0"/>
+ <path id="path39989" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39991" inkscape:connector-curvature="0"/>
+ <path id="path39993" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39995" inkscape:connector-curvature="0"/>
+ <path id="path39997" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path39999" inkscape:connector-curvature="0"/>
+ <path id="path40001" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path40003" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g40005" transform="translate(0,546)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect40007" width="6" height="1" x="0" y="26" rx="0" ry="0"/>
+ <g id="g40009">
+ <path id="path40011" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40013" inkscape:connector-curvature="0"/>
+ <path id="path40015" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40017" inkscape:connector-curvature="0"/>
+ <path id="path40019" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40021" inkscape:connector-curvature="0"/>
+ <path id="path40023" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40025" inkscape:connector-curvature="0"/>
+ <path id="path40027" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40029" inkscape:connector-curvature="0"/>
+ <path id="path40031" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40033" inkscape:connector-curvature="0"/>
+ <path id="path40035" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40038" inkscape:connector-curvature="0"/>
+ <path id="path40040" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40042" inkscape:connector-curvature="0"/>
+ <path id="path40044" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40046" inkscape:connector-curvature="0"/>
+ <path id="path40048" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40050" inkscape:connector-curvature="0"/>
+ <path id="path40052" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40054" inkscape:connector-curvature="0"/>
+ <path id="path40056" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40058" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40060" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g transform="translate(0,567)" id="g40062">
+ <rect ry="0" rx="0" y="26" x="0" height="1" width="6" id="rect40064" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <g id="g40066">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40068" inkscape:connector-curvature="0"/>
+ <path id="path40070" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40072" inkscape:connector-curvature="0"/>
+ <path id="path40074" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40076" inkscape:connector-curvature="0"/>
+ <path id="path40078" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40080" inkscape:connector-curvature="0"/>
+ <path id="path40082" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40084" inkscape:connector-curvature="0"/>
+ <path id="path40086" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40088" inkscape:connector-curvature="0"/>
+ <path id="path40090" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40092" inkscape:connector-curvature="0"/>
+ <path id="path40094" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40096" inkscape:connector-curvature="0"/>
+ <path id="path40098" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40100" inkscape:connector-curvature="0"/>
+ <path id="path40102" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40104" inkscape:connector-curvature="0"/>
+ <path id="path40106" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40108" inkscape:connector-curvature="0"/>
+ <path id="path40110" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40112" inkscape:connector-curvature="0"/>
+ <path id="path40114" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path40116" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g40118" transform="translate(0,588)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect40120" width="6" height="1" x="0" y="26" rx="0" ry="0"/>
+ <g id="g40122">
+ <path id="path40124" d="m 506,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 485,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40126" inkscape:connector-curvature="0"/>
+ <path id="path40128" d="m 464,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 443,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40130" inkscape:connector-curvature="0"/>
+ <path id="path40132" d="m 422,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 401,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40134" inkscape:connector-curvature="0"/>
+ <path id="path40136" d="m 380,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 359,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40138" inkscape:connector-curvature="0"/>
+ <path id="path40140" d="m 338,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 317,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40142" inkscape:connector-curvature="0"/>
+ <path id="path40144" d="m 296,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 275,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40146" inkscape:connector-curvature="0"/>
+ <path id="path40148" d="m 254,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 233,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40150" inkscape:connector-curvature="0"/>
+ <path id="path40152" d="m 212,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 191,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40154" inkscape:connector-curvature="0"/>
+ <path id="path40156" d="m 170,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 149,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40158" inkscape:connector-curvature="0"/>
+ <path id="path40160" d="m 128,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 107,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40162" inkscape:connector-curvature="0"/>
+ <path id="path40164" d="m 86,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 65,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40166" inkscape:connector-curvature="0"/>
+ <path id="path40168" d="m 44,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 23,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40170" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" d="m 527,20 v 6 h -6 v 1 h 6 v 6 h 1 v -6 h 6 v -1 h -6 v -6 z" id="path40172" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ </g>
+ <g transform="translate(0,633)" id="g25954">
+ <rect ry="0" rx="0" y="0" x="422" height="7" width="1" id="rect25956" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect25958" width="1" height="7" x="401" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="380" height="7" width="1" id="rect25960" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect25962" width="1" height="7" x="359" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="338" height="7" width="1" id="rect25964" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect25966" width="1" height="7" x="317" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="296" height="7" width="1" id="rect25968" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect25970" width="1" height="7" x="275" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="254" height="7" width="1" id="rect25972" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect25974" width="1" height="7" x="233" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="212" height="7" width="1" id="rect25976" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect25978" width="1" height="7" x="191" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="170" height="7" width="1" id="rect25980" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect25982" width="1" height="7" x="149" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="128" height="7" width="1" id="rect25984" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect25986" width="1" height="7" x="107" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="86" height="7" width="1" id="rect25988" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect25990" width="1" height="7" x="65" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="44" height="7" width="1" id="rect25992" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect25994" width="1" height="7" x="23" y="0" rx="0" ry="0"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect25996" width="1" height="7" x="506" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="485" height="7" width="1" id="rect25998" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect26000" width="1" height="7" x="464" y="0" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="0" x="443" height="7" width="1" id="rect26002" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect ry="0" rx="0" y="0" x="527" height="7" width="1" id="rect11034" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ </g>
+ </g>
+ <g id="g30515" transform="translate(-121.95685,2)">
+ <rect ry="0" rx="0" y="488" x="665.95685" height="1" width="6" id="rect26734" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect26788" width="6" height="1" x="665.95685" y="467" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="446" x="665.95685" height="1" width="6" id="rect26842" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect26896" width="6" height="1" x="665.95685" y="425" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="404" x="665.95685" height="1" width="6" id="rect26950" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect ry="0" rx="0" y="383" x="665.95685" height="1" width="6" id="rect27004" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect27058" width="6" height="1" x="665.95685" y="362" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="341" x="665.95685" height="1" width="6" id="rect27112" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect27166" width="6" height="1" x="665.95685" y="320" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="299" x="665.95685" height="1" width="6" id="rect27220" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect27274" width="6" height="1" x="665.95685" y="278" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="257" x="665.95685" height="1" width="6" id="rect27328" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect27382" width="6" height="1" x="665.95685" y="236" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="215" x="665.95685" height="1" width="6" id="rect27436" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect27490" width="6" height="1" x="665.95685" y="194" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="173" x="665.95685" height="1" width="6" id="rect27544" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect27598" width="6" height="1" x="665.95685" y="152" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="131" x="665.95685" height="1" width="6" id="rect27652" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect27706" width="6" height="1" x="665.95685" y="110" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="89" x="665.95685" height="1" width="6" id="rect27760" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect27814" width="6" height="1" x="665.95685" y="68" rx="0" ry="0"/>
+ <rect ry="0" rx="0" y="47" x="665.95685" height="1" width="6" id="rect27868" style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" id="rect27922" width="6" height="1" x="665.95685" y="26" rx="0" ry="0"/>
+ </g>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" id="rect28448" width="0" height="0" x="217.25" y="263.5"/>
</g>
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path23417"
- sodipodi:nodetypes="cc"
- d="" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="path23347"
- sodipodi:nodetypes="cc"
- d="" />
- <g
- inkscape:groupmode="layer"
- id="layer5"
- inkscape:label="grid"
- style="opacity:0.3;display:inline"
- sodipodi:insensitive="true">
- <g
- id="g40174"
- transform="translate(0,2)">
- <g
- id="g22995">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect22955"
- width="1"
- height="7"
- x="422"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="401"
- height="7"
- width="1"
- id="rect22957"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect22959"
- width="1"
- height="7"
- x="380"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="359"
- height="7"
- width="1"
- id="rect22961"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect22963"
- width="1"
- height="7"
- x="338"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="317"
- height="7"
- width="1"
- id="rect22965"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect22967"
- width="1"
- height="7"
- x="296"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="275"
- height="7"
- width="1"
- id="rect22969"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect22971"
- width="1"
- height="7"
- x="254"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="233"
- height="7"
- width="1"
- id="rect22973"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect22975"
- width="1"
- height="7"
- x="212"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="191"
- height="7"
- width="1"
- id="rect22977"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect22979"
- width="1"
- height="7"
- x="170"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="149"
- height="7"
- width="1"
- id="rect22981"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect22983"
- width="1"
- height="7"
- x="128"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="107"
- height="7"
- width="1"
- id="rect22985"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect22987"
- width="1"
- height="7"
- x="86"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="65"
- height="7"
- width="1"
- id="rect22989"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect22991"
- width="1"
- height="7"
- x="44"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="23"
- height="7"
- width="1"
- id="rect22993"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="506"
- height="7"
- width="1"
- id="rect23024"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect23026"
- width="1"
- height="7"
- x="485"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="464"
- height="7"
- width="1"
- id="rect23028"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect23030"
- width="1"
- height="7"
- x="443"
- y="0"
- rx="0"
- ry="0" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect10985"
- width="1"
- height="7"
- x="527"
- y="0"
- rx="0"
- ry="0" />
- </g>
- <g
- id="g24954">
- <g
- id="g23711"
- transform="translate(0,462)">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect23713"
- width="6"
- height="1"
- x="0"
- y="26"
- rx="0"
- ry="0" />
- <g
- id="g23715">
- <path
- id="path23717"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23719"
- inkscape:connector-curvature="0" />
- <path
- id="path23721"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23723"
- inkscape:connector-curvature="0" />
- <path
- id="path23725"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23727"
- inkscape:connector-curvature="0" />
- <path
- id="path23729"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23731"
- inkscape:connector-curvature="0" />
- <path
- id="path23733"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23735"
- inkscape:connector-curvature="0" />
- <path
- id="path23737"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23739"
- inkscape:connector-curvature="0" />
- <path
- id="path23741"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23743"
- inkscape:connector-curvature="0" />
- <path
- id="path23745"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23747"
- inkscape:connector-curvature="0" />
- <path
- id="path23749"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23751"
- inkscape:connector-curvature="0" />
- <path
- id="path23753"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23755"
- inkscape:connector-curvature="0" />
- <path
- id="path23757"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23759"
- inkscape:connector-curvature="0" />
- <path
- id="path23761"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23763"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path10987"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g23765"
- transform="translate(0,441)">
- <rect
- ry="0"
- rx="0"
- y="26"
- x="0"
- height="1"
- width="6"
- id="rect23767"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <g
- id="g23769">
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23771"
- inkscape:connector-curvature="0" />
- <path
- id="path23773"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23775"
- inkscape:connector-curvature="0" />
- <path
- id="path23777"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23779"
- inkscape:connector-curvature="0" />
- <path
- id="path23781"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23783"
- inkscape:connector-curvature="0" />
- <path
- id="path23785"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23787"
- inkscape:connector-curvature="0" />
- <path
- id="path23789"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23791"
- inkscape:connector-curvature="0" />
- <path
- id="path23793"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23795"
- inkscape:connector-curvature="0" />
- <path
- id="path23797"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23799"
- inkscape:connector-curvature="0" />
- <path
- id="path23801"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23803"
- inkscape:connector-curvature="0" />
- <path
- id="path23805"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23807"
- inkscape:connector-curvature="0" />
- <path
- id="path23809"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23811"
- inkscape:connector-curvature="0" />
- <path
- id="path23813"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23815"
- inkscape:connector-curvature="0" />
- <path
- id="path23817"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10990"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g23819"
- transform="translate(0,420)">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect23821"
- width="6"
- height="1"
- x="0"
- y="26"
- rx="0"
- ry="0" />
- <g
- id="g23823">
- <path
- id="path23825"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23827"
- inkscape:connector-curvature="0" />
- <path
- id="path23829"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23831"
- inkscape:connector-curvature="0" />
- <path
- id="path23833"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23835"
- inkscape:connector-curvature="0" />
- <path
- id="path23837"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23839"
- inkscape:connector-curvature="0" />
- <path
- id="path23841"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23843"
- inkscape:connector-curvature="0" />
- <path
- id="path23845"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23847"
- inkscape:connector-curvature="0" />
- <path
- id="path23849"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23851"
- inkscape:connector-curvature="0" />
- <path
- id="path23853"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23855"
- inkscape:connector-curvature="0" />
- <path
- id="path23857"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23859"
- inkscape:connector-curvature="0" />
- <path
- id="path23861"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23863"
- inkscape:connector-curvature="0" />
- <path
- id="path23865"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23867"
- inkscape:connector-curvature="0" />
- <path
- id="path23869"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23871"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path10992"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g23873"
- transform="translate(0,399)">
- <rect
- ry="0"
- rx="0"
- y="26"
- x="0"
- height="1"
- width="6"
- id="rect23875"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <g
- id="g23877">
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23879"
- inkscape:connector-curvature="0" />
- <path
- id="path23881"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23883"
- inkscape:connector-curvature="0" />
- <path
- id="path23885"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23887"
- inkscape:connector-curvature="0" />
- <path
- id="path23889"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23891"
- inkscape:connector-curvature="0" />
- <path
- id="path23893"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23895"
- inkscape:connector-curvature="0" />
- <path
- id="path23897"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23899"
- inkscape:connector-curvature="0" />
- <path
- id="path23901"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23903"
- inkscape:connector-curvature="0" />
- <path
- id="path23905"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23907"
- inkscape:connector-curvature="0" />
- <path
- id="path23909"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23911"
- inkscape:connector-curvature="0" />
- <path
- id="path23913"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23915"
- inkscape:connector-curvature="0" />
- <path
- id="path23917"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23919"
- inkscape:connector-curvature="0" />
- <path
- id="path23921"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23923"
- inkscape:connector-curvature="0" />
- <path
- id="path23925"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10994"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g23927"
- transform="translate(0,378)">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect23929"
- width="6"
- height="1"
- x="0"
- y="26"
- rx="0"
- ry="0" />
- <g
- id="g23931">
- <path
- id="path23933"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23935"
- inkscape:connector-curvature="0" />
- <path
- id="path23937"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23939"
- inkscape:connector-curvature="0" />
- <path
- id="path23941"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23943"
- inkscape:connector-curvature="0" />
- <path
- id="path23945"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23947"
- inkscape:connector-curvature="0" />
- <path
- id="path23949"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23951"
- inkscape:connector-curvature="0" />
- <path
- id="path23953"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23955"
- inkscape:connector-curvature="0" />
- <path
- id="path23957"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23959"
- inkscape:connector-curvature="0" />
- <path
- id="path23961"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23963"
- inkscape:connector-curvature="0" />
- <path
- id="path23965"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23967"
- inkscape:connector-curvature="0" />
- <path
- id="path23969"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23971"
- inkscape:connector-curvature="0" />
- <path
- id="path23973"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23975"
- inkscape:connector-curvature="0" />
- <path
- id="path23977"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23979"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path10996"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g23981"
- transform="translate(0,357)">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect23983"
- width="6"
- height="1"
- x="0"
- y="26"
- rx="0"
- ry="0" />
- <g
- id="g23985">
- <path
- id="path23987"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23989"
- inkscape:connector-curvature="0" />
- <path
- id="path23991"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23993"
- inkscape:connector-curvature="0" />
- <path
- id="path23995"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path23997"
- inkscape:connector-curvature="0" />
- <path
- id="path23999"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24001"
- inkscape:connector-curvature="0" />
- <path
- id="path24003"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24005"
- inkscape:connector-curvature="0" />
- <path
- id="path24007"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24009"
- inkscape:connector-curvature="0" />
- <path
- id="path24011"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24013"
- inkscape:connector-curvature="0" />
- <path
- id="path24015"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24017"
- inkscape:connector-curvature="0" />
- <path
- id="path24019"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24021"
- inkscape:connector-curvature="0" />
- <path
- id="path24023"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24025"
- inkscape:connector-curvature="0" />
- <path
- id="path24027"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24029"
- inkscape:connector-curvature="0" />
- <path
- id="path24031"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24033"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path10998"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24035"
- transform="translate(0,336)">
- <rect
- ry="0"
- rx="0"
- y="26"
- x="0"
- height="1"
- width="6"
- id="rect24037"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <g
- id="g24039">
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24041"
- inkscape:connector-curvature="0" />
- <path
- id="path24043"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24045"
- inkscape:connector-curvature="0" />
- <path
- id="path24047"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24049"
- inkscape:connector-curvature="0" />
- <path
- id="path24051"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24053"
- inkscape:connector-curvature="0" />
- <path
- id="path24055"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24057"
- inkscape:connector-curvature="0" />
- <path
- id="path24059"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24061"
- inkscape:connector-curvature="0" />
- <path
- id="path24063"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24065"
- inkscape:connector-curvature="0" />
- <path
- id="path24067"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24069"
- inkscape:connector-curvature="0" />
- <path
- id="path24071"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24073"
- inkscape:connector-curvature="0" />
- <path
- id="path24075"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24077"
- inkscape:connector-curvature="0" />
- <path
- id="path24079"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24081"
- inkscape:connector-curvature="0" />
- <path
- id="path24083"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24085"
- inkscape:connector-curvature="0" />
- <path
- id="path24087"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11000"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24089"
- transform="translate(0,315)">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect24091"
- width="6"
- height="1"
- x="0"
- y="26"
- rx="0"
- ry="0" />
- <g
- id="g24093">
- <path
- id="path24095"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24097"
- inkscape:connector-curvature="0" />
- <path
- id="path24099"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24101"
- inkscape:connector-curvature="0" />
- <path
- id="path24103"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24105"
- inkscape:connector-curvature="0" />
- <path
- id="path24107"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24109"
- inkscape:connector-curvature="0" />
- <path
- id="path24111"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24113"
- inkscape:connector-curvature="0" />
- <path
- id="path24115"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24117"
- inkscape:connector-curvature="0" />
- <path
- id="path24119"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24121"
- inkscape:connector-curvature="0" />
- <path
- id="path24123"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24125"
- inkscape:connector-curvature="0" />
- <path
- id="path24127"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24129"
- inkscape:connector-curvature="0" />
- <path
- id="path24131"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24133"
- inkscape:connector-curvature="0" />
- <path
- id="path24135"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24137"
- inkscape:connector-curvature="0" />
- <path
- id="path24139"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24141"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path11002"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24143"
- transform="translate(0,294)">
- <rect
- ry="0"
- rx="0"
- y="26"
- x="0"
- height="1"
- width="6"
- id="rect24145"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <g
- id="g24147">
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24149"
- inkscape:connector-curvature="0" />
- <path
- id="path24151"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24153"
- inkscape:connector-curvature="0" />
- <path
- id="path24155"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24157"
- inkscape:connector-curvature="0" />
- <path
- id="path24159"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24161"
- inkscape:connector-curvature="0" />
- <path
- id="path24163"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24165"
- inkscape:connector-curvature="0" />
- <path
- id="path24167"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24169"
- inkscape:connector-curvature="0" />
- <path
- id="path24171"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24173"
- inkscape:connector-curvature="0" />
- <path
- id="path24175"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24177"
- inkscape:connector-curvature="0" />
- <path
- id="path24179"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24181"
- inkscape:connector-curvature="0" />
- <path
- id="path24183"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24185"
- inkscape:connector-curvature="0" />
- <path
- id="path24187"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24189"
- inkscape:connector-curvature="0" />
- <path
- id="path24191"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24193"
- inkscape:connector-curvature="0" />
- <path
- id="path24195"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11004"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24197"
- transform="translate(0,273)">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect24199"
- width="6"
- height="1"
- x="0"
- y="26"
- rx="0"
- ry="0" />
- <g
- id="g24201">
- <path
- id="path24203"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24205"
- inkscape:connector-curvature="0" />
- <path
- id="path24207"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24209"
- inkscape:connector-curvature="0" />
- <path
- id="path24211"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24213"
- inkscape:connector-curvature="0" />
- <path
- id="path24215"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24217"
- inkscape:connector-curvature="0" />
- <path
- id="path24219"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24221"
- inkscape:connector-curvature="0" />
- <path
- id="path24223"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24225"
- inkscape:connector-curvature="0" />
- <path
- id="path24227"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24229"
- inkscape:connector-curvature="0" />
- <path
- id="path24231"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24233"
- inkscape:connector-curvature="0" />
- <path
- id="path24235"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24237"
- inkscape:connector-curvature="0" />
- <path
- id="path24239"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24241"
- inkscape:connector-curvature="0" />
- <path
- id="path24243"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24245"
- inkscape:connector-curvature="0" />
- <path
- id="path24247"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24249"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path11006"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24251"
- transform="translate(0,252)">
- <rect
- ry="0"
- rx="0"
- y="26"
- x="0"
- height="1"
- width="6"
- id="rect24253"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <g
- id="g24255">
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24257"
- inkscape:connector-curvature="0" />
- <path
- id="path24259"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24261"
- inkscape:connector-curvature="0" />
- <path
- id="path24263"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24265"
- inkscape:connector-curvature="0" />
- <path
- id="path24267"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24269"
- inkscape:connector-curvature="0" />
- <path
- id="path24271"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24273"
- inkscape:connector-curvature="0" />
- <path
- id="path24275"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24277"
- inkscape:connector-curvature="0" />
- <path
- id="path24279"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24281"
- inkscape:connector-curvature="0" />
- <path
- id="path24283"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24285"
- inkscape:connector-curvature="0" />
- <path
- id="path24287"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24289"
- inkscape:connector-curvature="0" />
- <path
- id="path24291"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24293"
- inkscape:connector-curvature="0" />
- <path
- id="path24295"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24297"
- inkscape:connector-curvature="0" />
- <path
- id="path24299"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24301"
- inkscape:connector-curvature="0" />
- <path
- id="path24303"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11008"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24305"
- transform="translate(0,231)">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect24307"
- width="6"
- height="1"
- x="0"
- y="26"
- rx="0"
- ry="0" />
- <g
- id="g24309">
- <path
- id="path24311"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24313"
- inkscape:connector-curvature="0" />
- <path
- id="path24315"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24317"
- inkscape:connector-curvature="0" />
- <path
- id="path24319"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24321"
- inkscape:connector-curvature="0" />
- <path
- id="path24323"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24325"
- inkscape:connector-curvature="0" />
- <path
- id="path24327"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24329"
- inkscape:connector-curvature="0" />
- <path
- id="path24331"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24333"
- inkscape:connector-curvature="0" />
- <path
- id="path24335"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24337"
- inkscape:connector-curvature="0" />
- <path
- id="path24339"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24341"
- inkscape:connector-curvature="0" />
- <path
- id="path24343"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24345"
- inkscape:connector-curvature="0" />
- <path
- id="path24347"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24349"
- inkscape:connector-curvature="0" />
- <path
- id="path24351"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24353"
- inkscape:connector-curvature="0" />
- <path
- id="path24355"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24357"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path11010"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24359"
- transform="translate(0,210)">
- <rect
- ry="0"
- rx="0"
- y="26"
- x="0"
- height="1"
- width="6"
- id="rect24361"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <g
- id="g24363">
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24365"
- inkscape:connector-curvature="0" />
- <path
- id="path24367"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24369"
- inkscape:connector-curvature="0" />
- <path
- id="path24371"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24373"
- inkscape:connector-curvature="0" />
- <path
- id="path24375"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24377"
- inkscape:connector-curvature="0" />
- <path
- id="path24379"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24381"
- inkscape:connector-curvature="0" />
- <path
- id="path24383"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24385"
- inkscape:connector-curvature="0" />
- <path
- id="path24387"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24389"
- inkscape:connector-curvature="0" />
- <path
- id="path24391"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24393"
- inkscape:connector-curvature="0" />
- <path
- id="path24395"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24397"
- inkscape:connector-curvature="0" />
- <path
- id="path24399"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24401"
- inkscape:connector-curvature="0" />
- <path
- id="path24403"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24405"
- inkscape:connector-curvature="0" />
- <path
- id="path24407"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24409"
- inkscape:connector-curvature="0" />
- <path
- id="path24411"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11012"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24413"
- transform="translate(0,189)">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect24415"
- width="6"
- height="1"
- x="0"
- y="26"
- rx="0"
- ry="0" />
- <g
- id="g24417">
- <path
- id="path24419"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24421"
- inkscape:connector-curvature="0" />
- <path
- id="path24423"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24425"
- inkscape:connector-curvature="0" />
- <path
- id="path24427"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24429"
- inkscape:connector-curvature="0" />
- <path
- id="path24431"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24433"
- inkscape:connector-curvature="0" />
- <path
- id="path24435"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24437"
- inkscape:connector-curvature="0" />
- <path
- id="path24439"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24441"
- inkscape:connector-curvature="0" />
- <path
- id="path24443"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24445"
- inkscape:connector-curvature="0" />
- <path
- id="path24447"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24449"
- inkscape:connector-curvature="0" />
- <path
- id="path24451"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24453"
- inkscape:connector-curvature="0" />
- <path
- id="path24455"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24457"
- inkscape:connector-curvature="0" />
- <path
- id="path24459"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24461"
- inkscape:connector-curvature="0" />
- <path
- id="path24463"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24465"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path11014"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24467"
- transform="translate(0,168)">
- <rect
- ry="0"
- rx="0"
- y="26"
- x="0"
- height="1"
- width="6"
- id="rect24469"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <g
- id="g24471">
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24473"
- inkscape:connector-curvature="0" />
- <path
- id="path24475"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24477"
- inkscape:connector-curvature="0" />
- <path
- id="path24479"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24481"
- inkscape:connector-curvature="0" />
- <path
- id="path24483"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24485"
- inkscape:connector-curvature="0" />
- <path
- id="path24487"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24489"
- inkscape:connector-curvature="0" />
- <path
- id="path24491"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24493"
- inkscape:connector-curvature="0" />
- <path
- id="path24495"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24497"
- inkscape:connector-curvature="0" />
- <path
- id="path24499"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24501"
- inkscape:connector-curvature="0" />
- <path
- id="path24503"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24505"
- inkscape:connector-curvature="0" />
- <path
- id="path24507"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24509"
- inkscape:connector-curvature="0" />
- <path
- id="path24511"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24513"
- inkscape:connector-curvature="0" />
- <path
- id="path24515"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24517"
- inkscape:connector-curvature="0" />
- <path
- id="path24519"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11016"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24521"
- transform="translate(0,147)">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect24523"
- width="6"
- height="1"
- x="0"
- y="26"
- rx="0"
- ry="0" />
- <g
- id="g24525">
- <path
- id="path24527"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24529"
- inkscape:connector-curvature="0" />
- <path
- id="path24531"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24533"
- inkscape:connector-curvature="0" />
- <path
- id="path24535"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24537"
- inkscape:connector-curvature="0" />
- <path
- id="path24539"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24541"
- inkscape:connector-curvature="0" />
- <path
- id="path24543"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24545"
- inkscape:connector-curvature="0" />
- <path
- id="path24547"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24549"
- inkscape:connector-curvature="0" />
- <path
- id="path24551"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24553"
- inkscape:connector-curvature="0" />
- <path
- id="path24555"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24557"
- inkscape:connector-curvature="0" />
- <path
- id="path24559"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24561"
- inkscape:connector-curvature="0" />
- <path
- id="path24563"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24565"
- inkscape:connector-curvature="0" />
- <path
- id="path24567"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24569"
- inkscape:connector-curvature="0" />
- <path
- id="path24571"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24573"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path11018"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24575"
- transform="translate(0,126)">
- <rect
- ry="0"
- rx="0"
- y="26"
- x="0"
- height="1"
- width="6"
- id="rect24577"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <g
- id="g24579">
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24581"
- inkscape:connector-curvature="0" />
- <path
- id="path24583"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24585"
- inkscape:connector-curvature="0" />
- <path
- id="path24587"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24589"
- inkscape:connector-curvature="0" />
- <path
- id="path24591"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24593"
- inkscape:connector-curvature="0" />
- <path
- id="path24595"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24597"
- inkscape:connector-curvature="0" />
- <path
- id="path24599"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24601"
- inkscape:connector-curvature="0" />
- <path
- id="path24603"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24605"
- inkscape:connector-curvature="0" />
- <path
- id="path24607"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24609"
- inkscape:connector-curvature="0" />
- <path
- id="path24611"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24613"
- inkscape:connector-curvature="0" />
- <path
- id="path24615"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24617"
- inkscape:connector-curvature="0" />
- <path
- id="path24619"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24621"
- inkscape:connector-curvature="0" />
- <path
- id="path24623"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24625"
- inkscape:connector-curvature="0" />
- <path
- id="path24627"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11020"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24630"
- transform="translate(0,105)">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect24632"
- width="6"
- height="1"
- x="0"
- y="26"
- rx="0"
- ry="0" />
- <g
- id="g24634">
- <path
- id="path24636"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24638"
- inkscape:connector-curvature="0" />
- <path
- id="path24640"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24642"
- inkscape:connector-curvature="0" />
- <path
- id="path24644"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24646"
- inkscape:connector-curvature="0" />
- <path
- id="path24648"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24650"
- inkscape:connector-curvature="0" />
- <path
- id="path24652"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24654"
- inkscape:connector-curvature="0" />
- <path
- id="path24656"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24658"
- inkscape:connector-curvature="0" />
- <path
- id="path24660"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24662"
- inkscape:connector-curvature="0" />
- <path
- id="path24664"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24666"
- inkscape:connector-curvature="0" />
- <path
- id="path24668"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24670"
- inkscape:connector-curvature="0" />
- <path
- id="path24672"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24674"
- inkscape:connector-curvature="0" />
- <path
- id="path24676"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24678"
- inkscape:connector-curvature="0" />
- <path
- id="path24680"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24682"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path11022"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24684"
- transform="translate(0,84)">
- <rect
- ry="0"
- rx="0"
- y="26"
- x="0"
- height="1"
- width="6"
- id="rect24686"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <g
- id="g24688">
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24690"
- inkscape:connector-curvature="0" />
- <path
- id="path24692"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24694"
- inkscape:connector-curvature="0" />
- <path
- id="path24696"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24698"
- inkscape:connector-curvature="0" />
- <path
- id="path24700"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24702"
- inkscape:connector-curvature="0" />
- <path
- id="path24704"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24706"
- inkscape:connector-curvature="0" />
- <path
- id="path24708"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24710"
- inkscape:connector-curvature="0" />
- <path
- id="path24712"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24714"
- inkscape:connector-curvature="0" />
- <path
- id="path24716"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24718"
- inkscape:connector-curvature="0" />
- <path
- id="path24720"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24722"
- inkscape:connector-curvature="0" />
- <path
- id="path24724"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24726"
- inkscape:connector-curvature="0" />
- <path
- id="path24728"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24730"
- inkscape:connector-curvature="0" />
- <path
- id="path24732"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24734"
- inkscape:connector-curvature="0" />
- <path
- id="path24736"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11024"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24738"
- transform="translate(0,63)">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect24740"
- width="6"
- height="1"
- x="0"
- y="26"
- rx="0"
- ry="0" />
- <g
- id="g24742">
- <path
- id="path24744"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24746"
- inkscape:connector-curvature="0" />
- <path
- id="path24748"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24750"
- inkscape:connector-curvature="0" />
- <path
- id="path24752"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24754"
- inkscape:connector-curvature="0" />
- <path
- id="path24756"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24758"
- inkscape:connector-curvature="0" />
- <path
- id="path24760"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24762"
- inkscape:connector-curvature="0" />
- <path
- id="path24764"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24766"
- inkscape:connector-curvature="0" />
- <path
- id="path24768"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24770"
- inkscape:connector-curvature="0" />
- <path
- id="path24772"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24774"
- inkscape:connector-curvature="0" />
- <path
- id="path24776"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24778"
- inkscape:connector-curvature="0" />
- <path
- id="path24780"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24782"
- inkscape:connector-curvature="0" />
- <path
- id="path24784"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24786"
- inkscape:connector-curvature="0" />
- <path
- id="path24788"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24790"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path11026"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24792"
- transform="translate(0,42)">
- <rect
- ry="0"
- rx="0"
- y="26"
- x="0"
- height="1"
- width="6"
- id="rect24794"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <g
- id="g24796">
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24798"
- inkscape:connector-curvature="0" />
- <path
- id="path24800"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24802"
- inkscape:connector-curvature="0" />
- <path
- id="path24804"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24806"
- inkscape:connector-curvature="0" />
- <path
- id="path24808"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24810"
- inkscape:connector-curvature="0" />
- <path
- id="path24812"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24814"
- inkscape:connector-curvature="0" />
- <path
- id="path24816"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24818"
- inkscape:connector-curvature="0" />
- <path
- id="path24820"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24822"
- inkscape:connector-curvature="0" />
- <path
- id="path24824"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24826"
- inkscape:connector-curvature="0" />
- <path
- id="path24828"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24830"
- inkscape:connector-curvature="0" />
- <path
- id="path24832"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24834"
- inkscape:connector-curvature="0" />
- <path
- id="path24836"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24838"
- inkscape:connector-curvature="0" />
- <path
- id="path24840"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24842"
- inkscape:connector-curvature="0" />
- <path
- id="path24844"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11028"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24846"
- transform="translate(0,21)">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect24848"
- width="6"
- height="1"
- x="0"
- y="26"
- rx="0"
- ry="0" />
- <g
- id="g24850">
- <path
- id="path24852"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24854"
- inkscape:connector-curvature="0" />
- <path
- id="path24856"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24858"
- inkscape:connector-curvature="0" />
- <path
- id="path24860"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24862"
- inkscape:connector-curvature="0" />
- <path
- id="path24864"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24866"
- inkscape:connector-curvature="0" />
- <path
- id="path24868"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24870"
- inkscape:connector-curvature="0" />
- <path
- id="path24872"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24874"
- inkscape:connector-curvature="0" />
- <path
- id="path24876"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24878"
- inkscape:connector-curvature="0" />
- <path
- id="path24880"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24882"
- inkscape:connector-curvature="0" />
- <path
- id="path24884"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24886"
- inkscape:connector-curvature="0" />
- <path
- id="path24888"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24890"
- inkscape:connector-curvature="0" />
- <path
- id="path24892"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24894"
- inkscape:connector-curvature="0" />
- <path
- id="path24896"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24898"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path11030"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24900">
- <rect
- ry="0"
- rx="0"
- y="26"
- x="0"
- height="1"
- width="6"
- id="rect24902"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <g
- id="g24904">
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24906"
- inkscape:connector-curvature="0" />
- <path
- id="path24908"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24910"
- inkscape:connector-curvature="0" />
- <path
- id="path24912"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24914"
- inkscape:connector-curvature="0" />
- <path
- id="path24916"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24918"
- inkscape:connector-curvature="0" />
- <path
- id="path24920"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24922"
- inkscape:connector-curvature="0" />
- <path
- id="path24924"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24926"
- inkscape:connector-curvature="0" />
- <path
- id="path24928"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24930"
- inkscape:connector-curvature="0" />
- <path
- id="path24932"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24934"
- inkscape:connector-curvature="0" />
- <path
- id="path24936"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24938"
- inkscape:connector-curvature="0" />
- <path
- id="path24940"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24942"
- inkscape:connector-curvature="0" />
- <path
- id="path24944"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24946"
- inkscape:connector-curvature="0" />
- <path
- id="path24948"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path24950"
- inkscape:connector-curvature="0" />
- <path
- id="path24952"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11032"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(0,483)"
- id="g39833">
- <rect
- ry="0"
- rx="0"
- y="26"
- x="0"
- height="1"
- width="6"
- id="rect39835"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <g
- id="g39837">
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39840"
- inkscape:connector-curvature="0" />
- <path
- id="path39842"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39844"
- inkscape:connector-curvature="0" />
- <path
- id="path39846"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39848"
- inkscape:connector-curvature="0" />
- <path
- id="path39850"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39852"
- inkscape:connector-curvature="0" />
- <path
- id="path39854"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39856"
- inkscape:connector-curvature="0" />
- <path
- id="path39858"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39860"
- inkscape:connector-curvature="0" />
- <path
- id="path39862"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39864"
- inkscape:connector-curvature="0" />
- <path
- id="path39866"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39868"
- inkscape:connector-curvature="0" />
- <path
- id="path39870"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39872"
- inkscape:connector-curvature="0" />
- <path
- id="path39874"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39876"
- inkscape:connector-curvature="0" />
- <path
- id="path39878"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39880"
- inkscape:connector-curvature="0" />
- <path
- id="path39882"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39884"
- inkscape:connector-curvature="0" />
- <path
- id="path39888"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path39890"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g39892"
- transform="translate(0,504)">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect39894"
- width="6"
- height="1"
- x="0"
- y="26"
- rx="0"
- ry="0" />
- <g
- id="g39896">
- <path
- id="path39898"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39900"
- inkscape:connector-curvature="0" />
- <path
- id="path39902"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39904"
- inkscape:connector-curvature="0" />
- <path
- id="path39907"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39909"
- inkscape:connector-curvature="0" />
- <path
- id="path39911"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39913"
- inkscape:connector-curvature="0" />
- <path
- id="path39915"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39917"
- inkscape:connector-curvature="0" />
- <path
- id="path39919"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39921"
- inkscape:connector-curvature="0" />
- <path
- id="path39923"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39925"
- inkscape:connector-curvature="0" />
- <path
- id="path39927"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39929"
- inkscape:connector-curvature="0" />
- <path
- id="path39931"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39933"
- inkscape:connector-curvature="0" />
- <path
- id="path39935"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39937"
- inkscape:connector-curvature="0" />
- <path
- id="path39939"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39941"
- inkscape:connector-curvature="0" />
- <path
- id="path39943"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39945"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39947"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(0,525)"
- id="g39949">
- <rect
- ry="0"
- rx="0"
- y="26"
- x="0"
- height="1"
- width="6"
- id="rect39951"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <g
- id="g39953">
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39955"
- inkscape:connector-curvature="0" />
- <path
- id="path39957"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39959"
- inkscape:connector-curvature="0" />
- <path
- id="path39961"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39963"
- inkscape:connector-curvature="0" />
- <path
- id="path39965"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39967"
- inkscape:connector-curvature="0" />
- <path
- id="path39969"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39971"
- inkscape:connector-curvature="0" />
- <path
- id="path39973"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39975"
- inkscape:connector-curvature="0" />
- <path
- id="path39977"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39979"
- inkscape:connector-curvature="0" />
- <path
- id="path39981"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39983"
- inkscape:connector-curvature="0" />
- <path
- id="path39985"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39987"
- inkscape:connector-curvature="0" />
- <path
- id="path39989"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39991"
- inkscape:connector-curvature="0" />
- <path
- id="path39993"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39995"
- inkscape:connector-curvature="0" />
- <path
- id="path39997"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path39999"
- inkscape:connector-curvature="0" />
- <path
- id="path40001"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path40003"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g40005"
- transform="translate(0,546)">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect40007"
- width="6"
- height="1"
- x="0"
- y="26"
- rx="0"
- ry="0" />
- <g
- id="g40009">
- <path
- id="path40011"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40013"
- inkscape:connector-curvature="0" />
- <path
- id="path40015"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40017"
- inkscape:connector-curvature="0" />
- <path
- id="path40019"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40021"
- inkscape:connector-curvature="0" />
- <path
- id="path40023"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40025"
- inkscape:connector-curvature="0" />
- <path
- id="path40027"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40029"
- inkscape:connector-curvature="0" />
- <path
- id="path40031"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40033"
- inkscape:connector-curvature="0" />
- <path
- id="path40035"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40038"
- inkscape:connector-curvature="0" />
- <path
- id="path40040"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40042"
- inkscape:connector-curvature="0" />
- <path
- id="path40044"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40046"
- inkscape:connector-curvature="0" />
- <path
- id="path40048"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40050"
- inkscape:connector-curvature="0" />
- <path
- id="path40052"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40054"
- inkscape:connector-curvature="0" />
- <path
- id="path40056"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40058"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40060"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(0,567)"
- id="g40062">
- <rect
- ry="0"
- rx="0"
- y="26"
- x="0"
- height="1"
- width="6"
- id="rect40064"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <g
- id="g40066">
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40068"
- inkscape:connector-curvature="0" />
- <path
- id="path40070"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40072"
- inkscape:connector-curvature="0" />
- <path
- id="path40074"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40076"
- inkscape:connector-curvature="0" />
- <path
- id="path40078"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40080"
- inkscape:connector-curvature="0" />
- <path
- id="path40082"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40084"
- inkscape:connector-curvature="0" />
- <path
- id="path40086"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40088"
- inkscape:connector-curvature="0" />
- <path
- id="path40090"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40092"
- inkscape:connector-curvature="0" />
- <path
- id="path40094"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40096"
- inkscape:connector-curvature="0" />
- <path
- id="path40098"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40100"
- inkscape:connector-curvature="0" />
- <path
- id="path40102"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40104"
- inkscape:connector-curvature="0" />
- <path
- id="path40106"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40108"
- inkscape:connector-curvature="0" />
- <path
- id="path40110"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40112"
- inkscape:connector-curvature="0" />
- <path
- id="path40114"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path40116"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g40118"
- transform="translate(0,588)">
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect40120"
- width="6"
- height="1"
- x="0"
- y="26"
- rx="0"
- ry="0" />
- <g
- id="g40122">
- <path
- id="path40124"
- d="m 506,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 485,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40126"
- inkscape:connector-curvature="0" />
- <path
- id="path40128"
- d="m 464,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 443,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40130"
- inkscape:connector-curvature="0" />
- <path
- id="path40132"
- d="m 422,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 401,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40134"
- inkscape:connector-curvature="0" />
- <path
- id="path40136"
- d="m 380,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 359,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40138"
- inkscape:connector-curvature="0" />
- <path
- id="path40140"
- d="m 338,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 317,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40142"
- inkscape:connector-curvature="0" />
- <path
- id="path40144"
- d="m 296,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 275,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40146"
- inkscape:connector-curvature="0" />
- <path
- id="path40148"
- d="m 254,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 233,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40150"
- inkscape:connector-curvature="0" />
- <path
- id="path40152"
- d="m 212,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40154"
- inkscape:connector-curvature="0" />
- <path
- id="path40156"
- d="m 170,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 149,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40158"
- inkscape:connector-curvature="0" />
- <path
- id="path40160"
- d="m 128,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40162"
- inkscape:connector-curvature="0" />
- <path
- id="path40164"
- d="m 86,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 65,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40166"
- inkscape:connector-curvature="0" />
- <path
- id="path40168"
- d="m 44,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 23,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40170"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 527,20 0,6 -6,0 0,1 6,0 0,6 1,0 0,-6 6,0 0,-1 -6,0 0,-6 -1,0 z"
- id="path40172"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- transform="translate(0,633)"
- id="g25954">
- <rect
- ry="0"
- rx="0"
- y="0"
- x="422"
- height="7"
- width="1"
- id="rect25956"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect25958"
- width="1"
- height="7"
- x="401"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="380"
- height="7"
- width="1"
- id="rect25960"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect25962"
- width="1"
- height="7"
- x="359"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="338"
- height="7"
- width="1"
- id="rect25964"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect25966"
- width="1"
- height="7"
- x="317"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="296"
- height="7"
- width="1"
- id="rect25968"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect25970"
- width="1"
- height="7"
- x="275"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="254"
- height="7"
- width="1"
- id="rect25972"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect25974"
- width="1"
- height="7"
- x="233"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="212"
- height="7"
- width="1"
- id="rect25976"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect25978"
- width="1"
- height="7"
- x="191"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="170"
- height="7"
- width="1"
- id="rect25980"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect25982"
- width="1"
- height="7"
- x="149"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="128"
- height="7"
- width="1"
- id="rect25984"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect25986"
- width="1"
- height="7"
- x="107"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="86"
- height="7"
- width="1"
- id="rect25988"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect25990"
- width="1"
- height="7"
- x="65"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="44"
- height="7"
- width="1"
- id="rect25992"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect25994"
- width="1"
- height="7"
- x="23"
- y="0"
- rx="0"
- ry="0" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect25996"
- width="1"
- height="7"
- x="506"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="485"
- height="7"
- width="1"
- id="rect25998"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect26000"
- width="1"
- height="7"
- x="464"
- y="0"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="443"
- height="7"
- width="1"
- id="rect26002"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- ry="0"
- rx="0"
- y="0"
- x="527"
- height="7"
- width="1"
- id="rect11034"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- </g>
- </g>
- <g
- id="g30515"
- transform="translate(-121.95685,2)">
- <rect
- ry="0"
- rx="0"
- y="488"
- x="665.95685"
- height="1"
- width="6"
- id="rect26734"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect26788"
- width="6"
- height="1"
- x="665.95685"
- y="467"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="446"
- x="665.95685"
- height="1"
- width="6"
- id="rect26842"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect26896"
- width="6"
- height="1"
- x="665.95685"
- y="425"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="404"
- x="665.95685"
- height="1"
- width="6"
- id="rect26950"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- ry="0"
- rx="0"
- y="383"
- x="665.95685"
- height="1"
- width="6"
- id="rect27004"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect27058"
- width="6"
- height="1"
- x="665.95685"
- y="362"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="341"
- x="665.95685"
- height="1"
- width="6"
- id="rect27112"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect27166"
- width="6"
- height="1"
- x="665.95685"
- y="320"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="299"
- x="665.95685"
- height="1"
- width="6"
- id="rect27220"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect27274"
- width="6"
- height="1"
- x="665.95685"
- y="278"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="257"
- x="665.95685"
- height="1"
- width="6"
- id="rect27328"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect27382"
- width="6"
- height="1"
- x="665.95685"
- y="236"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="215"
- x="665.95685"
- height="1"
- width="6"
- id="rect27436"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect27490"
- width="6"
- height="1"
- x="665.95685"
- y="194"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="173"
- x="665.95685"
- height="1"
- width="6"
- id="rect27544"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect27598"
- width="6"
- height="1"
- x="665.95685"
- y="152"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="131"
- x="665.95685"
- height="1"
- width="6"
- id="rect27652"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect27706"
- width="6"
- height="1"
- x="665.95685"
- y="110"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="89"
- x="665.95685"
- height="1"
- width="6"
- id="rect27760"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect27814"
- width="6"
- height="1"
- x="665.95685"
- y="68"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="47"
- x="665.95685"
- height="1"
- width="6"
- id="rect27868"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.70000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect27922"
- width="6"
- height="1"
- x="665.95685"
- y="26"
- rx="0"
- ry="0" />
- </g>
- <rect
- style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect28448"
- width="0"
- height="0"
- x="217.25"
- y="263.5" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer4"
- inkscape:label="sheet layout"
- style="display:inline"
- sodipodi:insensitive="true">
- <path
- inkscape:connector-curvature="0"
- id="path19551-18-8"
- d="m 585,613.25 1,0 0,0.5 1,0 0,-0.5 1,0 0,0.75 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,0.75 -1,0 0,-0.5 -1,0 0,0.5 -1,0 0,1.5 z m 1,-0.25 0,-1 1,0 0,1 -1,0 z m 2,0 0,-1 1,0 0,1 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path19551-18-1"
- d="m 907.75,209 0,1 -0.5,0 0,1 0.5,0 0,1 -0.75,0 0,1 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-1 -0.75,0 0,-1 0.5,0 0,-1 -0.5,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z m 0,2 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <g
- style="opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new"
- transform="translate(21,0)"
- id="g28552-1">
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 536,14 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- id="path28554-7"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 539,14 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path28556-4"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 544,14 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m 0,1 0,1 1,0 0,-1 -1,0 z m -2,-1 0,-3 -1,0 0,3 1,0 z"
- id="path28558-0"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 553,14 0,1.75 -1,0 0,1.25 -1,0 0,2 1,0 0,-1.75 1,0 0,-1.25 1,0 0,-2 -1,0 z"
- id="path28560-9"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect28562-4"
- width="1"
- height="1"
- x="548"
- y="18" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect28564-8"
- width="1"
- height="5"
- x="557"
- y="14" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 559,14 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,3 1,0 0,-5 -1,0 0,1 -1,0 0,1 z"
- id="path28566-8"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 565.75,14 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path28568-2"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 570,14 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 0,-1.25 -1,0 0,1.25 -1,0 0,-3 2,0 0,-1 -2,0 z"
- id="path28570-4"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 573,14 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path28572-5"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new"
- transform="translate(21.98523,3)"
- id="g28574-5">
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 534,74 0,5 1,0 0,-2 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path28576-1"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect28578-7"
- width="1"
- height="5"
- x="538"
- y="74" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 540,74 0,5 1,0 2,0 0,-1 -2,0 0,-4 -1,0 z"
- id="path28580-1"
- inkscape:connector-curvature="0" />
- <path
- id="path28582-1"
- d="m 544,74 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path28584-5"
- d="m 551,74 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path28586-2"
- d="m 554,74 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 558,74 0,5 1,0 2,0 0,-1 -2,0 0,-4 -1,0 z"
- id="path28588-7"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 562,74 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path28590-6"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 567,74 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- id="path28592-1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 570,74 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- id="path28594-4"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new"
- transform="translate(21,0)"
- id="g28596-2">
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 535,119 0,1 2,0 0,1 1,0 0,-1.25 -1,0 0,-0.75 -2,0 z m 2,2 -1,0 0,1 1,0 0,-1 z m 0,1 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.25 -1,0 z"
- id="path28598-3"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 539,119 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- id="path28600-2"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 545,119 0,3.25 1,0 0,1.75 1,0 0,-1.75 1,0 0,-3.25 -1,0 0,3 -1,0 0,-3 -1,0 z"
- id="path28602-2"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect28604-1"
- width="1"
- height="5"
- x="549"
- y="119" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 551,119 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path28606-6"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 555,119 0,3.25 1,0 0,1.75 1,0 0,-1.75 1,0 0,1.75 1,0 0,-1.75 1,0 0,-3.25 -1,0 0,3 -1,0 0,-2 -1,0 0,2 -1,0 0,-3 -1,0 z"
- id="path28608-8"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new"
- transform="translate(16,1)"
- id="g28610-5">
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 540,160 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path28612-7"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 544,160 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- id="path28614-6"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect28616-1"
- width="1"
- height="5"
- x="548"
- y="160" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 550,160 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- id="path28618-8"
- inkscape:connector-curvature="0" />
- <rect
- y="160"
- x="554"
- height="5"
- width="1"
- id="rect28620-9"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 556,160 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- id="path28622-2"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 562,160 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 0,-1.25 -0.99999,0 0,1.25 -1.00001,0 0,-3 2,0 0,-1 -2,0 z"
- id="path28624-7"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new"
- transform="translate(21,0)"
- id="g28626-9">
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 535.75,224 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path28628-5"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 539,224 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- id="path28630-4"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect28632-3"
- width="1"
- height="5"
- x="544"
- y="224" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 546,224 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,3 1,0 0,-5 -1,0 0,1 -1,0 0,1 z"
- id="path28634-1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 552.75,224 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path28636-2"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 556,224 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- id="path28638-3"
- inkscape:connector-curvature="0" />
- <rect
- y="224"
- x="560"
- height="5"
- width="1"
- id="rect28640-3"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 563,224 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- id="path28642-4"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 567,224 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- id="path28644-1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new"
- transform="translate(22,-10)"
- id="g28646-1">
- <path
- id="path28648-3"
- d="m 535,267 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,3 1,0 0,-5 -1,0 0,1 -1,0 0,1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path28650-8"
- d="m 542,267 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 546,267 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- id="path28652-7"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect28654-4"
- width="1"
- height="5"
- x="550"
- y="267" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 552,267 0,5 1,0 0,-2 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path28656-2"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect28658-7"
- width="1"
- height="5"
- x="556"
- y="267" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 558,267 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path28660-7"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 562,267 0,5 1,0 0,-2 1,0 0,2 1,0 0,-2 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- id="path28662-9"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 567,267 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- id="path28664-3"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new"
- transform="translate(25,-1)"
- id="g28666-1">
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 532,36 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- id="path28668-9"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 539.75,36 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path28670-8"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 543,36 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- id="path28672-6"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 547,36 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path28674-5"
- inkscape:connector-curvature="0" />
- <path
- id="path28676-0"
- d="m 555,36 0,1.75 -1,0 0,1.25 -1,0 0,2 1,0 0,-1.75 1,0 0,-1.25 1,0 0,-2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 558,36 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- id="path28678-2"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 562,36 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path28680-8"
- inkscape:connector-curvature="0" />
- <path
- id="path28682-6"
- d="m 566,36 0,2 1,0 0,-2 -1,0 z m 1,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,-2 -1,0 0,2 z m 0,1 0,2 1,0 0,-2 -1,0 z m -1,0 -1,0 0,2 1,0 0,-2 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path28684-0"
- d="m 570,36 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 535,36 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- id="path28686-2"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new"
- transform="translate(19,125)"
- id="g28688-4">
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 538,299 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- id="path28690-8"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 542,299 0,4.25 1,0 0,0.75 2,0 0,-0.75 1,0 0,-4.25 -1,0 0,4 -2,0 0,-4 -1,0 z"
- id="path28692-6"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 547,299 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- id="path28694-5"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 551,299 0,5 1,0 2,0 0,-1 -2,0 0,-4 -1,0 z"
- id="path28696-0"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect28698-9"
- width="1"
- height="5"
- x="555"
- y="299" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 557,299 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- id="path28700-0"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 562,299 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path28702-0"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 566,299 0,5 1,0 0,-2 1,0 0,2 1,0 0,-2 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- id="path28704-6"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new"
- transform="translate(21,128)"
- id="g28706-1">
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 539.75,359 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path28708-3"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 535,359 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- id="path28710-8"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 543,359 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- id="path28712-9"
- inkscape:connector-curvature="0" />
- <path
- id="path28714-3"
- d="m 547.75,359 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new"
- transform="translate(22,125)"
- id="g28716-4">
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 545,393 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- id="path28718-4"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 549,393 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path28720-6"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 534,393 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,3 1,0 0,-5 -1,0 0,1 -1,0 0,1 z"
- id="path28722-0"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 541,393 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- id="path28724-6"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 554,393 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- id="path28726-6"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new"
- transform="translate(22.01477,127)"
- id="g28728-1">
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 538,412 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- id="path28730-8"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 534,412 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path28732-4"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect28734-9"
- width="1"
- height="5"
- x="542"
- y="412" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 549,412 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- id="path28736-6"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 553,412 0,5 1,0 0,-2 1,0 0,2 1,0 0,-2 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- id="path28738-3"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 558,412 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- id="path28740-7"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 544,412 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- id="path28742-8"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new"
- transform="translate(22.01477,127)"
- id="g28744-8">
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 534,434 0,5 1,0 1,0 0,-0.5 1,0 0,-1.5 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z m 0,2 1,0 0,1 -1,0 0,-1 z"
- id="path28746-2"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 556,434 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- id="path28748-9"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 552,434 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- id="path28750-1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 562,434 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- id="path28752-3"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 543,434 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- id="path28754-5"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 538,434 0,4.25 1,0 0,0.75 2,0 0,-0.75 1,0 0,-4.25 -1,0 0,4 -2,0 0,-4 -1,0 z"
- id="path28756-9"
- inkscape:connector-curvature="0" />
- <path
- id="path28758-8"
- d="m 547,434 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;display:inline;enable-background:new"
- transform="translate(19,127)"
- id="g28760-4">
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect28762-0"
- width="1"
- height="5"
- x="542"
- y="486" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 537,486 0,4.25 1,0 0,0.75 2,0 0,-0.75 1,0 0,-4.25 -1,0 0,4 -2,0 0,-4 -1,0 z"
- id="path28764-7"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g10763-6"
- transform="translate(21,0)">
- <path
- id="path10757-3"
- d="m 536,14 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10759-6"
- d="m 539,14 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10761-1"
- d="m 544,14 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m 0,1 0,1 1,0 0,-1 -1,0 z m -2,-1 0,-3 -1,0 0,3 1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10763-5"
- d="m 553,14 0,1.75 -1,0 0,1.25 -1,0 0,2 1,0 0,-1.75 1,0 0,-1.25 1,0 0,-2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="18"
- x="548"
- height="1"
- width="1"
- id="rect10765-4"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- y="14"
- x="557"
- height="5"
- width="1"
- id="rect10767-2"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path10769-0"
- d="m 559,14 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,3 1,0 0,-5 -1,0 0,1 -1,0 0,1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10771-9"
- d="m 565.75,14 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10773-7"
- d="m 570,14 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 0,-1.25 -1,0 0,1.25 -1,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10775-3"
- d="m 573,14 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g10815-7"
- transform="translate(21.98523,3)">
- <path
- id="path10799-2"
- d="m 534,74 0,5 1,0 0,-2 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="74"
- x="538"
- height="5"
- width="1"
- id="rect10801-6"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path10803-0"
- d="m 540,74 0,5 1,0 2,0 0,-1 -2,0 0,-4 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 544,74 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path10805-1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 551,74 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- id="path10807-6"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 554,74 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path10809-5"
- inkscape:connector-curvature="0" />
- <path
- id="path10811-7"
- d="m 558,74 0,5 1,0 2,0 0,-1 -2,0 0,-4 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10813-5"
- d="m 562,74 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10815-4"
- d="m 567,74 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10817-1"
- d="m 570,74 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g10827-2"
- transform="translate(21,0)">
- <path
- id="path10672-0"
- d="m 535,119 0,1 2,0 0,1 1,0 0,-1.25 -1,0 0,-0.75 -2,0 z m 2,2 -1,0 0,1 1,0 0,-1 z m 0,1 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.25 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10678-0"
- d="m 539,119 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10680-1"
- d="m 545,119 0,3.25 1,0 0,1.75 1,0 0,-1.75 1,0 0,-3.25 -1,0 0,3 -1,0 0,-3 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="119"
- x="549"
- height="5"
- width="1"
- id="rect10682-4"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path10684-6"
- d="m 551,119 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10686-0"
- d="m 555,119 0,3.25 1,0 0,1.75 1,0 0,-1.75 1,0 0,1.75 1,0 0,-1.75 1,0 0,-3.25 -1,0 0,3 -1,0 0,-2 -1,0 0,2 -1,0 0,-3 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g10835-7"
- transform="translate(16,1)">
- <path
- id="path10688-1"
- d="m 540,160 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10690-7"
- d="m 544,160 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="160"
- x="548"
- height="5"
- width="1"
- id="rect10692-7"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path10694-7"
- d="m 550,160 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect10696-7"
- width="1"
- height="5"
- x="554"
- y="160" />
- <path
- id="path10698-3"
- d="m 556,160 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10700-3"
- d="m 562,160 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 0,-1.25 -0.99999,0 0,1.25 -1.00001,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g10846-5"
- transform="translate(21,0)">
- <path
- id="path10703-9"
- d="m 535.75,224 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10705-9"
- d="m 539,224 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="224"
- x="544"
- height="5"
- width="1"
- id="rect10708-8"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path10711-1"
- d="m 546,224 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,3 1,0 0,-5 -1,0 0,1 -1,0 0,1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10714-8"
- d="m 552.75,224 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10716-2"
- d="m 556,224 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect10718-6"
- width="1"
- height="5"
- x="560"
- y="224" />
- <path
- id="path10734-6"
- d="m 563,224 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10736-0"
- d="m 567,224 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g10857-3"
- transform="translate(22,-10)">
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 535,267 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,3 1,0 0,-5 -1,0 0,1 -1,0 0,1 z"
- id="path10744-8"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 542,267 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- id="path10746-0"
- inkscape:connector-curvature="0" />
- <path
- id="path10748-1"
- d="m 546,267 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="267"
- x="550"
- height="5"
- width="1"
- id="rect10750-2"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path10752-5"
- d="m 552,267 0,5 1,0 0,-2 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="267"
- x="556"
- height="5"
- width="1"
- id="rect10754-0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path10756-9"
- d="m 558,267 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10758-4"
- d="m 562,267 0,5 1,0 0,-2 1,0 0,2 1,0 0,-2 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10760-7"
- d="m 567,267 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g10803-8"
- transform="translate(25,-1)">
- <path
- id="path10777-3"
- d="m 532,36 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10781-5"
- d="m 539.75,36 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10783-1"
- d="m 543,36 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10785-2"
- d="m 547,36 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 555,36 0,1.75 -1,0 0,1.25 -1,0 0,2 1,0 0,-1.75 1,0 0,-1.25 1,0 0,-2 -1,0 z"
- id="path10787-0"
- inkscape:connector-curvature="0" />
- <path
- id="path10789-1"
- d="m 558,36 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10791-6"
- d="m 562,36 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 566,36 0,2 1,0 0,-2 -1,0 z m 1,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,-2 -1,0 0,2 z m 0,1 0,2 1,0 0,-2 -1,0 z m -1,0 -1,0 0,2 1,0 0,-2 z"
- id="path10795-4"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 570,36 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- id="path10797-0"
- inkscape:connector-curvature="0" />
- <path
- id="path10800-6"
- d="m 535,36 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g10885-1"
- transform="translate(19,125)">
- <path
- id="path10869-8"
- d="m 538,299 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10871-9"
- d="m 542,299 0,4.25 1,0 0,0.75 2,0 0,-0.75 1,0 0,-4.25 -1,0 0,4 -2,0 0,-4 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10873-8"
- d="m 547,299 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10875-4"
- d="m 551,299 0,5 1,0 2,0 0,-1 -2,0 0,-4 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="299"
- x="555"
- height="5"
- width="1"
- id="rect10877-1"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path10879-4"
- d="m 557,299 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10881-3"
- d="m 562,299 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10883-9"
- d="m 566,299 0,5 1,0 0,-2 1,0 0,2 1,0 0,-2 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g10921-8"
- transform="translate(21,128)">
- <path
- id="path10895-8"
- d="m 539.75,359 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10897-0"
- d="m 535,359 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10899-8"
- d="m 543,359 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 547.75,359 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path10901-7"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g10914-7"
- transform="translate(22,125)">
- <path
- id="path10903-8"
- d="m 545,393 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10906-3"
- d="m 549,393 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10908-8"
- d="m 534,393 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,3 1,0 0,-5 -1,0 0,1 -1,0 0,1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10910-3"
- d="m 541,393 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10912-7"
- d="m 554,393 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g10942-1"
- transform="translate(22.01477,127)">
- <path
- id="path10928-0"
- d="m 538,412 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10930-7"
- d="m 534,412 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="412"
- x="542"
- height="5"
- width="1"
- id="rect10932-3"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path10934-4"
- d="m 549,412 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10936-9"
- d="m 553,412 0,5 1,0 0,-2 1,0 0,2 1,0 0,-2 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10938-6"
- d="m 558,412 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10940-5"
- d="m 544,412 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g10966-1"
- transform="translate(22.01477,127)">
- <path
- id="path10951-0"
- d="m 534,434 0,5 1,0 1,0 0,-0.5 1,0 0,-1.5 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z m 0,2 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10953-9"
- d="m 556,434 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10956-9"
- d="m 552,434 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10958-6"
- d="m 562,434 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10960-8"
- d="m 543,434 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path10962-3"
- d="m 538,434 0,4.25 1,0 0,0.75 2,0 0,-0.75 1,0 0,-4.25 -1,0 0,4 -2,0 0,-4 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 547,434 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- id="path10964-4"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g10980-8"
- transform="translate(19,127)">
- <rect
- y="486"
- x="542"
- height="5"
- width="1"
- id="rect10975-4"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path10978-9"
- d="m 537,486 0,4.25 1,0 0,0.75 2,0 0,-0.75 1,0 0,-4.25 -1,0 0,4 -2,0 0,-4 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="opacity:0.4;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 544,133 0,1 9,0 0,62 -9,0 0,1 9,0 1,0 0,-33 1,0 0,-1 -1,0 0,-30 -1,0 -9,0 z"
- id="rect11044-9"
- sodipodi:nodetypes="ccccccccccccccc"
- inkscape:connector-curvature="0" />
- <a
- style="display:inline;enable-background:new"
- id="a28530-2">
- <g
- style="fill:#b3b3b3"
- transform="translate(-3e-6,1)"
- id="g11054-5">
- <path
- id="path19464-5"
- d="m 1.75,13 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19466-3"
- d="m 1,34 0,5 1,0 1,0 0,-0.5 1,0 0,-1.5 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 L 3,34 2,34 1,34 z m 1,1 1,0 0,1 -1,0 0,-1 z m 0,2 1,0 0,1 -1,0 0,-1 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19468-3"
- d="m 2,55.25 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19470-3"
- d="m 1,76 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 L 3,76 1,76 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19472-7"
- d="m 1,98 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19474-4"
- d="m 1,118 0,5 1,0 0,-2 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19476-3"
- d="m 2,139 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 0,-1.25 -1,0 0,1.25 -1,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19478-8"
- d="m 1,160 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="182"
- x="2"
- height="5"
- width="1"
- id="rect19480-0"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path19482-8"
- d="m 3,202 0,4 -1,0 0,-1 -1,0 0,1 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-4 -1,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19484-8"
- d="m 1,223 0,5 1,0 0,-1.75 1,0 0,-1.5 -1,0 0,-1.75 -1,0 z m 2,1.75 1,0 0,-1.75 -1,0 0,1.75 z m 0,1.5 0,1.75 1,0 0,-1.75 -1,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19486-0"
- d="m 1,244 0,5 1,0 2,0 0,-1 -2,0 0,-4 -1,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19488-6"
- d="m 3e-6,265 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 0,0 z m 2,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,3 1,0 0,-5 -1,0 0,1 -1,0 0,1 0,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19490-8"
- d="m 1,286 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19492-1"
- d="m 2,307 0,1 1,0 0,-1 -1,0 z m 1,1 0,3 1,0 0,-3 -1,0 z m 0,3 -1,0 0,1 1,0 0,-1 z m -1,0 0,-3 -1,0 0,3 1,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- sodipodi:nodetypes="cccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path19494-9"
- d="m 1,328 0,5 1,0 0,-2 1.25,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19496-8"
- d="m 2,349 0,1 1,0 0,-1 -1,0 z m 1,1 0,3 1,0 0,-3 -1,0 z m 0,3 -1,0 0,1 1,0 0,-1 z m 0,1 0,1 1,0 0,-1 -1,0 z m -1,-1 0,-3 -1,0 0,3 1,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- sodipodi:nodetypes="ccccccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path19498-9"
- d="m 1,370 0,5 1,0 0,-2 1,0 0,2 1,0 0,-2 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19500-7"
- d="m 2,391 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19502-2"
- d="m 1,412 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19504-2"
- d="m 1,434 0,4.25 1,0 0,0.75 2,0 0,-0.75 1,0 0,-4.25 -1,0 0,4 -2,0 0,-4 -1,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19506-8"
- d="m 1,455 0,3.25 1,0 0,1.75 1,0 0,-1.75 1,0 0,-3.25 -1,0 0,3 -1,0 0,-3 -1,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19508-2"
- d="m 3e-6,475 0,3.25 1,0 0,1.75 1,0 0,-1.75 0.999997,0 0,1.75 1.000003,0 0,-1.75 1,0 0,-3.25 -1,0 0,3 L 3,478 l 0,-2 -0.999997,0 0,2 -1,0 0,-3 -1,0 0,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 1,497 0,2 1,0 0,-2 -1,0 z m 1,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,-2 -1,0 0,2 z m 0,1 0,2 1,0 0,-2 -1,0 z m -1,0 -1,0 0,2 1,0 0,-2 z"
- id="rect19510-8"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 1.750003,556 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 0,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path38399-9"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 1.000003,577 0,5 1,0 1,0 0,-0.5 1,0 0,-1.5 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 0,0 z m 1,1 1,0 0,1 -1,0 0,-1 z m 0,2 1,0 0,1 -1,0 0,-1 z"
- id="path38401-0"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 2.000003,598.25 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 0,0 z"
- id="path38403-7"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 1.000003,619 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 0,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- id="path38405-8"
- inkscape:connector-curvature="0" />
- <path
- id="path38411-1"
- d="m 1.750003,563 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 0,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path38413-5"
- d="m 1.750003,584 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 0,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 1.750003,605 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 0,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path38415-8"
- inkscape:connector-curvature="0" />
- <path
- id="path38417-6"
- d="m 1.750003,626 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 0,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path38419-1"
- d="m 548.75,556 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path38421-2"
- d="m 548,577 0,5 1,0 1,0 0,-0.5 1,0 0,-1.5 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z m 0,2 1,0 0,1 -1,0 0,-1 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path38423-4"
- d="m 549,598.25 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path38425-2"
- d="m 548,619 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 548.75,563 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path38427-5"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 548.75,584 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path38429-8"
- inkscape:connector-curvature="0" />
- <path
- id="path38431-6"
- d="m 548.75,605 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 548.75,626 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path38433-2"
- inkscape:connector-curvature="0" />
- </g>
- </a>
- <g
- id="g15986">
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 12,2 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- id="path19537-6"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 33,2 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 L 35,2 33,2 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- id="path19539-5"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 54,2 0,1 2,0 0,1 1,0 0,-1.25 -1,0 L 56,2 54,2 z m 2,2 -1,0 0,1 1,0 0,-1 z m 0,1 0,1 -2,0 0,1 2,0 0,-0.75 1,0 L 57,5 56,5 z"
- id="path19541-3"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 75,2 0,3 1,0 1,0 0,2 1,0 0,-4 -1,0 0,1 -1,0 0,-2 -1,0 z"
- id="path19543-9"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 96,2 0,3 1,0 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path19545-2"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 118,2 0,0.75 -1,0 0,3.25 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-1 -0.75,0 0,-1 -1.25,0 0,-1 1.5,0 0,-1 -1.5,0 z m 0,3 1,0 0,1 -1,0 0,-1 z"
- id="path19547-4"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 138,2 0,1 2,0 0,1 -1,0 0,3 1,0 0,-2.75 1,0 0,-1.25 0,-1 -3,0 z"
- id="path19549-6"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 159.75,2 0,1 -0.5,0 0,1 0.5,0 0,1 -0.75,0 0,1 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-1 -0.75,0 0,-1 0.5,0 0,-1 -0.5,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z m 0,2 1,0 0,1 -1,0 0,-1 z"
- id="path19551-18"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 180.75,2 0,1 -0.75,0 0,1 0.75,0 0,1 1.25,0 0,1 -1.5,0 0,1 1.5,0 0,-0.75 1,0 0,-3.25 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path19553-2"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 202.75,2 0,1 -0.75,0 0,3 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-3 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,3 -1,0 0,-3 z"
- id="path19555-1"
- sodipodi:nodetypes="cccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path19559-1"
- d="m 514,2 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19561-9"
- d="m 476,2 0,1 2,0 0,1 1,0 0,-1.25 -1,0 0,-0.75 -2,0 z m 2,2 -1,0 0,1 1,0 0,-1 z m 0,1 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.25 -1,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19563-7"
- d="m 497,2 0,3 1,0 1,0 0,2 1,0 0,-4 -1,0 0,1 -1,0 0,-2 -1,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path19565-6"
- d="m 518,2 0,3 1,0 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 200,2 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- id="path19577-2"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 244,2 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- id="path19579-9"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 265,2 0,1 2,0 0,1 1,0 0,-1.25 -1,0 0,-0.75 -2,0 z m 2,2 -1,0 0,1 1,0 0,-1 z m 0,1 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.25 -1,0 z"
- id="path19581-5"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 286,2 0,3 1,0 1,0 0,2 1,0 0,-4 -1,0 0,1 -1,0 0,-2 -1,0 z"
- id="path19583-2"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 307,2 0,3 1,0 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path19585-0"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 329,2 0,0.75 -1,0 0,3.25 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-1 -0.75,0 0,-1 -1.25,0 0,-1 1.5,0 0,-1 -1.5,0 z m 0,3 1,0 0,1 -1,0 0,-1 z"
- id="path19587-0"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 349,2 0,1 2,0 0,1 -1,0 0,3 1,0 0,-2.75 1,0 0,-1.25 0,-1 -3,0 z"
- id="path19589-3"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 370.75,2 0,1 -0.5,0 0,1 0.5,0 0,1 -0.75,0 0,1 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-1 -0.75,0 0,-1 0.5,0 0,-1 -0.5,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z m 0,2 1,0 0,1 -1,0 0,-1 z"
- id="path19591-9"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 391.75,2 0,1 -0.75,0 0,1 0.75,0 0,1 1.25,0 0,1 -1.5,0 0,1 1.5,0 0,-0.75 1,0 0,-3.25 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path19593-1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 413.75,2 0,1 -0.75,0 0,3 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-3 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,3 -1,0 0,-3 z m 0.25,1 0,1 0.5,0 0,-1 -0.5,0 z"
- id="path19595-8"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 221,2 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- id="path19597-1"
- inkscape:connector-curvature="0" />
- <path
- id="path19599-9"
- d="m 224,2 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 242,2 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- id="path19601-5"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 263,2 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- id="path19603-3"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 284,2 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- id="path19605-2"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 305,2 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- id="path19607-5"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 326,2 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- id="path19609-2"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 347,2 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- id="path19611-5"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 368,2 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- id="path19613-8"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 389,2 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- id="path19615-6"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 409,2 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- id="path19617-7"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 435,2 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- id="path19619-7"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 430,2 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- id="path19621-2"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 451,2 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- id="path19623-2"
- inkscape:connector-curvature="0" />
- <path
- id="path19625-9"
- d="m 455,2 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 472,2 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- id="path19627-4"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 493,2 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- id="path19629-1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 536,2 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- id="path11036-9"
- inkscape:connector-curvature="0" />
- <path
- id="path11038-6"
- d="m 541,2 0,0.75 -1,0 0,3.25 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-1 -0.75,0 0,-1 -1.25,0 0,-1 1.5,0 0,-1 -1.5,0 z m 0,3 1,0 0,1 -1,0 0,-1 z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g11125-9"
- transform="translate(547,1)"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate">
- <path
- id="path11128-8"
- d="m 1.75,13 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11130-2"
- d="m 1,34 0,5 1,0 1,0 0,-0.5 1,0 0,-1.5 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 L 3,34 2,34 1,34 z m 1,1 1,0 0,1 -1,0 0,-1 z m 0,2 1,0 0,1 -1,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11132-5"
- d="m 2,55.25 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11134-5"
- d="m 1,76 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 L 3,76 1,76 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11136-4"
- d="m 1,98 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11138-9"
- d="m 1,118 0,5 1,0 0,-2 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11140-1"
- d="m 2,139 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 0,-1.25 -1,0 0,1.25 -1,0 0,-3 2,0 0,-1 -2,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11142-2"
- d="m 1,160 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="182"
- x="2"
- height="5"
- width="1"
- id="rect11144-5"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path11146-0"
- d="m 3,202 0,4 -1,0 0,-1 -1,0 0,1 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-4 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11148-8"
- d="m 1,223 0,5 1,0 0,-1.75 1,0 0,-1.5 -1,0 0,-1.75 -1,0 z m 2,1.75 1,0 0,-1.75 -1,0 0,1.75 z m 0,1.5 0,1.75 1,0 0,-1.75 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11150-3"
- d="m 1,244 0,5 1,0 2,0 0,-1 -2,0 0,-4 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11152-9"
- d="m 1,265 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,3 1,0 0,-5 -1,0 0,1 -1,0 0,1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11154-3"
- d="m 1,286 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11156-9"
- d="m 2,307 0,1 1,0 0,-1 -1,0 z m 1,1 0,3 1,0 0,-3 -1,0 z m 0,3 -1,0 0,1 1,0 0,-1 z m -1,0 0,-3 -1,0 0,3 1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- sodipodi:nodetypes="cccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path11158-6"
- d="m 1,328 0,5 1,0 0,-2 1.25,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11160-7"
- d="m 2,349 0,1 1,0 0,-1 -1,0 z m 1,1 0,3 1,0 0,-3 -1,0 z m 0,3 -1,0 0,1 1,0 0,-1 z m 0,1 0,1 1,0 0,-1 -1,0 z m -1,-1 0,-3 -1,0 0,3 1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- sodipodi:nodetypes="ccccccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path11162-9"
- d="m 1,370 0,5 1,0 0,-2 1,0 0,2 1,0 0,-2 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11164-9"
- d="m 2,391 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11166-7"
- d="m 1,412 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11168-6"
- d="m 1,434 0,4.25 1,0 0,0.75 2,0 0,-0.75 1,0 0,-4.25 -1,0 0,4 -2,0 0,-4 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11170-9"
- d="m 1,455 0,3.25 1,0 0,1.75 1,0 0,-1.75 1,0 0,-3.25 -1,0 0,3 -1,0 0,-3 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path11172-3"
- d="m 3e-6,474.75 0,3.25 1,0 0,1.75 1,0 0,-1.75 L 3,478 l 0,1.75 1.000003,0 0,-1.75 1,0 0,-3.25 -1,0 0,3 -1.000003,0 0,-2 -0.999997,0 0,2 -1,0 0,-3 -1,0 0,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 1,497 0,2 1,0 0,-2 -1,0 z m 1,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,-2 -1,0 0,2 z m 0,1 0,2 1,0 0,-2 -1,0 z m -1,0 -1,0 0,2 1,0 0,-2 z"
- id="path11174-5"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path38393-7"
- d="m 1,518 0,2.25 1,0 0,2.75 1,0 0,-2.75 1,0 0,-2.25 -1,0 0,2 -1,0 0,-2 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path38395-6"
- d="m 1,539 0,1 2,0 0,1 1,0 0,-1 0,-1 -3,0 z m 2,2 -1,0 0,1 1,0 0,-1 z m -1,1 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 548,518 0,2.25 1,0 0,2.75 1,0 0,-2.75 1,0 0,-2.25 -1,0 0,2 -1,0 0,-2 -1,0 z"
- id="path38435-6"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 548,539 0,1 2,0 0,1 1,0 0,-1 0,-1 -3,0 z m 2,2 -1,0 0,1 1,0 0,-1 z m -1,1 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- id="path38437-5"
- inkscape:connector-curvature="0" />
- <g
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="g41041-8"
- transform="translate(0,636)">
- <path
- id="path41043-2"
- d="m 12,1 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41045-5"
- d="m 33,1 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 L 35,1 33,1 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41047-4"
- d="m 54,1 0,1 2,0 0,1 1,0 0,-1.25 -1,0 L 56,1 54,1 z m 2,2 -1,0 0,1 1,0 0,-1 z m 0,1 0,1 -2,0 0,1 2,0 0,-0.75 1,0 L 57,4 56,4 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41049-4"
- d="m 75,1 0,3 1,0 1,0 0,2 1,0 0,-4 -1,0 0,1 -1,0 0,-2 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41051-1"
- d="m 96,1 0,3 1,0 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41053-6"
- d="m 118,1 0,0.75 -1,0 0,3.25 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-1 -0.75,0 0,-1 -1.25,0 0,-1 1.5,0 0,-1 -1.5,0 z m 0,3 1,0 0,1 -1,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41055-1"
- d="m 138,1 0,1 2,0 0,1 -1,0 0,3 1,0 0,-2.75 1,0 0,-1.25 0,-1 -3,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41057-6"
- d="m 159.75,1 0,1 -0.5,0 0,1 0.5,0 0,1 -0.75,0 0,1 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-1 -0.75,0 0,-1 0.5,0 0,-1 -0.5,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z m 0,2 1,0 0,1 -1,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41059-3"
- d="m 180.75,1 0,1 -0.75,0 0,1 0.75,0 0,1 1.25,0 0,1 -1.5,0 0,1 1.5,0 0,-0.75 1,0 0,-3.25 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccccccccccccccc"
- id="path41061-3"
- d="m 202.75,1 0,1 -0.75,0 0,3 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-3 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,3 -1,0 0,-3 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 514,1 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- id="path41063-5"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 476,1 0,1 2,0 0,1 1,0 0,-1.25 -1,0 0,-0.75 -2,0 z m 2,2 -1,0 0,1 1,0 0,-1 z m 0,1 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.25 -1,0 z"
- id="path41065-5"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 497,1 0,3 1,0 1,0 0,2 1,0 0,-4 -1,0 0,1 -1,0 0,-2 -1,0 z"
- id="path41067-3"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 518,1 0,3 1,0 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path41069-2"
- inkscape:connector-curvature="0" />
- <path
- id="path41071-8"
- d="m 200,1 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41073-2"
- d="m 244,1 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41075-5"
- d="m 265,1 0,1 2,0 0,1 1,0 0,-1.25 -1,0 0,-0.75 -2,0 z m 2,2 -1,0 0,1 1,0 0,-1 z m 0,1 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.25 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41077-3"
- d="m 286,1 0,3 1,0 1,0 0,2 1,0 0,-4 -1,0 0,1 -1,0 0,-2 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41079-6"
- d="m 307,1 0,3 1,0 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41081-1"
- d="m 329,1 0,0.75 -1,0 0,3.25 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-1 -0.75,0 0,-1 -1.25,0 0,-1 1.5,0 0,-1 -1.5,0 z m 0,3 1,0 0,1 -1,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41083-8"
- d="m 349,1 0,1 2,0 0,1 -1,0 0,3 1,0 0,-2.75 1,0 0,-1.25 0,-1 -3,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41085-6"
- d="m 370.75,1 0,1 -0.5,0 0,1 0.5,0 0,1 -0.75,0 0,1 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-1 -0.75,0 0,-1 0.5,0 0,-1 -0.5,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z m 0,2 1,0 0,1 -1,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41087-2"
- d="m 391.75,1 0,1 -0.75,0 0,1 0.75,0 0,1 1.25,0 0,1 -1.5,0 0,1 1.5,0 0,-0.75 1,0 0,-3.25 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41089-1"
- d="m 413.75,1 0,1 -0.75,0 0,3 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-3 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,3 -1,0 0,-3 z m 0.25,1 0,1 0.5,0 0,-1 -0.5,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41091-4"
- d="m 221,1 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 224,1 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- id="path41093-6"
- inkscape:connector-curvature="0" />
- <path
- id="path41095-2"
- d="m 242,1 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41097-9"
- d="m 263,1 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41099-1"
- d="m 284,1 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41101-5"
- d="m 305,1 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41103-0"
- d="m 326,1 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41105-3"
- d="m 347,1 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41107-6"
- d="m 368,1 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41109-4"
- d="m 389,1 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41111-9"
- d="m 409,1 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41113-2"
- d="m 435,1 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41116-9"
- d="m 430,1 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41118-3"
- d="m 451,1 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 455,1 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- id="path41120-4"
- inkscape:connector-curvature="0" />
- <path
- id="path41122-4"
- d="m 472,1 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41124-0"
- d="m 493,1 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41126-5"
- d="m 536,1 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 541,1 0,0.75 -1,0 0,3.25 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-1 -0.75,0 0,-1 -1.25,0 0,-1 1.5,0 0,-1 -1.5,0 z m 0,3 1,0 0,1 -1,0 0,-1 z"
- id="path41128-9"
- inkscape:connector-curvature="0" />
- </g>
- <path
- inkscape:connector-curvature="0"
- id="path30643-6"
- d="m 585,617.25 1,0 0,0.75 3,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -3,0 0,0.75 -1,0 0,1.5 z m 1,-0.25 0,-1 3,0 0,1 -3,0 z m 1,-0.25 1,0 0,-0.5 -1,0 0,0.5 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path30647-3"
- d="m 585,630 1,0 0,-2 1,0 0,1 1,0 0,-1 -0.75,0 0,-1 -1.5,0 0,1 -0.75,0 0,2 z m 3,-1 0,1 1,0 1,0 0,-3 -1,0 0,2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path30649-4"
- d="m 585,624 3,0 0,-1 0,-1 1,0 0,2 1,0 0,-2 -0.75,0 0,-1 -1.5,0 0,1 -0.75,0 0,1 -1,0 0,-2 -1,0 0,2 0,1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- y="589"
- x="-626"
- height="1"
- width="1"
- id="rect30651-2"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- transform="matrix(0,-1,1,0,0,0)" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect30653-8"
- width="1"
- height="1"
- x="-620"
- y="589"
- transform="matrix(0,-1,1,0,0,0)" />
- <rect
- y="589"
- x="-634"
- height="1"
- width="1"
- id="rect30725-87"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- transform="matrix(0,-1,1,0,0,0)" />
- <path
- inkscape:connector-curvature="0"
- id="path30723-5"
- d="m 587,638 2.25,0 0,-1 0.75,0 0,-1 -0.75,0 0,-1 -2.25,0 0,1 2,0 0,1 -2,0 0,1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- sodipodi:nodetypes="ccccccccccccc" />
- <path
- id="path30643-7-0"
- d="m 903.75,209 0,1 -0.75,0 0,3 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-3 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,3 -1,0 0,-3 z m 0.25,1 0,1 0.5,0 0,-1 -0.5,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path30647-6-1"
- d="m 891,209 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path30649-7-4"
- d="m 897,209 0,3 1,0 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="213"
- x="895"
- height="1"
- width="1"
- id="rect30651-8-6"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect30653-7-0"
- width="1"
- height="1"
- x="901"
- y="213" />
- <rect
- y="213"
- x="887"
- height="1"
- width="1"
- id="rect30725-8-7"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path30723-1-1"
- d="m 883,211 0,2.25 1,0 0,0.75 1,0 0,-0.75 1,0 0,-2.25 -1,0 0,2 -1,0 0,-2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(810,316)"
- id="g72798"
- style="opacity:0.5;display:inline;enable-background:new">
- <g
- id="g72716">
- <path
- id="path72434"
- d="m 186,-127 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 0,-1.25 -1,0 0,1.25 -1,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="-127"
- x="219"
- height="5"
- width="1"
- id="rect72436"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path72438"
- d="m 144,-127 0,4 -1,0 0,-1 -1,0 0,1 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-4 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path72440"
- d="m 189,-127 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path72442"
- d="m 165,-127 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path72446"
- d="m 130,-127 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path72448"
- d="m 154,-127 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path72450"
- d="m 133,-127 0,4.25 1,0 0,0.75 2,0 0,-0.75 1,0 0,-4.25 -1,0 0,4 -2,0 0,-4 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path72452"
- d="m 138,-127 0,5 1,0 1,0 0,-0.5 1,0 0,-1.5 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z m 0,2 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path72454"
- d="m 151,-127 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path72456"
- d="m 146,-127 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 209,-127 0,5 1,0 2,0 0,-1 -2,0 0,-4 -1,0 z"
- id="path72458"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 160,-127 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- id="path72460" />
- <path
- id="path72462"
- d="m 171,-127 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path72464"
- d="m 175,-127 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 179,-127 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path72466" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 194,-127 0,4.25 1,0 0,0.75 2,0 0,-0.75 1,0 0,-4.25 -1,0 0,4 -2,0 0,-4 -1,0 z"
- id="path72468" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 202,-127 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 0,-1.25 -1,0 0,1.25 -1,0 0,-3 2,0 0,-1 -2,0 z"
- id="path72470" />
- <path
- id="path72472"
- d="m 205,-127 0,5 1,0 0,-2 1.25,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- id="path72474"
- d="m 215,-127 0,5 1,0 2,0 0,-1 -2,0 0,-4 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 222,-127 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- id="path72476" />
- <path
- id="path72478"
- d="m 225,-127 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 229,-127 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- id="path72480" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 235,-127 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- id="path72482" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 238,-127 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path72484" />
- <path
- id="path72486"
- d="m 242.75,-123 0,1 -0.75,0 0,1 1,0 0,-1 1,0 0,-1 -1.25,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- id="path32008-7"
- d="m 72,-127 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path32010-4"
- d="m 76,-127 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- y="-127"
- x="80"
- height="5"
- width="1"
- id="rect32012-0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path32015-9"
- d="m 83,-127 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path32017-4"
- d="m 89,-127 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path32019-8"
- d="m 97,-127 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path32021-8"
- d="m 93,-127 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path32023-2"
- d="m 102,-127 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path32026-4"
- d="m 106,-127 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 110,-127 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- id="path32029-5" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 115,-127 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- id="path32031-5" />
- <rect
- y="-127"
- x="121"
- height="5"
- width="1"
- id="rect32033-1"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 124,-127 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- id="path32035-7" />
- </g>
- <g
- id="g72757">
- <path
- id="path72562"
- d="m 78,-119 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="-119"
- x="82"
- height="5"
- width="1"
- id="rect72564"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path72576"
- d="m 72,-119 0,3.25 1,0 0,1.75 1,0 0,-1.75 1,0 0,1.75 1,0 0,-1.75 1,0 0,-3.25 -1,0 0,3 -1,0 0,-2 -1,0 0,2 -1,0 0,-3 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path72578"
- d="m 130,-119 0,2.25 1,0 0,2.75 1,0 0,-2.75 1,0 0,-2.25 -1,0 0,2 -1,0 0,-2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path72580"
- d="m 94.75,-119 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path72582"
- d="m 85,-119 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 88,-119 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- id="path72588" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 99,-119 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- id="path72590" />
- <path
- id="path72592"
- d="m 103,-119 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 107,-119 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- id="path72594" />
- <path
- id="path72596"
- d="m 111,-119 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,3 1,0 0,-5 -1,0 0,1 -1,0 0,1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 117,-119 0,5 1,0 0,-2 1.25,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- id="path72598" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 121.75,-119 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path72600" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 125,-119 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- id="path72602" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect72604"
- width="1"
- height="5"
- x="136"
- y="-119" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 138,-119 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- id="path72606" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 144.75,-119 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path72608" />
- <path
- inkscape:connector-curvature="0"
- id="path72610"
- d="m 148,-119 0,5 1,0 2,0 0,-1 -2,0 0,-4 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 153,-119 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- id="path72612" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 157,-119 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- id="path72614" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 163,-119 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 0,-1.25 -1,0 0,1.25 -1,0 0,-3 2,0 0,-1 -2,0 z"
- id="path72616" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect72618"
- width="1"
- height="5"
- x="174"
- y="-119" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 168,-119 0,3.25 1,0 0,1.75 1,0 0,-1.75 1,0 0,1.75 1,0 0,-1.75 1,0 0,-3.25 -1,0 0,3 -1,0 0,-2 -1,0 0,2 -1,0 0,-3 -1,0 z"
- id="path72620" />
- <path
- id="path72622"
- d="m 180,-119 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path72624"
- d="m 176,-119 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- id="path32207-9-7"
- d="m 187,-119 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path32209-6-7"
- d="m 191,-119 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path32211-3-7"
- d="m 195,-119 0,5 1,0 0,-2 1.25,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path32213-7-3"
- d="m 199,-119 0,2.25 1,0 0,2.75 1,0 0,-2.75 1,0 0,-2.25 -1,0 0,2 -1,0 0,-2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path32216-8-3"
- d="m 203,-119 0,5 1,0 0,-2 1,0 0,2 1,0 0,-2 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect32218-8-5"
- width="1"
- height="5"
- x="207"
- y="-119" />
- <path
- inkscape:connector-curvature="0"
- id="path32220-2-9"
- d="m 210,-119 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 0,-1.25 -1,0 0,1.25 -1,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path32222-9-9"
- d="m 213,-119 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path32224-1-8"
- d="m 217,-119 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path72678"
- d="m 225,-119 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 235,-119 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- id="path72680"
- inkscape:connector-curvature="0" />
- <rect
- y="-119"
- x="223"
- height="5"
- width="1"
- id="rect72682"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- y="-115"
- x="239"
- height="1"
- width="1"
- id="rect72684"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path72686"
- d="m 230,-119 0,5 1,0 0,-2 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(810,316)"
- style="display:inline;enable-background:new"
- id="g72880">
- <g
- transform="translate(231,-90)"
- id="g32242-4">
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m -12.25,-17 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path32244-2" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m -9,-17 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,3 1,0 0,-5 -1,0 0,1 -1,0 0,1 z"
- id="path32246-0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m -3,-17 0,5 1,0 1,0 0,-0.5 1,0 0,-1.5 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z m 0,2 1,0 0,1 -1,0 0,-1 z"
- id="path32248-9" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 1,-17 0,5 1,0 0,-2 1,0 0,2 1,0 0,-2 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- id="path32250-7" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 6,-17 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- id="path32252-3" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 10,-17 0,1 2,0 0,1 1,0 0,-1 0,-1 -3,0 z m 2,2 -1,0 0,1 1,0 0,-1 z m -1,1 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- id="path32254-7" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m -43.25,-17 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path32256-2" />
- <path
- inkscape:connector-curvature="0"
- id="path32258-6"
- d="m -40,-17 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path32260-0"
- d="m -35,-17 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m -31,-17 0,5 1,0 0,-2 1,0 0,2 1,0 0,-2 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- id="path32262-1" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m -27,-17 0,1 2,0 0,1 1,0 0,-1 0,-1 -3,0 z m 2,2 -1,0 0,1 1,0 0,-1 z m -1,1 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- id="path32264-6" />
- <path
- inkscape:connector-curvature="0"
- id="path32266-5"
- d="m -23,-17 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path32268-7"
- d="m -17,-17 0,4 -1,0 0,-1 -1,0 0,1 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-4 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- y="-19"
- x="11"
- height="1"
- width="1"
- id="rect32270-5"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- </g>
- <g
- id="g21967-4"
- transform="translate(111.96875,-88)">
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 48,-20 0,0.75 -1,0 0,0.25 -0.25,0 0,1 -0.75,0 0,3 0.75,0 0,1 0.25,0 0,0.25 1,0 0,0.75 3,0 0,-0.75 1,0 0,-0.25 0.25,0 0,-1 0.75,0 0,-3 -0.75,0 0,-1 -0.25,0 0,-0.25 -1,0 0,-0.75 -3,0 z m 0,1 3,0 0,1 1,0 0,3 -1,0 0,1 -3,0 0,-1 -1,0 0,-3 1,0 0,-1 z"
- id="path32272-1"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccc" />
- <path
- inkscape:connector-curvature="0"
- id="path32274-2"
- d="m 49,-18 0,0.75 -1,0 0,1.5 1,0 0,0.75 1.25,0 0,-1 -1.25,0 0,-1 1.25,0 0,-1 -1.25,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- sodipodi:nodetypes="ccccccccccccc" />
- </g>
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 171.71875,-107 0,1 -0.75,0 0,3 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-3 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,3 -1,0 0,-3 z m 0.25,1 0,1 0.5,0 0,-1 -0.5,0 z"
- id="path72688" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 175.96875,-107 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- id="path72690" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 177.96875,-107 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- id="path72692" />
- <path
- id="path72694"
- d="m 166.96875,-107 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 182.96875,-106 0,1 1,0 0,-1 -1,0 z m -0.21875,3 0,1 -0.75,0 0,1 1,0 0,-1 1,0 0,-1 -1.25,0 z"
- id="path72696" />
- </g>
- <g
- style="opacity:0.4;display:inline;enable-background:new"
- id="g73280"
- transform="matrix(0,-1,1,0,722,710)">
- <g
- id="g73282">
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 186,-127 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 0,-1.25 -1,0 0,1.25 -1,0 0,-3 2,0 0,-1 -2,0 z"
- id="path73284" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect73286"
- width="1"
- height="5"
- x="219"
- y="-127" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 144,-127 0,4 -1,0 0,-1 -1,0 0,1 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-4 -1,0 z"
- id="path73288" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 189,-127 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- id="path73290" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 165,-127 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- id="path73292" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 130,-127 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- id="path73294" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 154,-127 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- id="path73296" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 133,-127 0,4.25 1,0 0,0.75 2,0 0,-0.75 1,0 0,-4.25 -1,0 0,4 -2,0 0,-4 -1,0 z"
- id="path73298" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 138,-127 0,5 1,0 1,0 0,-0.5 1,0 0,-1.5 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z m 0,2 1,0 0,1 -1,0 0,-1 z"
- id="path73300" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 151,-127 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- id="path73302" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 146,-127 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path73304" />
- <path
- inkscape:connector-curvature="0"
- id="path73306"
- d="m 209,-127 0,5 1,0 2,0 0,-1 -2,0 0,-4 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path73308"
- d="m 160,-127 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 171,-127 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- id="path73310" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 175,-127 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- id="path73312" />
- <path
- id="path73314"
- d="m 179,-127 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73316"
- d="m 194,-127 0,4.25 1,0 0,0.75 2,0 0,-0.75 1,0 0,-4.25 -1,0 0,4 -2,0 0,-4 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73318"
- d="m 202,-127 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 0,-1.25 -1,0 0,1.25 -1,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 205,-127 0,5 1,0 0,-2 1.25,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- id="path73320" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 215,-127 0,5 1,0 2,0 0,-1 -2,0 0,-4 -1,0 z"
- id="path73322"
- inkscape:connector-curvature="0" />
- <path
- id="path73324"
- d="m 222,-127 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 225,-127 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path73326" />
- <path
- id="path73328"
- d="m 229,-127 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73330"
- d="m 235,-127 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73332"
- d="m 238,-127 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 242.75,-123 0,1 -0.75,0 0,1 1,0 0,-1 1,0 0,-1 -1.25,0 z"
- id="path73334" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 72,-127 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- id="path73336"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 76,-127 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- id="path73338"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect73340"
- width="1"
- height="5"
- x="80"
- y="-127" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 83,-127 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- id="path73342"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 89,-127 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- id="path73344"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 97,-127 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- id="path73346"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 93,-127 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- id="path73348"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 102,-127 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- id="path73350"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 106,-127 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path73352"
- inkscape:connector-curvature="0" />
- <path
- id="path73354"
- d="m 110,-127 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73356"
- d="m 115,-127 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect73358"
- width="1"
- height="5"
- x="121"
- y="-127" />
- <path
- id="path73360"
- d="m 124,-127 0,0.75 -1,0 0,1.5 1,0 0,0.75 1,0 0,1 -2,0 0,1 2,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -1,0 0,-1 1.5,0 0,-1 -1.5,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g73362"
- transform="translate(175,-8)">
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 78,-119 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- id="path73364" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect73366"
- width="1"
- height="5"
- x="82"
- y="-119" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 72,-119 0,3.25 1,0 0,1.75 1,0 0,-1.75 1,0 0,1.75 1,0 0,-1.75 1,0 0,-3.25 -1,0 0,3 -1,0 0,-2 -1,0 0,2 -1,0 0,-3 -1,0 z"
- id="path73368" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 130,-119 0,2.25 1,0 0,2.75 1,0 0,-2.75 1,0 0,-2.25 -1,0 0,2 -1,0 0,-2 -1,0 z"
- id="path73370" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 94.75,-119 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- id="path73372" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 85,-119 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- id="path73374" />
- <path
- id="path73376"
- d="m 88,-119 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73378"
- d="m 99,-119 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 103,-119 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- id="path73380" />
- <path
- id="path73382"
- d="m 107,-119 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 111,-119 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,3 1,0 0,-5 -1,0 0,1 -1,0 0,1 z"
- id="path73384" />
- <path
- id="path73386"
- d="m 117,-119 0,5 1,0 0,-2 1.25,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73388"
- d="m 121.75,-119 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73390"
- d="m 125,-119 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="-119"
- x="136"
- height="5"
- width="1"
- id="rect73392"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path73394"
- d="m 138,-119 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73396"
- d="m 144.75,-119 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 148,-119 0,5 1,0 2,0 0,-1 -2,0 0,-4 -1,0 z"
- id="path73398"
- inkscape:connector-curvature="0" />
- <path
- id="path73400"
- d="m 153,-119 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73402"
- d="m 157,-119 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73404"
- d="m 163,-119 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 0,-1.25 -1,0 0,1.25 -1,0 0,-3 2,0 0,-1 -2,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="-119"
- x="174"
- height="5"
- width="1"
- id="rect73406"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- id="path73408"
- d="m 168,-119 0,3.25 1,0 0,1.75 1,0 0,-1.75 1,0 0,1.75 1,0 0,-1.75 1,0 0,-3.25 -1,0 0,3 -1,0 0,-2 -1,0 0,2 -1,0 0,-3 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 180,-119 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- id="path73410" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 176,-119 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- id="path73412" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 187,-119 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 -2,0 0,-3 2,0 0,-1 -2,0 z"
- id="path73414"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 191,-119 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- id="path73416"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 195,-119 0,5 1,0 0,-2 1.25,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- id="path73418"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 199,-119 0,2.25 1,0 0,2.75 1,0 0,-2.75 1,0 0,-2.25 -1,0 0,2 -1,0 0,-2 -1,0 z"
- id="path73420"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 203,-119 0,5 1,0 0,-2 1,0 0,2 1,0 0,-2 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- id="path73422"
- inkscape:connector-curvature="0" />
- <rect
- y="-119"
- x="207"
- height="5"
- width="1"
- id="rect73424"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 210,-119 0,0.75 -1,0 0,3.5 1,0 0,0.75 2,0 0,-1 0,-1.25 -1,0 0,1.25 -1,0 0,-3 2,0 0,-1 -2,0 z"
- id="path73426"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 213,-119 0,5 1,0 0,-2 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 0,-2 -1,0 z"
- id="path73428"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 217,-119 0,1 1,0 0,4 1,0 0,-4 1,0 0,-1 -3,0 0,0 z"
- id="path73430"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 225,-119 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- id="path73432" />
- <path
- inkscape:connector-curvature="0"
- id="path73434"
- d="m 235,-119 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect73436"
- width="1"
- height="5"
- x="223"
- y="-119" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect73438"
- width="1"
- height="1"
- x="239"
- y="-115" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 230,-119 0,5 1,0 0,-2 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path73440" />
- </g>
- </g>
- <g
- id="g73442"
- style="display:inline;enable-background:new"
- transform="matrix(0,-1,1,0,692,540.96875)">
- <g
- id="g73444"
- transform="translate(231,-90)">
- <path
- id="path73446"
- d="m -12.25,-17 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73448"
- d="m -9,-17 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,-1 -1,0 z m 1,0 1,0 0,3 1,0 0,-5 -1,0 0,1 -1,0 0,1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73450"
- d="m -3,-17 0,5 1,0 1,0 0,-0.5 1,0 0,-1.5 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z m 0,2 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73452"
- d="m 1,-17 0,5 1,0 0,-2 1,0 0,2 1,0 0,-2 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73454"
- d="m 6,-17 0,1 2,0 0,-1 -2,0 z m 2,1 0,3 1,0 0,-3 -1,0 z m 0,3 -2,0 0,1 2,0 0,-1 z m -2,0 0,-3 -1,0 0,3 1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73456"
- d="m 10,-17 0,1 2,0 0,1 1,0 0,-1 0,-1 -3,0 z m 2,2 -1,0 0,1 1,0 0,-1 z m -1,1 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73458"
- d="m -43.25,-17 0,1 -0.75,0 0,4 1,0 0,-2 1,0 0,2 1,0 0,-4 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m -40,-17 0,5 1,0 0,-3 1,0 0,-1 -1,0 0,-1 -1,0 z m 2,2 0,1 1,0 0,2 1,0 0,-5 -1,0 0,2 -1,0 z"
- id="path73460"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m -35,-17 0,1 0,3 0,1 2,0 0,-0.75 1,0 0,-3.5 -1,0 0,-0.75 -2,0 z m 1,1 1,0 0,3 -1,0 0,-3 z"
- id="path73462"
- inkscape:connector-curvature="0" />
- <path
- id="path73464"
- d="m -31,-17 0,5 1,0 0,-2 1,0 0,2 1,0 0,-2 -0.75,0 0,-1 0.75,0 0,-1.25 -1,0 0,-0.75 -1,0 -1,0 z m 1,1 1,0 0,1 -1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73466"
- d="m -27,-17 0,1 2,0 0,1 1,0 0,-1 0,-1 -3,0 z m 2,2 -1,0 0,1 1,0 0,-1 z m -1,1 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m -23,-17 0,5 1,0 2,0 0,-1 -2,0 0,-1 1,0 0,-1 -1,0 0,-1 2,0 0,-1 -2,0 -1,0 z"
- id="path73468"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m -17,-17 0,4 -1,0 0,-1 -1,0 0,1 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-4 -1,0 z"
- id="path73470"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect73472"
- width="1"
- height="1"
- x="11"
- y="-19" />
- </g>
- <g
- transform="translate(111.96875,-88)"
- id="g73474">
- <path
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccc"
- id="path73476"
- d="m 48,-20 0,0.75 -1,0 0,0.25 -0.25,0 0,1 -0.75,0 0,3 0.75,0 0,1 0.25,0 0,0.25 1,0 0,0.75 3,0 0,-0.75 1,0 0,-0.25 0.25,0 0,-1 0.75,0 0,-3 -0.75,0 0,-1 -0.25,0 0,-0.25 -1,0 0,-0.75 -3,0 z m 0,1 3,0 0,1 1,0 0,3 -1,0 0,1 -3,0 0,-1 -1,0 0,-3 1,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccc"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 49,-18 0,0.75 -1,0 0,1.5 1,0 0,0.75 1.25,0 0,-1 -1.25,0 0,-1 1.25,0 0,-1 -1.25,0 z"
- id="path73478"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path73480"
- d="m 171.71875,-107 0,1 -0.75,0 0,3 0.75,0 0,1 1.5,0 0,-1 0.75,0 0,-3 -0.75,0 0,-1 -1.5,0 z m 0.25,1 1,0 0,3 -1,0 0,-3 z m 0.25,1 0,1 0.5,0 0,-1 -0.5,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73482"
- d="m 175.96875,-107 0,1 -1,0 0,1 1,0 0,3 1,0 0,-5 -1,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path73484"
- d="m 177.96875,-107 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 166.96875,-107 0,1 2,0 0,1 -1,0 0,1 1,0 0,-0.75 1,0 0,-1.5 -1,0 0,-0.75 -2,0 z m 1,3 -1,0 0,1 0,1 3,0 0,-1 -2,0 0,-1 z"
- id="path73486" />
- <path
- id="path73488"
- d="m 182.96875,-106 0,1 1,0 0,-1 -1,0 z m -0.21875,3 0,1 -0.75,0 0,1 1,0 0,-1 1,0 0,-1 -1.25,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="opacity:0.4;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 545,238 0,1 9,0 0,41 -9,0 0,1 9,0 1,0 0,-21 1,0 0,-1 -1,0 0,-21 -1,0 z"
- id="rect11044-9-4"
- sodipodi:nodetypes="ccccccccccccccc"
- inkscape:connector-curvature="0" />
+ <g inkscape:groupmode="layer" id="layer4" inkscape:label="sheet layout" style="display:inline" sodipodi:insensitive="true">
+ <g style="display:inline;opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="translate(21)" id="g28552-1">
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 536,14 v 0.75 h -1 v 1.5 h 1 V 17 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 16 h -1 v -1 h 1.5 v -1 z" id="path28554-7" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 539,14 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path28556-4" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 544,14 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m 0,1 v 1 h 1 v -1 z m -2,-1 v -3 h -1 v 3 z" id="path28558-0" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 553,14 v 1.75 h -1 V 17 h -1 v 2 h 1 v -1.75 h 1 V 16 h 1 v -2 z" id="path28560-9" inkscape:connector-curvature="0"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="rect28562-4" width="1" height="1" x="548" y="18"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="rect28564-8" width="1" height="5" x="557" y="14"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 559,14 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v -1 z m 1,0 h 1 v 3 h 1 v -5 h -1 v 1 h -1 z" id="path28566-8" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 565.75,14 v 1 H 565 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" id="path28568-2" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 570,14 v 0.75 h -1 v 3.5 h 1 V 19 h 2 v -1 -1.25 h -1 V 18 h -1 v -3 h 2 v -1 z" id="path28570-4" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 573,14 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path28572-5" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="translate(21.98523,3)" id="g28574-5">
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 534,74 v 5 h 1 v -2 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path28576-1" inkscape:connector-curvature="0"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="rect28578-7" width="1" height="5" x="538" y="74"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 540,74 v 5 h 1 2 v -1 h -2 v -4 z" id="path28580-1" inkscape:connector-curvature="0"/>
+ <path id="path28582-1" d="m 544,74 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path28584-5" d="m 551,74 v 0.75 h -1 v 1.5 h 1 V 77 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 76 h -1 v -1 h 1.5 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path28586-2" d="m 554,74 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 558,74 v 5 h 1 2 v -1 h -2 v -4 z" id="path28588-7" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 562,74 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path28590-6" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 567,74 v 0.75 h -1 v 3.5 h 1 V 79 h 2 v -1 h -2 v -3 h 2 v -1 z" id="path28592-1" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 570,74 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" id="path28594-4" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="translate(21)" id="g28596-2">
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 535,119 v 1 h 2 v 1 h 1 v -1.25 h -1 V 119 Z m 2,2 h -1 v 1 h 1 z m 0,1 v 1 h -2 v 1 h 2 v -0.75 h 1 V 122 Z" id="path28598-3" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 539,119 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 119 Z m 1,1 h 1 v 3 h -1 z" id="path28600-2" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 545,119 v 3.25 h 1 V 124 h 1 v -1.75 h 1 V 119 h -1 v 3 h -1 v -3 z" id="path28602-2" inkscape:connector-curvature="0"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="rect28604-1" width="1" height="5" x="549" y="119"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 551,119 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path28606-6" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 555,119 v 3.25 h 1 V 124 h 1 v -1.75 h 1 V 124 h 1 v -1.75 h 1 V 119 h -1 v 3 h -1 v -2 h -1 v 2 h -1 v -3 z" id="path28608-8" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="translate(16,1)" id="g28610-5">
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 540,160 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path28612-7" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 544,160 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 160 Z m 1,1 h 1 v 3 h -1 z" id="path28614-6" inkscape:connector-curvature="0"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="rect28616-1" width="1" height="5" x="548" y="160"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 550,160 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" id="path28618-8" inkscape:connector-curvature="0"/>
+ <rect y="160" x="554" height="5" width="1" id="rect28620-9" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 556,160 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z" id="path28622-2" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 562,160 v 0.75 h -1 v 3.5 h 1 V 165 h 2 v -1 -1.25 h -0.99999 V 164 H 562 v -3 h 2 v -1 z" id="path28624-7" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="translate(21)" id="g28626-9">
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 535.75,224 v 1 H 535 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" id="path28628-5" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 539,224 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z" id="path28630-4" inkscape:connector-curvature="0"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="rect28632-3" width="1" height="5" x="544" y="224"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 546,224 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v -1 z m 1,0 h 1 v 3 h 1 v -5 h -1 v 1 h -1 z" id="path28634-1" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 552.75,224 v 1 H 552 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" id="path28636-2" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 556,224 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" id="path28638-3" inkscape:connector-curvature="0"/>
+ <rect y="224" x="560" height="5" width="1" id="rect28640-3" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 563,224 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z" id="path28642-4" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 567,224 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z" id="path28644-1" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="translate(22,-10)" id="g28646-1">
+ <path id="path28648-3" d="m 535,267 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v -1 z m 1,0 h 1 v 3 h 1 v -5 h -1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path28650-8" d="m 542,267 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 546,267 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 267 Z m 1,1 h 1 v 3 h -1 z" id="path28652-7" inkscape:connector-curvature="0"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="rect28654-4" width="1" height="5" x="550" y="267"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 552,267 v 5 h 1 v -2 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path28656-2" inkscape:connector-curvature="0"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="rect28658-7" width="1" height="5" x="556" y="267"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 558,267 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path28660-7" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 562,267 v 5 h 1 v -2 h 1 v 2 h 1 v -2 h -0.75 v -1 H 565 v -1.25 h -1 V 267 h -1 z m 1,1 h 1 v 1 h -1 z" id="path28662-9" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 567,267 v 0.75 h -1 v 1.5 h 1 V 270 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 269 h -1 v -1 h 1.5 v -1 z" id="path28664-3" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="translate(25,-1)" id="g28666-1">
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 532,36 v 0.75 h -1 v 1.5 h 1 V 39 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 38 h -1 v -1 h 1.5 v -1 z" id="path28668-9" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 539.75,36 v 1 H 539 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" id="path28670-8" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 543,36 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 36 Z m 1,1 h 1 v 3 h -1 z" id="path28672-6" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 547,36 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path28674-5" inkscape:connector-curvature="0"/>
+ <path id="path28676-0" d="m 555,36 v 1.75 h -1 V 39 h -1 v 2 h 1 v -1.75 h 1 V 38 h 1 v -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 558,36 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" id="path28678-2" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 562,36 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path28680-8" inkscape:connector-curvature="0"/>
+ <path id="path28682-6" d="m 566,36 v 2 h 1 v -2 z m 1,2 v 1 h 1 v -1 z m 1,0 h 1 v -2 h -1 z m 0,1 v 2 h 1 v -2 z m -1,0 h -1 v 2 h 1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path28684-0" d="m 570,36 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 535,36 v 5 h 1 v -2 h 1 v 2 h 1 v -5 h -1 v 2 h -1 v -2 z" id="path28686-2" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="translate(19,125)" id="g28688-4">
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 538,299 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z" id="path28690-8" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 542,299 v 4.25 h 1 V 304 h 2 v -0.75 h 1 V 299 h -1 v 4 h -2 v -4 z" id="path28692-6" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 547,299 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" id="path28694-5" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 551,299 v 5 h 1 2 v -1 h -2 v -4 z" id="path28696-0" inkscape:connector-curvature="0"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="rect28698-9" width="1" height="5" x="555" y="299"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 557,299 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z" id="path28700-0" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 562,299 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path28702-0" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 566,299 v 5 h 1 v -2 h 1 v 2 h 1 v -2 h -0.75 v -1 H 569 v -1.25 h -1 V 299 h -1 z m 1,1 h 1 v 1 h -1 z" id="path28704-6" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="translate(21,128)" id="g28706-1">
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 539.75,359 v 1 H 539 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" id="path28708-3" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 535,359 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 359 Z m 1,1 h 1 v 3 h -1 z" id="path28710-8" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 543,359 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" id="path28712-9" inkscape:connector-curvature="0"/>
+ <path id="path28714-3" d="m 547.75,359 v 1 H 547 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="translate(22,125)" id="g28716-4">
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 545,393 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 393 Z m 1,1 h 1 v 3 h -1 z" id="path28718-4" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 549,393 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path28720-6" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 534,393 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v -1 z m 1,0 h 1 v 3 h 1 v -5 h -1 v 1 h -1 z" id="path28722-0" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 541,393 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z" id="path28724-6" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 554,393 v 0.75 h -1 v 1.5 h 1 V 396 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 395 h -1 v -1 h 1.5 v -1 z" id="path28726-6" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="translate(22.01477,127)" id="g28728-1">
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 538,412 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 412 Z m 1,1 h 1 v 3 h -1 z" id="path28730-8" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 534,412 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path28732-4" inkscape:connector-curvature="0"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="rect28734-9" width="1" height="5" x="542" y="412"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 549,412 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z" id="path28736-6" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 553,412 v 5 h 1 v -2 h 1 v 2 h 1 v -2 h -0.75 v -1 H 556 v -1.25 h -1 V 412 h -1 z m 1,1 h 1 v 1 h -1 z" id="path28738-3" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 558,412 v 0.75 h -1 v 1.5 h 1 V 415 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 414 h -1 v -1 h 1.5 v -1 z" id="path28740-7" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 544,412 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" id="path28742-8" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="translate(22.01477,127)" id="g28744-8">
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 534,434 v 5 h 1 1 v -0.5 h 1 V 437 h -0.75 v -1 H 537 v -1.25 h -1 V 434 h -1 z m 1,1 h 1 v 1 h -1 z m 0,2 h 1 v 1 h -1 z" id="path28746-2" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 556,434 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z" id="path28748-9" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 552,434 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z" id="path28750-1" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 562,434 v 0.75 h -1 v 1.5 h 1 V 437 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 436 h -1 v -1 h 1.5 v -1 z" id="path28752-3" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 543,434 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" id="path28754-5" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 538,434 v 4.25 h 1 V 439 h 2 v -0.75 h 1 V 434 h -1 v 4 h -2 v -4 z" id="path28756-9" inkscape:connector-curvature="0"/>
+ <path id="path28758-8" d="m 547,434 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:0.3;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="translate(19,127)" id="g28760-4">
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="rect28762-0" width="1" height="5" x="542" y="486"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 537,486 v 4.25 h 1 V 491 h 2 v -0.75 h 1 V 486 h -1 v 4 h -2 v -4 z" id="path28764-7" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g10763-6" transform="translate(21)">
+ <path id="path10757-3" d="m 536,14 v 0.75 h -1 v 1.5 h 1 V 17 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 16 h -1 v -1 h 1.5 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10759-6" d="m 539,14 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10761-1" d="m 544,14 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m 0,1 v 1 h 1 v -1 z m -2,-1 v -3 h -1 v 3 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10763-5" d="m 553,14 v 1.75 h -1 V 17 h -1 v 2 h 1 v -1.75 h 1 V 16 h 1 v -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <rect y="18" x="548" height="1" width="1" id="rect10765-4" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <rect y="14" x="557" height="5" width="1" id="rect10767-2" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path id="path10769-0" d="m 559,14 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v -1 z m 1,0 h 1 v 3 h 1 v -5 h -1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10771-9" d="m 565.75,14 v 1 H 565 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10773-7" d="m 570,14 v 0.75 h -1 v 3.5 h 1 V 19 h 2 v -1 -1.25 h -1 V 18 h -1 v -3 h 2 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10775-3" d="m 573,14 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g10815-7" transform="translate(21.98523,3)">
+ <path id="path10799-2" d="m 534,74 v 5 h 1 v -2 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <rect y="74" x="538" height="5" width="1" id="rect10801-6" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path id="path10803-0" d="m 540,74 v 5 h 1 2 v -1 h -2 v -4 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 544,74 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path10805-1" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 551,74 v 0.75 h -1 v 1.5 h 1 V 77 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 76 h -1 v -1 h 1.5 v -1 z" id="path10807-6" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 554,74 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path10809-5" inkscape:connector-curvature="0"/>
+ <path id="path10811-7" d="m 558,74 v 5 h 1 2 v -1 h -2 v -4 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10813-5" d="m 562,74 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10815-4" d="m 567,74 v 0.75 h -1 v 3.5 h 1 V 79 h 2 v -1 h -2 v -3 h 2 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10817-1" d="m 570,74 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g10827-2" transform="translate(21)">
+ <path id="path10672-0" d="m 535,119 v 1 h 2 v 1 h 1 v -1.25 h -1 V 119 Z m 2,2 h -1 v 1 h 1 z m 0,1 v 1 h -2 v 1 h 2 v -0.75 h 1 V 122 Z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10678-0" d="m 539,119 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 119 Z m 1,1 h 1 v 3 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10680-1" d="m 545,119 v 3.25 h 1 V 124 h 1 v -1.75 h 1 V 119 h -1 v 3 h -1 v -3 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <rect y="119" x="549" height="5" width="1" id="rect10682-4" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path id="path10684-6" d="m 551,119 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10686-0" d="m 555,119 v 3.25 h 1 V 124 h 1 v -1.75 h 1 V 124 h 1 v -1.75 h 1 V 119 h -1 v 3 h -1 v -2 h -1 v 2 h -1 v -3 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g10835-7" transform="translate(16,1)">
+ <path id="path10688-1" d="m 540,160 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10690-7" d="m 544,160 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 160 Z m 1,1 h 1 v 3 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <rect y="160" x="548" height="5" width="1" id="rect10692-7" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path id="path10694-7" d="m 550,160 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" id="rect10696-7" width="1" height="5" x="554" y="160"/>
+ <path id="path10698-3" d="m 556,160 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10700-3" d="m 562,160 v 0.75 h -1 v 3.5 h 1 V 165 h 2 v -1 -1.25 h -0.99999 V 164 H 562 v -3 h 2 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g10846-5" transform="translate(21)">
+ <path id="path10703-9" d="m 535.75,224 v 1 H 535 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10705-9" d="m 539,224 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <rect y="224" x="544" height="5" width="1" id="rect10708-8" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path id="path10711-1" d="m 546,224 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v -1 z m 1,0 h 1 v 3 h 1 v -5 h -1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10714-8" d="m 552.75,224 v 1 H 552 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10716-2" d="m 556,224 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" id="rect10718-6" width="1" height="5" x="560" y="224"/>
+ <path id="path10734-6" d="m 563,224 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10736-0" d="m 567,224 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g10857-3" transform="translate(22,-10)">
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 535,267 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v -1 z m 1,0 h 1 v 3 h 1 v -5 h -1 v 1 h -1 z" id="path10744-8" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 542,267 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z" id="path10746-0" inkscape:connector-curvature="0"/>
+ <path id="path10748-1" d="m 546,267 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 267 Z m 1,1 h 1 v 3 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <rect y="267" x="550" height="5" width="1" id="rect10750-2" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path id="path10752-5" d="m 552,267 v 5 h 1 v -2 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <rect y="267" x="556" height="5" width="1" id="rect10754-0" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path id="path10756-9" d="m 558,267 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10758-4" d="m 562,267 v 5 h 1 v -2 h 1 v 2 h 1 v -2 h -0.75 v -1 H 565 v -1.25 h -1 V 267 h -1 z m 1,1 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10760-7" d="m 567,267 v 0.75 h -1 v 1.5 h 1 V 270 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 269 h -1 v -1 h 1.5 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g10803-8" transform="translate(25,-1)">
+ <path id="path10777-3" d="m 532,36 v 0.75 h -1 v 1.5 h 1 V 39 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 38 h -1 v -1 h 1.5 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10781-5" d="m 539.75,36 v 1 H 539 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10783-1" d="m 543,36 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 36 Z m 1,1 h 1 v 3 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10785-2" d="m 547,36 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 555,36 v 1.75 h -1 V 39 h -1 v 2 h 1 v -1.75 h 1 V 38 h 1 v -2 z" id="path10787-0" inkscape:connector-curvature="0"/>
+ <path id="path10789-1" d="m 558,36 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10791-6" d="m 562,36 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 566,36 v 2 h 1 v -2 z m 1,2 v 1 h 1 v -1 z m 1,0 h 1 v -2 h -1 z m 0,1 v 2 h 1 v -2 z m -1,0 h -1 v 2 h 1 z" id="path10795-4" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 570,36 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" id="path10797-0" inkscape:connector-curvature="0"/>
+ <path id="path10800-6" d="m 535,36 v 5 h 1 v -2 h 1 v 2 h 1 v -5 h -1 v 2 h -1 v -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g10885-1" transform="translate(19,125)">
+ <path id="path10869-8" d="m 538,299 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10871-9" d="m 542,299 v 4.25 h 1 V 304 h 2 v -0.75 h 1 V 299 h -1 v 4 h -2 v -4 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10873-8" d="m 547,299 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10875-4" d="m 551,299 v 5 h 1 2 v -1 h -2 v -4 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <rect y="299" x="555" height="5" width="1" id="rect10877-1" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path id="path10879-4" d="m 557,299 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10881-3" d="m 562,299 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10883-9" d="m 566,299 v 5 h 1 v -2 h 1 v 2 h 1 v -2 h -0.75 v -1 H 569 v -1.25 h -1 V 299 h -1 z m 1,1 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g10921-8" transform="translate(21,128)">
+ <path id="path10895-8" d="m 539.75,359 v 1 H 539 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10897-0" d="m 535,359 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 359 Z m 1,1 h 1 v 3 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10899-8" d="m 543,359 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 547.75,359 v 1 H 547 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" id="path10901-7" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g10914-7" transform="translate(22,125)">
+ <path id="path10903-8" d="m 545,393 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 393 Z m 1,1 h 1 v 3 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10906-3" d="m 549,393 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10908-8" d="m 534,393 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v -1 z m 1,0 h 1 v 3 h 1 v -5 h -1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10910-3" d="m 541,393 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10912-7" d="m 554,393 v 0.75 h -1 v 1.5 h 1 V 396 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 395 h -1 v -1 h 1.5 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g10942-1" transform="translate(22.01477,127)">
+ <path id="path10928-0" d="m 538,412 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 412 Z m 1,1 h 1 v 3 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10930-7" d="m 534,412 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <rect y="412" x="542" height="5" width="1" id="rect10932-3" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path id="path10934-4" d="m 549,412 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10936-9" d="m 553,412 v 5 h 1 v -2 h 1 v 2 h 1 v -2 h -0.75 v -1 H 556 v -1.25 h -1 V 412 h -1 z m 1,1 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10938-6" d="m 558,412 v 0.75 h -1 v 1.5 h 1 V 415 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 414 h -1 v -1 h 1.5 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10940-5" d="m 544,412 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g10966-1" transform="translate(22.01477,127)">
+ <path id="path10951-0" d="m 534,434 v 5 h 1 1 v -0.5 h 1 V 437 h -0.75 v -1 H 537 v -1.25 h -1 V 434 h -1 z m 1,1 h 1 v 1 h -1 z m 0,2 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10953-9" d="m 556,434 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10956-9" d="m 552,434 v 1 h 2 v -1 z m 2,1 v 3 h 1 v -3 z m 0,3 h -2 v 1 h 2 z m -2,0 v -3 h -1 v 3 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10958-6" d="m 562,434 v 0.75 h -1 v 1.5 h 1 V 437 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 436 h -1 v -1 h 1.5 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10960-8" d="m 543,434 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path10962-3" d="m 538,434 v 4.25 h 1 V 439 h 2 v -0.75 h 1 V 434 h -1 v 4 h -2 v -4 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 547,434 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" id="path10964-4" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g10980-8" transform="translate(19,127)">
+ <rect y="486" x="542" height="5" width="1" id="rect10975-4" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path id="path10978-9" d="m 537,486 v 4.25 h 1 V 491 h 2 v -0.75 h 1 V 486 h -1 v 4 h -2 v -4 z" style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 544,133 v 1 h 9 v 62 h -9 v 1 h 9 1 v -33 h 1 v -1 h -1 v -30 h -1 z" id="rect11044-9" sodipodi:nodetypes="ccccccccccccccc" inkscape:connector-curvature="0"/>
+ <path id="path19464-5" d="m 0.749997,14 v 1 h -0.75 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19466-3" d="m -3e-6,35 v 5 h 1 1 v -0.5 h 1 V 38 h -0.75 v -1 h 0.75 v -1.25 h -1 V 35 h -1 z m 1,1 h 1 v 1 h -1 z m 0,2 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19468-3" d="M 0.999997,56.25 V 57 h -1 v 3.5 h 1 v 0.75 h 2 v -1 h -2 v -3 h 2 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19470-3" d="m -3e-6,77 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 77 Z m 1,1 h 1 v 3 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19472-7" d="m -3e-6,99 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19474-4" d="m -3e-6,119 v 5 h 1 v -2 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19476-3" d="m 0.999997,140 v 0.75 h -1 v 3.5 h 1 V 145 h 2 v -1 -1.25 h -1 V 144 h -1 v -3 h 2 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19478-8" d="m -3e-6,161 v 5 h 1 v -2 h 1 v 2 h 1 v -5 h -1 v 2 h -1 v -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <rect y="183" x="0.99999702" height="5" width="1" id="rect19480-0" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path id="path19482-8" d="m 1.999997,203 v 4 h -1 v -1 h -1 v 1 h 0.75 v 1 h 1.5 v -1 h 0.75 v -4 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19484-8" d="m -3e-6,224 v 5 h 1 v -1.75 h 1 v -1.5 h -1 V 224 Z m 2,1.75 h 1 V 224 h -1 z m 0,1.5 V 229 h 1 v -1.75 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19486-0" d="m -3e-6,245 v 5 h 1 2 v -1 h -2 v -4 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19488-6" d="m 0,266 v 5 h 1 v -3 h 1 v -1 H 1 v -1 z m 2,2 v 1 h 1 v -1 z m 1,0 h 1 v 3 h 1 v -5 H 4 v 1 H 3 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19490-8" d="m -3e-6,287 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19492-1" d="m 0.999997,308 v 1 h 1 v -1 z m 1,1 v 3 h 1 v -3 z m 0,3 h -1 v 1 h 1 z m -1,0 v -3 h -1 v 3 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" sodipodi:nodetypes="cccccccccccccccccccc" inkscape:connector-curvature="0"/>
+ <path id="path19494-9" d="m -3e-6,329 v 5 h 1 v -2 h 1.25 v -1 h 0.75 v -1.25 h -1 V 329 h -1 z m 1,1 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19496-8" d="m 0.999997,350 v 1 h 1 v -1 z m 1,1 v 3 h 1 v -3 z m 0,3 h -1 v 1 h 1 z m 0,1 v 1 h 1 v -1 z m -1,-1 v -3 h -1 v 3 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" sodipodi:nodetypes="ccccccccccccccccccccccccc" inkscape:connector-curvature="0"/>
+ <path id="path19498-9" d="m -3e-6,371 v 5 h 1 v -2 h 1 v 2 h 1 v -2 h -0.75 v -1 h 0.75 v -1.25 h -1 V 371 h -1 z m 1,1 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19500-7" d="m 0.999997,392 v 0.75 h -1 v 1.5 h 1 V 395 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 394 h -1 v -1 h 1.5 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19502-2" d="m -3e-6,413 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19504-2" d="m -3e-6,435 v 4.25 h 1 V 440 h 2 v -0.75 h 1 V 435 h -1 v 4 h -2 v -4 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19506-8" d="m -3e-6,456 v 3.25 h 1 V 461 h 1 v -1.75 h 1 V 456 h -1 v 3 h -1 v -3 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path19508-2" d="m 0,476 v 3.25 H 1 V 481 h 1 v -1.75 H 2.999997 V 481 H 4 v -1.75 H 5 V 476 H 4 v 3 H 2.999997 v -2 H 2 v 2 H 1 v -3 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m -3e-6,498 v 2 h 1 v -2 z m 1,2 v 1 h 1 v -1 z m 1,0 h 1 v -2 h -1 z m 0,1 v 2 h 1 v -2 z m -1,0 h -1 v 2 h 1 z" id="rect19510-8" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 0.75,557 v 1 H 0 v 4 h 1 v -2 h 1 v 2 h 1 v -4 H 2.25 v -1 z M 1,558 h 1 v 1 H 1 Z" id="path38399-9" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 0,578 v 5 h 1 1 v -0.5 H 3 V 581 H 2.25 v -1 H 3 v -1.25 H 2 V 578 H 1 Z m 1,1 h 1 v 1 H 1 Z m 0,2 h 1 v 1 H 1 Z" id="path38401-0" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="M 1,599.25 V 600 H 0 v 3.5 h 1 v 0.75 h 2 v -1 H 1 v -3 h 2 v -1 z" id="path38403-7" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 0,620 v 1 3 1 h 2 v -0.75 h 1 v -3.5 H 2 V 620 Z m 1,1 h 1 v 3 H 1 Z" id="path38405-8" inkscape:connector-curvature="0"/>
+ <path id="path38411-1" d="m 0.75,564 v 1 H 0 v 4 h 1 v -2 h 1 v 2 h 1 v -4 H 2.25 v -1 z M 1,565 h 1 v 1 H 1 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path38413-5" d="m 0.75,585 v 1 H 0 v 4 h 1 v -2 h 1 v 2 h 1 v -4 H 2.25 v -1 z M 1,586 h 1 v 1 H 1 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 0.75,606 v 1 H 0 v 4 h 1 v -2 h 1 v 2 h 1 v -4 H 2.25 v -1 z M 1,607 h 1 v 1 H 1 Z" id="path38415-8" inkscape:connector-curvature="0"/>
+ <path id="path38417-6" d="m 0.75,627 v 1 H 0 v 4 h 1 v -2 h 1 v 2 h 1 v -4 H 2.25 v -1 z M 1,628 h 1 v 1 H 1 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path38419-1" d="m 548.75,557 v 1 H 548 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path38421-2" d="m 548,578 v 5 h 1 1 v -0.5 h 1 V 581 h -0.75 v -1 H 551 v -1.25 h -1 V 578 h -1 z m 1,1 h 1 v 1 h -1 z m 0,2 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path38423-4" d="M 549,599.25 V 600 h -1 v 3.5 h 1 v 0.75 h 2 v -1 h -2 v -3 h 2 v -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path38425-2" d="m 548,620 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 620 Z m 1,1 h 1 v 3 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548.75,564 v 1 H 548 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" id="path38427-5" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548.75,585 v 1 H 548 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" id="path38429-8" inkscape:connector-curvature="0"/>
+ <path id="path38431-6" d="m 548.75,606 v 1 H 548 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548.75,627 v 1 H 548 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" id="path38433-2" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path19537-6" d="m 12,2 v 1 h -1 v 1 h 1 v 3 h 1 V 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19539-5" d="m 33,2 v 1 h 2 v 1 h -1 v 1 h 1 V 4.25 h 1 V 2.75 H 35 V 2 Z m 1,3 h -1 v 1 1 h 3 V 6 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19541-3" d="m 54,2 v 1 h 2 v 1 h 1 V 2.75 H 56 V 2 Z m 2,2 h -1 v 1 h 1 z m 0,1 v 1 h -2 v 1 h 2 V 6.25 h 1 V 5 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19543-9" d="m 75,2 v 3 h 1 1 v 2 h 1 V 3 H 77 V 4 H 76 V 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19545-2" d="m 96,2 v 3 h 1 1 v 1 h -2 v 1 h 2 V 6.25 h 1 V 4.75 H 98 V 4 H 97 V 3 h 2 V 2 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19547-4" d="m 118,2 v 0.75 h -1 V 6 h 0.75 v 1 h 1.5 V 6 H 120 V 5 h -0.75 V 4 H 118 V 3 h 1.5 V 2 Z m 0,3 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19549-6" d="m 138,2 v 1 h 2 v 1 h -1 v 3 h 1 V 4.25 h 1 V 3 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19551-18" d="m 159.75,2 v 1 h -0.5 v 1 h 0.5 V 5 H 159 v 1 h 0.75 v 1 h 1.5 V 6 H 162 V 5 h -0.75 V 4 h 0.5 V 3 h -0.5 V 2 Z M 160,3 h 1 v 1 h -1 z m 0,2 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19553-2" d="M 180.75,2 V 3 H 180 v 1 h 0.75 V 5 H 182 v 1 h -1.5 V 7 H 182 V 6.25 h 1 V 3 h -0.75 V 2 Z M 181,3 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccccccc" id="path19555-1" d="M 202.75,2 V 3 H 202 v 3 h 0.75 v 1 h 1.5 V 6 H 205 V 3 h -0.75 V 2 Z M 203,3 h 1 v 3 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 514,2 v 1 h 2 v 1 h -1 v 1 h 1 V 4.25 h 1 v -1.5 h -1 V 2 Z m 1,3 h -1 v 1 1 h 3 V 6 h -2 z" id="path19559-1"/>
+ <path inkscape:connector-curvature="0" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 476,2 v 1 h 2 v 1 h 1 V 2.75 h -1 V 2 Z m 2,2 h -1 v 1 h 1 z m 0,1 v 1 h -2 v 1 h 2 V 6.25 h 1 V 5 Z" id="path19561-9"/>
+ <path inkscape:connector-curvature="0" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 497,2 v 3 h 1 1 v 2 h 1 V 3 h -1 v 1 h -1 V 2 Z" id="path19563-7"/>
+ <path inkscape:connector-curvature="0" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 518,2 v 3 h 1 1 v 1 h -2 v 1 h 2 V 6.25 h 1 v -1.5 h -1 V 4 h -1 V 3 h 2 V 2 h -2 z" id="path19565-6"/>
+ <path inkscape:connector-curvature="0" id="path19577-2" d="m 200,2 v 1 h -1 v 1 h 1 v 3 h 1 V 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19579-9" d="m 244,2 v 1 h 2 v 1 h -1 v 1 h 1 V 4.25 h 1 v -1.5 h -1 V 2 Z m 1,3 h -1 v 1 1 h 3 V 6 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19581-5" d="m 265,2 v 1 h 2 v 1 h 1 V 2.75 h -1 V 2 Z m 2,2 h -1 v 1 h 1 z m 0,1 v 1 h -2 v 1 h 2 V 6.25 h 1 V 5 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19583-2" d="m 286,2 v 3 h 1 1 v 2 h 1 V 3 h -1 v 1 h -1 V 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19585-0" d="m 307,2 v 3 h 1 1 v 1 h -2 v 1 h 2 V 6.25 h 1 v -1.5 h -1 V 4 h -1 V 3 h 2 V 2 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19587-0" d="m 329,2 v 0.75 h -1 V 6 h 0.75 v 1 h 1.5 V 6 H 331 V 5 h -0.75 V 4 H 329 V 3 h 1.5 V 2 Z m 0,3 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19589-3" d="m 349,2 v 1 h 2 v 1 h -1 v 3 h 1 V 4.25 h 1 V 3 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19591-9" d="m 370.75,2 v 1 h -0.5 v 1 h 0.5 V 5 H 370 v 1 h 0.75 v 1 h 1.5 V 6 H 373 V 5 h -0.75 V 4 h 0.5 V 3 h -0.5 V 2 Z M 371,3 h 1 v 1 h -1 z m 0,2 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19593-1" d="M 391.75,2 V 3 H 391 v 1 h 0.75 V 5 H 393 v 1 h -1.5 V 7 H 393 V 6.25 h 1 V 3 h -0.75 V 2 Z M 392,3 h 1 v 1 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19595-8" d="M 413.75,2 V 3 H 413 v 3 h 0.75 v 1 h 1.5 V 6 H 416 V 3 h -0.75 V 2 Z M 414,3 h 1 v 3 h -1 z m 0.25,1 v 1 h 0.5 V 4 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19597-1" d="m 221,2 v 1 h -1 v 1 h 1 v 3 h 1 V 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 224,2 v 1 h -1 v 1 h 1 v 3 h 1 V 2 Z" id="path19599-9"/>
+ <path inkscape:connector-curvature="0" id="path19601-5" d="m 242,2 v 1 h -1 v 1 h 1 v 3 h 1 V 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19603-3" d="m 263,2 v 1 h -1 v 1 h 1 v 3 h 1 V 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19605-2" d="m 284,2 v 1 h -1 v 1 h 1 v 3 h 1 V 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19607-5" d="m 305,2 v 1 h -1 v 1 h 1 v 3 h 1 V 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19609-2" d="m 326,2 v 1 h -1 v 1 h 1 v 3 h 1 V 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19611-5" d="m 347,2 v 1 h -1 v 1 h 1 v 3 h 1 V 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19613-8" d="m 368,2 v 1 h -1 v 1 h 1 v 3 h 1 V 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19615-6" d="m 389,2 v 1 h -1 v 1 h 1 v 3 h 1 V 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19617-7" d="m 409,2 v 1 h 2 v 1 h -1 v 1 h 1 V 4.25 h 1 v -1.5 h -1 V 2 Z m 1,3 h -1 v 1 1 h 3 V 6 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19619-7" d="m 435,2 v 1 h -1 v 1 h 1 v 3 h 1 V 2 Z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19621-2" d="m 430,2 v 1 h 2 v 1 h -1 v 1 h 1 V 4.25 h 1 v -1.5 h -1 V 2 Z m 1,3 h -1 v 1 1 h 3 V 6 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19623-2" d="m 451,2 v 1 h 2 v 1 h -1 v 1 h 1 V 4.25 h 1 v -1.5 h -1 V 2 Z m 1,3 h -1 v 1 1 h 3 V 6 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 455,2 v 1 h 2 v 1 h -1 v 1 h 1 V 4.25 h 1 v -1.5 h -1 V 2 Z m 1,3 h -1 v 1 1 h 3 V 6 h -2 z" id="path19625-9"/>
+ <path inkscape:connector-curvature="0" id="path19627-4" d="m 472,2 v 1 h 2 v 1 h -1 v 1 h 1 V 4.25 h 1 v -1.5 h -1 V 2 Z m 1,3 h -1 v 1 1 h 3 V 6 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path19629-1" d="m 493,2 v 1 h 2 v 1 h -1 v 1 h 1 V 4.25 h 1 v -1.5 h -1 V 2 Z m 1,3 h -1 v 1 1 h 3 V 6 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path11036-9" d="m 536,2 v 1 h 2 v 1 h -1 v 1 h 1 V 4.25 h 1 v -1.5 h -1 V 2 Z m 1,3 h -1 v 1 1 h 3 V 6 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 541,2 v 0.75 h -1 V 6 h 0.75 v 1 h 1.5 V 6 H 543 V 5 h -0.75 V 4 H 541 V 3 h 1.5 V 2 Z m 0,3 h 1 v 1 h -1 z" id="path11038-6"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548.75,14 v 1 H 548 v 4 h 1 v -2 h 1 v 2 h 1 v -4 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" id="path11128-8"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,35 v 5 h 1 1 v -0.5 h 1 V 38 h -0.75 V 37 H 551 v -1.25 h -1 V 35 h -1 z m 1,1 h 1 v 1 h -1 z m 0,2 h 1 v 1 h -1 z" id="path11130-2"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="M 549,56.25 V 57 h -1 v 3.5 h 1 v 0.75 h 2 v -1 h -2 v -3 h 2 v -1 z" id="path11132-5"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,77 v 1 3 1 h 2 v -0.75 h 1 v -3.5 h -1 V 77 Z m 1,1 h 1 v 3 h -1 z" id="path11134-5"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,99 v 5 h 1 2 v -1 h -2 v -1 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path11136-4"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,119 v 5 h 1 v -2 h 1 v -1 h -1 v -1 h 2 v -1 h -2 z" id="path11138-9"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 549,140 v 0.75 h -1 v 3.5 h 1 V 145 h 2 v -1 -1.25 h -1 V 144 h -1 v -3 h 2 v -1 z" id="path11140-1"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,161 v 5 h 1 v -2 h 1 v 2 h 1 v -5 h -1 v 2 h -1 v -2 z" id="path11142-2"/>
+ <rect style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" id="rect11144-5" width="1" height="5" x="549" y="183"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 550,203 v 4 h -1 v -1 h -1 v 1 h 0.75 v 1 h 1.5 v -1 H 551 v -4 z" id="path11146-0"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,224 v 5 h 1 v -1.75 h 1 v -1.5 h -1 V 224 Z m 2,1.75 h 1 V 224 h -1 z m 0,1.5 V 229 h 1 v -1.75 z" id="path11148-8"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,245 v 5 h 1 2 v -1 h -2 v -4 z" id="path11150-3"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,266 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v -1 z m 1,0 h 1 v 3 h 1 v -5 h -1 v 1 h -1 z" id="path11152-9"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,287 v 5 h 1 v -3 h 1 v -1 h -1 v -1 z m 2,2 v 1 h 1 v 2 h 1 v -5 h -1 v 2 z" id="path11154-3"/>
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccccccccc" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 549,308 v 1 h 1 v -1 z m 1,1 v 3 h 1 v -3 z m 0,3 h -1 v 1 h 1 z m -1,0 v -3 h -1 v 3 z" id="path11156-9"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,329 v 5 h 1 v -2 h 1.25 v -1 H 551 v -1.25 h -1 V 329 h -1 z m 1,1 h 1 v 1 h -1 z" id="path11158-6"/>
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccccccccccccccc" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 549,350 v 1 h 1 v -1 z m 1,1 v 3 h 1 v -3 z m 0,3 h -1 v 1 h 1 z m 0,1 v 1 h 1 v -1 z m -1,-1 v -3 h -1 v 3 z" id="path11160-7"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,371 v 5 h 1 v -2 h 1 v 2 h 1 v -2 h -0.75 v -1 H 551 v -1.25 h -1 V 371 h -1 z m 1,1 h 1 v 1 h -1 z" id="path11162-9"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 549,392 v 0.75 h -1 v 1.5 h 1 V 395 h 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 394 h -1 v -1 h 1.5 v -1 z" id="path11164-9"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,413 v 1 h 1 v 4 h 1 v -4 h 1 v -1 z" id="path11166-7"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,435 v 4.25 h 1 V 440 h 2 v -0.75 h 1 V 435 h -1 v 4 h -2 v -4 z" id="path11168-6"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,456 v 3.25 h 1 V 461 h 1 v -1.75 h 1 V 456 h -1 v 3 h -1 v -3 z" id="path11170-9"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="M 547,475.75 V 479 h 1 v 1.75 h 1 V 479 h 1 v 1.75 h 1 V 479 h 1 v -3.25 h -1 v 3 h -1 v -2 h -1 v 2 h -1 v -3 z" id="path11172-3"/>
+ <path inkscape:connector-curvature="0" id="path11174-5" d="m 548,498 v 2 h 1 v -2 z m 1,2 v 1 h 1 v -1 z m 1,0 h 1 v -2 h -1 z m 0,1 v 2 h 1 v -2 z m -1,0 h -1 v 2 h 1 z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path id="path38393-7" d="m 0,518 v 2.25 H 1 V 523 h 1 v -2.75 H 3 V 518 H 2 v 2 H 1 v -2 z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path38395-6" d="m 0,539 v 1 h 2 v 1 h 1 v -1 -1 z m 2,2 H 1 v 1 h 1 z m -1,1 H 0 v 1 1 h 3 v -1 H 1 Z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,518 v 2.25 h 1 V 523 h 1 v -2.75 h 1 V 518 h -1 v 2 h -1 v -2 z" id="path38435-6" inkscape:connector-curvature="0"/>
+ <path style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 548,539 v 1 h 2 v 1 h 1 v -1 -1 z m 2,2 h -1 v 1 h 1 z m -1,1 h -1 v 1 1 h 3 v -1 h -2 z" id="path38437-5" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 12,636 v 1 h -1 v 1 h 1 v 3 h 1 v -5 z" id="path41043-2"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 33,636 v 1 h 2 v 1 h -1 v 1 h 1 v -0.75 h 1 v -1.5 H 35 V 636 Z m 1,3 h -1 v 1 1 h 3 v -1 h -2 z" id="path41045-5"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 54,636 v 1 h 2 v 1 h 1 v -1.25 H 56 V 636 Z m 2,2 h -1 v 1 h 1 z m 0,1 v 1 h -2 v 1 h 2 v -0.75 h 1 V 639 Z" id="path41047-4"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 75,636 v 3 h 1 1 v 2 h 1 v -4 h -1 v 1 h -1 v -2 z" id="path41049-4"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 96,636 v 3 h 1 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 H 98 V 638 h -1 v -1 h 2 v -1 h -2 z" id="path41051-1"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 118,636 v 0.75 h -1 V 640 h 0.75 v 1 h 1.5 v -1 H 120 v -1 h -0.75 v -1 H 118 v -1 h 1.5 v -1 z m 0,3 h 1 v 1 h -1 z" id="path41053-6"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 138,636 v 1 h 2 v 1 h -1 v 3 h 1 v -2.75 h 1 V 637 636 Z" id="path41055-1"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 159.75,636 v 1 h -0.5 v 1 h 0.5 v 1 H 159 v 1 h 0.75 v 1 h 1.5 v -1 H 162 v -1 h -0.75 v -1 h 0.5 v -1 h -0.5 v -1 z m 0.25,1 h 1 v 1 h -1 z m 0,2 h 1 v 1 h -1 z" id="path41057-6"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 180.75,636 v 1 H 180 v 1 h 0.75 v 1 H 182 v 1 h -1.5 v 1 h 1.5 v -0.75 h 1 V 637 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" id="path41059-3"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 202.75,636 v 1 H 202 v 3 h 0.75 v 1 h 1.5 v -1 H 205 v -3 h -0.75 v -1 z m 0.25,1 h 1 v 3 h -1 z" id="path41061-3" sodipodi:nodetypes="cccccccccccccccccc"/>
+ <path inkscape:connector-curvature="0" id="path41063-5" d="m 514,636 v 1 h 2 v 1 h -1 v 1 h 1 v -0.75 h 1 v -1.5 h -1 V 636 Z m 1,3 h -1 v 1 1 h 3 v -1 h -2 z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path41065-5" d="m 476,636 v 1 h 2 v 1 h 1 v -1.25 h -1 V 636 Z m 2,2 h -1 v 1 h 1 z m 0,1 v 1 h -2 v 1 h 2 v -0.75 h 1 V 639 Z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path41067-3" d="m 497,636 v 3 h 1 1 v 2 h 1 v -4 h -1 v 1 h -1 v -2 z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path41069-2" d="m 518,636 v 3 h 1 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 638 h -1 v -1 h 2 v -1 h -2 z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 200,636 v 1 h -1 v 1 h 1 v 3 h 1 v -5 z" id="path41071-8"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 244,636 v 1 h 2 v 1 h -1 v 1 h 1 v -0.75 h 1 v -1.5 h -1 V 636 Z m 1,3 h -1 v 1 1 h 3 v -1 h -2 z" id="path41073-2"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 265,636 v 1 h 2 v 1 h 1 v -1.25 h -1 V 636 Z m 2,2 h -1 v 1 h 1 z m 0,1 v 1 h -2 v 1 h 2 v -0.75 h 1 V 639 Z" id="path41075-5"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 286,636 v 3 h 1 1 v 2 h 1 v -4 h -1 v 1 h -1 v -2 z" id="path41077-3"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 307,636 v 3 h 1 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 V 638 h -1 v -1 h 2 v -1 h -2 z" id="path41079-6"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 329,636 v 0.75 h -1 V 640 h 0.75 v 1 h 1.5 v -1 H 331 v -1 h -0.75 v -1 H 329 v -1 h 1.5 v -1 z m 0,3 h 1 v 1 h -1 z" id="path41081-1"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 349,636 v 1 h 2 v 1 h -1 v 3 h 1 v -2.75 h 1 V 637 636 Z" id="path41083-8"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 370.75,636 v 1 h -0.5 v 1 h 0.5 v 1 H 370 v 1 h 0.75 v 1 h 1.5 v -1 H 373 v -1 h -0.75 v -1 h 0.5 v -1 h -0.5 v -1 z m 0.25,1 h 1 v 1 h -1 z m 0,2 h 1 v 1 h -1 z" id="path41085-6"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 391.75,636 v 1 H 391 v 1 h 0.75 v 1 H 393 v 1 h -1.5 v 1 h 1.5 v -0.75 h 1 V 637 h -0.75 v -1 z m 0.25,1 h 1 v 1 h -1 z" id="path41087-2"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 413.75,636 v 1 H 413 v 3 h 0.75 v 1 h 1.5 v -1 H 416 v -3 h -0.75 v -1 z m 0.25,1 h 1 v 3 h -1 z m 0.25,1 v 1 h 0.5 v -1 z" id="path41089-1"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 221,636 v 1 h -1 v 1 h 1 v 3 h 1 v -5 z" id="path41091-4"/>
+ <path inkscape:connector-curvature="0" id="path41093-6" d="m 224,636 v 1 h -1 v 1 h 1 v 3 h 1 v -5 z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 242,636 v 1 h -1 v 1 h 1 v 3 h 1 v -5 z" id="path41095-2"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 263,636 v 1 h -1 v 1 h 1 v 3 h 1 v -5 z" id="path41097-9"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 284,636 v 1 h -1 v 1 h 1 v 3 h 1 v -5 z" id="path41099-1"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 305,636 v 1 h -1 v 1 h 1 v 3 h 1 v -5 z" id="path41101-5"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 326,636 v 1 h -1 v 1 h 1 v 3 h 1 v -5 z" id="path41103-0"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 347,636 v 1 h -1 v 1 h 1 v 3 h 1 v -5 z" id="path41105-3"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 368,636 v 1 h -1 v 1 h 1 v 3 h 1 v -5 z" id="path41107-6"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 389,636 v 1 h -1 v 1 h 1 v 3 h 1 v -5 z" id="path41109-4"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 409,636 v 1 h 2 v 1 h -1 v 1 h 1 v -0.75 h 1 v -1.5 h -1 V 636 Z m 1,3 h -1 v 1 1 h 3 v -1 h -2 z" id="path41111-9"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 435,636 v 1 h -1 v 1 h 1 v 3 h 1 v -5 z" id="path41113-2"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 430,636 v 1 h 2 v 1 h -1 v 1 h 1 v -0.75 h 1 v -1.5 h -1 V 636 Z m 1,3 h -1 v 1 1 h 3 v -1 h -2 z" id="path41116-9"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 451,636 v 1 h 2 v 1 h -1 v 1 h 1 v -0.75 h 1 v -1.5 h -1 V 636 Z m 1,3 h -1 v 1 1 h 3 v -1 h -2 z" id="path41118-3"/>
+ <path inkscape:connector-curvature="0" id="path41120-4" d="m 455,636 v 1 h 2 v 1 h -1 v 1 h 1 v -0.75 h 1 v -1.5 h -1 V 636 Z m 1,3 h -1 v 1 1 h 3 v -1 h -2 z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 472,636 v 1 h 2 v 1 h -1 v 1 h 1 v -0.75 h 1 v -1.5 h -1 V 636 Z m 1,3 h -1 v 1 1 h 3 v -1 h -2 z" id="path41122-4"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 493,636 v 1 h 2 v 1 h -1 v 1 h 1 v -0.75 h 1 v -1.5 h -1 V 636 Z m 1,3 h -1 v 1 1 h 3 v -1 h -2 z" id="path41124-0"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 536,636 v 1 h 2 v 1 h -1 v 1 h 1 v -0.75 h 1 v -1.5 h -1 V 636 Z m 1,3 h -1 v 1 1 h 3 v -1 h -2 z" id="path41126-5"/>
+ <path inkscape:connector-curvature="0" id="path41128-9" d="m 541,636 v 0.75 h -1 V 640 h 0.75 v 1 h 1.5 v -1 H 543 v -1 h -0.75 v -1 H 541 v -1 h 1.5 v -1 z m 0,3 h 1 v 1 h -1 z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" d="m 545,238 v 1 h 9 v 41 h -9 v 1 h 9 1 v -21 h 1 v -1 h -1 v -21 h -1 z" id="rect11044-9-4" sodipodi:nodetypes="ccccccccccccccc" inkscape:connector-curvature="0"/>
</g>
- <g
- inkscape:label="ICONS"
- inkscape:groupmode="layer"
- id="layer1"
- style="display:inline">
- <g
- transform="matrix(0,1,1,0,-174,194)"
- style="display:inline;enable-background:new"
- id="ICON_DOWNARROW_HLT">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(-1.9535916,0,0,1.1712921,1176.1968,319.2322)"
- id="g29877-5-3-1-8"
- style="display:inline;enable-background:new">
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path29879-5-0-9-1"
- d="m 392.96689,241.84215 h -0.56915 l -3.5287,2.84782 v 1.13912 l 3.5287,2.84781 h 0.56915 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient106344-5-2);fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient106433-4);stroke-width:0.66107476px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path29881-5-6-0-4"
- d="m 392.96688,248.67221 h -0.57173 l -3.51515,-2.83619 -0.008,-1.21916"
- style="fill:none;stroke:url(#linearGradient106307-2-4);stroke-width:0.66107482px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="598"
- x="404"
- height="16"
- width="16"
- id="rect24491-0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- </g>
- <g
- style="display:inline;enable-background:new"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="/home/georg/Arbeitsfläche/2012/Blender Coding/Patch #2a/icon_redone 5a.png"
- transform="translate(440.42789,-242.41778)"
- id="ICON_FILE_BACKUP">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="/home/georg/Arbeitsfläche/2012/Blender Coding/Patch #2a/icon_redone 4 (alpha).png"
- id="g14715"
- transform="translate(-320.42789,5.4177849)"
- style="display:inline">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- id="rect14717"
- width="16"
- height="16"
- x="389"
- y="289"
- rx="0.80014729"
- ry="0" />
- <g
- transform="translate(-177,71)"
- id="g14719">
- <g
- transform="translate(480,287.5)"
- id="g14721"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="translate(-118.5,-200.5)"
- id="g14723" />
- </g>
- <g
- style="fill:#000000"
- transform="translate(1,24)"
- id="g14725" />
- </g>
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
- id="rect14727"
- width="16"
- height="16"
- x="68.572113"
- y="294.41779"
- rx="0"
- inkscape:export-filename="/home/georg/Arbeitsfläche/2012/Blender Coding/Patch #2a/icon_redone 4 (alpha).png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:url(#linearGradient14800);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="m 72.738774,294.91779 h 10.33334 v 14.99999 h -13 l -1e-5,-11.99999 z"
- id="path14729"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="/home/georg/Arbeitsfläche/2012/Blender Coding/Patch #2a/icon_redone 4 (alpha).png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- id="path14731"
- style="display:inline;fill:none;stroke:url(#linearGradient14802);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 71.072114,299.41778 v 9.5 m 3.5,-13 h 7.5"
- sodipodi:nodetypes="cccc"
- inkscape:export-filename="/home/georg/Arbeitsfläche/2012/Blender Coding/Patch #2a/icon_redone 4 (alpha).png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path14733"
- d="m 69.572114,298.41778 h 4 v -4 z"
- style="display:inline;fill:#ffffff;fill-opacity:0.75490196;fill-rule:evenodd;stroke:none"
- inkscape:export-filename="/home/georg/Arbeitsfläche/2012/Blender Coding/Patch #2a/icon_redone 4 (alpha).png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- id="path14735"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 70.072114,297.41779 v 12.49999 h 13 v -14.99999 h -10.5 z"
- inkscape:export-filename="/home/georg/Arbeitsfläche/2012/Blender Coding/Patch #2a/icon_redone 4 (alpha).png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <g
- clip-path="url(#clipPath22590-7)"
- mask="none"
- transform="translate(100.57211,-194.58234)"
- id="g14737"
- style="display:inline"
- inkscape:export-filename="/home/georg/Arbeitsfläche/2012/Blender Coding/Patch #2a/icon_redone 4 (alpha).png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect14739"
- width="16"
- height="16"
- x="-29"
- y="491.00012" />
- <g
- id="g14741">
- <g
- id="g14743">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- d="M -15.594023,497.94339 -20.25,493.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.34386528;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path14745" />
- <ellipse
- transform="matrix(3.625,0,0,3.1690202,-67.8125,318.31703)"
- id="path14747"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1.32768786;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.10397505;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="13.5"
- cy="57.5"
- rx="1"
- ry="1.0000004" />
- <path
- inkscape:connector-curvature="0"
- id="path14749"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.34386528;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -25.5,496.5 h 7.5 m -8.5,5.00012 3.5,-3.5"
- sodipodi:nodetypes="cccc" />
- </g>
- <circle
- transform="matrix(3.5999897,0,0,3.1249932,-67.499871,320.6879)"
- id="path14751"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient14804);stroke-width:0.92424375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.10397505;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="13.5"
- cy="57.5"
- r="1" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- d="m -25.5,496.5 7.984366,-0.0226 M -26.5,501.50012 -21.5,496.5 m 5.996227,1.44466 L -20.25,493.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient14806);stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.34386528;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path14753" />
- <circle
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path14755"
- transform="matrix(3.25,0,0,3.25,-62.875,313.125)"
- cx="13.5"
- cy="57.5"
- r="1" />
- <circle
- transform="matrix(2,0,0,2,-46,385)"
- id="path14757"
- style="fill:#2c5aa0;fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="13.5"
- cy="57.5"
- r="1" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient14808);stroke-width:0.22536004;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.10397505;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path14759"
- transform="matrix(4.7519907,0,0,4.1435313,-83.051884,262.12196)"
- cx="13.5"
- cy="57.5"
- r="1" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- d="m -20.515634,493.80534 c -0.07079,-0.45769 0.0843,-0.63855 0.5,-0.5 m -6.734366,7.94478 3.280183,-3.10926 m -2,-2 h 6.25"
- style="fill:none;stroke:url(#linearGradient14810);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- id="path14761" />
- </g>
- </g>
- <path
- style="fill:none;stroke:url(#linearGradient20368);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 74.072114,296.91778 v 2 h -2"
- id="path14763"
- inkscape:connector-curvature="0"
- inkscape:export-filename="/home/georg/Arbeitsfläche/2012/Blender Coding/Patch #2a/icon_redone 4 (alpha).png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- <g
- id="ICON_SMOOTHCURVE"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18813"
- width="16"
- height="16"
- x="257"
- y="176" />
- <g
- transform="translate(254.01612,148.99638)"
- id="g10120"
- style="display:inline">
- <path
- sodipodi:nodetypes="czc"
- style="fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 4.4999991,39.491912 c 4.0000009,0 3.4999969,-7 5.9999989,-7 2.500002,0 2.000002,7 5.999999,7"
- id="path10122"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path10124"
- d="m 4.4999991,39.491912 c 4.0000009,0 3.4999969,-7 5.9999989,-7 2.500002,0 2.000002,7 5.999999,7"
- style="fill:none;stroke:#e6e6e6;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="czc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_LINCURVE"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18821"
- width="16"
- height="16"
- x="341"
- y="176" />
- <g
- transform="translate(258.01612,148.99638)"
- id="g10158"
- style="display:inline">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 85.500006,38.5 90.478251,33.099997 95.456495,38.5"
- id="path10160"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path10162"
- d="M 85.500006,38.5 90.478251,33.099997 95.456495,38.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#e6e6e6;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_SHARPCURVE"
- transform="translate(0,2)">
- <rect
- y="176"
- x="320"
- height="16"
- width="16"
- id="rect18819"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(257.01612,148.99638)"
- id="g10164"
- style="display:inline">
- <path
- id="path10166"
- d="M 65.500015,38.5 C 68.5,37 70,35 70.560871,31.5 71,35 72.5,37 75.621727,38.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#e6e6e6;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 65.500015,38.5 C 68.5,37 70,35 70.560871,31.5 71,35 72.5,37 75.621727,38.5"
- id="path10168"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_SPHERECURVE"
- transform="translate(0,2)">
- <rect
- y="176"
- x="278"
- height="16"
- width="16"
- id="rect18815"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(255.01612,148.99638)"
- id="g10170"
- style="display:inline">
- <path
- sodipodi:type="arc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path10172"
- sodipodi:cx="30.5"
- sodipodi:cy="40"
- sodipodi:rx="6"
- sodipodi:ry="6"
- d="m 36.5,40 a 6,6 0 0 1 -3,5.196152 6,6 0 0 1 -6,0 A 6,6 0 0 1 24.5,40"
- sodipodi:start="0"
- sodipodi:end="3.1415927"
- sodipodi:open="true"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(1,0,0,-1,0,78.5)" />
- <path
- transform="matrix(1,0,0,-1,0,78.5)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:open="true"
- sodipodi:end="3.1415927"
- sodipodi:start="0"
- d="m 36.5,40 a 6,6 0 0 1 -3,5.196152 6,6 0 0 1 -6,0 A 6,6 0 0 1 24.5,40"
- sodipodi:ry="6"
- sodipodi:rx="6"
- sodipodi:cy="40"
- sodipodi:cx="30.5"
- id="path10174"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#e6e6e6;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:type="arc" />
- </g>
- </g>
- <g
- id="ICON_ROOTCURVE"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18817"
- width="16"
- height="16"
- x="299"
- y="176" />
- <g
- transform="translate(256.01612,148.99638)"
- id="g10176"
- style="display:inline">
- <path
- sodipodi:open="true"
- sodipodi:end="3.1415927"
- sodipodi:start="0"
- d="m 36.5,40 a 6,6 0 0 1 -3,5.196152 6,6 0 0 1 -6,0 A 6,6 0 0 1 24.5,40"
- sodipodi:ry="6"
- sodipodi:rx="6"
- sodipodi:cy="40"
- sodipodi:cx="30.5"
- id="path10178"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.65631413;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:type="arc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.833333,0,0,-1.333333,25.08333,92.82524)" />
- <path
- transform="matrix(0.833333,0,0,-1.333333,25.08333,92.82524)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:type="arc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#e6e6e6;stroke-width:1.32815707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path10181"
- sodipodi:cx="30.5"
- sodipodi:cy="40"
- sodipodi:rx="6"
- sodipodi:ry="6"
- d="m 36.5,40 a 6,6 0 0 1 -3,5.196152 6,6 0 0 1 -6,0 A 6,6 0 0 1 24.5,40"
- sodipodi:start="0"
- sodipodi:end="3.1415927"
- sodipodi:open="true" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_NOCURVE"
- transform="translate(259,151)">
- <rect
- y="28"
- x="103"
- height="16"
- width="16"
- id="rect18823"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(0.01612368,-0.00361762)"
- id="g10183"
- style="display:inline">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path10185"
- d="m 104.5,37.503635 v -4.000017 h 12 v 4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#d7d7d7;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 104.5,37.503635 v -4.000017 h 12 v 4"
- id="path10187"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_RNDCURVE"
- transform="translate(260,151)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18825"
- width="16"
- height="16"
- x="123"
- y="28" />
- <g
- transform="translate(0.01612368,-0.00361762)"
- id="g10189"
- style="display:inline">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cssssc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 124.5,39.491912 c 0.99099,0 0.85013,-1.626312 1.08378,-2.386485 0.35579,-1.15753 1.07105,-1.19962 1.4919,-0.197292 1.2357,2.943014 1.5163,-5.054472 2.42432,-6.416223 1.00014,-1.499896 0.90687,8.170836 3,4 1.95704,-3.899658 1.50039,4.999088 4,5"
- id="path10191"
- inkscape:connector-curvature="0" />
- <path
- id="path10193"
- d="m 124.5,39.491912 c 0.99099,0 0.85013,-1.626312 1.08378,-2.386485 0.35579,-1.15753 1.07105,-1.19962 1.4919,-0.197292 1.2357,2.943014 1.5163,-5.054472 2.42432,-6.416223 1.00014,-1.499896 0.90687,8.170836 3,4 1.95704,-3.899658 1.50039,4.999088 4,5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#e6e6e6;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cssssc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_PROP_CON"
- transform="translate(0,2)">
- <rect
- y="176"
- x="446"
- height="16"
- width="16"
- id="rect18831"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(263.91329,149.04559)"
- id="g11360"
- style="display:inline">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37097);fill-opacity:1;fill-rule:nonzero;stroke:#11243e;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 190.07108,29.454411 c -3.02619,0 -5.48439,2.463313 -5.48438,5.5 0,3.036688 2.45819,5.500001 5.48438,5.5 3.02619,0 5.48437,-2.46331 5.48437,-5.5 0,-3.036689 -2.45818,-5.500001 -5.48437,-5.5 z m 0,2.98305 c 1.36546,0 2.53849,1.100464 2.53848,2.454803 0,1.354341 -1.17303,2.501413 -2.53848,2.501412 -1.36546,0 -2.47581,-1.14707 -2.47581,-2.501412 0,-1.354341 1.11035,-2.454805 2.47581,-2.454803 z"
- id="path11362"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="csssccsssc" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path11364"
- style="display:inline;fill:none;stroke:url(#linearGradient15782);stroke-width:1.77120221;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.566689,0,0,-0.562497,115.2063,101.3747)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.4330916,0,0,-0.424074,132.95389,85.01929)"
- style="display:inline;fill:none;stroke:url(#linearGradient33681);stroke-width:2.33340454;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path11366"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- id="ICON_PROP_ON"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18829"
- width="16"
- height="16"
- x="425"
- y="176" />
- <g
- transform="translate(263,148.99995)"
- id="g11368"
- style="display:inline">
- <g
- id="g11370"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.786268,0,0,0.7877987,82.392071,-41.848894)">
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37095);fill-opacity:1;fill-rule:nonzero;stroke:#11243e;stroke-width:1.16319752;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path11372"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.874026,0,0,0.873701,-3.948211,-5.552958)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path11374"
- style="fill:none;stroke:url(#linearGradient33700);stroke-width:3.20095801;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.398744,0,0,-0.395524,58.82401,144.1804)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path11376"
- style="display:inline;fill:none;stroke:url(#linearGradient33666);stroke-width:5.31599474;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.186538,0,0,-0.189699,145.3693,57.36304)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.566689,0,0,-0.562497,95.23056,101.3747)"
- style="display:inline;fill:none;stroke:url(#linearGradient33668);stroke-width:1.77120221;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path11378"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.424906,0,0,-0.424074,114.01316,85.183325)"
- style="display:inline;fill:none;stroke:url(#linearGradient33670);stroke-width:2.35577321;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path11380"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- id="ICON_OUTLINER_OB_EMPTY"
- transform="translate(0,128)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect17412"
- width="16.000002"
- height="16"
- x="5"
- y="302" />
- <g
- transform="translate(-316.99999,374)"
- id="g19609"
- style="display:inline">
- <path
- sodipodi:nodetypes="cccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path17384"
- style="display:inline;fill:none;stroke:#2c1700;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 330.02726,-62.5 4.63639,3 m -4.63639,-3 -4.63634,3 m 4.60909,-3 v -6"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:#2c1700;stroke-width:1.80000007;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 329,-70 v 2 h 1.99999 v -2 z m -5,10 10e-6,2 h 2 L 326,-60 Z m 9.99999,0 v 2 h 2 v -2 z"
- id="path17386"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(1.0911926,0,0,1.176776,253.08415,-79.548088)"
- id="path17388"
- style="display:inline;fill:url(#radialGradient12427);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="70.5"
- cy="14.5"
- r="1.5" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- d="m 330.02726,-62.5 4.63639,3"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffddb9;stroke-width:1.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path17390"
- inkscape:connector-curvature="0" />
- <path
- d="m 330.02724,-62.5 4.63639,3 m -4.63639,-3 -4.63634,3 m 4.60909,-3 v -6"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#radialGradient12429);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path17392"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccc"
- id="path17394"
- d="m 333.99999,-60 v 2 h 2 v -2 z"
- style="fill:#ffca91;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path17396"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#be6200;stroke-width:1.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 330.02726,-62.5 -4.63634,3"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path17398"
- style="display:inline;fill:none;stroke:#ff921d;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 330.00001,-62.5 v -6"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccc"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 329,-70 v 2 h 1.99999 v -2 z"
- id="path17400"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccc"
- style="fill:#e07400;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 324.00001,-60 v 2 H 326 v -2 z"
- id="path17402"
- inkscape:connector-curvature="0" />
- <rect
- y="-63.75"
- x="328.25"
- height="3.5"
- width="3.5000002"
- id="rect17404"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.05;fill:#552c00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccc"
- id="path17406"
- d="m 324.49999,-58.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1.00000083px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffe680;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000107px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 329.49999,-68.5 v -0.967392 h 0.99998"
- id="path17408"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccc"
- id="path17410"
- d="m 334.5,-58.499999 v -1 h 1"
- style="display:inline;opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000107px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 334,-60.5 -3,-1.870665"
- id="path17415"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#d4aa00;fill-opacity:1;fill-rule:evenodd;stroke:#784e21;stroke-width:1.00000036px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 333.5,-59.499999 v -1 h 1"
- id="path17417"
- sodipodi:nodetypes="ccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path17419"
- d="m 329.49999,-67.5 h 1"
- style="display:inline;opacity:0.4;fill:#d4aa00;fill-opacity:1;fill-rule:evenodd;stroke:#8c5b27;stroke-width:1.00000107px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccc"
- id="path17421"
- d="m 326.49995,-59.500011 v -1 h -1"
- style="display:inline;opacity:0.4;fill:#d4aa00;fill-opacity:1;fill-rule:evenodd;stroke:#8c5b27;stroke-width:1.00000036px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.27999998;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 326,-60.5 3,-1.870665"
- id="path17423"
- inkscape:connector-curvature="0" />
- <path
- id="path17425"
- d="m 329.5,-67.5 v 4"
- style="opacity:0.25;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <rect
- y="-63"
- x="329.06403"
- height="2"
- width="2"
- id="rect17427"
- style="display:inline;overflow:visible;visibility:visible;fill:#fff1d5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- id="ICON_OUTLINER_OB_CURVE"
- transform="translate(0,128)">
- <rect
- ry="0"
- rx="0"
- y="302"
- x="47"
- height="16"
- width="16"
- id="rect17065"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g24983">
- <rect
- rx="1.4999387"
- ry="1.4999387"
- y="313.5"
- x="49.5"
- height="3"
- width="2.9998772"
- id="rect17067"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#2b1600;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#2b1600;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect17069"
- width="2.9998772"
- height="3"
- x="52.500122"
- y="303.5"
- ry="1.4999387"
- rx="1.4999387" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="csc"
- id="path17071"
- d="m 51,315 c 4.5365,0 8.5,-3 8.5,-6 0,-1.75 -1.25,-4 -5.5,-4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b1600;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffad55;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 51,315 c 4.49647,0 8.5,-3 8.5,-6 0,-1.75 -1.25,-4 -5.5,-4"
- id="path17073"
- sodipodi:nodetypes="csc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="csc"
- id="path17075"
- d="m 51,315 c 4.49647,0 8.5,-3 8.5,-6 0,-1.75 -1.25,-4 -5.5,-4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient24436);stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path17077"
- d="m 51.999878,314 c -0.67541,0 -1.35081,10e-6 -2.02623,10e-6 0,0.66939 0,1.33877 0,2.00817 0.67542,0 1.35082,-10e-6 2.02623,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffca91;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffad55;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m 55,304 c -0.65334,0 -1.30668,10e-6 -1.96003,10e-6 0,0.66667 0,1.33332 0,1.99999 0.65335,0 1.30669,-10e-6 1.96003,-10e-6 0,-0.66666 0,-1.33332 0,-1.99999 z"
- id="path17081"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 53.5,305.5 v -1 h 1"
- id="path17083"
- inkscape:connector-curvature="0" />
- <path
- id="path17085"
- d="m 50.473648,315.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path17087"
- d="m 53,315.66293 c -0.32001,0 -0.64002,-1e-5 -0.96003,-1e-5 0,-0.55431 0,-1.1086 0,-1.66292 0.32001,0 0.64002,10e-6 0.96003,10e-6 0,0.55431 0,1.10861 0,1.66292 z"
- style="display:inline;opacity:0.25;fill:#783e00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path17089"
- d="m 56,306.51208 c -0.32001,0 -0.64002,-1e-5 -0.96003,-1e-5 0,-0.63982 0,-1.27964 0,-1.91948 0.32001,0 0.64002,1e-5 0.96003,1e-5 0,0.63983 0,1.27966 0,1.91948 z"
- style="display:inline;opacity:0.15;fill:#783e00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.5;fill:#783e00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 53,316 c -0.32001,0 -0.64002,0 -0.96003,0 0,-0.21055 0,-0.42107 0,-0.63162 0.32001,0 0.64002,0 0.96003,0 0,0.21055 0,0.42107 0,0.63162 z"
- id="path17091"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_OUTLINER_DATA_CURVE"
- transform="translate(0,128)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect17348"
- width="16"
- height="16"
- x="47"
- y="281"
- rx="0"
- ry="0" />
- <g
- id="g10677">
- <g
- id="g18285"
- style="display:inline;opacity:0.7"
- transform="translate(-290.00001,409.99343)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="csc"
- id="path18233"
- d="m 341.00001,-115.99343 c 4.5365,0 8.49999,-2.75 8.49999,-5.75 0,-1.75 -1.25,-4 -5.5,-4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#1a1a1a;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#cccccc;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 341.00001,-115.99343 c 4.49647,0 8.49999,-2.75 8.49999,-5.75 0,-1.75 -1.25,-4 -5.5,-4"
- id="path18235"
- sodipodi:nodetypes="csc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline"
- id="g17345"
- transform="translate(-189.02763,408)">
- <rect
- rx="1.4999387"
- ry="1.4999387"
- y="-115.5"
- x="238.52776"
- height="3"
- width="2.9998772"
- id="rect17355"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path17358"
- d="m 241.02763,-115 c -0.66667,0 -1.33332,1e-5 -2,1e-5 0,0.66939 0,1.33877 0,2.00817 0.66668,0 1.33333,-10e-6 2,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect17360"
- width="2.9998772"
- height="3"
- x="241.52776"
- y="-125.5"
- ry="1.4999387"
- rx="1.4999387" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m 244.02763,-125 c -0.65334,0 -1.30668,1e-5 -1.96003,1e-5 0,0.66667 0,1.33332 0,1.99999 0.65335,0 1.30669,-1e-5 1.96003,-1e-5 0,-0.66666 0,-1.33332 0,-1.99999 z"
- id="path17362"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- id="ICON_GHOST"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect21362"
- width="16"
- height="16"
- x="131"
- y="71" />
- <g
- transform="translate(-71,-61)"
- id="g9875"
- style="display:inline">
- <g
- id="g9889"
- transform="translate(0,1.00001)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path9891"
- d="m 210,135.5 h 6.5 v 11 h -9 V 138 Z"
- style="display:inline;fill:url(#linearGradient21370);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient21372);stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- inkscape:connector-curvature="0" />
- <path
- transform="matrix(1.2999758,0,0,1.2999988,271.54887,-199.56022)"
- sodipodi:nodetypes="ccc"
- id="path9893"
- style="display:inline;opacity:0.7;fill:none;stroke:#000000;stroke-width:0.76923829px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter31351)"
- d="M -48.500031,260.50809 -46.5,260.5 l -3.1e-5,-1.99191"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path9895"
- d="m 207,138.99999 h 4 v -4 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 207.5,138 v 8.5 h 9 v -11 H 210 Z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path9897"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path9899"
- style="display:inline;fill:none;stroke:url(#linearGradient21374);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="M 208.5,139.49999 V 145.5 m 3,-9.00001 h 4"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g9877"
- transform="translate(-4,-3)"
- style="opacity:0.4">
- <path
- style="display:inline;fill:url(#linearGradient21364);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient21366);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- d="m 210,135.5 h 6.5 v 11 h -9 V 138 Z"
- id="path9879"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- d="M -48.500031,260.50809 -46.5,260.5 l -3.1e-5,-1.99191"
- style="display:inline;opacity:0.7;fill:none;stroke:#000000;stroke-width:0.76923829px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter31351)"
- id="path9881"
- sodipodi:nodetypes="ccc"
- transform="matrix(1.2999758,0,0,1.2999988,271.54887,-199.56022)"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 207,138.99999 h 4 v -4 z"
- id="path9883"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- id="path9885"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 207.5,138 v 8.5 h 9 v -11 H 210 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- d="M 208.5,139.49999 V 145.5 m 3,-9.00001 h 4"
- style="display:inline;fill:none;stroke:url(#linearGradient21368);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- id="path9887"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- id="ICON_ROTATECOLLECTION"
- transform="translate(-0.9687515,1.9789998)">
- <g
- transform="matrix(1.0019536,0,0,1,-173.76637,169.95095)"
- id="g10199"
- style="stroke:none">
- <rect
- y="6.0700502"
- x="325.10001"
- height="15.979"
- width="16.000004"
- id="rect10201"
- style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- </g>
- <g
- id="g21550">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path10205"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.38667691;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.5769158,0,0,0.5769218,86.73182,118.78861)"
- cx="132"
- cy="118"
- r="8" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.769221,0,0,0.769229,59.2704,9.1909)"
- id="g10207"
- style="display:inline">
- <circle
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.38667703;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path10209"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.683022,-0.07745026,0.0778507,-0.683064,209.4726,314.325)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path10211"
- style="display:inline;opacity:0.4;fill:url(#linearGradient21641);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="g10213"
- transform="translate(-215.99994,222.97281)"
- style="display:inline">
- <rect
- style="display:inline;opacity:0.1;fill:none;stroke:#447cce;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- id="rect10215"
- width="3.0000761"
- height="2.9999874"
- x="372.49994"
- y="-43.495766"
- transform="skewY(3.0086827e-4)" />
- <rect
- transform="matrix(1,-5.25127e-6,0,-1,0,0)"
- y="40.991806"
- x="372.99994"
- height="2.0000756"
- width="2.0000861"
- id="rect10217"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="display:inline;fill:#d5e5ff;fill-opacity:1;fill-rule:nonzero;stroke:#0055d4;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- id="rect10219"
- width="3.0000761"
- height="2.9999874"
- x="372.49994"
- y="-43.49577"
- transform="skewY(3.0086827e-4)" />
- </g>
- <g
- style="display:inline"
- id="g10221"
- transform="matrix(0.769221,0,0,0.769229,64.0398,14.9217)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path10224"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.91227174;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.7125226,0,0,0.7125021,34.447023,139.42475)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.4;fill:url(#linearGradient21643);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path10226"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.683022,-0.07745026,0.0778507,-0.683064,209.4726,314.325)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline"
- transform="translate(-211.00001,228.97281)"
- id="g10228">
- <rect
- transform="skewY(3.0086827e-4)"
- y="-43.495766"
- x="372.49994"
- height="2.9999874"
- width="3.0000761"
- id="rect10230"
- style="display:inline;opacity:0.1;fill:none;stroke:#447cce;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1" />
- <rect
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect10232"
- width="2.0000861"
- height="2.0000756"
- x="372.99994"
- y="40.991806"
- transform="matrix(1,-5.25127e-6,0,-1,0,0)" />
- <rect
- transform="skewY(3.0086827e-4)"
- y="-43.49577"
- x="372.49994"
- height="2.9999874"
- width="3.0000761"
- id="rect10234"
- style="display:inline;fill:#d5e5ff;fill-opacity:1;fill-rule:nonzero;stroke:#0055d4;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1" />
- </g>
- </g>
- </g>
- <g
- id="ICON_ROTATECENTER"
- transform="translate(-1,1.9790001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect21645"
- width="16"
- height="16"
- x="173"
- y="176" />
- <g
- transform="translate(-209.00002,169.98079)"
- id="g10236"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- style="display:inline">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.769221,0,0,0.769229,289.2704,-160.7881)"
- id="g10238"
- style="display:inline">
- <circle
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.38667703;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path10240"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.683022,-0.07745026,0.0778507,-0.683064,209.4726,314.325)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path10242"
- style="display:inline;opacity:0.4;fill:url(#linearGradient15590);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- style="display:inline"
- id="g10244"
- transform="matrix(0.769221,0,0,0.769229,294.0398,-155.0573)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path10246"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.38667703;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.4;fill:url(#linearGradient15592);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path10248"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.683022,-0.07745026,0.0778507,-0.683064,209.4726,314.325)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="g10250"
- transform="translate(16.000061,55.993807)"
- style="display:inline">
- <rect
- style="display:inline;opacity:0.25;fill:none;stroke:#447cce;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- id="rect10252"
- width="3.0000761"
- height="2.9999874"
- x="372.49994"
- y="-43.495766"
- transform="skewY(3.0086827e-4)" />
- <rect
- transform="matrix(1,-5.25127e-6,0,-1,0,0)"
- y="40.991806"
- x="372.99994"
- height="2.0000756"
- width="2.0000861"
- id="rect10254"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="display:inline;fill:#d5e5ff;fill-opacity:1;fill-rule:nonzero;stroke:#0055d4;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- id="rect10256"
- width="3.0000761"
- height="2.9999874"
- x="372.49994"
- y="-43.49577"
- transform="skewY(3.0086827e-4)" />
- </g>
- </g>
- </g>
- <g
- id="ICON_ROTACTIVE"
- transform="translate(-0.9999786,1.9982099)">
- <g
- transform="matrix(0.9999986,0,0,1,-170.19957,169.98079)"
- id="g10260">
- <g
- transform="translate(39.10005,-0.04905017)"
- id="g10262">
- <rect
- y="6.0700502"
- x="325.10001"
- height="15.979"
- width="16.000025"
- id="rect10264"
- style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- </g>
- <g
- id="g10266" />
- </g>
- <g
- id="g21602">
- <circle
- transform="matrix(0.5769158,0,0,0.5769218,128.71244,118.78864)"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.38667691;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path10268"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <g
- style="display:inline;opacity:0.45"
- id="g10270"
- transform="matrix(0.769221,0,0,0.769229,101.2704,9.19269)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path10272"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.38667703;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.4;fill:url(#linearGradient15594);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path10275"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.683022,-0.07745026,0.0778507,-0.683064,209.4726,314.325)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.769221,0,0,0.769229,106.0398,14.92349)"
- id="g10277"
- style="display:inline">
- <circle
- transform="matrix(0.7119136,0,0,0.7119136,34.527408,139.4942)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.91303903;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path10279"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.683022,-0.07745026,0.0778507,-0.683064,209.4726,314.28576)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path10281"
- style="display:inline;opacity:0.4;fill:url(#linearGradient15596);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="skewY(3.0086827e-4)"
- y="179.47975"
- x="198.49991"
- height="2.9999874"
- width="3.0000761"
- id="rect10283"
- style="display:inline;opacity:0.05;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#6a6a6a;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1" />
- <rect
- style="display:inline;opacity:0.1;fill:none;stroke:#447cce;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- id="rect10285"
- width="3.0000761"
- height="2.9999874"
- x="203.49991"
- y="185.47972"
- transform="skewY(3.0086827e-4)" />
- <rect
- transform="matrix(1,-5.25127e-6,0,-1,0,0)"
- y="-187.9819"
- x="203.99991"
- height="2.0000756"
- width="2.0000861"
- id="rect10287"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="display:inline;fill:#d5e5ff;fill-opacity:1;fill-rule:nonzero;stroke:#0055d4;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- id="rect10289"
- width="3.0000761"
- height="2.9999874"
- x="203.49991"
- y="185.47972"
- transform="skewY(3.0086827e-4)" />
- </g>
- </g>
- <g
- id="ICON_CURSOR"
- transform="translate(0,2)">
- <rect
- style="display:inline;opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect10293"
- width="16"
- height="16"
- x="131"
- y="176" />
- <g
- transform="translate(0.8812553,-0.8570429)"
- id="g21511">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 142.1,184.4 h 2.5 m -9.5,0 h -2.5 m 6,-3.5 v -2.5 m 0,9.5 v 2.5"
- style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path10295"
- inkscape:connector-curvature="0" />
- <ellipse
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path10297"
- style="fill:none;stroke:#000000;stroke-width:8.3510685;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.383132,0,0,0.383237,88.0266,139.17807)"
- cx="132"
- cy="118"
- rx="9.0863705"
- ry="9.0860729" />
- <path
- id="path10299"
- style="fill:none;stroke:url(#radialGradient21517);stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 142.1,184.4 h 2.5 m -9.5,0 h -2.5 m 6,-3.5 v -2.5 m 0,9.5 v 2.5"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <ellipse
- transform="matrix(0.383132,0,0,0.383237,88.0266,139.17807)"
- style="fill:none;stroke:#ffffff;stroke-width:4.69747591;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path10301"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- rx="9.0863705"
- ry="9.0860729" />
- </g>
- </g>
- <g
- id="ICON_LAYER_ACTIVE"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect22465"
- width="16"
- height="16"
- x="425"
- y="113" />
- <g
- id="g14791"
- transform="translate(-38,43.987183)"
- style="display:inline">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#f09432;fill-opacity:1;fill-rule:nonzero;stroke:#462400;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.18177891;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect14793"
- width="4.0018005"
- height="3.9871812"
- x="468.5"
- y="74.512817"
- rx="1.4768832"
- ry="1.4768832" />
- <rect
- y="75.5"
- x="469.5018"
- height="2.012816"
- width="1.9981995"
- id="rect14795"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient14841);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.18177891;stroke-opacity:1;marker:none;enable-background:accumulate"
- ry="0.49075836"
- rx="0.49075836" />
- </g>
- </g>
- <g
- id="ICON_LAYER_USED"
- transform="translate(0,2)">
- <rect
- y="113"
- x="404"
- height="16"
- width="16"
- id="rect22463"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g14927"
- transform="translate(-39,43.987183)"
- style="display:inline;opacity:0.9">
- <rect
- ry="1.5045315"
- rx="1.5045315"
- y="74.512817"
- x="448.5"
- height="3.9871812"
- width="4.0018005"
- id="rect14929"
- style="display:inline;overflow:visible;visibility:visible;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.18177891;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient14935);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.18177891;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect14931"
- width="1.9981995"
- height="2.012816"
- x="449.5018"
- y="75.5"
- rx="0.5299269"
- ry="0.5299269" />
- </g>
- </g>
- <g
- id="ICON_NDOF_TURN"
- transform="translate(0,2)">
- <rect
- y="113"
- x="341"
- height="16"
- width="16"
- id="rect22331"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-81,-103)"
- id="g22313"
- style="display:inline">
- <g
- id="g22243">
- <g
- transform="translate(-0.9546587,1e-5)"
- id="g18888"
- style="opacity:0.85">
- <path
- sodipodi:nodetypes="cssc"
- d="m 430.45466,223.24999 c -2.76033,0 -5,1.88345 -5,3.25 0,1.5 2.5,3 5.5,3 0.15891,0 4,0.25 6,-2.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient18896);stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:12.66808033;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path18757"
- inkscape:connector-curvature="0" />
- <path
- id="path18762"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient18898);stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:12.66808033;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 434.20466,226.49999 3.25115,2e-5 -10e-4,2.99998"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- d="m 433.25,226.5 h 3.25 v 2.99999"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient18904);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path18764"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- id="path18766"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient18901);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 429.5,223.25 c -2.76033,0 -5,1.88345 -5,3.25 0,1.5 2.5,3 5.5,3 0,0 4,0.25 6,-2.5"
- sodipodi:nodetypes="cssc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(278.02661,459.99999)"
- id="g18768">
- <path
- id="path18770"
- d="m 151,-240.5 c -2.48519,0 -4.49999,0.89481 -4.5,2 v 1 c 0,1.10519 2.0148,2 4.5,2 2.48519,0 4.5,-0.8948 4.5,-2 v -1 c 0,-1.10519 -2.01481,-2 -4.5,-2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient18843);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.68242937;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient18845);fill-opacity:1;fill-rule:nonzero;marker:none;enable-background:accumulate"
- d="m 151.00029,-243.51106 c -1.9309,0 -3.5,0.66961 -3.5,1.5 L 147.5,-240 c 0,0.83039 1.5691,1.5 3.5,1.5 1.9309,0 3.5,-0.66961 3.5,-1.5 l 2.9e-4,-2.01106 c 0,-0.83039 -1.5691,-1.5 -3.5,-1.5 z"
- id="path18779"
- sodipodi:nodetypes="cccsccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient18848);stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 148.5,-241.75 v 2.70352 c 0.0622,0.056 0.19266,0.12733 0.40625,0.21875 0.46667,0.19974 1.2423,0.32773 2.09375,0.32773 0.85145,0 1.62708,-0.12799 2.09375,-0.32773 0.21359,-0.0914 0.34401,-0.16271 0.40625,-0.21875 V -241.75"
- id="path18787"
- sodipodi:nodetypes="ccssscc"
- inkscape:connector-curvature="0" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient18850);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73959124;marker:none;enable-background:accumulate"
- id="path18789"
- transform="matrix(1.0307577,0,0,0.9140456,39.651558,-39.251735)"
- cx="108"
- cy="-222"
- rx="3.3084693"
- ry="1.2798798" />
- <path
- sodipodi:nodetypes="cssss"
- id="path18791"
- d="m 154.5,-239 c 0,0.18405 -0.0775,0.36038 -0.21919,0.52335 -0.49587,0.57019 -1.77826,0.97665 -3.28081,0.97665 -1.48659,0 -2.75767,-0.39787 -3.26474,-0.95854 C 147.58334,-238.62651 147.5,-238.80911 147.5,-239"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient18852);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path18798"
- d="m 151,-243.5 c -1.9309,1e-5 -3.52661,0.41962 -3.52661,1.25001 L 147.5,-239.75 c -0.61542,0.34205 -1,0.77768 -1,1.25 l -0.0266,1.25001 c 0,1.10519 2.04141,1.74999 4.52661,1.74999 2.48519,0 4.47339,-0.64479 4.47339,-1.74999 L 155.5,-238.5 c 0,-0.47232 -0.38458,-0.90795 -1,-1.25 l -0.0266,-2.49999 c 0,-0.83038 -1.54249,-1.25001 -3.47339,-1.25001 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccccsccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csssc"
- id="path18800"
- d="m 148.5,-239.04648 c 0.0622,0.056 0.19266,0.12733 0.40625,0.21875 0.46667,0.19974 1.2423,0.32773 2.09375,0.32773 0.85145,0 1.62708,-0.12799 2.09375,-0.32773 0.21359,-0.0914 0.34401,-0.16271 0.40625,-0.21875"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0066ff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- id="ICON_NDOF_TRANS"
- transform="translate(0,2)">
- <rect
- y="113"
- x="383"
- height="16"
- width="16"
- id="rect22455"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-79,-103)"
- id="g22283"
- style="display:inline">
- <g
- transform="translate(318.02661,459.99999)"
- id="g17510">
- <path
- id="path17512"
- d="m 151,-240.5 c -2.48519,0 -4.49999,0.89481 -4.5,2 v 1 c 0,1.10519 2.0148,2 4.5,2 2.48519,0 4.5,-0.8948 4.5,-2 v -1 c 0,-1.10519 -2.01481,-2 -4.5,-2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17527);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.68242937;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17529);fill-opacity:1;fill-rule:nonzero;marker:none;enable-background:accumulate"
- d="m 151.00029,-243.51106 c -1.9309,0 -3.5,0.66961 -3.5,1.5 L 147.5,-240 c 0,0.83039 1.5691,1.5 3.5,1.5 1.9309,0 3.5,-0.66961 3.5,-1.5 l 2.9e-4,-2.01106 c 0,-0.83039 -1.5691,-1.5 -3.5,-1.5 z"
- id="path17514"
- sodipodi:nodetypes="cccsccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17531);stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 148.5,-241.75 v 2.70352 c 0.0622,0.056 0.19266,0.12733 0.40625,0.21875 0.46667,0.19974 1.2423,0.32773 2.09375,0.32773 0.85145,0 1.62708,-0.12799 2.09375,-0.32773 0.21359,-0.0914 0.34401,-0.16271 0.40625,-0.21875 V -241.75"
- id="path17516"
- sodipodi:nodetypes="ccssscc"
- inkscape:connector-curvature="0" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17533);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73959124;marker:none;enable-background:accumulate"
- id="path17518"
- transform="matrix(1.0307577,0,0,0.9140456,39.651558,-39.251735)"
- cx="108"
- cy="-222"
- rx="3.3084693"
- ry="1.2798798" />
- <path
- sodipodi:nodetypes="cssss"
- id="path17520"
- d="m 154.5,-239 c 0,0.18405 -0.0775,0.36038 -0.21919,0.52335 -0.49587,0.57019 -1.77826,0.97665 -3.28081,0.97665 -1.48659,0 -2.75767,-0.39787 -3.26474,-0.95854 C 147.58334,-238.62651 147.5,-238.80911 147.5,-239"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17535);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path17522"
- d="m 151,-243.5 c -1.9309,1e-5 -3.52661,0.41962 -3.52661,1.25001 L 147.5,-239.75 c -0.61542,0.34205 -1,0.77768 -1,1.25 l -0.0266,1.25001 c 0,1.10519 2.04141,1.74999 4.52661,1.74999 2.48519,0 4.47339,-0.64479 4.47339,-1.74999 L 155.5,-238.5 c 0,-0.47232 -0.38458,-0.90795 -1,-1.25 l -0.0266,-2.49999 c 0,-0.83038 -1.54249,-1.25001 -3.47339,-1.25001 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccccsccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csssc"
- id="path17524"
- d="m 148.5,-239.04648 c 0.0622,0.056 0.19266,0.12733 0.40625,0.21875 0.46667,0.19974 1.2423,0.32773 2.09375,0.32773 0.85145,0 1.62708,-0.12799 2.09375,-0.32773 0.21359,-0.0914 0.34401,-0.16271 0.40625,-0.21875"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0066ff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g22254">
- <g
- transform="translate(20.029029)"
- style="opacity:0.85"
- id="g17822">
- <path
- d="m 446.75,226.25 -2.25,2.25 2.25,2.25 m 7.5,-4.5 2.25,2.25 -2.25,2.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17817);stroke-width:2.5999999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:12.66808033;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path17811"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path17809"
- d="m 444.54256,228.5 h 11.66489 v 0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17819);stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:12.66808033;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(20.029029)"
- id="g17801">
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="M 444.54256,228.5 H 456.5"
- id="path17024"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- id="path17796"
- style="fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 446.75,226.25 -2.25,2.25 2.25,2.25 m 7.5,-4.5 2.25,2.25 -2.25,2.25"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- </g>
- <g
- id="ICON_NDOF_FLY"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect22453"
- width="16"
- height="16"
- x="362"
- y="113" />
- <g
- transform="translate(-81,-103)"
- id="g22300"
- style="display:inline">
- <g
- id="g17482"
- transform="translate(298.02661,466.04648)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17498);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.68242937;marker:none;enable-background:accumulate"
- d="m 151,-240.5 c -2.48519,0 -4.49999,0.89481 -4.5,2 v 1 c 0,1.10519 2.0148,2 4.5,2 2.48519,0 4.5,-0.8948 4.5,-2 v -1 c 0,-1.10519 -2.01481,-2 -4.5,-2 z"
- id="path17484"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccsccc"
- id="path17486"
- d="m 151.00029,-243.51106 c -1.9309,0 -3.5,0.66961 -3.5,1.5 L 147.5,-240 c 0,0.83039 1.5691,1.5 3.5,1.5 1.9309,0 3.5,-0.66961 3.5,-1.5 l 2.9e-4,-2.01106 c 0,-0.83039 -1.5691,-1.5 -3.5,-1.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17500);fill-opacity:1;fill-rule:nonzero;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccssscc"
- id="path17488"
- d="m 148.5,-241.75 v 2.70352 c 0.0622,0.056 0.19266,0.12733 0.40625,0.21875 0.46667,0.19974 1.2423,0.32773 2.09375,0.32773 0.85145,0 1.62708,-0.12799 2.09375,-0.32773 0.21359,-0.0914 0.34401,-0.16271 0.40625,-0.21875 V -241.75"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17502);stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <ellipse
- transform="matrix(1.0307577,0,0,0.9140456,39.651558,-39.251735)"
- id="path17490"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17504);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73959124;marker:none;enable-background:accumulate"
- cx="108"
- cy="-222"
- rx="3.3084693"
- ry="1.2798798" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17506);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 154.5,-239 c 0,0.18405 -0.0775,0.36038 -0.21919,0.52335 -0.49587,0.57019 -1.77826,0.97665 -3.28081,0.97665 -1.48659,0 -2.75767,-0.39787 -3.26474,-0.95854 C 147.58334,-238.62651 147.5,-238.80911 147.5,-239"
- id="path17492"
- sodipodi:nodetypes="cssss"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccsccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 151,-243.5 c -1.9309,1e-5 -3.52661,0.41962 -3.52661,1.25001 L 147.5,-239.75 c -0.61542,0.34205 -1,0.77768 -1,1.25 l -0.0266,1.25001 c 0,1.10519 2.04141,1.74999 4.52661,1.74999 2.48519,0 4.47339,-0.64479 4.47339,-1.74999 L 155.5,-238.5 c 0,-0.47232 -0.38458,-0.90795 -1,-1.25 l -0.0266,-2.49999 c 0,-0.83038 -1.54249,-1.25001 -3.47339,-1.25001 z"
- id="path17494"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0066ff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 148.5,-239.04648 c 0.0622,0.056 0.19266,0.12733 0.40625,0.21875 0.46667,0.19974 1.2423,0.32773 2.09375,0.32773 0.85145,0 1.62708,-0.12799 2.09375,-0.32773 0.21359,-0.0914 0.34401,-0.16271 0.40625,-0.21875"
- id="path17496"
- sodipodi:nodetypes="csssc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g22250">
- <path
- style="opacity:0.85;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 456.5,218.5 c -1.25,-1.5 -3.5,-1.5 -5,1 -1.5,-2.5 -3.75,-2.5 -5,-1"
- id="path17828"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path17826"
- d="m 456.5,218.5 c -1.25,-1.5 -3.5,-1.5 -5,1 -1.5,-2.5 -3.75,-2.5 -5,-1"
- style="fill:url(#linearGradient18213);fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- id="ICON_NDOF_DOM"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect22457"
- width="16"
- height="16"
- x="320"
- y="113" />
- <g
- mask="url(#mask18666)"
- style="display:inline"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g18026"
- transform="matrix(0.927273,0,0,1,260.65455,106)">
- <path
- sodipodi:nodetypes="cccccc"
- d="m 70.499967,14.5 4.284298,2.5 m -4.284298,-2.5 -4.34315,2.5 m 4.313724,-2.5 V 10"
- style="display:inline;fill:none;stroke:#000000;stroke-width:3.42696857;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path18028"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path18030"
- d="m 69.39211,8 v 2 h 2.156862 V 8 Z m -4.313742,8 1.8e-5,2 h 2.156862 l -1.8e-5,-2 z m 8.627466,0 v 2 h 2.156862 v -2 z"
- style="fill:#acc373;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.55771327;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccccccccccccc"
- inkscape:connector-curvature="0" />
- <circle
- style="display:inline;fill:url(#radialGradient23738);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path18032"
- transform="matrix(1.176776,0,0,1.176776,-12.47787,-2.548088)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="70.5"
- cy="14.5"
- r="1.5" />
- <path
- id="path18035"
- style="display:inline;fill:none;stroke:#91ae42;stroke-width:2.07695079;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="M 70.470541,14.5 74.784265,17"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#91ae42;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 73.705834,16 v 2 h 2.156862 v -2 z"
- id="path18037"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path18039"
- d="m 69.39211,8 v 2 h 2.156862 V 8 Z"
- style="fill:#4989e9;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path18041"
- d="m 65.078405,16 v 2 h 2.156844 v -2 z"
- style="fill:#ef6529;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- d="M 70.470541,14.5 66.156817,17"
- style="display:inline;fill:none;stroke:#ef6529;stroke-width:2.07695079;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path18043"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- d="M 70.470541,14.5 V 10"
- style="display:inline;fill:none;stroke:#4989e9;stroke-width:2.07695079;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path18045"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <circle
- transform="matrix(0.699335,0,0,0.602252,21.19685,5.767346)"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path18047"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="70.5"
- cy="14.5"
- r="1.5" />
- <path
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1.03847623px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 65.617602,17.5 v -1 h 1.078431"
- id="path18049"
- sodipodi:nodetypes="ccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path18051"
- d="M 69.93132,9.5 V 8.5326076 h 1.078413"
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1.03847599px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1.03847647px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 74.24505,17.500004 v -1 h 1.078431"
- id="path18053"
- sodipodi:nodetypes="ccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-162,-102)"
- id="g18124">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.70588235;marker:none;enable-background:accumulate"
- d="m 495.5,226 c 0,0 0,-1.75 0,-1.75 0,-0.96333 -0.75,-1.75 -2,-1.75 -1.25,0 -2,0.78667 -2,1.75 V 226"
- id="path18055"
- sodipodi:nodetypes="csccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- y="225.48849"
- x="489.5"
- height="5.0114956"
- width="7.9999995"
- id="rect18057"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23750);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.70588235;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="csccc"
- id="path18059"
- d="m 495.5,226 c 0,0 0,-1.75 0,-1.75 0,-0.96333 -0.75,-1.75 -2,-1.75 -1.25,0 -2,0.78667 -2,1.75 V 226"
- style="fill:none;stroke:url(#linearGradient23752);stroke-width:1.39999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;fill:none;stroke:url(#linearGradient23754);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect18061"
- width="6.0312495"
- height="3.0344827"
- x="490.5"
- y="226.5"
- rx="0"
- ry="0" />
- </g>
- </g>
- <g
- id="ICON_ANIM_DATA"
- transform="translate(168,65.000007)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect20632"
- width="16"
- height="16"
- x="68"
- y="428" />
- <g
- style="display:inline"
- transform="translate(-15.161301,338)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g10762">
- <path
- d="m 86.5,100.53983 4.342131,0.008 c 5.188235,0.0101 5.335295,-2.04831 3.335293,-4.04831 -0.964875,-0.964875 -4.5,-4 1.500002,-5 M 88.840543,97.588774 86.5,100.53983 M 88.828993,103.5 86.5,100.53983"
- style="display:inline;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path10764"
- sodipodi:nodetypes="czszcccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="czszcccc"
- id="path10766"
- style="display:inline;fill:none;stroke:url(#linearGradient13991);stroke-width:1.50000143;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 86.5,100.53983 4.342131,0.008 C 96.03037,100.55844 96.17743,98.5 94.177424,96.5 c -0.964875,-0.964875 -4.5,-4 1.500002,-5 M 88.840543,97.588774 86.5,100.53983 M 88.828993,103.5 86.5,100.53983"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_SCRIPT"
- transform="translate(0,128.00001)">
- <rect
- y="428"
- x="193.9839"
- height="16"
- width="16"
- id="rect20642"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-29.016109,339.00751)"
- id="g20606">
- <g
- transform="translate(-199.98388,-106)"
- id="g10953">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccc"
- style="fill:none;stroke:#000000;stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 429.9998,196.99249 v 1.625 c -0.53409,0.12195 -1.02562,0.33162 -1.46875,0.625 l -1.53125,-1.25 -1,1 1.25,1.53125 c -0.29338,0.44313 -0.50305,0.93466 -0.625,1.46875 h -1.625 v 2 h 1.625 c 0.12195,0.53409 0.33162,1.02562 0.625,1.46875 l -1.25,1.53125 1,1 1.53125,-1.25 c 0.44313,0.29338 0.93466,0.50305 1.46875,0.625 v 1.625 h 2 v -1.625 c 0.53409,-0.12195 1.02562,-0.33162 1.46875,-0.625 l 1.53125,1.25 1,-1 -1.25,-1.53125 c 0.29338,-0.44313 0.50305,-0.93466 0.625,-1.46875 h 1.625 v -2 h -1.625 c -0.12195,-0.53409 -0.33162,-1.02562 -0.625,-1.46875 l 1.25,-1.53125 -1,-1 -1.53125,1.25 c -0.44313,-0.29338 -0.93466,-0.50305 -1.46875,-0.625 v -1.625 z m -1,4 h 4 v 4 h -4 z"
- id="path10955"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccc"
- id="path10957"
- d="m 429.9998,196.99249 v 1.625 c -0.53409,0.12195 -1.02562,0.33162 -1.46875,0.625 l -1.53125,-1.25 -1,1 1.25,1.53125 c -0.29338,0.44313 -0.50305,0.93466 -0.625,1.46875 h -1.625 v 2 h 1.625 c 0.12195,0.53409 0.33162,1.02562 0.625,1.46875 l -1.25,1.53125 1,1 1.53125,-1.25 c 0.44313,0.29338 0.93466,0.50305 1.46875,0.625 v 1.625 h 2 v -1.625 c 0.53409,-0.12195 1.02562,-0.33162 1.46875,-0.625 l 1.53125,1.25 1,-1 -1.25,-1.53125 c 0.29338,-0.44313 0.50305,-0.93466 0.625,-1.46875 h 1.625 v -2 h -1.625 c -0.12195,-0.53409 -0.33162,-1.02562 -0.625,-1.46875 l 1.5,-1.78125 -1,-1 -1.78125,1.5 c -0.44313,-0.29338 -0.93466,-0.50305 -1.46875,-0.625 v -1.625 z m -1,4 h 4 v 4 h -4 z"
- style="fill:url(#linearGradient20796);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- d="m 434.9998,198.49249 -1.5,1.25 m -2,-2.25 h -1 v 1.5 c -0.35104,0.0802 -1.01806,0.29269 -1.5172,0.50569 m -1.49,1.50752 c -0.20864,0.49552 -0.41426,1.14284 -0.4928,1.48679 h -1.5 v 1 m 1.5,-5 -0.5,0.5 m 1.25,6.5 -1.25,1.5 m 6.5,-5.5 v 3.5 h -3.5 m -3,-6 0.5,-0.5 1.5,1.25"
- style="fill:none;stroke:#f9f9f9;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- id="path10959"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-199.98388,-106)"
- id="g10961">
- <rect
- ry="0"
- rx="0"
- y="202.46629"
- x="430.49979"
- height="8.1236582"
- width="7.0000763"
- id="rect10963"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- d="m 432.53795,204.5065 h 2.96201 m -2.96201,1.993 h 2.96201 m -2.96201,1.993 h 2.96201"
- style="fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- id="path10965"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- ry="0"
- rx="0"
- y="202.48912"
- x="430.49661"
- height="8.0067444"
- width="7.0067482"
- id="rect10967"
- style="fill:none;stroke:url(#linearGradient20798);stroke-width:0.99325603;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- </g>
- <g
- id="ICON_RADIO"
- transform="translate(0,128.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect20640"
- width="16"
- height="16"
- x="173"
- y="428" />
- <g
- transform="translate(-29.98389,338.00045)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g11077"
- style="display:inline">
- <g
- id="g11079"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.965527,0,0,0.993394,8.273839,0.460629)">
- <g
- id="g11081"
- transform="matrix(1.086383,0,0,1.082072,-19.43307,-7.852041)">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.833341,0,0,0.829252,85.1747,-87.30584)"
- id="g11083" />
- <g
- style="stroke:#000000;stroke-width:1.13287878;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="g11085"
- transform="matrix(0.833341,0,0,0.829252,85.1747,-87.30584)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- id="path23208"
- style="display:inline;overflow:visible;visibility:visible;fill:#dad727;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.92361271;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.929498,0,0,0.910458,28.4835,116.0319)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.8580178,0,0,0.8424365,37.918882,124.05843)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23215);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.92361271;marker:none;enable-background:accumulate"
- id="path23213"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 210.20333,98.981214 v -1.914298 h 1.90698 v 1.914298 z"
- id="path11089"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <g
- id="g11091">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccc"
- inkscape:transform-center-y="-3.3687892"
- id="path11093"
- d="m 208.05857,93.345302 2.18641,2.891627 c 0.50125,-0.147037 1.16637,-0.122617 1.82389,-0.02056 l 2.18648,-2.87107 c -1.9067,-1.162873 -4.29008,-1.162873 -6.19678,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccc"
- inkscape:transform-center-y="2.4548853"
- id="path11095"
- d="m 208.53524,102.88086 1.43003,-3.336509 c -0.67737,-0.380664 -0.53518,-1.067385 -0.59136,-1.547136 l -3.93706,-4.21e-4 c 0,2.093176 1.43003,4.186346 3.09839,4.884066 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:transform-center-x="3.3187399"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:transform-center-x="-3.318739"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 213.77867,102.88086 -1.43002,-3.336509 c 0.67738,-0.380664 0.53486,-1.067385 0.59105,-1.547136 l 3.93736,-4.21e-4 c 0,2.325746 -1.43003,4.186346 -3.09839,4.884066 z"
- id="path11097"
- inkscape:transform-center-y="2.4548853"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <ellipse
- id="path11099"
- style="display:inline;fill:none;stroke:url(#linearGradient13520);stroke-width:1.40287328;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.713599,0,0,0.712048,116.8049,13.97832)"
- cx="132"
- cy="118"
- rx="7.7074003"
- ry="7.7241406" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="translate(-160.2001,83.979)"
- id="g11101">
- <g
- transform="translate(39.10005,-0.04905017)"
- id="g11103" />
- <g
- id="g11105" />
- </g>
- <g
- id="g11107"
- style="display:inline;opacity:0.3"
- transform="matrix(1.0489321,0,0,1.0749238,-10.489315,-7.3395414)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccc"
- inkscape:transform-center-y="-3.3687892"
- id="path11109"
- d="m 208.05857,93.345302 2.18641,2.891627 c 0.50125,-0.147037 1.16637,-0.122617 1.82389,-0.02056 l 2.18648,-2.87107 c -1.9067,-1.162873 -4.29008,-1.162873 -6.19678,0 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccc"
- inkscape:transform-center-y="2.4548853"
- id="path11111"
- d="m 208.53524,102.88086 1.43003,-3.336509 c -0.67737,-0.380664 -0.53518,-1.067385 -0.59136,-1.547136 l -3.93706,-4.21e-4 c 0,2.093176 1.43003,4.186346 3.09839,4.884066 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:transform-center-x="3.3187399"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_BONE_DATA"
- transform="translate(20,319.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect21195"
- width="16"
- height="16"
- x="363"
- y="174" />
- <g
- transform="matrix(0.68898,0.688545,-0.68898,0.688545,503.65632,-65.53941)"
- id="g11065"
- style="display:inline">
- <path
- sodipodi:nodetypes="ccczcczccccscsccscscc"
- id="path11067"
- d="m 85.658035,278.19867 c 1.5,0 2.00279,1.00232 2.00279,2.00232 l 1.14e-4,0.36297 c 0,0.75 -0.916764,1.9289 -1.666764,1.9289 -0.75,0 -0.858674,0.24559 -2.129469,-1.0252 -0.5,0 -0.22594,-2.3e-4 -0.72594,-2.3e-4 -1.269993,1.26999 -1.394591,1.02543 -2.144591,1.02543 -0.75,0 -1.681542,-1.18154 -1.681542,-1.93154 l -1.15e-4,-0.36297 c 0,-1 0.489879,-2.00105 1.989879,-2.00105 l -0.01948,-5.74221 c -1.5,0 -1.97318,-1.05691 -1.973496,-2.05693 l -1.14e-4,-0.36297 c 0,-0.75 0.855204,-1.89751 1.666764,-1.9289 0.71584,-0.0277 0.873337,-0.24811 2.144133,1.02268 l 0.725939,2.3e-4 c 1.088566,-1.08856 1.396658,-1.02291 2.129928,-1.02291 0.75,0 1.681542,1.18154 1.681542,1.93154 l 1.15e-4,0.36297 c 1.58e-4,0.5 -0.519172,2.05566 -2.019172,2.05566 l 0.01948,5.74221 z"
- style="fill:url(#linearGradient15748);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.821307;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.02663434px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 82.032098,271.66942 0.0023,7.25939"
- id="path11069"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#646464;fill-opacity:0.75;fill-rule:evenodd;stroke:#646464;stroke-width:1.02663434px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 85.299056,272.39639 h -1"
- id="path11071"
- inkscape:connector-curvature="0" />
- <path
- id="path11073"
- d="m 85.310309,278.21333 h -1"
- style="fill:#646464;fill-opacity:0.75;fill-rule:evenodd;stroke:#646464;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.02663434px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 82.397361,278.92893 c -2.4948,-0.75001 -2.539872,2.90296 -0.906565,2.72199"
- id="path11075"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path24253"
- d="m 82.395068,271.66953 c -2.548534,0.53612 -2.178736,-2.90444 -0.908284,-2.72256"
- style="fill:none;stroke:#ffffff;stroke-width:1.02663434px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:transform-center-x="-0.32852741"
- inkscape:transform-center-y="-1.3911103"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.6;fill:#646464;fill-opacity:0.75;fill-rule:evenodd;stroke:#646464;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 82.5437,278.0941 h -1"
- id="path24290"
- inkscape:connector-curvature="0" />
- <path
- id="path24294"
- d="m 82.532207,272.51355 h -1"
- style="opacity:0.6;fill:#646464;fill-opacity:0.75;fill-rule:evenodd;stroke:#646464;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path33682"
- d="m 84.394211,280.56292 0.726168,0.72617"
- style="fill:none;stroke:#ffffff;stroke-width:1.02663434px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.02663434px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 84.390887,270.0368 0.72571,-0.72571"
- id="path33684"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_DISCLOSURE_TRI_RIGHT"
- transform="translate(-166,402)">
- <rect
- y="217"
- x="402"
- height="16"
- width="16"
- id="rect24679"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g9450"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.6171649,0,0,0.6170324,328.7006,73.30195)"
- style="display:inline;opacity:0.8">
- <g
- style="display:inline"
- id="g9452"
- transform="matrix(0.927848,0,0,0.916217,-28.19594,40.73172)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path9454"
- style="fill:url(#linearGradient15446);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00075221;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.872933,0,0,0.883992,56.29135,118.6984)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- d="m 134.19651,245.03757 h -6.46038 m 3.23019,3.23013 v -6.46025"
- style="fill:none;stroke:url(#linearGradient15448);stroke-width:4.86145973;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
- id="path9456"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- sodipodi:nodetypes="cc"
- d="m 130.96632,248.2677 v -6.46025"
- style="fill:none;stroke:#000000;stroke-width:2.10663271;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path9458"
- inkscape:connector-curvature="0" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- transform="matrix(0.784039,0,0,0.779055,-3.508124,71.29625)"
- id="g9460"
- style="display:inline;fill:none;stroke:url(#linearGradient15452);stroke-width:1.91174495;stroke-opacity:1">
- <circle
- transform="matrix(0.8478042,0,0,0.8531716,59.60482,122.34129)"
- style="fill:none;stroke:url(#linearGradient15450);stroke-width:2.43795967;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path9462"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- id="path9465"
- style="fill:none;stroke:#000000;stroke-width:2.10663271;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 134.19651,245.03757 h -6.46038"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_INLINK"
- transform="translate(307.00001,487.05412)">
- <rect
- y="111"
- x="202"
- height="16"
- width="16"
- id="rect24481"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(1.7e-4,10.00012)"
- id="g9996"
- style="display:inline">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.91431391;marker:none"
- d="m 209.99983,115.99988 c 3.86419,0 6.99999,-3.13578 6.99999,-6.99996 0,-3.86418 -3.1358,-6.99997 -6.99999,-6.99997 -3.86419,0 -6.99998,3.13579 -6.99998,6.99997 0,3.86418 3.13579,6.99996 6.99998,6.99996 z m 0,-4.66664 c -1.45833,0 -2.33333,-0.875 -2.33333,-2.33332 0,-1.45833 0.875,-2.33332 2.33333,-2.33332 1.45833,0 2.33333,0.87499 2.33333,2.33332 0,1.45832 -0.875,2.33332 -2.33333,2.33332 z"
- id="path9998"
- sodipodi:nodetypes="csssccsssc"
- inkscape:connector-curvature="0" />
- <g
- id="g10000"
- transform="matrix(-2.005135,0,0,-2.005129,595.3141,357.6101)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient15578);stroke-width:0.59846401;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- d="m 192.16369,120.79528 c -1.76189,0 -3.19179,1.42994 -3.1918,3.19182 0,1.76188 1.42991,3.19183 3.1918,3.19183 1.76188,0 3.19179,-1.42995 3.1918,-3.19183 0,-1.76188 -1.42992,-3.19182 -3.1918,-3.19182 z"
- id="path10002"
- sodipodi:nodetypes="csssc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csssc"
- id="path10004"
- d="m 192.16376,122.51797 c -0.81098,0 -1.46916,0.65815 -1.46916,1.46907 0,0.81094 0.65818,1.46907 1.46916,1.46907 0.81097,0 1.46913,-0.65813 1.46913,-1.46907 0,-0.81092 -0.65816,-1.46907 -1.46913,-1.46907 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient15580);stroke-width:0.59846407;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- id="ICON_RIGHTARROW">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(-1.9535916,0,0,1.1712921,1176.1968,319.2322)"
- id="g29877-5-3-1"
- style="display:inline;enable-background:new">
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path29879-5-0-9"
- d="m 392.96689,241.84215 h -0.56915 l -3.5287,2.84782 v 1.13912 l 3.5287,2.84781 h 0.56915 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient106344-5);fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient106433);stroke-width:0.66107476px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path29881-5-6-0"
- d="m 392.96688,248.67221 h -0.57173 l -3.51515,-2.83619 -0.008,-1.21916"
- style="fill:none;stroke:url(#linearGradient106307-2);stroke-width:0.66107482px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="598"
- x="404"
- height="16"
- width="16"
- id="rect24491"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="ICON_DOWNARROW">
- <rect
- transform="rotate(90)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect29875"
- width="16"
- height="16"
- x="619"
- y="-441" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0,-2.196282,-1.316799,0,755.9575,1484.5661)"
- id="g29877"
- style="display:inline">
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path29879"
- d="m 392.96689,241.84215 h -0.56915 l -3.5287,2.84782 v 1.13912 l 3.5287,2.84781 h 0.56915 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient29884);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.58802557px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path29881"
- d="m 392.51157,247.53778 v -4.93622 l -3.18721,2.46812"
- style="fill:none;stroke:url(#linearGradient29886);stroke-width:0.58802563px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_DOT"
- transform="translate(259,508.00001)">
- <rect
- y="111"
- x="103"
- height="16"
- width="16"
- id="rect24489"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <circle
- transform="matrix(-0.248353,0.02816779,0.02830718,0.248422,140.45214,86.01031)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path10768"
- style="display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- style="display:inline"
- id="ICON_ZOOMOUT"
- transform="translate(-112,487.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect24479"
- width="16"
- height="16"
- x="243"
- y="111" />
- <g
- transform="translate(0.01612278,6)"
- id="g10870"
- style="display:inline">
- <rect
- style="fill:url(#linearGradient15719);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect10872"
- width="11.000006"
- height="2.9999976"
- x="245.48387"
- y="111.49999"
- rx="0"
- ry="1.4769578"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- style="fill:none;stroke:url(#linearGradient15721);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 254.47577,112.49191 -7.99189,0.008 0.0242,1"
- id="path10874"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_ZOOMIN"
- transform="translate(-113,487.00001)">
- <rect
- y="111"
- x="223"
- height="16"
- width="16"
- id="rect24477"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(0.01612278,6)"
- id="g10876"
- style="display:inline">
- <path
- style="fill:url(#linearGradient15723);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 225.48388,111.49999 4.01612,-0.008 -0.0161,-3.99192 h 3 l 0.0161,3.99192 3.98388,0.008 v 3 l -3.98388,-0.008 -0.0161,4.008 h -3 l 0.0161,-4.008 -4.01612,0.008 z"
- id="path10878"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path10880"
- d="m 232.48388,112.49999 h 3 m -5,2 v 3 m 1,-9 h -1 l 0.0161,3.99192 -4.01612,0.008 0.0242,1"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="ccccccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_PLUS"
- transform="translate(-128,487.00001)">
- <rect
- y="132"
- x="322"
- height="16"
- width="16"
- id="rect24475"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g11344"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.9261989,0,0,0.928757,209.23303,-98.08036)"
- style="display:inline">
- <g
- style="display:inline"
- id="g11346"
- transform="matrix(0.927848,0,0,0.916217,-28.19594,40.73172)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path11348"
- style="fill:url(#linearGradient15774);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.06496322;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.872933,0,0,0.883992,56.29135,130.45005)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- d="m 134.19651,255.80467 h -6.46038 m 3.23019,3.23013 v -6.46025"
- style="fill:none;stroke:url(#linearGradient15776);stroke-width:3.2301569;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
- id="path11350"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- sodipodi:nodetypes="cc"
- d="m 130.96632,259.0348 v -6.46025"
- style="fill:none;stroke:#000000;stroke-width:1.07819378;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path11352"
- inkscape:connector-curvature="0" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- transform="matrix(0.784039,0,0,0.779055,-3.508124,71.29625)"
- id="g11354"
- style="display:inline;fill:none;stroke:url(#linearGradient15780);stroke-width:1.27024341;stroke-opacity:1">
- <circle
- transform="matrix(0.858314,0,0,0.863791,58.21752,134.9089)"
- style="fill:none;stroke:url(#linearGradient15778);stroke-width:1.60000753;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path11356"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- id="path11358"
- style="fill:none;stroke:#000000;stroke-width:1.07819378;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 134.19651,255.80467 h -6.46038"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_LINK"
- transform="translate(305,487.00001)">
- <rect
- y="111"
- x="183"
- height="16"
- width="16"
- id="rect24483"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="rotate(180,191.00806,119.00003)"
- id="g54036"
- style="display:inline">
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient16025);stroke-width:1.94115818;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="path54038"
- transform="matrix(0.61819,0,0,0.618186,73.23488,45.12681)"
- cx="190.5"
- cy="119.5"
- r="5.5" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_RADIOBUT_OFF"
- transform="translate(114.02028,508.00993)">
- <rect
- y="111"
- x="143"
- height="16"
- width="16"
- id="rect24487"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g24576">
- <circle
- transform="matrix(1.4256767,0,0,1.4314068,-320.1963,68.175135)"
- id="path15084"
- style="display:inline;fill:#e6e6e6;fill-opacity:0.25490196;fill-rule:nonzero;stroke:none"
- cx="330.5"
- cy="35.5"
- r="2.7944512" />
- <circle
- transform="matrix(1.2885487,0,0,1.2885617,-274.87525,73.246084)"
- id="path15086"
- style="display:inline;opacity:0.4;fill:none;stroke:url(#linearGradient15122);stroke-width:0.77606368;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- cx="330.5"
- cy="35.5"
- r="3.5" />
- <circle
- style="display:inline;opacity:0.6;fill:none;stroke:url(#linearGradient15124);stroke-width:0.77608043;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="path15099"
- transform="matrix(-1.288521,0,0,-1.2885339,576.8463,164.73299)"
- cx="330.5"
- cy="35.5"
- r="3.5" />
- </g>
- </g>
- <g
- style="display:inline;opacity:0.6"
- id="ICON_RIGHTARROW_THIN"
- transform="translate(4,529.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect24905"
- width="16"
- height="16"
- x="43"
- y="69" />
- <g
- transform="translate(0.01612278)"
- id="g10995"
- style="display:inline">
- <g
- style="display:inline;fill:none"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(-0.608695,0,0,0.604849,289.36339,-70.36932)"
- id="g10997">
- <path
- id="path10999"
- d="m 394.08819,237.85988 -6.57143,6.61322 6.57143,6.61322 h 1.23215 l -10e-6,-13.22644 z"
- style="fill:none;stroke:#000000;stroke-width:1.64807379;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path11001"
- d="m 49.233877,73.74999 3.75,3.75 -3.75,3.75 h -0.25 v -7.5 z"
- style="display:inline;fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.9;fill:none;stroke:#ffffff;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="M 57.25,606.75 53.5,610.5 H 53"
- id="path35403"
- sodipodi:nodetypes="cc"
- transform="translate(-4.0161228,-529.00001)"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_TRIA_DOWN"
- transform="translate(28,550.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect24909"
- width="16"
- height="16"
- x="82"
- y="69" />
- <g
- style="display:inline"
- transform="rotate(-90,157.001,310.9909)"
- id="g11003"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <path
- id="path11005"
- d="m 392.49192,239.48989 -5.00001,4.75 v 0.5 l 5.00001,4.75 h 1 v -10 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient15742-5);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path11007"
- d="m 392.49191,248.23989 v -7.5"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_TRIA_RIGHT"
- transform="translate(27,550.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect24907"
- width="16"
- height="16"
- x="62"
- y="69" />
- <g
- style="display:inline"
- id="g11009"
- transform="matrix(-1,0,0,1,461.01011,-167)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <path
- style="fill:url(#linearGradient15742);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 392.5,239.5 -4.98989,4.74999 v 0.5 L 392.5,249.5 l 1.01011,-1e-5 0.0368,-9.96874 z"
- id="path11011"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient27860);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 392.51011,248.24999 v -7.5 l -4,3.75"
- id="path11013"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_DOTSDOWN"
- transform="translate(444,424.00001)">
- <rect
- y="174"
- x="23"
- height="16"
- width="16"
- id="rect25118"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g25451">
- <g
- id="use25367"
- transform="translate(24.016123,6)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.30000001;stroke-opacity:1;marker:none"
- id="rect25447"
- width="1.0000005"
- height="3.0000005"
- x="6.5000019"
- y="178.50003" />
- <rect
- y="177.5"
- x="5.5"
- height="3"
- width="1"
- id="rect25449"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.30000001;stroke-opacity:1;marker:none" />
- </g>
- <g
- id="use25369"
- transform="translate(28.016123,6)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.30000001;stroke-opacity:1;marker:none"
- id="rect25441"
- width="1.0000005"
- height="3.0000005"
- x="6.5000019"
- y="178.50003" />
- <rect
- y="177.5"
- x="5.5"
- height="3"
- width="1"
- id="rect25443"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.30000001;stroke-opacity:1;marker:none" />
- </g>
- <rect
- y="184.50003"
- x="26.516125"
- height="3.0000005"
- width="1.0000005"
- id="rect25373"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.30000001;stroke-opacity:1;marker:none" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.30000001;stroke-opacity:1;marker:none"
- id="rect25375"
- width="1"
- height="3"
- x="25.516123"
- y="183.5" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_DOTSUP"
- transform="translate(443,424.00001)">
- <rect
- y="174"
- x="3"
- height="16"
- width="16"
- id="rect25116"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g25401">
- <g
- id="use9783"
- transform="translate(4.0161228)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.30000001;stroke-opacity:1;marker:none"
- id="rect25397"
- width="1.0000005"
- height="3.0000005"
- x="6.5000019"
- y="178.50003" />
- <rect
- y="177.5"
- x="5.5"
- height="3"
- width="1"
- id="rect25399"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.30000001;stroke-opacity:1;marker:none" />
- </g>
- <g
- id="use9785"
- transform="translate(8.0161228)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.30000001;stroke-opacity:1;marker:none"
- id="rect25391"
- width="1.0000005"
- height="3.0000005"
- x="6.5000019"
- y="178.50003" />
- <rect
- y="177.5"
- x="5.5"
- height="3"
- width="1"
- id="rect25393"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.30000001;stroke-opacity:1;marker:none" />
- </g>
- <g
- id="g9787"
- transform="translate(0.01612278)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000036;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.30000001;stroke-opacity:1;marker:none"
- id="rect9789"
- width="1.0000005"
- height="3.0000005"
- x="6.5000019"
- y="178.50003" />
- <rect
- y="177.5"
- x="5.5"
- height="3"
- width="1"
- id="rect9791"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.30000001;stroke-opacity:1;marker:none" />
- </g>
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_AUTO"
- transform="translate(93,445.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect25526"
- width="16"
- height="16"
- x="143"
- y="153" />
- <g
- transform="translate(0.01612278)"
- id="g10844"
- style="display:inline">
- <path
- style="fill:url(#linearGradient15699);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 144.5,163.5 h 13 v -1 c 0,-2.25 -0.5,-3 -4,-3 -0.5,-1.25 -1.5,-3 -4,-3 h -1 c -3.75,0 -4,2.25 -4,5 z"
- id="path10846"
- sodipodi:nodetypes="ccscsccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <circle
- style="fill:url(#linearGradient15701);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.46666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="path10848"
- transform="matrix(1.5,0,0,1.5,-73.5,-83.5)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="147"
- cy="165"
- r="1" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="csccc"
- id="path10850"
- d="m 150,157.5 h -1.5 c -3,0 -3,1.5 -3,5 m 10.99996,-0.71441 c 0,-1.60712 5e-5,-1.28559 -2.99996,-1.28559"
- style="fill:none;stroke:url(#linearGradient15703);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(1.5,0,0,1.5,-66.5,-83.5)"
- id="path10852"
- style="fill:url(#linearGradient15705);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.46666667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- cx="147"
- cy="165"
- r="1" />
- </g>
- </g>
- <g
- id="ICON_VIEWZOOM"
- transform="translate(0,128.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect25724"
- width="16"
- height="16"
- x="89"
- y="470" />
- <g
- id="g35249">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path12027"
- d="m 94.5,480.5 1.25,-1.25"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:transform-center-y="-6.245879"
- inkscape:transform-center-x="-6.2091889"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.62898993;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="path12029"
- transform="matrix(-1.4308622,0,0,1.4308687,469.36987,363.18486)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <path
- style="fill:none;stroke:#28170b;stroke-width:3.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 90.863188,484.13807 94.25,480.75"
- id="path12031"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#cccccc;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 94.5,480.5 1.25,-1.25"
- id="path12033"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(-1.4308622,0,0,1.4308687,469.36987,363.18486)"
- id="path35965"
- style="display:inline;opacity:0.5;fill:url(#radialGradient35967);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.55910218;marker:none"
- inkscape:transform-center-x="-6.2091889"
- inkscape:transform-center-y="-6.245879"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <g
- id="g12035"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(1.0005769,0,0,0.9999104,-69.113516,270.01809)">
- <circle
- inkscape:transform-center-y="-4.9844055"
- inkscape:transform-center-x="-4.9755572"
- style="display:inline;fill:url(#linearGradient35488);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient35490);stroke-width:0.87477797;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="path12037"
- transform="matrix(-1.14287,0,0,1.142863,463.9317,115.7853)"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <g
- id="g35307">
- <ellipse
- transform="matrix(1.1162596,0,0,1.1065394,80.948334,-350.49863)"
- id="path35287"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient35492);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient35494);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path35289"
- transform="matrix(-1.087144,-0.2518404,0.2525206,-1.0776772,126.97246,766.619)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- </g>
- <circle
- inkscape:transform-center-y="-6.490455"
- inkscape:transform-center-x="-3.3976162"
- id="path12041"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- transform="matrix(0.993526,0,0,1.026234,103.4315,65.484747)"
- cx="64"
- cy="135"
- r="1" />
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path12043"
- d="m 90.75,484.25 3.5,-3.5"
- style="fill:none;stroke:#a05a2c;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 90.25,484 94,480.25"
- id="path12045"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_WORDWRAP_OFF"
- transform="translate(-206,-205)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect21528"
- width="16"
- height="16"
- x="463"
- y="236" />
- <g
- transform="translate(459.98858,167)"
- style="display:inline"
- id="g14449">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path14451"
- d="M 17.51142,84.5 H 3.522835 L 3.51142,70.5 h 14 z"
- style="fill:url(#linearGradient16063);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path14523"
- style="display:inline;fill:none;stroke:url(#linearGradient16067);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 6.0097,77.5 h 6.00172 m 1,0 h 4 m -6,-2 h 6 m -3,-2 h 3 m -11.00172,0 h 7.00172 m -7.00172,2 h 4.00172"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="cccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:none;stroke:url(#linearGradient16069);stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 16.51142,71.5 h -12 v 12 h 12.000001 z"
- id="path14459"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_WORDWRAP_ON"
- transform="translate(-205,-205)">
- <rect
- y="236"
- x="483"
- height="16"
- width="16"
- id="rect21548"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g21749">
- <g
- transform="translate(479.98859,167)"
- style="display:inline"
- id="g14498">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path14500"
- d="m 17.51141,84.5 h -14 l -1e-7,-14 H 17.492824 l 0.01859,14 z"
- style="fill:url(#linearGradient14511);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:none;stroke:url(#linearGradient14517);stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 16.51141,71.5 h -12 v 12 h 12.000001 z"
- id="path14508"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="cccccccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- d="m 486,246.5 h 7.03916 M 491,248.5 h -5 m 0.0392,-6 h 5 m -5,-2 h 6 m -6,4 h 3"
- style="display:inline;fill:none;stroke:url(#linearGradient21531);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path15300"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_SYNTAX_ON"
- transform="translate(97,5)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect21493"
- width="16"
- height="16"
- x="223"
- y="26" />
- <g
- id="g21465">
- <g
- style="display:inline"
- id="g10969"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="translate(0.1889228,-16)">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g10971"
- transform="matrix(1.083333,0,0,1.083326,-149.75,-207.0817)">
- <g
- id="g10973">
- <path
- sodipodi:nodetypes="ccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path10975"
- d="m 356.53857,243.30784 h -11.07692 v -11.07699 h 11.07692 z"
- style="fill:url(#linearGradient15734);fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:0.92307967px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- style="fill:none;stroke:#ffffff;stroke-width:0.92307913px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 346.38485,242.26935 -1.3e-4,-9.11543 h 9.14632"
- id="path10977"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- id="path10979"
- d="m 227,49 v 1 h 2 v -1 z m 2,1 v 1 h -2 v 1 h 2 v 1 h -2 v 1 h 2 1 v -4 z m -2,3 v -1 h -1 v 1 z"
- style="display:inline;fill:#0055d4;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:nodetypes="cccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 231,47 v 7 h 1 2 v -1 h -2 v -2 h 2 v -1 h -2 v -3 z m 3,4 v 2 h 1 v -2 z"
- id="path10981"
- sodipodi:nodetypes="ccccccccccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g16140"
- style="display:inline"
- transform="translate(219.98859,-43)">
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:url(#linearGradient16150);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 17.51141,84.5 h -14 l -1e-7,-14 H 17.492824 l 0.01859,14 z"
- id="path16142"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path16148"
- d="m 16.51141,71.5 h -12 v 12 h 12.000001 z"
- style="fill:none;stroke:url(#linearGradient16154);stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path16156"
- d="m 227,33 v 1 h 2 v -1 z m 2,1 v 1 h -2 v 1 h 2 v 1 h -2 v 1 h 2 1 v -4 z m -2,3 v -1 h -1 v 1 z"
- style="display:inline;fill:#0055d4;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:nodetypes="cccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 231,31 v 7 h 1 2 v -1 h -2 v -2 h 2 v -1 h -2 v -3 z m 3,4 v 2 h 1 v -2 z"
- id="path16158"
- sodipodi:nodetypes="ccccccccccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_SYNTAX_OFF"
- transform="translate(96.030183,5)">
- <rect
- y="26"
- x="202.96982"
- height="16"
- width="16"
- id="rect21491"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g21479">
- <g
- transform="translate(-19.811077,-16)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g10983"
- style="display:inline">
- <g
- transform="matrix(1.083333,0,0,1.083326,-149.75,-207.0817)"
- id="g10985"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <g
- id="g10987">
- <path
- style="fill:url(#linearGradient15736);fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:0.92307967px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 356.53857,243.30784 h -11.07692 v -11.07699 h 11.07692 z"
- id="path10989"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path10991"
- d="m 346.38485,242.26935 -1.3e-4,-9.11543 h 9.14632"
- style="fill:none;stroke:#ffffff;stroke-width:0.92307913px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- style="display:inline;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 231,47 v 7 h 1 2 v -1 h -2 v -2 h 2 v -1 h -2 v -3 z m 3,4 v 2 h 1 v -2 z m -7,-2 v 1 h 2 v -1 z m 2,1 v 1 h -2 v 1 h 2 v 1 h -2 v 1 h 2 1 v -4 z m -2,3 v -1 h -1 v 1 z"
- id="path10993"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(199.98859,-43)"
- style="display:inline"
- id="g16160">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path16162"
- d="m 17.51141,84.5 h -14 l -1e-7,-14 H 17.492824 l 0.01859,14 z"
- style="fill:url(#linearGradient16170);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:none;stroke:url(#linearGradient16174);stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 16.51141,71.5 h -12 l -1e-6,12 H 16.51141 Z"
- id="path16168"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 211,31 v 7 h 1 2 v -1 h -2 v -2 h 2 v -1 h -2 v -3 z m 3,4 v 2 h 1 v -2 z m -7,-2 v 1 h 2 v -1 z m 2,1 v 1 h -2 v 1 h 2 v 1 h -2 v 1 h 2 1 v -4 z m -2,3 v -1 h -1 v 1 z"
- id="path16178"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_LINENUMBERS_ON"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect21607"
- width="16"
- height="16"
- x="362"
- y="29" />
- <g
- id="g11961">
- <g
- transform="translate(358.98859,-40)"
- style="display:inline"
- id="g14938">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path14940"
- d="m 17.51141,84.5 h -14 l -1e-7,-14 H 17.492824 l 0.01859,14 z"
- style="fill:url(#linearGradient21902);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:none;stroke:url(#linearGradient21904);stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 16.51141,71.5 h -12 v 12 h 12.000001 z"
- id="path14942"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="cccccccccccccccccccccccccccc"
- id="path14947"
- d="m 366,33.03125 v 1 h -1 v 1 h 1 v 2 h 1 v -4 z M 365,39 v 1 h 2.3295 v -1 z m 2,1 v 1 h 1 v -1 z m 0.0594,1 h -1.05938 v 1 h -1 v 1 h 3 v -1 h -1.44062 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- d="m 369,34 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m -4,2 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m -4,3 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m -4,2 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z"
- id="path14953"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- d="m 370,34 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m -4,2 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m -4,3 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m -4,2 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z"
- id="path14955"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_LINENUMBERS_OFF"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect21605"
- width="16"
- height="16"
- x="341"
- y="29" />
- <g
- id="g11953">
- <g
- id="g14924"
- style="display:inline"
- transform="translate(337.98858,-40)">
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:url(#linearGradient21862);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 17.500005,84.5 H 3.51142 l -1e-7,-14 H 17.51142 l -0.01141,14 z"
- id="path14929"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path14933"
- d="m 16.51142,71.5 h -12 v 12 h 12.000001 z"
- style="fill:none;stroke:url(#linearGradient21864);stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g11949">
- <path
- id="path14967"
- d="m 344,34 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m -8,2 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m -8,3 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m -8,2 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path14971"
- d="m 345,34 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m -8,2 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m -8,3 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m -8,2 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- style="display:inline"
- transform="translate(150,389)"
- id="ICON_MOD_CURVE">
- <g
- id="g22274"
- transform="translate(-30)">
- <rect
- ry="0"
- rx="0"
- y="-127"
- x="200"
- height="16"
- width="16"
- id="rect22276"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 204,-114 c 4.5365,0 8.5,-3 8.5,-6 0,-1.75 -1.25,-4 -5.5,-4"
- id="path22282"
- sodipodi:nodetypes="csc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#162d50;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect22278"
- width="2.9998772"
- height="3"
- x="202.50012"
- y="-115.5"
- ry="1.4999387"
- rx="1.4843137" />
- <rect
- rx="1.4999387"
- ry="1.4999387"
- y="-125.5"
- x="205.50012"
- height="3"
- width="2.9998772"
- id="rect22280"
- style="display:inline;overflow:visible;visibility:visible;fill:#162d50;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="csc"
- id="path22284"
- d="m 204,-114 c 4.49647,0 8.5,-3 8.5,-6 0,-1.75 -1.25,-4 -5.5,-4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient24098);stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#afc6e9;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m 205,-115 c -0.66667,0 -1.33332,1e-5 -2,1e-5 0,0.66939 0,1.33877 0,2.00817 0.66668,0 1.33333,-10e-6 2,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path22288"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path22291"
- d="m 208,-125 c -0.65334,0 -1.30668,1e-5 -1.96003,1e-5 0,0.66667 0,1.33332 0,1.99999 0.65335,0 1.30669,-1e-5 1.96003,-1e-5 0,-0.66666 0,-1.33332 0,-1.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#87aade;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 176.5,-123.5 v -1 h 1"
- id="path22293"
- inkscape:connector-curvature="0" />
- <path
- id="path22295"
- d="m 173.5,-113.5 v -1 h 1"
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path22297"
- d="m 176,-113.25657 c -0.33333,0 -0.66667,-1e-5 -1,-1e-5 0,-0.55431 0,-1.1086 0,-1.66292 0.33333,0 0.66667,1e-5 1,1e-5 0,0.55431 0,1.10861 0,1.66292 z"
- style="display:inline;opacity:0.35;fill:#002255;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path22299"
- d="m 179,-122.48792 c -0.32001,0 -0.64002,-1e-5 -0.96003,-1e-5 0,-0.63982 0,-1.27964 0,-1.91948 0.32001,0 0.64002,1e-5 0.96003,1e-5 0,0.63983 0,1.27966 0,1.91948 z"
- style="display:inline;opacity:0.2;fill:#002255;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.5;fill:#00112b;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 176,-113 c -0.33333,0 -0.66667,0 -1,0 0,-0.21055 0,-0.42107 0,-0.63162 0.33333,0 0.66667,0 1,0 0,0.21055 0,0.42107 0,0.63162 z"
- id="path22302"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline"
- id="ICON_MATPLANE"
- transform="translate(-58,-17)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect31205"
- width="16"
- height="16"
- x="63"
- y="48" />
- <g
- id="g9148"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- style="display:inline"
- transform="matrix(1.0003553,0,0,0.9995949,18.983834,-41.953346)">
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:url(#linearGradient15356);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80001998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect9150"
- width="12.995382"
- height="13.003749"
- x="45.5"
- y="91.491928" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:url(#linearGradient15358);stroke-width:1.0000248px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 46.49945,103.49527 V 92.492523 h 10.996287 v 11.002747 z"
- id="path9152"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_MATSPHERE"
- transform="translate(-57,-17)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect31207"
- width="16"
- height="16"
- x="83"
- y="48" />
- <g
- style="display:inline"
- id="g9154"
- transform="matrix(1.1658027,0,0,1.1657997,-59.289717,-204.05607)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path9156"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.23686159;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6969446,0,0,0.6900977,36.918531,141.69345)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.8;fill:url(#linearGradient15360);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path9158"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.6391427,-0.07194179,0.07284933,-0.6344823,204.68584,307.47408)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.5885088,0,0,0.5897133,51.241774,153.48488)"
- style="fill:none;stroke:url(#linearGradient15362);stroke-width:1.45605874;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path9160"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- id="ICON_ALIASED"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect31391"
- width="16"
- height="16"
- x="110"
- y="29" />
- <g
- transform="translate(-73,-123.96875)"
- id="g9974"
- style="display:inline">
- <path
- style="fill:none;stroke:none"
- d="M 186.2503,165.73428 C 185.16882,164.6489 184.5,163.15208 184.5,161.5 c 0,-3.312 2.688,-6 6,-6 1.65758,0 3.15886,0.67328 4.24511,1.76111 z"
- id="path9976"
- sodipodi:nodetypes="csscc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path23601"
- d="m 188,154 v 2 h 6 v -2 z m 6,2 v 2 h 1.96875 v 6 H 194 v 1.96875 h -6 V 164 h -2 v 2 h 2 v 1.96875 h 6 V 166 h 2 v -2 h 1.96875 v -6 H 196 v -2 z m -8,8 v -6 h -2 v 6 z m 0,-6 h 2 v -2 h -2 z"
- style="opacity:0.1;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 188,154 v 2 h 6 v -2 z m 6,2 v 2 h 1.96875 v 6 H 194 v 1.96875 h -6 V 164 h -2 v 2 h 2 v 1.96875 h 6 V 166 h 2 v -2 h 1.96875 v -6 H 196 v -2 z m -8,8 v -6 h -2 v 6 z m 0,-6 h 2 v -2 h -2 z"
- id="path9978"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.8;fill:url(#linearGradient15574);fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 186,158 h 2 v -2 h 6 v 2 h 2 v 6 h -2 v 2 h -6 v -2 h -2 z"
- id="path9980"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccccccccccc"
- id="path23596"
- d="m 186.5,158.46875 h 2 v -2 h 5 v 2 h 2 v 5 h -2 v 2 h -5 v -2 h -2 z"
- style="opacity:0.8;fill:none;stroke:url(#linearGradient23599);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0.5;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_SEQ_LUMA_WAVEFORM"
- transform="translate(-235,4)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect31425"
- width="16"
- height="16"
- x="282"
- y="6" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="translate(0.01612278,22)"
- id="g10456"
- style="display:inline">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path10458"
- d="M 296.49991,-1.4999999 H 283.49983 V -14.499999 h 13.00008 z"
- style="fill:url(#linearGradient15644);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient15646);stroke-width:1.00000036px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 284.50009,-2.5000021 V -13.500009 h 11.00001"
- id="path10460"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path10462"
- style="fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
- d="m 286.42863,-12.4 h -0.84311 m 2.83879,3 h -0.83163 m 2.83056,3 h -0.82626 m 2.78967,1 h -0.80293 m 3.77084,1 h -1.74082"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_CLIPUV_DEHLT"
- transform="translate(18,130)">
- <rect
- y="27"
- x="323"
- height="16"
- width="16"
- id="rect31510"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(0.01612278,-12)"
- id="g10854"
- style="display:inline">
- <rect
- style="display:inline;fill:url(#linearGradient15707);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="rect10856"
- width="12"
- height="12"
- x="324.50003"
- y="41.500015" />
- <circle
- style="display:inline;fill:url(#linearGradient15709);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path10858"
- transform="matrix(1.000048,0,0,0.999998,-0.01591645,12.000064)"
- cx="330.5"
- cy="35.5"
- r="3.5" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:url(#linearGradient15711);stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0.5;stroke-opacity:1"
- d="m 335.50002,42.500013 h -10 v 10 L 335.5,52.5 v -10"
- id="path10860"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <circle
- style="display:inline;fill:none;stroke:url(#linearGradient15713);stroke-width:1.16669464;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="path10862"
- transform="matrix(0.857099,0,0,0.857147,47.22893,17.071296)"
- cx="330.5"
- cy="35.5"
- r="3.5" />
- </g>
- </g>
- <g
- id="ICON_CLIPUV_HLT">
- <g
- style="display:inline;opacity:0.2"
- id="g27524"
- transform="translate(39,130)">
- <rect
- y="27"
- x="323"
- height="16"
- width="16"
- id="rect27526"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(0.01612278,-12)"
- id="g27528"
- style="display:inline">
- <rect
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="rect27530"
- width="12"
- height="12"
- x="324.50003"
- y="41.500015" />
- <circle
- style="display:inline;fill:url(#linearGradient27540);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path27532"
- transform="matrix(1.000048,0,0,0.999998,-0.01591645,12.000064)"
- cx="330.5"
- cy="35.5"
- r="3.5" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;opacity:0.6;fill:none;stroke:url(#linearGradient27542);stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0.5;stroke-opacity:1"
- d="m 335.50002,42.500013 h -10 v 10 L 335.5,52.5 v -10"
- id="path27534"
- sodipodi:nodetypes="ccc" />
- <circle
- style="display:inline;fill:none;stroke:url(#linearGradient27544);stroke-width:1.16669464;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="path27536"
- transform="matrix(0.857099,0,0,0.857147,47.22893,17.071296)"
- cx="330.5"
- cy="35.5"
- r="3.5" />
- </g>
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect31513"
- width="16"
- height="16"
- x="362"
- y="157" />
- <g
- transform="translate(19.016123,130)"
- id="g10864"
- style="display:inline">
- <circle
- transform="matrix(1.142871,0,0,1.142855,-27.218817,-5.0713453)"
- id="path10866"
- style="display:inline;fill:url(#linearGradient15715);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.87499601;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- cx="330.5"
- cy="35.5"
- r="3.5" />
- <circle
- style="display:inline;fill:none;stroke:url(#linearGradient15717);stroke-width:1.16669464;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="path10868"
- transform="matrix(0.857099,0,0,0.857147,67.228993,5.071249)"
- cx="330.5"
- cy="35.5"
- r="3.5" />
- </g>
- </g>
- <g
- id="ICON_SEQ_HISTOGRAM"
- transform="translate(63,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect31549"
- width="16"
- height="16"
- x="26"
- y="8" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:url(#linearGradient31664);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 40.499999,22.499999 H 27.5 V 9.5 h 12.982741 l 0.01726,12.999999 z"
- id="path31555"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccc"
- id="path31559"
- d="M 36.5,11.548223 V 19 Z M 37.5,16 v 3 z m -3,-2 v 5 z m 1,0 v 5 z m -3,1 v 4 z m 6,0 v 4 z m -5,1 v 3 z m -3,1 v 2 z m 9,1.578539 V 19 Z M 31.5,18 v 1 z m -3,-0.52573 V 19 Z m 1,1.087098 V 19 Z"
- style="display:inline;fill:none;stroke:url(#linearGradient31666);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient31672);stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 28.5,19.5 h 11"
- id="path31670"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path31557"
- d="m 39.5,10.500004 h -11 v 11 h 11.000001 z"
- style="fill:none;stroke:url(#linearGradient31668);stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline"
- id="ICON_SEQ_CHROMA_SCOPE"
- transform="translate(-234,4)">
- <rect
- y="6"
- x="302"
- height="16"
- width="16"
- id="rect31427"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(0.01612278,-16)"
- id="g13262"
- style="display:inline">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="translate(20.00009,22)"
- id="g13264">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path13266"
- d="M 296.49991,14.5 H 283.49983 V 1.500001 h 13.00008 z"
- style="fill:url(#linearGradient31646);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient31648);stroke-width:1.00000036px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 284.50009,13.499998 V 2.499991 h 11.00001"
- id="path13268"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path13270"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 310,34 -3.5,-1.5 v -5 l 3.5,-1.5 3.5,1.5 v 5 z"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <g
- id="g13272"
- transform="translate(0,-10)"
- style="stroke-width:1.10000002;stroke-miterlimit:4;stroke-dasharray:none">
- <path
- id="path13274"
- style="display:inline;fill:none;stroke:url(#radialGradient31650);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 310,44 -3.5,-1.5 v -5 l 3.5,-1.5 3.5,1.5 v 5 z"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- d="m 310,44 -3.5,-1.5 v -5 l 3.5,-1.5 3.5,1.5 v 5 z"
- style="display:inline;fill:none;stroke:url(#radialGradient31652);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path13276"
- inkscape:connector-curvature="0" />
- <path
- id="path13278"
- style="display:inline;fill:none;stroke:url(#radialGradient31654);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 310,44 -3.5,-1.5 v -5 l 3.5,-1.5 3.5,1.5 v 5 z"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- d="m 309.98388,44 -3.5,-1.5 v -5 l 3.5,-1.5 3.5,1.5 v 5 z"
- style="display:inline;fill:none;stroke:url(#radialGradient31656);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path13280"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- transform="translate(-21,-418)"
- id="ICON_SEQ_PREVIEW">
- <rect
- y="428"
- x="47"
- height="16"
- width="16"
- id="rect31676"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g31678">
- <rect
- ry="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect31680"
- width="13.016124"
- height="12.953857"
- x="48.499996"
- y="429.54614" />
- <rect
- y="430"
- x="50.016117"
- height="11.046139"
- width="11.000001"
- id="rect31682"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient31694);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00207269;marker:none;enable-background:accumulate"
- ry="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient31696);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 49,430 v 3 h 3 v -3 z m 3,3 v 3 h 3 v -3 z m 3,0 h 3 v -3 h -3 z m 3,0 v 3 h 3 v -3 z m 0,3 h -3 v 3 h 3 z m 0,3 v 3 h 3 v -3 z m -3,0 h -3 v 3 h 3 z m -3,0 v -3 h -3 v 3 z"
- id="path31684"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient31698);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 60.517703,430.5 H 49.499999 v 11 h 11.017704 v -11"
- id="path31686"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_IMAGEFILE"
- transform="translate(0,2)">
- <rect
- y="8"
- x="278"
- height="16"
- width="16"
- id="rect31906"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-64.983874,-102.97791)"
- id="g14768"
- style="display:inline">
- <path
- style="display:inline;fill:url(#linearGradient31932);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="m 348.18876,112.47791 h 8.33334 v 13 h -11 l -1e-5,-10 z"
- id="path14575"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 349,114 v 2 h 2 v -2 z m 2,2 v 2 h 2 v -2 z m 2,0 h 2 v -2 h -2 z m 0,2 v 2 h 2 v -2 z m 0,2 h -2 v 2 h 2 z m 0,2 v 2 h 2 v -2 z m -2,0 h -2 v 2 h 2 z m -2,0 v -2 h -2 v 2 z m 0,-2 h 2 v -2 h -2 z m 0,-2 v -2 h -2 v 2 z"
- id="rect14548"
- inkscape:connector-curvature="0" />
- <path
- d="M -48.500031,260.50809 -46.5,260.5 l -3.1e-5,-1.99191"
- style="display:inline;opacity:0.7;fill:none;stroke:#000000;stroke-width:0.76923829px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter31351)"
- id="path14579"
- sodipodi:nodetypes="ccc"
- transform="matrix(1.2999758,0,0,1.2999988,409.54887,-222.56021)"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;fill:none;stroke:url(#linearGradient31934);stroke-width:0.99999988px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 354.58387,114.50843 -7.05183,-0.0551 0.007,9.11382"
- id="path14581"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 345,116 h 4 v -4 z"
- id="path14583"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- d="m 346.5,117.00001 v 7.5 m 3.5,-11 h 5.5"
- style="display:inline;fill:none;stroke:url(#linearGradient31936);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- id="path14585"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- id="path14587"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 345.5221,114.97791 v 10.5 h 11 v -13 h -8.5 z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_MOD_WAVE"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect31964"
- width="16"
- height="16"
- x="26"
- y="260" />
- <g
- transform="translate(-2322.9523,-570.94199)"
- id="g12799"
- style="display:inline">
- <path
- sodipodi:nodetypes="cczcccc"
- id="path12801"
- d="m 2349.9523,841.94199 c 2.0093,-2.0093 3.5347,-3.43269 5.544,-5.44199 3.25,-3.25 9,-2 9,2 -4.5,-2.5 -7.044,3.94199 -0.544,3.94199 v 1.5 h -14 z"
- style="opacity:0.8;fill:url(#linearGradient38692);fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#0b1728;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 2349.5,842.49627 c 1.9988,-1.99875 3.9535,-4.05552 5.9523,-6.05428 3.25,-3.25 9.044,-1.94199 9.044,2.05801 -4.5,-2.5 -6.544,4.94199 0,4"
- id="path12805"
- sodipodi:nodetypes="cczc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccs"
- id="path12807"
- d="m 2351,842.51381 c 1.67,-1.67002 3.34,-3.34005 5.0101,-5.01008 2.1922,-2.31174 5.9422,-2.81174 7.4422,-0.0617"
- style="fill:none;stroke:url(#radialGradient13900);stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_MOD_SUBSURF"
- transform="translate(0,2)">
- <rect
- y="260"
- x="131"
- height="16"
- width="16"
- id="rect32039"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g13125">
- <g
- id="g12811"
- transform="translate(-70.98388,253.6)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- style="opacity:0.4">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(1.090908,0,0,1.083334,-60.5905,-148.5)"
- id="g12813">
- <path
- sodipodi:nodetypes="ccccc"
- id="path12815"
- d="m 253.9851,154.06144 0.0148,-7.98461 -5.97312,2.67692 c 0,2.37037 -0.0149,8.01803 -0.0149,8.53832 l 5.97323,-3.23063 z"
- style="display:inline;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;fill:#c9c9c9;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 242.06842,154.06144 v -8.21538 l 5.95834,2.90769 v 8.30769 z"
- id="path12817"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path12819"
- d="m 242.06842,146.21529 5.95834,-2.67692 5.95834,2.67692 -5.95834,2.53846 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccccccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path12821"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 209.98388,21.9 -6.5,-3.5 V 9.9 m 6.5,12 6.5,-3.5 V 9.9 m 0,0 -6.5,-2.75 -6.5,2.75"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline"
- id="g12823"
- transform="matrix(0.668332,0,0,0.668394,53.64412,108.1139)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path12825"
- style="fill:url(#linearGradient13112);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:1.60044813;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.8412876,0,0,0.8414582,16.661932,139.91818)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.654253,0,0,0.6543912,41.350498,161.99208)"
- style="fill:none;stroke:url(#linearGradient13114);stroke-width:2.28663301;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path27909"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- </g>
- <g
- id="ICON_FACESEL_HLT"
- transform="translate(-1e-5,127)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect12049"
- width="16"
- height="16"
- x="47.000004"
- y="387" />
- <g
- transform="translate(-336.01611,233)"
- id="g22979">
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 391.01611,155 -6.00001,2.125 v 7.65625 l 6.00001,3.21875 6,-3.21875 V 157.125 Z"
- id="path12053"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path12063"
- d="m 397.01609,164.76992 v -7.6298 l -6,-2.14012 c 0,2.58362 8.3e-4,12.47266 8.3e-4,13.03976 z"
- style="fill:url(#linearGradient17712);fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path12065"
- d="m 385.01609,164.75 v -7.5 l 6,-2.25 c 0,2.37037 0,12.47971 0,13 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99989706;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path12067"
- d="m 385.01658,157.14012 6.00034,-2.17997 5.99917,2.17997 -5.99975,2.72493 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccc"
- id="path12835"
- d="m 385.01612,158 v 2 h 2 v -2 z m 2,2 v 2 h 2 v -2 z m 2,0 h 2 v -0.5 l -2,-0.5 z m 0,2 v 2 h 2 v -2 z m 0,2 h -2 v 2 h 2 z m 0,2 v 1 l 2,1 v -2 z m -2,-2 v -2 h -2 v 2 z"
- style="display:inline;fill:#c81700;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient17714);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 385.51625,164.52217 v -7.03525 l 5.49627,-2.01007 5.49628,2.01007 v 7.03525 l -5.49628,3.01511 z"
- id="path12069"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_SPACE3"
- transform="translate(19,-17)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect23020"
- width="16"
- height="16"
- x="343"
- y="237" />
- <g
- id="g9430"
- transform="translate(19.991123,0.02506982)"
- style="display:inline">
- <path
- sodipodi:nodetypes="ccccc"
- id="path9432"
- d="m 330.5,240.5 5,5 -5,5 -5,-5 z"
- style="fill:url(#linearGradient15436);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.85000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- d="m 327,245.5 3.5,-3.5"
- id="path9434"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_SPACE2"
- transform="translate(18.067322,-17)">
- <rect
- y="237"
- x="322.93268"
- height="16"
- width="16"
- id="rect23018"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- transform="translate(0.04112278,0.02506982)"
- id="g12077">
- <path
- style="fill:url(#linearGradient52027);fill-opacity:1;fill-rule:nonzero;stroke:#341b00;stroke-width:0.85000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- d="m 330.5,240.5 5,5 -5,5 -5,-5 z"
- id="path12079"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path12081"
- d="m 327,245.5 3.5,-3.5"
- style="fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_MARKER_HLT"
- transform="translate(118,4)">
- <rect
- y="216"
- x="181"
- height="16"
- width="16"
- id="rect23010"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(0,1,1,0,-56.06114,-164)"
- id="g13176"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- style="display:inline">
- <path
- id="path13178"
- d="m 392.53018,240.5312 h -1 l -4,3.9688 4,4.0312 h 1 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:none;stroke:#ff982a;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:none;stroke:#ff982a;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 392.5,240.5312 h -1 l -4,3.9688 4,4.0312 h 1 z"
- id="path13180"
- inkscape:connector-curvature="0" />
- <path
- id="path13182"
- d="m 392.5,240.5312 h -1 l -4,3.9688 4,4.0312 h 1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient52023);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient13639);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path13184"
- d="m 389,244.5 2.5,-2.5"
- style="opacity:0.9;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_PMARKER_ACT"
- transform="translate(35,4.96982)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect23012"
- width="16"
- height="16"
- x="201"
- y="215.03018" />
- <g
- transform="matrix(0,1,1,0,-35.015077,-166)"
- id="g13216"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- style="display:inline">
- <path
- id="path13218"
- d="m 395.53018,243.5312 -4,-4 -9,4 9,4 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:none;stroke:#ff982a;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:none;stroke:#ff982a;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 395.5,243.5312 -4,-4 -9,4 9,4 z"
- id="path13220"
- inkscape:connector-curvature="0" />
- <path
- id="path13222"
- d="m 391.5,239.5312 -9,4 9,4 4,-4 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient52025);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient14661);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path13224"
- d="m 385,243.5312 6.25,-2.75"
- style="opacity:0.85;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_PMARKER_SEL"
- transform="translate(36,4.96982)">
- <rect
- y="215.03018"
- x="221"
- height="16"
- width="16"
- id="rect23014"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g13226"
- transform="matrix(0,1,1,0,-15.015077,-166)">
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:none;stroke:#ff982a;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 395.53018,243.5312 -4,-4 -9,4 9,4 z"
- id="path13228"
- inkscape:connector-curvature="0" />
- <path
- id="path13230"
- d="m 395.53018,243.5312 -4,-4 -9,4 9,4 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:none;stroke:#ff982a;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient15993);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient15995);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 391.5,239.5312 -9,4 9,4 4,-4 z"
- id="path13232"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.85;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 385,243.5312 6.25,-2.75"
- id="path13234"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_PMARKER"
- transform="translate(37,5)">
- <rect
- y="215"
- x="241"
- height="16"
- width="16"
- id="rect23016"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(0,1,1,0,4.9849228,-166)"
- id="g13236"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- style="display:inline">
- <path
- id="path13238"
- d="m 391.5,239.5312 -9,4 9,4 4,-4 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient15997);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path13240"
- d="m 385,243.5312 6.25,-2.75"
- style="opacity:0.85;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_MARKER"
- transform="translate(-81,46)">
- <rect
- y="174"
- x="401"
- height="16"
- width="16"
- id="rect23112"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g11747"
- transform="matrix(0,1,1,0,163.98492,-206)">
- <path
- sodipodi:nodetypes="cccccc"
- style="fill:url(#linearGradient15854);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 392.5,240.5312 h -1 l -4,3.9688 4,4.0312 h 1 z"
- id="path11749"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 389,244.5 2.5,-2.5"
- id="path11751"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_FF"
- transform="translate(-316,25)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect23130"
- width="16"
- height="16"
- x="364"
- y="195" />
- <g
- transform="translate(0.01612278)"
- id="g10790"
- style="display:inline">
- <path
- style="fill:url(#linearGradient15681);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 364.48388,198.5 v 9 h 1 l 5,-3.75 v 3.75 h 1 L 376.5,203.78125 V 207.5 h 2 v -9 h -2 v 3.71875 L 371.48388,198.5 h -1 v 3.75 l -5,-3.75 z"
- id="path10792"
- sodipodi:nodetypes="ccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path10794"
- d="m 365.48388,206.5 v -6.75 l 4.25,3.25"
- style="fill:none;stroke:url(#linearGradient11764);stroke-width:0.99999952px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient11762);stroke-width:0.99999952px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 371.48388,206.5 v -6.75 l 4.5,3.25"
- id="path10796"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 377.23388,206.75 0.0161,-7.5"
- id="path10798"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path11760"
- d="m 377.98388,200 h -1.25 v -1 h 1.25 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_REW"
- transform="translate(-315.95126,25)">
- <rect
- y="195"
- x="382.95126"
- height="16"
- width="16"
- id="rect23132"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(0.01597308,0.03124949)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g10800"
- style="display:inline">
- <g
- id="g10802"
- transform="matrix(-1,0,0,1,762.9688,2.086163e-7)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <path
- style="fill:url(#linearGradient15683);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 365.53351,198.46875 h -1 v 9 h 1 l 5,-3.75 v 3.75755 h 1 l 5.00539,-3.71875 v 3.71875 h 1.99461 v -9 h -1.99461 v 3.71875 l -5.00539,-3.71875 h -1 v 3.74245 z"
- id="path10804"
- sodipodi:nodetypes="ccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path10806"
- d="m 369.28351,202.71875 -3.5,-2.75"
- style="fill:none;stroke:#ffffff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 375.28351,202.71875 -3.5,-2.75"
- id="path10808"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path10986"
- d="m 377.03351,199.9763 h 1.25 v -1 h -1.25 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="cc"
- id="path10810"
- d="m 385.18529,206.7263 v -7.5"
- style="fill:none;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_PLAY"
- transform="translate(-317,25)">
- <rect
- y="195"
- x="343"
- height="16"
- width="16"
- id="rect23128"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- id="g10812"
- transform="matrix(-2.196282,0,0,1.316799,1208.5661,-118.9575)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37396-1);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.58802557px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 392.96689,239.5639 h -0.56915 l -4.43932,4.36665 v 1.13912 l 4.43932,4.36665 h 0.56915 z"
- id="path10814"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient11766);stroke-width:0.58802563px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 392.51157,248.2972 v -7.97389 l -4.09783,3.98695"
- id="path10816"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_PAUSE"
- transform="translate(-194,25)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect23134"
- width="16"
- height="16"
- x="283"
- y="195" />
- <g
- transform="translate(0.01612278)"
- id="g10818"
- style="display:inline">
- <g
- id="g10820"
- transform="translate(0,8)">
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- ry="1.9320945"
- rx="0"
- y="286.5"
- x="189.49994"
- height="3"
- width="11.000029"
- id="rect10822"
- style="fill:url(#linearGradient15687);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0,1,1,0,0,0)" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path10824"
- d="m 287.5,199.27782 v -8.77775 l 1,-7e-5"
- style="fill:none;stroke:url(#linearGradient15689);stroke-width:1.00000012px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(6,8)"
- id="g10826">
- <rect
- transform="matrix(0,1,1,0,0,0)"
- style="fill:url(#linearGradient15691);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect10828"
- width="11.000029"
- height="3"
- x="189.49994"
- y="286.5"
- rx="0"
- ry="1.9320945"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- sodipodi:nodetypes="ccc"
- style="fill:none;stroke:url(#linearGradient15693);stroke-width:1.00000012px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 287.5,199.27782 v -8.77775 l 1,-7e-5"
- id="path10830"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_REC"
- transform="translate(-318,25)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect23126"
- width="16"
- height="16"
- x="323"
- y="195" />
- <g
- style="display:inline"
- id="g11898"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.714947,0,0,0.714947,237.35342,27.84315)">
- <g
- style="display:inline"
- id="g11900"
- transform="matrix(0.927848,0,0,0.916217,-28.19594,40.73172)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path11903"
- style="fill:url(#linearGradient13543);fill-opacity:1;fill-rule:nonzero;stroke:#552200;stroke-width:1.77777624;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.847956,0,0,0.858716,59.65221,121.6111)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- transform="matrix(0.784039,0,0,0.779055,-3.508124,71.29625)"
- id="g11905"
- style="display:inline;fill:none;stroke:url(#linearGradient15878);stroke-width:1.65010214;stroke-opacity:1">
- <circle
- transform="matrix(0.780492,0,0,0.786646,68.5413,130.1431)"
- style="fill:none;stroke:url(#linearGradient13545);stroke-width:2.28401804;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path11907"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- </g>
- <g
- id="ICON_NEXT_KEYFRAME">
- <rect
- y="220"
- x="131"
- height="16"
- width="16"
- id="rect23008"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- transform="translate(-71.046377,45.90625)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g11015">
- <path
- style="fill:url(#linearGradient15744);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 205.54638,177.59375 h -1 v 9 h 1 l 5,-3.75 v 3.75 h 1 l 5,-3.75 v -1.5 l -5,-3.75 h -1 v 3.75 z"
- id="path11017"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path11019"
- d="m 205.54638,185.34375 v -6.5 l 4.25,3.25"
- style="fill:none;stroke:url(#linearGradient10982);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient10984);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 211.54638,185.34375 v -6.5 l 4,3"
- id="path11021"
- sodipodi:nodetypes="ccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_PREV_KEYFRAME"
- transform="translate(-74,46)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect23226"
- width="16"
- height="16"
- x="184"
- y="174" />
- <g
- style="display:inline"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(-1,0,0,1,402.07862,-0.09375)"
- id="g11023">
- <path
- id="path11025"
- d="m 205.57862,177.59375 h -1 v 9 h 1 l 5,-3.75 v 3.75 h 1 l 5,-3.75 v -1.5 l -5,-3.75 h -1 v 3.75 z"
- style="fill:url(#linearGradient15746);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 209.57862,181.84375 -4,-3"
- id="path11027"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path11029"
- d="m 215.57862,181.84375 -4,-3"
- style="fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_ANTIALIASED">
- <rect
- y="31"
- x="131"
- height="16"
- width="16"
- id="rect10527"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(1.1658027,0,0,1.1657997,-11.289717,-221.05607)"
- id="g10530"
- style="display:inline">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path23603"
- style="opacity:0.1;fill:none;stroke:#ffffff;stroke-width:5.47410154;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.629932,0,0,0.6236653,45.764188,149.53247)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.629932,0,0,0.6236653,45.764188,149.53247)"
- style="fill:none;stroke:#000000;stroke-width:2.25806689;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path10532"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <g
- id="g11317">
- <circle
- transform="matrix(-0.5326189,-0.05995148,0.06070777,-0.5287352,192.0574,293.4132)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path11331"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:url(#linearGradient11333);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.6060524;marker:none;enable-background:accumulate"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.4812861,0,0,0.4822895,65.395173,166.1609)"
- style="fill:none;stroke:url(#linearGradient10540);stroke-width:1.78041101;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path10536"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- </g>
- <g
- id="ICON_MOD_DISPLACE"
- transform="translate(0,2)">
- <rect
- y="260"
- x="-315"
- height="16"
- width="16"
- id="rect16267"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- transform="scale(-1,1)" />
- <g
- id="g28079">
- <g
- id="g51539"
- style="opacity:0.4">
- <path
- id="path51537"
- d="m 300.5,270.5 5,4 v 1 h 2 v -1 l 6,-4 h 1 v -2 h -2 v 1 h -11 v -1 h -2 v 2 z"
- style="fill:#ffffff;fill-opacity:0.70588235;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccccccccccc"
- d="m 299.5,268.5 v 2 l 2,10e-6 v -2 z m 13,0 v 2 l 2,10e-6 v -2 z m -7,4.99999 v 2 l 2,10e-6 v -2 z m 7,-3.99999 h -11 m -0.75,1 4.75,3.878 m 2.08359,0.122 5.66641,-4"
- style="display:inline;fill:none;stroke:url(#linearGradient28077);stroke-width:0.99999952;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="path16283"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g28004"
- transform="translate(501,-139)">
- <path
- id="path16269"
- d="m -200,401 h 12 l -6.4,7.99999 z"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#162d50;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path16271"
- d="M -199.75,401 H -188 l -6.5,7.99999 z"
- style="fill:url(#linearGradient28057);fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="cccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path16273"
- d="m -189.5,401.5 h -9.25 l 4.25,6.5"
- style="display:inline;opacity:0.87999998;fill:none;stroke:url(#linearGradient22970);stroke-width:1.00000036px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="rect16275"
- width="2.0172491"
- height="2.0328345"
- x="-201.51724"
- y="399.46716" />
- <rect
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="rect16285"
- width="2.0172396"
- height="2.0000157"
- x="-195.5"
- y="408.49997" />
- <rect
- y="399.49997"
- x="-188.51724"
- height="2.0000157"
- width="2.0172396"
- id="rect16287"
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1" />
- </g>
- </g>
- </g>
- <g
- id="ICON_MOD_UVPROJECT"
- transform="translate(0,-18.999939)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect28314"
- width="16"
- height="16"
- x="-293.99997"
- y="280.99994"
- transform="scale(-1,1)" />
- <g
- id="g28424">
- <g
- id="g28320"
- transform="translate(318.99999,17.49994)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient24395);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -33,272.25 v -7 l 6,2.75 v 7.25 z"
- id="path28322"
- inkscape:connector-curvature="0" />
- <path
- id="path28324"
- d="m -33,272.25 v -7 l 6,2.75 v 7.25 z"
- style="fill:url(#linearGradient28532);fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path28326"
- d="m -27.25,274.75 v -6.5 l -5.5,-2.5 V 272"
- style="display:inline;fill:none;stroke:url(#linearGradient28530);stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g28414"
- style="opacity:0.8"
- transform="translate(0.25,0.25)">
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 280,285.25 5.5,-2.5"
- id="path28410"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path28376"
- d="m 280,285.25 5.5,-2.5"
- style="display:inline;fill:none;stroke:#ffc655;stroke-width:1px;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="opacity:0.6"
- id="g28418"
- transform="translate(0,-7.5)">
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 286.5,296 5.5,-3"
- id="path28420"
- inkscape:connector-curvature="0" />
- <path
- id="path28422"
- d="m 286.5,296 5.5,-3"
- style="display:inline;fill:#ff8080;fill-rule:evenodd;stroke:#ffc655;stroke-width:1px;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:none;stroke:#0b1728;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 279.99999,292.9999 v -7 l 6,2.75004 v 7.25 z"
- id="path28328"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <g
- id="g28402"
- style="opacity:0.8">
- <path
- id="path28398"
- d="m 286.5,296 5.5,-3"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;fill:#ff8080;fill-rule:evenodd;stroke:#ffc655;stroke-width:1px;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1"
- d="m 286.5,296 5.5,-3"
- id="path28374"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-161.00001,168.99994)"
- id="g28338">
- <g
- id="g28340">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path28342"
- d="m 441,123.99996 v -7 l 6,2.75004 V 127 Z"
- style="display:inline;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:#162d50;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path28344"
- d="m 441.00001,124.00006 v -7 l 6,2.74994 c 0,2.37037 0,6.72971 0,7.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient28474);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.09488797;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#22467e;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 441,117 v 2.25 h 2 V 118 Z m 2,2 v 2 h 2 v -2 z m 2,2 v 2 h 2 v -2 z m 0,2 h -2 v 2 h 2 z m 0,2 v 1.25 l 2,1 V 125 Z m -2,-2 v -2 h -2 v 2 z"
- id="path28346"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="cccc"
- id="path28348"
- d="M 446.75,126.5 V 120 l -5.5,-2.5 v 6.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient28528);stroke-width:0.75;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- transform="translate(-537,592)"
- id="ICON_OUTLINER_DATA_MESH"
- style="display:inline">
- <rect
- y="-183"
- x="563"
- height="16"
- width="16"
- id="rect12620"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g12622">
- <g
- transform="translate(476.04566,-283.51773)"
- id="g12624"
- style="opacity:0.7">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#1a1a1a;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 89.95451,104.01774 5,9.5 5,-9.5 z"
- id="path12626"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path12628"
- d="m 89.95451,103.98095 5,9.5 5,-9.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#cccccc;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect12630"
- width="2.9998772"
- height="3"
- x="574.50031"
- y="-181.49998"
- ry="1.4999386"
- rx="1.4999386" />
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="-181.49998"
- x="564.50043"
- height="3"
- width="2.9998772"
- id="rect12632"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect12634"
- width="2.9998772"
- height="3"
- x="569.5"
- y="-171.5"
- ry="1.4999386"
- rx="1.4999386" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path12636"
- d="m 577.00046,-180.99998 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 572.00029,-170.99999 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path12638"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 567.00059,-180.99998 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path12640"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_OUTLINER_OB_MESH">
- <g
- style="display:inline"
- id="g12564"
- transform="translate(-517,612.99998)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect12566"
- width="16"
- height="16"
- x="543"
- y="-183" />
- <g
- id="g12568">
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="-181.49998"
- x="554.50031"
- height="3"
- width="2.9998772"
- id="rect12570"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#2b1600;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:#2b1600;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 546.00017,-179.49999 5,9.5 5,-9.5 z"
- id="path12572"
- sodipodi:nodetypes="cccc" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#2b1600;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect12574"
- width="2.9998772"
- height="3"
- x="544.50043"
- y="-181.49998"
- ry="1.4999386"
- rx="1.4999386" />
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="-171.5"
- x="549.5"
- height="3"
- width="2.9998772"
- id="rect12576"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#2b1600;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path12578"
- d="m 546.00017,-179.53678 5,9.5 5,-9.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffad55;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:#ffca91;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 557.00046,-180.99998 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path12580"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path12582"
- d="m 552.00029,-170.99999 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffca91;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path12584"
- d="m 547.00059,-180.99998 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffca91;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient12602);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 546.00017,-179.53678 5,9.5 5,-9.5 z"
- id="path12586"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- id="path12588"
- d="m 555.5,-179.5 v -1 h 1"
- style="display:inline;opacity:0.8;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;opacity:0.8;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 545.5,-179.5 v -1 h 1"
- id="path12590" />
- <path
- inkscape:connector-curvature="0"
- id="path12592"
- d="m 550.5,-169.5 v -1 h 1"
- style="display:inline;opacity:0.8;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path12594"
- d="m 555,-180.34409 -0.96003,1e-5 v 2.34418 l 2.21003,-1e-4 0.36569,-1 H 555 Z"
- style="display:inline;opacity:0.2;fill:#964e00;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path12596"
- d="m 552,-172 c -0.65334,0 -1.30669,1e-5 -1.96003,1e-5 0,0.33321 0,0.66641 0,0.99963 0.65334,0 1.30669,0 1.96003,0 0,-0.33322 0,-0.66643 0,-0.99964 z"
- style="display:inline;opacity:0.5;fill:#964e00;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#964e00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m 547.03997,-180.34409 0.96003,1e-5 v 2.34418 L 547.03997,-179 Z"
- id="path12598"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path12600"
- d="m 545.65591,-179 1e-5,0.96003 h 2.34418 L 547,-179 Z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#964e00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <rect
- y="-446"
- x="26"
- height="16"
- width="16"
- id="rect12777"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- transform="scale(1,-1)" />
- </g>
- <g
- id="ICON_OUTLINER_OB_SURFACE"
- transform="translate(-21,128)">
- <rect
- y="302"
- x="-231"
- height="16"
- width="16"
- id="rect12012"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- transform="scale(-1,1)" />
- <g
- id="g12045">
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#552200;fill-opacity:1;fill-rule:evenodd;stroke:#2b1600;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 218,313.25 c -0.99997,-6.5 5.99997,-2.75 4.99994,-9.25 l 5.00003,2 c 1,7 -6,2 -5,10 z"
- id="path12014"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path12016"
- d="m 218,313.25 c -0.99997,-6.5 5.99997,-3.25 4.99994,-9.25 l 5.00003,2 c 1,7 -6,2 -5,10 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.95;fill:#ff9f37;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:url(#radialGradient12116);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.88812488px;marker:none;enable-background:accumulate"
- d="m 218,313.25 c -0.99997,-6.5 5.99997,-3.25 4.99994,-9.25 l 5.00003,2 c 1,7 -6,2 -5,10 z"
- id="path12020"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path12018"
- d="m 218,313.25 c -0.99997,-6.5 5.99997,-3.25 4.99994,-9.25 l 5.00003,2 c 1,7 -6,2 -5,10 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#linearGradient12114);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.88812488px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:none;stroke:url(#linearGradient12118);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 223.24994,304.5 4.25003,1.75 c 1,5.75 -5.50003,2 -5.08025,8.84783 l -4.04773,-2.23212"
- id="path12022"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path12024"
- d="m 223.24994,304.5 4.25003,1.75"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_OUTLINER_DATA_SURFACE"
- transform="translate(-20.999998,128)">
- <rect
- transform="scale(-1,1)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect12147"
- width="16.000032"
- height="16"
- x="-231.00003"
- y="281" />
- <g
- transform="translate(235.00016,-1)"
- id="g12149">
- <g
- id="g12151"
- transform="translate(-376,510)"
- style="opacity:0.8">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path12153"
- d="m 358.99997,-216.75 c -0.99997,-6.5 6.00003,-2.75 5,-9.25 L 369,-224 c 1,7 -6,2 -5,10 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#1a1a1a;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="M 358.99997,-216.75 C 358,-223.25 365,-220 363.99997,-226 L 369,-224 c 1,7 -6,2 -5,10 z"
- id="path12155"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#linearGradient12213);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.88812488px;marker:none;enable-background:accumulate"
- d="M 358.99997,-216.75 C 358,-223.25 365,-220 363.99997,-226 L 369,-224 c 1,7 -6,2 -5,10 z"
- id="path12157"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path12159"
- d="M 358.99997,-216.75 C 358,-223.25 365,-220 363.99997,-226 L 369,-224 c 1,7 -6,2 -5,10 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:url(#radialGradient12215);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.88812488px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path12161"
- d="m 364.24984,-225.5 4.25016,1.75 c 1,5.75 -5.50003,2 -5.08381,8.85761 l -4.04561,-2.26888"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient12217);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 364.24997,-225.5 4.25003,1.75"
- id="path12163"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-399.2499,383.75)"
- id="g12165">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect12167"
- width="2.9998772"
- height="3"
- x="391.75"
- y="-99.25"
- ry="1.4999387"
- rx="1.4999387" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m 394.24987,-98.75 c -0.66667,0 -1.33332,1e-5 -2,1e-5 0,0.66939 0,1.33877 0,2.00817 0.66668,0 1.33333,-10e-6 2,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path12169"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g12171"
- transform="translate(-406.2499,380.75)">
- <rect
- rx="1.4999387"
- ry="1.4999387"
- y="-98.25"
- x="392.74988"
- height="3"
- width="2.9998772"
- id="rect12173"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path12175"
- d="m 395.24974,-97.75 c -0.66667,0 -1.33332,1e-5 -2,1e-5 0,0.666663 0,1.333317 0,1.99999 0.66668,0 1.33333,-1e-5 2,-1e-5 0,-0.666663 0,-1.333327 0,-1.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m -11.00003,286 c -0.66668,0 -1.33332,0 -2,0 0,-0.33334 0,-0.66666 0,-1 0.66668,0 1.33332,0 2,0 0,0.33334 0,0.66667 0,1 z"
- id="path12177"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path12179"
- d="m -7.00003,285.53933 c -0.33334,0 -0.66666,10e-6 -1,10e-6 0,0.82281 0,1.64561 0,2.46844 0.33334,0 0.66666,-1e-5 1,-1e-5 0,-0.82282 0,-1.64562 0,-2.46844 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path12187"
- d="m -9.972188,286 c -0.342621,0 -0.685221,0 -1.027842,0 0,-0.66873 0,-1.33742 0,-2.00616 0.342621,0 0.685221,0 1.027842,0 0,0.66874 0,1.33745 0,2.00616 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m -6.000162,287 c -0.33334,0 -0.66666,0 -1,0 0,0.33428 0,0.66856 0,1.00284 0.33334,0 0.66666,0 1,0 0,-0.33428 0,-0.66856 0,-1.00284 z"
- id="path12239"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_MOD_ARRAY"
- transform="translate(0,2)">
- <rect
- y="260"
- x="257"
- height="16"
- width="16"
- id="rect28219"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999875;marker:none;enable-background:accumulate" />
- <g
- id="g24279">
- <rect
- transform="skewY(3.0125038e-4)"
- y="261.49863"
- x="258.5"
- height="7.007431"
- width="6.9999733"
- id="rect28121"
- style="display:inline;fill:url(#linearGradient24272);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <g
- id="g12274"
- transform="translate(6.2265309e-7,0.00746971)">
- <g
- style="opacity:0.4"
- id="g11480"
- transform="matrix(1,0,0,-0.985055,81.000076,281.63418)">
- <rect
- transform="matrix(1,-5.3375811e-6,0,-1,0,0)"
- y="-14.357183"
- x="183.49992"
- height="7.1213336"
- width="7.000011"
- id="rect11482"
- style="display:inline;fill:url(#linearGradient12305);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00755596;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- style="opacity:0.8;fill:none;stroke:#ffffff;stroke-width:1.00755763px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 184.49992,8.2651727 v 5.0306663 l 5,0.04519"
- id="path11484"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(1,0,0,-0.985055,78.000075,278.62671)"
- id="g11472">
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;fill:url(#linearGradient12307);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.90680158;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- id="rect11474"
- width="6.9999948"
- height="7.1137514"
- x="183.49992"
- y="-14.349599"
- transform="matrix(1,-5.3375811e-6,0,-1,0,0)" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path11476"
- d="m 184.49993,8.3103653 -1e-5,5.0230827 h 5"
- style="opacity:0.8;fill:none;stroke:#ffffff;stroke-width:1.00755763px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;fill:url(#linearGradient24277);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- id="rect24275"
- width="6.8437233"
- height="6.8198147"
- x="258.65625"
- y="261.68613"
- transform="skewY(3.0125038e-4)" />
- <path
- sodipodi:nodetypes="ccccc"
- style="opacity:0.8;fill:none;stroke:url(#linearGradient24268);stroke-width:1.00000036px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 259.5,267.5 v -5 h 5 v 5 z"
- id="path28123"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path12295"
- d="m 266.5,265.5 v 3.94801 h -4"
- style="display:inline;opacity:0.2;fill:none;stroke:#162d50;stroke-width:1.00000036px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_FILTER">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffaaaa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- id="rect11420"
- width="16"
- height="16"
- x="257"
- y="73"
- rx="0.80014729"
- ry="0" />
- <g
- transform="translate(-147,2)"
- id="g16042">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc"
- id="path11422"
- d="m 412,73.5 c -4.5,0 -7.25,0.75 -5.75,2.5 l 4.25,4.5 v 6.25 l 3,-2 V 80.5 c 1.48333,-1.72541 2.75638,-2.81017 4.25,-4.5 1.5,-1.75 -1.25,-2.5 -5.75,-2.5 z"
- style="fill:url(#linearGradient16039);fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="csssc"
- id="path11424"
- d="m 418.24999,74.499997 c -0.005,1.49998 -1.49999,2.000009 -6.25,2.000009 -4.74999,0 -6.25738,-0.500029 -6.24999,-2.000009 0.005,-1.000014 1.5,-1.999986 6.24999,-1.999986 4.75001,0 6.24506,0.999972 6.25,1.999986 z"
- style="fill:url(#radialGradient16034);fill-opacity:1;stroke:url(#linearGradient16036);stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" />
- <path
- inkscape:connector-curvature="0"
- style="fill:url(#linearGradient16031);fill-rule:evenodd;stroke:none"
- d="m 410.89062,80.47656 v 5.75 l 2.20704,-1.585938 V 80.47656 h -0.40829 z"
- id="path11426"
- sodipodi:nodetypes="cccccc" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.15;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 412.5,85.25 V 81"
- id="path11428"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="csc"
- id="path12224"
- d="m 406.5,75 c 0,-1.75 2.5,-1.5 5.5,-1.49999 3,1e-5 5.5,-0.25001 5.5,1.25001"
- style="fill:none;stroke:#cccccc;stroke-width:0.99999988;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient16027);stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
- d="m 417.49999,74.50002 c 10e-6,1.74998 -1.4838,1.99999 -5.50001,1.99999 -4.01617,0 -5.49583,-0.50001 -5.49999,-1.99999 -0.004,-1.50002 1.48382,-2.00001 5.49999,-2.00001 4.01621,0 5.49583,0.49999 5.50001,2.00001 z"
- id="path12211"
- sodipodi:nodetypes="csssc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path12238"
- d="m 411.27412,80.5 h 2.13816"
- style="opacity:0.15;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
- </g>
- </g>
- <g
- id="ICON_OUTLINER_OB_FONT"
- transform="translate(10.000031,192.5)"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Pulpit\Browser icons ver 1\font_file SMALL.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- style="display:inline">
- <rect
- style="display:inline;opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect17377"
- width="16"
- height="16"
- x="162.99997"
- y="237.5" />
- <g
- transform="translate(73,-319.5)"
- id="g17379"
- style="display:inline;fill:#ffcc00;stroke:#000000;stroke-width:1.5;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none">
- <path
- style="fill:none;stroke:#2b1600;stroke-width:1.20000005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -169,233 v 1 h 1 v 10 h -1 v 1 h 4 v -1 h -1 v -4 h 3 v 1 h 1 v -3 h -1 v 1 h -3 v -5 h 5 v 1 h 1 v -2 h -8 z"
- transform="translate(262.99997,326)"
- id="rect17381"
- sodipodi:nodetypes="cccccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;fill:#ffcc00"
- id="g17395"
- transform="translate(73,-319.5)">
- <path
- style="fill:url(#linearGradient13699)"
- d="m -169,233 v 1 h 1 v 10 h -1 v 1 h 4 v -1 h -1 v -4 h 3 v 1 h 1 v -3 h -1 v 1 h -3 v -5 h 5 v 1 h 1 v -2 h -8 z"
- id="rect17397"
- sodipodi:nodetypes="cccccccccccccccccccccccc"
- transform="translate(262.99997,326)"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;opacity:0.85;fill:#ffffff"
- d="m 198,304 v 1 h 0.5 v -1 z m 1,1 v 10 h 0.65625 v -10 z m 7,0 v 1 h 0.5 v -1 z m -2,4 v 1 h 0.5 v -1 z m 0,2 v 1 h 0.5 v -1 z m -6,4 v 1 h 0.5 v -1 z"
- id="path17411"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccc"
- transform="translate(-31.000031,-64.5)"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_SCULPTMODE_HLT"
- transform="translate(289,331.00001)">
- <rect
- y="183"
- x="-158"
- height="16"
- width="16"
- id="rect14146"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(36)"
- id="g14148">
- <path
- sodipodi:nodetypes="cc"
- id="path14151"
- d="m -187,192 4,-4"
- style="fill:none;stroke:#162d50;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- d="m -191,198 0.76562,0.21876 L -185.5,193.5 v -3 h -3 l -4,4 -0.75,0.75 0.25,0.75 z"
- style="fill:url(#linearGradient14167);fill-opacity:1;fill-rule:evenodd;stroke:#162d50;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path14153"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path14155"
- d="m -190.5,197.5 -2,-2"
- style="opacity:0.8;fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccccc"
- id="path14157"
- d="m -179.48388,187.51562 c 2.75,-1.75 -1.25,-5.75 -3,-3 L -183,186.5 l -1.48388,0.0156 -0.26612,0.73438 -0.73388,0.26562 L -184.5,187.5 v 1 l 1,1 h 1 l 0.0161,1.01562 0.23388,-0.76562 0.76612,-0.23438 L -181.5,188 Z"
- style="fill:url(#linearGradient14169);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient14171);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -186.5,191.5 2,-2"
- id="path14159"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient14173);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m -180,187.5 c 2.49911,-1.20238 -0.79146,-5.05796 -2.25,-2.75 l -0.75,1.75 -1.25,0.25 -0.75,0.75 2.75,2.75 0.75,-1 V 188 Z"
- id="path14161"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path14163"
- d="M -180.23388,184.53124 C -181.75937,183.83967 -182,185 -182.5,186.75 l -1.98388,0.53124"
- style="opacity:0.8;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- style="opacity:0.85;fill:none;stroke:#ffffff;stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -192.5,195.5 4.26612,-4.23438 h 1.75 l 2,-2"
- id="path14165"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_MATCUBE"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect17322"
- width="16"
- height="16"
- x="47"
- y="29" />
- <g
- transform="translate(116,-325)"
- id="g17324">
- <path
- sodipodi:nodetypes="ccccccc"
- id="path17326"
- d="m -55,358.25 -6,-2.25 -6,2.25 v 7.5 l 6,3.25 6,-3.25 z"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path17328"
- d="m -55,365.75 v -7.5 l -6,2.75 c 0,2.58363 8.34e-4,7.47325 8.34e-4,8.04035 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17337);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89207077px;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:#c9c9c9;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m -67,365.75 v -7.5 l 6,2.75 8.34e-4,8.04035 z"
- id="path17330"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path17332"
- d="m -67,358.25 6,-2.25 6,2.25 -6,2.75 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient17339);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M -66.499841,365.52276 -66.5,358.5 l 5.5,-2 5.5,2 v 7 l -5.5,3 z"
- id="path17334"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_SETTINGS"
- transform="translate(-20.999893,190.97867)"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- y="281.02133"
- x="193.99989"
- height="16"
- width="16"
- id="rect17612"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g17614">
- <rect
- y="285.52133"
- x="198.49976"
- height="2"
- width="8"
- id="rect17616"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:2;marker:none;enable-background:accumulate" />
- <g
- transform="translate(191.9999,212.02134)"
- id="g17618"
- style="display:inline">
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:url(#linearGradient17656);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 16.499049,83.47866 H 3.499993 L 3.4999929,70.5 H 16.511415 l -0.01237,12.97866 z"
- id="path17620"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- id="rect17622"
- width="8"
- height="2"
- x="198.49976"
- y="289.52136" />
- <rect
- y="283"
- x="195.99989"
- height="12"
- width="12.000107"
- id="rect17624"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;marker:none;enable-background:accumulate" />
- <g
- id="g17626"
- transform="translate(-31.00024,484.0498)">
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 237.5,-198.52846 v 1 h -8.99987"
- id="path17628"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path17630"
- d="m 228.55567,-198.51423 h 8.88878"
- style="fill:none;stroke:#4d4d4d;stroke-width:0.99999994px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <g
- id="g17632"
- transform="translate(-16.999997,0.9739989)">
- <rect
- transform="scale(-1,1)"
- style="display:inline;overflow:visible;visibility:visible;fill:#d7e3f4;fill-opacity:1;fill-rule:evenodd;stroke:#5f8dd3;stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect17634"
- width="2"
- height="3.0120413"
- x="-253.5"
- y="-200.474" />
- <path
- id="path17636"
- d="m 251.49999,-197.47154 h 2 v -3"
- style="opacity:0.45;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.1;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 251.99999,-196.47154 h 2.5 v -3.5"
- id="path17638"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g17640"
- transform="translate(-31.00024,484.0498)">
- <path
- sodipodi:nodetypes="ccc"
- id="path17642"
- d="m 237.5,-192.60425 v 1 l -8.99987,0.026"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#4d4d4d;stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 228.50013,-192.60425 8.99987,0.026"
- id="path17644"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <g
- id="g17646"
- transform="translate(-19.014593,0.97154)">
- <rect
- y="-194.51543"
- x="-251.5"
- height="2.9940825"
- width="2.0000002"
- id="rect17648"
- style="display:inline;overflow:visible;visibility:visible;fill:#d7e3f4;fill-opacity:1;fill-rule:evenodd;stroke:#5f8dd3;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="scale(-1,1)" />
- <path
- id="path17650"
- d="m 249.49999,-191.52134 h 2 v -3"
- style="display:inline;opacity:0.45;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path17652"
- d="m 250.01459,-190.52134 h 2.5 v -3.5"
- style="display:inline;opacity:0.1;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- sodipodi:nodetypes="ccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path17654"
- d="m 196.4999,294.5 0.0303,-11 h 11.01349 l -0.0303,11 z"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#linearGradient17658);stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_CHECKBOX_DEHLT"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="translate(0,128.00001)">
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:#e6e6e6;fill-opacity:0.23529412;fill-rule:nonzero;stroke:none"
- id="rect16876"
- width="8.0127983"
- height="8.012805"
- x="260.99997"
- y="473.98718"
- ry="0.4193894"
- rx="0.4193894" />
- <rect
- ry="0.82841855"
- y="473.48724"
- x="260.50003"
- height="9.0127392"
- width="9.0127354"
- id="rect16878"
- style="opacity:0.3;fill:none;stroke:url(#linearGradient12658);stroke-width:1.00002468;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- rx="0.82841796" />
- <rect
- rx="0.80560946"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="opacity:0.4;fill:none;stroke:url(#linearGradient12655);stroke-width:1.00002468;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect16880"
- width="9.0127354"
- height="9.0127392"
- x="-269.51276"
- y="-482.5"
- ry="0.83038348"
- transform="scale(-1)" />
- </g>
- <g
- id="ICON_CHECKBOX_HLT"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g13494.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="translate(0,128.00001)">
- <g
- transform="translate(20.999991)"
- id="g13503">
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:#e6e6e6;fill-opacity:0.23529412;fill-rule:nonzero;stroke:none"
- id="rect13505"
- width="8.0127983"
- height="8.012805"
- x="260.99997"
- y="473.98718"
- ry="0.4193894"
- rx="0.4193894" />
- <rect
- ry="0.82841855"
- y="473.48724"
- x="260.50003"
- height="9.0127392"
- width="9.0127354"
- id="rect13507"
- style="opacity:0.3;fill:none;stroke:url(#linearGradient13511);stroke-width:1.00002468;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- rx="0.82841796" />
- <rect
- rx="0.80560946"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="opacity:0.4;fill:none;stroke:url(#linearGradient13513);stroke-width:1.00002468;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect13509"
- width="9.0127354"
- height="9.0127392"
- x="-269.51276"
- y="-482.5"
- ry="0.83038348"
- transform="scale(-1)" />
- </g>
- <path
- d="m 283.5,478.5 1.99999,2 m 3.75,-4.75 c -1.28654,1.14367 -2.78042,2.75628 -3.75,4.75"
- style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none"
- id="path16507"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_RADIOBUT_ON">
- <g
- style="display:inline"
- id="g13515"
- transform="translate(135,508.00993)">
- <rect
- y="111"
- x="143"
- height="16"
- width="16"
- id="rect13517"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g13519">
- <circle
- transform="matrix(1.4256767,0,0,1.4314068,-320.1963,68.175135)"
- id="path13521"
- style="display:inline;fill:#e6e6e6;fill-opacity:0.25490196;fill-rule:nonzero;stroke:none"
- cx="330.5"
- cy="35.5"
- r="2.7944512" />
- <circle
- transform="matrix(1.2885487,0,0,1.2885617,-274.87525,73.246084)"
- id="path13523"
- style="display:inline;opacity:0.4;fill:none;stroke:url(#linearGradient13527);stroke-width:0.77606368;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- cx="330.5"
- cy="35.5"
- r="3.5" />
- <circle
- style="display:inline;opacity:0.6;fill:none;stroke:url(#linearGradient13529);stroke-width:0.77608043;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="path13525"
- transform="matrix(-1.288521,0,0,-1.2885339,576.8463,164.73299)"
- cx="330.5"
- cy="35.5"
- r="3.5" />
- </g>
- </g>
- <circle
- transform="matrix(0.8543143,0,0,0.8543231,3.66123,596.67148)"
- id="path15120"
- style="display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="330.5"
- cy="35.5"
- r="3.5" />
- </g>
- <g
- id="ICON_MOD_EDGESPLIT"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18695"
- width="16"
- height="16"
- x="236"
- y="260" />
- <g
- id="g18697"
- transform="translate(-86,370.75)">
- <path
- style="fill:none;stroke:#0b1728;stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 330,-107.75 -5,2 0.0372,6.324398 5,2.71875 4.99999,-2.71875 L 335,-105.75 Z"
- id="path18699"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path18719"
- d="m 330.03717,-107.6131 -5,1.875 v 6.312498 l 5,2.71875 4.99999,-2.71875 v -6.312498 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient18721);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- id="g18703"
- transform="translate(179,-179)">
- <path
- id="path18707"
- d="m 146.0019,73.295281 5,-1.894157 5,1.894157 -5,2.073959 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient18728);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path18763"
- d="m 335,-105.5 -5,2 v 6.75 l 5,-2.75 z"
- style="display:inline;fill:url(#linearGradient18765);fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- id="path18709"
- d="m 334.5,-105.25 0.002,5.587357 -4.5,2.480073 -4.5,-2.480073 L 325.5,-105.25 330,-107 Z"
- style="fill:none;stroke:url(#linearGradient18712);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- id="path18758"
- style="display:inline;opacity:0.8;fill:none;stroke:#d7e3f4;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 330.25,-103.25 3.25,-1.5"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <g
- id="g18737"
- style="opacity:0.7" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- sodipodi:nodetypes="cc"
- d="M 330.25,-103.25 335,-105.5"
- style="display:inline;overflow:visible;visibility:visible;fill:#0b1728;fill-opacity:1;fill-rule:evenodd;stroke:#0b1728;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path18760"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_HOOK"
- transform="translate(0,23)">
- <rect
- y="239"
- x="152"
- height="16"
- width="16"
- id="rect14326"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g14538">
- <path
- sodipodi:nodetypes="css"
- id="path14330"
- d="m 155.51612,249.67445 c 0,3.70073 8,3.70073 8,0 0,-2.71386 -4,-1.727 -4,-5.67444"
- style="display:inline;fill:none;stroke:#0b1728;stroke-width:3.0999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <ellipse
- transform="matrix(0.8675713,0,0,-1.199958,80.598976,391.9948)"
- id="path14332"
- style="display:inline;fill:#e6e6e6;fill-opacity:1;stroke:#0b1728;stroke-width:2.74424219;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- cx="91.5"
- cy="125"
- rx="1.75"
- ry="1.25" />
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient14568);stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 155.51612,249.75002 c 0,3.75 8,3.75 8,0 0,-2.75 -4,-1.75 -4,-5.75"
- id="path14334"
- sodipodi:nodetypes="css"
- inkscape:connector-curvature="0" />
- <ellipse
- style="display:inline;fill:#000000;fill-opacity:1;stroke:url(#linearGradient14570);stroke-width:1.28417933;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path14336"
- transform="matrix(0.8540253,0,0,-1.199954,81.814709,391.9942)"
- cx="91.5"
- cy="125"
- rx="1.75"
- ry="1.25" />
- <ellipse
- transform="matrix(0.8540253,0,0,-1.199954,81.814709,391.9942)"
- id="path14338"
- style="display:inline;fill:none;stroke:url(#linearGradient14572);stroke-width:1.28417933;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- cx="91.5"
- cy="125"
- rx="1.75"
- ry="1.25" />
- <rect
- y="241"
- x="158.99884"
- height="2"
- width="2.0011597"
- id="rect14340"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:#162d50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cs"
- id="path14342"
- d="m 155.95084,249.59135 c 0,3.34488 7.13055,3.34488 7.13055,0"
- style="display:inline;opacity:0.45;fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(349,127.99988)"
- id="ICON_BLENDER">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect26258"
- width="16"
- height="16"
- x="-29"
- y="491.00012" />
- <g
- id="g26260">
- <g
- id="g26262">
- <path
- sodipodi:nodetypes="cc"
- d="M -15.594023,497.94339 -20.25,493.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#28170b;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.34386528;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path26264"
- inkscape:connector-curvature="0" />
- <ellipse
- transform="matrix(3.625,0,0,3.1690202,-67.8125,318.31703)"
- id="path26266"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#28170b;stroke-width:1.32768786;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.10397505;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="13.5"
- cy="57.5"
- rx="1"
- ry="1.0000004" />
- <path
- id="path26268"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#28170b;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.34386528;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -25.5,496.5 h 7.5 m -9.5,6 6,-6"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- </g>
- <circle
- transform="matrix(3.5999897,0,0,3.1249932,-67.499871,320.6879)"
- id="path26270"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient26282);stroke-width:0.92424375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.10397505;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="13.5"
- cy="57.5"
- r="1" />
- <path
- sodipodi:nodetypes="cccccc"
- d="m -25.5,496.5 7.984366,-0.0226 M -27.5,502.5 l 6,-6 m 5.996227,1.44466 L -20.25,493.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient26284);stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.34386528;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path26272"
- inkscape:connector-curvature="0" />
- <circle
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path26274"
- transform="matrix(3.25,0,0,3.25,-62.875,313.125)"
- cx="13.5"
- cy="57.5"
- r="1" />
- <circle
- transform="matrix(2,0,0,2,-46,385)"
- id="path26276"
- style="fill:#2c5aa0;fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="13.5"
- cy="57.5"
- r="1" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient26286);stroke-width:0.22536004;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.10397505;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path26278"
- transform="matrix(4.7519907,0,0,4.1435313,-83.051884,262.12196)"
- cx="13.5"
- cy="57.5"
- r="1" />
- <path
- sodipodi:nodetypes="cccccc"
- d="m -20.515634,493.80534 c -0.07079,-0.45769 0.0843,-0.63855 0.5,-0.5 m -7.704183,9.08552 4.25,-4.25 m -2,-2 h 6.25"
- style="fill:none;stroke:url(#linearGradient26288);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- id="path26280"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_TEXTURE_DATA"
- transform="translate(0,128.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect15183"
- width="16"
- height="16"
- x="215"
- y="365" />
- <g
- id="g15185"
- transform="translate(167.99999,-62.999991)">
- <rect
- y="429.54614"
- x="48.499996"
- height="12.953857"
- width="13.016124"
- id="rect15187"
- style="display:inline;overflow:visible;visibility:visible;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- ry="0" />
- <rect
- ry="0"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient15195);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00207269;marker:none;enable-background:accumulate"
- id="rect15189"
- width="11.000001"
- height="11.046139"
- x="50.016117"
- y="430" />
- <path
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccc"
- id="path15191"
- d="m 49,430 v 3 h 3 v -3 z m 3,3 v 3 h 3 v -3 z m 3,0 h 3 v -3 h -3 z m 3,0 v 3 h 3 v -3 z m 0,3 h -3 v 3 h 3 z m 0,3 v 3 h 3 v -3 z m -3,0 h -3 v 3 h 3 z m -3,0 v -3 h -3 v 3 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient15209);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path15193"
- d="M 60.517703,430.5 H 49.499999 v 11 h 11.017704 v -11"
- style="fill:none;stroke:url(#linearGradient15211);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_FCURVE"
- transform="translate(-21,128.00001)">
- <rect
- y="344"
- x="89"
- height="16"
- width="16"
- id="rect15319"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g15351">
- <rect
- y="345.50153"
- x="90.5"
- height="12.998481"
- width="13"
- id="rect15323"
- style="fill:url(#linearGradient15363);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- sodipodi:nodetypes="ccc"
- id="path15326"
- d="M 91.499805,357.49999 V 346.5017 H 102.5 v 10.99829 z"
- style="fill:none;stroke:url(#linearGradient15365);stroke-width:0.99999982px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cszzcc"
- id="path15332"
- d="m 103.5,353.27516 c -0.37083,-1.1875 -1.21031,-1.72293 -1.9,-1.72929 -1.39235,-0.0134 -1.47709,3.98814 -2.999997,4 -1.491657,0.0119 -2.001315,-7 -3.5,-7 -1.52993,-10e-4 -1.18608,5.00645 -3.5,4.97929 h -1"
- style="display:inline;fill:none;stroke:url(#linearGradient15367);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Pulpit\Browser icons ver 1\font_file SMALL.png"
- transform="translate(-73.999969,234.50001)"
- id="ICON_FONT_DATA">
- <rect
- y="237.5"
- x="162.99997"
- height="16"
- width="16"
- id="rect15371"
- style="display:inline;opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <g
- style="display:inline;fill:#ffcc00;stroke:#000000;stroke-width:1.5;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
- id="g15373"
- transform="translate(73,-319.5)">
- <path
- sodipodi:nodetypes="cccccccccccccccccccccccc"
- id="path15375"
- transform="translate(262.99997,326)"
- d="m -169,233 v 1 h 1 v 10 h -1 v 1 h 4 v -1 h -1 v -4 h 3 v 1 h 1 v -3 h -1 v 1 h -3 v -5 h 5 v 1 h 1 v -2 h -8 z"
- style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(73,-319.5)"
- id="g15377"
- style="display:inline;fill:#ffcc00">
- <path
- sodipodi:nodetypes="cccccccccccccccccccccccc"
- id="path15379"
- transform="translate(262.99997,326)"
- d="m -169,233 v 1 h 1 v 10 h -1 v 1 h 4 v -1 h -1 v -4 h 3 v 1 h 1 v -3 h -1 v 1 h -3 v -5 h 5 v 1 h 1 v -2 h -8 z"
- style="fill:url(#linearGradient15383)"
- inkscape:connector-curvature="0" />
- </g>
- <path
- transform="translate(-31.000031,-64.5)"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccc"
- id="path15381"
- d="m 198,304 v 1 h 0.5 v -1 z m 1,1 v 10 h 0.65625 v -10 z m 7,0 v 1 h 0.5 v -1 z m -2,4 v 1 h 0.5 v -1 z m 0,2 v 1 h 0.5 v -1 z m -6,4 v 1 h 0.5 v -1 z"
- style="display:inline;opacity:0.85;fill:#ffffff"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_ANIM"
- transform="translate(0,128.00001)">
- <rect
- y="428"
- x="68"
- height="16"
- width="16"
- id="rect14357"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g14359"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="translate(-15.161301,338)"
- style="display:inline">
- <path
- sodipodi:nodetypes="czszcccc"
- id="path14368"
- style="display:inline;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 86.5,100.53983 4.342131,0.008 c 5.188235,0.0101 5.335295,-2.04831 3.335293,-4.04831 -0.964875,-0.964875 -4.5,-4 1.500002,-5 M 88.840543,97.588774 86.5,100.53983 M 88.828993,103.5 86.5,100.53983"
- inkscape:connector-curvature="0" />
- <path
- d="m 86.5,100.53983 4.342131,0.008 C 96.03037,100.55844 96.17743,98.5 94.177424,96.5 c -0.964875,-0.964875 -4.5,-4 1.500002,-5 M 88.840543,97.588774 86.5,100.53983 M 88.828993,103.5 86.5,100.53983"
- style="display:inline;fill:none;stroke:url(#linearGradient14377);stroke-width:1.50000143;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path14375"
- sodipodi:nodetypes="czszcccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_SCENE"
- transform="translate(0,64.000007)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect16520"
- width="16"
- height="16"
- x="110"
- y="492"
- rx="0"
- ry="0" />
- <g
- id="g16522">
- <rect
- ry="1.7356256"
- y="494.5"
- x="110.5"
- height="12"
- width="15"
- id="rect16524"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient16638);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- rx="1.7356256" />
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path16527"
- d="M 111,498.48148 V 504 c 0,0.56404 0.36784,1.00001 0.84375,1 h 12.3125 C 124.63216,505 125,504.56405 125,504 v -5.51852 c -0.31371,0.37179 -0.76923,0.59259 -1.25,0.59259 h -11.5 c -0.48077,0 -0.93629,-0.2208 -1.25,-0.59259 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient16640);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- rx="1.5817194"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect16530"
- width="15"
- height="2"
- x="110.5"
- y="494.5"
- ry="1" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect16532"
- width="15"
- height="12"
- x="110.5"
- y="494.5"
- ry="1.503511"
- rx="1.503511" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.75859177;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path16535"
- transform="matrix(1.3955004,0,0,1.2452423,11.18333,-121.72474)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <rect
- rx="0.5078125"
- ry="0.4910686"
- y="495.5"
- x="111.5"
- height="10"
- width="13.000001"
- id="rect16537"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:none;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <ellipse
- transform="matrix(1.5770887,0,0,1.5999841,-3.50675,-301.69208)"
- id="path16540"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:none;stroke:#000000;stroke-width:0.62952667;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient16642);stroke-width:0.97061968;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path16542"
- transform="matrix(1.1794014,0,0,0.8999954,27.50686,48.952303)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(1.1827463,0,0,1.2,27.245789,-99.900024)"
- id="path16544"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:0.83938956;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient16644);stroke-width:1.26754272;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path16546"
- transform="matrix(0.790122,0,0,0.787736,57.870479,107.05649)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <g
- id="g16548"
- transform="matrix(0.7547901,0,0,1,59.021765,-1)">
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#999999;stroke-width:2.89550138;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path16550"
- transform="matrix(0.7901234,0,0,0.2000006,9.8760061,395.5997)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <path
- sodipodi:nodetypes="csccc"
- id="path16554"
- d="m 69.505631,495.5 v -0.50001 c 0,-0.276 0.896,-0.5 2,-0.5 1.104,0 2,0.224 2,0.5 V 495.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1.15103066;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect16556"
- width="2.6497433"
- height="1"
- x="70.189362"
- y="495" />
- </g>
- <rect
- y="496.5"
- x="122"
- height="1.5"
- width="2"
- id="rect16558"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient16646);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- id="rect16562"
- width="2"
- height="1.5"
- x="122"
- y="496.5" />
- <rect
- y="497"
- x="115"
- height="1"
- width="1"
- id="rect16564"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#radialGradient16648);stroke-width:0.67151165;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path16566"
- transform="matrix(1.1827463,0,0,1.2,27.245789,-99.900024)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(0.8888868,0,0,0.8862026,50.166822,57.626266)"
- id="path16568"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient16650);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path16570"
- transform="matrix(0.1975308,0,0,0.1999991,103.0926,401.10045)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#radialGradient32447);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.98985863;marker:none;enable-background:accumulate"
- id="path32441"
- transform="matrix(-0.8867575,0.06148883,-0.06130315,-0.8840797,219.44126,941.51187)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_RESTRICT_RENDER_OFF"
- transform="translate(24,422.99999)"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffaaaa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect21291"
- width="16"
- height="16"
- x="464"
- y="7"
- rx="0"
- ry="0" />
- <g
- id="g21822">
- <rect
- ry="1.5909902"
- y="10.5"
- x="465.5"
- height="10"
- width="12"
- id="rect21295"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient21776);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- rx="1.5909902" />
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path21297"
- d="m 465.46685,13.40909 v 4.59375 c 0,0.56244 0.34142,0.99717 0.78315,0.99716 l 10.5,0.01065 c 0.44173,0 0.78315,-0.43471 0.78315,-0.99716 v -4.59375 c -0.29118,0.37073 -0.71398,0.59091 -1.16022,0.59091 L 466.62707,14 c -0.44624,0 -0.86904,-0.22018 -1.16022,-0.59091 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient21773);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- rx="1.362712"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect21299"
- width="12"
- height="2.0056314"
- x="465.5"
- y="10.494369"
- ry="1.0028157" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect21301"
- width="12"
- height="10"
- x="465.5"
- y="10.5"
- ry="1.3782184"
- rx="1.3782184" />
- <rect
- rx="0.39062494"
- ry="0.44196323"
- y="11.5"
- x="466.5"
- height="7.999999"
- width="9.9998779"
- id="rect21303"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:none;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <g
- id="g21305"
- transform="matrix(0.7547901,0,0,1,414.01868,-484.99999)">
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#999999;stroke-width:2.90780973;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path21307"
- transform="matrix(0.7834486,0,0,0.2000006,10.413535,395.5997)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <path
- sodipodi:nodetypes="csccc"
- id="path21309"
- d="m 69.531013,495.51105 v -0.50001 c 0,-0.276 0.890314,-0.5 1.987308,-0.5 1.096993,0 1.987307,0.224 1.987307,0.5 v 0.50001"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1.15103066;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect21311"
- width="2.6497409"
- height="1"
- x="70.193451"
- y="495.01105" />
- </g>
- <g
- transform="matrix(1,0,0,0.6666667,331,-319.00002)"
- id="g21313">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect21315"
- width="2"
- height="1.5"
- x="143"
- y="496.5" />
- <rect
- y="496.5"
- x="143"
- height="1.5"
- width="2"
- id="rect21317"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient21741);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate" />
- </g>
- <rect
- y="13"
- x="468"
- height="1"
- width="1"
- id="rect21319"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate" />
- <g
- id="g21804"
- transform="translate(1.1408497e-7,0.5000446)">
- <ellipse
- transform="matrix(1.187982,0,0,1.0569758,379.83032,-513.21497)"
- id="path21323"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.89240623;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:none;stroke:#000000;stroke-width:0.71801031;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path21325"
- transform="matrix(1.3827154,0,0,1.4028327,364.1482,-688.72206)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(0.987526,0,0,0.8124641,394.9733,-392.80617)"
- id="path21327"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient21814);stroke-width:1.11641002;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:1.00804472;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path21329"
- transform="matrix(0.9848328,0,0,0.9992585,395.19018,-485.12778)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(0.591154,0,0,0.5887513,425.87219,-279.05319)"
- id="path21331"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient21816);stroke-width:1.69505489;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(0.9913883,0,0,1.0058976,394.67318,-488.46061)"
- id="path21333"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#radialGradient21818);stroke-width:0.80110824;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#radialGradient21820);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path21335"
- transform="matrix(0.6941559,0,0,0.6920597,417.67198,-331.15708)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(0.1975308,0,0,0.1999991,456.0926,-84.399595)"
- id="path21337"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(-0.6760501,-0.1575078,0.1570322,-0.6740085,446.07727,367.34791)"
- id="path22185"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#radialGradient22187);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.05;fill:none;stroke:#ffffff;stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 476.49997,11.941967 V 19.11607"
- id="rect21642"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(45,422.99999)"
- id="ICON_RESTRICT_RENDER_ON"
- style="display:inline;opacity:0.25">
- <rect
- ry="0"
- rx="0"
- y="7"
- x="464"
- height="16"
- width="16"
- id="rect22104"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffaaaa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- id="g22106">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient22154);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect22108"
- width="12"
- height="10"
- x="465.5"
- y="10.5"
- ry="1.5909902"
- rx="1.5909902" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient22156);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 465,13.40909 v 4.59375 c 0,0.56244 0.36784,0.99717 0.84375,0.99716 l 11.3125,0.01065 c 0.47591,0 0.84375,-0.43471 0.84375,-0.99716 v -4.59375 c -0.31371,0.37073 -0.76923,0.59091 -1.25,0.59091 L 466.25,14 c -0.48077,0 -0.93629,-0.22018 -1.25,-0.59091 z"
- id="path22110"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- <rect
- ry="1"
- y="10.494369"
- x="465"
- height="2"
- width="13"
- id="rect22112"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- rx="1.4762714" />
- <rect
- ry="1.3782184"
- y="10.5"
- x="465.5"
- height="10"
- width="12"
- id="rect22114"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- rx="1.3782184" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:none;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect22116"
- width="9.9998779"
- height="7.999999"
- x="466.5"
- y="11.5"
- ry="0.44196323"
- rx="0.39062494" />
- <g
- transform="matrix(0.7547901,0,0,1,414.01868,-484.99999)"
- id="g22118">
- <ellipse
- transform="matrix(0.7834486,0,0,0.2000006,10.413535,395.5997)"
- id="path22120"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#999999;stroke-width:2.90780973;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1.15103066;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 69.531013,495.51105 v -0.50001 c 0,-0.276 0.890314,-0.5 1.987308,-0.5 1.096993,0 1.987307,0.224 1.987307,0.5 v 0.50001"
- id="path22122"
- sodipodi:nodetypes="csccc"
- inkscape:connector-curvature="0" />
- <rect
- y="495.01105"
- x="70.193451"
- height="1"
- width="2.6497409"
- id="rect22124"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="g22126"
- transform="matrix(1,0,0,0.6666667,331,-319.00002)">
- <rect
- y="496.5"
- x="143"
- height="1.5"
- width="2"
- id="rect22128"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient22158);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- id="rect22130"
- width="2"
- height="1.5"
- x="143"
- y="496.5" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- id="rect22132"
- width="1"
- height="1"
- x="468"
- y="13" />
- <g
- transform="translate(1.1408497e-7,0.5000446)"
- id="g22134">
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.89240623;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path22136"
- transform="matrix(1.187982,0,0,1.0569758,379.83032,-513.21497)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(1.3827154,0,0,1.4028327,364.1482,-688.72206)"
- id="path22138"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:none;stroke:#000000;stroke-width:0.71801031;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient22160);stroke-width:1.11641002;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path22140"
- transform="matrix(0.987526,0,0,0.8124641,394.9733,-392.80617)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(0.9848328,0,0,0.9992585,395.19018,-485.12778)"
- id="path22142"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:1.00804472;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient22162);stroke-width:1.69505489;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path22144"
- transform="matrix(0.591154,0,0,0.5887513,425.87219,-279.05319)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#radialGradient22164);stroke-width:0.80110824;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path22146"
- transform="matrix(0.9913883,0,0,1.0058976,394.67318,-488.46061)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(0.6941559,0,0,0.6920597,417.84876,-330.91401)"
- id="path22148"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient22166);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path22150"
- transform="matrix(0.1975308,0,0,0.1999991,456.07844,-84.89955)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- </g>
- <path
- sodipodi:nodetypes="cc"
- id="path22152"
- d="M 476.49997,11.941967 V 19.11607"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.05;fill:none;stroke:#ffffff;stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(-272,478.06251)"
- id="ICON_OUTLINER_OB_CAMERA"
- style="display:inline;opacity:0.98000004"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- y="-48"
- x="403"
- height="16"
- width="16"
- id="rect30187"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <circle
- transform="matrix(1.3340954,0,0,1.3333333,-178.16901,-188.16667)"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b1600;stroke-width:0.74978584;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path30189"
- cx="443.5"
- cy="108.5"
- r="3" />
- <circle
- id="path30191"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b1600;stroke-width:0.74978584;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(1.3340954,0,0,1.3333333,-184.1736,-187.16666)"
- cx="443.5"
- cy="108.5"
- r="3" />
- <circle
- id="path30193"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24132);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.85464907;marker:none;enable-background:accumulate"
- transform="matrix(1.1662469,0,0,1.1666676,-103.72925,-170.08344)"
- cx="443.5"
- cy="108.5"
- r="3" />
- <path
- sodipodi:nodetypes="cccccccccccccccccc"
- id="path30195"
- d="m 409.5,-39.50001 -2,2.000003 h -2 v 2 h 2 v 1 l 1,1 5,7e-6 v -1 h 2.99542 l 1.5,1 h 0.25 v -5 h -0.25 l -1.5,1 H 413.5 v -2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#f89a35;fill-opacity:1;fill-rule:nonzero;stroke:#2b1600;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:open="true"
- sodipodi:end="1.8508428"
- sodipodi:start="3.0449434"
- transform="matrix(1.0812107,0,0,1.082338,-66.018179,-160.93645)"
- sodipodi:type="arc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.98000004;fill:none;stroke:url(#linearGradient30231);stroke-width:0.92440742;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path30197"
- sodipodi:cx="443.5"
- sodipodi:cy="108.5"
- sodipodi:rx="3"
- sodipodi:ry="3"
- d="m 440.514,108.7895 a 3,3 0 0 1 1.83109,-3.05829 3,3 0 0 1 3.46157,0.85063 3,3 0 0 1 0.20507,3.55865 3,3 0 0 1 -3.34093,1.24264" />
- <circle
- transform="matrix(1.1662469,0,0,1.1666676,-109.73384,-169.08343)"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30233);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.85464907;marker:none;enable-background:accumulate"
- id="path30199"
- cx="443.5"
- cy="108.5"
- r="3" />
- <path
- sodipodi:open="true"
- sodipodi:end="5.930273"
- sodipodi:start="0.96146912"
- d="m 445.21695,110.9601 a 3,3 0 0 1 -3.49134,-0.0411 3,3 0 0 1 -1.0878,-3.3178 3,3 0 0 1 2.78925,-2.1003 3,3 0 0 1 2.88805,1.96221"
- sodipodi:ry="3"
- sodipodi:rx="3"
- sodipodi:cy="108.5"
- sodipodi:cx="443.5"
- id="path30201"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.98000004;fill:none;stroke:url(#linearGradient30235);stroke-width:0.9380942;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:type="arc"
- transform="matrix(1.0655819,0,0,1.0664004,-65.085308,-158.20716)" />
- <rect
- y="-41"
- x="409"
- height="2.0000005"
- width="4.0000658"
- id="rect30203"
- style="display:inline;overflow:visible;visibility:visible;fill:#c8955e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <circle
- transform="matrix(0.3352674,0,0,0.3357219,258.80309,-78.928541)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.98000004;fill:none;stroke:url(#linearGradient30237);stroke-width:2.98067403;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path30205"
- cx="443.5"
- cy="108.5"
- r="3" />
- <rect
- y="-43"
- x="407"
- height="1.0000002"
- width="1"
- id="rect30207"
- style="display:inline;overflow:visible;visibility:visible;fill:#2b2200;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <circle
- id="path30209"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.98000004;fill:none;stroke:url(#linearGradient30239);stroke-width:2.98067403;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(0.3352674,0,0,0.3357219,264.80311,-79.91866)"
- cx="443.5"
- cy="108.5"
- r="3" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#2b2200;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect30211"
- width="1"
- height="1.0000002"
- x="413.00003"
- y="-43.99012" />
- <rect
- y="-37"
- x="413"
- height="2"
- width="3.99542"
- id="rect30213"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30241);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000024;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path30215"
- d="m 416.49542,-37 1.5,-1 v 4 l -1.5,-1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30243);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000024;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path30217"
- d="m 415.99542,-37 1,-0.5 v 3 l -1,-0.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30245);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30247);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 413,-37 h 1 v 2 h -1 z"
- id="path30219"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- id="path30221"
- d="m 409.75,-38.5 h 2.75 v 4 h -4 v -2.75 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ec8f2c;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient30249);stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- ry="1.2544428"
- y="-37.821297"
- x="407"
- height="2.6761446"
- width="2.8293107"
- id="rect30223"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:none;stroke:url(#linearGradient20217);stroke-width:1.00000024;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- rx="1.2544428" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffdbb5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000024;marker:none;enable-background:accumulate"
- id="rect30225"
- width="3"
- height="1"
- x="406"
- y="-37.000008" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#634321;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect30227"
- width="4"
- height="1"
- x="409"
- y="-40" />
- </g>
- <g
- style="display:inline;opacity:0.98000004"
- id="ICON_OUTLINER_DATA_CAMERA"
- transform="translate(-271.99542,457.0625)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect30284"
- width="16"
- height="16"
- x="403"
- y="-48" />
- <circle
- id="path30286"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.74978584;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(1.3340954,0,0,1.3333333,-178.16901,-188.16667)"
- cx="443.5"
- cy="108.5"
- r="3" />
- <circle
- transform="matrix(1.3340954,0,0,1.3333333,-184.1736,-187.16666)"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.74978584;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path30288"
- cx="443.5"
- cy="108.5"
- r="3" />
- <circle
- transform="matrix(1.1662469,0,0,1.1666676,-103.72925,-170.08344)"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30326);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.85464907;marker:none;enable-background:accumulate"
- id="path30290"
- cx="443.5"
- cy="108.5"
- r="3" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#787878;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 407.5,-39.5 v 1.999993 h -2 v 2 h 2 v 1 l 1,1 5,7e-6 v -1 h 2.99542 l 1.5,1 h 0.25 v -5 h -0.25 l -1.5,1 H 413.5 v -2 z"
- id="path30292"
- sodipodi:nodetypes="cccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- d="m 440.514,108.7895 a 3,3 0 0 1 1.83109,-3.05829 3,3 0 0 1 3.46157,0.85063 3,3 0 0 1 0.20507,3.55865 3,3 0 0 1 -3.34093,1.24264"
- sodipodi:ry="3"
- sodipodi:rx="3"
- sodipodi:cy="108.5"
- sodipodi:cx="443.5"
- id="path30294"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.98000004;fill:none;stroke:url(#linearGradient30328);stroke-width:0.92440742;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:type="arc"
- transform="matrix(1.0812107,0,0,1.082338,-66.018179,-160.93645)"
- sodipodi:start="3.0449434"
- sodipodi:end="1.8508428"
- sodipodi:open="true" />
- <circle
- id="path30296"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30330);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.85464907;marker:none;enable-background:accumulate"
- transform="matrix(1.1662469,0,0,1.1666676,-109.73384,-169.08343)"
- cx="443.5"
- cy="108.5"
- r="3" />
- <path
- transform="matrix(1.0655819,0,0,1.0664004,-65.085308,-158.20716)"
- sodipodi:type="arc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.98000004;fill:none;stroke:url(#linearGradient30332);stroke-width:0.9380942;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path30298"
- sodipodi:cx="443.5"
- sodipodi:cy="108.5"
- sodipodi:rx="3"
- sodipodi:ry="3"
- d="m 445.21695,110.9601 a 3,3 0 0 1 -3.49134,-0.0411 3,3 0 0 1 -1.0878,-3.3178 3,3 0 0 1 2.78925,-2.1003 3,3 0 0 1 2.88805,1.96221"
- sodipodi:start="0.96146912"
- sodipodi:end="5.930273"
- sodipodi:open="true" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect30300"
- width="4.0000658"
- height="2.0000005"
- x="409"
- y="-41" />
- <circle
- id="path30302"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.98000004;fill:none;stroke:url(#linearGradient30334);stroke-width:2.98067403;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(0.3352674,0,0,0.3357219,258.80309,-78.928541)"
- cx="443.5"
- cy="108.5"
- r="3" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect30304"
- width="1"
- height="1.0000002"
- x="407"
- y="-43" />
- <circle
- transform="matrix(0.3352674,0,0,0.3357219,264.80311,-79.91866)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.98000004;fill:none;stroke:url(#linearGradient30336);stroke-width:2.98067403;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path30306"
- cx="443.5"
- cy="108.5"
- r="3" />
- <rect
- y="-43.99012"
- x="413.00003"
- height="1.0000002"
- width="1"
- id="rect30308"
- style="display:inline;overflow:visible;visibility:visible;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30338);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000024;marker:none;enable-background:accumulate"
- id="rect30310"
- width="3.99542"
- height="2"
- x="413"
- y="-37" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30340);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000024;marker:none;enable-background:accumulate"
- d="m 416.49542,-37 1.5,-1 v 4 l -1.5,-1 z"
- id="path30312"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30342);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 415.99542,-37 1,-0.5 v 3 l -1,-0.5 z"
- id="path30314"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path30316"
- d="m 413,-37 h 1 v 2 h -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30344);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient30346);stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 409.75,-38.5 h 2.75 v 4 h -4 v -2.75 z"
- id="path30318"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:none;stroke:url(#linearGradient30348);stroke-width:1.00000024;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect30320"
- width="2.8293107"
- height="2.6761446"
- x="407"
- y="-37.821297"
- ry="1.2544428"
- rx="1.2544428" />
- <rect
- y="-37.000008"
- x="406"
- height="1"
- width="3"
- id="rect30322"
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000024;marker:none;enable-background:accumulate" />
- <rect
- y="-40"
- x="409"
- height="1"
- width="4"
- id="rect30324"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- style="display:inline;opacity:0.98000004"
- id="ICON_CAMERA_DATA"
- transform="translate(-145.99542,541.00002)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect30352"
- width="16"
- height="16"
- x="403"
- y="-48" />
- <circle
- id="path30354"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.74978584;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(1.3340954,0,0,1.3333333,-178.16901,-188.16667)"
- cx="443.5"
- cy="108.5"
- r="3" />
- <circle
- transform="matrix(1.3340954,0,0,1.3333333,-184.1736,-187.16666)"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.74978584;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path30356"
- cx="443.5"
- cy="108.5"
- r="3" />
- <circle
- transform="matrix(1.1662469,0,0,1.1666676,-103.72925,-170.08344)"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30394);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.85464907;marker:none;enable-background:accumulate"
- id="path30358"
- cx="443.5"
- cy="108.5"
- r="3" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#787878;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 407.5,-39.5 v 1.999993 h -2 v 2 h 2 v 1 l 1,1 5,7e-6 v -1 h 2.99542 l 1.5,1 h 0.25 v -5 h -0.25 l -1.5,1 H 413.5 v -2 z"
- id="path30360"
- sodipodi:nodetypes="cccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- d="m 440.514,108.7895 a 3,3 0 0 1 1.83109,-3.05829 3,3 0 0 1 3.46157,0.85063 3,3 0 0 1 0.20507,3.55865 3,3 0 0 1 -3.34093,1.24264"
- sodipodi:ry="3"
- sodipodi:rx="3"
- sodipodi:cy="108.5"
- sodipodi:cx="443.5"
- id="path30362"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.98000004;fill:none;stroke:url(#linearGradient30396);stroke-width:0.92440742;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:type="arc"
- transform="matrix(1.0812107,0,0,1.082338,-66.018179,-160.93645)"
- sodipodi:start="3.0449434"
- sodipodi:end="1.8508428"
- sodipodi:open="true" />
- <circle
- id="path30364"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30398);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.85464907;marker:none;enable-background:accumulate"
- transform="matrix(1.1662469,0,0,1.1666676,-109.73384,-169.08343)"
- cx="443.5"
- cy="108.5"
- r="3" />
- <path
- transform="matrix(1.0655819,0,0,1.0664004,-65.085308,-158.20716)"
- sodipodi:type="arc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.98000004;fill:none;stroke:url(#linearGradient30400);stroke-width:0.9380942;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path30366"
- sodipodi:cx="443.5"
- sodipodi:cy="108.5"
- sodipodi:rx="3"
- sodipodi:ry="3"
- d="m 445.21695,110.9601 a 3,3 0 0 1 -3.49134,-0.0411 3,3 0 0 1 -1.0878,-3.3178 3,3 0 0 1 2.78925,-2.1003 3,3 0 0 1 2.88805,1.96221"
- sodipodi:start="0.96146912"
- sodipodi:end="5.930273"
- sodipodi:open="true" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect30368"
- width="4.0000658"
- height="2.0000005"
- x="409"
- y="-41" />
- <circle
- id="path30370"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.98000004;fill:none;stroke:url(#linearGradient30402);stroke-width:2.98067403;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(0.3352674,0,0,0.3357219,258.80309,-78.928541)"
- cx="443.5"
- cy="108.5"
- r="3" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect30372"
- width="1"
- height="1.0000002"
- x="407"
- y="-43" />
- <circle
- transform="matrix(0.3352674,0,0,0.3357219,264.80311,-79.91866)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.98000004;fill:none;stroke:url(#linearGradient30404);stroke-width:2.98067403;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path30374"
- cx="443.5"
- cy="108.5"
- r="3" />
- <rect
- y="-43.99012"
- x="413.00003"
- height="1.0000002"
- width="1"
- id="rect30376"
- style="display:inline;overflow:visible;visibility:visible;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30406);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000024;marker:none;enable-background:accumulate"
- id="rect30378"
- width="3.99542"
- height="2"
- x="413"
- y="-37" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30408);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000024;marker:none;enable-background:accumulate"
- d="m 416.49542,-37 1.5,-1 v 4 l -1.5,-1 z"
- id="path30380"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30410);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 415.99542,-37 1,-0.5 v 3 l -1,-0.5 z"
- id="path30382"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path30384"
- d="m 413,-37 h 1 v 2 h -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30412);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient30414);stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 409.75,-38.5 h 2.75 v 4 h -4 v -2.75 z"
- id="path30386"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:none;stroke:url(#linearGradient30416);stroke-width:1.00000024;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect30388"
- width="2.8293107"
- height="2.6761446"
- x="407"
- y="-37.821297"
- ry="1.2544428"
- rx="1.2544428" />
- <rect
- y="-37.000008"
- x="406"
- height="1"
- width="3"
- id="rect30390"
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000024;marker:none;enable-background:accumulate" />
- <rect
- y="-40"
- x="409"
- height="1"
- width="4"
- id="rect30392"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="ICON_IMAGE_RGB">
- <rect
- y="10"
- x="194"
- height="16"
- width="16"
- id="rect17352"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g40205">
- <rect
- ry="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect17356"
- width="13.016124"
- height="12.953857"
- x="195.49998"
- y="11.546152" />
- <rect
- y="12.00001"
- x="197.01611"
- height="11.046139"
- width="11.000001"
- id="rect17358"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient40202);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00207269;marker:none;enable-background:accumulate"
- ry="0" />
- <g
- id="g40036"
- transform="translate(146.99999,-417.99999)">
- <g
- transform="translate(-146.99999,417.99999)"
- id="g39822">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#106386;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect39628"
- width="3"
- height="3"
- x="196"
- y="12" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ba0036;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect39636"
- width="3"
- height="3"
- x="199"
- y="15" />
- <rect
- y="12"
- x="202"
- height="3"
- width="3"
- id="rect39670"
- style="display:inline;overflow:visible;visibility:visible;fill:#9f0022;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <rect
- y="15"
- x="205"
- height="3"
- width="3"
- id="rect39676"
- style="display:inline;overflow:visible;visibility:visible;fill:#688c7f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <rect
- y="18"
- x="196"
- height="3"
- width="3"
- id="rect39678"
- style="display:inline;overflow:visible;visibility:visible;fill:#b77100;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <rect
- y="21"
- x="199"
- height="3"
- width="3"
- id="rect39684"
- style="display:inline;overflow:visible;visibility:visible;fill:#a67c58;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#7a2537;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect39686"
- width="3"
- height="3"
- x="202"
- y="18" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#869c2b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect39692"
- width="3"
- height="3"
- x="205"
- y="21" />
- </g>
- </g>
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient40189);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 207.51769,12.50001 h -11.0177 v 11 h 11.0177 v -11"
- id="path17363"
- sodipodi:nodetypes="ccc" />
- </g>
- </g>
- <g
- id="ICON_IMAGE_ALPHA"
- transform="translate(9.471,32.00923)">
- <rect
- y="-22.009235"
- x="226.52901"
- height="16"
- width="16"
- id="rect17382"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <rect
- y="-20.509235"
- x="228.04515"
- height="13"
- width="12.983856"
- id="rect17384"
- style="display:inline;fill:url(#linearGradient32749);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1" />
- <rect
- transform="translate(271.529,-379.00923)"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient32751);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect17387"
- width="12"
- height="12"
- x="-43"
- y="359"
- mask="url(#mask17570)" />
- <path
- sodipodi:nodetypes="ccc"
- id="path17389"
- d="m 240.029,-19.509225 h -10.98386 v 11.0000002 l 10.98384,-10e-6 V -19.509235"
- style="display:inline;fill:none;stroke:url(#linearGradient32753);stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0.5;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_LOCKVIEW_ON"
- transform="translate(339,-210)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18439"
- width="16"
- height="16"
- x="-124"
- y="325"
- rx="0"
- ry="0" />
- <g
- transform="translate(-11,154.99966)"
- id="g18441"
- style="opacity:0.7">
- <g
- transform="translate(-99,-97.999673)"
- id="g18443"
- style="display:inline">
- <g
- transform="translate(41.011415,162)"
- style="display:inline"
- id="g18445">
- <g
- transform="translate(-80,-48)"
- id="g18447">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#d7d7d7;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 36.488585,166.3823 -0.25,1.1177 H 26.73859 l -1.25,-1.25 -5e-6,-10.75 h 11 z"
- id="path18449"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path18451"
- d="m 34.988585,166.00001 h -8 V 165 h 8 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path18453"
- d="m 35.47469,156.50008 -8.986105,-8e-5 5e-6,10 h 8.999995 l -0.01389,-9.99992 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17177);stroke-width:0.99999923px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- y="165.00002"
- x="27.988585"
- height="1.0000023"
- width="1"
- id="rect18455"
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(1,0,0,-1,0,320)"
- id="g18457"
- style="fill:#ee0000;fill-opacity:1" />
- </g>
- </g>
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18459"
- d="m -101,181 h -10 v -8 h 10 z"
- style="display:inline;opacity:0.5;fill:url(#radialGradient17179);fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-11,154.99966)"
- id="g18461">
- <g
- id="g18463"
- transform="translate(-347,193.00032)">
- <path
- sodipodi:nodetypes="ccccccccccccsccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#e1e1e1;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 246.5,-15.5 c -1.65264,0 -3,1.347359 -3,3 v 2 c 0,1.6526411 1.34737,3 3,3 v 0 c 1.65264,0 3,-1.3473589 3,-3 l -0.0312,-1.96875 c 0,-1.652641 -1.31612,-3.03125 -2.96875,-3.03125 v 0 z m 0,2 c 0.554,0 1,0.446 1,1 v 2 c 0,0.554 -0.446,1 -1,1 -0.554,0 -1,-0.446 -1,-1 v -2 c 0,-0.554 0.446,-1 1,-1 z"
- id="path18465"
- inkscape:connector-curvature="0" />
- <path
- id="path18467"
- d="m 246.5,-19.5 c -1.65264,0 -3,1.347359 -3,3 v 2 c 0,1.652641 1.34737,3 3,3 v 0 c 1.65264,0 3,-1.347359 3,-3 v -2 c 0,-1.652641 -1.34737,-3 -3,-3 z m 0,2 c 0.554,0 1,0.446 1,1 v 2 c 0,0.554 -0.446,1 -1,1 -0.554,0 -1,-0.446 -1,-1 v -2 c 0,-0.554 0.446,-1 1,-1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient17181);fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccccccccsccc"
- inkscape:connector-curvature="0" />
- <path
- transform="translate(6)"
- clip-path="url(#clipPath17188)"
- id="path18473"
- d="m 240.5,-15.5 c -1.65264,0 -3,1.347359 -3,3 v 2 c 0,1.6526411 1.34737,3 3,3 v 0 c 1.65264,0 3,-1.3473589 3,-3 l -0.0312,-1.96875 c 0,-1.652641 -1.31612,-3.03125 -2.96875,-3.03125 v 0 z m 0,2 c 0.554,0 1,0.446 1,1 v 2 c 0,0.554 -0.446,1 -1,1 -0.554,0 -1,-0.446 -1,-1 v -2 c 0,-0.554 0.446,-1 1,-1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#d3d7cf;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccccccccsccc"
- inkscape:connector-curvature="0" />
- <rect
- y="-14.06875"
- x="244"
- height="2.5"
- width="1"
- id="rect18475"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect18477"
- width="1"
- height="1"
- x="245"
- y="-15.06875" />
- </g>
- <g
- id="g18479" />
- </g>
- </g>
- <g
- id="ICON_LOCKVIEW_OFF"
- transform="translate(287,-54.93125)">
- <g
- id="g18491"
- transform="translate(0,-3.2e-4)"
- style="opacity:0.7">
- <g
- style="display:inline"
- id="g18493"
- transform="translate(-79,-97.999673)">
- <g
- id="g18495"
- style="display:inline"
- transform="translate(41.011415,162)">
- <g
- id="g18497"
- transform="translate(-80,-48)">
- <path
- sodipodi:nodetypes="ccccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path18499"
- d="m 36.488585,166.3823 -0.25,1.1177 H 26.73859 l -1.25,-1.25 -5e-6,-10.75 h 11 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#d7d7d7;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- d="m 34.988585,165.99999 h -8 v -1 h 8 z"
- id="path18501"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23914);stroke-width:0.99999923px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 35.47469,156.50008 -8.986105,-8e-5 5e-6,10 h 8.999995 l -0.01389,-9.99992 z"
- id="path18503"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect18505"
- width="1"
- height="1.000007"
- x="27.988585"
- y="165"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <g
- style="fill:#ee0000;fill-opacity:1"
- id="g18507"
- transform="matrix(1,0,0,-1,0,320)" />
- </g>
- </g>
- </g>
- <g
- transform="translate(-157,18.000328)"
- style="opacity:0.5"
- id="g18509">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18511"
- d="M 76,164 H 66 v -9 h 10 z"
- style="opacity:0.8;fill:url(#radialGradient23916);fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#radialGradient23918);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="M 76,164 H 66 v -9 h 10 z"
- id="path18513"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g18515"
- transform="translate(0,-3.2e-4)">
- <g
- id="g18517">
- <g
- transform="translate(-360,181.00032)"
- id="g18519"
- mask="url(#mask13041)">
- <path
- id="path18521"
- d="m 279.46875,-11.53125 c -1.65264,0 -2.96875,1.316109 -2.96875,2.96875 V -7.5 c 0,1.6526411 1.31612,2.96875 2.96875,2.96875 h 0.0625 c 1.65264,0 2.96875,-1.3161089 2.96875,-2.96875 v -1.0625 c 0,-1.652641 -1.31612,-2.96875 -2.96875,-2.96875 z M 279.5,-9.5 c 0.554,0 1,0.446 1,1 v 1 c 0,0.554 -0.446,1 -1,1 -0.554,0 -1,-0.446 -1,-1 v -1 c 0,-0.554 0.446,-1 1,-1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccccccccsccc"
- mask="none"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect18523"
- width="1"
- height="2.5"
- x="277"
- y="-10" />
- <rect
- y="-11"
- x="278"
- height="1"
- width="1"
- id="rect18525"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="g18527"
- transform="translate(-360,191.06282)"
- mask="url(#mask13052)">
- <path
- sodipodi:nodetypes="ccccccccccccsccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 279.46875,-11.53125 c -1.65264,0 -2.96875,1.316109 -2.96875,2.96875 V -7.5 c 0,1.6526411 1.31612,2.96875 2.96875,2.96875 h 0.0625 c 1.65264,0 2.96875,-1.3161089 2.96875,-2.96875 v -1.0625 c 0,-1.652641 -1.31612,-2.96875 -2.96875,-2.96875 z M 279.5,-9.5 c 0.554,0 1,0.446 1,1 v 1 c 0,0.554 -0.446,1 -1,1 -0.554,0 -1,-0.446 -1,-1 v -1 c 0,-0.554 0.446,-1 1,-1 z"
- id="path18529"
- inkscape:connector-curvature="0" />
- <rect
- y="-10"
- x="277"
- height="2.5"
- width="1"
- id="rect18531"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect18533"
- width="1"
- height="1"
- x="278"
- y="-11" />
- </g>
- </g>
- <g
- id="g18535" />
- </g>
- </g>
- <g
- id="ICON_FONTPREVIEW"
- transform="translate(-147.04123,1.9815)">
- <rect
- y="71.018501"
- x="383.04123"
- height="16"
- width="16"
- id="rect18661"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g18663">
- <path
- sodipodi:nodetypes="ccccccc"
- style="fill:url(#linearGradient18682);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 397.54124,84.25 -1.25,1.25 h -10.5 l -1.24999,-1.25 V 72.5 h 12.99999 z"
- id="path18665"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path18667"
- d="m 396.04123,84.0185 h -10 V 83 h 10 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- y="83.018501"
- x="387.04123"
- height="0.99999702"
- width="0.99998772"
- id="rect18671"
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-39.85994,-165.9815)"
- id="g18674">
- <path
- sodipodi:nodetypes="csssccc"
- d="m 430.24956,241.60271 -0.86957,2.62878 c -1.04667,3.16416 -1.3885,3.86937 -2.40118,2.64949 -0.37662,-0.45369 -1.31958,0.42592 -0.85102,0.66654 2.9195,1.49927 3.83448,-0.99495 4.73215,-3.56602 l 0.75,-2.37879 z"
- id="path18676"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60000002;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60000002;marker:none;enable-background:accumulate"
- d="m 430.33455,240.97335 c -0.77131,0.0353 -1.46745,0.21844 -2.3658,0.6829 -0.74329,0.3843 -1.31497,1.26096 -1.28125,1.75 0.0247,0.35816 0.29068,0.65625 0.65625,0.65625 0.36558,0 0.6936,-0.30765 0.6781,-0.65797 C 428,242.91083 427.68952,243 427.84375,242.625 c 0.11839,-0.28788 0.47629,-0.71901 0.90625,-0.83455 0.61327,-0.1648 1.873,0.18401 2.5,0.20955 1.75215,0.0714 3.67097,-0.15759 4.5,-1 -0.24423,0.0241 -2.49503,0.0675 -2.75,0.0625 -1.06533,-0.0208 -1.89414,-0.12444 -2.66545,-0.0891 z"
- id="path18678"
- sodipodi:nodetypes="cssssssscss"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccscc"
- d="m 430.47881,243.98149 c 1.25,0 2.77121,0.0774 3.52119,0.0185 -0.28977,0.34542 -1.08416,0.80085 -1.5,0.89651 -0.84895,0.19531 -2.02119,-0.033 -2.89006,0.0468 l 0.86887,-0.96184 z"
- id="path18680"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60000002;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="cccc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient18690);stroke-width:0.99999923px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 396.54123,73.51858 -10.98611,-8e-5 -0.0139,11.00008 h 11 v -11 z"
- id="path18688"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(2,529.00001)"
- id="ICON_FULLSCREEN"
- style="display:inline">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18740"
- width="16"
- height="16"
- x="3"
- y="69" />
- <g
- style="display:inline"
- id="g18742"
- transform="translate(0.01612278)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- id="rect38458"
- width="11.999999"
- height="9.0000172"
- x="4.9838772"
- y="70.999992" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18744"
- d="M 17.453876,82.25 16.233877,83.5 H 5.75 L 4.5,82.25 4.4999999,70.5 H 17.465291 l -0.01141,11.75 z"
- style="fill:url(#linearGradient18752);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18746"
- d="M 15.983877,81.999998 7.7338772,82 V 81.000002 L 15.983877,81 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient18756);stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 5.4838772,82.500001 5.511418,71.499938 16.483877,71.5 v 11 z"
- id="path18748"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect18750"
- width="1"
- height="1"
- x="5.9838772"
- y="80.999992"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- <g
- transform="translate(256.9902,446.00001)"
- id="ICON_MENU_PANEL"
- style="display:inline">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18761"
- width="16"
- height="16"
- x="42.0098"
- y="173" />
- <g
- style="display:inline"
- id="g18763"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="translate(-0.00161682,-3.9821186e-5)">
- <path
- sodipodi:nodetypes="cccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path41276"
- d="m 56.511417,178.50003 h -10 v 9 h 8.75 l 1.25,-1.25 z"
- style="opacity:0.15;fill:#000000;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18765"
- d="m 55.011418,177.00004 -10.000001,-1e-5 v 9 l 10.000001,1e-5 z"
- style="opacity:0.85;fill:url(#linearGradient18779);fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 55.501617,177.75004 -1.25,-1.25 -8.4902,-1e-5 -1.25,1.25 v 7.5 l 1.25,1.25 8.4902,1e-5 1.25,-1.25 z"
- id="path18767"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- d="m 54.011419,178.00004 -8.000002,-1e-5 v 0.99996 l 8.000002,1e-5 z"
- id="path18773"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18860"
- d="m 54.5098,177.5 v 8 l -9,-1e-5 v -8 z"
- style="display:inline;fill:none;stroke:url(#linearGradient18862);stroke-width:0.99999923px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_SPLITSCREEN"
- transform="translate(210,253.00005)">
- <rect
- y="345"
- x="-184"
- height="16"
- width="16"
- id="rect18694"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18698"
- d="m -176.47247,352.5 h -0.59149 -5.43604 l 0.0161,-6.00003 h 6.01141 V 352.5 Z"
- style="fill:url(#linearGradient18846);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- style="fill:url(#linearGradient18841);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -176.5,358.5 -1,1 h -3.73388 l -1.25,-1.25 v -5.74999 h 6.01141 z"
- id="path18702"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18710"
- d="m -169.5133,358.25 -1.2367,1.25 h -4.75 l -1,-1 v -12 h 7.00001 l -0.0133,11.75 z"
- style="fill:url(#linearGradient18831);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18712"
- d="m -171,358 h -4 v -1.00004 h 4 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18718"
- d="m -177.5,353.5 v 5 h -4 v -5 z"
- style="fill:none;stroke:url(#linearGradient18823);stroke-width:0.99999923px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m -178,358.00004 h -3 V 357 h 3 z"
- id="path18850"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient18854);stroke-width:0.99999923px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m -170.5,347.5 v 11.00001 h -5 V 347.5 Z"
- id="path18852"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient18858);stroke-width:0.99999923px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m -177.5,347.50001 v 4 h -4 v -4 z"
- id="path18856"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path17395"
- d="m -178,358.00004 h -3 V 357 h 3 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_LONGDISPLAY"
- transform="translate(290,-291)">
- <g
- transform="translate(-204,295)"
- id="g18875"
- style="display:inline">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18877"
- width="16"
- height="16"
- x="3"
- y="69" />
- <g
- style="display:inline"
- id="g18879"
- transform="translate(0.01612278)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18881"
- d="M 17.453876,82.25 16.233877,83.5 H 5.75 L 4.5,82.25 4.4999999,70.5 H 17.465291 l -0.01141,11.75 z"
- style="fill:url(#linearGradient17222);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cccccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18883"
- d="M 15.983877,81.999998 5.9838772,82 V 81.000002 L 15.983877,81 Z"
- style="fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient17224);stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 5.4838772,82.500001 5.511418,71.499938 16.483877,71.5 v 11 z"
- id="path18885"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect18887"
- width="1"
- height="1"
- x="6.9838772"
- y="81"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- d="m -197.50001,368.5 h 9 m -9,2 h 9 m -9,2 h 9"
- style="fill:none;stroke:url(#linearGradient17226);stroke-width:0.9999994px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1"
- id="path19108"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_SHORTDISPLAY"
- transform="translate(294,-291)">
- <g
- style="display:inline"
- id="g19069"
- transform="translate(-187,295)">
- <rect
- y="69"
- x="3"
- height="16"
- width="16"
- id="rect19071"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(0.01612278)"
- id="g19073"
- style="display:inline">
- <path
- sodipodi:nodetypes="ccccccc"
- style="fill:url(#linearGradient17214);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 17.453876,82.25 16.233877,83.5 H 5.75 L 4.5,82.25 4.4999999,70.5 H 17.465291 l -0.01141,11.75 z"
- id="path19075"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="M 15.983877,81.999998 5.9838772,82 V 81.000002 L 15.983877,81 Z"
- id="path19077"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path19079"
- d="M 5.4838772,82.500001 5.511418,71.499938 16.483877,71.5 v 11 z"
- style="fill:none;stroke:url(#linearGradient17216);stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- y="81"
- x="6.9838772"
- height="1"
- width="1"
- id="rect19081"
- style="display:inline;overflow:visible;visibility:visible;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <path
- id="path19112"
- style="fill:none;stroke:url(#linearGradient17218);stroke-width:0.99999946px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1"
- d="m -173.49999,372.5 h 2 m -2,-2 h 2 m -2,-2 h 2"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- d="m -180.5,372.5 h 3 m -3,-2 h 3 m -3,-2 h 3"
- style="fill:none;stroke:url(#linearGradient17220);stroke-width:0.99999952px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1"
- id="path19116"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#999999;fill-opacity:0.75;fill-rule:evenodd;stroke:#808080;stroke-width:0.99999928px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1"
- d="m -175.39386,374.49044 v -7.03646"
- id="path19120"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path19122"
- d="m -174.39384,374.5 v -8.00012 H -171.5"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.9999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_SCENE_DATA">
- <g
- id="g20803"
- transform="translate(-116.99998,424.00001)">
- <g
- transform="translate(-340.00002,-121.00001)"
- id="g20805">
- <circle
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#e9e9af;stroke-width:0.49999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path32699"
- transform="matrix(1.9999998,0,0,2.0000014,-462.99991,-192.00026)"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- <circle
- transform="matrix(1.4285718,0,0,1.4285718,-197.57158,-82.000059)"
- id="path32701"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#e1e08a;stroke-width:0.69999987;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#adac2f;stroke-width:1.16666663;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path32703"
- transform="matrix(0.8571429,0,0,0.8571429,67.857123,27.999992)"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- </g>
- <rect
- y="71"
- x="125"
- height="2"
- width="2"
- id="rect20813"
- style="display:inline;overflow:visible;visibility:visible;fill:#f4f4d7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="g41392">
- <g
- transform="translate(-456.00027,338.00001)"
- id="g20782">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23241);fill-opacity:1;fill-rule:nonzero;marker:none;enable-background:accumulate"
- d="m 472.50029,156.5 c -1.9309,0 -3,0.66961 -3,1.5 v 7 c 0,0.83039 1.0691,1.5 3,1.5 1.9309,0 3,-0.66961 3,-1.5 v -7 c 0,-0.83039 -1.0691,-1.5 -3,-1.5 z"
- id="path20784"
- sodipodi:nodetypes="cccsccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23243);stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 470.50029,158.5 v 6.45352 c 0,0.54648 1.28413,0.46583 2,0.54648 1,0 2,0 2,-0.55753 v -6.45352"
- id="path20786"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#radialGradient23245);fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate"
- d="m 472.50029,156.5 c -1.9309,0 -3,0.5 -3,1.5 v 7 c 0,0.83039 1.0691,1.5 3,1.5 1.9309,0 3,-0.66961 3,-1.5 v -7 c 0,-1 -1.0691,-1.5 -3,-1.5 z"
- id="path20788"
- sodipodi:nodetypes="cccsccc"
- inkscape:connector-curvature="0" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:#eff6ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73959124;marker:none;enable-background:accumulate"
- id="path20790"
- transform="matrix(0.9067635,0,0,1.3047091,374.56954,447.97555)"
- cx="108"
- cy="-222"
- rx="3.3084693"
- ry="1.2798798" />
- <path
- sodipodi:nodetypes="cccsccc"
- id="path20793"
- d="m 472.50029,156.5 c -1.9309,0 -3,0.5 -3,1.5 v 7 c 0,0.83039 1.0691,1.5 3,1.5 1.9309,0 3.00029,-0.75001 3,-1.5 v -7 c 0,-1 -1.0691,-1.5 -3,-1.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#162d50;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-116.99998,424.00001)"
- id="g32690">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path32692"
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.05875278;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.4371593,0,0,0.4371565,71.294972,28.418283)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.3851128,-0.04237784,0.04389507,-0.3737467,174.55414,129.70537)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path32694"
- style="display:inline;opacity:0.6;fill:url(#linearGradient23247);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path20801"
- style="fill:none;stroke:url(#linearGradient23250);stroke-width:3.99999762;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.3000001,0,0,0.3000002,89.398992,44.603723)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <rect
- y="493"
- x="5"
- height="16"
- width="16"
- id="rect20815"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:1.5;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- id="ICON_PARTICLEMODE"
- transform="translate(207.01492,72.000007)">
- <rect
- y="442"
- x="-34"
- height="16"
- width="16"
- id="rect17125"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="czsccccccccccccccccccccccccccccs"
- id="path17128"
- d="m -21.25,443.25 c -1.25,-1.25 -3.5,0.25 -7.5,4 -4,3.75 -5.25,6.25 -4,7.5 1.013195,1.01319 3.75,2.5 3.75,2.5 h 0.25 V 457 l -2.75,-3.5 1,-1 3.5,2.75 h 0.25 V 455 l -2.75,-3.5 1,-1 3.5,2.75 h 0.25 V 453 l -2.75,-3.5 1,-1 3.5,2.75 h 0.25 V 451 l -2.75,-3.5 1,-1 3.5,2.75 h 0.25 V 449 l -2.75,-3.5 1,-1 3.5,2.75 h 0.25 V 447 c 0,0 -2,-3.25 -2.5,-3.75 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient17135);fill-rule:evenodd;stroke:none"
- d="m -21.25,443.25 c -0.5,-0.5 -3.5,0.25 -7.5,4 -4,3.75 -4.5,7 -4,7.5 0.5,0.5 3.5,2.75 3.5,2.75 l 0.75,-0.75 -2.75,-3.25 0.75,-0.75 3.25,2.75 0.75,-0.75 -2.75,-3.25 0.75,-0.75 3.25,2.75 0.75,-0.75 -2.75,-3.25 0.75,-0.75 3.25,2.75 0.75,-0.75 -2.75,-3.25 0.75,-0.75 3.25,2.75 0.75,-0.75 -2.75,-3.25 0.75,-0.75 3.25,2.75 0.75,-0.75 c 0,0 -2.249997,-3 -2.75,-3.5 z"
- id="path17131"
- sodipodi:nodetypes="czsccccccccccccccccccccccs"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -21.75,443.75 c -1,-1 -3.5,1 -6.5,4 -3,3 -5,5.5 -4,6.5"
- id="path17133"
- sodipodi:nodetypes="czs"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_GO_LEFT"
- transform="translate(-21,128.00001)">
- <g
- transform="translate(464,422)"
- id="g17228"
- style="display:inline">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect17230"
- width="16"
- height="16"
- x="3"
- y="69" />
- <g
- style="display:inline"
- id="g17232"
- transform="translate(0.01612278)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path17234"
- d="M 17.453876,82.25 16.233877,83.5 H 5.7338772 l -1.25,-1.25 -1e-7,-11.75 H 17.465291 l -0.01141,11.75 z"
- style="fill:url(#linearGradient17242);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path17236"
- d="M 15.983877,81.999998 5.9838772,82 V 81.000002 L 15.983877,81 Z"
- style="fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient17244);stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 5.4838772,82.5 v -11 H 16.483877 v 11 z"
- id="path17238"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect17240"
- width="1"
- height="1"
- x="6.9838772"
- y="81"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- <g
- transform="translate(20.96875)"
- id="g17279">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- d="m 450.70226,498 h 6.81386 m -4.98487,-2.5 -1.82899,2.5 m 1.82899,2.5 -1.82899,-2.5"
- style="display:inline;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path17281"
- sodipodi:nodetypes="czcccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path17283"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 453.28125,496 -0.75,1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- d="m 452.78125,499 h 4.76119"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.50000006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path17286"
- sodipodi:nodetypes="cz"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_GAME"
- transform="translate(-10,466.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect33081"
- width="16"
- height="16"
- x="162"
- y="90" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect33085"
- width="2.5"
- height="1.75"
- x="165.74995"
- y="96.749977" />
- <path
- sodipodi:nodetypes="ccccccc"
- id="path33087"
- d="m 164.99996,98.99998 6,-2.5 6,2.5 v 2.75 l -5.99999,3.24999 -6.00001,-3.24999 z"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <rect
- y="91.999977"
- x="170.98643"
- height="7"
- width="2"
- id="rect32743"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.96000001;fill:none;stroke:#1a1a1a;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- id="path33091"
- d="m 164.99996,98.99998 6,-2.5 6,2.5 v 0.5 l -6,3 -6,-2.93442 z"
- style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 164.99997,101.74998 -1e-5,-2.25 6,3 0.01,2.49885 -6.00995,-3.24885 z"
- id="path33093"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path33095"
- d="m 176.99996,101.74998 v -2.25 l -6,3 c 0,2.58362 0,1.9329 0,2.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89207077px;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#aa0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect33097"
- width="2"
- height="1"
- x="165.99995"
- y="97.999977" />
- <rect
- y="96.999977"
- x="165.99995"
- height="1"
- width="2"
- id="rect32749"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff2a2a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ffaaaa;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect32751"
- width="1"
- height="2"
- x="165.99995"
- y="96.999977" />
- <path
- sodipodi:nodetypes="cccccc"
- id="path32753"
- d="m 165.49996,99.49998 v 0 2 l 5.5,3 5.5,-3 v -2"
- style="fill:none;stroke:url(#linearGradient22081);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(-114.00004,-232.99999)"
- id="g32755">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:#1a1a1a;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect33103"
- width="2"
- height="3.9642856"
- x="285"
- y="328.03571" />
- <circle
- transform="matrix(1.6666708,0,0,1.6666633,-190.66784,-215.66559)"
- id="path33105"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#550000;stroke-width:0.59999985;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="286"
- cy="325"
- r="1.5" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect32759"
- width="2"
- height="3.5000324"
- x="285"
- y="328.49997" />
- <rect
- y="328.49997"
- x="285"
- height="3.5000324"
- width="1"
- id="rect32761"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient32335);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.59999985;marker:none;enable-background:accumulate"
- id="path32763"
- transform="matrix(1.333351,0,0,1.333345,-95.338377,-107.33714)"
- cx="286"
- cy="325"
- r="1.5" />
- <rect
- y="331"
- x="284"
- height="1"
- width="1"
- id="rect32765"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect32767"
- width="2"
- height="1"
- x="285"
- y="332" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect32769"
- width="1"
- height="1"
- x="287"
- y="331" />
- </g>
- <path
- sodipodi:nodetypes="cc"
- id="path48963"
- d="m 165.49996,98.99998 5.5,2.75"
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <g
- mask="url(#mask20957)"
- id="g21598">
- <path
- mask="none"
- sodipodi:nodetypes="cccc"
- id="path21596"
- d="m 168.25,102.75 -0.75,0.75 c -1,1 -0.75,1 -2,1 h -2.25"
- style="opacity:0.7;fill:none;stroke:#1a1a1a;stroke-width:2.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ececec;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 168.25,102.75 -0.75,0.75 c -1.25,1.17188 -0.75,1 -2,1 h -3"
- id="path21594"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_SORTBYEXT"
- transform="translate(0,12)">
- <path
- sodipodi:nodetypes="cccccc"
- id="path32379"
- d="m 35.5,65.5 h 6 v 11 h -9 v -8 z"
- style="display:inline;fill:url(#linearGradient31964);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient31966);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(0,-10)"
- id="g34026">
- <path
- style="display:inline;fill:url(#linearGradient31968);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient31970);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- d="m 29.5,71.5 h 6 v 11 h -9 v -8 z"
- id="path32383"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <rect
- y="73"
- x="27.984795"
- height="8"
- width="6.0303202"
- id="rect32389"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- style="fill:#fa0000;fill-opacity:1"
- transform="matrix(-1,0,0,1,217.99997,-167)"
- id="g32391">
- <g
- style="fill:#fa0000;fill-opacity:1"
- id="g32393">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#b41500;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 187.03125,239 v 2 h 2 v -2 z m 2,2 v 2 h 2 v -2 z m 0,2 h -2 v 2 h 2 z m 0,2 v 2 h 2 v -2 z m -2,0 h -2 v 2 h 2 z m 0,-2 v -2 h -2 v 2 z"
- transform="matrix(-1,0,0,1,375.01609,1)"
- id="path32395"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="fill:#fa0000;fill-opacity:1"
- id="g32397"
- transform="translate(2,-2)" />
- <g
- style="fill:#fa0000;fill-opacity:1"
- transform="translate(0,-4)"
- id="g32399" />
- <g
- style="fill:#fa0000;fill-opacity:1"
- id="g32401"
- transform="translate(2,-6)" />
- <g
- style="fill:#fa0000;fill-opacity:1"
- transform="translate(0,-8)"
- id="g32403" />
- </g>
- <path
- mask="none"
- clip-path="none"
- transform="matrix(1.499975,0,0,1.4959551,100.24881,-314.20841)"
- sodipodi:nodetypes="ccc"
- id="path32405"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.66757292px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter23214)"
- d="M -48.500031,260.50809 -46.5,260.5 l -3.1e-5,-1.99191"
- inkscape:connector-curvature="0" />
- <path
- id="path32407"
- style="opacity:0.98999999;fill:none;stroke:url(#linearGradient31972);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 27.5,76 -3e-5,5.5081 M 31,72.5 l 3.49997,0.0081"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path32409"
- d="m 25.99997,75.00809 h 4 v -4 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- </g>
- <path
- d="m 26.5,64 v 8.5 h 6 l -0.01513,4 H 41.5 v -11 H 35.51513 L 35.5,61.5 H 29 Z"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path32414"
- sodipodi:nodetypes="cccccccccc"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(-158,-135)"
- id="g33249">
- <path
- sodipodi:nodetypes="cccccccccccccccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.29999995;marker:none;enable-background:accumulate"
- d="m 35,78 v 1 h 5 v -1 z m 0,2 v 1 h 5 v -1 z m -1,2 v 1 h 6 v -1 z m 5,2 v 1 h 1 v -1 z"
- transform="translate(158,125)"
- id="rect33241"
- inkscape:connector-curvature="0" />
- </g>
- <path
- d="m 33.5,73.25 v 2.25001 M 36.25,66.5 h 4.25"
- style="display:inline;fill:none;stroke:url(#linearGradient31974);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- id="path33301"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline"
- id="ICON_UGLYPACKAGE"
- transform="translate(542.99004,484.00118)">
- <rect
- y="9"
- x="-34"
- height="16"
- width="16"
- id="rect22431"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate" />
- <g
- id="g22433">
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#2a2512;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -32,17 7,-3 6,2.5 v 3.74998 L -25.99999,23.99997 -32,20.74998 Z"
- id="path22435"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccccc"
- style="fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m -32,17 6,-2.5 6,2.5 v 0.5 l -6,3 -6,-2.93442 z"
- id="path22437"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#2c281a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89207077px;marker:none;enable-background:accumulate"
- d="M -24.99004,20.99883 -25,14.00002 -32,17 l 3.5,1.75 z"
- id="path22439"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path22441"
- d="M -24.99004,20.99883 -25,14 l 6,2.5 -3.5,1.75 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#716844;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient22453);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M -19.5,16.5 -25,14.25 -31.5,17"
- id="path22443"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path22445"
- d="M -31.99999,20.74998 -32,17.5 l 6,3 0.01,3.49883 -6.00995,-3.24885 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#c6b77c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#595235;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="M -19,20.25 V 17.00002 L -26,20.5 c 0,2.58362 0,2.93288 0,3.49998 z"
- id="path22447"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.96000001;fill:none;stroke:url(#linearGradient22455);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m -31.5,17.5 v 2.99998 l 5.5,3 L -19.5,20 v -2.99998"
- id="path22449"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path22451"
- d="m -31.5,17.5 5.5,3 6.5,-3.5"
- style="fill:none;stroke:url(#linearGradient22457);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_HAIR"
- transform="matrix(-1,0,0,1,269,-561)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18472"
- width="16"
- height="16"
- x="164"
- y="592" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- d="m 169.51126,596.5 c 3.98874,3.75 3.98874,7.5 3.98874,9 m 1.01472,-11 c 3.48528,5 2.98528,9.5 2.98874,11 M 166.5,600.5 c 2,1 3,3 3.00692,5"
- style="fill:none;stroke:url(#linearGradient18478);stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path18474"
- inkscape:connector-curvature="0" />
- <path
- id="path18476"
- style="fill:none;stroke:url(#linearGradient18480);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 169.51126,596.5 c 3.98874,3.75 3.98874,7 3.98874,9 m 1.01472,-11 c 3.48528,5 2.98528,9.5 2.98874,11 M 166.5,600.5 c 2,1 3,3 3.00692,5"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline"
- id="ICON_PHYSICS"
- transform="translate(-186,487.00001)">
- <g
- id="g21832"
- style="opacity:0.85">
- <rect
- transform="scale(-1,1)"
- y="82"
- x="-433.5"
- height="3"
- width="7.8166504"
- id="rect22717"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:url(#linearGradient22880);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate" />
- <rect
- transform="scale(-1,1)"
- y="83"
- x="-434"
- height="1"
- width="8.9931746"
- id="rect21783"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient22848);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate" />
- <rect
- transform="scale(-1,1)"
- y="83"
- x="-430.5"
- height="1"
- width="2"
- id="rect22877"
- style="display:inline;overflow:visible;visibility:visible;fill:#333333;fill-opacity:0.81960784;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- </g>
- <g
- style="opacity:0.8"
- id="g22652">
- <rect
- y="69"
- x="422"
- height="16"
- width="16"
- id="rect22589"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.05;fill:url(#radialGradient22838);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <g
- id="g22619">
- <path
- sodipodi:nodetypes="csscccc"
- id="path21775"
- d="m 422.51387,74.4375 c 2.14278,1.6383 5.29475,5.652 6.25,7.5625 0.5,1 1.05394,1.01957 1.5,0 0.875,-2 3.25,-4.75 4.75,-6 l -3.5,-4 c -1.25,1.83839 -2,3.25 -2.75,4.63304 -1.71617,-1.72583 -4.35859,-3.39262 -6.25,-4.13304"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient22840);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient22842);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g22626">
- <g
- id="g22622">
- <path
- sodipodi:nodetypes="cccc"
- id="path21777"
- d="m 422.51387,73.5 c 1.93909,0.815624 4.07262,1.664731 6,4 h 0.75 c 0.82427,-1.547027 1.51287,-2.596571 2.16161,-3.5"
- style="fill:none;stroke:url(#linearGradient22844);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient22846);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
- d="m 422.51387,73.5 c 1.93909,0.815624 5.41183,5.25 7,8 1.5,-3 2.75,-4 4.75,-6.25"
- id="path21779"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient22896);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 428.5,78.5 c 0.95165,-1.519624 1.88025,-3.040081 2.92548,-4.5"
- id="path22894"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g22592"
- transform="translate(434.01387,-281)">
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient22850);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.82784271;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path21781"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.4380641,0,0,0.4372851,-57.820839,302.39978)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient22852);stroke-width:4.11671448;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path21785"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.2913522,0,0,0.2916372,38.453823,319.58486)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_PINNED"
- transform="translate(147,527.00001)"
- inkscape:export-filename="/home/wolter/Documenten/Blender/Icons/Fake2.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- y="71"
- x="215"
- height="16"
- width="16"
- id="rect34912"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.29999995;marker:none;enable-background:accumulate" />
- <g
- id="g35549">
- <g
- transform="translate(167,137)"
- id="g34916">
- <circle
- transform="translate(58.032932,-27.838387)"
- id="path34918"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#1a1a1a;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="0"
- cy="-32"
- r="3.5" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.56022131;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path34920"
- transform="matrix(1.4285714,0,0,1.4274429,55.5,-11.825777)"
- cx="0"
- cy="-32"
- r="3.5" />
- </g>
- <g
- id="g34922"
- transform="matrix(1.1068703,0,0,1.0981766,160.5341,122.19554)">
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="path34924"
- transform="matrix(1.1751782,0,0,1.1751782,56.000001,-1.2882925)"
- cx="0"
- cy="-32"
- r="3.5" />
- <circle
- transform="matrix(0.9994022,0,0,0.9994021,56.002092,-6.9152216)"
- id="path34926"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient35583);stroke-width:1.17982781;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="0"
- cy="-32"
- r="3.5" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient35585);stroke-width:1.16643703;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path34928"
- transform="matrix(0.774689,0,0,0.7805148,56.890573,-14.812697)"
- cx="0"
- cy="-32"
- r="3.5" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient35587);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99581552;marker:none;enable-background:accumulate"
- id="path34930"
- transform="matrix(1.0042021,0,0,1.0042021,55.985293,-6.7448206)"
- cx="0"
- cy="-32"
- r="3.5" />
- <circle
- transform="matrix(0.9108044,0,0,0.9108044,55.985293,-9.7335486)"
- id="path34932"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient35589);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99581552;marker:none;enable-background:accumulate"
- cx="0"
- cy="-32"
- r="3.5" />
- </g>
- <g
- transform="translate(167,137)"
- id="g34934">
- <circle
- transform="matrix(0.8571429,0,0,0.8571429,58.032932,-32.409816)"
- id="path34936"
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- cx="0"
- cy="-32"
- r="3.5" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient35591);stroke-width:1.40000081;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path34938"
- transform="matrix(0.7142853,0,0,0.7142853,58.032932,-36.981258)"
- cx="0"
- cy="-32"
- r="3.5" />
- <circle
- transform="translate(58.032932,-27.838387)"
- id="path34940"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient35593);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="0"
- cy="-32"
- r="3.5" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient35595);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="path34942"
- transform="matrix(0.8571429,0,0,0.8571429,58.032932,-32.409816)"
- cx="0"
- cy="-32"
- r="3.5" />
- </g>
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_UNPINNED"
- transform="translate(307,636)"
- inkscape:export-filename="/home/wolter/Documenten/Blender/Icons/Fake1.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- y="-38"
- x="34"
- height="16"
- width="16"
- id="rect35714"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(231.01612,149)"
- id="g34102"
- style="display:inline;opacity:0.96000001">
- <path
- sodipodi:nodetypes="ccccccc"
- id="path35717"
- d="m -187.24592,-178.75235 -5.0202,5.00235 -3,2 -1,-1 2,-3 5.0202,-5.00235 z"
- style="fill:url(#linearGradient35740);fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -187.24592,-178.75235 -5.2702,5.25235 -3,2 -1,-1 2,-3 5.2702,-5.25235 z"
- id="path34105"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path34107"
- d="m -195.4858,-172.48532 1.46968,-2.51468 4.26612,-4.25"
- style="fill:none;stroke:#ffffff;stroke-width:0.85000002;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path35721"
- d="m 44.5,-37.5 -2,2 1,1 -2,2 h -4 l -1,1 7,7 1,-1 v -4 l 2,-2 1,1 1.5098,-1.5098 L 49.5,-32.5 Z"
- style="fill:url(#linearGradient35742);fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path35723"
- d="m 44.5,-29.5 -3,-3"
- style="fill:none;stroke:url(#linearGradient35744);stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- id="path35725"
- d="m 46.5,-31.5 -3,-3"
- style="fill:none;stroke:url(#linearGradient35746);stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path35729"
- d="m 43.5,-33.5 -1.75,1.75 h -4 l -0.25,0.25"
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- id="path35731"
- d="m 43.5,-35.5 1,-1"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path35733"
- d="m 42,-32 v 0 l 2,-2 2.5,2.5 -2,2 L 42,-32"
- style="fill:url(#linearGradient35750);fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient35752);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 44.55,-36.45 3.95,3.95"
- id="path34886"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path34890"
- d="m 43.5,-35.5 3.715625,3.66875"
- style="fill:none;stroke:url(#linearGradient35754);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient35756);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 41.55,-31.45 2.2,2.2"
- id="path34894"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.3;fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 45.5,-31.5 -1.25,1.25"
- id="path34906"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path34908"
- d="M 48.65,-32.65 47.4,-31.4"
- style="opacity:0.3;fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient35772);fill-rule:evenodd;stroke:none"
- d="m 41.5,-32.25 h -4.25 l 6.5,6.25 v -4"
- id="path35770"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path35727"
- d="m 38.25,-31.25 5.5,5.5"
- style="fill:none;stroke:url(#linearGradient35748);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;opacity:0.65"
- id="ICON_SNAP_OFF"
- transform="translate(-334,109.04419)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:0.75;fill-rule:evenodd;stroke:url(#linearGradient68937);stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 433.14375,58.950006 -2.75,2.75"
- id="path11878"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path11880"
- d="m 425.39375,56.700006 2.75,-2.75"
- style="display:inline;fill:#ff0000;fill-opacity:0.75;fill-rule:evenodd;stroke:url(#linearGradient68939);stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <g
- id="g11883"
- transform="translate(0,-0.044194)">
- <path
- transform="translate(459.95822,-187.9558)"
- sodipodi:nodetypes="czzc"
- id="path11885"
- d="m -32.20822,242.24999 2,-2 c 3.74999,-3.75 8.74999,1.25 5,5 l -2,2"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient68941);stroke-width:2.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="48"
- x="423"
- height="16"
- width="16"
- id="rect51637"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- <g
- transform="translate(440,-188)"
- id="g11891">
- <path
- transform="translate(-440,188.0442)"
- id="path11895"
- d="m 432.125,49.03125 c -1.30818,0.127946 -2.64484,0.727176 -3.75,1.8125 l -4.78125,4.6875 2.8125,2.875 4.78125,-4.71875 c 1.25772,-1.235151 1.98833,-0.85542 2.53125,-0.3125 0.54292,0.542919 0.91397,1.2336 -0.34375,2.46875 l -4.78125,4.6875 2.8125,2.875 4.78125,-4.71875 c 2.52607,-2.480751 2.30083,-6.16792 0.34375,-8.125 -0.97854,-0.978541 -2.36579,-1.53434 -3.84375,-1.53125 -0.18474,3.86e-4 -0.37562,-0.01828 -0.5625,0 z m 0.5625,0.875 c 1.23689,8.8e-4 2.39931,0.461809 3.21875,1.28125 1.63889,1.63889 1.89928,4.676909 -0.34375,6.875 l -4.28125,4.1875 -1.5625,-1.5625 4.3125,-4.21875 c 1.54471,-1.51377 1.17361,-2.857641 0.3125,-3.71875 -0.86111,-0.86111 -2.23654,-1.201271 -3.78125,0.3125 l -4.28125,4.1875 -1.5625,-1.5625 4.3125,-4.21875 c 1.12152,-1.09905 2.41936,-1.563381 3.65625,-1.5625 z"
- style="opacity:0.9;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csc"
- id="path11897"
- d="m -3.4321903,240.29419 c 0.82637,1.47069 0.7752067,3.63228 -0.8178097,5.23203 l -2.2237373,2.23314"
- style="display:inline;opacity:0.3;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="opacity:0.6"
- id="g11899">
- <path
- sodipodi:nodetypes="czs"
- id="path11901"
- d="m 425.25,55.75 4.25,-4.25 c 1.59639,-1.596386 4.02931,-1.32637 5.5,-0.5"
- style="display:inline;fill:none;stroke:url(#linearGradient68943);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient68945);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 435,56 -4.75,4.75"
- id="path11905"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(-313,109)"
- id="ICON_SNAP_ON"
- style="display:inline">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- id="rect11909"
- width="16"
- height="16"
- x="423"
- y="48" />
- <g
- id="g11911"
- transform="translate(440,-187.9558)">
- <path
- style="fill:none;stroke:#000000;stroke-width:3.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -15,245 4.79178,-4.70581 c 3.7837908,-3.7159 8.7837908,1.2841 5,5 L -10,250"
- id="path51649"
- sodipodi:nodetypes="czzc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="czzc"
- id="path51651"
- d="m -14.5,244.5 4.29178,-4.20581 c 3.7877432,-3.71186 8.7877432,1.28814 5,5 L -9.5,249.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient68947);stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:0.75;fill-rule:evenodd;stroke:url(#linearGradient68949);stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M -6.75,246.75 -9.5,249.5"
- id="path51653"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path51655"
- d="m -14.5,244.5 2.75,-2.75"
- style="fill:#ff0000;fill-opacity:0.75;fill-rule:evenodd;stroke:url(#linearGradient68951);stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#481608;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -10.95822,242.99999 -2,-2"
- id="path11922"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.85;fill:none;stroke:url(#linearGradient68953);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -14.70822,243.74999 4.25,-4.25 c 1.5,-1.49999 3.5,-1.5 5,-0.75"
- id="path11924"
- sodipodi:nodetypes="czs"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path11926"
- d="m -5.95822,247.99999 -2,-2"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#481608;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path11928"
- d="m -4.95822,243.99999 -4.5,4.5"
- style="opacity:0.85;fill:none;stroke:url(#linearGradient68955);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cs"
- id="path11930"
- d="m -4.0503493,245.73202 c 1.5801026,-1.61251 1.6441797,-3.76134 0.8178097,-5.23203"
- style="opacity:0.1;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_SNAP_SURFACE"
- transform="translate(21,-19)">
- <g
- style="display:inline;opacity:0.8"
- mask="url(#mask69005)"
- transform="matrix(0.646567,0,0,0.644332,-233.54872,129.49706)"
- id="g36675">
- <g
- style="display:inline"
- id="g36677"
- transform="matrix(1.8217829,0,0,1.8217829,375.38164,-343.68741)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path36680"
- style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.14285731;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.7428442,0,0,0.7454212,30.426387,135.62554)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.8;fill:url(#linearGradient51774);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36682"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.6852904,-0.07823249,0.07810925,-0.6899628,209.72326,315.34566)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path36684"
- style="display:inline;fill:none;stroke:url(#linearGradient51776);stroke-width:1.33333385;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6367237,0,0,0.6389323,44.434295,148.19125)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- transform="translate(-61.375,-188.625)"
- id="g51790"
- style="display:inline">
- <rect
- style="display:inline;opacity:0;fill-opacity:1"
- id="rect22754"
- width="16"
- height="16"
- x="213.375"
- y="343.625" />
- <g
- id="g51778">
- <path
- sodipodi:nodetypes="czscc"
- id="path22715"
- d="m 219.36593,351.65 v -3.5 c 0,-2.025 1.25907,-2.525 2.50907,-2.525 1.25,0 2.5,0.5 2.49092,2.525 v 3.5"
- style="display:inline;fill:none;stroke:#000000;stroke-width:3.79999995;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient51804);stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 219.36593,351.65 0.009,-3.275 c 0.006,-2.25 1.24773,-2.74375 2.5,-2.75 1.25227,-0.006 2.5,0.5 2.50907,2.725 l -0.0182,3.3"
- id="path22717"
- sodipodi:nodetypes="czscc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path22719"
- d="M 224.35595,351.24375 V 351.775"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient51806);stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient51808);stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 219.40595,351.72527 V 351.225"
- id="path22721"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path22723"
- d="m 220.7625,350.275 h -2"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#803300;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#803300;stroke-width:1.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 225.61593,350.15 h -2.25"
- id="path22725"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="czs"
- id="path22727"
- d="m 218.61592,352.15 v -4 c 0,-2.025 1.21963,-2.89049 2.75,-3.25"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#linearGradient51810);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.9;fill:none;stroke:url(#linearGradient51812);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 223.61593,352.15 v -3.75115 c 0,-1.35618 -0.49093,-2.02385 -1.24093,-2.02385"
- id="path22730"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.05;fill:none;stroke:#000000;stroke-width:0.73376155;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 225.24243,350.48448 c -0.001,-0.14034 0.0155,-2.61281 0,-2.75 -0.10562,-0.93297 -0.53761,-1.74673 -1.11525,-2.29782"
- id="path22732"
- sodipodi:nodetypes="css"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path22738"
- d="m 220.11593,347.65 v 3.125"
- style="display:inline;opacity:0.02000002;fill:none;stroke:#000000;stroke-width:0.84999996;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_SPEAKER"
- transform="translate(0,107.00001)">
- <rect
- y="449"
- x="257"
- height="16"
- width="16"
- id="rect19373"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="opacity:0.6;stroke:#162d50"
- id="g19375"
- transform="translate(14.081669,359)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path19377"
- d="m 253.41833,95.5 c 1.5,1.5 1.5,3.5 0,5"
- style="opacity:0.9;fill:none;stroke:#162d50;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path19379"
- d="m 255.41833,93.5 c 2.75,2.75 2.75,6.25 0,9"
- style="opacity:0.9;fill:none;stroke:#162d50;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path19381"
- d="m 267.5,454.5 c 1.5,1.5 1.5,3.5 0,5"
- style="opacity:0.9;fill:none;stroke:#ffffff;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- id="path19385"
- d="M 264.58167,451.5 H 263.5 l -3,3 c 0,-0.554 -0.446,-1 -1,-1 h -1 c -0.554,0 -1,0.446 -1,1 v 5 c 0,0.554 0.446,1 1,1 h 1 c 0.554,0 1,-0.446 1,-1 l 3,3 h 1.08167 z"
- style="display:inline;fill:url(#linearGradient20275);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path19455"
- d="m 258.5,459.5 h 1 l 1,-1 3.25,3"
- style="display:inline;fill:none;stroke:url(#linearGradient20309);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient20269);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 260.5,454.5 v 4.9091"
- id="path19387"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 258.5,455.5 h 1"
- id="path19389"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path19391"
- d="m 262.59506,453.5 1,-1"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- id="path19393"
- d="m 258.5,454.63598 h 1"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 262.59506,454.5 1,-1"
- id="path19395"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:none;stroke:#ffffff;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 269.5,452.5 c 2.75,2.75 2.75,6.25 0,9"
- id="path19397"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path20281"
- d="m 263.5,452.5 v 9"
- style="fill:none;stroke:url(#linearGradient20283);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient20303);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 258.5,454.3 v 5.4"
- id="path20301"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_EDITMODE_HLT"
- transform="translate(0,-1.00005)">
- <rect
- y="513.99988"
- x="26"
- height="16"
- width="16"
- id="rect38641"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g36101">
- <g
- id="g22740"
- style="opacity:0.7"
- transform="translate(-116,424.99975)">
- <g
- transform="translate(-179,199.50012)"
- id="g38620">
- <path
- id="path38622"
- d="m 329.5,-108.25 -5.5,1.75 v 7.74988 l 6,2.09544 5,-2.84532 v -6.75 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.00000167;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="M 324,-99.00012 V -106.5 l 6,-1.75 v 11.5 l -0.5,0.25 z"
- id="path38624"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(179,-179)"
- id="g38626">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#787878;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 156,79.5 v -7 l -5,-1.75 v 11.5 z"
- id="path38628"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 145,72.5 5.5,-2 5.5,2 -5.5,2.5 z"
- id="path38630"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="fill:none;stroke:url(#linearGradient38718);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 334.5,-106.5 v 6.75 l -5,2.75 -5,-2.25012 V -106.5"
- id="path38632"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="opacity:0.95999995;fill:none;stroke:url(#linearGradient38721);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 145.5,93.25012 c 0,0 5,2.25 5,2.25 l 5,-2.25"
- id="path38634"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.19199997;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- id="rect38636"
- width="1"
- height="7.75"
- x="150"
- y="95.000122" />
- <rect
- y="95.25"
- x="151"
- height="7.75"
- width="1"
- id="rect22687"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.09599998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate" />
- </g>
- <rect
- rx="0"
- ry="0"
- y="526.49988"
- x="33.5"
- height="3.0001416"
- width="2.9999485"
- id="rect38643"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#783e00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- rx="0"
- ry="0"
- y="516.49988"
- x="27.5"
- height="3.0001416"
- width="2.9999485"
- id="rect38645"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#783e00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#783e00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect38647"
- width="2.9999485"
- height="3.0001416"
- x="27.5"
- y="524.49969"
- ry="0"
- rx="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#783e00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect38649"
- width="2.9999485"
- height="3.0001416"
- x="33.5"
- y="518.49969"
- ry="0"
- rx="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.06000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect38754"
- width="3.9785564"
- height="4"
- x="34.021442"
- y="519.00006" />
- <rect
- rx="0"
- ry="0"
- y="518.99976"
- x="34"
- height="2.0000772"
- width="1.9999485"
- id="rect39152"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffd4a5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccc"
- id="rect28386"
- d="m 28,519.50001 h -0.5 v -3.00014 h 2.99995"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#462500;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#462500;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 28,524.50001 h -0.5 v 3.00014 h 2.99995"
- id="path28390"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path28392"
- d="m 33.5,527.75001 -9e-5,1.75004 h 3.00014 l -5e-5,-1.75004"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#462500;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="517.00006"
- x="28.021444"
- height="4"
- width="3.9785564"
- id="rect37868-0-2"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.12000002;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffd4a5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect28536"
- width="1.9999485"
- height="2.0000772"
- x="28.000046"
- y="517"
- ry="0"
- rx="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffd4a5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect28538"
- width="1.9999485"
- height="2.0000772"
- x="34.000046"
- y="527"
- ry="0"
- rx="0" />
- <rect
- y="525.00006"
- x="28.021444"
- height="1.9999889"
- width="3.9785564"
- id="rect38756"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.12000002;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffd4a5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect28540"
- width="1.9999485"
- height="2.0000772"
- x="28.000046"
- y="525"
- ry="0"
- rx="0" />
- </g>
- </g>
- <g
- id="ICON_IMGDISPLAY"
- transform="translate(-21,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect39088"
- width="16"
- height="16"
- x="173"
- y="70.976562" />
- <g
- id="g39227">
- <g
- transform="translate(1.0000047,-0.02344036)"
- id="g39109">
- <g
- transform="translate(8,8)"
- id="g39113">
- <rect
- ry="0"
- y="72.5"
- x="173.5"
- height="6"
- width="5"
- id="rect39115"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient39281);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <g
- style="fill:#333333"
- transform="rotate(180,176,72)"
- id="g39117" />
- <rect
- ry="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient39283);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect39119"
- width="2.9999952"
- height="4.0000029"
- x="174.52599"
- y="73.523438" />
- </g>
- <path
- sodipodi:nodetypes="cccccc"
- id="path39123"
- d="m 183.25,82.5 c 0.25,0 1.5,0 1.5,0 z m 0,2 h 1.5 z"
- style="fill:none;stroke:#333333;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-6.9999953,-9.0234404)"
- id="g39125">
- <g
- id="g39127"
- transform="translate(8,8)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient39285);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect39129"
- width="5"
- height="6"
- x="173.5"
- y="72.5"
- ry="0" />
- <g
- id="g39131"
- transform="rotate(180,176,72)"
- style="fill:#333333" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- d="m 177,73.02344 v 1 h -1 v -1 z m -1,1 v 1 h -1 v -1 z m -1,0 h -1 v -1 h 1 z m 0,1 v 1 h -1 v -1 z m 0,1 h 1 v 1 h -1 z m 0,1 v 1 l -1,-1 z m 1,0 h 1 v 1 h -1 z m 1,0 v -1 h 1 v 1 z m 0,-1 h -1 v -1 h 1 z m 0,-1 v -1 h 1 v 1 z"
- id="rect39177"
- sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient39287);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 174.52599,77.52344 v -4.000002 h 2.99999"
- id="rect39133"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g39149"
- transform="translate(1,-9)">
- <g
- transform="translate(8,8)"
- id="g39151">
- <rect
- ry="0"
- y="72.5"
- x="173.5"
- height="6"
- width="5"
- id="rect39153"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient39289);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <g
- style="fill:#333333"
- transform="rotate(180,176,72)"
- id="g39155" />
- <rect
- ry="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient39291);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect39157"
- width="2.9999952"
- height="4.0000029"
- x="174.52599"
- y="73.523438" />
- </g>
- </g>
- <g
- transform="translate(-7)"
- id="g39163">
- <g
- id="g39165"
- transform="translate(8,8)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient39293);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect39167"
- width="5"
- height="6"
- x="173.5"
- y="72.5"
- ry="0" />
- <g
- id="g39169"
- transform="rotate(180,176,72)"
- style="fill:#333333" />
- <rect
- y="73.523438"
- x="174.52599"
- height="4.0000029"
- width="2.9999952"
- id="rect39171"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient39295);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- ry="0" />
- </g>
- </g>
- </g>
- </g>
- <g
- style="display:inline"
- transform="translate(168,-37)"
- id="ICON_SNAP_VERTEX">
- <g
- style="display:inline;opacity:0.5"
- id="g39108"
- transform="translate(69,-142)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect39110"
- width="16"
- height="16"
- x="-64"
- y="336" />
- <g
- transform="translate(1)"
- id="g39112">
- <g
- transform="translate(-386,446.5)"
- id="g39114">
- <path
- id="path39116"
- d="m 329.5,-108.25 -5.5,2 v 6.75 l 5.5,3 5.5,-3 v -6.75 z"
- style="fill:#552200;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#c9c9c9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06898749px;marker:none;enable-background:accumulate"
- d="m 324,-99.5 v -7 l 6,-1.75 v 11.5 l -0.5,0.25 z"
- id="path39118"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(179,-179)"
- id="g39120">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89401144px;marker:none;enable-background:accumulate"
- d="m 156,79.5 v -7 l -5,-1.75 v 11.5 z"
- id="path39122"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 145,72.5 5.5,-2 5.5,2 -5.5,2.5 z"
- id="path39124"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="fill:none;stroke:url(#linearGradient39008);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 334.5,-106.5 v 6.75 l -5,2.75 -5,-2.75 v -6.75"
- id="path39126"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient39010);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- id="rect39128"
- width="1"
- height="7.75"
- x="-57"
- y="342" />
- <path
- style="fill:none;stroke:url(#linearGradient39012);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -61,340.65468 c 0,0 4.5,2 4.5,2 l 4.5,-2"
- id="path39130"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <rect
- y="197"
- x="7.0214434"
- height="4"
- width="3.9785564"
- id="rect37868-0-11"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.12000002;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="204"
- x="7.0214434"
- height="3"
- width="3.9785564"
- id="rect37868-0-7"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.12000002;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- id="g39132"
- transform="matrix(0.8303712,0,0,0.8404094,-87.641227,155.05106)">
- <g
- id="g39134">
- <path
- id="path39136"
- d="m 115.18474,49.326679 h 0.0443 c 0.98532,0 1.77856,0.793241 1.77856,1.778566 v 1.46e-4 c 0,0.985326 -0.79324,1.778566 -1.77856,1.778566 h -0.0443 c -0.98533,0 -1.77857,-0.79324 -1.77857,-1.778566 v -1.46e-4 c 0,-0.985325 0.79324,-1.778566 1.77857,-1.778566 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1.78961492;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path39138"
- d="m 116.40772,49.919572 c -0.80364,0 -1.60728,1.2e-5 -2.41092,1.2e-5 0,0.793735 0,1.587459 0,2.381206 0.80364,0 1.60728,-1.2e-5 2.41092,-1.2e-5 0,-0.793735 0,-1.587471 0,-2.381206 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1.78961492;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 115.18474,57.651268 h 0.0443 c 0.98532,0 1.77856,0.793241 1.77856,1.778566 v 1.46e-4 c 0,0.985326 -0.79324,1.778566 -1.77856,1.778566 h -0.0443 c -0.98533,0 -1.77857,-0.79324 -1.77857,-1.778566 v -1.46e-4 c 0,-0.985325 0.79324,-1.778566 1.77857,-1.778566 z"
- id="path37768"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 116.40772,58.244161 c -0.80364,0 -1.60728,1.2e-5 -2.41092,1.2e-5 0,0.793735 0,1.587459 0,2.381206 0.80364,0 1.60728,-1.2e-5 2.41092,-1.2e-5 0,-0.793735 0,-1.587471 0,-2.381206 z"
- id="path37770"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- style="display:inline"
- transform="translate(168,-37)"
- id="ICON_SNAP_EDGE">
- <g
- transform="translate(90,-142)"
- id="g39142"
- style="display:inline;opacity:0.5">
- <rect
- y="336"
- x="-64"
- height="16"
- width="16"
- id="rect39144"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g39146"
- transform="translate(1)">
- <g
- id="g39148"
- transform="translate(-386,446.5)">
- <path
- sodipodi:nodetypes="ccccccc"
- style="fill:#552200;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 329.5,-108.25 -5.5,2 v 6.75 l 5.5,3 5.5,-3 v -6.75 z"
- id="path39150"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path39152"
- d="m 324,-99.5 v -7 l 6,-1.75 v 11.5 l -0.5,0.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#c9c9c9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06898749px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <g
- id="g39154"
- transform="translate(179,-179)">
- <path
- sodipodi:nodetypes="ccccc"
- id="path39156"
- d="m 156,79.5 v -7 l -5,-1.75 v 11.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89401144px;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path39158"
- d="m 145,72.5 5.5,-2 5.5,2 -5.5,2.5 z"
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccccc"
- id="path39160"
- d="m 334.5,-106.5 v 6.75 l -5,2.75 -5,-2.75 v -6.75"
- style="fill:none;stroke:url(#linearGradient39014);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="342"
- x="-57"
- height="7.75"
- width="1"
- id="rect39162"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient39016);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccc"
- id="path39164"
- d="m -61,340.65468 c 0,0 4.5,2 4.5,2 l 4.5,-2"
- style="fill:none;stroke:url(#linearGradient39018);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <rect
- y="198"
- x="29"
- height="8"
- width="2.0000007"
- id="rect37868-0-14"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.12000002;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="201"
- x="32.021442"
- height="7"
- width="3.9785564"
- id="rect37868-0-3"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.12000002;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-1081.9421,-238.02038)"
- style="display:inline;fill:#ffeeaa"
- id="g39166">
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;fill:#d5e5ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- id="rect39168"
- width="1.9820247"
- height="8.0116062"
- x="1109.4872"
- y="435.4964"
- transform="skewY(0.00121619)" />
- <rect
- transform="skewY(0.00210615)"
- y="435.97955"
- x="1109.958"
- height="7.0000257"
- width="0.99999994"
- id="rect39170"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- transform="skewY(0.00121619)"
- y="438.49628"
- x="1114.4713"
- height="8.0116062"
- width="1.9820247"
- id="rect37773"
- style="display:inline;fill:#d5e5ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero"
- id="rect37775"
- width="0.99999994"
- height="7.0000257"
- x="1114.9421"
- y="438.97937"
- transform="skewY(0.00210615)" />
- </g>
- </g>
- <g
- style="display:inline"
- transform="translate(168,-37)"
- id="ICON_SNAP_FACE">
- <g
- style="display:inline;opacity:0.5"
- id="g39174"
- transform="translate(111,-142)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect39176"
- width="16"
- height="16"
- x="-64"
- y="336" />
- <g
- transform="translate(1)"
- id="g39178">
- <g
- transform="translate(-386,446.5)"
- id="g39180">
- <path
- id="path39182"
- d="m 329.5,-108.25 -5.5,2 v 6.75 l 5.5,3 5.5,-3 v -6.75 z"
- style="fill:#552200;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#c9c9c9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06898749px;marker:none;enable-background:accumulate"
- d="m 324,-99.5 v -7 l 6,-1.75 v 11.5 l -0.5,0.25 z"
- id="path39184"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(179,-179)"
- id="g39186">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89401144px;marker:none;enable-background:accumulate"
- d="m 156,79.5 v -7 l -5,-1.75 v 11.5 z"
- id="path39188"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 145,72.5 5.5,-2 5.5,2 -5.5,2.5 z"
- id="path39190"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="fill:none;stroke:url(#linearGradient39020);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 334.5,-106.5 v 6.75 l -5,2.75 -5,-2.75 v -6.75"
- id="path39192"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient39022);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- id="rect39194"
- width="1"
- height="7.75"
- x="-57"
- y="342" />
- <path
- style="fill:none;stroke:url(#linearGradient39024);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -61,340.65468 c 0,0 4.5,2 4.5,2 l 4.5,-2"
- id="path39196"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <rect
- y="201"
- x="54"
- height="7"
- width="2.9785564"
- id="rect37868-0-57"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.12000002;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-1080.9861,-240)"
- style="display:inline;fill:#ffeeaa"
- id="g39198">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path39200"
- d="m 1130.4859,445.25 v -7.5 l 6,2.75 v 8 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient39026);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_MATERIAL_DATA"
- transform="translate(0,128.00001)">
- <rect
- y="365"
- x="194"
- height="16"
- width="16"
- id="rect28809"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- id="g23255"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(1.0004639,0,0,0.9963165,-69.122722,304.28985)">
- <circle
- id="path23257"
- style="display:inline;overflow:visible;visibility:visible;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.86138636;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.81218,0,0,0.815735,163.7897,-27.2907)"
- cx="132"
- cy="118"
- r="8" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 270.98701,62.965769 0.0109,7.256732 c -1.99907,0 -3.99814,-0.250925 -6.00812,-1.234549 0,-3.324245 2.68676,-6.022183 5.99722,-6.022183 z m 0.0109,7.256732 c 1.99908,0 3.99815,-0.250925 5.98632,-1.234549 0,3.324245 -2.68675,6.022182 -5.99722,6.022182 z"
- id="path23259"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <circle
- style="fill:url(#linearGradient23274);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path23261"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.749782,0,0,0.752489,172.03052,-19.77379)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.749782,0,0,0.752489,172.03052,-19.77379)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path23263"
- style="opacity:0.1;fill:url(#linearGradient23276);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.624782,0,0,0.627489,188.53052,-5.0185058)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path23265"
- style="opacity:0.8;fill:url(#linearGradient23278);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.40226042;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 267.70545,67.406839 c 0.34141,-0.888253 0.96594,-1.399916 1.66978,-1.680902"
- id="path23267"
- sodipodi:nodetypes="cs"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path23269"
- d="m 274.98515,70.995347 c 0,0.953349 -1,1.906699 -2,1.906699"
- style="opacity:0.6;fill:none;stroke:#ffe680;stroke-width:1.00161445px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter13996)"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path23271"
- style="display:inline;fill:none;stroke:url(#linearGradient23280);stroke-width:1.45689511;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6875,0,0,0.6875,180.25,-12.125)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- id="ICON_OBJECT_DATAMODE">
- <rect
- y="514.00012"
- x="5"
- height="15.99988"
- width="16"
- id="rect40163"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#f6d0a6;fill-opacity:1;fill-rule:evenodd;marker:none;enable-background:accumulate" />
- <g
- id="g40089"
- transform="translate(70,178)">
- <g
- id="g40091"
- transform="translate(-386,446.5)">
- <path
- sodipodi:nodetypes="ccccccc"
- style="fill:#422200;fill-opacity:1;fill-rule:evenodd;stroke:#281500;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 329.5,-108.25 -5.5,2 v 6.75 l 5.5,3 5.5,-3 v -6.75 z"
- id="path40093"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path40095"
- d="m 324,-99.5 v -7 l 6,-1.75 v 11.5 l -0.5,0.25 z"
- style="fill:#efa351;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <g
- id="g40097"
- transform="translate(179,-179)">
- <path
- sodipodi:nodetypes="ccccc"
- id="path40099"
- d="m 156,79.5 v -7 l -5,-1.75 v 11.5 z"
- style="fill:#915515;fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path40101"
- d="m 145,72.5 5.5,-2 5.5,2 -5.5,2.5 z"
- style="fill:#f5ca9b;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccccc"
- id="path40103"
- d="m 334.5,-106.5 v 6.75 l -5,2.75 -5,-2.75 v -6.75"
- style="fill:none;stroke:url(#linearGradient40171);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="342"
- x="-57"
- height="7.75"
- width="1"
- id="rect40106"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient40173);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccc"
- id="path40109"
- d="m -61,340.65468 c 0,0 4.5,2 4.5,2 l 4.5,-2"
- style="fill:none;stroke:url(#linearGradient40175);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_MATERIAL"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(1.0004639,0,0,0.9963165,-237.12363,495.28986)">
- <circle
- id="path57401"
- style="display:inline;overflow:visible;visibility:visible;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.86138636;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.81218,0,0,0.815735,163.7897,-27.2907)"
- cx="132"
- cy="118"
- r="8" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 270.98701,62.965769 0.0109,7.256732 c -1.99907,0 -3.99814,-0.250925 -6.00812,-1.234549 0,-3.324245 2.68676,-6.022183 5.99722,-6.022183 z m 0.0109,7.256732 c 1.99908,0 3.99815,-0.250925 5.98632,-1.234549 0,3.324245 -2.68675,6.022182 -5.99722,6.022182 z"
- id="path57403"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <circle
- style="fill:url(#linearGradient57417);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path57405"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.749782,0,0,0.752489,172.03052,-19.77379)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.749782,0,0,0.752489,172.03052,-19.77379)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path57407"
- style="opacity:0.1;fill:url(#linearGradient57419);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.624782,0,0,0.627489,188.53052,-5.0185058)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path57409"
- style="opacity:0.8;fill:url(#linearGradient57421);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.40226042;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 267.70545,67.406839 c 0.34141,-0.888253 0.96594,-1.399916 1.66978,-1.680902"
- id="path57411"
- sodipodi:nodetypes="cs"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path57413"
- d="m 274.98515,70.995347 c 0,0.953349 -1,1.906699 -2,1.906699"
- style="opacity:0.6;fill:none;stroke:#ffe680;stroke-width:1.00161445px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter13996)"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path57415"
- style="display:inline;fill:none;stroke:url(#linearGradient57423);stroke-width:1.45689511;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6875,0,0,0.6875,180.25,-12.125)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- style="display:inline"
- id="ICON_MOD_CLOTH"
- transform="translate(73,-15)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect22222"
- width="16"
- height="16"
- x="-68"
- y="256" />
- <g
- id="g22818">
- <path
- style="display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m -66.5,257.5 h 5 c 0,1 3,1 3,0 h 5 v 5 h -2 l -2.9e-4,8 -8.99971,-5e-5 V 262.5 h -2 z"
- id="path22864"
- sodipodi:nodetypes="ccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccc"
- id="rect22236"
- d="m -66.5,257.5 h 4.75 c -0.5,3.25 4,3.25 3.5,0 h 4.75 v 5 h -2 l -2.9e-4,8 -8.99971,-5e-5 V 262.5 h -2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient22905);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient22891);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999863;marker:none;enable-background:accumulate"
- d="m -66,258 h 4 c 0,2.5 4,2.5 4,0 h 4 v 4 h -2 v 8 h -8 v -8 h -2 z"
- id="path23050"
- sodipodi:nodetypes="ccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- id="path23055"
- d="m -66,258 h 4 c 0,0.61505 0.242101,1.07878 0.607179,1.3912 L -61.5,259.5 -64,262 h -2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient22893);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999863;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient22895);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999863;marker:none;enable-background:accumulate"
- d="m -54,258 h -4 c 0,0.61505 -0.242101,1.07878 -0.607179,1.3912 L -58.5,259.5 -56,262 h 2 z"
- id="path23059"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- style="opacity:0.7;fill:none;stroke:url(#linearGradient22897);stroke-width:1.00000012px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m -56.5,262.75 v 6.75 h -7 V 262"
- id="path22238"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path22276"
- d="m -56.5,269.5 h -7 m -2,-8 v -3 m 11,0 v 3 m -8,-3 c 0.5,2.75 4.5,2.75 5,0"
- style="fill:none;stroke:url(#linearGradient22899);stroke-width:1.00000012px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path23065"
- d="m -63.5,264.5 c 0.75,3.5 4.25,5.5 7,3"
- style="opacity:0.85;fill:none;stroke:url(#linearGradient22901);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3.9000001;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.85;fill:none;stroke:url(#linearGradient22903);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3.9000001;stroke-dasharray:none;stroke-opacity:1"
- d="m -63.5,263.5 c 1,3.5 4.25,5.5 7,3"
- id="path23063"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <g
- id="g23071"
- transform="translate(0,1)"
- style="opacity:0.9">
- <path
- style="opacity:0.4;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -60.5,262.5 h 1 v 2.75"
- id="path23069"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path23067"
- d="m -60.5,262.5 h 1 v 2.75"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- transform="translate(-105,-229)"
- id="ICON_PLAY_AUDIO"
- style="display:inline">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect22902"
- width="16"
- height="16"
- x="257"
- y="449" />
- <g
- transform="translate(14.081669,359)"
- id="g22904"
- style="opacity:0.6;stroke:#162d50">
- <path
- style="opacity:0.9;fill:none;stroke:#162d50;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 253.41833,95.5 c 1.5,1.5 1.5,3.5 0,5"
- id="path22906"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:none;stroke:#162d50;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 255.41833,93.5 c 2.75,2.75 2.75,6.25 0,9"
- id="path22908"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="opacity:0.9;fill:none;stroke:#d5e5ff;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 267.5,454.5 c 1.5,1.5 1.5,3.5 0,5"
- id="path22910"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccc"
- style="display:inline;fill:url(#linearGradient22933);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 264.58167,451.5 H 263.5 l -3,3 c 0,-0.554 -0.446,-1 -1,-1 h -1 c -0.554,0 -1,0.446 -1,1 v 5 c 0,0.554 0.446,1 1,1 h 1 c 0.554,0 1,-0.446 1,-1 l 3,3 h 1.08167 z"
- id="path22912"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient22935);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 258.5,459.5 h 1 l 1,-1 3.25,3"
- id="path22914"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- id="path22916"
- d="m 260.5,454.5 v 4.9091"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient22937);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path22918"
- d="m 258.5,455.5 h 1"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 262.59506,453.5 1,-1"
- id="path22920"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 258.5,454.63598 h 1"
- id="path22922"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path22924"
- d="m 262.59506,454.5 1,-1"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path22926"
- d="m 269.5,452.5 c 2.75,2.75 2.75,6.25 0,9"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:none;stroke:#d5e5ff;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient22939);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 263.5,452.5 v 9"
- id="path22928"
- inkscape:connector-curvature="0" />
- <path
- id="path22931"
- d="m 258.5,454.3 v 5.4"
- style="fill:none;stroke:url(#linearGradient22941);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_MOD_EXPLODE"
- transform="translate(-399,-19)">
- <rect
- transform="scale(-1,1)"
- y="260"
- x="-441"
- height="16"
- width="16"
- id="rect22167"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g23378">
- <g
- transform="translate(-36.00033,108.00006)"
- id="g22183">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23445);fill-opacity:1;fill-rule:nonzero;marker:none;enable-background:accumulate"
- d="m 472.50029,156.5 c -1.9309,0 -3,0.66961 -3,1.5 v 8 c 0,0.83039 1.0691,1.5 3,1.5 1.9309,0 3,-0.66961 3,-1.5 v -8 c 0,-0.83039 -1.0691,-1.5 -3,-1.5 z"
- id="path22187"
- sodipodi:nodetypes="cccsccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23447);stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 470.50029,158.5 v 7.51105 c 0,0.54648 1,0.54648 2,0.54648 1,0 2,0 2,-0.55753 v -7.51105"
- id="path22189"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:#eff6ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73959124;marker:none;enable-background:accumulate"
- id="path22199"
- transform="matrix(0.9067635,0,0,1.3047091,374.56954,447.97555)"
- cx="108"
- cy="-222"
- rx="3.3084693"
- ry="1.2798798" />
- <path
- sodipodi:nodetypes="cccsccc"
- id="path22203"
- d="m 472.50029,156.5 c -1.9309,0 -3,0.5 -3,1.5 v 8 c 0,0.83039 1.0691,1.5 3,1.5 1.9309,0 3.00029,-0.75001 3,-1.5 v -8 c 0,-1 -1.0691,-1.5 -3,-1.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:0.80000001;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="cssc"
- id="path23068"
- d="m 436.5,265.5 v -0.75 c 0,-4.25 -7,-4.25 -7,0 v 2.75"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.55;fill:none;stroke:#0b1728;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:none;stroke:#e1e08e;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect22214"
- width="2.9999998"
- height="3"
- x="428"
- y="266"
- rx="1.2002208"
- ry="1.2002208" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:none;stroke:#0b1728;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 436.5,265.5 v -0.75"
- id="path23343"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#d7e3f4;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 436.5,265.5 v -0.75 c 0,-4.25 -7,-4.25 -7,0 v 2.75"
- id="path22210"
- sodipodi:nodetypes="cssc"
- inkscape:connector-curvature="0" />
- <rect
- rx="1.2002209"
- y="266"
- x="428"
- height="3"
- width="3"
- id="rect22216"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#a09f2c;fill-opacity:1;fill-rule:nonzero;stroke:#d6d562;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate"
- ry="1.2002209" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path23005"
- d="m 427,266 c 0,-0.33336 10e-6,-0.6667 10e-6,-1.00006 0.33335,0 0.6667,0 1.00005,0 0,0.33336 -1e-5,0.6667 -1e-5,1.00006 -0.33335,0 -0.6667,0 -1.00005,0 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#8c8b25;fill-opacity:1;fill-rule:nonzero;stroke:#8c8b0a;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#8c8b25;fill-opacity:1;fill-rule:nonzero;stroke:#8c8b0a;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 427,270 c 0,-0.33336 10e-6,-0.6667 10e-6,-1.00006 0.33335,0 0.6667,0 1.00005,0 0,0.33336 -1e-5,0.6667 -1e-5,1.00006 -0.33335,0 -0.6667,0 -1.00005,0 z"
- id="path23007"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path23009"
- d="m 430.99994,270 c 0,-0.33336 1e-5,-0.6667 1e-5,-1.00006 0.33335,0 0.6667,0 1.00005,0 0,0.33336 -10e-6,0.6667 -10e-6,1.00006 -0.33335,0 -0.6667,0 -1.00005,0 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#8c8b25;fill-opacity:1;fill-rule:nonzero;stroke:#8c8b0a;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#8c8b25;fill-opacity:1;fill-rule:nonzero;stroke:#8c8b0a;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 430.99994,266.00006 c 0,-0.33336 1e-5,-0.6667 1e-5,-1.00006 0.33335,0 0.6667,0 1.00005,0 0,0.33336 -10e-6,0.6667 -10e-6,1.00006 -0.33335,0 -0.6667,0 -1.00005,0 z"
- id="path23012"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#545306;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;enable-background:accumulate"
- d="M 428.25,266.25 429,265.5 h 1 l 0.75,0.75 0.75,0.75 v 1 l -0.75,0.75 -0.75,0.75 h -1 l -0.75,-0.75 -0.75,-0.75 v -1 z"
- id="rect23002"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path22218"
- d="m 428,267 c 1,0 1.99998,10e-6 2.99998,10e-6 0,0.33335 0,0.6667 0,1.00005 -1,0 -1.99998,-1e-5 -2.99998,-1e-5 0,-0.33335 0,-0.6667 0,-1.00005 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 428.99996,269 c 0,-0.99999 1e-5,-1.99995 1e-5,-2.99994 0.33335,0 0.6667,0 1.00005,0 0,0.99999 -1e-5,1.99995 -1e-5,2.99994 -0.33335,0 -0.6667,0 -1.00005,0 z"
- id="path22220"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 427,266 c 0,-0.33336 10e-6,-0.6667 10e-6,-1.00006 0.33335,0 0.6667,0 1.00005,0 0,0.33336 -1e-5,0.6667 -1e-5,1.00006 -0.33335,0 -0.6667,0 -1.00005,0 z"
- id="path23312"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path23314"
- d="m 427,270 c 0,-0.33336 10e-6,-0.6667 10e-6,-1.00006 0.33335,0 0.6667,0 1.00005,0 0,0.33336 -1e-5,0.6667 -1e-5,1.00006 -0.33335,0 -0.6667,0 -1.00005,0 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 430.99994,270 c 0,-0.33336 1e-5,-0.6667 1e-5,-1.00006 0.33335,0 0.6667,0 1.00005,0 0,0.33336 -10e-6,0.6667 -10e-6,1.00006 -0.33335,0 -0.6667,0 -1.00005,0 z"
- id="path23316"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path23318"
- d="m 430.99994,266.00006 c 0,-0.33336 1e-5,-0.6667 1e-5,-1.00006 0.33335,0 0.6667,0 1.00005,0 0,0.33336 -10e-6,0.6667 -10e-6,1.00006 -0.33335,0 -0.6667,0 -1.00005,0 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- style="opacity:0.65"
- id="g23333"
- transform="translate(464,-83)">
- <g
- id="g23320">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path23014"
- d="m -38,351 c 0,-0.33336 1e-5,-0.6667 1e-5,-1.00006 0.33335,0 0.666699,0 1.000049,0 0,0.33336 -1e-5,0.6667 -1e-5,1.00006 -0.33335,0 -0.666699,0 -1.000049,0 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#8c8b25;fill-opacity:1;fill-rule:nonzero;stroke:#504f14;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#8c8b25;fill-opacity:1;fill-rule:nonzero;stroke:#504f14;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -32.000059,351 c 0,-0.33336 1e-5,-0.6667 1e-5,-1.00006 0.33335,0 0.666699,0 1.000049,0 0,0.33336 -10e-6,0.6667 -10e-6,1.00006 -0.33335,0 -0.666699,0 -1.000049,0 z"
- id="path23016"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path23018"
- d="m -35,354 c 0,-0.33336 1e-5,-0.6667 1e-5,-1.00006 0.33335,0 0.666699,0 1.000049,0 0,0.33336 -1e-5,0.6667 -1e-5,1.00006 -0.33335,0 -0.666699,0 -1.000049,0 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#8c8b25;fill-opacity:1;fill-rule:nonzero;stroke:#504f14;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23325"
- style="fill:#ffffff;stroke:none">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;enable-background:accumulate"
- d="m -38,351 c 0,-0.33336 1e-5,-0.6667 1e-5,-1.00006 0.33335,0 0.666699,0 1.000049,0 0,0.33336 -1e-5,0.6667 -1e-5,1.00006 -0.33335,0 -0.666699,0 -1.000049,0 z"
- id="path23327"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path23329"
- d="m -32.000059,351 c 0,-0.33336 1e-5,-0.6667 1e-5,-1.00006 0.33335,0 0.666699,0 1.000049,0 0,0.33336 -10e-6,0.6667 -10e-6,1.00006 -0.33335,0 -0.666699,0 -1.000049,0 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;enable-background:accumulate"
- d="m -35,354 c 0,-0.33336 1e-5,-0.6667 1e-5,-1.00006 0.33335,0 0.666699,0 1.000049,0 0,0.33336 -1e-5,0.6667 -1e-5,1.00006 -0.33335,0 -0.666699,0 -1.000049,0 z"
- id="path23331"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- </g>
- <g
- id="ICON_MOD_MESHDEFORM"
- transform="translate(4.2e-4,2.056923)">
- <g
- style="display:inline"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g22355"
- transform="translate(296.99995,249.99998)">
- <rect
- transform="skewY(3.0070309e-4)"
- y="15.999177"
- x="155.00008"
- height="3.9999785"
- width="4.0000005"
- id="rect22359"
- style="display:inline;fill:url(#linearGradient23531);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;fill:none;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- id="rect22365"
- width="4.9999776"
- height="4.9999595"
- x="154.50008"
- y="15.499179"
- transform="skewY(3.0070309e-4)" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path22367"
- d="m 155.50007,19.49999 -5.5e-4,-3.000005 2.99988,5e-6 6.8e-4,3 z"
- style="opacity:0.8;fill:none;stroke:url(#linearGradient23533);stroke-width:1.00000012px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(187.99958,-21.0368)"
- id="g23427">
- <g
- transform="translate(170.04549,179.51905)"
- id="g23429"
- style="opacity:0.7">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#214478;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 90.45451,103.98095 v 11 h 11 v -11 z"
- id="path23431"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path23433"
- d="m 90.45451,103.98095 v 11 h 11 v -11 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#afc6e9;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23435">
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="293.5"
- x="270.49985"
- height="3"
- width="2.9998772"
- id="rect23438"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect23440"
- width="2.9998772"
- height="3"
- x="258.50024"
- y="281.5368"
- ry="1.4999386"
- rx="1.4999386" />
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="293.49997"
- x="258.49969"
- height="3"
- width="2.9998772"
- id="rect23442"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 273,294 c -0.6694,0 -1.3388,10e-6 -2.0082,10e-6 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path23444"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path23446"
- d="m 261,294 c -0.6694,0 -1.3388,10e-6 -2.0082,10e-6 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path23448"
- d="m 261.00042,282.0368 c -0.6694,0 -1.3388,10e-6 -2.0082,10e-6 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect23450"
- width="2.9998772"
- height="3"
- x="270.49985"
- y="281.5"
- ry="1.4999386"
- rx="1.4999386" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path23452"
- d="m 273,282 c -0.6694,0 -1.3388,10e-6 -2.0082,10e-6 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- id="ICON_MOD_BUILD"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect31966"
- width="16"
- height="16"
- x="47"
- y="260" />
- <g
- transform="translate(0,21)"
- id="g40631">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#87aade;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect40597"
- width="5"
- height="3"
- x="56.500004"
- y="240.5" />
- <path
- sodipodi:nodetypes="ccccccc"
- id="path40599"
- d="m 48.5,244.5 h 5 v 3 h 8 v 6 h -13 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient40965);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccccccccc"
- d="M 49,250.5 H 61 M 56.5,248 v 2.5 m -5,-2.5 v 2.5 m 2,2.5 v -2.5 m 5,2.5 v -2.5 m -5.5,-3 h -4"
- style="fill:none;stroke:url(#linearGradient40967);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- id="path40601"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 48.5,244.5 h 5 v 3 h 8 v 6 h -13 z"
- id="path40603"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path40605"
- d="m 49.5,246.5 v -1 h 3"
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 49.5,249.5 v -1 h 1"
- id="path40615"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 57.5,242.5 v -1 h 3"
- id="use40619"
- inkscape:connector-curvature="0" />
- <use
- x="0"
- y="0"
- xlink:href="#path40605"
- id="use40963"
- transform="translate(3,3)"
- width="600"
- height="512" />
- <use
- x="0"
- y="0"
- xlink:href="#path40605"
- id="use40969"
- transform="translate(8,3)"
- width="600"
- height="512"
- style="opacity:0.9" />
- <use
- x="0"
- y="0"
- xlink:href="#path40605"
- id="use40971"
- transform="translate(0,6)"
- width="600"
- height="512" />
- <use
- x="0"
- y="0"
- xlink:href="#path40605"
- id="use40973"
- transform="translate(5,6)"
- width="600"
- height="512" />
- <use
- x="0"
- y="0"
- xlink:href="#path40615"
- id="use40975"
- transform="translate(10,3)"
- width="600"
- height="512"
- style="opacity:0.9" />
- </g>
- </g>
- <g
- id="ICON_MOD_BOOLEAN"
- transform="translate(0,1)">
- <rect
- y="260"
- x="215"
- height="16"
- width="16"
- id="rect40827"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g40829"
- transform="translate(67.999923,253.00001)">
- <path
- style="display:inline;fill:url(#linearGradient40843);fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 148.50005,9.5 7.00001,3.68e-5 1e-5,2.9999632 h -4 v 4 l -3.00002,0.0039 V 9.49999 Z"
- id="path40831"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <rect
- transform="skewY(3.0070309e-4)"
- y="14.499187"
- x="153.49606"
- height="6.9999576"
- width="7.004014"
- id="rect40833"
- style="display:inline;fill:url(#linearGradient40845);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- sodipodi:nodetypes="ccccccc"
- id="path40835"
- d="m 148.50005,9.5 7.00001,3.68e-5 1e-5,2.9999632 h -4 v 4 l -3.00002,0.0039 V 9.49999 Z"
- style="display:inline;fill:none;stroke:#0b1728;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 149.50015,15.500012 7e-5,-5.000011 h 4.99993"
- id="path40837"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;fill:none;stroke:#0b1728;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- id="rect40839"
- width="7.004014"
- height="6.9999576"
- x="153.49606"
- y="14.499187"
- transform="skewY(3.0070309e-4)" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path40841"
- d="m 154.50063,20.499995 6e-5,-4.999998 h 4.99933 l 6e-5,4.999993 z"
- style="opacity:0.7;fill:none;stroke:url(#linearGradient40847);stroke-width:1.00000012px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(404,214.02012)"
- id="ICON_MOD_BEVEL">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect12989"
- width="16"
- height="16"
- x="63"
- y="48" />
- <g
- id="g12991"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- style="display:inline"
- transform="matrix(1.0003553,0,0,0.9995949,19.983834,-40.953347)">
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;opacity:0.35;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80001998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect13004"
- width="10.996093"
- height="11.004457"
- x="45.5"
- y="91.49041" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;opacity:0.2;fill:none;stroke:url(#linearGradient23510);stroke-width:1.0000248px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 46.499645,101.49618 v -9.003652 l 8.996803,-0.0017 v 9.003642 l -8.996803,0.002 z"
- id="path13009"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23512);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80001998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40018749;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 53.247247,91.490409 3.248846,0.0015 V 102.49484 L 45.5,102.49485 v -3.251316 l 7.747247,-7.753141 z"
- id="rect12993"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:url(#linearGradient23514);stroke-width:1.0000248px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 46.499451,101.49446 1.94e-4,-1.750708 7.247425,-7.252938 h 1.749378 l 10e-7,9.001936 -8.996998,0.002 z"
- id="path12995"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_CONSTRAINT_DATA"
- transform="translate(-42.01991,-103.9242)">
- <rect
- transform="rotate(-90)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect23589"
- width="16"
- height="16"
- x="-382.01102"
- y="403.99695" />
- <g
- id="g23591">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#04090f;stroke-width:2.89999986;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect23594"
- width="8.4671335"
- height="5.6703448"
- x="-33.946648"
- y="-559.34406"
- ry="2.143424"
- rx="2.1489482"
- transform="rotate(135)" />
- <rect
- rx="2.1489475"
- ry="2.1434233"
- y="-557.84644"
- x="-28.308893"
- height="5.5734196"
- width="8.5043812"
- id="rect23596"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#04090f;stroke-width:2.89999986;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="rotate(135)" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient24349);stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 411.51991,375.4242 -0.5,-0.5 c -0.69131,-0.69131 -0.87523,-2.06255 1.2e-4,-2.92851 l 3.01169,-2.97968 c 0.87526,-0.86596 2.29698,-0.69523 2.98828,-0.004 l 0.52541,0.52542"
- id="path23598"
- sodipodi:nodetypes="cssssc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:0.10736198;fill-rule:nonzero;stroke:#04090f;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 408.98474,371.9281 c 0.84182,-0.84182 2.19551,-0.84356 3.03517,-0.004"
- id="path23561"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cssssc"
- id="path24352"
- d="m 411.51991,375.4242 -0.5,-0.5 c -0.69131,-0.69131 -0.87523,-2.06255 1.2e-4,-2.92851 l 3.01169,-2.97968 c 0.87526,-0.86596 2.29698,-0.69523 2.98828,-0.004 l 0.52541,0.52542"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.68999999;fill:none;stroke:url(#radialGradient24354);stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path23600"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient24341);stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 407.52985,379.36839 c 0.5623,0.50813 1.81497,0.33519 2.49825,-0.3481 l 2.95063,-3.084 c 0.87062,-0.87061 0.69197,-2.30021 0.004,-2.98827 l -1.02382,-1.02382 c -0.69131,-0.69131 -2.11766,-0.86672 -2.98828,0.004 l -2.95063,3.08399 c -0.87062,0.87063 -0.62293,2.42889 -0.004,2.98829 l 1.51384,1.368 z"
- sodipodi:nodetypes="ccccccczz"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccczz"
- d="m 407.52985,379.36839 c 0.5623,0.50813 1.81497,0.33519 2.49825,-0.3481 l 2.95063,-3.084 c 0.87062,-0.87061 0.69197,-2.30021 0.004,-2.98827 l -1.02382,-1.02382 c -0.69131,-0.69131 -2.11766,-0.86672 -2.98828,0.004 l -2.95063,3.08399 c -0.87062,0.87063 -0.62293,2.42889 -0.004,2.98829 l 1.51384,1.368 z"
- style="fill:none;stroke:url(#radialGradient23610);stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="path23602"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:0.10736198;fill-rule:nonzero;stroke:#04090f;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 415.01991,375.9242 c -0.84182,0.84182 -2.16034,0.83966 -3,0"
- id="path23563"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csssssc"
- id="path23604"
- d="m 417.52541,369.52542 0.49841,0.4984 c 0.68807,0.68805 0.86671,2.11766 -0.004,2.98828 l -2.99178,2.99178 c -0.68328,0.68328 -1.74799,0.71589 -2.49825,0.34809 -0.18628,-0.0913 -0.37463,-0.2925 -0.51148,-0.42936 l -0.7484,-0.74841"
- style="fill:none;stroke:url(#radialGradient23612);stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_MOD_SIMPLEDEFORM"
- transform="translate(-21,2)">
- <rect
- y="260"
- x="530"
- height="16"
- width="16"
- id="rect23587"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;opacity:0.35;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect23591"
- width="4.0000005"
- height="15"
- x="533.5"
- y="260.5" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient22847);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40018749;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 533.5,275.5 h 4 v -1 c 0,-2.5 2,-5 5,-5 h 1 v -4 h -1 c -5.17135,0 -9,3.25 -9,9 z"
- id="path23595"
- sodipodi:nodetypes="ccssccssc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;opacity:0.2;fill:none;stroke:url(#linearGradient22849);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 534.50003,274.5 v -12.99752 l 1.99998,-0.002 V 274.498 Z"
- id="path23593"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path23709"
- d="m 542.5,266.5 c -4.89085,0.22833 -7.75,2.75 -8,8"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient22851);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_TEXTURE_SHADED"
- transform="translate(251.98387,128)"
- style="display:inline">
- <rect
- y="428"
- x="26.016129"
- height="16.000002"
- width="16.000006"
- id="rect23350"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect23352"
- width="16"
- height="16"
- x="26"
- y="428" />
- <g
- style="display:inline"
- id="g23354"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(1.0004639,0,0,0.9963165,-237.11238,367.28985)">
- <circle
- id="path23356"
- style="display:inline;overflow:visible;visibility:visible;fill:#724c4c;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.10749674;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.81218,0,0,0.815735,163.7897,-27.2907)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.7480284,0,0,0.7480284,172.26025,-19.267349)"
- style="display:inline;overflow:visible;visibility:visible;fill:#f9f9f9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.16363633;marker:none;enable-background:accumulate"
- id="path23358"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.7478104,0,0,0.7510504,172.29077,-19.598754)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path23360"
- style="opacity:0.6;fill:url(#linearGradient23373);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <path
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccc"
- id="path40668"
- d="m 269.98748,62.965763 c -1.39411,0.455357 -2.67784,0.634788 -4.24803,3.011091 h 2.24896 z m 0.99954,0 v 3.011091 h 2.99861 l -1.99908,-3.011091 z m 2.99861,3.011091 0.99953,3.011091 h 1.99907 c 0.006,-0.929403 -0.1914,-1.917894 -0.74965,-3.011091 z m 0.99953,3.011091 h -3.99814 v 3.011092 h 2.49884 z m -3.99814,3.011092 h -2.99861 l 1.99907,3.011091 h 0.99954 z m -2.99861,0 -0.99954,-3.011092 h -1.99907 c -0.006,0.929404 0.1914,1.917895 0.74965,3.011092 z m -0.99954,-3.011092 h 3.99815 v -3.011091 h -2.49884 z m 7.24312,3.011092 -1.85125,3.011091 c 1.3675,-0.485137 2.19971,-0.728674 3.85384,-3.011091 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23375);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#990d18;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 274.00069,72.011668 0.005,0.97479 -0.99045,0.01431 -0.0223,1.019377 -0.481,0.837285 c 0.77072,-0.321774 2.72643,-1.067855 3.69499,-2.816464 l -2.20604,-0.0293 z"
- id="path23365"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <circle
- style="opacity:0.4;fill:url(#linearGradient23377);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path40671"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.749782,0,0,0.752489,172.03052,-19.77379)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path23369"
- style="display:inline;fill:none;stroke:url(#linearGradient23379);stroke-width:1.14049816;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.7010701,0,0,0.7040938,178.4346,-14.083074)"
- cx="132"
- cy="118"
- r="8" />
- <path
- id="path23371"
- d="m 268.98793,64.973163 v 0.407752 h -0.93706 v 0.595945 h -0.56224 v 1.003697 h -0.49977 v 1.505546 h 0.99953 v -1.505546 h 0.4373 v -0.595945 h 0.56224 V 65.97686 h 1.53054 v -1.003697 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#aaccff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_MOD_MASK"
- transform="translate(21,-18.979877)">
- <rect
- y="281"
- x="509"
- height="16"
- width="16"
- id="rect22743"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g22808">
- <g
- id="g23567">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23565);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40018749;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 511.5,282.5 h 1.25 l 1.5,1 h 5.5 l 1.5,-1 h 1.25 v 8.25 c 0,6.25 -11,6.25 -11,0 z"
- id="path22751"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:url(#linearGradient23562);stroke-width:0.99999982px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 512.5,291 v -7.25 c 0.8354,1.24437 8.04784,1.12713 9,0 V 291 c 0,4.5 -9,4.5 -9,0 z"
- id="path22753"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23624"
- style="opacity:0.5">
- <g
- id="g23620">
- <rect
- y="286"
- x="514"
- height="3"
- width="3"
- id="rect23592"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;enable-background:accumulate"
- rx="1.0220957"
- ry="1.1453303" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;enable-background:accumulate"
- d="m 518.8317,286 h 1.3366 c 0.46076,0 0.8317,0.49209 0.8317,1.10334 v 0.79332 C 521,288.50791 520.62906,289 520.1683,289 h -1.3366 C 518.37094,289 518,288.50791 518,287.89666 v -0.79332 C 518,286.49209 518.37094,286 518.8317,286 Z"
- id="rect23595"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23614">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;enable-background:accumulate"
- id="rect23599"
- width="2"
- height="2"
- x="514"
- y="290" />
- <rect
- y="291"
- x="515"
- height="2"
- width="4.5"
- id="rect23601"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;enable-background:accumulate"
- id="rect23607"
- width="1.25"
- height="2"
- x="519.5"
- y="290" />
- </g>
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#0b1728;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;enable-background:accumulate"
- d="M 514,287.25 515.25,286 H 516 v 2 h -2 z"
- id="rect23575"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <rect
- y="290"
- x="514"
- height="1"
- width="1"
- id="rect23577"
- style="display:inline;overflow:visible;visibility:visible;fill:#162d50;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#162d50;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;enable-background:accumulate"
- id="rect23579"
- width="4"
- height="1"
- x="515"
- y="291" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#162d50;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;enable-background:accumulate"
- id="rect23583"
- width="1"
- height="1"
- x="519"
- y="290" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#0b1728;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;enable-background:accumulate"
- d="m 520,286 h -0.75 L 518,287.25 V 288 h 2 z"
- id="rect23597"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_SNAP_VOLUME"
- transform="translate(210,-37)"
- style="display:inline">
- <g
- style="display:inline"
- id="g24005"
- transform="translate(90,-142)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect24007"
- width="16"
- height="16"
- x="-64"
- y="336" />
- <g
- transform="translate(1)"
- id="g24009">
- <g
- transform="translate(-386,446.5)"
- id="g24011">
- <path
- id="path24028"
- d="m 329.5,-108.25 -5.5,2 v 6.75 l 5.5,3 5.5,-3 v -6.75 z"
- style="fill:#552200;fill-opacity:1;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#c9c9c9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06898749px;marker:none;enable-background:accumulate"
- d="m 324,-99.5 v -7 l 6,-1.75 v 11.5 l -0.5,0.25 z"
- id="path24030"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(179,-179)"
- id="g24032">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89401144px;marker:none;enable-background:accumulate"
- d="m 156,79.5 v -7 l -5,-1.75 v 11.5 z"
- id="path24034"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 145,72.5 5.5,-2 5.5,2 -5.5,2.5 z"
- id="path24036"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="fill:none;stroke:url(#linearGradient24052);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 334.5,-106.5 v 6.75 l -5,2.75 -5,-2.75 v -6.75"
- id="path24039"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24054);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- id="rect24041"
- width="1"
- height="7.75"
- x="-57"
- y="342" />
- <path
- style="fill:none;stroke:url(#linearGradient24056);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -61,340.65468 c 0,0 4.5,2 4.5,2 l 4.5,-2"
- id="path24044"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- id="path24062"
- d="m 202.5,135.71875 -6,2.18085 v 7.36038 l 6,3.27127 6,-3.27127 v -7.36038 z"
- style="display:inline;opacity:0.65;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;enable-background:new"
- sodipodi:nodetypes="ccccccc"
- transform="translate(-259,202)"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;fill:none;stroke:url(#linearGradient24066);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m -56.5,337.71875 -6,2.18085 v 7.36038 l 6,3.27127 6,-3.27127 v -7.36038 z"
- id="path24058"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24046"
- style="display:inline;fill:#ffeeaa"
- transform="translate(-1081.9421,-238.02038)" />
- </g>
- <g
- id="ICON_ORTHO"
- transform="translate(-16.99965,-228.99997)">
- <g
- style="opacity:0.55"
- transform="translate(21.0003,-3e-5)"
- id="g24226">
- <g
- transform="translate(43.04504,242.48228)"
- id="g24228">
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:none;stroke:#333333;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 90.45451,103.98095 v 7 l 7.00045,0.0368 v -7 z"
- id="path24230"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path24232"
- d="m 90.45451,103.98095 4.5e-4,7.03677 h 7 l -4.5e-4,-7.03677 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#989898;fill-opacity:1;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect24234"
- width="2.9998772"
- height="3"
- x="139.50012"
- y="352.5"
- ry="1.4999386"
- rx="1.4999386" />
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="344.50003"
- x="131.4998"
- height="3"
- width="2.9998772"
- id="rect24236"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect24238"
- width="2.9998772"
- height="3"
- x="131.50012"
- y="352.5"
- ry="1.4999386"
- rx="1.4999386" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path24240"
- d="m 142.00027,353 c -0.6694,0 -1.3388,10e-6 -2.0082,10e-6 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 134.00042,353.00003 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path24242"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 133.99997,345.00003 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path24244"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="344.5"
- x="139.49985"
- height="3"
- width="2.9998772"
- id="rect24246"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 142,345 c -0.6694,0 -1.3388,10e-6 -2.0082,10e-6 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path24248"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g24250"
- transform="translate(16.999682,3.99994)">
- <g
- id="g24252"
- transform="translate(43.04504,242.48228)">
- <path
- sodipodi:nodetypes="ccccc"
- id="path24254"
- d="m 90.45451,103.98095 v 7 l 7.00045,0.0368 v -7 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:none;stroke:#333333;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#c3c3c3;fill-opacity:1;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 90.45451,103.98095 4.5e-4,7.03677 h 7 l -4.5e-4,-7.03677 z"
- id="path24256"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="352.5"
- x="139.50012"
- height="3"
- width="2.9998772"
- id="rect24258"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect24260"
- width="2.9998772"
- height="3"
- x="131.4998"
- y="344.50003"
- ry="1.4999386"
- rx="1.4999386" />
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="352.5"
- x="131.50012"
- height="3"
- width="2.9998772"
- id="rect24262"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 142.00027,353 c -0.6694,0 -1.3388,10e-6 -2.0082,10e-6 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path24264"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path24266"
- d="m 134.00042,353.00003 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path24268"
- d="m 133.99997,345.00003 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect24270"
- width="2.9998772"
- height="3"
- x="139.49985"
- y="344.5"
- ry="1.4999386"
- rx="1.4999386" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path24272"
- d="m 142,345 c -0.6694,0 -1.3388,10e-6 -2.0082,10e-6 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_MONKEY"
- transform="translate(-60,60)">
- <rect
- y="-29"
- x="128"
- height="16"
- width="16"
- id="rect23087"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate" />
- <g
- id="g23937">
- <path
- sodipodi:nodetypes="cscc"
- d="m 140,-21 c 1.125,1 3.5,0.25 3.5,-1 0,-1.5 0.47443,-1.637992 -2,-1.5 -0.1033,1.43128 -0.66697,1.819388 -1.5,2.5 z"
- style="fill:#999999;fill-rule:evenodd;stroke:#000000;stroke-width:0.55000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path23906"
- inkscape:connector-curvature="0" />
- <path
- id="path23099"
- style="fill:#e6e6e6;fill-rule:evenodd;stroke:#000000;stroke-width:0.55000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 132,-21 c -1.125,1 -3.5,0.25 -3.5,-1 0,-1.5 -0.47443,-1.637992 2,-1.5 0.1033,1.43128 0.66697,1.819388 1.5,2.5 z"
- sodipodi:nodetypes="cscc"
- inkscape:connector-curvature="0" />
- <path
- id="path23090"
- style="display:inline;fill:url(#linearGradient23971);fill-rule:evenodd;stroke:none;enable-background:new"
- d="m 135.75,-25.5 -1.25,-2 h -0.75 l -3.25,2.75 v 1.25 c 0.15379,2.182132 1.3678,1.901463 3,4 v 4.5 c 0,1.5 1.5,1.5 2.5,1.5 1,0 2.5,0 2.5,-1.5 v -4.5 c 1.62605,-2.090636 2.83897,-1.844587 3,-4 v -1.25 l -3.25,-2.75 h -0.75 l -1.25,2"
- sodipodi:nodetypes="cccccccsccccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- id="rect23876"
- width="2"
- height="1"
- x="135"
- y="-16" />
- <rect
- y="-21"
- x="135"
- height="2"
- width="2.75"
- id="rect23881"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24099);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- ry="1"
- rx="1" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#f9f9f9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- id="rect23883"
- width="2"
- height="1"
- x="135"
- y="-21" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="path23902"
- transform="translate(0.5,-0.46875)"
- cx="133"
- cy="-23"
- r="1" />
- <circle
- transform="matrix(1.2143583,0,0,1.1512108,-28.054112,2.9290602)"
- id="path23125"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23973);stroke-width:0.93034029;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="133"
- cy="-23"
- r="1" />
- <circle
- transform="matrix(0.8392157,0,0,0.8382979,21.884318,-4.2140957)"
- id="path23900"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- cx="133"
- cy="-23"
- r="1" />
- <rect
- y="-15"
- x="135"
- height="1"
- width="2"
- id="rect23914"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccccccccccccccccs"
- d="m 131.88556,-21.103144 c 0.4583,0.371362 1.00745,1.072735 1.61444,1.853144 v 3.75 c 0,1.5 1.5,2 2.5,2 1,0 2.5,-0.5 2.5,-2 v -3.75 c 0.64842,-0.833678 1.23114,-1.545786 1.70766,-1.936772 M 130.5,-23.5 v -1.25 l 3,-2.75 h 1 l 1.25,1.75 h 0.5 l 1.25,-1.75 h 1 l 3,2.75 v 1.25"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- id="path23924"
- inkscape:connector-curvature="0" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23975);stroke-width:0.94079971;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path23960"
- transform="matrix(1.2116904,0,0,1.1282344,-22.693138,2.3776257)"
- cx="133"
- cy="-23"
- r="1" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="path23970"
- transform="matrix(0.8392157,0,0,0.8382979,26.893134,-4.2140957)"
- cx="133"
- cy="-23"
- r="1" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="M 136.75,-24.75 138,-26.5"
- id="path23929"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path23978"
- d="m 129.25,-22.25 0.5,-0.5"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.35;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 142.75,-22.5 -0.25,-0.25"
- id="path23980"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MOD_SHRINKWRAP"
- transform="translate(-21,-19)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect23149"
- width="16"
- height="16"
- x="-441"
- y="281"
- transform="scale(-1,1)" />
- <g
- id="g24488">
- <g
- id="g24377"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- style="display:inline"
- transform="matrix(-1.0003553,0,0,0.9995949,486.01617,193.04665)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24539);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.70001745;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40018749;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 55.496449,92.490815 4.998228,0.0015 -1e-6,6.000906 -4.998227,-4e-6 m -5.997869,0 -3.99858,10e-7 10e-7,-6.002432 h 3.998579"
- id="path24388"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:url(#linearGradient24541);stroke-width:1.0000248px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 55.496399,97.494124 3.998631,4.3e-4 10e-7,-4.003331 -3.998582,-3e-6 m -5.997771,-8.55e-4 -2.999032,8.54e-4 -1.96e-4,4.001622 h 2.99913"
- id="path24390"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="opacity:0.5"
- id="g23153"
- transform="translate(-39.00033,129)">
- <path
- sodipodi:nodetypes="cccsccc"
- id="path23156"
- d="m 472.50033,152.49994 c -1.9309,0 -3,0.66961 -3,1.5 L 469.50029,166 c 0,0.83039 1.0691,1.5 3,1.5 1.9309,0 3,-0.66961 3,-1.5 l 4e-5,-12.00006 c 0,-0.83039 -1.0691,-1.5 -3,-1.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24543);fill-opacity:1;fill-rule:nonzero;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path23158"
- d="m 470.50033,153.99994 -4e-5,12.01111 c 0,0.54648 1,0.54648 2,0.54648 1,0 2,0 2,-0.55753 l 4e-5,-12.01111"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient24545);stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <ellipse
- transform="matrix(0.9067635,0,0,1.2421435,374.56954,430.00586)"
- id="path23160"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73959124;marker:none;enable-background:accumulate"
- cx="108"
- cy="-222"
- rx="3.3084693"
- ry="1.2798798" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#1a1a1a;stroke-width:0.69999999;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"
- d="m 472.50033,152.49994 c -0.62477,0 -1.15931,0.0523 -1.5966,0.15704 -0.91421,0.21887 -1.4034,0.66652 -1.4034,1.34296 L 469.50029,166 c 0,0.83039 1.0691,1.5 3,1.5 1.9309,0 3.00029,-0.75001 3,-1.5 l 4e-5,-12.00006 c 0,-1 -1.0691,-1.5 -3,-1.5 z"
- id="path23163"
- sodipodi:nodetypes="csccsccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient24547);stroke-width:0.80000001;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"
- d="m 469.50033,154 c 0,1.5 1.0691,1.5 3,1.5 1.9309,0 3,-0.25 3,-1.5"
- id="path24484"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path24404"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24549);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 436.5,292 c -2.9e-4,-0.74999 -2.9e-4,-6.75005 0,-6.00006 2.9e-4,0.74999 -1.0691,1.5 -3,1.5 -1.9309,0 -3,-0.66961 -3,-1.5 0,-0.83039 0,5.16967 0,6.00006 0,0.83039 1.0691,1.5 3,1.5 1.9309,0 3.00029,-0.75001 3,-1.5 z"
- sodipodi:nodetypes="ccsccsc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"
- d="m 430.75001,287.5 c 0,0.54447 0.98001,0.98352 2.75,0.98352 1.77,0 2.75027,-0.49177 2.75,-0.98352"
- id="path24464"
- sodipodi:nodetypes="csc"
- inkscape:connector-curvature="0" />
- <path
- id="path24472"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient24551);stroke-width:0.80000001;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"
- d="m 430.5,285.75 v 5.5 m 6,-5.5 v 5.5"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csc"
- id="path24424"
- d="m 430.5,285.5 v 0.5 c 0,0.83039 1.0691,1.5 3,1.5 1.9309,0 3.00029,-0.75001 3,-1.5 v -0.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"
- d="m 430.5,291.5 v 0.75 c 0,0.75 1.0691,1.25 3,1.25 1.9309,0 3,-0.5 3,-1.25 v -0.75"
- id="path24470"
- sodipodi:nodetypes="csccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_MOD_CAST"
- transform="translate(126,23)">
- <g
- style="display:inline;opacity:0.45"
- id="g23290"
- transform="translate(216,191)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect23292"
- width="16"
- height="16"
- x="83"
- y="48" />
- <g
- style="display:inline"
- id="g23294"
- transform="matrix(1.1658027,0,0,1.1657997,-59.289717,-204.05607)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path23297"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.98948926;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6969446,0,0,0.6900977,36.918531,141.69345)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.8;fill:url(#linearGradient24112);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path23299"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.6391427,-0.07194179,0.07284933,-0.6344823,204.68584,307.47408)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.5885088,0,0,0.5897133,51.241774,153.48488)"
- style="fill:none;stroke:url(#linearGradient24114);stroke-width:1.45605874;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path23301"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- transform="translate(0,-1)"
- id="g23266"
- style="display:inline;enable-background:new">
- <g
- id="g24238">
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#linearGradient24116);fill-opacity:1;fill-rule:nonzero;stroke:#132747;stroke-width:0.69999999;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 313.25,246.5 c -2.13129,3.51035 -4.20028,0.92659 -6.75,0 -2.5,-0.90852 -5.25,-1.69675 -5.75,-0.25 -1,3.5 1.75,8.25 6.25,8.25 4.5,0 7.25,-4.5 6.25,-8 z"
- id="path24164"
- sodipodi:nodetypes="csczc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path24220"
- d="M 301.49346,248.00351 C 300.75,245 304.5,246.75 307.5,247.5"
- style="display:inline;fill:none;stroke:url(#linearGradient24118);stroke-width:1.00000083;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(1.0828313,0,0,1.0828897,167.85295,5.9780113)"
- id="g24116"
- style="display:inline;enable-background:new"
- clip-path="url(#clipPath24168)">
- <circle
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24121);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.98504531;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path24134"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.6352868,0,0,0.6352859,44.642106,148.53594)"
- style="display:inline;fill:none;stroke:url(#linearGradient24123);stroke-width:1.45364487;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path24144"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- sodipodi:nodetypes="cs"
- id="path24166"
- d="m 306.9667,246.52825 c -1.63301,1.38546 -3.26623,2.75322 -4.93069,1.49745"
- style="fill:none;stroke:#132747;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 313.25,246.25 c -1,-3.5 -4.2097,-1.48101 -6.2833,0.27825"
- id="path24198"
- sodipodi:nodetypes="cs"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MOD_SOFT"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect41109"
- width="16"
- height="16"
- x="110"
- y="260" />
- <g
- style="display:inline"
- id="g41111"
- transform="translate(-92.033883,254)">
- <g
- id="g41113"
- transform="translate(20.05,-0.09375)">
- <path
- sodipodi:nodetypes="cc"
- id="path41115"
- d="m 195.7,12.34375 -8.21612,8.25"
- style="fill:none;stroke:#0b1728;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <g
- transform="rotate(19.645954,188.47399,16.604212)"
- id="g41117">
- <path
- sodipodi:nodetypes="csccsc"
- id="path41119"
- d="m 191.82819,15.661146 c -2.50169,-2.892812 -3.51599,-3.257525 -5.63502,-2.501059 -1.55469,0.555005 -3.0441,1.883066 -4.82641,-0.135198 l 3.04462,-5.5995832 c 1.58362,1.6624741 2.57888,1.2029919 3.73322,0.7909034 1.64813,-0.5883624 2.98174,-0.5189446 6.10591,2.3329558"
- style="fill:url(#linearGradient41127);fill-opacity:1;fill-rule:evenodd;stroke:#0b1728;stroke-width:0.80000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.8;fill:none;stroke:url(#linearGradient41129);stroke-width:0.85000008;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
- d="m 184.59619,8.6865928 -2.20359,4.2375362 c 0.98797,0.735441 2.20267,0.01003 3.54842,-0.470383 2.11902,-0.756466 3.52208,-0.551271 5.62148,1.765004 l 1.625,-3.46875 c -2.19923,-2.2239943 -3.61351,-2.2477085 -5.02619,-1.7433979 -1.08094,0.3858805 -2.30419,0.5856276 -3.56512,-0.3200093 z"
- id="path41121"
- sodipodi:nodetypes="ccsccsc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="fill:#6593d4;fill-opacity:1;fill-rule:evenodd;stroke:#87aade;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 195.7,12.34375 -8.21612,8.25"
- id="path41123"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path41125"
- d="m 191.6399,15.190092 3.2987,-3.242382"
- style="opacity:0.5;fill:#6593d4;fill-opacity:1;fill-rule:evenodd;stroke:#2c5aa0;stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_POSE_DATA"
- transform="translate(237.98389,298.06154)">
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- y="195"
- x="124.01612"
- height="16"
- width="16"
- id="rect41134"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g41136">
- <path
- id="path41138"
- style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 131.51612,200.41538 v 3.2 l 3,1.88462 2.75,-1.75 m -5.75,-0.62692 -3,2.37692 v 4 m 3,-9.08462 3,0.0846 2,-3 m -10.75,0.25 2.25,2.66538 h 3.5"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#acacac;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect41140"
- width="2"
- height="1.9692308"
- x="130.01611"
- y="196.96924"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- y="196.96924"
- x="130.01611"
- height="1.9692308"
- width="2"
- id="rect41142"
- style="opacity:0.95;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path41144"
- style="fill:none;stroke:url(#linearGradient41170);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 125.76612,197.75 2.25,2.75 h 3.5 m 0,0 v 3 l 3,2 2.75,-1.75 m -5.75,-0.62692 -3,2.37692 v 4 m 3,-9 h 3 l 2,-3"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_ARMATURE_DATA"
- transform="translate(78,299.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect41148"
- width="16"
- height="16"
- x="263"
- y="194" />
- <g
- id="g41150"
- transform="translate(0,-1)">
- <path
- id="path41152"
- style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 270.51612,199.5 -0.0161,2 1.75,4 1.25,3 m -3,-7 -1.75,4 -1.25,3"
- sodipodi:nodetypes="ccccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect41154"
- width="2"
- height="2"
- x="270.01611"
- y="196"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccccc"
- d="m 270.51612,199.5 h 3 2.75 m -11.5,0 h 2.75 3"
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path23087"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccc"
- d="m 270.51612,199.5 -0.0161,2 1.75,4 1.25,3 m -3,-7 -1.75,4 -1.25,3 m 3.01612,-9 h 3 2.75 m -11.5,0 h 2.75 3"
- style="fill:none;stroke:url(#linearGradient41172);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path41157"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- y="196"
- x="269.76608"
- height="2.75"
- width="2.4999998"
- id="rect41159"
- style="opacity:0.5;fill:none;stroke:url(#radialGradient41174);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- y="196"
- x="270.01611"
- height="2"
- width="2"
- id="rect41161"
- style="fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- <g
- transform="translate(28.983879,319.02657)"
- id="ICON_POSE_HLT"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect42001"
- width="16"
- height="16"
- x="124.01612"
- y="195"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <g
- transform="translate(6.71875e-6,0.03077095)"
- style="display:inline;enable-background:new"
- id="g42059">
- <path
- id="path42061"
- style="fill:none;stroke:#000000;stroke-width:3.0999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 131.51612,200.41538 v 3.2 l 3,1.88462 2.75,-1.75 m -5.75,-0.62692 -3,2.37692 -0.002,3.68505 m 3.00187,-8.76967 3,0.0846 2,-3 m -10.75,0.25 2.25,2.66538 h 3.5"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#acacac;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect42063"
- width="2"
- height="1.9692308"
- x="130.01611"
- y="196.97343"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- y="196.97343"
- x="130.01611"
- height="1.9692308"
- width="2"
- id="rect42065"
- style="opacity:0.95;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42067"
- style="fill:none;stroke:url(#linearGradient42069);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 125.76612,197.75 2.25,2.75 h 3.5 m 0,0 v 3 l 3,2 2.75,-1.75 m -5.75,-0.62692 -3,2.37692 -0.002,3.68505 M 131.51599,200.5 h 3 l 2,-3"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-19.00001,-0.03076)"
- style="display:inline;enable-background:new"
- id="g42015">
- <g
- id="g42017"
- transform="translate(-1.999999,-8.9958)">
- <path
- id="path42019"
- d="m 145.99053,204.49753 h 0.0368 c 0.81818,0 1.47687,0.66665 1.47687,1.49473 v 1.2e-4 c 0,0.82808 -0.65869,1.49472 -1.47687,1.49472 h -0.0368 c -0.81819,0 -1.47687,-0.66664 -1.47687,-1.49472 v -1.2e-4 c 0,-0.82808 0.65868,-1.49473 1.47687,-1.49473 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#964e00;stroke-width:1.49505997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42021"
- d="m 147.00606,204.9958 c -0.66732,0 -1.33464,1e-5 -2.00196,1e-5 0,0.66707 0,1.33412 0,2.00119 0.66732,0 1.33464,-1e-5 2.00196,-1e-5 0,-0.66706 0,-1.33412 0,-2.00119 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffd4a5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g42023"
- transform="translate(0,-1)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#964e00;stroke-width:1.49505997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 156.00059,196.50173 h 0.0368 c 0.81818,0 1.47687,0.66665 1.47687,1.49473 v 1.2e-4 c 0,0.82808 -0.65869,1.49472 -1.47687,1.49472 h -0.0368 c -0.81819,0 -1.47687,-0.66664 -1.47687,-1.49472 v -1.2e-4 c 0,-0.82808 0.65868,-1.49473 1.47687,-1.49473 z"
- id="path42025"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffd4a5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 157.01612,197 c -0.66732,0 -1.33464,1e-5 -2.00196,1e-5 0,0.66707 0,1.33412 0,2.00119 0.66732,0 1.33464,-1e-5 2.00196,-1e-5 0,-0.66706 0,-1.33412 0,-2.00119 z"
- id="path42027"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- transform="translate(120,68)"
- id="ICON_MOD_ARMATURE"
- style="display:inline;enable-background:new">
- <rect
- y="194"
- x="263"
- height="16"
- width="16"
- id="rect42073"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(0,-1)"
- id="g42075">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccccc"
- d="m 270.51612,199.5 -0.0161,2 1.75,4 1.25,3 m -3,-7 -1.75,4 -1.25,3"
- style="display:inline;overflow:visible;visibility:visible;fill:#162d50;fill-opacity:1;fill-rule:evenodd;stroke:#0b1728;stroke-width:3.0999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path42077"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- y="196"
- x="270.01611"
- height="2"
- width="2"
- id="rect42079"
- style="fill:none;stroke:#0b1728;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- id="path42081"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 270.51612,199.5 h 3 2.75 m -11.5,0 h 2.75 3"
- sodipodi:nodetypes="ccccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42083"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42093);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 270.51612,199.5 -0.0161,2 1.75,4 1.25,3 m -3,-7 -1.75,4 -1.25,3 m 3.01612,-9 h 3 2.75 m -11.5,0 h 2.75 3"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="opacity:0.5;fill:none;stroke:url(#radialGradient42091);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect42085"
- width="2.4999998"
- height="2.75"
- x="269.76608"
- y="196" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#c8d8f0;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;marker:none;enable-background:accumulate"
- id="rect42087"
- width="2"
- height="2"
- x="270.01611"
- y="196" />
- </g>
- </g>
- <g
- transform="translate(-111,236)"
- id="ICON_OUTLINER_OB_ARMATURE"
- style="display:inline;enable-background:new">
- <rect
- y="194"
- x="263"
- height="16"
- width="16"
- id="rect42097"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(0,-1)"
- id="g42099">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccccc"
- d="m 270.51612,199.5 -0.0161,2 1.75,4 1.25,3 m -3,-7 -1.75,4 -1.25,3"
- style="fill:none;stroke:#241300;stroke-width:3.0999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path42101"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- y="196"
- x="270.01611"
- height="2"
- width="2"
- id="rect42103"
- style="fill:none;stroke:#2b1600;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- id="path42105"
- style="fill:none;stroke:#241300;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 270.51612,199.5 h 3 2.75 m -11.5,0 h 2.75 3"
- sodipodi:nodetypes="ccccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42107"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffad55;stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 270.51612,199.5 -0.0161,2 1.75,4 1.25,3 m -3,-7 -1.75,4 -1.25,3 m 3.01612,-9 h 3 2.75 m -11.5,0 h 2.75 3"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="opacity:0.5;fill:none;stroke:url(#radialGradient42115);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect42109"
- width="2.4999998"
- height="2.75"
- x="269.76608"
- y="196" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffb769;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;marker:none;enable-background:accumulate"
- id="rect42111"
- width="2"
- height="2"
- x="270.01611"
- y="196" />
- <path
- sodipodi:nodetypes="ccccccccccccc"
- d="m 270.51612,199.5 -0.0161,2 1.75,4 1.25,3 m -3,-7 -1.75,4 -1.25,3 m 3.01612,-9 h 3 2.75 m -11.5,0 h 2.75 3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42121);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path42117"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(113.22629,214.3098)"
- id="ICON_OUTLINER_DATA_POSE"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect42125"
- width="16"
- height="16"
- x="124.01612"
- y="195"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <g
- id="g42127"
- style="opacity:0.8">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccccccccccc"
- d="m 131.51612,200.41538 v 3.2 l 3,1.88462 2.75,-1.75 m -5.75,-0.62692 -3,2.37692 v 4 m 3,-9.08462 3,0.0846 2,-3 m -10.75,0.25 2.25,2.66538 h 3.5"
- style="fill:none;stroke:#1a1a1a;stroke-width:3.0999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path42129"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- y="196.96924"
- x="130.01611"
- height="1.9692308"
- width="2"
- id="rect42131"
- style="fill:#acacac;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="opacity:0.95;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect42133"
- width="2"
- height="1.9692308"
- x="130.01611"
- y="196.96924" />
- <path
- sodipodi:nodetypes="ccccccccccccc"
- d="m 125.76612,197.75 2.25,2.75 h 3.5 m 0,0 v 3 l 3,2 2.75,-1.75 m -5.75,-0.62692 -3,2.37692 v 4 m 3,-9 h 3 l 2,-3"
- style="fill:none;stroke:url(#linearGradient42155);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path42135"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g42161"
- transform="translate(-128.99942,340.96539)"
- style="display:inline;enable-background:new">
- <g
- id="g42163"
- transform="translate(-1.999997,-8)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 256,-137.52519 h 0.0368 c 0.81818,0 1.47687,0.66665 1.47687,1.49473 v 1.2e-4 c 0,0.82808 -0.65869,1.49472 -1.47687,1.49472 H 256 c -0.81819,0 -1.47687,-0.66664 -1.47687,-1.49472 v -1.2e-4 c 0,-0.82808 0.65868,-1.49473 1.47687,-1.49473 z"
- id="path42165"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m 257.01553,-137.02692 c -0.66732,0 -1.33464,1e-5 -2.00196,1e-5 0,0.66707 0,1.33412 0,2.00119 0.66732,0 1.33464,-1e-5 2.00196,-1e-5 0,-0.66706 0,-1.33412 0,-2.00119 z"
- id="path42167"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g42169">
- <path
- id="path42171"
- d="m 265.98447,-145.52519 h 0.0368 c 0.81818,0 1.47687,0.66665 1.47687,1.49473 v 1.2e-4 c 0,0.82808 -0.65869,1.49472 -1.47687,1.49472 h -0.0368 c -0.81819,0 -1.47687,-0.66664 -1.47687,-1.49472 v -1.2e-4 c 0,-0.82808 0.65868,-1.49473 1.47687,-1.49473 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42173"
- d="m 267,-145.02692 c -0.66732,0 -1.33464,1e-5 -2.00196,1e-5 0,0.66707 0,1.33412 0,2.00119 0.66732,0 1.33464,-1e-5 2.00196,-1e-5 0,-0.66706 0,-1.33412 0,-2.00119 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- id="ICON_OUTLINER_DATA_ARMATURE"
- transform="translate(0,86)">
- <g
- transform="translate(-111,129)"
- id="g42260"
- style="display:inline;opacity:0.9;enable-background:new">
- <rect
- y="194"
- x="263"
- height="16"
- width="16"
- id="rect42262"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(0,-1)"
- id="g42264"
- style="opacity:0.8">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccccc"
- d="m 270.51612,199.5 -0.0161,2 1.75,4 1.25,3 m -3,-7 -1.75,4 -1.25,3"
- style="fill:none;stroke:#1a1a1a;stroke-width:3.0999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path42266"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- y="196"
- x="270.01611"
- height="2"
- width="2"
- id="rect42268"
- style="fill:none;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- id="path42270"
- style="fill:none;stroke:#1a1a1a;stroke-width:3.0999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 270.51612,199.5 h 3 2.75 m -11.5,0 h 2.75 3"
- sodipodi:nodetypes="ccccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42272"
- style="fill:none;stroke:url(#linearGradient42290);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 270.51612,199.5 -0.0161,2 1.75,4 1.25,3 m -3,-7 -1.75,4 -1.25,3 m 3.01612,-9 h 3 2.75 m -11.5,0 h 2.75 3"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="opacity:0.5;fill:none;stroke:url(#radialGradient42292);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect42274"
- width="2.4999998"
- height="2.75"
- x="269.76608"
- y="196" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect42276"
- width="2"
- height="2"
- x="270.01611"
- y="196" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g42278"
- transform="translate(-83.0076,464.0087)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 236.98447,-138.49827 h 0.0368 c 0.81818,0 1.47687,0.66665 1.47687,1.49473 v 1.2e-4 c 0,0.82808 -0.65869,1.49472 -1.47687,1.49472 h -0.0368 c -0.81819,0 -1.47687,-0.66664 -1.47687,-1.49472 v -1.2e-4 c 0,-0.82808 0.65868,-1.49473 1.47687,-1.49473 z"
- id="path42280"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m 238,-138 c -0.66732,0 -1.33464,1e-5 -2.00196,1e-5 0,0.66707 0,1.33412 0,2.00119 0.66732,0 1.33464,-1e-5 2.00196,-1e-5 0,-0.66706 0,-1.33412 0,-2.00119 z"
- id="path42282"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g42284"
- transform="translate(-81,470)">
- <path
- id="path42286"
- d="m 246.98447,-144.49827 h 0.0368 c 0.81818,0 1.47687,0.66665 1.47687,1.49473 v 1.2e-4 c 0,0.82808 -0.65869,1.49472 -1.47687,1.49472 h -0.0368 c -0.81819,0 -1.47687,-0.66664 -1.47687,-1.49472 v -1.2e-4 c 0,-0.82808 0.65868,-1.49473 1.47687,-1.49473 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42288"
- d="m 248,-144 c -0.66732,0 -1.33464,1e-5 -2.00196,1e-5 0,0.66707 0,1.33412 0,2.00119 0.66732,0 1.33464,-1e-5 2.00196,-1e-5 0,-0.66706 0,-1.33412 0,-2.00119 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_PLUG"
- transform="translate(399,24.000007)"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\x.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- ry="1.767767"
- y="596.5"
- x="69.5"
- height="13"
- width="13"
- id="rect23677"
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- rx="1.767767" />
- <g
- style="display:inline"
- id="g23438"
- transform="translate(45,357.99031)">
- <path
- sodipodi:nodetypes="ccccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23775);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- d="m 25,239.50969 0.5,-0.5 h 11 l 0.5,0.5 v 11 l -0.5,0.5 h -11 l -0.5,-0.5 z"
- id="path23673"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect23655"
- width="16"
- height="16"
- x="23"
- y="237.00969" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:0.9999997px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 25.499991,250.49338 V 239.49183 H 36.499984"
- id="path23447"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <circle
- transform="matrix(0.9,0,0,0.9,7.6,60.3)"
- id="path23605"
- style="display:inline;overflow:visible;visibility:visible;fill:#dad9d9;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient23777);stroke-width:0.8888889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="76"
- cy="603"
- r="4.1666665" />
- <rect
- y="602"
- x="74"
- height="2"
- width="1"
- id="rect23613"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23615"
- width="1"
- height="2"
- x="77"
- y="602" />
- </g>
- <g
- id="ICON_PARTICLES"
- transform="translate(0,128.00001)">
- <rect
- y="427.99997"
- x="215"
- height="16"
- width="16"
- id="rect51640"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89401144px;marker:none;enable-background:accumulate" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Pulpit\s.png"
- y="427.99997"
- x="215"
- height="16"
- width="16"
- id="rect18676"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89401144px;marker:none;enable-background:accumulate" />
- <g
- id="g23292">
- <g
- id="g23271">
- <g
- id="g23265">
- <path
- inkscape:transform-center-y="-1.75"
- sodipodi:nodetypes="ccccccc"
- id="use22458"
- d="m 229.97728,432.50003 v 0 l -2.86364,-0.81818 -1.22727,0.20455 v 1.22727 l 1.22727,0.20455 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23257);stroke-width:2.04545569;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- sodipodi:nodetypes="ccccccc"
- id="use22460"
- d="m 226.5,435.97731 v 0 l 0.81819,-2.86364 -0.20455,-1.22727 h -1.22727 l -0.20455,1.22727 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23254);stroke-width:2.04545569;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- sodipodi:nodetypes="ccccccc"
- id="use22462"
- d="m 223.02273,432.50003 v 0 l 2.86364,0.81819 1.22727,-0.20455 v -1.22727 l -1.22727,-0.20455 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23251);stroke-width:2.04545569;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- sodipodi:nodetypes="ccccccc"
- id="path22465"
- d="m 226.5,429.02276 v 0 l -0.81818,2.86364 0.20455,1.22727 h 1.22727 l 0.20455,-1.22727 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23248);stroke-width:2.04545569;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23259">
- <path
- inkscape:transform-center-y="-1.75"
- id="path22585"
- d="m 226.09091,428.00003 -0.4091,3.68182 0.20455,1.43182 h 1.22727 l 0.20455,-1.43182 -0.40909,-3.68182 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23244);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- id="use22587"
- d="m 231,432.09094 -3.68182,-0.40909 -1.43182,0.20454 v 1.22728 l 1.43182,0.20454 L 231,432.90912 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23239);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- id="use22589"
- d="m 226.09091,437.00003 -0.4091,-3.68182 0.20455,-1.43182 h 1.22727 l 0.20455,1.43182 -0.40909,3.68182 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23235);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- id="use22591"
- d="m 221.99999,432.90912 3.68182,0.40909 1.43182,-0.20454 v -1.22728 l -1.43182,-0.20454 -3.68182,0.40909 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23231);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(141,-197.00002)"
- id="g19146">
- <rect
- y="628.25"
- x="85"
- height="2.5"
- width="1"
- id="rect19148"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate" />
- <rect
- transform="rotate(90)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- id="rect19150"
- width="1"
- height="2.5"
- x="629"
- y="-86.75" />
- </g>
- </g>
- <g
- id="g23162"
- transform="translate(0,-4)">
- <g
- id="g23156">
- <path
- inkscape:transform-center-y="-1.75"
- sodipodi:nodetypes="ccccccc"
- id="use24185"
- d="m 224.75,442.5 v 0 l -3.5,-0.75 h -1.5 v 1.5 h 1.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23177);stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- sodipodi:nodetypes="ccccccc"
- id="use24187"
- d="m 220.5,446.75 v 0 l 0.75,-3.5 v -1.5 h -1.5 l 0.25,1.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23179);stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- sodipodi:nodetypes="ccccccc"
- id="use24189"
- d="m 216.25,442.5 v 0 l 3.5,0.75 h 1.5 v -1.5 h -1.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23181);stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- sodipodi:nodetypes="ccccccc"
- id="path24197"
- d="m 220.5,438 v -0.15625 l -0.75,3.90625 v 1.5 h 1.5 v -1.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23183);stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23150">
- <path
- inkscape:transform-center-y="-1.75"
- id="path24201"
- d="m 220,437 -0.5,4.5 0.25,1.75 h 1.5 L 221.5,441.5 221,437 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23185);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- id="use24203"
- d="m 226,442 -4.5,-0.5 -1.75,0.25 v 1.5 l 1.75,0.25 4.5,-0.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23187);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- id="use24205"
- d="m 220,448 -0.5,-4.5 0.25,-1.75 h 1.5 l 0.25,1.75 -0.5,4.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23189);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- id="use24207"
- d="m 215,443 4.5,0.5 1.75,-0.25 v -1.5 L 219.5,441.5 215,442 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23191);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(135,-187.00002)"
- id="g24209">
- <rect
- y="628"
- x="85"
- height="2.9999599"
- width="1"
- id="rect24211"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate" />
- <rect
- transform="rotate(90)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- id="rect24213"
- width="1"
- height="3"
- x="629"
- y="-87" />
- </g>
- </g>
- <g
- id="g23052"
- transform="translate(0,4)">
- <path
- inkscape:transform-center-y="-1.25"
- sodipodi:nodetypes="ccccccc"
- id="path24226"
- d="m 218.75004,424.50004 h -0.5 L 217.75,426.25 l 0.25004,1.75004 h 1 L 219.25,426.25 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient22715);stroke-width:1.58491683;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient22711);stroke-width:1.58491683;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 221.50004,427.75004 v -0.5 l -1.74996,-0.50004 -1.75004,0.25004 v 1 l 1.75004,0.24996 z"
- id="use24228"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.25"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient22707);stroke-width:1.58491683;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 215.50004,427.25004 v 0.5 l 1.74996,0.50004 1.75004,-0.25004 v -1 L 217.25,426.75008 Z"
- id="use24230"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.25"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient22704);stroke-width:1.58491683;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 218.25004,430.50004 h 0.5 l 0.50004,-1.74996 -0.25004,-1.75004 h -1 l -0.24996,1.75004 z"
- id="use24232"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.25"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.49998"
- id="path24236"
- d="m 218.00004,424.00004 -0.12109,2.86328 0.1211,1.13676 0.99999,-4e-5 0.125,-1.125 -0.125,-2.875 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient22701);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient22698);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 222.00004,427.00004 -2.86328,-0.12109 -1.13676,0.12109 4e-5,1 1.125,0.125 2.875,-0.125 z"
- id="use24238"
- inkscape:transform-center-y="-1.49998"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient22695);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 219.00004,431.00004 0.12109,-2.86328 -0.1211,-1.13676 -0.99999,4e-5 -0.125,1.125 0.125,2.875 z"
- id="use24240"
- inkscape:transform-center-y="-1.49998"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient22692);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 215.00004,428.00004 2.86328,0.12109 1.13676,-0.12109 -4e-5,-1 -1.125,-0.125 -2.875,0.125 z"
- id="use24242"
- inkscape:transform-center-y="-1.49998"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(133.00004,-201.99996)"
- id="g24244">
- <rect
- y="628.5"
- x="85"
- height="2"
- width="1"
- id="rect24249"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate" />
- <rect
- transform="rotate(90)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- id="rect24251"
- width="1"
- height="2"
- x="629"
- y="-86.5" />
- </g>
- </g>
- <g
- id="g23116"
- transform="translate(0,-4)">
- <g
- transform="translate(0,-6.4549394)"
- id="g23090">
- <path
- inkscape:transform-center-y="-1.75"
- sodipodi:nodetypes="ccccccc"
- id="use24445"
- d="m 230.20453,450.95187 v 0 l -2.22727,-0.63574 -0.95454,0.15894 v 0.9536 l 0.95454,0.15893 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23132);stroke-width:1.59012127;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- sodipodi:nodetypes="ccccccc"
- id="use24447"
- d="m 227.49999,453.65374 v 0 l 0.63637,-2.22507 -0.15909,-0.9536 h -0.95455 l -0.15909,0.9536 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23134);stroke-width:1.59012127;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- sodipodi:nodetypes="ccccccc"
- id="use24449"
- d="m 224.79546,450.95187 v 0 l 2.22727,0.63574 0.95454,-0.15894 v -0.9536 l -0.95454,-0.15893 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23136);stroke-width:1.59012127;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23138);stroke-width:1.59012127;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 227.5,448.25 v 0 l -0.63637,2.22507 0.15909,0.9536 h 0.95455 l 0.15909,-0.9536 z"
- id="path24452"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23110">
- <path
- inkscape:transform-center-y="-1.75"
- id="path22819"
- d="m 227.18182,441.00653 -0.31818,2.86081 0.15909,1.11253 h 0.95454 l 0.15909,-1.11253 -0.31818,-2.86081 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23140);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- id="path22821"
- d="m 231,444.1852 -2.86364,-0.31786 -1.11363,0.15893 v 0.9536 l 1.11363,0.15894 L 231,444.82094 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23142);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- id="path22823"
- d="m 227.18182,447.99961 -0.31818,-2.8608 0.15909,-1.11254 h 0.95454 l 0.15909,1.11254 -0.31818,2.8608 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23144);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- id="path22825"
- d="m 224.00001,444.82094 2.86363,0.31787 1.11363,-0.15894 v -0.9536 l -1.11363,-0.15893 -2.86363,0.31786 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23147);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23105">
- <g
- transform="translate(141.99999,-184.99353)"
- id="g24264">
- <rect
- y="628.5"
- x="85"
- height="2"
- width="1"
- id="rect24266"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate" />
- <rect
- transform="rotate(90)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- id="rect24268"
- width="1"
- height="2"
- x="629"
- y="-86.5" />
- </g>
- </g>
- </g>
- </g>
- </g>
- <g
- id="ICON_PARTICLE_DATA"
- transform="translate(62.999992,65.000007)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89401144px;marker:none;enable-background:accumulate"
- id="rect23417"
- width="16"
- height="16"
- x="215"
- y="427.99997" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89401144px;marker:none;enable-background:accumulate"
- id="rect23419"
- width="16"
- height="16"
- x="215"
- y="427.99997"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Pulpit\s.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <g
- id="g23422">
- <g
- id="g23424">
- <g
- id="g23426">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23563);stroke-width:2.04545569;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 229.97728,432.50003 v 0 l -2.86364,-0.81818 -1.22727,0.20455 v 1.22727 l 1.22727,0.20455 z"
- id="path23430"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23566);stroke-width:2.04545569;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 226.5,435.97731 v 0 l 0.81819,-2.86364 -0.20455,-1.22727 h -1.22727 l -0.20455,1.22727 z"
- id="path23432"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23568);stroke-width:2.04545569;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 223.02273,432.50003 v 0 l 2.86364,0.81819 1.22727,-0.20455 v -1.22727 l -1.22727,-0.20455 z"
- id="path23434"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23570);stroke-width:2.04545569;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 226.5,429.02276 v 0 l -0.81818,2.86364 0.20455,1.22727 h 1.22727 l 0.20455,-1.22727 z"
- id="path23437"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23439">
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23572);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 226.09091,428.00003 -0.4091,3.68182 0.20455,1.43182 h 1.22727 l 0.20455,-1.43182 -0.40909,-3.68182 z"
- id="path23441"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23574);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 231,432.09094 -3.68182,-0.40909 -1.43182,0.20454 v 1.22728 l 1.43182,0.20454 L 231,432.90912 Z"
- id="path23443"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23576);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 226.09091,437.00003 -0.4091,-3.68182 0.20455,-1.43182 h 1.22727 l 0.20455,1.43182 -0.40909,3.68182 z"
- id="path23449"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23578);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 221.99999,432.90912 3.68182,0.40909 1.43182,-0.20454 v -1.22728 l -1.43182,-0.20454 -3.68182,0.40909 z"
- id="path23453"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23455"
- transform="translate(141,-197.00002)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- id="rect23457"
- width="1"
- height="2.5"
- x="85"
- y="628.25" />
- <rect
- y="-86.75"
- x="629"
- height="2.5"
- width="1"
- id="rect23463"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- transform="rotate(90)" />
- </g>
- </g>
- <g
- transform="translate(0,-4)"
- id="g23465">
- <g
- id="g23467">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23580);stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 224.75,442.5 v 0 l -3.49999,-0.75 H 219.75 v 1.5 h 1.50001 z"
- id="path23469"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23582);stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 220.5,446.75 v 0 l 0.75001,-3.5 -1e-5,-1.5 h -1.5 l 1e-5,1.5 z"
- id="path23472"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23587);stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 216.25,442.5 v 0 l 3.50001,0.75 H 221.25 v -1.5 h -1.49999 z"
- id="path23474"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23589);stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 220.5,438.25 v 0 l -0.74999,3.5 -1e-5,1.5 h 1.5 l 1e-5,-1.5 z"
- id="path23476"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23479">
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23591);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 220,437 -0.5,4.5 0.25,1.75 h 1.5 L 221.5,441.5 221,437 Z"
- id="path23481"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23593);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 226,442 -4.5,-0.5 -1.75,0.25 v 1.5 l 1.75,0.25 4.5,-0.5 z"
- id="path23484"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23597);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 220,448 -0.5,-4.5 0.25,-1.75 h 1.5 l 0.25,1.75 -0.5,4.5 z"
- id="path23486"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23600);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 215,443 4.5,0.5 1.75,-0.25 v -1.5 L 219.5,441.5 215,442 Z"
- id="path23488"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23491"
- transform="translate(135,-187.00002)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- id="rect23493"
- width="1"
- height="2.9999599"
- x="85"
- y="628" />
- <rect
- y="-87"
- x="629"
- height="3"
- width="1"
- id="rect23496"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- transform="rotate(90)" />
- </g>
- </g>
- <g
- transform="translate(0,4)"
- id="g23498">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23602);stroke-width:1.58491683;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 218.75004,424.50004 h -0.5 L 217.75,426.25 l 0.25004,1.75004 h 1 L 219.25,426.25 Z"
- id="path23500"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.25"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.25"
- sodipodi:nodetypes="ccccccc"
- id="path23502"
- d="m 221.50004,427.75004 v -0.5 l -1.74996,-0.50004 -1.75004,0.25004 v 1 l 1.75004,0.24996 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23606);stroke-width:1.58491683;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.25"
- sodipodi:nodetypes="ccccccc"
- id="path23504"
- d="m 215.50004,427.25004 v 0.5 l 1.74996,0.50004 1.75004,-0.25004 v -1 L 217.25,426.75008 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23608);stroke-width:1.58491683;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.25"
- sodipodi:nodetypes="ccccccc"
- id="path23506"
- d="m 218.25004,430.50004 h 0.5 l 0.50004,-1.74996 -0.25004,-1.75004 h -1 l -0.24996,1.75004 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23610);stroke-width:1.58491683;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23612);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 218.00004,424.00004 -0.12109,2.86328 0.1211,1.13676 0.99999,-4e-5 0.125,-1.125 -0.125,-2.875 z"
- id="path23508"
- inkscape:transform-center-y="-1.49998"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.49998"
- id="path23510"
- d="m 222.00004,427.00004 -2.86328,-0.12109 -1.13676,0.12109 4e-5,1 1.125,0.125 2.875,-0.125 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23616);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.49998"
- id="path23512"
- d="m 219.00004,431.00004 0.12109,-2.86328 -0.1211,-1.13676 -0.99999,4e-5 -0.125,1.125 0.125,2.875 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23618);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.49998"
- id="path23514"
- d="m 215.00004,428.00004 2.86328,0.12109 1.13676,-0.12109 -4e-5,-1 -1.125,-0.125 -2.875,0.125 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23620);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <g
- id="g23517"
- transform="translate(133.00004,-201.99996)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- id="rect23520"
- width="1"
- height="2"
- x="85"
- y="628.5" />
- <rect
- y="-86.5"
- x="629"
- height="2"
- width="1"
- id="rect23522"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- transform="rotate(90)" />
- </g>
- </g>
- <g
- transform="translate(0,-4)"
- id="g23524">
- <g
- id="g23526"
- transform="translate(0,-6.4549394)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23622);stroke-width:1.59012127;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 230.20453,450.95187 v 0 l -2.22727,-0.63574 -0.95454,0.15894 v 0.9536 l 0.95454,0.15893 z"
- id="path23529"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23624);stroke-width:1.59012127;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 227.49999,453.65374 v 0 l 0.63637,-2.22507 -0.15909,-0.9536 h -0.95455 l -0.15909,0.9536 z"
- id="path23531"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23626);stroke-width:1.59012127;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 224.79546,450.95187 v 0 l 2.22727,0.63574 0.95454,-0.15894 v -0.9536 l -0.95454,-0.15893 z"
- id="path23533"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.75"
- sodipodi:nodetypes="ccccccc"
- id="path23535"
- d="m 227.5,448.25 v 0 l -0.63637,2.22507 0.15909,0.9536 h 0.95455 l 0.15909,-0.9536 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23628);stroke-width:1.59012127;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23538">
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23630);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 227.18182,441.00653 -0.31818,2.86081 0.15909,1.11253 h 0.95454 l 0.15909,-1.11253 -0.31818,-2.86081 z"
- id="path23541"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23632);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 231,444.1852 -2.86364,-0.31786 -1.11363,0.15893 v 0.9536 l 1.11363,0.15894 L 231,444.82094 Z"
- id="path23544"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23635);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 227.18182,447.99961 -0.31818,-2.8608 0.15909,-1.11254 h 0.95454 l 0.15909,1.11254 -0.31818,2.8608 z"
- id="path23549"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23637);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 224.00001,444.82094 2.86363,0.31787 1.11363,-0.15894 v -0.9536 l -1.11363,-0.15893 -2.86363,0.31786 z"
- id="path23551"
- inkscape:transform-center-y="-1.75"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23555">
- <g
- id="g23557"
- transform="translate(141.99999,-184.99353)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- id="rect23559"
- width="1"
- height="2"
- x="85"
- y="628.5" />
- <rect
- y="-86.5"
- x="629"
- height="2"
- width="1"
- id="rect23561"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- transform="rotate(90)" />
- </g>
- </g>
- </g>
- </g>
- </g>
- <g
- id="ICON_MOD_PARTICLES">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89401144px;marker:none;enable-background:accumulate"
- id="rect23619"
- width="16"
- height="16"
- x="194"
- y="262"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Pulpit\s.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <g
- id="g23639"
- transform="translate(-21.000008,-166)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89401144px;marker:none;enable-background:accumulate"
- id="rect23641"
- width="16"
- height="16"
- x="215"
- y="427.99997" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89401144px;marker:none;enable-background:accumulate"
- id="rect23643"
- width="16"
- height="16"
- x="215"
- y="427.99997"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Pulpit\s.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <g
- id="g23645">
- <g
- id="g23647">
- <g
- id="g23649">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23797);stroke-width:2.04545569;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 229.97728,432.50003 v 0 l -2.86364,-0.81818 -1.22727,0.20455 v 1.22727 l 1.22727,0.20455 z"
- id="path23651"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23799);stroke-width:2.04545569;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 226.5,435.97731 v 0 l 0.81819,-2.86364 -0.20455,-1.22727 h -1.22727 l -0.20455,1.22727 z"
- id="path23653"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23801);stroke-width:2.04545569;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 223.02273,432.50003 v 0 l 2.86364,0.81819 1.22727,-0.20455 v -1.22727 l -1.22727,-0.20455 z"
- id="path23655"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23803);stroke-width:2.04500008;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 226.5,429.02276 v 0 l -0.81818,2.86364 0.20455,1.22727 h 1.22727 l 0.20455,-1.22727 z"
- id="path23668"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75" />
- </g>
- <g
- id="g23670">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23805);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 226.09091,428.00003 -0.4091,3.68182 0.20455,1.43182 h 1.22727 l 0.20455,-1.43182 -0.40909,-3.68182 z"
- id="path23672"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23807);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 231,432.09094 -3.68182,-0.40909 -1.43182,0.20454 v 1.22728 l 1.43182,0.20454 L 231,432.90912 Z"
- id="path23674"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23809);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 226.09091,437.00003 -0.4091,-3.68182 0.20455,-1.43182 h 1.22727 l 0.20455,1.43182 -0.40909,3.68182 z"
- id="path23676"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23811);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 221.99999,432.90912 3.68182,0.40909 1.43182,-0.20454 v -1.22728 l -1.43182,-0.20454 -3.68182,0.40909 z"
- id="path23678"
- inkscape:transform-center-y="-1.75" />
- </g>
- <g
- id="g23680"
- transform="translate(141,-197.00002)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- id="rect23682"
- width="1"
- height="2.5"
- x="85"
- y="628.25" />
- <rect
- y="-86.75"
- x="629"
- height="2.5"
- width="1"
- id="rect23684"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- transform="rotate(90)" />
- </g>
- </g>
- <g
- transform="translate(0,-4)"
- id="g23686">
- <g
- id="g23688">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23813);stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 224.75,442.5 v 0 l -3.5,-1 -1.5,0.25 v 1.5 l 1.5,0.25 z"
- id="path23690"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23815);stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 220.5,446.75 v 0 l 0.75001,-3.5 -1e-5,-1.5 h -1.5 l 1e-5,1.5 z"
- id="path23692"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23817);stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 216.25,442.5 v 0 l 3.50001,0.75 H 221.25 v -1.5 h -1.49999 z"
- id="path23695"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23819);stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 220.5,438.25 v 0 l -0.74999,3.75 -1e-5,1.25 h 1.5 l 1e-5,-1.25 z"
- id="path23697"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75" />
- </g>
- <g
- id="g23700">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23821);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 220,437 -0.5,4.5 0.25,1.75 h 1.5 L 221.5,441.5 221,437 Z"
- id="path23702"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23823);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 226,442 -4.5,-0.5 -1.75,0.25 v 1.5 l 1.75,0.25 4.5,-0.5 z"
- id="path23704"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23825);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 220,448 -0.5,-4.5 0.25,-1.75 h 1.5 l 0.25,1.75 -0.5,4.5 z"
- id="path23706"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23827);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 215,443 4.5,0.5 1.75,-0.25 v -1.5 L 219.5,441.5 215,442 Z"
- id="path23708"
- inkscape:transform-center-y="-1.75" />
- </g>
- <g
- id="g23713"
- transform="translate(135,-187.00002)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- id="rect23715"
- width="1"
- height="2.9999599"
- x="85"
- y="628" />
- <rect
- y="-87"
- x="629"
- height="3"
- width="1"
- id="rect23717"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- transform="rotate(90)" />
- </g>
- </g>
- <g
- transform="translate(0,4)"
- id="g23719">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23829);stroke-width:1.58491683;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 218.75004,424.50004 h -0.5 L 217.75,426.25 l 0.25004,1.75004 h 1 L 219.25,426.25 Z"
- id="path23728"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.25" />
- <path
- inkscape:connector-curvature="0"
- inkscape:transform-center-y="-1.25"
- sodipodi:nodetypes="ccccccc"
- id="path23736"
- d="m 221.50004,427.75004 v -0.5 l -1.74996,-0.50004 -1.75004,0.25004 v 1 l 1.75004,0.24996 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23831);stroke-width:1.58491683;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- inkscape:transform-center-y="-1.25"
- sodipodi:nodetypes="ccccccc"
- id="path23738"
- d="m 215.50004,427.25004 v 0.5 l 1.74996,0.50004 1.75004,-0.25004 v -1 L 217.25,426.75008 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23833);stroke-width:1.58491683;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- inkscape:transform-center-y="-1.25"
- sodipodi:nodetypes="ccccccc"
- id="path23740"
- d="m 218.25004,430.50004 h 0.5 l 0.50004,-1.74996 -0.25004,-1.75004 h -1 l -0.24996,1.75004 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23835);stroke-width:1.58491683;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23837);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 218.00004,424.00004 -0.12109,2.86328 0.1211,1.13676 0.99999,-4e-5 0.125,-1.125 -0.125,-2.875 z"
- id="path23742"
- inkscape:transform-center-y="-1.49998" />
- <path
- inkscape:connector-curvature="0"
- inkscape:transform-center-y="-1.49998"
- id="path23744"
- d="m 222.00004,427.00004 -2.86328,-0.12109 -1.13676,0.12109 4e-5,1 1.125,0.125 2.875,-0.125 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23839);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:transform-center-y="-1.49998"
- id="path23746"
- d="m 219.00004,431.00004 0.12109,-2.86328 -0.1211,-1.13676 -0.99999,4e-5 -0.125,1.125 0.125,2.875 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23841);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:transform-center-y="-1.49998"
- id="path23748"
- d="m 215.00004,428.00004 2.86328,0.12109 1.13676,-0.12109 -4e-5,-1 -1.125,-0.125 -2.875,0.125 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23843);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc" />
- <g
- id="g23751"
- transform="translate(133.00004,-201.99996)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- id="rect23753"
- width="1"
- height="2"
- x="85"
- y="628.5" />
- <rect
- y="-86.5"
- x="629"
- height="2"
- width="1"
- id="rect23755"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- transform="rotate(90)" />
- </g>
- </g>
- <g
- transform="translate(0,-4)"
- id="g23757">
- <g
- id="g23759"
- transform="translate(0,-6.4549394)">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23845);stroke-width:1.59012127;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 230.20453,450.95187 v 0 l -2.22727,-0.63574 -0.95454,0.15894 v 0.9536 l 0.95454,0.15893 z"
- id="path23767"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23847);stroke-width:1.59012127;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 227.49999,453.65374 v 0 l 0.63637,-2.22507 -0.15909,-0.9536 h -0.95455 l -0.15909,0.9536 z"
- id="path23770"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23849);stroke-width:1.59012127;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 224.79546,450.95187 v 0 l 2.22727,0.63574 0.95454,-0.15894 v -0.9536 l -0.95454,-0.15893 z"
- id="path23774"
- sodipodi:nodetypes="ccccccc"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- inkscape:transform-center-y="-1.75"
- sodipodi:nodetypes="ccccccc"
- id="path23776"
- d="m 227.5,448.25 v 0 l -0.63637,2.22507 0.15909,0.9536 h 0.95455 l 0.15909,-0.9536 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23851);stroke-width:1.59012127;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="g23778">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23853);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 227.18182,441.00653 -0.31818,2.86081 0.15909,1.11253 h 0.95454 l 0.15909,-1.11253 -0.31818,-2.86081 z"
- id="path23780"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23856);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 231,444.1852 -2.86364,-0.31786 -1.11363,0.15893 v 0.9536 l 1.11363,0.15894 L 231,444.82094 Z"
- id="path23782"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23858);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 227.18182,447.99961 -0.31818,-2.8608 0.15909,-1.11254 h 0.95454 l 0.15909,1.11254 -0.31818,2.8608 z"
- id="path23784"
- inkscape:transform-center-y="-1.75" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23860);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 224.00001,444.82094 2.86363,0.31787 1.11363,-0.15894 v -0.9536 l -1.11363,-0.15893 -2.86363,0.31786 z"
- id="path23786"
- inkscape:transform-center-y="-1.75" />
- </g>
- <g
- id="g23788">
- <g
- id="g23791"
- transform="translate(141.99999,-184.99353)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- id="rect23793"
- width="1"
- height="2"
- x="85"
- y="628.5" />
- <rect
- y="-86.5"
- x="629"
- height="2"
- width="1"
- id="rect23795"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;enable-background:accumulate"
- transform="rotate(90)" />
- </g>
- </g>
- </g>
- </g>
- </g>
- </g>
- <g
- id="ICON_BUTS"
- transform="translate(-49,6.0000069)"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g42357.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- y="529"
- x="117"
- height="16"
- width="16"
- id="rect24298"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(28.71596,210.64282)"
- id="g41346"
- style="display:inline">
- <rect
- style="display:inline;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- id="rect41308"
- width="14"
- height="6.0000124"
- x="88.784042"
- y="326.84842"
- ry="2.0305908"
- rx="2.0305908"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- rx="1.029202"
- ry="1.029202"
- y="327.84842"
- x="89.784042"
- height="4.00875"
- width="12"
- id="rect41626"
- style="display:inline;fill:none;stroke:url(#linearGradient24317);stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="2.0154257"
- ry="2.0154257"
- y="319.85718"
- x="88.784042"
- height="4.9999971"
- width="14"
- id="rect41313"
- style="display:inline;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" />
- <rect
- rx="0.97821051"
- ry="0.97821051"
- y="320.85718"
- x="89.784042"
- height="2.9999971"
- width="12.000008"
- id="rect41629"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#linearGradient24319);stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect41631"
- width="8"
- height="3.9999919"
- x="89.284042"
- y="320.35718"
- rx="0"
- ry="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- style="display:inline;opacity:0.7;fill:none;stroke:url(#linearGradient24321);stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- id="rect41633"
- width="12.000008"
- height="2.9999971"
- x="89.784042"
- y="320.85718"
- ry="0.97821051"
- rx="0.97821051" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect41635"
- width="0.99999988"
- height="3.0000272"
- x="96.284042"
- y="320.85718"
- rx="0"
- ry="0" />
- <g
- style="display:inline;opacity:0.8;enable-background:new"
- transform="matrix(-1,0,0,1,193.28404,-130.61032)"
- id="g41637">
- <g
- id="g41639">
- <rect
- transform="matrix(-1,0,0,1,194,-1.1e-6)"
- ry="0"
- rx="0"
- y="459.9675"
- x="91"
- height="1"
- width="1"
- id="rect41641"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- transform="matrix(-1,0,0,1,194,-1.1e-6)"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect24094"
- width="1"
- height="3"
- x="92"
- y="458.9675"
- rx="0"
- ry="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect24096"
- width="1"
- height="1"
- x="92"
- y="459.9675"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="458.9675"
- x="93"
- height="3"
- width="1"
- id="rect24098"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- </g>
- </g>
- </g>
- <g
- id="ICON_IMASEL"
- transform="translate(0,128.00001)">
- <rect
- y="407"
- x="194"
- height="16"
- width="16"
- id="rect24195"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-230,238.99245)"
- id="g41674"
- style="display:inline">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24238);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- d="M 424.5,170.5 V 181 l 1.5,1.5 h 9.5 v -11 h -7 v -1 z"
- id="path24199"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <g
- style="display:inline"
- id="g41677"
- transform="translate(-26,49.00749)">
- <rect
- ry="0"
- rx="0"
- y="120.50006"
- x="456.5"
- height="7.9999371"
- width="7.0000038"
- id="rect41679"
- style="fill:url(#linearGradient24276);fill-opacity:1;fill-rule:nonzero;stroke:#4d4d4d;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <g
- id="g41681">
- <path
- style="fill:#c80000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 192,239 v 2 h 2 v -2 z m 2,2 v 2 h 2 v -2 z m 0,2 h -2 v 2 h 2 z m -2,0 v -2 h -2 v 2 z"
- transform="translate(267,-117.99994)"
- id="path41683"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- ry="0"
- rx="0"
- y="121.5"
- x="457.5"
- height="5.9999981"
- width="5.0000038"
- id="rect41685"
- style="display:inline;fill:none;stroke:url(#linearGradient24278);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#d1c595;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient24244);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 427.5,175.5 12,0.008 v 5.5 l -1.5,1.49245 -12,0.008 v -2 h 1.5 v -5.00755 z"
- id="path41687"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 426.5,181.5 -1.01563,-0.98437 v -9.02344 h 2 v 1 l 2.17355,0.0154"
- id="path41689"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;opacity:0.18999999;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 428,181.50755 h 9.5"
- id="path41691"
- inkscape:connector-curvature="0" />
- <path
- id="path41693"
- d="m 438.5,176.50755 -10,-0.008 v 4.00755 l -1.5,1.5 -1.5,-1.5"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#linearGradient24246);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#ffffff;fill-rule:evenodd;stroke:none"
- d="m 428,171.00755 v 2 h -3 v -2 z"
- id="path24228"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <g
- id="g24230"
- transform="translate(270,-408)"
- style="display:inline;fill:#d45500;fill-opacity:1" />
- <path
- sodipodi:nodetypes="ccccccccccccc"
- id="path24234"
- d="M 424.5,170.5 V 181 l 1.5,1.5 12,0.008 1.5,-1.49245 v -5.5 l -2,-0.008 v -6 h -7 v 2 l -2,-0.008 v -1 h -4 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2a2512;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.3;fill:none;stroke:#d40000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 189.5,244.14308 V 238.5 h 7 v 5.64842"
- id="path41698"
- sodipodi:nodetypes="cccc"
- transform="translate(241,-68.99245)"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_FILESEL"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g42357.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="translate(0,128.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect24152"
- width="16"
- height="16"
- x="89"
- y="407" />
- <g
- id="g24378">
- <path
- sodipodi:nodetypes="cccccccc"
- id="path41754"
- d="m 89.5,409.49245 v 10.5 l 1.5,1.5 h 9.5 v -11 h -7 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24374);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- style="display:inline"
- id="g41756"
- transform="translate(-361,287.99994)">
- <rect
- ry="0"
- rx="0"
- y="120.50006"
- x="456.5"
- height="7.9999371"
- width="7.0000038"
- id="rect24160"
- style="fill:url(#linearGradient41721);fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <rect
- ry="0"
- rx="0"
- y="121.5"
- x="457.5"
- height="5.9999981"
- width="5.0000038"
- id="rect24162"
- style="display:inline;fill:none;stroke:url(#linearGradient41723);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path41760"
- style="display:inline;opacity:0.65;fill:none;stroke:#333333;stroke-width:0.9999997px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 458.49992,122.50172 h 3.00006 m -3.00006,1.99301 h 3.00006"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="cccccccc"
- id="path41762"
- d="m 92.5,414.49245 12,0.008 v 5.5 l -1.5,1.49245 -12,0.008 v -2 h 1.5 v -5.00755 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#d1c595;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient24367);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41764"
- d="m 91.5,420.49245 -1.01563,-0.98437 v -9.02344 h 2 v 1 l 2.17355,0.0154"
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path41766"
- d="m 93,420.5 h 9.5"
- style="display:inline;opacity:0.18999999;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#linearGradient24362);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 103.5,415.5 -10,-0.008 v 4.00755 l -1.5,1.5 -1.5,-1.5"
- id="path41768"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path24174"
- d="m 93,410 v 2 h -3 v -2 z"
- style="display:inline;fill:#ffffff;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2a2512;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 89.5,409.49245 v 10.5 l 1.5,1.5 12,0.008 1.5,-1.49245 v -5.5 l -2,-0.008 v -6 h -7 v 2 l -2,-0.008 v -1 h -4 z"
- id="path24178"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path24190"
- d="m 95.5,410.5 v -2 h 7 v 5.92967"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_OUTLINER_DATA_LAMP">
- <rect
- ry="0"
- y="409"
- x="110"
- height="16"
- width="16"
- id="rect15876"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6;marker:none;enable-background:accumulate" />
- <g
- transform="translate(84,86)"
- id="g22846">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
- id="rect22783"
- width="16"
- height="16"
- x="26"
- y="323"
- ry="0" />
- <g
- id="g22817">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cssssssc"
- id="path22788"
- d="m 38.5,327.9 c 0,1.37785 -0.5625,2.19999 -1.6875,3.29999 -1.125,1.1 0,3.3 -1.40625,3.3 h -2.8125 c -1.40625,0 -0.28125,-2.2 -1.40625,-3.3 -1.125,-1.1 -1.6875,-1.93254 -1.6875,-3.29999 0,-2.4288 2.016,-4.4 4.5,-4.4 2.484,0 4.5,1.9712 4.5,4.4 z"
- style="opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.9;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 38.5,327.9 c 0,1.37785 -0.5625,2.19999 -1.6875,3.29999 -1.125,1.1 0,3.3 -1.40625,3.3 h -2.8125 c -1.40625,0 -0.28125,-2.2 -1.40625,-3.3 -1.125,-1.1 -1.6875,-1.93254 -1.6875,-3.29999 0,-2.4288 2.016,-4.4 4.5,-4.4 2.484,0 4.5,1.9712 4.5,4.4 z"
- id="path22790"
- sodipodi:nodetypes="cssssssc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- id="path22792"
- d="m 33,338 h 2 v 1 l -2,-10e-6 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- ry="0.765625"
- rx="0.765625"
- y="333.25"
- x="31"
- height="4.75"
- width="6"
- id="rect22794"
- style="display:inline;overflow:visible;visibility:visible;fill:#24221c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#736c54;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect22796"
- width="4"
- height="3"
- x="32"
- y="334" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cssssccccsccsssc"
- id="path22798"
- d="m 249.09375,80 c -0.37566,0.05708 -0.59375,0.300736 -0.59375,0.5 0,0.227729 0.26882,0.500002 0.75,0.5 0.48959,-2e-6 2.86976,-0.0067 3.35937,-0.0067 0.4812,0 0.75,-0.272259 0.75,-0.5 0,-0.227736 -0.2688,-0.499998 -0.75,-0.5 L 249.25,80 c -0.0601,0 -0.10258,-0.0082 -0.15625,0 z m 0,2 c -0.37566,0.05708 -0.59375,0.300738 -0.59375,0.5 0,0.227729 0.26882,0.500003 0.75,0.5 l 3.35937,-0.0067 c 0.4812,0 0.75,-0.272257 0.75,-0.5 0,-0.227736 -0.2688,-0.499997 -0.75,-0.5 C 252.11976,81.993327 249.7396,82 249.25,82 c -0.0601,0 -0.10258,-0.0082 -0.15625,0 z"
- style="fill:url(#linearGradient22892);fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="matrix(1.0666667,0,0,1,-233.7,254.00667)" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 32.25,336.24999 H 33.5"
- id="path22800"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- id="path22802"
- d="M 32.25,334.24999 H 33.5"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect22804"
- width="0.25"
- height="1"
- x="37"
- y="336" />
- <rect
- y="334"
- x="37"
- height="1"
- width="0.25"
- id="rect22807"
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="336"
- x="30.75"
- height="1"
- width="0.25"
- id="rect22809"
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect22812"
- width="0.25"
- height="1"
- x="30.75"
- y="334" />
- <path
- sodipodi:type="inkscape:offset"
- inkscape:radius="0.5"
- inkscape:original="M 250.5 70.5 C 248.844 70.5 247.5 71.84032 247.5 73.5 C 247.5 74.394207 247.88111 75.199102 248.5 75.75 C 249.02979 76.22159 249.25 77.500001 249.5 77.5 C 249.75 77.5 251.25 77.500001 251.5 77.5 C 251.75 77.5 251.97036 76.220976 252.5 75.75 C 253.11956 75.199071 253.5 74.394767 253.5 73.5 C 253.5 71.840318 252.156 70.5 250.5 70.5 z "
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient22954);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.61155295;marker:none;enable-background:accumulate"
- id="path22814"
- d="m 250.5,70 c -1.92579,0 -3.5,1.570388 -3.5,3.5 0,1.036273 0.44456,1.979112 1.16797,2.623047 0.12299,0.10948 0.32331,0.494568 0.47265,0.865234 0.0747,0.185333 0.14332,0.364013 0.22657,0.529297 0.0416,0.08264 0.084,0.163508 0.16211,0.253906 0.0781,0.0904 0.22638,0.228517 0.4707,0.228516 h 2 c 0.24442,0 0.39265,-0.138106 0.4707,-0.228516 0.0781,-0.09041 0.12244,-0.171247 0.16407,-0.253906 0.0832,-0.165318 0.14992,-0.34393 0.22461,-0.529297 0.14936,-0.370734 0.35006,-0.756218 0.47265,-0.865234 C 253.55622,75.479081 254,74.536495 254,73.5 254,71.570387 252.42579,70 250.5,70 Z"
- transform="matrix(1.1428575,0,0,1.1249998,-252.2858,245.25001)" />
- <path
- transform="matrix(1.1428578,0,0,1.1562502,-252.28587,242.81248)"
- d="m 250.5,70 c -1.92579,0 -3.5,1.570388 -3.5,3.5 0,1.036273 0.44456,1.979112 1.16797,2.623047 0.12299,0.10948 0.32331,0.494568 0.47265,0.865234 0.0747,0.185333 0.14332,0.364013 0.22657,0.529297 0.0416,0.08264 0.084,0.163508 0.16211,0.253906 0.0781,0.0904 0.22638,0.228517 0.4707,0.228516 h 2 c 0.24442,0 0.39265,-0.138106 0.4707,-0.228516 0.0781,-0.09041 0.12244,-0.171247 0.16407,-0.253906 0.0832,-0.165318 0.14992,-0.34393 0.22461,-0.529297 0.14936,-0.370734 0.35006,-0.756218 0.47265,-0.865234 C 253.55622,75.479081 254,74.536495 254,73.5 254,71.570387 252.42579,70 250.5,70 Z"
- id="path22816"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:url(#radialGradient22952);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.61155295;marker:none;enable-background:accumulate"
- inkscape:original="M 250.5 70.5 C 248.844 70.5 247.5 71.84032 247.5 73.5 C 247.5 74.394207 247.88111 75.199102 248.5 75.75 C 249.02979 76.22159 249.25 77.500001 249.5 77.5 C 249.75 77.5 251.25 77.500001 251.5 77.5 C 251.75 77.5 251.97036 76.220976 252.5 75.75 C 253.11956 75.199071 253.5 74.394767 253.5 73.5 C 253.5 71.840318 252.156 70.5 250.5 70.5 z "
- inkscape:radius="0.5"
- sodipodi:type="inkscape:offset" />
- <path
- inkscape:connector-curvature="0"
- id="path22818"
- style="display:inline;fill:none;stroke:url(#linearGradient22928);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 34.000001,324.48827 c 1.932,0 3.5,1.50111 3.5,3.35068 0,0.99715 -0.455735,1.89301 -1.178554,2.50697 -0.617914,0.52487 -1.154779,1.38605 -1.154779,2.77907 m -1.166667,-8.63672 c -1.932001,0 -3.500001,1.50111 -3.500001,3.35068 0,0.99715 0.455736,1.89301 1.178556,2.50697 0.617913,0.52487 1.154778,1.38605 1.154778,2.77907" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient22950);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path22820"
- transform="matrix(0.9552133,0,0,0.9315985,-40.901258,-140.2522)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <circle
- transform="matrix(0.99567,0,-0.00787885,1,-30.663533,191)"
- style="display:inline;opacity:0.9;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- id="path22822"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="64"
- cy="135"
- r="1" />
- <path
- inkscape:connector-curvature="0"
- d="m 34.000001,324.48827 c 1.932,0 3.5,1.50111 3.5,3.35068 0,0.99715 -0.455735,1.89301 -1.178554,2.50697 -0.617914,0.52487 -1.154779,1.38605 -1.154779,2.77907 m -1.166667,-8.63672 c -1.932001,0 -3.500001,1.50111 -3.500001,3.35068 0,0.99715 0.455736,1.89301 1.178556,2.50697 0.617913,0.52487 1.154778,1.38605 1.154778,2.77907"
- style="display:inline;fill:none;stroke:url(#radialGradient22922);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- id="path22824" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:#3d3829;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- id="rect22826"
- width="5"
- height="0.75"
- x="31.5"
- y="333" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#6c6753;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 32.5,337.01145 3,-0.0115 v 1 l -3,0.0114 v -0.99999 z"
- id="path22828"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:url(#linearGradient22917);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- d="m 33,330 v 2.75 h 2 V 330 Z"
- id="path22830"
- sodipodi:nodetypes="ccccc" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.20000005;marker:none;enable-background:accumulate"
- id="rect22832"
- width="1"
- height="1"
- x="32"
- y="328" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="csscssc"
- id="path22836"
- style="display:inline;fill:none;stroke:url(#radialGradient23727);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 32.875,333.12498 c 0,-1.39113 -0.517691,-2.25114 -1.113536,-2.77529 C 31.064459,329.73656 30.5,328.93567 30.5,327.93988 c 0,-1.84706 1.637,-3.43989 3.5,-3.43989 1.863,0 3.5,1.59283 3.5,3.43989 0,0.99579 -0.564459,1.79668 -1.261464,2.40981 -0.595845,0.52415 -1.113536,1.38416 -1.113536,2.77529" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 33,338.00001 h 0.5 v 1 L 33,339 Z"
- id="path22838"
- sodipodi:nodetypes="ccccc" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.20000005;marker:none;enable-background:accumulate"
- id="rect23759"
- width="2"
- height="1"
- x="33"
- y="329" />
- <rect
- y="328"
- x="35"
- height="1"
- width="1"
- id="rect23761"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.20000005;marker:none;enable-background:accumulate" />
- </g>
- </g>
- </g>
- <g
- id="ICON_OUTLINER_OB_LAMP"
- transform="translate(84,107.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
- id="rect23769"
- width="16"
- height="16"
- x="26"
- y="323"
- ry="0" />
- <g
- id="g23771">
- <path
- sodipodi:nodetypes="cssssssc"
- id="path23788"
- d="m 38.5,327.9 c 0,1.37785 -0.5625,2.19999 -1.6875,3.29999 -1.125,1.1 0,3.3 -1.40625,3.3 h -2.8125 c -1.40625,0 -0.28125,-2.2 -1.40625,-3.3 -1.125,-1.1 -1.6875,-1.93254 -1.6875,-3.29999 0,-2.4288 2.016,-4.4 4.5,-4.4 2.484,0 4.5,1.9712 4.5,4.4 z"
- style="opacity:0.3;fill:#ff8400;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#2b1600;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 38.5,327.9 c 0,1.37785 -0.5625,2.19999 -1.6875,3.29999 -1.125,1.1 0,3.3 -1.40625,3.3 h -2.8125 c -1.40625,0 -0.28125,-2.2 -1.40625,-3.3 -1.125,-1.1 -1.6875,-1.93254 -1.6875,-3.29999 0,-2.4288 2.016,-4.4 4.5,-4.4 2.484,0 4.5,1.9712 4.5,4.4 z"
- id="path23802"
- sodipodi:nodetypes="cssssssc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path23808"
- d="m 33,338 h 2 v 1 l -2,-10e-6 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <rect
- ry="0.765625"
- rx="0.765625"
- y="333.25"
- x="31"
- height="4.75"
- width="6"
- id="rect23810"
- style="display:inline;overflow:visible;visibility:visible;fill:#2b1600;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#846544;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23812"
- width="4"
- height="3"
- x="32"
- y="334" />
- <path
- sodipodi:nodetypes="cssssccccsccsssc"
- id="path23816"
- d="m 249.09375,80 c -0.37566,0.05708 -0.59375,0.300736 -0.59375,0.5 0,0.227729 0.26882,0.500002 0.75,0.5 0.48959,-2e-6 2.86976,-0.0067 3.35937,-0.0067 0.4812,0 0.75,-0.272259 0.75,-0.5 0,-0.227736 -0.2688,-0.499998 -0.75,-0.5 L 249.25,80 c -0.0601,0 -0.10258,-0.0082 -0.15625,0 z m 0,2 c -0.37566,0.05708 -0.59375,0.300738 -0.59375,0.5 0,0.227729 0.26882,0.500003 0.75,0.5 l 3.35937,-0.0067 c 0.4812,0 0.75,-0.272257 0.75,-0.5 0,-0.227736 -0.2688,-0.499997 -0.75,-0.5 C 252.11976,81.993327 249.7396,82 249.25,82 c -0.0601,0 -0.10258,-0.0082 -0.15625,0 z"
- style="fill:url(#linearGradient23890);fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="matrix(1.0666667,0,0,1,-233.7,254.00667)"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 32.25,336.24999 H 33.5"
- id="path23819"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path23821"
- d="M 32.25,334.24999 H 33.5"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23824"
- width="0.25"
- height="1"
- x="37"
- y="336" />
- <rect
- y="334"
- x="36.96875"
- height="1.099999"
- width="0.28125"
- id="rect23826"
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="336"
- x="30.75"
- height="1"
- width="0.25"
- id="rect23828"
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23830"
- width="0.28125"
- height="1.099999"
- x="30.90625"
- y="333.95001" />
- <path
- sodipodi:type="inkscape:offset"
- inkscape:radius="0.5"
- inkscape:original="M 250.5 70.5 C 248.844 70.5 247.5 71.84032 247.5 73.5 C 247.5 74.394207 247.88111 75.199102 248.5 75.75 C 249.02979 76.22159 249.25 77.500001 249.5 77.5 C 249.75 77.5 251.25 77.500001 251.5 77.5 C 251.75 77.5 251.97036 76.220976 252.5 75.75 C 253.11956 75.199071 253.5 74.394767 253.5 73.5 C 253.5 71.840318 252.156 70.5 250.5 70.5 z "
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23892);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.61155295;marker:none;enable-background:accumulate"
- id="path23838"
- d="m 250.5,70 c -1.92579,0 -3.5,1.570388 -3.5,3.5 0,1.036273 0.44456,1.979112 1.16797,2.623047 0.12299,0.10948 0.32331,0.494568 0.47265,0.865234 0.0747,0.185333 0.14332,0.364013 0.22657,0.529297 0.0416,0.08264 0.084,0.163508 0.16211,0.253906 0.0781,0.0904 0.22638,0.228517 0.4707,0.228516 h 2 c 0.24442,0 0.39265,-0.138106 0.4707,-0.228516 0.0781,-0.09041 0.12244,-0.171247 0.16407,-0.253906 0.0832,-0.165318 0.14992,-0.34393 0.22461,-0.529297 0.14936,-0.370734 0.35006,-0.756218 0.47265,-0.865234 C 253.55622,75.479081 254,74.536495 254,73.5 254,71.570387 252.42579,70 250.5,70 Z"
- transform="matrix(1.1428575,0,0,1.1249998,-252.2858,245.25001)" />
- <path
- transform="matrix(1.1428578,0,0,1.1562502,-252.28587,242.81248)"
- d="m 250.5,70 c -1.92579,0 -3.5,1.570388 -3.5,3.5 0,1.036273 0.44456,1.979112 1.16797,2.623047 0.12299,0.10948 0.32331,0.494568 0.47265,0.865234 0.0747,0.185333 0.14332,0.364013 0.22657,0.529297 0.0416,0.08264 0.084,0.163508 0.16211,0.253906 0.0781,0.0904 0.22638,0.228517 0.4707,0.228516 h 2 c 0.24442,0 0.39265,-0.138106 0.4707,-0.228516 0.0781,-0.09041 0.12244,-0.171247 0.16407,-0.253906 0.0832,-0.165318 0.14992,-0.34393 0.22461,-0.529297 0.14936,-0.370734 0.35006,-0.756218 0.47265,-0.865234 C 253.55622,75.479081 254,74.536495 254,73.5 254,71.570387 252.42579,70 250.5,70 Z"
- id="path23840"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.95;fill:url(#radialGradient23894);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.61155295;marker:none;enable-background:accumulate"
- inkscape:original="M 250.5 70.5 C 248.844 70.5 247.5 71.84032 247.5 73.5 C 247.5 74.394207 247.88111 75.199102 248.5 75.75 C 249.02979 76.22159 249.25 77.500001 249.5 77.5 C 249.75 77.5 251.25 77.500001 251.5 77.5 C 251.75 77.5 251.97036 76.220976 252.5 75.75 C 253.11956 75.199071 253.5 74.394767 253.5 73.5 C 253.5 71.840318 252.156 70.5 250.5 70.5 z "
- inkscape:radius="0.5"
- sodipodi:type="inkscape:offset" />
- <path
- id="path23842"
- style="display:inline;fill:none;stroke:url(#linearGradient23896);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 34.000001,324.48827 c 1.932,0 3.5,1.50111 3.5,3.35068 0,0.99715 -0.455735,1.89301 -1.178554,2.50697 -0.617914,0.52487 -1.154779,1.38605 -1.154779,2.77907 m -1.166667,-8.63672 c -1.932001,0 -3.500001,1.50111 -3.500001,3.35068 0,0.99715 0.455736,1.89301 1.178556,2.50697 0.617913,0.52487 1.154778,1.38605 1.154778,2.77907"
- inkscape:connector-curvature="0" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient23898);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path23844"
- transform="matrix(0.9552133,0,0,0.9315985,-40.901258,-140.2522)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <circle
- transform="matrix(0.99567,0,-0.00787885,1,-30.654936,191)"
- style="display:inline;opacity:0.9;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- id="path23846"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="64"
- cy="135"
- r="1" />
- <path
- d="m 34.000001,324.48827 c 1.932,0 3.5,1.50111 3.5,3.35068 0,0.99715 -0.455735,1.89301 -1.178554,2.50697 -0.617914,0.52487 -1.154779,1.38605 -1.154779,2.77907 m -1.166667,-8.63672 c -1.932001,0 -3.500001,1.50111 -3.500001,3.35068 0,0.99715 0.455736,1.89301 1.178556,2.50697 0.617913,0.52487 1.154778,1.38605 1.154778,2.77907"
- style="display:inline;fill:none;stroke:url(#radialGradient23900);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- id="path23848"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:#503416;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- id="rect23850"
- width="5"
- height="0.75"
- x="31.5"
- y="333" />
- <path
- style="fill:#552c00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 32.5,337.01145 3,-0.0115 v 1 l -3,0.0114 v -0.99999 z"
- id="path23852"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:url(#linearGradient23902);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- d="m 33,330 v 2.75 h 2 V 330 Z"
- id="path23860"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.20000005;marker:none;enable-background:accumulate"
- id="rect23862"
- width="1"
- height="1"
- x="32"
- y="328" />
- <path
- sodipodi:nodetypes="csscssc"
- id="path23866"
- style="display:inline;fill:none;stroke:url(#radialGradient23904);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 32.875,333.12498 c 0,-1.39113 -0.517691,-2.25114 -1.113536,-2.77529 C 31.064459,329.73656 30.5,328.93567 30.5,327.93988 c 0,-1.84706 1.637,-3.43989 3.5,-3.43989 1.863,0 3.5,1.59283 3.5,3.43989 0,0.99579 -0.564459,1.79668 -1.261464,2.40981 -0.595845,0.52415 -1.113536,1.38416 -1.113536,2.77529"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 33,338.00001 h 0.5 v 1 L 33,339 Z"
- id="path23873"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.20000005;marker:none;enable-background:accumulate"
- id="rect23877"
- width="2"
- height="1"
- x="33"
- y="329" />
- <rect
- y="328"
- x="35"
- height="1"
- width="1"
- id="rect23888"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.20000005;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- id="ICON_LAMP"
- transform="translate(-21,233.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
- id="rect23915"
- width="16"
- height="16"
- x="26"
- y="323"
- ry="0" />
- <g
- id="g23917">
- <path
- sodipodi:nodetypes="cssssssc"
- id="path23920"
- d="m 38.5,327.9 c 0,1.37785 -0.5625,2.19999 -1.6875,3.29999 -1.125,1.1 0,3.3 -1.40625,3.3 h -2.8125 c -1.40625,0 -0.28125,-2.2 -1.40625,-3.3 -1.125,-1.1 -1.6875,-1.93254 -1.6875,-3.29999 0,-2.4288 2.016,-4.4 4.5,-4.4 2.484,0 4.5,1.9712 4.5,4.4 z"
- style="opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 38.5,327.9 c 0,1.37785 -0.5625,2.19999 -1.6875,3.29999 -1.125,1.1 0,3.3 -1.40625,3.3 h -2.8125 c -1.40625,0 -0.28125,-2.2 -1.40625,-3.3 -1.125,-1.1 -1.6875,-1.93254 -1.6875,-3.29999 0,-2.4288 2.016,-4.4 4.5,-4.4 2.484,0 4.5,1.9712 4.5,4.4 z"
- id="path23927"
- sodipodi:nodetypes="cssssssc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path23931"
- d="m 33,338 h 2 v 1 l -2,-10e-6 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <rect
- ry="0.765625"
- rx="0.765625"
- y="333.25"
- x="31"
- height="4.75"
- width="6"
- id="rect23933"
- style="display:inline;overflow:visible;visibility:visible;fill:#24221c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#a89858;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23935"
- width="4"
- height="3"
- x="32"
- y="334" />
- <path
- sodipodi:nodetypes="cssssccccsccsssc"
- id="path23948"
- d="m 249.09375,80 c -0.37566,0.05708 -0.59375,0.300736 -0.59375,0.5 0,0.227729 0.26882,0.500002 0.75,0.5 0.48959,-2e-6 2.86976,-0.0067 3.35937,-0.0067 0.4812,0 0.75,-0.272259 0.75,-0.5 0,-0.227736 -0.2688,-0.499998 -0.75,-0.5 L 249.25,80 c -0.0601,0 -0.10258,-0.0082 -0.15625,0 z m 0,2 c -0.37566,0.05708 -0.59375,0.300738 -0.59375,0.5 0,0.227729 0.26882,0.500003 0.75,0.5 l 3.35937,-0.0067 c 0.4812,0 0.75,-0.272257 0.75,-0.5 0,-0.227736 -0.2688,-0.499997 -0.75,-0.5 C 252.11976,81.993327 249.7396,82 249.25,82 c -0.0601,0 -0.10258,-0.0082 -0.15625,0 z"
- style="fill:url(#linearGradient24090);fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="matrix(1.0666667,0,0,1,-233.7,254.00667)"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 32.35,336.4 H 33.6"
- id="path23950"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path23956"
- d="M 32.35,334.4 H 33.6"
- style="fill:none;stroke:#ffffff;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23959"
- width="0.25"
- height="1"
- x="37"
- y="336" />
- <rect
- y="334"
- x="36.96875"
- height="1.099999"
- width="0.28125"
- id="rect23961"
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="336"
- x="30.75"
- height="1"
- width="0.25"
- id="rect23965"
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23967"
- width="0.28125"
- height="1.099999"
- x="30.90625"
- y="333.95001" />
- <path
- sodipodi:type="inkscape:offset"
- inkscape:radius="0.5"
- inkscape:original="M 250.5 70.5 C 248.844 70.5 247.5 71.84032 247.5 73.5 C 247.5 74.394207 247.88111 75.199102 248.5 75.75 C 249.02979 76.22159 249.25 77.500001 249.5 77.5 C 249.75 77.5 251.25 77.500001 251.5 77.5 C 251.75 77.5 251.97036 76.220976 252.5 75.75 C 253.11956 75.199071 253.5 74.394767 253.5 73.5 C 253.5 71.840318 252.156 70.5 250.5 70.5 z "
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24092);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.61155295;marker:none;enable-background:accumulate"
- id="path23982"
- d="m 250.5,70 c -1.92579,0 -3.5,1.570388 -3.5,3.5 0,1.036273 0.44456,1.979112 1.16797,2.623047 0.12299,0.10948 0.32331,0.494568 0.47265,0.865234 0.0747,0.185333 0.14332,0.364013 0.22657,0.529297 0.0416,0.08264 0.084,0.163508 0.16211,0.253906 0.0781,0.0904 0.22638,0.228517 0.4707,0.228516 h 2 c 0.24442,0 0.39265,-0.138106 0.4707,-0.228516 0.0781,-0.09041 0.12244,-0.171247 0.16407,-0.253906 0.0832,-0.165318 0.14992,-0.34393 0.22461,-0.529297 0.14936,-0.370734 0.35006,-0.756218 0.47265,-0.865234 C 253.55622,75.479081 254,74.536495 254,73.5 254,71.570387 252.42579,70 250.5,70 Z"
- transform="matrix(1.1428575,0,0,1.1249998,-252.2858,245.25001)" />
- <path
- transform="matrix(1.1428578,0,0,1.1562502,-252.28587,242.81248)"
- d="m 250.5,70 c -1.92579,0 -3.5,1.570388 -3.5,3.5 0,1.036273 0.44456,1.979112 1.16797,2.623047 0.12299,0.10948 0.32331,0.494568 0.47265,0.865234 0.0747,0.185333 0.14332,0.364013 0.22657,0.529297 0.0416,0.08264 0.084,0.163508 0.16211,0.253906 0.0781,0.0904 0.22638,0.228517 0.4707,0.228516 h 2 c 0.24442,0 0.39265,-0.138106 0.4707,-0.228516 0.0781,-0.09041 0.12244,-0.171247 0.16407,-0.253906 0.0832,-0.165318 0.14992,-0.34393 0.22461,-0.529297 0.14936,-0.370734 0.35006,-0.756218 0.47265,-0.865234 C 253.55622,75.479081 254,74.536495 254,73.5 254,71.570387 252.42579,70 250.5,70 Z"
- id="path23984"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:url(#radialGradient24094);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.61155295;marker:none;enable-background:accumulate"
- inkscape:original="M 250.5 70.5 C 248.844 70.5 247.5 71.84032 247.5 73.5 C 247.5 74.394207 247.88111 75.199102 248.5 75.75 C 249.02979 76.22159 249.25 77.500001 249.5 77.5 C 249.75 77.5 251.25 77.500001 251.5 77.5 C 251.75 77.5 251.97036 76.220976 252.5 75.75 C 253.11956 75.199071 253.5 74.394767 253.5 73.5 C 253.5 71.840318 252.156 70.5 250.5 70.5 z "
- inkscape:radius="0.5"
- sodipodi:type="inkscape:offset" />
- <path
- id="path24054"
- style="display:inline;fill:none;stroke:url(#linearGradient24096);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 34.000001,324.48827 c 1.932,0 3.5,1.50111 3.5,3.35068 0,0.99715 -0.455735,1.89301 -1.178554,2.50697 -0.617914,0.52487 -1.154779,1.38605 -1.154779,2.77907 m -1.166667,-8.63672 c -1.932001,0 -3.500001,1.50111 -3.500001,3.35068 0,0.99715 0.455736,1.89301 1.178556,2.50697 0.617913,0.52487 1.154778,1.38605 1.154778,2.77907"
- inkscape:connector-curvature="0" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient24098);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path24056"
- transform="matrix(0.9552133,0,0,0.9315985,-40.901258,-140.2522)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <circle
- transform="matrix(0.99567,0,-0.00787885,1,-30.663533,191)"
- style="display:inline;opacity:0.9;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- id="path24060"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="64"
- cy="135"
- r="1" />
- <path
- d="m 34.000001,324.48827 c 1.932,0 3.5,1.50111 3.5,3.35068 0,0.99715 -0.455735,1.89301 -1.178554,2.50697 -0.617914,0.52487 -1.154779,1.38605 -1.154779,2.77907 m -1.166667,-8.63672 c -1.932001,0 -3.500001,1.50111 -3.500001,3.35068 0,0.99715 0.455736,1.89301 1.178556,2.50697 0.617913,0.52487 1.154778,1.38605 1.154778,2.77907"
- style="display:inline;fill:none;stroke:url(#radialGradient24100);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- id="path24064"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:#504416;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- id="rect24066"
- width="5"
- height="0.75"
- x="31.5"
- y="333" />
- <path
- style="fill:#6c6753;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 32.5,337.01145 3,-0.0115 v 1 l -3,0.0114 v -0.99999 z"
- id="path24068"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:url(#linearGradient24102);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- d="m 33,330 v 2.75 h 2 V 330 Z"
- id="path24070"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.20000005;marker:none;enable-background:accumulate"
- id="rect24072"
- width="1"
- height="1"
- x="32"
- y="328" />
- <path
- sodipodi:nodetypes="csscssc"
- id="path24078"
- style="display:inline;fill:none;stroke:url(#radialGradient24104);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 32.875,333.12498 c 0,-1.39113 -0.517691,-2.25114 -1.113536,-2.77529 C 31.064459,329.73656 30.5,328.93567 30.5,327.93988 c 0,-1.84706 1.637,-3.43989 3.5,-3.43989 1.863,0 3.5,1.59283 3.5,3.43989 0,0.99579 -0.564459,1.79668 -1.261464,2.40981 -0.595845,0.52415 -1.113536,1.38416 -1.113536,2.77529"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 33,338.00001 h 0.5 v 1 L 33,339 Z"
- id="path24082"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.20000005;marker:none;enable-background:accumulate"
- id="rect24086"
- width="2"
- height="1"
- x="33"
- y="329" />
- <rect
- y="328"
- x="35"
- height="1"
- width="1"
- id="rect24088"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.20000005;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- id="ICON_NEWFOLDER">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect51964"
- width="16"
- height="16"
- x="277.99997"
- y="73" />
- <g
- transform="translate(-168,2)"
- id="g25056">
- <g
- id="g24996"
- style="opacity:0.75">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect24939"
- width="16"
- height="16"
- x="446"
- y="71" />
- <g
- transform="translate(359,-336)"
- id="g24941">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc"
- id="path24943"
- d="m 89.5,410.5 v 9.49245 l 1.5,1.5 h 8.5 V 411.5 h -7 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient25073);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- id="g24945"
- transform="translate(-361,287.99994)" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc"
- id="path24947"
- d="m 92.5,414.4849 10,0.0151 v 5.50755 L 101,421.5 H 91 v -2 h 1.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#d1c595;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient25075);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path24949"
- d="m 91.5,420.49245 -1.01563,-0.98437 v -8.02344 l 1.01563,0.0154 v 1 h 7"
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="cccccc" />
- <path
- inkscape:connector-curvature="0"
- id="path24951"
- d="m 93,420.5 h 7.5"
- style="display:inline;opacity:0.18999999;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#linearGradient25077);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 101.5,415.50755 -8,-0.008 v 4 l -1.5,1.5 -1.5,-1.5"
- id="path24953" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2a2512;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 89.5,410.5 v 9.49245 l 1.5,1.5 10,0.0151 1.5,-1.49245 v -5.50755 l -3,-0.008 v -2.9849 l -7,-0.0151 v -1 h -3 z"
- id="path24957"
- sodipodi:nodetypes="ccccccccccc" />
- </g>
- </g>
- <g
- transform="matrix(0.9986805,0,0,1,129.4308,-202)"
- id="g25007"
- style="display:inline">
- <rect
- ry="1.2018067"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:none;stroke:#fac900;stroke-width:4.00264168;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect25009"
- width="3.0039635"
- height="3"
- x="318.99011"
- y="275"
- rx="1.2018067" />
- <rect
- ry="1.2018068"
- rx="1.2018068"
- y="275"
- x="318.99011"
- height="3"
- width="3.0039637"
- id="rect25011"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:none;stroke:#e6b800;stroke-width:2.00132084;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path32046"
- d="m 318.99011,278 c 0,-1.00003 3e-5,-2.00003 3e-5,-3.00006 1.00131,0 2.00262,0 3.00393,0 0,1.00003 -3e-5,2.00003 -3e-5,3.00006 -1.00131,0 -2.00262,0 -3.00393,0 z"
- style="fill:#aa8800;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path25013"
- d="m 318.48945,276 c 1.33509,0 2.67017,10e-6 4.00526,10e-6 0,0.33335 0,0.6667 0,1.00005 -1.33509,0 -2.67017,-1e-5 -4.00526,-1e-5 0,-0.33335 0,-0.6667 0,-1.00005 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 319.99139,278.50006 c 0,-1.33337 10e-6,-2.66669 10e-6,-4.00006 0.33379,0 0.66758,0 1.00137,0 0,1.33337 -1e-5,2.66669 -1e-5,4.00006 -0.33379,0 -0.66758,0 -1.00137,0 z"
- id="path25015"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- </g>
- <g
- id="ICON_BOOKMARKS"
- transform="translate(-126,2)"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <g
- id="g41200"
- style="display:inline;opacity:0.65;enable-background:new">
- <rect
- y="71"
- x="341"
- height="16"
- width="16"
- id="rect41164"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <g
- id="g41166"
- transform="translate(252,-337)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient42055);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- d="m 89.5,409.49245 v 10.5 l 1.5,1.5 10.5,0.008 v -11 l -8,-0.008 v -1 z"
- id="path41168"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(-361,287.99994)"
- id="g41170"
- style="display:inline" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#d1c595;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient42057);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 92.5,414.49245 11,0.0151 v 5.5 L 102,421.5 H 91 v -2 h 1.5 z"
- id="path41172"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 91.5,420.49245 -1.01563,-0.98437 v -9.02344 h 2 v 1 L 100.5,411.5"
- id="path41174"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;opacity:0.18999999;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 93,420.5 h 9.5"
- id="path41176"
- inkscape:connector-curvature="0" />
- <path
- id="path41178"
- d="m 102.5,415.5 -9,-0.008 v 4.00755 l -1.5,1.5 -1.5,-1.5"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#linearGradient42059);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-rule:evenodd;stroke:none"
- d="m 93,410 v 2 h -3 v -2 z"
- id="path41180"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccc"
- id="path41182"
- d="m 89.5,409.50755 v 10.4849 l 1.5,1.5 11,0.008 1.5,-1.49245 v -5.5 l -2,-0.008 v -3.9849 l -8,-0.008 v -1 h -4 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2a2512;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(-81,-80.992447)"
- id="g24185"
- style="display:inline">
- <path
- sodipodi:nodetypes="ccccccccccccccccccccccc"
- id="path41134"
- d="m 428.75,158.5 3,-0.008 v 6.50755 2.50755 h 0.75 v -1 h 1 v -1 h 2 v 1 h 1 v 1 h 0.67818 v -9.50755 H 436.5 v -0.5 h -0.25 v -0.75 l -1.75,-0.008 -4.75,0.008 v 1 h -1 v 0.75 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#401406;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- id="g41137"
- transform="translate(-16,37.992447)">
- <g
- transform="translate(0,-1)"
- id="g41139">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#822b0f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect24197"
- width="3"
- height="0.99999988"
- x="445"
- y="121.00755" />
- <g
- id="g24199">
- <path
- sodipodi:nodetypes="ccccc"
- id="path41143"
- d="m 446,120 v 1 h 6 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ed7e5c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#e7541a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 448,121 v 9.00755 l 1,0.008 v -1 h 1 v -1 l 1,-0.008 v 1.00755 h 1 v 1 l 1,-0.008 v -9.00755 h -5 z"
- id="path41145"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 448,121 v 9.00755 h 1 V 121 Z"
- id="path41147"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path41149"
- d="m 452,121 v 9.00755 h 1 V 121 Z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 446,120.00755 v 1 l 2,-0.008 v -1 z"
- id="path41151"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path41153"
- d="m 445,121.00755 v 1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.45;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- id="g24216"
- style="opacity:0.3">
- <path
- sodipodi:nodetypes="ccccc"
- id="path41156"
- d="m 451,128.00755 v 1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 450,127.00755 v 1 h 1 v -1 z"
- id="path41158"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path41160"
- d="m 449,128.00755 v 1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- </g>
- </g>
- </g>
- <g
- id="ICON_OUTLINER_DATA_LATTICE"
- transform="translate(0,128)">
- <rect
- transform="matrix(0,1,1,0,0,0)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate"
- id="rect23556"
- width="16"
- height="16"
- x="281"
- y="68" />
- <g
- transform="rotate(-90,55.5002,309.50021)"
- id="g24740">
- <g
- style="opacity:0.7"
- id="g24922">
- <path
- d="m 69.5,325.5 v 10 h 12 v -10 z m 6,0 v 10 m 6,-5 h -12"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#1a1a1a;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path24671"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path24673"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#cccccc;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 69.5,325.5 v 10 h 12 v -10 z m 6,0 v 10 m 6,-5 h -12"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="323.5"
- x="80.500122"
- height="3"
- width="2.9998772"
- id="rect24678"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path24681"
- d="m 83.00041,324.00001 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect24684"
- width="2.9998772"
- height="3"
- x="80.49971"
- y="334.5"
- ry="1.4999386"
- rx="1.4999386" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- d="m 83,335 c -0.6694,0 -1.3388,10e-6 -2.0082,10e-6 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path24686"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_OUTLINER_OB_LATTICE"
- transform="translate(1,127)">
- <rect
- transform="matrix(0,1,1,0,0,0)"
- y="67"
- x="303"
- height="16"
- width="16"
- id="rect23554"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(0,1,1,0,-255,214)"
- id="g24695">
- <g
- transform="translate(-356.00003,55.00003)"
- id="g24697">
- <g
- transform="translate(296.99995,249.99998)"
- id="g24699"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- style="display:inline" />
- <g
- id="g24701"
- transform="translate(187.99958,-21.0368)">
- <path
- sodipodi:nodetypes="ccccccccc"
- d="m 258.50045,291.53677 v 10 h 12 v -10 z m 6,0 v 10 m 6,-5 h -12"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:none;stroke:#2b1600;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path24703"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path24705"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ed993f;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 258.50045,291.53677 v 10 h 12 v -10 z m 6,0 v 10 m 6,-5 h -12"
- inkscape:connector-curvature="0" />
- <g
- id="g24709" />
- <path
- sodipodi:nodetypes="cccccccccc"
- d="m 258.50045,291.53677 v 3.28125 6.71875 h 12 v -10 z m 6,0 v 10 m 6,-5 h -12"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient62436);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path24711"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g24713">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect24715"
- width="1"
- height="1"
- x="90"
- y="325"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="325"
- x="96"
- height="1"
- width="1"
- id="rect24717"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect24719"
- width="1"
- height="1"
- x="102"
- y="325"
- rx="0"
- ry="0" />
- </g>
- <g
- transform="translate(0,5)"
- id="g24721">
- <rect
- ry="0"
- rx="0"
- y="325"
- x="90"
- height="1"
- width="1"
- id="rect24723"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect24725"
- width="1"
- height="1"
- x="96"
- y="325"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="325"
- x="102"
- height="1"
- width="1"
- id="rect24727"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="g24729"
- transform="translate(0,9.96875)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect24731"
- width="1"
- height="1"
- x="90"
- y="325.03125"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="325.03125"
- x="96"
- height="1"
- width="1"
- id="rect24733"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect24736"
- width="1"
- height="1"
- x="102"
- y="325.03125"
- rx="0"
- ry="0" />
- <path
- id="rect24766"
- d="m 70,304 v 1 h 1 v -1 z m 0,1 h -1 v 1 h 1 z m 6,-1 v 1 h 1 v -1 z m 0,1 h -1 v 1 h 1 z m 5,0 v 1 h 1 v -1 z m -11,4 v 1 h 1 v -1 z m 0,1 h -1 v 1 h 1 z m 6,-1 v 1 h 1 v -1 z m 0,1 h -1 v 1 h 1 z m 5,0 v 1 h 1 v -1 z m -11,4 v 1 h 1 v -1 z m 6,0 v 1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.27999998;fill:#2b1600;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="translate(21,11.03125)"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- id="ICON_MOD_LATTICE"
- transform="translate(1,2)">
- <rect
- transform="matrix(0,1,1,0,0,0)"
- y="340"
- x="261"
- height="16"
- width="16"
- id="rect23562"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate" />
- <g
- id="g24926"
- transform="matrix(0,1,1,0,18,172)">
- <g
- id="g24928"
- transform="translate(-356.00003,55.00003)">
- <g
- style="display:inline"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g24930"
- transform="translate(296.99995,249.99998)" />
- <g
- transform="translate(187.99958,-21.0368)"
- id="g24932">
- <path
- id="path24935"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:none;stroke:#0b1728;stroke-width:2.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 258.50045,291.53677 v 10 h 12 v -10 z m 6,0 v 10 m 6,-5 h -12"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- <path
- d="m 258.50045,291.53677 v 10 h 12 v -10 z m 6,0 v 10 m 6,-5 h -12"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient62558);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path24937"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- <g
- id="g24939" />
- </g>
- </g>
- <g
- id="g24943">
- <path
- id="rect24945"
- transform="translate(-252,42)"
- d="m 342,283 v 1 h 1 v -1 z m 6,0 v 1 h 1 v -1 z m 6,0 v 1 h 1 v -1 z m -12,5 v 1 h 1 v -1 z m 6,0 v 1 h 1 v -1 z m 6,0 v 1 h 1 v -1 z m -12,5 v 1 h 1 v -1 z m 6,0 v 1 h 1 v -1 z m 6,0 v 1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#linearGradient62560);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g24951"
- transform="translate(0,5)" />
- <g
- transform="translate(0,9.96875)"
- id="g24959">
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.27999998;fill:#162d50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 70,304 v 1 h 1 v -1 z m 0,1 h -1 v 1 h 1 z m 6,-1 v 1 h 1 v -1 z m 0,1 h -1 v 1 h 1 z m 5,0 v 1 h 1 v -1 z m -11,4 v 1 h 1 v -1 z m 0,1 h -1 v 1 h 1 z m 6,-1 v 1 h 1 v -1 z m 0,1 h -1 v 1 h 1 z m 5,0 v 1 h 1 v -1 z m -11,4 v 1 h 1 v -1 z m 6,0 v 1 h 1 v -1 z"
- id="path24967"
- transform="translate(21,11.03125)"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_OUTLINER_OB_META"
- transform="translate(-210,128)">
- <rect
- y="302"
- x="299"
- height="16"
- width="16"
- id="rect24543"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#f0a453;fill-opacity:1;fill-rule:nonzero;stroke:#2b1600;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 304.5,308.5 c 1.52069,0 3,-1.25 3,-2.5 0,-2 1.5,-3.5 3.5,-3.5 2,0 3.5,1.568 3.5,3.5 0,1.84581 -1.5,3.5 -3.5,3.5 -1.25,0 -2.5,1.5 -2.5,3 0,2.25 -1.75,4 -4,4 -2.25,0 -4,-1.75 -4,-4 0,-2.25 1.75,-4 4,-4 z"
- id="path24546"
- sodipodi:nodetypes="cssssszzs"
- inkscape:connector-curvature="0" />
- <path
- d="m 311,302.99023 c -1.75507,0 -3.00977,1.2547 -3.00977,3.00977 0,0.81824 -0.46262,1.55558 -1.10546,2.09375 -0.64284,0.53817 -1.4902,0.89648 -2.38477,0.89648 -1.996,0 -3.50977,1.51377 -3.50977,3.50977 0,1.996 1.51377,3.50977 3.50977,3.50977 1.996,0 3.50977,-1.51377 3.50977,-3.50977 0,-0.88607 0.35723,-1.7322 0.89453,-2.37695 0.53729,-0.64476 1.27476,-1.11328 2.0957,-1.11328 1.72989,0 3.00977,-1.42935 3.00977,-3.00977 0,-1.67845 -1.2658,-3.00977 -3.00977,-3.00977 z"
- id="path24792"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:url(#linearGradient24797);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.86598092;marker:none;enable-background:accumulate"
- inkscape:original="M 311 302.5 C 309 302.5 307.5 304 307.5 306 C 307.5 307.25 306.02069 308.5 304.5 308.5 C 302.25 308.5 300.5 310.25 300.5 312.5 C 300.5 314.75 302.25 316.5 304.5 316.5 C 306.75 316.5 308.5 314.75 308.5 312.5 C 308.5 311 309.75 309.5 311 309.5 C 313 309.5 314.5 307.84581 314.5 306 C 314.5 304.068 313 302.5 311 302.5 z "
- inkscape:radius="-0.48985747"
- sodipodi:type="inkscape:offset" />
- <path
- d="m 311,303.46484 c -1.5178,0 -2.53516,1.01736 -2.53516,2.53516 0,1.00544 -0.55221,1.85355 -1.27539,2.45898 -0.72317,0.60543 -1.66486,1.00586 -2.68945,1.00586 -1.74994,0 -3.03516,1.28522 -3.03516,3.03516 0,1.74994 1.28522,3.03516 3.03516,3.03516 1.74994,0 3.03516,-1.28522 3.03516,-3.03516 0,-1.01789 0.40216,-1.95525 1.00586,-2.67969 0.6037,-0.72444 1.44822,-1.28515 2.45898,-1.28515 1.46823,0 2.53516,-1.21183 2.53516,-2.53516 0,-1.43282 -1.03922,-2.53516 -2.53516,-2.53516 z"
- id="path24550"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#radialGradient24599);stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:original="M 311 302.5 C 309 302.5 307.5 304 307.5 306 C 307.5 307.25 306.02069 308.5 304.5 308.5 C 302.25 308.5 300.5 310.25 300.5 312.5 C 300.5 314.75 302.25 316.5 304.5 316.5 C 306.75 316.5 308.5 314.75 308.5 312.5 C 308.5 311 309.75 309.5 311 309.5 C 313 309.5 314.5 307.84581 314.5 306 C 314.5 304.068 313 302.5 311 302.5 z "
- inkscape:radius="-0.96440691"
- sodipodi:type="inkscape:offset" />
- <circle
- transform="translate(96.999991,232.95)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:url(#radialGradient43962);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.70000005;marker:none;enable-background:accumulate"
- id="path43958"
- cx="207.5"
- cy="79.5"
- r="3.5" />
- <circle
- id="path43960"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:url(#radialGradient43964);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.14754021;marker:none;enable-background:accumulate"
- transform="matrix(0.8714292,0,0,0.8714292,130.17844,236.77138)"
- cx="207.5"
- cy="79.5"
- r="3.5" />
- <path
- sodipodi:type="inkscape:offset"
- inkscape:radius="-0.96440691"
- inkscape:original="M 311 302.5 C 309 302.5 307.5 304 307.5 306 C 307.5 307.25 306.02069 308.5 304.5 308.5 C 302.25 308.5 300.5 310.25 300.5 312.5 C 300.5 314.75 302.25 316.5 304.5 316.5 C 306.75 316.5 308.5 314.75 308.5 312.5 C 308.5 311 309.75 309.5 311 309.5 C 313 309.5 314.5 307.84581 314.5 306 C 314.5 304.068 313 302.5 311 302.5 z "
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#radialGradient24632);stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path24630"
- d="m 311,303.46484 c -1.5178,0 -2.53516,1.01736 -2.53516,2.53516 0,1.00544 -0.55221,1.85355 -1.27539,2.45898 -0.72317,0.60543 -1.66486,1.00586 -2.68945,1.00586 -1.74994,0 -3.03516,1.28522 -3.03516,3.03516 0,1.74994 1.28522,3.03516 3.03516,3.03516 1.74994,0 3.03516,-1.28522 3.03516,-3.03516 0,-1.01789 0.40216,-1.95525 1.00586,-2.67969 0.6037,-0.72444 1.44822,-1.28515 2.45898,-1.28515 1.46823,0 2.53516,-1.21183 2.53516,-2.53516 0,-1.43282 -1.03922,-2.53516 -2.53516,-2.53516 z"
- transform="matrix(0,-1,-1,0,617,617)" />
- <path
- transform="matrix(0,-1,-1,0,617,617)"
- d="m 311,303.46484 c -1.5178,0 -2.53516,1.01736 -2.53516,2.53516 0,1.00544 -0.55221,1.85355 -1.27539,2.45898 -0.72317,0.60543 -1.66486,1.00586 -2.68945,1.00586 -1.74994,0 -3.03516,1.28522 -3.03516,3.03516 0,1.74994 1.28522,3.03516 3.03516,3.03516 1.74994,0 3.03516,-1.28522 3.03516,-3.03516 0,-1.01789 0.40216,-1.95525 1.00586,-2.67969 0.6037,-0.72444 1.44822,-1.28515 2.45898,-1.28515 1.46823,0 2.53516,-1.21183 2.53516,-2.53516 0,-1.43282 -1.03922,-2.53516 -2.53516,-2.53516 z"
- id="path24809"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient24820);stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:original="M 311 302.5 C 309 302.5 307.5 304 307.5 306 C 307.5 307.25 306.02069 308.5 304.5 308.5 C 302.25 308.5 300.5 310.25 300.5 312.5 C 300.5 314.75 302.25 316.5 304.5 316.5 C 306.75 316.5 308.5 314.75 308.5 312.5 C 308.5 311 309.75 309.5 311 309.5 C 313 309.5 314.5 307.84581 314.5 306 C 314.5 304.068 313 302.5 311 302.5 z "
- inkscape:radius="-0.96440691"
- sodipodi:type="inkscape:offset" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_IPO"
- transform="translate(32,248.99993)"
- mask="url(#mask23189)"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g42357.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- y="286"
- x="-6"
- height="16"
- width="16"
- id="rect39828"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g23145">
- <g
- id="g23149">
- <path
- id="path39832"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#1a1a1a;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M -4.5,289.5 H -3 c 3.5,0 1.9989834,11 6.5,11 2.6782554,0 2.25,-3 5.25,-3 H 9"
- sodipodi:nodetypes="csccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccscc"
- d="M 9,297.5 H 8.75 c -3,0 -2.5,3 -5.25,3 -4.5010166,0 -3,-11 -6.5,-11 h -2"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#bde7a2;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path39834"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path39836"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:none;stroke:url(#radialGradient23167);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 3.5,300.5 c -4.5,0 -3,-11 -6.5,-11"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23161">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path39839"
- d="m -4.5,294.5 h 6 c 4,0 2,-7 6,-7 h 1"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cssc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cssc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -5,294.5 h 6.5 c 4,0 2,-7 6,-7 H 9"
- id="path23165"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(54,277.99993)"
- id="ICON_NLA"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g42357.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect24131"
- width="16"
- height="16"
- x="203"
- y="257" />
- <g
- style="display:inline;enable-background:new"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g24133"
- transform="translate(-39.983882,19.00809)">
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 244.51612,238.49191 -0.0161,3 h 7.98388 l 0.0161,-3 z"
- id="path39845"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path39847"
- d="m 247.51612,241.49191 -0.0161,3 h 11 l 0.0161,-3 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path39849"
- d="m 243.5,247.49191 -0.0161,3 h 12 l 0.0161,-3 z"
- style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 250.48388,250.49191 -0.0161,3 h 7.01612 l 0.0161,-3 z"
- id="path39851"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient24202);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 205.51612,259.5 c 0,-0.25 0,-1 0,-1 h 6"
- id="path39853"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path24145"
- d="m 208.51612,262.5 c 0,-0.25 0,-1 0,-1 h 9"
- style="display:inline;fill:none;stroke:url(#linearGradient24204);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient24206);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 204.5,268.5 c 0,-0.25 0,-1 0,-1 h 10"
- id="path24147"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient24208);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 211.5,271.5 c 0,-0.25 0,-1 0,-1 h 5"
- id="path39857"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(2,298)"
- id="ICON_VIEW3D"
- style="display:inline;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g42357.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <g
- id="g40317"
- transform="matrix(-1.023377,0,0,1.016727,-99.930251,85.381494)">
- <path
- sodipodi:nodetypes="ccccc"
- id="path40319"
- d="m -114.25921,159.20547 v -6.88483 l 5.85921,2.61269 -0.01,7.96045 z"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.96069634;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.96069634;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -102.53333,159.20547 v -6.88483 l -5.86667,2.61269 -0.0101,7.96045 5.87676,-3.68831 z"
- id="path40321"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path40323"
- d="m -102.53333,152.32064 -5.8704,-1.47533 -5.85548,1.47533 5.85921,2.85858 z"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.96069634;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path40325"
- d="m -114.25921,159.20548 v -6.88484 l 5.86294,-1.47532 c 0,2.52838 -0.004,11.53297 -0.004,12.08795 l -5.85864,-3.72779 z"
- style="fill:url(#linearGradient40722);fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:#c9c9c9;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m -102.53333,159.20548 v -6.88484 l -5.8704,-1.47533 0.003,12.08796 5.86724,-3.72779 z"
- id="path40327"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path40329"
- d="m -102.53333,152.32064 -5.8704,-1.47533 -5.85548,1.47533 5.85548,1.72121 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- id="path40331"
- d="m -103.02191,152.32064 1e-5,6.63895 v 0 l -5.37437,3.44241 -5.37437,-3.44241 1e-5,-6.63895"
- style="display:inline;fill:none;stroke:url(#linearGradient40724);stroke-width:0.98034734px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="237"
- x="3"
- height="16"
- width="16"
- id="rect40333"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:3;marker:none;enable-background:accumulate" />
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(12.401337,137.46985)"
- id="ICON_SCRIPTWIN"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g42357.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect40383"
- width="16"
- height="16"
- x="265.59866"
- y="397.53015" />
- <g
- style="display:inline"
- id="g40385"
- transform="translate(2.6147745,148.53014)">
- <path
- id="path40387"
- d="m 270,251 v 1.625 c -0.53409,0.12195 -1.02562,0.33162 -1.46875,0.625 l -1.29736,-1.49999 -1.5,1.5 1.51611,1.28124 c -0.29338,0.44313 -0.50305,0.93466 -0.625,1.46875 H 265 v 2 h 1.625 c 0.12195,0.53409 0.33162,1.02562 0.625,1.46875 l -1.51611,1.28126 1.5,1.5 1.29736,-1.50001 c 0.44313,0.29338 0.93466,0.50305 1.46875,0.625 V 263 h 2 v -1.625 c 0.53409,-0.12195 1.02562,-0.33162 1.46875,-0.625 l 1.26514,1.50001 1.5,-1.5 -1.25,-1.25 c 0.29338,-0.44313 0.26916,-0.96592 0.39111,-1.50001 H 277 v -2 h -1.625 c -0.12195,-0.53409 -0.0977,-1.05686 -0.39111,-1.49999 l 1.25,-1.25 -1.5,-1.5 -1.25,1.25 C 273.04076,252.70663 272.53409,252.74695 272,252.625 V 251 Z m -1,4 h 4 v 4 h -4 z"
- style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient40734);fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 270,251 v 1.625 c -0.53409,0.12195 -1.07298,0.0816 -1.51611,0.37501 l -1.25,-1.25 -1.5,1.5 1.25,1.25 c -0.29338,0.44313 -0.23694,0.9659 -0.35889,1.49999 H 265 v 2 h 1.625 c 0.12195,0.53409 0.0655,1.05688 0.35889,1.50001 l -1.25,1.25 1.5,1.5 1.25,-1.25 c 0.44313,0.29338 0.98202,0.25304 1.51611,0.37499 V 263 h 2 v -1.625 c 0.53409,-0.12195 1.04076,-0.0816 1.48389,-0.37499 l 1.25,1.25 1.5,-1.5 -1.25,-1.25 c 0.29338,-0.44313 0.26916,-0.96592 0.39111,-1.50001 H 277 v -2 h -1.625 c -0.12195,-0.53409 -0.0977,-1.05686 -0.39111,-1.49999 l 1.25,-1.25 -1.5,-1.5 -1.25,1.25 C 273.04076,252.70663 272.53409,252.74695 272,252.625 V 251 Z m -1,4 h 4 v 4 h -4 z"
- id="path40389"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccscccccccc"
- id="path40391"
- d="M 274.73389,252.25001 273.5,253.75 m -2,-2.25 h -1 v 1.5 c -0.35104,0.0802 -1.01806,0.29269 -1.5172,0.50569 m -1.49,1.50752 c -0.20864,0.49552 -0.41426,1.14284 -0.4928,1.48679 h -1.5 v 1 m 1.5,-5 -0.5,0.5 m 1.25,6.5 -1.51611,1.25001"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- style="fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 273.23389,255.50001 v 3.75 L 269.5,259.25"
- id="path40393"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 266.43389,253.45001 1,-1"
- id="path40395"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_NODETREE">
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g42357.png"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect40397"
- width="16"
- height="16"
- x="320"
- y="535" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g42357.png"
- style="display:inline;enable-background:new"
- id="g40399"
- transform="translate(18.016113,298.07385)">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:none;stroke:#191919;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 309.21778,249.41313 5.01611,0.013 c 1.29844,0 2.25,-0.80274 2.25,-2.25 l 0.0161,-4.48698 c 0,-1.29844 -0.95156,-2.25 -2.25,-2.25 h -1.75"
- id="path40401"
- sodipodi:nodetypes="cccccc" />
- <rect
- rx="0.98426884"
- ry="0.99734437"
- y="239.5"
- x="309.50693"
- height="1.9947703"
- width="1.9930685"
- id="rect40403"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:none;stroke:#e8a930;stroke-width:2.99999928;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- id="path40406"
- d="m 310.98389,249.42615 h 3 c 1.29844,0 2.5,-1.20156 2.5,-2.5 l 0.0161,-3.93424 c 0,-1.29844 -1.20156,-2.55274 -2.5,-2.55274 h -1.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#bcd0f5;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="1.7691951"
- ry="1.5185405"
- y="246.42619"
- x="302.46777"
- height="5.9999523"
- width="7.0161614"
- id="rect40408"
- style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <rect
- style="fill:url(#linearGradient40736);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect40410"
- width="6.0161119"
- height="4.9999976"
- x="302.96777"
- y="246.92615"
- ry="0.010695697"
- rx="0.0128693"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:0.99999958;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect40412"
- width="6.9999981"
- height="5.9341388"
- x="305.49991"
- y="237.42615"
- ry="1.4892343"
- rx="1.5194846"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="0.0086254831"
- ry="0.0053478414"
- y="247.92615"
- x="303.96777"
- height="0.99999762"
- width="4.0322218"
- id="rect40414"
- style="fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="opacity:0.8;fill:none;stroke:url(#linearGradient40738);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect40416"
- width="5.0161114"
- height="3.9999583"
- x="303.46777"
- y="247.42625"
- ry="0"
- rx="0"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="0"
- ry="0"
- y="237.92615"
- x="306"
- height="5.0000072"
- width="5.9999843"
- id="rect40418"
- style="fill:url(#linearGradient40740);fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect40420"
- width="4.0322237"
- height="0.99999762"
- x="306.98389"
- y="238.92615"
- ry="0.0053478414"
- rx="0.0071879062"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="0"
- ry="0"
- y="238.41525"
- x="306.5"
- height="3.9560828"
- width="5.0067563"
- id="rect40422"
- style="opacity:0.8;fill:none;stroke:url(#linearGradient40742);stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <rect
- rx="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffb72a;fill-opacity:1;fill-rule:nonzero;stroke:#553800;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect40424"
- width="2"
- height="1.9882908"
- x="309.48389"
- y="248.43787"
- ry="0" />
- <rect
- ry="0"
- y="239.43787"
- x="312.48389"
- height="1.9882908"
- width="2"
- id="rect40426"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffb72a;fill-opacity:1;fill-rule:nonzero;stroke:#553800;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- rx="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_SOUND"
- transform="translate(-1,128)"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g42357.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- y="407"
- x="216"
- height="16"
- width="16"
- id="rect40522"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- id="g40524"
- transform="translate(12,170.00654)">
- <path
- sodipodi:nodetypes="cccssssssccccsssssscccccc"
- id="path40526"
- d="m 207.5,239.5 v 3 5.03125 c -0.31763,0.0283 -0.63892,0.0942 -0.96875,0.21875 -0.61538,0.23235 -1.12455,0.59487 -1.5,1.03125 -0.37546,0.43635 -0.63146,0.99926 -0.46875,1.625 0.1627,0.62575 0.6413,0.93109 1.15625,1.03125 0.51496,0.10016 1.1346,0.0761 1.75,-0.15625 0.61542,-0.23236 1.12456,-0.62615 1.5,-1.0625 0.33776,-0.39252 0.53125,-0.86133 0.53125,-1.46875 v -6.25 h 6 v 5.03125 c -0.31763,0.0283 -0.63892,0.0942 -0.96875,0.21875 -0.61538,0.23235 -1.12455,0.59487 -1.5,1.03125 -0.37546,0.43635 -0.63146,0.99926 -0.46875,1.625 0.1627,0.62575 0.6413,0.93109 1.15625,1.03125 0.51496,0.10016 1.1346,0.0761 1.75,-0.15625 0.61542,-0.23236 1.12456,-0.62615 1.5,-1.0625 C 217.30651,249.82623 217.5,249.3373 217.5,248.75 v -9.25 h -1 -1 -6 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient40758);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.58322865;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- id="g40528">
- <path
- id="path40530"
- d="m 207.44628,248.42245 c -0.25577,0.0323 -0.54038,0.11684 -0.81334,0.24698 -0.36394,0.17354 -0.65949,0.40136 -0.86757,0.65378 -0.20806,0.2524 -0.34395,0.56878 -0.21514,0.8647 0.12879,0.29592 0.44506,0.40032 0.76358,0.40164 0.3185,0.001 0.6909,-0.0762 1.05486,-0.24968 0.36397,-0.17355 0.65786,-0.41845 0.86594,-0.67084 0.20807,-0.25239 0.34394,-0.56879 0.21514,-0.86472 -0.12879,-0.29592 -0.44345,-0.38323 -0.76195,-0.38454 -0.0796,-3.4e-4 -0.15625,-0.008 -0.24152,0.003 z"
- style="display:inline;fill:none;stroke:url(#linearGradient40760);stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#cccccc;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 209.5,241.5 h 6"
- id="path40532"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient40762);stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 215.4463,248.42245 c -0.25577,0.0323 -0.54038,0.11684 -0.81334,0.24698 -0.36394,0.17354 -0.65949,0.40136 -0.86757,0.65378 -0.20806,0.2524 -0.34395,0.56878 -0.21514,0.8647 0.12879,0.29592 0.44506,0.40032 0.76358,0.40164 0.3185,0.001 0.6909,-0.0762 1.05486,-0.24968 0.36397,-0.17355 0.65786,-0.41845 0.86594,-0.67084 0.20807,-0.25239 0.34394,-0.56879 0.21514,-0.86472 -0.12879,-0.29592 -0.44345,-0.38323 -0.76195,-0.38454 -0.0796,-3.4e-4 -0.15625,-0.008 -0.24152,0.003 z"
- id="path40534"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;opacity:0.96000001;enable-background:new"
- id="ICON_TIME"
- transform="translate(0,128)"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g42357.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect40604"
- width="16"
- height="16"
- x="299"
- y="407" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.927848,0,0,0.916217,147.82022,210.72362)"
- id="g40606"
- style="display:inline">
- <circle
- transform="matrix(0.87787,0,0,0.889264,55.67911,118.0341)"
- style="fill:url(#linearGradient42519);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.22752953;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path40608"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- style="display:inline;fill:none;stroke:url(#linearGradient42523);stroke-width:1.17973554;stroke-opacity:1"
- id="g40610"
- transform="matrix(0.784039,0,0,0.779055,172.50801,241.28815)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path40612"
- style="fill:none;stroke:url(#linearGradient42521);stroke-width:1.44816053;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.87787,0,0,0.889264,55.67911,118.0341)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- sodipodi:nodetypes="cccc"
- d="m 309.5,411.5 -3,3 m 0,1 2,2"
- style="fill:none;stroke:#ffffff;stroke-width:2.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path40614"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-x="-1.25"
- inkscape:transform-center-y="1.25"
- id="path40616"
- style="fill:none;stroke:#aa0000;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 306.5,415.5 2,2"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect40618"
- width="1"
- height="1.5"
- x="307"
- y="419" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect40620"
- width="1.5"
- height="1"
- x="311"
- y="414" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- d="m 309.5,411.5 -3,3"
- style="fill:none;stroke:#000000;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path40622"
- inkscape:transform-center-y="-0.75"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-1.0204512"
- inkscape:transform-center-x="1.4653436"
- id="path40624"
- d="m 306.85514,408.97535 c -3.25557,0.003 -5.8936,2.6597 -5.87155,5.95078 0.0105,1.56055 0.63214,2.99542 1.61111,4.05762 2.7831,-7.37691 5.95805,-1.77373 7.49116,-9.06794 -0.92886,-0.60835 -2.04538,-0.9415 -3.23072,-0.94046 z"
- style="fill:url(#linearGradient42525);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <rect
- y="415"
- x="301.51614"
- height="1"
- width="1.4999696"
- id="rect40626"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <rect
- y="409.5"
- x="306"
- height="1.4999921"
- width="1"
- id="rect40628"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <path
- inkscape:transform-center-y="-0.75"
- id="path40630"
- style="opacity:0.6;fill:none;stroke:#000000;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 309.5,411.5 -3,3"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(9,297.99992)"
- id="ICON_TEXT"
- style="display:inline;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g42357.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <g
- style="display:inline;opacity:0.96000001"
- id="g40634"
- transform="translate(-1.5986633,-160.53013)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect40636"
- width="16"
- height="16"
- x="165.59866"
- y="397.53015" />
- <g
- id="g40638"
- transform="translate(2.6147745,150.03014)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- style="display:inline">
- <rect
- style="display:inline;opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect40640"
- width="15.000031"
- height="16"
- x="162.99997"
- y="247.5" />
- <rect
- ry="1.9578006"
- rx="1.9578006"
- y="250.00002"
- x="164.48389"
- height="13.000053"
- width="11.999973"
- id="rect40642"
- style="fill:url(#linearGradient40788);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="ccccccccc"
- d="m 174.48389,251 1,1 v 9 l -1,1 h -8 l -1,-1 v -9 l 1,-1 z"
- style="display:inline;fill:none;stroke:url(#linearGradient40790);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- id="path40644"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccccccccccccccccccccccc"
- transform="translate(-0.0161112,10.500011)"
- id="path40646"
- d="m 165.25,238.25 1,-1 h 0.5 l 0.75,0.75 0.75,-0.75 h 0.5 l 0.75,0.75 0.75,-0.75 h 0.5 l 0.75,0.75 0.75,-0.75 h 0.5 l 0.75,0.83779 0.75,-0.83779 h 0.5 l 1,1 V 241 l -0.75,1 h -1 l -0.5,-1 -0.5,1 h -1 l -0.5,-1 -0.5,1 h -1 l -0.5,-1 -0.5,1 h -1 l -0.5,-1 -0.5,1 h -1 l -0.75,-1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient40792);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- d="m 166.48389,249.00001 v 2 m 2,-2 v 2 m 2,-2 v 2 m 2,-2 v 2 m 2,-2 v 2"
- style="fill:none;stroke:url(#linearGradient40794);stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- id="path40648"
- sodipodi:nodetypes="cccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <rect
- y="248"
- x="168"
- height="1"
- width="7"
- id="rect40650"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.29999995;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.29999995;marker:none;enable-background:accumulate"
- id="rect40652"
- width="7"
- height="1"
- x="168"
- y="246" />
- <rect
- y="244"
- x="168"
- height="1"
- width="7"
- id="rect40654"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.29999995;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.29999995;marker:none;enable-background:accumulate"
- id="rect40656"
- width="1"
- height="1"
- x="174"
- y="250" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_CONSOLE"
- transform="translate(18.999997,-40.99992)">
- <g
- style="display:inline"
- transform="translate(60.98406,570.00002)"
- id="g40521">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="translate(0.01612278,22)"
- id="g40523"
- style="display:inline">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path40525"
- d="M 296.49991,-1.4999999 H 283.49983 V -14.499999 h 13.00008 z"
- style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient40545);stroke-width:1.00000036px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 284.50009,-2.5000021 V -13.500009 H 295.5001 L 295.49983,-2.5 Z"
- id="path40527"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#9dac93;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.60000002;marker:none;enable-background:accumulate"
- d="m 345,578 v 1 h 12 v -1 z m 0,2 v 1 h 12 v -1 z m 0,2 v 1 h 12 v -1 z m 0,2 v 1 h 12 v -1 z m 0,2 v 1 h 12 v -1 z m 0,2 v 1 h 12 v -1 z"
- id="path40529"
- transform="translate(-61.000183,-592.00002)"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient40547);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 295.99982,-1.9999789 h -11.9999 V -14.00002 h 11.9999 z"
- id="path40531"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <rect
- y="580"
- x="347"
- height="1"
- width="0.99999863"
- id="rect40533"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate"
- id="rect40535"
- width="0.99999863"
- height="1"
- x="348"
- y="581" />
- <rect
- y="582"
- x="349"
- height="1"
- width="0.99999863"
- id="rect40537"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate"
- id="rect40539"
- width="0.99999863"
- height="1"
- x="348"
- y="583" />
- <rect
- y="584"
- x="347"
- height="1"
- width="0.99999863"
- id="rect40541"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate"
- id="rect40543"
- width="3"
- height="1"
- x="350"
- y="584" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_NODE"
- transform="translate(405,-17.000053)"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\x.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- transform="scale(1,-1)"
- y="-652.00006"
- x="104"
- height="16"
- width="16"
- id="rect23916"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g24071">
- <path
- sodipodi:nodetypes="ccccccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path23922"
- d="M 118.5,637.6177 117.25,636.5 h -10.5 l -1.25,1.25 0.0161,12.75006 L 106.5,651.5 h 11 l 1.01611,-0.99994 z"
- style="fill:url(#linearGradient26077);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- d="m 117,638 h -10 v 1 h 10 z"
- id="path23926"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient26079);stroke-width:0.99999923px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 117.5,650.25006 -0.25,0.25 h -10.5 l -0.25,-0.25 v -12.5 l 0.25,-0.25 h 10.5 l 0.25,0.25 z"
- id="path23928"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23930"
- width="1"
- height="1.0000043"
- x="115"
- y="-639"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="scale(1,-1)" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35476059;marker:none;enable-background:accumulate"
- d="m 108,641 v 4 h 4 v -4 z m 4,4 v 4 h 4 v -4 z"
- id="rect23964"
- inkscape:connector-curvature="0" />
- <path
- id="path24035"
- d="m 108,649 v -4 h 4 v 4 z m 4,-4 v -4 h 4 v 4 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35476059;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="-648.5"
- x="-115.5"
- height="7"
- width="7"
- id="rect23986"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.55;fill:none;stroke:url(#linearGradient26081);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="scale(-1)" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:none;stroke:url(#linearGradient26083);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect23971"
- width="7"
- height="7"
- x="108.5"
- y="641.5" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_NODE_SEL"
- transform="translate(426,-17.000053)"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\x.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- transform="scale(1,-1)"
- y="-652.00006"
- x="104"
- height="16"
- width="16"
- id="rect23328"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g23330">
- <path
- sodipodi:nodetypes="ccccccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path23333"
- d="M 118.5,637.6177 117.25,636.5 h -10.5 l -1.25,1.25 0.0161,12.75006 L 106.5,651.5 h 11 l 1.01611,-0.99994 z"
- style="fill:url(#linearGradient23351);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- d="m 117,638 h -10 v 1 h 10 z"
- id="path23335"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23353);stroke-width:0.99999923px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 117.5,650.25006 -0.25,0.25 h -10.5 l -0.25,-0.25 v -12.5 l 0.25,-0.25 h 10.5 l 0.25,0.25 z"
- id="path23337"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23339"
- width="1"
- height="1.0000043"
- x="115"
- y="-639"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="scale(1,-1)" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#b41500;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35476059;marker:none;enable-background:accumulate"
- d="m 108,641 v 4 h 4 v -4 z m 4,4 v 4 h 4 v -4 z"
- id="path23341"
- inkscape:connector-curvature="0" />
- <path
- id="path23345"
- d="m 108,649 v -4 h 4 v 4 z m 4,-4 v -4 h 4 v 4 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35476059;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="-648.5"
- x="-115.5"
- height="7"
- width="7"
- id="rect23347"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.45;fill:none;stroke:url(#linearGradient23355);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="scale(-1)" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:none;stroke:url(#linearGradient23357);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect23349"
- width="7"
- height="7"
- x="108.5"
- y="641.5" />
- </g>
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g42357.png"
- id="ICON_SEQ_SEQUENCER"
- transform="translate(-198,-247)"
- style="display:inline;enable-background:new">
- <rect
- y="257"
- x="203"
- height="16"
- width="16"
- id="rect42665"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-39.983882,19.00809)"
- id="g42667"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- style="display:inline;enable-background:new">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path42669"
- d="m 244.51612,238.49191 -0.0161,3 h 7.98388 l 0.0161,-3 z"
- style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 247.51612,241.49191 -0.0161,3 h 11 l 0.0161,-3 z"
- id="path42671"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 243.5,247.49191 -0.0161,3 h 12 l 0.0161,-3 z"
- id="path42673"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path42675"
- d="m 250.48388,250.49191 -0.0161,3 h 7.01612 l 0.0161,-3 z"
- style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccc"
- id="path42677"
- d="m 205.51612,259.5 c 0,-0.25 0,-1 0,-1 h 6"
- style="display:inline;fill:none;stroke:url(#linearGradient42685);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient42687);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 208.51612,262.5 c 0,-0.25 0,-1 0,-1 h 9"
- id="path42679"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path42681"
- d="m 204.5,268.5 c 0,-0.25 0,-1 0,-1 h 10"
- style="display:inline;fill:none;stroke:url(#linearGradient42689);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path42683"
- d="m 211.5,271.5 c 0,-0.25 0,-1 0,-1 h 5"
- style="display:inline;fill:none;stroke:url(#linearGradient42691);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_FILE_MOVIE"
- transform="translate(-306,-275)">
- <g
- style="display:inline"
- transform="translate(363,59)"
- id="g25596"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Pulpit\common file transparent SMALL.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- ry="0"
- rx="0.80014729"
- y="289"
- x="389"
- height="16"
- width="16"
- id="rect25598"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate" />
- <g
- id="g25600"
- transform="translate(-177,71)">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g25602"
- transform="translate(480,287.5)">
- <g
- id="g25604"
- transform="translate(-118.5,-200.5)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- <g
- id="g25606"
- transform="translate(1,24)"
- style="fill:#000000" />
- </g>
- </g>
- <rect
- rx="0"
- y="348"
- x="752"
- height="16"
- width="16"
- id="rect25608"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path25610"
- d="M 756.16666,348.50001 H 766.5 V 363.5 h -13 l -10e-6,-11.99999 z"
- style="display:inline;fill:url(#linearGradient25872);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- inkscape:connector-curvature="0" />
- <path
- d="M -48.500031,260.50809 -46.5,260.5 l -3.1e-5,-1.99191"
- style="display:inline;opacity:0.8;fill:none;stroke:#000000;stroke-width:0.76923829px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter31351)"
- id="path25612"
- sodipodi:nodetypes="ccc"
- transform="matrix(1.2999758,0,0,1.2999988,817.54887,13.43979)"
- inkscape:connector-curvature="0" />
- <g
- mask="url(#mask23591)"
- transform="translate(725,-419)"
- id="g25614"
- style="display:inline">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect25616"
- width="9"
- height="13.999984"
- x="31"
- y="768" />
- <g
- id="g25618">
- <rect
- y="771"
- x="32"
- height="1"
- width="1"
- id="rect25620"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect25622"
- width="1"
- height="1"
- x="32"
- y="773" />
- <rect
- y="775"
- x="32"
- height="1"
- width="1"
- id="rect25624"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect25626"
- width="1"
- height="1"
- x="32"
- y="777" />
- <rect
- y="779"
- x="32"
- height="1"
- width="1"
- id="rect25628"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect25630"
- width="1"
- height="1"
- x="32"
- y="781" />
- <rect
- y="771"
- x="34"
- height="3"
- width="3"
- id="rect25632"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect25634"
- width="3"
- height="3"
- x="34"
- y="775" />
- <rect
- y="779"
- x="34"
- height="3"
- width="3"
- id="rect25636"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect25638"
- width="1"
- height="1"
- x="38"
- y="771" />
- <rect
- y="773"
- x="38"
- height="1"
- width="1"
- id="rect25640"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect25642"
- width="1"
- height="1"
- x="38"
- y="775" />
- <rect
- y="777"
- x="38"
- height="1"
- width="1"
- id="rect25644"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect25646"
- width="1"
- height="1"
- x="38"
- y="779" />
- <rect
- y="781"
- x="38"
- height="1"
- width="1"
- id="rect25648"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect25650"
- width="1"
- height="1"
- x="32"
- y="769.02289" />
- <rect
- y="769.02289"
- x="38"
- height="1"
- width="1"
- id="rect25652"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect25654"
- width="3"
- height="2"
- x="34"
- y="768" />
- </g>
- </g>
- <path
- sodipodi:nodetypes="cccc"
- d="m 754.5,353 v 9.5 m 3.5,-13 h 7.5"
- style="display:inline;fill:none;stroke:url(#linearGradient25874);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- id="path25656"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 753,352 h 4 v -4 z"
- id="path25658"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="M 753.5,351.00001 V 363.5 h 13 V 348.50001 H 756 Z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path25660"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_FILE_SOUND"
- transform="translate(-152,-151)">
- <g
- transform="translate(-272,34)"
- id="g25437"
- style="display:inline;enable-background:new">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Pulpit\common file transparent SMALL.png"
- id="g25439"
- transform="translate(523,-99)"
- style="display:inline">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- id="rect25442"
- width="16"
- height="16"
- x="389"
- y="289"
- rx="0.80014729"
- ry="0" />
- <g
- transform="translate(-177,71)"
- id="g25444">
- <g
- transform="translate(480,287.5)"
- id="g25446"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="translate(-118.5,-200.5)"
- id="g25448" />
- </g>
- <g
- style="fill:#000000"
- transform="translate(1,24)"
- id="g25450" />
- </g>
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
- id="rect25452"
- width="16"
- height="16"
- x="912"
- y="190"
- rx="0" />
- <g
- id="g25454">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path25456"
- d="M 916.16666,190.50001 H 926.5 V 205.5 h -13 l -10e-6,-11.99999 z"
- style="display:inline;fill:url(#linearGradient26011);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- inkscape:connector-curvature="0" />
- <path
- d="M -48.500031,260.50809 -46.5,260.5 l -3.1e-5,-1.99191"
- style="display:inline;opacity:0.8;fill:none;stroke:#000000;stroke-width:0.76923829px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter22979)"
- id="path25458"
- sodipodi:nodetypes="ccc"
- transform="matrix(1.2999758,0,0,1.2999988,977.54887,-144.56021)"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- d="m 914.5,195 v 9.5 m 3.5,-13 h 7.5"
- style="display:inline;fill:none;stroke:url(#linearGradient26013);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- id="path25460"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 913,194 h 4 v -4 z"
- id="path25462"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="M 913.5,193.00001 V 205.5 h 13 V 190.50001 H 916 Z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path25464"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- sodipodi:nodetypes="ccccc"
- id="path25582"
- d="m 650,228 h 1 l -10e-6,6.5 h -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#112b00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#112b00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- d="m 654,227 v 2 h -4 l 10e-6,-2 z"
- id="path25584"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <g
- transform="matrix(0.8571421,0,0,0.8,601.28577,-208.6)"
- id="g25586"
- style="display:inline;enable-background:new">
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:#112b00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- id="path25588"
- transform="matrix(0.7630859,-0.2494396,0.2996015,0.9926766,-151.92281,17.77746)"
- cx="53"
- cy="554"
- rx="4.5"
- ry="2.25" />
- <ellipse
- clip-path="url(#clipPath20586)"
- inkscape:transform-center-y="0.3813435"
- transform="matrix(0.3848865,-0.1700959,0.2278131,0.3626733,-93.107467,361.59408)"
- id="path25590"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;filter:url(#filter20578);enable-background:accumulate"
- cx="53"
- cy="554"
- rx="4.5"
- ry="2.25" />
- </g>
- <path
- sodipodi:nodetypes="ccccc"
- id="path25592"
- d="m 654,227 v 1 h -4 l 10e-6,-1 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path25662"
- d="m 645.5,226.5 v 2 h -2"
- style="display:inline;fill:none;stroke:url(#linearGradient26015);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_FILE_TEXT"
- transform="translate(-86,-139)">
- <g
- transform="translate(-262,-147)"
- id="g25359"
- style="display:inline;enable-background:new">
- <g
- transform="translate(-34,169)"
- id="g25361">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Pulpit\common file transparent SMALL.png"
- id="g25363"
- transform="translate(523,-99)"
- style="display:inline">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- id="rect25365"
- width="16"
- height="16"
- x="389"
- y="289"
- rx="0.80014729"
- ry="0" />
- <g
- transform="translate(-177,71)"
- id="g25367">
- <g
- transform="translate(480,287.5)"
- id="g25369"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="translate(-118.5,-200.5)"
- id="g25372" />
- </g>
- <g
- style="fill:#000000"
- transform="translate(1,24)"
- id="g25374" />
- </g>
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
- id="rect25376"
- width="16"
- height="16"
- x="912"
- y="190"
- rx="0" />
- <g
- id="g25378">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path25380"
- d="M 916.16666,190.50001 H 926.5 V 205.5 h -13 l -10e-6,-11.99999 z"
- style="display:inline;fill:url(#linearGradient25982);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- inkscape:connector-curvature="0" />
- <path
- d="M -48.500031,260.50809 -46.5,260.5 l -3.1e-5,-1.99191"
- style="display:inline;opacity:0.8;fill:none;stroke:#000000;stroke-width:0.76923829px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter22999)"
- id="path25382"
- sodipodi:nodetypes="ccc"
- transform="matrix(1.2999758,0,0,1.2999988,977.54887,-144.56021)"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- d="m 914.5,195 v 9.5 m 3.5,-13 h 7.5"
- style="display:inline;fill:none;stroke:url(#linearGradient25984);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- id="path25384"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 913,194 h 4 v -4 z"
- id="path25387"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="M 913.5,193.00001 V 205.5 h 13 V 190.50001 H 916 Z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path25389"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- d="m 889.5,372.5 h 1 m 0,-4 h -8 m 5,2 h -5 m 1.25,-8 h 6.75 m 0,4 h -8 m 8,-2 h -8"
- style="display:inline;opacity:0.7;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- id="path25391"
- sodipodi:nodetypes="cccccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient25986);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 621.5,214.5 v 2 h -2"
- id="path25668"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_FILE_FONT"
- transform="translate(-107,-115)">
- <g
- id="g25393"
- transform="translate(-296,-2.000004)"
- style="display:inline;enable-background:new">
- <g
- style="display:inline"
- transform="translate(523,-99)"
- id="g25396"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Pulpit\common file transparent SMALL.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- ry="0"
- rx="0.80014729"
- y="289"
- x="389"
- height="16"
- width="16"
- id="rect25398"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate" />
- <g
- id="g25400"
- transform="translate(-177,71)">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g25402"
- transform="translate(480,287.5)">
- <g
- id="g25404"
- transform="translate(-118.5,-200.5)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- <g
- id="g25406"
- transform="translate(1,24)"
- style="fill:#000000" />
- </g>
- </g>
- <rect
- rx="0"
- y="190"
- x="912"
- height="16"
- width="16"
- id="rect25408"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate" />
- <g
- id="g25410">
- <path
- style="display:inline;fill:url(#linearGradient25957);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="M 916.16666,190.50001 H 926.5 V 205.5 h -13 l -10e-6,-11.99999 z"
- id="path25413"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(15.27209,-110)"
- style="display:inline;fill:#0044aa"
- id="g25415">
- <path
- sodipodi:nodetypes="ccccc"
- id="path25417"
- d="m 902.72791,305 2,0.90909 V 315 h -2 z"
- style="fill:#214478"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path25419"
- d="m 901.72791,305 h 1 l 0.25,0.5 h -1.25 z"
- style="fill:#214478"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path25421"
- d="m 902.72791,305 h 6.75 v 1 h -5.09127 z"
- style="fill:#214478"
- inkscape:connector-curvature="0" />
- <rect
- y="310"
- x="904.72791"
- height="1"
- width="2.7499952"
- id="rect25423"
- style="fill:#214478" />
- <rect
- y="309.25"
- x="907.22791"
- height="2.5"
- width="0.5"
- id="rect25425"
- style="fill:#214478" />
- <rect
- y="305"
- x="909.22791"
- height="2"
- width="0.5"
- id="rect25427"
- style="fill:#214478" />
- </g>
- <path
- transform="matrix(1.2999758,0,0,1.2999988,977.54887,-144.56021)"
- sodipodi:nodetypes="ccc"
- id="path25429"
- style="display:inline;opacity:0.8;fill:none;stroke:#000000;stroke-width:0.76923829px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter23007)"
- d="M -48.500031,260.50809 -46.5,260.5 l -3.1e-5,-1.99191"
- inkscape:connector-curvature="0" />
- <path
- id="path25431"
- style="display:inline;fill:none;stroke:url(#linearGradient25959);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 914.5,195 v 9.5 m 3.5,-13 h 7.5"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path25433"
- d="m 913,194 h 4 v -4 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- id="path25435"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 913.5,193.00001 V 205.5 h 13 V 190.50001 H 916 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- id="path25670"
- d="m 621.5,190.5 v 2 h -2"
- style="display:inline;fill:none;stroke:url(#linearGradient25961);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_FILE_BLEND"
- transform="translate(-348,-155)">
- <g
- transform="translate(-126,60.000002)"
- id="g25674">
- <g
- transform="translate(-34,-22.000002)"
- id="g25676">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Pulpit\common file transparent SMALL.png"
- id="g25678"
- transform="translate(523,-99)"
- style="display:inline">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- id="rect25680"
- width="16"
- height="16"
- x="389"
- y="289"
- rx="0.80014729"
- ry="0" />
- <g
- transform="translate(-177,71)"
- id="g25682">
- <g
- transform="translate(480,287.5)"
- id="g25684"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="translate(-118.5,-200.5)"
- id="g25686" />
- </g>
- <g
- style="fill:#000000"
- transform="translate(1,24)"
- id="g25688" />
- </g>
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
- id="rect25690"
- width="16"
- height="16"
- x="912"
- y="190"
- rx="0" />
- <g
- id="g25692">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path25694"
- d="M 916.16666,190.50001 H 926.5 V 205.5 h -13 l -10e-6,-11.99999 z"
- style="display:inline;fill:url(#linearGradient25886);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- inkscape:connector-curvature="0" />
- <path
- d="M -48.500031,260.50809 -46.5,260.5 l -3.1e-5,-1.99191"
- style="display:inline;opacity:0.8;fill:none;stroke:#000000;stroke-width:0.76923829px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter23015)"
- id="path25696"
- sodipodi:nodetypes="ccc"
- transform="matrix(1.2999758,0,0,1.2999988,977.54887,-144.56021)"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- d="m 914.5,195 v 9.5 m 3.5,-13 h 7.5"
- style="display:inline;fill:none;stroke:url(#linearGradient25888);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- id="path25698"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 913,194 h 4 v -4 z"
- id="path25700"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="M 913.5,193.00001 V 205.5 h 13 V 190.50001 H 916 Z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path25702"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- id="g25705"
- transform="translate(910,-321.00012)"
- mask="none"
- clip-path="url(#clipPath22590)">
- <rect
- y="491.00012"
- x="-29"
- height="16"
- width="16"
- id="rect25707"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g25709">
- <g
- id="g25711">
- <path
- id="path25713"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.34386528;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M -15.594023,497.94339 -20.25,493.5"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1.32768786;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.10397505;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path25715"
- transform="matrix(3.625,0,0,3.1690202,-67.8125,318.31703)"
- cx="13.5"
- cy="57.5"
- rx="1"
- ry="1.0000004" />
- <path
- sodipodi:nodetypes="cccc"
- d="m -25.5,496.5 h 7.5 m -8.5,5.00012 3.5,-3.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.34386528;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path25717"
- inkscape:connector-curvature="0" />
- </g>
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient25890);stroke-width:0.92424375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.10397505;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path25719"
- transform="matrix(3.5999897,0,0,3.1249932,-67.499871,320.6879)"
- cx="13.5"
- cy="57.5"
- r="1" />
- <path
- id="path25721"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient25892);stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.34386528;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -25.5,496.5 7.984366,-0.0226 M -26.5,501.50012 -21.5,496.5 m 5.996227,1.44466 L -20.25,493.5"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <circle
- transform="matrix(3.25,0,0,3.25,-62.875,313.125)"
- id="path25723"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="13.5"
- cy="57.5"
- r="1" />
- <circle
- style="fill:#2c5aa0;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path25725"
- transform="matrix(2,0,0,2,-46,385)"
- cx="13.5"
- cy="57.5"
- r="1" />
- <circle
- transform="matrix(4.7519907,0,0,4.1435313,-83.051884,262.12196)"
- id="path25727"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient25894);stroke-width:0.22536004;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.10397505;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="13.5"
- cy="57.5"
- r="1" />
- <path
- id="path25729"
- style="fill:none;stroke:url(#linearGradient25897);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m -20.515634,493.80534 c -0.07079,-0.45769 0.0843,-0.63855 0.5,-0.5 m -6.734366,7.94478 3.280183,-3.10926 m -2,-2 h 6.25"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <path
- style="fill:none;stroke:url(#linearGradient25899);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 757.5,230.5 v 2 h -2"
- id="path25731"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_FILE_FOLDER"
- transform="translate(273,-334)">
- <rect
- y="407"
- x="89"
- height="16"
- width="16"
- id="rect25824"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <g
- id="g25826">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient25927);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- d="m 89.5,408.5 v 11.49245 l 1.5,1.5 10.5,0.008 V 409.508 l -8,-0.008 v -1 z"
- id="path25828"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(-361,287.99994)"
- id="g25830"
- style="display:inline" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#d1c595;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient25929);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 92.5,413.74245 12,0.008 v 6.25 l -1.5,1.49245 -12,0.008 v -2 h 1.5 v -5.75755 z"
- id="path25832"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 91.5,420.49245 -1.01563,-0.98437 v -10.02344 h 2 v 1 L 100.5,410.5"
- id="path25834"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;opacity:0.18999999;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 93,420.5 h 9.5"
- id="path25836"
- inkscape:connector-curvature="0" />
- <path
- id="path25838"
- d="m 103.5,414.75 -10,-0.008 v 4.75755 l -1.5,1.5 -1.5,-1.5"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#linearGradient25931);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-rule:evenodd;stroke:none"
- d="m 93,409 v 2 h -3 v -2 z"
- id="path25840"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccc"
- id="path25842"
- d="m 89.5,408.5 v 11.49245 l 1.5,1.5 12,0.008 1.5,-1.49245 v -6.50755 l -3,-0.008 v -3.9849 l -8,-0.008 v -1 h -4 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2a2512;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(371,90.000008)"
- id="ICON_UI">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect26095"
- width="16"
- height="16"
- x="117"
- y="529" />
- <g
- style="display:inline"
- id="g26097"
- transform="translate(28.71596,210.64282)">
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="2.0305908"
- ry="2.0305908"
- y="326.84842"
- x="88.784042"
- height="6.0000124"
- width="14"
- id="rect26099"
- style="display:inline;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- style="display:inline;fill:none;stroke:url(#linearGradient26126);stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- id="rect26101"
- width="12"
- height="4.00875"
- x="89.784042"
- y="327.84842"
- ry="1.029202"
- rx="1.029202" />
- <rect
- style="display:inline;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- id="rect26103"
- width="14"
- height="4.9999971"
- x="88.784042"
- y="319.85718"
- ry="2.0154257"
- rx="2.0154257"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#linearGradient26128);stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- id="rect26105"
- width="12.000008"
- height="2.9999971"
- x="89.784042"
- y="320.85718"
- ry="0.97821051"
- rx="0.97821051" />
- <rect
- ry="0"
- rx="0"
- y="320.35718"
- x="89.284042"
- height="3.9999919"
- width="8"
- id="rect26107"
- style="display:inline;overflow:visible;visibility:visible;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- rx="0.97821051"
- ry="0.97821051"
- y="320.85718"
- x="89.784042"
- height="2.9999971"
- width="12.000008"
- id="rect26109"
- style="display:inline;opacity:0.7;fill:none;stroke:url(#linearGradient26130);stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- ry="0"
- rx="0"
- y="320.85718"
- x="96.284042"
- height="3.0000272"
- width="0.99999988"
- id="rect26111"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- id="g26113"
- transform="matrix(-1,0,0,1,193.28404,-130.61032)"
- style="display:inline;opacity:0.8;enable-background:new">
- <g
- id="g26115">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect26117"
- width="1"
- height="1"
- x="91"
- y="459.9675"
- rx="0"
- ry="0"
- transform="matrix(-1,0,0,1,194,-1.1e-6)" />
- <rect
- ry="0"
- rx="0"
- y="458.9675"
- x="92"
- height="3"
- width="1"
- id="rect26119"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="matrix(-1,0,0,1,194,-1.1e-6)" />
- <rect
- ry="0"
- rx="0"
- y="459.9675"
- x="92"
- height="1"
- width="1"
- id="rect26121"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect26123"
- width="1"
- height="3"
- x="93"
- y="458.9675"
- rx="0"
- ry="0" />
- </g>
- </g>
- </g>
- </g>
- <g
- id="ICON_RESTRICT_VIEW_OFF"
- transform="translate(0,127.99999)">
- <rect
- y="302"
- x="404"
- height="16"
- width="16.000004"
- id="rect27916"
- style="display:inline;opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <g
- id="g28110">
- <path
- id="path27918"
- d="m 412,306.45213 c -3.54545,0 -5.90909,1.5 -6.49999,3.04787 0.5909,1.45213 2.95581,3.77094 6.49999,3.75 3.54709,-0.021 5.9091,-2.29787 6.50001,-3.75 -0.59091,-1.54787 -2.95455,-3.04787 -6.50001,-3.04787 z"
- style="fill:url(#linearGradient28107);fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccscz"
- inkscape:connector-curvature="0" />
- <ellipse
- id="path27920"
- style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="matrix(0.7500463,0,0,1.0294111,88.73017,294.07354)"
- cx="431"
- cy="14.5"
- rx="3.9999149"
- ry="2.91429" />
- <circle
- id="path27922"
- style="display:inline;fill:url(#linearGradient28099);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- transform="matrix(2.249956,0,0,2.251405,267.75278,4.81032)"
- cx="64"
- cy="135"
- r="1" />
- <path
- sodipodi:nodetypes="ccscs"
- style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 412,306.5 c -3.5,0 -5,1.5 -6.5,3 1.5,1.5 2.75,4 6.5,4 3.75,0 5,-2.5 6.5,-4 -1.5,-1.5 -3,-3 -6.5,-3 z"
- id="path27924"
- inkscape:connector-curvature="0" />
- <rect
- y="307.91428"
- x="411"
- height="2"
- width="2"
- id="rect27926"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <circle
- id="path27928"
- style="display:inline;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- transform="translate(347,172.91429)"
- cx="64"
- cy="135"
- r="1" />
- </g>
- </g>
- <g
- id="ICON_RESTRICT_VIEW_ON"
- transform="translate(4e-6,127.99999)">
- <g
- transform="translate(0.4838899)"
- id="g27934">
- <path
- sodipodi:nodetypes="ccscz"
- style="display:inline;opacity:0.25;fill:url(#radialGradient27973);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 432.51611,305.45213 c -3,0 -7,2.04787 -5.5,4.04787 0.5,1.45213 2.49969,3.02073 5.49861,2.99979 3.00139,-0.021 4.82513,-1.62106 5.50139,-2.99995 2,-2.49984 -2.5,-4.04771 -5.5,-4.04771 z"
- id="path27936"
- inkscape:connector-curvature="0" />
- <path
- id="path27938"
- d="m 432.51611,305.45213 c -3,0 -7.75,2.04787 -6.25,4.04787 0.5,1.45213 3.25108,3.52094 6.25,3.5 3.00139,-0.021 5.82374,-2.12111 6.5,-3.5 2,-2.49984 -3.5,-4.04787 -6.5,-4.04787 z"
- style="display:inline;opacity:0.18000004;fill:url(#radialGradient27975);fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccscz"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.25;fill:none;stroke:url(#linearGradient27977);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 438.51611,309.5 c -2,4 -10,4 -12,0"
- id="path27940"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path27942"
- d="m 426.01611,309.5 c 2,5 11,5 13,0"
- style="opacity:0.3;fill:none;stroke:#000000;stroke-width:1.00000012px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="opacity:0.25;fill:none;stroke:none"
- id="rect27944"
- width="15.983887"
- height="16"
- x="425.01611"
- y="302" />
- </g>
- <g
- id="ICON_VISIBLE_IPO_ON"
- transform="translate(105,-82)">
- <rect
- style="display:inline;opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect27418"
- width="16.000004"
- height="16"
- x="404"
- y="302" />
- <g
- id="g27420">
- <path
- sodipodi:nodetypes="ccscz"
- style="fill:url(#linearGradient27448);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 412,306.45213 c -3.54545,0 -5.90909,1.5 -6.49999,3.04787 0.5909,1.45213 2.95581,3.77094 6.49999,3.75 3.54709,-0.021 5.9091,-2.29787 6.50001,-3.75 -0.59091,-1.54787 -2.95455,-3.04787 -6.50001,-3.04787 z"
- id="path27422"
- inkscape:connector-curvature="0" />
- <ellipse
- transform="matrix(0.7500463,0,0,1.0294111,88.73017,294.07354)"
- style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path27424"
- cx="431"
- cy="14.5"
- rx="3.9999149"
- ry="2.91429" />
- <circle
- transform="matrix(2.249956,0,0,2.251405,267.75278,4.81032)"
- style="display:inline;fill:url(#linearGradient27450);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- id="path27426"
- cx="64"
- cy="135"
- r="1" />
- <path
- id="path27428"
- d="m 412,306.5 c -3.5,0 -5,1.5 -6.5,3 1.5,1.5 2.75,4 6.5,4 3.75,0 5,-2.5 6.5,-4 -1.5,-1.5 -3,-3 -6.5,-3 z"
- style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccscs"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect27430"
- width="2"
- height="2"
- x="411"
- y="307.91428" />
- <circle
- transform="translate(347,172.91429)"
- style="display:inline;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- id="path27432"
- cx="64"
- cy="135"
- r="1" />
- </g>
- </g>
- <g
- transform="translate(62.983887,-82)"
- id="ICON_VISIBLE_IPO_OFF">
- <g
- id="g27436"
- transform="translate(0.4838899)">
- <path
- id="path27438"
- d="m 432.51611,305.45213 c -3,0 -7,2.04787 -5.5,4.04787 0.5,1.45213 2.49969,3.02073 5.49861,2.99979 3.00139,-0.021 4.82513,-1.62106 5.50139,-2.99995 2,-2.49984 -2.5,-4.04771 -5.5,-4.04771 z"
- style="display:inline;opacity:0.25;fill:url(#radialGradient27452);fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccscz"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccscz"
- style="display:inline;opacity:0.18000004;fill:url(#radialGradient27454);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 432.51611,305.45213 c -3,0 -7.75,2.04787 -6.25,4.04787 0.5,1.45213 3.25108,3.52094 6.25,3.5 3.00139,-0.021 5.82374,-2.12111 6.5,-3.5 2,-2.49984 -3.5,-4.04787 -6.5,-4.04787 z"
- id="path27440"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path27442"
- d="m 438.51611,309.5 c -2,4 -10,4 -12,0"
- style="opacity:0.25;fill:none;stroke:url(#linearGradient27456);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.3;fill:none;stroke:#000000;stroke-width:1.00000012px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 426.01611,309.5 c 2,5 11,5 13,0"
- id="path27444"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="302"
- x="425.01611"
- height="16"
- width="15.983887"
- id="rect27446"
- style="opacity:0.25;fill:none;stroke:none" />
- </g>
- <g
- transform="translate(147,170.00001)"
- id="ICON_LAMP_DATA">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
- id="rect27514"
- width="16"
- height="16"
- x="26"
- y="323"
- ry="0" />
- <g
- id="g27516">
- <path
- sodipodi:nodetypes="cssssssc"
- id="path27518"
- d="m 38.5,327.9 c 0,1.37785 -0.5625,2.19999 -1.6875,3.29999 -1.125,1.1 0,3.3 -1.40625,3.3 h -2.8125 c -1.40625,0 -0.28125,-2.2 -1.40625,-3.3 -1.125,-1.1 -1.6875,-1.93254 -1.6875,-3.29999 0,-2.4288 2.016,-4.4 4.5,-4.4 2.484,0 4.5,1.9712 4.5,4.4 z"
- style="opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 38.5,327.9 c 0,1.37785 -0.5625,2.19999 -1.6875,3.29999 -1.125,1.1 0,3.3 -1.40625,3.3 h -2.8125 c -1.40625,0 -0.28125,-2.2 -1.40625,-3.3 -1.125,-1.1 -1.6875,-1.93254 -1.6875,-3.29999 0,-2.4288 2.016,-4.4 4.5,-4.4 2.484,0 4.5,1.9712 4.5,4.4 z"
- id="path27520"
- sodipodi:nodetypes="cssssssc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path27522"
- d="m 33,338 h 2 v 1 l -2,-10e-6 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <rect
- ry="0.765625"
- rx="0.765625"
- y="333.25"
- x="31"
- height="4.75"
- width="6"
- id="rect27524"
- style="display:inline;overflow:visible;visibility:visible;fill:#24221c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#736c54;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect27527"
- width="4"
- height="3"
- x="32"
- y="334" />
- <path
- sodipodi:nodetypes="cssssccccsccsssc"
- id="path27529"
- d="m 249.09375,80 c -0.37566,0.05708 -0.59375,0.300736 -0.59375,0.5 0,0.227729 0.26882,0.500002 0.75,0.5 0.48959,-2e-6 2.86976,-0.0067 3.35937,-0.0067 0.4812,0 0.75,-0.272259 0.75,-0.5 0,-0.227736 -0.2688,-0.499998 -0.75,-0.5 L 249.25,80 c -0.0601,0 -0.10258,-0.0082 -0.15625,0 z m 0,2 c -0.37566,0.05708 -0.59375,0.300738 -0.59375,0.5 0,0.227729 0.26882,0.500003 0.75,0.5 l 3.35937,-0.0067 c 0.4812,0 0.75,-0.272257 0.75,-0.5 0,-0.227736 -0.2688,-0.499997 -0.75,-0.5 C 252.11976,81.993327 249.7396,82 249.25,82 c -0.0601,0 -0.10258,-0.0082 -0.15625,0 z"
- style="fill:url(#linearGradient27598);fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="matrix(1.0666667,0,0,1,-233.7,254.00667)"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 32.25,336.24999 H 33.5"
- id="path27531"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path27533"
- d="M 32.25,334.24999 H 33.5"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect27535"
- width="0.25"
- height="1"
- x="37"
- y="336" />
- <rect
- y="334"
- x="37"
- height="1"
- width="0.25"
- id="rect27537"
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="336"
- x="30.75"
- height="1"
- width="0.25"
- id="rect27539"
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect27541"
- width="0.25"
- height="1"
- x="30.75"
- y="334" />
- <path
- sodipodi:type="inkscape:offset"
- inkscape:radius="0.5"
- inkscape:original="M 250.5 70.5 C 248.844 70.5 247.5 71.84032 247.5 73.5 C 247.5 74.394207 247.88111 75.199102 248.5 75.75 C 249.02979 76.22159 249.25 77.500001 249.5 77.5 C 249.75 77.5 251.25 77.500001 251.5 77.5 C 251.75 77.5 251.97036 76.220976 252.5 75.75 C 253.11956 75.199071 253.5 74.394767 253.5 73.5 C 253.5 71.840318 252.156 70.5 250.5 70.5 z "
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient27600);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.61155295;marker:none;enable-background:accumulate"
- id="path27543"
- d="m 250.5,70 c -1.92579,0 -3.5,1.570388 -3.5,3.5 0,1.036273 0.44456,1.979112 1.16797,2.623047 0.12299,0.10948 0.32331,0.494568 0.47265,0.865234 0.0747,0.185333 0.14332,0.364013 0.22657,0.529297 0.0416,0.08264 0.084,0.163508 0.16211,0.253906 0.0781,0.0904 0.22638,0.228517 0.4707,0.228516 h 2 c 0.24442,0 0.39265,-0.138106 0.4707,-0.228516 0.0781,-0.09041 0.12244,-0.171247 0.16407,-0.253906 0.0832,-0.165318 0.14992,-0.34393 0.22461,-0.529297 0.14936,-0.370734 0.35006,-0.756218 0.47265,-0.865234 C 253.55622,75.479081 254,74.536495 254,73.5 254,71.570387 252.42579,70 250.5,70 Z"
- transform="matrix(1.1428575,0,0,1.1249998,-252.2858,245.25001)" />
- <path
- transform="matrix(1.1428578,0,0,1.1562502,-252.28587,242.81248)"
- d="m 250.5,70 c -1.92579,0 -3.5,1.570388 -3.5,3.5 0,1.036273 0.44456,1.979112 1.16797,2.623047 0.12299,0.10948 0.32331,0.494568 0.47265,0.865234 0.0747,0.185333 0.14332,0.364013 0.22657,0.529297 0.0416,0.08264 0.084,0.163508 0.16211,0.253906 0.0781,0.0904 0.22638,0.228517 0.4707,0.228516 h 2 c 0.24442,0 0.39265,-0.138106 0.4707,-0.228516 0.0781,-0.09041 0.12244,-0.171247 0.16407,-0.253906 0.0832,-0.165318 0.14992,-0.34393 0.22461,-0.529297 0.14936,-0.370734 0.35006,-0.756218 0.47265,-0.865234 C 253.55622,75.479081 254,74.536495 254,73.5 254,71.570387 252.42579,70 250.5,70 Z"
- id="path27545"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:url(#radialGradient27602);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.61155295;marker:none;enable-background:accumulate"
- inkscape:original="M 250.5 70.5 C 248.844 70.5 247.5 71.84032 247.5 73.5 C 247.5 74.394207 247.88111 75.199102 248.5 75.75 C 249.02979 76.22159 249.25 77.500001 249.5 77.5 C 249.75 77.5 251.25 77.500001 251.5 77.5 C 251.75 77.5 251.97036 76.220976 252.5 75.75 C 253.11956 75.199071 253.5 74.394767 253.5 73.5 C 253.5 71.840318 252.156 70.5 250.5 70.5 z "
- inkscape:radius="0.5"
- sodipodi:type="inkscape:offset" />
- <path
- id="path27547"
- style="display:inline;fill:none;stroke:url(#linearGradient27604);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 34.000001,324.48827 c 1.932,0 3.5,1.50111 3.5,3.35068 0,0.99715 -0.455735,1.89301 -1.178554,2.50697 -0.617914,0.52487 -1.154779,1.38605 -1.154779,2.77907 m -1.166667,-8.63672 c -1.932001,0 -3.500001,1.50111 -3.500001,3.35068 0,0.99715 0.455736,1.89301 1.178556,2.50697 0.617913,0.52487 1.154778,1.38605 1.154778,2.77907"
- inkscape:connector-curvature="0" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient27606);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path27549"
- transform="matrix(0.9552133,0,0,0.9315985,-40.901258,-140.2522)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <circle
- transform="matrix(0.99567,0,-0.00787885,1,-30.663533,191)"
- style="display:inline;opacity:0.9;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- id="path27551"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="64"
- cy="135"
- r="1" />
- <path
- d="m 34.000001,324.48827 c 1.932,0 3.5,1.50111 3.5,3.35068 0,0.99715 -0.455735,1.89301 -1.178554,2.50697 -0.617914,0.52487 -1.154779,1.38605 -1.154779,2.77907 m -1.166667,-8.63672 c -1.932001,0 -3.500001,1.50111 -3.500001,3.35068 0,0.99715 0.455736,1.89301 1.178556,2.50697 0.617913,0.52487 1.154778,1.38605 1.154778,2.77907"
- style="display:inline;fill:none;stroke:url(#radialGradient27608);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- id="path27554"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:#3d3829;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- id="rect27557"
- width="5"
- height="0.75"
- x="31.5"
- y="333" />
- <path
- style="fill:#6c6753;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 32.5,337.01145 3,-0.0115 v 1 l -3,0.0114 v -0.99999 z"
- id="path27564"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:url(#linearGradient27610);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- d="m 33,330 v 2.75 h 2 V 330 Z"
- id="path27566"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.20000005;marker:none;enable-background:accumulate"
- id="rect27585"
- width="1"
- height="1"
- x="32"
- y="328" />
- <path
- sodipodi:nodetypes="csscssc"
- id="path27587"
- style="display:inline;fill:none;stroke:url(#radialGradient27612);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 32.875,333.12498 c 0,-1.39113 -0.517691,-2.25114 -1.113536,-2.77529 C 31.064459,329.73656 30.5,328.93567 30.5,327.93988 c 0,-1.84706 1.637,-3.43989 3.5,-3.43989 1.863,0 3.5,1.59283 3.5,3.43989 0,0.99579 -0.564459,1.79668 -1.261464,2.40981 -0.595845,0.52415 -1.113536,1.38416 -1.113536,2.77529"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 33,338.00001 h 0.5 v 1 L 33,339 Z"
- id="path27590"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.20000005;marker:none;enable-background:accumulate"
- id="rect27594"
- width="2"
- height="1"
- x="33"
- y="329" />
- <rect
- y="328"
- x="35"
- height="1"
- width="1"
- id="rect27596"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.20000005;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- id="ICON_IMAGE_ZDEPTH">
- <g
- id="g17368"
- transform="translate(302,-461)">
- <rect
- y="471"
- x="-45"
- height="16"
- width="16"
- id="rect17370"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <rect
- y="472.5"
- x="-43.483856"
- height="13"
- width="12.983856"
- id="rect17372"
- style="display:inline;fill:url(#linearGradient17442);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cccc"
- id="path17374"
- d="m -31.5,473.50001 h -10.983862 v 11"
- style="display:inline;fill:none;stroke:url(#linearGradient17444);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0.5;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="14"
- x="261"
- height="5"
- width="5"
- id="rect17376"
- style="display:inline;overflow:visible;visibility:visible;fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.89999998;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.89999998;marker:none;enable-background:accumulate"
- id="rect17379"
- width="5"
- height="5"
- x="264"
- y="17" />
- <path
- inkscape:connector-curvature="0"
- id="rect28902"
- d="m 263,16 v 3 h 1 v -2 h 2 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MOD_FLUIDSIM"
- transform="translate(-823,-175)">
- <rect
- y="416"
- x="870"
- height="16"
- width="16"
- id="rect28083"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(1.2930992,0,0,1.3011246,677.85367,159.07065)"
- style="display:inline;opacity:0.96000001"
- id="g28085">
- <ellipse
- transform="matrix(1.1162596,0,0,1.1065394,67.801614,-350.49863)"
- id="path28087"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient28099);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:url(#radialGradient28101);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path28089"
- transform="matrix(-1.3568764,-0.3150232,0.3151738,-1.348049,102.81491,906.57916)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient28103);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 883.5,426.5 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-3.5 2.5,-4.5 5,-10 2.5,5.5 5,6.5 5,10 z"
- id="path28091"
- sodipodi:nodetypes="csscc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csscssc"
- id="path28093"
- d="m 878.5,418.40909 c 0.4375,0.96023 0.90625,1.78977 1.36328,2.53255 0.45703,0.74278 0.90234,1.3988 1.29297,2.01196 0.78125,1.22633 1.34375,2.28125 1.34375,3.5161 0,2.22473 -1.792,4.0303 -4,4.0303 -2.208,0 -4,-1.80557 -4,-4.0303 0,-2.41818 2.25,-4.2197 4,-8.06061 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient28105);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="path28095"
- transform="matrix(0.6434675,-0.7329672,0.7942866,0.5945179,-26.858149,815.24158)"
- cx="878.5"
- cy="425"
- rx="1.5"
- ry="1" />
- <circle
- inkscape:transform-center-y="-7.1785015"
- inkscape:transform-center-x="-7.136318"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:url(#radialGradient28107);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69954133;marker:none;enable-background:accumulate"
- id="path28097"
- transform="matrix(-1.2857095,0,0,1.2857143,1210.8559,325.57143)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- </g>
- <g
- transform="translate(-94.999994,403.00001)"
- id="ICON_BORDERMOVE"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect30298"
- width="16"
- height="16"
- x="163"
- y="195" />
- <g
- id="g30300">
- <g
- transform="translate(0.01612278)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g30302"
- style="display:inline">
- <g
- style="fill:#ff943d;fill-opacity:1;stroke:none"
- id="g30304">
- <rect
- transform="rotate(-90)"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect30306"
- width="1"
- height="2"
- x="-199"
- y="168.98387" />
- <rect
- y="207.98763"
- x="174.98387"
- height="2"
- width="1"
- id="rect30309"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- y="164.98387"
- x="-199"
- height="2"
- width="1"
- id="rect30311"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="rotate(-90)" />
- <rect
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect30313"
- width="1"
- height="2"
- x="174.98387"
- y="203.98763" />
- <rect
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect30315"
- width="1"
- height="2"
- x="162.98387"
- y="207" />
- <rect
- y="203"
- x="162.98387"
- height="2"
- width="1"
- id="rect30318"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- y="167.97594"
- x="-211"
- height="2"
- width="1"
- id="rect30326"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="rotate(-90)" />
- <rect
- transform="rotate(-90)"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect30328"
- width="1"
- height="2"
- x="-211"
- y="171.97594" />
- <rect
- transform="rotate(-90)"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect30330"
- width="1"
- height="2"
- x="-211"
- y="163.98387" />
- <rect
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect30332"
- width="1"
- height="2"
- x="162.98387"
- y="199" />
- </g>
- <g
- style="fill:#532500;fill-opacity:1"
- id="g30334">
- <rect
- transform="rotate(-90)"
- style="fill:#552c00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect30336"
- width="1"
- height="2"
- x="-199"
- y="166.98387" />
- <rect
- style="fill:#552c00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect30338"
- width="1"
- height="2"
- x="174.98387"
- y="205.98763" />
- <rect
- y="205"
- x="162.98387"
- height="2"
- width="1"
- id="rect30340"
- style="fill:#552c00;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#552c00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect30342"
- width="1"
- height="2"
- x="162.98387"
- y="209" />
- <rect
- y="165.97594"
- x="-211"
- height="2"
- width="1"
- id="rect30344"
- style="fill:#552c00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="rotate(-90)" />
- <rect
- transform="rotate(-90)"
- style="fill:#552c00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect30346"
- width="1"
- height="2"
- x="-211"
- y="169.97594" />
- <rect
- y="173.97594"
- x="-211"
- height="2"
- width="1"
- id="rect30348"
- style="fill:#552c00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="rotate(-90)" />
- <rect
- y="202"
- x="174.98387"
- height="2"
- width="1"
- id="rect30350"
- style="fill:#554400;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#552c00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect30353"
- width="1"
- height="2"
- x="162.98387"
- y="201" />
- <rect
- y="162.98387"
- x="-199"
- height="2"
- width="1"
- id="rect30355"
- style="fill:#552c00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="rotate(-90)" />
- </g>
- </g>
- <path
- sodipodi:nodetypes="ccccccc"
- id="path30357"
- d="m 163.99999,199 h 6.51562 l 1.23438,3.25 3.25,1.20312 V 210 h -11 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- transform="matrix(0.781818,0,0,0.781818,38.760709,42.85549)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g30359"
- style="display:inline">
- <circle
- inkscape:transform-center-y="-6.3853012"
- inkscape:transform-center-x="-6.3473305"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.78698397;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="path30361"
- transform="matrix(-1.4627004,0,0,1.4628053,551.73128,85.525552)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <path
- style="fill:none;stroke:#28170b;stroke-width:4.47674513;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 164.66657,209.31279 3.51745,-3.51744"
- id="path30363"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path30365"
- d="m 168.5,205.5 0.96309,-0.98372"
- style="fill:none;stroke:#000000;stroke-width:2.5581398;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#cccccc;stroke-width:1.40697706;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 168.5,205.5 1.28285,-1.30349"
- id="path30367"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <g
- id="g30369"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.878699,0,0,0.877142,14.70687,20.74499)">
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient30389);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient30391);stroke-width:1.16848361;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path30371"
- transform="matrix(-1.2468441,0,0,1.246865,503.16273,106.89331)"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path30373"
- d="m 164.66657,209.31279 3.51745,-3.51744"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#a05a2c;stroke-width:2.55814004;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1.2790699;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 164.02704,208.99303 3.83721,-3.83721"
- id="path30375"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(-1.4627004,0,0,1.4628053,551.73128,85.525552)"
- id="path30377"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:url(#radialGradient30393);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69954133;marker:none;enable-background:accumulate"
- inkscape:transform-center-x="-6.3473305"
- inkscape:transform-center-y="-6.3853012"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <g
- id="g30379"
- style="display:inline;opacity:0.96000001"
- transform="matrix(0.9729196,0,0,0.9789579,9.7047721,-0.8010785)">
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient30395);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path30381"
- transform="matrix(1.1162596,0,0,1.1065394,80.948334,-350.49863)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(-1.087144,-0.2518404,0.2525206,-1.0776772,126.97246,766.619)"
- id="path30383"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient30397);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- </g>
- <circle
- id="path30385"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- transform="matrix(1.2790738,0,0,1.2790735,89.840744,25.765779)"
- cx="64"
- cy="135"
- r="1" />
- </g>
- <path
- id="path30387"
- d="m 163.99999,199 v 11 h 1 v -10 h 6 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.12999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_MOD_MULTIRES">
- <rect
- y="241.00877"
- x="68.001282"
- height="16"
- width="16"
- id="rect27661"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.9168751,0,0,0.9161255,-39.818417,44.251476)"
- id="g27663"
- style="display:inline"
- clip-path="url(#clipPath42711)">
- <circle
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient42435);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:1.45480967;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path27665"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- clip-path="none"
- mask="none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.6147126,0,0,0.6147118,47.3579,150.96368)"
- style="display:inline;fill:none;stroke:url(#linearGradient42437);stroke-width:1.77499008;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path27667"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- transform="translate(-167.99872,-18.991228)"
- style="opacity:0.55"
- id="g27669">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient42432);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.87159598;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 243.50439,274.05251 -6.46154,-3.3e-4 v -12.12435 l 6.46154,3.3e-4"
- id="path27671"
- sodipodi:nodetypes="cccc"
- transform="matrix(0.9285719,0,0,0.9072647,16.387388,24.853058)"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path27673"
- d="m 243.50439,272.9503 -5.38461,-3.3e-4 0.001,-4.9503 -0.001,-4.96963 5.38461,3.3e-4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.08949494;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(0.9285719,0,0,0.9072647,16.387388,24.853058)"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="rotate(-45,53.161345,259.24703)"
- style="display:inline;enable-background:new"
- id="g27675">
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:none;stroke:#000000;stroke-width:1.49999988;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 73.54505,272.57627 1.06066,-2.47487"
- id="path33728"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path27679"
- d="m 73.545051,272.22272 7.071067,-7.07107"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path33730"
- d="m 78.494797,266.21231 2.651651,-0.88388"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:none;stroke:#000000;stroke-width:1.49999988;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- d="m 71.600508,272.3995 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071 m 2.121321,-2.12133 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:none;stroke:#28220b;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="path42388"
- inkscape:connector-curvature="0" />
- <path
- id="path42359"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffe991;stroke-width:1.19999993;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 71.600508,272.3995 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071 m 2.121321,-2.12133 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_DISK_DRIVE">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect29107"
- width="16"
- height="16"
- x="530"
- y="52" />
- <g
- id="g56091">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- id="path29110"
- d="m 531,58 6,-2.5 7.99996,3.49998 v 2.75 L 538.99997,64.99997 531,60.75 Z"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#9e9e9e;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 531,58 6,-2.5 7.99996,3.49998 v 0.5 l -6,3 L 531,58.56558 Z"
- id="path29112" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path29114"
- d="M 531.00001,60.75 531,58.5 l 7.99996,3.99998 0.01,2.49885 -8.00991,-4.24883 z"
- style="fill:#848484;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#383838;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89207077px;marker:none;enable-background:accumulate"
- d="m 544.99996,61.74998 v -2.25 l -6,3 c 0,2.58362 0,1.9329 0,2.5 z"
- id="path29116"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient56084);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 531.5,58.5 v 2 l 7.49996,3.99998 5.5,-3 v -2"
- id="path29118"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 531.5,58 7.49996,3.74998"
- id="path29120"
- sodipodi:nodetypes="cc" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient29129);stroke-width:1.08012342;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path29122"
- transform="matrix(1,0,0,0.8571429,-212,-302.2143)"
- cx="749"
- cy="420.25"
- rx="2.5"
- ry="1.75" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#66ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect29125"
- width="1"
- height="1"
- x="544"
- y="61" />
- </g>
- </g>
- <g
- transform="translate(-0.1658249,128.41502)"
- id="ICON_WORLD_DATA">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect27746"
- width="16"
- height="16"
- x="47.165825"
- y="364.58499" />
- <g
- id="g27748"
- transform="matrix(1.032664,0,0,1.043556,-79.760429,254.38542)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:#4169a5;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:1.22966909;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path27750"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.787566,0,0,0.779223,26.709197,21.3179)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- id="path27752"
- style="fill:url(#linearGradient27767);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.666432,0,0,0.659342,42.69924,35.46375)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.3631382,0,0,0.3593485,81.755824,69.904768)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- style="opacity:0.7;fill:url(#linearGradient27769);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path27755"
- cx="132"
- cy="118"
- r="8" />
- <path
- sodipodi:nodetypes="cc"
- id="path27757"
- d="m 274.98515,70.995347 c 0,0.953349 -1,1.906699 -2,1.906699"
- style="display:inline;opacity:0.5;fill:none;stroke:#ffe680;stroke-width:1.00161445px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter13996)"
- transform="matrix(0.9688184,0,0,0.9547322,-131.63668,47.640696)"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccssscsscccscccccccccccccccsccccc"
- id="path27761"
- d="m 130.67404,112.3079 c 0.0244,0.78706 -0.15754,1.63085 0.59269,2.02213 0.71197,-0.0434 1.49133,0.64122 1.35667,1.40517 -0.26776,0.77861 0.14071,1.12325 0.95576,1.36401 0.57868,-0.0716 0.79053,-0.93546 0.87357,-1.36401 0.0948,-1.27121 0.51542,-1.09421 0.82108,-1.98991 -0.45733,-0.91502 -0.003,-1.04443 -0.72629,-1.43739 m -1.00945,-3.89288 c -0.4426,0.34378 -0.24372,1.04314 -0.66162,1.39841 -0.45372,0.13628 -0.78226,-0.0605 -1.16771,0.43164 -0.30841,1.10457 0.35004,1.22306 0.90205,1.10457 0.49538,-0.0502 0.61419,-0.94321 0.97928,-0.37853 0.0831,0.10976 0.71917,-0.0403 0.86266,0.18898 0.0669,0.10682 -0.11785,0.0255 -0.14729,0.18955 -0.0428,0.23847 0.27734,0.37341 0.372,0.3824 0.32089,0.0305 0.60005,0.92548 0.83846,1.05499 0,0.46738 0.0924,-0.6774 0.3515,-0.78703 0.22948,-0.0971 0.47929,0.10731 0.5,0 0.29928,-1.55081 -1.26113,-3.00604 -2.82933,-3.58498 z M 128.96474,107.5 c -0.6111,1.01384 0.85343,1.46103 1.73001,1.21329 0.57897,-0.37879 1.00716,-0.92331 0.55665,-1.21329 -0.20614,-0.1415 -2.07706,0.0431 -2.28666,0 z m -1.372,1.37253 c -0.49575,-0.14959 0.44952,-0.11945 0.45733,0.45751 0.1696,0.54756 -0.42801,0.23756 0,0.45752 0.70893,0.1644 0.35328,1.70031 -0.28114,1.56208 -0.56042,0.10119 -0.43915,0.95826 -1.64865,0.88279 -0.0836,0.0755 -1.04512,0.61593 -0.81421,1.21521 1.12968,0.30162 -0.36816,1.26478 -0.43867,0.55236 -0.15441,-0.49797 -0.62853,-1.11348 -0.43994,-1.68674 0.11734,-0.63627 0.5689,-1.12263 0.82646,-1.69865 0.36225,-0.61946 0.89084,-1.17688 1.57758,-1.42595 0.21411,-0.16799 0.46159,-0.41691 0.76124,-0.31613 z m -0.91467,5.03262 c -0.55163,-0.27585 -0.72934,0.28829 -0.60377,0.7984 0.15577,0.47138 0.52607,0.97695 0.72628,1.43739 0.40435,0.49619 1.512,1.34081 2.17883,1.67696 0.31768,0.16015 0.48418,0 0.24209,-0.23956 -0.31367,-0.6375 -1.14073,-1.94893 -0.48418,-2.15609 0.59647,-0.60342 0.34203,-1.58773 -0.48419,-1.43739 -0.54779,-0.25818 -0.75551,-0.39899 -1.38855,-0.0752 -0.0558,0.0743 -0.12403,0.006 -0.18651,-0.004 z"
- style="fill:url(#linearGradient27771);fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path27763"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#linearGradient27773);stroke-width:1.45454657;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6657538,0,0,0.6588051,42.794535,35.527157)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- id="path27765"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.06052282,0,0,0.05989117,121.21686,103.80334)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- id="ICON_SNAP_PEEL_OBJECT"
- transform="translate(0,2)">
- <g
- id="g31771"
- transform="rotate(-90,370,121)">
- <g
- style="display:inline;opacity:0.7"
- id="g31773"
- transform="translate(257,86)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect31775"
- width="16"
- height="16"
- x="63"
- y="48" />
- </g>
- <g
- id="g31784"
- transform="matrix(-1,0,0,1,656,0)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 323.5,137.5 v 9 h 3 3 3 v -4 -5 h -3 v 6 h -3 v -6 z"
- id="path31786"
- sodipodi:nodetypes="cccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path31788"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 324.5,145.5 v -7 h 1 m 6,0 h -1 v 6 h -4"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- transform="translate(0,21)"
- style="opacity:0.8"
- id="g31854">
- <g
- id="g31823">
- <g
- id="g31807">
- <path
- id="path31804"
- d="m 384.5,138.5 v -3 h 3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#00112b;stroke-width:2.4000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#b9d5ff;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 384.5,138.5 v -3 h 3"
- id="path31796"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(-1,0,0,1,782,0)"
- id="g31811">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#00112b;stroke-width:2.4000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="m 384.5,138.5 v -3 h 3"
- id="path31813"
- inkscape:connector-curvature="0" />
- <path
- id="path31819"
- d="m 384.5,138.5 v -3 h 3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#b9d5ff;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g31831"
- transform="matrix(1,0,0,-1,0,284)">
- <g
- id="g31833">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#00112b;stroke-width:2.4000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="m 384.5,138.5 v -3 h 3"
- id="path31842"
- inkscape:connector-curvature="0" />
- <path
- id="path31845"
- d="m 384.5,138.5 v -3 h 3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#b9d5ff;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g31847"
- transform="matrix(-1,0,0,1,782,0)">
- <path
- id="path31849"
- d="m 384.5,138.5 v -3 h 3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#00112b;stroke-width:2.4000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#b9d5ff;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 384.5,138.5 v -3 h 3"
- id="path31852"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- </g>
- <g
- id="ICON_CURVE_DATA"
- transform="translate(63,212.00001)">
- <rect
- ry="0"
- rx="0"
- y="281"
- x="47"
- height="16"
- width="16"
- id="rect31979"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g31981">
- <g
- transform="translate(-290.00001,409.99343)"
- style="display:inline;opacity:0.75"
- id="g31985">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#1a1a1a;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 341.00001,-115.99343 c 4.5365,0 8.49999,-2.75 8.49999,-5.75 0,-1.75 -1.25,-4 -5.5,-4"
- id="path31987"
- sodipodi:nodetypes="csc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="csc"
- id="path31994"
- d="m 341.00001,-115.99343 c 4.49647,0 8.49999,-2.75 8.49999,-5.75 0,-1.75 -1.25,-4 -5.5,-4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#cccccc;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-189.02763,408)"
- id="g31998"
- style="display:inline">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect32000"
- width="2.9998772"
- height="3"
- x="238.52776"
- y="-115.5"
- ry="1.4999387"
- rx="1.4999387" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m 241.02763,-115 c -0.66667,0 -1.33332,1e-5 -2,1e-5 0,0.66939 0,1.33877 0,2.00817 0.66668,0 1.33333,-10e-6 2,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path32009"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- rx="1.4999387"
- ry="1.4999387"
- y="-125.5"
- x="241.52776"
- height="3"
- width="2.9998772"
- id="rect32011"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path32014"
- d="m 244.02763,-125 c -0.65334,0 -1.30668,1e-5 -1.96003,1e-5 0,0.66667 0,1.33332 0,1.99999 0.65335,0 1.30669,-1e-5 1.96003,-1e-5 0,-0.66666 0,-1.33332 0,-1.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- style="display:inline"
- id="ICON_MESH_DATA"
- transform="translate(-474,676.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect32018"
- width="16"
- height="16"
- x="563"
- y="-183" />
- <g
- id="g32020">
- <g
- style="opacity:0.75"
- id="g32022"
- transform="translate(476.04566,-283.51773)">
- <path
- sodipodi:nodetypes="cccc"
- id="path32025"
- d="m 89.95451,104.01774 5,9.5 5,-9.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#1a1a1a;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#cccccc;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 89.95451,103.98095 5,9.5 5,-9.5 z"
- id="path32028"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="-181.49998"
- x="574.50031"
- height="3"
- width="2.9998772"
- id="rect32030"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect32032"
- width="2.9998772"
- height="3"
- x="564.50043"
- y="-181.49998"
- ry="1.4999386"
- rx="1.4999386" />
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="-171.5"
- x="569.5"
- height="3"
- width="2.9998772"
- id="rect32034"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 577.00046,-180.99998 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path32036"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path32038"
- d="m 572.00029,-170.99999 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path32040"
- d="m 567.00059,-180.99998 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_LATTICE_DATA"
- transform="translate(83,212.00001)">
- <rect
- y="68"
- x="281"
- height="16"
- width="16"
- id="rect32044"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate"
- transform="matrix(0,1,1,0,0,0)" />
- <g
- id="g32046"
- transform="rotate(-90,55.5002,309.50021)">
- <g
- id="g32048"
- style="opacity:0.7">
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path32051"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#1a1a1a;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 69.5,325.5 v 10 h 12 v -10 z m 6,0 v 10 m 6,-5 h -12"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- d="m 69.5,325.5 v 10 h 12 v -10 z m 6,0 v 10 m 6,-5 h -12"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#cccccc;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path32053"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect32055"
- width="2.9998772"
- height="3"
- x="80.500122"
- y="323.5"
- ry="1.4999386"
- rx="1.4999386" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- d="m 83.00041,324.00001 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path32061"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="334.5"
- x="80.49971"
- height="3"
- width="2.9998772"
- id="rect32063"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path32065"
- d="m 83,335 c -0.6694,0 -1.3388,10e-6 -2.0082,10e-6 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_SURFACE_DATA"
- transform="translate(-83.999998,191)">
- <rect
- transform="scale(-1,1)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect25014"
- width="16.000032"
- height="16"
- x="-231.00003"
- y="281" />
- <g
- transform="translate(235.00016,-1)"
- id="g25016">
- <g
- id="g25018"
- transform="translate(-376,510)"
- style="opacity:0.8">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path25020"
- d="m 358.99997,-216.75 c -0.99997,-6.5 6.00003,-2.75 5,-9.25 L 369,-224 c 1,7 -6,2 -5,10 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#1a1a1a;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="M 358.99997,-216.75 C 358,-223.25 365,-220 363.99997,-226 L 369,-224 c 1,7 -6,2 -5,10 z"
- id="path25022"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#linearGradient25056);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.88812488px;marker:none;enable-background:accumulate"
- d="M 358.99997,-216.75 C 358,-223.25 365,-220 363.99997,-226 L 369,-224 c 1,7 -6,2 -5,10 z"
- id="path25024"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path25026"
- d="M 358.99997,-216.75 C 358,-223.25 365,-220 363.99997,-226 L 369,-224 c 1,7 -6,2 -5,10 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:url(#radialGradient25058);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.88812488px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path25028"
- d="m 364.24984,-225.5 4.25016,1.75 c 1,5.75 -5.50003,2 -5.08381,8.85761 l -4.04561,-2.26888"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient25060);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 364.24997,-225.5 4.25003,1.75"
- id="path25031"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-399.2499,383.75)"
- id="g25033">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect25035"
- width="2.9998772"
- height="3"
- x="391.75"
- y="-99.25"
- ry="1.4999387"
- rx="1.4999387" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m 394.24987,-98.75 c -0.66667,0 -1.33332,1e-5 -2,1e-5 0,0.66939 0,1.33877 0,2.00817 0.66668,0 1.33333,-10e-6 2,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path25039"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g25041"
- transform="translate(-406.2499,380.75)">
- <rect
- rx="1.4999387"
- ry="1.4999387"
- y="-98.25"
- x="392.74988"
- height="3"
- width="2.9998772"
- id="rect25043"
- style="display:inline;overflow:visible;visibility:visible;fill:#dfa535;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path25046"
- d="m 395.24974,-97.75 c -0.66667,0 -1.33332,1e-5 -2,1e-5 0,0.666663 0,1.333317 0,1.99999 0.66668,0 1.33333,-1e-5 2,-1e-5 0,-0.666663 0,-1.333327 0,-1.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m -11.00003,286 c -0.66668,0 -1.33332,0 -2,0 0,-0.33334 0,-0.66666 0,-1 0.66668,0 1.33332,0 2,0 0,0.33334 0,0.66667 0,1 z"
- id="path25048"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path25050"
- d="m -7.00003,285.53933 c -0.33334,0 -0.66666,10e-6 -1,10e-6 0,0.82281 0,1.64561 0,2.46844 0.33334,0 0.66666,-1e-5 1,-1e-5 0,-0.82282 0,-1.64562 0,-2.46844 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path25052"
- d="m -9.972188,286 c -0.342621,0 -0.685221,0 -1.027842,0 0,-0.66873 0,-1.33742 0,-2.00616 0.342621,0 0.685221,0 1.027842,0 0,0.66874 0,1.33745 0,2.00616 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m -6.000162,287 c -0.33334,0 -0.66666,0 -1,0 0,0.33428 0,0.66856 0,1.00284 0.33334,0 0.66666,0 1,0 0,-0.33428 0,-0.66856 0,-1.00284 z"
- id="path25054"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_EMPTY_DATA"
- transform="translate(147,191.00001)">
- <g
- transform="translate(-138,212)"
- style="display:inline;opacity:0.8"
- id="g32147">
- <g
- transform="translate(1.0551033e-6)"
- id="g32149">
- <g
- style="display:inline"
- transform="matrix(0.927273,0,0,1,85.654543,64)"
- id="g32151"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\Browser icons ver 1\Outliner ICON CODES.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <path
- sodipodi:nodetypes="cccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path32153"
- style="display:inline;fill:none;stroke:#1a1a1a;stroke-width:3.63466382;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="M 70.499967,14.5 75.5,17.5 m -5.000033,-3 -4.999967,3 m 4.970586,-3 v -6"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:#1a1a1a;stroke-width:1.86925566;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 69.392137,7 v 2 h 2.156862 V 7 Z M 63.999982,17 64,19 h 2.156862 l -1.8e-5,-2 z m 10.78431,0 v 2 h 2.156862 v -2 z"
- id="path32155"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(1.176776,0,0,1.176776,-12.47787,-2.548088)"
- id="path32158"
- style="display:inline;fill:url(#radialGradient32241);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="70.5"
- cy="14.5"
- r="1.5" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- d="M 70.499967,14.5 75.5,17.5"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ececec;stroke-width:1.97310317;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path32161"
- inkscape:connector-curvature="0" />
- <path
- d="M 70.499967,14.5 75.5,17.5 m -5.000033,-3 -4.999967,3 m 4.970586,-3 v -6"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#radialGradient32243);stroke-width:2.07695079;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path32165"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="cccccc"
- transform="translate(-1.6176466e-5)"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccc"
- id="path32168"
- d="m 74.784292,17 v 2 h 2.156862 v -2 z"
- style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path32172"
- style="display:inline;fill:none;stroke:#999999;stroke-width:1.97310317;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="M 70.499967,14.5 65.5,17.5"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path32174"
- style="display:inline;fill:none;stroke:#cccccc;stroke-width:2.07695079;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 70.470586,14.5 v -6"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccc"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 69.392137,7 v 2 h 2.156862 V 7 Z"
- id="path32177"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccc"
- style="fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 64,17 v 2 h 2.156844 v -2 z"
- id="path32179"
- inkscape:connector-curvature="0" />
- <rect
- y="13.25"
- x="68.583321"
- height="3.5"
- width="3.774509"
- id="rect32186"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.05;fill:#554400;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccc"
- id="path32193"
- d="m 64.539197,18.5 v -1 h 1.078431"
- style="display:inline;opacity:0.75;fill:none;stroke:#ffffff;stroke-width:1.03847623px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.03847647px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 69.931347,8.5 V 7.5326076 h 1.078413"
- id="path32197"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccc"
- id="path32199"
- d="m 75.323509,18.500001 v -1 h 1.078431"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.03847647px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <rect
- y="5"
- x="61.843121"
- height="16"
- width="17.254898"
- id="rect32201"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 155,80.5 -3,-1.870665"
- id="path32206"
- transform="matrix(1.0784311,0,0,1,-92.372519,-64)"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#d4aa00;fill-opacity:1;fill-rule:evenodd;stroke:#999999;stroke-width:1.03847647px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 74.245078,17.500001 v -1 h 1.078431"
- id="path32208"
- sodipodi:nodetypes="ccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path32215"
- d="m 69.931352,9.5000005 h 1.078431"
- style="display:inline;opacity:0.4;fill:#6a6a6a;fill-opacity:1;fill-rule:evenodd;stroke:#666666;stroke-width:1.03847647px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccc"
- id="path32218"
- d="m 66.696014,17.499989 v -1 h -1.078431"
- style="display:inline;opacity:0.4;fill:#6a6a6a;fill-opacity:1;fill-rule:evenodd;stroke:#4c4c4c;stroke-width:1.03847575px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path32230"
- d="m 147,80.5 3,-1.870665"
- style="opacity:0.4;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="opacity:0.35;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 150.5,73.5 v 4"
- id="path32235"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="78"
- x="150.06403"
- height="2"
- width="2"
- id="rect32237"
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate" />
- </g>
- <rect
- rx="0"
- ry="0"
- y="289.5"
- x="11.499837"
- height="3"
- width="2.9998772"
- id="rect32239"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_WPAINT_HLT"
- transform="translate(185,94.000007)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- id="rect52807"
- width="16"
- height="16"
- x="-75"
- y="420" />
- <g
- transform="translate(-577.98389,452.95862)"
- style="display:inline;enable-background:new"
- id="g52809">
- <path
- sodipodi:nodetypes="ccccc"
- id="path52811"
- d="m 506.48389,-17.45862 v -1 c 4.75,-1 2.25,-4.5 6.31852,-4.187139 0.70341,0.496889 0.93148,1.187139 0.93148,2.122782 0,3.064357 -2.5,3.314357 -7.25,3.064357 z"
- style="fill:#9d6c53;fill-opacity:1;fill-rule:evenodd;stroke:#241f1c;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#radialGradient53119);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- d="m 505.98389,-17.522977 c 5.75,-0.75 2.71305,-4.172284 6.75,-5.25 0.70341,0.496889 1.61991,1.711436 1.75268,2.186272 0,3.572675 -4.12319,3.136436 -8.50268,3.063728 z"
- id="path52813"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path52815"
- d="m 515.48389,-25.95862 -2.75,3.25 1.75,2.25 3,-3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient53121);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 514.98389,-24.95862 -2.25,2.5 1.38281,1.847656 2.36719,-2.347656 z"
- id="path52817"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 518.48389,-29.45862 -4,4.75 2,2.25 2,-2"
- id="path52819"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path52821"
- d="m 518.98389,-29.70862 -4.75,5.5 1.75,1.75 3,-2.75 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient53123);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.23326063;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 513.48389,-22.45862 5,-6"
- id="path52823"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.4;fill:none;stroke:url(#linearGradient53125);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 511.98389,-21.772977 -1.25,1.25 c -0.96702,0.819679 -0.76749,2.123051 -3.25,2.314357"
- id="path52825"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-185,34)"
- id="g52827">
- <rect
- ry="0.019097222"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#736c54;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect52829"
- width="11"
- height="11"
- x="110"
- y="386"
- rx="0.019097222" />
- <g
- id="g52831">
- <path
- id="path52833"
- d="m 116.53125,386.5 c -0.56312,0 -1.03125,0.46811 -1.03125,1.03125 v 0.9375 c 0,0.28156 0.12508,0.53133 0.3125,0.71875 L 113,392 c -0.18742,-0.18742 -0.46844,-0.5 -0.75,-0.5 h -0.75 c -0.56312,0 -1.03125,0.46811 -1.03125,1.03125 v 0.9375 c 0,0.56312 0.46813,1.03125 1.03125,1.03125 h 0.9375 c 0.0103,0 0.021,3e-4 0.0312,0 -3e-4,0.0102 0,0.021 0,0.0312 v 0.9375 c 0,0.56312 0.46813,1.03126 1.03125,1.03125 h 0.96875 c 0.56312,0 1,-0.46813 1,-1.03125 v -0.9375 c 0,-0.28156 -0.10164,-0.53133 -0.28125,-0.71875 l 2.625,-2.625 c 0.18742,0.18742 0.43719,0.3125 0.71875,0.3125 h 0.96875 c 0.56312,0 1,-0.46813 1,-1.03125 v -0.9375 c 0,-0.56312 -0.43688,-1.03125 -1,-1.03125 h -0.96875 c -0.0103,0 -0.021,-3e-4 -0.0312,0 3e-4,-0.0102 0,-0.021 0,-0.0312 v -0.9375 c 0,-0.56312 -0.46813,-1.03125 -1.03125,-1.03125 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient53127);fill-opacity:1;fill-rule:evenodd;stroke:#333333;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccccccccccsccccccccccccccscccc"
- inkscape:connector-curvature="0" />
- <path
- id="path52835"
- d="m 111.5,393.5 v -0.75 l 0.25,-0.25 h 1.75 l 3,-3 v -1.75 l 0.25,-0.25 h 0.75"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 118.75,389.5 h 0.75 m -6,6 v -0.75"
- id="path52837"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect52839"
- width="1"
- height="1"
- x="114"
- y="393" />
- <rect
- y="390"
- x="117"
- height="1"
- width="1"
- id="rect52841"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- </g>
- </g>
- </g>
- <g
- id="ICON_TPAINT_HLT">
- <rect
- y="514"
- x="89"
- height="16"
- width="16"
- id="rect52845"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate" />
- <g
- id="g52847"
- transform="translate(-254.01612,339.00001)"
- mask="url(#mask38474)">
- <rect
- y="175.49899"
- x="343.51614"
- height="13.001007"
- width="12.871031"
- id="rect52849"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- id="path52851"
- d="m 344.01612,176 v 3 h 3 v -3 z m 3,3 v 3 h 3 v -3 z m 3,0 h 3 v -3 h -3 z m -3,3 h -3 v 3 h 3 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient53129);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;opacity:0.9;fill:none;stroke:url(#linearGradient53131);stroke-width:0.9999997px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 344.50621,187.50705 V 176.5055 h 10.89034"
- id="path52853"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- <g
- id="g52855"
- style="display:inline;enable-background:new"
- transform="translate(-414.98389,546.98571)">
- <path
- inkscape:connector-curvature="0"
- style="fill:#9d6c53;fill-opacity:1;fill-rule:evenodd;stroke:#241f1c;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 506.48389,-17.45862 v -1 c 4.75,-1 2.25,-4.5 6.31852,-4.187139 0.70341,0.496889 0.93148,1.187139 0.93148,2.122782 0,3.064357 -2.5,3.314357 -7.25,3.064357 z"
- id="path52857"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path52859"
- d="m 505.98389,-17.522977 c 5.75,-0.75 2.71305,-4.172284 6.75,-5.25 0.70341,0.496889 1.61991,1.711436 1.75268,2.186272 0,3.572675 -4.12319,3.136436 -8.50268,3.063728 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#radialGradient53133);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 515.48389,-25.95862 -2.75,3.25 1.75,2.25 3,-3"
- id="path52861"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- id="path52863"
- d="m 514.98389,-24.95862 -2.25,2.5 1.37109,1.875 2.37891,-2.375 z"
- style="fill:url(#linearGradient53135);fill-opacity:1;fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path52865"
- d="m 519.48389,-30.45862 -5,5.75 2,2.25 3,-3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient53137);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.23326063;marker:none;enable-background:accumulate"
- d="m 519.98389,-30.70862 -5.75,6.5 1.75,1.75 4,-3.75 z"
- id="path52867"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path52869"
- d="m 513.48389,-22.45862 6,-7"
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path52871"
- d="m 511.98389,-21.772977 -1.25,1.25 c -0.96702,0.819679 -0.76749,2.123051 -3.25,2.314357"
- style="display:inline;opacity:0.4;fill:none;stroke:url(#linearGradient53139);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_VPAINT_HLT"
- transform="translate(120,94.000007)">
- <rect
- y="420"
- x="-52"
- height="16"
- width="16"
- id="rect52875"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-556.98389,452.95862)"
- style="display:inline;enable-background:new"
- id="g52877">
- <path
- sodipodi:nodetypes="ccccc"
- id="path52879"
- d="m 506.48389,-17.45862 v -1 c 4.75,-1 2.25,-4.5 6.31852,-4.187139 0.70341,0.496889 0.93148,1.187139 0.93148,2.122782 0,3.064357 -2.5,3.314357 -7.25,3.064357 z"
- style="fill:#9d6c53;fill-opacity:1;fill-rule:evenodd;stroke:#241f1c;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#radialGradient53141);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- d="m 505.98389,-17.522977 c 5.75,-0.75 2.71305,-4.172284 6.75,-5.25 0.70341,0.496889 1.61991,1.711436 1.75268,2.186272 0,3.572675 -4.12319,3.136436 -8.50268,3.063728 z"
- id="path52881"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path52883"
- d="m 515.48389,-25.95862 -2.75,3.25 1.75,2.25 3,-3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient53143);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 514.98389,-24.95862 -2.25,2.5 1.37109,1.875 2.37891,-2.375 z"
- id="path52885"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 520.48389,-31.45862 -6,6.75 2,2.25 4,-4"
- id="path52887"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path52889"
- d="m 520.98389,-31.95862 -6.75,7.75 1.75,1.75 5,-4.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient53145);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.23326063;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 513.48389,-22.45862 7,-8.25"
- id="path52891"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.4;fill:none;stroke:url(#linearGradient53147);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 511.98389,-21.772977 -1.25,1.25 c -0.96702,0.819679 -0.76749,2.123051 -3.25,2.314357"
- id="path52893"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- mask="url(#mask57450)"
- id="g52895"
- style="display:inline"
- transform="translate(-378.00003,264.99999)">
- <path
- sodipodi:nodetypes="ccc"
- id="path52897"
- d="m 328.50261,168.45815 0.0576,-10.96002 10.94282,-0.0283"
- style="opacity:0.7;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#d2d2d2;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 328.50261,168.45815 0.0576,-10.96002 10.94282,-0.0283"
- id="path52899"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <rect
- transform="skewY(3.0087504e-4)"
- y="155.49829"
- x="326.50003"
- height="2.9999838"
- width="2.9999995"
- id="rect52901"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1" />
- </g>
- </g>
- <g
- transform="translate(318,94.000007)"
- id="ICON_LIGHTPAINT"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- id="rect52905"
- width="16"
- height="16"
- x="-124"
- y="420" />
- <g
- id="g52907"
- transform="translate(-258,96.99999)"
- mask="url(#mask32294)">
- <path
- style="opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 142.5,327.5 c 0,1.2526 -0.5,2 -1.5,3 -1,1 0,3 -1.25,3 h -2.5 c -1.25,0 -0.25,-2 -1.25,-3 -1,-1 -1.5,-1.75686 -1.5,-3 0,-2.208 1.792,-4 4,-4 2.208,0 4,1.792 4,4 z"
- id="path52909"
- sodipodi:nodetypes="cssssssc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cssssssc"
- id="path52911"
- d="m 142.5,327.5 c 0,1.2526 -0.5,2 -1.5,3 -1,1 0,3 -1.25,3 h -2.5 c -1.25,0 -0.25,-2 -1.25,-3 -1,-1 -1.5,-1.75686 -1.5,-3 0,-2.208 1.792,-4 4,-4 2.208,0 4,1.792 4,4 z"
- style="fill:none;stroke:#1a1a1a;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 137.5,336.00001 h 2 v 1 l -2,-10e-6 z"
- id="path52913"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#24221c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect52915"
- width="5"
- height="4.7498698"
- x="136"
- y="331.25"
- rx="0.765625"
- ry="0.765625" />
- <rect
- y="332.60001"
- x="137"
- height="2.55"
- width="3"
- id="rect52917"
- style="display:inline;overflow:visible;visibility:visible;fill:#a89858;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- transform="matrix(1.0666667,0,0,1,-128.7,252.00668)"
- sodipodi:type="inkscape:offset"
- inkscape:radius="-0.021577613"
- inkscape:original="M 249.25 79.96875 C 248.7604 79.96875 248.46875 80.255136 248.46875 80.5 C 248.46875 80.744863 248.76041 81.031252 249.25 81.03125 C 249.73959 81.031248 251.26039 81.03125 251.75 81.03125 C 252.23961 81.03125 252.53125 80.744873 252.53125 80.5 C 252.53125 80.255131 252.23961 79.968752 251.75 79.96875 L 249.25 79.96875 z M 249.25 81.96875 C 248.7604 81.96875 248.46875 82.255138 248.46875 82.5 C 248.46875 82.744863 248.76041 83.031253 249.25 83.03125 L 251.75 83.03125 C 252.23961 83.03125 252.53125 82.744875 252.53125 82.5 C 252.53125 82.255131 252.23961 81.968753 251.75 81.96875 C 251.26039 81.968747 249.7396 81.96875 249.25 81.96875 z "
- style="fill:url(#linearGradient53149);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path52919"
- d="m 249.25,79.990234 c -0.48119,0 -0.75977,0.282036 -0.75977,0.509766 0,0.227729 0.27859,0.509768 0.75977,0.509766 0.48959,-2e-6 2.01039,0 2.5,0 0.4812,0 0.75977,-0.282025 0.75977,-0.509766 0,-0.227736 -0.27857,-0.509764 -0.75977,-0.509766 z m 0,2 c -0.48119,0 -0.75977,0.282038 -0.75977,0.509766 0,0.227729 0.27859,0.509769 0.75977,0.509766 h 2.5 c 0.4812,0 0.75977,-0.282023 0.75977,-0.509766 0,-0.227736 -0.27857,-0.509763 -0.75977,-0.509766 -0.48961,-3e-6 -2.0104,0 -2.5,0 z" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path52921"
- d="m 137.25,334.25 h 1.25"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 137.25,332.25 h 1.25"
- id="path52923"
- inkscape:connector-curvature="0" />
- <rect
- y="334"
- x="141"
- height="1"
- width="0.25"
- id="rect52925"
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect52927"
- width="0.25"
- height="1"
- x="141"
- y="332" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect52929"
- width="0.25"
- height="1"
- x="135.75"
- y="334" />
- <rect
- y="332"
- x="135.75"
- height="1"
- width="0.25"
- id="rect52931"
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- transform="translate(-112,254)"
- d="m 250.5,70 c -1.92579,0 -3.5,1.570388 -3.5,3.5 0,1.036273 0.44456,1.979112 1.16797,2.623047 0.12299,0.10948 0.32331,0.494568 0.47265,0.865234 0.0747,0.185333 0.14332,0.364013 0.22657,0.529297 0.0416,0.08264 0.084,0.163508 0.16211,0.253906 0.0781,0.0904 0.22638,0.228517 0.4707,0.228516 h 2 c 0.24442,0 0.39265,-0.138106 0.4707,-0.228516 0.0781,-0.09041 0.12244,-0.171247 0.16407,-0.253906 0.0832,-0.165318 0.14992,-0.34393 0.22461,-0.529297 0.14936,-0.370734 0.35006,-0.756218 0.47265,-0.865234 C 253.55622,75.479081 254,74.536495 254,73.5 254,71.570387 252.42579,70 250.5,70 Z"
- id="path52933"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient53151);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.61155295;marker:none;enable-background:accumulate"
- inkscape:original="M 250.5 70.5 C 248.844 70.5 247.5 71.84032 247.5 73.5 C 247.5 74.394207 247.88111 75.199102 248.5 75.75 C 249.02979 76.22159 249.25 77.500001 249.5 77.5 C 249.75 77.5 251.25 77.500001 251.5 77.5 C 251.75 77.5 251.97036 76.220976 252.5 75.75 C 253.11956 75.199071 253.5 74.394767 253.5 73.5 C 253.5 71.840318 252.156 70.5 250.5 70.5 z "
- inkscape:radius="0.5"
- sodipodi:type="inkscape:offset" />
- <path
- sodipodi:type="inkscape:offset"
- inkscape:radius="0.5"
- inkscape:original="M 250.5 70.5 C 248.844 70.5 247.5 71.84032 247.5 73.5 C 247.5 74.394207 247.88111 75.199102 248.5 75.75 C 249.02979 76.22159 249.25 77.500001 249.5 77.5 C 249.75 77.5 251.25 77.500001 251.5 77.5 C 251.75 77.5 251.97036 76.220976 252.5 75.75 C 253.11956 75.199071 253.5 74.394767 253.5 73.5 C 253.5 71.840318 252.156 70.5 250.5 70.5 z "
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:url(#radialGradient53153);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.61155295;marker:none;enable-background:accumulate"
- id="path52935"
- d="m 250.5,70 c -1.92579,0 -3.5,1.570388 -3.5,3.5 0,1.036273 0.44456,1.979112 1.16797,2.623047 0.12299,0.10948 0.32331,0.494568 0.47265,0.865234 0.0747,0.185333 0.14332,0.364013 0.22657,0.529297 0.0416,0.08264 0.084,0.163508 0.16211,0.253906 0.0781,0.0904 0.22638,0.228517 0.4707,0.228516 h 2 c 0.24442,0 0.39265,-0.138106 0.4707,-0.228516 0.0781,-0.09041 0.12244,-0.171247 0.16407,-0.253906 0.0832,-0.165318 0.14992,-0.34393 0.22461,-0.529297 0.14936,-0.370734 0.35006,-0.756218 0.47265,-0.865234 C 253.55622,75.479081 254,74.536495 254,73.5 254,71.570387 252.42579,70 250.5,70 Z"
- transform="translate(-112,254)" />
- <path
- d="m 138.5,324.5 c 1.656,0 3,1.34699 3,3.00667 0,0.89477 -0.39063,1.69865 -1.01019,2.24958 C 139.96017,330.22723 139.5,331 139.5,332.25 m -1,-7.75 c -1.656,0 -3,1.34699 -3,3.00667 0,0.89477 0.39063,1.69865 1.01019,2.24958 C 137.03983,330.22723 137.5,331 137.5,332.25"
- style="display:inline;fill:none;stroke:url(#linearGradient53155);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- id="path52937"
- inkscape:connector-curvature="0" />
- <ellipse
- transform="matrix(0.8490785,0,0,0.8469086,71.921104,-98.093334)"
- id="path52939"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient53157);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path52941"
- style="display:inline;opacity:0.9;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- transform="matrix(0.99567,0,-0.00787885,1,74.34506,191)"
- cx="64"
- cy="135"
- r="1" />
- <path
- id="path52943"
- style="display:inline;fill:none;stroke:url(#radialGradient53159);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 138.5,324.5 c 1.656,0 3,1.34699 3,3.00667 0,0.89477 -0.39063,1.69865 -1.01019,2.24958 C 139.96017,330.22723 139.5,331 139.5,332.25 m -1,-7.75 c -1.656,0 -3,1.34699 -3,3.00667 0,0.89477 0.39063,1.69865 1.01019,2.24958 C 137.03983,330.22723 137.5,331 137.5,332.25"
- inkscape:connector-curvature="0" />
- <rect
- y="331"
- x="136.01562"
- height="0.75"
- width="4.96875"
- id="rect52945"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:#504416;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path52947"
- d="m 137.5,335.01146 h 2 v 1 l -2,-10e-6 z"
- style="fill:#6c6753;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path52949"
- d="m 138,329 v 3.75 h 1 V 329 Z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:url(#linearGradient53161);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="328"
- x="137"
- height="1"
- width="3"
- id="rect52951"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.20000005;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#d3bc5f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.20000005;marker:none;enable-background:accumulate"
- id="rect52953"
- width="1"
- height="1"
- x="138"
- y="328" />
- <path
- d="m 138.5,324.5 c 1.656,0 3,1.34699 3,3.00667 0,0.89477 -0.39063,1.69865 -1.01019,2.24958 C 139.96017,330.22723 139.5,331 139.5,332.25 m -1,-7.75 c -1.656,0 -3,1.34699 -3,3.00667 0,0.89477 0.39063,1.69865 1.01019,2.24958 C 137.03983,330.22723 137.5,331 137.5,332.25"
- style="display:inline;fill:none;stroke:url(#radialGradient53163);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- id="path52955"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path52957"
- d="m 137.5,336.00001 h 0.5 v 1 L 137.5,337 Z"
- style="opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-626.98389,452.95862)"
- style="display:inline;enable-background:new"
- id="g52959">
- <path
- sodipodi:nodetypes="ccccc"
- id="path52961"
- d="m 506.48389,-17.45862 v -1 c 4.75,-1 2.25,-4.5 6.31852,-4.187139 0.70341,0.496889 0.93148,1.187139 0.93148,2.122782 0,3.064357 -2.5,3.314357 -7.25,3.064357 z"
- style="fill:#9d6c53;fill-opacity:1;fill-rule:evenodd;stroke:#241f1c;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#radialGradient53165);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- d="m 505.98389,-17.522977 c 5.75,-0.75 2.71305,-4.172284 6.75,-5.25 0.70341,0.496889 1.61991,1.711436 1.75268,2.186272 0,3.572675 -4.12319,3.136436 -8.50268,3.063728 z"
- id="path52963"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path52965"
- d="m 515.48389,-25.95862 -2.75,3.25 1.75,2.25 3,-3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient53167);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 514.98389,-24.95862 -2.25,2.5 1.38281,1.847656 2.36719,-2.347656 z"
- id="path52967"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 518.48389,-29.45862 -4,4.75 2,2.25 2,-2"
- id="path52969"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path52971"
- d="m 518.98389,-29.70862 -4.75,5.5 1.75,1.75 3,-2.75 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient53169);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.23326063;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 513.48389,-22.45862 5,-6"
- id="path52973"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.4;fill:none;stroke:url(#linearGradient53171);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 511.98389,-21.772977 -1.25,1.25 c -0.96702,0.819679 -0.76749,2.123051 -3.25,2.314357"
- id="path52975"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_RETOPO"
- transform="translate(-20.999997,23)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect33341"
- width="16"
- height="16"
- x="257"
- y="113" />
- <g
- style="display:inline;opacity:0.8"
- id="g33343"
- transform="matrix(1.1658027,0,0,1.1657997,112.71027,-140.05607)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path33345"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:1.33333421;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.643333,0,0,0.643335,44.424162,146.72855)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.8;fill:url(#linearGradient33427);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path33347"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.5858806,-0.06590218,0.06677852,-0.5812167,198.80048,299.96262)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.5361112,0,0,0.5361024,58.577433,159.38208)"
- style="fill:none;stroke:url(#linearGradient33429);stroke-width:1.60001671;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path33349"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- transform="translate(5,-21)"
- id="g33351">
- <g
- id="g33353"
- transform="translate(169.04507,38.63228)">
- <path
- sodipodi:nodetypes="ccccc"
- id="path33355"
- d="m 90.45493,102.86772 -4.5e-4,6.03674 6.00045,-0.0367 4.5e-4,-6.03674 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:none;stroke:#002255;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#afc6e9;fill-opacity:0.70588235;fill-rule:evenodd;stroke:#afc6e9;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 90.45493,102.86772 -4.5e-4,6.03674 h 6 l 4.5e-4,-6.03674 z"
- id="path33357"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="146.5"
- x="264.50012"
- height="3"
- width="2.9998772"
- id="rect33359"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect33361"
- width="2.9998772"
- height="3"
- x="257.50012"
- y="139.5"
- ry="1.4999386"
- rx="1.4999386" />
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="146.49997"
- x="257.49969"
- height="3"
- width="2.9998772"
- id="rect33363"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 267.00027,146.99999 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path33365"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path33367"
- d="m 260,147 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path33369"
- d="m 260.00029,140 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect33371"
- width="2.9998772"
- height="3"
- x="264.50085"
- y="139.5"
- ry="1.4999386"
- rx="1.4999386" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path33373"
- d="m 267.00101,139.99999 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_OOPS"
- transform="translate(74,89.000007)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect50824"
- width="16"
- height="16"
- x="-27"
- y="446" />
- <g
- transform="translate(-49,229)"
- id="g50826"
- style="opacity:0.5">
- <path
- sodipodi:nodetypes="ccccc"
- id="path50828"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#1a1a1a;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 25.5,220 v 10.5 h 4 m -4,-5 c 0.125,0 4,0 4,0"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- d="m 25.5,220 v 10.5 h 4 m -4,-5 c 0.125,0 4,0 4,0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#bcd0f5;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path50830"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient50870);fill-opacity:1;fill-rule:evenodd;stroke:#2b2200;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect50832"
- width="7.000001"
- height="3"
- x="-26.5"
- y="446.5" />
- <g
- transform="translate(-48,228)"
- style="opacity:0.45"
- id="g50834">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect50836"
- width="1"
- height="1"
- x="24"
- y="226" />
- <rect
- y="231"
- x="24"
- height="1"
- width="1"
- id="rect50838"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- </g>
- <path
- sodipodi:nodetypes="cccccccccc"
- id="path50840"
- d="m -19.5,452.5 v 3 h 7 v -3 z m 0,6 v 3 h 7 v -3 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m -25.5,448.5 v -1 h 5"
- id="path50842"
- inkscape:connector-curvature="0" />
- <path
- id="path50844"
- d="m -18.5,454.5 v -1 h 5"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m -18.5,460.5 v -1 h 5"
- id="path50846"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <rect
- y="447.25"
- x="-25"
- height="1.75"
- width="1"
- id="rect50848"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#000000;fill-opacity:0.70588235;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#000000;fill-opacity:0.70588235;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- id="rect50850"
- width="1"
- height="2"
- x="-18"
- y="453" />
- <rect
- y="459"
- x="-18"
- height="2"
- width="1"
- id="rect50852"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#000000;fill-opacity:0.70588235;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate" />
- <path
- id="path50854"
- d="m -23.5,448.5 v -1 h 3"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m -16.5,454.5 v -1 h 3"
- id="path50856"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path50858"
- d="m -16.5,460.5 v -1 h 3"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <rect
- transform="translate(-48,228)"
- y="225"
- x="24"
- height="1"
- width="1"
- id="rect50860"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect50862"
- width="1"
- height="1"
- x="-23"
- y="454" />
- <rect
- y="455"
- x="-24"
- height="1"
- width="1"
- id="rect50864"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect50866"
- width="1"
- height="1"
- x="-24"
- y="458" />
- <rect
- y="459"
- x="-23"
- height="1"
- width="1"
- id="rect50868"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="ICON_SNAP_NORMAL"
- transform="translate(-42,23)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.29999995;marker:none;enable-background:accumulate"
- id="rect33464"
- width="16"
- height="16"
- x="173"
- y="134"
- ry="0" />
- <g
- style="display:inline;opacity:0.8"
- id="g33466"
- transform="matrix(1.0761252,0,0,1.0761229,40.809522,-96.59025)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path33469"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient33831);stroke-width:1.44444537;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.643333,0,0,0.643335,44.424162,146.72855)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.8;fill:url(#linearGradient33833);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path33471"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.5902213,-0.06639044,0.06727327,-0.5855229,199.31507,300.5352)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.5227063,0,0,0.5226977,60.34688,160.96383)"
- style="fill:none;stroke:url(#linearGradient33835);stroke-width:1.77780378;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path33473"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g33475"
- transform="translate(-62.70896,-1.9304201)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#003380;stroke-width:2.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 245.20896,142.43042 5,-5"
- id="path33477"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:none;stroke:#2a7fff;stroke-width:2.99999928;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 244.54233,144.43041 h 1.33333 l 1.33332,-1.33332 v -1.33335 l -1.33332,-1.33332 -1.33332,-1e-5 -1.33333,1.33334 v 1.33333 z"
- id="path33479"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path33483"
- d="m 244.45896,144.43042 h 1.5 l 1.25,-1.25 v -1.5 l -1.3333,-1.25 h -1.4167 l -1.25,1.25 v 1.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0044aa;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 244.45896,143.93042 h 1.5 l 0.75,-0.75 v -1.5 l -0.75,-0.75 h -1.5 l -0.75,0.75 v 1.5 z"
- id="path33481"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path33485"
- d="m 245.20896,142.43042 5,-5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient33585);stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <rect
- y="141.93039"
- x="244.709"
- height="1"
- width="1"
- id="rect33487"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:#00112b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.99999976;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(84,-124)"
- id="ICON_GRID"
- mask="url(#mask25369)">
- <rect
- y="281"
- x="320"
- height="16"
- width="16"
- id="rect36193"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.70000005;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccc"
- d="m 324.5,295.75 v -13.5 m 7,13.5 v -13.5"
- style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path36195"
- inkscape:connector-curvature="0" />
- <path
- id="path36197"
- style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 321.25001,285.50001 334.75,285.5 M 321.25001,292.50001 334.75,292.5"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- id="path36199"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 324.5,296.5 v -14.99999 m 7,14.99999 v -14.99999"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- d="m 320.5,285.50001 h 15 m -15,6.99999 h 15"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path36201"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_ZOOM_SELECTED">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(-1.5002341,0,0,1.5000004,549.81053,465.24998)"
- id="path36205"
- style="display:inline;fill:url(#radialGradient24523);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.63636374;marker:none"
- inkscape:transform-center-x="-6.5102284"
- inkscape:transform-center-y="-6.547647"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <path
- inkscape:connector-curvature="0"
- id="path36207"
- d="m 159.5,582.50001 v 5.40625 c 0.75032,0.38395 1.59977,0.59375 2.5,0.59375 0.90022,0 1.74968,-0.2098 2.5,-0.59375 v -5.40625 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.96000001;fill:#ff8400;fill-opacity:1;fill-rule:evenodd;stroke:#2b2200;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- style="opacity:0.76799999;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 160.5,586.25001 v -2.75 h 3"
- id="path36209" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- id="path36211"
- d="m 165.5,587.25001 c -1.25,1 -2.5,1.25 -3,1.25 v 3 h 2.98688 l 0.0131,-4.25 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.96000001;fill:#ff8400;fill-opacity:1;fill-rule:evenodd;stroke:#2b2200;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path36213"
- d="m 163.5,590.50001 v -2"
- style="opacity:0.672;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect36215"
- width="16"
- height="16"
- x="152"
- y="577" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.96000001;fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 156.5,588.50001 1.5,-1.5"
- id="path36217"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <circle
- inkscape:transform-center-y="-6.547647"
- inkscape:transform-center-x="-6.5102284"
- style="display:inline;opacity:0.48000004;fill:url(#radialGradient24519);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.63636374;marker:none"
- id="path36220"
- transform="matrix(-1.5002341,0,0,1.5000004,549.81053,465.24998)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(-1.5714299,0,0,1.5714268,568.21462,459.64301)"
- id="path36222"
- style="display:inline;opacity:0.96000001;fill:none;stroke:#000000;stroke-width:0.57272732;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- inkscape:transform-center-x="-6.8191649"
- inkscape:transform-center-y="-6.8594309"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path36224"
- d="M 153.86319,591.13808 156.25,588.75001"
- style="opacity:0.96000001;fill:none;stroke:#28170b;stroke-width:3.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path36226"
- d="m 156.5,588.50001 1.5,-1.5"
- style="opacity:0.96000001;fill:none;stroke:#cccccc;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <g
- transform="matrix(1.0988734,0,0,1.0981343,-23.179949,357.33845)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g36228"
- style="opacity:0.96000001">
- <circle
- transform="matrix(-1.14287,0,0,1.142863,463.9317,115.80133)"
- id="path36230"
- style="display:inline;fill:url(#linearGradient24511);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient24513);stroke-width:0.79652983;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- inkscape:transform-center-x="-4.9755572"
- inkscape:transform-center-y="-4.9844055"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <g
- id="g36232">
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient24515);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path36234"
- transform="matrix(1.1162596,0,0,1.1065394,80.948334,-350.49863)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(-1.087144,-0.2518404,0.2525206,-1.0776772,126.97246,766.619)"
- id="path36236"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient24517);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- </g>
- <circle
- transform="matrix(0.9100226,0,0,0.9106329,108.4468,80.751664)"
- style="display:inline;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- id="path36238"
- inkscape:transform-center-x="-3.1120555"
- inkscape:transform-center-y="-5.7593212"
- cx="64"
- cy="135"
- r="1" />
- </g>
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.96000001;fill:none;stroke:#a05a2c;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 153.75,591.25001 2.5,-2.5"
- id="path36240"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path36242"
- d="m 153.25,591.00001 2.75,-2.75"
- style="opacity:0.672;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.48000004;fill:none;stroke:#2b2200;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 164.5,585.25001 v -2.75 h -5 v 2.75"
- id="path36244" />
- </g>
- <g
- style="display:inline;opacity:0.96000001;enable-background:new"
- id="ICON_ZOOM_ALL"
- transform="translate(60,59)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect36248"
- width="16"
- height="16"
- x="71"
- y="518" />
- <g
- id="g36250">
- <g
- mask="url(#mask18634)"
- id="g36252"
- transform="translate(-136,386)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path36254"
- d="m 210,134.5 h 7.5 v 13 h -10 V 137 Z"
- style="display:inline;fill:url(#linearGradient37472);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- inkscape:connector-curvature="0" />
- <path
- transform="matrix(1.2999758,0,0,1.2999988,271.54887,-199.56022)"
- sodipodi:nodetypes="ccc"
- id="path36256"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.76923829px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter31351)"
- d="m -48.384641,259.86235 2.000031,-0.008 -3.1e-5,-1.99191"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path36258"
- d="m 207,138 h 4 v -4 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 207.5,137 v 10.5 h 10 v -13 H 210 Z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path36260"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path36262"
- style="display:inline;fill:none;stroke:url(#linearGradient37475);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 208.5,138.5 v 8 m 3,-11 h 5"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="opacity:0.01000001"
- clip-path="url(#clipPath18524)"
- transform="translate(-134,387)"
- id="g36264">
- <path
- style="display:inline;fill:url(#linearGradient37477);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="m 210,134.5 h 7.5 v 12 h -10 V 137 Z"
- id="path36266"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- d="m -48.384641,259.86235 2.000031,-0.008 -3.1e-5,-1.99191"
- style="display:inline;opacity:0.7;fill:none;stroke:#000000;stroke-width:0.76923829px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter31351)"
- id="path36268"
- sodipodi:nodetypes="ccc"
- transform="matrix(1.2999758,0,0,1.2999988,271.54887,-199.56022)"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 207,138 h 4 v -4 z"
- id="path36270"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- id="path36272"
- style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 207.5,137 v 9.5 h 10 v -12 H 210 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- d="m 208.5,138.5 v 7 m 3,-10 h 5"
- style="display:inline;fill:none;stroke:url(#linearGradient37479);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- id="path36274"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline"
- id="g36276"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.781818,0,0,0.781818,-53.239298,365.85549)">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(-1.4627004,0,0,1.4628053,551.73128,85.525552)"
- id="path36278"
- style="display:inline;fill:#ffffff;fill-opacity:0.1372549;stroke:#000000;stroke-width:0.78698397;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- inkscape:transform-center-x="-6.3473305"
- inkscape:transform-center-y="-6.3853012"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path36280"
- d="m 164.66657,209.31279 3.51745,-3.51744"
- style="fill:none;stroke:#28170b;stroke-width:4.47674513;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:2.5581398;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 168.5,205.5 0.96309,-0.98372"
- id="path36282"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path36284"
- d="m 168.5,205.5 1.28285,-1.30349"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#cccccc;stroke-width:1.40697706;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- transform="matrix(0.878699,0,0,0.877142,14.70687,20.74499)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g36286">
- <circle
- transform="matrix(-1.2468441,0,0,1.246865,503.16273,106.89331)"
- id="path36288"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37481);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient37483);stroke-width:1.16848361;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#a05a2c;stroke-width:2.55814004;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 164.66657,209.31279 3.51745,-3.51744"
- id="path36290"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path36292"
- d="m 164.02704,208.99303 3.83721,-3.83721"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1.2790699;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:transform-center-y="-6.3853012"
- inkscape:transform-center-x="-6.3473305"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:url(#radialGradient37485);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69954133;marker:none;enable-background:accumulate"
- id="path36294"
- transform="matrix(-1.4627004,0,0,1.4628053,551.73128,85.525552)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <g
- transform="matrix(0.9729196,0,0,0.9789579,9.7047721,-0.8010785)"
- style="display:inline;opacity:0.96000001"
- id="g36296">
- <ellipse
- transform="matrix(1.1162596,0,0,1.1065394,80.948334,-350.49863)"
- id="path36298"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient37487);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient37489);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path36300"
- transform="matrix(-1.087144,-0.2518404,0.2525206,-1.0776772,126.97246,766.619)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- </g>
- <circle
- transform="matrix(1.2790738,0,0,1.2790735,89.840744,25.765779)"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- id="path36302"
- cx="64"
- cy="135"
- r="1" />
- </g>
- </g>
- </g>
- <g
- transform="translate(42,41)"
- id="ICON_ZOOM_PREVIOUS"
- style="display:inline;opacity:0.96000001;enable-background:new">
- <circle
- inkscape:transform-center-y="-6.5435007"
- inkscape:transform-center-x="-6.5092113"
- style="display:inline;fill:url(#radialGradient37491);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.63636374;marker:none"
- id="path36306"
- transform="matrix(-1.5000024,0,0,1.4990511,528.75064,424.32781)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <g
- transform="translate(42,87)"
- id="g36308">
- <rect
- y="449"
- x="89"
- height="16"
- width="16"
- id="rect36310"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path36312"
- d="M 93.5,460.5 95,459"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:transform-center-y="-6.8594309"
- inkscape:transform-center-x="-6.8191649"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.57272732;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path36314"
- transform="matrix(-1.5714299,0,0,1.5714268,505.21462,331.643)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <path
- style="fill:none;stroke:#28170b;stroke-width:3.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 90.863188,463.13807 93.25,460.75"
- id="path36316"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#cccccc;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 93.5,460.5 2,-2"
- id="path36318"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <g
- id="g36320"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(1.0988734,0,0,1.0981343,-86.169279,229.32421)">
- <circle
- inkscape:transform-center-y="-4.9844055"
- inkscape:transform-center-x="-4.9755572"
- style="display:inline;fill:url(#linearGradient37493);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient37495);stroke-width:0.79652983;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="path36322"
- transform="matrix(-1.14287,0,0,1.142863,463.9317,115.7853)"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <g
- id="g36324">
- <ellipse
- transform="matrix(1.1162596,0,0,1.1065394,80.948334,-350.49863)"
- id="path36326"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient37497);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient37499);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path36328"
- transform="matrix(-1.087144,-0.2518404,0.2525206,-1.0776772,126.97246,766.619)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- </g>
- <circle
- inkscape:transform-center-y="-5.7593212"
- inkscape:transform-center-x="-3.1120555"
- id="path36330"
- style="display:inline;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- transform="matrix(0.9100226,0,0,0.9106329,108.4468,80.751664)"
- cx="64"
- cy="135"
- r="1" />
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path36332"
- d="m 90.75,463.25 2.5,-2.5"
- style="fill:none;stroke:#a05a2c;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 90.25,463 93,460.25"
- id="path36334"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 142,545 1,3e-5 v -1 -1 h 3.5 v -2 H 143 v -1 -1 l -1,-3e-5 -2,2.5 v 1 z"
- id="path36337"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_COLOR"
- transform="translate(-294,339)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect36341"
- width="16"
- height="16"
- x="341"
- y="238" />
- <g
- transform="translate(0,-12)"
- id="g36343">
- <g
- id="g36345"
- transform="matrix(1.1658027,0,0,1.1657997,198.71028,-2.0560643)">
- <path
- inkscape:transform-center-y="-3.2499984"
- inkscape:transform-center-x="-2.8145849"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36349"
- style="fill:#ff6600;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(0.6969448,0,0,0.6969467,36.918512,140.83126)" />
- <path
- transform="matrix(0.3484724,0.6035735,-0.603572,0.3484734,154.13836,102.27942)"
- sodipodi:type="arc"
- style="fill:#ad2f94;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36351"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="-3.2630798"
- inkscape:transform-center-y="1.6729808e-05" />
- <path
- inkscape:transform-center-y="3.2500173"
- inkscape:transform-center-x="-2.8145756"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36353"
- style="fill:#0060f0;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(-0.3484724,0.6035735,-0.603572,-0.3484733,246.13507,184.51913)" />
- <path
- transform="matrix(-0.6969448,2.2484149e-8,-4.6257528e-8,-0.6969467,220.91956,305.31067)"
- sodipodi:type="arc"
- style="fill:#00d4aa;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36355"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="2.8145978"
- inkscape:transform-center-y="3.249994" />
- <path
- inkscape:transform-center-x="3.2630773"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36357"
- style="fill:#ccff00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(-0.3484724,-0.6035734,0.603572,-0.3484734,103.69972,343.86251)" />
- <path
- inkscape:transform-center-y="-3.2500006"
- transform="matrix(0.3484724,-0.6035734,0.603572,0.3484733,11.703006,261.6228)"
- sodipodi:type="arc"
- style="fill:#ffbf0e;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36359"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="2.8145777" />
- </g>
- <circle
- transform="matrix(0.8124999,0,0,0.8045157,241.75,163.13011)"
- style="fill:none;stroke:#000000;stroke-width:0.98948926;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path36361"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.7451143,-0.08386971,0.08492794,-0.7396793,437.33358,356.39712)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path36363"
- style="display:inline;opacity:0.3;fill:url(#radialGradient37501);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path36365"
- style="fill:none;stroke:url(#linearGradient37503);stroke-width:1.45605874;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6860851,0,0,0.6874876,258.44808,176.87656)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- transform="translate(105,41)"
- id="ICON_ZOOM_IN"
- style="display:inline;opacity:0.96000001;enable-background:new">
- <g
- id="g36369"
- transform="translate(0,87)">
- <rect
- y="449"
- x="89"
- height="16"
- width="16"
- id="rect36371"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path36373"
- d="M 93.5,460.5 95,459"
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:transform-center-y="-6.8594309"
- inkscape:transform-center-x="-6.8191649"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.57272732;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="path36375"
- transform="matrix(-1.5714299,0,0,1.5714268,505.21462,331.643)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <path
- style="fill:none;stroke:#28170b;stroke-width:3.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 90.863188,463.13807 93.25,460.75"
- id="path36377"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#cccccc;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 93.5,460.5 95,459"
- id="path36379"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <g
- id="g36381"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(1.0988734,0,0,1.0981343,-86.169279,229.32421)">
- <circle
- inkscape:transform-center-y="-4.9844055"
- inkscape:transform-center-x="-4.9755572"
- style="display:inline;fill:url(#linearGradient37505);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient37507);stroke-width:0.79652983;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="path36383"
- transform="matrix(-1.14287,0,0,1.142863,463.9317,115.7853)"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <g
- id="g36385">
- <ellipse
- transform="matrix(1.1162596,0,0,1.1065394,80.948334,-350.49863)"
- id="path36387"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient37509);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient37511);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path36389"
- transform="matrix(-1.087144,-0.2518404,0.2525206,-1.0776772,126.97246,766.619)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- </g>
- <circle
- inkscape:transform-center-y="-5.7593212"
- inkscape:transform-center-x="-3.1120555"
- id="path36391"
- style="display:inline;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- transform="matrix(0.9100226,0,0,0.9106329,108.4468,80.751664)"
- cx="64"
- cy="135"
- r="1" />
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path36393"
- d="m 90.75,463.25 2.5,-2.5"
- style="fill:none;stroke:#a05a2c;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 90.25,463 93,460.25"
- id="path36395"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <circle
- inkscape:transform-center-y="-6.547647"
- inkscape:transform-center-x="-6.5102284"
- style="display:inline;fill:url(#radialGradient37513);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.63636374;marker:none"
- id="path36397"
- transform="matrix(-1.5002341,0,0,1.5000004,486.81053,424.24997)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <g
- id="g36399"
- style="fill:#000000"
- transform="translate(0,87)">
- <g
- id="g36401"
- style="fill:#000000">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36403"
- width="2"
- height="6"
- x="98"
- y="452"
- ry="0.453125" />
- <rect
- y="-102"
- x="454"
- height="6"
- width="2"
- id="rect36405"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="rotate(90)"
- ry="0.65625" />
- </g>
- </g>
- </g>
- <g
- transform="translate(105,41)"
- id="ICON_ZOOM_OUT"
- style="display:inline;opacity:0.96000001;enable-background:new">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(-1.5000024,0,0,1.4990511,507.75064,424.32781)"
- id="path36409"
- style="display:inline;fill:url(#radialGradient37515);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.63636374;marker:none"
- inkscape:transform-center-x="-6.5092113"
- inkscape:transform-center-y="-6.5435007"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <g
- id="g36411"
- transform="translate(21,87)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect36413"
- width="16"
- height="16"
- x="89"
- y="449" />
- <path
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 93.5,460.5 95,459"
- id="path36415"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(-1.5714299,0,0,1.5714268,505.21462,331.643)"
- id="path36417"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.57272732;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- inkscape:transform-center-x="-6.8191649"
- inkscape:transform-center-y="-6.8594309"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path36419"
- d="M 90.863188,463.13807 93.25,460.75"
- style="fill:none;stroke:#28170b;stroke-width:3.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path36421"
- d="M 93.5,460.5 95,459"
- style="fill:none;stroke:#cccccc;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <g
- transform="matrix(1.0988734,0,0,1.0981343,-86.169279,229.32421)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g36423">
- <circle
- transform="matrix(-1.14287,0,0,1.142863,463.9317,115.7853)"
- id="path36425"
- style="display:inline;fill:url(#linearGradient37517);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient37519);stroke-width:0.79652983;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- inkscape:transform-center-x="-4.9755572"
- inkscape:transform-center-y="-4.9844055"
- cx="258.5"
- cy="78.5"
- r="3.5" />
- <g
- id="g36427">
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient37521);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path36429"
- transform="matrix(1.1162596,0,0,1.1065394,80.948334,-350.49863)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(-1.087144,-0.2518404,0.2525206,-1.0776772,126.97246,766.619)"
- id="path36431"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#radialGradient37523);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- </g>
- <circle
- transform="matrix(0.9100226,0,0,0.9106329,108.4468,80.751664)"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- id="path36433"
- inkscape:transform-center-x="-3.1120555"
- inkscape:transform-center-y="-5.7593212"
- cx="64"
- cy="135"
- r="1" />
- </g>
- <path
- style="fill:none;stroke:#a05a2c;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 90.75,463.25 2.5,-2.5"
- id="path36435"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path36437"
- d="M 90.25,463 93,460.25"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="-123"
- x="541"
- height="6"
- width="2"
- id="rect36439"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="rotate(90)"
- ry="0.609375" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_SNAP_INCREMENT"
- transform="translate(107,-124)">
- <g
- style="display:inline;opacity:0.85;enable-background:new"
- transform="translate(-273)"
- id="g36443"
- mask="url(#mask25561)">
- <rect
- y="281"
- x="320"
- height="16"
- width="16"
- id="rect36445"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.70000005;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccc"
- d="m 325.5,295.75 v -13.5 m 6,13.5 v -13.5"
- style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path36447"
- inkscape:connector-curvature="0" />
- <path
- id="path36449"
- style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 321.25,286.5 13.49999,-10e-6 M 321.25001,292.50001 334.75,292.5"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- id="path36451"
- style="fill:none;stroke:#e6e6e6;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 325.5,296.49999 V 281.5 m 6,15 v -14.99999"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- d="m 320.5,286.5 h 15 m -15,6 h 15"
- style="fill:none;stroke:#e6e6e6;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path36453"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-21)"
- id="g36455">
- <g
- transform="translate(-277.98388,250)"
- id="g36457"
- style="display:inline">
- <circle
- transform="matrix(1.142871,0,0,1.142855,-27.218817,-5.0713453)"
- id="path36459"
- style="display:inline;fill:url(#linearGradient37525);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.69999641;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- cx="330.5"
- cy="35.5"
- r="3.5" />
- <circle
- style="display:inline;fill:none;stroke:url(#linearGradient37527);stroke-width:1.16669464;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="path36461"
- transform="matrix(0.857099,0,0,0.857147,67.228993,5.071249)"
- cx="330.5"
- cy="35.5"
- r="3.5" />
- </g>
- <g
- transform="translate(-210,147)"
- id="g36463">
- <rect
- y="137"
- x="282"
- height="1"
- width="1"
- id="rect36465"
- style="display:inline;overflow:visible;visibility:visible;fill:#0055d4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#0055d4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect36467"
- width="1"
- height="1"
- x="283"
- y="138" />
- <rect
- y="139"
- x="282"
- height="1"
- width="1"
- id="rect36469"
- style="display:inline;overflow:visible;visibility:visible;fill:#0055d4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#0055d4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect36472"
- width="1"
- height="1"
- x="281"
- y="138" />
- <rect
- y="138"
- x="283"
- height="1"
- width="1"
- id="rect36474"
- style="display:inline;overflow:visible;visibility:visible;fill:#0055d4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <g
- id="g36476"
- style="opacity:0.5">
- <rect
- y="137"
- x="281"
- height="1"
- width="1"
- id="rect36478"
- style="display:inline;overflow:visible;visibility:visible;fill:#0055d4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="137"
- x="283"
- height="1"
- width="1"
- id="rect36480"
- style="display:inline;overflow:visible;visibility:visible;fill:#0055d4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="139"
- x="283"
- height="1"
- width="1"
- id="rect36482"
- style="display:inline;overflow:visible;visibility:visible;fill:#0055d4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="139"
- x="281"
- height="1"
- width="1"
- id="rect36484"
- style="display:inline;overflow:visible;visibility:visible;fill:#0055d4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- </g>
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_HELP"
- transform="translate(-44.309303,267.47333)">
- <rect
- y="309.52667"
- x="49.309303"
- height="16"
- width="16"
- id="rect36488"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ececec;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- inkscape:transform-center-y="-5"
- inkscape:transform-center-x="5"
- style="opacity:0.7"
- id="g36490"
- transform="translate(-396.6907,133.52667)">
- <path
- sodipodi:nodetypes="cccc"
- id="path36492"
- d="m 447.5,180.5 v -2.25 l 0.75,-0.75 h 2.25"
- style="fill:none;stroke:#241f1c;stroke-width:2.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#e3dedb;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 447.5,180.5 v -2.25 l 0.75,-0.75 h 2.25"
- id="path36494"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="rotate(90,188.89132,52.417985)"
- id="g36496"
- style="opacity:0.7"
- inkscape:transform-center-x="-5"
- inkscape:transform-center-y="-5">
- <path
- style="fill:none;stroke:#241f1c;stroke-width:2.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 447.5,180.5 v -2.25 l 0.75,-0.75 h 2.25"
- id="path36498"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path36500"
- d="m 447.5,180.5 v -2.25 l 0.75,-0.75 h 2.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#e3dedb;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- inkscape:transform-center-y="5"
- inkscape:transform-center-x="-5"
- style="opacity:0.7"
- id="g36502"
- transform="rotate(180,255.65465,250.76333)">
- <path
- sodipodi:nodetypes="cccc"
- id="path36504"
- d="m 447.5,180.5 v -2.25 l 0.75,-0.75 h 2.25"
- style="fill:none;stroke:#241f1c;stroke-width:2.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#e3dedb;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 447.5,180.5 v -2.25 l 0.75,-0.75 h 2.25"
- id="path36506"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="rotate(-90,322.41798,449.10868)"
- id="g36508"
- style="opacity:0.7"
- inkscape:transform-center-x="5"
- inkscape:transform-center-y="5">
- <path
- style="fill:none;stroke:#241f1c;stroke-width:2.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 447.5,180.5 v -2.25 l 0.75,-0.75 h 2.25"
- id="path36510"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path36512"
- d="m 447.5,180.5 v -2.25 l 0.75,-0.75 h 2.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#e3dedb;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(1.1870922,0,0,1.1818357,-168.36213,276.1664)"
- id="g36514"
- style="display:inline">
- <g
- id="g36516">
- <g
- style="display:inline;enable-background:new"
- id="g36518"
- transform="matrix(0.8423946,0,0,0.8461413,-192.36364,-120.73212)">
- <path
- inkscape:transform-center-y="-3"
- inkscape:transform-center-x="3"
- sodipodi:nodetypes="ccccccccccccccccc"
- id="path36520"
- d="m 450.5,179 -0.83982,0.68197 L 449,180.5 v 0.5 h 1 v 1 h 1 v 1 h 0.25 l 0.66329,-1.10494 L 453,181.25 V 181 h -1 v -1 h -1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;marker:none;enable-background:accumulate"
- d="M 459,180.5 458.31803,179.66018 457.5,179 H 457 v 1 h -1 v 1 h -1 v 0.25 l 1.10494,0.66329 L 456.75,183 H 457 v -1 h 1 v -1 h 1 z"
- id="path36522"
- sodipodi:nodetypes="ccccccccccccccccc"
- inkscape:transform-center-x="-3"
- inkscape:transform-center-y="-3"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="3"
- inkscape:transform-center-x="-3"
- sodipodi:nodetypes="ccccccccccccccccc"
- id="path36524"
- d="m 457.5,189 0.83982,-0.68197 L 459,187.5 V 187 h -1 v -1 h -1 v -1 h -0.25 l -0.66329,1.10494 L 455,186.75 V 187 h 1 v 1 h 1 v 1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;marker:none;enable-background:accumulate"
- d="m 449,187.5 0.68197,0.83982 L 450.5,189 h 0.5 v -1 h 1 v -1 h 1 v -0.25 L 451.89506,186.08671 451.25,185 H 451 v 1 h -1 v 1 h -1 z"
- id="path36526"
- sodipodi:nodetypes="ccccccccccccccccc"
- inkscape:transform-center-x="3"
- inkscape:transform-center-y="3"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="cssscczzzz"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36528"
- d="m 190.07108,29.454411 c -3.02619,0 -5.48439,2.463313 -5.48438,5.5 0,3.036688 2.45819,5.500001 5.48438,5.5 3.02619,0 5.48437,-2.46331 5.48437,-5.5 0,-3.036689 -2.45818,-5.500001 -5.48437,-5.5 z m 0.0124,3.388115 c 1.26359,0 2.10599,0.846143 2.10599,2.115354 0,1.269211 -0.8424,2.115353 -2.10599,2.115353 -1.26359,0 -2.10598,-0.846141 -2.10598,-2.115353 0,-1.269212 0.84239,-2.115354 2.10598,-2.115354 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37529);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.75983924;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <circle
- transform="matrix(0.5547465,0,0,-0.5552803,116.84153,100.48096)"
- style="display:inline;fill:none;stroke:url(#linearGradient37531);stroke-width:2.28174472;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path36530"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36532"
- style="display:inline;fill:none;stroke:url(#linearGradient37533);stroke-width:3.21050167;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.3942416,0,0,-0.3946688,138.04864,81.514802)"
- cx="132"
- cy="118"
- r="8" />
- <path
- sodipodi:nodetypes="cccccccccccccccccccccccccccc"
- id="path36534"
- d="m 190.94678,29.919785 -0.8687,-0.147436 -0.81609,0.147436 v 2.538424 l 0.8347,-0.01215 0.85009,0.01215 z m 1.68479,4.230706 v 0.846142 0.846141 h 2.52718 l 0.0755,-0.891284 -0.0755,-0.800999 z m -7.58155,0 -0.10953,0.819696 0.10953,0.872587 h 2.52718 v -0.846141 -0.846142 z m 5.89676,3.17303 -0.8687,0.152099 -0.81609,-0.152099 v 2.74996 l 0.8347,0.07585 0.85009,-0.07585 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#d40000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36536"
- style="display:inline;fill:none;stroke:url(#linearGradient37535);stroke-width:2.28174472;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.5547465,0,0,-0.5552803,116.84153,100.48096)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.3942416,0,0,-0.3946688,138.04864,81.514802)"
- style="display:inline;fill:none;stroke:url(#linearGradient37537);stroke-width:3.21050167;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path36538"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;opacity:0.96000001;enable-background:new"
- id="ICON_STRANDS"
- inkscape:label="Layer 1"
- transform="translate(-211.14286,264.78067)">
- <g
- transform="translate(307.14286,-384.78067)"
- id="g36542"
- style="display:inline">
- <rect
- y="592"
- x="182"
- height="16"
- width="16"
- id="rect36544"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g36546"
- transform="translate(117.00001,391)">
- <g
- transform="translate(-203,-446)"
- style="display:inline"
- id="g36548">
- <g
- transform="matrix(0.9993234,0,0,1.0050357,164.07104,603.72198)"
- style="display:inline;opacity:0.96000001"
- id="g36550">
- <path
- sodipodi:nodetypes="ccccccc"
- id="path36552"
- d="m 118.00879,52.264848 10e-6,2.238708 -7.00472,3.482446 -6.00407,-2.984969 -1e-5,-2.238708 7.00473,-2.736203 z"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.79609263;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- id="path36554"
- d="m 105.00001,52.762325 7.00473,-2.736212 6.00406,2.238717 v 2.238716 l -7.00473,1.492495 -6.00406,-0.995 z"
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 105.00998,54.999895 -0.01,-1.988833 6.00407,2.984969 0.01,1.988833 -6.00406,-2.984969 z"
- id="path36556"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path36558"
- d="m 118.0088,54.503556 -0.01,-1.988833 -6.99476,3.481308 c 0,2.570679 0,1.425722 0,1.989979 l 7.00473,-3.482454 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89207077px;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="fill:none;stroke:url(#linearGradient37539);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 269.25,657.25 v 1.5 l 5.75,3 6.75,-3.5 v -1.5"
- id="path36560"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 70,228.5 65,226"
- id="path36562"
- transform="translate(2.0099702,-15.001162)"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline"
- transform="matrix(-1,0,0,1,433.97059,0)"
- id="g36564">
- <path
- sodipodi:nodetypes="cssccssccssc"
- id="path36566"
- d="m 245.5,593.5 c 1.25,2.5 0.97056,4.5 0.97056,6.5 0,0.75 1,0.75 1,0 0,-2.5 0.0294,-4 -1.97056,-6.5 z m -5,0 c 2.75,1.25 2.97056,4.5 2.97056,6.5 0,0.75 1,0.75 1,0 0,-2.5 -0.72056,-5 -3.97056,-6.5 z m -1,4 c 1.97058,0 1.97058,2 1.97058,2.5 0,0.75 0,0.75 0,0 0,-0.5 0,-2.5 -1.97058,-2.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient37541);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cssccssccssc"
- id="path36568"
- d="m 245.5,593.5 c 1.25,2.5 0.97056,4.5 0.97056,6.5 0,0.75 1,0.75 1,0 0,-2.5 0.0294,-4 -1.97056,-6.5 z m -5,0 c 2.75,1.25 2.97056,4.5 2.97056,6.5 0,0.75 1,0.75 1,0 0,-2.5 -0.72056,-5 -3.97056,-6.5 z m -1,4 c 1.97058,0 1.97058,1.5 1.97058,2.5 0,0.5 0,0.5 0,0 0,-1 0,-2.5 -1.97058,-2.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient37543);stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_UNLINKED"
- transform="translate(21,254)">
- <rect
- y="321"
- x="66"
- height="20"
- width="20"
- id="rect36572"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ececec;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-235,231)"
- id="g36574"
- style="display:inline;enable-background:new">
- <g
- transform="translate(392,-78.06282)"
- id="g36576"
- style="display:inline;enable-background:new">
- <g
- id="g36578">
- <g
- mask="url(#mask13041)"
- id="g36580"
- transform="translate(-360,181.06282)">
- <path
- mask="none"
- sodipodi:nodetypes="ccccccccccccsccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 279.46875,-12.53125 c -1.65264,0 -2.96875,1.066109 -2.96875,2.71875 V -7.25 c 0,1.6526411 1.31612,2.71875 2.96875,2.71875 h 0.0625 c 1.65264,0 2.96875,-1.0661089 2.96875,-2.71875 v -2.5625 c 0,-1.652641 -1.31612,-2.71875 -2.96875,-2.71875 z M 279.5,-10.5 c 0.554,0 1,0.196 1,0.75 v 2.5 c 0,0.554 -0.446,0.75 -1,0.75 -0.554,0 -1,-0.196 -1,-0.75 v -2.5 c 0,-0.554 0.446,-0.75 1,-0.75 z"
- id="path36582"
- inkscape:connector-curvature="0" />
- <rect
- y="-10"
- x="277"
- height="2.5"
- width="1"
- id="rect36584"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- ry="0.5" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect36586"
- width="1"
- height="1"
- x="277.49176"
- y="-11.287262"
- ry="0.5" />
- </g>
- <g
- mask="url(#mask13052)"
- transform="translate(-360,191.06282)"
- id="g36588">
- <path
- id="path36590"
- d="m 279.46875,-11.53125 c -1.65264,0 -2.96875,1.003609 -2.96875,2.65625 v 2.5625 c 0,1.6526411 1.34737,2.75 3,2.75 h 0.0625 c 1.65264,0 2.9375,-1.0973589 2.9375,-2.75 V -8.875 c 0,-1.652641 -1.31612,-2.65625 -2.96875,-2.65625 z M 279.5,-9.5 c 0.554,0 1,0.1335 1,0.6875 v 2.5 c 0,0.554 -0.41475,0.78125 -0.96875,0.78125 -0.554,0 -1.03125,-0.22725 -1.03125,-0.78125 v -2.5 c 0,-0.554 0.446,-0.6875 1,-0.6875 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccccccccsccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect36592"
- width="1"
- height="2.5"
- x="277"
- y="-10"
- ry="0.390625" />
- <rect
- y="-11"
- x="278"
- height="1"
- width="1"
- id="rect36594"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- ry="0.5" />
- </g>
- </g>
- <g
- id="g36596" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect36608"
- width="1"
- height="3"
- x="311"
- y="93" />
- <rect
- y="104"
- x="311"
- height="3"
- width="1"
- id="rect36610"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_LINKED"
- transform="translate(0,275)">
- <g
- transform="translate(-226,210)"
- id="g36614"
- style="display:inline;enable-background:new">
- <path
- id="path36616"
- d="m 302.5,105.52631 v -4"
- style="fill:none;stroke:#2d2d2d;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <g
- mask="url(#mask24466)"
- transform="translate(23,116.0625)"
- id="g36618">
- <path
- id="path36620"
- d="m 279.46875,-12.59375 c -1.65264,0 -2.96875,1.066109 -2.96875,2.71875 v 2.5625 c 0,1.6526411 1.31612,2.78125 2.96875,2.78125 h 0.0625 c 1.65264,0 2.96875,-1.1286089 2.96875,-2.78125 V -9.875 c 0,-1.652641 -1.31612,-2.71875 -2.96875,-2.71875 z m 0.0312,2.03125 c 0.554,0 1,0.196 1,0.75 v 2.5 c 0,0.554 -0.446,0.8125 -1,0.8125 -0.554,0 -1,-0.2585 -1,-0.8125 v -2.5 c 0,-0.554 0.446,-0.75 1,-0.75 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccccccccsccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect36622"
- width="1"
- height="3.5"
- x="277"
- y="-11.0625"
- ry="0.5" />
- <rect
- y="-12.0625"
- x="278"
- height="1"
- width="1"
- id="rect36624"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- ry="0.5" />
- </g>
- <g
- id="g36626"
- mask="url(#mask24456)"
- transform="translate(2e-6,-21.02385)">
- <path
- id="path36628"
- d="M 302.5,118.49506 V 114.5"
- style="fill:none;stroke:#2d2d2d;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(22.999998,128.02385)"
- id="g36630"
- mask="none">
- <path
- id="path36632"
- d="m 279.46875,-11.53125 c -1.65264,0 -2.96875,1.128609 -2.96875,2.78125 v 2.5 c 0,1.6526411 1.34737,2.75 3,2.75 h 0.0625 c 1.65264,0 2.9375,-1.0973589 2.9375,-2.75 v -2.5 c 0,-1.652641 -1.31612,-2.78125 -2.96875,-2.78125 z M 279.5,-9.5 c 0.554,0 1,0.2585 1,0.8125 V -6.25 c 0,0.554 -0.41475,0.78125 -0.96875,0.78125 -0.554,0 -1.03125,-0.22725 -1.03125,-0.78125 v -2.4375 c 0,-0.554 0.446,-0.8125 1,-0.8125 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccccccccsccc"
- mask="none"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect36634"
- width="1"
- height="3.5"
- x="277"
- y="-10"
- ry="0.5" />
- <rect
- y="-11"
- x="278"
- height="1"
- width="1"
- id="rect36636"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- </g>
- <g
- mask="none"
- id="g36638"
- transform="translate(22.999998,120)">
- <path
- mask="none"
- sodipodi:nodetypes="ccccccccccccsccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 279.46875,-11.53125 c -1.65264,0 -2.96875,1.128609 -2.96875,2.78125 v 2.5 c 0,1.6526411 1.34737,2.75 3,2.75 h 0.0625 c 1.65264,0 2.9375,-1.0973589 2.9375,-2.75 v -2.5 c 0,-1.652641 -1.31612,-2.78125 -2.96875,-2.78125 z M 279.5,-9.5 c 0.554,0 1,0.2585 1,0.8125 V -6.25 c 0,0.554 -0.41475,0.78125 -0.96875,0.78125 -0.554,0 -1.03125,-0.22725 -1.03125,-0.78125 v -2.4375 c 0,-0.554 0.446,-0.8125 1,-0.8125 z"
- id="path36640"
- inkscape:connector-curvature="0" />
- <rect
- y="-10"
- x="277"
- height="3.5"
- width="1"
- id="rect36642"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect36644"
- width="1"
- height="1"
- x="278"
- y="-11" />
- </g>
- <g
- id="g36646"
- mask="none"
- transform="translate(21.999998,-0.00494)">
- <path
- sodipodi:nodetypes="cc"
- id="path36648"
- d="m 280.5,118.5 v -4"
- style="opacity:0.55;fill:none;stroke:#1a1a1a;stroke-width:2.79440284;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path36650"
- d="m 280.5,118.5 v -4"
- style="fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- style="opacity:0.55;fill:none;stroke:#1a1a1a;stroke-width:2.79440284;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 302.5,105.52631 v -4"
- id="path36652"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 302.5,105.52631 v -4"
- id="path36654"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <rect
- y="99"
- x="302"
- height="1"
- width="1"
- id="rect36664"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- </g>
- <rect
- y="297"
- x="66"
- height="26"
- width="20"
- id="rect36666"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ececec;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate" />
- </g>
- <g
- transform="matrix(-1,0,0,1,530,548)"
- style="display:inline;opacity:0.9;enable-background:new"
- id="ICON_GHOST_ENABLED">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#aaccff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.4000001;marker:none;enable-background:accumulate"
- id="rect36670"
- width="16"
- height="16"
- x="488"
- y="29" />
- <g
- id="g36672">
- <path
- sodipodi:nodetypes="csccccccccsssc"
- id="path36674"
- d="m 500.5,34.5 v 5 c 0,1.666667 0.25,1.75 1,3.25 l -1.25,1.75 -1.75,-1.75 -1.75,1.75 h -0.5 l -1.75,-1.75 -1.75,1.75 h -1 C 491,43 490.5,42.416667 490.5,40.75 V 34.5 c 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37545);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- d="m 495.5,30.373047 c -2.28774,0 -4.12695,1.839211 -4.12695,4.126953 v 6.25 c 0,0.74605 0.0959,1.157156 0.27929,1.611328 0.13282,0.328869 0.39058,0.795597 0.63672,1.265625 h 0.0996 l 1.49414,-1.494141 a 0.87292083,0.87292083 0 0 1 1.23438,0 l 1.38281,1.382813 1.38281,-1.382813 a 0.87292083,0.87292083 0 0 1 1.19141,-0.03906 l 1.38672,1.210938 0.16601,-0.166016 v -0.449219 c -0.3818,-0.532877 -0.71885,-1.042237 -0.84961,-1.576172 C 499.6171,40.458958 499.62695,39.833334 499.62695,39 v -4.5 c 0,-2.287742 -1.83921,-4.126953 -4.12695,-4.126953 z"
- id="path36676"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient37547);stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:original="M 495.5 29.5 C 492.74 29.5 490.5 31.74 490.5 34.5 L 490.5 40.75 C 490.5 42.416667 491 43 491.75 44.5 L 492.75 44.5 L 494.5 42.75 L 496.25 44.5 L 496.75 44.5 L 498.5 42.75 L 500.5 44.5 L 501.5 43.5 L 501.5 42.5 C 500.5 41.25 500.5 40.666667 500.5 39 L 500.5 34.5 C 500.5 31.74 498.26 29.5 495.5 29.5 z "
- inkscape:radius="-0.87283355"
- sodipodi:type="inkscape:offset" />
- <g
- style="opacity:0.25;fill:#000000"
- id="g36678">
- <path
- sodipodi:nodetypes="cccc"
- style="fill:#000000;fill-rule:evenodd;stroke:none"
- d="m 493,43.75 c 0,-0.212963 0,-5.75 0,-5.75 l 1.5,4.472222 z"
- id="path36681"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path36683"
- d="m 497,44 c 0,-0.203703 -1,-6 -1,-6 l 2,3.428571 v 1.714286 z"
- style="fill:#000000;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(-1,0,0,1,990,0.25)"
- id="g36685"
- style="opacity:0.7;fill:#ffffff">
- <path
- sodipodi:nodetypes="ccccc"
- id="path36687"
- d="m 493,43.75 c 0,-0.212963 1,-6 1,-6 l 1,5 -1,1 z"
- style="fill:#ffffff;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:#ffffff;fill-rule:evenodd;stroke:none"
- d="m 497,43.75 c 0,-0.203703 0,-6 0,-6 l 2,5 -1,1 z"
- id="path36689"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- style="fill:#ffffff;fill-rule:evenodd;stroke:none"
- d="m 490,43.25 c 0,-0.212963 1.5,-6.25 1.5,-6.25 l 0.5,5.5 z"
- id="path36691"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 500.5,34.5 V 39 c 0,1.666667 0,2.25 1,3.5 v 1 l -1,1 -2,-1.75 -1.75,1.75 h -0.5 l -1.75,-1.75 -1.75,1.75 h -0.5 C 491,43 490.5,43.166667 490.5,41.5 v -7 c 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
- id="path36693"
- sodipodi:nodetypes="cscccccccccsssc"
- inkscape:connector-curvature="0" />
- <path
- id="path36695"
- d="m 56,139 v 1 h -1 v 1 h 2 v -2 z"
- style="display:inline;opacity:0.8;fill:url(#linearGradient37549);fill-opacity:1;fill-rule:evenodd;stroke:none;enable-background:new"
- sodipodi:nodetypes="ccccccc"
- transform="translate(441,-105)"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.8;fill:url(#linearGradient37551);fill-opacity:1;fill-rule:evenodd;stroke:none;enable-background:new"
- d="m 51,139 v 2 h 2 v -1 h -1 v -1 z"
- id="path36697"
- sodipodi:nodetypes="ccccccc"
- transform="translate(441,-105)"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(47,571)"
- id="ICON_HAND"
- style="display:inline;enable-background:new">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 67,7.75 V 15 h -1 l -1,-2 h -1 v 1 l 2,5 2,2 h 7 l 2,-3.25 v -4 L 76.5,13 H 76 v 1 H 75 V 12.75 L 74.25,12 H 73 v 2 h -1 v -2 l -1,-1 h -1 v 3 H 69 V 7.75 L 68.37057,7 h -0.727273 z"
- id="path36701"
- sodipodi:nodetypes="ccccccccccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- id="rect36703"
- width="16"
- height="16"
- x="63"
- y="6" />
- <path
- sodipodi:nodetypes="cccccccccccccccccccccccccccccc"
- id="path36705"
- d="M 67,7.75 V 15 h -1 v -1 l -1,-1 h -1 v 1 l 2,5 2,2 h 7 l 2,-3.25 v -4 L 76.5,13 H 76 v 1 H 75 V 12.75 L 74.25,12 H 73 v 2 h -1 v -2 l -1,-1 h -1 v 3 H 69 V 7.75 L 68.37057,7 h -0.727273 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37553);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37555);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;marker:none;enable-background:accumulate"
- d="m 69,17 v 3 h 1 v -3 z m 2,0 v 3 h 1 v -3 z m 2,0 v 3 h 1 v -3 z"
- id="path36707"
- inkscape:connector-curvature="0" />
- <rect
- y="15"
- x="66"
- height="1"
- width="1"
- id="rect36709"
- style="display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- id="rect36711"
- width="1"
- height="1"
- x="66"
- y="16" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient37557);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 74.09375,12.25 h -0.625 V 14 c 0.0031,0.12523 -0.04536,0.246239 -0.133933,0.334817 C 73.246239,14.423395 73.12523,14.4718 73,14.46875 L 72.5,14.5 m -1.65625,-3.25 h -0.375 V 14 c 0.0031,0.12523 -0.04536,0.246239 -0.133933,0.334817 C 70.246239,14.423395 70.12523,14.4718 70,14.46875 L 69.5,14.5 M 64.46875,13.46875 64.5,14 66.370938,18.629172 68.21875,20.53125 H 74.75 l 1.78125,-2.875 v -4 l -0.0625,-0.125 V 14 c 0.0031,0.12523 -0.04536,0.246239 -0.133933,0.334817 C 76.246239,14.423395 76.12523,14.4718 76,14.46875 L 75.5,14.5 M 68.1875,7.46875 H 67.875 L 67.5,8 v 7"
- id="path36713"
- sodipodi:nodetypes="cccscccccscccccccccccscccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:url(#radialGradient37559);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;marker:none;enable-background:accumulate"
- d="m 66,15 v -1 l -1,-1 h -1 v 1 l 2,5 z"
- id="path36715"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_RENDER_REGION"
- transform="translate(-21,254)">
- <rect
- ry="0"
- rx="0"
- y="323"
- x="257"
- height="16"
- width="16"
- id="rect36884"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffaaaa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- id="g36886"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffd42a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="translate(21,69)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36888"
- width="1"
- height="2"
- x="236"
- y="262" />
- <rect
- y="-239.00793"
- x="260"
- height="2.0079346"
- width="1"
- id="rect36890"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="rotate(90)" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36892"
- width="1"
- height="2"
- x="236"
- y="266" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36894"
- width="2"
- height="1"
- x="236.99207"
- y="269" />
- <rect
- transform="rotate(90)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36896"
- width="1"
- height="1.9920638"
- x="269"
- y="-242.99207" />
- <rect
- transform="rotate(90)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36898"
- width="1"
- height="1.9920638"
- x="269"
- y="-246.99207" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36900"
- width="1"
- height="2"
- x="246.99207"
- y="266" />
- </g>
- <g
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="g36902">
- <rect
- transform="scale(1,-1)"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36904"
- width="1"
- height="2"
- x="257"
- y="-331" />
- <rect
- transform="scale(1,-1)"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36906"
- width="1"
- height="2"
- x="257"
- y="-335" />
- <rect
- transform="scale(1,-1)"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36908"
- width="1"
- height="2"
- x="257"
- y="-339" />
- <rect
- transform="matrix(0,1,1,0,0,0)"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36910"
- width="1"
- height="2.0079362"
- x="338"
- y="259.99207" />
- <rect
- transform="matrix(0,1,1,0,0,0)"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36912"
- width="1"
- height="2.0079362"
- x="338"
- y="263.99207" />
- <rect
- y="-339"
- x="267.99207"
- height="2"
- width="1"
- id="rect36914"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="scale(1,-1)" />
- </g>
- <rect
- y="330"
- x="258"
- height="8"
- width="10"
- id="rect36916"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- id="g36918"
- transform="translate(-205,313.97063)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37571);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36920"
- width="12"
- height="10"
- x="465.5"
- y="10.5"
- ry="1.5909902"
- rx="1.5909902" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37573);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 465,13.40909 v 4.59375 c 0,0.56244 0.36784,0.99717 0.84375,0.99716 l 11.3125,0.01065 c 0.47591,0 0.84375,-0.43471 0.84375,-0.99716 v -4.59375 c -0.31371,0.37073 -0.76923,0.59091 -1.25,0.59091 L 466.25,14 c -0.48077,0 -0.93629,-0.22018 -1.25,-0.59091 z"
- id="path36922"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- <rect
- ry="0.98531502"
- y="10.52937"
- x="465.5"
- height="1.9999996"
- width="12"
- id="rect36924"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- rx="1.4762714" />
- <rect
- ry="1.3782184"
- y="10.5"
- x="465.5"
- height="10"
- width="12"
- id="rect36926"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- rx="1.3782184" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:none;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect36928"
- width="9.9998779"
- height="7.999999"
- x="466.5"
- y="11.5"
- ry="0.44196323"
- rx="0.39062494" />
- <g
- transform="matrix(0.7547901,0,0,1,414.01868,-484.99999)"
- id="g36930">
- <ellipse
- transform="matrix(0.7834486,0,0,0.2000006,10.413535,395.5997)"
- id="path36932"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#999999;stroke-width:2.90780973;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.92082453;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 69.531013,495.51105 v -0.50001 c 0,-0.276 0.890314,-0.5 1.987308,-0.5 1.096993,0 1.987307,0.224 1.987307,0.5 v 0.50001"
- id="path36934"
- sodipodi:nodetypes="csccc"
- inkscape:connector-curvature="0" />
- <rect
- y="495.01105"
- x="70.193451"
- height="1"
- width="2.6497409"
- id="rect36936"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="g36938"
- transform="matrix(1,0,0,0.6666667,331,-319.00002)">
- <rect
- y="496.5"
- x="143"
- height="1.5"
- width="2"
- id="rect36940"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient37575);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- id="rect36942"
- width="2"
- height="1.5"
- x="143"
- y="496.5" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- id="rect36944"
- width="1"
- height="1"
- x="468"
- y="13" />
- <g
- transform="translate(1.1408497e-7,0.5000446)"
- id="g36946">
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.89240623;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path36948"
- transform="matrix(1.187982,0,0,1.0569758,379.83032,-513.21497)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(1.3827154,0,0,1.4028327,364.1482,-688.72206)"
- id="path36950"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:none;stroke:#000000;stroke-width:0.71801031;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient37578);stroke-width:1.11641002;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path36952"
- transform="matrix(0.987526,0,0,0.8124641,394.9733,-392.80617)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(0.9848328,0,0,0.9992585,395.19018,-485.12778)"
- id="path36954"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:0.80643582;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient37580);stroke-width:1.69505489;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path36956"
- transform="matrix(0.591154,0,0,0.5887513,425.87219,-279.05319)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#radialGradient37582);stroke-width:0.80110824;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path36958"
- transform="matrix(0.9913883,0,0,1.0058976,394.67318,-488.46061)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(0.6941559,0,0,0.6920597,417.67198,-331.15708)"
- id="path36960"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#radialGradient37584);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path36962"
- transform="matrix(0.1975308,0,0,0.1999991,456.0926,-84.399595)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#radialGradient37586);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path36964"
- transform="matrix(-0.6760501,-0.1575078,0.1570322,-0.6740085,446.07727,367.34791)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- </g>
- <path
- sodipodi:nodetypes="cc"
- id="path36966"
- d="M 476.49997,11.941967 V 19.11607"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.05;fill:none;stroke:#ffffff;stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 258,330 v 8 h 1 v -7 h 1 v -1 z"
- id="path36968"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_BORDER_LASSO">
- <g
- id="g16722">
- <g
- style="display:inline;enable-background:new"
- id="g36970"
- transform="translate(62.999998,254)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect36972"
- width="16"
- height="16"
- x="215"
- y="-339"
- transform="scale(1,-1)" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 220,324 v 1 h -2 v 2 h -1 v 2 h -1 v 6 h 1 v 2 h 1 2 v -1 h 1 v -2 h 1 v -2 h 1 v -1 h 1 3 v -1 h 1 1 v -4 h -1 v -1 h -1 v -1 h -3 -1 -1 -1 z"
- id="path36974"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <g
- id="g37010"
- style="fill:#321900">
- <rect
- transform="scale(1,-1)"
- y="-324"
- x="223"
- height="1"
- width="2"
- id="rect37012"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- transform="scale(1,-1)"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37014"
- width="2"
- height="1"
- x="219"
- y="-325" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37016"
- width="1"
- height="1"
- x="324"
- y="227"
- transform="matrix(0,1,1,0,0,0)" />
- <rect
- y="226"
- x="323"
- height="1"
- width="1"
- id="rect37018"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="matrix(0,1,1,0,0,0)" />
- <rect
- y="229"
- x="328"
- height="1"
- width="1"
- id="rect37020"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="matrix(0,1,1,0,0,0)" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37022"
- width="1"
- height="2"
- x="216"
- y="-329"
- transform="scale(1,-1)" />
- <rect
- transform="scale(1,-1)"
- y="-337"
- x="216"
- height="2"
- width="1"
- id="rect37024"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37026"
- width="1"
- height="1"
- x="220"
- y="-337"
- transform="scale(1,-1)" />
- <rect
- transform="scale(1,-1)"
- y="-338"
- x="219"
- height="1"
- width="1"
- id="rect37028"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37030"
- width="1"
- height="1"
- x="221"
- y="-334"
- transform="scale(1,-1)" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37032"
- width="1"
- height="2"
- x="215"
- y="-333"
- transform="scale(1,-1)" />
- <rect
- transform="matrix(0,1,1,0,0,0)"
- y="228"
- x="325"
- height="1"
- width="1"
- id="rect37034"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- transform="matrix(0,1,1,0,0,0)"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37036"
- width="1"
- height="1"
- x="329"
- y="228" />
- <rect
- transform="scale(1,-1)"
- y="-333"
- x="222"
- height="1"
- width="1"
- id="rect37038"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="g37040"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffd42a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate">
- <rect
- transform="scale(1,-1)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37042"
- width="2"
- height="1"
- x="221"
- y="-324" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37044"
- width="1"
- height="2"
- x="323"
- y="225"
- transform="matrix(0,1,1,0,0,0)" />
- <rect
- transform="matrix(0,1,1,0,0,0)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37046"
- width="1"
- height="1"
- x="329"
- y="227" />
- <rect
- transform="scale(1,-1)"
- y="-331"
- x="215"
- height="2"
- width="1"
- id="rect37048"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37050"
- width="1"
- height="2"
- x="215"
- y="-335"
- transform="scale(1,-1)" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37052"
- width="2"
- height="1"
- x="217"
- y="-338"
- transform="scale(1,-1)" />
- <rect
- transform="scale(1,-1)"
- y="-336"
- x="221"
- height="2"
- width="1"
- id="rect37054"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="-332"
- x="222"
- height="1"
- width="1"
- id="rect37056"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="scale(1,-1)" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37058"
- width="1"
- height="1"
- x="217"
- y="-327"
- transform="scale(1,-1)" />
- <rect
- transform="scale(1,-1)"
- y="-326"
- x="218"
- height="1"
- width="1"
- id="rect37060"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- transform="matrix(0,1,1,0,0,0)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37062"
- width="2"
- height="1"
- x="326"
- y="229" />
- <rect
- transform="scale(1,-1)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37064"
- width="1"
- height="1"
- x="223"
- y="-331" />
- </g>
- <path
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccc"
- id="path37066"
- d="m 220.9438,324.0562 v 1 h 6 v -1 z m 6,1 v 1 h 1 v -1 z m 1,1 v 1 h 1 v -1 z m -7,-1 h -2 v 1 h 2 z m -2,1 h -1 v 1 h 1 z m -1,1 h -1 v 2 h 1 z m -1,2 h -1 v 6 h 1 z m 0,5.75 v 2.25 h 1 v -2 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient106628);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 287.75,590.75 1.75,-1.5 1.99177,3.7253 1.75,-1 L 291.5,588.5 h 2.5 l -6.25,-6.25 z"
- id="path45378-1-5-6-2"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 288.34375,583.75 v 5.75"
- id="path17845-9-1"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- </g>
- <path
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0"
- id="path17835-7-2"
- d="m 287.54419,581.36742 7,7.25 h -3 l 1.69346,3.25845 -1.75,1 -1.69346,-3.50845 -2.25,2.25 z"
- style="fill:none;stroke:#000000;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- <g
- style="display:inline;opacity:0.96000001;enable-background:new"
- id="ICON_FREEZE"
- transform="translate(126,86)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.20000005;marker:none;enable-background:accumulate"
- id="rect37070"
- width="16"
- height="16"
- x="173"
- y="491" />
- <g
- id="g37072">
- <g
- style="stroke:#1a1a1a;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none"
- id="g37074"
- transform="translate(-63.000001,168)">
- <g
- style="stroke:#1a1a1a;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none"
- id="g37076">
- <path
- style="fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 243.5,336.5 v -12"
- id="path37078"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 240.5,325.5 3,3 3,-3"
- id="path37080"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path37082"
- d="m 240.5,335.5 3,-3 3,3"
- style="fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="stroke:#1a1a1a;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none"
- transform="rotate(90,243.5,330.5)"
- id="g37084">
- <path
- sodipodi:nodetypes="cc"
- id="path37086"
- d="m 243.5,336.5 v -12"
- style="fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path37088"
- d="m 240.5,325.5 3,3 3,-3"
- style="fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 240.5,335.5 3,-3 3,3"
- id="path37090"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g37092"
- style="stroke:#c8c8c8;stroke-opacity:1">
- <g
- id="g37094"
- style="stroke:#c8c8c8;stroke-opacity:1">
- <g
- style="stroke:#c8c8c8;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="g37096"
- transform="translate(-63.000001,168)">
- <path
- style="fill:none;stroke:#c8c8c8;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 243.5,336.5 v -12"
- id="path37098"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#c8c8c8;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 240.5,325.5 3,3 3,-3"
- id="path37100"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path37102"
- d="m 240.5,335.5 3,-3 3,3"
- style="fill:none;stroke:#c8c8c8;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="stroke:#c8c8c8;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- transform="rotate(90,128,383)"
- id="g37104">
- <path
- sodipodi:nodetypes="cc"
- id="path37106"
- d="m 243.5,336.5 v -12"
- style="fill:none;stroke:#c8c8c8;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path37108"
- d="m 240.5,325.5 3,3 3,-3"
- style="fill:none;stroke:#c8c8c8;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#c8c8c8;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 240.5,335.5 3,-3 3,3"
- id="path37110"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <circle
- transform="matrix(0.625,0,0,0.625,15.1875,291.9375)"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#c8c8c8;stroke-width:2.4000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path37112"
- cx="264.5"
- cy="330.5"
- r="2" />
- </g>
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 175.75,495.75 175.5,495.5"
- id="path37114"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- id="path37116"
- d="m 177.5,493.5 0.25,0.25"
- style="fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 180.5,492.25 v 2.5"
- id="path37118"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 177,500 -1.75,1.75"
- id="path37120"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path37122"
- d="m 174.25,498.5 h 2.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path37124"
- d="m 179.75,501.25 -2.5,2.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 185.75,495.25 -2.5,2.5"
- id="path37126"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path37128"
- d="M 183.75,493.25 182,495"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <circle
- id="path37130"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient37588);stroke-width:2.4000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(0.625,0,0,0.625,15.1875,291.9375)"
- cx="264.5"
- cy="330.5"
- r="2" />
- <path
- sodipodi:nodetypes="cc"
- id="path37132"
- d="m 182.5,502.5 v 0"
- style="fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 184.5,500.5 v 0"
- id="path37134"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 185.5,498.5 h 1.25"
- id="path37136"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
+ <g inkscape:groupmode="layer" id="layer8" inkscape:label="2.8" style="display:inline">
+ <g id="g10975" transform="translate(-378.00707,-293.99994)" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g id="g10009" transform="translate(5.3904633e-4,-20.999933)" style="display:inline;opacity:1;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g transform="translate(-380,231)" style="display:inline;opacity:1;enable-background:new" id="g12153" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;opacity:1;enable-background:new" transform="translate(-336.00001,210.00001)" id="g12215" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" id="g12492" transform="translate(20.999999)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g id="g12457" transform="matrix(0.69230791,0,0,0.69230793,-403.07713,196.14887)" style="display:inline;opacity:1;stroke-width:1.44444394;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" id="g12921" transform="translate(21.999999,-3)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;opacity:0.41300001;enable-background:new" id="g5202-0" transform="translate(496.99495,-311.99288)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" id="g13534" transform="translate(-9.5367432e-7,21)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;opacity:1;enable-background:new" id="g13838" transform="rotate(90,160.07935,395.5873)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g13835" transform="matrix(0,1,1,0,205.49208,-205.33334)"/>
+ </g>
+ <g style="display:inline;opacity:0.98999999;enable-background:new" id="g6922" transform="translate(-378.0172,105)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <circle r="0" cy="162.5" cx="415.5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="ellipse13645"/>
+ </g>
+ <g style="display:inline;stroke-width:1.15384614;enable-background:new" id="g14341" transform="translate(-441.00001,525.00001)"/>
+ <g style="display:inline;fill:#ffffff;enable-background:new" id="g14199" transform="translate(-9.5367432e-7,20)"/>
+ <g style="display:inline;stroke:#666666;enable-background:new" id="g14215" inkscape:transform-center-x="-1.2499" inkscape:transform-center-y="9.9999999e-006" transform="matrix(0,-1,-1,0,723.9999,577.00011)"/>
+ <g style="display:inline;enable-background:new" id="g14644" transform="translate(-9.5367432e-7,30)"/>
+ <circle transform="scale(-1)" cy="-286.5" cx="-353.50003" id="ellipse14264" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" r="0"/>
+ <g style="display:inline;enable-background:new" id="g13212" transform="rotate(-180,454.00583,490.49795)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g transform="translate(-105,22)" id="g13043" style="display:inline;opacity:0.4;enable-background:new">
+ <g id="g13161"/>
+ </g>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="circle21483" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" r="4" cy="335.5" cx="493.5" d="" inkscape:connector-curvature="0"/>
+ <circle r="0" cx="456.5" cy="420.50391" id="ellipse20722" style="display:inline;opacity:0.1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <g style="display:inline;enable-background:new" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" transform="translate(71.999999)" id="g22120"/>
+ <path cx="306.99524" cy="291.97034" r="4.4703369" style="display:inline;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path24502" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" d="" inkscape:connector-curvature="0"/>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:1;fill:#ffffff;stroke-width:1.15384436;enable-background:new" id="g22419" transform="matrix(-0.866668,0,0,0.866668,728.467,163.39943)"/>
+ <g style="display:inline;stroke:#666666;enable-background:new" id="g22765" transform="translate(29.999999)"/>
+ <g style="display:inline;enable-background:new" transform="translate(46.999999,3)" id="g23484"/>
+ <g style="display:inline;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g22604" transform="translate(420,147)">
+ <g style="display:inline;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="matrix(0,-1,-1,0,688.99474,-44.97944)" id="g22557"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22477" transform="rotate(180,475,353.5)"/>
+ <g style="display:inline;enable-background:new" transform="translate(2.9786369,-3.978636)" id="g22894"/>
+ <g transform="matrix(-1,0,0,1,761,0)" id="g23294" style="display:inline;enable-background:new"/>
+ <g style="display:inline;enable-background:new" transform="rotate(90,681.00003,3.9999745)" id="g23519"/>
+ <g id="g23547" style="display:inline;opacity:1;enable-background:new" transform="matrix(-1,0,0,1,985.8323,-544.99999)"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 342.5,159 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 12 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 12 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -12 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 6,3 c 1.92707,0 3.5,1.57293 3.5,3.5 0,1.92707 -1.57293,3.5 -3.5,3.5 -1.92707,0 -3.5,-1.57293 -3.5,-3.5 0,-1.92707 1.57293,-3.5 3.5,-3.5 z" id="rect13348" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cscc" id="path13146" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 91.507377,483.0012 c 0,-2.142 1.888178,-3.5012 4.242623,-3.5012 h 1.75 4" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g transform="matrix(0.866668,0,0,0.866668,-9.466992,121.39943)" id="g16793" style="display:inline;opacity:1;fill:#ffffff;stroke-width:1.15384436;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g16791" style="fill:#ffffff;stroke-width:1.15384436">
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 202,494 c -3.86008,0 -7,3.13992 -7,7 0,3.86008 3.13992,7 7,7 3.86008,0 7,-3.13992 7,-7 0,-3.86008 -3.13992,-7 -7,-7 z m 0,1 c 3.3058,0 5.97583,2.65852 5.99805,5.95898 C 206.88654,501.90262 204.99536,503 202,503 v 4 c -3.31963,0 -6,-2.68037 -6,-6 0,-0.0145 0.002,-0.0285 0.002,-0.043 1.1112,0.94401 3.00099,2.043 5.998,2.043 z" transform="matrix(1.1538444,0,0,1.1538444,10.923433,-140.07605)" id="path16787" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g transform="translate(-63.000002,-213)" id="g17231" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none" d="m 204.5,643.5 c -2.20914,0 -4,1.79086 -4,4 h -0.18359 c -0.41313,-1.1628 -1.51189,-2 -2.81641,-2 -1.65685,0 -3,1.34315 -3,3 0,1.65686 1.34315,3 3,3 h 7 c 2.20914,0 4,-1.79086 4,-4 0,-2.20914 -1.79086,-4 -4,-4 z" id="path17221" inkscape:connector-curvature="0"/>
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none" d="m 245.5,452.5 c -2.20914,0 -4,1.79086 -4,4 0,0.17117 0.0299,0.33449 0.0508,0.5 h -0.10156 c -0.23887,-1.41787 -1.46342,-2.5 -2.94922,-2.5 -1.65685,0 -3,1.34315 -3,3 0,1.65686 1.34315,3 3,3 h 7 c 2.20914,0 4,-1.79086 4,-4 0,-2.20914 -1.79086,-4 -4,-4 z m 0,2.5 c 0.82251,0 1.5,0.67749 1.5,1.5 0,0.82251 -0.67749,1.5 -1.5,1.5 -0.82251,0 -1.5,-0.67749 -1.5,-1.5 0,-0.82251 0.67749,-1.5 1.5,-1.5 z m -7,1 c 0.82251,0 1.5,0.67749 1.5,1.5 0,0.82251 -0.67749,1.5 -1.5,1.5 -0.82251,0 -1.5,-0.67749 -1.5,-1.5 0,-0.82251 0.67749,-1.5 1.5,-1.5 z m 7,0 c -0.28208,0 -0.5,0.21794 -0.5,0.5 0,0.28206 0.21792,0.5 0.5,0.5 0.28208,0 0.5,-0.21794 0.5,-0.5 0,-0.28206 -0.21792,-0.5 -0.5,-0.5 z m -7,1 c -0.28208,0 -0.5,0.21794 -0.5,0.5 0,0.28206 0.21792,0.5 0.5,0.5 0.28208,0 0.5,-0.21794 0.5,-0.5 0,-0.28206 -0.21792,-0.5 -0.5,-0.5 z" id="path17225" inkscape:connector-curvature="0" transform="translate(-41,191)"/>
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccccccc" id="path17227" d="m 204.5,653.50001 h -6 v -10e-6 1 1 0 1 l 1,1 5,10e-6 v -1 l 4,-10e-6 v 0.5 0.5 -4 0.5 0.5 h -4 z" style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 196.5,653.5 v 2 -1 h 3" id="path17229" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g12881" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect ry="0" rx="0" y="219.99644" x="194.00006" height="16" width="16" id="rect17268" style="display:inline;opacity:0.01000001;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <g id="g12870" transform="translate(1)">
+ <g style="stroke-width:1.06509161" transform="matrix(0.93888872,0,0,0.93888398,-67.06384,-339.47711)" id="g17272">
+ <path inkscape:connector-curvature="0" id="path17270" d="m 291.37332,605.48175 a 5.8597304,5.8580186 0 0 1 -5.85973,5.85802 5.8597304,5.8580186 0 0 1 -5.85973,-5.85802 5.8597304,5.8580186 0 0 1 5.85973,-5.85802 5.8597304,5.8580186 0 0 1 5.85973,5.85802 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.06509161;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ </g>
+ <path inkscape:transform-center-y="-0.52988699" id="path17274" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 200.50001,225.50356 v 4" sodipodi:nodetypes="cc" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" sodipodi:nodetypes="cc" d="m 203.50001,229.50356 h -3" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" id="path17276" inkscape:transform-center-x="-0.4050322"/>
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" sodipodi:nodetypes="cc" d="m 200.50001,221.50356 v 2" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" id="path17278" inkscape:transform-center-y="-0.52988699"/>
+ <path inkscape:transform-center-x="-0.52989" inkscape:transform-center-y="3.01e-006" id="path17280" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 202.50001,221.50356 h -4" sodipodi:nodetypes="cc" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path17282" d="m 205.75001,225.25356 1.75,-1.75" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"/>
+ </g>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" id="g17303" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" id="path17287" d="m 413.5,478.5 c -1,0 -2,10e-6 -3,2e-5 0,0.99999 0,1.99999 0,2.99998 1,0 2,-10e-6 3,-2e-5 0,-0.99999 0,-1.99998 0,-2.99998 z" style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;enable-background:new"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;enable-background:new" d="m 413.5,483.5 c -1,0 -2,10e-6 -3,10e-6 0,1 0,2 0,2.99999 1,-10e-6 2,-10e-6 3,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z" id="path17289"/>
+ <path inkscape:connector-curvature="0" id="path17291" d="m 408.50031,476.50818 c -1,0 -2,1e-5 -3,1e-5 0,1 0,2 0,2.99999 1,-10e-6 2,-10e-6 3,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z" style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;enable-background:new"/>
+ <path inkscape:connector-curvature="0" id="path17293" d="m 408.50031,481.50818 c -1,0 -2,1e-5 -3,1e-5 0,1 0,2 0,2.99999 1,-10e-6 2,-10e-6 3,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z" style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;enable-background:new"/>
+ <g id="g17301" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;enable-background:new" transform="translate(-41.99969,86.00818)">
+ <path inkscape:connector-curvature="0" style="vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1" d="m 460.50726,390.48364 c -1.00252,0 -2.00505,1e-5 -3.00757,1e-5 0,1.00272 0,2.00544 0,3.00817 1.00252,0 2.00505,-1e-5 3.00757,-1e-5 0,-1.00273 0,-2.00545 0,-3.00817 z" id="path17295"/>
+ <path inkscape:connector-curvature="0" id="path17297" d="m 460.51514,395.48364 c -1.00252,0 -2.00505,1e-5 -3.00757,1e-5 0,1.00272 0,2.00544 0,3.00817 1.00252,0 2.00505,-1e-5 3.00757,-1e-5 0,-1.00273 0,-2.00545 0,-3.00817 z" style="vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"/>
+ <path inkscape:connector-curvature="0" id="path17299" d="m 455.5,387.5 c -1.00252,0 -2.00505,10e-6 -3.00757,10e-6 0,1.00272 0,2.00544 0,3.00817 1.00252,0 2.00505,-10e-6 3.00757,-10e-6 0,-1.00273 0,-2.00545 0,-3.00817 z" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"/>
+ </g>
+ </g>
+ <g transform="translate(-189,-21.999995)" id="g17353" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="csc" inkscape:connector-curvature="0" id="path17349" d="m 352.5,415.75 c -0.75,0.5 -2.16536,0.75 -3.5,0.75 -1.33792,0 -2.75,-0.25 -3.5,-0.75" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <path sodipodi:nodetypes="sscssscss" inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 349,411.5 c -3.03757,0 -5.5,1.11929 -5.5,2.5 v 3 5 c 0,1.38071 2.46243,2.5 5.5,2.5 3.03757,0 5.5,-1.11929 5.5,-2.5 v -5 -3 c 0,-1.38071 -2.46243,-2.5 -5.5,-2.5 z" id="path17351"/>
+ </g>
+ <g transform="translate(-210,-20.999995)" id="g17359" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" style="display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 391.00002,411.5 c -4.19462,0 -7.50001,2.464 -7.5,5.5 0,3.036 3.30538,5.5 7.5,5.5 4.19462,0 7.49999,-2.464 7.49999,-5.5 0,-3.036 -3.30536,-5.50001 -7.49999,-5.5 z" id="path17355" sodipodi:nodetypes="csssc"/>
+ <path sodipodi:nodetypes="cscccc" id="path17357" d="m 388.5,416 v 0 l 5.4e-4,0.25049 c 0,0.31237 0.71533,1.24451 2.49946,1.24951 1.7853,0.005 2.49944,-0.93714 2.49944,-1.24951 L 393.5,416" style="display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ <path sodipodi:nodetypes="ccsssccc" inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 201.5,389.5 -5.75,8.49999 c -0.17024,0.31279 -0.25,0.65756 -0.25,1 0,1.933 2.91017,3.5 6.5,3.5 3.58983,0 6.5,-1.567 6.5,-3.5 0,-0.34545 -0.0768,-0.68479 -0.25,-1 L 202.5,389.5 Z" id="path17361" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g transform="matrix(0.80859371,0,0,0.80859384,242.86326,76.328097)" id="g17385" style="display:inline;opacity:1;stroke-width:1.23671496;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;stroke:none;stroke-width:3.71014476;marker:none;enable-background:accumulate" id="rect17374" width="16" height="16" x="-162.99998" y="388"/>
+ <rect y="387.30435" x="-162.49998" height="16.195654" width="16.118361" id="rect17377" style="display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.23671496;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"/>
+ <g style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.98937196;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="g17383" transform="translate(-399,-210)">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.98937196;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 247.67152,599.77778 v 11.13043 m -6.18358,0 v -11.13043" id="path17379" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <path transform="rotate(90)" style="display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.98937196;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 602.25121,-239.01451 v -11.13044 m 6.18357,0 v 11.13044" id="path17381" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ </g>
+ </g>
+ <g transform="translate(167.99999,4.4999696e-6)" id="g17404" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;stroke:none;stroke-width:3;marker:none;enable-background:accumulate" id="rect17388" width="16" height="16" x="-78.999992" y="388"/>
+ <path sodipodi:nodetypes="ccccccccc" inkscape:connector-curvature="0" id="path17390" d="m -65.5,392.5 -5.49999,-3 h -1 l -5.50001,3 v 6.99999 l 5.50001,3.00001 h 1 L -65.5,399.49999 Z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" mask="none"/>
+ <g id="g17402" style="display:inline;opacity:1;enable-background:new" transform="translate(-399,-189)">
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 323.5,581.5 h 8" id="path17392" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="cc" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 325.5,587.5 4,-5" id="path17394" inkscape:connector-curvature="0"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 322.5,583.5 3,4" id="path17396" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 329.5,582.5 3,4" id="path17398" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path17400" d="m 323.5,588.5 h 8" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ </g>
+ </g>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 61.500088,396.00009 a 6.5000907,6.5000907 0 0 1 -6.50009,6.50009 6.5000907,6.5000907 0 0 1 -6.50009,-6.50009 6.5000907,6.5000907 0 0 1 6.50009,-6.50009 6.5000907,6.5000907 0 0 1 6.50009,6.50009 z" id="path17412" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g transform="matrix(0.875,0,0,0.875,-192.625,31.125059)" id="g17428" style="display:inline;opacity:1;stroke-width:1.14285719;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect y="408.99994" x="299" height="16" width="16" id="rect17416" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;stroke:none;stroke-width:3.42857146;marker:none;enable-background:accumulate"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.14285719;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 314.5,416.99995 c 0,4.14214 -3.35786,7.5 -7.5,7.5 -4.14214,0 -7.5,-3.35786 -7.5,-7.5 0,-4.14214 3.35786,-7.5 7.5,-7.5 4.14214,0 7.5,3.35786 7.5,7.5 z" id="path17418" inkscape:connector-curvature="0" sodipodi:nodetypes="sssss"/>
+ <g id="g17426" style="opacity:1;stroke-width:1.14285719">
+ <path mask="none" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.91428572;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 312.14286,417.57137 c -1,0.5 -2.28572,1.14285 -5.14286,1.14208" id="path17420" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="csc" inkscape:connector-curvature="0" id="path17422" d="m 306.42857,422.42851 c -0.94579,-1.5 -1.14285,-3.21405 -1.14285,-5.42857 0,-2.27448 0.20415,-3.92857 1.14285,-5.42857" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.91428572;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:transform-center-x="1.2189004" inkscape:transform-center-y="0.022097087"/>
+ <path sodipodi:nodetypes="csc" inkscape:connector-curvature="0" id="path17424" d="m 307,418.71422 h -1.71429 c -1.71428,10e-6 -3.0754,-0.50563 -4.55843,-2" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.91428572;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" mask="none"/>
+ </g>
+ </g>
+ <rect y="389.5" x="6.4999981" height="13.000062" width="13.000062" id="rect17430" style="display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;opacity:1;enable-background:new" id="g17438" transform="translate(-189,-41.999995)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect y="451" x="215" height="16" width="16" id="rect17432" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"/>
+ <path sodipodi:nodetypes="ccccccccccccccc" inkscape:connector-curvature="0" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 216.5,452.5 v 3 h 3 v -3 z m 10,0 v 3 h 3 v -3 z m -5,10 v 3 h 3 v -3 z" id="path17434"/>
+ <path sodipodi:nodetypes="cccccc" inkscape:connector-curvature="0" id="path17436" d="m 219.5,453.5 h 7 m 1.75,2 -3.75,7 m -3,0 -3.75,-7" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" mask="none"/>
+ </g>
+ <path style="display:inline;opacity:0.7;fill:#ffffff;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;enable-background:new" d="m 139,410.5 a 6.5,6.5 0 0 0 -1.5,0.18359 V 413.5 l 2.85547,-2.85547 A 6.5,6.5 0 0 0 139,410.5 Z m 3.48047,1.01953 L 140.5,413.5 h 3.97461 a 6.5,6.5 0 0 0 -1.99414,-1.98047 z m -6.98047,0.006 a 6.5,6.5 0 0 0 -1.98047,1.99414 L 135.5,415.5 Z m 7,3.97461 2.85547,2.85547 A 6.5,6.5 0 0 0 145.5,417 a 6.5,6.5 0 0 0 -0.18359,-1.5 z m -9.85547,0.14453 A 6.5,6.5 0 0 0 132.5,417 a 6.5,6.5 0 0 0 0.18359,1.5 H 135.5 Z M 142.5,418.5 v 3.97461 a 6.5,6.5 0 0 0 1.98047,-1.99414 z m -8.97461,2 a 6.5,6.5 0 0 0 1.99414,1.98047 L 137.5,420.5 Z m 6.97461,0 -2.85547,2.85547 A 6.5,6.5 0 0 0 139,423.5 a 6.5,6.5 0 0 0 1.5,-0.18359 z" id="path17450" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g id="g17481" style="display:inline;opacity:1;enable-background:new" transform="translate(-332.00634,585.99911)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g style="opacity:0.7;stroke-width:1.1535517" transform="matrix(0.86707513,0,0,0.86670066,799.68613,161.07329)" id="g17477">
+ <path inkscape:connector-curvature="0" id="path17465" d="m -40.000004,-179.49979 c -1.14959,-0.57669 -2.879544,-3.35735 -2.879544,-7.49949 0,-4.14214 1.729954,-6.83651 2.879544,-7.50051" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.1535517;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="csc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.1535517;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m -46.337937,-189.88372 h 13" id="path17467" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path17469" d="m -46.337937,-184.11485 6.918296,7e-5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.1535517;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" sodipodi:nodetypes="cc"/>
+ <path cx="-40.000011" cy="-186.99979" r="7.5" id="path17471" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.1535517;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="" inkscape:connector-curvature="0"/>
+ <path id="path17473" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.1535517;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" sodipodi:type="arc" sodipodi:cx="-40.000011" sodipodi:cy="-186.99979" sodipodi:rx="7.5" sodipodi:ry="7.5" sodipodi:start="1.2824435" sodipodi:end="0.2952474" sodipodi:open="true" d="m -37.867211,-179.80943 a 7.5,7.5 0 0 1 -8.584234,-3.36557 7.5,7.5 0 0 1 1.166446,-9.14634 7.5,7.5 0 0 1 9.154164,-1.10336 7.5,7.5 0 0 1 3.3063,8.60724"/>
+ <path sodipodi:nodetypes="cc" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.1535517;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m -37.113035,-186.42238 c 0,-4.14214 -1.729954,-7.49971 -2.879342,-8.07741" id="path17475" inkscape:connector-curvature="0"/>
+ </g>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path17479" d="M 772.5,3.50021 770.00634,4.00089 769.5,6.50021 767.5,1.5002065 Z" style="display:inline;fill:#ffffff;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;enable-background:new"/>
+ </g>
+ <g transform="translate(41.999988,1.0000045)" id="g10697" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="path10693" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="M 34.5,56.5 31,60 c -1.5,1.5 0.5,3.5 2,2 l 4.5,-4.5 c 1.30409,-1.304091 1.289286,-3.273423 0.253237,-4.257875 C 36.749268,52.288158 34.86135,52.138648 33.5,53.5 l -5,5 c -1.428184,1.428184 -1.25,4.25 0.25,5.75 1.5,1.5 4.299939,1.700061 5.75,0.25 l 6,-6" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccscc"/>
+ <rect style="opacity:0;vector-effect:none;fill:none;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect10695" width="16" height="16" x="26" y="52" rx="0.5" ry="0.5"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g10711" transform="translate(598,-637)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g transform="translate(-189)" id="g10709">
+ <rect y="214.99997" x="-152" height="16" width="16" id="rect10699" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" transform="rotate(-90,-11.999985,564.99999)"/>
+ <g id="g10703">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m -351.5,694.5 -5,5" id="path10701" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <path sodipodi:nodetypes="cscsscc" inkscape:connector-curvature="0" d="m -353.5,699.5 c 0,0.65011 -0.25463,1.25463 -0.75,1.75 l -1.5,1.5 c -0.97122,1.0395 -2.5,1 -3.75,-0.25 -1.25,-1.25 -1.25,-2.75 -0.25,-3.75 l 1.5,-1.5 c 0.48836,-0.52269 1.11769,-0.77257 1.78167,-0.73292" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path10705"/>
+ <path id="path10707" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m -351.48568,697.48568 c 0.65011,0 1.25463,-0.25463 1.75,-0.75 l 1.5,-1.5 c 1.0395,-0.97122 1,-2.5 -0.25,-3.75 -1.25,-1.25 -2.75,-1.25 -3.75,-0.25 l -1.5,1.5 c -0.51814,0.48411 -0.7682,1.10675 -0.73389,1.76434" inkscape:connector-curvature="0" sodipodi:nodetypes="cscsscc"/>
+ </g>
+ </g>
+ <g transform="translate(-252,-252)" id="g10731" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g transform="translate(63,-63)" id="g10729">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;stroke:none;stroke-width:3;marker:none;enable-background:accumulate" id="rect10713" width="16" height="16" x="257" y="430"/>
+ <path inkscape:connector-curvature="0" id="path10721" d="m 271.5,438 a 6.5000004,6.5000004 0 0 1 -6.5,6.5 6.5000004,6.5000004 0 0 1 -6.5,-6.5 6.5000004,6.5000004 0 0 1 6.5,-6.5 6.5000004,6.5000004 0 0 1 6.5,6.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path id="path10723" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" sodipodi:type="arc" sodipodi:cx="265" sodipodi:cy="438" sodipodi:rx="4.1166668" sodipodi:ry="4.1166668" sodipodi:start="3.3408667" sodipodi:end="4.5077889" d="m 260.9648,437.18507 a 4.1166668,4.1166668 0 0 1 3.19879,-3.21587" sodipodi:open="true"/>
+ <path inkscape:connector-curvature="0" d="m 263.5,442.5 2,1.75 m 0.25,-2.5 2,2 m 1.75,-7.25 2,2 m -2.75,0.25 2,2 m -3.25,-0.25 2,2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path10727" sodipodi:nodetypes="cccccccccc"/>
+ </g>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g14310" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" id="path10735" d="M 61.503911,123 A 6.5039066,6.5039066 0 0 1 55.000005,129.50391 6.5039066,6.5039066 0 0 1 48.496099,123 6.5039066,6.5039066 0 0 1 55.000005,116.4961 6.5039066,6.5039066 0 0 1 61.503911,123 Z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path sodipodi:nodetypes="sssss" inkscape:connector-curvature="0" id="path10739" d="m 61.503911,123 c 0,3.59202 -2.911894,6.50391 -6.503906,6.50391 -3.592012,0 -6.503906,-2.91189 -6.503906,-6.50391 0,-3.59201 2.911894,-6.5039 6.503906,-6.5039 3.592012,0 6.503906,2.91189 6.503906,6.5039 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.3;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ </g>
+ <path inkscape:connector-curvature="0" id="path10780" d="m 103.49999,122.99999 a 6.5000001,6.5000001 0 0 1 -6.500002,6.5 6.5000001,6.5000001 0 0 1 -6.5,-6.5 6.5000001,6.5000001 0 0 1 6.5,-6.5 6.5000001,6.5000001 0 0 1 6.500002,6.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:connector-curvature="0" id="path10788" d="m 94.51367,117 a 6.5000001,6.5000001 0 0 0 -0.513672,0.23633 V 120 h 3 v -3 z m 2.486328,3 v 3 h 3 v -3 z m 3,0 h 2.763672 a 6.5000001,6.5000001 0 0 0 -2.763672,-2.76172 z m 0,3 v 3 h 2.761722 A 6.5000001,6.5000001 0 0 0 103,125.49414 V 123 Z m 0,3 h -3 v 3 h 2.486328 a 6.5000001,6.5000001 0 0 0 0.513672,-0.23633 z m -3,0 v -3 h -3 v 3 z m -3,0 h -2.763672 a 6.5000001,6.5000001 0 0 0 2.763672,2.76172 z m 0,-3 v -3 h -2.761719 a 6.5000001,6.5000001 0 0 0 -0.238281,0.50586 V 123 Z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" id="g15737" transform="translate(49.999998,4.4999696e-6)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:accumulate" d="m -20.5,583 v 3 c 0,1.66667 0,2.25 -1,3.5 v 2 h 1 1 l 2,-1.75 1.75,1.75 h 0.5 l 1.75,-1.75 1.75,1.75 h 1.25 v -2 -1 -5.5 c 0,-2.76 -2.24,-4.5 -5,-4.5 -2.76,0 -5,1.74 -5,4.5 z" id="path36693" sodipodi:nodetypes="csccccccccccccssc" inkscape:connector-curvature="0"/>
+ <path id="path36695" d="m -17,583 v 1 h 1 v 1 h -2 v -2 z" style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;enable-background:new" sodipodi:nodetypes="ccccccc" inkscape:connector-curvature="0"/>
+ <path style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;enable-background:new" d="m -12,583 v 2 h -2 v -1 h 1 v -1 z" id="path36697" sodipodi:nodetypes="ccccccc" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g15743" transform="translate(221,4.4999696e-6)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m -103.49377,582.49972 4.91286,-4e-5 c 1.14909,-10e-6 2.08061,-0.89528 2.08061,-1.99967 0,-1.10438 -0.93152,-1.99966 -2.08061,-1.99966 -1.1491,0 -1.91909,0.89527 -1.91909,1.99965" id="path10838" inkscape:connector-curvature="0" sodipodi:nodetypes="csssc"/>
+ <path sodipodi:nodetypes="csssc" inkscape:connector-curvature="0" id="path10844" d="m -105.49735,585.49677 -4e-5,-4.91286 c -1e-5,-1.14909 -0.89528,-2.08061 -1.99967,-2.08061 -1.10438,0 -1.99966,0.93152 -1.99966,2.08061 0,1.1491 0.89527,1.91909 1.99965,1.91909" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <path sodipodi:nodetypes="csssc" inkscape:connector-curvature="0" id="path10846" d="m -102.50325,587.49623 -4.91286,4e-5 c -1.14909,10e-6 -2.08061,0.89528 -2.08061,1.99967 0,1.10438 0.93152,1.99966 2.08061,1.99966 1.1491,0 1.91909,-0.89527 1.91909,-1.99965" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m -100.49967,584.49918 4e-5,4.91286 c 1e-5,1.14909 0.89528,2.08061 1.99967,2.08061 1.10438,0 1.99966,-0.93152 1.99966,-2.08061 0,-1.1491 -0.89527,-1.91909 -1.99965,-1.91909" id="path10848" inkscape:connector-curvature="0" sodipodi:nodetypes="csssc"/>
+ </g>
+ <g transform="translate(-84.000002,1.449997e-5)" id="g10880" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g transform="translate(-523,-55.999969)" id="g10853"/>
+ <g id="g10878">
+ <path transform="translate(-523,-55.99997)" sodipodi:nodetypes="cc" inkscape:connector-curvature="0" d="m 680.5,514.49996 v -4" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path10874"/>
+ <rect ry="3.0625" rx="3.0625" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="rect10876" width="10" height="14.00001" x="152.5" y="452.5"/>
+ </g>
+ </g>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 89.499998,460.50001 v 3.0165 c 0,1.65287 1.33066,2.98353 2.98353,2.98353 h 4.03294 c 1.65287,0 2.98353,-1.33066 2.98353,-2.98353 v -8.03297 c 0,-1.65287 -1.33066,-2.98353 -2.98353,-2.98353 h -1.01647" id="path10882" inkscape:connector-curvature="0" sodipodi:nodetypes="cssssssc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 93.499998,452.50001 h -1.0165 c -0.64696,0 -1.24455,0.20387 -1.73231,0.55112 -0.75838,0.53993 -1.25122,1.4265 -1.25122,2.43241 v 3.01647 l 4.00824,0.008 -0.008,-5.97178 z" id="path10884" inkscape:connector-curvature="0" sodipodi:nodetypes="cssscccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g id="g10892" style="display:inline;opacity:1;enable-background:new" transform="translate(-63.000002,1.449997e-5)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path10886" d="m 165.5,459.5 0.004,-6.00656" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:cx="156.12387" sodipodi:cy="453.49344" sodipodi:rx="9.3798456" sodipodi:ry="4.374402" sodipodi:end="0" sodipodi:start="5.8166094" sodipodi:open="true" sodipodi:type="arc" d="m 164.50114,451.5257 a 9.3798456,4.374402 0 0 1 1.00258,1.96774" id="path10888" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 167.50001,457.60147 v -4.05761" id="path10890" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <rect style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="rect10896" width="10.000019" height="14" x="110.5" y="452.5" rx="2.9835341" ry="2.9835341" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <rect ry="0.546875" rx="0.546875" y="454.5" x="114.5" height="5.0000005" width="2" id="rect10898" style="display:inline;opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:nodetypes="cssssssc" inkscape:connector-curvature="0" id="path10911" d="m 141.49995,460.50001 v 3.0165 c 0,1.65287 -1.33066,2.98353 -2.98353,2.98353 h -4.03294 c -1.65287,0 -2.98353,-1.33066 -2.98353,-2.98353 v -8.03297 c 0,-1.65287 1.33066,-2.98353 2.98353,-2.98353 h 1.01647" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:nodetypes="cssccc" inkscape:connector-curvature="0" id="path10913" d="m 137.50821,452.492 h 1.0165 c 1.65287,0 2.98353,1.33066 2.98353,2.98353 V 458.492 L 137.5,458.5 Z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g transform="translate(-648,-55.999955)" id="g10933" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="opacity:0;vector-effect:none;fill:#d40000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="rect10925" width="15.999999" height="15.999999" x="-669" y="506.99997" transform="scale(-1,1)"/>
+ <path transform="scale(-1,1)" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m -655.5,516.49997 v 3.0165 c 0,1.65287 -1.33066,2.98353 -2.98353,2.98353 h -4.03294 c -1.65287,0 -2.98353,-1.33066 -2.98353,-2.98353 v -8.03297 c 0,-1.65287 1.33066,-2.98353 2.98353,-2.98353 H -661.5" id="path10927" inkscape:connector-curvature="0" sodipodi:nodetypes="cssssssc"/>
+ <g id="g10929" transform="translate(-20)"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 659.5,508.49997 h -1.0165 c -0.64696,0 -1.24455,0.20387 -1.73231,0.55112 -0.75838,0.53993 -1.25122,1.4265 -1.25122,2.43241 v 3.01647 l 4.00824,0.008 -0.008,-5.97178 z" id="path10931" inkscape:connector-curvature="0" sodipodi:nodetypes="cssscccc"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g10943" transform="translate(-606,-55.999955)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect transform="scale(-1,1)" y="506.99997" x="-669" height="15.999999" width="15.999999" id="rect10935" style="opacity:0;vector-effect:none;fill:#d40000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:nodetypes="cssssssc" inkscape:connector-curvature="0" id="path10937" d="m 665.49995,516.49997 v 3.0165 c 0,1.65287 -1.33066,2.98353 -2.98353,2.98353 h -4.03294 c -1.65287,0 -2.98353,-1.33066 -2.98353,-2.98353 v -8.03297 c 0,-1.65287 1.33066,-2.98353 2.98353,-2.98353 h 1.01647" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <g transform="translate(-20)" id="g10939"/>
+ <path sodipodi:nodetypes="cssccc" inkscape:connector-curvature="0" id="path10941" d="m 661.49995,508.49997 h 1.0165 c 1.65287,0 2.98353,1.33066 2.98353,2.98353 v 3.01647 l -4.00824,0.008 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ </g>
+ <g transform="translate(-647,-34.999955)" id="g10954" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="opacity:0;vector-effect:none;fill:#d40000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="rect10945" width="15.999999" height="15.999999" x="673" y="485.99997"/>
+ <rect style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="rect10947" width="10" height="14.00001" x="675.5" y="487.49997" rx="2.9835341" ry="2.9835341"/>
+ <rect ry="0.546875" rx="0.546875" y="489.49997" x="679.5" height="5.0000005" width="2" id="rect10949" style="opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <g transform="translate(0,-21)" id="g10951"/>
+ </g>
+ <g transform="translate(-84.000002,1.449997e-5)" style="display:inline;opacity:1;enable-background:new" id="g10802" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 165.5,459.5 0.004,-6.00656" id="path10792" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path10798" d="m 164.50114,451.5257 a 9.3798456,4.374402 0 0 1 1.00258,1.96774" sodipodi:type="arc" sodipodi:open="true" sodipodi:start="5.8166094" sodipodi:end="0" sodipodi:ry="4.374402" sodipodi:rx="9.3798456" sodipodi:cy="453.49344" sodipodi:cx="156.12387"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path10800" d="m 167.50001,457.60147 v -4.05761" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <g transform="translate(-42.000002,1.449997e-5)" style="display:inline;opacity:1;enable-background:new" id="g10830" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 165.5,459.5 0.004,-6.00656" id="path10822" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path10824" d="m 164.50114,451.5257 a 9.3798456,4.374402 0 0 1 1.00258,1.96774" sodipodi:type="arc" sodipodi:open="true" sodipodi:start="5.8166094" sodipodi:end="0" sodipodi:ry="4.374402" sodipodi:rx="9.3798456" sodipodi:cy="453.49344" sodipodi:cx="156.12387"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path10828" d="m 167.50001,457.60147 v -4.05761" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <g id="g10838" style="display:inline;opacity:1;enable-background:new" transform="translate(-21.000002,1.449997e-5)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path10832" d="m 165.5,459.5 0.004,-6.00656" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:cx="156.12387" sodipodi:cy="453.49344" sodipodi:rx="9.3798456" sodipodi:ry="4.374402" sodipodi:end="0" sodipodi:start="5.8166094" sodipodi:open="true" sodipodi:type="arc" d="m 164.50114,451.5257 a 9.3798456,4.374402 0 0 1 1.00258,1.96774" id="path10834" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 167.50001,457.60147 v -4.05761" id="path10836" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <path id="path10850" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 69.492878,318.50005 h 12.99264 m -12.99238,-3 h 12.99238 m -12.99238,-3 h 12.99238 m -12.99238,-3 h 12.99238 m -12.99238,-3 h 12.99238" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:nodetypes="cccccccccc" inkscape:connector-curvature="0" d="m 48.492878,318.50005 h 12.99264 m -5.99238,-3 h 5.99238 m -12.99238,-3 h 12.99238 m -5.99238,-3 h 5.99238 m -12.99238,-3 h 12.99238" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path10852" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path id="path10854" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 27.492878,318.50005 h 12.99264 m -8.99238,-3 h 4.99238 m -8.99238,-3 h 12.99238 m -8.99238,-3 h 4.99238 m -8.99238,-3 h 12.99238" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:nodetypes="cccccccccc" inkscape:connector-curvature="0" d="M 19.492878,318.50005 H 6.500238 m 5.99238,-3 h -5.99238 m 12.99238,-3 H 6.500238 m 5.99238,-3 h -5.99238 m 12.99238,-3 H 6.500238" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path10856" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g transform="translate(-462.00711,-314.99994)" id="g10872" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="path10864" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.20000005;stroke-opacity:1;enable-background:new" d="m 565.49264,633.5 h -0.99974 m -2,0 h -1.99824 m -2.05503,0 h -1.91682 m -2.02991,0 h -1.99264 m 12.99238,-6 h -0.99974 m -2,0 h -1.99824 m -2.05503,0 h -1.91682 m -2.02991,0 h -1.99264 m 12.99238,-6 h -0.99974 m -2,0 h -1.99824 m -2.05503,0 h -1.91682 m -2.02991,0 h -1.99264" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccccccccccccc"/>
+ <path sodipodi:nodetypes="cccccccccccccccc" inkscape:connector-curvature="0" d="M 552.50026,630.5 H 553.5 m 2,0 h 1.99824 m 2.05503,0 h 1.91682 m 2.02991,0 h 1.99264 m -12.99238,-6 H 553.5 m 2,0 h 1.99824 m 2.05503,0 h 1.91682 m 2.02991,0 h 1.99264" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.20000005;stroke-opacity:1;enable-background:new" id="path10870"/>
+ </g>
+ <g transform="translate(-420.00712,-293.99994)" id="g10894" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect y="598" x="614" height="16" width="16" id="rect10881" style="opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1;stroke-opacity:1;marker:none"/>
+ <path id="path10892" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 619.5,612.5 v -0.75 l 5,-11.5 v -0.75 m -3,0 h 6 m -11,13 h 6" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/>
+ </g>
+ <g transform="translate(-420.00712,-293.99994)" id="g10903" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1;stroke-opacity:1;marker:none" id="rect10897" width="16" height="16" x="635" y="598"/>
+ <path id="path10901" transform="scale(-1)" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m -648.5,-599.5 h 4 m 6,0 v -6.5 c 0,-1.92909 -1.567,-3.49292 -3.5,-3.49646 h -1 c -1.933,0.004 -3.5,1.56737 -3.5,3.49646 v 6.5 m 6,0 h 4 m -1,-13 h -10" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccc"/>
+ </g>
+ <rect style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect10983" width="13.000001" height="12.999999" x="111.5" y="305.5" rx="0" ry="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" d="m 113.49314,309.50005 h 8.99238 m -8.99238,-2 h 8.99238" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path10977" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <rect ry="0" rx="0" y="305.5" x="132.5" height="12.999999" width="13.000001" id="rect11046" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path id="path11048" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 134.49314,312.50005 h 8.99238 m -8.99238,-2 h 8.99238" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <rect style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect11050" width="13.000001" height="12.999999" x="153.5" y="305.5" rx="0" ry="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" d="m 155.49314,316.50005 h 8.99238 m -8.99238,-2 h 8.99238" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path11052" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g id="g10958" style="display:inline;opacity:1;enable-background:new" transform="translate(310,4.4999696e-6)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1;stroke-opacity:1;marker:none" id="rect10954" width="16" height="16" x="-137.00713" y="304.00006"/>
+ <path sodipodi:nodetypes="cccsccccsc" inkscape:connector-curvature="0" d="m -127,312 h -6 m 6,0 c 1.65685,0 3,1.34315 3,3 0,1.65685 -1.34315,3 -3,3 h -6 v -12 h 4 c 1.65685,0 3,1.34315 3,3 0,1.65685 -1.34315,3 -3,3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="path10949"/>
+ </g>
+ <g transform="matrix(0,1,1,0,37.999948,363)" id="g11084" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <circle cy="164" cx="117" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle11078" r="6.5"/>
+ <path inkscape:connector-curvature="0" id="path11080" transform="rotate(-90,2.5,364.5)" d="m 203,472.5 a 6.5,6.5 0 0 0 -6.5,6.5 6.5,6.5 0 0 0 6.5,6.5 6.5,6.5 0 0 0 6.5,-6.5 6.5,6.5 0 0 0 -6.5,-6.5 z m 0,0.5 c 1.09865,0 2,0.90135 2,2 0,1.09865 -0.90135,2 -2,2 -1.09865,0 -2,-0.90135 -2,-2 0,-1.09865 0.90135,-2 2,-2 z m -4,4 c 1.09865,0 2,0.90135 2,2 0,1.09865 -0.90135,2 -2,2 -1.09865,0 -2,-0.90135 -2,-2 0,-1.09865 0.90135,-2 2,-2 z m 8,0 c 1.09865,0 2,0.90135 2,2 0,1.09865 -0.90135,2 -2,2 -1.09865,0 -2,-0.90135 -2,-2 0,-1.09865 0.90135,-2 2,-2 z m -4,1 c 0.54636,0 1,0.45364 1,1 0,0.54636 -0.45364,1 -1,1 -0.54636,0 -1,-0.45364 -1,-1 0,-0.54636 0.45364,-1 1,-1 z m 0,3 c 1.09865,0 2,0.90135 2,2 0,1.09865 -0.90135,2 -2,2 -1.09865,0 -2,-0.90135 -2,-2 0,-1.09865 0.90135,-2 2,-2 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" d="m 124.5,171.5 c -0.5,-0.49995 -1,-0.99995 -1,-1.99995 V 169" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path11082"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" id="g13852" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96" style="display:inline;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new">
+ <g id="g11167" transform="matrix(0,-1,-1,0,688.99474,-44.97944)" style="display:inline;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"/>
+ <path sodipodi:type="inkscape:offset" inkscape:radius="-0.034089793" inkscape:original="M 14.521484 263.53125 C 13.187278 263.67305 11.986356 264.40245 11.246094 265.52148 C 10.505832 266.64051 10.303873 268.0311 10.695312 269.31445 L 6.9902344 273.01562 C 6.4594444 273.49971 6.1581194 274.91007 7.1308594 275.88281 C 8.1035894 276.85554 9.4907544 276.51614 9.9902344 276.01562 L 13.689453 272.30664 C 14.971493 272.69614 16.360964 272.49311 17.478516 271.75391 C 18.596067 271.01472 19.325528 269.81464 19.46875 268.48242 L 18.490234 267.51562 L 16.5 269.5 L 15.5 269.5 L 13.5 267.5 L 13.5 266.5 L 15.490234 264.51562 L 14.521484 263.53125 z " style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path11179" d="m 14.509766,263.56641 c -1.317835,0.14476 -2.502622,0.86844 -3.234375,1.97461 -0.734667,1.11057 -0.935355,2.49002 -0.546875,3.76367 a 0.0340932,0.0340932 0 0 1 0,0.006 0.0340932,0.0340932 0 0 1 0,0.0137 0.0340932,0.0340932 0 0 1 -0.0039,0.006 0.0340932,0.0340932 0 0 1 -0.0039,0.006 0.0340932,0.0340932 0 0 1 -0.002,0.002 l -3.7050781,3.70117 a 0.0340932,0.0340932 0 0 1 0,0.002 c -0.2555894,0.2331 -0.4626375,0.69993 -0.4824219,1.22656 -0.019784,0.52662 0.1437463,1.11249 0.6230469,1.5918 0.479234,0.47923 1.0591931,0.63285 1.5820312,0.60742 0.5228382,-0.0254 0.9891533,-0.23279 1.2304688,-0.47461 l 3.6992191,-3.70899 a 0.0340932,0.0340932 0 0 1 0.002,-0.002 0.0340932,0.0340932 0 0 1 0.0078,-0.006 0.0340932,0.0340932 0 0 1 0.0098,-0.002 0.0340932,0.0340932 0 0 1 0.01367,0 c 1.272332,0.38655 2.650662,0.18478 3.759765,-0.54883 1.104693,-0.73069 1.828447,-1.91459 1.97461,-3.23047 l -0.94336,-0.92969 -1.966796,1.95899 a 0.0340932,0.0340932 0 0 1 -0.0039,0.006 0.0340932,0.0340932 0 0 1 -0.0059,0.002 0.0340932,0.0340932 0 0 1 -0.01367,0.002 h -1 a 0.0340932,0.0340932 0 0 1 -0.0059,0 0.0340932,0.0340932 0 0 1 -0.0098,-0.004 0.0340932,0.0340932 0 0 1 -0.0059,-0.004 0.0340932,0.0340932 0 0 1 -0.002,-0.002 l -2,-2 a 0.0340932,0.0340932 0 0 1 -0.0059,-0.004 0.0340932,0.0340932 0 0 1 -0.002,-0.006 0.0340932,0.0340932 0 0 1 -0.002,-0.0137 v -1 a 0.0340932,0.0340932 0 0 1 0,-0.006 0.0340932,0.0340932 0 0 1 0.0039,-0.01 0.0340932,0.0340932 0 0 1 0.0039,-0.006 0.0340932,0.0340932 0 0 1 0.002,-0.002 l 1.964844,-1.96094 z"/>
+ </g>
+ <g transform="translate(62.999978,21.041695)" id="g11141" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g transform="translate(-126)" id="g11139">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="M 267.75002,584.20831 262.5,589.5 h -1 l -2,2 m -1,-1 2,-2 v -1 l 5.00002,-5.04169" id="path11133" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/>
+ <path style="fill:#ffffff;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" d="m 269.50002,586.45831 -0.5,-0.5 -1,-1 L 270.5,582.5 c 1,-1 1.5,-2.5 0.5,-3.5 -1,-1 -2.5,-0.5 -3.5,0.5 l -2.49998,2.45831 -1,-1 -0.5,-0.5 z" id="path11135" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13475" transform="translate(-21.000002,4.4999696e-6)">
+ <path sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccccc" mask="none" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 111,515 v 2 h 2 v -2 z m 2,2 v 2 h 2 v -2 z m 2,0 h 2 v -2 h -2 z m 2,0 v 2 h 2 v -2 z m 2,0 h 2 v -2 h -2 z m 2,0 v 2 h 2 v -2 z m 2,0 h 2 v -2 h -2 z m 0,2 v 2 h 2 v -2 z m -10,2 v -2 h -2 v 2 z m 2,0 h 2 v -2 h -2 z m 4,0 h 2 v -2 h -2 z" id="path12185" inkscape:connector-curvature="0"/>
+ <g transform="translate(63,-231)" id="g12189" style="opacity:0.6">
+ <path id="path12187" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 48,753 v 3.5 c 0,0.82843 0.67157,1.5 1.5,1.5 0.82843,0 1.5,-0.67157 1.5,-1.5 V 756 c 0,-0.5 0.53412,-1 1,-1 0.55229,0 1,0.44772 1,1 v 2.5 c 0,0.82843 0.67157,1.5 1.5,1.5 0.82843,0 1.5,-0.67157 1.5,-1.5 V 757 c 0,-0.55228 0.44772,-1 1,-1 0.55229,0 1,-0.44771 1,-1 v -2 h -2 v 0 h -2 v 0 h -2 v 0 h -2 v 0 z" inkscape:connector-curvature="0" sodipodi:nodetypes="csssssssssssscccccccccc"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" transform="matrix(-1,0,0,1,88.999998,-231)" id="g12197">
+ <path inkscape:connector-curvature="0" id="path12191" transform="matrix(-1,0,0,1,90,231)" d="m 75,519 v 7 c 0,0.5 0.25,1 1,1 0.75,0 1,-0.5 1,-1 v -1 c 0,-0.5 0.53412,-1 1,-1 0.55229,0 1,0.44772 1,1 v 2.5 c 0,0.82843 0.67157,1.5 1.5,1.5 0.82843,0 1.5,-0.67157 1.5,-1.5 V 526 c 0,-0.55228 0.44772,-1 1,-1 0.55229,0 1,-0.44771 1,-1 v -3.08789 A 1.50015,1.50015 0 0 1 83.5,521 h -3 A 1.50015,1.50015 0 0 1 79,519.5 V 519 Z" style="display:inline;opacity:0.6;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <path id="path12195" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 16.5,748.5 h -7 m 0,-0.99988 h -3 V 750.5 l 3,1.2e-4 z m 10,-1 h -3 v 3 h 3 z" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccc"/>
+ </g>
+ <g transform="translate(-126,42.000005)" id="g15787" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;stroke:none;stroke-width:3;marker:none;enable-background:accumulate" id="rect15781" width="16" height="16" x="215" y="451"/>
+ <path id="path15783" d="m 216.5,452.5 v 3 h 3 v -3 z m 10,0 v 3 h 3 v -3 z m -5,10 v 3 h 3 v -3 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccccc"/>
+ <path mask="none" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 219.5,453.5 h 7 m 1.75,2 -3.75,7 m -3,0 -3.75,-7" id="path15785" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ </g>
+ <g id="g17491" transform="matrix(0.875,0,0,0.875,264.125,159.75)" style="display:inline;opacity:1;stroke-width:1.14285719;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect y="430" x="257" height="16" width="16" id="rect17483" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;stroke:none;stroke-width:3.42857146;marker:none;enable-background:accumulate"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.14285719;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 272.5,438 a 7.5000004,7.5000004 0 0 1 -7.5,7.5 7.5000004,7.5000004 0 0 1 -7.5,-7.5 7.5000004,7.5000004 0 0 1 7.5,-7.5 7.5000004,7.5000004 0 0 1 7.5,7.5 z" id="path17485" inkscape:connector-curvature="0"/>
+ <path inkscape:transform-center-y="-2.2767605" inkscape:transform-center-x="3.6211676" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2.28571439;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path17487" sodipodi:type="arc" sodipodi:cx="265.01675" sodipodi:cy="438" sodipodi:rx="4.5546789" sodipodi:ry="4.5714331" sodipodi:start="3.403392" sodipodi:end="3.9269908" sodipodi:open="true" d="m 260.61727,436.81683 a 4.5546789,4.5714331 0 0 1 1.17884,-2.04932"/>
+ <circle style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.14285707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="circle17489" cx="265" cy="433.42853" r="1.1428571"/>
+ </g>
+ <g style="display:inline;enable-background:new" transform="translate(1298,-241)" id="g7837-6-6">
+ <path id="path7832-0-3" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m -1246.5,465.5 v 7 0 l 5,-3.25 v -0.5 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc"/>
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m -1239,466 v 6" id="path7834-4-7" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <path id="path7840-3" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 29.499998,222.5 v 11 h 0.5 l 8.5,-5.25 v -0.5 l -8.5,-5.25 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc"/>
+ <g style="display:inline;stroke-width:1.09730649;enable-background:new" transform="matrix(1,0,0,0.83050847,1300,-195.57627)" id="g8019-1">
+ <path sodipodi:nodetypes="cccccccccc" inkscape:connector-curvature="0" d="m -1207,502.79592 v 14.44898 h 2 v -14.44898 z m 6,0 v 14.44898 h 2 v -14.44898 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.19461298;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" id="path8013-3"/>
+ </g>
+ <circle r="4" cy="228" cx="12.999998" id="circle8021-5" style="display:inline;opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <g style="display:inline;enable-background:new" id="g13577" transform="translate(1300,-282)">
+ <path sodipodi:nodetypes="ccccccc" inkscape:connector-curvature="0" d="m -1166.5,506.5 v 7 0 l 5,-3.25 v -0.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path7832-0-3-8"/>
+ <path id="path13572" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m -1160.5,506.5 v 7 0 l 5,-3.25 v -0.5 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" transform="matrix(-1,0,0,1,-1043,-282)" id="g13603">
+ <path id="path13579" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m -1166.5,506.5 v 7 0 l 5,-3.25 v -0.5 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc"/>
+ <path sodipodi:nodetypes="ccccccc" inkscape:connector-curvature="0" d="m -1160.5,506.5 v 7 0 l 5,-3.25 v -0.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path13601"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13628" transform="rotate(-180,-583.5,348.5)">
+ <path sodipodi:nodetypes="ccccccc" inkscape:connector-curvature="0" d="m -1246.5,465.5 v 7 0 l 5,-3.25 v -0.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path13613"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path13625" d="m -1239,466 v 6" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ </g>
+ <path sodipodi:nodetypes="ccccccc" inkscape:connector-curvature="0" d="m 185.5,222.5 v 11 H 185 l -8.5,-5.25 v -0.5 l 8.5,-5.25 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path13630"/>
+ <g style="display:inline;opacity:1;enable-background:new" transform="translate(-840,167.99289)" id="g8012-3" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" id="path8006-3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 870.49995,221.50711 h 10 v 10.00001 l -3,3 h -10 v -10.00001 z" sodipodi:nodetypes="ccccccc"/>
+ <path sodipodi:nodetypes="ccccc" d="M 877.49995,224.50711 879.5,222.5 m -10.00005,2.00712 h 8 v 8" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path8009-8" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g4035-9" transform="translate(-42.000002,21.000005)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" id="path4031-4" d="m 132.5,591.5 5.25,-5.25" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" sodipodi:nodetypes="cc"/>
+ <path class="st10" d="m 136.5,583 c 0,2.475 2.025,4.5 4.5,4.5 2.475,0 4.5,-2.025 4.5,-4.5 0,-2.475 -2.025,-4.5 -4.5,-4.5 -2.475,0 -4.5,2.025 -4.5,4.5 z" id="path4033-2" inkscape:connector-curvature="0" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:7.17647076;stroke-dasharray:none"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g12132" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="path4043-7" style="display:inline;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:7.17647076;stroke-dasharray:none;enable-background:new" d="m 205.5,584.49993 h -6 m 3,3.00007 v -6" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <g id="g4159-3" transform="translate(61.94871,1.10183)" style="display:inline;enable-background:new">
+ <path inkscape:connector-curvature="0" id="path4155-8" d="m 133.55129,590.39817 2.5,-2.5" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" sodipodi:nodetypes="cc"/>
+ <path class="st10" d="m 134.55129,583.39817 c 0,3.3 2.7,6 6,6 3.3,0 6,-2.7 6,-6 0,-3.3 -2.7,-6 -6,-6 -3.3,0 -6,2.7 -6,6 z" id="path4157-1" inkscape:connector-curvature="0" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:7.17647076;stroke-dasharray:none"/>
+ </g>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#000000;stroke:none;stroke-width:3;marker:none;enable-background:accumulate" id="rect4248-2" width="16" height="16" x="193.95" y="577.04999"/>
+ </g>
+ <g id="g7089-6" style="display:inline;opacity:1;fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="matrix(-0.75,0,0,0.75,348.75712,418.75712)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g7087-1" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none">
+ <path style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 301.66666,249 h 10.66668" id="path7083-5" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" id="path7085-6" d="m 307,243.66667 v 10.66667" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" sodipodi:nodetypes="cc"/>
+ </g>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g12920-0" transform="translate(-1.8536743e-6,1.0000045)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cccccccccccc" inkscape:connector-curvature="0" id="path12857-9" d="m 236.5,608.5 h 0.25 m 5.75,0 h 3 m 6,0 V 607 c 0,-1.5 -1,-2.5 -2.5,-2.5 h -1.5 l -3,-3 H 240 c -2.25,0 -3.5,1.25 -3.5,3.5 v 3.5" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"/>
+ <circle style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle12876-5" cx="239.5" cy="609.5" r="1"/>
+ <circle r="1" cy="609.5" cx="248.5" id="circle12878-4" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g transform="matrix(-0.75,0,0,0.75,369.25,419.25)" style="display:inline;opacity:1;fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333325;enable-background:new" id="g10315-7" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333325" id="g10313-3">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path10309-7" d="m 300.99049,248.34283 h 10.66668" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
+ </g>
+ </g>
+ <g id="g10247-8" style="display:inline;opacity:1;fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="matrix(-0.53033009,-0.53033009,-0.53033009,0.53033009,454.86353,636.75914)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g10245-2" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none">
+ <path style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 300.40033,249 h 13.19933" id="path10241-5" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" id="path10243-3" d="m 307,242.40034 v 13.19933" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" sodipodi:nodetypes="cc"/>
+ </g>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g12144" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="path9890-4" style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:7.17647076;stroke-dasharray:none;enable-background:new" d="m 187.5,584.5 h -8 m 3,3 -3,-3 3,-3" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <g style="display:inline;enable-background:new" transform="translate(40.94871,1.10183)" id="g9896-8">
+ <path sodipodi:nodetypes="cc" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" d="m 133.55129,590.39817 2.5,-2.5" id="path9892-8" inkscape:connector-curvature="0"/>
+ <path style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:7.17647076;stroke-dasharray:none" inkscape:connector-curvature="0" id="path9894-2" d="m 134.55129,583.39817 c 0,3.3 2.7,6 6,6 3.3,0 6,-2.7 6,-6 0,-3.3 -2.7,-6 -6,-6 -3.3,0 -6,2.7 -6,6 z" class="st10"/>
+ </g>
+ <rect y="577.04999" x="172.95" height="16" width="16" id="rect9898-1" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#000000;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g5506-8" transform="translate(-44.000002,63.000005)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="path5423-1" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 565.5,423.5 c 0.56009,-0.4489 1.00092,-1.10082 1.00151,-1.80948 10e-4,-1.51874 -1.94361,-2.76068 -4.18989,-3.98649 C 561.88162,417.46937 561.44056,417.23531 561,417" inkscape:connector-curvature="0" sodipodi:nodetypes="ccsc"/>
+ <path id="path5427-6" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 556.5,423.5 c -0.55252,-0.47472 -1.00303,-1.22375 -1.00303,-1.99914 C 555.49997,420 557,419.25 558.5,418.5" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" d="m 556.55941,410.53592 c -0.49356,0.54359 -1.06031,1.04821 -1.06092,1.77356 -0.002,1.80948 2.75955,3.22603 5.50151,4.69052" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path5432-2"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" d="m 565.5,410.5 c 0.54588,0.47317 1.00303,1.23057 1.00303,1.99914 C 566.50003,414 565,414.75 563.5,415.5" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path5435-6"/>
+ <path id="path5479-0" style="opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 562.5,412.5 h 2 m -7,0 h 4" inkscape:connector-curvature="0"/>
+ <path id="path5484-0" style="opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 560.5,421.5 h 4 m -7,0 h 2" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g12796-2" transform="translate(-1.6536743e-6,21.000005)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="path12791-5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 384.5,605.5 h 13 m -13,5 h 13 m -13,-10 h 13" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ </g>
+ <g transform="matrix(-0.53033009,-0.53033009,-0.53033009,0.53033009,706.86353,657.75914)" style="display:inline;opacity:1;fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" id="g10178-9" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none" id="g10176-5">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path10172-4" d="m 300.40033,249 h 13.19933" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
+ <path sodipodi:nodetypes="cc" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 307,242.40034 v 13.19933" id="path10174-2" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g transform="translate(20.999998,4.4999696e-6)" style="display:inline;enable-background:new" id="g23194">
+ <g transform="translate(430,-112)" id="g12465">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m -351.5,694.5 -5,5" id="path12463" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <path sodipodi:nodetypes="cscsscc" inkscape:connector-curvature="0" d="m 76.5,587.5 c 0,0.65011 -0.25463,1.25463 -0.75,1.75 l -1.5,1.5 c -0.97122,1.0395 -2.5,1 -3.75,-0.25 -1.25,-1.25 -1.25,-2.75 -0.25,-3.75 l 1.5,-1.5 c 0.48836,-0.52269 1.11769,-0.77257 1.78167,-0.73292" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path12467"/>
+ <path id="path12469" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 78.51432,585.48568 c 0.65011,0 1.25463,-0.25463 1.75,-0.75 l 1.5,-1.5 c 1.0395,-0.97122 1,-2.5 -0.25,-3.75 -1.25,-1.25 -2.75,-1.25 -3.75,-0.25 l -1.5,1.5 c -0.51814,0.48411 -0.7682,1.10675 -0.73389,1.76434" inkscape:connector-curvature="0" sodipodi:nodetypes="cscsscc"/>
+ </g>
+ <g style="display:inline;opacity:1;stroke-width:1.15384436;enable-background:new" id="g12595" transform="matrix(0.866668,0,0,0.866668,-177.46699,184.39943)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g style="stroke-width:1.15384436" id="g12593">
+ <path inkscape:connector-curvature="0" id="path12589" d="m 244,445.5 v -5.19233 c 4.03846,0 6.34614,-1.73076 7.49999,-2.88461 0,4.14214 -3.35785,8.07694 -7.49999,8.07694 z m 0,-5.19233 c -4.03846,0 -6.34614,-1.73076 -7.49999,-2.88461 0,-4.14214 3.35785,-6.92306 7.49999,-6.92306 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.15384436;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" sodipodi:nodetypes="cccccccc"/>
+ <path inkscape:connector-curvature="0" id="path12591" d="m 251.5,438 a 7.5000004,7.5000004 0 0 1 -7.5,7.5 7.5000004,7.5000004 0 0 1 -7.5,-7.5 7.5000004,7.5000004 0 0 1 7.5,-7.5 7.5000004,7.5000004 0 0 1 7.5,7.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.15384436;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ </g>
+ </g>
+ <g id="g6666-5" transform="translate(-63.000002,42.000005)" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g6656-6" transform="translate(1,1)">
+ <rect y="496.00009" x="428" height="1" width="0.99999863" id="rect40533-7-0" style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate" id="rect40535-7-0" width="0.99999863" height="1" x="429" y="497.00009"/>
+ <rect y="498.00009" x="430" height="1" width="0.99999863" id="rect40537-2-7" style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate" id="rect40539-4-9" width="0.99999863" height="1" x="429" y="499.00009"/>
+ <rect y="500.00009" x="428" height="1" width="0.99999863" id="rect40541-0-8" style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate" id="rect40543-2-7" width="3" height="1" x="431" y="500.00009"/>
+ </g>
+ <rect y="494.5" x="426.5" height="13" width="13" id="rect6493-4" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <g transform="translate(-126,190)" id="g4796-0" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="rect4785-2" width="16" height="16" x="530" y="345"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path4787-1" d="m 534,352.5 h 10.5 v 7 h -13 V 355" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:nodetypes="cccccc" inkscape:connector-curvature="0" id="path4789-0" d="m 530.5,349.50001 2,-10e-6 v 2.00001 2 h -2 z" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"/>
+ <path style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 534,349 10,-3" id="path4791-4" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path id="path4814-0" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 542.5,355.5 2,-3 h -1 l -2,3 z m -8,0 2,-3 h -1 l -2,3 z m 4,0 2,-3 h -1 l -2,3 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccccc"/>
+ </g>
+ <g id="g7827-8" transform="translate(-84.000002,504)" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="scscs" inkscape:connector-curvature="0" id="path4015-8" d="M 229.5,39.00004 C 229.5,35.410165 226.58986,32.5 223,32.5 c -3.58986,0 -6.50001,2.910165 -6.50001,6.50004 0,3.589875 2.91015,6.50004 6.50001,6.50004 3.58986,0 6.5,-2.910165 6.5,-6.50004 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <rect y="35.000092" x="222" height="2" width="2" id="rect40541-1-8" style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate" id="rect4032-4" width="2" height="4.9999084" x="222" y="38.000092"/>
+ </g>
+ <g id="g12826" transform="translate(-126,-357)" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect y="430" x="383" height="16" width="16" id="rect12810" style="display:inline;opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1;stroke-opacity:1;marker:none;enable-background:new"/>
+ <g id="g12824" transform="matrix(-1,0,0,1,761,0)">
+ <path id="path12813" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 376.5,431.5 v 1 l -5,5 v 7 l -3,-3 v -4 l -5,-5 v -1 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccc"/>
+ </g>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g6750-7" transform="translate(-314.99995,-567)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect y="598" x="614" height="16" width="16" id="rect6732-0" style="opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1;stroke-opacity:1;marker:none"/>
+ <path inkscape:connector-curvature="0" id="path6734-4" d="m 615.5,612.5 v -0.25 l 3.24646,-12.75 h 0.5 L 622.5,612.25 v 0.25" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" sodipodi:nodetypes="cccccc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 617,608.5 h 4.49646" id="path6736-8" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" d="m 624.5,612.5 v -13 0" id="path6738-8" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path6744-7" d="m 624.5,612.5 h 2 m 1.99994,-1.9964 6e-5,-2.0036 m -2,-2 h -2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" sodipodi:nodetypes="cccccc"/>
+ <path d="m 626.49994,606.5 a 1.9999889,1.996521 0 0 1 1.99999,1.99652" sodipodi:end="0" sodipodi:start="4.712389" sodipodi:ry="1.996521" sodipodi:rx="1.9999889" sodipodi:cy="608.49652" sodipodi:cx="626.49994" sodipodi:type="arc" id="path6746-3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" sodipodi:open="true"/>
+ <path sodipodi:open="true" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path12394" sodipodi:type="arc" sodipodi:cx="626.49994" sodipodi:cy="-610.50708" sodipodi:rx="1.9999889" sodipodi:ry="1.996521" sodipodi:start="4.712389" sodipodi:end="0" d="m 626.49994,-612.5036 a 1.9999889,1.996521 0 0 1 1.99999,1.99652" transform="scale(1,-1)"/>
+ </g>
+ <g transform="translate(-231.00712,-588.00007)" id="g23192-6" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g transform="translate(21)" id="g23190-0">
+ <path sodipodi:nodetypes="cccccccccccc" inkscape:connector-curvature="0" d="M 553.50026,633.5 H 564.5 m -11,-2 h 10.99264 m -10.99238,-2 h 10.99238 m -10.99238,-5 h 10.99238 m -10.99238,-2 h 10.99238 m -10.99238,-2 h 10.99238" style="display:inline;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path23186-9"/>
+ </g>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g12563-2" transform="translate(-84.000002,4.4999696e-6)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" id="rect12547-2" d="m 405,32 v 8 h 14 v -8 z m 2.50781,2 h 8.98438 c 0.67616,-0.0096 0.67616,1.009563 0,1 h -8.98438 c -0.67616,0.0096 -0.67616,-1.009563 0,-1 z m 0,3 h 8.98438 c 0.67616,-0.0096 0.67616,1.009563 0,1 h -8.98438 c -0.67616,0.0096 -0.67616,-1.009563 0,-1 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1.00000003, 2.00000004;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:nodetypes="ccccccccccccccc"/>
+ <path id="path12539-8" style="display:inline;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 407.50772,45.49993 h 8.98486" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" d="m 407.50772,42.49993 h 8.98486" style="display:inline;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path12541-0"/>
+ </g>
+ <rect style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect12565-1" width="13" height="13" x="258.5" y="32.500004" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:connector-curvature="0" id="path12590-6" d="m 261.5625,35.500005 9.9375,0.03125" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" sodipodi:nodetypes="cc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 261.5625,37.500005 9.9375,0.03125" id="path12611-2" inkscape:connector-curvature="0" sodipodi:nodetypes="cc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:connector-curvature="0" id="path12613-4" d="m 261.5625,39.500005 9.9375,0.03125" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" sodipodi:nodetypes="cc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <rect y="32.500004" x="279.5" height="13" width="13" id="rect12615-8" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 282.5625,35.500005 4.9375,0.03125" id="path12617-0" inkscape:connector-curvature="0" sodipodi:nodetypes="cc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path12619-8" d="m 282.5625,37.500005 3.9375,0.03125" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 282.5625,39.500005 1.9375,0.03125" id="path12621-4" inkscape:connector-curvature="0" sodipodi:nodetypes="cc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path12623-2" d="m 282.5625,41.500005 5.9375,0.03125" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g10061" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g9978" transform="translate(159,3)" style="display:inline;enable-background:new">
+ <g style="display:inline;stroke-width:1.25052631;enable-background:new" id="g9976" transform="matrix(0.79966332,0,0,0.79966332,-130.65118,113.69494)">
+ <path inkscape:connector-curvature="0" id="path9971" d="m 133.99537,590.00462 5.00211,-5.0021" style="fill:none;stroke:#ffffff;stroke-width:1.25052631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" sodipodi:nodetypes="cc"/>
+ <path class="st10" d="m 137.74695,581.87653 c 0,2.40708 1.96943,4.37652 4.37652,4.37652 2.40709,0 4.37653,-1.96944 4.37653,-4.37652 0,-2.40709 -1.96944,-4.37653 -4.37653,-4.37653 -2.40709,0 -4.37652,1.96944 -4.37652,4.37653 z" id="path9974" inkscape:connector-curvature="0" style="fill:none;stroke:#ffffff;stroke-width:1.25052631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:7.17647076;stroke-dasharray:none"/>
+ </g>
+ </g>
+ <g style="display:inline;opacity:0.6;vector-effect:none;fill:#5fd38d;fill-opacity:1;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" transform="translate(-21.00001,84.99938)" id="g10042">
+ <path sodipodi:nodetypes="cccccc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 156.5,494.5 1.00001,6.2e-4 m 5,7.9994 v 4 h -9 l -1e-5,-6.9929" id="path10038" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cccc" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 153.5,497.5 h 3 v -3 z" id="path10040" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <path inkscape:connector-curvature="0" id="path23352-4" d="m 370.4991,224.5016 3.99202,4.01925 -3.99202,3.97915 -3.99912,-3.9992 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <path sodipodi:nodetypes="ccccc" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 349.4991,224.49998 3.99202,4.02007 -3.99202,3.97995 -3.99912,-4.00001 z" id="path23378-3" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cccccc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 328.5,227.25 4,5.75 1.2e-4,0.5 h -8 l 0.009,-0.52507 z" id="path23380-3" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path23382-9" d="m 307.5,227.25 3.991,5.77507 0.009,0.47493 h -8 V 233 Z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="cccccc"/>
+ <g transform="matrix(0.75,0,0,-0.75,203.25713,414.25713)" style="display:inline;opacity:1;fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" id="g10186-3" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none" id="g10184-2">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path10180-8" d="m 301.66666,249 h 10.66668" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
+ <path sodipodi:nodetypes="cc" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 307,243.66667 v 10.66667" id="path10182-0" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g10192-9" style="display:inline;opacity:1;fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333325;enable-background:new" transform="matrix(0.75,0,0,-0.75,182.76425,413.76425)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g10190-6" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333325">
+ <path style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 300.99049,248.34283 h 10.66668" id="path10188-0" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g12105" transform="translate(-147.00001,-566.99994)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect y="597.99994" x="278" height="16" width="16" id="rect12101" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 292.0001,606.00003 a 6.0000907,6.0000907 0 0 1 -6.00009,6.00009 6.0000907,6.0000907 0 0 1 -6.00009,-6.00009 6.0000907,6.0000907 0 0 1 6.00009,-6.00009 6.0000907,6.0000907 0 0 1 6.00009,6.00009 z" id="path12103" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:1;stroke-width:1.14285719;enable-background:new" id="g12119" transform="matrix(0.875,0,0,0.875,-234.625,-325.87495)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;stroke:none;stroke-width:3.42857146;marker:none;enable-background:accumulate" id="rect12107" width="16" height="16" x="299" y="408.99994"/>
+ <path sodipodi:nodetypes="sssss" inkscape:connector-curvature="0" id="path12109" d="m 314.42858,416.99995 c 0,4.1027 -3.32588,7.42858 -7.42858,7.42858 -4.10269,0 -7.42858,-3.32588 -7.42858,-7.42858 0,-4.10269 3.32589,-7.42858 7.42858,-7.42858 4.1027,0 7.42858,3.32589 7.42858,7.42858 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.14285719;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <g style="opacity:1;stroke-width:1.14285719" id="g12117">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path12111" d="m 312.14286,417.57137 c -1,0.5 -2.28572,1.14285 -5.14286,1.14208" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.91428572;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" mask="none"/>
+ <path mask="none" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.91428572;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 307,418.71422 h -1.71429 c -1.71428,10e-6 -3.0754,-0.50563 -4.55843,-2" id="path12115" inkscape:connector-curvature="0" sodipodi:nodetypes="csc"/>
+ </g>
+ </g>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="rect12121" width="13.000062" height="13.000062" x="6.4999981" y="32.500004" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g id="g12127" transform="translate(-819,-189.00711)" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="ccccccc" d="m 870.49995,221.50711 h 10 v 10.00001 l -3,3 h -10 v -10.00001 z" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path12123" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path12125" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="M 877.49995,224.50711 879.5,222.5 m -10.00005,2.00712 h 8 v 8" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;opacity:1;enable-background:new" id="g12135" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 153.5,230.5 v -5 h 2 l 3,-3 h 1 V 222.78125 233.5 h -1 l -3,-3 z" id="path12129" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc"/>
+ <path sodipodi:open="true" d="m 165.49736,223.52227 a 10.5,10.5 0 0 1 -0.008,8.97264" sodipodi:end="0.44237422" sodipodi:start="5.8426199" sodipodi:ry="10.5" sodipodi:rx="10.5" sodipodi:cy="228" sodipodi:cx="156" sodipodi:type="arc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path12131"/>
+ <path sodipodi:open="true" d="m 162.61187,224.45978 a 7.5,7.5 0 0 1 0.007,7.06642" sodipodi:end="0.48947213" sodipodi:start="5.7915947" sodipodi:ry="7.5" sodipodi:rx="7.5" sodipodi:cy="228" sodipodi:cx="156" sodipodi:type="arc" id="path12133" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g8207-7" transform="translate(355.99495,-106)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" id="path8180-3" d="m 112.5,607.5 v 6 h 1 3.00505 L 119,610.5 v 0 l 2.5,3 h 3 1 v -6 z m 5.50586,0.5 -8.1e-4,2.75 -1.5,2.25 h -2.50519 -1 l 0.006,-4.99805 z m 1.99414,0 5,0.002 0.006,4.99805 h -1 l -2.50095,-5e-5 -1.5,-2.25 z" style="fill:#ffffff;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" sodipodi:nodetypes="ccccccccccccccccccccccccc"/>
+ <path sodipodi:nodetypes="ccccccccccc" inkscape:connector-curvature="0" id="path8037-3" d="m 112.5,607.5 h 13 v 6 h -1 -2.99495 l -2,-3 h -1 l -2,3 H 113.5 h -1 z" style="fill:none;stroke:#f9f9f9;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"/>
+ <path sodipodi:nodetypes="cccccc" inkscape:connector-curvature="0" id="path8043-2" d="m 114.5,609.5 v 2 h 1.00505 l 1,-1.5 -0.005,-0.5 z" style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-linejoin:round;marker:none;enable-background:accumulate"/>
+ <path sodipodi:nodetypes="ccscc" inkscape:connector-curvature="0" d="m 112.5,605.5 v -3 c 0,-0.80892 0.48728,-1.5382 1.23463,-1.84776 C 114.48198,600.34268 115.5,600.5 116,601 l 0.5,0.5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path8192-4"/>
+ <use height="100%" width="100%" transform="matrix(-1,0,0,1,238.005,0)" id="use8200-5" xlink:href="#path8192-4" y="0" x="0"/>
+ </g>
+ <g id="g23151-8" transform="translate(-147.00001,-566.99994)" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect23113-8" width="6.00003" height="1.9999989" x="262" y="598.99994"/>
+ <rect y="600.99994" x="268" height="2.000062" width="2" id="rect23121-4" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <rect style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect23133-5" width="1.99999" height="5.999999" x="270" y="602.99994"/>
+ <rect y="602.99994" x="258" height="5.999999" width="1.99999" id="rect23153-8" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <rect y="610.99994" x="262" height="1.9999989" width="6.00003" id="rect23155-2" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <rect style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect23157-9" width="2" height="2.000062" x="260" y="600.99988"/>
+ <rect style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect23159-4" width="2" height="2.000062" x="268" y="608.99994"/>
+ <rect style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect12240" width="2" height="2.000062" x="260" y="608.99994"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" transform="translate(-420.00718,439.99283)" id="g7406-1-2" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="ccccccc" style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 460.50001,165.49999 -2e-5,3.00001 h -13 v -9 H 448.5 l 4.96986,-1e-5 h 3.03015" id="path7395-0-0" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 456.50001,159.49999 v 4 h 4 z" id="path7397-9-0" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png" id="path7416-1-8" d="m 450.49999,172.5 h 7 l -1.99997,5e-5 h -1 v -2 h -1 v 2" style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="ccccccc"/>
+ </g>
+ <path inkscape:connector-curvature="0" d="m 53.499998,602.5 4,4 -4,4" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path9518-7-7" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g id="g6733" transform="translate(-42.000002,503.9)" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect ry="0" rx="0" y="31" x="68" height="16" width="16" id="rect4338" style="opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:nodetypes="cssc" style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 69,40.1 h 4.5 c 4.96875,0 3.5,-7 8.25,-7 H 83" id="path4336" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ <g id="g23052" style="opacity:0.7">
+ <path sodipodi:nodetypes="csccc" d="m 82.25,42.6 c -3.5,0 -3,2.89993 -5.25,2.89993 -1.25,0 -2,-1.39993 -2.5,-2.84525 m -1,-5.07671 C 72.97,35.6 71.5,33.6 69.75,33.6" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="path4334" inkscape:connector-curvature="0"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 69,33.6 h 0.75" id="path5810" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="M 82.25,42.6 H 83" id="path5828" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ </g>
+ <g id="g6741" transform="translate(-42.000002,504.00001)" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect y="31" x="89" height="16" width="16" id="rect5875" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"/>
+ <rect y="32.5" x="90.5" height="1.99999" width="4" id="rect5837" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <rect style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="rect5839" width="6" height="2" x="97.5" y="38.5"/>
+ <rect style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="rect5843" width="6" height="2" x="97.5" y="43.5"/>
+ <path d="m 95.5,39.5 h -3 m 0,-3 v 8 h 3" style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" id="path5849" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g id="g4878" transform="matrix(1,0,0,-1,-42.000002,875.99993)" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g transform="translate(0,-42)" id="g4806" style="opacity:0.6">
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 309.5,375.5 h 2 v 3 h -2 m -4,0 h -5 v -3 h 5" id="path4801" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 309.5,378.5 h 4 v 3 h -4 m -4,0 h -3 v -3 h 3" id="path4804" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/>
+ </g>
+ <rect ry="0" rx="0" y="325" x="299" height="16" width="16" id="rect4769" style="display:inline;opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <path sodipodi:nodetypes="cccccccccc" inkscape:connector-curvature="0" id="path4817" d="m 309.5,326.5 h 4 v 3 h -4 z m -4,3 h -3 v -3 h 3 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path4685-4" d="m 307.5,339.50007 10e-6,-12.96445" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ </g>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 218.5,74.500005 h 8 v 13 l -4,-4 -4,4 z" id="rect9857" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:connector-curvature="0" id="path12420" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 323.49998,60.505055 h 11 m -8,4 -4,-4 4,-4" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g id="g12536" transform="matrix(0,1,1,0,270,-183)" style="display:inline;opacity:1;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="path12534" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 270.5,63.5 v -5 c 0,-1.104569 -0.89543,-2 -2,-2 h -10 m 3,4 -4,-4 4,-4" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc"/>
+ </g>
+ <path sodipodi:nodetypes="ccccc" d="m 353.5071,60.505055 h -11 m 8,4 4,-4 -4,-4" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path9970" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path id="path13225" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 280.5,57.500005 h 7.5 c 2.48528,0 4.5,2.014719 4.5,4.5 0,2.485281 -2.01472,4.5 -4.5,4.5 h -1.5 m -3.00001,-5 -3.99999,-4 3.99999,-4" inkscape:connector-curvature="0" sodipodi:nodetypes="ccsccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:nodetypes="ccsccccc" inkscape:connector-curvature="0" d="m 312.50002,57.500005 h -7.5 c -2.48528,0 -4.5,2.014719 -4.5,4.5 0,2.485281 2.01472,4.5 4.5,4.5 h 1.5 m 3.00001,-5 3.99999,-4 -3.99999,-4" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path13229" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path id="path13235" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 342.50004,78.500027 c 0.73235,-1.966458 2.39412,-3.420564 4.41354,-3.862001 2.01942,-0.441435 3.83642,0.08007 5.58642,1.861979 m 0,0 2.5,2.5 m -4.49951,0.500017 h 5 v -5" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path d="m 355.49802,83.492946 c -0.73235,1.966458 -2.39412,3.420564 -4.41354,3.862001 -2.01942,0.441435 -3.83642,-0.08007 -5.58642,-1.861979 m 0,0 -2.5,-2.5 m 4.49951,-0.500017 h -5 v 5" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path13252" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;opacity:1;enable-background:new" transform="translate(-1.8536743e-6,210)" id="g12055" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect ry="0" rx="0" y="325" x="236" height="16" width="16" id="rect12040" style="display:inline;opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <g transform="translate(1)" id="g12053">
+ <path style="display:inline;fill:#ffffff;stroke:#ffffff;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 235.5,328.5 2,2 2,-2 -2,-2 z" id="path12044" sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc" id="path12046" d="m 239.5,336.5 3,3 3,-3 -3,-3.25 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 246.5,328.5 2,2 2,-2 -2,-2 z" id="path12048" sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="ccccccccc" inkscape:connector-curvature="0" id="path12051" d="m 239.12109,326 1.43946,1.43945 c 0.58556,0.5858 0.58556,1.5353 0,2.1211 L 239.12109,331 h 7.75782 l -1.43946,-1.43945 c -0.58556,-0.5858 -0.58556,-1.5353 0,-2.1211 L 246.87891,326 Z" style="opacity:0.5;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g23466" transform="translate(-1.8536743e-6,-0.999995)">
+ <path id="path10645" d="m 10.5,495.5 2.560547,4.63672 c -1.646055,1.00516 -2.759766,2.81441 -2.759766,4.86328 0,0.16675 0.01099,1.3308 0.02539,1.49414 -2.377413,-0.0317 -3.826172,-0.68747 -3.826172,-1.99414 0,-0.2394 0.114486,-0.48859 0.226562,-0.75 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0" sodipodi:nodetypes="ccscscc"/>
+ <path inkscape:connector-curvature="0" id="path10649" d="M 12.499999,505 A 3.5000014,3.5000014 0 0 0 16,508.5 3.5000014,3.5000014 0 0 0 19.500001,505 3.5000014,3.5000014 0 0 0 16,501.5 3.5000014,3.5000014 0 0 0 12.499999,505 Z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="M 16.500019,496.99999 A 1.4999817,1.4999918 0 0 0 18,498.49998 1.4999817,1.4999918 0 0 0 19.499982,496.99999 1.4999817,1.4999918 0 0 0 18,495.5 a 1.4999817,1.4999918 0 0 0 -1.499981,1.49999 z" id="path10651" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cc" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 14.499317,504.49361 c 0,-0.53003 0.429679,-0.9597 0.959709,-0.9597" id="path12124" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g12828-9" transform="translate(17.999998,3.0000045)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="display:inline;fill:#ffffff;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" inkscape:connector-curvature="0" id="path12823-1" d="m 357.5,599.99999 c 0,1.35417 -1.14583,2.5 -2.5,2.5 -1.35417,0 -2.5,-1.14583 -2.5,-2.5 0,-1.35416 1.14583,-2.5 2.5,-2.5 1.35417,0 2.5,1.14584 2.5,2.5 z" class="st11"/>
+ <path style="display:inline;fill:#ffffff;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" d="m 353,602 -3.5,3.5" id="path12826-8" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path style="opacity:0.4;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path12832-8" sodipodi:type="arc" sodipodi:cx="349.5" sodipodi:cy="605.5" sodipodi:rx="3" sodipodi:ry="3" sodipodi:start="0" sodipodi:end="4.712389" d="m 352.5,605.5 a 3,3 0 0 1 -1.85195,2.77164 3,3 0 0 1 -3.26937,-0.65032 3,3 0 0 1 -0.65032,-3.26937 A 3,3 0 0 1 349.5,602.5" sodipodi:open="true"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g13451" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g23046" style="opacity:1">
+ <path inkscape:connector-curvature="0" id="circle12697" d="m 16.501953,536.5 a 2.9985299,2.9985299 0 0 0 -2.998047,2.99805 2.9985299,2.9985299 0 0 0 2.998047,2.99804 A 2.9985299,2.9985299 0 0 0 19.5,539.49805 2.9985299,2.9985299 0 0 0 16.501953,536.5 Z m 0,0.49609 a 0.50005,0.50005 0 1 1 0,1 C 15.666793,537.99609 15,538.66288 15,539.49805 a 0.50005,0.50005 0 1 1 -1,0 c 0,-1.37561 1.126353,-2.50196 2.501953,-2.50196 z" style="opacity:0.98999999;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <circle style="opacity:0.98999999;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="circle8390" cx="16.501472" cy="539.49854" r="2.9985299"/>
+ </g>
+ <path id="path8399" style="opacity:0.7;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 7.5,542.5 h 5 m -6,4 h 13 m -11,3 2,-9 m 7,9 -0.92905,-5.03885" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" transform="translate(-84.000002,-273)" id="g12159" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect ry="0" rx="0" y="346" x="446" height="16" width="16" id="rect12155" style="display:inline;opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <path sodipodi:nodetypes="ccscsscccccccccccccc" inkscape:connector-curvature="0" d="m 457.5,353.5 h 3 v 5.99999 c 0,0.5 -0.5,1 -1,1 h -11 c -0.5,0 -1,-0.5 -1,-1 V 348.5 h 4 v 0.99201 l 6,0.008 V 351.5 h -9 v 7 h -1 v 1 c 0,0.5 0.5,1 1,1 h 0.5 c 0.75,0 1.5,-0.75 1.5,-1.5 v -5.5 z" style="fill:#ffffff;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" id="path12157"/>
+ </g>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.70000005;marker:none;enable-background:accumulate" id="rect12082" width="16" height="16" x="26" y="136" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g14497">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="M 324.60938,536 C 323.75288,536 323,536.6483 323,537.5 v 3 c 0,0.8517 0.75288,1.5 1.60938,1.5 h 4.78124 C 330.24712,542 331,541.3517 331,540.5 v -3 c 0,-0.8517 -0.75288,-1.5 -1.60938,-1.5 z M 324.5,540 h 5 a 0.50005,0.50005 0 1 1 0,1 h -5 a 0.50005,0.50005 0 1 1 0,-1 z" id="rect12085" inkscape:connector-curvature="0"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="M 322.60938,544 C 321.75288,544 321,544.6483 321,545.5 v 3 c 0,0.8517 0.75288,1.5 1.60938,1.5 h 4.78124 C 328.24712,550 329,549.3517 329,548.5 v -3 c 0,-0.8517 -0.75288,-1.5 -1.60938,-1.5 z M 322.5,548 h 5 a 0.50005,0.50005 0 1 1 0,1 h -5 a 0.50005,0.50005 0 1 1 0,-1 z" id="rect12088" inkscape:connector-curvature="0"/>
+ <g transform="translate(0,231)" style="opacity:1" id="g12112">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 330.5,316.5 h 2 c 1.29844,0 2,-0.70156 2,-2 v -5 c 0,-1.29844 -0.70156,-2 -2,-2 v 0" id="path12102" sodipodi:nodetypes="cccccc" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cssc" inkscape:connector-curvature="0" id="path12106" d="m 330,315.5 c 0.29431,0 0.5,0.23696 0.5,0.53125 v 0.9375 c 0,0.29431 -0.20569,0.53125 -0.5,0.53125" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 332,306.5 c 0.29431,0 0.5,0.23696 0.5,0.53125 v 0.9375 c 0,0.29431 -0.20569,0.53125 -0.5,0.53125" id="path12110" inkscape:connector-curvature="0" sodipodi:nodetypes="cssc"/>
+ </g>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g12138" transform="translate(21.999998,314.99995)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 199.5,169.5 5,5e-5 v -3 h 1 c 1.25,0 2,-0.75005 2,-2.00005 v -3 h -10" id="path12120" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 201.5,171.5 h -7 v -12 h 7 v 2" id="path12122" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path12126" d="m 196.5,157.5 h 3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path12128" d="m 194.50712,169.5 h 3 v -8 h -3" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <g id="g12136">
+ <rect style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect12130" width="1.0000007" height="1" x="201" y="163"/>
+ <rect y="163" x="203" height="1" width="1.0000007" id="rect12132" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <rect style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect12134" width="1.0000007" height="1" x="205" y="163"/>
+ <rect y="163" x="199" height="1" width="1.0000007" id="rect12140" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12254" transform="translate(-21.000002,-20.999995)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g transform="rotate(-180,37.49935,605.50002)" id="g12202">
+ <g id="g12183" transform="translate(-412.00065,42.00002)" style="display:inline;opacity:1;fill:#ffffff;stroke:none;enable-background:new">
+ <rect y="547" x="383" height="2" width="1" id="rect12177" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <rect style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="rect12179" width="1" height="2" x="383" y="543"/>
+ <rect y="539" x="383" height="2" width="1" id="rect12181" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <rect style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="rect12212" width="1" height="2" x="390" y="535"/>
+ <rect style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="rect12218" width="1" height="2" x="383" y="535"/>
+ <rect y="547" x="390" height="2" width="1" id="rect12220" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <rect transform="rotate(90)" y="24.00066" x="577" height="2" width="1" id="rect12210" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <g id="g12191" transform="translate(-416.00065,40.00002)" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <rect transform="rotate(-90)" y="-26.00066" x="-591" height="2" width="1" id="rect12197" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <g transform="matrix(0.79966332,0,0,0.79966332,-13.65118,159.69494)" id="g12208" style="display:inline;stroke-width:1.25052631;enable-background:new">
+ <path sodipodi:nodetypes="cc" style="fill:none;stroke:#ffffff;stroke-width:1.25052631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" d="m 130.24378,592.50568 5.00211,-5.0021" id="path12204" inkscape:connector-curvature="0"/>
+ <path style="fill:none;stroke:#ffffff;stroke-width:1.25052631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:7.17647076;stroke-dasharray:none" inkscape:connector-curvature="0" id="path12206" d="m 133.99536,584.37759 c 0,2.40708 1.96943,4.37652 4.37652,4.37652 2.40709,0 4.37653,-1.96944 4.37653,-4.37652 0,-2.40709 -1.96944,-4.37653 -4.37653,-4.37653 -2.40709,0 -4.37652,1.96944 -4.37652,4.37653 z" class="st10"/>
+ </g>
+ <path sodipodi:nodetypes="cccccc" inkscape:connector-curvature="0" id="rect12222" d="m 96.5,623.5 v -3 h 7 v 13 h -7 v -2.75" style="opacity:0.25;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g transform="translate(-1.000002,1.0000045)" id="g12165" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g12155">
+ <path inkscape:connector-curvature="0" id="path12148" d="m 154.5,590.5 4.25,-4.25" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" sodipodi:nodetypes="cc"/>
+ <path class="st10" d="m 157.5,582.5 c 0,2.75 2.25001,5 5,5 2.75,0 5,-2.25 5,-5 0,-2.75001 -2.25,-5.00001 -5,-5.00001 -2.74999,0 -5,2.25 -5,5.00001 z" id="path12153" inkscape:connector-curvature="0" style="fill:none;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:7.17647076;stroke-dasharray:none"/>
+ </g>
+ <g id="g12163">
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="M 160.5,569.41992 V 570.5 h 2 v -1.08008 c -0.3276,0.0475 -0.65977,0.0801 -1,0.0801 -0.34023,0 -0.6724,-0.0326 -1,-0.0801 z" transform="translate(1,20)" id="path12159" inkscape:connector-curvature="0"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 159.5,562.5 v 2.2168 c 0.53261,0.48123 1.23005,0.7832 2,0.7832 0.76995,0 1.46739,-0.30197 2,-0.7832 V 562.5 Z" transform="translate(1,20)" id="path12161" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12207" transform="translate(20.999998,4.4999696e-6)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" d="m 205.5,584.49993 h -6" style="display:inline;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:7.17647076;stroke-dasharray:none;enable-background:new" id="path12193"/>
+ <g style="display:inline;enable-background:new" transform="translate(61.94871,1.10183)" id="g12200">
+ <path sodipodi:nodetypes="cc" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" d="m 133.55129,590.39817 2.5,-2.5" id="path12196" inkscape:connector-curvature="0"/>
+ <path style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:7.17647076;stroke-dasharray:none" inkscape:connector-curvature="0" id="path12198" d="m 134.55129,583.39817 c 0,3.3 2.7,6 6,6 3.3,0 6,-2.7 6,-6 0,-3.3 -2.7,-6 -6,-6 -3.3,0 -6,2.7 -6,6 z" class="st10"/>
+ </g>
+ <rect y="577.04999" x="193.95" height="16" width="16" id="rect12202" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#000000;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12222" transform="rotate(-180,422.50583,500.99795)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g23057" style="opacity:1">
+ <circle r="0.5" cy="504.99997" cx="429.00003" id="circle12201" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <ellipse ry="3.0000012" rx="2.9999983" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="ellipse12203" cx="434.50003" cy="499.49997"/>
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 434.50005,496.52512 a 2.9748536,3 0 0 0 -2.97486,3 2.9748536,3 0 0 0 2.97486,3 2.9748536,3 0 0 0 2.97485,-3 2.9748536,3 0 0 0 -2.97485,-3 z m 0,1.5 a 1.4874268,1.5 0 0 1 1.48742,1.5 1.4874268,1.5 0 0 1 -1.48742,1.5 1.4874268,1.5 0 0 1 -1.48743,-1.5 1.4874268,1.5 0 0 1 1.48743,-1.5 z" id="path12207" inkscape:connector-curvature="0"/>
+ </g>
+ <path sodipodi:nodetypes="csccsscc" inkscape:connector-curvature="0" d="m 430.16112,507.22516 c -0.96247,0.48124 -2.16062,0.31082 -2.92519,-0.45375 -0.76456,-0.76456 -0.93498,-1.96271 -0.45374,-2.92518 l 3.38639,-6.8437 c 1.05249,-1.82286 3.12978,-2.79152 5.19982,-2.42652 2.07004,0.365 3.69077,1.98572 4.05577,4.05577 0.365,2.07004 -0.60366,4.14734 -2.42391,5.19822 z" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path12209"/>
+ </g>
+ <g transform="translate(-148,-336)" id="g12234" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g12230" style="opacity:0.7" transform="matrix(1,0,0,-1,0,1004)">
+ <path sodipodi:nodetypes="cccccccc" inkscape:connector-curvature="0" id="path12225" d="m 412.75,506.5 h -6.25 v -8 h 6.25 m 5.5,0 h 1.25 v 8 h -1.25" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:nodetypes="ccccccccccccccc" inkscape:connector-curvature="0" d="m 408.5,498.5 v 4.5 z m 2,0 v 2.5 z m 2,0 v 4.5 z m 2,0 v 2.5 z m 2,0 v 4.5 z" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" id="path12227"/>
+ </g>
+ <path sodipodi:nodetypes="ccccc" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 414.5,507.5 v -13 h 2 v 13 z" id="path12232" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" id="g13413" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96" style="display:inline;fill:#ffffff;enable-background:new">
+ <ellipse ry="1.0000499" rx="1" cy="585.5" cx="475.5" id="path12363" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <ellipse style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="ellipse12365" cx="475.5" cy="580.5" rx="1" ry="1.0000499"/>
+ <ellipse ry="1.0000499" rx="1" cy="590.5" cx="475.5" id="ellipse12367" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g style="display:inline;opacity:0.98999999;enable-background:new" id="g8553" transform="matrix(1,0,0,-1,-689.00006,-174.00692)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect y="-253.4998" x="1146.5" height="3.000011" width="2.9999948" id="rect8453" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <rect style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect8455" width="2.9999948" height="3.000011" x="1146.5" y="-256.49979"/>
+ <rect style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect8461" width="2.9999948" height="3.000011" x="1136.5" y="-253.4998"/>
+ <rect y="-256.49979" x="1136.5" height="3.000011" width="2.9999948" id="rect8463" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <rect style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect8472" width="7" height="4.9558229" x="1139.5" y="-257.49979"/>
+ <rect style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect8474" width="2.9999948" height="3.000011" x="1146.5" y="-259.49979"/>
+ <rect y="-259.49979" x="1136.5" height="3.000011" width="2.9999948" id="rect8478" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path8497" d="m 1149.5,-261.4998 v 2.00001 h -3 v -2.00001" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path8499" d="m 1139.5,-261.4998 v 2.00001 h -3 v -2.00001" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 1149.5,-248.50691 v -2.00001 h -3 v 2.00001" id="path8506" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 1139.5,-248.50691 v -2.00001 h -3 v 2.00001" id="path8512" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 1146.5,-258.50691 v -3.00001 h -7 v 3.00001" id="path8536" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path8538" d="m 1146.5,-251.4998 v 3.00001 h -7 v -3.00001" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g transform="translate(-1.4853674e-5,-83.999995)" id="g8655" style="display:inline;opacity:0.98999999;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="ccsccccsc" id="path12245" d="m 471.50037,168.50323 v 1 c 0,0.9872 0,2.00001 3.5,2 3.5,-1e-5 3.5,-1.0128 3.5,-2 L 478.5,168.5 l -3.00037,0.01 3.50074,-0.007 c 0.25,0 2.50037,-0.003 2.5,-3.50303 -1.5e-4,-1.44727 -0.53143,-2.00275 -1.00036,-2.49997" style="display:inline;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"/>
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="cccc" id="path12247" d="m 478.50037,161.49023 v 1 c -3.7e-4,2.75977 -7.00037,2.25977 -7,5 v 1" style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"/>
+ <path style="display:inline;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" d="m 478.49966,161.49677 v -1 c 0,-0.9872 0,-2.00001 -3.5,-2 -3.5,1e-5 -3.5,1.0128 -3.5,2 l 3.7e-4,1.00323 3.00037,-0.01 -3.50074,0.007 c -0.25,0 -2.50037,0.003 -2.5,3.50303 1.7e-4,1.59588 0.4677,2.02832 1.00035,2.49997" id="path12249" sodipodi:nodetypes="ccsccccsc" inkscape:connector-curvature="0" inkscape:transform-center-x="1.500353" inkscape:transform-center-y="-1.503115"/>
+ </g>
+ <g id="g8671" style="display:inline;opacity:0.98999999;enable-background:new" transform="translate(-1.031325,-21.999745)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <ellipse style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.75688183px;marker:none;enable-background:accumulate" id="ellipse8665" transform="matrix(0.93906356,-0.34374357,0.26023251,0.96554598,0,0)" cx="449.18036" cy="271.76627" rx="2.6123617" ry="1.8505777"/>
+ <ellipse ry="1.8505788" rx="2.6123834" cy="273.92776" cx="458.16425" transform="matrix(0.93906459,-0.34374075,0.26023476,0.96554537,0,0)" id="ellipse8667" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.75688159px;marker:none;enable-background:accumulate"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" d="m 503.53131,106.49975 -1e-5,-10 h -9 l 1e-5,11" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path8669"/>
+ <path id="path8540" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 503.53131,97.49975 h -9 l -1e-5,-1 h 9 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g transform="matrix(-1,0,0,1,1689,365.99979)" style="display:inline;opacity:0.98999999;enable-background:new" id="g8530" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path8523" d="m 1262.5,-278.49979 -4,-7 -4,7 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <ellipse cy="-287.49979" cx="1253.5" id="ellipse8525" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" rx="1" ry="1.0000036"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 1252.5,-278.49979 h -3 v -13 h 13 v 9" id="path8528" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g id="g8734" transform="translate(231.99999,-418.99995)" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png" id="path8730" d="m 156.5,493.5 9.00001,2e-5 v 13 h -13 l -1e-5,-6.9929" style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="ccccc"/>
+ <path inkscape:connector-curvature="0" id="path8732" d="m 152.5,497.5 h 4 v -4 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" sodipodi:nodetypes="cccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12503" transform="translate(47.999998,90.000005)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="ccccccccc" inkscape:connector-curvature="0" d="m 471.49999,-10.499996 v 2.0000002 m -4,-1 h 4 m -7,7 h 5 m 5,-11.0000002 v -2 h -10" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path12499"/>
+ <path id="path12501" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="M 466.49999,-2.4999958 V -15.499996 h 1 v 13.0000002 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" id="g13408" style="display:inline;opacity:0.6;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g12509" transform="translate(336.99999,-439.99995)" style="display:inline;opacity:0.98999999;enable-background:new">
+ <path inkscape:connector-curvature="0" id="path12507" d="m 152.5,497.5 h 4 v -4 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" sodipodi:nodetypes="cccc"/>
+ </g>
+ <path sodipodi:nodetypes="cccccccccccccccccccccccccccccccc" inkscape:connector-curvature="0" d="m 489.49999,63.500001 v -1 m 0,4 v -1 m 13,-12 h -1 m 1,1 v -1 m 0,4 v -1 m -6,10 L 495.5,66.5 m -2,0 h -1 m -2,0 -1.00001,10e-7 m 13,-6 v -1 m 0,4 v -1 m 0,4 v -1 m -3,1 h -1 m 4,0 h -1 M 495.5,53.5 h 1 m 2,0 1,7e-5 m -10,7 -10e-6,-0.9929" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path9066-1"/>
+ </g>
+ <g transform="matrix(0.92857149,0,0,0.92857137,106.93015,-501.7093)" style="display:inline;opacity:0.98999999;stroke-width:1.07692313;enable-background:new" id="g8599" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cccccccccccssccsssss" inkscape:connector-curvature="0" id="path8595" transform="matrix(1.076923,0,0,1.0769231,-739.76878,506.92345)" d="m 992.67578,105.26367 c -0.19597,-0.18575 -0.45872,-0.28437 -0.72851,-0.27344 -0.89539,0.0396 -1.29072,1.14623 -0.62305,1.74415 L 992.69727,108 H 986 c -1.36099,-0.0279 -1.36099,2.02794 0,2 h 3.0918 c -0.003,0.002 -0.005,0.004 -0.008,0.006 l -4.75,4.24805 c -0.99479,0.88933 0.3392,2.38151 1.33399,1.49218 l 2.33984,-2.09375 C 988.08993,116.60772 990.52575,119 993.5,119 c 3.02565,0 5.49805,-2.47428 5.49805,-5.5 0,-1.56564 -0.66395,-2.97983 -1.72241,-3.98356 z M 993.5,110 c 1.94471,0 3.5,1.5551 3.5,3.5 0,1.94489 -1.55529,3.5 -3.5,3.5 -1.94472,0 -3.5,-1.55511 -3.5,-3.5 0,-1.9449 1.55528,-3.5 3.5,-3.5 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path id="path8597" d="m 331.99999,629.15424 a 1.86519,1.8457757 0 0 1 -1.86519,1.84577 1.86519,1.8457757 0 0 1 -1.86519,-1.84577 1.86519,1.8457757 0 0 1 1.86519,-1.84578 1.86519,1.8457757 0 0 1 1.86519,1.84578 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.15384626;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:0.98999999;enable-background:new" id="g8588" transform="translate(-849.99809,385.00509)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="path8688" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 1368,-330.99979 4.0353,3.96466" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path8690" sodipodi:type="arc" sodipodi:cx="1368.5" sodipodi:cy="-323.49979" sodipodi:rx="5" sodipodi:ry="5" sodipodi:start="5.4977871" sodipodi:end="3.0447182" d="m 1372.0355,-327.03532 a 5,5 0 0 1 0.8731,5.89443 5,5 0 0 1 -5.3883,2.54418 5,5 0 0 1 -3.9969,-4.41946" sodipodi:open="true"/>
+ <path id="path8692" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 1361.5,-328.49979 h 5.5" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <ellipse id="ellipse8694" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" cx="1368.5" cy="-323.49979" rx="2" ry="2.0000036"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" d="m 1360,-322.99979 3.5,-3.50001" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path8698"/>
+ <path id="path8702" d="m 1361.5,-328.49974 a 0.99995232,0.99995232 0 0 0 -0.866,0.49998 0.99995232,0.99995232 0 0 0 0,0.99995 0.99995232,0.99995232 0 0 0 0.866,0.49998 l 2,4e-5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cscc" inkscape:connector-curvature="0" id="path8704" d="m 1368,-330.99979 c -0.628,-0.62804 -1.5,-0.63258 -2,-0.25 -0.3971,0.30384 -0.75,1 0,1.75 l 1,1" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 1360,-322.99979 c -0.6281,0.628 -0.6326,1.5 -0.25,2 0.3038,0.3971 1,0.75 1.75,0 l 2,-2" id="path8582" inkscape:connector-curvature="0" sodipodi:nodetypes="cscc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12394" transform="translate(-1.8536743e-6,-20.999995)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 68.00006,556.00009 h 15.999881 v 15.99988 H 68.00006 Z" id="path12360"/>
+ <g id="g12386">
+ <path id="path12362" d="m 71.040036,569.03999 h 9.999927 v -1.99998 h -9.999927 z" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" inkscape:connector-curvature="0"/>
+ <path id="path12364" d="m 71.440033,570.47998 h 9.119934 c 1.039991,0 1.919985,-0.87999 1.919985,-1.99998 v -0.96 c 0,-1.11999 -0.879994,-1.99998 -1.919985,-1.99998 h -9.119934 c -1.039992,0 -1.919985,0.87999 -1.919985,1.99998 v 0.96 c 0,1.11999 0.879993,1.99998 1.919985,1.99998 z" style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:0.95999289px;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" inkscape:connector-curvature="0"/>
+ <path id="path12366" d="M 71.040036,561.04005 H 76 v -1.99998 h -4.959964 z" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" inkscape:connector-curvature="0"/>
+ <path id="path12368" d="m 71.520033,562.48004 h 8.959934 c 1.119991,0 1.999985,-0.87999 1.999985,-1.99998 v -0.96 c 0,-1.11999 -0.879994,-1.99998 -1.999985,-1.99998 h -8.959934 c -1.119992,0 -1.999986,0.87999 -1.999986,1.99998 v 0.96 c 0,1.11999 0.879994,1.99998 1.999986,1.99998 z" style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1.03999233px;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12701" transform="translate(-1.8536743e-6,21.000005)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <circle r="1.500005" cy="375" cx="264.99994" id="circle7563-3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <g id="g12693">
+ <path id="path12489" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" d="m 267.75,380.75 1,-0.41731 m 1.58268,-1.58269 0.41732,-1 m -6.25,3.75 h 1" inkscape:connector-curvature="0" inkscape:transform-center-x="-2.6634343" inkscape:transform-center-y="4.6250229"/>
+ <use x="0" y="0" xlink:href="#path12489" inkscape:transform-center-x="4.6250157" inkscape:transform-center-y="2.6634329" id="use12494" transform="rotate(90,264.96157,374.99998)" width="100%" height="100%"/>
+ <use x="0" y="0" xlink:href="#use12494" inkscape:transform-center-x="2.6634257" inkscape:transform-center-y="-4.6250171" id="use12496" transform="rotate(90,264.96157,374.99998)" width="100%" height="100%"/>
+ <use x="0" y="0" xlink:href="#use12496" inkscape:transform-center-x="-4.6250243" inkscape:transform-center-y="-2.6634271" id="use12498" transform="rotate(90,264.96157,374.99998)" width="100%" height="100%"/>
+ </g>
+ </g>
+ <g id="g12575" transform="matrix(0.8666665,0,0,0.8666665,-253.07368,16.407198)" style="display:inline;opacity:1;stroke-width:1.15384638;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <circle cx="622" cy="438" r="4.0302505" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.15384638;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="circle12556"/>
+ <path inkscape:transform-center-y="-0.5" sodipodi:nodetypes="cc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.15384638;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 626.04667,437.41486 h 3.46154" id="path12558" inkscape:connector-curvature="0" inkscape:transform-center-x="-6"/>
+ <path inkscape:transform-center-x="-6" inkscape:connector-curvature="0" id="path12560" d="m 622.58514,442.03025 v 3.46154" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.15384638;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" sodipodi:nodetypes="cc" inkscape:transform-center-y="-0.5"/>
+ <path inkscape:transform-center-x="-6" inkscape:connector-curvature="0" id="path12562" d="m 617.96975,438.56871 h -3.46154" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.15384638;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" sodipodi:nodetypes="cc" inkscape:transform-center-y="-0.5"/>
+ <path inkscape:transform-center-x="-6" inkscape:connector-curvature="0" id="path12564" d="m 621.43129,433.95332 v -3.46154" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.15384638;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" sodipodi:nodetypes="cc" inkscape:transform-center-y="-0.5"/>
+ <path inkscape:transform-center-x="-4.5" inkscape:connector-curvature="0" id="path12566" d="m 624.89283,433.95332 2.30769,-2.30769" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.15384638;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" sodipodi:nodetypes="cc" inkscape:transform-center-y="-4.5"/>
+ <path inkscape:transform-center-y="-4.5" sodipodi:nodetypes="cc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.15384638;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 626.04668,440.8764 2.30769,2.30769" id="path12568" inkscape:connector-curvature="0" inkscape:transform-center-x="-4.5"/>
+ <path inkscape:transform-center-y="-4.5" sodipodi:nodetypes="cc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.15384638;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 619.1236,442.03025 -2.3077,2.30769" id="path12570" inkscape:connector-curvature="0" inkscape:transform-center-x="-4.5"/>
+ <path inkscape:transform-center-y="-4.5" sodipodi:nodetypes="cc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.15384638;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 617.96975,435.10717 -2.3077,-2.30769" id="path12573" inkscape:connector-curvature="0" inkscape:transform-center-x="-4.5"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12862" transform="translate(342,84.000005)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="path12377" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m -197.5,307.25 -2,-1.75 h -2 l -1,1 h -1 l -1,-1 h -2 l -2,1.75 v 2.25 h -2 v 1.49999 c 0,1.5 2.125,2 3.25,1 l -0.25,-0.5 2,2.25 v 2.5 c 0,1.5 1.25,2.25 2.5,2.25 1.25,0 2.5,-0.75 2.5,-2.25 v -2.5 l 2,-2.25 -0.25,0.5 c 1.125,1 3.25,0.5 3.25,-1 V 309.5 h -2 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccscccssscccsccc"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="M -205.5,309.5 V 309 l 0.5,-0.5 h 0.5" id="path12379" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <path inkscape:connector-curvature="0" id="path12381" d="m -200.5,308.5 h -0.5 l -0.5,0.5 v 0.5" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" sodipodi:nodetypes="cccc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path12383" d="m -203.5,311.49999 h 1" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ </g>
+ <g style="display:inline;opacity:0.7;stroke-width:1.25111365;enable-background:new" transform="matrix(-0.79928788,0,0,0.79928788,828.43189,282.2677)" id="g12901" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" id="path12894" d="m 366.49554,222.99332 c -1.65832,0 -2.50221,0.8439 -2.50222,2.50222 0,1.65833 0.8439,2.50223 2.50222,2.50223 1.65833,0 2.50223,-0.8439 2.50223,-2.50223 -10e-6,-1.65832 -0.84391,-2.50222 -2.50223,-2.50222 z m 0,1.00089 c 0.82915,1e-5 1.50131,0.67217 1.50131,1.50132 0,0.82916 -0.67215,1.50133 -1.50131,1.50134 -0.82916,0 -1.50133,-0.67218 -1.50133,-1.50134 10e-6,-0.82916 0.67217,-1.50132 1.50133,-1.50132 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.25111353;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" sodipodi:nodetypes="cccccccccc"/>
+ <circle r="2.7854042" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.25111365;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="circle12896" cx="366.47485" cy="225.52515"/>
+ <path inkscape:connector-curvature="0" d="M 364.61887,227.37222 362.75,229.25 m 5.62222,-1.87778 L 370.25,229.25 M 368.37222,223.61887 370.25,221.75 m -5.63113,1.86887 L 362.75,221.75 m 3.74554,6.56055 0.004,2.18945 m -2.81946,-5.00446 h -2.18945 M 366.5,220.5 l -0.004,2.18054 m 2.81501,2.815 2.18945,0.004" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.25111365;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path12899" sodipodi:nodetypes="cccccccccccccccc"/>
+ </g>
+ <g id="g12909" transform="matrix(-0.79928788,0,0,0.79928788,833.43189,275.2677)" style="display:inline;opacity:1;stroke-width:1.25111365;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cccccccccc" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.25111353;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 366.49554,222.99332 c -1.65832,0 -2.50221,0.8439 -2.50222,2.50222 0,1.65833 0.8439,2.50223 2.50222,2.50223 1.65833,0 2.50223,-0.8439 2.50223,-2.50223 -10e-6,-1.65832 -0.84391,-2.50222 -2.50223,-2.50222 z m 0,1.00089 c 0.82915,1e-5 1.50131,0.67217 1.50131,1.50132 0,0.82916 -0.67215,1.50133 -1.50131,1.50134 -0.82916,0 -1.50133,-0.67218 -1.50133,-1.50134 10e-6,-0.82916 0.67217,-1.50132 1.50133,-1.50132 z" id="path12903" inkscape:connector-curvature="0"/>
+ <circle cy="225.52515" cx="366.47485" id="circle12905" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.25111365;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" r="2.7854042"/>
+ <path sodipodi:nodetypes="cccccccccccccccc" id="path12907" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.25111365;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="M 364.61887,227.37222 362.75,229.25 m 5.62222,-1.87778 L 370.25,229.25 M 368.37222,223.61887 370.25,221.75 m -5.63113,1.86887 L 362.75,221.75 m 3.74554,6.56055 0.004,2.18945 m -2.81946,-5.00446 h -2.18945 M 366.5,220.5 l -0.004,2.18054 m 2.81501,2.815 2.18945,0.004" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12259" transform="matrix(0,-1,-1,0,312,-85.999995)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g style="display:inline;opacity:1;enable-background:new" transform="rotate(90,-175.5,-141.5)" id="g12255" mask="none">
+ <path inkscape:connector-curvature="0" id="path12253" d="m 237.5,288.5 v -4 h 4 v 4 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <path inkscape:connector-curvature="0" d="m -605.5,283.5 h -6 m 0,-10 h 4 m -7,-1 h 3 v 3 h -3 z m 0,9 h 3 v 3 h -3 z m 9,0 h 3 v 3 h -3 z m 2.007,0 v -4 m -9.99995,4 v -6" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="path12257" sodipodi:nodetypes="ccccccccccccccccccccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12585" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96" transform="matrix(-1,0,0,1,782,4.4999696e-6)">
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccsccccccccccccccccscccccccc" style="display:inline;overflow:visible;visibility:visible;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 394.25,481.25 0.49995,0.5 c 0.18742,-0.18742 0.71844,-0.25 1,-0.25 h 0.75 c 0.56312,0 1,0.43686 1,1 v 0.9375 c 0,0.56312 -0.43688,1.0625 -1,1.0625 h -0.9375 c -0.0103,0 -0.021,3e-4 -0.0312,0 3e-4,0.0102 -0.0313,0.0523 -0.0313,0.0625 V 485.5 c 0,0.56312 -0.46813,1.03126 -1.03125,1.03125 h -0.96875 c -0.56312,0 -1,-0.46813 -1,-1.03125 v -0.9375 c 0,-0.28156 0.0704,-0.62508 0.25,-0.8125 l -0.49995,-0.5 m -4.5,-4.5 -0.50005,-0.5 c -0.18742,0.18742 -0.49964,0.24995 -0.7812,0.24995 H 385.5 c -0.56312,0 -1,-0.46813 -1,-1.03125 v -0.9375 c 0,-0.56312 0.43688,-1.03125 1,-1.03125 h 0.96875 c 0.0103,0 0.021,-3e-4 0.0312,0 -3e-4,-0.0102 0,-0.021 0,-0.0312 v -0.9375 c 0,-0.56312 0.46813,-1.03125 1.03125,-1.03125 h 0.9375 c 0.56312,0 1.03125,0.46811 1.03125,1.03125 v 0.9375 c 0,0.28156 -0.0626,0.59383 -0.25,0.78125 l 0.50005,0.5" id="path12199"/>
+ <path sodipodi:nodetypes="ssccsscscccscssccsscscccscs" inkscape:connector-curvature="0" id="path12208" d="m 392.5,474.5 v 1 c 0,0.48193 0.34205,0.86301 0.79102,0.95898 l -5.82422,5.82618 C 387.3687,481.83902 386.98772,481.5 386.50781,481.5 h -1 c -0.554,0 -1,0.44252 -1,1 0,0.55748 0.446,1 1,1 h 1 1 v 1 1 c 0,0.554 0.44252,1 1,1 0.55749,0 1,-0.446 1,-1 v -1 c 0,-0.48193 -0.34204,-0.86301 -0.79101,-0.95898 l 5.82422,-5.82618 c 0.0981,0.44614 0.47907,0.78516 0.95898,0.78516 h 1 c 0.554,0 1,-0.44252 1,-1 0,-0.55748 -0.446,-1 -1,-1 h -1 -1 v -1 -1 c 0,-0.554 -0.44252,-1 -1,-1 -0.55748,0 -1,0.446 -1,1 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <path sodipodi:nodetypes="ssccsscscccscssccsscscccscs" inkscape:connector-curvature="0" id="path12213" d="m 389.50781,495.5 v 1 c 0,0.48193 -0.34205,0.86301 -0.79102,0.95898 l 5.82422,5.82618 C 394.63911,502.83902 395.02009,502.5 395.5,502.5 h 1 c 0.554,0 1,0.44252 1,1 0,0.55748 -0.446,1 -1,1 h -1 -1 v 1 1 c 0,0.554 -0.44252,1 -1,1 -0.55749,0 -1,-0.446 -1,-1 v -1 c 0,-0.48193 0.34204,-0.86301 0.79101,-0.95898 l -5.82422,-5.82618 c -0.0981,0.44614 -0.47907,0.78516 -0.95898,0.78516 h -1 c -0.554,0 -1,-0.44252 -1,-1 0,-0.55748 0.446,-1 1,-1 h 1 1 v -1 -1 c 0,-0.554 0.44252,-1 1,-1 0.55748,0 1,0.446 1,1 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" id="g12687" transform="translate(-1.8536743e-6,42.000005)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 300.49998,360.49494 0.99997,-1.00354 m 2,-2 1,-1 m 2,-2 1,-1" id="path7527-5" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ <circle r="1" cy="352.99484" cx="308.00003" id="path7345-6" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path id="path7467" d="m 305.47677,358.51034 c 1.83873,1.17541 3.89173,1.36981 4.82258,0.43897 0.21954,-0.21954 0.38637,-0.48398 0.47662,-0.79438 l 2.70085,-10.64464 -10.64457,2.70088 c -0.30697,0.0906 -0.57675,0.259 -0.79437,0.47662 -0.89665,0.89665 -0.78043,2.78063 0.27809,4.56372 0.0514,0.0865 0.10498,0.17287 0.1608,0.25883" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0" sodipodi:nodetypes="cscccssc" inkscape:transform-center-y="6.0003174" inkscape:transform-center-x="6.000321"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12682" transform="translate(-1.8536743e-6,42.000005)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cccccc" inkscape:connector-curvature="0" id="path7537-6" d="m 321.50504,360.49494 0.99997,-1.00354 m 2,-2 1,-1 m 2,-2 1,-1" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <circle style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="circle7347-8" cx="329.00507" cy="352.99484" r="1"/>
+ <path inkscape:transform-center-y="-3.7925166" inkscape:transform-center-x="1.69535" sodipodi:nodetypes="cc" class="st10" d="m 323.47677,347.50682 c 1.49286,-0.006 5.75,-0.25 8.5,2.5" id="path7517" inkscape:connector-curvature="0" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"/>
+ <path inkscape:transform-center-y="1.723311" inkscape:transform-center-x="-3.8204776" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" inkscape:connector-curvature="0" id="path7519" d="m 334.47677,358.50682 c 0.006,-1.49286 0.25,-5.75 -2.5,-8.5" class="st10" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path7521" d="m 325.47676,353.50685 c -2.16877,-2.62285 -4.26227,-6 -2.00001,-6" inkscape:transform-center-y="0.88387741" inkscape:transform-center-x="0.88386875" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:transform-center-x="0.88387078" inkscape:transform-center-y="0.88386948" d="m 328.47677,356.50681 c 2.62285,2.16878 6,4.26227 6,2.00001" id="path7523" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12674" transform="translate(-1.8536743e-6,63.000005)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <circle style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="circle12662" cx="349.00507" cy="332.99484" r="1"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 342.50504,339.49494 0.99997,-1.00354 m 2,-2 1,-1 m 1.74499,-1.7414 0.75507,-0.75516" id="path12664" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ <path sodipodi:nodetypes="cccccccc" inkscape:connector-curvature="0" id="path12667" d="m 345.5,333.5 -3,-6 1.00501,-1.0086 h 7 l 5,11 -1,1 -6.50501,0.009 -0.49492,-1.00556" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ </g>
+ <g id="g12707" style="display:inline;opacity:0.98999999;stroke-width:1.07692313;enable-background:new" transform="matrix(0.92857149,0,0,0.92857137,22.930148,44.290705)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 992.67578,105.26367 c -0.19597,-0.18575 -0.45872,-0.28437 -0.72851,-0.27344 -0.89539,0.0396 -1.29072,1.14623 -0.62305,1.74415 L 992.69727,108 H 986 c -1.36099,-0.0279 -1.36099,2.02794 0,2 h 3.0918 c -0.003,0.002 -0.005,0.004 -0.008,0.006 l -4.75,4.24805 c -0.99479,0.88933 0.3392,2.38151 1.33399,1.49218 l 2.33984,-2.09375 C 988.08993,116.60772 990.52575,119 993.5,119 c 3.02565,0 5.49805,-2.47428 5.49805,-5.5 0,-1.56564 -0.66395,-2.97983 -1.72241,-3.98356 z M 993.5,110 c 1.94471,0 3.5,1.5551 3.5,3.5 0,1.94489 -1.55529,3.5 -3.5,3.5 -1.94472,0 -3.5,-1.55511 -3.5,-3.5 0,-1.9449 1.55528,-3.5 3.5,-3.5 z" transform="matrix(1.076923,0,0,1.0769231,-739.76878,506.92345)" id="path12703" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccssccsssss"/>
+ <path inkscape:connector-curvature="0" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2.15384626;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 331.99999,629.15424 a 1.86519,1.8457757 0 0 1 -1.86519,1.84577 1.86519,1.8457757 0 0 1 -1.86519,-1.84577 1.86519,1.8457757 0 0 1 1.86519,-1.84578 1.86519,1.8457757 0 0 1 1.86519,1.84578 z" id="path12705"/>
+ </g>
+ <g transform="translate(-210.00712,-588.00007)" id="g12466" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g transform="translate(22)" id="g12463">
+ <path sodipodi:nodetypes="cccsc" inkscape:connector-curvature="0" d="m 554.5,633.5 h -3 c 0.007,-2.24993 3.01424,-2.24986 3.00712,-3.74993 C 554.49763,628.75012 553.75,628.5 553,628.5 c -0.61679,0 -1.30036,0.32368 -1.5,1" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="path12457"/>
+ <path sodipodi:nodetypes="cccccccccccc" inkscape:connector-curvature="0" d="M 557.50026,633.5 H 564.5 m -7,-2 h 6.99264 m -6.99238,-2 h 6.99238 m -6.99238,-5 h 6.99238 m -6.99238,-2 h 6.99238 m -6.99238,-2 h 6.99238" style="display:inline;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path12459"/>
+ <path inkscape:connector-curvature="0" id="path12461" d="m 553.5,625.5 v -5 l -2,2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" sodipodi:nodetypes="ccc"/>
+ </g>
+ </g>
+ <g transform="matrix(0.86666667,0,0,0.86666667,39.533331,-302.8)" id="g12476" style="display:inline;opacity:1;stroke-width:1.15384614;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.15384614;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 461.5,564 a 7.5000004,7.5000004 0 0 1 -7.5,7.5 7.5000004,7.5000004 0 0 1 -7.5,-7.5 7.5000004,7.5000004 0 0 1 7.5,-7.5 7.5000004,7.5000004 0 0 1 7.5,7.5 z" id="path12470" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path12472" d="M 459.1923,563.99999 A 5.1923,5.1923 0 0 1 454,569.1923 5.1923,5.1923 0 0 1 448.8077,563.99999 5.1923,5.1923 0 0 1 454,558.8077 a 5.1923,5.1923 0 0 1 5.1923,5.19229 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.15384614;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path12474" d="m 455.73078,564.00001 a 1.7307681,1.7307681 0 0 1 -1.73077,1.73077 1.7307681,1.7307681 0 0 1 -1.73077,-1.73077 1.7307681,1.7307681 0 0 1 1.73077,-1.73077 1.7307681,1.7307681 0 0 1 1.73077,1.73077 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.15384603;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ </g>
+ <g style="display:inline;opacity:1;stroke-width:1.15384614;enable-background:new" id="g12520" transform="matrix(0.86666667,0,0,0.86666667,60.533331,-302.8)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" id="path12513" d="m 461.5,564 a 7.5000004,7.5000004 0 0 1 -7.5,7.5 7.5000004,7.5000004 0 0 1 -7.5,-7.5 7.5000004,7.5000004 0 0 1 7.5,-7.5 7.5000004,7.5000004 0 0 1 7.5,7.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.15384614;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.15384614;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="M 459.1923,563.99999 A 5.1923,5.1923 0 0 1 454,569.1923 5.1923,5.1923 0 0 1 448.8077,563.99999 5.1923,5.1923 0 0 1 454,558.8077 a 5.1923,5.1923 0 0 1 5.1923,5.19229 z" id="path12516" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" id="g21139" style="display:inline;opacity:0.7;enable-background:new">
+ <path inkscape:connector-curvature="0" id="path12522" d="m 418.5,186 a 6.5000004,6.5000004 0 0 1 -6.5,6.5 6.5000004,6.5000004 0 0 1 -6.5,-6.5 6.5000004,6.5000004 0 0 1 6.5,-6.5 6.5000004,6.5000004 0 0 1 6.5,6.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.3;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 413.50001,186.00001 a 1.499999,1.499999 0 0 1 -1.5,1.5 1.499999,1.499999 0 0 1 -1.5,-1.5 1.499999,1.499999 0 0 1 1.5,-1.5 1.499999,1.499999 0 0 1 1.5,1.5 z" id="path12526" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g5294-1" transform="translate(41.999988,-357)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 434.5,543 a 1.5000001,1.5000001 0 0 1 -1.5,1.5 1.5000001,1.5000001 0 0 1 -1.5,-1.5 1.5000001,1.5000001 0 0 1 1.5,-1.5 1.5000001,1.5000001 0 0 1 1.5,1.5 z" id="path5168-0" inkscape:connector-curvature="0"/>
+ <path d="m 438.50001,538.5 h 1 z m -3,0 h 1 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path5188-0" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ <path d="m 438.50001,536.5 h 1 z m -3,0 h 1 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path5221-3" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ <path id="path5233-8" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 438.50001,547.5 h 1 z m -3,0 h 1 z" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ <path inkscape:connector-curvature="0" id="path5237-9" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 438.50001,549.5 h 1 z m -3,0 h 1 z" sodipodi:nodetypes="cccccc"/>
+ <path sodipodi:nodetypes="ccscc" inkscape:connector-curvature="0" d="M 433.50001,547.5 H 433 c -2.50853,0 -4.5,-2.01446 -4.5,-4.5 0,-2.48553 1.99147,-4.5009 4.5,-4.5009 l 0.50001,9e-4" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path5260-6"/>
+ <path id="path12602" style="opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="M 433.50001,536.5 H 433 c -2.32223,0 -4.46806,1.23889 -5.62917,3.25 -1.16111,2.01111 -1.16111,4.48889 0,6.5 1.16111,2.01111 3.30694,3.25 5.62917,3.25 h 0.50001" inkscape:connector-curvature="0" sodipodi:nodetypes="ccsscc"/>
+ </g>
+ <g id="g12636" style="display:inline;opacity:0.98999999;enable-background:new" transform="matrix(-1,0,0,1,1290,764.99979)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 1262.5,-278.49979 -4,-7 -4,7 z" id="path12630" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <ellipse ry="1.0000036" rx="1" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="ellipse12632" cx="1253.5" cy="-287.49979"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path12634" d="m 1252.5,-278.49979 h -3 v -13 h 13 v 9" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ </g>
+ <g style="display:inline;opacity:0.98999999;enable-background:new" transform="translate(-104.00001,-19.999945)" id="g12642" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="ccccc" style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 156.5,493.5 9.00001,2e-5 v 13 h -13 l -1e-5,-6.9929" id="path12638" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cccc" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 152.5,497.5 h 4 v -4 z" id="path12640" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="rotate(-180,670.50713,476.50011)" style="display:inline;opacity:0.98999999;enable-background:new" id="g9316-9" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g transform="translate(438,704)" id="g8254-6">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path8213-2" d="m 746.5,-77.49979 v -3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 746.5,-82.49979 v -3" id="path8232-9" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path8239-7" d="m 746.5,-87.49979 v -3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <g style="stroke-width:1.09491563" id="g8219-5" transform="matrix(0.99217072,0,0,0.84072177,457.69618,698.42569)"/>
+ <g id="g8268-6" transform="rotate(90,613.50354,483.5038)">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 746.5,-77.49979 v -3" id="path8257-8" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path8262-6" d="m 746.5,-82.49979 v -3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 746.5,-87.49979 v -3" id="path8265-4" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 160.5,327 c -0.8223,0 -1.5,0.67765 -1.5,1.5 v 4 c 0,0.82235 0.6777,1.5 1.5,1.5 h 5 c 0.8224,0 1.5,-0.67765 1.5,-1.5 v -4 c 0,-0.82235 -0.6776,-1.5 -1.5,-1.5 z m 0,5 h 5 a 0.50005,0.50005 0 1 1 0,1 h -5 a 0.50005,0.50005 0 1 1 0,-1 z" transform="rotate(180,670.50713,476.50011)" id="rect8324-7-9-0" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-1022,-287.00021)" style="display:inline;opacity:0.98999999;enable-background:new" id="g9304-8" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g transform="translate(419,704)" id="g8292-1">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 746.5,-77.49979 v -3" id="path8285-0" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path8287-6" d="m 746.5,-82.49979 v -3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 746.5,-87.49979 v -3" id="path8290-6" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <g transform="translate(435,709)" id="g8299-5"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 134.5,330 c -0.8224,0 -1.5,0.67765 -1.5,1.5 v 4 c 0,0.82235 0.6776,1.5 1.5,1.5 h 5 c 0.8224,0 1.5,-0.67765 1.5,-1.5 v -4 c 0,-0.82235 -0.6776,-1.5 -1.5,-1.5 z m 0,5 h 5 a 0.50005,0.50005 0 1 1 0,1 h -5 a 0.50005,0.50005 0 1 1 0,-1 z" transform="translate(1022,287.00021)" id="rect8324-7-9" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-1021,-287.00021)" style="display:inline;opacity:0.98999999;enable-background:new" id="g9296-0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g8328-6" transform="translate(415,710)">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 115.5,331 c -0.82235,0 -1.5,0.67765 -1.5,1.5 v 4 c 0,0.82235 0.67765,1.5 1.5,1.5 h 5 c 0.82235,0 1.5,-0.67765 1.5,-1.5 v -4 c 0,-0.82235 -0.67765,-1.5 -1.5,-1.5 z m 0,5 h 5 a 0.50005,0.50005 0 1 1 0,1 h -5 a 0.50005,0.50005 0 1 1 0,-1 z" transform="translate(606,-422.99979)" id="rect8324-7" inkscape:connector-curvature="0"/>
+ </g>
+ <g id="g8338-5" transform="rotate(90,593.00354,462.0038)">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 746.5,-77.49979 v -3" id="path8330-5" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path8333-0" d="m 746.5,-82.49979 v -3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 746.5,-87.49979 v -3" id="path8336-9" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;opacity:1;enable-background:new" id="g10098-7" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect10082-5" width="11" height="13" x="532.5" y="53.5" rx="1.0368156" ry="1.0368156"/>
+ <rect style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect10090-6" width="1" height="3" x="537" y="54"/>
+ <rect y="54" x="535" height="3" width="1" id="rect10092-6" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <rect style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect10094-8" width="1" height="3" x="539" y="54"/>
+ <rect y="54" x="541" height="3" width="1" id="rect10096-9" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <rect style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect10221-3" width="1" height="1" x="534" y="64"/>
+ <rect y="64" x="541" height="1" width="1" id="rect10223-0" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g22930">
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g12883" transform="translate(-62,18)">
+ <g id="g12929">
+ <path sodipodi:nodetypes="csc" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="M 155.49953,122.50002 C 156.76874,123.81252 158,125.5 160.5,125.5 c 2.5,0 3.73014,-1.68748 4.99935,-2.99998" id="path12875" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path12877" d="m 155.5,122.5 c 1.26921,-1.3125 2.5,-3 5,-3 2.5,0 3.73014,1.68239 4.99935,2.99489" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="csc"/>
+ <ellipse style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path12912" cx="160.5" cy="121.125" ry="1.375" rx="1"/>
+ </g>
+ </g>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:1;fill:#ffffff;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;enable-background:new" d="M 97.50004,146.50004 94.5,147.5 l -0.99996,3.00004 -3,-7 z" id="path17479-1" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g22943">
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" transform="translate(-20,18)" id="g12942">
+ <path sodipodi:nodetypes="csc" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="M 155.49953,122.50002 C 156.76874,123.81252 158,125.5 160.5,125.5 c 2.5,0 3.73014,-1.68748 4.99935,-2.99998" id="path12932" inkscape:connector-curvature="0"/>
+ </g>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path12946" d="M 139.50004,146.50004 136.5,147.5 l -0.99996,3.00004 -3,-7 z" style="display:inline;opacity:1;fill:#ffffff;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;enable-background:new"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g22938">
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g12956" transform="translate(-41,18)">
+ <g id="g12954">
+ <path sodipodi:nodetypes="csc" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="M 155.49953,122.50002 C 156.76874,123.81252 158,125.5 160.5,125.5 c 2.5,0 3.73014,-1.68748 4.99935,-2.99998" id="path12948" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path12950" d="m 155.5,122.5 c 1.26921,-1.3125 2.5,-3 5,-3 2.5,0 3.73014,1.68239 4.99935,2.99489" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="csc"/>
+ <ellipse style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="ellipse12952" cx="160.5" cy="121.125" ry="1.375" rx="1"/>
+ </g>
+ </g>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new" d="m 114.50004,150.50004 -3,-7 7,3" id="path12958" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22948" transform="translate(0.99999815,4.4999696e-6)">
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:connector-curvature="0" id="path12633" d="M 155.49953,140.50002 C 156.76874,141.81252 158,143.5 160.5,143.5 c 2.5,0 3.73014,-1.68748 4.99935,-2.99998" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="csc"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path12645" d="m 155.50004,150.50004 -3,-7 7,3" style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g4847-8" transform="translate(-230.99288,-230.99288)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g transform="translate(126)" style="opacity:0.6" id="g4287-2">
+ <path style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" d="m 261.5,389.5 v 0.75 m -0.007,6.24288 0.007,6.00712 v 0" id="path4273-3" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path inkscape:connector-curvature="0" id="path4275-9" d="m 268.5,389.5 v 13" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" id="path4277-1" d="m 271.5,392.5 -6.00712,-0.007 m -6.24288,0.007 -0.75712,-0.007" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" sodipodi:nodetypes="cccc"/>
+ <path style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" d="m 271.5,399.5 h -13" id="path4279-0" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <path inkscape:connector-curvature="0" id="path4281-8" d="m 389.5,390.5 v 4 h -4 v -4 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g8419-9" transform="translate(1279.001,-241)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="display:inline;opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect8368-4" width="16" height="16" x="-1148" y="398"/>
+ <path sodipodi:open="true" d="m -1135.6854,405.58384 a 5.499999,5.5 0 0 1 -2.5743,6.18491 5.499999,5.5 0 0 1 -6.6399,-0.89021 5.499999,5.5 0 0 1 -0.8542,-6.64459 5.499999,5.5 0 0 1 6.1987,-2.54075" sodipodi:end="4.9782235" sodipodi:start="6.0227681" sodipodi:ry="5.5" sodipodi:rx="5.499999" sodipodi:cy="407" sodipodi:cx="-1141" sodipodi:type="arc" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="ellipse8370-9" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90"/>
+ <rect ry="1" rx="1" y="403.5" x="-1139.5" height="2" width="2" id="rect8385-9" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path8387-7" d="m -1137.75,403.75 3.749,-3.75" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ </g>
+ <g id="g22955-6" transform="matrix(-1,0,0,1,110,-127.00001)" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" id="rect22949-6" width="16" height="16" x="-63" y="535" rx="0" ry="0" transform="scale(-1,1)"/>
+ <path sodipodi:nodetypes="cccccccccc" inkscape:connector-curvature="0" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 57.499996,537.50001 v 3 h -3 v -3 z m 4,10 v 3 h -3 v -3 z" id="path22951-5"/>
+ <path id="path22953-0" style="opacity:1;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" d="m 54.5,538.50001 h -1 c -2.766857,0 -5,1.5 -5,4.5 0,3.5 3.5,6.5 9,6.5 h 1" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ </g>
+ <path sodipodi:nodetypes="ccscc" inkscape:connector-curvature="0" id="path8588-0" d="m 49.499998,443.5 h 1.56055 c 4.05552,-0.01 9.189453,-1.75 9.43945,-6 0.191174,-3.25 -2.43305,-4.98705 -5.5,-5 h -1.5" style="display:inline;fill:none;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <rect style="display:inline;opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="rect5217-4-0" width="16" height="16" x="110" y="430" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" id="g12761" transform="translate(71.999998,4.4999696e-6)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccc" inkscape:connector-curvature="0" id="path12740" d="m -14,519 h -2 v 2 h 2 z m 0,4 h -2 v 2 h 2 z m -2,2 h -2 v 2 h 2 z m -2,0 v -2 h -2 v 2 z m -2,0 h -2 v 2 h 2 z m 0,-6 v 2 h 2 v -2 z m 2,2 v 2 h 2 v -2 z m -2,0 h -2 v 2 h 2 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m -23.5,518.5001 3,-3 h 10 v 10 l -3,3 h -10 z" id="path12738" sodipodi:nodetypes="ccccccc"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g12793" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" id="path10173-4" d="m 92.5,326.5 4.5,5.5 4.5,-5.5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" sodipodi:nodetypes="ccc"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 91.25,334 c -0.683851,0 -1.25,0.56615 -1.25,1.25 v 3.5 c 0,0.68385 0.566149,1.25 1.25,1.25 h 3.5 c 0.683851,0 1.25,-0.56615 1.25,-1.25 v -3.5 C 96,334.56615 95.433851,334 94.75,334 Z m 8,0 c -0.683851,0 -1.25,0.56615 -1.25,1.25 v 3.5 c 0,0.68385 0.566149,1.25 1.25,1.25 h 3.5 c 0.68385,0 1.25,-0.56615 1.25,-1.25 v -3.5 c 0,-0.68385 -0.56615,-1.25 -1.25,-1.25 z m -7.75,4 h 2 1 a 0.50005,0.50005 0 1 1 0,1 h -1 -2 a 0.50005,0.50005 0 1 1 0,-1 z m 8,0 h 2 1 a 0.50005,0.50005 0 1 1 0,1 h -1 -2 a 0.50005,0.50005 0 1 1 0,-1 z" id="rect13911" inkscape:connector-curvature="0"/>
+ </g>
+ <g id="g12836" style="display:inline;opacity:1;enable-background:new" transform="translate(-123,458.99979)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 660,-192.49979 c 2.48528,0 4.5,2.01472 4.5,4.5 l -3.5,-1 z" id="path12830" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <path id="path12834" style="opacity:0.7;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:type="arc" sodipodi:cx="659.71765" sodipodi:cy="-187.71501" sodipodi:rx="5.2176986" sodipodi:ry="5.2151613" sodipodi:start="0.44648126" sodipodi:end="4.2709366" sodipodi:open="true" d="m 664.42387,-185.46313 a 5.2176986,5.2151613 0 0 1 -5.48854,2.90433 5.2176986,5.2151613 0 0 1 -4.38026,-4.40021 5.2176986,5.2151613 0 0 1 2.9333,-5.4712"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12951" transform="translate(-21.000002,-20.999995)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <circle r="6.5" cy="207" cx="160" id="circle12925" style="opacity:0.35;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <g id="g12946" transform="translate(-105,-168)">
+ <g id="g12944">
+ <path sodipodi:nodetypes="cccccc" id="path12927" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" d="m 267.75,380.875 1,-0.54231 m 1.58268,-1.58269 0.55693,-1 M 264.5,381.5 h 1" inkscape:connector-curvature="0" inkscape:transform-center-x="-2.6634343" inkscape:transform-center-y="4.6250229"/>
+ <path sodipodi:nodetypes="cccccc" id="path12929" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" d="m 259.11039,377.75 0.55692,1 m 1.58269,1.58268 1,0.55693 M 258.5,374.5 v 1" inkscape:connector-curvature="0" inkscape:transform-center-x="-2.6634343" inkscape:transform-center-y="4.6250229"/>
+ <path sodipodi:nodetypes="cccccc" id="path12938" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" d="m 262.25,369.11039 -1,0.55692 m -1.58268,1.58269 -0.55693,1 M 265.5,368.5 h -1" inkscape:connector-curvature="0" inkscape:transform-center-x="-2.6634343" inkscape:transform-center-y="4.6250229"/>
+ <path sodipodi:nodetypes="cccccc" id="path12940" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" d="m 270.88961,372.25 -0.55692,-1 m -1.58269,-1.58268 -1,-0.55693 M 271.5,375.5 v -1" inkscape:connector-curvature="0" inkscape:transform-center-x="-2.6634343" inkscape:transform-center-y="4.6250229"/>
+ </g>
+ </g>
+ <path sodipodi:nodetypes="cccccccc" inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png" d="m 162.0001,207.00005 h 2 m -6,0 h -2 m 4,-2 v -2 m 0,6 v 2" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:url(#radialGradient12953);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path12949"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g13014" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cccccccccccc" d="m 124.5072,188.50712 v 4 h -4 m -9.0071,-4 v 4 h 4 m 9.0071,-9.00707 v -4 h -4 m -9.0071,4 v -4 h 4" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path12919" inkscape:connector-curvature="0"/>
+ <circle r="1.99635" cy="186.00359" cx="118.00365" id="path12956" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12992" transform="translate(-1.8536743e-6,-20.999995)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path transform="scale(-1,1)" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path12904" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" sodipodi:type="arc" sodipodi:cx="-178.5" sodipodi:cy="209.50003" sodipodi:rx="3.999999" sodipodi:ry="4.0000229" sodipodi:start="4.9741884" sodipodi:end="2.8797933" d="m -177.46472,205.63631 a 3.999999,4.0000229 0 0 1 2.9495,4.21235 3.999999,4.0000229 0 0 1 -3.63616,3.63617 3.999999,4.0000229 0 0 1 -4.21232,-2.94952" sodipodi:open="true"/>
+ <path d="m -184.50968,208.37048 a 3.999999,3.9999771 0 0 1 -2.97536,-4.21609 3.999999,3.9999771 0 0 1 3.65684,-3.64085 3.999999,3.9999771 0 0 1 4.20305,2.99376" sodipodi:open="true" sodipodi:end="6.0323801" sodipodi:start="1.8259776" sodipodi:ry="3.9999771" sodipodi:rx="3.999999" sodipodi:cy="204.50003" sodipodi:cx="-183.5" sodipodi:type="arc" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" id="path12908" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" transform="scale(-1,1)"/>
+ <circle style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle12958" cx="181" cy="207" r="1.99635"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12998" transform="translate(-1.8536743e-6,-20.999995)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <ellipse cy="209.50003" cx="-157.5" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" id="ellipse12887" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" rx="3.999999" ry="4.0000229" transform="scale(-1,1)"/>
+ <path transform="scale(-1,1)" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path12892" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" sodipodi:type="arc" sodipodi:cx="-162.5" sodipodi:cy="204.50003" sodipodi:rx="3.999999" sodipodi:ry="3.9999771" sodipodi:start="1.8259776" sodipodi:end="6.0323801" sodipodi:open="true" d="m -163.50968,208.37048 a 3.999999,3.9999771 0 0 1 -2.97536,-4.21609 3.999999,3.9999771 0 0 1 3.65684,-3.64085 3.999999,3.9999771 0 0 1 4.20305,2.99376"/>
+ <circle r="1.498175" cy="209.49817" cx="157.50183" id="circle12960" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <circle style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle12962" cx="162.50183" cy="204.49817" r="1.498175"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12986" transform="translate(-1.8536743e-6,-20.999995)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <ellipse transform="scale(-1,1)" ry="4.0000229" rx="3.999999" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="ellipse12910" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" cx="-199.5" cy="209.50003"/>
+ <path d="m -205.50968,208.37048 a 3.999999,3.9999771 0 0 1 -2.97536,-4.21609 3.999999,3.9999771 0 0 1 3.65684,-3.64085 3.999999,3.9999771 0 0 1 4.20305,2.99376" sodipodi:open="true" sodipodi:end="6.0323801" sodipodi:start="1.8259776" sodipodi:ry="3.9999771" sodipodi:rx="3.999999" sodipodi:cy="204.50003" sodipodi:cx="-204.5" sodipodi:type="arc" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" id="path12915" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" transform="scale(-1,1)"/>
+ <circle style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle12964" cx="199.50183" cy="209.49817" r="1.498175"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12981" transform="translate(-1.8536743e-6,-20.999995)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 216.5001,210.50005 h 13" id="path12859" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="ccc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 219.5001,213.50005 -3,-3 3,-3" id="path12862" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path12879" d="m 226.5052,213.50005 3,-3 -3,-3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ <circle r="1.498175" cy="202.49817" cx="217.50183" id="circle12966" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <circle style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle12968" cx="227.50183" cy="202.49817" r="1.498175"/>
+ <circle r="1.498175" cy="202.49817" cx="222.50183" id="circle12970" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="cccccc" d="m 99.493018,35.505856 c -4.019044,3.494149 -5.000004,7.27958 -5.000004,9.99999 m 0,-12.99999 c -4.743016,6.244149 -3.96823,10.95192 -3.97294,12.99222 m 12.972946,-4.99222 c -2.74302,-0.0059 -4.993022,2.244149 -5.000006,4.99999" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" id="path18476-0-2"/>
+ <g style="display:inline;opacity:1;enable-background:new" id="g7347" transform="translate(921.00001,-553)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect transform="scale(-1,1)" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" id="rect7240" width="16" height="16" x="396" y="731"/>
+ <path id="path7245" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m -401.50001,739.5 c -1.25,1.5 -1.99999,2.7431 -1.99999,6 m -5,-8 c -1.50001,2.75 -1.95341,4.85514 -1.96062,7.98629" sodipodi:nodetypes="cccc" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path7248" d="m -397.5,734.5 v 3 h -3 v -3 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccc" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m -404.5,732.5 v 3 h -3 v -3 z" id="path7250" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g7353" transform="translate(923.00001,-553)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect y="731" x="377" height="16" width="16" id="rect7266" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" transform="scale(-1,1)"/>
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" sodipodi:nodetypes="cc" d="m -379.5,736.5 c -3.00001,1.5 -5.00001,4.25 -5,8" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="path7270"/>
+ <path id="path7282" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="M -386.5271,732.50714 C -390.50001,736 -391.50001,740 -391.48772,745.49343" sodipodi:nodetypes="cc" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" transform="translate(919,-532)" id="g6686" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect transform="scale(-1,1)" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" id="rect6673" width="16" height="16" x="415" y="710"/>
+ <path id="path6675" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m -416.5,714.5 c -0.20724,0.16118 -0.40586,0.32343 -0.59622,0.48663 -3.94328,3.38073 -4.34416,6.17455 -4.40378,9.51337" sodipodi:nodetypes="csc" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="ccccc" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m -421.5,711.5 v 3 h -3 v -3 z" id="path6677" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path6682" d="m -426.5,721.5 v 3 h -3 v -3 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccc" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m -424.5,716.5 v 3 h -3 v -3 z" id="path6688" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g13336" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" id="rect18813-3" width="16" height="16" x="257" y="178"/>
+ <g transform="translate(254.01611,150.99638)" id="g10120-8" style="display:inline;opacity:1;stroke:#ffffff">
+ <path inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" id="path10124-9" d="m 4.4905146,40.50362 c 4.3289102,0 3.0302371,-11 6.4933654,-11 3.463128,0 2.164455,11 6.493365,11" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" sodipodi:nodetypes="czc" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g13210" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" id="rect18821-5" width="16" height="16" x="341" y="178"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 342.51612,190.49637 6.48387,-8.74637 6.47262,8.74637" id="path10162-3" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90"/>
+ </g>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" id="rect18819-6" width="16" height="16" x="320" y="178" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;stroke-width:1.03551209;enable-background:new" id="g10170-0" transform="matrix(0.93036376,0,0,1.0023904,257.63778,150.90833)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" id="path10174-7" d="m 23.486239,-39.503925 0.03037,0.882819 a 6.9836349,7.0594196 0 0 0 3.491817,6.113637 6.9836349,7.0594196 0 0 0 6.983636,10e-7 6.9836349,7.0594196 0 0 0 3.491817,-6.113637 l 2e-6,-0.88282" style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.03551209;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" transform="scale(1,-1)"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g13206" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect y="177.99998" x="362" height="16" width="16" id="rect18823-0" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" id="path10187-3" d="m 363.51612,188.5 v -4.00001 h 13 v 3.99999" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;stroke:#ffffff;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" sodipodi:nodetypes="cccc"/>
+ </g>
+ <rect y="178" x="299" height="16" width="16" id="rect4967" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new" d="m 301.50129,191.50074 c 0,0 1.40021,-11.0004 5.49871,-11.0004 4.09849,0 5.49871,11.0004 5.49871,11.0004" id="path13261" inkscape:connector-curvature="0" sodipodi:nodetypes="czc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:connector-curvature="0" id="path10168-6-7" d="m 321.5,190.5 c 3.5,-1.25 5.25,-5.5 6,-9 0.75,3.5 2.5,7.75 6,9" style="display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" id="g13331" transform="matrix(-1,0,0,1,656,-20.999995)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g style="display:inline;opacity:1;stroke:#ffffff" id="g13323" transform="translate(254.01611,171.99638)">
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="cssc" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 4.4905146,40.50362 c 3.6101602,0 2.3764157,-12.056216 5.3058654,-10.984375 1.665483,0.609375 1.31271,7.774509 3.325927,5.665186 2.986449,-3.129014 2.362428,5.319189 4.354938,5.319189" id="path13321" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90"/>
+ </g>
+ <rect y="199" x="257" height="16" width="16" id="rect13325" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g5270-3" transform="translate(497.99495,-311.99288)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="path5169-5" style="opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m -115,532 h 16.005051 v 16 H -115 Z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <g transform="translate(-1)" id="g5191-5">
+ <circle r="1.9949499" cy="543.5" cx="-110.5" id="path5112-6" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path5116-7" d="M -110.5,541.49288 V 534.5 v -1" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path id="path5173-3" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m -109.5,534.5 h 1 v 2 h -1" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ </g>
+ <g transform="translate(-2.9999978)" style="display:inline;opacity:0.7;enable-background:new" id="g5186-5-5-7">
+ <circle style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="circle5114-8-1-4" d="m -104.65072,541.52452 a 2.5,2.5 0 0 1 1.98078,1.56948 2.5,2.5 0 0 1 -0.40026,2.4953 2.5,2.5 0 0 1 -2.37228,0.87123" sodipodi:type="arc" sodipodi:open="true" sodipodi:start="4.8525604" sodipodi:end="1.7487257" sodipodi:ry="2.5" sodipodi:rx="2.5" sodipodi:cy="544" sodipodi:cx="-105"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path5132-4-7-4" d="M -102.99495,541.99288 -98.5,537.5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path5179-0-9-1" d="m -98.25,538.75 0.75,0.75 -0.475194,0.47519 L -98.5,540.5 l -0.75,-0.75" style="fill:#ffffff;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"/>
+ </g>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g7388-6" transform="translate(731,-238)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect transform="scale(-1,1)" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" id="rect7384-9" width="16" height="16" x="437" y="710"/>
+ <path id="path7133-7" style="display:inline;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m -443,715 c -4.32641,4.07335 -4,6.82754 -4,9 m -1,-12 c -3,4 -2.98338,10.35831 -2.98713,11.98765 M -439,719 c -2,0.42997 -4,2.32754 -4,5" sodipodi:nodetypes="cccccc" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13522" transform="translate(-64.000002,4.4999696e-6)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g transform="translate(63,-21)" id="g13517" style="stroke:#ffcc00">
+ <path id="path13513" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 122,440 c 1.9528,-1.90049 1.98899,-5.17423 0.0362,-7.07472 -1.9528,-1.90049 -5.1189,-1.90049 -7.0717,0 -1.9528,1.90049 -1.91729,5.17423 0.0355,7.07472 l 0.50003,0.5 h 5.99994 z m -5.49998,2.49998 h 3.99994 m -3.99994,1.99997 h 3.99994 L 118.5,444.5 v 1 -1 h -2" inkscape:connector-curvature="0" sodipodi:nodetypes="csscccccccc"/>
+ <path style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new" d="m 117.5,438.5 v -1 l -1,-1 1,1 h 2 l 1,-1 -1,1 v 1" id="path13515" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13536" transform="translate(-64.000002,4.4999696e-6)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="path13528" d="m 181.5,431.5 c -1.27973,0 -2.55876,0.47554 -3.53516,1.42578 -1.9528,1.90049 -1.91763,5.17373 0.0352,7.07422 l 0.5,0.5 h 6 L 185,440 c 1.9528,-1.90049 1.9899,-5.17373 0.0371,-7.07422 C 184.06071,431.97554 182.77973,431.5 181.5,431.5 Z m -2.00977,4.50586 a 0.50005,0.50005 0 0 1 0.36329,0.14062 L 180.70703,437 h 1.58594 l 0.85351,-0.85352 a 0.50005,0.50005 0 0 1 0.70704,0.70704 L 183,437.70703 V 439.5 a 0.50005,0.50005 0 1 1 -1,0 V 438 h -1 v 1.5 a 0.50005,0.50005 0 1 1 -1,0 v -1.79297 l -0.85352,-0.85351 a 0.50005,0.50005 0 0 1 0.34375,-0.84766 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" inkscape:connector-curvature="0"/>
+ <path id="path12968" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 185,440 c 1.9528,-1.90049 1.98899,-5.17423 0.0362,-7.07472 -1.9528,-1.90049 -5.1189,-1.90049 -7.0717,0 -1.9528,1.90049 -1.91729,5.17423 0.0355,7.07472 l 0.50003,0.5 h 5.99994 z" inkscape:connector-curvature="0" sodipodi:nodetypes="csscccc"/>
+ <path sodipodi:nodetypes="cccccccc" inkscape:connector-curvature="0" d="m 179.50002,442.49998 h 3.99994 m -3.99994,1.99997 h 3.99994 L 181.5,444.5 v 1 -1 h -2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path13526"/>
+ </g>
+ <path inkscape:connector-curvature="0" id="path13682" d="m 100.45117,431 c -0.36065,0.005 -0.725199,0.0666 -1.080078,0.1875 -1.419514,0.48381 -2.371094,1.8128 -2.371094,3.3125 a 0.50005006,0.50005006 0 1 1 -1,0 c 0,-0.53249 0.102694,-1.04562 0.277344,-1.52734 -0.0921,0.0103 -0.173784,0.0274 -0.277344,0.0273 -3.307786,0 -6,2.69221 -6,6 0,3.30779 2.692214,6 6,6 3.307786,0 6.000002,-2.69221 6.000002,-6 v -0.002 c -4.7e-4,-0.11093 0.014,-0.19694 0.0332,-0.27344 -0.83987,0.3046 -1.77022,0.36483 -2.67578,0.12695 a 0.50005006,0.50005006 0 1 1 0.253906,-0.96679 c 1.450494,0.38101 2.978064,-0.20116 3.806644,-1.45118 0.82858,-1.25001 0.7694,-2.88277 -0.14649,-4.07031 -0.68691,-0.89068 -1.73836,-1.37897 -2.82031,-1.36328 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g14534">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle13740" sodipodi:type="arc" sodipodi:cx="96" sodipodi:cy="418" sodipodi:rx="5.5" sodipodi:ry="5.5" sodipodi:start="6.0213859" sodipodi:end="4.9741884" d="M 101.31259,416.5765 A 5.5,5.5 0 0 1 98.75,422.76314 5.5,5.5 0 0 1 92.110913,421.88909 5.5,5.5 0 0 1 91.23686,415.25 a 5.5,5.5 0 0 1 6.186645,-2.56259" sodipodi:open="true"/>
+ <path id="circle13742" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:type="arc" sodipodi:cx="100.5" sodipodi:cy="413.5" sodipodi:rx="2.9999998" sodipodi:ry="2.9999998" sodipodi:start="3.403392" sodipodi:end="1.3089969" sodipodi:open="true" d="m 97.602223,412.72354 a 2.9999998,2.9999998 0 0 1 3.159247,-2.21212 2.9999998,2.9999998 0 0 1 2.72711,2.72711 2.9999998,2.9999998 0 0 1 -2.21212,3.15925"/>
+ </g>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 94.499998,416.5 v 3 h 3 v -3 z" id="path13744" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" id="g14020" transform="translate(153.00001,38.000005)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="M -80.250144,394.50664 -76.5,394.5 l -1.25,5 h -3.75 z" id="path13993"/>
+ <path id="path13995" d="M -74.250144,394.50664 -70.5,394.5 l -1.25,5 h -3.75 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;paint-order:fill markers stroke" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path id="path13997" d="M -82.250144,401.50664 -78.5,401.5 l -1.25,5 h -3.75 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;paint-order:fill markers stroke" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="M -76.250144,401.50664 -72.5,401.5 l -1.25,5 h -3.75 z" id="path13999"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14039" transform="translate(172.00881,-0.0068185)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m -101.5,410.5 v 3 h 2.999999 v -3 z" id="path8752-5"/>
+ <path id="path12739" d="m -92.500001,410.5 v 3 h 3 v -3 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path id="path14034" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m -95.00881,411.50682 -2.5,12 m -3.712,-6.00682 H -91.5 m 1,-4 -2.04597,9.99668 h -9.97496 L -100.5,413.5 m 2,-2 h 6" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc"/>
+ </g>
+ <path sodipodi:nodetypes="cccccc" id="path12350-2" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 11.478634,439.50311 h 7 m -7,0 v -7 m -3.9999995,11 3.9999995,-4" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path id="path8644-7" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="M 199.50619,431.5 C 201,440 194.24381,435 195.75,444.5 h 8.75619 C 203,435 209.74381,440 208.25,431.5 Z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" id="g14447" transform="matrix(0,-1,-1,0,975.99286,976.00006)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <circle transform="rotate(-90)" r="1" cy="511.50006" cx="-456.49286" id="circle14423" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path14425" d="m 512.50005,455.49285 1,-1 1,-1 h 3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <circle transform="rotate(-90)" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle14427" cx="-453.49286" cy="518.50006" r="1"/>
+ <circle transform="rotate(-90)" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="circle14429" cx="-460.49286" cy="511.50006" r="1"/>
+ <circle transform="rotate(-90)" r="1" cy="511.50006" cx="-464.49286" id="circle14431" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path14433" d="m 522.50005,454.49285 v 2 h -5 l -4,4 h -1" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <circle transform="rotate(-90)" r="1" cy="522.50006" cx="-453.49286" id="circle14435" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 512.50005,464.49285 h 1 l 4,-4 v 0 l 3.99287,7e-5" id="path14437" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ <circle transform="rotate(90)" r="1" cy="-522.50006" cx="460.49286" id="circle14441" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <circle r="1" cy="-522.50006" cx="464.49286" id="circle13637" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" transform="rotate(90)"/>
+ <circle r="1" cy="518.50006" cx="-464.49286" id="circle13672" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" transform="rotate(-90)"/>
+ </g>
+ <path id="path10052-9" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="M 184.5,442.77416 V 435.75 c 0,-5.25 -6.75,-5.5 -8,-1.25 v -1.75 c 1.15746,-0.63441 2.34807,-1.26037 3.76038,-1.26037 C 186,431.48963 186.5,434.5 186.5,436.5 v 7 c 0,0.5 0.5,1 1,1 h -0.75 c -0.5,0 -1.06706,-0.54205 -2.25,-1.72584 z M 177.5,441 c 0,-1.5 1,-3.5 4,-3.5 h 3 -4.67333 c -3.25281,0 -4.33709,1.802 -4.33709,3.53808 0,2.46192 2.12503,3.46192 4.51042,3.46192 1.64933,0 3.5,-0.77416 4.5,-1.75 -4.25,3.25 -7,1 -7,-1.75 z" inkscape:connector-curvature="0" sodipodi:nodetypes="csccssscscsscssscs" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:connector-curvature="0" d="m 91.507377,482.9988 c 0,2.142 1.888176,3.5012 4.242621,3.5012 h 0.75 c 2,0 4.000002,-1.5 5.000002,-2.75" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path10278-2" sodipodi:nodetypes="cssc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:nodetypes="csssc" id="path13144" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 92.499998,475.5 c 0.856162,-1.071 2.073636,-2 4,-2 4.494852,0 5.000002,4.0193 5.000002,5.5 v 5.5 c 0,1.25 0.75,2 2,2" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;opacity:1;enable-background:new" id="g12310-0" transform="translate(62.999998,210)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 153.5,231.5 v -7 h 2.5 l 3,-3 h 0.5 V 221.78125 234.5 H 159 l -3,-3 z" id="path12304-9" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc"/>
+ <path id="path12308-2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 162.61187,224.45978 a 7.5,7.5 0 0 1 0.007,7.06642 m 2.87849,-8.00393 a 10.5,10.5 0 0 1 -0.008,8.97264" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" transform="translate(-1.8536743e-6,1.0000045)" id="g12994" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g12990" transform="translate(-392,-210)">
+ <g id="g12987">
+ <g style="display:inline;enable-background:new" id="g12976" transform="translate(-4)"/>
+ <path d="M 591.49996,620.4949 591.5,622 590.49902,623.49 590.5,620.5 Z" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path12978" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path12980" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="M 588.49996,620.4949 588.5,622 587.49902,623.49 587.5,620.5 Z"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path12982" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="M 600.49996,629.4949 600.5,631 599.49902,632.4903 599.5,629.5 Z"/>
+ <path d="M 597.49996,629.4949 597.5,631 596.49902,632.49 596.5,629.5 Z" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path12984" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ </g>
+ <path sodipodi:nodetypes="cccccccccc" inkscape:connector-curvature="0" d="m 196.5,420.5 h 5 m 1,-8 h 5 m -11,6 h 5 m 1,-4 h 5 m -11,2 h 11" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path12992"/>
+ </g>
+ <path id="path13014" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 178.5,411.5 v 11 m -2,-11.99993 c 1,0 1,0 1,0 l 1,1 1,-1 h 1 m -4,12.99993 c 1,0 1,0 1,0 l 1,-1 1,1 h 1" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path id="path13066" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 180.50712,414.5 h 7 v 5 h -7 m -4.00712,-5 h -2 v 5 h 2" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" transform="translate(-168,147)" id="g13112" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g style="stroke:#ffcc00" id="g13108" transform="translate(63,-21)">
+ <path sodipodi:nodetypes="csscccccccc" inkscape:connector-curvature="0" d="m 122,440 c 1.9528,-1.90049 1.98899,-5.17423 0.0362,-7.07472 -1.9528,-1.90049 -5.1189,-1.90049 -7.0717,0 -1.9528,1.90049 -1.91729,5.17423 0.0355,7.07472 l 0.50003,0.5 h 5.99994 z m -5.49998,2.49998 h 3.99994 m -3.99994,1.99997 h 3.99994 L 118.5,444.5 v 1 -1 h -2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path13104"/>
+ <path sodipodi:nodetypes="cccccccc" inkscape:connector-curvature="0" id="path13106" d="m 117.5,438.5 v -1 l -1,-1 1,1 h 2 l 1,-1 -1,1 v 1" style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"/>
+ </g>
+ </g>
+ <g id="g13123" transform="translate(-1.8536743e-6,84.000005)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96" style="display:inline;fill:#ffffff;enable-background:new">
+ <g transform="translate(63,-21)" id="g13121" style="fill:#ffffff;stroke:#ffcc00">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 118.5,431 c -1.40569,0 -2.81158,0.52196 -3.88477,1.56641 -2.16064,2.10276 -2.12113,5.69247 0.0352,7.79101 l 0.49609,0.4961 A 0.50005,0.50005 0 0 0 115.5,441 h 6 a 0.50005,0.50005 0 0 0 0.35352,-0.14648 l 0.49609,-0.4961 c 2.15626,-2.09849 2.19583,-5.68821 0.0352,-7.79101 C 121.31158,431.52196 119.90569,431 118.5,431 Z m 0,1 c 1.15376,0 2.30789,0.42715 3.1875,1.2832 1.74491,1.69818 1.71223,4.65689 -0.0371,6.35938 a 0.50005,0.50005 0 0 0 -0.004,0.004 L 121.29297,440 h -5.58594 l -0.35351,-0.35352 a 0.50005,0.50005 0 0 0 -0.004,-0.004 c -1.74929,-1.70244 -1.78207,-4.66116 -0.0371,-6.35938 C 116.19211,432.42715 117.34624,432 118.5,432 Z m -2,10 a 0.50005,0.50005 0 1 0 0,1 h 4 a 0.50005,0.50005 0 1 0 0,-1 z m 0,2 a 0.50005,0.50005 0 0 0 -0.19531,0.0371 0.50005,0.50005 0 0 0 -0.0879,0.0469 0.50005,0.50005 0 0 0 -0.041,0.0293 0.50005,0.50005 0 0 0 -0.0371,0.0332 0.50005,0.50005 0 0 0 -0.0625,0.0781 0.50005,0.50005 0 0 0 -0.0469,0.0879 0.50005,0.50005 0 0 0 -0.0254,0.29492 0.50005,0.50005 0 0 0 0.0312,0.0937 0.50005,0.50005 0 0 0 0.0801,0.12695 0.50005,0.50005 0 0 0 0.11329,0.0957 0.50005,0.50005 0 0 0 0.0449,0.0254 0.50005,0.50005 0 0 0 0.14258,0.0449 0.50005,0.50005 0 0 0 0.084,0.006 h 1.5 v 0.5 a 0.50005,0.50005 0 0 0 1,0 V 445 h 1.5 a 0.50005,0.50005 0 0 0 0,-1 h -2 z" id="path13117" inkscape:connector-curvature="0"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 116.49023,436.00586 a 0.50005,0.50005 0 0 0 -0.34375,0.84766 L 117,437.70703 V 438.5 a 0.50005,0.50005 0 1 0 1,0 V 438 h 1 v 0.5 a 0.50005,0.50005 0 1 0 1,0 v -0.79297 l 0.85352,-0.85351 a 0.50005,0.50005 0 0 0 -0.70704,-0.70704 L 119.29297,437 h -1.58594 l -0.85351,-0.85352 a 0.50005,0.50005 0 0 0 -0.36329,-0.14062 z" id="path13119" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" transform="matrix(-1,0,0,1,173,-43.000005)" id="g13132" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect transform="scale(-1,1)" ry="0" rx="0" y="535" x="-63" height="16" width="16" id="rect13125" style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"/>
+ <path id="path13128" d="m 57.499996,537.50001 v 3 h -3 v -3 z m 4,10 v 3 h -3 v -3 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" d="m 54.5,538.50001 h -1 c -2.766857,0 -5,1.5 -5,4.5 0,3.5 3.5,6.5 9,6.5 h 1" style="opacity:1;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" id="path13130"/>
+ </g>
+ <g style="display:inline;enable-background:new" transform="translate(256.00881,83.993182)" id="g13140" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="path13134" d="m -101.5,410.5 v 3 h 2.999999 v -3 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m -92.500001,410.5 v 3 h 3 v -3 z" id="path13136"/>
+ <path sodipodi:nodetypes="cccccccccc" inkscape:connector-curvature="0" d="m -95.00881,411.50682 -2.5,12 m -3.712,-6.00682 H -91.5 m 1,-4 -2.04597,9.99668 h -9.97496 L -100.5,413.5 m 2,-2 h 6" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path13138"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g13176" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 14.5,478.5 h 5 v 2 h -11 v -2 h 4 V 474 c 0,-2 3,-2 3,0 v 4.5" id="path5504-6" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 8.5,480.25 v 2.25 c 0,1 -1,2 -2,2 v 2 h 3 l 2,-2 v 2 h 5 c 1.5,0 3,-1.25 3,-3 v -3.25" id="path5506-6" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 15.5,484.5 v 2" id="path5527-8" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <g transform="translate(-664,-513.00021)" style="display:inline;opacity:0.98999999;enable-background:new" id="g8745-3" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" id="path8739-6" d="m 1133.4971,569.20872 5.7529,-2.70851 h 0.5 l 5.75,2.70851 v 7.29286 l -6.0014,3.00295 -6.0015,-3.00295 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="cccccccc"/>
+ <path inkscape:connector-curvature="0" d="m 1139.5,579.25021 v -6.82405 m -5.9986,-2.92595 5.9986,2.92595 6.0014,-2.92595" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path8741-4" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g transform="translate(-801.00006,344.99979)" id="g13204" style="display:inline;opacity:0.98999999;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="path13198" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 1339.5,-269.49979 h 6 m -13.0137,12 h 13.0454 m -13.0317,-3 h 13 m -6,-3 h 6 m -6,-3 h 6" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc"/>
+ <path id="path13200" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 1332.5001,-266.49979 h 4 m -3.9995,2.99212 -5e-4,-4.99212 m 3.9917,0 5e-4,4.99212" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ <path transform="scale(1,-1)" d="m 1336.4923,268.59586 a 1.9958549,1.9039271 0 0 1 -0.9979,1.64884 1.9958549,1.9039271 0 0 1 -1.9959,0 1.9958549,1.9039271 0 0 1 -0.9979,-1.64884" sodipodi:open="true" sodipodi:end="3.1415927" sodipodi:start="0" sodipodi:ry="1.9039271" sodipodi:rx="1.9958549" sodipodi:cy="268.59586" sodipodi:cx="1334.4965" sodipodi:type="arc" id="path13202" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path4913-5-0" d="m 111.5,171.5 v -2 h 3 v -2" style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;opacity:1;enable-background:new" id="g10299-4" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="ccccc" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 258.46251,137.50711 v 3 h 3 v -3 z" id="path10253-1" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path10255-0" d="m 264.46251,137.50711 v 3 h 3 v -3 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="ccccc"/>
+ <path inkscape:connector-curvature="0" id="path10291-5" d="m 258.46251,143.50711 v 3 h 3 v -3 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" id="g10353-1" style="display:inline;opacity:0.6;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path10301-4" d="m 269.5,138.5 h 2 v 12 h -12 v -2.00551" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path10332-5" d="m 265.5,142.5 v 8" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 263.5,144.5 h 8" id="path10348-2" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g10412-3" transform="matrix(0,1,1,0,142,-141.99288)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g transform="translate(21)" id="g10365-3" style="opacity:0.6">
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path10359-8" d="m 265.49288,141.25 v 0.5 m 0.007,5.75 v 3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 268.5,144.5 h 3" id="path10361-6" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 268.5,138.5 h 3 v 12 h -12 v -3.00551 M 259.493,141.75 v -0.5" id="path10363-3" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc"/>
+ </g>
+ <path sodipodi:nodetypes="ccccc" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 287.5,137.5 h -8 v 2 h 8 z" id="path7987-2-4" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path10394-5" d="m 287.5,143.5 h -8 v 2 h 8 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g transform="translate(41.999998,4.4999696e-6)" id="g10402-9" style="display:inline;opacity:0.6;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path10396-4" d="m 265.5,147.5 v 3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 268.5,144.5 h 3" id="path10398-1" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 268.5,138.5 h 3 v 12 h -12 v -3.00551" id="path10400-4" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <path sodipodi:nodetypes="ccccc" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 308.5,137.5 h -8 v 8 h 8 z" id="path10404-8" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;opacity:0.6;enable-background:new" id="g10431-7" transform="matrix(1,0,0,-1,52.999998,288.99725)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path10427-2" d="m 268.5,144.5 h 4" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path10429-4" d="m 272.5,138.5 v 12 h -4 v -12.00275 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ </g>
+ <g transform="translate(61.999998,-0.0027455)" id="g10437-5" style="display:inline;opacity:0.6;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 267.5,144.5 h 5" id="path10433-9" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 271.5,147.5 v 3 h -4 v -3.00275" id="path10435-7" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ </g>
+ <path inkscape:connector-curvature="0" id="path10439-8" d="m 334.5,137.49725 h -6 v 8 h 6 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g transform="translate(62.999998,189)" id="g13463" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cccccccccc" inkscape:connector-curvature="0" id="path13456" d="m 153.5,231.5 v -7 h 2 l 3,-3 h 1 V 221.78125 234.5 h -1 l -3,-3 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <path id="path13461" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 162.61187,224.45978 a 7.5,7.5 0 0 1 0.007,7.06642 m 2.87849,-8.00393 a 10.5,10.5 0 0 1 -0.008,8.97264" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-274.03132,440.00025)" style="display:inline;opacity:0.98999999;enable-background:new" id="g13513" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <ellipse ry="1.8505777" rx="2.6123617" cy="271.76627" cx="449.18036" transform="matrix(0.93906356,-0.34374357,0.26023251,0.96554598,0,0)" id="ellipse13504" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.75688183px;marker:none;enable-background:accumulate"/>
+ <ellipse style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.75688159px;marker:none;enable-background:accumulate" id="ellipse13506" transform="matrix(0.93906459,-0.34374075,0.26023476,0.96554537,0,0)" cx="458.16425" cy="273.92776" rx="2.6123834" ry="1.8505788"/>
+ <path id="path13509" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 503.53131,106.49975 -1e-5,-10 h -9 l 1e-5,11" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" d="m 503.53131,97.49975 h -9 l -1e-5,-1 h 9 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path13511"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" id="g12940-5" style="display:inline;opacity:1;stroke:#ffffff;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="path12897-5" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" sodipodi:type="arc" sodipodi:cx="411.49976" sodipodi:cy="585.58588" sodipodi:rx="5.9997559" sodipodi:ry="5.8686118" sodipodi:start="5.2359878" sodipodi:end="4.1887902" d="m 414.49963,580.50351 a 5.9997559,5.8686118 0 0 1 2.79544,6.60128 5.9997559,5.8686118 0 0 1 -5.79531,4.3497 5.9997559,5.8686118 0 0 1 -5.79532,-4.34971 5.9997559,5.8686118 0 0 1 2.79544,-6.60127" sodipodi:open="true"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 411.49975,585.4548 v -7" id="path45268-0-8" sodipodi:nodetypes="cc"/>
+ </g>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 384.5,586.5 4,5 9,-13" id="path12886-7" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g id="g13605" transform="matrix(0.865747,0,0,0.8657508,60.950854,78.535286)" style="display:inline;stroke-width:1.15506935;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g12683-7-2" style="display:inline;opacity:1;stroke-width:1.15506935;enable-background:new" transform="matrix(1,0,0,-1,-21.00001,1085.9999)">
+ <g id="g12648-1-4" inkscape:transform-center-y="9.9999999e-006" inkscape:transform-center-x="-1.2499" transform="rotate(90,475.00001,500.9999)" style="stroke-width:1.15506935"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.15506935;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 467.50001,508.4999 -0.008,-4.61291 h 4.62029" id="path12655-3-4" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" transform="matrix(0,-1,-1,0,954.9999,1060.0001)" inkscape:transform-center-y="9.9999999e-006" inkscape:transform-center-x="-1.2499" id="g13615" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" sodipodi:nodetypes="cc" d="M 478.50011,498.4999 475,501" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" id="path13609" inkscape:transform-center-y="-0.69642857"/>
+ <path inkscape:transform-center-x="-0.69643" inkscape:transform-center-y="1.4299999e-006" id="path13611" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 471.50001,499.4999 3.5,1.5" sodipodi:nodetypes="cc" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ <rect transform="scale(-1,1)" ry="1" rx="1" y="500" x="-476" height="2" width="2" id="rect13613" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <path d="m 448.37682,581.75346 a 6.4930882,6.4930882 0 0 1 7.98749,-2.80079 6.4930882,6.4930882 0 0 1 3.96973,7.47568 6.4930882,6.4930882 0 0 1 -6.79395,5.04843 6.4930882,6.4930882 0 0 1 -6.01241,-5.95781" sodipodi:end="3.0615807" sodipodi:start="3.6651914" sodipodi:ry="6.4930882" sodipodi:rx="6.4930882" sodipodi:cy="585" sodipodi:cx="454" sodipodi:type="arc" id="path13619" style="display:inline;opacity:0.98999999;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" sodipodi:open="true" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;opacity:1;enable-background:new" id="g10027-7" transform="translate(109,-110)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="sssssccccccccccccc" inkscape:connector-curvature="0" id="path9906-8-8" d="m 264.5,688 c -1.933,0 -3.5,1.567 -3.5,3.5 0,1.933 1.567,3.5 3.5,3.5 1.933,0 3.5,-1.567 3.5,-3.5 0,-1.933 -1.567,-3.5 -3.5,-3.5 z m -0.5,1 h 1 v 2 h 2 v 1 h -2 v 2 h -1 v -2 h -2 v -1 h 2 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <g id="g9914-5" transform="translate(99.99999,195.99938)" style="display:inline;opacity:0.6;vector-effect:none;fill:#5fd38d;fill-opacity:1;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new">
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png" id="path9910-5" d="m 157.5,493.5 2.00001,6.2e-4 m 5,6.9994 v 5 h -10 l -1e-5,-6.9929" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" sodipodi:nodetypes="cccccc"/>
+ <path inkscape:connector-curvature="0" id="path9912-4" d="m 154.5,496.5 h 3 v -3 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" sodipodi:nodetypes="cccc"/>
+ </g>
+ </g>
+ <g transform="translate(365,4.4999696e-6)" id="g13349" style="display:inline;opacity:0.6;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="csccccccccccccssc" id="path13343" d="m -20.5,583 v 3 c 0,1.66667 0,2.25 -1,3.5 v 2 h 1 1 l 2,-1.75 1.75,1.75 h 0.5 l 1.75,-1.75 1.75,1.75 h 1.25 v -2 -1 -5.5 c 0,-2.76 -2.24,-4.5 -5,-4.5 -2.76,0 -5,1.74 -5,4.5 z" style="display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:accumulate"/>
+ </g>
+ <path id="path13368" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 346.5,582.5 c 2,2 2,2 2,2 m 0,-2 -2,2 v 0 m 4,-2 c 2,2 2,2 2,2 m 0,-2 -2,2" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96" inkscape:connector-curvature="0"/>
+ <g style="display:inline;enable-background:new" id="g13591" transform="translate(-21.000002,4.4999696e-6)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g13499">
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png" id="path13540" d="m 197.49996,536.50694 9.99999,-0.003 v 10.99979 m 0,1.1e-4 -10.00001,0.003 M 197.5,549.5 h 10" style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="ccccccc"/>
+ <path inkscape:connector-curvature="0" id="path13546" d="m 197.5,549.49346 a 0.99345803,0.99345803 0 0 1 -0.86036,-0.49673 0.99345803,0.99345803 0 0 1 0,-0.99346 0.99345803,0.99345803 0 0 1 0.86036,-0.49673" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 197.5,536.50654 c -0.35493,0 -0.6829,0.18935 -0.86036,0.49673 -0.0891,0.15447 -0.14009,0.32434 -0.13964,0.49673 v 11" id="path13563"/>
+ </g>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" d="m 199.5,541.5 h 5 m -5,-2 h 5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="path13581"/>
+ </g>
+ <path sodipodi:nodetypes="cssssccc" inkscape:connector-curvature="0" id="path8292" d="m 279.99163,444.06772 c 1,0 2.44272,-0.78857 2,-2.5 -0.2961,-1.14463 -1.15847,-2.33571 -1,-4 0.42655,-4.47973 11.26322,-2.75395 10.99327,4.49567 -0.0616,1.65561 -1.29015,2.22989 -2.54015,1.89495 -1.99001,-0.53322 -2.45018,-2.89495 -2.45018,-4.89495 m 2,-6 c 0.75,-0.75 1.81377,-1 2.99033,-1" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g13689" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="ccccc" d="m 175.69753,627.42614 h 5 m -3,3 -3,-3 3,-3" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path12420-5" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path13677" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 186.69811,627.42614 h -6 m 4,3 3,-3 -3,-3" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g transform="translate(20.999998,42.000005)" id="g13532" style="display:inline;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g13473" transform="translate(21,-21)">
+ <path id="path13441" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 304.5,360.5 h 5 m -5,-13 h 4.997" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <path d="m 300.5,351.5 v 5 m 13,-5 v 5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path13444" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 300.5,348.5 1,-1" id="path13454" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path13464" d="m 312.5,347.5 1,1" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path inkscape:connector-curvature="0" id="path13469" d="m 300.5,359.5 1,1" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 313.5,359.5 -1,1" id="path13471" inkscape:connector-curvature="0"/>
+ </g>
+ <path id="path13475" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 329.5,328.5 h 3 v 3 h -3 z m -3,0 h 3 v 3 h -3 z m -3,0 h 3 v 3 h -3 z" inkscape:connector-curvature="0"/>
+ <path d="m 329.5,331.5 h 3 v 3 h -3 z m -3,0 h 3 v 3 h -3 z m -3,0 h 3 v 3 h -3 z" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path13477" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path13530" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 329.5,334.5 h 3 v 3 h -3 z m -3,0 h 3 v 3 h -3 z m -3,0 h 3 v 3 h -3 z"/>
+ </g>
+ <g transform="translate(105,42.000005)" id="g13555-2" style="display:inline;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="ccccccc" d="m 199.57687,328.5 h 6.92308 v 6.92309 l -2.07692,2.07692 h -6.92308 v -6.92309 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path13549-7" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path13551-9" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="M 204.5,330.5 205,330 m -5.5,0.5 h 5 v 5" sodipodi:nodetypes="ccccc"/>
+ <path id="path13553-1" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 206.5,338.5 1,-1 m -11,-9 1,-1 m 3.00712,11.99995 h -1 m 5,0 h -1 m 4.99283,-5 v 1 m 0,-5 v 1 M 200.5,326.5 h -1 m 5,0 h -1 m 5,1 -1,-1 m -12,5 v -1 m 0,5 v -1 m 1,5 -1,-1" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccccccccccccc"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g13624" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cssssssc" inkscape:connector-curvature="0" d="m 493.49998,458.49288 c -0.5,0 -1,-0.5 -1,-1 v -2 c 0,-1.65686 1.34315,-3.00001 3.00356,-3.00001 h 1.00356 c 1.66041,0 3.00356,1.34315 3.00356,3.00001 v 2 c 0,0.5 -0.5,1 -1,1" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path6737-5"/>
+ <path id="path6745-8" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 496.03663,462.50856 c 2.58754,0 3.06723,-1.67438 3.40148,-2.60165 1.89247,0.86787 3.07257,1.79691 3.07257,3.08597 v 2.5 H 489.5 v -2.5 c 0,-1.2951 1.1959,-2.18539 3.09414,-3.05685 0.35818,0.92432 0.85495,2.57253 3.44249,2.57253 z" inkscape:connector-curvature="0" sodipodi:nodetypes="zcsccscz"/>
+ </g>
+ <path sodipodi:nodetypes="cscccc" inkscape:connector-curvature="0" d="m 136.50019,476.5 c 0.0169,0.84767 0.12519,1.46128 -0.0741,1.93512 -1.10273,2.62182 -4.83478,0.75569 -3.67593,8.06488 h 8.75619 C 140,477 146.74381,483 145.25,474.5 h -6.74381" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path13566" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path id="path12739-3" d="m 135.50881,473.49318 v 3 h 2.21289 0.78711 v -3 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 160.5,431 a 1.5,1.5 0 0 0 -1.5,1.5 1.5,1.5 0 0 0 0.0879,0.5 h -4.56836 a 1.50015,1.50015 0 1 0 0,3 H 158 v 1.94922 c -1.31983,1.3363 -2.47353,2.76999 -2.9707,5.25586 a 1.50015,1.50015 0 1 0 2.9414,0.58984 c 0.37009,-1.85045 0.99513,-2.60285 2.0293,-3.6289 1.03417,1.02605 1.65921,1.77845 2.0293,3.6289 a 1.50015,1.50015 0 1 0 2.9414,-0.58984 c -0.49717,-2.48587 -1.65087,-3.91956 -2.9707,-5.25586 V 436 h 3.48047 a 1.50015,1.50015 0 1 0 0,-3 h -2.53711 c -0.0387,0.18925 -0.094,0.37697 -0.17774,0.55664 C 162.35553,434.4361 161.47038,435 160.5,435 a 0.50005,0.50005 0 1 1 0,-1 1.5,1.5 0 0 0 0.41406,-0.0586 c 0.009,-0.002 0.0169,-0.005 0.0254,-0.008 a 1.5,1.5 0 0 0 0.35157,-0.16211 c 0.006,-0.004 0.0133,-0.006 0.0195,-0.01 a 1.5,1.5 0 0 0 0.004,-0.002 1.5,1.5 0 0 0 0.29102,-0.25 c 0.009,-0.0103 0.0202,-0.0187 0.0293,-0.0293 a 1.5,1.5 0 0 0 0.21484,-0.33008 c 0.003,-0.006 0.007,-0.01 0.01,-0.0156 0.002,-0.005 0.004,-0.0104 0.006,-0.0156 A 1.5,1.5 0 0 0 162,432.5 1.5,1.5 0 0 0 160.5,431 Z" id="path13634" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" transform="translate(279,-273)" id="g13588" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="ccccccccccscccssscccsccc" inkscape:connector-curvature="0" d="m -197.5,307.25 -2,-1.75 h -2 l -1,1 h -1 l -1,-1 h -2 l -2,1.75 v 2.25 h -2 v 1.49999 c 0,1.5 2.125,2 3.25,1 l -0.25,-0.5 2,2.25 v 2.5 c 0,1.5 1.25,2.25 2.5,2.25 1.25,0 2.5,-0.75 2.5,-2.25 v -2.5 l 2,-2.25 -0.25,0.5 c 1.125,1 3.25,0.5 3.25,-1 V 309.5 h -2 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path13580"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path13582" d="M -205.5,309.5 V 309 l 0.5,-0.5 h 0.5" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <path sodipodi:nodetypes="cccc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m -200.5,308.5 h -0.5 l -0.5,0.5 v 0.5" id="path13584" inkscape:connector-curvature="0"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m -203.5,311.49999 h 1" id="path13586" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <path sodipodi:nodetypes="ccccc" d="m 102.5,65.500005 -11.000002,-11 m 5.00002,11.00505 h 6.000002 v -6" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path13662" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:connector-curvature="0" id="path13665" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 112.5,54.500055 11,11 m -5.00002,-11.00505 h -6 v 6" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:nodetypes="ccc" id="path13549" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 428.49493,604.5 4,4 4,-4" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:connector-curvature="0" d="m 410.5,602.5 4,4 -4,4" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path13551" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" transform="rotate(-180,307.00525,417)" id="g13597" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="csszc" inkscape:connector-curvature="0" id="path13588" d="m 332.5,413.5 v 1.5 c 0,2.25 -2.02055,3.85052 -5,3.5 -4.25,-0.5 -6.25,-4.25 -4.25,-6.25 2,-2 5.75,-0.25 6.25,4" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 334.50525,410.5 v 3 h -3 v -3 z" id="path13593"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 324.50525,420.5 v 3 h -3 v -3 z" id="path13595"/>
+ <path style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 324.5,421.5 h 1.5 c 1.051,0 1.99594,-0.39189 2.5,-1" id="path13599" inkscape:connector-curvature="0" sodipodi:nodetypes="csc"/>
+ </g>
+ <g id="g13578" transform="translate(-106,190)" style="display:inline;opacity:0.6;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" style="fill:none;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="M 411.49912,414.98781 411.5,413 c 6.6e-4,-1.5 -1,-2.5 -2.49955,-2.49989 C 407.5,410.5 406.5,411.5 406.5,413 l 0.002,0.98781" id="path13559" sodipodi:nodetypes="csccc" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90"/>
+ <path style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 417.5,415.49994 h -7 v 5.00003 h 7 z" id="path13565" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path id="path13567" d="m 413,416.99999 h 2 V 418 h -2 z" style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.29999995;marker:none;enable-background:accumulate" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.29999995;marker:none;enable-background:accumulate" d="m 414,416.99999 h 1 V 419 h -1 z" id="path13553"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13644" transform="matrix(-1,0,0,1,887.03864,20.000005)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="csc" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 448.53675,418.48742 c 1.26521,1.13004 2.31955,3.01344 5.48257,3.01344 3.16302,0 4.21736,-1.8834 5.48257,-3.01344" id="path13621" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path13623" d="m 448.53675,418.48362 c 1.26521,-1.13004 2.31955,-3.01344 5.48257,-3.01344 3.16302,0 4.21736,1.8834 5.48257,3.01344" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="csc"/>
+ <circle r="2" cy="417" cx="454" id="path13627" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <path sodipodi:nodetypes="csc" style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 417.50189,438.48742 c -1.26521,1.13004 -2.31955,3.01344 -5.48257,3.01344 -3.16302,0 -4.21736,-1.8834 -5.48257,-3.01344" id="path13646" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path13659" d="m 479.5,437.5 -3.75,1.25 -1.25,3.75 -4.00005,-9.00118 z" style="display:inline;opacity:1;fill:#ffffff;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="M 453.5,442.5 449.49995,433.49882 458.5,437.5" id="path13534" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <rect style="display:inline;opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="rect13550" width="16" height="16" x="488.00128" y="430.00018" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g transform="translate(315,-0.999995)" id="g13630" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cccccccccc" inkscape:connector-curvature="0" id="path13624" d="m 154.5,230.5 v -4 h 1.75 l 3,-3 h 0.25 v 0.28125 9.71875 h -0.25 l -3,-3 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <path id="path13628" transform="scale(-1,1)" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m -162.50375,226.50434 a 0.00526938,4.2363691 0 0 1 1e-5,3.99146 m -1.99362,-5.98962 a 10.5,9.3489056 0 0 0 0.008,7.98899" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-21.000002,4.4999696e-6)" id="g21148" style="display:inline;opacity:0.6;enable-background:new">
+ <path id="path13638" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 476.5,225.5 4,4 m 0,-4 -4,4" inkscape:connector-curvature="0"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 469.5,229.5 v -4 h 1.75 l 2.25,-3 h 1 v 0.28125 9.71875 h -1 l -2.25,-3 z" id="path13642" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13967" transform="translate(-1.8536743e-6,84.000005)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g transform="translate(105,21)" id="g13641" style="display:inline;enable-background:new">
+ <path id="path13639" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 206.5,338.5 1,-1 m -11,-9 1,-1 m 3.00712,11.99995 h -1 m 5,0 h -1 m 4.99283,-5 v 1 m 0,-5 v 1 M 200.5,326.5 h -1 m 5,0 h -1 m 5,1 -1,-1 m -12,5 v -1 m 0,5 v -1 m 1,5 -1,-1" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccccccccccccc"/>
+ </g>
+ <path id="rect13643" d="m 302,352 h 7 v 7 h -7 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 304.25,349 h 7 l -2,2 h -7 z" id="path13647"/>
+ <path id="path13652" d="m 312,356.75 v -7 l -2,2 v 7 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" inkscape:connector-curvature="0"/>
+ </g>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 157.5,536 c -0.82251,0 -1.5,0.6775 -1.5,1.5 v 8 c 1e-5,0.41125 0.16922,0.78445 0.44141,1.05664 C 156.71359,546.82883 157.08875,547 157.5,547 h 0.5 c 0.45232,0 1,0.47106 1,0.99805 0,0.26349 -0.1383,0.51259 -0.33203,0.69726 C 158.47455,548.879 158.22499,549 158,549 v -0.5 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 -1.38664,0 -2.5,-1.11336 -2.5,-2.5 v -4 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 h -1 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 8 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 4 0.5 c 1.04866,-10e-4 2,-0.8716 2,-2.00195 V 546.5 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 h -1.5 -0.5 c -0.28206,0 -0.5,-0.21794 -0.5,-0.5 0,-0.28206 0.21794,-0.5 0.5,-0.5 h 9 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 V 542 h -2 v -3 h 2 v -2.5 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m -0.5,1 h 1 v 1 h -1 z m 2,0 h 1 v 1 h -1 z m 2,0 h 1 v 1 h -1 z m 2,0 h 1 v 1 h -1 z m 2,0 h 1 v 1 h -1 z m -8,2 h 3 v 3 h -3 z m 4,0 h 3 v 3 h -3 z m -4,4 h 1 v 1 h -1 z m 2,0 h 1 v 1 h -1 z m 2,0 h 1 v 1 h -1 z m 2,0 h 1 v 1 h -1 z m 2,0 h 1 v 1 h -1 z" id="path13810" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" transform="rotate(-90,349.00001,354)" id="g13933" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g13929" transform="translate(21,-21)">
+ <path id="path13917" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 304.5,360.5 9,-2" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path d="m 300.5,352.5 v 5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path13919" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" id="path13923" d="m 312.5,347.5 h 1" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" id="path13925" d="m 300.5,360.5 h 1" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" d="m 300.5,349.5 9,-2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path13935"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path13938" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:1, 3;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="M 313.5,350.5 V 350.96875 355.5"/>
+ </g>
+ <path id="path13931" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 323.5,330.5 9,-2 v 7 l -9,2 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13226" transform="translate(-189,84.000005)">
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:connector-curvature="0" style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate" d="m 476,466 0.15625,-1.90625 c 0.6231,-0.14227 1.07677,-0.25145 1.59375,-0.59375 l 1.75,1.5 1.5,-1.5 -1.5,-1.75 c 0.34229,-0.51699 0.45148,-0.97065 0.59375,-1.59375 L 482,460 v -1 -1 l -1.90625,-0.15625 C 479.95148,457.22065 479.8423,456.76698 479.5,456.25 l 1.5,-1.75 -1.5,-1.5 -1.75,1.5 c -0.51699,-0.34229 -0.97065,-0.45148 -1.59375,-0.59375 L 476,452 h -1 -1 l -0.15625,1.90625 c -0.6231,0.14227 -1.07677,0.25145 -1.59375,0.59375 l -1.75,-1.5 -1.5,1.5 1.5,1.75 c -0.34229,0.51699 -0.45148,0.97065 -0.59375,1.59375 L 468,458 v 1 1 l 1.90625,0.15625 c 0.14227,0.6231 0.25145,1.07677 0.59375,1.59375 l -1.5,1.75 1.5,1.5 1.75,-1.5 c 0.51699,0.34229 0.97065,0.45148 1.59375,0.59375 L 474,466 h 1 z m -1,-4 c -1.65685,0 -3,-1.34315 -3,-3 0,-1.65685 1.34315,-3 3,-3 1.65685,0 3,1.34315 3,3 0,1.65685 -1.34315,3 -3,3 z" id="path52982-3"/>
+ <circle inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" r="3" cy="459.00003" cx="475" id="path13629" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g style="display:inline;enable-background:new" transform="translate(62.999998,-191)" id="g13650" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" id="path13643" d="m 448.53675,418.48742 c 1.26521,1.13004 2.31955,3.01344 5.48257,3.01344 3.16302,0 4.21736,-1.8834 5.48257,-3.01344" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="csc"/>
+ <path sodipodi:nodetypes="csc" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 448.53675,418.48362 c 1.26521,-1.13004 2.31955,-3.01344 5.48257,-3.01344 3.16302,0 4.21736,1.8834 5.48257,3.01344" id="path13645" inkscape:connector-curvature="0"/>
+ <circle style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle13648" cx="454" cy="417" r="2"/>
+ </g>
+ <path inkscape:connector-curvature="0" id="path13692" d="m 490.53675,227.48742 c 1.26521,1.13004 2.31955,3.01344 5.48257,3.01344 3.16302,0 4.21736,-1.8834 5.48257,-3.01344" style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="csc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <circle style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path13733" cx="540.5" cy="267.5" r="4" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" transform="translate(41.999998,4.4999696e-6)" id="g13710" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 406.75,66.5 h 10.5 c 1,0 1.79167,-1.25 0.75,-2.5 l -4.5,-5.5 v -3 l 1,-1 v -1 h -5 v 1 l 1,1 v 3 L 406,64 c -1,1.25 -0.25,2.5 0.75,2.5 z" id="path13700" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccc"/>
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 410,62.5 -1.75,2 h 7.5 l -1.75,-2 z" id="path13708" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g transform="translate(-405.99706,-183.50454)" id="g13642" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 695.49706,256.50454 c -1.933,0 -3.5,1.567 -3.5,3.5 0,1.933 1.567,3.5 3.5,3.5 1.933,0 3.5,-1.567 3.5,-3.5 0,-1.933 -1.567,-3.5 -3.5,-3.5 z m -0.5,1 h 1 v 2 h 2 v 1 h -2 v 2 h -1 v -2 h -2 v -1 h 2 z" id="path13640" inkscape:connector-curvature="0" sodipodi:nodetypes="sssssccccccccccccc"/>
+ </g>
+ <g style="display:inline;opacity:0.6;enable-background:new" transform="translate(-168,-271)" id="g13703" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect ry="0" rx="0" y="344" x="446" height="16" width="16" id="rect13644" style="display:inline;opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <path sodipodi:nodetypes="cccscsscccc" inkscape:connector-curvature="0" d="m 449.5,356.5 v -4 h 11 v 4.99999 c 0,0.5 -0.5,1 -1,1 h -11 c -0.5,0 -1,-0.5 -1,-1 V 347.5 h 4 v 0.99201 l 1,0.008" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" id="path13699"/>
+ <rect y="347.5" x="447.5" height="1.50001" width="4" id="rect13701" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <g style="display:inline;opacity:1;stroke-width:1.14285719;enable-background:new" id="g13938" transform="matrix(0.875,0,0,0.875,-254.625,-304.87495)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;stroke:none;stroke-width:3.42857146;marker:none;enable-background:accumulate" id="rect13853" width="16" height="16" x="299" y="408.99994"/>
+ </g>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 449,473 c -0.52447,0 -1.0237,0.21715 -1.39258,0.57617 C 447.23866,473.93533 447,474.43678 447,475.00195 V 485 c 8e-5,0.53017 0.21103,1.03915 0.58594,1.41406 C 447.96085,486.78897 448.46978,487 449,487 h 2.5 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -10 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 H 449 c -0.45232,0 -1,-0.47106 -1,-0.99805 0,-0.26349 0.1383,-0.51454 0.33203,-0.69922 C 448.52545,474.11905 448.77501,474 449,474 v 0.5 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 0.5 v -1 h 2 v 1.0625 c 0.2597,0.0635 0.46453,0.17155 0.61523,0.32227 0.15072,0.1507 0.25876,0.35553 0.32227,0.61523 H 454 v -2 h 2 v 2 h 2 v -2 h 2 v 2 h -2 v 2 h 2 v 2 h -2 v 2 h 2 v 2 h -2 v -2 h -2 v 2 h -2 v -2 h -1 v 2.5 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 7 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -11 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 h -11 z m 5,9 h 2 v -2 h -2 z m 0,-2 v -2 h -1 v 2 z m 0,-2 h 2 v -2 h -2 z m 2,0 v 2 h 2 v -2 z" id="path13895" inkscape:connector-curvature="0" sodipodi:nodetypes="scscssccccssccccccccccccccccccccccccccccccccccccccccscccccccccccccccccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g id="g13932" transform="translate(-357,189)" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <rect style="display:inline;opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="rect13928" width="16" height="16" x="446" y="346" rx="0" ry="0"/>
+ <path id="path13930" style="fill:#ffffff;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" d="m 457.5,353.5 h 3 v 5.99999 c 0,0.5 -0.5,1 -1,1 h -11 c -0.5,0 -1,-0.5 -1,-1 V 348.5 h 4 v 0.99201 l 6,0.008 V 351.5 h -9 v 7 h -1 v 1 c 0,0.5 0.5,1 1,1 h 0.5 c 0.75,0 1.5,-0.75 1.5,-1.5 v -5.5 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccscsscccccccccccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13993" transform="translate(-21.000002,-20.999995)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path13936" d="m 134.49995,557.50005 h -2 v 13 h 13 v -8" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path sodipodi:nodetypes="ccsssssssssssssccc" inkscape:connector-curvature="0" id="path12191-1" d="m 136.5,557 c -0.25,0 -0.5,0.25 -0.5,0.5 v 5.5 c 0,0.5 0.25,1 1,1 0.75,0 1,-0.5 1,-1 v -1 c 0,-0.5 0.53412,-1 1,-1 0.55229,0 1,0.44772 1,1 v 3.5 c 0,0.82843 0.67157,1.5 1.5,1.5 0.82843,0 1.5,-0.67157 1.5,-1.5 V 562 c 0,-0.55228 0.44772,-1 1,-1 h 0.5 c 0.85547,0 1.5,-0.66406 1.5,-1.5 v -2 c 0,-0.25 -0.25,-0.5 -0.5,-0.5 z" style="display:inline;opacity:0.7;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g14058" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 460.50004,545.49996 h -9 v -9 h 9 z" id="path14208" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path14210" d="m 458.50004,547.49996 h -9 v -9" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 456.50004,549.49996 h -9 v -9" id="path14212" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path14252" d="m 460.50004,545.49996 h -9 l 9,-9 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13832" transform="translate(-1.8536743e-6,21.000005)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" id="path13771" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 328.49998,564.51219 v -7 m -3,5 3,3 3,-3" sodipodi:nodetypes="ccccc"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 334.5,567.5 h -2.75 c -0.5,0 -0.75,3 -3.25,3 -2.5,0 -2.75,-3 -3.25,-3 h -2.75" id="path13818" sodipodi:nodetypes="cszsc" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g13935" transform="translate(83.999998,42.000005)">
+ <path id="path13929" d="m 36,74 c -2.455669,0 -4.49388,1.771475 -4.916016,4.105469 0.482305,-0.09011 0.975221,-0.129499 1.470704,-0.07422 a 0.50017759,0.50017759 0 1 1 -0.111329,0.994141 c -0.485685,-0.05419 -0.971969,-0.01789 -1.4375,0.101562 0.06678,2.656434 2.202258,4.79532 4.857422,4.867188 0.121572,-0.473413 0.166164,-0.965209 0.109375,-1.455079 a 0.50005,0.50005 0 0 1 0.480469,-0.564453 0.50005,0.50005 0 0 1 0.513672,0.449219 c 0.05787,0.499184 0.03624,1.001242 -0.05469,1.490234 C 39.23754,83.484981 41,81.449595 41,79 41,76.23858 38.761426,74 36,74 Z m -1.494141,4.759766 a 0.50005,0.50005 0 0 1 0.28125,0.08984 c 0.540828,0.363139 1.00483,0.82779 1.367188,1.369141 a 0.50005,0.50005 0 1 1 -0.830078,0.556641 C 35.034326,80.342298 34.66314,79.9702 34.230469,79.679685 a 0.50005,0.50005 0 0 1 0.27539,-0.919922 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path d="m 35.700121,85.561075 a 4.5,4.5 0 0 1 -4.624542,1.842951 4.5,4.5 0 0 1 -3.493194,-3.546893 4.5,4.5 0 0 1 1.913281,-4.595891" sodipodi:end="4.1221993" sodipodi:start="0.60544465" sodipodi:ry="4.5" sodipodi:rx="4.5" sodipodi:cy="83" sodipodi:cx="32" sodipodi:type="arc" id="path13933" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:open="true"/>
+ </g>
+ <path id="path13985" style="display:inline;opacity:0.98999999;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 406.5,162.5 h 11 m -12,4 h 13 m -11,3 2,-9 m 7,9 -1.92905,-9.03885" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" id="g14370" transform="translate(20.999998,4.4999696e-6)">
+ <rect style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect14317" width="3.9838867" height="5" x="132.51611" y="74.5"/>
+ <rect y="74.5" x="141.51611" height="5" width="3.9838867" id="rect14319" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <rect y="82.5" x="132.51611" height="5" width="3.9838867" id="rect14321" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <rect style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect14323" width="3.9838867" height="5" x="141.51611" y="82.5"/>
+ </g>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:0.98999999;enable-background:new" id="g14226" transform="matrix(1,0,0,-1,-168.00001,1044)">
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="M 481.50002,500.99996 A 6.5000101,6.5000377 0 0 1 475,507.5 a 6.5000101,6.5000377 0 0 1 -6.5,-6.50004 6.5000101,6.5000377 0 0 1 6.5,-6.50004 6.5000101,6.5000377 0 0 1 6.50002,6.50004 z" id="path14216" inkscape:connector-curvature="0"/>
+ <g id="g14224" inkscape:transform-center-x="-1.2499" inkscape:transform-center-y="9.9999999e-006" transform="rotate(90,475.00001,500.9999)">
+ <path inkscape:transform-center-y="-0.69642857" id="path14218" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="M 478.50011,498.4999 475,501" sodipodi:nodetypes="cc" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" sodipodi:nodetypes="cc" d="m 471.50001,499.4999 3.5,1.5" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" id="path14220" inkscape:transform-center-y="1.4299999e-006" inkscape:transform-center-x="-0.69643"/>
+ <rect style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="rect14222" width="2" height="2" x="-476" y="500" rx="1" ry="1" transform="scale(-1,1)"/>
+ </g>
+ </g>
+ <path d="m 90.516119,83.500005 h 2.983879 v 3 h -2.983879 z m 0,-3 h 2.983879 v 3 h -2.983879 z m 0,-3 h 2.983879 v 3 h -2.983879 z m 0,-3 h 2.983879 v 3 h -2.983879 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path14438" inkscape:connector-curvature="0"/>
+ <path d="M 98.516119,77.500005 H 101.5 v 3 h -2.983881 z m 0,-3 H 101.5 v 3 h -2.983881 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path14440" inkscape:connector-curvature="0"/>
+ <rect style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect14442" width="1" height="1" x="95" y="75.000008"/>
+ <rect style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect14446" width="1" height="1" x="95" y="81.000008"/>
+ <rect y="78.000008" x="95" height="1" width="1" id="rect14448" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <rect y="75.000008" x="103" height="1" width="1" id="rect14450" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <rect style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect14452" width="1" height="1" x="103" y="78.000008"/>
+ <path d="M 111.51612,83.500005 H 114.5 v 3 h -2.98388 z m 0,-3 H 114.5 v 3 h -2.98388 z m 0,-3 H 114.5 v 3 h -2.98388 z m 0,-3 H 114.5 v 3 h -2.98388 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path14454" inkscape:connector-curvature="0"/>
+ <path id="rect14464" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 124,75.000005 h 1 v 1 h -1 z m -2,0 h 1 v 1 h -1 z m -2,0 h 1 v 1 h -1 z m -2,0 h 1 v 1 h -1 z m -2,0 h 1 v 1 h -1 z" inkscape:connector-curvature="0"/>
+ <path d="m 124,78.000005 h 1 v 1 h -1 z m -2,0 h 1 v 1 h -1 z m -2,0 h 1 v 1 h -1 z m -2,0 h 1 v 1 h -1 z m -2,0 h 1 v 1 h -1 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path14473" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path14475" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 124,81.000005 h 1 v 1 h -1 z m -2,0 h 1 v 1 h -1 z m -2,0 h 1 v 1 h -1 z m -2,0 h 1 v 1 h -1 z m -2,0 h 1 v 1 h -1 z"/>
+ <path inkscape:connector-curvature="0" id="path14479" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="M 98.516119,77.500005 H 101.5 v 3 h -2.983881 z m 0,-3 H 101.5 v 3 h -2.983881 z"/>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g14591">
+ <path id="path14584" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 7.75,80.5 h 3.5 m -4.74995,2.993444 v -0.17294 L 9.25,74.5 h 0.5 l 2.75005,8.820504 v 0.17294" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path14589" d="m 19.50005,87.5 h -5 l -5e-5,-0.75 5,-6.5 V 79.5 h -4.99995" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" sodipodi:nodetypes="cccccc"/>
+ </g>
+ <path inkscape:connector-curvature="0" d="m 69.499998,77.500005 h 10 m -10,3 h 7 m -7,3 h 4 m -4,3 h 1 m -1,-12 h 13" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path14593"/>
+ <path sodipodi:nodetypes="cccccc" inkscape:connector-curvature="0" d="m 37.499998,87.500005 -7,-12 m 0,12 7,-12 m -10,6 h 13" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path14603"/>
+ <path d="m 53.500772,81.000005 v -0.75 l -1,-0.75 c -1.16619,-0.874643 -2.000824,-1.935575 -2.000824,-3.374204 l 8.24e-4,-1.625796 m 3,6.5 v 0.75 l -1,0.75 c -1.16619,0.87464 -2.000824,1.93558 -2.000824,3.3742 l 8.24e-4,1.6258 m 4.999226,-6.5 v -0.75 l 1,-0.75 c 1.16619,-0.874643 2.000824,-1.935575 2.000824,-3.374204 l -8.24e-4,-1.625796 m -3,6.5 v 0.75 l 1,0.75 c 1.16619,0.87464 2.000824,1.93558 2.000824,3.3742 l -8.24e-4,1.6258 m -9,0 h 10 m -10,-13 h 10" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path14614" inkscape:connector-curvature="0"/>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g14148">
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" d="m 489.5,587.5 v 4 h 4 m 0,-4 -4.00005,4.00001" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path13105-4"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path14097" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 489.5,582.49794 v -4 h 4 m 0,4 -4.00005,-4.00001"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path14099" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 502.50202,587.5 v 4 h -4 m 0,-4 4.00005,4.00001"/>
+ <path sodipodi:nodetypes="ccccc" d="m 502.50202,582.49794 v -4 h -4 m 0,4 4.00005,-4.00001" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path14102" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g14154">
+ <path inkscape:connector-curvature="0" id="path14104" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 514.49995,591.50001 v -4 h -4 m 0,4 L 514.5,587.5"/>
+ <path d="m 514.49995,578.49793 v 4 h -4 m 0,-4 4.00005,4.00001" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path14115" inkscape:connector-curvature="0"/>
+ <path d="m 519.50207,591.50001 v -4 h 4 m 0,4 -4.00005,-4.00001" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path14139" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path14142" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 519.50207,578.49793 v 4 h 4 m 0,-4 -4.00005,4.00001"/>
+ </g>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g14256" transform="translate(-21.000002,4.4999696e-6)" style="display:inline;opacity:0.4;enable-background:new">
+ <path sodipodi:nodetypes="ccc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 92.5,326.5 4.5,5.5 4.5,-5.5" id="path14250" inkscape:connector-curvature="0"/>
+ <path id="path14254" d="m 91.25,334 c -0.683851,0 -1.25,0.56615 -1.25,1.25 v 3.5 c 0,0.68385 0.566149,1.25 1.25,1.25 h 3.5 c 0.683851,0 1.25,-0.56615 1.25,-1.25 v -3.5 C 96,334.56615 95.433851,334 94.75,334 Z m 8,0 c -0.683851,0 -1.25,0.56615 -1.25,1.25 v 3.5 c 0,0.68385 0.566149,1.25 1.25,1.25 h 3.5 c 0.68385,0 1.25,-0.56615 1.25,-1.25 v -3.5 c 0,-0.68385 -0.56615,-1.25 -1.25,-1.25 z m -7.75,4 h 2 1 a 0.50005,0.50005 0 1 1 0,1 h -1 -2 a 0.50005,0.50005 0 1 1 0,-1 z m 8,0 h 2 1 a 0.50005,0.50005 0 1 1 0,1 h -1 -2 a 0.50005,0.50005 0 1 1 0,-1 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" id="g12821-4" style="display:inline;opacity:0.6;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path class="st11" d="m 355.5,602 c 0,1.35416 -1.14583,2.5 -2.5,2.5 -1.35417,0 -2.5,-1.14584 -2.5,-2.5 0,-1.35417 1.14583,-2.5 2.5,-2.5 1.35417,0 2.5,1.14583 2.5,2.5 z" id="path2929-3" inkscape:connector-curvature="0" style="display:inline;fill:none;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="line3784-9" d="m 351,604 -8.5,8.5" style="display:inline;fill:#ffffff;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"/>
+ </g>
+ <path sodipodi:nodetypes="cccccccccccc" d="m 19.507198,125.50712 v 4 h -4 m -9.0071,-4 v 4 h 4 m 9.0071,-9.00707 v -4 h -4 m -9.0071,4 v -4 h 4" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path13927" inkscape:connector-curvature="0"/>
+ <path id="path14341" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 49.499998,12.500004 h -1 m 3,4 h -1 m 3,3 h -1 m 4,3.000001 h -1 m 3,1 h -1.5 m 4.5,1 h -2" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccc"/>
+ <g transform="matrix(-1,0,0,1,1290,302.99979)" style="display:inline;opacity:0.98999999;enable-background:new" id="g8530-0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path8523-4" d="m 1262.5,-278.49979 -4,-7 -4,7 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <ellipse cy="-287.49979" cx="1253.5" id="ellipse8525-5" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" rx="1" ry="1.0000036"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 1252.5,-278.49979 h -3 v -13 h 13 v 9" id="path8528-7" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <path inkscape:connector-curvature="0" d="m 49.499998,11.500004 h -1 m 3,4 h -1 m 3,3 h -1 m 4,3.000001 h -1 m 3,1 h -1.5 m 4.5,1 h -2" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" id="path14392" sodipodi:nodetypes="cccccccccccc"/>
+ <path sodipodi:nodetypes="cccccccccccccccccccccccccccccc" inkscape:connector-curvature="0" id="path14394" d="m 98.999998,11.000004 v 4.000002 h -1 -1 v 3 h -1 v -2 h -1 v 5.000001 h -1 v -2.000001 h -1 v 3.560548 h -1 v -2.085938 h -1 v 2.525389 h -1 v 2 L 104,25.000007 v -2.421875 h -1 v -4.578126 h -1 v 2.000001 h -1 v -6.000003 h -1.000002 v -3 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"/>
+ <path id="path14426" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 82.499998,14.500004 -5.49999,-3 h -1 l -5.50001,3 v 6.999991 l 5.50001,3.00001 h 1 l 5.49999,-3.00001 z m -6.246094,-2 -4.753906,2.59375 v 5.812501 l 4.755859,2.59375 h 0.488282 l 4.755859,-2.59375 v -5.812501 l -4.75,-2.59375 z" inkscape:connector-curvature="0"/>
+ <g style="display:inline;enable-background:new" id="g14475" transform="translate(-1.8536743e-6,25.000005)">
+ <g transform="matrix(1,0,0,-1,-294,368)" id="g4806-1" style="opacity:1">
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 311.5,378.5 h -11 v -3 h 11 z" id="path4801-8" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 313.5,381.5 h -11 v -3 h 11 z" id="path4804-1" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path4817-4" d="m 8.5,-0.5 h 11 v -3 h -11 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14588" transform="translate(-42.000002,25.000005)">
+ <path id="path14541" d="m 153.5,-9 c -0.27613,2.76e-5 -0.49997,0.2238691 -0.5,0.5 v 8 c 3e-5,0.27613094 0.22387,0.499972391047 0.5,0.5 h 8 c 0.27613,-2.7608953e-5 0.49997,-0.22386906 0.5,-0.5 v -8 c -3e-5,-0.2761309 -0.22387,-0.4999724 -0.5,-0.5 z m 6.5,1 c 0.54636,0 1,0.4536376 1,1 0,0.5463624 -0.45364,1 -1,1 -0.54636,0 -1,-0.4536376 -1,-1 0,-0.5463624 0.45364,-1 1,-1 z m -2.98047,1.75 c 0.17034,0.00643 0.32566,0.099184 0.41211,0.2460938 l 2.5,4.25 C 160.12825,-1.4202448 159.88728,-0.99936558 159.5,-1 h -5 c -0.38728,6.3442e-4 -0.62825,-0.4202448 -0.43164,-0.7539062 l 2.5,-4.25 c 0.0935,-0.1589489 0.26691,-0.2535338 0.45117,-0.2460938 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <g id="g14560" transform="translate(147)">
+ <path d="m 16.5,-2.5 h 3 v -3 h -3 m 3,-8 h -9 v 3 h 9 z" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path14558" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14668" transform="matrix(-1,0,0,1,530,30.000005)">
+ <path inkscape:connector-curvature="0" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 258.5,-19 c -0.27613,2.8e-5 -0.49997,0.223869 -0.5,0.5 v 13 c 3e-5,0.2761309 0.22387,0.4999724 0.5,0.5 h 13 c 0.27613,-2.76e-5 0.49997,-0.2238691 0.5,-0.5 v -13 c -3e-5,-0.276131 -0.22387,-0.499972 -0.5,-0.5 z m 1.5,2 h 6 v 4 h 4 v 6 h -6 v -4 h -4 z" id="path14664"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.89999986;marker:none;enable-background:accumulate" d="m 260,-17 h 6 v 4 h -2 v 2 h -4 z" id="path14666" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14825" transform="translate(-189,-315)">
+ <path style="display:inline;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;enable-background:new" d="m 405.49956,462.50818 c 1.00252,0 2.00505,1e-5 3.00757,1e-5 0,1.00272 0,2.00544 0,3.00817 -1.00252,0 -2.00505,-1e-5 -3.00757,-1e-5 0,-1.00273 0,-2.00545 0,-3.00817 z" id="path13882-8" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path14782" d="m 415.49956,452.50818 c 1.00252,0 2.00505,1e-5 3.00757,1e-5 0,1.00272 0,2.00544 0,3.00817 -1.00252,0 -2.00505,-1e-5 -3.00757,-1e-5 0,-1.00273 0,-2.00545 0,-3.00817 z" style="display:inline;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;enable-background:new"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new" d="M 410.49995,460.50712 413.5,457.5" id="path4913-5-0-5" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path14816" d="m 416.49995,458.50712 v 3 h -2 v 2 L 411.5,463.5" style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new" d="m 412.4929,454.50715 h -3 v 2 h -2 l 0.007,2.99996" id="path14818" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ </g>
+ <g transform="translate(-210,-315)" id="g14837" style="display:inline;opacity:0.6;enable-background:new">
+ <path inkscape:connector-curvature="0" id="path14827" d="m 405.49956,462.50818 c 1.00252,0 2.00505,1e-5 3.00757,1e-5 0,1.00272 0,2.00544 0,3.00817 -1.00252,0 -2.00505,-1e-5 -3.00757,-1e-5 0,-1.00273 0,-2.00545 0,-3.00817 z" style="display:inline;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;enable-background:new"/>
+ <path style="display:inline;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;enable-background:new" d="m 415.49956,452.50818 c 1.00252,0 2.00505,1e-5 3.00757,1e-5 0,1.00272 0,2.00544 0,3.00817 -1.00252,0 -2.00505,-1e-5 -3.00757,-1e-5 0,-1.00273 0,-2.00545 0,-3.00817 z" id="path14829" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cccccc" inkscape:connector-curvature="0" id="path14835" d="M 412.4929,454.50715 411.5,454.5 l -1,1 m -2,2 -1,1 -10e-5,1.00711" style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new" d="m 411.49974,463.50012 0.99291,0.007 1,-1 m 2,-2 1,-1 9e-5,-1.00711" id="path22198" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ </g>
+ <rect style="display:inline;opacity:0.55;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect13790" width="9" height="9" x="260.5" y="601.5" rx="0.53125" ry="0.53125"/>
+ <path inkscape:connector-curvature="0" id="path13905" d="M 282.03125,601 C 281.46859,601 281,601.46859 281,602.03125 v 7.9375 c 0,0.56266 0.46859,1.03125 1.03125,1.03125 h 7.9375 C 290.53141,611 291,610.53141 291,609.96875 v -7.9375 C 291,601.46859 290.53141,601 289.96875,601 Z m 6.94922,1.99023 a 1.0001,1.0001 0 0 1 0.72656,1.7168 l -4,4 a 1.0001,1.0001 0 0 1 -1.41406,0 l -2,-2 a 1.0001,1.0001 0 1 1 1.41406,-1.41406 l 1.29297,1.29297 3.29297,-3.29297 a 1.0001,1.0001 0 0 1 0.6875,-0.30274 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <circle style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path13966" cx="265" cy="627" r="4.5"/>
+ <circle r="4.5" cy="627" cx="286" id="circle13982" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <g style="display:inline;opacity:1;enable-background:new" transform="rotate(-180,-595.5,338)" id="g13628-5">
+ <path id="path13613-1" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m -1246.5,465.5 v 7 0 l 5,-3.25 v -0.5 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc"/>
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m -1250,466 v 6" id="path13625-2" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <g id="g13848" transform="matrix(1,0,0,-1,1322,676)" style="display:inline;opacity:1;enable-background:new">
+ <path sodipodi:nodetypes="ccccccc" inkscape:connector-curvature="0" d="m -1246.5,465.5 v 7 0 l 5,-3.25 v -0.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path13836"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path13846" d="m -1250,466 v 6" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ </g>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path14031" d="m 220.5,628.5 v -4.25 l 4.75,2.25 z" style="display:inline;fill:#ffffff;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;enable-background:new"/>
+ <circle inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="circle14040" cx="370" cy="627" r="1.5"/>
+ <path style="display:inline;fill:none;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 28.499998,432.5 h 11 l -5.5,11 z" id="path14201" inkscape:connector-curvature="0"/>
+ <g style="display:inline;enable-background:new" id="g14320" transform="translate(20.999998,42.000005)">
+ <circle r="1.4928788" cy="543" cx="286" id="path14282" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" d="m 282.5,537.5 3,3 3,-3 m -3,-1 v 5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path14291"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path14299" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 283.5,548.5 3,-3 3,3 m -3,1 v -5"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path14301" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 291.5,539.5 -3,3 3,3 m 1,-3 h -5"/>
+ <path sodipodi:nodetypes="ccccc" d="m 280.5,540.5 3,3 -3,3 m -1,-3 h 5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path14303" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14048" transform="translate(294,571)">
+ <g transform="matrix(-0.53033009,-0.53033009,-0.53033009,0.53033009,472.85846,-15.235808)" id="g13853" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none">
+ <path style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 301.34314,249.94281 h 11.31371" id="path13848" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" id="path13850" d="m 307,244.28596 v 11.31371" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" sodipodi:nodetypes="cc"/>
+ </g>
+ <path sodipodi:nodetypes="ccccccccccc" inkscape:connector-curvature="0" d="m 177.5,-49.5 v -6 m 0,3 h 1 m 2,0 h 1 m 2,0 h 1 m 0,3 3,-3 -3,-3" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path13907"/>
+ </g>
+ <g style="display:inline;enable-background:new" transform="rotate(-180,275.49999,225.99747)" id="g14033">
+ <path id="path14029" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 178.5,-72.492929 h -1 m -2,0 v 1 m 0,2 v 1 m 0,2 v 1 m 5,-7.007071 h 1 m 2,0 h 1 m 0,3 3,-3 -3,-3" inkscape:connector-curvature="0"/>
+ <circle style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle14031" cx="175.5" cy="-65.5" r="1"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14223" transform="rotate(-180,317.49493,236.50149)">
+ <g style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none" id="g14219" transform="matrix(-0.53033009,-0.53033009,-0.53033009,0.53033009,472.85846,-15.235808)">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path14182" d="m 301.34314,249.94281 h 11.31371" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
+ <path sodipodi:nodetypes="cc" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 307,244.28596 v 11.31371" id="path14217" inkscape:connector-curvature="0"/>
+ </g>
+ <path id="path14221" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 177.5,-49.5 v -6 m 0,3 h 1 m 2,0 h 1 m 2,0 h 1 m 0,3 3,-3 -3,-3" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14371" transform="matrix(1,0,0,-1,336,494)">
+ <g transform="matrix(1,0,0,-1,0,-99.00505)" id="g14352">
+ <path id="path14350" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 184.5,-71.5 3,-3 -3,-3" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ </g>
+ <path sodipodi:nodetypes="cc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 176.5,-29.5 v -1" id="path14355" inkscape:connector-curvature="0"/>
+ <circle transform="scale(-1)" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="circle14357" cx="-176.5" cy="33.5" r="1"/>
+ <path inkscape:transform-center-y="4.6250229" inkscape:transform-center-x="2.6634336" inkscape:connector-curvature="0" d="m 181.5,-25.25 -1,-0.25 m -2,-1 -1,-1 m 7,3 -1,-0.25" style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new" id="path14359" sodipodi:nodetypes="cccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14377" transform="translate(210,592)">
+ <path inkscape:connector-curvature="0" d="m 178.5,-72.492929 h -1 m -2,0 v 1 m 0,2 v 1 m 0,2 v 1 m 5,-7.007071 h 1 m 2,0 h 1 m 0,3 3,-3 -3,-3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path14373"/>
+ <circle r="1" cy="-65.5" cx="175.5" id="circle14375" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g style="display:inline;enable-background:new" transform="matrix(-1,0,0,1,676.99998,550)" id="g14389">
+ <g id="g14381" transform="matrix(1,0,0,-1,0,-99.00505)">
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" d="m 184.5,-71.5 3,-3 -3,-3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path14379"/>
+ </g>
+ <path inkscape:connector-curvature="0" id="path14383" d="m 176.5,-29.5 v -1" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" sodipodi:nodetypes="cc"/>
+ <circle r="1" cy="33.5" cx="-176.5" id="circle14385" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" transform="scale(-1)"/>
+ <path sodipodi:nodetypes="cccccc" id="path14387" style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new" d="m 181.5,-25.25 -1,-0.25 m -2,-1 -1,-1 m 7,3 -1,-0.25" inkscape:connector-curvature="0" inkscape:transform-center-x="2.6634336" inkscape:transform-center-y="4.6250229"/>
+ </g>
+ <g style="display:inline;enable-background:new" transform="translate(252,550)" id="g14244">
+ <g id="g14242">
+ <path sodipodi:nodetypes="ccccccccc" id="path14231" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 176.5,-27.512121 h -1 m 3,0.0071 h 1 m 2,0 h 1 m 0,-3 3,3 -3,3" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cc" id="path14240" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 187.5,-24.512121 v -6" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" d="m 174.5,-24.512121 v -6" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path14270" sodipodi:nodetypes="cc"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14265" transform="matrix(-1,0,0,1,593.00005,550)">
+ <g id="g14263">
+ <path inkscape:connector-curvature="0" d="m 176.5,-27.512121 h -1 m 3,0.0071 h 1 m 2,0 h 1 m 0,-3 3,3 -3,3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path14247" sodipodi:nodetypes="ccccccccc"/>
+ <path inkscape:connector-curvature="0" d="m 187.5,-24.512121 v -6" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path14261" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="cc" id="path14267" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 174.5,-24.512121 v -6" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14293" transform="translate(-42.000002,21.000005)">
+ <path sodipodi:nodetypes="sssss" inkscape:connector-curvature="0" id="path14380" d="m 82.499999,102.00001 c 0,3.58985 -2.910145,6.49999 -6.499999,6.49999 -3.589854,0 -6.499999,-2.91014 -6.499999,-6.49999 0,-3.589858 2.910145,-6.500002 6.499999,-6.500002 3.589854,0 6.499999,2.910144 6.499999,6.500002 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path d="M 76,108.25 C 75,107 74.5,105.25124 74.5,102.00062 74.5,98.75 75,97 76,95.75 m 5.5,3.75 h -11 m 11,5 h -11" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path14287" inkscape:connector-curvature="0"/>
+ </g>
+ <circle r="2.5" cy="123" cx="412" id="circle14295" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="ccccc" d="m 13.499978,55.505055 v 10 m -4,-7 4,-4 4,4" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path14327" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path14329" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 34.499978,64.512197 v -10 m -4,7 4,4 4,-4" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 202.5,621.00003 a 5.4999997,5.4999997 0 0 0 -5.5,5.5 5.4999997,5.4999997 0 0 0 5.5,5.5 5.4999997,5.4999997 0 0 0 5.5,-5.5 5.4999997,5.4999997 0 0 0 -5.5,-5.5 z m -0.002,1.98438 a 0.50005001,0.50005001 0 0 1 0.50781,0.52343 v 2.5 h 2.50195 a 0.50005001,0.50005001 0 1 1 0,0.99805 h -2.50195 v 2.50195 a 0.50005001,0.50005001 0 0 1 -0.50586,0.50586 0.50005001,0.50005001 0 0 1 -0.49219,-0.50586 v -2.50195 h -2.5 a 0.50005001,0.50005001 0 1 1 0,-0.99805 h 2.5 v -2.5 a 0.50005001,0.50005001 0 0 1 0.49024,-0.52343 z" id="path14370" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cccccccccccccccccccc" inkscape:connector-curvature="0" id="path14398" d="m 37.749998,213.5 -3.5,-3 h -0.5 l -3.5,3 h -0.75 v -0.75 l 1.5,-4.25 -3.5,-2.25 v -0.75 h 4.5 l 1.75,-5 h 0.248718 0.251282 l 1.75,5 h 4.5 v 0.75 l -3.5,2.25 1.5,4.25 -0.0037,0.745 z" inkscape:transform-center-y="-0.74285516" inkscape:transform-center-x="-0.010954063" style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <path style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" inkscape:transform-center-x="-0.010954063" inkscape:transform-center-y="-0.74285516" d="m 16.749998,213.5 -3.5,-3 h -0.5 l -3.5,3 h -0.75 v -0.75 l 1.5,-4.25 -3.5,-2.25 v -0.75 h 4.5 l 1.75,-5 h 0.248718 0.251282 l 1.75,5 h 4.5 v 0.75 l -3.5,2.25 1.5,4.25 -0.0037,0.745 z" id="path14401" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccccccccc"/>
+ <g transform="translate(0.99996615,4.4999696e-6)" id="g13708" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 48.5,578 c -0.276131,3e-5 -0.499972,0.22387 -0.5,0.5 L 47.9922,589 c 0,1.51667 1.219299,3 2.984374,3 1.765077,0 3.015625,-1.475 3.015626,-3 L 54,578.5 c -2.8e-5,-0.27613 -0.223869,-0.49997 -0.5,-0.5 z m 2.5,10 c 0.546362,0 1,0.45364 1,1 0,0.54636 -0.453638,1 -1,1 -0.546362,0 -1,-0.45364 -1,-1 0,-0.54636 0.453638,-1 1,-1 z" transform="translate(-0.99998)" id="path13694"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 58.492188,586 c -0.132599,2e-5 -0.259759,0.0527 -0.353516,0.14648 l -4.75,4.75 c -0.09377,0.0938 -0.14646,0.22092 -0.146484,0.35352 v 0.25 c 2.8e-5,0.27613 0.223869,0.49997 0.5,0.5 H 60.5 c 0.276131,-3e-5 0.499972,-0.22387 0.5,-0.5 v -5 c -2.8e-5,-0.27613 -0.223869,-0.49997 -0.5,-0.5 z" id="path13696" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccc"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.75;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 56.486328,579 c -0.130565,0.002 -0.25534,0.0541 -0.347656,0.14648 l -2,2 c -0.09377,0.0938 -0.14646,0.22092 -0.146484,0.35352 v 6 c 1.71e-4,0.44532 0.538516,0.6683 0.853515,0.35352 l 5,-5 c 0.19519,-0.19527 0.19519,-0.51177 0,-0.70704 l -3,-3 C 56.750515,579.05126 56.620954,578.99846 56.486328,579 Z" id="path13698" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g9998" transform="matrix(-1,0,0,1,907.99986,4.6999695e-6)">
+ <g transform="matrix(-0.61504365,0,0,0.61502939,510.71013,122.71015)" id="g13879" style="display:inline;opacity:1;stroke-width:1.6259197;enable-background:new">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 429.5,478 -2.99609,0.006 c -0.2754,6.1e-4 -0.49976,0.22265 -0.5,0.49805 L 426,484.96289 c 0,1.02328 0.80629,2.03747 2,2.03711 1.19534,0 1.99609,-1.02155 1.99609,-2.04297 L 430,478.5 c -1.8e-4,-0.27638 -0.22362,-0.50048 -0.5,-0.5 z m -1.5,6 a 1,0.99999996 0 0 1 1,1 1,0.99999996 0 0 1 -1,1 1,0.99999996 0 0 1 -1,-1 1,0.99999996 0 0 1 1,-1 z" transform="matrix(1.6259009,0,0,1.6259386,-645.95373,-199.51916)" id="path13855" inkscape:connector-curvature="0"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.6259197;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 60.476562,585.81055 c -0.20699,0.006 -0.403981,0.0903 -0.550781,0.23633 l -4.878906,4.8789 c -0.510517,0.5127 -0.147353,1.38676 0.576172,1.38672 H 60.5 c 0.448608,-3e-4 0.812202,-0.36389 0.8125,-0.8125 v -4.87695 c -1.23e-4,-0.45791 -0.378206,-0.8254 -0.835938,-0.8125 z" id="path13859" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.75;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.6259197;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 57.236328,577.67969 c -0.211345,0.003 -0.413102,0.0888 -0.5625,0.23828 l -1.626953,1.625 c -0.152838,0.15276 -0.238578,0.36008 -0.238281,0.57617 v 6.50391 c -3.4e-5,0.72485 0.876769,1.08742 1.388672,0.57422 l 4.876953,-4.87891 c 0.316598,-0.31735 0.316598,-0.83109 0,-1.14844 l -3.251953,-3.25195 c -0.155143,-0.15526 -0.366469,-0.2412 -0.585938,-0.23828 z" id="path13861" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc"/>
+ </g>
+ <g id="g9988">
+ <path style="vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1" d="m 481.50031,473.50818 c -1.00252,0 -2.00505,1e-5 -3.00757,1e-5 0,1.00272 0,2.00544 0,3.00817 1.00252,0 2.00505,-1e-5 3.00757,-1e-5 0,-1.00273 0,-2.00545 0,-3.00817 z" id="path13882" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path13884" d="m 472.50031,474.50818 c -1.00252,0 -2.00505,1e-5 -3.00757,1e-5 0,1.00272 0,2.00544 0,3.00817 1.00252,0 2.00505,-1e-5 3.00757,-1e-5 0,-1.00273 0,-2.00545 0,-3.00817 z" style="opacity:0.75;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"/>
+ <path style="opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1" d="m 471.50031,483.50818 c -1.00252,0 -2.00505,1e-5 -3.00757,1e-5 0,1.00272 0,2.00544 0,3.00817 1.00252,0 2.00505,-1e-5 3.00757,-1e-5 0,-1.00273 0,-2.00545 0,-3.00817 z" id="path13886" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13033" transform="translate(-84.000002,22.000005)">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 473.49999,411 -2.99609,0.006 c -0.2754,6.1e-4 -0.49976,0.22265 -0.5,0.49805 l -0.004,8.45884 c 0,1.02328 0.80629,2.03747 2,2.03711 1.19534,0 1.99609,-1.02155 1.99609,-2.04297 l 0.004,-8.45703 c -1.8e-4,-0.27638 -0.22362,-0.50048 -0.5,-0.5 z m -1.5,8 c 0.55228,0 1,0.44772 1,1 0,0.55228 -0.44772,1 -1,1 -0.55228,0 -1,-0.44772 -1,-1 0,-0.55228 0.44772,-1 1,-1 z" id="path12959" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccsssss"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 478.14648,418.14648 -3,3 c -0.31399,0.31533 -0.0915,0.85354 0.35352,0.85352 h 3 2 c 0.27591,-1.9e-4 0.49982,-0.22409 0.5,-0.5 v -3 c -7e-5,-0.28163 -0.23215,-0.50794 -0.51367,-0.5 h -2 c -0.12731,0.004 -0.24956,0.0566 -0.33985,0.14648 z" id="path12972" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.75;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 477.49257,412.00014 c -0.12999,0.002 -0.25408,0.0546 -0.34596,0.14655 l -2.00065,1.99942 c -0.094,0.094 -0.14673,0.22146 -0.14655,0.35436 v 4.0001 c -2e-5,0.4458 0.53925,0.66879 0.85409,0.35316 l 3.99954,-4.00067 c 0.19472,-0.19518 0.19472,-0.51115 0,-0.70633 l -2.00009,-2.00004 c -0.0954,-0.0955 -0.2254,-0.14835 -0.36038,-0.14655 z" id="path12974" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc"/>
+ </g>
+ <g transform="translate(-84.000014,21.000005)" style="display:inline;enable-background:new" id="g9974-4">
+ <path inkscape:connector-curvature="0" id="path14003" d="M 391.98438,535.98633 C 391.43286,535.99495 390.99245,536.44847 391,537 v 1.51367 c -10e-6,0.002 -10e-6,0.004 0,0.006 0.008,1.37595 0.83084,2.56107 2,3.125 V 548.5 c -0.0287,2.02848 3.02869,2.02848 3,0 v -6.85352 c 1.17556,-0.56682 2,-1.76346 2,-3.14648 V 537 c 0.0191,-1.35232 -2.01913,-1.35232 -2,0 v 1.5 c 0,0.11423 -0.0139,0.22371 -0.0371,0.33008 l -1.13281,1.13281 -0.66211,-0.002 -1.13086,-1.13086 c -0.0226,-0.10381 -0.0365,-0.2109 -0.0371,-0.32227 V 537 c 0.008,-0.56377 -0.45187,-1.02247 -1.01562,-1.01367 z M 394,548 h 1 v 1 h -1 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" d="M 386.49219,535.99219 A 0.50005,0.50005 0 0 0 386,536.5 v 6.5 h -1.5 a 0.50005,0.50005 0 1 0 0,1 h 1.91992 a 0.50005,0.50005 0 0 0 0.16211,0 H 388.5 a 0.50005,0.50005 0 1 0 0,-1 H 387 v -6.5 a 0.50005,0.50005 0 0 0 -0.50781,-0.50781 z M 384.5,545 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 2 c 0,0.78517 0.31169,1.44054 0.78516,1.86719 0.47346,0.42664 1.08725,0.63281 1.69726,0.63281 0.61001,0 1.22902,-0.20449 1.71094,-0.62891 C 388.67528,548.94668 389,548.28953 389,547.5 v -2 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path14013"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g10204">
+ <path sodipodi:nodetypes="cccccccccccc" inkscape:connector-curvature="0" id="rect14891" d="m 385.5,159.5 v 4 3 4 h 4 7 v -3 h -8 v -5 h 8 v -3 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <circle r="1" cy="165" cx="391" id="path10200" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <path id="rect13801" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 309.5,164.5 h 3 v 3 h -3 z m -8,3 h 3 v 3 h -3 z m 3,-9 h 3 v 3 h -3 z" inkscape:connector-curvature="0"/>
+ <g style="display:inline;enable-background:new" id="g14472" transform="translate(-42.000002,4.4999696e-6)">
+ <path id="rect14387" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 373.5,158.5 h 3 v 3 h -3 z m -10,10 h 3 v 3 h -3 z" inkscape:connector-curvature="0"/>
+ <path d="m 373.5,162.5 v -1 m 0,4 v -1 m 0,4 v -1 m -7,-5 v -1 m 0,4 v -1 m 0,4 v -1 m 6,1 h 1 m -4,0 h 1 m -4,0 h 1 m 5,-7 h 1 m -4,0 h 1 m -4,0 h 1" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path14452" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14467" transform="translate(-63.000002,4.4999696e-6)">
+ <path id="rect14393" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 349.5,165.5 h 3 v 3 h -3 z m -4,-1 h 3 v 3 h -3 z m 2,-3 h 3 v 3 h -3 z" inkscape:connector-curvature="0"/>
+ <path d="m 342.5,170.5 v 1.00001 m -10e-6,-4.00001 10e-6,1 m 0,-4 -10e-6,1 m 10e-6,-4 v 1.00001 m -10e-6,-4.00001 10e-6,1 m 13,11 10e-6,1 M 355.5,167.49999 V 168.5 m 10e-6,-4 -10e-6,1 m 0,-4 10e-6,1 M 355.5,158.49999 V 159.5 m -1,12 h 1 m -4,0 h 1 m -4,0 h 1 m -4,0 h 1 m -4,0 h 1 m 11,-13 h 1 m -4,0 h 1 m -4,0 h 1 m -4,0 h 1 m -4,0 h 1" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path14460" inkscape:connector-curvature="0"/>
+ </g>
+ <path style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new" d="m 111.5,212.5 h 7 v -11 h 6" id="path13715" inkscape:connector-curvature="0"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 132.5,212.5 h 1 l 11,-11 h 1" id="path13875" inkscape:connector-curvature="0"/>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g13432">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path14036" d="m 153.5,212.5 h 0.5 c 5.75,0 6.25,-11 12,-11 h 0.5" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <path inkscape:connector-curvature="0" d="m 163.50712,212.5 h -4 m 6,-1 h -2 v 2 h 2 z" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="path14233"/>
+ <path id="path14257" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 156.5,201.5 h 4 m -6,-1 h 2 v 2 h -2 z" inkscape:connector-curvature="0"/>
+ </g>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path14276" d="m 292.5,201.5 h -1 c 0,10 -2.53336,11 -12,11" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 313.5,201.5 h -1 c 0,7.09815 -5.0625,10.15625 -12,11" id="path14278" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path14305" d="m 426.5,212.5 h 0.5 c 5.75,0 6.25,-11 12,-11 h 0.5" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <path sodipodi:nodetypes="cscccc" style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 321.5,201.5 h 0.5 c 1.98887,0 2.6748,6.2754 3.5,11 1,-5.25 4,-5.25 5,0 1,-2.75 2,-2.75 3,0 h 1" id="path53380-0" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" id="path16468-1" d="m 342.50001,201.49914 c 0.0525,5e-5 0.748,8.6e-4 0.8,8.6e-4 0,0 0.22718,10.99969 2.25296,10.99969 1.91589,0 0.93193,-7.00055 2.94704,-7.00055 1.53921,0 1.50766,4 3,4 1.03656,0 0.99963,-2 2,-2 0.66974,0 0.90046,1.00059 1.5,1.00059 0.0346,0 0.5199,0.002 0.55,2.7e-4" style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" sodipodi:nodetypes="ccsssssc"/>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g14237">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 208.5,201.5 h -1 c -3,4 -5.25,11 -12,11" id="path14262" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ <path id="path12457-3" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 198.49995,206.4964 h -3 c 0.007,-2.24993 2.98299,-2.99633 2.97587,-4.4964 -0.009,-0.99995 -0.72587,-1.5036 -1.47587,-1.5036 -0.61679,0 -1.30036,0.32368 -1.5,1" inkscape:connector-curvature="0" sodipodi:nodetypes="cccsc"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g14233">
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path14011" d="m 187.5,201.5 h -1 c -3,4 -5.25,11 -12,11" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ <path sodipodi:nodetypes="ccc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 176.5,206.5 -5e-5,-6.0036 -2,2" id="path12461-0" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g14241">
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path14266" d="m 229.5,201.5 h -1 c -1.5,4.5 -3.5,11 -12,11" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ <path sodipodi:nodetypes="cscccsc" inkscape:connector-curvature="0" d="m 217.49746,205.5 c 0.19964,0.67632 0.88321,1 1.5,1 0.75,0 1.49354,-0.50005 1.50254,-1.5 0.003,-0.61752 -0.40086,-1.1293 -1,-1.50189 0.59914,-0.37258 1.00293,-0.88436 1,-1.50188 -0.009,-0.99995 -0.75254,-1.5 -1.50254,-1.5 -0.61679,0 -1.30036,0.32368 -1.5,1" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path14395"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g14249">
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path14273" d="m 271.5,201.5 h -1 c 0,7.09815 -4.5,11 -12,11" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ <path sodipodi:nodetypes="cccszsc" inkscape:connector-curvature="0" d="m 261.49995,200.49645 h -3 L 258.5,202.5 h 1.5 c 0.75,0 1.5,0.75 1.5,2 0,1.25 -0.75006,1.9929 -1.50005,1.99645 -0.74995,0.004 -1.24995,-0.49645 -1.5,-1" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path14399"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g14245">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 250.5,201.5 h -1 c -0.5,5.5 -4.5,11 -12,11" id="path14271" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path14402" d="m 238.5,200.5 -1,4 h 3 v -2 4" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ </g>
+ <path sodipodi:nodetypes="ccscc" style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 376.5,201.5 h -1 c -1.95,6.49912 -2.69103,11 -5.5,11 -2.23607,0 -4.02976,-4 -6,-4 h -0.5" id="path16580-7" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 397.5,201.5 h -1 c -3,4 -5.25,11 -12,11" id="path14011-0" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path14049" d="m 405.5,212.5 h 1 c 3,-4 5.25,-11 12,-11" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g14253">
+ <path inkscape:connector-curvature="0" id="path13927-5" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 460.50715,209.50712 v 4 h -4 m -9.0071,-4 v 4 h 4 m 9.0071,-9.00707 v -4 h -4 m -9.0071,4 v -4 h 4" sodipodi:nodetypes="cccccccccccc"/>
+ <path sodipodi:nodetypes="ccsc" inkscape:connector-curvature="0" id="path14224" d="m 449.5,203.5 h 1 c 2.5,0 3,7 5,7 2,0 1.25,-3 3,-3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13322" transform="translate(-1.8536743e-6,21.000005)">
+ <g id="g14281" transform="translate(84,200)" style="opacity:0.6">
+ <g transform="matrix(1,0,0,-1,-294,368)" id="g14276" style="opacity:1">
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 310.5,378.5 h -10 v -3 h 10 z" id="path14272" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 313.5,381.5 h -9 v -3 h 9 z" id="path14274" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ </g>
+ <path id="path14203-1" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 99.5,179.5 h -6 l 3,4 z" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g13175">
+ <path id="path34600-2" d="m 162.47852,32 c -0.75576,10e-7 -1.40256,0.282822 -1.83399,0.75 -0.30821,0.333747 -0.37373,0.80118 -0.46094,1.25 H 159.25 c -1.74879,0 -3.25,1.267585 -3.25,3 0,0.03444 0.0105,0.06555 0.0117,0.09961 C 156.33181,37.034347 156.66178,37 157,37 c 2.03325,0 3.79424,1.241664 4.57227,3 H 164.25 c 0.73055,0 1.4115,-0.231259 1.91992,-0.667969 C 166.67834,38.895322 167,38.242126 167,37.5 c 0,-1.192468 -0.94634,-2.062761 -2.04297,-2.306641 -0.002,-0.488483 0.0124,-1.101037 -0.24609,-1.74414 C 164.40699,32.693065 163.65613,32.000002 162.47852,32 Z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" inkscape:connector-curvature="0"/>
+ <ellipse ry="3.5000005" rx="3.4999993" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" id="ellipse13733" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1.0000006;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" cx="157" cy="42"/>
+ <ellipse cy="33.499996" cx="-154.5" id="ellipse12632-2" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" rx="0.99999642" ry="1.0000018" transform="scale(-1,1)"/>
+ </g>
+ <path id="path14294" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:new" d="m 282.5,378.5 10,-10" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <g style="display:inline;enable-background:new" id="g14135" transform="translate(696.99456,-488.99997)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g14103">
+ <path sodipodi:nodetypes="cccccccc" inkscape:connector-curvature="0" id="path14068" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m -563.5,611.49287 v 5 m 1,-6 h 5 m -5,6.99995 h 5 m 1,-0.99995 v -5"/>
+ <path inkscape:connector-curvature="0" id="path14078" d="m -562.5,611.49999 v -2 h -2 v 2 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m -562.5,618.49999 v -2 h -2 v 2 z" id="path14080" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path14083" d="m -555.5,618.49999 v -2 h -2 v 2 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m -555.5,611.49999 v -2 h -2 v 2 z" id="path14093" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="opacity:0.6" transform="translate(4,-4)" id="g14122">
+ <path d="m -563.5,611.49287 v 1 m 1,-2 h 5 m -1,6.99995 h 1 m 1,-0.99995 v -5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path14105" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/>
+ <path sodipodi:nodetypes="ccccc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m -562.5,611.49999 v -2 h -2 v 2 z" id="path14109" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="ccccc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m -555.5,618.49999 v -2 h -2 v 2 z" id="path14118" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path14120" d="m -555.5,611.49999 v -2 h -2 v 2 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="ccccc"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14429" transform="translate(-1.8536743e-6,42.000005)">
+ <path inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png" sodipodi:nodetypes="csc" id="path14357" d="m 198.5,337.5 c 3.75,2 7,0.75 7,-2.5 0,-2.25 -1.5,-4 -3,-6.5" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" d="m 202.49718,327.49495 h -1 v 1 h 1 z" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="path14372" sodipodi:nodetypes="ccccc"/>
+ <g style="opacity:0.6" id="g13445">
+ <path id="path14367" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 197.49718,326.49495 h -2 v 2 h 2 z m 11,0 h -2 v 2 h 2 z" inkscape:connector-curvature="0"/>
+ <path id="path14388" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 204.5,327.5 h 2 m -9,0 h 2" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14422" transform="translate(-1.8536743e-6,42.000005)">
+ <ellipse cy="334.00006" cx="223" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="ellipse14399" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" rx="4.499712" ry="4.500061"/>
+ <path sodipodi:nodetypes="ccccc" id="path14403" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 223.49718,328.49495 h -1 v 1 h 1 z" inkscape:connector-curvature="0"/>
+ <g style="opacity:0.6" id="g13453">
+ <path d="m 218.5,327.5 h 2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path14397" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path id="path14421" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 227.50712,326.49495 h 2 v 2 h -2 z m -9.00994,0 h -2 v 2 h 2 z" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path14423" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 227.5043,327.5 h -2"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14414" transform="translate(-1.8536743e-6,42.000005)">
+ <path sodipodi:nodetypes="ccsscc" inkscape:connector-curvature="0" id="ellipse14411" d="m 250.49653,327.51519 -0.43763,-0.003 c -1.98384,0 -3.81698,1.04625 -4.8089,2.74465 -0.99192,1.6984 -0.99192,3.79091 0,5.48931 0.99192,1.6984 2.82506,2.74465 4.8089,2.74465 L 250.5,338.5" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.9999997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <g style="opacity:0.6" id="g13459">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path14407" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="M 239.5,327.5 H 245"/>
+ <path id="path14415" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 239.49718,337.49495 h -2 v 2 h 2 z m 0,-11 h -2 v 2 h 2 z" inkscape:connector-curvature="0"/>
+ <path d="M 239.5,338.5 H 245" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path14417" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path d="m 238.50005,328.5 v 9" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path14428" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14406" transform="translate(-1.8536743e-6,42.000005)">
+ <path d="m 269.50712,337.49495 h 2 v 2 h -2 z m -9.00994,0 h -2 v 2 h 2 z m 9.00994,-11 h 2 v 2 h -2 z m -9.00994,0 h -2 v 2 h 2 z" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="path14443" inkscape:connector-curvature="0"/>
+ <ellipse ry="4.500061" rx="4.499712" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" id="ellipse14445" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" cx="265" cy="333.00006"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14334" transform="translate(-231,63.000005)">
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.9999997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 250.49653,306.51519 -0.43763,-0.003 c -1.98384,0 -3.81698,1.04625 -4.8089,2.74465 -0.99192,1.6984 -0.99192,3.79091 0,5.48931 0.99192,1.6984 2.82506,2.74465 4.8089,2.74465 L 250.5,317.5 Z" id="path13470" inkscape:connector-curvature="0" sodipodi:nodetypes="ccssccc"/>
+ <g transform="translate(0,-21)" id="g13541" style="opacity:0.6">
+ <path d="M 239.5,327.5 H 245" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path13521" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" d="m 239.49718,337.49495 h -2 v 2 h 2 z m 0,-11 h -2 v 2 h 2 z" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="path13523"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path13525" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="M 239.5,338.5 H 245"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path13539" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 238.50005,328.5 v 9"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14339" transform="translate(-231,63.000005)">
+ <path inkscape:connector-curvature="0" id="path13555" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 269.50712,316.49495 h 2 v 2 h -2 z m -9.00994,0 h -2 v 2 h 2 z m 9.00994,-11 h 2 v 2 h -2 z m -9.00994,0 h -2 v 2 h 2 z"/>
+ <ellipse cy="312.00006" cx="265" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="ellipse13557" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" rx="4.499712" ry="4.500061"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14394" transform="translate(-252,63.000005)">
+ <path id="path17351-9" d="m 328,307 c -1.30038,0 -2.48006,0.21939 -3.37891,0.60352 -0.44942,0.19206 -0.83127,0.42394 -1.12304,0.71875 -0.29178,0.2948 -0.49805,0.67796 -0.49805,1.10156 v 2.30664 2.8457 c 0,0.4236 0.20627,0.80676 0.49805,1.10156 0.29177,0.29481 0.67362,0.52669 1.12304,0.71875 C 325.51994,316.78061 326.69962,317 328,317 c 1.30038,0 2.48006,-0.21939 3.37891,-0.60352 0.44942,-0.19206 0.83127,-0.42394 1.12304,-0.71875 0.29178,-0.2948 0.49805,-0.67796 0.49805,-1.10156 v -2.8457 -2.30664 c 0,-0.4236 -0.20627,-0.80676 -0.49805,-1.10156 -0.29177,-0.29481 -0.67362,-0.52669 -1.12304,-0.71875 C 330.48006,307.21939 329.30038,307 328,307 Z m 0,1 c 1.01151,0 1.92459,0.13316 2.61914,0.3418 0.34727,0.10431 0.63991,0.22479 0.88086,0.38281 0.24095,0.15802 0.5,0.38269 0.5,0.77539 0,0.3927 -0.25905,0.61737 -0.5,0.77539 -0.24095,0.15802 -0.53359,0.2785 -0.88086,0.38281 C 329.92459,310.86684 329.01151,311 328,311 c -1.0115,0 -1.92459,-0.13316 -2.61914,-0.3418 -0.34727,-0.10431 -0.63991,-0.22479 -0.88086,-0.38281 -0.24095,-0.15802 -0.5,-0.38268 -0.5,-0.77539 0,-0.3927 0.25905,-0.61737 0.5,-0.77539 0.24095,-0.15802 0.53359,-0.2785 0.88086,-0.38281 C 326.07541,308.13316 326.9885,308 328,308 Z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cccccccccccccccccccc" inkscape:connector-curvature="0" id="path14314" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 333.50712,316.49495 h 1 v 2 h -2 v -1 m -10.00994,-1 h -1 v 2 h 2 v -1 m 9.00994,-11 v -1 h 2 v 2 h -1 m -10.00994,-1 v -1 h -2 v 2 h 1"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14390" transform="translate(-294,63.000005)">
+ <path id="path14318" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="M 347.50619,306.5 C 349,315 342.24381,308 343.75,317.5 h 6.75619 C 349,308 355.74381,315 354.25,306.5 Z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:nodetypes="cccccccccc" d="m 353.50712,316.49495 h 2 v 2 h -2 z m -9.00994,-11 h -2 v 2 h 2 z" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="path14320" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14350" transform="translate(-210,63.000005)">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999988;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 307,306 c -3.30761,0 -6,2.6922 -6,6 0,3.3078 2.69239,6 6,6 3.30761,0 6,-2.6922 6,-6 0,-3.3078 -2.69239,-6 -6,-6 z m 4.75781,6.73438 a 0.50005,0.50005 0 0 1 0.28516,0.91992 c -1.16187,0.83991 -2.99782,1.34961 -5.04297,1.34961 -2.04361,0 -3.88093,-0.50932 -5.04297,-1.34766 a 0.50005,0.50005 0 0 1 0.25586,-0.91016 0.50005,0.50005 0 0 1 0.33008,0.0977 c 0.89908,0.64864 2.58702,1.16016 4.45703,1.16016 1.87213,0 3.55862,-0.50874 4.45703,-1.15821 a 0.50005,0.50005 0 0 1 0.30078,-0.11132 z" id="ellipse14291" inkscape:connector-curvature="0"/>
+ <path d="m 312.50712,316.49495 h 1 v 2 h -2 v -1 m -10.00994,-1 h -1 v 2 h 2 v -1 m 9.00994,-11 v -1 h 2 v 2 h -1 m -10.00994,-1 v -1 h -2 v 2 h 1" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="path14322" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccccccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14344" transform="translate(-168,63.000005)">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 286,307 c -1.846,0 -3.56208,0.52582 -4.8457,1.40625 C 279.87068,309.28668 279,310.55671 279,312 c 0,1.44329 0.87068,2.71332 2.1543,3.59375 C 282.43792,316.47418 284.154,317 286,317 c 1.846,0 3.56208,-0.52582 4.8457,-1.40625 C 292.12932,314.71332 293,313.44329 293,312 c 0,-1.44329 -0.87068,-2.71332 -2.1543,-3.59375 C 289.56208,307.52582 287.846,307 286,307 Z m 2.49219,3.61719 A 0.50005,0.50005 0 0 1 289,311.125 c 0,0.62131 -0.43923,1.10886 -0.98438,1.41016 C 287.47049,312.83646 286.77233,313 286,313 c -0.77233,0 -1.47049,-0.16354 -2.01562,-0.46484 C 283.43923,312.23386 283,311.74631 283,311.125 a 0.50005,0.50005 0 0 1 0.49414,-0.50586 A 0.50005,0.50005 0 0 1 284,311.125 c 0,0.13737 0.11369,0.33891 0.46875,0.53516 C 284.82381,311.85641 285.37451,312 286,312 c 0.62549,0 1.17619,-0.14359 1.53125,-0.33984 C 287.88631,311.46391 288,311.26237 288,311.125 a 0.50005,0.50005 0 0 1 0.49219,-0.50781 z" id="path13633" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cccccccccccccccccccc" inkscape:connector-curvature="0" id="path14324" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 291.50712,316.49495 h 1 v 2 h -2 v -1 m -10.00994,-1 h -1 v 2 h 2 v -1 m 9.00994,-11 v -1 h 2 v 2 h -1 m -10.00994,-1 v -1 h -2 v 2 h 1"/>
+ </g>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:1;stroke-width:1.14285719;enable-background:new" id="g14488" transform="matrix(0.875,0,0,0.875,206.375,31.125059)">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;stroke:none;stroke-width:3.42857146;marker:none;enable-background:accumulate" id="rect14475" width="16" height="16" x="299" y="408.99994"/>
+ <path sodipodi:nodetypes="sssss" inkscape:connector-curvature="0" id="path14478" d="m 314.5,416.99995 c 0,4.14214 -3.35786,7.5 -7.5,7.5 -4.14214,0 -7.5,-3.35786 -7.5,-7.5 0,-4.14214 3.35786,-7.5 7.5,-7.5 4.14214,0 7.5,3.35786 7.5,7.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.14285719;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <g style="opacity:1;stroke-width:1.14285719" id="g14486">
+ <path inkscape:transform-center-y="0.022097087" inkscape:transform-center-x="1.2189004" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.91428572;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 306.42857,422.42851 c -0.94579,-1.5 -1.14285,-3.21405 -1.14285,-5.42857 0,-2.27448 0.20415,-3.92857 1.14285,-5.42857" id="path14482" inkscape:connector-curvature="0" sodipodi:nodetypes="csc"/>
+ </g>
+ </g>
+ <rect inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="rect14490" width="13.000062" height="13.000062" x="426.5" y="389.5" rx="3.0083575" ry="3.0083575"/>
+ <g style="display:inline;enable-background:new" id="g14548" transform="translate(147,42.000005)">
+ <path sodipodi:nodetypes="ccccccccccccc" inkscape:connector-curvature="0" id="path14492-1" d="m 305.5,347.5 c -0.663,1.3e-4 -1.2988,0.26358 -1.76758,0.73242 l -2.5,2.5 C 300.76358,351.2012 300.50013,351.837 300.5,352.5 v 5.5 c 1.4e-4,1.38065 1.11935,2.49986 2.5,2.5 h 5.5 c 0.663,-1.3e-4 1.2988,-0.26358 1.76758,-0.73242 l 2.5,-2.5 C 313.23642,356.7988 313.49987,356.163 313.5,355.5 v -5.75 c -1.4e-4,-1.38065 -0.86935,-2.24986 -2.25,-2.25 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <path sodipodi:nodetypes="cccccc" d="m 310.49995,350.5 1.00005,-1 m -8.00005,2.00001 L 307.5,351.5 m 1.99995,2.00001 v 4" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path14494-2" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14586" transform="translate(147,63.000005)">
+ <path sodipodi:nodetypes="csccscc" inkscape:connector-curvature="0" d="m 371,338 c -1.75736,1.75736 -4.31739,2.03089 -6.18519,0.18519 C 362.94701,336.33949 363.24264,333.75736 365,332 l 4,-4 c 1.75736,-1.75736 4.31739,-2.03089 6.18519,-0.18519 1.8678,1.8457 1.57217,4.42783 -0.18519,6.18519 z" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path14559"/>
+ <path inkscape:transform-center-y="0.18975566" inkscape:transform-center-x="0.19821107" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 373.5,332.5 c -0.84836,-0.18404 -1.23186,-0.26464 -2,-1 -0.78895,-0.75528 -0.8053,-1.1902 -1,-2" id="path14564" inkscape:connector-curvature="0" sodipodi:nodetypes="csc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14606" transform="translate(147,63.000005)">
+ <g transform="matrix(0.74168034,-0.7416807,0.60682936,0.60682967,-194.04487,369.9492)" id="g14473" style="display:inline;opacity:1;stroke-width:1.05400634;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" style="display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.05400622;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 391.00002,411.23231 c -4.19462,0 -7.50001,2.73169 -7.5,5.76769 0,3.036 3.30538,5.76768 7.5,5.76768 4.19462,0 7.49999,-2.73168 7.49999,-5.76768 0,-3.036 -3.30536,-5.7677 -7.49999,-5.76769 z" id="path14468" sodipodi:nodetypes="csssc"/>
+ </g>
+ <path inkscape:transform-center-y="0.18975566" inkscape:transform-center-x="0.19821107" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 350.5,335.5 c -0.84836,-0.18404 -1.73186,-0.76463 -2.5,-1.49999 -0.78895,-0.75528 -1.3053,-1.69021 -1.5,-2.50001" id="path14550" inkscape:connector-curvature="0" sodipodi:nodetypes="csc"/>
+ </g>
+ <path id="path13222-6" d="m 239.51612,230.46982 4,-9 4,9 -4,4 z" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 260.51612,230.46982 4,-9 4,9 -4,4 z" id="path14674"/>
+ <path inkscape:connector-curvature="0" d="m 289.5,368.5 h 3 v 3 m -8,2 h 3 v 3 m -8,2 h 3 v 3" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:new" id="path13250" sodipodi:nodetypes="ccccccccc"/>
+ <g style="display:inline;enable-background:new" id="g13344" transform="translate(-42.000002,21.000005)">
+ <path id="path13315" d="m 491.5,473 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 1 c 0,-0.0417 0.006,-0.0117 -0.0469,0.0547 -0.0531,0.0664 -0.15023,0.15467 -0.2539,0.23242 -0.16609,0.12457 -0.2761,0.17993 -0.33789,0.21289 H 489.5 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 1 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 1.77539 c 0.40889,-0.49501 0.89786,-0.93068 1.47461,-1.26367 l 0.42578,-0.26758 L 493,475.29297 V 473.5 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 3.84961,4.64258 -1.05078,0.66211 a 1.50015,1.50015 0 0 1 -0.0488,0.0293 c -0.34485,0.1991 -0.62663,0.47142 -0.83594,0.78711 l 4.22461,4.22657 1.3613,1.35936 V 486.5 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 1 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -1 c 0,-0.0833 0.0571,-0.22505 0.16602,-0.33398 C 501.27495,485.05708 501.41667,485 501.5,485 h 1 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -1 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 h -1.79297 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cccccscccc" inkscape:connector-curvature="0" d="m 502.14835,477.4375 c 0.59404,-1.02891 0.42294,-2.32854 -0.41717,-3.16864 -0.84011,-0.84011 -2.13974,-1.01121 -3.16866,-0.41717 l -5.06249,3.18423 m 0,0 c -1.4563,0.84079 -2.23124,2.50264 -1.93923,4.15868 0.29201,1.65603 1.58859,2.95261 3.24463,3.24462 0.5703,0.10056 1.14129,0.0746 1.6792,-0.0622 M 500.5,480.5 l 1.64835,-3.0625" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path13317"/>
+ <circle style="opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle13319" cx="500" cy="476" r="1"/>
+ </g>
+ <path sodipodi:nodetypes="ccsccccsc" inkscape:connector-curvature="0" d="M 449.50356,374.5 H 455 c 2,0 3.5,1 3.5,3 0,2 -1.5,3 -3.5,3 h -5.49644 v -11 H 453.5 c 1.65685,0 3,0.84315 3,2.5 0,1.65685 -1.34315,2.5 -3,2.5" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path10949-7"/>
+ <path id="path13132" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="M 408.50356,375.5 H 412.5 l 4,5 m -7.99644,0 v -11 h 4 c 1.65685,0 3,1.34315 3,3 0,1.65685 -1.34315,3 -3,3" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccsc"/>
+ <path id="path13141" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 436.5,371.5 c -1,-1.73205 -2.95225,-2.34126 -4.8347,-1.75662 -1.88245,0.58464 -3.1653,2.32636 -3.1653,4.29751 V 376 c 0,1.60769 0.8577,3.09326 2.25,3.89711 1.3923,0.80385 3.1077,0.80385 4.5,0 1.3923,-0.80385 2.25,-2.28942 2.25,-3.89711 v -0.5 h -4" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccssccc"/>
+ <g style="display:inline;enable-background:new" id="g13321" transform="translate(-42.000002,21.000005)">
+ <g id="g13309">
+ <path sodipodi:nodetypes="cccccccccc" id="path13157" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 374.5,104.5 2,2 -2,2 m -11,-11 2,-2 2,2 m -2,1 v -3 m 6,11 h 5" inkscape:connector-curvature="0"/>
+ <path id="path13047-6" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 371.56146,97.43853 h 3 v 3 m 0,-3 -4.00005,4.00001" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g id="g13313">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.98000004;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 363.5,104 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 4 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 6 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -4 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 2.5,1 h 1 v 2 h -1 z" id="rect13261" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccc"/>
+ <path style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" d="m 368.5,104 v -1.75 c 0,0 0,-1.75 -2,-1.75 -2,0 -2,1.75 -2,1.75 V 104" id="path13263" inkscape:connector-curvature="0" sodipodi:nodetypes="czzcc"/>
+ </g>
+ </g>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g13337" style="display:inline;opacity:0.98999999;enable-background:new" transform="matrix(-1,0,0,1,1458,302.99979)">
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 1260.5,-280.49979 -3,-6 -3,6 z" id="path13331" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <ellipse ry="1.0000036" rx="1" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="ellipse13333" cx="1252.5" cy="-287.49979"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.3;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 1262.5,-278.49979 h -13 v -13 h 13 v 13" id="path14450" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path13335" d="m 1262.5,-278.49979 h -13 v -13 h 13 v 13" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ </g>
+ <g style="display:inline;enable-background:new" transform="matrix(1,0,0,-1,-1.8536743e-6,6.0000045)" id="g13398">
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 237.5,-18.5 h 13 v 13 h -13 z" id="path13392"/>
+ <path id="path13396" d="m 237.5,-18.5 h 13 l -13,13 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13454" transform="translate(41.999998,-20.999995)">
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 187.5,45.5 h -13 v -13 h 13 z" id="path13377"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="M 174.58789,32.005859 C 174.30358,31.956646 174.00013,32.166007 174,32.5 v 13 c 3e-5,0.276131 0.22387,0.499972 0.5,0.5 h 13 c 0.44532,-1.7e-4 0.6683,-0.538517 0.35352,-0.853516 l -13,-13 c -0.0788,-0.0787 -0.17086,-0.12422 -0.26563,-0.140625 z M 178.49609,38 c 0.191,-10e-4 0.36608,0.106304 0.45118,0.277344 l 3,6 C 182.11247,44.609574 181.8713,44.99965 181.5,45 h -6 c -0.371,-3.5e-4 -0.61247,-0.390426 -0.44727,-0.722656 l 3,-6 c 0.084,-0.16853 0.25516,-0.275714 0.44336,-0.277344 z" id="path13379" inkscape:connector-curvature="0"/>
+ <ellipse transform="scale(-1,1)" cy="36.500004" cx="-184.5" id="ellipse13420" style="display:inline;opacity:0.98999999;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" rx="1" ry="1.0000036"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g14346">
+ <path sodipodi:nodetypes="cccccccc" inkscape:connector-curvature="0" d="m 185.5,520.5 -2,-2 m 0,4 -2,-2 m 0,4 -2,-2 m 0,4 -2,-2" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path14236"/>
+ <path sodipodi:nodetypes="csccsccsccssccscccsc" inkscape:connector-curvature="0" d="m 183.5,518.5 c -0.62156,-0.62156 -1.5,-0.5 -2,0 -0.5,0.5 -0.57458,1.42542 0,2 m 0,0 c -0.62156,-0.62156 -1.5,-0.5 -2,0 -0.5,0.5 -0.57458,1.42542 0,2 m 0,0 c -0.62156,-0.62156 -1.5,-0.5 -2,0 -0.5,0.5 -0.57458,1.42542 0,2 m 0,0 c -0.62156,-0.62156 -1.5,-0.5 -2,0 -0.5,0.5 -0.57458,1.42542 0,2 l 2,2 -2.5,-2 c -1,-1 -0.65259,-2.58816 3.5,-7 4.15259,-4.41184 6,-4.5 7,-3.5 l 2,2.5 -2,-2 c -0.62156,-0.62156 -1.5,-0.5 -2,0 -0.5,0.5 -0.57458,1.42542 0,2" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path14340"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13042" transform="translate(-21.000002,42.000005)">
+ <g id="g13022" transform="translate(-42.00718,397.99283)" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path d="m 450.49999,172.5 h 7 l -1.99997,5e-5 h -1 v -3 h -1 v 3 M 460.49999,169.5 h -13 v -10 l 13.00002,-1e-5 z" style="display:inline;opacity:0.6;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" id="path13020" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccc"/>
+ </g>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="ccccc" d="m 408.5,562.5 h 8 m -6,3 -3,-3 3,-3" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path12420-1" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g13097">
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:0.98999999;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="M 82.5,479.5 H 82 c -2.5,0 -1.75,2.98205 -4,3 -2.25,0.0179 -1.75,-5 -4,-5 -2.25,0 -1.5,4 -4,4 h -0.5" id="path15332-4" sodipodi:nodetypes="cszzcc" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90"/>
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png" id="path12638-3" d="m 69.5,479.5 -1e-5,-5.99639 13.00001,-0.004 V 477.5 m 0,4 v 5.00007 h -13 V 483.5" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="cccccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13177" transform="translate(-1.8536743e-6,-20.999995)">
+ <g id="g13282" transform="translate(20,-21)">
+ <path style="opacity:1;fill:#ffffff;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" d="m 217.5,127.5 c 1.08333,3.25 4,2 4,0 v -9 h 1 v 6.5 c 0,3.21553 -1.5,4.48756 -2.5,4.5 -0.79887,0.01 -1.5,0 -2.5,-1 z" id="path13240" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccscc"/>
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 224.5,118 v 7 c 0,3.5 -2,4.5 -4.5,4.5 1.25,0 5.5,-0.25 5.5,-5.5 v -6.25 z" id="path13242" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ <path id="path13256" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 225.5,117.5 c 1.75,2.5 4.25,-0.25 5,-1 -0.75,0.75 -2.37996,1.65788 -4,0 -0.75,0.75 -2.25,2 -5,2 2.75,0 4,0.25 4,-1 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 225.5,121.5 h 4 l -1,1 h -3 z" id="path13272" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 221.5,121.5 h -1 c -1.25,0 -2,1 -3,2 1,-1 1.75,-1 3,-1 h 1 z" id="path13274" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ </g>
+ </g>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:0.98999999;enable-background:new" id="g13304" transform="translate(-84.000015,-126)">
+ <path style="display:inline;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" d="m 471.50037,168.50323 v 1 c 0,0.9872 0,2.00001 3.5,2 3.5,-1e-5 3.5,-1.0128 3.5,-2 L 478.5,168.5 l -3.00037,0.01 3.50074,-0.007 c 0.25,0 2.50037,-0.003 2.5,-3.50303 -1.5e-4,-1.44727 -0.53143,-2.00275 -1.00036,-2.49997" id="path13297" sodipodi:nodetypes="ccsccccsc" inkscape:connector-curvature="0"/>
+ <path style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 478.50037,161.49023 v 1 c -3.7e-4,2.75977 -7.00037,2.25977 -7,5 v 1" id="path13299" sodipodi:nodetypes="cccc" inkscape:connector-curvature="0"/>
+ <path inkscape:transform-center-y="-1.503115" inkscape:transform-center-x="1.500353" inkscape:connector-curvature="0" sodipodi:nodetypes="ccsccccsc" id="path13302" d="m 478.49966,161.49677 v -1 c 0,-0.9872 0,-2.00001 -3.5,-2 -3.5,1e-5 -3.5,1.0128 -3.5,2 l 3.7e-4,1.00323 3.00037,-0.01 -3.50074,0.007 c -0.25,0 -2.50037,0.003 -2.5,3.50303 1.7e-4,1.59588 0.4677,2.02832 1.00035,2.49997" style="display:inline;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"/>
+ </g>
+ <g transform="translate(-273.00001,399)" id="g13314" style="display:inline;opacity:0.98999999;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="ccsccccsc" id="path13306" d="m 471.50037,168.50323 v 1 c 0,0.9872 0,2.00001 3.5,2 3.5,-1e-5 3.5,-1.0128 3.5,-2 L 478.5,168.5 l -3.00037,0.01 3.50074,-0.007 c 0.25,0 2.50037,-0.003 2.5,-3.50303 -1.5e-4,-1.44727 -0.53143,-2.00275 -1.00036,-2.49997" style="display:inline;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"/>
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="cccc" id="path13309" d="m 478.50037,161.49023 v 1 c -3.7e-4,2.75977 -7.00037,2.25977 -7,5 v 1" style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"/>
+ <path style="display:inline;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" d="m 478.49966,161.49677 v -1 c 0,-0.9872 0,-2.00001 -3.5,-2 -3.5,1e-5 -3.5,1.0128 -3.5,2 l 3.7e-4,1.00323 3.00037,-0.01 -3.50074,0.007 c -0.25,0 -2.50037,0.003 -2.5,3.50303 1.7e-4,1.59588 0.4677,2.02832 1.00035,2.49997" id="path13311" sodipodi:nodetypes="ccsccccsc" inkscape:connector-curvature="0" inkscape:transform-center-x="1.500353" inkscape:transform-center-y="-1.503115"/>
+ </g>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 369.5,162 c -1.92707,0 -3.5,1.57293 -3.5,3.5 0,1.92707 1.57293,3.5 3.5,3.5 1.92707,0 3.5,-1.57293 3.5,-3.5 0,-1.92707 -1.57293,-3.5 -3.5,-3.5 z" id="path13329" inkscape:connector-curvature="0" sodipodi:nodetypes="sssss"/>
+ <rect y="159.5" x="363.5" height="12" width="12" id="rect13350" style="display:inline;opacity:0.3;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <circle style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="circle13367" cx="433" cy="123" r="2.5"/>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g13384" transform="translate(-21.000002,-105)" style="display:inline;opacity:0.6;enable-background:new">
+ <rect style="display:inline;opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="rect13372" width="16" height="16" x="236" y="325" rx="0" ry="0"/>
+ <g id="g13382" transform="translate(1)">
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc" id="path13374" d="m 236.5,328.5 2,2 2,-2 -2,-2 z" style="display:inline;fill:#ffffff;stroke:#ffffff;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"/>
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc" id="path13378" d="m 245.5,328.5 2,2 2,-2 -2,-2 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <path style="opacity:0.5;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 240.12109,326 1.43946,1.43945 c 0.58556,0.5858 0.58556,1.5353 0,2.1211 L 240.12109,331 h 5.75782 l -1.43946,-1.43945 c -0.58556,-0.5858 -0.58556,-1.5353 0,-2.1211 L 245.87891,326 Z" id="path13380" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccc"/>
+ </g>
+ </g>
+ <path style="display:inline;opacity:1;fill:#ffffff;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;enable-background:new" d="M 228.50004,230.50004 225.5,231.5 l -0.99996,3.00004 -3,-7 z" id="path12946-5" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <g style="display:inline;enable-background:new" id="g12888" transform="translate(-1.8536743e-6,21.000005)">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 241.48438,452 c -0.12717,0.004 -0.248,0.0564 -0.3379,0.14648 l -3,3 c -0.31479,0.315 -0.0918,0.85335 0.35352,0.85352 h 3 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -3 c 1.1e-4,-0.28235 -0.23341,-0.50879 -0.51562,-0.5 z m 2.01562,0 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 4.5 h -4.5 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 1 c 2e-5,0.1326 0.0527,0.25976 0.14648,0.35352 l 2,2 c 0.19527,0.19519 0.51177,0.19519 0.70704,0 l 2.64648,-2.64649 1.64648,1.64649 c 0.19527,0.19519 0.51177,0.19519 0.70704,0 l 2.64648,-2.64649 0.64648,0.64649 1,1 c 0.315,0.31479 0.85335,0.0918 0.85352,-0.35352 v -6 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 3.99219,9 c -0.12989,0.002 -0.25387,0.0546 -0.34571,0.14648 l -2.64648,2.64649 -1.64648,-1.64649 c -0.19527,-0.19519 -0.51177,-0.19519 -0.70704,0 l -2.64648,2.64649 -1.64648,-1.64649 c -0.315,-0.31479 -0.85335,-0.0918 -0.85352,0.35352 v 2 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 2.00781 9.99219 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -2 c -2e-5,-0.1326 -0.0527,-0.25976 -0.14648,-0.35352 l -1,-1 -1,-1 c -0.0957,-0.0957 -0.22603,-0.14855 -0.36133,-0.14648 z" id="path14234" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13069" transform="translate(-21.000002,42.000005)">
+ <path sodipodi:nodetypes="ccccccccccccccc" inkscape:connector-curvature="0" id="ellipse12909" d="m 290,517 h 2.5 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -1 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 h -2.91992 c -0.029,-0.005 -0.0584,-0.008 -0.0879,-0.008 -0.27614,0.004 -0.49651,0.23167 -0.49219,0.50781 v 1 5.64062 c -0.56586,-0.20756 -1.28645,-0.18129 -1.98242,0.0723 -1.35506,0.4963 -2.23747,1.69879 -1.9707,2.68555 0.26595,0.98712 1.58042,1.38505 2.93554,0.88867 1.22872,-0.45129 2.01759,-1.35494 2.01758,-2.53711 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.98999999;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.75542808px;marker:none;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path12979" style="opacity:0.7;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 280.74692,528.48763 a 7,7.4517298 0 0 1 -1.00812,-6.17485 7,7.4517298 0 0 1 3.77474,-4.80974 m 0.15803,9.99165 a 4,4.4440985 0 0 1 -1.13735,-3.72253 4,4.4440985 0 0 1 1.96578,-3.26863"/>
+ </g>
+ <g style="display:inline;enable-background:new" transform="translate(336,21.000005)" id="g13340">
+ <g id="g13324">
+ <rect style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect13317" width="2" height="2" x="161.49495" y="119.50505" rx="1" ry="1"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="M 162.24495,120.75505 166,117" id="path13319" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <g id="g13338" transform="translate(717.99456,-488.99997)" style="opacity:0.6">
+ <path sodipodi:nodetypes="cccccccc" inkscape:connector-curvature="0" id="path13330" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m -563.5,610.49287 v 6 m 1,-7 h 4 m -4,7.99995 h 6 m 1,-0.99995 v -4"/>
+ <path inkscape:connector-curvature="0" id="path13332" d="m -562.5,610.49999 v -2 h -2 v 2 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m -562.5,618.49999 v -2 h -2 v 2 z" id="path13334" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path13336" d="m -554.5,618.49999 v -2 h -2 v 2 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="ccccc"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" transform="translate(357,21.000005)" id="g13370">
+ <g id="g13360">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path13356" d="m 182,122 h 5" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 182,122 v -5" id="path13358" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <g transform="matrix(0,-1,-1,0,301.99245,326.99752)" id="g13368">
+ <g style="display:inline;opacity:0.6;enable-background:new" id="g13366" transform="translate(760.99456,-488.99997)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g13364">
+ <path sodipodi:nodetypes="ccccc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m -558.49956,607.49999 h -5 v 9 h 9 l 0.005,-5.00002" id="path13362" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" id="g13208" style="display:inline;opacity:0.6;enable-background:new">
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 365.5,433.5 v 8.5 a 1.5,1.5 0 0 0 1.5,1.5 1.5,1.5 0 0 0 1.5,-1.5 v -8.5 z" id="path13110" inkscape:connector-curvature="0"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 372.5,434.5 2,2 -4,4 v -4 z" id="path13122" inkscape:connector-curvature="0"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 370.5,443.5 3,-3 h 2 v 3 z" id="path13124" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g13291" transform="translate(-1.8536743e-6,21.000005)">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path8087-0" d="m 342.5,465.5 5.25,-5.25" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <circle r="1" cy="460.5" cx="347.5" id="circle8089-4" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path sodipodi:nodetypes="cccccccc" inkscape:connector-curvature="0" d="m 352.5,459.5 c 0.5,4.96967 -2.5,6 -10,6 v 0 c 0,-7.5 1.04419,-10.5 6,-10 l 2.25,-2.25002 c 1.07394,-1.07396 2.8706,-1.0185 3.94454,0.0555 1.07394,1.07394 1.1294,2.8706 0.0555,3.94454 z" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path8094-5"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g7837-6-6-8" transform="translate(1718.0848,-93.99867)">
+ <path sodipodi:nodetypes="ccccccc" inkscape:connector-curvature="0" d="m -1246.5,465.5 v 7 0 l 5,-3.25 v -0.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path7832-0-3-6"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path7834-4-7-1" d="m -1239,466 v 6" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ </g>
+ <g transform="rotate(90,-326.50002,1291.5)" id="g13234" style="display:inline;opacity:1;enable-background:new">
+ <path id="path13230" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m -1246.5,465.5 v 7 0 l 5,-3.25 v -0.5 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc"/>
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m -1239,466 v 6" id="path13232" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g13241" transform="matrix(0,-1,-1,0,1007,-868)">
+ <path sodipodi:nodetypes="ccccccc" inkscape:connector-curvature="0" d="m -1246.5,465.5 v 7 0 l 5,-3.25 v -0.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path13237"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path13239" d="m -1239,466 v 6" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ </g>
+ <g transform="matrix(-1,0,0,1,-725.91523,-93.99867)" id="g13248" style="display:inline;opacity:1;enable-background:new">
+ <path id="path13244" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m -1246.5,465.5 v 7 0 l 5,-3.25 v -0.5 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc"/>
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m -1239,466 v 6" id="path13246" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g9267-6" transform="translate(104.99288,-125.99994)">
+ <rect style="opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1;stroke-opacity:1;marker:none" id="rect6678-2" width="16" height="16" x="131" y="430"/>
+ <path inkscape:connector-curvature="0" id="path6708-7" d="m 136.5,444.5 v -13 0" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path6710-9" d="m 132.5,433.5 v -2 h 8 v 2" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"/>
+ <path sodipodi:nodetypes="cc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 134.5,444.5 h 4" id="path6730-8" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cc" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" d="m 142.5,444.5 v -7" id="path6924-7" inkscape:connector-curvature="0"/>
+ <path style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" d="m 139.5,438.5 v -1 h 6 v 1" id="path6926-3" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <path inkscape:connector-curvature="0" id="path6930-6" d="m 141.5,444.5 h 2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" sodipodi:nodetypes="cc"/>
+ </g>
+ <path inkscape:connector-curvature="0" d="m 353,628 h 1 v 1 h -1 z m -3,0 h 1 v 1 h -1 z m -3,0 h 1 v 1 h -1 z m -3,0 h 1 v 1 h -1 z m 9,-3 h 1 v 1 h -1 z m -3,0 h 1 v 1 h -1 z m -3,0 h 1 v 1 h -1 z m -3,0 h 1 v 1 h -1 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path14337"/>
+ <path sodipodi:nodetypes="csccsc" id="path17826-1" d="m 376.5,123.5 c -1.10526,-1.32631 -3.00392,-3.44282 -5.5,-0.5 -0.32688,0.38538 -0.65121,1 -0.75,1.5 h -0.5 c -0.10427,-0.5 -0.47225,-1.17363 -0.75,-1.5 -2.49188,-2.92809 -4.39599,-0.82481 -5.5,0.5" style="display:inline;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" inkscape:connector-curvature="0"/>
+ <g style="display:inline;enable-background:new" id="g14433" transform="rotate(-90,380.52904,134)">
+ <path id="path17796-5" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 390.02903,140.97097 -3,4 3,4 m 5,-6 1,2 -1,2 m -8,-2 h 9" inkscape:connector-curvature="0"/>
+ </g>
+ <path id="path18766-5" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 348.5,120.5 c -2.76033,0 -5,1.63344 -5,2.99999 0,1.5 2.5,3 5.5,3 0,0 4,0.25 6,-2.5 m -3.75,-0.5 h 4.25 v 3.99999" inkscape:connector-curvature="0"/>
+ <g style="display:inline;enable-background:new" id="g12950" transform="translate(-42.000002,4.4999696e-6)">
+ <g id="g12531-9" transform="translate(-209.00718,-44.00717)" style="display:inline;opacity:0.6;enable-background:new">
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png" id="path12527-3" d="m 453.49999,169.5 h -7 v -8 H 447.5 l 4.96986,-1e-5 h 1.03015" style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="cccccc"/>
+ <path sodipodi:nodetypes="cccc" style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 449.49999,173.5 h 4 m -1.99997,-1.99995 v 2" id="path12529-5" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ </g>
+ <path id="path12537-3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 250.5,120.5 -1.1e-4,-1.89249 c 0,-1.1679 -0.89539,-2.11463 -1.99994,-2.11463 -1.10454,0 -1.99996,0.94673 -1.99996,2.11463 l 5e-5,1.89249" inkscape:connector-curvature="0" sodipodi:nodetypes="ccscc"/>
+ <path id="path12925" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 250.5,125.5 -6e-5,1.88537 c 0,1.1679 -0.89539,2.11463 -1.99994,2.11463 -1.10454,0 -1.99996,-0.94673 -1.99996,-2.11463 V 125.5" inkscape:connector-curvature="0" sodipodi:nodetypes="ccscc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g12957" transform="translate(-42.000002,4.4999696e-6)">
+ <path sodipodi:nodetypes="ccsccc" inkscape:connector-curvature="0" d="m 267.49999,119.06886 4e-5,-0.32121 c 0,-1.24137 0.8954,-2.24765 1.99996,-2.24765 1.10454,0 1.99997,1.00628 1.99997,2.24765 l 4e-5,1.50083 c 0,1.24525 -0.89543,2.25152 -1.99997,2.25152" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path12523-5"/>
+ <g style="display:inline;opacity:0.6;enable-background:new" transform="translate(-188.00718,-44.00717)" id="g12922">
+ <path sodipodi:nodetypes="cccccc" style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 453.49999,169.5 h -7 v -8 H 447.5 l 4.96986,-1e-5 h 1.03015" id="path12917" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png" id="path12920" d="m 449.49999,173.5 h 4 m -1.99997,-1.99995 v 2" style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="cccc"/>
+ </g>
+ <path id="path12942" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 271.49995,123.93119 -4e-5,0.32121 c 0,1.24137 -0.8954,2.24765 -1.99996,2.24765 -1.10454,0 -1.99997,-1.00628 -1.99997,-2.24765 l -4e-5,-1.50083 c 0,-1.24525 0.89543,-2.25152 1.99997,-2.25152" inkscape:connector-curvature="0" sodipodi:nodetypes="ccsccc"/>
+ </g>
+ <path sodipodi:nodetypes="csccscc" inkscape:connector-curvature="0" d="m 224,401 c -1.75736,1.75736 -4.31739,2.03089 -6.18519,0.18519 C 215.94701,399.33949 216.24264,396.75736 218,395 l 4,-4 c 1.75736,-1.75736 4.31739,-2.03089 6.18519,-0.18519 1.8678,1.8457 1.57217,4.42783 -0.18519,6.18519 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path14559-9"/>
+ <g style="display:inline;enable-background:new" id="g13834" transform="rotate(90,244,438.00001)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g13861" transform="rotate(-90,244.00797,459)" style="stroke:#ffffff">
+ <path inkscape:connector-curvature="0" id="path13852" d="m 269.00797,465 2,-3 -2,-3 2,-3 -2,-3" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
+ <path style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 264.00797,465 2,-3 -2,-3 2,-3 -2,-3" id="path13854" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path13856" d="m 259.00797,465 2,-3 -2,-3 2,-3 -2,-3" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
+ </g>
+ </g>
+ <path id="path15447" d="m 539.5,10.000005 c -3.5682,0 -6.5,2.931819 -6.5,6.499999 0,1.42599 0.4737,2.74606 1.2637,3.822271 l -3.9707,3.9707 a 1.0001,1.0001 0 1 0 1.414,1.41406 l 3.9707,-3.9707 c 1.0762,0.78998 2.3963,1.26367 3.8223,1.26367 3.5682,0 6.5,-2.93182 6.5,-6.500001 0,-3.56818 -2.9318,-6.499999 -6.5,-6.499999 z m 0,2.999999 c 0.051,0 0.098,0.0135 0.1484,0.0156 a 0.50005,0.50005 0 0 1 0.3516,0.4844 v 2.5 h 2.5 a 0.50005,0.50005 0 0 1 0.4863,0.35742 0.50005,0.50005 0 0 1 0,0.002 c 0,0.0477 0.014,0.0925 0.014,0.14062 0,0.0488 -0.012,0.0942 -0.014,0.14258 A 0.50005,0.50005 0 0 1 542.5,17.000004 H 540 v 2.5 a 0.50005,0.50005 0 0 1 -0.3574,0.486331 c -0.048,0.002 -0.092,0.0137 -0.1406,0.0137 -0.049,0 -0.094,-0.0117 -0.1426,-0.0137 A 0.50005,0.50005 0 0 1 539,19.500004 v -2.5 h -2.5 a 0.50005,0.50005 0 0 1 -0.4863,-0.35742 0.50005,0.50005 0 0 1 0,-0.002 c 0,-0.0476 -0.014,-0.0925 -0.014,-0.14062 0,-0.0488 0.012,-0.0942 0.014,-0.14258 a 0.50005,0.50005 0 0 1 0.4863,-0.35738 h 2.5 v -2.5 a 0.50005,0.50005 0 0 1 0.3516,-0.48438 c 0.05,-0.002 0.098,-0.0156 0.1484,-0.0156 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:7.17647076;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 467.5,10.000005 a 0.50005006,0.50005006 0 0 0 -0.5,0.5 v 15 a 0.50005006,0.50005006 0 0 0 0.5,0.5 h 15 a 0.50005006,0.50005006 0 0 0 0.5,-0.5 v -15 a 0.50005006,0.50005006 0 0 0 -0.5,-0.5 z m 0.5,0.999999 h 4 v 4 h -4 z m 5,0 h 4 v 4 h -4 z m 5,0 h 4 v 4 h -4 z m -10,5 h 4 v 4.000001 h -4 z m 5,0 h 4 v 4.000001 h -4 z m 5,0 h 4 v 4.000001 h -4 z m -10,5.000001 h 4 v 4 h -4 z m 5,0 h 4 v 4 h -4 z m 5,0 h 4 v 4 h -4 z" id="rect15343" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path15369" d="m 449.75,12.000004 a 0.50005006,0.50005006 0 0 0 -0.4824,0.36914 l -3.25,12.000001 a 0.50005006,0.50005006 0 0 0 0.4824,0.63086 h 15 a 0.50005006,0.50005006 0 0 0 0.4824,-0.63086 l -3.25,-12.000001 a 0.50005006,0.50005006 0 0 0 -0.4824,-0.36914 z m 0.3828,1 h 2.086 l -0.2169,2 h -2.4121 z m 3.0938,0 h 1.5468 l 0.2168,2 h -1.9804 z m 2.5547,0 h 2.0859 l 0.541,2 h -2.4101 z m -6.461,3 h 2.5723 l -0.3262,3 h -3.0586 z m 3.5801,0 h 2.1992 l 0.3262,3 h -2.8516 z m 3.207,0 h 2.5723 l 0.8125,3 h -3.0586 z m -7.8711,4.000001 h 3.2207 l -0.4336,4 h -3.8711 z m 4.2305,0 h 3.0664 l 0.4356,4 h -3.9375 z m 4.0762,0 h 3.2207 l 1.084,4 h -3.8711 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" d="m 498.5,10.000005 c -2.1397,0 -3.8073,1.472549 -4.3301,3.244139 -0.6497,-0.7477 -1.5105,-1.24414 -2.6699,-1.24414 -1.9271,0 -3.5,1.57293 -3.5,3.5 0,1.92708 1.5729,3.5 3.5,3.5 h 7 c 2.4794,0 4.5,-2.02064 4.5,-4.5 0,-2.47936 -2.0206,-4.499999 -4.5,-4.499999 z m 0,2.999999 c 0.8225,0 1.5,0.67749 1.5,1.5 0,0.82251 -0.6775,1.5 -1.5,1.5 -0.8225,0 -1.5,-0.67749 -1.5,-1.5 0,-0.82251 0.6775,-1.5 1.5,-1.5 z m -7,1 c 0.8225,0 1.5,0.67749 1.5,1.5 0,0.82251 -0.6775,1.5 -1.5,1.5 -0.8225,0 -1.5,-0.67749 -1.5,-1.5 0,-0.82251 0.6775,-1.5 1.5,-1.5 z m 7,0 c -0.2821,0 -0.5,0.21794 -0.5,0.5 0,0.28206 0.2179,0.5 0.5,0.5 0.2821,0 0.5,-0.21794 0.5,-0.5 0,-0.28206 -0.2179,-0.5 -0.5,-0.5 z m -3.9512,0.99023 c 4e-4,0.003 0,0.007 0,0.01 h -0.051 c 0.017,0 0.032,-0.008 0.049,-0.01 z m -3.0488,0.0098 c -0.2821,0 -0.5,0.21794 -0.5,0.5 0,0.28206 0.2179,0.5 0.5,0.5 0.2821,0 0.5,-0.21794 0.5,-0.5 0,-0.28206 -0.2179,-0.5 -0.5,-0.5 z m 1,5.000001 c -0.2761,3e-5 -0.5,0.22387 -0.5,0.5 v 1 0.5 h -1 v -0.5 a 0.50005,0.50005 0 0 0 -0.5078,-0.50781 0.50005,0.50005 0 0 0 -0.4922,0.50781 v 1 1 a 0.50005,0.50005 0 0 0 1,0 v -0.5 h 1 v 0.5 1 c 0,0.1326 0.053,0.25976 0.1465,0.35352 l 1,1 c 0.094,0.0938 0.2209,0.14646 0.3535,0.14648 h 5 c 0.2761,-3e-5 0.5,-0.22387 0.5,-0.5 v -0.5 h 3.293 l 0.8535,0.85352 c 0.315,0.31479 0.8533,0.0918 0.8535,-0.35352 v -4 c -2e-4,-0.44533 -0.5385,-0.66831 -0.8535,-0.35352 l -0.8535,0.85352 H 499 v -1.5 c 0,-0.27613 -0.2239,-0.49997 -0.5,-0.5 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:new" id="path15245"/>
+ <g id="g14544" transform="translate(41.999998,84.000005)" style="display:inline;fill:#ffffff;enable-background:new">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 96.587891,412.0293 c -2.536833,-0.25005 -4.958537,1.13288 -6.03125,3.44531 -1.072714,2.31243 -0.565589,5.05473 1.263671,6.83008 1.829261,1.77534 4.587877,2.20194 6.867188,1.06054 2.27931,-1.14139 3.58948,-3.60459 3.26367,-6.13281 a 0.50026463,0.50026463 0 1 0 -0.99219,0.12891 c 0.27193,2.11014 -0.8183,4.15672 -2.720699,5.10937 -1.902394,0.95265 -4.193937,0.59896 -5.720703,-0.88281 -1.526766,-1.48177 -1.948059,-3.76137 -1.052734,-5.69141 0.895325,-1.93003 2.90806,-3.08174 5.02539,-2.87304 a 0.50005006,0.50005006 0 1 0 0.09766,-0.99414 z" id="path14540" inkscape:connector-curvature="0"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 98.976562,410.13281 c -1.571613,0.41642 -2.737245,1.74665 -2.943359,3.35938 a 0.50013831,0.50013831 0 1 0 0.992188,0.12695 c 0.154909,-1.21208 1.025848,-2.20656 2.207031,-2.51953 1.181178,-0.31297 2.429298,0.11935 3.164058,1.0957 0.73477,0.97635 0.80549,2.29734 0.17774,3.34571 -0.62775,1.04836 -1.82561,1.61054 -3.033204,1.42382 a 0.50005006,0.50005006 0 1 0 -0.152344,0.98828 c 1.606758,0.24844 3.207718,-0.50354 4.042968,-1.89843 0.83525,-1.3949 0.74131,-3.16186 -0.23633,-4.46094 -0.97763,-1.29908 -2.64713,-1.87736 -4.218748,-1.46094 z" id="path14542" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14626" transform="translate(-1.8536743e-6,23.000005)">
+ <g id="g14585" transform="translate(399,-233)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96" style="opacity:0.6">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path14565" d="m 29.5,379.5 -2.00005,2.00001" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path14567" d="m 35.5,377.5 h 5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:nodetypes="cc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 31.5,373.5 v -5" id="path14569" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path14571" d="m 27.5,378.5 v 3 h 3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path inkscape:connector-curvature="0" id="path14573" d="m 29.5,370.5 2,-2 2,2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path inkscape:connector-curvature="0" id="path14582" d="m 38.5,375.5 2,2 -2,2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <circle style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path12956-5" cx="431" cy="144" r="1.99635"/>
+ </g>
+ <path sodipodi:nodetypes="ccccccc" inkscape:connector-curvature="0" d="m 94.499998,630.5 v -7 0 l 5,3.25 v 0.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path14742"/>
+ <path id="path14759" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 114.5,624.5 h 7 v 0 l -3.25,5 h -0.5 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc"/>
+ <path sodipodi:nodetypes="ccccccc" inkscape:connector-curvature="0" d="m 136.5,630.5 v -7 0 l 5,3.25 v 0.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path14762"/>
+ <path id="path14764" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 163.5,629.5 h -7 v 0 l 3.25,-5 h 0.5 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 241.25,624.5 h 4.5 l -2.25,4.75 z" id="path14837" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <g style="display:inline;enable-background:new" id="g13609" transform="translate(-187,-89.999995)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="path13602" d="m 196.5,668.5 c -1.25,0 -2,1.05719 -2,2 v 9 c 0,-0.94281 0.75,-2 2,-2 h 9 v -9 z m 4,0.5 c 1.37479,0 2.5,1.12521 2.5,2.5 0,1.18026 -0.86027,2.25 -2,2.44531 V 675 h -1 v -1.5 c 3e-5,-0.27613 0.22387,-0.49997 0.5,-0.5 0.83435,0 1.5,-0.66565 1.5,-1.5 0,-0.83435 -0.66565,-1.5 -1.5,-1.5 -0.83435,0 -1.5,0.66565 -1.5,1.5 v 0.5 h -1 v -0.5 c 0,-1.37479 1.12521,-2.5 2.5,-2.5 z m -0.5,7 h 1 v 1 h -1 z" style="fill:#ffffff;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path13531" d="m 196.5,679.5 h 9" style="opacity:1;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"/>
+ <path id="path13556" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" d="m 196.5,677.5 h 9 v -9 h -9 c -1.25,0 -2,1.05719 -2,2 v 9 c 0,-0.94281 0.75,-2 2,-2 z" inkscape:connector-curvature="0" sodipodi:nodetypes="sccsccs"/>
+ <path sodipodi:nodetypes="csc" inkscape:connector-curvature="0" d="m 205.5,681.5 h -9 c -1.25,0 -2,-1.05719 -2,-2" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" id="path13560"/>
+ </g>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g10909" style="display:inline;opacity:0.98999999;enable-background:new" transform="matrix(-1,0,0,1,1290,262.99979)">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 968.5,168.00021 c 0.2761,3e-5 0.5,0.22387 0.5,0.5 v 13 c 0,0.27613 -0.2239,0.49997 -0.5,0.5 h -13 c -0.2761,-3e-5 -0.5,-0.22387 -0.5,-0.5 v -13 c 0,-0.27613 0.2239,-0.49997 0.5,-0.5 z m -10,2 c -0.8225,0 -1.5,0.67749 -1.5,1.5 0,0.82251 0.6775,1.5 1.5,1.5 0.8225,0 1.5,-0.67749 1.5,-1.5 0,-0.82251 -0.6775,-1.5 -1.5,-1.5 z m 4.97656,3 c -0.1708,0.008 -0.32545,0.10335 -0.41015,0.25195 l -4,7 c -0.1903,0.33312 0.05,0.74758 0.43359,0.74805 h 8 c 0.3836,-4.7e-4 0.62389,-0.41493 0.43359,-0.74805 l -4,-7 c -0.093,-0.16311 -0.26943,-0.26042 -0.45703,-0.25195 z" id="path10907" inkscape:connector-curvature="0"/>
+ </g>
+ <path style="display:inline;opacity:0.3;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 217.5,23.500003 3,-6.000001 3,6.000001 z" id="path13331-5" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <g style="display:inline;enable-background:new" id="g11187" transform="translate(483,-126)">
+ <path id="path10969" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 59.5,293.5 2,2 -2,2 m -7,-2 h 9" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" d="m 48.5,286.5 2,-2 2,2 m -2,7 v -9" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path10973"/>
+ <ellipse ry="1.500003" rx="1.5000015" cy="295" cx="51" id="ellipse11105" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g11150" transform="translate(399,-126)">
+ <path sodipodi:nodetypes="ccccc" id="path10951" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 92.492848,293.49999 -2.000002,-2.00001 1.999995,-1.99999 m -1.48532,1.99996 5.485329,4e-5" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="ccccc" id="path10953" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 100.67158,297.5 h 2.82843 v -2.82843 m -4,-2.17157 3.5,4.5" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" d="M 103.50001,287.32843 V 284.5 h -2.82843 m -1.171569,5 3.499999,-4.5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path10971" sodipodi:nodetypes="ccccc"/>
+ <ellipse ry="1.500003" rx="1.5000015" cy="291" cx="98" id="ellipse11109" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g11199" transform="translate(399,-126)">
+ <path inkscape:connector-curvature="0" d="m 76.5,287.5 h 3 v 3 m 0,-3 -6.00005,6.00001" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path10963"/>
+ <path inkscape:connector-curvature="0" d="m 80.5,293.5 2,2 -2,2 m -7,-2 h 9" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path10965" sodipodi:nodetypes="ccccc"/>
+ <ellipse style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="ellipse11107" cx="72" cy="295" rx="1.5000015" ry="1.500003"/>
+ <path sodipodi:nodetypes="ccccc" id="path11125" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 69.5,286.5 2,-2 2,2 m -2,7 v -9" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g11193" transform="translate(420,-126)">
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" d="m 27.5,294.5 v 3 h 3 m 0,-3 -3.00005,3.00001" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path11137"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" d="m 29.5,286.5 2,-2 2,2 m -2,5 v -7" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path11139"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" d="m 38.5,291.5 2,2 -2,2 m -5,-2 h 7" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path11141"/>
+ <ellipse ry="1.500003" rx="1.5000015" cy="293" cx="32" id="ellipse11143" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g11319" transform="matrix(0,1,1,0,394.99748,-59.002525)">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path11311" d="m 203.00253,123.00252 v -7" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" transform="translate(760.99456,-488.99997)" id="g11317" style="display:inline;opacity:0.6;enable-background:new">
+ <g id="g11315">
+ <path inkscape:connector-curvature="0" id="path11313" d="m -560.49203,608.50249 -4.00753,-0.002 0.008,1.002 1.99247,7.998 h 11 l 0.008,-0.998 -2.00553,-8.00201 -1.99447,0.003" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="cccccccc"/>
+ </g>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g11383" transform="translate(-1.8536743e-6,42.000005)">
+ <ellipse ry="1.500003" rx="1.5000015" cy="123" cx="519" id="ellipse11331" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path inkscape:connector-curvature="0" d="m 512.48533,124.50004 -2.00001,-2.00001 2,-1.99999 M 511,122.5 l 6.48533,4e-5" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path10951-2" sodipodi:nodetypes="ccccc"/>
+ <g style="display:inline;opacity:0.6;enable-background:new" id="g11317-6" transform="matrix(0,1,1,0,-94.00249,680.99203)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <g id="g11315-6">
+ <path sodipodi:nodetypes="cccccccc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m -560.49203,609.50249 -4.00753,-0.002 0.008,1.002 1.99247,6.998 h 11 l 0.008,-0.998 -2.00553,-7.00201 -2.99447,0.003" id="path11313-8" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g20257" transform="translate(171,5.7999696e-6)">
+ <path id="path20203" d="m -156.48438,137 c -0.27612,3e-5 -0.49996,0.22387 -0.5,0.5 v 0.5 h -1.5 c -0.32865,0.005 -0.51562,0.25232 -0.51562,0.5 v 0.5 h 2.51562 1 H -153 v -0.5 c 0,-0.25267 -0.14909,-0.49526 -0.48438,-0.5 h -1.5 v -0.5 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 3.48438,2 0.0156,0.5 v 0.5 h -6 v -0.5 L -159,139 h -1.48438 c -0.27612,3e-5 -0.49996,0.22387 -0.5,0.5 v 3.5 h 2.3086 a 1.50015,1.50015 0 0 1 0.16211,-0.0137 1.50015,1.50015 0 0 1 1.52929,1.69726 V 149 h 5.5 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -9 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <g id="g20226">
+ <path sodipodi:nodetypes="ccccc" id="path20207" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m -162.48485,144.5 h 4 v 4 m -6,2 6,-6" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g20243" transform="matrix(-1,0,0,1,-102.98438,5.7999696e-6)">
+ <path id="path20230" transform="matrix(-1,0,0,1,-274.98438,0)" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m -144.5,139 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 9 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 7 2 c 0.10658,-1e-5 0.20011,-0.0408 0.28125,-0.0977 l -3.3418,-3.34179 a 1.50015,1.50015 0 1 1 2.1211,-2.1211 L -135,144.87891 V 139.5 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 h -1.48438 L -137,139.5 v 0.5 h -6 v -0.5 l 0.0156,-0.5 z m 5,-2 c 0.27613,3e-5 0.49997,0.22387 0.5,0.5 v 0.5 h 1.5 c 0.32865,0.005 0.51562,0.25232 0.51562,0.5 v 0.5 h -2.51562 -1 -2.48438 v -0.5 c 0,-0.25267 0.14909,-0.49526 0.48438,-0.5 h 1.5 v -0.5 c 3e-5,-0.27613 0.22387,-0.49997 0.5,-0.5 z" inkscape:connector-curvature="0"/>
+ <g transform="rotate(180,-150.98485,147.5)" id="g20236">
+ <path inkscape:connector-curvature="0" d="m -162.48485,144.5 h 4 v 4 m -6,2 6,-6" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="path20234" sodipodi:nodetypes="ccccc"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g20375" transform="matrix(-1,0,0,1,131,5.7999696e-6)">
+ <path id="path20369" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 48.50005,140.50712 v -3 m 0,8 v -3 m 0,8 v -3" inkscape:connector-curvature="0"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 51.515625,137 c -0.27612,3e-5 -0.49996,0.22387 -0.5,0.5 V 138 H 50 v 1 h 1.515625 1 H 55 v -0.5 c 0,-0.25267 -0.149085,-0.49526 -0.484375,-0.5 h -1.5 v -0.5 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z M 55,139 l 0.01563,0.5 V 140 H 50 v 9 h 6.515625 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -0.35938 l -2.580078,-2.58007 a 1.50015,1.50015 0 1 1 2.121094,-2.1211 l 0.458984,0.45899 V 139.5 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z" id="path20371" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="ccccc" id="path20373" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 57.49495,150.5 h 4 v -4 m -6,-2 6,6" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g20474">
+ <path d="m 48.50005,140.50712 v -3 m 0,8 v -3 m 0,8 v -3" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path8290-6-5" inkscape:connector-curvature="0"/>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 51.509766,137 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 V 138 H 50 v 1 h 1.509766 1 2.515625 v -0.5 c 0,-0.24768 -0.186975,-0.495 -0.515625,-0.5 h -1.5 v -0.5 c -4e-5,-0.27613 -0.22388,-0.49997 -0.5,-0.5 z m 3.515625,2 -0.01563,0.5 V 140 H 50 v 9 h 4.009766 v -4.31641 c -0.12178,-0.91601 0.605587,-1.72326 1.529296,-1.69726 0.05424,0.002 0.10831,0.007 0.16211,0.0137 h 1.308594 v -3.5 c -4e-5,-0.27613 -0.22388,-0.49997 -0.5,-0.5 z" id="path20454" inkscape:connector-curvature="0"/>
+ <g transform="matrix(-1,0,0,1,-102.97428,1.2445863e-6)" id="g20458">
+ <path inkscape:connector-curvature="0" d="m -162.48485,144.5 h 4 v 4 m -6,2 6,-6" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="path20456" sodipodi:nodetypes="ccccc"/>
+ </g>
+ </g>
+ <path id="circle20487" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 454.25,455.5 c 0.25,-1.25 1.04248,-2.3927 2.23158,-2.82185 1.18911,-0.42915 2.51964,-0.0668 3.32697,0.90597 0.80734,0.9728 0.91821,2.34732 0.27724,3.43695 L 454.25,465.5 h -0.5 l -5.84808,-8.5 c -0.63059,-1.09223 -0.51073,-2.46223 0.29995,-3.42836 0.81068,-0.96613 2.13905,-1.32207 3.32419,-0.89072 C 452.7112,453.11227 453.5,454.25 453.75,455.5 Z" inkscape:connector-curvature="0" sodipodi:nodetypes="csscccccccc"/>
+ <path inkscape:connector-curvature="0" id="path20628" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 471.62109,452.50195 c -0.91158,-0.0366 -1.81191,0.34572 -2.41992,1.07032 -0.81068,0.96613 -0.92942,2.3355 -0.29883,3.42773 l 1.26172,1.83594 L 473.5,455.5 l 2,2 3,-3 2.56055,2.56055 0.0254,-0.0391 c 0.64097,-1.08963 0.52999,-2.4647 -0.27735,-3.4375 -0.80733,-0.97277 -2.13706,-1.3354 -3.32617,-0.90625 -1.1891,0.42915 -1.98242,1.57227 -2.23242,2.82227 h -0.5 c -0.25,-1.25 -1.03947,-2.38701 -2.22461,-2.81836 -0.29628,-0.10784 -0.60043,-0.16749 -0.9043,-0.17969 z M 478.5,458.5 l -3,3 -2,-2 -1.70508,1.70508 L 474.75,465.5 h 0.5 l 4.17969,-6.07031 z"/>
+ <g style="display:inline;enable-background:new" id="g21550" transform="translate(-21.000002,189)">
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 498.49288,297.50712 h -9 v -9 L 498.5,288.5 Z" id="path21430" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="ccccc" id="path21432" d="m 502.5,286.25 v 8 l -2,2 v -8 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 490.75,286.5 2,-2 8,1.2e-4 -2,2 z" id="path21438" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ </g>
+ <g transform="translate(-243,336)" style="display:inline;opacity:1;enable-background:new" id="g21571">
+ <path inkscape:connector-curvature="0" id="rect21332" d="M 775.46875,284 C 774.66371,284 774,284.66371 774,285.46875 v 11.0625 c 0,0.80504 0.66371,1.46875 1.46875,1.46875 h 8.0625 C 784.33629,298 785,297.33629 785,296.53125 v -0.58203 c -1.68181,-0.24823 -3,-1.70468 -3,-3.44922 0,-1.74454 1.31819,-3.20099 3,-3.44922 v -3.58203 C 785,284.66371 784.33629,284 783.53125,284 Z M 775,285 h 9 v 3 h -9 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <circle transform="scale(1,-1)" style="opacity:0.6;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle21336" cx="785.5" cy="-292.5" r="2"/>
+ </g>
+ <g transform="translate(-285,336)" style="display:inline;opacity:1;enable-background:new" id="g21575">
+ <path sodipodi:nodetypes="sscssssccsssscccss" inkscape:connector-curvature="0" id="rect21315-8" d="m 797,284 c -1.09935,0 -2,0.90065 -2,2 v 2 8 c 0,1.09935 0.90065,2 2,2 h 7 c 1.09935,0 2,-0.90065 2,-2 v -0.5 c 0.01,-0.67616 -1.00956,-0.67616 -1,0 v 0.5 c 0,0.56265 -0.43735,1 -1,1 h -7 c -0.56265,0 -1,-0.43735 -1,-1 v -8 h 10 v -2 c 0,-1.09935 -0.90065,-2 -2,-2 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"/>
+ <circle transform="scale(1,-1)" style="display:inline;opacity:0.6;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="circle21317-8" cx="806.5" cy="-291.5" r="2"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g14854" transform="translate(-70.000007,21.000006)">
+ <path sodipodi:nodetypes="ccccc" id="path14834" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 333.5,95.5 v 9.25 m -5,2 5,-2 8,2.75" inkscape:connector-curvature="0"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 335.5,95.935547 v 6.884773 l 6,1.92968 v -6.884766 z" id="path14836" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" transform="matrix(-1,0,0,1,551.0001,21.000006)" id="g14869">
+ <path inkscape:connector-curvature="0" d="m 263.5,95.5 v 9.25 m -5,2 5,-2 8,2.75" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path14865" sodipodi:nodetypes="ccccc"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 265.5,95.935547 1.2e-4,6.884773 6,1.92968 -1.2e-4,-6.884766 z" id="path14867" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g transform="translate(-6.3536743e-6,22.000006)" style="display:inline;enable-background:new" id="g22568">
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 301.5,105.5 6,-2 6,2 -6,2 z" id="path14873" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path inkscape:connector-curvature="0" d="m 307.5,94.5 v 6.25 m -6,2 6,-2 6,2" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path14875" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g20685" transform="translate(-21.000002,84.000005)">
+ <path style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" d="m 363.5,422.5 4,-4 m 1,-1 4,-4" id="path20647" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <ellipse transform="scale(-1,1)" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle20649" cx="-374.50516" cy="411.4975" rx="1.0000999" ry="0.99747497"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 372.5,413.5 1,4 h 3" id="path20651" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ <path inkscape:connector-curvature="0" id="path20667" d="m 368.5,417.5 3,3 -3,3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" sodipodi:nodetypes="ccc"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path20669" d="m 371.505,412.49793 -2,-2 -3,3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g20896" transform="translate(-189,63.000005)">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 342.5,348 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 3 a 0.50005,0.50005 0 0 0 0.5,0.5 h 3 a 0.50005,0.50005 0 0 0 0.5,-0.5 v -3 a 0.50005,0.50005 0 0 0 -0.5,-0.5 z m 0.5,1 h 2 v 2 h -2 z" id="path20782" inkscape:connector-curvature="0"/>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" transform="translate(188,-63)" id="g20817">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 155.5,413 a 0.50005,0.50005 0 1 0 0,1 h 1.01562 2.49805 L 159,417.28711 c -1.65939,1.40974 -3.24134,2.62162 -3.98828,6.10742 a 0.50005,0.50005 0 1 0 0.97656,0.21094 c 0.67528,-3.15139 1.92341,-4.0882 3.51758,-5.42774 1.58398,1.34059 2.83152,2.27747 3.51953,5.42969 a 0.50005,0.50005 0 1 0 0.97656,-0.21484 C 163.23922,419.89801 161.65091,418.68907 160,417.27539 L 160.01367,414 h 2.2168 3.28515 a 0.50005,0.50005 0 0 0 0,-1 h -3.04296 c -0.45945,0.59659 -1.17125,0.99219 -1.96875,0.99219 -0.79751,0 -1.50931,-0.3956 -1.96875,-0.99219 h -2.01954 z" transform="translate(2)" id="path20811" inkscape:connector-curvature="0"/>
+ <circle style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle20815" cx="162.50357" cy="411.49646" r="0.99643946"/>
+ </g>
+ </g>
+ <path id="path20963" d="m 281.51612,230.46982 4,-9 4,9 -4,4 z" style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0"/>
+ <g style="display:inline;enable-background:new" transform="translate(-189,168)" id="g21028">
+ <path inkscape:connector-curvature="0" id="path21020" d="m 342.5,348 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 3 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 3 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -3 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="ccccccccc"/>
+ <g id="g21026" transform="translate(188,-63)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path id="circle21024" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 162.50391,410 c -0.82054,0 -1.4961,0.67556 -1.4961,1.49609 0,0.82054 0.67556,1.4961 1.4961,1.4961 0.82053,0 1.49609,-0.67556 1.49609,-1.4961 C 164,410.67556 163.32444,410 162.50391,410 Z M 159.5,413 c -0.67616,-0.01 -0.67616,1.00956 0,1 h 1.01562 0.49805 L 161,417.28711 c -1.65939,1.40974 -3.24134,2.62162 -3.98828,6.10742 -0.17787,0.67446 0.86019,0.89868 0.97656,0.21094 0.67528,-3.15139 1.92341,-4.0882 3.51758,-5.42774 1.58398,1.34059 2.83152,2.27747 3.51953,5.42969 0.13318,0.66658 1.13543,0.44609 0.97656,-0.21484 -0.76273,-3.49457 -2.35104,-4.70351 -4.00195,-6.11719 L 162.01367,414 h 2.2168 3.28515 c 0.6573,-0.009 0.6573,-0.9907 0,-1 h -3.04296 c -0.45945,0.59659 -1.17125,0.99219 -1.96875,0.99219 -0.79751,0 -1.50931,-0.3956 -1.96875,-0.99219 h -0.0195 z" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" transform="translate(-84.000002,-62.999995)" id="g21409">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 354.75,477.25 -8.25,8.25 -4,1 1,-4 8.25,-8.25 z" id="path21405" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ <path transform="translate(-126,252)" id="path21407" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="M 477.25,222.75 478,222 c 0.75,-0.75 1.5,-0.5 2,0 l 1,1 c 0.5,0.5 0.75,1.25 0,2 l -0.75,0.75 z" inkscape:connector-curvature="0" sodipodi:nodetypes="csssscc"/>
+ </g>
+ <g style="display:inline;enable-background:new" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" transform="translate(-21.000001)" id="g12839">
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 352.75,479.25 -6.25,6.25 -4,1 1,-4 6.25,-6.25 z" id="path12827" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ <path transform="translate(-126,252)" id="path12837" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="M 477.25,222.75 478,222 c 0.75,-0.75 1.5,-0.5 2,0 l 1,1 c 0.5,0.5 0.75,1.25 0,2 l -0.75,0.75 z" inkscape:connector-curvature="0" sodipodi:nodetypes="csssscc"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g14495" transform="matrix(-1,0,0,1,718.99999,4.4999696e-6)">
+ <path sodipodi:nodetypes="ccccc" d="m 371.5,150.5 -8,-8 m 4.00002,8.00505 h 4 v -4" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path14485" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:connector-curvature="0" id="path14491" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 368.50001,137.50505 8,8 M 372.49999,137.5 h -4 v 4" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g20455" transform="rotate(-180,359.49632,417.00344)">
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 281.49288,332.50712 2,-2 h 5 v 5 l -2,2 h -5 z" id="path20447" sodipodi:nodetypes="ccccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="ccccccc" id="path20449" d="m 279.5,331.25 4.75,-4.75 8.24288,0.007 0.007,8.24288 -4.75,4.75 -8.25712,0.007 z" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g20430" transform="translate(41.999998,4.4999696e-6)">
+ <g id="g20456">
+ <path id="circle20459" transform="translate(-42)" d="m 469.08398,415.58594 c -0.81593,0.95753 -1.21878,2.22985 -1.04296,3.52148 0.24625,1.80912 1.56436,3.29294 3.33203,3.75 1.43669,0.37149 2.93514,-0.006 4.03515,-0.9414 -0.29636,0.0501 -0.5984,0.084 -0.9082,0.084 -0.38579,0 -0.76279,-0.0423 -1.12695,-0.11914 -0.56283,0.14546 -1.16207,0.15983 -1.75,0.008 -1.37737,-0.35614 -2.39992,-1.50634 -2.5918,-2.91601 -0.0626,-0.45958 -0.0236,-0.91417 0.0879,-1.34571 C 469.04268,417.26409 469,416.88831 469,416.50391 c 0,-0.31305 0.0328,-0.61873 0.084,-0.91797 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="circle20463" transform="translate(-42)" d="M 473.08594,412.25 C 471.30049,412.84735 470,414.51742 470,416.5 c 0,2.47936 2.02064,4.5 4.5,4.5 0.48878,0 0.95142,-0.0971 1.39258,-0.24219 -0.56289,-0.17378 -1.08535,-0.43906 -1.55664,-0.77343 C 472.47547,419.89744 471,418.3827 471,416.5 c 0,-1.08365 0.4989,-2.0367 1.26758,-2.67773 0.18577,-0.57127 0.46679,-1.09859 0.81836,-1.57227 z m 4.23633,0.77539 c -0.44282,0.0305 -0.85289,0.16325 -1.19922,0.38867 1.1126,0.58477 1.87695,1.73711 1.87695,3.08594 0,0.53333 -0.12629,1.03285 -0.33789,1.48438 0.43556,-0.0273 0.83799,-0.15672 1.18164,-0.37305 C 478.93573,417.2536 479,416.88583 479,416.5 c 0,-1.40585 -0.66315,-2.64847 -1.67773,-3.47461 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.8;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 477.5,411.00781 c -2.47912,0 -4.5,2.01847 -4.5,4.4961 0,2.47763 2.02088,4.49609 4.5,4.49609 2.47912,0 4.5,-2.01846 4.5,-4.49609 0,-2.47763 -2.02088,-4.4961 -4.5,-4.4961 z m 0,1.24219 c 1.79419,0 3.25586,1.46081 3.25586,3.25391 0,1.79311 -1.46167,3.2539 -3.25586,3.2539 -1.79418,0 -3.25586,-1.46079 -3.25586,-3.2539 0,-1.7931 1.46168,-3.25391 3.25586,-3.25391 z" transform="translate(-42)" id="path20457"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g19653" transform="translate(-628,42.000005)">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 765.5,479.5 -4.25,4.25 c -1.5,1.5 -0.5,2.75 0.5,2.75 H 766 c 0.748,0 1.5,-0.56644 1.5,-1.5 v -3.5" id="path19637" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccsc"/>
+ <g style="display:inline;enable-background:new" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" transform="translate(418,-4.7064591e-6)" id="g19647">
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 351.75,480.25 -0.25,0.25 -3,-3 0.25,-0.25 z" id="path19643" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path transform="translate(-126,252)" id="path19645" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="M 476.25,223.75 478,222 c 0.75,-0.75 1.5,-0.5 2,0 l 1,1 c 0.5,0.5 0.75,1.25 0,2 l -1.75,1.75 z" inkscape:connector-curvature="0" sodipodi:nodetypes="csssscc"/>
+ </g>
+ </g>
+ <g transform="translate(-288.98994,63.995465)" style="display:inline;opacity:0.6;enable-background:new" id="g8975">
+ <path sodipodi:nodetypes="ccccccc" id="path8936" d="m 799.49706,438.50454 v 5 h 9 l 4,-4 v -5 M 808.5,438.50021 v 4.5" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 799.49706,438.50454 h 9 l 4,-4" id="path8938" sodipodi:nodetypes="ccc"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 812.49706,439.49742 v -5 h -9 l -4,4 v 5" id="path8940" sodipodi:nodetypes="ccccc"/>
+ <path inkscape:connector-curvature="0" id="path8943" d="M 799.49706,438.50454 803.5,434.50021 v 4 z" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:nodetypes="ccccc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="M 808.49706,438.50454 812.5,434.50021 v 5 l -4.00294,4.00433 z" id="path8959" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-329.98994,63.995465)" style="display:inline;opacity:0.98999999;enable-background:new" id="g8968">
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 819.49706,438.50454 v 5 h 9 l 4,-4 v -5" id="path7398" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccc" id="path7400" d="m 819.49706,438.50454 h 9 l 4,-4" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 821.5,436.50021 v -3 h 6 v 3 z" id="path8026" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccccc" inkscape:connector-curvature="0" id="path8055" d="m 824.5,431.50021 v -1 h 6 v 3 l -1,1 v -3 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path inkscape:connector-curvature="0" id="path8961" d="M 828.49706,438.50454 832.5,434.50021 v 4 l -4.00294,5.00433 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g style="display:inline;opacity:0.98999999;enable-background:new" transform="translate(-524.99995,231.99299)" id="g8082">
+ <path inkscape:connector-curvature="0" id="path8078" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 958.49995,220.50701 6,-1e-5 v 9.00001 l -4,4 h -9 V 224.507 l 4,-3.99989 5e-5,-0.007" sodipodi:nodetypes="cccccccc"/>
+ <path inkscape:connector-curvature="0" id="path8080" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 958.5,220.5 h 3 l -4,4 v 3 1 l -0.5,-1 h -1 l -0.50002,1.0071 -1.00003,-1.00009 5e-5,-3.00701 z" sodipodi:nodetypes="ccccccccccc"/>
+ </g>
+ <path inkscape:connector-curvature="0" id="path20483" d="m 75.999998,620 c -3.860077,0 -7,3.13991 -7,7 0,3.86009 3.139924,7 7,7 3.860076,0 7,-3.13991 7,-7 0,-3.86009 -3.139923,-7 -7,-7 z m 2.990234,2.98633 a 1.0001,1.0001 0 0 1 0.716797,1.7207 L 77.41406,627 l 2.292969,2.29297 a 1.0001,1.0001 0 1 1 -1.414062,1.41406 l -2.292969,-2.29297 -2.292969,2.29297 a 1.0001,1.0001 0 1 1 -1.414062,-1.41406 L 74.585936,627 72.292967,624.70703 a 1.0001,1.0001 0 0 1 0.697265,-1.7168 1.0001,1.0001 0 0 1 0.716797,0.30274 l 2.292969,2.29297 2.292969,-2.29297 a 1.0001,1.0001 0 0 1 0.697265,-0.30664 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <g transform="translate(-1.8536743e-6,3.4999696e-6)" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g20495" style="display:inline;opacity:1;fill:#ffffff;enable-background:new">
+ <g transform="translate(-189,588)" id="g20491" style="fill:#ffffff"/>
+ <path id="path20493" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 34,622 c -1.783333,0 -3,1.5 -3,3 h 2 c 0,-0.5 0.283333,-1 1,-1 0.716667,0 1,0.5 1,1 0,0.24702 -0.03644,0.30082 -0.117188,0.41016 -0.08074,0.10934 -0.253932,0.25966 -0.513671,0.4707 C 33.849662,626.30294 33,627.16667 33,628.5 v 0.5 h 2 v -0.5 c 0,-0.66667 0.150338,-0.67794 0.630859,-1.06836 0.240261,-0.19521 0.567072,-0.43551 0.861329,-0.83398 C 36.786444,626.19918 37,625.62798 37,625 c 0,-1.5 -1.216667,-3 -3,-3 z m -1,8.00009 h 2 v 2 H 33 Z M 34,620 c -3.86007,0 -7,3.13991 -7,7 0,3.86009 3.13993,7 7,7 3.86008,0 7,-3.13991 7,-7 0,-3.86009 -3.13992,-7 -7,-7 z m 0,1 c 3.31964,0 6,2.68035 6,6 0,3.31965 -2.68036,6 -6,6 -3.31963,0 -6,-2.68035 -6,-6 0,-3.31965 2.68037,-6 6,-6 z" inkscape:connector-curvature="0"/>
+ </g>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 55.011717,620 c -0.689946,-0.004 -1.325726,0.38513 -1.634766,1.00195 l -5.1875,10.3711 c -0.594248,1.18749 0.293094,2.62623 1.621094,2.62695 h 10.378906 c 1.327265,-7.2e-4 2.213373,-1.43788 1.621094,-2.625 l -5.1875,-10.37305 C 56.317741,620.39258 55.693326,620.0046 55.011717,620 Z m -1.011719,3 h 2 v 6 h -2 z m 0,7 h 2 v 2 h -2 z" id="path20558" inkscape:connector-curvature="0"/>
+ <g style="display:inline;enable-background:new" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g20538" transform="rotate(-180,317.50525,417)">
+ <path style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 332.5,415.5 v 0.5 c 0,2.75 -2.7395,4.88358 -6,4.5 -4.25,-0.5 -6.25,-4.25 -4.25,-6.25 2,-2 5.75,-0.25 6.25,4" id="path20523" inkscape:connector-curvature="0" sodipodi:nodetypes="csszc"/>
+ <path id="path20529" d="m 334.50525,410.5 v 3 h -3 v -3 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="csc" inkscape:connector-curvature="0" id="path20536" d="m 323.5,423.5 h 1.5 c 1.051,0 1.99594,-0.39189 2.5,-1" style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"/>
+ </g>
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 331,410 c -2.22355,0 -4.0767,1.3002 -5.12305,3.18945 0.93682,-0.21724 1.92473,-0.28964 2.92578,-0.17187 0.40221,0.0473 0.78928,0.12403 1.16797,0.21484 C 330.29795,413.09146 330.64197,413 331,413 h 0.5 c 2.02848,0.0287 2.02848,-3.02869 0,-3 z m -3.05859,3.95898 c -3.69856,-0.0756 -6.93164,2.52898 -6.93164,6.04102 v 1.5 c -0.0287,2.02848 3.02869,2.02848 3,0 V 420 c 0,-1.75382 1.80351,-3.30654 4.32617,-3.00977 0.37314,0.0439 0.71883,0.11732 1.03711,0.21485 1.3077,0.40071 2.14372,1.21003 2.47656,1.91211 0.22905,0.48316 0.34095,1.19341 -0.0996,1.63281 -0.4946,0.4933 -1.25,0.34848 -1.89258,-0.0527 -0.70436,-0.44 -1.43726,-1.36047 -1.75195,-2.71875 -0.21041,-0.0194 -0.41646,-0.0328 -0.60742,-0.0234 -1.06865,0.0527 -1.81638,0.53365 -2.19727,1.13086 0.52848,1.85114 1.6077,3.30531 2.9668,4.15429 1.61509,1.00892 3.82413,1.05951 5.33594,-0.2539 0.0754,-0.0514 0.14605,-0.10959 0.21093,-0.17383 0.0562,-0.057 0.10785,-0.11837 0.1543,-0.18359 1.19162,-1.34198 1.31147,-3.2788 0.5918,-4.79688 -0.75194,-1.58612 -2.28118,-2.87289 -4.3086,-3.49414 -0.49344,-0.15121 -1.01745,-0.26354 -1.5664,-0.32812 -0.2499,-0.0294 -0.49757,-0.0457 -0.74414,-0.0508 z" id="path20562" inkscape:connector-curvature="0" sodipodi:nodetypes="scccsccscsccsccccccccccccccccc"/>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g20665">
+ <path id="path20610" d="m 348.51367,409.98828 a 1.50015,1.50015 0 0 0 -0.80859,0.24024 C 343.03811,413.14537 342,418.71429 342,422.5 a 1.50015,1.50015 0 1 0 3,0 c 0,-0.89832 0.0865,-1.89371 0.26758,-2.9043 -0.25845,-3.40076 0.85029,-7.04233 3.87109,-9.4707 a 1.50015,1.50015 0 0 0 -0.625,-0.13672 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.4;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path id="path20608" d="m 351.51367,409.98828 a 1.50015,1.50015 0 0 0 -0.80859,0.24024 c -4.71461,2.94662 -5.33528,8.77693 -3.58399,12.86328 a 1.5005399,1.5005399 0 1 0 2.75782,-1.1836 c -0.38431,-0.89672 -0.59027,-1.91481 -0.62891,-2.95117 -0.67215,-3.14692 0.29131,-6.6121 2.9043,-8.82422 a 1.50015,1.50015 0 0 0 -0.64063,-0.14453 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path20592" d="m 354.51367,409.98828 a 1.50015,1.50015 0 0 0 -0.80859,0.24024 c -4.9147,3.07168 -4.9147,10.47128 0,13.54296 a 1.50015,1.50015 0 1 0 1.58984,-2.54296 c -3.0853,-1.92832 -3.0853,-6.52872 0,-8.45704 a 1.50015,1.50015 0 0 0 -0.78125,-2.7832 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22444" transform="translate(-1.8536743e-6,-41.999995)">
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="ccccc" id="path22408" d="m 283.5,307.5 -0.007,-1.99288 9.00712,-0.007 -0.007,9.007 L 290.5,314.5" style="display:inline;opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ <path id="path22122" d="m 279,309 v 2 h 2 v -2 z m 2,2 v 2 h 2 v -2 z m 2,0 h 2 v -2 h -2 z m 2,0 v 2 h 2 v -2 z m 2,0 h 2 v -2 h -2 z m 0,2 v 2 h 2 v -2 z m 0,2 h -2 v 2 h 2 z m 0,2 v 2 h 2 v -2 z m -2,0 h -2 v 2 h 2 z m -2,0 v -2 h -2 v 2 z m -2,0 h -2 v 2 h 2 z m 0,-2 v -2 h -2 v 2 z m 2,0 h 2 v -2 h -2 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" transform="translate(422.00881,-131.00682)" id="g22132">
+ <path sodipodi:nodetypes="ccccccccc" inkscape:connector-curvature="0" d="m -71.50881,394.50682 -3,13 m -3.22081,-7 h 9.47081 m 1.75,-6 -3.03716,12.98986 h -9.97496 l 3.01212,-12.98986 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path22130"/>
+ </g>
+ <path d="m 391.50391,263 c -0.82054,0 -1.4961,0.67556 -1.4961,1.49609 0,0.82054 0.67556,1.4961 1.4961,1.4961 0.82053,0 1.49609,-0.67556 1.49609,-1.4961 C 393,263.67556 392.32444,263 391.50391,263 Z M 384.5,266 c -0.67616,-0.01 -0.67616,1.00956 0,1 h 5.01562 0.49805 L 390,270.28711 c -1.65939,1.40974 -3.24134,2.62162 -3.98828,6.10742 -0.17787,0.67446 0.86019,0.89868 0.97656,0.21094 0.67528,-3.15139 1.92341,-4.0882 3.51758,-5.42774 1.58398,1.34059 2.83152,2.27747 3.51953,5.42969 0.13318,0.66658 1.13543,0.44609 0.97656,-0.21484 -0.76273,-3.49457 -2.35104,-4.70351 -4.00195,-6.11719 L 391.0137,267 h 2.2168 3.28515 c 0.6573,-0.009 0.6573,-0.9907 0,-1 h -3.04296 c -0.45945,0.59659 -1.17125,0.99219 -1.96875,0.99219 -0.79751,0 -1.50931,-0.3956 -1.96875,-0.99219 h -0.0195 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path22136" inkscape:connector-curvature="0" sodipodi:nodetypes="sssssccccccccccccccccsccc"/>
+ <g id="g22232" transform="translate(-42.000002,-20.999995)" style="display:inline;fill:none;enable-background:new">
+ <path inkscape:connector-curvature="0" id="path22209" style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 141.5,288.5 1,-1 m -4,4 1,-1 m 5,-5 1,-1 m -10,10 1,-1 m -4,4 1,-1" sodipodi:nodetypes="cccccccccc"/>
+ <path inkscape:connector-curvature="0" d="M 132.49999,284.5 H 136.5 v 6 h -4.00001 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path22184" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccc" id="path22212" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 139.5,297.5 v -4 h 6 v 4 z" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-231,-83.999995)" style="display:inline;enable-background:new" id="g26345">
+ <g id="g22592">
+ <path inkscape:connector-curvature="0" id="path22548" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 300.49995,326.5 h 13 v 13.00001 h -13 z" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="cc" d="m 310.49995,327.5 v 11.00001" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path22556" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path22559" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 312.49995,336.50001 h -11" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" id="path22569" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 307.49995,327.5 v 11.00001" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="cc" d="m 312.49995,333.50001 h -11" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path22585" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g transform="translate(-168.00001,-20.999988)" style="display:inline;opacity:1;enable-background:new" id="g26390">
+ <path id="path23021" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 242.5,289.5 v -5 m 0,5 h -5 m -0.007,5.007 v -10 l 10.00712,-0.007" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 250.5,284.50012 v 13 l -13.00712,0.007 z" id="path23044" sodipodi:nodetypes="cccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ </g>
+ <g transform="translate(-2.8536743e-6,-20.999996)" id="g22228" style="display:inline;opacity:1;enable-background:new">
+ <path inkscape:connector-curvature="0" id="path22226" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 225.5,286.5 4,1.2e-4 v 11 l -11.00712,0.007 0.007,-4.00712 h 7.00006 z" sodipodi:nodetypes="ccccccc"/>
+ <rect style="opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect22230" width="6" height="6" x="-222.50006" y="284.5" transform="scale(-1,1)"/>
+ </g>
+ <path sodipodi:nodetypes="cccsc" inkscape:connector-curvature="0" d="m 327.41336,263.49974 h 1.18116 c 3.26811,0 5.90581,1.77278 5.90581,5.31833 0,4.13647 -4.13406,7.68203 -10.63045,7.68203 h -2.36232" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new" id="path22657"/>
+ <g style="display:inline;enable-background:new" id="g22284" transform="translate(-1.8536743e-6,-41.999995)">
+ <path sodipodi:nodetypes="ssccccs" inkscape:connector-curvature="0" d="m 57.892544,296.4472 c -1.672904,1.40373 -4.112184,1.40373 -5.785088,0 -1.672904,-1.40373 -2.096481,-3.80596 -1.00457,-5.6972 L 54.75,284.5 h 0.5 l 3.647114,6.25 c 1.091911,1.89124 0.668334,4.29347 -1.00457,5.6972 z" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" id="path22260"/>
+ <path id="path22264" d="m 52.501454,292.49305 a 2.5629914,2.5493243 0 0 1 0.292656,-0.77 L 54.5,288.5" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22457" transform="translate(20.999998,-20.999995)">
+ <path inkscape:connector-curvature="0" id="path22322" style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:0.99999952;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;enable-background:new" d="m 281,292.5 h -0.5 v -7.25 -0.75 h 11 v 0.75 z" sodipodi:nodetypes="ccccccc"/>
+ <path sodipodi:nodetypes="cccccc" d="m 285.25,292.5 h 6.25 v 1 l -10.5,4 h -0.5 v -2.25" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:0.99999952;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;enable-background:new" id="path22334" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22510" transform="translate(-1.8536743e-6,21.000005)">
+ <g style="display:inline;opacity:0.6;enable-background:new" id="g22476" transform="translate(168,-42)">
+ <path id="path22456" d="m 279.5,284.5 v 2 h 2 v -2 z m 11,0 v 2 h 2 v -2 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccc"/>
+ <path sodipodi:nodetypes="cccccccccc" inkscape:connector-curvature="0" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 279.5,295.5 v 2 h 2 v -2 z m 11,0 v 2 h 2 v -2 z" id="path22458"/>
+ <path id="path22462" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 290.5,285.5 h -9 m -1,1 v 8.9789 m 1,1.0211 h 9 m 1,-1 v -9" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/>
+ </g>
+ <path id="rect22466" d="m 451.5,246.5 h 5 v 5 h -5 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" transform="translate(21.999998,18.000004)" id="g22745">
+ <g id="g22756" transform="translate(20,-60)">
+ <g id="g22751">
+ <path sodipodi:nodetypes="ccccccccccccccccccccc" d="m 279.5,288.5 v 2 l 2,10e-6 v -2 z m 8,0 v 2 l 2,10e-6 v -2 z m -4,6.99999 v 2 l 2,10e-6 v -2 z m 2,10e-6 3,-5 m -5,5 -3,-5 m 1,-1 h 6" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:0.99999952;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;enable-background:new" id="path22741" inkscape:connector-curvature="0"/>
+ <path style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" d="m 283.5,287.5 v -3 h 9 v 11 h -4" id="path22747" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g21947" transform="matrix(-1,0,0,1,67.986641,-20.999995)">
+ <circle r="0.5" cy="297" cx="28" id="path21911" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path d="m 27.482312,284.51072 a 12.5,12.5 0 0 1 9.347671,3.6416 12.5,12.5 0 0 1 3.660304,9.34036" sodipodi:open="true" sodipodi:end="0.039424941" sodipodi:start="4.6709621" sodipodi:ry="12.5" sodipodi:rx="12.5" sodipodi:cy="297" sodipodi:cx="28" sodipodi:type="arc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle21913"/>
+ <path sodipodi:open="true" d="m 27.459373,288.51721 a 8.5,8.5 0 0 1 6.523812,2.44528 8.5,8.5 0 0 1 2.504144,6.50145" sodipodi:end="0.054608034" sodipodi:start="4.6487428" sodipodi:ry="8.5" sodipodi:rx="8.5" sodipodi:cy="297" sodipodi:cx="28" sodipodi:type="arc" id="circle21925" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path sodipodi:open="true" d="m 27.518236,292.52586 a 4.5,4.5 0 0 1 3.654212,1.28266 4.5,4.5 0 0 1 1.304491,3.64647" sodipodi:end="0.10128188" sodipodi:start="4.6051247" sodipodi:ry="4.5" sodipodi:rx="4.5" sodipodi:cy="297" sodipodi:cx="28" sodipodi:type="arc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle21927"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22083" transform="translate(-1.8536743e-6,-42.000055)">
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="ccccccccc" id="path22040" d="m 205.49288,297.50712 h -3 v -13 l 3.00712,-0.007 V 288.5 h 3 v 5 h -3 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 202.5,288.5 h 3 v 5 h -3" id="path22076" sodipodi:nodetypes="cccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:open="true" d="m 200.42543,297.3064 a 6.5000005,6.5000005 0 0 1 -4.92525,-6.35343 6.5000005,6.5000005 0 0 1 5.01668,-6.2815" sodipodi:end="4.4821826" sodipodi:start="1.8154743" sodipodi:ry="6.5000005" sodipodi:rx="6.5000005" sodipodi:cy="291" sodipodi:cx="202.00002" sodipodi:type="arc" id="path22034" style="opacity:0.7;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g21627" transform="translate(2.8146326e-5,-41.999965)">
+ <path sodipodi:nodetypes="ccccccc" inkscape:connector-curvature="0" id="path21618" d="m 565.5,326.5 h -7 v 2 h -4 v 4 h -2 v 7" style="display:inline;opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" transform="translate(-63,-21)"/>
+ <path d="m 492.5,318.5 a 10,10 0 0 1 10,-10" sodipodi:end="4.712389" sodipodi:start="3.1415927" sodipodi:ry="10" sodipodi:rx="10" sodipodi:cy="318.5" sodipodi:cx="502.5" sodipodi:type="arc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="circle21622" sodipodi:open="true"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g21555" transform="translate(-1.8536743e-6,-20.999995)">
+ <path inkscape:connector-curvature="0" id="path16949-6-5" d="m 160.50423,286.5 a 0.99577318,0.99766507 0 0 1 -0.99577,-0.99766 0.99577318,0.99766507 0 0 1 0.99577,-0.99767 0.99577318,0.99766507 0 0 1 0.99577,0.99767 0.99577318,0.99766507 0 0 1 -0.99577,0.99766 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="csssc" id="path21630" d="m 160.5161,286.50865 c 0,0.45734 -0.0161,0.62445 -0.0161,0.98572 0,2.98304 4,2.98304 4,6.46326 0,4.72315 -8,4.72315 -8,0 V 291.5 l 2,2" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"/>
+ </g>
+ <g style="display:inline;enable-background:new" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" transform="translate(-168,21.000005)" id="g21689">
+ <path sodipodi:nodetypes="cccccc" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 216.46251,162.50711 v 9 h 9 v -9 h -7.98926 z" id="path21684" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 218.5,160.5 1.99288,-1.99288 h 9 v 9 l -2,2" id="path21687" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g21744">
+ <path sodipodi:nodetypes="ccccccc" id="path21737" d="m 8.5,181.5 1.99288,-1.99288 h 9 v 9 l -3,3 h -9 L 7.5,188.5" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="ccccc" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 6.46255,183.50712 v 3 h 3 v -3 z" id="path21742" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g21819">
+ <path sodipodi:nodetypes="ccccc" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 36.5,183.5 h -9 v 2 h 9 z" id="path21815" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 29.5,181.5 1.99288,-1.99288 h 9 v 9 l -3,3 h -9 L 28.5,187.5" id="path21817" sodipodi:nodetypes="ccccccc"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g22126">
+ <path sodipodi:nodetypes="cccccc" id="path22118" d="m 176.5,160.5 1.99288,-1.99288 h 9 v 9 l -3,3 L 179.5,170.5" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="ccccc" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 174.46251,162.50711 v 3 h 3 v -3 z" id="path22120" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path22124" d="m 174.46251,168.50711 v 3 h 3 v -3 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22142" transform="translate(168,-20.999995)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 56.49288,192.50712 h -8 v -8" id="path22138" sodipodi:nodetypes="ccc"/>
+ <path sodipodi:nodetypes="ccccccc" id="path22140" d="m 58.5,192.48485 -1e-5,0.0303 1e-5,-10.03033 2.99999,-2.96967 1e-5,-0.0303 v 10 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 61.48485,179.5 0.0303,-1e-5 -10.03033,1e-5 -2.96967,2.99999 -0.0303,1e-5 h 10 z" id="path22186" sodipodi:nodetypes="ccccccc"/>
+ </g>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="ccccccc" id="path22168" d="m 237.49288,162.50712 4,-4 h 9 v 9 l -4,4 h -9 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g21749">
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 197.49288,160.50712 2,-2 h 9 v 9 L 206.5,169.5 m -6.00712,1.00712 h -1" id="path21666" sodipodi:nodetypes="ccccccc"/>
+ <path sodipodi:nodetypes="ccccc" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 195.46251,162.50711 v 9 h 2 v -9 z" id="path21689" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path21745" d="m 202.46251,162.50711 v 9 h 2 v -9 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22356" transform="translate(-336,-62.999995)">
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="ccccc" id="path22230" d="m 369.49288,318.50712 h -6 v -6 L 369.5,312.5 Z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 376.5,309.5 v 6 l -3,3 v -6 z" id="path22233" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="ccccc" id="path22236" d="m 363.5,308.5 3,-3 h 6 l -3,3 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 363.5,308.5 3,-3 h 6 l -3,3 z" id="path22324" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22601" transform="translate(-42.000002,-41.999995)">
+ <circle cx="228.5" cy="289.5" id="circle22502" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" r="1"/>
+ <circle r="0.50000006" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle22504" cy="286" cx="227"/>
+ <circle cx="224" cy="285" id="circle22506" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" r="0.50000006"/>
+ <circle r="0.50000006" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle22508" cy="285" cx="221"/>
+ <path sodipodi:nodetypes="ccccscc" inkscape:connector-curvature="0" d="m 223.52606,287.68092 c 1.56874,0.42034 2.18117,1.90626 1.92836,3.34002 -0.25281,1.43376 -1.49854,2.47906 -2.95442,2.47906 -1.49071,0 -2,0.75989 -2,2 0,0.8408 -0.52587,1.59182 -1.31596,1.87939 -0.79009,0.28757 -1.55068,0.0972 -2.09113,-0.54693 -1.76774,-1.76775 0.48261,-10.74598 6.43315,-9.15154 z" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path22510"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g22409">
+ <path sodipodi:nodetypes="ccccc" style="display:inline;opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 350.5,251.5 -0.008,4.00252 h -8 v -8 l 5.258,-0.003" id="path22405" inkscape:connector-curvature="0"/>
+ <path d="m 350.5,248.5 5,-3 m -5,3 v -6 m 0,6 5,3" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path22407" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ <rect style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="rect22440-3" width="2" height="2" x="349.49496" y="247.50505" rx="1" ry="1"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22292" transform="translate(-88.000002,-170)">
+ <g transform="translate(20,10)" id="g22287">
+ <path sodipodi:nodetypes="cc" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 191,676 v 6" id="path22273" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cc" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 192,678 v 2" id="path22276" inkscape:connector-curvature="0"/>
+ <rect y="678" x="183" height="2" width="6" id="rect22279" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path inkscape:connector-curvature="0" id="path22281" d="m 181,676 v 6" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" id="path22285" d="m 180,678 v 2" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="cc"/>
+ </g>
+ <path inkscape:connector-curvature="0" id="path22290" d="m 203,691 v 5 c 0,0.5 0.25,1 1,1 0.75,0 1,-0.5 1,-1 v -1 c 0,-0.5 0.53412,-1 1,-1 0.55229,0 1,0.44772 1,1 v 2.5 c 0,0.82843 0.67157,1.5 1.5,1.5 0.82843,0 1.5,-0.67157 1.5,-1.5 V 697 c 0,-0.55228 0.44772,-1 1,-1 0.55229,0 1,-0.44771 1,-1 v -1 h -3 v -3 z" style="display:inline;opacity:0.6;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" sodipodi:nodetypes="csssssssssssscccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22354" transform="translate(-26.000002,-443)">
+ <g id="g22339" transform="translate(0,10)">
+ <path inkscape:connector-curvature="0" id="path22321" d="m 191,676 v 6" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" id="path22327" d="m 192,678 v 2" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="cc"/>
+ <rect style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect22329" width="6" height="2" x="183" y="678"/>
+ <path sodipodi:nodetypes="cc" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 181,676 v 6" id="path22333" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cc" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 180,678 v 2" id="path22336" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-267.99969,306.00818)" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;enable-background:new" id="g22352">
+ <path id="path22344" d="m 460.50726,389.48364 c -1.00252,0 -2.00505,1e-5 -3.00757,1e-5 0,1.00272 0,2.00544 0,3.00817 1.00252,0 2.00505,-1e-5 3.00757,-1e-5 0,-1.00273 0,-2.00545 0,-3.00817 z" style="vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1" inkscape:connector-curvature="0"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1" d="m 455.5,387.5 c -1.00252,0 -2.00505,10e-6 -3.00757,10e-6 0,1.00272 0,2.00544 0,3.00817 1.00252,0 2.00505,-10e-6 3.00757,-10e-6 0,-1.00273 0,-2.00545 0,-3.00817 z" id="path22346" inkscape:connector-curvature="0"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;enable-background:new" d="m 450.5,389.5 c -1,0 -2,10e-6 -3,10e-6 0,1 0,2 0,2.99999 1,-10e-6 2,-10e-6 3,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z" id="path22350" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g transform="translate(696,857.9975)" id="g22801-1" style="display:inline;opacity:0.6;enable-background:new">
+ <path inkscape:connector-curvature="0" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m -239.5,-446.99219 c -2.47912,0 -4.5,2.01847 -4.5,4.4961 0,2.47763 2.02088,4.49609 4.5,4.49609 2.47912,0 4.5,-2.01846 4.5,-4.49609 0,-2.47763 -2.02088,-4.4961 -4.5,-4.4961 z m 0,1.1875 c 1.83471,0 3.31055,1.47622 3.31055,3.3086 0,1.83238 -1.47584,3.30859 -3.31055,3.30859 -1.8347,0 -3.31055,-1.47621 -3.31055,-3.30859 0,-1.83238 1.47585,-3.3086 3.31055,-3.3086 z" id="path22797-9"/>
+ </g>
+ <path d="m 112.75,162.25 -1.25,1.25 2,2 1.25,-1.25 z m 6,6 -1.25,1.25 2,2 1.25,-1.25 z m 3.5,0.5 L 123,168 c 2,-2 2.00552,-5.80325 -0.0968,-7.9055 C 120.80096,157.99219 116.93773,157.93962 115,160 l -0.75,0.75 2,2 0.5,-0.5 c 0.71252,-0.71252 1.85576,-1.08423 2.82908,-0.82343 0.97333,0.2608 1.73359,1.02105 1.99439,1.99438 0.2608,0.97332 -0.11095,2.11653 -0.82347,2.82905 l -0.5,0.5 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path21201-1" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccscccccscc"/>
+ <g style="display:inline;opacity:0.6;enable-background:new" id="g21233-8" transform="translate(401.875,353.125)">
+ <path d="m -299.875,-185.125 c 2,-2 2.00552,-5.80325 -0.0968,-7.9055 -2.10224,-2.10231 -5.9032,-2.0945 -7.9032,-0.0945 l -3.5,3.5 2,2 3.25,-3.25 c 0.71252,-0.71252 1.85576,-1.08423 2.82908,-0.82343 0.97333,0.2608 1.73359,1.02105 1.99439,1.99438 0.2608,0.97332 -0.11095,2.11653 -0.82347,2.82905 l -3.25,3.25 2,2 3.5,-3.5" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path21227-9" inkscape:connector-curvature="0" sodipodi:nodetypes="ccscccccsccc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m -309.375,-191.625 2,2" id="path21229-0" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" id="path21231-6" d="m -303.375,-185.625 2,2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:nodetypes="cc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22386" transform="translate(-886.00002,80.000125)">
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="ccc" id="path22377" d="m 1319,196.5 -6.5071,0.007 0.01,-6.507" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ <path d="m 1312.5,189.99998 a 6.5,6.5 0 0 1 6.5,-6.5 6.5,6.5 0 0 1 6.5,6.5 6.5,6.5 0 0 1 -6.5,6.5" sodipodi:open="true" sodipodi:end="1.5707963" sodipodi:start="3.1415927" sodipodi:ry="6.5" sodipodi:rx="6.5" sodipodi:cy="189.99998" sodipodi:cx="1319" sodipodi:type="arc" id="circle22379" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 1314.5,189.5 h 5 v 5" id="path22381" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22599" transform="translate(-1.8536743e-6,-21.999995)">
+ <path sodipodi:nodetypes="ccccccc" d="m 132.49995,285.5 h 13 v 10.00001 3 h -13 V 288.5 Z" style="display:inline;opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path22722" inkscape:connector-curvature="0"/>
+ <ellipse ry="4.4503469" rx="4.4500017" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" id="ellipse22724" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" cx="139" cy="292.00006"/>
+ </g>
+ <g style="display:inline;opacity:0.98999999;enable-background:new" transform="translate(-356.99997,168.00001)" id="g23559">
+ <path sodipodi:nodetypes="cccccc" inkscape:connector-curvature="0" id="path23553" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 491.5,211.5 4,-4 m 0,0 h 7 m -7,0 v -7"/>
+ <path d="m 499.5,203.5 -2.00003,1.99999 m -4.75,2 -3.24997,1e-5 m 5.99997,2.74999 3e-5,3.25001" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="path23557" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ </g>
+ <path id="path23575" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 164.5105,368.5 h -1.5 c -1.051,0 -1.99594,0.39189 -2.5,1 m -7,12 c 2.31265,0 2.9895,-0.87627 2.9895,-2 0,-1.5 -0.9895,-2 -0.9895,-4 0.0577,-2.74939 2.7395,-4.38358 6,-4 4.25,0.5 6.25,4.25 4.25,6.25 -2,2 -5.75,0.25 -6.25,-4" inkscape:connector-curvature="0" sodipodi:nodetypes="csccsccsc"/>
+ <g transform="matrix(-1,0,0,1,382.99922,-15.999998)" style="display:inline;enable-background:new" id="g24066">
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 182.39348,370.52255 c -1.21671,-1.35237 -2.43342,-1.35237 -3.89348,0.90159 -1.46006,-2.25396 -2.67677,-2.25396 -3.89348,-0.90159" id="path23960" sodipodi:nodetypes="ccc"/>
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="cccc" id="path23964" d="m 187.3944,365.47372 c -0.96328,-1.41958 -2.85608,-3.82032 -5.18497,0.9464 h -0.41508 c -2.28299,-4.73193 -4.24277,-2.34044 -5.18873,-0.9464" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"/>
+ <circle r="2.0000014" style="display:inline;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="circle24296" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" cx="-185.5024" cy="374.5" transform="scale(-1,1)"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g24237" transform="translate(-1.8536743e-6,21.000005)">
+ <circle cy="337.5" cx="176.49683" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" id="circle24230" style="display:inline;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" r="2.0000014"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" d="m 181.54329,326.6001 h 0.97611 c 2.70078,0 4.88059,1.47271 4.88059,4.41811 0,2.98287 -2.64194,5.74407 -6.83282,6.38171" style="opacity:1;fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path24226"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g24286" transform="matrix(-1,0,0,1,319.99683,63.000005)">
+ <path sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 153,284 v 2 h 2 v -2 z m 2,2 v 2 h 2 v -2 z m 2,0 h 2 v -2 h -2 z m 2,0 v 2 h 2 v -2 z m 2,0 h 2 v -2 h -2 z m -6,8 v -2 h -2 v 2 z m 0,-2 h 2 v -2 h -2 z m 0,-2 v -2 h -2 v 2 z m 2,0 h 2 v -2 h -2 z m 2,0 v 2 h 2 v -2 z m 2,0 h 2 v -2 h -2 z m -2,2 h -2 v 2 h 2 z" id="path24240" inkscape:connector-curvature="0" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <circle r="2.4984138" style="display:inline;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="circle24230-9" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" cx="163.99841" cy="295.00159"/>
+ </g>
+ <g id="g24294" style="display:inline;enable-background:new" transform="translate(83.999995,110)">
+ <path sodipodi:nodetypes="ccc" id="path24288" d="m 182.5,371.52369 c -1.25,-1.5 -2.5,-1.5 -4,1 -1.5,-2.5 -2.75,-2.5 -4,-1" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" inkscape:connector-curvature="0"/>
+ <path style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 187.49604,365.49999 c -0.98144,-1.5 -2.9099,-4.03675 -5.28267,1.00001 h -0.42291 c -2.326,-5 -4.32271,-2.47303 -5.2865,-1.00001" id="path24290" sodipodi:nodetypes="cccc" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 187.5,375.50001 c -1.25,-2 -1.5,-0.5 -3,1.02369 -1.5,-1.52369 -1.75,-3.02369 -3,-1.02369" id="path24292" sodipodi:nodetypes="ccc"/>
+ </g>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" transform="rotate(90,171,281.00001)" id="g24322" style="display:inline;enable-background:new">
+ <g style="stroke:#ffffff" transform="rotate(-90,244.00797,459)" id="g24320">
+ <path style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 267.50797,465.49203 3,-3 -3,-3.25 v -0.5 l 3,-3.25 -3,-3" id="path24314" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ <path sodipodi:nodetypes="cccccc" inkscape:connector-curvature="0" id="path24324" d="m 263.50797,465.49203 3,-3 -3,-3.25 v -0.5 l 3,-3.25 -3,-3" style="opacity:0.85;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
+ <path style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 259.50797,465.49203 3,-3 -3,-3.25 v -0.5 l 3,-3.25 -3,-3" id="path24326" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g24475" transform="matrix(-1,0,0,1,551.00038,4.4999696e-6)">
+ <g style="display:inline;opacity:1;enable-background:new" transform="translate(188,63)" id="g24356">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path24346" sodipodi:type="arc" sodipodi:cx="101.5" sodipodi:cy="291.5" sodipodi:rx="3" sodipodi:ry="3" sodipodi:start="4.7002162" sodipodi:end="0" sodipodi:open="true" d="m 101.46348,288.50022 a 3,3 0 0 1 2.14489,0.86559 A 3,3 0 0 1 104.5,291.5"/>
+ <path id="path24348" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:type="arc" sodipodi:cx="98" sodipodi:cy="288" sodipodi:rx="3.5" sodipodi:ry="3.5" sodipodi:start="3.1415927" sodipodi:end="0.13901587" sodipodi:open="true" d="m 94.5,288 a 3.5,3.5 0 0 1 1.892285,-3.1089 3.5,3.5 0 0 1 3.630715,0.25277 3.5,3.5 0 0 1 1.44323,3.34112"/>
+ <path sodipodi:open="true" d="m 98.431757,292.92135 a 3.5293405,3.4668493 0 0 1 -3.399802,2.5455 3.5293405,3.4668493 0 0 1 -3.403646,-2.54054 3.5293405,3.4668493 0 0 1 1.585821,-3.89948 3.5293405,3.4668493 0 0 1 4.248813,0.4623" sodipodi:end="5.4732374" sodipodi:start="0.26899297" sodipodi:ry="3.4668493" sodipodi:rx="3.5293405" sodipodi:cy="292" sodipodi:cx="95.029335" sodipodi:type="arc" id="path24354" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path sodipodi:open="true" d="m 98.501562,292.67687 a 1.5169935,1.4911515 0 0 1 1.397989,-1.17541 1.5169935,1.4911515 0 0 1 1.523169,1.01403" sodipodi:end="5.9591524" sodipodi:start="3.3533427" sodipodi:ry="1.4911515" sodipodi:rx="1.5169935" sodipodi:cy="292.99026" sodipodi:cx="99.984673" sodipodi:type="arc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path24450"/>
+ <path inkscape:connector-curvature="0" id="path24452" d="m 104.5,291.5 v 1" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <circle cy="359" cx="290.99683" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" id="circle24448" style="display:inline;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" r="1.5000155"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g24513" transform="matrix(0,1,1,0,-152.00318,47.006352)">
+ <g id="g24612">
+ <path id="circle24338" transform="matrix(0,1,1,0,-47.006347,152.00318)" d="m 142.49609,347.00195 c -1.17351,0 -2.15665,0.82286 -2.42187,1.91797 1.14862,0.70733 2.04128,1.7894 2.50586,3.07422 1.33547,-0.0457 2.41601,-1.14613 2.41601,-2.49219 0,-1.37479 -1.12521,-2.5 -2.5,-2.5 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" inkscape:connector-curvature="0"/>
+ <path id="circle24481" transform="matrix(0,1,1,0,-47.006347,152.00318)" d="m 136.9668,349.03125 c -2.73852,0 -4.97071,2.23218 -4.97071,4.9707 0,2.73853 2.23219,4.96875 4.97071,4.96875 0.74568,0 1.44822,-0.1767 2.08398,-0.47265 -0.0209,-0.16376 -0.0508,-0.32518 -0.0508,-0.49414 0,-0.2598 0.0297,-0.51312 0.0781,-0.75977 -0.60661,0.39452 -1.33048,0.62695 -2.11132,0.62695 -2.14404,0 -3.8711,-1.72509 -3.8711,-3.86914 0,-2.14404 1.72706,-3.87109 3.8711,-3.87109 2.14405,0 3.86914,1.72705 3.86914,3.87109 0,0.23797 -0.0296,0.46946 -0.0703,0.69532 0.35109,-0.23908 0.74721,-0.40722 1.16407,-0.52539 0.002,-0.0568 0.008,-0.11267 0.008,-0.16993 0,-2.73852 -2.23217,-4.9707 -4.9707,-4.9707 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" inkscape:connector-curvature="0"/>
+ <circle r="2.5015869" style="display:inline;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" id="circle24477" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" cx="310.99841" cy="295.00159"/>
+ </g>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g22255" transform="translate(-1.8536743e-6,-20.999994)">
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40018749;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 512.5,297.5 h 3 v -1 c 0,-2.5 3,-6 6,-6 h 1 v -3 h -1 c -5,0 -9,4.5 -9,9 z" id="path21998" sodipodi:nodetypes="ccssccssc" inkscape:connector-curvature="0"/>
+ <path style="display:inline;opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 512.5,290.25 8e-5,-5.74997 h 3 v 2" id="path22786" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ </g>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" id="rect40784" width="16" height="16" x="110" y="262"/>
+ <g style="display:inline;opacity:1;enable-background:new" id="g22709" transform="matrix(0,-1,-1,0,408.99494,408.99999)">
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 160.74999,297.49494 -7.25711,0.0122 0.007,-7.26218" id="path21430-0" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 157.24999,284.49494 -3,3 9.25001,0.005 -1e-5,9.245 3,-3 1e-5,-9.24509 z" id="path21432-2" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path22983" d="m 163.5,287.5 3,-3" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g22406" transform="translate(20.999998,-20.999994)">
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="ccccc" id="path22383" d="m 240.49288,297.50712 h -3 v -9 l 3.00712,-0.007 z" style="display:inline;opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 250.49288,293.50712 h -3 v -9 l 3.00712,-0.007 z" id="path22385" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="ccccc" id="path22387" d="m 245.49288,295.50712 h -3 v -9 l 3.00712,-0.007 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g26277" transform="translate(273,-20.999994)">
+ <path inkscape:connector-curvature="0" d="m 195.5,292.5 8,-8 5,1.2e-4 v 13 l -13.00712,0.007 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path23052" sodipodi:nodetypes="cccccc"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="ccc" id="path23056" d="m 195.49288,289.50712 v -5 l 5.00712,-0.007" style="display:inline;opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g22579" transform="matrix(-1,0,0,1,571.99995,-62.999994)">
+ <g style="opacity:1" id="g22529">
+ <path sodipodi:nodetypes="cccccccc" inkscape:connector-curvature="0" d="m 310.5,312.5 h -3.75 l -0.25,-0.25 v -3.75 m -6,0 v 7 m 3,3 h 7" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path22488"/>
+ <path sodipodi:open="true" id="path22490" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:type="arc" sodipodi:cx="303.5" sodipodi:cy="308.5" sodipodi:rx="3" sodipodi:ry="3" sodipodi:start="3.1415927" sodipodi:end="0" d="m 300.5,308.5 a 3,3 0 0 1 3,-3 3,3 0 0 1 3,3"/>
+ <path sodipodi:open="true" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle22521" sodipodi:type="arc" sodipodi:cx="303.5" sodipodi:cy="315.5" sodipodi:rx="3" sodipodi:ry="3" sodipodi:start="1.5707963" sodipodi:end="3.1415927" d="M 303.5,318.5 A 3,3 0 0 1 301.37868,317.62132 3,3 0 0 1 300.5,315.5"/>
+ <path sodipodi:open="true" id="circle22523" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:type="arc" sodipodi:cx="310.5" sodipodi:cy="315.5" sodipodi:rx="3" sodipodi:ry="3" sodipodi:start="4.712389" sodipodi:end="1.5707963" d="m 310.5,312.5 a 3,3 0 0 1 3,3 3,3 0 0 1 -3,3"/>
+ </g>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path22537" d="m 303.5,308.5 v 7 m 0,0 h 7" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" transform="matrix(-1,0,0,1,550.99293,-20.999994)" id="g22139">
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 310.49288,297.50712 h -10 v -10 l 10.00712,-0.007 z" id="path22135" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:nodetypes="cc" id="path22137" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 310.5,284.5 h -10" inkscape:connector-curvature="0"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="cc" id="path22141" d="m 313.5,287.50012 -0.007,10.007" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g22221" transform="translate(20.999998,-20.999994)">
+ <g id="g22210">
+ <rect style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect22184" width="5" height="3" x="27.5" y="294.5"/>
+ <rect y="294.5" x="32.5" height="3" width="5" id="rect22186" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <rect style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect22188" width="3" height="3" x="37.5" y="294.5"/>
+ <rect y="291.5" x="-40.5" height="3" width="5" id="rect22192" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" transform="scale(-1,1)"/>
+ <rect style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect22194" width="5" height="3" x="-35.5" y="291.5" transform="scale(-1,1)"/>
+ <rect y="291.5" x="-30.5" height="3" width="3" id="rect22196" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" transform="scale(-1,1)"/>
+ <rect transform="scale(-1,1)" y="288.5" x="-32.5" height="3" width="5" id="rect22198" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <rect transform="scale(-1,1)" y="284.5" x="-40.5" height="3" width="5" id="rect22200" style="opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g16957-2" transform="matrix(0,-1,-1,0,556.00846,744.00467)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 467.5,358.49999 a 1.9999902,1.9999902 0 0 0 1.99999,1.99999 1.9999902,1.9999902 0 0 0 1.99999,-1.99999 A 1.9999902,1.9999902 0 0 0 469.49999,356.5 1.9999902,1.9999902 0 0 0 467.5,358.49999 Z" id="path16943-7" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path16945-5" d="m 467.49997,348.50001 a 1.0000051,1.0000051 0 0 0 1.00001,1 1.0000051,1.0000051 0 0 0 1,-1 1.0000051,1.0000051 0 0 0 -1,-1.00001 1.0000051,1.0000051 0 0 0 -1.00001,1.00001 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 478.49998,359.5 a 1.0000001,1.0000001 0 0 0 1,1 1.0000001,1.0000001 0 0 0 1,-1 1.0000001,1.0000001 0 0 0 -1,-1 1.0000001,1.0000001 0 0 0 -1,1 z" id="path16947-3" inkscape:connector-curvature="0"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 477.49998,348.99999 a 1.5000101,1.5000098 0 0 0 1.50001,1.50001 1.5000101,1.5000098 0 0 0 1.50001,-1.50001 1.5000101,1.5000098 0 0 0 -1.50001,-1.5 1.5000101,1.5000098 0 0 0 -1.50001,1.5 z" id="path16949-6" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path16951-1" d="m 468.49998,349.5 2e-5,5" style="opacity:0.7;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" id="path16953-0" d="m 478.5,359.5 h -5" style="opacity:0.7;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" id="path16955-3" d="m 472.5,355.5 4.99998,-5" style="opacity:0.7;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:nodetypes="cc"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g21692" transform="translate(-1.8536743e-6,-41.999984)">
+ <g transform="translate(-63)" style="display:inline;opacity:1;stroke:#f9f9f9;enable-background:new" id="g21667">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#f9f9f9;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.5999999;stroke-opacity:1;marker:none;paint-order:normal" d="m 208.5,284.5 c 0,1.5 -1,2.76727 -2.91693,3.87401 -1.82216,1.05203 -4.5035,1.26353 -6.58307,1.12595 -2.07958,-0.13754 -3.5,-1 -3.5,-2" id="path21655" inkscape:connector-curvature="0" sodipodi:nodetypes="cssc"/>
+ <path sodipodi:nodetypes="csc" inkscape:connector-curvature="0" id="path21657" d="m 204.5,286.24999 c -1.5,-0.75 -3.71224,-0.85695 -5.5,-0.73868 -2.07958,0.13758 -3.5,1 -3.5,2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#f9f9f9;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.5999999;stroke-opacity:1;marker:none;paint-order:normal"/>
+ </g>
+ <g id="g21673" style="display:inline;opacity:1;stroke:#f9f9f9;enable-background:new" transform="translate(-63,6)">
+ <path sodipodi:nodetypes="cssc" inkscape:connector-curvature="0" id="path21669" d="m 208.5,285 c 0,2 -1,3.26727 -2.91693,4.37401 -1.82216,1.05203 -4.5035,1.26353 -6.58307,1.12595 -2.07958,-0.13754 -3.5,-1 -3.5,-2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#f9f9f9;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.5999999;stroke-opacity:1;marker:none;paint-order:normal"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#f9f9f9;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.5999999;stroke-opacity:1;marker:none;paint-order:normal" d="m 204.5,287.24999 c -1.5,-0.75 -3.71224,-0.85695 -5.5,-0.73868 -2.07958,0.13758 -3.5,1 -3.5,2" id="path21671" inkscape:connector-curvature="0" sodipodi:nodetypes="csc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#f9f9f9;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.5999999;stroke-opacity:1;marker:none;paint-order:normal" d="m 208.5,285 c 0,-0.5 -0.12211,-0.89751 -0.25,-1.25" id="path21678" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path21682" d="m 208.5,291.53241 c 0,-0.3814 -0.25,-0.78241 -0.25,-0.78241" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#f9f9f9;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.5999999;stroke-opacity:1;marker:none;paint-order:normal"/>
+ </g>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g21909" transform="translate(189,-40.999994)">
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path21858" d="m 27.5,286.5 c 1,0 2.25,-0.5 3,-2 0.75,1.5 2,2 3,2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 33.5,286.5 c 1,0 2.25,-0.5 3,-2 0.75,1.5 2,2 3,2" id="path21865" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path21877" d="m 28.5,291.5 c 1,0 2.25,-0.5 3,-2 0.75,1.5 2,2 3,2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 27.5,296.5 c 1,0 2.25,-0.5 3,-2 0.75,1.5 2,2 3,2" id="path21883" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path21889" d="m 33.5,296.5 c 1,0 2.25,-0.5 3,-2 0.75,1.5 2,2 3,2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 34.5,291.5 c 1,0 2.25,-0.5 3,-2 0.75,1.5 2,2 3,2" id="path23998" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g21639" transform="translate(-1.8536743e-6,-41.999994)">
+ <path d="m 101.16657,289.57499 a 3,3 0 0 1 2.30912,2.5439 3,3 0 0 1 -1.59349,3.04373 3,3 0 0 1 -3.406252,-0.4483" sodipodi:open="true" sodipodi:end="2.3113327" sodipodi:start="4.9364479" sodipodi:ry="3" sodipodi:rx="3" sodipodi:cy="292.5" sodipodi:cx="100.5" sodipodi:type="arc" id="path21574" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path d="m 94.5,288 a 3.5,3.5 0 0 1 2.206174,-3.25208 3.5,3.5 0 0 1 3.837266,0.84772 3.5,3.5 0 0 1 0.63082,3.87883" sodipodi:open="true" sodipodi:end="0.43485185" sodipodi:start="3.1415927" sodipodi:ry="3.5" sodipodi:rx="3.5" sodipodi:cy="288" sodipodi:cx="98" sodipodi:type="arc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle21576"/>
+ <path d="m 98.304956,294.63385 a 3.5,3.5 0 0 1 -2.79783,0.83127" sodipodi:open="true" sodipodi:end="1.712087" sodipodi:start="0.85189429" sodipodi:ry="3.5" sodipodi:rx="3.5" sodipodi:cy="292" sodipodi:cx="96" sodipodi:type="arc" id="circle21578" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path d="m 95.421458,295.62173 a 2.5,2.5 0 0 1 -2.692948,1.86348 2.5,2.5 0 0 1 -2.22709,-2.40096 2.5,2.5 0 0 1 2.060297,-2.54553" sodipodi:end="4.5361652" sodipodi:start="0.25132778" sodipodi:ry="2.5" sodipodi:rx="2.5" sodipodi:cy="295" sodipodi:cx="93" sodipodi:type="arc" id="circle21582" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:open="true"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path21632" sodipodi:type="arc" sodipodi:cx="95" sodipodi:cy="292" sodipodi:rx="3.5" sodipodi:ry="3.5" sodipodi:start="2.8797933" sodipodi:end="5.4732374" sodipodi:open="true" d="m 91.61926,292.90587 a 3.5,3.5 0 0 1 1.593667,-3.91525 3.5,3.5 0 0 1 4.20045,0.4745"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g23463">
+ <path sodipodi:nodetypes="ccsscccc" inkscape:connector-curvature="0" id="ellipse22388" d="m 15.5,242.5 -2.7e-4,0.50006 c 0,0.89314 -0.476446,1.71844 -1.249865,2.16501 -0.773419,0.44657 -1.726311,0.44657 -2.49973,0 -0.773419,-0.44657 -1.249865,-1.27187 -1.249865,-2.16501 L 10.5,242.5 v 0 0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <path inkscape:connector-curvature="0" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 15.5,242.5 h 4 v 5 h -2 l -2.9e-4,8 -8.99971,-5e-5 V 247.5 h -2 v -5 h 4" id="path22384" sodipodi:nodetypes="cccccccccc"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g22840" transform="translate(-1.8536743e-6,-19.999994)">
+ <ellipse transform="scale(-1,1)" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="circle22836" cx="-412.00006" cy="289.04727" rx="2.499939" ry="2.5472674"/>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="M 418.96166,296.5 H 417.5 l 6e-5,-7.58095 c 0,-2.88768 -2.25006,-5.41905 -5.50042,-5.41905 -3.24964,0 -5.49956,2.53137 -5.49956,5.41905 L 406.5,296.5 h -1.46166" id="path22838" inkscape:connector-curvature="0" sodipodi:nodetypes="cccsccc"/>
+ </g>
+ <path style="display:inline;opacity:0.95;fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 56.789319,354.70086 c 0.899798,-0.32686 0.898582,-1.54713 0.436284,-2.2271 -0.826939,-1.21629 -2.571205,-1.14764 -3.605098,-0.26168 -1.517271,1.3002 -1.376344,3.67692 -0.08037,5.0764 1.727329,1.86531 4.694054,1.64468 6.417997,-0.0988 2.169401,-2.19405 1.873041,-5.8353 -0.275551,-7.9257 -2.602231,-2.53174 -6.871298,-2.18984 -9.230889,0.45937 -2.74006,3.07637 -2.352322,7.79547 0.06534,10.7295" id="path23662-2" sodipodi:nodetypes="cssssssc" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 80.507718,360.44617 c 2.24134,-1.2443 1.9923,-3.4564 1.9923,-3.87314 0,-0.23874 -0.0531,-0.53153 -0.16199,-0.85599 m -2.43533,-3.08977 c -0.65937,-0.46169 -1.45125,-0.85307 -2.38343,-1.10624 m -3.984603,-0.24791 c -3.211393,0.35397 -3.984602,1.91881 -3.984602,2.72707" id="path42609-7" sodipodi:nodetypes="csccccs"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate" d="M 75.499998,360.54784 V 358.5 m 0,-4 v -6.95215" id="rect42619-7" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 69.550063,353.96072 c 0,0.9714 0.996151,2.48925 5.478825,2.48925 5.22979,0 7.47113,-3.1713 7.47113,-5.84265 0,-1.4571 -0.49807,-2.18565 -0.99615,-2.91421" id="path42623-9" sodipodi:nodetypes="cssc"/>
+ <path style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 114.49609,354 a 3.4824922,3.4824822 0 0 0 -3.48242,3.48242 3.4824922,3.4824822 0 0 0 3.48242,3.48242 3.4824922,3.4824822 0 0 0 3.48243,-3.48242 A 3.4824922,3.4824822 0 0 0 114.49609,354 Z m -0.50586,0.98633 h 1.01368 v 1.98633 H 117 v 1.01367 h -1.99609 v 1.98633 h -1.01368 v -1.98633 h -1.99609 v -1.01367 h 1.99609 z" id="circle23722" inkscape:connector-curvature="0"/>
+ <path style="display:inline;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 121.47461,347 a 3.4883757,3.4883673 0 0 0 -3.48828,3.48828 3.4883757,3.4883673 0 0 0 3.48828,3.48828 3.4883757,3.4883673 0 0 0 3.48828,-3.48828 A 3.4883757,3.4883673 0 0 0 121.47461,347 Z m -2.48047,3 H 124 v 1.01367 h -5.00586 z" id="circle23728" inkscape:connector-curvature="0"/>
+ <g style="display:inline;enable-background:new" id="g23638">
+ <path inkscape:connector-curvature="0" d="m 229.5,352.5 -1,1 -2,-1 -0.75,1 h -1.25 l -1,1 v 3 l -2,2 1,1" style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="path42208-0" sodipodi:nodetypes="ccccccccc"/>
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccc" id="path42222-9" style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 229.5,347.5 h -2 v 1 h -3 l -1,-1 -2,2 v 1 l -1,1 h -2 l -1,1 1,1 v 3 l -2,2 v 2"/>
+ <path d="m 229.5,357.5 h -1 l -1,1 1,1 -1,1" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="path23824" sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g24220" transform="translate(-1.8536743e-6,63.000006)">
+ <path sodipodi:open="true" d="m 36.767949,287.5 a 2,2 0 0 1 2.416091,-0.87939 2,2 0 0 1 1.285576,2.22669 A 2,2 0 0 1 38.5,290.5" sodipodi:end="1.5707963" sodipodi:start="3.6651914" sodipodi:ry="2" sodipodi:rx="2" sodipodi:cy="288.5" sodipodi:cx="38.5" sodipodi:type="arc" id="path24132" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <g id="g24588" style="opacity:0.8">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path24124" sodipodi:type="arc" sodipodi:cx="33" sodipodi:cy="286" sodipodi:rx="1.5" sodipodi:ry="1.5" sodipodi:start="3.5755623" sodipodi:end="1.5707963" d="m 31.639044,285.36929 a 1.5,1.5 0 0 1 1.788897,-0.80695 1.5,1.5 0 0 1 1.056392,1.65389 A 1.5,1.5 0 0 1 33,287.5" sodipodi:open="true"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="M 33,287.5 H 27.5" id="path24134" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <path inkscape:connector-curvature="0" id="path24136" d="m 38.5,290.5 h -11" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <g id="g24584" style="opacity:0.8">
+ <path d="m 35.5,293.5 a 2,2 0 0 1 1.975743,1.68945 2,2 0 0 1 -1.362177,2.21411 2,2 0 0 1 -2.398766,-1.00186" sodipodi:end="2.673876" sodipodi:start="4.712389" sodipodi:ry="2" sodipodi:rx="2" sodipodi:cy="295.5" sodipodi:cx="35.5" sodipodi:type="arc" id="path24130" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:open="true"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 35.5,293.5 h -8" id="path24138" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22036" transform="translate(-21.000002,4.4999696e-6)">
+ <g transform="matrix(-1,0,0,1,508.99288,-42.00012)" id="g23159">
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 201.49288,297.50712 h -6 v -13.007 H 201.5 Z" id="path23171" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="cccc" id="path21181" d="m 203.49288,284.50712 5.00712,-0.007 -0.007,13.007 h -5" style="display:inline;opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ </g>
+ <path sodipodi:nodetypes="cc" id="path22589-8" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 313.5,242.5 -6,13" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22891" transform="translate(443.99999,-274)">
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png" id="path12452" d="m -133.49999,529.5 v -10 h -10 v 10 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" sodipodi:nodetypes="ccccc"/>
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png" sodipodi:nodetypes="ccccc" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m -133.49999,519.5 3,-3 h -10 l -3,3 z" id="path12454"/>
+ <path mask="none" sodipodi:nodetypes="cccccccccccccc" inkscape:connector-curvature="0" d="m -143.24999,529 2.75,-2.5 m 4.00712,0 h -1 m -2.00712,0 h -1 m 7,0 h -1 m -5.99995,0.002 -5e-5,-1.002 m 0,-2 v -1 m 0,-2 v -1" style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" id="path12456"/>
+ <path id="path12458" d="m -133.49999,519.5 3,-3 v 10 l -3,3 z" style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22594" transform="translate(-1.8536743e-6,21.000005)">
+ <circle transform="scale(-1,1)" cy="338" cx="-239.00357" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" id="circle22541" style="display:inline;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" r="1.5000155"/>
+ <g id="g22585">
+ <path sodipodi:nodetypes="cscccc" id="path24552" d="M 240.49825,328.51 C 241.75,325.75 246,326 248.5,328.5 c 2.5,2.5 2.75,6.75 0,8 m 0.5,-0.5 -8,-8 -0.50175,0.51" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="cccc" id="path24556" style="display:inline;opacity:1;fill:none;stroke:url(#radialGradient22596);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 240.5,328.5 -2,6 m 4,4 6,-2" mask="none"/>
+ <path id="path22561" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;stroke:url(#radialGradient22598);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 247.5,328.5 c -2,0 -3,1 -4,2" mask="none" sodipodi:nodetypes="cc" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="cc" mask="none" d="m 248.50207,329.5 c 0,2 -1,3 -2,4" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;stroke:url(#radialGradient22600);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path22575"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22663" transform="translate(-126,21.000005)">
+ <path sodipodi:nodetypes="cscsc" inkscape:connector-curvature="0" d="m 216.54999,333.49614 c 0.49616,-4.21731 1.61348,-6.94616 3.22563,-6.94616 1.61215,0 2.62575,2.72885 3.22437,6.45001 0.59864,3.72115 1.61222,6.45 3.22438,6.45 1.61215,0 2.72947,-2.48077 3.22563,-5.95385" style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;stroke:#ffffff;stroke-width:1.0999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="use22627"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="rect42619-7-8" d="m 218.75,333.5 h 2 m 4.5,0 h 2" style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"/>
+ </g>
+ <g transform="translate(41.999999,42.000005)" style="display:inline;opacity:1;enable-background:new" id="g22961">
+ <path inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc" id="path22706-5" d="M 493.75,564.5 H 495 c 1.45545,0 2.5,-1.04455 2.5,-2.5 v -1 c 0,-1.45545 -1.04455,-2.5 -2.5,-2.5 h -1.25" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"/>
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate" id="rect22708-9" width="1" height="9" x="492" y="557" rx="0.49151421" ry="0.5"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path22738-3" d="m 489.5,559.5 h 3" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path22740-8" d="m 489.5,563.5 h 3" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ <path sodipodi:nodetypes="cscsc" inkscape:connector-curvature="0" d="m 489.5,570.5 c 1.25,-1.75 3.51522,-3.01888 6,-1 1.51541,1.23127 3.25,1.25 4.68989,0.41839 1.53902,-0.88886 2.44082,-2.61061 2.29435,-4.41902 -0.14647,-1.80841 -1.30991,-3.36099 -2.97366,-3.96827" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path22783-2"/>
+ </g>
+ <g style="display:inline;enable-background:new" transform="rotate(-180,349.00525,417)" id="g22180" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path sodipodi:nodetypes="cszc" inkscape:connector-curvature="0" id="path22116" d="m 333.5105,415.5 c -0.78256,1.97609 -3.37443,3.31012 -6.0105,3 -4.25,-0.49999 -6.25,-4.25 -4.25,-6.25 2,-2 5.75,-0.25 6.25,4" style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 334.50525,410.5 v 3 h -3 v -3 z" id="path22176"/>
+ <path style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="M 326.51841,421.46774 C 327.35564,421.36243 328.0805,421.00609 328.5,420.5" id="path22178" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path id="path22182" d="m 324.50525,420.5 v 3 h -3 v -3 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22365" transform="translate(-1.8536743e-6,-25.999995)">
+ <path id="path22215" d="m 302,649 v 8 h 4 v -8 z m 1,1 h 2 v 1 h -2 z m 0,2 h 2 v 1 h -2 z m 0,2 h 2 v 1 h -2 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="sssssssssccccc" inkscape:connector-curvature="0" id="rect21916" d="m 301.5,647 c -0.82235,0 -1.5,0.67765 -1.5,1.5 v 9 c 0,0.82235 0.67765,1.5 1.5,1.5 h 11 c 0.82235,0 1.5,-0.67765 1.5,-1.5 v -9 c 0,-0.82235 -0.67765,-1.5 -1.5,-1.5 z m -0.5,1 h 12 v 10 h -12 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g22423">
+ <g id="g22461">
+ <path sodipodi:nodetypes="ssscccssssccsss" inkscape:connector-curvature="0" id="path22413" d="m 175.5,599 c -0.82235,0 -1.5,0.67765 -1.5,1.5 v 6 c 0,0.64672 0.42101,1.19773 1,1.40625 V 606.5 v -3 -3 c 0,-0.28564 0.21436,-0.5 0.5,-0.5 h 9 c 0.28564,0 0.5,0.21436 0.5,0.5 v 1.5 h 1 v -1.5 c 0,-0.82235 -0.67765,-1.5 -1.5,-1.5 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path id="rect22415" transform="translate(0,-50)" d="m 177.5,653 c -0.82235,0 -1.5,0.67765 -1.5,1.5 v 6 c 0,0.82235 0.67765,1.5 1.5,1.5 h 9 c 0.82235,0 1.5,-0.67765 1.5,-1.5 v -6 c 0,-0.82235 -0.67765,-1.5 -1.5,-1.5 z m 2.00391,2 c 0.1882,0.002 0.35956,0.10882 0.44336,0.27734 l 2,4 c 0.16517,0.33222 -0.0763,0.72229 -0.44727,0.72266 h -4 c -0.37097,-3.7e-4 -0.61244,-0.39044 -0.44727,-0.72266 l 2,-4 c 0.0851,-0.17104 0.26016,-0.27834 0.45118,-0.27734 z m 3.99609,0 h 3 a 0.50005,0.50005 0 1 1 0,1 h -3 a 0.50005,0.50005 0 1 1 0,-1 z m 0,2 h 3 a 0.50005,0.50005 0 1 1 0,1 h -3 a 0.50005,0.50005 0 1 1 0,-1 z m 0,2 h 2 a 0.50005,0.50005 0 1 1 0,1 h -2 a 0.50005,0.50005 0 1 1 0,-1 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g id="g22627-3-8-8" transform="translate(27.998048,-201.99992)" style="display:inline;opacity:0.7;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 473.50128,640.50019 v 4 h -12 v -4" id="path22613-2-2-5" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <ellipse cy="640" cx="468.00064" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:new" id="ellipse22615-3-9-5" rx="2.4993594" ry="2.4998267"/>
+ <path id="path22617-5-8-4" d="m 461.50128,640.50019 v -4 l 3,-9e-5 2,-2 h 3 l 2,2 2,9e-5 v 4" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path22621-2-5-3" d="M 467.50128,639.50019 467.5,639.5" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none"/>
+ </g>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" transform="translate(19.998048,20.000005)" id="g22712-6-4-7" style="display:inline;enable-background:new">
+ <ellipse cy="417.99997" cx="497.00064" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:new" id="ellipse22693-3-2-2" rx="2.4993594" ry="2.4998267"/>
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 427.50195,414.5 v 1 h 2.75977 c 0.83431,-1.24885 2.23657,-1.99907 3.73828,-2 l 10e-4,-0.99982 h -1.5 l -2,2 z m 6.49933,-0.99982 c 1.50171,9.3e-4 2.90269,0.75097 3.737,1.99982 h 1.76367 v -1 l -2.00067,1.8e-4 -2,-2 h -1.5 z" transform="translate(63)" id="path22695-0-9-6" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccccc"/>
+ <rect style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none" id="rect22705-1-2-8" width="2" height="1" x="491.00128" y="415.00018"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path22708-3-0-5" d="M 496.50128,417.50019 496.5,417.5" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none"/>
+ <path inkscape:connector-curvature="0" id="path22710-8-1-8" d="m 490.50195,417.5 v 5 H 497 c -2.48441,-6.1e-4 -4.49808,-2.01516 -4.49805,-4.5 4.8e-4,-0.16708 0.0103,-0.33401 0.0293,-0.5 z m 7.49805,5 h 4.50195 v -5 h -1.0351 c 0.0203,0.16592 0.0314,0.33285 0.0332,0.5 3e-5,2.4856 -2.01483,4.50046 -4.5,4.5 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" sodipodi:nodetypes="ccccccccccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22364-4" transform="translate(638.99933,975.00018)">
+ <path sodipodi:nodetypes="ccccccccccc" inkscape:connector-curvature="0" id="path13020-7-8" style="display:inline;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m -125.5,-552.49997 h 6 l -2.99997,5e-5 v -2 0 2 m 5.99997,-2.00005 h -12 v -8 l 12.00002,-1e-5 z"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="rect22324-2" d="m -127,-561 h 9 v 5 h -9 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <path sodipodi:nodetypes="ccccccccccc" inkscape:connector-curvature="0" id="path22338-8" style="display:inline;opacity:0.6;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 492.49933,422.50021 h 6 l -2.99997,5e-5 v -2 0 2 m 5.99997,-2.00005 h -12 v -8 l 12.00002,-10e-6 z"/>
+ <path sodipodi:nodetypes="cccccccccccccccscccccccccccccc" inkscape:connector-curvature="0" id="path22769" d="m 517.98438,9.9863345 c -0.55152,0.009 -0.99193,0.4621405 -0.98438,1.0136695 v 7 h -1.10156 l -0.91016,-6.14648 c -0.0643,-0.48249 -0.46671,-0.84859 -0.95312,-0.86719 -0.63083,-0.0229 -1.12488,0.53711 -1.02344,1.16015 L 514,18.816414 v 0.88671 1.296881 h -1 v -1.746091 l -2.58984,-1.16602 c -0.12175,-0.0548 -0.25324,-0.0847 -0.38672,-0.0879 -0.88449,-0.0197 -1.35703,1.03438 -0.75391,1.68164 l 3.5,3.750001 c 1.45044,1.55404 3.38812,2.64316 5.12305,2.55469 2.20226,-0.16055 4.09501,-1.6226 4.80664,-3.71289 l 2.25586,-6.269531 c 0.1808,-0.48082 -0.16432,-0.99701 -0.67774,-1.01368 -0.32862,-0.0101 -0.62553,0.19494 -0.73242,0.50586 l -0.90039,2.50392 h -0.74023 l 1.07812,-5.81836 c 0.12593,-0.63116 -0.36843,-1.215229 -1.01172,-1.19531 -0.47506,0.0156 -0.8735,0.36343 -0.95312,0.83203 l -1.14453,6.18164 H 519 v -7 c 0.008,-0.563769 -0.45189,-1.0224695 -1.01562,-1.0136695 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g22378" transform="translate(-85.000016,190)" style="display:inline;enable-background:new">
+ <path sodipodi:nodetypes="cccccccccccccccc" inkscape:connector-curvature="0" id="path22367" d="m 414,410 c -0.86131,-6e-5 -1.62742,0.29548 -2.16602,0.83398 C 411.29539,411.37249 411,412.13889 411,413 c 0,6.7e-4 0,10e-4 0,0.002 l 0.002,1.98633 1,-0.002 -0.002,-1.98828 c 4.8e-4,-0.63777 0.20489,-1.12097 0.54102,-1.45703 0.33651,-0.33647 0.81984,-0.54107 1.45898,-0.54102 0.63862,-5e-5 1.12246,0.20455 1.45898,0.54102 0.33653,0.33646 0.54145,0.82028 0.54102,1.45898 v 1.98828 h 1 V 413 c 5.7e-4,-0.8613 -0.29537,-1.62751 -0.83398,-2.16602 C 415.62741,410.29548 414.86093,409.99994 414,410 Z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path id="path22376" transform="translate(86,-190)" d="m 324.5,605 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 5 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 7 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -5 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 2.5,2 h 1 1 v 1 1 h -1 v -1 h -1 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" inkscape:connector-curvature="0"/>
+ </g>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 264.4991,453.5016 4.99202,5.01925 -4.99202,4.97915 -4.99912,-4.9992 z" id="path22390" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path inkscape:connector-curvature="0" id="path22397" d="m 243.4991,453.49998 4.99202,5.02007 -4.99202,4.97995 -4.99912,-5.00001 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" sodipodi:nodetypes="ccccc"/>
+ <g id="g23030" style="display:inline;opacity:1;enable-background:new" transform="matrix(-1,0,0,1,552.8323,1.449997e-5)">
+ <path sodipodi:nodetypes="ccccsccccc" inkscape:connector-curvature="0" d="m 302.99017,504.49199 7.09213,0.008 c 2,0 3.25,-2 1.25,-4 l -2,-2 c -2,-2 -0.75,-4 1.25,-4 h 4.75 m -10,7 -3,3 m 3,3 -3,-3" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;enable-background:new" id="path23028"/>
+ </g>
+ <g transform="matrix(-1,0,0,1,384.8323,63.000015)" style="display:inline;opacity:1;enable-background:new" id="g23034">
+ <path id="path23032" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;enable-background:new" d="m 302.99017,504.49199 7.09213,0.008 c 2,0 3.25,-2 1.25,-4 l -2,-2 c -2,-2 -0.75,-4 1.25,-4 h 4.75 m -10,7 -3,3 m 3,3 -3,-3" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccsccccc"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g23061">
+ <path inkscape:connector-curvature="0" id="path13465" d="m 531.5,221.5 v 4" style="opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 544.5,229.5 v 4" id="path13473" inkscape:connector-curvature="0"/>
+ <g id="g22538-9" style="display:inline;opacity:1;enable-background:new" transform="matrix(-1,0,0,1,844.8323,-272.99999)">
+ <path sodipodi:nodetypes="ccccsccccc" inkscape:connector-curvature="0" d="m 302.99017,504.49199 6.84213,0.008 c 1.25,0 2.37916,-1.12084 0.5,-3 l -2,-2 c -1.87916,-1.87916 -0.75,-3 0.5,-3 h 2.5 m -6,5 -3,3 m 3,3 -3,-3" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;enable-background:new" id="path22531-6"/>
+ </g>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g23091">
+ <path sodipodi:nodetypes="csccccscccccccccccccccccccc" inkscape:connector-curvature="0" d="m 261.4968,502.5 0.003,4 1.0002,1 5,10e-6 V 506.5 h 3 l 0.75,0.75 h 0.25 v -3.5 h -0.25 l -0.75,0.75 h -2.9982 l -0.005,-1.99999 M 259.5,506.5 v -2 1 h 2 m 1,-3 h -2 c -1.65685,0 -3,-1.34315 -3,-3 0,-1.65685 1.34315,-3 3,-3 0.85174,0.002 1.66265,0.36515 2.23047,1 h 0.90234 c 0.45546,-1.76399 2.04535,-2.997 3.86719,-3 2.20914,0 4,1.79086 4,4 0,2.20914 -1.79086,4 -4,4 h -1" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:new" id="path6689"/>
+ <path inkscape:connector-curvature="0" id="path6687" d="m 267.5,497 c -0.8225,0 -1.5,0.6775 -1.5,1.5 0,0.8225 0.6775,1.5 1.5,1.5 0.8225,0 1.5,-0.6775 1.5,-1.5 0,-0.8225 -0.6775,-1.5 -1.5,-1.5 z m 0,1 c 0.28206,0 0.5,0.21794 0.5,0.5 0,0.28206 -0.21794,0.5 -0.5,0.5 -0.28206,0 -0.5,-0.21794 -0.5,-0.5 0,-0.28206 0.21794,-0.5 0.5,-0.5 z m -7,1 a 0.5,0.5 0 0 0 -0.5,0.5 0.5,0.5 0 0 0 0.5,0.5 0.5,0.5 0 0 0 0.5,-0.5 0.5,0.5 0 0 0 -0.5,-0.5 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:3.70000005;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22949" transform="translate(168,-41.999995)">
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" transform="matrix(0,-1,-1,0,558.00846,761.00467)" id="g22540" style="display:inline;opacity:1;enable-background:new">
+ <path inkscape:connector-curvature="0" id="path22508" d="m 467.5,357.00423 a 1.5023352,1.5042301 0 0 0 1.50234,1.50423 1.5023352,1.5042301 0 0 0 1.50233,-1.50423 A 1.5023352,1.5042301 0 0 0 469.00234,355.5 1.5023352,1.5042301 0 0 0 467.5,357.00423 Z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 467.49997,350.50001 a 1.0000051,1.0000051 0 0 0 1.00001,1 1.0000051,1.0000051 0 0 0 1,-1 1.0000051,1.0000051 0 0 0 -1,-1.00001 1.0000051,1.0000051 0 0 0 -1.00001,1.00001 z" id="path22516" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path22518" d="m 474.49998,357.5 a 1.0000001,1.0000001 0 0 0 1,1 1.0000001,1.0000001 0 0 0 1,-1 1.0000001,1.0000001 0 0 0 -1,-1 1.0000001,1.0000001 0 0 0 -1,1 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path22520" d="m 473.49999,351.50423 a 1.0023451,0.99577318 0 0 0 1.00234,0.99577 1.0023451,0.99577318 0 0 0 1.00235,-0.99577 1.0023451,0.99577318 0 0 0 -1.00235,-0.99577 1.0023451,0.99577318 0 0 0 -1.00234,0.99577 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path sodipodi:nodetypes="cc" style="opacity:0.7;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 468.49998,351.5 2e-5,4" id="path22522" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cc" style="opacity:0.7;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 474.5,357.5 h -4" id="path22533" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cc" style="opacity:0.7;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 470.5,355.5 2.99998,-3" id="path22536" inkscape:connector-curvature="0"/>
+ </g>
+ <g style="display:inline;opacity:0.6;enable-background:new" id="g22761" transform="matrix(0,-1,-1,0,554.00846,765.00467)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 467.5,357.00423 a 1.5023352,1.5042301 0 0 0 1.50234,1.50423 1.5023352,1.5042301 0 0 0 1.50233,-1.50423 A 1.5023352,1.5042301 0 0 0 469.00234,355.5 1.5023352,1.5042301 0 0 0 467.5,357.00423 Z" id="path22705" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path22709" d="m 467.49997,350.50001 a 1.0000051,1.0000051 0 0 0 1.00001,1 1.0000051,1.0000051 0 0 0 1,-1 1.0000051,1.0000051 0 0 0 -1,-1.00001 1.0000051,1.0000051 0 0 0 -1.00001,1.00001 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 474.49998,357.5 a 1.0000001,1.0000001 0 0 0 1,1 1.0000001,1.0000001 0 0 0 1,-1 1.0000001,1.0000001 0 0 0 -1,-1 1.0000001,1.0000001 0 0 0 -1,1 z" id="path22750" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path22755" d="m 468.49998,351.5 2e-5,4" style="opacity:0.7;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" id="path22757" d="m 474.5,357.5 h -4" style="opacity:0.7;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:nodetypes="cc"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22847" transform="translate(-1.8536743e-6,-20.999995)">
+ <path inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png" id="path22763" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" sodipodi:type="arc" sodipodi:cx="180.00014" sodipodi:cy="294" sodipodi:rx="3.499856" sodipodi:ry="3.5001352" sodipodi:start="2.4248832" sodipodi:end="0.71035581" sodipodi:open="true" d="m 177.36135,296.29926 a 3.499856,3.5001352 0 0 1 0.21597,-4.82512 3.499856,3.5001352 0 0 1 4.82954,-0.0153 3.499856,3.5001352 0 0 1 0.24662,4.82365"/>
+ <path sodipodi:nodetypes="cccccc" inkscape:connector-curvature="0" d="M 185.52536,291.52503 187.5,289.5 m -3.97464,0.025 L 187.5,285.5 m -7,3 3,-3" style="opacity:0.7;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path22765"/>
+ <path inkscape:connector-curvature="0" d="m 174.49293,297.5 h 12" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="path22770" sodipodi:nodetypes="cc"/>
+ </g>
+ <g transform="translate(41.999998,126)" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g22536" style="display:inline;enable-background:new">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path22498" d="m 31.5,377.5 -4.00005,4.00001" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path inkscape:connector-curvature="0" id="path22500" d="m 31.5,377.5 h 9" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:nodetypes="cc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 31.5,377.5 v -9" id="path22502" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path22504" d="m 27.5,378.5 v 3 h 3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path inkscape:connector-curvature="0" id="path22506" d="m 29.5,370.5 2,-2 2,2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path inkscape:connector-curvature="0" id="path22534" d="m 38.5,375.5 2,2 -2,2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g22880" style="display:inline;opacity:0.98999999;enable-background:new" transform="translate(-753,836.9998)">
+ <path inkscape:connector-curvature="0" id="path22875" d="m 856.5,-272.99979 a 6.5000004,6.5000004 0 0 1 -6.5,6.5 6.5000004,6.5000004 0 0 1 -6.5,-6.5 6.5000004,6.5000004 0 0 1 6.5,-6.5 6.5000004,6.5000004 0 0 1 6.5,6.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path sodipodi:nodetypes="ccccccccccccccccccccccccccc" inkscape:connector-curvature="0" id="path22878" d="m 848,-278.99979 -2,1 -2,2 h 1 l 1,1 1,1 v 2 h 2 v 1 l 1,1 v 2 c 0.16747,-0.0294 0.58327,0.0446 0.75,0 1.49768,-0.4013 2.25,-0.75 3.25,-2 l -2,-2 h -1 -1 l -1,-1 h -1 l 1,-1 h 1 l 2,-2 -1,-1 h -1 l -1,-1 1,-1 v -0.5 z" style="display:inline;opacity:0.98999999;fill:#ffffff;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"/>
+ </g>
+ <g id="g15967">
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 246.5,564 a 2.5000002,2.5000002 0 0 1 -2.5,2.5 2.5000002,2.5000002 0 0 1 -2.5,-2.5 2.5000002,2.5000002 0 0 1 2.5,-2.5 2.5000002,2.5000002 0 0 1 2.5,2.5 z" id="path17035" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path17037" d="m 250.5,559 a 1.5000001,1.5000001 0 0 1 -1.5,1.5 1.5000001,1.5000001 0 0 1 -1.5,-1.5 1.5000001,1.5000001 0 0 1 1.5,-1.5 1.5000001,1.5000001 0 0 1 1.5,1.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path d="m 250.47669,563.45043 a 6.4999542,6.4999495 0 0 1 -3.74196,6.44611 6.4999542,6.4999495 0 0 1 -7.33792,-1.30755 6.4999542,6.4999495 0 0 1 -1.28507,-7.34188 6.4999542,6.4999495 0 0 1 6.45754,-3.7222" sodipodi:open="true" sodipodi:end="4.800084" sodipodi:start="6.1985526" sodipodi:ry="6.4999495" sodipodi:rx="6.4999542" sodipodi:cy="563.99988" sodipodi:cx="244" sodipodi:type="arc" id="path17043" style="opacity:0.7;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g transform="matrix(0,-1,-1,0,577,1038)" id="g12586" style="display:inline;opacity:1;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path inkscape:connector-curvature="0" id="path12572" d="m 467.5,358.49999 a 1.9999902,1.9999902 0 0 0 1.99999,1.99999 1.9999902,1.9999902 0 0 0 1.99999,-1.99999 A 1.9999902,1.9999902 0 0 0 469.49999,356.5 1.9999902,1.9999902 0 0 0 467.5,358.49999 Z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <g id="g23031" style="opacity:0.7">
+ <path inkscape:connector-curvature="0" id="path12574" d="m 467.49997,348.50001 a 1.0000051,1.0000051 0 0 0 1.00001,1 1.0000051,1.0000051 0 0 0 1,-1 1.0000051,1.0000051 0 0 0 -1,-1.00001 1.0000051,1.0000051 0 0 0 -1.00001,1.00001 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 478.49998,359.5 a 1.0000001,1.0000001 0 0 0 1,1 1.0000001,1.0000001 0 0 0 1,-1 1.0000001,1.0000001 0 0 0 -1,-1 1.0000001,1.0000001 0 0 0 -1,1 z" id="path12576" inkscape:connector-curvature="0"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 477.49998,348.99999 a 1.5000101,1.5000098 0 0 0 1.50001,1.50001 1.5000101,1.5000098 0 0 0 1.50001,-1.50001 1.5000101,1.5000098 0 0 0 -1.50001,-1.5 1.5000101,1.5000098 0 0 0 -1.50001,1.5 z" id="path12578" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path12580" d="m 468.49998,349.5 2e-5,5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" id="path12582" d="m 478.5,359.5 h -5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" id="path12584" d="m 472.5,355.5 4.99998,-5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:nodetypes="cc"/>
+ </g>
+ </g>
+ <path id="path22802" d="m 531.5,557 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 2.5 h 1 v -2 h 12 v 11 h -12 v -2 h -1 v 2.5 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 0.5 v 0.5 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 1 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 V 570 h 8 v 0.5 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 1 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 V 570 h 0.5 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -12 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 1.5,2 v 9 h 10 v -9 z m 2.49414,0.99414 c 0.13548,0 0.26517,0.055 0.35938,0.15234 l 1.27148,1.27149 C 537.52056,561.15509 537.99223,561 538.5,561 c 0.50777,0 0.97944,0.15509 1.375,0.41797 l 1.27148,-1.27149 c 0.0907,-0.0928 0.21399,-0.14677 0.34375,-0.15039 0.45473,-0.0125 0.68856,0.53942 0.36329,0.85743 l -1.27149,1.27148 c 0.26288,0.39556 0.41797,0.86723 0.41797,1.375 0,0.50777 -0.15509,0.97944 -0.41797,1.375 l 1.27149,1.27148 c 0.4905,0.47127 -0.23578,1.19754 -0.70704,0.70704 L 539.875,565.58203 C 539.47944,565.84491 539.00777,566 538.5,566 c -0.50777,0 -0.97944,-0.15509 -1.375,-0.41797 l -1.27148,1.27149 c -0.47126,0.4905 -1.19754,-0.23577 -0.70704,-0.70704 l 1.27149,-1.27148 C 536.15509,564.47944 536,564.00777 536,563.5 c 0,-0.50777 0.15509,-0.97944 0.41797,-1.375 l -1.27149,-1.27148 c -0.32293,-0.31254 -0.10174,-0.85929 0.34766,-0.85938 z M 531,561 v 5 h 1 v -5 z m 7.5,1 c -0.83435,0 -1.5,0.66565 -1.5,1.5 0,0.83435 0.66565,1.5 1.5,1.5 0.83435,0 1.5,-0.66565 1.5,-1.5 0,-0.83435 -0.66565,-1.5 -1.5,-1.5 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccscccccsccccsccccsccccccccsssss"/>
+ <g id="g23083" style="display:inline;opacity:0.6;enable-background:new" transform="translate(126,252)">
+ <path inkscape:connector-curvature="0" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 510.5,557 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 2.5 h 1 v -0.5 -1.5 h 0.87891 l 1,-1 z m 6.4082,0 c 0.0558,0.15706 0.0918,0.3238 0.0918,0.5 v 0.5 h 6 v 11 h -6 v 0.5 c -2e-5,0.1762 -0.036,0.34294 -0.0918,0.5 H 521 v 0.5 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 1 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 V 570 h 0.5 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -12 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z M 510,561 v 5 h 1 v -5 z m 0,6 v 2.5 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 0.5 v 0.5 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 1 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -0.37891 L 511.87891,569 H 511 v -1.5 -0.5 z" transform="translate(-126,-252)" id="path22995"/>
+ <path sodipodi:nodetypes="ccccccc" inkscape:connector-curvature="0" id="rect22997" d="m 386.5,307.5 2,-2 h 1 v 12 h -1 l -2,-2 z" style="opacity:0.8;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path sodipodi:nodetypes="ccccccc" inkscape:connector-curvature="0" id="path23075" d="m 388.5,307.5 v -2 h 1 v 12 h -1 v -2 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22484" transform="translate(-220,-220)">
+ <path id="path22480" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 334.5,777 c -0.15738,-3e-4 -0.30571,0.0735 -0.40039,0.19922 L 332.75,779 H 332 c -0.54535,0 -1,0.45465 -1,1 v 9 c 0,0.54535 0.45465,1 1,1 h 12 c 0.54535,0 1,-0.45465 1,-1 v -9 c 0,-0.54535 -0.45465,-1 -1,-1 h -3.75 l -1.34961,-1.80078 C 338.80571,777.07351 338.65738,776.9997 338.5,777 Z m 1,1 h 2 c 0.27613,3e-5 0.49997,0.22387 0.5,0.5 v 1 c -3e-5,0.27613 -0.22387,0.49997 -0.5,0.5 h -2 c -0.27613,-3e-5 -0.49997,-0.22387 -0.5,-0.5 v -1 c 3e-5,-0.27613 0.22387,-0.49997 0.5,-0.5 z m -3.5,3 h 9 v 7 h -9 v -6.5 z m 11,1 c 0.54636,0 1,0.45364 1,1 0,0.54636 -0.45364,1 -1,1 -0.54636,0 -1,-0.45364 -1,-1 0,-0.54636 0.45364,-1 1,-1 z m 0,4 c 0.54636,0 1,0.45364 1,1 0,0.54636 -0.45364,1 -1,1 -0.54636,0 -1,-0.45364 -1,-1 0,-0.54636 0.45364,-1 1,-1 z" inkscape:connector-curvature="0" sodipodi:nodetypes="cccsssssssscccccccccccccccccccssssssssss"/>
+ <path inkscape:connector-curvature="0" id="path22526" style="display:inline;opacity:0.2;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:new" d="m 333.5,786.5 6.00128,1.9e-4 M 333.5,784.5 l 6.00128,1.9e-4 M 333.5,782.5 l 6.00128,1.9e-4"/>
+ <path inkscape:connector-curvature="0" d="m 342.50195,777 c -0.67617,-0.01 -0.67617,1.00957 0,1 h 1 c 0.67617,0.01 0.67617,-1.00957 0,-1 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.8;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" id="path22529" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" style="display:inline;enable-background:new" id="g22589">
+ <path sodipodi:nodetypes="sssccs" inkscape:connector-curvature="0" id="path22482" d="m 112.00396,275.50459 c -1.15597,-2.75459 -0.32263,-6.89437 2.13846,-9.35733 2.47248,-2.47436 5.66509,-3.31832 9.36358,-2.12195 1.16751,0.37766 1.28502,1.13678 0.494,1.97469 l -10,10 c -0.75,0.75 -1.56568,0.5301 -1.99604,-0.49541 z" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <path id="path22543" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" d="m 122.50707,270.5 c 1.5,0 2,0.6393 2,2 m -6.00707,2 c 0,1.5 0.6393,2 2,2 h 1 m -1,-4 c 0,1.5 1,2 2,2 1,0 2,0.5 2,2" inkscape:connector-curvature="0"/>
+ <path style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" d="m 115.49488,267.50504 c -1.24496,1.24496 -1.99774,3.48513 -1.99504,4.99501" id="path22545" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <g style="display:inline;stroke-width:1.18252182;enable-background:new" transform="matrix(0.84565033,0,0,0.84565033,-95.6816,195.15719)" id="g23242-4">
+ <g style="stroke-width:1.18252182" transform="translate(829,-385)" id="g23232-7">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path23229-8" d="m -351.04643,694.04358 -4.7468,4.7485" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.18252182;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <path id="path23234-0" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.18252182;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 473.22349,317.32123 -0.29563,0.29563 c -1.10449,1.18252 -2.45507,1.09295 -3.54757,0 -1.0925,-1.09295 -1.18252,-2.42408 0,-3.54756 l 0.31492,-0.29919" inkscape:connector-curvature="0" sodipodi:nodetypes="cczsc"/>
+ <path sodipodi:nodetypes="ccccsc" inkscape:connector-curvature="0" d="m 469.67592,313.77367 1.47815,-1.47815 c 0.28845,-0.30883 0.59368,-0.53089 0.90672,-0.67098 m 3.30272,3.32376 c -0.14048,0.30687 -0.3655,0.60153 -0.66187,0.89478 l -1.49744,1.48171" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.18252182;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path23236-4"/>
+ <path id="path23238-4" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.18252182;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 477.95356,305.49601 0.29563,-0.29563 c 1.10449,-1.18252 2.45507,-1.09295 3.54757,0 1.0925,1.09295 1.18252,2.42408 0,3.54756 l -0.31492,0.29919" inkscape:connector-curvature="0" sodipodi:nodetypes="cczsc"/>
+ <path id="path23240-3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.18252182;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 481.27611,309.26304 -1.47815,1.47815 c -0.22793,0.24404 -0.46634,0.43389 -0.71081,0.57194 m -3.43013,-3.36129 c 0.14073,-0.25819 0.34124,-0.50871 0.59339,-0.75821 l 1.49744,-1.48171" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccsc"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g23545-6" transform="rotate(-90,318.41616,448.41614)">
+ <path sodipodi:nodetypes="cccccccc" inkscape:connector-curvature="0" d="m 303.99017,524.49199 5.34213,0.008 m -6,-8 h 6 m -3,5 -3,3 m 3,3 -3,-3" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;enable-background:new" id="path23541-6"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path23543-2" transform="matrix(0,-1,-1,0,0,0)" sodipodi:type="arc" sodipodi:cx="-520.5" sodipodi:cy="-309.33231" sodipodi:rx="3.999994" sodipodi:ry="3.999994" sodipodi:start="3.1415927" sodipodi:end="0" d="m -524.49999,-309.33231 a 3.999994,3.999994 0 0 1 3.99999,-3.99999 3.999994,3.999994 0 0 1 3.99999,3.99999" sodipodi:open="true"/>
+ </g>
+ <g transform="translate(-346,-11.999995)" id="g24012-1" style="display:inline;enable-background:new">
+ <g style="opacity:0.7;stroke-width:1.18252182" transform="matrix(0.84565033,0,0,0.84565033,271.3184,206.1572)" id="g24008-0">
+ <g style="stroke-width:1.18252182" transform="translate(829,-385)" id="g24002-7">
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path24000-5" d="m -349.8639,694.04357 -1.47815,1.47816 m -4.13883,4.13882 -1.47815,1.47815" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.18252182;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <path sodipodi:nodetypes="ccscc" inkscape:connector-curvature="0" d="m 476.77106,307.86105 1.47813,-1.47815 c 1.18254,-1.18252 2.45507,-1.09295 3.54757,0 1.0925,1.09295 1.18253,2.36504 0,3.54756 l -1.47814,1.47816" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.18252182;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path24004-1"/>
+ <path id="path24006-7" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.18252182;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 474.40601,317.32123 -1.47815,1.47815 c -1.18252,1.18252 -2.49063,1.1069 -3.58313,0.014 -1.0925,-1.09295 -1.14696,-2.37899 0,-3.54756 l 1.51372,-1.49211" inkscape:connector-curvature="0" sodipodi:nodetypes="ccscc"/>
+ </g>
+ <path inkscape:connector-curvature="0" id="path24010-2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 679.5,476.5 -11,-11 m 11,6.75 v 4.25 h -4.25" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g23243" transform="translate(231,-83.999995)">
+ <g id="g23233" transform="translate(430,-112)">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path23231" d="m -351.5,694.5 -5,5" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <path id="path23235" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 76.5,587.5 c 0,0.65011 -0.25463,1.25463 -0.75,1.75 l -1.5,1.5 c -0.97122,1.0395 -2.5,1 -3.75,-0.25 -1.25,-1.25 -1.25,-2.75 -0.25,-3.75 l 1.5,-1.5 c 0.48836,-0.52269 1.11769,-0.77257 1.78167,-0.73292" inkscape:connector-curvature="0" sodipodi:nodetypes="cscsscc"/>
+ <path sodipodi:nodetypes="cscsscc" inkscape:connector-curvature="0" d="m 78.51432,585.48568 c 0.65011,0 1.25463,-0.25463 1.75,-0.75 l 1.5,-1.5 c 1.0395,-0.97122 1,-2.5 -0.25,-3.75 -1.25,-1.25 -2.75,-1.25 -3.75,-0.25 l -1.5,1.5 c -0.51814,0.48411 -0.7682,1.10675 -0.73389,1.76434" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path23241"/>
+ </g>
+ <g transform="translate(231,-105)" id="g23283" style="display:inline;opacity:0.6;enable-background:new">
+ <g transform="translate(430,-112)" id="g23275">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m -351.5,694.5 -5,5" id="path23273" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ </g>
+ <path sodipodi:nodetypes="cscsscc" inkscape:connector-curvature="0" d="m 76.5,587.5 c 0,0.65011 -0.25463,1.25463 -0.75,1.75 l -1.5,1.5 c -0.97122,1.0395 -2.5,1 -3.75,-0.25 -1.25,-1.25 -1.25,-2.75 -0.25,-3.75 l 1.5,-1.5 c 0.48836,-0.52269 1.11769,-0.77257 1.78167,-0.73292" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path23279"/>
+ <path id="path23281" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 78.51432,585.48568 c 0.65011,0 1.25463,-0.25463 1.75,-0.75 l 1.5,-1.5 c 1.0395,-0.97122 1,-2.5 -0.25,-3.75 -1.25,-1.25 -2.75,-1.25 -3.75,-0.25 l -1.5,1.5 c -0.51814,0.48411 -0.7682,1.10675 -0.73389,1.76434" inkscape:connector-curvature="0" sodipodi:nodetypes="cscsscc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g23341" transform="translate(62.999998,-41.999995)">
+ <g transform="translate(231,-63)" id="g23324" style="opacity:0.6">
+ <g transform="translate(430,-112)" id="g23301">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m -351.25,694.25 -1,1 m -3.5,3.5 -1,1" id="path23299" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ </g>
+ <path sodipodi:nodetypes="cscsscc" inkscape:connector-curvature="0" d="m 75.5,588.5 c 0,0.65011 -0.25463,1.25463 -0.75,1.75 l -0.5,0.5 c -0.97122,1.0395 -2.5,1 -3.75,-0.25 -1.25,-1.25 -1.25,-2.75 -0.25,-3.75 l 0.5,-0.5 c 0.48836,-0.52269 1.11769,-0.77257 1.78167,-0.73292" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path23305"/>
+ <path id="path23322" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 79.51432,584.48568 c 0.65011,0 1.25463,-0.25463 1.75,-0.75 l 0.5,-0.5 c 1.0395,-0.97122 1,-2.5 -0.25,-3.75 -1.25,-1.25 -2.75,-1.25 -3.75,-0.25 l -0.5,0.5 c -0.51814,0.48411 -0.7682,1.10675 -0.73389,1.76434" inkscape:connector-curvature="0" sodipodi:nodetypes="cscsscc"/>
+ </g>
+ <path sodipodi:nodetypes="ccccc" d="m 313.5,528.5 -12,-12 m 12,7.75 v 4.25 h -4.25" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path23333" inkscape:connector-curvature="0"/>
+ </g>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:1;enable-background:new" id="g23365" transform="matrix(0,-1,-1,0,640,975)">
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 467.5,358.49999 a 1.9999902,1.9999902 0 0 0 1.99999,1.99999 1.9999902,1.9999902 0 0 0 1.99999,-1.99999 A 1.9999902,1.9999902 0 0 0 469.49999,356.5 1.9999902,1.9999902 0 0 0 467.5,358.49999 Z" id="path23346" inkscape:connector-curvature="0"/>
+ <g style="opacity:0.7" id="g23363">
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 467.49997,348.50001 a 1.0000051,1.0000051 0 0 0 1.00001,1 1.0000051,1.0000051 0 0 0 1,-1 1.0000051,1.0000051 0 0 0 -1,-1.00001 1.0000051,1.0000051 0 0 0 -1.00001,1.00001 z" id="path23349" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path23351" d="m 478.49998,359.5 a 1.0000001,1.0000001 0 0 0 1,1 1.0000001,1.0000001 0 0 0 1,-1 1.0000001,1.0000001 0 0 0 -1,-1 1.0000001,1.0000001 0 0 0 -1,1 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="path23355" d="m 477.49998,348.99999 a 1.5000101,1.5000098 0 0 0 1.50001,1.50001 1.5000101,1.5000098 0 0 0 1.50001,-1.50001 1.5000101,1.5000098 0 0 0 -1.50001,-1.5 1.5000101,1.5000098 0 0 0 -1.50001,1.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path sodipodi:nodetypes="cc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 468.49998,349.5 2e-5,5" id="path23357" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 478.5,359.5 h -5" id="path23359" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="cc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 472.5,355.5 4.99998,-5" id="path23361" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g22284-9" transform="translate(168,-252)">
+ <path sodipodi:nodetypes="ssccccs" inkscape:connector-curvature="0" d="m 57.892544,296.4472 c -1.672904,1.40373 -4.112184,1.40373 -5.785088,0 -1.672904,-1.40373 -2.096481,-3.80596 -1.00457,-5.6972 L 54.75,284.5 h 0.5 l 3.647114,6.25 c 1.091911,1.89124 0.668334,4.29347 -1.00457,5.6972 z" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" id="path22260-6"/>
+ <path id="path22264-7" d="m 52.501454,292.49305 a 2.5629914,2.5493243 0 0 1 0.292656,-0.77 L 54.5,288.5" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(189,-210)" style="display:inline;enable-background:new" id="g23463-9">
+ <path sodipodi:nodetypes="ccsscccc" inkscape:connector-curvature="0" id="ellipse22388-7" d="m 15.5,242.5 -2.7e-4,0.50006 c 0,0.89314 -0.476446,1.71844 -1.249865,2.16501 -0.773419,0.44657 -1.726311,0.44657 -2.49973,0 -0.773419,-0.44657 -1.249865,-1.27187 -1.249865,-2.16501 L 10.5,242.5 v 0 0" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"/>
+ <path inkscape:connector-curvature="0" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 15.5,242.5 h 4 v 5 h -2 l -2.9e-4,8 -8.99971,-5e-5 V 247.5 h -2 v -5 h 4" id="path22384-8" sodipodi:nodetypes="cccccccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g23608" transform="translate(-168,-294)">
+ <path d="m 345.67581,336.31883 a 5.4499998,5.4499998 0 0 1 -1.8611,-5.9967 5.4499998,5.4499998 0 0 1 5.02132,-3.76966 5.4499998,5.4499998 0 0 1 5.23896,3.46083 5.4499998,5.4499998 0 0 1 -1.49707,6.09778" sodipodi:open="true" sodipodi:end="0.8546274" sodipodi:start="2.2267848" sodipodi:ry="5.4499998" sodipodi:rx="5.4499998" sodipodi:cy="332" sodipodi:cx="349" sodipodi:type="arc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path23602"/>
+ <path sodipodi:nodetypes="cccccc" inkscape:connector-curvature="0" id="path23604" d="m 352.5,336.5 h 3 v 3 h -13 v -3 h 6" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path id="path23606" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:type="arc" sodipodi:cx="349" sodipodi:cy="332" sodipodi:rx="2.84375" sodipodi:ry="2.84375" sodipodi:start="3.2977779" sodipodi:end="4.5530322" d="m 346.19086,331.55765 a 2.84375,2.84375 0 0 1 2.35788,-2.36537" sodipodi:open="true"/>
+ </g>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g8542" style="display:inline;opacity:0.98999999;enable-background:new" transform="translate(-795,773.9998)">
+ <path inkscape:connector-curvature="0" id="path8571" d="m 856.5,-272.99979 a 6.5000004,6.5000004 0 0 1 -6.5,6.5 6.5000004,6.5000004 0 0 1 -6.5,-6.5 6.5000004,6.5000004 0 0 1 6.5,-6.5 6.5000004,6.5000004 0 0 1 6.5,6.5 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path sodipodi:nodetypes="ccccccccccccccccccccccccccc" inkscape:connector-curvature="0" id="path8573" d="m 848,-278.99979 -2,1 -2,2 h 1 l 1,1 1,1 v 2 h 2 v 1 l 1,1 v 2 c 0.16747,-0.0294 0.58327,0.0446 0.75,0 1.49768,-0.4013 2.25,-0.75 3.25,-2 l -2,-2 h -1 -1 l -1,-1 h -1 l 1,-1 h 1 l 2,-2 -1,-1 h -1 l -1,-1 1,-1 v -0.5 z" style="display:inline;opacity:0.98999999;fill:#ffffff;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"/>
+ </g>
+ <g transform="translate(-21.000002,147)" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g12973" style="display:inline;enable-background:new">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path12961" d="m 31.5,377.5 -4.00005,4.00001" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path inkscape:connector-curvature="0" id="path12963" d="m 31.5,377.5 h 9" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:nodetypes="cc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 31.5,377.5 v -9" id="path12965" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path12967" d="m 27.5,378.5 v 3 h 3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path inkscape:connector-curvature="0" id="path12969" d="m 29.5,370.5 2,-2 2,2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path inkscape:connector-curvature="0" id="path12971" d="m 38.5,375.5 2,2 -2,2" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <g id="g8815" style="display:inline;opacity:0.98999999;enable-background:new" transform="translate(-627,857.9998)">
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 665.5,-352.49979 h -9 v -9" id="path8745" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ <g id="g8805" transform="matrix(-1,0,0,1,1321,-5)">
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 653.5,-358.49979 h 9 v 9 h -9 z" id="path8743" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" d="m 662.25,-349.99979 -2.75,-5.5 -3,5.5 z" id="path8759" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ <circle style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="circle8761" cx="656" cy="-355.99979" r="0.5"/>
+ </g>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path8807" d="m 663.5,-350.49979 h -9 v -9" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ </g>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" transform="translate(-21.000002,42.000006)" id="g12626" style="display:inline;enable-background:new">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 31.5,377.5 -4.00005,4.00001" id="path12181" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 31.5,377.5 h 9" id="path12186" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" id="path12205" d="m 31.5,377.5 v -9" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" sodipodi:nodetypes="cc"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" transform="matrix(-1,0,0,1,677,-147)" id="g11566">
+ <rect y="683.5" x="-243.5" height="13" width="2" id="rect11443" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" transform="scale(-1,1)"/>
+ <rect style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="rect11447" width="2" height="11" x="-239.5" y="685.5" transform="scale(-1,1)"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path11462" d="m 248.5,696.5 2,-1 -4,-8 -2,1 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ </g>
+ <g id="g22614" transform="translate(126,105)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96" style="display:inline;enable-background:new">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path22541" d="m 31.5,377.5 -4.00005,4.00001" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path inkscape:connector-curvature="0" id="path22604" d="m 31.5,377.5 h 9" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:nodetypes="cc" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 31.5,377.5 v -9" id="path22612" inkscape:connector-curvature="0"/>
+ </g>
+ <g id="g23273" transform="rotate(-90,475.00002,564)" style="display:inline;enable-background:new">
+ <rect transform="rotate(90)" style="display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="rect23246" width="13" height="12.999985" x="557.5" y="-502.5"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path23248" d="m 493.99999,558.99999 h -2 v 2 h 2 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 493.99999,562.99999 h -2 v 2 h 2 z" id="path23250" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 493.99999,566.99999 h -2 v 2 h 2 z" id="path23252" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path23254" d="m 495.99999,560.99999 h -2 v 2 h 2 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 495.99999,564.99999 h -2 v 2 h 2 z" id="path23256" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 491.99999,558.99999 h -1 v 10 h 1 z" id="path23258" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:0.8;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 497.99999,558.99999 h -2 v 2 h 2 z" id="path23261" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path23263" d="m 497.99999,562.99999 h -2 v 2 h 2 z" style="display:inline;opacity:0.8;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path23265" d="m 497.99999,566.99999 h -2 v 2 h 2 z" style="display:inline;opacity:0.8;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:0.7;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 499.99999,560.99999 h -2 v 2 h 2 z" id="path23269" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path23271" d="m 499.99999,564.99999 h -2 v 2 h 2 z" style="display:inline;opacity:0.7;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ </g>
+ <path sodipodi:nodetypes="cscccccccccsscc" inkscape:connector-curvature="0" d="m 432.88887,419.07309 c 1.49965,0.73814 3.39817,0.63987 4.61113,-0.57309 1.5,-1.5 1,-4 -0.5,-2.5 l -1.5,1.5 h -2 l -1,-1 v -2 L 434,413 c 1.5,-1.5 -1,-2 -2.5,-0.49998 -1.22399,1.22397 -1.34648,3.07891 -0.58591,4.58561 L 430.5,417.5 l -2.25,2.25 c -1.75,1.75 0.25,3.75 2,2 l 2.25,-2.25 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path22766"/>
+ <path id="path22771" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 416,415 -1.5,1.5 -1,4e-5 -1,-1 v -1 L 414,413 c 1.75,-1.75 -2.11049,-2 -3.5,-0.49999 -1.17632,1.26987 -1.34648,3.07892 -0.58591,4.58562 L 409.5,417.5 l -2.25,2.25 c -1.75,1.75 0.25,3.75 2,2 l 2.25,-2.25 0.38887,-0.42691 c 1.49965,0.73814 3.34344,0.58255 4.61113,-0.57309 1.5,-1.36742 1.25,-5.25 -0.5,-3.5 z" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccsccssccsc"/>
+ <g transform="translate(-21.000002,4.4999696e-6)" inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:0.6;enable-background:new" id="g12548">
+ <g style="display:inline;opacity:1;enable-background:new" transform="translate(640.00001,-112)" id="g7753-3">
+ <path sodipodi:nodetypes="cscsscc" inkscape:connector-curvature="0" d="m -543.50001,700.5 c 0,0.65011 -0.25463,1.25463 -0.75,1.75 l -0.5,0.5 c -0.97122,1.0395 -2.5,1 -3.75,-0.25 -1.25,-1.25 -1.25,-2.75 -0.25,-3.75 l 0.5,-0.5 c 0.48836,-0.52269 1.11769,-0.77257 1.78167,-0.73292" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path23197"/>
+ <path sodipodi:nodetypes="cscsscc" inkscape:connector-curvature="0" d="m -539.48569,696.48568 c 0.65011,0 1.25463,-0.25463 1.75,-0.75 l 0.5,-0.5 c 1.0395,-0.97122 1,-2.5 -0.25,-3.75 -1.25,-1.25 -2.75,-1.25 -3.75,-0.25 l -0.5,0.5 c -0.51814,0.48411 -0.7682,1.10675 -0.73389,1.76434" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path12469-4"/>
+ </g>
+ <path inkscape:connector-curvature="0" id="path12384-0" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 92.5,582.5 h -2 m 4,-2 v -2 m -2,2 -1,-1" sodipodi:nodetypes="cccccc"/>
+ <path sodipodi:nodetypes="cccccc" d="m 101.5,587.5 h 2 m -4,2 v 2 m 2,-2 1,1" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="path12538" inkscape:connector-curvature="0"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" id="g23748" style="display:inline;enable-background:new">
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 49,558 v 3 h 3 v -3 z m 3,3 v 3 h 3 v -3 z m 3,0 h 3 v -3 h -3 z m 3,0 v 3 h 3 v -3 z m 0,3 h -3 v 3 h 3 z m 0,3 v 3 h 3 v -3 z m -3,0 h -3 v 3 h 3 z m -3,0 v -3 h -3 v 3 z" id="path10767" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <rect inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;overflow:visible;visibility:visible;opacity:0.8;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="rect22625" width="13.000062" height="13.000062" x="48.5" y="557.5"/>
+ </g>
+ <g transform="translate(-1.8536743e-6,4.4999696e-6)" id="g23743" style="display:inline;enable-background:new">
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="path22623" d="m 217,495 v 3 h 3 v -3 z m 3,3 v 3 h 3 v -3 z m 3,0 h 3 v -3 h -3 z m 3,0 v 3 h 3 v -3 z m 0,3 h -3 v 3 h 3 z m 0,3 v 3 h 3 v -3 z m -3,0 h -3 v 3 h 3 z m -3,0 v -3 h -3 v 3 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:connector-curvature="0"/>
+ <rect y="494.5" x="216.5" height="13.000062" width="13.000062" id="rect22631" style="display:inline;overflow:visible;visibility:visible;opacity:0.8;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ </g>
+ <g transform="translate(-543,836.9998)" style="display:inline;opacity:0.98999999;enable-background:new" id="g23808">
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path23786" d="m 665.5,-352.49979 h -9 v -9" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <g transform="matrix(-1,0,0,1,1321,-5)" id="g23800">
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path23794" d="m 653.5,-358.49979 h 9 v 9 h -9 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path23796" d="m 662.25,-349.99979 -2.75,-5.5 -3,5.5 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ <circle r="0.5" cy="-355.99979" cx="656" id="circle23798" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ </g>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 663.5,-350.49979 h -9 v -9" id="path23806" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ </g>
+ <g transform="matrix(-1,0,0,1,593.8323,-41.999985)" style="display:inline;opacity:1;enable-background:new" id="g24182">
+ <path id="path24180" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;enable-background:new" d="m 302.99017,504.49199 7.84213,0.008 c 1.25,0 2.37916,-1.12084 0.5,-3 l -2,-2 c -1.87916,-1.87916 -0.75,-3 0.5,-3 h 3.5 m -8,5 -3,3 m 3,3 -3,-3" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccsccccc"/>
+ </g>
+ <g transform="translate(112.05535,339.92702)" id="g44391-4" style="display:inline;opacity:0.7;enable-background:new">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" id="rect44387-5" width="16" height="16" x="103" y="111"/>
+ <circle r="8" cy="118" cx="132" style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="circle44389-4" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" transform="matrix(-0.248353,0.02816779,0.02830718,0.248422,140.45214,86.01031)"/>
+ </g>
+ <g transform="translate(-1134,-17)" style="display:inline;enable-background:new" id="g23520-0">
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="rect23613-0" d="m 1455.5,512.5 h 13 v 3 h -13 z" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="rect23615-3" d="m 1467.5,517.5 v 7 h -11 v -7" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path23618-7" d="m 1461,519 h 2" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g23658-7" transform="translate(-1197,-80)">
+ <path style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 1455.5,512.5 h 13 v 3 h -13 z" id="path23652-1" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 1456,538 v 7.5 c 0,0.27613 0.2239,0.49997 0.5,0.5 h 11 c 0.2761,-3e-5 0.5,-0.22387 0.5,-0.5 V 538 Z m 5,1 h 2 a 1.0001,1.0001 0 1 1 0,2 h -2 a 1.0001,1.0001 0 1 1 0,-2 z" transform="translate(0,-21)" id="path23654-6"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g23689-9" transform="rotate(180,957.9976,414.99747)">
+ <path d="m -1426.5011,-580.49396 a 7.0070715,7.0070715 0 0 1 7.0071,-7.00707" sodipodi:end="4.712389" sodipodi:start="3.1415927" sodipodi:ry="7.0070715" sodipodi:rx="7.0070715" sodipodi:cy="-580.49396" sodipodi:cx="-1419.494" sodipodi:type="arc" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path23647-2" sodipodi:open="true" transform="scale(-1)"/>
+ <path sodipodi:open="true" id="path23668-9" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" sodipodi:type="arc" sodipodi:cx="-1416.494" sodipodi:cy="-577.49396" sodipodi:rx="7.0070715" sodipodi:ry="7.0070715" sodipodi:start="3.1415927" sodipodi:end="4.712389" d="m -1423.5011,-577.49396 a 7.0070715,7.0070715 0 0 1 7.0071,-7.00707" transform="scale(-1)"/>
+ <path d="m -1420.5011,-574.49396 a 7.0070715,7.0070715 0 0 1 7.0071,-7.00707" sodipodi:end="4.712389" sodipodi:start="3.1415927" sodipodi:ry="7.0070715" sodipodi:rx="7.0070715" sodipodi:cy="-574.49396" sodipodi:cx="-1413.494" sodipodi:type="arc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path23670-8" sodipodi:open="true" transform="scale(-1)"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g23935-0" transform="translate(-924,-332)">
+ <path d="m 1396.4645,586.51165 a 9.0901785,9.0901785 0 0 1 8.0609,-8.04862" sodipodi:end="4.604882" sodipodi:start="3.2506166" sodipodi:ry="9.0901785" sodipodi:rx="9.0901785" sodipodi:cy="587.50073" sodipodi:cx="1405.5007" sodipodi:type="arc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path23640-2-5" sodipodi:open="true"/>
+ <path sodipodi:open="true" id="path23706-8" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" sodipodi:type="arc" sodipodi:cx="1405.4989" sodipodi:cy="587.49896" sodipodi:rx="12.99995" sodipodi:ry="12.99995" sodipodi:start="3.1415927" sodipodi:end="4.712389" d="m 1392.499,587.49896 a 12.99995,12.99995 0 0 1 12.9999,-12.99995"/>
+ </g>
+ <g style="display:inline;opacity:1;enable-background:new" id="g13692-5-0" transform="translate(316.0071,-315)" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" inkscape:transform-center-x="0.044194174" inkscape:transform-center-y="-4.4857087" d="m 47.5,578.5 h 5 L 52.4929,589 c 0,1.25 -1.03125,2.5 -2.515625,2.5 -1.484375,0 -2.484375,-1.25 -2.484375,-2.5 z" id="path13679-7-1" inkscape:connector-curvature="0" sodipodi:nodetypes="ccczcc"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path13681-7-8" d="M 58.49288,586.5 H 60.5 v 5 h -6.75712" inkscape:transform-center-y="-0.022083293" inkscape:transform-center-x="-4.9939422" style="display:inline;opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path13684-4-3" d="m 54.5,581.5 2,-2 3,3 -5,5" inkscape:transform-center-y="-3.5468612" inkscape:transform-center-x="-3.515633" style="display:inline;opacity:0.8;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <circle style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle13686-9-5" cx="50" cy="589" r="0.5"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g23993-7" transform="matrix(1,0,0,-1,-1008,851.0067)">
+ <path transform="rotate(-90)" sodipodi:open="true" id="path23981-7" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" sodipodi:type="arc" sodipodi:cx="-595.60846" sodipodi:cy="1447.4008" sodipodi:rx="10.783591" sodipodi:ry="9.801362" sodipodi:start="3.1415927" sodipodi:end="4.712389" d="m -606.39205,1447.4008 a 10.783591,9.801362 0 0 1 10.78359,-9.8014"/>
+ <g style="opacity:0.6" id="g23987-2">
+ <path sodipodi:open="true" id="path23844-4-8" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" sodipodi:type="arc" sodipodi:cx="1444.5001" sodipodi:cy="608.49963" sodipodi:rx="9.73985" sodipodi:ry="10.99995" sodipodi:start="4.2898891" sodipodi:end="4.712389" d="m 1440.5064,598.46694 a 9.73985,10.99995 0 0 1 3.9937,-0.96726"/>
+ <path d="m 1434.5006,608.49963 a 8.7782269,10.99995 0 0 1 1.9952,-6.98231" sodipodi:end="3.829289" sodipodi:start="3.1415927" sodipodi:ry="10.99995" sodipodi:rx="8.7782269" sodipodi:cy="608.49963" sodipodi:cx="1443.2788" sodipodi:type="arc" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="path23983-7" sodipodi:open="true"/>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" transform="rotate(180,947.5,425.5)" id="g24104-2">
+ <g id="g24094-5" style="opacity:0.5">
+ <circle style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="circle24085-2" cx="1446" cy="607" r="1.5"/>
+ <path sodipodi:nodetypes="cccc" inkscape:connector-curvature="0" id="path24091-4" d="m 1440.25,607.5 h 4.25 m 2,-2 v -4.25" style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"/>
+ </g>
+ <g id="g24102-2">
+ <circle r="1.5" cy="607" cx="1436" id="circle24096-6" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ <path inkscape:connector-curvature="0" id="path24100-8" d="m 1437.5,605.5 7,-7" style="opacity:1;vector-effect:none;fill:#666666;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" sodipodi:nodetypes="cc"/>
+ <circle style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="circle24232-5" cx="1446" cy="597" r="1.5"/>
+ </g>
+ </g>
+ <path d="m 406.4902,255.51061 v -0.7892 -1.2108 l 0.9999,0.01 1.0001,-1.0071 v -1 l -1.0001,-0.9958 h -1 l 1e-4,-2.0042 h 0.9999 l 1.0001,-1.0042 h 1 l 1,-1 v -2 l 1,-1 1,1 h 1.9999 l 1,1 1,-1 1e-4,-1.00421 h 2" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="path42222-9-3-2" sodipodi:nodetypes="ccccccccccccccccccccc" inkscape:connector-curvature="0"/>
+ <g style="display:inline;enable-background:new" id="g10865-1-4" transform="translate(209.9929,-231)">
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g12049-3-5" transform="translate(126,64.00005)" style="display:inline;opacity:0.98999999;enable-background:new">
+ <path inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" sodipodi:nodetypes="cccccccc" inkscape:connector-curvature="0" id="path12047-5-1" style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new" d="m 61.5,411.49995 -9,5e-5 m 9,4.99995 -2,5e-5 m -6,0 -5,-5e-5 m 9,5.00005 -9,-5e-5"/>
+ </g>
+ <circle inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" r="1" cy="475.5" cx="175.5" id="path14096-4-6" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ <circle inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle14098-2-7" cx="186.5" cy="485.5" r="1"/>
+ <circle inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" r="1" cy="480.5" cx="182.5" id="circle14100-8-7" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g transform="translate(-0.00710095,-1)" id="g24230-2" style="display:inline;enable-background:new">
+ <g style="display:inline;opacity:0.98999999;enable-background:new" transform="translate(126,64.00005)" id="g24222-6" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path d="m 61.5,411.49995 -8,5e-5 m 8,4.99995 -8,5e-5 m 8,5 -8,-5e-5" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new" id="path24220-9" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ </g>
+ <circle style="opacity:0.6;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle24224-1" cx="175.5" cy="475.5" r="1" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <circle r="1" cy="485.5" cx="175.5" id="circle24226-8" style="opacity:0.6;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <circle style="opacity:0.6;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="circle24228-7" cx="175.5" cy="480.5" r="1" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ </g>
+ <g style="display:inline;enable-background:new" id="g24393-7" transform="matrix(-1,0,0,1,1912.004,-92)">
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path24370-2" d="m 1371.5046,345.9995 v 1.4935 h 8.9948 v -8.991 L 1379,338.5" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 1377.4994,344.4935 v -9.991 h -9.9948 v 9.991 z" id="path24368-5" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ <path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 1376,338.5 -4.4954,0.002 v 4.4975" id="path24388-3" inkscape:connector-curvature="0" sodipodi:nodetypes="ccc"/>
+ </g>
+ <g id="g23670-1" style="display:inline;opacity:0.98999999;enable-background:new" transform="translate(-144,395.99983)">
+ <path inkscape:connector-curvature="0" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 516.79102,241.99023 c -1.39461,0.0411 -2.78409,0.49653 -3.97071,1.37696 -2.71227,2.01238 -3.60664,5.68085 -2.12304,8.71484 1.48359,3.03399 4.92784,4.58076 8.18164,3.67578 3.25379,-0.90497 5.40533,-4.00874 5.10937,-7.37304 a 0.50005,0.50005 0 1 0 -0.99609,0.0879 c 0.25429,2.89066 -1.58515,5.54469 -4.38086,6.32226 -2.79571,0.77757 -5.74089,-0.54549 -7.01563,-3.15234 -1.27473,-2.60685 -0.51012,-5.74358 1.82032,-7.47266 1.82885,-1.35693 4.20136,-1.52156 6.16796,-0.58203 l 0.75391,-0.75391 c -0.9189,-0.49743 -1.92706,-0.77935 -2.94922,-0.83593 -0.19885,-0.011 -0.39843,-0.0137 -0.59765,-0.008 z" transform="translate(144,-395.99979)" id="path23651-6"/>
+ <rect transform="scale(-1)" ry="1" rx="1" y="145.99995" x="-662" height="2" width="2" id="rect23653-5" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 516.8457,244 c -0.76098,0.0235 -1.52298,0.22172 -2.22265,0.59961 -1.8658,1.00766 -2.8953,3.08709 -2.56446,5.18164 a 0.50028272,0.50028272 0 1 0 0.98829,-0.15625 c -0.26522,-1.67902 0.55512,-3.33873 2.05078,-4.14648 0.92134,-0.4976 1.97193,-0.60074 2.9375,-0.3418 l 0.78125,-0.78125 c -0.39259,-0.15343 -0.79712,-0.26978 -1.21289,-0.32031 -0.25134,-0.0305 -0.50415,-0.043 -0.75782,-0.0352 z" transform="translate(144,-395.99979)" id="path23656-7"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 516.9043,245.95312 c -0.46386,0.0137 -0.92726,0.13304 -1.35352,0.36329 -1.13669,0.61389 -1.76406,1.8841 -1.5625,3.16015 a 0.50027778,0.50027778 0 1 0 0.98828,-0.15625 c -0.12712,-0.80485 0.23423,-1.59506 0.90821,-2.0332 l 1.32031,-1.32031 c -0.10009,-0.007 -0.20032,-0.0166 -0.30078,-0.0137 z" transform="translate(144,-395.99979)" id="path23609-0"/>
+ <path inkscape:transform-center-x="-0.69643" inkscape:transform-center-y="1.4299999e-006" id="path23664-9" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" d="m 665.5,-151.49979 -4.50017,4.49995" sodipodi:nodetypes="cc" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" inkscape:connector-curvature="0"/>
+ <path inkscape:connector-curvature="0" inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" sodipodi:nodetypes="cc" d="m 663.5,-144.49995 -2.5,-2.5" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" id="path23666-4" inkscape:transform-center-y="-0.69642857"/>
+ <rect style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" id="rect23668-2" width="2" height="2" x="-662" y="145.99995" rx="1" ry="1" transform="scale(-1)"/>
+ </g>
+ <g transform="translate(112.05535,339.92702)" id="g44391" style="display:inline;opacity:0.7;enable-background:new">
+ <rect style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" id="rect44387" width="16" height="16" x="103" y="111"/>
+ <circle r="8" cy="118" cx="132" style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="circle44389" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" transform="matrix(-0.248353,0.02816779,0.02830718,0.248422,140.45214,86.01031)"/>
+ </g>
+ <g transform="matrix(-1,0,0,1,593.8323,-41.99999)" style="display:inline;opacity:1;enable-background:new" id="g22538">
+ <path id="path22531" style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;enable-background:new" d="m 302.99017,504.49199 7.84213,0.008 c 1.25,0 2.37916,-1.12084 0.5,-3 l -2,-2 c -1.87916,-1.87916 -0.75,-3 0.5,-3 h 3.5 m -8,5 -3,3 m 3,3 -3,-3" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccsccccc"/>
+ </g>
+ <g id="g15557" transform="translate(42)">
+ <g transform="matrix(1,0,0,-1,-42,813.00707)" id="g15497" style="display:inline;enable-background:new">
+ <ellipse style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" id="ellipse15493" cx="286.00406" cy="-344" transform="rotate(90)" rx="1.5030088" ry="1.5000001"/>
+ <ellipse ry="1.499994" rx="1.4964671" transform="rotate(90)" cy="-354" cx="296.00354" id="ellipse15495" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new"/>
+ </g>
+ <path sodipodi:nodetypes="cccccccccccccc" inkscape:connector-curvature="0" id="path15483-4" style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:new" d="m 303.49652,518.5035 1,-1 m 2,-1 h 2 m 1,11 1,-1 m 0,-2 -1,-1 m -2,-1 h -1 m 0.993,5 h -2 m -1,-6 -1,-1"/>
+ </g>
+ <g id="g15734">
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" d="m 532.5,486.5 c -0.55252,-0.47472 -1.00303,-1.22375 -1.00303,-1.99914 C 531.49997,483 533,482.25 534.5,481.5" style="opacity:0.6;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path15682"/>
+ <g id="g15738" style="opacity:0.6">
+ <path id="path15680" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 541.5,486.5 c 0.56009,-0.4489 1.00092,-1.10082 1.00151,-1.80948 10e-4,-1.51874 -1.94361,-2.76068 -4.18989,-3.98649 C 537.88162,480.46938 537.44056,480.23532 537,480" inkscape:connector-curvature="0" sodipodi:nodetypes="ccsc"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" d="m 532.55941,473.53592 c -0.49356,0.54359 -1.06031,1.04821 -1.06092,1.77356 -0.002,1.80948 2.75955,3.22603 5.50151,4.69052" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path15684"/>
+ </g>
+ <path inkscape:connector-curvature="0" d="m 533.5,475.5 h 2" style="opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path15688" sodipodi:nodetypes="cc"/>
+ <path inkscape:connector-curvature="0" d="m 536.5,484.5 h 4 m -7,0 h 2" style="opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" id="path15690"/>
+ </g>
+ <path style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 540.5,472.25 c -1.933,0 -3.5,1.567 -3.5,3.5 0,1.933 1.567,3.5 3.5,3.5 1.933,0 3.5,-1.567 3.5,-3.5 0,-1.933 -1.567,-3.5 -3.5,-3.5 z m -0.5,1 h 1 v 2 h 2 v 1 h -2 v 2 h -1 v -2 h -2 v -1 h 2 z" id="path13640-8" inkscape:connector-curvature="0" sodipodi:nodetypes="sssssccccccccccccc"/>
+ <g style="display:inline;enable-background:new" id="g15124-5" transform="translate(-558,-200)">
+ <path sodipodi:nodetypes="cccccc" inkscape:connector-curvature="0" d="m 804.50001,783.5 1,-1 m -4,4 1,-1 m -4,4 1,-1" style="display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="path15289-7"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path15294-1" d="m 795.60606,789.60606 2.78788,2.78788" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:nodetypes="cc" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 805.60606,779.60606 2.78788,2.78788" id="path15301-5" inkscape:connector-curvature="0"/>
+ </g>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" id="g15178-7" style="display:inline;opacity:1;fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new" transform="matrix(-0.53033009,-0.53033009,-0.53033009,0.53033009,580.8635,617.75914)">
+ <g id="g15176-5" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-miterlimit:4;stroke-dasharray:none">
+ <g id="g15174-3">
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path15160-1" d="m 302.28595,249 11.31371,-1.88562" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
+ <path sodipodi:nodetypes="cc" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1.33333337;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 308.88562,242.40034 307,253.71405" id="path15166-6" inkscape:connector-curvature="0"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.33333337px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" id="path15169-1" transform="matrix(-0.70710678,-0.70710678,-0.70710678,0.70710678,0,0)" sodipodi:type="arc" sodipodi:cx="-392.73941" sodipodi:cy="-42.345543" sodipodi:rx="9.0769386" sodipodi:ry="12.244143" sodipodi:start="2.3561945" sodipodi:end="3.9269908" sodipodi:open="true" d="m -399.15778,-33.687627 a 9.0769386,12.244143 0 0 1 0,-17.315832"/>
+ <path d="m 387.16684,-33.687627 a 9.0769386,12.244143 0 0 1 0,-17.315832" sodipodi:open="true" sodipodi:end="3.9269908" sodipodi:start="2.3561945" sodipodi:ry="12.244143" sodipodi:rx="9.0769386" sodipodi:cy="-42.345543" sodipodi:cx="393.58521" sodipodi:type="arc" transform="rotate(45)" id="path15171-4" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.33333337px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ </g>
+ </g>
+ <g style="display:inline;enable-background:new" id="g15242-0" transform="translate(-558,-305)">
+ <g id="g15149-2" transform="translate(21,43)">
+ <path id="path15133-4" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 796.5,853.5 h 12 m -12,0 v -12" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc"/>
+ </g>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" transform="translate(555.01703,519.07892)" id="g12701-3-4" style="display:inline;enable-background:new">
+ <path d="m 270.71159,372.21155 -0.41731,-1 m -1.58269,-1.58268 -1,-0.41732 m 3.75,6.25 v -1 m -6.03845,-5.96159 h -1" style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" id="use12498-2-5" inkscape:connector-curvature="0"/>
+ </g>
+ </g>
+ <g transform="translate(-390.0036,-305.9964)" style="display:inline;enable-background:new" id="g15818-1">
+ <path inkscape:connector-curvature="0" id="path15352-4" d="m 718.49219,868 c -0.12989,0.002 -0.25387,0.0546 -0.34571,0.14648 L 717,869.29297 718.70703,871 l 1.14649,-1.14648 c 0.19519,-0.19527 0.19519,-0.51177 0,-0.70704 l -1,-1 c -0.0957,-0.0957 -0.22603,-0.14855 -0.36133,-0.14648 z m -2.19922,2 -5.14649,5.14648 c -0.19519,0.19527 -0.19519,0.51177 0,0.70704 l 1,1 c 0.19527,0.19519 0.51177,0.19519 0.70704,0 L 718,871.70703 Z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.7;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="ccccccscccccccc"/>
+ <g transform="translate(42)" id="g15380-9" style="opacity:1">
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 680.5,871.5 v 4" id="path15368-7" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path15370-6" d="m 682.5,873.5 h -4" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path15372-2" d="m 672.5,863.5 v 4" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 674.5,865.5 h -4" id="path15374-8" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="m 680.5,864 v 3" id="path15376-8" inkscape:connector-curvature="0" sodipodi:nodetypes="cc"/>
+ <path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path15378-5" d="m 682,865.5 h -3" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/>
</g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_GROUP_VERTEX"
- transform="translate(147.01612,401.00818)">
- <rect
- transform="scale(1,-1)"
- y="-87"
- x="256.98419"
- height="16"
- width="16"
- id="rect37140"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <path
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- d="m 266.48388,77.49182 c -1,0 -2,10e-6 -3,2e-5 0,0.99999 0,1.99999 0,2.99998 1,0 2,-1e-5 3,-2e-5 0,-0.99999 0,-1.99998 0,-2.99998 z"
- id="path37142"
- inkscape:connector-curvature="0" />
- <path
- id="path37144"
- d="m 266.48388,83.49182 c -1,0 -2,10e-6 -3,10e-6 0,1 0,2 0,2.99999 1,-1e-5 2,-1e-5 3,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- d="m 261.48419,74.5 c -1,0 -2,1e-5 -3,1e-5 0,1 0,2 0,2.99999 1,-1e-5 2,-1e-5 3,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z"
- id="path37146"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- d="m 261.48419,80.5 c -1,0 -2,1e-5 -3,1e-5 0,1 0,2 0,2.99999 1,-1e-5 2,-1e-5 3,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z"
- id="path37148"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(-189.01581,-315)"
- style="opacity:0.55"
- id="g37150">
- <path
- id="path37152"
- d="m 460.50726,389.48364 c -1.00252,0 -2.00505,1e-5 -3.00757,1e-5 0,1.00272 0,2.00544 0,3.00817 1.00252,0 2.00505,-1e-5 3.00757,-1e-5 0,-1.00273 0,-2.00545 0,-3.00817 z"
- style="fill:none;stroke:#000000;stroke-width:1.00000072;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:1.00000072;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- d="m 460.51514,395.48364 c -1.00252,0 -2.00505,1e-5 -3.00757,1e-5 0,1.00272 0,2.00544 0,3.00817 1.00252,0 2.00505,-1e-5 3.00757,-1e-5 0,-1.00273 0,-2.00545 0,-3.00817 z"
- id="path37154"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:1.00000072;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- d="m 455.5,386.5 c -1.00252,0 -2.00505,10e-6 -3.00757,10e-6 0,1.00272 0,2.00544 0,3.00817 1.00252,0 2.00505,-10e-6 3.00757,-10e-6 0,-1.00273 0,-2.00545 0,-3.00817 z"
- id="path37156"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-189.01581,-315)"
- style="opacity:0.55"
- id="g37158">
- <path
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 457.99938,389.98364 c 0.6694,0 1.33879,1e-5 2.00819,1e-5 0,0.66939 0,1.33877 0,2.00817 -0.6694,0 -1.33879,-1e-5 -2.00819,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path37160"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path37162"
- d="m 458.00726,395.98364 c 0.6694,0 1.33879,1e-5 2.00819,1e-5 0,0.66939 0,1.33877 0,2.00817 -0.6694,0 -1.33879,-1e-5 -2.00819,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path37164"
- d="m 452.99212,387 c 0.6694,0 1.33879,10e-6 2.00819,10e-6 0,0.66939 0,1.33877 0,2.00817 -0.6694,0 -1.33879,-10e-6 -2.00819,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(420,44)"
- id="ICON_GROUP_UVS">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37168"
- width="16.000006"
- height="16.000002"
- x="26.016129"
- y="428" />
- <rect
- y="428"
- x="26"
- height="16"
- width="16"
- id="rect37170"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(1.0004639,0,0,0.9963165,-237.11238,367.28985)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g37172"
- style="display:inline">
- <circle
- transform="matrix(0.81218,0,0,0.815735,163.7897,-27.2907)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#724c4c;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.10749674;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path37174"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path37176"
- style="display:inline;overflow:visible;visibility:visible;fill:#f9f9f9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.16363633;marker:none;enable-background:accumulate"
- transform="matrix(0.7480284,0,0,0.7480284,172.26025,-19.267349)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="opacity:0.6;fill:url(#linearGradient37590);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path37178"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.7478104,0,0,0.7510504,172.29077,-19.598754)"
- cx="132"
- cy="118"
- r="8" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37592);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 269.98748,62.965763 c -1.39411,0.455357 -2.67784,0.634788 -4.24803,3.011091 h 2.24896 z m 0.99954,0 v 3.011091 h 2.99861 l -1.99908,-3.011091 z m 2.99861,3.011091 0.99953,3.011091 h 1.99907 c 0.006,-0.929403 -0.1914,-1.917894 -0.74965,-3.011091 z m 0.99953,3.011091 h -3.99814 v 3.011092 h 2.49884 z m -3.99814,3.011092 h -2.99861 l 1.99907,3.011091 h 0.99954 z m -2.99861,0 -0.99954,-3.011092 h -1.99907 c -0.006,0.929404 0.1914,1.917895 0.74965,3.011092 z m -0.99954,-3.011092 h 3.99815 v -3.011091 h -2.49884 z m 7.24312,3.011092 -1.85125,3.011091 c 1.3675,-0.485137 2.19971,-0.728674 3.85384,-3.011091 z"
- id="path37180"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- id="path37182"
- d="m 274.00069,72.011668 0.005,0.97479 -0.99045,0.01431 -0.0223,1.019377 -0.481,0.837285 c 0.77072,-0.321774 2.72643,-1.067855 3.69499,-2.816464 l -2.20604,-0.0293 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <circle
- transform="matrix(0.749782,0,0,0.752489,172.03052,-19.77379)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path37185"
- style="opacity:0.4;fill:url(#linearGradient37594);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.7010701,0,0,0.7040938,178.4346,-14.083074)"
- style="display:inline;fill:none;stroke:url(#linearGradient37596);stroke-width:1.14049816;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path37187"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#aaccff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 268.98793,64.973163 v 0.407752 h -0.93706 v 0.595945 h -0.56224 v 1.003697 h -0.49977 v 1.505546 h 0.99953 v -1.505546 h 0.4373 v -0.595945 h 0.56224 V 65.97686 h 1.53054 v -1.003697 z"
- id="path37189"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(-499.98389,503.95862)"
- style="display:inline;enable-background:new"
- id="ICON_BRUSH_DATA">
- <path
- sodipodi:nodetypes="ccccc"
- id="path37231"
- d="m 506.48389,-17.45862 v -1 c 4.75,-1 2.25,-4.5 6.31852,-4.187139 0.70341,0.496889 0.93148,1.187139 0.93148,2.122782 0,3.064357 -2.5,3.314357 -7.25,3.064357 z"
- style="fill:#9d6c53;fill-opacity:1;fill-rule:evenodd;stroke:#241f1c;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#radialGradient37608);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- d="m 505.98389,-17.522977 c 5.75,-0.75 2.71305,-4.172284 6.75,-5.25 0.70341,0.496889 1.61991,1.711436 1.75268,2.186272 0,3.572675 -4.12319,3.136436 -8.50268,3.063728 z"
- id="path37233"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path37235"
- d="m 515.48389,-25.95862 -2.75,3.25 1.75,2.25 3,-3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient37610);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 514.98389,-24.95862 -2.25,2.5 1.37109,1.875 2.37891,-2.375 z"
- id="path37237"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b0000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 520.48389,-31.45862 -6,6.75 2,2.25 4,-4"
- id="path37239"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path37241"
- d="m 520.98389,-31.95862 -6.75,7.75 1.75,1.75 5,-4.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37612);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.23326063;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 513.48389,-22.45862 7,-8.25"
- id="path37243"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.4;fill:none;stroke:url(#linearGradient37614);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 511.98389,-21.772977 -1.25,1.25 c -0.96702,0.819679 -0.76749,2.123051 -3.25,2.314357"
- id="path37245"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_GROUP_BONE"
- transform="translate(-42,86)">
- <g
- id="g37309"
- transform="translate(209)">
- <rect
- rx="0.015625"
- y="393"
- x="222"
- height="9"
- width="9"
- id="rect37311"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#736c54;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- ry="0.015625" />
- <g
- id="g37313"
- transform="matrix(0.4224039,0.424791,0.4224039,-0.424791,74.64489,479.288)"
- style="display:inline">
- <path
- style="fill:url(#linearGradient37636);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.33543694;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 85.554034,278.09107 c 1.182038,0.59351 1.745531,1.60418 1.940766,2.40894 l 0.0052,0.2482 c 0,0.75 -0.75,1.75 -1.5,1.75 -0.75,0 -1.16648,-0.20985 -1.91648,-1.20806 -0.5,0 -0.676716,3.3e-4 -1.176716,3.3e-4 -0.75,0.99821 -1.156804,1.20773 -1.906804,1.20773 -0.75,0 -1.5,-1 -1.5,-1.75 l -0.0052,-0.2482 c 0.217441,-0.78256 0.749208,-1.83372 1.92792,-2.42058 l 0.07208,-4.57942 c -0.335564,-0.0958 -0.633693,-0.23081 -0.890995,-0.39497 -0.637372,-0.40663 -1.024226,-0.99226 -1.109005,-1.60503 l 0.0052,-0.2518 c 0,-0.75 0.68844,-1.71861 1.5,-1.75 0.71584,-0.0277 1.25,0 2,1.00179 h 1 c 0.749447,-1.00234 1.174653,-1.09387 2,-1.00179 0.745329,0.0832 1.5,1 1.5,1.75 l -0.0052,0.2518 c -0.122391,0.38782 -0.722942,1.77706 -2,2 l 0.05923,4.59106 z"
- id="path37315"
- sodipodi:nodetypes="ccczcczccccsscsccscscc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path37317"
- d="m 82.886207,273.9157 -0.02165,3.97041"
- style="fill:none;stroke:#ffffff;stroke-width:1.66929841px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path37319"
- d="M 82.4948,279.50001 C 80,278.75 79.891731,281.54098 81.141731,281.29098"
- style="fill:none;stroke:#ffffff;stroke-width:0.83464772;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:0.83464754;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 82.320782,273.05364 c -2.405243,-1.28815 -1.663086,-3.01898 -0.56905,-2.28347"
- id="path37321"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(315)"
- id="g37323"
- style="display:inline;enable-background:new">
- <rect
- ry="0.019097222"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#736c54;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect37325"
- width="11"
- height="11"
- x="110"
- y="386"
- rx="0.019097222" />
- <g
- id="g37327">
- <path
- id="path37329"
- d="m 116.53125,386.5 c -0.56312,0 -1.03125,0.46811 -1.03125,1.03125 v 0.9375 c 0,0.28156 0.12508,0.53133 0.3125,0.71875 L 113,392 c -0.18742,-0.18742 -0.46844,-0.5 -0.75,-0.5 h -0.75 c -0.56312,0 -1.03125,0.46811 -1.03125,1.03125 v 0.9375 c 0,0.56312 0.46813,1.03125 1.03125,1.03125 h 0.9375 c 0.0103,0 0.021,3e-4 0.0312,0 -3e-4,0.0102 0,0.021 0,0.0312 v 0.9375 c 0,0.56312 0.46813,1.03126 1.03125,1.03125 h 0.96875 c 0.56312,0 1,-0.46813 1,-1.03125 v -0.9375 c 0,-0.28156 -0.10164,-0.53133 -0.28125,-0.71875 l 2.625,-2.625 c 0.18742,0.18742 0.43719,0.3125 0.71875,0.3125 h 0.96875 c 0.56312,0 1,-0.46813 1,-1.03125 v -0.9375 c 0,-0.56312 -0.43688,-1.03125 -1,-1.03125 h -0.96875 c -0.0103,0 -0.021,-3e-4 -0.0312,0 3e-4,-0.0102 0,-0.021 0,-0.0312 v -0.9375 c 0,-0.56312 -0.46813,-1.03125 -1.03125,-1.03125 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37638);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccccccccccsccccccccccccccscccc"
- inkscape:connector-curvature="0" />
- <path
- id="path37331"
- d="m 111.5,393.5 v -0.75 l 0.25,-0.25 h 1.75 l 3,-3 v -1.75 l 0.25,-0.25 h 0.75"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 118.75,389.5 h 0.75 m -6,6 v -0.75"
- id="path37333"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect37335"
- width="1"
- height="1"
- x="114"
- y="393" />
- <rect
- y="390"
- x="117"
- height="1"
- width="1"
- id="rect37337"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_GROUP_VCOL"
- transform="translate(-84,65)">
- <rect
- transform="scale(-1)"
- y="-423"
- x="-525"
- height="16"
- width="16"
- id="rect37341"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- id="g37343"
- transform="translate(205.00003,252.00003)"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 2\not used yet.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <g
- transform="matrix(0.767131,0,0,0.788662,393.6565,37.08664)"
- style="fill:#000000;fill-opacity:1"
- id="g37345"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <g
- transform="matrix(0.693332,0,0,0.663699,390.0934,62.34418)"
- id="g37347"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <g
- id="g37350"
- style="opacity:0.3" />
- <path
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 304.99997,158.99997 c 0.66669,0 1.33337,1e-5 2.00006,1e-5 0,0.66668 0,1.33337 0,2.00005 -0.66669,0 -1.33337,-1e-5 -2.00006,-1e-5 0,-0.66668 0,-1.33337 0,-2.00005 z"
- id="path37352"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <g
- id="g37354"
- style="fill:none"
- transform="translate(141,63)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <path
- style="fill:none;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- d="m 163.5,95.5 c 1,5e-6 2,1.1e-5 3,1.6e-5 0,0.999995 0,1.99999 0,2.999984 -1,-5e-6 -2,-1.1e-5 -3,-1.6e-5 0,-0.999994 0,-1.999989 0,-2.999984 z"
- id="path37356"
- inkscape:connector-curvature="0" />
- <path
- id="path37358"
- d="m 163.5,101.5 c 1,1e-5 2,1e-5 3,2e-5 0,0.99999 0,1.99999 0,2.99998 -1,-1e-5 -2,-1e-5 -3,-2e-5 0,-0.99999 0,-1.99998 0,-2.99998 z"
- style="fill:none;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- d="m 168.49997,92.49997 c 1,5e-6 2,1.1e-5 3,1.6e-5 0,0.999995 0,1.999995 0,2.999985 -1,-1e-5 -2,-1e-5 -3,-2e-5 0,-0.99999 0,-1.999986 0,-2.999981 z"
- id="path37360"
- inkscape:connector-curvature="0" />
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path37362"
- d="m 304.99997,164.99997 c 0.66669,0 1.33337,1e-5 2.00006,1e-5 0,0.66668 0,1.33337 0,2.00005 -0.66669,0 -1.33337,-1e-5 -2.00006,-1e-5 0,-0.66668 0,-1.33337 0,-2.00005 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 309.99994,155.99994 c 0.66669,0 1.33337,1e-5 2.00006,1e-5 0,0.66668 0,1.33337 0,2.00005 -0.66669,0 -1.33337,-1e-5 -2.00006,-1e-5 0,-0.66668 0,-1.33337 0,-2.00005 z"
- id="path37364"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g37366"
- transform="matrix(0.7614057,0,0,0.7675903,253.76942,219.40377)">
- <g
- transform="matrix(1.1658027,0,0,1.1657997,198.71028,-2.0560643)"
- id="g37368">
- <path
- transform="matrix(0.6969448,0,0,0.6969467,36.918512,140.83126)"
- sodipodi:type="arc"
- style="fill:#ff5a19;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path37370"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="-2.8145849"
- inkscape:transform-center-y="-3.2499984" />
- <path
- inkscape:transform-center-y="1.6729808e-05"
- inkscape:transform-center-x="-3.2630798"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path37372"
- style="fill:#ad2f94;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(0.3484724,0.6035735,-0.603572,0.3484734,154.13836,102.27942)" />
- <path
- transform="matrix(-0.3484724,0.6035735,-0.603572,-0.3484733,246.13507,184.51913)"
- sodipodi:type="arc"
- style="fill:#0060f0;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path37374"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="-2.8145756"
- inkscape:transform-center-y="3.2500173" />
- <path
- inkscape:transform-center-y="3.249994"
- inkscape:transform-center-x="2.8145978"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path37376"
- style="fill:#00d4aa;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(-0.6969448,2.2484149e-8,-4.6257528e-8,-0.6969467,220.91956,305.31067)" />
- <path
- transform="matrix(-0.3484724,-0.6035734,0.603572,-0.3484734,103.69972,343.86251)"
- sodipodi:type="arc"
- style="fill:#ccff00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path37378"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="3.2630773" />
- <path
- inkscape:transform-center-x="2.8145777"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path37380"
- style="fill:#ffbf0e;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(0.3484724,-0.6035734,0.603572,0.3484733,11.703006,261.6228)"
- inkscape:transform-center-y="-3.2500006" />
- </g>
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path37382"
- style="fill:none;stroke:#000000;stroke-width:1.29430985;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.8124999,0,0,0.8045157,241.75,163.13011)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.6594197,0,0,0.6608114,261.96791,180.02435)"
- style="fill:none;stroke:url(#linearGradient37640);stroke-width:1.98156261;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path37384"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- id="ICON_ARROW_LEFTRIGHT"
- transform="translate(0,2)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect37759"
- width="16"
- height="16"
- x="173"
- y="617" />
- <g
- style="display:inline"
- id="g37761"
- transform="translate(-290,397)">
- <g
- id="g37779">
- <g
- id="g37781"
- style="opacity:0.85"
- transform="translate(20.029029)">
- <path
- sodipodi:nodetypes="cccccc"
- id="path37783"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:12.66808033;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 447.72097,225.25 -3.25,3.25 3.25,3.25 m 6.5,-6.5 3.25,3.25 -3.25,3.25"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:12.66808033;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 444.54256,228.5 h 11.66489 v 0"
- id="path37785"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g37787"
- transform="translate(20.029029)">
- <path
- id="path37789"
- d="m 444.47097,228.5 h 13"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- d="m 447.72097,225.25 -3.25,3.25 3.25,3.25 m 6.5,-6.5 3.25,3.25 -3.25,3.25"
- style="fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path37791"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- </g>
- <g
- transform="translate(-58,340)"
- id="ICON_MESH_PLANE"
- style="display:inline;enable-background:new">
- <rect
- y="48"
- x="63"
- height="16"
- width="16"
- id="rect41153"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(1.0003553,0,0,0.9995949,18.983834,-41.953346)"
- style="display:inline"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g41155">
- <rect
- y="91.491928"
- x="45.5"
- height="13.003749"
- width="12.995382"
- id="rect41157"
- style="fill:url(#linearGradient42322);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80001998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- sodipodi:nodetypes="ccc"
- id="path41159"
- d="M 46.49945,103.49527 V 92.492523 h 10.996287 v 11.002747 z"
- style="fill:none;stroke:url(#linearGradient42324);stroke-width:1.0000248px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(-15,340)"
- id="ICON_MESH_UVSPHERE"
- style="display:inline;enable-background:new">
- <rect
- y="48"
- x="83"
- height="16"
- width="16"
- id="rect41163"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(1.1658027,0,0,1.1657997,-59.289717,-204.05607)"
- id="g41165"
- style="display:inline">
- <circle
- transform="matrix(0.6969446,0,0,0.6900977,36.918531,141.69345)"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.23686147;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path41167"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.6391427,-0.07194179,0.07284933,-0.6344823,204.68584,307.47408)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path41169"
- style="display:inline;opacity:0.8;fill:url(#linearGradient42326);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <path
- id="path41171"
- style="display:inline;fill:none;stroke:url(#linearGradient42328);stroke-width:0.51466751;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- d="m 134.27086,222.67786 c -0.8523,1.03645 -2.40069,1.91195 -5.35869,1.91195 -2.92931,0 -4.50028,-0.8755 -5.35806,-1.88283 m 5.3611,5.72324 c -1.3021,0 -2.35888,-2.40136 -2.35888,-5.36019 0,-2.95882 1.05678,-5.36019 2.35888,-5.36019 1.30211,0 2.35889,2.40137 2.35889,5.36019 0,2.9364 -1.03866,5.32486 -2.33081,5.35981"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path41173"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient42330);stroke-width:1.45605874;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.5885088,0,0,0.5897133,51.241774,153.48488)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MESH_CUBE"
- transform="translate(-21,359)">
- <rect
- y="29"
- x="47"
- height="16"
- width="16"
- id="rect41177"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g41179"
- transform="translate(116,-325)">
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -55,358.25 -6,-2.25 -6,2.25 v 7.5 l 6,3.25 6,-3.25 z"
- id="path41181"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient42332);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89207077px;marker:none;enable-background:accumulate"
- d="m -55,365.75 v -7.5 l -6,-2.25 8.34e-4,13.04035 z"
- id="path41183"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path41185"
- d="m -67,365.75 v -7.5 l 6,-2.25 8.34e-4,13.04035 z"
- style="fill:#c9c9c9;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m -67,358.25 6,-2.25 6,2.25 -6,2.75 z"
- id="path41187"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- id="path41189"
- d="M -66.499841,365.52276 -66.5,358.5 l 5.5,-2 5.5,2 v 7 l -5.5,3 z"
- style="fill:none;stroke:url(#linearGradient42334);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(3,417)"
- id="ICON_MESH_MONKEY">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- id="rect41193"
- width="16"
- height="16"
- x="128"
- y="-29" />
- <g
- id="g41195">
- <path
- id="path41197"
- style="fill:#999999;fill-rule:evenodd;stroke:#000000;stroke-width:0.55000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 140,-21 c 1.125,1 3.5,0.25 3.5,-1 0,-1.5 0.47443,-1.637992 -2,-1.5 -0.1033,1.43128 -0.66697,1.819388 -1.5,2.5 z"
- sodipodi:nodetypes="cscc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cscc"
- d="m 132,-21 c -1.125,1 -3.5,0.25 -3.5,-1 0,-1.5 -0.47443,-1.637992 2,-1.5 0.1033,1.43128 0.66697,1.819388 1.5,2.5 z"
- style="fill:#e6e6e6;fill-rule:evenodd;stroke:#000000;stroke-width:0.55000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path41199"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccccsccccccc"
- d="m 135.75,-25.5 -1.25,-2 h -0.75 l -3.25,2.75 v 1.25 c 0.15379,2.182132 1.3678,1.901463 3,4 v 4.5 c 0,1.5 1.5,1.5 2.5,1.5 1,0 2.5,0 2.5,-1.5 v -4.5 c 1.62605,-2.090636 2.83897,-1.844587 3,-4 v -1.25 l -3.25,-2.75 h -0.75 l -1.25,2"
- style="display:inline;fill:url(#linearGradient42336);fill-rule:evenodd;stroke:none;enable-background:new"
- id="path41201"
- inkscape:connector-curvature="0" />
- <rect
- y="-16"
- x="135"
- height="1"
- width="2"
- id="rect41203"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate" />
- <rect
- ry="1"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient42338);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- id="rect41205"
- width="2.75"
- height="2"
- x="135"
- y="-21"
- rx="1" />
- <rect
- y="-21"
- x="135"
- height="1"
- width="2"
- id="rect41207"
- style="display:inline;overflow:visible;visibility:visible;fill:#f9f9f9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate" />
- <circle
- transform="translate(0.5,-0.46875)"
- id="path41209"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- cx="133"
- cy="-23"
- r="1" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42340);stroke-width:0.93034029;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path41211"
- transform="matrix(1.2143583,0,0,1.1512108,-28.054112,2.9290602)"
- cx="133"
- cy="-23"
- r="1" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="path41213"
- transform="matrix(0.8392157,0,0,0.8382979,21.884318,-4.2140957)"
- cx="133"
- cy="-23"
- r="1" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- id="rect41215"
- width="2"
- height="1"
- x="135"
- y="-15" />
- <path
- id="path41217"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 131.88556,-21.103144 c 0.4583,0.371362 1.00745,1.072735 1.61444,1.853144 v 3.75 c 0,1.5 1.5,2 2.5,2 1,0 2.5,-0.5 2.5,-2 v -3.75 c 0.64842,-0.833678 1.23114,-1.545786 1.70766,-1.936772 M 130.5,-23.5 v -1.25 l 3,-2.75 h 1 l 1.25,1.75 h 0.5 l 1.25,-1.75 h 1 l 3,2.75 v 1.25"
- sodipodi:nodetypes="ccccccccccccccccs"
- inkscape:connector-curvature="0" />
- <circle
- transform="matrix(1.2116904,0,0,1.1282344,-22.693138,2.3776257)"
- id="path41219"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42342);stroke-width:0.94079971;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="133"
- cy="-23"
- r="1" />
- <circle
- transform="matrix(0.8392157,0,0,0.8382979,26.893134,-4.2140957)"
- id="path41221"
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- cx="133"
- cy="-23"
- r="1" />
- <path
- sodipodi:nodetypes="cc"
- id="path41223"
- d="M 136.75,-24.75 138,-26.5"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 129.25,-22.25 0.5,-0.5"
- id="path41225"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path41227"
- d="m 142.75,-22.5 -0.25,-0.25"
- style="opacity:0.35;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MESH_ICOSPHERE"
- transform="translate(169,365)">
- <rect
- y="23"
- x="-80"
- height="16"
- width="16"
- id="rect41231"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path41233"
- d="m -72,23.5 -1.5,4 h 8 v -0.25 z"
- style="fill:#ececec;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- id="path41235"
- d="m -73.5,27.5 3,7 5,-7 z"
- style="fill:#c3c3c3;fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- id="path41237"
- d="m -65.5,27.5 -5,7 h 5 z"
- style="fill:#666666;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- id="path41239"
- d="m -70.5,34.5 -1.5,4 6.5,-3.75 V 34.5 h -5"
- style="display:inline;overflow:visible;visibility:visible;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41241"
- d="m -78.5,34.5 v 0.25 l 6.5,3.75 1.5,-4 z"
- style="fill:#b3b3b3;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- id="path41243"
- d="m -78.5,27.5 v -0.25 l 6.5,-3.75 -1.5,4 z"
- style="fill:#ffffff;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- id="path41245"
- d="m -73.5,27.5 h -5 v 7 z"
- style="fill:#ffffff;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- id="path41247"
- d="m -78.5,34.5 h 8 l -3,-7 z"
- style="fill:#f2f2f2;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:type="star"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.76889962;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path41249"
- sodipodi:sides="6"
- sodipodi:cx="-72"
- sodipodi:cy="31"
- sodipodi:r1="7.2111025"
- sodipodi:r2="6.244998"
- sodipodi:arg1="0.52359878"
- sodipodi:arg2="1.0471976"
- inkscape:flatsided="true"
- inkscape:rounded="0"
- inkscape:randomized="0"
- d="M -65.755002,34.605551 -72,38.211102 l -6.244998,-3.605551 0,-7.211102 L -72,23.788898 l 6.244998,3.605551 z"
- transform="matrix(1.040833,0,0,1.0400629,2.9399768,-1.241949)" />
- <path
- sodipodi:nodetypes="cccccccccccc"
- id="path41251"
- style="fill:none;stroke:url(#linearGradient42344);stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -78.5,27.5 h 13 m -7,-3 -1,3 m -5,7 h 12.75 m -12.75,0 5,-6.75 3,6.75 5,-7 m -5,7 -1,3"
- inkscape:connector-curvature="0" />
- <path
- transform="matrix(0.8807051,0,0,0.9013876,-8.5892309,3.0569843)"
- d="M -65.755002,34.605551 -72,38.211102 l -6.244998,-3.605551 0,-7.211102 L -72,23.788898 l 6.244998,3.605551 z"
- inkscape:randomized="0"
- inkscape:rounded="0"
- inkscape:flatsided="true"
- sodipodi:arg2="1.0471976"
- sodipodi:arg1="0.52359878"
- sodipodi:r2="6.244998"
- sodipodi:r1="7.2111025"
- sodipodi:cy="31"
- sodipodi:cx="-72"
- sodipodi:sides="6"
- id="path41253"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:none;stroke:url(#linearGradient42346);stroke-width:1.12235165;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:type="star" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MESH_GRID"
- transform="translate(231,348)">
- <rect
- y="40"
- x="-121"
- height="16"
- width="16"
- id="rect41257"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(1.0003553,0,0,0.9995949,-165.01617,-49.953346)"
- style="display:inline"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g41259">
- <rect
- y="92.490814"
- x="46.499645"
- height="12.004883"
- width="11.995742"
- id="rect41261"
- style="fill:url(#linearGradient42348);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80001998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path41263"
- d="m 47.49929,95.49203 v -2.000811 l 1.999291,3e-6 v 2.000811 z"
- style="fill:none;stroke:url(#linearGradient42350);stroke-width:1.00002491px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:url(#linearGradient42352);stroke-width:1.00002491px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 47.49929,99.493651 v -1.999102 l 1.999291,-4e-6 v 1.999102 z"
- id="path41265"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path41267"
- d="m 47.49929,103.49527 v -1.9991 h 1.999291 v 1.9991 z"
- style="fill:none;stroke:url(#linearGradient42354);stroke-width:1.00002491px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:url(#linearGradient42356);stroke-width:1.00002491px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 51.497871,103.49527 v -1.9991 h 1.99929 v 1.9991 z"
- id="path41269"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path41271"
- d="m 51.497869,99.49194 v -1.9991 h 1.99929 v 1.9991 z"
- style="fill:none;stroke:url(#linearGradient42358);stroke-width:1.00002491px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:url(#linearGradient42360);stroke-width:1.00002491px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 51.497868,95.49203 1e-6,-2.000811 h 1.99929 l -1e-6,2.000811 z"
- id="path41273"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path41275"
- d="m 55.496451,103.49527 v -1.9991 h 1.99929 v 1.9991 z"
- style="fill:none;stroke:url(#linearGradient42362);stroke-width:1.00002491px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:url(#linearGradient42364);stroke-width:1.00002491px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 55.496449,99.49194 v -1.9991 h 1.99929 v 1.9991 z"
- id="path41277"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path41279"
- d="m 55.496448,95.49203 v -2.000811 h 1.99929 v 2.000811 z"
- style="fill:none;stroke:url(#linearGradient42366);stroke-width:1.00002491px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path41281"
- style="fill:none;stroke:url(#linearGradient42368);stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -110.5,43 v 11 m -4,-11 v 11 m 7.5,-3.5 h -11 m 11,-4 h -11"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MESH_CIRCLE"
- transform="translate(275,332)">
- <rect
- y="56"
- x="-228"
- height="16"
- width="16"
- id="rect41285"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path41287"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.23034608;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.8124999,0,0,0.813059,-327.25,-31.946343)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.8;fill:url(#linearGradient42370);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path41289"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.7451143,0.08386971,-0.08492794,0.7396793,-308.33359,-34.308811)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.6860851,0,0,0.6874876,-310.55192,-17.123443)"
- style="fill:none;stroke:url(#linearGradient42372);stroke-width:1.45605874;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path41291"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path41293"
- style="fill:none;stroke:url(#linearGradient42374);stroke-width:1.78040731;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.5610858,0,0,0.5622541,-294.05201,-2.3458915)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MESH_CYLINDER"
- transform="translate(380,233)">
- <rect
- y="155"
- x="-228"
- height="16"
- width="16"
- id="rect41297"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccsccc"
- id="path41299"
- d="m -220,156.5 c -3.036,0 -5.49999,1.12 -5.49999,2.5 l -1e-5,9 c 0,1.38 2.46399,2.5 5.49999,2.5 3.036,0 5.5,-1.12 5.5,-2.5 l 1e-5,-9 c 0,-1.38 -2.464,-2.5 -5.5,-2.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient42376);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient42378);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient42380);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -215.49145,159.5 c 0,1 -1.5,2 -4.50855,2 -3.00854,0 -4.49145,-1 -4.49145,-2 0,-1.5 2.25,-2.25 4.5,-2.25 2.25,0 4.5,0.75 4.5,2.25 z"
- id="path41301"
- sodipodi:nodetypes="czszs"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="czs"
- id="path41303"
- d="m -214.99565,159.99149 c 0,1.12926 -1.66739,2.25851 -5.01168,2.25851 -3.34426,0 -4.99267,-1.12925 -4.99267,-2.25851"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:url(#linearGradient42382);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -220,156.5 c -3.49999,0 -5.49999,1.12 -5.49999,2.5 l -1e-5,8.5 c 0,2 2.46399,3 5.49999,3 3.036,0 5.50001,-1 5.50001,-3 V 159 c 0,-1.38 -1.99999,-2.5 -5.5,-2.5 z"
- id="path41305"
- sodipodi:nodetypes="cccsccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42384);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -224.5,160.5 v 6.5 c 0,0.9838 0.64285,2.5 4.5,2.5 3.85714,0 4.5,-1.5162 4.5,-2.5 v -6.5"
- id="path41307"
- sodipodi:nodetypes="ccscc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MESH_TORUS"
- transform="translate(401,212)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect41311"
- width="16"
- height="16"
- x="-228"
- y="176" />
- <path
- sodipodi:nodetypes="cssscccscc"
- id="path41313"
- d="m -220,178.5 c -4.14,0 -7.40235,2.464 -7.40234,5.5 0,3.036 3.26234,5.5 7.40234,5.5 4.14,0 7.40234,-2.464 7.40234,-5.5 0,-3.036 -3.26233,-5.50001 -7.40234,-5.5 z m 0,4 c 1.2993,0 2.42742,0.39879 3.03125,1 -0.60383,0.60121 -1.73196,1 -3.03125,1 -1.29929,0 -2.42742,-0.39879 -3.03125,-1 0.60383,-0.60121 1.73196,-1 3.03125,-1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient42386);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccsscc"
- id="path41315"
- d="m -214.625,180.4375 c 1.5822,4.85564 -3.15377,7.27675 -11.84375,6.21875 v 0.0312 c 1.25689,1.67541 3.66207,2.8125 6.46875,2.8125 4.14,0 7.40625,-2.464 7.40625,-5.5 0,-1.34213 -0.64966,-2.57614 -1.71875,-3.53125 -0.10326,-0.0119 -0.20204,-0.024 -0.3125,-0.0312 z"
- style="opacity:0.6;fill:url(#radialGradient42388);fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- d="m -223.375,183.45313 c 1.90631,-1.46639 4.08905,-1.44306 6.1875,-0.53125 L -217,182.76563 c -0.60315,-4.39553 -10.23988,-3.57787 -6.375,0.6875 z"
- id="path41317"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccsccc"
- id="path41319"
- d="m -223.375,183.65625 0.5,-0.0312 c -0.0509,-0.0426 -0.11109,-0.08 -0.15625,-0.125 0.60383,-0.60121 1.73196,-1 3.03125,-1 0.99575,0 1.89552,0.24495 2.53125,0.625 L -217,182.96875 c -0.60315,-4.39553 -10.23988,-3.57787 -6.375,0.6875 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:url(#radialGradient42390);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42392);stroke-width:0.5962854;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path41321"
- transform="matrix(0.9999986,0,0,1.799999,-2.971883e-4,111.10004)"
- cx="-220"
- cy="40.5"
- rx="6.5"
- ry="2.5" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MESH_CONE"
- transform="translate(422,192)">
- <rect
- y="196"
- x="-228"
- height="16"
- width="16"
- id="rect41325"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccssscc"
- id="path41327"
- d="m -220,196.70312 -6.24219,10.18714 c -0.17094,0.32797 -0.25781,0.44407 -0.25781,0.85974 0,2.25 2.96003,3.75 6.5,3.75 3.53998,0 6.5,-1.5 6.5,-3.75 0,-0.41567 -0.0869,-0.53177 -0.2578,-0.85974 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient42394);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42396);stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -220,198.75 -5.29067,8.34531 c -0.1388,0.26737 -0.20933,0.56583 -0.20933,0.90469 0,1.3338 2.63213,2.56728 5.50644,2.56728 2.87432,0 5.49356,-1.23348 5.49356,-2.56728 0,-0.33886 -0.0706,-0.63732 -0.20932,-0.90469 z"
- id="path41329"
- sodipodi:nodetypes="ccssscc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.05;fill:none;stroke:#1a1a1a;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -226.5,208 c 0,-1.63609 2.96003,-3.5 6.5,-3.5 3.53998,0 6.5,1.75 6.5,3.5"
- id="path41331"
- sodipodi:nodetypes="css"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_CURVE_BEZCURVE"
- transform="translate(472,230)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect41335"
- width="16"
- height="16"
- x="-278"
- y="137" />
- <g
- transform="translate(-22)"
- id="g41337">
- <path
- style="display:inline;fill:#aaccff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;enable-background:new"
- d="m -243.5,137.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99999 0,2.99998 -1.00003,0 -2.00005,-1e-5 -3.00008,-1e-5 0,-1 0,-1.99999 0,-2.99999 z"
- id="path41339"
- inkscape:connector-curvature="0" />
- <path
- id="path41341"
- d="m -255.5,137.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99998 0,2.99998 -1.00003,-1e-5 -2.00005,-1e-5 -3.00008,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z"
- style="display:inline;fill:#aaccff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <g
- id="g41343"
- style="opacity:0.7">
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:0.75;fill-rule:evenodd;stroke:#003380;stroke-width:2.79999995;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -252.25,139.5 h 8.5"
- id="path41345"
- inkscape:connector-curvature="0" />
- <path
- id="path41347"
- d="m -252,139.5 h 8"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:1;fill-rule:evenodd;stroke:#aaccff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -254.5,139.5 v -1 h 1"
- id="path41349"
- inkscape:connector-curvature="0" />
- <path
- id="path41351"
- d="m -242.5,139.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g41353"
- transform="translate(-327,-164)">
- <rect
- rx="1.4999387"
- ry="1.4999387"
- y="312.5"
- x="52.5"
- height="3"
- width="2.9998772"
- id="rect41355"
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.0999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 54,314.25 c 3.75,1.75 8.5,2.36379 8.5,-2 0,-3 -3.5,-6.25 -5.5,-8.25"
- id="path41357"
- sodipodi:nodetypes="csc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#cccccc;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 54,314.25 c 3.5,1.75 8.5,2.36741 8.5,-2 0,-3 -3.5,-6.25 -5.5,-8.25"
- id="path41359"
- sodipodi:nodetypes="csc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect41361"
- width="2.9998772"
- height="3"
- x="55.500122"
- y="302.5"
- ry="1.4999387"
- rx="1.4999387" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="csc"
- id="path41363"
- d="m 54,314.25 c 3.5,1.75 8.5,2.33285 8.5,-2 0,-3 -3.5,-6.25 -5.5,-8.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42398);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path41365"
- d="m 55,313 c -0.67541,0 -1.35081,10e-6 -2.02623,10e-6 0,0.66666 0,1.33332 0,1.99999 0.67542,0 1.35082,-10e-6 2.02623,-10e-6 0,-0.66666 0,-1.33333 0,-1.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m 58,303 c -0.666663,0 -1.333327,10e-6 -2,10e-6 0,0.66667 0,1.33332 0,1.99999 0.666673,0 1.333337,-10e-6 2,-10e-6 0,-0.66666 0,-1.33332 0,-1.99999 z"
- id="path41367"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.8;fill:#ececec;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 56.499999,304.5 v -1 h 1"
- id="path41369"
- inkscape:connector-curvature="0" />
- <path
- id="path41371"
- d="m 53.5,314.5 v -1 h 1"
- style="display:inline;opacity:0.8;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path41373"
- d="m 56,315.66293 c -0.32001,0 -0.64002,-1e-5 -0.96003,-1e-5 0,-0.55431 0,-1.1086 0,-1.66292 0.32001,0 0.64002,10e-6 0.96003,10e-6 0,0.55431 0,1.10861 0,1.66292 z"
- style="display:inline;opacity:0.15;fill:#4b4b4b;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path41375"
- d="m 59,306 c -0.333333,0 -0.666667,-10e-6 -1,-10e-6 0,-0.66666 0,-1.33331 0,-1.99999 0.333333,0 0.666667,10e-6 1,10e-6 0,0.66667 0,1.33333 0,1.99999 z"
- style="display:inline;opacity:0.15;fill:#4b4b4b;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.15;fill:#1d1d1d;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 56,316 c -0.32001,0 -0.64002,0 -0.96003,0 0,-0.21055 0,-0.42107 0,-0.63162 0.32001,0 0.64002,0 0.96003,0 0,0.21055 0,0.42107 0,0.63162 z"
- id="path41377"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-21.421813,3.140625)"
- id="g41379"
- style="display:inline;enable-background:new" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_CURVE_NCURVE"
- transform="matrix(0,1,1,0,99,651)">
- <rect
- y="137"
- x="-284"
- height="16"
- width="16"
- id="rect41383"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#ff0000;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate" />
- <rect
- rx="1.4999387"
- ry="1.4999353"
- y="149.5"
- x="-271.5"
- height="2.9999931"
- width="2.9998772"
- id="rect41385"
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <g
- id="g41387">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- d="m -271.50008,137.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99999 0,2.99998 -1.00003,0 -2.00005,-1e-5 -3.00008,-1e-5 0,-1 0,-1.99999 0,-2.99999 z"
- id="path41389"
- inkscape:connector-curvature="0" />
- <path
- id="path41391"
- d="m -283.50008,137.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99998 0,2.99998 -1.00003,-1e-5 -2.00005,-1e-5 -3.00008,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -282.50008,139.5 v -1 h 1"
- id="path41393"
- inkscape:connector-curvature="0" />
- <path
- id="path41395"
- d="m -270.50008,139.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <g
- id="g41397"
- style="opacity:0.7">
- <path
- id="path41399"
- d="m -270.5,140.74992 v 8.5"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:0.75;fill-rule:evenodd;stroke:#003380;stroke-width:2.79999995;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:0.75;fill-rule:evenodd;stroke:#003380;stroke-width:2.79999995;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -280.25008,139.5 h 8.5"
- id="path41401"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:0.75;fill-rule:evenodd;stroke:#003380;stroke-width:2.79999995;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -281.49999,140.75 v 8.5"
- id="path41403"
- inkscape:connector-curvature="0" />
- <path
- id="path41405"
- d="m -280.00008,139.5 h 8"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:1;fill-rule:evenodd;stroke:#aaccff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:1;fill-rule:evenodd;stroke:#aaccff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -270.5,140.99992 v 8"
- id="path41407"
- inkscape:connector-curvature="0" />
- <path
- id="path41409"
- d="m -281.49999,141 v 8"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:1;fill-rule:evenodd;stroke:#aaccff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect41411"
- width="2.9998772"
- height="2.999995"
- x="-283.5"
- y="149.5"
- ry="1.4999362"
- rx="1.4999387" />
- <g
- id="g41413">
- <path
- sodipodi:nodetypes="csc"
- id="path41415"
- d="m -270.5,150.5 c 0,-4.0296 -2.4502,-6 -5.5,-6 -3.0498,0 -5.5,1.9704 -5.5,6"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#cccccc;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -270.5,150.5 c 0,-4.0296 -2.4502,-6 -5.5,-6 -3.0498,0 -5.5,1.9704 -5.5,6"
- id="path41417"
- sodipodi:nodetypes="csc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csc"
- id="path41419"
- d="m 36.445698,40.205481 c 0,3.312 -2.660849,4.931507 -5.972849,4.931507 -3.312,0 -5.97285,-1.619507 -5.97285,-4.931507"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42400);stroke-width:1.41714692;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(0.9208335,0,0,-1.2166667,-304.06042,199.41667)"
- inkscape:connector-curvature="0" />
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path41421"
- d="m -269,150 c -0.66667,0 -1.33333,1e-5 -2,1e-5 0,0.66667 0,1.33332 0,1.99999 0.66667,0 1.33333,-1e-5 2,-1e-5 0,-0.66666 0,-1.33332 0,-1.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m -281,150 c -0.66667,0 -1.33333,1e-5 -2,1e-5 0,0.66667 0,1.33332 0,1.99999 0.66667,0 1.33333,-1e-5 2,-1e-5 0,-0.66666 0,-1.33332 0,-1.99999 z"
- id="path41423"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.8;fill:#ececec;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -270.5,151.5 v -1 h 1"
- id="path41425"
- inkscape:connector-curvature="0" />
- <rect
- ry="0"
- rx="0"
- y="149"
- x="-283"
- height="1"
- width="2.75"
- id="rect41427"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect41429"
- width="2.75"
- height="1"
- x="-271.75"
- y="149"
- rx="0"
- ry="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_CURVE_NCIRCLE"
- transform="translate(565.49991,277.875)">
- <g
- transform="translate(-23.5,-18.875)"
- id="g41433"
- style="opacity:0.8">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#ff0000;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate"
- id="rect41435"
- width="16"
- height="16"
- x="-284.99991"
- y="108" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- d="m -272.5,108.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99999 0,2.99998 -1.00003,0 -2.00005,-1e-5 -3.00008,-1e-5 0,-1 0,-1.99999 0,-2.99999 z"
- id="path41437"
- inkscape:connector-curvature="0" />
- <path
- id="path41439"
- d="m -284.5,108.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99998 0,2.99998 -1.00003,-1e-5 -2.00005,-1e-5 -3.00008,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -283.5,110.5 v -1 h 1"
- id="path41441"
- inkscape:connector-curvature="0" />
- <path
- id="path41443"
- d="m -271.5,110.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- id="path41445"
- d="m -272.49992,123.5 c 1.00003,-1e-5 2.00005,-1e-5 3.00008,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 -1.00003,0 -2.00005,1e-5 -3.00008,1e-5 0,1 0,1.99999 0,2.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- d="m -284.49992,123.5 c 1.00003,-1e-5 2.00005,-1e-5 3.00008,-2e-5 0,-0.99999 0,-1.99998 0,-2.99998 -1.00003,1e-5 -2.00005,1e-5 -3.00008,2e-5 0,0.99999 0,1.99999 0,2.99998 z"
- id="path41447"
- inkscape:connector-curvature="0" />
- <path
- id="path41449"
- d="m -283.49992,122.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -271.49992,122.5 v -1 h 1"
- id="path41451"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(1.0019678,0,0,1,-97.100449,33.125005)"
- id="g41453">
- <circle
- transform="matrix(0.6860851,0,0,0.6874876,-293.56324,-17.123443)"
- style="fill:none;stroke:#000000;stroke-width:4.36388111;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path41455"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path41457"
- style="fill:none;stroke:url(#linearGradient42402);stroke-width:2.18194032;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6860851,0,0,0.6874876,-293.56324,-17.123443)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_SURFACE_NCIRCLE"
- transform="translate(311,278)">
- <g
- transform="translate(0,-19)"
- id="g41461"
- style="opacity:0.8">
- <rect
- y="108"
- x="-284.99991"
- height="16"
- width="16"
- id="rect41463"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#ff0000;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate" />
- <path
- id="path41465"
- d="m -272.5,108.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99999 0,2.99998 -1.00003,0 -2.00005,-1e-5 -3.00008,-1e-5 0,-1 0,-1.99999 0,-2.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- d="m -284.5,108.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99998 0,2.99998 -1.00003,-1e-5 -2.00005,-1e-5 -3.00008,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z"
- id="path41467"
- inkscape:connector-curvature="0" />
- <path
- id="path41469"
- d="m -283.5,110.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -271.5,110.5 v -1 h 1"
- id="path41471"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- d="m -272.49992,123.5 c 1.00003,-1e-5 2.00005,-1e-5 3.00008,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 -1.00003,0 -2.00005,1e-5 -3.00008,1e-5 0,1 0,1.99999 0,2.99999 z"
- id="path41473"
- inkscape:connector-curvature="0" />
- <path
- id="path41475"
- d="m -284.49992,123.5 c 1.00003,-1e-5 2.00005,-1e-5 3.00008,-2e-5 0,-0.99999 0,-1.99998 0,-2.99998 -1.00003,1e-5 -2.00005,1e-5 -3.00008,2e-5 0,0.99999 0,1.99999 0,2.99998 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -283.49992,122.5 v -1 h 1"
- id="path41477"
- inkscape:connector-curvature="0" />
- <path
- id="path41479"
- d="m -271.49992,122.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-57,33)"
- id="g41481">
- <rect
- y="56"
- x="-228"
- height="16"
- width="16"
- id="rect41483"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path41485"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.23039246;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.8124999,0,0,0.8129977,-327.25,-31.938622)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.8;fill:url(#linearGradient42404);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path41487"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.7451143,0.08386971,-0.08492794,0.7396793,-308.33359,-34.308811)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.6860851,0,0,0.6874876,-310.55192,-17.123443)"
- style="fill:none;stroke:url(#linearGradient42406);stroke-width:1.45605874;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path41489"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path41491"
- style="fill:none;stroke:url(#linearGradient42408);stroke-width:1.78040731;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.5610858,0,0,0.5622541,-294.05201,-2.3458915)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_CURVE_BEZCIRCLE"
- transform="translate(455,122.97748)">
- <rect
- y="244.02252"
- x="-240.00009"
- height="16"
- width="16"
- id="rect41495"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- id="g41497"
- transform="translate(15.99992,107.02252)">
- <path
- id="path41499"
- d="m -243.5,137.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99999 0,2.99998 -1.00003,0 -2.00005,-1e-5 -3.00008,-1e-5 0,-1 0,-1.99999 0,-2.99999 z"
- style="display:inline;fill:#aaccff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#aaccff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;enable-background:new"
- d="m -255.5,137.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99998 0,2.99998 -1.00003,-1e-5 -2.00005,-1e-5 -3.00008,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z"
- id="path41501"
- inkscape:connector-curvature="0" />
- <g
- style="opacity:0.5"
- id="g41503">
- <path
- id="path41505"
- d="m -252.25,138.49219 h 8.5"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:0.75;fill-rule:evenodd;stroke:#003380;stroke-width:2.79999995;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:1;fill-rule:evenodd;stroke:#aaccff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -252,138.49219 h 8"
- id="path41507"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path41509"
- d="m -254.5,139.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -242.5,139.5 v -1 h 1"
- id="path41511"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect41513"
- width="2.9998772"
- height="3"
- x="-233.49988"
- y="245.52252"
- ry="1.4999387"
- rx="1.4999387" />
- <g
- id="g41515"
- transform="translate(68.499908,155.89752)">
- <g
- transform="matrix(1.0019678,0,0,1,-97.100449,33.125005)"
- id="g41517">
- <circle
- transform="matrix(0.6860851,0,0,0.6874876,-293.56324,-17.123443)"
- style="fill:none;stroke:#000000;stroke-width:4.36388111;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path41519"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path41521"
- style="fill:none;stroke:url(#linearGradient42410);stroke-width:2.18194032;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6860851,0,0,0.6874876,-293.56324,-17.123443)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <rect
- rx="1.4999387"
- ry="1.4999387"
- y="245.52252"
- x="-233.49988"
- height="3"
- width="2.9998772"
- id="rect41523"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path41525"
- d="m -230.99988,246.02251 c -0.66667,0 -1.33333,10e-6 -2,10e-6 0,0.66667 0,1.33332 0,1.99999 0.66667,0 1.33333,-1e-5 2,-1e-5 0,-0.66666 0,-1.33332 0,-1.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_SURFACE_NCURVE"
- transform="translate(70.968338,302.76882)">
- <rect
- transform="matrix(0,1,1,0,0,0)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#ff0000;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate"
- id="rect41529"
- width="16"
- height="16"
- x="64.231171"
- y="-65.968338" />
- <rect
- transform="matrix(0,1,1,0,0,0)"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect41531"
- width="2.9998772"
- height="2.9999931"
- x="76.731178"
- y="-53.468342"
- ry="1.4999353"
- rx="1.4999387" />
- <g
- transform="matrix(0,1,1,0,-202.96833,348.23118)"
- id="g41533"
- style="display:inline;enable-background:new">
- <path
- id="path41535"
- d="m -271.50008,137.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99999 0,2.99998 -1.00003,0 -2.00005,-1e-5 -3.00008,-1e-5 0,-1 0,-1.99999 0,-2.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- d="m -283.50008,137.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99998 0,2.99998 -1.00003,-1e-5 -2.00005,-1e-5 -3.00008,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z"
- id="path41537"
- inkscape:connector-curvature="0" />
- <path
- id="path41539"
- d="m -282.50008,139.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -270.50008,139.5 v -1 h 1"
- id="path41541"
- inkscape:connector-curvature="0" />
- <g
- style="opacity:0.7"
- id="g41543">
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:0.75;fill-rule:evenodd;stroke:#003380;stroke-width:2.79999995;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -270.5,140.74992 v 8.5"
- id="path41545"
- inkscape:connector-curvature="0" />
- <path
- id="path41547"
- d="m -280.25008,139.5 h 8.5"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:0.75;fill-rule:evenodd;stroke:#003380;stroke-width:2.79999995;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- id="path41549"
- d="m -281.49999,140.75 v 8.5"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:0.75;fill-rule:evenodd;stroke:#003380;stroke-width:2.79999995;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:1;fill-rule:evenodd;stroke:#aaccff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -280.00008,139.5 h 8"
- id="path41551"
- inkscape:connector-curvature="0" />
- <path
- id="path41553"
- d="m -270.5,140.99992 v 8"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:1;fill-rule:evenodd;stroke:#aaccff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:1;fill-rule:evenodd;stroke:#aaccff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -281.49999,141 v 8"
- id="path41555"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <rect
- transform="matrix(0,1,1,0,0,0)"
- rx="1.4999387"
- ry="1.4999362"
- y="-53.468342"
- x="64.731171"
- height="2.999995"
- width="2.9998772"
- id="rect41557"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(0,1,1,0,-202.96833,348.23118)"
- id="g41559"
- style="display:inline;enable-background:new">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -270.5,150.5 c 0,-4.0296 -2.4502,-6 -5.5,-6 -3.0498,0 -5.5,1.9704 -5.5,6"
- id="path41561"
- sodipodi:nodetypes="csc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csc"
- id="path41563"
- d="m -270.5,150.5 c 0,-4.0296 -2.4502,-6 -5.5,-6 -3.0498,0 -5.5,1.9704 -5.5,6"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#cccccc;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- transform="matrix(0.9208335,0,0,-1.2166667,-304.06042,199.41667)"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42412);stroke-width:1.41714692;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 36.445698,40.205481 c 0,3.312 -2.660849,4.931507 -5.972849,4.931507 -3.312,0 -5.97285,-1.619507 -5.97285,-4.931507"
- id="path41565"
- sodipodi:nodetypes="csc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;opacity:0.6;enable-background:new"
- transform="translate(132.03151,-159.76882)"
- id="g41567">
- <path
- transform="matrix(0.8124999,0,0,0.8131203,-292.24999,136.05677)"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.98423982;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 133.84616,110 v 15.98779 L 132,126 c -4.416,0 -8,-3.584 -8,-8 0,-4.416 3.584,-8 8,-8 z"
- id="path41569"
- sodipodi:nodetypes="cccscc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csscccc"
- id="path41571"
- d="M 132.92501,125.94702 C 132.6215,125.98201 132.31284,126 132,126 c -4.416,0 -8,-3.584 -8,-8 0,-4.11109 3.10616,-7.5011 7.09807,-7.94965 l 1.32084,-0.14976 1.81209,15.89838 z"
- style="display:inline;opacity:0.8;fill:url(#linearGradient42414);fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="matrix(0.7451143,0.08449152,-0.08492794,0.7451633,-273.33359,132.91784)"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccscc"
- id="path41573"
- d="M 132.71228,109.99971 V 126 H 132 c -4.416,0 -8,-3.584 -8,-8 0,-4.416 3.584,-8 8,-8 z"
- style="fill:none;stroke:url(#linearGradient42416);stroke-width:1.45605874;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6860851,0,0,0.6874876,-275.55192,150.87656)"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="css"
- id="path41575"
- d="m 132,126 c -4.416,0 -8,-3.584 -8,-8 0,-4.416 3.584,-8 8,-8"
- style="fill:none;stroke:url(#linearGradient42418);stroke-width:1.78040731;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.5610858,0,0,0.5622541,-259.05201,165.65411)"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m -52.968334,79.231175 c 0,-0.66667 10e-6,-1.33333 10e-6,-2 0.66667,0 1.33332,0 1.99999,0 0,0.66667 -1e-5,1.33333 -1e-5,2 -0.66666,0 -1.33332,0 -1.99999,0 z"
- id="path41577"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path41579"
- d="m -52.968334,67.231175 c 0,-0.66667 10e-6,-1.33333 10e-6,-2 0.66667,0 1.33332,0 1.99999,0 0,0.66667 -1e-5,1.33333 -1e-5,2 -0.66666,0 -1.33332,0 -1.99999,0 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path41581"
- d="m -51.468334,77.731175 h -1 v 1"
- style="display:inline;opacity:0.8;fill:#ececec;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <rect
- transform="matrix(0,1,1,0,0,0)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect41583"
- width="2.75"
- height="1"
- x="65.231171"
- y="-53.968342"
- rx="0"
- ry="0" />
- <rect
- transform="matrix(0,1,1,0,0,0)"
- ry="0"
- rx="0"
- y="-53.968342"
- x="76.481178"
- height="1"
- width="2.75"
- id="rect41585"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_SURFACE_NCYLINDER"
- transform="translate(375,231.00851)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect41589"
- width="16"
- height="16"
- x="-307"
- y="136" />
- <g
- id="g41591"
- transform="translate(-22.000001,28)"
- style="display:inline;opacity:0.8;enable-background:new">
- <rect
- y="108"
- x="-284.99991"
- height="16"
- width="16"
- id="rect41593"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#ff0000;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate" />
- <path
- id="path41595"
- d="m -272.5,108.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99999 0,2.99998 -1.00003,0 -2.00005,-1e-5 -3.00008,-1e-5 0,-1 0,-1.99999 0,-2.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- d="m -284.5,108.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99998 0,2.99998 -1.00003,-1e-5 -2.00005,-1e-5 -3.00008,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z"
- id="path41597"
- inkscape:connector-curvature="0" />
- <path
- id="path41599"
- d="m -283.5,110.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -271.5,110.5 v -1 h 1"
- id="path41601"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- d="m -272.49992,123.5 c 1.00003,-1e-5 2.00005,-1e-5 3.00008,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 -1.00003,0 -2.00005,1e-5 -3.00008,1e-5 0,1 0,1.99999 0,2.99999 z"
- id="path41603"
- inkscape:connector-curvature="0" />
- <path
- id="path41605"
- d="m -284.49992,123.5 c 1.00003,-1e-5 2.00005,-1e-5 3.00008,-2e-5 0,-0.99999 0,-1.99998 0,-2.99998 -1.00003,1e-5 -2.00005,1e-5 -3.00008,2e-5 0,0.99999 0,1.99999 0,2.99998 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -283.49992,122.5 v -1 h 1"
- id="path41607"
- inkscape:connector-curvature="0" />
- <path
- id="path41609"
- d="m -271.49992,122.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g41611">
- <path
- sodipodi:nodetypes="cccsccc"
- id="path41613"
- d="m -299,137.5 c -3.036,0 -5.49999,1.12 -5.49999,2.5 l -10e-6,8 c 0,1.38 2.46399,2.5 5.49999,2.5 3.036,0 5.5,-1.12 5.5,-2.5 l 10e-6,-8 c 0,-1.38 -2.464,-2.5 -5.5,-2.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient42420);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient42422);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient42424);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -294.49145,140.5 c 0,1 -1.5,2 -4.50855,2 -3.00854,0 -4.49145,-1 -4.49145,-2 0,-1.5 2.25,-2.25 4.5,-2.25 2.25,0 4.5,0.75 4.5,2.25 z"
- id="path41615"
- sodipodi:nodetypes="czszs"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="czs"
- id="path41617"
- d="m -293.99565,140.99149 c 0,1.12926 -1.66739,2.25851 -5.01168,2.25851 -3.34426,0 -4.99267,-1.12925 -4.99267,-2.25851"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:url(#linearGradient42426);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -299,137.5 c -3.49999,0 -5.49999,1.12 -5.49999,2.5 l -10e-6,7.5 c 0,2 2.46399,3 5.49999,3 3.036,0 5.50001,-1 5.50001,-3 V 140 c 0,-1.38 -1.99999,-2.5 -5.5,-2.5 z"
- id="path41619"
- sodipodi:nodetypes="cccsccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42428);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -303.5,141.5 v 5.5 c 0,0.9838 0.64285,2.5 4.5,2.5 3.85714,0 4.5,-1.5162 4.5,-2.5 v -5.5"
- id="path41621"
- sodipodi:nodetypes="ccscc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_SURFACE_NSURFACE"
- transform="translate(258.99995,102)">
- <rect
- transform="scale(-1,1)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect41625"
- width="16.000032"
- height="16"
- x="195.99995"
- y="265" />
- <g
- transform="translate(77.000139,146.99992)"
- id="g41627">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- d="m -287.5,118.5 c 10e-6,1.00003 10e-6,2.00005 2e-5,3.00008 0.99999,0 1.99998,0 2.99998,0 -10e-6,-1.00003 -10e-6,-2.00005 -2e-5,-3.00008 -0.99999,0 -1.99999,0 -2.99998,0 z"
- id="path41629"
- inkscape:connector-curvature="0" />
- <path
- id="path41631"
- d="m -285.5,119.5 h -1 v 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <g
- style="opacity:0.5"
- id="g41633"
- transform="matrix(0,1,1,0,-425,402.00008)">
- <path
- id="path41635"
- d="m -279.50016,139.5 6.00016,2e-5"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:0.75;fill-rule:evenodd;stroke:#003380;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- id="path41637"
- d="m -281.50008,141.5 v 2"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:0.75;fill-rule:evenodd;stroke:#003380;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:1;fill-rule:evenodd;stroke:#aaccff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -280.00008,139.5 6.50008,2e-5"
- id="path41639"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:1;fill-rule:evenodd;stroke:#aaccff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -281.49999,141 -9e-5,2.5"
- id="path41641"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g41643"
- transform="rotate(180,-242.49992,199.5)">
- <path
- id="path41645"
- d="m -287.5,118.5 c 10e-6,1.00003 10e-6,2.00005 2e-5,3.00008 0.99999,0 1.99998,0 2.99998,0 -10e-6,-1.00003 -10e-6,-2.00005 -2e-5,-3.00008 -0.99999,0 -1.99999,0 -2.99998,0 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -285.5,119.5 h -1 v 1"
- id="path41647"
- inkscape:connector-curvature="0" />
- <g
- transform="matrix(0,1,1,0,-425,402.00008)"
- id="g41649"
- style="opacity:0.5">
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:0.75;fill-rule:evenodd;stroke:#003380;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -279.50016,139.5 h 7"
- id="path41652"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:0.75;fill-rule:evenodd;stroke:#003380;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -281.50008,141.5 v 2"
- id="path41654"
- inkscape:connector-curvature="0" />
- <path
- id="path41656"
- d="m -280.00008,139.5 h 7.49992"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:1;fill-rule:evenodd;stroke:#aaccff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- id="path41658"
- d="m -281.49999,141 -9e-5,2.5"
- style="display:inline;overflow:visible;visibility:visible;fill:#aaccff;fill-opacity:1;fill-rule:evenodd;stroke:#aaccff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(-191.99984,-17.000001)"
- id="g41660"
- style="display:inline;enable-background:new">
- <g
- id="g41662"
- transform="translate(-376,510)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path41664"
- d="m 358.99997,-216.75 c -0.99997,-6.5 6.00003,-2.75 5,-9.25 L 369,-224 c 1,7 -6,2 -5,10 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#cdcdcd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="M 358.99997,-216.75 C 358,-223.25 365,-220 363.99997,-226 L 369,-224 c 1,7 -6,2 -5,10 z"
- id="path41666"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#linearGradient42430);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.88812488px;marker:none;enable-background:accumulate"
- d="M 358.99997,-216.75 C 358,-223.25 365,-220 363.99997,-226 L 369,-224 c 1,7 -6,2 -5,10 z"
- id="path41668"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path41670"
- d="M 358.99997,-216.75 C 358,-223.25 365,-220 363.99997,-226 L 369,-224 c 1,7 -6,2 -5,10 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:url(#radialGradient42432);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.88812488px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path41672"
- d="m 364.24984,-225.5 4.25016,1.75 c 1,5.75 -5.50003,2 -5.08381,8.85761 l -4.04561,-2.26888"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:none;stroke:url(#linearGradient42434);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 364.24997,-225.5 4.25003,1.75"
- id="path41674"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-399.2499,383.75)"
- id="g41676" />
- <g
- id="g41678"
- transform="translate(-406.2499,380.75)" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_SURFACE_NTORUS"
- transform="translate(338.00016,191)">
- <g
- id="g41682"
- transform="translate(56.999841,68)"
- style="display:inline;opacity:0.8;enable-background:new">
- <rect
- y="108"
- x="-284.99991"
- height="16"
- width="16"
- id="rect41684"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#ff0000;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate" />
- <path
- id="path41686"
- d="m -272.5,108.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99999 0,2.99998 -1.00003,0 -2.00005,-1e-5 -3.00008,-1e-5 0,-1 0,-1.99999 0,-2.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- d="m -284.5,108.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99998 0,2.99998 -1.00003,-1e-5 -2.00005,-1e-5 -3.00008,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z"
- id="path41688"
- inkscape:connector-curvature="0" />
- <path
- id="path41690"
- d="m -283.5,110.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -271.5,110.5 v -1 h 1"
- id="path41692"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- d="m -272.49992,123.5 c 1.00003,-1e-5 2.00005,-1e-5 3.00008,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 -1.00003,0 -2.00005,1e-5 -3.00008,1e-5 0,1 0,1.99999 0,2.99999 z"
- id="path41694"
- inkscape:connector-curvature="0" />
- <path
- id="path41696"
- d="m -284.49992,123.5 c 1.00003,-1e-5 2.00005,-1e-5 3.00008,-2e-5 0,-0.99999 0,-1.99998 0,-2.99998 -1.00003,1e-5 -2.00005,1e-5 -3.00008,2e-5 0,0.99999 0,1.99999 0,2.99998 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -283.49992,122.5 v -1 h 1"
- id="path41699"
- inkscape:connector-curvature="0" />
- <path
- id="path41701"
- d="m -271.49992,122.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="176"
- x="-228"
- height="16"
- width="16"
- id="rect41703"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient42436);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -220,178.5 c -4.14,0 -7.40235,2.464 -7.40234,5.5 0,3.036 3.26234,5.5 7.40234,5.5 4.14,0 7.40234,-2.464 7.40234,-5.5 0,-3.036 -3.26233,-5.50001 -7.40234,-5.5 z m 0,4 c 1.2993,0 2.42742,0.39879 3.03125,1 -0.60383,0.60121 -1.73196,1 -3.03125,1 -1.29929,0 -2.42742,-0.39879 -3.03125,-1 0.60383,-0.60121 1.73196,-1 3.03125,-1 z"
- id="path41705"
- sodipodi:nodetypes="cssscccscc"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.6;fill:url(#radialGradient42438);fill-rule:evenodd;stroke:none"
- d="m -214.625,180.4375 c 1.5822,4.85564 -3.15377,7.27675 -11.84375,6.21875 v 0.0312 c 1.25689,1.67541 3.66207,2.8125 6.46875,2.8125 4.14,0 7.40625,-2.464 7.40625,-5.5 0,-1.34213 -0.64966,-2.57614 -1.71875,-3.53125 -0.10326,-0.0119 -0.20204,-0.024 -0.3125,-0.0312 z"
- id="path41707"
- sodipodi:nodetypes="cccsscc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path41709"
- d="m -223.375,183.45313 c 1.90631,-1.46639 4.08905,-1.44306 6.1875,-0.53125 L -217,182.76563 c -0.60315,-4.39553 -10.23988,-3.57787 -6.375,0.6875 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:url(#radialGradient42440);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- d="m -223.375,183.65625 0.5,-0.0312 c -0.0509,-0.0426 -0.11109,-0.08 -0.15625,-0.125 0.60383,-0.60121 1.73196,-1 3.03125,-1 0.99575,0 1.89552,0.24495 2.53125,0.625 L -217,182.96875 c -0.60315,-4.39553 -10.23988,-3.57787 -6.375,0.6875 z"
- id="path41711"
- sodipodi:nodetypes="cccsccc"
- inkscape:connector-curvature="0" />
- <ellipse
- transform="matrix(0.9999986,0,0,1.799999,-2.971883e-4,111.10004)"
- id="path41713"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42442);stroke-width:0.5962854;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="-220"
- cy="40.5"
- rx="6.5"
- ry="2.5" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_SURFACE_NSPHERE"
- transform="translate(300.99985,63)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect41717"
- width="16"
- height="16"
- x="-211.99985"
- y="304" />
- <g
- style="display:inline;opacity:0.8;enable-background:new"
- transform="translate(73.00016,196)"
- id="g41719">
- <rect
- y="108"
- x="-284.99991"
- height="16"
- width="16"
- id="rect41721"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#ff0000;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate" />
- <path
- id="path41723"
- d="m -272.5,108.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99999 0,2.99998 -1.00003,0 -2.00005,-1e-5 -3.00008,-1e-5 0,-1 0,-1.99999 0,-2.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- d="m -284.5,108.5 c 1.00003,1e-5 2.00005,1e-5 3.00008,2e-5 0,0.99999 0,1.99998 0,2.99998 -1.00003,-1e-5 -2.00005,-1e-5 -3.00008,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 z"
- id="path41725"
- inkscape:connector-curvature="0" />
- <path
- id="path41727"
- d="m -283.5,110.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -271.5,110.5 v -1 h 1"
- id="path41729"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- d="m -272.49992,123.5 c 1.00003,-1e-5 2.00005,-1e-5 3.00008,-2e-5 0,-0.99999 0,-1.99999 0,-2.99998 -1.00003,0 -2.00005,1e-5 -3.00008,1e-5 0,1 0,1.99999 0,2.99999 z"
- id="path41731"
- inkscape:connector-curvature="0" />
- <path
- id="path41733"
- d="m -284.49992,123.5 c 1.00003,-1e-5 2.00005,-1e-5 3.00008,-2e-5 0,-0.99999 0,-1.99998 0,-2.99998 -1.00003,1e-5 -2.00005,1e-5 -3.00008,2e-5 0,0.99999 0,1.99999 0,2.99998 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#80b3ff;fill-opacity:1;fill-rule:nonzero;stroke:#003380;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -283.49992,122.5 v -1 h 1"
- id="path41735"
- inkscape:connector-curvature="0" />
- <path
- id="path41737"
- d="m -271.49992,122.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline"
- id="g41739"
- transform="matrix(1.1658027,0,0,1.1657997,-354.28956,51.94393)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path41741"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.23686147;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6969446,0,0,0.6900977,36.918531,141.69345)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.8;fill:url(#linearGradient42444);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path41743"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.6391427,-0.07194179,0.07284933,-0.6344823,204.68584,307.47408)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.5885088,0,0,0.5897133,51.241774,153.48488)"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient42446);stroke-width:1.45605874;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path41745"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- sodipodi:nodetypes="cscc"
- id="path41747"
- style="display:inline;fill:none;stroke:url(#linearGradient42448);stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- d="m -197.75642,311.54171 c -0.99362,1.2083 -2.79874,2.22895 -6.24718,2.22895 -3.415,0 -5.24644,-1.02065 -6.24644,-2.195"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_CURVE_PATH"
- transform="matrix(1,0,0,-1,496,768)">
- <rect
- transform="scale(-1,1)"
- y="385"
- x="202"
- height="16"
- width="16"
- id="rect41751"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccc"
- style="fill:none;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -203.5,396.5 v 3 h -3"
- id="path41753"
- inkscape:connector-curvature="0" />
- <path
- id="path41755"
- d="m -213.5,386.5 v 3 h -3"
- style="fill:none;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- id="path41757"
- d="m -208.5,391.5 v 3 h -3"
- style="fill:none;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <g
- id="g41759"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-1,0,0,1,-118.8387,295.00001)"
- style="display:inline">
- <path
- sodipodi:nodetypes="cz"
- id="path41761"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 85.6613,103.49999 9,-9"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path41763"
- sodipodi:nodetypes="cz"
- d=""
- inkscape:connector-curvature="0" />
- <path
- d="m 85.6613,103.49999 9,-9"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#d7e3f4;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path41765"
- sodipodi:nodetypes="cz"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccccccc"
- id="path41767"
- d="m -203,400 v -4 h -1 v 3 h -3 v 1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- id="path41769"
- d="m -213,390 v -4 h -1 v 3 h -3 v 1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate"
- d="m -208,395 v -4 h -1 v 3 h -3 v 1 z"
- id="path41771"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <g
- transform="rotate(180,-210,393)"
- style="opacity:0.2"
- id="g41773">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- d="m -208,395 v 2 h 1 v -1 h 1 v -1 z"
- id="path41775"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- id="path41777"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- d="m -211,392 v 2 h 1 v -1 h 1 v -1 z"
- id="path41779"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- id="path41781"
- d="m -213,390 v 2 h 1 v -1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_META_CUBE"
- transform="translate(272.99917,170)">
- <g
- transform="translate(83.990361,105)"
- id="g42154"
- style="opacity:0.5">
- <circle
- transform="matrix(0.9361892,0,0,0.9375002,-26.576994,10.374973)"
- style="fill:#ffd5d5;fill-opacity:0.58823529;fill-rule:nonzero;stroke:#800000;stroke-width:1.06741309;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42157"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path42159"
- style="fill:none;stroke:url(#linearGradient42462);stroke-width:1.22662127;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.814129,0,0,0.816369,-10.451999,24.674751)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.6848076,0,0,0.6867124,6.6184411,39.974237)"
- style="fill:none;stroke:url(#linearGradient42464);stroke-width:1.45823753;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42161"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.814129,0,0,0.816369,-10.451999,24.674751)"
- style="fill:none;stroke:url(#linearGradient42466);stroke-width:1.22662127;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42163"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- transform="translate(81.056581,171.48366)"
- id="g42165">
- <path
- id="path42168"
- d="m 101.94425,50.518348 -5.000004,1.875 v 6.3125 l 5.000004,2.71875 5,-2.71875 v -6.3125 z"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path42170"
- d="m 106.94413,58.696518 v -6.29009 l -5,-1.89415 c 0,2.16796 0,10.43646 0,10.91232 z"
- style="fill:url(#linearGradient42468);fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 96.944126,58.696518 v -6.29009 l 5.000004,-1.89415 v 10.91232 z"
- id="path42175"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path42177"
- d="m 96.944126,52.406428 5.000004,-1.89415 5,1.89415 -5,2.07396 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient42470);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 106.44413,52.406428 v 6.04208 l -4.5,2.48007 -4.500004,-2.48007 v -6.04208"
- id="path42179"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_META_CAPSULE"
- transform="translate(335.99917,149.00001)">
- <g
- style="opacity:0.5"
- id="g42183"
- transform="translate(83.990367,126)">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path42185"
- style="fill:#ffd5d5;fill-opacity:0.58823529;fill-rule:nonzero;stroke:#800000;stroke-width:1.06741309;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.9361892,0,0,0.9375002,-26.576994,10.374973)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.814129,0,0,0.816369,-10.451999,24.674751)"
- style="fill:none;stroke:url(#linearGradient42472);stroke-width:1.22662127;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42187"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path42189"
- style="fill:none;stroke:url(#linearGradient42474);stroke-width:1.45823753;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6848076,0,0,0.6867124,6.6184411,39.974237)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path42191"
- style="fill:none;stroke:url(#linearGradient42477);stroke-width:1.22662127;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.814129,0,0,0.816369,-10.451999,24.674751)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(321.49473,233.64631)"
- id="g42193">
- <g
- id="g42195"
- transform="translate(-38.4939,35.353694)">
- <path
- sodipodi:nodetypes="cccsccc"
- id="path42197"
- d="m -98.999998,-25.5 c -2.485192,0 -4.499992,0.89481 -4.500002,2 v 7 c 0,1.10519 2.0148,2 4.500002,2 2.48519,0 4.499998,-1.1448 4.499998,-2.25 l 2e-6,-6.75 c 0,-1.10519 -2.01481,-2 -4.5,-2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient42479);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccscc"
- id="path42199"
- d="m -102.5,-22 v 5 c 0,1.25 0.5,1.5 3.5,1.5 3,0 3.5,-0.25 3.5,-1.5 v -5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42481);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="css"
- id="path42201"
- d="M -94.730509,-23.353486 C -94.748454,-21.92288 -95.5,-21.5 -99,-21.5 c -3.5,0 -4.24845,-0.42288 -4.24845,-1.848345"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42483);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient42485);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -95.341215,-23.173655 c 0,0.873491 -0.648671,1.587005 -3.656631,1.582419 -3.011664,-0.0046 -3.656634,-0.708928 -3.656634,-1.582419 0,-0.87349 0.64497,-1.582418 3.656634,-1.582418 3.00796,0 3.656631,0.708928 3.656631,1.582418 z"
- id="path42203"
- sodipodi:nodetypes="csssc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -99,-25.5 c -4,0 -4.49999,0.89481 -4.5,2 v 6 c 0,1.10519 0,3.00433 4.50216,3.002164 C -94.5,-14.5 -94.5,-16.3948 -94.5,-17.5 v -6 c 0,-1.10519 -0.5,-2 -4.5,-2 z"
- id="path42205"
- sodipodi:nodetypes="cccsccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_META_PLANE"
- transform="translate(251.99917,191.00001)">
- <g
- transform="translate(83.990364,83.999999)"
- id="g42209"
- style="opacity:0.5">
- <circle
- transform="matrix(0.9361892,0,0,0.9375002,-26.576994,10.374973)"
- style="fill:#ffd5d5;fill-opacity:0.58823529;fill-rule:nonzero;stroke:#800000;stroke-width:1.06741309;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42211"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path42213"
- style="fill:none;stroke:url(#linearGradient42487);stroke-width:1.22662127;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.814129,0,0,0.816369,-10.451999,24.674751)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.6848076,0,0,0.6867124,6.6184411,39.974237)"
- style="fill:none;stroke:url(#linearGradient42489);stroke-width:1.45823753;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42215"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.814129,0,0,0.816369,-10.451999,24.674751)"
- style="fill:none;stroke:url(#linearGradient42491);stroke-width:1.22662127;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42217"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- transform="matrix(1.3088013,0,0,1.3078064,114.94487,78.842325)"
- style="display:inline"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g42219">
- <rect
- y="94.553505"
- x="48.560436"
- height="7.6462827"
- width="7.6405811"
- id="rect42221"
- style="fill:url(#linearGradient42493);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.61147881;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path42223"
- d="m 49.324493,101.43525 v -6.117109 h 6.112464 l 9.17e-4,6.117009 z"
- style="fill:none;stroke:url(#linearGradient42495);stroke-width:0.76434839px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_META_BALL"
- transform="translate(293.99917,128.01655)">
- <g
- id="g42227">
- <g
- transform="translate(83.990364,146.98346)"
- id="g42229"
- style="opacity:0.5">
- <circle
- transform="matrix(0.9361892,0,0,0.9375002,-26.576994,10.374973)"
- style="fill:#ffd5d5;fill-opacity:0.58823529;fill-rule:nonzero;stroke:#800000;stroke-width:1.06741309;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42231"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path42233"
- style="fill:none;stroke:url(#linearGradient42497);stroke-width:1.22662127;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.814129,0,0,0.816369,-10.451999,24.674751)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.6848076,0,0,0.6867124,6.6184411,39.974237)"
- style="fill:none;stroke:url(#linearGradient42499);stroke-width:1.45823753;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42235"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.814129,0,0,0.816369,-10.451999,24.674751)"
- style="fill:none;stroke:url(#linearGradient42501);stroke-width:1.22662127;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42237"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline"
- id="g42239"
- transform="matrix(0.9864502,0,0,0.9977342,55.832396,47.37231)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path42241"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.45345163;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6969446,0,0,0.6900977,36.918531,141.69345)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.8;fill:url(#linearGradient42503);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path42243"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.6289675,-0.07056955,0.07168957,-0.6223801,203.47957,305.88099)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.5718707,0,0,0.5622842,53.438009,156.77386)"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient42505);stroke-width:1.77757704;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42245"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_META_ELLIPSOID"
- transform="translate(315,107)">
- <g
- transform="translate(83.990364,168)"
- id="g42249"
- style="opacity:0.5">
- <circle
- transform="matrix(0.9361892,0,0,0.9375002,-26.576994,10.374973)"
- style="fill:#ffd5d5;fill-opacity:0.58823529;fill-rule:nonzero;stroke:#800000;stroke-width:1.06741309;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42251"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path42253"
- style="fill:none;stroke:url(#linearGradient42507);stroke-width:1.22662127;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.814129,0,0,0.816369,-10.451999,24.674751)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.6848076,0,0,0.6867124,6.6184411,39.974237)"
- style="fill:none;stroke:url(#linearGradient42509);stroke-width:1.45823753;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42255"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.814129,0,0,0.816369,-10.451999,24.674751)"
- style="fill:none;stroke:url(#linearGradient42511);stroke-width:1.22662127;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42257"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- transform="translate(67,168)"
- id="g42259">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffd5d5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect42261"
- width="14"
- height="14"
- x="109"
- y="116" />
- <g
- transform="matrix(0,-0.7411719,0.7413284,0,26.310335,194.89046)"
- id="g42263">
- <rect
- y="113"
- x="89.000832"
- height="16"
- width="16"
- id="rect42265"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(1.3039373,-0.2835816,-0.2811062,1.3154136,-8.365286,-135.94413)"
- id="g42268"
- style="display:inline">
- <path
- transform="matrix(0.6969446,0,0,0.6900977,36.918531,141.69345)"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.52109182;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 139.87786,116.72728 c 0,4.416 -4.87654,8.89303 -9.18264,9.14567 -4.03231,0.23658 -6.86684,-2.60955 -6.61392,-6.64097 0.26963,-4.29785 4.87655,-8.89304 9.18265,-9.14567 4.03232,-0.23656 6.86685,2.60957 6.61391,6.64097 z"
- id="path42273"
- sodipodi:nodetypes="csssc"
- inkscape:connector-curvature="0" />
- <path
- transform="matrix(-0.6214741,-0.06030772,0.08065856,-0.6191475,201.43124,304.14414)"
- style="display:inline;opacity:0.8;fill:url(#linearGradient42513);fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 140.14875,115.73726 c 0,4.416 -4.29905,10.26855 -8.71505,10.26855 -4.416,0 -7.23906,-1.65769 -7.23906,-6.07369 0,-4.416 4.28332,-9.5732 8.27188,-10.31985 3.26409,-0.61103 7.68223,1.70899 7.68223,6.12499 z"
- id="path42275"
- sodipodi:nodetypes="csssc"
- inkscape:connector-curvature="0" />
- <path
- transform="matrix(0.5541229,-0.02016698,-0.02019099,0.5552959,58.152692,160.26124)"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient42515);stroke-width:1.90297282;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 139.88903,116.28509 c 0,4.416 -5.24736,9.49944 -9.66336,9.49944 -4.416,0 -6.16482,-1.70296 -6.16482,-6.11896 0,-4.416 5.24736,-9.49945 9.66336,-9.49945 4.416,0 6.16482,1.70297 6.16482,6.11897 z"
- id="path42277"
- sodipodi:nodetypes="csssc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Pulpit\Browser icons ver 1\font_file SMALL.png"
- transform="translate(10.00003,171.5)"
- id="ICON_OUTLINER_DATA_FONT">
- <rect
- y="237.5"
- x="162.99997"
- height="16"
- width="16"
- id="rect42282"
- style="display:inline;opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <g
- id="g42285"
- style="opacity:0.9">
- <g
- transform="translate(75.999999,-319.5)"
- id="g42287"
- style="display:inline;fill:#ffcc00;stroke:#000000;stroke-width:1.5;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none">
- <path
- style="fill:none;stroke:#1a1a1a;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none"
- d="m -167,235 v 9 h 1 v -4 h 3 v -1 h -3 v -4 h 5 v -1 h -6 z"
- transform="translate(262.99997,326)"
- id="path42289"
- sodipodi:nodetypes="cccccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;fill:#ffcc00"
- id="g42291"
- transform="translate(75.999999,-319.5)">
- <path
- style="fill:url(#linearGradient42517)"
- d="m -167,235 v 9 h 1 v -4 h 3 v -1 h -3 v -4 h 5 v -1 h -6 z"
- transform="translate(262.99997,326)"
- id="path42294"
- sodipodi:nodetypes="cccccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;opacity:0.85;fill:#ffffff"
- d="m 171.99997,240.5 v 10 h 0.65625 v -10 z"
- id="path42296"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#162d50;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="g42298">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#162d50;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect42300"
- width="1.25"
- height="1"
- x="90"
- y="43"
- transform="translate(73.999969,208.5)" />
- <rect
- y="251.5"
- x="167.74997"
- height="1"
- width="1.2500329"
- id="rect42302"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#162d50;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- y="238.5"
- x="163.99997"
- height="1"
- width="1.2499995"
- id="rect42304"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#162d50;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#162d50;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect42306"
- width="1.250011"
- height="1"
- x="167.74997"
- y="238.5" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#162d50;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect42308"
- width="1.0000029"
- height="12.5"
- x="165.99997"
- y="239.25" />
- </g>
- <g
- id="g42310"
- style="display:inline;overflow:visible;visibility:visible;fill:#e9f0fa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate">
- <rect
- transform="translate(73.999969,208.5)"
- y="43"
- x="90"
- height="1"
- width="2"
- id="rect42312"
- style="display:inline;overflow:visible;visibility:visible;fill:#e9f0fa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#e9f0fa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect42314"
- width="2"
- height="1"
- x="166.99997"
- y="251.5" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#e9f0fa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect42316"
- width="2"
- height="1"
- x="163.99997"
- y="238.5" />
- <rect
- y="238.5"
- x="166.99997"
- height="1"
- width="2"
- id="rect42318"
- style="display:inline;overflow:visible;visibility:visible;fill:#e9f0fa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="239.5"
- x="165.99997"
- height="12"
- width="0.99999952"
- id="rect42320"
- style="display:inline;overflow:visible;visibility:visible;fill:#e9f0fa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_META_DATA"
- transform="translate(333.02099,358)">
- <rect
- y="135"
- x="-202"
- height="16"
- width="16"
- id="rect35368"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(0.8692812,0,0,0.8692812,-279.33076,38.816971)"
- id="g35370"
- style="opacity:0.35">
- <circle
- transform="matrix(0.9361892,0,0,0.9375002,-26.576994,10.374973)"
- style="display:inline;overflow:visible;visibility:visible;fill:#f8dcdc;fill-opacity:0.58823529;fill-rule:nonzero;stroke:#580000;stroke-width:1.22792602;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35372"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path35374"
- style="fill:none;stroke:url(#linearGradient35406);stroke-width:1.4523226;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.7910044,0,0,0.7931859,-7.3995492,27.410355)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.644496,0,0,0.6462993,11.939574,44.742981)"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient35408);stroke-width:1.78243256;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path35376"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- id="g35378"
- transform="matrix(0.857703,0,0,0.8577018,-4.235469,19.278753)"
- style="opacity:0.7">
- <path
- sodipodi:nodetypes="cssssszzs"
- id="path35380"
- d="m -222.5,141.5 c 1.52069,0 2.97702,-1.62476 3,-2.5 0.0525,-1.99931 1.5,-3.5 3.5,-3.5 2,0 3.5,1.568 3.5,3.5 0,1.84581 -1.5,3.50326 -3.5,3.5 -0.8997,-0.001 -2.5,1.5 -2.5,3 0,2.25 -1.75,4 -4,4 -2.25,0 -4,-1.75 -4,-4 0,-2.25 1.75,-4 4,-4 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:0.93272448;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- transform="translate(-527,-167)"
- d="m 311,302.99023 c -1.75507,0 -3.00977,1.2547 -3.00977,3.00977 0,0.81824 -0.46262,1.55558 -1.10546,2.09375 -0.64284,0.53817 -1.4902,0.89648 -2.38477,0.89648 -1.996,0 -3.50977,1.51377 -3.50977,3.50977 0,1.996 1.51377,3.50977 3.50977,3.50977 1.996,0 3.50977,-1.51377 3.50977,-3.50977 0,-0.88607 0.35723,-1.7322 0.89453,-2.37695 0.53729,-0.64476 1.27476,-1.11328 2.0957,-1.11328 1.72989,0 3.00977,-1.42935 3.00977,-3.00977 0,-1.67845 -1.2658,-3.00977 -3.00977,-3.00977 z"
- id="path35382"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:url(#linearGradient35410);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.86598092;marker:none;enable-background:accumulate"
- inkscape:original="M 311 302.5 C 309 302.5 307.5 304 307.5 306 C 307.5 307.25 306.02069 308.5 304.5 308.5 C 302.25 308.5 300.5 310.25 300.5 312.5 C 300.5 314.75 302.25 316.5 304.5 316.5 C 306.75 316.5 308.5 314.75 308.5 312.5 C 308.5 311 309.75 309.5 311 309.5 C 313 309.5 314.5 307.84581 314.5 306 C 314.5 304.068 313 302.5 311 302.5 z "
- inkscape:radius="-0.48985747"
- sodipodi:type="inkscape:offset" />
- <path
- transform="translate(-527,-167)"
- sodipodi:type="inkscape:offset"
- inkscape:radius="-0.96440691"
- inkscape:original="M 311 302.5 C 309 302.5 307.5 304 307.5 306 C 307.5 307.25 306.02069 308.5 304.5 308.5 C 302.25 308.5 300.5 310.25 300.5 312.5 C 300.5 314.75 302.25 316.5 304.5 316.5 C 306.75 316.5 308.5 314.75 308.5 312.5 C 308.5 311 309.75 309.5 311 309.5 C 313 309.5 314.5 307.84581 314.5 306 C 314.5 304.068 313 302.5 311 302.5 z "
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#radialGradient35412);stroke-width:1.16590559;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35384"
- d="m 311,303.46484 c -1.5178,0 -2.53516,1.01736 -2.53516,2.53516 0,1.00544 -0.55221,1.85355 -1.27539,2.45898 -0.72317,0.60543 -1.66486,1.00586 -2.68945,1.00586 -1.74994,0 -3.03516,1.28522 -3.03516,3.03516 0,1.74994 1.28522,3.03516 3.03516,3.03516 1.74994,0 3.03516,-1.28522 3.03516,-3.03516 0,-1.01789 0.40216,-1.95525 1.00586,-2.67969 0.6037,-0.72444 1.44822,-1.28515 2.45898,-1.28515 1.46823,0 2.53516,-1.21183 2.53516,-2.53516 0,-1.43282 -1.03922,-2.53516 -2.53516,-2.53516 z" />
- <path
- transform="matrix(0,-1,-1,0,90,450)"
- d="m 311,303.46484 c -1.5178,0 -2.53516,1.01736 -2.53516,2.53516 0,1.00544 -0.55221,1.85355 -1.27539,2.45898 -0.72317,0.60543 -1.66486,1.00586 -2.68945,1.00586 -1.74994,0 -3.03516,1.28522 -3.03516,3.03516 0,1.74994 1.28522,3.03516 3.03516,3.03516 1.74994,0 3.03516,-1.28522 3.03516,-3.03516 0,-1.01789 0.40216,-1.95525 1.00586,-2.67969 0.6037,-0.72444 1.44822,-1.28515 2.45898,-1.28515 1.46823,0 2.53516,-1.21183 2.53516,-2.53516 0,-1.43282 -1.03922,-2.53516 -2.53516,-2.53516 z"
- id="path35386"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#radialGradient35414);stroke-width:1.16590559;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:original="M 311 302.5 C 309 302.5 307.5 304 307.5 306 C 307.5 307.25 306.02069 308.5 304.5 308.5 C 302.25 308.5 300.5 310.25 300.5 312.5 C 300.5 314.75 302.25 316.5 304.5 316.5 C 306.75 316.5 308.5 314.75 308.5 312.5 C 308.5 311 309.75 309.5 311 309.5 C 313 309.5 314.5 307.84581 314.5 306 C 314.5 304.068 313 302.5 311 302.5 z "
- inkscape:radius="-0.96440691"
- sodipodi:type="inkscape:offset" />
- </g>
- <g
- style="opacity:0.12999998"
- id="g35388"
- transform="matrix(0.8692812,0,0,0.8692812,-279.33076,38.816971)">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path35390"
- style="fill:#ffd5d5;fill-opacity:0.58823529;fill-rule:nonzero;stroke:#530505;stroke-width:1.22792602;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.9361892,0,0,0.9375002,-26.576994,10.374973)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.7910044,0,0,0.7931859,-7.3995492,27.410355)"
- style="fill:none;stroke:url(#linearGradient35416);stroke-width:1.4523226;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path35392"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path35394"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient35418);stroke-width:1.78243256;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.644496,0,0,0.6462993,11.939574,44.742981)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- style="display:inline;opacity:0.9;enable-background:new"
- transform="matrix(0.8749996,0,0,0.8802811,-404.57262,-113.49608)"
- id="g35396">
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient35420);stroke-width:1.13942409;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35398"
- transform="translate(20)"
- cx="219.5"
- cy="292.5"
- r="4" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:url(#linearGradient35422);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.29032254;marker:none;enable-background:accumulate"
- id="path35400"
- transform="matrix(0.875,0,0,0.875,47.4375,36.5625)"
- cx="219.5"
- cy="292.5"
- r="4" />
- <circle
- transform="matrix(0.7060003,0,0,0.7060647,84.532933,85.976064)"
- id="path35402"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient35424);stroke-width:1.6138407;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="219.5"
- cy="292.5"
- r="4" />
- <circle
- transform="matrix(0.875,0,0,0.875,47.4375,36.5625)"
- id="path35404"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:url(#radialGradient35426);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.29032254;marker:none;enable-background:accumulate"
- cx="219.5"
- cy="292.5"
- r="4" />
- </g>
- </g>
- <g
- transform="translate(291,273.9804)"
- id="ICON_OUTLINER_DATA_META"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect35430"
- width="16"
- height="16"
- x="-202"
- y="135" />
- <g
- style="opacity:0.35"
- id="g35432"
- transform="matrix(0.8692812,0,0,0.8692812,-279.33076,38.816971)">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path35434"
- style="display:inline;overflow:visible;visibility:visible;fill:#f8dcdc;fill-opacity:0.58823529;fill-rule:nonzero;stroke:#580000;stroke-width:1.22792602;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(0.9361892,0,0,0.9375002,-26.576994,10.374973)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.7910044,0,0,0.7931859,-7.3995492,27.410355)"
- style="fill:none;stroke:url(#linearGradient35468);stroke-width:1.4523226;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path35436"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path35438"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient35470);stroke-width:1.78243256;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.644496,0,0,0.6462993,11.939574,44.742981)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- style="opacity:0.7"
- transform="matrix(0.857703,0,0,0.8577018,-4.235469,19.278753)"
- id="g35440">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.93272448;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -222.5,141.5 c 1.52069,0 2.97702,-1.62476 3,-2.5 0.0525,-1.99931 1.5,-3.5 3.5,-3.5 2,0 3.5,1.568 3.5,3.5 0,1.84581 -1.5,3.50326 -3.5,3.5 -0.8997,-0.001 -2.5,1.5 -2.5,3 0,2.25 -1.75,4 -4,4 -2.25,0 -4,-1.75 -4,-4 0,-2.25 1.75,-4 4,-4 z"
- id="path35442"
- sodipodi:nodetypes="cssssszzs"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:type="inkscape:offset"
- inkscape:radius="-0.48985747"
- inkscape:original="M 311 302.5 C 309 302.5 307.5 304 307.5 306 C 307.5 307.25 306.02069 308.5 304.5 308.5 C 302.25 308.5 300.5 310.25 300.5 312.5 C 300.5 314.75 302.25 316.5 304.5 316.5 C 306.75 316.5 308.5 314.75 308.5 312.5 C 308.5 311 309.75 309.5 311 309.5 C 313 309.5 314.5 307.84581 314.5 306 C 314.5 304.068 313 302.5 311 302.5 z "
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:url(#linearGradient35472);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.86598092;marker:none;enable-background:accumulate"
- id="path35444"
- d="m 311,302.99023 c -1.75507,0 -3.00977,1.2547 -3.00977,3.00977 0,0.81824 -0.46262,1.55558 -1.10546,2.09375 -0.64284,0.53817 -1.4902,0.89648 -2.38477,0.89648 -1.996,0 -3.50977,1.51377 -3.50977,3.50977 0,1.996 1.51377,3.50977 3.50977,3.50977 1.996,0 3.50977,-1.51377 3.50977,-3.50977 0,-0.88607 0.35723,-1.7322 0.89453,-2.37695 0.53729,-0.64476 1.27476,-1.11328 2.0957,-1.11328 1.72989,0 3.00977,-1.42935 3.00977,-3.00977 0,-1.67845 -1.2658,-3.00977 -3.00977,-3.00977 z"
- transform="translate(-527,-167)" />
- <path
- d="m 311,303.46484 c -1.5178,0 -2.53516,1.01736 -2.53516,2.53516 0,1.00544 -0.55221,1.85355 -1.27539,2.45898 -0.72317,0.60543 -1.66486,1.00586 -2.68945,1.00586 -1.74994,0 -3.03516,1.28522 -3.03516,3.03516 0,1.74994 1.28522,3.03516 3.03516,3.03516 1.74994,0 3.03516,-1.28522 3.03516,-3.03516 0,-1.01789 0.40216,-1.95525 1.00586,-2.67969 0.6037,-0.72444 1.44822,-1.28515 2.45898,-1.28515 1.46823,0 2.53516,-1.21183 2.53516,-2.53516 0,-1.43282 -1.03922,-2.53516 -2.53516,-2.53516 z"
- id="path35446"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#radialGradient35474);stroke-width:1.16590559;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:original="M 311 302.5 C 309 302.5 307.5 304 307.5 306 C 307.5 307.25 306.02069 308.5 304.5 308.5 C 302.25 308.5 300.5 310.25 300.5 312.5 C 300.5 314.75 302.25 316.5 304.5 316.5 C 306.75 316.5 308.5 314.75 308.5 312.5 C 308.5 311 309.75 309.5 311 309.5 C 313 309.5 314.5 307.84581 314.5 306 C 314.5 304.068 313 302.5 311 302.5 z "
- inkscape:radius="-0.96440691"
- sodipodi:type="inkscape:offset"
- transform="translate(-527,-167)" />
- <path
- sodipodi:type="inkscape:offset"
- inkscape:radius="-0.96440691"
- inkscape:original="M 311 302.5 C 309 302.5 307.5 304 307.5 306 C 307.5 307.25 306.02069 308.5 304.5 308.5 C 302.25 308.5 300.5 310.25 300.5 312.5 C 300.5 314.75 302.25 316.5 304.5 316.5 C 306.75 316.5 308.5 314.75 308.5 312.5 C 308.5 311 309.75 309.5 311 309.5 C 313 309.5 314.5 307.84581 314.5 306 C 314.5 304.068 313 302.5 311 302.5 z "
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#radialGradient35476);stroke-width:1.16590559;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35448"
- d="m 311,303.46484 c -1.5178,0 -2.53516,1.01736 -2.53516,2.53516 0,1.00544 -0.55221,1.85355 -1.27539,2.45898 -0.72317,0.60543 -1.66486,1.00586 -2.68945,1.00586 -1.74994,0 -3.03516,1.28522 -3.03516,3.03516 0,1.74994 1.28522,3.03516 3.03516,3.03516 1.74994,0 3.03516,-1.28522 3.03516,-3.03516 0,-1.01789 0.40216,-1.95525 1.00586,-2.67969 0.6037,-0.72444 1.44822,-1.28515 2.45898,-1.28515 1.46823,0 2.53516,-1.21183 2.53516,-2.53516 0,-1.43282 -1.03922,-2.53516 -2.53516,-2.53516 z"
- transform="matrix(0,-1,-1,0,90,450)" />
- </g>
- <g
- transform="matrix(0.8692812,0,0,0.8692812,-279.33076,38.816971)"
- id="g35450"
- style="opacity:0.12999998">
- <circle
- transform="matrix(0.9361892,0,0,0.9375002,-26.576994,10.374973)"
- style="fill:#ffd5d5;fill-opacity:0.58823529;fill-rule:nonzero;stroke:#530505;stroke-width:1.22792602;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path35452"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path35454"
- style="fill:none;stroke:url(#linearGradient35478);stroke-width:1.4523226;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.7910044,0,0,0.7931859,-7.3995492,27.410355)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.644496,0,0,0.6462993,11.939574,44.742981)"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient35480);stroke-width:1.78243256;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path35456"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- id="g35458"
- transform="matrix(0.8749996,0,0,0.8802811,-404.57262,-113.49608)"
- style="display:inline;opacity:0.9;enable-background:new">
- <circle
- transform="translate(20)"
- id="path35460"
- style="display:inline;overflow:visible;visibility:visible;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient35482);stroke-width:1.13942409;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="219.5"
- cy="292.5"
- r="4" />
- <circle
- transform="matrix(0.875,0,0,0.875,47.4375,36.5625)"
- id="path35462"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:url(#linearGradient35484);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.29032254;marker:none;enable-background:accumulate"
- cx="219.5"
- cy="292.5"
- r="4" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient35486);stroke-width:1.6138407;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35464"
- transform="matrix(0.7060003,0,0,0.7060647,84.532933,85.976064)"
- cx="219.5"
- cy="292.5"
- r="4" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:url(#radialGradient35488);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.29032254;marker:none;enable-background:accumulate"
- id="path35466"
- transform="matrix(0.875,0,0,0.875,47.4375,36.5625)"
- cx="219.5"
- cy="292.5"
- r="4" />
- </g>
- </g>
- <g
- id="ICON_MAT_SPHERE_SKY"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 3\sphere with sky.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <g
- id="g35479"
- transform="translate(30.046349,-38.039825)"
- style="display:inline;enable-background:new">
- <g
- transform="translate(-340.00002,-121.00001)"
- id="g35481">
- <circle
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#e9e9af;stroke-width:0.58333313;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35483"
- transform="matrix(1.7142856,0,0,1.7142871,-330.83199,-136.46043)"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- <circle
- transform="matrix(1.4285718,0,0,1.4285718,-198.61789,-81.960223)"
- id="path35485"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#e1e08e;stroke-width:0.69999987;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#adac2f;stroke-width:1.16666663;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35487"
- transform="matrix(0.8571429,0,0,0.8571429,66.810813,28.039828)"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- </g>
- <rect
- y="71.039841"
- x="123.95369"
- height="2"
- width="2"
- id="rect35489"
- style="display:inline;overflow:visible;visibility:visible;fill:#f4eed7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- style="opacity:0.6"
- transform="matrix(-1,0,0,1,194,-21)"
- id="g35439">
- <path
- style="display:inline;fill:url(#linearGradient35446);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- d="m 31.5,52.5 c -1.656,0 -3,1.343998 -3,3 0,0.02155 -4.53e-4,0.04106 0,0.0625 -1.138867,0.233417 -1.999999,1.229094 -2,2.4375 0,1.381035 1.120001,2.500001 2.5,2.5 h 6.5 c 1.656,0 3,-1.344001 3,-3 0,-1.656001 -1.344,-2.999999 -3,-3 -0.40365,0 -0.77337,0.105241 -1.125,0.25 C 34.035268,53.465989 32.89035,52.500001 31.5,52.5 Z"
- id="path34600"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path35419"
- style="display:inline;fill:url(#linearGradient35450);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- transform="matrix(0,0.3125,-0.3124999,0,68.374988,14.250001)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0,0.2187504,-0.2187496,0,54.562456,29.374947)"
- style="display:inline;fill:url(#linearGradient35448);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- id="path34624"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.08088095,0.3018518,-0.3018517,0.08088093,60.442218,8.1116116)"
- style="display:inline;fill:url(#linearGradient35452);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- id="path35435"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path35429"
- style="display:inline;fill:url(#linearGradient35454);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- transform="matrix(0,0.2812501,-0.2812497,0,64.937461,20.624986)"
- cx="132"
- cy="118"
- r="8" />
- <path
- sodipodi:type="inkscape:offset"
- inkscape:radius="-0.92788464"
- inkscape:original="M 31.5 52.5 C 29.844 52.5 28.5 53.843998 28.5 55.5 C 28.5 55.521551 28.499547 55.541057 28.5 55.5625 C 27.361133 55.795917 26.500001 56.791594 26.5 58 C 26.5 59.381035 27.620001 60.500001 29 60.5 L 35.5 60.5 C 37.156 60.5 38.5 59.155999 38.5 57.5 C 38.5 55.843999 37.156 54.500001 35.5 54.5 C 35.09635 54.5 34.72663 54.605241 34.375 54.75 C 34.035268 53.465989 32.89035 52.500001 31.5 52.5 z "
- style="display:inline;fill:none;stroke:url(#linearGradient35718);stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- id="path35703"
- d="m 31.5,53.427734 c -1.153957,0 -2.072266,0.918307 -2.072266,2.072266 0,0.03455 7.4e-5,0.04646 0,0.04297 a 0.92797743,0.92797743 0 0 1 -0.742187,0.927734 C 27.964996,56.618384 27.427735,57.232412 27.427734,58 c 0,0.879367 0.693848,1.572266 1.572266,1.572266 h 6.5 c 1.153956,0 2.072266,-0.918311 2.072266,-2.072266 0,-1.153957 -0.918309,-2.072265 -2.072266,-2.072266 -0.242369,0 -0.485183,0.06182 -0.771484,0.179688 a 0.92797743,0.92797743 0 0 1 -1.25,-0.619141 C 33.241204,54.091366 32.460566,53.427735 31.5,53.427734 Z" />
- </g>
- <rect
- y="31"
- x="152"
- height="16"
- width="16"
- id="rect34608"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.9059893,0,0,0.9161677,40.690483,-162.91268)"
- id="g34610"
- style="display:inline">
- <circle
- transform="matrix(0.6879625,0,0,0.6812035,38.104167,142.74297)"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.6033566;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path34612"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.6156869,-0.06867104,0.07017585,-0.6056363,201.96224,303.63852)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path34614"
- style="display:inline;opacity:0.8;fill:url(#linearGradient34618);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path34616"
- style="fill:none;stroke:url(#linearGradient34620);stroke-width:2.02934265;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.5436035,0,0,0.5381576,57.159565,159.63177)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MANIPUL"
- transform="translate(-20.999985)">
- <rect
- y="157"
- x="89.000015"
- height="16"
- width="16"
- id="rect36400"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g36402">
- <g
- transform="translate(8.000015,151)"
- style="display:inline;stroke:#1a1a1a;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"
- id="g36404">
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#00163c;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 88.999985,8 v 8"
- id="path36407"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36410"
- d="m 82.99997,20 6.000015,-4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#5d0606;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#183c00;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 94.99997,20 88.999985,16"
- id="path36412"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#5d0606;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect36414"
- width="2.0000153"
- height="2.0000069"
- x="89.999985"
- y="170"
- rx="0"
- ry="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#001e50;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect36416"
- width="2.0000153"
- height="2.0000069"
- x="96"
- y="158"
- rx="0"
- ry="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#4c8ff4;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 97,159 v 8"
- id="path36418"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36420"
- d="M 90.999985,171 97,167"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ef4e29;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <rect
- ry="0"
- rx="0"
- y="170"
- x="89.999985"
- height="2.0000069"
- width="2.0000153"
- id="rect36422"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:#5d0606;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 90.499985,170.75 6,-4 1.5e-5,-7.25"
- id="path36424"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- ry="0"
- rx="0"
- y="170"
- x="102"
- height="2.0000069"
- width="2.0000153"
- id="rect36426"
- style="display:inline;overflow:visible;visibility:visible;fill:#acc373;fill-opacity:1;fill-rule:nonzero;stroke:#183c00;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#93e420;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 102.99998,171 97,167"
- id="path36428"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- ry="0"
- rx="0"
- y="170"
- x="90"
- height="2"
- width="2"
- id="rect36430"
- style="display:inline;overflow:visible;visibility:visible;fill:#eb512e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.3499999;marker:none;enable-background:accumulate" />
- <rect
- ry="0"
- rx="0"
- y="158"
- x="96"
- height="2.0000069"
- width="2.0000153"
- id="rect36432"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:#001e50;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- ry="0"
- rx="0"
- y="158"
- x="96.000023"
- height="2"
- width="2"
- id="rect36434"
- style="display:inline;overflow:visible;visibility:visible;fill:#4c8ff4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.3499999;marker:none;enable-background:accumulate" />
- <circle
- style="display:inline;opacity:0.5;fill:url(#radialGradient36452);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- id="path36436"
- transform="matrix(1.3333333,0,0,1.3333343,3,147.66665)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="70.5"
- cy="14.5"
- r="1.5" />
- <circle
- transform="matrix(0.6666679,0,0,0.6666668,49.999915,157.33333)"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- id="path36438"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="70.5"
- cy="14.5"
- r="1.5" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#acc373;fill-opacity:1;fill-rule:nonzero;stroke:#183c00;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect36440"
- width="2.0000153"
- height="2.0000069"
- x="102"
- y="170"
- rx="0"
- ry="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#95e51f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.3499999;marker:none;enable-background:accumulate"
- id="rect36442"
- width="2"
- height="2"
- x="102.00002"
- y="170"
- rx="0"
- ry="0" />
- <g
- id="g36444"
- style="opacity:0.8">
- <path
- sodipodi:nodetypes="ccc"
- id="path36446"
- d="m 96.5,159.5 v -1 h 1"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient36454);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:none;stroke:url(#linearGradient36456);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 90.499985,171.5 v -1 h 1"
- id="path36448"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path36450"
- d="m 102.49999,171.5 v -1 h 1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:none;stroke:url(#linearGradient36458);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- transform="translate(105,337.99999)"
- id="ICON_LAMP_SPOT"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect35293"
- width="16"
- height="16"
- x="-210"
- y="-66"
- transform="scale(-1)" />
- <g
- id="g35295"
- transform="translate(22.999994,19)">
- <path
- inkscape:connector-curvature="0"
- id="path35297"
- d="m 178.00001,33.5 h -1.5 L 174,36 c -1.00699,1.006986 -0.0205,3.604505 2.1875,5.8125 2.208,2.207997 4.80551,3.194485 5.8125,2.1875 l 2.50001,-2.5 V 40 l -0.75,-1.75 -4,-4 z"
- style="fill:url(#linearGradient36648);fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="cccscccccc" />
- <path
- inkscape:connector-curvature="0"
- id="path35299"
- style="fill:url(#linearGradient36650);fill-rule:evenodd;stroke:none"
- d="m 186.50001,35.5 -2.75,2.75 -1,-1 -1,-1 -1,-1 -1,-1 2.75,-2.75 h 1.25 l 1.5,1.25 1.25,1.5 z"
- sodipodi:nodetypes="ccccccccccc" />
- <path
- inkscape:connector-curvature="0"
- id="path35301"
- d="m 182.50001,31.5 -2.75,2.75 -1.75,-0.75 h -1.5 L 174,36 c -1.00699,1.006986 -0.0205,3.604505 2.1875,5.8125 2.208,2.207997 4.80551,3.194485 5.8125,2.1875 l 2.50001,-2.5 V 40 l -0.75,-1.75 2.75,-2.75 v -1 l -1.25,-1.75 -1.75,-1.25 z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cccccsccccccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccc"
- style="fill:none;stroke:url(#linearGradient36652);stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 174.75001,36.5 2.25,-2.25 1.5,0.25 1.5,0.75 1.5,1.25 1.25,1.5 0.75,1.5 0.25,1.5 -1.5,1.5"
- id="path35303" />
- <path
- sodipodi:type="arc"
- style="display:inline;overflow:visible;visibility:visible;fill:#d3c656;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74147779;marker:none;enable-background:accumulate"
- id="path35305"
- sodipodi:cx="181"
- sodipodi:cy="35"
- sodipodi:rx="1.2111344"
- sodipodi:ry="4.9951267"
- d="m 182.21113,35 a 1.2111344,4.9951267 0 0 1 -1.21048,4.995126 1.2111344,4.9951267 0 0 1 -1.21178,-4.989795 1.2111344,4.9951267 0 0 1 1.20919,-5.000451 1.2111344,4.9951267 0 0 1 1.21307,4.984458"
- transform="matrix(1.2491741,-1.2491602,0.7680871,0.768079,-75.108556,239.34027)"
- sodipodi:start="0"
- sodipodi:end="6.2810509"
- sodipodi:open="true" />
- <ellipse
- transform="matrix(0.9589476,-0.9192618,0.5776079,0.5780619,-15.42366,185.77921)"
- id="path35307"
- style="display:inline;overflow:visible;visibility:visible;fill:#f3eebb;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74147779;marker:none;enable-background:accumulate"
- cx="181"
- cy="35"
- rx="1.1763829"
- ry="5.5293522" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="czs"
- style="opacity:0.8;fill:none;stroke:url(#linearGradient36654);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 182.25,43.75 C 182.25,42 182,41 179.5,38.5 177,36 175.75,35.75 174.25,35.75"
- id="path35309" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient36656);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 180.50001,34.5 2,-2 h 1 l 1,1 1,1 v 1 l -2,2"
- id="path35311"
- sodipodi:nodetypes="ccccccc" />
- <path
- inkscape:connector-curvature="0"
- id="path35313"
- d="m 184.50001,41.5 c 0,-1.75 0,-3 -2.5,-5.5 -2.5,-2.5 -4,-2.5 -5.5,-2.5"
- style="fill:none;stroke:url(#linearGradient36658);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="czs" />
- </g>
- <g
- id="g35315"
- style="opacity:0.65">
- <g
- id="g35317"
- transform="translate(21,21)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- style="display:inline;fill:none;stroke:#2b2600;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 174.5,40.5 v 3 h 3"
- id="path35319" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cz"
- id="path35321"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b2600;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 175.5,42.5 179,39" />
- </g>
- <g
- transform="rotate(180,191.5,58)"
- id="g35323">
- <g
- style="display:inline"
- transform="rotate(180,136.08065,77.999995)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g35325">
- <path
- inkscape:connector-curvature="0"
- d=""
- sodipodi:nodetypes="cz"
- id="path35327"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cz"
- id="path35329"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:none;stroke:#f4f1d7;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 85.6613,103.49999 5,-5" />
- </g>
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#fffbd5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate"
- d="m 188,51 v 4 h -1 v -3 h -3 v -1 z"
- id="path35331"
- sodipodi:nodetypes="ccccccc" />
- <g
- id="g35333"
- style="opacity:0.2"
- transform="matrix(-1,0,0,1,-29,-335)">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#b5a731;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- id="path35335"
- sodipodi:nodetypes="ccccccc" />
- </g>
- </g>
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect35337"
- width="1.25"
- height="1.25"
- x="200.75"
- y="58" />
- <rect
- y="58.75"
- x="199.75"
- height="1.5"
- width="1.5"
- id="rect35339"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect35341"
- width="1.5"
- height="1.5"
- x="198.75"
- y="59.75" />
- </g>
- <g
- id="ICON_LAMP_POINT"
- transform="translate(0,-7e-6)">
- <rect
- transform="scale(-1)"
- y="-404"
- x="-273"
- height="16"
- width="16"
- id="rect35345"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- mask="url(#mask31861)"
- id="g35347"
- transform="translate(63,338)"
- style="opacity:0.65">
- <g
- id="g35349"
- transform="rotate(-90,126.58066,22.580645)"
- style="stroke:#9e872a;stroke-opacity:1">
- <path
- inkscape:connector-curvature="0"
- id="path35351"
- d="M 187.5,53.75 V 51.5 h -2"
- style="display:inline;fill:none;stroke:#2b2600;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- sodipodi:nodetypes="ccc"
- transform="rotate(90,116.08066,33.080645)" />
- <path
- inkscape:connector-curvature="0"
- d="m 85.6613,103.49999 5.5,-5.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b2600;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35353"
- sodipodi:nodetypes="cz"
- transform="rotate(-90,91.1613,97.99999)" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- style="display:inline;fill:none;stroke:#2b2600;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 187.5,53.5 v -2 h -2"
- id="path35355"
- transform="rotate(-90,156.08064,122.91935)" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cz"
- id="path35357"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b2600;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 85.6613,103.49999 5.5,-5.5"
- transform="rotate(90,91.1613,97.99999)" />
- <path
- inkscape:connector-curvature="0"
- id="path35359"
- d="m 187.5,53.5 v -2 h -2"
- style="display:inline;fill:none;stroke:#2b2600;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- sodipodi:nodetypes="ccc"
- transform="translate(-89.8387,39.99999)" />
- <path
- inkscape:connector-curvature="0"
- d="m 85.6613,103.49999 5.5,-5.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b2600;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35361"
- sodipodi:nodetypes="cz"
- transform="rotate(180,91.1613,97.99999)" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- style="display:inline;fill:none;stroke:#2b2600;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 187.5,53.5 v -2 h -2"
- id="path35363"
- transform="rotate(180,136.08065,77.999995)" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cz"
- id="path35365"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b2600;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 85.6613,103.49999 5.5,-5.5" />
- </g>
- <g
- id="g35367"
- transform="translate(21)">
- <g
- id="g35369"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="rotate(180,136.08065,77.999995)"
- style="display:inline">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35371"
- sodipodi:nodetypes="cz"
- d="" />
- <path
- inkscape:connector-curvature="0"
- d="m 85.6613,103.49999 5.5,-5.5"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:none;stroke:#f4f1d7;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35373"
- sodipodi:nodetypes="cz" />
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- id="path35375"
- d="m 188,51 v 3 h -1 v -2 h -2 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#fffbd5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(-1,0,0,1,-29,-335)"
- style="opacity:0.3"
- id="g35377">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- id="path35379"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#2b2600;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- transform="rotate(180,191.5,58)"
- id="g35381">
- <g
- style="display:inline"
- transform="rotate(180,136.08065,77.999995)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g35383">
- <path
- inkscape:connector-curvature="0"
- d=""
- sodipodi:nodetypes="cz"
- id="path35385"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cz"
- id="path35387"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:none;stroke:#f4f1d7;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 85.6613,103.49999 5.5,-5.5" />
- </g>
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#fffbd5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate"
- d="m 188,51 v 3 h -1 v -2 h -2 v -1 z"
- id="path35391"
- sodipodi:nodetypes="ccccccc" />
- <g
- id="g35393"
- style="opacity:0.3"
- transform="matrix(-1,0,0,1,-29,-335)">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#2b2600;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- id="path35395"
- sodipodi:nodetypes="ccccccc" />
- </g>
- </g>
- <g
- id="g35398"
- inkscape:transform-center-x="3.125"
- inkscape:transform-center-y="-3.125"
- transform="rotate(-90,191.5,47.5)">
- <g
- id="g35400"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="rotate(180,136.08065,77.999995)"
- style="display:inline">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35405"
- sodipodi:nodetypes="cz"
- d="" />
- <path
- inkscape:connector-curvature="0"
- d="m 85.6613,103.49999 5.5,-5.5"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:none;stroke:#f4f1d7;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35407"
- sodipodi:nodetypes="cz" />
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- id="path35409"
- d="m 188,51 v 3 h -1 v -2 h -2 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#fffbd5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(-1,0,0,1,-29,-335)"
- style="opacity:0.3"
- id="g35411">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- id="path35413"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#2b2600;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- id="g35415"
- transform="translate(-16)">
- <path
- inkscape:connector-curvature="0"
- d="M 223.5,63.5 218,58"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:none;stroke:#f4f1d7;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35417"
- sodipodi:nodetypes="cz" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#fffbd5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate"
- d="m 225,65 h -3 v -1 h 2 v -2 h 1 z"
- id="path35420"
- sodipodi:nodetypes="ccccccc" />
- <g
- id="g35422"
- style="opacity:0.3"
- transform="matrix(0,-1,-1,0,611,-152)">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#2b2600;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- id="path35424"
- sodipodi:nodetypes="ccccccc" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(139.00002,324)"
- id="g35426">
- <g
- id="g35429"
- transform="translate(-340.00002,-121.00001)">
- <circle
- transform="matrix(1.9999998,0,0,2.0000014,-462.99991,-192.00026)"
- id="path35431"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#e9ddaf;stroke-width:0.49999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#e1d18e;fill-opacity:1;fill-rule:nonzero;stroke:#fffc28;stroke-width:0.38888648;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35433"
- transform="matrix(2.5714449,0,0,2.5714449,-728.43612,-302.00313)"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- <circle
- transform="matrix(1.9999748,0,0,1.9999748,-462.98824,-191.99513)"
- id="path35437"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#e1d98e;fill-opacity:1;fill-rule:nonzero;stroke:#f0d700;stroke-width:0.50000638;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- <circle
- transform="matrix(1.428566,0,0,1.428566,-197.56891,-81.998957)"
- id="path35439"
- style="display:inline;overflow:visible;visibility:visible;fill:#fbf7e5;fill-opacity:1;fill-rule:nonzero;stroke:#474213;stroke-width:0.63000238;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- </g>
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect35441"
- width="2"
- height="2"
- x="264"
- y="395" />
- </g>
- <g
- transform="translate(147,337.99999)"
- id="ICON_LAMP_SUN"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffe680;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;enable-background:accumulate"
- id="rect35445"
- width="16"
- height="16"
- x="131"
- y="50" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccccccccccccccccccccccc"
- id="path35447"
- d="m 144.5,63.5 h -1 l -2.5,-1 -1.5,3 h -1 l -1.5,-3 -2.5,1 -1,10e-7 V 62.5 l 1,-2.5 -3,-1.5 v -1 l 3,-1.5 -1,-2.5 v -1 h 1 l 2.5,1 1.5,-3 h 1 l 1.5,3 2.5,-1 h 1 v 1 l -1,2.5 3,1.5 v 1 l -3,1.5 1,2.5 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:#f5efb2;fill-opacity:0.58823529;fill-rule:nonzero;stroke:#38330e;stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <g
- id="g35449">
- <circle
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#e9ddaf;stroke-width:0.49999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35451"
- transform="matrix(1.9999998,0,0,2.0000014,-790.00001,-327.00035)"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- <circle
- transform="matrix(2.5714622,0,0,2.5714622,-1055.4442,-437.00638)"
- id="path35453"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#fff6d5;stroke-width:0.38888386;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- <circle
- transform="matrix(2.0000089,0,0,2.0000089,-790.00413,-327.00163)"
- id="path35455"
- style="display:inline;overflow:visible;visibility:visible;fill:#b5a51f;fill-opacity:1;fill-rule:nonzero;stroke:#463f00;stroke-width:0.39999822;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#ffed55;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect35457"
- width="5"
- height="5"
- x="136"
- y="55"
- rx="2.5"
- ry="2.5" />
- <rect
- ry="1.875"
- rx="1.875"
- y="55.25"
- x="136.25"
- height="3.75"
- width="3.75"
- id="rect35459"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#fbfaef;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="56"
- x="137"
- height="2"
- width="2"
- id="rect35461"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- transform="translate(189,295.99999)"
- id="ICON_LAMP_AREA"
- style="display:inline;enable-background:new">
- <rect
- y="92"
- x="152"
- height="16"
- width="16"
- id="rect35465"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g35467"
- transform="matrix(1.6519496,0,0,1.6519309,-230.47015,-63.200317)"
- style="display:inline;opacity:0.25;filter:url(#filter30564);enable-background:new"
- clip-path="url(#clipPath31849)">
- <circle
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#e1d18e;fill-opacity:1;fill-rule:nonzero;stroke:#fff6aa;stroke-width:0.26988116;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path35469"
- transform="matrix(2.2376043,0,0,2.2484492,-801.20081,-335.84886)"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- <circle
- transform="matrix(1.9004611,0,0,1.899214,-644.62036,-268.6269)"
- id="path35471"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:#e1d18e;fill-opacity:1;fill-rule:nonzero;stroke:#ffe400;stroke-width:0.31863192;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- <circle
- transform="matrix(1.5591172,0,0,1.559203,-486.06699,-203.16445)"
- id="path35473"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffeeaa;fill-opacity:1;fill-rule:nonzero;stroke:#b4b200;stroke-width:0.38825312;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- </g>
- <g
- id="g35477"
- style="opacity:0.6"
- transform="translate(-55,-1)">
- <g
- id="g35480">
- <path
- inkscape:connector-curvature="0"
- id="path35482"
- d="m 219.5,102 v 4.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b2600;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path35484"
- d="m 221.75,105.25 -2.25,2.25 -2.25,-2.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b2600;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="g35486">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:none;stroke:#f4f1d7;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 219.5,101.5 V 107"
- id="path35488"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:#ffffd5;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 221.75,105.25 -2.25,2.25 -2.25,-2.25"
- id="path35490"
- sodipodi:nodetypes="ccc" />
- </g>
- </g>
- <g
- style="opacity:0.6"
- id="g35493"
- transform="rotate(90,192.5,68.5)">
- <g
- id="g35496">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b2600;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 219.5,102 v 4.5"
- id="path35498" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b2600;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 221.75,105.25 -2.25,2.25 -2.25,-2.25"
- id="path35500"
- sodipodi:nodetypes="ccc" />
- </g>
- <g
- id="g35502">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path35504"
- d="M 219.5,101.5 V 107"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:none;stroke:#f4f1d7;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path35506"
- d="m 221.75,105.25 -2.25,2.25 -2.25,-2.25"
- style="fill:none;stroke:#ffffd5;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- </g>
- <g
- id="g35508"
- style="display:inline;opacity:0.65;enable-background:new"
- transform="translate(-41,41)">
- <g
- id="g35510"
- transform="translate(21,21)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- style="display:inline;fill:none;stroke:#2b2600;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 174.5,40.5 v 3 h 3"
- id="path35512" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cz"
- id="path35514"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b2600;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 175.5,42.5 5.75,-5.75" />
- </g>
- <g
- transform="rotate(180,191.5,58)"
- id="g35516">
- <g
- style="display:inline"
- transform="rotate(180,136.08065,77.999995)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g35518">
- <path
- inkscape:connector-curvature="0"
- d=""
- sodipodi:nodetypes="cz"
- id="path35520"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cz"
- id="path35522"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:none;stroke:#f4f1d7;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 85.6613,103.49999 6.25,-6.25" />
- </g>
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#fffbd5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate"
- d="m 188,51 v 4 h -1 v -3 h -3 v -1 z"
- id="path35524"
- sodipodi:nodetypes="ccccccc" />
- <g
- id="g35526"
- style="opacity:0.2"
- transform="matrix(-1,0,0,1,-29,-335)">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#b5a731;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- id="path35528"
- sodipodi:nodetypes="ccccccc" />
- </g>
- </g>
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path35530"
- d="m 161.5,95.5 3,3"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#e1d18e;fill-opacity:1;fill-rule:nonzero;stroke:#ffeeaa;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;filter:url(#filter30556);enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:#ffdd55;fill-opacity:1;fill-rule:nonzero;stroke:#ffed55;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;filter:url(#filter30552);enable-background:accumulate"
- d="m 161.5,94.5 4,4"
- id="path35532"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path35534"
- d="m 161.5,93.5 5,5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#5a5310;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#fbf7e5;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 161.5,93.5 5,5"
- id="path35536"
- sodipodi:nodetypes="cc" />
- </g>
- <g
- transform="translate(168,274.99999)"
- id="ICON_LAMP_HEMI"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect35540"
- width="16"
- height="16"
- x="152"
- y="113.00001" />
- <g
- id="g35542"
- transform="translate(-21,21.000005)">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.12000002;fill:#fff6aa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;marker:none;filter:url(#filter30544);enable-background:accumulate"
- d="m 177,94.75 c 0,0 -0.47556,3.774441 2.5,6.75 2.97556,2.97556 7,2.5 7,2.5 3.44436,-0.63991 2.99995,-3.42845 0.0937,-4.5 -1.83387,-3.557342 -2.66053,-4.290113 -5.09375,-5.09375 -0.64623,-3.372957 -3.91818,-2.771894 -4.5,0.34375 z"
- id="path35544"
- sodipodi:nodetypes="cscccc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.17000002;fill:#ffed55;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;filter:url(#filter30580);enable-background:accumulate"
- d="m 179.15625,93.71875 c 0,0 -0.3702,1.0264 -0.21875,2.1875 0.15145,1.1611 0.76936,2.613109 2.15625,4 1.38689,1.38689 2.8389,2.0048 4,2.15625 1.1611,0.15145 2.1875,-0.21875 2.1875,-0.21875 1.01828,-0.43147 1.49397,-1.60672 1.0625,-2.625 l -5.65501,-5.846474 c -1.32148,-1.409979 -2.40864,-0.889298 -3.53249,0.346474 z"
- id="path35546"
- sodipodi:nodetypes="cssscccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cssscccc"
- id="path35548"
- d="m 179.15625,93.71875 c 0,0 -0.3702,1.0264 -0.21875,2.1875 0.15145,1.1611 0.76936,2.613109 2.15625,4 1.38689,1.38689 2.8389,2.0048 4,2.15625 1.1611,0.15145 2.1875,-0.21875 2.1875,-0.21875 1.01828,-0.43147 1.49397,-1.60672 1.0625,-2.625 l -5.65501,-5.846474 c -1.32148,-1.409979 -2.40864,-0.889298 -3.53249,0.346474 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.18000004;fill:#fff6aa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;filter:url(#filter30580);enable-background:accumulate"
- transform="matrix(0.5121167,0,0,0.5121167,89.625148,47.477443)" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#5a5310;stroke-width:3.0999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 176.5,93.5 c 0,0 5.75,-0.25 8.5,2.5 2.75,2.75 2.5,8.5 2.5,8.5"
- id="path35550"
- sodipodi:nodetypes="czs" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="czs"
- id="path35552"
- d="m 176.5,93.5 c 0,0 5.75,-0.25 8.5,2.5 3,3 2.5,8.5 2.5,8.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#fbf7e5;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="g35554"
- style="display:inline;opacity:0.65;enable-background:new"
- transform="translate(-42,63.000005)">
- <g
- id="g35556"
- transform="translate(21,21)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- style="display:inline;fill:none;stroke:#2b2600;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 174.5,40.5 v 3 h 3"
- id="path35558" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cz"
- id="path35561"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b2600;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 175.5,42.5 6.25,-6.25" />
- </g>
- <g
- transform="rotate(180,191.5,58)"
- id="g35563">
- <g
- style="display:inline"
- transform="rotate(180,136.08065,77.999995)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g35566">
- <path
- inkscape:connector-curvature="0"
- d=""
- sodipodi:nodetypes="cz"
- id="path35568"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cz"
- id="path35570"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:none;stroke:#f4f1d7;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 85.6613,103.49999 7,-7" />
- </g>
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#fffbd5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate"
- d="m 188,51 v 4 h -1 v -3 h -3 v -1 z"
- id="path35572"
- sodipodi:nodetypes="ccccccc" />
- <g
- id="g35574"
- style="opacity:0.2"
- transform="matrix(-1,0,0,1,-29,-335)">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#b5a731;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- id="path35576"
- sodipodi:nodetypes="ccccccc" />
- </g>
- </g>
- </g>
- </g>
- <g
- id="ICON_ASSET_MANAGER"
- transform="translate(41.84997,0.15003049)">
- <g
- transform="translate(105,416)"
- id="g36297">
- <g
- id="g36211"
- transform="translate(194.04507,17.48225)">
- <path
- sodipodi:nodetypes="ccccc"
- id="path36215"
- d="m 90.45451,103.98095 v 7 l 7.00045,0.0368 v -7 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:none;stroke:#333333;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:0.15686275;fill-rule:evenodd;stroke:#e6e6e6;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 90.45451,103.98095 4.5e-4,7.03677 h 7 l -4.5e-4,-7.03677 z"
- id="path36228"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="127.49997"
- x="290.50015"
- height="3"
- width="2.9998772"
- id="rect36230"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect36232"
- width="2.9998772"
- height="3"
- x="282.49982"
- y="119.5"
- ry="1.4999386"
- rx="1.4999386" />
- <rect
- rx="1.4999386"
- ry="1.4999386"
- y="127.49997"
- x="282.50015"
- height="3"
- width="2.9998772"
- id="rect36234"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 293.0003,127.99997 c -0.6694,0 -1.3388,10e-6 -2.0082,10e-6 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- id="path36237"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36239"
- d="m 285.00045,128 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36241"
- d="m 285,120 c -0.6694,0 -1.3388,1e-5 -2.0082,1e-5 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-10e-6 2.0082,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect36243"
- width="2.9998772"
- height="3"
- x="290.49988"
- y="119.49997"
- ry="1.4999386"
- rx="1.4999386" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36245"
- d="m 293.00003,119.99997 c -0.6694,0 -1.3388,10e-6 -2.0082,10e-6 0,0.66939 0,1.33877 0,2.00817 0.6694,0 1.3388,-1e-5 2.0082,-1e-5 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect36312"
- width="16"
- height="16"
- x="383"
- y="535" />
- <g
- id="g36314"
- transform="translate(334.99992,111)">
- <rect
- y="429.54614"
- x="48.499996"
- height="9.9538488"
- width="10.000013"
- id="rect36316"
- style="display:inline;overflow:visible;visibility:visible;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- ry="0" />
- <rect
- ry="0"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient36468);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00207269;marker:none;enable-background:accumulate"
- id="rect36318"
- width="9.0000706"
- height="9.0003176"
- x="49.000011"
- y="430" />
- <path
- sodipodi:nodetypes="ccccccccccccccccccccccccc"
- id="path36320"
- d="m 49,430 v 3 h 3 v -3 z m 3,3 v 3 h 3 v -3 z m 3,0 h 3 v -3 h -3 z m 3,3 h -3 v 3 h 3 z m -6,3 v -3 h -3 v 3 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient36470);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path36324"
- d="m 57.50001,430.49999 -8.000011,10e-6 1.1e-5,7.99999 h 8 L 57.499999,430.5"
- style="fill:none;stroke:url(#linearGradient36472);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_VERTEXSEL">
- <g
- transform="translate(69,-158)"
- id="g35729"
- style="display:inline;opacity:0.55">
- <rect
- y="336"
- x="-64"
- height="16"
- width="16"
- id="rect35731"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g35733"
- transform="translate(1)">
- <g
- id="g35735"
- transform="translate(-386,446.5)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="fill:#552200;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 329.5,-108.25 -5.5,2 v 6.75 l 5.5,3 5.5,-3 v -6.75 z"
- id="path35737" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path35739"
- d="m 324,-99.5 v -7 l 6,-1.75 v 11.5 l -0.5,0.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#c9c9c9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06898749px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccccc" />
- <g
- id="g35741"
- transform="translate(179,-179)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- id="path35743"
- d="m 156,79.5 v -7 l -5,-1.75 v 11.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89401144px;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- id="path35745"
- d="m 145,72.5 5.5,-2 5.5,2 -5.5,2.5 z"
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- id="path35747"
- d="m 334.5,-106.5 v 6.75 l -5,2.75 -5,-2.75 v -6.75"
- style="fill:none;stroke:url(#linearGradient36713);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- </g>
- <rect
- y="342"
- x="-57"
- height="7.75"
- width="1"
- id="rect35749"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient36715);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path35751"
- d="m -61,340.65468 c 0,0 4.5,2 4.5,2 l 4.5,-2"
- style="fill:none;stroke:url(#linearGradient36717);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.12000002;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37868-0"
- width="3.9785564"
- height="4"
- x="7.0214434"
- y="181" />
- <g
- id="g35803">
- <path
- inkscape:connector-curvature="0"
- id="path35805"
- d="m 8.0048608,180.50566 h 0.036785 c 0.8181814,0 1.476865,0.66665 1.476865,1.49473 v 1.2e-4 c 0,0.82808 -0.6586836,1.49472 -1.476865,1.49472 h -0.036785 c -0.8181897,0 -1.4768733,-0.66664 -1.4768733,-1.49472 v -1.2e-4 c 0,-0.82808 0.6586836,-1.49473 1.4768733,-1.49473 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#542b00;stroke-width:1.495;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path35807"
- d="m 9.0203881,181.00394 c -0.6673195,0 -1.334639,1e-5 -2.0019585,1e-5 0,0.66706 0,1.33411 0,2.00119 0.6673195,0 1.334639,-1e-5 2.0019585,-1e-5 0,-0.66707 0,-1.33413 0,-2.00119 z"
- style="display:inline;fill:#ffc17d;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- </g>
- </g>
- <g
- id="ICON_EDGESEL">
- <g
- style="display:inline;opacity:0.55"
- id="g35753"
- transform="translate(90,-158)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect35755"
- width="16"
- height="16"
- x="-64"
- y="336" />
- <g
- transform="translate(1)"
- id="g35757">
- <g
- transform="translate(-386,446.5)"
- id="g35759">
- <path
- inkscape:connector-curvature="0"
- id="path35761"
- d="m 329.5,-108.25 -5.5,2 v 6.75 l 5.5,3 5.5,-3 v -6.75 z"
- style="fill:#552200;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#c9c9c9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06898749px;marker:none;enable-background:accumulate"
- d="m 324,-99.5 v -7 l 6,-1.75 v 11.5 l -0.5,0.25 z"
- id="path35763"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <g
- transform="translate(179,-179)"
- id="g35765">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89401144px;marker:none;enable-background:accumulate"
- d="m 156,79.5 v -7 l -5,-1.75 v 11.5 z"
- id="path35767"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 145,72.5 5.5,-2 5.5,2 -5.5,2.5 z"
- id="path35769" />
- </g>
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient36719);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 334.5,-106.5 v 6.75 l -5,2.75 -5,-2.75 v -6.75"
- id="path35772"
- sodipodi:nodetypes="ccccc" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient36721);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- id="rect35774"
- width="1"
- height="7.75"
- x="-57"
- y="342" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient36723);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -61,340.65468 c 0,0 4.5,2 4.5,2 l 4.5,-2"
- id="path35776"
- sodipodi:nodetypes="ccc" />
- </g>
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.12000002;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37868-0-4"
- width="3.0000007"
- height="8"
- x="28"
- y="182" />
- <g
- transform="translate(65.984093,-55.50004)"
- id="g35809">
- <rect
- transform="skewY(0.00121619)"
- y="237.00038"
- x="-38.454918"
- height="8.0116062"
- width="1.9820247"
- id="rect35811"
- style="display:inline;fill:none;stroke:#542b00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:0.90196078"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;fill:#ffc17d;fill-opacity:1;fill-rule:nonzero"
- id="rect35814"
- width="0.99999994"
- height="7.0000257"
- x="-37.984093"
- y="237.50137"
- transform="skewY(0.00210615)" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:none;stroke:#462400;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1"
- d="m -37.5,245 -0.9549,0.0112 v -8.01161 l 1.982,4e-5"
- id="path35816"
- sodipodi:nodetypes="cccc" />
- </g>
- </g>
- <g
- id="ICON_FACESEL">
- <g
- transform="translate(111,-158)"
- id="g35778"
- style="display:inline;opacity:0.55">
- <rect
- y="336"
- x="-64"
- height="16"
- width="16"
- id="rect35780"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g35782"
- transform="translate(1)">
- <g
- id="g35785"
- transform="translate(-386,446.5)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="fill:#552200;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 329.5,-108.25 -5.5,2 v 6.75 l 5.5,3 5.5,-3 v -6.75 z"
- id="path35787" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path35789"
- d="m 324,-99.5 v -7 l 6,-1.75 v 11.5 l -0.5,0.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#c9c9c9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06898749px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccccc" />
- <g
- id="g35791"
- transform="translate(179,-179)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- id="path35793"
- d="m 156,79.5 v -7 l -5,-1.75 v 11.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89401144px;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- id="path35795"
- d="m 145,72.5 5.5,-2 5.5,2 -5.5,2.5 z"
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- id="path35797"
- d="m 334.5,-106.5 v 6.75 l -5,2.75 -5,-2.75 v -6.75"
- style="fill:none;stroke:url(#linearGradient36725);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- </g>
- <rect
- y="342"
- x="-57"
- height="7.75"
- width="1"
- id="rect35799"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient36727);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path35801"
- d="m -61,340.65468 c 0,0 4.5,2 4.5,2 l 4.5,-2"
- style="fill:none;stroke:url(#linearGradient36729);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37868-0-4-8"
- width="3.0000007"
- height="7.25"
- x="54"
- y="185" />
- <g
- id="g35818"
- style="display:inline;fill:#ffeeaa"
- transform="translate(-1080.9861,-256)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffb769;fill-opacity:1;fill-rule:nonzero;stroke:#542b00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:0.8627451;marker:none;enable-background:accumulate"
- d="m 1130.4859,445.25 v -7.5 l 6,2.75 v 8 z"
- id="path35820"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path35822"
- d="m 1136.4859,448.5 -6,-3.25 v -7.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#462400;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccc" />
- </g>
- </g>
- <g
- transform="matrix(-1,0,0,1,532,25)"
- id="ICON_PLAY_REVERSE"
- style="display:inline">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect37388"
- width="16"
- height="16"
- x="343"
- y="195" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(-2.196282,0,0,1.316799,1208.5661,-118.9575)"
- id="g37390"
- style="display:inline">
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path37392"
- d="m 392.96689,239.5639 h -0.56915 l -4.43932,4.36665 v 1.13912 l 4.43932,4.36665 0.56911,-1e-5 v -9.87242 0 z"
- style="fill:url(#linearGradient37396);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.58802557px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path37394"
- d="m 392.51157,247.91748 v -7.59417 l -4.09783,3.98695 v 0.3797"
- style="fill:none;stroke:url(#linearGradient37398);stroke-width:0.58802563px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_STYLUS_PRESSURE"
- transform="matrix(0,1,1,0,248,835)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#909090;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect38783"
- width="16"
- height="16"
- x="-259"
- y="72" />
- <path
- sodipodi:nodetypes="csasc"
- id="path38785"
- d="m -257.5,83.5 h 2 c 2,0 2.50929,2 4,2 1.49071,0 2,-2 4,-2 h 2"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#001c46;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#aaccff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -257.5,83.5 h 2 c 2,0 2.50929,2 4,2 1.49071,0 2,-2 4,-2 h 2"
- id="path38787"
- sodipodi:nodetypes="csasc"
- inkscape:connector-curvature="0" />
- <g
- style="display:inline;enable-background:new"
- transform="matrix(1,0,0,-1,-235,265)"
- id="g38789">
- <path
- transform="translate(-1,2)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -16,180 v 6 h -1 v -1.75 l -1,1.75 v 1.5 l 2,2.5 h 6 l 1,-2 v -3.25 L -9.75,184 H -10 v 1 h -1 v -1 l -0.75,-0.75 H -12 V 185 h -1 v -1.5 l -0.75,-1 H -14 v 2.5 h -1 v -5 z"
- id="path38791"
- sodipodi:nodetypes="cccccccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <g
- id="g38794"
- transform="translate(-1,2)">
- <path
- sodipodi:nodetypes="ccccccccccccccccccccccccccc"
- id="path38796"
- d="m -16,179.5 v 6.5 h -1 v -2 h -0.25 l -0.75,2 v 1.5 l 2,2.5 h 6 l 1,-2 v -3.25 L -9.75,184 H -10 v 1 h -1 v -1 l -0.75,-0.75 H -12 V 185 h -1 v -1.5 l -0.75,-1 H -14 v 2.5 h -1 v -5.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient39048);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;marker:none;enable-background:accumulate"
- d="m -15,187 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z m 2,0 v 1 h 1 v -1 z"
- id="path38799"
- sodipodi:nodetypes="ccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path38801"
- d="m -15,185 v 1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;marker:none;enable-background:accumulate"
- d="m -13,185 v 1 h 1 v -1 z"
- id="path38803"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path38805"
- d="m -11,185 v 1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient39050);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;marker:none;enable-background:accumulate"
- d="m -18,186 v 1 h 1 v -3 h -0.25 z"
- id="path38807"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path38810"
- d="m -17.25,187.5 1.5,2 h 5.25 l 1,-2 V 187"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient39052);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;marker:none;enable-background:accumulate"
- d="m -14.00935,182.77669 v 1 h 1 v -1 z"
- id="path38819"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path38821"
- d="m -11.978216,183.55574 v 1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;marker:none;enable-background:accumulate"
- d="m -11.978216,183.55574 v 1 h 1 v -1 z"
- id="path38823"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path38825"
- d="m -16,180 v 1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MOD_SMOKE"
- transform="translate(-66,268)"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Pulpit\sss.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- y="-27"
- x="155"
- height="16"
- width="15.999955"
- id="rect39805"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#808000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:new" />
- <g
- style="display:inline;opacity:0.6;enable-background:new"
- id="g39807">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient39835-9);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="m 157.5,-26.5 c -1.10457,0 -2,0.895431 -2,2 0,1.104569 0.89543,2 2,2 0.0211,0 0.0415,6.5e-4 0.0625,0 0.005,0.02296 0.0259,0.03977 0.0312,0.0625 -0.63487,0.174633 -1.09375,0.747145 -1.09375,1.4375 0,0.828426 0.67157,1.5 1.5,1.5 0.69036,0 1.26287,-0.45888 1.4375,-1.09375 0.18381,0.04305 0.36556,0.09375 0.5625,0.09375 1.38071,0 2.5,-1.119289 2.5,-2.5 0,-1.380711 -1.11929,-2.5 -2.5,-2.5 -0.25351,0 -0.48817,0.05484 -0.71875,0.125 -0.32553,-0.663426 -0.9924,-1.125 -1.78125,-1.125 z"
- id="path39809"
- inkscape:connector-curvature="0" />
- <circle
- transform="matrix(0,0.1250004,0.1250004,0,143.24995,-37.50005)"
- style="display:inline;fill:url(#linearGradient39837-4);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- id="path39811"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path39813"
- style="display:inline;fill:url(#linearGradient39839-3);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- transform="matrix(0,0.25,0.2500001,0,130.49998,-56)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- transform="translate(45,-100)"
- id="g39815">
- <path
- style="fill:#214478;stroke:none"
- d="m 110.5,85.5 c 0,2.25 2,3 3.5,3 2.25,0 3.1933,-1.514034 4,-2.5 l 4.5,-5.5 h 3 v -2 h -4 L 116,84 114.75,82.5 h -3.25 l -1,1 z"
- id="path39817"
- sodipodi:nodetypes="cszccccccccz"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cszccccccccz"
- id="path39819"
- d="m 110.5,85.5 c 0,2.25 2,3 3.5,3 2.25,0 3.46788,-1.244422 4.25,-2.25 L 120,84 l -2,-2 -1.5,1.5 h -1 v -1 l -1,-1 h -3 l -1,1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient39841-3);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cszccccccccccccccccz"
- id="path39821"
- d="m 110.5,85 c 0,2.25 1.5,3.5 3.75,3.5 2.25,0 3.50071,-1.469729 4.25,-2.5 l 4,-5.5 h 0.5 0.5 1 1 v -2 h -1 -1.11272 -0.88728 -1 l -5,5 h -1 v -1 l -1,-1 h -3 l -1,1 z"
- style="fill:none;stroke:#0b1728;stroke-width:0.80000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path39823"
- d="m 118,83 h 1 v 1 h 1 v -1 h -1 v -1 h -1 z"
- style="fill:url(#linearGradient39843-3);stroke-width:1px"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path39825"
- d="m 111.5,82.5 0.75818,0.763059 h 1.5 l 0.75,-0.75"
- style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round"
- inkscape:connector-curvature="0" />
- <rect
- y="82"
- x="112"
- height="1"
- width="2"
- id="rect39827"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#000000;stroke:none;stroke-width:0.80000001;marker:none;enable-background:new" />
- <rect
- y="83.5"
- x="115"
- height="1.4999981"
- width="0.99994147"
- id="rect39829"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:new" />
- <path
- sodipodi:nodetypes="cccc"
- id="path39831"
- d="m 124.5,79.5 h -3 l -5,5 H 116"
- style="opacity:0.4;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccsc"
- id="path39833"
- d="m 111.5,83.5 v 1.271428 c -0.0915,0.859266 0.18827,2.299909 2.00056,2.733557 3.70517,0.886581 6.00049,-3.943221 6.00049,-3.943221"
- style="fill:none;stroke:url(#linearGradient39845-2);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(-249,193)"
- id="ICON_MOD_PHYSICS"
- style="display:inline">
- <g
- style="opacity:0.85"
- id="g41507">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:url(#linearGradient41540);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- id="rect41509"
- width="7.8166504"
- height="3"
- x="-433.5"
- y="82"
- transform="scale(-1,1)" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient41542);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- id="rect41511"
- width="8.9931746"
- height="1"
- x="-434"
- y="83"
- transform="scale(-1,1)" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#333333;fill-opacity:0.81960784;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect41514"
- width="2"
- height="1"
- x="-430.5"
- y="83"
- transform="scale(-1,1)" />
- </g>
- <g
- id="g41613"
- style="opacity:0.45">
- <g
- style="opacity:0.8"
- id="g41516">
- <rect
- y="69"
- x="422"
- height="16"
- width="16"
- id="rect41518"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.05;fill:url(#radialGradient41666);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <g
- id="g41520">
- <path
- sodipodi:nodetypes="csscccc"
- id="path41522"
- d="m 422.51387,74.4375 c 2.14278,1.6383 5.29475,5.652 6.25,7.5625 0.5,1 1.05394,1.01957 1.5,0 0.875,-2 3.25,-4.75 4.75,-6 l -3.5,-4 c -1.25,1.83839 -2,3.25 -2.75,4.63304 -1.71617,-1.72583 -4.35859,-3.39262 -6.25,-4.13304"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient41668);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient41670);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g41524">
- <g
- id="g41526">
- <path
- sodipodi:nodetypes="cccc"
- id="path41528"
- d="m 422.51387,73.5 c 1.93909,0.815624 4.07262,1.664731 6,4 h 0.75 c 0.82427,-1.547027 1.51287,-2.596571 2.16161,-3.5"
- style="fill:none;stroke:url(#linearGradient41672);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient41674);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
- d="m 422.51387,73.5 c 1.93909,0.815624 5.41183,5.25 7,8 1.5,-3 2.75,-4 4.75,-6.25"
- id="path41530"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient41676);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 428.5,78.5 c 0.95165,-1.519624 1.88025,-3.040081 2.92548,-4.5"
- id="path41532"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient41582);fill-opacity:1;fill-rule:evenodd;stroke:#0b1728;stroke-width:2.07584167;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path32513-1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.4336871,0,0,0.4334311,376.83381,21.772579)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient32529-7);stroke-width:3.1984036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path32517-6"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.3127677,0,0,0.3125443,475.3332,36.070149)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- id="ICON_MOD_DECIM">
- <g
- transform="translate(0,2)"
- id="g10823">
- <rect
- y="260"
- x="68"
- height="16"
- width="16"
- id="rect31968"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- style="display:inline;fill:url(#linearGradient24189);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 70.562559,271.5 0.24994,0.25 9,-9 -0.24994,-0.25 h -9 z"
- id="path12863"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- id="path12865"
- style="display:inline;fill:none;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- d="m 70.562559,271.5 -6e-5,-9 9,5e-5 M 74.562559,267.4 v -4.8 m 0.89997,3.9 h -4.8"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccccc" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1.00000119px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 71.562559,265.51369 V 263.5 h 1.99998"
- id="path12867"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <g
- style="opacity:0.4"
- id="g24198">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- style="display:inline;fill:url(#linearGradient24209);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 72.562559,273.5 -0.25006,-0.25 9,-9 0.25006,0.25 v 9 z"
- id="path12861" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path27953"
- d="m 80.499999,265.5 v 7 h -7"
- style="display:inline;fill:none;stroke:url(#linearGradient24192);stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1"
- d="m 81.562559,264.5 v 9 l -9,-5e-5"
- id="path12869"
- sodipodi:nodetypes="ccc" />
- </g>
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path12871"
- d="M 75.562559,265.51369 V 263.5 h 1.99998"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1.00000119px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:1.00000119px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 71.562579,269.51369 V 267.5 h 1.99998"
- id="path12873"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path42252"
- d="M 71,277 83,265"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <g
- id="g42277"
- transform="translate(-21.1375,-0.42)">
- <path
- inkscape:connector-curvature="0"
- d="m 99.6375,267.92 1,-1 m -4,4 1,-1 m 5,-5 1,-1 m -10,10 1,-1 m -4,4 1,-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:none;stroke:#28220b;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="path42279"
- sodipodi:nodetypes="cccccccccc" />
- <path
- inkscape:connector-curvature="0"
- id="path42281"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffefaf;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 99.6375,267.92 1,-1 m -4,4 1,-1 m 5,-5 1,-1 m -10,10 1,-1 m -4,4 1,-1"
- sodipodi:nodetypes="cccccccccc" />
- </g>
- <path
- inkscape:connector-curvature="0"
- id="path42595"
- d="M 69.435939,276.52168 71.5,274.5"
- style="stroke-width:1px" />
- </g>
- <g
- id="ICON_WORLD"
- transform="translate(41.834175,191.41501)">
- <rect
- y="364.58499"
- x="47.165825"
- height="16"
- width="16"
- id="rect38701"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(1.032664,0,0,1.043556,-79.760429,254.38542)"
- id="g38703">
- <circle
- transform="matrix(0.787566,0,0,0.779223,26.709197,21.3179)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path38705"
- style="display:inline;overflow:visible;visibility:visible;fill:#3771c8;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:1.22966909;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.666432,0,0,0.659342,42.69924,35.46375)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- style="fill:url(#linearGradient38719);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path38707"
- cx="132"
- cy="118"
- r="8" />
- <circle
- id="path38709"
- style="opacity:0.7;fill:url(#linearGradient38722);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.3631382,0,0,0.3593485,81.755824,69.904768)"
- cx="132"
- cy="118"
- r="8" />
- <path
- transform="matrix(0.9688184,0,0,0.9547322,-131.63668,47.640696)"
- style="display:inline;opacity:0.5;fill:none;stroke:#ffe680;stroke-width:1.00161445px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter13996)"
- d="m 274.98515,70.995347 c 0,0.953349 -1,1.906699 -2,1.906699"
- id="path38711"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient38724);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 130.67404,112.3079 c 0.0244,0.78706 -0.15754,1.63085 0.59269,2.02213 0.71197,-0.0434 1.49133,0.64122 1.35667,1.40517 -0.26776,0.77861 0.14071,1.12325 0.95576,1.36401 0.57868,-0.0716 0.79053,-0.93546 0.87357,-1.36401 0.0948,-1.27121 0.51542,-1.09421 0.82108,-1.98991 -0.45733,-0.91502 -0.003,-1.04443 -0.72629,-1.43739 m -1.00945,-3.89288 c -0.4426,0.34378 -0.24372,1.04314 -0.66162,1.39841 -0.45372,0.13628 -0.78226,-0.0605 -1.16771,0.43164 -0.30841,1.10457 0.35004,1.22306 0.90205,1.10457 0.49538,-0.0502 0.61419,-0.94321 0.97928,-0.37853 0.0831,0.10976 0.71917,-0.0403 0.86266,0.18898 0.0669,0.10682 -0.11785,0.0255 -0.14729,0.18955 -0.0428,0.23847 0.27734,0.37341 0.372,0.3824 0.32089,0.0305 0.60005,0.92548 0.83846,1.05499 0,0.46738 0.0924,-0.6774 0.3515,-0.78703 0.22948,-0.0971 0.47929,0.10731 0.5,0 0.29928,-1.55081 -1.26113,-3.00604 -2.82933,-3.58498 z M 128.96474,107.5 c -0.6111,1.01384 0.85343,1.46103 1.73001,1.21329 0.57897,-0.37879 1.00716,-0.92331 0.55665,-1.21329 -0.20614,-0.1415 -2.07706,0.0431 -2.28666,0 z m -1.372,1.37253 c -0.49575,-0.14959 0.44952,-0.11945 0.45733,0.45751 0.1696,0.54756 -0.42801,0.23756 0,0.45752 0.70893,0.1644 0.35328,1.70031 -0.28114,1.56208 -0.56042,0.10119 -0.43915,0.95826 -1.64865,0.88279 -0.0836,0.0755 -1.04512,0.61593 -0.81421,1.21521 1.12968,0.30162 -0.36816,1.26478 -0.43867,0.55236 -0.15441,-0.49797 -0.62853,-1.11348 -0.43994,-1.68674 0.11734,-0.63627 0.5689,-1.12263 0.82646,-1.69865 0.36225,-0.61946 0.89084,-1.17688 1.57758,-1.42595 0.21411,-0.16799 0.46159,-0.41691 0.76124,-0.31613 z m -0.91467,5.03262 c -0.55163,-0.27585 -0.72934,0.28829 -0.60377,0.7984 0.15577,0.47138 0.52607,0.97695 0.72628,1.43739 0.40435,0.49619 1.512,1.34081 2.17883,1.67696 0.31768,0.16015 0.48418,0 0.24209,-0.23956 -0.31367,-0.6375 -1.14073,-1.94893 -0.48418,-2.15609 0.59647,-0.60342 0.34203,-1.58773 -0.48419,-1.43739 -0.54779,-0.25818 -0.75551,-0.39899 -1.38855,-0.0752 -0.0558,0.0743 -0.12403,0.006 -0.18651,-0.004 z"
- id="path38713"
- sodipodi:nodetypes="ccccccccccccssscsscccscccccccccccccccsccccc"
- inkscape:connector-curvature="0" />
- <circle
- transform="matrix(0.6657538,0,0,0.6588051,42.794535,35.527157)"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#linearGradient38726);stroke-width:1.45454657;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path38715"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.06052282,0,0,0.05989117,121.21686,103.80334)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path38717"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- transform="translate(179.00003,444.99999)"
- id="ICON_LOGIC"
- style="display:inline">
- <rect
- y="90"
- x="162"
- height="16"
- width="16"
- id="rect37957"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <rect
- y="96.749977"
- x="165.74995"
- height="1.75"
- width="2.5"
- id="rect37959"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 164.99996,98.99998 6,-2.5 6,2.5 v 2.75 l -5.99999,3.24999 -6.00001,-3.24999 z"
- id="path37961"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.96000001;fill:none;stroke:#1a1a1a;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect37963"
- width="2"
- height="7"
- x="170.98643"
- y="91.999977" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccccc"
- style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 164.99996,98.99998 6,-2.5 6,2.5 v 0.5 l -6,3 -6,-2.93442 z"
- id="path37965"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path37967"
- d="m 164.99997,101.74998 -1e-5,-2.25 6,3 0.01,2.49885 -6.00995,-3.24885 z"
- style="fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89207077px;marker:none;enable-background:accumulate"
- d="m 176.99996,101.74998 v -2.25 l -6,3 c 0,2.58362 0,1.9329 0,2.5 z"
- id="path37969"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- y="97.999977"
- x="165.99995"
- height="1"
- width="2"
- id="rect37971"
- style="display:inline;overflow:visible;visibility:visible;fill:#aa0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ff2a2a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37973"
- width="2"
- height="1"
- x="165.99995"
- y="96.999977" />
- <rect
- y="96.999977"
- x="165.99995"
- height="2"
- width="1"
- id="rect37975"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ffaaaa;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- style="fill:none;stroke:url(#linearGradient38005);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 165.49996,99.49998 v 0 2 l 5.5,3 5.5,-3 v -2"
- id="path37977"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <g
- id="g37979"
- transform="translate(-114.00004,-232.99999)">
- <rect
- y="328.03571"
- x="285"
- height="3.9642856"
- width="2"
- id="rect37981"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:#1a1a1a;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#550000;stroke-width:0.59999985;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path37983"
- transform="matrix(1.6666708,0,0,1.6666633,-190.66784,-215.66559)"
- cx="286"
- cy="325"
- r="1.5" />
- <rect
- y="328.49997"
- x="285"
- height="3.5000324"
- width="2"
- id="rect37985"
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37987"
- width="1"
- height="3.5000324"
- x="285"
- y="328.49997" />
- <circle
- transform="matrix(1.333351,0,0,1.333345,-95.338377,-107.33714)"
- id="path37989"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient38007);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.59999985;marker:none;enable-background:accumulate"
- cx="286"
- cy="325"
- r="1.5" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37991"
- width="1"
- height="1"
- x="284"
- y="331" />
- <rect
- y="332"
- x="285"
- height="1"
- width="2"
- id="rect37993"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="331"
- x="287"
- height="1"
- width="1"
- id="rect37995"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <path
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 165.49996,98.99998 5.5,2.75"
- id="path37997"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <g
- id="g37999"
- mask="url(#mask20957)">
- <path
- style="opacity:0.7;fill:none;stroke:#1a1a1a;stroke-width:2.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 168.25,102.75 -0.75,0.75 c -1,1 -0.75,1 -2,1 h -2.25"
- id="path38001"
- sodipodi:nodetypes="cccc"
- mask="none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path38003"
- d="m 168.25,102.75 -0.75,0.75 c -1.25,1.17188 -0.75,1 -2,1 h -3"
- style="fill:none;stroke:#ececec;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_RNA"
- transform="translate(588,446)">
- <rect
- y="26"
- x="-79"
- height="16"
- width="16"
- id="rect43390-2"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g43392-4"
- clip-path="url(#clipPath43368-1)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ec0606;fill-opacity:1;fill-rule:nonzero;stroke:#910000;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect43394-5"
- width="6"
- height="2"
- x="-72.5"
- y="31.5"
- rx="0.79505396"
- ry="0.79505396" />
- <rect
- ry="0.79505396"
- rx="0.79505396"
- y="28.5"
- x="-75.5"
- height="2"
- width="6"
- id="rect43396-5"
- style="display:inline;overflow:visible;visibility:visible;fill:#6996d7;fill-opacity:1;fill-rule:nonzero;stroke:#143564;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#6996d7;fill-opacity:1;fill-rule:nonzero;stroke:#143564;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect43398-1"
- width="6"
- height="2"
- x="-75.5"
- y="36.5"
- rx="0.74381745"
- ry="0.74381745" />
- <rect
- ry="0.71819919"
- rx="0.71819919"
- y="39.5"
- x="-72.5"
- height="2"
- width="6"
- id="rect43400-7"
- style="display:inline;overflow:visible;visibility:visible;fill:#ec0606;fill-opacity:1;fill-rule:nonzero;stroke:#910000;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- id="path43402-1"
- style="display:inline;fill:none;stroke:#000000;stroke-width:2.9000001;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"
- d="m -68.50037,45.540088 c 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99787,-4.040088 0.002,-2 -4.9975,-2 -4.9975,-4 0,-2.030484 5.005,-1.959912 5,-4 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99537,-4.040088"
- sodipodi:nodetypes="cscscsc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cscscsc"
- d="m -68.50037,45.540088 c 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99787,-4.040088 0.002,-2 -4.9975,-2 -4.9975,-4 0,-2.030484 5.005,-1.959912 5,-4 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99537,-4.040088"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1.39999998;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"
- id="path43404-1"
- inkscape:connector-curvature="0" />
- <path
- id="path43406-5"
- style="display:inline;opacity:0.4;fill:none;stroke:url(#radialGradient43410-4);stroke-width:1.39999998;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"
- d="m -68.50037,45.540088 c 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99787,-4.040088 0.002,-2 -4.9975,-2 -4.9975,-4 0,-2.030484 5.005,-1.959912 5,-4 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99537,-4.040088"
- sodipodi:nodetypes="cscscsc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cscscsc"
- d="m -68.50037,45.540088 c 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99787,-4.040088 0.002,-2 -4.9975,-2 -4.9975,-4 0,-2.030484 5.005,-1.959912 5,-4 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99537,-4.040088"
- style="display:inline;opacity:0.4;fill:none;stroke:url(#radialGradient43412-8);stroke-width:1.39999998;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"
- id="path43408-2"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(273,441)"
- id="ICON_GREASEPENCIL">
- <path
- id="path40242"
- style="display:inline;overflow:visible;visibility:visible;fill:#89a02c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- d="M 52.75,44.25 62.5,34.5 c 0,-1 -0.5,-1.5 -1,-2 -0.498692,-0.498692 -1,-1 -2,-1 l -9.75,9.75 c 1,0 1.501308,0.501308 2,1 0.5,0.5 1,1 1,2 z"
- sodipodi:nodetypes="ccsccsc"
- inkscape:connector-curvature="0" />
- <rect
- y="31"
- x="47"
- height="16"
- width="16"
- id="rect40244"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:new" />
- <path
- sodipodi:nodetypes="ccsccc"
- d="M 60.75,36.25 62.5,34.5 c 0,-1 -0.5,-1.5 -1,-2 -0.498692,-0.498692 -1,-1 -2,-1 l -1.75,1.75 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient40270);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- id="path40246"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- d="m 57.5,35.5 -1,-1 -6.75,6.75 1.75,0.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#bcd35f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- id="path40248"
- inkscape:connector-curvature="0" />
- <path
- id="path40250"
- style="display:inline;overflow:visible;visibility:visible;fill:#445016;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- d="m 59.5,37.25 -1,-0.75 -6,6 0.25,1.5 z"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path40252"
- d="m 59.75,37.25 -3,-3"
- style="fill:none;stroke:url(#linearGradient40272);stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient40274);stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 60.75,36.25 -3,-3"
- id="path40254"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient40276);fill-opacity:1;stroke-width:1px"
- d="m 57.75,33.25 2.98375,3.003125 -1.0075,1.0075 -3.0225,-2.98375 z"
- id="path40256"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#501616;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
- d="m 61,36 1.5,-1.5 c 0,-1 -0.5,-1.5 -1,-2 -0.498692,-0.498692 -1,-1 -2,-1 L 58,33"
- id="path40258"
- sodipodi:nodetypes="ccscc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path40260"
- d="M 58.25,32.75 50,41 l -2,4 -0.5,0.5 0.25,0.75 0.75,0.25 0.5,-0.5 4,-2 8.25,-8.25"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccsc"
- id="path40262"
- d="M 50.25,41 48.5,44.25 49.75,45.5 53,43.75 C 53,43.25 52.5,42.5 52,42 51.501308,41.501308 50.75,41 50.25,41 Z"
- style="fill:url(#linearGradient40278);fill-opacity:1;stroke-width:1px"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#445016;stroke:#22280b;stroke-width:2.4000001;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none"
- d="m 48.25,45.75 0.5,-0.5"
- id="path40264"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path40266"
- d="M 48.25,45.75 48.5,45.5"
- style="fill:none;stroke:#9ab432;stroke-width:1.10000002;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.3;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round"
- d="M 52.527427,43.527587 61.514313,34.48568"
- id="path40268"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_RENDER_ANIMATION"
- transform="translate(238,594)">
- <rect
- y="-122"
- x="-44"
- height="16"
- width="16"
- id="rect40445-4"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path40447-5"
- d="m -43.5,-116.75 12.5,-4.75 0.75,2 -13.25,5 z"
- style="fill:#1a1a1a;stroke:#000000;stroke-width:0.89999998;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
- inkscape:connector-curvature="0" />
- <rect
- y="-114.5"
- x="-42.5"
- height="7.9999971"
- width="12.999988"
- id="rect40449-5"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient39686-1);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect40451-1"
- width="1"
- height="1.5"
- x="-32"
- y="-121" />
- <rect
- y="-119.41868"
- x="-36"
- height="1.5"
- width="1"
- id="rect40453-7"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect40455-1"
- width="1"
- height="1.5"
- x="-37"
- y="-119.16868" />
- <rect
- y="-117.62802"
- x="-41"
- height="1.5"
- width="1"
- id="rect40457-1"
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect40459-5"
- width="1"
- height="1.5"
- x="-40"
- y="-117.87802" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect40461-2"
- width="13.999996"
- height="2.0000052"
- x="-43.5"
- y="-114.5" />
- <rect
- y="-113"
- x="-42"
- height="1.7500292"
- width="12.154154"
- id="rect40490-7"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.55400002;marker:none;enable-background:accumulate" />
- <path
- id="rect40463-6"
- d="m -40,-114 v 1.25 h 2 V -114 Z m 4,0 v 1.25 h 2 V -114 Z m 4,0 v 1.25 h 2 V -114 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.3;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round"
- d="m -31.5,-120.5 -9.75,3.75"
- id="path40474-1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:none;stroke:url(#linearGradient39688-9);stroke-width:1px;stroke-linejoin:round"
- d="m -41.5,-107.5 v -6 h 11 v 6 z"
- id="path40476-4"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#87aade;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m -43,-116.75 h 1 l 1,1.75 v 2 h -2 z"
- id="path40478-2"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#002255;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m -41,-115 v 2 h -2 v 0.75 h 2.75 v -3 l -1.25,-2.25 -1.5,0.25 v 0.5 h 1 z"
- id="path40480-3"
- sodipodi:nodetypes="ccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path40558-2"
- d="m -41.5,-107.38206 v -4.66445"
- style="opacity:0.2;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect40553-2"
- width="1"
- height="1.5"
- x="-33"
- y="-120.75" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect40556-1"
- width="1"
- height="1.25"
- x="-40"
- y="-114" />
- <path
- sodipodi:nodetypes="cc"
- style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round"
- d="m -42.4975,-113.46527 v -3.0928"
- id="path40560-6"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(1)"
- style="opacity:0.35"
- id="g40590-8">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.55400002;marker:none;enable-background:accumulate"
- id="rect40586-5"
- width="5"
- height="0.9617852"
- x="-38"
- y="-110" />
- <rect
- y="-111"
- x="-36"
- height="3"
- width="1.0280838"
- id="rect40588-7"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.55400002;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- transform="translate(56,-67)"
- id="ICON_PREFERENCES"
- style="display:inline;enable-background:new">
- <rect
- y="602"
- x="327"
- height="16"
- width="16"
- id="rect42947"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g42949">
- <g
- style="opacity:0.85"
- id="g42951">
- <path
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 341.5161,616.38229 340.5,617.5 l -10.73389,-10e-6 -1.25,-1.25 L 328.5,605.5 h 13 z"
- id="path42953"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42955"
- d="m 340,616 h -8.25 v -1 H 340 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- id="rect38927"
- width="11.970581"
- height="8.0306396"
- x="329.02942"
- y="605.96936" />
- <rect
- y="605.96936"
- x="329.02942"
- height="8.0306396"
- width="11.970581"
- id="rect45307"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:url(#radialGradient45309);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42957"
- d="m 340.48389,606.50001 c -3.66204,-3e-5 -7.70403,2e-5 -10.98389,-10e-6 l 0.002,10.00007 10.99778,-7e-5 -0.0161,-9.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42965-7);stroke-width:0.99999923px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- y="615"
- x="330"
- height="1.0000043"
- width="1"
- id="rect42959"
- style="display:inline;overflow:visible;visibility:visible;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- d="m 340.5,614 h -11 v -1 h 11 z"
- id="path38929"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="opacity:0.25;fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter24186-3-2)"
- d="m 337.7,606.7 v 2.75 l 2,1.5 v 2.5 l -0.25,0.25 h -1.75 v -2 h -2 v 2 h -1.75 l -0.25,-0.25 v -2.5 l 2,-1.5 v -2.75 z"
- id="path42961"
- sodipodi:nodetypes="ccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccccccccccccccc"
- id="path42963"
- d="m 333.75,602.5 h 1.75 c 0,0 0,2 0,2 h 2 v -2 h 1.75 l 0.25,0.25 v 2.5 l -2,1.5 v 2.5 l 2,1.5 v 2.5 l -0.25,0.25 h -1.75 v -2 h -2 v 2 h -1.75 l -0.25,-0.25 v -2.5 l 2,-1.5 v -2.5 l -2,-1.5 v -2.5 z"
- style="fill:#ffffff;fill-rule:evenodd;stroke:url(#linearGradient42967-6);stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_DISCLOSURE_TRI_DOWN">
- <g
- transform="translate(-167,402.00001)"
- id="g29389"
- style="display:inline">
- <rect
- y="217"
- x="382"
- height="16"
- width="16"
- id="rect29391"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g29393"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.6184922,0,0,0.6183145,308.52384,72.984237)"
- style="display:inline;opacity:0.8">
- <g
- style="display:inline"
- id="g29395"
- transform="matrix(0.927848,0,0,0.916217,-28.19594,40.73172)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path29397"
- style="fill:url(#linearGradient29407);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.99653149;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.872933,0,0,0.883992,56.29135,118.6984)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- inkscape:connector-curvature="0"
- d="m 134.19651,245.03757 h -6.46038"
- style="fill:none;stroke:url(#linearGradient29409);stroke-width:4.85120249;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
- id="path29399"
- sodipodi:nodetypes="cc" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- transform="matrix(0.784039,0,0,0.779055,-3.508124,71.29625)"
- id="g29401"
- style="display:inline;fill:none;stroke:url(#linearGradient29413);stroke-width:1.90771151;stroke-opacity:1">
- <circle
- transform="matrix(0.8313677,0,0,0.8366298,61.774434,124.29322)"
- style="fill:none;stroke:url(#linearGradient29411);stroke-width:2.48091555;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path29403"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- inkscape:connector-curvature="0"
- id="path29405"
- style="fill:none;stroke:#000000;stroke-width:2.42560124;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 133.78064,245.05849 h -5.65893"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- <rect
- y="619"
- x="215"
- height="16"
- width="16"
- id="rect41249"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g41251"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.6184922,0,0,0.6183145,141.52384,474.98425)"
- style="display:inline;opacity:0.8">
- <g
- style="display:inline"
- id="g41253"
- transform="matrix(0.927848,0,0,0.916217,-28.19594,40.73172)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path41255"
- style="fill:url(#linearGradient18663);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.99653149;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.872933,0,0,0.883992,56.29135,118.6984)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- d="m 134.19651,245.03757 h -6.46038"
- style="fill:none;stroke:url(#linearGradient18665);stroke-width:4.85120249;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
- id="path41257"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- transform="matrix(0.784039,0,0,0.779055,-3.508124,71.29625)"
- id="g41260"
- style="display:inline;fill:none;stroke:url(#linearGradient18669);stroke-width:1.90771151;stroke-opacity:1">
- <circle
- transform="matrix(0.8313677,0,0,0.8366298,61.774434,124.29322)"
- style="fill:none;stroke:url(#linearGradient18667);stroke-width:2.48091555;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path41262"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- id="path41264"
- style="fill:none;stroke:#000000;stroke-width:2.42560124;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 133.78064,245.05849 h -5.65893"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_RENDER_STILL">
- <g
- id="g40668">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect39989"
- width="16"
- height="16"
- x="215"
- y="472"
- rx="0"
- ry="0" />
- <g
- id="g40555">
- <rect
- ry="1.7356256"
- y="475.5"
- x="215.5"
- height="11.000039"
- width="14.000015"
- id="rect39993"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient40918);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- rx="1.7356256" />
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path39996"
- d="M 216.00001,479.40741 V 484 c 0,0.56404 0.36784,1.00001 0.84375,1 h 11.3125 c 0.47591,0 0.84375,-0.43595 0.84375,-1 v -4.59259 C 228.6863,479.7792 228.23078,480 227.75001,480 h -10.5 c -0.48077,0 -0.93629,-0.2208 -1.25,-0.59259 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient40920);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- rx="1.5817194"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect39999"
- width="14.000005"
- height="2.0000522"
- x="215.5"
- y="475.5"
- ry="0.8750208" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect40001"
- width="14.000006"
- height="10.999848"
- x="215.5"
- y="475.5"
- ry="1.503511"
- rx="1.503511" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.75859177;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path40005"
- transform="matrix(1.3955004,0,0,1.2452423,115.18334,-141.72474)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <rect
- rx="0.5078125"
- ry="0.4910686"
- y="476.5"
- x="216.5"
- height="9.0000038"
- width="12.000035"
- id="rect40008"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:none;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <ellipse
- transform="matrix(1.5770887,0,0,1.5999841,100.49326,-321.69208)"
- id="path40010"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:none;stroke:#000000;stroke-width:0.62952662;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient40922);stroke-width:0.97061968;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path40012"
- transform="matrix(1.1794014,0,0,0.8999954,131.50687,28.952303)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(1.1827463,0,0,1.2,131.2458,-119.90002)"
- id="path40014"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:0.83938956;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient40924);stroke-width:1.26754272;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path40016"
- transform="matrix(0.790122,0,0,0.787736,161.87049,87.05649)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(0.5963773,0,0,0.2000006,171.47609,375.5997)"
- id="path40020"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#999999;stroke-width:2.89550138;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 216.48394,475.5 v -0.50001 c 0,-0.276 0.67629,-0.5 1.50958,-0.5 0.83329,0 1.50958,0.224 1.50958,0.5 V 475.5"
- id="path40022"
- sodipodi:nodetypes="csccc"
- inkscape:connector-curvature="0" />
- <rect
- y="475"
- x="217"
- height="1"
- width="2"
- id="rect40024"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="477"
- x="226"
- height="1"
- width="2"
- id="rect40026"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient40926);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- id="rect40028"
- width="2"
- height="1"
- x="226"
- y="477" />
- <rect
- y="478"
- x="218"
- height="1"
- width="1"
- id="rect40030"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#radialGradient40928);stroke-width:0.67151165;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path40032"
- transform="matrix(1.1827463,0,0,1.2,131.2458,-119.90002)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(0.8888868,0,0,0.8862026,154.16683,37.626266)"
- id="path40034"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient40930);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path40036"
- transform="matrix(0.1975308,0,0,0.1999991,207.09261,381.10045)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#radialGradient40932);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.98985863;marker:none;enable-background:accumulate"
- id="path40043"
- transform="matrix(-0.8867575,0.06148883,-0.06130315,-0.8840797,323.44127,921.51187)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- </g>
- </g>
- <g
- transform="matrix(0.9986805,0,0,1,-92.569205,199)"
- id="g25007-8"
- style="display:inline;enable-background:new">
- <rect
- ry="1.2018067"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:none;stroke:#fac900;stroke-width:4.00264168;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect25009-2"
- width="3.0039635"
- height="3"
- x="318.99011"
- y="275"
- rx="1.2018067" />
- <rect
- ry="1.2018068"
- rx="1.2018068"
- y="275"
- x="318.99011"
- height="3"
- width="3.0039637"
- id="rect25011-4"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:none;stroke:#e6b800;stroke-width:2.00132084;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path32046-5"
- d="m 318.99011,278 c 0,-1.00003 3e-5,-2.00003 3e-5,-3.00006 1.00131,0 2.00262,0 3.00393,0 0,1.00003 -3e-5,2.00003 -3e-5,3.00006 -1.00131,0 -2.00262,0 -3.00393,0 z"
- style="fill:#aa8800;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path25013-5"
- d="m 318.48945,276 1.25165,-0.25 h 1.50199 l 1.25162,0.25001 v 1.00005 l -1.25162,0.24994 h -1.50199 l -1.25165,-0.24995 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="M 319.99139,278.50006 319.7411,277.25 v -1.5 l 0.2503,-1.25 h 1.00137 l 0.25032,1.25 v 1.5 l -0.25033,1.25006 z"
- id="path25015-1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(1)"
- id="ICON_RENDER_RESULT">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#2affd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36514"
- width="16"
- height="16"
- x="109"
- y="472" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient36549);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 110.5,472.5 13.98222,2e-5 v 14.96443 l -13.98222,-2e-5 z"
- id="path36516"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36518"
- d="m 111.49999,485.48369 v -11.00155 h 10.99999"
- style="fill:none;stroke:#ffffff;stroke-width:0.9999997px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.25;fill:url(#radialGradient36551);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 112,474 h 11 v 11 h -11 z"
- id="path36521"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36523"
- d="m 112.5,474.5 h 9.98224 v 10 H 112.5 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient36553);fill-opacity:1;fill-rule:evenodd;stroke:#808080;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:none;stroke:#4d4d4d;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 112.5,484.5 v -10 h 9.98224"
- id="path36525"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <g
- id="g39496">
- <circle
- transform="matrix(0.2498674,0,0,0.249916,83.518554,451.9933)"
- style="fill:none;stroke:url(#linearGradient36555);stroke-width:4.00173378;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path36527"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <path
- sodipodi:nodetypes="cccsccc"
- id="path36529"
- d="m 119,475.50001 c -1.44825,0 -1.50029,0.42731 -1.50029,0.85462 l 2.2e-4,4.27306 c 0,0.85461 0.052,0.85461 1.50029,0.85461 1.44823,0 1.49984,0.0467 1.49984,-0.85461 v -4.27306 c 0,-0.42731 -0.0518,-0.85462 -1.50006,-0.85462 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient36557);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient36559);stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 118.99995,475.50001 c -1.44821,0 -1.50025,0.42731 -1.50025,0.85461 l 2.2e-4,4.27306 c 0,0.85462 0.052,0.85462 1.50025,0.85462 1.44821,0 1.49982,0.0467 1.49982,-0.85462 v -4.27306 c 0,-0.4273 -0.0518,-0.85461 -1.50004,-0.85461 z"
- id="path36531"
- sodipodi:nodetypes="cccsccc"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path36533"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="matrix(0.1876323,0,0,0.1876688,91.733582,459.33847)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path36535"
- style="fill:#ffffff;stroke:url(#linearGradient36561);stroke-width:12.91347408;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.1154571,0,0,0.1168626,101.25809,467.69987)"
- cx="132"
- cy="118"
- r="8" />
- <g
- style="opacity:0.7"
- id="g36537">
- <circle
- transform="matrix(1.1428645,0,0,1.1428645,-416.36057,256.4986)"
- id="path36539"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#ffdd55;stroke-width:0.87499446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:#ffd42a;fill-opacity:1;fill-rule:nonzero;stroke:#ffd42a;stroke-width:1.74999654;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path36541"
- transform="matrix(0.5714297,0,0,0.5714297,-150.92912,366.49979)"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- <rect
- y="476"
- x="113.99994"
- height="1"
- width="1"
- id="rect36543"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- id="rect36545"
- width="2"
- height="1"
- x="118"
- y="476" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path36547"
- style="fill:none;stroke:url(#linearGradient36563);stroke-width:4.00173378;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.2498674,0,0,0.249916,83.518554,451.9933)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_FILE_BLANK"
- transform="translate(-369,-131)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path39241"
- d="M 756.16666,204.50001 H 766.5 V 219.5 h -13 l -10e-6,-11.99999 z"
- style="display:inline;fill:url(#linearGradient39254);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:url(#radialGradient39256);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="M 756.16666,204.50001 H 766.5 V 219.5 h -13 l -10e-6,-11.99999 z"
- id="path39243"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- d="m 754.5,209 v 9.5 m 3.5,-13 h 7.5"
- style="display:inline;fill:none;stroke:url(#linearGradient39258);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- id="path39245"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 753,208 h 4 v -4 z"
- id="path39247"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="M 753.5,207.00001 V 219.5 h 13 V 204.50001 H 756 Z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path39249"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path39251"
- d="m 757.5,206.5 v 2 h -2"
- style="fill:none;stroke:url(#linearGradient39260);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-705,268)"
- id="ICON_FILE"
- style="display:inline;enable-background:new">
- <path
- style="display:inline;fill:url(#linearGradient36657);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="M 756.16666,204.50001 H 766.5 V 219.5 h -13 l -10e-6,-11.99999 z"
- id="path36641"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path36643"
- d="M 756.16666,204.50001 H 766.5 V 219.5 h -13 l -10e-6,-11.99999 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:url(#radialGradient36659);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path36646"
- style="display:inline;fill:none;stroke:url(#linearGradient36661);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 754.5,209 v 9.5 m 3.5,-13 h 7.5"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path36649"
- d="m 753,208 h 4 v -4 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- id="path36653"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 753.5,207.00001 V 219.5 h 13 V 204.50001 H 756 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient36663);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 757.5,206.5 v 2 h -2"
- id="path36655"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_GHOST_DISABLED"
- transform="translate(-42)">
- <g
- transform="matrix(-1,0,0,1,887,548.02778)"
- style="display:inline;opacity:0.8;enable-background:new"
- id="g36742">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#aaccff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.4000001;marker:none;enable-background:accumulate"
- id="rect36744"
- width="16"
- height="16"
- x="488"
- y="29" />
- <g
- id="g36746">
- <path
- sodipodi:nodetypes="csccccccccsssc"
- id="path36748"
- d="m 500.5,34.5 v 5 c 0,1.666667 0.25,1.75 1,3.25 l -1.25,1.75 -1.75,-1.75 -1.75,1.75 h -0.5 l -1.75,-1.75 -1.75,1.75 h -1 C 491,43 490.5,42.416667 490.5,40.75 V 34.5 c 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37132);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- d="m 495.5,30.373047 c -2.28774,0 -4.12695,1.839211 -4.12695,4.126953 v 6.25 c 0,0.74605 0.0959,1.157156 0.27929,1.611328 0.13282,0.328869 0.39058,0.795597 0.63672,1.265625 h 0.0996 l 1.49414,-1.494141 a 0.87292083,0.87292083 0 0 1 1.23438,0 l 1.38281,1.382813 1.38281,-1.382813 a 0.87292083,0.87292083 0 0 1 1.19141,-0.03906 l 1.38672,1.210938 0.16601,-0.166016 v -0.449219 c -0.3818,-0.532877 -0.71885,-1.042237 -0.84961,-1.576172 C 499.6171,40.458958 499.62695,39.833334 499.62695,39 v -4.5 c 0,-2.287742 -1.83921,-4.126953 -4.12695,-4.126953 z"
- id="path36750"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient37134);stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:original="M 495.5 29.5 C 492.74 29.5 490.5 31.74 490.5 34.5 L 490.5 40.75 C 490.5 42.416667 491 43 491.75 44.5 L 492.75 44.5 L 494.5 42.75 L 496.25 44.5 L 496.75 44.5 L 498.5 42.75 L 500.5 44.5 L 501.5 43.5 L 501.5 42.5 C 500.5 41.25 500.5 40.666667 500.5 39 L 500.5 34.5 C 500.5 31.74 498.26 29.5 495.5 29.5 z "
- inkscape:radius="-0.87283355"
- sodipodi:type="inkscape:offset" />
- <g
- style="opacity:0.25;fill:#000000"
- id="g36752">
- <path
- sodipodi:nodetypes="cccc"
- style="fill:#000000;fill-rule:evenodd;stroke:none"
- d="m 493,43.75 c 0,-0.212963 0,-5.75 0,-5.75 l 1.5,4.472222 z"
- id="path36754"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path36756"
- d="m 497,44 c 0,-0.203703 -1,-6 -1,-6 l 2,3.428571 v 1.714286 z"
- style="fill:#000000;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(-1,0,0,1,990,0.25)"
- id="g36758"
- style="opacity:0.7;fill:#ffffff">
- <path
- sodipodi:nodetypes="ccccc"
- id="path36760"
- d="m 493,43.75 c 0,-0.212963 1,-6 1,-6 l 1,5 -1,1 z"
- style="fill:#ffffff;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:#ffffff;fill-rule:evenodd;stroke:none"
- d="m 497,43.75 c 0,-0.203703 0,-6 0,-6 l 2,5 -1,1 z"
- id="path36762"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- style="fill:#ffffff;fill-rule:evenodd;stroke:none"
- d="m 490,43.25 c 0,-0.212963 1.5,-6.25 1.5,-6.25 l 0.5,5.5 z"
- id="path36764"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 500.5,34.5 V 39 c 0,1.666667 0,2.25 1,3.5 v 1 l -1,1 -2,-1.75 -1.75,1.75 h -0.5 l -1.75,-1.75 -1.75,1.75 h -0.5 C 491,43 490.5,43.166667 490.5,41.5 v -7 c 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
- id="path36766"
- sodipodi:nodetypes="cscccccccccsssc"
- inkscape:connector-curvature="0" />
- <path
- id="path36768"
- d="m 56,139 v 1 h -1 v 1 h 2 v -2 z"
- style="display:inline;opacity:0.8;fill:url(#linearGradient37136);fill-opacity:1;fill-rule:evenodd;stroke:none;enable-background:new"
- sodipodi:nodetypes="ccccccc"
- transform="translate(441,-105)"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.8;fill:url(#linearGradient37138);fill-opacity:1;fill-rule:evenodd;stroke:none;enable-background:new"
- d="m 51,139 v 2 h 2 v -1 h -1 v -1 z"
- id="path36770"
- sodipodi:nodetypes="ccccccc"
- transform="translate(441,-105)"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- style="display:inline;opacity:0.65;fill:#000000;fill-rule:evenodd;stroke:#2b0000;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 385.5,578.5 12,12"
- id="path36738"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path36740"
- d="m 385.5,578.5 12,12"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ff5555;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(87.000001,33.999969)"
- id="ICON_RENDERLAYERS"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 3\render layers 2.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- y="459.00003"
- x="-61.000011"
- height="16"
- width="16"
- id="rect37055"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#2affd5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- transform="rotate(12.078609,-86.634332,664.79501)"
- style="display:inline;enable-background:new"
- id="g37057"
- inkscape:transform-center-x="6.529123"
- inkscape:transform-center-y="4.2273311">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M -98.435716,459.41623 -88.5,459.50003 V 470.5 l -9.935716,-0.0838 z"
- id="path37059"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:type="inkscape:offset"
- inkscape:radius="-0.8656081"
- inkscape:original="M -98.4375 459.40625 L -98.4375 470.40625 L -88.5 470.5 L -88.5 459.5 L -98.4375 459.40625 z "
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37089);fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path37061"
- d="m -97.572266,460.2793 v 9.26953 l 8.207032,0.0781 v -9.26953 z" />
- </g>
- <g
- id="g37063"
- style="display:inline;enable-background:new"
- transform="translate(38.999989)">
- <path
- sodipodi:nodetypes="ccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path37065"
- d="M -99.499989,459.50003 -88.5,459.50002 v 10.99997 l -10.999989,10e-6 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:url(#linearGradient37091);fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -97.999989,461 h 7.99998 v 8 h -7.99998 z"
- id="path37067"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <circle
- transform="matrix(0.5714297,0,0,0.5714297,-362.92909,351.49978)"
- id="path37069"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#d4aa00;stroke-width:1.74999654;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="464.5"
- cy="192.5"
- r="1.75" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path37071"
- d="m -98.49992,460.49999 h 9.00002 v 9.00003 h -9.00002 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient37093);stroke-width:0.99999952px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffe680;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37073"
- width="1"
- height="1"
- x="-98"
- y="461" />
- <rect
- y="461.5"
- x="-94.500008"
- height="5"
- width="3"
- id="rect37075"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient37096);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient37098);stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect37077"
- width="3"
- height="5"
- x="-94.500008"
- y="461.5"
- rx="0.46547449"
- ry="0.46547449" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37079"
- width="2"
- height="1"
- x="-94.000008"
- y="462" />
- <circle
- transform="matrix(0.1904433,0,0,0.1904803,-120.13881,444.5233)"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#4d4d4d;stroke-width:5.25039816;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path37081"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <rect
- ry="0.46547449"
- rx="0.46547449"
- y="461.5"
- x="-94.500008"
- height="5"
- width="3"
- id="rect37083"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient37100);stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <circle
- transform="matrix(0.07365497,0,0,0.07463961,-104.72475,458.19728)"
- style="fill:none;stroke:url(#linearGradient37102);stroke-width:20.23044777;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path37085"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path37087"
- style="fill:none;stroke:url(#linearGradient37104);stroke-width:5.25039816;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.1904433,0,0,0.1904803,-120.13881,444.5233)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_FILE_IMAGE"
- transform="translate(-327.01257,-130.96121)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path37516"
- d="m 757.01257,204.46121 9.48743,0.0388 V 219.5 h -13 l 0.0126,-11.53879 3.5,-3.5 z"
- style="display:inline;fill:#dcdcdc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- inkscape:connector-curvature="0" />
- <g
- id="g37518"
- style="display:inline;enable-background:new"
- transform="translate(838.01257,111.96121)">
- <g
- id="g37520">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#e9afaf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect37522"
- width="9.9999914"
- height="12"
- x="-83"
- y="94" />
- <rect
- y="101"
- x="-83"
- height="4.9999976"
- width="9.9999924"
- id="rect37524"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#4b7fcd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="94"
- x="-83"
- height="6.8499999"
- width="9.9999914"
- id="rect37526"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:url(#radialGradient37553);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccccccccccc"
- id="path37528"
- d="m -83,100.00002 h 1 l 1,0.74999 1,-0.74999 1,0.99999 h 2 l 1.5,-0.75 1.5,0.75 h 0.999991 L -73,102 h -9.999991 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.1;marker:none;enable-background:accumulate"
- id="rect37530"
- width="2.0000029"
- height="2.0000038"
- x="-77"
- y="96" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#2b0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m -83,102 h 10 v 1 h -10 z"
- id="path37532"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path37534"
- d="m -77,102 h 2.000003 L -75.75,106 h -0.5 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g37536"
- style="display:inline;enable-background:new"
- transform="translate(838.01257,111.96121)">
- <path
- sodipodi:nodetypes="ccc"
- id="path37538"
- d="m -82.5,105.5 v -11 h 9"
- style="display:inline;opacity:0.25;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.2;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;enable-background:new"
- d="m -82.5,105.5 v -11 h 9 v 11 z"
- id="path37540"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:url(#radialGradient37555);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 757.51257,204.46121 9,1e-5 v 14.99999 h -13 v -11 z"
- id="path37542"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- d="M 754.51257,209.96121 754.5,218.5 M 759.01257,205.46121 765.5,205.5"
- style="display:inline;opacity:0.1;fill:none;stroke:url(#linearGradient37558);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- id="path37544"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 753.01257,208.96121 h 5 v -5 z"
- id="path37546"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="M 753.51257,207.96121 753.5,219.5 h 13 v -14.99999 l -9.48743,-0.0388 z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path37549"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path37551"
- d="m 758.51257,206.46121 v 3 h -3"
- style="fill:none;stroke:url(#linearGradient37561);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_IMAGE_DATA"
- transform="translate(-726.01257,268.03879)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path37516-1"
- d="m 757.01257,204.46121 9.48743,0.0388 V 219.5 h -13 l 0.0126,-11.53879 3.5,-3.5 z"
- style="display:inline;fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- inkscape:connector-curvature="0" />
- <g
- id="g37518-1"
- style="display:inline;enable-background:new"
- transform="translate(838.01257,111.96121)">
- <g
- id="g37520-3">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ebb5b5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect37522-8"
- width="9.9999914"
- height="12"
- x="-83"
- y="94" />
- <rect
- y="101"
- x="-83"
- height="4.9999976"
- width="9.9999924"
- id="rect37524-7"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#4b80cd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="94"
- x="-83"
- height="6.8499999"
- width="9.9999914"
- id="rect37526-4"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:url(#radialGradient37553-2);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccccccccccc"
- id="path37528-2"
- d="m -83,100.00002 h 1 l 1,0.74999 1,-0.74999 1,0.99999 h 2 l 1.5,-0.75 1.5,0.75 h 0.999991 L -73,102 h -9.999991 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.1;marker:none;enable-background:accumulate"
- id="rect37530-7"
- width="2.0000029"
- height="2.0000038"
- x="-77"
- y="96" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#280b0b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m -83,102 h 10 v 1 h -10 z"
- id="path37532-7"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path37534-9"
- d="m -77,102 h 2.000003 L -75.75,106 h -0.5 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g37536-3"
- style="display:inline;enable-background:new"
- transform="translate(838.01257,111.96121)">
- <path
- sodipodi:nodetypes="ccc"
- id="path37538-1"
- d="m -82.5,105.5 v -11 h 9"
- style="display:inline;opacity:0.25;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.2;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;enable-background:new"
- d="m -82.5,105.5 v -11 h 9 v 11 z"
- id="path37540-9"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:url(#radialGradient37555-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 757.51257,204.46121 9,1e-5 v 14.99999 h -13 v -11 z"
- id="path37542-8"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- d="M 754.51257,209.96121 754.5,218.5 M 759.01257,205.46121 765.5,205.5"
- style="display:inline;fill:none;stroke:url(#linearGradient37558-8);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- id="path37544-6"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 753.01257,208.96121 h 5 v -5 z"
- id="path37546-5"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="M 753.51257,207.96121 753.5,219.5 h 13 v -14.99999 l -9.48743,-0.0388 z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path37549-0"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path37551-2"
- d="m 758.51257,206.46121 v 3 h -3"
- style="fill:none;stroke:url(#linearGradient37610-3);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-167.99999,190.99999)"
- id="ICON_TEXTURE">
- <rect
- y="365"
- x="215"
- height="16"
- width="16"
- id="rect71822"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(167.99999,-62.999991)"
- id="g71824">
- <rect
- ry="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect71826"
- width="13.016124"
- height="12.953857"
- x="48.499996"
- y="429.54614" />
- <rect
- y="430"
- x="50.016117"
- height="11.046139"
- width="11.000001"
- id="rect71828"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient71834);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00207269;marker:none;enable-background:accumulate"
- ry="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient71836);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 49,430 v 3 h 3 v -3 z m 3,3 v 3 h 3 v -3 z m 3,0 h 3 v -3 h -3 z m 3,0 v 3 h 3 v -3 z m 0,3 h -3 v 3 h 3 z m 0,3 v 3 h 3 v -3 z m -3,0 h -3 v 3 h 3 z m -3,0 v -3 h -3 v 3 z"
- id="path71830"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient71838);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 60.517703,430.5 H 49.499999 v 11 h 11.017704 v -11"
- id="path71832"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_PACKAGE">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate"
- id="rect37119"
- width="16"
- height="16"
- x="488.00015"
- y="493" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#2a2512;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 490.00015,501 7,-3 6,2.5 v 3.74998 l -6.99999,3.74999 -6.00001,-3.24999 z"
- id="path37123"
- sodipodi:nodetypes="ccccccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccccc"
- style="fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 490.00015,501 6,-2.5 6,2.5 v 0.5 l -6,3 -6,-2.93442 z"
- id="path37125" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89207077px;marker:none;enable-background:accumulate"
- d="m 497.00015,501.25 v -3.24998 l -6.5,2.74998 3.5,1.75 z"
- id="path37127"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- id="path37129"
- d="M 497.00015,501.24998 V 498 l 5.5,2.24998 -3.5,1.75 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient37201);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 502.50015,500.5 -5.5,-2.25 -6.5,2.75"
- id="path37131"
- sodipodi:nodetypes="ccc" />
- <g
- transform="translate(-260.99985,289)"
- id="g39239-1"
- style="display:inline;enable-background:new">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:url(#linearGradient37317);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="M 756.16666,204.50001 762.5,204.5 v 11.24999 l -9,1e-5 -10e-6,-8.24999 z"
- id="path39241-6"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path39243-8"
- d="M 756.16666,204.50001 762.5,204.75 v 10.75 h -9 l -10e-6,-7.99999 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:url(#radialGradient37319);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path39245-5"
- style="display:inline;fill:none;stroke:url(#linearGradient37321);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 754.5,209 v 5.5 m 3.5,-9 h 3.5"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path39247-7"
- d="m 753,208 h 4 v -4 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- id="path39249-6"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 753.5,207.00001 V 215.5 h 9 v -11 l -6.5,1e-5 z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient37323);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 757.5,206.5 v 2 h -2"
- id="path39251-1" />
- </g>
- <path
- inkscape:connector-curvature="0"
- style="display:inline;opacity:0.7;fill:url(#linearGradient37338);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="M 493.00015,494 H 501 v 11 h -7.99981 z"
- id="path37141"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path37143"
- d="m 490.00016,504.74998 -10e-6,-3.24998 6,3 0.01,3.49883 -6.00995,-3.24885 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#c6b77c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#595235;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 503.00015,504.25 v -3.24998 l -7,3.49998 c 0,2.58362 0,2.93288 0,3.49998 z"
- id="path37145"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.96000001;fill:none;stroke:url(#linearGradient37191);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 490.50015,501.5 v 2.99998 l 5.5,3 6.5,-3.49998 v -2.99998"
- id="path37147"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path37149"
- d="m 490.50015,501.5 5.5,3 6.5,-3.5"
- style="fill:none;stroke:url(#linearGradient37188);stroke-width:1.14999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.25;fill:none;stroke:#000000;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 491.5,500.75 4.5,2.5 5.5,-3"
- id="path38348"
- sodipodi:nodetypes="ccc" />
- </g>
- <g
- id="ICON_IMAGE_COL"
- transform="translate(131,-30)">
- <g
- transform="translate(-45.97248,412)"
- id="g38319">
- <path
- style="fill:url(#linearGradient38362);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 40.472488,166.25001 -1.250005,1.25 -12.483893,-1e-5 -1.25,-1.25 -5e-6,-11.75001 14.983898,1e-5 z"
- id="path38330"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path38332"
- d="M 38.972483,166.00001 H 28.72248 v -1 h 10.250003 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(110.97248,58)"
- style="display:inline;enable-background:new"
- id="g38334">
- <g
- id="g38336">
- <rect
- y="97.000008"
- x="-85"
- height="8.9999962"
- width="14.000007"
- id="rect38338"
- style="display:inline;overflow:visible;visibility:visible;fill:#d89090;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#3771c8;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect38340"
- width="13.999992"
- height="2.9999936"
- x="-85"
- y="103.00001" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:url(#radialGradient38364);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect38342"
- width="14"
- height="8.8499966"
- x="-85"
- y="97.000008" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m -84.999997,101.00001 h 1.166667 l 1.166666,0.74999 1.166667,-0.74999 1.166666,0.99999 4.666666,1e-5 1.75,-0.75 1.75,0.75 h 1.166667 l 1e-5,0.99999 -13.999999,-1e-5 z"
- id="path38344"
- sodipodi:nodetypes="cccccccccccc"
- inkscape:connector-curvature="0" />
- <rect
- y="99"
- x="-77"
- height="2.0000038"
- width="2.0000029"
- id="rect38346"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path38350"
- d="m -85,103.0089 h 14.061944 v 1 H -85 Z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#280b0b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path38360"
- d="m -71.75,105.5 h -12.5"
- style="display:inline;opacity:0.7;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.1;marker:none;enable-background:accumulate"
- d="m -77,103 h 2.000003 L -75.75,105.75 h -0.5 z"
- id="path38352"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path38354"
- d="m 39.472483,155.5 h -13 l 0.01611,11 13.01389,-7e-5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient38367);stroke-width:0.99999923px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- y="165"
- x="26.972481"
- height="1.0000043"
- width="1"
- id="rect38356"
- style="display:inline;overflow:visible;visibility:visible;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- transform="translate(63,473)"
- style="display:inline;enable-background:new"
- id="g38358" />
- </g>
- <g
- id="ICON_RNA_ADD"
- transform="translate(41.000016,-2e-5)">
- <rect
- y="472"
- x="488"
- height="16"
- width="16"
- id="rect43314"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(565,446)"
- clip-path="url(#clipPath43368-7)"
- id="g43300">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#4e83d0;fill-opacity:1;fill-rule:nonzero;stroke:#143564;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect43243"
- width="6"
- height="2"
- x="-75.5"
- y="28.5"
- rx="0.79505396"
- ry="0.79505396" />
- <rect
- ry="0.74381745"
- rx="0.74381745"
- y="36.5"
- x="-75.5"
- height="2"
- width="6"
- id="rect43245"
- style="display:inline;overflow:visible;visibility:visible;fill:#4e83d0;fill-opacity:1;fill-rule:nonzero;stroke:#143564;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ec0606;fill-opacity:1;fill-rule:nonzero;stroke:#910000;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect43262"
- width="6"
- height="2"
- x="-72.5"
- y="39.5"
- rx="0.71819919"
- ry="0.71819919" />
- <path
- sodipodi:nodetypes="cscscsc"
- d="m -68.50037,45.540088 c 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99787,-4.040088 0.002,-2 -4.9975,-2 -4.9975,-4 0,-2.030484 5.005,-1.959912 5,-4 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99537,-4.040088"
- style="display:inline;fill:none;stroke:#000000;stroke-width:2.9000001;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"
- id="path43241"
- inkscape:connector-curvature="0" />
- <path
- id="path41718"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1.39999998;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"
- d="m -68.50037,45.540088 c 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99787,-4.040088 0.002,-2 -4.9975,-2 -4.9975,-4 0,-2.030484 5.005,-1.959912 5,-4 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99537,-4.040088"
- sodipodi:nodetypes="cscscsc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cscscsc"
- d="m -68.50037,45.540088 c 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99787,-4.040088 0.002,-2 -4.9975,-2 -4.9975,-4 0,-2.030484 5.005,-1.959912 5,-4 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99537,-4.040088"
- style="display:inline;opacity:0.35;fill:none;stroke:url(#radialGradient38734);stroke-width:1.39999998;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"
- id="path43266"
- inkscape:connector-curvature="0" />
- <path
- id="path43282"
- style="display:inline;opacity:0.35;fill:none;stroke:url(#radialGradient38736);stroke-width:1.39999998;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"
- d="m -68.50037,45.540088 c 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99787,-4.040088 0.002,-2 -4.9975,-2 -4.9975,-4 0,-2.030484 5.005,-1.959912 5,-4 0,-2 -5,-2 -5,-4 0,-2.030484 5.00037,-2 4.99537,-4.040088"
- sodipodi:nodetypes="cscscsc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g39638-8"
- transform="matrix(0.9986805,0,0,1,179.4308,202.99997)">
- <rect
- rx="1.2018067"
- y="274.00003"
- x="317.9888"
- height="4.9999909"
- width="5.006597"
- id="rect39640-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:none;stroke:#fac900;stroke-width:4.00264168;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate"
- ry="1.2018067" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:none;stroke:#e6b800;stroke-width:2.00132084;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect39642-2"
- width="5.0065966"
- height="4.9999905"
- x="317.9888"
- y="274.00003"
- rx="1.2018069"
- ry="1.2018069" />
- <path
- sodipodi:nodetypes="ccccccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path43508"
- d="m 317.98879,278 v -3 l 1.00132,-1 h 3.00396 l 1.00132,1 v 3 l -1.00132,1 h -3.00396 z"
- style="opacity:0.8;fill:#dcb000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#aa8800;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 318.99011,278 c 0,-1.00003 3e-5,-2.00003 3e-5,-3.00006 1.00131,0 2.00262,0 3.00393,0 0,1.00003 -3e-5,2.00003 -3e-5,3.00006 -1.00131,0 -2.00262,0 -3.00393,0 z"
- id="path39644-1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 317.98877,276 c 1.66888,0 3.33774,10e-6 5.00662,10e-6 0,0.33335 0,0.6667 0,1.00005 -1.66888,0 -3.33774,-1e-5 -5.00662,-1e-5 0,-0.33335 0,-0.6667 0,-1.00005 z"
- id="path39646-4"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path39648-9"
- d="m 319.99139,279.00006 c 0,-1.66671 10e-6,-3.33335 10e-6,-5.00006 0.33379,0 0.66758,0 1.00137,0 0,1.66671 -1e-5,3.33335 -1e-5,5.00006 -0.33379,0 -0.66758,0 -1.00137,0 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_SEQUENCE">
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g22298.png"
- transform="matrix(0,-1,-1,0,0,0)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect22257"
- width="16"
- height="16"
- x="-551"
- y="-168" />
- <path
- sodipodi:nodetypes="cccccc"
- id="path22271"
- d="m 167.49999,535.50001 v 8 h -9 v -6 l 2,-2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient28603);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="rect22281"
- d="m 166.99999,538.00001 h -2 v 3 h 2 z m -3,0 h -1.75 l -1.25,1.25 v 1.75 h 3 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient28600);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect22285"
- width="1"
- height="1"
- x="542"
- y="162"
- transform="matrix(0,1,1,0,0,0)" />
- <path
- id="rect22287"
- d="m 166.99999,542.00001 h -1 v 1 h 1 z m -2,0 h -1 v 1 h 1 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="rect22291"
- d="m 166.99999,536.00001 h -1 v 1 h 1 z m -2,0 h -1 v 1 h 1 z m -2,0 h -1 v 1 h 1 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;marker:none;enable-background:accumulate"
- d="m 158.74999,537.25001 4.75,4.75 v 1 h -4.75 z"
- id="path22298"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient28593);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:30;marker:none;enable-background:accumulate"
- d="m 152.49999,550.50001 v -8 h 9 l 1.75,-1.5 0.25,0.5 v 7.75 l -1.25,1.25 z"
- id="path22300"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 152.49999,550.50001 h 9.5 l 1.5,-1.5 v -5.5 h 4 v -8 h -7 l -2,2 v 5 h -6 z"
- id="path22304"
- sodipodi:nodetypes="ccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:url(#linearGradient28589);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 162.99999,544.00001 -1,1 h -1 v 3 h 0.75 l 1.25,-1.25 z m -3,1 h -3 v 3 h 3 z m -4,0 h -3 v 3 h 3 z"
- id="rect22308"
- sodipodi:nodetypes="ccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="rect22314"
- d="m 161.99999,549.00001 h -1 v 1 h 1 z m -2,0 h -1 v 1 h 1 z m -2,0 h -1 v 1 h 1 z m -2,0 h -1 v 1 h 1 z m -2,0 h -1 v 1 h 1 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="rect22322"
- d="m 161.99999,543.00001 h -1 v 1 h 1 z m -2,0 h -1 v 1 h 1 z m -2,0 h -1 v 1 h 1 z m -2,0 h -1 v 1 h 1 z m -2,0 h -1 v 1 h 1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.39999998;marker:none;enable-background:accumulate"
- d="m 160.99999,542.00001 v -0.5 l -2,-2 v 2.5 z"
- id="path22348"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path22340"
- style="fill:none;stroke:url(#linearGradient28583);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 158.99999,542.50001 h 2.5 v -1 l -2.25,-2.25 m 4.25,4.25 v -2 l -3,-3 0.5,-0.5"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient28580);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 162.49999,542.50001 -1,1 h -8 v 6 h 8.25 l 1,-1"
- id="path22342"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path22345"
- style="fill:none;stroke:url(#linearGradient28577);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 164.49999,542.50001 h 2 v -6 h -5.5 l -1.5,1.5 v 0.5 l 3,3 v 1"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- d="m 160.74999,536.50001 -1.25,1.25 v 0.75 l 3,3 v 1"
- style="fill:none;stroke:url(#linearGradient28574);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- id="path22368"
- inkscape:connector-curvature="0" />
- <rect
- y="542"
- x="162"
- height="6.25"
- width="1"
- id="rect38915"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="ICON_STICKY_UVS_VERT">
- <g
- transform="translate(197.70204,-38.325069)"
- id="g37741"
- style="display:inline;enable-background:new">
- <g
- transform="translate(0.999999,1.000006)"
- id="g37905">
- <g
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="translate(-40.718137,21.311275)"
- id="g37699">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37701"
- width="1"
- height="1"
- x="166.0161"
- y="181.01379" />
- <rect
- y="177.01379"
- x="170.0161"
- height="1"
- width="0.99999899"
- id="rect37703"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37705"
- width="1"
- height="1"
- x="168.0161"
- y="177.01379" />
- <rect
- y="177.01379"
- x="166.0161"
- height="1"
- width="1"
- id="rect37707"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37709"
- width="1"
- height="1"
- x="166.0161"
- y="179.01379" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37869"
- width="0.99999899"
- height="1"
- x="174.0161"
- y="177.01379" />
- <rect
- y="177.01379"
- x="172.0161"
- height="1"
- width="1"
- id="rect37871"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="185.01379"
- x="166.0161"
- height="1"
- width="1"
- id="rect37873"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="183.01379"
- x="166.0161"
- height="1"
- width="1"
- id="rect37875"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- style="fill:#000000"
- id="g37711"
- transform="translate(-40.702034,21.325063)">
- <rect
- y="178.00002"
- x="166.00002"
- height="1"
- width="1"
- id="rect37713"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect37715"
- width="1"
- height="1"
- x="166.00002"
- y="180.00002" />
- <rect
- y="177.00002"
- x="167.00002"
- height="1"
- width="1"
- id="rect37717"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect37719"
- width="1"
- height="1"
- x="169.00002"
- y="177.00002" />
- <rect
- y="177.00002"
- x="171.00002"
- height="1"
- width="1"
- id="rect37725"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect37727"
- width="1"
- height="1"
- x="166.00002"
- y="182.00002" />
- <rect
- y="177.00002"
- x="173"
- height="1"
- width="1"
- id="rect37865"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect37867"
- width="1"
- height="1"
- x="175"
- y="177.00002" />
- <rect
- y="184"
- x="166"
- height="1"
- width="1"
- id="rect37877"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- y="186"
- x="166"
- height="1"
- width="1"
- id="rect37879"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- </g>
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- style="display:inline;opacity:0.1;fill:none;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 127.79796,207.82507 4e-5,-7.01372 6.99956,0.009 4e-4,0.0507 -4e-4,6.95427 h -6.9996 z"
- id="path37737" />
- <g
- transform="rotate(180,130.29796,202.82506)"
- id="g37928">
- <g
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="g37930"
- transform="translate(-39.718138,21.311267)">
- <rect
- y="181.01379"
- x="166.0161"
- height="1"
- width="1"
- id="rect37932"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37934"
- width="0.99999899"
- height="1"
- x="170.0161"
- y="177.01379" />
- <rect
- y="177.01379"
- x="168.0161"
- height="1"
- width="1"
- id="rect37936"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37938"
- width="1"
- height="1"
- x="166.0161"
- y="177.01379" />
- <rect
- y="179.01379"
- x="166.0161"
- height="1"
- width="1"
- id="rect37941"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="177.01379"
- x="174.0161"
- height="1"
- width="0.99999899"
- id="rect37943"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37945"
- width="1"
- height="1"
- x="172.0161"
- y="177.01379" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37947"
- width="1"
- height="1"
- x="166.0161"
- y="185.01379" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37949"
- width="1"
- height="1"
- x="166.0161"
- y="183.01379" />
- </g>
- <g
- transform="translate(-39.702035,21.325055)"
- id="g37951"
- style="fill:#000000">
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect37953"
- width="1"
- height="1"
- x="166.00002"
- y="178.00002" />
- <rect
- y="180.00002"
- x="166.00002"
- height="1"
- width="1"
- id="rect37955"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect37958"
- width="1"
- height="1"
- x="167.00002"
- y="177.00002" />
- <rect
- y="177.00002"
- x="169.00002"
- height="1"
- width="1"
- id="rect37960"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect37962"
- width="1"
- height="1"
- x="171.00002"
- y="177.00002" />
- <rect
- y="182.00002"
- x="166.00002"
- height="1"
- width="1"
- id="rect37964"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect37966"
- width="1"
- height="1"
- x="173"
- y="177.00002" />
- <rect
- y="177.00002"
- x="175"
- height="1"
- width="1"
- id="rect37968"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect37970"
- width="1"
- height="1"
- x="166"
- y="184" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect37972"
- width="1"
- height="1"
- x="166"
- y="186" />
- </g>
- </g>
- </g>
- <rect
- rx="0"
- ry="0"
- y="-161.5"
- x="331.50012"
- height="3"
- width="2.9998772"
- id="rect37338"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="scale(1,-1)" />
- <rect
- transform="scale(-1,1)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect37368"
- width="2.9998772"
- height="3"
- x="-324.49988"
- y="168.5"
- ry="0"
- rx="0" />
- </g>
- <g
- id="ICON_STICKY_UVS_LOC"
- transform="translate(-21)">
- <g
- style="display:inline;enable-background:new"
- id="g38076"
- transform="translate(173.70204,-41.325069)">
- <g
- transform="translate(1,1.0000001)"
- id="g38078">
- <g
- id="g38080"
- transform="translate(-40.718137,21.311275)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate">
- <rect
- y="181.01379"
- x="166.0161"
- height="1"
- width="1"
- id="rect38082"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect38084"
- width="0.99999899"
- height="1"
- x="170.0161"
- y="177.01379" />
- <rect
- y="177.01379"
- x="168.0161"
- height="1"
- width="1"
- id="rect38086"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect38088"
- width="1"
- height="1"
- x="166.0161"
- y="177.01379" />
- <rect
- y="179.01379"
- x="166.0161"
- height="1"
- width="1"
- id="rect38090"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="177.01379"
- x="174.0161"
- height="1"
- width="0.99999899"
- id="rect38092"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect38094"
- width="1"
- height="1"
- x="172.0161"
- y="177.01379" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect38096"
- width="1"
- height="1"
- x="166.0161"
- y="185.01379" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect38098"
- width="1"
- height="1"
- x="166.0161"
- y="183.01379" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect38173"
- width="0.99999899"
- height="1"
- x="178.0161"
- y="177.01379" />
- <rect
- y="177.01379"
- x="176.0161"
- height="1"
- width="1"
- id="rect38175"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="189.01379"
- x="166.0161"
- height="1"
- width="1"
- id="rect38181"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="187.01379"
- x="166.0161"
- height="1"
- width="1"
- id="rect38183"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- transform="translate(-40.70204,21.325054)"
- id="g38100"
- style="fill:#000000">
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect38102"
- width="1"
- height="1"
- x="166.00002"
- y="178.00002" />
- <rect
- y="180.00002"
- x="166.00002"
- height="1"
- width="1"
- id="rect38104"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect38106"
- width="1"
- height="1"
- x="167.00002"
- y="177.00002" />
- <rect
- y="177.00002"
- x="169.00002"
- height="1"
- width="1"
- id="rect38108"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect38110"
- width="1"
- height="1"
- x="171.00002"
- y="177.00002" />
- <rect
- y="182.00002"
- x="166.00002"
- height="1"
- width="1"
- id="rect38112"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect38114"
- width="1"
- height="1"
- x="173"
- y="177.00002" />
- <rect
- y="177.00002"
- x="175"
- height="1"
- width="1"
- id="rect38116"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect38118"
- width="1"
- height="1"
- x="166"
- y="184" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect38120"
- width="1"
- height="1"
- x="166"
- y="186" />
- <rect
- y="177.00002"
- x="177"
- height="1"
- width="1"
- id="rect38169"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- y="188.00002"
- x="166"
- height="1"
- width="1"
- id="rect38177"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- </g>
- </g>
- <g
- id="g38190"
- transform="rotate(180,132.29796,205.32507)">
- <g
- transform="translate(-40.718137,21.311275)"
- id="g38192"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect38194"
- width="1"
- height="1"
- x="166.0161"
- y="181.01379" />
- <rect
- y="177.01379"
- x="170.0161"
- height="1"
- width="0.99999899"
- id="rect38196"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect38198"
- width="1"
- height="1"
- x="168.0161"
- y="177.01379" />
- <rect
- y="177.01379"
- x="166.0161"
- height="1"
- width="1"
- id="rect38200"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect38203"
- width="1"
- height="1"
- x="166.0161"
- y="179.01379" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect38205"
- width="0.99999899"
- height="1"
- x="174.0161"
- y="177.01379" />
- <rect
- y="177.01379"
- x="172.0161"
- height="1"
- width="1"
- id="rect38207"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="185.01379"
- x="166.0161"
- height="1"
- width="1"
- id="rect38209"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="183.01379"
- x="166.0161"
- height="1"
- width="1"
- id="rect38211"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect38215"
- width="1"
- height="1"
- x="176.0161"
- y="177.01379" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect38219"
- width="1"
- height="1"
- x="166.0161"
- y="187.01379" />
- </g>
- <g
- style="fill:#000000"
- id="g38225"
- transform="translate(-40.70204,21.325054)">
- <rect
- y="178.00002"
- x="166.00002"
- height="1"
- width="1"
- id="rect38227"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect38229"
- width="1"
- height="1"
- x="166.00002"
- y="180.00002" />
- <rect
- y="177.00002"
- x="167.00002"
- height="1"
- width="1"
- id="rect38231"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect38233"
- width="1"
- height="1"
- x="169.00002"
- y="177.00002" />
- <rect
- y="177.00002"
- x="171.00002"
- height="1"
- width="1"
- id="rect38235"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect38237"
- width="1"
- height="1"
- x="166.00002"
- y="182.00002" />
- <rect
- y="177.00002"
- x="173"
- height="1"
- width="1"
- id="rect38239"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect38241"
- width="1"
- height="1"
- x="175"
- y="177.00002" />
- <rect
- y="184"
- x="166"
- height="1"
- width="1"
- id="rect38243"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- y="186"
- x="166"
- height="1"
- width="1"
- id="rect38245"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect38247"
- width="1"
- height="1"
- x="177"
- y="177.00002" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect38251"
- width="1"
- height="1"
- x="166"
- y="188.00002" />
- </g>
- </g>
- </g>
- <path
- sodipodi:nodetypes="cccccc"
- style="display:inline;opacity:0.1;fill:none;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 301.5,168.92817 5e-5,-9.44187 H 313.5 v 12.00195 l -12,0.0118 v -2.57183 z"
- id="path37737-4"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect37061-2"
- width="2.9998772"
- height="3"
- x="305.5"
- y="161.5"
- ry="0"
- rx="0" />
- <rect
- rx="0"
- ry="0"
- y="164.5"
- x="303.50012"
- height="3"
- width="2.9998772"
- id="rect38072"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect38074"
- width="2.9998772"
- height="3"
- x="306.50012"
- y="165.5"
- ry="0"
- rx="0" />
- </g>
- <g
- id="ICON_STICKY_UVS_DISABLE"
- transform="translate(20.999878)">
- <rect
- rx="0"
- ry="0"
- y="158.5"
- x="283.50012"
- height="3"
- width="2.9998772"
- id="rect38277"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect38279"
- width="2.9998772"
- height="3"
- x="280.50012"
- y="167.5"
- ry="0"
- rx="0" />
- <rect
- rx="0"
- ry="0"
- y="164.5"
- x="288.50024"
- height="3"
- width="2.9998772"
- id="rect38281"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="ICON_UV_SYNC_SELECT"
- transform="translate(436,-380)">
- <rect
- y="516"
- x="-95"
- height="16"
- width="16"
- id="rect36540"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g36458"
- transform="translate(-122,1.3e-4)">
- <g
- id="g36460"
- style="opacity:0.75"
- transform="translate(-116,424.99975)">
- <g
- transform="translate(-179,199.50012)"
- id="g36462">
- <path
- id="path36464"
- d="m 328.5,-107.25 -4.5,1.75 v 6.5 l 4.5,2.25 4.25,-2 v -6.75 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.00000167;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(179,-179)"
- id="g36468">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 154,80 v -6.5 l -4.5,-1.75 v 10.5 z"
- id="path36470"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="M 324,-99.00012 V -105.5 l 4.5,-1.75 0.5,0.25 v 10 l -0.5,0.25 z"
- id="path36466"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient38049);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 332.5,-105.5 v 6.25 l -4,2 -4,-2.00012 V -105.5"
- id="path36474"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 324,-105.5 4.5,-1.75 4.5,1.75 -4.5,2 z"
- id="path36472"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccc"
- style="opacity:0.95999995;fill:none;stroke:url(#linearGradient38051);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 145.5,94.25012 c 0,0 4,1.75 4,1.75 l 4,-1.75"
- id="path36476"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- id="rect36479"
- width="1"
- height="6.7500019"
- x="149"
- y="96.000122" />
- <rect
- y="96.000122"
- x="150"
- height="6.7500019"
- width="1"
- id="rect36481"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.09599998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate" />
- </g>
- <rect
- rx="0"
- ry="0"
- y="517.49976"
- x="27.500006"
- height="3.0001416"
- width="2.9999485"
- id="rect36486"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#8c4800;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#8c4800;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect36489"
- width="2.9999485"
- height="3.0001416"
- x="27.500006"
- y="524.49951"
- ry="0"
- rx="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path36496"
- d="m 28.000006,520.49983 h -0.5 v -3.00014 h 2.99995"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#5a2f00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#5a2f00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 28.000006,524.49978 h -0.5 v 3.00014 h 2.99995"
- id="path36499"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffd4a5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36503"
- width="1.9999485"
- height="2.0000772"
- x="28.000051"
- y="517.99988"
- ry="0"
- rx="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffd4a5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect36507"
- width="1.9999485"
- height="2.0000772"
- x="28.000051"
- y="524.99982"
- ry="0"
- rx="0" />
- </g>
- <g
- transform="translate(-309,277)"
- id="g36761-1"
- style="display:inline;enable-background:new">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 223,243 v 10 h 1 v -1 h 1 1 v 2 h 1 v 1 h 1 v -1 h 1 v -2 h -1 v -2 h 1 1 v -1 h -1 v -1 h -1 v -1 h -1 v -1 h -1 v -1 h -1 v -1 h -1 v -1 z"
- id="path36763-5"
- inkscape:connector-curvature="0" />
- <g
- id="g36765-2"
- style="display:inline;fill:#1a1a1a;enable-background:new"
- transform="translate(5)">
- <rect
- y="243"
- x="218"
- height="10"
- width="1"
- id="rect36767-7"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="244"
- x="219"
- height="1"
- width="1"
- id="rect36769-6"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="245"
- x="220"
- height="1"
- width="1"
- id="rect36771-1"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="246"
- x="221"
- height="1"
- width="1"
- id="rect36773-4"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="247"
- x="222"
- height="1"
- width="1"
- id="rect36775-2"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="248"
- x="223"
- height="1"
- width="1"
- id="rect36777-3"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="249"
- x="224"
- height="1"
- width="1.0000017"
- id="rect36779-2"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="252"
- x="219"
- height="1"
- width="1"
- id="rect36781-2"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="251"
- x="220"
- height="1"
- width="1"
- id="rect36783-1"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="252"
- x="221"
- height="2"
- width="1"
- id="rect36785-6"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="250"
- x="222.25"
- height="2"
- width="0.75"
- id="rect36787-8"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="252"
- x="223"
- height="1.9999931"
- width="1"
- id="rect36789-5"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="254"
- x="222"
- height="1.0000006"
- width="1.5"
- id="rect36791-7"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect36793-6"
- width="1.5"
- height="1"
- x="223.5"
- y="250" />
- </g>
- </g>
- </g>
- <g
- id="ICON_SHAPEKEY_DATA"
- transform="translate(525,27.999998)">
- <g
- style="opacity:0.7"
- id="g37302"
- transform="translate(-244,373.99988)">
- <g
- transform="translate(-179,199.50012)"
- id="g37304">
- <path
- id="path37306"
- d="m 328.5,-107.25 -4.5,1.75 v 6.5 l 4.5,2.25 4.5,-2.25 v -6.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(179,-179)"
- id="g37308">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 154,80 v -6.5 l -4.5,-1.75 v 10.5 z"
- id="path37311"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="M 324,-99.00012 V -105.5 l 4.5,-1.75 0.5,0.25 v 10 l -0.5,0.25 z"
- id="path37313"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient37530);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 332.5,-105.5 v 6.25 l -4,2 -4,-2.00012 V -105.5"
- id="path37316"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 324,-105.5 4.5,-1.75 4.5,1.75 -4.5,2 z"
- id="path37318"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccc"
- style="opacity:0.95999995;fill:none;stroke:url(#linearGradient37534);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 145.5,94.25012 c 0,0 4,1.75 4,1.75 l 4,-1.75"
- id="path37320"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- id="rect37322"
- width="1"
- height="6.7500019"
- x="149"
- y="96.000122" />
- <rect
- y="96.000122"
- x="150"
- height="6.7500019"
- width="1"
- id="rect37324"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.09599998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="g37284"
- transform="translate(-524.98389,247.00001)">
- <rect
- y="218"
- x="425"
- height="16"
- width="16"
- id="rect37286"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(46.000035,99.00001)"
- id="g37288"
- style="display:inline">
- <g
- style="display:inline"
- id="g37290"
- transform="translate(-3.542969e-5)">
- <path
- sodipodi:nodetypes="cccccc"
- id="path37292"
- style="display:inline;fill:none;stroke:#000000;stroke-width:3.0999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 388.23389,129.74998 4.25,-4.24999 m 0.98389,1.99999 -1.48389,-1.49999 m 0.48389,2.49999 -1.4142,-1.41422"
- inkscape:connector-curvature="0" />
- <path
- d="m 387.98389,129.99999 c 0.78065,0.78065 0.78065,2.21936 0,3 -0.78064,0.78065 -2.21935,0.78065 -3,0 -0.78064,-0.78064 -0.78064,-2.21935 0,-3 0.78065,-0.78064 2.21936,-0.78064 3,0 z"
- style="display:inline;fill:none;stroke:#000000;stroke-width:2.9000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path37504"
- sodipodi:nodetypes="csssc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- d="m 388.23389,129.74998 4.25,-4.24999 m 0.98389,1.99999 -0.25,-0.25 m -0.75,1.25 -0.25,-0.25"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1.50000191;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path37294"
- inkscape:connector-curvature="0" />
- <path
- id="path37500"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 387.98389,129.99999 c 0.78064,0.78065 0.78064,2.21935 0,3 -0.78065,0.78065 -2.21936,0.78065 -3,0 -0.78065,-0.78065 -0.78065,-2.21935 0,-3 0.78064,-0.78065 2.21935,-0.78065 3,0 z"
- sodipodi:nodetypes="czzzz"
- inkscape:connector-curvature="0" />
- </g>
- <circle
- transform="matrix(1.99999,0,0,1.99999,571.48293,-823.49525)"
- id="path37506"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.70000005;marker:none;enable-background:new"
- cx="-92.5"
- cy="477.5"
- r="0.5" />
- </g>
- </g>
- </g>
- <g
- id="ICON_ROTATE">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.7668704,0,0,0.7668711,19.45715,14.604317)"
- id="g10270-1"
- style="display:inline;opacity:0.3;enable-background:new">
- <circle
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.39093411;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path10272-2"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.683022,-0.07745026,0.0778507,-0.683064,209.4726,314.325)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path10275-3"
- style="display:inline;opacity:0.4;fill:url(#linearGradient38254);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <rect
- y="178"
- x="110"
- height="16"
- width="16"
- id="rect37989"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="g38006"
- transform="translate(-255.99996,227.9746)"
- style="display:inline">
- <rect
- transform="skewY(3.0086827e-4)"
- y="-43.49577"
- x="372.49994"
- height="2.9999874"
- width="3.0000761"
- id="rect37525"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:none;stroke:#d5e5ff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- rx="0"
- ry="0" />
- <rect
- transform="matrix(1,-5.25127e-6,0,-1,0,0)"
- y="40.991806"
- x="372.99994"
- height="2.0000756"
- width="2.0000861"
- id="rect38010"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- ry="0"
- rx="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#ebf3ff;fill-opacity:1;fill-rule:nonzero;stroke:#004cbe;stroke-width:0.99999875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect38012"
- width="3.0000761"
- height="2.9999874"
- x="372.49994"
- y="-43.49577"
- transform="skewY(3.0086827e-4)" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.4000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="m 114.5,192.5 h -3 v -3 m 13,0 v 3 h -3 m -0.25,-13 h 3.25 v 3 m -13,0 v -3 h 3"
- id="path37498"
- sodipodi:nodetypes="cccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccccccccc"
- id="rect38140"
- d="m 114.5,192.5 h -3 v -3 m 13,0 v 3 h -3 m -0.25,-13 h 3.25 v 3 m -13,0 v -3 h 3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient37509);stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_ALIGN">
- <g
- transform="translate(0,2)"
- id="g21663">
- <rect
- y="176"
- x="215"
- height="16"
- width="16"
- id="rect21661"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- id="g21392"
- transform="translate(-87.98837,-19.85)">
- <g
- transform="translate(-62.011627,236.84995)"
- style="opacity:0.05"
- id="g11189">
- <rect
- rx="1.375"
- ry="1.375"
- y="-39.5"
- x="366.5"
- height="3"
- width="2.9998775"
- id="rect11191"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#447cce;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- rx="1.375"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#447cce;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect11193"
- width="2.9998775"
- height="3"
- x="371.5"
- y="-39.5"
- ry="1.375" />
- <rect
- rx="1.375"
- ry="1.375"
- y="-39.5"
- x="376.5"
- height="3"
- width="2.9998775"
- id="rect11195"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#447cce;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- </g>
- <rect
- rx="1.375"
- ry="1.375"
- y="197.34995"
- x="304.48837"
- height="3"
- width="2.9998775"
- id="rect11197"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#22467e;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:#c3dbff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 304.98827,197.84994 c 0.6667,0 1.3334,1e-5 2.0001,1e-5 0,0.66668 0,1.33337 0,2.00005 -0.6667,0 -1.3334,-1e-5 -2.0001,-1e-5 0,-0.66668 0,-1.33337 0,-2.00005 z"
- id="path11199"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- rx="1.375"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#22467e;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect11201"
- width="2.9998775"
- height="3"
- x="309.48837"
- y="197.34995"
- ry="1.375" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path11203"
- d="m 309.98827,197.84994 c 0.6667,0 1.3334,1e-5 2.0001,1e-5 0,0.66668 0,1.33337 0,2.00005 -0.6667,0 -1.3334,-1e-5 -2.0001,-1e-5 0,-0.66668 0,-1.33337 0,-2.00005 z"
- style="display:inline;fill:#c3dbff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- rx="1.375"
- ry="1.375"
- y="197.34995"
- x="314.48837"
- height="3"
- width="2.9998775"
- id="rect11205"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#22467e;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:#c3dbff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 314.98827,197.84994 c 0.6667,0 1.3334,1e-5 2.0001,1e-5 0,0.66668 0,1.33337 0,2.00005 -0.6667,0 -1.3334,-1e-5 -2.0001,-1e-5 0,-0.66668 0,-1.33337 0,-2.00005 z"
- id="path11207"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- <g
- id="g37575"
- transform="translate(41.928411,-437)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect37577"
- width="16"
- height="16"
- x="173"
- y="617" />
- <g
- style="display:inline"
- id="g37579"
- transform="translate(-290,397)">
- <g
- id="g37582">
- <g
- id="g37584"
- style="opacity:0.85"
- transform="translate(20.029029)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- id="path37586"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:12.66808033;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 447.72097,225.25 -3.25,3.25 3.25,3.25 m 6.5,-6.5 3.25,3.25 -3.25,3.25" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:12.66808033;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 444.54256,228.5 h 11.66489 v 0"
- id="path37588" />
- </g>
- <g
- id="g37591"
- transform="translate(20.029029)">
- <path
- inkscape:connector-curvature="0"
- id="path37593"
- d="m 444.47097,228.5 h 13"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- d="m 447.72097,225.25 -3.25,3.25 3.25,3.25 m 6.5,-6.5 3.25,3.25 -3.25,3.25"
- style="fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path37606"
- sodipodi:nodetypes="cccccc" />
- </g>
- </g>
- </g>
- </g>
- </g>
- <g
- id="ICON_BBOX"
- transform="translate(-105,-63)">
- <g
- style="display:inline;opacity:0.8;enable-background:new"
- id="g37580"
- transform="matrix(0.7668704,0,0,0.7668711,19.45715,14.604317)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path37582"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.39093411;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;fill:url(#linearGradient37613);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path37584"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.683022,-0.07745026,0.0778507,-0.683064,209.4726,314.325)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.5705005,0,0,0.5705012,53.193935,156.18087)"
- id="path38120-7"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:2.28571391;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect37586"
- width="16"
- height="16"
- x="110"
- y="178" />
- <path
- sodipodi:nodetypes="cccccccccccc"
- id="path37608"
- d="m 114.5,192.5 h -3 v -3 m 13,0 v 3 h -3 m -0.25,-13 h 3.25 v 3 m -13,0 v -3 h 3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.4000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient37615);stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="m 114.5,192.5 h -3 v -3 m 13,0 v 3 h -3 m -0.25,-13 h 3.25 v 3 m -13,0 v -3 h 3"
- id="path37610"
- sodipodi:nodetypes="cccccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_SOLID"
- transform="translate(4.7892764e-7,23)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect15296"
- width="16"
- height="16"
- x="47"
- y="92" />
- <g
- style="display:inline"
- id="g15298"
- transform="matrix(1.0756796,0,0,1.076923,-83.216744,-140.6923)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path15301"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.11492968;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.6;fill:url(#linearGradient14439-9);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path15303"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.6926913,-0.07795333,0.0789528,-0.6875008,210.6113,314.95068)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path15305"
- style="display:inline;fill:none;stroke:url(#linearGradient14441-4);stroke-width:1.454548;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6391304,0,0,0.6383922,44.127271,148.16974)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_SMOOTH"
- transform="translate(4.7892764e-7,23)">
- <rect
- y="92"
- x="68"
- height="16"
- width="16"
- id="rect15309"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g15311"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(1.0829765,0,0,1.0830206,-86.990103,-142.06175)"
- style="display:inline">
- <g
- transform="matrix(0.928617,0,0,0.931035,10.2435,15.47372)"
- id="g15313">
- <circle
- id="path15315"
- style="fill:#7c7c7c;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.10805392;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.8076551,0,0,0.8055247,44.427594,128.39229)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.745771,0,0,0.7384254,52.598397,136.33161)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path15317"
- style="opacity:0.7;fill:url(#linearGradient14433-1);fill-opacity:1;fill-rule:nonzero"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="fill:url(#linearGradient14435-7);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path15319"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.624995,0,0,0.625,68.0007,149.25)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path15321"
- style="display:inline;fill:none;stroke:url(#linearGradient14437-6);stroke-width:1.4544518;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6837125,0,0,0.6818205,60.789416,142.9887)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- sodipodi:nodetypes="cc"
- id="path15323"
- d="m 147.27014,223.27443 c 0.22029,-2.14702 1.65545,-2.83866 3,-3"
- style="fill:none;stroke:#ffffff;stroke-width:0.92336226px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:none;stroke:#ffe680;stroke-width:0.9233622px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;filter:url(#filter15421-1);enable-background:accumulate"
- d="m 153.73381,225.66118 c 0,1 -1,2 -2,2"
- id="path15325"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_POTATO"
- transform="translate(113.00001,1)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect37994"
- width="16.000006"
- height="16.000002"
- x="-24.00001"
- y="114" />
- <circle
- id="path37953"
- style="display:inline;overflow:visible;visibility:visible;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.10749674;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.8125568,0,0,0.8127302,-123.25796,26.09414)"
- cx="132"
- cy="118"
- r="8" />
- <path
- id="path37970"
- d="m -18,116.34375 c -1.706032,0.60248 -3.053766,1.95022 -3.65625,3.65625 H -18 Z M -18,120 v 4 h 4 v -4 z m 4,0 h 3.65625 c -0.60248,-1.70603 -1.95022,-3.05377 -3.65625,-3.65625 z m 0,4 v 3.65625 c 1.70603,-0.60248 3.05377,-1.95022 3.65625,-3.65625 z m -4,0 h -3.65625 c 0.602484,1.70603 1.950218,3.05377 3.65625,3.65625 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient38073-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <circle
- transform="matrix(0.749378,0,0,0.7495379,-114.92287,33.554528)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#linearGradient38075-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.23055196;marker:none;enable-background:accumulate"
- id="path37963"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path37955"
- style="display:inline;fill:none;stroke:url(#linearGradient38077-1);stroke-width:1.45488834;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6874075,0,0,0.6872685,-106.73771,40.90046)"
- cx="132"
- cy="118"
- r="8" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#linearGradient38079-2);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m -18,116.34375 c -1.706032,0.60248 -3.053766,1.95022 -3.65625,3.65625 H -18 Z"
- id="path37972"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(4.7892764e-7,23)"
- id="ICON_WIRE"
- style="display:inline;enable-background:new">
- <g
- id="g37676">
- <rect
- y="92"
- x="26"
- height="16"
- width="16"
- id="rect38274"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <circle
- transform="matrix(-0.7606373,-0.08449162,0.08669728,-0.7451645,124.04885,199.0823)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path38284"
- style="display:inline;opacity:0.75;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:#000000;stroke-width:1.23076892;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path38294"
- transform="matrix(0.8125001,0,0,0.8125002,-73.250026,4.1249738)"
- cx="132"
- cy="118"
- r="8" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:type="arc"
- style="opacity:0.1;fill:none;stroke:url(#radialGradient38306-3);stroke-width:2.44404984;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path38296"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="10.07671"
- d="m 140,118 a 8,10.07671 0 0 1 -7.93907,10.07642 8,10.07671 0 0 1 -8.06,-9.92293"
- sodipodi:start="0"
- sodipodi:end="3.12636"
- transform="matrix(0.8077059,0,0,-0.2072667,-72.578821,124.6156)"
- sodipodi:open="true" />
- <circle
- transform="matrix(-0.7451139,-0.08394973,0.08492792,-0.7403854,122.33348,198.48526)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path15303-4"
- style="display:inline;opacity:0.15;fill:url(#linearGradient37646-4);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- cx="132"
- cy="118"
- r="8" />
- <path
- transform="matrix(0.780896,0,0,0.2786183,-69.081831,66.644097)"
- sodipodi:type="arc"
- style="display:inline;fill:none;stroke:#000000;stroke-width:1.50070953;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path38300"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 140,118 a 8,8 0 0 1 -7.93907,7.99977 8,8 0 0 1 -8.06,-7.87791"
- sodipodi:start="0"
- sodipodi:end="3.12636"
- sodipodi:open="true"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:none;stroke:url(#linearGradient37677);stroke-width:1.45454454;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="path38298"
- transform="matrix(0.6875009,0,0,0.687501,-56.75013,18.874887)"
- cx="132"
- cy="118"
- r="8" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:type="arc"
- style="display:inline;fill:none;stroke:#000000;stroke-width:1.35088885;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path38302"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 140,118 a 8,8 0 0 1 -7.97619,7.99996 8,8 0 0 1 -8.02367,-7.95235 8,8 0 0 1 7.92844,-8.04729 8,8 0 0 1 8.07085,7.90445"
- sodipodi:start="0"
- sodipodi:end="6.2712816"
- sodipodi:open="true"
- transform="matrix(0,0.7811136,-0.34375,0,74.562502,-3.1287373)" />
- <circle
- transform="matrix(0.9374995,0,0,0.9374996,-89.749939,-10.62495)"
- id="path38304"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.18000004;fill:none;stroke:url(#linearGradient38313-7);stroke-width:1.0666672;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- id="ICON_CANCEL"
- transform="translate(-570,274)">
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path44921"
- d="m 653.5,356.5 -4,4 h -7 l -4,-4 v -7 l 4,-4 h 7 l 4,4 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient39518);fill-opacity:1;fill-rule:nonzero;stroke:#550000;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path44926"
- d="m 652.5,356 -3.5,3.5 h -6 l -3.5,-3.5 v -6 l 3.5,-3.5 h 6 l 3.5,3.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient39520);stroke-width:1.20000005;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient39523);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"
- d="m 651.5,355.5 -2.75,3 h -5.25 l -3,-3 v -5 l 3,-3 h 5 l 3,3 z"
- id="path44954"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- <g
- transform="matrix(0.6567169,0.6567169,-0.6567304,0.6567304,736.47216,94.047762)"
- style="display:inline;enable-background:new"
- id="g51749-0-4">
- <path
- id="path51751-1-8"
- style="fill:none;stroke:#aa0000;stroke-width:2.69179726;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 132.08133,266.03337 h -7.61363 m 3.80681,3.80673 v -7.61347"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- id="path51753-2-2"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.29206276;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 128.27451,269.8401 v -7.61347 m 3.80682,3.80674 h -7.61363"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_OBJECT_DATA"
- transform="translate(63,-21.000002)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#f6d0a6;fill-opacity:1;fill-rule:evenodd;marker:none;enable-background:accumulate"
- id="rect40250"
- width="16"
- height="15.99988"
- x="5"
- y="514.00012" />
- <g
- transform="translate(70,178)"
- id="g40252">
- <g
- transform="translate(-386,446.5)"
- id="g40254">
- <path
- id="path40257"
- d="m 329.5,-108.25 -5.5,2 v 6.75 l 5.5,3 5.5,-3 v -6.75 z"
- style="fill:#422200;fill-opacity:1;fill-rule:evenodd;stroke:#281500;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- style="fill:#efa351;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 324,-99.5 v -7 l 6,-1.75 v 11.5 l -0.5,0.25 z"
- id="path40259"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(179,-179)"
- id="g40261">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="fill:#915515;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 156,79.5 v -7 l -5,-1.75 v 11.5 z"
- id="path40263"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="fill:#f5ca9b;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 145,72.5 5.5,-2 5.5,2 -5.5,2.5 z"
- id="path40270"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="fill:none;stroke:url(#linearGradient40280);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 334.5,-106.5 v 6.75 l -5,2.75 -5,-2.75 v -6.75"
- id="path40272"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient40282);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- id="rect40275"
- width="1"
- height="7.75"
- x="-57"
- y="342" />
- <path
- style="fill:none;stroke:url(#linearGradient40284);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -61,340.65468 c 0,0 4.5,2 4.5,2 l 4.5,-2"
- id="path40278"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(508.99432,90)"
- id="ICON_UV_FACESEL">
- <rect
- transform="matrix(0,1,1,0,0,0)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate"
- id="rect38558"
- width="16"
- height="16"
- x="46"
- y="-209.99432" />
- <g
- transform="translate(-113.99432,-362)"
- id="g38560"
- style="opacity:0.5">
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path38563"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -93.5,422.5 h 12 v -12 h -12 z m 0,-6 h 12 m -6.00001,-5.99959 v 12"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#linearGradient38689);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect38570"
- width="13"
- height="13"
- x="-94.000008"
- y="410"
- rx="0"
- ry="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- d="m -93.5,422.5 h 12 l -1e-5,-11.99959 h -12 z m 0,-6 h 12 m -6.00001,-5.99959 1e-5,11.99959"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path38572"
- inkscape:connector-curvature="0" />
- <path
- id="path38574"
- d="M -92.46875,415.53125 -92.5,411.5 h 4"
- style="opacity:0.7;fill:none;stroke:url(#linearGradient38693);stroke-width:1px;stroke-linecap:round"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.7;fill:none;stroke:url(#linearGradient38695);stroke-width:1px;stroke-linecap:round"
- d="M -86.46875,415.53125 -86.5,411.5 h 4"
- id="path38577"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.7;fill:none;stroke:url(#linearGradient38697);stroke-width:1px;stroke-linecap:round"
- d="M -92.46875,421.53125 -92.5,417.5 h 4"
- id="path38579"
- inkscape:connector-curvature="0" />
- <path
- id="path38581"
- d="M -86.46875,421.53125 -86.5,417.5 h 4"
- style="opacity:0.7;fill:none;stroke:url(#linearGradient38701);stroke-width:1px;stroke-linecap:round"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="48"
- x="-207.99432"
- height="9"
- width="9.0000038"
- id="rect37920-7"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- id="g38583"
- transform="translate(-137.99432,-356)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path38585"
- d="m -70.5,411.5 v -8 h 8 v 8 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffb769;fill-opacity:1;fill-rule:nonzero;stroke:#542b00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:0.8627451;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#462400;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -70.5,411.5 v -8 h 8"
- id="path38588"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.4;fill:none;stroke:url(#linearGradient38703);stroke-width:1px;stroke-linecap:round;enable-background:new"
- d="M -68.46875,409.53125 -68.5,405.5 h 4"
- id="path38590"
- inkscape:connector-curvature="0" />
- <path
- id="path38592"
- d="m -64.53125,405.5 0.03125,4.03125 h -4"
- style="display:inline;opacity:0.4;fill:none;stroke:url(#linearGradient38706);stroke-width:1px;stroke-linecap:round;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(505.99432,90)"
- id="ICON_UV_ISLANDSEL">
- <rect
- y="-185.99432"
- x="46"
- height="16"
- width="16"
- id="rect38650"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate"
- transform="matrix(0,1,1,0,0,0)" />
- <g
- style="opacity:0.5"
- id="g38652"
- transform="translate(-98.99432,-362)">
- <path
- d="m -85.5,422.5 h 4 v -12 h -4 z m 0,-6 h 4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path38654"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <rect
- ry="0"
- rx="0"
- y="410"
- x="-86"
- height="13"
- width="4.9999924"
- id="rect38657"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#linearGradient38720);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- id="path38659"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M -85.49999,422.49959 -81.5,422.5 -81.50001,410.50041 -85.5,410.5 Z m 0,-6 L -81.5,416.5"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.7;fill:none;stroke:url(#linearGradient38723);stroke-width:1px;stroke-linecap:round"
- d="M -84.46875,415.53125 -84.5,411.5 h 2"
- id="path38661"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- id="path38663"
- d="M -84.46875,421.53125 -84.5,417.5 h 2"
- style="opacity:0.7;fill:none;stroke:url(#linearGradient38725);stroke-width:1px;stroke-linecap:round"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(1,0,0,1.7057638,-106.49432,-641.33135)"
- id="g38665">
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffb769;fill-opacity:1;fill-rule:nonzero;stroke:#462400;stroke-width:0.76566803;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -71,412.03125 v -8.2055 h 7 v 8.2055 z"
- id="path38668"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path38670"
- d="m -69,407.19668 v -2.19843 h 2.75"
- style="display:inline;opacity:0.5;fill:none;stroke:url(#linearGradient38727);stroke-width:0.76566803px;stroke-linecap:round;enable-background:new"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.5;fill:none;stroke:url(#linearGradient38729);stroke-width:0.76566803px;stroke-linecap:round;enable-background:new"
- d="m -66,405.14481 v 2.19843 h -2.75"
- id="path38672"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- style="display:inline;opacity:0.5;fill:none;stroke:url(#linearGradient38731);stroke-width:0.76566803px;stroke-linecap:round;enable-background:new"
- d="m -69,410.71416 v -2.19843 h 2.75"
- id="path38674"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path38676"
- d="m -66,408.6623 v 2.19843 l -2.75,-10e-6"
- style="display:inline;opacity:0.5;fill:none;stroke:url(#linearGradient38736);stroke-width:0.76566803px;stroke-linecap:round;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_UV_EDGESEL"
- transform="translate(507.99432,90)">
- <rect
- transform="matrix(0,1,1,0,0,0)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate"
- id="rect39154"
- width="16"
- height="16"
- x="46"
- y="-229.99432" />
- <g
- transform="translate(-133.99432,-362)"
- id="g39157"
- style="opacity:0.55">
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path39159"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -93.5,422.5 h 12 v -12 h -12 z m 0,-6 h 12 m -6.00001,-5.99959 v 12"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#linearGradient39199);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect39161"
- width="13"
- height="13"
- x="-94.000008"
- y="410"
- rx="0"
- ry="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- d="m -93.5,422.5 h 12 l -1e-5,-11.99959 h -12 z m 0,-6 h 12 m -6.00001,-5.99959 1e-5,11.99959"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path39163"
- inkscape:connector-curvature="0" />
- <path
- id="path39165"
- d="M -92.46875,415.53125 -92.5,411.5 h 4"
- style="opacity:0.7;fill:none;stroke:url(#linearGradient39201);stroke-width:1px;stroke-linecap:round"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.7;fill:none;stroke:url(#linearGradient39203);stroke-width:1px;stroke-linecap:round"
- d="M -86.46875,415.53125 -86.5,411.5 h 4"
- id="path39167"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.7;fill:none;stroke:url(#linearGradient39205);stroke-width:1px;stroke-linecap:round"
- d="M -92.46875,421.53125 -92.5,417.5 h 4"
- id="path39169"
- inkscape:connector-curvature="0" />
- <path
- id="path39171"
- d="M -86.46875,421.53125 -86.5,417.5 h 4"
- style="opacity:0.7;fill:none;stroke:url(#linearGradient39207);stroke-width:1px;stroke-linecap:round"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37922"
- width="1.9785498"
- height="10"
- x="-215.97287"
- y="48" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37896-1"
- width="2.9785526"
- height="10"
- x="-227.99432"
- y="48" />
- <g
- id="g39173"
- transform="translate(-190.01023,-189.50001)">
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;fill:none;stroke:#542b00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:0.90196078"
- id="rect39175"
- width="1.9999995"
- height="9.999959"
- x="-38.484093"
- y="236.00082"
- transform="skewY(0.00121619)" />
- <rect
- transform="skewY(0.00210615)"
- y="236.5014"
- x="-37.984093"
- height="8.9999657"
- width="0.9999997"
- id="rect39178"
- style="display:inline;fill:#ffcb91;fill-opacity:1;fill-rule:nonzero"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- sodipodi:nodetypes="cccc"
- id="path39180"
- d="m -37.484093,246.00001 -0.9549,0.0112 -0.0271,-10.01124 1.982,4e-5 v 1"
- style="display:inline;fill:none;stroke:#462400;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="48"
- x="-221.97287"
- height="10"
- width="2.9785526"
- id="rect37920"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-184.01023,-189.50001)"
- id="g39182">
- <rect
- transform="skewY(0.00151966)"
- y="236.00104"
- x="-38.484093"
- height="9.9999399"
- width="1.9999998"
- id="rect39184"
- style="display:inline;fill:none;stroke:#542b00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:0.90196078"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;fill:#ffcb91;fill-opacity:1;fill-rule:nonzero"
- id="rect39186"
- width="0.99999994"
- height="9.0000439"
- x="-37.984093"
- y="236.50175"
- transform="skewY(0.00270791)" />
- <path
- style="display:inline;fill:none;stroke:#462400;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1"
- d="m -38.484093,237.00001 0.018,-1.00004 1.982,4e-5 v 1"
- id="path39189"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(-1,0,0,1,-252.97841,-189.50001)"
- id="g39191">
- <rect
- transform="skewY(0.00121619)"
- y="236.00082"
- x="-38.484093"
- height="9.999959"
- width="1.9999995"
- id="rect39193"
- style="display:inline;fill:none;stroke:#542b00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:0.90196078"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;fill:#ffcb91;fill-opacity:1;fill-rule:nonzero"
- id="rect39195"
- width="0.9999997"
- height="8.9999657"
- x="-37.984093"
- y="236.5014"
- transform="skewY(0.00210615)" />
- <path
- style="display:inline;fill:none;stroke:#462400;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000248;stroke-opacity:1"
- d="m -37.484093,246.00001 -0.9549,0.0112 -0.0271,-10.01124 1.982,4e-5 v 1"
- id="path39197"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_UV_VERTEXSEL">
- <rect
- y="257"
- x="136"
- height="16"
- width="16"
- id="rect39211"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate"
- transform="matrix(0,1,1,0,0,0)" />
- <g
- transform="translate(353,-272)"
- style="opacity:0.55"
- id="g39213">
- <path
- d="m -93.5,422.5 h 12 v -12 h -12 z m 0,-6 h 12 m -6.00001,-5.99959 v 12"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path39215"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- <rect
- ry="0"
- rx="0"
- y="410"
- x="-94.000008"
- height="13"
- width="13"
- id="rect39217"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#linearGradient39246);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- id="path39219"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -93.5,422.5 h 12 l -1e-5,-11.99959 h -12 z m 0,-6 h 12 m -6.00001,-5.99959 1e-5,11.99959"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.7;fill:none;stroke:url(#linearGradient39248);stroke-width:1px;stroke-linecap:round"
- d="M -92.46875,415.53125 -92.5,411.5 h 4"
- id="path39221"
- inkscape:connector-curvature="0" />
- <path
- id="path39223"
- d="M -86.46875,415.53125 -86.5,411.5 h 4"
- style="opacity:0.7;fill:none;stroke:url(#linearGradient39252);stroke-width:1px;stroke-linecap:round"
- inkscape:connector-curvature="0" />
- <path
- id="path39225"
- d="M -92.46875,421.53125 -92.5,417.5 h 4"
- style="opacity:0.7;fill:none;stroke:url(#linearGradient39255);stroke-width:1px;stroke-linecap:round"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.7;fill:none;stroke:url(#linearGradient39259);stroke-width:1px;stroke-linecap:round"
- d="M -86.46875,421.53125 -86.5,417.5 h 4"
- id="path39227"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- transform="rotate(-90)"
- rx="0"
- ry="0"
- y="257.5"
- x="-139.50027"
- height="3"
- width="2.9998772"
- id="rect39229"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#402100;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37866"
- width="3.9785564"
- height="4"
- x="258"
- y="137" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path39231"
- d="m 258,137 c 0,0.6694 10e-6,1.3388 10e-6,2.0082 0.66939,0 1.33877,0 2.00817,0 0,-0.6694 -10e-6,-1.3388 -10e-6,-2.0082 -0.66939,0 -1.33878,0 -2.00817,0 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffc17d;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="137"
- x="265.02145"
- height="4"
- width="3.9785564"
- id="rect37868"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- transform="rotate(-90)"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#402100;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect39233"
- width="2.9998772"
- height="3"
- x="-139.50031"
- y="264.49182"
- ry="0"
- rx="0" />
- <rect
- y="144"
- x="258.02145"
- height="4"
- width="3.9785564"
- id="rect37870"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37896"
- width="3.9785564"
- height="4"
- x="265.02145"
- y="144" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffc17d;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate"
- d="m 264.99183,137 c 0,0.6694 1e-5,1.3388 1e-5,2.0082 0.66939,0 1.33877,0 2.00817,0 0,-0.6694 -10e-6,-1.3388 -10e-6,-2.0082 -0.66939,0 -1.33878,0 -2.00817,0 z"
- id="path39235"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- rx="0"
- ry="0"
- y="257.49182"
- x="-146.4921"
- height="3"
- width="2.9998772"
- id="rect39237"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#402100;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="rotate(-90)" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path39239"
- d="m 257.99182,143.9918 c 0,0.6694 10e-6,1.3388 10e-6,2.0082 0.66939,0 1.33877,0 2.00817,0 0,-0.6694 -10e-6,-1.3388 -10e-6,-2.0082 -0.66939,0 -1.33878,0 -2.00817,0 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffc17d;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- transform="rotate(-90)"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#402100;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect39241"
- width="2.9998772"
- height="3"
- x="-146.4921"
- y="264.5"
- ry="0"
- rx="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffc17d;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate"
- d="m 265,143.9918 c 0,0.6694 10e-6,1.3388 10e-6,2.0082 0.66939,0 1.33877,0 2.00817,0 0,-0.6694 -10e-6,-1.3388 -10e-6,-2.0082 -0.66939,0 -1.33878,0 -2.00817,0 z"
- id="path39244"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_PLUGIN"
- transform="translate(42,63)">
- <rect
- ry="0"
- rx="0"
- y="535"
- x="488"
- height="16"
- width="16"
- id="rect39095"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- id="g39082">
- <g
- mask="url(#mask38956)"
- id="g38942"
- transform="translate(0,-21)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path38944"
- d="m 489.5,570.5 h 7.5 c 7.75,0 6.25,-9 2.5,-9 h -1"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cssc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cssc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient39115);stroke-width:1.39999998;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 489,570.5 h 8 c 7.75,0 6.25,-9 2.5,-9 h -1"
- id="path38946"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="cccsccccccc"
- id="path38948"
- d="m 493.5,535.5 c -0.554,0 -1,0.446 -1,1 v 8 c 0,0.554 0.446,1 1,1 0.554,0 1,-0.446 1,-1 h 1.5 c 1.939,0 3.5,-1.561 3.5,-3.5 v -1 c 0,-1.939 -1.561,-3.5 -3.5,-3.5 h -1.5 c 0,-0.554 -0.446,-1 -1,-1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffeeaa;fill-opacity:1;fill-rule:evenodd;stroke:#28220b;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 492.5,539.5 h -3 c -0.54593,0 -0.98543,-0.4395 -0.98543,-0.98544 0,-0.54593 0.4395,-0.98543 0.98543,-0.98543 h 3"
- id="rect38938"
- sodipodi:nodetypes="ccscc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient39117);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 494.5,543.59375 h 1.5 c 1.45545,0 2.59375,-1.1383 2.59375,-2.59375 v -1 c 0,-1.45545 -1.1383,-2.59375 -2.59375,-2.59375 h -1.5"
- id="path39045"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <rect
- ry="0.5"
- rx="0.49151421"
- y="536"
- x="493"
- height="9"
- width="1"
- id="rect38950"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient39119);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 494.5,542.5 h 1.5 c 0.94305,0 1.5,-0.55695 1.5,-1.5 v -1 c 0,-0.94305 -0.55695,-1.5 -1.5,-1.5 h -1.5"
- id="path39068"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect39052"
- width="1"
- height="7"
- x="494"
- y="537"
- rx="0.49151421"
- ry="0.5" />
- <path
- sodipodi:nodetypes="cccccc"
- id="path39076"
- d="m 494.5,542.5 h 1.5 c 0.94305,0 1.5,-0.55695 1.5,-1.5 v -1 c 0,-0.94305 -0.55695,-1.5 -1.5,-1.5 h -1.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient39122);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccscc"
- id="path39534"
- d="m 492.5,543.47087 h -3 c -0.54593,0 -0.98543,-0.4395 -0.98543,-0.98544 0,-0.54593 0.4395,-0.98543 0.98543,-0.98543 h 3"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffeeaa;fill-opacity:1;fill-rule:evenodd;stroke:#28220b;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(-105,212.00008)"
- id="ICON_QUESTION"
- style="display:inline;enable-background:new">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g22298.png"
- id="g39240"
- transform="translate(5.4013367,9.4697686)"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect39242"
- width="16"
- height="16"
- x="125.59866"
- y="397.53015" />
- <g
- style="display:inline"
- transform="translate(2.6147745,160.52205)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g39244">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- transform="matrix(0.927848,0,0,0.916217,-28.19594,40.73172)"
- id="g39246"
- style="display:inline">
- <circle
- transform="matrix(1.0155084,0,0,1.0286863,37.51084,101.58226)"
- style="fill:url(#linearGradient39261);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.8489247;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path39248"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- style="display:inline;fill:none;stroke:url(#linearGradient39265);stroke-width:1.17973554;stroke-opacity:1"
- id="g39250"
- transform="matrix(0.784039,0,0,0.779055,-3.508124,71.29625)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path39252"
- style="fill:none;stroke:url(#linearGradient39263);stroke-width:1.22986293;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(1.0337319,0,0,1.0470635,35.105336,99.413761)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- </g>
- <path
- sodipodi:nodetypes="cccccccccccccccccccccccccc"
- id="path39309"
- transform="translate(105,-235.00008)"
- d="m 32,645 v 1 h -1 v 2 h 2 v -1 h 2 v 2 h -1 v 1.25 H 33 V 652 h 2 v -1.5 h 1 v -1 h 1 V 646 h -1 v -1 z m 1,8 v 2 h 2 v -2 z"
- style="display:inline;opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- d="m 32,645 v 1 h -1 v 2 h 2 v -1 h 2 l -0.02802,1.97638 h -1 L 34,650.25 H 33 V 652 h 2 v -1.5 h 1 v -1 h 1 V 646 h -1 v -1 z m 1,8 v 2 h 2 v -2 z"
- transform="translate(105,-235.00008)"
- id="path11803-1"
- sodipodi:nodetypes="cccccccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-3.0078133e-8,128.00008)"
- id="ICON_INFO"
- style="display:inline;enable-background:new">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g22298.png"
- id="g39696"
- transform="translate(5.4013367,9.4697686)"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect39698"
- width="16"
- height="16"
- x="125.59866"
- y="397.53015" />
- <g
- style="display:inline"
- transform="translate(2.6147745,160.52205)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g39700">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- transform="matrix(0.927848,0,0,0.916217,-28.19594,40.73172)"
- id="g39702"
- style="display:inline">
- <circle
- transform="matrix(0.8835182,0,0,0.8949854,54.933548,117.35897)"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient39261-4-5);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.97574574;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path39704"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- style="display:inline;fill:none;stroke:url(#linearGradient39718);stroke-width:1.17973554;stroke-opacity:1"
- id="g39706"
- transform="matrix(0.784039,0,0,0.779055,-3.508124,71.29625)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path39708"
- style="fill:none;stroke:url(#linearGradient39716);stroke-width:1.44816053;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.87787,0,0,0.889264,55.67911,118.0341)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- </g>
- <g
- id="g39802"
- style="opacity:0.7;stroke:#000000">
- <path
- style="fill:#ffffff;fill-rule:evenodd;stroke:#000000"
- d="m 138,413.99992 c 0.25,0 2,0 2,0 v 4 h 0.75 v 1 h -3.5 v -1 H 138 v -3 c -0.66667,0 4.15703,0 -1.25,0 l 0.5,-1 z"
- id="path39804"
- sodipodi:nodetypes="cccccccccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect39806"
- width="2"
- height="2"
- x="138"
- y="410.99991"
- rx="0"
- ry="0" />
- </g>
- <g
- id="g39798">
- <path
- sodipodi:nodetypes="cccccccccccc"
- id="path39710"
- d="m 138,413.99992 c 0.25,0 2,0 2,0 v 4 h 0.75 v 1 h -3.5 v -1 H 138 v -3 c -0.66667,0 4.15703,0 -1.25,0 l 0.5,-1 z"
- style="fill:#ffffff;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <rect
- ry="0"
- rx="0"
- y="410.99991"
- x="138"
- height="2"
- width="2"
- id="rect39712"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- id="ICON_IMAGE_RGB_ALPHA">
- <g
- style="opacity:0.25"
- transform="translate(275,-385.99999)"
- id="g17336">
- <rect
- y="396"
- x="-60"
- height="16"
- width="16"
- id="rect17338"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g17340">
- <rect
- ry="0"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient32725);fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect17342"
- width="13.016124"
- height="12.953857"
- x="-58.500015"
- y="397.54614" />
- <rect
- y="398"
- x="-56.983894"
- height="11.046139"
- width="11.000001"
- id="rect17344"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient32727);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00207269;marker:none;enable-background:accumulate"
- ry="0" />
- <path
- inkscape:connector-curvature="0"
- id="path17346"
- d="m -58,398 v 2 h 2 v -2 z m 2,2 v 2 h 2 v -2 z m 2,0 h 2 v -2 h -2 z m 2,0 v 2 h 2 v -2 z m 2,0 h 2 v -2 h -2 z m 2,0 v 2 h 2 v -2 z m 0,2 h -2 v 2 h 2 z m 0,2 v 2 h 2 v -2 z m 0,2 h -2 v 2 h 2 z m 0,2 v 2 h 2 v -2 z m -2,0 h -2 v 2 h 2 z m -2,0 v -2 h -2 v 2 z m -2,0 h -2 v 2 h 2 z m -2,0 v -2 h -2 v 2 z m 0,-2 h 2 v -2 h -2 z m 0,-2 v -2 h -2 v 2 z m 2,0 h 2 v -2 h -2 z m 2,0 v 2 h 2 v -2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient32729);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.45;fill:none;stroke:url(#linearGradient32731);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m -46.482307,398.50001 h -11.017704 v 11 h 11.017704 v -11"
- id="path17348"
- sodipodi:nodetypes="ccc" />
- </g>
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path17578"
- d="m 217.5,24.000005 11.5,-11.5"
- style="opacity:0.65;fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <g
- mask="url(#mask40306)"
- transform="translate(21)"
- id="g40264">
- <rect
- y="11.546152"
- x="195.49998"
- height="12.953857"
- width="13.016124"
- id="rect40266"
- style="display:inline;overflow:visible;visibility:visible;fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- ry="0" />
- <rect
- ry="0"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient40295);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00207269;marker:none;enable-background:accumulate"
- id="rect40268"
- width="11.000001"
- height="11.046139"
- x="197.01611"
- y="12.00001" />
- <g
- transform="translate(146.99999,-417.99999)"
- id="g40270">
- <g
- id="g40272"
- transform="translate(-146.99999,417.99999)">
- <rect
- y="12"
- x="196"
- height="3"
- width="3"
- id="rect40276"
- style="display:inline;overflow:visible;visibility:visible;fill:#106386;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <rect
- y="15"
- x="199"
- height="3"
- width="3"
- id="rect40278"
- style="display:inline;overflow:visible;visibility:visible;fill:#ba0036;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#9f0022;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect40280"
- width="3"
- height="3"
- x="202"
- y="12" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#688c7f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect40282"
- width="3"
- height="3"
- x="205"
- y="15" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#b77100;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect40284"
- width="3"
- height="3"
- x="196"
- y="18" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#a67c58;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect40286"
- width="3"
- height="3"
- x="199"
- y="21" />
- <rect
- y="18"
- x="202"
- height="3"
- width="3"
- id="rect40288"
- style="display:inline;overflow:visible;visibility:visible;fill:#7a2537;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <rect
- y="21"
- x="205"
- height="3"
- width="3"
- id="rect40290"
- style="display:inline;overflow:visible;visibility:visible;fill:#869c2b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path40292"
- d="m 207.51769,12.50001 h -11.0177 v 11 h 11.0177 v -11"
- style="fill:none;stroke:url(#linearGradient40297);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
- </g>
- </g>
- <g
- id="ICON_COPYDOWN"
- transform="translate(0,-62.1)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect38951"
- width="16"
- height="16"
- x="26"
- y="198" />
- <g
- style="display:inline;enable-background:new"
- id="g39096-7"
- transform="translate(26.00079,19.1)">
- <rect
- rx="1.3125"
- ry="1.3125001"
- y="180.53122"
- x="5.4992032"
- height="9.9687805"
- width="10.000007"
- id="rect39098-7"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient40731);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path39100-7"
- d="m 6.5,181.53121 h 7.99921 V 189.5 H 6.5 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient40733-0);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(-1.00079,-19)"
- style="display:inline;fill:#ffffff;enable-background:new"
- id="g39118-3">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.60000002;marker:none;enable-background:accumulate"
- d="M 10.25,199 C 10.1115,199 10,199.1115 10,199.25 V 201 H 9.5 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 4 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 H 13 v -1.75 C 13,199.1115 12.8885,199 12.75,199 Z"
- id="path39183-3"
- inkscape:connector-curvature="0" />
- <path
- id="rect39114-5"
- d="M 10.25,199 C 10.1115,199 10,199.1115 10,199.25 V 201 H 9.5 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 4 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 H 13 v -1.75 C 13,199.1115 12.8885,199 12.75,199 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60000002;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="opacity:0.45;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 9.49921,181.5 h 2"
- id="path39106-9"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(0,-1,-1,0,212.75,247.25)"
- id="g38966">
- <g
- id="g38968"
- transform="rotate(180,107.625,111.375)">
- <path
- sodipodi:nodetypes="ccc"
- style="display:inline;fill:none;stroke:#000000;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 174.5,38.5 v 5 h 5"
- id="path38970"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cz"
- id="path38972"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 175.5,42.5 5,-5"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-146.75,127.75)"
- id="g38975">
- <g
- style="display:inline"
- transform="rotate(180,136.08065,77.999995)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g38977">
- <path
- d=""
- sodipodi:nodetypes="cz"
- id="path38984"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cz"
- id="path38987"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d=""
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate"
- d="m 188,51 v 6 h -1 v -5 h -5 v -1 z"
- id="path38994"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <g
- id="g38996"
- style="opacity:0.2"
- transform="matrix(-1,0,0,1,-29,-335)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- id="path38998"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- transform="rotate(180,59.20565,145.375)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g39000">
- <path
- d=""
- sodipodi:nodetypes="cz"
- id="path39015"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cz"
- id="path39017"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 78.1613,110.99999 5.5,-5.5"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(-1,0,0,1,-175.75,-207.25)"
- style="opacity:0.2"
- id="g39020">
- <path
- sodipodi:nodetypes="ccccccc"
- id="path39022"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- id="ICON_PASTEDOWN"
- transform="translate(-1,-62)">
- <rect
- y="198"
- x="6"
- height="16"
- width="16"
- id="rect38948"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g39096"
- transform="translate(1.00079,19)">
- <rect
- rx="1.3125"
- ry="1.3125001"
- y="180.53122"
- x="5.4992032"
- height="9.9687805"
- width="10.000007"
- id="rect39098"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient40731);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path39100"
- d="m 6.5,181.53121 h 7.99921 V 189.5 H 6.5 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient40733);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(-1.00079,-19)"
- style="display:inline;fill:#ffffff;enable-background:new"
- id="g39118">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.60000002;marker:none;enable-background:accumulate"
- d="M 10.25,199 C 10.1115,199 10,199.1115 10,199.25 V 201 H 9.5 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 4 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 H 13 v -1.75 C 13,199.1115 12.8885,199 12.75,199 Z"
- id="path39183"
- inkscape:connector-curvature="0" />
- <path
- id="rect39114"
- d="M 10.25,199 C 10.1115,199 10,199.1115 10,199.25 V 201 H 9.5 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 4 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 H 13 v -1.75 C 13,199.1115 12.8885,199 12.75,199 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60000002;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="opacity:0.45;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 9.49921,181.5 h 2"
- id="path39106"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g39052"
- transform="rotate(90,14,185.75)">
- <g
- transform="rotate(180,107.625,111.375)"
- id="g39054">
- <path
- id="path39056"
- d="m 174.5,38.5 v 5 h 5"
- style="display:inline;fill:none;stroke:#000000;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- d="m 175.5,42.5 5,-5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path39058"
- sodipodi:nodetypes="cz"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g39060"
- transform="translate(-146.75,127.75)">
- <g
- id="g39062"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="rotate(180,136.08065,77.999995)"
- style="display:inline">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path39064"
- sodipodi:nodetypes="cz"
- d=""
- inkscape:connector-curvature="0" />
- <path
- d=""
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path39066"
- sodipodi:nodetypes="cz"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccccccc"
- id="path39069"
- d="m 188,51 v 6 h -1 v -5 h -5 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- transform="matrix(-1,0,0,1,-29,-335)"
- style="opacity:0.2"
- id="g39071">
- <path
- sodipodi:nodetypes="ccccccc"
- id="path39073"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g39076"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="rotate(180,59.20565,145.375)"
- style="display:inline">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path39078"
- sodipodi:nodetypes="cz"
- d=""
- inkscape:connector-curvature="0" />
- <path
- d="m 78.1613,110.99999 5.5,-5.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path39080"
- sodipodi:nodetypes="cz"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g39083"
- style="opacity:0.2"
- transform="matrix(-1,0,0,1,-175.75,-207.25)">
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- id="path39085"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_LINK_AREA"
- transform="translate(232,503)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect40824"
- width="16"
- height="16"
- x="-17"
- y="94" />
- <g
- id="g39622"
- transform="translate(-3.2236328e-6,0.9999981)">
- <g
- transform="translate(-83.999951,1.9073486e-6)"
- style="opacity:0.6"
- id="g40663">
- <rect
- style="fill:url(#linearGradient40875-3-9-8);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect40665"
- width="7.9999967"
- height="9.9999981"
- x="69.499954"
- y="94.5"
- rx="0"
- ry="0" />
- <rect
- style="display:inline;fill:none;stroke:url(#linearGradient40877-5-5-9);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect40667"
- width="5.9999967"
- height="7.9999981"
- x="70.499954"
- y="95.5"
- rx="0"
- ry="0" />
- </g>
- <g
- id="g40669"
- transform="translate(-85,-1)">
- <rect
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect40671"
- width="8.0000029"
- height="9.0000019"
- x="73.5"
- y="98.5"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="99"
- x="74"
- height="9"
- width="7"
- id="rect40673"
- style="fill:url(#linearGradient40879-9-8-1);fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <path
- style="fill:none;stroke:#333333;stroke-width:0.7499997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="M 73.5,103.75 V 98.5 h 4"
- id="path40675"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;fill:none;stroke:url(#linearGradient40881-8-0-8);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect40677"
- width="6.0000033"
- height="7.0000019"
- x="74.5"
- y="99.5"
- rx="0"
- ry="0" />
- </g>
- <rect
- style="display:inline;opacity:0.4;fill:url(#radialGradient40883-4-0-3);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- id="rect40679"
- width="7.0000033"
- height="8.0000019"
- x="-11"
- y="98"
- rx="0"
- ry="0" />
- </g>
- <g
- transform="translate(-122.97615,-9.9999881)"
- id="g40681">
- <path
- id="path40683"
- d="m 116.47121,117.5 h -3.99506"
- style="fill:none;stroke:#2d2d2d;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- mask="none"
- sodipodi:nodetypes="ccccccccccccsccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 114.4449,117.46875 c 0,-1.65264 1.12861,-2.96875 2.78125,-2.96875 h 1.5 c 1.65264,0 2.71875,1.31617 2.71875,2.9688 v 0.0625 c 0,1.65264 -1.06611,2.9687 -2.71875,2.9687 h -1.5 c -1.65264,0 -2.78125,-1.31612 -2.78125,-2.96875 z m 2.03125,0.0312 c 0,0.554 0.2585,0.99995 0.8125,0.99995 l 1.40625,-0.0312 c 0.554,0 0.78125,-0.41475 0.78125,-0.96875 0,-0.554 -0.22725,-1.03125 -0.78125,-1.03125 l -1.40625,0.0312 c -0.554,0 -0.8125,0.44605 -0.8125,1.00005 z"
- id="path40685"
- inkscape:connector-curvature="0" />
- <rect
- y="116"
- x="115"
- height="2.47615"
- width="1"
- id="rect40687"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- transform="matrix(0,1,1,0,0,0)" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect40689"
- width="1"
- height="1"
- x="116"
- y="115"
- transform="matrix(0,1,1,0,0,0)" />
- <path
- id="path40691"
- d="m 106.4449,117.4688 c 0,-1.65264 1.12861,-2.96875 2.78125,-2.96875 l 1.5,-5e-5 c 1.65264,0 2.71875,1.31617 2.71875,2.9688 v 0.0625 c 0,1.65264 -1.06611,2.9687 -2.71875,2.9687 l -1.5,5e-5 c -1.65264,0 -2.78125,-1.31612 -2.78125,-2.96875 z m 2.03125,0.0312 c 0,0.554 0.2585,1 0.8125,1 l 1.4375,-5e-5 c 0.554,0 0.75,-0.44595 0.75,-0.99995 0,-0.554 -0.196,-1.00005 -0.75,-1.00005 l -1.4375,5e-5 c -0.554,0 -0.8125,0.446 -0.8125,1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccccccccsccc"
- mask="none"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect40693"
- width="0.99998814"
- height="2.5000362"
- x="115"
- y="107.97615"
- transform="matrix(0,1,1,0,0,0)" />
- <rect
- y="106.97615"
- x="116"
- height="1"
- width="1"
- id="rect40695"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- transform="matrix(0,1,1,0,0,0)" />
- <path
- style="opacity:0.55;fill:none;stroke:#1a1a1a;stroke-width:2.79440284;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 116.47121,117.5 -4.99506,-1e-5"
- id="path40697"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 116.47121,117.5 -4.99506,-1e-5"
- id="path40699"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <rect
- y="118.97615"
- x="119"
- height="1"
- width="1"
- id="rect40701"
- style="display:inline;overflow:visible;visibility:visible;fill:#dcdcdc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- transform="matrix(0,1,1,0,0,0)" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#dcdcdc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect40703"
- width="1"
- height="1"
- x="115"
- y="118.97615"
- transform="matrix(0,1,1,0,0,0)" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#dcdcdc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect40705"
- width="1"
- height="1"
- x="119"
- y="111"
- transform="matrix(0,1,1,0,0,0)" />
- <rect
- y="111"
- x="115"
- height="1"
- width="1"
- id="rect40707"
- style="display:inline;overflow:visible;visibility:visible;fill:#dcdcdc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- transform="matrix(0,1,1,0,0,0)" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect40709"
- width="1"
- height="0.97614998"
- x="117"
- y="118"
- transform="matrix(0,1,1,0,0,0)" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_URL"
- transform="translate(455.99408,547.99927)"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 3\URL link 1.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- y="29"
- x="-31"
- height="16"
- width="16"
- id="rect40643"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- id="g40513"
- style="opacity:0.8">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path40465"
- d="M -27.80208,29.59375 -19.5,29.5 -19.53126,42.40625 -30.5,42.5 l 0.03125,-9.90625 z"
- style="display:inline;fill:url(#linearGradient40511-7-9-5);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- d="m -29.5,34 v 7.5 m 3.5,-11 h 5.5"
- style="display:inline;fill:none;stroke:url(#linearGradient40507-4-8-1);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- id="path40469"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.5;fill:url(#radialGradient40649-2-6-6);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="M -27.80208,29.59375 -19.5,29.5 -19.53126,42.40625 -30.5,42.5 l 0.03125,-9.90625 z"
- id="path40645"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m -31,33 h 4 v -4 z"
- id="path40471"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="M -30.5,32.00001 V 42.5 l 11,-1e-5 V 29.5 l -8.5,10e-6 z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path40473"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path40475"
- d="m -26.5,31.5 v 2 h -2"
- style="fill:none;stroke:url(#linearGradient40502-7-8-3);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g40263"
- transform="matrix(0.8738816,0,0,0.8823479,-135.18828,-60.939841)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:#3771c8;fill-opacity:1;fill-rule:nonzero;stroke:#040910;stroke-width:1.45371544;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path40265"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.787566,0,0,0.779223,26.709197,21.3179)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- id="path40267"
- style="fill:url(#linearGradient40635-7-2-2);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.666432,0,0,0.659342,42.69924,35.46375)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.3631382,0,0,0.3593485,81.755824,69.904768)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- style="opacity:0.7;fill:url(#linearGradient40637-9-5-8);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path40269"
- cx="132"
- cy="118"
- r="8" />
- <path
- sodipodi:nodetypes="cc"
- id="path40271"
- d="m 274.98515,70.995347 c 0,0.953349 -1,1.906699 -2,1.906699"
- style="display:inline;opacity:0.5;fill:none;stroke:#ffe680;stroke-width:1.18410921px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter13996-9-7-7)"
- transform="matrix(0.9688184,0,0,0.9547322,-131.63668,47.640696)"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccssscsscccscccccccccccccccsccccc"
- id="path40273"
- d="m 130.67404,112.3079 c 0.0244,0.78706 -0.15754,1.63085 0.59269,2.02213 0.71197,-0.0434 1.49133,0.64122 1.35667,1.40517 -0.26776,0.77861 0.14071,1.12325 0.95576,1.36401 0.57868,-0.0716 0.79053,-0.93546 0.87357,-1.36401 0.0948,-1.27121 0.51542,-1.09421 0.82108,-1.98991 -0.45733,-0.91502 -0.003,-1.04443 -0.72629,-1.43739 m -1.00945,-3.89288 c -0.4426,0.34378 -0.24372,1.04314 -0.66162,1.39841 -0.45372,0.13628 -0.78226,-0.0605 -1.16771,0.43164 -0.30841,1.10457 0.35004,1.22306 0.90205,1.10457 0.49538,-0.0502 0.61419,-0.94321 0.97928,-0.37853 0.0831,0.10976 0.71917,-0.0403 0.86266,0.18898 0.0669,0.10682 -0.11785,0.0255 -0.14729,0.18955 -0.0428,0.23847 0.27734,0.37341 0.372,0.3824 0.32089,0.0305 0.60005,0.92548 0.83846,1.05499 0,0.46738 0.0924,-0.6774 0.3515,-0.78703 0.22948,-0.0971 0.47929,0.10731 0.5,0 0.29928,-1.55081 -1.26113,-3.00604 -2.82933,-3.58498 z M 128.96474,107.5 c -0.6111,1.01384 0.85343,1.46103 1.73001,1.21329 0.57897,-0.37879 1.00716,-0.92331 0.55665,-1.21329 -0.20614,-0.1415 -2.07706,0.0431 -2.28666,0 z m -1.372,1.37253 c -0.49575,-0.14959 0.44952,-0.11945 0.45733,0.45751 0.1696,0.54756 -0.42801,0.23756 0,0.45752 0.70893,0.1644 0.35328,1.70031 -0.28114,1.56208 -0.56042,0.10119 -0.43915,0.95826 -1.64865,0.88279 -0.0836,0.0755 -1.04512,0.61593 -0.81421,1.21521 1.12968,0.30162 -0.36816,1.26478 -0.43867,0.55236 -0.15441,-0.49797 -0.62853,-1.11348 -0.43994,-1.68674 0.11734,-0.63627 0.5689,-1.12263 0.82646,-1.69865 0.36225,-0.61946 0.89084,-1.17688 1.57758,-1.42595 0.21411,-0.16799 0.46159,-0.41691 0.76124,-0.31613 z m -0.91467,5.03262 c -0.55163,-0.27585 -0.72934,0.28829 -0.60377,0.7984 0.15577,0.47138 0.52607,0.97695 0.72628,1.43739 0.40435,0.49619 1.512,1.34081 2.17883,1.67696 0.31768,0.16015 0.48418,0 0.24209,-0.23956 -0.31367,-0.6375 -1.14073,-1.94893 -0.48418,-2.15609 0.59647,-0.60342 0.34203,-1.58773 -0.48419,-1.43739 -0.54779,-0.25818 -0.75551,-0.39899 -1.38855,-0.0752 -0.0558,0.0743 -0.12403,0.006 -0.18651,-0.004 z"
- style="fill:url(#linearGradient40639-1-2-1);fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path40275"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#linearGradient40641-9-2-7);stroke-width:1.78065979;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6429129,0,0,0.6362007,45.809534,38.194473)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- id="path40277"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(0.06052282,0,0,0.05989117,121.21686,103.80334)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_NEW"
- transform="translate(497,652)">
- <rect
- y="-75"
- x="-135"
- height="16"
- width="16"
- id="rect41622"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- id="g41624"
- style="display:inline;enable-background:new"
- transform="matrix(1,0,0,0.9999542,-104,-101.99865)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path41626"
- d="M -27.80208,29.59375 -19.5,29.5 -19.53126,42.40625 -30.5,42.5 l 0.03125,-9.90625 z"
- style="display:inline;fill:url(#linearGradient41638-8-6);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- d="m -29.5,34 v 7.5 m 3.5,-11 h 5.5"
- style="display:inline;fill:none;stroke:url(#linearGradient41640-2-0);stroke-width:1.00002289px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- id="path41628"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.5;fill:url(#radialGradient41642-5-0);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="M -27.80208,29.59375 -19.5,29.5 -19.53126,42.40625 -30.5,42.5 l 0.03125,-9.90625 z"
- id="path41630"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m -31,33 h 4 v -4 z"
- id="path41632"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="M -30.5,32.00001 V 42.5 l 11,-1e-5 V 29.5 l -8.5,10e-6 z"
- style="fill:none;stroke:#000000;stroke-width:0.80001831;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path41634"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path41636"
- d="m -26.5,31.5 v 2 h -2"
- style="fill:none;stroke:url(#linearGradient41644-5-4);stroke-width:1.00002289px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g43546-0"
- transform="matrix(0.9986805,0,0,1,-443.5692,-347.00003)">
- <rect
- rx="1.2018067"
- y="274.00003"
- x="317.9888"
- height="4.9999909"
- width="5.006597"
- id="rect43548-7"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:none;stroke:#fac900;stroke-width:4.00264168;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate"
- ry="1.2018067" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:none;stroke:#e6b800;stroke-width:2.00132084;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.39511871;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect43550-6"
- width="5.0065966"
- height="4.9999905"
- x="317.9888"
- y="274.00003"
- rx="1.2018069"
- ry="1.2018069" />
- <path
- sodipodi:nodetypes="ccccccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path43552-3"
- d="m 317.98879,278 v -3 l 1.00132,-1 h 3.00396 l 1.00132,1 v 3 l -1.00132,1 h -3.00396 z"
- style="opacity:0.8;fill:#dcb000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#967800;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 318.9901,278.50003 c 0,-1.33336 3e-5,-2.66664 3e-5,-4 1.00132,0 2.00263,0 3.00395,0 0,1.33336 -3e-5,2.66664 -3e-5,4 -1.00132,0 -2.00263,0 -3.00395,0 z"
- id="path43554-6"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path43583-1"
- d="m 318.48944,278.00003 c 0,-1.00002 4e-5,-1.99998 4e-5,-3 1.33509,0 2.67017,0 4.00526,0 0,1.00002 -4e-5,1.99998 -4e-5,3 -1.33509,0 -2.67017,0 -4.00526,0 z"
- style="fill:#967800;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 317.98877,276 c 1.66888,0 3.33774,10e-6 5.00662,10e-6 0,0.33335 0,0.6667 0,1.00005 -1.66888,0 -3.33774,-1e-5 -5.00662,-1e-5 0,-0.33335 0,-0.6667 0,-1.00005 z"
- id="path43556-5"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path43558-4"
- d="m 319.99139,279.00006 c 0,-1.66671 10e-6,-3.33335 10e-6,-5.00006 0.33379,0 0.66758,0 1.00137,0 0,1.66671 -1e-5,3.33335 -1e-5,5.00006 -0.33379,0 -0.66758,0 -1.00137,0 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(378,684)"
- style="display:inline;enable-background:new"
- id="ICON_COPY_ID">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect40773"
- width="16"
- height="16"
- x="-205"
- y="-87" />
- <g
- transform="translate(-272,-181)"
- style="opacity:0.6"
- id="g40789">
- <rect
- style="fill:url(#linearGradient39136-2-0);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect40791"
- width="9.0000124"
- height="10.000001"
- x="68.5"
- y="95.5"
- rx="0"
- ry="0" />
- <rect
- style="display:inline;fill:none;stroke:url(#linearGradient39138-8-6);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect40793"
- width="7.0000038"
- height="8.0000086"
- x="69.5"
- y="96.5"
- rx="0"
- ry="0" />
- </g>
- <g
- id="g40795"
- transform="translate(-273.00002,-181)">
- <rect
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect40797"
- width="8.9999342"
- height="10.000006"
- x="73.500023"
- y="99.5"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="100"
- x="74.000023"
- height="9"
- width="8.0000086"
- id="rect40799"
- style="fill:url(#linearGradient39140-6-8);fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <path
- style="fill:none;stroke:#333333;stroke-width:0.7499997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 73.5,103.75 2e-5,-4.25 h 4"
- id="path40801"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;fill:none;stroke:url(#linearGradient39143-0-6);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect40803"
- width="7.0000048"
- height="8.0000267"
- x="74.500023"
- y="100.5"
- rx="0"
- ry="0" />
- </g>
- <g
- style="fill:#800000"
- id="g37993">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#800000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"
- id="rect37978"
- width="2.00001"
- height="1.0000038"
- x="-198"
- y="-77" />
- <rect
- y="-76"
- x="-197.00002"
- height="2"
- width="1.0000153"
- id="rect37980"
- style="display:inline;overflow:visible;visibility:visible;fill:#800000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#800000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"
- id="rect37982"
- width="1.0000153"
- height="1"
- x="-197.00002"
- y="-79" />
- <rect
- y="-75"
- x="-194.5"
- height="1.0000088"
- width="1.4999988"
- id="rect37984"
- style="display:inline;overflow:visible;visibility:visible;fill:#800000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" />
- <rect
- y="-76"
- x="-195.00002"
- height="1"
- width="1.0000153"
- id="rect37986"
- style="display:inline;overflow:visible;visibility:visible;fill:#800000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#800000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"
- id="rect37988"
- width="1.5000049"
- height="1.0000198"
- x="-194.5"
- y="-77" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#800000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.70000005;marker:none;enable-background:accumulate"
- id="rect37990"
- width="1.0000153"
- height="5"
- x="-193.00002"
- y="-79" />
- </g>
- </g>
- <g
- id="ICON_PASTEFLIPDOWN">
- <g
- clip-path="url(#clipPath40902)"
- id="g40560"
- transform="matrix(-1,0,0,1,90,-62)">
- <rect
- y="198"
- x="6"
- height="16"
- width="16"
- id="rect40562"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="opacity:0.4"
- id="g40565"
- transform="matrix(-1,0,0,1,21.999203,19)">
- <rect
- rx="1.3125"
- ry="1.3125001"
- y="180.53122"
- x="5.4992032"
- height="9.9687805"
- width="10.000007"
- id="rect40567"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient40731);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path40569"
- d="m 6.5,181.53121 h 7.99921 V 189.5 H 6.5 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient40679);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(-1.00079,-19)"
- style="display:inline;fill:#ffffff;enable-background:new"
- id="g40571">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.60000002;marker:none;enable-background:accumulate"
- d="M 10.25,199 C 10.1115,199 10,199.1115 10,199.25 V 201 H 9.5 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 4 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 H 13 v -1.75 C 13,199.1115 12.8885,199 12.75,199 Z"
- id="path40573"
- inkscape:connector-curvature="0" />
- <path
- id="path40575"
- d="M 10.25,199 C 10.1115,199 10,199.1115 10,199.25 V 201 H 9.5 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 4 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 H 13 v -1.75 C 13,199.1115 12.8885,199 12.75,199 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60000002;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="opacity:0.45;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 9.49921,181.5 h 2"
- id="path40577"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g40581"
- transform="rotate(90,14,185.75)">
- <g
- transform="rotate(180,107.625,111.375)"
- id="g40583">
- <path
- id="path40585"
- d="m 174.5,38.5 v 5 h 5"
- style="display:inline;fill:none;stroke:#00112b;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- d="m 175.5,42.5 5,-5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#00112b;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path40587"
- sodipodi:nodetypes="cz"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g40589"
- transform="translate(-146.75,127.75)">
- <g
- id="g40591"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="rotate(180,136.08065,77.999995)"
- style="display:inline">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path40593"
- sodipodi:nodetypes="cz"
- d=""
- inkscape:connector-curvature="0" />
- <path
- d=""
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path40595"
- sodipodi:nodetypes="cz"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccccccc"
- id="path40597"
- d="m 188,51 v 6 h -1 v -5 h -5 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#c3dbff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- transform="matrix(-1,0,0,1,-29,-335)"
- style="opacity:0.2"
- id="g40599">
- <path
- sodipodi:nodetypes="ccccccc"
- id="path40602"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g40604"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="rotate(180,59.20565,145.375)"
- style="display:inline">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path40606"
- sodipodi:nodetypes="cz"
- d=""
- inkscape:connector-curvature="0" />
- <path
- d="m 78.1613,110.99999 5.5,-5.5"
- style="display:inline;overflow:visible;visibility:visible;fill:#abcdff;fill-opacity:1;stroke:#c3dbff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path40609"
- sodipodi:nodetypes="cz"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g40611"
- style="opacity:0.2"
- transform="matrix(-1,0,0,1,-175.75,-207.25)">
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- id="path40613"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- transform="rotate(-45,-70.095451,198.2929)"
- style="display:inline;enable-background:new"
- id="g27675-3">
- <path
- sodipodi:nodetypes="cc"
- id="path27679-1"
- d="m 73.191498,271.86917 7.071067,-7.07107"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- d="m 71.600508,272.3995 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071 m 2.121321,-2.12133 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.95;fill:none;stroke:#28220b;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="path42388-0"
- inkscape:connector-curvature="0" />
- <path
- id="path42359-1"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffe991;stroke-width:1.19999993;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 71.600508,272.3995 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071 m 2.121321,-2.12133 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_PASTEFLIPUP">
- <g
- clip-path="url(#clipPath40897)"
- id="g40506"
- transform="matrix(-1,0,0,1,89,-62)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect40508"
- width="16"
- height="16"
- x="26"
- y="198" />
- <g
- transform="matrix(-1,0,0,1,46.99921,19)"
- id="g39096-2"
- style="display:inline;opacity:0.4;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient40731);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect39098-5"
- width="10.000007"
- height="9.9687805"
- x="5.4992032"
- y="180.53122"
- ry="1.3125001"
- rx="1.3125" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient40733-03);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 6.5,181.53121 h 7.99921 V 189.5 H 6.5 Z"
- id="path39100-0"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <g
- id="g39118-9"
- style="display:inline;fill:#ffffff;enable-background:new"
- transform="translate(-1.00079,-19)">
- <path
- id="path39183-4"
- d="M 10.25,199 C 10.1115,199 10,199.1115 10,199.25 V 201 H 9.5 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 4 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 H 13 v -1.75 C 13,199.1115 12.8885,199 12.75,199 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.60000002;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60000002;marker:none;enable-background:accumulate"
- d="M 10.25,199 C 10.1115,199 10,199.1115 10,199.25 V 201 H 9.5 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 4 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 H 13 v -1.75 C 13,199.1115 12.8885,199 12.75,199 Z"
- id="rect39114-7"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path39106-8"
- d="m 9.49921,181.5 h 2"
- style="opacity:0.45;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(0,-1,-1,0,212.75,247.25)"
- id="g40522">
- <g
- id="g40526"
- transform="rotate(180,107.625,111.375)">
- <path
- sodipodi:nodetypes="ccc"
- style="display:inline;fill:none;stroke:#00112b;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 174.5,38.5 v 5 h 5"
- id="path40528"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cz"
- id="path40533"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#00112b;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 175.5,42.5 5,-5"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-146.75,127.75)"
- id="g40535">
- <g
- style="display:inline"
- transform="rotate(180,136.08065,77.999995)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g40537">
- <path
- d=""
- sodipodi:nodetypes="cz"
- id="path40539"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cz"
- id="path40541"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d=""
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#c3dbff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate"
- d="m 188,51 v 6 h -1 v -5 h -5 v -1 z"
- id="path40543"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <g
- id="g40545"
- style="opacity:0.2"
- transform="matrix(-1,0,0,1,-29,-335)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- id="path40547"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline"
- transform="rotate(180,59.20565,145.375)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g40549">
- <path
- d=""
- sodipodi:nodetypes="cz"
- id="path40551"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cz"
- id="path40553"
- style="display:inline;overflow:visible;visibility:visible;fill:#abcdff;fill-opacity:1;stroke:#c3dbff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 78.1613,110.99999 5.5,-5.5"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(-1,0,0,1,-175.75,-207.25)"
- style="opacity:0.2"
- id="g40556">
- <path
- sodipodi:nodetypes="ccccccc"
- id="path40558"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- id="g40888"
- style="display:inline;enable-background:new"
- transform="rotate(-45,-87.095449,239.33453)">
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 73.191498,271.86917 7.071067,-7.07107"
- id="path40890"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- id="path40892"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.95;fill:none;stroke:#28220b;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="m 71.600508,272.3995 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071 m 2.121321,-2.12133 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071"
- inkscape:connector-curvature="0" />
- <path
- d="m 71.600508,272.3995 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071 m 2.121321,-2.12133 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffe991;stroke-width:1.19999993;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path40894"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(-1.0992584e-6,128)"
- id="ICON_OUTLINER_DATA_EMPTY">
- <g
- id="g44266"
- style="display:inline;opacity:0.8"
- transform="translate(-138,212)">
- <g
- id="g44268"
- transform="translate(1.0551033e-6)">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\Browser icons ver 1\Outliner ICON CODES.png"
- id="g44270"
- transform="matrix(0.927273,0,0,1,85.654543,64)"
- style="display:inline">
- <path
- d="M 70.499967,14.5 75.5,17.5 m -5.000033,-3 -4.999967,3 m 4.970586,-3 v -6"
- style="display:inline;fill:none;stroke:#1a1a1a;stroke-width:3.63466382;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path44272"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path44274"
- d="m 69.392137,7 v 2 h 2.156862 V 7 Z M 63.999982,17 64,19 h 2.156862 l -1.8e-5,-2 z m 10.78431,0 v 2 h 2.156862 v -2 z"
- style="fill:none;stroke:#1a1a1a;stroke-width:1.86925566;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccccccccccccc"
- inkscape:connector-curvature="0" />
- <circle
- style="display:inline;fill:url(#radialGradient44318);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path44276"
- transform="matrix(1.176776,0,0,1.176776,-12.47787,-2.548088)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="70.5"
- cy="14.5"
- r="1.5" />
- <path
- id="path44278"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ececec;stroke-width:1.97310317;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="M 70.499967,14.5 75.5,17.5"
- sodipodi:nodetypes="cccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- transform="translate(-1.6176466e-5)"
- sodipodi:nodetypes="cccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path44280"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#radialGradient44320);stroke-width:2.07695079;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="M 70.499967,14.5 75.5,17.5 m -5.000033,-3 -4.999967,3 m 4.970586,-3 v -6"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 74.784292,17 v 2 h 2.156862 v -2 z"
- id="path44282"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- d="M 70.499967,14.5 65.5,17.5"
- style="display:inline;fill:none;stroke:#999999;stroke-width:1.97310317;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path44284"
- sodipodi:nodetypes="cccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- d="m 70.470586,14.5 v -6"
- style="display:inline;fill:none;stroke:#cccccc;stroke-width:2.07695079;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path44286"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path44288"
- d="m 69.392137,7 v 2 h 2.156862 V 7 Z"
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path44290"
- d="m 64,17 v 2 h 2.156844 v -2 z"
- style="fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.05;fill:#554400;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate"
- id="rect44292"
- width="3.774509"
- height="3.5"
- x="68.583321"
- y="13.25" />
- <path
- style="display:inline;opacity:0.75;fill:none;stroke:#ffffff;stroke-width:1.03847623px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 64.539197,18.5 v -1 h 1.078431"
- id="path44294"
- sodipodi:nodetypes="ccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path44296"
- d="M 69.931347,8.5 V 7.5326076 h 1.078413"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.03847647px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.03847647px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 75.323509,18.500001 v -1 h 1.078431"
- id="path44298"
- sodipodi:nodetypes="ccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"
- id="rect44300"
- width="17.254898"
- height="16"
- x="61.843121"
- y="5" />
- <path
- transform="matrix(1.0784311,0,0,1,-92.372519,-64)"
- id="path44302"
- d="m 155,80.5 -3,-1.870665"
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccc"
- id="path44304"
- d="m 74.245078,17.500001 v -1 h 1.078431"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#d4aa00;fill-opacity:1;fill-rule:evenodd;stroke:#999999;stroke-width:1.03847647px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.4;fill:#6a6a6a;fill-opacity:1;fill-rule:evenodd;stroke:#666666;stroke-width:1.03847647px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 69.931352,9.5000005 h 1.078431"
- id="path44306"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.4;fill:#6a6a6a;fill-opacity:1;fill-rule:evenodd;stroke:#4c4c4c;stroke-width:1.03847575px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 66.696014,17.499989 v -1 h -1.078431"
- id="path44308"
- sodipodi:nodetypes="ccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="opacity:0.4;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 147,80.5 3,-1.870665"
- id="path44310"
- inkscape:connector-curvature="0" />
- <path
- id="path44312"
- d="m 150.5,73.5 v 4"
- style="opacity:0.35;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate"
- id="rect44314"
- width="2"
- height="2"
- x="150.06403"
- y="78" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect44316"
- width="2.9998772"
- height="3"
- x="11.499837"
- y="289.5"
- ry="0"
- rx="0" />
- </g>
- <g
- id="ICON_ERROR">
- <g
- transform="translate(20,-30.990313)"
- id="g39499">
- <g
- style="opacity:0.5"
- transform="translate(-20,8)"
- id="g39466">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect39468"
- width="16"
- height="16"
- x="47"
- y="642" />
- </g>
- <path
- sodipodi:nodetypes="cccccccc"
- id="path39470"
- d="m 34.8125,650.5 c -0.469932,0.0628 -0.901978,0.36287 -1.125,0.78125 l -6,11 c -0.495227,0.9075 0.278677,2.21576 1.3125,2.21875 h 12 c 1.033823,-0.003 1.807727,-1.31125 1.3125,-2.21875 l -6,-11 c -0.282798,-0.52794 -0.905299,-0.85216 -1.5,-0.78125 z"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#ffdd55;fill-opacity:1;stroke:#2b0000;stroke-width:0.89999998;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="655"
- x="34"
- height="5"
- width="2.0152419"
- id="rect39472"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect39474"
- width="2.0152419"
- height="1"
- x="33.984756"
- y="661" />
- <path
- id="path39476"
- d="m 34.936406,651.39468 c -0.144491,0.0192 -0.31295,0.15614 -0.381583,0.28384 l -6.105329,11.1013 c -0.0509,0.0926 -0.05511,0.27404 0.0636,0.47307 0.118705,0.19902 0.275323,0.31508 0.381582,0.31538 h 12.210658 c 0.106265,-3e-4 0.262877,-0.11636 0.381583,-0.31538 0.118706,-0.19903 0.114499,-0.38055 0.06359,-0.47307 l -6.105329,-11.1013 c -0.08049,-0.14902 -0.33952,-0.30385 -0.508777,-0.28384 z"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:none;stroke:#ff0000;stroke-width:1.39999998;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient39508);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"
- d="m 34.936406,651.39468 c -0.144491,0.0192 -0.31295,0.15614 -0.381583,0.28384 l -6.105329,11.1013 c -0.0509,0.0926 -0.05511,0.27404 0.0636,0.47307 0.118705,0.19902 0.275323,0.31508 0.381582,0.31538 h 12.210658 c 0.106265,-3e-4 0.262877,-0.11636 0.381583,-0.31538 0.118706,-0.19903 0.114499,-0.38055 0.06359,-0.47307 l -6.105329,-11.1013 c -0.08049,-0.14902 -0.33952,-0.30385 -0.508777,-0.28384 z"
- id="path39478"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path43799"
- d="M 54.75,622.5 50,631.25"
- style="display:inline;opacity:0.25;fill:none;stroke:#2b2200;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- id="path43801"
- d="M 29.5,631.5 H 39"
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- transform="translate(21)"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_FILE_PARENT"
- transform="translate(0,1)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate"
- id="rect44079"
- width="16"
- height="16"
- x="320"
- y="73" />
- <g
- transform="translate(0,-22.005631)"
- id="g43931">
- <g
- id="g43459">
- <g
- transform="translate(0,21)"
- id="g43446">
- <path
- sodipodi:nodetypes="cccc"
- id="path43448"
- d="M 333.25,86.005631 H 328 l -1,-1 V 76"
- style="fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path43450"
- d="M 331.25,80.244369 327,76 l -4.25,4.244369"
- style="fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(0,21)"
- id="g43442">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 333.25,86.005631 H 328 l -1,-1 V 76"
- id="path42664"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 331.25,80.25 327,76.005631 322.75,80.25"
- id="path42666"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 328.5,106.50563 h 5 M 326.5,99.5 v 6.50563"
- id="path43773"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient44954);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 322.25,101.00563 4.5,-4.499999 h 0.5 l 4.5,4.499999"
- id="path44952"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_FILE_REFRESH">
- <rect
- y="73"
- x="341"
- height="16"
- width="16"
- id="rect44077"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate" />
- <g
- id="g44913"
- transform="translate(0,1)">
- <g
- transform="rotate(180,349,91.5)"
- id="g43652">
- <path
- sodipodi:nodetypes="csc"
- id="path43654"
- d="m 343.5,104.5 1.75,1.75 c 2.3454,2.33848 5.75,2 8,0.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path43660"
- d="M 343,108.25 V 104 h 4.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="rotate(180,349,91.5)"
- id="g43662">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 343.5,104.5 1.75,1.75 c 2.3454,2.33848 5.75,2.25 8,0.5"
- id="path43668"
- sodipodi:nodetypes="csc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 343,108.25 V 104 h 4.25"
- id="path43666"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path43671"
- d="m 354,78 v -1 -1.5 h -1 V 77 h -1.5 v 1 h 1.5 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path43747"
- d="M 353.09375,76.40625 C 350.56802,73.88797 346.75,74 344.25,76"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient44944);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 350.5,78.5 h 4 v -4"
- id="path43750"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g44931"
- transform="translate(0,-1)">
- <g
- transform="translate(0,-21)"
- id="g43636">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 343.5,104.5 1.75,1.75 c 2.3454,2.33848 5.75,2.25 8,0.5"
- id="path43623"
- sodipodi:nodetypes="csc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 343,108.25 V 104 h 4.25"
- id="path43506"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(0,-21)"
- id="g43632">
- <path
- sodipodi:nodetypes="csc"
- id="path43584"
- d="m 343.5,104.5 1.75,1.75 c 2.3454,2.33848 5.75,2.25 8,0.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path43502"
- d="M 343,108.25 V 104 h 4.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#e6e6e6;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- d="m 344,84 v 1 1.5 h 1 V 85 h 1.5 V 84 H 345 Z"
- id="rect43547"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 347.5,82.5 H 343 c -0.25,0 -0.5,0.25 -0.5,0.5 v 4.5"
- id="path43761"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient44942);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 345.59375,84.90625 c 2.07803,2.0719 5.36384,2.10325 7.53125,0.1875"
- id="path43765"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_BACK">
- <rect
- y="52"
- x="320"
- height="16"
- width="16"
- id="rect44095"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate" />
- <g
- transform="translate(42.999999,-42)"
- id="g43952">
- <g
- transform="rotate(-90,306.49718,122.50281)"
- id="g43483">
- <g
- transform="translate(0,21)"
- id="g43488">
- <path
- sodipodi:nodetypes="cc"
- id="path43490"
- d="M 327,86.255631 V 76"
- style="fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path43492"
- d="M 331.25,79.25 327,75.005631 322.75,79.25"
- style="fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(0,21)"
- id="g43494">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 327,86.255631 V 76"
- id="path43496"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 331.25,79.25 327,75.005631 322.75,79.25"
- id="path43498"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- sodipodi:nodetypes="cc"
- id="path43776"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d=""
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient44485);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 284,97.25 -4.5,4.5 v 0.5 l 4.5,4.5"
- id="path43780"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path43860"
- d="m 291.5,101.5 h -8.99437"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(-1)"
- id="ICON_FORWARD">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate"
- id="rect44093"
- width="16"
- height="16"
- x="341"
- y="52" />
- <g
- transform="translate(41.97875,-42)"
- id="g43941">
- <g
- id="g43467"
- transform="matrix(0,-1,-1,0,409.02125,429)">
- <g
- id="g43469"
- transform="translate(0,21)">
- <path
- style="fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 327,86.25 V 76"
- id="path43471"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 331.25,79.25 327,75.005631 322.75,79.25"
- id="path43473"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g43475"
- transform="translate(0,21)">
- <path
- sodipodi:nodetypes="cc"
- id="path43478"
- d="M 327,86.25 V 76"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path43481"
- d="M 331.25,79.25 327,75.005631 322.75,79.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 308.5,106 2.75,-2.75"
- id="path43778"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path43785"
- d="m 308.75,97.25 c -0.25,0 -0.5,0.25 -0.5,0.5 m 2.26562,3.75 h -8.99437"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient44950);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 309.02125,97.249998 4.5,4.500002 v 0.5 l -4.5,4.5"
- id="path44948"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_FULLSCREEN_ENTER"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 3\fullscreen.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="translate(168,-42)">
- <g
- id="g43593"
- transform="matrix(-1,0,0,1,677,525)">
- <path
- style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 347.25,100.25 -4,-4"
- id="path43595"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 343,100.25 V 96 h 4.25"
- id="path43597"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(1,0,0,-1,-21,729)"
- id="g44539">
- <path
- sodipodi:nodetypes="cc"
- id="path44541"
- d="m 347.25,100.25 -4,-4"
- style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path44543"
- d="M 343,100.25 V 96 h 4.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g43599"
- transform="matrix(-1,0,0,1,677,517)">
- <path
- sodipodi:nodetypes="cc"
- id="path43601"
- d="M 347.25,108.25 343,104"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path43603"
- d="M 343,108.25 V 104 h 4.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 333.5,622.5 v 3 m -4,-5 h 4.5"
- id="path44489"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 329.25,625 2,-2"
- id="path44491"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- d="m 333,622 v 1 1.5 h -1 V 623 h -1.5 v -1 h 1.5 z"
- id="path43605"
- inkscape:connector-curvature="0" />
- <g
- transform="matrix(1,0,0,-1,-21,737)"
- id="g44545">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 347.25,108.25 343,104"
- id="path44547"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 343,108.25 V 104 h 4.25"
- id="path44549"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="cccc"
- id="path44551"
- d="m 323.5,632.5 h 3 m -5,-4 v 4.5"
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path44553"
- d="m 326,628.25 -2,2"
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- id="path44555"
- d="m 323,632 v -1 -1.5 h 1 v 1.5 h 1.5 v 1 H 324 Z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_FULLSCREEN_EXIT"
- transform="translate(189.0625,-42)"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 3\fullscreen.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <g
- id="g44671"
- transform="rotate(180,331.46875,623.5)">
- <g
- id="g44635"
- transform="matrix(-1,0,0,1,677,525)">
- <path
- style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 347.25,100.25 -4,-4"
- id="path44637"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 343,100.25 V 96 h 4.25"
- id="path44639"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g44647"
- transform="matrix(-1,0,0,1,677,517)">
- <path
- sodipodi:nodetypes="cc"
- id="path44649"
- d="M 347.25,108.25 343,104"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path44651"
- d="M 343,108.25 V 104 h 4.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 332.5,621.5 h -3 m 5,4 V 621"
- id="path44653"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 330,625.75 2,-2"
- id="path44655"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- d="m 333,622 v 1 1.5 h -1 V 623 h -1.5 v -1 h 1.5 z"
- id="path44657"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g44682"
- transform="rotate(180,324.46875,630.5)">
- <g
- transform="matrix(1,0,0,-1,-21,729)"
- id="g44641">
- <path
- sodipodi:nodetypes="cc"
- id="path44643"
- d="m 347.25,100.25 -4,-4"
- style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path44645"
- d="M 343,100.25 V 96 h 4.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(1,0,0,-1,-21,737)"
- id="g44659">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 347.25,108.25 343,104"
- id="path44661"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 343,108.25 V 104 h 4.25"
- id="path44663"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="cccc"
- id="path44665"
- d="m 322.5,631.5 v -3 m 4,5 H 322"
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path44667"
- d="m 326.75,629 -2,2"
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- id="path44669"
- d="m 323,632 v -1 -1.5 h 1 v 1.5 h 1.5 v 1 H 324 Z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- clip-path="url(#clipPath45147)"
- id="ICON_MODIFIER">
- <g
- id="g45201"
- clip-path="none"
- transform="translate(1,1)">
- <rect
- y="261"
- x="4"
- height="16"
- width="16"
- id="rect45203"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-96.98388,244)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g45205"
- style="display:inline">
- <path
- id="path45207"
- style="fill:url(#linearGradient45220);fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 105.48388,31.25 6.25,-6 c 0.49692,0.284098 0.2225,0.232267 0.76612,0.25 2.20206,0.07183 4,-1.792 4,-4 l -1,-1 -2.5,2.5 -0.5,-0.5 -1,-1 -0.5,-0.5 2.5,-2.5 -1,-1 c -2.208,0 -4,1.792 -4,4 0,0.58349 0.009,0.250006 0.23388,0.75 l -6.25,6 v 2 l 1,1 z"
- sodipodi:nodetypes="ccsccccccccsccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- d="m 115.5,21.5 -2.25,2.25 m -1,-5.5 c -1.75,0 -4,2.25 -2.5,5 l -1.26612,0.25 -5,5 v 1.75"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path45209"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccsccccccccsccccccc"
- d="m 105.48388,31.5 5.5,-5.5 0.25,-0.5 H 112.5 c 2.73388,0 4,-1.792 4,-4 l -1,-1 -2.5,2.5 -0.5,-0.5 -1,-1 -0.5,-0.5 2.5,-2.5 -1,-1 c -2.208,0 -3.96454,1.25 -4,4 l -0.0161,1.25 -0.5,0.25 -5.5,5.5 v 2 l 1,1 h 2 z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path45211"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- d="m 109.98388,25 -5,5"
- style="fill:none;stroke:#afc6e9;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path45214"
- inkscape:connector-curvature="0" />
- <path
- id="path45216"
- style="fill:none;stroke:#336abd;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 109.48388,24.5 -4,4"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#162d50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate"
- id="rect45218"
- width="1"
- height="1"
- x="103.98388"
- y="29" />
- </g>
- </g>
- </g>
- <g
- id="ICON_QUIT">
- <rect
- style="display:inline;opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect45264"
- width="16"
- height="16"
- x="-420"
- y="577"
- transform="scale(-1,1)" />
- <path
- style="fill:none;stroke:#000000;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 412,585 v -6"
- id="path45266"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path45268"
- d="m 412,585 v -6"
- style="fill:none;stroke:#b3b3b3;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <g
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:2.56570244;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="g45270"
- transform="matrix(0.5478212,-0.56064,0.5419177,0.5545983,197.19518,557.21673)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <path
- sodipodi:open="true"
- transform="matrix(0.9615911,0.00541935,0.00537191,0.9740527,43.776178,107.51876)"
- sodipodi:type="arc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:4.37432003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path45272"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 139.98403,118.50525 a 8,8 0 0 1 -8.18333,7.49227 8,8 0 0 1 -7.79999,-7.89057 8,8 0 0 1 7.58626,-8.09628"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="0.063198177"
- sodipodi:end="4.6607369" />
- <path
- sodipodi:end="4.6607369"
- sodipodi:start="0.063198177"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 139.98403,118.50525 a 8,8 0 0 1 -8.18333,7.49227 8,8 0 0 1 -7.79999,-7.89057 8,8 0 0 1 7.58626,-8.09628"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path45274"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#b3b3b3;stroke-width:2.65110302;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:type="arc"
- transform="matrix(0.9615911,0.00541935,0.00537191,0.9740527,43.776178,107.51876)"
- sodipodi:open="true" />
- <path
- sodipodi:open="true"
- transform="matrix(1.0558925,0.00528428,0.00523802,1.0695762,31.432317,96.175729)"
- sodipodi:type="arc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:none;stroke:url(#linearGradient45283);stroke-width:1.20716298;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path45276"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 139.98403,118.50525 a 8,8 0 0 1 -8.18333,7.49227 8,8 0 0 1 -7.79999,-7.89057 8,8 0 0 1 7.58626,-8.09628"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="0.063198177"
- sodipodi:end="4.6607369" />
- <path
- sodipodi:open="true"
- sodipodi:end="4.6607369"
- sodipodi:start="0.063198177"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 139.98403,118.50525 a 8,8 0 0 1 -8.18333,7.49227 8,8 0 0 1 -7.79999,-7.89057 8,8 0 0 1 7.58626,-8.09628"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path45278"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:none;stroke:url(#linearGradient45285);stroke-width:1.44679213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:type="arc"
- transform="matrix(0.8810135,0.00553476,0.00548631,0.8924309,54.323627,117.21103)" />
- </g>
- <path
- style="opacity:0.75;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 411.5,585 v -6"
- id="path45280"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(517.99163,649)"
- id="ICON_FILE_TICK">
- <path
- sodipodi:nodetypes="cccccccc"
- d="m -120.49163,-67.5 c -3.75159,0.954856 -7.20393,6.261452 -9,9 l -3.5,-3.5 -0.25,0.5 3.99163,4 h 0.5 c 1.0421,-2.617689 4.16191,-8.585412 8.25837,-10 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path45290"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- d="m -120.5,-68.5 c -3.15098,1.124146 -6.99163,5 -8.99163,9 l -3.5,-3.5 -0.5,0.5 4,4 c 1.42501,-3.330356 5.5,-8.75 8.99163,-10"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1e00;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path45302"
- inkscape:connector-curvature="0" />
- <path
- id="path45294"
- style="fill:none;stroke:#9af23d;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -120.5,-68.5 c -3.15098,1.124146 -6.99163,5 -8.99163,9 l -3.5,-3.5 -0.5,0.5 4,4 c 1.42501,-3.330356 5.5,-8.75 8.99163,-10"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_GROUP"
- style="display:inline;enable-background:new"
- transform="translate(433,-61)">
- <rect
- y="554"
- x="-113"
- height="16"
- width="16"
- id="rect42954"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-252,462.99988)"
- id="g42956">
- <g
- id="g42958"
- transform="translate(-179,199.50012)">
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 328.5,-107.25 -4.5,1.75 v 6.5 l 4.5,2.25 4.5,-2.25 v -6.5 z"
- id="path42960"
- inkscape:connector-curvature="0" />
- <g
- id="g42962"
- transform="translate(179,-179)">
- <path
- sodipodi:nodetypes="ccccc"
- id="path42964"
- d="m 154,80 v -6.5 l -4.5,-1.75 v 10.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path42966"
- d="M 324,-99.00012 V -105.5 l 4.5,-1.75 0.5,0.25 v 10 l -0.5,0.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path42968"
- d="m 332.5,-105.5 v 6.25 l -4,2 -4,-2.00012 V -105.5"
- style="fill:none;stroke:url(#linearGradient42988);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- id="path42970"
- d="m 324,-105.5 4.5,-1.75 4.5,1.75 -4.5,2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path42972"
- d="m 145.5,94.25012 c 0,0 4,1.75 4,1.75 l 4,-1.75"
- style="opacity:0.95999995;fill:none;stroke:url(#linearGradient42990);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <rect
- y="96.000122"
- x="149"
- height="6.7500019"
- width="1"
- id="rect42974"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.18000004;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.09599998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- id="rect42976"
- width="1"
- height="6.7500019"
- x="150"
- y="96.000122" />
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.7882544,0,0,0.7883038,-210.45268,388.9974)"
- id="g42978"
- style="display:inline;enable-background:new">
- <circle
- transform="matrix(0.6425292,0,0,0.642531,44.523834,146.81699)"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.97436094;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42980"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.5858806,-0.06590218,0.06677852,-0.5812167,198.80048,299.96262)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path42982"
- style="display:inline;opacity:0.8;fill:url(#linearGradient42992);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path42984"
- style="fill:none;stroke:url(#linearGradient42994);stroke-width:2.54167628;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.4991181,0,0,0.4991107,63.460522,163.7471)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- id="path42986"
- d="m -102.5625,554.75 c -0.0429,0.005 -0.0849,0.0154 -0.125,0.0312 l -4.5,1.75 c -0.1919,0.0756 -0.31653,0.26258 -0.3125,0.4688 v 6.5 c 0.003,0.18741 0.11203,0.35691 0.28125,0.4375 l 4.5,2.25 c 0.13787,0.0682 0.29963,0.0682 0.4375,0 l 4.499997,-2.25 c 0.169224,-0.0806 0.278188,-0.25009 0.28125,-0.4375 V 557 c 0.004,-0.2062 -0.120622,-0.39315 -0.3125,-0.46875 l -4.499997,-1.75 c -0.0792,-0.0318 -0.16537,-0.0426 -0.25,-0.0312 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:url(#linearGradient42996);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_LIBRARY_DATA_DIRECT">
- <g
- transform="translate(0,128)"
- id="g24024">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect22150"
- width="16"
- height="16"
- x="299"
- y="365" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path12337"
- d="m 304.20488,366.47791 h 8.33334 v 13 h -11 l -1e-5,-10 z"
- style="display:inline;fill:url(#linearGradient14204);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- inkscape:connector-curvature="0" />
- <path
- transform="matrix(1.2999758,0,0,1.2999988,365.56499,31.43979)"
- sodipodi:nodetypes="ccc"
- id="path12339"
- style="display:inline;opacity:0.7;fill:none;stroke:#000000;stroke-width:0.76923829px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter31351)"
- d="M -48.500031,260.50809 -46.5,260.5 l -3.1e-5,-1.99191"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path12341"
- d="m 301.01612,370 h 4 v -4 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path12343"
- style="display:inline;fill:none;stroke:url(#linearGradient14198);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 302.51612,371.00001 v 7.5 m 3.5,-11 h 5.5"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 301.53822,368.97791 v 10.5 h 11 v -13 h -8.5 z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path12345"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- transform="translate(-454.0088,290)"
- mask="url(#mask43822)"
- sodipodi:nodetypes="cccccccc"
- id="path43815"
- d="m 765.0088,212.5 -3.9824,3.5 -0.0176,-2 h -6.9736 l -0.0132,-3 h 6.9868 l 0.004,-2 z"
- style="display:inline;opacity:0.93999993;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- inkscape:transform-center-x="-2"
- inkscape:transform-center-y="1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_LIBRARY_DATA_INDIRECT"
- transform="translate(0,-21)"
- style="opacity:0.4">
- <g
- id="g43840"
- transform="translate(0,128)">
- <rect
- y="365"
- x="299"
- height="16"
- width="16"
- id="rect43842"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;fill:url(#linearGradient43856);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="m 304.20488,366.47791 h 8.33334 v 13 h -11 l -1e-5,-10 z"
- id="path43844"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- d="M -48.500031,260.50809 -46.5,260.5 l -3.1e-5,-1.99191"
- style="display:inline;opacity:0.7;fill:none;stroke:#000000;stroke-width:0.76923829px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter31351)"
- id="path43846"
- sodipodi:nodetypes="ccc"
- transform="matrix(1.2999758,0,0,1.2999988,365.56499,31.43979)"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 301.01612,370 h 4 v -4 z"
- id="path43848"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- d="m 302.51612,371.00001 v 7.5 m 3.5,-11 h 5.5"
- style="display:inline;fill:none;stroke:url(#linearGradient43858);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- id="path43850"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- id="path43852"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 301.53822,368.97791 v 10.5 h 11 v -13 h -8.5 z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- inkscape:transform-center-y="1"
- inkscape:transform-center-x="-2"
- style="display:inline;opacity:0.93999993;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- d="m 765.0088,212.5 -3.9824,3.5 -0.0176,-2 h -6.9736 l -0.0132,-3 h 6.9868 l 0.004,-2 z"
- id="path43854"
- sodipodi:nodetypes="cccccccc"
- mask="url(#mask43822)"
- transform="translate(-454.0088,290)"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_PARTICLE_TIP"
- transform="translate(547.9924,59.00343)"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 3\strands selection modes.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- y="107"
- x="23"
- height="16"
- width="16"
- id="rect46788"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- transform="matrix(-1,0,0,1,0,12)" />
- <g
- style="display:inline;opacity:0.55;enable-background:new"
- transform="translate(-22,30)"
- id="g46766">
- <g
- id="g46768"
- transform="translate(23.01472,-88)">
- <path
- id="path46770"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient46780);stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M -34.51472,179.5 C -38,184.5 -37.5,189 -37.50346,190.5"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- d="M -34.51472,179.5 C -38,184.5 -37.5,189 -37.50346,190.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient46782);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path46772"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(24.03125,-88)"
- id="g46774">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- d="m -28.53125,182.5 c -4.5,2 -4.96875,6.5 -4.96875,8"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient46784);stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path46776"
- inkscape:connector-curvature="0" />
- <path
- id="path46778"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient46786);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -28.53125,182.5 c -4.5,2 -4.96875,6 -4.96875,8"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g46860"
- transform="translate(18.998123,-58.00355)"
- style="display:inline;enable-background:new">
- <path
- id="path46862"
- d="m -52.01365,177.50527 h 0.03679 c 0.818181,0 1.476865,0.66665 1.476865,1.49473 v 1.2e-4 c 0,0.82808 -0.658684,1.49472 -1.476865,1.49472 h -0.03679 c -0.81819,0 -1.476874,-0.66664 -1.476874,-1.49472 V 179 c 0,-0.82808 0.658684,-1.49473 1.476874,-1.49473 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#462300;stroke-width:1.495;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path46864"
- d="m -50.998123,178.00355 c -0.66732,0 -1.334639,1e-5 -2.001959,1e-5 0,0.66706 0,1.33411 0,2.00119 0.66732,0 1.334639,-1e-5 2.001959,-1e-5 0,-0.66707 0,-1.33413 0,-2.00119 z"
- style="display:inline;fill:#ffc17d;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(26.01365,-55.00527)"
- id="g46866">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#462300;stroke-width:1.495;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -52.01365,177.50527 h 0.03679 c 0.818181,0 1.476865,0.66665 1.476865,1.49473 v 1.2e-4 c 0,0.82808 -0.658684,1.49472 -1.476865,1.49472 h -0.03679 c -0.81819,0 -1.476874,-0.66664 -1.476874,-1.49472 V 179 c 0,-0.82808 0.658684,-1.49473 1.476874,-1.49473 z"
- id="path46868"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffc17d;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- d="m -50.998123,178.00355 c -0.66732,0 -1.334639,1e-5 -2.001959,1e-5 0,0.66706 0,1.33411 0,2.00119 0.66732,0 1.334639,-1e-5 2.001959,-1e-5 0,-0.66707 0,-1.33413 0,-2.00119 z"
- id="path46870"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_PARTICLE_POINT"
- transform="translate(547.9924,59.00343)"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 3\strands selection modes.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <g
- transform="translate(-20)"
- id="g46800">
- <rect
- transform="scale(-1,1)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect46802"
- width="16"
- height="16"
- x="24"
- y="119" />
- <g
- id="g46804"
- transform="translate(-22,18)"
- style="display:inline;opacity:0.55;enable-background:new">
- <g
- transform="translate(23.01472,-76)"
- id="g46806">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- d="M -34.51472,179.5 C -38,184.5 -37.5,189 -37.50346,190.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient46818);stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path46808"
- inkscape:connector-curvature="0" />
- <path
- id="path46810"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient46820);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M -34.51472,179.5 C -38,184.5 -37.5,189 -37.50346,190.5"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g46812"
- transform="translate(24,-76)">
- <path
- id="path46814"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient46822);stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -28.53125,182.5 c -4.5,2 -4.96875,6.5 -4.96875,8"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- d="m -28.53125,182.5 c -4.5,2 -4.96875,6 -4.96875,8"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient46824);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path46816"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(-4.98635,-46.00527)"
- id="g46872">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#462300;stroke-width:1.495;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -52.01365,177.50527 h 0.03679 c 0.818181,0 1.476865,0.66665 1.476865,1.49473 v 1.2e-4 c 0,0.82808 -0.658684,1.49472 -1.476865,1.49472 h -0.03679 c -0.81819,0 -1.476874,-0.66664 -1.476874,-1.49472 V 179 c 0,-0.82808 0.658684,-1.49473 1.476874,-1.49473 z"
- id="path46874"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffc17d;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- d="m -50.998123,178.00355 c -0.66732,0 -1.334639,1e-5 -2.001959,1e-5 0,0.66706 0,1.33411 0,2.00119 0.66732,0 1.334639,-1e-5 2.001959,-1e-5 0,-0.66707 0,-1.33413 0,-2.00119 z"
- id="path46876"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g46878"
- transform="translate(-0.98635,-58.00527)"
- style="display:inline;enable-background:new">
- <path
- id="path46880"
- d="m -52.01365,177.50527 h 0.03679 c 0.818181,0 1.476865,0.66665 1.476865,1.49473 v 1.2e-4 c 0,0.82808 -0.658684,1.49472 -1.476865,1.49472 h -0.03679 c -0.81819,0 -1.476874,-0.66664 -1.476874,-1.49472 V 179 c 0,-0.82808 0.658684,-1.49473 1.476874,-1.49473 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#462300;stroke-width:1.495;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path46882"
- d="m -50.998123,178.00355 c -0.66732,0 -1.334639,1e-5 -2.001959,1e-5 0,0.66706 0,1.33411 0,2.00119 0.66732,0 1.334639,-1e-5 2.001959,-1e-5 0,-0.66707 0,-1.33413 0,-2.00119 z"
- style="display:inline;fill:#ffc17d;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(-4.023135,-51.99484)"
- id="g46884">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#462300;stroke-width:1.495;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -52.01365,177.50527 h 0.03679 c 0.818181,0 1.476865,0.66665 1.476865,1.49473 v 1.2e-4 c 0,0.82808 -0.658684,1.49472 -1.476865,1.49472 h -0.03679 c -0.81819,0 -1.476874,-0.66664 -1.476874,-1.49472 V 179 c 0,-0.82808 0.658684,-1.49473 1.476874,-1.49473 z"
- id="path46886"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffc17d;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- d="m -50.998123,178.00355 c -0.66732,0 -1.334639,1e-5 -2.001959,1e-5 0,0.66706 0,1.33411 0,2.00119 0.66732,0 1.334639,-1e-5 2.001959,-1e-5 0,-0.66707 0,-1.33413 0,-2.00119 z"
- id="path46888"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_PARTICLE_PATH"
- transform="translate(547.9924,59.00343)"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 3\strands selection modes.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <g
- id="g46960"
- transform="translate(22,12)">
- <rect
- y="107"
- x="24"
- height="16"
- width="16"
- id="rect46962"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- transform="scale(-1,1)" />
- <g
- style="display:inline;opacity:0.55;enable-background:new"
- transform="translate(-22,18)"
- id="g46964">
- <g
- id="g46966"
- transform="translate(23.01472,-88)">
- <path
- id="path46968"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient46990);stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M -34.51472,179.5 C -38,184.5 -37.5,189 -37.50346,190.5"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- d="M -34.51472,179.5 C -38,184.5 -37.5,189 -37.50346,190.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient46992);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path46970"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(24.140625,-88)"
- id="g46972">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- d="m -28.53125,182.5 c -4.5,2 -4.96875,6.5 -4.96875,8"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient46994);stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path46974"
- inkscape:connector-curvature="0" />
- <path
- id="path46976"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient46996);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -28.53125,182.5 c -4.5,2 -4.96875,6 -4.96875,8"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(23.01472,-88)"
- id="g46978">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- d="M -34.51472,179.5 C -38,184.5 -37.5,189 -37.50346,190.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient46998);stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path46980"
- inkscape:connector-curvature="0" />
- <path
- id="path46982"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient47000);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M -34.51472,179.5 C -38,184.5 -37.5,189 -37.50346,190.5"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- transform="translate(24,-58)"
- id="g46984"
- style="display:inline;enable-background:new">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- d="m -28.53125,182.5 c -4.5,2 -4.96875,6.5 -4.96875,8"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#462300;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path46986"
- inkscape:connector-curvature="0" />
- <path
- id="path46988"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffc17d;stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -28.53125,182.5 c -4.5,2 -4.96875,6 -4.96875,8"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(-1)"
- id="ICON_CONSTRAINT_BONE">
- <g
- id="g25430"
- transform="translate(0,-21)">
- <rect
- ry="0"
- rx="0"
- transform="translate(1)"
- y="514"
- x="446"
- height="16"
- width="16"
- id="rect25424"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <g
- style="display:inline;opacity:0.8;enable-background:new"
- id="g24916"
- transform="translate(337,128)">
- <rect
- rx="0.019097222"
- y="386"
- x="110"
- height="11"
- width="11"
- id="rect24918"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#736c54;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- ry="0.019097222" />
- <g
- id="g24920">
- <path
- sodipodi:nodetypes="cccccccccccsccccccccccccccscccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient25449);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 116.53125,386.5 c -0.56312,0 -1.03125,0.46811 -1.03125,1.03125 v 0.9375 c 0,0.28156 0.12508,0.53133 0.3125,0.71875 L 113,392 c -0.18742,-0.18742 -0.46844,-0.5 -0.75,-0.5 h -0.75 c -0.56312,0 -1.03125,0.46811 -1.03125,1.03125 v 0.9375 c 0,0.56312 0.46813,1.03125 1.03125,1.03125 h 0.9375 c 0.0103,0 0.021,3e-4 0.0312,0 -3e-4,0.0102 0,0.021 0,0.0312 v 0.9375 c 0,0.56312 0.46813,1.03126 1.03125,1.03125 h 0.96875 c 0.56312,0 1,-0.46813 1,-1.03125 v -0.9375 c 0,-0.28156 -0.10164,-0.53133 -0.28125,-0.71875 l 2.625,-2.625 c 0.18742,0.18742 0.43719,0.3125 0.71875,0.3125 h 0.96875 c 0.56312,0 1,-0.46813 1,-1.03125 v -0.9375 c 0,-0.56312 -0.43688,-1.03125 -1,-1.03125 h -0.96875 c -0.0103,0 -0.021,-3e-4 -0.0312,0 3e-4,-0.0102 0,-0.021 0,-0.0312 v -0.9375 c 0,-0.56312 -0.46813,-1.03125 -1.03125,-1.03125 z"
- id="path24923"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 111.5,393.5 v -0.75 l 0.25,-0.25 h 1.75 l 3,-3 v -1.75 l 0.25,-0.25 h 0.75"
- id="path24925"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path24927"
- d="m 118.75,389.5 h 0.75 m -6,6 v -0.75"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <rect
- y="393"
- x="114"
- height="1"
- width="1"
- id="rect24929"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect24931"
- width="1"
- height="1"
- x="117"
- y="390" />
- </g>
- </g>
- <g
- transform="translate(22.915112,0.02875225)"
- id="g24933">
- <path
- sodipodi:nodetypes="ccccccccc"
- style="fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 430.5,525.5329 v 2 l 1,1 h 2 l 2,-2.0329 v -2 l -1,-1 h -2 z"
- id="path24939"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path24941"
- d="m 433.5,522.4671 v 1.75 l 1,1.25 h 2 l 2,-1.9671 v -2 l -1,-1 h -2 z"
- style="fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient25451);stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 433.5,522.4671 V 524.5 l 1,0.9671 h 2 l 2,-1.9671 v -2 l -1,-1 h -2 z"
- id="path24945"
- inkscape:connector-curvature="0" />
- <path
- id="path24954"
- d="m 434.5,523.5 h -2"
- style="fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path24956"
- d="m 430.5,525.5 v 2 l 1,1 h 2 l 2,-2 v -2 l -1,-1 h -2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient25453);stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 434.08489,525.47125 h 2.25"
- id="path24958"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- id="path24960"
- d="M 434.33489,525.47125 436.5,525.4671"
- style="fill:none;stroke:#ffffff;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient40731);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect25426"
- width="0"
- height="0.25"
- x="462.25"
- y="515"
- transform="translate(1)"
- rx="1.3125"
- ry="0.25" />
- </g>
- <g
- transform="translate(0.00572791,126.98898)"
- id="ICON_CONSTRAINT">
- <rect
- y="403.99695"
- x="-382.01102"
- height="16"
- width="16"
- id="rect25028"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- transform="rotate(-90)" />
- <g
- id="g25030">
- <rect
- transform="rotate(135)"
- rx="2.1489482"
- ry="2.143424"
- y="-559.32709"
- x="-33.931175"
- height="5.651536"
- width="8.4518671"
- id="rect25032"
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1" />
- <rect
- transform="rotate(135)"
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="rect25034"
- width="8.5198517"
- height="5.5904222"
- x="-28.308893"
- y="-557.84644"
- ry="2.1434233"
- rx="2.1489475" />
- <path
- sodipodi:nodetypes="cssssc"
- id="path25036"
- d="m 411.49427,375.51102 -0.5,-0.5 c -0.69131,-0.69131 -0.84611,-2.14587 0.0258,-3.01533 l 2.98873,-2.98076 c 0.87178,-0.86946 2.29697,-0.69523 2.98828,-0.004 l 0.52541,0.52542"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient25117);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- transform="rotate(135)"
- style="fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- d="m -26.159946,-552.25601 c -1.190517,0 -2.148947,-0.95597 -2.148947,-2.14343"
- id="rect25114"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:none;stroke:url(#radialGradient25457);stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 411.49427,375.51102 -0.5,-0.5 c -0.69131,-0.69131 -0.84611,-2.14587 0.0258,-3.01533 l 2.98873,-2.98076 c 0.87178,-0.86946 2.29697,-0.69523 2.98828,-0.004 l 0.52541,0.52542"
- id="path25455"
- sodipodi:nodetypes="cssssc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccczz"
- d="m 407.51079,379.37902 c 0.56229,0.50812 1.81497,0.33519 2.49825,-0.3481 l 2.96969,-3.09463 c 0.87062,-0.87061 0.69197,-2.30021 0.004,-2.98827 l -1.02382,-1.02382 c -0.69131,-0.69131 -2.11766,-0.86672 -2.98828,0.004 l -2.96969,3.09462 c -0.87062,0.87063 -0.62293,2.42889 -0.004,2.98829 l 1.51384,1.368 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient25106);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path25038"
- inkscape:connector-curvature="0" />
- <path
- id="path25040"
- style="opacity:0.7;fill:none;stroke:url(#radialGradient25048);stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- d="m 407.4987,379.35912 c 0.56229,0.50812 1.81497,0.33519 2.49825,-0.3481 l 2.98178,-3.07473 c 0.87062,-0.87061 0.69197,-2.30021 0.004,-2.98827 l -1.02382,-1.02382 c -0.69131,-0.69131 -2.11766,-0.86672 -2.98828,0.004 l -2.98178,3.07472 c -0.87062,0.87063 -0.62293,2.42889 -0.004,2.98829 l 1.51384,1.368 z"
- sodipodi:nodetypes="ccccccczz"
- inkscape:connector-curvature="0" />
- <path
- transform="rotate(135)"
- style="fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- d="m -27.628256,-559.32709 c 1.190517,0 2.148948,0.95597 2.148948,2.14343"
- id="rect25127"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient25117);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 417.50245,369.52434 0.49841,0.4984 c 0.68807,0.68805 0.86319,2.11415 -0.004,2.98828 l -2.96882,2.99286 c -0.68052,0.68603 -1.74799,0.71589 -2.49825,0.34809 -0.18628,-0.0913 -0.39866,-0.20409 -0.53552,-0.34095 l -1,-1"
- id="path25042"
- sodipodi:nodetypes="csssssc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_LOOP_FORWARDS"
- transform="matrix(-1,0,0,1,614,0)">
- <rect
- transform="matrix(0,1,1,0,0,0)"
- y="299"
- x="52"
- height="16"
- width="16"
- id="rect23456"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate" />
- <g
- id="g23458"
- transform="matrix(0,1,1,0,203.99437,-269)">
- <g
- id="g23460">
- <g
- id="g23462"
- transform="translate(0,21)">
- <path
- style="fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 327,76 v 10.00563 l 2,2 h 3 l 2,-2 v -3.25"
- id="path23464"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 330.25,79.25563 327,76 l -3.25,3.25563"
- id="path23466"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g23468"
- transform="translate(0,21)">
- <path
- sodipodi:nodetypes="cccccc"
- id="path23470"
- d="m 327,76 v 10.00563 l 2,2 h 3 l 2,-2 v -3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path23473"
- d="M 330.25,79.25563 327,76.005631 323.75,79.25563"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- sodipodi:nodetypes="cc"
- id="path23475"
- d="m 333.5,106.50563 v -2.75"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- transform="matrix(0,1,1,0,269,-203.99437)"
- y="56"
- x="303"
- height="1"
- width="1.5"
- id="rect23492"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cc"
- id="path23547"
- d="m 330,100.50563 -1.25,-1.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;marker:none;enable-background:accumulate"
- id="rect23494"
- width="1.5"
- height="1"
- x="99.00563"
- y="328"
- transform="matrix(0,1,1,0,0,0)" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23559);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 323.25,100.25563 c 0,0.25 0.25,0.5 0.5,0.5 m 2.75,-1.24437 v 7.74437 l 2.25,2.25 h 3.5 l 2,-2"
- id="path23550"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path23552"
- d="m 323.25,100.00563 3.5,-3.5 h 0.5 l 3.5,3.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23557);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_LOOP_BACK"
- transform="translate(-21)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate"
- id="rect23513"
- width="16"
- height="16"
- x="52"
- y="299"
- transform="matrix(0,1,1,0,0,0)" />
- <g
- transform="matrix(0,1,1,0,203.99437,-269)"
- id="g23515">
- <g
- id="g23518">
- <g
- transform="translate(0,21)"
- id="g23520">
- <path
- sodipodi:nodetypes="cccc"
- id="path23523"
- d="m 327,76 v 10.00563 l 2,2 h 3 l 2,-2 v -3.25"
- style="fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path23525"
- d="M 330.25,79.25563 327,76 l -3.25,3.25563"
- style="fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(0,21)"
- id="g23527">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 327,76 v 10.00563 l 2,2 h 3 l 2,-2 v -3"
- id="path23530"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 330.25,79.25563 327,76.005631 323.75,79.25563"
- id="path23532"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 326.5,99.5 v 6.50563 m 3,2.5 h 2 l 2,-2 v -2.75"
- id="path23534"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23543);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 323.25,100.00563 3.5,-3.499999 h 0.5 l 3.5,3.499999"
- id="path23536"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;marker:none;enable-background:accumulate"
- id="rect23539"
- width="1.5"
- height="1"
- x="303"
- y="56"
- transform="matrix(0,1,1,0,269,-203.99437)" />
- <rect
- transform="matrix(0,1,1,0,0,0)"
- y="328"
- x="99.00563"
- height="1"
- width="1.5"
- id="rect23541"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- transform="matrix(-1,0,0,1,209,550)"
- id="ICON_TRIA_LEFT"
- style="display:inline">
- <rect
- y="69"
- x="62"
- height="16"
- width="16"
- id="rect27864"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(-1,0,0,1,461.01011,-167)"
- id="g27866"
- style="display:inline">
- <path
- sodipodi:nodetypes="ccccccc"
- id="path27868"
- d="m 392.5,239.5 -4.98989,4.75 v 0.5 l 4.98989,4.75 1.01011,-1e-5 0.0368,-9.96874 z"
- style="fill:url(#linearGradient27872);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path27870"
- d="M 392.51011,248.24999 V 240.75 l -4,3.75"
- style="fill:none;stroke:url(#linearGradient27874);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="matrix(1,0,0,-1,70,704.00001)"
- id="ICON_TRIA_UP"
- style="display:inline">
- <rect
- y="69"
- x="82"
- height="16"
- width="16"
- id="rect27878"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g27880"
- transform="rotate(-90,157.001,310.9909)"
- style="display:inline">
- <path
- sodipodi:nodetypes="ccccccc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient27886);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 392.49192,239.48989 -5.00001,4.75 v 0.5 l 5.00001,4.75 h 1 v -10 z"
- id="path27882"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient27902);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 392.49191,248.23989 -4.00002,-3.75 4.00002,-3.75"
- id="path27884"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(-231,-21)"
- id="ICON_MOD_MIRROR"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 3\screw modifier.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect29962"
- width="16"
- height="16"
- x="-336"
- y="283"
- transform="scale(-1,1)" />
- <g
- transform="translate(362,20.75)"
- id="g29964"
- mask="none"
- clip-path="none">
- <path
- id="path29966"
- d="M -35,273.5 V 263 l 8,3.75 v 10.75 z"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#0b1728;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="fill:url(#linearGradient29988);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="M -35,273.5 V 263 l 8,3.75 v 10.75 z"
- id="path29968"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccc"
- id="path29970"
- d="m 334.5,287.75 -7,-3.25 v 9"
- style="display:inline;opacity:0.7;fill:none;stroke:url(#linearGradient29990);stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.6827482,0,0,0.68258425,246.77037,137.93793)"
- id="g29972"
- style="display:inline;opacity:0.75;enable-background:new"
- mask="url(#mask29419)"
- clip-path="url(#clipPath28964)">
- <circle
- transform="matrix(0.75,0,0,0.75,28.052144,135)"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#162d50;stroke-width:1.75781369;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path29974"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.683022,-0.07745026,0.0778507,-0.683064,208.02475,314.325)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path29976"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient29773-5);fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.65;fill:none;stroke:#ffffff;stroke-width:2.56764865;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="path29978"
- transform="matrix(0.5705005,0,0,0.5705012,51.746079,156.18087)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g29980"
- transform="matrix(0.6827482,0,0,0.68258425,236.77037,141.93793)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path29982"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.56250119;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;fill:url(#linearGradient29994);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path29984"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.683022,-0.07745026,0.0778507,-0.683064,209.4726,314.325)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.5705005,0,0,0.5705012,53.193935,156.18087)"
- id="path29986"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:2.56764865;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- id="ICON_PROP_OFF"
- transform="translate(-21,2)"
- style="opacity:0.5">
- <rect
- y="176"
- x="425"
- height="16"
- width="16"
- id="rect29315"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- id="g29317"
- transform="translate(263,148.99995)">
- <g
- transform="matrix(0.786268,0,0,0.7877987,82.392071,-41.848894)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g29320">
- <circle
- transform="matrix(0.874026,0,0,0.873701,-3.948211,-5.552958)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path29323"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient29334);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.16319752;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.398744,0,0,-0.395524,58.82401,144.1804)"
- style="fill:none;stroke:url(#linearGradient29336);stroke-width:3.20095801;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path29326"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <circle
- transform="matrix(0.186538,0,0,-0.189699,145.3693,57.36304)"
- style="display:inline;fill:none;stroke:url(#linearGradient29338);stroke-width:5.31599474;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path29328"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path29330"
- style="display:inline;fill:none;stroke:url(#linearGradient29340);stroke-width:1.77120221;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.566689,0,0,-0.562497,95.23056,101.3747)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path29332"
- style="display:inline;fill:none;stroke:url(#linearGradient29342);stroke-width:2.35577321;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.424906,0,0,-0.424074,114.01316,85.183325)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- transform="translate(2.00005,151)"
- id="ICON_MAN_TRANS"
- style="display:inline">
- <rect
- y="6"
- x="3"
- height="16"
- width="16"
- id="rect32013"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- id="g32015"
- transform="translate(64,9.999984)">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:#002255;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M -55,1 -47.000051,-1.999984 -50,6 Z"
- id="path32032"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path32044"
- d="M -58.250048,9.250016 -50,0.999884"
- style="fill:none;stroke:#002255;stroke-width:3.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:#4989e9;stroke-width:1.89999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M -58.250048,9.250016 -50,0.999884"
- id="path32050"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path32055"
- d="m -58,8.999884 8,-8"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient32140);stroke-width:1.89999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path32057"
- d="M -55,1 -47.000051,-1.999984 -50,6 Z"
- style="fill:#4989e9;fill-opacity:1;fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="opacity:0.5;fill:url(#linearGradient32142);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="M -55,1 -47.000051,-1.999984 -50,6 Z"
- id="path32059"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path32063"
- d="M -47.25,-1.75 -54.75,1"
- style="fill:none;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -53,3 -5.750048,5.750016 v 0.75"
- id="path32068"
- sodipodi:nodetypes="cc" />
- </g>
- </g>
- <g
- transform="translate(4.000002,151)"
- id="ICON_MAN_SCALE"
- style="display:inline">
- <rect
- y="6"
- x="43"
- height="16"
- width="16"
- id="rect32072"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- id="g32074"
- transform="translate(64,10)">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:#002255;stroke-width:3.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -18.25,9.25 8.249996,-8.2304767"
- id="path32077"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccc"
- id="path32079"
- d="m -12.999997,-2.000002 5.9999268,1.448e-4 6.72e-5,5.9998542 h -6.000002 z"
- style="fill:none;stroke:#002255;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path32081"
- d="m -18.25,9.25 8.249996,-8.24999"
- style="fill:none;stroke:#4989e9;stroke-width:1.89999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient32144);stroke-width:1.89999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -18.000004,9.00001 8,-8"
- id="path32087"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="fill:#4989e9;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m -12.999992,-2 5.9999248,1.448e-4 L -7,4 h -6 z"
- id="path32089"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="ccccc"
- id="path32104"
- d="m -12.999992,-2 5.9999248,1.452e-4 L -7,4 h -6 z"
- style="opacity:0.5;fill:url(#linearGradient32146);fill-opacity:1;fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -12.749999,2.750002 v -4.4999957 h 5.4999946"
- id="path32114"
- sodipodi:nodetypes="ccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path32118"
- d="m -12.75,2.75 -6,6 V 9.5"
- style="fill:none;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- </g>
- <g
- id="ICON_MAN_ROT">
- <rect
- y="157"
- x="26"
- height="16"
- width="16"
- id="rect32122"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- id="g32124"
- transform="matrix(0.9187785,0,0,0.9204344,64.322274,161.35151)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:type="arc"
- style="fill:none;stroke:#002255;stroke-width:1.79768455;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="path32126"
- sodipodi:cx="49.5"
- sodipodi:cy="-32.5"
- sodipodi:rx="4.5"
- sodipodi:ry="4.5"
- d="m 54,-32.5 a 4.5,4.5 0 0 1 -1.321459,3.185417 4.5,4.5 0 0 1 -3.188265,1.314572"
- transform="matrix(-2.421633,0,0,-2.417581,92.2682,-69.13182)"
- sodipodi:start="0"
- sodipodi:end="1.5729572"
- inkscape:transform-center-x="5.4369478"
- inkscape:transform-center-y="-5.4395256"
- sodipodi:open="true" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:open="true"
- inkscape:transform-center-y="-5.4395256"
- inkscape:transform-center-x="5.4369478"
- sodipodi:end="1.5729572"
- sodipodi:start="0"
- transform="matrix(-2.421633,0,0,-2.417581,92.2682,-69.13182)"
- d="m 54,-32.5 a 4.5,4.5 0 0 1 -1.321459,3.185417 4.5,4.5 0 0 1 -3.188265,1.314572"
- sodipodi:ry="4.5"
- sodipodi:rx="4.5"
- sodipodi:cy="-32.5"
- sodipodi:cx="49.5"
- id="path32128"
- style="fill:none;stroke:#4989e9;stroke-width:0.9887265;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- sodipodi:type="arc" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:type="arc"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient32148);stroke-width:0.9887265;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- id="path32136"
- sodipodi:cx="49.5"
- sodipodi:cy="-32.5"
- sodipodi:rx="4.5"
- sodipodi:ry="4.5"
- d="m 54,-32.5 a 4.5,4.5 0 0 1 -1.321459,3.185417 4.5,4.5 0 0 1 -3.188265,1.314572"
- transform="matrix(-2.421633,0,0,-2.417581,92.2682,-69.13182)"
- sodipodi:start="0"
- sodipodi:end="1.5729572"
- inkscape:transform-center-x="5.4369478"
- inkscape:transform-center-y="-5.4395256"
- sodipodi:open="true" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:open="true"
- inkscape:transform-center-y="-5.8447483"
- inkscape:transform-center-x="5.8103423"
- sodipodi:end="1.5729572"
- sodipodi:start="0"
- transform="matrix(-2.587958,0,0,-2.597682,100.48861,-75.018268)"
- d="m 54,-32.5 a 4.5,4.5 0 0 1 -1.321459,3.185417 4.5,4.5 0 0 1 -3.188265,1.314572"
- sodipodi:ry="4.5"
- sodipodi:rx="4.5"
- sodipodi:cy="-32.5"
- sodipodi:cx="49.5"
- id="path32138"
- style="fill:none;stroke:#ffffff;stroke-width:0.29357874;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1"
- sodipodi:type="arc" />
- </g>
- </g>
- <g
- transform="translate(315,-441)"
- id="ICON_SORTSIZE">
- <rect
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.5999999;marker:none;enable-background:accumulate"
- id="rect31818"
- width="16"
- height="16"
- x="-247"
- y="514" />
- <g
- transform="translate(0,-21)"
- id="g31820">
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -245.25,538 h 12.5"
- id="path31822"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path31824"
- d="m -245.25,538 h 12.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#d2d2d2;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m -245.5,538.5 -0.25,-0.5 0.25,-0.5 h 13"
- id="path31826"
- inkscape:connector-curvature="0" />
- <path
- id="path31828"
- d="m -242.5,543.5 v -1 h 7"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m -239.5,548.5 v -1 h 1"
- id="path31830"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path31832"
- d="m -242.25,543 h 6.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#d2d2d2;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -242.25,543 h 6.5"
- id="path31834"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- id="path31836"
- d="m -242.5,543.5 -0.25,-0.5 0.25,-0.5 h 7"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -239.25,548 h 0.5"
- id="path31838"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path31840"
- d="m -239.25,548 h 0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#d2d2d2;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m -239.5,548.5 -0.25,-0.5 0.25,-0.5 h 1"
- id="path31844"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_SORTALPHA"
- transform="translate(191,-420)"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 3\sort a-z.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- id="rect31848"
- width="16"
- height="16"
- x="-186"
- y="493" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -177.25,499 h 5.25 v 0.5 l -5.03256,7.02015 v 0.5 L -171.75,507"
- id="path31857"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- id="path31859"
- d="m -177.25,499 h 5.25 v 0.5 l -5.03256,7.02015 v 0.5 L -171.75,507"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient31946);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -175.25,506.5 h 3.75 m -6.5,-8 h 6.25 m -1.75,2 -4,5.75 v 1"
- id="path31861"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;marker:none;filter:url(#filter50168-9);enable-background:accumulate"
- d="m -183.4375,493.25 a 1.7525094,1.7525094 0 0 0 0.1875,3.5 h 1.875 0.125 c 0.30188,0 0.5,0.19814 0.5,0.5 H -183 a 1.750175,1.750175 0 0 0 -1.25,0.5 l -1,1 a 1.750175,1.750175 0 0 0 -0.5,1.25 v 2 a 1.750175,1.750175 0 0 0 0.5,1.25 l 1,1 a 1.750175,1.750175 0 0 0 1.25,0.5 h 2.5 a 1.750175,1.750175 0 0 0 1.25,-0.5 l 0.25,0.25 a 1.767767,1.767767 0 1 0 2.5,-2.5 l -0.75,-0.75 v -1.9375 a 1.750175,1.750175 0 0 0 0,-0.5 1.750175,1.750175 0 0 0 0,-0.1875 v -1.09375 a 1.750175,1.750175 0 0 0 0,-0.28125 1.750175,1.750175 0 0 0 -0.125,-0.6875 c -0.004,-0.0221 -0.0268,-0.0405 -0.0312,-0.0625 a 1.750175,1.750175 0 0 0 -0.0312,-0.0937 c -0.35614,-1.57819 -1.57955,-2.76466 -3.1875,-3.03125 a 1.750175,1.750175 0 0 0 -0.625,-0.125 h -0.1875 -1.8125 a 1.750175,1.750175 0 0 0 -0.1875,0 z m 1.1875,7.5 h 1.5 v 0.5 h -1.5 z"
- id="path31869"
- clip-path="url(#clipPath50172-0)"
- mask="none"
- transform="translate(-0.05279266,-2.0457936e-6)"
- inkscape:connector-curvature="0" />
- <path
- id="path31871"
- transform="translate(-0.25906372,0.25457764)"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -180.99094,494.73636 c 1.24765,0 2.25907,1.01142 2.25907,2.25906 m -0.009,0 v 4.75 l 1.25,1.25 m -2.75,-0.25 h -2.5 l -1,-1 v -2 l 1,-1 h 4 m -4.25,-4 h 2"
- inkscape:connector-curvature="0" />
- <path
- d="m -180.99094,494.73636 c 1.24765,0 2.25907,1.01142 2.25907,2.25906 m -0.009,0 v 4.75 l 1.25,1.25 m -2.75,-0.25 h -2.5 l -1,-1 v -2 l 1,-1 h 4 m -4.25,-4 h 2"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient31948);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="translate(-0.25906372,0.25457764)"
- id="path31873"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path31875"
- d="m -179.5,495.25 -1.25,-0.75 h -2.75 l -0.25,0.5 0.24997,0.5"
- style="fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path31879"
- d="m -184.5,502 v -2.25 l 1.25,-1.25 h 3.25"
- style="fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path31881"
- d="m -182.25,502.5 h 2 l 0.75,-0.75 v -1"
- style="fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="ICON_SORTTIME"
- transform="translate(189,-315)">
- <g
- style="display:inline;opacity:0.96000001;enable-background:new"
- id="g31885"
- transform="translate(-307.59866,-9.53021)">
- <g
- id="g31887"
- transform="translate(2.6147747,150.03012)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- style="display:inline">
- <g
- id="g31889">
- <rect
- transform="translate(-2.6147747,-150.03012)"
- y="397.53015"
- x="165.59866"
- height="16"
- width="16"
- id="rect31891"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <rect
- y="247.5"
- x="162.99997"
- height="16"
- width="15.000031"
- id="rect31893"
- style="display:inline;opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <path
- d="m 167.48389,249.00007 v 2 m 6,-2 v 2"
- style="fill:none;stroke:#162d50;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path31896"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <rect
- style="fill:url(#linearGradient31950);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect31898"
- width="11.999973"
- height="13.000053"
- x="164.48389"
- y="250.00002"
- rx="1.0000547"
- ry="1.0000547" />
- <path
- sodipodi:nodetypes="cc"
- d="m 165.48389,262.00007 v -11"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- id="path31900"
- inkscape:connector-curvature="0" />
- <path
- id="path31902"
- style="display:inline;opacity:0.5;fill:none;stroke:url(#linearGradient31952);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 175.48389,251.00007 v 11 h -10 v -11 z"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- transform="translate(346.98389,-98.49991)"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient31954);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m -181.5,348.96875 c -0.0977,0 -0.2593,0.0405 -0.375,0.15625 -0.1157,0.1157 -0.15625,0.27731 -0.15625,0.375 v 7 l 2.53125,2.53125 h 10.53125 V 357.875 c -1.11643,-0.22954 -2,-1.19538 -2,-2.375 v -6 c 0,-0.0977 -0.0405,-0.2593 -0.15625,-0.375 -0.1157,-0.1157 -0.27731,-0.15625 -0.375,-0.15625 z"
- id="path31905"
- sodipodi:nodetypes="cscccccccscc"
- inkscape:connector-curvature="0" />
- <path
- transform="translate(346.98389,-98.49991)"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient31956);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -181.5,349.5 v 6.75 l 2.25,2.25 9.7813,0.0312 -0.0313,-0.2812 c -1.11143,-0.43566 -2,-1.49177 -2,-2.75 l 0.0313,-6.00005 z"
- id="path31907"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient31958);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.4000001;marker:none;enable-background:accumulate"
- id="rect31909"
- width="11.000002"
- height="4.0000105"
- x="164.98389"
- y="250.50008"
- rx="0"
- ry="0" />
- <path
- sodipodi:nodetypes="cccc"
- d="m 165.48389,254.50007 v -3.5 h 10 v 3.5"
- style="display:inline;opacity:0.45;fill:none;stroke:url(#linearGradient31960);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- id="path31912"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path31914"
- style="opacity:0.8;fill:none;stroke:#162d50;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 167.48389,249.00007 v 2 m 6,-2 v 2"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -181.5,348.5 c -0.13851,0 -0.25527,0.0433 -0.375,0.0937 -0.23945,0.10094 -0.43031,0.2918 -0.53125,0.53125 -0.0505,0.11973 -0.0937,0.23649 -0.0937,0.375 v 7 4 c 0,0.55403 0.44597,1 1,1 h 10 c 0.55403,0 1,-0.44597 1,-1 v -1 h 2 v -2 c -1.09489,0 -2,-0.90511 -2,-2 v -6 c 0,-0.125 -0.0391,-0.25781 -0.0937,-0.375 -0.10094,-0.23945 -0.2918,-0.43031 -0.53125,-0.53125 -0.11973,-0.0505 -0.23649,-0.0937 -0.375,-0.0937 h -10 z"
- transform="translate(346.98389,-98.49991)"
- id="path31917"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path31919"
- style="fill:none;stroke:url(#linearGradient31962);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 167.48389,249.00007 v 2 m 6,-2 v 2"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.3;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m -200.5,372.5 h 0.75 l 1.25,-1.25 v -0.75"
- id="path31921"
- transform="translate(367.98389,-119.49993)"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path31923"
- d="m 173.48389,253.00007 h 0.75 l 1.25,-1.25 v -0.75"
- style="opacity:0.3;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path31925"
- d="m 167.48389,252.00007 h 0.5 l 0.5,-0.5 v -0.5"
- style="display:inline;opacity:0.7;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.7;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m 173.48389,252.00007 h 0.5 l 0.5,-0.5 v -0.5"
- id="path31927"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.25;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m 165.48389,254.00007 h 10"
- id="path31929"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path31931"
- d="m -170.5,359.5 c -3.30603,0.005 -5.7501,0 -9,0 l -1.75,-1.75"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:none;stroke:#000000;stroke-width:0.89999998;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"
- transform="translate(346.98389,-98.49991)"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 170.48389,259.00009 c -0.25,0 -0.64081,-0.31307 -0.82432,-0.78241 -0.17644,-0.45125 -0.17568,-0.96756 -0.17568,-2.21759"
- id="path31933"
- inkscape:connector-curvature="0" />
- <path
- id="path31935"
- d="m 173.48389,259.00009 c -0.25,0 -0.64081,-0.31307 -0.82432,-0.78241 -0.17644,-0.45125 -0.17568,-0.96756 -0.17568,-2.21759"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="csc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <rect
- ry="0"
- rx="0"
- y="396"
- x="-136"
- height="1"
- width="1"
- id="rect31937"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <rect
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect31939"
- width="1"
- height="1"
- x="-133"
- y="396"
- rx="0"
- ry="0" />
- <rect
- y="398.25"
- x="-136"
- height="0.7500025"
- width="0.50001091"
- id="rect31941"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <rect
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect31943"
- width="0.50001091"
- height="0.7500025"
- x="-133.00002"
- y="398.25" />
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 3\screw modifier.png"
- transform="translate(-105,-42)"
- id="ICON_MOD_SCREW">
- <rect
- y="283"
- x="236"
- height="16"
- width="16"
- id="rect31978"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccccccccccc"
- id="path31980"
- d="m 244,283.5 c -3.49999,0 -5.5,1 -5.49999,2.5 l -1e-5,1.75 3,3 v 6.5 l 1.25,1.25 h 2.5 l 1.25,-1.25 v -6.5 l 3,-3 V 286 c 0,-1.5 -1.99999,-2.5 -5.5,-2.5 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient32236);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient32238);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 244,287.5 c -3.49999,0 -5.5,-1 -5.49999,-2.5 l -1e-5,2.75 3,3 h 5 l 3,-3 V 285 c 0,1.5 -1.99999,2.5 -5.5,2.5 z"
- id="path31982"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="czs"
- id="path31985"
- d="m 248.99999,286.24149 c 0,1.12925 -1.66739,2.25851 -5.01168,2.25851 -3.34426,0 -4.99267,-1.12926 -4.99267,-2.25851"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient32240);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 246.5,290.75 3,-3 V 286 c 0,-1.5 -1.99999,-2.5 -5.5,-2.5 -3.49999,0 -5.5,1 -5.49999,2.5 l -1e-5,1.75 3,3"
- id="path31989"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#89a9d9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.29137695;marker:none;enable-background:accumulate"
- d="m 249,285.86765 c 0,0.99654 -1.81092,1.88235 -5,1.88235 -3.18906,0 -5,-0.88581 -5,-1.88235 0,-1.36765 2.61499,-2.11765 5,-2.11765 2.38501,0 5,0.75 5,2.11765 z"
- id="path31991"
- sodipodi:nodetypes="czszs"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path31993"
- d="m 239.5,287.5 3,3"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:none;stroke:url(#linearGradient32242);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- id="path31996"
- d="m 241.5,290.75 v 6.5 l 1.25,1.25 h 2.5 l 1.25,-1.25 v -6.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient32244);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 242.5,291 v 5.75 l 0.75,0.75 h 1.5 l 0.75,-0.75 v -6.25 l 3,-3"
- id="path31998"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient32246);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 242.5,291 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 3 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 z m 0,2 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 3 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 z m 0,2 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 3 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 z m 0.75,2 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 1.5 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 z"
- id="path32000"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient32248);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 242.5,292 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 2.75 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 z m 0,2 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 2.75 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 z m 0,2 c -0.277,0 -0.5,0.223 -0.5,0.5 0,0.277 0.223,0.5 0.5,0.5 h 2.75 c 0.277,0 0.5,-0.223 0.5,-0.5 0,-0.277 -0.223,-0.5 -0.5,-0.5 z"
- id="path32002"
- sodipodi:nodetypes="csccscccsccscccsccscc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 242.47368,287.53915 246,284"
- id="path32004"
- inkscape:connector-curvature="0" />
- <path
- id="path32006"
- d="m 243.5,287.5 3,-3"
- style="opacity:0.8;fill:none;stroke:#ffffff;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 3\sequencer + image preview.png"
- id="ICON_SEQ_SPLITVIEW"
- transform="translate(147)">
- <g
- style="display:inline;enable-background:new"
- transform="translate(-240,-247)"
- id="g32262"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g42357.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- mask="url(#mask29801)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect32264"
- width="16"
- height="16"
- x="203"
- y="257" />
- <g
- style="display:inline;enable-background:new"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g32266"
- transform="translate(-39.983882,19.00809)">
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 244.51612,238.49191 -0.0161,3 h 7.98388 l 0.0161,-3 z"
- id="path32269"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path32276"
- d="m 247.51612,241.49191 -0.0161,3 h 11 l 0.0161,-3 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path32278"
- d="m 249.48388,247.49191 -0.0161,3 h 7.01612 l 0.0161,-3 z"
- style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient32296);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 205.51612,259.5 c 0,-0.25 0,-1 0,-1 h 6"
- id="path32280"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path32282"
- d="m 208.51612,262.5 c 0,-0.25 0,-1 0,-1 h 9"
- style="display:inline;fill:none;stroke:url(#linearGradient32299);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path32284"
- d="m 210.5,268.5 c 0,-0.25 0,-1 0,-1 h 5"
- style="display:inline;fill:none;stroke:url(#linearGradient32301);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g32286"
- transform="translate(-85,-411)">
- <rect
- y="427.5"
- x="48.5"
- height="9"
- width="9"
- id="rect32288"
- style="display:inline;overflow:visible;visibility:visible;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- ry="0" />
- <rect
- ry="0"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient32303);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00207269;marker:none;enable-background:accumulate"
- id="rect32290"
- width="5.9999886"
- height="6"
- x="50.000011"
- y="429" />
- <path
- sodipodi:nodetypes="ccccccccccccccccccccccccc"
- id="path32292"
- d="m 50,429 v 2 h 2 v -2 z m 2,2 v 2 h 2 v -2 z m 2,0 h 2 v -2 h -2 z m 2,2 h -2 v 2 h 2 z m -4,2 v -2 h -2 v 2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient32305);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path32294"
- d="m 56.50001,428.49999 -7.000011,10e-6 1.1e-5,6.99999 h 7 L 56.499999,428.5"
- style="fill:none;stroke:url(#linearGradient32307);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 3\mysterious PR.png"
- transform="translate(-118,-465)"
- id="ICON_PREVIEW_RANGE">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect32311"
- width="16"
- height="16"
- x="312"
- y="685" />
- <g
- id="g32313">
- <g
- style="display:inline;opacity:0.96000001"
- id="g32315"
- transform="matrix(0.927848,0,0,0.916217,160.82022,488.72362)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path32317"
- style="fill:url(#linearGradient32353);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.22752953;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.87787,0,0,0.889264,55.67911,118.0341)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path32319"
- style="opacity:0.96000001;fill:none;stroke:url(#linearGradient32355);stroke-width:1.44816053;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.68828432,0,0,0.69278557,229.1626,611.24321)"
- cx="132"
- cy="118"
- r="8" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path32321"
- style="opacity:0.96000001;fill:none;stroke:#ffffff;stroke-width:2.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 322.5,689.5 -3,3 m 0,1 2,2"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- d="m 319.5,693.5 2,2"
- style="opacity:0.96000001;fill:none;stroke:#aa0000;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path32323"
- inkscape:transform-center-y="1.25"
- inkscape:transform-center-x="-1.25"
- inkscape:connector-curvature="0" />
- <rect
- y="697"
- x="320"
- height="1.5"
- width="1"
- id="rect32325"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.48000004;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <rect
- y="692"
- x="324"
- height="1"
- width="1.5"
- id="rect32327"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.48000004;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <path
- style="opacity:0.96000001;fill:url(#linearGradient32357);fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 319.85514,686.97535 c -3.25557,0.003 -5.8936,2.6597 -5.87155,5.95078 0.0105,1.56055 0.63214,2.99542 1.61111,4.05762 2.7831,-7.37691 5.95805,-1.77373 7.49116,-9.06794 -0.92886,-0.60835 -2.04538,-0.9415 -3.23072,-0.94046 z"
- id="path32329"
- inkscape:transform-center-x="1.4653436"
- inkscape:transform-center-y="-1.0204512"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-y="-2.5000099"
- inkscape:transform-center-x="-3.00001"
- id="path32331"
- d="m 319.93245,687.49998 c -0.13655,0 -0.28922,0.0368 -0.43244,0.0521 V 692.5 h 6 c -0.22415,-2.79556 -2.6077,-5 -5.56756,-5 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ff9e05;fill-opacity:1;fill-rule:evenodd;stroke:#d68c1a;stroke-width:1;stroke-linejoin:round;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.28800001;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect32333"
- width="1.4999696"
- height="1"
- x="314.51614"
- y="693" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect32335"
- width="1"
- height="1.4999921"
- x="319"
- y="687.5" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- d="m 324.5,692.5 h -5"
- style="opacity:0.8;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path32349"
- inkscape:transform-center-y="-0.75"
- inkscape:connector-curvature="0" />
- <circle
- transform="matrix(0.68828432,0,0,0.69278557,229.1626,611.24321)"
- style="opacity:0.6;fill:none;stroke:url(#linearGradient32359);stroke-width:1.44816053;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path32351"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 3\recently used.png"
- transform="translate(32,-86.95)"
- id="ICON_RECOVER_LAST">
- <rect
- y="664"
- x="414"
- height="16"
- width="16"
- id="rect32363"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g32365">
- <g
- style="opacity:0.8"
- id="g32367"
- transform="translate(23,1)">
- <g
- style="display:inline;opacity:0.96000001"
- id="g32369"
- transform="matrix(0.927848,0,0,0.916217,240.82022,467.72362)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path32371"
- style="fill:url(#linearGradient32426);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.19779229;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.80941061,0,0,0.82049866,65.263425,126.69853)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.784039,0,0,0.779055,265.50801,498.28815)"
- id="g32373"
- style="display:inline;opacity:0.96000001;fill:none;stroke:url(#linearGradient32430);stroke-width:1.17973554;stroke-opacity:1">
- <circle
- transform="matrix(0.79894049,0,0,0.80499668,66.729242,128.65178)"
- style="fill:none;stroke:url(#linearGradient32428);stroke-width:1.59548569;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path32375"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path32377"
- style="opacity:0.96000001;fill:none;stroke:#ffffff;stroke-width:2.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 400.5,668.5 v 4 m 0,0 2,2"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- d="m 400.5,672.5 2,2"
- style="opacity:0.96000001;fill:none;stroke:#aa0000;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path32380"
- inkscape:transform-center-y="1.25"
- inkscape:transform-center-x="-1.25"
- inkscape:connector-curvature="0" />
- <rect
- y="676"
- x="400"
- height="2.5"
- width="1"
- id="rect32382"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.48000004;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <rect
- y="672"
- x="404"
- height="1"
- width="2.5"
- id="rect32384"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <path
- inkscape:transform-center-y="-0.75"
- id="path32387"
- style="opacity:0.96000001;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 400.5,668.5 v 4"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.96000001;fill:url(#linearGradient32432);fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 400.30467,667.25 c -2.80257,0.003 -5.07354,2.32096 -5.05455,5.19291 0.009,1.36179 0.54419,2.61392 1.38693,3.54084 2.39585,-6.4374 5.12903,-1.54783 6.44881,-7.91306 -0.79962,-0.53087 -1.76077,-0.82159 -2.78119,-0.82069 z"
- id="path32389"
- inkscape:transform-center-x="1.2614492"
- inkscape:transform-center-y="-0.89049022"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.28800001;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect32391"
- width="2.4838562"
- height="1"
- x="394.51614"
- y="672" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.28800001;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect32393"
- width="1"
- height="1.4999921"
- x="400"
- y="666.5" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- d="m 400.5,668.5 v 4"
- style="opacity:0.57600002;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path32396"
- inkscape:transform-center-y="-0.75"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g32398">
- <g
- transform="matrix(1,0,0,-1,73,774)"
- id="g32400">
- <path
- sodipodi:nodetypes="ccc"
- id="path32403"
- d="M 343,108.25 V 104 h 4.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1e00;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1e00;stroke-width:3.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 428,671.25 c -0.0541,-1.25729 -0.54273,-2.44429 -1.37516,-3.38809 -2.00926,-2.27808 -5.59675,-2.62117 -7.87484,-0.61191 L 417,669"
- id="path32411"
- sodipodi:nodetypes="csc"
- inkscape:connector-curvature="0" />
- <g
- transform="matrix(1,0,0,-1,73,774)"
- id="g32413">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#8af01e;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 343,108.25 V 104 h 4.25"
- id="path32416"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path32418"
- d="m 417,669 v -1 -1.5 h 1 v 1.5 h 1.5 v 1 H 418 Z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csc"
- id="path32420"
- d="m 428,671.25 c -0.0541,-1.25729 -0.54273,-2.44429 -1.37516,-3.38809 -2.00926,-2.27808 -5.59675,-2.62117 -7.87484,-0.61191 L 417,669"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#8af01e;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 415.5,670 v -4.5 m 5,4 h -2"
- id="path32422"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cscccc"
- id="path32424"
- d="m 428.5,671.21875 c -0.0591,-1.37274 -0.59591,-2.66246 -1.5,-3.6875 -1.09228,-1.23842 -2.62571,-1.96363 -4.1875,-2.09375 -1.55879,-0.12987 -3.16135,0.33951 -4.40625,1.4375 -3.3e-4,0.0104 -3.3e-4,0.0208 0,0.0312 L 417.5,667.75"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:none;stroke:url(#linearGradient32434);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- transform="translate(0,2)"
- id="ICON_KEY_HLT">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect31007"
- width="16"
- height="16"
- x="425"
- y="218" />
- <g
- style="display:inline"
- id="g31009"
- transform="translate(43.016148,98.00001)">
- <g
- transform="translate(-3.542969e-5)"
- id="g31011"
- style="display:inline">
- <path
- d="M 388.23389,129.74999 394.5,123.5 m 0.98389,1.99999 L 394,124 m 0.48389,2.49999 -1.4142,-1.41422"
- style="display:inline;fill:none;stroke:#000000;stroke-width:3.00000095;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path31013"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csssc"
- id="path31021"
- style="display:inline;fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 388.04706,129.93681 c 0.81353,0.81353 0.81353,2.31284 0,3.12634 -0.81352,0.81354 -2.31283,0.81354 -3.12635,0 -0.81353,-0.8135 -0.81353,-2.31281 0,-3.12634 0.81352,-0.81352 2.31283,-0.81352 3.12635,0 z"
- inkscape:connector-curvature="0" />
- <path
- id="path31015"
- style="display:inline;fill:none;stroke:url(#linearGradient31019);stroke-width:1.50000191;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="M 388.73389,129.24999 394.5,123.5 m 0.98389,1.99999 -0.25,-0.25 m -0.75,1.25 -0.25,-0.25"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="czzzz"
- d="m 388.01764,129.96629 c 0.79818,0.79819 0.79818,2.26923 0,3.06743 -0.7982,0.79819 -2.26925,0.79819 -3.06743,0 -0.79821,-0.7982 -0.79821,-2.26924 0,-3.06743 0.79818,-0.7982 2.26923,-0.7982 3.06743,0 z"
- style="display:inline;fill:none;stroke:url(#linearGradient31025);stroke-width:1.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path31023"
- inkscape:connector-curvature="0" />
- </g>
- <ellipse
- transform="matrix(1.4399775,0,0,1.4399775,-171.50748,-44.947546)"
- id="path31017"
- style="opacity:0.3;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="387.50003"
- cy="122.5078"
- rx="0.70312506"
- ry="0.71093756" />
- </g>
- </g>
- <g
- id="ICON_KEY_DEHLT">
- <g
- style="opacity:0.8"
- transform="translate(-21,2)"
- id="g31037">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect31039"
- width="16"
- height="16"
- x="425"
- y="218" />
- <g
- style="display:inline"
- id="g31041"
- transform="translate(43.016148,98.00001)">
- <g
- transform="translate(-3.542969e-5)"
- id="g31043"
- style="display:inline">
- <path
- d="M 388.23389,129.74999 394.5,123.5 m 0.98389,1.99999 L 394,124 m 0.48389,2.49999 -1.4142,-1.41422"
- style="display:inline;fill:none;stroke:#000000;stroke-width:3.00000095;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path31045"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csssc"
- id="path31047"
- style="display:inline;fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 388.04706,129.93681 c 0.81353,0.81353 0.81353,2.31284 0,3.12634 -0.81352,0.81354 -2.31283,0.81354 -3.12635,0 -0.81353,-0.8135 -0.81353,-2.31281 0,-3.12634 0.81352,-0.81352 2.31283,-0.81352 3.12635,0 z"
- inkscape:connector-curvature="0" />
- <path
- id="path31049"
- style="display:inline;fill:none;stroke:url(#linearGradient31055);stroke-width:1.50000191;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="M 388.73389,129.24999 394.5,123.5 m 0.98389,1.99999 -0.25,-0.25 m -0.75,1.25 -0.25,-0.25"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="czzzz"
- d="m 388.01764,129.96629 c 0.79818,0.79819 0.79818,2.26923 0,3.06743 -0.7982,0.79819 -2.26925,0.79819 -3.06743,0 -0.79821,-0.7982 -0.79821,-2.26924 0,-3.06743 0.79818,-0.7982 2.26923,-0.7982 3.06743,0 z"
- style="display:inline;fill:none;stroke:url(#linearGradient31057);stroke-width:1.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path31051"
- inkscape:connector-curvature="0" />
- </g>
- <ellipse
- transform="matrix(1.4399775,0,0,1.4399775,-171.50748,-44.947546)"
- id="path31053"
- style="opacity:0.3;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="387.50003"
- cy="122.5078"
- rx="0.70312506"
- ry="0.71093756" />
- </g>
- </g>
- <g
- id="g31031"
- transform="rotate(90,418.02634,218.37146)">
- <path
- sodipodi:nodetypes="cc"
- id="path31033"
- d="m 422.15488,229.89781 11,-11"
- style="display:inline;opacity:0.5;fill:#000000;fill-rule:evenodd;stroke:#2b0000;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:none;stroke:#ff5555;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 422.15488,229.89781 11,-11"
- id="path31035"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_KEYINGSET"
- transform="translate(0,-21)">
- <rect
- y="241"
- x="383"
- height="16"
- width="16"
- id="rect31089"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(3.016145,122.00001)"
- id="g31091"
- style="display:inline">
- <g
- style="display:inline"
- id="g31093"
- transform="translate(-3.542969e-5)">
- <path
- sodipodi:nodetypes="cccccc"
- id="path31095"
- style="display:inline;fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 388.23389,129.74999 5.25,-5.25 m 0.98389,1.99999 -1.48389,-1.49999 m 0.48389,2.49999 -1.4142,-1.41422"
- inkscape:connector-curvature="0" />
- <path
- d="m 388.04706,129.93681 c 0.81353,0.81353 0.81353,2.31284 0,3.12634 -0.81352,0.81354 -2.31283,0.81354 -3.12635,0 -0.81353,-0.8135 -0.81353,-2.31281 0,-3.12634 0.81352,-0.81352 2.31283,-0.81352 3.12635,0 z"
- style="display:inline;fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path31097"
- sodipodi:nodetypes="csssc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- d="m 388.73389,129.24999 4.75,-4.75 m 0.98389,1.99999 -0.25,-0.25 m -0.75,1.25 -0.25,-0.25"
- style="display:inline;fill:none;stroke:url(#linearGradient31151);stroke-width:1.50000191;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path31099"
- inkscape:connector-curvature="0" />
- <path
- id="path31101"
- style="display:inline;fill:none;stroke:url(#linearGradient31153);stroke-width:1.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 388.01764,129.96629 c 0.79818,0.79819 0.79818,2.26923 0,3.06743 -0.7982,0.79819 -2.26925,0.79819 -3.06743,0 -0.79821,-0.7982 -0.79821,-2.26924 0,-3.06743 0.79818,-0.7982 2.26923,-0.7982 3.06743,0 z"
- sodipodi:nodetypes="czzzz"
- inkscape:connector-curvature="0" />
- </g>
- <ellipse
- style="opacity:0.05;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path31103"
- transform="matrix(1.4399775,0,0,1.4399775,-171.50748,-44.947546)"
- cx="387.50003"
- cy="122.5078"
- rx="0.70312506"
- ry="0.71093756" />
- </g>
- <path
- style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.4000001;marker:none;enable-background:new"
- d="m 389.5,229.65625 c -0.73878,0 -1.48012,0.26136 -2.03125,0.8125 -1.10229,1.10226 -1.10228,2.96023 0,4.0625 0.41335,0.41335 0.92256,0.67791 1.46875,0.78125 0.008,-0.004 0.0231,0.004 0.0312,0 0.76739,-0.40457 1.35785,-1.08414 1.65625,-1.90625 -0.0307,0.0416 -0.0579,0.0891 -0.0937,0.125 -0.49413,0.49412 -1.5684,0.49411 -2.0625,0 -0.49414,-0.49413 -0.49413,-1.56838 0,-2.0625 0.24705,-0.24706 0.63541,-0.375 1.03125,-0.375 0.39584,0 0.78419,0.12794 1.03125,0.375 0.12353,0.12353 0.21949,0.29083 0.28125,0.46875 -0.0858,-0.9079 -0.52654,-1.71591 -1.1875,-2.28125 -0.0405,-0.002 -0.0845,0 -0.125,0 z m -2.125,1.9375 c 0.37998,0 0.65625,0.27629 0.65625,0.65625 0,0.37998 -0.27627,0.6875 -0.65625,0.6875 -0.37092,0 -0.64331,-0.29002 -0.65625,-0.65625 0,-0.009 -3.2e-4,-0.0223 0,-0.0312 0.0129,-0.3662 0.28534,-0.65625 0.65625,-0.65625 z"
- transform="translate(0,21)"
- id="path31190"
- inkscape:connector-curvature="0" />
- <g
- id="g31059"
- transform="translate(-42,23)">
- <g
- style="display:inline"
- id="g31073"
- transform="rotate(-45,525.63451,132.69135)">
- <g
- id="g31075"
- transform="translate(2.016112,1.00001)">
- <path
- d="m 388.60119,129.3396 4.94975,-4.94974 m 1.41421,1.41421 -1.23743,-1.23743 m 0.53033,1.94454 -1.23742,-1.23744"
- style="display:inline;fill:none;stroke:#100d04;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path31077"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csssc"
- id="path31113"
- style="display:inline;fill:none;stroke:#100d04;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 387.93695,130.00385 c 0.8043,0.80431 0.8043,2.10984 0,2.91414 -0.8043,0.80431 -2.10984,0.80431 -2.91414,0 -0.8043,-0.8043 -0.8043,-2.10983 0,-2.91414 0.8043,-0.80428 2.10984,-0.80428 2.91414,0 z"
- inkscape:connector-curvature="0" />
- <path
- id="path31079"
- style="display:inline;fill:none;stroke:url(#linearGradient31155);stroke-width:1.50000191;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 388.60119,129.3396 4.94975,-4.94974 m 1.41421,1.41421 -0.25,-0.25 m -0.4571,0.95711 -0.25,-0.25"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <ellipse
- style="opacity:0.05;fill:#181406;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path31081"
- transform="matrix(1.7719122,0,0,1.7719122,-300.13217,-85.612134)"
- cx="387.50003"
- cy="122.5078"
- rx="0.70312506"
- ry="0.71093756" />
- <path
- sodipodi:nodetypes="czzzz"
- d="m 387.96588,129.97488 c 0.82029,0.8203 0.82029,2.15177 0,2.97206 -0.8203,0.82029 -2.15179,0.82029 -2.97206,0 -0.8203,-0.82029 -0.8203,-2.15176 0,-2.97206 0.82027,-0.82029 2.15176,-0.82029 2.97206,0 z"
- style="display:inline;fill:none;stroke:url(#linearGradient31157);stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path31109"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_CLIP"
- transform="translate(448,657)">
- <rect
- y="-122"
- x="-44"
- height="16"
- width="16"
- id="rect40445-4-2"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path40447-5-3"
- d="m -43.5,-116.75 12.5,-4.75 0.75,2 -13.25,5 z"
- style="fill:#1a1a1a;stroke:#000000;stroke-width:0.89999998;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
- inkscape:connector-curvature="0" />
- <rect
- y="-114.5"
- x="-42.5"
- height="7.9999971"
- width="12.999988"
- id="rect40449-5-9"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient16887);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect40451-1-1"
- width="1"
- height="1.5"
- x="-32"
- y="-121" />
- <rect
- y="-119.41868"
- x="-36"
- height="1.5"
- width="1"
- id="rect40453-7-7"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect40455-1-9"
- width="1"
- height="1.5"
- x="-37"
- y="-119.16868" />
- <rect
- y="-117.62802"
- x="-41"
- height="1.5"
- width="1"
- id="rect40457-1-4"
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect40459-5-8"
- width="1"
- height="1.5"
- x="-40"
- y="-117.87802" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect40461-2-3"
- width="13.999996"
- height="2.0000052"
- x="-43.5"
- y="-114.5" />
- <rect
- y="-113"
- x="-42"
- height="1.7500292"
- width="12.154154"
- id="rect40490-7-9"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.55400002;marker:none;enable-background:accumulate" />
- <path
- id="rect40463-6-4"
- d="m -40,-114 v 1.25 h 2 V -114 Z m 4,0 v 1.25 h 2 V -114 Z m 4,0 v 1.25 h 2 V -114 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.3;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round"
- d="m -31.5,-120.5 -9.75,3.75"
- id="path40474-1-2"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:none;stroke:url(#linearGradient16889);stroke-width:1px;stroke-linejoin:round"
- d="m -41.5,-107.5 v -6 h 11 v 6 z"
- id="path40476-4-2"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#87aade;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m -43,-116.75 h 1 l 1,1.75 v 2 h -2 z"
- id="path40478-2-5"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#002255;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m -41,-115 v 2 h -2 v 0.75 h 2.75 v -3 l -1.25,-2.25 -1.5,0.25 v 0.5 h 1 z"
- id="path40480-3-8"
- sodipodi:nodetypes="ccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path40558-2-3"
- d="m -41.5,-107.38206 v -4.66445"
- style="opacity:0.2;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect40553-2-9"
- width="1"
- height="1.5"
- x="-33"
- y="-120.75" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect40556-1-3"
- width="1"
- height="1.25"
- x="-40"
- y="-114" />
- <path
- sodipodi:nodetypes="cc"
- style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round"
- d="m -42.4975,-113.46527 v -3.0928"
- id="path40560-6-1"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(1)"
- style="opacity:0.35"
- id="g40590-8-8">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.55400002;marker:none;enable-background:accumulate"
- id="rect40586-5-0"
- width="5"
- height="0.9617852"
- x="-38"
- y="-110" />
- <rect
- y="-111"
- x="-36"
- height="3"
- width="1.0280838"
- id="rect40588-7-3"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.55400002;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_LINK_BLEND">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect26258-7"
- width="16"
- height="16"
- x="47"
- y="52" />
- <g
- transform="translate(74.95064,-440.02091)"
- id="g26260-3">
- <g
- id="g26262-9">
- <path
- sodipodi:nodetypes="cc"
- d="M -15.594023,497.94339 -20.25,493.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#28170b;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.34386528;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path26264-6"
- inkscape:connector-curvature="0" />
- <ellipse
- transform="matrix(3.625,0,0,3.1690202,-67.8125,318.31703)"
- id="path26266-7"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#28170b;stroke-width:1.32768786;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.10397505;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="13.5"
- cy="57.5"
- rx="1"
- ry="1.0000004" />
- <path
- id="path26268-5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#28170b;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.34386528;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -25.5,496.5 h 7.5 m -9.5,6 6,-6"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- </g>
- <circle
- transform="matrix(3.5999897,0,0,3.1249932,-67.499871,320.6879)"
- id="path26270-5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient26282-0);stroke-width:0.92424375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.10397505;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="13.5"
- cy="57.5"
- r="1" />
- <path
- sodipodi:nodetypes="cccccc"
- d="m -25.5,496.5 7.984366,-0.0226 M -27.5,502.5 l 6,-6 m 5.996227,1.44466 L -20.25,493.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient26284-9);stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.34386528;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path26272-4"
- inkscape:connector-curvature="0" />
- <circle
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path26274-0"
- transform="matrix(3.25,0,0,3.25,-62.875,313.125)"
- cx="13.5"
- cy="57.5"
- r="1" />
- <circle
- transform="matrix(2,0,0,2,-46,385)"
- id="path26276-1"
- style="fill:#2c5aa0;fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="13.5"
- cy="57.5"
- r="1" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient26286-4);stroke-width:0.22536004;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.10397505;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path26278-1"
- transform="matrix(4.7519907,0,0,4.1435313,-83.051884,262.12196)"
- cx="13.5"
- cy="57.5"
- r="1" />
- <path
- sodipodi:nodetypes="cccccc"
- d="m -20.515634,493.80534 c -0.07079,-0.45769 0.0843,-0.63855 0.5,-0.5 m -7.704183,9.08552 4.25,-4.25 m -2,-2 h 6.25"
- style="fill:none;stroke:url(#linearGradient26288-9);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- id="path26280-5"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g24933-4"
- transform="translate(-375.85,-461.8829)">
- <path
- inkscape:connector-curvature="0"
- id="path24939-9"
- d="m 430.5,525.5329 v 2 l 1,1 h 2 l 2,-2.0329 v -2 l -1,-1 h -2 z"
- style="fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccccccc" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 433.5,522.4671 v 1.75 l 1,1.25 h 2 l 2,-1.9671 v -2 l -1,-1 h -2 z"
- id="path24941-0"
- sodipodi:nodetypes="ccccccccc" />
- <path
- inkscape:connector-curvature="0"
- id="path24945-6"
- d="M 433.5,522.4671 V 524.5 l 1,0.9671 h 2 l 2,-1.9671 v -2 l -1,-1 h -2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient55785);stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 434.5,523.5 h -2"
- id="path24954-1" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient55787);stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 430.5,525.5 v 2 l 1,1 h 2 l 2,-2 v -2 l -1,-1 h -2 z"
- id="path24956-1"
- sodipodi:nodetypes="ccccccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path24958-1"
- d="m 434.08489,525.47125 h 2.25"
- style="fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 434.33489,525.47125 436.5,525.4671"
- id="path24960-1" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_APPEND_BLEND">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect26258-7-4"
- width="16"
- height="16"
- x="68"
- y="52" />
- <g
- transform="translate(95.95064,-440.02091)"
- id="g26260-3-6">
- <g
- id="g26262-9-1">
- <path
- sodipodi:nodetypes="cc"
- d="M -15.594023,497.94339 -20.25,493.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#28170b;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.34386528;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path26264-6-7"
- inkscape:connector-curvature="0" />
- <ellipse
- transform="matrix(3.625,0,0,3.1690202,-67.8125,318.31703)"
- id="path26266-7-7"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#28170b;stroke-width:1.32768786;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.10397505;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="13.5"
- cy="57.5"
- rx="1"
- ry="1.0000004" />
- <path
- id="path26268-5-3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#28170b;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.34386528;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -25.5,496.5 h 7.5 m -9.5,6 6,-6"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- </g>
- <circle
- transform="matrix(3.5999897,0,0,3.1249932,-67.499871,320.6879)"
- id="path26270-5-9"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient26282-0-8);stroke-width:0.92424375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.10397505;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="13.5"
- cy="57.5"
- r="1" />
- <path
- sodipodi:nodetypes="cccccc"
- d="m -25.5,496.5 7.984366,-0.0226 M -27.5,502.5 l 6,-6 m 5.996227,1.44466 L -20.25,493.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient26284-9-6);stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.34386528;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path26272-4-9"
- inkscape:connector-curvature="0" />
- <circle
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path26274-0-6"
- transform="matrix(3.25,0,0,3.25,-62.875,313.125)"
- cx="13.5"
- cy="57.5"
- r="1" />
- <circle
- transform="matrix(2,0,0,2,-46,385)"
- id="path26276-1-7"
- style="fill:#2c5aa0;fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="13.5"
- cy="57.5"
- r="1" />
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient26286-4-5);stroke-width:0.22536004;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.10397505;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path26278-1-5"
- transform="matrix(4.7519907,0,0,4.1435313,-83.051884,262.12196)"
- cx="13.5"
- cy="57.5"
- r="1" />
- <path
- sodipodi:nodetypes="cccccc"
- d="m -20.515634,493.80534 c -0.07079,-0.45769 0.0843,-0.63855 0.5,-0.5 m -7.704183,9.08552 4.25,-4.25 m -2,-2 h 6.25"
- style="fill:none;stroke:url(#linearGradient26288-9-5);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- id="path26280-5-4"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="rotate(180,55.45,136.55)"
- id="g39333-1"
- style="display:inline;enable-background:new">
- <g
- transform="translate(26.00079,19.1)"
- id="g39096-7-1"
- style="display:inline;enable-background:new">
- <g
- id="g39118-3-3"
- style="display:inline;fill:#ffffff;enable-background:new"
- transform="translate(-1.00079,-19)" />
- </g>
- <g
- id="g38966-7"
- transform="matrix(0,-1,-1,0,212.75,247.25)">
- <g
- transform="rotate(180,107.625,111.375)"
- id="g38968-4">
- <path
- inkscape:connector-curvature="0"
- id="path38970-5"
- d="m 174.5,38.5 v 5 h 5"
- style="display:inline;fill:none;stroke:#000000;stroke-width:2.5;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- sodipodi:nodetypes="ccc" />
- <path
- inkscape:connector-curvature="0"
- d="m 175.5,42.5 5,-5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path38972-1"
- sodipodi:nodetypes="cz" />
- </g>
- <g
- id="g38975-0"
- transform="translate(-146.75,127.75)">
- <g
- id="g38977-1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="rotate(180,136.08065,77.999995)"
- style="display:inline">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path38984-8"
- sodipodi:nodetypes="cz"
- d="" />
- <path
- inkscape:connector-curvature="0"
- d=""
- style="display:inline;overflow:visible;visibility:visible;opacity:0.85;fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path38987-2"
- sodipodi:nodetypes="cz" />
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- id="path38994-9"
- d="m 188,51 v 6 h -1 v -5 h -5 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(-1,0,0,1,-29,-335)"
- style="opacity:0.2"
- id="g38996-7">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- id="path38998-6"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- id="g39000-4"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="rotate(180,59.20565,145.375)"
- style="display:inline">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f2f2f2;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path39015-9"
- sodipodi:nodetypes="cz"
- d="" />
- <path
- inkscape:connector-curvature="0"
- d="m 78.1613,110.99999 5.5,-5.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path39017-0"
- sodipodi:nodetypes="cz" />
- </g>
- <g
- id="g39020-8"
- style="opacity:0.2"
- transform="matrix(-1,0,0,1,-175.75,-207.25)">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- d="m -216,387 v 2 h 1 v -1 h 1 v -1 z"
- id="path39022-9"
- sodipodi:nodetypes="ccccccc" />
- </g>
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_SAVE_PREFS">
- <rect
- y="51.97921"
- x="25.950649"
- height="16"
- width="16"
- id="rect42947-7"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-301.04935,-550.02079)"
- id="g42949-4">
- <g
- style="opacity:0.85"
- id="g42951-6">
- <path
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 341.5161,616.38229 340.5,617.5 l -10.73389,-10e-6 -1.25,-1.25 L 328.5,605.5 h 13 z"
- id="path42953-7"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42955-8"
- d="m 340,616 h -8.25 v -1 H 340 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- id="rect38927-6"
- width="11.970581"
- height="8.0306396"
- x="329.02942"
- y="605.96936" />
- <rect
- y="605.96936"
- x="329.02942"
- height="8.0306396"
- width="11.970581"
- id="rect45307-5"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:url(#radialGradient45309-0);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42957-3"
- d="m 340.48389,606.50001 c -3.66204,-3e-5 -7.70403,2e-5 -10.98389,-10e-6 l 0.002,10.00007 10.99778,-7e-5 -0.0161,-9.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42965-7-9);stroke-width:0.99999923px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- y="615"
- x="330"
- height="1.0000043"
- width="1"
- id="rect42959-9"
- style="display:inline;overflow:visible;visibility:visible;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- d="m 340.5,614 h -11 v -1 h 11 z"
- id="path38929-0"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="opacity:0.25;fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter24186-3-2-5)"
- d="m 337.7,606.7 v 2.75 l 2,1.5 v 2.5 l -0.25,0.25 h -1.75 v -2 h -2 v 2 h -1.75 l -0.25,-0.25 v -2.5 l 2,-1.5 v -2.75 z"
- id="path42961-6"
- sodipodi:nodetypes="ccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccccccccccccccc"
- id="path42963-7"
- d="m 333.75,602.5 h 1.75 c 0,0 0,2 0,2 h 2 v -2 h 1.75 l 0.25,0.25 v 2.5 l -2,1.5 v 2.5 l 2,1.5 v 2.5 l -0.25,0.25 h -1.75 v -2 h -2 v 2 h -1.75 l -0.25,-0.25 v -2.5 l 2,-1.5 v -2.5 l -2,-1.5 v -2.5 z"
- style="fill:#ffffff;fill-rule:evenodd;stroke:url(#linearGradient42967-6-4);stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g45287-4"
- transform="translate(160.94228,123.97921)"
- style="display:inline;enable-background:new">
- <path
- inkscape:connector-curvature="0"
- id="path45290-5"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -120.49163,-67.5 c -3.75159,0.954856 -7.20393,6.261452 -9,9 l -3.5,-3.5 -0.25,0.5 3.99163,4 h 0.5 c 1.0421,-2.617689 4.16191,-8.585412 8.25837,-10 z"
- sodipodi:nodetypes="cccccccc" />
- <path
- inkscape:connector-curvature="0"
- id="path45302-1"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1e00;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -120.5,-68.5 c -3.15098,1.124146 -6.99163,5 -8.99163,9 l -3.5,-3.5 -0.5,0.5 4,4 c 1.42501,-3.330356 5.5,-8.75 8.99163,-10"
- sodipodi:nodetypes="cccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- d="m -120.5,-68.5 c -3.15098,1.124146 -6.99163,5 -8.99163,9 l -3.5,-3.5 -0.5,0.5 4,4 c 1.42501,-3.330356 5.5,-8.75 8.99163,-10"
- style="fill:none;stroke:#9af23d;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path45294-9" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_RECOVER_AUTO">
- <rect
- transform="scale(-1)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect45203-3"
- width="16"
- height="16"
- x="-20.95064"
- y="-67.97921" />
- <g
- style="display:inline"
- id="g45205-1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="rotate(180,61.54195,42.55)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccsccccccccsccccc"
- d="m 105.48388,31.25 6.25,-6 c 0.49692,0.284098 0.2225,0.232267 0.76612,0.25 2.20206,0.07183 4,-1.792 4,-4 l -1,-1 -2.5,2.5 -0.5,-0.5 -1,-1 -0.5,-0.5 2.5,-2.5 -1,-1 c -2.208,0 -4,1.792 -4,4 0,0.58349 0.009,0.250006 0.23388,0.75 l -6.25,6 v 2 l 1,1 z"
- style="fill:url(#linearGradient55656);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path45207-7" />
- <path
- inkscape:connector-curvature="0"
- id="path45209-9"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 115.5,21.5 -2.25,2.25 m -1,-5.5 c -1.75,0 -4,2.25 -2.5,5 l -1.26612,0.25 -5,5 v 1.75"
- sodipodi:nodetypes="ccccccc" />
- <path
- inkscape:connector-curvature="0"
- id="path45211-9"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 105.48388,31.5 5.5,-5.5 0.25,-0.5 H 112.5 c 2.73388,0 4,-1.792 4,-4 l -1,-1 -2.5,2.5 -0.5,-0.5 -1,-1 -0.5,-0.5 2.5,-2.5 -1,-1 c -2.208,0 -3.96454,1.25 -4,4 l -0.0161,1.25 -0.5,0.25 -5.5,5.5 v 2 l 1,1 h 2 z"
- sodipodi:nodetypes="cccsccccccccsccccccc" />
- <path
- inkscape:connector-curvature="0"
- id="path45214-0"
- style="fill:none;stroke:#d7d7d7;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 109.98388,25 -5,5"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- d="m 109.48388,24.5 -4,4"
- style="fill:none;stroke:#646464;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path45216-1" />
- <rect
- y="29"
- x="103.98388"
- height="1"
- width="1"
- id="rect45218-5"
- style="display:inline;overflow:visible;visibility:visible;fill:#162d50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.0999999;marker:none;enable-background:accumulate" />
- </g>
- <g
- transform="translate(-409.04935,-611.97079)"
- id="g32398-1">
- <g
- id="g32400-8"
- transform="matrix(1,0,0,-1,73,774)">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1e00;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 343,108.25 V 104 h 4.25"
- id="path32403-1"
- sodipodi:nodetypes="ccc" />
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="csc"
- id="path32411-7"
- d="m 428,671.25 c -0.0541,-1.25729 -0.54273,-2.44429 -1.37516,-3.38809 -2.00926,-2.27808 -5.59675,-2.62117 -7.87484,-0.61191 L 417,669"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1e00;stroke-width:3.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <g
- id="g32413-8"
- transform="matrix(1,0,0,-1,73,774)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path32416-5"
- d="M 343,108.25 V 104 h 4.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#8af01e;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- </g>
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- d="m 417,669 v -1 -1.5 h 1 v 1.5 h 1.5 v 1 H 418 Z"
- id="path32418-2" />
- <path
- inkscape:connector-curvature="0"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#8af01e;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 428,671.25 c -0.0541,-1.25729 -0.54273,-2.44429 -1.37516,-3.38809 -2.00926,-2.27808 -5.59675,-2.62117 -7.87484,-0.61191 L 417,669"
- id="path32420-2"
- sodipodi:nodetypes="csc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path32422-4"
- d="m 415.5,670 v -4.5 m 5,4 h -2"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:none;stroke:url(#linearGradient55624);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 428.5,671.21875 c -0.0591,-1.37274 -0.59591,-2.66246 -1.5,-3.6875 -1.09228,-1.23842 -2.62571,-1.96363 -4.1875,-2.09375 -1.55879,-0.12987 -3.16135,0.33951 -4.40625,1.4375 -3.3e-4,0.0104 -3.3e-4,0.0208 0,0.0312 L 417.5,667.75"
- id="path32424-5"
- sodipodi:nodetypes="cscccc" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_IMPORT">
- <rect
- y="51.979202"
- x="88.95063"
- height="16"
- width="16"
- id="rect42954-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-49.94936,-39.370919)"
- id="g42956-6">
- <g
- id="g42958-1"
- transform="translate(-179,199.50012)">
- <path
- inkscape:connector-curvature="0"
- id="path14490"
- d="m 328.5,-107.25 -4.5,1.75 v 6.5 l 4.5,2.25 4.5,-2.25 v -6.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#281500;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc" />
- <g
- id="g42962-0"
- transform="translate(179,-179)">
- <path
- sodipodi:nodetypes="ccccc"
- id="path42964-9"
- d="m 154,80 v -6.5 l -4.5,-1.75 v 10.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#915515;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path42966-1"
- d="M 324,-99.00012 V -105.5 l 4.5,-1.75 0.5,0.25 v 10 l -0.5,0.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#efa351;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path42968-5"
- d="m 332.5,-105.5 v 6.25 l -4,2 -4,-2.00012 V -105.5"
- style="fill:none;stroke:url(#linearGradient55950);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- id="path42970-1"
- d="m 324,-105.5 4.5,-1.75 4.5,1.75 -4.5,2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#f5ca9b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path42972-5"
- d="m 145.5,94.25012 c 0,0 4,1.75 4,1.75 l 4,-1.75"
- style="opacity:0.95999995;fill:none;stroke:url(#linearGradient55952);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <rect
- y="96.000122"
- x="149"
- height="6.7500019"
- width="1"
- id="rect42974-8"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient55954);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.09599998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- id="rect42976-8"
- width="1"
- height="6.7500019"
- x="150"
- y="96.000122" />
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.7882544,0,0,0.7883038,-8.4020402,-113.3734)"
- id="g42978-1"
- style="display:inline;enable-background:new">
- <circle
- transform="matrix(0.6425292,0,0,0.642531,44.523834,146.81699)"
- style="fill:#f2b676;fill-opacity:1;fill-rule:nonzero;stroke:#281500;stroke-width:1.97436094;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42980-5"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path42984-5"
- style="fill:none;stroke:url(#linearGradient55956);stroke-width:2.54167628;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.4991181,0,0,0.4991107,63.460522,163.7471)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.5858806,-0.06590218,0.06677852,-0.5812167,198.80048,299.96262)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path42982-9"
- style="display:inline;opacity:0.8;fill:url(#linearGradient55958);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- transform="matrix(0.875,0,0,0.875,-151.54375,-26.76875)"
- id="g43952-8">
- <g
- transform="rotate(-90,306.49718,122.50281)"
- id="g43483-9">
- <g
- transform="translate(0,21)"
- id="g43488-2">
- <path
- sodipodi:nodetypes="cc"
- id="path43490-2"
- d="M 327,86.255631 V 76"
- style="fill:none;stroke:#000000;stroke-width:3.88571429;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path43492-1"
- d="M 331.25,79.25 327,75.005631 322.75,79.25"
- style="fill:none;stroke:#000000;stroke-width:4.11428547;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(0,21)"
- id="g43494-2">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2.28571439;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 327,86.255631 V 76"
- id="path43496-7"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2.28571439;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 331.25,79.25 327,75.005631 322.75,79.25"
- id="path43498-9"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- sodipodi:nodetypes="cc"
- id="path43776-0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.14285719;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d=""
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient55988);stroke-width:1.14285719;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 284,97.25 -4.5,4.5 v 0.5 l 4.5,4.5"
- id="path43780-4"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path43860-6"
- d="m 291.5,101.5 h -8.99437"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.14285719;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_EXPORT">
- <g
- transform="translate(-28.94936,-39.370919)"
- id="g42956-6-7">
- <g
- id="g42958-1-8"
- transform="translate(-179,199.50012)">
- <path
- inkscape:connector-curvature="0"
- id="path14490-2"
- d="m 328.5,-107.25 -4.5,1.75 v 6.5 l 4.5,2.25 4.5,-2.25 v -6.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#281500;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc" />
- <g
- id="g42962-0-2"
- transform="translate(179,-179)">
- <path
- sodipodi:nodetypes="ccccc"
- id="path42964-9-7"
- d="m 154,80 v -6.5 l -4.5,-1.75 v 10.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#915515;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path42966-1-0"
- d="M 324,-99.00012 V -105.5 l 4.5,-1.75 0.5,0.25 v 10 l -0.5,0.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#efa351;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path42968-5-4"
- d="m 332.5,-105.5 v 6.25 l -4,2 -4,-2.00012 V -105.5"
- style="fill:none;stroke:url(#linearGradient14559-8);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- id="path42970-1-3"
- d="m 324,-105.5 4.5,-1.75 4.5,1.75 -4.5,2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#f5ca9b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path42972-5-8"
- d="m 145.5,94.25012 c 0,0 4,1.75 4,1.75 l 4,-1.75"
- style="opacity:0.95999995;fill:none;stroke:url(#linearGradient14561-9);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <rect
- y="96.000122"
- x="149"
- height="6.7500019"
- width="1"
- id="rect42974-8-0"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient14563-3);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.09599998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- id="rect42976-8-4"
- width="1"
- height="6.7500019"
- x="150"
- y="96.000122" />
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.7882544,0,0,0.7883038,12.59796,-113.3734)"
- id="g42978-1-6"
- style="display:inline;enable-background:new">
- <circle
- transform="matrix(0.6425292,0,0,0.642531,44.523834,146.81699)"
- style="fill:#f2b676;fill-opacity:1;fill-rule:nonzero;stroke:#281500;stroke-width:1.97436094;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42980-5-8"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path42984-5-2"
- style="fill:none;stroke:url(#linearGradient14565-5);stroke-width:2.54167628;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.4991181,0,0,0.4991107,63.460522,163.7471)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.5858806,-0.06590218,0.06677852,-0.5812167,198.80048,299.96262)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path42982-9-0"
- style="display:inline;opacity:0.8;fill:url(#linearGradient14567-8);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- transform="matrix(0.875,0,0,0.875,-149.68867,-26.76875)"
- id="g43941-0">
- <g
- id="g43467-5"
- transform="matrix(0,-1,-1,0,409.02125,429)">
- <g
- id="g43469-6"
- transform="translate(0,21)">
- <path
- style="fill:none;stroke:#000000;stroke-width:3.88571429;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 327,86.25 V 76"
- id="path43471-7"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:4.11428547;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 331.25,79.25 327,75.005631 322.75,79.25"
- id="path43473-1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g43475-6"
- transform="translate(0,21)">
- <path
- sodipodi:nodetypes="cc"
- id="path43478-9"
- d="M 327,86.25 V 76"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2.28571439;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path43481-3"
- d="M 331.25,79.25 327,75.005631 322.75,79.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2.28571439;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.37142861;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 308.5,106 2.75,-2.75"
- id="path43778-6"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path43785-2"
- d="m 308.75,97.25 c -0.25,0 -0.5,0.25 -0.5,0.5 m 2.26562,3.75 h -8.99437"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.14285719;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient55990);stroke-width:1.14285719;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 309.02125,97.249998 4.5,4.500002 v 0.5 l -4.5,4.5"
- id="path44948-4"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_EXTERNAL_DATA">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect29107-06"
- width="16"
- height="16"
- x="131"
- y="52" />
- <g
- transform="translate(-399,2)"
- id="g56091-7">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- id="path29110-17"
- d="m 531,58 6,-2.5 7.99996,3.49998 v 2.75 L 538.99997,64.99997 531,60.75 Z"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#9e9e9e;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 531,58 6,-2.5 7.99996,3.49998 v 0.5 l -6,3 L 531,58.56558 Z"
- id="path29112-53" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path29114-1"
- d="M 531.00001,60.75 531,58.5 l 7.99996,3.99998 0.01,2.49885 -8.00991,-4.24883 z"
- style="fill:#848484;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#383838;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89207077px;marker:none;enable-background:accumulate"
- d="m 544.99996,61.74998 v -2.25 l -6,3 c 0,2.58362 0,1.9329 0,2.5 z"
- id="path29116-3"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient56084-9);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 531.5,58.5 v 2 l 7.49996,3.99998 5.5,-3 v -2"
- id="path29118-7"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 531.5,58 7.49996,3.74998"
- id="path29120-1"
- sodipodi:nodetypes="cc" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient29129-4);stroke-width:1.08012342;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path29122-40"
- transform="matrix(1,0,0,0.8571429,-212,-302.2143)"
- cx="749"
- cy="420.25"
- rx="2.5"
- ry="1.75" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#66ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect29125-3"
- width="1"
- height="1"
- x="544"
- y="61" />
- </g>
- <g
- transform="matrix(0.53305487,0,0,0.53305487,-263.95264,-56.614058)"
- id="g15021"
- style="display:inline;enable-background:new">
- <path
- style="display:inline;fill:url(#linearGradient15123);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="M 756.16666,204.50001 H 766.5 V 219.5 h -13 l -10e-6,-11.99999 z"
- id="path15023"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path15025"
- d="M 756.16666,204.50001 H 766.5 V 219.5 h -13 l -10e-6,-11.99999 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:url(#radialGradient15125);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- id="path15027"
- style="display:inline;fill:none;stroke:url(#linearGradient15127);stroke-width:1.03178871;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 754.5,209 v 9.5 m 3.5,-13 h 7.5"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path15029"
- d="m 753,208 h 4 v -4 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- id="path15031"
- style="fill:none;stroke:#000000;stroke-width:1.50078368;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 753.5,207.00001 V 219.5 h 13 V 204.50001 H 756 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient15129);stroke-width:0.93798971;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 757.5,206.5 v 2 h -2"
- id="path15033"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g15009"
- transform="matrix(0.53305487,0,0,0.53305487,86.97987,-126.1707)">
- <rect
- y="344"
- x="89"
- height="16"
- width="16"
- id="rect15011"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g15013">
- <rect
- y="344.7504"
- x="91.249611"
- height="12.998481"
- width="13"
- id="rect15015"
- style="fill:url(#linearGradient15131);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.50078368;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- sodipodi:nodetypes="ccc"
- id="path15017"
- d="m 92.28796,356.69549 v -10.90453 h 10.90641 v 10.90453 z"
- style="fill:none;stroke:url(#linearGradient15133);stroke-width:0.56279385;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cszzcc"
- id="path15019"
- d="m 103.5,353.27516 c -0.37083,-1.1875 -1.21031,-1.72293 -1.9,-1.72929 -1.39235,-0.0134 -1.47709,3.98814 -2.999997,4 -1.491657,0.0119 -2.001315,-7 -3.5,-7 -1.52993,-10e-4 -1.18608,5.00645 -3.5,4.97929 h -1"
- style="display:inline;fill:none;stroke:url(#linearGradient15135);stroke-width:1.1255877;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g15035"
- transform="matrix(0.53305487,0,0,0.53305487,-270.25684,-53.589044)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path15037"
- d="m 757.01257,204.46121 9.48743,0.0388 V 219.5 h -13 l 0.0126,-11.53879 3.5,-3.5 z"
- style="display:inline;fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- inkscape:connector-curvature="0" />
- <g
- id="g15039"
- style="display:inline;enable-background:new"
- transform="translate(838.01257,111.96121)">
- <g
- id="g15041">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ebb5b5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect15043"
- width="9.9999914"
- height="12"
- x="-83"
- y="94" />
- <rect
- y="101"
- x="-83"
- height="4.9999976"
- width="9.9999924"
- id="rect15045"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#4b80cd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="94"
- x="-83"
- height="6.8499999"
- width="9.9999914"
- id="rect15047"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:url(#radialGradient15137-5);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccccccccccc"
- id="path15050"
- d="m -83,100.00002 h 1 l 1,0.74999 1,-0.74999 1,0.99999 h 2 l 1.5,-0.75 1.5,0.75 h 0.999991 L -73,102 h -9.999991 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.1;marker:none;enable-background:accumulate"
- id="rect15052"
- width="2.0000029"
- height="2.0000038"
- x="-77"
- y="96" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#280b0b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m -83,102 h 10 v 1 h -10 z"
- id="path15054"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path15056"
- d="m -77,102 h 2.000003 L -75.75,106 h -0.5 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g15058"
- style="display:inline;enable-background:new"
- transform="translate(838.01257,111.96121)">
- <path
- sodipodi:nodetypes="ccc"
- id="path15060"
- d="m -82.5,105.5 v -11 h 9"
- style="display:inline;opacity:0.25;fill:none;stroke:#000000;stroke-width:1.87597954px;stroke-linecap:round;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.2;fill:none;stroke:#000000;stroke-width:1.87597954px;stroke-linecap:round;enable-background:new"
- d="m -82.5,105.5 v -11 h 9 v 11 z"
- id="path15062"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:url(#radialGradient15139-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 757.51257,204.46121 9,1e-5 v 14.99999 h -13 v -11 z"
- id="path15064"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- d="M 754.51257,209.96121 754.5,218.5 M 759.01257,205.46121 765.5,205.5"
- style="display:inline;fill:none;stroke:url(#linearGradient15141-6);stroke-width:1.03178871;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path15066"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 753.01257,208.96121 h 5 v -5 z"
- id="path15068"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="M 753.51257,207.96121 753.5,219.5 h 13 v -14.99999 l -9.48743,-0.0388 z"
- style="fill:none;stroke:#000000;stroke-width:1.50078368;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path15070"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path15072"
- d="m 758.51257,206.46121 v 3 h -3"
- style="fill:none;stroke:url(#linearGradient15143-1);stroke-width:0.93798971;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_LOAD_FACTORY">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect29107-4"
- width="16"
- height="16"
- x="152"
- y="52" />
- <g
- transform="translate(-378,2)"
- id="g56091-71">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- id="path29110-7"
- d="m 531,58 6,-2.5 7.99996,3.49998 v 2.75 L 538.99997,64.99997 531,60.75 Z"
- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#9e9e9e;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 531,58 6,-2.5 7.99996,3.49998 v 0.5 l -6,3 L 531,58.56558 Z"
- id="path29112-1" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path29114-0"
- d="M 531.00001,60.75 531,58.5 l 7.99996,3.99998 0.01,2.49885 -8.00991,-4.24883 z"
- style="fill:#848484;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#383838;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89207077px;marker:none;enable-background:accumulate"
- d="m 544.99996,61.74998 v -2.25 l -6,3 c 0,2.58362 0,1.9329 0,2.5 z"
- id="path29116-7"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient56084-0);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 531.5,58.5 v 2 l 7.49996,3.99998 5.5,-3 v -2"
- id="path29118-8"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 531.5,58 7.49996,3.74998"
- id="path29120-7"
- sodipodi:nodetypes="cc" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient29129-1);stroke-width:1.08012342;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path29122-0"
- transform="matrix(1,0,0,0.8571429,-212,-302.2143)"
- cx="749"
- cy="420.25"
- rx="2.5"
- ry="1.75" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#66ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect29125-72"
- width="1"
- height="1"
- x="544"
- y="61" />
- </g>
- <g
- transform="translate(-262.04935,-611.97079)"
- id="g32365-0-5">
- <g
- style="opacity:0.8"
- id="g32367-2-1"
- transform="translate(23,1)">
- <g
- style="display:inline;opacity:0.96000001"
- id="g32369-7-1"
- transform="matrix(0.927848,0,0,0.916217,240.82022,467.72362)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.784039,0,0,0.779055,265.50801,498.28815)"
- id="g32373-2-0"
- style="display:inline;opacity:0.96000001;fill:none;stroke:url(#linearGradient32430-7-9-7);stroke-width:1.17973554;stroke-opacity:1" />
- </g>
- <g
- id="g32398-1-7">
- <g
- transform="matrix(1,0,0,-1,73,774)"
- id="g32400-8-4">
- <path
- sodipodi:nodetypes="ccc"
- id="path32403-1-2"
- d="M 343,108.25 V 104 h 4.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1e00;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1e00;stroke-width:3.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 428,671.25 c -0.0541,-1.25729 -0.54273,-2.44429 -1.37516,-3.38809 -2.00926,-2.27808 -5.59675,-2.62117 -7.87484,-0.61191 L 417,669"
- id="path32411-7-3"
- sodipodi:nodetypes="csc"
- inkscape:connector-curvature="0" />
- <g
- transform="matrix(1,0,0,-1,73,774)"
- id="g32413-8-5">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#8af01e;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 343,108.25 V 104 h 4.25"
- id="path32416-5-1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path32418-2-3"
- d="m 417,669 v -1 -1.5 h 1 v 1.5 h 1.5 v 1 H 418 Z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csc"
- id="path32420-2-7"
- d="m 428,671.25 c -0.0541,-1.25729 -0.54273,-2.44429 -1.37516,-3.38809 -2.00926,-2.27808 -5.59675,-2.62117 -7.87484,-0.61191 L 417,669"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#8af01e;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 415.5,670 v -4.5 m 5,4 h -2"
- id="path32422-4-0"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cscccc"
- id="path32424-5-0"
- d="m 428.5,671.21875 c -0.0591,-1.37274 -0.59591,-2.66246 -1.5,-3.6875 -1.09228,-1.23842 -2.62571,-1.96363 -4.1875,-2.09375 -1.55879,-0.12987 -3.16135,0.33951 -4.40625,1.4375 -3.3e-4,0.0104 -3.3e-4,0.0208 0,0.0312 L 417.5,667.75"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:none;stroke:url(#linearGradient32434-5-8-9);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_SAVE_COPY">
- <g
- transform="translate(190.95065,3.97921)"
- id="g18875-2"
- style="display:inline">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18877-3"
- width="16"
- height="16"
- x="3"
- y="69" />
- <g
- style="display:inline"
- id="g18879-4"
- transform="translate(0.01612278)">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18881-0"
- d="M 17.453876,82.25 16.233877,83.5 H 5.75 L 4.5,82.25 4.4999999,70.5 H 17.465291 l -0.01141,11.75 z"
- style="fill:url(#linearGradient17222-4-4);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cccccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18883-5"
- d="M 15.983877,81.999998 5.9838772,82 V 81.000002 L 15.983877,81 Z"
- style="fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient17224-0-9);stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 5.4838772,82.500001 5.511418,71.499938 16.483877,71.5 v 11 z"
- id="path18885-1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect18887-7"
- width="1"
- height="1"
- x="6.9838772"
- y="81"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- d="m 197.45064,77.47921 h 9 m -9,2 h 9 m -9,2 h 9"
- style="fill:none;stroke:url(#linearGradient56401);stroke-width:0.9999994px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1"
- id="path19108-4"
- inkscape:connector-curvature="0" />
- <g
- id="g45287-4-9"
- transform="translate(328.94228,144.9792)"
- style="display:inline;enable-background:new">
- <path
- inkscape:connector-curvature="0"
- id="path45290-5-8"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -120.49163,-67.5 c -3.75159,0.954856 -7.20393,6.261452 -9,9 l -3.5,-3.5 -0.25,0.5 3.99163,4 h 0.5 c 1.0421,-2.617689 4.16191,-8.585412 8.25837,-10 z"
- sodipodi:nodetypes="cccccccc" />
- <path
- inkscape:connector-curvature="0"
- id="path45302-1-2"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1e00;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -120.5,-68.5 c -3.15098,1.124146 -6.99163,5 -8.99163,9 l -3.5,-3.5 -0.5,0.5 4,4 c 1.42501,-3.330356 5.5,-8.75 8.99163,-10"
- sodipodi:nodetypes="cccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- d="m -120.5,-68.5 c -3.15098,1.124146 -6.99163,5 -8.99163,9 l -3.5,-3.5 -0.5,0.5 4,4 c 1.42501,-3.330356 5.5,-8.75 8.99163,-10"
- style="fill:none;stroke:#9af23d;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path45294-9-3" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_SAVE_AS">
- <rect
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0;fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.5999999;marker:none;enable-background:accumulate"
- id="rect31818-2"
- width="16"
- height="16"
- x="173"
- y="73" />
- <g
- id="g45287-4-6"
- transform="translate(307.94228,144.9792)"
- style="display:inline;enable-background:new">
- <path
- inkscape:connector-curvature="0"
- id="path45290-5-0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -120.49163,-67.5 c -3.75159,0.954856 -7.20393,6.261452 -9,9 l -3.5,-3.5 -0.25,0.5 3.99163,4 h 0.5 c 1.0421,-2.617689 4.16191,-8.585412 8.25837,-10 z"
- sodipodi:nodetypes="cccccccc" />
- <path
- inkscape:connector-curvature="0"
- id="path45302-1-7"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1e00;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -120.5,-68.5 c -3.15098,1.124146 -6.99163,5 -8.99163,9 l -3.5,-3.5 -0.5,0.5 4,4 c 1.42501,-3.330356 5.5,-8.75 8.99163,-10"
- sodipodi:nodetypes="cccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- d="m -120.5,-68.5 c -3.15098,1.124146 -6.99163,5 -8.99163,9 l -3.5,-3.5 -0.5,0.5 4,4 c 1.42501,-3.330356 5.5,-8.75 8.99163,-10"
- style="fill:none;stroke:#9af23d;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path45294-9-7" />
- </g>
- <g
- transform="translate(421.95065,-463.02079)"
- id="g31820-9">
- <path
- sodipodi:nodetypes="ccc"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m -239.5,548.5 v -1 h 1"
- id="path31830-7"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -239.25,548 h 0.5"
- id="path31838-1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path31840-4"
- d="m -239.25,548 h 0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#d2d2d2;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m -239.5,548.5 -0.25,-0.5 0.25,-0.5 h 1"
- id="path31844-1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(425.95065,-463.02079)"
- id="g31820-9-7">
- <path
- sodipodi:nodetypes="ccc"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m -239.5,548.5 v -1 h 1"
- id="path31830-7-9"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -239.25,548 h 0.5"
- id="path31838-1-6"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path31840-4-3"
- d="m -239.25,548 h 0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#d2d2d2;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m -239.5,548.5 -0.25,-0.5 0.25,-0.5 h 1"
- id="path31844-1-3"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_OPEN_RECENT">
- <rect
- y="73"
- x="299"
- height="16"
- width="16"
- id="rect25824-7"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <g
- transform="translate(209.95065,-333.02079)"
- id="g25826-2">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient25927-1-2);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- d="m 89.5,408.5 v 11.49245 l 1.5,1.5 10.5,0.008 V 409.508 l -8,-0.008 v -1 z"
- id="path25828-2"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(-361,287.99994)"
- id="g25830-3"
- style="display:inline" />
- <path
- sodipodi:nodetypes="cccccc"
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 91.5,420.49245 -1.01563,-0.98437 v -10.02344 h 2 v 1 L 100.5,410.5"
- id="path25834-2"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffffff;fill-rule:evenodd;stroke:none"
- d="m 93,409 v 2 h -3 v -2 z"
- id="path25840-3"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccc"
- id="path25842-4"
- d="m 89.5,408.5 v 11.49245 l 1.5,1.5 12,0.008 1.5,-1.49245 v -6.50755 l -3,-0.008 v -3.9849 l -8,-0.008 v -1 h -4 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2a2512;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g56440">
- <g
- style="display:inline;opacity:0.96000001"
- id="g40606-5"
- transform="matrix(0.927848,0,0,0.916217,148.77086,-125.29717)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path40608-1"
- style="fill:url(#linearGradient42519-8-7);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.22752953;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.87787,0,0,0.889264,55.67911,118.0341)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.784039,0,0,0.779055,173.45865,-94.73264)"
- id="g40610-3"
- style="display:inline;opacity:0.96000001;fill:none;stroke:url(#linearGradient42523-5-8);stroke-width:1.17973554;stroke-opacity:1">
- <circle
- transform="matrix(0.87787,0,0,0.889264,55.67911,118.0341)"
- style="fill:none;stroke:url(#linearGradient42521-3-0);stroke-width:1.44816053;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path40612-7"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path40614-9"
- style="opacity:0.96000001;fill:none;stroke:#ffffff;stroke-width:2.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 310.45064,75.47921 -3,3 m 0,1 2,2"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- d="m 307.45064,79.47921 2,2"
- style="opacity:0.96000001;fill:none;stroke:#aa0000;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path40616-6"
- inkscape:transform-center-y="1.25"
- inkscape:transform-center-x="-1.25" />
- <rect
- y="82.97921"
- x="307.95065"
- height="1.5"
- width="1"
- id="rect40618-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.48000004;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <rect
- y="77.97921"
- x="311.95065"
- height="1"
- width="1.5"
- id="rect40620-6"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.48000004;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- inkscape:transform-center-y="-0.75"
- id="path40622-6"
- style="opacity:0.96000001;fill:none;stroke:#000000;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 310.45064,75.47921 -3,3"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.96000001;fill:url(#linearGradient56428);fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 307.80578,72.95456 c -3.25557,0.003 -5.8936,2.6597 -5.87155,5.95078 0.0105,1.56055 0.63214,2.99542 1.61111,4.05762 2.7831,-7.37691 5.95805,-1.77373 7.49116,-9.06794 -0.92886,-0.60835 -2.04538,-0.9415 -3.23072,-0.94046 z"
- id="path40624-9"
- inkscape:transform-center-x="1.4653436"
- inkscape:transform-center-y="-1.0204512" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.28800001;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect40626-3"
- width="1.4999696"
- height="1"
- x="302.4668"
- y="78.97921" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.28800001;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate"
- id="rect40628-5"
- width="1"
- height="1.4999921"
- x="306.95065"
- y="73.47921" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- d="m 310.45064,75.47921 -3,3"
- style="opacity:0.57600002;fill:none;stroke:#000000;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path40630-7"
- inkscape:transform-center-y="-0.75" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect15838"
- width="16"
- height="16"
- x="298.95065"
- y="73.97921" />
- <g
- transform="translate(209.95065,-333.02079)"
- id="g15840">
- <g
- style="display:inline"
- id="g15844"
- transform="translate(-361,287.99994)" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc"
- id="path15846"
- d="m 92.5,413.74245 12,0.008 v 6.25 l -1.5,1.49245 -12,0.008 v -2 h 1.5 v -5.75755 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#d1c595;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient25929-7-8);stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path15850"
- d="m 93,420.5 h 9.5"
- style="display:inline;opacity:0.18999999;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#linearGradient15963-3);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 103.5,414.75 -10,-0.008 v 4.75755 l -1.5,1.5 -1.5,-1.5"
- id="path15852" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2a2512;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 89.5,419.99245 1.5,1.5 12,0.008 1.5,-1.49245 v -6.50755 l -3,-0.008"
- id="path15856"
- sodipodi:nodetypes="cccccc" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_COLOR_RED"
- transform="translate(63.000002,128.99999)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect36341-7"
- width="16"
- height="16"
- x="341"
- y="238" />
- <g
- transform="translate(0,-12)"
- id="g36343-6">
- <circle
- transform="matrix(-0.7451143,-0.08386971,0.08492794,-0.7396793,437.33358,356.39712)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path36363-9"
- style="display:inline;opacity:0.3;fill:url(#radialGradient37501-4-64);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <g
- id="g36345-6"
- transform="matrix(1.1658027,0,0,1.1657997,198.71028,-2.0560643)">
- <path
- inkscape:transform-center-y="-3.2499984"
- inkscape:transform-center-x="-2.8145849"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36349-3"
- style="fill:#fa2929;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(0.6969448,0,0,0.6969467,36.918512,140.83126)" />
- <path
- transform="matrix(0.3484724,0.6035735,-0.603572,0.3484734,154.13836,102.27942)"
- sodipodi:type="arc"
- style="fill:#ba0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36351-4"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="-3.2630798"
- inkscape:transform-center-y="1.6729808e-05" />
- <path
- inkscape:transform-center-y="3.2500173"
- inkscape:transform-center-x="-2.8145756"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36353-6"
- style="fill:#8c0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(-0.3484724,0.6035735,-0.603572,-0.3484733,246.13507,184.51913)" />
- <path
- transform="matrix(-0.6969448,2.2484149e-8,-4.6257528e-8,-0.6969467,220.91956,305.31067)"
- sodipodi:type="arc"
- style="fill:#bb1010;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36355-4"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="2.8145978"
- inkscape:transform-center-y="3.249994" />
- <path
- inkscape:transform-center-x="3.2630773"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36357-2"
- style="fill:#fa2929;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(-0.3484724,-0.6035734,0.603572,-0.3484734,103.69972,343.86251)" />
- <path
- inkscape:transform-center-y="-3.2500006"
- transform="matrix(0.3484724,-0.6035734,0.603572,0.3484733,11.703006,261.6228)"
- sodipodi:type="arc"
- style="fill:#ff7777;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36359-5"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="2.8145777" />
- </g>
- <circle
- transform="matrix(0.8124999,0,0,0.8045157,241.75,163.13011)"
- style="fill:none;stroke:#000000;stroke-width:0.98948926;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path36361-7"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path36365-0"
- style="fill:none;stroke:url(#linearGradient37503-1-7);stroke-width:1.45605874;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6860851,0,0,0.6874876,258.44808,176.87656)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_COLOR_GREEN"
- transform="translate(84.000002,128.99999)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect36341-7-6"
- width="16"
- height="16"
- x="341"
- y="238" />
- <g
- transform="translate(0,-12)"
- id="g36343-6-8">
- <circle
- transform="matrix(-0.7451143,-0.08386971,0.08492794,-0.7396793,437.33358,356.39712)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path36363-9-4"
- style="display:inline;opacity:0.3;fill:url(#radialGradient37501-4-9-0);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <g
- id="g36345-6-9"
- transform="matrix(1.1658027,0,0,1.1657997,198.71028,-2.0560643)">
- <path
- inkscape:transform-center-y="-3.2499984"
- inkscape:transform-center-x="-2.8145849"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36349-3-1"
- style="fill:#1fdf05;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(0.6969448,0,0,0.6969467,36.918512,140.83126)" />
- <path
- transform="matrix(0.3484724,0.6035735,-0.603572,0.3484734,154.13836,102.27942)"
- sodipodi:type="arc"
- style="fill:#16ba00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36351-4-7"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="-3.2630798"
- inkscape:transform-center-y="1.6729808e-05" />
- <path
- inkscape:transform-center-y="3.2500173"
- inkscape:transform-center-x="-2.8145756"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36353-6-7"
- style="fill:#109400;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(-0.3484724,0.6035735,-0.603572,-0.3484733,246.13507,184.51913)" />
- <path
- transform="matrix(-0.6969448,2.2484149e-8,-4.6257528e-8,-0.6969467,220.91956,305.31067)"
- sodipodi:type="arc"
- style="fill:#24bb10;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36355-4-6"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="2.8145978"
- inkscape:transform-center-y="3.249994" />
- <path
- inkscape:transform-center-x="3.2630773"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36357-2-5"
- style="fill:#60f44c;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(-0.3484724,-0.6035734,0.603572,-0.3484734,103.69972,343.86251)" />
- <path
- inkscape:transform-center-y="-3.2500006"
- transform="matrix(0.3484724,-0.6035734,0.603572,0.3484733,11.703006,261.6228)"
- sodipodi:type="arc"
- style="fill:#87ff77;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36359-5-2"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="2.8145777" />
- </g>
- <circle
- transform="matrix(0.8124999,0,0,0.8045157,241.75,163.13011)"
- style="fill:none;stroke:#000000;stroke-width:0.98948926;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path36361-7-9"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path36365-0-7"
- style="fill:none;stroke:url(#linearGradient37503-1-9-9);stroke-width:1.45605874;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6860851,0,0,0.6874876,258.44808,176.87656)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_COLOR_BLUE"
- transform="translate(104.99111,129.00001)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect36341-7-4"
- width="16"
- height="16"
- x="341"
- y="238" />
- <g
- transform="translate(0,-12)"
- id="g36343-6-2">
- <circle
- transform="matrix(-0.7451143,-0.08386971,0.08492794,-0.7396793,437.33358,356.39712)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path36363-9-0"
- style="display:inline;opacity:0.3;fill:url(#radialGradient37501-4-6-8);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <g
- id="g36345-6-4"
- transform="matrix(1.1658027,0,0,1.1657997,198.71028,-2.0560643)">
- <path
- inkscape:transform-center-y="-3.2499984"
- inkscape:transform-center-x="-2.8145849"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36349-3-5"
- style="fill:#5050fb;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(0.6969448,0,0,0.6969467,36.918512,140.83126)" />
- <path
- transform="matrix(0.3484724,0.6035735,-0.603572,0.3484734,154.13836,102.27942)"
- sodipodi:type="arc"
- style="fill:#0000ba;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36351-4-3"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="-3.2630798"
- inkscape:transform-center-y="1.6729808e-05" />
- <path
- inkscape:transform-center-y="3.2500173"
- inkscape:transform-center-x="-2.8145756"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36353-6-4"
- style="fill:#00008c;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(-0.3484724,0.6035735,-0.603572,-0.3484733,246.13507,184.51913)" />
- <path
- transform="matrix(-0.6969448,2.2484149e-8,-4.6257528e-8,-0.6969467,220.91956,305.31067)"
- sodipodi:type="arc"
- style="fill:#1010bb;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36355-4-4"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="2.8145978"
- inkscape:transform-center-y="3.249994" />
- <path
- inkscape:transform-center-x="3.2630773"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36357-2-9"
- style="fill:#5050fb;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(-0.3484724,-0.6035734,0.603572,-0.3484734,103.69972,343.86251)" />
- <path
- inkscape:transform-center-y="-3.2500006"
- transform="matrix(0.3484724,-0.6035734,0.603572,0.3484733,11.703006,261.6228)"
- sodipodi:type="arc"
- style="fill:#9a9afd;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36359-5-4"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="2.8145777" />
- </g>
- <circle
- transform="matrix(0.8124999,0,0,0.8045157,241.75,163.13011)"
- style="fill:none;stroke:#000000;stroke-width:0.98948926;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path36361-7-0"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path36365-0-0"
- style="fill:none;stroke:url(#linearGradient37503-1-1-1);stroke-width:1.45605874;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6860851,0,0,0.6874876,258.44808,176.87656)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_META_EMPTY"
- transform="translate(230.94982,190.97922)">
- <g
- transform="translate(83.990364,83.999999)"
- id="g42209-9"
- style="opacity:0.5">
- <circle
- transform="matrix(0.9361892,0,0,0.9375002,-26.576994,10.374973)"
- style="fill:#ffd5d5;fill-opacity:0.58823529;fill-rule:nonzero;stroke:#800000;stroke-width:1.06741309;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42211-6"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path42213-0"
- style="fill:none;stroke:url(#linearGradient42487-4-5);stroke-width:1.22662127;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.814129,0,0,0.816369,-10.451999,24.674751)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.6848076,0,0,0.6867124,6.6184411,39.974237)"
- style="fill:none;stroke:url(#linearGradient42489-5-9);stroke-width:1.45823753;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42215-8"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.814129,0,0,0.816369,-10.451999,24.674751)"
- style="fill:none;stroke:url(#linearGradient42491-0-9);stroke-width:1.22662127;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path42217-3"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path17230"
- style="fill:none;stroke:url(#linearGradient17232-8);stroke-width:3.2130022;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.31076006,0,0,0.31171146,55.992715,84.224347)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- transform="matrix(1.3088013,0,0,1.3078064,114.94487,78.842325)"
- style="display:inline"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g42219-5" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MOD_DYNAMICPAINT">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18695-5"
- width="16"
- height="16"
- x="173"
- y="241" />
- <g
- id="g16145">
- <g
- transform="translate(-150.04936,350.7292)"
- id="g18697-4">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- id="path18699-1"
- d="m 330,-107.75 -5,2 0.0372,6.324398 5,2.71875 4.99999,-2.71875 L 335,-105.75 Z"
- style="fill:none;stroke:url(#linearGradient28405-0);stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient18721-1-6);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 330.03717,-107.6131 -5,1.875 v 6.312498 l 5,2.71875 4.99999,-2.71875 v -6.312498 z"
- id="path18719-9" />
- <g
- transform="translate(179,-179)"
- id="g18703-1">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient18728-6-0);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 146.0019,73.295281 5,-1.894157 5,1.894157 -5,2.073959 z"
- id="path18707-3" />
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- style="display:inline;fill:url(#linearGradient18765-0-9);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 334.98437,-105.6875 -5,2.04687 0.0156,6.89063 5,-2.75 z"
- id="path18763-6" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient18712-0-7);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 334.5,-105.25 0.002,5.587357 -4.5,2.480073 -4.5,-2.480073 L 325.5,-105.25 330,-107 Z"
- id="path18709-9"
- sodipodi:nodetypes="ccccccc" />
- <g
- style="opacity:0.7"
- id="g18737-7" />
- </g>
- <g
- id="g52877-0"
- style="display:inline;enable-background:new"
- transform="translate(-332.03324,273.93783)">
- <path
- inkscape:connector-curvature="0"
- style="fill:#2968c3;fill-opacity:1;fill-rule:evenodd;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 506.48389,-17.45862 v -1 c 4.75,-1 2.25,-4.5 6.31852,-4.187139 0.70341,0.496889 0.93148,1.187139 0.93148,2.122782 0,3.064357 -2.5,3.314357 -7.25,3.064357 z"
- id="path52879-3"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path52881-6"
- d="m 505.98389,-17.522977 c 5.75,-0.75 2.71305,-4.172284 6.75,-5.25 0.70341,0.496889 1.61991,1.711436 1.75268,2.186272 0,3.572675 -4.12319,3.136436 -8.50268,3.063728 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#radialGradient53141-5-8);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 515.48389,-25.95862 -2.75,3.25 1.75,2.25 3,-3"
- id="path52883-5"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- id="path52885-6"
- d="m 514.98389,-24.95862 -2.25,2.5 1.37109,1.875 2.37891,-2.375 z"
- style="fill:url(#linearGradient53143-6-3);fill-opacity:1;fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path52887-1"
- d="m 520.48389,-31.45862 -6,6.75 2,2.25 4,-4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient53145-1-0);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.23326063;marker:none;enable-background:accumulate"
- d="m 520.98389,-31.95862 -6.75,7.75 1.75,1.75 5,-4.5 z"
- id="path52889-3"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path52891-3"
- d="m 513.48389,-22.45862 7,-8.25"
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path52893-4"
- d="m 511.98389,-21.772977 -1.25,1.25 c -0.96702,0.819679 -0.76749,2.123051 -3.25,2.314357"
- style="display:inline;opacity:0.4;fill:none;stroke:url(#linearGradient53147-9-4);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MOD_VERTEX_WEIGHT">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18695-2"
- width="16"
- height="16"
- x="152"
- y="241" />
- <g
- id="g16049">
- <g
- id="g16027">
- <g
- transform="translate(-20.81186,-5.9082992)"
- id="g27791"
- style="display:inline;enable-background:new">
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 173.5625,249.6875 h 0.5"
- id="path31838-1-6-1-4"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path31840-4-3-0-6"
- d="m 173.5625,249.6875 h 0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#181dff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- style="display:inline;fill:none;stroke:#2f4cff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m 173.3125,250.1875 -0.25,-0.5 0.25,-0.5 h 1"
- id="path31844-1-3-6-4"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-13.91186,-7.9082992)"
- id="g27791-5"
- style="display:inline;fill:none;enable-background:new">
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 173.5625,249.6875 h 0.5"
- id="path31838-1-6-1-4-5"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path31840-4-3-0-6-0"
- d="m 173.5625,249.6875 h 0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#00cc19;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- style="display:inline;fill:none;stroke:#34ff24;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m 173.3125,250.1875 -0.25,-0.5 0.25,-0.5 h 1"
- id="path31844-1-3-6-4-7"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-10.27839,-7.4632172)"
- id="g27791-9"
- style="display:inline;enable-background:new">
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 173.5625,249.6875 h 0.5"
- id="path31838-1-6-1-4-7"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path31840-4-3-0-6-5"
- d="m 173.5625,249.6875 h 0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffff0a;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- style="display:inline;fill:none;stroke:#fcff7b;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m 173.3125,250.1875 -0.25,-0.5 0.25,-0.5 h 1"
- id="path31844-1-3-6-4-9"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-6.9118602,-5.9082992)"
- id="g27791-0"
- style="display:inline;enable-background:new">
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 173.5625,249.6875 h 0.5"
- id="path31838-1-6-1-4-54"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path31840-4-3-0-6-1"
- d="m 173.5625,249.6875 h 0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ff0606;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- style="display:inline;fill:none;stroke:#ff3131;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m 173.3125,250.1875 -0.25,-0.5 0.25,-0.5 h 1"
- id="path31844-1-3-6-4-4"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-17.39403,-7.3654702)"
- id="g27791-5-2"
- style="display:inline;fill:none;enable-background:new">
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 173.5625,249.6875 h 0.5"
- id="path31838-1-6-1-4-5-4"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path31840-4-3-0-6-0-6"
- d="m 173.5625,249.6875 h 0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#00bc86;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- style="display:inline;fill:none;stroke:#24ffea;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m 173.3125,250.1875 -0.25,-0.5 0.25,-0.5 h 1"
- id="path31844-1-3-6-4-7-2"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g16016">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- id="path18699-7"
- d="m 159.95712,247.8542 -3.25648,1.32353 -1.7128,5.25087 5,2.71875 4.99999,-2.71875 -1.77423,-5.25087 z"
- style="fill:none;stroke:#0b1728;stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient16010);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 159.98133,247.9448 -3.25648,1.2408 -1.73704,5.243 5,2.71875 4.99999,-2.71875 -1.75,-5.243 z"
- id="path18719-4" />
- <g
- transform="translate(8.95064,173.9792)"
- id="g18703-0">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient15994);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 147.75124,75.228495 3.25648,-1.253486 3.25648,1.253486 -3.25648,1.372473 z"
- id="path18707-0" />
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- style="display:inline;fill:url(#linearGradient16005);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 163.2136,249.34317 -3.25648,1.32353 -0.006,6.4375 5,-2.75 z"
- id="path18763-7" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient16002);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 162.79956,249.6191 1.65308,4.57246 -4.5,2.48007 -4.5,-2.48007 1.75043,-4.61666 2.79824,-1.11389 z"
- id="path18709-5"
- sodipodi:nodetypes="ccccccc" />
- <path
- sodipodi:nodetypes="csssc"
- inkscape:connector-curvature="0"
- id="path14332-7-5"
- d="m 161.04227,247.90828 c 0.24495,-0.26634 0.39423,-0.62011 0.39423,-1.00834 0,-0.8284 -0.67974,-1.49994 -1.51825,-1.49994 -0.83851,0 -1.51825,0.67154 -1.51825,1.49994 0,0.43979 0.0353,0.57241 0.34052,0.84677"
- style="display:inline;fill:#e6e6e6;fill-opacity:1;stroke:#0b1728;stroke-width:2.80000019;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" />
- <ellipse
- transform="matrix(0.8540253,0,0,-1.199954,81.751209,396.89409)"
- id="path14336-5-6"
- style="display:inline;fill:#000000;fill-opacity:1;stroke:url(#linearGradient15989);stroke-width:1.28417933;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- cx="91.5"
- cy="125"
- rx="1.75"
- ry="1.25" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:#162d50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate"
- id="rect14340-2-4"
- width="2.0011597"
- height="2"
- x="158.93533"
- y="245.8999" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MOD_REMESH">
- <rect
- y="241"
- x="194"
- height="16"
- width="16"
- id="rect18695-5-8"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g16203">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect27661-6"
- width="16"
- height="16"
- x="193.95064"
- y="240.9792" />
- <g
- clip-path="url(#clipPath42711-8-1)"
- style="display:inline;enable-background:new"
- id="g27663-9"
- transform="matrix(0.9168751,0,0,0.9161255,86.13094,44.221905)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <path
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0"
- id="path27665-7"
- d="m 140.02478,121.67739 -4.38034,-0.0133 0.0328,4.36819 -6.18368,-0.0323 -0.0643,-16 6.1827,-0.0158 -0.0143,4.42449 4.42553,-0.0164 z"
- clip-path="none"
- mask="none"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient15368-7);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:1.45480967;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(0.75,0,0,0.75,29.5,135)" />
- <path
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient15326-8);fill-opacity:1;stroke:#183e75;stroke-width:1.45480967;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- mask="none"
- clip-path="none"
- d="m 135.64444,121.66409 -6.15088,-0.006 -0.0643,-7.28458 6.1684,0.0349 z"
- id="path15284"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:1.45480967;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- mask="none"
- clip-path="none"
- d="m 140.02478,121.67739 -4.38034,-0.0133 0.0328,4.36819 -6.18368,-0.0323 -0.0643,-16 6.1827,-0.0158 -0.0143,4.42449 4.42553,-0.0164 z"
- id="path15318"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccc" />
- </g>
- <g
- id="g27669-3"
- style="display:inline;opacity:0.55;enable-background:new"
- transform="translate(-42.04936,-19.020799)">
- <path
- inkscape:connector-curvature="0"
- transform="matrix(0.9285719,0,0,0.9072647,16.387388,24.853058)"
- sodipodi:nodetypes="cccc"
- id="path27671-9"
- d="M 243.50439,274.05251 237.04285,268 l 0.43058,-0.40461 6.03096,-5.66723"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient42432-3-3);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.87159598;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient15281-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.87159598;marker:none;enable-background:accumulate"
- d="M 243.55198,273.44361 237.66157,268 l 5.84282,0.0171"
- id="path15273"
- sodipodi:nodetypes="ccc"
- transform="matrix(0.9285719,0,0,0.9072647,16.387388,24.853058)"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccc"
- id="path27673-0-1"
- d="m 200.70018,253.41671 -4.93656,-4.42903 4.93656,-4.57097"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient15620-8);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- id="g27675-38"
- style="display:inline;enable-background:new"
- transform="rotate(-45,116.10034,107.19792)">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 73.545051,272.22272 7.071067,-7.07107"
- id="path27679-2"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- id="path42388-6"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:none;stroke:#28220b;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="m 71.600508,272.3995 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071 m 2.121321,-2.12133 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071" />
- <path
- inkscape:connector-curvature="0"
- d="m 71.600508,272.3995 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071 m 2.121321,-2.12133 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffe991;stroke-width:1.19999993;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path42359-8" />
- </g>
- <path
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.6507937;enable-background:new"
- d="m 207.43504,247.49483 h 1.06248"
- id="path15333"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.6507937;enable-background:new"
- d="m 203.9116,244.49483 h 1.51561"
- id="path15333-4"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.6507937;enable-background:new"
- d="m 203.9116,247.51045 h 1.54686"
- id="path15333-3"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="display:inline;fill:none;stroke:#1b4685;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 207.38817,249.47921 0.0703,0.004"
- id="path15333-2"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="display:inline;fill:none;stroke:#185e98;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 203.38817,249.47921 1.07811,0.0118"
- id="path15333-2-7"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="display:inline;fill:none;stroke:#143564;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 204.37254,253.47921 1.07811,0.0118"
- id="path15333-2-7-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MOD_WARP">
- <rect
- y="241"
- x="236"
- height="16"
- width="16"
- id="rect18695-5-0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g38510"
- style="display:inline;enable-background:new"
- transform="translate(-0.04936017,-0.02079917)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect41297-5"
- width="10"
- height="16"
- x="239"
- y="241" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient15474-9);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 244,242.5 c -1.8975,0 -3.4375,1.12 -3.4375,2.5 v 2.6875 c -0.79985,0.58688 -1.28125,1.40301 -1.28125,2.4375 0,1.01219 0.48237,1.85277 1.28125,2.4375 V 254 c 0,1.38 1.54,2.5 3.4375,2.5 1.8975,0 3.4375,-1.12 3.4375,-2.5 v -1.375 c 0.82151,-0.58809 1.3125,-1.44988 1.3125,-2.5 0,-1.02039 -0.50216,-1.82067 -1.3125,-2.40625 V 245 c 0,-1.38 -1.54,-2.5 -3.4375,-2.5 z"
- id="path41299-1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.44561403;fill:none;stroke:url(#linearGradient15467-9);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 246.78175,244.56297 c -0.49244,0.67079 -1.66895,1.05852 -2.78633,1.05852 -1.11738,0 -2.54413,-0.3096 -2.81106,-1.12463"
- id="path41303-1"
- sodipodi:nodetypes="czs" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="csc"
- id="path41307-7"
- d="m 241.4192,253.61696 c 0.11987,0.88868 0.64962,2.00518 2.61584,2.01183 1.81407,0.006 2.49621,-1.01999 2.49621,-2.00379"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#1b4685;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:0.64285715;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="czcsssc"
- id="path15557"
- d="m 247.22147,247.96875 c -0.5625,0.53865 -1.82275,0.90274 -3.1948,0.90274 -1.37205,0 -2.25345,-0.3128 -3.15167,-0.80899 -0.625,0.59375 -1.17803,1.9131 -0.72606,2.94175 0.61274,1.39456 1.58368,2.00791 3.99437,2.02034 2.38609,0.0123 3.13442,-0.85323 3.75195,-2.02459 0.57357,-1.08798 0.16996,-2.1875 -0.67379,-3.03125 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient15601-9);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- id="path41305-9"
- d="m 244,242.5 c -2.18749,0 -3.4375,1.12 -3.4375,2.5 v 2.3125 c -0.8822,0.72794 -1.4375,1.73295 -1.4375,2.84375 0,1.1108 0.5553,2.11581 1.4375,2.84375 v 0.5 c 0,2 1.54,3 3.4375,3 1.8975,0 3.4375,-1 3.4375,-3 V 253 c 0.8822,-0.72794 1.4375,-1.73295 1.4375,-2.84375 0,-1.1108 -0.5553,-2.11581 -1.4375,-2.84375 V 245 c 0,-1.38 -1.24999,-2.5 -3.4375,-2.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:0.80000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <g
- style="display:inline;enable-background:new"
- id="g41715-3"
- transform="matrix(0.75,0,0,0.625,396.9999,55.104854)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect41717-2"
- width="16"
- height="16"
- x="-211.99985"
- y="304" />
- <g
- style="display:inline;opacity:0.8;enable-background:new"
- transform="translate(73.00016,196)"
- id="g41719-6" />
- <g
- style="display:inline"
- id="g41739-4"
- transform="matrix(1.1658027,0,0,1.1657997,-354.28956,51.94393)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient15576-5);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 247.03531,249.33728 c -0.5,0.22615 -1.69837,0.52774 -2.8823,0.52774 -1.18393,0 -1.75974,-0.0315 -3.02667,-0.49649"
- id="path41303-1-0"
- sodipodi:nodetypes="czs" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:0.80000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 250.25295,253 c 0.73683,-0.72794 1.01313,-1.73295 1.01313,-2.84375 0,-1.1108 -0.2763,-2.11581 -1.01313,-2.84375"
- id="path15603"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="csc" />
- <path
- sodipodi:nodetypes="csc"
- inkscape:connector-curvature="0"
- id="path15609"
- d="m 249.80713,252.38128 c 0.53336,-0.70678 0.65533,-1.36527 0.65533,-2.22503 0,-0.80144 -0.27822,-1.5779 -0.65533,-2.18084"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#aacee7;stroke-width:0.80000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:0.80392157;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:0.80000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 237.81491,253 c -0.73683,-0.72794 -1.01313,-1.73295 -1.01313,-2.84375 0,-1.1108 0.2763,-2.11581 1.01313,-2.84375"
- id="path15603-0"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="csc" />
- <path
- sodipodi:nodetypes="csc"
- inkscape:connector-curvature="0"
- id="path15609-7"
- d="m 238.26073,252.38128 c -0.53336,-0.70678 -0.65533,-1.36527 -0.65533,-2.22503 0,-0.80144 0.27822,-1.5779 0.65533,-2.18084"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#aacee7;stroke-width:0.80000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:0.80392157;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- id="ICON_MOD_TRIANGULATE">
- <rect
- y="241"
- x="278"
- height="16"
- width="16"
- id="rect41153-9"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-0.96226475,0.05341077)"
- id="g16521">
- <rect
- y="242.48071"
- x="280.45062"
- height="12.983693"
- width="12.031255"
- id="rect41157-7"
- style="fill:url(#linearGradient81258);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.90000004;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- sodipodi:nodetypes="ccc"
- id="path41159-4"
- d="m 281.45064,253.1653 0.0312,-9.6861 3.81301,0.0312"
- style="fill:none;stroke:url(#linearGradient81260);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.53174594;enable-background:new"
- d="m 291.50046,246.74298 -3.08218,7.80871"
- id="path15817-5"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.48809521"
- d="m 285.63278,246.41513 -3.2942,8.11179"
- id="path15817"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#555555;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 286.48189,242.32295 0.0625,12.09375"
- id="path15730"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;enable-background:new"
- id="rect16285-9-59"
- width="2.0172396"
- height="2.0000157"
- x="279.45065"
- y="241.47917" />
- <path
- sodipodi:nodetypes="ccc"
- id="path41159-4-9"
- d="m 287.42759,252.9156 -0.0313,-9.49861 3.85989,0.0312"
- style="display:inline;fill:none;stroke:url(#linearGradient81262);stroke-width:0.99999982px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#1b4685;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 292.04439,242.6042 -5.18214,13.04504"
- id="path15722"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#1b4685;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 286.07564,242.5417 -5.19822,12.90441"
- id="path15726"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <rect
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;enable-background:new"
- id="rect16285-9-1"
- width="2.0172396"
- height="2.0000157"
- x="285.47092"
- y="241.53545" />
- <rect
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;enable-background:new"
- id="rect16285-9-50"
- width="2.0172396"
- height="2.0000157"
- x="285.47092"
- y="254.48941" />
- <rect
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;enable-background:new"
- id="rect16285-9-6"
- width="2.0172396"
- height="2.0000157"
- x="291.48386"
- y="254.48941" />
- <rect
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;enable-background:new"
- id="rect16285-9-16"
- width="2.0172396"
- height="2.0000157"
- x="291.45065"
- y="241.47917" />
- <rect
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;enable-background:new"
- id="rect16285-9-15"
- width="2.0172396"
- height="2.0000157"
- x="279.48859"
- y="254.48941" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MOD_OCEAN">
- <rect
- y="241"
- x="215"
- height="16"
- width="16"
- id="rect18695-5-85"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g16254">
- <path
- sodipodi:nodetypes="ccccccccccccccccscsscccscscccsccc"
- inkscape:connector-curvature="0"
- id="path15496"
- d="m 220.26315,246.13546 c -0.0862,0.1378 -0.24068,0.22975 -0.40625,0.28125 -1.65981,0.47731 -3.15715,1.19818 -4.5,2.59375 -0.0159,0.0174 -0.0268,0.0393 -0.0312,0.0625 -0.001,0.0103 -0.001,0.0208 0,0.0312 -0.001,0.0103 -0.001,0.0208 0,0.0312 -0.001,0.0104 -0.001,0.0208 0,0.0312 0.0905,0.15733 0.21244,0.52956 0.25,0.8125 0.0551,0.41528 -0.0701,0.57924 -0.21875,0.8125 -0.0121,0.008 -0.0227,0.0191 -0.0312,0.0312 -0.001,0.0104 -0.001,0.0208 0,0.0312 -0.001,0.0103 -0.001,0.0208 0,0.0312 -0.001,0.0104 -0.001,0.0208 0,0.0312 0.008,0.0121 0.0191,0.0227 0.0312,0.0312 1.14704,1.20048 2.82583,2.11181 4.34375,2.15625 0.23229,0.01 0.47603,0.12502 0.59375,0.3125 0.16075,0.25148 0.43475,0.47431 0.75,0.65625 0.36481,0.21054 0.91885,0.30403 1.0936,0.3126 -0.22349,-0.50587 -0.17899,-0.77088 -0.0469,-0.99985 0.0995,-0.17241 0.27563,-0.29702 0.54688,-0.34375 1.23062,-0.212 2.86055,-0.63055 4.03125,-1.34375 0.29545,-0.18247 0.80307,-0.0462 1,0.25 0.55094,0.7385 1.45946,1.2674 2.03896,1.31646 -0.36853,-0.9196 -0.50376,-2.31287 -0.46489,-3.25371 0.0492,-1.1901 0.4842,-2.52395 1.04302,-3.51538 -0.16982,0.006 -0.65061,0.17808 -0.71074,0.20318 -0.7366,0.30737 -1.4716,0.94031 -1.90625,1.5625 -0.21933,0.29875 -0.71618,0.4032 -1,0.1875 -1.35724,-1.03154 -2.55364,-1.6969 -4.09375,-2.1875 -0.26943,-0.0858 -0.50165,-0.42209 -0.5,-0.71875 0.002,-0.30009 0.0702,-0.84684 0.12109,-1.07402 -0.58853,0.18102 -1.36128,0.81203 -1.93359,1.66737 z"
- style="display:inline;fill:none;stroke:url(#linearGradient38716-8);stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;enable-background:new" />
- <path
- style="display:inline;fill:url(#radialGradient15517-8);fill-opacity:1;stroke:#0b1728;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 219.6786,253.82631 c -1.96642,-0.0576 -4.05614,-1.31113 -5.29929,-2.86623 0.0654,-0.19861 0.53326,-0.60538 0.48122,-0.99782 -0.0595,-0.44857 -0.37333,-0.70398 -0.47362,-0.96241 1.5443,-1.81083 3.32964,-2.734 5.24944,-3.28607 0.78991,-1.17883 1.845,-2.02236 3.60073,-2.29898 -0.23142,0.67492 -0.40517,1.48328 -0.41544,2.14499 1.60855,0.52209 2.84544,1.19775 4.24601,2.26976 1.05365,-1.50823 3.37131,-2.56597 4.4316,-1.95202 -0.84375,1.27451 -1.45665,2.90118 -1.50672,4.17975 -0.0491,1.25211 0.0947,2.42706 0.75517,3.90477 -1.30024,0.35961 -2.91498,-0.40691 -3.71178,-1.61649 -1.31489,0.80105 -3.03198,1.22409 -4.31307,1.42108 0.13331,0.35326 0.31382,0.79794 0.42375,1.41797 -1.5092,0.0506 -2.82758,-0.35645 -3.468,-1.3583 z"
- id="path26202"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccsccccccsccccc" />
- <path
- inkscape:connector-curvature="0"
- id="path38361"
- d="m 218.00011,250.69439 c -0.39287,0 -0.71132,-0.31189 -0.71132,-0.69657 0,-0.38468 0.31845,-0.69659 0.71132,-0.69659 0.39025,0 0.70763,0.30797 0.71128,0.69334 0,0.38793 -0.31844,0.69982 -0.71128,0.69982 z"
- style="display:inline;fill:none;stroke:url(#linearGradient15553-4);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.72222218;enable-background:new" />
- <path
- style="display:inline;fill:none;stroke:#183e75;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 217.62649,250.02159 c -0.17675,0 -0.32002,-0.1385 -0.32002,-0.30932 0,-0.17083 0.14327,-0.30933 0.32002,-0.30933 0.17557,0 0.31836,0.13676 0.32,0.30789 0,0.17226 -0.14327,0.31076 -0.32,0.31076 z"
- id="path26221"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient15545-5);stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.58823529;enable-background:new"
- d="m 219.95124,248.20112 c 0.63267,0.99518 0.82685,2.28773 0.0962,3.39254"
- id="path26223-2"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- transform="translate(-0.04936017,-0.02079917)"
- sodipodi:type="inkscape:offset"
- inkscape:radius="-0.21185222"
- inkscape:original="M 222.25 244.5 C 221.66147 244.68102 220.88481 245.30091 220.3125 246.15625 C 220.2263 246.29405 220.07182 246.386 219.90625 246.4375 C 218.24644 246.91481 216.7491 247.63568 215.40625 249.03125 C 215.39035 249.04865 215.3794 249.07055 215.375 249.09375 C 215.374 249.10405 215.374 249.1146 215.375 249.125 C 215.374 249.1353 215.374 249.14585 215.375 249.15625 C 215.374 249.16665 215.374 249.1771 215.375 249.1875 C 215.4655 249.34483 215.58744 249.71706 215.625 250 C 215.6801 250.41528 215.5549 250.57924 215.40625 250.8125 C 215.39415 250.8205 215.3835 250.83165 215.375 250.84375 C 215.374 250.85415 215.374 250.8646 215.375 250.875 C 215.374 250.8853 215.374 250.89585 215.375 250.90625 C 215.374 250.91665 215.374 250.9271 215.375 250.9375 C 215.383 250.9496 215.39415 250.96025 215.40625 250.96875 C 216.55329 252.16923 218.23208 253.08056 219.75 253.125 C 219.98229 253.135 220.22603 253.25002 220.34375 253.4375 C 220.5045 253.68898 220.7785 253.91181 221.09375 254.09375 C 221.45856 254.30429 222.01275 254.39768 222.1875 254.40625 C 221.96401 253.90038 221.99291 253.63522 222.125 253.40625 C 222.2245 253.23384 222.41625 253.10923 222.6875 253.0625 C 223.91812 252.8505 225.54805 252.43195 226.71875 251.71875 C 227.0142 251.53628 227.52182 251.67255 227.71875 251.96875 C 228.26969 252.70725 229.1705 253.23219 229.75 253.28125 C 229.38147 252.36165 229.24238 250.97209 229.28125 250.03125 C 229.33045 248.84115 229.78493 247.52268 230.34375 246.53125 C 230.17393 246.53725 229.68513 246.69365 229.625 246.71875 C 228.8884 247.02612 228.1534 247.65906 227.71875 248.28125 C 227.49942 248.58 227.00257 248.68445 226.71875 248.46875 C 225.36151 247.43721 224.16511 246.77185 222.625 246.28125 C 222.35557 246.19545 222.12335 245.85916 222.125 245.5625 C 222.127 245.26241 222.19911 244.72718 222.25 244.5 z "
- style="display:inline;fill:none;stroke:url(#linearGradient15502-8);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- id="path15500"
- d="m 221.99219,244.89453 c -0.48081,0.25143 -1.05272,0.70459 -1.50391,1.37891 -0.1243,0.19528 -0.323,0.30606 -0.51953,0.36718 a 0.21187341,0.21187341 0 0 1 -0.004,0 c -1.62663,0.46778 -3.07243,1.165 -4.3789,2.51172 a 0.21187341,0.21187341 0 0 1 0,0.0156 c 2.4e-4,4.8e-4 -2.4e-4,0.001 0,0.002 0.10739,0.21531 0.21192,0.51593 0.25,0.80274 0.0572,0.43102 -0.087,0.68286 -0.22266,0.89843 1.11163,1.13885 2.7262,2.00151 4.14258,2.04297 a 0.21187341,0.21187341 0 0 1 0.004,0 c 0.29519,0.0127 0.59455,0.14505 0.76171,0.41016 0.1325,0.20728 0.38132,0.41486 0.67774,0.58594 0.20099,0.11599 0.4748,0.18501 0.70117,0.23046 -0.0285,-0.10911 -0.0873,-0.2363 -0.0898,-0.33203 -0.005,-0.19697 0.0505,-0.36846 0.13086,-0.50781 0.13631,-0.23619 0.39405,-0.39267 0.71093,-0.44726 1.21472,-0.20926 2.82764,-0.62833 3.95508,-1.31446 0.21394,-0.13212 0.46981,-0.13935 0.70117,-0.0801 0.23137,0.0593 0.4493,0.18707 0.58594,0.39258 l -0.006,-0.01 c 0.41259,0.55304 1.06147,0.97172 1.54883,1.14062 -0.29084,-0.9342 -0.40252,-2.1037 -0.36719,-2.95898 0.0452,-1.09376 0.43665,-2.23615 0.91797,-3.19727 -0.14011,0.0408 -0.29451,0.0934 -0.28125,0.0879 -0.68743,0.28686 -1.40539,0.90272 -1.81445,1.48828 a 0.21187341,0.21187341 0 0 1 -0.004,0.004 c -0.14785,0.2014 -0.37134,0.32348 -0.60547,0.36914 -0.23412,0.0457 -0.49092,0.0152 -0.69336,-0.13867 -1.34443,-1.02181 -2.51173,-1.67088 -4.02929,-2.1543 -0.1942,-0.0618 -0.34791,-0.19846 -0.46094,-0.36133 -0.11303,-0.16286 -0.18668,-0.35649 -0.18555,-0.56054 0.001,-0.1999 0.0451,-0.42881 0.0781,-0.66602 z" />
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient15537-5);stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 220.40065,247.42921 c 1.3319,1.37892 1.29257,3.57882 0.34306,4.70903"
- id="path26223-2-7"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- </g>
- </g>
- <g
- id="ICON_MOD_SMOOTH">
- <g
- id="g23516"
- transform="translate(-0.9999998,2.020123)"
- style="display:inline;enable-background:new">
- <rect
- y="260"
- x="489"
- height="16"
- width="16"
- id="rect23518"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.29999995;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path23520"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 499.5,261.50004 -4.5,2 c -1.94148,0.86288 -2.18285,2.53884 -3,4.5 l -1.25,3"
- sodipodi:nodetypes="cssc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#0b1728;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 503,268.00008 v 2.99996 l -3,1.5 c -3,1.5 -6.25,1.5 -10,1.49996 v -2.49996 c 0.5,-0.99996 1.75,-2.75004 5,-4.00004 l 4,-1.5 h 1 l 3,1.25 z"
- id="path23522"
- sodipodi:nodetypes="cccccccccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="cccccccccc"
- style="display:inline;fill:#c2d4ef;fill-opacity:1;fill-rule:evenodd;stroke:none;enable-background:new"
- d="m 495,267.5 4,-1.5 h 1 l 3,1.25 v 0.75004 2.75 l -3,1.5 -10,1.5 v -1.75 c 0.5,-1 1.77456,-3.24182 5,-4.50004 z"
- id="path23524" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- d="m 496.75,263.00004 c -3,1.5 -2.75,8.5 2.25,7"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23555);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path23542" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccsccsccsccc"
- id="path23526"
- transform="translate(-20)"
- d="m 519.82031,262 c 0.5,-0.16016 0.35115,-1.44373 -0.66015,-1 l -3.91016,1.75 c -2.5,0.75 -2.85099,2.90496 -3.82813,5.08203 L 510,271 v 3 c 3.76795,10e-6 7,0 10,-1.5 0.59071,-0.29535 2.31945,-1.15973 3,-1.5 v -3 c -0.71506,0.35798 -2.3836,1.1918 -3,1.5 -0.45529,0.22765 -0.90706,0.42996 -1.375,0.59375 -4.60397,1.02313 -4.54405,-5.38421 -1.625,-6.84375 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient23581);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89207077px;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="csc"
- id="path23528"
- d="m 490.5,273.51739 c 3.76795,0 5.75,-4e-5 8.75,-1.25004 0.60963,-0.25401 2.56945,-1.15973 3.25,-1.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23550);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- y="267"
- x="497"
- height="1"
- width="2"
- id="rect23530"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate" />
- <g
- style="fill:#000000"
- id="g23575">
- <rect
- y="268"
- x="497"
- height="1"
- width="2"
- id="rect23532"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:#162d50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#162d50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate"
- id="rect23534"
- width="1"
- height="1.5"
- x="496"
- y="267" />
- <rect
- y="267"
- x="499"
- height="1.5"
- width="1"
- id="rect23536"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#162d50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#162d50;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate"
- id="rect23538"
- width="2"
- height="0.5"
- x="497"
- y="266.5" />
- </g>
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient23585);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 490.5,272.5 c 3.76795,0 5.75,-4e-5 8.75,-1.25004 0.60963,-0.25401 2.56945,-1.15973 3.25,-1.5"
- id="path23540"
- sodipodi:nodetypes="csc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccssc"
- d="m 499.5,261.50004 -3.07779,1.36791 L 495,263.50004 c -1.94148,0.86288 -2.18285,2.53884 -3,4.5 l -1.25,3"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:none;stroke:#ffffff;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path23546" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#292929;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.29999995;marker:none;enable-background:accumulate"
- id="rect23518-8"
- width="16"
- height="16"
- x="488"
- y="262" />
- <g
- id="g16579">
- <rect
- y="268.95908"
- x="495.95065"
- height="1"
- width="2"
- id="rect23532-1-0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:#1e56ab;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:none;stroke:#0b1728;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 501.95064,269.22921 v 0.75008 2.99996 l -3,1.5 c -3,1.5 -6.25,1.5 -10,1.49996 l -0.0183,-2.52715 c 0,0 3.366,-6.98108 4.33827,-8.04174 0.97227,-1.06066 4.00392,-2.08028 4.61579,-2.33915 3.72167,-0.006 4.09599,4.72641 4.06425,6.15804 z m -8,0.25 4.90625,-1.875 c 0.0715,-1.36645 -0.67378,-2.97927 -2.03429,-3.23624"
- id="path23522-5"
- sodipodi:nodetypes="scccccsccsccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="cccccccccc"
- style="display:inline;fill:#c2d4ef;fill-opacity:1;fill-rule:evenodd;stroke:none;enable-background:new"
- d="m 493.95064,269.47921 4,-1.5 0.9375,-0.40625 3.0625,1.65625 v 0.75004 2.75 l -3,1.5 -10,1.5 v -1.75 c 0.5,-1 1.77456,-3.24182 5,-4.50004 z"
- id="path23524-5" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="csc"
- d="m 495.70064,264.97925 c -1.59411,1.20331 -2.85352,5.00657 -1.83419,6.55562 0.84654,1.28647 2.26188,0.99107 4.08419,0.44438"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient18618);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path23542-7" />
- <path
- id="path14759-8"
- d="m 497.43868,264.59926 c 0.80576,0.30416 1.37557,1.03323 1.48798,2.92233 l 3.02398,2.65977 c -0.14914,-2.63927 0.0915,-5.8212 -3.12879,-7.01803 -0.39922,-0.14837 -1.04358,-0.0621 -1.33996,0.0614 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient18620);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89207077px;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cssccsccscsscc"
- id="path23526-4"
- d="m 497.47415,263.23002 c -0.0305,0.0127 -2.69071,1.0899 -3.08515,1.28834 -0.97345,0.48973 -2.73962,3.32869 -3.70177,5.33135 l -1.74953,3.64155 0.013,2.49908 c 3.76795,10e-6 7,0 10,-1.5 l 3,-1.5 v -3 c -0.71506,0.35798 -2.3836,1.1918 -3,1.5 -0.45529,0.22765 -0.90706,0.42996 -1.375,0.59375 -1.77534,0.39453 -3.51362,0.44764 -3.974,-0.67129 -0.58429,-1.42008 0.52872,-4.89528 2.24297,-6.11564 0.23077,-0.16428 1.56009,-0.67849 1.59569,-0.69629 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient18622);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89207077px;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="csc"
- id="path23528-6"
- d="m 489.45064,275.4966 c 3.76795,0 5.75,-4e-5 8.75,-1.25004 0.60963,-0.25401 2.56945,-1.15973 3.25,-1.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient18624);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient18626);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 489.45064,274.47921 c 3.76795,0 5.75,-4e-5 8.75,-1.25004 0.60963,-0.25401 2.56945,-1.15973 3.25,-1.5"
- id="path23540-9"
- sodipodi:nodetypes="csc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="csscsc"
- d="m 489.67253,273.44041 2.07721,-4.14016 c 0.98497,-1.9632 2.11086,-3.89476 3.15802,-4.3308 l 2.83577,-1.18084 c 0.92808,-0.35355 2.39677,0.78516 2.88291,1.66904 0.48613,0.88389 0.68121,2.03922 0.85799,4.29312"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:none;stroke:url(#linearGradient18628);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path23546-3" />
- <path
- style="fill:#ffffff;fill-opacity:1;stroke:#1b4685;stroke-width:0.80000001;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1"
- d="m 497.15108,270.57068 c -0.87852,0.21783 -1.75,-0.0997 -1.75,-0.67783 0,-0.57817 0.44856,-1.11322 1.32701,-1.33132 0.77415,-0.19217 1.49604,0.10015 1.66916,0.65891 0.16722,0.53968 -0.3266,1.12224 -1.24617,1.35024 z"
- id="path27309-9"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="sssss" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.37383178"
- d="m 492.06936,275.51839 0.98651,-0.0593"
- id="path27317-2"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_SOLO_OFF">
- <rect
- y="198.9792"
- x="4.9506397"
- height="16"
- width="16"
- id="rect23018-5-4"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(0.94058502,0,0,0.94058502,0.9128606,12.74924)"
- id="g56716">
- <path
- sodipodi:type="star"
- style="fill:url(#linearGradient14951);fill-opacity:1;stroke:#000000;stroke-width:0.96882826;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path15855"
- sodipodi:sides="5"
- sodipodi:cx="13.700194"
- sodipodi:cy="207.20645"
- sodipodi:r1="7.1873641"
- sodipodi:r2="3.3158474"
- sodipodi:arg1="0.94697287"
- sodipodi:arg2="1.5618338"
- inkscape:flatsided="false"
- inkscape:rounded="0"
- inkscape:randomized="0"
- d="m 17.898641,213.04008 -4.168729,-2.51791 -4.280439,2.47993 1.106473,-4.74277 -3.6812884,-3.3046 4.8525664,-0.41328 2.005278,-4.52229 1.892578,4.48735 4.920618,0.50967 -3.682889,3.18662 z"
- inkscape:transform-center-x="-0.010954063"
- inkscape:transform-center-y="-0.74285516"
- transform="matrix(1.0972098,0,0,1.0975406,-2.0923019,-19.740595)" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.06316817;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 12.931855,202.51514 -1.201334,2.70994 c -0.137665,0.32193 -0.454082,0.55986 -0.800889,0.60222 l -2.9032248,0.26765 2.2358168,1.97391 c 0.261321,0.2395 0.380487,0.62447 0.300333,0.97022 l -0.667408,2.81032"
- id="path15869"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc" />
- </g>
- </g>
- <g
- transform="translate(-0.04936017,-0.02079917)"
- style="display:inline;enable-background:new"
- id="ICON_FRAME_NEXT">
- <rect
- y="199"
- x="68"
- height="16"
- width="16"
- id="rect23008-0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="display:inline"
- transform="translate(-129.04638,24.90625)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g11015-1">
- <path
- style="fill:url(#linearGradient15744-9-8);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 205.54638,177.59375 h -1 v 9 h 1 l 5,-3.75 v -1.5 z"
- id="path11017-5"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path11019-7"
- d="m 205.54638,185.34375 v -6.5 l 4.03125,3.01562"
- style="fill:none;stroke:url(#linearGradient10982-8-5);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- transform="matrix(0,1,1,0,0,0)"
- style="display:inline;fill:url(#linearGradient16268-9);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- id="rect10822-0-7"
- width="9.2000065"
- height="2.1999984"
- x="202.39999"
- y="71.400002"
- rx="0"
- ry="1.4168683"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- style="display:inline;fill:none;stroke:url(#linearGradient16302-5);stroke-width:1.00000012px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m 72.27078,203.33478 0.475194,-7e-5"
- id="path10824-4-2"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- <g
- transform="translate(-0.04936017,-0.02079917)"
- style="display:inline;enable-background:new"
- id="ICON_FRAME_PREV">
- <rect
- transform="scale(-1,1)"
- y="198.89999"
- x="-62.900002"
- height="16"
- width="16"
- id="rect23008-0-8"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- style="display:inline;enable-background:new"
- transform="matrix(-1,0,0,1,259.94638,24.80625)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="g11015-1-2">
- <path
- style="fill:url(#linearGradient15744-9-0-9);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 205.54638,177.59375 h -1 v 9 h 1 l 5,-3.75 v -1.5 z"
- id="path11017-5-5"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path11019-7-9"
- d="m 205.54638,178.84375 4.03125,3.01562"
- style="fill:none;stroke:url(#linearGradient10982-8-9-5);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- transform="rotate(90)"
- style="display:inline;fill:url(#linearGradient16268-5-0);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- id="rect10822-0-7-7"
- width="9.2000065"
- height="2.1999984"
- x="202.29999"
- y="-59.5"
- rx="0"
- ry="1.4168683"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- style="display:inline;fill:none;stroke:url(#linearGradient16302-3-4);stroke-width:1.00000012px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m 58.62922,203.23478 -0.475194,-7e-5"
- id="path10824-4-2-3"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_AXIS_FRONT">
- <path
- inkscape:connector-curvature="0"
- d="m 289.95065,114.97921 v 1 h 2 v 1 h 1 v -1 -1 z m 2,2 h -1 v 1 h 1 z m -1,1 h -1 v 1 1 h 3 v -1 h -2 z m -1,3 v 2 h 1 v -2 z m 1,2 v 1 h 1 v -1 z m 1,0 h 1 v -2 h -1 z m 0,1 v 2 h 1 v -2 z m -1,0 h -1 v 2 h 1 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#0027b4;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path18242" />
- <path
- inkscape:connector-curvature="0"
- id="path38437-9"
- d="m 289.95065,114.97921 v 1 h 2 v 1 h 1 v -1 -1 z m 2,2 h -1 v 1 h 1 z m -1,1 h -1 v 1 1 h 3 v -1 h -2 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path18240"
- d="m 289.95065,120.97921 v 2 h 1 v -2 z m 1,2 v 1 h 1 v -1 z m 1,0 h 1 v -2 h -1 z m 0,1 v 2 h 1 v -2 z m -1,0 h -1 v 2 h 1 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate" />
- <g
- id="g27975"
- style="display:inline;enable-background:new"
- transform="translate(-0.04936017,-0.02079917)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate"
- id="rect36400-0-73"
- width="16"
- height="16"
- x="278"
- y="115" />
- <g
- id="g36402-8-9"
- transform="translate(186.99836,-42.1)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#acc373;fill-opacity:1;fill-rule:nonzero;stroke:#5d0606;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect36426-6-8"
- width="2.0000153"
- height="2.0000069"
- x="102"
- y="170"
- rx="0"
- ry="0" />
- <g
- id="g36404-0-04"
- style="display:inline;stroke:#1a1a1a;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;enable-background:new"
- transform="translate(8.000015,151)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient27963-5);stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 85.65162,18.243282 88.999985,16"
- id="path36410-3-3"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36407-9-8"
- d="m 88.999985,8 v 8"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#00163c;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36412-3-7"
- d="M 94.99997,20 88.999985,16"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#5d0606;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc" />
- </g>
- <rect
- ry="0"
- rx="0"
- y="158"
- x="96"
- height="2.0000069"
- width="2.0000153"
- id="rect36416-1-8"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#001e50;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36418-7-2"
- d="m 97,159 v 8"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#4c8ff4;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient27965-1);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 93.15039,169.65379 3.794367,-2.66484"
- id="path36420-1-8"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36424-2-5"
- d="M 92.728285,169.42532 96.499985,166.75 96.5,159.5"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:url(#linearGradient27967-9);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36428-6-8"
- d="M 102.99998,171 97,167"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ef4e29;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:#001e50;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect36432-1-2"
- width="2.0000153"
- height="2.0000069"
- x="96"
- y="158"
- rx="0"
- ry="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#4c8ff4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.3499999;marker:none;enable-background:accumulate"
- id="rect36434-5-5"
- width="2"
- height="2"
- x="96.000023"
- y="158"
- rx="0"
- ry="0" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(1.3333333,0,0,1.3333343,3,147.66665)"
- id="path36436-4-6"
- style="display:inline;opacity:0.5;fill:url(#radialGradient27969-8);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- cx="70.5"
- cy="14.5"
- r="1.5" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path36438-7-62"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- transform="matrix(0.6666679,0,0,0.6666668,49.999915,157.33333)"
- cx="70.5"
- cy="14.5"
- r="1.5" />
- <rect
- ry="0"
- rx="0"
- y="170"
- x="102"
- height="2.0000069"
- width="2.0000153"
- id="rect36440-7-5"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#acc373;fill-opacity:1;fill-rule:nonzero;stroke:#5d0606;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- ry="0"
- rx="0"
- y="170"
- x="102.00002"
- height="2"
- width="2"
- id="rect36442-2-0"
- style="display:inline;overflow:visible;visibility:visible;fill:#eb512e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.3499999;marker:none;enable-background:accumulate" />
- <g
- style="opacity:0.8"
- id="g36444-2-2">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient27971-9);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 96.5,159.5 v -1 h 1"
- id="path36446-6-0"
- sodipodi:nodetypes="ccc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:none;stroke:url(#linearGradient27973-6);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 102.49999,171.5 v -1 h 1"
- id="path36450-1-8"
- sodipodi:nodetypes="ccc" />
- </g>
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_AXIS_SIDE">
- <g
- transform="translate(-0.04936017,-1.0207992)"
- id="g18315"
- style="display:inline;enable-background:new">
- <path
- inkscape:connector-curvature="0"
- id="path18244-7"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#45eb0a;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 269,122 v 2.25 h 1 V 127 h 1 v -2.75 h 1 V 122 h -1 v 2 h -1 v -2 z m 0,-6 v 1 h 2 v 1 h 1 v -1 -1 z m 2,2 h -1 v 1 h 1 z m -1,1 h -1 v 1 1 h 3 v -1 h -2 z" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 269,116 v 1 h 2 v 1 h 1 v -1 -1 z m 2,2 h -1 v 1 h 1 z m -1,1 h -1 v 1 1 h 3 v -1 h -2 z"
- id="path38437-9-2"
- inkscape:connector-curvature="0" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 269,122 v 2.25 h 1 V 127 h 1 v -2.75 h 1 V 122 h -1 v 2 h -1 v -2 z"
- id="path38435-3-8-1"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="114.97919"
- x="256.95062"
- height="16"
- width="16"
- id="rect36400-0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-2.0730802,-0.12079917)"
- id="g17954"
- style="display:inline;enable-background:new">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17973-0);stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 261.67372,127.26538 3.34836,-2.24328"
- id="path36410-3-3-7"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36407-9"
- d="m 264.99997,117 v 8"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#00163c;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36412-3"
- d="m 270.99996,129 -5.99999,-4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#183c00;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36420-1-8-8"
- d="m 261.17248,127.67589 3.79437,-2.66484"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17975-1);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#001e50;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect36416-1"
- width="2.0000153"
- height="2.0000069"
- x="263.99997"
- y="116"
- rx="0"
- ry="0" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#4c8ff4;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 264.99998,117 v 8"
- id="path36418-7"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:url(#linearGradient17977-8);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 260.75037,127.44742 3.7717,-2.67532 2e-5,-7.25"
- id="path36424-2-5-6"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- ry="0"
- rx="0"
- y="128"
- x="269.99997"
- height="2.0000069"
- width="2.0000153"
- id="rect36426-6"
- style="display:inline;overflow:visible;visibility:visible;fill:#acc373;fill-opacity:1;fill-rule:nonzero;stroke:#183c00;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#4ee420;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 270.99996,129 -5.99998,-4"
- id="path36428-6"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- ry="0"
- rx="0"
- y="116"
- x="263.99997"
- height="2.0000069"
- width="2.0000153"
- id="rect36432-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:#001e50;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- ry="0"
- rx="0"
- y="116"
- x="264"
- height="2"
- width="2"
- id="rect36434-5"
- style="display:inline;overflow:visible;visibility:visible;fill:#4c8ff4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.3499999;marker:none;enable-background:accumulate" />
- <circle
- style="display:inline;opacity:0.5;fill:url(#radialGradient17979-7);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- id="path36436-4"
- transform="matrix(1.3333333,0,0,1.3333343,170.99998,105.66665)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="70.5"
- cy="14.5"
- r="1.5" />
- <circle
- transform="matrix(0.6666679,0,0,0.6666668,217.99989,115.33333)"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- id="path36438-7"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="70.5"
- cy="14.5"
- r="1.5" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#acc373;fill-opacity:1;fill-rule:nonzero;stroke:#183c00;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect36440-7"
- width="2.0000153"
- height="2.0000069"
- x="269.99997"
- y="128"
- rx="0"
- ry="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#4ee51f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.3499999;marker:none;enable-background:accumulate"
- id="rect36442-2"
- width="2"
- height="2"
- x="270"
- y="128"
- rx="0"
- ry="0" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:none;stroke:url(#linearGradient17981-0);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 264.49998,117.5 v -1 h 1"
- id="path36446-6"
- sodipodi:nodetypes="ccc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.72000002;fill:none;stroke:url(#linearGradient17983-9);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 270.49997,129.5 v -1 h 1"
- id="path36450-1"
- sodipodi:nodetypes="ccc" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_AXIS_TOP">
- <g
- transform="translate(-0.04936017,-1.0207992)"
- id="g18312"
- style="display:inline;enable-background:new">
- <path
- inkscape:connector-curvature="0"
- id="path11174-1-9"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#f82516;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 311,122 v 2 h 1 v -2 z m 1,2 v 1 h 1 v -1 z m 1,0 h 1 v -2 h -1 z m 0,1 v 2 h 1 v -2 z m -1,0 h -1 v 2 h 1 z m -1,-9 v 2.25 h 1 V 121 h 1 v -2.75 h 1 V 116 h -1 v 2 h -1 v -2 z" />
- </g>
- <rect
- y="114.97919"
- x="298.95062"
- height="16"
- width="16"
- id="rect36400-0-73-7"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.79999995;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path38435-3-8"
- d="m 310.95065,114.97921 v 2.25 h 1 v 2.75 h 1 v -2.75 h 1 v -2.25 h -1 v 2 h -1 v -2 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path18240-3"
- d="m 310.95065,120.97921 v 2 h 1 v -2 z m 1,2 v 1 h 1 v -1 z m 1,0 h 1 v -2 h -1 z m 0,1 v 2 h 1 v -2 z m -1,0 h -1 v 2 h 1 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate" />
- <g
- transform="translate(0.95063983,-0.12079917)"
- id="g27760"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#183c00;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect36416-1-8-5"
- width="2.0000153"
- height="2.0000069"
- x="302.98999"
- y="116"
- rx="0"
- ry="0" />
- <rect
- ry="0"
- rx="0"
- y="128"
- x="308.98999"
- height="2.0000069"
- width="2.0000153"
- id="rect36426-6-8-0"
- style="display:inline;overflow:visible;visibility:visible;fill:#acc373;fill-opacity:1;fill-rule:nonzero;stroke:#5d0606;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36410-3-3-7-4"
- d="m 300.65,127.2387 3.34836,-2.24328"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient27998-5);stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36407-9-8-3"
- d="m 303.98998,117 v 8"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#183c00;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient28000-5);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 300.14876,127.64921 3.79437,-2.66484"
- id="path36420-1-8-8-6"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36412-3-7-3"
- d="m 309.98997,129 -5.99999,-4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#5d0606;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cc" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#4ee420;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 303.98999,117 v 8"
- id="path36418-7-2-5"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path36424-2-5-6-9"
- d="m 299.72665,127.42074 3.7717,-2.67532 2e-5,-7.25"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:url(#linearGradient28002-1);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccc" />
- <path
- sodipodi:nodetypes="cc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ef4e29;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 309.98997,129 -5.99998,-4"
- id="path36428-6-8-8"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- ry="0"
- rx="0"
- y="116"
- x="302.98999"
- height="2.0000069"
- width="2.0000153"
- id="rect36432-1-2-2"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:#183c00;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- ry="0"
- rx="0"
- y="116"
- x="302.99002"
- height="2"
- width="2"
- id="rect36434-5-5-9"
- style="display:inline;overflow:visible;visibility:visible;fill:#4ee51f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.3499999;marker:none;enable-background:accumulate" />
- <circle
- style="display:inline;opacity:0.5;fill:url(#radialGradient28004-7);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- id="path36436-4-6-0"
- transform="matrix(1.3333333,0,0,1.3333343,209.98999,105.66665)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="70.5"
- cy="14.5"
- r="1.5" />
- <circle
- transform="matrix(0.6666679,0,0,0.6666668,256.9899,115.33333)"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- id="path36438-7-62-3"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="70.5"
- cy="14.5"
- r="1.5" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#acc373;fill-opacity:1;fill-rule:nonzero;stroke:#5d0606;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect36440-7-5-9"
- width="2.0000153"
- height="2.0000069"
- x="308.98999"
- y="128"
- rx="0"
- ry="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#eb512e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.3499999;marker:none;enable-background:accumulate"
- id="rect36442-2-0-6"
- width="2"
- height="2"
- x="308.99002"
- y="128"
- rx="0"
- ry="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path36446-6-0-8"
- d="m 303.5,117.51562 v -1 h 1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.8;fill:none;stroke:url(#linearGradient28006-8);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path36450-1-8-0"
- d="m 309.47793,129.48277 v -1 h 1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:none;stroke:url(#linearGradient28008-2);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(21.04936,0.02079773)"
- style="display:inline;enable-background:new"
- id="ICON_SOLO_ON">
- <rect
- y="198.9792"
- x="4.9506397"
- height="16"
- width="16"
- id="rect23018-5-4-4"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(0.94058502,0,0,0.94058502,0.9128606,12.74924)"
- id="g56716-9">
- <path
- sodipodi:type="star"
- style="fill:url(#linearGradient14951-4);fill-opacity:1;stroke:#341b00;stroke-width:0.96882826;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path15855-2"
- sodipodi:sides="5"
- sodipodi:cx="13.700194"
- sodipodi:cy="207.20645"
- sodipodi:r1="7.1873641"
- sodipodi:r2="3.3158474"
- sodipodi:arg1="0.94697287"
- sodipodi:arg2="1.5618338"
- inkscape:flatsided="false"
- inkscape:rounded="0"
- inkscape:randomized="0"
- d="m 17.898641,213.04008 -4.168729,-2.51791 -4.280439,2.47993 1.106473,-4.74277 -3.6812884,-3.3046 4.8525664,-0.41328 2.005278,-4.52229 1.892578,4.48735 4.920618,0.50967 -3.682889,3.18662 z"
- inkscape:transform-center-x="-0.010954063"
- inkscape:transform-center-y="-0.74285516"
- transform="matrix(1.0972098,0,0,1.0975406,-2.0923019,-19.740595)" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.06316817;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 12.931855,202.51514 -1.201334,2.70994 c -0.137665,0.32193 -0.454082,0.55986 -0.800889,0.60222 l -2.9032248,0.26765 2.2358168,1.97391 c 0.261321,0.2395 0.380487,0.62447 0.300333,0.97022 l -0.667408,2.81032"
- id="path15869-5"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc" />
- </g>
- </g>
- <g
- transform="translate(189,-229)"
- id="ICON_MUTE_IPO_OFF"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect22902-0"
- width="16"
- height="16"
- x="257"
- y="449" />
- <g
- transform="translate(14.081669,359)"
- id="g22904-5"
- style="opacity:0.6;stroke:#162d50">
- <path
- style="opacity:0.9;fill:none;stroke:#2d3239;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 253.41833,95.5 c 1.5,1.5 1.5,3.5 0,5"
- id="path22906-2"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:none;stroke:#2d3239;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 255.41833,93.5 c 2.75,2.75 2.75,6.25 0,9"
- id="path22908-5"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="opacity:0.9;fill:none;stroke:#e4e9f0;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 267.5,454.5 c 1.5,1.5 1.5,3.5 0,5"
- id="path22910-1"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccc"
- style="display:inline;fill:url(#linearGradient22933-6);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 264.58167,451.5 H 263.5 l -3,3 c 0,-0.554 -0.446,-1 -1,-1 h -1 c -0.554,0 -1,0.446 -1,1 v 5 c 0,0.554 0.446,1 1,1 h 1 c 0.554,0 1,-0.446 1,-1 l 3,3 h 1.08167 z"
- id="path22912-6"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient22935-6);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 258.5,459.5 h 1 l 1,-1 3.25,3"
- id="path22914-3"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- id="path22916-2"
- d="m 260.5,454.5 v 4.9091"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient22937-4);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path22918-7"
- d="m 258.5,455.5 h 1"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 262.59506,453.5 1,-1"
- id="path22920-0"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 258.5,454.63598 h 1"
- id="path22922-0"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path22924-2"
- d="m 262.59506,454.5 1,-1"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path22926-3"
- d="m 269.5,452.5 c 2.75,2.75 2.75,6.25 0,9"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:none;stroke:#e4e9f0;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient22939-8);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 263.5,452.5 v 9"
- id="path22928-8"
- inkscape:connector-curvature="0" />
- <path
- id="path22931-5"
- d="m 258.5,454.3 v 5.4"
- style="fill:none;stroke:url(#linearGradient17039);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(210,-229)"
- id="ICON_MUTE_IPO_ON"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect22902-0-6"
- width="16"
- height="16"
- x="257"
- y="449" />
- <g
- transform="translate(14.081669,359)"
- id="g22904-5-2"
- style="opacity:0.6;stroke:#162d50" />
- <path
- sodipodi:nodetypes="ccccccccccccc"
- style="display:inline;fill:url(#linearGradient22933-6-8);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 264.58167,451.5 H 263.5 l -3,3 c 0,-0.554 -0.446,-1 -1,-1 h -1 c -0.554,0 -1,0.446 -1,1 v 5 c 0,0.554 0.446,1 1,1 h 1 c 0.554,0 1,-0.446 1,-1 l 3,3 h 1.08167 z"
- id="path22912-6-4"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient22935-6-2);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 258.5,459.5 h 1 l 1,-1 3.25,3"
- id="path22914-3-7"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- id="path22916-2-2"
- d="m 260.5,454.5 v 4.9091"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient22937-4-1);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path22918-7-7"
- d="m 258.5,455.5 h 1"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 262.59506,453.5 1,-1"
- id="path22920-0-4"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 258.5,454.63598 h 1"
- id="path22922-0-2"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path22924-2-7"
- d="m 262.59506,454.5 1,-1"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient22939-8-6);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 263.5,452.5 v 9"
- id="path22928-8-6"
- inkscape:connector-curvature="0" />
- <path
- id="path22931-5-7"
- d="m 258.5,454.3 v 5.4"
- style="fill:none;stroke:url(#linearGradient17172);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-42,-40)"
- id="ICON_OUTLINER_DATA_SPEAKER"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect22902-0-4"
- width="16"
- height="16"
- x="257"
- y="449" />
- <g
- transform="translate(14.081669,359)"
- id="g22904-5-8"
- style="opacity:0.6;stroke:#162d50">
- <path
- style="opacity:0.9;fill:none;stroke:#333333;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 253.41833,95.5 c 1.5,1.5 1.5,3.5 0,5"
- id="path22906-2-2"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.9;fill:none;stroke:#333333;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 255.41833,93.5 c 2.75,2.75 2.75,6.25 0,9"
- id="path22908-5-8"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="opacity:0.9;fill:none;stroke:#eaeaea;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 267.5,454.5 c 1.5,1.5 1.5,3.5 0,5"
- id="path22910-1-6"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccc"
- style="display:inline;opacity:0.8;fill:url(#linearGradient22933-6-87);fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 264.58167,451.5 H 263.5 l -3,3 c 0,-0.554 -0.446,-1 -1,-1 h -1 c -0.554,0 -1,0.446 -1,1 v 5 c 0,0.554 0.446,1 1,1 h 1 c 0.554,0 1,-0.446 1,-1 l 3,3 h 1.08167 z"
- id="path22912-6-9"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient22935-6-22);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 258.5,459.5 h 1 l 1,-1 3.25,3"
- id="path22914-3-3"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- id="path22916-2-6"
- d="m 260.5,454.5 v 4.9091"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient22937-4-8);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- id="path22918-7-5"
- d="m 258.5,455.5 h 1"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 262.59506,453.5 1,-1"
- id="path22920-0-8"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 258.5,454.63598 h 1"
- id="path22922-0-0"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path22924-2-2"
- d="m 262.59506,454.5 1,-1"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path22926-3-1"
- d="m 269.5,452.5 c 2.75,2.75 2.75,6.25 0,9"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:none;stroke:#eaeaea;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient22939-8-3);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 263.5,452.5 v 9"
- id="path22928-8-5"
- inkscape:connector-curvature="0" />
- <path
- id="path22931-5-2"
- d="m 258.5,454.3 v 5.4"
- style="fill:none;stroke:url(#linearGradient17172-9);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_OUTLINER_OB_SPEAKER">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect22902-0-2"
- width="16"
- height="16"
- x="215"
- y="430" />
- <g
- id="g17546">
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#643200;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 227.5,433.5 c 2.75,2.75 2.75,6.25 0,9"
- id="path22908-5-0-4"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#633300;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 225.5,435.5 c 1.5,1.5 1.5,3.5 0,5"
- id="path22906-2-9-6"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- id="path22910-1-4"
- d="m 225.5,435.5 c 1.5,1.5 1.5,3.5 0,5"
- style="opacity:0.9;fill:none;stroke:url(#linearGradient17582);stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- id="path22912-6-7"
- d="M 222.58167,432.5 H 221.5 l -3,3 c 0,-0.554 -0.446,-1 -1,-1 h -1 c -0.554,0 -1,0.446 -1,1 v 5 c 0,0.554 0.446,1 1,1 h 1 c 0.554,0 1,-0.446 1,-1 l 3,3 h 1.08167 z"
- style="display:inline;fill:url(#linearGradient17584);fill-opacity:1;fill-rule:nonzero;stroke:#2b1600;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.84313725"
- sodipodi:nodetypes="ccccccccccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path22914-3-6"
- d="m 216.5,440.5 h 1 l 1,-1 3.25,3"
- style="display:inline;fill:none;stroke:url(#linearGradient17586);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="opacity:0.65263157;fill:none;stroke:url(#linearGradient17588);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 218.5,435.5 v 4.9091"
- id="path22916-2-0" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 216.5,436.5 h 1"
- id="path22918-7-2" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path22920-0-2"
- d="m 220.59506,434.5 1,-1"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- id="path22922-0-22"
- d="m 216.5,435.63598 h 1"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 220.59506,435.5 1,-1"
- id="path22924-2-9"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.9;fill:none;stroke:url(#linearGradient17590);stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 227.5,433.5 c 2.75,2.75 2.75,6.25 0,9"
- id="path22926-3-9"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- id="path22928-8-7"
- d="m 221.5,433.5 v 9"
- style="fill:none;stroke:url(#linearGradient17592);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient17594);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 216.5,435.3 v 5.4"
- id="path22931-5-72" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m 225.37642,435.40307 0.60225,0.61872"
- id="path22922-0-22-4"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cc"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m 227.40936,433.37013 0.51386,0.59663"
- id="path22922-0-22-2"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_SCREEN_BACK">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18740-5"
- width="16"
- height="16"
- x="383"
- y="597" />
- <g
- style="display:inline;enable-background:new"
- id="g18742-8"
- transform="matrix(0.78985507,0,0,0.78985507,384.77042,545.63116)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- id="rect38458-5"
- width="11.999999"
- height="9.0000172"
- x="4.9838772"
- y="70.999992" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18744-0"
- d="m 17.209985,82.052175 -1.174018,1.202898 H 5.9472104 l -1.2028894,-1.202898 -1e-7,-12.622124 H 17.22097 l -0.01099,12.622124 h -5e-6 v 0 z"
- style="fill:url(#linearGradient17715);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.01284409;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cccccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path18746-7"
- d="m 15.536259,81.328571 -6.3832127,2e-6 v -0.999998 l 6.3832127,-2e-6 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient17717);stroke-width:1.26605475px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 5.9039809,82.132474 0.025569,-11.527305 10.1868001,5.7e-5 v 11.527247 z"
- id="path18748-3"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect18750-1"
- width="1"
- height="1"
- x="6.7951851"
- y="80.356544"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- <g
- transform="matrix(0,-0.75485957,0.75485957,0,327.67313,852.33908)"
- id="g43488-2-2"
- style="display:inline;enable-background:new">
- <path
- sodipodi:nodetypes="cc"
- id="path43490-2-2"
- d="M 326.98536,85.889717 327,76"
- style="fill:none;stroke:#000000;stroke-width:3.57682419;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path43492-1-0"
- d="m 330.97424,79.255626 -3.97425,-3.974249 -3.97424,3.974249"
- style="fill:none;stroke:#000000;stroke-width:3.57682419;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(0,-0.75485957,0.75485957,0,327.67313,852.33908)"
- id="g43494-2-5"
- style="display:inline;enable-background:new">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ebebeb;stroke-width:1.72217464;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 327,85.889717 V 76"
- id="path43496-7-5"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ebebeb;stroke-width:1.72217464;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 330.97424,79.255626 -3.97425,-3.974249 -3.97424,3.974249"
- id="path43498-9-6"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path17874"
- d="m 330.97424,79.255626 -2.24089,-2.206598"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.32474971;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_DRIVER">
- <rect
- transform="scale(-1,1)"
- y="220.00047"
- x="-546"
- height="16"
- width="16"
- id="rect14357-6"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g17935">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ec0606;fill-opacity:1;fill-rule:nonzero;stroke:#910000;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect43394-5-7"
- width="6"
- height="2"
- x="540.12811"
- y="231.61429"
- rx="0.79505396"
- ry="0.79505396" />
- <path
- sodipodi:nodetypes="czszcccc"
- id="path14368-1"
- style="display:inline;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1"
- d="m 542.6613,230.54031 -4.34213,0.008 c -5.18824,0.0101 -5.3353,-2.04831 -3.33529,-4.04831 0.96487,-0.96488 3.61611,-2.89515 -1.50001,-5 m 6.83689,6.08925 2.34054,2.95106 m -2.32899,2.96017 2.32899,-2.96017"
- inkscape:connector-curvature="0" />
- <path
- d="m 542.6613,230.54031 -4.34213,0.008 c -5.18824,0.0106 -5.3353,-2.04783 -3.33529,-4.04783 0.96487,-0.96488 3.83708,-2.76256 -1.50001,-5 m 6.83689,6.08877 2.34054,2.95106 m -2.32899,2.96017 2.32899,-2.96017"
- style="display:inline;fill:none;stroke:url(#linearGradient17932);stroke-width:1.50000143;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:7.40000057;stroke-opacity:1"
- id="path14375-4"
- sodipodi:nodetypes="czszcccc"
- inkscape:connector-curvature="0" />
- <rect
- ry="0.79505396"
- rx="0.79505396"
- y="220.375"
- x="530.3125"
- height="2"
- width="6"
- id="rect43396-5-4"
- style="display:inline;overflow:visible;visibility:visible;fill:#6996d7;fill-opacity:1;fill-rule:nonzero;stroke:#143564;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- </g>
- </g>
- <g
- id="ICON_UNLOCKED">
- <rect
- y="598"
- x="299"
- height="16"
- width="16"
- id="rect25569-8"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(1.1,-0.09992002)"
- id="g20068">
- <rect
- y="605.5"
- x="-312.5"
- height="7.0000267"
- width="10"
- id="rect15044-4"
- style="fill:url(#linearGradient20080);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="scale(-1,1)" />
- <path
- inkscape:connector-curvature="0"
- id="path15046-4"
- style="fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 304.49848,605.5625 v -2 c 0,-2 -0.62933,-3 -2.51731,-3.00008 -1.2779,5e-5 -2.17039,0.23501 -2.53494,1.78073"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient20199);stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 304.49848,605.5625 v -2.25 c 0,-1.75 -0.62933,-2.75 -2.51734,-2.75008 -1.27677,5e-5 -2.05659,0.20629 -2.29807,1.20103"
- id="path15049-9"
- sodipodi:nodetypes="cscc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- ry="0"
- rx="0"
- y="606.5"
- x="303.5"
- height="5"
- width="8"
- id="rect15051-2"
- style="display:inline;fill:none;stroke:url(#linearGradient20084);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- id="path19016-6"
- d="m 304,607.5 h 7.5"
- style="opacity:0.5;fill:none;stroke:#939dac;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.5;fill:none;stroke:#939dac;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 304,609.5 h 7.5"
- id="path19018-0" />
- <path
- inkscape:connector-curvature="0"
- id="path19020-2"
- d="m 304,611.5 h 7.5"
- style="opacity:0.5;fill:none;stroke:#939dac;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.29999995;marker:none;enable-background:accumulate"
- id="rect36041-6"
- width="1"
- height="2.0000124"
- x="307"
- y="608" />
- <rect
- y="608"
- x="307"
- height="0.99994379"
- width="0.99998754"
- id="rect36043-2"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.29999995;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.29999995;marker:none;enable-background:accumulate"
- d="m 308,608 v 2 h -1 v 1 h 1 1 v -1 -2 z"
- id="path36045-7"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(21)"
- style="display:inline;enable-background:new"
- id="ICON_LOCKED">
- <rect
- y="598"
- x="299"
- height="16"
- width="16"
- id="rect25569-8-3"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(1.1,-0.09992002)"
- id="g20068-2">
- <rect
- y="605.5"
- x="-312.5"
- height="7.0000267"
- width="10"
- id="rect15044-4-1"
- style="fill:url(#linearGradient20080-5);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="scale(-1,1)" />
- <path
- inkscape:connector-curvature="0"
- id="path15046-4-9"
- style="fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 310.5,605.5 v -2 c 0,-2 -0.75,-3 -3,-3.00008 -2.25,8e-5 -3,1.00008 -3,3.00008 v 2"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient20082-4);stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 310.5,605.5 c 0,0 0,-2.25 0,-2.25 0,-1.75 -0.75,-2.75 -3.00003,-2.75008 C 305.25,600.5 304.5,601.5 304.5,603.25 v 2.25005"
- id="path15049-9-8"
- sodipodi:nodetypes="csccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- ry="0"
- rx="0"
- y="606.5"
- x="303.5"
- height="5"
- width="8"
- id="rect15051-2-5"
- style="display:inline;fill:none;stroke:url(#linearGradient20084-9);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- id="path19016-6-0"
- d="m 304,607.5 h 7.5"
- style="opacity:0.5;fill:none;stroke:#939dac;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.5;fill:none;stroke:#939dac;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 304,609.5 h 7.5"
- id="path19018-0-2" />
- <path
- inkscape:connector-curvature="0"
- id="path19020-2-9"
- d="m 304,611.5 h 7.5"
- style="opacity:0.5;fill:none;stroke:#939dac;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.29999995;marker:none;enable-background:accumulate"
- id="rect36041-6-4"
- width="1"
- height="2.0000124"
- x="307"
- y="608" />
- <rect
- y="608"
- x="307"
- height="0.99994379"
- width="0.99998754"
- id="rect36043-2-8"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.29999995;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.29999995;marker:none;enable-background:accumulate"
- d="m 308,608 v 2 h -1 v 1 h 1 1 v -1 -2 z"
- id="path36045-7-1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(-105.02687,272.93951)"
- style="display:inline;enable-background:new"
- id="ICON_EYEDROPPER">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18696-0-4-1"
- width="16"
- height="16"
- x="299"
- y="325" />
- <g
- id="g17099">
- <path
- style="display:inline;fill:url(#linearGradient16783-1-6-0-2);fill-opacity:1;fill-rule:evenodd;stroke:none;enable-background:new"
- d="M 309.7702,332.24765 304.5,337.5 h -1 l -1,1 h -1 v -1 l 1,-1 v -1 l 5.2702,-5.25235 z"
- id="path18700-1-3-9"
- sodipodi:nodetypes="cccccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccc"
- id="path17007-7"
- d="M 309.7702,332.24765 304.5,337.5 h -1 l -1,1 h -1 v -1 l 1,-1 v -1 l 5.2702,-5.25235 z"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" />
- <path
- sodipodi:nodetypes="ccszsccc"
- id="path18711-5-8-1"
- d="m 310.5,333.5 v -2.75 c 1.1224,0 1.75,0 2.5,-0.75 0.75,-0.75 0.75,-2.25 0,-3 -0.75,-0.75 -2.25,-0.75 -3,0 -0.75,0.75 -0.75,1.49506 -0.75,2.5 h -2.75 z"
- style="display:inline;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:#1a1a1a;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- inkscape:transform-center-x="-1.4435745"
- inkscape:transform-center-y="-1.4192649"
- style="display:inline;fill:url(#linearGradient16778-3-5-3-2);fill-opacity:1;fill-rule:evenodd;stroke:none;enable-background:new"
- d="m 309.22323,329.79745 c -0.11594,-0.12547 0.0486,-1.2642 0.81343,-2.11918 1.04731,-1.1688 1.89745,-0.8692 1.99021,-0.61778 1.02063,2.76644 -1.73024,3.89859 -2.80364,2.73696 z"
- id="path18713-4-2-0"
- sodipodi:nodetypes="csss"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path18715-9-8-1"
- d="m 308.26612,330.5 c 0,0 0.25,0 0.25,0 v -1"
- style="display:inline;opacity:0.98000004;fill:none;stroke:url(#linearGradient16775-4-9-5-6);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 303.25,335.75 4.17237,-4.0625"
- id="path18705-8-4-0"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(-42,231)"
- style="display:inline;enable-background:new"
- id="ICON_ACTION">
- <rect
- y="304"
- x="278"
- height="16"
- width="16"
- id="rect22048-0-1-2"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <g
- id="g17930-6">
- <rect
- y="305.5"
- x="281.5"
- height="6.0211244"
- width="9.0000076"
- id="rect22050-0-1-6"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffd6aa;fill-opacity:1;fill-rule:evenodd;stroke:#2b1600;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path22056-3-7-1"
- d="m 282.5,316.5 3,3 3,-3 -3,-3 z"
- style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 282.75,316.5 2.75,2.75 2.75,-2.75 -2.75,-2.75 z"
- id="path22058-8-8-7"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path22060-3-9-9"
- d="m 283.5,316.5 2,-2 2,2 -2,2 z"
- style="fill:none;stroke:url(#linearGradient18148);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path22157-2-9-1"
- d="m 287.75,308.25 v 0.5 l 2.5,2.5 h 0.5 l 2.5,-2.5 v -0.5 l -2.5,-2.5 h -0.5 z"
- style="fill:none;stroke:#552c00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#e98316;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 288,308.5 2.5,2.5 2.5,-2.5 -2.5,-2.5 z"
- id="path22159-1-9-5"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path22161-4-8-9"
- d="M 288.64504,308.5 290.5,306.66161 292.35496,308.5 290.5,310.36049 Z"
- style="fill:none;stroke:url(#linearGradient17904-1);stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 278.75,308.25 v 0.5 l 2.5,2.5 h 0.5 l 2.5,-2.5 v -0.5 l -2.5,-2.5 h -0.5 z"
- id="path22208-0-8-1"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path22212-5-4-4"
- d="m 279,308.5 2.5,2.5 2.5,-2.5 -2.5,-2.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:none;stroke:url(#linearGradient17893-5);stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 279.64062,308.5 281.5,306.66406 283.35547,308.5 281.5,310.375 Z"
- id="path22214-3-8-8"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_BOIDS">
- <rect
- y="472"
- x="257"
- height="16"
- width="16"
- id="rect35680"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- inkscape:transform-center-y="2.2787562"
- inkscape:transform-center-x="-0.78726"
- id="g35844"
- transform="translate(-186,256.02369)"
- style="display:inline;opacity:0.9;enable-background:new">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path35846"
- d="m 454.5,218.5 c -1.25,-1.5 -2.5,-1.5 -4,1 -1.5,-2.5 -2.75,-2.5 -4,-1"
- style="opacity:0.85;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:#f2f2f2;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 454.5,218.5 c -1.25,-1.5 -2.5,-1.5 -4,1 -1.5,-2.5 -2.75,-2.5 -4,-1"
- id="path35848"
- sodipodi:nodetypes="ccc" />
- </g>
- <path
- sodipodi:nodetypes="ccccc"
- id="path35862"
- d="m 264.5,485.5 -1,-1 -2,2 -2,-2 -1,1.02369"
- style="opacity:0.76499999;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 264.5,485.5 -1,-1 -2,2 -2,-2 -1,1.02369"
- id="path35864"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <g
- transform="translate(-21,21)"
- id="g38276">
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.85;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 292.5,459.5 c -1.25,-1.5 -3.5,-1.5 -5,1 -1.5,-2.5 -3.75,-2.5 -5,-1"
- id="path35702"
- sodipodi:nodetypes="ccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path35704"
- d="m 292.5,459.5 c -1.25,-1.5 -3.5,-1.5 -5,1 -1.5,-2.5 -3.75,-2.5 -5,-1"
- style="fill:none;stroke:#ececec;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- <path
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0"
- d="m 266.53125,480.65625 -0.0312,0.9375 m -0.85937,-1.07813 c 0.49634,0.0684 0.8328,0.24341 1.79687,0"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- id="path16745" />
- <path
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0"
- d="m 264.46875,474.79687 -0.0312,0.9375 m -0.85937,-1.07813 c 0.49634,0.0684 0.8328,0.24341 1.79687,0"
- style="display:inline;fill:none;stroke:#f0f0f0;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- id="path16745-9" />
- </g>
- <g
- transform="translate(105)"
- style="display:inline;opacity:0.3;enable-background:new"
- id="ICON_RESTRICT_SELECT_ON">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc"
- id="path45378-1-5-0"
- d="m 367.75,440.75 1.75,-1.5 2.5,5.25 1.75,-1 -2.25,-5 h 2.5 l -6.25,-6.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17833-9);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="430"
- x="362"
- height="16"
- width="16"
- id="rect45374-0-5-0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0"
- id="path17835-6"
- d="m 367.5,431.5 7,7.25 h -3 l 2.5,4.75 -1.75,1 -2.5,-5 -2.25,2.25 z"
- style="fill:none;stroke:#000000;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path17845-4"
- d="m 368.34375,433.75 v 5.75"
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- <g
- transform="translate(84)"
- style="display:inline;enable-background:new"
- id="ICON_RESTRICT_SELECT_OFF">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc"
- id="path45378-1-5-6"
- d="m 367.75,440.75 1.75,-1.5 2.5,5.25 1.75,-1 -2.25,-5 h 2.5 l -6.25,-6.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17833-8);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="430"
- x="362"
- height="16"
- width="16"
- id="rect45374-0-5-6"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0"
- id="path17835-7"
- d="m 367.5,431.5 7,7.25 h -3 l 2.5,4.75 -1.75,1 -2.5,-5 -2.25,2.25 z"
- style="fill:none;stroke:#000000;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path17845-9"
- d="m 368.34375,433.75 v 5.75"
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_SCRIPTPLUGINS"
- transform="translate(189.0161,-397)">
- <rect
- y="428"
- x="193.9839"
- height="16"
- width="16"
- id="rect20642-6"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-29.016109,339.00751)"
- id="g20606-2">
- <g
- transform="translate(-199.98388,-106)"
- id="g10953-7">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccc"
- style="fill:none;stroke:#000000;stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 429.9998,196.99249 v 1.625 c -0.53409,0.12195 -1.02562,0.33162 -1.46875,0.625 l -1.53125,-1.25 -1,1 1.25,1.53125 c -0.29338,0.44313 -0.50305,0.93466 -0.625,1.46875 h -1.625 v 2 h 1.625 c 0.12195,0.53409 0.33162,1.02562 0.625,1.46875 l -1.25,1.53125 1,1 1.53125,-1.25 c 0.44313,0.29338 0.93466,0.50305 1.46875,0.625 v 1.625 h 2 v -1.625 c 0.53409,-0.12195 1.02562,-0.33162 1.46875,-0.625 l 1.53125,1.25 1,-1 -1.25,-1.53125 c 0.29338,-0.44313 0.50305,-0.93466 0.625,-1.46875 h 1.625 v -2 h -1.625 c -0.12195,-0.53409 -0.33162,-1.02562 -0.625,-1.46875 l 1.25,-1.53125 -1,-1 -1.53125,1.25 c -0.44313,-0.29338 -0.93466,-0.50305 -1.46875,-0.625 v -1.625 z m -1,4 h 4 v 4 h -4 z"
- id="path10955-5"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccc"
- id="path10957-4"
- d="m 429.9998,196.99249 v 1.625 c -0.53409,0.12195 -1.02562,0.33162 -1.46875,0.625 l -1.53125,-1.25 -1,1 1.25,1.53125 c -0.29338,0.44313 -0.50305,0.93466 -0.625,1.46875 h -1.625 v 2 h 1.625 c 0.12195,0.53409 0.33162,1.02562 0.625,1.46875 l -1.25,1.53125 1,1 1.53125,-1.25 c 0.44313,0.29338 0.93466,0.50305 1.46875,0.625 v 1.625 h 2 v -1.625 c 0.53409,-0.12195 1.02562,-0.33162 1.46875,-0.625 l 1.53125,1.25 1,-1 -1.25,-1.53125 c 0.29338,-0.44313 0.50305,-0.93466 0.625,-1.46875 h 1.625 v -2 h -1.625 c -0.12195,-0.53409 -0.33162,-1.02562 -0.625,-1.46875 l 1.5,-1.78125 -1,-1 -1.78125,1.5 c -0.44313,-0.29338 -0.93466,-0.50305 -1.46875,-0.625 v -1.625 z m -1,4 h 4 v 4 h -4 z"
- style="fill:url(#linearGradient20796-9);fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- d="m 434.9998,198.49249 -1.5,1.25 m -2,-2.25 h -1 v 1.5 c -0.35104,0.0802 -1.01806,0.29269 -1.5172,0.50569 m -1.49,1.50752 c -0.20864,0.49552 -0.41426,1.14284 -0.4928,1.48679 h -1.5 v 1 m 1.5,-5 -0.5,0.5 m 1.25,6.5 -1.25,1.5 m 6.5,-5.5 v 3.5 h -3.5 m -3,-6 0.5,-0.5 1.5,1.25"
- style="fill:none;stroke:#f9f9f9;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- id="path10959-0"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(-199.98388,-106)"
- id="g10961-1">
- <rect
- ry="0"
- rx="0"
- y="202.46629"
- x="430.49979"
- height="8.1236582"
- width="7.0000763"
- id="rect10963-2"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- d="m 432.53795,204.5065 h 2.96201 m -2.96201,1.993 h 2.96201 m -2.96201,1.993 h 2.96201"
- style="fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- id="path10965-7"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- ry="0"
- rx="0"
- y="202.48912"
- x="430.49661"
- height="8.0067444"
- width="7.0067482"
- id="rect10967-1"
- style="fill:none;stroke:url(#linearGradient20798-1);stroke-width:0.99325603;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- </g>
- <g
- transform="translate(-42.000002,-84)"
- style="display:inline;enable-background:new"
- id="ICON_MOD_SKIN">
- <rect
- y="325"
- x="299"
- height="16"
- width="16.000002"
- id="rect44300-0-5-3-4"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;enable-background:accumulate" />
- <g
- id="g81149-2">
- <path
- sodipodi:nodetypes="cssssssssssssssscssc"
- inkscape:connector-curvature="0"
- id="path41299-1-2-7-4-0"
- d="m 306.46211,325.45009 c -1.82601,0 -3.30699,1.48105 -3.30699,3.30711 0,0.25952 0.0379,0.51035 0.087,0.75425 0.18833,0.93505 0.24637,1.73179 -0.11603,2.43677 -0.32404,0.63034 -0.67881,0.97731 -1.45039,1.27638 -1.27734,0.49511 -2.17564,1.6304 -2.17564,3.04602 0,0.7411 0.24647,1.42826 0.6672,1.97265 0.21236,0.27479 0.1962,0.24789 0.29008,0.34806 0.60044,0.64074 1.56724,0.98341 2.29168,0.95729 0.74932,-0.027 1.28404,-0.28854 1.8855,-0.60911 0.58287,-0.31066 0.97831,-0.70633 1.82755,-0.69624 0.70498,0.008 1.33214,0.39548 1.88546,0.75426 0.55206,0.35795 1.29426,0.55886 1.8275,0.55114 1.8258,-0.0264 3.30697,-1.48104 3.30697,-3.30711 0,-1.23932 -0.68675,-2.33495 -1.71151,-2.87196 -0.78932,-0.41364 -1.71989,-0.83441 -2.11757,-1.47945 -0.44817,-0.72695 0.029,-2.46582 0.029,-2.46582 0.0441,-0.21523 0.087,-0.43896 0.087,-0.66722 0,-1.82606 -1.48098,-3.30711 -3.30698,-3.30711 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient80406-8);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cscsscc"
- inkscape:connector-curvature="0"
- id="path15475-1-1-9"
- d="m 306.46211,326.3494 c -1.34707,0 -2.40772,1.06069 -2.40772,2.4078 0,0.17324 0.0147,0.36498 0.058,0.5802 0.2006,0.99599 0.30102,2.03645 -0.20306,3.017 -0.3838,0.74661 -1.01301,1.33313 -1.91455,1.68257 -0.98238,0.38077 -1.59548,1.19286 -1.59548,2.23374 0.0793,1.22982 0.59501,1.65939 1.12899,2.05552"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient80403-6);stroke-width:0.99999988;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- d="m 306.5,333.5 -4,3 m 4,-3 4,3 m -4,-8 v 5"
- style="display:inline;fill:none;stroke:#acc1f5;stroke-width:2.29999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- id="path16558"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- id="path15730-0-3-9-7"
- style="display:inline;fill:none;stroke:#474747;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 306.5,333.5 -4,3 m 4,-3 4,3 m -4,-8 v 5" />
- <rect
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;enable-background:new"
- id="rect16285-9-59-6-8-3"
- width="2.0172396"
- height="2.0000157"
- x="305.48901"
- y="327.52499" />
- <rect
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;enable-background:new"
- id="rect16285-9-59-6-82-7"
- width="2.0172396"
- height="2.0000157"
- x="301.52026"
- y="335.49374" />
- <rect
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;enable-background:new"
- id="rect16285-9-59-6-9-2"
- width="2.0172396"
- height="2.0000157"
- x="309.49374"
- y="335.49374" />
- <rect
- style="display:inline;fill:#d7e3f4;fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;enable-background:new"
- id="rect16285-9-59-6-1-6"
- width="2.0172396"
- height="2.0000157"
- x="305.52499"
- y="332.52499" />
- </g>
- </g>
- <g
- id="ICON_FILE_SCRIPT">
- <g
- id="g79830"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect52984-1"
- width="16"
- height="16"
- x="467"
- y="73" />
- <g
- id="g79032">
- <g
- transform="translate(-285,-131)"
- id="g39239-9"
- style="display:inline;enable-background:new">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:url(#linearGradient39254-3);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="M 756.16666,204.50001 H 766.5 V 219.5 h -13 l -10e-6,-11.99999 z"
- id="path39241-0"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path39243-2"
- d="M 756.16666,204.50001 H 766.5 V 219.5 h -13 l -10e-6,-11.99999 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:url(#radialGradient39256-2);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path39245-4"
- style="display:inline;fill:none;stroke:url(#linearGradient39258-9);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 754.5,209 v 9.5 m 3.5,-13 h 7.5"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path39247-4"
- d="m 753,208 h 4 v -4 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- id="path39249-3"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 753.5,207.00001 V 219.5 h 13 V 204.50001 H 756 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient16151);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 757.5,206.5 v 2 h -2"
- id="path39251-7" />
- </g>
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1.70000005;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 481.21875,81.25 c -0.34507,-0.155271 -0.69504,-0.245578 -1.125,-0.34375 L 479.9375,79 h -1 -1 l -0.15625,1.90625 c -0.6231,0.14227 -1.07677,0.25145 -1.59375,0.59375 l -1.75,-1.75 -1.75,1.75 1.75,1.75 c -0.34229,0.51699 -0.45148,0.97065 -0.59375,1.59375 L 471.9375,85 v 1 1 l 1.90625,0.15625 c 0.092,0.4031 0.17505,0.738019 0.3125,1.0625 m 2.96875,0 C 476.47574,87.692174 476.0625,86.902037 476.0625,86 c 0,-1.58782 1.28718,-2.875 2.875,-2.875 0.94357,0 1.75793,0.454854 2.28125,1.15625"
- id="path52980-3"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccccccccccssc" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient79029);fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate"
- d="m 477.9375,79 -0.15625,1.90625 c -0.6231,0.14227 -1.07677,0.25145 -1.59375,0.59375 l -1.75,-1.5 -1.5,1.5 1.5,1.75 c -0.34229,0.51699 -0.45148,0.97065 -0.59375,1.59375 L 471.9375,85 v 1 1 l 1.90625,0.15625 c 0.0981,0.429533 0.18992,0.780253 0.34375,1.125 H 477 C 476.34893,87.730943 475.9375,86.919238 475.9375,86 c 0,-1.65685 1.34315,-3 3,-3 0.96105,0 1.7947,0.453338 2.34375,1.15625 v -2.875 c -0.36595,-0.173211 -0.73124,-0.270823 -1.1875,-0.375 L 479.9375,79 h -1 z m 3.34375,8.8125 c -0.12902,0.1662 -0.24569,0.333041 -0.40625,0.46875 h 0.40625 z"
- id="path52982-4"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient79025);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.26976109;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 481.28125,83.40625 C 480.661,82.839183 479.84801,82.5 478.9375,82.5 c -1.93397,0 -3.5,1.566029 -3.5,3.5 0,0.881253 0.34008,1.6682 0.875,2.28125"
- id="rect52986-8"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cssc" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 476.4375,81.75 c 0.49914,-0.213 1.64896,-0.6698 2,-0.75 V 80.25 79.5 h 1 m -5.25,1.25 -0.5,0.5 z m 0.5,2.75 c -0.20864,0.49552 -0.6715,1.65605 -0.75,2 h -0.75 -0.75 v 1"
- id="path52988-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccccccc" />
- <path
- sodipodi:nodetypes="cc"
- id="path52990-8"
- d="m 473.43328,81.74394 1.25,-1.25"
- style="fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:none;stroke:url(#linearGradient79020);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.26976109;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 481.28125,83.40625 C 480.661,82.839183 479.84801,82.5 478.9375,82.5 c -1.93397,0 -3.5,1.566029 -3.5,3.5 0,0.881253 0.34008,1.6682 0.875,2.28125"
- id="rect52992-4"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cssc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- id="path39249-3-7"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 468.49796,75.999224 v 12.49999 h 13 v -14.99999 h -10.5 z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- <path
- sodipodi:open="true"
- sodipodi:end="6.2578421"
- sodipodi:start="1.6883393"
- transform="matrix(1.0460001,0,0,1.0460077,-22.029739,-4.0047766)"
- d="m 478.63139,88.358828 a 2.34375,2.34375 0 0 1 -2.06316,-2.491306 2.34375,2.34375 0 0 1 2.39025,-2.17944 2.34375,2.34375 0 0 1 2.29077,2.283776"
- sodipodi:ry="2.34375"
- sodipodi:rx="2.34375"
- sodipodi:cy="86.03125"
- sodipodi:cx="478.90625"
- id="path81543"
- style="fill:none;stroke:#000000;stroke-width:0.9560194;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:type="arc" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_PANEL_CLOSE">
- <rect
- y="598"
- x="152"
- height="16"
- width="16"
- id="rect38813-3-2"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="rotate(45,-399.55549,273.81169)"
- id="g10876-8-5-8-64-4"
- style="display:inline;enable-background:new">
- <path
- style="fill:url(#linearGradient16663-3-0-8);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 226.05286,111.6246 h 3.53553 l 1e-5,-3.53553 h 2.82843 v 3.53553 h 3.53553 l -1e-5,2.82843 h -3.53553 v 3.53553 h -2.82843 v -3.53553 h -3.53553 z"
- id="path10878-4-0-1-4-6"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path16661-5-1-6"
- d="m 235.06847,113.56915 v -1.06066"
- style="fill:none;stroke:#d4d4d4;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path16659-5-9-6"
- d="m 230.47227,114.62981 v 2.47487"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path16657-8-5-2"
- d="m 230.47227,108.97295 v 2.47488"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path10880-7-5-7-5-9"
- d="m 226.93674,112.50849 v 1.06066"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- </g>
- <g
- transform="translate(252,21)"
- style="display:inline;enable-background:new"
- id="ICON_X">
- <rect
- y="598"
- x="152"
- height="16"
- width="16"
- id="rect38813-3-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="rotate(45,-399.55549,273.81169)"
- id="g10876-8-5-8-64-9"
- style="display:inline;enable-background:new">
- <path
- style="fill:url(#linearGradient16663-3-0-0);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 224.63864,111.6246 h 4.94975 v -4.94974 h 2.82843 l 1e-5,4.94974 h 4.94973 l -1e-5,2.82843 h -4.94973 v 4.94975 h -2.82843 v -4.94975 h -4.94975 z"
- id="path10878-4-0-1-4-9"
- sodipodi:nodetypes="ccccccccccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path16661-5-1-5"
- d="m 236.48268,113.56915 v -1.06066"
- style="fill:none;stroke:#d4d4d4;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path16659-5-9-5"
- d="m 230.47227,114.62981 v 3.88908"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path16657-8-5-5"
- d="m 230.47227,107.55874 v 3.88909"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path10880-7-5-7-5-6"
- d="m 225.52253,112.50849 v 1.06066"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- </g>
- <g
- id="ICON_BORDER_RECT">
- <g
- transform="translate(0,-21)"
- id="g23604">
- <g
- style="fill:#321900"
- id="g23590">
- <rect
- transform="scale(-1)"
- y="-602"
- x="-258"
- height="2"
- width="1"
- id="rect23464"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate" />
- <rect
- transform="scale(-1)"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate"
- id="rect23466"
- width="1"
- height="2"
- x="-258"
- y="-606" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate"
- id="rect23548"
- width="1"
- height="2"
- x="-273"
- y="-602"
- transform="scale(-1)" />
- <rect
- y="-606"
- x="-273"
- height="2"
- width="1"
- id="rect23550"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate"
- transform="scale(-1)" />
- <rect
- y="-268"
- x="598"
- height="2"
- width="1"
- id="rect23472"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="rotate(90)" />
- <rect
- transform="rotate(90)"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23474"
- width="1"
- height="2"
- x="598"
- y="-264" />
- <rect
- transform="rotate(90)"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23476"
- width="1"
- height="2"
- x="598"
- y="-271.99207" />
- <rect
- y="-259.99207"
- x="598"
- height="2"
- width="1"
- id="rect23480"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="rotate(90)" />
- <rect
- transform="rotate(90)"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23540"
- width="1"
- height="2"
- x="607"
- y="-268" />
- <rect
- y="-264"
- x="607"
- height="2"
- width="1"
- id="rect23542"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="rotate(90)" />
- <rect
- y="-271.99207"
- x="607"
- height="2"
- width="1"
- id="rect23544"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="rotate(90)" />
- <rect
- transform="rotate(90)"
- style="display:inline;overflow:visible;visibility:visible;fill:#321900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23546"
- width="1"
- height="2"
- x="607"
- y="-259.99207" />
- </g>
- <g
- id="g23572">
- <rect
- transform="matrix(0,-1,-1,0,0,0)"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect23461"
- width="1"
- height="2"
- x="-608"
- y="-270" />
- <rect
- transform="scale(-1)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23468"
- width="1"
- height="2"
- x="-273"
- y="-600" />
- <rect
- transform="scale(-1)"
- y="-604"
- x="-273"
- height="2"
- width="1"
- id="rect23470"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- y="-266"
- x="-608"
- height="2"
- width="1"
- id="rect23478"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="matrix(0,-1,-1,0,0,0)" />
- <rect
- transform="matrix(0,-1,-1,0,0,0)"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect23482"
- width="1"
- height="2"
- x="-608"
- y="-262" />
- <rect
- y="-262"
- x="598"
- height="2"
- width="1"
- id="rect23529"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="rotate(90)" />
- <rect
- transform="rotate(90)"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect23531"
- width="1"
- height="2"
- x="598"
- y="-266" />
- <rect
- y="-270"
- x="598"
- height="2"
- width="1"
- id="rect23533"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="rotate(90)" />
- <rect
- y="-273"
- x="-608"
- height="1"
- width="2"
- id="rect23535"
- style="fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="matrix(0,-1,-1,0,0,0)" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23525"
- width="1"
- height="2"
- x="-258"
- y="-600"
- transform="scale(-1)" />
- <rect
- y="-604"
- x="-258"
- height="2"
- width="1"
- id="rect23527"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- transform="scale(-1)" />
- <rect
- transform="scale(-1)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff982a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect23537"
- width="1"
- height="2"
- x="-258"
- y="-608" />
- </g>
- <rect
- y="599"
- x="258"
- height="8"
- width="14"
- id="rect23637"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.12999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 259,600 h 13 v -1 h -14 v 8 h 1 z"
- id="path23639" />
- <g
- transform="translate(40,359)"
- id="g23641"
- style="display:inline;enable-background:new">
- <g
- id="g23646"
- style="display:inline;fill:#1a1a1a;enable-background:new"
- transform="translate(5)" />
- </g>
- </g>
- <g
- transform="translate(0.1767767,0.13258252)"
- id="g106636">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient106641);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 263.5625,590.375 1.75,-1.5 1.99177,3.7253 1.75,-1 -1.74177,-3.4753 h 2.5 l -6.25,-6.25 z"
- id="path45378-1-5-6-2-9"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 263.3125,581.125 7,7.25 h -3 l 1.69346,3.25845 -1.75,1 -1.69346,-3.50845 -2.25,2.25 z"
- id="path17835-7-2-5"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 264.15625,583.375 v 5.75"
- id="path17845-9-1-1"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- </g>
- </g>
- <g
- transform="translate(0.02855492)"
- style="display:inline;enable-background:new"
- id="ICON_MOD_SOLIDIFY">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18695-6-9-6"
- width="15.971445"
- height="16.000002"
- x="110"
- y="241" />
- <g
- id="g15853-0">
- <path
- sodipodi:nodetypes="ccccc"
- id="path15095-5"
- d="m 117.9106,247.99675 0.007,7.98875 -5.98631,-3.26708 -0.0121,-7.34356 z"
- style="opacity:0.63859648;fill:url(#radialGradient15836-5);fill-opacity:1;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- id="path18719-6-9-0"
- d="m 117.94049,242.95683 -5.85545,2.34692 6.10637,2.4934 -0.17358,8.22275 6.00064,-3.2989 0.0442,-7.36753 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient15851-6);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- id="g18703-4-7-7"
- transform="matrix(1.2133883,0,0,1.2133883,-65.271004,156.45833)">
- <path
- id="path18707-3-8-5"
- d="m 146.0019,73.295281 5,-2.007976 5,2.007976 -5,2.073959 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient15818-5);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path18763-2-5-8"
- d="m 124.01757,245.38766 -6.11113,2.33515 0.39771,8.10095 5.71891,-3.11585 z"
- style="display:inline;fill:url(#linearGradient15846-4);fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path18709-1-1-0"
- d="m 114.36329,244.98044 3.58667,-1.46751 5.56035,2.22692 0.0356,6.65202 -4.34973,2.45342"
- style="fill:none;stroke:url(#linearGradient15843-2);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <g
- id="g18737-4-8-8"
- style="opacity:0.7"
- transform="matrix(1.2133883,0,0,1.2133883,-282.46751,373.65484)" />
- <path
- sodipodi:nodetypes="ccccccccccc"
- inkscape:connector-curvature="0"
- id="path15957-6"
- d="m 118.29703,256.35166 5.94799,-3.23942 c 0.0419,-0.0185 0.0806,-0.0443 0.11369,-0.0758 0.0689,-0.0703 0.11042,-0.16699 0.1137,-0.26543 l -0.0379,-7.432 c 10e-4,-0.16462 -0.1103,-0.32426 -0.26543,-0.37919 l -6.06694,-2.42677 c -0.0474,-0.0224 -0.0992,-0.0354 -0.15167,-0.0379 h 1.2e-4 c -0.0524,0.002 -0.10423,0.0154 -0.15167,0.0379 l -5.53168,2.30782"
- style="fill:none;stroke:#0b1728;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:type="inkscape:offset"
- inkscape:radius="0.4429636"
- inkscape:original="M 111.90625 245.375 L 111.9375 252.71875 L 117.90625 256 L 117.90625 248 L 111.90625 245.375 z "
- style="fill:none;stroke:url(#linearGradient16730);stroke-width:0.89999998;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path16571-2"
- d="m 111.91211,244.93164 a 0.4430079,0.4430079 0 0 0 -0.44922,0.44531 l 0.0312,7.34375 a 0.4430079,0.4430079 0 0 0 0.23047,0.38672 l 5.96875,3.28125 A 0.4430079,0.4430079 0 0 0 118.34961,256 v -8 a 0.4430079,0.4430079 0 0 0 -0.26563,-0.40625 l -6,-2.625 a 0.4430079,0.4430079 0 0 0 -0.17187,-0.0371 z" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient16562-7);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 117.31869,255.08504 -4.89325,-2.67466 -0.0154,-6.1798"
- id="path16560-5"
- sodipodi:nodetypes="ccc" />
- <path
- style="opacity:0.75333408;fill:none;stroke:url(#linearGradient15773-7);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.38888891"
- d="m 112.44393,252.43208 3.76322,-1.57568"
- id="path15671-3"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- </g>
- </g>
- <g
- id="ICON_EDIT">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect39543"
- width="16"
- height="16"
- x="131"
- y="556" />
- <g
- transform="translate(104,40.00013)"
- id="g39545">
- <g
- transform="translate(-116,424.99975)"
- style="opacity:0.75"
- id="g39547">
- <g
- id="g39549"
- transform="translate(-179,199.50012)">
- <path
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.00000167;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 328.5,-107.25 -4.5,1.75 v 6.5 l 4.5,2.25 4.25,-2 v -6.75 z"
- id="path39551"
- inkscape:connector-curvature="0" />
- <g
- id="g39553"
- transform="translate(179,-179)">
- <path
- sodipodi:nodetypes="ccccc"
- id="path39556"
- d="m 154,80 v -6.5 l -4.5,-1.75 v 10.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path39558"
- d="M 324,-99.00012 V -105.5 l 4.5,-1.75 0.5,0.25 v 10 l -0.5,0.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path39560"
- d="m 332.5,-105.5 v 6.25 l -4,2 -4,-2.00012 V -105.5"
- style="fill:none;stroke:url(#linearGradient27496);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- id="path39562"
- d="m 324,-105.5 4.5,-1.75 4.5,1.75 -4.5,2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path39564"
- d="m 145.5,94.25012 c 0,0 4,1.75 4,1.75 l 4,-1.75"
- style="opacity:0.95999995;fill:none;stroke:url(#linearGradient27498);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <rect
- y="96.000122"
- x="149"
- height="6.7500019"
- width="1"
- id="rect39567"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.09599998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- id="rect39569"
- width="1"
- height="6.7500019"
- x="150"
- y="96.000122" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#8c4800;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect39571"
- width="2.9999485"
- height="3.0001416"
- x="27.500006"
- y="517.49976"
- ry="0"
- rx="0" />
- <rect
- rx="0"
- ry="0"
- y="524.49951"
- x="27.500006"
- height="3.0001416"
- width="2.9999485"
- id="rect39574"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#8c4800;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- y="517.99988"
- x="28.021444"
- height="4"
- width="3.9785564"
- id="rect37868-0-5"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.12000002;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#5a2f00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 28.000006,520.49983 h -0.5 v -3.00014 h 2.99995"
- id="path39576"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path39583"
- d="m 28.000006,524.49978 h -0.5 v 3.00014 h 2.99995"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#5a2f00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- rx="0"
- ry="0"
- y="517.99988"
- x="28.000051"
- height="2.0000772"
- width="1.9999485"
- id="rect39585"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffd4a5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- y="524.99988"
- x="28"
- height="1.999992"
- width="3.9785564"
- id="rect37868-0-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.12000002;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- rx="0"
- ry="0"
- y="524.99982"
- x="28.000051"
- height="2.0000772"
- width="1.9999485"
- id="rect39587"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffd4a5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- transform="translate(-122.79197,-20.867417)"
- id="g106636-9"
- style="display:inline;enable-background:new">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient106641-3);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 263.5625,590.375 1.75,-1.5 1.99177,3.7253 1.75,-1 -1.74177,-3.4753 h 2.5 l -6.25,-6.25 z"
- id="path45378-1-5-6-2-9-3"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 263.3125,581.125 7,7.25 h -3 l 1.69346,3.25845 -1.75,1 -1.69346,-3.50845 -2.25,2.25 z"
- id="path17835-7-2-5-1"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 264.15625,583.375 v 5.75"
- id="path17845-9-1-1-8"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g52905"
- transform="translate(398.95001,-42)">
- <rect
- y="367"
- x="-372.95001"
- height="16"
- width="16"
- id="rect52907"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cc"
- id="path52910"
- d="m -368.95,374 5,-5"
- style="fill:none;stroke:#000000;stroke-width:3.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <g
- mask="url(#mask52637-8-8)"
- id="g52912"
- transform="translate(-18.95,-84)">
- <path
- sodipodi:nodetypes="ccccc"
- d="m -352.5,465.5 h 2 c 1.10456,0 2,-0.89543 2,-1.99999 V 462.5 L -351,460"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#3c0800;stroke-width:2.70000005;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path52914"
- inkscape:connector-curvature="0" />
- <path
- id="path52916"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ed7432;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -353.25,465.5 h 2.75 c 1.10456,0 2,-0.89543 2,-1.99999 V 462.5 L -351,460"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- mask="none"
- sodipodi:nodetypes="ccccc"
- d="m -353.25,465.5 h 2.75 c 1.10456,0 2,-0.89543 2,-1.99999 V 462.5 L -351,460"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient52998-5-5);stroke-width:1.5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path52918"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- ry="1.5"
- rx="1.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.26976109;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect52920"
- width="3"
- height="3"
- x="-371.45001"
- y="-376.5"
- transform="scale(1,-1)" />
- <g
- transform="matrix(-1,0,0,1,-711.95,-84)"
- id="g52922"
- mask="url(#mask52879-0-5)">
- <path
- id="path52924"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:2.70000005;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -353.5,465.5 h 3 c 1.10456,0 2,-0.89543 2,-1.99999 V 462.5 L -351,460"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- d="m -354.2,465.5 h 3.7 c 1.10456,0 2,-0.89543 2,-1.99999 V 462.5 L -351,460"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#7be10f;stroke-width:1.5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path52926"
- inkscape:connector-curvature="0" />
- <path
- id="path52928"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient53000-3-9);stroke-width:1.5;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -354.2,465.5 h 3.75 c 1.10456,0 2,-0.89543 2,-1.99999 V 462.5 l -2.5,-2.5"
- sodipodi:nodetypes="ccccc"
- mask="none"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- transform="scale(1,-1)"
- y="-376.5"
- x="-361.45001"
- height="3"
- width="3"
- id="rect52930"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.26976109;stroke-opacity:1;marker:none;enable-background:accumulate"
- rx="1.5"
- ry="1.5" />
- <path
- style="fill:none;stroke:#b3b3b3;stroke-width:2.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -367.7,372.75 3.75,-3.75"
- id="path52932"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <rect
- transform="scale(1,-1)"
- y="-376.5"
- x="-371.45001"
- height="3"
- width="3"
- id="rect52934"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.26976109;stroke-opacity:1;marker:none;enable-background:accumulate"
- rx="1.5"
- ry="1.5" />
- <rect
- ry="1.5"
- rx="1.5"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.26976109;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect52936"
- width="3"
- height="3"
- x="-361.45001"
- y="-376.5"
- transform="scale(1,-1)" />
- <path
- sodipodi:nodetypes="cc"
- id="path52938"
- d="m -368.45,372.5 4,-4 h 1"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <rect
- ry="1.5"
- rx="1.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient53002-6-2);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.26976109;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect52940"
- width="3"
- height="3"
- x="-371.45001"
- y="-376.5"
- transform="scale(1,-1)" />
- <rect
- transform="scale(1,-1)"
- y="-376.5"
- x="-361.45001"
- height="3"
- width="3"
- id="rect52942"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient58927);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.26976109;stroke-opacity:1;marker:none;enable-background:accumulate"
- rx="1.5"
- ry="1.5" />
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(252,-210)"
- id="g52978">
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -198,536 -0.15625,1.90625 c -0.6231,0.14227 -1.07677,0.25145 -1.59375,0.59375 l -1.75,-1.75 -1.75,1.75 1.75,1.75 c -0.34229,0.51699 -0.45148,0.97065 -0.59375,1.59375 L -204,542 v 1 1 l 1.90625,0.15625 c 0.14227,0.6231 0.25145,1.07677 0.59375,1.59375 l -1.75,1.75 1.75,1.75 1.75,-1.75 c 0.51699,0.34229 0.97065,0.45148 1.59375,0.59375 L -198,550 h 1 1 l 0.15625,-1.90625 c 0.6231,-0.14227 1.07677,-0.25145 1.59375,-0.59375 l 1.75,1.75 1.75,-1.75 -1.75,-1.75 c 0.34229,-0.51699 0.45148,-0.97065 0.59375,-1.59375 L -190,544 v -1 -1 l -1.90625,-0.15625 c -0.14227,-0.6231 -0.25145,-1.07677 -0.59375,-1.59375 l 1.75,-1.75 -1.75,-1.75 -1.75,1.75 c -0.51699,-0.34229 -0.97065,-0.45148 -1.59375,-0.59375 L -196,536 h -1 z m 1,4.125 c 1.58782,0 2.875,1.28718 2.875,2.875 0,1.58782 -1.28718,2.875 -2.875,2.875 -1.58782,0 -2.875,-1.28718 -2.875,-2.875 0,-1.58782 1.28718,-2.875 2.875,-2.875 z"
- id="path52980"
- inkscape:connector-curvature="0" />
- <path
- id="path52982"
- d="m -196,550 0.15625,-1.90625 c 0.6231,-0.14227 1.07677,-0.25145 1.59375,-0.59375 l 1.75,1.5 1.5,-1.5 -1.5,-1.75 c 0.34229,-0.51699 0.45148,-0.97065 0.59375,-1.59375 L -190,544 v -1 -1 l -1.90625,-0.15625 c -0.14227,-0.6231 -0.25145,-1.07677 -0.59375,-1.59375 l 1.5,-1.75 -1.5,-1.5 -1.75,1.5 c -0.51699,-0.34229 -0.97065,-0.45148 -1.59375,-0.59375 L -196,536 h -1 -1 l -0.15625,1.90625 c -0.6231,0.14227 -1.07677,0.25145 -1.59375,0.59375 l -1.75,-1.5 -1.5,1.5 1.5,1.75 c -0.34229,0.51699 -0.45148,0.97065 -0.59375,1.59375 L -204,542 v 1 1 l 1.90625,0.15625 c 0.14227,0.6231 0.25145,1.07677 0.59375,1.59375 l -1.5,1.75 1.5,1.5 1.75,-1.5 c 0.51699,0.34229 0.97065,0.45148 1.59375,0.59375 L -198,550 h 1 z m -1,-4 c -1.65685,0 -3,-1.34315 -3,-3 0,-1.65685 1.34315,-3 3,-3 1.65685,0 3,1.34315 3,3 0,1.65685 -1.34315,3 -3,3 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient32854-6-2);fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="535"
- x="-205"
- height="16"
- width="16"
- id="rect52984"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <rect
- ry="6.4999995"
- rx="6.4999995"
- y="539.5"
- x="-200.5"
- height="6.981843"
- width="6.981843"
- id="rect52986"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient32856-3-2);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.26976109;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m -192.5,537.5 -1.25,1.25 m -2.75,-2.25 h -1 v 1.5 c -0.35104,0.0802 -1.50086,0.537 -2,0.75 m -1.75,1.75 c -0.20864,0.49552 -0.67146,1.65605 -0.75,2 h -1.5 v 1 m 1.75,-5.75 -0.5,0.5 m 1,8 -1.25,1.25"
- id="path52988"
- sodipodi:nodetypes="cccccscccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path52990"
- d="m -202.5,538.75 1.25,-1.25"
- style="fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:none;stroke:url(#linearGradient32858-7-2);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.26976109;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect52992"
- width="6.981843"
- height="6.981843"
- x="193.51816"
- y="-546.48187"
- rx="6.4999995"
- ry="6.4999995"
- transform="scale(-1)" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- style="opacity:0.35;fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m -197.5,548.25 v 1.25 m 7,-7 h -1.25"
- id="path52994"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path52996"
- d="m -191.75,547.25 -1,1"
- style="opacity:0.3;fill:none;stroke:#ffffff;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g32860"
- transform="translate(231,-294)">
- <rect
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect32862"
- width="16"
- height="16"
- x="-226"
- y="619" />
- <path
- sodipodi:nodetypes="cccsssscccc"
- style="opacity:0.5;fill:url(#linearGradient32896-0-4);fill-opacity:1;stroke:none"
- d="m -212.5,619.5 h -2 l -6.0625,6.0625 C -220.70928,625.548 -220.84942,625.5 -221,625.5 c -2.48528,0 -4.5,2.01473 -4.5,4.5 0,2.48527 2.01472,4.5 4.5,4.5 2.48528,0 4.5,-2.01473 4.5,-4.5 0,-0.14948 -0.017,-0.29176 -0.0312,-0.4375 L -210.5,623.5 v -2 z"
- id="path32864"
- inkscape:connector-curvature="0" />
- <ellipse
- id="path32866"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient32899-8-3);fill-opacity:1;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- transform="matrix(1.224232,0,0,1.2036922,-1.189782,-154.19619)"
- cx="-179.54948"
- cy="651.49231"
- rx="2.4505157"
- ry="2.4923096" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path32868"
- d="m -219.5,626.5 5.5,-5.5 0.5,-0.5 0.5,0.5 0.5,0.5"
- style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- transform="translate(-21)"
- d="m -193.10547,620.45703 -5.78125,5.78125 a 0.95626367,0.95626367 0 0 1 -0.76953,0.27539 c -0.29297,-0.0289 -0.39637,-0.0566 -0.34375,-0.0566 -1.96853,0 -3.54297,1.57445 -3.54297,3.54297 0,1.96852 1.57444,3.54297 3.54297,3.54297 1.96853,0 3.54297,-1.57445 3.54297,-3.54297 0,-0.0768 -0.01,-0.18622 -0.0254,-0.3457 a 0.95626367,0.95626367 0 0 1 0.27344,-0.76563 l 5.75195,-5.7832 v -1.20899 l -1.43945,-1.43945 z"
- id="path32870"
- style="fill:none;stroke:url(#radialGradient32901-4-9);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:original="M -193.5 619.5 L -199.5625 625.5625 C -199.70928 625.548 -199.84942 625.5 -200 625.5 C -202.48528 625.5 -204.5 627.51473 -204.5 630 C -204.5 632.48527 -202.48528 634.5 -200 634.5 C -197.51472 634.5 -195.5 632.48527 -195.5 630 C -195.5 629.85052 -195.51705 629.70824 -195.53125 629.5625 L -189.5 623.5 L -189.5 621.5 L -191.5 619.5 L -193.5 619.5 z "
- inkscape:radius="-0.95616806"
- sodipodi:type="inkscape:offset" />
- <path
- id="path32872"
- d="m -217,624 v 1 h -1 v 0.0312 h -0.0312 v 0.96875 h -0.96875 v 0.0312 h -0.0312 v 1 h -1 v 1 1 h 1 1 v -1 h 1 v -0.0312 h 0.0312 v -0.96875 h 0.96875 V 627 H -216 v -1 h 1 v -1 h -1 v -1 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient32903-6-4);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.97113496;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <circle
- transform="matrix(1.2638889,0,0,1.2222222,32.853009,-140.1836)"
- id="path32874"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.97113496;marker:none;enable-background:accumulate"
- cx="-202.03252"
- cy="628.93835"
- r="0.80938911" />
- <circle
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.97113496;marker:none;enable-background:accumulate"
- id="path32877"
- transform="matrix(0.77047663,0,0,0.74507628,-63.8586,161.95861)"
- cx="-202.03252"
- cy="628.93835"
- r="0.80938911" />
- <circle
- transform="matrix(0.77047663,0,0,0.74507628,-64.708233,162.88548)"
- id="path32879"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.97113496;marker:none;enable-background:accumulate"
- cx="-202.03252"
- cy="628.93835"
- r="0.80938911" />
- <path
- style="display:inline;opacity:0.35;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -213.5,621.5 -6,6"
- id="path32881"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- id="path32883"
- d="m -212.5,619.5 h -2 l -6.0625,6.0625 C -220.70928,625.548 -220.84942,625.5 -221,625.5 c -2.48528,0 -4.5,2.01473 -4.5,4.5 0,2.48527 2.01472,4.5 4.5,4.5 2.48528,0 4.5,-2.01473 4.5,-4.5 0,-0.14948 -0.017,-0.29176 -0.0312,-0.4375 L -210.5,623.5 v -2 z"
- style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cccsssscccc"
- inkscape:connector-curvature="0" />
- <path
- transform="translate(-21)"
- sodipodi:type="inkscape:offset"
- inkscape:radius="-0.95616806"
- inkscape:original="M -193.5 619.5 L -199.5625 625.5625 C -199.70928 625.548 -199.84942 625.5 -200 625.5 C -202.48528 625.5 -204.5 627.51473 -204.5 630 C -204.5 632.48527 -202.48528 634.5 -200 634.5 C -197.51472 634.5 -195.5 632.48527 -195.5 630 C -195.5 629.85052 -195.51705 629.70824 -195.53125 629.5625 L -189.5 623.5 L -189.5 621.5 L -191.5 619.5 L -193.5 619.5 z "
- style="fill:none;stroke:url(#radialGradient32905-9-5);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path32886"
- d="m -193.10547,620.45703 -5.78125,5.78125 a 0.95626367,0.95626367 0 0 1 -0.76953,0.27539 c -0.29297,-0.0289 -0.39637,-0.0566 -0.34375,-0.0566 -1.96853,0 -3.54297,1.57445 -3.54297,3.54297 0,1.96852 1.57444,3.54297 3.54297,3.54297 1.96853,0 3.54297,-1.57445 3.54297,-3.54297 0,-0.0768 -0.01,-0.18622 -0.0254,-0.3457 a 0.95626367,0.95626367 0 0 1 0.27344,-0.76563 l 5.75195,-5.7832 v -1.20899 l -1.43945,-1.43945 z" />
- <g
- style="opacity:0.3;fill:#ffffff"
- id="g32888">
- <rect
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.20000005;marker:none;enable-background:accumulate"
- id="rect32890"
- width="1"
- height="0.98873287"
- x="-217"
- y="622.98871" />
- <rect
- y="624"
- x="-216"
- height="0.98873287"
- width="1"
- id="rect32892"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.20000005;marker:none;enable-background:accumulate" />
- <rect
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.20000005;marker:none;enable-background:accumulate"
- id="rect32894"
- width="1"
- height="0.98873287"
- x="-215"
- y="624.98871" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_FORCE_WIND"
- transform="translate(72,509.96991)">
- <rect
- y="148"
- x="-46"
- height="16"
- width="16"
- id="rect45977-0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#666666;stroke:none;stroke-width:2.29999995;marker:none;enable-background:accumulate"
- transform="scale(1,-1)" />
- <path
- sodipodi:nodetypes="cscccc"
- id="path43354-7"
- d="m -42,-162.5 c -1.383118,0 -2.5,2.0178 -2.5,4.5 0,2.4822 1.116881,4.5 2.5,4.5 l 9.5,-2 c 1.25,-0.25 1.25,-4.75 0,-5 -3.164485,-0.63789 -6.364604,-1.31719 -9.5,-2 z"
- style="fill:#ffffff;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- id="path43211-1"
- d="m -42.46462,-153.21991 v 4"
- style="display:inline;fill:none;stroke:#000000;stroke-width:2.0999999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- d="m -42,-163.49414 c -1.175382,0 -2.082343,0.82755 -2.638672,1.83008 -0.556328,1.00253 -0.855469,2.27374 -0.855469,3.66406 0,1.39032 0.299141,2.66153 0.855469,3.66406 0.556328,1.00253 1.46329,1.83008 2.638672,1.83008 a 0.9950207,0.9950207 0 0 0 0.205078,-0.0215 l 9.494141,-1.99805 c 0.871742,-0.17681 1.238431,-0.89556 1.445312,-1.50586 0.207277,-0.61147 0.28711,-1.28773 0.28711,-1.96875 0,-0.68102 -0.07983,-1.35728 -0.28711,-1.96875 -0.207032,-0.61075 -0.574142,-1.32971 -1.447265,-1.50586 -3.157727,-0.63653 -6.354407,-1.31599 -9.486328,-1.99805 A 0.9950207,0.9950207 0 0 0 -42,-163.49414 Z"
- id="path43480-7"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:original="M -42 -162.5 C -43.383118 -162.5 -44.5 -160.4822 -44.5 -158 C -44.5 -155.5178 -43.383119 -153.5 -42 -153.5 L -32.5 -155.5 C -31.25 -155.75 -31.25 -160.25 -32.5 -160.5 C -35.664485 -161.13789 -38.864604 -161.81719 -42 -162.5 z "
- inkscape:radius="0.99492121"
- sodipodi:type="inkscape:offset" />
- <g
- id="g43531-7"
- style="fill:#bc2b00;stroke:none">
- <g
- id="g43521-7"
- style="fill:#bc2b00;stroke:none">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#bc2b00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.57082754;marker:none;enable-background:accumulate"
- d="m -94.9375,-169.09375 c -0.02445,0.0114 -0.07282,0.0179 -0.09375,0.0312 -0.07655,0.0171 -0.129072,0.0618 -0.1875,0.0937 -0.06733,0.0426 -0.102853,0.0701 -0.125,0.125 -0.04225,0.0882 -0.02336,0.20307 0.0625,0.28125 0.425481,0.37342 0.870923,1.31835 1.09375,2.46875 0.222825,1.15041 0.26055,2.52729 0.0625,3.8125 -0.229814,1.49133 -0.739166,2.50981 -1.21875,2.875 -0.06733,0.0426 -0.134102,0.10133 -0.15625,0.15625 -0.02264,0.0932 0.04665,0.17736 0.15625,0.25 0.116379,0.0913 0.296118,0.15625 0.5,0.15625 0.203886,0 0.383626,-0.065 0.5,-0.15625 0.05375,-0.0409 0.10617,-0.08 0.15625,-0.125 0.100788,-0.012 0.199646,-0.0299 0.28125,-0.0625 0.05623,-0.0197 0.114869,-0.067 0.15625,-0.0937 0.879891,-0.58512 1.33731,-1.57799 1.59375,-3.03125 0.221887,-1.25745 0.188175,-2.58853 -0.0625,-3.71875 -0.250672,-1.13023 -0.67717,-2.06619 -1.40625,-2.625 -0.07644,-0.0471 -0.164946,-0.10325 -0.28125,-0.125 -0.08767,-0.0266 -0.180589,-0.0253 -0.28125,-0.0312 -0.03116,-0.0302 -0.0613,-0.0653 -0.09375,-0.0937 -0.05975,-0.064 -0.132554,-0.12368 -0.25,-0.15625 -0.124538,-0.0375 -0.266141,-0.0447 -0.40625,-0.0312 z"
- transform="translate(56,6)"
- id="path43515-7"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g43525-3"
- transform="matrix(1,0,0,0.8248704,3.9999996,-27.664792)"
- style="fill:#bc2b00;stroke:none">
- <path
- id="path43527-3"
- style="display:inline;overflow:visible;visibility:visible;fill:#bc2b00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.62850982;marker:none;enable-background:accumulate"
- d="m -38.766635,-163.1299 c -0.1926,0.0198 -0.359499,0.088 -0.454803,0.18574 -0.141826,0.12415 -0.141826,0.2845 0,0.40865 0.393723,0.36252 0.827594,1.30384 1.03955,2.45188 0.211957,1.14804 0.253401,2.50645 0.06497,3.78928 -0.218694,1.48887 -0.72826,2.54519 -1.169495,2.89767 -0.09595,0.0836 -0.129342,0.18561 -0.09271,0.28335 0.03663,0.0977 0.140225,0.18301 0.287629,0.23675 0.146132,0.0549 0.324618,0.074 0.495554,0.053 0.170936,-0.0209 0.320068,-0.0802 0.414052,-0.16446 0.787677,-0.62926 1.137868,-1.68972 1.364411,-3.23203 0.196047,-1.33468 0.156543,-2.73807 -0.06497,-3.93787 -0.221514,-1.1998 -0.582737,-2.18614 -1.234468,-2.78623 -0.130885,-0.13138 -0.387364,-0.2047 -0.649719,-0.18574 v 0 z m 0.338475,0.29257 c -0.244486,0.0286 -0.443513,0.11281 -0.531926,0.22492 -0.08841,0.11212 -0.05483,0.23776 0.08976,0.33579 0.442252,0.33867 0.938861,1.23068 1.179113,2.31292 0.24025,1.08225 0.287292,2.36512 0.07369,3.57452 -0.247925,1.40376 -0.831847,2.40481 -1.326503,2.73346 -0.229933,0.15651 -0.165504,0.37098 0.14739,0.49062 0.163456,0.0637 0.375184,0.0924 0.584711,0.0791 0.209527,-0.0133 0.398079,-0.0673 0.520708,-0.14918 0.899238,-0.59746 1.290496,-1.62825 1.547585,-3.0839 0.222494,-1.25976 0.177718,-2.58217 -0.0737,-3.71469 -0.251412,-1.13252 -0.582944,-2.05893 -1.326502,-2.62833 -0.04216,-0.0265 -0.09175,-0.05 -0.147388,-0.0701 -0.187804,-0.0957 -0.469403,-0.13585 -0.736946,-0.10513 z"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- sodipodi:type="inkscape:offset"
- inkscape:radius="0.99492121"
- inkscape:original="M -42 -162.5 C -43.383118 -162.5 -44.5 -160.4822 -44.5 -158 C -44.5 -155.5178 -43.383119 -153.5 -42 -153.5 L -32.5 -155.5 C -31.25 -155.75 -31.25 -160.25 -32.5 -160.5 C -35.664485 -161.13789 -38.864604 -161.81719 -42 -162.5 z "
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24022-6);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path43484-5"
- d="m -42,-163.49414 c -1.175382,0 -2.082343,0.82755 -2.638672,1.83008 -0.556328,1.00253 -0.855469,2.27374 -0.855469,3.66406 0,1.39032 0.299141,2.66153 0.855469,3.66406 0.556328,1.00253 1.46329,1.83008 2.638672,1.83008 a 0.9950207,0.9950207 0 0 0 0.205078,-0.0215 l 9.494141,-1.99805 c 0.871742,-0.17681 1.238431,-0.89556 1.445312,-1.50586 0.207277,-0.61147 0.28711,-1.28773 0.28711,-1.96875 0,-0.68102 -0.07983,-1.35728 -0.28711,-1.96875 -0.207032,-0.61075 -0.574142,-1.32971 -1.447265,-1.50586 -3.157727,-0.63653 -6.354407,-1.31599 -9.486328,-1.99805 A 0.9950207,0.9950207 0 0 0 -42,-163.49414 Z" />
- <path
- style="display:inline;fill:none;stroke:#999999;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m -42.46462,-152.96991 v 4.5"
- id="path43213-9"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <ellipse
- transform="matrix(2.5815738,0,0,1.0580577,65.140965,9.1698698)"
- id="path43356-9"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24024-4);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.48405313;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="-41.5"
- cy="-158"
- rx="0.9705897"
- ry="4.25" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;enable-background:accumulate"
- id="rect43215-8"
- width="1"
- height="1"
- x="-42.964619"
- y="-152.96989" />
- <path
- d="m -42,-162.59961 c -0.74028,0 -1.392864,0.53746 -1.855469,1.37109 -0.462605,0.83364 -0.74414,1.97239 -0.74414,3.22852 0,1.25613 0.281535,2.39488 0.74414,3.22852 0.462605,0.83363 1.115189,1.37109 1.855469,1.37109 a 0.10019871,0.10019871 0 0 0 0.02148,-0.002 l 9.498047,-2 c 0.369179,-0.0738 0.617909,-0.44188 0.779297,-0.91797 0.161388,-0.4761 0.238281,-1.07715 0.238281,-1.67969 0,-0.60254 -0.07689,-1.20359 -0.238281,-1.67969 -0.161388,-0.47609 -0.410118,-0.84413 -0.779297,-0.91797 -3.163804,-0.63775 -6.363,-1.31726 -9.498047,-2 A 0.10019871,0.10019871 0 0 0 -42,-162.59961 Z"
- id="path43218-1"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient14482-7);stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:original="M -42 -162.5 C -43.383118 -162.5 -44.5 -160.4822 -44.5 -158 C -44.5 -155.5178 -43.383119 -153.5 -42 -153.5 L -32.5 -155.5 C -31.25 -155.75 -31.25 -160.25 -32.5 -160.5 C -35.664485 -161.13789 -38.864604 -161.81719 -42 -162.5 z "
- inkscape:radius="0.10018869"
- sodipodi:type="inkscape:offset" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_FORCE_DRAG"
- transform="translate(189,104.96991)">
- <g
- id="g24558-2">
- <rect
- y="241"
- x="47"
- height="16"
- width="16"
- id="rect24365-6"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.10000002;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccccccccccsss"
- id="path24370-6"
- d="m 60.5,253 -1,0.5 -0.998035,-1 -7e-6,-2 -0.999999,-1 H 55.25 l -0.75,-0.75 0.002,-2.25 -1.000001,-1 h -1.999993 l -1.001965,-0.75 0.498035,-1 c 1.618614,-3.25 6.964866,-2.7871 9.501965,-0.25 2.5371,2.53709 3,8 0,9.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24044-1);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccccsccsccccc"
- id="path24406-0"
- d="m 55.40625,241.84375 c -1.752306,-0.0251 -3.360906,0.59103 -4.09375,2.0625 l -0.15625,0.3125 c -0.122559,0.2366 -0.05653,0.52711 0.15625,0.6875 l 0.15625,0.125 c 0.100886,0.0688 0.221909,0.1018 0.34375,0.0937 H 53.5 c 0.01042,3e-4 0.02083,3e-4 0.03125,0 0.09863,-0.003 0.17826,0.0573 0.25,0.125 l 1,0.96875 c 0.06775,0.0718 0.09659,0.15137 0.09375,0.25 -2.98e-4,0.0104 -2.98e-4,0.0208 0,0.0312 v 2.09375 l 0.375,0.15625 4.96875,-4.96875 c -1.186918,-1.18692 -3.03835,-1.91206 -4.8125,-1.9375 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24046-9);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- style="opacity:0.82999998"
- id="g24372-3"
- transform="translate(21)"
- mask="url(#mask25021-4)">
- <path
- id="path24374-8"
- style="display:inline;fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 30,246.5 -2,7 1.5,1.5 7,-2 m -3.5,-3 -4.5,4.5"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path24380-0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#radialGradient24048-2);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="M 34.25,248.75 28.5,254.5"
- mask="none"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- mask="none"
- d="m 30.5,244.75 -2.5,8.75 1.5,1.5 8.75,-2.5"
- style="display:inline;fill:none;stroke:url(#radialGradient24050-4);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- id="path24448-1"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="cccccccccccccccccssc"
- id="path24408-2"
- d="m 55.40625,242.375 c -1.622878,-0.0233 -2.972755,0.53436 -3.59375,1.78125 l -0.15625,0.3125 0.15625,0.125 H 53.5 c 0.243249,-0.007 0.479315,0.0829 0.65625,0.25 l 1,1 c 0.167073,0.17694 0.257003,0.413 0.25,0.65625 L 55.5,248 l 0.5,0.5 1.5,0.0937 c 0.243249,-0.007 0.479315,0.0829 0.65625,0.25 l 1,1 c 0.167073,0.17694 0.257003,0.413 0.25,0.65625 v 1.59375 l 0.28125,0.28125 0.40625,-0.1875 c 1.084704,-0.54235 1.613412,-1.88556 1.5625,-3.53125 -0.05091,-1.64569 -0.757004,-3.44451 -1.8125,-4.5 -1.05838,-1.05838 -2.814635,-1.75798 -4.4375,-1.78125 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient24053-5);stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0.5;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate"
- id="rect24450-5"
- width="2"
- height="1"
- x="50"
- y="245" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate"
- id="rect24452-0"
- width="1"
- height="1"
- x="54"
- y="248" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate"
- id="rect24454-9"
- width="1"
- height="1"
- x="55"
- y="249" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate"
- id="rect24456-4"
- width="1"
- height="2"
- x="58"
- y="252" />
- <rect
- y="249"
- x="54"
- height="1"
- width="1"
- id="rect24659-7"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g24384-8"
- transform="matrix(0.3350147,0,0,0.3350147,6.410699,179.66413)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path24396-3"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff541f;fill-opacity:1;fill-rule:nonzero;stroke:#320b00;stroke-width:3.58193231;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.6;fill:url(#linearGradient24055-1);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path24398-5"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.6011908,-0.06817113,0.06852359,-0.6012277,199.77148,303.44348)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.4463965,0,0,0.4463971,69.575658,170.82515)"
- id="path24400-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:none;stroke:url(#linearGradient24057-7);stroke-width:6.6867547;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_FORCE_TURBULENCE"
- transform="matrix(-1,0,0,1,185,310)">
- <rect
- transform="scale(1,-1)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#666666;stroke:none;stroke-width:2.29999995;marker:none;enable-background:accumulate"
- id="rect44017-0"
- width="16"
- height="16"
- x="-46"
- y="-52" />
- <g
- style="opacity:0.8"
- id="g43226-1">
- <g
- id="g43115-6"
- clip-path="url(#clipPath43135-6)"
- mask="url(#mask43188-4)">
- <path
- d="m -45.5,42.5 1,1 3,-1 0.75,1 h 1.25 l 1,1 v 2 l 2,2 -2,2 v 1"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path43103-4"
- sodipodi:nodetypes="cccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccccccc"
- id="path43099-0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -45.5,42.5 1,1 3,-1 0.75,1 h 1.25 l 1,1 v 2 l 2,2 -2,2 v 1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- mask="url(#mask43182-5)"
- clip-path="url(#clipPath43178-6)"
- id="g43206-6">
- <path
- d="m -45.5,42.5 1,1 3,-1 0.75,1 h 1.25 l 1,1 v 3 l 2,2 -1,1 -1,1"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path43208-1"
- sodipodi:nodetypes="cccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccccccc"
- id="path43210-8"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -45.5,42.5 1,1 3,-1 0.75,1 h 1.25 l 1,1 v 3 l 2,2 -1,1 -1,1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="g43218-9">
- <g
- id="g43129-8"
- clip-path="url(#clipPath43178-6)"
- mask="url(#mask43182-5)">
- <path
- sodipodi:nodetypes="cccccccccccccccc"
- id="path43131-4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -45.5,37.5 h 3 v 1 h 3 l 1,-1 2,2 v 1 l 1,1 h 2 l 1,1 v 1 l -1,1 v 2 l 2,2 v 2 l -1,1"
- inkscape:connector-curvature="0" />
- <path
- d="m -45.5,37.5 h 3 v 1 h 3 l 1,-1 2,2 v 1 l 1,1 h 2 l 1,1 v 1 l -1,1 v 2 l 2,2 v 2 l -1,1"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path43133-1"
- sodipodi:nodetypes="cccccccccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- mask="url(#mask43188-4)"
- clip-path="url(#clipPath43135-6)"
- id="g43212-4">
- <path
- sodipodi:nodetypes="ccccccccccccccc"
- id="path43214-3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -45.5,37.5 h 3 v 1 h 3 l 1,-1 2,2 v 1 l 1,1 h 2 l 1,1 -1,1 v 3 l 2,2 v 2 l -1,1"
- inkscape:connector-curvature="0" />
- <path
- d="m -45.5,37.5 h 3 v 1 h 3 l 1,-1 2,2 v 1 l 1,1 h 2 l 1,1 -1,1 v 3 l 2,2 v 2 l -1,1"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.39999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path43216-9"
- sodipodi:nodetypes="ccccccccccccccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g29725-8"
- transform="matrix(-0.3350147,0,0,0.3350147,-0.450611,-25.365697)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path29727-8"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff541f;fill-opacity:1;fill-rule:nonzero;stroke:#320b00;stroke-width:3.58193231;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.6;fill:url(#linearGradient24210-1);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path29729-0"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.6011908,-0.06817113,0.06852359,-0.6012277,199.77148,303.44348)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.4463965,0,0,0.4463971,69.575658,170.82515)"
- id="path29731-8"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:none;stroke:url(#linearGradient24212-8);stroke-width:6.6867547;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- transform="translate(0,336)"
- style="display:inline;enable-background:new"
- id="ICON_FORCE_FORCE">
- <g
- transform="translate(51,10)"
- style="opacity:0.8"
- id="g44612-7">
- <rect
- transform="scale(1,-1)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#666666;stroke:none;stroke-width:2.29999995;marker:none;enable-background:accumulate"
- id="rect44610-8"
- width="16"
- height="16"
- x="-46"
- y="-16" />
- <g
- id="g44566-3"
- transform="translate(0,22)">
- <g
- transform="translate(0,0.02014865)"
- inkscape:transform-center-x="6.4341195"
- id="g44395-8">
- <g
- id="g44383-3"
- inkscape:transform-center-x="6.4130439"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <g
- inkscape:transform-center-x="6.4130439"
- id="g44315-7" />
- </g>
- <g
- id="g44401-1"
- inkscape:transform-center-x="-6.4341194"
- transform="rotate(180,-38,-13.973929)">
- <g
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:transform-center-x="6.4130439"
- id="g44403-0" />
- <g
- id="g44407-7"
- inkscape:transform-center-x="6.4130439" />
- </g>
- <g
- inkscape:transform-center-y="-6.3979735"
- id="g44425-3"
- transform="rotate(90,-38.010075,-13.973929)">
- <g
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:transform-center-x="6.4130439"
- id="g44427-4" />
- <g
- id="g44431-9"
- inkscape:transform-center-x="6.4130439" />
- </g>
- <g
- inkscape:transform-center-y="6.4702655"
- transform="rotate(-90,-37.989925,-13.973929)"
- id="g44435-6">
- <g
- id="g44437-5"
- inkscape:transform-center-x="6.4130439"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <g
- inkscape:transform-center-x="6.4130439"
- id="g44441-1" />
- </g>
- <g
- inkscape:transform-center-y="-4.4797485"
- id="g44532-0">
- <g
- inkscape:transform-center-y="-4.4797485"
- id="g44511-9"
- transform="rotate(135,-38.014759,-13.984515)"
- inkscape:transform-center-x="-4.4797485">
- <g
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:transform-center-x="6.4130439"
- id="g44514-9" />
- <g
- id="g44518-6"
- inkscape:transform-center-x="6.4130439" />
- </g>
- <g
- inkscape:transform-center-x="4.4797488"
- transform="rotate(45,-37.998762,-13.948371)"
- id="g44522-8"
- inkscape:transform-center-y="-4.4797486">
- <g
- id="g44524-3"
- inkscape:transform-center-x="6.4130439"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <g
- inkscape:transform-center-x="6.4130439"
- id="g44528-4" />
- </g>
- </g>
- <g
- transform="rotate(180,-37.997716,-14)"
- id="g44544-8"
- inkscape:transform-center-y="4.4797485">
- <g
- inkscape:transform-center-x="-4.4797485"
- transform="rotate(135,-38.014759,-13.984515)"
- id="g44546-4"
- inkscape:transform-center-y="-4.4797485">
- <g
- id="g44548-9"
- inkscape:transform-center-x="6.4130439"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <g
- inkscape:transform-center-x="6.4130439"
- id="g44552-9" />
- </g>
- <g
- inkscape:transform-center-y="-4.4797486"
- id="g44556-2"
- transform="rotate(45,-37.998762,-13.948371)"
- inkscape:transform-center-x="4.4797488">
- <g
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:transform-center-x="6.4130439"
- id="g44558-5">
- <path
- d="m 139.82809,116.3993 c 0.21326,1.04297 0.21596,2.11803 0.008,3.16206 m -6.21068,6.20286 c -1.04294,0.21326 -2.11797,0.21596 -3.16197,0.008 m -6.20664,-6.20689 c -0.21326,-1.04297 -0.21596,-2.11803 -0.008,-3.16206 m 6.21068,-6.20286 c 1.04294,-0.21326 2.11797,-0.21596 3.16196,-0.008 m 5.10366,12.24081 c -0.58667,0.88829 -1.34493,1.65039 -2.23019,2.24157 m -11.07625,-11.07658 c 0.58667,-0.88829 1.34492,-1.65038 2.23019,-2.24157 m 8.8404,0.006 c 0.88827,0.58669 1.65034,1.34497 2.24151,2.23026 m -11.07626,11.07657 c -0.88826,-0.58669 -1.65033,-1.34496 -2.2415,-2.23025"
- style="display:inline;overflow:visible;visibility:visible;stroke:#000000;stroke-width:3.44192362;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;marker:none;enable-background:accumulate"
- transform="matrix(-0.8135104,0,0,-0.8134867,69.383376,81.991427)"
- id="path44560-5"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g44562-3"
- inkscape:transform-center-x="6.4130439">
- <path
- d="m 139.86607,116.59777 c 0.16588,0.93061 0.16532,1.88326 -0.002,2.81367 m -6.43712,6.39076 c -0.93059,0.16588 -1.88321,0.16532 -2.81359,-0.002 m -6.39454,-6.43334 c -0.16588,-0.93061 -0.16532,-1.88326 0.002,-2.81367 m 6.43712,-6.39076 c 0.93058,-0.16588 1.88321,-0.16532 2.81359,0.002 m 5.25357,12.26879 c -0.58667,0.88829 -1.34493,1.65039 -2.23019,2.24157 m -11.07625,-11.07658 c 0.58667,-0.88829 1.34492,-1.65038 2.23019,-2.24157 m 8.8404,0.006 c 0.88827,0.58669 1.65034,1.34497 2.24151,2.23026 m -11.07626,11.07657 c -0.88826,-0.58669 -1.65033,-1.34496 -2.2415,-2.23025"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.72096181;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(-0.8135104,0,0,-0.8134867,69.383376,81.991427)"
- id="path44564-3"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- </g>
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.4200287,0,0,0.4200289,-40.97369,-75.87647)"
- id="g45379-3"
- style="display:inline;enable-background:new">
- <circle
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- style="fill:#ff541f;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2.5395081;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path45381-7"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.6011908,-0.06817113,0.06852359,-0.6012277,199.77148,303.44348)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path45383-4"
- style="display:inline;fill:url(#linearGradient24214-1);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:none;stroke:url(#linearGradient24216-4);stroke-width:5.33335066;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="path45385-3"
- transform="matrix(0.4463965,0,0,0.4463971,69.575658,170.82515)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_FORCE_TEXTURE"
- transform="translate(198,390)">
- <g
- mask="url(#mask45447-7)"
- transform="translate(-261,-409)"
- id="g15201-1-0"
- style="display:inline;opacity:0.8;enable-background:new">
- <rect
- y="365"
- x="215"
- height="16"
- width="16"
- id="rect15183-3-8"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="translate(167.99999,-62.999991)"
- id="g15185-8-8">
- <rect
- ry="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect15187-7-0"
- width="13.016124"
- height="12.953857"
- x="48.499996"
- y="429.54614" />
- <rect
- y="430"
- x="50.016117"
- height="11.046139"
- width="11.000001"
- id="rect15189-4-6"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24218-1);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00207269;marker:none;enable-background:accumulate"
- ry="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24220-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 49,430 v 3 h 3 v -3 z m 3,3 v 3 h 3 v -3 z m 3,0 h 3 v -3 h -3 z m 3,0 v 3 h 3 v -3 z m 0,3 h -3 v 3 h 3 z m 0,3 v 3 h 3 v -3 z m -3,0 h -3 v 3 h 3 z m -3,0 v -3 h -3 v 3 z"
- id="path15191-2-8"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient24222-6);stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="M 60.517703,430.5 H 49.499999 v 11 h 11.017704 v -11"
- id="path15193-7-1"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <rect
- y="429.54614"
- x="48.499996"
- height="12.953857"
- width="13.016124"
- id="rect45403-9"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient24224-0);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- ry="0" />
- </g>
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.4200287,0,0,0.4200289,-86.973687,-124.87647)"
- id="g45391-8"
- style="display:inline;enable-background:new">
- <circle
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff541f;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2.5395081;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path45393-9"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.6011908,-0.06817113,0.06852359,-0.6012277,199.77148,303.44348)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path45395-7"
- style="display:inline;fill:url(#linearGradient24226-2);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:none;stroke:url(#linearGradient24228-5);stroke-width:5.33335066;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="path45397-2"
- transform="matrix(0.4463965,0,0,0.4463971,69.575658,170.82515)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_FORCE_VORTEX"
- transform="matrix(-1,0,0,1,16.999998,490)">
- <rect
- transform="scale(1,-1)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#666666;stroke:none;stroke-width:2.29999995;marker:none;enable-background:accumulate"
- id="rect45977-5-8"
- width="16"
- height="16"
- x="-46"
- y="128" />
- <g
- mask="url(#mask45865-7)"
- style="opacity:0.95"
- id="g45749-2">
- <path
- sodipodi:nodetypes="cssssssc"
- id="path45716-8"
- d="m -37.991001,-135.06482 c -0.756259,0.48145 -1.648418,-0.21174 -1.880274,-0.94014 -0.414735,-1.30293 0.637877,-2.55676 1.880274,-2.82041 1.823267,-0.38691 3.481311,1.06592 3.760547,2.82041 0.372178,2.33846 -1.494127,4.41212 -3.760547,4.70069 -2.852058,0.36313 -5.346025,-1.9223 -5.640821,-4.70069 -0.357038,-3.365 2.346435,-6.33509 5.640821,-6.58096 3.825581,-0.28552 7.055689,2.67913 7.813138,6.13556"
- style="fill:none;stroke:#000000;stroke-width:2.77754736;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- transform="matrix(0.6590823,0.8571222,-0.8500307,0.6645808,-129.57187,-12.997286)"
- inkscape:connector-curvature="0" />
- <path
- transform="matrix(0.6590823,0.8571222,-0.8500307,0.6645808,-129.57187,-12.997286)"
- style="fill:none;stroke:#ffffff;stroke-width:1.1110189;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -37.991001,-135.06482 c -0.756259,0.48145 -1.648418,-0.21174 -1.880274,-0.94014 -0.414735,-1.30293 0.637877,-2.55676 1.880274,-2.82041 1.823267,-0.38691 3.481311,1.06592 3.760547,2.82041 0.372178,2.33846 -1.494127,4.41212 -3.760547,4.70069 -2.852058,0.36313 -5.346025,-1.9223 -5.640821,-4.70069 -0.357038,-3.365 2.346435,-6.33509 5.640821,-6.58096 3.825581,-0.28552 7.055689,2.67913 7.813138,6.13556"
- id="path45712-9"
- sodipodi:nodetypes="cssssssc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g29693-0"
- transform="matrix(-1,0,0,1,-78.286205,4.2655334)">
- <rect
- rx="1.4999387"
- ry="1.4999387"
- y="-141.76553"
- x="-39.799313"
- height="3"
- width="2.9998772"
- id="rect29695-7"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#5a0d00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path29697-8"
- d="m -37.299433,-141.26553 -1.999997,1e-5 v 1.99999 l 1.999997,-10e-6 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff541f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path29699-1"
- d="m -38.799427,-139.76553 v -1 h 0.999994"
- style="display:inline;opacity:0.45;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m -38.29943,-141.26553 -1,1e-5 v 0.99999 h 1 z"
- id="path29701-5"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_FORCE_CHARGE"
- transform="translate(156,308)">
- <rect
- transform="scale(1,-1)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#666666;stroke:none;stroke-width:2.29999995;marker:none;enable-background:accumulate"
- id="rect46015-6"
- width="16"
- height="16"
- x="-46"
- y="-54" />
- <g
- id="g45118-1">
- <g
- id="g45099-2"
- transform="translate(0,6.9866005)">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.6645615,0,0,0.6645596,-126.90026,-106.03317)"
- id="g37580-2-4"
- style="display:inline;enable-background:new">
- <circle
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff541f;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:1.60507059;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path37582-3-2"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.683022,-0.07745026,0.0778507,-0.683064,209.4726,314.325)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path37584-3-5"
- style="display:inline;opacity:0.6;fill:url(#linearGradient24230-5);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:none;stroke:url(#linearGradient24232-9);stroke-width:2.66303396;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="path38120-7-4-8"
- transform="matrix(0.5650525,0,0,0.5650532,53.91307,156.82373)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- style="opacity:0.5;fill:#ffd5d5"
- id="g45083-6">
- <rect
- ry="0.88169974"
- rx="0.88169974"
- y="42.25"
- x="-44"
- height="1.7633995"
- width="5.5"
- id="rect45079-2"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffd5d5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000083;marker:none;enable-background:new" />
- <rect
- ry="0.875"
- rx="0.97123623"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffd5d5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000083;marker:none;enable-background:new"
- id="rect45081-6"
- width="5.5"
- height="1.75"
- x="40"
- y="40"
- transform="rotate(90)" />
- </g>
- <rect
- y="41.986599"
- x="-44.006248"
- height="1.0133995"
- width="5.0062485"
- id="rect45067-5"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000083;marker:none;enable-background:new" />
- <rect
- transform="rotate(-90)"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000083;marker:none;enable-background:new"
- id="rect45069-3"
- width="4.9865952"
- height="1.0133995"
- x="-44.986595"
- y="-42.009823" />
- </g>
- <g
- id="g45110-9"
- transform="translate(0,-6.986599)">
- <g
- style="display:inline;enable-background:new"
- id="g44887-2"
- transform="matrix(0.6610822,0,0,0.6610806,-119.47405,-98.276513)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path44889-4"
- style="fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.61351788;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;fill:url(#linearGradient24234-7);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path44891-6"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.683022,-0.07745026,0.0778507,-0.683064,209.4726,314.325)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.5719769,0,0,0.5719777,52.999044,156.00665)"
- id="path44893-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:2.64463997;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <rect
- ry="1.0066998"
- rx="1.0066998"
- y="49"
- x="-37"
- height="2.0133996"
- width="5.5"
- id="rect45087-8"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000083;marker:none;enable-background:new" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000083;marker:none;enable-background:new"
- id="rect45077-2"
- width="5.0062485"
- height="1.0133995"
- x="-37.006248"
- y="48.986599" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_FORCE_CURVE"
- transform="translate(168,176)">
- <rect
- ry="0"
- rx="0"
- y="170"
- x="5"
- height="16"
- width="16"
- id="rect42080-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- mask="url(#mask43040-7)"
- transform="translate(51.040182,194)"
- id="g42934-9">
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="csc"
- id="path42084-7"
- d="m -43,-12 c 4.5365,0 10.5,-1.75 10.5,-6 0,-1.75 -1.25,-4 -5.5,-4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#3c0800;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#3c0800;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect42088-6"
- width="2.9998772"
- height="3"
- x="-39.499878"
- y="-23.5"
- ry="1.4999387"
- rx="1.4999387" />
- <rect
- rx="1.4999387"
- ry="1.4999387"
- y="-13.5"
- x="-44.499878"
- height="3"
- width="2.9998772"
- id="rect42092-2"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#5a0d00;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ed5e32;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -43,-12 c 4.5365,0 10.5,-1.75 10.5,-6 0,-1.75 -1.25,-4 -5.5,-4"
- id="path42142-9"
- sodipodi:nodetypes="csc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient24236-2);stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -43,-12 c 4.5365,0 10.5,-1.75 10.5,-6 0,-1.75 -1.25,-4 -5.5,-4"
- id="path42140-5"
- sodipodi:nodetypes="csc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42094-2"
- d="m -42,-13 c -0.67541,0 -1.35081,10e-6 -2.02623,10e-6 0,0.66939 0,1.33877 0,2.00817 0.67542,0 1.35082,-10e-6 2.02623,-10e-6 0,-0.66939 0,-1.33878 0,-2.00817 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff541f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ff8d69;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m -37,-23 c -0.65334,0 -1.30668,10e-6 -1.96003,10e-6 0,0.66667 0,1.33332 0,1.99999 0.65335,0 1.30669,-10e-6 1.96003,-10e-6 0,-0.66666 0,-1.33332 0,-1.99999 z"
- id="path42096-0"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m -38.5,-21.5 v -1 h 1"
- id="path42098-0"
- inkscape:connector-curvature="0" />
- <path
- id="path42100-3"
- d="m -43.52623,-11.5 v -1 h 1"
- style="display:inline;opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42102-9"
- d="m -36,-20.48792 c -0.32001,0 -0.64002,-10e-6 -0.96003,-10e-6 0,-0.63982 0,-1.27964 0,-1.91948 0.32001,0 0.64002,10e-6 0.96003,10e-6 0,0.63983 0,1.27966 0,1.91948 z"
- style="display:inline;opacity:0.15;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ff541f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m -40.999878,-11 c -0.32001,0 -0.64002,0 -0.96003,0 0,-0.21055 0,-0.42107 0,-0.63162 0.32001,0 0.64002,0 0.96003,0 0,0.21055 0,0.42107 0,0.63162 z"
- id="path42104-1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42106-8"
- d="m -40.999878,-11.33707 c -0.32001,0 -0.64002,-10e-6 -0.96003,-10e-6 0,-0.55431 0,-1.1086 0,-1.66292 0.32001,0 0.64002,10e-6 0.96003,10e-6 0,0.55431 0,1.10861 0,1.66292 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:#ff541f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g44965-1"
- transform="matrix(0.5000262,0,0,0.5000067,-54.73874,70.74849)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path44967-9"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.13326335;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;fill:url(#linearGradient24239-1);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path44969-5"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.683022,-0.07745026,0.0778507,-0.683064,209.4726,314.325)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.4963171,0,0,0.4963178,62.986138,164.93452)"
- id="path44971-3"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:4.0295496;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_FORCE_LENNARDJONES"
- transform="translate(177,410)">
- <rect
- transform="scale(1,-1)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#666666;stroke:none;stroke-width:2.29999995;marker:none;enable-background:accumulate"
- id="rect43157-5"
- width="16"
- height="16"
- x="-46"
- y="48" />
- <g
- id="g43221-2"
- transform="matrix(1.1891377,0,0,1.189137,-45.334548,102.47504)"
- style="display:inline;enable-background:new">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path43224-5"
- style="fill:#dcdcdc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.86864018;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.3150215,0,0,0.3150217,-36.662669,-174.25239)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.79000005;fill:url(#linearGradient24241-6);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path43226-8"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.2610878,-0.02960567,0.02975872,-0.2611039,35.872259,-102.36161)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.2102357,0,0,0.2102362,-22.830954,-161.8877)"
- id="path43228-6"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:none;stroke:url(#linearGradient24243-1);stroke-width:4.00001144;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- transform="matrix(0.9963903,0,0,1,-2.1155075,0)"
- id="g43169-7">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path43170-7"
- style="fill:#ff5b29;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:1.6028651;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.5625217,0,0,0.5624997,-110.25304,-122.37496)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;fill:url(#linearGradient24245-3);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path43172-2"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.5000291,-0.05669783,0.0569932,-0.5000402,23.278522,10.488883)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.4374781,0,0,0.4374622,-93.747286,-107.62054)"
- id="path43174-2"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.65;fill:none;stroke:url(#linearGradient24247-8);stroke-width:2.29000854;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- transform="matrix(0,-1,-1,0,-93.999999,-92)"
- id="g42385-9">
- <path
- sodipodi:nodetypes="csscc"
- id="path42387-4"
- d="m -36.5,-51.499999 c -0.5,1 -1.34258,1.996832 -2.996831,1.996832 -1.654251,0 -3,-1.345743 -3,-2.999994 0,-1.308742 0.996831,-2.496838 1.996831,-2.996838 z"
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient24249-9);stroke-width:0.89999998;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient24251-6);fill-opacity:1;fill-rule:nonzero"
- d="m -36.5,-51.499999 c -0.5,1 -1.34258,1.996832 -2.996831,1.996832 -1.654251,0 -2.996872,-1.345746 -3,-2.999994 C -42.5,-54.175184 -41.5,-54.999999 -40.5,-55.499999 Z"
- id="path43279-1"
- sodipodi:nodetypes="csscc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccsss"
- id="path42392-9"
- d="m -40.75,-54.249999 3,3 c -0.25,0.25 -0.659057,0.708509 -1.758414,0.708509 -1.099355,0 -1.991586,-0.877412 -1.991586,-1.958509 0,-1.081096 0.5,-1.5 0.75,-1.75 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:none;stroke:url(#linearGradient24253-0);stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(1.1891377,0,0,1.189137,-39.353927,107.5067)"
- id="g43258-6"
- style="display:inline;enable-background:new">
- <circle
- transform="matrix(0.3150215,0,0,0.3150217,-36.662669,-174.25239)"
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient24255-6);stroke-width:2.40253735;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path43260-9"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.2610878,-0.02960567,0.02975872,-0.2611039,35.872259,-102.36161)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path43262-8"
- style="display:inline;fill:url(#linearGradient24257-6);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:none;stroke:url(#linearGradient24259-1);stroke-width:4.00001144;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="path43264-2"
- transform="matrix(0.2102357,0,0,0.2102362,-22.830954,-161.8877)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(135,431)"
- id="ICON_FORCE_HARMONIC">
- <rect
- transform="scale(1,-1)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#666666;stroke:none;stroke-width:2.29999995;marker:none;enable-background:accumulate"
- id="rect49020-5"
- width="16"
- height="16"
- x="-46"
- y="69" />
- <g
- id="g49022-4"
- style="opacity:0.5">
- <g
- id="g49024-9"
- mask="url(#mask48816-8)"
- style="display:inline;opacity:0.4;enable-background:new">
- <path
- id="path49027-1"
- d="M -42.5,-79.5 -32,-83"
- style="fill:none;stroke:#2b0800;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ff8d73;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M -42.5,-79.5 -32,-83"
- id="path49031-2"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g49034-5">
- <g
- style="display:inline;enable-background:new"
- id="g49036-0"
- transform="matrix(1.1891377,0,0,1.189137,-48.353927,83.503529)">
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path49039-8"
- style="fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.13558888;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.3150215,0,0,0.3150217,-36.662669,-174.25239)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;fill:url(#linearGradient24279-6);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path49043-3"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.2610878,-0.02960567,0.02975872,-0.2611039,35.872259,-102.36161)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.2102357,0,0,0.2102362,-22.830954,-161.8877)"
- id="path49045-9"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient24281-3);stroke-width:4.00001144;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- </g>
- <g
- id="g49048-3"
- style="opacity:0.8">
- <g
- style="opacity:0.5"
- mask="url(#mask48816-8)"
- id="g49050-9">
- <path
- sodipodi:nodetypes="cc"
- style="fill:none;stroke:#2b0800;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M -39.5,-75.5 -32,-83"
- id="path49055-6"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path49057-7"
- d="M -39.5,-75.5 -32,-83"
- style="fill:none;stroke:#ff8d73;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g49059-9">
- <g
- transform="matrix(1.1891377,0,0,1.189137,-45.367039,87.538326)"
- id="g49061-9"
- style="display:inline;enable-background:new">
- <circle
- transform="matrix(0.3150215,0,0,0.3150217,-36.662669,-174.25239)"
- style="fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.13558888;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path49065-7"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.2610878,-0.02960567,0.02975872,-0.2611039,35.872259,-102.36161)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path49067-6"
- style="display:inline;fill:url(#linearGradient24283-7);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient24285-8);stroke-width:4.00001144;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="path49069-9"
- transform="matrix(0.2102357,0,0,0.2102362,-22.830954,-161.8877)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- </g>
- <g
- id="g49071-3">
- <g
- id="g49073-5"
- mask="url(#mask28585-8)">
- <path
- id="path49075-7"
- d="M -34.5,-72.5 -32,-83"
- style="fill:none;stroke:#2b0800;stroke-width:2.70000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ff8d73;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M -34.5,-72.5 -32,-83"
- id="path49077-6"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="matrix(1.1891377,0,0,1.189137,-40.353927,90.509865)"
- id="g49079-6"
- style="display:inline;enable-background:new">
- <circle
- transform="matrix(0.3150215,0,0,0.3150217,-36.662669,-174.25239)"
- style="fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.13558888;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path49082-5"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.2610878,-0.02960567,0.02975872,-0.2611039,35.872259,-102.36161)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path49084-8"
- style="display:inline;fill:url(#linearGradient24287-1);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient24289-3);stroke-width:4.00001144;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="path49086-2"
- transform="matrix(0.2102357,0,0,0.2102362,-22.830954,-161.8877)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(6.299313,57.265533)"
- id="g49088-5">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#5a0d00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect49090-4"
- width="2.9998772"
- height="3"
- x="-39.799313"
- y="-141.76553"
- ry="1.4999387"
- rx="1.4999387" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ff541f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000072;marker:none;enable-background:accumulate"
- d="m -37.299433,-141.26553 c -0.65334,0 -1.30668,1e-5 -1.96003,1e-5 0,0.66667 0,1.33332 0,1.99999 0.65335,0 1.30669,-10e-6 1.96003,-10e-6 0,-0.66666 0,-1.33332 0,-1.99999 z"
- id="path49092-4"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.45;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="m -38.799433,-139.76553 v -1 h 1"
- id="path49094-1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_FORCE_BOID"
- transform="translate(189,147)">
- <g
- transform="translate(51,203)"
- id="g45912-1">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect35680-9-6"
- width="16"
- height="16"
- x="-46"
- y="-4" />
- <g
- style="display:inline;opacity:0.95;enable-background:new"
- transform="translate(-491,-214.9763)"
- id="g35844-1-3"
- inkscape:transform-center-x="-0.78726"
- inkscape:transform-center-y="2.2787562">
- <path
- style="opacity:0.95;fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 454.5,218.5 c -1.25,-1.5 -2.5,-1.5 -4,1 -1.5,-2.5 -2.75,-2.5 -4,-1"
- id="path35846-9-3"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path35848-8-5"
- d="m 454.5,218.5 c -1.25,-1.5 -2.5,-1.5 -4,1 -1.5,-2.5 -2.75,-2.5 -4,-1"
- style="fill:none;stroke:#f2f2f2;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;enable-background:accumulate"
- id="rect35914-6-5"
- width="1"
- height="2"
- x="450"
- y="217.9763" />
- <rect
- y="217.9763"
- x="449.25"
- height="1"
- width="0.75"
- id="rect35916-5-3"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;enable-background:accumulate"
- id="rect35919-0-2"
- width="0.75"
- height="1"
- x="451"
- y="217.9763" />
- </g>
- <g
- id="g38276-9-8"
- transform="translate(-324,-461)">
- <path
- sodipodi:nodetypes="ccc"
- id="path35702-0-2"
- d="m 292.5,459.5 c -1.25,-1.5 -3.5,-1.5 -5,1 -1.5,-2.5 -3.75,-2.5 -5,-1"
- style="opacity:0.95;fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#ececec;stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 292.5,459.5 c -1.25,-1.5 -3.5,-1.5 -5,1 -1.5,-2.5 -3.75,-2.5 -5,-1"
- id="path35704-0-5"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <rect
- y="459"
- x="287"
- height="2"
- width="1"
- id="rect35908-6-3"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;enable-background:accumulate"
- id="rect35910-1-6"
- width="0.75"
- height="1"
- x="286.25"
- y="459" />
- <rect
- y="459"
- x="288"
- height="1"
- width="0.75"
- id="rect35912-3-1"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;enable-background:accumulate" />
- </g>
- <g
- style="display:inline;opacity:0.9;enable-background:new"
- transform="translate(-484,-209.97631)"
- id="g45582-8"
- inkscape:transform-center-x="-0.78726"
- inkscape:transform-center-y="2.2787562">
- <path
- style="opacity:0.95;fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 452.5,218.47631 -1,-1 -2,2 -2,-2 -1,1.02369"
- id="path45584-6"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path45586-2"
- d="m 452.5,218.47631 -1,-1 -2,2 -2,-2 -1,1.02369"
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;enable-background:accumulate"
- id="rect45588-1"
- width="1"
- height="1.4999862"
- x="449"
- y="218.4763" />
- <rect
- y="217.9763"
- x="448"
- height="0.99998617"
- width="1"
- id="rect45590-4"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;enable-background:accumulate"
- id="rect45592-6"
- width="1"
- height="0.99998617"
- x="447"
- y="216.9763" />
- <rect
- y="217.9763"
- x="446"
- height="0.99998617"
- width="1"
- id="rect45594-2"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;enable-background:accumulate"
- id="rect45596-9"
- width="1"
- height="0.99998617"
- x="452"
- y="217.9763" />
- <rect
- y="216.9763"
- x="451"
- height="0.99998617"
- width="1"
- id="rect45598-1"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;enable-background:accumulate"
- id="rect45600-5"
- width="1"
- height="0.99998617"
- x="450"
- y="217.9763" />
- </g>
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\jendrzych's iconset.png"
- transform="matrix(0.3350147,0,0,0.3350147,-35.55948,137.66413)"
- id="g29713-0"
- style="display:inline;enable-background:new">
- <circle
- transform="matrix(0.75,0,0,0.75,29.5,135)"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff541f;fill-opacity:1;fill-rule:nonzero;stroke:#320b00;stroke-width:3.58193231;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path29715-3"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(-0.6011908,-0.06817113,0.06852359,-0.6012277,199.77148,303.44348)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path29717-6"
- style="display:inline;opacity:0.6;fill:url(#linearGradient33126-9);fill-opacity:1;fill-rule:nonzero;stroke:none"
- cx="132"
- cy="118"
- r="8" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:none;stroke:url(#linearGradient33128-2);stroke-width:6.6867547;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="path29719-4"
- transform="matrix(0.4463965,0,0,0.4463971,69.575658,170.82515)"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_FORCE_MAGNETIC"
- transform="translate(21,273)">
- <rect
- y="73"
- x="47"
- height="16"
- width="16"
- id="rect24980-2"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;enable-background:accumulate" />
- <g
- clip-path="none"
- mask="none"
- id="g24568-9"
- transform="translate(93,198.04787)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -44.5,-117.48534 c 0,1 1,3 5.5,3 5.25,0 7.5,-3.26466 7.5,-6.01466 0,-1.5 -0.5,-2.25 -1,-3"
- id="path24570-3"
- sodipodi:nodetypes="cssc"
- inkscape:connector-curvature="0" />
- <g
- id="g24572-4"
- mask="url(#mask43050-6)"
- transform="translate(-22)">
- <path
- style="fill:none;stroke:#000000;stroke-width:2.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -11.5,-110.54787 c 2.25,-1.5 2,-3.45213 2,-4.20213 0,-1.6875 -2.25,-5.75 -7.5,-5.75 -4.5,0 -5.5,2 -5.5,3"
- id="path24574-4"
- sodipodi:nodetypes="cssz"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cssz"
- id="path24576-0"
- d="m -11.5,-110.54787 c 2.25,-1.5 2,-3.45213 2,-4.20213 0,-1.6875 -2.25,-5.75 -7.5,-5.75 -4.5,0 -5.5,2 -5.5,3"
- style="fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.65;fill:none;stroke:url(#radialGradient24295-1);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m -11.5,-110.54787 c 2.25,-1.5 2,-3.45213 2,-4.20213 0,-1.6875 -2.25,-5.75 -7.5,-5.75 -4.5,0 -5.5,2 -5.5,3"
- id="path24578-5"
- sodipodi:nodetypes="cssz"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cssz"
- id="path24580-9"
- d="m -11.5,-110.54787 c 2.5,-1.5 2,-3.45213 2,-4.20213 0,-1.6875 -2.25,-5.75 -7.5,-5.75 -4.5,0 -5.5,2 -5.5,3"
- style="opacity:0.65;fill:none;stroke:url(#radialGradient24297-0);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <circle
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.29999995;marker:none;enable-background:accumulate"
- id="path24582-6"
- transform="matrix(1,0,0,1.4166681,-22,49.0835)"
- cx="-10.5"
- cy="-117.5"
- r="1.5" />
- <g
- id="g24584-3">
- <rect
- y="-124.50001"
- x="-39.75"
- height="14.999989"
- width="2.5"
- id="rect24586-4"
- style="display:inline;overflow:visible;visibility:visible;fill:#821b00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ff9d7d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"
- id="rect24588-2"
- width="1"
- height="14.999989"
- x="-39"
- y="-124.50001" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient24299-9);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"
- id="rect24590-8"
- width="2"
- height="14.999989"
- x="-39.5"
- y="-124.50001" />
- </g>
- <path
- sodipodi:nodetypes="cssc"
- id="path24592-8"
- d="m -44.5,-117.48534 c 0,1 1,3 5.5,3 5.25,0 7.5,-3.26466 7.5,-6.01466 0,-1.5 -0.5,-2.25 -1,-3"
- style="fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_AUTOMERGE_ON"
- transform="translate(0.03262657,-0.06636782)">
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 3\fullscreen.png"
- transform="translate(-125.61657,-482.86685)"
- id="g44633-8"
- style="display:inline;enable-background:new">
- <g
- transform="rotate(180,331.46875,623.5)"
- id="g44671-4">
- <g
- transform="matrix(-1,0,0,1,677,525)"
- id="g44635-3">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path44637-0"
- d="m 347.25,100.25 -4,-4"
- style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path44639-9"
- d="M 343,100.25 V 96 h 4.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- transform="matrix(-1,0,0,1,677,517)"
- id="g44647-2">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 347.25,108.25 343,104"
- id="path44649-6"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 343,108.25 V 104 h 4.25"
- id="path44651-7"
- sodipodi:nodetypes="ccc" />
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path44653-5"
- d="m 332.5,621.5 h -3 m 5,4 V 621"
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path44655-9"
- d="m 330,625.75 2,-2"
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new" />
- <path
- inkscape:connector-curvature="0"
- id="path44657-2"
- d="m 333,622 v 1 1.5 h -1 V 623 h -1.5 v -1 h 1.5 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate" />
- </g>
- <g
- transform="rotate(180,324.46875,630.5)"
- id="g44682-2">
- <g
- id="g44641-6"
- transform="matrix(1,0,0,-1,-21,729)">
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 347.25,100.25 -4,-4"
- id="path44643-3"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 343,100.25 V 96 h 4.25"
- id="path44645-3"
- sodipodi:nodetypes="ccc" />
- </g>
- <g
- id="g44659-9"
- transform="matrix(1,0,0,-1,-21,737)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path44661-9"
- d="M 347.25,108.25 343,104"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path44663-9"
- d="M 343,108.25 V 104 h 4.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- </g>
- <path
- inkscape:connector-curvature="0"
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 322.5,631.5 v -3 m 4,5 H 322"
- id="path44665-0"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 326.75,629 -2,2"
- id="path44667-6"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- d="m 323,632 v -1 -1.5 h 1 v 1.5 h 1.5 v 1 H 324 Z"
- id="path44669-4" />
- </g>
- </g>
- <g
- transform="translate(-10.783378,-1.2374369)"
- id="g29973">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#402100;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect39229-9"
- width="2.9998772"
- height="3"
- x="-153.41948"
- y="204.7984"
- ry="0"
- rx="0"
- transform="rotate(-90)" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffc17d;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate"
- d="m 205.2984,150.91921 c 0,0.6694 1e-5,1.3388 1e-5,2.0082 0.66939,0 1.33877,0 2.00817,0 0,-0.6694 -1e-5,-1.3388 -1e-5,-2.0082 -0.66939,0 -1.33878,0 -2.00817,0 z"
- id="path39231-8"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- <g
- transform="translate(2.1213231,-14.318909)"
- id="g29973-5"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#402100;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect39229-9-8"
- width="2.9998772"
- height="3"
- x="-153.41948"
- y="204.7984"
- ry="0"
- rx="0"
- transform="rotate(-90)" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffc17d;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate"
- d="m 205.2984,150.91921 c 0,0.6694 1e-5,1.3388 1e-5,2.0082 0.66939,0 1.33877,0 2.00817,0 0,-0.6694 -1e-5,-1.3388 -1e-5,-2.0082 -0.66939,0 -1.33878,0 -2.00817,0 z"
- id="path39231-8-9"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- <g
- id="ICON_AUTOMERGE_OFF">
- <g
- style="stroke:#646464;stroke-opacity:1"
- id="g44641-6-3"
- transform="matrix(-1,0,0,1,565.35356,49.06678)">
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:#646464;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 347.25,100.25 -4,-4"
- id="path44643-3-8"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#646464;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 343,100.25 V 96 h 4.25"
- id="path44645-3-3"
- sodipodi:nodetypes="ccc" />
- </g>
- <g
- id="g44659-9-4"
- transform="matrix(-1,0,0,1,565.35356,41.06678)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path44661-9-9"
- d="M 347.25,108.25 343,104"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path44663-9-4"
- d="M 343,108.25 V 104 h 4.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- </g>
- <path
- inkscape:connector-curvature="0"
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 221.85356,146.56678 v 3 m -4,-5 h 4.5"
- id="path44665-0-4"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 217.60356,149.06678 2,-2"
- id="path44667-6-6"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- d="m 221.35356,146.06678 v 1 1.5 h -1 v -1.5 h -1.5 v -1 h 1.5 z"
- id="path44669-4-5" />
- <rect
- transform="rotate(-90)"
- rx="0"
- ry="0"
- y="215.04765"
- x="-152.11568"
- height="3"
- width="2.9998772"
- id="rect39229-9-81"
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;stroke:#969696;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path39231-8-6"
- d="m 215.54765,149.61541 c 0,0.6694 1e-5,1.3388 1e-5,2.0082 0.66939,0 1.33877,0 2.00817,0 0,-0.6694 -10e-6,-1.3388 -10e-6,-2.0082 -0.66939,0 -1.33878,0 -2.00817,0 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- id="g30322">
- <g
- id="g44635-3-6"
- transform="matrix(1,0,0,-1,-118.64644,239.06678)"
- style="stroke:#646464;stroke-opacity:1">
- <path
- style="fill:none;stroke:#646464;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 347.25,100.25 -4,-4"
- id="path44637-0-8"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#646464;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 343,100.25 V 96 h 4.25"
- id="path44639-9-5"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g44647-2-0"
- transform="matrix(1,0,0,-1,-118.64644,247.06678)">
- <path
- sodipodi:nodetypes="cc"
- id="path44649-6-7"
- d="M 347.25,108.25 343,104"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path44651-7-3"
- d="M 343,108.25 V 104 h 4.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 225.85356,142.56678 h 3 m -5,-4 v 4.5"
- id="path44653-5-3"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.93999993;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 228.35356,138.31678 -2,2"
- id="path44655-9-8"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- d="m 225.35356,142.06678 v -1 -1.5 h 1 v 1.5 h 1.5 v 1 h -1.5 z"
- id="path44657-2-3"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate"
- d="m 228.45235,136.53393 c 0,0.6694 1e-5,1.3388 1e-5,2.0082 0.66939,0 1.33877,0 2.00817,0 0,-0.6694 -1e-5,-1.3388 -1e-5,-2.0082 -0.66939,0 -1.33878,0 -2.00817,0 z"
- id="path39231-8-9-4"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- <rect
- transform="rotate(-90)"
- rx="0"
- ry="0"
- y="227.95235"
- x="-139.03419"
- height="3"
- width="2.9998772"
- id="rect39229-9-8-3"
- style="display:inline;overflow:visible;visibility:visible;fill:#e6e6e6;stroke:#969696;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="ICON_CAMERA_STEREO">
- <rect
- ry="0"
- rx="0"
- y="493"
- x="467"
- height="16"
- width="16"
- id="rect17868"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- ry="1.7356256"
- y="495.5"
- x="467.5"
- height="12"
- width="15"
- id="rect17872"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient18011);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- rx="1.7356256" />
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path17875"
- d="M 468,499.48148 V 505 c 0,0.56404 0.36784,1.00001 0.84375,1 h 12.3125 C 481.63216,506 482,505.56405 482,505 v -5.51852 c -0.31371,0.37179 -0.76923,0.59259 -1.25,0.59259 h -11.5 c -0.48077,0 -0.93629,-0.2208 -1.25,-0.59259 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient18008);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- rx="1.5817194"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect17877"
- width="15"
- height="2"
- x="467.5"
- y="495.5"
- ry="1" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect17879"
- width="15"
- height="12"
- x="467.5"
- y="495.5"
- ry="1.503511"
- rx="1.503511" />
- <rect
- rx="0.5078125"
- ry="0.4910686"
- y="496.5"
- x="468.5"
- height="10"
- width="13.000001"
- id="rect17883"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:none;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <g
- id="g17893"
- transform="matrix(0.7547901,0,0,1,416.02177,0)">
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#999999;stroke-width:2.89550138;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path17895"
- transform="matrix(0.7901234,0,0,0.2000006,9.8760061,395.5997)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <path
- sodipodi:nodetypes="csccc"
- id="path17897"
- d="m 69.505631,495.5 v -0.50001 c 0,-0.276 0.896,-0.5 2,-0.5 1.104,0 2,0.224 2,0.5 V 495.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1.15103066;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect17899"
- width="2.6497433"
- height="1"
- x="70.189362"
- y="495" />
- </g>
- <rect
- y="497.5"
- x="479"
- height="1.5"
- width="2"
- id="rect17901"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient17992);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- id="rect17903"
- width="2"
- height="1.5"
- x="479"
- y="497.5" />
- <rect
- y="498"
- x="470"
- height="1"
- width="1"
- id="rect17905"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate" />
- <use
- height="640"
- width="602"
- transform="translate(-6.1847313)"
- id="use18134"
- xlink:href="#g18103"
- y="0"
- x="0" />
- <g
- transform="matrix(0.81050804,0,0,0.81050804,91.905464,90.739248)"
- id="g18103">
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:none;stroke:#000000;stroke-width:0.62952667;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path17885"
- transform="matrix(1.5770887,0,0,1.5999841,353.49325,-294.69208)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(1.3955004,0,0,1.2452423,368.18333,-114.72474)"
- id="path17881"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.75859177;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(1.1794014,0,0,0.8999954,384.50686,55.952303)"
- id="path17887"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient18146);stroke-width:0.97061968;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:0.83938956;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path17889"
- transform="matrix(1.1827463,0,0,1.2,384.24579,-92.900024)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(0.790122,0,0,0.787736,414.87048,114.05649)"
- id="path17891"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient18149);stroke-width:1.26754272;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(1.1827463,0,0,1.2,384.24579,-92.900024)"
- id="path17907"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#radialGradient18151);stroke-width:0.67151165;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient18153);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- id="path17909"
- transform="matrix(0.8888868,0,0,0.8862026,407.16682,64.626266)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- transform="matrix(0.1975308,0,0,0.1999991,460.0926,408.10045)"
- id="path17911"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.26754272;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- </g>
- <ellipse
- transform="matrix(-0.71872408,0.04983719,-0.0496867,-0.7165537,559.14667,859.50468)"
- id="path17913-5"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#linearGradient18220);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.98985863;marker:none;enable-background:accumulate"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- <ellipse
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#linearGradient18212);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.98985863;marker:none;enable-background:accumulate"
- id="path18197"
- transform="matrix(-0.71872408,0.04983719,-0.0496867,-0.7165537,552.92989,859.50468)"
- cx="78"
- cy="502"
- rx="2.5312502"
- ry="2.5" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_COLLAPSEMENU"
- transform="translate(280,508)">
- <rect
- y="111"
- x="103"
- height="16"
- width="16"
- id="rect24489-7-4"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <rect
- style="fill:#ececec;fill-opacity:1;stroke:#141414;stroke-width:0.79452544;stroke-opacity:1"
- id="rect29842"
- width="11.209318"
- height="2.1883163"
- x="105.39484"
- y="-116.60292"
- transform="scale(1,-1)" />
- <rect
- style="display:inline;fill:#ececec;fill-opacity:1;stroke:#141414;stroke-width:0.79452544;stroke-opacity:1;enable-background:new"
- id="rect29842-4"
- width="11.191971"
- height="2.2056611"
- x="105.41944"
- y="-120.61786"
- transform="scale(1,-1)" />
- <rect
- style="display:inline;fill:#ececec;fill-opacity:1;stroke:#141414;stroke-width:0.79500002;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- id="rect29842-4-5"
- width="11.22666"
- height="2.2056642"
- x="105.38363"
- y="-124.60985"
- transform="scale(1,-1)" />
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Pulpit\sss.png"
- transform="translate(102.25002,373)"
- id="ICON_FORCE_SMOKEFLOW"
- style="display:inline;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#808000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:new"
- id="rect28951"
- width="15.999955"
- height="16"
- x="155"
- y="-27" />
- <g
- id="g28953"
- style="display:inline;opacity:0.6;enable-background:new">
- <path
- inkscape:connector-curvature="0"
- id="path28955"
- d="m 157.5,-26.5 c -1.10457,0 -2,0.895431 -2,2 0,1.104569 0.89543,2 2,2 0.0211,0 0.0415,6.5e-4 0.0625,0 0.005,0.02296 0.0259,0.03977 0.0312,0.0625 -0.63487,0.174633 -1.09375,0.747145 -1.09375,1.4375 0,0.828426 0.67157,1.5 1.5,1.5 0.69036,0 1.26287,-0.45888 1.4375,-1.09375 0.18381,0.04305 0.36556,0.09375 0.5625,0.09375 1.38071,0 2.5,-1.119289 2.5,-2.5 0,-1.380711 -1.11929,-2.5 -2.5,-2.5 -0.25351,0 -0.48817,0.05484 -0.71875,0.125 -0.32553,-0.663426 -0.9924,-1.125 -1.78125,-1.125 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient28981);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" />
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path28957"
- style="display:inline;fill:url(#linearGradient28983);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- transform="matrix(0,0.1250004,0.1250004,0,143.24995,-37.50005)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0,0.25,0.2500001,0,130.49998,-56)"
- style="display:inline;fill:url(#linearGradient28985);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- id="path28959"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <g
- id="g28961"
- transform="translate(45,-100)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cszccccccccz"
- id="path28963"
- d="m 110.5,85.5 c 0,2.25 2,3 3.5,3 2.25,0 3.1933,-1.514034 4,-2.5 l 4.5,-5.5 h 3 v -2 h -4 L 116,84 114.75,82.5 h -3.25 l -1,1 z"
- style="fill:#b43214;fill-opacity:1;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient28987);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 110.5,85.5 c 0,2.25 2,3 3.5,3 2.25,0 3.46788,-1.244422 4.25,-2.25 L 120,84 l -2,-2 -1.5,1.5 h -1 v -1 l -1,-1 h -3 l -1,1 z"
- id="path28965"
- sodipodi:nodetypes="cszccccccccz" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:#0b1728;stroke-width:0.80000001;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
- d="m 110.5,85 c 0,2.25 1.5,3.5 3.75,3.5 2.25,0 3.50071,-1.469729 4.25,-2.5 l 4,-5.5 h 0.5 0.5 1 1 v -2 h -1 -1.11272 -0.88728 -1 l -5,5 h -1 v -1 l -1,-1 h -3 l -1,1 z"
- id="path28967"
- sodipodi:nodetypes="cszccccccccccccccccz" />
- <path
- inkscape:connector-curvature="0"
- style="fill:url(#linearGradient28989);stroke-width:1px"
- d="m 118,83 h 1 v 1 h 1 v -1 h -1 v -1 h -1 z"
- id="path28969"
- sodipodi:nodetypes="ccccccccc" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round"
- d="m 111.5,82.5 0.75818,0.763059 h 1.5 l 0.75,-0.75"
- id="path28971"
- sodipodi:nodetypes="cccc" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#000000;stroke:none;stroke-width:0.80000001;marker:none;enable-background:new"
- id="rect28973"
- width="2"
- height="1"
- x="112"
- y="82" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.4;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:new"
- id="rect28975"
- width="0.99994147"
- height="1.4999981"
- x="115"
- y="83.5" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.4;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round"
- d="m 124.5,79.5 h -3 l -5,5 H 116"
- id="path28977"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient28991);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round"
- d="m 111.5,83.5 v 1.271428 c -0.0915,0.859266 0.18827,2.299909 2.00056,2.733557 3.70517,0.886581 6.00049,-3.943221 6.00049,-3.943221"
- id="path28979"
- sodipodi:nodetypes="ccsc" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_GRIP"
- transform="translate(238,508)">
- <path
- style="display:inline;fill:none;stroke:#c8c8c8;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.85098039;enable-background:new"
- d="m 104,121.5 h 14"
- id="path16004-2-9"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <rect
- y="111"
- x="103"
- height="16"
- width="16"
- id="rect24489-7"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <path
- style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.85098039"
- d="m 342,625.5 h 14"
- id="path16004"
- inkscape:connector-curvature="0"
- transform="translate(-238,-508)"
- sodipodi:nodetypes="cc" />
- <path
- style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.85098039;enable-background:new"
- d="m 104,120.5 h 14"
- id="path16004-7"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="display:inline;fill:#c6cbd2;fill-opacity:1;stroke:#c8c8c8;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.85098039;enable-background:new"
- d="m 104,118.5 h 14"
- id="path16004-2"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- </g>
- <g
- id="ICON_LINE_DATA">
- <path
- id="path16893"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.87399995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 348.62424,478.9785 -2.79722,2.25264 c -0.45164,0.43278 -2.06766,1.48999 -2.83488,3.34099 -0.70812,2.10437 -1.91584,2.91305 -1.91584,2.91305 l 0.6563,0.74552 c 0,0 0.95526,-1.09547 3.13241,-1.53112 1.93333,-0.52639 3.65608,-2.44913 3.65608,-2.44913 l 2.68203,-2.62741"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc" />
- <path
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0"
- d="m 348.55771,479.10238 -2.72231,2.19232 c -0.43955,0.42119 -2.0123,1.45009 -2.75897,3.25153 -0.68915,2.048 -1.86454,2.83504 -1.86454,2.83504 l 0.63873,0.72555 c 0,0 0.92968,-1.06614 3.04853,-1.49013 1.88155,-0.51228 3.33445,-2.20812 3.57503,-2.32453 l 2.52591,-2.50648"
- style="display:inline;fill:url(#linearGradient17026);fill-opacity:1;stroke:none;enable-background:new"
- id="path16897" />
- <path
- id="path16907"
- style="display:inline;fill:url(#linearGradient17022);fill-opacity:1;stroke:none;enable-background:new"
- d="m 348.39209,479.42958 -2.52447,2.03299 c -0.4076,0.39058 -1.86605,1.34471 -2.55845,3.01522 -0.63908,1.89917 -1.72904,2.62901 -1.72904,2.62901 l 0.59231,0.67282 c 0,0 0.86211,-0.98866 2.82697,-1.38183 1.74481,-0.47506 3.31522,-2.1556 3.31522,-2.1556 l 2.66283,-2.30087"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc" />
- <path
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0"
- id="path42945"
- d="m 356.4118,471.99599 -8.85401,6.78865 m 0,0 c 0.48204,0.79328 2.52273,3.35178 3.70101,3.87765 m 0,0 5.60266,-5.62151"
- style="display:inline;fill:none;stroke:#000000;stroke-width:1.05365074px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;enable-background:new" />
- <path
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0"
- id="path42949"
- d="m 356.83119,471.7858 -9.22534,7.0573 c 0.35109,1.06864 2.63524,3.37319 3.7137,3.72187 l 5.84295,-5.72212 c 0,0 -0.0685,-1.274 -0.33131,-5.05705 z"
- style="display:inline;fill:url(#linearGradient17018);fill-opacity:1;stroke:none;enable-background:new" />
- <path
- style="display:inline;fill:url(#linearGradient17014);fill-opacity:1;stroke:none;enable-background:new"
- d="m 356.93013,474.76525 c 3.9e-4,3.18201 -3.54751,10.33668 -9.15362,4.50809 0.22597,-0.4981 8.93557,-6.84627 8.93557,-6.84627 0.11742,0.85263 0.1517,1.2913 0.21806,2.33818 z"
- id="path43017"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path42981"
- d="m 345.11258,484.70023 c 1.615,-1.38333 1.89187,-1.62391 1.89187,-1.62391"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.73395383;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- inkscape:transform-center-y="0.24985078"
- inkscape:transform-center-x="0.0087216242" />
- <path
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.48930255;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 341.55701,487.70395 c 1.57524,-1.41883 3.88653,-3.26666 3.88653,-3.26666"
- id="path16832"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- </g>
- <g
- id="ICON_MOD_WIREFRAME">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17079);fill-opacity:1;fill-rule:nonzero;stroke:#0b1728;stroke-width:0.80000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 307.67222,254.4997 6,3e-4 v -11 l -6,-3e-4 m 0,2.45891 h 3.65084 v 6.10992 h -3.71241"
- id="path27671-4-9-2"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <rect
- y="241.00877"
- x="298.83606"
- height="16"
- width="16"
- id="rect27661-8"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- transform="translate(63.83606,-18.99123)"
- style="opacity:0.55"
- id="g27669-35">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17057);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.87159598;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 243.50439,274.05251 -6.46154,-3.3e-4 v -12.12435 l 6.46154,3.3e-4"
- id="path27671-4"
- sodipodi:nodetypes="cccc"
- transform="matrix(0.9285719,0,0,0.9072647,16.387388,24.853058)"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path27673-3"
- d="m 243.50439,272.9503 -5.38461,-3.3e-4 0.001,-4.9503 -0.001,-4.96963 5.38461,3.3e-4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.08949494;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(0.9285719,0,0,0.9072647,16.387388,24.853058)"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="241.00877"
- x="298.83606"
- height="16"
- width="16"
- id="rect27661-8-9"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <g
- transform="translate(63.83606,-18.991232)"
- style="display:inline;opacity:0.55;enable-background:new"
- id="g27669-35-7">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17059);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.87159598;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 243.50439,274.05251 -6.46154,-3.3e-4 v -12.12435 l 6.46154,3.3e-4"
- id="path27671-4-9"
- sodipodi:nodetypes="cccc"
- transform="matrix(0.9285719,0,0,0.9072647,16.387388,24.853058)"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path27673-3-9"
- d="m 243.50439,272.9503 -5.38461,-3.3e-4 0.001,-4.9503 -0.001,-4.96963 5.38461,3.3e-4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.08949494;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- transform="matrix(0.9285719,0,0,0.9072647,16.387388,24.853058)"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccccc"
- id="path27673-3-9-1"
- d="m 307.71974,244.47852 5,3e-4 -9.3e-4,4.49123 9.3e-4,4.50877 -5,-3e-4"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.55;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- transform="rotate(-45,168.77349,-19.865405)"
- style="display:inline;enable-background:new"
- id="g27675-8">
- <path
- sodipodi:nodetypes="cc"
- id="path27679-6"
- d="m 72.837944,271.51561 7.071067,-7.07107"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- d="m 71.600508,272.3995 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071 m 2.121321,-2.12133 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:none;stroke:#28220b;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="path42388-4"
- inkscape:connector-curvature="0" />
- <path
- id="path42359-16"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffe991;stroke-width:1.19999993;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 71.600508,272.3995 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071 m 2.121321,-2.12133 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="rotate(-45,168.77349,-19.865405)"
- style="display:inline;enable-background:new"
- id="g27675-8-5">
- <path
- sodipodi:nodetypes="cc"
- id="path27679-6-3"
- d="m 72.837944,271.51561 7.071067,-7.07107"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- d="m 71.600508,272.3995 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071 m 2.121321,-2.12133 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.75;fill:none;stroke:#28220b;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="path42388-4-5"
- inkscape:connector-curvature="0" />
- <path
- id="path42359-16-5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffe991;stroke-width:1.19999993;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 71.600508,272.3995 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071 m 2.121321,-2.12133 0.707107,-0.7071 m 2.121319,-2.12133 0.707107,-0.7071"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_IPO_BOUNCE"
- transform="translate(168.02769,-748.47766)">
- <g
- id="g16520">
- <g
- id="g16552">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path53378"
- d="m 166.5,949.86212 c -0.0525,5e-5 -0.448,0 -0.5,0 -1.9864,0 -2.6748,6.27454 -3.5,10.99914 -1,-5.50278 -4.01655,-5.48468 -5,10e-6 -0.95862,-2.50093 -2.5,-2.50094 -3.5,-10e-6 -0.0346,2e-4 -0.4699,0.002 -0.5,0"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17013);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cscccc" />
- <path
- sodipodi:nodetypes="cscccc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17015);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 166.5,949.86212 H 166 c -1.98887,0 -2.6748,6.30855 -3.5,11.03315 -0.98438,-5.50278 -3.99875,-5.52473 -5,-0.034 -0.95299,-2.47883 -2.5,-2.50002 -3.5,9.1e-4 -0.0346,2e-4 -0.4699,0.002 -0.5,0"
- id="path53380"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect16035-7-6"
- width="16"
- height="16"
- x="152"
- y="947.36127" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_IPO_LINEAR"
- transform="translate(84.027695,-748.47996)">
- <g
- id="g6562">
- <path
- sodipodi:nodetypes="cccc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#001128;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 61.5,949.86218 h -1 l -11,10.99986 h -1"
- id="path3948"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path3946"
- d="m 61.5,949.86218 h -1 l -11,10.99986 h -1"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17017);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18813-7"
- width="16"
- height="16"
- x="47"
- y="947.36218" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_IPO_CONSTANT"
- transform="translate(84.027695,-748.47989)">
- <path
- sodipodi:nodetypes="cccc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#001128;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 40.5,949.8622 h -6 v 11 h -7"
- id="path6545"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path6532"
- d="m 40.5,949.8622 h -6 v 11 h -6.97"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17019);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18813-9"
- width="16"
- height="16"
- x="26"
- y="947.36218" />
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(126.02769,-748.47996)"
- id="ICON_IPO_SINE">
- <g
- id="g4553">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path4555"
- d="M 61.5,949.86218 H 61 c -4.95,6.5 -7.066811,10.99986 -12,10.99986 h -0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17021);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc" />
- <path
- sodipodi:nodetypes="cccc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17023);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 61.5,949.86218 H 61 c -4.95,6.5 -7.053239,10.99986 -12,10.99986 h -0.5"
- id="path4557"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="947.36218"
- x="47"
- height="16"
- width="16"
- id="rect4559"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_IPO_QUAD"
- transform="translate(147.02769,-748.47996)">
- <g
- id="g7691">
- <path
- sodipodi:nodetypes="cccc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17025);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 61.5,949.86218 H 61 c -2.95,5.5 -7.066811,10.99986 -12,10.99986 h -0.5"
- id="path7693"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path7695"
- d="M 61.5,949.86218 H 61 c -3,5.5 -7.053239,10.99986 -12,10.99986 h -0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17027);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect7697"
- width="16"
- height="16"
- x="47"
- y="947.36218" />
- <path
- inkscape:connector-curvature="0"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#001d1e;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 50,949.3622 v 1 h 2 v 1 h -1 v 1 h 1 v -0.75 h 1 v -1.5 h -1 v -0.75 z m 1,3 h -1 v 1 1 h 3 v -1 h -2 z"
- id="path15794" />
- <path
- id="path41073-2-6"
- d="m 50,949.3622 v 1 h 2 v 1 h -1 v 1 h 1 v -0.75 h 1 v -1.5 h -1 v -0.75 z m 1,3 h -1 v 1 1 h 3 v -1 h -2 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#58ced4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(168.02769,-748.47989)"
- id="ICON_IPO_CUBIC">
- <g
- id="g7709">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path7711"
- d="M 61.5,949.86218 H 61 c -2.95,8.5 -7.066811,10.99986 -12,10.99986 h -0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0e1e00;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc" />
- <path
- sodipodi:nodetypes="cccc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17029);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 61.5,949.86218 H 61 c -2.95,8.5 -7.053239,10.99986 -12,10.99986 h -0.5"
- id="path7713"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="947.36218"
- x="47"
- height="16"
- width="16"
- id="rect7715"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0e1e00;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 50,949.3622 v 1 h 2 v 1 h 1 v -1.25 h -1 v -0.75 z m 2,2 h -1 v 1 h 1 z m 0,1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.25 z"
- id="path15813" />
- <path
- id="path41075-5-1"
- d="m 50,949.3622 v 1 h 2 v 1 h 1 v -1.25 h -1 v -0.75 z m 2,2 h -1 v 1 h 1 z m 0,1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.25 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#84d458;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_IPO_QUINT"
- transform="translate(210.02769,-748.47996)">
- <g
- id="g15888">
- <path
- sodipodi:nodetypes="cccc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17031);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 61.5,949.86218 H 61 c -0.95,6.5 -4.149996,10.99986 -12,10.99986 h -0.5"
- id="path15890"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path15892"
- d="M 61.5,949.86218 H 61 c -0.95,6.5 -3.959647,10.99986 -12,10.99986 h -0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17033);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect15894"
- width="16"
- height="16"
- x="47"
- y="947.36218" />
- <path
- inkscape:connector-curvature="0"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#282100;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 50,950.3622 v 3 h 1 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 v -0.75 h -1 v -1 h 2 v -1 h -2 z"
- id="path15939" />
- <path
- id="path41079-6-0"
- d="m 50,950.3622 v 3 h 1 1 v 1 h -2 v 1 h 2 v -0.75 h 1 v -1.5 h -1 v -0.75 h -1 v -1 h 2 v -1 h -2 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#dacf2a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(231.02769,-748.47989)"
- id="ICON_IPO_EXPO">
- <g
- id="g15963">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path15965"
- d="M 61.5,949.86218 H 61 c -0.95,9.5 -1.956865,10.99986 -12,10.99986 h -0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17035);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc" />
- <path
- sodipodi:nodetypes="cccc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17038);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 61.5,949.86218 H 61 c -0.95,8.5 -1.088169,10.99986 -12,10.99986 h -0.5"
- id="path15967"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="947.36218"
- x="47"
- height="16"
- width="16"
- id="rect15969"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_IPO_CIRC"
- transform="translate(252.02766,-748.47989)">
- <g
- id="g16029">
- <path
- sodipodi:nodetypes="cccc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17040);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 61,949.86218 h -0.5 c 0.05,1.5 0.45,9.5 -11.5,10.99986 h -0.5"
- id="path16031"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path16033"
- d="m 61,949.86218 h -0.5 c 0.05,1.5 0.45,9.5 -11.5,10.99986 h -0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17042);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect16035"
- width="16"
- height="16"
- x="47"
- y="947.36218" />
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(189.02769,-748.48231)"
- id="ICON_IPO_ELASTIC">
- <path
- sodipodi:nodetypes="ccsssssc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17044);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 166.5,949.86126 c -0.0525,5e-5 -0.498,8.6e-4 -0.55,8.6e-4 0,0 -0.47718,10.99969 -2.50296,10.99969 -1.91589,0 -0.93193,-6.00055 -2.94704,-6.00055 -1.53921,0 -1.50766,3 -3,3 -1.03656,0 -0.99963,-2 -2,-2 -0.66974,0 -0.90046,1.00059 -1.5,1.00059 -0.0346,0 -0.4699,10e-4 -0.5,-8.7e-4"
- id="path5578"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path16468"
- d="m 166.5,949.86126 c -0.0525,5e-5 -0.498,8.6e-4 -0.55,8.6e-4 0,0 -0.47718,10.99969 -2.50296,10.99969 -1.91589,0 -0.93193,-6.00055 -2.94704,-6.00055 -1.53921,0 -1.50766,3 -3,3 -1.03656,0 -0.99963,-2 -2,-2 -0.66974,0 -0.90046,1.00059 -1.5,1.00059 -0.0346,0 -0.4699,10e-4 -0.5,-8.7e-4"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17046);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccsssssc" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect16035-7"
- width="16"
- height="16"
- x="152"
- y="947.36127" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_IPO_BACK"
- transform="translate(210.02769,-748.47898)">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path16586"
- d="m 166.5,949.86212 h -0.55 c -1.95,6.49912 -3.14103,10.49912 -5.95,10.49912 -2.23607,0 -4.02976,-3.49912 -6,-3.49912 h -0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17048);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccscc" />
- <path
- sodipodi:nodetypes="ccscc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17050);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 166.5,949.86212 h -0.55 c -1.95,6.49912 -3.14103,10.49912 -5.95,10.49912 -2.23607,0 -4.02976,-3.49912 -6,-3.49912 h -0.5"
- id="path16580"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- y="947.36127"
- x="152"
- height="16"
- width="16"
- id="rect16582"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(189.02769,-748.47989)"
- id="ICON_IPO_QUART">
- <g
- id="g4470">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path4472"
- d="M 61.5,949.86218 H 61 c -0.95,4.5 -3.05,10.5 -12,10.99986 h -0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17052);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc" />
- <path
- sodipodi:nodetypes="cccc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17054);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 61.5,949.86218 H 61 c -0.95,5.5 -4.05,10.5 -12,10.99986 h -0.5"
- id="path4474"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="947.36218"
- x="47"
- height="16"
- width="16"
- id="rect4477"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path16306"
- d="m 50,950.3622 v 3 h 1 1 v 2 h 1 v -4 h -1 v 1 h -1 v -2 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#1b1f09;stroke-width:1.79999995;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#b5d034;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- d="m 50,950.3622 v 3 h 1 1 v 2 h 1 v -4 h -1 v 1 h -1 v -2 z"
- id="path41067-3-6"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(336.02769,-748.47858)"
- id="ICON_IPO_EASE_IN"
- style="display:inline;enable-background:new">
- <g
- id="g20297-2-1">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path20299-51-2"
- d="m 61.5,949.86218 h -0.55 c -4.95,6.5 -5.985561,10.99986 -11.95,10.99986 h -0.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17056);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc" />
- <path
- sodipodi:nodetypes="cccc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17058);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 61.5,949.86218 h -0.55 c -4.95,6.5 -6.003239,10.99986 -11.95,10.99986 h -0.5"
- id="path20301-63-8"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="947.36218"
- x="47"
- height="16"
- width="16"
- id="rect20303-3-3"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- </g>
- <g
- id="ICON_IPO_EASE_OUT"
- transform="rotate(180,233.51384,581.1206)"
- style="display:inline;enable-background:new">
- <g
- id="g20307-1-7">
- <path
- sodipodi:nodetypes="cccc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17060);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 61.5,949.86218 H 61 c -4.95,6.5 -5.985561,10.99986 -11.95,10.99986 H 48.5"
- id="path20309-1-1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path20311-8-0"
- d="M 61.5,949.86218 H 61 c -4.95,6.5 -5.971989,10.99986 -11.95,10.99986 H 48.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17062);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect20313-92-1"
- width="16"
- height="16"
- x="47"
- y="947.36218" />
- </g>
- <g
- transform="rotate(180,244.01384,581.12225)"
- id="ICON_IPO_EASE_IN_OUT"
- style="display:inline;enable-background:new">
- <g
- id="g20317-6-4">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path20319-7-7"
- d="M 61.5,949.86218 H 61 c -6.013721,0 -5.986773,10.99986 -11.95,10.99986 H 48.5"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17064);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccc" />
- <path
- sodipodi:nodetypes="cccc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17066);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 61.5,949.86218 H 61 c -6.013721,0 -5.986773,10.99986 -11.95,10.99986 H 48.5"
- id="path20321-90-9"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="947.36218"
- x="47"
- height="16"
- width="16"
- id="rect20323-5-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(84.027695,-748.48019)"
- id="ICON_IPO_BEZIER">
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#201308;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 78.565213,960.8622 H 70.434788"
- id="path22805-8-4"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path22809-2-4"
- d="m 79.49996,960.8622 h -9"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#c86800;stroke-width:1.20000005;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <circle
- transform="matrix(-0.83333333,0,0,0.83333,9.5,430.86427)"
- id="path22807-1-8"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#462300;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new"
- cx="-84"
- cy="636"
- r="3" />
- <path
- inkscape:connector-curvature="0"
- id="path22811-6-3"
- d="m 80,959.36217 c 0.554,0 1,0.446 1,1 v 1 c 0,0.554 -0.446,1 -1,1 h -1 c -0.554,0 -1,-0.446 -1,-1 v -1 c 0,-0.554 0.446,-1 1,-1 z m 0,1 h -1 v 1 h 1 z"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ff9a2d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path20449-0-3"
- d="m 72.434783,949.8622 h 8.130434"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#201308;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#c86800;stroke-width:1.20000005;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 72.5,949.8622 h 9"
- id="path20451-8-0"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <circle
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#462300;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new"
- id="path22736-5-7"
- transform="matrix(0.83333333,0,0,0.83333,142.49996,419.86427)"
- cx="-84"
- cy="636"
- r="3" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path20453-7-1"
- d="m 82.5,949.86218 c -0.12884,0 -0.37404,-4.1e-4 -0.5,0 -5.995321,0.0193 -5.998907,10.99986 -12,10.99986 -0.155311,0 -0.33371,0 -0.5,0"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0e1e00;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cssc" />
- <path
- sodipodi:nodetypes="cssc"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient17068);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 82.5,949.86218 c -0.12884,0 -0.37404,-4.1e-4 -0.5,0 -6.02657,0.0194 -5.998907,10.99986 -12,10.99986 -0.155311,0 -0.33371,0 -0.5,0"
- id="path20457-48-5"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <rect
- y="947.36218"
- x="68"
- height="16"
- width="16"
- id="rect20459-9-9"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <path
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ff9a2d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new"
- d="m 71.99996,948.36217 c -0.554,0 -1,0.446 -1,1 v 1 c 0,0.554 0.446,1 1,1 h 1 c 0.554,0 1,-0.446 1,-1 v -1 c 0,-0.554 -0.446,-1 -1,-1 z m 0,1 h 1 v 1 h -1 z"
- id="rect22555-0-9"
- inkscape:connector-curvature="0" />
- <path
- id="path22295-8"
- d="m 71.49996,949.86216 v -0.5014 c 0,-0.2493 0.196575,-0.4986 0.50004,-0.4986 h 0.49996"
- style="display:inline;fill:none;stroke:#f3c59d;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc" />
- <path
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#f3c59d;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="m 78.49996,960.86216 v -0.5014 c 0,-0.2493 0.196575,-0.4986 0.50004,-0.4986 h 0.49996"
- id="path5059" />
- </g>
- <g
- transform="translate(-63.051518,-85.06394)"
- style="display:inline;enable-background:new"
- id="ICON_ACTION_TWEAK">
- <rect
- y="304"
- x="278"
- height="16"
- width="16"
- id="rect22048-0-1-2-2"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.89999998;marker:none;enable-background:accumulate" />
- <g
- id="g17930-6-4">
- <rect
- y="305.5"
- x="281.5"
- height="6.0211244"
- width="9.0000076"
- id="rect22050-0-1-6-2"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.6;fill:#ffd6aa;fill-opacity:1;fill-rule:evenodd;stroke:#2b1600;stroke-width:0.40000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path22157-2-9-1-2"
- d="m 278.90735,308.28551 v 0.5 l 2.5,2.5 h 0.5 l 2.5,-2.5 v -0.5 l -2.5,-2.5 h -0.5 z"
- style="fill:none;stroke:#552c00;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#e98316;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 279.15735,308.53551 2.5,2.5 2.5,-2.5 -2.5,-2.5 z"
- id="path22159-1-9-5-8"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path22161-4-8-9-9"
- d="m 279.80239,308.53551 1.85496,-1.83839 1.85496,1.83839 -1.85496,1.86049 z"
- style="fill:none;stroke:url(#linearGradient17904-1-8);stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 287.69919,308.32103 v 0.5 l 2.5,2.5 h 0.5 l 2.5,-2.5 v -0.5 l -2.5,-2.5 h -0.5 z"
- id="path22208-0-8-1-5"
- sodipodi:nodetypes="ccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path22212-5-4-4-6"
- d="m 287.94919,308.57103 2.5,2.5 2.5,-2.5 -2.5,-2.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- style="fill:none;stroke:url(#linearGradient17893-5-2);stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 288.58981,308.57103 1.85938,-1.83594 1.85547,1.83594 -1.85547,1.875 z"
- id="path22214-3-8-8-9"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(62.055528,67.113811)"
- id="g36761-1-3"
- style="display:inline;enable-background:new">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 223,243 v 10 h 1 v -1 h 1 1 v 2 h 1 v 1 h 1 v -1 h 1 v -2 h -1 v -2 h 1 1 v -1 h -1 v -1 h -1 v -1 h -1 v -1 h -1 v -1 h -1 v -1 h -1 v -1 z"
- id="path36763-5-3"
- inkscape:connector-curvature="0" />
- <g
- id="g36765-2-8"
- style="display:inline;fill:#1a1a1a;enable-background:new"
- transform="translate(5)">
- <rect
- y="243"
- x="218"
- height="10"
- width="1"
- id="rect36767-7-7"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="244"
- x="219"
- height="1"
- width="1"
- id="rect36769-6-7"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="245"
- x="220"
- height="1"
- width="1"
- id="rect36771-1-5"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="246"
- x="221"
- height="1"
- width="1"
- id="rect36773-4-5"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="247"
- x="222"
- height="1"
- width="1"
- id="rect36775-2-3"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="248"
- x="223"
- height="1"
- width="1"
- id="rect36777-3-2"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="249"
- x="224"
- height="1"
- width="1.0000017"
- id="rect36779-2-6"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="252"
- x="219"
- height="1"
- width="1"
- id="rect36781-2-4"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="251"
- x="220"
- height="1"
- width="1"
- id="rect36783-1-4"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="252"
- x="221"
- height="2"
- width="1"
- id="rect36785-6-6"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="250"
- x="222.25"
- height="2"
- width="0.75"
- id="rect36787-8-0"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="252"
- x="223"
- height="1.9999931"
- width="1"
- id="rect36789-5-9"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="254"
- x="222"
- height="1.0000006"
- width="1.5"
- id="rect36791-7-7"
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- id="rect36793-6-2"
- width="1.5"
- height="1"
- x="223.5"
- y="250" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_NLA_PUSHDOWN"
- transform="translate(-231.54762,126.06411)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate"
- id="rect44079-0"
- width="16"
- height="16"
- x="320"
- y="73" />
- <g
- transform="translate(0,-22.005631)"
- id="g43931-0">
- <g
- id="g43459-4">
- <g
- transform="translate(0,21)"
- id="g43446-0">
- <path
- sodipodi:nodetypes="ccc"
- id="path43450-7"
- d="m 324.45461,83.386633 4.25,4.244369 4.25,-4.244369"
- style="fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="rotate(180,327.8523,92.3155)"
- id="g43442-3">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 331.25,80.25 327,76.005631 322.75,80.25"
- id="path42666-0"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient16705);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 333.4295,103.09358 -4.5,4.5 h -0.5 l -3.87222,-3.79689"
- id="path44952-5"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(-0.12714727,-29.00633)"
- id="g43931-0-3">
- <g
- id="g43459-4-9">
- <g
- transform="translate(0,21)"
- id="g43446-0-2">
- <path
- sodipodi:nodetypes="ccc"
- id="path43450-7-3"
- d="m 324.45461,83.386633 4.25,4.244369 4.25,-4.244369"
- style="fill:none;stroke:#000000;stroke-width:3.5999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="rotate(180,327.8523,92.3155)"
- id="g43442-3-7">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#dcdcdc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 331.25,80.25 327,76.005631 322.75,80.25"
- id="path42666-0-5"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient16728);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 333.4295,103.09358 -4.5,4.5 h -0.5 l -3.87222,-3.79689"
- id="path44952-5-9"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(21)"
- style="display:inline;enable-background:new"
- id="ICON_LOOPSEL">
- <g
- transform="translate(111,-158)"
- id="g35778-7"
- style="display:inline;opacity:0.55">
- <rect
- y="336"
- x="-64"
- height="16"
- width="16"
- id="rect35780-2"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g35782-9"
- transform="translate(1)">
- <g
- id="g35785-7"
- transform="translate(-386,446.5)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="fill:#552200;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 329.5,-108.25 -5.5,2 v 6.75 l 5.5,3 5.5,-3 v -6.75 z"
- id="path35787-2" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- id="path35789-6"
- d="m 324,-99.5 v -7 l 6,-1.75 v 11.5 l -0.5,0.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#c9c9c9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06898749px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="cccccc" />
- <g
- id="g35791-0"
- transform="translate(179,-179)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- id="path35793-5"
- d="m 156,79.5 v -7 l -5,-1.75 v 11.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.89401144px;marker:none;enable-background:accumulate"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- id="path35795-5"
- d="m 145,72.5 5.5,-2 5.5,2 -5.5,2.5 z"
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- id="path35797-0"
- d="m 334.5,-106.5 v 6.75 l -5,2.75 -5,-2.75 v -6.75"
- style="fill:none;stroke:url(#linearGradient36725-1);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- </g>
- <rect
- y="342"
- x="-57"
- height="7.75"
- width="1"
- id="rect35799-0"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient36727-5);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path35801-8"
- d="m -61,340.65468 c 0,0 4.5,2 4.5,2 l 4.5,-2"
- style="fill:none;stroke:url(#linearGradient36729-0);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect37868-0-4-8-7"
- width="3.0000007"
- height="7.25"
- x="54"
- y="185" />
- <g
- id="g35818-3"
- style="display:inline;fill:url(#radialGradient17275);fill-opacity:1"
- transform="translate(-1080.9861,-256)">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient17275);fill-opacity:1;fill-rule:nonzero;stroke:#542b00;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:0.8627451;marker:none;enable-background:accumulate"
- d="m 1130.4859,445.25 v -7.5 l 6,2.75 v 8 z"
- id="path35820-8"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path35822-7"
- d="m 1136.4859,448.5 -6,-3.25 v -7.5"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient17275);fill-opacity:1;stroke:#462400;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccc" />
- </g>
- <g
- transform="translate(41.999513,2.6999762e-4)"
- style="display:inline;enable-background:new"
- id="g35803-8">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#542b00;stroke-width:1.495;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 8.0048608,180.50566 h 0.036785 c 0.8181814,0 1.476865,0.66665 1.476865,1.49473 v 1.2e-4 c 0,0.82808 -0.6586836,1.49472 -1.476865,1.49472 h -0.036785 c -0.8181897,0 -1.4768733,-0.66664 -1.4768733,-1.49472 v -1.2e-4 c 0,-0.82808 0.6586836,-1.49473 1.4768733,-1.49473 z"
- id="path35805-7"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#ffc17d;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 9.0203881,181.00394 c -0.6673195,0 -1.334639,1e-5 -2.0019585,1e-5 0,0.66706 0,1.33411 0,2.00119 0.6673195,0 1.334639,-1e-5 2.0019585,-1e-5 0,-0.66707 0,-1.33413 0,-2.00119 z"
- id="path35807-6"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_TRIA_RIGHT_BAR"
- transform="translate(405,298)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect24907-8"
- width="16"
- height="16"
- x="62"
- y="69" />
- <g
- id="g17605"
- transform="translate(-0.99177519,0.03419629)">
- <path
- style="fill:url(#linearGradient17610);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 472.51758,370.53516 -1.04688,0.0312 0.0371,9.96875 h 1.00977 l 3.95117,-3.70704 -5.3e-4,3.72852 h 3.1119 v -10.01758 h -3.1119 l 5.3e-4,3.73242 z"
- transform="translate(-404.00822,-298.0342)"
- id="path11011-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccccc" />
- <path
- sodipodi:nodetypes="ccc"
- style="fill:none;stroke:url(#linearGradient17612);stroke-width:0.91056824px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 73.368723,81.408784 v -7.99274 l 1.292145,-6.3e-5"
- id="path10830-6"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient17614);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 68.5,81.24999 v -7.5 l 4,3.75"
- id="path11013-5"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_TRIA_LEFT_BAR"
- transform="matrix(-1,0,0,1,587.07183,298.10012)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect24907-8-5"
- width="16"
- height="16"
- x="62"
- y="69" />
- <g
- id="g17605-3"
- transform="translate(-1.9392553,-0.11820549)">
- <path
- style="fill:url(#linearGradient17610-0);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 520.5,370.48242 -4.01758,3.80078 -6.6e-4,-3.79492 h -3.04231 v 10.01563 h 3.04231 l 6.6e-4,-3.79297 4.01758,3.77148 h 1.01172 l 0.0371,-9.96875 z"
- transform="matrix(-1,0,0,1,589.01109,-297.98191)"
- id="path11011-6-2"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccccc" />
- <path
- sodipodi:nodetypes="ccc"
- style="fill:none;stroke:url(#linearGradient17612-5);stroke-width:0.91056824px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 74.660868,81.408784 v -7.99274 l -1.220453,-6.3e-5"
- id="path10830-6-2"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient17614-0);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 68.5,81.24999 v -7.5 l 4,3.75"
- id="path11013-5-7"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- id="ICON_TRIA_UP_BAR">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect24907-8-5-7"
- width="16"
- height="16"
- x="-383"
- y="-546"
- transform="matrix(0,-1,-1,0,0,0)" />
- <path
- style="fill:url(#linearGradient17165);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 533.51953,371.46094 v 3.04042 l 3.79492,5.9e-4 -3.77343,4.01953 v 1.01172 l 9.96875,0.0352 0.0312,-1.04688 -3.80274,-4.01953 3.79688,-5.9e-4 v -3.04042 z"
- id="path11011-6-2-1"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path11013-5-7-1"
- d="m 542.29119,378.53246 -3.75,-4 -3.75,4"
- style="fill:none;stroke:url(#linearGradient17162);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path10830-6-2-8"
- d="m 542.67138,372.31669 h -8.26386 l -6e-5,1.20843"
- style="display:inline;fill:none;stroke:url(#linearGradient17838);stroke-width:0.92071104px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- sodipodi:nodetypes="ccc" />
- </g>
- <g
- id="ICON_TRIA_DOWN_BAR">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect24907-8-8"
- width="16"
- height="16"
- x="367"
- y="-504"
- transform="rotate(90)" />
- <path
- style="fill:url(#linearGradient17185);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 501.50977,371.4375 -9.96875,0.0352 v 1.01172 l 3.69336,3.93554 -3.71485,-0.005 v 3.13033 h 10.01563 v -3.13033 l -3.7168,0.007 3.72266,-3.9375 z"
- id="path11011-6-8"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path11013-5-6"
- d="m 492.79119,372.47355 h 7.5"
- style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- id="path10830-6-2-8-8"
- d="m 500.65575,377.29722 h -8.26386 l -6e-5,1.29834"
- style="display:inline;fill:none;stroke:url(#linearGradient17872);stroke-width:0.92071104px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- sodipodi:nodetypes="ccc" />
- </g>
- <g
- id="ICON_MOD_DATA_TRANSFER">
- <rect
- ry="1.4918556"
- rx="1.4927195"
- y="241"
- x="320"
- height="16"
- width="16"
- id="rect18203"
- style="fill:none;stroke:none" />
- <g
- id="g18198"
- transform="matrix(1.0087429,0,0,0.97482999,-108.8466,-32.496743)">
- <path
- style="fill:url(#linearGradient18237);fill-opacity:1;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 425.50477,292.38372 15.04989,-10.90405 -0.0101,6.77582 -9.51239,8.38266 z"
- id="rect16727"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="display:inline;fill:none;stroke:url(#linearGradient18239);stroke-width:0.94270116;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 439.79125,287.61126 -8.80214,7.81233 -3.87477,-2.96997 12.64026,-9.16307"
- id="rect16727-8"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc" />
- <path
- transform="matrix(0.74622014,-0.66569926,0.64008794,0.76830165,0,0)"
- style="fill:url(#linearGradient20049);fill-opacity:1;stroke:none"
- d="m 155.67553,506.23194 -0.63498,0.7272 c 0,0 -7.96167,0.0866 -11.40538,0.0765 -1.63408,-0.005 -1.64706,-1.90745 -0.31608,-1.84971 3.85215,0.16711 12.35647,1.04592 12.35647,1.04592 z"
- id="rect20031"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccsscc" />
- </g>
- <path
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0"
- id="path18412"
- d="m 321.20705,242.0789 c 2.69584,0.64081 4.09152,0.77931 6.28874,0.55186 0.26517,2.2318 0.84364,4.80456 2.06664,6.25861 -2.05408,-0.68406 -3.57488,-1.60349 -4.80908,-2.47909 -1.36678,-1.11314 -2.52984,-2.47523 -3.5463,-4.33138 z"
- style="fill:url(#linearGradient17247);fill-opacity:1;stroke:none" />
- <path
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0"
- id="rect16727-5"
- d="m 328.56164,246.05078 c 0.74079,0.0537 1.77983,-0.45053 6.98113,-4.18925 0,3.08648 -0.0102,4.09418 -0.0102,6.60528 -0.44523,0.50349 -6.55549,5.26941 -7.72056,-6.20333 -3.16507,0.27726 -4.58746,0.0819 -7.26323,-0.75675 1.35238,2.92568 2.86698,4.41322 4.56976,5.5869 2.04461,1.35744 4.27186,2.25425 6.46319,2.69448"
- style="fill:none;stroke:#1a1a1a;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.49803922" />
- <path
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0"
- id="path18412-1"
- d="m 324.68994,246.54277 c -0.64862,-0.68224 -1.98282,-2.30701 -2.71202,-3.8538 2.07872,0.5568 3.84489,0.49023 5.15615,0.37259 0.26517,2.2318 0.88783,4.31843 1.67994,5.209"
- style="display:inline;fill:none;stroke:url(#linearGradient17243);stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.49803922;enable-background:new" />
- <path
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0"
- id="path18485"
- d="m 335.20234,242.58443 c 0,0.84375 -0.005,3.9971 -0.005,5.75999 -2.37119,1.76035 -4.7166,1.79719 -6.03803,-1.54307 1.55369,-1.16687 6.02002,-4.2052 6.02002,-4.2052 z"
- style="fill:url(#linearGradient17239);fill-opacity:1;stroke:none" />
- <path
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0"
- id="path20010"
- d="m 335.21342,245.56494 c 0,0 0.0166,0.39923 0.0166,1.01647 -0.82312,0.76235 -3.0673,2.74764 -4.18325,2.66033 -0.29848,-0.14345 -0.39809,-0.20898 -0.62335,-0.46278 1.10175,-0.45288 2.17708,-1.29548 4.79,-3.21402 z"
- style="fill:url(#linearGradient17236);fill-opacity:1;stroke:none" />
- <path
- sodipodi:nodetypes="cssc"
- inkscape:connector-curvature="0"
- id="path18570"
- d="m 329.53955,248.87963 c -1.41211,-0.48222 -3.92872,-1.40598 -4.73299,-4.22946 -0.39317,-1.38024 1.7085,-1.41702 1.92756,-0.24049 0.45159,2.42548 1.89945,3.56397 2.80543,4.46995 z"
- style="fill:#ffe991;fill-opacity:1;stroke:none" />
- </g>
- <g
- transform="translate(-264,-151.9)"
- id="ICON_FILE_HIDDEN"
- style="display:inline;fill:url(#linearGradient17223);fill-opacity:1;enable-background:new">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:url(#linearGradient17215);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="M 756.16666,204.50001 H 766.5 V 219.5 h -13 l -10e-6,-11.99999 z"
- id="path39241-60"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path39243-9"
- d="M 756.16666,204.50001 H 766.5 V 219.5 h -13 l -10e-6,-11.99999 z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:url(#radialGradient17217);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path39245-1"
- style="display:inline;fill:none;stroke:url(#linearGradient17219);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 754.5,209 v 9.5 m 3.5,-13 h 7.5"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path39247-8"
- d="m 753,208 h 4 v -4 z"
- style="display:inline;fill:#ffffff;fill-opacity:0.49803922;fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- id="path39249-0"
- style="fill:none;stroke:#7f7f7f;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 753.5,207.00001 V 219.5 h 13 V 204.50001 H 756 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient17221);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 757.5,206.5 v 2 h -2"
- id="path39251-2" />
- </g>
- <g
- id="ICON_BLANK1"
- transform="matrix(1.0063645,0,0,0.9519664,-3.4857036,27.417198)">
- <rect
- y="577.31323"
- x="530.11182"
- height="16.807316"
- width="15.898812"
- id="rect17730"
- style="fill:none;stroke:none" />
- </g>
- <g
- id="ICON_SCULPT_DYNTOPO">
- <rect
- y="178"
- x="467"
- height="16"
- width="16"
- id="rect18509"
- style="fill:none;stroke:none" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MOD_NORMALEDIT"
- transform="translate(105,-19)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect18695-8"
- width="16"
- height="16"
- x="236"
- y="260" />
- <g
- id="g18697-9"
- transform="translate(-86,370.75)">
- <path
- style="fill:none;stroke:#0b1728;stroke-width:1.70000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 330,-107.75 -5,2 0.0372,6.324398 5,2.71875 4.99999,-2.71875 L 335,-105.75 Z"
- id="path18699-5"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- id="path18719-5"
- d="m 330.03717,-107.6131 -5,1.875 v 6.312498 l 5,2.71875 4.99999,-2.71875 v -6.312498 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient16862);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <g
- id="g18703-7"
- transform="translate(179,-179)">
- <path
- id="path18707-1"
- d="m 146.0019,73.295281 5,-1.894157 5,1.894157 -5,2.073959 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient16864);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path18763-1"
- d="m 335,-105.5 -5,2 v 6.75 l 5,-2.75 z"
- style="display:inline;fill:url(#linearGradient16866);fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccc"
- id="path18709-8"
- d="m 334.5,-105.25 0.002,5.587357 -4.5,2.480073 -4.5,-2.480073 L 325.5,-105.25 330,-107 Z"
- style="fill:none;stroke:url(#linearGradient16868);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- id="path18758-5"
- style="display:inline;opacity:0.8;fill:none;stroke:#d7e3f4;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 330.25,-103.25 3.25,-1.5"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- <g
- id="g18737-4"
- style="opacity:0.7" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- sodipodi:nodetypes="cc"
- d="M 330.25,-103.25 335,-105.5"
- style="display:inline;overflow:visible;visibility:visible;fill:#0b1728;fill-opacity:1;fill-rule:evenodd;stroke:#0b1728;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path18760-7"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- sodipodi:nodetypes="cc"
- d="m 325.34712,-100.90914 4.75,-2.25"
- style="display:inline;overflow:visible;visibility:visible;fill:#dd23dd;fill-opacity:1;fill-rule:evenodd;stroke:#dd23dd;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path18760-7-5"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- sodipodi:nodetypes="cc"
- d="m 330.29093,-103.24155 -0.0238,-5.2559"
- style="display:inline;overflow:visible;visibility:visible;fill:#dd23dd;fill-opacity:1;fill-rule:evenodd;stroke:#dd23dd;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path18760-7-5-6"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- sodipodi:nodetypes="cc"
- d="m 330.36378,-103.20969 4.94432,1.78292"
- style="display:inline;overflow:visible;visibility:visible;fill:#dd23dd;fill-opacity:1;fill-rule:evenodd;stroke:#dd23dd;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path18760-7-5-6-3"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(-63,-21)"
- style="display:inline;enable-background:new"
- id="ICON_LIBRARY_DATA_BROKEN"
- inkscape:label="#ICON_LIBRARY_DATA_BROKEN">
- <g
- transform="translate(0,128)"
- id="g24024-1">
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- d="m 299,365 h 16 v 16 h -16 z"
- id="rect22150-8"
- inkscape:connector-curvature="0" />
- <g
- id="g31699">
- <path
- style="display:inline;fill:url(#linearGradient30825);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="m 303.58068,365.2991 -2.66602,3 v 6.26171 l 1.57617,0.53516 0.97266,-3.95312 5.41016,1.87304 1.17968,-4.50976 1.86133,0.91015 v -4.11718 z"
- id="path12337-3"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- d="M -48.500031,260.50809 -46.5,260.5 l -3.1e-5,-1.99191"
- style="display:inline;opacity:0.7;fill:none;stroke:#000000;stroke-width:0.76923829px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter31351-1)"
- id="path12339-6"
- sodipodi:nodetypes="ccc"
- transform="matrix(1.2999758,0,0,1.2999988,365.56499,31.43979)" />
- <path
- sodipodi:nodetypes="cccc"
- id="path12343-1"
- style="display:inline;fill:none;stroke:url(#linearGradient30827);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 301.9611,369.95935 v 4.75958 m 3.5,-8.25958 h 5.5"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path12341-0"
- d="m 300.39172,369.09809 h 4 v -4 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <g
- id="g17888"
- transform="translate(18.739924,-97.15625)">
- <path
- id="path17882"
- d="m 284.54204,469.10845 h -3.90821 l 0.01,2.22656 2.27734,0.77344 h 0.88477 l 0.73633,-3 z"
- mask="none"
- style="display:inline;opacity:0.93999993;fill:url(#linearGradient17892);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- id="path17879"
- d="m 290.335,469.48345 -2.71093,-2.375 -0.004,2 h -0.95312 l 3.45312,1.19531 0.21484,-0.82031 z"
- mask="none"
- style="display:inline;opacity:0.93999993;fill:url(#linearGradient17894);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- inkscape:connector-curvature="0" />
- </g>
- <path
- inkscape:connector-curvature="0"
- id="path12345-7"
- d="m 303.41467,365.43786 -2.5,2.5 v 6.76171 l 1.57617,0.53516 0.97266,-3.95312 5.41016,1.87304 1.17968,-4.50976 1.86133,0.91015 v -4.11718 z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- <g
- id="g31703">
- <path
- style="display:inline;fill:url(#linearGradient30849);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="m 313.09408,371.63636 -1.86133,-0.91015 -1.17968,4.50976 -5.41016,-1.87304 -0.97266,3.95312 -1.57617,-0.53516 v 3.73829 h 11 z"
- id="path30847"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.93999993;fill:url(#linearGradient17886);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- mask="none"
- d="m 310.24635,374.48985 -0.21484,0.82031 -3.45312,-1.19531 h -2.125 l -0.73633,3 h 3.81445 l 0.0176,2 3.98242,-3.5 -1.28516,-1.125 z"
- id="path31751"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- id="path30842"
- d="m 313.09408,371.70574 -1.86133,-0.91015 -1.17968,4.50976 -5.41016,-1.87304 -0.97266,3.95312 -1.57617,-0.53516 v 3.73829 h 11 z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- <path
- style="fill:none;fill-rule:evenodd;stroke:#fe0000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter17889)"
- d="m 313.8621,371.34594 -3.26074,-1.59569 -1.17942,4.50955 -5.41146,-1.8732 -0.97129,3.95453 -2.70572,-0.90191"
- id="path30830"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc" />
- <g
- mask="url(#mask15700)"
- transform="translate(-149.97053,-18.918247)"
- id="g15634"
- style="display:inline;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g42357.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- clip-path="url(#clipPath15455)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:none;stroke:#e8a930;stroke-width:2.99999928;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect15636"
- width="1.9930685"
- height="1.9947703"
- x="309.50693"
- y="239.5"
- ry="0.99734437"
- rx="0.98426884" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect15638"
- width="7.9999909"
- height="8.000001"
- x="299.4917"
- y="247.35583"
- ry="1.5185405"
- rx="1.7691951"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="0.0128693"
- ry="0.010695697"
- y="247.85583"
- x="299.9917"
- height="7.000001"
- width="6.9999909"
- id="rect15640"
- style="fill:url(#linearGradient15678);fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="1.5194846"
- ry="1.4892343"
- y="237.42615"
- x="305.49991"
- height="6.9921885"
- width="8.9605312"
- id="rect15642"
- style="fill:none;stroke:#000000;stroke-width:0.99999958;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <rect
- style="fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect15644"
- width="5.0000091"
- height="0.99999899"
- x="300.9917"
- y="248.85583"
- ry="0.0053478414"
- rx="0.0086254831"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="0"
- ry="0"
- y="248.35583"
- x="300.4917"
- height="6.000001"
- width="5.9999909"
- id="rect15646"
- style="opacity:0.8;fill:none;stroke:url(#linearGradient15680);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <rect
- style="fill:url(#linearGradient15682);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect15648"
- width="7.9604402"
- height="5.9921885"
- x="306"
- y="237.92615"
- ry="0"
- rx="0"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="0.0071879062"
- ry="0.0053478414"
- y="238.92615"
- x="306.98389"
- height="0.99218851"
- width="5.9765534"
- id="rect15650"
- style="fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="opacity:0.8;fill:none;stroke:url(#linearGradient15684);stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect15652"
- width="5.9604402"
- height="4.0030832"
- x="306.5"
- y="238.41525"
- ry="0"
- rx="0"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- rx="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffb72a;fill-opacity:1;fill-rule:nonzero;stroke:#553800;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect15654"
- width="2"
- height="1.9882908"
- x="313.45264"
- y="240.50037"
- ry="0" />
- <rect
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- id="rect15656"
- width="8.9614162"
- height="7.9608927"
- x="312.43652"
- y="247.39494"
- ry="1.5185405"
- rx="1.7691951"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="0.0128693"
- ry="0.010695697"
- y="247.8949"
- x="312.93652"
- height="6.9609385"
- width="7.9614167"
- id="rect15658"
- style="display:inline;fill:url(#linearGradient15688);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new" />
- <rect
- style="display:inline;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- id="rect15660"
- width="5.9614167"
- height="0.96093851"
- x="313.93652"
- y="248.8949"
- ry="0.0053478414"
- rx="0.0086254831"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="0"
- ry="0"
- y="248.395"
- x="313.43652"
- height="5.9608316"
- width="6.9614167"
- id="rect15662"
- style="display:inline;opacity:0.8;fill:none;stroke:url(#linearGradient15690);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" />
- <rect
- rx="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffb72a;fill-opacity:1;fill-rule:nonzero;stroke:#553800;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect15664"
- width="2"
- height="1.9882908"
- x="304.42139"
- y="240.46912"
- ry="0" />
- <path
- style="display:inline;fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 304.05985,242.89398 5.95666,5.92541"
- id="path15666"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new"
- d="m 316.05011,242.91732 -6.03144,5.909"
- id="path15668"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path15670"
- d="m 315.98761,242.94305 -5.93475,5.88889"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient15692);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path15672"
- d="m 304.05985,242.89398 5.96875,5.95312"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient15694);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <ellipse
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.51799999;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="ellipse15674"
- cx="304.0946"
- cy="242.89087"
- rx="0.59120387"
- ry="0.61330098" />
- <ellipse
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.51799999;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="ellipse15676"
- cx="315.98523"
- cy="242.95337"
- rx="0.59120387"
- ry="0.61330098" />
- </g>
- <g
- clip-path="url(#clipPath15455-9)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracownia\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\RELEASES\g42357.png"
- style="display:inline;opacity:0.65;filter:url(#filter15388);enable-background:new"
- id="g15325"
- transform="translate(-170.98527,-18.905399)"
- mask="url(#mask15700-4)">
- <rect
- rx="0.98426884"
- ry="0.99734437"
- y="239.5"
- x="309.50693"
- height="1.9947703"
- width="1.9930685"
- id="rect15327"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:none;stroke:#e8a930;stroke-width:2.99999928;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="1.7691951"
- ry="1.5185405"
- y="247.35583"
- x="299.4917"
- height="8.000001"
- width="7.9999909"
- id="rect15329"
- style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <rect
- style="fill:url(#linearGradient15371);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect15331"
- width="6.9999909"
- height="7.000001"
- x="299.9917"
- y="247.85583"
- ry="0.010695697"
- rx="0.0128693"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:0.99999958;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect15333"
- width="8.9605312"
- height="6.9921885"
- x="305.49991"
- y="237.42615"
- ry="1.4892343"
- rx="1.5194846"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="0.0086254831"
- ry="0.0053478414"
- y="248.85583"
- x="300.9917"
- height="0.99999899"
- width="5.0000091"
- id="rect15335"
- style="fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="opacity:0.8;fill:none;stroke:url(#linearGradient15373);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect15337"
- width="5.9999909"
- height="6.000001"
- x="300.4917"
- y="248.35583"
- ry="0"
- rx="0"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="0"
- ry="0"
- y="237.92615"
- x="306"
- height="5.9921885"
- width="7.9604402"
- id="rect15339"
- style="fill:url(#linearGradient15375);fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect15341"
- width="5.9765534"
- height="0.99218851"
- x="306.98389"
- y="238.92615"
- ry="0.0053478414"
- rx="0.0071879062"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="0"
- ry="0"
- y="238.41525"
- x="306.5"
- height="4.0030832"
- width="5.9604402"
- id="rect15343"
- style="opacity:0.8;fill:none;stroke:url(#linearGradient15377);stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <rect
- ry="0"
- y="240.50037"
- x="313.45264"
- height="1.9882908"
- width="2"
- id="rect15345"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffb72a;fill-opacity:1;fill-rule:nonzero;stroke:#553800;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- rx="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="1.7691951"
- ry="1.5185405"
- y="247.39494"
- x="312.43652"
- height="7.9608927"
- width="8.9614162"
- id="rect15347"
- style="display:inline;fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" />
- <rect
- style="display:inline;fill:url(#linearGradient15379);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- id="rect15349"
- width="7.9614167"
- height="6.9609385"
- x="312.93652"
- y="247.8949"
- ry="0.010695697"
- rx="0.0128693"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- rx="0.0086254831"
- ry="0.0053478414"
- y="248.8949"
- x="313.93652"
- height="0.96093851"
- width="5.9614167"
- id="rect15351"
- style="display:inline;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new" />
- <rect
- style="display:inline;opacity:0.8;fill:none;stroke:url(#linearGradient15381);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- id="rect15354"
- width="6.9614167"
- height="5.9608316"
- x="313.43652"
- y="248.395"
- ry="0"
- rx="0"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- ry="0"
- y="240.46912"
- x="304.42139"
- height="1.9882908"
- width="2"
- id="rect15356"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffb72a;fill-opacity:1;fill-rule:nonzero;stroke:#553800;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- rx="0" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path15358"
- d="m 304.05985,242.89398 5.95666,5.92541"
- style="display:inline;fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path15360"
- d="m 316.05011,242.91732 -6.03144,5.909"
- style="display:inline;fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient15384);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="m 315.98761,242.94305 -5.93475,5.88889"
- id="path15362"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient15386);stroke-width:1.20000005;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="m 304.05985,242.89398 5.96875,5.95312"
- id="path15364"
- sodipodi:nodetypes="cc" />
- <ellipse
- ry="0.61330098"
- rx="0.59120387"
- cy="242.89087"
- cx="304.0946"
- id="ellipse15366"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.51799999;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <ellipse
- ry="0.61330098"
- rx="0.59120387"
- cy="242.95337"
- cx="315.98523"
- id="ellipse15368"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.51799999;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <g
- transform="translate(189.00803,-79.37555)"
- style="display:inline;enable-background:new"
- id="g14119">
- <g
- id="g16949">
- <rect
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#272727;fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;enable-background:new"
- id="rect15992"
- width="2"
- height="7"
- x="134.47968"
- y="134"
- ry="1" />
- <rect
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#272727;fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;enable-background:new"
- id="rect15994"
- width="2"
- height="7"
- x="141.55502"
- y="134"
- ry="1" />
- <rect
- ry="1"
- y="136"
- x="131.25"
- height="3"
- width="15.5"
- id="rect15926"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#272727;fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;enable-background:new" />
- <rect
- ry="1"
- y="132.25"
- x="131.25"
- height="10.5"
- width="2.5"
- id="rect15930"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#272727;fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;enable-background:new" />
- <rect
- ry="1"
- y="132.25"
- x="144.25"
- height="10.5"
- width="2.5"
- id="rect15938"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#272727;fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;enable-background:new" />
- <g
- id="g16016-6"
- style="fill:url(#radialGradient16031);fill-opacity:1">
- <rect
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient14206);fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;enable-background:new"
- id="rect15946"
- width="1"
- height="9"
- x="132"
- y="133"
- ry="0.5" />
- <rect
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient14208);fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;enable-background:new"
- id="rect15946-7"
- width="1"
- height="9"
- x="145"
- y="133"
- ry="0.5" />
- <rect
- ry="0.5"
- y="137"
- x="132"
- height="1"
- width="14"
- id="rect15972"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient14210);fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;enable-background:new" />
- <rect
- ry="1"
- y="135"
- x="134.97968"
- height="5"
- width="1"
- id="rect15996"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient16945);fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;enable-background:new" />
- <rect
- ry="1"
- y="135"
- x="142.05502"
- height="5"
- width="1"
- id="rect15998"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient16947);fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;enable-background:new" />
- </g>
- <rect
- style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.51499999;fill:#0065ff;fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;enable-background:new"
- id="rect15974"
- width="4"
- height="11"
- x="137"
- y="132"
- ry="1" />
- <rect
- ry="1"
- y="133"
- x="138"
- height="9"
- width="2"
- id="rect15944"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient14216);fill-opacity:1;stroke:none;stroke-width:1.20000005;marker:none;enable-background:new" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g17465"
- transform="translate(62.844714,-106.93345)">
- <g
- transform="matrix(0.7,0,0,0.7,146.7,264.8)"
- id="ICON_COLOR-1-9"
- style="display:inline;enable-background:new">
- <rect
- y="238"
- x="341"
- height="16"
- width="16"
- id="rect36341-2-0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g36343-7-5"
- transform="translate(0,-12)">
- <g
- transform="matrix(1.1658027,0,0,1.1657997,198.71028,-2.0560643)"
- id="g36345-0-4">
- <path
- transform="matrix(0.6969448,0,0,0.6969467,36.918512,140.83126)"
- sodipodi:type="arc"
- style="fill:#ff6600;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36349-4-2"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="-2.8145849"
- inkscape:transform-center-y="-3.2499984" />
- <path
- inkscape:transform-center-y="1.6729808e-05"
- inkscape:transform-center-x="-3.2630798"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36351-3-6"
- style="fill:#ad2f94;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(0.3484724,0.6035735,-0.603572,0.3484734,154.13836,102.27942)" />
- <path
- transform="matrix(-0.3484724,0.6035735,-0.603572,-0.3484733,246.13507,184.51913)"
- sodipodi:type="arc"
- style="fill:#0060f0;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36353-9-8"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="-2.8145756"
- inkscape:transform-center-y="3.2500173" />
- <path
- inkscape:transform-center-y="3.249994"
- inkscape:transform-center-x="2.8145978"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36355-6-4"
- style="fill:#00d4aa;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(-0.6969448,2.2484149e-8,-4.6257528e-8,-0.6969467,220.91956,305.31067)" />
- <path
- transform="matrix(-0.3484724,-0.6035734,0.603572,-0.3484734,103.69972,343.86251)"
- sodipodi:type="arc"
- style="fill:#ccff00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36357-5-2"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="3.2630773" />
- <path
- inkscape:transform-center-x="2.8145777"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36359-0-5"
- style="fill:#ffbf0e;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(0.3484724,-0.6035734,0.603572,0.3484733,11.703006,261.6228)"
- inkscape:transform-center-y="-3.2500006" />
- </g>
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path36361-8-8"
- style="fill:none;stroke:#000000;stroke-width:0.98948926;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.8124999,0,0,0.8045157,241.75,163.13011)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.3;fill:url(#radialGradient37501-3-6);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36363-2-9"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.7451143,-0.08386971,0.08492794,-0.7396793,437.33358,356.39712)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.6860851,0,0,0.6874876,258.44808,176.87656)"
- style="fill:none;stroke:url(#linearGradient17463);stroke-width:1.45605874;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path36365-2-9"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- inkscape:transform-center-y="0.19622957"
- inkscape:transform-center-x="-1.373607"
- id="ICON_RESTRICT_SELECT_OFF-9"
- style="display:inline;enable-background:new"
- transform="matrix(0.45975513,-0.19653299,0.19653299,0.45975513,138.04837,311.70175)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17281);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 367.75,440.75 1.75,-1.5 2.5,5.25 1.75,-1 -2.25,-5 h 2.5 l -6.25,-6.25 z"
- id="path45378-1-5-6-6"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect45374-0-5-6-1"
- width="16"
- height="16"
- x="362"
- y="430" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 367.5,431.5 7,7.25 h -3 l 2.5,4.75 -1.75,1 -2.5,-5 -2.25,2.25 z"
- id="path17835-7-5"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 368.34375,433.75 v 5.75"
- id="path17845-9-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- </g>
- </g>
- <g
- style="display:inline;filter:url(#filter17385);enable-background:new"
- id="g17465-0"
- transform="translate(41.727744,-106.93345)">
- <g
- transform="matrix(0.7,0,0,0.7,146.7,264.8)"
- id="ICON_COLOR-1-9-4"
- style="display:inline;enable-background:new">
- <rect
- y="238"
- x="341"
- height="16"
- width="16"
- id="rect36341-2-0-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g36343-7-5-5"
- transform="translate(0,-12)">
- <g
- transform="matrix(1.1658027,0,0,1.1657997,198.71028,-2.0560643)"
- id="g36345-0-4-4">
- <path
- transform="matrix(0.6969448,0,0,0.6969467,36.918512,140.83126)"
- sodipodi:type="arc"
- style="fill:#ff6600;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36349-4-2-6"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="-2.8145849"
- inkscape:transform-center-y="-3.2499984" />
- <path
- inkscape:transform-center-y="1.6729808e-05"
- inkscape:transform-center-x="-3.2630798"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36351-3-6-5"
- style="fill:#ad2f94;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(0.3484724,0.6035735,-0.603572,0.3484734,154.13836,102.27942)" />
- <path
- transform="matrix(-0.3484724,0.6035735,-0.603572,-0.3484733,246.13507,184.51913)"
- sodipodi:type="arc"
- style="fill:#0060f0;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36353-9-8-2"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="-2.8145756"
- inkscape:transform-center-y="3.2500173" />
- <path
- inkscape:transform-center-y="3.249994"
- inkscape:transform-center-x="2.8145978"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36355-6-4-4"
- style="fill:#00d4aa;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(-0.6969448,2.2484149e-8,-4.6257528e-8,-0.6969467,220.91956,305.31067)" />
- <path
- transform="matrix(-0.3484724,-0.6035734,0.603572,-0.3484734,103.69972,343.86251)"
- sodipodi:type="arc"
- style="fill:#ccff00;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36357-5-2-5"
- sodipodi:cx="132"
- sodipodi:cy="118"
- sodipodi:rx="8"
- sodipodi:ry="8"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:start="4.712389"
- sodipodi:end="5.7595865"
- inkscape:transform-center-x="3.2630773" />
- <path
- inkscape:transform-center-x="2.8145777"
- sodipodi:end="5.7595865"
- sodipodi:start="4.712389"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- d="m 132,110 a 8,8 0 0 1 6.9282,4 L 132,118 Z"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path36359-0-5-9"
- style="fill:#ffbf0e;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:type="arc"
- transform="matrix(0.3484724,-0.6035734,0.603572,0.3484733,11.703006,261.6228)"
- inkscape:transform-center-y="-3.2500006" />
- </g>
- <circle
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path36361-8-8-0"
- style="fill:none;stroke:#000000;stroke-width:0.98948926;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.8124999,0,0,0.8045157,241.75,163.13011)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- style="display:inline;opacity:0.3;fill:url(#radialGradient37501-3-6-2);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path36363-2-9-7"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.7451143,-0.08386971,0.08492794,-0.7396793,437.33358,356.39712)"
- cx="132"
- cy="118"
- r="8" />
- <circle
- transform="matrix(0.6860851,0,0,0.6874876,258.44808,176.87656)"
- style="fill:none;stroke:url(#linearGradient31452);stroke-width:1.45605874;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path36365-2-9-7"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- cx="132"
- cy="118"
- r="8" />
- </g>
- </g>
- <g
- inkscape:transform-center-y="0.19622957"
- inkscape:transform-center-x="-1.373607"
- id="ICON_RESTRICT_SELECT_OFF-9-8"
- style="display:inline;enable-background:new"
- transform="matrix(0.45975513,-0.19653299,0.19653299,0.45975513,138.04837,311.70175)">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient31454);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- d="m 367.75,440.75 1.75,-1.5 2.5,5.25 1.75,-1 -2.25,-5 h 2.5 l -6.25,-6.25 z"
- id="path45378-1-5-6-6-9"
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect45374-0-5-6-1-0"
- width="16"
- height="16"
- x="362"
- y="430" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 367.5,431.5 7,7.25 h -3 l 2.5,4.75 -1.75,1 -2.5,-5 -2.25,2.25 z"
- id="path17835-7-5-7"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 368.34375,433.75 v 5.75"
- id="path17845-9-6-9"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- </g>
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_MESH_CAPSULE"
- transform="matrix(0.86967262,0,0,0.81949894,414.30767,262.03112)">
- <rect
- y="155"
- x="-228"
- height="16"
- width="16"
- id="rect41297-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccsccc"
- id="path41299-4"
- d="m -220,154.54901 c -3.036,0 -5.49999,3.07099 -5.49999,4.45099 l -1e-5,9 c 0,1.38 2.46399,4.41118 5.49999,4.41118 3.036,0 5.5,-3.03118 5.5,-4.41118 l 1e-5,-9 c 0,-1.38 -2.464,-4.45099 -5.5,-4.45099 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient31208);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -220,154.19066 c -3.49999,0 -5.36123,3.42934 -5.36123,4.80934 l -1e-5,8.5 c 0,2 2.32523,5.30934 5.36123,5.30934 3.036,0 5.36125,-3.30934 5.36125,-5.30934 V 159 c 0,-1.38 -1.86123,-4.80934 -5.36124,-4.80934 z"
- id="path41305-2"
- sodipodi:nodetypes="cccsccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient31210);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000248;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -224.5,160.5 v 6.5 c 0,0.9838 0.60816,4.76952 4.46531,4.76952 3.85714,0 4.53469,-3.78572 4.53469,-4.76952 v -6.5 c 0,0 0.43828,-5.18967 -4.47408,-5.25396 C -224.88644,155.18174 -224.5,160.5 -224.5,160.5 Z"
- id="path41307-2"
- sodipodi:nodetypes="ccsccsc"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- y="180.18372"
- x="871.95667"
- height="192"
- width="192"
- id="rect30285"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5.39191818;marker:none;enable-background:accumulate" />
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 2\IMAGE BROWSER ICONS.png"
- transform="translate(859.95667,-201.81628)"
- id="g21955"
- style="display:inline;opacity:0.3;enable-background:new">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- id="rect21957"
- width="48"
- height="48"
- x="108"
- y="430"
- rx="2.4004419"
- ry="0" />
- <g
- id="g21959">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path21961"
- d="m 125.5,433.5 h 23 v 41 h -33 v -31 z"
- style="display:inline;fill:url(#linearGradient21977);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path21963"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 147.25,434.5 c -4.875,0 -21.75,0 -21.75,0 m -8.9447,8.5 -0.0553,30"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011)"
- d="m 115,444 h 12 l -1,-11 z"
- id="path21965"
- sodipodi:nodetypes="cccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- clip-path="url(#clipPath13106-7)" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path21967"
- style="fill:none;stroke:url(#linearGradient21979);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 117.5,443.75 9,-2.5 v -6"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- clip-path="none" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 115.5,442.75 v 31.75 h 33 v -41 h -23.75 z"
- style="fill:none;stroke:#333333;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- id="path21969"
- sodipodi:nodetypes="cccccc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011)"
- d="m 116,443 11,1 -2,-10 z"
- id="path21971"
- sodipodi:nodetypes="cccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- clip-path="url(#clipPath13106-7)" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path21973"
- d="m 116,443 0.0108,0.72434 L 126,441 v -7 h -1 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 147.5,435 v 38.5 H 117"
- style="opacity:0.15;fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- id="path21975"
- sodipodi:nodetypes="ccc" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(3.9566736,0.18371585)"
- id="g30335">
- <g
- id="g21367"
- transform="translate(760,-202)">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path21369"
- d="m 125.5,433.5 h 23 v 41 h -33 v -31 z"
- style="display:inline;fill:url(#linearGradient30321);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path21371"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 147.25,434.5 c -4.875,0 -21.75,0 -21.75,0 m -8.9447,8.5 -0.0553,30"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011)"
- d="m 115,444 h 12 l -1,-11 z"
- id="path21373"
- sodipodi:nodetypes="cccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- clip-path="url(#clipPath13106-7)" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path21375"
- style="fill:none;stroke:url(#linearGradient30323);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 117.5,443.75 9,-2.5 v -6"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- clip-path="none" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 115.5,442.75 v 31.75 h 33 v -41 h -23.75 z"
- style="fill:none;stroke:#333333;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- id="path21377"
- sodipodi:nodetypes="cccccc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011)"
- d="m 116,443 11,1 -2,-10 z"
- id="path21569"
- sodipodi:nodetypes="cccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- clip-path="url(#clipPath13106-7)" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path21379"
- d="m 116,443 0.0108,0.72434 L 126,441 v -7 h -1 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 147.5,435 v 38.5 H 117"
- style="opacity:0.15;fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- id="path21381"
- sodipodi:nodetypes="ccc" />
- </g>
- <path
- inkscape:connector-curvature="0"
- style="font-style:normal;font-weight:normal;font-size:33.49144363px;font-family:'Bitstream Vera Sans';display:inline;fill:#214478;fill-opacity:1;stroke:none"
- d="m 891.07148,245 -0.0715,9 h 2.39012 C 896,254 896,253 896.5,251 h 0.5 v 7 h -0.5 c -0.5,-2 -0.5,-3 -3.10988,-3 H 891 v 7 c 0,2.5 1,3.25 3.14146,3.39973 l -0.004,0.60029 L 885,266 l 0.004,-0.60029 C 887,265.25 888,264.5 888.00001,262 L 888,248 c 0,-2.5 -1,-3.25 -3,-3.5 V 244 h 16 v 5 h -0.5 c -0.50001,-1.99999 -1.5,-4 -4.5,-4 z"
- id="text13209"
- sodipodi:nodetypes="ccccccccccccccccccccccc" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g21625"
- transform="translate(907.95667,-153.81628)"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 2\IMAGE BROWSER ICONS.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- ry="0"
- rx="2.4004419"
- y="430"
- x="108"
- height="48"
- width="48"
- id="rect21627"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate" />
- <g
- id="g21629">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:url(#linearGradient21647);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="m 125.5,433.5 h 23 v 41 h -33 v -31 z"
- id="path21631"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <g
- style="display:inline;opacity:0.5;fill:#000000"
- id="g16261"
- transform="matrix(1.2499985,0,0,1,-87.6203,-147.85351)">
- <rect
- style="display:block;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect35099"
- width="17.600004"
- height="1"
- x="167.69646"
- y="598.85352"
- rx="0.12125195"
- ry="0.065390877" />
- <rect
- style="display:block;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect35101"
- width="17.600004"
- height="1"
- x="167.69646"
- y="600.85352"
- rx="0.12125195"
- ry="0.065390877" />
- <rect
- style="display:block;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect15690"
- width="17.600004"
- height="1"
- x="167.69646"
- y="602.85352"
- rx="0.12125195"
- ry="0.065390877" />
- <rect
- style="display:block;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect15692"
- width="17.600004"
- height="1"
- x="167.69646"
- y="604.85352"
- rx="0.12125195"
- ry="0.065390877" />
- <rect
- style="display:block;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect15694"
- width="17.600004"
- height="1"
- x="167.69646"
- y="606.85352"
- rx="0.12125195"
- ry="0.065390877" />
- <rect
- style="display:block;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect15696"
- width="17.600004"
- height="1"
- x="167.69646"
- y="608.85352"
- rx="0.12125195"
- ry="0.065390877" />
- <rect
- style="display:block;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect15698"
- width="17.600004"
- height="1"
- x="167.69646"
- y="610.85352"
- rx="0.12125195"
- ry="0.065390877" />
- <rect
- style="display:block;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect15700"
- width="17.600004"
- height="1"
- x="167.69646"
- y="612.85352"
- rx="0.12125195"
- ry="0.065390877" />
- <rect
- style="display:block;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="rect15732"
- width="14.400002"
- height="1"
- x="167.69646"
- y="614.85352"
- rx="0.09920612"
- ry="0.065390877" />
- <g
- transform="translate(150.89645,557.85352)"
- id="g4849"
- style="display:inline;fill:#000000">
- <rect
- ry="0.065390877"
- rx="0.12125195"
- y="29"
- x="16.799992"
- height="1"
- width="17.600004"
- id="rect15736"
- style="display:block;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- ry="0.065390877"
- rx="0.12125195"
- y="31"
- x="16.799992"
- height="1"
- width="17.600004"
- id="rect15738"
- style="display:block;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- ry="0.065390877"
- rx="0.12125195"
- y="33"
- x="16.799992"
- height="1"
- width="17.600004"
- id="rect15740"
- style="display:block;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- ry="0.065390877"
- rx="0.12125195"
- y="35"
- x="16.799992"
- height="1"
- width="17.600004"
- id="rect15742"
- style="display:block;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <rect
- ry="0.065390877"
- rx="0.055114571"
- y="37"
- x="16.799992"
- height="1"
- width="8.0000095"
- id="rect15744"
- style="display:block;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <rect
- ry="0.065390304"
- rx="0.0057410933"
- y="617.85352"
- x="184.49646"
- height="0.99999124"
- width="0.83333319"
- id="rect16334"
- style="display:block;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- </g>
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 147.25,434.5 c -4.875,0 -21.75,0 -21.75,0 m -8.9447,8.5 -0.0553,30"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- id="path21633"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- clip-path="url(#clipPath13106-7)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path21635"
- d="m 115,444 h 12 l -1,-11 z"
- style="opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011)" />
- <path
- inkscape:connector-curvature="0"
- clip-path="none"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 117.5,443.75 9,-2.5 v -6"
- style="fill:none;stroke:url(#linearGradient21649);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path21637"
- sodipodi:nodetypes="ccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- id="path21639"
- style="fill:none;stroke:#333333;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 115.5,442.75 v 31.75 h 33 v -41 h -23.75 z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- clip-path="url(#clipPath13106-7)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path21641"
- d="m 116,443 11,1 -2,-10 z"
- style="display:inline;opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011)" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 116,443 0.0108,0.72434 L 126,441 v -7 h -1 z"
- id="path21643"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <g
- id="g35119"
- transform="translate(2,-160.99999)"
- style="display:inline">
- <g
- style="display:inline"
- transform="translate(105.39645,589.71201)"
- id="g16097">
- <g
- id="g16099"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-miterlimit:4"
- transform="matrix(0.229703,0,0,0.229703,4.967081,4.244972)">
- <radialGradient
- id="radialGradient16101"
- cx="20.892099"
- cy="114.5684"
- r="5.256"
- fx="20.892099"
- fy="114.5684"
- gradientUnits="userSpaceOnUse">
- <stop
- offset="0"
- style="stop-color:#F0F0F0"
- id="stop16103" />
- <stop
- offset="1"
- style="stop-color:#474747"
- id="stop16105" />
- </radialGradient>
- <radialGradient
- id="radialGradient16109"
- cx="20.892099"
- cy="64.567902"
- r="5.257"
- fx="20.892099"
- fy="64.567902"
- gradientUnits="userSpaceOnUse">
- <stop
- offset="0"
- style="stop-color:#F0F0F0"
- id="stop16111" />
- <stop
- offset="1"
- style="stop-color:#474747"
- id="stop16113" />
- </radialGradient>
- </g>
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 12.85355,31.53813 c 0,0.552274 -0.447803,0.99986 -1,0.99986 -0.552477,0 -1,-0.447865 -1,-0.99986 0,-0.552554 0.447803,-1.00014 1,-1.00014 0.552197,0 1,0.447866 1,1.00014 z"
- id="path16107" />
- <path
- inkscape:connector-curvature="0"
- style="fill:url(#radialGradient21565);fill-rule:nonzero;stroke:none"
- d="m 12.60355,31.288131 c 0,0.552274 -0.447803,0.999859 -1,0.999859 -0.552477,0 -1,-0.447865 -1,-0.999859 0,-0.552556 0.447803,-1.000141 1,-1.000141 0.552197,0 1,0.447866 1,1.000141 z"
- id="path16117" />
- </g>
- <g
- id="g16131"
- transform="translate(105.39645,579.71201)"
- style="display:inline">
- <g
- transform="matrix(0.229703,0,0,0.229703,4.967081,4.244972)"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-miterlimit:4"
- id="g16133">
- <radialGradient
- gradientUnits="userSpaceOnUse"
- fy="114.5684"
- fx="20.892099"
- r="5.256"
- cy="114.5684"
- cx="20.892099"
- id="radialGradient16135">
- <stop
- id="stop16137"
- style="stop-color:#F0F0F0"
- offset="0" />
- <stop
- id="stop16140"
- style="stop-color:#474747"
- offset="1" />
- </radialGradient>
- <radialGradient
- gradientUnits="userSpaceOnUse"
- fy="64.567902"
- fx="20.892099"
- r="5.257"
- cy="64.567902"
- cx="20.892099"
- id="radialGradient16142">
- <stop
- id="stop16144"
- style="stop-color:#F0F0F0"
- offset="0" />
- <stop
- id="stop16146"
- style="stop-color:#474747"
- offset="1" />
- </radialGradient>
- </g>
- <path
- inkscape:connector-curvature="0"
- id="path35139"
- d="m 12.85355,31.53813 c 0,0.552274 -0.447803,0.99986 -1,0.99986 -0.552477,0 -1,-0.447865 -1,-0.99986 0,-0.552554 0.447803,-1.00014 1,-1.00014 0.552197,0 1,0.447866 1,1.00014 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- id="path35141"
- d="m 12.60355,31.288131 c 0,0.552274 -0.447803,0.999859 -1,0.999859 -0.552477,0 -1,-0.447865 -1,-0.999859 0,-0.552556 0.447803,-1.000141 1,-1.000141 0.552197,0 1,0.447866 1,1.000141 z"
- style="fill:url(#radialGradient21567);fill-rule:nonzero;stroke:none" />
- </g>
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path21645"
- style="opacity:0.15;fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 147.5,435 v 38.5 H 117"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g21572"
- transform="translate(811.95667,-201.81628)"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 2\IMAGE BROWSER ICONS.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- ry="0"
- rx="2.4004419"
- y="430"
- x="108"
- height="48"
- width="48"
- id="rect21574"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate" />
- <g
- id="g21576">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:url(#linearGradient21594);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="m 125.5,433.5 h 23 v 41 h -33 v -31 z"
- id="path21578"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 147.25,434.5 c -4.875,0 -21.75,0 -21.75,0 m -8.9447,8.5 -0.0553,30"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- id="path21580"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- clip-path="url(#clipPath13106-7)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path21582"
- d="m 115,444 h 12 l -1,-11 z"
- style="opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011)" />
- <path
- inkscape:connector-curvature="0"
- clip-path="none"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 117.5,443.75 9,-2.5 v -6"
- style="fill:none;stroke:url(#linearGradient21596);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path21584"
- sodipodi:nodetypes="ccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- id="path21586"
- style="fill:none;stroke:#333333;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 115.5,442.75 v 31.75 h 33 v -41 h -23.75 z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- clip-path="url(#clipPath13106-7)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path21588"
- d="m 116,443 11,1 -2,-10 z"
- style="display:inline;opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011)" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 116,443 0.0108,0.72434 L 126,441 v -7 h -1 z"
- id="path21590"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path21592"
- style="opacity:0.15;fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 147.5,435 v 38.5 H 117"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(3.9566736,0.18371585)"
- id="g30382">
- <g
- id="g23655"
- transform="translate(760,-154)">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path23657"
- d="m 125.5,433.5 h 23 v 41 h -33 v -31 z"
- style="display:inline;fill:url(#linearGradient30368);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path23659"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 147.25,434.5 c -4.875,0 -21.75,0 -21.75,0 m -8.9447,8.5 -0.0553,30"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011)"
- d="m 115,444 h 12 l -1,-11 z"
- id="path23661"
- sodipodi:nodetypes="cccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- clip-path="url(#clipPath13106-7)" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path23663"
- style="fill:none;stroke:url(#linearGradient30370);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 117.5,443.75 9,-2.5 v -6"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- clip-path="none" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 115.5,442.75 v 31.75 h 33 v -41 h -23.75 z"
- style="fill:none;stroke:#333333;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- id="path23665"
- sodipodi:nodetypes="cccccc" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011)"
- d="m 116,443 11,1 -2,-10 z"
- id="path23667"
- sodipodi:nodetypes="cccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- clip-path="url(#clipPath13106-7)" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path23669"
- d="m 116,443 0.0108,0.72434 L 126,441 v -7 h -1 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 147.5,435 v 38.5 H 117"
- style="opacity:0.15;fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- id="path23671"
- sodipodi:nodetypes="ccc" />
- </g>
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#112b00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- d="m 888,295 h 1 v 14 h -1 z"
- id="path23675"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- id="path23677"
- d="m 900,294 1.00002,-1 v 14 H 900 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:#112b00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- id="path23679"
- d="m 901.00003,292 v 2.25 l -13.00002,2 V 294 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:#112b00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate" />
- <g
- id="g23681"
- transform="matrix(1.1428564,0,0,1.2000001,822.71436,-355.40005)">
- <ellipse
- ry="2.25"
- rx="4.5"
- cy="554"
- cx="53"
- transform="matrix(0.7630859,-0.2494396,0.2996015,0.9926766,-151.92281,17.77746)"
- id="path23683"
- style="display:inline;overflow:visible;visibility:visible;fill:#112b00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate" />
- <ellipse
- ry="2.25"
- rx="4.5"
- cy="554"
- cx="53"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;filter:url(#filter20578-5);enable-background:accumulate"
- id="path23685"
- transform="matrix(0.3848865,-0.1700959,0.2278131,0.3626733,-93.107467,361.59408)"
- inkscape:transform-center-y="0.3813435"
- clip-path="url(#clipPath20586-3)" />
- </g>
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.38999999;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- d="m 901.00003,292 -1e-5,1 -13.00002,2 10e-6,-1 z"
- id="path23694"
- sodipodi:nodetypes="ccccc" />
- <g
- transform="matrix(1.1428564,0,0,1.2000001,834.71436,-357.40005)"
- id="g23717">
- <ellipse
- ry="2.25"
- rx="4.5"
- cy="554"
- cx="53"
- style="display:inline;overflow:visible;visibility:visible;fill:#112b00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- id="path23724"
- transform="matrix(0.7630859,-0.2494396,0.2996015,0.9926766,-151.92281,17.77746)" />
- <ellipse
- ry="2.25"
- rx="4.5"
- cy="554"
- cx="53"
- clip-path="url(#clipPath20586-3)"
- inkscape:transform-center-y="0.3813435"
- transform="matrix(0.3848865,-0.1700959,0.2278131,0.3626733,-93.107467,361.59408)"
- id="path23726"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;filter:url(#filter20578-5);enable-background:accumulate" />
- </g>
- </g>
- <g
- id="g23922"
- transform="translate(-12.043326,-219.81628)"
- style="display:inline;enable-background:new">
- <g
- style="display:inline"
- id="g23924"
- transform="translate(824,66)"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 2\IMAGE BROWSER ICONS.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- ry="0"
- rx="2.4004419"
- y="430"
- x="108"
- height="48"
- width="48"
- id="rect23926"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate" />
- <g
- id="g23928">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:url(#linearGradient23978);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="m 125.5,433.5 h 23 v 41 h -33 v -31 z"
- id="path23930"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 147.25,434.5 c -4.875,0 -21.75,0 -21.75,0 m -8.9447,8.5 -0.0553,30"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- id="path23932"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- clip-path="url(#clipPath13106-7)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path23934"
- d="m 115,444 h 12 l -1,-11 z"
- style="opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011)" />
- <path
- inkscape:connector-curvature="0"
- clip-path="none"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 117.5,443.75 9,-2.5 v -6"
- style="fill:none;stroke:url(#linearGradient23980);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path23936"
- sodipodi:nodetypes="ccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- id="path23938"
- style="fill:none;stroke:#333333;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 115.5,442.75 v 31.75 h 33 v -41 h -23.75 z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- clip-path="url(#clipPath13106-7)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path23940"
- d="m 116,443 11,1 -2,-10 z"
- style="display:inline;opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011)" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 116,443 0.0108,0.72434 L 126,441 v -7 h -1 z"
- id="path23942"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path23944"
- style="opacity:0.15;fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 147.5,435 v 38.5 H 117"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccc"
- id="path23946"
- d="m 952,530 v 10 h 1 1 11 1 1 v -10 z m 1,2 h 1 v 1 h -1 z m 12,0 h 1 v 1 h -1 z m -12,3 h 1 v 1 h -1 z m 12,0 h 1 v 1 h -1 z m -12,3 h 1 v 1 h -1 z m 12,0 h 1 v 1 h -1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- transform="scale(1,-1)"
- style="fill:url(#linearGradient23982);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect23948"
- width="13"
- height="5.5"
- x="953"
- y="-524" />
- <path
- inkscape:connector-curvature="0"
- id="path23952"
- transform="translate(76)"
- d="m 876,514 v 17 h 15 v -17 h -1 v 1 h -1 v -1 h -11 v 1 h -1 v -1 z m 1,3 h 1 v 1 h -1 z m 12,0 h 1 v 1 h -1 z m -12,3 h 1 v 1 h -1 z m 12,0 h 1 v 1 h -1 z m -12,3 h 1 v 1 h -1 z m 12,0 h 1 v 1 h -1 z m -12,3 h 1 v 1 h -1 z m 12,0 h 1 v 1 h -1 z m -12,3 h 1 v 1 h -1 z m 12,0 h 1 v 1 h -1 z"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccc"
- style="fill:url(#linearGradient23986);fill-opacity:1;fill-rule:nonzero;stroke:none"
- d="m 952,507 h 3 v 3 h 9 v -3 h 3 v 7 h -15 z m 1,0 h 1 z m 0,1 v 1 h 1 v -1 z m 0,3 v 1 h 1 v -1 z m 12,-4 h 1 z m 0,1 v 1 h 1 v -1 z m 0,3 v 1 h 1 v -1 z"
- id="path23954" />
- <rect
- transform="matrix(0,1,1,0,0,0)"
- ry="0"
- y="955"
- x="507"
- height="9"
- width="3"
- id="rect23956"
- style="fill:url(#linearGradient23988);fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect23958"
- width="9"
- height="9"
- x="512"
- y="955"
- ry="0"
- transform="matrix(0,1,1,0,0,0)" />
- <rect
- transform="matrix(0,1,1,0,0,0)"
- ry="0"
- y="955"
- x="523"
- height="9"
- width="9"
- id="rect23960"
- style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <circle
- r="8"
- cy="118"
- cx="132"
- transform="matrix(0,-0.5624971,0.5624971,0,893.12531,590.74965)"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path23962"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <circle
- r="8"
- cy="118"
- cx="132"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path23964"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="matrix(0,-0.5624964,0.5624964,0,893.12545,601.74956)" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccccccc"
- id="path23966"
- d="m 961.00001,519.00005 h -3 v -0.99992 h 0.99994 l 6e-5,-2.00008 h -1 v -1 h 1 v -1 h 1.00006 v 4.00008 h 0.99994 z" />
- <path
- inkscape:connector-curvature="0"
- d="m 958,525 v 1 h 2 v -1 z m 2,1 v 1 h 1 v -1 z m 0,1 h -1 v 1 h 1 z m -1,1 h -1 v 1 1 h 3 v -1 h -2 z"
- id="path23968" />
- <rect
- style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect23970"
- width="6"
- height="9"
- x="534"
- y="955"
- ry="0"
- transform="matrix(0,1,1,0,0,0)" />
- <g
- clip-path="url(#clipPath23877-4)"
- id="g23972">
- <circle
- r="8"
- cy="118"
- cx="132"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="path23974"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="matrix(0,-0.5624964,0.5624964,0,893.12545,612.74956)" />
- <path
- inkscape:connector-curvature="0"
- d="m 958,536 v 1 h 2 v -1 z m 2,1 v 1 h 1 v -1 z m 0,1 h -1 v 1 h 1 z m 0,1 v 1 h 1 v -1 z m 0,1 h -2 v 1 h 2 z"
- id="path23976" />
- </g>
- </g>
- <g
- transform="translate(211.95667,88.183716)"
- id="g45475"
- style="display:inline;enable-background:new">
- <g
- style="display:inline"
- id="g22242"
- transform="translate(696,-194)"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 2\IMAGE BROWSER ICONS.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- ry="0"
- rx="2.4004419"
- y="430"
- x="108"
- height="48"
- width="48"
- id="rect22244"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate" />
- <g
- id="g22246">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:url(#linearGradient22274);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="m 125.5,433.5 h 23 v 41 h -33 v -31 z"
- id="path22249"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 147.25,434.5 c -4.875,0 -21.75,0 -21.75,0 m -8.9447,8.5 -0.0553,30"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- id="path22251"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- clip-path="url(#clipPath13106-7)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path22253"
- d="m 115,444 h 12 l -1,-11 z"
- style="opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011)" />
- <path
- inkscape:connector-curvature="0"
- clip-path="none"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 117.5,443.75 9,-2.5 v -6"
- style="fill:none;stroke:url(#linearGradient22276);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path22264"
- sodipodi:nodetypes="ccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- id="path22266"
- style="fill:none;stroke:#333333;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 115.5,442.75 v 31.75 h 33 v -41 h -23.75 z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- clip-path="url(#clipPath13106-7)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path22268"
- d="m 116,443 11,1 -2,-10 z"
- style="display:inline;opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011)" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 116,443 0.0108,0.72434 L 126,441 v -7 h -1 z"
- id="path22270"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path22272"
- style="opacity:0.15;fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 147.5,435 v 38.5 H 117"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- <g
- id="g21517"
- inkscape:label="Layer 1"
- transform="matrix(0.5406242,0,0,0.5829534,814.13667,247.65542)">
- <ellipse
- ry="5.3033009"
- rx="15.467961"
- cy="38.98439"
- cx="28.019106"
- transform="matrix(1.274286,0,0,1.377124,-7.569123,-16.70193)"
- id="path35486"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.54857142;fill:url(#radialGradient21442);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="csssssssssscccsscccscccssccc"
- d="m 16.048489,28.093447 c 0.0098,0.576682 0.196474,1.697902 0.471116,2.577425 0.581566,1.854137 1.56684,3.572658 2.939126,5.086496 1.407488,1.553118 3.138519,2.803227 5.139315,3.68976 2.105357,0.931573 4.384795,1.407488 6.750134,1.403741 2.365339,-0.005 4.644601,-0.488686 6.74896,-1.427017 2.00002,-0.895288 3.731043,-2.148391 5.13754,-3.705517 1.369207,-1.519844 2.352576,-3.241114 2.934089,-5.096258 0.294262,-0.938353 0.476921,-1.889392 0.553238,-2.845308 0.07331,-0.939306 0.04204,-1.883511 -0.09183,-2.823792 -0.259981,-1.835599 -0.896294,-3.556847 -1.872652,-5.12758 -0.895541,-1.441699 -2.047808,-2.70454 -3.417268,-3.766975 0,0 0.002,-0.002 0.002,-0.002 0,0 -13.828458,-10.6197195 -13.828458,-10.6197195 -0.01176,-0.00978 -0.02252,-0.019551 -0.03529,-0.028344 -0.909003,-0.6959264 -3.879837,-0.7738945 -4.87679,-0.075035 -1.01067,0.7057021 -1.091821,1.8092613 -0.195527,2.5482146 1.899775,1.4997633 2.656207,2.2801589 4.566507,3.7797379 0,0 -14.852491,0.167033 -14.852491,0.167033 -1.994685,0 -3.1682609,0.947915 -3.4153947,2.333683 -0.2180771,1.222836 0.7479213,2.738129 2.4800217,2.738129 2.956573,0.0039 5.942111,-0.0069 8.909215,-0.01272 0,0 -16.01999,12.453223 -16.01999,12.453223 -0.020527,0.01564 -0.041053,0.02933 -0.06158,0.04497 -1.4974197,1.148389 -1.9831951,3.059322 -1.0399808,4.268393 0.9598323,1.22959 2.9977653,1.230588 4.5147288,0.006 0,0 8.677593,-7.102098 8.677593,-7.102098 0,0 -0.12511,0.959824 -0.116333,1.535532 z"
- id="path2482"
- style="fill:#f57900;fill-rule:evenodd;stroke:#aa4400;stroke-width:1.7812928;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" />
- <ellipse
- ry="10.125"
- rx="11.5625"
- cy="25.75"
- cx="31.1875"
- transform="matrix(0.8018194,0,0,0.8471126,6.257567,4.5089892)"
- id="path39153"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient21444);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.4857143;fill:none;stroke:url(#linearGradient21446);stroke-width:1.7812928;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
- d="m 25.8125,6.40625 c -0.334829,4.572e-4 -0.72202,0.089606 -0.90625,0.21875 4.5e-4,0.010412 4.5e-4,0.020838 0,0.03125 -0.212626,0.1484635 -0.188235,0.1956271 -0.1875,0.1875 0.0092,0.010621 -0.0072,-4.246e-4 0.03125,0.03125 0.01962,0.00828 0.03527,0.012546 0.0625,0.03125 0.01676,0.01151 0.01357,0.014555 0.03125,0.03125 0.193748,0.1576058 4.954976,4.005164 4.954976,4.005164 0.489837,0.39864 0.677395,1.066352 0.46875,1.65625 -0.115662,0.32703 -0.422813,0.541217 -0.6875,0.59375 -0.264687,0.05253 -0.498447,0.03054 -0.71875,0.03125 -5.639658,0.05119 -16.87989,0.03851 -16.87989,0.03851 -0.4102,2.75e-4 -0.935835,0.115997 -1.34375,0.34375 -0.407915,0.227753 -0.6637862,0.523861 -0.6875002,0.90625 -0.024417,0.393728 0.098829,0.605767 0.3437502,0.78125 0.244921,0.175483 0.614978,0.25 0.875,0.25 0,0 8.8125,0 8.8125,0 0.600305,-7.28e-4 1.223895,0.311058 1.4375,0.9375 0.04676,0.137121 0.06335,0.269976 0.0625,0.40625 -8.49e-4,0.136274 -0.02214,0.268794 -0.09375,0.375 -0.143211,0.212412 -0.319507,0.298568 -0.5,0.4375 0,0 -15.7871819,12.746851 -15.856336,12.800078 C 5.0310984,30.500117 5,30.53125 5,30.53125 5.0100745,30.519077 5.000335,30.499512 5,30.5 L 4.8125,30.3125 c 0.012336,0.02165 0.014481,0.03307 0.03125,0.0625 0.063558,0.0774 0.125,0.15625 0.125,0.15625 -0.00585,0.0056 -0.031233,0.03124 -0.03125,0.03125 0,0 -0.043442,-0.09921 -0.09375,-0.1875 0.037843,0.09884 0.06253,0.218739 0.0625,0.21875 -0.4662091,0.37119 -0.7783348,0.889746 -0.875,1.28125 -0.1043319,0.422581 -0.046,0.62455 0.125,0.84375 0.2999827,0.384295 1.3975356,0.595547 2.40625,-0.21875 0,0 8.65625,-7.09375 8.65625,-7.09375 0.473718,-0.387074 1.1446,-0.458625 1.6875,-0.15625 0.544608,0.303331 0.798054,0.927572 0.71875,1.53125 0,0 -0.0626,0.908319 -0.0625,1.25 2e-6,0.0085 -1.19e-4,0.02348 0,0.03125 0.192796,2.523718 1.400736,4.762818 3.03125,6.71875 2.801818,3.089095 6.627659,4.401619 10.75,4.5625 4.113324,-0.043 7.964529,-1.606111 10.75,-4.625 2.546631,-3.125326 3.513872,-6.363859 3.15625,-9.375 C 44.891575,22.325847 43.222923,19.516566 40.4375,17.25 35.951885,13.599946 31.206991,10.168434 26.59375,6.625 26.57515,6.610386 26.56455,6.59802 26.5625,6.59375 26.43835,6.498703 26.144223,6.4057899 25.8125,6.40625 Z"
- id="path21414"
- sodipodi:nodetypes="csssssscssscsssccssscscccsccssssccscsscccssssc" />
- <path
- inkscape:connector-curvature="0"
- d="m 25.708956,26.064593 c 0.07649,-1.397943 0.759369,-2.631914 1.78592,-3.505519 1.010226,-0.858782 2.366788,-1.383145 3.848625,-1.383145 1.480894,0 2.837456,0.524363 3.847446,1.383145 1.027685,0.873605 1.709741,2.106651 1.787122,3.504594 0.07927,1.438713 -0.49591,2.77459 -1.504012,3.764001 -1.027686,1.007933 -2.493008,1.640678 -4.130556,1.640678 -1.63849,0 -3.103814,-0.632745 -4.131451,-1.640678 -1.00914,-0.989411 -1.58234,-2.325288 -1.503094,-3.763076 z"
- id="path2478"
- style="fill:#3465a4;fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="csssscsccsscsccssssscsscccsssc"
- id="path39166"
- d="m 25.8125,6.03125 c -0.404852,5.53e-4 -2.204797,-0.059029 -2.48145,0.1349032 -0.280209,0.195652 -0.335403,0.376484 -0.34375,0.46875 -0.0083,0.092266 -0.01539,0.17648 0.1875,0.34375 0.01899,0.015735 0.04457,0.014317 0.0625,0.03125 0.124258,0.101028 4.748869,4.1248618 4.748869,4.1248618 0.373658,0.304091 0.504393,0.795817 0.34375,1.25 -0.160635,0.454191 -0.580748,0.373449 -1.0625,0.375 -5.634142,0.05114 -15.087371,-0.129601 -15.087371,-0.129601 -0.952967,6.38e-4 -2.339958,0.524782 -2.4062504,1.59375 -0.063562,1.024947 0.9247974,1.4375 1.5937504,1.4375 0,-1e-6 8.8125,0 8.8125,0 0.488364,-5.92e-4 0.936141,0.225277 1.09375,0.6875 0.157609,0.462231 -0.01926,0.514621 -0.40625,0.8125 0,0 -16.086298,13.088586 -16.086298,13.088586 -0.00142,0.0014 -0.029829,-0.0014 -0.03125,0 -0.064037,0.04879 -0.054226,0.04875 -0.03125,0.03125 -0.5536758,0.424619 -0.9087886,1.004019 -1.03125,1.5 -0.1224536,0.495981 -0.04661,0.856152 0.1875,1.15625 0.4788333,0.613413 1.777612,0.754857 2.90625,-0.15625 1e-7,10e-7 8.65625,-7.09375 8.65625,-7.09375 0.361955,-0.295753 0.872897,-0.352437 1.28125,-0.125 0.408345,0.227436 0.623381,0.692814 0.5625,1.15625 0,-1e-6 -0.0997,0.953636 -0.09375,1.34375 0.09498,1.301756 0.451616,2.521825 0.989039,3.664234 C 20.799917,36.321089 27.770982,19.392853 44.1875,21.03125 43.339652,19.54368 42.151282,18.185293 40.65625,16.96875 36.159865,13.309932 31.42016,9.882897 26.8125,6.34375 26.805335,6.338858 26.788292,6.317553 26.78125,6.3125 26.570707,6.151312 26.216591,6.030689 25.8125,6.03125 Z"
- style="opacity:0.51999996;fill:url(#radialGradient21448);fill-opacity:1;fill-rule:evenodd;stroke:none" />
- </g>
- </g>
- <g
- transform="translate(-0.04332638,0.18371585)"
- style="display:inline;enable-background:new"
- id="g6090">
- <g
- id="g24784"
- transform="translate(116,247.5)"
- style="opacity:0.5">
- <path
- sodipodi:nodetypes="ccccccssssccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24809);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="path24789"
- d="m 806.5,114.5 c 0,2.25 2,4 4,4 h 30 c 0.4163,0 1,-0.5 1,-1 v -29 c 0,-0.5 -0.5,-1 -1,-1 l -21.02773,0.04419 C 818.98721,87.545209 818.5,87 818.5,86.5 v -3 c 0,-0.5 -0.5,-1 -1,-1 h -10 c -0.5,0 -1,0.5 -1,1 z"
- inkscape:connector-curvature="0" />
- <path
- id="path24791"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.07999998;fill:url(#linearGradient24811);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- d="m 807.5,89.5 h 33 m -33,12 h 33 m -33,-4 h 33 m -33,-6 h 33 m -33,20 h 33 m -33,2 h 33 m -33,-18 h 33 m -33,-2 h 33 m -20,-6 h -13 m 0,20 h 33 m -33,-2 h 33 m -33,-2 h 33 m -33,-4 h 33 m -33,10 h 33 m -33,6 h 33"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="74.800003"
- inkscape:export-xdpi="74.800003"
- inkscape:export-filename="/home/jimmac/ximian_art/icons/nautilus/suse93/gnome-fs-directory.png"
- sodipodi:nodetypes="csccsczc"
- id="path24793"
- d="m 844,118.5 c 3.5,0 5.5,-2 5.5,-5.5 V 94.5 c -11.75604,-1.11e-4 -23.91623,0 -35.5,0 V 114 c 0,4.5 -7,4 -7,0.25 0,2 2.00002,3.73529 3,3.75 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24813);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- d="m 807,87 h 12 l 0.0385,-3.33333 C 819.04423,83.166705 818.97512,83 818.5,83 h -10.92308 c -0.47512,0 -0.53846,0.16667 -0.53846,0.66667 z"
- id="path24796"
- style="opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:nodetypes="ccssccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- d="m 840.5,89 v 4.5"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:none;stroke:#000000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="path24799"
- inkscape:connector-curvature="0" />
- <path
- id="path24801"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:none;stroke:#000000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- d="m 848.5,95.5 v 18 c 0,1.25 0.25,3 -1.25,4"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccccsc"
- d="m 818.5,83.5 h -11 v 30 c 0,5 7,5 7,0 v -18 h 34 m -29,-8 c 0,0.5 0.5286,1 1,1 h 20"
- style="display:inline;opacity:0.75;fill:none;stroke:#ffffff;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path24803"
- inkscape:connector-curvature="0" />
- <path
- d="m 806.5,113.5 c 0,2.75 2,5 5,5 h 33 c 3,0 5,-2 5,-5 v -18 c 0,-0.471405 -0.5286,-1 -1,-1 h -7 v -6 c 0,-0.5 -0.5,-1 -1,-1 l -20.02773,0.04419 C 819.98721,87.54526 819.5,87 819.5,86.5 v -3 c 0,-0.5 -0.5,-1 -1,-1 h -11 c -0.5,0 -1,0.5 -1,1 z"
- id="path24805"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccsscccssssccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient24815);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 841.5,94.5 h -27 c -0.4714,0 -1,0.528595 -1,1 v 18 c 0,2.25 -1.25,3 -2.5,3"
- id="path24807"
- sodipodi:nodetypes="csscc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;filter:url(#filter6078);enable-background:new"
- id="g44334"
- transform="translate(619,272.5)">
- <rect
- y="73"
- x="320"
- height="16"
- width="16"
- id="rect44336"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate" />
- <g
- id="g44338"
- transform="translate(0,-21)">
- <g
- id="g44340">
- <g
- id="g44342"
- transform="translate(0,21)">
- <path
- style="fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 333.25,87 H 328 l -1,-1 V 76"
- id="path44344"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 331.25,79.25 327,75.005631 322.75,79.25"
- id="path44346"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g44348"
- transform="translate(0,21)">
- <path
- sodipodi:nodetypes="cccc"
- id="path44350"
- d="M 333.25,87 H 328 l -1,-1 V 76"
- style="fill:none;stroke:#e6e6e6;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path44352"
- d="M 331.25,79.25 327,75.005631 322.75,79.25"
- style="fill:none;stroke:#e6e6e6;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- sodipodi:nodetypes="cccccc"
- id="path44354"
- d="m 328.5,107.5 h 5 m -7,-9 v 8.5 m -4.25,-7 4.5,-4.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- transform="translate(67.956674,247.68372)"
- id="g24818"
- style="display:inline;enable-background:new">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccssssccc"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24839);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- id="path24821"
- d="m 806.5,114.5 c 0,2.25 2,4 4,4 h 30 c 0.4163,0 1,-0.5 1,-1 v -29 c 0,-0.5 -0.5,-1 -1,-1 l -21.02773,0.04419 C 818.98721,87.545209 818.5,87 818.5,86.5 v -3 c 0,-0.5 -0.5,-1 -1,-1 h -10 c -0.5,0 -1,0.5 -1,1 z" />
- <path
- inkscape:connector-curvature="0"
- id="path24823"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.07999998;fill:url(#linearGradient24841);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- d="m 807.5,89.5 h 33 m -33,12 h 33 m -33,-4 h 33 m -33,-6 h 33 m -33,20 h 33 m -33,2 h 33 m -33,-18 h 33 m -33,-2 h 33 m -20,-6 h -13 m 0,20 h 33 m -33,-2 h 33 m -33,-2 h 33 m -33,-4 h 33 m -33,10 h 33 m -33,6 h 33"
- sodipodi:nodetypes="cccccccccccccccccccccccccccccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="74.800003"
- inkscape:export-xdpi="74.800003"
- inkscape:export-filename="/home/jimmac/ximian_art/icons/nautilus/suse93/gnome-fs-directory.png"
- sodipodi:nodetypes="csccsczc"
- id="path24825"
- d="m 844,118.5 c 3.5,0 5.5,-2 5.5,-5.5 V 97 c -11.75604,-1.11e-4 -23.91623,0 -35.5,0 v 17 c 0,4.5 -7,4 -7,0.25 0,2 2.00002,3.73529 3,3.75 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24843);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- d="m 807,87 h 12 l 0.0385,-3.33333 C 819.04423,83.166705 818.97512,83 818.5,83 h -10.92308 c -0.47512,0 -0.53846,0.16667 -0.53846,0.66667 z"
- id="path24827"
- style="opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- sodipodi:nodetypes="ccssccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- d="m 840.5,89 v 7.5"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:none;stroke:#000000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="path24829" />
- <path
- inkscape:connector-curvature="0"
- id="path24831"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:none;stroke:#000000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- d="m 848.5,98.75 v 14.75 c 0,1.25 0.25,3 -1.25,4"
- sodipodi:nodetypes="ccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccsc"
- d="m 818.5,83.5 h -11 v 30 c 0,5 7,5 7,0 v -16 h 34 m -29,-10 c 0,0.5 0.5286,1 1,1 h 20"
- style="display:inline;opacity:0.75;fill:none;stroke:#ffffff;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path24833" />
- <path
- inkscape:connector-curvature="0"
- d="m 806.5,113.5 c 0,2.75 2,5 5,5 h 33 c 3,0 5,-2 5,-5 v -16 c 0,-0.471405 -0.5286,-1 -1,-1 h -7 v -8 c 0,-0.5 -0.5,-1 -1,-1 l -20.02773,0.04419 C 819.98721,87.54526 819.5,87 819.5,86.5 v -3 c 0,-0.5 -0.5,-1 -1,-1 h -11 c -0.5,0 -1,0.5 -1,1 z"
- id="path24835"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccsscccssssccc" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient24845);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 841.5,96.500004 h -27 c -0.4714,0 -1,0.528595 -1,1 V 113.5 c 0,2.25 -1.25,3 -2.5,3"
- id="path24837"
- sodipodi:nodetypes="csscc" />
- </g>
- <g
- transform="translate(-0.04332638,0.18371585)"
- style="display:inline;enable-background:new"
- id="g6158">
- <g
- transform="translate(164,247.5)"
- id="g24847"
- style="opacity:0.5">
- <path
- d="m 806.5,114.5 c 0,2.25 2,4 4,4 h 30 c 0.4163,0 1,-0.5 1,-1 v -29 c 0,-0.5 -0.5,-1 -1,-1 l -21.02773,0.04419 C 818.98721,87.545209 818.5,87 818.5,86.5 v -3 c 0,-0.5 -0.5,-1 -1,-1 h -10 c -0.5,0 -1,0.5 -1,1 z"
- id="path24849"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24867);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccssssccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccccccccccccccccccccccccccc"
- d="m 807.5,89.5 h 33 m -33,12 h 33 m -33,-4 h 33 m -33,-6 h 33 m -33,20 h 33 m -33,2 h 33 m -33,-18 h 33 m -33,-2 h 33 m -20,-6 h -13 m 0,20 h 33 m -33,-2 h 33 m -33,-2 h 33 m -33,-4 h 33 m -33,10 h 33 m -33,6 h 33"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.07999998;fill:url(#linearGradient24869);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="path24851"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient24871);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate"
- d="m 844,118.5 c 3.5,0 5.5,-2 5.5,-5.5 V 94.5 c -11.75604,-1.11e-4 -23.91623,0 -35.5,0 V 114 c 0,4.5 -7,4 -7,0.25 0,2 2.00002,3.73529 3,3.75 z"
- id="path24853"
- sodipodi:nodetypes="csccsczc"
- inkscape:export-filename="/home/jimmac/ximian_art/icons/nautilus/suse93/gnome-fs-directory.png"
- inkscape:export-xdpi="74.800003"
- inkscape:export-ydpi="74.800003"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccssccc"
- style="opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="path24855"
- d="m 807,87 h 12 l 0.0385,-3.33333 C 819.04423,83.166705 818.97512,83 818.5,83 h -10.92308 c -0.47512,0 -0.53846,0.16667 -0.53846,0.66667 z"
- inkscape:connector-curvature="0" />
- <path
- id="path24857"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:none;stroke:#000000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- d="m 840.5,89 v 4.5"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- d="m 848.5,95.5 v 18 c 0,1.25 0.25,3 -1.25,4"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:none;stroke:#000000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="path24859"
- inkscape:connector-curvature="0" />
- <path
- id="path24861"
- style="display:inline;opacity:0.75;fill:none;stroke:#ffffff;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 818.5,83.5 h -11 v 30 c 0,5 7,5 7,0 v -18 h 34 m -29,-8 c 0,0.5 0.5286,1 1,1 h 20"
- sodipodi:nodetypes="cccccccsc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccsscccssssccc"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path24863"
- d="m 806.5,113.5 c 0,2.75 2,5 5,5 h 33 c 3,0 5,-2 5,-5 v -18 c 0,-0.471405 -0.5286,-1 -1,-1 h -7 v -6 c 0,-0.5 -0.5,-1 -1,-1 l -20.02773,0.04419 C 819.98721,87.54526 819.5,87 819.5,86.5 v -3 c 0,-0.5 -0.5,-1 -1,-1 h -11 c -0.5,0 -1,0.5 -1,1 z"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="csscc"
- id="path24865"
- d="m 841.5,94.5 h -27 c -0.4714,0 -1,0.528595 -1,1 v 18 c 0,2.25 -1.25,3 -2.5,3"
- style="fill:none;stroke:url(#linearGradient24873);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;filter:url(#filter6146);enable-background:new"
- id="g44356"
- transform="translate(647,272.55)">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.20000005;marker:none;enable-background:accumulate"
- id="rect44358"
- width="16"
- height="16"
- x="341"
- y="73" />
- <g
- id="g44360"
- transform="translate(0,-21)">
- <g
- id="g44362">
- <g
- id="g44364">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 343.5,104.5 1.75,1.75 c 2.3454,2.33848 6.16153,2.34539 8.5,0 l 0.5,-0.5"
- id="path44366"
- sodipodi:nodetypes="cs"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 343,108.25 V 104 h 4.25"
- id="path44368"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g44370">
- <path
- sodipodi:nodetypes="ccc"
- id="path44372"
- d="M 343,108.25 V 104 h 4.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#e6e6e6;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cs"
- id="path44374"
- d="m 343.5,104.5 1.75,1.75 c 2.3454,2.33848 6.16153,2.34539 8.5,0 l 0.5,-0.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#e6e6e6;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- d="m 344,105 v 1 1.5 h 1 V 106 h 1.5 v -1 H 345 Z"
- id="path44376"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="rotate(180,349,102)"
- id="g44378">
- <g
- id="g44380">
- <path
- sodipodi:nodetypes="cs"
- id="path44382"
- d="m 343.5,104.5 1.75,1.75 c 2.3454,2.33848 6.16153,2.34539 8.5,0 l 0.5,-0.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path44384"
- d="M 343,108.25 V 104 h 4.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3.4000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g44386">
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#e6e6e6;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 343,108.25 V 104 h 4.25"
- id="path44388"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#e6e6e6;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 343.5,104.5 1.75,1.75 c 2.3454,2.33848 6.16153,2.34539 8.5,0 l 0.5,-0.5"
- id="path44390"
- sodipodi:nodetypes="cs"
- inkscape:connector-curvature="0" />
- </g>
- <path
- id="path44392"
- d="m 344,105 v 1 1.5 h 1 V 106 h 1.5 v -1 H 345 Z"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path44394"
- d="m 344.90625,106.59375 c 2.52573,2.51828 6.66805,2.52691 9.1875,0 l 0.5,-0.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient44402);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <path
- sodipodi:nodetypes="ccc"
- id="path44396"
- d="m 350.5,99.5 h 4 v -4"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path44398"
- d="M 347.5,103.5 H 343 c -0.25,0 -0.5,0.25 -0.5,0.5 v 4.5"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccc"
- id="path44400"
- d="m 345.59375,105.90625 c 2.07803,2.0719 5.36384,2.10325 7.53125,0.1875 L 354,105.25"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient44404);stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- </g>
- <g
- transform="translate(3.9566736,0.18371585)"
- id="g34977"
- style="display:inline;enable-background:new">
- <g
- style="display:inline"
- id="g21853-3"
- transform="translate(856,-154)"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 2\IMAGE BROWSER ICONS.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- ry="0"
- rx="2.4004419"
- y="430"
- x="108"
- height="48"
- width="48"
- id="rect21855-8"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate" />
- <g
- id="g21857-6">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:url(#linearGradient21875-7-1-0-1);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="m 125.5,433.5 h 23 v 41 h -33 v -31 z"
- id="path21859-9"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 147.25,434.5 c -4.875,0 -21.75,0 -21.75,0 m -8.9447,8.5 -0.0553,30"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- id="path21861-8"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- clip-path="url(#clipPath13106-9-2-9-9-4)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path21863-6"
- d="m 115,444 h 12 l -1,-11 z"
- style="opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011-6-7-0-8)" />
- <path
- inkscape:connector-curvature="0"
- clip-path="none"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 117.5,443.75 9,-2.5 v -6"
- style="fill:none;stroke:url(#linearGradient21877-3-2-7-2);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path21865-6"
- sodipodi:nodetypes="ccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- id="path21867-2"
- style="fill:none;stroke:#333333;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 115.5,442.75 v 31.75 h 33 v -41 h -23.75 z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- clip-path="url(#clipPath13106-9-2-9-9-4)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path21869-3"
- d="m 116,443 11,1 -2,-10 z"
- style="display:inline;opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011-6-7-0-8)" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 116,443 0.0108,0.72434 L 126,441 v -7 h -1 z"
- id="path21871-8"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path21873-2"
- style="opacity:0.15;fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 147.5,435 v 38.5 H 117"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- <g
- id="g34938"
- transform="translate(63,-47)">
- <path
- id="path61236"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient34959-9-2-1);fill-opacity:1;fill-rule:nonzero;stroke:#ff0000;stroke-width:0.17893334;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 919.5,356.5067 v -3 c 0,-1.73575 1.26424,-3 3,-3 h 5 c 1.73576,0 3,-1.26425 3,-3 v -3.0064 l 2.5,0.006 c 2,0 3.5,2.5 3.5,6 0,3.5 -1.25,6 -3.5,6 -4.98134,0 -12.77318,0 -2.5,0 v 2.75 c 0,2.5 -2,3.24997 -5.5,3.24998 v 2e-5 c -3.5,0.0104 -5.5,-0.75 -5.5,-3.25 v -2.7628"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cssssccsscsccsc" />
- <path
- sodipodi:nodetypes="cssssccsscsccsc"
- inkscape:connector-curvature="0"
- d="m 930.5,344.5 v 3 c 0,1.73575 -1.26424,3 -3,3 h -5 c -1.73576,0 -3,1.26425 -3,3 v 3.0064 l -2.5,-0.006 c -2,0 -3.5,-2.5 -3.5,-6 0,-3.5 1.25,-6 3.5,-6 4.98134,0 12.77318,0 2.5,0 v -2.75 c 0,-2.5 2,-3.24997 5.5,-3.24998 v -2e-5 c 3.5,-0.0104 5.5,0.75 5.5,3.25 v 2.7628"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient34961-3-6-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.17893334;marker:none;enable-background:accumulate"
- id="path61233" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccscccsccccsccccc"
- id="path61167"
- d="m 925,338.50002 c -3.5,10e-6 -5.5,0.74998 -5.5,3.24998 v 2.75 h 5.5 -8 c -2.25,0 -3.5,2.5 -3.5,6 0,3.5 1.5,6 3.5,6 l 2.5,0.0128 V 359.5 c 0,2 2,3.01281 5.5,3.0128 3.5,-1e-5 5.5,-1.0128 5.5,-3.0128 v -3 h -5.5 8 c 2,0 3.5,-2.5 3.5,-6 0,-3.5 -1.5,-6 -3.5,-6 l -2.5,0.0128 V 341.75 c 0,-2.5 -2,-3.26045 -5.5,-3.25 z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.8627451" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- id="path61169"
- d="m 930.5,344.5 v 3 c 0,1.73575 -1.26424,3 -3,3 h -5 c -1.73576,0 -3,1.26425 -3,3 v 3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.78431373;marker:none;enable-background:accumulate" />
- <circle
- r="1"
- cy="342"
- cx="922"
- id="path61220"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <circle
- r="1"
- cy="359"
- cx="928"
- id="path61222"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <g
- style="opacity:0.4"
- id="g61345">
- <path
- style="fill:none;stroke:url(#linearGradient34963-5-9-1);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 920.5,343.25 v -1.5 c 0,-1.75 1.5,-2.25 4.5,-2.25 3,0 4.5,0.5 4.5,2.25 v 4.75"
- id="path61333"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cszsc" />
- <path
- style="fill:none;stroke:url(#linearGradient34965-1-5-2);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 925.5,345 v 0.25 l -0.25,0.25 H 917 c -1.5,0 -2.5,2 -2.5,5 0,3 1.28917,5 2.5,5 h 1.5"
- id="path61335"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccszsc" />
- <path
- style="fill:none;stroke:none"
- d="m 920.75,343.5 h 4.5 l 0.25,0.25 v 0.5"
- id="path61337"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:none"
- d="m 918.5,355.25 v -1.75 c 0,-2.25 1.75,-4 4,-4 h 4.5 c 1.75,0 2.5,-0.75 2.5,-2.5 v -0.5"
- id="path61339"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cssssc" />
- <circle
- r="1"
- cy="342"
- cx="922"
- transform="matrix(1.5161021,0,0,1.5161021,-475.84616,-176.50693)"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient34967-4-1-8);stroke-width:0.52766895;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"
- id="path61355" />
- </g>
- <g
- style="opacity:0.8;stroke:#ff0000"
- transform="rotate(180,925,350.5)"
- id="g34104">
- <path
- sodipodi:nodetypes="cszsc"
- inkscape:connector-curvature="0"
- id="path34106"
- d="m 920.5,343.25 v -1.5 c 0,-1.75 1.5,-2.25 4.5,-2.25 3,0 4.5,0.5 4.5,2.25 v 4.75"
- style="fill:none;stroke:none" />
- <path
- sodipodi:nodetypes="csc"
- inkscape:connector-curvature="0"
- id="path34108"
- d="m 914.5,350.5 c 0,3 1.28917,5 2.5,5 h 1.5"
- style="fill:none;stroke:url(#linearGradient34969-4-4-1);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- id="path34110"
- d="m 920.75,343.5 h 4.5 l 0.25,0.25 v 0.5"
- style="fill:none;stroke:url(#linearGradient34971-5-0-9);stroke-linecap:round;stroke-linejoin:round" />
- <path
- sodipodi:nodetypes="cssssc"
- inkscape:connector-curvature="0"
- id="path34113"
- d="m 918.5,355.5 v -2 c 0,-2.25 1.75,-4 4,-4 h 4.5 c 1.75,0 2.5,-0.75 2.5,-2.5 v -0.5"
- style="fill:none;stroke:url(#radialGradient34973-2-5-7);stroke-linecap:round;stroke-linejoin:round" />
- <circle
- r="1"
- cy="342"
- cx="922"
- id="path34115"
- style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient34975-9-4-9);stroke-width:0.52766895;stroke-miterlimit:4;stroke-dasharray:none;marker:none;enable-background:accumulate"
- transform="matrix(1.5161021,0,0,1.5161021,-475.84616,-176.50693)" />
- <path
- style="fill:none;stroke:none"
- d="m 925.5,345 v 0.25 l -0.25,0.25 H 917 c -1.5,0 -2.5,2 -2.5,5"
- id="path34901"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccsc" />
- </g>
- </g>
- </g>
- <g
- transform="translate(211.95667,-7.8162842)"
- id="g45475-4"
- style="display:inline;enable-background:new">
- <g
- style="display:inline"
- id="g22242-6"
- transform="translate(696,-194)"
- inkscape:export-filename="C:\Documents and Settings\Pracowniaa\Moje dokumenty\Moje obrazy\BLENDER ICONS redesign\ver 2\IMAGE BROWSER ICONS.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <rect
- ry="0"
- rx="2.4004419"
- y="430"
- x="108"
- height="48"
- width="48"
- id="rect22244-9"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;enable-background:accumulate" />
- <g
- id="g22246-2">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;fill:url(#linearGradient22274-8);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- d="m 125.5,433.5 h 23 v 41 h -33 v -31 z"
- id="path22249-8"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 147.25,434.5 c -4.875,0 -21.75,0 -21.75,0 m -8.9447,8.5 -0.0553,30"
- style="opacity:0.7;fill:none;stroke:#ffffff;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- id="path22251-9"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- clip-path="url(#clipPath13106-5)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path22253-5"
- d="m 115,444 h 12 l -1,-11 z"
- style="opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011-5)" />
- <path
- inkscape:connector-curvature="0"
- clip-path="none"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 117.5,443.75 9,-2.5 v -6"
- style="fill:none;stroke:url(#linearGradient22276-5);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path22264-3"
- sodipodi:nodetypes="ccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- id="path22266-6"
- style="fill:none;stroke:#333333;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 115.5,442.75 v 31.75 h 33 v -41 h -23.75 z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- clip-path="url(#clipPath13106-5)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccc"
- id="path22268-0"
- d="m 116,443 11,1 -2,-10 z"
- style="display:inline;opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter63011-5)" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 116,443 0.0108,0.72434 L 126,441 v -7 h -1 z"
- id="path22270-1"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- id="path22272-3"
- style="opacity:0.15;fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 147.5,435 v 38.5 H 117"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- <g
- id="g21517-6"
- inkscape:label="Layer 1"
- transform="matrix(0.5406242,0,0,0.5829534,814.13667,247.65542)">
- <ellipse
- ry="5.3033009"
- rx="15.467961"
- cy="38.98439"
- cx="28.019106"
- transform="matrix(1.274286,0,0,1.377124,-7.569123,-16.70193)"
- id="path35486-4"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.54857142;fill:url(#radialGradient21442-6-790);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="csssssssssscccsscccscccssccc"
- d="m 16.048489,28.093447 c 0.0098,0.576682 0.196474,1.697902 0.471116,2.577425 0.581566,1.854137 1.56684,3.572658 2.939126,5.086496 1.407488,1.553118 3.138519,2.803227 5.139315,3.68976 2.105357,0.931573 4.384795,1.407488 6.750134,1.403741 2.365339,-0.005 4.644601,-0.488686 6.74896,-1.427017 2.00002,-0.895288 3.731043,-2.148391 5.13754,-3.705517 1.369207,-1.519844 2.352576,-3.241114 2.934089,-5.096258 0.294262,-0.938353 0.476921,-1.889392 0.553238,-2.845308 0.07331,-0.939306 0.04204,-1.883511 -0.09183,-2.823792 -0.259981,-1.835599 -0.896294,-3.556847 -1.872652,-5.12758 -0.895541,-1.441699 -2.047808,-2.70454 -3.417268,-3.766975 0,0 0.002,-0.002 0.002,-0.002 0,0 -13.828458,-10.6197195 -13.828458,-10.6197195 -0.01176,-0.00978 -0.02252,-0.019551 -0.03529,-0.028344 -0.909003,-0.6959264 -3.879837,-0.7738945 -4.87679,-0.075035 -1.01067,0.7057021 -1.091821,1.8092613 -0.195527,2.5482146 1.899775,1.4997633 2.656207,2.2801589 4.566507,3.7797379 0,0 -14.852491,0.167033 -14.852491,0.167033 -1.994685,0 -3.1682609,0.947915 -3.4153947,2.333683 -0.2180771,1.222836 0.7479213,2.738129 2.4800217,2.738129 2.956573,0.0039 5.942111,-0.0069 8.909215,-0.01272 0,0 -16.01999,12.453223 -16.01999,12.453223 -0.020527,0.01564 -0.041053,0.02933 -0.06158,0.04497 -1.4974197,1.148389 -1.9831951,3.059322 -1.0399808,4.268393 0.9598323,1.22959 2.9977653,1.230588 4.5147288,0.006 0,0 8.677593,-7.102098 8.677593,-7.102098 0,0 -0.12511,0.959824 -0.116333,1.535532 z"
- id="path2482-9"
- style="fill:#dd6d00;fill-rule:evenodd;stroke:#993d00;stroke-width:1.7812928;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" />
- <ellipse
- ry="10.125"
- rx="11.5625"
- cy="25.75"
- cx="31.1875"
- transform="matrix(0.8018194,0,0,0.8471126,6.257567,4.5089892)"
- id="path39153-3"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient21444-0-352);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="opacity:0.4857143;fill:none;stroke:url(#linearGradient21446-3-145);stroke-width:1.7812928;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
- d="m 25.8125,6.40625 c -0.334829,4.572e-4 -0.72202,0.089606 -0.90625,0.21875 4.5e-4,0.010412 4.5e-4,0.020838 0,0.03125 -0.212626,0.1484635 -0.188235,0.1956271 -0.1875,0.1875 0.0092,0.010621 -0.0072,-4.246e-4 0.03125,0.03125 0.01962,0.00828 0.03527,0.012546 0.0625,0.03125 0.01676,0.01151 0.01357,0.014555 0.03125,0.03125 0.193748,0.1576058 4.954976,4.005164 4.954976,4.005164 0.489837,0.39864 0.677395,1.066352 0.46875,1.65625 -0.115662,0.32703 -0.422813,0.541217 -0.6875,0.59375 -0.264687,0.05253 -0.498447,0.03054 -0.71875,0.03125 -5.639658,0.05119 -16.87989,0.03851 -16.87989,0.03851 -0.4102,2.75e-4 -0.935835,0.115997 -1.34375,0.34375 -0.407915,0.227753 -0.6637862,0.523861 -0.6875002,0.90625 -0.024417,0.393728 0.098829,0.605767 0.3437502,0.78125 0.244921,0.175483 0.614978,0.25 0.875,0.25 0,0 8.8125,0 8.8125,0 0.600305,-7.28e-4 1.223895,0.311058 1.4375,0.9375 0.04676,0.137121 0.06335,0.269976 0.0625,0.40625 -8.49e-4,0.136274 -0.02214,0.268794 -0.09375,0.375 -0.143211,0.212412 -0.319507,0.298568 -0.5,0.4375 0,0 -15.7871819,12.746851 -15.856336,12.800078 C 5.0310984,30.500117 5,30.53125 5,30.53125 5.0100745,30.519077 5.000335,30.499512 5,30.5 L 4.8125,30.3125 c 0.012336,0.02165 0.014481,0.03307 0.03125,0.0625 0.063558,0.0774 0.125,0.15625 0.125,0.15625 -0.00585,0.0056 -0.031233,0.03124 -0.03125,0.03125 0,0 -0.043442,-0.09921 -0.09375,-0.1875 0.037843,0.09884 0.06253,0.218739 0.0625,0.21875 -0.4662091,0.37119 -0.7783348,0.889746 -0.875,1.28125 -0.1043319,0.422581 -0.046,0.62455 0.125,0.84375 0.2999827,0.384295 1.3975356,0.595547 2.40625,-0.21875 0,0 8.65625,-7.09375 8.65625,-7.09375 0.473718,-0.387074 1.1446,-0.458625 1.6875,-0.15625 0.544608,0.303331 0.798054,0.927572 0.71875,1.53125 0,0 -0.0626,0.908319 -0.0625,1.25 2e-6,0.0085 -1.19e-4,0.02348 0,0.03125 0.192796,2.523718 1.400736,4.762818 3.03125,6.71875 2.801818,3.089095 6.627659,4.401619 10.75,4.5625 4.113324,-0.043 7.964529,-1.606111 10.75,-4.625 2.546631,-3.125326 3.513872,-6.363859 3.15625,-9.375 C 44.891575,22.325847 43.222923,19.516566 40.4375,17.25 35.951885,13.599946 31.206991,10.168434 26.59375,6.625 26.57515,6.610386 26.56455,6.59802 26.5625,6.59375 26.43835,6.498703 26.144223,6.4057899 25.8125,6.40625 Z"
- id="path21414-5"
- sodipodi:nodetypes="csssssscssscsssccssscscccsccssssccscsscccssssc" />
- <path
- inkscape:connector-curvature="0"
- d="m 25.708956,26.064593 c 0.07649,-1.397943 0.759369,-2.631914 1.78592,-3.505519 1.010226,-0.858782 2.366788,-1.383145 3.848625,-1.383145 1.480894,0 2.837456,0.524363 3.847446,1.383145 1.027685,0.873605 1.709741,2.106651 1.787122,3.504594 0.07927,1.438713 -0.49591,2.77459 -1.504012,3.764001 -1.027686,1.007933 -2.493008,1.640678 -4.130556,1.640678 -1.63849,0 -3.103814,-0.632745 -4.131451,-1.640678 -1.00914,-0.989411 -1.58234,-2.325288 -1.503094,-3.763076 z"
- id="path2478-8"
- style="fill:#2f5b94;fill-rule:evenodd;stroke:none" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="csssscsccsscsccssssscsscccsssc"
- id="path39166-5"
- d="m 25.8125,6.03125 c -0.404852,5.53e-4 -2.204797,-0.059029 -2.48145,0.1349032 -0.280209,0.195652 -0.335403,0.376484 -0.34375,0.46875 -0.0083,0.092266 -0.01539,0.17648 0.1875,0.34375 0.01899,0.015735 0.04457,0.014317 0.0625,0.03125 0.124258,0.101028 4.748869,4.1248618 4.748869,4.1248618 0.373658,0.304091 0.504393,0.795817 0.34375,1.25 -0.160635,0.454191 -0.580748,0.373449 -1.0625,0.375 -5.634142,0.05114 -15.087371,-0.129601 -15.087371,-0.129601 -0.952967,6.38e-4 -2.339958,0.524782 -2.4062504,1.59375 -0.063562,1.024947 0.9247974,1.4375 1.5937504,1.4375 0,-1e-6 8.8125,0 8.8125,0 0.488364,-5.92e-4 0.936141,0.225277 1.09375,0.6875 0.157609,0.462231 -0.01926,0.514621 -0.40625,0.8125 0,0 -16.086298,13.088586 -16.086298,13.088586 -0.00142,0.0014 -0.029829,-0.0014 -0.03125,0 -0.064037,0.04879 -0.054226,0.04875 -0.03125,0.03125 -0.5536758,0.424619 -0.9087886,1.004019 -1.03125,1.5 -0.1224536,0.495981 -0.04661,0.856152 0.1875,1.15625 0.4788333,0.613413 1.777612,0.754857 2.90625,-0.15625 1e-7,10e-7 8.65625,-7.09375 8.65625,-7.09375 0.361955,-0.295753 0.872897,-0.352437 1.28125,-0.125 0.408345,0.227436 0.623381,0.692814 0.5625,1.15625 0,-1e-6 -0.0997,0.953636 -0.09375,1.34375 0.09498,1.301756 0.451616,2.521825 0.989039,3.664234 C 20.799917,36.321089 27.770982,19.392853 44.1875,21.03125 43.339652,19.54368 42.151282,18.185293 40.65625,16.96875 36.159865,13.309932 31.42016,9.882897 26.8125,6.34375 26.805335,6.338858 26.788292,6.317553 26.78125,6.3125 26.570707,6.151312 26.216591,6.030689 25.8125,6.03125 Z"
- style="opacity:0.51999996;fill:url(#radialGradient21448-8-143);fill-opacity:1;fill-rule:evenodd;stroke:none" />
- </g>
- </g>
- <g
- transform="translate(335.99871,21.048284)"
- style="display:inline;enable-background:new"
- id="ICON_ROTATE-7">
- <rect
- y="178"
- x="110"
- height="16"
- width="16"
- id="rect37989-8"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.4000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="m 114.5,192.5 h -3 v -3 m 13,0 v 3 h -3 m -0.25,-13 h 3.25 v 3 m -13,0 v -3 h 3"
- id="path37498-7"
- sodipodi:nodetypes="cccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccccccccc"
- id="rect38140-7"
- d="m 114.5,192.5 h -3 v -3 m 13,0 v 3 h -3 m -0.25,-13 h 3.25 v 3 m -13,0 v -3 h 3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient18199);stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <g
- transform="matrix(0.59971056,0,0,0.59971056,116.78278,9.7425599)"
- style="display:inline;enable-background:new"
- id="g23145-9">
- <g
- id="g23149-4">
- <path
- id="path39832-9"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#1a1a1a;stroke-width:4.66725159;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -4.3682386,287.81345 h 1.5 c 0.999089,0 2.07885534,1.30514 2.50490386,2.78207 1.06592652,3.69512 2.80867074,9.82446 5.88525404,9.96406 2.6782554,0 1.6181317,-5.11535 3.1736046,-5.26275 h 0.25"
- sodipodi:nodetypes="cssccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccscc"
- d="M 9.3647983,295.22328 H 8.8854965 c -2.2335161,0 0.1796731,4.94901 -3.4398065,5.09984 -4.44796752,0.18536 -5.37272213,-12.59185 -8.0767581,-12.56237 h -2"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#a8df84;stroke-width:2.93474913;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="path39834-2"
- inkscape:connector-curvature="0" />
- <g
- id="g1418"
- transform="matrix(1.6674711,0,0,1.6674711,-416.35106,-776.00982)"
- style="display:inline;enable-background:new">
- <path
- style="fill:none;stroke:#4b2f1e;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path1374"
- sodipodi:type="arc"
- sodipodi:cx="41"
- sodipodi:cy="873.36212"
- sodipodi:rx="4.2499995"
- sodipodi:ry="4.2499995"
- sodipodi:start="6.1086524"
- sodipodi:end="1.2217305"
- sodipodi:open="true"
- d="m 45.185432,872.62412 a 4.2499995,4.2499995 0 0 1 -2.731847,4.73169" />
- <path
- style="fill:none;stroke:#4b2f1e;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path1376"
- sodipodi:type="arc"
- sodipodi:cx="41"
- sodipodi:cy="873.36212"
- sodipodi:rx="7"
- sodipodi:ry="7"
- sodipodi:start="4.4505896"
- sodipodi:end="4.9741884"
- sodipodi:open="true"
- d="m 39.188267,866.60064 a 7,7 0 0 1 3.623467,0" />
- <path
- d="m 47.76148,875.17385 a 6.9999995,6.9999995 0 0 1 -1.811733,3.13802"
- sodipodi:open="true"
- sodipodi:end="0.78539816"
- sodipodi:start="0.26179939"
- sodipodi:ry="6.9999995"
- sodipodi:rx="6.9999995"
- sodipodi:cy="873.36212"
- sodipodi:cx="41"
- sodipodi:type="arc"
- id="path1378"
- style="fill:none;stroke:#4b2f1e;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- d="m 39.546414,877.35581 a 4.2499995,4.2499995 0 0 1 -2.731846,-4.73169"
- sodipodi:open="true"
- sodipodi:end="3.3161256"
- sodipodi:start="1.9198622"
- sodipodi:ry="4.2499995"
- sodipodi:rx="4.2499995"
- sodipodi:cy="873.36212"
- sodipodi:cx="41"
- sodipodi:type="arc"
- id="path1380"
- style="fill:none;stroke:#4b2f1e;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- style="fill:none;stroke:#4b2f1e;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path1382"
- sodipodi:type="arc"
- sodipodi:cx="41"
- sodipodi:cy="873.36212"
- sodipodi:rx="6.9999995"
- sodipodi:ry="6.9999995"
- sodipodi:start="2.3561945"
- sodipodi:end="2.8797933"
- sodipodi:open="true"
- d="M 36.050253,878.31187 A 6.9999995,6.9999995 0 0 1 34.23852,875.17385" />
- <rect
- ry="2.75"
- rx="2.75"
- y="870.61212"
- x="38.25"
- height="5.5"
- width="5.5000005"
- id="rect1384"
- style="fill:#4b2f1e;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <rect
- style="fill:#000000;fill-opacity:0;fill-rule:nonzero;stroke:none"
- id="rect1386"
- width="20"
- height="20"
- x="31"
- y="862.36212"
- rx="0"
- ry="0" />
- <rect
- style="fill:#ff7d1f;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="rect1388"
- width="4.0000005"
- height="4"
- x="39"
- y="871.36212"
- rx="2"
- ry="2" />
- <rect
- ry="1.5"
- rx="1.5000004"
- y="871.86212"
- x="39.5"
- height="3"
- width="3.0000007"
- id="rect1390"
- style="fill:none;stroke:url(#radialGradient29130);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- style="fill:none;stroke:#ffb36b;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path1392"
- sodipodi:type="arc"
- sodipodi:cx="41"
- sodipodi:cy="873.36212"
- sodipodi:rx="4.2499995"
- sodipodi:ry="4.2499995"
- sodipodi:start="1.9198622"
- sodipodi:end="3.3161256"
- sodipodi:open="true"
- d="m 39.546414,877.35581 a 4.2499995,4.2499995 0 0 1 -2.731846,-4.73169" />
- <path
- d="M 36.050253,878.31187 A 6.9999995,6.9999995 0 0 1 34.23852,875.17385"
- sodipodi:open="true"
- sodipodi:end="2.8797933"
- sodipodi:start="2.3561945"
- sodipodi:ry="6.9999995"
- sodipodi:rx="6.9999995"
- sodipodi:cy="873.36212"
- sodipodi:cx="41"
- sodipodi:type="arc"
- id="path1394"
- style="fill:none;stroke:#ffb36b;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- d="m 38.875,877.04273 a 4.2499995,4.2499995 0 0 1 -0.880204,-0.6754"
- sodipodi:open="true"
- sodipodi:end="2.3561945"
- sodipodi:start="2.0943951"
- sodipodi:ry="4.2499995"
- sodipodi:rx="4.2499995"
- sodipodi:cy="873.36212"
- sodipodi:cx="41"
- sodipodi:type="arc"
- id="path1396"
- style="opacity:0.7;fill:none;stroke:#ff8919;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- style="opacity:0.7;fill:none;stroke:#ff8919;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path1398"
- sodipodi:type="arc"
- sodipodi:cx="41"
- sodipodi:cy="873.36212"
- sodipodi:rx="6.9999995"
- sodipodi:ry="6.9999995"
- sodipodi:start="2.3561945"
- sodipodi:end="2.6179939"
- sodipodi:open="true"
- d="m 36.050253,878.31187 a 6.9999995,6.9999995 0 0 1 -1.11243,-1.44975" />
- <path
- style="fill:none;stroke:#4b2f1e;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path1400"
- sodipodi:type="arc"
- sodipodi:cx="-41"
- sodipodi:cy="-873.36212"
- sodipodi:rx="4.2500005"
- sodipodi:ry="4.2500005"
- sodipodi:start="0.87266463"
- sodipodi:end="2.268928"
- sodipodi:open="true"
- d="m -38.268152,-870.10643 a 4.2500005,4.2500005 0 0 1 -5.463696,0"
- inkscape:transform-center-x="-2.2499995"
- inkscape:transform-center-y="-2.25"
- transform="scale(-1)" />
- <path
- d="m -38.268152,-870.10643 a 4.2500005,4.2500005 0 0 1 -5.463696,0"
- sodipodi:open="true"
- sodipodi:end="2.268928"
- sodipodi:start="0.87266463"
- sodipodi:ry="4.2500005"
- sodipodi:rx="4.2500005"
- sodipodi:cy="-873.36212"
- sodipodi:cx="-41"
- sodipodi:type="arc"
- id="path1402"
- style="fill:none;stroke:#ffb36b;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:transform-center-x="-2.2499995"
- inkscape:transform-center-y="-2.25"
- transform="scale(-1)" />
- <path
- style="fill:none;stroke:#ffb36b;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path1404"
- sodipodi:type="arc"
- sodipodi:cx="-41"
- sodipodi:cy="-873.36212"
- sodipodi:rx="7.0000005"
- sodipodi:ry="7.0000005"
- sodipodi:start="1.3089969"
- sodipodi:end="1.8325957"
- sodipodi:open="true"
- d="m -39.188266,-866.60064 a 7.0000005,7.0000005 0 0 1 -3.623467,0"
- inkscape:transform-center-y="-3.7500001"
- transform="scale(-1)"
- inkscape:transform-center-x="-3.7499995" />
- <path
- style="opacity:0.3;fill:none;stroke:#ffe4cb;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path1406"
- sodipodi:type="arc"
- sodipodi:cx="41"
- sodipodi:cy="873.36212"
- sodipodi:rx="4.25"
- sodipodi:ry="4.25"
- sodipodi:start="4.0142573"
- sodipodi:end="4.9741884"
- sodipodi:open="true"
- d="m 38.268153,870.10643 a 4.25,4.25 0 0 1 3.831828,-0.84949" />
- <path
- d="m 39.188267,866.60064 a 7,7 0 0 1 3.623467,0"
- sodipodi:open="true"
- sodipodi:end="4.9741884"
- sodipodi:start="4.4505896"
- sodipodi:ry="7"
- sodipodi:rx="7"
- sodipodi:cy="873.36212"
- sodipodi:cx="41"
- sodipodi:type="arc"
- id="path1408"
- style="opacity:0.3;fill:none;stroke:#ffe4cb;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path1410"
- sodipodi:type="arc"
- sodipodi:cx="41"
- sodipodi:cy="873.36212"
- sodipodi:rx="6.9999995"
- sodipodi:ry="6.9999995"
- sodipodi:start="4.4505896"
- sodipodi:end="4.712389"
- sodipodi:open="true"
- d="M 39.188267,866.60064 A 6.9999995,6.9999995 0 0 1 41,866.36212" />
- <path
- d="m 38.268153,870.10643 a 4.25,4.25 0 0 1 1.631866,-0.84949"
- sodipodi:open="true"
- sodipodi:end="4.4505896"
- sodipodi:start="4.0142573"
- sodipodi:ry="4.25"
- sodipodi:rx="4.25"
- sodipodi:cy="873.36212"
- sodipodi:cx="41"
- sodipodi:type="arc"
- id="path1412"
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- sodipodi:open="true"
- style="fill:none;stroke:#ffb36b;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path1414"
- sodipodi:type="arc"
- sodipodi:cx="41"
- sodipodi:cy="873.36212"
- sodipodi:rx="7"
- sodipodi:ry="7"
- sodipodi:start="0.26179939"
- sodipodi:end="0.78539816"
- d="m 47.761481,875.17385 a 7,7 0 0 1 -1.811734,3.13802" />
- <path
- d="m 45.185432,872.62412 a 4.2499995,4.2499995 0 0 1 -2.731847,4.73169"
- sodipodi:end="1.2217305"
- sodipodi:start="6.1086524"
- sodipodi:ry="4.2499995"
- sodipodi:rx="4.2499995"
- sodipodi:cy="873.36212"
- sodipodi:cx="41"
- sodipodi:type="arc"
- id="path1416"
- style="fill:none;stroke:#ffb36b;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- sodipodi:open="true" />
- </g>
- <g
- transform="matrix(1.6674711,0,0,1.6674711,-138.14039,-258.06137)"
- style="display:inline;enable-background:new"
- id="g63699">
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:none;stroke:#422200;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m -102.5625,554.75 c -0.0429,0.005 -0.0849,0.0154 -0.125,0.0312 l -4.5,1.75 c -0.1919,0.0756 -0.31653,0.26258 -0.3125,0.4688 v 6.5 c 0.003,0.18741 0.11203,0.35691 0.28125,0.4375 l 4.5,2.25 c 0.13787,0.0682 0.29963,0.0682 0.4375,0 l 4.499997,-2.25 c 0.169224,-0.0806 0.278188,-0.25009 0.28125,-0.4375 V 557 c 0.004,-0.2062 -0.120622,-0.39315 -0.3125,-0.46875 l -4.499997,-1.75 c -0.0792,-0.0318 -0.16537,-0.0426 -0.25,-0.0312 z"
- id="path63697" />
- <g
- id="g63687"
- transform="translate(-252,462.99988)">
- <g
- transform="translate(-179,199.50012)"
- id="g63679">
- <path
- inkscape:connector-curvature="0"
- id="path63667"
- d="m 328.5,-107.25 -4.5,1.75 v 6.5 l 4.5,2.25 4.5,-2.25 v -6.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#422200;fill-opacity:1;fill-rule:evenodd;stroke:#422200;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccccc" />
- <g
- transform="translate(179,-179)"
- id="g63671">
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- style="display:inline;overflow:visible;visibility:visible;fill:#915515;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 154,80 v -6.5 l -4.5,-1.75 v 10.5 z"
- id="path63669"
- sodipodi:nodetypes="ccccc" />
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#efa351;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="M 324,-99.00012 V -105.5 l 4.5,-1.75 0.5,0.25 v 10 l -0.5,0.25 z"
- id="path63673"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient63713);stroke-width:0.99999982px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="m 332.5,-105.5 v 6.25 l -4,2 -4,-2.00012 V -105.5"
- id="path63675"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\4.png"
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;fill:#f5ca9b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- d="m 324,-105.5 4.5,-1.75 4.5,1.75 -4.5,2 z"
- id="path63677" />
- </g>
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc"
- style="opacity:0.95999995;fill:none;stroke:url(#linearGradient63715);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 145.5,94.25012 c 0,0 4,1.75 4,1.75 l 4,-1.75"
- id="path63681" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.25;fill:url(#linearGradient63886);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.06666696px;marker:none;enable-background:accumulate"
- id="rect63683"
- width="1"
- height="6.7500019"
- x="149"
- y="96.000122" />
- </g>
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect63665"
- width="16"
- height="16"
- x="-113"
- y="554" />
- <g
- style="display:inline;enable-background:new"
- id="g63695"
- transform="matrix(0.7882544,0,0,0.7883038,-210.45268,388.9974)"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <circle
- r="8"
- cy="118"
- cx="132"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- id="circle63689"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#422200;stroke-width:1.97436094;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- transform="matrix(0.6425292,0,0,0.642531,44.523834,146.81699)" />
- <circle
- r="8"
- cy="118"
- cx="132"
- style="display:inline;opacity:0.8;fill:url(#linearGradient63894);fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="circle63691"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.5858806,-0.06590218,0.06677852,-0.5812167,198.80048,299.96262)" />
- <circle
- r="8"
- cy="118"
- cx="132"
- transform="matrix(0.4991181,0,0,0.4991107,63.460522,163.7471)"
- style="opacity:0.5;fill:none;stroke:url(#linearGradient63719);stroke-width:2.54167628;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="circle63693"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- </g>
- </g>
- </g>
- <path
- id="path39836-9"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:none;stroke:url(#radialGradient23167-6);stroke-width:3.53503871;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="M 5.6770841,300.48165 C 0.7393262,300.21066 0.54777814,287.99792 -2.9522219,287.99792"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <path
- id="path14068"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:none;stroke:url(#radialGradient23167-6);stroke-width:2.12000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 456.1861,210.99286 c -2.96123,-0.16251 -3.0761,-7.48662 -5.17509,-7.48662"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <g
- id="ICON_OUTLINER_OB_GREASEPENCIL"
- transform="translate(0.39249986,-20.900649)"
- inkscape:transform-center-x="3.3362538"
- inkscape:transform-center-y="-0.19625023">
- <g
- id="ICON_GREASEPENCIL-8"
- transform="translate(230.63274,419.89563)"
- style="display:inline;enable-background:new">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccsccsc"
- d="M 52.75,44.25 62.5,34.5 c 0,-1 -0.5,-1.5 -1,-2 -0.498692,-0.498692 -1,-1 -2,-1 l -9.75,9.75 c 1,0 1.501308,0.501308 2,1 0.5,0.5 1,1 1,2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ff921d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- id="path40242-2" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;enable-background:new"
- id="rect40244-9"
- width="16"
- height="16"
- x="47"
- y="31" />
- <path
- inkscape:connector-curvature="0"
- id="path40246-1"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient14276);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- d="M 60.75,36.25 62.5,34.5 c 0,-1 -0.5,-1.5 -1,-2 -0.498692,-0.498692 -1,-1 -2,-1 l -1.75,1.75 z"
- sodipodi:nodetypes="ccsccc" />
- <path
- inkscape:connector-curvature="0"
- id="path40248-5"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffb36b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- d="m 57.5,35.5 -1,-1 -6.75,6.75 1.75,0.25 z"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- d="m 59.5,37.25 -1,-0.75 -6,6 0.25,1.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#915515;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- id="path40250-1" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient14278);stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 59.75,37.25 -3,-3"
- id="path40252-9"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path40254-1"
- d="m 60.75,36.25 -3,-3"
- style="fill:none;stroke:url(#linearGradient14280);stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- id="path40256-53"
- d="m 57.75,33.25 2.98375,3.003125 -1.0075,1.0075 -3.0225,-2.98375 z"
- style="fill:url(#linearGradient14283);fill-opacity:1;stroke-width:1px" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccscc"
- id="path40258-5"
- d="m 61,36 1.5,-1.5 c 0,-1 -0.5,-1.5 -1,-2 -0.498692,-0.498692 -1,-1 -2,-1 L 58,33"
- style="fill:none;stroke:#422200;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:#422200;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 58.25,32.75 50,41 l -2,4 -0.5,0.5 0.25,0.75 0.75,0.25 0.5,-0.5 4,-2 8.25,-8.25"
- id="path40260-2"
- sodipodi:nodetypes="ccccccccc" />
- <path
- inkscape:connector-curvature="0"
- style="fill:url(#linearGradient14285);fill-opacity:1;stroke-width:1px"
- d="M 50.25,41 48.5,44.25 49.75,45.5 53,43.75 C 53,43.25 52.5,42.5 52,42 51.501308,41.501308 50.75,41 50.25,41 Z"
- id="path40262-8"
- sodipodi:nodetypes="ccccsc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path40264-3"
- d="m 48.25,45.75 0.5,-0.5"
- style="fill:#445016;stroke:#22280b;stroke-width:2.4000001;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:#ff7d1f;stroke-width:1.10000002;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 48.25,45.75 48.5,45.5"
- id="path40266-7"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- id="path40268-5"
- d="M 52.527427,43.527587 61.514313,34.48568"
- style="opacity:0.3;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_GREASEPENCIL_STROKE_PAINT"
- transform="translate(266.99521,94.053617)">
- <rect
- y="420"
- x="-52"
- height="16"
- width="16"
- id="rect52875-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate" />
- <g
- transform="translate(-556.98389,452.95862)"
- style="display:inline;enable-background:new"
- id="g52877-9">
- <path
- sodipodi:nodetypes="ccccc"
- id="path52879-6"
- d="m 506.48389,-17.45862 v -1 c 4.75,-1 2.25,-4.5 6.31852,-4.187139 0.70341,0.496889 0.93148,1.187139 0.93148,2.122782 0,3.064357 -2.5,3.314357 -7.25,3.064357 z"
- style="fill:#9d6c53;fill-opacity:1;fill-rule:evenodd;stroke:#241f1c;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;opacity:0.7;fill:url(#radialGradient53141-7);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.0015748;marker:none;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none"
- d="m 505.98389,-17.522977 c 5.75,-0.75 2.71305,-4.172284 6.75,-5.25 0.70341,0.496889 1.61991,1.711436 1.75268,2.186272 0,3.572675 -4.12319,3.136436 -8.50268,3.063728 z"
- id="path52881-9"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path52883-7"
- d="m 515.48389,-25.95862 -2.75,3.25 1.75,2.25 3,-3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#0b1728;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="fill:url(#linearGradient18738);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 514.98389,-24.95862 -2.25,2.5 1.37109,1.875 2.37891,-2.375 z"
- id="path52885-9"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#2b0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- d="m 520.48389,-31.45862 -6,6.75 2,2.25 4,-4"
- id="path52887-0"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- id="path52889-7"
- d="m 520.98389,-31.95862 -6.75,7.75 1.75,1.75 5,-4.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient18740);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.23326063;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.6;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 513.48389,-22.45862 7,-8.25"
- id="path52891-7"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;opacity:0.4;fill:none;stroke:url(#linearGradient18742);stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
- d="m 511.98389,-21.772977 -1.25,1.25 c -0.96702,0.819679 -0.76749,2.123051 -3.25,2.314357"
- id="path52893-8"
- sodipodi:nodetypes="ccc"
- inkscape:connector-curvature="0" />
- </g>
- <g
- mask="url(#mask57450-1)"
- id="g52895-9"
- style="display:inline;fill:#80e5ff;fill-opacity:1;stroke-width:0.40062992;stroke-miterlimit:4;stroke-dasharray:none"
- transform="translate(-378.00003,264.99999)">
- <path
- style="opacity:1;fill:#87cdde;fill-opacity:1;fill-rule:evenodd;stroke:#006177;stroke-width:0.68031496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 340.52507,157.1673 c -4.65215,-1.9076 -9.0183,-2.27194 -11.67231,-1.19747 -2.65402,1.07446 -3.04943,2.9213 -1.3719,5.06005 1.67752,2.13875 3.11758,1.38733 -0.37025,8.25442 l 4.5898,-1.83157 c 2.10085,-3.70699 5.48334,-6.25237 0.56856,-8.6375 -4.91478,-2.38513 3.51302,-4.33874 7.74599,0.60659 0.45432,0.36287 0.51011,-2.25452 0.51011,-2.25452 z"
- id="path18759"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="czzcczcc" />
- </g>
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- id="path52921-4"
- d="m -48.861802,421.80073 c -3.614809,1.74353 0.05277,4.41585 0.801676,5.7456"
- style="display:inline;opacity:0.5;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- inkscape:connector-curvature="0"
- inkscape:transform-center-y="0.1162415"
- sodipodi:nodetypes="cc" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_OUTLINER_DATA_GREASEPENCIL"
- transform="translate(-20.586794,-41.888693)"
- inkscape:transform-center-x="3.3362538"
- inkscape:transform-center-y="-0.19625023"
- inkscape:label="#ICON_OUTLINER_DATA_GREASEPENCIL">
- <g
- id="ICON_GREASEPENCIL-8-7"
- transform="translate(230.63274,419.89563)"
- style="display:inline;enable-background:new">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccsccsc"
- d="M 52.75,44.25 62.5,34.5 c 0,-1 -0.5,-1.5 -1,-2 -0.498692,-0.498692 -1,-1 -2,-1 l -9.75,9.75 c 1,0 1.501308,0.501308 2,1 0.5,0.5 1,1 1,2 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- id="path40242-2-4" />
- <path
- inkscape:connector-curvature="0"
- id="path40246-1-6"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient18808);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:0.69999999;marker:none;enable-background:accumulate"
- d="M 60.75,36.25 62.5,34.5 c 0,-1 -0.5,-1.5 -1,-2 -0.498692,-0.498692 -1,-1 -2,-1 l -1.75,1.75 z"
- sodipodi:nodetypes="ccsccc" />
- <path
- inkscape:connector-curvature="0"
- id="path40248-5-8"
- style="display:inline;overflow:visible;visibility:visible;fill:#d7d7d7;fill-opacity:0.80000001;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- d="m 57.5,35.5 -1,-1 -6.75,6.75 1.75,0.25 z"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- d="m 59.5,37.25 -1,-0.75 -6,6 0.25,1.5 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#555555;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;enable-background:accumulate"
- id="path40250-1-7" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient18810);stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 59.75,37.25 -3,-3"
- id="path40252-9-4"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path40254-1-1"
- d="m 60.75,36.25 -3,-3"
- style="fill:none;stroke:url(#linearGradient18812);stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc"
- id="path40256-53-7"
- d="m 57.75,33.25 2.98375,3.003125 -1.0075,1.0075 -3.0225,-2.98375 z"
- style="fill:url(#linearGradient18814);fill-opacity:1.0;stroke-width:1px" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccscc"
- id="path40258-5-9"
- d="m 61,36 1.5,-1.5 c 0,-1 -0.5,-1.5 -1,-2 -0.498692,-0.498692 -1,-1 -2,-1 L 58,33"
- style="fill:none;stroke:#1a1a1a;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:#1a1a1a;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 58.25,32.75 50,41 l -2,4 -0.5,0.5 0.25,0.75 0.75,0.25 0.5,-0.5 4,-2 8.25,-8.25"
- id="path40260-2-2"
- sodipodi:nodetypes="ccccccccc" />
- <path
- inkscape:connector-curvature="0"
- style="fill:url(#linearGradient18816);fill-opacity:1.0;stroke-width:1px"
- d="M 50.25,41 48.5,44.25 49.75,45.5 53,43.75 C 53,43.25 52.5,42.5 52,42 51.501308,41.501308 50.75,41 50.25,41 Z"
- id="path40262-8-0"
- sodipodi:nodetypes="ccccsc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path40264-3-5"
- d="m 48.25,45.75 0.5,-0.5"
- style="fill:#445016;stroke:#22280b;stroke-width:2.4000001;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:#cccccc;stroke-width:1.10000002;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.7019608"
- d="M 48.25,45.75 48.5,45.5"
- id="path40266-7-3"
- sodipodi:nodetypes="cc" />
- <path
- inkscape:connector-curvature="0"
- id="path40268-5-5"
- d="M 52.527427,43.527587 61.514313,34.48568"
- style="opacity:0.3;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_OBJECT_ORIGIN"
- transform="translate(315.00208,-21.040241)"
- inkscape:label="#ICON_OBJECT_ORIGIN">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect37586-3"
- width="16"
- height="16"
- x="110"
- y="178" />
- <path
- sodipodi:nodetypes="cccccccccccc"
- id="path37608-1"
- d="m 114.5,192.5 h -3 v -3 m 13,0 v 3 h -3 m -0.25,-13 h 3.25 v 3 m -13,0 v -3 h 3"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:2.4000001;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:connector-curvature="0" />
- <path
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient33545);stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="m 114.5,192.5 h -3 v -3 m 13,0 v 3 h -3 m -0.25,-13 h 3.25 v 3 m -13,0 v -3 h 3"
- id="path37610-3"
- sodipodi:nodetypes="cccccccccccc"
- inkscape:connector-curvature="0" />
- <g
- style="display:inline;enable-background:new"
- transform="translate(-352.73032,109.25636)"
- id="g14791-4">
- <rect
- ry="1.4768832"
- rx="1.4768832"
- y="74.512817"
- x="468.5"
- height="3.9871812"
- width="4.0018005"
- id="rect14793-4"
- style="display:inline;overflow:visible;visibility:visible;fill:#f09432;fill-opacity:1;fill-rule:nonzero;stroke:#462400;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.18177891;stroke-opacity:1;marker:none;enable-background:accumulate" />
- <rect
- rx="0.49075836"
- ry="0.49075836"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient33547);stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:6.18177891;stroke-opacity:1;marker:none;enable-background:accumulate"
- id="rect14795-4"
- width="1.9981995"
- height="2.012816"
- x="469.5018"
- y="75.5" />
- </g>
- </g>
- <g
- transform="translate(461.71013,377.29483)"
- style="display:inline;enable-background:new"
- id="ICON_SOLO_OFF-7">
- <rect
- y="198.9792"
- x="4.9506397"
- height="16"
- width="16"
- id="rect23018-5-4-5"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(0.94058502,0,0,0.94058502,0.9128606,12.74924)"
- id="g56716-3" />
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(168.01766,128.03044)"
- id="ICON_GRID-3"
- mask="url(#mask25369-1)">
- <rect
- y="281"
- x="320"
- height="16"
- width="16"
- id="rect36193-3"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.70000005;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccc"
- d="m 324.5,295.75 v -13.5 m 7,13.5 v -13.5"
- style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path36195-8"
- inkscape:connector-curvature="0" />
- <path
- id="path36197-0"
- style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 321.25001,285.50001 334.75,285.5 M 321.25001,292.50001 334.75,292.5"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- id="path36199-5"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 324.5,296.5 v -14.99999 m 7,14.99999 v -14.99999"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- d="m 320.5,285.50001 h 15 m -15,6.99999 h 15"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path36201-6"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;opacity:0.25;enable-background:new"
- transform="translate(188.9552,128.07404)"
- id="ICON_GRID-3-7"
- mask="url(#mask25369-1-6)">
- <rect
- y="281"
- x="320"
- height="16"
- width="16"
- id="rect36193-3-2"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.01000001;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.70000005;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccc"
- d="m 324.5,295.75 v -13.5 m 7,13.5 v -13.5"
- style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path36195-8-8"
- inkscape:connector-curvature="0" />
- <path
- id="path36197-0-2"
- style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 321.25001,285.50001 334.75,285.5 M 321.25001,292.50001 334.75,292.5"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- id="path36199-5-9"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 324.5,296.5 v -14.99999 m 7,14.99999 v -14.99999"
- sodipodi:nodetypes="cccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- d="m 320.5,285.50001 h 15 m -15,6.99999 h 15"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path36201-6-9"
- inkscape:connector-curvature="0" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g9502">
- <g
- transform="translate(-84.000002,1e-5)"
- id="g10350-2"
- style="display:inline;enable-background:new">
- <rect
- ry="3.0625"
- rx="3.0625"
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="rect10334-4"
- width="10"
- height="15"
- x="152.5"
- y="451.5" />
- <g
- transform="translate(-523,-55.999969)"
- id="g10338-4" />
- <g
- id="g8140-7">
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path10340-2"
- d="M 165.5,459.5 V 454"
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" />
- <path
- sodipodi:open="true"
- d="M 164.50114,451.52593 A 9.3798456,5.5 0 0 1 165.50372,454"
- sodipodi:end="0"
- sodipodi:start="5.8166094"
- sodipodi:ry="5.5"
- sodipodi:rx="9.3798456"
- sodipodi:cy="454"
- sodipodi:cx="156.12387"
- sodipodi:type="arc"
- id="path10342-8"
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" />
- <path
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- d="m 167.50001,457.60147 v -4.05761"
- id="path10344-2"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- </g>
- <g
- id="g8200-9">
- <path
- transform="translate(-523,-55.99997)"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- d="m 680.5,513.49997 -0.01,-4.03235"
- style="display:inline;opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="path10336-9" />
- <rect
- ry="3.0625"
- rx="3.0625"
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="rect8195-2"
- width="10"
- height="15"
- x="152.5"
- y="451.5" />
- </g>
- </g>
- <g
- transform="translate(-63.000001)"
- id="g3173"
- style="display:inline;enable-background:new">
- <path
- sodipodi:nodetypes="cssssssc"
- inkscape:connector-curvature="0"
- id="rect10312-1"
- d="m 152.5,459.50001 v 4.0165 c 0,1.65287 1.33066,2.98353 2.98353,2.98353 h 4.03294 c 1.65287,0 2.98353,-1.33066 2.98353,-2.98353 v -9.03297 c 0,-1.65287 -1.33066,-2.98353 -2.98353,-2.98353 H 158.5"
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" />
- <path
- sodipodi:nodetypes="cssscccc"
- inkscape:connector-curvature="0"
- id="rect10312-0-4"
- d="m 156.5,451.50001 h -1.0165 c -0.64696,0 -1.24455,0.20387 -1.73231,0.55112 -0.75838,0.53993 -1.25122,1.4265 -1.25122,2.43241 v 3.01647 l 4.00824,0.008 -0.008,-5.97178 z"
- style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" />
- <g
- transform="translate(0,1e-5)"
- style="display:inline;enable-background:new"
- id="g8140-4-9">
- <path
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- d="M 165.5,459.5 V 454"
- id="path10340-6-1"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"
- id="path10342-2-8"
- sodipodi:type="arc"
- sodipodi:cx="156.12387"
- sodipodi:cy="454"
- sodipodi:rx="9.3798456"
- sodipodi:ry="5.5"
- sodipodi:start="5.8166094"
- sodipodi:end="0"
- d="M 164.50114,451.52593 A 9.3798456,5.5 0 0 1 165.50372,454"
- sodipodi:open="true" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path10344-4-0"
- d="m 167.50001,457.60147 v -4.05761"
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" />
- </g>
- </g>
- <g
- transform="translate(-63.000001)"
- id="g3161"
- style="display:inline;enable-background:new">
- <rect
- ry="2.9835341"
- rx="2.9835341"
- y="451.50003"
- x="173.5"
- height="14.999969"
- width="10"
- id="rect10298-7-6"
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" />
- <rect
- style="opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="rect10300-9-6"
- width="2"
- height="5.0000005"
- x="177.5"
- y="454.5"
- rx="0.546875"
- ry="0.546875" />
- <g
- id="g8181-5"
- style="display:inline;enable-background:new"
- transform="translate(21,1e-5)">
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path8170-5"
- d="M 165.5,459.5 V 454"
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" />
- <path
- sodipodi:open="true"
- d="M 164.50114,451.52593 A 9.3798456,5.5 0 0 1 165.50372,454"
- sodipodi:end="0"
- sodipodi:start="5.8166094"
- sodipodi:ry="5.5"
- sodipodi:rx="9.3798456"
- sodipodi:cy="454"
- sodipodi:cx="156.12387"
- sodipodi:type="arc"
- id="path8175-8"
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" />
- <path
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- d="m 167.50001,457.60147 v -4.05761"
- id="path8178-1"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- </g>
- </g>
- <g
- transform="translate(-63.000001)"
- id="g3149"
- style="display:inline;enable-background:new">
- <path
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- d="m 204.49995,459.50001 v 4.0165 c 0,1.65287 -1.33066,2.98353 -2.98353,2.98353 h -4.03294 c -1.65287,0 -2.98353,-1.33066 -2.98353,-2.98353 v -9.03297 c 0,-1.65287 1.33066,-2.98353 2.98353,-2.98353 h 1.01647"
- id="path10426-1"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cssssssc" />
- <path
- style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="m 200.49995,451.50001 h 1.0165 c 1.65287,0 2.98353,1.33066 2.98353,2.98353 v 3.01647 l -4.00824,0.008 z"
- id="path10430-1"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cssccc" />
- <g
- transform="translate(41.999999,1e-5)"
- style="display:inline;enable-background:new"
- id="g8193-3">
- <path
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- d="M 165.5,459.5 V 454"
- id="path8185-2"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"
- id="path8189-2"
- sodipodi:type="arc"
- sodipodi:cx="156.12387"
- sodipodi:cy="454"
- sodipodi:rx="9.3798456"
- sodipodi:ry="5.5"
- sodipodi:start="5.8166094"
- sodipodi:end="0"
- d="M 164.50114,451.52593 A 9.3798456,5.5 0 0 1 165.50372,454"
- sodipodi:open="true" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path8191-4"
- d="m 167.50001,457.60147 v -4.05761"
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" />
- </g>
- </g>
- <g
- transform="translate(-648,-55.99996)"
- id="g8280"
- style="display:inline;enable-background:new">
- <rect
- style="opacity:0;vector-effect:none;fill:#d40000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="rect8272"
- width="15.999999"
- height="15.999999"
- x="-669"
- y="506.99997"
- transform="scale(-1,1)" />
- <path
- transform="scale(-1,1)"
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- d="m -655.5,515.49997 v 4.0165 c 0,1.65287 -1.33066,2.98353 -2.98353,2.98353 h -4.03294 c -1.65287,0 -2.98353,-1.33066 -2.98353,-2.98353 v -9.03297 c 0,-1.65287 1.33066,-2.98353 2.98353,-2.98353 H -661.5"
- id="path8274"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cssssssc" />
- <g
- id="g8276"
- transform="translate(-20)" />
- <path
- style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- d="m 659.5,507.49997 h -1.0165 c -0.64696,0 -1.24455,0.20387 -1.73231,0.55112 -0.75838,0.53993 -1.25122,1.4265 -1.25122,2.43241 v 3.01647 l 4.00824,0.008 -0.008,-5.97178 z"
- id="path8278"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cssscccc" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g8290"
- transform="translate(-606,-55.99996)">
- <rect
- transform="scale(-1,1)"
- y="506.99997"
- x="-669"
- height="15.999999"
- width="15.999999"
- id="rect8282"
- style="opacity:0;vector-effect:none;fill:#d40000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" />
- <path
- sodipodi:nodetypes="cssssssc"
- inkscape:connector-curvature="0"
- id="path8284"
- d="m 665.49995,515.49997 v 4.0165 c 0,1.65287 -1.33066,2.98353 -2.98353,2.98353 h -4.03294 c -1.65287,0 -2.98353,-1.33066 -2.98353,-2.98353 v -9.03297 c 0,-1.65287 1.33066,-2.98353 2.98353,-2.98353 h 1.01647"
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" />
- <g
- transform="translate(-20)"
- id="g8286" />
- <path
- sodipodi:nodetypes="cssccc"
- inkscape:connector-curvature="0"
- id="path8288"
- d="m 661.49995,507.49997 h 1.0165 c 1.65287,0 2.98353,1.33066 2.98353,2.98353 v 3.01647 l -4.00824,0.008 z"
- style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" />
- </g>
- <g
- transform="translate(-647,-34.99996)"
- id="g8300"
- style="display:inline;enable-background:new">
- <rect
- style="opacity:0;vector-effect:none;fill:#d40000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="rect8292"
- width="15.999999"
- height="15.999999"
- x="673"
- y="485.99997" />
- <rect
- style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
- id="rect8294"
- width="10"
- height="14.999969"
- x="675.5"
- y="486.5"
- rx="2.9835341"
- ry="2.9835341" />
- <rect
- ry="0.546875"
- rx="0.546875"
- y="489.49997"
- x="679.5"
- height="5.0000005"
- width="2"
- id="rect8296"
- style="opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" />
- <g
- transform="translate(0,-21)"
- id="g8298" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_RESTRICT_VIEW_OFF-4"
- transform="matrix(0.53591163,0,0,0.55801106,-126.5083,-25.447517)">
- <rect
- y="302"
- x="404"
- height="16"
- width="16.000004"
- id="rect27916-7"
- style="display:inline;opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <g
- id="g28110-8">
- <path
- id="path27918-4"
- d="m 412,306.45213 c -3.54545,0 -5.90909,1.5 -6.49999,3.04787 0.5909,1.45213 2.95581,3.77094 6.49999,3.75 3.54709,-0.021 5.9091,-2.29787 6.50001,-3.75 -0.59091,-1.54787 -2.95455,-3.04787 -6.50001,-3.04787 z"
- style="fill:url(#linearGradient15405);fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccscz"
- inkscape:connector-curvature="0" />
- <ellipse
- id="path27920-5"
- style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="matrix(0.7500463,0,0,1.0294111,88.73017,294.07354)"
- cx="431"
- cy="14.5"
- rx="3.9999149"
- ry="2.91429" />
- <circle
- id="path27922-0"
- style="display:inline;fill:url(#linearGradient15407);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- transform="matrix(2.249956,0,0,2.251405,267.75278,4.81032)"
- cx="64"
- cy="135"
- r="1" />
- <path
- sodipodi:nodetypes="ccscs"
- style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 412,306.5 c -3.5,0 -5,1.5 -6.5,3 1.5,1.5 2.75,4 6.5,4 3.75,0 5,-2.5 6.5,-4 -1.5,-1.5 -3,-3 -6.5,-3 z"
- id="path27924-3"
- inkscape:connector-curvature="0" />
- <rect
- y="307.91428"
- x="411"
- height="2"
- width="2"
- id="rect27926-6"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <circle
- id="path27928-1"
- style="display:inline;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- transform="translate(347,172.91429)"
- cx="64"
- cy="135"
- r="1" />
- </g>
- </g>
- <path
- style="display:inline;fill:none;fill-rule:evenodd;stroke:#b4b4b4;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="M 101.24481,150.52549 92.852426,137.08557"
- id="path15475-0"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <g
- transform="matrix(0.69944752,0,0,0.70386741,-158,-165.92486)"
- style="display:inline;enable-background:new"
- id="ICON_RESTRICT_SELECT_OFF-7-8">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc"
- id="path45378-1-5-6-4-8"
- d="m 367.75,440.75 1.75,-1.5 2.5,5.25 1.75,-1 -2.25,-5 h 2.5 l -6.25,-6.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient15602);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="430"
- x="362"
- height="16"
- width="16"
- id="rect45374-0-5-6-5-4"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0"
- id="path17835-7-25-3"
- d="m 367.5,431.5 7,7.25 h -3 l 2.5,4.75 -1.75,1 -2.5,-5 -2.25,2.25 z"
- style="fill:none;stroke:#000000;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path17845-9-4-1"
- d="m 368.34375,433.75 v 5.75"
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_RESTRICT_VIEW_OFF-4-6"
- transform="matrix(0.53591163,0,0,0.55801106,-105.5083,-25.447514)">
- <rect
- y="302"
- x="404"
- height="16"
- width="16.000004"
- id="rect27916-7-4"
- style="display:inline;opacity:0;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <g
- id="g28110-8-5">
- <path
- id="path27918-4-2"
- d="m 412,306.45213 c -3.54545,0 -5.90909,1.5 -6.49999,3.04787 0.5909,1.45213 2.95581,3.77094 6.49999,3.75 3.54709,-0.021 5.9091,-2.29787 6.50001,-3.75 -0.59091,-1.54787 -2.95455,-3.04787 -6.50001,-3.04787 z"
- style="fill:url(#linearGradient17086);fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccscz"
- inkscape:connector-curvature="0" />
- <ellipse
- id="path27920-5-0"
- style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none"
- transform="matrix(0.7500463,0,0,1.0294111,88.73017,294.07354)"
- cx="431"
- cy="14.5"
- rx="3.9999149"
- ry="2.91429" />
- <circle
- id="path27922-0-2"
- style="display:inline;fill:url(#linearGradient17088);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- transform="matrix(2.249956,0,0,2.251405,267.75278,4.81032)"
- cx="64"
- cy="135"
- r="1" />
- <path
- sodipodi:nodetypes="ccscs"
- style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 412,306.5 c -3.5,0 -5,1.5 -6.5,3 1.5,1.5 2.75,4 6.5,4 3.75,0 5,-2.5 6.5,-4 -1.5,-1.5 -3,-3 -6.5,-3 z"
- id="path27924-3-9"
- inkscape:connector-curvature="0" />
- <rect
- y="307.91428"
- x="411"
- height="2"
- width="2"
- id="rect27926-6-0"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
- <circle
- id="path27928-1-9"
- style="display:inline;opacity:0.7;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.74699998;marker:none"
- transform="translate(347,172.91429)"
- cx="64"
- cy="135"
- r="1" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_RESTRICT_VIEW_ON-0-9"
- transform="matrix(0.51332204,0,0,0.45193371,-106.94628,7.531493)">
- <g
- transform="translate(0.4838899)"
- id="g27934-6-4">
- <path
- sodipodi:nodetypes="ccscz"
- style="display:inline;opacity:0.25;fill:url(#radialGradient27973-2-2);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 432.51611,305.45213 c -3,0 -7,2.04787 -5.5,4.04787 0.5,1.45213 2.49969,3.02073 5.49861,2.99979 3.00139,-0.021 4.82513,-1.62106 5.50139,-2.99995 2,-2.49984 -2.5,-4.04771 -5.5,-4.04771 z"
- id="path27936-3-5"
- inkscape:connector-curvature="0" />
- <path
- id="path27938-2-1"
- d="m 432.51611,305.45213 c -3,0 -7.75,2.04787 -6.25,4.04787 0.5,1.45213 3.25108,3.52094 6.25,3.5 3.00139,-0.021 5.82374,-2.12111 6.5,-3.5 2,-2.49984 -3.5,-4.04787 -6.5,-4.04787 z"
- style="display:inline;opacity:0.18000004;fill:url(#radialGradient27975-7-6);fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccscz"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.25;fill:none;stroke:url(#linearGradient17090);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 438.51611,309.5 c -2,4 -10,4 -12,0"
- id="path27940-0-0"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path27942-6-3"
- d="m 426.01611,309.5 c 2,5 11,5 13,0"
- style="opacity:0.3;fill:none;stroke:#000000;stroke-width:1.00000012px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="opacity:0.25;fill:none;stroke:none"
- id="rect27944-1-7"
- width="15.983887"
- height="16"
- x="425.01611"
- y="302" />
- </g>
- <g
- transform="matrix(0.67292818,0,0,0.69502762,-127.10972,-162.15459)"
- style="display:inline;opacity:0.3;enable-background:new"
- id="ICON_RESTRICT_SELECT_ON-6-8">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc"
- id="path45378-1-5-0-5-8"
- d="m 367.75,440.75 1.75,-1.5 2.5,5.25 1.75,-1 -2.25,-5 h 2.5 l -6.25,-6.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17092);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="430"
- x="362"
- height="16"
- width="16"
- id="rect45374-0-5-0-6-6"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0"
- id="path17835-6-9-0"
- d="m 367.5,431.5 7,7.25 h -3 l 2.5,4.75 -1.75,1 -2.5,-5 -2.25,2.25 z"
- style="fill:none;stroke:#000000;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path17845-4-3-4"
- d="m 368.34375,433.75 v 5.75"
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- <path
- style="display:inline;fill:none;fill-rule:evenodd;stroke:#b4b4b4;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 122.24481,150.52549 -8.39238,-13.43992"
- id="path15475-0-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <g
- style="display:inline;enable-background:new"
- id="ICON_RESTRICT_VIEW_ON-0-9-9"
- transform="matrix(0.51332204,0,0,0.45193371,-85.946279,7.5314909)">
- <g
- transform="translate(0.4838899)"
- id="g27934-6-4-0">
- <path
- sodipodi:nodetypes="ccscz"
- style="display:inline;opacity:0.25;fill:url(#radialGradient27973-2-2-2);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 432.51611,305.45213 c -3,0 -7,2.04787 -5.5,4.04787 0.5,1.45213 2.49969,3.02073 5.49861,2.99979 3.00139,-0.021 4.82513,-1.62106 5.50139,-2.99995 2,-2.49984 -2.5,-4.04771 -5.5,-4.04771 z"
- id="path27936-3-5-2"
- inkscape:connector-curvature="0" />
- <path
- id="path27938-2-1-4"
- d="m 432.51611,305.45213 c -3,0 -7.75,2.04787 -6.25,4.04787 0.5,1.45213 3.25108,3.52094 6.25,3.5 3.00139,-0.021 5.82374,-2.12111 6.5,-3.5 2,-2.49984 -3.5,-4.04787 -6.5,-4.04787 z"
- style="display:inline;opacity:0.18000004;fill:url(#radialGradient27975-7-6-7);fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccscz"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.25;fill:none;stroke:url(#linearGradient17532);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 438.51611,309.5 c -2,4 -10,4 -12,0"
- id="path27940-0-0-7"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path27942-6-3-6"
- d="m 426.01611,309.5 c 2,5 11,5 13,0"
- style="opacity:0.3;fill:none;stroke:#000000;stroke-width:1.00000012px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="opacity:0.25;fill:none;stroke:none"
- id="rect27944-1-7-5"
- width="15.983887"
- height="16"
- x="425.01611"
- y="302" />
- </g>
- <g
- transform="matrix(0.67292818,0,0,0.69502762,-106.10972,-162.15459)"
- style="display:inline;opacity:0.3;enable-background:new"
- id="ICON_RESTRICT_SELECT_ON-6-8-7">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc"
- id="path45378-1-5-0-5-8-1"
- d="m 367.75,440.75 1.75,-1.5 2.5,5.25 1.75,-1 -2.25,-5 h 2.5 l -6.25,-6.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17534);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="430"
- x="362"
- height="16"
- width="16"
- id="rect45374-0-5-0-6-6-3"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0"
- id="path17835-6-9-0-3"
- d="m 367.5,431.5 7,7.25 h -3 l 2.5,4.75 -1.75,1 -2.5,-5 -2.25,2.25 z"
- style="fill:none;stroke:#000000;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path17845-4-3-4-3"
- d="m 368.34375,433.75 v 5.75"
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- <path
- style="display:inline;fill:none;fill-rule:evenodd;stroke:#b4b4b4;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 143.24481,150.52549 -8.39238,-13.43992"
- id="path15475-0-6-8"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <g
- transform="matrix(0.69944752,0,0,0.70386741,-116,-165.92486)"
- style="display:inline;enable-background:new"
- id="ICON_RESTRICT_SELECT_OFF-7-8-7-5">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc"
- id="path45378-1-5-6-4-8-6-1"
- d="m 367.75,440.75 1.75,-1.5 2.5,5.25 1.75,-1 -2.25,-5 h 2.5 l -6.25,-6.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17536);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="430"
- x="362"
- height="16"
- width="16"
- id="rect45374-0-5-6-5-4-0-0"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0"
- id="path17835-7-25-3-9-8"
- d="m 367.5,431.5 7,7.25 h -3 l 2.5,4.75 -1.75,1 -2.5,-5 -2.25,2.25 z"
- style="fill:none;stroke:#000000;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path17845-9-4-1-7-7"
- d="m 368.34375,433.75 v 5.75"
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- <g
- style="display:inline;enable-background:new"
- id="ICON_RESTRICT_VIEW_ON-0-9-9-3"
- transform="matrix(0.51332204,0,0,0.45193371,-65.946279,7.5314909)">
- <g
- transform="translate(0.4838899)"
- id="g27934-6-4-0-1">
- <path
- sodipodi:nodetypes="ccscz"
- style="display:inline;opacity:0.25;fill:url(#radialGradient27973-2-2-2-0);fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 432.51611,305.45213 c -3,0 -7,2.04787 -5.5,4.04787 0.5,1.45213 2.49969,3.02073 5.49861,2.99979 3.00139,-0.021 4.82513,-1.62106 5.50139,-2.99995 2,-2.49984 -2.5,-4.04771 -5.5,-4.04771 z"
- id="path27936-3-5-2-8"
- inkscape:connector-curvature="0" />
- <path
- id="path27938-2-1-4-3"
- d="m 432.51611,305.45213 c -3,0 -7.75,2.04787 -6.25,4.04787 0.5,1.45213 3.25108,3.52094 6.25,3.5 3.00139,-0.021 5.82374,-2.12111 6.5,-3.5 2,-2.49984 -3.5,-4.04787 -6.5,-4.04787 z"
- style="display:inline;opacity:0.18000004;fill:url(#radialGradient27975-7-6-7-4);fill-opacity:1;fill-rule:evenodd;stroke:none"
- sodipodi:nodetypes="ccscz"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:0.25;fill:none;stroke:url(#linearGradient17802);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- d="m 438.51611,309.5 c -2,4 -10,4 -12,0"
- id="path27940-0-0-7-4"
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path27942-6-3-6-2"
- d="m 426.01611,309.5 c 2,5 11,5 13,0"
- style="opacity:0.3;fill:none;stroke:#000000;stroke-width:1.00000012px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- <rect
- style="opacity:0.25;fill:none;stroke:none"
- id="rect27944-1-7-5-2"
- width="15.983887"
- height="16"
- x="425.01611"
- y="302" />
- </g>
- <g
- transform="matrix(0.67292818,0,0,0.69502762,-86.109719,-162.15459)"
- style="display:inline;opacity:0.3;enable-background:new"
- id="ICON_RESTRICT_SELECT_ON-6-8-7-4">
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc"
- id="path45378-1-5-0-5-8-1-5"
- d="m 367.75,440.75 1.75,-1.5 2.5,5.25 1.75,-1 -2.25,-5 h 2.5 l -6.25,-6.25 z"
- style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient17804);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.80000001;marker:none;enable-background:accumulate" />
- <rect
- y="430"
- x="362"
- height="16"
- width="16"
- id="rect45374-0-5-0-6-6-3-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0"
- id="path17835-6-9-0-3-7"
- d="m 367.5,431.5 7,7.25 h -3 l 2.5,4.75 -1.75,1 -2.5,-5 -2.25,2.25 z"
- style="fill:none;stroke:#000000;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path17845-4-3-4-3-5"
- d="m 368.34375,433.75 v 5.75"
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- </g>
- <path
- style="display:inline;fill:#ffffff;fill-rule:evenodd;stroke:#b4b4b4;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;enable-background:new"
- d="m 163.24481,150.52549 -8.39238,-13.43992"
- id="path15475-0-6-8-7"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <g
- id="g7004"
- transform="translate(126.03866,42.479059)"
- style="display:inline;opacity:0.8;enable-background:new">
- <path
- sodipodi:nodetypes="ccccc"
- style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
- d="m 57.5,410.5 v 2 h -2 v -2 z"
- id="path6988"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- id="path6990"
- d="m 59.5,420.5 v 1.9999 h -2 V 420.5 Z"
- style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
- sodipodi:nodetypes="ccccc" />
- <path
- inkscape:connector-curvature="0"
- id="path6994"
- d="m 51.5,415.5 v 2 h -2 v -2 z"
- style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
- sodipodi:nodetypes="ccccc" />
- <path
- sodipodi:nodetypes="cccccccccccc"
- inkscape:connector-curvature="0"
- id="path6998"
- style="display:inline;opacity:0.9;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new"
- d="m 62.5,411.49995 -3,5e-5 m -4,0 -8,-5e-5 m 15,5 -9,5e-5 m -4,0 -2,-5e-5 m 15,5 -1,5e-5 m -4,0 -10,-5e-5" />
- </g>
- <g
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- transform="translate(-28.153595,-46.022098)"
- id="ICON_PREFERENCES-3"
- style="display:inline;enable-background:new">
- <rect
- y="602"
- x="327"
- height="16"
- width="16"
- id="rect42947-6"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- id="g42949-1">
- <g
- style="opacity:0.85"
- id="g42951-2">
- <path
- style="fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 341.5161,616.38229 340.5,617.5 l -10.73389,-10e-6 -1.25,-1.25 L 328.5,605.5 h 13 z"
- id="path42953-9"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:nodetypes="ccccccc"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42955-3"
- d="m 340,616 h -8.25 v -1 H 340 Z"
- style="display:inline;overflow:visible;visibility:visible;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- id="rect38927-1"
- width="11.970581"
- height="8.0306396"
- x="329.02942"
- y="605.96936" />
- <rect
- y="605.96936"
- x="329.02942"
- height="8.0306396"
- width="11.970581"
- id="rect45307-9"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.3;fill:url(#radialGradient45309-02);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path42957-4"
- d="m 340.48389,606.50001 c -3.66204,-3e-5 -7.70403,2e-5 -10.98389,-10e-6 l 0.002,10.00007 10.99778,-7e-5 -0.0161,-9.99999 z"
- style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:url(#linearGradient42578);stroke-width:0.99999923px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- y="615"
- x="330"
- height="1.0000043"
- width="1"
- id="rect42959-7"
- style="display:inline;overflow:visible;visibility:visible;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate" />
- <path
- sodipodi:nodetypes="ccccc"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999994px;marker:none;enable-background:accumulate"
- d="m 340.5,614 h -11 v -1 h 11 z"
- id="path38929-8"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- inkscape:connector-curvature="0" />
- </g>
- <path
- style="opacity:0.25;fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter24186-3-2-2)"
- d="m 337.7,606.7 v 2.75 l 2,1.5 v 2.5 l -0.25,0.25 h -1.75 v -2 h -2 v 2 h -1.75 l -0.25,-0.25 v -2.5 l 2,-1.5 v -2.75 z"
- id="path42961-4"
- sodipodi:nodetypes="ccccccccccccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccccccccccccccccccccccc"
- id="path42963-5"
- d="m 333.75,602.5 h 1.75 c 0,0 0,2 0,2 h 2 v -2 h 1.75 l 0.25,0.25 v 2.5 l -2,1.5 v 2.5 l 2,1.5 v 2.5 l -0.25,0.25 h -1.75 v -2 h -2 v 2 h -1.75 l -0.25,-0.25 v -2.5 l 2,-1.5 v -2.5 l -2,-1.5 v -2.5 z"
- style="fill:#ffffff;fill-rule:evenodd;stroke:url(#linearGradient42580);stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- </g>
- </g>
- <g
- transform="translate(315.05087,356.60901)"
- style="display:inline;enable-background:new"
- id="ICON_SOLO_ON-6">
- <rect
- y="198.9792"
- x="4.9506397"
- height="16"
- width="16"
- id="rect23018-5-4-4-1"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <g
- transform="matrix(0.94058502,0,0,0.94058502,0.9128606,12.74924)"
- id="g56716-9-0">
- <path
- sodipodi:type="star"
- style="fill:url(#linearGradient42617);fill-opacity:1;stroke:#341b00;stroke-width:0.96882826;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path15855-2-6"
- sodipodi:sides="5"
- sodipodi:cx="13.700194"
- sodipodi:cy="207.20645"
- sodipodi:r1="7.1873641"
- sodipodi:r2="3.3158474"
- sodipodi:arg1="0.94697287"
- sodipodi:arg2="1.5618338"
- inkscape:flatsided="false"
- inkscape:rounded="0"
- inkscape:randomized="0"
- d="m 17.898641,213.04008 -4.168729,-2.51791 -4.280439,2.47993 1.106473,-4.74277 -3.6812884,-3.3046 4.8525664,-0.41328 2.005278,-4.52229 1.892578,4.48735 4.920618,0.50967 -3.682889,3.18662 z"
- inkscape:transform-center-x="-0.010954063"
- inkscape:transform-center-y="-0.74285516"
- transform="matrix(1.0972098,0,0,1.0975406,-2.0923019,-19.740595)" />
- <path
- style="fill:none;stroke:#ffffff;stroke-width:1.06316817;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 12.931855,202.51514 -1.201334,2.70994 c -0.137665,0.32193 -0.454082,0.55986 -0.800889,0.60222 l -2.9032248,0.26765 2.2358168,1.97391 c 0.261321,0.2395 0.380487,0.62447 0.300333,0.97022 l -0.667408,2.81032"
- id="path15869-5-3"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- id="g42838"
- transform="translate(84.038997,23)">
- <g
- id="g42836">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect42818"
- width="16"
- height="16"
- x="26"
- y="92" />
- <circle
- r="8"
- cy="118"
- cx="132"
- style="display:inline;opacity:0.75;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
- id="circle42820"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.7606373,-0.08449162,0.08669728,-0.7451645,124.04885,199.0823)" />
- <circle
- r="8"
- cy="118"
- cx="132"
- transform="matrix(0.8125001,0,0,0.8125002,-73.250026,4.1249738)"
- id="circle42822"
- style="fill:none;stroke:#000000;stroke-width:1.23076892;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- sodipodi:open="true"
- transform="matrix(0.8077059,0,0,-0.2072667,-72.578821,124.6156)"
- sodipodi:end="3.12636"
- sodipodi:start="0"
- d="m 140,118 a 8,10.07671 0 0 1 -7.93907,10.07642 8,10.07671 0 0 1 -8.06,-9.92293"
- sodipodi:ry="10.07671"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path42824"
- style="opacity:0.1;fill:none;stroke:url(#radialGradient42840);stroke-width:2.44404984;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- sodipodi:type="arc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <circle
- r="8"
- cy="118"
- cx="132"
- style="display:inline;opacity:0.15;fill:url(#linearGradient42842);fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- id="circle42826"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\Kopia blender\.blender\icons\blender's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- transform="matrix(-0.7451139,-0.08394973,0.08492792,-0.7403854,122.33348,198.48526)" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:open="true"
- sodipodi:end="3.12636"
- sodipodi:start="0"
- d="m 140,118 a 8,8 0 0 1 -7.93907,7.99977 8,8 0 0 1 -8.06,-7.87791"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path42828"
- style="display:inline;fill:none;stroke:#000000;stroke-width:1.50070953;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- sodipodi:type="arc"
- transform="matrix(0.780896,0,0,0.2786183,-69.081831,66.644097)" />
- <circle
- r="8"
- cy="118"
- cx="132"
- transform="matrix(0.6875009,0,0,0.687501,-56.75013,18.874887)"
- id="circle42830"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:none;stroke:url(#linearGradient42844);stroke-width:1.45454454;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- transform="matrix(0,0.7811136,-0.34375,0,74.562502,-3.1287373)"
- sodipodi:open="true"
- sodipodi:end="6.2712816"
- sodipodi:start="0"
- d="m 140,118 a 8,8 0 0 1 -7.97619,7.99996 8,8 0 0 1 -8.02367,-7.95235 8,8 0 0 1 7.92844,-8.04729 8,8 0 0 1 8.07085,7.90445"
- sodipodi:ry="8"
- sodipodi:rx="8"
- sodipodi:cy="118"
- sodipodi:cx="132"
- id="path42832"
- style="display:inline;fill:none;stroke:#000000;stroke-width:1.35088885;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- sodipodi:type="arc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <circle
- r="8"
- cy="118"
- cx="132"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- style="display:inline;overflow:visible;visibility:visible;opacity:0.18000004;fill:none;stroke:url(#linearGradient42846);stroke-width:1.0666672;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
- id="circle42834"
- transform="matrix(0.9374995,0,0,0.9374996,-89.749939,-10.62495)" />
- </g>
- </g>
- <g
- style="display:inline;enable-background:new;opacity:0.7"
- id="ICON_DOT-1"
- transform="translate(112.05535,339.92702)">
- <rect
- y="111"
- x="103"
- height="16"
- width="16"
- id="rect24489-4"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate" />
- <circle
- transform="matrix(-0.248353,0.02816779,0.02830718,0.248422,140.45214,86.01031)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- id="path10768-9"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;opacity:1"
- cx="132"
- cy="118"
- r="8" />
- </g>
- <path
- style="display:inline;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- d="m 265.05663,454.00567 4.99112,5.02507 -4.99112,4.97493 -5,-5 z"
- id="path23352"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- id="path23378"
- d="m 243.85662,453.95566 4.99112,5.02507 -4.99112,4.97493 -5,-5 z"
- style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new"
- sodipodi:nodetypes="ccccc" />
- <g
- transform="matrix(-1,0,0,1,529.37263,-42.471164)"
- style="display:inline;enable-background:new"
- id="g12146">
- <path
- inkscape:connector-curvature="0"
- d="m 237.171,504.53983 5.34213,0.008 m -2.18083,-4.04784 -4,4 M 240.5,508.5 l -4.1677,-4.00001"
- style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;enable-background:new"
- id="path10766-9"
- sodipodi:nodetypes="cccccc" />
- <path
- sodipodi:nodetypes="cz"
- id="path12139"
- style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;enable-background:new"
- d="m 246.5,499.5 c -2.5,-2.5 -0.25,-4.25 4,-5"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- d="m 246.5,499.5 c 3.5,3.5 2.75,5.04783 -3.98687,5.04783"
- style="display:inline;opacity:1;fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:7.40000057;stroke-opacity:1;enable-background:new"
- id="path12141"
- sodipodi:nodetypes="cz" />
- </g>
- <g
- transform="translate(63.014518,-20.992088)"
- style="display:inline;enable-background:new"
- id="ICON_LIBRARY_DATA_DIRECT-6">
- <g
- transform="translate(0,128)"
- id="g24024-5">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect22150-6"
- width="16"
- height="16"
- x="299"
- y="365" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path12337-39"
- d="m 304.20488,366.47791 h 8.33334 v 13 h -11 l -1e-5,-10 z"
- style="display:inline;fill:url(#linearGradient43187);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none"
- inkscape:connector-curvature="0" />
- <path
- transform="matrix(1.2999758,0,0,1.2999988,365.56499,31.43979)"
- sodipodi:nodetypes="ccc"
- id="path12339-4"
- style="display:inline;opacity:0.7;fill:none;stroke:#000000;stroke-width:0.76923829px;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1;filter:url(#filter31351-7)"
- d="M -48.500031,260.50809 -46.5,260.5 l -3.1e-5,-1.99191"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path12341-8"
- d="m 301.01612,370 h 4 v -4 z"
- style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccc"
- id="path12343-12"
- style="display:inline;fill:none;stroke:url(#linearGradient43189);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 302.51612,371.00001 v 7.5 m 3.5,-11 h 5.5"
- inkscape:connector-curvature="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 301.53822,368.97791 v 10.5 h 11 v -13 h -8.5 z"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path12345-9"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- transform="matrix(0,1,1,0,95.24196,-260.68059)"
- mask="url(#mask43822-7)"
- sodipodi:nodetypes="cccccccc"
- id="path43815-3"
- d="m 765.0088,212.5 -3.9824,3.5 -0.0176,-2 h -6.9736 l -0.0132,-3 h 6.9868 l 0.004,-2 z"
- style="display:inline;opacity:0.93999993;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- inkscape:transform-center-x="-1"
- inkscape:transform-center-y="2"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(0.05047111,-42.001653)"
- style="display:inline;enable-background:new"
- id="ICON_LIBRARY_DATA_DIRECT-9">
- <g
- transform="translate(0,128)"
- id="g24024-8">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect22150-4"
- width="16"
- height="16"
- x="299"
- y="365" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 301.53822,368.97791 v 10.5 h 11 v -13 h -8.5 z"
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.92765957"
- id="path12345-4"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- transform="translate(-454.0088,290)"
- mask="url(#mask43822-5)"
- sodipodi:nodetypes="cccccccc"
- id="path43815-4"
- d="m 765.0088,212.5 -3.9824,3.5 -0.0176,-2 h -6.9736 l -0.0132,-3 h 6.9868 l 0.004,-2 z"
- style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- inkscape:transform-center-x="-2"
- inkscape:transform-center-y="1"
- inkscape:connector-curvature="0" />
- </g>
- <g
- transform="translate(20.991155,-41.985633)"
- style="display:inline;enable-background:new"
- id="ICON_LIBRARY_DATA_DIRECT-6-8">
- <g
- transform="translate(0,128)"
- id="g24024-5-5">
- <rect
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect22150-6-7"
- width="16"
- height="16"
- x="299"
- y="365" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- d="m 301.53822,368.97791 v 10.5 h 11 v -13 h -8.5 z"
- style="fill:none;stroke:#ffffff;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path12345-9-9"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- </g>
- <path
- transform="matrix(0,1,1,0,95.24196,-260.68059)"
- mask="url(#mask43822-7-6)"
- sodipodi:nodetypes="cccccccc"
- id="path43815-3-7"
- d="m 765.0088,212.5 -3.9824,3.5 -0.0176,-2 h -6.9736 l -0.0132,-3 h 6.9868 l 0.004,-2 z"
- style="display:inline;opacity:1;fill:#fefefe;fill-opacity:1;fill-rule:nonzero;stroke:none;enable-background:new"
- inkscape:transform-center-x="-1"
- inkscape:transform-center-y="2"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g5040"
- transform="translate(335.99091,-63.042558)"
- style="display:inline;opacity:1;enable-background:new">
- <rect
- ry="0"
- rx="0"
- y="514"
- x="-42"
- height="16"
- width="16"
- id="rect4914"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- transform="scale(-1,1)" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 37.5,519.99995 v -0.75 c 0,-1.75 -0.75,-2.75 -3.00003,-2.75008 C 32.25,516.49995 31.5,517.49995 31.5,519.24995 V 520"
- id="path4905"
- sodipodi:nodetypes="csccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 38.5,521.49995 h -8 v 6.00003 h 8 z"
- id="rect4909"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- id="rect36043-2-8-6"
- d="m 34,523 h 1 v 2 h -1 z"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.29999995;marker:none;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="g5034"
- transform="translate(314.99091,-84.042558)"
- style="display:inline;opacity:0.7;enable-background:new">
- <rect
- transform="scale(-1,1)"
- style="display:inline;overflow:visible;visibility:visible;opacity:0;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.79999995;marker:none;enable-background:accumulate"
- id="rect4998"
- width="16"
- height="16"
- x="-42"
- y="535"
- rx="0"
- ry="0" />
- <path
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="csccc"
- id="path5000"
- d="m 33.5,541 v -0.75005 c 0,-1.75 -0.75,-2.75 -3.00003,-2.75008 C 28.25,537.49995 27.5,538.49995 27.5,540.24995 V 541"
- style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0"
- id="path5002"
- d="m 40.5,542.49995 h -8 v 6.00003 h 8 z"
- style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.29999995;marker:none;enable-background:accumulate"
- d="m 36,544 h 1 v 2 h -1 z"
- id="path5004" />
+ </g>
+ <g transform="translate(-126.00356,356.99997)" style="display:inline;enable-background:new" id="g15185-9">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" d="m 304.5,100 a 0.50005,0.50005 0 1 0 0,1 h 2.25977 c -0.20553,-0.30677 -0.35861,-0.64616 -0.48438,-1 z m 0,4 a 0.50005,0.50005 0 1 0 0,1 h 9 a 0.50005,0.50005 0 1 0 0,-1 z m 0,4 a 0.50005,0.50005 0 1 0 0,1 h 9 a 0.50005,0.50005 0 1 0 0,-1 z" id="path24220-9-4-1" inkscape:connector-curvature="0"/>
+ <path id="circle24228-7-4-8" style="opacity:0.6;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke" d="m 301.5,104 a 0.5,0.5 0 0 1 -0.5,0.5 0.5,0.5 0 0 1 -0.5,-0.5 0.5,0.5 0 0 1 0.5,-0.5 0.5,0.5 0 0 1 0.5,0.5 z m 0,4 a 0.5,0.5 0 0 1 -0.5,0.5 0.5,0.5 0 0 1 -0.5,-0.5 0.5,0.5 0 0 1 0.5,-0.5 0.5,0.5 0 0 1 0.5,0.5 z m 0,-8 a 0.5,0.5 0 0 1 -0.5,0.5 0.5,0.5 0 0 1 -0.5,-0.5 0.5,0.5 0 0 1 0.5,-0.5 0.5,0.5 0 0 1 0.5,0.5 z" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="sssssccccccccccccc" inkscape:connector-curvature="0" id="path13640-7-5" d="m 310.5,95 c -1.933,0 -3.5,1.567 -3.5,3.5 0,1.933 1.567,3.5 3.5,3.5 1.933,0 3.5,-1.567 3.5,-3.5 0,-1.933 -1.567,-3.5 -3.5,-3.5 z m -0.5,1 h 1 v 2 h 2 v 1 h -2 v 2 h -1 v -2 h -2 v -1 h 2 z" style="display:inline;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"/>
+ </g>
+ <g id="g15277" transform="translate(21,-41)">
+ <path inkscape:connector-curvature="0" style="display:inline;opacity:0.5;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new" d="m 218.50005,286.50713 -2.00712,-0.007 0.007,11.007 h 11 v -2" id="path15273" sodipodi:nodetypes="ccccc" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"/>
+ <path style="display:inline;fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;enable-background:new" d="m 221.5,286.5 h 1 c 2.5,0 4.75,-3.25 6.5,-1.5 1.75,1.75 -1.5,4 -1.5,6.5 v 1" id="path15275" inkscape:connector-curvature="0" sodipodi:nodetypes="czccc"/>
+ </g>
+ <g transform="translate(-541,-51)" style="display:inline;enable-background:new" id="g15431-6">
+ <path inkscape:connector-curvature="0" id="rect15415-8" d="m 548,653 c -0.54532,0 -1,0.45468 -1,1 v 9 c 0,0.54532 0.45468,1 1,1 h 10 c 0.54532,0 1,-0.45468 1,-1 v -1 h -1 v 1 h -10 v -4 -5 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path inkscape:connector-curvature="0" id="rect15379-7" d="m 550,650 c -0.54532,0 -1,0.45468 -1,1 v 9 c 0,0.54532 0.45468,1 1,1 h 10 c 0.54532,0 1,-0.45468 1,-1 v -9 c 0,-0.54532 -0.45468,-1 -1,-1 z m 0,1 h 2 v 2 h -2 z m 0,3 h 10 v 6 h -10 z" style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"/>
+ </g>
+ <g id="g15556" transform="translate(-21,63)">
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path15502" d="m 460.50004,567.49996 h -10 v -10 h 10 z" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path sodipodi:nodetypes="ccc" inkscape:connector-curvature="0" id="path15506" d="m 448.5,560.5 -0.99996,-4e-5 v 10 h 10 L 457.5,569.5" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"/>
+ <path d="m 455.49287,559.50712 v 6 m 3.00001,-3 h -6.00001" style="fill:#5fd38d;stroke:#ffffff;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path7085-6-6" inkscape:connector-curvature="0"/>
+ </g>
+ <g inkscape:export-ydpi="96" inkscape:export-xdpi="96" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" style="display:inline;opacity:0.6;enable-background:new" transform="translate(-64,43)" id="g5919">
+ <path inkscape:export-ydpi="90" inkscape:export-xdpi="90" inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\blender-cvs-windows\.blender\.blender\icons\jendrzych's iconset.png" sodipodi:nodetypes="csccc" id="path5911" d="M 411.49912,414.98781 411.5,413 c 6.6e-4,-1.5 -1,-2.5 -2.49955,-2.49989 C 407.5,410.5 406.5,411.5 406.5,413 l 0.002,0.98781" style="fill:none;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" inkscape:connector-curvature="0"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" id="path5913" d="m 417.5,415.49994 h -7 v 5.00003 h 7 z" style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/>
+ <path sodipodi:nodetypes="ccccc" inkscape:connector-curvature="0" style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.29999995;marker:none;enable-background:accumulate" d="m 413,416.99999 h 2 V 418 h -2 z" id="path5915"/>
+ <path id="path5917" d="m 414,416.99999 h 1 V 419 h -1 z" style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.29999995;marker:none;enable-background:accumulate" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc"/>
+ </g>
+ <g style="display:inline;enable-background:new" transform="translate(-43.000016,43)" id="g5925" inkscape:export-filename="C:\Users\Andrzej Ambroż\Desktop\mtrx.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96">
+ <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 414,410 c -0.86131,-6e-5 -1.62742,0.29548 -2.16602,0.83398 C 411.29539,411.37249 411,412.13889 411,413 c 0,6.7e-4 0,10e-4 0,0.002 l 0.002,1.98633 1,-0.002 -0.002,-1.98828 c 4.8e-4,-0.63777 0.20489,-1.12097 0.54102,-1.45703 0.33651,-0.33647 0.81984,-0.54107 1.45898,-0.54102 0.63862,-5e-5 1.12246,0.20455 1.45898,0.54102 0.33653,0.33646 0.54145,0.82028 0.54102,1.45898 v 1.98828 h 1 V 413 c 5.7e-4,-0.8613 -0.29537,-1.62751 -0.83398,-2.16602 C 415.62741,410.29548 414.86093,409.99994 414,410 Z" id="path5921" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccccc"/>
+ <path inkscape:connector-curvature="0" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 324.5,605 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 5 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 7 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -5 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 2.5,2 h 1 1 v 1 1 h -1 v -1 h -1 z" transform="translate(86,-190)" id="path5923"/>
</g>
</g>
- <g
- inkscape:groupmode="layer"
- id="layer6"
- inkscape:label="Python icons"
- style="display:none">
- <g
- style="display:inline;enable-background:new"
- id="g30250-6"
- transform="matrix(-1,0,0,1,788.49395,-2.4863553)" />
- <g
- id="g59188"
- transform="translate(441,-963.36218)"
- style="display:inline;enable-background:new">
- <rect
- style="opacity:0;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect59190"
- width="16"
- height="16"
- x="26"
- y="1036.3622" />
- <g
- transform="translate(-727,832.3622)"
- id="g59192"
- style="display:inline;enable-background:new">
- <path
- inkscape:connector-curvature="0"
- style="fill:url(#linearGradient106804);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;display:inline"
- d="m 756.16666,204.50001 8.33334,-1e-5 0,13.99999 -11,1e-5 -10e-6,-10.99999 2.66667,-3 z"
- id="path59194"
- sodipodi:nodetypes="cccccc"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- sodipodi:nodetypes="cccccc"
- id="path59196"
- d="m 756.16666,204.50001 8.33334,-1e-5 0,13.99999 -11,1e-5 -10e-6,-10.99999 2.66667,-3 z"
- style="opacity:0.3;fill:url(#radialGradient106806);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- id="path59198"
- style="fill:none;stroke:url(#linearGradient106808);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;display:inline"
- d="m 754.5,209 0,9.5 m 3.5,-13 5.5,0"
- sodipodi:nodetypes="cccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccc"
- id="path59200"
- d="m 753,208 4,0 0,-4 -4,4 z"
- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- id="path59202"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 753.5,207.00001 0,11.49999 11,-1e-5 0,-13.99999 -8.5,1e-5 -2.5,2.5 z"
- inkscape:export-filename="C:\Documents and Settings\Tata\Pulpit\BLENDER ICONSET\Kopia blender\.blender\icons\jendrzych's iconset.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient106810);stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
- d="m 757.5,206.5 0,2 -2,0"
- id="path59204" />
- </g>
- <g
- id="g59206"
- transform="translate(26,2.12e-5)">
- <g
- transform="translate(42,3.0002)"
- id="g59208">
- <path
- inkscape:connector-curvature="0"
- style="fill:#4381b3;fill-opacity:1;stroke:none"
- d="m -32.5,1036.8622 c -3,0 -3,1.5128 -3,2.0128 l 0,0.9872 -0.5,0 c -0.25,0 -2.5,10e-4 -2.5,3 0,2.9988 2.25,3 2.5,3 l 0.5,0 0,-1 c 0,-1.1046 0.89543,-2 2,-2 l 2,-0.013 c 1.10457,0 2,-0.8954 2,-2 l 0,-1.9872 c 0,-0.5 0,-2 -3,-2 l 0,0 0,2e-4 z"
- id="path59210"
- sodipodi:nodetypes="ccccsccccccccc" />
- <rect
- style="opacity:0.01000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect59212"
- width="0.99999928"
- height="1.0468764"
- x="-34"
- y="1038.3153" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccsccccccccc"
- id="path59214"
- d="m -32.5,1048.8622 c 3,0 3,-1.5128 3,-2.0128 l 0,-0.9872 0.5,0 c 0.25,0 2.5,-10e-4 2.5,-3 0,-2.9988 -2.25,-3 -2.5,-3 l -0.5,0 0,1 c 0,1.1046 -0.89543,2 -2,2 l -2,0.013 c -1.10457,0 -2,0.8954 -2,2 l 0,1.9872 c 0,0.5 0,2 3,2 l 0,0 0,-2e-4 z"
- style="fill:#ffd43b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-miterlimit:4;stroke-dasharray:none"
- d="m -32.5,1036.8622 c -3,0 -3,1 -3,2.0128 l 0,0.9872 3.5,0 -4,0.013 c -0.25,0 -2.5,10e-4 -2.5,3 0,2.9988 2.25,3 2.5,3 l 0.5,0 0,1 c 0,0.9872 0,1.9872 3,1.9872 3,0 3,-1.0128 3,-2 l 0,-1 -2.5,0 3,0 c 0.25,0 2.5,-10e-4 2.5,-3 0,-2.9988 -2.25,-3 -2.5,-3 l -0.5,0 0,-1 c 0,-1.0128 0,-2 -3,-2 l 0,-2e-4 z"
- id="path59216"
- sodipodi:nodetypes="cccccscccsccccscccz" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m -29.5,1039.8622 0,1 c 0,1.1046 -0.89543,2 -2,2 l -2,0 c -1.10457,0 -2,0.8954 -2,2 l 0,1"
- id="path59218"
- sodipodi:nodetypes="cccccc" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cszs"
- id="path59220"
- d="m -30.5,1041.3622 0,-2.5 c 0,-0.5128 0.25,-1 -2,-1 -2.15993,0 -1.99997,0.4872 -2,1"
- style="fill:none;stroke:url(#linearGradient106812);stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none" />
- <path
- inkscape:connector-curvature="0"
- style="fill:none;stroke:url(#linearGradient106814);stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none"
- d="m -32.5,1040.8494 -3.49995,0.013 c -1.00005,0 -1.50005,0.7372 -1.5,2 5e-5,1.285 0.49995,2 1.5,2"
- id="path59222"
- sodipodi:nodetypes="cszs" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc"
- d="m -34.5,1044.8494 c 0,-0.5 0.5,-1 1,-1 l 2,0.013 c 1.64438,0 3,-1.3428 3,-2.9872 m -6,3.9744 0,3.5"
- style="fill:none;stroke:url(#linearGradient106816);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path59224" />
- <path
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- id="path59226"
- style="fill:none;stroke:url(#linearGradient106818);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m -31.5,1046.8494 1,0.013" />
- </g>
- </g>
- </g>
- <g
- style="display:inline;enable-background:new"
- transform="translate(172,-563.36218)"
- id="g3978-5">
- <rect
- style="opacity:0;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible"
- id="rect3980-2"
- width="16"
- height="15.999996"
- x="211"
- y="594.36218"
- rx="0" />
- <path
- style="fill:#5590bf;fill-opacity:1;stroke:none"
- d="m 219,594.875 c -3.5,10e-6 -3.5,1.5 -3.5,2 l 0,2 -0.5,0 c -0.25,0 -2.5,10e-4 -2.5,3 0,2.99883 2.25,2.99999 2.5,3 l 0.5,0 0,-1 c 0,-1.10457 0.89543,-2 2,-2 l 3,0 c 1.10457,0 2,-0.89543 2,-2 l 0,-3 c 0,-0.5 0,-2.00001 -3.5,-2 z"
- id="path3982-7"
- inkscape:connector-curvature="0" />
- <rect
- style="opacity:0.01000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect3984-6"
- width="0.99999928"
- height="1.0468764"
- x="217"
- y="596.31531" />
- <rect
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="rect3986-1"
- width="0.99999928"
- height="1.0000014"
- x="217"
- y="596.36218" />
- <path
- id="path3988-4"
- d="m 219,608.86218 c 3.5,-10e-6 3.5,-1.5 3.5,-2 l 0,-2 0.5,0 c 0.25,0 2.5,-10e-4 2.5,-3 0,-2.99883 -2.25,-2.99999 -2.5,-3 l -0.5,0 0,1 c 0,1.10457 -0.89543,2 -2,2 l -3,0 c -1.10457,0 -2,0.89543 -2,2 l 0,3 c 0,0.5 0,2.00001 3.5,2 z"
- style="fill:#ffd43b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- inkscape:connector-curvature="0" />
- <rect
- y="606.36218"
- x="220"
- height="1.0000014"
- width="0.99999928"
- id="rect3990-2"
- style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-miterlimit:4;stroke-dasharray:none"
- d="m 219,594.875 c -3.5,10e-6 -3.5,0.98718 -3.5,2 l 0,1.98718 3.5,0 -4,0.0128 c -0.25,0 -2.5,10e-4 -2.5,3 0,2.99883 2.25,2.99999 2.5,3 l 0.5,0 0,2 c 0,0.9872 0,2.00001 3.5,2 3.5,-1e-5 3.5,-1.0128 3.5,-2 l 0,-2.0128 -3.5,0 4,0.0128 c 0.25,0 2.5,-0.001 2.5,-3 0,-2.99883 -2.25,-2.99999 -2.5,-3 l -0.5,0 0,-2 c 0,-1.0128 0,-2.00001 -3.5,-2 l 0,2e-5 0,0 z"
- id="path3992-3"
- sodipodi:nodetypes="cccccscccsccccsccccc"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 222.5,598.86218 0,1 c 0,1.10457 -0.89543,2 -2,2 l -3,0 c -1.10457,0 -2,0.89543 -2,2 l 0,1"
- id="path3994-2"
- sodipodi:nodetypes="cccccc"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cszsc"
- id="path3996-2"
- d="m 221.5,600.86218 -5e-5,-3.98718 c -1e-5,-0.51282 0.23494,-0.98725 -2.49995,-1 -2.75,-0.0128 -2.49992,0.48718 -2.49995,1 l -5e-5,0.98718"
- style="fill:none;stroke:url(#linearGradient106820);stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none"
- inkscape:connector-curvature="0" />
- <path
- style="fill:none;stroke:url(#linearGradient106822);stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none"
- d="m 218.5,599.86218 -3.49995,0.0128 c -1.00005,0.004 -1.50005,0.73718 -1.5,2 5e-5,1.285 0.49995,2 1.5,2"
- id="path3998-16"
- sodipodi:nodetypes="cszs"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cccccc"
- d="m 216.5,603.86218 c 0,-0.5 0.5,-1 1,-1 l 3,0 c 1.64438,0 3,-1.3428 3,-2.98718 m -7,3.98718 0,3.5"
- style="fill:none;stroke:url(#linearGradient106824);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- id="path4000-8"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:nodetypes="cc"
- id="path4002-5"
- style="fill:none;stroke:url(#linearGradient106826);stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
- d="m 219.5,605.86218 2.00005,0.0128"
- inkscape:connector-curvature="0" />
+ <g inkscape:groupmode="layer" id="layer2" inkscape:label="TRACKING">
+ <g id="g16331" style="fill:#ffcc00">
+ <text id="text16071" y="25" x="280.8446" style="font-style:normal;font-weight:normal;font-size:19.20428658px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999994" xml:space="preserve"><tspan style="stroke-width:0.99999994;fill:#ffcc00" y="25" x="280.8446" id="tspan16069" sodipodi:role="line">1</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" x="133.86958" y="67" id="text16075"><tspan sodipodi:role="line" id="tspan16073" x="133.86958" y="67" style="fill:#ffcc00;stroke-width:0.99999988">2</tspan></text>
+ <text id="text16079" y="67" x="154.86958" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" xml:space="preserve"><tspan style="fill:#ffcc00;stroke-width:0.99999988" y="67" x="154.86958" id="tspan16077" sodipodi:role="line">3</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" x="133.86958" y="88" id="text16087"><tspan sodipodi:role="line" id="tspan16085" x="133.86958" y="88" style="fill:#ffcc00;stroke-width:0.99999988">4</tspan></text>
+ <text inkscape:transform-center-y="3.1243423" inkscape:transform-center-x="3.1988381" id="text16091" y="88" x="175.86958" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" xml:space="preserve"><tspan style="fill:#ffcc00;stroke-width:0.99999988" y="88" x="175.86958" id="tspan16089" sodipodi:role="line">5</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" x="196.86958" y="88" id="text16095" inkscape:transform-center-x="3.1988381" inkscape:transform-center-y="3.1243423"><tspan sodipodi:role="line" id="tspan16093" x="196.86958" y="88" style="fill:#ffcc00;stroke-width:0.99999988">6</tspan></text>
+ <text inkscape:transform-center-y="3.1243423" inkscape:transform-center-x="3.1988381" id="text16099" y="88" x="301.86957" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" xml:space="preserve"><tspan style="fill:#ffcc00;stroke-width:0.99999988" y="88" x="301.86957" id="tspan16097" sodipodi:role="line">7</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" x="237.86957" y="151" id="text16103" inkscape:transform-center-x="3.1988381" inkscape:transform-center-y="3.1243423"><tspan sodipodi:role="line" id="tspan16101" x="237.86957" y="151" style="fill:#ffcc00;stroke-width:0.99999988">8</tspan></text>
+ <text inkscape:transform-center-y="3.1243423" inkscape:transform-center-x="3.1988381" id="text16107" y="172" x="7.8695679" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" xml:space="preserve"><tspan style="fill:#ffcc00;stroke-width:0.99999988" y="172" x="7.8695679" id="tspan16105" sodipodi:role="line">9</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" x="27.869568" y="172" id="text16111" inkscape:transform-center-x="3.1988381" inkscape:transform-center-y="3.1243423"><tspan sodipodi:role="line" id="tspan16109" x="27.869568" y="172" style="fill:#ffcc00;stroke-width:0.99999988">A</tspan></text>
+ <text inkscape:transform-center-y="3.1243423" inkscape:transform-center-x="3.1988381" id="text16115" y="172" x="49.869568" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" xml:space="preserve"><tspan style="fill:#ffcc00;stroke-width:0.99999988" y="172" x="49.869568" id="tspan16113" sodipodi:role="line">B</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" x="69.869568" y="172" id="text16119" inkscape:transform-center-x="3.1988381" inkscape:transform-center-y="3.1243423"><tspan sodipodi:role="line" id="tspan16117" x="69.869568" y="172" style="fill:#ffcc00;stroke-width:0.99999988">C</tspan></text>
+ <text inkscape:transform-center-y="3.1243423" inkscape:transform-center-x="3.1988381" id="text16123" y="340" x="5.8695679" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" xml:space="preserve"><tspan style="fill:#ffcc00;stroke-width:0.99999988" y="340" x="5.8695679" id="tspan16121" sodipodi:role="line">D</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" x="26.869568" y="340" id="text16127" inkscape:transform-center-x="3.1988381" inkscape:transform-center-y="3.1243423"><tspan sodipodi:role="line" id="tspan16125" x="26.869568" y="340" style="fill:#ffcc00;stroke-width:0.99999988">E</tspan></text>
+ <text inkscape:transform-center-y="3.1243423" inkscape:transform-center-x="3.1988381" id="text16131" y="340" x="49.869568" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" xml:space="preserve"><tspan style="fill:#ffcc00;stroke-width:0.99999988" y="340" x="49.869568" id="tspan16129" sodipodi:role="line">F</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" x="404.86957" y="403" id="text16135" inkscape:transform-center-x="3.1988381" inkscape:transform-center-y="3.1243423"><tspan sodipodi:role="line" id="tspan16133" x="404.86957" y="403" style="fill:#ffcc00;stroke-width:0.99999988">G</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" x="361.86957" y="507" id="text16151" inkscape:transform-center-x="3.1988381" inkscape:transform-center-y="3.1243423"><tspan sodipodi:role="line" id="tspan16149" x="361.86957" y="507" style="fill:#ffcc00;stroke-width:0.99999988">M</tspan></text>
+ <text inkscape:transform-center-x="3.1988381" inkscape:transform-center-y="3.1243423" id="text16155" y="529" x="194.86957" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" xml:space="preserve"><tspan style="fill:#ffcc00;stroke-width:0.99999988" y="529" x="194.86957" id="tspan16153" sodipodi:role="line">N</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" x="215.86957" y="529" id="text16159" inkscape:transform-center-y="3.1243423" inkscape:transform-center-x="3.1988381"><tspan sodipodi:role="line" id="tspan16157" x="215.86957" y="529" style="fill:#ffcc00;stroke-width:0.99999988">O</tspan></text>
+ <text inkscape:transform-center-x="3.1988381" inkscape:transform-center-y="3.1243423" id="text16167" y="550" x="194.86957" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" xml:space="preserve"><tspan style="fill:#ffcc00;stroke-width:0.99999988" y="550" x="194.86957" id="tspan16165" sodipodi:role="line">P</tspan></text>
+ <text transform="scale(1.0088573,0.99122046)" xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:16.21410179px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" x="339.99878" y="553.21686" id="text16171" inkscape:transform-center-y="2.6620037" inkscape:transform-center-x="2.773985"><tspan sodipodi:role="line" id="tspan16169" x="339.99878" y="553.21686" style="fill:#ffcc00;stroke-width:0.99999988">Q</tspan><tspan id="tspan16173" sodipodi:role="line" x="339.99878" y="553.21686" style="fill:#ffcc00;stroke-width:0.99999988"/></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" x="384.86957" y="550" id="text16177" inkscape:transform-center-y="3.1243423" inkscape:transform-center-x="3.1988381"><tspan sodipodi:role="line" id="tspan16175" x="384.86957" y="550" style="fill:#ffcc00;stroke-width:0.99999988">R</tspan></text>
+ <text inkscape:transform-center-x="3.1988381" inkscape:transform-center-y="3.1243423" id="text16181" y="571" x="132.86957" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" xml:space="preserve"><tspan style="fill:#ffcc00;stroke-width:0.99999988" y="571" x="132.86957" id="tspan16179" sodipodi:role="line">S</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" x="154.86957" y="571" id="text16185" inkscape:transform-center-y="3.1243423" inkscape:transform-center-x="3.1988381"><tspan sodipodi:role="line" id="tspan16183" x="154.86957" y="571" style="fill:#ffcc00;stroke-width:0.99999988">T</tspan></text>
+ <text inkscape:transform-center-x="3.1988381" inkscape:transform-center-y="3.1243423" id="text16189" y="571" x="174.86957" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" xml:space="preserve"><tspan style="fill:#ffcc00;stroke-width:0.99999988" y="571" x="174.86957" id="tspan16187" sodipodi:role="line">U</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" x="279.86957" y="571" id="text16193" inkscape:transform-center-y="3.1243423" inkscape:transform-center-x="3.1988381"><tspan sodipodi:role="line" id="tspan16191" x="279.86957" y="571" style="fill:#ffcc00;stroke-width:0.99999988">V</tspan></text>
+ <text transform="scale(0.89679029,1.1150879)" inkscape:transform-center-x="2.5726168" inkscape:transform-center-y="3.1243143" id="text16197" y="549.73242" x="239.73518" style="font-style:normal;font-weight:normal;font-size:16.91629601px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" xml:space="preserve"><tspan style="fill:#ffcc00;stroke-width:0.99999988" y="549.73242" x="239.73518" id="tspan16195" sodipodi:role="line">W</tspan></text>
+ <text inkscape:transform-center-x="3.1988381" inkscape:transform-center-y="3.1243423" id="text16215" y="613" x="447.86957" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" xml:space="preserve"><tspan style="fill:#ffcc00;stroke-width:0.99999988" y="613" x="447.86957" id="tspan16213" sodipodi:role="line">X</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" x="467.86957" y="613" id="text16219" inkscape:transform-center-y="3.1243423" inkscape:transform-center-x="3.1988381"><tspan sodipodi:role="line" id="tspan16217" x="467.86957" y="613" style="fill:#ffcc00;stroke-width:0.99999988">Y</tspan></text>
+ <text inkscape:transform-center-x="3.1988381" inkscape:transform-center-y="3.1243423" id="text16223" y="613" x="489.86957" style="font-style:normal;font-weight:normal;font-size:18.86315727px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" xml:space="preserve"><tspan style="fill:#ffcc00;stroke-width:0.99999988" y="613" x="489.86957" id="tspan16221" sodipodi:role="line">Z</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.67848969px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999994" x="507.88174" y="612.0321" id="text16227" inkscape:transform-center-y="3.0937591" inkscape:transform-center-x="3.1675179"><tspan sodipodi:role="line" id="tspan16225" x="507.88174" y="612.0321" style="fill:#ffcc00;stroke-width:0.99999994">@</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.67848969px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999994" x="446.88174" y="634.0321" id="text16235" inkscape:transform-center-y="3.0937591" inkscape:transform-center-x="3.1675179"><tspan sodipodi:role="line" id="tspan16233" x="446.88174" y="634.0321" style="fill:#ffcc00;stroke-width:0.99999994">&amp;</tspan></text>
+ <text inkscape:transform-center-x="2.8268697" inkscape:transform-center-y="2.7610486" id="text16239" y="633.06055" x="467.99258" style="font-style:normal;font-weight:normal;font-size:16.66976738px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999988" xml:space="preserve"><tspan style="fill:#ffcc00;stroke-width:0.99999988" y="633.06055" x="467.99258" id="tspan16237" sodipodi:role="line">%</tspan></text>
+ <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:18.86315918px;line-height:0;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:0.99999994" x="491.83517" y="634.06061" id="text16243" inkscape:transform-center-y="3.124405" inkscape:transform-center-x="3.1987998"><tspan sodipodi:role="line" id="tspan16241" x="491.83517" y="634.06061" style="fill:#ffcc00;stroke-width:0.99999994">?</tspan></text>
</g>
</g>
</svg>
diff --git a/release/datafiles/blender_icons16/icon16_30.dat b/release/datafiles/blender_icons16/icon16_30.dat
new file mode 100644
index 00000000000..031fe465b23
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_30.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_action.dat b/release/datafiles/blender_icons16/icon16_action.dat
index e80b6212f98..8c10ba900ae 100644
--- a/release/datafiles/blender_icons16/icon16_action.dat
+++ b/release/datafiles/blender_icons16/icon16_action.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_action_tweak.dat b/release/datafiles/blender_icons16/icon16_action_tweak.dat
index d2d1ec853d1..124275c1e8e 100644
--- a/release/datafiles/blender_icons16/icon16_action_tweak.dat
+++ b/release/datafiles/blender_icons16/icon16_action_tweak.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_add.dat b/release/datafiles/blender_icons16/icon16_add.dat
new file mode 100644
index 00000000000..5d2574f54f1
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_add.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_alembic.dat b/release/datafiles/blender_icons16/icon16_alembic.dat
new file mode 100644
index 00000000000..d0695d8d111
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_alembic.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_aliased.dat b/release/datafiles/blender_icons16/icon16_aliased.dat
index b248aefb1ea..472a3027094 100644
--- a/release/datafiles/blender_icons16/icon16_aliased.dat
+++ b/release/datafiles/blender_icons16/icon16_aliased.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_align.dat b/release/datafiles/blender_icons16/icon16_align.dat
deleted file mode 100644
index 0e1a7f0d2c5..00000000000
--- a/release/datafiles/blender_icons16/icon16_align.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_align_bottom.dat b/release/datafiles/blender_icons16/icon16_align_bottom.dat
new file mode 100644
index 00000000000..bf449606bbc
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_align_bottom.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_align_center.dat b/release/datafiles/blender_icons16/icon16_align_center.dat
new file mode 100644
index 00000000000..656c856949b
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_align_center.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_align_flush.dat b/release/datafiles/blender_icons16/icon16_align_flush.dat
new file mode 100644
index 00000000000..509b42208c1
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_align_flush.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_align_justify.dat b/release/datafiles/blender_icons16/icon16_align_justify.dat
new file mode 100644
index 00000000000..b3fee4e7a70
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_align_justify.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_align_left.dat b/release/datafiles/blender_icons16/icon16_align_left.dat
new file mode 100644
index 00000000000..ac029f3837f
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_align_left.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_align_middle.dat b/release/datafiles/blender_icons16/icon16_align_middle.dat
new file mode 100644
index 00000000000..589d34f4456
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_align_middle.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_align_right.dat b/release/datafiles/blender_icons16/icon16_align_right.dat
new file mode 100644
index 00000000000..35db62cb216
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_align_right.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_align_top.dat b/release/datafiles/blender_icons16/icon16_align_top.dat
new file mode 100644
index 00000000000..1223c32d382
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_align_top.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_anim.dat b/release/datafiles/blender_icons16/icon16_anim.dat
index 1986aaa81b7..95c91d0b3b7 100644
--- a/release/datafiles/blender_icons16/icon16_anim.dat
+++ b/release/datafiles/blender_icons16/icon16_anim.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_anim_data.dat b/release/datafiles/blender_icons16/icon16_anim_data.dat
index cb92da3b098..671824d95c4 100644
--- a/release/datafiles/blender_icons16/icon16_anim_data.dat
+++ b/release/datafiles/blender_icons16/icon16_anim_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_antialiased.dat b/release/datafiles/blender_icons16/icon16_antialiased.dat
index 0a7c7b29cc0..df67f2f0926 100644
--- a/release/datafiles/blender_icons16/icon16_antialiased.dat
+++ b/release/datafiles/blender_icons16/icon16_antialiased.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_append_blend.dat b/release/datafiles/blender_icons16/icon16_append_blend.dat
index 9a3595efc95..7e68afb71ce 100644
--- a/release/datafiles/blender_icons16/icon16_append_blend.dat
+++ b/release/datafiles/blender_icons16/icon16_append_blend.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_armature_data.dat b/release/datafiles/blender_icons16/icon16_armature_data.dat
index a8b096b1286..51817bc1d76 100644
--- a/release/datafiles/blender_icons16/icon16_armature_data.dat
+++ b/release/datafiles/blender_icons16/icon16_armature_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_arrow_leftright.dat b/release/datafiles/blender_icons16/icon16_arrow_leftright.dat
index a0d430bc83b..91a7706a349 100644
--- a/release/datafiles/blender_icons16/icon16_arrow_leftright.dat
+++ b/release/datafiles/blender_icons16/icon16_arrow_leftright.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_asset_manager.dat b/release/datafiles/blender_icons16/icon16_asset_manager.dat
index 2ce615c0ac1..55fe24cafda 100644
--- a/release/datafiles/blender_icons16/icon16_asset_manager.dat
+++ b/release/datafiles/blender_icons16/icon16_asset_manager.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_auto.dat b/release/datafiles/blender_icons16/icon16_auto.dat
index 6e2123efa8d..e49d1e6559c 100644
--- a/release/datafiles/blender_icons16/icon16_auto.dat
+++ b/release/datafiles/blender_icons16/icon16_auto.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_automerge_off.dat b/release/datafiles/blender_icons16/icon16_automerge_off.dat
index badebf1f21d..1e7cf46ff16 100644
--- a/release/datafiles/blender_icons16/icon16_automerge_off.dat
+++ b/release/datafiles/blender_icons16/icon16_automerge_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_automerge_on.dat b/release/datafiles/blender_icons16/icon16_automerge_on.dat
index b0abd4121a1..d6e267fa6e0 100644
--- a/release/datafiles/blender_icons16/icon16_automerge_on.dat
+++ b/release/datafiles/blender_icons16/icon16_automerge_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_axis_front.dat b/release/datafiles/blender_icons16/icon16_axis_front.dat
index 1bfe7329a29..14048d48b50 100644
--- a/release/datafiles/blender_icons16/icon16_axis_front.dat
+++ b/release/datafiles/blender_icons16/icon16_axis_front.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_axis_side.dat b/release/datafiles/blender_icons16/icon16_axis_side.dat
index ea29e63e7c7..83b2d037d17 100644
--- a/release/datafiles/blender_icons16/icon16_axis_side.dat
+++ b/release/datafiles/blender_icons16/icon16_axis_side.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_axis_top.dat b/release/datafiles/blender_icons16/icon16_axis_top.dat
index 9ca19e8698d..6cea9979e34 100644
--- a/release/datafiles/blender_icons16/icon16_axis_top.dat
+++ b/release/datafiles/blender_icons16/icon16_axis_top.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_back.dat b/release/datafiles/blender_icons16/icon16_back.dat
index 9c8a9d96850..773d6ceeddf 100644
--- a/release/datafiles/blender_icons16/icon16_back.dat
+++ b/release/datafiles/blender_icons16/icon16_back.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_bbox.dat b/release/datafiles/blender_icons16/icon16_bbox.dat
deleted file mode 100644
index a56eb47eee9..00000000000
--- a/release/datafiles/blender_icons16/icon16_bbox.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_blender.dat b/release/datafiles/blender_icons16/icon16_blender.dat
index 296315c5ee3..05d3d22b953 100644
--- a/release/datafiles/blender_icons16/icon16_blender.dat
+++ b/release/datafiles/blender_icons16/icon16_blender.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_boids.dat b/release/datafiles/blender_icons16/icon16_boids.dat
index 4dd88548634..652f877c9fc 100644
--- a/release/datafiles/blender_icons16/icon16_boids.dat
+++ b/release/datafiles/blender_icons16/icon16_boids.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_bold.dat b/release/datafiles/blender_icons16/icon16_bold.dat
new file mode 100644
index 00000000000..9ca32ea4894
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_bold.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_bone_data.dat b/release/datafiles/blender_icons16/icon16_bone_data.dat
index 22fb231bb51..2ec40838f9a 100644
--- a/release/datafiles/blender_icons16/icon16_bone_data.dat
+++ b/release/datafiles/blender_icons16/icon16_bone_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_bookmarks.dat b/release/datafiles/blender_icons16/icon16_bookmarks.dat
index 4178e5cbe47..bbd16f307d7 100644
--- a/release/datafiles/blender_icons16/icon16_bookmarks.dat
+++ b/release/datafiles/blender_icons16/icon16_bookmarks.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_border_lasso.dat b/release/datafiles/blender_icons16/icon16_border_lasso.dat
index d9f85920e42..f8e7d173090 100644
--- a/release/datafiles/blender_icons16/icon16_border_lasso.dat
+++ b/release/datafiles/blender_icons16/icon16_border_lasso.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_border_rect.dat b/release/datafiles/blender_icons16/icon16_border_rect.dat
index 58466b990a0..d20f4ce96ed 100644
--- a/release/datafiles/blender_icons16/icon16_border_rect.dat
+++ b/release/datafiles/blender_icons16/icon16_border_rect.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_bordermove.dat b/release/datafiles/blender_icons16/icon16_bordermove.dat
index e15f65ef923..49d7ec47d22 100644
--- a/release/datafiles/blender_icons16/icon16_bordermove.dat
+++ b/release/datafiles/blender_icons16/icon16_bordermove.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_brush_data.dat b/release/datafiles/blender_icons16/icon16_brush_data.dat
index a5ca7c353f5..bcf2c15a5ec 100644
--- a/release/datafiles/blender_icons16/icon16_brush_data.dat
+++ b/release/datafiles/blender_icons16/icon16_brush_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_buts.dat b/release/datafiles/blender_icons16/icon16_buts.dat
deleted file mode 100644
index 34aeab2483f..00000000000
--- a/release/datafiles/blender_icons16/icon16_buts.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_camera_data.dat b/release/datafiles/blender_icons16/icon16_camera_data.dat
index a86a5e1cd3d..b3ea8f4c2f3 100644
--- a/release/datafiles/blender_icons16/icon16_camera_data.dat
+++ b/release/datafiles/blender_icons16/icon16_camera_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_camera_stereo.dat b/release/datafiles/blender_icons16/icon16_camera_stereo.dat
index 77fe8c0b686..fe3a0b4a7d6 100644
--- a/release/datafiles/blender_icons16/icon16_camera_stereo.dat
+++ b/release/datafiles/blender_icons16/icon16_camera_stereo.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_cancel.dat b/release/datafiles/blender_icons16/icon16_cancel.dat
index 23225c816cc..5bdedc9afc5 100644
--- a/release/datafiles/blender_icons16/icon16_cancel.dat
+++ b/release/datafiles/blender_icons16/icon16_cancel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_center_only.dat b/release/datafiles/blender_icons16/icon16_center_only.dat
new file mode 100644
index 00000000000..227c2e4ac2b
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_center_only.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_checkbox_dehlt.dat b/release/datafiles/blender_icons16/icon16_checkbox_dehlt.dat
index 69a8bed5b1b..1a709261153 100644
--- a/release/datafiles/blender_icons16/icon16_checkbox_dehlt.dat
+++ b/release/datafiles/blender_icons16/icon16_checkbox_dehlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_checkbox_hlt.dat b/release/datafiles/blender_icons16/icon16_checkbox_hlt.dat
index baf7fe9eb52..460c0a0491f 100644
--- a/release/datafiles/blender_icons16/icon16_checkbox_hlt.dat
+++ b/release/datafiles/blender_icons16/icon16_checkbox_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_clip.dat b/release/datafiles/blender_icons16/icon16_clip.dat
index e8972489c62..75a39fc0bdf 100644
--- a/release/datafiles/blender_icons16/icon16_clip.dat
+++ b/release/datafiles/blender_icons16/icon16_clip.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_clipuv_dehlt.dat b/release/datafiles/blender_icons16/icon16_clipuv_dehlt.dat
index e7fa8d4d5c3..11eba16ef8c 100644
--- a/release/datafiles/blender_icons16/icon16_clipuv_dehlt.dat
+++ b/release/datafiles/blender_icons16/icon16_clipuv_dehlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_clipuv_hlt.dat b/release/datafiles/blender_icons16/icon16_clipuv_hlt.dat
index 08e7b46ed4f..8f6532da1e1 100644
--- a/release/datafiles/blender_icons16/icon16_clipuv_hlt.dat
+++ b/release/datafiles/blender_icons16/icon16_clipuv_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_collapsemenu.dat b/release/datafiles/blender_icons16/icon16_collapsemenu.dat
index 246afa11c6c..90233e0723a 100644
--- a/release/datafiles/blender_icons16/icon16_collapsemenu.dat
+++ b/release/datafiles/blender_icons16/icon16_collapsemenu.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_color.dat b/release/datafiles/blender_icons16/icon16_color.dat
index 2a884e45892..762a38edac8 100644
--- a/release/datafiles/blender_icons16/icon16_color.dat
+++ b/release/datafiles/blender_icons16/icon16_color.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_color_blue.dat b/release/datafiles/blender_icons16/icon16_color_blue.dat
index dceefee0af3..6e4b5e8f4ba 100644
--- a/release/datafiles/blender_icons16/icon16_color_blue.dat
+++ b/release/datafiles/blender_icons16/icon16_color_blue.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_color_green.dat b/release/datafiles/blender_icons16/icon16_color_green.dat
index 9804cf3f0fe..4ad48d820f8 100644
--- a/release/datafiles/blender_icons16/icon16_color_green.dat
+++ b/release/datafiles/blender_icons16/icon16_color_green.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_color_red.dat b/release/datafiles/blender_icons16/icon16_color_red.dat
index 1965c1e5866..e757ef30f72 100644
--- a/release/datafiles/blender_icons16/icon16_color_red.dat
+++ b/release/datafiles/blender_icons16/icon16_color_red.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_console.dat b/release/datafiles/blender_icons16/icon16_console.dat
index a74e19dc4fb..4de96a1be42 100644
--- a/release/datafiles/blender_icons16/icon16_console.dat
+++ b/release/datafiles/blender_icons16/icon16_console.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_constraint.dat b/release/datafiles/blender_icons16/icon16_constraint.dat
index e1aad2cb410..056d9d9c213 100644
--- a/release/datafiles/blender_icons16/icon16_constraint.dat
+++ b/release/datafiles/blender_icons16/icon16_constraint.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_constraint_bone.dat b/release/datafiles/blender_icons16/icon16_constraint_bone.dat
index ebc76d8e189..2b57d8772f3 100644
--- a/release/datafiles/blender_icons16/icon16_constraint_bone.dat
+++ b/release/datafiles/blender_icons16/icon16_constraint_bone.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_constraint_data.dat b/release/datafiles/blender_icons16/icon16_constraint_data.dat
index 5a013da59fe..ef7bf561cc5 100644
--- a/release/datafiles/blender_icons16/icon16_constraint_data.dat
+++ b/release/datafiles/blender_icons16/icon16_constraint_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_copy_id.dat b/release/datafiles/blender_icons16/icon16_copy_id.dat
index 8f9d10869a1..05b274ef8de 100644
--- a/release/datafiles/blender_icons16/icon16_copy_id.dat
+++ b/release/datafiles/blender_icons16/icon16_copy_id.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_copydown.dat b/release/datafiles/blender_icons16/icon16_copydown.dat
index 1d6a6e05427..b4f759f14c1 100644
--- a/release/datafiles/blender_icons16/icon16_copydown.dat
+++ b/release/datafiles/blender_icons16/icon16_copydown.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_cursor.dat b/release/datafiles/blender_icons16/icon16_cursor.dat
deleted file mode 100644
index 05ac18d7028..00000000000
--- a/release/datafiles/blender_icons16/icon16_cursor.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_curve_bezcircle.dat b/release/datafiles/blender_icons16/icon16_curve_bezcircle.dat
index 3d347d17576..c5ffcf0af90 100644
--- a/release/datafiles/blender_icons16/icon16_curve_bezcircle.dat
+++ b/release/datafiles/blender_icons16/icon16_curve_bezcircle.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_curve_bezcurve.dat b/release/datafiles/blender_icons16/icon16_curve_bezcurve.dat
index ba92a6d1c1b..dd3f75e2aee 100644
--- a/release/datafiles/blender_icons16/icon16_curve_bezcurve.dat
+++ b/release/datafiles/blender_icons16/icon16_curve_bezcurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_curve_data.dat b/release/datafiles/blender_icons16/icon16_curve_data.dat
index 7115ff1460d..626578edefd 100644
--- a/release/datafiles/blender_icons16/icon16_curve_data.dat
+++ b/release/datafiles/blender_icons16/icon16_curve_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_curve_ncircle.dat b/release/datafiles/blender_icons16/icon16_curve_ncircle.dat
index 3474f18a42b..e28d1f53b5f 100644
--- a/release/datafiles/blender_icons16/icon16_curve_ncircle.dat
+++ b/release/datafiles/blender_icons16/icon16_curve_ncircle.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_curve_ncurve.dat b/release/datafiles/blender_icons16/icon16_curve_ncurve.dat
index 30cb3cb10e3..eb132891a9a 100644
--- a/release/datafiles/blender_icons16/icon16_curve_ncurve.dat
+++ b/release/datafiles/blender_icons16/icon16_curve_ncurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_curve_path.dat b/release/datafiles/blender_icons16/icon16_curve_path.dat
index 3ccba1e008b..8f10abcc7f1 100644
--- a/release/datafiles/blender_icons16/icon16_curve_path.dat
+++ b/release/datafiles/blender_icons16/icon16_curve_path.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_decorate.dat b/release/datafiles/blender_icons16/icon16_decorate.dat
index 0847abef093..bd67c8603bc 100644
--- a/release/datafiles/blender_icons16/icon16_decorate.dat
+++ b/release/datafiles/blender_icons16/icon16_decorate.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_decorate_animate.dat b/release/datafiles/blender_icons16/icon16_decorate_animate.dat
index 386ff9bf849..3cb5537955d 100644
--- a/release/datafiles/blender_icons16/icon16_decorate_animate.dat
+++ b/release/datafiles/blender_icons16/icon16_decorate_animate.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_decorate_driver.dat b/release/datafiles/blender_icons16/icon16_decorate_driver.dat
index 483ea2bfa13..e17c5730ce1 100644
--- a/release/datafiles/blender_icons16/icon16_decorate_driver.dat
+++ b/release/datafiles/blender_icons16/icon16_decorate_driver.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_decorate_keyframe.dat b/release/datafiles/blender_icons16/icon16_decorate_keyframe.dat
index b765e6d9fac..d6ecff6e039 100644
--- a/release/datafiles/blender_icons16/icon16_decorate_keyframe.dat
+++ b/release/datafiles/blender_icons16/icon16_decorate_keyframe.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_decorate_library_override.dat b/release/datafiles/blender_icons16/icon16_decorate_library_override.dat
new file mode 100644
index 00000000000..950982c3240
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_decorate_library_override.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_decorate_linked.dat b/release/datafiles/blender_icons16/icon16_decorate_linked.dat
index 1980b63027f..a004fa162cc 100644
--- a/release/datafiles/blender_icons16/icon16_decorate_linked.dat
+++ b/release/datafiles/blender_icons16/icon16_decorate_linked.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_decorate_locked.dat b/release/datafiles/blender_icons16/icon16_decorate_locked.dat
index b8bb9b67786..e50302b7f73 100644
--- a/release/datafiles/blender_icons16/icon16_decorate_locked.dat
+++ b/release/datafiles/blender_icons16/icon16_decorate_locked.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_decorate_override.dat b/release/datafiles/blender_icons16/icon16_decorate_override.dat
index d8540da683d..0c13844b6fe 100644
--- a/release/datafiles/blender_icons16/icon16_decorate_override.dat
+++ b/release/datafiles/blender_icons16/icon16_decorate_override.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_decorate_unlocked.dat b/release/datafiles/blender_icons16/icon16_decorate_unlocked.dat
index c40ba1b9d20..df951937859 100644
--- a/release/datafiles/blender_icons16/icon16_decorate_unlocked.dat
+++ b/release/datafiles/blender_icons16/icon16_decorate_unlocked.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_disclosure_tri_down.dat b/release/datafiles/blender_icons16/icon16_disclosure_tri_down.dat
index 9933c973832..6cbd17b8906 100644
--- a/release/datafiles/blender_icons16/icon16_disclosure_tri_down.dat
+++ b/release/datafiles/blender_icons16/icon16_disclosure_tri_down.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_disclosure_tri_right.dat b/release/datafiles/blender_icons16/icon16_disclosure_tri_right.dat
index b8c88ae76f4..143b72246f4 100644
--- a/release/datafiles/blender_icons16/icon16_disclosure_tri_right.dat
+++ b/release/datafiles/blender_icons16/icon16_disclosure_tri_right.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_disk_drive.dat b/release/datafiles/blender_icons16/icon16_disk_drive.dat
index daad682b70f..496406b82e1 100644
--- a/release/datafiles/blender_icons16/icon16_disk_drive.dat
+++ b/release/datafiles/blender_icons16/icon16_disk_drive.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_dot.dat b/release/datafiles/blender_icons16/icon16_dot.dat
index 1e21ebdd0fa..41140015abb 100644
--- a/release/datafiles/blender_icons16/icon16_dot.dat
+++ b/release/datafiles/blender_icons16/icon16_dot.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_dotsdown.dat b/release/datafiles/blender_icons16/icon16_dotsdown.dat
index f4080729497..e696794d69f 100644
--- a/release/datafiles/blender_icons16/icon16_dotsdown.dat
+++ b/release/datafiles/blender_icons16/icon16_dotsdown.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_dotsup.dat b/release/datafiles/blender_icons16/icon16_dotsup.dat
index 5aea390c403..d0bd1e0ab31 100644
--- a/release/datafiles/blender_icons16/icon16_dotsup.dat
+++ b/release/datafiles/blender_icons16/icon16_dotsup.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_downarrow_hlt.dat b/release/datafiles/blender_icons16/icon16_downarrow_hlt.dat
index 92a9025f2d2..69b785ea6f9 100644
--- a/release/datafiles/blender_icons16/icon16_downarrow_hlt.dat
+++ b/release/datafiles/blender_icons16/icon16_downarrow_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_driver.dat b/release/datafiles/blender_icons16/icon16_driver.dat
index 8398dc03625..fbdf712cf39 100644
--- a/release/datafiles/blender_icons16/icon16_driver.dat
+++ b/release/datafiles/blender_icons16/icon16_driver.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_driver_distance.dat b/release/datafiles/blender_icons16/icon16_driver_distance.dat
new file mode 100644
index 00000000000..fa5369530b4
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_driver_distance.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_driver_rotational_difference.dat b/release/datafiles/blender_icons16/icon16_driver_rotational_difference.dat
new file mode 100644
index 00000000000..a45f392b574
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_driver_rotational_difference.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_driver_transform.dat b/release/datafiles/blender_icons16/icon16_driver_transform.dat
new file mode 100644
index 00000000000..f7a4a0a3415
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_driver_transform.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_duplicate.dat b/release/datafiles/blender_icons16/icon16_duplicate.dat
new file mode 100644
index 00000000000..5d2a2459882
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_duplicate.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_edgesel.dat b/release/datafiles/blender_icons16/icon16_edgesel.dat
index 77676770dff..76179b8028d 100644
--- a/release/datafiles/blender_icons16/icon16_edgesel.dat
+++ b/release/datafiles/blender_icons16/icon16_edgesel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_edit.dat b/release/datafiles/blender_icons16/icon16_edit.dat
index 652d1c6f81a..8a6a122dc16 100644
--- a/release/datafiles/blender_icons16/icon16_edit.dat
+++ b/release/datafiles/blender_icons16/icon16_edit.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_editmode_hlt.dat b/release/datafiles/blender_icons16/icon16_editmode_hlt.dat
index abef90a391c..86647996a75 100644
--- a/release/datafiles/blender_icons16/icon16_editmode_hlt.dat
+++ b/release/datafiles/blender_icons16/icon16_editmode_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_empty_data.dat b/release/datafiles/blender_icons16/icon16_empty_data.dat
index 1b60f077543..84b3fec9218 100644
--- a/release/datafiles/blender_icons16/icon16_empty_data.dat
+++ b/release/datafiles/blender_icons16/icon16_empty_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_error.dat b/release/datafiles/blender_icons16/icon16_error.dat
index f3141c44130..073bd766e7f 100644
--- a/release/datafiles/blender_icons16/icon16_error.dat
+++ b/release/datafiles/blender_icons16/icon16_error.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_export.dat b/release/datafiles/blender_icons16/icon16_export.dat
index 8c570662585..2e2dc53a05a 100644
--- a/release/datafiles/blender_icons16/icon16_export.dat
+++ b/release/datafiles/blender_icons16/icon16_export.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_external_data.dat b/release/datafiles/blender_icons16/icon16_external_data.dat
index 563feb048f7..80be593729d 100644
--- a/release/datafiles/blender_icons16/icon16_external_data.dat
+++ b/release/datafiles/blender_icons16/icon16_external_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_eyedropper.dat b/release/datafiles/blender_icons16/icon16_eyedropper.dat
index a621396be59..33f4b43902d 100644
--- a/release/datafiles/blender_icons16/icon16_eyedropper.dat
+++ b/release/datafiles/blender_icons16/icon16_eyedropper.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_face_maps.dat b/release/datafiles/blender_icons16/icon16_face_maps.dat
new file mode 100644
index 00000000000..26279fb0ce3
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_face_maps.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_facesel.dat b/release/datafiles/blender_icons16/icon16_facesel.dat
index 368767ec069..c39989316f4 100644
--- a/release/datafiles/blender_icons16/icon16_facesel.dat
+++ b/release/datafiles/blender_icons16/icon16_facesel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_facesel_hlt.dat b/release/datafiles/blender_icons16/icon16_facesel_hlt.dat
index 38fac0a6966..1fcffbe02f5 100644
--- a/release/datafiles/blender_icons16/icon16_facesel_hlt.dat
+++ b/release/datafiles/blender_icons16/icon16_facesel_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_fake_user.dat b/release/datafiles/blender_icons16/icon16_fake_user.dat
new file mode 100644
index 00000000000..c5c1710c456
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_fake_user.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_fake_user_off.dat b/release/datafiles/blender_icons16/icon16_fake_user_off.dat
new file mode 100644
index 00000000000..e427ca03c12
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_fake_user_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_fake_user_on.dat b/release/datafiles/blender_icons16/icon16_fake_user_on.dat
new file mode 100644
index 00000000000..114aea89c37
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_fake_user_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_fcurve.dat b/release/datafiles/blender_icons16/icon16_fcurve.dat
index 63e7d4750c4..e7fe9597802 100644
--- a/release/datafiles/blender_icons16/icon16_fcurve.dat
+++ b/release/datafiles/blender_icons16/icon16_fcurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ff.dat b/release/datafiles/blender_icons16/icon16_ff.dat
index 0832ef3a7b0..82f24176061 100644
--- a/release/datafiles/blender_icons16/icon16_ff.dat
+++ b/release/datafiles/blender_icons16/icon16_ff.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file.dat b/release/datafiles/blender_icons16/icon16_file.dat
index 42601d1aefe..4a9ce631956 100644
--- a/release/datafiles/blender_icons16/icon16_file.dat
+++ b/release/datafiles/blender_icons16/icon16_file.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file_backup.dat b/release/datafiles/blender_icons16/icon16_file_backup.dat
index 59aa82e5b0d..8a45f227d6d 100644
--- a/release/datafiles/blender_icons16/icon16_file_backup.dat
+++ b/release/datafiles/blender_icons16/icon16_file_backup.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file_blank.dat b/release/datafiles/blender_icons16/icon16_file_blank.dat
index 9137a2eb3e1..63bc374ac42 100644
--- a/release/datafiles/blender_icons16/icon16_file_blank.dat
+++ b/release/datafiles/blender_icons16/icon16_file_blank.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file_blend.dat b/release/datafiles/blender_icons16/icon16_file_blend.dat
index 818fb12e5b4..2dbab9886cf 100644
--- a/release/datafiles/blender_icons16/icon16_file_blend.dat
+++ b/release/datafiles/blender_icons16/icon16_file_blend.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file_folder.dat b/release/datafiles/blender_icons16/icon16_file_folder.dat
index 9009fc8cfdc..d2833cbf3bf 100644
--- a/release/datafiles/blender_icons16/icon16_file_folder.dat
+++ b/release/datafiles/blender_icons16/icon16_file_folder.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file_font.dat b/release/datafiles/blender_icons16/icon16_file_font.dat
index a36f4b69669..dc705f228e3 100644
--- a/release/datafiles/blender_icons16/icon16_file_font.dat
+++ b/release/datafiles/blender_icons16/icon16_file_font.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file_hidden.dat b/release/datafiles/blender_icons16/icon16_file_hidden.dat
index 19b5eda9d6b..e7ee81300d5 100644
--- a/release/datafiles/blender_icons16/icon16_file_hidden.dat
+++ b/release/datafiles/blender_icons16/icon16_file_hidden.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file_image.dat b/release/datafiles/blender_icons16/icon16_file_image.dat
index 54fbee07d85..833b29ef4b2 100644
--- a/release/datafiles/blender_icons16/icon16_file_image.dat
+++ b/release/datafiles/blender_icons16/icon16_file_image.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file_movie.dat b/release/datafiles/blender_icons16/icon16_file_movie.dat
index d1440f12a60..402d586f4dd 100644
--- a/release/datafiles/blender_icons16/icon16_file_movie.dat
+++ b/release/datafiles/blender_icons16/icon16_file_movie.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file_new.dat b/release/datafiles/blender_icons16/icon16_file_new.dat
new file mode 100644
index 00000000000..5d62b5e1a2f
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_file_new.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file_parent.dat b/release/datafiles/blender_icons16/icon16_file_parent.dat
index ac9362950b2..664662df734 100644
--- a/release/datafiles/blender_icons16/icon16_file_parent.dat
+++ b/release/datafiles/blender_icons16/icon16_file_parent.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file_refresh.dat b/release/datafiles/blender_icons16/icon16_file_refresh.dat
index 0b46dcd1157..f6b351910af 100644
--- a/release/datafiles/blender_icons16/icon16_file_refresh.dat
+++ b/release/datafiles/blender_icons16/icon16_file_refresh.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file_script.dat b/release/datafiles/blender_icons16/icon16_file_script.dat
index 7b88b87279a..bcfb6e40eb2 100644
--- a/release/datafiles/blender_icons16/icon16_file_script.dat
+++ b/release/datafiles/blender_icons16/icon16_file_script.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file_sound.dat b/release/datafiles/blender_icons16/icon16_file_sound.dat
index 68dee02a3e5..34eb6578295 100644
--- a/release/datafiles/blender_icons16/icon16_file_sound.dat
+++ b/release/datafiles/blender_icons16/icon16_file_sound.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file_text.dat b/release/datafiles/blender_icons16/icon16_file_text.dat
index 49968ad773c..c5d85f80240 100644
--- a/release/datafiles/blender_icons16/icon16_file_text.dat
+++ b/release/datafiles/blender_icons16/icon16_file_text.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_file_tick.dat b/release/datafiles/blender_icons16/icon16_file_tick.dat
index 0a516616957..53da2617a0e 100644
--- a/release/datafiles/blender_icons16/icon16_file_tick.dat
+++ b/release/datafiles/blender_icons16/icon16_file_tick.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_filebrowser.dat b/release/datafiles/blender_icons16/icon16_filebrowser.dat
new file mode 100644
index 00000000000..9975b542c0d
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_filebrowser.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_filesel.dat b/release/datafiles/blender_icons16/icon16_filesel.dat
deleted file mode 100644
index b59cb6b23cd..00000000000
--- a/release/datafiles/blender_icons16/icon16_filesel.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_filter.dat b/release/datafiles/blender_icons16/icon16_filter.dat
index 900fd389f89..67c2a05d2e1 100644
--- a/release/datafiles/blender_icons16/icon16_filter.dat
+++ b/release/datafiles/blender_icons16/icon16_filter.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_font_data.dat b/release/datafiles/blender_icons16/icon16_font_data.dat
index d5be076bc5b..c971f5a23b7 100644
--- a/release/datafiles/blender_icons16/icon16_font_data.dat
+++ b/release/datafiles/blender_icons16/icon16_font_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_fontpreview.dat b/release/datafiles/blender_icons16/icon16_fontpreview.dat
index 2e253fb4553..9f17bfd30b4 100644
--- a/release/datafiles/blender_icons16/icon16_fontpreview.dat
+++ b/release/datafiles/blender_icons16/icon16_fontpreview.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_force_boid.dat b/release/datafiles/blender_icons16/icon16_force_boid.dat
index b4d161e1091..67f682a7538 100644
--- a/release/datafiles/blender_icons16/icon16_force_boid.dat
+++ b/release/datafiles/blender_icons16/icon16_force_boid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_force_charge.dat b/release/datafiles/blender_icons16/icon16_force_charge.dat
index 87bc4bf8bbd..35f7fab81aa 100644
--- a/release/datafiles/blender_icons16/icon16_force_charge.dat
+++ b/release/datafiles/blender_icons16/icon16_force_charge.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_force_curve.dat b/release/datafiles/blender_icons16/icon16_force_curve.dat
index bc71132338e..c41b32fd2f1 100644
--- a/release/datafiles/blender_icons16/icon16_force_curve.dat
+++ b/release/datafiles/blender_icons16/icon16_force_curve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_force_drag.dat b/release/datafiles/blender_icons16/icon16_force_drag.dat
index 6be427a5d7f..990421fec6d 100644
--- a/release/datafiles/blender_icons16/icon16_force_drag.dat
+++ b/release/datafiles/blender_icons16/icon16_force_drag.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_force_force.dat b/release/datafiles/blender_icons16/icon16_force_force.dat
index c697f005696..c701bebccee 100644
--- a/release/datafiles/blender_icons16/icon16_force_force.dat
+++ b/release/datafiles/blender_icons16/icon16_force_force.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_force_harmonic.dat b/release/datafiles/blender_icons16/icon16_force_harmonic.dat
index d59262a6c6a..5a7b06b9635 100644
--- a/release/datafiles/blender_icons16/icon16_force_harmonic.dat
+++ b/release/datafiles/blender_icons16/icon16_force_harmonic.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_force_lennardjones.dat b/release/datafiles/blender_icons16/icon16_force_lennardjones.dat
index 5184c369589..7d4dbfb79c7 100644
--- a/release/datafiles/blender_icons16/icon16_force_lennardjones.dat
+++ b/release/datafiles/blender_icons16/icon16_force_lennardjones.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_force_magnetic.dat b/release/datafiles/blender_icons16/icon16_force_magnetic.dat
index 35570900b2b..a45699b850e 100644
--- a/release/datafiles/blender_icons16/icon16_force_magnetic.dat
+++ b/release/datafiles/blender_icons16/icon16_force_magnetic.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_force_smokeflow.dat b/release/datafiles/blender_icons16/icon16_force_smokeflow.dat
index 421d7121431..9e64d2aaa18 100644
--- a/release/datafiles/blender_icons16/icon16_force_smokeflow.dat
+++ b/release/datafiles/blender_icons16/icon16_force_smokeflow.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_force_texture.dat b/release/datafiles/blender_icons16/icon16_force_texture.dat
index 8903e750c98..c5d15b87542 100644
--- a/release/datafiles/blender_icons16/icon16_force_texture.dat
+++ b/release/datafiles/blender_icons16/icon16_force_texture.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_force_turbulence.dat b/release/datafiles/blender_icons16/icon16_force_turbulence.dat
index a9c7a99266a..965ac452eee 100644
--- a/release/datafiles/blender_icons16/icon16_force_turbulence.dat
+++ b/release/datafiles/blender_icons16/icon16_force_turbulence.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_force_vortex.dat b/release/datafiles/blender_icons16/icon16_force_vortex.dat
index 21ec1b13204..4d8975c2ad7 100644
--- a/release/datafiles/blender_icons16/icon16_force_vortex.dat
+++ b/release/datafiles/blender_icons16/icon16_force_vortex.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_force_wind.dat b/release/datafiles/blender_icons16/icon16_force_wind.dat
index 2f78f2a0b85..1d275755faf 100644
--- a/release/datafiles/blender_icons16/icon16_force_wind.dat
+++ b/release/datafiles/blender_icons16/icon16_force_wind.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_forward.dat b/release/datafiles/blender_icons16/icon16_forward.dat
index a41ac986e82..7faba1397ee 100644
--- a/release/datafiles/blender_icons16/icon16_forward.dat
+++ b/release/datafiles/blender_icons16/icon16_forward.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_frame_next.dat b/release/datafiles/blender_icons16/icon16_frame_next.dat
index 13828a84be7..a66738c966f 100644
--- a/release/datafiles/blender_icons16/icon16_frame_next.dat
+++ b/release/datafiles/blender_icons16/icon16_frame_next.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_frame_prev.dat b/release/datafiles/blender_icons16/icon16_frame_prev.dat
index 0b992d79d72..03839303fd5 100644
--- a/release/datafiles/blender_icons16/icon16_frame_prev.dat
+++ b/release/datafiles/blender_icons16/icon16_frame_prev.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_freeze.dat b/release/datafiles/blender_icons16/icon16_freeze.dat
index 5bb3d3ad639..d8f6231a336 100644
--- a/release/datafiles/blender_icons16/icon16_freeze.dat
+++ b/release/datafiles/blender_icons16/icon16_freeze.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_fullscreen.dat b/release/datafiles/blender_icons16/icon16_fullscreen.dat
index 6c1a3eccd6a..8b641e41ee4 100644
--- a/release/datafiles/blender_icons16/icon16_fullscreen.dat
+++ b/release/datafiles/blender_icons16/icon16_fullscreen.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_fullscreen_enter.dat b/release/datafiles/blender_icons16/icon16_fullscreen_enter.dat
index b6df67d3ed2..dadf6ac56f8 100644
--- a/release/datafiles/blender_icons16/icon16_fullscreen_enter.dat
+++ b/release/datafiles/blender_icons16/icon16_fullscreen_enter.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_fullscreen_exit.dat b/release/datafiles/blender_icons16/icon16_fullscreen_exit.dat
index ec047550b37..e418b1202ac 100644
--- a/release/datafiles/blender_icons16/icon16_fullscreen_exit.dat
+++ b/release/datafiles/blender_icons16/icon16_fullscreen_exit.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_game.dat b/release/datafiles/blender_icons16/icon16_game.dat
index fe14db70466..d9823bb0e0d 100644
--- a/release/datafiles/blender_icons16/icon16_game.dat
+++ b/release/datafiles/blender_icons16/icon16_game.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_gear.dat b/release/datafiles/blender_icons16/icon16_gear.dat
new file mode 100644
index 00000000000..6052e4db88d
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_gear.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ghost.dat b/release/datafiles/blender_icons16/icon16_ghost.dat
index 69214b8a3a3..4f16d1c449c 100644
--- a/release/datafiles/blender_icons16/icon16_ghost.dat
+++ b/release/datafiles/blender_icons16/icon16_ghost.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ghost_disabled.dat b/release/datafiles/blender_icons16/icon16_ghost_disabled.dat
index ab43e560965..bd5bbaa3264 100644
--- a/release/datafiles/blender_icons16/icon16_ghost_disabled.dat
+++ b/release/datafiles/blender_icons16/icon16_ghost_disabled.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ghost_enabled.dat b/release/datafiles/blender_icons16/icon16_ghost_enabled.dat
index f4eaf666eef..6233cb2ca33 100644
--- a/release/datafiles/blender_icons16/icon16_ghost_enabled.dat
+++ b/release/datafiles/blender_icons16/icon16_ghost_enabled.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_go_left.dat b/release/datafiles/blender_icons16/icon16_go_left.dat
index dc3de9dffc8..90648c555dd 100644
--- a/release/datafiles/blender_icons16/icon16_go_left.dat
+++ b/release/datafiles/blender_icons16/icon16_go_left.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_gp_empty.dat b/release/datafiles/blender_icons16/icon16_gp_empty.dat
new file mode 100644
index 00000000000..86936eae084
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_gp_empty.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_gp_multiframe_editing.dat b/release/datafiles/blender_icons16/icon16_gp_multiframe_editing.dat
new file mode 100644
index 00000000000..7ee62f74c73
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_gp_multiframe_editing.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_gp_only_selected.dat b/release/datafiles/blender_icons16/icon16_gp_only_selected.dat
new file mode 100644
index 00000000000..44aba782e87
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_gp_only_selected.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_gp_select_points.dat b/release/datafiles/blender_icons16/icon16_gp_select_points.dat
new file mode 100644
index 00000000000..49adc2d0f9b
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_gp_select_points.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_gp_select_strokes.dat b/release/datafiles/blender_icons16/icon16_gp_select_strokes.dat
new file mode 100644
index 00000000000..8a9d8f9d53a
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_gp_select_strokes.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_gp_stroke.dat b/release/datafiles/blender_icons16/icon16_gp_stroke.dat
new file mode 100644
index 00000000000..ff0c820651a
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_gp_stroke.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_graph.dat b/release/datafiles/blender_icons16/icon16_graph.dat
new file mode 100644
index 00000000000..0f2abf2f4d7
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_graph.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_greasepencil.dat b/release/datafiles/blender_icons16/icon16_greasepencil.dat
index 20807e0d000..c568db88265 100644
--- a/release/datafiles/blender_icons16/icon16_greasepencil.dat
+++ b/release/datafiles/blender_icons16/icon16_greasepencil.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_greasepencil_stroke_paint.dat b/release/datafiles/blender_icons16/icon16_greasepencil_stroke_paint.dat
index d6c40a15edc..5d9b10eef1a 100644
--- a/release/datafiles/blender_icons16/icon16_greasepencil_stroke_paint.dat
+++ b/release/datafiles/blender_icons16/icon16_greasepencil_stroke_paint.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_grid.dat b/release/datafiles/blender_icons16/icon16_grid.dat
index ed1f3677c2b..cfacde2cdd6 100644
--- a/release/datafiles/blender_icons16/icon16_grid.dat
+++ b/release/datafiles/blender_icons16/icon16_grid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_grip.dat b/release/datafiles/blender_icons16/icon16_grip.dat
index b4f8e95b96b..27a8dc1b27c 100644
--- a/release/datafiles/blender_icons16/icon16_grip.dat
+++ b/release/datafiles/blender_icons16/icon16_grip.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_group.dat b/release/datafiles/blender_icons16/icon16_group.dat
index 377eda6dd59..c35c5c9aa07 100644
--- a/release/datafiles/blender_icons16/icon16_group.dat
+++ b/release/datafiles/blender_icons16/icon16_group.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_group_bone.dat b/release/datafiles/blender_icons16/icon16_group_bone.dat
index 055a6b0b0c6..6dfffd682f5 100644
--- a/release/datafiles/blender_icons16/icon16_group_bone.dat
+++ b/release/datafiles/blender_icons16/icon16_group_bone.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_group_uvs.dat b/release/datafiles/blender_icons16/icon16_group_uvs.dat
index 52d6332fdbf..2978a9c5111 100644
--- a/release/datafiles/blender_icons16/icon16_group_uvs.dat
+++ b/release/datafiles/blender_icons16/icon16_group_uvs.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_group_vcol.dat b/release/datafiles/blender_icons16/icon16_group_vcol.dat
index 9fa80f05fe5..cf38e3f1eee 100644
--- a/release/datafiles/blender_icons16/icon16_group_vcol.dat
+++ b/release/datafiles/blender_icons16/icon16_group_vcol.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_group_vertex.dat b/release/datafiles/blender_icons16/icon16_group_vertex.dat
index 5aeff9b223a..5146183035b 100644
--- a/release/datafiles/blender_icons16/icon16_group_vertex.dat
+++ b/release/datafiles/blender_icons16/icon16_group_vertex.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_hair.dat b/release/datafiles/blender_icons16/icon16_hair.dat
index 8a32ab050b8..74bda3f4110 100644
--- a/release/datafiles/blender_icons16/icon16_hair.dat
+++ b/release/datafiles/blender_icons16/icon16_hair.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_hand.dat b/release/datafiles/blender_icons16/icon16_hand.dat
index 2767f46c857..90343f4202e 100644
--- a/release/datafiles/blender_icons16/icon16_hand.dat
+++ b/release/datafiles/blender_icons16/icon16_hand.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_heart.dat b/release/datafiles/blender_icons16/icon16_heart.dat
new file mode 100644
index 00000000000..c5c1710c456
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_heart.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_help.dat b/release/datafiles/blender_icons16/icon16_help.dat
index e0354737045..37bef680f7e 100644
--- a/release/datafiles/blender_icons16/icon16_help.dat
+++ b/release/datafiles/blender_icons16/icon16_help.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_hide_off.dat b/release/datafiles/blender_icons16/icon16_hide_off.dat
index 4feb0d26696..1ebceb3288d 100644
--- a/release/datafiles/blender_icons16/icon16_hide_off.dat
+++ b/release/datafiles/blender_icons16/icon16_hide_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_hide_on.dat b/release/datafiles/blender_icons16/icon16_hide_on.dat
index 906edb431dd..8af5120e068 100644
--- a/release/datafiles/blender_icons16/icon16_hide_on.dat
+++ b/release/datafiles/blender_icons16/icon16_hide_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_hook.dat b/release/datafiles/blender_icons16/icon16_hook.dat
index 441c9a285e2..adb4443c80f 100644
--- a/release/datafiles/blender_icons16/icon16_hook.dat
+++ b/release/datafiles/blender_icons16/icon16_hook.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_image.dat b/release/datafiles/blender_icons16/icon16_image.dat
new file mode 100644
index 00000000000..98f929e1c24
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_image.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_image_alpha.dat b/release/datafiles/blender_icons16/icon16_image_alpha.dat
index 170c191e68a..528fa0842e8 100644
--- a/release/datafiles/blender_icons16/icon16_image_alpha.dat
+++ b/release/datafiles/blender_icons16/icon16_image_alpha.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_image_col.dat b/release/datafiles/blender_icons16/icon16_image_col.dat
deleted file mode 100644
index 5f8c0ecbee9..00000000000
--- a/release/datafiles/blender_icons16/icon16_image_col.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_image_data.dat b/release/datafiles/blender_icons16/icon16_image_data.dat
index af0e819a421..b224d87a077 100644
--- a/release/datafiles/blender_icons16/icon16_image_data.dat
+++ b/release/datafiles/blender_icons16/icon16_image_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_image_rgb.dat b/release/datafiles/blender_icons16/icon16_image_rgb.dat
index 9772e9ca244..261ea333f38 100644
--- a/release/datafiles/blender_icons16/icon16_image_rgb.dat
+++ b/release/datafiles/blender_icons16/icon16_image_rgb.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_image_rgb_alpha.dat b/release/datafiles/blender_icons16/icon16_image_rgb_alpha.dat
index 600c1af21fa..cfd12d9c845 100644
--- a/release/datafiles/blender_icons16/icon16_image_rgb_alpha.dat
+++ b/release/datafiles/blender_icons16/icon16_image_rgb_alpha.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_image_zdepth.dat b/release/datafiles/blender_icons16/icon16_image_zdepth.dat
index 366a8794c2f..ba0ed757ff5 100644
--- a/release/datafiles/blender_icons16/icon16_image_zdepth.dat
+++ b/release/datafiles/blender_icons16/icon16_image_zdepth.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_imagefile.dat b/release/datafiles/blender_icons16/icon16_imagefile.dat
index cee4e9f28ed..d5dac564d06 100644
--- a/release/datafiles/blender_icons16/icon16_imagefile.dat
+++ b/release/datafiles/blender_icons16/icon16_imagefile.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_imasel.dat b/release/datafiles/blender_icons16/icon16_imasel.dat
deleted file mode 100644
index 5170026c65e..00000000000
--- a/release/datafiles/blender_icons16/icon16_imasel.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_imgdisplay.dat b/release/datafiles/blender_icons16/icon16_imgdisplay.dat
index 87a1c527362..88b33f29f25 100644
--- a/release/datafiles/blender_icons16/icon16_imgdisplay.dat
+++ b/release/datafiles/blender_icons16/icon16_imgdisplay.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_import.dat b/release/datafiles/blender_icons16/icon16_import.dat
index fc3c7de1860..a3bae76b222 100644
--- a/release/datafiles/blender_icons16/icon16_import.dat
+++ b/release/datafiles/blender_icons16/icon16_import.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_info.dat b/release/datafiles/blender_icons16/icon16_info.dat
index fcd164949e2..2e957e16893 100644
--- a/release/datafiles/blender_icons16/icon16_info.dat
+++ b/release/datafiles/blender_icons16/icon16_info.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_inlink.dat b/release/datafiles/blender_icons16/icon16_inlink.dat
index 76738393aa6..a01348c4ef8 100644
--- a/release/datafiles/blender_icons16/icon16_inlink.dat
+++ b/release/datafiles/blender_icons16/icon16_inlink.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo.dat b/release/datafiles/blender_icons16/icon16_ipo.dat
deleted file mode 100644
index af728ba80ff..00000000000
--- a/release/datafiles/blender_icons16/icon16_ipo.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_back.dat b/release/datafiles/blender_icons16/icon16_ipo_back.dat
index 2c32cc176d7..71bf9e42ea1 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_back.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_back.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_bezier.dat b/release/datafiles/blender_icons16/icon16_ipo_bezier.dat
index 527507cf009..6e91c90b0c1 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_bezier.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_bezier.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_bounce.dat b/release/datafiles/blender_icons16/icon16_ipo_bounce.dat
index 7a3984a3a13..da28ab10ad1 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_bounce.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_bounce.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_circ.dat b/release/datafiles/blender_icons16/icon16_ipo_circ.dat
index c7b392003ed..17ab671368d 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_circ.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_circ.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_constant.dat b/release/datafiles/blender_icons16/icon16_ipo_constant.dat
index cb8882850ab..996c64004fd 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_constant.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_constant.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_cubic.dat b/release/datafiles/blender_icons16/icon16_ipo_cubic.dat
index 6a84b66f725..cfbc75e5bf8 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_cubic.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_cubic.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_ease_in.dat b/release/datafiles/blender_icons16/icon16_ipo_ease_in.dat
index e5c1c1dc051..4e3f304eb9a 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_ease_in.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_ease_in.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_ease_in_out.dat b/release/datafiles/blender_icons16/icon16_ipo_ease_in_out.dat
index cf8ad3264f8..0646deb25cb 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_ease_in_out.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_ease_in_out.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_ease_out.dat b/release/datafiles/blender_icons16/icon16_ipo_ease_out.dat
index bf68ab3169f..c2ca74121b6 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_ease_out.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_ease_out.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_elastic.dat b/release/datafiles/blender_icons16/icon16_ipo_elastic.dat
index 221b0a22236..ff940b0139d 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_elastic.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_elastic.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_expo.dat b/release/datafiles/blender_icons16/icon16_ipo_expo.dat
index 0456875782f..a6e1542bfc1 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_expo.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_expo.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_linear.dat b/release/datafiles/blender_icons16/icon16_ipo_linear.dat
index 84deef4dfe1..9a2b4d810a1 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_linear.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_linear.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_quad.dat b/release/datafiles/blender_icons16/icon16_ipo_quad.dat
index f8dc28cf3fb..704e9db6ac2 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_quad.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_quad.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_quart.dat b/release/datafiles/blender_icons16/icon16_ipo_quart.dat
index 9279f9551d3..f979f58ed3e 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_quart.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_quart.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_quint.dat b/release/datafiles/blender_icons16/icon16_ipo_quint.dat
index d76c781ac73..9d4d2183a86 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_quint.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_quint.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ipo_sine.dat b/release/datafiles/blender_icons16/icon16_ipo_sine.dat
index 4b1d22c360e..d8182e91538 100644
--- a/release/datafiles/blender_icons16/icon16_ipo_sine.dat
+++ b/release/datafiles/blender_icons16/icon16_ipo_sine.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_italic.dat b/release/datafiles/blender_icons16/icon16_italic.dat
new file mode 100644
index 00000000000..b37cc0dd50d
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_italic.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_key_dehlt.dat b/release/datafiles/blender_icons16/icon16_key_dehlt.dat
index 35dc1a12c74..f0ba9ae1230 100644
--- a/release/datafiles/blender_icons16/icon16_key_dehlt.dat
+++ b/release/datafiles/blender_icons16/icon16_key_dehlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_key_hlt.dat b/release/datafiles/blender_icons16/icon16_key_hlt.dat
index 5de0c2c719b..6114850b4b5 100644
--- a/release/datafiles/blender_icons16/icon16_key_hlt.dat
+++ b/release/datafiles/blender_icons16/icon16_key_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_keyframe.dat b/release/datafiles/blender_icons16/icon16_keyframe.dat
new file mode 100644
index 00000000000..0978db173e7
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_keyframe.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_keyframe_hlt.dat b/release/datafiles/blender_icons16/icon16_keyframe_hlt.dat
new file mode 100644
index 00000000000..781e598b68d
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_keyframe_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_keyingset.dat b/release/datafiles/blender_icons16/icon16_keyingset.dat
index f73a88fe500..6e87750d506 100644
--- a/release/datafiles/blender_icons16/icon16_keyingset.dat
+++ b/release/datafiles/blender_icons16/icon16_keyingset.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_lamp.dat b/release/datafiles/blender_icons16/icon16_lamp.dat
deleted file mode 100644
index 3a8893fbbd9..00000000000
--- a/release/datafiles/blender_icons16/icon16_lamp.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_lamp_area.dat b/release/datafiles/blender_icons16/icon16_lamp_area.dat
deleted file mode 100644
index 46c30d695f3..00000000000
--- a/release/datafiles/blender_icons16/icon16_lamp_area.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_lamp_data.dat b/release/datafiles/blender_icons16/icon16_lamp_data.dat
deleted file mode 100644
index 667921e9344..00000000000
--- a/release/datafiles/blender_icons16/icon16_lamp_data.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_lamp_hemi.dat b/release/datafiles/blender_icons16/icon16_lamp_hemi.dat
deleted file mode 100644
index 09d58b1e865..00000000000
--- a/release/datafiles/blender_icons16/icon16_lamp_hemi.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_lamp_point.dat b/release/datafiles/blender_icons16/icon16_lamp_point.dat
deleted file mode 100644
index cb467d2f5e5..00000000000
--- a/release/datafiles/blender_icons16/icon16_lamp_point.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_lamp_spot.dat b/release/datafiles/blender_icons16/icon16_lamp_spot.dat
deleted file mode 100644
index 673cafdc18b..00000000000
--- a/release/datafiles/blender_icons16/icon16_lamp_spot.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_lamp_sun.dat b/release/datafiles/blender_icons16/icon16_lamp_sun.dat
deleted file mode 100644
index 7a0e6f88718..00000000000
--- a/release/datafiles/blender_icons16/icon16_lamp_sun.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_lattice_data.dat b/release/datafiles/blender_icons16/icon16_lattice_data.dat
index 5b997d24caf..0ac0dfa57c9 100644
--- a/release/datafiles/blender_icons16/icon16_lattice_data.dat
+++ b/release/datafiles/blender_icons16/icon16_lattice_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_layer_active.dat b/release/datafiles/blender_icons16/icon16_layer_active.dat
index a3ca67e49ed..d9d0e894c1b 100644
--- a/release/datafiles/blender_icons16/icon16_layer_active.dat
+++ b/release/datafiles/blender_icons16/icon16_layer_active.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_layer_used.dat b/release/datafiles/blender_icons16/icon16_layer_used.dat
index dc3dd82196b..10c9c69bf09 100644
--- a/release/datafiles/blender_icons16/icon16_layer_used.dat
+++ b/release/datafiles/blender_icons16/icon16_layer_used.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_library_data_broken.dat b/release/datafiles/blender_icons16/icon16_library_data_broken.dat
index 613fac48c21..20715d139ff 100644
--- a/release/datafiles/blender_icons16/icon16_library_data_broken.dat
+++ b/release/datafiles/blender_icons16/icon16_library_data_broken.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_library_data_direct.dat b/release/datafiles/blender_icons16/icon16_library_data_direct.dat
index ad61b6d454d..5ab8070283d 100644
--- a/release/datafiles/blender_icons16/icon16_library_data_direct.dat
+++ b/release/datafiles/blender_icons16/icon16_library_data_direct.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_library_data_indirect.dat b/release/datafiles/blender_icons16/icon16_library_data_indirect.dat
index 6a77cfda4ac..1b2264665e8 100644
--- a/release/datafiles/blender_icons16/icon16_library_data_indirect.dat
+++ b/release/datafiles/blender_icons16/icon16_library_data_indirect.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_library_data_override.dat b/release/datafiles/blender_icons16/icon16_library_data_override.dat
index 3879fedc234..bfc9de2c307 100644
--- a/release/datafiles/blender_icons16/icon16_library_data_override.dat
+++ b/release/datafiles/blender_icons16/icon16_library_data_override.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_light.dat b/release/datafiles/blender_icons16/icon16_light.dat
new file mode 100644
index 00000000000..e4b6f5fc878
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_light.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_light_area.dat b/release/datafiles/blender_icons16/icon16_light_area.dat
new file mode 100644
index 00000000000..c274435538a
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_light_area.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_light_data.dat b/release/datafiles/blender_icons16/icon16_light_data.dat
new file mode 100644
index 00000000000..0c3fcfee152
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_light_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_light_hemi.dat b/release/datafiles/blender_icons16/icon16_light_hemi.dat
new file mode 100644
index 00000000000..98ba6b45f43
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_light_hemi.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_light_point.dat b/release/datafiles/blender_icons16/icon16_light_point.dat
new file mode 100644
index 00000000000..7effd658603
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_light_point.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_light_spot.dat b/release/datafiles/blender_icons16/icon16_light_spot.dat
new file mode 100644
index 00000000000..34f2ab4898c
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_light_spot.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_light_sun.dat b/release/datafiles/blender_icons16/icon16_light_sun.dat
new file mode 100644
index 00000000000..e69ec9b6523
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_light_sun.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_lightpaint.dat b/release/datafiles/blender_icons16/icon16_lightpaint.dat
index d004f063b93..49abde94c6a 100644
--- a/release/datafiles/blender_icons16/icon16_lightpaint.dat
+++ b/release/datafiles/blender_icons16/icon16_lightpaint.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_lightprobe_cubemap.dat b/release/datafiles/blender_icons16/icon16_lightprobe_cubemap.dat
index ebecec80a90..26190c1d38c 100644
--- a/release/datafiles/blender_icons16/icon16_lightprobe_cubemap.dat
+++ b/release/datafiles/blender_icons16/icon16_lightprobe_cubemap.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_lightprobe_grid.dat b/release/datafiles/blender_icons16/icon16_lightprobe_grid.dat
index c8ee35d0738..190c87348ec 100644
--- a/release/datafiles/blender_icons16/icon16_lightprobe_grid.dat
+++ b/release/datafiles/blender_icons16/icon16_lightprobe_grid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_lightprobe_planar.dat b/release/datafiles/blender_icons16/icon16_lightprobe_planar.dat
index ef5824c8a22..c1bc4774f6f 100644
--- a/release/datafiles/blender_icons16/icon16_lightprobe_planar.dat
+++ b/release/datafiles/blender_icons16/icon16_lightprobe_planar.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_lincurve.dat b/release/datafiles/blender_icons16/icon16_lincurve.dat
index bf187b02cf7..a4ad0dc676f 100644
--- a/release/datafiles/blender_icons16/icon16_lincurve.dat
+++ b/release/datafiles/blender_icons16/icon16_lincurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_line_data.dat b/release/datafiles/blender_icons16/icon16_line_data.dat
index 22eec8a714e..6257374a082 100644
--- a/release/datafiles/blender_icons16/icon16_line_data.dat
+++ b/release/datafiles/blender_icons16/icon16_line_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_linenumbers_off.dat b/release/datafiles/blender_icons16/icon16_linenumbers_off.dat
index 89998c1c798..d8c586b5eab 100644
--- a/release/datafiles/blender_icons16/icon16_linenumbers_off.dat
+++ b/release/datafiles/blender_icons16/icon16_linenumbers_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_linenumbers_on.dat b/release/datafiles/blender_icons16/icon16_linenumbers_on.dat
index d17ade88aec..9b270342da0 100644
--- a/release/datafiles/blender_icons16/icon16_linenumbers_on.dat
+++ b/release/datafiles/blender_icons16/icon16_linenumbers_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_link.dat b/release/datafiles/blender_icons16/icon16_link.dat
index 481794f1663..df4b0211f29 100644
--- a/release/datafiles/blender_icons16/icon16_link.dat
+++ b/release/datafiles/blender_icons16/icon16_link.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_link_area.dat b/release/datafiles/blender_icons16/icon16_link_area.dat
index 732352340fb..75f7b6d4a81 100644
--- a/release/datafiles/blender_icons16/icon16_link_area.dat
+++ b/release/datafiles/blender_icons16/icon16_link_area.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_link_blend.dat b/release/datafiles/blender_icons16/icon16_link_blend.dat
index 1a20de2f266..5fca46b8c57 100644
--- a/release/datafiles/blender_icons16/icon16_link_blend.dat
+++ b/release/datafiles/blender_icons16/icon16_link_blend.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_linked.dat b/release/datafiles/blender_icons16/icon16_linked.dat
index cbcb217878d..149831e8052 100644
--- a/release/datafiles/blender_icons16/icon16_linked.dat
+++ b/release/datafiles/blender_icons16/icon16_linked.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_load_factory.dat b/release/datafiles/blender_icons16/icon16_load_factory.dat
deleted file mode 100644
index ff0d27e2e07..00000000000
--- a/release/datafiles/blender_icons16/icon16_load_factory.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_locked.dat b/release/datafiles/blender_icons16/icon16_locked.dat
index 5edc73ecb32..b01d55e190c 100644
--- a/release/datafiles/blender_icons16/icon16_locked.dat
+++ b/release/datafiles/blender_icons16/icon16_locked.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_lockview_off.dat b/release/datafiles/blender_icons16/icon16_lockview_off.dat
index 41b4a5ef116..5b45548bdf3 100644
--- a/release/datafiles/blender_icons16/icon16_lockview_off.dat
+++ b/release/datafiles/blender_icons16/icon16_lockview_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_lockview_on.dat b/release/datafiles/blender_icons16/icon16_lockview_on.dat
index 8b17f6b8702..fe4d3b507ab 100644
--- a/release/datafiles/blender_icons16/icon16_lockview_on.dat
+++ b/release/datafiles/blender_icons16/icon16_lockview_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_logic.dat b/release/datafiles/blender_icons16/icon16_logic.dat
index b17f495a411..2ce7bb15f54 100644
--- a/release/datafiles/blender_icons16/icon16_logic.dat
+++ b/release/datafiles/blender_icons16/icon16_logic.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_longdisplay.dat b/release/datafiles/blender_icons16/icon16_longdisplay.dat
index 00e3607644d..3e6962caa1f 100644
--- a/release/datafiles/blender_icons16/icon16_longdisplay.dat
+++ b/release/datafiles/blender_icons16/icon16_longdisplay.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_loop_back.dat b/release/datafiles/blender_icons16/icon16_loop_back.dat
index aea7ce78d14..4d1e6fcf130 100644
--- a/release/datafiles/blender_icons16/icon16_loop_back.dat
+++ b/release/datafiles/blender_icons16/icon16_loop_back.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_loop_forwards.dat b/release/datafiles/blender_icons16/icon16_loop_forwards.dat
index af8ea9feb17..ee9552f2c5a 100644
--- a/release/datafiles/blender_icons16/icon16_loop_forwards.dat
+++ b/release/datafiles/blender_icons16/icon16_loop_forwards.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_loopsel.dat b/release/datafiles/blender_icons16/icon16_loopsel.dat
deleted file mode 100644
index 78f9bbe1a6f..00000000000
--- a/release/datafiles/blender_icons16/icon16_loopsel.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_man_rot.dat b/release/datafiles/blender_icons16/icon16_man_rot.dat
index 568ea58763d..b84df37a9c5 100644
--- a/release/datafiles/blender_icons16/icon16_man_rot.dat
+++ b/release/datafiles/blender_icons16/icon16_man_rot.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_man_scale.dat b/release/datafiles/blender_icons16/icon16_man_scale.dat
index 9986f1d6e49..301e42a764f 100644
--- a/release/datafiles/blender_icons16/icon16_man_scale.dat
+++ b/release/datafiles/blender_icons16/icon16_man_scale.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_man_trans.dat b/release/datafiles/blender_icons16/icon16_man_trans.dat
index acf779251a9..260fab4f1ee 100644
--- a/release/datafiles/blender_icons16/icon16_man_trans.dat
+++ b/release/datafiles/blender_icons16/icon16_man_trans.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_manipul.dat b/release/datafiles/blender_icons16/icon16_manipul.dat
index aa1afb47cd4..91d33fa2dea 100644
--- a/release/datafiles/blender_icons16/icon16_manipul.dat
+++ b/release/datafiles/blender_icons16/icon16_manipul.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_marker.dat b/release/datafiles/blender_icons16/icon16_marker.dat
index 60f9b80497f..8ae1a0e5c5d 100644
--- a/release/datafiles/blender_icons16/icon16_marker.dat
+++ b/release/datafiles/blender_icons16/icon16_marker.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_marker_hlt.dat b/release/datafiles/blender_icons16/icon16_marker_hlt.dat
index d67024e59b0..14c1ee21102 100644
--- a/release/datafiles/blender_icons16/icon16_marker_hlt.dat
+++ b/release/datafiles/blender_icons16/icon16_marker_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mat_sphere_sky.dat b/release/datafiles/blender_icons16/icon16_mat_sphere_sky.dat
index 4b2e648bce5..09ae2a15dd2 100644
--- a/release/datafiles/blender_icons16/icon16_mat_sphere_sky.dat
+++ b/release/datafiles/blender_icons16/icon16_mat_sphere_sky.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_matcloth.dat b/release/datafiles/blender_icons16/icon16_matcloth.dat
new file mode 100644
index 00000000000..cfdfbda3ff1
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_matcloth.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_matcube.dat b/release/datafiles/blender_icons16/icon16_matcube.dat
index 2480531b8cd..be77c71c933 100644
--- a/release/datafiles/blender_icons16/icon16_matcube.dat
+++ b/release/datafiles/blender_icons16/icon16_matcube.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_material.dat b/release/datafiles/blender_icons16/icon16_material.dat
index def386f07fd..6f85f00b6f8 100644
--- a/release/datafiles/blender_icons16/icon16_material.dat
+++ b/release/datafiles/blender_icons16/icon16_material.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_material_data.dat b/release/datafiles/blender_icons16/icon16_material_data.dat
index f5b37c5c531..0a903add3eb 100644
--- a/release/datafiles/blender_icons16/icon16_material_data.dat
+++ b/release/datafiles/blender_icons16/icon16_material_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_matfluid.dat b/release/datafiles/blender_icons16/icon16_matfluid.dat
new file mode 100644
index 00000000000..54d9029d836
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_matfluid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_matplane.dat b/release/datafiles/blender_icons16/icon16_matplane.dat
index c9db49fed72..a41394b80b7 100644
--- a/release/datafiles/blender_icons16/icon16_matplane.dat
+++ b/release/datafiles/blender_icons16/icon16_matplane.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_matshaderball.dat b/release/datafiles/blender_icons16/icon16_matshaderball.dat
new file mode 100644
index 00000000000..254f47ec1bd
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_matshaderball.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_matsphere.dat b/release/datafiles/blender_icons16/icon16_matsphere.dat
index cac9f93b525..5341cf8e5fd 100644
--- a/release/datafiles/blender_icons16/icon16_matsphere.dat
+++ b/release/datafiles/blender_icons16/icon16_matsphere.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_menu_panel.dat b/release/datafiles/blender_icons16/icon16_menu_panel.dat
index c6bb8c37c6c..a20a2791c1f 100644
--- a/release/datafiles/blender_icons16/icon16_menu_panel.dat
+++ b/release/datafiles/blender_icons16/icon16_menu_panel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mesh_capsule.dat b/release/datafiles/blender_icons16/icon16_mesh_capsule.dat
index 031cac70eea..1e389480de7 100644
--- a/release/datafiles/blender_icons16/icon16_mesh_capsule.dat
+++ b/release/datafiles/blender_icons16/icon16_mesh_capsule.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mesh_circle.dat b/release/datafiles/blender_icons16/icon16_mesh_circle.dat
index 9e3d5b77136..4e81f51b794 100644
--- a/release/datafiles/blender_icons16/icon16_mesh_circle.dat
+++ b/release/datafiles/blender_icons16/icon16_mesh_circle.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mesh_cone.dat b/release/datafiles/blender_icons16/icon16_mesh_cone.dat
index 389050aa5ae..d50f5e1f26b 100644
--- a/release/datafiles/blender_icons16/icon16_mesh_cone.dat
+++ b/release/datafiles/blender_icons16/icon16_mesh_cone.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mesh_cube.dat b/release/datafiles/blender_icons16/icon16_mesh_cube.dat
index c9b6c37ef99..9fb71bb9ebe 100644
--- a/release/datafiles/blender_icons16/icon16_mesh_cube.dat
+++ b/release/datafiles/blender_icons16/icon16_mesh_cube.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mesh_cylinder.dat b/release/datafiles/blender_icons16/icon16_mesh_cylinder.dat
index c558d6ec07d..5e46e9fbd8b 100644
--- a/release/datafiles/blender_icons16/icon16_mesh_cylinder.dat
+++ b/release/datafiles/blender_icons16/icon16_mesh_cylinder.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mesh_data.dat b/release/datafiles/blender_icons16/icon16_mesh_data.dat
index 847dfdaf230..049f759f5d0 100644
--- a/release/datafiles/blender_icons16/icon16_mesh_data.dat
+++ b/release/datafiles/blender_icons16/icon16_mesh_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mesh_grid.dat b/release/datafiles/blender_icons16/icon16_mesh_grid.dat
index c5dbc309f13..e8cc15097d7 100644
--- a/release/datafiles/blender_icons16/icon16_mesh_grid.dat
+++ b/release/datafiles/blender_icons16/icon16_mesh_grid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mesh_icosphere.dat b/release/datafiles/blender_icons16/icon16_mesh_icosphere.dat
index 2ea4f98c11c..452acf431a6 100644
--- a/release/datafiles/blender_icons16/icon16_mesh_icosphere.dat
+++ b/release/datafiles/blender_icons16/icon16_mesh_icosphere.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mesh_monkey.dat b/release/datafiles/blender_icons16/icon16_mesh_monkey.dat
index e685c6b97e2..a9d152cd987 100644
--- a/release/datafiles/blender_icons16/icon16_mesh_monkey.dat
+++ b/release/datafiles/blender_icons16/icon16_mesh_monkey.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mesh_plane.dat b/release/datafiles/blender_icons16/icon16_mesh_plane.dat
index 36f2bda776f..be6bf167395 100644
--- a/release/datafiles/blender_icons16/icon16_mesh_plane.dat
+++ b/release/datafiles/blender_icons16/icon16_mesh_plane.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mesh_torus.dat b/release/datafiles/blender_icons16/icon16_mesh_torus.dat
index 015d3a95c49..547ce61f224 100644
--- a/release/datafiles/blender_icons16/icon16_mesh_torus.dat
+++ b/release/datafiles/blender_icons16/icon16_mesh_torus.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mesh_uvsphere.dat b/release/datafiles/blender_icons16/icon16_mesh_uvsphere.dat
index 6ac1ae0201b..44adff42459 100644
--- a/release/datafiles/blender_icons16/icon16_mesh_uvsphere.dat
+++ b/release/datafiles/blender_icons16/icon16_mesh_uvsphere.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_meta_ball.dat b/release/datafiles/blender_icons16/icon16_meta_ball.dat
index 1eaa7e26cde..098f1e17cf6 100644
--- a/release/datafiles/blender_icons16/icon16_meta_ball.dat
+++ b/release/datafiles/blender_icons16/icon16_meta_ball.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_meta_capsule.dat b/release/datafiles/blender_icons16/icon16_meta_capsule.dat
index e26afdb7f5b..ecad895c240 100644
--- a/release/datafiles/blender_icons16/icon16_meta_capsule.dat
+++ b/release/datafiles/blender_icons16/icon16_meta_capsule.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_meta_cube.dat b/release/datafiles/blender_icons16/icon16_meta_cube.dat
index 29a1ec0f11d..a75029edaee 100644
--- a/release/datafiles/blender_icons16/icon16_meta_cube.dat
+++ b/release/datafiles/blender_icons16/icon16_meta_cube.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_meta_data.dat b/release/datafiles/blender_icons16/icon16_meta_data.dat
index d1cbcd9870b..ad9c3a55192 100644
--- a/release/datafiles/blender_icons16/icon16_meta_data.dat
+++ b/release/datafiles/blender_icons16/icon16_meta_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_meta_ellipsoid.dat b/release/datafiles/blender_icons16/icon16_meta_ellipsoid.dat
index f95dbbd4d4e..b9011fd2119 100644
--- a/release/datafiles/blender_icons16/icon16_meta_ellipsoid.dat
+++ b/release/datafiles/blender_icons16/icon16_meta_ellipsoid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_meta_empty.dat b/release/datafiles/blender_icons16/icon16_meta_empty.dat
index 1e341b80492..d7c94ae8f93 100644
--- a/release/datafiles/blender_icons16/icon16_meta_empty.dat
+++ b/release/datafiles/blender_icons16/icon16_meta_empty.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_meta_plane.dat b/release/datafiles/blender_icons16/icon16_meta_plane.dat
index 533443bd06c..f074778fa0d 100644
--- a/release/datafiles/blender_icons16/icon16_meta_plane.dat
+++ b/release/datafiles/blender_icons16/icon16_meta_plane.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_armature.dat b/release/datafiles/blender_icons16/icon16_mod_armature.dat
index 97f2d49c3f0..4b26cac6c29 100644
--- a/release/datafiles/blender_icons16/icon16_mod_armature.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_armature.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_array.dat b/release/datafiles/blender_icons16/icon16_mod_array.dat
index b90466c2609..0ddf4a6166f 100644
--- a/release/datafiles/blender_icons16/icon16_mod_array.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_array.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_bevel.dat b/release/datafiles/blender_icons16/icon16_mod_bevel.dat
index 896056e4b09..fbd732b307a 100644
--- a/release/datafiles/blender_icons16/icon16_mod_bevel.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_bevel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_boolean.dat b/release/datafiles/blender_icons16/icon16_mod_boolean.dat
index 1fe9b2c0404..8738f50c10d 100644
--- a/release/datafiles/blender_icons16/icon16_mod_boolean.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_boolean.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_build.dat b/release/datafiles/blender_icons16/icon16_mod_build.dat
index b720a6ab66b..2780ea729a4 100644
--- a/release/datafiles/blender_icons16/icon16_mod_build.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_build.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_cast.dat b/release/datafiles/blender_icons16/icon16_mod_cast.dat
index 88752e2f5cb..195bb7b16b5 100644
--- a/release/datafiles/blender_icons16/icon16_mod_cast.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_cast.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_cloth.dat b/release/datafiles/blender_icons16/icon16_mod_cloth.dat
index 4e07062fac2..c645dc7b400 100644
--- a/release/datafiles/blender_icons16/icon16_mod_cloth.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_cloth.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_curve.dat b/release/datafiles/blender_icons16/icon16_mod_curve.dat
index 32058a3c06d..5ce10651cc8 100644
--- a/release/datafiles/blender_icons16/icon16_mod_curve.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_curve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_data_transfer.dat b/release/datafiles/blender_icons16/icon16_mod_data_transfer.dat
index bc80043da78..29b3790b068 100644
--- a/release/datafiles/blender_icons16/icon16_mod_data_transfer.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_data_transfer.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_decim.dat b/release/datafiles/blender_icons16/icon16_mod_decim.dat
index 2a4c3f44551..f70eda86e51 100644
--- a/release/datafiles/blender_icons16/icon16_mod_decim.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_decim.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_displace.dat b/release/datafiles/blender_icons16/icon16_mod_displace.dat
index aa83e552787..22f204a3f0d 100644
--- a/release/datafiles/blender_icons16/icon16_mod_displace.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_displace.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_dynamicpaint.dat b/release/datafiles/blender_icons16/icon16_mod_dynamicpaint.dat
index 5a40c1f531a..30390b4b2af 100644
--- a/release/datafiles/blender_icons16/icon16_mod_dynamicpaint.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_dynamicpaint.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_edgesplit.dat b/release/datafiles/blender_icons16/icon16_mod_edgesplit.dat
index e20ae564cf7..38f57887bfe 100644
--- a/release/datafiles/blender_icons16/icon16_mod_edgesplit.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_edgesplit.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_explode.dat b/release/datafiles/blender_icons16/icon16_mod_explode.dat
index b25344d74e6..332f8102382 100644
--- a/release/datafiles/blender_icons16/icon16_mod_explode.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_explode.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_fluidsim.dat b/release/datafiles/blender_icons16/icon16_mod_fluidsim.dat
index 3221e01ef87..d1a2458415d 100644
--- a/release/datafiles/blender_icons16/icon16_mod_fluidsim.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_fluidsim.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_hue_saturation.dat b/release/datafiles/blender_icons16/icon16_mod_hue_saturation.dat
new file mode 100644
index 00000000000..e4524c479f0
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_mod_hue_saturation.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_instance.dat b/release/datafiles/blender_icons16/icon16_mod_instance.dat
new file mode 100644
index 00000000000..98655e5c6aa
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_mod_instance.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_lattice.dat b/release/datafiles/blender_icons16/icon16_mod_lattice.dat
index 64890e893c3..fc269ca61c9 100644
--- a/release/datafiles/blender_icons16/icon16_mod_lattice.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_lattice.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_mask.dat b/release/datafiles/blender_icons16/icon16_mod_mask.dat
index 14686f768e1..597d9262cc8 100644
--- a/release/datafiles/blender_icons16/icon16_mod_mask.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_mask.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_meshdeform.dat b/release/datafiles/blender_icons16/icon16_mod_meshdeform.dat
index 7af69a8eb58..ba0ecfdbc6c 100644
--- a/release/datafiles/blender_icons16/icon16_mod_meshdeform.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_meshdeform.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_mirror.dat b/release/datafiles/blender_icons16/icon16_mod_mirror.dat
index 058db8dc294..f7a1f740463 100644
--- a/release/datafiles/blender_icons16/icon16_mod_mirror.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_mirror.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_multires.dat b/release/datafiles/blender_icons16/icon16_mod_multires.dat
index bf5c3df9740..3157b9ee636 100644
--- a/release/datafiles/blender_icons16/icon16_mod_multires.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_multires.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_noise.dat b/release/datafiles/blender_icons16/icon16_mod_noise.dat
new file mode 100644
index 00000000000..0d5ef3a40f2
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_mod_noise.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_normaledit.dat b/release/datafiles/blender_icons16/icon16_mod_normaledit.dat
index 1c4898f80d8..8e6277ee315 100644
--- a/release/datafiles/blender_icons16/icon16_mod_normaledit.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_normaledit.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_ocean.dat b/release/datafiles/blender_icons16/icon16_mod_ocean.dat
index 577373e458f..e7d2b57798a 100644
--- a/release/datafiles/blender_icons16/icon16_mod_ocean.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_ocean.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_offset.dat b/release/datafiles/blender_icons16/icon16_mod_offset.dat
new file mode 100644
index 00000000000..c3dc4e921f8
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_mod_offset.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_opacity.dat b/release/datafiles/blender_icons16/icon16_mod_opacity.dat
new file mode 100644
index 00000000000..229037107a1
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_mod_opacity.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_particle_instance.dat b/release/datafiles/blender_icons16/icon16_mod_particle_instance.dat
new file mode 100644
index 00000000000..84bdbbba1a9
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_mod_particle_instance.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_particles.dat b/release/datafiles/blender_icons16/icon16_mod_particles.dat
index 1fc3beb67c6..9376f765d5f 100644
--- a/release/datafiles/blender_icons16/icon16_mod_particles.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_particles.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_physics.dat b/release/datafiles/blender_icons16/icon16_mod_physics.dat
index f5f89e5042a..9d394ad580c 100644
--- a/release/datafiles/blender_icons16/icon16_mod_physics.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_physics.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_remesh.dat b/release/datafiles/blender_icons16/icon16_mod_remesh.dat
index 52dd9cacc67..9e095d0b1ff 100644
--- a/release/datafiles/blender_icons16/icon16_mod_remesh.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_remesh.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_screw.dat b/release/datafiles/blender_icons16/icon16_mod_screw.dat
index 4eea50287a0..9c0a5156cff 100644
--- a/release/datafiles/blender_icons16/icon16_mod_screw.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_screw.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_shrinkwrap.dat b/release/datafiles/blender_icons16/icon16_mod_shrinkwrap.dat
index e5574a4f56c..655b0248382 100644
--- a/release/datafiles/blender_icons16/icon16_mod_shrinkwrap.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_shrinkwrap.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_simpledeform.dat b/release/datafiles/blender_icons16/icon16_mod_simpledeform.dat
index 5ea2ae3a806..6f1959840d1 100644
--- a/release/datafiles/blender_icons16/icon16_mod_simpledeform.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_simpledeform.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_simplify.dat b/release/datafiles/blender_icons16/icon16_mod_simplify.dat
new file mode 100644
index 00000000000..2397fb08da1
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_mod_simplify.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_skin.dat b/release/datafiles/blender_icons16/icon16_mod_skin.dat
index 93753905f51..e16de2b0469 100644
--- a/release/datafiles/blender_icons16/icon16_mod_skin.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_skin.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_smoke.dat b/release/datafiles/blender_icons16/icon16_mod_smoke.dat
index 2fe72cb8e82..86639fa1ca1 100644
--- a/release/datafiles/blender_icons16/icon16_mod_smoke.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_smoke.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_smooth.dat b/release/datafiles/blender_icons16/icon16_mod_smooth.dat
index 670718369cb..795dc984e2b 100644
--- a/release/datafiles/blender_icons16/icon16_mod_smooth.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_smooth.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_soft.dat b/release/datafiles/blender_icons16/icon16_mod_soft.dat
index 98abb47f8d8..af6e86fbaae 100644
--- a/release/datafiles/blender_icons16/icon16_mod_soft.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_soft.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_solidify.dat b/release/datafiles/blender_icons16/icon16_mod_solidify.dat
index 166558c27bf..75ac6d73c5a 100644
--- a/release/datafiles/blender_icons16/icon16_mod_solidify.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_solidify.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_subsurf.dat b/release/datafiles/blender_icons16/icon16_mod_subsurf.dat
index 714681761bb..74f43a74010 100644
--- a/release/datafiles/blender_icons16/icon16_mod_subsurf.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_subsurf.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_thickness.dat b/release/datafiles/blender_icons16/icon16_mod_thickness.dat
new file mode 100644
index 00000000000..c65e62bdfe6
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_mod_thickness.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_time.dat b/release/datafiles/blender_icons16/icon16_mod_time.dat
new file mode 100644
index 00000000000..dbf522a8024
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_mod_time.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_tint.dat b/release/datafiles/blender_icons16/icon16_mod_tint.dat
new file mode 100644
index 00000000000..dd141bf6039
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_mod_tint.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_triangulate.dat b/release/datafiles/blender_icons16/icon16_mod_triangulate.dat
index 7a95bb73def..4f5998fe3a6 100644
--- a/release/datafiles/blender_icons16/icon16_mod_triangulate.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_triangulate.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_uvproject.dat b/release/datafiles/blender_icons16/icon16_mod_uvproject.dat
index 20b18194a0d..75b63cb77d2 100644
--- a/release/datafiles/blender_icons16/icon16_mod_uvproject.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_uvproject.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_vertex_weight.dat b/release/datafiles/blender_icons16/icon16_mod_vertex_weight.dat
index 1fea4a43987..e30c3337839 100644
--- a/release/datafiles/blender_icons16/icon16_mod_vertex_weight.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_vertex_weight.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_warp.dat b/release/datafiles/blender_icons16/icon16_mod_warp.dat
index 58e5904507b..7957c541228 100644
--- a/release/datafiles/blender_icons16/icon16_mod_warp.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_warp.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_wave.dat b/release/datafiles/blender_icons16/icon16_mod_wave.dat
index af7b7069c1e..cf078e06962 100644
--- a/release/datafiles/blender_icons16/icon16_mod_wave.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_wave.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mod_wireframe.dat b/release/datafiles/blender_icons16/icon16_mod_wireframe.dat
index ee9d4dd3261..379c61e8b6c 100644
--- a/release/datafiles/blender_icons16/icon16_mod_wireframe.dat
+++ b/release/datafiles/blender_icons16/icon16_mod_wireframe.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_modifier.dat b/release/datafiles/blender_icons16/icon16_modifier.dat
index 815f6ef7f47..589c78805e1 100644
--- a/release/datafiles/blender_icons16/icon16_modifier.dat
+++ b/release/datafiles/blender_icons16/icon16_modifier.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_modifier_off.dat b/release/datafiles/blender_icons16/icon16_modifier_off.dat
new file mode 100644
index 00000000000..897466fbc8b
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_modifier_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_modifier_on.dat b/release/datafiles/blender_icons16/icon16_modifier_on.dat
new file mode 100644
index 00000000000..bf37d8645ef
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_modifier_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_monkey.dat b/release/datafiles/blender_icons16/icon16_monkey.dat
index d503c70720e..007f908ecfa 100644
--- a/release/datafiles/blender_icons16/icon16_monkey.dat
+++ b/release/datafiles/blender_icons16/icon16_monkey.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mouse_drag.dat b/release/datafiles/blender_icons16/icon16_mouse_drag.dat
deleted file mode 100644
index f925ef9e155..00000000000
--- a/release/datafiles/blender_icons16/icon16_mouse_drag.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mouse_lmb.dat b/release/datafiles/blender_icons16/icon16_mouse_lmb.dat
index 26dc81ea390..7008b465d03 100644
--- a/release/datafiles/blender_icons16/icon16_mouse_lmb.dat
+++ b/release/datafiles/blender_icons16/icon16_mouse_lmb.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mouse_lmb_drag.dat b/release/datafiles/blender_icons16/icon16_mouse_lmb_drag.dat
index 2d71f6e5e24..60c099481aa 100644
--- a/release/datafiles/blender_icons16/icon16_mouse_lmb_drag.dat
+++ b/release/datafiles/blender_icons16/icon16_mouse_lmb_drag.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mouse_mmb.dat b/release/datafiles/blender_icons16/icon16_mouse_mmb.dat
index 703f0ed2795..ad854ad6002 100644
--- a/release/datafiles/blender_icons16/icon16_mouse_mmb.dat
+++ b/release/datafiles/blender_icons16/icon16_mouse_mmb.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mouse_mmb_drag.dat b/release/datafiles/blender_icons16/icon16_mouse_mmb_drag.dat
index 685a2bc3a1f..36a207f0610 100644
--- a/release/datafiles/blender_icons16/icon16_mouse_mmb_drag.dat
+++ b/release/datafiles/blender_icons16/icon16_mouse_mmb_drag.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mouse_move.dat b/release/datafiles/blender_icons16/icon16_mouse_move.dat
index 2767722211b..1ffbc82e889 100644
--- a/release/datafiles/blender_icons16/icon16_mouse_move.dat
+++ b/release/datafiles/blender_icons16/icon16_mouse_move.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mouse_rmb.dat b/release/datafiles/blender_icons16/icon16_mouse_rmb.dat
index 5179fa2487f..89bcaed34f1 100644
--- a/release/datafiles/blender_icons16/icon16_mouse_rmb.dat
+++ b/release/datafiles/blender_icons16/icon16_mouse_rmb.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mouse_rmb_drag.dat b/release/datafiles/blender_icons16/icon16_mouse_rmb_drag.dat
index 8292197e06b..5ebad997802 100644
--- a/release/datafiles/blender_icons16/icon16_mouse_rmb_drag.dat
+++ b/release/datafiles/blender_icons16/icon16_mouse_rmb_drag.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mute_ipo_off.dat b/release/datafiles/blender_icons16/icon16_mute_ipo_off.dat
index 1a640d3e6cc..b5499d4a56b 100644
--- a/release/datafiles/blender_icons16/icon16_mute_ipo_off.dat
+++ b/release/datafiles/blender_icons16/icon16_mute_ipo_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_mute_ipo_on.dat b/release/datafiles/blender_icons16/icon16_mute_ipo_on.dat
index 962c00ff8af..adea04a2b23 100644
--- a/release/datafiles/blender_icons16/icon16_mute_ipo_on.dat
+++ b/release/datafiles/blender_icons16/icon16_mute_ipo_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ndof_dom.dat b/release/datafiles/blender_icons16/icon16_ndof_dom.dat
index a2386822839..046201caa2f 100644
--- a/release/datafiles/blender_icons16/icon16_ndof_dom.dat
+++ b/release/datafiles/blender_icons16/icon16_ndof_dom.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ndof_fly.dat b/release/datafiles/blender_icons16/icon16_ndof_fly.dat
index 6454b16af73..5e015a4463a 100644
--- a/release/datafiles/blender_icons16/icon16_ndof_fly.dat
+++ b/release/datafiles/blender_icons16/icon16_ndof_fly.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ndof_trans.dat b/release/datafiles/blender_icons16/icon16_ndof_trans.dat
index 2c24ff4385b..684c8e17002 100644
--- a/release/datafiles/blender_icons16/icon16_ndof_trans.dat
+++ b/release/datafiles/blender_icons16/icon16_ndof_trans.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ndof_turn.dat b/release/datafiles/blender_icons16/icon16_ndof_turn.dat
index b979f40d9eb..c98d26e266b 100644
--- a/release/datafiles/blender_icons16/icon16_ndof_turn.dat
+++ b/release/datafiles/blender_icons16/icon16_ndof_turn.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_new.dat b/release/datafiles/blender_icons16/icon16_new.dat
deleted file mode 100644
index 6dc0b5039a1..00000000000
--- a/release/datafiles/blender_icons16/icon16_new.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_newfolder.dat b/release/datafiles/blender_icons16/icon16_newfolder.dat
index 5dfda6652d3..b0053a5cf22 100644
--- a/release/datafiles/blender_icons16/icon16_newfolder.dat
+++ b/release/datafiles/blender_icons16/icon16_newfolder.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_next_keyframe.dat b/release/datafiles/blender_icons16/icon16_next_keyframe.dat
index f2a233152e4..516238cd9be 100644
--- a/release/datafiles/blender_icons16/icon16_next_keyframe.dat
+++ b/release/datafiles/blender_icons16/icon16_next_keyframe.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_nla.dat b/release/datafiles/blender_icons16/icon16_nla.dat
index 5d3e7a12917..0eb111ebd80 100644
--- a/release/datafiles/blender_icons16/icon16_nla.dat
+++ b/release/datafiles/blender_icons16/icon16_nla.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_nla_pushdown.dat b/release/datafiles/blender_icons16/icon16_nla_pushdown.dat
index 37e5cacb333..4e64d4fbac4 100644
--- a/release/datafiles/blender_icons16/icon16_nla_pushdown.dat
+++ b/release/datafiles/blender_icons16/icon16_nla_pushdown.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_nocurve.dat b/release/datafiles/blender_icons16/icon16_nocurve.dat
index 4ba4a654853..b805ec2ba09 100644
--- a/release/datafiles/blender_icons16/icon16_nocurve.dat
+++ b/release/datafiles/blender_icons16/icon16_nocurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_node.dat b/release/datafiles/blender_icons16/icon16_node.dat
index e39a642e7c5..527d7c6ace9 100644
--- a/release/datafiles/blender_icons16/icon16_node.dat
+++ b/release/datafiles/blender_icons16/icon16_node.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_node_compositing.dat b/release/datafiles/blender_icons16/icon16_node_compositing.dat
new file mode 100644
index 00000000000..847e3f3a2e7
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_node_compositing.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_node_corner.dat b/release/datafiles/blender_icons16/icon16_node_corner.dat
new file mode 100644
index 00000000000..13d9e6083d7
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_node_corner.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_node_insert_off.dat b/release/datafiles/blender_icons16/icon16_node_insert_off.dat
index ce045a21185..9cfcaf9b4f7 100644
--- a/release/datafiles/blender_icons16/icon16_node_insert_off.dat
+++ b/release/datafiles/blender_icons16/icon16_node_insert_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_node_insert_on.dat b/release/datafiles/blender_icons16/icon16_node_insert_on.dat
index d876a3fc121..d36948508ec 100644
--- a/release/datafiles/blender_icons16/icon16_node_insert_on.dat
+++ b/release/datafiles/blender_icons16/icon16_node_insert_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_node_insert_top.dat b/release/datafiles/blender_icons16/icon16_node_insert_top.dat
new file mode 100644
index 00000000000..0085af4c972
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_node_insert_top.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_node_material.dat b/release/datafiles/blender_icons16/icon16_node_material.dat
new file mode 100644
index 00000000000..434f9e6d464
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_node_material.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_node_sel.dat b/release/datafiles/blender_icons16/icon16_node_sel.dat
index 2048232bc1c..85e448074a5 100644
--- a/release/datafiles/blender_icons16/icon16_node_sel.dat
+++ b/release/datafiles/blender_icons16/icon16_node_sel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_node_side.dat b/release/datafiles/blender_icons16/icon16_node_side.dat
new file mode 100644
index 00000000000..b27b450c66e
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_node_side.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_node_texture.dat b/release/datafiles/blender_icons16/icon16_node_texture.dat
new file mode 100644
index 00000000000..0e2bd496690
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_node_texture.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_node_top.dat b/release/datafiles/blender_icons16/icon16_node_top.dat
new file mode 100644
index 00000000000..0085af4c972
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_node_top.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_nodetree.dat b/release/datafiles/blender_icons16/icon16_nodetree.dat
index 19fb444affc..d537c3c5223 100644
--- a/release/datafiles/blender_icons16/icon16_nodetree.dat
+++ b/release/datafiles/blender_icons16/icon16_nodetree.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_normalize_fcurves.dat b/release/datafiles/blender_icons16/icon16_normalize_fcurves.dat
index fe118a23d79..3ae303741c6 100644
--- a/release/datafiles/blender_icons16/icon16_normalize_fcurves.dat
+++ b/release/datafiles/blender_icons16/icon16_normalize_fcurves.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_normals_face.dat b/release/datafiles/blender_icons16/icon16_normals_face.dat
new file mode 100644
index 00000000000..0964283cffa
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_normals_face.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_normals_vertex.dat b/release/datafiles/blender_icons16/icon16_normals_vertex.dat
new file mode 100644
index 00000000000..9ec76035abc
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_normals_vertex.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_normals_vertex_face.dat b/release/datafiles/blender_icons16/icon16_normals_vertex_face.dat
new file mode 100644
index 00000000000..c40fa2db137
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_normals_vertex_face.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_object_data.dat b/release/datafiles/blender_icons16/icon16_object_data.dat
index f75d1e3503f..b9ac24f0253 100644
--- a/release/datafiles/blender_icons16/icon16_object_data.dat
+++ b/release/datafiles/blender_icons16/icon16_object_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_object_datamode.dat b/release/datafiles/blender_icons16/icon16_object_datamode.dat
index e6febc024e4..fad52577f1a 100644
--- a/release/datafiles/blender_icons16/icon16_object_datamode.dat
+++ b/release/datafiles/blender_icons16/icon16_object_datamode.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_object_origin.dat b/release/datafiles/blender_icons16/icon16_object_origin.dat
index 67078427366..932280fd009 100644
--- a/release/datafiles/blender_icons16/icon16_object_origin.dat
+++ b/release/datafiles/blender_icons16/icon16_object_origin.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_onionskin_off.dat b/release/datafiles/blender_icons16/icon16_onionskin_off.dat
new file mode 100644
index 00000000000..f6d20c7ea61
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_onionskin_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_onionskin_on.dat b/release/datafiles/blender_icons16/icon16_onionskin_on.dat
new file mode 100644
index 00000000000..f7a6cf28803
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_onionskin_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_oops.dat b/release/datafiles/blender_icons16/icon16_oops.dat
deleted file mode 100644
index 8fe6757c662..00000000000
--- a/release/datafiles/blender_icons16/icon16_oops.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_open_recent.dat b/release/datafiles/blender_icons16/icon16_open_recent.dat
index 3c5e358a703..40a0e332db3 100644
--- a/release/datafiles/blender_icons16/icon16_open_recent.dat
+++ b/release/datafiles/blender_icons16/icon16_open_recent.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_orientation_gimbal.dat b/release/datafiles/blender_icons16/icon16_orientation_gimbal.dat
new file mode 100644
index 00000000000..cb68ccb31d4
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_orientation_gimbal.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_orientation_global.dat b/release/datafiles/blender_icons16/icon16_orientation_global.dat
new file mode 100644
index 00000000000..a88db70acb9
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_orientation_global.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_orientation_local.dat b/release/datafiles/blender_icons16/icon16_orientation_local.dat
new file mode 100644
index 00000000000..13b1867263e
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_orientation_local.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_orientation_normal.dat b/release/datafiles/blender_icons16/icon16_orientation_normal.dat
new file mode 100644
index 00000000000..c59f7cd74ab
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_orientation_normal.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_orientation_view.dat b/release/datafiles/blender_icons16/icon16_orientation_view.dat
new file mode 100644
index 00000000000..edee4901519
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_orientation_view.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_orphan_data.dat b/release/datafiles/blender_icons16/icon16_orphan_data.dat
new file mode 100644
index 00000000000..fa5cddaadfe
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_orphan_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ortho.dat b/release/datafiles/blender_icons16/icon16_ortho.dat
deleted file mode 100644
index 31bb2e70fad..00000000000
--- a/release/datafiles/blender_icons16/icon16_ortho.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner.dat b/release/datafiles/blender_icons16/icon16_outliner.dat
new file mode 100644
index 00000000000..5fffb9ad77b
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_outliner.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_data_armature.dat b/release/datafiles/blender_icons16/icon16_outliner_data_armature.dat
index a990c1ef4e5..ecbace35a57 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_data_armature.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_data_armature.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_data_camera.dat b/release/datafiles/blender_icons16/icon16_outliner_data_camera.dat
index f36db07af63..f7a51e2add0 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_data_camera.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_data_camera.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_data_curve.dat b/release/datafiles/blender_icons16/icon16_outliner_data_curve.dat
index 2f7c791160d..897d4eb4eac 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_data_curve.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_data_curve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_data_empty.dat b/release/datafiles/blender_icons16/icon16_outliner_data_empty.dat
index 24efbe73c9d..718c51586fc 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_data_empty.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_data_empty.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_data_font.dat b/release/datafiles/blender_icons16/icon16_outliner_data_font.dat
index 679fb0a0653..99aecf98ac1 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_data_font.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_data_font.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_data_greasepencil.dat b/release/datafiles/blender_icons16/icon16_outliner_data_greasepencil.dat
index 77adaf114f0..0825c27d966 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_data_greasepencil.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_data_greasepencil.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_data_lamp.dat b/release/datafiles/blender_icons16/icon16_outliner_data_lamp.dat
deleted file mode 100644
index 51844e30cad..00000000000
--- a/release/datafiles/blender_icons16/icon16_outliner_data_lamp.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_data_lattice.dat b/release/datafiles/blender_icons16/icon16_outliner_data_lattice.dat
index 75664abb914..0d5cddb5ac1 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_data_lattice.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_data_lattice.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_data_light.dat b/release/datafiles/blender_icons16/icon16_outliner_data_light.dat
new file mode 100644
index 00000000000..18a5291b91f
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_outliner_data_light.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_data_mesh.dat b/release/datafiles/blender_icons16/icon16_outliner_data_mesh.dat
index 2f8297255f8..6793b1ec845 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_data_mesh.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_data_mesh.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_data_meta.dat b/release/datafiles/blender_icons16/icon16_outliner_data_meta.dat
index b7894a23290..8003132ff1c 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_data_meta.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_data_meta.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_data_pose.dat b/release/datafiles/blender_icons16/icon16_outliner_data_pose.dat
index 58373d5282f..1a13a01a820 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_data_pose.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_data_pose.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_data_speaker.dat b/release/datafiles/blender_icons16/icon16_outliner_data_speaker.dat
index 17e8fbe898a..8b7375af46d 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_data_speaker.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_data_speaker.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_data_surface.dat b/release/datafiles/blender_icons16/icon16_outliner_data_surface.dat
index 98a30069469..4036ef87b58 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_data_surface.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_data_surface.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_armature.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_armature.dat
index 303fbad9f1e..48b2ca9043a 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_ob_armature.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_armature.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_camera.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_camera.dat
index 92b784d7f24..5412b41fed8 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_ob_camera.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_camera.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_curve.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_curve.dat
index d984932deb8..f1a0b7fd822 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_ob_curve.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_curve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_empty.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_empty.dat
index 899c7457d9a..af6ca0a74ca 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_ob_empty.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_empty.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_font.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_font.dat
index 44149b528ab..e457f7595ba 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_ob_font.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_font.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_force_field.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_force_field.dat
index 59817bce4de..32905463b06 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_ob_force_field.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_force_field.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_greasepencil.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_greasepencil.dat
index ded4b49f959..2460c9ea9fa 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_ob_greasepencil.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_greasepencil.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_group_instance.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_group_instance.dat
index 072c049c941..eadb3c919ed 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_ob_group_instance.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_group_instance.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_image.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_image.dat
new file mode 100644
index 00000000000..658e3237aba
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_image.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_lamp.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_lamp.dat
deleted file mode 100644
index 80a893f6a63..00000000000
--- a/release/datafiles/blender_icons16/icon16_outliner_ob_lamp.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_lattice.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_lattice.dat
index 0a154f71531..0ee07f3bdb7 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_ob_lattice.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_lattice.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_light.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_light.dat
new file mode 100644
index 00000000000..2237df96763
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_light.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_lightprobe.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_lightprobe.dat
index 83177ee1b15..c69fff23dfd 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_ob_lightprobe.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_lightprobe.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_mesh.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_mesh.dat
index ca12fac56c9..5698007b193 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_ob_mesh.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_mesh.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_meta.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_meta.dat
index c72e6ea0396..eaf770f363e 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_ob_meta.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_meta.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_speaker.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_speaker.dat
index 090c3f36eb3..c0da90c267e 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_ob_speaker.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_speaker.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_outliner_ob_surface.dat b/release/datafiles/blender_icons16/icon16_outliner_ob_surface.dat
index 7287e0e1963..e9874a24f69 100644
--- a/release/datafiles/blender_icons16/icon16_outliner_ob_surface.dat
+++ b/release/datafiles/blender_icons16/icon16_outliner_ob_surface.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_overlay.dat b/release/datafiles/blender_icons16/icon16_overlay.dat
index a7ae9d89789..f675279defd 100644
--- a/release/datafiles/blender_icons16/icon16_overlay.dat
+++ b/release/datafiles/blender_icons16/icon16_overlay.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_package.dat b/release/datafiles/blender_icons16/icon16_package.dat
index cc55c32c449..d9336fce24c 100644
--- a/release/datafiles/blender_icons16/icon16_package.dat
+++ b/release/datafiles/blender_icons16/icon16_package.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_panel_close.dat b/release/datafiles/blender_icons16/icon16_panel_close.dat
index 64e0e67104d..65316edbbf0 100644
--- a/release/datafiles/blender_icons16/icon16_panel_close.dat
+++ b/release/datafiles/blender_icons16/icon16_panel_close.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_particle_data.dat b/release/datafiles/blender_icons16/icon16_particle_data.dat
index e19183db3e5..fec6c73fda6 100644
--- a/release/datafiles/blender_icons16/icon16_particle_data.dat
+++ b/release/datafiles/blender_icons16/icon16_particle_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_particle_path.dat b/release/datafiles/blender_icons16/icon16_particle_path.dat
index c544867df12..74bb45008f3 100644
--- a/release/datafiles/blender_icons16/icon16_particle_path.dat
+++ b/release/datafiles/blender_icons16/icon16_particle_path.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_particle_point.dat b/release/datafiles/blender_icons16/icon16_particle_point.dat
index 1863c9f7dc6..945e8218efd 100644
--- a/release/datafiles/blender_icons16/icon16_particle_point.dat
+++ b/release/datafiles/blender_icons16/icon16_particle_point.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_particle_tip.dat b/release/datafiles/blender_icons16/icon16_particle_tip.dat
index e9884ca1c04..d75a40a8e33 100644
--- a/release/datafiles/blender_icons16/icon16_particle_tip.dat
+++ b/release/datafiles/blender_icons16/icon16_particle_tip.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_particlemode.dat b/release/datafiles/blender_icons16/icon16_particlemode.dat
index df2f4796ca0..21dac434bc9 100644
--- a/release/datafiles/blender_icons16/icon16_particlemode.dat
+++ b/release/datafiles/blender_icons16/icon16_particlemode.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_particles.dat b/release/datafiles/blender_icons16/icon16_particles.dat
index 1567f948f8a..23f9d049c2b 100644
--- a/release/datafiles/blender_icons16/icon16_particles.dat
+++ b/release/datafiles/blender_icons16/icon16_particles.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_pastedown.dat b/release/datafiles/blender_icons16/icon16_pastedown.dat
index d1cda2b61ad..fdc012733cd 100644
--- a/release/datafiles/blender_icons16/icon16_pastedown.dat
+++ b/release/datafiles/blender_icons16/icon16_pastedown.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_pasteflipdown.dat b/release/datafiles/blender_icons16/icon16_pasteflipdown.dat
index a6a7207a147..14f6fd8cf8f 100644
--- a/release/datafiles/blender_icons16/icon16_pasteflipdown.dat
+++ b/release/datafiles/blender_icons16/icon16_pasteflipdown.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_pasteflipup.dat b/release/datafiles/blender_icons16/icon16_pasteflipup.dat
index 227e2e7cb92..621393cca22 100644
--- a/release/datafiles/blender_icons16/icon16_pasteflipup.dat
+++ b/release/datafiles/blender_icons16/icon16_pasteflipup.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_pause.dat b/release/datafiles/blender_icons16/icon16_pause.dat
index 00a1b1377a9..6365b943f46 100644
--- a/release/datafiles/blender_icons16/icon16_pause.dat
+++ b/release/datafiles/blender_icons16/icon16_pause.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_physics.dat b/release/datafiles/blender_icons16/icon16_physics.dat
index 92662c2acb0..9f16b4ece6d 100644
--- a/release/datafiles/blender_icons16/icon16_physics.dat
+++ b/release/datafiles/blender_icons16/icon16_physics.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_pinned.dat b/release/datafiles/blender_icons16/icon16_pinned.dat
index 0d5d8fd51d4..c5a7b07a996 100644
--- a/release/datafiles/blender_icons16/icon16_pinned.dat
+++ b/release/datafiles/blender_icons16/icon16_pinned.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_pivot_active.dat b/release/datafiles/blender_icons16/icon16_pivot_active.dat
new file mode 100644
index 00000000000..2e3d5d05c86
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_pivot_active.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_pivot_boundbox.dat b/release/datafiles/blender_icons16/icon16_pivot_boundbox.dat
new file mode 100644
index 00000000000..d7401d77993
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_pivot_boundbox.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_pivot_cursor.dat b/release/datafiles/blender_icons16/icon16_pivot_cursor.dat
new file mode 100644
index 00000000000..8fd4e276095
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_pivot_cursor.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_pivot_individual.dat b/release/datafiles/blender_icons16/icon16_pivot_individual.dat
new file mode 100644
index 00000000000..a6dd2c50bce
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_pivot_individual.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_pivot_median.dat b/release/datafiles/blender_icons16/icon16_pivot_median.dat
new file mode 100644
index 00000000000..49c8833bd0f
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_pivot_median.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_play.dat b/release/datafiles/blender_icons16/icon16_play.dat
index ef116ab5063..5e6565543cc 100644
--- a/release/datafiles/blender_icons16/icon16_play.dat
+++ b/release/datafiles/blender_icons16/icon16_play.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_play_audio.dat b/release/datafiles/blender_icons16/icon16_play_audio.dat
deleted file mode 100644
index f0207c5211b..00000000000
--- a/release/datafiles/blender_icons16/icon16_play_audio.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_play_reverse.dat b/release/datafiles/blender_icons16/icon16_play_reverse.dat
index ba47dcd5b5a..93e160bda1b 100644
--- a/release/datafiles/blender_icons16/icon16_play_reverse.dat
+++ b/release/datafiles/blender_icons16/icon16_play_reverse.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_plug.dat b/release/datafiles/blender_icons16/icon16_plug.dat
index 409c50b4215..198f47a35fc 100644
--- a/release/datafiles/blender_icons16/icon16_plug.dat
+++ b/release/datafiles/blender_icons16/icon16_plug.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_plugin.dat b/release/datafiles/blender_icons16/icon16_plugin.dat
index f1c2a9eec0b..815fce6c6f7 100644
--- a/release/datafiles/blender_icons16/icon16_plugin.dat
+++ b/release/datafiles/blender_icons16/icon16_plugin.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_plus.dat b/release/datafiles/blender_icons16/icon16_plus.dat
index a0944d2d4c7..77b3b6893e9 100644
--- a/release/datafiles/blender_icons16/icon16_plus.dat
+++ b/release/datafiles/blender_icons16/icon16_plus.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_pmarker.dat b/release/datafiles/blender_icons16/icon16_pmarker.dat
index 40f6b01e686..bf454f73ee4 100644
--- a/release/datafiles/blender_icons16/icon16_pmarker.dat
+++ b/release/datafiles/blender_icons16/icon16_pmarker.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_pmarker_act.dat b/release/datafiles/blender_icons16/icon16_pmarker_act.dat
index 13a43997cfa..452393698da 100644
--- a/release/datafiles/blender_icons16/icon16_pmarker_act.dat
+++ b/release/datafiles/blender_icons16/icon16_pmarker_act.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_pmarker_sel.dat b/release/datafiles/blender_icons16/icon16_pmarker_sel.dat
index f1578e529b7..17f065a75a5 100644
--- a/release/datafiles/blender_icons16/icon16_pmarker_sel.dat
+++ b/release/datafiles/blender_icons16/icon16_pmarker_sel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_pose_data.dat b/release/datafiles/blender_icons16/icon16_pose_data.dat
index 083e0117844..b15edbbe82d 100644
--- a/release/datafiles/blender_icons16/icon16_pose_data.dat
+++ b/release/datafiles/blender_icons16/icon16_pose_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_pose_hlt.dat b/release/datafiles/blender_icons16/icon16_pose_hlt.dat
index 0d45877cd0b..fd3fd905d21 100644
--- a/release/datafiles/blender_icons16/icon16_pose_hlt.dat
+++ b/release/datafiles/blender_icons16/icon16_pose_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_potato.dat b/release/datafiles/blender_icons16/icon16_potato.dat
deleted file mode 100644
index fe38c920223..00000000000
--- a/release/datafiles/blender_icons16/icon16_potato.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_preferences.dat b/release/datafiles/blender_icons16/icon16_preferences.dat
index dc930caed0b..cef9a22d53d 100644
--- a/release/datafiles/blender_icons16/icon16_preferences.dat
+++ b/release/datafiles/blender_icons16/icon16_preferences.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_preset.dat b/release/datafiles/blender_icons16/icon16_preset.dat
index b56e06b4607..02a197a49cc 100644
--- a/release/datafiles/blender_icons16/icon16_preset.dat
+++ b/release/datafiles/blender_icons16/icon16_preset.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_preset_new.dat b/release/datafiles/blender_icons16/icon16_preset_new.dat
new file mode 100644
index 00000000000..9df53a293fe
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_preset_new.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_prev_keyframe.dat b/release/datafiles/blender_icons16/icon16_prev_keyframe.dat
index 1e4961bd3c3..84bfdd9c6b3 100644
--- a/release/datafiles/blender_icons16/icon16_prev_keyframe.dat
+++ b/release/datafiles/blender_icons16/icon16_prev_keyframe.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_preview_range.dat b/release/datafiles/blender_icons16/icon16_preview_range.dat
index ca23194fe3d..62876c186af 100644
--- a/release/datafiles/blender_icons16/icon16_preview_range.dat
+++ b/release/datafiles/blender_icons16/icon16_preview_range.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_prop_con.dat b/release/datafiles/blender_icons16/icon16_prop_con.dat
index 80c54c2e75d..31afd084f3b 100644
--- a/release/datafiles/blender_icons16/icon16_prop_con.dat
+++ b/release/datafiles/blender_icons16/icon16_prop_con.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_prop_off.dat b/release/datafiles/blender_icons16/icon16_prop_off.dat
index c5e42496a0d..18a672691e9 100644
--- a/release/datafiles/blender_icons16/icon16_prop_off.dat
+++ b/release/datafiles/blender_icons16/icon16_prop_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_prop_on.dat b/release/datafiles/blender_icons16/icon16_prop_on.dat
index c3d246b74d2..db133d770b1 100644
--- a/release/datafiles/blender_icons16/icon16_prop_on.dat
+++ b/release/datafiles/blender_icons16/icon16_prop_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_properties.dat b/release/datafiles/blender_icons16/icon16_properties.dat
new file mode 100644
index 00000000000..52cbfa12f24
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_properties.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_question.dat b/release/datafiles/blender_icons16/icon16_question.dat
index 4dfc9725055..3e9ac34483d 100644
--- a/release/datafiles/blender_icons16/icon16_question.dat
+++ b/release/datafiles/blender_icons16/icon16_question.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_quit.dat b/release/datafiles/blender_icons16/icon16_quit.dat
index 9adabb9d4db..17487e499ea 100644
--- a/release/datafiles/blender_icons16/icon16_quit.dat
+++ b/release/datafiles/blender_icons16/icon16_quit.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_radio.dat b/release/datafiles/blender_icons16/icon16_radio.dat
index f478d62724f..387081d8f42 100644
--- a/release/datafiles/blender_icons16/icon16_radio.dat
+++ b/release/datafiles/blender_icons16/icon16_radio.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_radiobut_off.dat b/release/datafiles/blender_icons16/icon16_radiobut_off.dat
index b72c5542226..45836d102b2 100644
--- a/release/datafiles/blender_icons16/icon16_radiobut_off.dat
+++ b/release/datafiles/blender_icons16/icon16_radiobut_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_radiobut_on.dat b/release/datafiles/blender_icons16/icon16_radiobut_on.dat
index d310d13df95..32391d84261 100644
--- a/release/datafiles/blender_icons16/icon16_radiobut_on.dat
+++ b/release/datafiles/blender_icons16/icon16_radiobut_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_rec.dat b/release/datafiles/blender_icons16/icon16_rec.dat
index b26c529f9b8..6610629cf01 100644
--- a/release/datafiles/blender_icons16/icon16_rec.dat
+++ b/release/datafiles/blender_icons16/icon16_rec.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_recover_auto.dat b/release/datafiles/blender_icons16/icon16_recover_auto.dat
deleted file mode 100644
index b41e63d7792..00000000000
--- a/release/datafiles/blender_icons16/icon16_recover_auto.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_recover_last.dat b/release/datafiles/blender_icons16/icon16_recover_last.dat
index 2b0994de00d..0855b47919a 100644
--- a/release/datafiles/blender_icons16/icon16_recover_last.dat
+++ b/release/datafiles/blender_icons16/icon16_recover_last.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_remove.dat b/release/datafiles/blender_icons16/icon16_remove.dat
new file mode 100644
index 00000000000..e0b1861cd87
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_remove.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_render_animation.dat b/release/datafiles/blender_icons16/icon16_render_animation.dat
index 7fe38b95337..29d5508665c 100644
--- a/release/datafiles/blender_icons16/icon16_render_animation.dat
+++ b/release/datafiles/blender_icons16/icon16_render_animation.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_render_region.dat b/release/datafiles/blender_icons16/icon16_render_region.dat
index afa3a8aec93..6e6a57d8f0a 100644
--- a/release/datafiles/blender_icons16/icon16_render_region.dat
+++ b/release/datafiles/blender_icons16/icon16_render_region.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_render_result.dat b/release/datafiles/blender_icons16/icon16_render_result.dat
index 1609ce5cb2b..bfaa06fa74a 100644
--- a/release/datafiles/blender_icons16/icon16_render_result.dat
+++ b/release/datafiles/blender_icons16/icon16_render_result.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_render_still.dat b/release/datafiles/blender_icons16/icon16_render_still.dat
index dc419d26dc7..1f1e8c951a0 100644
--- a/release/datafiles/blender_icons16/icon16_render_still.dat
+++ b/release/datafiles/blender_icons16/icon16_render_still.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_renderlayers.dat b/release/datafiles/blender_icons16/icon16_renderlayers.dat
index e8281d5329d..0a32abd2108 100644
--- a/release/datafiles/blender_icons16/icon16_renderlayers.dat
+++ b/release/datafiles/blender_icons16/icon16_renderlayers.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_restrict_color_off.dat b/release/datafiles/blender_icons16/icon16_restrict_color_off.dat
index d313539e3c5..4e1726d5d3e 100644
--- a/release/datafiles/blender_icons16/icon16_restrict_color_off.dat
+++ b/release/datafiles/blender_icons16/icon16_restrict_color_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_restrict_color_on.dat b/release/datafiles/blender_icons16/icon16_restrict_color_on.dat
index bb7782bb42a..bd5b7e0cd39 100644
--- a/release/datafiles/blender_icons16/icon16_restrict_color_on.dat
+++ b/release/datafiles/blender_icons16/icon16_restrict_color_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_restrict_render_off.dat b/release/datafiles/blender_icons16/icon16_restrict_render_off.dat
index a10a002774f..8f448345d13 100644
--- a/release/datafiles/blender_icons16/icon16_restrict_render_off.dat
+++ b/release/datafiles/blender_icons16/icon16_restrict_render_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_restrict_render_on.dat b/release/datafiles/blender_icons16/icon16_restrict_render_on.dat
index 0d2f67fdbf7..f62bbd408a5 100644
--- a/release/datafiles/blender_icons16/icon16_restrict_render_on.dat
+++ b/release/datafiles/blender_icons16/icon16_restrict_render_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_restrict_select_off.dat b/release/datafiles/blender_icons16/icon16_restrict_select_off.dat
index ed8c3de0ee4..a7c55e6b522 100644
--- a/release/datafiles/blender_icons16/icon16_restrict_select_off.dat
+++ b/release/datafiles/blender_icons16/icon16_restrict_select_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_restrict_select_on.dat b/release/datafiles/blender_icons16/icon16_restrict_select_on.dat
index 492bcaa1f60..226a64d2b51 100644
--- a/release/datafiles/blender_icons16/icon16_restrict_select_on.dat
+++ b/release/datafiles/blender_icons16/icon16_restrict_select_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_restrict_view_off.dat b/release/datafiles/blender_icons16/icon16_restrict_view_off.dat
index 78e529fdf75..4b2e00677d8 100644
--- a/release/datafiles/blender_icons16/icon16_restrict_view_off.dat
+++ b/release/datafiles/blender_icons16/icon16_restrict_view_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_restrict_view_on.dat b/release/datafiles/blender_icons16/icon16_restrict_view_on.dat
index 24d58a126a3..36d1de55f9e 100644
--- a/release/datafiles/blender_icons16/icon16_restrict_view_on.dat
+++ b/release/datafiles/blender_icons16/icon16_restrict_view_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_retopo.dat b/release/datafiles/blender_icons16/icon16_retopo.dat
index 54fb29b17b8..786600d06fa 100644
--- a/release/datafiles/blender_icons16/icon16_retopo.dat
+++ b/release/datafiles/blender_icons16/icon16_retopo.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_rew.dat b/release/datafiles/blender_icons16/icon16_rew.dat
index ca19f51f54e..9f130f068d9 100644
--- a/release/datafiles/blender_icons16/icon16_rew.dat
+++ b/release/datafiles/blender_icons16/icon16_rew.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_rightarrow.dat b/release/datafiles/blender_icons16/icon16_rightarrow.dat
index 305f27b0b50..5afc1ec3f48 100644
--- a/release/datafiles/blender_icons16/icon16_rightarrow.dat
+++ b/release/datafiles/blender_icons16/icon16_rightarrow.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_rightarrow_thin.dat b/release/datafiles/blender_icons16/icon16_rightarrow_thin.dat
index fbdb5082282..7da39bc349b 100644
--- a/release/datafiles/blender_icons16/icon16_rightarrow_thin.dat
+++ b/release/datafiles/blender_icons16/icon16_rightarrow_thin.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_rna.dat b/release/datafiles/blender_icons16/icon16_rna.dat
index ac1a10db7ae..f38ea452a86 100644
--- a/release/datafiles/blender_icons16/icon16_rna.dat
+++ b/release/datafiles/blender_icons16/icon16_rna.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_rna_add.dat b/release/datafiles/blender_icons16/icon16_rna_add.dat
index dbb93986c57..8a6a5035f80 100644
--- a/release/datafiles/blender_icons16/icon16_rna_add.dat
+++ b/release/datafiles/blender_icons16/icon16_rna_add.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_rndcurve.dat b/release/datafiles/blender_icons16/icon16_rndcurve.dat
index fc140f5e7df..6bd92b1493d 100644
--- a/release/datafiles/blender_icons16/icon16_rndcurve.dat
+++ b/release/datafiles/blender_icons16/icon16_rndcurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_rootcurve.dat b/release/datafiles/blender_icons16/icon16_rootcurve.dat
index 0e4fa7f9188..17a634d2a44 100644
--- a/release/datafiles/blender_icons16/icon16_rootcurve.dat
+++ b/release/datafiles/blender_icons16/icon16_rootcurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_rotactive.dat b/release/datafiles/blender_icons16/icon16_rotactive.dat
deleted file mode 100644
index 9022b644667..00000000000
--- a/release/datafiles/blender_icons16/icon16_rotactive.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_rotate.dat b/release/datafiles/blender_icons16/icon16_rotate.dat
deleted file mode 100644
index 22dc8331b47..00000000000
--- a/release/datafiles/blender_icons16/icon16_rotate.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_rotatecenter.dat b/release/datafiles/blender_icons16/icon16_rotatecenter.dat
deleted file mode 100644
index 8ed7e64a41f..00000000000
--- a/release/datafiles/blender_icons16/icon16_rotatecenter.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_rotatecollection.dat b/release/datafiles/blender_icons16/icon16_rotatecollection.dat
deleted file mode 100644
index bfb6274cd74..00000000000
--- a/release/datafiles/blender_icons16/icon16_rotatecollection.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_save_as.dat b/release/datafiles/blender_icons16/icon16_save_as.dat
deleted file mode 100644
index d08eca9be9f..00000000000
--- a/release/datafiles/blender_icons16/icon16_save_as.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_save_copy.dat b/release/datafiles/blender_icons16/icon16_save_copy.dat
deleted file mode 100644
index 8d4171acb5b..00000000000
--- a/release/datafiles/blender_icons16/icon16_save_copy.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_save_prefs.dat b/release/datafiles/blender_icons16/icon16_save_prefs.dat
deleted file mode 100644
index 850440ec577..00000000000
--- a/release/datafiles/blender_icons16/icon16_save_prefs.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_scene.dat b/release/datafiles/blender_icons16/icon16_scene.dat
index 52e4ed4a6fa..bc903c1bee7 100644
--- a/release/datafiles/blender_icons16/icon16_scene.dat
+++ b/release/datafiles/blender_icons16/icon16_scene.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_scene_data.dat b/release/datafiles/blender_icons16/icon16_scene_data.dat
index 06bad7b75d4..99f06847f65 100644
--- a/release/datafiles/blender_icons16/icon16_scene_data.dat
+++ b/release/datafiles/blender_icons16/icon16_scene_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_screen_back.dat b/release/datafiles/blender_icons16/icon16_screen_back.dat
index fdda215c934..37b85ae0510 100644
--- a/release/datafiles/blender_icons16/icon16_screen_back.dat
+++ b/release/datafiles/blender_icons16/icon16_screen_back.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_script.dat b/release/datafiles/blender_icons16/icon16_script.dat
index 082e85db841..277b11cd49b 100644
--- a/release/datafiles/blender_icons16/icon16_script.dat
+++ b/release/datafiles/blender_icons16/icon16_script.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_scriptplugins.dat b/release/datafiles/blender_icons16/icon16_scriptplugins.dat
index 6831323cdc5..0a885b87f45 100644
--- a/release/datafiles/blender_icons16/icon16_scriptplugins.dat
+++ b/release/datafiles/blender_icons16/icon16_scriptplugins.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_scriptwin.dat b/release/datafiles/blender_icons16/icon16_scriptwin.dat
deleted file mode 100644
index 66fb3193ce2..00000000000
--- a/release/datafiles/blender_icons16/icon16_scriptwin.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_sculpt_dyntopo.dat b/release/datafiles/blender_icons16/icon16_sculpt_dyntopo.dat
new file mode 100644
index 00000000000..89dc93621a4
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_sculpt_dyntopo.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_sculptmode_hlt.dat b/release/datafiles/blender_icons16/icon16_sculptmode_hlt.dat
index b7de32fde56..ccde8b996ae 100644
--- a/release/datafiles/blender_icons16/icon16_sculptmode_hlt.dat
+++ b/release/datafiles/blender_icons16/icon16_sculptmode_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_sealed.dat b/release/datafiles/blender_icons16/icon16_sealed.dat
new file mode 100644
index 00000000000..2c6e3bac48f
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_sealed.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_seq_chroma_scope.dat b/release/datafiles/blender_icons16/icon16_seq_chroma_scope.dat
index cf00252f811..77e97fc8698 100644
--- a/release/datafiles/blender_icons16/icon16_seq_chroma_scope.dat
+++ b/release/datafiles/blender_icons16/icon16_seq_chroma_scope.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_seq_histogram.dat b/release/datafiles/blender_icons16/icon16_seq_histogram.dat
index 6fa0d4e1084..4f3f0719fca 100644
--- a/release/datafiles/blender_icons16/icon16_seq_histogram.dat
+++ b/release/datafiles/blender_icons16/icon16_seq_histogram.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_seq_luma_waveform.dat b/release/datafiles/blender_icons16/icon16_seq_luma_waveform.dat
index 597344330b0..01d218514f3 100644
--- a/release/datafiles/blender_icons16/icon16_seq_luma_waveform.dat
+++ b/release/datafiles/blender_icons16/icon16_seq_luma_waveform.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_seq_preview.dat b/release/datafiles/blender_icons16/icon16_seq_preview.dat
index cc5da015650..1ecff079503 100644
--- a/release/datafiles/blender_icons16/icon16_seq_preview.dat
+++ b/release/datafiles/blender_icons16/icon16_seq_preview.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_seq_sequencer.dat b/release/datafiles/blender_icons16/icon16_seq_sequencer.dat
index 7c7e336b961..09775409313 100644
--- a/release/datafiles/blender_icons16/icon16_seq_sequencer.dat
+++ b/release/datafiles/blender_icons16/icon16_seq_sequencer.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_seq_splitview.dat b/release/datafiles/blender_icons16/icon16_seq_splitview.dat
index c42dd78af30..e67e6b8b7b6 100644
--- a/release/datafiles/blender_icons16/icon16_seq_splitview.dat
+++ b/release/datafiles/blender_icons16/icon16_seq_splitview.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_sequence.dat b/release/datafiles/blender_icons16/icon16_sequence.dat
index cd15ab6c3c2..ccd2b223343 100644
--- a/release/datafiles/blender_icons16/icon16_sequence.dat
+++ b/release/datafiles/blender_icons16/icon16_sequence.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_settings.dat b/release/datafiles/blender_icons16/icon16_settings.dat
index d48e0283554..eb159246f86 100644
--- a/release/datafiles/blender_icons16/icon16_settings.dat
+++ b/release/datafiles/blender_icons16/icon16_settings.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_shaderfx.dat b/release/datafiles/blender_icons16/icon16_shaderfx.dat
index df43d56ae6a..9064969f3ed 100644
--- a/release/datafiles/blender_icons16/icon16_shaderfx.dat
+++ b/release/datafiles/blender_icons16/icon16_shaderfx.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_shading_bbox.dat b/release/datafiles/blender_icons16/icon16_shading_bbox.dat
new file mode 100644
index 00000000000..4eccb4c5dc2
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_shading_bbox.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_shading_rendered.dat b/release/datafiles/blender_icons16/icon16_shading_rendered.dat
new file mode 100644
index 00000000000..b50927f5f55
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_shading_rendered.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_shading_solid.dat b/release/datafiles/blender_icons16/icon16_shading_solid.dat
new file mode 100644
index 00000000000..48886eb8282
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_shading_solid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_shading_texture.dat b/release/datafiles/blender_icons16/icon16_shading_texture.dat
new file mode 100644
index 00000000000..6e6555dff56
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_shading_texture.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_shading_wire.dat b/release/datafiles/blender_icons16/icon16_shading_wire.dat
new file mode 100644
index 00000000000..bf2ea80cdb5
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_shading_wire.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_shapekey_data.dat b/release/datafiles/blender_icons16/icon16_shapekey_data.dat
index c45a8b143d3..27d71c66886 100644
--- a/release/datafiles/blender_icons16/icon16_shapekey_data.dat
+++ b/release/datafiles/blender_icons16/icon16_shapekey_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_sharpcurve.dat b/release/datafiles/blender_icons16/icon16_sharpcurve.dat
index d55afa29c10..7d5e1c47349 100644
--- a/release/datafiles/blender_icons16/icon16_sharpcurve.dat
+++ b/release/datafiles/blender_icons16/icon16_sharpcurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_shortdisplay.dat b/release/datafiles/blender_icons16/icon16_shortdisplay.dat
index ff8daa3a563..7d60845079b 100644
--- a/release/datafiles/blender_icons16/icon16_shortdisplay.dat
+++ b/release/datafiles/blender_icons16/icon16_shortdisplay.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_small_caps.dat b/release/datafiles/blender_icons16/icon16_small_caps.dat
new file mode 100644
index 00000000000..c8997b37848
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_small_caps.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_smooth.dat b/release/datafiles/blender_icons16/icon16_smooth.dat
deleted file mode 100644
index 829b3ef8bdf..00000000000
--- a/release/datafiles/blender_icons16/icon16_smooth.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_smoothcurve.dat b/release/datafiles/blender_icons16/icon16_smoothcurve.dat
index dc2b945f196..e40d98fbc72 100644
--- a/release/datafiles/blender_icons16/icon16_smoothcurve.dat
+++ b/release/datafiles/blender_icons16/icon16_smoothcurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_snap_edge.dat b/release/datafiles/blender_icons16/icon16_snap_edge.dat
index 60cebada8c8..56f0d19c497 100644
--- a/release/datafiles/blender_icons16/icon16_snap_edge.dat
+++ b/release/datafiles/blender_icons16/icon16_snap_edge.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_snap_face.dat b/release/datafiles/blender_icons16/icon16_snap_face.dat
index 4ea0282196e..c27bb557e85 100644
--- a/release/datafiles/blender_icons16/icon16_snap_face.dat
+++ b/release/datafiles/blender_icons16/icon16_snap_face.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_snap_grid.dat b/release/datafiles/blender_icons16/icon16_snap_grid.dat
index 4def9b8df2e..ff1921cc320 100644
--- a/release/datafiles/blender_icons16/icon16_snap_grid.dat
+++ b/release/datafiles/blender_icons16/icon16_snap_grid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_snap_increment.dat b/release/datafiles/blender_icons16/icon16_snap_increment.dat
index 5216afb6d72..053091bf088 100644
--- a/release/datafiles/blender_icons16/icon16_snap_increment.dat
+++ b/release/datafiles/blender_icons16/icon16_snap_increment.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_snap_normal.dat b/release/datafiles/blender_icons16/icon16_snap_normal.dat
index 36265e4b730..e30b9f47008 100644
--- a/release/datafiles/blender_icons16/icon16_snap_normal.dat
+++ b/release/datafiles/blender_icons16/icon16_snap_normal.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_snap_off.dat b/release/datafiles/blender_icons16/icon16_snap_off.dat
index d447f2805d4..6884d1d239c 100644
--- a/release/datafiles/blender_icons16/icon16_snap_off.dat
+++ b/release/datafiles/blender_icons16/icon16_snap_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_snap_on.dat b/release/datafiles/blender_icons16/icon16_snap_on.dat
index a01aecf8af1..54c207ed5d9 100644
--- a/release/datafiles/blender_icons16/icon16_snap_on.dat
+++ b/release/datafiles/blender_icons16/icon16_snap_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_snap_peel_object.dat b/release/datafiles/blender_icons16/icon16_snap_peel_object.dat
index a802dec4f1c..306a89b368e 100644
--- a/release/datafiles/blender_icons16/icon16_snap_peel_object.dat
+++ b/release/datafiles/blender_icons16/icon16_snap_peel_object.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_snap_surface.dat b/release/datafiles/blender_icons16/icon16_snap_surface.dat
deleted file mode 100644
index 28219abd294..00000000000
--- a/release/datafiles/blender_icons16/icon16_snap_surface.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_snap_vertex.dat b/release/datafiles/blender_icons16/icon16_snap_vertex.dat
index 97af938a206..0aaf6c99841 100644
--- a/release/datafiles/blender_icons16/icon16_snap_vertex.dat
+++ b/release/datafiles/blender_icons16/icon16_snap_vertex.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_snap_volume.dat b/release/datafiles/blender_icons16/icon16_snap_volume.dat
index d7a5de02c93..af00e356b66 100644
--- a/release/datafiles/blender_icons16/icon16_snap_volume.dat
+++ b/release/datafiles/blender_icons16/icon16_snap_volume.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_solid.dat b/release/datafiles/blender_icons16/icon16_solid.dat
deleted file mode 100644
index efa51c9da6f..00000000000
--- a/release/datafiles/blender_icons16/icon16_solid.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_solo_off.dat b/release/datafiles/blender_icons16/icon16_solo_off.dat
index bc52bf30e7c..0eb87cdfc27 100644
--- a/release/datafiles/blender_icons16/icon16_solo_off.dat
+++ b/release/datafiles/blender_icons16/icon16_solo_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_solo_on.dat b/release/datafiles/blender_icons16/icon16_solo_on.dat
index f66ac7a9c0b..0d9b892bba9 100644
--- a/release/datafiles/blender_icons16/icon16_solo_on.dat
+++ b/release/datafiles/blender_icons16/icon16_solo_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_sort_asc.dat b/release/datafiles/blender_icons16/icon16_sort_asc.dat
new file mode 100644
index 00000000000..aecedf605ba
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_sort_asc.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_sort_desc.dat b/release/datafiles/blender_icons16/icon16_sort_desc.dat
new file mode 100644
index 00000000000..a1d57b61431
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_sort_desc.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_sortalpha.dat b/release/datafiles/blender_icons16/icon16_sortalpha.dat
index 409e787d0d7..3379468a8ce 100644
--- a/release/datafiles/blender_icons16/icon16_sortalpha.dat
+++ b/release/datafiles/blender_icons16/icon16_sortalpha.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_sortbyext.dat b/release/datafiles/blender_icons16/icon16_sortbyext.dat
index ec2bac4c798..edf49b83a96 100644
--- a/release/datafiles/blender_icons16/icon16_sortbyext.dat
+++ b/release/datafiles/blender_icons16/icon16_sortbyext.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_sortsize.dat b/release/datafiles/blender_icons16/icon16_sortsize.dat
index 28b952566ed..162118b81e4 100644
--- a/release/datafiles/blender_icons16/icon16_sortsize.dat
+++ b/release/datafiles/blender_icons16/icon16_sortsize.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_sorttime.dat b/release/datafiles/blender_icons16/icon16_sorttime.dat
index f7a24924732..c6926ea3db9 100644
--- a/release/datafiles/blender_icons16/icon16_sorttime.dat
+++ b/release/datafiles/blender_icons16/icon16_sorttime.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_sound.dat b/release/datafiles/blender_icons16/icon16_sound.dat
index 5fc52c0248f..68341af63ec 100644
--- a/release/datafiles/blender_icons16/icon16_sound.dat
+++ b/release/datafiles/blender_icons16/icon16_sound.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_space2.dat b/release/datafiles/blender_icons16/icon16_space2.dat
deleted file mode 100644
index 1fe19d47052..00000000000
--- a/release/datafiles/blender_icons16/icon16_space2.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_space3.dat b/release/datafiles/blender_icons16/icon16_space3.dat
deleted file mode 100644
index 1f97b8efd50..00000000000
--- a/release/datafiles/blender_icons16/icon16_space3.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_speaker.dat b/release/datafiles/blender_icons16/icon16_speaker.dat
index d128d43a66d..eb7b8dda707 100644
--- a/release/datafiles/blender_icons16/icon16_speaker.dat
+++ b/release/datafiles/blender_icons16/icon16_speaker.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_spherecurve.dat b/release/datafiles/blender_icons16/icon16_spherecurve.dat
index 8d3eaabf223..106b05d1529 100644
--- a/release/datafiles/blender_icons16/icon16_spherecurve.dat
+++ b/release/datafiles/blender_icons16/icon16_spherecurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_splitscreen.dat b/release/datafiles/blender_icons16/icon16_splitscreen.dat
deleted file mode 100644
index 239e3d3e764..00000000000
--- a/release/datafiles/blender_icons16/icon16_splitscreen.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_sticky_uvs_disable.dat b/release/datafiles/blender_icons16/icon16_sticky_uvs_disable.dat
index b14e3bbd722..2880257ba9a 100644
--- a/release/datafiles/blender_icons16/icon16_sticky_uvs_disable.dat
+++ b/release/datafiles/blender_icons16/icon16_sticky_uvs_disable.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_sticky_uvs_loc.dat b/release/datafiles/blender_icons16/icon16_sticky_uvs_loc.dat
index 6ccb3556de2..d3130bb73c9 100644
--- a/release/datafiles/blender_icons16/icon16_sticky_uvs_loc.dat
+++ b/release/datafiles/blender_icons16/icon16_sticky_uvs_loc.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_sticky_uvs_vert.dat b/release/datafiles/blender_icons16/icon16_sticky_uvs_vert.dat
index 7c205948bfa..c61a8761df3 100644
--- a/release/datafiles/blender_icons16/icon16_sticky_uvs_vert.dat
+++ b/release/datafiles/blender_icons16/icon16_sticky_uvs_vert.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_strands.dat b/release/datafiles/blender_icons16/icon16_strands.dat
index a4f08f495d7..b2eef5ed2f0 100644
--- a/release/datafiles/blender_icons16/icon16_strands.dat
+++ b/release/datafiles/blender_icons16/icon16_strands.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_stylus_pressure.dat b/release/datafiles/blender_icons16/icon16_stylus_pressure.dat
index 629ebaf98cd..8d3279d23e0 100644
--- a/release/datafiles/blender_icons16/icon16_stylus_pressure.dat
+++ b/release/datafiles/blender_icons16/icon16_stylus_pressure.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_surface_data.dat b/release/datafiles/blender_icons16/icon16_surface_data.dat
index 8f66ce3c9e1..bf5c4ad3b4e 100644
--- a/release/datafiles/blender_icons16/icon16_surface_data.dat
+++ b/release/datafiles/blender_icons16/icon16_surface_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_surface_ncircle.dat b/release/datafiles/blender_icons16/icon16_surface_ncircle.dat
index cd516e1cefe..95219490256 100644
--- a/release/datafiles/blender_icons16/icon16_surface_ncircle.dat
+++ b/release/datafiles/blender_icons16/icon16_surface_ncircle.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_surface_ncurve.dat b/release/datafiles/blender_icons16/icon16_surface_ncurve.dat
index d8b9bcb39cc..31f04ad6b34 100644
--- a/release/datafiles/blender_icons16/icon16_surface_ncurve.dat
+++ b/release/datafiles/blender_icons16/icon16_surface_ncurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_surface_ncylinder.dat b/release/datafiles/blender_icons16/icon16_surface_ncylinder.dat
index d3c4b4dd498..5789a23707e 100644
--- a/release/datafiles/blender_icons16/icon16_surface_ncylinder.dat
+++ b/release/datafiles/blender_icons16/icon16_surface_ncylinder.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_surface_nsphere.dat b/release/datafiles/blender_icons16/icon16_surface_nsphere.dat
index 836b9d344f9..b8cb0376d17 100644
--- a/release/datafiles/blender_icons16/icon16_surface_nsphere.dat
+++ b/release/datafiles/blender_icons16/icon16_surface_nsphere.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_surface_nsurface.dat b/release/datafiles/blender_icons16/icon16_surface_nsurface.dat
index 0fb3dec045e..33dcba49794 100644
--- a/release/datafiles/blender_icons16/icon16_surface_nsurface.dat
+++ b/release/datafiles/blender_icons16/icon16_surface_nsurface.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_surface_ntorus.dat b/release/datafiles/blender_icons16/icon16_surface_ntorus.dat
index 649cd8623ab..72ac6b7fc10 100644
--- a/release/datafiles/blender_icons16/icon16_surface_ntorus.dat
+++ b/release/datafiles/blender_icons16/icon16_surface_ntorus.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_syntax_off.dat b/release/datafiles/blender_icons16/icon16_syntax_off.dat
index 45218d0f8f8..5978c5a868c 100644
--- a/release/datafiles/blender_icons16/icon16_syntax_off.dat
+++ b/release/datafiles/blender_icons16/icon16_syntax_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_syntax_on.dat b/release/datafiles/blender_icons16/icon16_syntax_on.dat
index fcbf1e181c2..851535d0baa 100644
--- a/release/datafiles/blender_icons16/icon16_syntax_on.dat
+++ b/release/datafiles/blender_icons16/icon16_syntax_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_system.dat b/release/datafiles/blender_icons16/icon16_system.dat
new file mode 100644
index 00000000000..14c0ce60c50
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_system.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_temperature.dat b/release/datafiles/blender_icons16/icon16_temperature.dat
new file mode 100644
index 00000000000..6bb3835c7ea
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_temperature.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_text.dat b/release/datafiles/blender_icons16/icon16_text.dat
index 61a0d8fa105..7c5ca6bb640 100644
--- a/release/datafiles/blender_icons16/icon16_text.dat
+++ b/release/datafiles/blender_icons16/icon16_text.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_texture.dat b/release/datafiles/blender_icons16/icon16_texture.dat
index c73aafdcfe3..b3c5211ac09 100644
--- a/release/datafiles/blender_icons16/icon16_texture.dat
+++ b/release/datafiles/blender_icons16/icon16_texture.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_texture_data.dat b/release/datafiles/blender_icons16/icon16_texture_data.dat
index 3a731490acd..d5f5b37e642 100644
--- a/release/datafiles/blender_icons16/icon16_texture_data.dat
+++ b/release/datafiles/blender_icons16/icon16_texture_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_texture_shaded.dat b/release/datafiles/blender_icons16/icon16_texture_shaded.dat
index 7d925797669..e83dda3e23a 100644
--- a/release/datafiles/blender_icons16/icon16_texture_shaded.dat
+++ b/release/datafiles/blender_icons16/icon16_texture_shaded.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_three_dots.dat b/release/datafiles/blender_icons16/icon16_three_dots.dat
new file mode 100644
index 00000000000..031fe465b23
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_three_dots.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_time.dat b/release/datafiles/blender_icons16/icon16_time.dat
index 0a53ed2f6a7..8615f4143a9 100644
--- a/release/datafiles/blender_icons16/icon16_time.dat
+++ b/release/datafiles/blender_icons16/icon16_time.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tool_settings.dat b/release/datafiles/blender_icons16/icon16_tool_settings.dat
index 1d0d5066024..52568e4d040 100644
--- a/release/datafiles/blender_icons16/icon16_tool_settings.dat
+++ b/release/datafiles/blender_icons16/icon16_tool_settings.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tpaint_hlt.dat b/release/datafiles/blender_icons16/icon16_tpaint_hlt.dat
index 7f7f613f37e..3537aa62099 100644
--- a/release/datafiles/blender_icons16/icon16_tpaint_hlt.dat
+++ b/release/datafiles/blender_icons16/icon16_tpaint_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tracking.dat b/release/datafiles/blender_icons16/icon16_tracking.dat
new file mode 100644
index 00000000000..0d8ff23d77e
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_tracking.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tracking_backwards.dat b/release/datafiles/blender_icons16/icon16_tracking_backwards.dat
new file mode 100644
index 00000000000..515bb8d61c1
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_tracking_backwards.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tracking_backwards_single.dat b/release/datafiles/blender_icons16/icon16_tracking_backwards_single.dat
new file mode 100644
index 00000000000..156485585a8
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_tracking_backwards_single.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tracking_clear_backwards.dat b/release/datafiles/blender_icons16/icon16_tracking_clear_backwards.dat
new file mode 100644
index 00000000000..bc246fb1772
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_tracking_clear_backwards.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tracking_clear_forwards.dat b/release/datafiles/blender_icons16/icon16_tracking_clear_forwards.dat
new file mode 100644
index 00000000000..9446d3fc186
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_tracking_clear_forwards.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tracking_forwards.dat b/release/datafiles/blender_icons16/icon16_tracking_forwards.dat
new file mode 100644
index 00000000000..59ab8d37541
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_tracking_forwards.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tracking_forwards_single.dat b/release/datafiles/blender_icons16/icon16_tracking_forwards_single.dat
new file mode 100644
index 00000000000..3811a23921b
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_tracking_forwards_single.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tracking_refine_backwards.dat b/release/datafiles/blender_icons16/icon16_tracking_refine_backwards.dat
new file mode 100644
index 00000000000..41a8606b03c
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_tracking_refine_backwards.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tracking_refine_forwards.dat b/release/datafiles/blender_icons16/icon16_tracking_refine_forwards.dat
new file mode 100644
index 00000000000..d22e01bcf0d
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_tracking_refine_forwards.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tria_down.dat b/release/datafiles/blender_icons16/icon16_tria_down.dat
index a117301e266..88d4b173222 100644
--- a/release/datafiles/blender_icons16/icon16_tria_down.dat
+++ b/release/datafiles/blender_icons16/icon16_tria_down.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tria_down_bar.dat b/release/datafiles/blender_icons16/icon16_tria_down_bar.dat
index 191f2075b1a..ea4fd6376b1 100644
--- a/release/datafiles/blender_icons16/icon16_tria_down_bar.dat
+++ b/release/datafiles/blender_icons16/icon16_tria_down_bar.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tria_left.dat b/release/datafiles/blender_icons16/icon16_tria_left.dat
index f525464ed7c..df00a01e313 100644
--- a/release/datafiles/blender_icons16/icon16_tria_left.dat
+++ b/release/datafiles/blender_icons16/icon16_tria_left.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tria_left_bar.dat b/release/datafiles/blender_icons16/icon16_tria_left_bar.dat
index e1ea5764367..958efec166f 100644
--- a/release/datafiles/blender_icons16/icon16_tria_left_bar.dat
+++ b/release/datafiles/blender_icons16/icon16_tria_left_bar.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tria_right.dat b/release/datafiles/blender_icons16/icon16_tria_right.dat
index d92ae58317a..356ef38b77b 100644
--- a/release/datafiles/blender_icons16/icon16_tria_right.dat
+++ b/release/datafiles/blender_icons16/icon16_tria_right.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tria_right_bar.dat b/release/datafiles/blender_icons16/icon16_tria_right_bar.dat
index ce9c3f78ad7..46225593787 100644
--- a/release/datafiles/blender_icons16/icon16_tria_right_bar.dat
+++ b/release/datafiles/blender_icons16/icon16_tria_right_bar.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tria_up.dat b/release/datafiles/blender_icons16/icon16_tria_up.dat
index 7ea7ec73c2b..898136c1002 100644
--- a/release/datafiles/blender_icons16/icon16_tria_up.dat
+++ b/release/datafiles/blender_icons16/icon16_tria_up.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_tria_up_bar.dat b/release/datafiles/blender_icons16/icon16_tria_up_bar.dat
index e51757d2650..fc890e02e04 100644
--- a/release/datafiles/blender_icons16/icon16_tria_up_bar.dat
+++ b/release/datafiles/blender_icons16/icon16_tria_up_bar.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_uglypackage.dat b/release/datafiles/blender_icons16/icon16_uglypackage.dat
index 110df6be032..1829a6013b8 100644
--- a/release/datafiles/blender_icons16/icon16_uglypackage.dat
+++ b/release/datafiles/blender_icons16/icon16_uglypackage.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_ui.dat b/release/datafiles/blender_icons16/icon16_ui.dat
index 72af7ab498a..42fc040ae8c 100644
--- a/release/datafiles/blender_icons16/icon16_ui.dat
+++ b/release/datafiles/blender_icons16/icon16_ui.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_underline.dat b/release/datafiles/blender_icons16/icon16_underline.dat
new file mode 100644
index 00000000000..df8d1410dd5
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_underline.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_unlinked.dat b/release/datafiles/blender_icons16/icon16_unlinked.dat
index b06791a2802..4476cde18e1 100644
--- a/release/datafiles/blender_icons16/icon16_unlinked.dat
+++ b/release/datafiles/blender_icons16/icon16_unlinked.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_unlocked.dat b/release/datafiles/blender_icons16/icon16_unlocked.dat
index 3b58d8c0b0d..3e40d88d420 100644
--- a/release/datafiles/blender_icons16/icon16_unlocked.dat
+++ b/release/datafiles/blender_icons16/icon16_unlocked.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_unpinned.dat b/release/datafiles/blender_icons16/icon16_unpinned.dat
index c8a16351eca..273e3e32d70 100644
--- a/release/datafiles/blender_icons16/icon16_unpinned.dat
+++ b/release/datafiles/blender_icons16/icon16_unpinned.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_url.dat b/release/datafiles/blender_icons16/icon16_url.dat
index 1f2e08c07e2..63c6a38b097 100644
--- a/release/datafiles/blender_icons16/icon16_url.dat
+++ b/release/datafiles/blender_icons16/icon16_url.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_user.dat b/release/datafiles/blender_icons16/icon16_user.dat
new file mode 100644
index 00000000000..8e3d7c9efbf
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_user.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_uv.dat b/release/datafiles/blender_icons16/icon16_uv.dat
new file mode 100644
index 00000000000..1fcffbe02f5
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_uv.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_uv_edgesel.dat b/release/datafiles/blender_icons16/icon16_uv_edgesel.dat
index 1dcb8c4e06a..4f7abbd4974 100644
--- a/release/datafiles/blender_icons16/icon16_uv_edgesel.dat
+++ b/release/datafiles/blender_icons16/icon16_uv_edgesel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_uv_facesel.dat b/release/datafiles/blender_icons16/icon16_uv_facesel.dat
index f858bc3dc0e..d379eefd3b6 100644
--- a/release/datafiles/blender_icons16/icon16_uv_facesel.dat
+++ b/release/datafiles/blender_icons16/icon16_uv_facesel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_uv_islandsel.dat b/release/datafiles/blender_icons16/icon16_uv_islandsel.dat
index 0fb3d8dddc3..2b836dfb1de 100644
--- a/release/datafiles/blender_icons16/icon16_uv_islandsel.dat
+++ b/release/datafiles/blender_icons16/icon16_uv_islandsel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_uv_sync_select.dat b/release/datafiles/blender_icons16/icon16_uv_sync_select.dat
index 99d7bc931ff..4da795fa904 100644
--- a/release/datafiles/blender_icons16/icon16_uv_sync_select.dat
+++ b/release/datafiles/blender_icons16/icon16_uv_sync_select.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_uv_vertexsel.dat b/release/datafiles/blender_icons16/icon16_uv_vertexsel.dat
index ac1619597e1..633da267765 100644
--- a/release/datafiles/blender_icons16/icon16_uv_vertexsel.dat
+++ b/release/datafiles/blender_icons16/icon16_uv_vertexsel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_vertexsel.dat b/release/datafiles/blender_icons16/icon16_vertexsel.dat
index 38c42feae3b..27aaad026db 100644
--- a/release/datafiles/blender_icons16/icon16_vertexsel.dat
+++ b/release/datafiles/blender_icons16/icon16_vertexsel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_view3d.dat b/release/datafiles/blender_icons16/icon16_view3d.dat
index 64030dfe3dd..07ada5455fc 100644
--- a/release/datafiles/blender_icons16/icon16_view3d.dat
+++ b/release/datafiles/blender_icons16/icon16_view3d.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_view_camera.dat b/release/datafiles/blender_icons16/icon16_view_camera.dat
new file mode 100644
index 00000000000..8be8eb375f2
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_view_camera.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_view_ortho.dat b/release/datafiles/blender_icons16/icon16_view_ortho.dat
new file mode 100644
index 00000000000..bcbfd63939d
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_view_ortho.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_view_pan.dat b/release/datafiles/blender_icons16/icon16_view_pan.dat
new file mode 100644
index 00000000000..adf5fe10191
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_view_pan.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_view_perspective.dat b/release/datafiles/blender_icons16/icon16_view_perspective.dat
new file mode 100644
index 00000000000..e31bb7019eb
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_view_perspective.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_view_zoom.dat b/release/datafiles/blender_icons16/icon16_view_zoom.dat
new file mode 100644
index 00000000000..4f57ce5ef27
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_view_zoom.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_viewzoom.dat b/release/datafiles/blender_icons16/icon16_viewzoom.dat
index 6985971a24e..40ade453dc7 100644
--- a/release/datafiles/blender_icons16/icon16_viewzoom.dat
+++ b/release/datafiles/blender_icons16/icon16_viewzoom.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_vis_sel_00.dat b/release/datafiles/blender_icons16/icon16_vis_sel_00.dat
index b08d4cbaffa..287db1425b6 100644
--- a/release/datafiles/blender_icons16/icon16_vis_sel_00.dat
+++ b/release/datafiles/blender_icons16/icon16_vis_sel_00.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_vis_sel_01.dat b/release/datafiles/blender_icons16/icon16_vis_sel_01.dat
index 8f8f40603eb..15d6603831d 100644
--- a/release/datafiles/blender_icons16/icon16_vis_sel_01.dat
+++ b/release/datafiles/blender_icons16/icon16_vis_sel_01.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_vis_sel_10.dat b/release/datafiles/blender_icons16/icon16_vis_sel_10.dat
index 7f92955de3c..c80a6a0e8fd 100644
--- a/release/datafiles/blender_icons16/icon16_vis_sel_10.dat
+++ b/release/datafiles/blender_icons16/icon16_vis_sel_10.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_vis_sel_11.dat b/release/datafiles/blender_icons16/icon16_vis_sel_11.dat
index fd2bc8f4fe8..a03a2517167 100644
--- a/release/datafiles/blender_icons16/icon16_vis_sel_11.dat
+++ b/release/datafiles/blender_icons16/icon16_vis_sel_11.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_visible_ipo_off.dat b/release/datafiles/blender_icons16/icon16_visible_ipo_off.dat
index 975c2034755..59afa4558b7 100644
--- a/release/datafiles/blender_icons16/icon16_visible_ipo_off.dat
+++ b/release/datafiles/blender_icons16/icon16_visible_ipo_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_visible_ipo_on.dat b/release/datafiles/blender_icons16/icon16_visible_ipo_on.dat
index 3123e630164..6e9d150bb40 100644
--- a/release/datafiles/blender_icons16/icon16_visible_ipo_on.dat
+++ b/release/datafiles/blender_icons16/icon16_visible_ipo_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_volume.dat b/release/datafiles/blender_icons16/icon16_volume.dat
new file mode 100644
index 00000000000..64c84634c55
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_volume.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_vpaint_hlt.dat b/release/datafiles/blender_icons16/icon16_vpaint_hlt.dat
index 577a71dd233..ae7c5677aad 100644
--- a/release/datafiles/blender_icons16/icon16_vpaint_hlt.dat
+++ b/release/datafiles/blender_icons16/icon16_vpaint_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_window.dat b/release/datafiles/blender_icons16/icon16_window.dat
new file mode 100644
index 00000000000..1b280f200a2
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_window.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_wire.dat b/release/datafiles/blender_icons16/icon16_wire.dat
deleted file mode 100644
index a92c6128741..00000000000
--- a/release/datafiles/blender_icons16/icon16_wire.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_wordwrap_off.dat b/release/datafiles/blender_icons16/icon16_wordwrap_off.dat
index e8b93dcf8d5..f06bb4bc8f4 100644
--- a/release/datafiles/blender_icons16/icon16_wordwrap_off.dat
+++ b/release/datafiles/blender_icons16/icon16_wordwrap_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_wordwrap_on.dat b/release/datafiles/blender_icons16/icon16_wordwrap_on.dat
index 883503364af..77b73260147 100644
--- a/release/datafiles/blender_icons16/icon16_wordwrap_on.dat
+++ b/release/datafiles/blender_icons16/icon16_wordwrap_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_workspace.dat b/release/datafiles/blender_icons16/icon16_workspace.dat
new file mode 100644
index 00000000000..0369c3236fc
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_workspace.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_world.dat b/release/datafiles/blender_icons16/icon16_world.dat
index 97307e6e040..d68756ff789 100644
--- a/release/datafiles/blender_icons16/icon16_world.dat
+++ b/release/datafiles/blender_icons16/icon16_world.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_world_data.dat b/release/datafiles/blender_icons16/icon16_world_data.dat
index d4771236f09..8ec53887896 100644
--- a/release/datafiles/blender_icons16/icon16_world_data.dat
+++ b/release/datafiles/blender_icons16/icon16_world_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_wpaint_hlt.dat b/release/datafiles/blender_icons16/icon16_wpaint_hlt.dat
index 34790f4dc07..f5eaf8ff566 100644
--- a/release/datafiles/blender_icons16/icon16_wpaint_hlt.dat
+++ b/release/datafiles/blender_icons16/icon16_wpaint_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_x.dat b/release/datafiles/blender_icons16/icon16_x.dat
index 134cdeffe40..47c3aa95056 100644
--- a/release/datafiles/blender_icons16/icon16_x.dat
+++ b/release/datafiles/blender_icons16/icon16_x.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_xray.dat b/release/datafiles/blender_icons16/icon16_xray.dat
new file mode 100644
index 00000000000..73e36863f5d
--- /dev/null
+++ b/release/datafiles/blender_icons16/icon16_xray.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_zoom_all.dat b/release/datafiles/blender_icons16/icon16_zoom_all.dat
index 0b6bf508caf..425a21e67e3 100644
--- a/release/datafiles/blender_icons16/icon16_zoom_all.dat
+++ b/release/datafiles/blender_icons16/icon16_zoom_all.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_zoom_in.dat b/release/datafiles/blender_icons16/icon16_zoom_in.dat
index 80d5b4389cd..80a0f36c5e4 100644
--- a/release/datafiles/blender_icons16/icon16_zoom_in.dat
+++ b/release/datafiles/blender_icons16/icon16_zoom_in.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_zoom_out.dat b/release/datafiles/blender_icons16/icon16_zoom_out.dat
index 728b109b2dc..1d57589886b 100644
--- a/release/datafiles/blender_icons16/icon16_zoom_out.dat
+++ b/release/datafiles/blender_icons16/icon16_zoom_out.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_zoom_previous.dat b/release/datafiles/blender_icons16/icon16_zoom_previous.dat
index e23fb134f9c..53036cfcbc2 100644
--- a/release/datafiles/blender_icons16/icon16_zoom_previous.dat
+++ b/release/datafiles/blender_icons16/icon16_zoom_previous.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_zoom_selected.dat b/release/datafiles/blender_icons16/icon16_zoom_selected.dat
index 1a3e6a92da8..7b7dbaea115 100644
--- a/release/datafiles/blender_icons16/icon16_zoom_selected.dat
+++ b/release/datafiles/blender_icons16/icon16_zoom_selected.dat
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_zoomin.dat b/release/datafiles/blender_icons16/icon16_zoomin.dat
deleted file mode 100644
index 2a560fd355e..00000000000
--- a/release/datafiles/blender_icons16/icon16_zoomin.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons16/icon16_zoomout.dat b/release/datafiles/blender_icons16/icon16_zoomout.dat
deleted file mode 100644
index 54d849e35f7..00000000000
--- a/release/datafiles/blender_icons16/icon16_zoomout.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_30.dat b/release/datafiles/blender_icons32/icon32_30.dat
new file mode 100644
index 00000000000..8022d377400
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_30.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_action.dat b/release/datafiles/blender_icons32/icon32_action.dat
index f5f161f8bff..5d133a7bd98 100644
--- a/release/datafiles/blender_icons32/icon32_action.dat
+++ b/release/datafiles/blender_icons32/icon32_action.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_action_tweak.dat b/release/datafiles/blender_icons32/icon32_action_tweak.dat
index 140e5a3f8be..4fdfc11ee0a 100644
--- a/release/datafiles/blender_icons32/icon32_action_tweak.dat
+++ b/release/datafiles/blender_icons32/icon32_action_tweak.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_add.dat b/release/datafiles/blender_icons32/icon32_add.dat
new file mode 100644
index 00000000000..dff327008eb
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_add.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_alembic.dat b/release/datafiles/blender_icons32/icon32_alembic.dat
new file mode 100644
index 00000000000..01c0737a550
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_alembic.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_aliased.dat b/release/datafiles/blender_icons32/icon32_aliased.dat
index 89db8aee519..4a223031345 100644
--- a/release/datafiles/blender_icons32/icon32_aliased.dat
+++ b/release/datafiles/blender_icons32/icon32_aliased.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_align.dat b/release/datafiles/blender_icons32/icon32_align.dat
deleted file mode 100644
index 4bd73a11c2b..00000000000
--- a/release/datafiles/blender_icons32/icon32_align.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_align_bottom.dat b/release/datafiles/blender_icons32/icon32_align_bottom.dat
new file mode 100644
index 00000000000..cc20707efe1
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_align_bottom.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_align_center.dat b/release/datafiles/blender_icons32/icon32_align_center.dat
new file mode 100644
index 00000000000..0b63231ee9d
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_align_center.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_align_flush.dat b/release/datafiles/blender_icons32/icon32_align_flush.dat
new file mode 100644
index 00000000000..420f8b1cc4e
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_align_flush.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_align_justify.dat b/release/datafiles/blender_icons32/icon32_align_justify.dat
new file mode 100644
index 00000000000..35908a8a27a
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_align_justify.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_align_left.dat b/release/datafiles/blender_icons32/icon32_align_left.dat
new file mode 100644
index 00000000000..9f273ad5259
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_align_left.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_align_middle.dat b/release/datafiles/blender_icons32/icon32_align_middle.dat
new file mode 100644
index 00000000000..9a576babf30
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_align_middle.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_align_right.dat b/release/datafiles/blender_icons32/icon32_align_right.dat
new file mode 100644
index 00000000000..75f7f29f4a2
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_align_right.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_align_top.dat b/release/datafiles/blender_icons32/icon32_align_top.dat
new file mode 100644
index 00000000000..bd4a0be57eb
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_align_top.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_anim.dat b/release/datafiles/blender_icons32/icon32_anim.dat
index 6f45aa52761..58676e90847 100644
--- a/release/datafiles/blender_icons32/icon32_anim.dat
+++ b/release/datafiles/blender_icons32/icon32_anim.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_anim_data.dat b/release/datafiles/blender_icons32/icon32_anim_data.dat
index f89c78ef5d3..aed6bb59c16 100644
--- a/release/datafiles/blender_icons32/icon32_anim_data.dat
+++ b/release/datafiles/blender_icons32/icon32_anim_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_antialiased.dat b/release/datafiles/blender_icons32/icon32_antialiased.dat
index ef8ac4af7ef..28d03aab856 100644
--- a/release/datafiles/blender_icons32/icon32_antialiased.dat
+++ b/release/datafiles/blender_icons32/icon32_antialiased.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_append_blend.dat b/release/datafiles/blender_icons32/icon32_append_blend.dat
index 640b843042d..5c0be0a8a53 100644
--- a/release/datafiles/blender_icons32/icon32_append_blend.dat
+++ b/release/datafiles/blender_icons32/icon32_append_blend.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_armature_data.dat b/release/datafiles/blender_icons32/icon32_armature_data.dat
index d2f13be7aa7..821d30972e4 100644
--- a/release/datafiles/blender_icons32/icon32_armature_data.dat
+++ b/release/datafiles/blender_icons32/icon32_armature_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_arrow_leftright.dat b/release/datafiles/blender_icons32/icon32_arrow_leftright.dat
index c4172d7149c..a5125cfa899 100644
--- a/release/datafiles/blender_icons32/icon32_arrow_leftright.dat
+++ b/release/datafiles/blender_icons32/icon32_arrow_leftright.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_asset_manager.dat b/release/datafiles/blender_icons32/icon32_asset_manager.dat
index 960579f5745..4d418806125 100644
--- a/release/datafiles/blender_icons32/icon32_asset_manager.dat
+++ b/release/datafiles/blender_icons32/icon32_asset_manager.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_auto.dat b/release/datafiles/blender_icons32/icon32_auto.dat
index 8ac315103c8..b1c60ad8b81 100644
--- a/release/datafiles/blender_icons32/icon32_auto.dat
+++ b/release/datafiles/blender_icons32/icon32_auto.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_automerge_off.dat b/release/datafiles/blender_icons32/icon32_automerge_off.dat
index 12d72592114..0eff84e89ac 100644
--- a/release/datafiles/blender_icons32/icon32_automerge_off.dat
+++ b/release/datafiles/blender_icons32/icon32_automerge_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_automerge_on.dat b/release/datafiles/blender_icons32/icon32_automerge_on.dat
index 5d2a3c6a7e1..6e4558b469c 100644
--- a/release/datafiles/blender_icons32/icon32_automerge_on.dat
+++ b/release/datafiles/blender_icons32/icon32_automerge_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_axis_front.dat b/release/datafiles/blender_icons32/icon32_axis_front.dat
index 918b9310d28..442f167f6d8 100644
--- a/release/datafiles/blender_icons32/icon32_axis_front.dat
+++ b/release/datafiles/blender_icons32/icon32_axis_front.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_axis_side.dat b/release/datafiles/blender_icons32/icon32_axis_side.dat
index a085c7f2266..f74c9bb9aa2 100644
--- a/release/datafiles/blender_icons32/icon32_axis_side.dat
+++ b/release/datafiles/blender_icons32/icon32_axis_side.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_axis_top.dat b/release/datafiles/blender_icons32/icon32_axis_top.dat
index 2768bdc2764..da232f42039 100644
--- a/release/datafiles/blender_icons32/icon32_axis_top.dat
+++ b/release/datafiles/blender_icons32/icon32_axis_top.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_back.dat b/release/datafiles/blender_icons32/icon32_back.dat
index f6b48c79482..ab09f6729fc 100644
--- a/release/datafiles/blender_icons32/icon32_back.dat
+++ b/release/datafiles/blender_icons32/icon32_back.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_bbox.dat b/release/datafiles/blender_icons32/icon32_bbox.dat
deleted file mode 100644
index 8efbf866f92..00000000000
--- a/release/datafiles/blender_icons32/icon32_bbox.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_blender.dat b/release/datafiles/blender_icons32/icon32_blender.dat
index ef36ff7e00b..622519ed26c 100644
--- a/release/datafiles/blender_icons32/icon32_blender.dat
+++ b/release/datafiles/blender_icons32/icon32_blender.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_boids.dat b/release/datafiles/blender_icons32/icon32_boids.dat
index 3b140f789d8..0639739a9b1 100644
--- a/release/datafiles/blender_icons32/icon32_boids.dat
+++ b/release/datafiles/blender_icons32/icon32_boids.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_bold.dat b/release/datafiles/blender_icons32/icon32_bold.dat
new file mode 100644
index 00000000000..111d3ca9168
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_bold.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_bone_data.dat b/release/datafiles/blender_icons32/icon32_bone_data.dat
index 9423550e9cf..b32c8b55d73 100644
--- a/release/datafiles/blender_icons32/icon32_bone_data.dat
+++ b/release/datafiles/blender_icons32/icon32_bone_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_bookmarks.dat b/release/datafiles/blender_icons32/icon32_bookmarks.dat
index e7e86be1e2c..35b61adbdc2 100644
--- a/release/datafiles/blender_icons32/icon32_bookmarks.dat
+++ b/release/datafiles/blender_icons32/icon32_bookmarks.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_border_lasso.dat b/release/datafiles/blender_icons32/icon32_border_lasso.dat
index 8be83a26fd2..b549de9e45f 100644
--- a/release/datafiles/blender_icons32/icon32_border_lasso.dat
+++ b/release/datafiles/blender_icons32/icon32_border_lasso.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_border_rect.dat b/release/datafiles/blender_icons32/icon32_border_rect.dat
index f2e4ecf334f..9f988a97ae3 100644
--- a/release/datafiles/blender_icons32/icon32_border_rect.dat
+++ b/release/datafiles/blender_icons32/icon32_border_rect.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_bordermove.dat b/release/datafiles/blender_icons32/icon32_bordermove.dat
index 26d607c04fe..dcfb775bfbf 100644
--- a/release/datafiles/blender_icons32/icon32_bordermove.dat
+++ b/release/datafiles/blender_icons32/icon32_bordermove.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_brush_data.dat b/release/datafiles/blender_icons32/icon32_brush_data.dat
index 14fa97087cf..132e0dcb5e4 100644
--- a/release/datafiles/blender_icons32/icon32_brush_data.dat
+++ b/release/datafiles/blender_icons32/icon32_brush_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_buts.dat b/release/datafiles/blender_icons32/icon32_buts.dat
deleted file mode 100644
index 25033806661..00000000000
--- a/release/datafiles/blender_icons32/icon32_buts.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_camera_data.dat b/release/datafiles/blender_icons32/icon32_camera_data.dat
index d59c9d8d160..804e7ce0375 100644
--- a/release/datafiles/blender_icons32/icon32_camera_data.dat
+++ b/release/datafiles/blender_icons32/icon32_camera_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_camera_stereo.dat b/release/datafiles/blender_icons32/icon32_camera_stereo.dat
index b78b473e085..8a00bd4880d 100644
--- a/release/datafiles/blender_icons32/icon32_camera_stereo.dat
+++ b/release/datafiles/blender_icons32/icon32_camera_stereo.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_cancel.dat b/release/datafiles/blender_icons32/icon32_cancel.dat
index ae4b65016e6..f0dacc5b95e 100644
--- a/release/datafiles/blender_icons32/icon32_cancel.dat
+++ b/release/datafiles/blender_icons32/icon32_cancel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_center_only.dat b/release/datafiles/blender_icons32/icon32_center_only.dat
new file mode 100644
index 00000000000..e45bf184ddc
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_center_only.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_checkbox_dehlt.dat b/release/datafiles/blender_icons32/icon32_checkbox_dehlt.dat
index b0e50b9f5cb..c7aab87c591 100644
--- a/release/datafiles/blender_icons32/icon32_checkbox_dehlt.dat
+++ b/release/datafiles/blender_icons32/icon32_checkbox_dehlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_checkbox_hlt.dat b/release/datafiles/blender_icons32/icon32_checkbox_hlt.dat
index 1a8b8ed14e6..8a7af91d90f 100644
--- a/release/datafiles/blender_icons32/icon32_checkbox_hlt.dat
+++ b/release/datafiles/blender_icons32/icon32_checkbox_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_clip.dat b/release/datafiles/blender_icons32/icon32_clip.dat
index 2f54291a6c2..00fec392e77 100644
--- a/release/datafiles/blender_icons32/icon32_clip.dat
+++ b/release/datafiles/blender_icons32/icon32_clip.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_clipuv_dehlt.dat b/release/datafiles/blender_icons32/icon32_clipuv_dehlt.dat
index ce4408ba00b..72ae1cac8c8 100644
--- a/release/datafiles/blender_icons32/icon32_clipuv_dehlt.dat
+++ b/release/datafiles/blender_icons32/icon32_clipuv_dehlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_clipuv_hlt.dat b/release/datafiles/blender_icons32/icon32_clipuv_hlt.dat
index fba0f22c5ee..28c02768b49 100644
--- a/release/datafiles/blender_icons32/icon32_clipuv_hlt.dat
+++ b/release/datafiles/blender_icons32/icon32_clipuv_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_collapsemenu.dat b/release/datafiles/blender_icons32/icon32_collapsemenu.dat
index 788b4009542..a36be1a87cd 100644
--- a/release/datafiles/blender_icons32/icon32_collapsemenu.dat
+++ b/release/datafiles/blender_icons32/icon32_collapsemenu.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_color.dat b/release/datafiles/blender_icons32/icon32_color.dat
index 912c0a242fc..5bc8305d89b 100644
--- a/release/datafiles/blender_icons32/icon32_color.dat
+++ b/release/datafiles/blender_icons32/icon32_color.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_color_blue.dat b/release/datafiles/blender_icons32/icon32_color_blue.dat
index f027e89afb4..9b4347dad87 100644
--- a/release/datafiles/blender_icons32/icon32_color_blue.dat
+++ b/release/datafiles/blender_icons32/icon32_color_blue.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_color_green.dat b/release/datafiles/blender_icons32/icon32_color_green.dat
index 820886c7818..c34ae118a01 100644
--- a/release/datafiles/blender_icons32/icon32_color_green.dat
+++ b/release/datafiles/blender_icons32/icon32_color_green.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_color_red.dat b/release/datafiles/blender_icons32/icon32_color_red.dat
index 38b8b5c9b6a..ebff52908f0 100644
--- a/release/datafiles/blender_icons32/icon32_color_red.dat
+++ b/release/datafiles/blender_icons32/icon32_color_red.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_console.dat b/release/datafiles/blender_icons32/icon32_console.dat
index 0321aa69c0c..4b259cb4fca 100644
--- a/release/datafiles/blender_icons32/icon32_console.dat
+++ b/release/datafiles/blender_icons32/icon32_console.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_constraint.dat b/release/datafiles/blender_icons32/icon32_constraint.dat
index 297de2770eb..9b8b636a916 100644
--- a/release/datafiles/blender_icons32/icon32_constraint.dat
+++ b/release/datafiles/blender_icons32/icon32_constraint.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_constraint_bone.dat b/release/datafiles/blender_icons32/icon32_constraint_bone.dat
index d941f97213d..81783cb1632 100644
--- a/release/datafiles/blender_icons32/icon32_constraint_bone.dat
+++ b/release/datafiles/blender_icons32/icon32_constraint_bone.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_constraint_data.dat b/release/datafiles/blender_icons32/icon32_constraint_data.dat
index 819888ebf14..086f5dc05c1 100644
--- a/release/datafiles/blender_icons32/icon32_constraint_data.dat
+++ b/release/datafiles/blender_icons32/icon32_constraint_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_copy_id.dat b/release/datafiles/blender_icons32/icon32_copy_id.dat
index 2fa8c7f48fb..3bd2d6e7565 100644
--- a/release/datafiles/blender_icons32/icon32_copy_id.dat
+++ b/release/datafiles/blender_icons32/icon32_copy_id.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_copydown.dat b/release/datafiles/blender_icons32/icon32_copydown.dat
index 4caf4738ebb..8d0e8b2ad7d 100644
--- a/release/datafiles/blender_icons32/icon32_copydown.dat
+++ b/release/datafiles/blender_icons32/icon32_copydown.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_cursor.dat b/release/datafiles/blender_icons32/icon32_cursor.dat
deleted file mode 100644
index 1e6e831bbc5..00000000000
--- a/release/datafiles/blender_icons32/icon32_cursor.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_curve_bezcircle.dat b/release/datafiles/blender_icons32/icon32_curve_bezcircle.dat
index eb04e4f3736..c0f1a975a3e 100644
--- a/release/datafiles/blender_icons32/icon32_curve_bezcircle.dat
+++ b/release/datafiles/blender_icons32/icon32_curve_bezcircle.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_curve_bezcurve.dat b/release/datafiles/blender_icons32/icon32_curve_bezcurve.dat
index 05f71b11ec0..ede3e86b92d 100644
--- a/release/datafiles/blender_icons32/icon32_curve_bezcurve.dat
+++ b/release/datafiles/blender_icons32/icon32_curve_bezcurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_curve_data.dat b/release/datafiles/blender_icons32/icon32_curve_data.dat
index 18d9404c834..e927b1950e9 100644
--- a/release/datafiles/blender_icons32/icon32_curve_data.dat
+++ b/release/datafiles/blender_icons32/icon32_curve_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_curve_ncircle.dat b/release/datafiles/blender_icons32/icon32_curve_ncircle.dat
index 7ea32045f44..0e2907c9dcd 100644
--- a/release/datafiles/blender_icons32/icon32_curve_ncircle.dat
+++ b/release/datafiles/blender_icons32/icon32_curve_ncircle.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_curve_ncurve.dat b/release/datafiles/blender_icons32/icon32_curve_ncurve.dat
index 52c6ed7b9d8..80a1f37cd65 100644
--- a/release/datafiles/blender_icons32/icon32_curve_ncurve.dat
+++ b/release/datafiles/blender_icons32/icon32_curve_ncurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_curve_path.dat b/release/datafiles/blender_icons32/icon32_curve_path.dat
index a14180424cb..1da0032b689 100644
--- a/release/datafiles/blender_icons32/icon32_curve_path.dat
+++ b/release/datafiles/blender_icons32/icon32_curve_path.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_decorate.dat b/release/datafiles/blender_icons32/icon32_decorate.dat
index 1ee25791fcb..b40a74ae3f0 100644
--- a/release/datafiles/blender_icons32/icon32_decorate.dat
+++ b/release/datafiles/blender_icons32/icon32_decorate.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_decorate_animate.dat b/release/datafiles/blender_icons32/icon32_decorate_animate.dat
index a7cedea98e7..de2bda36d92 100644
--- a/release/datafiles/blender_icons32/icon32_decorate_animate.dat
+++ b/release/datafiles/blender_icons32/icon32_decorate_animate.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_decorate_driver.dat b/release/datafiles/blender_icons32/icon32_decorate_driver.dat
index 68a190ba1ea..e9eb3d04f80 100644
--- a/release/datafiles/blender_icons32/icon32_decorate_driver.dat
+++ b/release/datafiles/blender_icons32/icon32_decorate_driver.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_decorate_keyframe.dat b/release/datafiles/blender_icons32/icon32_decorate_keyframe.dat
index 60d2a460b43..c24d6920ff8 100644
--- a/release/datafiles/blender_icons32/icon32_decorate_keyframe.dat
+++ b/release/datafiles/blender_icons32/icon32_decorate_keyframe.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_decorate_library_override.dat b/release/datafiles/blender_icons32/icon32_decorate_library_override.dat
new file mode 100644
index 00000000000..cbeef784382
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_decorate_library_override.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_decorate_linked.dat b/release/datafiles/blender_icons32/icon32_decorate_linked.dat
index 76f6621a617..12f3fa9516c 100644
--- a/release/datafiles/blender_icons32/icon32_decorate_linked.dat
+++ b/release/datafiles/blender_icons32/icon32_decorate_linked.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_decorate_locked.dat b/release/datafiles/blender_icons32/icon32_decorate_locked.dat
index 2232f98170f..c8e8a0b66f2 100644
--- a/release/datafiles/blender_icons32/icon32_decorate_locked.dat
+++ b/release/datafiles/blender_icons32/icon32_decorate_locked.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_decorate_override.dat b/release/datafiles/blender_icons32/icon32_decorate_override.dat
index 86311d70fde..e7f4556f2ef 100644
--- a/release/datafiles/blender_icons32/icon32_decorate_override.dat
+++ b/release/datafiles/blender_icons32/icon32_decorate_override.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_decorate_unlocked.dat b/release/datafiles/blender_icons32/icon32_decorate_unlocked.dat
index cd151b8f306..cd0172ad810 100644
--- a/release/datafiles/blender_icons32/icon32_decorate_unlocked.dat
+++ b/release/datafiles/blender_icons32/icon32_decorate_unlocked.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_disclosure_tri_down.dat b/release/datafiles/blender_icons32/icon32_disclosure_tri_down.dat
index 61ef16becbe..519eeef5b71 100644
--- a/release/datafiles/blender_icons32/icon32_disclosure_tri_down.dat
+++ b/release/datafiles/blender_icons32/icon32_disclosure_tri_down.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_disclosure_tri_right.dat b/release/datafiles/blender_icons32/icon32_disclosure_tri_right.dat
index 343f8d4ab19..bb24d40544e 100644
--- a/release/datafiles/blender_icons32/icon32_disclosure_tri_right.dat
+++ b/release/datafiles/blender_icons32/icon32_disclosure_tri_right.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_disk_drive.dat b/release/datafiles/blender_icons32/icon32_disk_drive.dat
index db5896d4ce4..60657c07001 100644
--- a/release/datafiles/blender_icons32/icon32_disk_drive.dat
+++ b/release/datafiles/blender_icons32/icon32_disk_drive.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_dot.dat b/release/datafiles/blender_icons32/icon32_dot.dat
index e00f650e352..04c02c697a7 100644
--- a/release/datafiles/blender_icons32/icon32_dot.dat
+++ b/release/datafiles/blender_icons32/icon32_dot.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_dotsdown.dat b/release/datafiles/blender_icons32/icon32_dotsdown.dat
index 65e5ed3fa51..239de1227a2 100644
--- a/release/datafiles/blender_icons32/icon32_dotsdown.dat
+++ b/release/datafiles/blender_icons32/icon32_dotsdown.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_dotsup.dat b/release/datafiles/blender_icons32/icon32_dotsup.dat
index 4c7c8b445c0..f25ee2bde1d 100644
--- a/release/datafiles/blender_icons32/icon32_dotsup.dat
+++ b/release/datafiles/blender_icons32/icon32_dotsup.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_downarrow_hlt.dat b/release/datafiles/blender_icons32/icon32_downarrow_hlt.dat
index 9937beb90a7..c238eaf343e 100644
--- a/release/datafiles/blender_icons32/icon32_downarrow_hlt.dat
+++ b/release/datafiles/blender_icons32/icon32_downarrow_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_driver.dat b/release/datafiles/blender_icons32/icon32_driver.dat
index d0e6cf5c4d3..5148554305e 100644
--- a/release/datafiles/blender_icons32/icon32_driver.dat
+++ b/release/datafiles/blender_icons32/icon32_driver.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_driver_distance.dat b/release/datafiles/blender_icons32/icon32_driver_distance.dat
new file mode 100644
index 00000000000..14a1dfd40ff
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_driver_distance.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_driver_rotational_difference.dat b/release/datafiles/blender_icons32/icon32_driver_rotational_difference.dat
new file mode 100644
index 00000000000..ac9006cc4a2
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_driver_rotational_difference.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_driver_transform.dat b/release/datafiles/blender_icons32/icon32_driver_transform.dat
new file mode 100644
index 00000000000..947a1f8d73d
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_driver_transform.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_duplicate.dat b/release/datafiles/blender_icons32/icon32_duplicate.dat
new file mode 100644
index 00000000000..3060365c3d7
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_duplicate.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_edgesel.dat b/release/datafiles/blender_icons32/icon32_edgesel.dat
index e67007fd76c..6d39f538574 100644
--- a/release/datafiles/blender_icons32/icon32_edgesel.dat
+++ b/release/datafiles/blender_icons32/icon32_edgesel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_edit.dat b/release/datafiles/blender_icons32/icon32_edit.dat
index 9d0dbd7d96b..20157258b29 100644
--- a/release/datafiles/blender_icons32/icon32_edit.dat
+++ b/release/datafiles/blender_icons32/icon32_edit.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_editmode_hlt.dat b/release/datafiles/blender_icons32/icon32_editmode_hlt.dat
index e0fee096563..bf18405a712 100644
--- a/release/datafiles/blender_icons32/icon32_editmode_hlt.dat
+++ b/release/datafiles/blender_icons32/icon32_editmode_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_empty_data.dat b/release/datafiles/blender_icons32/icon32_empty_data.dat
index 981beb8b51a..163f08b6ac3 100644
--- a/release/datafiles/blender_icons32/icon32_empty_data.dat
+++ b/release/datafiles/blender_icons32/icon32_empty_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_error.dat b/release/datafiles/blender_icons32/icon32_error.dat
index ce8e3b5a34e..e4f641ebf2b 100644
--- a/release/datafiles/blender_icons32/icon32_error.dat
+++ b/release/datafiles/blender_icons32/icon32_error.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_export.dat b/release/datafiles/blender_icons32/icon32_export.dat
index 479fdb9917c..1b486ff2944 100644
--- a/release/datafiles/blender_icons32/icon32_export.dat
+++ b/release/datafiles/blender_icons32/icon32_export.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_external_data.dat b/release/datafiles/blender_icons32/icon32_external_data.dat
index 1f4ce6d819d..1d1a3bcaff4 100644
--- a/release/datafiles/blender_icons32/icon32_external_data.dat
+++ b/release/datafiles/blender_icons32/icon32_external_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_eyedropper.dat b/release/datafiles/blender_icons32/icon32_eyedropper.dat
index 3e784f07615..e7acf068e3d 100644
--- a/release/datafiles/blender_icons32/icon32_eyedropper.dat
+++ b/release/datafiles/blender_icons32/icon32_eyedropper.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_face_maps.dat b/release/datafiles/blender_icons32/icon32_face_maps.dat
new file mode 100644
index 00000000000..d486473a8c0
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_face_maps.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_facesel.dat b/release/datafiles/blender_icons32/icon32_facesel.dat
index eab1edca79a..264eadcd3a3 100644
--- a/release/datafiles/blender_icons32/icon32_facesel.dat
+++ b/release/datafiles/blender_icons32/icon32_facesel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_facesel_hlt.dat b/release/datafiles/blender_icons32/icon32_facesel_hlt.dat
index 0e3412753c7..99e79fdd432 100644
--- a/release/datafiles/blender_icons32/icon32_facesel_hlt.dat
+++ b/release/datafiles/blender_icons32/icon32_facesel_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_fake_user.dat b/release/datafiles/blender_icons32/icon32_fake_user.dat
new file mode 100644
index 00000000000..6c010f275d8
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_fake_user.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_fake_user_off.dat b/release/datafiles/blender_icons32/icon32_fake_user_off.dat
new file mode 100644
index 00000000000..a25fcf8bc95
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_fake_user_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_fake_user_on.dat b/release/datafiles/blender_icons32/icon32_fake_user_on.dat
new file mode 100644
index 00000000000..d0cb988b072
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_fake_user_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_fcurve.dat b/release/datafiles/blender_icons32/icon32_fcurve.dat
index c36f99e5254..1a2aec59636 100644
--- a/release/datafiles/blender_icons32/icon32_fcurve.dat
+++ b/release/datafiles/blender_icons32/icon32_fcurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ff.dat b/release/datafiles/blender_icons32/icon32_ff.dat
index 564bedced8f..170d7663b74 100644
--- a/release/datafiles/blender_icons32/icon32_ff.dat
+++ b/release/datafiles/blender_icons32/icon32_ff.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file.dat b/release/datafiles/blender_icons32/icon32_file.dat
index d644351aebe..869c4928690 100644
--- a/release/datafiles/blender_icons32/icon32_file.dat
+++ b/release/datafiles/blender_icons32/icon32_file.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file_backup.dat b/release/datafiles/blender_icons32/icon32_file_backup.dat
index 41f6f3ddabe..27cea440ff2 100644
--- a/release/datafiles/blender_icons32/icon32_file_backup.dat
+++ b/release/datafiles/blender_icons32/icon32_file_backup.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file_blank.dat b/release/datafiles/blender_icons32/icon32_file_blank.dat
index a95ef8576b6..7149816b75f 100644
--- a/release/datafiles/blender_icons32/icon32_file_blank.dat
+++ b/release/datafiles/blender_icons32/icon32_file_blank.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file_blend.dat b/release/datafiles/blender_icons32/icon32_file_blend.dat
index 8f5e926b368..92b54eea1d8 100644
--- a/release/datafiles/blender_icons32/icon32_file_blend.dat
+++ b/release/datafiles/blender_icons32/icon32_file_blend.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file_folder.dat b/release/datafiles/blender_icons32/icon32_file_folder.dat
index 081e811e42f..d29b241601f 100644
--- a/release/datafiles/blender_icons32/icon32_file_folder.dat
+++ b/release/datafiles/blender_icons32/icon32_file_folder.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file_font.dat b/release/datafiles/blender_icons32/icon32_file_font.dat
index 11aec86e1d6..a42574885dd 100644
--- a/release/datafiles/blender_icons32/icon32_file_font.dat
+++ b/release/datafiles/blender_icons32/icon32_file_font.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file_hidden.dat b/release/datafiles/blender_icons32/icon32_file_hidden.dat
index 373fa44f192..26cb6b92f39 100644
--- a/release/datafiles/blender_icons32/icon32_file_hidden.dat
+++ b/release/datafiles/blender_icons32/icon32_file_hidden.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file_image.dat b/release/datafiles/blender_icons32/icon32_file_image.dat
index 7ac0e19e6b3..2097f2b4394 100644
--- a/release/datafiles/blender_icons32/icon32_file_image.dat
+++ b/release/datafiles/blender_icons32/icon32_file_image.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file_movie.dat b/release/datafiles/blender_icons32/icon32_file_movie.dat
index ed7272250e1..a2c19a24390 100644
--- a/release/datafiles/blender_icons32/icon32_file_movie.dat
+++ b/release/datafiles/blender_icons32/icon32_file_movie.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file_new.dat b/release/datafiles/blender_icons32/icon32_file_new.dat
new file mode 100644
index 00000000000..3d684a20d2f
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_file_new.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file_parent.dat b/release/datafiles/blender_icons32/icon32_file_parent.dat
index d884bb2463b..d030b027c9c 100644
--- a/release/datafiles/blender_icons32/icon32_file_parent.dat
+++ b/release/datafiles/blender_icons32/icon32_file_parent.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file_refresh.dat b/release/datafiles/blender_icons32/icon32_file_refresh.dat
index 1fcf7ba69ba..7f092f16ae9 100644
--- a/release/datafiles/blender_icons32/icon32_file_refresh.dat
+++ b/release/datafiles/blender_icons32/icon32_file_refresh.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file_script.dat b/release/datafiles/blender_icons32/icon32_file_script.dat
index cd0136f768a..d797b7209b5 100644
--- a/release/datafiles/blender_icons32/icon32_file_script.dat
+++ b/release/datafiles/blender_icons32/icon32_file_script.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file_sound.dat b/release/datafiles/blender_icons32/icon32_file_sound.dat
index 2cf67f55742..39722bc79b2 100644
--- a/release/datafiles/blender_icons32/icon32_file_sound.dat
+++ b/release/datafiles/blender_icons32/icon32_file_sound.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file_text.dat b/release/datafiles/blender_icons32/icon32_file_text.dat
index 57396de0749..22bbc47d0ed 100644
--- a/release/datafiles/blender_icons32/icon32_file_text.dat
+++ b/release/datafiles/blender_icons32/icon32_file_text.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_file_tick.dat b/release/datafiles/blender_icons32/icon32_file_tick.dat
index 37a7e292973..b1c5f702c93 100644
--- a/release/datafiles/blender_icons32/icon32_file_tick.dat
+++ b/release/datafiles/blender_icons32/icon32_file_tick.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_filebrowser.dat b/release/datafiles/blender_icons32/icon32_filebrowser.dat
new file mode 100644
index 00000000000..a7104c05ef8
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_filebrowser.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_filesel.dat b/release/datafiles/blender_icons32/icon32_filesel.dat
deleted file mode 100644
index 3cbb89d86ed..00000000000
--- a/release/datafiles/blender_icons32/icon32_filesel.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_filter.dat b/release/datafiles/blender_icons32/icon32_filter.dat
index 00cac8602f3..98a3d2337ea 100644
--- a/release/datafiles/blender_icons32/icon32_filter.dat
+++ b/release/datafiles/blender_icons32/icon32_filter.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_font_data.dat b/release/datafiles/blender_icons32/icon32_font_data.dat
index 15b0cc94f26..51f4c085e5e 100644
--- a/release/datafiles/blender_icons32/icon32_font_data.dat
+++ b/release/datafiles/blender_icons32/icon32_font_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_fontpreview.dat b/release/datafiles/blender_icons32/icon32_fontpreview.dat
index 7c4dde73f41..26b71f7f49a 100644
--- a/release/datafiles/blender_icons32/icon32_fontpreview.dat
+++ b/release/datafiles/blender_icons32/icon32_fontpreview.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_force_boid.dat b/release/datafiles/blender_icons32/icon32_force_boid.dat
index a1a800d04d3..c5eb79dd375 100644
--- a/release/datafiles/blender_icons32/icon32_force_boid.dat
+++ b/release/datafiles/blender_icons32/icon32_force_boid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_force_charge.dat b/release/datafiles/blender_icons32/icon32_force_charge.dat
index eab2be836cb..93a1becb5b4 100644
--- a/release/datafiles/blender_icons32/icon32_force_charge.dat
+++ b/release/datafiles/blender_icons32/icon32_force_charge.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_force_curve.dat b/release/datafiles/blender_icons32/icon32_force_curve.dat
index 96d6cadbe41..a43419d6f10 100644
--- a/release/datafiles/blender_icons32/icon32_force_curve.dat
+++ b/release/datafiles/blender_icons32/icon32_force_curve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_force_drag.dat b/release/datafiles/blender_icons32/icon32_force_drag.dat
index 2b52a6645f9..1f03b4aff91 100644
--- a/release/datafiles/blender_icons32/icon32_force_drag.dat
+++ b/release/datafiles/blender_icons32/icon32_force_drag.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_force_force.dat b/release/datafiles/blender_icons32/icon32_force_force.dat
index 5e321f098e9..ee5e20474f4 100644
--- a/release/datafiles/blender_icons32/icon32_force_force.dat
+++ b/release/datafiles/blender_icons32/icon32_force_force.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_force_harmonic.dat b/release/datafiles/blender_icons32/icon32_force_harmonic.dat
index b06e29a0d5a..f1801b50210 100644
--- a/release/datafiles/blender_icons32/icon32_force_harmonic.dat
+++ b/release/datafiles/blender_icons32/icon32_force_harmonic.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_force_lennardjones.dat b/release/datafiles/blender_icons32/icon32_force_lennardjones.dat
index 8526515545a..e3601b26285 100644
--- a/release/datafiles/blender_icons32/icon32_force_lennardjones.dat
+++ b/release/datafiles/blender_icons32/icon32_force_lennardjones.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_force_magnetic.dat b/release/datafiles/blender_icons32/icon32_force_magnetic.dat
index dfc8e195c35..2c6a2b3cb5a 100644
--- a/release/datafiles/blender_icons32/icon32_force_magnetic.dat
+++ b/release/datafiles/blender_icons32/icon32_force_magnetic.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_force_smokeflow.dat b/release/datafiles/blender_icons32/icon32_force_smokeflow.dat
index 8df6dec18b9..ab9502b7c1f 100644
--- a/release/datafiles/blender_icons32/icon32_force_smokeflow.dat
+++ b/release/datafiles/blender_icons32/icon32_force_smokeflow.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_force_texture.dat b/release/datafiles/blender_icons32/icon32_force_texture.dat
index 92fabd5ff58..cf09205acfb 100644
--- a/release/datafiles/blender_icons32/icon32_force_texture.dat
+++ b/release/datafiles/blender_icons32/icon32_force_texture.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_force_turbulence.dat b/release/datafiles/blender_icons32/icon32_force_turbulence.dat
index 670cc2d5237..f2b1608ecbb 100644
--- a/release/datafiles/blender_icons32/icon32_force_turbulence.dat
+++ b/release/datafiles/blender_icons32/icon32_force_turbulence.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_force_vortex.dat b/release/datafiles/blender_icons32/icon32_force_vortex.dat
index a79373a119c..be1cd6f90b9 100644
--- a/release/datafiles/blender_icons32/icon32_force_vortex.dat
+++ b/release/datafiles/blender_icons32/icon32_force_vortex.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_force_wind.dat b/release/datafiles/blender_icons32/icon32_force_wind.dat
index f8dbd9d4046..0d4ddb9819a 100644
--- a/release/datafiles/blender_icons32/icon32_force_wind.dat
+++ b/release/datafiles/blender_icons32/icon32_force_wind.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_forward.dat b/release/datafiles/blender_icons32/icon32_forward.dat
index d2aac64f612..6d2299b7e85 100644
--- a/release/datafiles/blender_icons32/icon32_forward.dat
+++ b/release/datafiles/blender_icons32/icon32_forward.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_frame_next.dat b/release/datafiles/blender_icons32/icon32_frame_next.dat
index 3bd0133df2c..6d4e5d43239 100644
--- a/release/datafiles/blender_icons32/icon32_frame_next.dat
+++ b/release/datafiles/blender_icons32/icon32_frame_next.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_frame_prev.dat b/release/datafiles/blender_icons32/icon32_frame_prev.dat
index a902b9bca25..b09d58a5255 100644
--- a/release/datafiles/blender_icons32/icon32_frame_prev.dat
+++ b/release/datafiles/blender_icons32/icon32_frame_prev.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_freeze.dat b/release/datafiles/blender_icons32/icon32_freeze.dat
index b4e5d600487..db8ff8b21e2 100644
--- a/release/datafiles/blender_icons32/icon32_freeze.dat
+++ b/release/datafiles/blender_icons32/icon32_freeze.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_fullscreen.dat b/release/datafiles/blender_icons32/icon32_fullscreen.dat
index c07de51688d..1d9098676a1 100644
--- a/release/datafiles/blender_icons32/icon32_fullscreen.dat
+++ b/release/datafiles/blender_icons32/icon32_fullscreen.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_fullscreen_enter.dat b/release/datafiles/blender_icons32/icon32_fullscreen_enter.dat
index 28d9ed1e9c8..3895438a73e 100644
--- a/release/datafiles/blender_icons32/icon32_fullscreen_enter.dat
+++ b/release/datafiles/blender_icons32/icon32_fullscreen_enter.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_fullscreen_exit.dat b/release/datafiles/blender_icons32/icon32_fullscreen_exit.dat
index 2977f94d9e1..098b8eda032 100644
--- a/release/datafiles/blender_icons32/icon32_fullscreen_exit.dat
+++ b/release/datafiles/blender_icons32/icon32_fullscreen_exit.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_game.dat b/release/datafiles/blender_icons32/icon32_game.dat
index 1e7b34aa06e..db3d727b236 100644
--- a/release/datafiles/blender_icons32/icon32_game.dat
+++ b/release/datafiles/blender_icons32/icon32_game.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_gear.dat b/release/datafiles/blender_icons32/icon32_gear.dat
new file mode 100644
index 00000000000..44287225776
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_gear.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ghost.dat b/release/datafiles/blender_icons32/icon32_ghost.dat
index 12aac63e8c7..50428d8a33d 100644
--- a/release/datafiles/blender_icons32/icon32_ghost.dat
+++ b/release/datafiles/blender_icons32/icon32_ghost.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ghost_disabled.dat b/release/datafiles/blender_icons32/icon32_ghost_disabled.dat
index df0ebdc4559..9320943ca37 100644
--- a/release/datafiles/blender_icons32/icon32_ghost_disabled.dat
+++ b/release/datafiles/blender_icons32/icon32_ghost_disabled.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ghost_enabled.dat b/release/datafiles/blender_icons32/icon32_ghost_enabled.dat
index 29612999462..62f94202522 100644
--- a/release/datafiles/blender_icons32/icon32_ghost_enabled.dat
+++ b/release/datafiles/blender_icons32/icon32_ghost_enabled.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_go_left.dat b/release/datafiles/blender_icons32/icon32_go_left.dat
index d2135752073..33d852f6d60 100644
--- a/release/datafiles/blender_icons32/icon32_go_left.dat
+++ b/release/datafiles/blender_icons32/icon32_go_left.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_gp_empty.dat b/release/datafiles/blender_icons32/icon32_gp_empty.dat
new file mode 100644
index 00000000000..79e53c31d1b
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_gp_empty.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_gp_multiframe_editing.dat b/release/datafiles/blender_icons32/icon32_gp_multiframe_editing.dat
new file mode 100644
index 00000000000..0c3595dd90e
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_gp_multiframe_editing.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_gp_only_selected.dat b/release/datafiles/blender_icons32/icon32_gp_only_selected.dat
new file mode 100644
index 00000000000..55fce23aaa7
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_gp_only_selected.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_gp_select_points.dat b/release/datafiles/blender_icons32/icon32_gp_select_points.dat
new file mode 100644
index 00000000000..e4353fc617b
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_gp_select_points.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_gp_select_strokes.dat b/release/datafiles/blender_icons32/icon32_gp_select_strokes.dat
new file mode 100644
index 00000000000..e94f54f9383
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_gp_select_strokes.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_gp_stroke.dat b/release/datafiles/blender_icons32/icon32_gp_stroke.dat
new file mode 100644
index 00000000000..9e27b6f228b
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_gp_stroke.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_graph.dat b/release/datafiles/blender_icons32/icon32_graph.dat
new file mode 100644
index 00000000000..08b065e05bc
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_graph.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_greasepencil.dat b/release/datafiles/blender_icons32/icon32_greasepencil.dat
index baaf00d365f..abb2c621208 100644
--- a/release/datafiles/blender_icons32/icon32_greasepencil.dat
+++ b/release/datafiles/blender_icons32/icon32_greasepencil.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_greasepencil_stroke_paint.dat b/release/datafiles/blender_icons32/icon32_greasepencil_stroke_paint.dat
index 7c50bbe955d..b6aabfedc01 100644
--- a/release/datafiles/blender_icons32/icon32_greasepencil_stroke_paint.dat
+++ b/release/datafiles/blender_icons32/icon32_greasepencil_stroke_paint.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_grid.dat b/release/datafiles/blender_icons32/icon32_grid.dat
index fa4cbc041b4..395d2207260 100644
--- a/release/datafiles/blender_icons32/icon32_grid.dat
+++ b/release/datafiles/blender_icons32/icon32_grid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_grip.dat b/release/datafiles/blender_icons32/icon32_grip.dat
index 480bb2e221b..5a0c4e7ac74 100644
--- a/release/datafiles/blender_icons32/icon32_grip.dat
+++ b/release/datafiles/blender_icons32/icon32_grip.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_group.dat b/release/datafiles/blender_icons32/icon32_group.dat
index 6a2b8b90934..7a8245d61b0 100644
--- a/release/datafiles/blender_icons32/icon32_group.dat
+++ b/release/datafiles/blender_icons32/icon32_group.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_group_bone.dat b/release/datafiles/blender_icons32/icon32_group_bone.dat
index 05d56a7cc84..bc281a98f8b 100644
--- a/release/datafiles/blender_icons32/icon32_group_bone.dat
+++ b/release/datafiles/blender_icons32/icon32_group_bone.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_group_uvs.dat b/release/datafiles/blender_icons32/icon32_group_uvs.dat
index 4746faaccd4..c0a77608eb0 100644
--- a/release/datafiles/blender_icons32/icon32_group_uvs.dat
+++ b/release/datafiles/blender_icons32/icon32_group_uvs.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_group_vcol.dat b/release/datafiles/blender_icons32/icon32_group_vcol.dat
index accfbfa2609..880a452e9f9 100644
--- a/release/datafiles/blender_icons32/icon32_group_vcol.dat
+++ b/release/datafiles/blender_icons32/icon32_group_vcol.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_group_vertex.dat b/release/datafiles/blender_icons32/icon32_group_vertex.dat
index 53207722c5c..160ced5e231 100644
--- a/release/datafiles/blender_icons32/icon32_group_vertex.dat
+++ b/release/datafiles/blender_icons32/icon32_group_vertex.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_hair.dat b/release/datafiles/blender_icons32/icon32_hair.dat
index 4ddcf6ba3cc..39c9620cea7 100644
--- a/release/datafiles/blender_icons32/icon32_hair.dat
+++ b/release/datafiles/blender_icons32/icon32_hair.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_hand.dat b/release/datafiles/blender_icons32/icon32_hand.dat
index 339250cb661..ba6ba3a061e 100644
--- a/release/datafiles/blender_icons32/icon32_hand.dat
+++ b/release/datafiles/blender_icons32/icon32_hand.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_heart.dat b/release/datafiles/blender_icons32/icon32_heart.dat
new file mode 100644
index 00000000000..6c010f275d8
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_heart.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_help.dat b/release/datafiles/blender_icons32/icon32_help.dat
index 030717aef1f..b4dfb36793b 100644
--- a/release/datafiles/blender_icons32/icon32_help.dat
+++ b/release/datafiles/blender_icons32/icon32_help.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_hide_off.dat b/release/datafiles/blender_icons32/icon32_hide_off.dat
index e13dd195ee6..85d285fc25c 100644
--- a/release/datafiles/blender_icons32/icon32_hide_off.dat
+++ b/release/datafiles/blender_icons32/icon32_hide_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_hide_on.dat b/release/datafiles/blender_icons32/icon32_hide_on.dat
index 25c83fb165d..82ce963ad2d 100644
--- a/release/datafiles/blender_icons32/icon32_hide_on.dat
+++ b/release/datafiles/blender_icons32/icon32_hide_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_hook.dat b/release/datafiles/blender_icons32/icon32_hook.dat
index 233589181fe..b78f1a01700 100644
--- a/release/datafiles/blender_icons32/icon32_hook.dat
+++ b/release/datafiles/blender_icons32/icon32_hook.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_image.dat b/release/datafiles/blender_icons32/icon32_image.dat
new file mode 100644
index 00000000000..034442d148d
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_image.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_image_alpha.dat b/release/datafiles/blender_icons32/icon32_image_alpha.dat
index 807bf43a03f..eaeeca1f1bf 100644
--- a/release/datafiles/blender_icons32/icon32_image_alpha.dat
+++ b/release/datafiles/blender_icons32/icon32_image_alpha.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_image_col.dat b/release/datafiles/blender_icons32/icon32_image_col.dat
deleted file mode 100644
index ed2371c200a..00000000000
--- a/release/datafiles/blender_icons32/icon32_image_col.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_image_data.dat b/release/datafiles/blender_icons32/icon32_image_data.dat
index ba1095bcaab..945b167d283 100644
--- a/release/datafiles/blender_icons32/icon32_image_data.dat
+++ b/release/datafiles/blender_icons32/icon32_image_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_image_rgb.dat b/release/datafiles/blender_icons32/icon32_image_rgb.dat
index 93004f58cfb..53b5e7103c0 100644
--- a/release/datafiles/blender_icons32/icon32_image_rgb.dat
+++ b/release/datafiles/blender_icons32/icon32_image_rgb.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_image_rgb_alpha.dat b/release/datafiles/blender_icons32/icon32_image_rgb_alpha.dat
index 1ea37a941a4..d866b668334 100644
--- a/release/datafiles/blender_icons32/icon32_image_rgb_alpha.dat
+++ b/release/datafiles/blender_icons32/icon32_image_rgb_alpha.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_image_zdepth.dat b/release/datafiles/blender_icons32/icon32_image_zdepth.dat
index 912885403db..7d04c8da901 100644
--- a/release/datafiles/blender_icons32/icon32_image_zdepth.dat
+++ b/release/datafiles/blender_icons32/icon32_image_zdepth.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_imagefile.dat b/release/datafiles/blender_icons32/icon32_imagefile.dat
index ccb67f6fc37..c27f078d556 100644
--- a/release/datafiles/blender_icons32/icon32_imagefile.dat
+++ b/release/datafiles/blender_icons32/icon32_imagefile.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_imasel.dat b/release/datafiles/blender_icons32/icon32_imasel.dat
deleted file mode 100644
index 96d23a6d585..00000000000
--- a/release/datafiles/blender_icons32/icon32_imasel.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_imgdisplay.dat b/release/datafiles/blender_icons32/icon32_imgdisplay.dat
index d0f0b813525..6a6ec62d090 100644
--- a/release/datafiles/blender_icons32/icon32_imgdisplay.dat
+++ b/release/datafiles/blender_icons32/icon32_imgdisplay.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_import.dat b/release/datafiles/blender_icons32/icon32_import.dat
index 34368030eed..1856fd815d8 100644
--- a/release/datafiles/blender_icons32/icon32_import.dat
+++ b/release/datafiles/blender_icons32/icon32_import.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_info.dat b/release/datafiles/blender_icons32/icon32_info.dat
index a4310883503..753689f2107 100644
--- a/release/datafiles/blender_icons32/icon32_info.dat
+++ b/release/datafiles/blender_icons32/icon32_info.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_inlink.dat b/release/datafiles/blender_icons32/icon32_inlink.dat
index 841d31823fe..e533cead942 100644
--- a/release/datafiles/blender_icons32/icon32_inlink.dat
+++ b/release/datafiles/blender_icons32/icon32_inlink.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo.dat b/release/datafiles/blender_icons32/icon32_ipo.dat
deleted file mode 100644
index 82b89577767..00000000000
--- a/release/datafiles/blender_icons32/icon32_ipo.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_back.dat b/release/datafiles/blender_icons32/icon32_ipo_back.dat
index 23897582e44..48115e87288 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_back.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_back.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_bezier.dat b/release/datafiles/blender_icons32/icon32_ipo_bezier.dat
index c05766e3a96..8b9f53db96c 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_bezier.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_bezier.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_bounce.dat b/release/datafiles/blender_icons32/icon32_ipo_bounce.dat
index 540ef0d1406..11bb5737c22 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_bounce.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_bounce.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_circ.dat b/release/datafiles/blender_icons32/icon32_ipo_circ.dat
index 698e52f1d05..36e7fc6fee5 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_circ.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_circ.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_constant.dat b/release/datafiles/blender_icons32/icon32_ipo_constant.dat
index 275c124f6cf..42af6b6430c 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_constant.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_constant.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_cubic.dat b/release/datafiles/blender_icons32/icon32_ipo_cubic.dat
index 9df1bf06528..d72e1164be7 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_cubic.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_cubic.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_ease_in.dat b/release/datafiles/blender_icons32/icon32_ipo_ease_in.dat
index d84bea40aff..6cbd484ed12 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_ease_in.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_ease_in.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_ease_in_out.dat b/release/datafiles/blender_icons32/icon32_ipo_ease_in_out.dat
index a3ce296db39..ec34e56e0a7 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_ease_in_out.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_ease_in_out.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_ease_out.dat b/release/datafiles/blender_icons32/icon32_ipo_ease_out.dat
index 70e96b29eea..5662de6c5c3 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_ease_out.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_ease_out.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_elastic.dat b/release/datafiles/blender_icons32/icon32_ipo_elastic.dat
index dd65bfccf79..d102a9ca422 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_elastic.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_elastic.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_expo.dat b/release/datafiles/blender_icons32/icon32_ipo_expo.dat
index 4fa63d6838f..cf7dbbaf382 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_expo.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_expo.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_linear.dat b/release/datafiles/blender_icons32/icon32_ipo_linear.dat
index c0764a712af..92b79417719 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_linear.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_linear.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_quad.dat b/release/datafiles/blender_icons32/icon32_ipo_quad.dat
index 0693c648238..8703a82f880 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_quad.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_quad.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_quart.dat b/release/datafiles/blender_icons32/icon32_ipo_quart.dat
index a14a3046107..5dafda71090 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_quart.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_quart.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_quint.dat b/release/datafiles/blender_icons32/icon32_ipo_quint.dat
index daf7dda359b..948ea51c28c 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_quint.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_quint.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ipo_sine.dat b/release/datafiles/blender_icons32/icon32_ipo_sine.dat
index 304c09ea036..c88420ac091 100644
--- a/release/datafiles/blender_icons32/icon32_ipo_sine.dat
+++ b/release/datafiles/blender_icons32/icon32_ipo_sine.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_italic.dat b/release/datafiles/blender_icons32/icon32_italic.dat
new file mode 100644
index 00000000000..36a71e86675
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_italic.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_key_dehlt.dat b/release/datafiles/blender_icons32/icon32_key_dehlt.dat
index c364262de35..7852a8c5553 100644
--- a/release/datafiles/blender_icons32/icon32_key_dehlt.dat
+++ b/release/datafiles/blender_icons32/icon32_key_dehlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_key_hlt.dat b/release/datafiles/blender_icons32/icon32_key_hlt.dat
index 3c4dda85bc8..5040d52cbd3 100644
--- a/release/datafiles/blender_icons32/icon32_key_hlt.dat
+++ b/release/datafiles/blender_icons32/icon32_key_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_keyframe.dat b/release/datafiles/blender_icons32/icon32_keyframe.dat
new file mode 100644
index 00000000000..e492ae60557
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_keyframe.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_keyframe_hlt.dat b/release/datafiles/blender_icons32/icon32_keyframe_hlt.dat
new file mode 100644
index 00000000000..a91e390dc45
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_keyframe_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_keyingset.dat b/release/datafiles/blender_icons32/icon32_keyingset.dat
index 08ad8009995..cd965e076c7 100644
--- a/release/datafiles/blender_icons32/icon32_keyingset.dat
+++ b/release/datafiles/blender_icons32/icon32_keyingset.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_lamp.dat b/release/datafiles/blender_icons32/icon32_lamp.dat
deleted file mode 100644
index 99eeb5bfa26..00000000000
--- a/release/datafiles/blender_icons32/icon32_lamp.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_lamp_area.dat b/release/datafiles/blender_icons32/icon32_lamp_area.dat
deleted file mode 100644
index a47bdf977c0..00000000000
--- a/release/datafiles/blender_icons32/icon32_lamp_area.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_lamp_data.dat b/release/datafiles/blender_icons32/icon32_lamp_data.dat
deleted file mode 100644
index 7f13cc1c52d..00000000000
--- a/release/datafiles/blender_icons32/icon32_lamp_data.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_lamp_hemi.dat b/release/datafiles/blender_icons32/icon32_lamp_hemi.dat
deleted file mode 100644
index 0e4cc63d36c..00000000000
--- a/release/datafiles/blender_icons32/icon32_lamp_hemi.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_lamp_point.dat b/release/datafiles/blender_icons32/icon32_lamp_point.dat
deleted file mode 100644
index 6e25fd9a490..00000000000
--- a/release/datafiles/blender_icons32/icon32_lamp_point.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_lamp_spot.dat b/release/datafiles/blender_icons32/icon32_lamp_spot.dat
deleted file mode 100644
index 265f69adf30..00000000000
--- a/release/datafiles/blender_icons32/icon32_lamp_spot.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_lamp_sun.dat b/release/datafiles/blender_icons32/icon32_lamp_sun.dat
deleted file mode 100644
index b8b2d1b2f6a..00000000000
--- a/release/datafiles/blender_icons32/icon32_lamp_sun.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_lattice_data.dat b/release/datafiles/blender_icons32/icon32_lattice_data.dat
index 004958560ba..22940759f63 100644
--- a/release/datafiles/blender_icons32/icon32_lattice_data.dat
+++ b/release/datafiles/blender_icons32/icon32_lattice_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_layer_active.dat b/release/datafiles/blender_icons32/icon32_layer_active.dat
index dcca420e404..446b7ebceea 100644
--- a/release/datafiles/blender_icons32/icon32_layer_active.dat
+++ b/release/datafiles/blender_icons32/icon32_layer_active.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_layer_used.dat b/release/datafiles/blender_icons32/icon32_layer_used.dat
index 74a80bb419c..b215a823575 100644
--- a/release/datafiles/blender_icons32/icon32_layer_used.dat
+++ b/release/datafiles/blender_icons32/icon32_layer_used.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_library_data_broken.dat b/release/datafiles/blender_icons32/icon32_library_data_broken.dat
index 89702a9ff9e..9d5348c2d97 100644
--- a/release/datafiles/blender_icons32/icon32_library_data_broken.dat
+++ b/release/datafiles/blender_icons32/icon32_library_data_broken.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_library_data_direct.dat b/release/datafiles/blender_icons32/icon32_library_data_direct.dat
index 8c2ff37604b..8d4ee45ef3c 100644
--- a/release/datafiles/blender_icons32/icon32_library_data_direct.dat
+++ b/release/datafiles/blender_icons32/icon32_library_data_direct.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_library_data_indirect.dat b/release/datafiles/blender_icons32/icon32_library_data_indirect.dat
index c72237f9ee4..06b2fe61bde 100644
--- a/release/datafiles/blender_icons32/icon32_library_data_indirect.dat
+++ b/release/datafiles/blender_icons32/icon32_library_data_indirect.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_library_data_override.dat b/release/datafiles/blender_icons32/icon32_library_data_override.dat
index 40e7fbdb155..94fa15377cd 100644
--- a/release/datafiles/blender_icons32/icon32_library_data_override.dat
+++ b/release/datafiles/blender_icons32/icon32_library_data_override.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_light.dat b/release/datafiles/blender_icons32/icon32_light.dat
new file mode 100644
index 00000000000..8e941c1760d
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_light.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_light_area.dat b/release/datafiles/blender_icons32/icon32_light_area.dat
new file mode 100644
index 00000000000..83c5e99b5e7
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_light_area.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_light_data.dat b/release/datafiles/blender_icons32/icon32_light_data.dat
new file mode 100644
index 00000000000..eaf23d4c2bd
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_light_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_light_hemi.dat b/release/datafiles/blender_icons32/icon32_light_hemi.dat
new file mode 100644
index 00000000000..37e0a394e1b
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_light_hemi.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_light_point.dat b/release/datafiles/blender_icons32/icon32_light_point.dat
new file mode 100644
index 00000000000..82e72b5c7cd
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_light_point.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_light_spot.dat b/release/datafiles/blender_icons32/icon32_light_spot.dat
new file mode 100644
index 00000000000..4015eaf6197
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_light_spot.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_light_sun.dat b/release/datafiles/blender_icons32/icon32_light_sun.dat
new file mode 100644
index 00000000000..f4200d8c0e1
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_light_sun.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_lightpaint.dat b/release/datafiles/blender_icons32/icon32_lightpaint.dat
index 8ccf6cef1de..dd14ce00547 100644
--- a/release/datafiles/blender_icons32/icon32_lightpaint.dat
+++ b/release/datafiles/blender_icons32/icon32_lightpaint.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_lightprobe_cubemap.dat b/release/datafiles/blender_icons32/icon32_lightprobe_cubemap.dat
index ce232f4ee78..e63b87d70cd 100644
--- a/release/datafiles/blender_icons32/icon32_lightprobe_cubemap.dat
+++ b/release/datafiles/blender_icons32/icon32_lightprobe_cubemap.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_lightprobe_grid.dat b/release/datafiles/blender_icons32/icon32_lightprobe_grid.dat
index fd0616eb003..47afcc046bd 100644
--- a/release/datafiles/blender_icons32/icon32_lightprobe_grid.dat
+++ b/release/datafiles/blender_icons32/icon32_lightprobe_grid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_lightprobe_planar.dat b/release/datafiles/blender_icons32/icon32_lightprobe_planar.dat
index e0b179c3e73..e1e778348ff 100644
--- a/release/datafiles/blender_icons32/icon32_lightprobe_planar.dat
+++ b/release/datafiles/blender_icons32/icon32_lightprobe_planar.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_lincurve.dat b/release/datafiles/blender_icons32/icon32_lincurve.dat
index 40ef089502c..347934d2b67 100644
--- a/release/datafiles/blender_icons32/icon32_lincurve.dat
+++ b/release/datafiles/blender_icons32/icon32_lincurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_line_data.dat b/release/datafiles/blender_icons32/icon32_line_data.dat
index 6f0f0315da2..37edf580f31 100644
--- a/release/datafiles/blender_icons32/icon32_line_data.dat
+++ b/release/datafiles/blender_icons32/icon32_line_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_linenumbers_off.dat b/release/datafiles/blender_icons32/icon32_linenumbers_off.dat
index a9f42de205c..f93ef4cf798 100644
--- a/release/datafiles/blender_icons32/icon32_linenumbers_off.dat
+++ b/release/datafiles/blender_icons32/icon32_linenumbers_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_linenumbers_on.dat b/release/datafiles/blender_icons32/icon32_linenumbers_on.dat
index 42afcd1c240..648a6281f86 100644
--- a/release/datafiles/blender_icons32/icon32_linenumbers_on.dat
+++ b/release/datafiles/blender_icons32/icon32_linenumbers_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_link.dat b/release/datafiles/blender_icons32/icon32_link.dat
index 1bd2f3da9cd..94629cc0de9 100644
--- a/release/datafiles/blender_icons32/icon32_link.dat
+++ b/release/datafiles/blender_icons32/icon32_link.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_link_area.dat b/release/datafiles/blender_icons32/icon32_link_area.dat
index e1cb93bed8b..ae834d98260 100644
--- a/release/datafiles/blender_icons32/icon32_link_area.dat
+++ b/release/datafiles/blender_icons32/icon32_link_area.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_link_blend.dat b/release/datafiles/blender_icons32/icon32_link_blend.dat
index 00ddc53b9a7..576dffdcf70 100644
--- a/release/datafiles/blender_icons32/icon32_link_blend.dat
+++ b/release/datafiles/blender_icons32/icon32_link_blend.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_linked.dat b/release/datafiles/blender_icons32/icon32_linked.dat
index e3961768ebb..01e6c576bc2 100644
--- a/release/datafiles/blender_icons32/icon32_linked.dat
+++ b/release/datafiles/blender_icons32/icon32_linked.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_load_factory.dat b/release/datafiles/blender_icons32/icon32_load_factory.dat
deleted file mode 100644
index 307e33909e3..00000000000
--- a/release/datafiles/blender_icons32/icon32_load_factory.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_locked.dat b/release/datafiles/blender_icons32/icon32_locked.dat
index d2d317ae89a..d9852998f47 100644
--- a/release/datafiles/blender_icons32/icon32_locked.dat
+++ b/release/datafiles/blender_icons32/icon32_locked.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_lockview_off.dat b/release/datafiles/blender_icons32/icon32_lockview_off.dat
index 1aefbb1ae8a..c7f7008ecf1 100644
--- a/release/datafiles/blender_icons32/icon32_lockview_off.dat
+++ b/release/datafiles/blender_icons32/icon32_lockview_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_lockview_on.dat b/release/datafiles/blender_icons32/icon32_lockview_on.dat
index 3d61855a543..e7cf24ad4f7 100644
--- a/release/datafiles/blender_icons32/icon32_lockview_on.dat
+++ b/release/datafiles/blender_icons32/icon32_lockview_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_logic.dat b/release/datafiles/blender_icons32/icon32_logic.dat
index 2661bf10958..59725f1a98a 100644
--- a/release/datafiles/blender_icons32/icon32_logic.dat
+++ b/release/datafiles/blender_icons32/icon32_logic.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_longdisplay.dat b/release/datafiles/blender_icons32/icon32_longdisplay.dat
index d26e447f13c..28ab9f7a225 100644
--- a/release/datafiles/blender_icons32/icon32_longdisplay.dat
+++ b/release/datafiles/blender_icons32/icon32_longdisplay.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_loop_back.dat b/release/datafiles/blender_icons32/icon32_loop_back.dat
index d4a19592780..7c76123e913 100644
--- a/release/datafiles/blender_icons32/icon32_loop_back.dat
+++ b/release/datafiles/blender_icons32/icon32_loop_back.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_loop_forwards.dat b/release/datafiles/blender_icons32/icon32_loop_forwards.dat
index 38338fbbb4b..3d6bc9fe647 100644
--- a/release/datafiles/blender_icons32/icon32_loop_forwards.dat
+++ b/release/datafiles/blender_icons32/icon32_loop_forwards.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_loopsel.dat b/release/datafiles/blender_icons32/icon32_loopsel.dat
deleted file mode 100644
index 11d3e9d284e..00000000000
--- a/release/datafiles/blender_icons32/icon32_loopsel.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_man_rot.dat b/release/datafiles/blender_icons32/icon32_man_rot.dat
index 4df30eeeee1..b1037c62903 100644
--- a/release/datafiles/blender_icons32/icon32_man_rot.dat
+++ b/release/datafiles/blender_icons32/icon32_man_rot.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_man_scale.dat b/release/datafiles/blender_icons32/icon32_man_scale.dat
index 787f852a240..b49d163de93 100644
--- a/release/datafiles/blender_icons32/icon32_man_scale.dat
+++ b/release/datafiles/blender_icons32/icon32_man_scale.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_man_trans.dat b/release/datafiles/blender_icons32/icon32_man_trans.dat
index 9ac6385b60a..b23199f6dc1 100644
--- a/release/datafiles/blender_icons32/icon32_man_trans.dat
+++ b/release/datafiles/blender_icons32/icon32_man_trans.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_manipul.dat b/release/datafiles/blender_icons32/icon32_manipul.dat
index 9d18c73b2e7..f4adb64d6d0 100644
--- a/release/datafiles/blender_icons32/icon32_manipul.dat
+++ b/release/datafiles/blender_icons32/icon32_manipul.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_marker.dat b/release/datafiles/blender_icons32/icon32_marker.dat
index 1fd95f65234..89b341a1329 100644
--- a/release/datafiles/blender_icons32/icon32_marker.dat
+++ b/release/datafiles/blender_icons32/icon32_marker.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_marker_hlt.dat b/release/datafiles/blender_icons32/icon32_marker_hlt.dat
index 30080bb5a98..4ef0388959b 100644
--- a/release/datafiles/blender_icons32/icon32_marker_hlt.dat
+++ b/release/datafiles/blender_icons32/icon32_marker_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mat_sphere_sky.dat b/release/datafiles/blender_icons32/icon32_mat_sphere_sky.dat
index 7b1dad54396..af669f3aa2e 100644
--- a/release/datafiles/blender_icons32/icon32_mat_sphere_sky.dat
+++ b/release/datafiles/blender_icons32/icon32_mat_sphere_sky.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_matcloth.dat b/release/datafiles/blender_icons32/icon32_matcloth.dat
new file mode 100644
index 00000000000..9af8454c97a
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_matcloth.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_matcube.dat b/release/datafiles/blender_icons32/icon32_matcube.dat
index 4a7c7f87b93..37e4cdd6b1c 100644
--- a/release/datafiles/blender_icons32/icon32_matcube.dat
+++ b/release/datafiles/blender_icons32/icon32_matcube.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_material.dat b/release/datafiles/blender_icons32/icon32_material.dat
index b9d3481102c..c5483cda8c5 100644
--- a/release/datafiles/blender_icons32/icon32_material.dat
+++ b/release/datafiles/blender_icons32/icon32_material.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_material_data.dat b/release/datafiles/blender_icons32/icon32_material_data.dat
index 32ad5978199..6a9e1dbd885 100644
--- a/release/datafiles/blender_icons32/icon32_material_data.dat
+++ b/release/datafiles/blender_icons32/icon32_material_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_matfluid.dat b/release/datafiles/blender_icons32/icon32_matfluid.dat
new file mode 100644
index 00000000000..32c94781942
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_matfluid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_matplane.dat b/release/datafiles/blender_icons32/icon32_matplane.dat
index 93bf93a18ce..bfcf4b1f7b5 100644
--- a/release/datafiles/blender_icons32/icon32_matplane.dat
+++ b/release/datafiles/blender_icons32/icon32_matplane.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_matshaderball.dat b/release/datafiles/blender_icons32/icon32_matshaderball.dat
new file mode 100644
index 00000000000..2cf1af4122e
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_matshaderball.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_matsphere.dat b/release/datafiles/blender_icons32/icon32_matsphere.dat
index 27673e273d7..c84bad907d1 100644
--- a/release/datafiles/blender_icons32/icon32_matsphere.dat
+++ b/release/datafiles/blender_icons32/icon32_matsphere.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_menu_panel.dat b/release/datafiles/blender_icons32/icon32_menu_panel.dat
index d5d161bae71..1e25e4f07ee 100644
--- a/release/datafiles/blender_icons32/icon32_menu_panel.dat
+++ b/release/datafiles/blender_icons32/icon32_menu_panel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mesh_capsule.dat b/release/datafiles/blender_icons32/icon32_mesh_capsule.dat
index 213ef4281e1..89f42f447c7 100644
--- a/release/datafiles/blender_icons32/icon32_mesh_capsule.dat
+++ b/release/datafiles/blender_icons32/icon32_mesh_capsule.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mesh_circle.dat b/release/datafiles/blender_icons32/icon32_mesh_circle.dat
index fa9a99d2b6b..e9f6a2fc75b 100644
--- a/release/datafiles/blender_icons32/icon32_mesh_circle.dat
+++ b/release/datafiles/blender_icons32/icon32_mesh_circle.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mesh_cone.dat b/release/datafiles/blender_icons32/icon32_mesh_cone.dat
index 5c6fbc5a5f8..67be282b856 100644
--- a/release/datafiles/blender_icons32/icon32_mesh_cone.dat
+++ b/release/datafiles/blender_icons32/icon32_mesh_cone.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mesh_cube.dat b/release/datafiles/blender_icons32/icon32_mesh_cube.dat
index eda9a09987b..ceb97a01a76 100644
--- a/release/datafiles/blender_icons32/icon32_mesh_cube.dat
+++ b/release/datafiles/blender_icons32/icon32_mesh_cube.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mesh_cylinder.dat b/release/datafiles/blender_icons32/icon32_mesh_cylinder.dat
index c7d0cda0db4..65850dd5d7d 100644
--- a/release/datafiles/blender_icons32/icon32_mesh_cylinder.dat
+++ b/release/datafiles/blender_icons32/icon32_mesh_cylinder.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mesh_data.dat b/release/datafiles/blender_icons32/icon32_mesh_data.dat
index 468dfc12099..6141762ad42 100644
--- a/release/datafiles/blender_icons32/icon32_mesh_data.dat
+++ b/release/datafiles/blender_icons32/icon32_mesh_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mesh_grid.dat b/release/datafiles/blender_icons32/icon32_mesh_grid.dat
index 52844a07386..9de2e075380 100644
--- a/release/datafiles/blender_icons32/icon32_mesh_grid.dat
+++ b/release/datafiles/blender_icons32/icon32_mesh_grid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mesh_icosphere.dat b/release/datafiles/blender_icons32/icon32_mesh_icosphere.dat
index abf64a00884..aa7685240a7 100644
--- a/release/datafiles/blender_icons32/icon32_mesh_icosphere.dat
+++ b/release/datafiles/blender_icons32/icon32_mesh_icosphere.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mesh_monkey.dat b/release/datafiles/blender_icons32/icon32_mesh_monkey.dat
index 2882fdb432b..4e7b36d024c 100644
--- a/release/datafiles/blender_icons32/icon32_mesh_monkey.dat
+++ b/release/datafiles/blender_icons32/icon32_mesh_monkey.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mesh_plane.dat b/release/datafiles/blender_icons32/icon32_mesh_plane.dat
index bf0d1b78318..8e3e719eb5f 100644
--- a/release/datafiles/blender_icons32/icon32_mesh_plane.dat
+++ b/release/datafiles/blender_icons32/icon32_mesh_plane.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mesh_torus.dat b/release/datafiles/blender_icons32/icon32_mesh_torus.dat
index c9e4b17b63a..d4ebeeffc6f 100644
--- a/release/datafiles/blender_icons32/icon32_mesh_torus.dat
+++ b/release/datafiles/blender_icons32/icon32_mesh_torus.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mesh_uvsphere.dat b/release/datafiles/blender_icons32/icon32_mesh_uvsphere.dat
index 5938d99651d..295a2dcbeb8 100644
--- a/release/datafiles/blender_icons32/icon32_mesh_uvsphere.dat
+++ b/release/datafiles/blender_icons32/icon32_mesh_uvsphere.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_meta_ball.dat b/release/datafiles/blender_icons32/icon32_meta_ball.dat
index b287dcf3ba3..83e66a9d26c 100644
--- a/release/datafiles/blender_icons32/icon32_meta_ball.dat
+++ b/release/datafiles/blender_icons32/icon32_meta_ball.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_meta_capsule.dat b/release/datafiles/blender_icons32/icon32_meta_capsule.dat
index 6c44f084c54..4caeb091cb5 100644
--- a/release/datafiles/blender_icons32/icon32_meta_capsule.dat
+++ b/release/datafiles/blender_icons32/icon32_meta_capsule.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_meta_cube.dat b/release/datafiles/blender_icons32/icon32_meta_cube.dat
index 62407c24fb2..68c1634d5ee 100644
--- a/release/datafiles/blender_icons32/icon32_meta_cube.dat
+++ b/release/datafiles/blender_icons32/icon32_meta_cube.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_meta_data.dat b/release/datafiles/blender_icons32/icon32_meta_data.dat
index 2146fa26bdb..610627c0dd7 100644
--- a/release/datafiles/blender_icons32/icon32_meta_data.dat
+++ b/release/datafiles/blender_icons32/icon32_meta_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_meta_ellipsoid.dat b/release/datafiles/blender_icons32/icon32_meta_ellipsoid.dat
index dd47d45bff8..1829147eb9f 100644
--- a/release/datafiles/blender_icons32/icon32_meta_ellipsoid.dat
+++ b/release/datafiles/blender_icons32/icon32_meta_ellipsoid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_meta_empty.dat b/release/datafiles/blender_icons32/icon32_meta_empty.dat
index cc8ce1518bc..9bbf02a57a3 100644
--- a/release/datafiles/blender_icons32/icon32_meta_empty.dat
+++ b/release/datafiles/blender_icons32/icon32_meta_empty.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_meta_plane.dat b/release/datafiles/blender_icons32/icon32_meta_plane.dat
index d690e4f5361..f7d1374433b 100644
--- a/release/datafiles/blender_icons32/icon32_meta_plane.dat
+++ b/release/datafiles/blender_icons32/icon32_meta_plane.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_armature.dat b/release/datafiles/blender_icons32/icon32_mod_armature.dat
index b85120227cf..c593c2de963 100644
--- a/release/datafiles/blender_icons32/icon32_mod_armature.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_armature.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_array.dat b/release/datafiles/blender_icons32/icon32_mod_array.dat
index 89054543752..2436cdf69c7 100644
--- a/release/datafiles/blender_icons32/icon32_mod_array.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_array.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_bevel.dat b/release/datafiles/blender_icons32/icon32_mod_bevel.dat
index 1c897d0be79..e9839b72901 100644
--- a/release/datafiles/blender_icons32/icon32_mod_bevel.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_bevel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_boolean.dat b/release/datafiles/blender_icons32/icon32_mod_boolean.dat
index 466fcbcd055..348780f970b 100644
--- a/release/datafiles/blender_icons32/icon32_mod_boolean.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_boolean.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_build.dat b/release/datafiles/blender_icons32/icon32_mod_build.dat
index 10a50596670..72c28c34790 100644
--- a/release/datafiles/blender_icons32/icon32_mod_build.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_build.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_cast.dat b/release/datafiles/blender_icons32/icon32_mod_cast.dat
index 522525260ef..45b1f001502 100644
--- a/release/datafiles/blender_icons32/icon32_mod_cast.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_cast.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_cloth.dat b/release/datafiles/blender_icons32/icon32_mod_cloth.dat
index 3e1712bf59e..8fe8950cd65 100644
--- a/release/datafiles/blender_icons32/icon32_mod_cloth.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_cloth.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_curve.dat b/release/datafiles/blender_icons32/icon32_mod_curve.dat
index f212eb87614..ee902a3ab4b 100644
--- a/release/datafiles/blender_icons32/icon32_mod_curve.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_curve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_data_transfer.dat b/release/datafiles/blender_icons32/icon32_mod_data_transfer.dat
index 48881cfcc3b..beebedef335 100644
--- a/release/datafiles/blender_icons32/icon32_mod_data_transfer.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_data_transfer.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_decim.dat b/release/datafiles/blender_icons32/icon32_mod_decim.dat
index 5661a782089..59e5056a5df 100644
--- a/release/datafiles/blender_icons32/icon32_mod_decim.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_decim.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_displace.dat b/release/datafiles/blender_icons32/icon32_mod_displace.dat
index 94551db0509..52630bc7a81 100644
--- a/release/datafiles/blender_icons32/icon32_mod_displace.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_displace.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_dynamicpaint.dat b/release/datafiles/blender_icons32/icon32_mod_dynamicpaint.dat
index 0713b90f76f..ebb7536acc6 100644
--- a/release/datafiles/blender_icons32/icon32_mod_dynamicpaint.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_dynamicpaint.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_edgesplit.dat b/release/datafiles/blender_icons32/icon32_mod_edgesplit.dat
index 4f04dee185b..c22feab630b 100644
--- a/release/datafiles/blender_icons32/icon32_mod_edgesplit.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_edgesplit.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_explode.dat b/release/datafiles/blender_icons32/icon32_mod_explode.dat
index f27f1a7f72e..44444fb66d8 100644
--- a/release/datafiles/blender_icons32/icon32_mod_explode.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_explode.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_fluidsim.dat b/release/datafiles/blender_icons32/icon32_mod_fluidsim.dat
index ef8a5a1ff36..0e993479660 100644
--- a/release/datafiles/blender_icons32/icon32_mod_fluidsim.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_fluidsim.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_hue_saturation.dat b/release/datafiles/blender_icons32/icon32_mod_hue_saturation.dat
new file mode 100644
index 00000000000..7aa418b77da
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_mod_hue_saturation.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_instance.dat b/release/datafiles/blender_icons32/icon32_mod_instance.dat
new file mode 100644
index 00000000000..a0b2836ac03
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_mod_instance.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_lattice.dat b/release/datafiles/blender_icons32/icon32_mod_lattice.dat
index fc71c7ad528..4b7fb26f1cd 100644
--- a/release/datafiles/blender_icons32/icon32_mod_lattice.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_lattice.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_mask.dat b/release/datafiles/blender_icons32/icon32_mod_mask.dat
index 30eebced434..987f3157d3d 100644
--- a/release/datafiles/blender_icons32/icon32_mod_mask.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_mask.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_meshdeform.dat b/release/datafiles/blender_icons32/icon32_mod_meshdeform.dat
index 727060338c8..9c2bbe76007 100644
--- a/release/datafiles/blender_icons32/icon32_mod_meshdeform.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_meshdeform.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_mirror.dat b/release/datafiles/blender_icons32/icon32_mod_mirror.dat
index 0f1c75cb317..65029bd4462 100644
--- a/release/datafiles/blender_icons32/icon32_mod_mirror.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_mirror.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_multires.dat b/release/datafiles/blender_icons32/icon32_mod_multires.dat
index 7afbfbcb0ce..2f4d46423b7 100644
--- a/release/datafiles/blender_icons32/icon32_mod_multires.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_multires.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_noise.dat b/release/datafiles/blender_icons32/icon32_mod_noise.dat
new file mode 100644
index 00000000000..abacef118af
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_mod_noise.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_normaledit.dat b/release/datafiles/blender_icons32/icon32_mod_normaledit.dat
index 26cce5507be..308a62d1409 100644
--- a/release/datafiles/blender_icons32/icon32_mod_normaledit.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_normaledit.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_ocean.dat b/release/datafiles/blender_icons32/icon32_mod_ocean.dat
index ea883b879a0..02fb1535c26 100644
--- a/release/datafiles/blender_icons32/icon32_mod_ocean.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_ocean.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_offset.dat b/release/datafiles/blender_icons32/icon32_mod_offset.dat
new file mode 100644
index 00000000000..32bb08dcd50
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_mod_offset.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_opacity.dat b/release/datafiles/blender_icons32/icon32_mod_opacity.dat
new file mode 100644
index 00000000000..c15fc9f5b04
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_mod_opacity.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_particle_instance.dat b/release/datafiles/blender_icons32/icon32_mod_particle_instance.dat
new file mode 100644
index 00000000000..e5924e91d9c
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_mod_particle_instance.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_particles.dat b/release/datafiles/blender_icons32/icon32_mod_particles.dat
index c40c332a7ee..84a51343313 100644
--- a/release/datafiles/blender_icons32/icon32_mod_particles.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_particles.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_physics.dat b/release/datafiles/blender_icons32/icon32_mod_physics.dat
index 9c3834bb36a..2c310ddb55c 100644
--- a/release/datafiles/blender_icons32/icon32_mod_physics.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_physics.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_remesh.dat b/release/datafiles/blender_icons32/icon32_mod_remesh.dat
index 7c52c65dec9..df34302591c 100644
--- a/release/datafiles/blender_icons32/icon32_mod_remesh.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_remesh.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_screw.dat b/release/datafiles/blender_icons32/icon32_mod_screw.dat
index db24033a35b..7df8ac26d46 100644
--- a/release/datafiles/blender_icons32/icon32_mod_screw.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_screw.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_shrinkwrap.dat b/release/datafiles/blender_icons32/icon32_mod_shrinkwrap.dat
index b2fd7de9f9b..b81deaf361a 100644
--- a/release/datafiles/blender_icons32/icon32_mod_shrinkwrap.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_shrinkwrap.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_simpledeform.dat b/release/datafiles/blender_icons32/icon32_mod_simpledeform.dat
index a0546a3c538..30c306f19b1 100644
--- a/release/datafiles/blender_icons32/icon32_mod_simpledeform.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_simpledeform.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_simplify.dat b/release/datafiles/blender_icons32/icon32_mod_simplify.dat
new file mode 100644
index 00000000000..6d63994d77e
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_mod_simplify.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_skin.dat b/release/datafiles/blender_icons32/icon32_mod_skin.dat
index 9996650fecc..12d1f14df30 100644
--- a/release/datafiles/blender_icons32/icon32_mod_skin.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_skin.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_smoke.dat b/release/datafiles/blender_icons32/icon32_mod_smoke.dat
index 1df4722ba1d..694683d6f11 100644
--- a/release/datafiles/blender_icons32/icon32_mod_smoke.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_smoke.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_smooth.dat b/release/datafiles/blender_icons32/icon32_mod_smooth.dat
index 840e55fac9d..d9f339ecaaa 100644
--- a/release/datafiles/blender_icons32/icon32_mod_smooth.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_smooth.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_soft.dat b/release/datafiles/blender_icons32/icon32_mod_soft.dat
index 39de2214cd9..b1049250549 100644
--- a/release/datafiles/blender_icons32/icon32_mod_soft.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_soft.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_solidify.dat b/release/datafiles/blender_icons32/icon32_mod_solidify.dat
index 9d416c8b307..8064c19c785 100644
--- a/release/datafiles/blender_icons32/icon32_mod_solidify.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_solidify.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_subsurf.dat b/release/datafiles/blender_icons32/icon32_mod_subsurf.dat
index 00333eee87f..242209309c4 100644
--- a/release/datafiles/blender_icons32/icon32_mod_subsurf.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_subsurf.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_thickness.dat b/release/datafiles/blender_icons32/icon32_mod_thickness.dat
new file mode 100644
index 00000000000..10f30c0d2c0
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_mod_thickness.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_time.dat b/release/datafiles/blender_icons32/icon32_mod_time.dat
new file mode 100644
index 00000000000..da414aca0bc
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_mod_time.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_tint.dat b/release/datafiles/blender_icons32/icon32_mod_tint.dat
new file mode 100644
index 00000000000..213b3e136d2
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_mod_tint.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_triangulate.dat b/release/datafiles/blender_icons32/icon32_mod_triangulate.dat
index 5d6531a4bf9..80f0017bc08 100644
--- a/release/datafiles/blender_icons32/icon32_mod_triangulate.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_triangulate.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_uvproject.dat b/release/datafiles/blender_icons32/icon32_mod_uvproject.dat
index c4576554749..d0e94cfec5f 100644
--- a/release/datafiles/blender_icons32/icon32_mod_uvproject.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_uvproject.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_vertex_weight.dat b/release/datafiles/blender_icons32/icon32_mod_vertex_weight.dat
index fdce393d079..fcd61b42eae 100644
--- a/release/datafiles/blender_icons32/icon32_mod_vertex_weight.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_vertex_weight.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_warp.dat b/release/datafiles/blender_icons32/icon32_mod_warp.dat
index 177ba294a5e..437a615d432 100644
--- a/release/datafiles/blender_icons32/icon32_mod_warp.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_warp.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_wave.dat b/release/datafiles/blender_icons32/icon32_mod_wave.dat
index 8749ccfe848..3144da23f05 100644
--- a/release/datafiles/blender_icons32/icon32_mod_wave.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_wave.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mod_wireframe.dat b/release/datafiles/blender_icons32/icon32_mod_wireframe.dat
index b53d77939c7..83d41a8a6d5 100644
--- a/release/datafiles/blender_icons32/icon32_mod_wireframe.dat
+++ b/release/datafiles/blender_icons32/icon32_mod_wireframe.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_modifier.dat b/release/datafiles/blender_icons32/icon32_modifier.dat
index 60dcd3af09e..04861db2662 100644
--- a/release/datafiles/blender_icons32/icon32_modifier.dat
+++ b/release/datafiles/blender_icons32/icon32_modifier.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_modifier_off.dat b/release/datafiles/blender_icons32/icon32_modifier_off.dat
new file mode 100644
index 00000000000..11f7f75688f
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_modifier_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_modifier_on.dat b/release/datafiles/blender_icons32/icon32_modifier_on.dat
new file mode 100644
index 00000000000..0ba6eb46a61
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_modifier_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_monkey.dat b/release/datafiles/blender_icons32/icon32_monkey.dat
index 1d0f87ebe84..89995f662af 100644
--- a/release/datafiles/blender_icons32/icon32_monkey.dat
+++ b/release/datafiles/blender_icons32/icon32_monkey.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mouse_drag.dat b/release/datafiles/blender_icons32/icon32_mouse_drag.dat
deleted file mode 100644
index ef137d3b2ae..00000000000
--- a/release/datafiles/blender_icons32/icon32_mouse_drag.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mouse_lmb.dat b/release/datafiles/blender_icons32/icon32_mouse_lmb.dat
index 8b26ccf1f87..8fd2cc38561 100644
--- a/release/datafiles/blender_icons32/icon32_mouse_lmb.dat
+++ b/release/datafiles/blender_icons32/icon32_mouse_lmb.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mouse_lmb_drag.dat b/release/datafiles/blender_icons32/icon32_mouse_lmb_drag.dat
index f6d7cca095b..3f469471fb9 100644
--- a/release/datafiles/blender_icons32/icon32_mouse_lmb_drag.dat
+++ b/release/datafiles/blender_icons32/icon32_mouse_lmb_drag.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mouse_mmb.dat b/release/datafiles/blender_icons32/icon32_mouse_mmb.dat
index 59312073226..4a1fe30a065 100644
--- a/release/datafiles/blender_icons32/icon32_mouse_mmb.dat
+++ b/release/datafiles/blender_icons32/icon32_mouse_mmb.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mouse_mmb_drag.dat b/release/datafiles/blender_icons32/icon32_mouse_mmb_drag.dat
index 79c96a08dd3..b2243f4df21 100644
--- a/release/datafiles/blender_icons32/icon32_mouse_mmb_drag.dat
+++ b/release/datafiles/blender_icons32/icon32_mouse_mmb_drag.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mouse_move.dat b/release/datafiles/blender_icons32/icon32_mouse_move.dat
index 51aff1f445c..ccb55ce2f06 100644
--- a/release/datafiles/blender_icons32/icon32_mouse_move.dat
+++ b/release/datafiles/blender_icons32/icon32_mouse_move.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mouse_rmb.dat b/release/datafiles/blender_icons32/icon32_mouse_rmb.dat
index 10e10b0d755..ae8658b98dd 100644
--- a/release/datafiles/blender_icons32/icon32_mouse_rmb.dat
+++ b/release/datafiles/blender_icons32/icon32_mouse_rmb.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mouse_rmb_drag.dat b/release/datafiles/blender_icons32/icon32_mouse_rmb_drag.dat
index 6dff7737ba0..8a7249f742d 100644
--- a/release/datafiles/blender_icons32/icon32_mouse_rmb_drag.dat
+++ b/release/datafiles/blender_icons32/icon32_mouse_rmb_drag.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mute_ipo_off.dat b/release/datafiles/blender_icons32/icon32_mute_ipo_off.dat
index 1f47ea5e5cd..38b1e8f1ec1 100644
--- a/release/datafiles/blender_icons32/icon32_mute_ipo_off.dat
+++ b/release/datafiles/blender_icons32/icon32_mute_ipo_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_mute_ipo_on.dat b/release/datafiles/blender_icons32/icon32_mute_ipo_on.dat
index 6b40342e028..f9f511f3920 100644
--- a/release/datafiles/blender_icons32/icon32_mute_ipo_on.dat
+++ b/release/datafiles/blender_icons32/icon32_mute_ipo_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ndof_dom.dat b/release/datafiles/blender_icons32/icon32_ndof_dom.dat
index b0902ee52be..dbae8de0398 100644
--- a/release/datafiles/blender_icons32/icon32_ndof_dom.dat
+++ b/release/datafiles/blender_icons32/icon32_ndof_dom.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ndof_fly.dat b/release/datafiles/blender_icons32/icon32_ndof_fly.dat
index 531ad1618b3..f3d9082f2c7 100644
--- a/release/datafiles/blender_icons32/icon32_ndof_fly.dat
+++ b/release/datafiles/blender_icons32/icon32_ndof_fly.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ndof_trans.dat b/release/datafiles/blender_icons32/icon32_ndof_trans.dat
index 8960749aba8..48c84c44fc6 100644
--- a/release/datafiles/blender_icons32/icon32_ndof_trans.dat
+++ b/release/datafiles/blender_icons32/icon32_ndof_trans.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ndof_turn.dat b/release/datafiles/blender_icons32/icon32_ndof_turn.dat
index 581d38e6314..b7d3b6dfbc5 100644
--- a/release/datafiles/blender_icons32/icon32_ndof_turn.dat
+++ b/release/datafiles/blender_icons32/icon32_ndof_turn.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_new.dat b/release/datafiles/blender_icons32/icon32_new.dat
deleted file mode 100644
index f27a7d3061a..00000000000
--- a/release/datafiles/blender_icons32/icon32_new.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_newfolder.dat b/release/datafiles/blender_icons32/icon32_newfolder.dat
index baad04b0978..f25f2018763 100644
--- a/release/datafiles/blender_icons32/icon32_newfolder.dat
+++ b/release/datafiles/blender_icons32/icon32_newfolder.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_next_keyframe.dat b/release/datafiles/blender_icons32/icon32_next_keyframe.dat
index 3629fbc7677..e3c6e71066b 100644
--- a/release/datafiles/blender_icons32/icon32_next_keyframe.dat
+++ b/release/datafiles/blender_icons32/icon32_next_keyframe.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_nla.dat b/release/datafiles/blender_icons32/icon32_nla.dat
index e8bdbe02b2d..a176e23faaf 100644
--- a/release/datafiles/blender_icons32/icon32_nla.dat
+++ b/release/datafiles/blender_icons32/icon32_nla.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_nla_pushdown.dat b/release/datafiles/blender_icons32/icon32_nla_pushdown.dat
index 3a0e1c73a52..9f8eb65c7c2 100644
--- a/release/datafiles/blender_icons32/icon32_nla_pushdown.dat
+++ b/release/datafiles/blender_icons32/icon32_nla_pushdown.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_nocurve.dat b/release/datafiles/blender_icons32/icon32_nocurve.dat
index 02c1e30fc5d..0f20b8c01b2 100644
--- a/release/datafiles/blender_icons32/icon32_nocurve.dat
+++ b/release/datafiles/blender_icons32/icon32_nocurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_node.dat b/release/datafiles/blender_icons32/icon32_node.dat
index 5468bf2b077..734fa638ac4 100644
--- a/release/datafiles/blender_icons32/icon32_node.dat
+++ b/release/datafiles/blender_icons32/icon32_node.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_node_compositing.dat b/release/datafiles/blender_icons32/icon32_node_compositing.dat
new file mode 100644
index 00000000000..f6f05ddfb66
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_node_compositing.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_node_corner.dat b/release/datafiles/blender_icons32/icon32_node_corner.dat
new file mode 100644
index 00000000000..84de975fca3
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_node_corner.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_node_insert_off.dat b/release/datafiles/blender_icons32/icon32_node_insert_off.dat
index 5644724df66..806cfa02b30 100644
--- a/release/datafiles/blender_icons32/icon32_node_insert_off.dat
+++ b/release/datafiles/blender_icons32/icon32_node_insert_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_node_insert_on.dat b/release/datafiles/blender_icons32/icon32_node_insert_on.dat
index d93798fa624..b39ff8acdef 100644
--- a/release/datafiles/blender_icons32/icon32_node_insert_on.dat
+++ b/release/datafiles/blender_icons32/icon32_node_insert_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_node_insert_top.dat b/release/datafiles/blender_icons32/icon32_node_insert_top.dat
new file mode 100644
index 00000000000..de1c72f449d
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_node_insert_top.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_node_material.dat b/release/datafiles/blender_icons32/icon32_node_material.dat
new file mode 100644
index 00000000000..1b645499b70
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_node_material.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_node_sel.dat b/release/datafiles/blender_icons32/icon32_node_sel.dat
index da857af0235..04997c9c0ad 100644
--- a/release/datafiles/blender_icons32/icon32_node_sel.dat
+++ b/release/datafiles/blender_icons32/icon32_node_sel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_node_side.dat b/release/datafiles/blender_icons32/icon32_node_side.dat
new file mode 100644
index 00000000000..be0afcc8b82
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_node_side.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_node_texture.dat b/release/datafiles/blender_icons32/icon32_node_texture.dat
new file mode 100644
index 00000000000..b9f78c5910a
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_node_texture.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_node_top.dat b/release/datafiles/blender_icons32/icon32_node_top.dat
new file mode 100644
index 00000000000..de1c72f449d
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_node_top.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_nodetree.dat b/release/datafiles/blender_icons32/icon32_nodetree.dat
index 0a759019b9b..d87a7f3ec65 100644
--- a/release/datafiles/blender_icons32/icon32_nodetree.dat
+++ b/release/datafiles/blender_icons32/icon32_nodetree.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_normalize_fcurves.dat b/release/datafiles/blender_icons32/icon32_normalize_fcurves.dat
index 5b1f546a563..678dc30d77d 100644
--- a/release/datafiles/blender_icons32/icon32_normalize_fcurves.dat
+++ b/release/datafiles/blender_icons32/icon32_normalize_fcurves.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_normals_face.dat b/release/datafiles/blender_icons32/icon32_normals_face.dat
new file mode 100644
index 00000000000..761a44cc728
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_normals_face.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_normals_vertex.dat b/release/datafiles/blender_icons32/icon32_normals_vertex.dat
new file mode 100644
index 00000000000..5f783c39105
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_normals_vertex.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_normals_vertex_face.dat b/release/datafiles/blender_icons32/icon32_normals_vertex_face.dat
new file mode 100644
index 00000000000..1f14a644d08
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_normals_vertex_face.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_object_data.dat b/release/datafiles/blender_icons32/icon32_object_data.dat
index 22b95015a5b..40ab431a24d 100644
--- a/release/datafiles/blender_icons32/icon32_object_data.dat
+++ b/release/datafiles/blender_icons32/icon32_object_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_object_datamode.dat b/release/datafiles/blender_icons32/icon32_object_datamode.dat
index 21b85a97132..8209305cfe8 100644
--- a/release/datafiles/blender_icons32/icon32_object_datamode.dat
+++ b/release/datafiles/blender_icons32/icon32_object_datamode.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_object_origin.dat b/release/datafiles/blender_icons32/icon32_object_origin.dat
index 41d583da6b5..7b81d08c1b4 100644
--- a/release/datafiles/blender_icons32/icon32_object_origin.dat
+++ b/release/datafiles/blender_icons32/icon32_object_origin.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_onionskin_off.dat b/release/datafiles/blender_icons32/icon32_onionskin_off.dat
new file mode 100644
index 00000000000..653d2fb1718
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_onionskin_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_onionskin_on.dat b/release/datafiles/blender_icons32/icon32_onionskin_on.dat
new file mode 100644
index 00000000000..e89078d54d4
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_onionskin_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_oops.dat b/release/datafiles/blender_icons32/icon32_oops.dat
deleted file mode 100644
index ed195dfe49a..00000000000
--- a/release/datafiles/blender_icons32/icon32_oops.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_open_recent.dat b/release/datafiles/blender_icons32/icon32_open_recent.dat
index 483c4e575a3..86417937e36 100644
--- a/release/datafiles/blender_icons32/icon32_open_recent.dat
+++ b/release/datafiles/blender_icons32/icon32_open_recent.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_orientation_gimbal.dat b/release/datafiles/blender_icons32/icon32_orientation_gimbal.dat
new file mode 100644
index 00000000000..940abe824e0
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_orientation_gimbal.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_orientation_global.dat b/release/datafiles/blender_icons32/icon32_orientation_global.dat
new file mode 100644
index 00000000000..b63ef331838
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_orientation_global.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_orientation_local.dat b/release/datafiles/blender_icons32/icon32_orientation_local.dat
new file mode 100644
index 00000000000..b5d08ca24c5
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_orientation_local.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_orientation_normal.dat b/release/datafiles/blender_icons32/icon32_orientation_normal.dat
new file mode 100644
index 00000000000..6b134b02516
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_orientation_normal.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_orientation_view.dat b/release/datafiles/blender_icons32/icon32_orientation_view.dat
new file mode 100644
index 00000000000..665b8b38398
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_orientation_view.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_orphan_data.dat b/release/datafiles/blender_icons32/icon32_orphan_data.dat
new file mode 100644
index 00000000000..8ece0b7026c
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_orphan_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ortho.dat b/release/datafiles/blender_icons32/icon32_ortho.dat
deleted file mode 100644
index 82a1dd074fc..00000000000
--- a/release/datafiles/blender_icons32/icon32_ortho.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner.dat b/release/datafiles/blender_icons32/icon32_outliner.dat
new file mode 100644
index 00000000000..c65e2fbdb4d
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_outliner.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_data_armature.dat b/release/datafiles/blender_icons32/icon32_outliner_data_armature.dat
index e3fc5a64407..c84118480af 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_data_armature.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_data_armature.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_data_camera.dat b/release/datafiles/blender_icons32/icon32_outliner_data_camera.dat
index baef810b55e..7250819991e 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_data_camera.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_data_camera.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_data_curve.dat b/release/datafiles/blender_icons32/icon32_outliner_data_curve.dat
index 3f8ddd6c9df..d644bc20d32 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_data_curve.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_data_curve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_data_empty.dat b/release/datafiles/blender_icons32/icon32_outliner_data_empty.dat
index e7344b0e12a..087b41c2894 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_data_empty.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_data_empty.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_data_font.dat b/release/datafiles/blender_icons32/icon32_outliner_data_font.dat
index a708918a815..92cb4c59327 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_data_font.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_data_font.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_data_greasepencil.dat b/release/datafiles/blender_icons32/icon32_outliner_data_greasepencil.dat
index fc64f306be7..a307132f5c0 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_data_greasepencil.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_data_greasepencil.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_data_lamp.dat b/release/datafiles/blender_icons32/icon32_outliner_data_lamp.dat
deleted file mode 100644
index 10a511a9169..00000000000
--- a/release/datafiles/blender_icons32/icon32_outliner_data_lamp.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_data_lattice.dat b/release/datafiles/blender_icons32/icon32_outliner_data_lattice.dat
index 9a4e62ae26d..23c755916ba 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_data_lattice.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_data_lattice.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_data_light.dat b/release/datafiles/blender_icons32/icon32_outliner_data_light.dat
new file mode 100644
index 00000000000..096949cc735
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_outliner_data_light.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_data_mesh.dat b/release/datafiles/blender_icons32/icon32_outliner_data_mesh.dat
index 787caf23194..8de4fb9ebd7 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_data_mesh.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_data_mesh.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_data_meta.dat b/release/datafiles/blender_icons32/icon32_outliner_data_meta.dat
index e7119f62eff..4d6dff34abd 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_data_meta.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_data_meta.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_data_pose.dat b/release/datafiles/blender_icons32/icon32_outliner_data_pose.dat
index f782e5a065f..f1beb2313fa 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_data_pose.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_data_pose.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_data_speaker.dat b/release/datafiles/blender_icons32/icon32_outliner_data_speaker.dat
index 2255e24bb78..4cb2e98de50 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_data_speaker.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_data_speaker.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_data_surface.dat b/release/datafiles/blender_icons32/icon32_outliner_data_surface.dat
index 7d8d8cbad15..6d58baf48cb 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_data_surface.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_data_surface.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_armature.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_armature.dat
index 00761de0db5..6d5d7c6d28e 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_ob_armature.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_armature.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_camera.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_camera.dat
index 939baa50d5c..c6d17fc37ba 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_ob_camera.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_camera.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_curve.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_curve.dat
index dc6a0318b21..58e6f1da3d1 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_ob_curve.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_curve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_empty.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_empty.dat
index ae7967347b8..69c8fa32733 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_ob_empty.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_empty.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_font.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_font.dat
index f5bf5af9b9b..f230bb470e5 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_ob_font.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_font.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_force_field.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_force_field.dat
index bd57178b377..2a97d45336a 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_ob_force_field.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_force_field.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_greasepencil.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_greasepencil.dat
index 04eca21ce1f..70158212d9e 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_ob_greasepencil.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_greasepencil.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_group_instance.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_group_instance.dat
index 868f9e4fbcc..8529804c6b5 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_ob_group_instance.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_group_instance.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_image.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_image.dat
new file mode 100644
index 00000000000..ee9bec3206a
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_image.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_lamp.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_lamp.dat
deleted file mode 100644
index 7364f1791d5..00000000000
--- a/release/datafiles/blender_icons32/icon32_outliner_ob_lamp.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_lattice.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_lattice.dat
index 1edeec26bf4..4b5bb762822 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_ob_lattice.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_lattice.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_light.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_light.dat
new file mode 100644
index 00000000000..9e1223de9df
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_light.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_lightprobe.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_lightprobe.dat
index 7497f376d6e..1d863f0d2a8 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_ob_lightprobe.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_lightprobe.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_mesh.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_mesh.dat
index c87b3c9d5da..652b40e0e36 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_ob_mesh.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_mesh.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_meta.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_meta.dat
index 8f8e8343579..00808df2339 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_ob_meta.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_meta.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_speaker.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_speaker.dat
index d87485ecd09..6ce177b2591 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_ob_speaker.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_speaker.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_outliner_ob_surface.dat b/release/datafiles/blender_icons32/icon32_outliner_ob_surface.dat
index 622bc7b7eae..09c3551880b 100644
--- a/release/datafiles/blender_icons32/icon32_outliner_ob_surface.dat
+++ b/release/datafiles/blender_icons32/icon32_outliner_ob_surface.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_overlay.dat b/release/datafiles/blender_icons32/icon32_overlay.dat
index 3edccff0d5b..62279ed1b57 100644
--- a/release/datafiles/blender_icons32/icon32_overlay.dat
+++ b/release/datafiles/blender_icons32/icon32_overlay.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_package.dat b/release/datafiles/blender_icons32/icon32_package.dat
index 4bade4b4fc9..1771467f082 100644
--- a/release/datafiles/blender_icons32/icon32_package.dat
+++ b/release/datafiles/blender_icons32/icon32_package.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_panel_close.dat b/release/datafiles/blender_icons32/icon32_panel_close.dat
index f613ce88ccc..7497aacc310 100644
--- a/release/datafiles/blender_icons32/icon32_panel_close.dat
+++ b/release/datafiles/blender_icons32/icon32_panel_close.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_particle_data.dat b/release/datafiles/blender_icons32/icon32_particle_data.dat
index 5280e2b2050..eb1ea031df1 100644
--- a/release/datafiles/blender_icons32/icon32_particle_data.dat
+++ b/release/datafiles/blender_icons32/icon32_particle_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_particle_path.dat b/release/datafiles/blender_icons32/icon32_particle_path.dat
index 163adac9b8e..16d94ca7021 100644
--- a/release/datafiles/blender_icons32/icon32_particle_path.dat
+++ b/release/datafiles/blender_icons32/icon32_particle_path.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_particle_point.dat b/release/datafiles/blender_icons32/icon32_particle_point.dat
index 0aa4b250f48..dfb32c7eac4 100644
--- a/release/datafiles/blender_icons32/icon32_particle_point.dat
+++ b/release/datafiles/blender_icons32/icon32_particle_point.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_particle_tip.dat b/release/datafiles/blender_icons32/icon32_particle_tip.dat
index 7699528567e..be2b0bc690d 100644
--- a/release/datafiles/blender_icons32/icon32_particle_tip.dat
+++ b/release/datafiles/blender_icons32/icon32_particle_tip.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_particlemode.dat b/release/datafiles/blender_icons32/icon32_particlemode.dat
index 9c9d63f366b..3973e32c694 100644
--- a/release/datafiles/blender_icons32/icon32_particlemode.dat
+++ b/release/datafiles/blender_icons32/icon32_particlemode.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_particles.dat b/release/datafiles/blender_icons32/icon32_particles.dat
index b5a8c2d1814..1a716802303 100644
--- a/release/datafiles/blender_icons32/icon32_particles.dat
+++ b/release/datafiles/blender_icons32/icon32_particles.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_pastedown.dat b/release/datafiles/blender_icons32/icon32_pastedown.dat
index f9dba59cba4..2d95b49039d 100644
--- a/release/datafiles/blender_icons32/icon32_pastedown.dat
+++ b/release/datafiles/blender_icons32/icon32_pastedown.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_pasteflipdown.dat b/release/datafiles/blender_icons32/icon32_pasteflipdown.dat
index 161c138e73e..0d1b5786168 100644
--- a/release/datafiles/blender_icons32/icon32_pasteflipdown.dat
+++ b/release/datafiles/blender_icons32/icon32_pasteflipdown.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_pasteflipup.dat b/release/datafiles/blender_icons32/icon32_pasteflipup.dat
index 1b0c2f6a058..a28d5617e9e 100644
--- a/release/datafiles/blender_icons32/icon32_pasteflipup.dat
+++ b/release/datafiles/blender_icons32/icon32_pasteflipup.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_pause.dat b/release/datafiles/blender_icons32/icon32_pause.dat
index f24259cbd86..2ffea2dbc54 100644
--- a/release/datafiles/blender_icons32/icon32_pause.dat
+++ b/release/datafiles/blender_icons32/icon32_pause.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_physics.dat b/release/datafiles/blender_icons32/icon32_physics.dat
index e19408975bb..e9c5072cc57 100644
--- a/release/datafiles/blender_icons32/icon32_physics.dat
+++ b/release/datafiles/blender_icons32/icon32_physics.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_pinned.dat b/release/datafiles/blender_icons32/icon32_pinned.dat
index 0f337b18223..08fc5cc9fb9 100644
--- a/release/datafiles/blender_icons32/icon32_pinned.dat
+++ b/release/datafiles/blender_icons32/icon32_pinned.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_pivot_active.dat b/release/datafiles/blender_icons32/icon32_pivot_active.dat
new file mode 100644
index 00000000000..9317d32138c
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_pivot_active.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_pivot_boundbox.dat b/release/datafiles/blender_icons32/icon32_pivot_boundbox.dat
new file mode 100644
index 00000000000..1114b8c951b
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_pivot_boundbox.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_pivot_cursor.dat b/release/datafiles/blender_icons32/icon32_pivot_cursor.dat
new file mode 100644
index 00000000000..a011b312690
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_pivot_cursor.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_pivot_individual.dat b/release/datafiles/blender_icons32/icon32_pivot_individual.dat
new file mode 100644
index 00000000000..ecaa8a2d868
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_pivot_individual.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_pivot_median.dat b/release/datafiles/blender_icons32/icon32_pivot_median.dat
new file mode 100644
index 00000000000..ab5c25e2703
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_pivot_median.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_play.dat b/release/datafiles/blender_icons32/icon32_play.dat
index cce6c479910..7604f1eacb5 100644
--- a/release/datafiles/blender_icons32/icon32_play.dat
+++ b/release/datafiles/blender_icons32/icon32_play.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_play_audio.dat b/release/datafiles/blender_icons32/icon32_play_audio.dat
deleted file mode 100644
index ff8eca174a4..00000000000
--- a/release/datafiles/blender_icons32/icon32_play_audio.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_play_reverse.dat b/release/datafiles/blender_icons32/icon32_play_reverse.dat
index 39d8cac4bdb..66f902e9056 100644
--- a/release/datafiles/blender_icons32/icon32_play_reverse.dat
+++ b/release/datafiles/blender_icons32/icon32_play_reverse.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_plug.dat b/release/datafiles/blender_icons32/icon32_plug.dat
index 9c39e7f746f..a93da245617 100644
--- a/release/datafiles/blender_icons32/icon32_plug.dat
+++ b/release/datafiles/blender_icons32/icon32_plug.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_plugin.dat b/release/datafiles/blender_icons32/icon32_plugin.dat
index b1b42107fa0..fc49160911f 100644
--- a/release/datafiles/blender_icons32/icon32_plugin.dat
+++ b/release/datafiles/blender_icons32/icon32_plugin.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_plus.dat b/release/datafiles/blender_icons32/icon32_plus.dat
index e5753190b0f..97b80e39a64 100644
--- a/release/datafiles/blender_icons32/icon32_plus.dat
+++ b/release/datafiles/blender_icons32/icon32_plus.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_pmarker.dat b/release/datafiles/blender_icons32/icon32_pmarker.dat
index f0190252aef..cf8a22021f4 100644
--- a/release/datafiles/blender_icons32/icon32_pmarker.dat
+++ b/release/datafiles/blender_icons32/icon32_pmarker.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_pmarker_act.dat b/release/datafiles/blender_icons32/icon32_pmarker_act.dat
index 8fbe104769f..06e464b4130 100644
--- a/release/datafiles/blender_icons32/icon32_pmarker_act.dat
+++ b/release/datafiles/blender_icons32/icon32_pmarker_act.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_pmarker_sel.dat b/release/datafiles/blender_icons32/icon32_pmarker_sel.dat
index af6d01d7065..739d3a1ebdc 100644
--- a/release/datafiles/blender_icons32/icon32_pmarker_sel.dat
+++ b/release/datafiles/blender_icons32/icon32_pmarker_sel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_pose_data.dat b/release/datafiles/blender_icons32/icon32_pose_data.dat
index d5223c585b8..71e34c96345 100644
--- a/release/datafiles/blender_icons32/icon32_pose_data.dat
+++ b/release/datafiles/blender_icons32/icon32_pose_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_pose_hlt.dat b/release/datafiles/blender_icons32/icon32_pose_hlt.dat
index 2b2cb22daa6..d5f05a2e730 100644
--- a/release/datafiles/blender_icons32/icon32_pose_hlt.dat
+++ b/release/datafiles/blender_icons32/icon32_pose_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_potato.dat b/release/datafiles/blender_icons32/icon32_potato.dat
deleted file mode 100644
index b659a05fba8..00000000000
--- a/release/datafiles/blender_icons32/icon32_potato.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_preferences.dat b/release/datafiles/blender_icons32/icon32_preferences.dat
index 8655026276c..225a5c2d168 100644
--- a/release/datafiles/blender_icons32/icon32_preferences.dat
+++ b/release/datafiles/blender_icons32/icon32_preferences.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_preset.dat b/release/datafiles/blender_icons32/icon32_preset.dat
index f46bbac8a4d..f64fd6b5040 100644
--- a/release/datafiles/blender_icons32/icon32_preset.dat
+++ b/release/datafiles/blender_icons32/icon32_preset.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_preset_new.dat b/release/datafiles/blender_icons32/icon32_preset_new.dat
new file mode 100644
index 00000000000..ed3190329a6
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_preset_new.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_prev_keyframe.dat b/release/datafiles/blender_icons32/icon32_prev_keyframe.dat
index d7e55977468..31d024b4a1f 100644
--- a/release/datafiles/blender_icons32/icon32_prev_keyframe.dat
+++ b/release/datafiles/blender_icons32/icon32_prev_keyframe.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_preview_range.dat b/release/datafiles/blender_icons32/icon32_preview_range.dat
index cf5be16b609..ca4fdcf5e84 100644
--- a/release/datafiles/blender_icons32/icon32_preview_range.dat
+++ b/release/datafiles/blender_icons32/icon32_preview_range.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_prop_con.dat b/release/datafiles/blender_icons32/icon32_prop_con.dat
index 9baca062733..b6dd9b392d8 100644
--- a/release/datafiles/blender_icons32/icon32_prop_con.dat
+++ b/release/datafiles/blender_icons32/icon32_prop_con.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_prop_off.dat b/release/datafiles/blender_icons32/icon32_prop_off.dat
index 45585728193..0546f0fe462 100644
--- a/release/datafiles/blender_icons32/icon32_prop_off.dat
+++ b/release/datafiles/blender_icons32/icon32_prop_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_prop_on.dat b/release/datafiles/blender_icons32/icon32_prop_on.dat
index 0bad1fb4a52..e711017e359 100644
--- a/release/datafiles/blender_icons32/icon32_prop_on.dat
+++ b/release/datafiles/blender_icons32/icon32_prop_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_properties.dat b/release/datafiles/blender_icons32/icon32_properties.dat
new file mode 100644
index 00000000000..eabb0f28b85
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_properties.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_question.dat b/release/datafiles/blender_icons32/icon32_question.dat
index 8f4d1e77349..223f3d1966a 100644
--- a/release/datafiles/blender_icons32/icon32_question.dat
+++ b/release/datafiles/blender_icons32/icon32_question.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_quit.dat b/release/datafiles/blender_icons32/icon32_quit.dat
index 427e6f86fc4..dda9d0c3fc2 100644
--- a/release/datafiles/blender_icons32/icon32_quit.dat
+++ b/release/datafiles/blender_icons32/icon32_quit.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_radio.dat b/release/datafiles/blender_icons32/icon32_radio.dat
index 46b532c91f3..cf3e2485b95 100644
--- a/release/datafiles/blender_icons32/icon32_radio.dat
+++ b/release/datafiles/blender_icons32/icon32_radio.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_radiobut_off.dat b/release/datafiles/blender_icons32/icon32_radiobut_off.dat
index e63d7a5937b..2f41c8430ad 100644
--- a/release/datafiles/blender_icons32/icon32_radiobut_off.dat
+++ b/release/datafiles/blender_icons32/icon32_radiobut_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_radiobut_on.dat b/release/datafiles/blender_icons32/icon32_radiobut_on.dat
index bdfbaa3849d..b62f2280996 100644
--- a/release/datafiles/blender_icons32/icon32_radiobut_on.dat
+++ b/release/datafiles/blender_icons32/icon32_radiobut_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_rec.dat b/release/datafiles/blender_icons32/icon32_rec.dat
index 139586a8b4b..ec9493aacc2 100644
--- a/release/datafiles/blender_icons32/icon32_rec.dat
+++ b/release/datafiles/blender_icons32/icon32_rec.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_recover_auto.dat b/release/datafiles/blender_icons32/icon32_recover_auto.dat
deleted file mode 100644
index 7af4487558a..00000000000
--- a/release/datafiles/blender_icons32/icon32_recover_auto.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_recover_last.dat b/release/datafiles/blender_icons32/icon32_recover_last.dat
index 22b1fe0d439..32b95a61c82 100644
--- a/release/datafiles/blender_icons32/icon32_recover_last.dat
+++ b/release/datafiles/blender_icons32/icon32_recover_last.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_remove.dat b/release/datafiles/blender_icons32/icon32_remove.dat
new file mode 100644
index 00000000000..e95f0571ce6
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_remove.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_render_animation.dat b/release/datafiles/blender_icons32/icon32_render_animation.dat
index 25e44990dfc..3bb0cc4abcc 100644
--- a/release/datafiles/blender_icons32/icon32_render_animation.dat
+++ b/release/datafiles/blender_icons32/icon32_render_animation.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_render_region.dat b/release/datafiles/blender_icons32/icon32_render_region.dat
index e107754a1f3..ebe4cb8bfd6 100644
--- a/release/datafiles/blender_icons32/icon32_render_region.dat
+++ b/release/datafiles/blender_icons32/icon32_render_region.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_render_result.dat b/release/datafiles/blender_icons32/icon32_render_result.dat
index ad177a12ade..b4bcd68363b 100644
--- a/release/datafiles/blender_icons32/icon32_render_result.dat
+++ b/release/datafiles/blender_icons32/icon32_render_result.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_render_still.dat b/release/datafiles/blender_icons32/icon32_render_still.dat
index fab2030c1f2..e800dd6a120 100644
--- a/release/datafiles/blender_icons32/icon32_render_still.dat
+++ b/release/datafiles/blender_icons32/icon32_render_still.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_renderlayers.dat b/release/datafiles/blender_icons32/icon32_renderlayers.dat
index 2fc6a2d96dc..2aba2e8dfc0 100644
--- a/release/datafiles/blender_icons32/icon32_renderlayers.dat
+++ b/release/datafiles/blender_icons32/icon32_renderlayers.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_restrict_color_off.dat b/release/datafiles/blender_icons32/icon32_restrict_color_off.dat
index bbe5f61935d..75bb9159995 100644
--- a/release/datafiles/blender_icons32/icon32_restrict_color_off.dat
+++ b/release/datafiles/blender_icons32/icon32_restrict_color_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_restrict_color_on.dat b/release/datafiles/blender_icons32/icon32_restrict_color_on.dat
index 46ba9e31407..0f5702d7bdd 100644
--- a/release/datafiles/blender_icons32/icon32_restrict_color_on.dat
+++ b/release/datafiles/blender_icons32/icon32_restrict_color_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_restrict_render_off.dat b/release/datafiles/blender_icons32/icon32_restrict_render_off.dat
index 9788ed5c338..9b292bc8f69 100644
--- a/release/datafiles/blender_icons32/icon32_restrict_render_off.dat
+++ b/release/datafiles/blender_icons32/icon32_restrict_render_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_restrict_render_on.dat b/release/datafiles/blender_icons32/icon32_restrict_render_on.dat
index 041952094ef..7f23b246d13 100644
--- a/release/datafiles/blender_icons32/icon32_restrict_render_on.dat
+++ b/release/datafiles/blender_icons32/icon32_restrict_render_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_restrict_select_off.dat b/release/datafiles/blender_icons32/icon32_restrict_select_off.dat
index 230b03f6036..43a1d88ae73 100644
--- a/release/datafiles/blender_icons32/icon32_restrict_select_off.dat
+++ b/release/datafiles/blender_icons32/icon32_restrict_select_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_restrict_select_on.dat b/release/datafiles/blender_icons32/icon32_restrict_select_on.dat
index 1756a3da6b3..714fe951b46 100644
--- a/release/datafiles/blender_icons32/icon32_restrict_select_on.dat
+++ b/release/datafiles/blender_icons32/icon32_restrict_select_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_restrict_view_off.dat b/release/datafiles/blender_icons32/icon32_restrict_view_off.dat
index c5cfc01e38e..26059e4eedf 100644
--- a/release/datafiles/blender_icons32/icon32_restrict_view_off.dat
+++ b/release/datafiles/blender_icons32/icon32_restrict_view_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_restrict_view_on.dat b/release/datafiles/blender_icons32/icon32_restrict_view_on.dat
index 3512212c209..7ed3928b4b0 100644
--- a/release/datafiles/blender_icons32/icon32_restrict_view_on.dat
+++ b/release/datafiles/blender_icons32/icon32_restrict_view_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_retopo.dat b/release/datafiles/blender_icons32/icon32_retopo.dat
index c411ab3fe9a..f8c3b46e729 100644
--- a/release/datafiles/blender_icons32/icon32_retopo.dat
+++ b/release/datafiles/blender_icons32/icon32_retopo.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_rew.dat b/release/datafiles/blender_icons32/icon32_rew.dat
index f30ed90418a..090ac1185d9 100644
--- a/release/datafiles/blender_icons32/icon32_rew.dat
+++ b/release/datafiles/blender_icons32/icon32_rew.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_rightarrow.dat b/release/datafiles/blender_icons32/icon32_rightarrow.dat
index 34946602c8e..4d7e467b1e7 100644
--- a/release/datafiles/blender_icons32/icon32_rightarrow.dat
+++ b/release/datafiles/blender_icons32/icon32_rightarrow.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_rightarrow_thin.dat b/release/datafiles/blender_icons32/icon32_rightarrow_thin.dat
index cd8e867cf37..2d27dab5c7b 100644
--- a/release/datafiles/blender_icons32/icon32_rightarrow_thin.dat
+++ b/release/datafiles/blender_icons32/icon32_rightarrow_thin.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_rna.dat b/release/datafiles/blender_icons32/icon32_rna.dat
index 5090d1e4408..9f3db375f18 100644
--- a/release/datafiles/blender_icons32/icon32_rna.dat
+++ b/release/datafiles/blender_icons32/icon32_rna.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_rna_add.dat b/release/datafiles/blender_icons32/icon32_rna_add.dat
index 184bf0303d8..44894ccbcd0 100644
--- a/release/datafiles/blender_icons32/icon32_rna_add.dat
+++ b/release/datafiles/blender_icons32/icon32_rna_add.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_rndcurve.dat b/release/datafiles/blender_icons32/icon32_rndcurve.dat
index bb25b0042cb..893230add49 100644
--- a/release/datafiles/blender_icons32/icon32_rndcurve.dat
+++ b/release/datafiles/blender_icons32/icon32_rndcurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_rootcurve.dat b/release/datafiles/blender_icons32/icon32_rootcurve.dat
index bcccdd02f40..0c4a5c71261 100644
--- a/release/datafiles/blender_icons32/icon32_rootcurve.dat
+++ b/release/datafiles/blender_icons32/icon32_rootcurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_rotactive.dat b/release/datafiles/blender_icons32/icon32_rotactive.dat
deleted file mode 100644
index 77d67ea3fda..00000000000
--- a/release/datafiles/blender_icons32/icon32_rotactive.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_rotate.dat b/release/datafiles/blender_icons32/icon32_rotate.dat
deleted file mode 100644
index ff6169ea8d6..00000000000
--- a/release/datafiles/blender_icons32/icon32_rotate.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_rotatecenter.dat b/release/datafiles/blender_icons32/icon32_rotatecenter.dat
deleted file mode 100644
index 56d9be06ed0..00000000000
--- a/release/datafiles/blender_icons32/icon32_rotatecenter.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_rotatecollection.dat b/release/datafiles/blender_icons32/icon32_rotatecollection.dat
deleted file mode 100644
index 96ef38a51bf..00000000000
--- a/release/datafiles/blender_icons32/icon32_rotatecollection.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_save_as.dat b/release/datafiles/blender_icons32/icon32_save_as.dat
deleted file mode 100644
index 084203afdf2..00000000000
--- a/release/datafiles/blender_icons32/icon32_save_as.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_save_copy.dat b/release/datafiles/blender_icons32/icon32_save_copy.dat
deleted file mode 100644
index 069e8c04d97..00000000000
--- a/release/datafiles/blender_icons32/icon32_save_copy.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_save_prefs.dat b/release/datafiles/blender_icons32/icon32_save_prefs.dat
deleted file mode 100644
index e0c18a0e586..00000000000
--- a/release/datafiles/blender_icons32/icon32_save_prefs.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_scene.dat b/release/datafiles/blender_icons32/icon32_scene.dat
index 746a76fdc70..ae6ba2b1d39 100644
--- a/release/datafiles/blender_icons32/icon32_scene.dat
+++ b/release/datafiles/blender_icons32/icon32_scene.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_scene_data.dat b/release/datafiles/blender_icons32/icon32_scene_data.dat
index 0079e6408a4..a972f300472 100644
--- a/release/datafiles/blender_icons32/icon32_scene_data.dat
+++ b/release/datafiles/blender_icons32/icon32_scene_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_screen_back.dat b/release/datafiles/blender_icons32/icon32_screen_back.dat
index 440ab51353d..6a230ef9c15 100644
--- a/release/datafiles/blender_icons32/icon32_screen_back.dat
+++ b/release/datafiles/blender_icons32/icon32_screen_back.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_script.dat b/release/datafiles/blender_icons32/icon32_script.dat
index 1a66c15984f..ff253e3df00 100644
--- a/release/datafiles/blender_icons32/icon32_script.dat
+++ b/release/datafiles/blender_icons32/icon32_script.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_scriptplugins.dat b/release/datafiles/blender_icons32/icon32_scriptplugins.dat
index 9dbcc05cfc2..35689713aa3 100644
--- a/release/datafiles/blender_icons32/icon32_scriptplugins.dat
+++ b/release/datafiles/blender_icons32/icon32_scriptplugins.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_scriptwin.dat b/release/datafiles/blender_icons32/icon32_scriptwin.dat
deleted file mode 100644
index 47c9f63326f..00000000000
--- a/release/datafiles/blender_icons32/icon32_scriptwin.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_sculpt_dyntopo.dat b/release/datafiles/blender_icons32/icon32_sculpt_dyntopo.dat
new file mode 100644
index 00000000000..78f5d680acb
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_sculpt_dyntopo.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_sculptmode_hlt.dat b/release/datafiles/blender_icons32/icon32_sculptmode_hlt.dat
index 528906449b6..a6357c0823a 100644
--- a/release/datafiles/blender_icons32/icon32_sculptmode_hlt.dat
+++ b/release/datafiles/blender_icons32/icon32_sculptmode_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_sealed.dat b/release/datafiles/blender_icons32/icon32_sealed.dat
new file mode 100644
index 00000000000..37d48608be2
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_sealed.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_seq_chroma_scope.dat b/release/datafiles/blender_icons32/icon32_seq_chroma_scope.dat
index 5a0c1eed12c..b8f39a1d6f4 100644
--- a/release/datafiles/blender_icons32/icon32_seq_chroma_scope.dat
+++ b/release/datafiles/blender_icons32/icon32_seq_chroma_scope.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_seq_histogram.dat b/release/datafiles/blender_icons32/icon32_seq_histogram.dat
index b0d043ef6a2..ece49c8abf7 100644
--- a/release/datafiles/blender_icons32/icon32_seq_histogram.dat
+++ b/release/datafiles/blender_icons32/icon32_seq_histogram.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_seq_luma_waveform.dat b/release/datafiles/blender_icons32/icon32_seq_luma_waveform.dat
index 74640ecf059..d705ca12637 100644
--- a/release/datafiles/blender_icons32/icon32_seq_luma_waveform.dat
+++ b/release/datafiles/blender_icons32/icon32_seq_luma_waveform.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_seq_preview.dat b/release/datafiles/blender_icons32/icon32_seq_preview.dat
index 0ce293dc64f..4af982e6842 100644
--- a/release/datafiles/blender_icons32/icon32_seq_preview.dat
+++ b/release/datafiles/blender_icons32/icon32_seq_preview.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_seq_sequencer.dat b/release/datafiles/blender_icons32/icon32_seq_sequencer.dat
index e7f234e194e..2ea4c42a5df 100644
--- a/release/datafiles/blender_icons32/icon32_seq_sequencer.dat
+++ b/release/datafiles/blender_icons32/icon32_seq_sequencer.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_seq_splitview.dat b/release/datafiles/blender_icons32/icon32_seq_splitview.dat
index 86e471df283..0e65cfb41bb 100644
--- a/release/datafiles/blender_icons32/icon32_seq_splitview.dat
+++ b/release/datafiles/blender_icons32/icon32_seq_splitview.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_sequence.dat b/release/datafiles/blender_icons32/icon32_sequence.dat
index 379cb8abcce..70378ea8364 100644
--- a/release/datafiles/blender_icons32/icon32_sequence.dat
+++ b/release/datafiles/blender_icons32/icon32_sequence.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_settings.dat b/release/datafiles/blender_icons32/icon32_settings.dat
index 640f342f02f..d09c0e18832 100644
--- a/release/datafiles/blender_icons32/icon32_settings.dat
+++ b/release/datafiles/blender_icons32/icon32_settings.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_shaderfx.dat b/release/datafiles/blender_icons32/icon32_shaderfx.dat
index 2888d09831f..b58ce86761e 100644
--- a/release/datafiles/blender_icons32/icon32_shaderfx.dat
+++ b/release/datafiles/blender_icons32/icon32_shaderfx.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_shading_bbox.dat b/release/datafiles/blender_icons32/icon32_shading_bbox.dat
new file mode 100644
index 00000000000..f4e7645ef23
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_shading_bbox.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_shading_rendered.dat b/release/datafiles/blender_icons32/icon32_shading_rendered.dat
new file mode 100644
index 00000000000..c8011d4a856
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_shading_rendered.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_shading_solid.dat b/release/datafiles/blender_icons32/icon32_shading_solid.dat
new file mode 100644
index 00000000000..eb846b075d1
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_shading_solid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_shading_texture.dat b/release/datafiles/blender_icons32/icon32_shading_texture.dat
new file mode 100644
index 00000000000..a72c06bbaf1
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_shading_texture.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_shading_wire.dat b/release/datafiles/blender_icons32/icon32_shading_wire.dat
new file mode 100644
index 00000000000..040c486acfa
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_shading_wire.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_shapekey_data.dat b/release/datafiles/blender_icons32/icon32_shapekey_data.dat
index f570c202e50..505f796ad0c 100644
--- a/release/datafiles/blender_icons32/icon32_shapekey_data.dat
+++ b/release/datafiles/blender_icons32/icon32_shapekey_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_sharpcurve.dat b/release/datafiles/blender_icons32/icon32_sharpcurve.dat
index 94d294cb880..8ed8cc3adfb 100644
--- a/release/datafiles/blender_icons32/icon32_sharpcurve.dat
+++ b/release/datafiles/blender_icons32/icon32_sharpcurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_shortdisplay.dat b/release/datafiles/blender_icons32/icon32_shortdisplay.dat
index 5bb0347124a..b5c9e9e6d07 100644
--- a/release/datafiles/blender_icons32/icon32_shortdisplay.dat
+++ b/release/datafiles/blender_icons32/icon32_shortdisplay.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_small_caps.dat b/release/datafiles/blender_icons32/icon32_small_caps.dat
new file mode 100644
index 00000000000..19b983b299d
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_small_caps.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_smooth.dat b/release/datafiles/blender_icons32/icon32_smooth.dat
deleted file mode 100644
index b82edac6867..00000000000
--- a/release/datafiles/blender_icons32/icon32_smooth.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_smoothcurve.dat b/release/datafiles/blender_icons32/icon32_smoothcurve.dat
index 3590af10e70..f34cc621b22 100644
--- a/release/datafiles/blender_icons32/icon32_smoothcurve.dat
+++ b/release/datafiles/blender_icons32/icon32_smoothcurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_snap_edge.dat b/release/datafiles/blender_icons32/icon32_snap_edge.dat
index eb76101cb6f..7d0a44b25af 100644
--- a/release/datafiles/blender_icons32/icon32_snap_edge.dat
+++ b/release/datafiles/blender_icons32/icon32_snap_edge.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_snap_face.dat b/release/datafiles/blender_icons32/icon32_snap_face.dat
index c740332d212..abf7d409e79 100644
--- a/release/datafiles/blender_icons32/icon32_snap_face.dat
+++ b/release/datafiles/blender_icons32/icon32_snap_face.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_snap_grid.dat b/release/datafiles/blender_icons32/icon32_snap_grid.dat
index cc4c0efe3c4..3c0181b60c8 100644
--- a/release/datafiles/blender_icons32/icon32_snap_grid.dat
+++ b/release/datafiles/blender_icons32/icon32_snap_grid.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_snap_increment.dat b/release/datafiles/blender_icons32/icon32_snap_increment.dat
index eb88877e3ad..24fe18beca8 100644
--- a/release/datafiles/blender_icons32/icon32_snap_increment.dat
+++ b/release/datafiles/blender_icons32/icon32_snap_increment.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_snap_normal.dat b/release/datafiles/blender_icons32/icon32_snap_normal.dat
index 454184b8d1a..df2e6337011 100644
--- a/release/datafiles/blender_icons32/icon32_snap_normal.dat
+++ b/release/datafiles/blender_icons32/icon32_snap_normal.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_snap_off.dat b/release/datafiles/blender_icons32/icon32_snap_off.dat
index b086a91553c..4cf860e1928 100644
--- a/release/datafiles/blender_icons32/icon32_snap_off.dat
+++ b/release/datafiles/blender_icons32/icon32_snap_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_snap_on.dat b/release/datafiles/blender_icons32/icon32_snap_on.dat
index c9b7f0cf0af..bbf17b3b90d 100644
--- a/release/datafiles/blender_icons32/icon32_snap_on.dat
+++ b/release/datafiles/blender_icons32/icon32_snap_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_snap_peel_object.dat b/release/datafiles/blender_icons32/icon32_snap_peel_object.dat
index 1a8cf7064d7..a4ec4a63d28 100644
--- a/release/datafiles/blender_icons32/icon32_snap_peel_object.dat
+++ b/release/datafiles/blender_icons32/icon32_snap_peel_object.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_snap_surface.dat b/release/datafiles/blender_icons32/icon32_snap_surface.dat
deleted file mode 100644
index 75e3adce528..00000000000
--- a/release/datafiles/blender_icons32/icon32_snap_surface.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_snap_vertex.dat b/release/datafiles/blender_icons32/icon32_snap_vertex.dat
index 351b672f8b3..b5e2d16fd92 100644
--- a/release/datafiles/blender_icons32/icon32_snap_vertex.dat
+++ b/release/datafiles/blender_icons32/icon32_snap_vertex.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_snap_volume.dat b/release/datafiles/blender_icons32/icon32_snap_volume.dat
index 692d776702d..897490f0b80 100644
--- a/release/datafiles/blender_icons32/icon32_snap_volume.dat
+++ b/release/datafiles/blender_icons32/icon32_snap_volume.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_solid.dat b/release/datafiles/blender_icons32/icon32_solid.dat
deleted file mode 100644
index f330d1dd68c..00000000000
--- a/release/datafiles/blender_icons32/icon32_solid.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_solo_off.dat b/release/datafiles/blender_icons32/icon32_solo_off.dat
index fd2eeb7fdd0..8108ca26d74 100644
--- a/release/datafiles/blender_icons32/icon32_solo_off.dat
+++ b/release/datafiles/blender_icons32/icon32_solo_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_solo_on.dat b/release/datafiles/blender_icons32/icon32_solo_on.dat
index 5e6a3566f6a..64e98290425 100644
--- a/release/datafiles/blender_icons32/icon32_solo_on.dat
+++ b/release/datafiles/blender_icons32/icon32_solo_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_sort_asc.dat b/release/datafiles/blender_icons32/icon32_sort_asc.dat
new file mode 100644
index 00000000000..9ed9e60a4d9
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_sort_asc.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_sort_desc.dat b/release/datafiles/blender_icons32/icon32_sort_desc.dat
new file mode 100644
index 00000000000..b409b982f6f
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_sort_desc.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_sortalpha.dat b/release/datafiles/blender_icons32/icon32_sortalpha.dat
index 1b49c22edb1..10d21240e57 100644
--- a/release/datafiles/blender_icons32/icon32_sortalpha.dat
+++ b/release/datafiles/blender_icons32/icon32_sortalpha.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_sortbyext.dat b/release/datafiles/blender_icons32/icon32_sortbyext.dat
index 64fcdcbd577..0bb38dcd08c 100644
--- a/release/datafiles/blender_icons32/icon32_sortbyext.dat
+++ b/release/datafiles/blender_icons32/icon32_sortbyext.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_sortsize.dat b/release/datafiles/blender_icons32/icon32_sortsize.dat
index 581f8d8e3fd..d8258648027 100644
--- a/release/datafiles/blender_icons32/icon32_sortsize.dat
+++ b/release/datafiles/blender_icons32/icon32_sortsize.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_sorttime.dat b/release/datafiles/blender_icons32/icon32_sorttime.dat
index 58253dc35cb..9bd36f71c46 100644
--- a/release/datafiles/blender_icons32/icon32_sorttime.dat
+++ b/release/datafiles/blender_icons32/icon32_sorttime.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_sound.dat b/release/datafiles/blender_icons32/icon32_sound.dat
index a9807e32167..1fe1cbb6f7b 100644
--- a/release/datafiles/blender_icons32/icon32_sound.dat
+++ b/release/datafiles/blender_icons32/icon32_sound.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_space2.dat b/release/datafiles/blender_icons32/icon32_space2.dat
deleted file mode 100644
index b0eb7857e27..00000000000
--- a/release/datafiles/blender_icons32/icon32_space2.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_space3.dat b/release/datafiles/blender_icons32/icon32_space3.dat
deleted file mode 100644
index 038c83c8082..00000000000
--- a/release/datafiles/blender_icons32/icon32_space3.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_speaker.dat b/release/datafiles/blender_icons32/icon32_speaker.dat
index aa7abcb6301..970f525c1c8 100644
--- a/release/datafiles/blender_icons32/icon32_speaker.dat
+++ b/release/datafiles/blender_icons32/icon32_speaker.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_spherecurve.dat b/release/datafiles/blender_icons32/icon32_spherecurve.dat
index e11685edc7f..723d8f476dd 100644
--- a/release/datafiles/blender_icons32/icon32_spherecurve.dat
+++ b/release/datafiles/blender_icons32/icon32_spherecurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_splitscreen.dat b/release/datafiles/blender_icons32/icon32_splitscreen.dat
deleted file mode 100644
index fea857e6e1b..00000000000
--- a/release/datafiles/blender_icons32/icon32_splitscreen.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_sticky_uvs_disable.dat b/release/datafiles/blender_icons32/icon32_sticky_uvs_disable.dat
index 899ffb784b0..79052300e64 100644
--- a/release/datafiles/blender_icons32/icon32_sticky_uvs_disable.dat
+++ b/release/datafiles/blender_icons32/icon32_sticky_uvs_disable.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_sticky_uvs_loc.dat b/release/datafiles/blender_icons32/icon32_sticky_uvs_loc.dat
index d5d18abcd36..07e24d256e9 100644
--- a/release/datafiles/blender_icons32/icon32_sticky_uvs_loc.dat
+++ b/release/datafiles/blender_icons32/icon32_sticky_uvs_loc.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_sticky_uvs_vert.dat b/release/datafiles/blender_icons32/icon32_sticky_uvs_vert.dat
index ac16ebdfd6d..31f0650f5b6 100644
--- a/release/datafiles/blender_icons32/icon32_sticky_uvs_vert.dat
+++ b/release/datafiles/blender_icons32/icon32_sticky_uvs_vert.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_strands.dat b/release/datafiles/blender_icons32/icon32_strands.dat
index 4d08883daf9..c9ba23f33a5 100644
--- a/release/datafiles/blender_icons32/icon32_strands.dat
+++ b/release/datafiles/blender_icons32/icon32_strands.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_stylus_pressure.dat b/release/datafiles/blender_icons32/icon32_stylus_pressure.dat
index 6a0439e0e3c..5a56c07b60c 100644
--- a/release/datafiles/blender_icons32/icon32_stylus_pressure.dat
+++ b/release/datafiles/blender_icons32/icon32_stylus_pressure.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_surface_data.dat b/release/datafiles/blender_icons32/icon32_surface_data.dat
index cbb0c0ae8e8..9904e7aae3f 100644
--- a/release/datafiles/blender_icons32/icon32_surface_data.dat
+++ b/release/datafiles/blender_icons32/icon32_surface_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_surface_ncircle.dat b/release/datafiles/blender_icons32/icon32_surface_ncircle.dat
index 130f9ec72c1..2a61167fb8c 100644
--- a/release/datafiles/blender_icons32/icon32_surface_ncircle.dat
+++ b/release/datafiles/blender_icons32/icon32_surface_ncircle.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_surface_ncurve.dat b/release/datafiles/blender_icons32/icon32_surface_ncurve.dat
index af3f64e4e94..4b48d4cd9e6 100644
--- a/release/datafiles/blender_icons32/icon32_surface_ncurve.dat
+++ b/release/datafiles/blender_icons32/icon32_surface_ncurve.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_surface_ncylinder.dat b/release/datafiles/blender_icons32/icon32_surface_ncylinder.dat
index ea963141fba..3b67a3eef67 100644
--- a/release/datafiles/blender_icons32/icon32_surface_ncylinder.dat
+++ b/release/datafiles/blender_icons32/icon32_surface_ncylinder.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_surface_nsphere.dat b/release/datafiles/blender_icons32/icon32_surface_nsphere.dat
index 2a54675c01a..dcb270a2c49 100644
--- a/release/datafiles/blender_icons32/icon32_surface_nsphere.dat
+++ b/release/datafiles/blender_icons32/icon32_surface_nsphere.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_surface_nsurface.dat b/release/datafiles/blender_icons32/icon32_surface_nsurface.dat
index e89436d5bf6..964ad81b652 100644
--- a/release/datafiles/blender_icons32/icon32_surface_nsurface.dat
+++ b/release/datafiles/blender_icons32/icon32_surface_nsurface.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_surface_ntorus.dat b/release/datafiles/blender_icons32/icon32_surface_ntorus.dat
index d0b7ea24b4f..915a979485b 100644
--- a/release/datafiles/blender_icons32/icon32_surface_ntorus.dat
+++ b/release/datafiles/blender_icons32/icon32_surface_ntorus.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_syntax_off.dat b/release/datafiles/blender_icons32/icon32_syntax_off.dat
index b98ccd72054..16e5bf2152d 100644
--- a/release/datafiles/blender_icons32/icon32_syntax_off.dat
+++ b/release/datafiles/blender_icons32/icon32_syntax_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_syntax_on.dat b/release/datafiles/blender_icons32/icon32_syntax_on.dat
index 520091e0676..67d279569eb 100644
--- a/release/datafiles/blender_icons32/icon32_syntax_on.dat
+++ b/release/datafiles/blender_icons32/icon32_syntax_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_system.dat b/release/datafiles/blender_icons32/icon32_system.dat
new file mode 100644
index 00000000000..aa4e0715504
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_system.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_temperature.dat b/release/datafiles/blender_icons32/icon32_temperature.dat
new file mode 100644
index 00000000000..c564327f9fd
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_temperature.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_text.dat b/release/datafiles/blender_icons32/icon32_text.dat
index 6c88693e870..5316a05d495 100644
--- a/release/datafiles/blender_icons32/icon32_text.dat
+++ b/release/datafiles/blender_icons32/icon32_text.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_texture.dat b/release/datafiles/blender_icons32/icon32_texture.dat
index 5bb3bb0e082..9a2b156abd1 100644
--- a/release/datafiles/blender_icons32/icon32_texture.dat
+++ b/release/datafiles/blender_icons32/icon32_texture.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_texture_data.dat b/release/datafiles/blender_icons32/icon32_texture_data.dat
index 16a1f4ada8f..f3e77dd7a23 100644
--- a/release/datafiles/blender_icons32/icon32_texture_data.dat
+++ b/release/datafiles/blender_icons32/icon32_texture_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_texture_shaded.dat b/release/datafiles/blender_icons32/icon32_texture_shaded.dat
index 49813b0b347..0bc061de5b2 100644
--- a/release/datafiles/blender_icons32/icon32_texture_shaded.dat
+++ b/release/datafiles/blender_icons32/icon32_texture_shaded.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_three_dots.dat b/release/datafiles/blender_icons32/icon32_three_dots.dat
new file mode 100644
index 00000000000..8022d377400
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_three_dots.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_time.dat b/release/datafiles/blender_icons32/icon32_time.dat
index 1195599978d..0f05e77ac3b 100644
--- a/release/datafiles/blender_icons32/icon32_time.dat
+++ b/release/datafiles/blender_icons32/icon32_time.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tool_settings.dat b/release/datafiles/blender_icons32/icon32_tool_settings.dat
index 05680aaa4c6..9dc63a2c77c 100644
--- a/release/datafiles/blender_icons32/icon32_tool_settings.dat
+++ b/release/datafiles/blender_icons32/icon32_tool_settings.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tpaint_hlt.dat b/release/datafiles/blender_icons32/icon32_tpaint_hlt.dat
index 50230ae112d..cd21f05419c 100644
--- a/release/datafiles/blender_icons32/icon32_tpaint_hlt.dat
+++ b/release/datafiles/blender_icons32/icon32_tpaint_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tracking.dat b/release/datafiles/blender_icons32/icon32_tracking.dat
new file mode 100644
index 00000000000..0a7e4ca544e
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_tracking.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tracking_backwards.dat b/release/datafiles/blender_icons32/icon32_tracking_backwards.dat
new file mode 100644
index 00000000000..77d50213038
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_tracking_backwards.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tracking_backwards_single.dat b/release/datafiles/blender_icons32/icon32_tracking_backwards_single.dat
new file mode 100644
index 00000000000..5c49f832263
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_tracking_backwards_single.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tracking_clear_backwards.dat b/release/datafiles/blender_icons32/icon32_tracking_clear_backwards.dat
new file mode 100644
index 00000000000..bafe48f1705
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_tracking_clear_backwards.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tracking_clear_forwards.dat b/release/datafiles/blender_icons32/icon32_tracking_clear_forwards.dat
new file mode 100644
index 00000000000..b5529148176
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_tracking_clear_forwards.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tracking_forwards.dat b/release/datafiles/blender_icons32/icon32_tracking_forwards.dat
new file mode 100644
index 00000000000..10c61d6b4fb
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_tracking_forwards.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tracking_forwards_single.dat b/release/datafiles/blender_icons32/icon32_tracking_forwards_single.dat
new file mode 100644
index 00000000000..f78a0fb5480
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_tracking_forwards_single.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tracking_refine_backwards.dat b/release/datafiles/blender_icons32/icon32_tracking_refine_backwards.dat
new file mode 100644
index 00000000000..94a9bef4d1c
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_tracking_refine_backwards.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tracking_refine_forwards.dat b/release/datafiles/blender_icons32/icon32_tracking_refine_forwards.dat
new file mode 100644
index 00000000000..26c956d2375
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_tracking_refine_forwards.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tria_down.dat b/release/datafiles/blender_icons32/icon32_tria_down.dat
index 4fbfa6069dc..2ac91541329 100644
--- a/release/datafiles/blender_icons32/icon32_tria_down.dat
+++ b/release/datafiles/blender_icons32/icon32_tria_down.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tria_down_bar.dat b/release/datafiles/blender_icons32/icon32_tria_down_bar.dat
index ef6e86ba154..37815d6098f 100644
--- a/release/datafiles/blender_icons32/icon32_tria_down_bar.dat
+++ b/release/datafiles/blender_icons32/icon32_tria_down_bar.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tria_left.dat b/release/datafiles/blender_icons32/icon32_tria_left.dat
index b43259ba603..241372e8a24 100644
--- a/release/datafiles/blender_icons32/icon32_tria_left.dat
+++ b/release/datafiles/blender_icons32/icon32_tria_left.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tria_left_bar.dat b/release/datafiles/blender_icons32/icon32_tria_left_bar.dat
index a1d48baf971..55cd38c35f8 100644
--- a/release/datafiles/blender_icons32/icon32_tria_left_bar.dat
+++ b/release/datafiles/blender_icons32/icon32_tria_left_bar.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tria_right.dat b/release/datafiles/blender_icons32/icon32_tria_right.dat
index 5b38f37ea28..d263f43fc57 100644
--- a/release/datafiles/blender_icons32/icon32_tria_right.dat
+++ b/release/datafiles/blender_icons32/icon32_tria_right.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tria_right_bar.dat b/release/datafiles/blender_icons32/icon32_tria_right_bar.dat
index 4f687537658..abad6d8432f 100644
--- a/release/datafiles/blender_icons32/icon32_tria_right_bar.dat
+++ b/release/datafiles/blender_icons32/icon32_tria_right_bar.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tria_up.dat b/release/datafiles/blender_icons32/icon32_tria_up.dat
index 5ee815c0674..aeeb4796990 100644
--- a/release/datafiles/blender_icons32/icon32_tria_up.dat
+++ b/release/datafiles/blender_icons32/icon32_tria_up.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_tria_up_bar.dat b/release/datafiles/blender_icons32/icon32_tria_up_bar.dat
index e6c5d5561cd..575f555d8e1 100644
--- a/release/datafiles/blender_icons32/icon32_tria_up_bar.dat
+++ b/release/datafiles/blender_icons32/icon32_tria_up_bar.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_uglypackage.dat b/release/datafiles/blender_icons32/icon32_uglypackage.dat
index d7707ff8fff..6193fb576d0 100644
--- a/release/datafiles/blender_icons32/icon32_uglypackage.dat
+++ b/release/datafiles/blender_icons32/icon32_uglypackage.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_ui.dat b/release/datafiles/blender_icons32/icon32_ui.dat
index b354b271e22..bd6fe825763 100644
--- a/release/datafiles/blender_icons32/icon32_ui.dat
+++ b/release/datafiles/blender_icons32/icon32_ui.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_underline.dat b/release/datafiles/blender_icons32/icon32_underline.dat
new file mode 100644
index 00000000000..127d6c637dd
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_underline.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_unlinked.dat b/release/datafiles/blender_icons32/icon32_unlinked.dat
index eb2ed9b5219..7aacf4d03da 100644
--- a/release/datafiles/blender_icons32/icon32_unlinked.dat
+++ b/release/datafiles/blender_icons32/icon32_unlinked.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_unlocked.dat b/release/datafiles/blender_icons32/icon32_unlocked.dat
index 9c1fe07097d..9ce5efb8c9a 100644
--- a/release/datafiles/blender_icons32/icon32_unlocked.dat
+++ b/release/datafiles/blender_icons32/icon32_unlocked.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_unpinned.dat b/release/datafiles/blender_icons32/icon32_unpinned.dat
index 46de4514344..1fa5d0b0c4b 100644
--- a/release/datafiles/blender_icons32/icon32_unpinned.dat
+++ b/release/datafiles/blender_icons32/icon32_unpinned.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_url.dat b/release/datafiles/blender_icons32/icon32_url.dat
index 5077c3d4d07..79d5ce1462e 100644
--- a/release/datafiles/blender_icons32/icon32_url.dat
+++ b/release/datafiles/blender_icons32/icon32_url.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_user.dat b/release/datafiles/blender_icons32/icon32_user.dat
new file mode 100644
index 00000000000..bfc684e62d0
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_user.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_uv.dat b/release/datafiles/blender_icons32/icon32_uv.dat
new file mode 100644
index 00000000000..99e79fdd432
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_uv.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_uv_edgesel.dat b/release/datafiles/blender_icons32/icon32_uv_edgesel.dat
index f528db791de..3aa62bf797a 100644
--- a/release/datafiles/blender_icons32/icon32_uv_edgesel.dat
+++ b/release/datafiles/blender_icons32/icon32_uv_edgesel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_uv_facesel.dat b/release/datafiles/blender_icons32/icon32_uv_facesel.dat
index 022ae5300b3..3516ca4e80c 100644
--- a/release/datafiles/blender_icons32/icon32_uv_facesel.dat
+++ b/release/datafiles/blender_icons32/icon32_uv_facesel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_uv_islandsel.dat b/release/datafiles/blender_icons32/icon32_uv_islandsel.dat
index 46044bd90dc..79e4122349e 100644
--- a/release/datafiles/blender_icons32/icon32_uv_islandsel.dat
+++ b/release/datafiles/blender_icons32/icon32_uv_islandsel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_uv_sync_select.dat b/release/datafiles/blender_icons32/icon32_uv_sync_select.dat
index faf9a03027d..f487729cc36 100644
--- a/release/datafiles/blender_icons32/icon32_uv_sync_select.dat
+++ b/release/datafiles/blender_icons32/icon32_uv_sync_select.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_uv_vertexsel.dat b/release/datafiles/blender_icons32/icon32_uv_vertexsel.dat
index 805bc67b2fb..5710b87d4e7 100644
--- a/release/datafiles/blender_icons32/icon32_uv_vertexsel.dat
+++ b/release/datafiles/blender_icons32/icon32_uv_vertexsel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_vertexsel.dat b/release/datafiles/blender_icons32/icon32_vertexsel.dat
index 37bb89d5583..ec6671820ad 100644
--- a/release/datafiles/blender_icons32/icon32_vertexsel.dat
+++ b/release/datafiles/blender_icons32/icon32_vertexsel.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_view3d.dat b/release/datafiles/blender_icons32/icon32_view3d.dat
index 8304de5caa7..2f4ec31c670 100644
--- a/release/datafiles/blender_icons32/icon32_view3d.dat
+++ b/release/datafiles/blender_icons32/icon32_view3d.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_view_camera.dat b/release/datafiles/blender_icons32/icon32_view_camera.dat
new file mode 100644
index 00000000000..d64d054ef1d
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_view_camera.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_view_ortho.dat b/release/datafiles/blender_icons32/icon32_view_ortho.dat
new file mode 100644
index 00000000000..f8c6db4fe5b
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_view_ortho.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_view_pan.dat b/release/datafiles/blender_icons32/icon32_view_pan.dat
new file mode 100644
index 00000000000..465db24b2cd
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_view_pan.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_view_perspective.dat b/release/datafiles/blender_icons32/icon32_view_perspective.dat
new file mode 100644
index 00000000000..14e55b7257a
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_view_perspective.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_view_zoom.dat b/release/datafiles/blender_icons32/icon32_view_zoom.dat
new file mode 100644
index 00000000000..5f43c0e3943
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_view_zoom.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_viewzoom.dat b/release/datafiles/blender_icons32/icon32_viewzoom.dat
index 4a7a682a94d..92b5063afa8 100644
--- a/release/datafiles/blender_icons32/icon32_viewzoom.dat
+++ b/release/datafiles/blender_icons32/icon32_viewzoom.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_vis_sel_00.dat b/release/datafiles/blender_icons32/icon32_vis_sel_00.dat
index afcba867e96..2906408b169 100644
--- a/release/datafiles/blender_icons32/icon32_vis_sel_00.dat
+++ b/release/datafiles/blender_icons32/icon32_vis_sel_00.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_vis_sel_01.dat b/release/datafiles/blender_icons32/icon32_vis_sel_01.dat
index 0d6375aae99..332f0901b49 100644
--- a/release/datafiles/blender_icons32/icon32_vis_sel_01.dat
+++ b/release/datafiles/blender_icons32/icon32_vis_sel_01.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_vis_sel_10.dat b/release/datafiles/blender_icons32/icon32_vis_sel_10.dat
index 3b86427cb47..09fb8c20018 100644
--- a/release/datafiles/blender_icons32/icon32_vis_sel_10.dat
+++ b/release/datafiles/blender_icons32/icon32_vis_sel_10.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_vis_sel_11.dat b/release/datafiles/blender_icons32/icon32_vis_sel_11.dat
index 7762a97e9e8..38fb1528922 100644
--- a/release/datafiles/blender_icons32/icon32_vis_sel_11.dat
+++ b/release/datafiles/blender_icons32/icon32_vis_sel_11.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_visible_ipo_off.dat b/release/datafiles/blender_icons32/icon32_visible_ipo_off.dat
index 2a84aacfb66..d568de21c84 100644
--- a/release/datafiles/blender_icons32/icon32_visible_ipo_off.dat
+++ b/release/datafiles/blender_icons32/icon32_visible_ipo_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_visible_ipo_on.dat b/release/datafiles/blender_icons32/icon32_visible_ipo_on.dat
index 0e0de0d17a0..bd2ff127890 100644
--- a/release/datafiles/blender_icons32/icon32_visible_ipo_on.dat
+++ b/release/datafiles/blender_icons32/icon32_visible_ipo_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_volume.dat b/release/datafiles/blender_icons32/icon32_volume.dat
new file mode 100644
index 00000000000..9492c9c64d0
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_volume.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_vpaint_hlt.dat b/release/datafiles/blender_icons32/icon32_vpaint_hlt.dat
index 390a28435b8..d6565783490 100644
--- a/release/datafiles/blender_icons32/icon32_vpaint_hlt.dat
+++ b/release/datafiles/blender_icons32/icon32_vpaint_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_window.dat b/release/datafiles/blender_icons32/icon32_window.dat
new file mode 100644
index 00000000000..880bbe7f6c0
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_window.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_wire.dat b/release/datafiles/blender_icons32/icon32_wire.dat
deleted file mode 100644
index 59f840d4473..00000000000
--- a/release/datafiles/blender_icons32/icon32_wire.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_wordwrap_off.dat b/release/datafiles/blender_icons32/icon32_wordwrap_off.dat
index 93940a23eb1..564f9ff1104 100644
--- a/release/datafiles/blender_icons32/icon32_wordwrap_off.dat
+++ b/release/datafiles/blender_icons32/icon32_wordwrap_off.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_wordwrap_on.dat b/release/datafiles/blender_icons32/icon32_wordwrap_on.dat
index d28e6f95aff..11f20cc474f 100644
--- a/release/datafiles/blender_icons32/icon32_wordwrap_on.dat
+++ b/release/datafiles/blender_icons32/icon32_wordwrap_on.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_workspace.dat b/release/datafiles/blender_icons32/icon32_workspace.dat
new file mode 100644
index 00000000000..f9ffc072f28
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_workspace.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_world.dat b/release/datafiles/blender_icons32/icon32_world.dat
index bf5026c0fec..2882c20d03a 100644
--- a/release/datafiles/blender_icons32/icon32_world.dat
+++ b/release/datafiles/blender_icons32/icon32_world.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_world_data.dat b/release/datafiles/blender_icons32/icon32_world_data.dat
index 2c2257559bf..0fb902a9ff9 100644
--- a/release/datafiles/blender_icons32/icon32_world_data.dat
+++ b/release/datafiles/blender_icons32/icon32_world_data.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_wpaint_hlt.dat b/release/datafiles/blender_icons32/icon32_wpaint_hlt.dat
index 6c076dba78e..0d12a956ef7 100644
--- a/release/datafiles/blender_icons32/icon32_wpaint_hlt.dat
+++ b/release/datafiles/blender_icons32/icon32_wpaint_hlt.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_x.dat b/release/datafiles/blender_icons32/icon32_x.dat
index 5b2a5071a52..8dcffe174ce 100644
--- a/release/datafiles/blender_icons32/icon32_x.dat
+++ b/release/datafiles/blender_icons32/icon32_x.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_xray.dat b/release/datafiles/blender_icons32/icon32_xray.dat
new file mode 100644
index 00000000000..be58ab02c41
--- /dev/null
+++ b/release/datafiles/blender_icons32/icon32_xray.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_zoom_all.dat b/release/datafiles/blender_icons32/icon32_zoom_all.dat
index d12786fd128..5ed345db3be 100644
--- a/release/datafiles/blender_icons32/icon32_zoom_all.dat
+++ b/release/datafiles/blender_icons32/icon32_zoom_all.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_zoom_in.dat b/release/datafiles/blender_icons32/icon32_zoom_in.dat
index 9c55181a705..e3586243de3 100644
--- a/release/datafiles/blender_icons32/icon32_zoom_in.dat
+++ b/release/datafiles/blender_icons32/icon32_zoom_in.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_zoom_out.dat b/release/datafiles/blender_icons32/icon32_zoom_out.dat
index 929333daec7..d5c896a7712 100644
--- a/release/datafiles/blender_icons32/icon32_zoom_out.dat
+++ b/release/datafiles/blender_icons32/icon32_zoom_out.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_zoom_previous.dat b/release/datafiles/blender_icons32/icon32_zoom_previous.dat
index 2ceced4b76c..0b51f906c54 100644
--- a/release/datafiles/blender_icons32/icon32_zoom_previous.dat
+++ b/release/datafiles/blender_icons32/icon32_zoom_previous.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_zoom_selected.dat b/release/datafiles/blender_icons32/icon32_zoom_selected.dat
index ddd04b9a3ce..45a06a699d7 100644
--- a/release/datafiles/blender_icons32/icon32_zoom_selected.dat
+++ b/release/datafiles/blender_icons32/icon32_zoom_selected.dat
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_zoomin.dat b/release/datafiles/blender_icons32/icon32_zoomin.dat
deleted file mode 100644
index b7f8311166b..00000000000
--- a/release/datafiles/blender_icons32/icon32_zoomin.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons32/icon32_zoomout.dat b/release/datafiles/blender_icons32/icon32_zoomout.dat
deleted file mode 100644
index 0cd17037f24..00000000000
--- a/release/datafiles/blender_icons32/icon32_zoomout.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/blender_icons_update.py b/release/datafiles/blender_icons_update.py
index 3aeb6697824..0c35693baae 100755
--- a/release/datafiles/blender_icons_update.py
+++ b/release/datafiles/blender_icons_update.py
@@ -18,6 +18,9 @@ if sys.platform == 'darwin':
inkscape_app_path = '/Applications/Inkscape.app/Contents/Resources/script'
if os.path.exists(inkscape_app_path):
inkscape_bin = inkscape_app_path
+ blender_app_path = '/Applications/blender.app/Contents/MacOS/blender'
+ if os.path.exists(blender_app_path):
+ blender_bin = blender_app_path
cmd = (
inkscape_bin,
diff --git a/release/datafiles/brushicons/add.png b/release/datafiles/brushicons/add.png
deleted file mode 100644
index 1343f7542b8..00000000000
--- a/release/datafiles/brushicons/add.png
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/brushicons/darken.png b/release/datafiles/brushicons/darken.png
deleted file mode 100644
index b129bd7bbea..00000000000
--- a/release/datafiles/brushicons/darken.png
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/brushicons/lighten.png b/release/datafiles/brushicons/lighten.png
deleted file mode 100644
index 9667c9973e4..00000000000
--- a/release/datafiles/brushicons/lighten.png
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/brushicons/subtract.png b/release/datafiles/brushicons/subtract.png
deleted file mode 100644
index cd2a64a819c..00000000000
--- a/release/datafiles/brushicons/subtract.png
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/brushicons/vertexdraw.png b/release/datafiles/brushicons/vertexdraw.png
deleted file mode 100644
index 88a9fbb2b60..00000000000
--- a/release/datafiles/brushicons/vertexdraw.png
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/colormanagement/config.ocio b/release/datafiles/colormanagement/config.ocio
index c8466ab99fc..bba5958769d 100644
--- a/release/datafiles/colormanagement/config.ocio
+++ b/release/datafiles/colormanagement/config.ocio
@@ -82,7 +82,7 @@ colorspaces:
Rec. 709 (Full Range), Blender native linear space
isdata: false
allocation: lg2
- allocationvars: [-15, 6]
+ allocationvars: [-12.473931188, 12.526068812]
- !<ColorSpace>
name: Raw
diff --git a/release/datafiles/icons/brush.gpencil.draw.eraser_hard.dat b/release/datafiles/icons/brush.gpencil.draw.eraser_hard.dat
deleted file mode 100644
index 3e1b77e4661..00000000000
--- a/release/datafiles/icons/brush.gpencil.draw.eraser_hard.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.gpencil.draw.eraser_soft.dat b/release/datafiles/icons/brush.gpencil.draw.eraser_soft.dat
deleted file mode 100644
index 777e3aabe40..00000000000
--- a/release/datafiles/icons/brush.gpencil.draw.eraser_soft.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.gpencil.draw.eraser_stroke.dat b/release/datafiles/icons/brush.gpencil.draw.eraser_stroke.dat
deleted file mode 100644
index ad9216a2247..00000000000
--- a/release/datafiles/icons/brush.gpencil.draw.eraser_stroke.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.gpencil.draw_block.dat b/release/datafiles/icons/brush.gpencil.draw_block.dat
deleted file mode 100644
index fe4175c6d09..00000000000
--- a/release/datafiles/icons/brush.gpencil.draw_block.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.gpencil.draw_fill.dat b/release/datafiles/icons/brush.gpencil.draw_fill.dat
deleted file mode 100644
index 82e6f6bbac9..00000000000
--- a/release/datafiles/icons/brush.gpencil.draw_fill.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.gpencil.draw_ink.dat b/release/datafiles/icons/brush.gpencil.draw_ink.dat
deleted file mode 100644
index 3137a3f431a..00000000000
--- a/release/datafiles/icons/brush.gpencil.draw_ink.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.gpencil.draw_marker.dat b/release/datafiles/icons/brush.gpencil.draw_marker.dat
deleted file mode 100644
index b0b821109a3..00000000000
--- a/release/datafiles/icons/brush.gpencil.draw_marker.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.gpencil.draw_noise.dat b/release/datafiles/icons/brush.gpencil.draw_noise.dat
deleted file mode 100644
index d29c0624704..00000000000
--- a/release/datafiles/icons/brush.gpencil.draw_noise.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.gpencil.draw_pen.dat b/release/datafiles/icons/brush.gpencil.draw_pen.dat
deleted file mode 100644
index d31e2055687..00000000000
--- a/release/datafiles/icons/brush.gpencil.draw_pen.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.gpencil.draw_pencil.dat b/release/datafiles/icons/brush.gpencil.draw_pencil.dat
deleted file mode 100644
index 4643afc07e5..00000000000
--- a/release/datafiles/icons/brush.gpencil.draw_pencil.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.gpencil_draw.draw.dat b/release/datafiles/icons/brush.gpencil_draw.draw.dat
new file mode 100644
index 00000000000..be7e02824c9
--- /dev/null
+++ b/release/datafiles/icons/brush.gpencil_draw.draw.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.gpencil_draw.erase.dat b/release/datafiles/icons/brush.gpencil_draw.erase.dat
new file mode 100644
index 00000000000..d3d1d5a32a6
--- /dev/null
+++ b/release/datafiles/icons/brush.gpencil_draw.erase.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.gpencil_draw.fill.dat b/release/datafiles/icons/brush.gpencil_draw.fill.dat
new file mode 100644
index 00000000000..4eeb4334ddd
--- /dev/null
+++ b/release/datafiles/icons/brush.gpencil_draw.fill.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_texture.clone.dat b/release/datafiles/icons/brush.paint_texture.clone.dat
index 63070e716ba..a65a2047b71 100644
--- a/release/datafiles/icons/brush.paint_texture.clone.dat
+++ b/release/datafiles/icons/brush.paint_texture.clone.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_texture.draw.dat b/release/datafiles/icons/brush.paint_texture.draw.dat
index 8aa4d4a1347..6b46c7f3f97 100644
--- a/release/datafiles/icons/brush.paint_texture.draw.dat
+++ b/release/datafiles/icons/brush.paint_texture.draw.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_texture.fill.dat b/release/datafiles/icons/brush.paint_texture.fill.dat
index d4089476383..97e8ef27ca1 100644
--- a/release/datafiles/icons/brush.paint_texture.fill.dat
+++ b/release/datafiles/icons/brush.paint_texture.fill.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_texture.mask.dat b/release/datafiles/icons/brush.paint_texture.mask.dat
index a7d6bf0280f..46cfd5499a8 100644
--- a/release/datafiles/icons/brush.paint_texture.mask.dat
+++ b/release/datafiles/icons/brush.paint_texture.mask.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_texture.masklort.dat b/release/datafiles/icons/brush.paint_texture.masklort.dat
new file mode 100644
index 00000000000..9d83b50f3de
--- /dev/null
+++ b/release/datafiles/icons/brush.paint_texture.masklort.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_texture.smear.dat b/release/datafiles/icons/brush.paint_texture.smear.dat
index 071776c2ac1..a38512ce092 100644
--- a/release/datafiles/icons/brush.paint_texture.smear.dat
+++ b/release/datafiles/icons/brush.paint_texture.smear.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_texture.soften.dat b/release/datafiles/icons/brush.paint_texture.soften.dat
index 1f57ab5db3d..445be2dd6ce 100644
--- a/release/datafiles/icons/brush.paint_texture.soften.dat
+++ b/release/datafiles/icons/brush.paint_texture.soften.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_vertex.alpha.dat b/release/datafiles/icons/brush.paint_vertex.alpha.dat
index f16bd8162ec..e74795dcb9e 100644
--- a/release/datafiles/icons/brush.paint_vertex.alpha.dat
+++ b/release/datafiles/icons/brush.paint_vertex.alpha.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_vertex.average.dat b/release/datafiles/icons/brush.paint_vertex.average.dat
new file mode 100644
index 00000000000..953e29a8bdd
--- /dev/null
+++ b/release/datafiles/icons/brush.paint_vertex.average.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_vertex.blur.dat b/release/datafiles/icons/brush.paint_vertex.blur.dat
index 4c517526569..445be2dd6ce 100644
--- a/release/datafiles/icons/brush.paint_vertex.blur.dat
+++ b/release/datafiles/icons/brush.paint_vertex.blur.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_vertex.draw.dat b/release/datafiles/icons/brush.paint_vertex.draw.dat
new file mode 100644
index 00000000000..6b46c7f3f97
--- /dev/null
+++ b/release/datafiles/icons/brush.paint_vertex.draw.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_vertex.mix.dat b/release/datafiles/icons/brush.paint_vertex.mix.dat
deleted file mode 100644
index ac8c3b07141..00000000000
--- a/release/datafiles/icons/brush.paint_vertex.mix.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_vertex.smear.dat b/release/datafiles/icons/brush.paint_vertex.smear.dat
index 8ce6227be11..a38512ce092 100644
--- a/release/datafiles/icons/brush.paint_vertex.smear.dat
+++ b/release/datafiles/icons/brush.paint_vertex.smear.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_weight.average.dat b/release/datafiles/icons/brush.paint_weight.average.dat
new file mode 100644
index 00000000000..953e29a8bdd
--- /dev/null
+++ b/release/datafiles/icons/brush.paint_weight.average.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_weight.blur.dat b/release/datafiles/icons/brush.paint_weight.blur.dat
index 8af2e7a2e05..445be2dd6ce 100644
--- a/release/datafiles/icons/brush.paint_weight.blur.dat
+++ b/release/datafiles/icons/brush.paint_weight.blur.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_weight.darken.dat b/release/datafiles/icons/brush.paint_weight.darken.dat
deleted file mode 100644
index 382ee47b180..00000000000
--- a/release/datafiles/icons/brush.paint_weight.darken.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_weight.draw.dat b/release/datafiles/icons/brush.paint_weight.draw.dat
index 029654c0ed8..6b46c7f3f97 100644
--- a/release/datafiles/icons/brush.paint_weight.draw.dat
+++ b/release/datafiles/icons/brush.paint_weight.draw.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_weight.lighten.dat b/release/datafiles/icons/brush.paint_weight.lighten.dat
deleted file mode 100644
index 0621806f077..00000000000
--- a/release/datafiles/icons/brush.paint_weight.lighten.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_weight.mix.dat b/release/datafiles/icons/brush.paint_weight.mix.dat
index 0a9fc5b2905..0366235c11f 100644
--- a/release/datafiles/icons/brush.paint_weight.mix.dat
+++ b/release/datafiles/icons/brush.paint_weight.mix.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_weight.multiply.dat b/release/datafiles/icons/brush.paint_weight.multiply.dat
deleted file mode 100644
index dcd6f8bca99..00000000000
--- a/release/datafiles/icons/brush.paint_weight.multiply.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.paint_weight.smear.dat b/release/datafiles/icons/brush.paint_weight.smear.dat
new file mode 100644
index 00000000000..a38512ce092
--- /dev/null
+++ b/release/datafiles/icons/brush.paint_weight.smear.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.particle.weight.dat b/release/datafiles/icons/brush.particle.weight.dat
index ee14fa4eda5..833bbca506b 100644
--- a/release/datafiles/icons/brush.particle.weight.dat
+++ b/release/datafiles/icons/brush.particle.weight.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.sculpt.simplify.dat b/release/datafiles/icons/brush.sculpt.simplify.dat
new file mode 100644
index 00000000000..b97172400d3
--- /dev/null
+++ b/release/datafiles/icons/brush.sculpt.simplify.dat
Binary files differ
diff --git a/release/datafiles/icons/brush.vertex.average.dat b/release/datafiles/icons/brush.vertex.average.dat
deleted file mode 100644
index b46c54fd4eb..00000000000
--- a/release/datafiles/icons/brush.vertex.average.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.weight.add.dat b/release/datafiles/icons/brush.weight.add.dat
deleted file mode 100644
index 6fff2232911..00000000000
--- a/release/datafiles/icons/brush.weight.add.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/brush.weight.subtract.dat b/release/datafiles/icons/brush.weight.subtract.dat
deleted file mode 100644
index e0f21056cc8..00000000000
--- a/release/datafiles/icons/brush.weight.subtract.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/ops.armature.bone.roll.dat b/release/datafiles/icons/ops.armature.bone.roll.dat
index db5eb1de211..a12f3a674ae 100644
--- a/release/datafiles/icons/ops.armature.bone.roll.dat
+++ b/release/datafiles/icons/ops.armature.bone.roll.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.armature.extrude_cursor.dat b/release/datafiles/icons/ops.armature.extrude_cursor.dat
new file mode 100644
index 00000000000..ec8f2432052
--- /dev/null
+++ b/release/datafiles/icons/ops.armature.extrude_cursor.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.armature.extrude_move.dat b/release/datafiles/icons/ops.armature.extrude_move.dat
new file mode 100644
index 00000000000..2194c5bf556
--- /dev/null
+++ b/release/datafiles/icons/ops.armature.extrude_move.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.curve.draw.dat b/release/datafiles/icons/ops.curve.draw.dat
index 5622b99a1f3..5228833daa3 100644
--- a/release/datafiles/icons/ops.curve.draw.dat
+++ b/release/datafiles/icons/ops.curve.draw.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.curve.extrude_cursor.dat b/release/datafiles/icons/ops.curve.extrude_cursor.dat
new file mode 100644
index 00000000000..5ab67727f72
--- /dev/null
+++ b/release/datafiles/icons/ops.curve.extrude_cursor.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.curve.extrude_move.dat b/release/datafiles/icons/ops.curve.extrude_move.dat
new file mode 100644
index 00000000000..cbd0eb5e620
--- /dev/null
+++ b/release/datafiles/icons/ops.curve.extrude_move.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.generic.select_border.dat b/release/datafiles/icons/ops.generic.select_border.dat
deleted file mode 100644
index eed66f3f680..00000000000
--- a/release/datafiles/icons/ops.generic.select_border.dat
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/icons/ops.generic.select_box.dat b/release/datafiles/icons/ops.generic.select_box.dat
new file mode 100644
index 00000000000..3c1df5fe863
--- /dev/null
+++ b/release/datafiles/icons/ops.generic.select_box.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.generic.select_circle.dat b/release/datafiles/icons/ops.generic.select_circle.dat
index 71877f45590..4d9b741a1bd 100644
--- a/release/datafiles/icons/ops.generic.select_circle.dat
+++ b/release/datafiles/icons/ops.generic.select_circle.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.generic.select_lasso.dat b/release/datafiles/icons/ops.generic.select_lasso.dat
index cfd8a26b527..a42d3f9d6e4 100644
--- a/release/datafiles/icons/ops.generic.select_lasso.dat
+++ b/release/datafiles/icons/ops.generic.select_lasso.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.gpencil.primitive_box.dat b/release/datafiles/icons/ops.gpencil.primitive_box.dat
new file mode 100644
index 00000000000..0dabb9271e9
--- /dev/null
+++ b/release/datafiles/icons/ops.gpencil.primitive_box.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.gpencil.primitive_circle.dat b/release/datafiles/icons/ops.gpencil.primitive_circle.dat
new file mode 100644
index 00000000000..bdc133c1fbc
--- /dev/null
+++ b/release/datafiles/icons/ops.gpencil.primitive_circle.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.gpencil.primitive_line.dat b/release/datafiles/icons/ops.gpencil.primitive_line.dat
new file mode 100644
index 00000000000..153b3120e19
--- /dev/null
+++ b/release/datafiles/icons/ops.gpencil.primitive_line.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.mesh.rip.dat b/release/datafiles/icons/ops.mesh.rip.dat
index 1f1241907cf..b424e42469b 100644
--- a/release/datafiles/icons/ops.mesh.rip.dat
+++ b/release/datafiles/icons/ops.mesh.rip.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.mesh.rip_edge.dat b/release/datafiles/icons/ops.mesh.rip_edge.dat
index d75f9822b80..925b90bd861 100644
--- a/release/datafiles/icons/ops.mesh.rip_edge.dat
+++ b/release/datafiles/icons/ops.mesh.rip_edge.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.paint.weight_fill.dat b/release/datafiles/icons/ops.paint.weight_fill.dat
index 7e981715552..97e8ef27ca1 100644
--- a/release/datafiles/icons/ops.paint.weight_fill.dat
+++ b/release/datafiles/icons/ops.paint.weight_fill.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.paint.weight_gradient.dat b/release/datafiles/icons/ops.paint.weight_gradient.dat
index 5e9dbbcbb06..0908966f8a3 100644
--- a/release/datafiles/icons/ops.paint.weight_gradient.dat
+++ b/release/datafiles/icons/ops.paint.weight_gradient.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.paint.weight_sample.dat b/release/datafiles/icons/ops.paint.weight_sample.dat
new file mode 100644
index 00000000000..e87c0415314
--- /dev/null
+++ b/release/datafiles/icons/ops.paint.weight_sample.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.paint.weight_sample_group.dat b/release/datafiles/icons/ops.paint.weight_sample_group.dat
new file mode 100644
index 00000000000..057e85e9c33
--- /dev/null
+++ b/release/datafiles/icons/ops.paint.weight_sample_group.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.pose.breakdowner.dat b/release/datafiles/icons/ops.pose.breakdowner.dat
new file mode 100644
index 00000000000..25ba7bde2d9
--- /dev/null
+++ b/release/datafiles/icons/ops.pose.breakdowner.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.pose.push.dat b/release/datafiles/icons/ops.pose.push.dat
new file mode 100644
index 00000000000..2ab36223c96
--- /dev/null
+++ b/release/datafiles/icons/ops.pose.push.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.pose.relax.dat b/release/datafiles/icons/ops.pose.relax.dat
new file mode 100644
index 00000000000..c3c8983eaa5
--- /dev/null
+++ b/release/datafiles/icons/ops.pose.relax.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.transform.bone_envelope.dat b/release/datafiles/icons/ops.transform.bone_envelope.dat
new file mode 100644
index 00000000000..75084eb9fe1
--- /dev/null
+++ b/release/datafiles/icons/ops.transform.bone_envelope.dat
Binary files differ
diff --git a/release/datafiles/icons/ops.transform.bone_size.dat b/release/datafiles/icons/ops.transform.bone_size.dat
new file mode 100644
index 00000000000..f65a5ecf745
--- /dev/null
+++ b/release/datafiles/icons/ops.transform.bone_size.dat
Binary files differ
diff --git a/release/datafiles/preview.blend b/release/datafiles/preview.blend
deleted file mode 100644
index 7e30e2dcf00..00000000000
--- a/release/datafiles/preview.blend
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/startup.blend b/release/datafiles/startup.blend
index 94574738471..c37e1199e58 100644
--- a/release/datafiles/startup.blend
+++ b/release/datafiles/startup.blend
Binary files differ
diff --git a/release/datafiles/userdef/userdef_default_theme.c b/release/datafiles/userdef/userdef_default_theme.c
index ed2a7b54a4c..7ae007d9fb8 100644
--- a/release/datafiles/userdef/userdef_default_theme.c
+++ b/release/datafiles/userdef/userdef_default_theme.c
@@ -1,8 +1,8 @@
/*
-* Generated by 'source/tools/utils/blender_theme_as_c.py'
-*
-* Do not hand edit this file!
-*/
+ * Generated by 'source/tools/utils/blender_theme_as_c.py'
+ *
+ * Do not hand edit this file!
+ */
#include "DNA_userdef_types.h"
@@ -111,10 +111,10 @@ const bTheme U_theme_default = {
},
.wcol_tab = {
.outline = RGBA(0x2d2d2dff),
- .inner = RGBA(0x323232ff),
- .inner_sel = RGBA(0x4b4b4bff),
+ .inner = RGBA(0x2b2b2bff),
+ .inner_sel = RGBA(0x424242ff),
.item = RGBA(0x2d2d2dff),
- .text = RGBA(0xa4a4a4ff),
+ .text = RGBA(0xa6a6a6ff),
.text_sel = RGBA(0xffffffff),
.roundness = 0.2f,
},
@@ -132,7 +132,7 @@ const bTheme U_theme_default = {
.wcol_pulldown = {
.outline = RGBA(0x4d4d4dff),
.inner = RGBA(0x2e2e2e99),
- .inner_sel = RGBA(0x5680c2ff),
+ .inner_sel = RGBA(0x597cb3ff),
.item = RGBA(0x727272ff),
.text = RGBA(0xeeeeeeff),
.text_sel = RGBA(0xffffffff),
@@ -209,10 +209,10 @@ const bTheme U_theme_default = {
.roundness = 0.2f,
},
.wcol_pie_menu = {
- .outline = RGBA(0x212121ff),
+ .outline = RGBA(0x333333ff),
.inner = RGBA(0x212121ef),
- .inner_sel = RGBA(0x585858ff),
- .item = RGBA(0x597cb3ff),
+ .inner_sel = RGBA(0x597cb3ff),
+ .item = RGBA(0x585858ff),
.text = RGBA(0xeeeeeeff),
.text_sel = RGBA(0xffffffff),
.shadetop = 10,
@@ -244,6 +244,11 @@ const bTheme U_theme_default = {
.gizmo_secondary = RGBA(0x63ffffff),
.gizmo_a = RGBA(0x4da84dff),
.gizmo_b = RGBA(0xa33535ff),
+ .icon_collection = RGBA(0xe6e6e6ff),
+ .icon_object = RGBA(0xe49759ff),
+ .icon_object_data = RGBA(0x89e689ff),
+ .icon_modifier = RGBA(0x84b8ffff),
+ .icon_shading = RGBA(0xff6060ff),
},
.tbuts = {
.back = RGBA(0x42424200),
@@ -253,14 +258,15 @@ const bTheme U_theme_default = {
.header = RGBA(0x424242ff),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x424242ff),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
.button_text_hi = RGBA(0xffffffff),
+ .navigation_bar = RGBA(0x232323ff),
.panelcolors = {
.header = RGBA(0x42424200),
.back = RGBA(0x00000028),
@@ -277,10 +283,10 @@ const bTheme U_theme_default = {
.header = RGBA(0x42424200),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x35353500),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
@@ -368,10 +374,10 @@ const bTheme U_theme_default = {
.header = RGBA(0x2e2e2eff),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x424242ff),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
@@ -394,17 +400,17 @@ const bTheme U_theme_default = {
.header = RGBA(0x2e2e2eff),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x424242ff),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
.button_text_hi = RGBA(0xffffffff),
- .list = RGBA(0x2e2e2eff),
+ .list = RGBA(0x333333ff),
.list_title = RGBA(0xffffffff),
- .list_text = RGBA(0x000000ff),
+ .list_text = RGBA(0xb8b8b8ff),
.list_text_hi = RGBA(0xffffffff),
.panelcolors = {
.header = RGBA(0x424242cc),
@@ -412,10 +418,10 @@ const bTheme U_theme_default = {
.sub_back = RGBA(0x0000003e),
},
.shade1 = RGBA(0x96969600),
- .shade2 = RGBA(0x2e2e2e64),
+ .shade2 = RGBA(0x33333364),
.grid = RGBA(0x2a2a2aff),
- .group = RGBA(0x44992eff),
- .group_active = RGBA(0x5ccd3eff),
+ .group = RGBA(0x16330fff),
+ .group_active = RGBA(0x368024ff),
.vertex = RGBA(0x000000ff),
.vertex_select = RGBA(0xff8500ff),
.cframe = RGBA(0x5680c2ff),
@@ -428,13 +434,14 @@ const bTheme U_theme_default = {
.handle_sel_vect = RGBA(0x40c030ff),
.handle_sel_align = RGBA(0xf090a0ff),
.handle_sel_auto_clamped = RGBA(0xf0af90ff),
- .ds_channel = RGBA(0x5a85b2ff),
- .ds_subchannel = RGBA(0x7d98b3ff),
+ .ds_channel = RGBA(0x0f2c4dff),
+ .ds_subchannel = RGBA(0x143e66ff),
.vertex_size = 6,
.outline_width = 1,
.facedot_size = 4,
.handle_vertex_select = RGBA(0xff8500ff),
.handle_vertex_size = 5,
+ .anim_preview_range = RGBA(0xa14d0066),
},
.tinfo = {
.back = RGBA(0x42424200),
@@ -444,10 +451,10 @@ const bTheme U_theme_default = {
.header = RGBA(0x424242ff),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x424242ff),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
@@ -478,17 +485,17 @@ const bTheme U_theme_default = {
.header = RGBA(0x424242ff),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x424242ff),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
.button_text_hi = RGBA(0xffffffff),
- .list = RGBA(0x2e2e2eff),
- .list_title = RGBA(0xd8d8d8ff),
- .list_text = RGBA(0x000000ff),
+ .list = RGBA(0x333333ff),
+ .list_title = RGBA(0xffffffff),
+ .list_text = RGBA(0xb8b8b8ff),
.list_text_hi = RGBA(0xffffffff),
.panelcolors = {
.header = RGBA(0x424242cc),
@@ -496,24 +503,27 @@ const bTheme U_theme_default = {
.sub_back = RGBA(0x0000003e),
},
.shade1 = RGBA(0xc0c0c000),
- .shade2 = RGBA(0x70707064),
- .hilite = RGBA(0x60c040ff),
+ .shade2 = RGBA(0x333333ff),
+ .hilite = RGBA(0x60c04044),
.grid = RGBA(0x2a2a2aff),
- .group = RGBA(0x44992eff),
- .group_active = RGBA(0x5ccd3eff),
+ .group = RGBA(0x16330f37),
+ .group_active = RGBA(0x36802455),
.strip = RGBA(0x1a151580),
- .strip_select = RGBA(0xff8c00ff),
+ .strip_select = RGBA(0xff8c00cc),
.cframe = RGBA(0x5680c2ff),
- .ds_channel = RGBA(0x5a85b2ff),
- .ds_subchannel = RGBA(0x7d98b3ff),
+ .ds_channel = RGBA(0x0f2c4d24),
+ .ds_subchannel = RGBA(0x143e6624),
+ .ds_ipoline = RGBA(0x94e575cc),
.keytype_keyframe = RGBA(0xe8e8e8ff),
.keytype_extreme = RGBA(0xe8b3ccff),
.keytype_breakdown = RGBA(0xb3dbe8ff),
.keytype_jitter = RGBA(0x94e575ff),
+ .keytype_movehold = RGBA(0x5c5656ff),
.keytype_keyframe_select = RGBA(0xffbe33ff),
.keytype_extreme_select = RGBA(0xf28080ff),
.keytype_breakdown_select = RGBA(0x54bfedff),
.keytype_jitter_select = RGBA(0x61c042ff),
+ .keytype_movehold_select = RGBA(0xffaf23ff),
.keyborder = RGBA(0x000000ff),
.keyborder_select = RGBA(0x000000ff),
.vertex_size = 3,
@@ -521,7 +531,8 @@ const bTheme U_theme_default = {
.facedot_size = 4,
.keyframe_scale_fac = 1.0f,
.handle_vertex_size = 4,
- .anim_active = RGBA(0xa14d0066),
+ .anim_active = RGBA(0x4d250066),
+ .anim_preview_range = RGBA(0xa14d0066),
},
.tnla = {
.back = RGBA(0x35353500),
@@ -531,10 +542,10 @@ const bTheme U_theme_default = {
.header = RGBA(0x212121ff),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x424242ff),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
@@ -563,6 +574,7 @@ const bTheme U_theme_default = {
.handle_vertex_size = 4,
.anim_active = RGBA(0xcc701a66),
.anim_non_active = RGBA(0x9987614d),
+ .anim_preview_range = RGBA(0xa14d0066),
.nla_tweaking = RGBA(0x4df31a4d),
.nla_tweakdupli = RGBA(0xd90000ff),
.nla_transition = RGBA(0x1c2630ff),
@@ -580,10 +592,10 @@ const bTheme U_theme_default = {
.header = RGBA(0x424242ff),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x424242ff),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
@@ -622,10 +634,10 @@ const bTheme U_theme_default = {
.header = RGBA(0x424242ff),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x424242ff),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
@@ -676,10 +688,10 @@ const bTheme U_theme_default = {
.header = RGBA(0x42424200),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x424242ff),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
@@ -705,17 +717,17 @@ const bTheme U_theme_default = {
.syntaxr = RGBA(0xc4753bff),
},
.toops = {
- .back = RGBA(0x35353500),
+ .back = RGBA(0x28282800),
.title = RGBA(0xffffffff),
.text = RGBA(0xc3c3c3ff),
.text_hi = RGBA(0xffffffff),
.header = RGBA(0x454545ff),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x424242ff),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
@@ -729,7 +741,7 @@ const bTheme U_theme_default = {
.outline_width = 1,
.facedot_size = 4,
.match = RGBA(0x337f334c),
- .selected_highlight = RGBA(0x696e764c),
+ .selected_highlight = RGBA(0x314e784c),
},
.ttime = {
.vertex_size = 3,
@@ -744,10 +756,10 @@ const bTheme U_theme_default = {
.header = RGBA(0x424242ff),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x424242ff),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
@@ -799,10 +811,10 @@ const bTheme U_theme_default = {
.header = RGBA(0x424242ff),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x424242ff),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
@@ -824,10 +836,10 @@ const bTheme U_theme_default = {
.header = RGBA(0x424242ff),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x424242ff),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
@@ -855,10 +867,10 @@ const bTheme U_theme_default = {
.header = RGBA(0x424242ff),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x424242ff),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
@@ -892,17 +904,17 @@ const bTheme U_theme_default = {
.gp_vertex_size = 1,
},
.ttopbar = {
- .back = RGBA(0x4b4b4b00),
+ .back = RGBA(0x42424200),
.title = RGBA(0xffffffff),
.text = RGBA(0xffffffff),
.text_hi = RGBA(0xffffffff),
.header = RGBA(0x232323ff),
.header_text = RGBA(0xeeeeeeff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x424242ff),
.button_title = RGBA(0xffffffff),
.button_text = RGBA(0xe5e5e5ff),
@@ -925,10 +937,10 @@ const bTheme U_theme_default = {
.header = RGBA(0x303030ff),
.header_text = RGBA(0xaaaaaaff),
.header_text_hi = RGBA(0xffffffff),
- .tab_active = RGBA(0x5680c2ff),
- .tab_inactive = RGBA(0x424242ff),
+ .tab_active = RGBA(0x4b4b4bff),
+ .tab_inactive = RGBA(0x2b2b2bff),
.tab_back = RGBA(0x232323ff),
- .tab_outline = RGBA(0x2d2d2dff),
+ .tab_outline = RGBA(0x232323ff),
.button = RGBA(0x353535ff),
.button_text_hi = RGBA(0xffffffff),
.panelcolors = {
@@ -1042,5 +1054,5 @@ const bTheme U_theme_default = {
.select = RGBA(0x000000ff),
.active = RGBA(0x000000ff),
},
-},
+ },
};
diff --git a/release/scripts/addons b/release/scripts/addons
-Subproject b5a35bbd39af54dee33fc5ea039e49e6e9f450a
+Subproject af1952328cf1def9c8002b3165713713704f933
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
-Subproject b4496a81e4f3d607a692f7c2e12fce3dbd784de
+Subproject e7ee79f7fd53f9caa7536de178d2d7bf7ce1e4c
diff --git a/release/scripts/freestyle/modules/freestyle/shaders.py b/release/scripts/freestyle/modules/freestyle/shaders.py
index bce6642220b..28b8aa9b23e 100644
--- a/release/scripts/freestyle/modules/freestyle/shaders.py
+++ b/release/scripts/freestyle/modules/freestyle/shaders.py
@@ -881,7 +881,7 @@ class pyBluePrintCirclesShader(StrokeShader):
# times as possible.
#
# This works because the phases and directions are only
- # dependant on the stroke length, and the chance that
+ # dependent on the stroke length, and the chance that
# stroke.resample() above produces strokes of the same length
# is quite high.
#
diff --git a/release/scripts/freestyle/modules/parameter_editor.py b/release/scripts/freestyle/modules/parameter_editor.py
index c2b23f017fe..f2001a1ae50 100644
--- a/release/scripts/freestyle/modules/parameter_editor.py
+++ b/release/scripts/freestyle/modules/parameter_editor.py
@@ -391,7 +391,7 @@ class ColorDistanceFromObjectShader(ColorRampModifier):
# construct a model-view matrix
matrix = getCurrentScene().camera.matrix_world.inverted()
# get the object location in the camera coordinate
- self.loc = matrix * target.location
+ self.loc = matrix @ target.location
def shade(self, stroke):
it = iter_distance_from_object(stroke, self.loc, *self.range)
@@ -411,7 +411,7 @@ class AlphaDistanceFromObjectShader(CurveMappingModifier):
# construct a model-view matrix
matrix = getCurrentScene().camera.matrix_world.inverted()
# get the object location in the camera coordinate
- self.loc = matrix * target.location
+ self.loc = matrix @ target.location
def shade(self, stroke):
it = iter_distance_from_object(stroke, self.loc, *self.range)
@@ -434,7 +434,7 @@ class ThicknessDistanceFromObjectShader(ThicknessBlenderMixIn, CurveMappingModif
# construct a model-view matrix
matrix = getCurrentScene().camera.matrix_world.inverted()
# get the object location in the camera coordinate
- self.loc = matrix * target.location
+ self.loc = matrix @ target.location
def shade(self, stroke):
it = iter_distance_from_object(stroke, self.loc, *self.range)
@@ -520,7 +520,7 @@ class CalligraphicThicknessShader(ThicknessBlenderMixIn, ScalarBlendModifier):
dir = self.func(it)
if dir.length != 0.0:
dir.normalize()
- fac = abs(dir.orthogonal() * self.orientation)
+ fac = abs(dir.orthogonal() @ self.orientation)
b = self.thickness.min + fac * self.thickness.delta
else:
b = self.thickness.min
diff --git a/release/scripts/modules/addon_utils.py b/release/scripts/modules/addon_utils.py
index f73d23c150b..c0d45822503 100644
--- a/release/scripts/modules/addon_utils.py
+++ b/release/scripts/modules/addon_utils.py
@@ -352,7 +352,7 @@ def enable(module_name, *, default_set=False, persistent=False, handle_error=Non
mod.__time__ = os.path.getmtime(mod.__file__)
mod.__addon_enabled__ = False
except Exception as ex:
- # if the addon doesn't exist, dont print full traceback
+ # if the addon doesn't exist, don't print full traceback
if type(ex) is ImportError and ex.name == module_name:
print("addon not found:", repr(module_name))
else:
@@ -367,13 +367,7 @@ def enable(module_name, *, default_set=False, persistent=False, handle_error=Non
# Silent default, we know these need updating.
if module_name in {
- "io_anim_bvh",
- "io_mesh_ply",
- "io_mesh_stl",
- "io_mesh_uv_layout",
"io_scene_3ds",
- "io_scene_fbx",
- "io_scene_obj",
"io_scene_x3d",
}:
return None
@@ -504,7 +498,12 @@ def reset_all(*, reload_scripts=False):
def disable_all():
import sys
- for mod_name, mod in sys.modules.items():
+ # Collect modules to disable first because dict can be modified as we disable.
+ addon_modules = [
+ item for item in sys.modules.items()
+ if getattr(item[1], "__addon_enabled__", False)
+ ]
+ for mod_name, mod in addon_modules:
if getattr(mod, "__addon_enabled__", False):
disable(mod_name)
diff --git a/release/scripts/modules/animsys_refactor.py b/release/scripts/modules/animsys_refactor.py
index 39f0ad2f049..7255ce5cd22 100644
--- a/release/scripts/modules/animsys_refactor.py
+++ b/release/scripts/modules/animsys_refactor.py
@@ -34,7 +34,7 @@ IS_TESTING = False
def drepr(string):
# is there a less crappy way to do this in python?, re.escape also escapes
- # single quotes strings so cant use it.
+ # single quotes strings so can't use it.
return '"%s"' % repr(string)[1:-1].replace("\"", "\\\"").replace("\\'", "'")
diff --git a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py
index b395aab7772..fada1255e8b 100644
--- a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py
+++ b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py
@@ -248,7 +248,7 @@ def dump_rna_messages(msgs, reports, settings, verbose=False):
# Now here is the *ugly* hack!
# Unfortunately, all classes we want to access are not available from bpy.types (OperatorProperties subclasses
# are not here, as they have the same name as matching Operator ones :( ). So we use __subclasses__() calls
- # to walk through all rna hierachy.
+ # to walk through all rna hierarchy.
# But unregistered classes remain listed by relevant __subclasses__() calls (be it a Py or BPY/RNA bug),
# and obviously the matching RNA struct exists no more, so trying to access their data (even the identifier)
# quickly leads to segfault!
@@ -437,8 +437,8 @@ def dump_rna_messages(msgs, reports, settings, verbose=False):
reports, check_ctxt_rna, settings)
# And parse keymaps!
- from bpy_extras.keyconfig_utils import KM_HIERARCHY
- walk_keymap_hierarchy(KM_HIERARCHY, "KM_HIERARCHY")
+ from bpy_extras.keyconfig_utils import km_hierarchy
+ walk_keymap_hierarchy(km_hierarchy(), "KM_HIERARCHY")
##### Python source code #####
@@ -498,7 +498,7 @@ def dump_py_messages_from_files(msgs, reports, files, settings):
def extract_strings_split(node):
"""
Returns a list args as returned by 'extract_strings()', but split into groups based on separate_nodes, this way
- expressions like ("A" if test else "B") wont be merged but "A" + "B" will.
+ expressions like ("A" if test else "B") won't be merged but "A" + "B" will.
"""
estr_ls = []
nds_ls = []
@@ -545,7 +545,7 @@ def dump_py_messages_from_files(msgs, reports, files, settings):
for n in opname.split('.'):
op = getattr(op, n)
try:
- return op.get_rna().bl_rna.translation_context
+ return op.get_rna_type().translation_context
except Exception as e:
default_op_context = i18n_contexts.operator_default
print("ERROR: ", str(e))
diff --git a/release/scripts/modules/bl_i18n_utils/settings.py b/release/scripts/modules/bl_i18n_utils/settings.py
index 68a5537567c..150c2c36623 100644
--- a/release/scripts/modules/bl_i18n_utils/settings.py
+++ b/release/scripts/modules/bl_i18n_utils/settings.py
@@ -38,22 +38,22 @@ import bpy
# The languages defined in Blender.
LANGUAGES_CATEGORIES = (
# Min completeness level, UI english label.
- ( 0.95, "Complete"),
- ( 0.33, "In Progress"),
- ( -1.0, "Starting"),
+ (0.95, "Complete"),
+ (0.33, "In Progress"),
+ (-1.0, "Starting"),
)
LANGUAGES = (
# ID, UI english label, ISO code.
- ( 0, "Default (Default)", "DEFAULT"),
- ( 1, "English (English)", "en_US"),
- ( 2, "Japanese (日本語)", "ja_JP"),
- ( 3, "Dutch (Nederlandse taal)", "nl_NL"),
- ( 4, "Italian (Italiano)", "it_IT"),
- ( 5, "German (Deutsch)", "de_DE"),
- ( 6, "Finnish (Suomi)", "fi_FI"),
- ( 7, "Swedish (Svenska)", "sv_SE"),
- ( 8, "French (Français)", "fr_FR"),
- ( 9, "Spanish (Español)", "es"),
+ (0, "Default (Default)", "DEFAULT"),
+ (1, "English (English)", "en_US"),
+ (2, "Japanese (日本語)", "ja_JP"),
+ (3, "Dutch (Nederlandse taal)", "nl_NL"),
+ (4, "Italian (Italiano)", "it_IT"),
+ (5, "German (Deutsch)", "de_DE"),
+ (6, "Finnish (Suomi)", "fi_FI"),
+ (7, "Swedish (Svenska)", "sv_SE"),
+ (8, "French (Français)", "fr_FR"),
+ (9, "Spanish (Español)", "es"),
(10, "Catalan (Català)", "ca_AD"),
(11, "Czech (Český)", "cs_CZ"),
(12, "Portuguese (Português)", "pt_PT"),
@@ -262,7 +262,7 @@ PYGETTEXT_KEYWORDS = (() +
# Check printf mismatches between msgid and msgstr.
CHECK_PRINTF_FORMAT = (
- r"(?!<%)(?:%%)*%" # Begining, with handling for crazy things like '%%%%%s'
+ r"(?!<%)(?:%%)*%" # Beginning, with handling for crazy things like '%%%%%s'
r"[-+#0]?" # Flags (note: do not add the ' ' (space) flag here, generates too much false positives!)
r"(?:\*|[0-9]+)?" # Width
r"(?:\.(?:\*|[0-9]+))?" # Precision
@@ -514,6 +514,7 @@ def _do_set(ref, path):
def _gen_get_set_path(ref, name):
def _get(self):
return _do_get(getattr(self, ref), getattr(self, name))
+
def _set(self, value):
setattr(self, name, _do_set(getattr(self, ref), value))
return _get, _set
@@ -579,6 +580,7 @@ class I18nSettings:
def _get_py_sys_paths(self):
return self.INTERN_PY_SYS_PATHS
+
def _set_py_sys_paths(self, val):
old_paths = set(self.INTERN_PY_SYS_PATHS.split(";")) - {""}
new_paths = set(val.split(";")) - {""}
diff --git a/release/scripts/modules/bl_i18n_utils/utils.py b/release/scripts/modules/bl_i18n_utils/utils.py
index 880721176e0..55a210c56ed 100644
--- a/release/scripts/modules/bl_i18n_utils/utils.py
+++ b/release/scripts/modules/bl_i18n_utils/utils.py
@@ -208,7 +208,7 @@ def enable_addons(addons=None, support=None, disable=False, check_only=False):
for cat in dir(bpy.ops):
cat = getattr(bpy.ops, cat)
for op in dir(cat):
- getattr(cat, op).get_rna()
+ getattr(cat, op).get_rna_type()
return ret
@@ -457,7 +457,7 @@ class I18nMessages:
def check(self, fix=False):
"""
Check consistency between messages and their keys!
- Check messages using format stuff are consistant between msgid and msgstr!
+ Check messages using format stuff are consistent between msgid and msgstr!
If fix is True, tries to fix the issues.
Return a list of found errors (empty if everything went OK!).
"""
diff --git a/release/scripts/modules/bl_i18n_utils/utils_rtl.py b/release/scripts/modules/bl_i18n_utils/utils_rtl.py
index 261d1544ac6..c446182dfc0 100755
--- a/release/scripts/modules/bl_i18n_utils/utils_rtl.py
+++ b/release/scripts/modules/bl_i18n_utils/utils_rtl.py
@@ -28,7 +28,7 @@
# Windows or OsX.
# This uses ctypes, as there is no py3 binding for fribidi currently.
# This implies you only need the compiled C library to run it.
-# Finally, note that it handles some formating/escape codes (like
+# Finally, note that it handles some formatting/escape codes (like
# \", %s, %x12, %.4f, etc.), protecting them from ugly (evil) fribidi,
# which seems completely unaware of such things (as unicode is...).
@@ -79,7 +79,7 @@ MENU_DETECT_REGEX = re.compile("%x\\d+\\|")
##### Kernel processing funcs. #####
def protect_format_seq(msg):
"""
- Find some specific escaping/formating sequences (like \", %s, etc.,
+ Find some specific escaping/formatting sequences (like \", %s, etc.,
and protect them from any modification!
"""
# LRM = "\u200E"
diff --git a/release/scripts/modules/blend_render_info.py b/release/scripts/modules/blend_render_info.py
index 3b4fb255005..8cf4734bddb 100755
--- a/release/scripts/modules/blend_render_info.py
+++ b/release/scripts/modules/blend_render_info.py
@@ -22,7 +22,7 @@
# This module can get render info without running from inside blender.
#
-# This struct wont change according to Ton.
+# This struct won't change according to Ton.
# Note that the size differs on 32/64bit
#
# typedef struct BHead {
diff --git a/release/scripts/modules/bpy/ops.py b/release/scripts/modules/bpy/ops.py
index 6d8ed1c1780..f4e37ebc9a8 100644
--- a/release/scripts/modules/bpy/ops.py
+++ b/release/scripts/modules/bpy/ops.py
@@ -26,8 +26,7 @@ op_dir = ops_module.dir
op_poll = ops_module.poll
op_call = ops_module.call
op_as_string = ops_module.as_string
-op_get_rna = ops_module.get_rna
-op_get_instance = ops_module.get_instance
+op_get_rna_type = ops_module.get_rna_type
class BPyOps:
@@ -115,7 +114,16 @@ class BPyOpsSubModOp:
__slots__ = ("_module", "_func")
def _get_doc(self):
- return op_as_string(self.idname())
+ idname = self.idname()
+ sig = op_as_string(self.idname())
+ # XXX You never quite know what you get from bpy.types,
+ # with operators... Operator and OperatorProperties
+ # are shadowing each other, and not in the same way for
+ # native ops and py ones! See T39158.
+ # op_class = getattr(bpy.types, idname)
+ op_class = op_get_rna_type(idname)
+ descr = op_class.description
+ return f"{sig}\n{descr}"
@staticmethod
def _parse_args(args):
@@ -196,33 +204,13 @@ class BPyOpsSubModOp:
return ret
- def get_rna(self):
- """Internal function for introspection"""
- return op_get_rna(self.idname())
-
- def get_instance(self):
+ def get_rna_type(self):
"""Internal function for introspection"""
- return op_get_instance(self.idname())
+ return op_get_rna_type(self.idname())
def __repr__(self): # useful display, repr(op)
# import bpy
- idname = self.idname()
- as_string = op_as_string(idname)
- # XXX You never quite know what you get from bpy.types,
- # with operators... Operator and OperatorProperties
- # are shadowing each other, and not in the same way for
- # native ops and py ones! See T39158.
- # op_class = getattr(bpy.types, idname)
- op_class = op_get_rna(idname)
- descr = op_class.bl_rna.description
- # XXX, workaround for not registering
- # every __doc__ to save time on load.
- if not descr:
- descr = op_class.__doc__
- if not descr:
- descr = ""
-
- return "# %s\n%s" % (descr, as_string)
+ return op_as_string(self.idname())
def __str__(self): # used for print(...)
return ("<function bpy.ops.%s.%s at 0x%x'>" %
diff --git a/release/scripts/modules/bpy/path.py b/release/scripts/modules/bpy/path.py
index facbc61266c..6b713ad7eb7 100644
--- a/release/scripts/modules/bpy/path.py
+++ b/release/scripts/modules/bpy/path.py
@@ -310,7 +310,7 @@ def resolve_ncase(path):
if f_iter_nocase:
return _os.path.join(dirpath, f_iter_nocase) + suffix, True
else:
- # cant find the right one, just return the path as is.
+ # can't find the right one, just return the path as is.
return path, False
ncase_path, found = _ncase_path_found(path)
diff --git a/release/scripts/modules/bpy/utils/__init__.py b/release/scripts/modules/bpy/utils/__init__.py
index 80e48697b2f..b76050395da 100644
--- a/release/scripts/modules/bpy/utils/__init__.py
+++ b/release/scripts/modules/bpy/utils/__init__.py
@@ -146,6 +146,7 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
"""
use_time = use_class_register_check = _bpy.app.debug_python
use_user = not _is_factory_startup
+ is_background = _bpy.app.background
if use_time:
import time
@@ -261,12 +262,20 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
_addon_utils.reset_all(reload_scripts=reload_scripts)
del _initialize
- # run the active integration preset
- filepath = preset_find(_user_preferences.inputs.active_keyconfig,
- "keyconfig")
+ if not is_background:
+ # Load the default key configuration.
+ filepath = preset_find("blender", "keyconfig")
+ if filepath:
+ keyconfig_set(filepath)
- if filepath:
- keyconfig_set(filepath)
+ # run the active integration preset
+ filepath = preset_find(
+ _user_preferences.inputs.active_keyconfig,
+ "keyconfig",
+ )
+
+ if filepath:
+ keyconfig_set(filepath)
if reload_scripts:
import gc
@@ -709,6 +718,48 @@ def register_submodule_factory(module_name, submodule_names):
# -----------------------------------------------------------------------------
+# Tool Registraion
+
+def register_tool(space_type, context_mode, tool_def):
+ from bl_ui.space_toolsystem_common import ToolSelectPanelHelper
+ cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type)
+ if cls is None:
+ raise Exception(f"Space type {space_type!r} has no toolbar")
+ tools = cls._tools[context_mode]
+
+ keymap_data = tool_def.keymap
+ if keymap_data is not None:
+ if context_mode is None:
+ context_descr = "All"
+ else:
+ context_descr = context_mode.replace("_", " ").title()
+ from bpy import context
+ wm = context.window_manager
+ kc = wm.keyconfigs.default
+ if callable(keymap_data[0]):
+ cls._km_action_simple(kc, context_descr, tool_def.text, keymap_data)
+
+ tools.append(tool_def)
+
+
+def unregister_tool(space_type, context_mode, tool_def):
+ from bl_ui.space_toolsystem_common import ToolSelectPanelHelper
+ cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type)
+ if cls is None:
+ raise Exception(f"Space type {space_type!r} has no toolbar")
+ tools = cls._tools[context_mode]
+ tools.remove(tool_def)
+
+ keymap_data = tool_def.keymap
+ if keymap_data is not None:
+ from bpy import context
+ wm = context.window_manager
+ kc = wm.keyconfigs.default
+ km = keymap_data[0]
+ kc.keymaps.remove(km)
+
+
+# -----------------------------------------------------------------------------
# Manual lookups, each function has to return a basepath and a sequence
# of...
diff --git a/release/scripts/modules/bpy/utils/toolsystem.py b/release/scripts/modules/bpy/utils/toolsystem.py
new file mode 100644
index 00000000000..e2431536b4f
--- /dev/null
+++ b/release/scripts/modules/bpy/utils/toolsystem.py
@@ -0,0 +1,23 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+# Until we untangle ToolDef from bl_ui internals,
+# use this module to document ToolDef.
+from bl_ui.space_toolsystem_common import ToolDef
diff --git a/release/scripts/modules/bpy_extras/anim_utils.py b/release/scripts/modules/bpy_extras/anim_utils.py
index 7216add2c2c..c545d237329 100644
--- a/release/scripts/modules/bpy_extras/anim_utils.py
+++ b/release/scripts/modules/bpy_extras/anim_utils.py
@@ -168,7 +168,8 @@ def bake_action_iter(
for name, pbone in obj.pose.bones.items():
if do_visual_keying:
# Get the final transform of the bone in its own local space...
- matrix[name] = obj.convert_space(pbone, pbone.matrix, 'POSE', 'LOCAL')
+ matrix[name] = obj.convert_space(pose_bone=pbone, matrix=pbone.matrix,
+ from_space='POSE', to_space='LOCAL')
else:
matrix[name] = pbone.matrix_basis.copy()
@@ -272,13 +273,13 @@ def bake_action_iter(
for (f, matrix, bbones) in pose_info:
pbone.matrix_basis = matrix[name].copy()
- pbone.keyframe_insert("location", -1, f, name, options)
+ pbone.keyframe_insert("location", index=-1, frame=f, group=name, options=options)
rotation_mode = pbone.rotation_mode
if rotation_mode == 'QUATERNION':
- pbone.keyframe_insert("rotation_quaternion", -1, f, name, options)
+ pbone.keyframe_insert("rotation_quaternion", index=-1, frame=f, group=name, options=options)
elif rotation_mode == 'AXIS_ANGLE':
- pbone.keyframe_insert("rotation_axis_angle", -1, f, name, options)
+ pbone.keyframe_insert("rotation_axis_angle", index=-1, frame=f, group=name, options=options)
else: # euler, XYZ, ZXY etc
if euler_prev is not None:
euler = pbone.rotation_euler.copy()
@@ -288,9 +289,9 @@ def bake_action_iter(
del euler
else:
euler_prev = pbone.rotation_euler.copy()
- pbone.keyframe_insert("rotation_euler", -1, f, name, options)
+ pbone.keyframe_insert("rotation_euler", index=-1, frame=f, group=name, options=options)
- pbone.keyframe_insert("scale", -1, f, name, options)
+ pbone.keyframe_insert("scale", index=-1, frame=f, group=name, options=options)
# Bendy Bones
if pbone.bone.bbone_segments > 1:
@@ -298,7 +299,7 @@ def bake_action_iter(
for bb_prop in BBONE_PROPS:
# update this property with value from bbone_shape, then key it
setattr(pbone, bb_prop, bbone_shape[bb_prop])
- pbone.keyframe_insert(bb_prop, -1, f, name, options)
+ pbone.keyframe_insert(bb_prop, index=-1, frame=f, group=name, options=options)
# object. TODO. multiple objects
if do_object:
@@ -313,13 +314,13 @@ def bake_action_iter(
name = "Action Bake" # XXX: placeholder
obj.matrix_basis = matrix
- obj.keyframe_insert("location", -1, f, name, options)
+ obj.keyframe_insert("location", index=-1, frame=f, group=name, options=options)
rotation_mode = obj.rotation_mode
if rotation_mode == 'QUATERNION':
- obj.keyframe_insert("rotation_quaternion", -1, f, name, options)
+ obj.keyframe_insert("rotation_quaternion", index=-1, frame=f, group=name, options=options)
elif rotation_mode == 'AXIS_ANGLE':
- obj.keyframe_insert("rotation_axis_angle", -1, f, name, options)
+ obj.keyframe_insert("rotation_axis_angle", index=-1, frame=f, group=name, options=options)
else: # euler, XYZ, ZXY etc
if euler_prev is not None:
euler = obj.rotation_euler.copy()
@@ -329,9 +330,9 @@ def bake_action_iter(
del euler
else:
euler_prev = obj.rotation_euler.copy()
- obj.keyframe_insert("rotation_euler", -1, f, name, options)
+ obj.keyframe_insert("rotation_euler", index=-1, frame=f, group=name, options=options)
- obj.keyframe_insert("scale", -1, f, name, options)
+ obj.keyframe_insert("scale", index=-1, frame=f, group=name, options=options)
if do_parents_clear:
obj.parent = None
diff --git a/release/scripts/modules/bpy_extras/image_utils.py b/release/scripts/modules/bpy_extras/image_utils.py
index 49fce7d27c7..63850b63b57 100644
--- a/release/scripts/modules/bpy_extras/image_utils.py
+++ b/release/scripts/modules/bpy_extras/image_utils.py
@@ -103,7 +103,7 @@ def load_image(imagepath,
path = os.path.abspath(path)
try:
- image = bpy.data.images.load(path, check_existing)
+ image = bpy.data.images.load(path, check_existing=check_existing)
except RuntimeError:
image = None
diff --git a/release/scripts/modules/bpy_extras/io_utils.py b/release/scripts/modules/bpy_extras/io_utils.py
index a0c1c3e5c84..e74631256e3 100644
--- a/release/scripts/modules/bpy_extras/io_utils.py
+++ b/release/scripts/modules/bpy_extras/io_utils.py
@@ -21,7 +21,7 @@
__all__ = (
"ExportHelper",
"ImportHelper",
- "orientation_helper_factory",
+ "orientation_helper",
"axis_conversion",
"axis_conversion_ensure",
"create_derived_objects",
@@ -121,48 +121,53 @@ class ImportHelper:
return _check_axis_conversion(self)
-def orientation_helper_factory(name, axis_forward='Y', axis_up='Z'):
- members = {}
-
- def _update_axis_forward(self, context):
- if self.axis_forward[-1] == self.axis_up[-1]:
- self.axis_up = (self.axis_up[0:-1] +
- 'XYZ'[('XYZ'.index(self.axis_up[-1]) + 1) % 3])
-
- members['axis_forward'] = EnumProperty(
- name="Forward",
- items=(
- ('X', "X Forward", ""),
- ('Y', "Y Forward", ""),
- ('Z', "Z Forward", ""),
- ('-X', "-X Forward", ""),
- ('-Y', "-Y Forward", ""),
- ('-Z', "-Z Forward", ""),
- ),
- default=axis_forward,
- update=_update_axis_forward,
- )
-
- def _update_axis_up(self, context):
- if self.axis_up[-1] == self.axis_forward[-1]:
- self.axis_forward = (self.axis_forward[0:-1] +
- 'XYZ'[('XYZ'.index(self.axis_forward[-1]) + 1) % 3])
-
- members['axis_up'] = EnumProperty(
- name="Up",
- items=(
- ('X', "X Up", ""),
- ('Y', "Y Up", ""),
- ('Z', "Z Up", ""),
- ('-X', "-X Up", ""),
- ('-Y', "-Y Up", ""),
- ('-Z', "-Z Up", ""),
- ),
- default=axis_up,
- update=_update_axis_up,
- )
-
- return type(name, (object,), members)
+def orientation_helper(axis_forward='Y', axis_up='Z'):
+ """
+ A decorator for import/export classes, generating properties needed by the axis conversion system and IO helpers,
+ with specified default values (axes).
+ """
+ def wrapper(cls):
+ def _update_axis_forward(self, context):
+ if self.axis_forward[-1] == self.axis_up[-1]:
+ self.axis_up = (self.axis_up[0:-1] +
+ 'XYZ'[('XYZ'.index(self.axis_up[-1]) + 1) % 3])
+
+ cls.__annotations__['axis_forward'] = EnumProperty(
+ name="Forward",
+ items=(
+ ('X', "X Forward", ""),
+ ('Y', "Y Forward", ""),
+ ('Z', "Z Forward", ""),
+ ('-X', "-X Forward", ""),
+ ('-Y', "-Y Forward", ""),
+ ('-Z', "-Z Forward", ""),
+ ),
+ default=axis_forward,
+ update=_update_axis_forward,
+ )
+
+ def _update_axis_up(self, context):
+ if self.axis_up[-1] == self.axis_forward[-1]:
+ self.axis_forward = (self.axis_forward[0:-1] +
+ 'XYZ'[('XYZ'.index(self.axis_forward[-1]) + 1) % 3])
+
+ cls.__annotations__['axis_up'] = EnumProperty(
+ name="Up",
+ items=(
+ ('X', "X Up", ""),
+ ('Y', "Y Up", ""),
+ ('Z', "Z Up", ""),
+ ('-X', "-X Up", ""),
+ ('-Y', "-Y Up", ""),
+ ('-Z', "-Z Up", ""),
+ ),
+ default=axis_up,
+ update=_update_axis_up,
+ )
+
+ return cls
+
+ return wrapper
# Axis conversion function, not pretty LUT
diff --git a/release/scripts/modules/bpy_extras/keyconfig_utils.py b/release/scripts/modules/bpy_extras/keyconfig_utils.py
index ec4db69986c..1cad1c965b0 100644
--- a/release/scripts/modules/bpy_extras/keyconfig_utils.py
+++ b/release/scripts/modules/bpy_extras/keyconfig_utils.py
@@ -18,12 +18,36 @@
# <pep8 compliant>
+
+def _km_expand_from_toolsystem(space_type, context_mode):
+ def _fn():
+ from bl_ui.space_toolsystem_common import ToolSelectPanelHelper
+ for cls in ToolSelectPanelHelper.__subclasses__():
+ if cls.bl_space_type == space_type:
+ return cls.keymap_ui_hierarchy(context_mode)
+ raise Exception("keymap not found")
+ return _fn
+
+
+def _km_hierarchy_iter_recursive(items):
+ for sub in items:
+ if callable(sub):
+ yield from sub()
+ else:
+ yield (*sub[:3], list(_km_hierarchy_iter_recursive(sub[3])))
+
+
+def km_hierarchy():
+ return list(_km_hierarchy_iter_recursive(_km_hierarchy))
+
+
# bpy.type.KeyMap: (km.name, km.space_type, km.region_type, [...])
# ('Script', 'EMPTY', 'WINDOW', []),
-KM_HIERARCHY = [
+# Access via 'km_hierarchy'.
+_km_hierarchy = [
('Window', 'EMPTY', 'WINDOW', []), # file save, window change, exit
('Screen', 'EMPTY', 'WINDOW', [ # full screen, undo, screenshot
('Screen Editing', 'EMPTY', 'WINDOW', []), # re-sizing, action corners
@@ -36,24 +60,51 @@ KM_HIERARCHY = [
('User Interface', 'EMPTY', 'WINDOW', []),
('3D View', 'VIEW_3D', 'WINDOW', [ # view 3d navigation and generic stuff (select, transform)
- ('Object Mode', 'EMPTY', 'WINDOW', []),
- ('Mesh', 'EMPTY', 'WINDOW', []),
- ('Curve', 'EMPTY', 'WINDOW', []),
- ('Armature', 'EMPTY', 'WINDOW', []),
- ('Metaball', 'EMPTY', 'WINDOW', []),
- ('Lattice', 'EMPTY', 'WINDOW', []),
- ('Font', 'EMPTY', 'WINDOW', []),
-
- ('Pose', 'EMPTY', 'WINDOW', []),
-
- ('Vertex Paint', 'EMPTY', 'WINDOW', []),
- ('Weight Paint', 'EMPTY', 'WINDOW', []),
+ ('Object Mode', 'EMPTY', 'WINDOW', [
+ _km_expand_from_toolsystem('VIEW_3D', 'OBJECT'),
+ ]),
+ ('Mesh', 'EMPTY', 'WINDOW', [
+ _km_expand_from_toolsystem('VIEW_3D', 'EDIT_MESH'),
+ ]),
+ ('Curve', 'EMPTY', 'WINDOW', [
+ _km_expand_from_toolsystem('VIEW_3D', 'EDIT_CURVE'),
+ ]),
+ ('Armature', 'EMPTY', 'WINDOW', [
+ _km_expand_from_toolsystem('VIEW_3D', 'EDIT_ARMATURE'),
+ ]),
+ ('Metaball', 'EMPTY', 'WINDOW', [
+ _km_expand_from_toolsystem('VIEW_3D', 'EDIT_METABALL'),
+ ]),
+ ('Lattice', 'EMPTY', 'WINDOW', [
+ _km_expand_from_toolsystem('VIEW_3D', 'EDIT_LATTICE'),
+ ]),
+ ('Font', 'EMPTY', 'WINDOW', [
+ _km_expand_from_toolsystem('VIEW_3D', 'EDIT_TEXT'),
+ ]),
+
+ ('Pose', 'EMPTY', 'WINDOW', [
+ _km_expand_from_toolsystem('VIEW_3D', 'POSE'),
+ ]),
+
+ ('Vertex Paint', 'EMPTY', 'WINDOW', [
+ _km_expand_from_toolsystem('VIEW_3D', 'PAINT_VERTEX'),
+ ]),
+ ('Weight Paint', 'EMPTY', 'WINDOW', [
+ _km_expand_from_toolsystem('VIEW_3D', 'PAINT_WEIGHT'),
+ ]),
('Weight Paint Vertex Selection', 'EMPTY', 'WINDOW', []),
('Face Mask', 'EMPTY', 'WINDOW', []),
- ('Image Paint', 'EMPTY', 'WINDOW', []), # image and view3d
- ('Sculpt', 'EMPTY', 'WINDOW', []),
-
- ('Particle', 'EMPTY', 'WINDOW', []),
+ # image and view3d
+ ('Image Paint', 'EMPTY', 'WINDOW', [
+ _km_expand_from_toolsystem('VIEW_3D', 'PAINT_TEXTURE'),
+ ]),
+ ('Sculpt', 'EMPTY', 'WINDOW', [
+ _km_expand_from_toolsystem('VIEW_3D', 'SCULPT'),
+ ]),
+
+ ('Particle', 'EMPTY', 'WINDOW', [
+ _km_expand_from_toolsystem('VIEW_3D', 'PARTICLE'),
+ ]),
('Knife Tool Modal Map', 'EMPTY', 'WINDOW', []),
('Custom Normals Modal Map', 'EMPTY', 'WINDOW', []),
@@ -69,7 +120,10 @@ KM_HIERARCHY = [
('View3D Zoom Modal', 'EMPTY', 'WINDOW', []),
('View3D Dolly Modal', 'EMPTY', 'WINDOW', []),
- ('3D View Generic', 'VIEW_3D', 'WINDOW', []), # toolbar and properties
+ # toolbar and properties
+ ('3D View Generic', 'VIEW_3D', 'WINDOW', [
+ _km_expand_from_toolsystem('VIEW_3D', None),
+ ]),
]),
('Graph Editor', 'GRAPH_EDITOR', 'WINDOW', [
@@ -88,7 +142,9 @@ KM_HIERARCHY = [
('UV Editor', 'EMPTY', 'WINDOW', []), # image (reverse order, UVEdit before Image)
('Image Paint', 'EMPTY', 'WINDOW', []), # image and view3d
('UV Sculpt', 'EMPTY', 'WINDOW', []),
- ('Image Generic', 'IMAGE_EDITOR', 'WINDOW', []),
+ ('Image Generic', 'IMAGE_EDITOR', 'WINDOW', [
+ _km_expand_from_toolsystem('IMAGE_EDITOR', None),
+ ]),
]),
('Outliner', 'OUTLINER', 'WINDOW', []),
@@ -138,7 +194,7 @@ KM_HIERARCHY = [
('View3D Gesture Circle', 'EMPTY', 'WINDOW', []),
('Gesture Straight Line', 'EMPTY', 'WINDOW', []),
('Gesture Zoom Border', 'EMPTY', 'WINDOW', []),
- ('Gesture Border', 'EMPTY', 'WINDOW', []),
+ ('Gesture Box', 'EMPTY', 'WINDOW', []),
('Standard Modal Map', 'EMPTY', 'WINDOW', []),
('Transform Modal Map', 'EMPTY', 'WINDOW', []),
@@ -410,7 +466,7 @@ def keyconfig_test(kc):
# Function body
result = False
- for entry in KM_HIERARCHY:
+ for entry in km_hierarchy():
if testEntry(kc, entry):
result = True
return result
@@ -421,4 +477,5 @@ def keyconfig_test(kc):
from .keyconfig_utils_experimental import (
keyconfig_export_as_data,
keyconfig_import_from_data,
+ keyconfig_module_from_preset,
)
diff --git a/release/scripts/modules/bpy_extras/keyconfig_utils_experimental.py b/release/scripts/modules/bpy_extras/keyconfig_utils_experimental.py
index cd82460e8e0..b93da5ec6da 100644
--- a/release/scripts/modules/bpy_extras/keyconfig_utils_experimental.py
+++ b/release/scripts/modules/bpy_extras/keyconfig_utils_experimental.py
@@ -21,6 +21,7 @@
__all__ = (
"keyconfig_export_as_data",
"keyconfig_import_from_data",
+ "keyconfig_module_from_preset",
)
@@ -242,3 +243,22 @@ def keyconfig_import_from_data(name, keyconfig_data):
kmi_props = kmi.properties
for attr, value in kmi_props_data:
kmi_props_setattr(kmi_props, attr, value)
+
+
+def keyconfig_module_from_preset(name, preset_reference_filename=None):
+ import os
+ import importlib.util
+ if preset_reference_filename is not None:
+ preset_path = os.path.join(os.path.dirname(preset_reference_filename), name + ".py")
+ else:
+ preset_path = None
+
+ # External presets may want to re-use other presets too.
+ if not (preset_path and os.path.exists(preset_path)):
+ preset_path = bpy.utils.preset_find(name, "keyconfig")
+
+ # module name isn't used or added to 'sys.modules'.
+ mod_spec = importlib.util.spec_from_file_location("__bl_keymap__", preset_path)
+ mod = importlib.util.module_from_spec(mod_spec)
+ mod_spec.loader.exec_module(mod)
+ return mod
diff --git a/release/scripts/modules/bpy_extras/mesh_utils.py b/release/scripts/modules/bpy_extras/mesh_utils.py
index 43b02e5c881..a09282da2fe 100644
--- a/release/scripts/modules/bpy_extras/mesh_utils.py
+++ b/release/scripts/modules/bpy_extras/mesh_utils.py
@@ -20,19 +20,18 @@
__all__ = (
"mesh_linked_uv_islands",
- "mesh_linked_tessfaces",
+ "mesh_linked_triangles",
"edge_face_count_dict",
"edge_face_count",
- "edge_loops_from_tessfaces",
"edge_loops_from_edges",
"ngon_tessellate",
- "face_random_points",
+ "triangle_random_points",
)
def mesh_linked_uv_islands(mesh):
"""
- Splits the mesh into connected polygons, use this for seperating cubes from
+ Splits the mesh into connected polygons, use this for separating cubes from
other mesh elements within 1 mesh datablock.
:arg mesh: the mesh used to group with.
@@ -90,41 +89,41 @@ def mesh_linked_uv_islands(mesh):
return poly_islands
-def mesh_linked_tessfaces(mesh):
+def mesh_linked_triangles(mesh):
"""
- Splits the mesh into connected faces, use this for seperating cubes from
+ Splits the mesh into connected triangles, use this for separating cubes from
other mesh elements within 1 mesh datablock.
:arg mesh: the mesh used to group with.
:type mesh: :class:`bpy.types.Mesh`
- :return: lists of lists containing faces.
+ :return: lists of lists containing triangles.
:rtype: list
"""
# Build vert face connectivity
- vert_faces = [[] for i in range(len(mesh.vertices))]
- for f in mesh.tessfaces:
- for v in f.vertices:
- vert_faces[v].append(f)
+ vert_tris = [[] for i in range(len(mesh.vertices))]
+ for t in mesh.loop_triangles:
+ for v in t.vertices:
+ vert_tris[v].append(t)
- # sort faces into connectivity groups
- face_groups = [[f] for f in mesh.tessfaces]
- # map old, new face location
- face_mapping = list(range(len(mesh.tessfaces)))
+ # sort triangles into connectivity groups
+ tri_groups = [[t] for t in mesh.loop_triangles]
+ # map old, new tri location
+ tri_mapping = list(range(len(mesh.loop_triangles)))
- # Now clump faces iteratively
+ # Now clump triangles iteratively
ok = True
while ok:
ok = False
- for i, f in enumerate(mesh.tessfaces):
- mapped_index = face_mapping[f.index]
- mapped_group = face_groups[mapped_index]
+ for i, t in enumerate(mesh.loop_triangles):
+ mapped_index = tri_mapping[t.index]
+ mapped_group = tri_groups[mapped_index]
- for v in f.vertices:
- for nxt_f in vert_faces[v]:
- if nxt_f != f:
- nxt_mapped_index = face_mapping[nxt_f.index]
+ for v in t.vertices:
+ for nxt_t in vert_tris[v]:
+ if nxt_t != t:
+ nxt_mapped_index = tri_mapping[nxt_t.index]
# We are not a part of the same group
if mapped_index != nxt_mapped_index:
@@ -132,18 +131,18 @@ def mesh_linked_tessfaces(mesh):
# Assign mapping to this group so they
# all map to this group
- for grp_f in face_groups[nxt_mapped_index]:
- face_mapping[grp_f.index] = mapped_index
+ for grp_t in tri_groups[nxt_mapped_index]:
+ tri_mapping[grp_t.index] = mapped_index
- # Move faces into this group
- mapped_group.extend(face_groups[nxt_mapped_index])
+ # Move triangles into this group
+ mapped_group.extend(tri_groups[nxt_mapped_index])
# remove reference to the list
- face_groups[nxt_mapped_index] = None
+ tri_groups[nxt_mapped_index] = None
- # return all face groups that are not null
- # this is all the faces that are connected in their own lists.
- return [fg for fg in face_groups if fg]
+ # return all tri groups that are not null
+ # this is all the triangles that are connected in their own lists.
+ return [tg for tg in tri_groups if tg]
def edge_face_count_dict(mesh):
@@ -177,87 +176,6 @@ def edge_face_count(mesh):
return [get(edge_face_count, ed.key, 0) for ed in mesh.edges]
-def edge_loops_from_tessfaces(mesh, tessfaces=None, seams=()):
- """
- Edge loops defined by faces
-
- Takes me.tessfaces or a list of faces and returns the edge loops
- These edge loops are the edges that sit between quads, so they dont touch
- 1 quad, note: not connected will make 2 edge loops,
- both only containing 2 edges.
-
- return a list of edge key lists
- [[(0, 1), (4, 8), (3, 8)], ...]
-
- :arg mesh: the mesh used to get edge loops from.
- :type mesh: :class:`bpy.types.Mesh`
- :arg tessfaces: optional face list to only use some of the meshes faces.
- :type tessfaces: :class:`bpy.types.MeshTessFace`, sequence or or NoneType
- :return: return a list of edge vertex index lists.
- :rtype: list
- """
-
- OTHER_INDEX = 2, 3, 0, 1 # opposite face index
-
- if tessfaces is None:
- tessfaces = mesh.tessfaces
-
- edges = {}
-
- for f in tessfaces:
- if len(f.vertices) == 4:
- edge_keys = f.edge_keys
- for i, edkey in enumerate(f.edge_keys):
- edges.setdefault(edkey, []).append(edge_keys[OTHER_INDEX[i]])
-
- for edkey in seams:
- edges[edkey] = []
-
- # Collect edge loops here
- edge_loops = []
-
- for edkey, ed_adj in edges.items():
- if 0 < len(ed_adj) < 3: # 1 or 2
- # Seek the first edge
- context_loop = [edkey, ed_adj[0]]
- edge_loops.append(context_loop)
- if len(ed_adj) == 2:
- other_dir = ed_adj[1]
- else:
- other_dir = None
-
- del ed_adj[:]
-
- flipped = False
-
- while 1:
- # from knowing the last 2, look for the next.
- ed_adj = edges[context_loop[-1]]
- if len(ed_adj) != 2:
- # the original edge had 2 other edges
- if other_dir and flipped is False:
- flipped = True # only flip the list once
- context_loop.reverse()
- del ed_adj[:]
- context_loop.append(other_dir) # save 1 look-up
-
- ed_adj = edges[context_loop[-1]]
- if len(ed_adj) != 2:
- del ed_adj[:]
- break
- else:
- del ed_adj[:]
- break
-
- i = ed_adj.index(context_loop[-2])
- context_loop.append(ed_adj[not i])
-
- # Dont look at this again
- del ed_adj[:]
-
- return edge_loops
-
-
def edge_loops_from_edges(mesh, edges=None):
"""
Edge loops defined by edges
@@ -377,7 +295,7 @@ def ngon_tessellate(from_data, indices, fix_loops=True):
else:
"""
- Seperate this loop into multiple loops be finding edges that are
+ Separate this loop into multiple loops be finding edges that are
used twice. This is used by lightwave LWO files a lot
"""
@@ -511,54 +429,42 @@ def ngon_tessellate(from_data, indices, fix_loops=True):
return fill
-def face_random_points(num_points, tessfaces):
+def triangle_random_points(num_points, loop_triangles):
"""
- Generates a list of random points over mesh tessfaces.
+ Generates a list of random points over mesh loop triangles.
- :arg num_points: the number of random points to generate on each face.
+ :arg num_points: the number of random points to generate on each triangle.
:type int:
- :arg tessfaces: list of the faces to generate points on.
- :type tessfaces: :class:`bpy.types.MeshTessFace`, sequence
- :return: list of random points over all faces.
+ :arg loop_triangles: list of the triangles to generate points on.
+ :type loop_triangles: :class:`bpy.types.MeshLoopTriangle`, sequence
+ :return: list of random points over all triangles.
:rtype: list
"""
from random import random
from mathutils.geometry import area_tri
- # Split all quads into 2 tris, tris remain unchanged
- tri_faces = []
- for f in tessfaces:
- tris = []
- verts = f.id_data.vertices
- fv = f.vertices[:]
- tris.append((verts[fv[0]].co,
- verts[fv[1]].co,
- verts[fv[2]].co,
- ))
- if len(fv) == 4:
- tris.append((verts[fv[0]].co,
- verts[fv[3]].co,
- verts[fv[2]].co,
- ))
- tri_faces.append(tris)
-
- # For each face, generate the required number of random points
- sampled_points = [None] * (num_points * len(tessfaces))
- for i, tf in enumerate(tri_faces):
+ # For each triangle, generate the required number of random points
+ sampled_points = [None] * (num_points * len(loop_triangles))
+ for i, lt in enumerate(loop_triangles):
+ # Get triangle vertex coordinates
+ verts = lt.id_data.vertices
+ ltv = lt.vertices[:]
+ tv = (verts[ltv[0]].co, verts[ltv[1]].co, verts[ltv[2]].co)
+
for k in range(num_points):
# If this is a quad, we need to weight its 2 tris by their area
- if len(tf) != 1:
- area1 = area_tri(*tf[0])
- area2 = area_tri(*tf[1])
+ if len(tv) != 1:
+ area1 = area_tri(*tv[0])
+ area2 = area_tri(*tv[1])
area_tot = area1 + area2
area1 = area1 / area_tot
area2 = area2 / area_tot
- vecs = tf[0 if (random() < area1) else 1]
+ vecs = tv[0 if (random() < area1) else 1]
else:
- vecs = tf[0]
+ vecs = tv[0]
u1 = random()
u2 = random()
diff --git a/release/scripts/modules/bpy_extras/node_shader_utils.py b/release/scripts/modules/bpy_extras/node_shader_utils.py
new file mode 100644
index 00000000000..d06d66d3cb5
--- /dev/null
+++ b/release/scripts/modules/bpy_extras/node_shader_utils.py
@@ -0,0 +1,774 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy
+from mathutils import Color, Vector
+
+__all__ = (
+ "PrincipledBSDFWrapper",
+)
+
+
+def _set_check(func):
+ from functools import wraps
+
+ @wraps(func)
+ def wrapper(self, *args, **kwargs):
+ if self.is_readonly:
+ assert(not "Trying to set value to read-only shader!")
+ return
+ return func(self, *args, **kwargs)
+ return wrapper
+
+def rgb_to_rgba(rgb):
+ return list(rgb) + [1.0]
+
+def rgba_to_rgb(rgba):
+ return Color((rgba[0], rgba[1], rgba[2]))
+
+
+class ShaderWrapper():
+ """
+ Base class with minimal common ground for all types of shader interfaces we may want/need to implement.
+ """
+
+ # The two mandatory nodes any children class should support.
+ NODES_LIST = (
+ "node_out",
+
+ "_node_texcoords",
+ )
+
+ __slots__ = (
+ "is_readonly",
+ "material",
+ "_textures",
+ "_grid_locations",
+ *NODES_LIST,
+ )
+
+ _col_size = 300
+ _row_size = 300
+
+ def _grid_to_location(self, x, y, dst_node=None, ref_node=None):
+ if ref_node is not None: # x and y are relative to this node location.
+ nx = round(ref_node.location.x / self._col_size)
+ ny = round(ref_node.location.y / self._row_size)
+ x += nx
+ y += ny
+ loc = None
+ while True:
+ loc = (x * self._col_size, y * self._row_size)
+ if loc not in self._grid_locations:
+ break
+ loc = (x * self._col_size, (y - 1) * self._row_size)
+ if loc not in self._grid_locations:
+ break
+ loc = (x * self._col_size, (y - 2) * self._row_size)
+ if loc not in self._grid_locations:
+ break
+ x -= 1
+ self._grid_locations.add(loc)
+ if dst_node is not None:
+ dst_node.location = loc
+ dst_node.width = min(dst_node.width, self._col_size - 20)
+ return loc
+
+ def __init__(self, material, is_readonly=True, use_nodes=True):
+ self.is_readonly = is_readonly
+ self.material = material
+ if not is_readonly:
+ self.use_nodes = use_nodes
+ self.update()
+
+ def update(self): # Should be re-implemented by children classes...
+ for node in self.NODES_LIST:
+ setattr(self, node, None)
+ self._textures = {}
+ self._grid_locations = set()
+
+
+ def use_nodes_get(self):
+ return self.material.use_nodes
+
+ @_set_check
+ def use_nodes_set(self, val):
+ self.material.use_nodes = val
+ self.update()
+
+ use_nodes = property(use_nodes_get, use_nodes_set)
+
+
+ def node_texcoords_get(self):
+ if not self.use_nodes:
+ return None
+ if self._node_texcoords is ...:
+ # Running only once, trying to find a valid texcoords node.
+ for n in self.material.node_tree.nodes:
+ if n.bl_idname == 'ShaderNodeTexCoord':
+ self._node_texcoords = n
+ self._grid_to_location(0, 0, ref_node=n)
+ break
+ if self._node_texcoords is ...:
+ self._node_texcoords = None
+ if self._node_texcoords is None and not self.is_readonly:
+ tree = self.material.node_tree
+ nodes = tree.nodes
+ links = tree.links
+
+ node_texcoords = nodes.new(type='ShaderNodeTexCoord')
+ node_texcoords.label = "Texture Coords"
+ self._grid_to_location(-5, 1, dst_node=node_texcoords)
+ self._node_texcoords = node_texcoords
+ return self._node_texcoords
+
+ node_texcoords = property(node_texcoords_get)
+
+
+class PrincipledBSDFWrapper(ShaderWrapper):
+ """
+ Hard coded shader setup, based in Principled BSDF.
+ Should cover most common cases on import, and gives a basic nodal shaders support for export.
+ Supports basic: diffuse/spec/reflect/transparency/normal, with texturing.
+ """
+ NODES_LIST = (
+ "node_out",
+ "node_principled_bsdf",
+
+ "_node_normalmap",
+ "_node_texcoords",
+ )
+
+ __slots__ = (
+ "is_readonly",
+ "material",
+ *NODES_LIST,
+ )
+
+ NODES_LIST = ShaderWrapper.NODES_LIST + NODES_LIST
+
+ def __init__(self, material, is_readonly=True, use_nodes=True):
+ super(PrincipledBSDFWrapper, self).__init__(material, is_readonly, use_nodes)
+
+
+ def update(self):
+ super(PrincipledBSDFWrapper, self).update()
+
+ if not self.use_nodes:
+ return
+
+ tree = self.material.node_tree
+
+ nodes = tree.nodes
+ links = tree.links
+
+ # --------------------------------------------------------------------
+ # Main output and shader.
+ node_out = None
+ node_principled = None
+ for n in nodes:
+ if n.bl_idname == 'ShaderNodeOutputMaterial' and n.inputs[0].is_linked:
+ node_out = n
+ node_principled = n.inputs[0].links[0].from_node
+ elif n.bl_idname == 'ShaderNodeBsdfPrincipled' and n.outputs[0].is_linked:
+ node_principled = n
+ for lnk in n.outputs[0].links:
+ node_out = lnk.to_node
+ if node_out.bl_idname == 'ShaderNodeOutputMaterial':
+ break
+ if (
+ node_out is not None and node_principled is not None and
+ node_out.bl_idname == 'ShaderNodeOutputMaterial' and
+ node_principled.bl_idname == 'ShaderNodeBsdfPrincipled'
+ ):
+ break
+ node_out = node_principled = None # Could not find a valid pair, let's try again
+
+ if node_out is not None:
+ self._grid_to_location(0, 0, ref_node=node_out)
+ elif not self.is_readonly:
+ node_out = nodes.new(type='ShaderNodeOutputMaterial')
+ node_out.label = "Material Out"
+ node_out.target = 'ALL'
+ self._grid_to_location(1, 1, dst_node=node_out)
+ self.node_out = node_out
+
+ if node_principled is not None:
+ self._grid_to_location(0, 0, ref_node=node_principled)
+ elif not self.is_readonly:
+ node_principled = nodes.new(type='ShaderNodeBsdfPrincipled')
+ node_principled.label = "Principled BSDF"
+ self._grid_to_location(0, 1, dst_node=node_principled)
+ # Link
+ links.new(node_principled.outputs["BSDF"], self.node_out.inputs["Surface"])
+ self.node_principled_bsdf = node_principled
+
+ # --------------------------------------------------------------------
+ # Normal Map, lazy initialization...
+ self._node_normalmap = ...
+
+ # --------------------------------------------------------------------
+ # Tex Coords, lazy initialization...
+ self._node_texcoords = ...
+
+
+ def node_normalmap_get(self):
+ if not self.use_nodes or self.node_principled_bsdf is None:
+ return None
+ node_principled = self.node_principled_bsdf
+ if self._node_normalmap is ...:
+ # Running only once, trying to find a valid normalmap node.
+ if node_principled.inputs["Normal"].is_linked:
+ node_normalmap = node_principled.inputs["Normal"].links[0].from_node
+ if node_normalmap.bl_idname == 'ShaderNodeNormalMap':
+ self._node_normalmap = node_normalmap
+ self._grid_to_location(0, 0, ref_node=node_normalmap)
+ if self._node_normalmap is ...:
+ self._node_normalmap = None
+ if self._node_normalmap is None and not self.is_readonly:
+ tree = self.material.node_tree
+ nodes = tree.nodes
+ links = tree.links
+
+ node_normalmap = nodes.new(type='ShaderNodeNormalMap')
+ node_normalmap.label = "Normal/Map"
+ self._grid_to_location(-1, -2, dst_node=node_normalmap, ref_node=node_principled)
+ # Link
+ links.new(node_normalmap.outputs["Normal"], node_principled.inputs["Normal"])
+ return self._node_normalmap
+
+ node_normalmap = property(node_normalmap_get)
+
+
+ # --------------------------------------------------------------------
+ # Base Color.
+
+ def base_color_get(self):
+ if not self.use_nodes or self.node_principled_bsdf is None:
+ return self.material.diffuse_color
+ return rgba_to_rgb(self.node_principled_bsdf.inputs["Base Color"].default_value)
+
+ @_set_check
+ def base_color_set(self, color):
+ self.material.diffuse_color = color
+ if self.use_nodes and self.node_principled_bsdf is not None:
+ self.node_principled_bsdf.inputs["Base Color"].default_value = rgb_to_rgba(color)
+
+ base_color = property(base_color_get, base_color_set)
+
+
+ def base_color_texture_get(self):
+ if not self.use_nodes or self.node_principled_bsdf is None:
+ return None
+ return ShaderImageTextureWrapper(
+ self, self.node_principled_bsdf,
+ self.node_principled_bsdf.inputs["Base Color"],
+ grid_row_diff=1,
+ )
+
+ base_color_texture = property(base_color_texture_get)
+
+
+ # --------------------------------------------------------------------
+ # Specular.
+
+ def specular_get(self):
+ if not self.use_nodes or self.node_principled_bsdf is None:
+ return self.material.specular_intensity
+ return self.node_principled_bsdf.inputs["Specular"].default_value
+
+ @_set_check
+ def specular_set(self, value):
+ self.material.specular_intensity = value
+ if self.use_nodes and self.node_principled_bsdf is not None:
+ self.node_principled_bsdf.inputs["Specular"].default_value = value
+
+ specular = property(specular_get, specular_set)
+
+
+ def specular_tint_get(self):
+ if not self.use_nodes or self.node_principled_bsdf is None:
+ return 0.0
+ return rgba_to_rgb(self.node_principled_bsdf.inputs["Specular Tint"].default_value)
+
+ @_set_check
+ def specular_tint_set(self, value):
+ if self.use_nodes and self.node_principled_bsdf is not None:
+ self.node_principled_bsdf.inputs["Specular Tint"].default_value = rgb_to_rgba(value)
+
+ specular_tint = property(specular_tint_get, specular_tint_set)
+
+
+ # Will only be used as gray-scale one...
+ def specular_texture_get(self):
+ if not self.use_nodes or self.node_principled_bsdf is None:
+ print("NO NODES!")
+ return None
+ return ShaderImageTextureWrapper(
+ self, self.node_principled_bsdf,
+ self.node_principled_bsdf.inputs["Specular"],
+ grid_row_diff=0,
+ )
+
+ specular_texture = property(specular_texture_get)
+
+
+ # --------------------------------------------------------------------
+ # Roughness (also sort of inverse of specular hardness...).
+
+ def roughness_get(self):
+ if not self.use_nodes or self.node_principled_bsdf is None:
+ return self.material.roughness
+ return self.node_principled_bsdf.inputs["Roughness"].default_value
+
+ @_set_check
+ def roughness_set(self, value):
+ self.material.roughness = value
+ if self.use_nodes and self.node_principled_bsdf is not None:
+ self.node_principled_bsdf.inputs["Roughness"].default_value = value
+
+ roughness = property(roughness_get, roughness_set)
+
+
+ # Will only be used as gray-scale one...
+ def roughness_texture_get(self):
+ if not self.use_nodes or self.node_principled_bsdf is None:
+ return None
+ return ShaderImageTextureWrapper(
+ self, self.node_principled_bsdf,
+ self.node_principled_bsdf.inputs["Roughness"],
+ grid_row_diff=0,
+ )
+
+ roughness_texture = property(roughness_texture_get)
+
+
+ # --------------------------------------------------------------------
+ # Metallic (a.k.a reflection, mirror).
+
+ def metallic_get(self):
+ if not self.use_nodes or self.node_principled_bsdf is None:
+ return self.material.metallic
+ return self.node_principled_bsdf.inputs["Metallic"].default_value
+
+ @_set_check
+ def metallic_set(self, value):
+ self.material.metallic = value
+ if self.use_nodes and self.node_principled_bsdf is not None:
+ self.node_principled_bsdf.inputs["Metallic"].default_value = value
+
+ metallic = property(metallic_get, metallic_set)
+
+
+ # Will only be used as gray-scale one...
+ def metallic_texture_get(self):
+ if not self.use_nodes or self.node_principled_bsdf is None:
+ return None
+ return ShaderImageTextureWrapper(
+ self, self.node_principled_bsdf,
+ self.node_principled_bsdf.inputs["Metallic"],
+ grid_row_diff=0,
+ )
+
+ metallic_texture = property(metallic_texture_get)
+
+
+ # --------------------------------------------------------------------
+ # Transparency settings.
+
+ def ior_get(self):
+ if not self.use_nodes or self.node_principled_bsdf is None:
+ return 1.0
+ return self.node_principled_bsdf.inputs["IOR"].default_value
+
+ @_set_check
+ def ior_set(self, value):
+ if self.use_nodes and self.node_principled_bsdf is not None:
+ self.node_principled_bsdf.inputs["IOR"].default_value = value
+
+ ior = property(ior_get, ior_set)
+
+
+ # Will only be used as gray-scale one...
+ def ior_texture_get(self):
+ if not self.use_nodes or self.node_principled_bsdf is None:
+ return None
+ return ShaderImageTextureWrapper(
+ self, self.node_principled_bsdf,
+ self.node_principled_bsdf.inputs["IOR"],
+ grid_row_diff=-1,
+ )
+
+ ior_texture = property(ior_texture_get)
+
+
+ def transmission_get(self):
+ if not self.use_nodes or self.node_principled_bsdf is None:
+ return 0.0
+ return self.node_principled_bsdf.inputs["Transmission"].default_value
+
+ @_set_check
+ def transmission_set(self, value):
+ if self.use_nodes and self.node_principled_bsdf is not None:
+ self.node_principled_bsdf.inputs["Transmission"].default_value = value
+
+ transmission = property(transmission_get, transmission_set)
+
+
+ # Will only be used as gray-scale one...
+ def transmission_texture_get(self):
+ if not self.use_nodes or self.node_principled_bsdf is None:
+ return None
+ return ShaderImageTextureWrapper(
+ self, self.node_principled_bsdf,
+ self.node_principled_bsdf.inputs["Transmission"],
+ grid_row_diff=-1,
+ )
+
+ transmission_texture = property(transmission_texture_get)
+
+
+ # TODO: Do we need more complex handling for alpha (allowing masking and such)?
+ # Would need extra mixing nodes onto Base Color maybe, or even its own shading chain...
+
+ # --------------------------------------------------------------------
+ # Normal map.
+
+ def normalmap_strength_get(self):
+ if not self.use_nodes or self.node_normalmap is None:
+ return 0.0
+ return self.node_normalmap.inputs["Strength"].default_value
+
+ @_set_check
+ def normalmap_strength_set(self, value):
+ if self.use_nodes and self.node_normalmap is not None:
+ self.node_normalmap.inputs["Strength"].default_value = value
+
+ normalmap_strength = property(normalmap_strength_get, normalmap_strength_set)
+
+
+ def normalmap_texture_get(self):
+ if not self.use_nodes or self.node_normalmap is None:
+ return None
+ return ShaderImageTextureWrapper(
+ self, self.node_normalmap,
+ self.node_normalmap.inputs["Color"],
+ grid_row_diff=-2,
+ )
+
+ normalmap_texture = property(normalmap_texture_get)
+
+
+
+class ShaderImageTextureWrapper():
+ """
+ Generic 'image texture'-like wrapper, handling image node, some mapping (texture coordinates transformations),
+ and texture coordinates source.
+ """
+
+ # Note: this class assumes we are using nodes, otherwise it should never be used...
+
+ NODES_LIST = (
+ "node_dst",
+ "socket_dst",
+
+ "_node_image",
+ "_node_mapping",
+ )
+
+ __slots__ = (
+ "owner_shader",
+ "is_readonly",
+ "grid_row_diff",
+ "use_alpha",
+ *NODES_LIST,
+ )
+
+ def __new__(cls, owner_shader: ShaderWrapper, node_dst, socket_dst, *args, **kwargs):
+ instance = owner_shader._textures.get((node_dst, socket_dst), None)
+ if instance is not None:
+ return instance
+ instance = super(ShaderImageTextureWrapper, cls).__new__(cls)
+ owner_shader._textures[(node_dst, socket_dst)] = instance
+ return instance
+
+ def __init__(self, owner_shader: ShaderWrapper, node_dst, socket_dst, grid_row_diff=0, use_alpha=False):
+ self.owner_shader = owner_shader
+ self.is_readonly = owner_shader.is_readonly
+ self.node_dst = node_dst
+ self.socket_dst = socket_dst
+ self.grid_row_diff = grid_row_diff
+ self.use_alpha = use_alpha
+
+ self._node_image = ...
+ self._node_mapping = ...
+
+ tree = node_dst.id_data
+ nodes = tree.nodes
+ links = tree.links
+
+ if socket_dst.is_linked:
+ from_node = socket_dst.links[0].from_node
+ if from_node.bl_idname == 'ShaderNodeTexImage':
+ self._node_image = from_node
+
+ if self.node_image is not None:
+ socket_dst = self.node_image.inputs["Vector"]
+ if socket_dst.is_linked:
+ from_node = socket_dst.links[0].from_node
+ if from_node.bl_idname == 'ShaderNodeMapping':
+ self._node_mapping = from_node
+
+
+ def copy_from(self, tex):
+ # Avoid generating any node in source texture.
+ is_readonly_back = tex.is_readonly
+ tex.is_readonly = True
+
+ if tex.node_image is not None:
+ self.image = tex.image
+ self.projection = tex.projection
+ self.texcoords = tex.texcoords
+ self.copy_mapping_from(tex)
+
+ tex.is_readonly = is_readonly_back
+
+
+ def copy_mapping_from(self, tex):
+ # Avoid generating any node in source texture.
+ is_readonly_back = tex.is_readonly
+ tex.is_readonly = True
+
+ if tex.node_mapping is None: # Used to actually remove mapping node.
+ if self.has_mapping_node():
+ # We assume node_image can never be None in that case...
+ # Find potential existing link into image's Vector input.
+ socket_dst = socket_src = None
+ if self.node_mapping.inputs["Vector"].is_linked:
+ socket_dst = self.node_image.inputs["Vector"]
+ socket_src = self.node_mapping.inputs["Vector"].links[0].from_socket
+
+ tree = self.owner_shader.material.node_tree
+ tree.nodes.remove(self.node_mapping)
+ self._node_mapping = None
+
+ # If previously existing, re-link texcoords -> image
+ if socket_src is not None:
+ tree.links.new(socket_src, socket_dst)
+ elif self.node_mapping is not None:
+ self.translation = tex.translation
+ self.rotation = tex.rotation
+ self.scale = tex.scale
+ self.use_min = tex.use_min
+ self.use_max = tex.use_max
+ self.min = tex.min
+ self.max = tex.max
+
+ tex.is_readonly = is_readonly_back
+
+
+ # --------------------------------------------------------------------
+ # Image.
+
+ def node_image_get(self):
+ if self._node_image is ...:
+ # Running only once, trying to find a valid image node.
+ if self.socket_dst.is_linked:
+ node_image = self.socket_dst.links[0].from_node
+ if node_image.bl_idname == 'ShaderNodeTexImage':
+ self._node_image = node_image
+ self.owner_shader._grid_to_location(0, 0, ref_node=node_image)
+ if self._node_image is ...:
+ self._node_image = None
+ if self._node_image is None and not self.is_readonly:
+ tree = self.owner_shader.material.node_tree
+
+ node_image = tree.nodes.new(type='ShaderNodeTexImage')
+ self.owner_shader._grid_to_location(-1, 0 + self.grid_row_diff, dst_node=node_image, ref_node=self.node_dst)
+
+ tree.links.new(node_image.outputs["Alpha" if self.use_alpha else "Color"], self.socket_dst)
+
+ self._node_image = node_image
+ return self._node_image
+
+ node_image = property(node_image_get)
+
+
+ def image_get(self):
+ return self.node_image.image if self.node_image is not None else None
+
+ @_set_check
+ def image_set(self, image):
+ self.node_image.image = image
+
+ image = property(image_get, image_set)
+
+
+ def projection_get(self):
+ return self.node_image.projection if self.node_image is not None else 'FLAT'
+
+ @_set_check
+ def projection_set(self, projection):
+ self.node_image.projection = projection
+
+ projection = property(projection_get, projection_set)
+
+
+ def texcoords_get(self):
+ if self.node_image is not None:
+ socket = (self.node_mapping if self.has_mapping_node() else self.node_image).inputs["Vector"]
+ if socket.is_linked:
+ return socket.links[0].from_socket.name
+ return 'UV'
+
+ @_set_check
+ def texcoords_set(self, texcoords):
+ # Image texture node already defaults to UVs, no extra node needed.
+ # ONLY in case we do not have any texcoords mapping!!!
+ if texcoords == 'UV' and not self.has_mapping_node():
+ return
+ tree = self.node_image.id_data
+ links = tree.links
+ node_dst = self.node_mapping if self.has_mapping_node() else self.node_image
+ socket_src = self.owner_shader.node_texcoords.outputs[texcoords]
+ links.new(socket_src, node_dst.inputs["Vector"])
+
+ texcoords = property(texcoords_get, texcoords_set)
+
+
+ def extension_get(self):
+ return self.node_image.extension if self.node_image is not None else 'REPEAT'
+
+ @_set_check
+ def extension_set(self, extension):
+ self.node_image.extension = extension
+
+ extension = property(extension_get, extension_set)
+
+
+ # --------------------------------------------------------------------
+ # Mapping.
+
+ def has_mapping_node(self):
+ return self._node_mapping not in {None, ...}
+
+ def node_mapping_get(self):
+ if self._node_mapping is ...:
+ # Running only once, trying to find a valid mapping node.
+ if self.node_image is None:
+ return None
+ if self.node_image.inputs["Vector"].is_linked:
+ node_mapping = self.node_image.inputs["Vector"].links[0].from_node
+ if node_mapping.bl_idname == 'ShaderNodeMapping':
+ self._node_mapping = node_mapping
+ self.owner_shader._grid_to_location(0, 0 + self.grid_row_diff, ref_node=node_mapping)
+ if self._node_mapping is ...:
+ self._node_mapping = None
+ if self._node_mapping is None and not self.is_readonly:
+ # Find potential existing link into image's Vector input.
+ socket_dst = self.node_image.inputs["Vector"]
+ # If not already existing, we need to create texcoords -> mapping link (from UV).
+ socket_src = (socket_dst.links[0].from_socket if socket_dst.is_linked
+ else self.owner_shader.node_texcoords.outputs['UV'])
+
+ tree = self.owner_shader.material.node_tree
+ node_mapping = tree.nodes.new(type='ShaderNodeMapping')
+ node_mapping.vector_type = 'TEXTURE'
+ self.owner_shader._grid_to_location(-1, 0, dst_node=node_mapping, ref_node=self.node_image)
+
+ # Link mapping -> image node.
+ tree.links.new(node_mapping.outputs["Vector"], socket_dst)
+ # Link texcoords -> mapping.
+ tree.links.new(socket_src, node_mapping.inputs["Vector"])
+
+ self._node_mapping = node_mapping
+ return self._node_mapping
+
+ node_mapping = property(node_mapping_get)
+
+
+ def translation_get(self):
+ return self.node_mapping.translation if self.node_mapping is not None else Vector((0.0, 0.0, 0.0))
+
+ @_set_check
+ def translation_set(self, translation):
+ self.node_mapping.translation = translation
+
+ translation = property(translation_get, translation_set)
+
+
+ def rotation_get(self):
+ return self.node_mapping.rotation if self.node_mapping is not None else Vector((0.0, 0.0, 0.0))
+
+ @_set_check
+ def rotation_set(self, rotation):
+ self.node_mapping.rotation = rotation
+
+ rotation = property(rotation_get, rotation_set)
+
+
+ def scale_get(self):
+ return self.node_mapping.scale if self.node_mapping is not None else Vector((1.0, 1.0, 1.0))
+
+ @_set_check
+ def scale_set(self, scale):
+ self.node_mapping.scale = scale
+
+ scale = property(scale_get, scale_set)
+
+
+ def use_min_get(self):
+ return self.node_mapping.use_min if self_mapping.node is not None else False
+
+ @_set_check
+ def use_min_set(self, use_min):
+ self.node_mapping.use_min = use_min
+
+ use_min = property(use_min_get, use_min_set)
+
+
+ def use_max_get(self):
+ return self.node_mapping.use_max if self_mapping.node is not None else False
+
+ @_set_check
+ def use_max_set(self, use_max):
+ self.node_mapping.use_max = use_max
+
+ use_max = property(use_max_get, use_max_set)
+
+
+ def min_get(self):
+ return self.node_mapping.min if self.node_mapping is not None else Vector((0.0, 0.0, 0.0))
+
+ @_set_check
+ def min_set(self, min):
+ self.node_mapping.min = min
+
+ min = property(min_get, min_set)
+
+
+ def max_get(self):
+ return self.node_mapping.max if self.node_mapping is not None else Vector((0.0, 0.0, 0.0))
+
+ @_set_check
+ def max_set(self, max):
+ self.node_mapping.max = max
+
+ max = property(max_get, max_set)
diff --git a/release/scripts/modules/bpy_extras/object_utils.py b/release/scripts/modules/bpy_extras/object_utils.py
index c9ea684862d..4fa090b7336 100644
--- a/release/scripts/modules/bpy_extras/object_utils.py
+++ b/release/scripts/modules/bpy_extras/object_utils.py
@@ -121,17 +121,11 @@ def object_data_add(context, obdata, operator=None, name=None):
"""
scene = context.scene
layer = context.view_layer
- layer_collection = context.layer_collection
+ layer_collection = context.layer_collection or layer.active_layer_collection
+ scene_collection = layer_collection.collection
for ob in layer.objects:
- ob.select_set(action='DESELECT')
-
- if not layer_collection:
- # when there is no collection linked to this view_layer create one
- scene_collection = scene.master_collection.collections.new("")
- layer_collection = layer.collections.link(scene_collection)
- else:
- scene_collection = layer_collection.collection
+ ob.select_set(False)
if name is None:
name = "Object" if obdata is None else obdata.name
@@ -139,7 +133,7 @@ def object_data_add(context, obdata, operator=None, name=None):
obj_act = layer.objects.active
obj_new = bpy.data.objects.new(name, obdata)
scene_collection.objects.link(obj_new)
- obj_new.select_set(action='SELECT')
+ obj_new.select_set(True)
obj_new.matrix_world = add_object_align_init(context, operator)
# XXX
@@ -161,10 +155,10 @@ def object_data_add(context, obdata, operator=None, name=None):
if obj_act and obj_act.mode == 'EDIT' and obj_act.type == obj_new.type:
bpy.ops.mesh.select_all(action='DESELECT')
- obj_act.select_set(action='SELECT')
+ obj_act.select_set(True)
bpy.ops.object.mode_set(mode='OBJECT')
- obj_act.select_set(action='SELECT')
+ obj_act.select_set(True)
scene.update() # apply location
# layer.objects.active = obj_new
@@ -308,7 +302,7 @@ def world_to_camera_view(scene, obj, coord):
"""
from mathutils import Vector
- co_local = obj.matrix_world.normalized().inverted() * coord
+ co_local = obj.matrix_world.normalized().inverted() @ coord
z = -co_local.z
camera = obj.data
diff --git a/release/scripts/modules/progress_report.py b/release/scripts/modules/bpy_extras/wm_utils/progress_report.py
index bcce44aab9f..bcce44aab9f 100644
--- a/release/scripts/modules/progress_report.py
+++ b/release/scripts/modules/bpy_extras/wm_utils/progress_report.py
diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py
index fd5dd884b44..dda1ab7b4ed 100644
--- a/release/scripts/modules/bpy_types.py
+++ b/release/scripts/modules/bpy_types.py
@@ -112,21 +112,21 @@ class Object(bpy_types.ID):
@property
def children(self):
- """All the children of this object"""
+ """All the children of this object. Warning: takes O(len(bpy.data.objects)) time."""
import bpy
return tuple(child for child in bpy.data.objects
if child.parent == self)
@property
def users_collection(self):
- """The collections this object is in"""
+ """The collections this object is in. Warning: takes O(len(bpy.data.collections)) time."""
import bpy
return tuple(collection for collection in bpy.data.collections
if self in collection.objects[:])
@property
def users_scene(self):
- """The scenes this object is in"""
+ """The scenes this object is in. Warning: takes O(len(bpy.data.scenes) * len(bpy.data.objects)) time."""
import bpy
return tuple(scene for scene in bpy.data.scenes
if self in scene.objects[:])
@@ -137,7 +137,7 @@ class WindowManager(bpy_types.ID):
def popup_menu(self, draw_func, title="", icon='NONE'):
import bpy
- popup = self.popmenu_begin__internal(title, icon)
+ popup = self.popmenu_begin__internal(title, icon=icon)
try:
draw_func(popup, bpy.context)
@@ -268,12 +268,12 @@ class _GenericBone:
@property
def children(self):
- """A list of all the bones children."""
+ """A list of all the bones children. Warning: takes O(len(bones)) time."""
return [child for child in self._other_bones if child.parent == self]
@property
def children_recursive(self):
- """A list of all children from this bone."""
+ """A list of all children from this bone. Warning: takes O(len(bones)**2) time."""
bones_children = []
for bone in self._other_bones:
index = bone.parent_index(self)
@@ -290,7 +290,7 @@ class _GenericBone:
Returns a chain of children with the same base name as this bone.
Only direct chains are supported, forks caused by multiple children
with matching base names will terminate the function
- and not be returned.
+ and not be returned. Warning: takes O(len(bones)**2) time.
"""
basename = self.basename
chain = []
@@ -454,6 +454,8 @@ class Mesh(bpy_types.ID):
# if no edges - calculate them
if faces and (not edges):
self.update(calc_edges=True)
+ elif edges:
+ self.update(calc_edges_loose=True)
@property
def edge_keys(self):
@@ -468,7 +470,7 @@ class MeshEdge(StructRNA):
return ord_ind(*tuple(self.vertices))
-class MeshTessFace(StructRNA):
+class MeshLoopTriangle(StructRNA):
__slots__ = ()
@property
@@ -476,32 +478,18 @@ class MeshTessFace(StructRNA):
"""The midpoint of the face."""
face_verts = self.vertices[:]
mesh_verts = self.id_data.vertices
- if len(face_verts) == 3:
- return (mesh_verts[face_verts[0]].co +
- mesh_verts[face_verts[1]].co +
- mesh_verts[face_verts[2]].co
- ) / 3.0
- else:
- return (mesh_verts[face_verts[0]].co +
- mesh_verts[face_verts[1]].co +
- mesh_verts[face_verts[2]].co +
- mesh_verts[face_verts[3]].co
- ) / 4.0
+ return (mesh_verts[face_verts[0]].co +
+ mesh_verts[face_verts[1]].co +
+ mesh_verts[face_verts[2]].co
+ ) / 3.0
@property
def edge_keys(self):
verts = self.vertices[:]
- if len(verts) == 3:
- return (ord_ind(verts[0], verts[1]),
- ord_ind(verts[1], verts[2]),
- ord_ind(verts[2], verts[0]),
- )
- else:
- return (ord_ind(verts[0], verts[1]),
- ord_ind(verts[1], verts[2]),
- ord_ind(verts[2], verts[3]),
- ord_ind(verts[3], verts[0]),
- )
+ return (ord_ind(verts[0], verts[1]),
+ ord_ind(verts[1], verts[2]),
+ ord_ind(verts[2], verts[0]),
+ )
class MeshPolygon(StructRNA):
@@ -606,10 +594,8 @@ class Gizmo(StructRNA):
if matrix is None:
matrix = self.matrix_world
- batch, dims = shape
-
- # XXX, can we avoid setting the shader every time?
- batch.program_set_builtin('3D_UNIFORM_COLOR' if dims == 3 else '2D_UNIFORM_COLOR')
+ batch, shader = shape
+ shader.bind()
if select_id is not None:
gpu.select.load_id(select_id)
@@ -618,7 +604,7 @@ class Gizmo(StructRNA):
color = (*self.color_highlight, self.alpha_highlight)
else:
color = (*self.color, self.alpha)
- batch.uniform_f32("color", *color)
+ shader.uniform_float("color", color)
with gpu.matrix.push_pop():
gpu.matrix.multiply_matrix(matrix)
@@ -638,7 +624,8 @@ class Gizmo(StructRNA):
:return: The newly created shape.
:rtype: Undefined (it may change).
"""
- from _gpu.types import (
+ import gpu
+ from gpu.types import (
GPUBatch,
GPUVertBuf,
GPUVertFormat,
@@ -649,9 +636,11 @@ class Gizmo(StructRNA):
fmt = GPUVertFormat()
pos_id = fmt.attr_add(id="pos", comp_type='F32', len=dims, fetch_mode='FLOAT')
vbo = GPUVertBuf(len=len(verts), format=fmt)
- vbo.fill(id=pos_id, data=verts)
+ vbo.attr_fill(id=pos_id, data=verts)
batch = GPUBatch(type=type, buf=vbo)
- return (batch, dims)
+ shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR' if dims == 3 else '2D_UNIFORM_COLOR')
+ batch.program_set(shader)
+ return (batch, shader)
# Only defined so operators members can be used by accessing self.order
@@ -887,7 +876,7 @@ class Menu(StructRNA, _GenericUI, metaclass=RNAMeta):
props.menu_idname = self.bl_idname
if add_operator:
- props = row.operator(add_operator, text="", icon='ZOOMOUT')
+ props = row.operator(add_operator, text="", icon='REMOVE')
props.name = name
props.remove_name = True
@@ -901,7 +890,7 @@ class Menu(StructRNA, _GenericUI, metaclass=RNAMeta):
sub.emboss = 'NORMAL'
sub.prop(wm, "preset_name", text="")
- props = row.operator(add_operator, text="", icon='ZOOMIN')
+ props = row.operator(add_operator, text="", icon='ADD')
props.name = wm.preset_name
def draw_preset(self, context):
@@ -957,7 +946,7 @@ class NodeSocket(StructRNA, metaclass=RNAMetaPropGroup):
@property
def links(self):
- """List of node links from or to this socket"""
+ """List of node links from or to this socket. Warning: takes O(len(nodetree.links)) time."""
return tuple(link for link in self.id_data.links
if (link.from_socket == self or
link.to_socket == self))
diff --git a/release/scripts/modules/console/complete_import.py b/release/scripts/modules/console/complete_import.py
index b9b7c6cb779..ff3099d7285 100644
--- a/release/scripts/modules/console/complete_import.py
+++ b/release/scripts/modules/console/complete_import.py
@@ -37,7 +37,7 @@ changes have been made:
- limit list of modules to prefix in case of "from w"
- sorted modules
- added sphinx documentation
-- complete() returns a blank list of the module isnt found
+- complete() returns a blank list of the module isn't found
"""
diff --git a/release/scripts/modules/console/complete_namespace.py b/release/scripts/modules/console/complete_namespace.py
index 3f223ba93dc..862f1a21260 100644
--- a/release/scripts/modules/console/complete_namespace.py
+++ b/release/scripts/modules/console/complete_namespace.py
@@ -26,7 +26,7 @@ import re
import rlcompleter
-RE_INCOMPLETE_INDEX = re.compile('(.*?)\[[^\]]+$')
+RE_INCOMPLETE_INDEX = re.compile(r'(.*?)\[[^\]]+$')
TEMP = '__tEmP__' # only \w characters are allowed!
TEMP_N = len(TEMP)
diff --git a/release/scripts/modules/console_python.py b/release/scripts/modules/console_python.py
index 68ff1ed60a7..f264de5b140 100644
--- a/release/scripts/modules/console_python.py
+++ b/release/scripts/modules/console_python.py
@@ -68,7 +68,7 @@ def get_console(console_id):
# check if clearing the namespace is needed to avoid a memory leak.
# the window manager is normally loaded with new blend files
# so this is a reasonable way to deal with namespace clearing.
- # bpy.data hashing is reset by undo so cant be used.
+ # bpy.data hashing is reset by undo so can't be used.
hash_prev = getattr(get_console, "consoles_namespace_hash", 0)
if hash_prev != hash_next:
diff --git a/extern/libopenjpeg/CMakeLists.txt b/release/scripts/modules/gpu_extras/__init__.py
index ad49eee25b6..7448113e2fa 100644
--- a/extern/libopenjpeg/CMakeLists.txt
+++ b/release/scripts/modules/gpu_extras/__init__.py
@@ -14,76 +14,9 @@
# 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) 2006, Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): Jacques Beaurain.
-#
# ***** END GPL LICENSE BLOCK *****
-set(INC
- .
-)
-
-set(INC_SYS
-
+__all__ = (
+ "batch",
+ "presets",
)
-
-add_definitions(${OPENJPEG_DEFINES})
-
-set(SRC
- bio.c
- cio.c
- dwt.c
- event.c
- image.c
- j2k.c
- j2k_lib.c
- jp2.c
- jpt.c
- mct.c
- mqc.c
- openjpeg.c
- pi.c
- raw.c
- t1.c
- t2.c
- tcd.c
- tgt.c
- cidx_manager.c
- phix_manager.c
- ppix_manager.c
- thix_manager.c
- tpix_manager.c
-
- bio.h
- cio.h
- dwt.h
- event.h
- fix.h
- image.h
- int.h
- j2k.h
- j2k_lib.h
- jp2.h
- jpt.h
- mct.h
- mqc.h
- openjpeg.h
- opj_includes.h
- opj_malloc.h
- pi.h
- raw.h
- t1.h
- t1_luts.h
- t2.h
- tcd.h
- tgt.h
- cidx_manager.h
- indexbox_manager.h
- opj_config.h
-)
-
-blender_add_lib(extern_openjpeg "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/release/scripts/modules/gpu_extras/batch.py b/release/scripts/modules/gpu_extras/batch.py
new file mode 100644
index 00000000000..2a1a4dc723c
--- /dev/null
+++ b/release/scripts/modules/gpu_extras/batch.py
@@ -0,0 +1,62 @@
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ***** END GPL LICENSE BLOCK *****
+
+__all__ = (
+ "batch_for_shader",
+)
+
+
+def batch_for_shader(shader, type, content, indices=None):
+ """
+ Return a batch already configured and compatible with the shader.
+
+ :arg shader: shader for which a compatible format will be computed.
+ :type shader: :class:`gpu.types.GPUShader`
+ :arg type: "'POINTS', 'LINES', 'TRIS' or 'LINES_ADJ'".
+ :type type: str
+ :arg content: Maps the name of the shader attribute with the data to fill the vertex buffer.
+ :type content: dict
+ :return: compatible batch
+ :rtype: :class:`gpu.types.Batch`
+ """
+ import gpu
+ from gpu.types import (
+ GPUBatch,
+ GPUIndexBuf,
+ GPUVertBuf,
+ )
+
+ for data in content.values():
+ vbo_len = len(data)
+ break
+ else:
+ raise ValueError("Empty 'content'")
+
+ vbo_format = shader.format_calc()
+ vbo = GPUVertBuf(vbo_format, vbo_len)
+
+ for id, data in content.items():
+ if len(data) != vbo_len:
+ raise ValueError("Length mismatch for 'content' values")
+ vbo.attr_fill(id, data)
+
+ if indices is None:
+ return GPUBatch(type=type, buf=vbo)
+ else:
+ ibo = GPUIndexBuf(type=type, seq=indices)
+ return GPUBatch(type=type, buf=vbo, elem=ibo)
diff --git a/release/scripts/modules/gpu_extras/presets.py b/release/scripts/modules/gpu_extras/presets.py
new file mode 100644
index 00000000000..0365812d022
--- /dev/null
+++ b/release/scripts/modules/gpu_extras/presets.py
@@ -0,0 +1,44 @@
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ***** END GPL LICENSE BLOCK *****
+
+def draw_circle_2d(position, color, radius, segments=32):
+ from math import sin, cos, pi
+ import gpu
+ from gpu.types import (
+ GPUBatch,
+ GPUVertBuf,
+ GPUVertFormat,
+ )
+
+ if segments <= 0:
+ raise ValueError("Amount of segments must be greater than 0.")
+
+ with gpu.matrix.push_pop():
+ gpu.matrix.translate(position)
+ gpu.matrix.scale_uniform(radius)
+ mul = (1.0 / (segments - 1)) * (pi * 2)
+ verts = [(sin(i * mul), cos(i * mul)) for i in range(segments)]
+ fmt = GPUVertFormat()
+ pos_id = fmt.attr_add(id="pos", comp_type='F32', len=2, fetch_mode='FLOAT')
+ vbo = GPUVertBuf(len=len(verts), format=fmt)
+ vbo.attr_fill(id=pos_id, data=verts)
+ batch = GPUBatch(type='LINE_STRIP', buf=vbo)
+ shader = gpu.shader.from_builtin('2D_UNIFORM_COLOR')
+ batch.program_set(shader)
+ shader.uniform_float("color", color)
+ batch.draw()
diff --git a/release/scripts/modules/rna_info.py b/release/scripts/modules/rna_info.py
index 1a3d0698871..535f2cda626 100644
--- a/release/scripts/modules/rna_info.py
+++ b/release/scripts/modules/rna_info.py
@@ -83,7 +83,7 @@ def float_as_string(f):
def get_py_class_from_rna(rna_type):
- """ Get's the Python type for a class which isn't necessarily added to ``bpy.types``.
+ """ Gets the Python type for a class which isn't necessarily added to ``bpy.types``.
"""
identifier = rna_type.identifier
py_class = getattr(bpy.types, identifier, None)
@@ -731,14 +731,14 @@ def BuildRNAInfo():
operators = dir(op_mod)
for op in sorted(operators):
try:
- rna_prop = getattr(op_mod, op).get_rna()
+ rna_prop = getattr(op_mod, op).get_rna_type()
except AttributeError:
rna_prop = None
except TypeError:
rna_prop = None
if rna_prop:
- GetInfoOperatorRNA(rna_prop.bl_rna)
+ GetInfoOperatorRNA(rna_prop)
for rna_info in InfoOperatorRNA.global_lookup.values():
rna_info.build()
diff --git a/release/scripts/modules/rna_keymap_ui.py b/release/scripts/modules/rna_keymap_ui.py
index 776d2d81d98..752db7fd5ac 100644
--- a/release/scripts/modules/rna_keymap_ui.py
+++ b/release/scripts/modules/rna_keymap_ui.py
@@ -105,7 +105,7 @@ def draw_km(display_keymaps, kc, km, children, layout, level):
subcol = _indented_layout(col, kmi_level)
subcol = subcol.split(factor=0.2).column()
subcol.operator("wm.keyitem_add", text="Add New", text_ctxt=i18n_contexts.id_windowmanager,
- icon='ZOOMIN')
+ icon='ADD')
col.separator()
@@ -350,13 +350,13 @@ def draw_filtered(display_keymaps, filter_type, filter_text, layout):
# "Add New" at end of keymap item list
col = _indented_layout(layout, 1)
subcol = col.split(factor=0.2).column()
- subcol.operator("wm.keyitem_add", text="Add New", icon='ZOOMIN')
+ subcol.operator("wm.keyitem_add", text="Add New", icon='ADD')
return True
def draw_hierarchy(display_keymaps, layout):
from bpy_extras import keyconfig_utils
- for entry in keyconfig_utils.KM_HIERARCHY:
+ for entry in keyconfig_utils.km_hierarchy():
draw_entry(display_keymaps, entry, layout)
@@ -380,8 +380,8 @@ def draw_keymaps(context, layout):
if not text:
text = "Blender (default)"
row.menu("USERPREF_MT_keyconfigs", text=text)
- row.operator("wm.keyconfig_preset_add", text="", icon='ZOOMIN')
- row.operator("wm.keyconfig_preset_add", text="", icon='ZOOMOUT').remove_active = True
+ row.operator("wm.keyconfig_preset_add", text="", icon='ADD')
+ row.operator("wm.keyconfig_preset_add", text="", icon='REMOVE').remove_active = True
# layout.context_pointer_set("keyconfig", wm.keyconfigs.active)
# row.operator("wm.keyconfig_remove", text="", icon='X')
diff --git a/release/scripts/modules/rna_prop_ui.py b/release/scripts/modules/rna_prop_ui.py
index c987609bafa..fc17cc60c6c 100644
--- a/release/scripts/modules/rna_prop_ui.py
+++ b/release/scripts/modules/rna_prop_ui.py
@@ -188,7 +188,7 @@ def draw(layout, context, context_member, property_type, use_edit=True):
if not is_rna:
props = row.operator("wm.properties_edit", text="Edit")
assign_props(props, val_draw, key)
- props = row.operator("wm.properties_remove", text="", icon='ZOOMOUT')
+ props = row.operator("wm.properties_remove", text="", icon='REMOVE')
assign_props(props, val_draw, key)
else:
row.label(text="API Defined")
diff --git a/release/scripts/modules/rna_xml.py b/release/scripts/modules/rna_xml.py
index e8705834df3..a4610c65a43 100644
--- a/release/scripts/modules/rna_xml.py
+++ b/release/scripts/modules/rna_xml.py
@@ -32,7 +32,7 @@ def build_property_typemap(skip_classes, skip_typemap):
if issubclass(cls, skip_classes):
continue
- # # to support skip-save we cant get all props
+ # # to support skip-save we can't get all props
# properties = cls.bl_rna.properties.keys()
properties = []
for prop_id, prop in cls.bl_rna.properties.items():
@@ -149,7 +149,7 @@ def rna2xml(fw=print_ln,
subvalue_rna = value.path_resolve(prop, False)
if type(subvalue_rna).__name__ == "bpy_prop_array":
# check if this is a 0-1 color (rgb, rgba)
- # in that case write as a hexidecimal
+ # in that case write as a hexadecimal
prop_rna = value.bl_rna.properties[prop]
if (prop_rna.subtype == 'COLOR_GAMMA' and
prop_rna.hard_min == 0.0 and
@@ -274,7 +274,7 @@ def xml2rna(root_xml,
tp_name = 'STR'
elif hasattr(subvalue, "__len__"):
if value_xml.startswith("#"):
- # read hexidecimal value as float array
+ # read hexadecimal value as float array
value_xml_split = value_xml[1:]
value_xml_coerce = [int(value_xml_split[i:i + 2], 16) /
255 for i in range(0, len(value_xml_split), 2)]
diff --git a/release/scripts/presets/gpencil_material/fill_only.py b/release/scripts/presets/gpencil_material/fill_only.py
index 00cf8663f41..b15f5f28f80 100644
--- a/release/scripts/presets/gpencil_material/fill_only.py
+++ b/release/scripts/presets/gpencil_material/fill_only.py
@@ -28,3 +28,5 @@ gpcolor.texture_opacity = 1.0
gpcolor.texture_clamp = False
gpcolor.texture_mix = False
gpcolor.mix_factor = 0.0
+gpcolor.show_stroke = False
+gpcolor.show_fill = True
diff --git a/release/scripts/presets/gpencil_material/stroke_and_fill.py b/release/scripts/presets/gpencil_material/stroke_and_fill.py
index 8c3aca4f829..b9a1e873ea2 100644
--- a/release/scripts/presets/gpencil_material/stroke_and_fill.py
+++ b/release/scripts/presets/gpencil_material/stroke_and_fill.py
@@ -28,3 +28,5 @@ gpcolor.texture_opacity = 1.0
gpcolor.texture_clamp = False
gpcolor.texture_mix = False
gpcolor.mix_factor = 0.0
+gpcolor.show_stroke = True
+gpcolor.show_fill = True
diff --git a/release/scripts/presets/gpencil_material/stroke_only.py b/release/scripts/presets/gpencil_material/stroke_only.py
index 04262593275..96739af59f0 100644
--- a/release/scripts/presets/gpencil_material/stroke_only.py
+++ b/release/scripts/presets/gpencil_material/stroke_only.py
@@ -28,3 +28,5 @@ gpcolor.texture_opacity = 1.0
gpcolor.texture_clamp = False
gpcolor.texture_mix = False
gpcolor.mix_factor = 0.0
+gpcolor.show_stroke = True
+gpcolor.show_fill = False
diff --git a/release/scripts/presets/interface_theme/blender_dark.xml b/release/scripts/presets/interface_theme/blender_dark.xml
new file mode 100644
index 00000000000..8bbb747447b
--- /dev/null
+++ b/release/scripts/presets/interface_theme/blender_dark.xml
@@ -0,0 +1,6 @@
+<bpy>
+ <Theme>
+ </Theme>
+ <ThemeStyle>
+ </ThemeStyle>
+</bpy>
diff --git a/release/scripts/presets/interface_theme/flatty_light.xml b/release/scripts/presets/interface_theme/blender_light.xml
index 497b6575731..497b6575731 100644
--- a/release/scripts/presets/interface_theme/flatty_light.xml
+++ b/release/scripts/presets/interface_theme/blender_light.xml
diff --git a/release/scripts/presets/keyconfig/3dsmax.py b/release/scripts/presets/keyconfig/3dsmax.py
index fa5d40b1868..3024a5638f2 100644
--- a/release/scripts/presets/keyconfig/3dsmax.py
+++ b/release/scripts/presets/keyconfig/3dsmax.py
@@ -124,7 +124,7 @@ kmi.properties.camera = True
kmi = km.keymap_items.new('marker.select', 'SELECTMOUSE', 'PRESS', shift=True, ctrl=True)
kmi.properties.extend = True
kmi.properties.camera = True
-kmi = km.keymap_items.new('marker.select_border', 'B', 'PRESS')
+kmi = km.keymap_items.new('marker.select_box', 'B', 'PRESS')
kmi = km.keymap_items.new('marker.select_all', 'A', 'PRESS', ctrl=True)
kmi = km.keymap_items.new('marker.delete', 'X', 'PRESS')
kmi = km.keymap_items.new('marker.rename', 'M', 'PRESS', ctrl=True)
@@ -147,7 +147,7 @@ kmi.properties.recursive = True
kmi = km.keymap_items.new('outliner.item_activate', 'LEFTMOUSE', 'CLICK', shift=True, ctrl=True)
kmi.properties.extend = True
kmi.properties.recursive = True
-kmi = km.keymap_items.new('outliner.select_border', 'B', 'PRESS')
+kmi = km.keymap_items.new('outliner.select_box', 'B', 'PRESS')
kmi = km.keymap_items.new('outliner.item_openclose', 'RET', 'PRESS')
kmi.properties.all = False
kmi = km.keymap_items.new('outliner.item_openclose', 'RET', 'PRESS', shift=True)
@@ -202,7 +202,7 @@ kmi = km.keymap_items.new('paint.vert_select_all', 'A', 'PRESS', ctrl=True)
kmi.properties.action = 'SELECT'
kmi = km.keymap_items.new('paint.vert_select_all', 'I', 'PRESS', ctrl=True)
kmi.properties.action = 'INVERT'
-kmi = km.keymap_items.new('view3d.select_border', 'B', 'PRESS')
+kmi = km.keymap_items.new('view3d.select_box', 'B', 'PRESS')
kmi = km.keymap_items.new('view3d.select_lasso', 'EVT_TWEAK_A', 'ANY', ctrl=True)
kmi.properties.deselect = False
kmi = km.keymap_items.new('view3d.select_lasso', 'EVT_TWEAK_A', 'ANY', shift=True, ctrl=True)
@@ -648,7 +648,7 @@ kmi.properties.toggle = True
kmi.properties.center = True
kmi.properties.enumerate = True
kmi.properties.object = False
-kmi = km.keymap_items.new('view3d.select_border', 'EVT_TWEAK_L', 'ANY')
+kmi = km.keymap_items.new('view3d.select_box', 'EVT_TWEAK_L', 'ANY')
kmi.properties.extend = False
kmi = km.keymap_items.new('view3d.select_lasso', 'EVT_TWEAK_A', 'ANY', ctrl=True)
kmi.properties.deselect = False
@@ -719,7 +719,7 @@ kmi = km.keymap_items.new('wm.context_toggle_enum', 'A', 'PRESS')
kmi.properties.data_path = 'tool_settings.snap_element'
kmi.properties.value_1 = 'VERTEX'
kmi.properties.value_2 = 'INCREMENT'
-kmi = km.keymap_items.new('view3d.select_border', 'EVT_TWEAK_L', 'ANY', ctrl=True)
+kmi = km.keymap_items.new('view3d.select_box', 'EVT_TWEAK_L', 'ANY', ctrl=True)
kmi = km.keymap_items.new('wm.context_toggle', 'G', 'PRESS')
kmi.properties.data_path = 'space_data.overlay.show_floor'
@@ -736,8 +736,8 @@ kmi = km.keymap_items.new('anim.channels_rename', 'LEFTMOUSE', 'PRESS', ctrl=Tru
kmi = km.keymap_items.new('anim.channels_select_all_toggle', 'A', 'PRESS', ctrl=True)
kmi = km.keymap_items.new('anim.channels_select_all_toggle', 'I', 'PRESS', ctrl=True)
kmi.properties.invert = True
-kmi = km.keymap_items.new('anim.channels_select_border', 'B', 'PRESS')
-kmi = km.keymap_items.new('anim.channels_select_border', 'EVT_TWEAK_L', 'ANY')
+kmi = km.keymap_items.new('anim.channels_select_box', 'B', 'PRESS')
+kmi = km.keymap_items.new('anim.channels_select_box', 'EVT_TWEAK_L', 'ANY')
kmi = km.keymap_items.new('anim.channels_delete', 'X', 'PRESS')
kmi = km.keymap_items.new('anim.channels_delete', 'DEL', 'PRESS')
kmi = km.keymap_items.new('anim.channels_setting_toggle', 'W', 'PRESS', shift=True)
@@ -776,9 +776,9 @@ kmi.properties.extend = False
kmi = km.keymap_items.new('uv.select_loop', 'SELECTMOUSE', 'PRESS', shift=True, alt=True)
kmi.properties.extend = True
kmi = km.keymap_items.new('uv.select_split', 'Y', 'PRESS')
-kmi = km.keymap_items.new('uv.select_border', 'B', 'PRESS')
+kmi = km.keymap_items.new('uv.select_box', 'B', 'PRESS')
kmi.properties.pinned = False
-kmi = km.keymap_items.new('uv.select_border', 'B', 'PRESS', shift=True)
+kmi = km.keymap_items.new('uv.select_box', 'B', 'PRESS', shift=True)
kmi.properties.pinned = True
kmi = km.keymap_items.new('uv.circle_select', 'C', 'PRESS')
kmi = km.keymap_items.new('uv.select_lasso', 'EVT_TWEAK_A', 'ANY', ctrl=True)
@@ -866,7 +866,7 @@ kmi = km.keymap_items.new('mask.select_linked_pick', 'L', 'PRESS')
kmi.properties.deselect = False
kmi = km.keymap_items.new('mask.select_linked_pick', 'L', 'PRESS', shift=True)
kmi.properties.deselect = True
-kmi = km.keymap_items.new('mask.select_border', 'B', 'PRESS')
+kmi = km.keymap_items.new('mask.select_box', 'B', 'PRESS')
kmi = km.keymap_items.new('mask.select_circle', 'C', 'PRESS')
kmi = km.keymap_items.new('mask.select_lasso', 'EVT_TWEAK_A', 'ANY', ctrl=True, alt=True)
kmi.properties.deselect = False
@@ -941,16 +941,16 @@ kmi = km.keymap_items.new('graph.select_all_toggle', 'A', 'PRESS', ctrl=True)
kmi.properties.invert = False
kmi = km.keymap_items.new('graph.select_all_toggle', 'I', 'PRESS', ctrl=True)
kmi.properties.invert = True
-kmi = km.keymap_items.new('graph.select_border', 'B', 'PRESS')
+kmi = km.keymap_items.new('graph.select_box', 'B', 'PRESS')
kmi.properties.axis_range = False
kmi.properties.include_handles = False
-kmi = km.keymap_items.new('graph.select_border', 'B', 'PRESS', alt=True)
+kmi = km.keymap_items.new('graph.select_box', 'B', 'PRESS', alt=True)
kmi.properties.axis_range = True
kmi.properties.include_handles = False
-kmi = km.keymap_items.new('graph.select_border', 'B', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('graph.select_box', 'B', 'PRESS', ctrl=True)
kmi.properties.axis_range = False
kmi.properties.include_handles = True
-kmi = km.keymap_items.new('graph.select_border', 'B', 'PRESS', ctrl=True, alt=True)
+kmi = km.keymap_items.new('graph.select_box', 'B', 'PRESS', ctrl=True, alt=True)
kmi.properties.axis_range = True
kmi.properties.include_handles = True
kmi = km.keymap_items.new('graph.select_column', 'K', 'PRESS')
@@ -1030,7 +1030,7 @@ kmi = km.keymap_items.new('node.select', 'ACTIONMOUSE', 'PRESS', shift=True, ctr
kmi.properties.extend = True
kmi = km.keymap_items.new('node.select', 'SELECTMOUSE', 'PRESS', shift=True, ctrl=True, alt=True)
kmi.properties.extend = True
-kmi = km.keymap_items.new('node.select_border', 'EVT_TWEAK_S', 'ANY')
+kmi = km.keymap_items.new('node.select_box', 'EVT_TWEAK_S', 'ANY')
kmi.properties.tweak = True
kmi = km.keymap_items.new('node.select_lasso', 'EVT_TWEAK_A', 'ANY', ctrl=True, alt=True)
kmi.properties.deselect = False
@@ -1066,7 +1066,7 @@ kmi = km.keymap_items.new('node.preview_toggle', 'H', 'PRESS', shift=True)
kmi = km.keymap_items.new('node.hide_socket_toggle', 'H', 'PRESS', ctrl=True)
kmi = km.keymap_items.new('node.view_all', 'HOME', 'PRESS')
kmi = km.keymap_items.new('node.view_selected', 'NUMPAD_PERIOD', 'PRESS')
-kmi = km.keymap_items.new('node.select_border', 'B', 'PRESS')
+kmi = km.keymap_items.new('node.select_box', 'B', 'PRESS')
kmi.properties.tweak = False
kmi = km.keymap_items.new('node.delete', 'X', 'PRESS')
kmi = km.keymap_items.new('node.delete', 'DEL', 'PRESS')
@@ -1125,7 +1125,7 @@ km = kc.keymaps.new('Info', space_type='INFO', region_type='WINDOW', modal=False
kmi = km.keymap_items.new('info.select_pick', 'SELECTMOUSE', 'PRESS')
kmi = km.keymap_items.new('info.select_all_toggle', 'A', 'PRESS', ctrl=True)
-kmi = km.keymap_items.new('info.select_border', 'B', 'PRESS')
+kmi = km.keymap_items.new('info.select_box', 'B', 'PRESS')
kmi = km.keymap_items.new('info.report_replay', 'R', 'PRESS')
kmi = km.keymap_items.new('info.report_delete', 'X', 'PRESS')
kmi = km.keymap_items.new('info.report_delete', 'DEL', 'PRESS')
@@ -1153,8 +1153,8 @@ kmi.properties.fill = True
kmi.properties.open = False
kmi = km.keymap_items.new('file.select_all_toggle', 'A', 'PRESS', ctrl=True)
kmi = km.keymap_items.new('file.refresh', 'NUMPAD_PERIOD', 'PRESS')
-kmi = km.keymap_items.new('file.select_border', 'B', 'PRESS')
-kmi = km.keymap_items.new('file.select_border', 'EVT_TWEAK_L', 'ANY')
+kmi = km.keymap_items.new('file.select_box', 'B', 'PRESS')
+kmi = km.keymap_items.new('file.select_box', 'EVT_TWEAK_L', 'ANY')
kmi = km.keymap_items.new('file.rename', 'LEFTMOUSE', 'PRESS', ctrl=True)
kmi = km.keymap_items.new('file.highlight', 'MOUSEMOVE', 'ANY', any=True)
kmi = km.keymap_items.new('file.filenum', 'NUMPAD_PLUS', 'PRESS')
@@ -1201,9 +1201,9 @@ kmi = km.keymap_items.new('action.select_all_toggle', 'A', 'PRESS', ctrl=True)
kmi.properties.invert = False
kmi = km.keymap_items.new('action.select_all_toggle', 'I', 'PRESS', ctrl=True)
kmi.properties.invert = True
-kmi = km.keymap_items.new('action.select_border', 'B', 'PRESS')
+kmi = km.keymap_items.new('action.select_box', 'B', 'PRESS')
kmi.properties.axis_range = False
-kmi = km.keymap_items.new('action.select_border', 'B', 'PRESS', alt=True)
+kmi = km.keymap_items.new('action.select_box', 'B', 'PRESS', alt=True)
kmi.properties.axis_range = True
kmi = km.keymap_items.new('action.select_column', 'K', 'PRESS')
kmi.properties.mode = 'KEYS'
@@ -1271,9 +1271,9 @@ kmi = km.keymap_items.new('nla.select_all_toggle', 'A', 'PRESS', ctrl=True)
kmi.properties.invert = False
kmi = km.keymap_items.new('nla.select_all_toggle', 'I', 'PRESS', ctrl=True)
kmi.properties.invert = True
-kmi = km.keymap_items.new('nla.select_border', 'B', 'PRESS')
+kmi = km.keymap_items.new('nla.select_box', 'B', 'PRESS')
kmi.properties.axis_range = False
-kmi = km.keymap_items.new('nla.select_border', 'B', 'PRESS', alt=True)
+kmi = km.keymap_items.new('nla.select_box', 'B', 'PRESS', alt=True)
kmi.properties.axis_range = True
kmi = km.keymap_items.new('nla.view_all', 'HOME', 'PRESS')
kmi = km.keymap_items.new('nla.view_selected', 'NUMPAD_PERIOD', 'PRESS')
@@ -1424,7 +1424,7 @@ kmi.properties.extend = False
kmi = km.keymap_items.new('sequencer.select_linked_pick', 'L', 'PRESS', shift=True)
kmi.properties.extend = True
kmi = km.keymap_items.new('sequencer.select_linked', 'L', 'PRESS', ctrl=True)
-kmi = km.keymap_items.new('sequencer.select_border', 'B', 'PRESS')
+kmi = km.keymap_items.new('sequencer.select_box', 'B', 'PRESS')
kmi = km.keymap_items.new('sequencer.select_grouped', 'G', 'PRESS', shift=True)
kmi = km.keymap_items.new('wm.call_menu', 'A', 'PRESS', shift=True)
kmi.properties.name = 'SEQUENCER_MT_add'
@@ -1496,7 +1496,7 @@ kmi = km.keymap_items.new('clip.select_all', 'A', 'PRESS', ctrl=True)
kmi.properties.action = 'TOGGLE'
kmi = km.keymap_items.new('clip.select_all', 'I', 'PRESS', ctrl=True)
kmi.properties.action = 'INVERT'
-kmi = km.keymap_items.new('clip.select_border', 'B', 'PRESS')
+kmi = km.keymap_items.new('clip.select_box', 'B', 'PRESS')
kmi = km.keymap_items.new('clip.select_circle', 'C', 'PRESS')
kmi = km.keymap_items.new('wm.call_menu', 'G', 'PRESS', shift=True)
kmi.properties.name = 'CLIP_MT_select_grouped'
@@ -1558,7 +1558,7 @@ kmi = km.keymap_items.new('clip.graph_select_all_markers', 'A', 'PRESS', ctrl=Tr
kmi.properties.action = 'TOGGLE'
kmi = km.keymap_items.new('clip.graph_select_all_markers', 'I', 'PRESS', ctrl=True)
kmi.properties.action = 'INVERT'
-kmi = km.keymap_items.new('clip.graph_select_border', 'B', 'PRESS')
+kmi = km.keymap_items.new('clip.graph_select_box', 'B', 'PRESS')
kmi = km.keymap_items.new('clip.graph_delete_curve', 'DEL', 'PRESS')
kmi = km.keymap_items.new('clip.graph_delete_curve', 'X', 'PRESS')
kmi = km.keymap_items.new('clip.graph_delete_knot', 'DEL', 'PRESS', shift=True)
@@ -2422,8 +2422,8 @@ kmi = km.keymap_items.new_modal('ADD', 'WHEELDOWNMOUSE', 'PRESS')
kmi = km.keymap_items.new_modal('ADD', 'NUMPAD_PLUS', 'PRESS')
kmi = km.keymap_items.new_modal('SIZE', 'TRACKPADPAN', 'ANY')
-# Map Gesture Border
-km = kc.keymaps.new('Gesture Border', space_type='EMPTY', region_type='WINDOW', modal=True)
+# Map Gesture Box
+km = kc.keymaps.new('Gesture Box', space_type='EMPTY', region_type='WINDOW', modal=True)
kmi = km.keymap_items.new_modal('CANCEL', 'ESC', 'PRESS', any=True)
kmi = km.keymap_items.new_modal('CANCEL', 'RIGHTMOUSE', 'PRESS', any=True)
diff --git a/release/scripts/presets/keyconfig/blender.py b/release/scripts/presets/keyconfig/blender.py
new file mode 100644
index 00000000000..66db91d9186
--- /dev/null
+++ b/release/scripts/presets/keyconfig/blender.py
@@ -0,0 +1,12 @@
+
+import os
+from bpy_extras.keyconfig_utils import (
+ keyconfig_import_from_data,
+ keyconfig_module_from_preset,
+)
+
+_mod = keyconfig_module_from_preset(os.path.join("keymap_data", "blender_default"), __file__)
+keyconfig_data = _mod.generate_keymaps()
+
+if __name__ == "__main__":
+ keyconfig_import_from_data("Blender", keyconfig_data)
diff --git a/release/scripts/presets/keyconfig/blender_27x.py b/release/scripts/presets/keyconfig/blender_27x.py
index cf736e1a5a5..2d9ea9d8f44 100644
--- a/release/scripts/presets/keyconfig/blender_27x.py
+++ b/release/scripts/presets/keyconfig/blender_27x.py
@@ -1,8645 +1,11 @@
-keyconfig_data = \
-[("Window",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("wm.window_new", {"type": 'W', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("wm.read_homefile", {"type": 'N', "value": 'PRESS', "ctrl": True}, None),
- ("wm.save_homefile", {"type": 'U', "value": 'PRESS', "ctrl": True}, None),
- ("wm.call_menu",
- {"type": 'O', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("name", 'TOPBAR_MT_file_open_recent'),
- ],
- },
- ),
- ("wm.open_mainfile", {"type": 'O', "value": 'PRESS', "ctrl": True}, None),
- ("wm.open_mainfile", {"type": 'F1', "value": 'PRESS'}, None),
- ("wm.link", {"type": 'O', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("wm.append", {"type": 'F1', "value": 'PRESS', "shift": True}, None),
- ("wm.save_mainfile", {"type": 'S', "value": 'PRESS', "ctrl": True}, None),
- ("wm.save_mainfile", {"type": 'W', "value": 'PRESS', "ctrl": True}, None),
- ("wm.save_as_mainfile", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("wm.save_as_mainfile", {"type": 'F2', "value": 'PRESS'}, None),
- ("wm.save_as_mainfile",
- {"type": 'S', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("copy", True),
- ],
- },
- ),
- ("wm.window_fullscreen_toggle", {"type": 'F11', "value": 'PRESS', "alt": True}, None),
- ("wm.quit_blender", {"type": 'Q', "value": 'PRESS', "ctrl": True}, None),
- ("wm.doc_view_manual_ui_context", {"type": 'F1', "value": 'PRESS', "alt": True}, None),
- ("wm.redraw_timer", {"type": 'T', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("wm.debug_menu", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("wm.call_menu",
- {"type": 'NDOF_BUTTON_MENU', "value": 'PRESS'},
- {"properties":
- [("name", 'USERPREF_MT_ndof_settings'),
- ],
- },
- ),
- ("wm.search_menu", {"type": 'SPACE', "value": 'PRESS'}, None),
- ("wm.context_set_enum",
- {"type": 'F3', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'area.type'),
- ("value", 'NODE_EDITOR'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'F4', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'area.type'),
- ("value", 'CONSOLE'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'F5', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'area.type'),
- ("value", 'VIEW_3D'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'F6', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'area.type'),
- ("value", 'GRAPH_EDITOR'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'F7', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'area.type'),
- ("value", 'PROPERTIES'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'F8', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'area.type'),
- ("value", 'SEQUENCE_EDITOR'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'F9', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'area.type'),
- ("value", 'OUTLINER'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'F10', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'area.type'),
- ("value", 'IMAGE_EDITOR'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'F11', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'area.type'),
- ("value", 'TEXT_EDITOR'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'F12', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'area.type'),
- ("value", 'DOPESHEET_EDITOR'),
- ],
- },
- ),
- ("wm.context_scale_float",
- {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS'},
- {"properties":
- [("data_path", 'user_preferences.inputs.ndof_sensitivity'),
- ("value", 1.1),
- ],
- },
- ),
- ("wm.context_scale_float",
- {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS'},
- {"properties":
- [("data_path", 'user_preferences.inputs.ndof_sensitivity'),
- ("value", 1.0),
- ],
- },
- ),
- ("wm.context_scale_float",
- {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'user_preferences.inputs.ndof_sensitivity'),
- ("value", 1.5),
- ],
- },
- ),
- ("wm.context_scale_float",
- {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'user_preferences.inputs.ndof_sensitivity'),
- ("value", 0.6666667),
- ],
- },
- ),
- ("info.reports_display_update", {"type": 'TIMER_REPORT', "value": 'ANY', "any": True}, None),
- ],
- },
- ),
- ("Screen",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("screen.animation_step", {"type": 'TIMER0', "value": 'ANY', "any": True}, None),
- ("screen.region_blend", {"type": 'TIMERREGION', "value": 'ANY', "any": True}, None),
- ("screen.screen_set",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("delta", 1),
- ],
- },
- ),
- ("screen.screen_set",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("delta", -1),
- ],
- },
- ),
- ("screen.screen_full_area", {"type": 'SPACE', "value": 'PRESS', "shift": True}, None),
- ("screen.screen_full_area",
- {"type": 'SPACE', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("use_hide_panels", True),
- ],
- },
- ),
- ("screen.screenshot", {"type": 'F3', "value": 'PRESS', "ctrl": True}, None),
- ("screen.screencast", {"type": 'F3', "value": 'PRESS', "alt": True}, None),
- ("screen.space_context_cycle",
- {"type": 'TAB', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("direction", 'NEXT'),
- ],
- },
- ),
- ("screen.space_context_cycle",
- {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("direction", 'PREV'),
- ],
- },
- ),
- ("screen.region_quadview", {"type": 'Q', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("screen.repeat_history", {"type": 'F3', "value": 'PRESS'}, None),
- ("screen.repeat_last", {"type": 'R', "value": 'PRESS', "shift": True}, None),
- ("screen.region_flip", {"type": 'F5', "value": 'PRESS'}, None),
- ("screen.redo_last", {"type": 'F6', "value": 'PRESS'}, None),
- ("script.reload", {"type": 'F8', "value": 'PRESS'}, None),
- ("file.execute", {"type": 'RET', "value": 'PRESS'}, None),
- ("file.execute", {"type": 'NUMPAD_ENTER', "value": 'PRESS'}, None),
- ("file.cancel", {"type": 'ESC', "value": 'PRESS'}, None),
- ("ed.undo", {"type": 'Z', "value": 'PRESS', "ctrl": True}, None),
- ("ed.redo", {"type": 'Z', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("ed.undo_history", {"type": 'Z', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("render.render",
- {"type": 'F12', "value": 'PRESS'},
- {"properties":
- [("use_viewport", True),
- ],
- },
- ),
- ("render.render",
- {"type": 'F12', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("animation", True),
- ("use_viewport", True),
- ],
- },
- ),
- ("render.view_cancel", {"type": 'ESC', "value": 'PRESS'}, None),
- ("render.view_show", {"type": 'F11', "value": 'PRESS'}, None),
- ("render.play_rendered_anim", {"type": 'F11', "value": 'PRESS', "ctrl": True}, None),
- ("screen.userpref_show", {"type": 'U', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ],
- },
- ),
- ("User Interface",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("ui.eyedropper_color", {"type": 'E', "value": 'PRESS'}, None),
- ("ui.eyedropper_colorband", {"type": 'E', "value": 'PRESS'}, None),
- ("ui.eyedropper_colorband_point", {"type": 'E', "value": 'PRESS', "alt": True}, None),
- ("ui.eyedropper_id", {"type": 'E', "value": 'PRESS'}, None),
- ("ui.eyedropper_depth", {"type": 'E', "value": 'PRESS'}, None),
- ("ui.copy_data_path_button", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("ui.copy_data_path_button",
- {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
- {"properties":
- [("full_path", True),
- ],
- },
- ),
- ("anim.keyframe_insert_button", {"type": 'I', "value": 'PRESS'}, None),
- ("anim.keyframe_delete_button", {"type": 'I', "value": 'PRESS', "alt": True}, None),
- ("anim.keyframe_clear_button", {"type": 'I', "value": 'PRESS', "shift": True, "alt": True}, None),
- ("anim.driver_button_add", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
- ("anim.driver_button_remove", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("anim.keyingset_button_add", {"type": 'K', "value": 'PRESS'}, None),
- ("anim.keyingset_button_remove", {"type": 'K', "value": 'PRESS', "alt": True}, None),
- ],
- },
- ),
- ("View2D",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("view2d.scroller_activate", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("view2d.scroller_activate", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
- ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
- ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
- ("view2d.pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
- ("view2d.scroll_right", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("view2d.scroll_left", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True}, None),
- ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True}, None),
- ("view2d.ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
- ("view2d.zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None),
- ("view2d.zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None),
- ("view2d.zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
- ("view2d.zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
- ("view2d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
- ("view2d.smoothview", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
- ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
- ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
- ("view2d.scroll_right", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
- ("view2d.scroll_left", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
- ("view2d.zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("view2d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
- ("view2d.zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None),
- ],
- },
- ),
- ("Header",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("screen.header_toolbox", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("View2D Buttons List",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("view2d.scroller_activate", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("view2d.scroller_activate", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
- ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
- ("view2d.pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
- ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
- ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
- ("view2d.scroll_down",
- {"type": 'PAGE_DOWN', "value": 'PRESS'},
- {"properties":
- [("page", True),
- ],
- },
- ),
- ("view2d.scroll_up",
- {"type": 'PAGE_UP', "value": 'PRESS'},
- {"properties":
- [("page", True),
- ],
- },
- ),
- ("view2d.zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("view2d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
- ("view2d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
- ("view2d.zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
- ("view2d.zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
- ("view2d.reset", {"type": 'HOME', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("Frames",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("screen.frame_offset",
- {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("delta", 10),
- ],
- },
- ),
- ("screen.frame_offset",
- {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("delta", -10),
- ],
- },
- ),
- ("screen.frame_offset",
- {"type": 'LEFT_ARROW', "value": 'PRESS'},
- {"properties":
- [("delta", -1),
- ],
- },
- ),
- ("screen.frame_offset",
- {"type": 'RIGHT_ARROW', "value": 'PRESS'},
- {"properties":
- [("delta", 1),
- ],
- },
- ),
- ("screen.frame_offset",
- {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "alt": True},
- {"properties":
- [("delta", 1),
- ],
- },
- ),
- ("screen.frame_offset",
- {"type": 'WHEELUPMOUSE', "value": 'PRESS', "alt": True},
- {"properties":
- [("delta", -1),
- ],
- },
- ),
- ("screen.frame_jump",
- {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("end", True),
- ],
- },
- ),
- ("screen.frame_jump",
- {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("end", False),
- ],
- },
- ),
- ("screen.frame_jump",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("end", True),
- ],
- },
- ),
- ("screen.frame_jump",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("end", False),
- ],
- },
- ),
- ("screen.keyframe_jump",
- {"type": 'UP_ARROW', "value": 'PRESS'},
- {"properties":
- [("next", True),
- ],
- },
- ),
- ("screen.keyframe_jump",
- {"type": 'DOWN_ARROW', "value": 'PRESS'},
- {"properties":
- [("next", False),
- ],
- },
- ),
- ("screen.keyframe_jump",
- {"type": 'MEDIA_LAST', "value": 'PRESS'},
- {"properties":
- [("next", True),
- ],
- },
- ),
- ("screen.keyframe_jump",
- {"type": 'MEDIA_FIRST', "value": 'PRESS'},
- {"properties":
- [("next", False),
- ],
- },
- ),
- ("screen.animation_play", {"type": 'A', "value": 'PRESS', "alt": True}, None),
- ("screen.animation_play",
- {"type": 'A', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("reverse", True),
- ],
- },
- ),
- ("screen.animation_cancel", {"type": 'ESC', "value": 'PRESS'}, None),
- ("screen.animation_play", {"type": 'MEDIA_PLAY', "value": 'PRESS'}, None),
- ("screen.animation_cancel", {"type": 'MEDIA_STOP', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("Property Editor",
- {"space_type": 'PROPERTIES', "region_type": 'WINDOW'},
- {"items":
- [("buttons.toolbox", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("Info",
- {"space_type": 'INFO', "region_type": 'WINDOW'},
- {"items":
- [("info.select_pick", {"type": 'SELECTMOUSE', "value": 'PRESS'}, None),
- ("info.select_all_toggle", {"type": 'A', "value": 'PRESS'}, None),
- ("info.select_border", {"type": 'B', "value": 'PRESS'}, None),
- ("info.report_replay", {"type": 'R', "value": 'PRESS'}, None),
- ("info.report_delete", {"type": 'X', "value": 'PRESS'}, None),
- ("info.report_delete", {"type": 'DEL', "value": 'PRESS'}, None),
- ("info.report_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
- ],
- },
- ),
- ("Outliner",
- {"space_type": 'OUTLINER', "region_type": 'WINDOW'},
- {"items":
- [("outliner.highlight_update", {"type": 'MOUSEMOVE', "value": 'ANY', "any": True}, None),
- ("outliner.item_rename", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
- ("outliner.item_activate",
- {"type": 'LEFTMOUSE', "value": 'CLICK'},
- {"properties":
- [("extend", False),
- ("recursive", False),
- ],
- },
- ),
- ("outliner.item_activate",
- {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
- {"properties":
- [("extend", True),
- ("recursive", False),
- ],
- },
- ),
- ("outliner.item_activate",
- {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True},
- {"properties":
- [("extend", False),
- ("recursive", True),
- ],
- },
- ),
- ("outliner.item_activate",
- {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True},
- {"properties":
- [("extend", True),
- ("recursive", True),
- ],
- },
- ),
- ("outliner.select_border", {"type": 'B', "value": 'PRESS'}, None),
- ("outliner.item_openclose",
- {"type": 'RET', "value": 'PRESS'},
- {"properties":
- [("all", False),
- ],
- },
- ),
- ("outliner.item_openclose",
- {"type": 'RET', "value": 'PRESS', "shift": True},
- {"properties":
- [("all", True),
- ],
- },
- ),
- ("outliner.item_rename", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("outliner.operation", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
- ("outliner.item_drag_drop", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
- ("outliner.show_hierarchy", {"type": 'HOME', "value": 'PRESS'}, None),
- ("outliner.show_active", {"type": 'PERIOD', "value": 'PRESS'}, None),
- ("outliner.show_active", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
- ("outliner.scroll_page",
- {"type": 'PAGE_DOWN', "value": 'PRESS'},
- {"properties":
- [("up", False),
- ],
- },
- ),
- ("outliner.scroll_page",
- {"type": 'PAGE_UP', "value": 'PRESS'},
- {"properties":
- [("up", True),
- ],
- },
- ),
- ("outliner.show_one_level", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
- ("outliner.show_one_level",
- {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
- {"properties":
- [("open", False),
- ],
- },
- ),
- ("outliner.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("outliner.expanded_toggle", {"type": 'A', "value": 'PRESS', "shift": True}, None),
- ("outliner.keyingset_add_selected", {"type": 'K', "value": 'PRESS'}, None),
- ("outliner.keyingset_remove_selected", {"type": 'K', "value": 'PRESS', "alt": True}, None),
- ("anim.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
- ("anim.keyframe_delete", {"type": 'I', "value": 'PRESS', "alt": True}, None),
- ("outliner.drivers_add_selected", {"type": 'D', "value": 'PRESS'}, None),
- ("outliner.drivers_delete_selected", {"type": 'D', "value": 'PRESS', "alt": True}, None),
- ("outliner.collection_new", {"type": 'C', "value": 'PRESS'}, None),
- ("outliner.collection_delete", {"type": 'X', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("3D View Generic",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("view3d.properties", {"type": 'N', "value": 'PRESS'}, None),
- ("view3d.toolshelf", {"type": 'T', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("Grease Pencil",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("gpencil.draw",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "key_modifier": 'D'},
- {"properties":
- [("mode", 'DRAW'),
- ("wait_for_input", False),
- ],
- },
- ),
- ("gpencil.draw",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True, "key_modifier": 'D'},
- {"properties":
- [("mode", 'DRAW_STRAIGHT'),
- ("wait_for_input", False),
- ],
- },
- ),
- ("gpencil.draw",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True, "key_modifier": 'D'},
- {"properties":
- [("mode", 'DRAW_POLY'),
- ("wait_for_input", False),
- ],
- },
- ),
- ("gpencil.draw",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "key_modifier": 'D'},
- {"properties":
- [("mode", 'ERASER'),
- ("wait_for_input", False),
- ],
- },
- ),
- ("gpencil.draw",
- {"type": 'ERASER', "value": 'PRESS'},
- {"properties":
- [("mode", 'ERASER'),
- ("wait_for_input", False),
- ],
- },
- ),
- ("gpencil.editmode_toggle", {"type": 'TAB', "value": 'PRESS', "key_modifier": 'D'}, None),
- ("wm.call_menu_pie",
- {"type": 'Q', "value": 'PRESS', "key_modifier": 'D'},
- {"properties":
- [("name", 'GPENCIL_MT_pie_tool_palette'),
- ],
- },
- ),
- ("wm.call_menu_pie",
- {"type": 'W', "value": 'PRESS', "key_modifier": 'D'},
- {"properties":
- [("name", 'GPENCIL_MT_pie_settings_palette'),
- ],
- },
- ),
- ("gpencil.blank_frame_add", {"type": 'B', "value": 'PRESS', "key_modifier": 'D'}, None),
- ("gpencil.active_frames_delete_all", {"type": 'X', "value": 'PRESS', "key_modifier": 'D'}, None),
- ],
- },
- ),
- ("Grease Pencil Stroke Edit Mode",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("gpencil.editmode_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
- ("wm.call_menu_pie",
- {"type": 'E', "value": 'PRESS', "key_modifier": 'D'},
- {"properties":
- [("name", 'GPENCIL_MT_pie_sculpt'),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path_primary", 'user_preferences.edit.grease_pencil_eraser_radius'),
- ],
- },
- ),
- ("gpencil.interpolate", {"type": 'E', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("gpencil.interpolate_sequence", {"type": 'E', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("gpencil.brush_paint",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "key_modifier": 'E'},
- {"properties":
- [("wait_for_input", False),
- ],
- },
- ),
- ("gpencil.brush_paint",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True, "key_modifier": 'E'},
- {"properties":
- [("wait_for_input", False),
- ],
- },
- ),
- ("gpencil.brush_paint",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "key_modifier": 'E'},
- {"properties":
- [("wait_for_input", False),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path_primary", 'tool_settings.gpencil_sculpt.brush.strength'),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS'},
- {"properties":
- [("data_path_primary", 'tool_settings.gpencil_sculpt.brush.size'),
- ],
- },
- ),
- ("gpencil.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("gpencil.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("gpencil.select_circle", {"type": 'C', "value": 'PRESS'}, None),
- ("gpencil.select_border", {"type": 'B', "value": 'PRESS'}, None),
- ("gpencil.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True},
- {"properties":
- [("deselect", False),
- ],
- },
- ),
- ("gpencil.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True},
- {"properties":
- [("deselect", True),
- ],
- },
- ),
- ("gpencil.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True, "alt": True},
- {"properties":
- [("deselect", False),
- ],
- },
- ),
- ("gpencil.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
- {"properties":
- [("deselect", True),
- ],
- },
- ),
- ("gpencil.select", {"type": 'SELECTMOUSE', "value": 'PRESS'}, None),
- ("gpencil.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", True),
- ("toggle", True),
- ],
- },
- ),
- ("gpencil.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "alt": True},
- {"properties":
- [("entire_strokes", True),
- ],
- },
- ),
- ("gpencil.select_linked", {"type": 'L', "value": 'PRESS'}, None),
- ("gpencil.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
- ("gpencil.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None),
- ("gpencil.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
- ("gpencil.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
- ("gpencil.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
- ("wm.call_menu",
- {"type": 'X', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_edit_gpencil_delete'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'DEL', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_edit_gpencil_delete'),
- ],
- },
- ),
- ("gpencil.dissolve", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
- ("gpencil.dissolve", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None),
- ("gpencil.active_frames_delete_all", {"type": 'X', "value": 'PRESS', "shift": True}, None),
- ("wm.call_menu",
- {"type": 'W', "value": 'PRESS'},
- {"properties":
- [("name", 'GPENCIL_MT_gpencil_edit_specials'),
- ],
- },
- ),
- ("gpencil.stroke_join", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
- ("gpencil.stroke_join",
- {"type": 'J', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("type", 'JOINCOPY'),
- ],
- },
- ),
- ("gpencil.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
- ("gpencil.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
- ("wm.call_menu",
- {"type": 'S', "value": 'PRESS', "shift": True},
- {"properties":
- [("name", 'GPENCIL_MT_snap'),
- ],
- },
- ),
- ("gpencil.convert", {"type": 'C', "value": 'PRESS', "alt": True}, None),
- ("gpencil.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
- ("gpencil.hide",
- {"type": 'H', "value": 'PRESS'},
- {"properties":
- [("unselected", False),
- ],
- },
- ),
- ("gpencil.hide",
- {"type": 'H', "value": 'PRESS', "shift": True},
- {"properties":
- [("unselected", True),
- ],
- },
- ),
- ("gpencil.selection_opacity_toggle", {"type": 'H', "value": 'PRESS', "ctrl": True}, None),
- ("gpencil.layer_isolate", {"type": 'NUMPAD_ASTERIX', "value": 'PRESS'}, None),
- ("gpencil.move_to_layer", {"type": 'M', "value": 'PRESS'}, None),
- ("gpencil.brush_select",
- {"type": 'ONE', "value": 'PRESS'},
- {"properties":
- [("index", 0),
- ],
- },
- ),
- ("gpencil.brush_select",
- {"type": 'TWO', "value": 'PRESS'},
- {"properties":
- [("index", 1),
- ],
- },
- ),
- ("gpencil.brush_select",
- {"type": 'THREE', "value": 'PRESS'},
- {"properties":
- [("index", 2),
- ],
- },
- ),
- ("gpencil.brush_select",
- {"type": 'FOUR', "value": 'PRESS'},
- {"properties":
- [("index", 3),
- ],
- },
- ),
- ("gpencil.brush_select",
- {"type": 'FIVE', "value": 'PRESS'},
- {"properties":
- [("index", 4),
- ],
- },
- ),
- ("gpencil.brush_select",
- {"type": 'SIX', "value": 'PRESS'},
- {"properties":
- [("index", 5),
- ],
- },
- ),
- ("gpencil.brush_select",
- {"type": 'SEVEN', "value": 'PRESS'},
- {"properties":
- [("index", 6),
- ],
- },
- ),
- ("gpencil.brush_select",
- {"type": 'EIGHT', "value": 'PRESS'},
- {"properties":
- [("index", 7),
- ],
- },
- ),
- ("gpencil.brush_select",
- {"type": 'NINE', "value": 'PRESS'},
- {"properties":
- [("index", 8),
- ],
- },
- ),
- ("gpencil.brush_select",
- {"type": 'ZERO', "value": 'PRESS'},
- {"properties":
- [("index", 9),
- ],
- },
- ),
- ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
- ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
- ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
- ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
- ("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
- ("transform.bend", {"type": 'W', "value": 'PRESS', "shift": True}, None),
- ("transform.tosphere", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True}, None),
- ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
- ("transform.transform",
- {"type": 'S', "value": 'PRESS', "alt": True},
- {"properties":
- [("mode", 'GPENCIL_SHRINKFATTEN'),
- ],
- },
- ),
- ("wm.context_cycle_enum",
- {"type": 'O', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit_falloff'),
- ("wrap", True),
- ],
- },
- ),
- ("wm.context_toggle_enum",
- {"type": 'O', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit'),
- ("value_1", 'DISABLED'),
- ("value_2", 'ENABLED'),
- ],
- },
- ),
- ("wm.context_toggle_enum",
- {"type": 'O', "value": 'PRESS', "alt": True},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit'),
- ("value_1", 'DISABLED'),
- ("value_2", 'CONNECTED'),
- ],
- },
- ),
- ],
- },
- ),
- ("Face Mask",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("paint.face_select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("paint.face_select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("paint.face_select_hide",
- {"type": 'H', "value": 'PRESS'},
- {"properties":
- [("unselected", False),
- ],
- },
- ),
- ("paint.face_select_hide",
- {"type": 'H', "value": 'PRESS', "shift": True},
- {"properties":
- [("unselected", True),
- ],
- },
- ),
- ("paint.face_select_reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
- ("paint.face_select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
- ("paint.face_select_linked_pick",
- {"type": 'L', "value": 'PRESS'},
- {"properties":
- [("deselect", False),
- ],
- },
- ),
- ("paint.face_select_linked_pick",
- {"type": 'L', "value": 'PRESS', "shift": True},
- {"properties":
- [("deselect", True),
- ],
- },
- ),
- ],
- },
- ),
- ("Weight Paint Vertex Selection",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("paint.vert_select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("paint.vert_select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("view3d.select_border", {"type": 'B', "value": 'PRESS'}, None),
- ("view3d.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True},
- {"properties":
- [("deselect", False),
- ],
- },
- ),
- ("view3d.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True},
- {"properties":
- [("deselect", True),
- ],
- },
- ),
- ("view3d.select_circle", {"type": 'C', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("Pose",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("object.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
- ("wm.call_menu",
- {"type": 'A', "value": 'PRESS', "shift": True},
- {"properties":
- [("name", 'VIEW3D_MT_add'),
- ],
- },
- ),
- ("pose.hide",
- {"type": 'H', "value": 'PRESS'},
- {"properties":
- [("unselected", False),
- ],
- },
- ),
- ("pose.hide",
- {"type": 'H', "value": 'PRESS', "shift": True},
- {"properties":
- [("unselected", True),
- ],
- },
- ),
- ("pose.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
- ("wm.call_menu",
- {"type": 'A', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("name", 'VIEW3D_MT_pose_apply'),
- ],
- },
- ),
- ("pose.rot_clear", {"type": 'R', "value": 'PRESS', "alt": True}, None),
- ("pose.loc_clear", {"type": 'G', "value": 'PRESS', "alt": True}, None),
- ("pose.scale_clear", {"type": 'S', "value": 'PRESS', "alt": True}, None),
- ("pose.quaternions_flip", {"type": 'F', "value": 'PRESS', "alt": True}, None),
- ("pose.rotation_mode_set", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
- ("pose.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
- ("pose.paste",
- {"type": 'V', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("flipped", False),
- ],
- },
- ),
- ("pose.paste",
- {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("flipped", True),
- ],
- },
- ),
- ("pose.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("pose.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("pose.select_parent", {"type": 'P', "value": 'PRESS', "shift": True}, None),
- ("pose.select_hierarchy",
- {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("direction", 'PARENT'),
- ("extend", False),
- ],
- },
- ),
- ("pose.select_hierarchy",
- {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True},
- {"properties":
- [("direction", 'PARENT'),
- ("extend", True),
- ],
- },
- ),
- ("pose.select_hierarchy",
- {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("direction", 'CHILD'),
- ("extend", False),
- ],
- },
- ),
- ("pose.select_hierarchy",
- {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True},
- {"properties":
- [("direction", 'CHILD'),
- ("extend", True),
- ],
- },
- ),
- ("pose.select_linked", {"type": 'L', "value": 'PRESS'}, None),
- ("pose.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None),
- ("pose.select_mirror", {"type": 'F', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("pose.constraint_add_with_targets", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("pose.constraints_clear", {"type": 'C', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("pose.ik_add", {"type": 'I', "value": 'PRESS', "shift": True}, None),
- ("pose.ik_clear", {"type": 'I', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("wm.call_menu",
- {"type": 'G', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("name", 'VIEW3D_MT_pose_group'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'W', "value": 'PRESS', "shift": True},
- {"properties":
- [("name", 'VIEW3D_MT_bone_options_toggle'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'W', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("name", 'VIEW3D_MT_bone_options_enable'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'W', "value": 'PRESS', "alt": True},
- {"properties":
- [("name", 'VIEW3D_MT_bone_options_disable'),
- ],
- },
- ),
- ("armature.layers_show_all", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True}, None),
- ("armature.armature_layers", {"type": 'M', "value": 'PRESS', "shift": True}, None),
- ("pose.bone_layers", {"type": 'M', "value": 'PRESS'}, None),
- ("wm.context_toggle",
- {"type": 'Z', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.overlay.show_bone_select'),
- ],
- },
- ),
- ("transform.transform",
- {"type": 'S', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("mode", 'BONE_SIZE'),
- ],
- },
- ),
- ("anim.keyframe_insert_menu", {"type": 'I', "value": 'PRESS'}, None),
- ("anim.keyframe_delete_v3d", {"type": 'I', "value": 'PRESS', "alt": True}, None),
- ("anim.keying_set_active_set", {"type": 'I', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
- ("poselib.browse_interactive", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
- ("poselib.pose_add", {"type": 'L', "value": 'PRESS', "shift": True}, None),
- ("poselib.pose_remove", {"type": 'L', "value": 'PRESS', "alt": True}, None),
- ("poselib.pose_rename", {"type": 'L', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("pose.push", {"type": 'E', "value": 'PRESS', "ctrl": True}, None),
- ("pose.relax", {"type": 'E', "value": 'PRESS', "alt": True}, None),
- ("pose.breakdown", {"type": 'E', "value": 'PRESS', "shift": True}, None),
- ("wm.call_menu",
- {"type": 'W', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_pose_specials'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'P', "value": 'PRESS', "alt": True},
- {"properties":
- [("name", 'VIEW3D_MT_pose_propagate'),
- ],
- },
- ),
- ],
- },
- ),
- ("Object Mode",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("wm.context_cycle_enum",
- {"type": 'O', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit_falloff'),
- ("wrap", True),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'O', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.use_proportional_edit_objects'),
- ],
- },
- ),
- ("object.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("object.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("object.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
- ("object.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
- ("object.select_linked", {"type": 'L', "value": 'PRESS', "shift": True}, None),
- ("object.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None),
- ("object.select_mirror", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("object.select_hierarchy",
- {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("direction", 'PARENT'),
- ("extend", False),
- ],
- },
- ),
- ("object.select_hierarchy",
- {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True},
- {"properties":
- [("direction", 'PARENT'),
- ("extend", True),
- ],
- },
- ),
- ("object.select_hierarchy",
- {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("direction", 'CHILD'),
- ("extend", False),
- ],
- },
- ),
- ("object.select_hierarchy",
- {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True},
- {"properties":
- [("direction", 'CHILD'),
- ("extend", True),
- ],
- },
- ),
- ("object.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
- ("object.parent_no_inverse_set", {"type": 'P', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("object.parent_clear", {"type": 'P', "value": 'PRESS', "alt": True}, None),
- ("object.track_set", {"type": 'T', "value": 'PRESS', "ctrl": True}, None),
- ("object.track_clear", {"type": 'T', "value": 'PRESS', "alt": True}, None),
- ("object.constraint_add_with_targets", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("object.constraints_clear", {"type": 'C', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("object.location_clear",
- {"type": 'G', "value": 'PRESS', "alt": True},
- {"properties":
- [("clear_delta", False),
- ],
- },
- ),
- ("object.rotation_clear",
- {"type": 'R', "value": 'PRESS', "alt": True},
- {"properties":
- [("clear_delta", False),
- ],
- },
- ),
- ("object.scale_clear",
- {"type": 'S', "value": 'PRESS', "alt": True},
- {"properties":
- [("clear_delta", False),
- ],
- },
- ),
- ("object.origin_clear", {"type": 'O', "value": 'PRESS', "alt": True}, None),
- ("object.delete",
- {"type": 'X', "value": 'PRESS'},
- {"properties":
- [("use_global", False),
- ],
- },
- ),
- ("object.delete",
- {"type": 'X', "value": 'PRESS', "shift": True},
- {"properties":
- [("use_global", True),
- ],
- },
- ),
- ("object.delete",
- {"type": 'DEL', "value": 'PRESS'},
- {"properties":
- [("use_global", False),
- ],
- },
- ),
- ("object.delete",
- {"type": 'DEL', "value": 'PRESS', "shift": True},
- {"properties":
- [("use_global", True),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'A', "value": 'PRESS', "shift": True},
- {"properties":
- [("name", 'VIEW3D_MT_add'),
- ],
- },
- ),
- ("object.duplicates_make_real", {"type": 'A', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("wm.call_menu",
- {"type": 'A', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("name", 'VIEW3D_MT_object_apply'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'U', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_make_single_user'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'L', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("name", 'VIEW3D_MT_make_links'),
- ],
- },
- ),
- ("object.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
- ("object.duplicate_move_linked", {"type": 'D', "value": 'PRESS', "alt": True}, None),
- ("object.join", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
- ("object.convert", {"type": 'C', "value": 'PRESS', "alt": True}, None),
- ("object.proxy_make", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("object.make_local", {"type": 'L', "value": 'PRESS'}, None),
- ("anim.keyframe_insert_menu", {"type": 'I', "value": 'PRESS'}, None),
- ("anim.keyframe_delete_v3d", {"type": 'I', "value": 'PRESS', "alt": True}, None),
- ("anim.keying_set_active_set", {"type": 'I', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
- ("collection.create", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
- ("collection.objects_remove", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("collection.objects_remove_all", {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
- ("collection.objects_add_active", {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("collection.objects_remove_active", {"type": 'G', "value": 'PRESS', "shift": True, "alt": True}, None),
- ("wm.call_menu",
- {"type": 'W', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_object_specials'),
- ],
- },
- ),
- ("object.data_transfer", {"type": 'T', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("object.subdivision_set",
- {"type": 'ZERO', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 0),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'ONE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 1),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'TWO', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 2),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'THREE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 3),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'FOUR', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 4),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'FIVE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 5),
- ],
- },
- ),
- ("object.move_to_collection", {"type": 'M', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("Paint Curve",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("paintcurve.add_point_slide", {"type": 'ACTIONMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("paintcurve.select", {"type": 'SELECTMOUSE', "value": 'PRESS'}, None),
- ("paintcurve.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("paintcurve.slide", {"type": 'ACTIONMOUSE', "value": 'PRESS'}, None),
- ("paintcurve.slide",
- {"type": 'ACTIONMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("align", True),
- ],
- },
- ),
- ("paintcurve.select",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("toggle", True),
- ],
- },
- ),
- ("paintcurve.cursor", {"type": 'ACTIONMOUSE', "value": 'PRESS'}, None),
- ("paintcurve.delete_point", {"type": 'X', "value": 'PRESS'}, None),
- ("paintcurve.delete_point", {"type": 'DEL', "value": 'PRESS'}, None),
- ("paintcurve.draw", {"type": 'RET', "value": 'PRESS'}, None),
- ("paintcurve.draw", {"type": 'NUMPAD_ENTER', "value": 'PRESS'}, None),
- ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
- ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
- ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
- ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("Curve",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("wm.call_menu",
- {"type": 'A', "value": 'PRESS', "shift": True},
- {"properties":
- [("name", 'TOPBAR_MT_edit_curve_add'),
- ],
- },
- ),
- ("curve.handle_type_set", {"type": 'V', "value": 'PRESS'}, None),
- ("curve.vertex_add", {"type": 'ACTIONMOUSE', "value": 'CLICK', "ctrl": True}, None),
- ("curve.draw",
- {"type": 'ACTIONMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("wait_for_input", False),
- ],
- },
- ),
- ("curve.draw",
- {"type": 'PEN', "value": 'PRESS', "shift": True},
- {"properties":
- [("wait_for_input", False),
- ],
- },
- ),
- ("curve.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("curve.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("curve.select_row", {"type": 'R', "value": 'PRESS', "shift": True}, None),
- ("curve.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
- ("curve.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
- ("curve.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
- ("curve.select_similar", {"type": 'G', "value": 'PRESS', "shift": True}, None),
- ("curve.select_linked_pick",
- {"type": 'L', "value": 'PRESS'},
- {"properties":
- [("deselect", False),
- ],
- },
- ),
- ("curve.select_linked_pick",
- {"type": 'L', "value": 'PRESS', "shift": True},
- {"properties":
- [("deselect", True),
- ],
- },
- ),
- ("curve.shortest_path_pick", {"type": 'SELECTMOUSE', "value": 'CLICK', "ctrl": True}, None),
- ("curve.separate", {"type": 'P', "value": 'PRESS'}, None),
- ("curve.split", {"type": 'Y', "value": 'PRESS'}, None),
- ("curve.extrude_move", {"type": 'E', "value": 'PRESS'}, None),
- ("curve.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
- ("curve.make_segment", {"type": 'F', "value": 'PRESS'}, None),
- ("curve.cyclic_toggle", {"type": 'C', "value": 'PRESS', "alt": True}, None),
- ("wm.call_menu",
- {"type": 'X', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_edit_curve_delete'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'DEL', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_edit_curve_delete'),
- ],
- },
- ),
- ("curve.dissolve_verts", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
- ("curve.dissolve_verts", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None),
- ("curve.tilt_clear", {"type": 'T', "value": 'PRESS', "alt": True}, None),
- ("transform.tilt", {"type": 'T', "value": 'PRESS', "ctrl": True}, None),
- ("transform.transform",
- {"type": 'S', "value": 'PRESS', "alt": True},
- {"properties":
- [("mode", 'CURVE_SHRINKFATTEN'),
- ],
- },
- ),
- ("curve.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
- ("curve.hide",
- {"type": 'H', "value": 'PRESS'},
- {"properties":
- [("unselected", False),
- ],
- },
- ),
- ("curve.hide",
- {"type": 'H', "value": 'PRESS', "shift": True},
- {"properties":
- [("unselected", True),
- ],
- },
- ),
- ("curve.normals_make_consistent", {"type": 'N', "value": 'PRESS', "ctrl": True}, None),
- ("object.vertex_parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
- ("wm.call_menu",
- {"type": 'W', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_edit_curve_specials'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'H', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("name", 'VIEW3D_MT_hook'),
- ],
- },
- ),
- ("wm.context_cycle_enum",
- {"type": 'O', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit_falloff'),
- ("wrap", True),
- ],
- },
- ),
- ("wm.context_toggle_enum",
- {"type": 'O', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit'),
- ("value_1", 'DISABLED'),
- ("value_2", 'ENABLED'),
- ],
- },
- ),
- ("wm.context_toggle_enum",
- {"type": 'O', "value": 'PRESS', "alt": True},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit'),
- ("value_1", 'DISABLED'),
- ("value_2", 'CONNECTED'),
- ],
- },
- ),
- ],
- },
- ),
- ("Image Paint",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("paint.image_paint",
- {"type": 'LEFTMOUSE', "value": 'PRESS'},
- {"properties":
- [("mode", 'NORMAL'),
- ],
- },
- ),
- ("paint.image_paint",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("mode", 'INVERT'),
- ],
- },
- ),
- ("paint.brush_colors_flip", {"type": 'X', "value": 'PRESS'}, None),
- ("paint.grab_clone", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
- ("paint.sample_color", {"type": 'S', "value": 'PRESS'}, None),
- ("brush.active_index_set",
- {"type": 'ONE', "value": 'PRESS'},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 0),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'TWO', "value": 'PRESS'},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 1),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'THREE', "value": 'PRESS'},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 2),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FOUR', "value": 'PRESS'},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 3),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FIVE', "value": 'PRESS'},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 4),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SIX', "value": 'PRESS'},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 5),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SEVEN', "value": 'PRESS'},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 6),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'EIGHT', "value": 'PRESS'},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 7),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'NINE', "value": 'PRESS'},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 8),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'ZERO', "value": 'PRESS'},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 9),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'ONE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 10),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'TWO', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 11),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'THREE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 12),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FOUR', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 13),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FIVE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 14),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SIX', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 15),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SEVEN', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 16),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'EIGHT', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 17),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'NINE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 18),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'ZERO', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'image_paint'),
- ("index", 19),
- ],
- },
- ),
- ("brush.scale_size",
- {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("scalar", 0.9),
- ],
- },
- ),
- ("brush.scale_size",
- {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("scalar", 1.1111112),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS'},
- {"properties":
- [("data_path_primary", 'tool_settings.image_paint.brush.size'),
- ("data_path_secondary", 'tool_settings.unified_paint_settings.size'),
- ("use_secondary", 'tool_settings.unified_paint_settings.use_unified_size'),
- ("rotation_path", 'tool_settings.image_paint.brush.mask_texture_slot.angle'),
- ("color_path", 'tool_settings.image_paint.brush.cursor_color_add'),
- ("fill_color_path", 'tool_settings.image_paint.brush.color'),
- ("fill_color_override_path", 'tool_settings.unified_paint_settings.color'),
- ("fill_color_override_test_path", 'tool_settings.unified_paint_settings.use_unified_color'),
- ("zoom_path", 'space_data.zoom'),
- ("image_id", 'tool_settings.image_paint.brush'),
- ("secondary_tex", True),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path_primary", 'tool_settings.image_paint.brush.strength'),
- ("data_path_secondary", 'tool_settings.unified_paint_settings.strength'),
- ("use_secondary", 'tool_settings.unified_paint_settings.use_unified_strength'),
- ("rotation_path", 'tool_settings.image_paint.brush.mask_texture_slot.angle'),
- ("color_path", 'tool_settings.image_paint.brush.cursor_color_add'),
- ("fill_color_path", 'tool_settings.image_paint.brush.color'),
- ("fill_color_override_path", 'tool_settings.unified_paint_settings.color'),
- ("fill_color_override_test_path", 'tool_settings.unified_paint_settings.use_unified_color'),
- ("zoom_path", ''),
- ("image_id", 'tool_settings.image_paint.brush'),
- ("secondary_tex", True),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path_primary", 'tool_settings.image_paint.brush.texture_slot.angle'),
- ("data_path_secondary", ''),
- ("use_secondary", ''),
- ("rotation_path", 'tool_settings.image_paint.brush.texture_slot.angle'),
- ("color_path", 'tool_settings.image_paint.brush.cursor_color_add'),
- ("fill_color_path", 'tool_settings.image_paint.brush.color'),
- ("fill_color_override_path", 'tool_settings.unified_paint_settings.color'),
- ("fill_color_override_test_path", 'tool_settings.unified_paint_settings.use_unified_color'),
- ("zoom_path", ''),
- ("image_id", 'tool_settings.image_paint.brush'),
- ("secondary_tex", False),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("data_path_primary", 'tool_settings.image_paint.brush.mask_texture_slot.angle'),
- ("data_path_secondary", ''),
- ("use_secondary", ''),
- ("rotation_path", 'tool_settings.image_paint.brush.mask_texture_slot.angle'),
- ("color_path", 'tool_settings.image_paint.brush.cursor_color_add'),
- ("fill_color_path", 'tool_settings.image_paint.brush.color'),
- ("fill_color_override_path", 'tool_settings.unified_paint_settings.color'),
- ("fill_color_override_test_path", 'tool_settings.unified_paint_settings.use_unified_color'),
- ("zoom_path", ''),
- ("image_id", 'tool_settings.image_paint.brush'),
- ("secondary_tex", True),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS'},
- {"properties":
- [("mode", 'TRANSLATION'),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'SCALE'),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("mode", 'ROTATION'),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True},
- {"properties":
- [("mode", 'TRANSLATION'),
- ("texmode", 'SECONDARY'),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("mode", 'SCALE'),
- ("texmode", 'SECONDARY'),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("mode", 'ROTATION'),
- ("texmode", 'SECONDARY'),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'M', "value": 'PRESS'},
- {"properties":
- [("data_path", 'image_paint_object.data.use_paint_mask'),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'S', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.image_paint.brush.use_smooth_stroke'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'R', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_angle_control'),
- ],
- },
- ),
- ("wm.context_menu_enum",
- {"type": 'E', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.image_paint.brush.stroke_method'),
- ],
- },
- ),
- ],
- },
- ),
- ("Vertex Paint",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("paint.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("paint.brush_colors_flip", {"type": 'X', "value": 'PRESS'}, None),
- ("paint.sample_color", {"type": 'S', "value": 'PRESS'}, None),
- ("paint.vertex_color_set", {"type": 'K', "value": 'PRESS', "shift": True}, None),
- ("brush.active_index_set",
- {"type": 'ONE', "value": 'PRESS'},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 0),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'TWO', "value": 'PRESS'},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 1),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'THREE', "value": 'PRESS'},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 2),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FOUR', "value": 'PRESS'},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 3),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FIVE', "value": 'PRESS'},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 4),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SIX', "value": 'PRESS'},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 5),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SEVEN', "value": 'PRESS'},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 6),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'EIGHT', "value": 'PRESS'},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 7),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'NINE', "value": 'PRESS'},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 8),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'ZERO', "value": 'PRESS'},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 9),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'ONE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 10),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'TWO', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 11),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'THREE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 12),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FOUR', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 13),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FIVE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 14),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SIX', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 15),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SEVEN', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 16),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'EIGHT', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 17),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'NINE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 18),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'ZERO', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'vertex_paint'),
- ("index", 19),
- ],
- },
- ),
- ("brush.scale_size",
- {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("scalar", 0.9),
- ],
- },
- ),
- ("brush.scale_size",
- {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("scalar", 1.1111112),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS'},
- {"properties":
- [("data_path_primary", 'tool_settings.vertex_paint.brush.size'),
- ("data_path_secondary", 'tool_settings.unified_paint_settings.size'),
- ("use_secondary", 'tool_settings.unified_paint_settings.use_unified_size'),
- ("rotation_path", 'tool_settings.vertex_paint.brush.texture_slot.angle'),
- ("color_path", 'tool_settings.vertex_paint.brush.cursor_color_add'),
- ("fill_color_path", 'tool_settings.vertex_paint.brush.color'),
- ("fill_color_override_path", 'tool_settings.unified_paint_settings.color'),
- ("fill_color_override_test_path", 'tool_settings.unified_paint_settings.use_unified_color'),
- ("zoom_path", ''),
- ("image_id", 'tool_settings.vertex_paint.brush'),
- ("secondary_tex", False),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path_primary", 'tool_settings.vertex_paint.brush.strength'),
- ("data_path_secondary", 'tool_settings.unified_paint_settings.strength'),
- ("use_secondary", 'tool_settings.unified_paint_settings.use_unified_strength'),
- ("rotation_path", 'tool_settings.vertex_paint.brush.texture_slot.angle'),
- ("color_path", 'tool_settings.vertex_paint.brush.cursor_color_add'),
- ("fill_color_path", 'tool_settings.vertex_paint.brush.color'),
- ("fill_color_override_path", 'tool_settings.unified_paint_settings.color'),
- ("fill_color_override_test_path", 'tool_settings.unified_paint_settings.use_unified_color'),
- ("zoom_path", ''),
- ("image_id", 'tool_settings.vertex_paint.brush'),
- ("secondary_tex", False),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path_primary", 'tool_settings.vertex_paint.brush.texture_slot.angle'),
- ("data_path_secondary", ''),
- ("use_secondary", ''),
- ("rotation_path", 'tool_settings.vertex_paint.brush.texture_slot.angle'),
- ("color_path", 'tool_settings.vertex_paint.brush.cursor_color_add'),
- ("fill_color_path", 'tool_settings.vertex_paint.brush.color'),
- ("fill_color_override_path", 'tool_settings.unified_paint_settings.color'),
- ("fill_color_override_test_path", 'tool_settings.unified_paint_settings.use_unified_color'),
- ("zoom_path", ''),
- ("image_id", 'tool_settings.vertex_paint.brush'),
- ("secondary_tex", False),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS'},
- {"properties":
- [("mode", 'TRANSLATION'),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'SCALE'),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("mode", 'ROTATION'),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True},
- {"properties":
- [("mode", 'TRANSLATION'),
- ("texmode", 'SECONDARY'),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("mode", 'SCALE'),
- ("texmode", 'SECONDARY'),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("mode", 'ROTATION'),
- ("texmode", 'SECONDARY'),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'M', "value": 'PRESS'},
- {"properties":
- [("data_path", 'vertex_paint_object.data.use_paint_mask'),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'S', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.vertex_paint.brush.use_smooth_stroke'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'R', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_angle_control'),
- ],
- },
- ),
- ("wm.context_menu_enum",
- {"type": 'E', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.vertex_paint.brush.stroke_method'),
- ],
- },
- ),
- ],
- },
- ),
- ("Weight Paint",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("paint.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("paint.weight_sample", {"type": 'ACTIONMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("paint.weight_sample_group", {"type": 'ACTIONMOUSE', "value": 'PRESS', "shift": True}, None),
- ("paint.weight_gradient",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True},
- {"properties":
- [("type", 'LINEAR'),
- ],
- },
- ),
- ("paint.weight_gradient",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("type", 'RADIAL'),
- ],
- },
- ),
- ("paint.weight_set", {"type": 'K', "value": 'PRESS', "shift": True}, None),
- ("brush.active_index_set",
- {"type": 'ONE', "value": 'PRESS'},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 0),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'TWO', "value": 'PRESS'},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 1),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'THREE', "value": 'PRESS'},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 2),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FOUR', "value": 'PRESS'},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 3),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FIVE', "value": 'PRESS'},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 4),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SIX', "value": 'PRESS'},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 5),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SEVEN', "value": 'PRESS'},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 6),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'EIGHT', "value": 'PRESS'},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 7),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'NINE', "value": 'PRESS'},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 8),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'ZERO', "value": 'PRESS'},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 9),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'ONE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 10),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'TWO', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 11),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'THREE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 12),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FOUR', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 13),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FIVE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 14),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SIX', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 15),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SEVEN', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 16),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'EIGHT', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 17),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'NINE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 18),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'ZERO', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'weight_paint'),
- ("index", 19),
- ],
- },
- ),
- ("brush.scale_size",
- {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("scalar", 0.9),
- ],
- },
- ),
- ("brush.scale_size",
- {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("scalar", 1.1111112),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS'},
- {"properties":
- [("data_path_primary", 'tool_settings.weight_paint.brush.size'),
- ("data_path_secondary", 'tool_settings.unified_paint_settings.size'),
- ("use_secondary", 'tool_settings.unified_paint_settings.use_unified_size'),
- ("rotation_path", 'tool_settings.weight_paint.brush.texture_slot.angle'),
- ("color_path", 'tool_settings.weight_paint.brush.cursor_color_add'),
- ("fill_color_path", ''),
- ("fill_color_override_path", ''),
- ("fill_color_override_test_path", ''),
- ("zoom_path", ''),
- ("image_id", 'tool_settings.weight_paint.brush'),
- ("secondary_tex", False),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path_primary", 'tool_settings.weight_paint.brush.strength'),
- ("data_path_secondary", 'tool_settings.unified_paint_settings.strength'),
- ("use_secondary", 'tool_settings.unified_paint_settings.use_unified_strength'),
- ("rotation_path", 'tool_settings.weight_paint.brush.texture_slot.angle'),
- ("color_path", 'tool_settings.weight_paint.brush.cursor_color_add'),
- ("fill_color_path", ''),
- ("fill_color_override_path", ''),
- ("fill_color_override_test_path", ''),
- ("zoom_path", ''),
- ("image_id", 'tool_settings.weight_paint.brush'),
- ("secondary_tex", False),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'W', "value": 'PRESS'},
- {"properties":
- [("data_path_primary", 'tool_settings.weight_paint.brush.weight'),
- ("data_path_secondary", 'tool_settings.unified_paint_settings.weight'),
- ("use_secondary", 'tool_settings.unified_paint_settings.use_unified_weight'),
- ("rotation_path", 'tool_settings.weight_paint.brush.texture_slot.angle'),
- ("color_path", 'tool_settings.weight_paint.brush.cursor_color_add'),
- ("fill_color_path", ''),
- ("fill_color_override_path", ''),
- ("fill_color_override_test_path", ''),
- ("zoom_path", ''),
- ("image_id", 'tool_settings.weight_paint.brush'),
- ("secondary_tex", False),
- ],
- },
- ),
- ("wm.context_menu_enum",
- {"type": 'E', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.vertex_paint.brush.stroke_method'),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'M', "value": 'PRESS'},
- {"properties":
- [("data_path", 'weight_paint_object.data.use_paint_mask'),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'V', "value": 'PRESS'},
- {"properties":
- [("data_path", 'weight_paint_object.data.use_paint_mask_vertex'),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'S', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.weight_paint.brush.use_smooth_stroke'),
- ],
- },
- ),
- ],
- },
- ),
- ("Sculpt",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("sculpt.brush_stroke",
- {"type": 'LEFTMOUSE', "value": 'PRESS'},
- {"properties":
- [("mode", 'NORMAL'),
- ],
- },
- ),
- ("sculpt.brush_stroke",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("mode", 'INVERT'),
- ],
- },
- ),
- ("sculpt.brush_stroke",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'SMOOTH'),
- ],
- },
- ),
- ("paint.hide_show",
- {"type": 'H', "value": 'PRESS', "shift": True},
- {"properties":
- [("action", 'SHOW'),
- ("area", 'INSIDE'),
- ],
- },
- ),
- ("paint.hide_show",
- {"type": 'H', "value": 'PRESS'},
- {"properties":
- [("action", 'HIDE'),
- ("area", 'INSIDE'),
- ],
- },
- ),
- ("paint.hide_show",
- {"type": 'H', "value": 'PRESS', "alt": True},
- {"properties":
- [("action", 'SHOW'),
- ("area", 'ALL'),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'ZERO', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 0),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'ONE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 1),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'TWO', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 2),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'THREE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 3),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'FOUR', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 4),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'FIVE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 5),
- ],
- },
- ),
- ("paint.mask_flood_fill",
- {"type": 'M', "value": 'PRESS', "alt": True},
- {"properties":
- [("mode", 'VALUE'),
- ("value", 0.0),
- ],
- },
- ),
- ("paint.mask_flood_fill",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("mode", 'INVERT'),
- ],
- },
- ),
- ("paint.mask_lasso_gesture", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("wm.context_toggle",
- {"type": 'M', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'scene.tool_settings.sculpt.show_mask'),
- ],
- },
- ),
- ("sculpt.dynamic_topology_toggle", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
- ("sculpt.set_detail_size", {"type": 'D', "value": 'PRESS', "shift": True}, None),
- ("object.subdivision_set",
- {"type": 'PAGE_UP', "value": 'PRESS'},
- {"properties":
- [("level", 1),
- ("relative", True),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'PAGE_DOWN', "value": 'PRESS'},
- {"properties":
- [("level", -1),
- ("relative", True),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'ONE', "value": 'PRESS'},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 0),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'TWO', "value": 'PRESS'},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 1),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'THREE', "value": 'PRESS'},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 2),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FOUR', "value": 'PRESS'},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 3),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FIVE', "value": 'PRESS'},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 4),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SIX', "value": 'PRESS'},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 5),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SEVEN', "value": 'PRESS'},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 6),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'EIGHT', "value": 'PRESS'},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 7),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'NINE', "value": 'PRESS'},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 8),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'ZERO', "value": 'PRESS'},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 9),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'ONE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 10),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'TWO', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 11),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'THREE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 12),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FOUR', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 13),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'FIVE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 14),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SIX', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 15),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'SEVEN', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 16),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'EIGHT', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 17),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'NINE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 18),
- ],
- },
- ),
- ("brush.active_index_set",
- {"type": 'ZERO', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'sculpt'),
- ("index", 19),
- ],
- },
- ),
- ("brush.scale_size",
- {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("scalar", 0.9),
- ],
- },
- ),
- ("brush.scale_size",
- {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("scalar", 1.1111112),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS'},
- {"properties":
- [("data_path_primary", 'tool_settings.sculpt.brush.size'),
- ("data_path_secondary", 'tool_settings.unified_paint_settings.size'),
- ("use_secondary", 'tool_settings.unified_paint_settings.use_unified_size'),
- ("rotation_path", 'tool_settings.sculpt.brush.texture_slot.angle'),
- ("color_path", 'tool_settings.sculpt.brush.cursor_color_add'),
- ("fill_color_path", ''),
- ("fill_color_override_path", ''),
- ("fill_color_override_test_path", ''),
- ("zoom_path", ''),
- ("image_id", 'tool_settings.sculpt.brush'),
- ("secondary_tex", False),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path_primary", 'tool_settings.sculpt.brush.strength'),
- ("data_path_secondary", 'tool_settings.unified_paint_settings.strength'),
- ("use_secondary", 'tool_settings.unified_paint_settings.use_unified_strength'),
- ("rotation_path", 'tool_settings.sculpt.brush.texture_slot.angle'),
- ("color_path", 'tool_settings.sculpt.brush.cursor_color_add'),
- ("fill_color_path", ''),
- ("fill_color_override_path", ''),
- ("fill_color_override_test_path", ''),
- ("zoom_path", ''),
- ("image_id", 'tool_settings.sculpt.brush'),
- ("secondary_tex", False),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path_primary", 'tool_settings.sculpt.brush.texture_slot.angle'),
- ("data_path_secondary", ''),
- ("use_secondary", ''),
- ("rotation_path", 'tool_settings.sculpt.brush.texture_slot.angle'),
- ("color_path", 'tool_settings.sculpt.brush.cursor_color_add'),
- ("fill_color_path", ''),
- ("fill_color_override_path", ''),
- ("fill_color_override_test_path", ''),
- ("zoom_path", ''),
- ("image_id", 'tool_settings.sculpt.brush'),
- ("secondary_tex", False),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS'},
- {"properties":
- [("mode", 'TRANSLATION'),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'SCALE'),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("mode", 'ROTATION'),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True},
- {"properties":
- [("mode", 'TRANSLATION'),
- ("texmode", 'SECONDARY'),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("mode", 'SCALE'),
- ("texmode", 'SECONDARY'),
- ],
- },
- ),
- ("brush.stencil_control",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("mode", 'ROTATION'),
- ("texmode", 'SECONDARY'),
- ],
- },
- ),
- ("paint.brush_select",
- {"type": 'X', "value": 'PRESS'},
- {"properties":
- [("paint_mode", 'SCULPT'),
- ("sculpt_tool", 'DRAW'),
- ],
- },
- ),
- ("paint.brush_select",
- {"type": 'S', "value": 'PRESS'},
- {"properties":
- [("paint_mode", 'SCULPT'),
- ("sculpt_tool", 'SMOOTH'),
- ],
- },
- ),
- ("paint.brush_select",
- {"type": 'P', "value": 'PRESS'},
- {"properties":
- [("paint_mode", 'SCULPT'),
- ("sculpt_tool", 'PINCH'),
- ],
- },
- ),
- ("paint.brush_select",
- {"type": 'I', "value": 'PRESS'},
- {"properties":
- [("paint_mode", 'SCULPT'),
- ("sculpt_tool", 'INFLATE'),
- ],
- },
- ),
- ("paint.brush_select",
- {"type": 'G', "value": 'PRESS'},
- {"properties":
- [("paint_mode", 'SCULPT'),
- ("sculpt_tool", 'GRAB'),
- ],
- },
- ),
- ("paint.brush_select",
- {"type": 'L', "value": 'PRESS'},
- {"properties":
- [("paint_mode", 'SCULPT'),
- ("sculpt_tool", 'LAYER'),
- ],
- },
- ),
- ("paint.brush_select",
- {"type": 'T', "value": 'PRESS', "shift": True},
- {"properties":
- [("paint_mode", 'SCULPT'),
- ("sculpt_tool", 'FLATTEN'),
- ],
- },
- ),
- ("paint.brush_select",
- {"type": 'C', "value": 'PRESS'},
- {"properties":
- [("paint_mode", 'SCULPT'),
- ("sculpt_tool", 'CLAY'),
- ],
- },
- ),
- ("paint.brush_select",
- {"type": 'C', "value": 'PRESS', "shift": True},
- {"properties":
- [("paint_mode", 'SCULPT'),
- ("sculpt_tool", 'CREASE'),
- ],
- },
- ),
- ("paint.brush_select",
- {"type": 'K', "value": 'PRESS'},
- {"properties":
- [("paint_mode", 'SCULPT'),
- ("sculpt_tool", 'SNAKE_HOOK'),
- ],
- },
- ),
- ("paint.brush_select",
- {"type": 'M', "value": 'PRESS'},
- {"properties":
- [("paint_mode", 'SCULPT'),
- ("sculpt_tool", 'MASK'),
- ("toggle", True),
- ("create_missing", True),
- ],
- },
- ),
- ("wm.context_menu_enum",
- {"type": 'E', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.sculpt.brush.stroke_method'),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'S', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.sculpt.brush.use_smooth_stroke'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'R', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_angle_control'),
- ],
- },
- ),
- ],
- },
- ),
- ("Mesh",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("mesh.loopcut_slide", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
- ("mesh.offset_edge_loops_slide", {"type": 'R', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("mesh.inset", {"type": 'I', "value": 'PRESS'}, None),
- ("mesh.poke", {"type": 'P', "value": 'PRESS', "alt": True}, None),
- ("mesh.bevel",
- {"type": 'B', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("vertex_only", False),
- ],
- },
- ),
- ("mesh.bevel",
- {"type": 'B', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("vertex_only", True),
- ],
- },
- ),
- ("mesh.loop_select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "alt": True},
- {"properties":
- [("extend", False),
- ("deselect", False),
- ("toggle", False),
- ],
- },
- ),
- ("mesh.loop_select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("extend", False),
- ("deselect", False),
- ("toggle", True),
- ],
- },
- ),
- ("mesh.edgering_select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("extend", False),
- ("deselect", False),
- ("toggle", False),
- ],
- },
- ),
- ("mesh.edgering_select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
- {"properties":
- [("extend", False),
- ("deselect", False),
- ("toggle", True),
- ],
- },
- ),
- ("mesh.shortest_path_pick",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("use_fill", False),
- ],
- },
- ),
- ("mesh.shortest_path_pick",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("use_fill", True),
- ],
- },
- ),
- ("mesh.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("mesh.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("mesh.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
- ("mesh.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
- ("mesh.select_next_item", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("mesh.select_prev_item", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("mesh.select_non_manifold", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
- ("mesh.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
- ("mesh.select_linked_pick",
- {"type": 'L', "value": 'PRESS'},
- {"properties":
- [("deselect", False),
- ],
- },
- ),
- ("mesh.select_linked_pick",
- {"type": 'L', "value": 'PRESS', "shift": True},
- {"properties":
- [("deselect", True),
- ],
- },
- ),
- ("mesh.faces_select_linked_flat", {"type": 'F', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
- ("wm.call_menu",
- {"type": 'G', "value": 'PRESS', "shift": True},
- {"properties":
- [("name", 'VIEW3D_MT_edit_mesh_select_similar'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'TAB', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("name", 'VIEW3D_MT_edit_mesh_select_mode'),
- ],
- },
- ),
- ("mesh.hide",
- {"type": 'H', "value": 'PRESS'},
- {"properties":
- [("unselected", False),
- ],
- },
- ),
- ("mesh.hide",
- {"type": 'H', "value": 'PRESS', "shift": True},
- {"properties":
- [("unselected", True),
- ],
- },
- ),
- ("mesh.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
- ("mesh.normals_make_consistent",
- {"type": 'N', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("inside", False),
- ],
- },
- ),
- ("mesh.normals_make_consistent",
- {"type": 'N', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("inside", True),
- ],
- },
- ),
- ("view3d.edit_mesh_extrude_move_normal", {"type": 'E', "value": 'PRESS'}, None),
- ("wm.call_menu",
- {"type": 'E', "value": 'PRESS', "alt": True},
- {"properties":
- [("name", 'VIEW3D_MT_edit_mesh_extrude'),
- ],
- },
- ),
- ("transform.edge_crease", {"type": 'E', "value": 'PRESS', "shift": True}, None),
- ("mesh.spin", {"type": 'R', "value": 'PRESS', "alt": True}, None),
- ("mesh.fill", {"type": 'F', "value": 'PRESS', "alt": True}, None),
- ("mesh.beautify_fill", {"type": 'F', "value": 'PRESS', "shift": True, "alt": True}, None),
- ("mesh.quads_convert_to_tris",
- {"type": 'T', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("quad_method", 'BEAUTY'),
- ("ngon_method", 'BEAUTY'),
- ],
- },
- ),
- ("mesh.quads_convert_to_tris",
- {"type": 'T', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("quad_method", 'FIXED'),
- ("ngon_method", 'CLIP'),
- ],
- },
- ),
- ("mesh.tris_convert_to_quads", {"type": 'J', "value": 'PRESS', "alt": True}, None),
- ("mesh.rip_move",
- {"type": 'V', "value": 'PRESS'},
- {"properties":
- [("MESH_OT_rip",
- [("use_fill", False),
- ],
- ),
- ],
- },
- ),
- ("mesh.rip_move",
- {"type": 'V', "value": 'PRESS', "alt": True},
- {"properties":
- [("MESH_OT_rip",
- [("use_fill", True),
- ],
- ),
- ],
- },
- ),
- ("mesh.rip_edge_move", {"type": 'D', "value": 'PRESS', "alt": True}, None),
- ("mesh.merge", {"type": 'M', "value": 'PRESS', "alt": True}, None),
- ("transform.shrink_fatten", {"type": 'S', "value": 'PRESS', "alt": True}, None),
- ("mesh.edge_face_add", {"type": 'F', "value": 'PRESS'}, None),
- ("mesh.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
- ("wm.call_menu",
- {"type": 'A', "value": 'PRESS', "shift": True},
- {"properties":
- [("name", 'VIEW3D_MT_mesh_add'),
- ],
- },
- ),
- ("mesh.separate", {"type": 'P', "value": 'PRESS'}, None),
- ("mesh.split", {"type": 'Y', "value": 'PRESS'}, None),
- ("mesh.vert_connect_path", {"type": 'J', "value": 'PRESS'}, None),
- ("transform.vert_slide", {"type": 'V', "value": 'PRESS', "shift": True}, None),
- ("mesh.dupli_extrude_cursor",
- {"type": 'ACTIONMOUSE', "value": 'CLICK', "ctrl": True},
- {"properties":
- [("rotate_source", True),
- ],
- },
- ),
- ("mesh.dupli_extrude_cursor",
- {"type": 'ACTIONMOUSE', "value": 'CLICK', "shift": True, "ctrl": True},
- {"properties":
- [("rotate_source", False),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'X', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_edit_mesh_delete'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'DEL', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_edit_mesh_delete'),
- ],
- },
- ),
- ("mesh.dissolve_mode", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
- ("mesh.dissolve_mode", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None),
- ("mesh.knife_tool",
- {"type": 'K', "value": 'PRESS'},
- {"properties":
- [("use_occlude_geometry", True),
- ("only_selected", False),
- ],
- },
- ),
- ("mesh.knife_tool",
- {"type": 'K', "value": 'PRESS', "shift": True},
- {"properties":
- [("use_occlude_geometry", False),
- ("only_selected", True),
- ],
- },
- ),
- ("object.vertex_parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
- ("wm.call_menu",
- {"type": 'W', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_edit_mesh_specials'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'F', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("name", 'VIEW3D_MT_edit_mesh_faces'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'E', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("name", 'VIEW3D_MT_edit_mesh_edges'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'V', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("name", 'VIEW3D_MT_edit_mesh_vertices'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'H', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("name", 'VIEW3D_MT_hook'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'U', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_uv_map'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'G', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("name", 'VIEW3D_MT_vertex_group'),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'ZERO', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 0),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'ONE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 1),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'TWO', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 2),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'THREE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 3),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'FOUR', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 4),
- ],
- },
- ),
- ("object.subdivision_set",
- {"type": 'FIVE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("level", 5),
- ],
- },
- ),
- ("wm.context_cycle_enum",
- {"type": 'O', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit_falloff'),
- ("wrap", True),
- ],
- },
- ),
- ("wm.context_toggle_enum",
- {"type": 'O', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit'),
- ("value_1", 'DISABLED'),
- ("value_2", 'ENABLED'),
- ],
- },
- ),
- ("wm.context_toggle_enum",
- {"type": 'O', "value": 'PRESS', "alt": True},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit'),
- ("value_1", 'DISABLED'),
- ("value_2", 'CONNECTED'),
- ],
- },
- ),
- ],
- },
- ),
- ("Armature",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("armature.hide",
- {"type": 'H', "value": 'PRESS'},
- {"properties":
- [("unselected", False),
- ],
- },
- ),
- ("armature.hide",
- {"type": 'H', "value": 'PRESS', "shift": True},
- {"properties":
- [("unselected", True),
- ],
- },
- ),
- ("armature.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
- ("armature.align", {"type": 'A', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("armature.calculate_roll", {"type": 'N', "value": 'PRESS', "ctrl": True}, None),
- ("armature.roll_clear", {"type": 'R', "value": 'PRESS', "alt": True}, None),
- ("armature.switch_direction", {"type": 'F', "value": 'PRESS', "alt": True}, None),
- ("armature.bone_primitive_add", {"type": 'A', "value": 'PRESS', "shift": True}, None),
- ("armature.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
- ("armature.parent_clear", {"type": 'P', "value": 'PRESS', "alt": True}, None),
- ("armature.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("armature.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("armature.select_mirror",
- {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("armature.select_hierarchy",
- {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("direction", 'PARENT'),
- ("extend", False),
- ],
- },
- ),
- ("armature.select_hierarchy",
- {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True},
- {"properties":
- [("direction", 'PARENT'),
- ("extend", True),
- ],
- },
- ),
- ("armature.select_hierarchy",
- {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("direction", 'CHILD'),
- ("extend", False),
- ],
- },
- ),
- ("armature.select_hierarchy",
- {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True},
- {"properties":
- [("direction", 'CHILD'),
- ("extend", True),
- ],
- },
- ),
- ("armature.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
- ("armature.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
- ("armature.select_similar", {"type": 'G', "value": 'PRESS', "shift": True}, None),
- ("armature.select_linked", {"type": 'L', "value": 'PRESS'}, None),
- ("armature.shortest_path_pick", {"type": 'SELECTMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("wm.call_menu",
- {"type": 'X', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_edit_armature_delete'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'DEL', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_edit_armature_delete'),
- ],
- },
- ),
- ("armature.dissolve", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
- ("armature.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
- ("armature.extrude_move", {"type": 'E', "value": 'PRESS'}, None),
- ("armature.extrude_forked", {"type": 'E', "value": 'PRESS', "shift": True}, None),
- ("armature.click_extrude", {"type": 'ACTIONMOUSE', "value": 'CLICK', "ctrl": True}, None),
- ("armature.fill", {"type": 'F', "value": 'PRESS'}, None),
- ("armature.merge", {"type": 'M', "value": 'PRESS', "alt": True}, None),
- ("armature.split", {"type": 'Y', "value": 'PRESS'}, None),
- ("armature.separate", {"type": 'P', "value": 'PRESS'}, None),
- ("wm.call_menu",
- {"type": 'W', "value": 'PRESS', "shift": True},
- {"properties":
- [("name", 'VIEW3D_MT_bone_options_toggle'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'W', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("name", 'VIEW3D_MT_bone_options_enable'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'W', "value": 'PRESS', "alt": True},
- {"properties":
- [("name", 'VIEW3D_MT_bone_options_disable'),
- ],
- },
- ),
- ("armature.layers_show_all", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True}, None),
- ("armature.armature_layers", {"type": 'M', "value": 'PRESS', "shift": True}, None),
- ("armature.bone_layers", {"type": 'M', "value": 'PRESS'}, None),
- ("transform.transform",
- {"type": 'S', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("mode", 'BONE_SIZE'),
- ],
- },
- ),
- ("transform.transform",
- {"type": 'S', "value": 'PRESS', "alt": True},
- {"properties":
- [("mode", 'BONE_ENVELOPE'),
- ],
- },
- ),
- ("transform.transform",
- {"type": 'R', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("mode", 'BONE_ROLL'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'W', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_armature_specials'),
- ],
- },
- ),
- ],
- },
- ),
- ("Metaball",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("object.metaball_add", {"type": 'A', "value": 'PRESS', "shift": True}, None),
- ("mball.reveal_metaelems", {"type": 'H', "value": 'PRESS', "alt": True}, None),
- ("mball.hide_metaelems",
- {"type": 'H', "value": 'PRESS'},
- {"properties":
- [("unselected", False),
- ],
- },
- ),
- ("mball.hide_metaelems",
- {"type": 'H', "value": 'PRESS', "shift": True},
- {"properties":
- [("unselected", True),
- ],
- },
- ),
- ("mball.delete_metaelems", {"type": 'X', "value": 'PRESS'}, None),
- ("mball.delete_metaelems", {"type": 'DEL', "value": 'PRESS'}, None),
- ("mball.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
- ("mball.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("mball.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("mball.select_similar", {"type": 'G', "value": 'PRESS', "shift": True}, None),
- ("wm.context_cycle_enum",
- {"type": 'O', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit_falloff'),
- ("wrap", True),
- ],
- },
- ),
- ("wm.context_toggle_enum",
- {"type": 'O', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit'),
- ("value_1", 'DISABLED'),
- ("value_2", 'ENABLED'),
- ],
- },
- ),
- ("wm.context_toggle_enum",
- {"type": 'O', "value": 'PRESS', "alt": True},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit'),
- ("value_1", 'DISABLED'),
- ("value_2", 'CONNECTED'),
- ],
- },
- ),
- ],
- },
- ),
- ("Lattice",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("lattice.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("lattice.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("lattice.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
- ("lattice.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
- ("object.vertex_parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
- ("lattice.flip", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
- ("wm.call_menu",
- {"type": 'H', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("name", 'VIEW3D_MT_hook'),
- ],
- },
- ),
- ("wm.context_cycle_enum",
- {"type": 'O', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit_falloff'),
- ("wrap", True),
- ],
- },
- ),
- ("wm.context_toggle_enum",
- {"type": 'O', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit'),
- ("value_1", 'DISABLED'),
- ("value_2", 'ENABLED'),
- ],
- },
- ),
- ],
- },
- ),
- ("Particle",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("particle.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("particle.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("particle.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
- ("particle.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
- ("particle.select_linked",
- {"type": 'L', "value": 'PRESS'},
- {"properties":
- [("deselect", False),
- ],
- },
- ),
- ("particle.select_linked",
- {"type": 'L', "value": 'PRESS', "shift": True},
- {"properties":
- [("deselect", True),
- ],
- },
- ),
- ("particle.delete", {"type": 'X', "value": 'PRESS'}, None),
- ("particle.delete", {"type": 'DEL', "value": 'PRESS'}, None),
- ("particle.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
- ("particle.hide",
- {"type": 'H', "value": 'PRESS'},
- {"properties":
- [("unselected", False),
- ],
- },
- ),
- ("particle.hide",
- {"type": 'H', "value": 'PRESS', "shift": True},
- {"properties":
- [("unselected", True),
- ],
- },
- ),
- ("particle.brush_edit", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("particle.brush_edit", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, None),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS'},
- {"properties":
- [("data_path_primary", 'tool_settings.particle_edit.brush.size'),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path_primary", 'tool_settings.particle_edit.brush.strength'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'W', "value": 'PRESS'},
- {"properties":
- [("name", 'VIEW3D_MT_particle_specials'),
- ],
- },
- ),
- ("particle.weight_set", {"type": 'K', "value": 'PRESS', "shift": True}, None),
- ("wm.context_cycle_enum",
- {"type": 'O', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit_falloff'),
- ("wrap", True),
- ],
- },
- ),
- ("wm.context_toggle_enum",
- {"type": 'O', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit'),
- ("value_1", 'DISABLED'),
- ("value_2", 'ENABLED'),
- ],
- },
- ),
- ],
- },
- ),
- ("Font",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("font.style_toggle",
- {"type": 'B', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("style", 'BOLD'),
- ],
- },
- ),
- ("font.style_toggle",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("style", 'ITALIC'),
- ],
- },
- ),
- ("font.style_toggle",
- {"type": 'U', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("style", 'UNDERLINE'),
- ],
- },
- ),
- ("font.style_toggle",
- {"type": 'P', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("style", 'SMALL_CAPS'),
- ],
- },
- ),
- ("font.delete",
- {"type": 'DEL', "value": 'PRESS'},
- {"properties":
- [("type", 'NEXT_OR_SELECTION'),
- ],
- },
- ),
- ("font.delete",
- {"type": 'DEL', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'NEXT_WORD'),
- ],
- },
- ),
- ("font.delete",
- {"type": 'BACK_SPACE', "value": 'PRESS'},
- {"properties":
- [("type", 'PREVIOUS_OR_SELECTION'),
- ],
- },
- ),
- ("font.delete",
- {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'PREVIOUS_OR_SELECTION'),
- ],
- },
- ),
- ("font.delete",
- {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'PREVIOUS_WORD'),
- ],
- },
- ),
- ("font.move",
- {"type": 'HOME', "value": 'PRESS'},
- {"properties":
- [("type", 'LINE_BEGIN'),
- ],
- },
- ),
- ("font.move",
- {"type": 'END', "value": 'PRESS'},
- {"properties":
- [("type", 'LINE_END'),
- ],
- },
- ),
- ("font.move",
- {"type": 'LEFT_ARROW', "value": 'PRESS'},
- {"properties":
- [("type", 'PREVIOUS_CHARACTER'),
- ],
- },
- ),
- ("font.move",
- {"type": 'RIGHT_ARROW', "value": 'PRESS'},
- {"properties":
- [("type", 'NEXT_CHARACTER'),
- ],
- },
- ),
- ("font.move",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'PREVIOUS_WORD'),
- ],
- },
- ),
- ("font.move",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'NEXT_WORD'),
- ],
- },
- ),
- ("font.move",
- {"type": 'UP_ARROW', "value": 'PRESS'},
- {"properties":
- [("type", 'PREVIOUS_LINE'),
- ],
- },
- ),
- ("font.move",
- {"type": 'DOWN_ARROW', "value": 'PRESS'},
- {"properties":
- [("type", 'NEXT_LINE'),
- ],
- },
- ),
- ("font.move",
- {"type": 'PAGE_UP', "value": 'PRESS'},
- {"properties":
- [("type", 'PREVIOUS_PAGE'),
- ],
- },
- ),
- ("font.move",
- {"type": 'PAGE_DOWN', "value": 'PRESS'},
- {"properties":
- [("type", 'NEXT_PAGE'),
- ],
- },
- ),
- ("font.move_select",
- {"type": 'HOME', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'LINE_BEGIN'),
- ],
- },
- ),
- ("font.move_select",
- {"type": 'END', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'LINE_END'),
- ],
- },
- ),
- ("font.move_select",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'PREVIOUS_CHARACTER'),
- ],
- },
- ),
- ("font.move_select",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'NEXT_CHARACTER'),
- ],
- },
- ),
- ("font.move_select",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("type", 'PREVIOUS_WORD'),
- ],
- },
- ),
- ("font.move_select",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("type", 'NEXT_WORD'),
- ],
- },
- ),
- ("font.move_select",
- {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'PREVIOUS_LINE'),
- ],
- },
- ),
- ("font.move_select",
- {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'NEXT_LINE'),
- ],
- },
- ),
- ("font.move_select",
- {"type": 'PAGE_UP', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'PREVIOUS_PAGE'),
- ],
- },
- ),
- ("font.move_select",
- {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'NEXT_PAGE'),
- ],
- },
- ),
- ("font.change_spacing",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
- {"properties":
- [("delta", -1),
- ],
- },
- ),
- ("font.change_spacing",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
- {"properties":
- [("delta", 1),
- ],
- },
- ),
- ("font.change_character",
- {"type": 'UP_ARROW', "value": 'PRESS', "alt": True},
- {"properties":
- [("delta", 1),
- ],
- },
- ),
- ("font.change_character",
- {"type": 'DOWN_ARROW', "value": 'PRESS', "alt": True},
- {"properties":
- [("delta", -1),
- ],
- },
- ),
- ("font.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
- ("font.text_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
- ("font.text_cut", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
- ("font.text_paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
- ("font.line_break", {"type": 'RET', "value": 'PRESS'}, None),
- ("font.text_insert", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
- ("font.text_insert",
- {"type": 'BACK_SPACE', "value": 'PRESS', "alt": True},
- {"properties":
- [("accent", True),
- ],
- },
- ),
- ],
- },
- ),
- ("Object Non-modal",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("object.mode_set",
- {"type": 'TAB', "value": 'PRESS'},
- {"properties":
- [("mode", 'EDIT'),
- ("toggle", True),
- ],
- },
- ),
- ("object.mode_set",
- {"type": 'TAB', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("mode", 'POSE'),
- ("toggle", True),
- ],
- },
- ),
- ("object.mode_set",
- {"type": 'V', "value": 'PRESS'},
- {"properties":
- [("mode", 'VERTEX_PAINT'),
- ("toggle", True),
- ],
- },
- ),
- ("object.mode_set",
- {"type": 'TAB', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("mode", 'WEIGHT_PAINT'),
- ("toggle", True),
- ],
- },
- ),
- ("object.origin_set", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
- ],
- },
- ),
- ("3D View",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("view3d.cursor3d", {"type": 'ACTIONMOUSE', "value": 'CLICK'}, None),
- ("view3d.rotate", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
- ("view3d.move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
- ("view3d.zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("view3d.dolly", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("view3d.view_selected",
- {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("use_all_regions", True),
- ],
- },
- ),
- ("view3d.view_selected",
- {"type": 'NUMPAD_PERIOD', "value": 'PRESS'},
- {"properties":
- [("use_all_regions", False),
- ],
- },
- ),
- ("view3d.view_lock_to_active", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "shift": True}, None),
- ("view3d.view_lock_clear", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "alt": True}, None),
- ("view3d.navigate", {"type": 'F', "value": 'PRESS', "shift": True}, None),
- ("view3d.smoothview", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
- ("view3d.rotate", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
- ("view3d.rotate", {"type": 'MOUSEROTATE', "value": 'ANY'}, None),
- ("view3d.move", {"type": 'TRACKPADPAN', "value": 'ANY', "shift": True}, None),
- ("view3d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
- ("view3d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
- ("view3d.zoom",
- {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
- {"properties":
- [("delta", 1),
- ],
- },
- ),
- ("view3d.zoom",
- {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
- {"properties":
- [("delta", -1),
- ],
- },
- ),
- ("view3d.zoom",
- {"type": 'EQUAL', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("delta", 1),
- ],
- },
- ),
- ("view3d.zoom",
- {"type": 'MINUS', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("delta", -1),
- ],
- },
- ),
- ("view3d.zoom",
- {"type": 'WHEELINMOUSE', "value": 'PRESS'},
- {"properties":
- [("delta", 1),
- ],
- },
- ),
- ("view3d.zoom",
- {"type": 'WHEELOUTMOUSE', "value": 'PRESS'},
- {"properties":
- [("delta", -1),
- ],
- },
- ),
- ("view3d.dolly",
- {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
- {"properties":
- [("delta", 1),
- ],
- },
- ),
- ("view3d.dolly",
- {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
- {"properties":
- [("delta", -1),
- ],
- },
- ),
- ("view3d.dolly",
- {"type": 'EQUAL', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("delta", 1),
- ],
- },
- ),
- ("view3d.dolly",
- {"type": 'MINUS', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("delta", -1),
- ],
- },
- ),
- ("view3d.zoom_camera_1_to_1", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "shift": True}, None),
- ("view3d.view_center_camera", {"type": 'HOME', "value": 'PRESS'}, None),
- ("view3d.view_center_lock", {"type": 'HOME', "value": 'PRESS'}, None),
- ("view3d.view_center_cursor", {"type": 'HOME', "value": 'PRESS', "alt": True}, None),
- ("view3d.view_center_pick", {"type": 'F', "value": 'PRESS', "alt": True}, None),
- ("view3d.view_all",
- {"type": 'HOME', "value": 'PRESS'},
- {"properties":
- [("center", False),
- ],
- },
- ),
- ("view3d.view_all",
- {"type": 'HOME', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("use_all_regions", True),
- ("center", False),
- ],
- },
- ),
- ("view3d.view_all",
- {"type": 'C', "value": 'PRESS', "shift": True},
- {"properties":
- [("center", True),
- ],
- },
- ),
- ("view3d.view_camera", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
- ("view3d.view_axis",
- {"type": 'NUMPAD_1', "value": 'PRESS'},
- {"properties":
- [("type", 'FRONT'),
- ],
- },
- ),
- ("view3d.view_orbit",
- {"type": 'NUMPAD_2', "value": 'PRESS'},
- {"properties":
- [("type", 'ORBITDOWN'),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NUMPAD_3', "value": 'PRESS'},
- {"properties":
- [("type", 'RIGHT'),
- ],
- },
- ),
- ("view3d.view_orbit",
- {"type": 'NUMPAD_4', "value": 'PRESS'},
- {"properties":
- [("type", 'ORBITLEFT'),
- ],
- },
- ),
- ("view3d.view_persportho", {"type": 'NUMPAD_5', "value": 'PRESS'}, None),
- ("view3d.view_orbit",
- {"type": 'NUMPAD_6', "value": 'PRESS'},
- {"properties":
- [("type", 'ORBITRIGHT'),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NUMPAD_7', "value": 'PRESS'},
- {"properties":
- [("type", 'TOP'),
- ],
- },
- ),
- ("view3d.view_orbit",
- {"type": 'NUMPAD_8', "value": 'PRESS'},
- {"properties":
- [("type", 'ORBITUP'),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NUMPAD_1', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'BACK'),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NUMPAD_3', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'LEFT'),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NUMPAD_7', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'BOTTOM'),
- ],
- },
- ),
- ("view3d.view_pan",
- {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'PANDOWN'),
- ],
- },
- ),
- ("view3d.view_pan",
- {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'PANLEFT'),
- ],
- },
- ),
- ("view3d.view_pan",
- {"type": 'NUMPAD_6', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'PANRIGHT'),
- ],
- },
- ),
- ("view3d.view_pan",
- {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'PANUP'),
- ],
- },
- ),
- ("view3d.view_roll",
- {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'LEFT'),
- ],
- },
- ),
- ("view3d.view_roll",
- {"type": 'NUMPAD_6', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'RIGHT'),
- ],
- },
- ),
- ("view3d.view_orbit",
- {"type": 'NUMPAD_9', "value": 'PRESS'},
- {"properties":
- [("angle", 3.1415927),
- ("type", 'ORBITRIGHT'),
- ],
- },
- ),
- ("view3d.view_pan",
- {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'PANRIGHT'),
- ],
- },
- ),
- ("view3d.view_pan",
- {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'PANLEFT'),
- ],
- },
- ),
- ("view3d.view_pan",
- {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'PANUP'),
- ],
- },
- ),
- ("view3d.view_pan",
- {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'PANDOWN'),
- ],
- },
- ),
- ("view3d.view_orbit",
- {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("type", 'ORBITLEFT'),
- ],
- },
- ),
- ("view3d.view_orbit",
- {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("type", 'ORBITRIGHT'),
- ],
- },
- ),
- ("view3d.view_orbit",
- {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("type", 'ORBITUP'),
- ],
- },
- ),
- ("view3d.view_orbit",
- {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("type", 'ORBITDOWN'),
- ],
- },
- ),
- ("view3d.view_roll",
- {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("type", 'LEFT'),
- ],
- },
- ),
- ("view3d.view_roll",
- {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("type", 'RIGHT'),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'FRONT'),
- ("align_active", True),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'RIGHT'),
- ("align_active", True),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NUMPAD_7', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'TOP'),
- ("align_active", True),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("type", 'BACK'),
- ("align_active", True),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("type", 'LEFT'),
- ("align_active", True),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NUMPAD_7', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("type", 'BOTTOM'),
- ("align_active", True),
- ],
- },
- ),
- ("view3d.ndof_orbit_zoom", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
- ("view3d.ndof_orbit", {"type": 'NDOF_MOTION', "value": 'ANY', "ctrl": True}, None),
- ("view3d.ndof_pan", {"type": 'NDOF_MOTION', "value": 'ANY', "shift": True}, None),
- ("view3d.ndof_all", {"type": 'NDOF_MOTION', "value": 'ANY', "shift": True, "ctrl": True}, None),
- ("view3d.view_selected",
- {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'},
- {"properties":
- [("use_all_regions", False),
- ],
- },
- ),
- ("view3d.view_roll",
- {"type": 'NDOF_BUTTON_ROLL_CCW', "value": 'PRESS'},
- {"properties":
- [("type", 'LEFT'),
- ],
- },
- ),
- ("view3d.view_roll",
- {"type": 'NDOF_BUTTON_ROLL_CCW', "value": 'PRESS'},
- {"properties":
- [("type", 'RIGHT'),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NDOF_BUTTON_FRONT', "value": 'PRESS'},
- {"properties":
- [("type", 'FRONT'),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NDOF_BUTTON_BACK', "value": 'PRESS'},
- {"properties":
- [("type", 'BACK'),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NDOF_BUTTON_LEFT', "value": 'PRESS'},
- {"properties":
- [("type", 'LEFT'),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NDOF_BUTTON_RIGHT', "value": 'PRESS'},
- {"properties":
- [("type", 'RIGHT'),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NDOF_BUTTON_TOP', "value": 'PRESS'},
- {"properties":
- [("type", 'TOP'),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NDOF_BUTTON_BOTTOM', "value": 'PRESS'},
- {"properties":
- [("type", 'BOTTOM'),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NDOF_BUTTON_FRONT', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'FRONT'),
- ("align_active", True),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NDOF_BUTTON_RIGHT', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'RIGHT'),
- ("align_active", True),
- ],
- },
- ),
- ("view3d.view_axis",
- {"type": 'NDOF_BUTTON_TOP', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'TOP'),
- ("align_active", True),
- ],
- },
- ),
- ("view3d.layers",
- {"type": 'ACCENT_GRAVE', "value": 'PRESS'},
- {"properties":
- [("nr", 0),
- ],
- },
- ),
- ("view3d.layers",
- {"type": 'ONE', "value": 'PRESS', "any": True},
- {"properties":
- [("nr", 1),
- ],
- },
- ),
- ("view3d.layers",
- {"type": 'TWO', "value": 'PRESS', "any": True},
- {"properties":
- [("nr", 2),
- ],
- },
- ),
- ("view3d.layers",
- {"type": 'THREE', "value": 'PRESS', "any": True},
- {"properties":
- [("nr", 3),
- ],
- },
- ),
- ("view3d.layers",
- {"type": 'FOUR', "value": 'PRESS', "any": True},
- {"properties":
- [("nr", 4),
- ],
- },
- ),
- ("view3d.layers",
- {"type": 'FIVE', "value": 'PRESS', "any": True},
- {"properties":
- [("nr", 5),
- ],
- },
- ),
- ("view3d.layers",
- {"type": 'SIX', "value": 'PRESS', "any": True},
- {"properties":
- [("nr", 6),
- ],
- },
- ),
- ("view3d.layers",
- {"type": 'SEVEN', "value": 'PRESS', "any": True},
- {"properties":
- [("nr", 7),
- ],
- },
- ),
- ("view3d.layers",
- {"type": 'EIGHT', "value": 'PRESS', "any": True},
- {"properties":
- [("nr", 8),
- ],
- },
- ),
- ("view3d.layers",
- {"type": 'NINE', "value": 'PRESS', "any": True},
- {"properties":
- [("nr", 9),
- ],
- },
- ),
- ("view3d.layers",
- {"type": 'ZERO', "value": 'PRESS', "any": True},
- {"properties":
- [("nr", 10),
- ],
- },
- ),
- ("wm.context_toggle_enum",
- {"type": 'Z', "value": 'PRESS', "alt": True},
- {"properties":
- [("data_path", 'space_data.shading.type'),
- ("value_1", 'SOLID'),
- ("value_2", 'TEXTURED'),
- ],
- },
- ),
- ("view3d.toggle_render", {"type": 'Z', "value": 'PRESS', "shift": True}, None),
- ("view3d.toggle_xray_draw_option", {"type": 'Z', "value": 'PRESS'}, None),
- ("wm.context_toggle",
- {"type": 'Z', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.use_occlude_geometry'),
- ],
- },
- ),
- ("view3d.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS'},
- {"properties":
- [("extend", False),
- ("deselect", False),
- ("toggle", False),
- ("center", False),
- ("enumerate", False),
- ("object", False),
- ],
- },
- ),
- ("view3d.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", False),
- ("deselect", False),
- ("toggle", True),
- ("center", False),
- ("enumerate", False),
- ("object", False),
- ],
- },
- ),
- ("view3d.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("extend", False),
- ("deselect", False),
- ("toggle", False),
- ("center", True),
- ("enumerate", False),
- ("object", True),
- ],
- },
- ),
- ("view3d.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "alt": True},
- {"properties":
- [("extend", False),
- ("deselect", False),
- ("toggle", False),
- ("center", False),
- ("enumerate", True),
- ("object", False),
- ],
- },
- ),
- ("view3d.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("extend", True),
- ("deselect", False),
- ("toggle", True),
- ("center", True),
- ("enumerate", False),
- ("object", False),
- ],
- },
- ),
- ("view3d.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("extend", False),
- ("deselect", False),
- ("toggle", False),
- ("center", True),
- ("enumerate", True),
- ("object", False),
- ],
- },
- ),
- ("view3d.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("extend", False),
- ("deselect", False),
- ("toggle", True),
- ("center", False),
- ("enumerate", True),
- ("object", False),
- ],
- },
- ),
- ("view3d.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
- {"properties":
- [("extend", False),
- ("deselect", False),
- ("toggle", True),
- ("center", True),
- ("enumerate", True),
- ("object", False),
- ],
- },
- ),
- ("view3d.select_border", {"type": 'B', "value": 'PRESS'}, None),
- ("view3d.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True},
- {"properties":
- [("deselect", False),
- ],
- },
- ),
- ("view3d.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True},
- {"properties":
- [("deselect", True),
- ],
- },
- ),
- ("view3d.select_circle", {"type": 'C', "value": 'PRESS'}, None),
- ("view3d.clip_border", {"type": 'B', "value": 'PRESS', "alt": True}, None),
- ("view3d.zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None),
- ("view3d.render_border", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
- ("view3d.clear_render_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("view3d.camera_to_view", {"type": 'NUMPAD_0', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("view3d.object_as_camera", {"type": 'NUMPAD_0', "value": 'PRESS', "ctrl": True}, None),
- ("wm.call_menu",
- {"type": 'S', "value": 'PRESS', "shift": True},
- {"properties":
- [("name", 'VIEW3D_MT_snap'),
- ],
- },
- ),
- ("view3d.copybuffer", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
- ("view3d.pastebuffer", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
- ("wm.context_set_enum",
- {"type": 'COMMA', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.transform_pivot_point'),
- ("value", 'BOUNDING_BOX_CENTER'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'COMMA', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'tool_settings.transform_pivot_point'),
- ("value", 'MEDIAN_POINT'),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'COMMA', "value": 'PRESS', "alt": True},
- {"properties":
- [("data_path", 'tool_settings.use_transform_pivot_point_align'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'PERIOD', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.transform_pivot_point'),
- ("value", 'CURSOR'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'PERIOD', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'tool_settings.transform_pivot_point'),
- ("value", 'INDIVIDUAL_ORIGINS'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'PERIOD', "value": 'PRESS', "alt": True},
- {"properties":
- [("data_path", 'tool_settings.transform_pivot_point'),
- ("value", 'ACTIVE_ELEMENT'),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'SPACE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'space_data.show_manipulator'),
- ],
- },
- ),
- ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
- ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
- ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
- ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
- ("transform.bend", {"type": 'W', "value": 'PRESS', "shift": True}, None),
- ("transform.tosphere", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True}, None),
- ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
- ("transform.select_orientation", {"type": 'SPACE', "value": 'PRESS', "alt": True}, None),
- ("transform.create_orientation",
- {"type": 'SPACE', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("use", True),
- ],
- },
- ),
- ("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
- ("wm.context_toggle",
- {"type": 'TAB', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.use_snap'),
- ],
- },
- ),
- ("wm.context_menu_enum",
- {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("data_path", 'tool_settings.snap_element'),
- ],
- },
- ),
- ("object.transform_axis_target", {"type": 'T', "value": 'PRESS', "shift": True}, None),
- ("transform.translate",
- {"type": 'T', "value": 'PRESS', "shift": True},
- {"properties":
- [("texture_space", True),
- ],
- },
- ),
- ("transform.resize",
- {"type": 'T', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("texture_space", True),
- ],
- },
- ),
- ("transform.skin_resize", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
- ],
- },
- ),
- ("Manipulators",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [],
- },
- ),
- ("Backdrop Transform Widget",
- {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ("Backdrop Crop Widget",
- {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ("Sun Beams Widget",
- {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ("Corner Pin Widget",
- {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ("UV Transform Manipulator",
- {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ("Spot Light Widgets",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ("Area Light Widgets",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ("Target Light Widgets",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ("Force Field Widgets",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ("Camera Widgets",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ("Camera View Widgets",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ("Armature Spline Widgets",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ("View3D Navigate",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ("Animation",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("anim.change_frame", {"type": 'ACTIONMOUSE', "value": 'PRESS'}, None),
- ("wm.context_toggle",
- {"type": 'T', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'space_data.show_seconds'),
- ],
- },
- ),
- ("anim.previewrange_set", {"type": 'P', "value": 'PRESS'}, None),
- ("anim.previewrange_clear", {"type": 'P', "value": 'PRESS', "alt": True}, None),
- ],
- },
- ),
- ("Animation Channels",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("anim.channels_click", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("anim.channels_click",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("anim.channels_click",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("children_only", True),
- ],
- },
- ),
- ("anim.channels_rename", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("anim.channels_rename", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
- ("anim.channel_select_keys", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
- ("anim.channel_select_keys",
- {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "shift": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
- ("anim.channels_select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("anim.channels_select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("anim.channels_select_border", {"type": 'B', "value": 'PRESS'}, None),
- ("anim.channels_select_border", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
- ("anim.channels_delete", {"type": 'X', "value": 'PRESS'}, None),
- ("anim.channels_delete", {"type": 'DEL', "value": 'PRESS'}, None),
- ("anim.channels_setting_toggle", {"type": 'W', "value": 'PRESS', "shift": True}, None),
- ("anim.channels_setting_enable", {"type": 'W', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("anim.channels_setting_disable", {"type": 'W', "value": 'PRESS', "alt": True}, None),
- ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
- ("anim.channels_expand", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
- ("anim.channels_collapse", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
- ("anim.channels_expand",
- {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("all", False),
- ],
- },
- ),
- ("anim.channels_collapse",
- {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("all", False),
- ],
- },
- ),
- ("anim.channels_move",
- {"type": 'PAGE_UP', "value": 'PRESS'},
- {"properties":
- [("direction", 'UP'),
- ],
- },
- ),
- ("anim.channels_move",
- {"type": 'PAGE_DOWN', "value": 'PRESS'},
- {"properties":
- [("direction", 'DOWN'),
- ],
- },
- ),
- ("anim.channels_move",
- {"type": 'PAGE_UP', "value": 'PRESS', "shift": True},
- {"properties":
- [("direction", 'TOP'),
- ],
- },
- ),
- ("anim.channels_move",
- {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True},
- {"properties":
- [("direction", 'BOTTOM'),
- ],
- },
- ),
- ("anim.channels_group", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
- ("anim.channels_ungroup", {"type": 'G', "value": 'PRESS', "alt": True}, None),
- ],
- },
- ),
- ("UV Editor",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("wm.context_toggle",
- {"type": 'Q', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.use_uv_sculpt'),
- ],
- },
- ),
- ("uv.mark_seam", {"type": 'E', "value": 'PRESS', "ctrl": True}, None),
- ("uv.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS'},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("uv.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("uv.select_loop",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "alt": True},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("uv.select_loop",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("uv.select_split", {"type": 'Y', "value": 'PRESS'}, None),
- ("uv.select_border",
- {"type": 'B', "value": 'PRESS'},
- {"properties":
- [("pinned", False),
- ],
- },
- ),
- ("uv.select_border",
- {"type": 'B', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("pinned", True),
- ],
- },
- ),
- ("uv.circle_select", {"type": 'C', "value": 'PRESS'}, None),
- ("uv.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True},
- {"properties":
- [("deselect", False),
- ],
- },
- ),
- ("uv.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True},
- {"properties":
- [("deselect", True),
- ],
- },
- ),
- ("uv.select_linked",
- {"type": 'L', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("extend", True),
- ("deselect", False),
- ],
- },
- ),
- ("uv.select_linked_pick",
- {"type": 'L', "value": 'PRESS'},
- {"properties":
- [("extend", True),
- ("deselect", False),
- ],
- },
- ),
- ("uv.select_linked",
- {"type": 'L', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("extend", False),
- ("deselect", True),
- ],
- },
- ),
- ("uv.select_linked_pick",
- {"type": 'L', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", False),
- ("deselect", True),
- ],
- },
- ),
- ("uv.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
- ("uv.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
- ("uv.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("uv.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("uv.select_pinned", {"type": 'P', "value": 'PRESS', "shift": True}, None),
- ("wm.call_menu",
- {"type": 'W', "value": 'PRESS'},
- {"properties":
- [("name", 'IMAGE_MT_uvs_weldalign'),
- ],
- },
- ),
- ("uv.stitch", {"type": 'V', "value": 'PRESS'}, None),
- ("uv.pin",
- {"type": 'P', "value": 'PRESS'},
- {"properties":
- [("clear", False),
- ],
- },
- ),
- ("uv.pin",
- {"type": 'P', "value": 'PRESS', "alt": True},
- {"properties":
- [("clear", True),
- ],
- },
- ),
- ("uv.unwrap", {"type": 'E', "value": 'PRESS'}, None),
- ("uv.minimize_stretch", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
- ("uv.pack_islands", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
- ("uv.average_islands_scale", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
- ("uv.hide",
- {"type": 'H', "value": 'PRESS'},
- {"properties":
- [("unselected", False),
- ],
- },
- ),
- ("uv.hide",
- {"type": 'H', "value": 'PRESS', "shift": True},
- {"properties":
- [("unselected", True),
- ],
- },
- ),
- ("uv.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
- ("uv.cursor_set", {"type": 'ACTIONMOUSE', "value": 'PRESS'}, None),
- ("wm.call_menu",
- {"type": 'S', "value": 'PRESS', "shift": True},
- {"properties":
- [("name", 'IMAGE_MT_uvs_snap'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'TAB', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("name", 'IMAGE_MT_uvs_select_mode'),
- ],
- },
- ),
- ("wm.context_cycle_enum",
- {"type": 'O', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit_falloff'),
- ("wrap", True),
- ],
- },
- ),
- ("wm.context_toggle_enum",
- {"type": 'O', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit'),
- ("value_1", 'DISABLED'),
- ("value_2", 'ENABLED'),
- ],
- },
- ),
- ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
- ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
- ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
- ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
- ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
- ("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
- ("wm.context_toggle",
- {"type": 'TAB', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.use_snap'),
- ],
- },
- ),
- ("wm.context_menu_enum",
- {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("data_path", 'tool_settings.snap_uv_element'),
- ],
- },
- ),
- ],
- },
- ),
- ("UV Sculpt",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("wm.context_toggle",
- {"type": 'Q', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.use_uv_sculpt'),
- ],
- },
- ),
- ("sculpt.uv_sculpt_stroke",
- {"type": 'LEFTMOUSE', "value": 'PRESS'},
- {"properties":
- [("mode", 'NORMAL'),
- ],
- },
- ),
- ("sculpt.uv_sculpt_stroke",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("mode", 'INVERT'),
- ],
- },
- ),
- ("sculpt.uv_sculpt_stroke",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'RELAX'),
- ],
- },
- ),
- ("brush.scale_size",
- {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("scalar", 0.9),
- ],
- },
- ),
- ("brush.scale_size",
- {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("scalar", 1.1111112),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS'},
- {"properties":
- [("data_path_primary", 'tool_settings.uv_sculpt.brush.size'),
- ("data_path_secondary", 'tool_settings.unified_paint_settings.size'),
- ("use_secondary", 'tool_settings.unified_paint_settings.use_unified_size'),
- ("rotation_path", 'tool_settings.uv_sculpt.brush.texture_slot.angle'),
- ("color_path", 'tool_settings.uv_sculpt.brush.cursor_color_add'),
- ("fill_color_path", ''),
- ("fill_color_override_path", ''),
- ("fill_color_override_test_path", ''),
- ("zoom_path", ''),
- ("image_id", 'tool_settings.uv_sculpt.brush'),
- ("secondary_tex", False),
- ],
- },
- ),
- ("wm.radial_control",
- {"type": 'F', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path_primary", 'tool_settings.uv_sculpt.brush.strength'),
- ("data_path_secondary", 'tool_settings.unified_paint_settings.strength'),
- ("use_secondary", 'tool_settings.unified_paint_settings.use_unified_strength'),
- ("rotation_path", 'tool_settings.uv_sculpt.brush.texture_slot.angle'),
- ("color_path", 'tool_settings.uv_sculpt.brush.cursor_color_add'),
- ("fill_color_path", ''),
- ("fill_color_override_path", ''),
- ("fill_color_override_test_path", ''),
- ("zoom_path", ''),
- ("image_id", 'tool_settings.uv_sculpt.brush'),
- ("secondary_tex", False),
- ],
- },
- ),
- ("brush.uv_sculpt_tool_set",
- {"type": 'S', "value": 'PRESS'},
- {"properties":
- [("tool", 'RELAX'),
- ],
- },
- ),
- ("brush.uv_sculpt_tool_set",
- {"type": 'P', "value": 'PRESS'},
- {"properties":
- [("tool", 'PINCH'),
- ],
- },
- ),
- ("brush.uv_sculpt_tool_set",
- {"type": 'G', "value": 'PRESS'},
- {"properties":
- [("tool", 'GRAB'),
- ],
- },
- ),
- ],
- },
- ),
- ("Mask Editing",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("mask.new", {"type": 'N', "value": 'PRESS', "alt": True}, None),
- ("wm.call_menu",
- {"type": 'A', "value": 'PRESS', "shift": True},
- {"properties":
- [("name", 'MASK_MT_add'),
- ],
- },
- ),
- ("wm.context_cycle_enum",
- {"type": 'O', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.proportional_edit_falloff'),
- ("wrap", True),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'O', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.use_proportional_edit_mask'),
- ],
- },
- ),
- ("mask.add_vertex_slide", {"type": 'ACTIONMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("mask.add_feather_vertex_slide", {"type": 'ACTIONMOUSE', "value": 'PRESS', "shift": True}, None),
- ("mask.delete", {"type": 'X', "value": 'PRESS'}, None),
- ("mask.delete", {"type": 'DEL', "value": 'PRESS'}, None),
- ("mask.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS'},
- {"properties":
- [("extend", False),
- ("deselect", False),
- ("toggle", False),
- ],
- },
- ),
- ("mask.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", False),
- ("deselect", False),
- ("toggle", True),
- ],
- },
- ),
- ("mask.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("mask.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("mask.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
- ("mask.select_linked_pick",
- {"type": 'L', "value": 'PRESS'},
- {"properties":
- [("deselect", False),
- ],
- },
- ),
- ("mask.select_linked_pick",
- {"type": 'L', "value": 'PRESS', "shift": True},
- {"properties":
- [("deselect", True),
- ],
- },
- ),
- ("mask.select_border", {"type": 'B', "value": 'PRESS'}, None),
- ("mask.select_circle", {"type": 'C', "value": 'PRESS'}, None),
- ("mask.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True, "alt": True},
- {"properties":
- [("deselect", False),
- ],
- },
- ),
- ("mask.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
- {"properties":
- [("deselect", True),
- ],
- },
- ),
- ("mask.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
- ("mask.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
- ("mask.hide_view_clear", {"type": 'H', "value": 'PRESS', "alt": True}, None),
- ("mask.hide_view_set",
- {"type": 'H', "value": 'PRESS'},
- {"properties":
- [("unselected", False),
- ],
- },
- ),
- ("mask.hide_view_set",
- {"type": 'H', "value": 'PRESS', "shift": True},
- {"properties":
- [("unselected", True),
- ],
- },
- ),
- ("clip.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("mask.cyclic_toggle", {"type": 'C', "value": 'PRESS', "alt": True}, None),
- ("mask.slide_point", {"type": 'ACTIONMOUSE', "value": 'PRESS'}, None),
- ("mask.slide_spline_curvature", {"type": 'ACTIONMOUSE', "value": 'PRESS'}, None),
- ("mask.handle_type_set", {"type": 'V', "value": 'PRESS'}, None),
- ("mask.normals_make_consistent", {"type": 'N', "value": 'PRESS', "ctrl": True}, None),
- ("mask.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
- ("mask.parent_clear", {"type": 'P', "value": 'PRESS', "alt": True}, None),
- ("mask.shape_key_insert", {"type": 'I', "value": 'PRESS'}, None),
- ("mask.shape_key_clear", {"type": 'I', "value": 'PRESS', "alt": True}, None),
- ("mask.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
- ("mask.copy_splines", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
- ("mask.paste_splines", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
- ("uv.cursor_set", {"type": 'ACTIONMOUSE', "value": 'PRESS'}, None),
- ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
- ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
- ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
- ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
- ("transform.transform",
- {"type": 'S', "value": 'PRESS', "alt": True},
- {"properties":
- [("mode", 'MASK_SHRINKFATTEN'),
- ],
- },
- ),
- ],
- },
- ),
- ("Markers",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items":
- [("marker.add", {"type": 'M', "value": 'PRESS'}, None),
- ("marker.move", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
- ("marker.duplicate", {"type": 'D', "value": 'PRESS', "shift": True}, None),
- ("marker.select", {"type": 'SELECTMOUSE', "value": 'PRESS'}, None),
- ("marker.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("marker.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("extend", False),
- ("camera", True),
- ],
- },
- ),
- ("marker.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("extend", True),
- ("camera", True),
- ],
- },
- ),
- ("marker.select_border", {"type": 'B', "value": 'PRESS'}, None),
- ("marker.select_all", {"type": 'A', "value": 'PRESS'}, None),
- ("marker.delete", {"type": 'X', "value": 'PRESS'}, None),
- ("marker.delete", {"type": 'DEL', "value": 'PRESS'}, None),
- ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
- ("marker.move", {"type": 'G', "value": 'PRESS'}, None),
- ("marker.camera_bind", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
- ],
- },
- ),
- ("Graph Editor Generic",
- {"space_type": 'GRAPH_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("graph.properties", {"type": 'N', "value": 'PRESS'}, None),
- ("graph.extrapolation_type", {"type": 'E', "value": 'PRESS', "shift": True}, None),
- ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
- ("graph.hide",
- {"type": 'H', "value": 'PRESS'},
- {"properties":
- [("unselected", False),
- ],
- },
- ),
- ("graph.hide",
- {"type": 'H', "value": 'PRESS', "shift": True},
- {"properties":
- [("unselected", True),
- ],
- },
- ),
- ("graph.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
- ],
- },
- ),
- ("Graph Editor",
- {"space_type": 'GRAPH_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("wm.context_toggle",
- {"type": 'H', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'space_data.show_handles'),
- ],
- },
- ),
- ("graph.cursor_set", {"type": 'ACTIONMOUSE', "value": 'PRESS'}, None),
- ("graph.clickselect",
- {"type": 'SELECTMOUSE', "value": 'PRESS'},
- {"properties":
- [("extend", False),
- ("column", False),
- ("curves", False),
- ],
- },
- ),
- ("graph.clickselect",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "alt": True},
- {"properties":
- [("extend", False),
- ("column", True),
- ("curves", False),
- ],
- },
- ),
- ("graph.clickselect",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", True),
- ("column", False),
- ("curves", False),
- ],
- },
- ),
- ("graph.clickselect",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("extend", True),
- ("column", True),
- ("curves", False),
- ],
- },
- ),
- ("graph.clickselect",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("extend", False),
- ("column", False),
- ("curves", True),
- ],
- },
- ),
- ("graph.clickselect",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
- {"properties":
- [("extend", True),
- ("column", False),
- ("curves", True),
- ],
- },
- ),
- ("graph.select_leftright",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("mode", 'CHECK'),
- ("extend", False),
- ],
- },
- ),
- ("graph.select_leftright",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("mode", 'CHECK'),
- ("extend", True),
- ],
- },
- ),
- ("graph.select_leftright",
- {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("mode", 'LEFT'),
- ("extend", False),
- ],
- },
- ),
- ("graph.select_leftright",
- {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("mode", 'RIGHT'),
- ("extend", False),
- ],
- },
- ),
- ("graph.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("graph.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("graph.select_border",
- {"type": 'B', "value": 'PRESS'},
- {"properties":
- [("axis_range", False),
- ("include_handles", False),
- ],
- },
- ),
- ("graph.select_border",
- {"type": 'B', "value": 'PRESS', "alt": True},
- {"properties":
- [("axis_range", True),
- ("include_handles", False),
- ],
- },
- ),
- ("graph.select_border",
- {"type": 'B', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("axis_range", False),
- ("include_handles", True),
- ],
- },
- ),
- ("graph.select_border",
- {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("axis_range", True),
- ("include_handles", True),
- ],
- },
- ),
- ("graph.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True},
- {"properties":
- [("deselect", False),
- ],
- },
- ),
- ("graph.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True},
- {"properties":
- [("deselect", True),
- ],
- },
- ),
- ("graph.select_circle", {"type": 'C', "value": 'PRESS'}, None),
- ("graph.select_column",
- {"type": 'K', "value": 'PRESS'},
- {"properties":
- [("mode", 'KEYS'),
- ],
- },
- ),
- ("graph.select_column",
- {"type": 'K', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("mode", 'CFRA'),
- ],
- },
- ),
- ("graph.select_column",
- {"type": 'K', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'MARKERS_COLUMN'),
- ],
- },
- ),
- ("graph.select_column",
- {"type": 'K', "value": 'PRESS', "alt": True},
- {"properties":
- [("mode", 'MARKERS_BETWEEN'),
- ],
- },
- ),
- ("graph.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
- ("graph.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
- ("graph.select_linked", {"type": 'L', "value": 'PRESS'}, None),
- ("graph.frame_jump", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
- ("graph.snap", {"type": 'S', "value": 'PRESS', "shift": True}, None),
- ("graph.mirror", {"type": 'M', "value": 'PRESS', "shift": True}, None),
- ("graph.handle_type", {"type": 'V', "value": 'PRESS'}, None),
- ("graph.interpolation_type", {"type": 'T', "value": 'PRESS'}, None),
- ("graph.easing_type", {"type": 'E', "value": 'PRESS', "ctrl": True}, None),
- ("graph.smooth", {"type": 'O', "value": 'PRESS', "alt": True}, None),
- ("graph.sample", {"type": 'O', "value": 'PRESS', "shift": True}, None),
- ("graph.bake", {"type": 'C', "value": 'PRESS', "alt": True}, None),
- ("wm.call_menu",
- {"type": 'X', "value": 'PRESS'},
- {"properties":
- [("name", 'GRAPH_MT_delete'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'DEL', "value": 'PRESS'},
- {"properties":
- [("name", 'GRAPH_MT_delete'),
- ],
- },
- ),
- ("graph.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
- ("graph.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
- ("graph.click_insert",
- {"type": 'ACTIONMOUSE', "value": 'CLICK', "ctrl": True},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("graph.click_insert",
- {"type": 'ACTIONMOUSE', "value": 'CLICK', "shift": True, "ctrl": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("graph.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
- ("graph.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
- ("graph.paste",
- {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("flipped", True),
- ],
- },
- ),
- ("graph.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("graph.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
- ("graph.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
- ("graph.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
- ("graph.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
- ("graph.fmodifier_add",
- {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("only_active", False),
- ],
- },
- ),
- ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
- ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
- ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
- ("transform.transform",
- {"type": 'E', "value": 'PRESS'},
- {"properties":
- [("mode", 'TIME_EXTEND'),
- ],
- },
- ),
- ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
- ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
- ("wm.context_toggle",
- {"type": 'O', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.use_proportional_fcurve'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'COMMA', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.pivot_point'),
- ("value", 'BOUNDING_BOX_CENTER'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'PERIOD', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.pivot_point'),
- ("value", 'CURSOR'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'PERIOD', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'space_data.pivot_point'),
- ("value", 'INDIVIDUAL_ORIGINS'),
- ],
- },
- ),
- ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
- ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
- ],
- },
- ),
- ("Image Generic",
- {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("image.new", {"type": 'N', "value": 'PRESS', "alt": True}, None),
- ("image.open", {"type": 'O', "value": 'PRESS', "alt": True}, None),
- ("image.reload", {"type": 'R', "value": 'PRESS', "alt": True}, None),
- ("image.read_viewlayers", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
- ("image.save", {"type": 'S', "value": 'PRESS', "alt": True}, None),
- ("image.save_as", {"type": 'F3', "value": 'PRESS'}, None),
- ("image.properties", {"type": 'N', "value": 'PRESS'}, None),
- ("image.toolshelf", {"type": 'T', "value": 'PRESS'}, None),
- ("image.cycle_render_slot", {"type": 'J', "value": 'PRESS'}, None),
- ("image.cycle_render_slot",
- {"type": 'J', "value": 'PRESS', "alt": True},
- {"properties":
- [("reverse", True),
- ],
- },
- ),
- ],
- },
- ),
- ("Image",
- {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("image.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
- ("image.view_all",
- {"type": 'HOME', "value": 'PRESS', "shift": True},
- {"properties":
- [("fit_view", True),
- ],
- },
- ),
- ("image.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
- ("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
- ("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
- ("image.view_pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
- ("image.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
- ("image.view_ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
- ("image.view_zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None),
- ("image.view_zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None),
- ("image.view_zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
- ("image.view_zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
- ("image.view_zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("image.view_zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
- ("image.view_zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
- ("image.view_zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None),
- ("image.view_zoom_ratio",
- {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("ratio", 8.0),
- ],
- },
- ),
- ("image.view_zoom_ratio",
- {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("ratio", 4.0),
- ],
- },
- ),
- ("image.view_zoom_ratio",
- {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("ratio", 2.0),
- ],
- },
- ),
- ("image.view_zoom_ratio",
- {"type": 'NUMPAD_8', "value": 'PRESS', "shift": True},
- {"properties":
- [("ratio", 8.0),
- ],
- },
- ),
- ("image.view_zoom_ratio",
- {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True},
- {"properties":
- [("ratio", 4.0),
- ],
- },
- ),
- ("image.view_zoom_ratio",
- {"type": 'NUMPAD_2', "value": 'PRESS', "shift": True},
- {"properties":
- [("ratio", 2.0),
- ],
- },
- ),
- ("image.view_zoom_ratio",
- {"type": 'NUMPAD_1', "value": 'PRESS'},
- {"properties":
- [("ratio", 1.0),
- ],
- },
- ),
- ("image.view_zoom_ratio",
- {"type": 'NUMPAD_2', "value": 'PRESS'},
- {"properties":
- [("ratio", 0.5),
- ],
- },
- ),
- ("image.view_zoom_ratio",
- {"type": 'NUMPAD_4', "value": 'PRESS'},
- {"properties":
- [("ratio", 0.25),
- ],
- },
- ),
- ("image.view_zoom_ratio",
- {"type": 'NUMPAD_8', "value": 'PRESS'},
- {"properties":
- [("ratio", 0.125),
- ],
- },
- ),
- ("image.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("image.sample", {"type": 'ACTIONMOUSE', "value": 'PRESS'}, None),
- ("image.curves_point_set",
- {"type": 'ACTIONMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("point", 'BLACK_POINT'),
- ],
- },
- ),
- ("image.curves_point_set",
- {"type": 'ACTIONMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("point", 'WHITE_POINT'),
- ],
- },
- ),
- ("object.mode_set",
- {"type": 'TAB', "value": 'PRESS'},
- {"properties":
- [("mode", 'EDIT'),
- ("toggle", True),
- ],
- },
- ),
- ("wm.context_set_int",
- {"type": 'ONE', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.image.render_slots.active_index'),
- ("value", 0),
- ],
- },
- ),
- ("wm.context_set_int",
- {"type": 'TWO', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.image.render_slots.active_index'),
- ("value", 1),
- ],
- },
- ),
- ("wm.context_set_int",
- {"type": 'THREE', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.image.render_slots.active_index'),
- ("value", 2),
- ],
- },
- ),
- ("wm.context_set_int",
- {"type": 'FOUR', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.image.render_slots.active_index'),
- ("value", 3),
- ],
- },
- ),
- ("wm.context_set_int",
- {"type": 'FIVE', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.image.render_slots.active_index'),
- ("value", 4),
- ],
- },
- ),
- ("wm.context_set_int",
- {"type": 'SIX', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.image.render_slots.active_index'),
- ("value", 5),
- ],
- },
- ),
- ("wm.context_set_int",
- {"type": 'SEVEN', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.image.render_slots.active_index'),
- ("value", 6),
- ],
- },
- ),
- ("wm.context_set_int",
- {"type": 'EIGHT', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.image.render_slots.active_index'),
- ("value", 7),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'COMMA', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.pivot_point'),
- ("value", 'CENTER'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'COMMA', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'space_data.pivot_point'),
- ("value", 'MEDIAN'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'PERIOD', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.pivot_point'),
- ("value", 'CURSOR'),
- ],
- },
- ),
- ("image.render_border", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
- ("image.clear_render_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ],
- },
- ),
- ("Node Generic",
- {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("node.properties", {"type": 'N', "value": 'PRESS'}, None),
- ("node.toolbar", {"type": 'T', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("Node Editor",
- {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("node.select",
- {"type": 'ACTIONMOUSE', "value": 'PRESS'},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("node.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS'},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("node.select",
- {"type": 'ACTIONMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("node.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("node.select",
- {"type": 'ACTIONMOUSE', "value": 'PRESS', "alt": True},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("node.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "alt": True},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("node.select",
- {"type": 'ACTIONMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("node.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("node.select",
- {"type": 'ACTIONMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("node.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("node.select",
- {"type": 'ACTIONMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("node.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("node.select",
- {"type": 'ACTIONMOUSE', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("node.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("node.select",
- {"type": 'ACTIONMOUSE', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("node.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("node.select_border",
- {"type": 'EVT_TWEAK_S', "value": 'ANY'},
- {"properties":
- [("tweak", True),
- ],
- },
- ),
- ("node.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True, "alt": True},
- {"properties":
- [("deselect", False),
- ],
- },
- ),
- ("node.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
- {"properties":
- [("deselect", True),
- ],
- },
- ),
- ("node.select_circle", {"type": 'C', "value": 'PRESS'}, None),
- ("node.link",
- {"type": 'LEFTMOUSE', "value": 'PRESS'},
- {"properties":
- [("detach", False),
- ],
- },
- ),
- ("node.link",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("detach", True),
- ],
- },
- ),
- ("node.resize", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("node.add_reroute", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, None),
- ("node.links_cut", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("node.select_link_viewer", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("node.backimage_move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None),
- ("node.backimage_zoom",
- {"type": 'V', "value": 'PRESS'},
- {"properties":
- [("factor", 0.8333333),
- ],
- },
- ),
- ("node.backimage_zoom",
- {"type": 'V', "value": 'PRESS', "alt": True},
- {"properties":
- [("factor", 1.2),
- ],
- },
- ),
- ("node.backimage_fit", {"type": 'HOME', "value": 'PRESS', "alt": True}, None),
- ("node.backimage_sample", {"type": 'ACTIONMOUSE', "value": 'PRESS', "alt": True}, None),
- ("node.link_make",
- {"type": 'F', "value": 'PRESS'},
- {"properties":
- [("replace", False),
- ],
- },
- ),
- ("node.link_make",
- {"type": 'F', "value": 'PRESS', "shift": True},
- {"properties":
- [("replace", True),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'A', "value": 'PRESS', "shift": True},
- {"properties":
- [("name", 'NODE_MT_add'),
- ],
- },
- ),
- ("node.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
- ("node.duplicate_move_keep_inputs", {"type": 'D', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("node.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
- ("node.detach", {"type": 'P', "value": 'PRESS', "alt": True}, None),
- ("node.join", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
- ("node.hide_toggle", {"type": 'H', "value": 'PRESS'}, None),
- ("node.mute_toggle", {"type": 'M', "value": 'PRESS'}, None),
- ("node.preview_toggle", {"type": 'H', "value": 'PRESS', "shift": True}, None),
- ("node.hide_socket_toggle", {"type": 'H', "value": 'PRESS', "ctrl": True}, None),
- ("node.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
- ("node.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
- ("node.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
- ("node.select_border",
- {"type": 'B', "value": 'PRESS'},
- {"properties":
- [("tweak", False),
- ],
- },
- ),
- ("node.delete", {"type": 'X', "value": 'PRESS'}, None),
- ("node.delete", {"type": 'DEL', "value": 'PRESS'}, None),
- ("node.delete_reconnect", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
- ("node.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("node.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("node.select_linked_to", {"type": 'L', "value": 'PRESS', "shift": True}, None),
- ("node.select_linked_from", {"type": 'L', "value": 'PRESS'}, None),
- ("node.select_grouped",
- {"type": 'G', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("node.select_grouped",
- {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("node.select_same_type_step",
- {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True},
- {"properties":
- [("prev", False),
- ],
- },
- ),
- ("node.select_same_type_step",
- {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True},
- {"properties":
- [("prev", True),
- ],
- },
- ),
- ("node.find_node", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
- ("node.group_make", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
- ("node.group_ungroup", {"type": 'G', "value": 'PRESS', "alt": True}, None),
- ("node.group_separate", {"type": 'P', "value": 'PRESS'}, None),
- ("node.group_edit",
- {"type": 'TAB', "value": 'PRESS'},
- {"properties":
- [("exit", False),
- ],
- },
- ),
- ("node.group_edit",
- {"type": 'TAB', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("exit", True),
- ],
- },
- ),
- ("node.read_viewlayers", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
- ("node.render_changed", {"type": 'Z', "value": 'PRESS'}, None),
- ("node.clipboard_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
- ("node.clipboard_paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
- ("node.viewer_border", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
- ("node.clear_viewer_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("node.translate_attach", {"type": 'G', "value": 'PRESS'}, None),
- ("node.translate_attach", {"type": 'EVT_TWEAK_A', "value": 'ANY'}, None),
- ("node.translate_attach", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
- ("transform.translate",
- {"type": 'G', "value": 'PRESS'},
- {"properties":
- [("release_confirm", True),
- ],
- },
- ),
- ("transform.translate",
- {"type": 'EVT_TWEAK_A', "value": 'ANY'},
- {"properties":
- [("release_confirm", True),
- ],
- },
- ),
- ("transform.translate",
- {"type": 'EVT_TWEAK_S', "value": 'ANY'},
- {"properties":
- [("release_confirm", True),
- ],
- },
- ),
- ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
- ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
- ("node.move_detach_links", {"type": 'D', "value": 'PRESS', "alt": True}, None),
- ("node.move_detach_links_release", {"type": 'EVT_TWEAK_A', "value": 'ANY', "alt": True}, None),
- ("node.move_detach_links", {"type": 'EVT_TWEAK_S', "value": 'ANY', "alt": True}, None),
- ("wm.context_toggle",
- {"type": 'TAB', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'tool_settings.use_snap'),
- ],
- },
- ),
- ("wm.context_menu_enum",
- {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("data_path", 'tool_settings.snap_node_element'),
- ],
- },
- ),
- ],
- },
- ),
- ("File Browser",
- {"space_type": 'FILE_BROWSER', "region_type": 'WINDOW'},
- {"items":
- [("file.parent", {"type": 'UP_ARROW', "value": 'PRESS', "alt": True}, None),
- ("file.previous", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True}, None),
- ("file.next", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True}, None),
- ("file.refresh", {"type": 'R', "value": 'PRESS'}, None),
- ("file.parent", {"type": 'P', "value": 'PRESS'}, None),
- ("file.previous", {"type": 'BACK_SPACE', "value": 'PRESS'}, None),
- ("file.next", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None),
- ("wm.context_toggle",
- {"type": 'H', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.params.show_hidden'),
- ],
- },
- ),
- ("file.directory_new", {"type": 'I', "value": 'PRESS'}, None),
- ("file.delete", {"type": 'X', "value": 'PRESS'}, None),
- ("file.delete", {"type": 'DEL', "value": 'PRESS'}, None),
- ("file.smoothscroll", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
- ("file.bookmark_toggle", {"type": 'T', "value": 'PRESS'}, None),
- ("file.bookmark_add", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
- ],
- },
- ),
- ("File Browser Main",
- {"space_type": 'FILE_BROWSER', "region_type": 'WINDOW'},
- {"items":
- [("file.execute",
- {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'},
- {"properties":
- [("need_active", True),
- ],
- },
- ),
- ("file.refresh", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
- ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK'}, None),
- ("file.select",
- {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("file.select",
- {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True},
- {"properties":
- [("extend", True),
- ("fill", True),
- ],
- },
- ),
- ("file.select",
- {"type": 'RIGHTMOUSE', "value": 'CLICK'},
- {"properties":
- [("open", False),
- ],
- },
- ),
- ("file.select",
- {"type": 'RIGHTMOUSE', "value": 'CLICK', "shift": True},
- {"properties":
- [("extend", True),
- ("open", False),
- ],
- },
- ),
- ("file.select",
- {"type": 'RIGHTMOUSE', "value": 'CLICK', "alt": True},
- {"properties":
- [("extend", True),
- ("fill", True),
- ("open", False),
- ],
- },
- ),
- ("file.select_walk",
- {"type": 'UP_ARROW', "value": 'PRESS'},
- {"properties":
- [("direction", 'UP'),
- ],
- },
- ),
- ("file.select_walk",
- {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("direction", 'UP'),
- ("extend", True),
- ],
- },
- ),
- ("file.select_walk",
- {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("direction", 'UP'),
- ("extend", True),
- ("fill", True),
- ],
- },
- ),
- ("file.select_walk",
- {"type": 'DOWN_ARROW', "value": 'PRESS'},
- {"properties":
- [("direction", 'DOWN'),
- ],
- },
- ),
- ("file.select_walk",
- {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("direction", 'DOWN'),
- ("extend", True),
- ],
- },
- ),
- ("file.select_walk",
- {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("direction", 'DOWN'),
- ("extend", True),
- ("fill", True),
- ],
- },
- ),
- ("file.select_walk",
- {"type": 'LEFT_ARROW', "value": 'PRESS'},
- {"properties":
- [("direction", 'LEFT'),
- ],
- },
- ),
- ("file.select_walk",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("direction", 'LEFT'),
- ("extend", True),
- ],
- },
- ),
- ("file.select_walk",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("direction", 'LEFT'),
- ("extend", True),
- ("fill", True),
- ],
- },
- ),
- ("file.select_walk",
- {"type": 'RIGHT_ARROW', "value": 'PRESS'},
- {"properties":
- [("direction", 'RIGHT'),
- ],
- },
- ),
- ("file.select_walk",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("direction", 'RIGHT'),
- ("extend", True),
- ],
- },
- ),
- ("file.select_walk",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("direction", 'RIGHT'),
- ("extend", True),
- ("fill", True),
- ],
- },
- ),
- ("file.previous", {"type": 'BUTTON4MOUSE', "value": 'CLICK'}, None),
- ("file.next", {"type": 'BUTTON5MOUSE', "value": 'CLICK'}, None),
- ("file.select_all_toggle", {"type": 'A', "value": 'PRESS'}, None),
- ("file.select_border", {"type": 'B', "value": 'PRESS'}, None),
- ("file.select_border", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
- ("file.rename", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("file.highlight", {"type": 'MOUSEMOVE', "value": 'ANY', "any": True}, None),
- ("file.filenum",
- {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
- {"properties":
- [("increment", 1),
- ],
- },
- ),
- ("file.filenum",
- {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
- {"properties":
- [("increment", 10),
- ],
- },
- ),
- ("file.filenum",
- {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("increment", 100),
- ],
- },
- ),
- ("file.filenum",
- {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
- {"properties":
- [("increment", -1),
- ],
- },
- ),
- ("file.filenum",
- {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
- {"properties":
- [("increment", -10),
- ],
- },
- ),
- ("file.filenum",
- {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("increment", -100),
- ],
- },
- ),
- ],
- },
- ),
- ("File Browser Buttons",
- {"space_type": 'FILE_BROWSER', "region_type": 'WINDOW'},
- {"items":
- [("file.filenum",
- {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
- {"properties":
- [("increment", 1),
- ],
- },
- ),
- ("file.filenum",
- {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
- {"properties":
- [("increment", 10),
- ],
- },
- ),
- ("file.filenum",
- {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("increment", 100),
- ],
- },
- ),
- ("file.filenum",
- {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
- {"properties":
- [("increment", -1),
- ],
- },
- ),
- ("file.filenum",
- {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
- {"properties":
- [("increment", -10),
- ],
- },
- ),
- ("file.filenum",
- {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("increment", -100),
- ],
- },
- ),
- ],
- },
- ),
- ("Dopesheet Generic",
- {"space_type": 'DOPESHEET_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("action.properties", {"type": 'N', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("Dopesheet",
- {"space_type": 'DOPESHEET_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("action.clickselect",
- {"type": 'SELECTMOUSE', "value": 'PRESS'},
- {"properties":
- [("extend", False),
- ("column", False),
- ("channel", False),
- ],
- },
- ),
- ("action.clickselect",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "alt": True},
- {"properties":
- [("extend", False),
- ("column", True),
- ("channel", False),
- ],
- },
- ),
- ("action.clickselect",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", True),
- ("column", False),
- ("channel", False),
- ],
- },
- ),
- ("action.clickselect",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("extend", True),
- ("column", True),
- ("channel", False),
- ],
- },
- ),
- ("action.clickselect",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties":
- [("extend", False),
- ("column", False),
- ("channel", True),
- ],
- },
- ),
- ("action.clickselect",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
- {"properties":
- [("extend", True),
- ("column", False),
- ("channel", True),
- ],
- },
- ),
- ("action.select_leftright",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("mode", 'CHECK'),
- ("extend", False),
- ],
- },
- ),
- ("action.select_leftright",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("mode", 'CHECK'),
- ("extend", True),
- ],
- },
- ),
- ("action.select_leftright",
- {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("mode", 'LEFT'),
- ("extend", False),
- ],
- },
- ),
- ("action.select_leftright",
- {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("mode", 'RIGHT'),
- ("extend", False),
- ],
- },
- ),
- ("action.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("action.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("action.select_border",
- {"type": 'B', "value": 'PRESS'},
- {"properties":
- [("axis_range", False),
- ],
- },
- ),
- ("action.select_border",
- {"type": 'B', "value": 'PRESS', "alt": True},
- {"properties":
- [("axis_range", True),
- ],
- },
- ),
- ("action.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True},
- {"properties":
- [("deselect", False),
- ],
- },
- ),
- ("action.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True},
- {"properties":
- [("deselect", True),
- ],
- },
- ),
- ("action.select_circle", {"type": 'C', "value": 'PRESS'}, None),
- ("action.select_column",
- {"type": 'K', "value": 'PRESS'},
- {"properties":
- [("mode", 'KEYS'),
- ],
- },
- ),
- ("action.select_column",
- {"type": 'K', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("mode", 'CFRA'),
- ],
- },
- ),
- ("action.select_column",
- {"type": 'K', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'MARKERS_COLUMN'),
- ],
- },
- ),
- ("action.select_column",
- {"type": 'K', "value": 'PRESS', "alt": True},
- {"properties":
- [("mode", 'MARKERS_BETWEEN'),
- ],
- },
- ),
- ("action.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
- ("action.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
- ("action.select_linked", {"type": 'L', "value": 'PRESS'}, None),
- ("action.frame_jump", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
- ("action.snap", {"type": 'S', "value": 'PRESS', "shift": True}, None),
- ("action.mirror", {"type": 'M', "value": 'PRESS', "shift": True}, None),
- ("action.handle_type", {"type": 'V', "value": 'PRESS'}, None),
- ("action.interpolation_type", {"type": 'T', "value": 'PRESS'}, None),
- ("action.extrapolation_type", {"type": 'E', "value": 'PRESS', "shift": True}, None),
- ("action.keyframe_type", {"type": 'R', "value": 'PRESS'}, None),
- ("action.sample", {"type": 'O', "value": 'PRESS', "shift": True}, None),
- ("wm.call_menu",
- {"type": 'X', "value": 'PRESS'},
- {"properties":
- [("name", 'DOPESHEET_MT_delete'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'DEL', "value": 'PRESS'},
- {"properties":
- [("name", 'DOPESHEET_MT_delete'),
- ],
- },
- ),
- ("action.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
- ("action.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
- ("action.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
- ("action.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
- ("action.paste",
- {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("flipped", True),
- ],
- },
- ),
- ("action.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("action.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
- ("action.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
- ("action.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
- ("action.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
- ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
- ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
- ("transform.transform",
- {"type": 'G', "value": 'PRESS'},
- {"properties":
- [("mode", 'TIME_TRANSLATE'),
- ],
- },
- ),
- ("transform.transform",
- {"type": 'EVT_TWEAK_S', "value": 'ANY'},
- {"properties":
- [("mode", 'TIME_TRANSLATE'),
- ],
- },
- ),
- ("transform.transform",
- {"type": 'E', "value": 'PRESS'},
- {"properties":
- [("mode", 'TIME_EXTEND'),
- ],
- },
- ),
- ("transform.transform",
- {"type": 'S', "value": 'PRESS'},
- {"properties":
- [("mode", 'TIME_SCALE'),
- ],
- },
- ),
- ("transform.transform",
- {"type": 'T', "value": 'PRESS', "shift": True},
- {"properties":
- [("mode", 'TIME_SLIDE'),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'O', "value": 'PRESS'},
- {"properties":
- [("data_path", 'tool_settings.use_proportional_action'),
- ],
- },
- ),
- ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
- ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
- ],
- },
- ),
- ("NLA Generic",
- {"space_type": 'NLA_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("nla.properties", {"type": 'N', "value": 'PRESS'}, None),
- ("nla.tweakmode_enter", {"type": 'TAB', "value": 'PRESS'}, None),
- ("nla.tweakmode_exit", {"type": 'TAB', "value": 'PRESS'}, None),
- ("nla.tweakmode_enter",
- {"type": 'TAB', "value": 'PRESS', "shift": True},
- {"properties":
- [("isolate_action", True),
- ],
- },
- ),
- ("nla.tweakmode_exit",
- {"type": 'TAB', "value": 'PRESS', "shift": True},
- {"properties":
- [("isolate_action", True),
- ],
- },
- ),
- ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
- ],
- },
- ),
- ("NLA Channels",
- {"space_type": 'NLA_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("nla.channels_click",
- {"type": 'LEFTMOUSE', "value": 'PRESS'},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("nla.channels_click",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("nla.tracks_add",
- {"type": 'A', "value": 'PRESS', "shift": True},
- {"properties":
- [("above_selected", False),
- ],
- },
- ),
- ("nla.tracks_add",
- {"type": 'A', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("above_selected", True),
- ],
- },
- ),
- ("nla.tracks_delete", {"type": 'X', "value": 'PRESS'}, None),
- ("nla.tracks_delete", {"type": 'DEL', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("NLA Editor",
- {"space_type": 'NLA_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("nla.click_select",
- {"type": 'SELECTMOUSE', "value": 'PRESS'},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("nla.click_select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("nla.select_leftright",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("mode", 'CHECK'),
- ("extend", False),
- ],
- },
- ),
- ("nla.select_leftright",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("mode", 'CHECK'),
- ("extend", True),
- ],
- },
- ),
- ("nla.select_leftright",
- {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("mode", 'LEFT'),
- ("extend", False),
- ],
- },
- ),
- ("nla.select_leftright",
- {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties":
- [("mode", 'RIGHT'),
- ("extend", False),
- ],
- },
- ),
- ("nla.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("nla.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("nla.select_border",
- {"type": 'B', "value": 'PRESS'},
- {"properties":
- [("axis_range", False),
- ],
- },
- ),
- ("nla.select_border",
- {"type": 'B', "value": 'PRESS', "alt": True},
- {"properties":
- [("axis_range", True),
- ],
- },
- ),
- ("nla.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None),
- ("nla.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
- ("nla.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
- ("nla.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
- ("nla.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
- ("nla.actionclip_add", {"type": 'A', "value": 'PRESS', "shift": True}, None),
- ("nla.transition_add", {"type": 'T', "value": 'PRESS', "shift": True}, None),
- ("nla.soundclip_add", {"type": 'K', "value": 'PRESS', "shift": True}, None),
- ("nla.meta_add", {"type": 'G', "value": 'PRESS', "shift": True}, None),
- ("nla.meta_remove", {"type": 'G', "value": 'PRESS', "alt": True}, None),
- ("nla.duplicate",
- {"type": 'D', "value": 'PRESS', "shift": True},
- {"properties":
- [("linked", False),
- ],
- },
- ),
- ("nla.duplicate",
- {"type": 'D', "value": 'PRESS', "alt": True},
- {"properties":
- [("linked", True),
- ],
- },
- ),
- ("nla.make_single_user", {"type": 'U', "value": 'PRESS'}, None),
- ("nla.delete", {"type": 'X', "value": 'PRESS'}, None),
- ("nla.delete", {"type": 'DEL', "value": 'PRESS'}, None),
- ("nla.split", {"type": 'Y', "value": 'PRESS'}, None),
- ("nla.mute_toggle", {"type": 'H', "value": 'PRESS'}, None),
- ("nla.swap", {"type": 'F', "value": 'PRESS', "alt": True}, None),
- ("nla.move_up", {"type": 'PAGE_UP', "value": 'PRESS'}, None),
- ("nla.move_down", {"type": 'PAGE_DOWN', "value": 'PRESS'}, None),
- ("nla.apply_scale", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
- ("nla.clear_scale", {"type": 'S', "value": 'PRESS', "alt": True}, None),
- ("nla.snap", {"type": 'S', "value": 'PRESS', "shift": True}, None),
- ("nla.fmodifier_add", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("transform.transform",
- {"type": 'G', "value": 'PRESS'},
- {"properties":
- [("mode", 'TRANSLATION'),
- ],
- },
- ),
- ("transform.transform",
- {"type": 'EVT_TWEAK_S', "value": 'ANY'},
- {"properties":
- [("mode", 'TRANSLATION'),
- ],
- },
- ),
- ("transform.transform",
- {"type": 'E', "value": 'PRESS'},
- {"properties":
- [("mode", 'TIME_EXTEND'),
- ],
- },
- ),
- ("transform.transform",
- {"type": 'S', "value": 'PRESS'},
- {"properties":
- [("mode", 'TIME_SCALE'),
- ],
- },
- ),
- ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
- ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
- ],
- },
- ),
- ("Text Generic",
- {"space_type": 'TEXT_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("text.start_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
- ("text.jump", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
- ("text.find", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
- ("text.replace", {"type": 'H', "value": 'PRESS', "ctrl": True}, None),
- ("text.properties", {"type": 'T', "value": 'PRESS', "ctrl": True}, None),
- ],
- },
- ),
- ("Text",
- {"space_type": 'TEXT_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("wm.context_cycle_int",
- {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'space_data.font_size'),
- ("reverse", False),
- ],
- },
- ),
- ("wm.context_cycle_int",
- {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'space_data.font_size'),
- ("reverse", True),
- ],
- },
- ),
- ("wm.context_cycle_int",
- {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'space_data.font_size'),
- ("reverse", False),
- ],
- },
- ),
- ("wm.context_cycle_int",
- {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'space_data.font_size'),
- ("reverse", True),
- ],
- },
- ),
- ("text.new", {"type": 'N', "value": 'PRESS', "ctrl": True}, None),
- ("text.open", {"type": 'O', "value": 'PRESS', "alt": True}, None),
- ("text.reload", {"type": 'R', "value": 'PRESS', "alt": True}, None),
- ("text.save", {"type": 'S', "value": 'PRESS', "alt": True}, None),
- ("text.save_as", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
- ("text.run_script", {"type": 'P', "value": 'PRESS', "alt": True}, None),
- ("text.cut", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
- ("text.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
- ("text.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
- ("text.cut", {"type": 'DEL', "value": 'PRESS', "shift": True}, None),
- ("text.copy", {"type": 'INSERT', "value": 'PRESS', "ctrl": True}, None),
- ("text.paste", {"type": 'INSERT', "value": 'PRESS', "shift": True}, None),
- ("text.duplicate_line", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
- ("text.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
- ("text.select_line", {"type": 'A', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("text.select_word", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
- ("text.move_lines",
- {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("direction", 'UP'),
- ],
- },
- ),
- ("text.move_lines",
- {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("direction", 'DOWN'),
- ],
- },
- ),
- ("text.indent", {"type": 'TAB', "value": 'PRESS'}, None),
- ("text.unindent", {"type": 'TAB', "value": 'PRESS', "shift": True}, None),
- ("text.uncomment", {"type": 'D', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("text.move",
- {"type": 'HOME', "value": 'PRESS'},
- {"properties":
- [("type", 'LINE_BEGIN'),
- ],
- },
- ),
- ("text.move",
- {"type": 'END', "value": 'PRESS'},
- {"properties":
- [("type", 'LINE_END'),
- ],
- },
- ),
- ("text.move",
- {"type": 'E', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'LINE_END'),
- ],
- },
- ),
- ("text.move",
- {"type": 'E', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("type", 'LINE_END'),
- ],
- },
- ),
- ("text.move",
- {"type": 'LEFT_ARROW', "value": 'PRESS'},
- {"properties":
- [("type", 'PREVIOUS_CHARACTER'),
- ],
- },
- ),
- ("text.move",
- {"type": 'RIGHT_ARROW', "value": 'PRESS'},
- {"properties":
- [("type", 'NEXT_CHARACTER'),
- ],
- },
- ),
- ("text.move",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'PREVIOUS_WORD'),
- ],
- },
- ),
- ("text.move",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'NEXT_WORD'),
- ],
- },
- ),
- ("text.move",
- {"type": 'UP_ARROW', "value": 'PRESS'},
- {"properties":
- [("type", 'PREVIOUS_LINE'),
- ],
- },
- ),
- ("text.move",
- {"type": 'DOWN_ARROW', "value": 'PRESS'},
- {"properties":
- [("type", 'NEXT_LINE'),
- ],
- },
- ),
- ("text.move",
- {"type": 'PAGE_UP', "value": 'PRESS'},
- {"properties":
- [("type", 'PREVIOUS_PAGE'),
- ],
- },
- ),
- ("text.move",
- {"type": 'PAGE_DOWN', "value": 'PRESS'},
- {"properties":
- [("type", 'NEXT_PAGE'),
- ],
- },
- ),
- ("text.move",
- {"type": 'HOME', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'FILE_TOP'),
- ],
- },
- ),
- ("text.move",
- {"type": 'END', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'FILE_BOTTOM'),
- ],
- },
- ),
- ("text.move_select",
- {"type": 'HOME', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'LINE_BEGIN'),
- ],
- },
- ),
- ("text.move_select",
- {"type": 'END', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'LINE_END'),
- ],
- },
- ),
- ("text.move_select",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'PREVIOUS_CHARACTER'),
- ],
- },
- ),
- ("text.move_select",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'NEXT_CHARACTER'),
- ],
- },
- ),
- ("text.move_select",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("type", 'PREVIOUS_WORD'),
- ],
- },
- ),
- ("text.move_select",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("type", 'NEXT_WORD'),
- ],
- },
- ),
- ("text.move_select",
- {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'PREVIOUS_LINE'),
- ],
- },
- ),
- ("text.move_select",
- {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'NEXT_LINE'),
- ],
- },
- ),
- ("text.move_select",
- {"type": 'PAGE_UP', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'PREVIOUS_PAGE'),
- ],
- },
- ),
- ("text.move_select",
- {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'NEXT_PAGE'),
- ],
- },
- ),
- ("text.move_select",
- {"type": 'HOME', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("type", 'FILE_TOP'),
- ],
- },
- ),
- ("text.move_select",
- {"type": 'END', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("type", 'FILE_BOTTOM'),
- ],
- },
- ),
- ("text.delete",
- {"type": 'DEL', "value": 'PRESS'},
- {"properties":
- [("type", 'NEXT_CHARACTER'),
- ],
- },
- ),
- ("text.delete",
- {"type": 'BACK_SPACE', "value": 'PRESS'},
- {"properties":
- [("type", 'PREVIOUS_CHARACTER'),
- ],
- },
- ),
- ("text.delete",
- {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'PREVIOUS_CHARACTER'),
- ],
- },
- ),
- ("text.delete",
- {"type": 'DEL', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'NEXT_WORD'),
- ],
- },
- ),
- ("text.delete",
- {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'PREVIOUS_WORD'),
- ],
- },
- ),
- ("text.overwrite_toggle", {"type": 'INSERT', "value": 'PRESS'}, None),
- ("text.scroll_bar", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("text.scroll_bar", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
- ("text.scroll", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
- ("text.scroll", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
- ("text.selection_set", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
- ("text.cursor_set", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("text.selection_set",
- {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("select", True),
- ],
- },
- ),
- ("text.scroll",
- {"type": 'WHEELUPMOUSE', "value": 'PRESS'},
- {"properties":
- [("lines", -1),
- ],
- },
- ),
- ("text.scroll",
- {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'},
- {"properties":
- [("lines", 1),
- ],
- },
- ),
- ("text.line_break", {"type": 'RET', "value": 'PRESS'}, None),
- ("text.line_break", {"type": 'NUMPAD_ENTER', "value": 'PRESS'}, None),
- ("wm.call_menu",
- {"type": 'RIGHTMOUSE', "value": 'PRESS', "any": True},
- {"properties":
- [("name", 'TEXT_MT_toolbox'),
- ],
- },
- ),
- ("text.autocomplete", {"type": 'SPACE', "value": 'PRESS', "ctrl": True}, None),
- ("text.line_number", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
- ("text.insert", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
- ],
- },
- ),
- ("SequencerCommon",
- {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("sequencer.properties", {"type": 'N', "value": 'PRESS'}, None),
- ("wm.context_toggle",
- {"type": 'O', "value": 'PRESS', "shift": True},
- {"properties":
- [("data_path", 'scene.sequence_editor.show_overlay'),
- ],
- },
- ),
- ("sequencer.view_toggle", {"type": 'TAB', "value": 'PRESS', "ctrl": True}, None),
- ],
- },
- ),
- ("Sequencer",
- {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("sequencer.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("sequencer.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("sequencer.cut",
- {"type": 'K', "value": 'PRESS'},
- {"properties":
- [("type", 'SOFT'),
- ],
- },
- ),
- ("sequencer.cut",
- {"type": 'K', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'HARD'),
- ],
- },
- ),
- ("sequencer.mute",
- {"type": 'H', "value": 'PRESS'},
- {"properties":
- [("unselected", False),
- ],
- },
- ),
- ("sequencer.mute",
- {"type": 'H', "value": 'PRESS', "shift": True},
- {"properties":
- [("unselected", True),
- ],
- },
- ),
- ("sequencer.unmute",
- {"type": 'H', "value": 'PRESS', "alt": True},
- {"properties":
- [("unselected", False),
- ],
- },
- ),
- ("sequencer.unmute",
- {"type": 'H', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("unselected", True),
- ],
- },
- ),
- ("sequencer.lock", {"type": 'L', "value": 'PRESS', "shift": True}, None),
- ("sequencer.unlock", {"type": 'L', "value": 'PRESS', "shift": True, "alt": True}, None),
- ("sequencer.reassign_inputs", {"type": 'R', "value": 'PRESS'}, None),
- ("sequencer.reload", {"type": 'R', "value": 'PRESS', "alt": True}, None),
- ("sequencer.reload",
- {"type": 'R', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("adjust_length", True),
- ],
- },
- ),
- ("sequencer.offset_clear", {"type": 'O', "value": 'PRESS', "alt": True}, None),
- ("sequencer.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
- ("sequencer.delete", {"type": 'X', "value": 'PRESS'}, None),
- ("sequencer.delete", {"type": 'DEL', "value": 'PRESS'}, None),
- ("sequencer.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
- ("sequencer.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
- ("sequencer.images_separate", {"type": 'Y', "value": 'PRESS'}, None),
- ("sequencer.meta_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
- ("sequencer.meta_make", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
- ("sequencer.meta_separate", {"type": 'G', "value": 'PRESS', "alt": True}, None),
- ("sequencer.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
- ("sequencer.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
- ("sequencer.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
- ("sequencer.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
- ("sequencer.strip_jump",
- {"type": 'PAGE_UP', "value": 'PRESS'},
- {"properties":
- [("next", True),
- ("center", False),
- ],
- },
- ),
- ("sequencer.strip_jump",
- {"type": 'PAGE_DOWN', "value": 'PRESS'},
- {"properties":
- [("next", False),
- ("center", False),
- ],
- },
- ),
- ("sequencer.strip_jump",
- {"type": 'PAGE_UP', "value": 'PRESS', "alt": True},
- {"properties":
- [("next", True),
- ("center", True),
- ],
- },
- ),
- ("sequencer.strip_jump",
- {"type": 'PAGE_DOWN', "value": 'PRESS', "alt": True},
- {"properties":
- [("next", False),
- ("center", True),
- ],
- },
- ),
- ("sequencer.swap",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
- {"properties":
- [("side", 'LEFT'),
- ],
- },
- ),
- ("sequencer.swap",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
- {"properties":
- [("side", 'RIGHT'),
- ],
- },
- ),
- ("sequencer.gap_remove",
- {"type": 'BACK_SPACE', "value": 'PRESS'},
- {"properties":
- [("all", False),
- ],
- },
- ),
- ("sequencer.gap_remove",
- {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
- {"properties":
- [("all", True),
- ],
- },
- ),
- ("sequencer.gap_insert", {"type": 'EQUAL', "value": 'PRESS', "shift": True}, None),
- ("sequencer.snap", {"type": 'S', "value": 'PRESS', "shift": True}, None),
- ("sequencer.swap_inputs", {"type": 'S', "value": 'PRESS', "alt": True}, None),
- ("sequencer.cut_multicam",
- {"type": 'ONE', "value": 'PRESS'},
- {"properties":
- [("camera", 1),
- ],
- },
- ),
- ("sequencer.cut_multicam",
- {"type": 'TWO', "value": 'PRESS'},
- {"properties":
- [("camera", 2),
- ],
- },
- ),
- ("sequencer.cut_multicam",
- {"type": 'THREE', "value": 'PRESS'},
- {"properties":
- [("camera", 3),
- ],
- },
- ),
- ("sequencer.cut_multicam",
- {"type": 'FOUR', "value": 'PRESS'},
- {"properties":
- [("camera", 4),
- ],
- },
- ),
- ("sequencer.cut_multicam",
- {"type": 'FIVE', "value": 'PRESS'},
- {"properties":
- [("camera", 5),
- ],
- },
- ),
- ("sequencer.cut_multicam",
- {"type": 'SIX', "value": 'PRESS'},
- {"properties":
- [("camera", 6),
- ],
- },
- ),
- ("sequencer.cut_multicam",
- {"type": 'SEVEN', "value": 'PRESS'},
- {"properties":
- [("camera", 7),
- ],
- },
- ),
- ("sequencer.cut_multicam",
- {"type": 'EIGHT', "value": 'PRESS'},
- {"properties":
- [("camera", 8),
- ],
- },
- ),
- ("sequencer.cut_multicam",
- {"type": 'NINE', "value": 'PRESS'},
- {"properties":
- [("camera", 9),
- ],
- },
- ),
- ("sequencer.cut_multicam",
- {"type": 'ZERO', "value": 'PRESS'},
- {"properties":
- [("camera", 10),
- ],
- },
- ),
- ("sequencer.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS'},
- {"properties":
- [("extend", False),
- ("linked_handle", False),
- ("left_right", 'NONE'),
- ("linked_time", False),
- ],
- },
- ),
- ("sequencer.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", True),
- ("linked_handle", False),
- ("left_right", 'NONE'),
- ("linked_time", False),
- ],
- },
- ),
- ("sequencer.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "alt": True},
- {"properties":
- [("extend", False),
- ("linked_handle", True),
- ("left_right", 'NONE'),
- ("linked_time", False),
- ],
- },
- ),
- ("sequencer.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("extend", True),
- ("linked_handle", True),
- ("left_right", 'NONE'),
- ("linked_time", False),
- ],
- },
- ),
- ("sequencer.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("extend", False),
- ("linked_handle", False),
- ("left_right", 'MOUSE'),
- ("linked_time", True),
- ],
- },
- ),
- ("sequencer.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("extend", True),
- ("linked_handle", False),
- ("left_right", 'NONE'),
- ("linked_time", True),
- ],
- },
- ),
- ("sequencer.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
- ("sequencer.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
- ("sequencer.select_linked_pick",
- {"type": 'L', "value": 'PRESS'},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("sequencer.select_linked_pick",
- {"type": 'L', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("sequencer.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
- ("sequencer.select_border", {"type": 'B', "value": 'PRESS'}, None),
- ("sequencer.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None),
- ("wm.call_menu",
- {"type": 'A', "value": 'PRESS', "shift": True},
- {"properties":
- [("name", 'SEQUENCER_MT_add'),
- ],
- },
- ),
- ("wm.call_menu",
- {"type": 'C', "value": 'PRESS'},
- {"properties":
- [("name", 'SEQUENCER_MT_change'),
- ],
- },
- ),
- ("sequencer.slip", {"type": 'S', "value": 'PRESS'}, None),
- ("wm.context_set_int",
- {"type": 'O', "value": 'PRESS'},
- {"properties":
- [("data_path", 'scene.sequence_editor.overlay_frame'),
- ("value", 0),
- ],
- },
- ),
- ("transform.seq_slide", {"type": 'G', "value": 'PRESS'}, None),
- ("transform.seq_slide", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
- ("transform.transform",
- {"type": 'E', "value": 'PRESS'},
- {"properties":
- [("mode", 'TIME_EXTEND'),
- ],
- },
- ),
- ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
- ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
- ],
- },
- ),
- ("SequencerPreview",
- {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("sequencer.view_all_preview", {"type": 'HOME', "value": 'PRESS'}, None),
- ("sequencer.view_all_preview", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
- ("sequencer.view_ghost_border", {"type": 'O', "value": 'PRESS'}, None),
- ("sequencer.view_zoom_ratio",
- {"type": 'NUMPAD_1', "value": 'PRESS'},
- {"properties":
- [("ratio", 1.0),
- ],
- },
- ),
- ("sequencer.sample", {"type": 'ACTIONMOUSE', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("Console",
- {"space_type": 'CONSOLE', "region_type": 'WINDOW'},
- {"items":
- [("console.move",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'PREVIOUS_WORD'),
- ],
- },
- ),
- ("console.move",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'NEXT_WORD'),
- ],
- },
- ),
- ("console.move",
- {"type": 'HOME', "value": 'PRESS'},
- {"properties":
- [("type", 'LINE_BEGIN'),
- ],
- },
- ),
- ("console.move",
- {"type": 'END', "value": 'PRESS'},
- {"properties":
- [("type", 'LINE_END'),
- ],
- },
- ),
- ("wm.context_cycle_int",
- {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'space_data.font_size'),
- ("reverse", False),
- ],
- },
- ),
- ("wm.context_cycle_int",
- {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'space_data.font_size'),
- ("reverse", True),
- ],
- },
- ),
- ("wm.context_cycle_int",
- {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'space_data.font_size'),
- ("reverse", False),
- ],
- },
- ),
- ("wm.context_cycle_int",
- {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'space_data.font_size'),
- ("reverse", True),
- ],
- },
- ),
- ("console.move",
- {"type": 'LEFT_ARROW', "value": 'PRESS'},
- {"properties":
- [("type", 'PREVIOUS_CHARACTER'),
- ],
- },
- ),
- ("console.move",
- {"type": 'RIGHT_ARROW', "value": 'PRESS'},
- {"properties":
- [("type", 'NEXT_CHARACTER'),
- ],
- },
- ),
- ("console.history_cycle",
- {"type": 'UP_ARROW', "value": 'PRESS'},
- {"properties":
- [("reverse", True),
- ],
- },
- ),
- ("console.history_cycle",
- {"type": 'DOWN_ARROW', "value": 'PRESS'},
- {"properties":
- [("reverse", False),
- ],
- },
- ),
- ("console.delete",
- {"type": 'DEL', "value": 'PRESS'},
- {"properties":
- [("type", 'NEXT_CHARACTER'),
- ],
- },
- ),
- ("console.delete",
- {"type": 'BACK_SPACE', "value": 'PRESS'},
- {"properties":
- [("type", 'PREVIOUS_CHARACTER'),
- ],
- },
- ),
- ("console.delete",
- {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
- {"properties":
- [("type", 'PREVIOUS_CHARACTER'),
- ],
- },
- ),
- ("console.delete",
- {"type": 'DEL', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'NEXT_WORD'),
- ],
- },
- ),
- ("console.delete",
- {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("type", 'PREVIOUS_WORD'),
- ],
- },
- ),
- ("console.clear_line", {"type": 'RET', "value": 'PRESS', "shift": True}, None),
- ("console.clear_line", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "shift": True}, None),
- ("console.execute",
- {"type": 'RET', "value": 'PRESS'},
- {"properties":
- [("interactive", True),
- ],
- },
- ),
- ("console.execute",
- {"type": 'NUMPAD_ENTER', "value": 'PRESS'},
- {"properties":
- [("interactive", True),
- ],
- },
- ),
- ("console.autocomplete", {"type": 'SPACE', "value": 'PRESS', "ctrl": True}, None),
- ("console.copy_as_script", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("console.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
- ("console.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
- ("console.select_set", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("console.select_word", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
- ("console.insert",
- {"type": 'TAB', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("text", '\t'),
- ],
- },
- ),
- ("console.indent", {"type": 'TAB', "value": 'PRESS'}, None),
- ("console.unindent", {"type": 'TAB', "value": 'PRESS', "shift": True}, None),
- ("console.insert", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
- ],
- },
- ),
- ("Clip",
- {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("clip.open", {"type": 'O', "value": 'PRESS', "alt": True}, None),
- ("clip.tools", {"type": 'T', "value": 'PRESS'}, None),
- ("clip.properties", {"type": 'N', "value": 'PRESS'}, None),
- ("clip.track_markers",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
- {"properties":
- [("backwards", True),
- ("sequence", False),
- ],
- },
- ),
- ("clip.track_markers",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
- {"properties":
- [("backwards", False),
- ("sequence", False),
- ],
- },
- ),
- ("clip.track_markers",
- {"type": 'T', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("backwards", False),
- ("sequence", True),
- ],
- },
- ),
- ("clip.track_markers",
- {"type": 'T', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("backwards", True),
- ("sequence", True),
- ],
- },
- ),
- ("wm.context_toggle_enum",
- {"type": 'TAB', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.mode'),
- ("value_1", 'TRACKING'),
- ("value_2", 'MASK'),
- ],
- },
- ),
- ("clip.solve_camera", {"type": 'S', "value": 'PRESS', "shift": True}, None),
- ("clip.set_solver_keyframe",
- {"type": 'Q', "value": 'PRESS'},
- {"properties":
- [("keyframe", 'KEYFRAME_A'),
- ],
- },
- ),
- ("clip.set_solver_keyframe",
- {"type": 'E', "value": 'PRESS'},
- {"properties":
- [("keyframe", 'KEYFRAME_B'),
- ],
- },
- ),
- ("clip.prefetch", {"type": 'P', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("Clip Editor",
- {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("clip.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
- ("clip.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
- ("clip.view_pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
- ("clip.view_zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("clip.view_zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
- ("clip.view_zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
- ("clip.view_zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None),
- ("clip.view_zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None),
- ("clip.view_zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
- ("clip.view_zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
- ("clip.view_zoom_ratio",
- {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("ratio", 8.0),
- ],
- },
- ),
- ("clip.view_zoom_ratio",
- {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("ratio", 4.0),
- ],
- },
- ),
- ("clip.view_zoom_ratio",
- {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("ratio", 2.0),
- ],
- },
- ),
- ("clip.view_zoom_ratio",
- {"type": 'NUMPAD_8', "value": 'PRESS', "shift": True},
- {"properties":
- [("ratio", 8.0),
- ],
- },
- ),
- ("clip.view_zoom_ratio",
- {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True},
- {"properties":
- [("ratio", 4.0),
- ],
- },
- ),
- ("clip.view_zoom_ratio",
- {"type": 'NUMPAD_2', "value": 'PRESS', "shift": True},
- {"properties":
- [("ratio", 2.0),
- ],
- },
- ),
- ("clip.view_zoom_ratio",
- {"type": 'NUMPAD_1', "value": 'PRESS'},
- {"properties":
- [("ratio", 1.0),
- ],
- },
- ),
- ("clip.view_zoom_ratio",
- {"type": 'NUMPAD_2', "value": 'PRESS'},
- {"properties":
- [("ratio", 0.5),
- ],
- },
- ),
- ("clip.view_zoom_ratio",
- {"type": 'NUMPAD_4', "value": 'PRESS'},
- {"properties":
- [("ratio", 0.25),
- ],
- },
- ),
- ("clip.view_zoom_ratio",
- {"type": 'NUMPAD_8', "value": 'PRESS'},
- {"properties":
- [("ratio", 0.125),
- ],
- },
- ),
- ("clip.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
- ("clip.view_all",
- {"type": 'F', "value": 'PRESS'},
- {"properties":
- [("fit_view", True),
- ],
- },
- ),
- ("clip.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
- ("clip.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
- ("clip.view_ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
- ("clip.frame_jump",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("position", 'PATHSTART'),
- ],
- },
- ),
- ("clip.frame_jump",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties":
- [("position", 'PATHEND'),
- ],
- },
- ),
- ("clip.frame_jump",
- {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("position", 'FAILEDPREV'),
- ],
- },
- ),
- ("clip.frame_jump",
- {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("position", 'PATHSTART'),
- ],
- },
- ),
- ("clip.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("clip.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS'},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("clip.select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("clip.select_all",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("clip.select_all",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("clip.select_border", {"type": 'B', "value": 'PRESS'}, None),
- ("clip.select_circle", {"type": 'C', "value": 'PRESS'}, None),
- ("wm.call_menu",
- {"type": 'G', "value": 'PRESS', "shift": True},
- {"properties":
- [("name", 'CLIP_MT_select_grouped'),
- ],
- },
- ),
- ("clip.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True, "alt": True},
- {"properties":
- [("deselect", False),
- ],
- },
- ),
- ("clip.select_lasso",
- {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
- {"properties":
- [("deselect", True),
- ],
- },
- ),
- ("clip.add_marker_slide", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("clip.delete_marker", {"type": 'DEL', "value": 'PRESS', "shift": True}, None),
- ("clip.delete_marker", {"type": 'X', "value": 'PRESS', "shift": True}, None),
- ("clip.slide_marker", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("clip.disable_markers",
- {"type": 'D', "value": 'PRESS', "shift": True},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("clip.delete_track", {"type": 'DEL', "value": 'PRESS'}, None),
- ("clip.delete_track", {"type": 'X', "value": 'PRESS'}, None),
- ("clip.lock_tracks",
- {"type": 'L', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'LOCK'),
- ],
- },
- ),
- ("clip.lock_tracks",
- {"type": 'L', "value": 'PRESS', "alt": True},
- {"properties":
- [("action", 'UNLOCK'),
- ],
- },
- ),
- ("clip.hide_tracks",
- {"type": 'H', "value": 'PRESS'},
- {"properties":
- [("unselected", False),
- ],
- },
- ),
- ("clip.hide_tracks",
- {"type": 'H', "value": 'PRESS', "shift": True},
- {"properties":
- [("unselected", True),
- ],
- },
- ),
- ("clip.hide_tracks_clear", {"type": 'H', "value": 'PRESS', "alt": True}, None),
- ("clip.slide_plane_marker", {"type": 'ACTIONMOUSE', "value": 'PRESS'}, None),
- ("clip.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
- ("clip.keyframe_delete", {"type": 'I', "value": 'PRESS', "alt": True}, None),
- ("clip.join_tracks", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
- ("wm.call_menu",
- {"type": 'W', "value": 'PRESS'},
- {"properties":
- [("name", 'CLIP_MT_tracking_specials'),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'L', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.lock_selection'),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'D', "value": 'PRESS', "alt": True},
- {"properties":
- [("data_path", 'space_data.show_disabled'),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'S', "value": 'PRESS', "alt": True},
- {"properties":
- [("data_path", 'space_data.show_marker_search'),
- ],
- },
- ),
- ("wm.context_toggle",
- {"type": 'M', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.use_mute_footage'),
- ],
- },
- ),
- ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
- ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
- ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
- ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
- ("clip.clear_track_path",
- {"type": 'T', "value": 'PRESS', "alt": True},
- {"properties":
- [("action", 'REMAINED'),
- ("clear_active", False),
- ],
- },
- ),
- ("clip.clear_track_path",
- {"type": 'T', "value": 'PRESS', "shift": True},
- {"properties":
- [("action", 'UPTO'),
- ("clear_active", False),
- ],
- },
- ),
- ("clip.clear_track_path",
- {"type": 'T', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("action", 'ALL'),
- ("clear_active", False),
- ],
- },
- ),
- ("clip.cursor_set", {"type": 'ACTIONMOUSE', "value": 'PRESS'}, None),
- ("wm.context_set_enum",
- {"type": 'COMMA', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.pivot_point'),
- ("value", 'BOUNDING_BOX_CENTER'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'COMMA', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'space_data.pivot_point'),
- ("value", 'MEDIAN_POINT'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'PERIOD', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.pivot_point'),
- ("value", 'CURSOR'),
- ],
- },
- ),
- ("wm.context_set_enum",
- {"type": 'PERIOD', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("data_path", 'space_data.pivot_point'),
- ("value", 'INDIVIDUAL_ORIGINS'),
- ],
- },
- ),
- ("clip.copy_tracks", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
- ("clip.paste_tracks", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
- ],
- },
- ),
- ("Clip Graph Editor",
- {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("clip.change_frame", {"type": 'ACTIONMOUSE', "value": 'PRESS'}, None),
- ("clip.graph_select",
- {"type": 'SELECTMOUSE', "value": 'PRESS'},
- {"properties":
- [("extend", False),
- ],
- },
- ),
- ("clip.graph_select",
- {"type": 'SELECTMOUSE', "value": 'PRESS', "shift": True},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("clip.graph_select_all_markers",
- {"type": 'A', "value": 'PRESS'},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("clip.graph_select_all_markers",
- {"type": 'I', "value": 'PRESS', "ctrl": True},
- {"properties":
- [("action", 'INVERT'),
- ],
- },
- ),
- ("clip.graph_select_border", {"type": 'B', "value": 'PRESS'}, None),
- ("clip.graph_delete_curve", {"type": 'DEL', "value": 'PRESS'}, None),
- ("clip.graph_delete_curve", {"type": 'X', "value": 'PRESS'}, None),
- ("clip.graph_delete_knot", {"type": 'DEL', "value": 'PRESS', "shift": True}, None),
- ("clip.graph_delete_knot", {"type": 'X', "value": 'PRESS', "shift": True}, None),
- ("clip.graph_view_all", {"type": 'HOME', "value": 'PRESS'}, None),
- ("clip.graph_view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
- ("clip.graph_center_current_frame", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
- ("wm.context_toggle",
- {"type": 'L', "value": 'PRESS'},
- {"properties":
- [("data_path", 'space_data.lock_time_cursor'),
- ],
- },
- ),
- ("clip.clear_track_path",
- {"type": 'T', "value": 'PRESS', "alt": True},
- {"properties":
- [("action", 'REMAINED'),
- ("clear_active", True),
- ],
- },
- ),
- ("clip.clear_track_path",
- {"type": 'T', "value": 'PRESS', "shift": True},
- {"properties":
- [("action", 'UPTO'),
- ("clear_active", True),
- ],
- },
- ),
- ("clip.clear_track_path",
- {"type": 'T', "value": 'PRESS', "shift": True, "alt": True},
- {"properties":
- [("action", 'ALL'),
- ("clear_active", True),
- ],
- },
- ),
- ("clip.graph_disable_markers",
- {"type": 'D', "value": 'PRESS', "shift": True},
- {"properties":
- [("action", 'TOGGLE'),
- ],
- },
- ),
- ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
- ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
- ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
- ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("Clip Dopesheet Editor",
- {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
- {"items":
- [("clip.dopesheet_select_channel",
- {"type": 'LEFTMOUSE', "value": 'PRESS'},
- {"properties":
- [("extend", True),
- ],
- },
- ),
- ("clip.dopesheet_view_all", {"type": 'HOME', "value": 'PRESS'}, None),
- ("clip.dopesheet_view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
- ],
- },
- ),
- ("3D View Tool: OBJECT, Move",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("transform.translate",
- {"type": 'EVT_TWEAK_A', "value": 'ANY'},
- {"properties":
- [("release_confirm", True),
- ],
- },
- ),
- ],
- },
- ),
- ("3D View Tool: OBJECT, Rotate",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("transform.rotate",
- {"type": 'EVT_TWEAK_A', "value": 'ANY'},
- {"properties":
- [("release_confirm", True),
- ],
- },
- ),
- ],
- },
- ),
- ("3D View Tool: OBJECT, Scale",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("transform.resize",
- {"type": 'EVT_TWEAK_A', "value": 'ANY'},
- {"properties":
- [("release_confirm", True),
- ],
- },
- ),
- ],
- },
- ),
- ("3D View Tool: OBJECT, Ruler/Protractor",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("view3d.ruler_add", {"type": 'EVT_TWEAK_A', "value": 'ANY'}, None),
- ],
- },
- ),
- ("3D View Tool: PARTICLE, Cursor Click",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("view3d.cursor3d", {"type": 'ACTIONMOUSE', "value": 'CLICK'}, None),
- ],
- },
- ),
- ("Spot Lamp Widgets",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ("Area Lamp Widgets",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ("Target Lamp Widgets",
- {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
- {"items":
- [("manipulatorgroup.manipulator_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
- ],
- },
- ),
- ]
+import os
+from bpy_extras.keyconfig_utils import (
+ keyconfig_import_from_data,
+ keyconfig_module_from_preset,
+)
+_mod = keyconfig_module_from_preset(os.path.join("keymap_data", "blender_default"), __file__)
+keyconfig_data = _mod.generate_keymaps(_mod.KeymapParams(legacy=True))
if __name__ == "__main__":
- import os
- from bpy_extras.keyconfig_utils import keyconfig_import_from_data
- keyconfig_import_from_data(os.path.splitext(os.path.basename(__file__))[0], keyconfig_data)
+ keyconfig_import_from_data("Blender 27X", keyconfig_data)
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
new file mode 100644
index 00000000000..b4d0779e676
--- /dev/null
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -0,0 +1,4938 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+
+# ------------------------------------------------------------------------------
+# Configurable Parameters
+
+from collections import namedtuple
+
+# TODO: remove when we drop Python 3.6
+import sys
+if sys.version_info >= (3, 7):
+ KeymapParams = namedtuple(
+ "KeymapParams",
+ ("apple", "legacy", "select_mouse", "action_mouse"),
+ defaults=(
+ sys.platform == "darwin",
+ False,
+ 'SELECTMOUSE',
+ 'ACTIONMOUSE',
+ ),
+ )
+else:
+ KeymapParams = namedtuple(
+ "KeymapParams",
+ ("apple", "legacy", "select_mouse", "action_mouse"),
+ )
+ KeymapParams.__new__.__defaults__ = (
+ sys.platform == "darwin",
+ False,
+ 'SELECTMOUSE',
+ 'ACTIONMOUSE',
+ )
+del namedtuple, sys
+
+
+# ------------------------------------------------------------------------------
+# Constants
+
+# Physical layout.
+NUMBERS_1 = ('ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE', 'ZERO')
+# Numeric order.
+NUMBERS_0 = ('ZERO', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE')
+
+
+# ------------------------------------------------------------------------------
+# Keymap Item Wrappers
+
+def op_menu(menu, kmi_args):
+ return ("wm.call_menu", kmi_args, {"properties": [("name", menu)]})
+
+
+def op_menu_pie(menu, kmi_args):
+ return ("wm.call_menu_pie", kmi_args, {"properties": [("name", menu)]})
+
+
+def op_panel(menu, kmi_args, kmi_data=()):
+ return ("wm.call_panel", kmi_args, {"properties": [("name", menu), *kmi_data]})
+
+
+# ------------------------------------------------------------------------------
+# Keymap Templates
+
+def _template_items_select_actions(operator):
+ return [
+ (operator, {"type": 'A', "value": 'PRESS'}, {"properties": [("action", 'SELECT')]}),
+ (operator, {"type": 'A', "value": 'PRESS', "alt": True}, {"properties": [("action", 'DESELECT')]}),
+ (operator, {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}),
+ (operator, {"type": 'A', "value": 'DOUBLE_CLICK'}, {"properties": [("action", 'DESELECT')]}),
+ ]
+
+
+def _template_items_object_subdivision_set():
+ return [
+ ("object.subdivision_set",
+ {"type": NUMBERS_0[i], "value": 'PRESS', "ctrl": True},
+ {"properties": [("level", i)]})
+ for i in range(6)
+ ]
+
+
+def _template_items_gizmo_tweak_value():
+ return [
+ ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ]
+
+
+def _template_items_gizmo_tweak_modal():
+ return [
+ ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'RET', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "any": True}, None),
+ ("PRECISION_ON", {"type": 'RIGHT_SHIFT', "value": 'PRESS', "any": True}, None),
+ ("PRECISION_OFF", {"type": 'RIGHT_SHIFT', "value": 'RELEASE', "any": True}, None),
+ ("PRECISION_ON", {"type": 'LEFT_SHIFT', "value": 'PRESS', "any": True}, None),
+ ("PRECISION_OFF", {"type": 'LEFT_SHIFT', "value": 'RELEASE', "any": True}, None),
+ ("SNAP_ON", {"type": 'RIGHT_CTRL', "value": 'PRESS', "any": True}, None),
+ ("SNAP_OFF", {"type": 'RIGHT_CTRL', "value": 'RELEASE', "any": True}, None),
+ ("SNAP_ON", {"type": 'LEFT_CTRL', "value": 'PRESS', "any": True}, None),
+ ("SNAP_OFF", {"type": 'LEFT_CTRL', "value": 'RELEASE', "any": True}, None),
+ ]
+
+
+def _template_items_editmode_mesh_select_mode():
+ return [
+ (
+ "mesh.select_mode",
+ {"type": k, "value": 'PRESS', **key_expand, **key_extend},
+ {"properties": [*prop_extend, *prop_expand, ("type", e)]}
+ )
+ for key_expand, prop_expand in (({}, ()), ({"ctrl": True}, (("use_expand", True),)))
+ for key_extend, prop_extend in (({}, ()), ({"shift": True}, (("use_extend", True),)))
+ for k, e in (('ONE', 'VERT'), ('TWO', 'EDGE'), ('THREE', 'FACE'))
+ ]
+
+
+def _template_items_proportional_editing(*, connected=False):
+ return [
+ op_menu_pie("VIEW3D_MT_proportional_editing_falloff_pie", {"type": 'O', "value": 'PRESS', "shift": True}),
+ ("wm.context_toggle_enum", {"type": 'O', "value": 'PRESS'},
+ {"properties": [("data_path", 'tool_settings.proportional_edit'), ("value_1", 'DISABLED'), ("value_2", 'ENABLED')]}),
+ *(() if not connected else (
+ ("wm.context_toggle_enum", {"type": 'O', "value": 'PRESS', "alt": True},
+ {"properties": [("data_path", 'tool_settings.proportional_edit'), ("value_1", 'DISABLED'), ("value_2", 'CONNECTED')]}),
+ ))
+ ]
+
+
+# ------------------------------------------------------------------------------
+# Window, Screen, Areas, Regions
+
+def km_window(params):
+ items = []
+ keymap = (
+ "Window",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ if params.apple:
+ # Apple standard shortcuts. Cmd+F for search since F-keys are not easy to use.
+ items.extend([
+ ("wm.read_homefile", {"type": 'N', "value": 'PRESS', "oskey": True}, None),
+ op_menu("TOPBAR_MT_file_open_recent", {"type": 'O', "value": 'PRESS', "shift": True, "oskey": True}),
+ ("wm.open_mainfile", {"type": 'O', "value": 'PRESS', "oskey": True}, None),
+ ("wm.save_mainfile", {"type": 'S', "value": 'PRESS', "oskey": True}, None),
+ ("wm.save_as_mainfile", {"type": 'S', "value": 'PRESS', "shift": True, "oskey": True}, None),
+ ("wm.quit_blender", {"type": 'Q', "value": 'PRESS', "oskey": True}, None),
+ ("wm.search_menu", {"type": 'F', "value": 'PRESS', "oskey": True}, None),
+ ])
+
+ items.extend([
+ # File operations
+ ("wm.read_homefile", {"type": 'N', "value": 'PRESS', "ctrl": True}, None),
+ op_menu("TOPBAR_MT_file_open_recent", {"type": 'O', "value": 'PRESS', "shift": True, "ctrl": True}),
+ ("wm.open_mainfile", {"type": 'O', "value": 'PRESS', "ctrl": True}, None),
+ ("wm.save_mainfile", {"type": 'S', "value": 'PRESS', "ctrl": True}, None),
+ ("wm.save_as_mainfile", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("wm.quit_blender", {"type": 'Q', "value": 'PRESS', "ctrl": True}, None),
+
+ # Quick menu and toolbar
+ op_menu("SCREEN_MT_user_menu", {"type": 'Q', "value": 'PRESS'}),
+ ("wm.toolbar", {"type": 'SPACE', "value": 'PRESS'}, None),
+
+ # Fast editor switching
+ *(
+ ("wm.context_set_enum",
+ {"type": k, "value": 'PRESS', "shift": True},
+ {"properties": [("data_path", 'area.type'), ("value", t)]})
+ for k, t in (
+ ('F4', 'CONSOLE'),
+ ('F5', 'VIEW_3D'),
+ ('F6', 'GRAPH_EDITOR'),
+ ('F7', 'PROPERTIES'),
+ ('F8', 'SEQUENCE_EDITOR'),
+ ('F9', 'OUTLINER'),
+ ('F10', 'IMAGE_EDITOR'),
+ ('F11', 'TEXT_EDITOR'),
+ ('F12', 'DOPESHEET_EDITOR'),
+ )
+ ),
+
+ # NDOF settings
+ op_menu("USERPREF_MT_ndof_settings", {"type": 'NDOF_BUTTON_MENU', "value": 'PRESS'}),
+ ("wm.context_scale_float", {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS'},
+ {"properties": [("data_path", 'user_preferences.inputs.ndof_sensitivity'), ("value", 1.1)]}),
+ ("wm.context_scale_float", {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS'},
+ {"properties": [("data_path", 'user_preferences.inputs.ndof_sensitivity'), ("value", 1.0 / 1.1)]}),
+ ("wm.context_scale_float", {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path", 'user_preferences.inputs.ndof_sensitivity'), ("value", 1.5)]}),
+ ("wm.context_scale_float", {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path", 'user_preferences.inputs.ndof_sensitivity'), ("value", 2.0 / 3.0)]}),
+ ("info.reports_display_update", {"type": 'TIMER_REPORT', "value": 'ANY', "any": True}, None),
+ ])
+
+ if not params.legacy:
+ # New shortcuts
+ items.extend([
+ ("wm.doc_view_manual_ui_context", {"type": 'F1', "value": 'PRESS'}, None),
+ op_menu("TOPBAR_MT_file_specials", {"type": 'F2', "value": 'PRESS'}),
+ ("wm.search_menu", {"type": 'F3', "value": 'PRESS'}, None),
+ op_menu("TOPBAR_MT_window_specials", {"type": 'F4', "value": 'PRESS'}),
+ ])
+ else:
+ # Old shorctus
+ items.extend([
+ ("wm.window_new", {"type": 'W', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("wm.save_homefile", {"type": 'U', "value": 'PRESS', "ctrl": True}, None),
+ ("wm.open_mainfile", {"type": 'F1', "value": 'PRESS'}, None),
+ ("wm.link", {"type": 'O', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("wm.append", {"type": 'F1', "value": 'PRESS', "shift": True}, None),
+ ("wm.save_mainfile", {"type": 'W', "value": 'PRESS', "ctrl": True}, None),
+ ("wm.save_as_mainfile", {"type": 'F2', "value": 'PRESS'}, None),
+ ("wm.save_as_mainfile", {"type": 'S', "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("copy", True)]}),
+ ("wm.window_fullscreen_toggle", {"type": 'F11', "value": 'PRESS', "alt": True}, None),
+ ("wm.doc_view_manual_ui_context", {"type": 'F1', "value": 'PRESS', "alt": True}, None),
+ ("wm.redraw_timer", {"type": 'T', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("wm.debug_menu", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ])
+
+ return keymap
+
+
+def km_screen(params):
+ items = []
+ keymap = (
+ "Screen",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Animation
+ ("screen.animation_step", {"type": 'TIMER0', "value": 'ANY', "any": True}, None),
+ ("screen.region_blend", {"type": 'TIMERREGION', "value": 'ANY', "any": True}, None),
+ # Full screen and cycling
+ ("screen.screen_full_area", {"type": 'SPACE', "value": 'PRESS', "ctrl": True}, None),
+ ("screen.screen_full_area", {"type": 'SPACE', "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("use_hide_panels", True)]}),
+ ("screen.space_context_cycle", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
+ {"properties": [("direction", 'NEXT')]}),
+ ("screen.space_context_cycle", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("direction", 'PREV')]}),
+ ("screen.workspace_cycle", {"type": 'PAGE_DOWN', "value": 'PRESS', "ctrl": True},
+ {"properties": [("direction", 'NEXT')]}),
+ ("screen.workspace_cycle", {"type": 'PAGE_UP', "value": 'PRESS', "ctrl": True},
+ {"properties": [("direction", 'PREV')]}),
+ # Quad view
+ ("screen.region_quadview", {"type": 'Q', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ # Repeat last
+ ("screen.repeat_last", {"type": 'R', "value": 'PRESS', "shift": True}, None),
+ # Files
+ ("file.execute", {"type": 'RET', "value": 'PRESS'}, None),
+ ("file.execute", {"type": 'NUMPAD_ENTER', "value": 'PRESS'}, None),
+ ("file.cancel", {"type": 'ESC', "value": 'PRESS'}, None),
+ # Undo
+ ("ed.undo", {"type": 'Z', "value": 'PRESS', "ctrl": True}, None),
+ ("ed.redo", {"type": 'Z', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ # Render
+ ("render.render", {"type": 'F12', "value": 'PRESS'},
+ {"properties": [("use_viewport", True)]}),
+ ("render.render", {"type": 'F12', "value": 'PRESS', "ctrl": True},
+ {"properties": [("animation", True), ("use_viewport", True)]}),
+ ("render.view_cancel", {"type": 'ESC', "value": 'PRESS'}, None),
+ ("render.view_show", {"type": 'F11', "value": 'PRESS'}, None),
+ ("render.play_rendered_anim", {"type": 'F11', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ if params.legacy:
+ # Old keymap
+ items.extend([
+ ("ed.undo_history", {"type": 'Z', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("screen.screen_set", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
+ {"properties": [("delta", 1)]}),
+ ("screen.screen_set", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
+ {"properties": [("delta", -1)]}),
+ ("screen.screenshot", {"type": 'F3', "value": 'PRESS', "ctrl": True}, None),
+ ("screen.repeat_history", {"type": 'R', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("screen.region_flip", {"type": 'F5', "value": 'PRESS'}, None),
+ ("screen.redo_last", {"type": 'F6', "value": 'PRESS'}, None),
+ ("script.reload", {"type": 'F8', "value": 'PRESS'}, None),
+ ("screen.userpref_show", {"type": 'U', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ])
+
+ if params.apple:
+ # Apple undo and user prefs
+ items.extend([
+ ("ed.undo", {"type": 'Z', "value": 'PRESS', "oskey": True}, None),
+ ("ed.redo", {"type": 'Z', "value": 'PRESS', "shift": True, "oskey": True}, None),
+ ("ed.undo_history", {"type": 'Z', "value": 'PRESS', "alt": True, "oskey": True}, None),
+ ("screen.userpref_show", {"type": 'COMMA', "value": 'PRESS', "oskey": True}, None),
+ ])
+
+ return keymap
+
+
+def km_screen_editing(params):
+ items = []
+ keymap = ("Screen Editing",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items})
+
+ items.extend([
+ # Action zones
+ ("screen.actionzone", {"type": 'LEFTMOUSE', "value": 'PRESS'},
+ {"properties": [("modifier", 0)]}),
+ ("screen.actionzone", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
+ {"properties": [("modifier", 1)]}),
+ ("screen.actionzone", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("modifier", 2)]}),
+ # Screen tools
+ ("screen.area_split", {"type": 'ACTIONZONE_AREA', "value": 'ANY'}, None),
+ ("screen.area_join", {"type": 'ACTIONZONE_AREA', "value": 'ANY'}, None),
+ ("screen.area_dupli", {"type": 'ACTIONZONE_AREA', "value": 'ANY', "shift": True}, None),
+ ("screen.area_swap", {"type": 'ACTIONZONE_AREA', "value": 'ANY', "ctrl": True}, None),
+ ("screen.region_scale", {"type": 'ACTIONZONE_REGION', "value": 'ANY'}, None),
+ ("screen.screen_full_area", {"type": 'ACTIONZONE_FULLSCREEN', "value": 'ANY'},
+ {"properties": [("use_hide_panels", True)]}),
+ # Area move after action zones
+ ("screen.area_move", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("screen.area_options", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
+ ])
+
+ if params.legacy:
+ items.extend([
+ ("screen.header", {"type": 'F9', "value": 'PRESS', "alt": True}, None),
+ ])
+
+ return keymap
+
+
+def km_header(_params):
+ items = []
+ keymap = (
+ "Header",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("screen.header_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+def km_view2d(_params):
+ items = []
+ keymap = (
+ "View2D",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Scrollbars
+ ("view2d.scroller_activate", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("view2d.scroller_activate", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
+ # Pan/scroll
+ ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
+ ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
+ ("view2d.pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
+ ("view2d.scroll_right", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True}, None),
+ ("view2d.scroll_left", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True}, None),
+ ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True}, None),
+ ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True}, None),
+ ("view2d.ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
+ # Zoom with single step
+ ("view2d.zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None),
+ ("view2d.zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None),
+ ("view2d.zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
+ ("view2d.zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
+ ("view2d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
+ ("view2d.smoothview", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
+ # Scroll up/down, only when zoom is not available.
+ ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
+ ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
+ ("view2d.scroll_right", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
+ ("view2d.scroll_left", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
+ # Zoom with drag and border
+ ("view2d.zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
+ ("view2d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
+ ("view2d.zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None),
+ ])
+
+ return keymap
+
+
+def km_view2d_buttons_list(_params):
+ items = []
+ keymap = (
+ "View2D Buttons List",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Scrollbars
+ ("view2d.scroller_activate", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("view2d.scroller_activate", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
+ # Pan scroll
+ ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
+ ("view2d.pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
+ ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
+ ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
+ ("view2d.scroll_down", {"type": 'PAGE_DOWN', "value": 'PRESS'},
+ {"properties": [("page", True)]}),
+ ("view2d.scroll_up", {"type": 'PAGE_UP', "value": 'PRESS'},
+ {"properties": [("page", True)]}),
+ # Zoom
+ ("view2d.zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
+ ("view2d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
+ ("view2d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
+ ("view2d.zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
+ ("view2d.zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
+ ("view2d.reset", {"type": 'HOME', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+def km_user_interface(_params):
+ items = []
+ keymap = (
+ "User Interface",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Eyedroppers all have the same event, and pass it through until
+ # a suitable eyedropper handles it.
+ ("ui.eyedropper_color", {"type": 'E', "value": 'PRESS'}, None),
+ ("ui.eyedropper_colorband", {"type": 'E', "value": 'PRESS'}, None),
+ ("ui.eyedropper_colorband_point", {"type": 'E', "value": 'PRESS', "alt": True}, None),
+ ("ui.eyedropper_id", {"type": 'E', "value": 'PRESS'}, None),
+ ("ui.eyedropper_depth", {"type": 'E', "value": 'PRESS'}, None),
+ # Copy data path
+ ("ui.copy_data_path_button", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("ui.copy_data_path_button", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
+ {"properties": [("full_path", True)]}),
+ # Keyframes and drivers
+ ("anim.keyframe_insert_button", {"type": 'I', "value": 'PRESS'}, None),
+ ("anim.keyframe_delete_button", {"type": 'I', "value": 'PRESS', "alt": True}, None),
+ ("anim.keyframe_clear_button", {"type": 'I', "value": 'PRESS', "shift": True, "alt": True}, None),
+ ("anim.driver_button_add", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
+ ("anim.driver_button_remove", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("anim.keyingset_button_add", {"type": 'K', "value": 'PRESS'}, None),
+ ("anim.keyingset_button_remove", {"type": 'K', "value": 'PRESS', "alt": True}, None),
+ ])
+
+ return keymap
+
+
+# ------------------------------------------------------------------------------
+# Editors
+
+
+def km_property_editor(_params):
+ items = []
+ keymap = (
+ "Property Editor",
+ {"space_type": 'PROPERTIES', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("buttons.context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
+ ("screen.space_context_cycle", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("direction", 'PREV'), ], },),
+ ("screen.space_context_cycle", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("direction", 'NEXT'), ], },),
+ ])
+
+ return keymap
+
+
+def km_outliner(_params):
+ items = []
+ keymap = (
+ "Outliner",
+ {"space_type": 'OUTLINER', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("outliner.highlight_update", {"type": 'MOUSEMOVE', "value": 'ANY', "any": True}, None),
+ ("outliner.item_rename", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
+ ("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK'},
+ {"properties": [("extend", False), ("recursive", False)]}),
+ ("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
+ {"properties": [("extend", True), ("recursive", False)]}),
+ ("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True},
+ {"properties": [("extend", False), ("recursive", True)]}),
+ ("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True},
+ {"properties": [("extend", True), ("recursive", True)]}),
+ ("outliner.select_box", {"type": 'B', "value": 'PRESS'}, None),
+ ("outliner.item_openclose", {"type": 'RET', "value": 'PRESS'},
+ {"properties": [("all", False)]}),
+ ("outliner.item_openclose", {"type": 'RET', "value": 'PRESS', "shift": True},
+ {"properties": [("all", True)]}),
+ ("outliner.item_rename", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
+ ("outliner.operation", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
+ ("outliner.item_drag_drop", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
+ ("outliner.item_drag_drop", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True}, None),
+ ("outliner.show_hierarchy", {"type": 'HOME', "value": 'PRESS'}, None),
+ ("outliner.show_active", {"type": 'PERIOD', "value": 'PRESS'}, None),
+ ("outliner.show_active", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
+ ("outliner.scroll_page", {"type": 'PAGE_DOWN', "value": 'PRESS'},
+ {"properties": [("up", False)]}),
+ ("outliner.scroll_page", {"type": 'PAGE_UP', "value": 'PRESS'},
+ {"properties": [("up", True)]}),
+ ("outliner.show_one_level", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
+ ("outliner.show_one_level", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
+ {"properties": [("open", False)]}),
+ *_template_items_select_actions("outliner.select_all"),
+ ("outliner.expanded_toggle", {"type": 'A', "value": 'PRESS', "shift": True}, None),
+ ("outliner.keyingset_add_selected", {"type": 'K', "value": 'PRESS'}, None),
+ ("outliner.keyingset_remove_selected", {"type": 'K', "value": 'PRESS', "alt": True}, None),
+ ("anim.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
+ ("anim.keyframe_delete", {"type": 'I', "value": 'PRESS', "alt": True}, None),
+ ("outliner.drivers_add_selected", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
+ ("outliner.drivers_delete_selected", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("outliner.collection_new", {"type": 'C', "value": 'PRESS'}, None),
+ ("outliner.collection_delete", {"type": 'X', "value": 'PRESS'}, None),
+ ("outliner.collection_delete", {"type": 'DEL', "value": 'PRESS'}, None),
+ ("object.move_to_collection", {"type": 'M', "value": 'PRESS'}, None),
+ ("object.link_to_collection", {"type": 'M', "value": 'PRESS', "shift": True}, None),
+ ("outliner.collection_exclude_set", {"type": 'E', "value": 'PRESS'}, None),
+ ("outliner.collection_exclude_clear", {"type": 'E', "value": 'PRESS', "alt": True}, None),
+ ("object.hide_view_clear", {"type": 'H', "value": 'PRESS', "alt": True},
+ {"properties": [("select", False)]}),
+ ("object.hide_view_set", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("object.hide_view_set", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
+ ])
+
+ return keymap
+
+
+def km_uv_editor(params):
+ items = []
+ keymap = (
+ "UV Editor",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Selection modes.
+ *_template_items_editmode_mesh_select_mode(),
+ ("mesh.select_mode", {"type": 'FOUR', "value": 'PRESS'}, None),
+ ("wm.context_set_enum", {"type": 'ONE', "value": 'PRESS'},
+ {"properties": [("data_path", 'tool_settings.uv_select_mode'), ("value", 'VERTEX')]}),
+ ("wm.context_set_enum", {"type": 'TWO', "value": 'PRESS'},
+ {"properties": [("data_path", 'tool_settings.uv_select_mode'), ("value", 'EDGE')]}),
+ ("wm.context_set_enum", {"type": 'THREE', "value": 'PRESS'},
+ {"properties": [("data_path", 'tool_settings.uv_select_mode'), ("value", 'FACE')]}),
+ ("wm.context_set_enum", {"type": 'FOUR', "value": 'PRESS'},
+ {"properties": [("data_path", 'tool_settings.uv_select_mode'), ("value", 'ISLAND')]}),
+ ("uv.mark_seam", {"type": 'E', "value": 'PRESS', "ctrl": True}, None),
+ ("uv.select", {"type": params.select_mouse, "value": 'PRESS'},
+ {"properties": [("extend", False)]}),
+ ("uv.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True)]}),
+ ("uv.select_loop", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
+ {"properties": [("extend", False)]}),
+ ("uv.select_loop", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("extend", True)]}),
+ ("uv.select_split", {"type": 'Y', "value": 'PRESS'}, None),
+ ("uv.select_box", {"type": 'B', "value": 'PRESS'},
+ {"properties": [("pinned", False)]}),
+ ("uv.select_box", {"type": 'B', "value": 'PRESS', "ctrl": True},
+ {"properties": [("pinned", True)]}),
+ ("uv.circle_select", {"type": 'C', "value": 'PRESS'}, None),
+ ("uv.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True},
+ {"properties": [("deselect", False)]}),
+ ("uv.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True},
+ {"properties": [("deselect", True)]}),
+ ("uv.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True},
+ {"properties": [("extend", True), ("deselect", False)]}),
+ ("uv.select_linked_pick", {"type": 'L', "value": 'PRESS'},
+ {"properties": [("extend", True), ("deselect", False)]}),
+ ("uv.select_linked", {"type": 'L', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("extend", False), ("deselect", True)]}),
+ ("uv.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
+ {"properties": [("extend", False), ("deselect", True)]}),
+ ("uv.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
+ ("uv.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
+ *_template_items_select_actions("uv.select_all"),
+ ("uv.select_pinned", {"type": 'P', "value": 'PRESS', "shift": True}, None),
+ op_menu("IMAGE_MT_uvs_weldalign", {"type": 'W', "value": 'PRESS', "shift": True}),
+ ("uv.stitch", {"type": 'V', "value": 'PRESS'}, None),
+ ("uv.pin", {"type": 'P', "value": 'PRESS'},
+ {"properties": [("clear", False)]}),
+ ("uv.pin", {"type": 'P', "value": 'PRESS', "alt": True},
+ {"properties": [("clear", True)]}),
+ ("uv.unwrap", {"type": 'U', "value": 'PRESS'}, None),
+ ("uv.hide", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("uv.hide", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
+ ("uv.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
+ ("uv.cursor_set", {"type": params.action_mouse, "value": 'PRESS'}, None),
+ op_menu_pie("IMAGE_MT_uvs_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
+ op_menu("IMAGE_MT_uvs_select_mode", {"type": 'TAB', "value": 'PRESS', "ctrl": True}),
+ *_template_items_proportional_editing(connected=False),
+ ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
+ ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
+ ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
+ ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
+ ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
+ ("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
+ ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path", 'tool_settings.use_snap')]}),
+ ("wm.context_menu_enum", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("data_path", 'tool_settings.snap_uv_element')]}),
+ ])
+
+ if params.legacy:
+ items.extend([
+ ("uv.minimize_stretch", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
+ ("uv.pack_islands", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
+ ("uv.average_islands_scale", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
+ ("wm.context_toggle", {"type": 'Q', "value": 'PRESS'},
+ {"properties": [("data_path", 'tool_settings.use_uv_sculpt')]}),
+ ])
+
+ return keymap
+
+
+def km_uv_sculpt(_params):
+ items = []
+ keymap = (
+ "UV Sculpt",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("wm.context_toggle", {"type": 'Q', "value": 'PRESS'},
+ {"properties": [("data_path", 'tool_settings.use_uv_sculpt')]}),
+ ("sculpt.uv_sculpt_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS'},
+ {"properties": [("mode", 'NORMAL')]}),
+ ("sculpt.uv_sculpt_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'INVERT')]}),
+ ("sculpt.uv_sculpt_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
+ {"properties": [("mode", 'RELAX')]}),
+ ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
+ {"properties": [("scalar", 0.9)]}),
+ ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
+ {"properties": [("scalar", 1.0 / 0.9)]}),
+ *_template_paint_radial_control("uv_sculpt"),
+ ("brush.uv_sculpt_tool_set", {"type": 'S', "value": 'PRESS'},
+ {"properties": [("tool", 'RELAX')]}),
+ ("brush.uv_sculpt_tool_set", {"type": 'P', "value": 'PRESS'},
+ {"properties": [("tool", 'PINCH')]}),
+ ("brush.uv_sculpt_tool_set", {"type": 'G', "value": 'PRESS'},
+ {"properties": [("tool", 'GRAB')]}),
+ ])
+
+ return keymap
+
+
+# 3D View: all regions.
+def km_view3d_generic(_params):
+ items = []
+ keymap = (
+ "3D View Generic",
+ {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("view3d.properties", {"type": 'N', "value": 'PRESS'}, None),
+ ("view3d.toolshelf", {"type": 'T', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+# 3D View: main region.
+def km_view3d(params):
+ items = []
+ keymap = (
+ "3D View",
+ {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Cursor.
+ ("view3d.cursor3d", {"type": params.action_mouse, "value": 'CLICK'}, None),
+ # Navigation.
+ ("view3d.rotate", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
+ ("view3d.move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
+ ("view3d.zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
+ ("view3d.dolly", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("view3d.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "ctrl": True},
+ {"properties": [("use_all_regions", True)]}),
+ ("view3d.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'},
+ {"properties": [("use_all_regions", False)]}),
+ ("view3d.smoothview", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
+ ("view3d.rotate", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
+ ("view3d.rotate", {"type": 'MOUSEROTATE', "value": 'ANY'}, None),
+ ("view3d.move", {"type": 'TRACKPADPAN', "value": 'ANY', "shift": True}, None),
+ ("view3d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
+ ("view3d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
+ ("view3d.zoom", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
+ {"properties": [("delta", 1)]}),
+ ("view3d.zoom", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
+ {"properties": [("delta", -1)]}),
+ ("view3d.zoom", {"type": 'EQUAL', "value": 'PRESS', "ctrl": True},
+ {"properties": [("delta", 1)]}),
+ ("view3d.zoom", {"type": 'MINUS', "value": 'PRESS', "ctrl": True},
+ {"properties": [("delta", -1)]}),
+ ("view3d.zoom", {"type": 'WHEELINMOUSE', "value": 'PRESS'},
+ {"properties": [("delta", 1)]}),
+ ("view3d.zoom", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'},
+ {"properties": [("delta", -1)]}),
+ ("view3d.dolly", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
+ {"properties": [("delta", 1)]}),
+ ("view3d.dolly", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
+ {"properties": [("delta", -1)]}),
+ ("view3d.dolly", {"type": 'EQUAL', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("delta", 1)]}),
+ ("view3d.dolly", {"type": 'MINUS', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("delta", -1)]}),
+ ("view3d.view_center_camera", {"type": 'HOME', "value": 'PRESS'}, None),
+ ("view3d.view_center_lock", {"type": 'HOME', "value": 'PRESS'}, None),
+ ("view3d.view_all", {"type": 'HOME', "value": 'PRESS'},
+ {"properties": [("center", False)]}),
+ ("view3d.view_all", {"type": 'HOME', "value": 'PRESS', "ctrl": True},
+ {"properties": [("use_all_regions", True), ("center", False)]}),
+ op_menu_pie("VIEW3D_MT_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}),
+ ("view3d.navigate", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "shift": True}, None),
+ # Numpad views.
+ ("view3d.view_camera", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
+ ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS'},
+ {"properties": [("type", 'FRONT')]}),
+ ("view3d.view_orbit", {"type": 'NUMPAD_2', "value": 'PRESS'},
+ {"properties": [("type", 'ORBITDOWN')]}),
+ ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS'},
+ {"properties": [("type", 'RIGHT')]}),
+ ("view3d.view_orbit", {"type": 'NUMPAD_4', "value": 'PRESS'},
+ {"properties": [("type", 'ORBITLEFT')]}),
+ ("view3d.view_persportho", {"type": 'NUMPAD_5', "value": 'PRESS'}, None),
+ ("view3d.view_orbit", {"type": 'NUMPAD_6', "value": 'PRESS'},
+ {"properties": [("type", 'ORBITRIGHT')]}),
+ ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS'},
+ {"properties": [("type", 'TOP')]}),
+ ("view3d.view_orbit", {"type": 'NUMPAD_8', "value": 'PRESS'},
+ {"properties": [("type", 'ORBITUP')]}),
+ ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'BACK')]}),
+ ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'LEFT')]}),
+ ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'BOTTOM')]}),
+ ("view3d.view_pan", {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'PANDOWN')]}),
+ ("view3d.view_pan", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'PANLEFT')]}),
+ ("view3d.view_pan", {"type": 'NUMPAD_6', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'PANRIGHT')]}),
+ ("view3d.view_pan", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'PANUP')]}),
+ ("view3d.view_roll", {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'LEFT')]}),
+ ("view3d.view_roll", {"type": 'NUMPAD_6', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'RIGHT')]}),
+ ("view3d.view_orbit", {"type": 'NUMPAD_9', "value": 'PRESS'},
+ {"properties": [("angle", 3.1415927), ("type", 'ORBITRIGHT')]}),
+ ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'FRONT'), ("align_active", True)]}),
+ ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'RIGHT'), ("align_active", True)]}),
+ ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'TOP'), ("align_active", True)]}),
+ ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("type", 'BACK'), ("align_active", True)]}),
+ ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("type", 'LEFT'), ("align_active", True)]}),
+ ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("type", 'BOTTOM'), ("align_active", True)]}),
+ ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'NORTH', "alt": True},
+ {"properties": [("type", 'TOP'), ("relative", True)]}),
+ ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'SOUTH', "alt": True},
+ {"properties": [("type", 'BOTTOM'), ("relative", True)]}),
+ ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'EAST', "alt": True},
+ {"properties": [("type", 'RIGHT'), ("relative", True)]}),
+ ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'WEST', "alt": True},
+ {"properties": [("type", 'LEFT'), ("relative", True)]}),
+ ("view3d.ndof_orbit_zoom", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
+ ("view3d.ndof_orbit", {"type": 'NDOF_MOTION', "value": 'ANY', "ctrl": True}, None),
+ ("view3d.ndof_pan", {"type": 'NDOF_MOTION', "value": 'ANY', "shift": True}, None),
+ ("view3d.ndof_all", {"type": 'NDOF_MOTION', "value": 'ANY', "shift": True, "ctrl": True}, None),
+ ("view3d.view_selected", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'},
+ {"properties": [("use_all_regions", False)]}),
+ ("view3d.view_roll", {"type": 'NDOF_BUTTON_ROLL_CCW', "value": 'PRESS'},
+ {"properties": [("type", 'LEFT')]}),
+ ("view3d.view_roll", {"type": 'NDOF_BUTTON_ROLL_CCW', "value": 'PRESS'},
+ {"properties": [("type", 'RIGHT')]}),
+ ("view3d.view_axis", {"type": 'NDOF_BUTTON_FRONT', "value": 'PRESS'},
+ {"properties": [("type", 'FRONT')]}),
+ ("view3d.view_axis", {"type": 'NDOF_BUTTON_BACK', "value": 'PRESS'},
+ {"properties": [("type", 'BACK')]}),
+ ("view3d.view_axis", {"type": 'NDOF_BUTTON_LEFT', "value": 'PRESS'},
+ {"properties": [("type", 'LEFT')]}),
+ ("view3d.view_axis", {"type": 'NDOF_BUTTON_RIGHT', "value": 'PRESS'},
+ {"properties": [("type", 'RIGHT')]}),
+ ("view3d.view_axis", {"type": 'NDOF_BUTTON_TOP', "value": 'PRESS'},
+ {"properties": [("type", 'TOP')]}),
+ ("view3d.view_axis", {"type": 'NDOF_BUTTON_BOTTOM', "value": 'PRESS'},
+ {"properties": [("type", 'BOTTOM')]}),
+ ("view3d.view_axis", {"type": 'NDOF_BUTTON_FRONT', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'FRONT'), ("align_active", True)]}),
+ ("view3d.view_axis", {"type": 'NDOF_BUTTON_RIGHT', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'RIGHT'), ("align_active", True)]}),
+ ("view3d.view_axis", {"type": 'NDOF_BUTTON_TOP', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'TOP'), ("align_active", True)]}),
+ # Selection.
+ ("view3d.select", {"type": params.select_mouse, "value": 'PRESS'},
+ {"properties": [
+ ("extend", False),
+ ("deselect", False),
+ ("toggle", False),
+ ("center", False),
+ ("enumerate", False),
+ ("object", False),
+ ], },),
+ ("view3d.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [
+ ("extend", False),
+ ("deselect", False),
+ ("toggle", True),
+ ("center", False),
+ ("enumerate", False),
+ ("object", False),
+ ], },),
+ ("view3d.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
+ {"properties": [
+ ("extend", False),
+ ("deselect", False),
+ ("toggle", False),
+ ("center", True),
+ ("enumerate", False),
+ ("object", True),
+ ], },),
+ ("view3d.select", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
+ {"properties": [
+ ("extend", False),
+ ("deselect", False),
+ ("toggle", False),
+ ("center", False),
+ ("enumerate", True),
+ ("object", False),
+ ], },),
+ ("view3d.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [
+ ("extend", True),
+ ("deselect", False),
+ ("toggle", True),
+ ("center", True),
+ ("enumerate", False),
+ ("object", False),
+ ], },),
+ ("view3d.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [
+ ("extend", False),
+ ("deselect", False),
+ ("toggle", False),
+ ("center", True),
+ ("enumerate", True),
+ ("object", False),
+ ], },),
+ ("view3d.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [
+ ("extend", False),
+ ("deselect", False),
+ ("toggle", True),
+ ("center", False),
+ ("enumerate", True),
+ ("object", False),
+ ], },),
+ ("view3d.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
+ {"properties": [
+ ("extend", False),
+ ("deselect", False),
+ ("toggle", True),
+ ("center", True),
+ ("enumerate", True),
+ ("object", False),
+ ], },),
+ ("view3d.select_box", {"type": 'B', "value": 'PRESS'}, None),
+ ("view3d.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True},
+ {"properties": [("mode", 'ADD')]}),
+ ("view3d.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True},
+ {"properties": [("mode", 'SUB')]}),
+ ("view3d.select_circle", {"type": 'C', "value": 'PRESS'}, None),
+ # Borders.
+ ("view3d.clip_border", {"type": 'B', "value": 'PRESS', "alt": True}, None),
+ ("view3d.zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None),
+ ("view3d.render_border", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
+ ("view3d.clear_render_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ # Cameras.
+ ("view3d.camera_to_view", {"type": 'NUMPAD_0', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("view3d.object_as_camera", {"type": 'NUMPAD_0', "value": 'PRESS', "ctrl": True}, None),
+ # Copy/paste.
+ ("view3d.copybuffer", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
+ ("view3d.pastebuffer", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
+ # Menus.
+ op_menu_pie("VIEW3D_MT_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
+ op_menu_pie("VIEW3D_MT_pivot_pie", {"type": 'PERIOD', "value": 'PRESS'}),
+ op_menu_pie("VIEW3D_MT_orientations_pie", {"type": 'COMMA', "value": 'PRESS'}),
+ # Transform.
+ ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
+ ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
+ ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
+ ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
+ ("transform.bend", {"type": 'W', "value": 'PRESS', "shift": True}, None),
+ ("transform.tosphere", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True}, None),
+ ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
+ ("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
+ ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path", 'tool_settings.use_snap')]}),
+ op_panel("VIEW3D_PT_snapping", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True}, [("keep_open", False)]),
+ ("object.transform_axis_target", {"type": 'T', "value": 'PRESS', "shift": True}, None),
+ ("transform.skin_resize", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ if params.apple:
+ items.extend([
+ ("view3d.copybuffer", {"type": 'C', "value": 'PRESS', "oskey": True}, None),
+ ("view3d.pastebuffer", {"type": 'V', "value": 'PRESS', "oskey": True}, None),
+ ])
+
+ if not params.legacy:
+ # New pie menus.
+ items.extend([
+ ("wm.context_toggle", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'space_data.show_gizmo_tool')]}),
+ op_menu_pie("VIEW3D_MT_pivot_pie", {"type": 'PERIOD', "value": 'PRESS'}),
+ op_menu_pie("VIEW3D_MT_orientations_pie", {"type": 'COMMA', "value": 'PRESS'}),
+ op_menu_pie("VIEW3D_MT_shading_pie", {"type": 'Z', "value": 'PRESS'}),
+ ("view3d.toggle_shading", {"type": 'Z', "value": 'PRESS', "alt": True},
+ {"properties": [("type", 'MATERIAL')]}),
+ ("view3d.toggle_shading", {"type": 'Z', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'RENDERED')]}),
+ ])
+ else:
+ items.extend([
+ # Old navigation.
+ ("view3d.view_lock_to_active", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "shift": True}, None),
+ ("view3d.view_lock_clear", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "alt": True}, None),
+ ("view3d.navigate", {"type": 'F', "value": 'PRESS', "shift": True}, None),
+ ("view3d.zoom_camera_1_to_1", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "shift": True}, None),
+ ("view3d.view_center_cursor", {"type": 'HOME', "value": 'PRESS', "alt": True}, None),
+ ("view3d.view_center_pick", {"type": 'F', "value": 'PRESS', "alt": True}, None),
+ ("view3d.view_all", {"type": 'C', "value": 'PRESS', "shift": True},
+ {"properties": [("center", True)]}),
+ ("view3d.view_pan", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'PANRIGHT')]}),
+ ("view3d.view_pan", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'PANLEFT')]}),
+ ("view3d.view_pan", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'PANUP')]}),
+ ("view3d.view_pan", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'PANDOWN')]}),
+ ("view3d.view_orbit", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("type", 'ORBITLEFT')]}),
+ ("view3d.view_orbit", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("type", 'ORBITRIGHT')]}),
+ ("view3d.view_orbit", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("type", 'ORBITUP')]}),
+ ("view3d.view_orbit", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("type", 'ORBITDOWN')]}),
+ ("view3d.view_roll", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("type", 'LEFT')]}),
+ ("view3d.view_roll", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("type", 'RIGHT')]}),
+ ("transform.create_orientation", {"type": 'SPACE', "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("use", True)]}),
+ ("transform.translate", {"type": 'T', "value": 'PRESS', "shift": True},
+ {"properties": [("texture_space", True)]}),
+ ("transform.resize", {"type": 'T', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("texture_space", True)]}),
+ # Old pivot.
+ ("wm.context_set_enum", {"type": 'COMMA', "value": 'PRESS'},
+ {"properties": [("data_path", 'space_data.pivot_point'), ("value", 'BOUNDING_BOX_CENTER')]}),
+ ("wm.context_set_enum", {"type": 'COMMA', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'space_data.pivot_point'), ("value", 'MEDIAN_POINT')]}),
+ ("wm.context_toggle", {"type": 'COMMA', "value": 'PRESS', "alt": True},
+ {"properties": [("data_path", 'tool_settings.use_transform_pivot_point_align')]}),
+ ("wm.context_toggle", {"type": 'SPACE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'space_data.show_gizmo_tool')]}),
+ ("wm.context_set_enum", {"type": 'PERIOD', "value": 'PRESS'},
+ {"properties": [("data_path", 'space_data.pivot_point'), ("value", 'CURSOR')]}),
+ ("wm.context_set_enum", {"type": 'PERIOD', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'space_data.pivot_point'), ("value", 'INDIVIDUAL_ORIGINS')]}),
+ ("wm.context_set_enum", {"type": 'PERIOD', "value": 'PRESS', "alt": True},
+ {"properties": [("data_path", 'space_data.pivot_point'), ("value", 'ACTIVE_ELEMENT')]}),
+ # Old shading.
+ ("wm.context_toggle_enum", {"type": 'Z', "value": 'PRESS'},
+ {"properties": [("data_path", 'space_data.shading.type'), ("value_1", 'WIREFRAME'), ("value_2", 'SOLID')]}),
+ ("wm.context_toggle_enum", {"type": 'Z', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path", 'space_data.shading.type'), ("value_1", 'RENDERED'), ("value_2", 'SOLID')]}),
+ ("wm.context_toggle_enum", {"type": 'Z', "value": 'PRESS', "alt": True},
+ {"properties": [("data_path", 'space_data.shading.type'), ("value_1", 'MATERIAL'), ("value_2", 'SOLID')]}),
+ ])
+
+ return keymap
+
+
+def km_mask_editing(params):
+ items = []
+ keymap = (
+ "Mask Editing",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("mask.new", {"type": 'N', "value": 'PRESS', "alt": True}, None),
+ op_menu("MASK_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}),
+ op_menu_pie("VIEW3D_MT_proportional_editing_falloff_pie", {"type": 'O', "value": 'PRESS', "shift": True}),
+ ("wm.context_toggle", {"type": 'O', "value": 'PRESS'},
+ {"properties": [("data_path", 'tool_settings.use_proportional_edit_mask')]}),
+ ("mask.add_vertex_slide", {"type": params.action_mouse, "value": 'PRESS', "ctrl": True}, None),
+ ("mask.add_feather_vertex_slide", {"type": params.action_mouse, "value": 'PRESS', "shift": True}, None),
+ ("mask.delete", {"type": 'X', "value": 'PRESS'}, None),
+ ("mask.delete", {"type": 'DEL', "value": 'PRESS'}, None),
+ ("mask.select", {"type": params.select_mouse, "value": 'PRESS'},
+ {"properties": [("extend", False), ("deselect", False), ("toggle", False)]}),
+ ("mask.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("extend", False), ("deselect", False), ("toggle", True)]}),
+ *_template_items_select_actions("mask.select_all"),
+ ("mask.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
+ ("mask.select_linked_pick", {"type": 'L', "value": 'PRESS'},
+ {"properties": [("deselect", False)]}),
+ ("mask.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
+ {"properties": [("deselect", True)]}),
+ ("mask.select_box", {"type": 'B', "value": 'PRESS'}, None),
+ ("mask.select_circle", {"type": 'C', "value": 'PRESS'}, None),
+ ("mask.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True, "alt": True},
+ {"properties": [("deselect", False)]}),
+ ("mask.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
+ {"properties": [("deselect", True)]}),
+ ("mask.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
+ ("mask.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
+ ("mask.hide_view_clear", {"type": 'H', "value": 'PRESS', "alt": True}, None),
+ ("mask.hide_view_set", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("mask.hide_view_set", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
+ ("clip.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
+ {"properties": [("extend", False)]}),
+ ("mask.cyclic_toggle", {"type": 'C', "value": 'PRESS', "alt": True}, None),
+ ("mask.slide_point", {"type": params.action_mouse, "value": 'PRESS'}, None),
+ ("mask.slide_spline_curvature", {"type": params.action_mouse, "value": 'PRESS'}, None),
+ ("mask.handle_type_set", {"type": 'V', "value": 'PRESS'}, None),
+ ("mask.normals_make_consistent", {"type": 'N', "value": 'PRESS', "ctrl" if params.legacy else "shift": True}, None),
+ ("mask.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
+ ("mask.parent_clear", {"type": 'P', "value": 'PRESS', "alt": True}, None),
+ ("mask.shape_key_insert", {"type": 'I', "value": 'PRESS'}, None),
+ ("mask.shape_key_clear", {"type": 'I', "value": 'PRESS', "alt": True}, None),
+ ("mask.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ ("mask.copy_splines", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
+ ("mask.paste_splines", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
+ ("uv.cursor_set", {"type": params.action_mouse, "value": 'PRESS'}, None),
+ ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
+ ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
+ ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
+ ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
+ ("transform.transform", {"type": 'S', "value": 'PRESS', "alt": True},
+ {"properties": [("mode", 'MASK_SHRINKFATTEN')]}),
+ ])
+
+ return keymap
+
+
+def km_markers(params):
+ items = []
+ keymap = (
+ "Markers",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
+ ("marker.move", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
+ ("marker.duplicate", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ ("marker.select", {"type": params.select_mouse, "value": 'PRESS'}, None),
+ ("marker.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True)]}),
+ ("marker.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
+ {"properties": [("extend", False), ("camera", True)]}),
+ ("marker.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("extend", True), ("camera", True)]}),
+ ("marker.select_box", {"type": 'B', "value": 'PRESS'}, None),
+ *_template_items_select_actions("marker.select_all"),
+ ("marker.delete", {"type": 'X', "value": 'PRESS'}, None),
+ ("marker.delete", {"type": 'DEL', "value": 'PRESS'}, None),
+ ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
+ ("marker.move", {"type": 'G', "value": 'PRESS'}, None),
+ ("marker.camera_bind", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ return keymap
+
+
+def km_graph_editor_generic(_params):
+ items = []
+ keymap = (
+ "Graph Editor Generic",
+ {"space_type": 'GRAPH_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("graph.properties", {"type": 'N', "value": 'PRESS'}, None),
+ ("graph.extrapolation_type", {"type": 'E', "value": 'PRESS', "shift": True}, None),
+ ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
+ ("graph.hide", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("graph.hide", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
+ ("graph.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
+ ])
+
+ return keymap
+
+
+def km_graph_editor(params):
+ items = []
+ keymap = (
+ "Graph Editor",
+ {"space_type": 'GRAPH_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("wm.context_toggle", {"type": 'H', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'space_data.show_handles')]}),
+ ("graph.cursor_set", {"type": params.action_mouse, "value": 'PRESS'}, None),
+ ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS'},
+ {"properties": [("extend", False), ("column", False), ("curves", False)]}),
+ ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
+ {"properties": [("extend", False), ("column", True), ("curves", False)]}),
+ ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True), ("column", False), ("curves", False)]}),
+ ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("extend", True), ("column", True), ("curves", False)]}),
+ ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("extend", False), ("column", False), ("curves", True)]}),
+ ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
+ {"properties": [("extend", True), ("column", False), ("curves", True)]}),
+ ("graph.select_leftright", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'CHECK'), ("extend", False)]}),
+ ("graph.select_leftright", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("mode", 'CHECK'), ("extend", True)]}),
+ ("graph.select_leftright", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
+ {"properties": [("mode", 'LEFT'), ("extend", False)]}),
+ ("graph.select_leftright", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
+ {"properties": [("mode", 'RIGHT'), ("extend", False)]}),
+ *_template_items_select_actions("graph.select_all"),
+ ("graph.select_box", {"type": 'B', "value": 'PRESS'},
+ {"properties": [("axis_range", False), ("include_handles", False)]}),
+ ("graph.select_box", {"type": 'B', "value": 'PRESS', "alt": True},
+ {"properties": [("axis_range", True), ("include_handles", False)]}),
+ ("graph.select_box", {"type": 'B', "value": 'PRESS', "ctrl": True},
+ {"properties": [("axis_range", False), ("include_handles", True)]}),
+ ("graph.select_box", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("axis_range", True), ("include_handles", True)]}),
+ ("graph.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True},
+ {"properties": [("deselect", False)]}),
+ ("graph.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True},
+ {"properties": [("deselect", True)]}),
+ ("graph.select_circle", {"type": 'C', "value": 'PRESS'}, None),
+ ("graph.select_column", {"type": 'K', "value": 'PRESS'},
+ {"properties": [("mode", 'KEYS')]}),
+ ("graph.select_column", {"type": 'K', "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'CFRA')]}),
+ ("graph.select_column", {"type": 'K', "value": 'PRESS', "shift": True},
+ {"properties": [("mode", 'MARKERS_COLUMN')]}),
+ ("graph.select_column", {"type": 'K', "value": 'PRESS', "alt": True},
+ {"properties": [("mode", 'MARKERS_BETWEEN')]}),
+ ("graph.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
+ ("graph.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
+ ("graph.select_linked", {"type": 'L', "value": 'PRESS'}, None),
+ ("graph.frame_jump", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
+ op_menu_pie("GRAPH_MT_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
+ ("graph.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
+ ("graph.handle_type", {"type": 'V', "value": 'PRESS'}, None),
+ ("graph.interpolation_type", {"type": 'T', "value": 'PRESS'}, None),
+ ("graph.easing_type", {"type": 'E', "value": 'PRESS', "ctrl": True}, None),
+ ("graph.smooth", {"type": 'O', "value": 'PRESS', "alt": True}, None),
+ ("graph.sample", {"type": 'O', "value": 'PRESS', "shift": True, "alt": True}, None),
+ ("graph.bake", {"type": 'C', "value": 'PRESS', "alt": True}, None),
+ op_menu("GRAPH_MT_delete", {"type": 'X', "value": 'PRESS'}),
+ op_menu("GRAPH_MT_delete", {"type": 'DEL', "value": 'PRESS'}),
+ op_menu("GRAPH_MT_specials", {"type": 'W', "value": 'PRESS'}),
+ ("graph.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ ("graph.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
+ ("graph.click_insert", {"type": params.action_mouse, "value": 'CLICK', "ctrl": True},
+ {"properties": [("extend", False)]}),
+ ("graph.click_insert", {"type": params.action_mouse, "value": 'CLICK', "shift": True, "ctrl": True},
+ {"properties": [("extend", True)]}),
+ ("graph.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
+ ("graph.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
+ ("graph.paste", {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("flipped", True)]}),
+ ("graph.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("graph.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
+ ("graph.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
+ ("graph.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
+ ("graph.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
+ ("graph.fmodifier_add", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("only_active", False)]}),
+ ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
+ ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
+ ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
+ ("transform.transform", {"type": 'E', "value": 'PRESS'},
+ {"properties": [("mode", 'TIME_EXTEND')]}),
+ ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
+ ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
+ ("wm.context_toggle", {"type": 'O', "value": 'PRESS'},
+ {"properties": [("data_path", 'tool_settings.use_proportional_fcurve')]}),
+ op_menu_pie("VIEW3D_MT_proportional_editing_falloff_pie", {"type": 'O', "value": 'PRESS', "shift": True}),
+ op_menu_pie("GRAPH_MT_pivot_pie", {"type": 'PERIOD', "value": 'PRESS'}),
+ ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
+ ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ if params.apple:
+ items.extend([
+ ("graph.copy", {"type": 'C', "value": 'PRESS', "oskey": True}, None),
+ ("graph.paste", {"type": 'V', "value": 'PRESS', "oskey": True}, None),
+ ("graph.paste", {"type": 'V', "value": 'PRESS', "shift": True, "oskey": True},
+ {"properties": [("flipped", True)]}),
+ ])
+
+ return keymap
+
+
+def km_image_generic(_params):
+ items = []
+ keymap = (
+ "Image Generic",
+ {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("image.new", {"type": 'N', "value": 'PRESS', "alt": True}, None),
+ ("image.open", {"type": 'O', "value": 'PRESS', "alt": True}, None),
+ ("image.reload", {"type": 'R', "value": 'PRESS', "alt": True}, None),
+ ("image.read_viewlayers", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
+ ("image.save", {"type": 'S', "value": 'PRESS', "alt": True}, None),
+ ("image.save_as", {"type": 'S', "value": 'PRESS', "shift": True}, None),
+ ("image.properties", {"type": 'N', "value": 'PRESS'}, None),
+ ("image.toolshelf", {"type": 'T', "value": 'PRESS'}, None),
+ op_menu("IMAGE_MT_specials", {"type": 'W', "value": 'PRESS'}),
+ ("image.cycle_render_slot", {"type": 'J', "value": 'PRESS'}, None),
+ ("image.cycle_render_slot", {"type": 'J', "value": 'PRESS', "alt": True},
+ {"properties": [("reverse", True)]}),
+ ])
+
+ return keymap
+
+
+def km_image(params):
+ items = []
+ keymap = (
+ "Image",
+ {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("image.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
+ ("image.view_all", {"type": 'HOME', "value": 'PRESS', "shift": True},
+ {"properties": [("fit_view", True)]}),
+ ("image.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
+ ("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
+ ("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
+ ("image.view_pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
+ ("image.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
+ ("image.view_ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
+ ("image.view_zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None),
+ ("image.view_zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None),
+ ("image.view_zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
+ ("image.view_zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
+ ("image.view_zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
+ ("image.view_zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
+ ("image.view_zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
+ ("image.view_zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None),
+ ("image.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True},
+ {"properties": [("ratio", 8.0)]}),
+ ("image.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True},
+ {"properties": [("ratio", 4.0)]}),
+ ("image.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True},
+ {"properties": [("ratio", 2.0)]}),
+ ("image.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "shift": True},
+ {"properties": [("ratio", 8.0)]}),
+ ("image.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True},
+ {"properties": [("ratio", 4.0)]}),
+ ("image.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "shift": True},
+ {"properties": [("ratio", 2.0)]}),
+ ("image.view_zoom_ratio", {"type": 'NUMPAD_1', "value": 'PRESS'},
+ {"properties": [("ratio", 1.0)]}),
+ ("image.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS'},
+ {"properties": [("ratio", 0.5)]}),
+ ("image.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS'},
+ {"properties": [("ratio", 0.25)]}),
+ ("image.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS'},
+ {"properties": [("ratio", 0.125)]}),
+ ("image.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("image.sample", {"type": params.action_mouse, "value": 'PRESS'}, None),
+ ("image.curves_point_set", {"type": params.action_mouse, "value": 'PRESS', "ctrl": True},
+ {"properties": [("point", 'BLACK_POINT')]}),
+ ("image.curves_point_set", {"type": params.action_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("point", 'WHITE_POINT')]}),
+ ("object.mode_set", {"type": 'TAB', "value": 'PRESS'},
+ {"properties": [("mode", 'EDIT'), ("toggle", True)]}),
+ *(
+ (("wm.context_set_int",
+ {"type": NUMBERS_1[i], "value": 'PRESS'},
+ {"properties": [("data_path", 'space_data.image.render_slots.active_index'), ("value", i)]})
+ for i in range(9)
+ )
+ ),
+ op_menu_pie("IMAGE_MT_pivot_pie", {"type": 'PERIOD', "value": 'PRESS'}),
+ ("image.render_border", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
+ ("image.clear_render_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ])
+
+ return keymap
+
+
+def km_node_generic(_params):
+ items = []
+ keymap = (
+ "Node Generic",
+ {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("node.properties", {"type": 'N', "value": 'PRESS'}, None),
+ ("node.toolbar", {"type": 'T', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+def km_node_editor(params):
+ items = []
+ keymap = (
+ "Node Editor",
+ {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("node.select", {"type": params.action_mouse, "value": 'PRESS'},
+ {"properties": [("extend", False)]}),
+ ("node.select", {"type": params.select_mouse, "value": 'PRESS'},
+ {"properties": [("extend", False)]}),
+ ("node.select", {"type": params.action_mouse, "value": 'PRESS', "ctrl": True},
+ {"properties": [("extend", False)]}),
+ ("node.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
+ {"properties": [("extend", False)]}),
+ ("node.select", {"type": params.action_mouse, "value": 'PRESS', "alt": True},
+ {"properties": [("extend", False)]}),
+ ("node.select", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
+ {"properties": [("extend", False)]}),
+ ("node.select", {"type": params.action_mouse, "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("extend", False)]}),
+ ("node.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("extend", False)]}),
+ ("node.select", {"type": params.action_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True)]}),
+ ("node.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True)]}),
+ ("node.select", {"type": params.action_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("extend", True)]}),
+ ("node.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("extend", True)]}),
+ ("node.select", {"type": params.action_mouse, "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("extend", True)]}),
+ ("node.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("extend", True)]}),
+ ("node.select", {"type": params.action_mouse, "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
+ {"properties": [("extend", True)]}),
+ ("node.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
+ {"properties": [("extend", True)]}),
+ ("node.select_box", {"type": 'EVT_TWEAK_S', "value": 'ANY'},
+ {"properties": [("tweak", True)]}),
+ ("node.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True, "alt": True},
+ {"properties": [("deselect", False)]}),
+ ("node.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
+ {"properties": [("deselect", True)]}),
+ ("node.select_circle", {"type": 'C', "value": 'PRESS'}, None),
+ ("node.link", {"type": 'LEFTMOUSE', "value": 'PRESS'},
+ {"properties": [("detach", False)]}),
+ ("node.link", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("detach", True)]}),
+ ("node.resize", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("node.add_reroute", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, None),
+ ("node.links_cut", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
+ ("node.select_link_viewer", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("node.backimage_move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None),
+ ("node.backimage_zoom", {"type": 'V', "value": 'PRESS'},
+ {"properties": [("factor", 1.0 / 1.2)]}),
+ ("node.backimage_zoom", {"type": 'V', "value": 'PRESS', "alt": True},
+ {"properties": [("factor", 1.2)]}),
+ ("node.backimage_fit", {"type": 'HOME', "value": 'PRESS', "alt": True}, None),
+ ("node.backimage_sample", {"type": params.action_mouse, "value": 'PRESS', "alt": True}, None),
+ op_menu("NODE_MT_specials", {"type": 'W', "value": 'PRESS'}),
+ ("node.link_make", {"type": 'F', "value": 'PRESS'},
+ {"properties": [("replace", False)]}),
+ ("node.link_make", {"type": 'F', "value": 'PRESS', "shift": True},
+ {"properties": [("replace", True)]}),
+ op_menu("NODE_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}),
+ ("node.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ ("node.duplicate_move_keep_inputs", {"type": 'D', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("node.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
+ ("node.detach", {"type": 'P', "value": 'PRESS', "alt": True}, None),
+ ("node.join", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
+ ("node.hide_toggle", {"type": 'H', "value": 'PRESS'}, None),
+ ("node.mute_toggle", {"type": 'M', "value": 'PRESS'}, None),
+ ("node.preview_toggle", {"type": 'H', "value": 'PRESS', "shift": True}, None),
+ ("node.hide_socket_toggle", {"type": 'H', "value": 'PRESS', "ctrl": True}, None),
+ ("node.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
+ ("node.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
+ ("node.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
+ ("node.select_box", {"type": 'B', "value": 'PRESS'},
+ {"properties": [("tweak", False)]}),
+ ("node.delete", {"type": 'X', "value": 'PRESS'}, None),
+ ("node.delete", {"type": 'DEL', "value": 'PRESS'}, None),
+ ("node.delete_reconnect", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
+ ("node.delete_reconnect", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None),
+ *_template_items_select_actions("node.select_all"),
+ ("node.select_linked_to", {"type": 'L', "value": 'PRESS', "shift": True}, None),
+ ("node.select_linked_from", {"type": 'L', "value": 'PRESS'}, None),
+ ("node.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True},
+ {"properties": [("extend", False)]}),
+ ("node.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("extend", True)]}),
+ ("node.select_same_type_step", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True},
+ {"properties": [("prev", False)]}),
+ ("node.select_same_type_step", {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True},
+ {"properties": [("prev", True)]}),
+ ("node.find_node", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
+ ("node.group_make", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
+ ("node.group_ungroup", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("node.group_separate", {"type": 'P', "value": 'PRESS'}, None),
+ ("node.group_edit", {"type": 'TAB', "value": 'PRESS'},
+ {"properties": [("exit", False)]}),
+ ("node.group_edit", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
+ {"properties": [("exit", True)]}),
+ ("node.read_viewlayers", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
+ ("node.render_changed", {"type": 'Z', "value": 'PRESS'}, None),
+ ("node.clipboard_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
+ ("node.clipboard_paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
+ ("node.viewer_border", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
+ ("node.clear_viewer_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("node.translate_attach", {"type": 'G', "value": 'PRESS'}, None),
+ ("node.translate_attach", {"type": 'EVT_TWEAK_A', "value": 'ANY'}, None),
+ ("node.translate_attach", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
+ ("transform.translate", {"type": 'G', "value": 'PRESS'},
+ {"properties": [("release_confirm", True)]}),
+ ("transform.translate", {"type": 'EVT_TWEAK_A', "value": 'ANY'},
+ {"properties": [("release_confirm", True)]}),
+ ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'},
+ {"properties": [("release_confirm", True)]}),
+ ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
+ ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
+ ("node.move_detach_links", {"type": 'D', "value": 'PRESS', "alt": True}, None),
+ ("node.move_detach_links_release", {"type": 'EVT_TWEAK_A', "value": 'ANY', "alt": True}, None),
+ ("node.move_detach_links", {"type": 'EVT_TWEAK_S', "value": 'ANY', "alt": True}, None),
+ ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path", 'tool_settings.use_snap')]}),
+ ("wm.context_menu_enum", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("data_path", 'tool_settings.snap_node_element')]}),
+ ])
+
+ if params.apple:
+ items.extend([
+ ("node.clipboard_copy", {"type": 'C', "value": 'PRESS', "oskey": True}, None),
+ ("node.clipboard_paste", {"type": 'V', "value": 'PRESS', "oskey": True}, None),
+ ])
+
+ return keymap
+
+
+def km_info(params):
+ items = []
+ keymap = (
+ "Info",
+ {"space_type": 'INFO', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("info.select_pick", {"type": params.select_mouse, "value": 'PRESS'}, None),
+ ("info.select_all_toggle", {"type": 'A', "value": 'PRESS'}, None),
+ ("info.select_box", {"type": 'B', "value": 'PRESS'}, None),
+ ("info.report_replay", {"type": 'R', "value": 'PRESS'}, None),
+ ("info.report_delete", {"type": 'X', "value": 'PRESS'}, None),
+ ("info.report_delete", {"type": 'DEL', "value": 'PRESS'}, None),
+ ("info.report_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ if params.apple:
+ items.extend([
+ ("info.report_copy", {"type": 'C', "value": 'PRESS', "oskey": True}, None),
+ ])
+
+ return keymap
+
+
+def km_file_browser(_params):
+ items = []
+ keymap = (
+ "File Browser",
+ {"space_type": 'FILE_BROWSER', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("file.parent", {"type": 'UP_ARROW', "value": 'PRESS', "alt": True}, None),
+ ("file.previous", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True}, None),
+ ("file.next", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True}, None),
+ ("file.refresh", {"type": 'R', "value": 'PRESS'}, None),
+ ("file.parent", {"type": 'P', "value": 'PRESS'}, None),
+ ("file.previous", {"type": 'BACK_SPACE', "value": 'PRESS'}, None),
+ ("file.next", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None),
+ ("wm.context_toggle", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("data_path", 'space_data.params.show_hidden')]}),
+ ("file.directory_new", {"type": 'I', "value": 'PRESS'}, None),
+ ("file.delete", {"type": 'X', "value": 'PRESS'}, None),
+ ("file.delete", {"type": 'DEL', "value": 'PRESS'}, None),
+ ("file.smoothscroll", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
+ ("file.bookmark_toggle", {"type": 'T', "value": 'PRESS'}, None),
+ ("file.bookmark_add", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ return keymap
+
+
+def km_file_browser_main(_params):
+ items = []
+ keymap = (
+ "File Browser Main",
+ {"space_type": 'FILE_BROWSER', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("file.execute", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'},
+ {"properties": [("need_active", True)]}),
+ ("file.refresh", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
+ ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK'}, None),
+ ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
+ {"properties": [("extend", True)]}),
+ ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True},
+ {"properties": [("extend", True), ("fill", True)]}),
+ ("file.select", {"type": 'RIGHTMOUSE', "value": 'CLICK'},
+ {"properties": [("open", False)]}),
+ ("file.select", {"type": 'RIGHTMOUSE', "value": 'CLICK', "shift": True},
+ {"properties": [("extend", True), ("open", False)]}),
+ ("file.select", {"type": 'RIGHTMOUSE', "value": 'CLICK', "alt": True},
+ {"properties": [("extend", True), ("fill", True), ("open", False)]}),
+ ("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS'},
+ {"properties": [("direction", 'UP')]}),
+ ("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("direction", 'UP'), ("extend", True)]}),
+ ("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("direction", 'UP'), ("extend", True), ("fill", True)]}),
+ ("file.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS'},
+ {"properties": [("direction", 'DOWN')]}),
+ ("file.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("direction", 'DOWN'), ("extend", True)]}),
+ ("file.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("direction", 'DOWN'), ("extend", True), ("fill", True)]}),
+ ("file.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS'},
+ {"properties": [("direction", 'LEFT')]}),
+ ("file.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("direction", 'LEFT'), ("extend", True)]}),
+ ("file.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("direction", 'LEFT'), ("extend", True), ("fill", True)]}),
+ ("file.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS'},
+ {"properties": [("direction", 'RIGHT')]}),
+ ("file.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("direction", 'RIGHT'), ("extend", True)]}),
+ ("file.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("direction", 'RIGHT'), ("extend", True), ("fill", True)]}),
+ ("file.previous", {"type": 'BUTTON4MOUSE', "value": 'CLICK'}, None),
+ ("file.next", {"type": 'BUTTON5MOUSE', "value": 'CLICK'}, None),
+ ("file.select_all", {"type": 'A', "value": 'PRESS'}, None),
+ ("file.select_box", {"type": 'B', "value": 'PRESS'}, None),
+ ("file.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
+ ("file.rename", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
+ ("file.highlight", {"type": 'MOUSEMOVE', "value": 'ANY', "any": True}, None),
+ ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
+ {"properties": [("increment", 1)]}),
+ ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
+ {"properties": [("increment", 10)]}),
+ ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
+ {"properties": [("increment", 100)]}),
+ ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
+ {"properties": [("increment", -1)]}),
+ ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
+ {"properties": [("increment", -10)]}),
+ ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
+ {"properties": [("increment", -100)]}),
+ ])
+
+ return keymap
+
+
+def km_file_browser_buttons(_params):
+ items = []
+ keymap = (
+ "File Browser Buttons",
+ {"space_type": 'FILE_BROWSER', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
+ {"properties": [("increment", 1)]}),
+ ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
+ {"properties": [("increment", 10)]}),
+ ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
+ {"properties": [("increment", 100)]}),
+ ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
+ {"properties": [("increment", -1)]}),
+ ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
+ {"properties": [("increment", -10)]}),
+ ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
+ {"properties": [("increment", -100)]}),
+ ])
+
+ return keymap
+
+
+def km_dopesheet_generic(_params):
+ items = []
+ keymap = (
+ "Dopesheet Generic",
+ {"space_type": 'DOPESHEET_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("action.properties", {"type": 'N', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+def km_dopesheet(params):
+ items = []
+ keymap = (
+ "Dopesheet",
+ {"space_type": 'DOPESHEET_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS'},
+ {"properties": [("extend", False), ("column", False), ("channel", False)]}),
+ ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
+ {"properties": [("extend", False), ("column", True), ("channel", False)]}),
+ ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True), ("column", False), ("channel", False)]}),
+ ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("extend", True), ("column", True), ("channel", False)]}),
+ ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("extend", False), ("column", False), ("channel", True)]}),
+ ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
+ {"properties": [("extend", True), ("column", False), ("channel", True)]}),
+ ("action.select_leftright", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'CHECK'), ("extend", False)]}),
+ ("action.select_leftright", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("mode", 'CHECK'), ("extend", True)]}),
+ ("action.select_leftright", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
+ {"properties": [("mode", 'LEFT'), ("extend", False)]}),
+ ("action.select_leftright", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
+ {"properties": [("mode", 'RIGHT'), ("extend", False)]}),
+ *_template_items_select_actions("action.select_all"),
+ ("action.select_box", {"type": 'B', "value": 'PRESS'},
+ {"properties": [("axis_range", False)]}),
+ ("action.select_box", {"type": 'B', "value": 'PRESS', "alt": True},
+ {"properties": [("axis_range", True)]}),
+ ("action.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True},
+ {"properties": [("deselect", False)]}),
+ ("action.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True},
+ {"properties": [("deselect", True)]}),
+ ("action.select_circle", {"type": 'C', "value": 'PRESS'}, None),
+ ("action.select_column", {"type": 'K', "value": 'PRESS'},
+ {"properties": [("mode", 'KEYS')]}),
+ ("action.select_column", {"type": 'K', "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'CFRA')]}),
+ ("action.select_column", {"type": 'K', "value": 'PRESS', "shift": True},
+ {"properties": [("mode", 'MARKERS_COLUMN')]}),
+ ("action.select_column", {"type": 'K', "value": 'PRESS', "alt": True},
+ {"properties": [("mode", 'MARKERS_BETWEEN')]}),
+ ("action.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
+ ("action.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
+ ("action.select_linked", {"type": 'L', "value": 'PRESS'}, None),
+ ("action.frame_jump", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
+ op_menu_pie("DOPESHEET_MT_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
+ ("action.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
+ ("action.handle_type", {"type": 'V', "value": 'PRESS'}, None),
+ ("action.interpolation_type", {"type": 'T', "value": 'PRESS'}, None),
+ ("action.extrapolation_type", {"type": 'E', "value": 'PRESS', "shift": True}, None),
+ ("action.keyframe_type", {"type": 'R', "value": 'PRESS'}, None),
+ op_menu("DOPESHEET_MT_specials", {"type": 'W', "value": 'PRESS'}),
+ ("action.sample", {"type": 'O', "value": 'PRESS', "shift": True, "alt": True}, None),
+ op_menu("DOPESHEET_MT_delete", {"type": 'X', "value": 'PRESS'}),
+ op_menu("DOPESHEET_MT_delete", {"type": 'DEL', "value": 'PRESS'}),
+ ("action.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ ("action.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
+ ("action.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
+ ("action.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
+ ("action.paste", {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("flipped", True)]}),
+ ("action.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("action.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
+ ("action.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
+ ("action.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
+ ("action.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
+ ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
+ ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
+ ("transform.transform", {"type": 'G', "value": 'PRESS'},
+ {"properties": [("mode", 'TIME_TRANSLATE')]}),
+ ("transform.transform", {"type": 'EVT_TWEAK_S', "value": 'ANY'},
+ {"properties": [("mode", 'TIME_TRANSLATE')]}),
+ ("transform.transform", {"type": 'E', "value": 'PRESS'},
+ {"properties": [("mode", 'TIME_EXTEND')]}),
+ ("transform.transform", {"type": 'S', "value": 'PRESS'},
+ {"properties": [("mode", 'TIME_SCALE')]}),
+ ("transform.transform", {"type": 'T', "value": 'PRESS', "shift": True},
+ {"properties": [("mode", 'TIME_SLIDE')]}),
+ ("wm.context_toggle", {"type": 'O', "value": 'PRESS'},
+ {"properties": [("data_path", 'tool_settings.use_proportional_action')]}),
+ op_menu_pie("VIEW3D_MT_proportional_editing_falloff_pie", {"type": 'O', "value": 'PRESS', "shift": True}),
+ ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
+ ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ if params.apple:
+ items.extend([
+ ("action.copy", {"type": 'C', "value": 'PRESS', "oskey": True}, None),
+ ("action.paste", {"type": 'V', "value": 'PRESS', "oskey": True}, None),
+ ("action.paste", {"type": 'V', "value": 'PRESS', "shift": True, "oskey": True},
+ {"properties": [("flipped", True)]}),
+ ])
+
+ return keymap
+
+
+def km_nla_generic(_params):
+ items = []
+ keymap = (
+ "NLA Generic",
+ {"space_type": 'NLA_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("nla.properties", {"type": 'N', "value": 'PRESS'}, None),
+ ("nla.tweakmode_enter", {"type": 'TAB', "value": 'PRESS'}, None),
+ ("nla.tweakmode_exit", {"type": 'TAB', "value": 'PRESS'}, None),
+ ("nla.tweakmode_enter", {"type": 'TAB', "value": 'PRESS', "shift": True},
+ {"properties": [("isolate_action", True)]}),
+ ("nla.tweakmode_exit", {"type": 'TAB', "value": 'PRESS', "shift": True},
+ {"properties": [("isolate_action", True)]}),
+ ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ return keymap
+
+
+def km_nla_channels(_params):
+ items = []
+ keymap = (
+ "NLA Channels",
+ {"space_type": 'NLA_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("nla.channels_click", {"type": 'LEFTMOUSE', "value": 'PRESS'},
+ {"properties": [("extend", False)]}),
+ ("nla.channels_click", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True)]}),
+ ("nla.tracks_add", {"type": 'A', "value": 'PRESS', "shift": True},
+ {"properties": [("above_selected", False)]}),
+ ("nla.tracks_add", {"type": 'A', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("above_selected", True)]}),
+ ("nla.tracks_delete", {"type": 'X', "value": 'PRESS'}, None),
+ ("nla.tracks_delete", {"type": 'DEL', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+def km_nla_editor(params):
+ items = []
+ keymap = (
+ "NLA Editor",
+ {"space_type": 'NLA_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("nla.click_select", {"type": params.select_mouse, "value": 'PRESS'},
+ {"properties": [("extend", False)]}),
+ ("nla.click_select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True)]}),
+ ("nla.select_leftright", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'CHECK'), ("extend", False)]}),
+ ("nla.select_leftright", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("mode", 'CHECK'), ("extend", True)]}),
+ ("nla.select_leftright", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
+ {"properties": [("mode", 'LEFT'), ("extend", False)]}),
+ ("nla.select_leftright", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
+ {"properties": [("mode", 'RIGHT'), ("extend", False)]}),
+ *_template_items_select_actions("nla.select_all"),
+ ("nla.select_box", {"type": 'B', "value": 'PRESS'},
+ {"properties": [("axis_range", False)]}),
+ ("nla.select_box", {"type": 'B', "value": 'PRESS', "alt": True},
+ {"properties": [("axis_range", True)]}),
+ ("nla.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("nla.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
+ ("nla.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
+ ("nla.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
+ ("nla.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
+ ("nla.actionclip_add", {"type": 'A', "value": 'PRESS', "shift": True}, None),
+ ("nla.transition_add", {"type": 'T', "value": 'PRESS', "shift": True}, None),
+ ("nla.soundclip_add", {"type": 'K', "value": 'PRESS', "shift": True}, None),
+ ("nla.meta_add", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
+ ("nla.meta_remove", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("nla.duplicate", {"type": 'D', "value": 'PRESS', "shift": True},
+ {"properties": [("linked", False)]}),
+ ("nla.duplicate", {"type": 'D', "value": 'PRESS', "alt": True},
+ {"properties": [("linked", True)]}),
+ ("nla.make_single_user", {"type": 'U', "value": 'PRESS'}, None),
+ ("nla.delete", {"type": 'X', "value": 'PRESS'}, None),
+ ("nla.delete", {"type": 'DEL', "value": 'PRESS'}, None),
+ ("nla.split", {"type": 'Y', "value": 'PRESS'}, None),
+ ("nla.mute_toggle", {"type": 'H', "value": 'PRESS'}, None),
+ ("nla.swap", {"type": 'F', "value": 'PRESS', "alt": True}, None),
+ ("nla.move_up", {"type": 'PAGE_UP', "value": 'PRESS'}, None),
+ ("nla.move_down", {"type": 'PAGE_DOWN', "value": 'PRESS'}, None),
+ ("nla.apply_scale", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
+ ("nla.clear_scale", {"type": 'S', "value": 'PRESS', "alt": True}, None),
+ op_menu_pie("NLA_MT_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
+ ("nla.fmodifier_add", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("transform.transform", {"type": 'G', "value": 'PRESS'},
+ {"properties": [("mode", 'TRANSLATION')]}),
+ ("transform.transform", {"type": 'EVT_TWEAK_S', "value": 'ANY'},
+ {"properties": [("mode", 'TRANSLATION')]}),
+ ("transform.transform", {"type": 'E', "value": 'PRESS'},
+ {"properties": [("mode", 'TIME_EXTEND')]}),
+ ("transform.transform", {"type": 'S', "value": 'PRESS'},
+ {"properties": [("mode", 'TIME_SCALE')]}),
+ ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
+ ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ return keymap
+
+
+def km_text_generic(params):
+ items = []
+ keymap = (
+ "Text Generic",
+ {"space_type": 'TEXT_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("text.start_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
+ ("text.jump", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
+ ("text.find", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
+ ("text.replace", {"type": 'H', "value": 'PRESS', "ctrl": True}, None),
+ ("text.properties", {"type": 'T', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ if params.apple:
+ items.extend([
+ ("text.start_find", {"type": 'F', "value": 'PRESS', "oskey": True}, None),
+ ])
+
+ return keymap
+
+
+def km_text(params):
+ items = []
+ keymap = (
+ "Text",
+ {"space_type": 'TEXT_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ if params.apple:
+ items.extend([
+ ("text.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "oskey": True},
+ {"properties": [("type", 'LINE_BEGIN')]}),
+ ("text.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "oskey": True},
+ {"properties": [("type", 'LINE_END')]}),
+ ("text.move", {"type": 'UP_ARROW', "value": 'PRESS', "oskey": True},
+ {"properties": [("type", 'FILE_TOP')]}),
+ ("text.move", {"type": 'DOWN_ARROW', "value": 'PRESS', "oskey": True},
+ {"properties": [("type", 'FILE_BOTTOM')]}),
+ ("text.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "oskey": True},
+ {"properties": [("type", 'LINE_BEGIN')]}),
+ ("text.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "oskey": True},
+ {"properties": [("type", 'LINE_END')]}),
+ ("text.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("type", 'PREVIOUS_WORD')]}),
+ ("text.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("type", 'NEXT_WORD')]}),
+ ("text.move_select", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "oskey": True},
+ {"properties": [("type", 'FILE_TOP')]}),
+ ("text.move_select", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "oskey": True},
+ {"properties": [("type", 'FILE_BOTTOM')]}),
+ ("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "alt": True},
+ {"properties": [("type", 'PREVIOUS_WORD')]}),
+ ("text.save", {"type": 'S', "value": 'PRESS', "alt": True, "oskey": True}, None),
+ ("text.save_as", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True, "oskey": True}, None),
+ ("text.cut", {"type": 'X', "value": 'PRESS', "oskey": True}, None),
+ ("text.copy", {"type": 'C', "value": 'PRESS', "oskey": True}, None),
+ ("text.paste", {"type": 'V', "value": 'PRESS', "oskey": True}, None),
+ ("text.find_set_selected", {"type": 'E', "value": 'PRESS', "oskey": True}, None),
+ ("text.select_all", {"type": 'A', "value": 'PRESS', "oskey": True}, None),
+ ("text.select_line", {"type": 'A', "value": 'PRESS', "shift": True, "oskey": True}, None),
+ ])
+
+ items.extend([
+ ("text.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
+ {"properties": [("type", 'PREVIOUS_WORD')]}),
+ ("text.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
+ {"properties": [("type", 'NEXT_WORD')]}),
+ ("wm.context_cycle_int", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
+ ("wm.context_cycle_int", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
+ ("wm.context_cycle_int", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
+ ("wm.context_cycle_int", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
+ ])
+
+ if not params.legacy:
+ items.extend([
+ ("text.new", {"type": 'N', "value": 'PRESS', "alt": True}, None),
+ ])
+ else:
+ items.extend([
+ ("text.new", {"type": 'N', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ items.extend([
+ ("text.open", {"type": 'O', "value": 'PRESS', "alt": True}, None),
+ ("text.reload", {"type": 'R', "value": 'PRESS', "alt": True}, None),
+ ("text.save", {"type": 'S', "value": 'PRESS', "alt": True}, None),
+ ("text.save_as", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
+ ("text.run_script", {"type": 'P', "value": 'PRESS', "alt": True}, None),
+ ("text.cut", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
+ ("text.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
+ ("text.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
+ ("text.cut", {"type": 'DEL', "value": 'PRESS', "shift": True}, None),
+ ("text.copy", {"type": 'INSERT', "value": 'PRESS', "ctrl": True}, None),
+ ("text.paste", {"type": 'INSERT', "value": 'PRESS', "shift": True}, None),
+ ("text.duplicate_line", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
+ ("text.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
+ ("text.select_line", {"type": 'A', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("text.select_word", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
+ ("text.move_lines", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("direction", 'UP')]}),
+ ("text.move_lines", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("direction", 'DOWN')]}),
+ ("text.indent", {"type": 'TAB', "value": 'PRESS'}, None),
+ ("text.unindent", {"type": 'TAB', "value": 'PRESS', "shift": True}, None),
+ ("text.uncomment", {"type": 'D', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("text.move", {"type": 'HOME', "value": 'PRESS'},
+ {"properties": [("type", 'LINE_BEGIN')]}),
+ ("text.move", {"type": 'END', "value": 'PRESS'},
+ {"properties": [("type", 'LINE_END')]}),
+ ("text.move", {"type": 'E', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'LINE_END')]}),
+ ("text.move", {"type": 'E', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("type", 'LINE_END')]}),
+ ("text.move", {"type": 'LEFT_ARROW', "value": 'PRESS'},
+ {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
+ ("text.move", {"type": 'RIGHT_ARROW', "value": 'PRESS'},
+ {"properties": [("type", 'NEXT_CHARACTER')]}),
+ ("text.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'PREVIOUS_WORD')]}),
+ ("text.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'NEXT_WORD')]}),
+ ("text.move", {"type": 'UP_ARROW', "value": 'PRESS'},
+ {"properties": [("type", 'PREVIOUS_LINE')]}),
+ ("text.move", {"type": 'DOWN_ARROW', "value": 'PRESS'},
+ {"properties": [("type", 'NEXT_LINE')]}),
+ ("text.move", {"type": 'PAGE_UP', "value": 'PRESS'},
+ {"properties": [("type", 'PREVIOUS_PAGE')]}),
+ ("text.move", {"type": 'PAGE_DOWN', "value": 'PRESS'},
+ {"properties": [("type", 'NEXT_PAGE')]}),
+ ("text.move", {"type": 'HOME', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'FILE_TOP')]}),
+ ("text.move", {"type": 'END', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'FILE_BOTTOM')]}),
+ ("text.move_select", {"type": 'HOME', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'LINE_BEGIN')]}),
+ ("text.move_select", {"type": 'END', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'LINE_END')]}),
+ ("text.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
+ ("text.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'NEXT_CHARACTER')]}),
+ ("text.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("type", 'PREVIOUS_WORD')]}),
+ ("text.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("type", 'NEXT_WORD')]}),
+ ("text.move_select", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'PREVIOUS_LINE')]}),
+ ("text.move_select", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'NEXT_LINE')]}),
+ ("text.move_select", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'PREVIOUS_PAGE')]}),
+ ("text.move_select", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'NEXT_PAGE')]}),
+ ("text.move_select", {"type": 'HOME', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("type", 'FILE_TOP')]}),
+ ("text.move_select", {"type": 'END', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("type", 'FILE_BOTTOM')]}),
+ ("text.delete", {"type": 'DEL', "value": 'PRESS'},
+ {"properties": [("type", 'NEXT_CHARACTER')]}),
+ ("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS'},
+ {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
+ ("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
+ ("text.delete", {"type": 'DEL', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'NEXT_WORD')]}),
+ ("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'PREVIOUS_WORD')]}),
+ ("text.overwrite_toggle", {"type": 'INSERT', "value": 'PRESS'}, None),
+ ("text.scroll_bar", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("text.scroll_bar", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
+ ("text.scroll", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
+ ("text.scroll", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
+ ("text.selection_set", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
+ ("text.cursor_set", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("text.selection_set", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
+ {"properties": [("select", True)]}),
+ ("text.scroll", {"type": 'WHEELUPMOUSE', "value": 'PRESS'},
+ {"properties": [("lines", -1)]}),
+ ("text.scroll", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'},
+ {"properties": [("lines", 1)]}),
+ ("text.line_break", {"type": 'RET', "value": 'PRESS'}, None),
+ ("text.line_break", {"type": 'NUMPAD_ENTER', "value": 'PRESS'}, None),
+ op_menu("TEXT_MT_toolbox", {"type": 'RIGHTMOUSE', "value": 'PRESS', "any": True}),
+ ("text.autocomplete", {"type": 'SPACE', "value": 'PRESS', "ctrl": True}, None),
+ ("text.line_number", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
+ ("text.insert", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_sequencercommon(_params):
+ items = []
+ keymap = (
+ "SequencerCommon",
+ {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("sequencer.properties", {"type": 'N', "value": 'PRESS'}, None),
+ ("wm.context_toggle", {"type": 'O', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path", 'scene.sequence_editor.show_overlay')]}),
+ ("sequencer.view_toggle", {"type": 'TAB', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ return keymap
+
+
+def km_sequencer(params):
+ items = []
+ keymap = (
+ "Sequencer",
+ {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ *_template_items_select_actions("sequencer.select_all"),
+ ("sequencer.cut", {"type": 'K', "value": 'PRESS'},
+ {"properties": [("type", 'SOFT')]}),
+ ("sequencer.cut", {"type": 'K', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'HARD')]}),
+ ("sequencer.mute", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("sequencer.mute", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
+ ("sequencer.unmute", {"type": 'H', "value": 'PRESS', "alt": True},
+ {"properties": [("unselected", False)]}),
+ ("sequencer.unmute", {"type": 'H', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("unselected", True)]}),
+ ("sequencer.lock", {"type": 'L', "value": 'PRESS', "shift": True}, None),
+ ("sequencer.unlock", {"type": 'L', "value": 'PRESS', "shift": True, "alt": True}, None),
+ ("sequencer.reassign_inputs", {"type": 'R', "value": 'PRESS'}, None),
+ ("sequencer.reload", {"type": 'R', "value": 'PRESS', "alt": True}, None),
+ ("sequencer.reload", {"type": 'R', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("adjust_length", True)]}),
+ ("sequencer.offset_clear", {"type": 'O', "value": 'PRESS', "alt": True}, None),
+ ("sequencer.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ ("sequencer.delete", {"type": 'X', "value": 'PRESS'}, None),
+ ("sequencer.delete", {"type": 'DEL', "value": 'PRESS'}, None),
+ ("sequencer.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
+ ("sequencer.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
+ ("sequencer.images_separate", {"type": 'Y', "value": 'PRESS'}, None),
+ ("sequencer.meta_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
+ ("sequencer.meta_make", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
+ ("sequencer.meta_separate", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("sequencer.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
+ ("sequencer.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
+ ("sequencer.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
+ ("sequencer.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
+ ("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS'},
+ {"properties": [("next", True), ("center", False)]}),
+ ("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS'},
+ {"properties": [("next", False), ("center", False)]}),
+ ("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS', "alt": True},
+ {"properties": [("next", True), ("center", True)]}),
+ ("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS', "alt": True},
+ {"properties": [("next", False), ("center", True)]}),
+ ("sequencer.swap", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
+ {"properties": [("side", 'LEFT')]}),
+ ("sequencer.swap", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
+ {"properties": [("side", 'RIGHT')]}),
+ ("sequencer.gap_remove", {"type": 'BACK_SPACE', "value": 'PRESS'},
+ {"properties": [("all", False)]}),
+ ("sequencer.gap_remove", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
+ {"properties": [("all", True)]}),
+ ("sequencer.gap_insert", {"type": 'EQUAL', "value": 'PRESS', "shift": True}, None),
+ ("sequencer.snap", {"type": 'S', "value": 'PRESS', "shift": True}, None),
+ ("sequencer.swap_inputs", {"type": 'S', "value": 'PRESS', "alt": True}, None),
+ *(
+ (("sequencer.cut_multicam",
+ {"type": NUMBERS_1[i], "value": 'PRESS'},
+ {"properties": [("camera", i + 1)]})
+ for i in range(10)
+ )
+ ),
+ ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS'},
+ {"properties": [("extend", False), ("linked_handle", False), ("left_right", 'NONE'), ("linked_time", False)]}),
+ ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True), ("linked_handle", False), ("left_right", 'NONE'), ("linked_time", False)]}),
+ ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
+ {"properties": [("extend", False), ("linked_handle", True), ("left_right", 'NONE'), ("linked_time", False)]}),
+ ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("extend", True), ("linked_handle", True), ("left_right", 'NONE'), ("linked_time", False)]}),
+ ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
+ {"properties": [("extend", False), ("linked_handle", False), ("left_right", 'MOUSE'), ("linked_time", True)]}),
+ ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("extend", True), ("linked_handle", False), ("left_right", 'NONE'), ("linked_time", True)]}),
+ ("sequencer.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
+ ("sequencer.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
+ ("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS'},
+ {"properties": [("extend", False)]}),
+ ("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True)]}),
+ ("sequencer.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
+ ("sequencer.select_box", {"type": 'B', "value": 'PRESS'}, None),
+ ("sequencer.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None),
+ op_menu("SEQUENCER_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}),
+ op_menu("SEQUENCER_MT_change", {"type": 'C', "value": 'PRESS'}),
+ ("sequencer.slip", {"type": 'S', "value": 'PRESS'}, None),
+ ("wm.context_set_int", {"type": 'O', "value": 'PRESS'},
+ {"properties": [("data_path", 'scene.sequence_editor.overlay_frame'), ("value", 0)]}),
+ ("transform.seq_slide", {"type": 'G', "value": 'PRESS'}, None),
+ ("transform.seq_slide", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
+ ("transform.transform", {"type": 'E', "value": 'PRESS'},
+ {"properties": [("mode", 'TIME_EXTEND')]}),
+ ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
+ ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ if params.apple:
+ items.extend([
+ ("sequencer.copy", {"type": 'C', "value": 'PRESS', "oskey": True}, None),
+ ("sequencer.paste", {"type": 'V', "value": 'PRESS', "oskey": True}, None),
+ ])
+
+ return keymap
+
+
+def km_sequencerpreview(params):
+ items = []
+ keymap = (
+ "SequencerPreview",
+ {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("sequencer.view_all_preview", {"type": 'HOME', "value": 'PRESS'}, None),
+ ("sequencer.view_all_preview", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
+ ("sequencer.view_ghost_border", {"type": 'O', "value": 'PRESS'}, None),
+ ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_1', "value": 'PRESS'},
+ {"properties": [("ratio", 1.0)]}),
+ ("sequencer.sample", {"type": params.action_mouse, "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+def km_console(params):
+ items = []
+ keymap = (
+ "Console",
+ {"space_type": 'CONSOLE', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ if params.apple:
+ items.extend([
+ ("console.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "oskey": True},
+ {"properties": [("type", 'LINE_BEGIN')]}),
+ ("console.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "oskey": True},
+ {"properties": [("type", 'LINE_END')]}),
+ ("console.copy", {"type": 'C', "value": 'PRESS', "oskey": True}, None),
+ ("console.paste", {"type": 'V', "value": 'PRESS', "oskey": True}, None),
+ ])
+
+ items.extend([
+ ("console.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'PREVIOUS_WORD')]}),
+ ("console.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'NEXT_WORD')]}),
+ ("console.move", {"type": 'HOME', "value": 'PRESS'},
+ {"properties": [("type", 'LINE_BEGIN')]}),
+ ("console.move", {"type": 'END', "value": 'PRESS'},
+ {"properties": [("type", 'LINE_END')]}),
+ ("wm.context_cycle_int", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
+ ("wm.context_cycle_int", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
+ ("wm.context_cycle_int", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
+ ("wm.context_cycle_int", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
+ ("console.move", {"type": 'LEFT_ARROW', "value": 'PRESS'},
+ {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
+ ("console.move", {"type": 'RIGHT_ARROW', "value": 'PRESS'},
+ {"properties": [("type", 'NEXT_CHARACTER')]}),
+ ("console.history_cycle", {"type": 'UP_ARROW', "value": 'PRESS'},
+ {"properties": [("reverse", True)]}),
+ ("console.history_cycle", {"type": 'DOWN_ARROW', "value": 'PRESS'},
+ {"properties": [("reverse", False)]}),
+ ("console.delete", {"type": 'DEL', "value": 'PRESS'},
+ {"properties": [("type", 'NEXT_CHARACTER')]}),
+ ("console.delete", {"type": 'BACK_SPACE', "value": 'PRESS'},
+ {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
+ ("console.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
+ ("console.delete", {"type": 'DEL', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'NEXT_WORD')]}),
+ ("console.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'PREVIOUS_WORD')]}),
+ ("console.clear_line", {"type": 'RET', "value": 'PRESS', "shift": True}, None),
+ ("console.clear_line", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "shift": True}, None),
+ ("console.execute", {"type": 'RET', "value": 'PRESS'},
+ {"properties": [("interactive", True)]}),
+ ("console.execute", {"type": 'NUMPAD_ENTER', "value": 'PRESS'},
+ {"properties": [("interactive", True)]}),
+ ("console.autocomplete", {"type": 'SPACE', "value": 'PRESS', "ctrl": True}, None),
+ ("console.copy_as_script", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("console.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
+ ("console.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
+ ("console.select_set", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("console.select_word", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
+ ("console.insert", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
+ {"properties": [("text", '\t')]}),
+ ("console.indent", {"type": 'TAB', "value": 'PRESS'}, None),
+ ("console.unindent", {"type": 'TAB', "value": 'PRESS', "shift": True}, None),
+ ("console.insert", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_clip(_params):
+ items = []
+ keymap = (
+ "Clip",
+ {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("clip.open", {"type": 'O', "value": 'PRESS', "alt": True}, None),
+ ("clip.tools", {"type": 'T', "value": 'PRESS'}, None),
+ ("clip.properties", {"type": 'N', "value": 'PRESS'}, None),
+ ("clip.track_markers", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
+ {"properties": [("backwards", True), ("sequence", False)]}),
+ ("clip.track_markers", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
+ {"properties": [("backwards", False), ("sequence", False)]}),
+ ("clip.track_markers", {"type": 'T', "value": 'PRESS', "ctrl": True},
+ {"properties": [("backwards", False), ("sequence", True)]}),
+ ("clip.track_markers", {"type": 'T', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("backwards", True), ("sequence", True)]}),
+ ("wm.context_toggle_enum", {"type": 'TAB', "value": 'PRESS'},
+ {"properties": [("data_path", 'space_data.mode'), ("value_1", 'TRACKING'), ("value_2", 'MASK')]}),
+ ("clip.solve_camera", {"type": 'S', "value": 'PRESS', "shift": True}, None),
+ ("clip.set_solver_keyframe", {"type": 'Q', "value": 'PRESS'},
+ {"properties": [("keyframe", 'KEYFRAME_A')]}),
+ ("clip.set_solver_keyframe", {"type": 'E', "value": 'PRESS'},
+ {"properties": [("keyframe", 'KEYFRAME_B')]}),
+ ("clip.prefetch", {"type": 'P', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+def km_clip_editor(params):
+ items = []
+ keymap = (
+ "Clip Editor",
+ {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("clip.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
+ ("clip.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
+ ("clip.view_pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
+ ("clip.view_zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
+ ("clip.view_zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
+ ("clip.view_zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
+ ("clip.view_zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None),
+ ("clip.view_zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None),
+ ("clip.view_zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
+ ("clip.view_zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
+ ("clip.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True},
+ {"properties": [("ratio", 8.0)]}),
+ ("clip.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True},
+ {"properties": [("ratio", 4.0)]}),
+ ("clip.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True},
+ {"properties": [("ratio", 2.0)]}),
+ ("clip.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "shift": True},
+ {"properties": [("ratio", 8.0)]}),
+ ("clip.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True},
+ {"properties": [("ratio", 4.0)]}),
+ ("clip.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "shift": True},
+ {"properties": [("ratio", 2.0)]}),
+ ("clip.view_zoom_ratio", {"type": 'NUMPAD_1', "value": 'PRESS'},
+ {"properties": [("ratio", 1.0)]}),
+ ("clip.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS'},
+ {"properties": [("ratio", 0.5)]}),
+ ("clip.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS'},
+ {"properties": [("ratio", 0.25)]}),
+ ("clip.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS'},
+ {"properties": [("ratio", 0.125)]}),
+ ("clip.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
+ ("clip.view_all", {"type": 'F', "value": 'PRESS'},
+ {"properties": [("fit_view", True)]}),
+ ("clip.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
+ ("clip.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
+ ("clip.view_ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
+ ("clip.frame_jump", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("position", 'PATHSTART')]}),
+ ("clip.frame_jump", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("position", 'PATHEND')]}),
+ ("clip.frame_jump", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("position", 'FAILEDPREV')]}),
+ ("clip.frame_jump", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("position", 'PATHSTART')]}),
+ ("clip.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("clip.select", {"type": params.select_mouse, "value": 'PRESS'},
+ {"properties": [("extend", False)]}),
+ ("clip.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True)]}),
+ *_template_items_select_actions("clip.select_all"),
+ ("clip.select_box", {"type": 'B', "value": 'PRESS'}, None),
+ ("clip.select_circle", {"type": 'C', "value": 'PRESS'}, None),
+ op_menu("CLIP_MT_select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}),
+ ("clip.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True, "alt": True},
+ {"properties": [("deselect", False)]}),
+ ("clip.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
+ {"properties": [("deselect", True)]}),
+ ("clip.add_marker_slide", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
+ ("clip.delete_marker", {"type": 'X', "value": 'PRESS', "shift": True}, None),
+ ("clip.delete_marker", {"type": 'DEL', "value": 'PRESS', "shift": True}, None),
+ ("clip.slide_marker", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("clip.disable_markers", {"type": 'D', "value": 'PRESS', "shift": True},
+ {"properties": [("action", 'TOGGLE')]}),
+ ("clip.delete_track", {"type": 'X', "value": 'PRESS'}, None),
+ ("clip.delete_track", {"type": 'DEL', "value": 'PRESS'}, None),
+ ("clip.lock_tracks", {"type": 'L', "value": 'PRESS', "ctrl": True},
+ {"properties": [("action", 'LOCK')]}),
+ ("clip.lock_tracks", {"type": 'L', "value": 'PRESS', "alt": True},
+ {"properties": [("action", 'UNLOCK')]}),
+ ("clip.hide_tracks", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("clip.hide_tracks", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
+ ("clip.hide_tracks_clear", {"type": 'H', "value": 'PRESS', "alt": True}, None),
+ ("clip.slide_plane_marker", {"type": params.action_mouse, "value": 'PRESS'}, None),
+ ("clip.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
+ ("clip.keyframe_delete", {"type": 'I', "value": 'PRESS', "alt": True}, None),
+ ("clip.join_tracks", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
+ op_menu("CLIP_MT_tracking_specials", {"type": 'W', "value": 'PRESS'}),
+ ("wm.context_toggle", {"type": 'L', "value": 'PRESS'},
+ {"properties": [("data_path", 'space_data.lock_selection')]}),
+ ("wm.context_toggle", {"type": 'D', "value": 'PRESS', "alt": True},
+ {"properties": [("data_path", 'space_data.show_disabled')]}),
+ ("wm.context_toggle", {"type": 'S', "value": 'PRESS', "alt": True},
+ {"properties": [("data_path", 'space_data.show_marker_search')]}),
+ ("wm.context_toggle", {"type": 'M', "value": 'PRESS'},
+ {"properties": [("data_path", 'space_data.use_mute_footage')]}),
+ ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
+ ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
+ ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
+ ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
+ ("clip.clear_track_path", {"type": 'T', "value": 'PRESS', "alt": True},
+ {"properties": [("action", 'REMAINED'), ("clear_active", False)]}),
+ ("clip.clear_track_path", {"type": 'T', "value": 'PRESS', "shift": True},
+ {"properties": [("action", 'UPTO'), ("clear_active", False)]}),
+ ("clip.clear_track_path", {"type": 'T', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("action", 'ALL'), ("clear_active", False)]}),
+ ("clip.cursor_set", {"type": params.action_mouse, "value": 'PRESS'}, None),
+ op_menu_pie("CLIP_MT_pivot_pie", {"type": 'PERIOD', "value": 'PRESS'}),
+ ("clip.copy_tracks", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
+ ("clip.paste_tracks", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ return keymap
+
+
+def km_clip_graph_editor(params):
+ items = []
+ keymap = (
+ "Clip Graph Editor",
+ {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("clip.change_frame", {"type": params.action_mouse, "value": 'PRESS'}, None),
+ ("clip.graph_select", {"type": params.select_mouse, "value": 'PRESS'},
+ {"properties": [("extend", False)]}),
+ ("clip.graph_select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True)]}),
+ *_template_items_select_actions("clip.graph_select_all_markers"),
+ ("clip.graph_select_box", {"type": 'B', "value": 'PRESS'}, None),
+ ("clip.graph_delete_curve", {"type": 'X', "value": 'PRESS'}, None),
+ ("clip.graph_delete_curve", {"type": 'DEL', "value": 'PRESS'}, None),
+ ("clip.graph_delete_knot", {"type": 'X', "value": 'PRESS', "shift": True}, None),
+ ("clip.graph_delete_knot", {"type": 'DEL', "value": 'PRESS', "shift": True}, None),
+ ("clip.graph_view_all", {"type": 'HOME', "value": 'PRESS'}, None),
+ ("clip.graph_view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
+ ("clip.graph_center_current_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
+ ("wm.context_toggle", {"type": 'L', "value": 'PRESS'},
+ {"properties": [("data_path", 'space_data.lock_time_cursor')]}),
+ ("clip.clear_track_path", {"type": 'T', "value": 'PRESS', "alt": True},
+ {"properties": [("action", 'REMAINED'), ("clear_active", True)]}),
+ ("clip.clear_track_path", {"type": 'T', "value": 'PRESS', "shift": True},
+ {"properties": [("action", 'UPTO'), ("clear_active", True)]}),
+ ("clip.clear_track_path", {"type": 'T', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("action", 'ALL'), ("clear_active", True)]}),
+ ("clip.graph_disable_markers", {"type": 'D', "value": 'PRESS', "shift": True},
+ {"properties": [("action", 'TOGGLE')]}),
+ ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
+ ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
+ ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
+ ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+def km_clip_dopesheet_editor(_params):
+ items = []
+ keymap = (
+ "Clip Dopesheet Editor",
+ {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("clip.dopesheet_select_channel", {"type": 'LEFTMOUSE', "value": 'PRESS'},
+ {"properties": [("extend", True)]}),
+ ("clip.dopesheet_view_all", {"type": 'HOME', "value": 'PRESS'}, None),
+ ("clip.dopesheet_view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+# ------------------------------------------------------------------------------
+# Animation
+
+
+def km_frames(params):
+ items = []
+ keymap = (
+ "Frames",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Frame offsets
+ ("screen.frame_offset", {"type": 'LEFT_ARROW', "value": 'PRESS'},
+ {"properties": [("delta", -1)]}),
+ ("screen.frame_offset", {"type": 'RIGHT_ARROW', "value": 'PRESS'},
+ {"properties": [("delta", 1)]}),
+ ("screen.frame_jump", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("end", True)]}),
+ ("screen.frame_jump", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("end", False)]}),
+ ("screen.keyframe_jump", {"type": 'UP_ARROW', "value": 'PRESS'},
+ {"properties": [("next", True)]}),
+ ("screen.keyframe_jump", {"type": 'DOWN_ARROW', "value": 'PRESS'},
+ {"properties": [("next", False)]}),
+ ("screen.keyframe_jump", {"type": 'MEDIA_LAST', "value": 'PRESS'},
+ {"properties": [("next", True)]}),
+ ("screen.keyframe_jump", {"type": 'MEDIA_FIRST', "value": 'PRESS'},
+ {"properties": [("next", False)]}),
+ ])
+
+ if not params.legacy:
+ # New playback
+ items.extend([
+ ("screen.animation_play", {"type": 'SPACE', "value": 'PRESS', "shift": True}, None),
+ ("screen.animation_play", {"type": 'SPACE', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("reverse", True)]}),
+ ])
+ else:
+ # Old playback
+ items.extend([
+ ("screen.frame_offset", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("delta", 10)]}),
+ ("screen.frame_offset", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("delta", -10)]}),
+ ("screen.frame_offset", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "alt": True},
+ {"properties": [("delta", 1)]}),
+ ("screen.frame_offset", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "alt": True},
+ {"properties": [("delta", -1)]}),
+ ("screen.frame_jump", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("end", True)]}),
+ ("screen.frame_jump", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("end", False)]}),
+ ("screen.animation_play", {"type": 'A', "value": 'PRESS', "alt": True}, None),
+ ("screen.animation_play", {"type": 'A', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("reverse", True)]}),
+ ])
+
+ items.extend([
+ ("screen.animation_cancel", {"type": 'ESC', "value": 'PRESS'}, None),
+ ("screen.animation_play", {"type": 'MEDIA_PLAY', "value": 'PRESS'}, None),
+ ("screen.animation_cancel", {"type": 'MEDIA_STOP', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+def km_animation(params):
+ items = []
+ keymap = (
+ "Animation",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Frame management.
+ ("anim.change_frame", {"type": params.action_mouse, "value": 'PRESS'}, None),
+ ("wm.context_toggle", {"type": 'T', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'space_data.show_seconds')]}),
+ # Preview range.
+ ("anim.previewrange_set", {"type": 'P', "value": 'PRESS'}, None),
+ ("anim.previewrange_clear", {"type": 'P', "value": 'PRESS', "alt": True}, None),
+ ])
+
+ return keymap
+
+
+def km_animation_channels(_params):
+ items = []
+ keymap = (
+ "Animation Channels",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Click select.
+ ("anim.channels_click", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("anim.channels_click", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True)]}),
+ ("anim.channels_click", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("children_only", True)]}),
+ # Rename.
+ ("anim.channels_rename", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
+ ("anim.channels_rename", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
+ # Select keys.
+ ("anim.channel_select_keys", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
+ ("anim.channel_select_keys", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "shift": True},
+ {"properties": [("extend", True)]}),
+ # Find (setting the name filter).
+ ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
+ # Selection.
+ *_template_items_select_actions("anim.channels_select_all"),
+ ("anim.channels_select_box", {"type": 'B', "value": 'PRESS'}, None),
+ ("anim.channels_select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
+ # Delete.
+ ("anim.channels_delete", {"type": 'X', "value": 'PRESS'}, None),
+ ("anim.channels_delete", {"type": 'DEL', "value": 'PRESS'}, None),
+ # Settings.
+ ("anim.channels_setting_toggle", {"type": 'W', "value": 'PRESS', "shift": True}, None),
+ ("anim.channels_setting_enable", {"type": 'W', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("anim.channels_setting_disable", {"type": 'W', "value": 'PRESS', "alt": True}, None),
+ ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
+ # Expand/collapse.
+ ("anim.channels_expand", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
+ ("anim.channels_collapse", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
+ ("anim.channels_expand", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
+ {"properties": [("all", False)]}),
+ ("anim.channels_collapse", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
+ {"properties": [("all", False)]}),
+ # Move.
+ ("anim.channels_move", {"type": 'PAGE_UP', "value": 'PRESS'},
+ {"properties": [("direction", 'UP')]}),
+ ("anim.channels_move", {"type": 'PAGE_DOWN', "value": 'PRESS'},
+ {"properties": [("direction", 'DOWN')]}),
+ ("anim.channels_move", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True},
+ {"properties": [("direction", 'TOP')]}),
+ ("anim.channels_move", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True},
+ {"properties": [("direction", 'BOTTOM')]}),
+ # Group.
+ ("anim.channels_group", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
+ ("anim.channels_ungroup", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ # Menus.
+ op_menu("DOPESHEET_MT_specials_channels", {"type": 'W', "value": 'PRESS'}),
+ ])
+
+ return keymap
+
+
+# ------------------------------------------------------------------------------
+# Modes
+
+
+def km_grease_pencil(_params):
+ items = []
+ keymap = (
+ "Grease Pencil",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Draw
+ ("gpencil.annotate", {"type": 'LEFTMOUSE', "value": 'PRESS', "key_modifier": 'D'},
+ {"properties": [("mode", 'DRAW'), ("wait_for_input", False)]}),
+ # Draw - straight lines
+ ("gpencil.annotate", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True, "key_modifier": 'D'},
+ {"properties": [("mode", 'DRAW_STRAIGHT'), ("wait_for_input", False)]}),
+ # Draw - poly lines
+ ("gpencil.annotate", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "alt": True, "key_modifier": 'D'},
+ {"properties": [("mode", 'DRAW_POLY'), ("wait_for_input", False)]}),
+ # Erase
+ ("gpencil.annotate", {"type": 'RIGHTMOUSE', "value": 'PRESS', "key_modifier": 'D'},
+ {"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}),
+
+ # Enter edit mode
+ ("gpencil.editmode_toggle", {"type": 'TAB', "value": 'PRESS', "key_modifier": 'D'}, None),
+ # Add blank frame (B because it's easy to reach from D).
+ ("gpencil.blank_frame_add", {"type": 'B', "value": 'PRESS', "key_modifier": 'D'}, None),
+ # Delete active frame - for easier video tutorials/review sessions.
+ # This works even when not in edit mode.
+ ("gpencil.active_frames_delete_all", {"type": 'X', "value": 'PRESS', "key_modifier": 'D'}, None),
+ ("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "key_modifier": 'D'}, None),
+ ])
+
+ return keymap
+
+
+def _grease_pencil_selection(params):
+ return [
+ # Select all
+ *_template_items_select_actions("gpencil.select_all"),
+ # Circle select
+ ("gpencil.select_circle", {"type": 'C', "value": 'PRESS'}, None),
+ # Box select
+ ("gpencil.select_box", {"type": 'B', "value": 'PRESS'}, None),
+ # Lasso select
+ ("gpencil.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True},
+ {"properties": [("deselect", False)]}),
+ ("gpencil.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True},
+ {"properties": [("deselect", True)]}),
+ # In the Node Editor, lasso select needs ALT modifier too
+ # (as somehow CTRL+LMB drag gets taken for "cut" quite early).
+ # There probably isn't too much harm adding this for other editors too
+ # as part of standard GP editing keymap. This hotkey combo doesn't seem
+ # to see much use under standard scenarios?
+ ("gpencil.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True, "alt": True},
+ {"properties": [("deselect", False)]}),
+ ("gpencil.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
+ {"properties": [("deselect", True)]}),
+ ("gpencil.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True), ("toggle", True)]}),
+ # Whole stroke select
+ ("gpencil.select", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
+ {"properties": [("entire_strokes", True)]}),
+ ("gpencil.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("extend", True), ("entire_strokes", True)]}),
+ # Select linked
+ ("gpencil.select_linked", {"type": 'L', "value": 'PRESS'}, None),
+ ("gpencil.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
+ # Select alternate
+ ("gpencil.select_alternate", {"type": 'L', "value": 'PRESS', "shift": True}, None),
+ # Select grouped
+ ("gpencil.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None),
+ # Select more/less
+ ("gpencil.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
+ ("gpencil.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
+ ]
+
+
+def _grease_pencil_display():
+ return [
+ ("wm.context_toggle", {"type": 'Q', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path", 'space_data.overlay.use_gpencil_edit_lines')]}),
+ ("wm.context_toggle", {"type": 'Q', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("data_path", 'space_data.overlay.use_gpencil_multiedit_line_only')]}),
+ ]
+
+
+def km_grease_pencil_stroke_edit_mode(params):
+ items = []
+ keymap = (
+ "Grease Pencil Stroke Edit Mode",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Interpolation
+ ("gpencil.interpolate", {"type": 'E', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("gpencil.interpolate_sequence", {"type": 'E', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ # Normal select
+ ("gpencil.select", {"type": params.select_mouse, "value": 'PRESS'}, None),
+ # Selection
+ *_grease_pencil_selection(params),
+ # Duplicate and move selected points
+ ("gpencil.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ # Delete
+ op_menu("VIEW3D_MT_edit_gpencil_delete", {"type": 'X', "value": 'PRESS'}),
+ op_menu("VIEW3D_MT_edit_gpencil_delete", {"type": 'DEL', "value": 'PRESS'}),
+ ("gpencil.dissolve", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
+ ("gpencil.dissolve", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None),
+ ("gpencil.active_frames_delete_all", {"type": 'X', "value": 'PRESS', "shift": True}, None),
+ ("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "shift": True}, None),
+ # Context menu
+ op_menu("VIEW3D_MT_gpencil_edit_specials", {"type": 'W', "value": 'PRESS'}),
+ # Separate
+ op_menu("GPENCIL_MT_separate", {"type": 'P', "value": 'PRESS'}),
+ # Split and joint strokes
+ ("gpencil.stroke_split", {"type": 'V', "value": 'PRESS'}, None),
+ ("gpencil.stroke_join", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
+ ("gpencil.stroke_join", {"type": 'J', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("type", 'JOINCOPY')]}),
+ # Copy + paset
+ ("gpencil.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
+ ("gpencil.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
+ # Snap
+ op_menu("GPENCIL_MT_snap", {"type": 'S', "value": 'PRESS', "shift": True}),
+ # Convert to geometry
+ ("gpencil.convert", {"type": 'C', "value": 'PRESS', "alt": True}, None),
+ # Show/hide
+ ("gpencil.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
+ ("gpencil.hide", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("gpencil.hide", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
+ ("gpencil.selection_opacity_toggle", {"type": 'H', "value": 'PRESS', "ctrl": True}, None),
+ # Display
+ *_grease_pencil_display(),
+ # Isolate layer
+ ("gpencil.layer_isolate", {"type": 'NUMPAD_ASTERIX', "value": 'PRESS'}, None),
+ # Move to layer
+ ("gpencil.move_to_layer", {"type": 'M', "value": 'PRESS'}, None),
+ # Transform tools
+ ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
+ ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
+ ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
+ ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
+ ("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
+ ("transform.bend", {"type": 'W', "value": 'PRESS', "shift": True}, None),
+ ("transform.tosphere", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True}, None),
+ ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
+ ("transform.transform", {"type": 'S', "value": 'PRESS', "alt": True},
+ {"properties": [("mode", 'GPENCIL_SHRINKFATTEN')]}),
+ # Proportonal editing
+ *_template_items_proportional_editing(connected=True),
+ # Add menu
+ ("object.gpencil_add", {"type": 'A', "value": 'PRESS', "shift": True}, None),
+ # Vertex group menu
+ op_menu("GPENCIL_MT_gpencil_vertex_group", {"type": 'G', "value": 'PRESS', "ctrl": True}),
+ # Toggle edit mode
+ ("gpencil.editmode_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
+ # Select mode
+ ("gpencil.selectmode_toggle", {"type": 'ONE', "value": 'PRESS'},
+ {"properties": [("mode", 0)]}),
+ ("gpencil.selectmode_toggle", {"type": 'TWO', "value": 'PRESS'},
+ {"properties": [("mode", 1)]}),
+ ])
+
+ if params.apple:
+ # Apple copy + paste
+ items.extend([
+ ("gpencil.copy", {"type": 'C', "value": 'PRESS', "oskey": True}, None),
+ ("gpencil.paste", {"type": 'V', "value": 'PRESS', "oskey": True}, None),
+ ])
+
+ return keymap
+
+
+def km_grease_pencil_stroke_paint_mode(_params):
+ items = []
+ keymap = (
+ "Grease Pencil Stroke Paint Mode",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Brush strength
+ ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path_primary", 'tool_settings.gpencil_paint.brush.gpencil_settings.pen_strength')]}),
+ # Brush size
+ ("wm.radial_control", {"type": 'F', "value": 'PRESS'},
+ {"properties": [("data_path_primary", 'tool_settings.gpencil_paint.brush.size')]}),
+ # Brush size
+ ("wm.radial_control", {"type": 'F', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path_primary", 'user_preferences.edit.grease_pencil_eraser_radius')]}),
+ # Draw context menu
+ op_menu("GPENCIL_MT_gpencil_draw_specials", {"type": 'W', "value": 'PRESS'}),
+ # Draw delete menu
+ op_menu("GPENCIL_MT_gpencil_draw_delete", {"type": 'X', "value": 'PRESS'}),
+ ])
+
+ return keymap
+
+
+def km_grease_pencil_stroke_paint_draw_brush(_params):
+ items = []
+ keymap = (
+ "Grease Pencil Stroke Paint (Draw brush)",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Draw
+ ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS'},
+ {"properties": [("mode", 'DRAW'), ("wait_for_input", False)]}),
+ ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
+ {"properties": [("mode", 'DRAW'), ("wait_for_input", False)]}),
+ # Draw - straight lines
+ ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True},
+ {"properties": [("mode", 'DRAW_STRAIGHT'), ("wait_for_input", False)]}),
+ # Draw - poly lines
+ ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("mode", 'DRAW_POLY'), ("wait_for_input", False)]}),
+ # Erase
+ ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}),
+
+ # Tablet Mappings for Drawing ------------------ */
+ # For now, only support direct drawing using the eraser, as most users using a tablet
+ # may still want to use that as their primary pointing device!
+ ("gpencil.draw", {"type": 'ERASER', "value": 'PRESS'},
+ {"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}),
+ # Selected (used by eraser)
+ # Box select
+ ("gpencil.select_box", {"type": 'B', "value": 'PRESS'}, None),
+ # Lasso select
+ ("gpencil.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True, "alt": True},
+ {"properties": [("deselect", False)]}),
+ ])
+
+ return keymap
+
+
+def km_grease_pencil_stroke_paint_erase(_params):
+ items = []
+ keymap = (
+ "Grease Pencil Stroke Paint (Erase)",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Erase
+ ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS'},
+ {"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}),
+ ("gpencil.draw", {"type": 'ERASER', "value": 'PRESS'},
+ {"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}),
+ # Box select (used by eraser)
+ ("gpencil.select_box", {"type": 'B', "value": 'PRESS'}, None),
+ # Lasso select
+ ("gpencil.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True, "alt": True},
+ {"properties": [("deselect", False)]}),
+ ])
+
+ return keymap
+
+
+def km_grease_pencil_stroke_paint_fill(_params):
+ items = []
+ keymap = (
+ "Grease Pencil Stroke Paint (Fill)",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Fill
+ ("gpencil.fill", {"type": 'LEFTMOUSE', "value": 'PRESS'},
+ {"properties": [("on_back", False)]}),
+ ("gpencil.fill", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
+ {"properties": [("on_back", True)]}),
+ # If press alternate key, the brush now it's for drawing areas
+ ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'DRAW'), ("wait_for_input", False), ("disable_straight", True)]}),
+ # If press alternative key, the brush now it's for drawing lines
+ ("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True},
+ {"properties": [("mode", 'DRAW'), ("wait_for_input", False), ("disable_straight", True), ("disable_fill", True)]}),
+ ])
+
+ return keymap
+
+
+def km_grease_pencil_stroke_sculpt_mode(params):
+ items = []
+ keymap = (
+ "Grease Pencil Stroke Sculpt Mode",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items}
+ )
+
+ items.extend([
+ # Selection
+ *_grease_pencil_selection(params),
+ # Painting
+ ("gpencil.brush_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("wait_for_input", False), ("keep_brush", True)]}),
+ ("gpencil.brush_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
+ {"properties": [("wait_for_input", False), ("keep_brush", True)]}),
+ # Brush strength
+ ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path_primary", 'tool_settings.gpencil_sculpt.brush.strength')]}),
+ # Brush size
+ ("wm.radial_control", {"type": 'F', "value": 'PRESS'},
+ {"properties": [("data_path_primary", 'tool_settings.gpencil_sculpt.brush.size')]}),
+ # Context menu
+ op_menu("VIEW3D_MT_gpencil_sculpt_specials", {"type": 'W', "value": 'PRESS'}),
+ # Display
+ *_grease_pencil_display(),
+ ])
+
+ return keymap
+
+
+def km_grease_pencil_stroke_weight_mode(params):
+ items = []
+ keymap = (
+ "Grease Pencil Stroke Weight Mode",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Selection
+ *_grease_pencil_selection(params),
+ # Painting
+ ("gpencil.brush_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("wait_for_input", False), ("keep_brush", True)]}),
+ ("gpencil.brush_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
+ {"properties": [("wait_for_input", False), ("keep_brush", True)]}),
+ # Brush strength
+ ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path_primary", 'tool_settings.gpencil_sculpt.weight_brush.strength')]}),
+ # Brush sze
+ ("wm.radial_control", {"type": 'F', "value": 'PRESS'},
+ {"properties": [("data_path_primary", 'tool_settings.gpencil_sculpt.weight_brush.size')]}),
+ # Display
+ *_grease_pencil_display(),
+ ])
+
+ return keymap
+
+
+def km_face_mask(_params):
+ items = []
+ keymap = (
+ "Face Mask",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ *_template_items_select_actions("paint.face_select_all"),
+ ("paint.face_select_hide", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("paint.face_select_hide", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
+ ("paint.face_select_reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
+ ("paint.face_select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
+ ("paint.face_select_linked_pick", {"type": 'L', "value": 'PRESS'},
+ {"properties": [("deselect", False)]}),
+ ("paint.face_select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
+ {"properties": [("deselect", True)]}),
+ ])
+
+ return keymap
+
+
+def km_weight_paint_vertex_selection(_params):
+ items = []
+ keymap = (
+ "Weight Paint Vertex Selection",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ *_template_items_select_actions("paint.vert_select_all"),
+ ("view3d.select_box", {"type": 'B', "value": 'PRESS'}, None),
+ ("view3d.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "ctrl": True},
+ {"properties": [("mode", 'ADD')]}),
+ ("view3d.select_lasso", {"type": 'EVT_TWEAK_A', "value": 'ANY', "shift": True, "ctrl": True},
+ {"properties": [("mode", 'SUB')]}),
+ ("view3d.select_circle", {"type": 'C', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+def km_pose(params):
+ items = []
+ keymap = (
+ "Pose",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("object.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
+ op_menu("VIEW3D_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}),
+ ("pose.hide", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("pose.hide", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
+ ("pose.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
+ op_menu("VIEW3D_MT_pose_apply", {"type": 'A', "value": 'PRESS', "ctrl": True}),
+ ("pose.rot_clear", {"type": 'R', "value": 'PRESS', "alt": True}, None),
+ ("pose.loc_clear", {"type": 'G', "value": 'PRESS', "alt": True}, None),
+ ("pose.scale_clear", {"type": 'S', "value": 'PRESS', "alt": True}, None),
+ ("pose.quaternions_flip", {"type": 'F', "value": 'PRESS', "alt": True}, None),
+ ("pose.rotation_mode_set", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
+ ("pose.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
+ ("pose.paste", {"type": 'V', "value": 'PRESS', "ctrl": True},
+ {"properties": [("flipped", False)]}),
+ ("pose.paste", {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("flipped", True)]}),
+ *_template_items_select_actions("pose.select_all"),
+ ("pose.select_parent", {"type": 'P', "value": 'PRESS', "shift": True}, None),
+ ("pose.select_hierarchy", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
+ {"properties": [("direction", 'PARENT'), ("extend", False)]}),
+ ("pose.select_hierarchy", {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True},
+ {"properties": [("direction", 'PARENT'), ("extend", True)]}),
+ ("pose.select_hierarchy", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
+ {"properties": [("direction", 'CHILD'), ("extend", False)]}),
+ ("pose.select_hierarchy", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True},
+ {"properties": [("direction", 'CHILD'), ("extend", True)]}),
+ ("pose.select_linked", {"type": 'L', "value": 'PRESS'}, None),
+ ("pose.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None),
+ ("pose.select_mirror", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("pose.constraint_add_with_targets", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("pose.constraints_clear", {"type": 'C', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("pose.ik_add", {"type": 'I', "value": 'PRESS', "shift": True}, None),
+ ("pose.ik_clear", {"type": 'I', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ op_menu("VIEW3D_MT_pose_group", {"type": 'G', "value": 'PRESS', "ctrl": True}),
+ op_menu("VIEW3D_MT_bone_options_toggle", {"type": 'W', "value": 'PRESS', "shift": True}),
+ op_menu("VIEW3D_MT_bone_options_enable", {"type": 'W', "value": 'PRESS', "shift": True, "ctrl": True}),
+ op_menu("VIEW3D_MT_bone_options_disable", {"type": 'W', "value": 'PRESS', "alt": True}),
+ ("armature.layers_show_all", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True}, None),
+ ("armature.armature_layers", {"type": 'M', "value": 'PRESS', "shift": True}, None),
+ ("pose.bone_layers", {"type": 'M', "value": 'PRESS'}, None),
+ ("wm.context_toggle", {"type": 'Z', "value": 'PRESS'},
+ {"properties": [("data_path", 'space_data.overlay.show_bone_select')]}),
+ ("transform.transform", {"type": 'S', "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("mode", 'BONE_SIZE')]}),
+ ("anim.keyframe_insert_menu", {"type": 'I', "value": 'PRESS'}, None),
+ ("anim.keyframe_delete_v3d", {"type": 'I', "value": 'PRESS', "alt": True}, None),
+ ("anim.keying_set_active_set", {"type": 'I', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
+ ("poselib.browse_interactive", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
+ ("poselib.pose_add", {"type": 'L', "value": 'PRESS', "shift": True}, None),
+ ("poselib.pose_remove", {"type": 'L', "value": 'PRESS', "alt": True}, None),
+ ("poselib.pose_rename", {"type": 'L', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("pose.push", {"type": 'E', "value": 'PRESS', "ctrl": True}, None),
+ ("pose.relax", {"type": 'E', "value": 'PRESS', "alt": True}, None),
+ ("pose.breakdown", {"type": 'E', "value": 'PRESS', "shift": True}, None),
+ op_menu("VIEW3D_MT_pose_specials", {"type": 'W', "value": 'PRESS'}),
+ op_menu("VIEW3D_MT_pose_propagate", {"type": 'P', "value": 'PRESS', "alt": True}),
+ ])
+
+ if params.apple:
+ items.extend([
+ ("pose.copy", {"type": 'C', "value": 'PRESS', "oskey": True}, None),
+ ("pose.paste", {"type": 'V', "value": 'PRESS', "oskey": True},
+ {"properties": [("flipped", False)]}),
+ ("pose.paste", {"type": 'V', "value": 'PRESS', "shift": True, "oskey": True},
+ {"properties": [("flipped", True)]}),
+ ])
+
+ return keymap
+
+
+def km_object_mode(params):
+ items = []
+ keymap = (
+ "Object Mode",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ op_menu_pie("VIEW3D_MT_proportional_editing_falloff_pie", {"type": 'O', "value": 'PRESS', "shift": True}),
+ ("wm.context_toggle", {"type": 'O', "value": 'PRESS'},
+ {"properties": [("data_path", 'tool_settings.use_proportional_edit_objects')]}),
+ *_template_items_select_actions("object.select_all"),
+ ("object.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
+ ("object.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
+ ("object.select_linked", {"type": 'L', "value": 'PRESS', "shift": True}, None),
+ ("object.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None),
+ ("object.select_hierarchy", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
+ {"properties": [("direction", 'PARENT'), ("extend", False)]}),
+ ("object.select_hierarchy", {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True},
+ {"properties": [("direction", 'PARENT'), ("extend", True)]}),
+ ("object.select_hierarchy", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
+ {"properties": [("direction", 'CHILD'), ("extend", False)]}),
+ ("object.select_hierarchy", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True},
+ {"properties": [("direction", 'CHILD'), ("extend", True)]}),
+ ("object.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
+ ("object.parent_clear", {"type": 'P', "value": 'PRESS', "alt": True}, None),
+ ("object.location_clear", {"type": 'G', "value": 'PRESS', "alt": True},
+ {"properties": [("clear_delta", False)]}),
+ ("object.rotation_clear", {"type": 'R', "value": 'PRESS', "alt": True},
+ {"properties": [("clear_delta", False)]}),
+ ("object.scale_clear", {"type": 'S', "value": 'PRESS', "alt": True},
+ {"properties": [("clear_delta", False)]}),
+ ("object.delete", {"type": 'X', "value": 'PRESS'},
+ {"properties": [("use_global", False)]}),
+ ("object.delete", {"type": 'X', "value": 'PRESS', "shift": True},
+ {"properties": [("use_global", True)]}),
+ ("object.delete", {"type": 'DEL', "value": 'PRESS'},
+ {"properties": [("use_global", False)]}),
+ ("object.delete", {"type": 'DEL', "value": 'PRESS', "shift": True},
+ {"properties": [("use_global", True)]}),
+ op_menu("VIEW3D_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}),
+ op_menu("VIEW3D_MT_object_apply", {"type": 'A', "value": 'PRESS', "ctrl": True}),
+ op_menu("VIEW3D_MT_make_links", {"type": 'L', "value": 'PRESS', "ctrl": True}),
+ ("object.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ ("object.duplicate_move_linked", {"type": 'D', "value": 'PRESS', "alt": True}, None),
+ ("object.join", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
+ ("anim.keyframe_insert_menu", {"type": 'I', "value": 'PRESS'}, None),
+ ("anim.keyframe_delete_v3d", {"type": 'I', "value": 'PRESS', "alt": True}, None),
+ ("anim.keying_set_active_set", {"type": 'I', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
+ ("collection.create", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
+ ("collection.objects_remove", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("collection.objects_remove_all", {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
+ ("collection.objects_add_active", {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("collection.objects_remove_active", {"type": 'G', "value": 'PRESS', "shift": True, "alt": True}, None),
+ op_menu("VIEW3D_MT_object_specials", {"type": 'W', "value": 'PRESS'}),
+ *_template_items_object_subdivision_set(),
+ ("object.move_to_collection", {"type": 'M', "value": 'PRESS'}, None),
+ ("object.link_to_collection", {"type": 'M', "value": 'PRESS', "shift": True}, None),
+ ("object.hide_view_clear", {"type": 'H', "value": 'PRESS', "alt": True}, None),
+ ("object.hide_view_set", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("object.hide_view_set", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
+ ("object.hide_collection", {"type": 'H', "value": 'PRESS', "ctrl": True}, None),
+ *(
+ (("object.hide_collection",
+ {"type": NUMBERS_1[i], "value": 'PRESS', "any": True},
+ {"properties": [("collection_index", i + 1)]})
+ for i in range(10)
+ )
+ ),
+ ])
+
+ if params.legacy:
+ items.extend([
+ ("object.select_mirror", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("object.parent_no_inverse_set", {"type": 'P', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("object.track_set", {"type": 'T', "value": 'PRESS', "ctrl": True}, None),
+ ("object.track_clear", {"type": 'T', "value": 'PRESS', "alt": True}, None),
+ ("object.constraint_add_with_targets", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("object.constraints_clear", {"type": 'C', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("object.origin_clear", {"type": 'O', "value": 'PRESS', "alt": True}, None),
+ ("object.duplicates_make_real", {"type": 'A', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ op_menu("VIEW3D_MT_make_single_user", {"type": 'U', "value": 'PRESS'}),
+ ("object.convert", {"type": 'C', "value": 'PRESS', "alt": True}, None),
+ ("object.proxy_make", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("object.make_local", {"type": 'L', "value": 'PRESS'}, None),
+ ("object.data_transfer", {"type": 'T', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ])
+
+ return keymap
+
+
+def km_paint_curve(params):
+ items = []
+ keymap = (
+ "Paint Curve",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("paintcurve.add_point_slide", {"type": params.action_mouse, "value": 'PRESS', "ctrl": True}, None),
+ ("paintcurve.select", {"type": params.select_mouse, "value": 'PRESS'}, None),
+ ("paintcurve.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True)]}),
+ ("paintcurve.slide", {"type": params.action_mouse, "value": 'PRESS'}, None),
+ ("paintcurve.slide", {"type": params.action_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("align", True)]}),
+ ("paintcurve.select", {"type": 'A', "value": 'PRESS'},
+ {"properties": [("toggle", True)]}),
+ ("paintcurve.cursor", {"type": params.action_mouse, "value": 'PRESS'}, None),
+ ("paintcurve.delete_point", {"type": 'X', "value": 'PRESS'}, None),
+ ("paintcurve.delete_point", {"type": 'DEL', "value": 'PRESS'}, None),
+ ("paintcurve.draw", {"type": 'RET', "value": 'PRESS'}, None),
+ ("paintcurve.draw", {"type": 'NUMPAD_ENTER', "value": 'PRESS'}, None),
+ ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
+ ("transform.translate", {"type": 'EVT_TWEAK_S', "value": 'ANY'}, None),
+ ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
+ ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+def km_curve(params):
+ items = []
+ keymap = (
+ "Curve",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ op_menu("VIEW3D_MT_curve_add", {"type": 'A', "value": 'PRESS', "shift": True}),
+ ("curve.handle_type_set", {"type": 'V', "value": 'PRESS'}, None),
+ ("curve.vertex_add", {"type": params.action_mouse, "value": 'CLICK', "ctrl": True}, None),
+ ("curve.draw", {"type": params.action_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("wait_for_input", False)]}),
+ ("curve.draw", {"type": 'PEN', "value": 'PRESS', "shift": True},
+ {"properties": [("wait_for_input", False)]}),
+ *_template_items_select_actions("curve.select_all"),
+ ("curve.select_row", {"type": 'R', "value": 'PRESS', "shift": True}, None),
+ ("curve.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
+ ("curve.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
+ ("curve.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
+ ("curve.select_similar", {"type": 'G', "value": 'PRESS', "shift": True}, None),
+ ("curve.select_linked_pick", {"type": 'L', "value": 'PRESS'},
+ {"properties": [("deselect", False)]}),
+ ("curve.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
+ {"properties": [("deselect", True)]}),
+ ("curve.shortest_path_pick", {"type": params.select_mouse, "value": 'CLICK', "ctrl": True}, None),
+ ("curve.separate", {"type": 'P', "value": 'PRESS'}, None),
+ ("curve.split", {"type": 'Y', "value": 'PRESS'}, None),
+ ("curve.extrude_move", {"type": 'E', "value": 'PRESS'}, None),
+ ("curve.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ ("curve.make_segment", {"type": 'F', "value": 'PRESS'}, None),
+ ("curve.cyclic_toggle", {"type": 'C', "value": 'PRESS', "alt": True}, None),
+ op_menu("VIEW3D_MT_edit_curve_delete", {"type": 'X', "value": 'PRESS'}),
+ op_menu("VIEW3D_MT_edit_curve_delete", {"type": 'DEL', "value": 'PRESS'}),
+ ("curve.dissolve_verts", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
+ ("curve.dissolve_verts", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None),
+ ("curve.tilt_clear", {"type": 'T', "value": 'PRESS', "alt": True}, None),
+ ("transform.tilt", {"type": 'T', "value": 'PRESS', "ctrl": True}, None),
+ ("transform.transform", {"type": 'S', "value": 'PRESS', "alt": True},
+ {"properties": [("mode", 'CURVE_SHRINKFATTEN')]}),
+ ("curve.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
+ ("curve.hide", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("curve.hide", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
+ ("curve.normals_make_consistent", {"type": 'N', "value": 'PRESS', "ctrl" if params.legacy else "shift": True}, None),
+ ("object.vertex_parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
+ op_menu("VIEW3D_MT_edit_curve_specials", {"type": 'W', "value": 'PRESS'}),
+ op_menu("VIEW3D_MT_hook", {"type": 'H', "value": 'PRESS', "ctrl": True}),
+ *_template_items_proportional_editing(connected=True),
+ ])
+
+ return keymap
+
+# Radial control setup helpers, this operator has a lot of properties.
+
+
+def radial_control_properties(paint, prop, secondary_prop, secondary_rotation=False, color=False, zoom=False):
+ brush_path = 'tool_settings.' + paint + '.brush'
+ unified_path = 'tool_settings.unified_paint_settings'
+ rotation = 'mask_texture_slot.angle' if secondary_rotation else 'texture_slot.angle'
+ return {
+ "properties": [
+ ("data_path_primary", brush_path + '.' + prop),
+ ("data_path_secondary", unified_path + '.' + prop if secondary_prop else ''),
+ ("use_secondary", unified_path + '.' + secondary_prop if secondary_prop else ''),
+ ("rotation_path", brush_path + '.' + rotation),
+ ("color_path", brush_path + '.cursor_color_add'),
+ ("fill_color_path", brush_path + '.color' if color else ''),
+ ("fill_color_override_path", unified_path + '.color' if color else ''),
+ ("fill_color_override_test_path", unified_path + '.use_unified_color' if color else ''),
+ ("zoom_path", 'space_data.zoom' if zoom else ''),
+ ("image_id", brush_path + ''),
+ ("secondary_tex", secondary_rotation),
+ ],
+ }
+
+# Radial controls for the paint and sculpt modes.
+
+
+def _template_paint_radial_control(paint, rotation=False, secondary_rotation=False, color=False, zoom=False):
+ items = []
+
+ items.extend([
+ ("wm.radial_control", {"type": 'F', "value": 'PRESS'},
+ radial_control_properties(paint, 'size', 'use_unified_size', secondary_rotation=secondary_rotation, color=color, zoom=zoom)),
+ ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True},
+ radial_control_properties(paint, 'strength', 'use_unified_strength', secondary_rotation=secondary_rotation, color=color)),
+ ])
+
+ if rotation:
+ items.extend([
+ ("wm.radial_control", {"type": 'F', "value": 'PRESS', "ctrl": True},
+ radial_control_properties(paint, 'texture_slot.angle', None, color=color)),
+ ])
+
+ if secondary_rotation:
+ items.extend([
+ ("wm.radial_control", {"type": 'F', "value": 'PRESS', "ctrl": True, "alt": True},
+ radial_control_properties(paint, 'mask_texture_slot.angle', None, secondary_rotation=secondary_rotation, color=color)),
+ ])
+
+ return items
+
+
+def km_image_paint(_params):
+ items = []
+ keymap = (
+ "Image Paint",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("paint.image_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'},
+ {"properties": [("mode", 'NORMAL')]}),
+ ("paint.image_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'INVERT')]}),
+ ("paint.brush_colors_flip", {"type": 'X', "value": 'PRESS'}, None),
+ ("paint.grab_clone", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
+ ("paint.sample_color", {"type": 'S', "value": 'PRESS'}, None),
+ ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
+ {"properties": [("scalar", 0.9)]}),
+ ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
+ {"properties": [("scalar", 1.0 / 0.9)]}),
+ *_template_paint_radial_control("image_paint", color=True, zoom=True, rotation=True, secondary_rotation=True),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS'},
+ {"properties": [("mode", 'TRANSLATION')]}),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True},
+ {"properties": [("mode", 'SCALE')]}),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'ROTATION')]}),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True},
+ {"properties": [("mode", 'TRANSLATION'), ("texmode", 'SECONDARY')]}),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("mode", 'SCALE'), ("texmode", 'SECONDARY')]}),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("mode", 'ROTATION'), ("texmode", 'SECONDARY')]}),
+ ("wm.context_toggle", {"type": 'M', "value": 'PRESS'},
+ {"properties": [("data_path", 'image_paint_object.data.use_paint_mask')]}),
+ ("wm.context_toggle", {"type": 'S', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path", 'tool_settings.image_paint.brush.use_smooth_stroke')]}),
+ op_menu("VIEW3D_MT_angle_control", {"type": 'R', "value": 'PRESS'}),
+ ("wm.context_menu_enum", {"type": 'E', "value": 'PRESS'},
+ {"properties": [("data_path", 'tool_settings.image_paint.brush.stroke_method')]}),
+ ])
+
+ return keymap
+
+
+def km_vertex_paint(_params):
+ items = []
+ keymap = (
+ "Vertex Paint",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("paint.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("paint.brush_colors_flip", {"type": 'X', "value": 'PRESS'}, None),
+ ("paint.sample_color", {"type": 'S', "value": 'PRESS'}, None),
+ ("paint.vertex_color_set", {"type": 'K', "value": 'PRESS', "shift": True}, None),
+ ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
+ {"properties": [("scalar", 0.9)]}),
+ ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
+ {"properties": [("scalar", 1.0 / 0.9)]}),
+ *_template_paint_radial_control("vertex_paint", color=True, rotation=True),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS'},
+ {"properties": [("mode", 'TRANSLATION')]}),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True},
+ {"properties": [("mode", 'SCALE')]}),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'ROTATION')]}),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True},
+ {"properties": [("mode", 'TRANSLATION'), ("texmode", 'SECONDARY')]}),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("mode", 'SCALE'), ("texmode", 'SECONDARY')]}),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("mode", 'ROTATION'), ("texmode", 'SECONDARY')]}),
+ ("wm.context_toggle", {"type": 'M', "value": 'PRESS'},
+ {"properties": [("data_path", 'vertex_paint_object.data.use_paint_mask')]}),
+ ("wm.context_toggle", {"type": 'S', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path", 'tool_settings.vertex_paint.brush.use_smooth_stroke')]}),
+ op_menu("VIEW3D_MT_angle_control", {"type": 'R', "value": 'PRESS'}),
+ ("wm.context_menu_enum", {"type": 'E', "value": 'PRESS'},
+ {"properties": [("data_path", 'tool_settings.vertex_paint.brush.stroke_method')]}),
+ ])
+
+ return keymap
+
+
+def km_weight_paint(params):
+ items = []
+ keymap = (
+ "Weight Paint",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("paint.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("paint.weight_sample", {"type": params.action_mouse, "value": 'PRESS', "ctrl": True}, None),
+ ("paint.weight_sample_group", {"type": params.action_mouse, "value": 'PRESS', "shift": True}, None),
+ ("paint.weight_gradient", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True},
+ {"properties": [("type", 'LINEAR')]}),
+ ("paint.weight_gradient", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("type", 'RADIAL')]}),
+ ("paint.weight_set", {"type": 'K', "value": 'PRESS', "shift": True}, None),
+ ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
+ {"properties": [("scalar", 0.9)]}),
+ ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
+ {"properties": [("scalar", 1.0 / 0.9)]}),
+ *_template_paint_radial_control("weight_paint"),
+ ("wm.radial_control", {"type": 'W', "value": 'PRESS'},
+ radial_control_properties("weight_paint", 'weight', 'use_unified_weight')),
+ ("wm.context_menu_enum", {"type": 'E', "value": 'PRESS'},
+ {"properties": [("data_path", 'tool_settings.vertex_paint.brush.stroke_method')]}),
+ ("wm.context_toggle", {"type": 'M', "value": 'PRESS'},
+ {"properties": [("data_path", 'weight_paint_object.data.use_paint_mask')]}),
+ ("wm.context_toggle", {"type": 'V', "value": 'PRESS'},
+ {"properties": [("data_path", 'weight_paint_object.data.use_paint_mask_vertex')]}),
+ ("wm.context_toggle", {"type": 'S', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path", 'tool_settings.weight_paint.brush.use_smooth_stroke')]}),
+ ])
+
+ return keymap
+
+
+def km_sculpt(_params):
+ items = []
+ keymap = (
+ "Sculpt",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Brush strokes
+ ("sculpt.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS'},
+ {"properties": [("mode", 'NORMAL')]}),
+ ("sculpt.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'INVERT')]}),
+ ("sculpt.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
+ {"properties": [("mode", 'SMOOTH')]}),
+ # Partial Visibility Show/hide
+ ("paint.hide_show", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("action", 'SHOW'), ("area", 'INSIDE')]}),
+ ("paint.hide_show", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("action", 'HIDE'), ("area", 'INSIDE')]}),
+ ("paint.hide_show", {"type": 'H', "value": 'PRESS', "alt": True},
+ {"properties": [("action", 'SHOW'), ("area", 'ALL')]}),
+ # Subdivision levels
+ *_template_items_object_subdivision_set(),
+ ("object.subdivision_set", {"type": 'PAGE_UP', "value": 'PRESS'},
+ {"properties": [("level", 1), ("relative", True)]}),
+ ("object.subdivision_set", {"type": 'PAGE_DOWN', "value": 'PRESS'},
+ {"properties": [("level", -1), ("relative", True)]}),
+ # Mask
+ ("paint.mask_flood_fill", {"type": 'M', "value": 'PRESS', "alt": True},
+ {"properties": [("mode", 'VALUE'), ("value", 0.0)]}),
+ ("paint.mask_flood_fill", {"type": 'I', "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'INVERT')]}),
+ ("paint.mask_lasso_gesture", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("wm.context_toggle", {"type": 'M', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'scene.tool_settings.sculpt.show_mask')]}),
+ # Dynamic topology
+ ("sculpt.dynamic_topology_toggle", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
+ ("sculpt.set_detail_size", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ # Brush properties
+ ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
+ {"properties": [("scalar", 0.9)]}),
+ ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
+ {"properties": [("scalar", 1.0 / 0.9)]}),
+ *_template_paint_radial_control("sculpt", rotation=True),
+ # Stencil
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS'},
+ {"properties": [("mode", 'TRANSLATION')]}),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True},
+ {"properties": [("mode", 'SCALE')]}),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'ROTATION')]}),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True},
+ {"properties": [("mode", 'TRANSLATION'), ("texmode", 'SECONDARY')]}),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("mode", 'SCALE'), ("texmode", 'SECONDARY')]}),
+ ("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("mode", 'ROTATION'), ("texmode", 'SECONDARY')]}),
+ # Tools
+ ("paint.brush_select", {"type": 'X', "value": 'PRESS'},
+ {"properties": [("paint_mode", 'SCULPT'), ("sculpt_tool", 'DRAW')]}),
+ ("paint.brush_select", {"type": 'S', "value": 'PRESS'},
+ {"properties": [("paint_mode", 'SCULPT'), ("sculpt_tool", 'SMOOTH')]}),
+ ("paint.brush_select", {"type": 'P', "value": 'PRESS'},
+ {"properties": [("paint_mode", 'SCULPT'), ("sculpt_tool", 'PINCH')]}),
+ ("paint.brush_select", {"type": 'I', "value": 'PRESS'},
+ {"properties": [("paint_mode", 'SCULPT'), ("sculpt_tool", 'INFLATE')]}),
+ ("paint.brush_select", {"type": 'G', "value": 'PRESS'},
+ {"properties": [("paint_mode", 'SCULPT'), ("sculpt_tool", 'GRAB')]}),
+ ("paint.brush_select", {"type": 'L', "value": 'PRESS'},
+ {"properties": [("paint_mode", 'SCULPT'), ("sculpt_tool", 'LAYER')]}),
+ ("paint.brush_select", {"type": 'T', "value": 'PRESS', "shift": True},
+ {"properties": [("paint_mode", 'SCULPT'), ("sculpt_tool", 'FLATTEN')]}),
+ ("paint.brush_select", {"type": 'C', "value": 'PRESS'},
+ {"properties": [("paint_mode", 'SCULPT'), ("sculpt_tool", 'CLAY')]}),
+ ("paint.brush_select", {"type": 'C', "value": 'PRESS', "shift": True},
+ {"properties": [("paint_mode", 'SCULPT'), ("sculpt_tool", 'CREASE')]}),
+ ("paint.brush_select", {"type": 'K', "value": 'PRESS'},
+ {"properties": [("paint_mode", 'SCULPT'), ("sculpt_tool", 'SNAKE_HOOK')]}),
+ ("paint.brush_select", {"type": 'M', "value": 'PRESS'},
+ {"properties": [("paint_mode", 'SCULPT'), ("sculpt_tool", 'MASK'), ("toggle", True), ("create_missing", True)]}),
+ # Menus
+ ("wm.context_menu_enum", {"type": 'E', "value": 'PRESS'},
+ {"properties": [("data_path", 'tool_settings.sculpt.brush.stroke_method')]}),
+ ("wm.context_toggle", {"type": 'S', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path", 'tool_settings.sculpt.brush.use_smooth_stroke')]}),
+ op_menu("VIEW3D_MT_angle_control", {"type": 'R', "value": 'PRESS'}),
+ ])
+
+ return keymap
+
+
+# Mesh edit mode.
+def km_mesh(params):
+ items = []
+ keymap = (
+ "Mesh",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Tools.
+ ("mesh.loopcut_slide", {"type": 'R', "value": 'PRESS', "ctrl": True},
+ {"properties": [("TRANSFORM_OT_edge_slide", [("release_confirm", False), ],)]}),
+ ("mesh.offset_edge_loops_slide", {"type": 'R', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("TRANSFORM_OT_edge_slide", [("release_confirm", False), ],)]}),
+ ("mesh.inset", {"type": 'I', "value": 'PRESS'}, None),
+ ("mesh.bevel", {"type": 'B', "value": 'PRESS', "ctrl": True},
+ {"properties": [("vertex_only", False)]}),
+ ("mesh.bevel", {"type": 'B', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("vertex_only", True)]}),
+ # Selection modes.
+ *_template_items_editmode_mesh_select_mode(),
+ # Selection.
+ ("mesh.loop_select", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
+ {"properties": [("extend", False), ("deselect", False), ("toggle", False)]}),
+ ("mesh.loop_select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
+ {"properties": [("extend", False), ("deselect", False), ("toggle", True)]}),
+ ("mesh.edgering_select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("extend", False), ("deselect", False), ("toggle", False)]}),
+ ("mesh.edgering_select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
+ {"properties": [("extend", False), ("deselect", False), ("toggle", True)]}),
+ ("mesh.shortest_path_pick", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
+ {"properties": [("use_fill", False)]}),
+ ("mesh.shortest_path_pick", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("use_fill", True)]}),
+ *_template_items_select_actions("mesh.select_all"),
+ ("mesh.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
+ ("mesh.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
+ ("mesh.select_next_item", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("mesh.select_prev_item", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("mesh.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
+ ("mesh.select_linked_pick", {"type": 'L', "value": 'PRESS'},
+ {"properties": [("deselect", False)]}),
+ ("mesh.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
+ {"properties": [("deselect", True)]}),
+ ("mesh.select_mirror", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ op_menu("VIEW3D_MT_edit_mesh_select_similar", {"type": 'G', "value": 'PRESS', "shift": True}),
+ # Hide/reveal.
+ ("mesh.hide", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("mesh.hide", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
+ ("mesh.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
+ # Tools.
+ ("mesh.normals_make_consistent", {"type": 'N', "value": 'PRESS', "ctrl" if params.legacy else "shift": True},
+ {"properties": [("inside", False)]}),
+ ("mesh.normals_make_consistent", {"type": 'N', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("inside", True)]}),
+ ("view3d.edit_mesh_extrude_move_normal", {"type": 'E', "value": 'PRESS'}, None),
+ op_menu("VIEW3D_MT_edit_mesh_extrude", {"type": 'E', "value": 'PRESS', "alt": True}),
+ ("transform.edge_crease", {"type": 'E', "value": 'PRESS', "shift": True}, None),
+ ("mesh.fill", {"type": 'F', "value": 'PRESS', "alt": True}, None),
+ ("mesh.quads_convert_to_tris", {"type": 'T', "value": 'PRESS', "ctrl": True},
+ {"properties": [("quad_method", 'BEAUTY'), ("ngon_method", 'BEAUTY')]}),
+ ("mesh.quads_convert_to_tris", {"type": 'T', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("quad_method", 'FIXED'), ("ngon_method", 'CLIP')]}),
+ ("mesh.tris_convert_to_quads", {"type": 'J', "value": 'PRESS', "alt": True}, None),
+ ("mesh.rip_move", {"type": 'V', "value": 'PRESS'},
+ {"properties": [("MESH_OT_rip", [("use_fill", False), ],)]}),
+ ("mesh.rip_move", {"type": 'V', "value": 'PRESS', "alt": True},
+ {"properties": [("MESH_OT_rip", [("use_fill", True), ],)]}),
+ ("mesh.rip_edge_move", {"type": 'D', "value": 'PRESS', "alt": True}, None),
+ ("mesh.merge", {"type": 'M', "value": 'PRESS', "alt": True}, None),
+ ("transform.shrink_fatten", {"type": 'S', "value": 'PRESS', "alt": True}, None),
+ ("mesh.edge_face_add", {"type": 'F', "value": 'PRESS'}, None),
+ ("mesh.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ op_menu("VIEW3D_MT_mesh_add", {"type": 'A', "value": 'PRESS', "shift": True}),
+ ("mesh.separate", {"type": 'P', "value": 'PRESS'}, None),
+ ("mesh.split", {"type": 'Y', "value": 'PRESS'}, None),
+ ("mesh.vert_connect_path", {"type": 'J', "value": 'PRESS'}, None),
+ ("mesh.point_normals", {"type": 'L', "value": 'PRESS', "alt": True}, None),
+ ("transform.vert_slide", {"type": 'V', "value": 'PRESS', "shift": True}, None),
+ ("mesh.dupli_extrude_cursor", {"type": params.action_mouse, "value": 'CLICK', "ctrl": True},
+ {"properties": [("rotate_source", True)]}),
+ ("mesh.dupli_extrude_cursor", {"type": params.action_mouse, "value": 'CLICK', "shift": True, "ctrl": True},
+ {"properties": [("rotate_source", False)]}),
+ op_menu("VIEW3D_MT_edit_mesh_delete", {"type": 'X', "value": 'PRESS'}),
+ op_menu("VIEW3D_MT_edit_mesh_delete", {"type": 'DEL', "value": 'PRESS'}),
+ ("mesh.dissolve_mode", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
+ ("mesh.dissolve_mode", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None),
+ ("mesh.knife_tool", {"type": 'K', "value": 'PRESS'},
+ {"properties": [("use_occlude_geometry", True), ("only_selected", False)]}),
+ ("object.vertex_parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
+ # Menus.
+ op_menu("VIEW3D_MT_edit_mesh_specials", {"type": 'W', "value": 'PRESS'}),
+ op_menu("VIEW3D_MT_edit_mesh_faces", {"type": 'F', "value": 'PRESS', "ctrl": True}),
+ op_menu("VIEW3D_MT_edit_mesh_edges", {"type": 'E', "value": 'PRESS', "ctrl": True}),
+ op_menu("VIEW3D_MT_edit_mesh_vertices", {"type": 'V', "value": 'PRESS', "ctrl": True}),
+ op_menu("VIEW3D_MT_hook", {"type": 'H', "value": 'PRESS', "ctrl": True}),
+ op_menu("VIEW3D_MT_uv_map", {"type": 'U', "value": 'PRESS'}),
+ op_menu("VIEW3D_MT_vertex_group", {"type": 'G', "value": 'PRESS', "ctrl": True}),
+ ("object.vertex_group_remove_from", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ *_template_items_proportional_editing(connected=True),
+ ])
+
+ if params.legacy:
+ items.extend([
+ ("mesh.poke", {"type": 'P', "value": 'PRESS', "alt": True}, None),
+ ("mesh.select_non_manifold", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
+ ("mesh.faces_select_linked_flat", {"type": 'F', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
+ ("mesh.spin", {"type": 'R', "value": 'PRESS', "alt": True}, None),
+ ("mesh.beautify_fill", {"type": 'F', "value": 'PRESS', "shift": True, "alt": True}, None),
+ ("mesh.knife_tool", {"type": 'K', "value": 'PRESS', "shift": True},
+ {"properties": [("use_occlude_geometry", False), ("only_selected", True)]}),
+ *_template_items_object_subdivision_set(),
+ ])
+
+ return keymap
+
+
+# Armature edit mode
+def km_armature(params):
+ items = []
+ keymap = (
+ "Armature",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ # Hide/reveal.
+ ("armature.hide", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("armature.hide", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
+ ("armature.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
+ # Align & roll.
+ ("armature.align", {"type": 'A', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("armature.calculate_roll", {"type": 'N', "value": 'PRESS', "ctrl" if params.legacy else "shift": True}, None),
+ ("armature.roll_clear", {"type": 'R', "value": 'PRESS', "alt": True}, None),
+ ("armature.switch_direction", {"type": 'F', "value": 'PRESS', "alt": True}, None),
+ # Add.
+ ("armature.bone_primitive_add", {"type": 'A', "value": 'PRESS', "shift": True}, None),
+ # Parenting.
+ ("armature.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
+ ("armature.parent_clear", {"type": 'P', "value": 'PRESS', "alt": True}, None),
+ # Selection.
+ *_template_items_select_actions("armature.select_all"),
+ ("armature.select_mirror", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("extend", False)]}),
+ ("armature.select_hierarchy", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
+ {"properties": [("direction", 'PARENT'), ("extend", False)]}),
+ ("armature.select_hierarchy", {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True},
+ {"properties": [("direction", 'PARENT'), ("extend", True)]}),
+ ("armature.select_hierarchy", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
+ {"properties": [("direction", 'CHILD'), ("extend", False)]}),
+ ("armature.select_hierarchy", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True},
+ {"properties": [("direction", 'CHILD'), ("extend", True)]}),
+ ("armature.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
+ ("armature.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
+ ("armature.select_similar", {"type": 'G', "value": 'PRESS', "shift": True}, None),
+ ("armature.select_linked", {"type": 'L', "value": 'PRESS'}, None),
+ ("armature.shortest_path_pick", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True}, None),
+ # Editing.
+ op_menu("VIEW3D_MT_edit_armature_delete", {"type": 'X', "value": 'PRESS'}),
+ op_menu("VIEW3D_MT_edit_armature_delete", {"type": 'DEL', "value": 'PRESS'}),
+ ("armature.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ ("armature.dissolve", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
+ ("armature.dissolve", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None),
+ ("armature.extrude_move", {"type": 'E', "value": 'PRESS'}, None),
+ ("armature.extrude_forked", {"type": 'E', "value": 'PRESS', "shift": True}, None),
+ ("armature.click_extrude", {"type": params.action_mouse, "value": 'CLICK', "ctrl": True}, None),
+ ("armature.fill", {"type": 'F', "value": 'PRESS'}, None),
+ ("armature.merge", {"type": 'M', "value": 'PRESS', "alt": True}, None),
+ ("armature.split", {"type": 'Y', "value": 'PRESS'}, None),
+ ("armature.separate", {"type": 'P', "value": 'PRESS'}, None),
+ # Set flags.
+ op_menu("VIEW3D_MT_bone_options_toggle", {"type": 'W', "value": 'PRESS', "shift": True}),
+ op_menu("VIEW3D_MT_bone_options_enable", {"type": 'W', "value": 'PRESS', "shift": True, "ctrl": True}),
+ op_menu("VIEW3D_MT_bone_options_disable", {"type": 'W', "value": 'PRESS', "alt": True}),
+ # Armature/bone layers.
+ ("armature.layers_show_all", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True}, None),
+ ("armature.armature_layers", {"type": 'M', "value": 'PRESS', "shift": True}, None),
+ ("armature.bone_layers", {"type": 'M', "value": 'PRESS'}, None),
+ # Special transforms.
+ ("transform.transform", {"type": 'S', "value": 'PRESS', "ctrl": True, "alt": True},
+ {"properties": [("mode", 'BONE_SIZE')]}),
+ ("transform.transform", {"type": 'S', "value": 'PRESS', "alt": True},
+ {"properties": [("mode", 'BONE_ENVELOPE')]}),
+ ("transform.transform", {"type": 'R', "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'BONE_ROLL')]}),
+ # Menus.
+ op_menu("VIEW3D_MT_armature_specials", {"type": 'W', "value": 'PRESS'}),
+ ])
+
+ return keymap
+
+
+# Metaball edit mode.
+def km_metaball(_params):
+ items = []
+ keymap = (
+ "Metaball",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("object.metaball_add", {"type": 'A', "value": 'PRESS', "shift": True}, None),
+ ("mball.reveal_metaelems", {"type": 'H', "value": 'PRESS', "alt": True}, None),
+ ("mball.hide_metaelems", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("mball.hide_metaelems", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
+ ("mball.delete_metaelems", {"type": 'X', "value": 'PRESS'}, None),
+ ("mball.delete_metaelems", {"type": 'DEL', "value": 'PRESS'}, None),
+ ("mball.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ *_template_items_select_actions("mball.select_all"),
+ ("mball.select_similar", {"type": 'G', "value": 'PRESS', "shift": True}, None),
+ *_template_items_proportional_editing(connected=True),
+ ])
+
+ return keymap
+
+
+# Lattice edit mode.
+def km_lattice(_params):
+ items = []
+ keymap = (
+ "Lattice",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ *_template_items_select_actions("lattice.select_all"),
+ ("lattice.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
+ ("lattice.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
+ ("object.vertex_parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
+ ("lattice.flip", {"type": 'F', "value": 'PRESS', "alt": True}, None),
+ op_menu("VIEW3D_MT_hook", {"type": 'H', "value": 'PRESS', "ctrl": True}),
+ *_template_items_proportional_editing(connected=False),
+ ])
+
+ return keymap
+
+
+# Particle edit mode.
+def km_particle(_params):
+ items = []
+ keymap = (
+ "Particle",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ *_template_items_select_actions("particle.select_all"),
+ ("particle.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
+ ("particle.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
+ ("particle.select_linked", {"type": 'L', "value": 'PRESS'},
+ {"properties": [("deselect", False)]}),
+ ("particle.select_linked", {"type": 'L', "value": 'PRESS', "shift": True},
+ {"properties": [("deselect", True)]}),
+ ("particle.delete", {"type": 'X', "value": 'PRESS'}, None),
+ ("particle.delete", {"type": 'DEL', "value": 'PRESS'}, None),
+ ("particle.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
+ ("particle.hide", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("particle.hide", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
+ ("particle.brush_edit", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("particle.brush_edit", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, None),
+ ("wm.radial_control", {"type": 'F', "value": 'PRESS'},
+ {"properties": [("data_path_primary", 'tool_settings.particle_edit.brush.size')]}),
+ ("wm.radial_control", {"type": 'F', "value": 'PRESS', "shift": True},
+ {"properties": [("data_path_primary", 'tool_settings.particle_edit.brush.strength')]}),
+ op_menu("VIEW3D_MT_particle_specials", {"type": 'W', "value": 'PRESS'}),
+ ("particle.weight_set", {"type": 'K', "value": 'PRESS', "shift": True}, None),
+ *_template_items_proportional_editing(connected=False),
+ ])
+
+ return keymap
+
+
+# Text edit mode.
+def km_font(params):
+ items = []
+ keymap = (
+ "Font",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("font.style_toggle", {"type": 'B', "value": 'PRESS', "ctrl": True},
+ {"properties": [("style", 'BOLD')]}),
+ ("font.style_toggle", {"type": 'I', "value": 'PRESS', "ctrl": True},
+ {"properties": [("style", 'ITALIC')]}),
+ ("font.style_toggle", {"type": 'U', "value": 'PRESS', "ctrl": True},
+ {"properties": [("style", 'UNDERLINE')]}),
+ ("font.style_toggle", {"type": 'P', "value": 'PRESS', "ctrl": True},
+ {"properties": [("style", 'SMALL_CAPS')]}),
+ ("font.delete", {"type": 'DEL', "value": 'PRESS'},
+ {"properties": [("type", 'NEXT_OR_SELECTION')]}),
+ ("font.delete", {"type": 'DEL', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'NEXT_WORD')]}),
+ ("font.delete", {"type": 'BACK_SPACE', "value": 'PRESS'},
+ {"properties": [("type", 'PREVIOUS_OR_SELECTION')]}),
+ ("font.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'PREVIOUS_OR_SELECTION')]}),
+ ("font.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'PREVIOUS_WORD')]}),
+ ("font.move", {"type": 'HOME', "value": 'PRESS'},
+ {"properties": [("type", 'LINE_BEGIN')]}),
+ ("font.move", {"type": 'END', "value": 'PRESS'},
+ {"properties": [("type", 'LINE_END')]}),
+ ("font.move", {"type": 'LEFT_ARROW', "value": 'PRESS'},
+ {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
+ ("font.move", {"type": 'RIGHT_ARROW', "value": 'PRESS'},
+ {"properties": [("type", 'NEXT_CHARACTER')]}),
+ ("font.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'PREVIOUS_WORD')]}),
+ ("font.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
+ {"properties": [("type", 'NEXT_WORD')]}),
+ ("font.move", {"type": 'UP_ARROW', "value": 'PRESS'},
+ {"properties": [("type", 'PREVIOUS_LINE')]}),
+ ("font.move", {"type": 'DOWN_ARROW', "value": 'PRESS'},
+ {"properties": [("type", 'NEXT_LINE')]}),
+ ("font.move", {"type": 'PAGE_UP', "value": 'PRESS'},
+ {"properties": [("type", 'PREVIOUS_PAGE')]}),
+ ("font.move", {"type": 'PAGE_DOWN', "value": 'PRESS'},
+ {"properties": [("type", 'NEXT_PAGE')]}),
+ ("font.move_select", {"type": 'HOME', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'LINE_BEGIN')]}),
+ ("font.move_select", {"type": 'END', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'LINE_END')]}),
+ ("font.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
+ ("font.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'NEXT_CHARACTER')]}),
+ ("font.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("type", 'PREVIOUS_WORD')]}),
+ ("font.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("type", 'NEXT_WORD')]}),
+ ("font.move_select", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'PREVIOUS_LINE')]}),
+ ("font.move_select", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'NEXT_LINE')]}),
+ ("font.move_select", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'PREVIOUS_PAGE')]}),
+ ("font.move_select", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True},
+ {"properties": [("type", 'NEXT_PAGE')]}),
+ ("font.change_spacing", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
+ {"properties": [("delta", -1)]}),
+ ("font.change_spacing", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
+ {"properties": [("delta", 1)]}),
+ ("font.change_character", {"type": 'UP_ARROW', "value": 'PRESS', "alt": True},
+ {"properties": [("delta", 1)]}),
+ ("font.change_character", {"type": 'DOWN_ARROW', "value": 'PRESS', "alt": True},
+ {"properties": [("delta", -1)]}),
+ ("font.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
+ ("font.text_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
+ ("font.text_cut", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
+ ("font.text_paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
+ ("font.line_break", {"type": 'RET', "value": 'PRESS'}, None),
+ ("font.text_insert", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
+ ("font.text_insert", {"type": 'BACK_SPACE', "value": 'PRESS', "alt": True},
+ {"properties": [("accent", True)]}),
+ ])
+
+ if params.apple:
+ items.extend([
+ ("font.select_all", {"type": 'A', "value": 'PRESS', "oskey": True}, None),
+ ("font.text_copy", {"type": 'C', "value": 'PRESS', "oskey": True}, None),
+ ("font.text_cut", {"type": 'X', "value": 'PRESS', "oskey": True}, None),
+ ("font.text_paste", {"type": 'V', "value": 'PRESS', "oskey": True}, None),
+ ])
+
+ return keymap
+
+
+def km_object_non_modal(params):
+ items = []
+ keymap = (
+ "Object Non-modal",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("object.mode_set", {"type": 'TAB', "value": 'PRESS'},
+ {"properties": [("mode", 'EDIT'), ("toggle", True)]}),
+ ("view3d.object_mode_pie_or_toggle", {"type": 'TAB', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ if params.legacy:
+ items.extend([
+ ("object.origin_set", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
+ ])
+
+ return keymap
+
+
+# ------------------------------------------------------------------------------
+# Modal Maps and Gizmos
+
+
+def km_eyedropper_modal_map(_params):
+ items = []
+ keymap = (
+ "Eyedropper Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'PRESS', "any": True}, None),
+ ("SAMPLE_CONFIRM", {"type": 'RET', "value": 'RELEASE', "any": True}, None),
+ ("SAMPLE_CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'RELEASE', "any": True}, None),
+ ("SAMPLE_CONFIRM", {"type": 'LEFTMOUSE', "value": 'RELEASE', "any": True}, None),
+ ("SAMPLE_BEGIN", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ("SAMPLE_RESET", {"type": 'SPACE', "value": 'RELEASE', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_eyedropper_colorband_pointsampling_map(_params):
+ items = []
+ keymap = (
+ "Eyedropper ColorBand PointSampling Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ("CANCEL", {"type": 'BACK_SPACE', "value": 'PRESS', "any": True}, None),
+ ("SAMPLE_CONFIRM", {"type": 'RIGHTMOUSE', "value": 'PRESS', "any": True}, None),
+ ("SAMPLE_CONFIRM", {"type": 'RET', "value": 'RELEASE', "any": True}, None),
+ ("SAMPLE_CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'RELEASE', "any": True}, None),
+ ("SAMPLE_SAMPLE", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ("SAMPLE_RESET", {"type": 'SPACE', "value": 'RELEASE', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_transform_modal_map(_params):
+ items = []
+ keymap = (
+ "Transform Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CONFIRM", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'RET', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "any": True}, None),
+ ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'PRESS', "any": True}, None),
+ ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ("AXIS_X", {"type": 'X', "value": 'PRESS'}, None),
+ ("AXIS_Y", {"type": 'Y', "value": 'PRESS'}, None),
+ ("AXIS_Z", {"type": 'Z', "value": 'PRESS'}, None),
+ ("PLANE_X", {"type": 'X', "value": 'PRESS', "shift": True}, None),
+ ("PLANE_Y", {"type": 'Y', "value": 'PRESS', "shift": True}, None),
+ ("PLANE_Z", {"type": 'Z', "value": 'PRESS', "shift": True}, None),
+ ("CONS_OFF", {"type": 'C', "value": 'PRESS'}, None),
+ ("TRANSLATE", {"type": 'G', "value": 'PRESS'}, None),
+ ("ROTATE", {"type": 'R', "value": 'PRESS'}, None),
+ ("RESIZE", {"type": 'S', "value": 'PRESS'}, None),
+ ("SNAP_TOGGLE", {"type": 'TAB', "value": 'PRESS', "shift": True}, None),
+ ("SNAP_INV_ON", {"type": 'LEFT_CTRL', "value": 'PRESS', "any": True}, None),
+ ("SNAP_INV_OFF", {"type": 'LEFT_CTRL', "value": 'RELEASE', "any": True}, None),
+ ("SNAP_INV_ON", {"type": 'RIGHT_CTRL', "value": 'PRESS', "any": True}, None),
+ ("SNAP_INV_OFF", {"type": 'RIGHT_CTRL', "value": 'RELEASE', "any": True}, None),
+ ("ADD_SNAP", {"type": 'A', "value": 'PRESS'}, None),
+ ("REMOVE_SNAP", {"type": 'A', "value": 'PRESS', "alt": True}, None),
+ ("PROPORTIONAL_SIZE_UP", {"type": 'PAGE_UP', "value": 'PRESS'}, None),
+ ("PROPORTIONAL_SIZE_DOWN", {"type": 'PAGE_DOWN', "value": 'PRESS'}, None),
+ ("PROPORTIONAL_SIZE_UP", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True}, None),
+ ("PROPORTIONAL_SIZE_DOWN", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True}, None),
+ ("PROPORTIONAL_SIZE_UP", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
+ ("PROPORTIONAL_SIZE_DOWN", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
+ ("PROPORTIONAL_SIZE_UP", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True}, None),
+ ("PROPORTIONAL_SIZE_DOWN", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True}, None),
+ ("PROPORTIONAL_SIZE", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
+ ("EDGESLIDE_EDGE_NEXT", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "alt": True}, None),
+ ("EDGESLIDE_PREV_NEXT", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "alt": True}, None),
+ ("AUTOIK_CHAIN_LEN_UP", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True}, None),
+ ("AUTOIK_CHAIN_LEN_DOWN", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True}, None),
+ ("AUTOIK_CHAIN_LEN_UP", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True}, None),
+ ("AUTOIK_CHAIN_LEN_DOWN", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True}, None),
+ ("INSERTOFS_TOGGLE_DIR", {"type": 'T', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+def km_backdrop_transform_widget_tweak_modal_map(_params):
+ keymap = (
+ "Backdrop Transform Widget Tweak Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": _template_items_gizmo_tweak_modal()},
+ )
+ return keymap
+
+
+def km_backdrop_crop_widget(_params):
+ keymap = (
+ "Backdrop Crop Widget",
+ {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
+ {"items": _template_items_gizmo_tweak_value()},
+ )
+ return keymap
+
+
+def km_backdrop_crop_widget_tweak_modal_map(_params):
+ keymap = (
+ "Backdrop Crop Widget Tweak Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": _template_items_gizmo_tweak_modal()},
+ )
+ return keymap
+
+
+def km_sun_beams_widget(_params):
+ keymap = (
+ "Sun Beams Widget",
+ {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
+ {"items": _template_items_gizmo_tweak_value()},
+ )
+ return keymap
+
+
+def km_sun_beams_widget_tweak_modal_map(_params):
+ keymap = (
+ "Sun Beams Widget Tweak Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": _template_items_gizmo_tweak_modal()},
+ )
+ return keymap
+
+
+def km_corner_pin_widget(_params):
+ items = []
+ keymap = (
+ "Corner Pin Widget",
+ {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_corner_pin_widget_tweak_modal_map(_params):
+ keymap = (
+ "Corner Pin Widget Tweak Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": _template_items_gizmo_tweak_modal()},
+ )
+ return keymap
+
+
+def km_uv_transform_gizmo(_params):
+ keymap = (
+ "UV Transform Gizmo",
+ {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
+ {"items": _template_items_gizmo_tweak_value()},
+ )
+ return keymap
+
+
+def km_uv_transform_gizmo_tweak_modal_map(_params):
+ keymap = (
+ "UV Transform Gizmo Tweak Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": _template_items_gizmo_tweak_modal()},
+ )
+ return keymap
+
+
+def km_spot_light_widgets(_params):
+ items = []
+ keymap = (
+ "Spot Light Widgets",
+ {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_spot_light_widgets_tweak_modal_map(_params):
+ keymap = (
+ "Spot Light Widgets Tweak Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": _template_items_gizmo_tweak_modal()},
+ )
+ return keymap
+
+
+def km_area_light_widgets(_params):
+ items = []
+ keymap = (
+ "Area Light Widgets",
+ {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_area_light_widgets_tweak_modal_map(_params):
+ keymap = (
+ "Area Light Widgets Tweak Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": _template_items_gizmo_tweak_modal()},
+ )
+ return keymap
+
+
+def km_target_light_widgets(_params):
+ items = []
+ keymap = (
+ "Target Light Widgets",
+ {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_target_light_widgets_tweak_modal_map(_params):
+ keymap = (
+ "Target Light Widgets Tweak Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": _template_items_gizmo_tweak_modal()},
+ )
+ return keymap
+
+
+def km_force_field_widgets(_params):
+ items = []
+ keymap = (
+ "Force Field Widgets",
+ {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_force_field_widgets_tweak_modal_map(_params):
+ keymap = (
+ "Force Field Widgets Tweak Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": _template_items_gizmo_tweak_modal()},
+ )
+ return keymap
+
+
+def km_camera_widgets(_params):
+ items = []
+ keymap = (
+ "Camera Widgets",
+ {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_camera_widgets_tweak_modal_map(_params):
+ keymap = (
+ "Camera Widgets Tweak Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": _template_items_gizmo_tweak_modal()},
+ )
+ return keymap
+
+
+def km_camera_view_widgets(_params):
+ items = []
+ keymap = (
+ "Camera View Widgets",
+ {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_camera_view_widgets_tweak_modal_map(_params):
+ keymap = (
+ "Camera View Widgets Tweak Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": _template_items_gizmo_tweak_modal()},
+ )
+ return keymap
+
+
+def km_armature_spline_widgets(_params):
+ items = []
+ keymap = (
+ "Armature Spline Widgets",
+ {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_armature_spline_widgets_tweak_modal_map(_params):
+ keymap = (
+ "Armature Spline Widgets Tweak Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": _template_items_gizmo_tweak_modal()},
+ )
+ return keymap
+
+
+def km_view3d_navigate(_params):
+ items = []
+ keymap = (
+ "View3D Navigate",
+ {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_view3d_navigate_tweak_modal_map(_params):
+ keymap = (
+ "View3D Navigate Tweak Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": _template_items_gizmo_tweak_modal()},
+ )
+ return keymap
+
+
+def km_view3d_gesture_circle(_params):
+ items = []
+ keymap = (
+ "View3D Gesture Circle",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ # Note: use 'KM_ANY' for release, so the circle exits on any mouse release,
+ # this is needed when circle select is activated as a tool.
+ ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'ANY', "any": True}, None),
+ ("CONFIRM", {"type": 'RET', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'PRESS'}, None),
+ ("SELECT", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("DESELECT", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, None),
+ ("NOP", {"type": 'LEFTMOUSE', "value": 'RELEASE', "any": True}, None),
+ ("DESELECT", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
+ ("NOP", {"type": 'MIDDLEMOUSE', "value": 'RELEASE', "any": True}, None),
+ ("SUBTRACT", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
+ ("SUBTRACT", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
+ ("ADD", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
+ ("ADD", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
+ ("SIZE", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
+ ])
+
+ return keymap
+
+
+def km_gesture_border(_params):
+ items = []
+ keymap = (
+ "Gesture Box",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'PRESS', "any": True}, None),
+ ("SELECT", {"type": 'RIGHTMOUSE', "value": 'RELEASE', "any": True}, None),
+ ("BEGIN", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, None),
+ ("DESELECT", {"type": 'LEFTMOUSE', "value": 'RELEASE', "shift": True}, None),
+ ("BEGIN", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("SELECT", {"type": 'LEFTMOUSE', "value": 'RELEASE', "any": True}, None),
+ ("BEGIN", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
+ ("DESELECT", {"type": 'MIDDLEMOUSE', "value": 'RELEASE'}, None),
+ ])
+
+ return keymap
+
+
+def km_gesture_zoom_border(_params):
+ items = []
+ keymap = (
+ "Gesture Zoom Border",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'ANY', "any": True}, None),
+ ("BEGIN", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("IN", {"type": 'LEFTMOUSE', "value": 'RELEASE'}, None),
+ ("BEGIN", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
+ ("OUT", {"type": 'MIDDLEMOUSE', "value": 'RELEASE'}, None),
+ ])
+
+ return keymap
+
+
+def km_gesture_straight_line(_params):
+ items = []
+ keymap = (
+ "Gesture Straight Line",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'ANY', "any": True}, None),
+ ("BEGIN", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("SELECT", {"type": 'LEFTMOUSE', "value": 'RELEASE', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_standard_modal_map(_params):
+ items = []
+ keymap = (
+ "Standard Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ("APPLY", {"type": 'LEFTMOUSE', "value": 'ANY', "any": True}, None),
+ ("APPLY", {"type": 'RET', "value": 'PRESS', "any": True}, None),
+ ("APPLY", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "any": True}, None),
+ ("SNAP", {"type": 'LEFT_CTRL', "value": 'PRESS', "any": True}, None),
+ ("SNAP_OFF", {"type": 'LEFT_CTRL', "value": 'RELEASE', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_knife_tool_modal_map(_params):
+ items = []
+ keymap = (
+ "Knife Tool Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ("PANNING", {"type": 'MIDDLEMOUSE', "value": 'ANY', "any": True}, None),
+ ("CANCEL", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "any": True}, None),
+ ("ADD_CUT", {"type": 'LEFTMOUSE', "value": 'ANY', "any": True}, None),
+ ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'RET', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'SPACE', "value": 'PRESS', "any": True}, None),
+ ("NEW_CUT", {"type": 'E', "value": 'PRESS'}, None),
+ ("SNAP_MIDPOINTS_ON", {"type": 'LEFT_CTRL', "value": 'PRESS', "any": True}, None),
+ ("SNAP_MIDPOINTS_OFF", {"type": 'LEFT_CTRL', "value": 'RELEASE', "any": True}, None),
+ ("SNAP_MIDPOINTS_ON", {"type": 'RIGHT_CTRL', "value": 'PRESS', "any": True}, None),
+ ("SNAP_MIDPOINTS_OFF", {"type": 'RIGHT_CTRL', "value": 'RELEASE', "any": True}, None),
+ ("IGNORE_SNAP_ON", {"type": 'LEFT_SHIFT', "value": 'PRESS', "any": True}, None),
+ ("IGNORE_SNAP_OFF", {"type": 'LEFT_SHIFT', "value": 'RELEASE', "any": True}, None),
+ ("IGNORE_SNAP_ON", {"type": 'RIGHT_SHIFT', "value": 'PRESS', "any": True}, None),
+ ("IGNORE_SNAP_OFF", {"type": 'RIGHT_SHIFT', "value": 'RELEASE', "any": True}, None),
+ ("ANGLE_SNAP_TOGGLE", {"type": 'C', "value": 'PRESS'}, None),
+ ("CUT_THROUGH_TOGGLE", {"type": 'Z', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+def km_custom_normals_modal_map(_params):
+ items = []
+ keymap = (
+ "Custom Normals Modal Map",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
+ ("CONFIRM", {"type": 'RET', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("RESET", {"type": 'R', "value": 'PRESS'}, None),
+ ("INVERT", {"type": 'I', "value": 'PRESS'}, None),
+ ("SPHERIZE", {"type": 'S', "value": 'PRESS'}, None),
+ ("ALIGN", {"type": 'A', "value": 'PRESS'}, None),
+ ("USE_MOUSE", {"type": 'M', "value": 'PRESS'}, None),
+ ("USE_PIVOT", {"type": 'L', "value": 'PRESS'}, None),
+ ("USE_OBJECT", {"type": 'O', "value": 'PRESS'}, None),
+ ("SET_USE_3DCURSOR", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True}, None),
+ ("SET_USE_SELECTED", {"type": 'RIGHTMOUSE', "value": 'CLICK', "ctrl": True}, None),
+ ])
+
+ return keymap
+
+
+def km_view3d_fly_modal(_params):
+ items = []
+ keymap = (
+ "View3D Fly Modal",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'ANY', "any": True}, None),
+ ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'LEFTMOUSE', "value": 'ANY', "any": True}, None),
+ ("CONFIRM", {"type": 'RET', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'SPACE', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "any": True}, None),
+ ("ACCELERATE", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "any": True}, None),
+ ("DECELERATE", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "any": True}, None),
+ ("ACCELERATE", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "any": True}, None),
+ ("DECELERATE", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
+ ("PAN_ENABLE", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "any": True}, None),
+ ("PAN_DISABLE", {"type": 'MIDDLEMOUSE', "value": 'RELEASE', "any": True}, None),
+ ("FORWARD", {"type": 'W', "value": 'PRESS'}, None),
+ ("BACKWARD", {"type": 'S', "value": 'PRESS'}, None),
+ ("LEFT", {"type": 'A', "value": 'PRESS'}, None),
+ ("RIGHT", {"type": 'D', "value": 'PRESS'}, None),
+ ("UP", {"type": 'E', "value": 'PRESS'}, None),
+ ("DOWN", {"type": 'Q', "value": 'PRESS'}, None),
+ ("UP", {"type": 'R', "value": 'PRESS'}, None),
+ ("DOWN", {"type": 'F', "value": 'PRESS'}, None),
+ ("FORWARD", {"type": 'UP_ARROW', "value": 'PRESS'}, None),
+ ("BACKWARD", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None),
+ ("LEFT", {"type": 'LEFT_ARROW', "value": 'PRESS'}, None),
+ ("RIGHT", {"type": 'RIGHT_ARROW', "value": 'PRESS'}, None),
+ ("AXIS_LOCK_X", {"type": 'X', "value": 'PRESS'}, None),
+ ("AXIS_LOCK_Z", {"type": 'Z', "value": 'PRESS'}, None),
+ ("PRECISION_ENABLE", {"type": 'LEFT_ALT', "value": 'PRESS', "any": True}, None),
+ ("PRECISION_DISABLE", {"type": 'LEFT_ALT', "value": 'RELEASE', "any": True}, None),
+ ("PRECISION_ENABLE", {"type": 'LEFT_SHIFT', "value": 'PRESS', "any": True}, None),
+ ("PRECISION_DISABLE", {"type": 'LEFT_SHIFT', "value": 'RELEASE', "any": True}, None),
+ ("FREELOOK_ENABLE", {"type": 'LEFT_CTRL', "value": 'PRESS', "any": True}, None),
+ ("FREELOOK_DISABLE", {"type": 'LEFT_CTRL', "value": 'RELEASE', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_view3d_walk_modal(_params):
+ items = []
+ keymap = (
+ "View3D Walk Modal",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'ANY', "any": True}, None),
+ ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'LEFTMOUSE', "value": 'ANY', "any": True}, None),
+ ("CONFIRM", {"type": 'RET', "value": 'PRESS', "any": True}, None),
+ ("CONFIRM", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "any": True}, None),
+ ("FAST_ENABLE", {"type": 'LEFT_SHIFT', "value": 'PRESS', "any": True}, None),
+ ("FAST_DISABLE", {"type": 'LEFT_SHIFT', "value": 'RELEASE', "any": True}, None),
+ ("SLOW_ENABLE", {"type": 'LEFT_ALT', "value": 'PRESS', "any": True}, None),
+ ("SLOW_DISABLE", {"type": 'LEFT_ALT', "value": 'RELEASE', "any": True}, None),
+ ("FORWARD", {"type": 'W', "value": 'PRESS', "any": True}, None),
+ ("BACKWARD", {"type": 'S', "value": 'PRESS', "any": True}, None),
+ ("LEFT", {"type": 'A', "value": 'PRESS', "any": True}, None),
+ ("RIGHT", {"type": 'D', "value": 'PRESS', "any": True}, None),
+ ("UP", {"type": 'E', "value": 'PRESS', "any": True}, None),
+ ("DOWN", {"type": 'Q', "value": 'PRESS', "any": True}, None),
+ ("FORWARD_STOP", {"type": 'W', "value": 'RELEASE', "any": True}, None),
+ ("BACKWARD_STOP", {"type": 'S', "value": 'RELEASE', "any": True}, None),
+ ("LEFT_STOP", {"type": 'A', "value": 'RELEASE', "any": True}, None),
+ ("RIGHT_STOP", {"type": 'D', "value": 'RELEASE', "any": True}, None),
+ ("UP_STOP", {"type": 'E', "value": 'RELEASE', "any": True}, None),
+ ("DOWN_STOP", {"type": 'Q', "value": 'RELEASE', "any": True}, None),
+ ("FORWARD", {"type": 'UP_ARROW', "value": 'PRESS'}, None),
+ ("BACKWARD", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None),
+ ("LEFT", {"type": 'LEFT_ARROW', "value": 'PRESS'}, None),
+ ("RIGHT", {"type": 'RIGHT_ARROW', "value": 'PRESS'}, None),
+ ("FORWARD_STOP", {"type": 'UP_ARROW', "value": 'RELEASE', "any": True}, None),
+ ("BACKWARD_STOP", {"type": 'DOWN_ARROW', "value": 'RELEASE', "any": True}, None),
+ ("LEFT_STOP", {"type": 'LEFT_ARROW', "value": 'RELEASE', "any": True}, None),
+ ("RIGHT_STOP", {"type": 'RIGHT_ARROW', "value": 'RELEASE', "any": True}, None),
+ ("GRAVITY_TOGGLE", {"type": 'TAB', "value": 'PRESS'}, None),
+ ("GRAVITY_TOGGLE", {"type": 'G', "value": 'PRESS'}, None),
+ ("JUMP", {"type": 'V', "value": 'PRESS', "any": True}, None),
+ ("JUMP_STOP", {"type": 'V', "value": 'RELEASE', "any": True}, None),
+ ("TELEPORT", {"type": 'SPACE', "value": 'PRESS', "any": True}, None),
+ ("TELEPORT", {"type": 'MIDDLEMOUSE', "value": 'ANY', "any": True}, None),
+ ("ACCELERATE", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "any": True}, None),
+ ("DECELERATE", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "any": True}, None),
+ ("ACCELERATE", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "any": True}, None),
+ ("DECELERATE", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_view3d_rotate_modal(_params):
+ items = []
+ keymap = (
+ "View3D Rotate Modal",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CONFIRM", {"type": 'MIDDLEMOUSE', "value": 'RELEASE', "any": True}, None),
+ ("CONFIRM", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ("AXIS_SNAP_ENABLE", {"type": 'LEFT_ALT', "value": 'PRESS', "any": True}, None),
+ ("AXIS_SNAP_DISABLE", {"type": 'LEFT_ALT', "value": 'RELEASE', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_view3d_move_modal(_params):
+ items = []
+ keymap = (
+ "View3D Move Modal",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CONFIRM", {"type": 'MIDDLEMOUSE', "value": 'RELEASE', "any": True}, None),
+ ("CONFIRM", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_view3d_zoom_modal(_params):
+ items = []
+ keymap = (
+ "View3D Zoom Modal",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CONFIRM", {"type": 'MIDDLEMOUSE', "value": 'RELEASE', "any": True}, None),
+ ("CONFIRM", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_view3d_dolly_modal(_params):
+ items = []
+ keymap = (
+ "View3D Dolly Modal",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CONFIRM", {"type": 'MIDDLEMOUSE', "value": 'RELEASE', "any": True}, None),
+ ("CONFIRM", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_paint_stroke_modal(_params):
+ items = []
+ keymap = (
+ "Paint Stroke Modal",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+ {"items": items},
+ )
+
+ items.extend([
+ ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+ ])
+
+ return keymap
+
+
+def km_gizmos(_params):
+ items = []
+ keymap = (
+ "Gizmos",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ return keymap
+
+
+def km_backdrop_transform_widget(_params):
+ items = []
+ keymap = (
+ "Backdrop Transform Widget",
+ {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
+ ])
+
+ return keymap
+
+
+# ------------------------------------------------------------------------------
+# Full Configuration
+
+def generate_keymaps(params=None):
+ if params is None:
+ params = KeymapParams()
+ return [
+ # Window, screen, area, region.
+ km_window(params),
+ km_screen(params),
+ km_screen_editing(params),
+ km_header(params),
+ km_view2d(params),
+ km_view2d_buttons_list(params),
+ km_user_interface(params),
+ km_property_editor(params),
+
+ # Editors.
+ km_outliner(params),
+ km_uv_editor(params),
+ km_uv_sculpt(params),
+ km_view3d_generic(params),
+ km_view3d(params),
+ km_mask_editing(params),
+ km_markers(params),
+ km_graph_editor_generic(params),
+ km_graph_editor(params),
+ km_image_generic(params),
+ km_image(params),
+ km_node_generic(params),
+ km_node_editor(params),
+ km_info(params),
+ km_file_browser(params),
+ km_file_browser_main(params),
+ km_file_browser_buttons(params),
+ km_dopesheet_generic(params),
+ km_dopesheet(params),
+ km_nla_generic(params),
+ km_nla_channels(params),
+ km_nla_editor(params),
+ km_text_generic(params),
+ km_text(params),
+ km_sequencercommon(params),
+ km_sequencer(params),
+ km_sequencerpreview(params),
+ km_console(params),
+ km_clip(params),
+ km_clip_editor(params),
+ km_clip_graph_editor(params),
+ km_clip_dopesheet_editor(params),
+
+ # Animation.
+ km_frames(params),
+ km_animation(params),
+ km_animation_channels(params),
+
+ # Modes.
+ km_grease_pencil(params),
+ km_grease_pencil_stroke_edit_mode(params),
+ km_grease_pencil_stroke_paint_mode(params),
+ km_grease_pencil_stroke_paint_draw_brush(params),
+ km_grease_pencil_stroke_paint_erase(params),
+ km_grease_pencil_stroke_paint_fill(params),
+ km_grease_pencil_stroke_sculpt_mode(params),
+ km_grease_pencil_stroke_weight_mode(params),
+ km_face_mask(params),
+ km_weight_paint_vertex_selection(params),
+ km_pose(params),
+ km_object_mode(params),
+ km_paint_curve(params),
+ km_curve(params),
+ km_image_paint(params),
+ km_vertex_paint(params),
+ km_weight_paint(params),
+ km_sculpt(params),
+ km_mesh(params),
+ km_armature(params),
+ km_metaball(params),
+ km_lattice(params),
+ km_particle(params),
+ km_font(params),
+ km_object_non_modal(params),
+
+ # Modal maps.
+ km_eyedropper_modal_map(params),
+ km_eyedropper_colorband_pointsampling_map(params),
+ km_transform_modal_map(params),
+ km_view3d_navigate(params),
+ km_view3d_navigate_tweak_modal_map(params),
+ km_view3d_gesture_circle(params),
+ km_gesture_border(params),
+ km_gesture_zoom_border(params),
+ km_gesture_straight_line(params),
+ km_standard_modal_map(params),
+ km_knife_tool_modal_map(params),
+ km_custom_normals_modal_map(params),
+ km_view3d_fly_modal(params),
+ km_view3d_walk_modal(params),
+ km_view3d_rotate_modal(params),
+ km_view3d_move_modal(params),
+ km_view3d_zoom_modal(params),
+ km_view3d_dolly_modal(params),
+ km_paint_stroke_modal(params),
+
+ # Gizmos.
+ km_gizmos(params),
+ km_backdrop_transform_widget_tweak_modal_map(params),
+ km_backdrop_crop_widget(params),
+ km_backdrop_crop_widget_tweak_modal_map(params),
+ km_sun_beams_widget(params),
+ km_sun_beams_widget_tweak_modal_map(params),
+ km_corner_pin_widget(params),
+ km_corner_pin_widget_tweak_modal_map(params),
+ km_uv_transform_gizmo(params),
+ km_uv_transform_gizmo_tweak_modal_map(params),
+ km_spot_light_widgets(params),
+ km_spot_light_widgets_tweak_modal_map(params),
+ km_area_light_widgets(params),
+ km_area_light_widgets_tweak_modal_map(params),
+ km_target_light_widgets(params),
+ km_target_light_widgets_tweak_modal_map(params),
+ km_force_field_widgets(params),
+ km_force_field_widgets_tweak_modal_map(params),
+ km_camera_widgets(params),
+ km_camera_widgets_tweak_modal_map(params),
+ km_camera_view_widgets(params),
+ km_camera_view_widgets_tweak_modal_map(params),
+ km_armature_spline_widgets(params),
+ km_armature_spline_widgets_tweak_modal_map(params),
+ km_backdrop_transform_widget(params),
+ ]
+
+# ------------------------------------------------------------------------------
+# Refactoring (Testing Only)
+#
+# Allows running outside of Blender to generate data for diffing
+#
+# To compare:
+#
+# python3 release/scripts/presets/keyconfig/keymap_data/blender_default.py && \
+# diff -u keymap_default.py.orig keymap_default.py && \
+# diff -u keymap_legacy.py.orig keymap_legacy.py
+#
+# # begin code:
+# import pprint
+# for legacy in (False, True):
+# with open("keymap_default.py" if not legacy else "keymap_legacy.py", 'w') as fh:
+# fh.write(pprint.pformat(generate_keymaps(KeymapParams(legacy=legacy)), indent=2, width=80))
+# import sys
+# sys.exit()
+# # end code
+
+
+# ------------------------------------------------------------------------------
+# PyLint (Testing Only)
+#
+# Command to lint:
+#
+# pylint release/scripts/presets/keyconfig/keymap_data/blender_default.py --disable=C0111,C0301,C0302,R0903,R0913
+
+
+if __name__ == "__main__":
+ from bpy_extras.keyconfig_utils import keyconfig_import_from_data
+ keyconfig_import_from_data("Blender", generate_keymaps())
+ keyconfig_import_from_data("Blender 27X", generate_keymaps(KeymapParams(legacy=True)))
diff --git a/release/scripts/presets/keyconfig/maya.py b/release/scripts/presets/keyconfig/maya.py
index 676ccb8bec3..60e58d6324a 100644
--- a/release/scripts/presets/keyconfig/maya.py
+++ b/release/scripts/presets/keyconfig/maya.py
@@ -194,9 +194,9 @@ kmi.properties.camera = True
kmi = km.keymap_items.new('marker.select', 'SELECTMOUSE', 'PRESS', shift=True, ctrl=True)
kmi.properties.extend = True
kmi.properties.camera = True
-kmi = km.keymap_items.new('marker.select_border', 'EVT_TWEAK_S', 'ANY')
+kmi = km.keymap_items.new('marker.select_box', 'EVT_TWEAK_S', 'ANY')
kmi.properties.extend = False
-kmi = km.keymap_items.new('marker.select_border', 'EVT_TWEAK_S', 'ANY', any=True)
+kmi = km.keymap_items.new('marker.select_box', 'EVT_TWEAK_S', 'ANY', any=True)
kmi = km.keymap_items.new('marker.select_all', 'A', 'PRESS', ctrl=True)
kmi = km.keymap_items.new('marker.delete', 'BACK_SPACE', 'PRESS')
kmi = km.keymap_items.new('marker.rename', 'M', 'PRESS', ctrl=True)
@@ -227,7 +227,7 @@ kmi = km.keymap_items.new('outliner.item_activate', 'LEFTMOUSE', 'CLICK')
kmi.properties.extend = False
kmi = km.keymap_items.new('outliner.item_activate', 'LEFTMOUSE', 'CLICK', shift=True)
kmi.properties.extend = True
-kmi = km.keymap_items.new('outliner.select_border', 'EVT_TWEAK_S', 'ANY', any=True)
+kmi = km.keymap_items.new('outliner.select_box', 'EVT_TWEAK_S', 'ANY', any=True)
kmi = km.keymap_items.new('outliner.item_openclose', 'RET', 'PRESS')
kmi.properties.all = False
kmi = km.keymap_items.new('outliner.item_openclose', 'RET', 'PRESS', shift=True)
@@ -1049,9 +1049,9 @@ kmi.properties.enumerate = True
kmi.properties.toggle = False
kmi.properties.deselect = False
kmi.properties.object = False
-kmi = km.keymap_items.new('view3d.select_border', 'EVT_TWEAK_S', 'ANY')
+kmi = km.keymap_items.new('view3d.select_box', 'EVT_TWEAK_S', 'ANY')
kmi.properties.extend = False
-kmi = km.keymap_items.new('view3d.select_border', 'EVT_TWEAK_S', 'ANY', any=True)
+kmi = km.keymap_items.new('view3d.select_box', 'EVT_TWEAK_S', 'ANY', any=True)
kmi = km.keymap_items.new('view3d.select_lasso', 'EVT_TWEAK_M', 'ANY')
kmi.properties.extend = False
kmi = km.keymap_items.new('view3d.select_lasso', 'EVT_TWEAK_M', 'ANY', ctrl=True)
@@ -1104,9 +1104,9 @@ kmi = km.keymap_items.new('anim.channels_rename', 'LEFTMOUSE', 'PRESS', ctrl=Tru
kmi = km.keymap_items.new('anim.channels_select_all_toggle', 'A', 'PRESS', ctrl=True)
kmi = km.keymap_items.new('anim.channels_select_all_toggle', 'I', 'PRESS', ctrl=True)
kmi.properties.invert = True
-kmi = km.keymap_items.new('anim.channels_select_border', 'EVT_TWEAK_S', 'ANY')
+kmi = km.keymap_items.new('anim.channels_select_box', 'EVT_TWEAK_S', 'ANY')
kmi.properties.extend = False
-kmi = km.keymap_items.new('anim.channels_select_border', 'EVT_TWEAK_S', 'ANY', any=True)
+kmi = km.keymap_items.new('anim.channels_select_box', 'EVT_TWEAK_S', 'ANY', any=True)
kmi = km.keymap_items.new('anim.channels_delete', 'BACK_SPACE', 'PRESS')
kmi = km.keymap_items.new('anim.channels_delete', 'DEL', 'PRESS')
kmi = km.keymap_items.new('anim.channels_setting_toggle', 'W', 'PRESS', shift=True)
@@ -1142,10 +1142,10 @@ kmi = km.keymap_items.new('uv.select_loop', 'LEFTMOUSE', 'PRESS', ctrl=True, alt
kmi.properties.extend = False
kmi = km.keymap_items.new('uv.select_loop', 'LEFTMOUSE', 'PRESS', shift=True, ctrl=True, alt=True)
kmi.properties.extend = True
-kmi = km.keymap_items.new('uv.select_border', 'EVT_TWEAK_S', 'ANY')
+kmi = km.keymap_items.new('uv.select_box', 'EVT_TWEAK_S', 'ANY')
kmi.properties.extend = False
kmi.properties.pinned = False
-kmi = km.keymap_items.new('uv.select_border', 'EVT_TWEAK_S', 'ANY', any=True)
+kmi = km.keymap_items.new('uv.select_box', 'EVT_TWEAK_S', 'ANY', any=True)
kmi.properties.pinned = False
kmi = km.keymap_items.new('uv.circle_select', 'Q', 'PRESS', shift=True)
kmi = km.keymap_items.new('uv.select_linked', 'L', 'PRESS', ctrl=True)
@@ -1239,8 +1239,8 @@ kmi = km.keymap_items.new_modal('ADD', 'WHEELDOWNMOUSE', 'PRESS')
kmi = km.keymap_items.new_modal('ADD', 'NUMPAD_PLUS', 'PRESS')
kmi = km.keymap_items.new_modal('SIZE', 'TRACKPADPAN', 'ANY')
-# Map Gesture Border
-km = kc.keymaps.new('Gesture Border', space_type='EMPTY', region_type='WINDOW', modal=True)
+# Map Gesture Box
+km = kc.keymaps.new('Gesture Box', space_type='EMPTY', region_type='WINDOW', modal=True)
kmi = km.keymap_items.new_modal('CANCEL', 'ESC', 'PRESS', any=True)
kmi = km.keymap_items.new_modal('CANCEL', 'RIGHTMOUSE', 'PRESS', any=True)
@@ -1338,11 +1338,11 @@ kmi = km.keymap_items.new('graph.select_all_toggle', 'A', 'PRESS', ctrl=True)
kmi.properties.invert = False
kmi = km.keymap_items.new('graph.select_all_toggle', 'I', 'PRESS', ctrl=True)
kmi.properties.invert = True
-kmi = km.keymap_items.new('graph.select_border', 'EVT_TWEAK_S', 'ANY')
+kmi = km.keymap_items.new('graph.select_box', 'EVT_TWEAK_S', 'ANY')
kmi.properties.extend = False
kmi.properties.axis_range = False
kmi.properties.include_handles = False
-kmi = km.keymap_items.new('graph.select_border', 'EVT_TWEAK_S', 'ANY', any=True)
+kmi = km.keymap_items.new('graph.select_box', 'EVT_TWEAK_S', 'ANY', any=True)
kmi.properties.axis_range = False
kmi.properties.include_handles = False
kmi = km.keymap_items.new('graph.select_more', 'PERIOD', 'PRESS', shift=True)
@@ -1442,10 +1442,10 @@ kmi = km.keymap_items.new('node.select', 'SELECTMOUSE', 'PRESS')
kmi.properties.extend = False
kmi = km.keymap_items.new('node.select', 'SELECTMOUSE', 'PRESS', shift=True)
kmi.properties.extend = True
-kmi = km.keymap_items.new('node.select_border', 'EVT_TWEAK_S', 'ANY')
+kmi = km.keymap_items.new('node.select_box', 'EVT_TWEAK_S', 'ANY')
kmi.properties.extend = False
kmi.properties.tweak = True
-kmi = km.keymap_items.new('node.select_border', 'EVT_TWEAK_S', 'ANY', any=True)
+kmi = km.keymap_items.new('node.select_box', 'EVT_TWEAK_S', 'ANY', any=True)
kmi.properties.tweak = True
kmi = km.keymap_items.new('node.link', 'LEFTMOUSE', 'PRESS')
kmi = km.keymap_items.new('node.resize', 'LEFTMOUSE', 'PRESS')
@@ -1510,9 +1510,9 @@ kmi.properties.extend = True
kmi.properties.fill = True
kmi = km.keymap_items.new('file.select_all_toggle', 'A', 'PRESS', ctrl=True)
kmi = km.keymap_items.new('file.refresh', 'F', 'PRESS')
-kmi = km.keymap_items.new('file.select_border', 'EVT_TWEAK_S', 'ANY')
+kmi = km.keymap_items.new('file.select_box', 'EVT_TWEAK_S', 'ANY')
kmi.properties.extend = False
-kmi = km.keymap_items.new('file.select_border', 'EVT_TWEAK_S', 'ANY', any=True)
+kmi = km.keymap_items.new('file.select_box', 'EVT_TWEAK_S', 'ANY', any=True)
kmi = km.keymap_items.new('file.rename', 'LEFTMOUSE', 'PRESS', ctrl=True)
kmi = km.keymap_items.new('file.highlight', 'MOUSEMOVE', 'ANY', any=True)
kmi = km.keymap_items.new('file.filenum', 'NUMPAD_PLUS', 'PRESS')
@@ -1553,10 +1553,10 @@ kmi = km.keymap_items.new('action.select_all_toggle', 'A', 'PRESS', ctrl=True)
kmi.properties.invert = False
kmi = km.keymap_items.new('action.select_all_toggle', 'I', 'PRESS', ctrl=True)
kmi.properties.invert = True
-kmi = km.keymap_items.new('action.select_border', 'EVT_TWEAK_S', 'ANY')
+kmi = km.keymap_items.new('action.select_box', 'EVT_TWEAK_S', 'ANY')
kmi.properties.extend = False
kmi.properties.axis_range = False
-kmi = km.keymap_items.new('action.select_border', 'EVT_TWEAK_S', 'ANY', any=True)
+kmi = km.keymap_items.new('action.select_box', 'EVT_TWEAK_S', 'ANY', any=True)
kmi.properties.axis_range = False
kmi = km.keymap_items.new('action.select_more', 'PERIOD', 'PRESS', shift=True)
kmi = km.keymap_items.new('action.select_less', 'COMMA', 'PRESS', shift=True)
@@ -1628,10 +1628,10 @@ kmi = km.keymap_items.new('nla.select_all_toggle', 'A', 'PRESS', ctrl=True)
kmi.properties.invert = False
kmi = km.keymap_items.new('nla.select_all_toggle', 'I', 'PRESS', ctrl=True)
kmi.properties.invert = True
-kmi = km.keymap_items.new('nla.select_border', 'EVT_TWEAK_S', 'ANY')
+kmi = km.keymap_items.new('nla.select_box', 'EVT_TWEAK_S', 'ANY')
kmi.properties.extend = False
kmi.properties.axis_range = False
-kmi = km.keymap_items.new('nla.select_border', 'EVT_TWEAK_S', 'ANY', any=True)
+kmi = km.keymap_items.new('nla.select_box', 'EVT_TWEAK_S', 'ANY', any=True)
kmi.properties.axis_range = False
kmi = km.keymap_items.new('nla.view_all', 'A', 'PRESS')
kmi = km.keymap_items.new('nla.view_selected', 'F', 'PRESS')
@@ -1767,9 +1767,9 @@ kmi.properties.extend = False
kmi = km.keymap_items.new('sequencer.select_linked_pick', 'L', 'PRESS', shift=True)
kmi.properties.extend = True
kmi = km.keymap_items.new('sequencer.select_linked', 'L', 'PRESS', ctrl=True)
-kmi = km.keymap_items.new('sequencer.select_border', 'EVT_TWEAK_S', 'ANY')
+kmi = km.keymap_items.new('sequencer.select_box', 'EVT_TWEAK_S', 'ANY')
kmi.properties.extend = False
-kmi = km.keymap_items.new('sequencer.select_border', 'EVT_TWEAK_S', 'ANY', any=True)
+kmi = km.keymap_items.new('sequencer.select_box', 'EVT_TWEAK_S', 'ANY', any=True)
kmi = km.keymap_items.new('sequencer.select_grouped', 'G', 'PRESS', shift=True)
kmi = km.keymap_items.new('wm.call_menu', 'A', 'PRESS', shift=True)
kmi.properties.name = 'SEQUENCER_MT_add'
@@ -1831,9 +1831,9 @@ kmi = km.keymap_items.new('clip.select_all', 'A', 'PRESS', ctrl=True)
kmi.properties.action = 'TOGGLE'
kmi = km.keymap_items.new('clip.select_all', 'I', 'PRESS', ctrl=True)
kmi.properties.action = 'INVERT'
-kmi = km.keymap_items.new('clip.select_border', 'EVT_TWEAK_S', 'ANY')
+kmi = km.keymap_items.new('clip.select_box', 'EVT_TWEAK_S', 'ANY')
kmi.properties.extend = False
-kmi = km.keymap_items.new('clip.select_border', 'EVT_TWEAK_S', 'ANY', any=True)
+kmi = km.keymap_items.new('clip.select_box', 'EVT_TWEAK_S', 'ANY', any=True)
kmi = km.keymap_items.new('clip.select_circle', 'Q', 'PRESS', shift=True)
kmi = km.keymap_items.new('wm.call_menu', 'G', 'PRESS', shift=True)
kmi.properties.name = 'CLIP_MT_select_grouped'
@@ -1890,9 +1890,9 @@ kmi = km.keymap_items.new('clip.graph_select_all_markers', 'A', 'PRESS')
kmi.properties.action = 'TOGGLE'
kmi = km.keymap_items.new('clip.graph_select_all_markers', 'I', 'PRESS', ctrl=True)
kmi.properties.action = 'INVERT'
-kmi = km.keymap_items.new('clip.graph_select_border', 'EVT_TWEAK_S', 'ANY')
+kmi = km.keymap_items.new('clip.graph_select_box', 'EVT_TWEAK_S', 'ANY')
kmi.properties.extend = False
-kmi = km.keymap_items.new('clip.graph_select_border', 'EVT_TWEAK_S', 'ANY', any=True)
+kmi = km.keymap_items.new('clip.graph_select_box', 'EVT_TWEAK_S', 'ANY', any=True)
kmi = km.keymap_items.new('clip.graph_delete_curve', 'DEL', 'PRESS')
kmi = km.keymap_items.new('clip.graph_delete_curve', 'BACK_SPACE', 'PRESS')
kmi = km.keymap_items.new('clip.graph_delete_knot', 'DEL', 'PRESS', shift=True)
diff --git a/release/scripts/presets/units_length/centimeters.py b/release/scripts/presets/units_length/centimeters.py
deleted file mode 100644
index 80d5c3e8890..00000000000
--- a/release/scripts/presets/units_length/centimeters.py
+++ /dev/null
@@ -1,5 +0,0 @@
-import bpy
-scene = bpy.context.scene
-
-scene.unit_settings.system = 'METRIC'
-scene.unit_settings.scale_length = 0.01
diff --git a/release/scripts/presets/units_length/feet.py b/release/scripts/presets/units_length/feet.py
deleted file mode 100644
index 015cb810c4d..00000000000
--- a/release/scripts/presets/units_length/feet.py
+++ /dev/null
@@ -1,5 +0,0 @@
-import bpy
-scene = bpy.context.scene
-
-scene.unit_settings.system = 'IMPERIAL'
-scene.unit_settings.scale_length = 0.3048
diff --git a/release/scripts/presets/units_length/inches.py b/release/scripts/presets/units_length/inches.py
deleted file mode 100644
index 7bdc96329ec..00000000000
--- a/release/scripts/presets/units_length/inches.py
+++ /dev/null
@@ -1,5 +0,0 @@
-import bpy
-scene = bpy.context.scene
-
-scene.unit_settings.system = 'IMPERIAL'
-scene.unit_settings.scale_length = 0.0254
diff --git a/release/scripts/presets/units_length/kilometers.py b/release/scripts/presets/units_length/kilometers.py
deleted file mode 100644
index d2a80e56aaa..00000000000
--- a/release/scripts/presets/units_length/kilometers.py
+++ /dev/null
@@ -1,5 +0,0 @@
-import bpy
-scene = bpy.context.scene
-
-scene.unit_settings.system = 'METRIC'
-scene.unit_settings.scale_length = 1000.0
diff --git a/release/scripts/presets/units_length/meters.py b/release/scripts/presets/units_length/meters.py
deleted file mode 100644
index 831f1f26071..00000000000
--- a/release/scripts/presets/units_length/meters.py
+++ /dev/null
@@ -1,5 +0,0 @@
-import bpy
-scene = bpy.context.scene
-
-scene.unit_settings.system = 'METRIC'
-scene.unit_settings.scale_length = 1.0
diff --git a/release/scripts/presets/units_length/miles.py b/release/scripts/presets/units_length/miles.py
deleted file mode 100644
index 59c1e2b36a9..00000000000
--- a/release/scripts/presets/units_length/miles.py
+++ /dev/null
@@ -1,5 +0,0 @@
-import bpy
-scene = bpy.context.scene
-
-scene.unit_settings.system = 'IMPERIAL'
-scene.unit_settings.scale_length = 1609.344
diff --git a/release/scripts/presets/units_length/millimeters.py b/release/scripts/presets/units_length/millimeters.py
deleted file mode 100644
index b89918f8b1b..00000000000
--- a/release/scripts/presets/units_length/millimeters.py
+++ /dev/null
@@ -1,5 +0,0 @@
-import bpy
-scene = bpy.context.scene
-
-scene.unit_settings.system = 'METRIC'
-scene.unit_settings.scale_length = 0.001
diff --git a/release/scripts/startup/bl_app_templates_system/2D_Animation/startup.blend b/release/scripts/startup/bl_app_templates_system/2D_Animation/startup.blend
new file mode 100644
index 00000000000..7d2668a7d53
--- /dev/null
+++ b/release/scripts/startup/bl_app_templates_system/2D_Animation/startup.blend
Binary files differ
diff --git a/release/scripts/startup/bl_app_templates_system/Sculpting/__init__.py b/release/scripts/startup/bl_app_templates_system/Sculpting/__init__.py
new file mode 100644
index 00000000000..77f879addae
--- /dev/null
+++ b/release/scripts/startup/bl_app_templates_system/Sculpting/__init__.py
@@ -0,0 +1,23 @@
+
+import bpy
+from bpy.app.handlers import persistent
+
+
+@persistent
+def load_handler(dummy):
+ import bpy
+ if bpy.data.filepath == "":
+ # Apply subdivision modifier on startup
+ bpy.ops.object.mode_set(mode='OBJECT')
+ bpy.ops.object.modifier_apply(modifier="Subdivision")
+ bpy.ops.object.mode_set(mode='EDIT')
+ bpy.ops.transform.tosphere(value=1.0)
+ bpy.ops.object.mode_set(mode='SCULPT')
+
+def register():
+ import bpy
+ bpy.app.handlers.load_post.append(load_handler)
+
+def unregister():
+ import bpy
+ bpy.app.handlers.load_post.remove(load_handler)
diff --git a/release/scripts/startup/bl_app_templates_system/Sculpting/startup.blend b/release/scripts/startup/bl_app_templates_system/Sculpting/startup.blend
new file mode 100644
index 00000000000..720f1d50a6d
--- /dev/null
+++ b/release/scripts/startup/bl_app_templates_system/Sculpting/startup.blend
Binary files differ
diff --git a/release/scripts/startup/bl_app_templates_system/VFX/startup.blend b/release/scripts/startup/bl_app_templates_system/VFX/startup.blend
new file mode 100644
index 00000000000..43224a7d869
--- /dev/null
+++ b/release/scripts/startup/bl_app_templates_system/VFX/startup.blend
Binary files differ
diff --git a/release/scripts/startup/bl_app_templates_system/Video_Editing/startup.blend b/release/scripts/startup/bl_app_templates_system/Video_Editing/startup.blend
new file mode 100644
index 00000000000..8718e2b06b9
--- /dev/null
+++ b/release/scripts/startup/bl_app_templates_system/Video_Editing/startup.blend
Binary files differ
diff --git a/release/scripts/startup/bl_operators/__init__.py b/release/scripts/startup/bl_operators/__init__.py
index de538634595..4d9038684d1 100644
--- a/release/scripts/startup/bl_operators/__init__.py
+++ b/release/scripts/startup/bl_operators/__init__.py
@@ -29,6 +29,7 @@ _modules = [
"anim",
"clip",
"console",
+ "constraint",
"file",
"image",
"mask",
diff --git a/release/scripts/startup/bl_operators/add_mesh_torus.py b/release/scripts/startup/bl_operators/add_mesh_torus.py
index 6bd470091c3..c4fd60140b5 100644
--- a/release/scripts/startup/bl_operators/add_mesh_torus.py
+++ b/release/scripts/startup/bl_operators/add_mesh_torus.py
@@ -149,10 +149,12 @@ class AddTorus(Operator, object_utils.AddObjectHelper):
)
mode: bpy.props.EnumProperty(
name="Torus Dimensions",
- items=(("MAJOR_MINOR", "Major/Minor",
- "Use the major/minor radii for torus dimensions"),
- ("EXT_INT", "Exterior/Interior",
- "Use the exterior/interior radii for torus dimensions")),
+ items=(
+ ('MAJOR_MINOR', "Major/Minor",
+ "Use the major/minor radii for torus dimensions"),
+ ('EXT_INT', "Exterior/Interior",
+ "Use the exterior/interior radii for torus dimensions"),
+ ),
update=mode_update_callback,
)
major_radius: FloatProperty(
diff --git a/release/scripts/startup/bl_operators/anim.py b/release/scripts/startup/bl_operators/anim.py
index 31325cf0b50..fa8ca3575a6 100644
--- a/release/scripts/startup/bl_operators/anim.py
+++ b/release/scripts/startup/bl_operators/anim.py
@@ -197,7 +197,7 @@ class ANIM_OT_keying_set_export(Operator):
return {'RUNNING_MODAL'}
-class BakeAction(Operator):
+class NLA_OT_bake(Operator):
"""Bake all selected objects loc/scale/rotation animation to an action"""
bl_idname = "nla.bake"
bl_label = "Bake Action"
@@ -420,7 +420,7 @@ class UpdateAnimatedTransformConstraint(Operator):
classes = (
ANIM_OT_keying_set_export,
- BakeAction,
+ NLA_OT_bake,
ClearUselessActions,
UpdateAnimatedTransformConstraint,
)
diff --git a/release/scripts/startup/bl_operators/clip.py b/release/scripts/startup/bl_operators/clip.py
index 3c9fc012eeb..975a59e1a36 100644
--- a/release/scripts/startup/bl_operators/clip.py
+++ b/release/scripts/startup/bl_operators/clip.py
@@ -237,7 +237,7 @@ class CLIP_OT_track_to_empty(Operator):
ob = bpy.data.objects.new(name=track.name, object_data=None)
context.collection.objects.link(ob)
- ob.select_set(action='SELECT')
+ ob.select_set(True)
context.view_layer.objects.active = ob
for con in ob.constraints:
@@ -313,7 +313,7 @@ class CLIP_OT_bundles_to_mesh(Operator):
ob = bpy.data.objects.new(name="Tracks", object_data=mesh)
ob.matrix_world = matrix
context.collection.objects.link(ob)
- ob.select_set('SELECT')
+ ob.select_set(True)
context.view_layer.objects.active = ob
else:
self.report({'WARNING'}, "No usable tracks selected")
@@ -516,7 +516,7 @@ class CLIP_OT_constraint_to_fcurve(Operator):
# XXX, should probably use context.selected_editable_objects
# since selected objects can be from a lib or in hidden layer!
for ob in scene.objects:
- if ob.select_set(action='SELECT'):
+ if ob.select_set(True):
self._bake_object(scene, ob)
return {'FINISHED'}
@@ -624,7 +624,7 @@ class CLIP_OT_setup_tracking_scene(Operator):
fg.use_sky = True
if not view_layers.get("Background"):
- bg = view_layers.new("Background")
+ _bg = view_layers.new("Background")
@staticmethod
def createCollection(context, collection_name):
@@ -662,7 +662,6 @@ class CLIP_OT_setup_tracking_scene(Operator):
else:
setup_collection_recursively(collection.children, collection_name, attr_name)
- collection = context.collection
collections = context.scene.collection.children
vlayers = context.scene.view_layers
@@ -674,13 +673,13 @@ class CLIP_OT_setup_tracking_scene(Operator):
# rendersettings
setup_collection_recursively(
- vlayers["Foreground"].collections[0].children,
+ vlayers["Foreground"].layer_collection.children,
"background",
"holdout",
)
setup_collection_recursively(
- vlayers["Background"].collections[0].children,
+ vlayers["Background"].layer_collection.children,
"foreground",
"indirect_only",
)
@@ -970,9 +969,6 @@ class CLIP_OT_setup_tracking_scene(Operator):
setup_shadow_catcher_objects(bg_coll)
def execute(self, context):
- scene = context.scene
- current_active_layer = scene.active_layer
-
self._setupScene(context)
self._setupWorld(context)
self._setupCamera(context)
diff --git a/release/scripts/startup/bl_operators/constraint.py b/release/scripts/startup/bl_operators/constraint.py
new file mode 100644
index 00000000000..61b1f7737af
--- /dev/null
+++ b/release/scripts/startup/bl_operators/constraint.py
@@ -0,0 +1,76 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8-80 compliant>
+
+import bpy
+from bpy.types import (
+ Operator,
+)
+from bpy.props import (
+ IntProperty,
+)
+
+
+class CONSTRAINT_OT_add_target(Operator):
+ """Add a target to the constraint"""
+ bl_idname = "constraint.add_target"
+ bl_label = "Add Target"
+ bl_options = {'UNDO', 'INTERNAL'}
+
+ def execute(self, context):
+ context.constraint.targets.new()
+ return {'FINISHED'}
+
+
+class CONSTRAINT_OT_remove_target(Operator):
+ """Remove the target from the constraint"""
+ bl_idname = "constraint.remove_target"
+ bl_label = "Remove Target"
+ bl_options = {'UNDO', 'INTERNAL'}
+
+ index: IntProperty()
+
+ def execute(self, context):
+ tgts = context.constraint.targets
+ tgts.remove(tgts[self.index])
+ return {'FINISHED'}
+
+
+class CONSTRAINT_OT_normalize_target_weights(Operator):
+ """Normalize weights of all target bones"""
+ bl_idname = "constraint.normalize_target_weights"
+ bl_label = "Normalize Weights"
+ bl_options = {'UNDO', 'INTERNAL'}
+
+ def execute(self, context):
+ tgts = context.constraint.targets
+ total = sum(t.weight for t in tgts)
+
+ if total > 0:
+ for t in tgts:
+ t.weight = t.weight / total
+
+ return {'FINISHED'}
+
+
+classes = (
+ CONSTRAINT_OT_add_target,
+ CONSTRAINT_OT_remove_target,
+ CONSTRAINT_OT_normalize_target_weights,
+)
diff --git a/release/scripts/startup/bl_operators/freestyle.py b/release/scripts/startup/bl_operators/freestyle.py
index 894808de3ed..7196c53098b 100644
--- a/release/scripts/startup/bl_operators/freestyle.py
+++ b/release/scripts/startup/bl_operators/freestyle.py
@@ -36,9 +36,11 @@ class SCENE_OT_freestyle_fill_range_by_selection(bpy.types.Operator):
type: EnumProperty(
name="Type", description="Type of the modifier to work on",
- items=(("COLOR", "Color", "Color modifier type"),
- ("ALPHA", "Alpha", "Alpha modifier type"),
- ("THICKNESS", "Thickness", "Thickness modifier type")),
+ items=(
+ ('COLOR', "Color", "Color modifier type"),
+ ('ALPHA', "Alpha", "Alpha modifier type"),
+ ('THICKNESS', "Thickness", "Thickness modifier type"),
+ ),
)
name: StringProperty(
name="Name",
diff --git a/release/scripts/startup/bl_operators/image.py b/release/scripts/startup/bl_operators/image.py
index caf5937cc95..8fbc8182ad8 100644
--- a/release/scripts/startup/bl_operators/image.py
+++ b/release/scripts/startup/bl_operators/image.py
@@ -82,7 +82,7 @@ class EditExternally(Operator):
import traceback
traceback.print_exc()
self.report({'ERROR'},
- "Image editor could not be launched, please ensure that "
+ "Image editor could not be launched, ensure that "
"the path in User Preferences > File is valid, and Blender has rights to launch it")
return {'CANCELLED'}
diff --git a/release/scripts/startup/bl_operators/mesh.py b/release/scripts/startup/bl_operators/mesh.py
index 1149d7a0dfb..72686bb8dfe 100644
--- a/release/scripts/startup/bl_operators/mesh.py
+++ b/release/scripts/startup/bl_operators/mesh.py
@@ -30,7 +30,7 @@ from bpy.props import (
class MeshMirrorUV(Operator):
"""Copy mirror UV coordinates on the X axis based on a mirrored mesh"""
bl_idname = "mesh.faces_mirror_uv"
- bl_label = "Copy Mirrored UV coords"
+ bl_label = "Copy Mirrored UV Coords"
bl_options = {'REGISTER', 'UNDO'}
direction: EnumProperty(
@@ -49,22 +49,14 @@ class MeshMirrorUV(Operator):
default=3,
)
- @classmethod
- def poll(cls, context):
- obj = context.active_object
- return (obj and obj.type == 'MESH' and obj.data.uv_layers.active)
-
- def execute(self, context):
- DIR = (self.direction == 'NEGATIVE')
+ # Returns has_active_UV_layer, double_warn.
+ def do_mesh_mirror_UV(self, mesh, DIR):
precision = self.precision
double_warn = 0
- ob = context.active_object
- is_editmode = (ob.mode == 'EDIT')
- if is_editmode:
- bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
-
- mesh = ob.data
+ if not mesh.uv_layers.active:
+ # has_active_UV_layer, double_warn
+ return False, 0
# mirror lookups
mirror_gt = {}
@@ -144,13 +136,68 @@ class MeshMirrorUV(Operator):
k_map = v1.index(v2[k])
uv1[k].xy = - (uv2[k_map].x - 0.5) + 0.5, uv2[k_map].y
+ # has_active_UV_layer, double_warn
+ return True, double_warn
+
+ @classmethod
+ def poll(cls, context):
+ obj = context.view_layer.objects.active
+ return (obj and obj.type == 'MESH')
+
+ def execute(self, context):
+ DIR = (self.direction == 'NEGATIVE')
+
+ total_no_active_UV = 0
+ total_duplicates = 0
+ meshes_with_duplicates = 0
+
+ ob = context.view_layer.objects.active
+ is_editmode = (ob.mode == 'EDIT')
+ if is_editmode:
+ bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+
+ meshes = [ob.data for ob in context.view_layer.objects.selected
+ if ob.type == 'MESH' and ob.data.library is None]
+
+ for mesh in meshes:
+ mesh.tag = False
+
+ for mesh in meshes:
+ if mesh.tag:
+ continue
+
+ mesh.tag = True
+
+ has_active_UV_layer, double_warn = self.do_mesh_mirror_UV(mesh, DIR)
+
+ if not has_active_UV_layer:
+ total_no_active_UV = total_no_active_UV + 1
+
+ elif double_warn:
+ total_duplicates += double_warn
+ meshes_with_duplicates = meshes_with_duplicates + 1
+
if is_editmode:
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
- if double_warn:
- self.report({'WARNING'},
- "%d duplicates found, mirror may be incomplete" %
- double_warn)
+ if total_duplicates and total_no_active_UV:
+ self.report({'WARNING'}, "%d %s with no active UV layer. "
+ "%d duplicates found in %d %s, mirror may be incomplete."
+ % (total_no_active_UV,
+ "mesh" if total_no_active_UV == 1 else "meshes",
+ total_duplicates,
+ meshes_with_duplicates,
+ "mesh" if meshes_with_duplicates == 1 else "meshes"))
+ elif total_no_active_UV:
+ self.report({'WARNING'}, "%d %s with no active UV layer."
+ % (total_no_active_UV,
+ "mesh" if total_no_active_UV == 1 else "meshes"))
+ elif total_duplicates:
+ self.report({'WARNING'}, "%d duplicates found in %d %s,"
+ " mirror may be incomplete."
+ % (total_duplicates,
+ meshes_with_duplicates,
+ "mesh" if meshes_with_duplicates == 1 else "meshes"))
return {'FINISHED'}
diff --git a/release/scripts/startup/bl_operators/object.py b/release/scripts/startup/bl_operators/object.py
index c49591ff300..fddf15155fc 100644
--- a/release/scripts/startup/bl_operators/object.py
+++ b/release/scripts/startup/bl_operators/object.py
@@ -92,7 +92,7 @@ class SelectPattern(Operator):
if item_parent is not None:
item_parent.select_tail = True
else:
- item.select_set(action='SELECT')
+ item.select_set(True)
return {'FINISHED'}
@@ -139,7 +139,7 @@ class SelectCamera(Operator):
bpy.ops.object.select_all(action='DESELECT')
view_layer.objects.active = camera
# camera.hide = False # XXX TODO where is this now?
- camera.select_set(action='SELECT')
+ camera.select_set(True)
return {'FINISHED'}
return {'CANCELLED'}
@@ -171,7 +171,6 @@ class SelectHierarchy(Operator):
return context.object
def execute(self, context):
- scene = context.scene
view_layer = context.view_layer
select_new = []
act_new = None
@@ -206,7 +205,7 @@ class SelectHierarchy(Operator):
bpy.ops.object.select_all(action='DESELECT')
for obj in select_new:
- obj.select_set(action='SELECT')
+ obj.select_set(True)
view_layer.objects.active = act_new
return {'FINISHED'}
@@ -255,7 +254,7 @@ class SubdivisionSet(Operator):
if not relative:
if level > mod.total_levels:
sub = level - mod.total_levels
- for i in range(sub):
+ for _ in range(sub):
bpy.ops.object.multires_subdivide(modifier="Multires")
if obj.mode == 'SCULPT':
@@ -288,7 +287,7 @@ class SubdivisionSet(Operator):
if obj.mode == 'SCULPT':
mod = obj.modifiers.new("Multires", 'MULTIRES')
if level > 0:
- for i in range(0, level):
+ for _ in range(level):
bpy.ops.object.multires_subdivide(modifier="Multires")
else:
mod = obj.modifiers.new("Subsurf", 'SUBSURF')
@@ -476,7 +475,7 @@ class ShapeTransfer(Operator):
objects = [ob for ob in context.selected_editable_objects
if ob != ob_act]
- if 1: # swap from/to, means we cant copy to many at once.
+ if 1: # swap from/to, means we can't copy to many at once.
if len(objects) != 1:
self.report({'ERROR'},
("Expected one other selected "
@@ -647,8 +646,8 @@ class MakeDupliFace(Operator):
ob_new.use_dupli_faces_scale = True
ob_new.dupli_faces_scale = 1.0 / SCALE_FAC
- ob_inst.select_set(action='SELECT')
- ob_new.select_set(action='SELECT')
+ ob_inst.select_set(True)
+ ob_new.select_set(True)
def execute(self, context):
self._main(context)
@@ -871,11 +870,56 @@ class DupliOffsetFromCursor(Operator):
return {'FINISHED'}
+class LoadImageAsEmpty(Operator):
+ """Select an image file and create a new image empty with it"""
+ bl_idname = "object.load_image_as_empty"
+ bl_label = "Load Image as Empty"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ filepath: StringProperty(
+ subtype='FILE_PATH'
+ )
+
+ filter_image: BoolProperty(default=True, options={'HIDDEN', 'SKIP_SAVE'})
+ filter_folder: BoolProperty(default=True, options={'HIDDEN', 'SKIP_SAVE'})
+
+ view_align: BoolProperty(
+ name="Align to view",
+ default=True
+ )
+
+ def invoke(self, context, event):
+ context.window_manager.fileselect_add(self)
+ return {'RUNNING_MODAL'}
+
+ def execute(self, context):
+ scene = context.scene
+ space = context.space_data
+ cursor = (space if space and space.type == 'VIEW_3D' else scene).cursor_location
+ try:
+ image = bpy.data.images.load(self.filepath, check_existing=True)
+ except RuntimeError as ex:
+ self.report({"ERROR"}, str(ex))
+ return {"CANCELLED"}
+
+ bpy.ops.object.empty_add(
+ 'INVOKE_REGION_WIN',
+ type='IMAGE',
+ location=cursor,
+ view_align=self.view_align,
+ )
+ obj = context.active_object
+ obj.data = image
+ obj.empty_display_size = 5.0
+ return {'FINISHED'}
+
+
classes = (
ClearAllRestrictRender,
DupliOffsetFromCursor,
IsolateTypeRender,
JoinUVs,
+ LoadImageAsEmpty,
MakeDupliFace,
SelectCamera,
SelectHierarchy,
diff --git a/release/scripts/startup/bl_operators/object_quick_effects.py b/release/scripts/startup/bl_operators/object_quick_effects.py
index 36dc1b46590..7597b2a0491 100644
--- a/release/scripts/startup/bl_operators/object_quick_effects.py
+++ b/release/scripts/startup/bl_operators/object_quick_effects.py
@@ -84,8 +84,6 @@ class QuickFur(Operator):
return {'CANCELLED'}
mat = bpy.data.materials.new("Fur Material")
- mat.strand.tip_size = 0.25
- mat.strand.blend_distance = 0.5
for obj in mesh_objects:
fake_context["object"] = obj
@@ -106,6 +104,7 @@ class QuickFur(Operator):
psys.settings.use_strand_primitive = True
psys.settings.use_hair_bspline = True
psys.settings.child_type = 'INTERPOLATED'
+ psys.settings.tip_radius = 0.25
obj.data.materials.append(mat)
psys.settings.material = len(obj.data.materials)
@@ -287,7 +286,7 @@ class QuickExplode(Operator):
def obj_bb_minmax(obj, min_co, max_co):
for i in range(0, 8):
- bb_vec = obj.matrix_world * Vector(obj.bound_box[i])
+ bb_vec = obj.matrix_world @ Vector(obj.bound_box[i])
min_co[0] = min(bb_vec[0], min_co[0])
min_co[1] = min(bb_vec[1], min_co[1])
@@ -347,7 +346,7 @@ class QuickSmoke(Operator):
obj.modifiers[-1].flow_settings.smoke_flow_type = self.style
if not self.show_flows:
- obj.draw_type = 'WIRE'
+ obj.display_type = 'WIRE'
# store bounding box min/max for the domain object
obj_bb_minmax(obj, min_co, max_co)
@@ -472,7 +471,7 @@ class QuickFluid(Operator):
obj.hide_render = not self.show_flows
if not self.show_flows:
- obj.draw_type = 'WIRE'
+ obj.display_type = 'WIRE'
# store bounding box min/max for the domain object
obj_bb_minmax(obj, min_co, max_co)
diff --git a/release/scripts/startup/bl_operators/object_randomize_transform.py b/release/scripts/startup/bl_operators/object_randomize_transform.py
index 6e2dad079ee..6c4531a468b 100644
--- a/release/scripts/startup/bl_operators/object_randomize_transform.py
+++ b/release/scripts/startup/bl_operators/object_randomize_transform.py
@@ -155,7 +155,7 @@ class RandomizeLocRotSize(Operator):
)
'''scale_min: FloatProperty(
- name="Minimun Scale Factor",
+ name="Minimum Scale Factor",
description="Lowest scale percentage possible",
min=-1.0, max=1.0, precision=3,
default=0.15,
diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py
index 381b9c83916..ad2fceb274b 100644
--- a/release/scripts/startup/bl_operators/presets.py
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -238,6 +238,13 @@ class ExecutePreset(Operator):
ext = splitext(filepath)[1].lower()
+ if ext not in {".py", ".xml"}:
+ self.report({'ERROR'}, "unknown filetype: %r" % ext)
+ return {'CANCELLED'}
+
+ if hasattr(preset_class, "reset_cb"):
+ preset_class.reset_cb(context)
+
# execute the preset using script.python_file_run
if ext == ".py":
#FRACTURE MODIFIER HACK, cant get bpy.context.fracture to be run via py script else...
@@ -259,9 +266,9 @@ class ExecutePreset(Operator):
rna_xml.xml_file_run(context,
filepath,
preset_class.preset_xml_map)
- else:
- self.report({'ERROR'}, "unknown filetype: %r" % ext)
- return {'CANCELLED'}
+
+ if hasattr(preset_class, "post_cb"):
+ preset_class.post_cb(context)
return {'FINISHED'}
@@ -615,7 +622,7 @@ class AddPresetFracture(AddPresetBase, Operator):
"fracture.shard_count",
"fracture.cluster_count",
"fracture.point_seed",
- "fracture.shards_to_islands",
+ "fracture.split_to_islands",
"fracture.auto_execute",
"fracture.use_constraints",
"fracture.constraint_limit",
@@ -667,7 +674,7 @@ class AddPresetFracture(AddPresetBase, Operator):
"fracture.autohide_filter_group",
"fracture.uv_layer",
"fracture.inner_material",
- "fracture.boolean_solver",
+ #"fracture.boolean_solver",
"fracture.boolean_double_threshold",
"fracture.dynamic_percentage",
"fracture.dynamic_new_constraints",
@@ -692,9 +699,9 @@ class AddPresetFracture(AddPresetBase, Operator):
"fracture.use_vertices",
"fracture.use_self_collision",
"fracture.grid_resolution",
- "fracture.min_acceleration",
- "fracture.max_acceleration",
- "fracture.acceleration_fade",
+ #"fracture.min_acceleration",
+ #"fracture.max_acceleration",
+ #"fracture.acceleration_fade",
"fracture.use_animated_mesh",
"fracture.animated_mesh_input",
"fracture.use_animated_mesh_rotation",
@@ -732,7 +739,7 @@ class AddPresetOperator(AddPresetBase, Operator):
prefix, suffix = self.operator.split("_OT_", 1)
op = getattr(getattr(bpy.ops, prefix.lower()), suffix)
- operator_rna = op.get_rna().bl_rna
+ operator_rna = op.get_rna_type()
del op
ret = []
@@ -770,24 +777,6 @@ class WM_MT_operator_presets(Menu):
preset_operator = "script.execute_preset"
-class AddPresetUnitsLength(AddPresetBase, Operator):
- """Add or remove length units preset"""
- bl_idname = "scene.units_length_preset_add"
- bl_label = "Add Length Units Preset"
- preset_menu = "SCENE_PT_units_length_presets"
-
- preset_defines = [
- "scene = bpy.context.scene"
- ]
-
- preset_values = [
- "scene.unit_settings.system",
- "scene.unit_settings.scale_length",
- ]
-
- preset_subdir = "units_length"
-
-
class AddPresetGpencilBrush(AddPresetBase, Operator):
"""Add or remove grease pencil brush preset"""
bl_idname = "scene.gpencil_brush_preset_add"
@@ -804,7 +793,7 @@ class AddPresetGpencilBrush(AddPresetBase, Operator):
"settings.active_smooth_factor",
"settings.angle",
"settings.angle_factor",
- "settings.use_stabilizer",
+ "settings.use_settings_stabilizer",
"brush.smooth_stroke_radius",
"brush.smooth_stroke_factor",
"settings.pen_smooth_factor",
@@ -813,7 +802,7 @@ class AddPresetGpencilBrush(AddPresetBase, Operator):
"settings.pen_thick_smooth_steps",
"settings.pen_subdivision_steps",
"settings.random_subdiv",
- "settings.enable_random",
+ "settings.use_settings_random",
"settings.random_pressure",
"settings.random_strength",
"settings.uv_random",
@@ -862,6 +851,8 @@ class AddPresetGpencilMaterial(AddPresetBase, Operator):
"gpcolor.texture_clamp",
"gpcolor.texture_mix",
"gpcolor.mix_factor",
+ "gpcolor.show_stroke",
+ "gpcolor.show_fill",
]
preset_subdir = "gpencil_material"
@@ -883,7 +874,6 @@ classes = (
AddPresetTrackingCamera,
AddPresetTrackingSettings,
AddPresetTrackingTrackColor,
- AddPresetUnitsLength,
AddPresetGpencilBrush,
AddPresetGpencilMaterial,
ExecutePreset,
diff --git a/release/scripts/startup/bl_operators/rigidbody.py b/release/scripts/startup/bl_operators/rigidbody.py
index 0f9b7b27beb..e7ce89f34ac 100644
--- a/release/scripts/startup/bl_operators/rigidbody.py
+++ b/release/scripts/startup/bl_operators/rigidbody.py
@@ -65,7 +65,7 @@ class CopyRigidbodySettings(Operator):
# deselect all but mesh objects
for o in context.selected_objects:
if o.type != 'MESH':
- o.select_set(action='DESELECT')
+ o.select_set(False)
elif o.rigid_body is None:
# Add rigidbody to object!
view_layer.objects.active = o
@@ -136,7 +136,7 @@ class BakeToKeyframes(Operator):
# filter objects selection
for obj in context.selected_objects:
if not obj.rigid_body or obj.rigid_body.type != 'ACTIVE':
- obj.select_set(action='DESELECT')
+ obj.select_set(False)
objects = context.selected_objects
@@ -296,11 +296,11 @@ class ConnectRigidBodies(Operator):
ob.location = loc
context.scene.objects.link(ob)
context.view_layer.objects.active = ob
- ob.select_set(action='SELECT')
+ ob.select_set(True)
bpy.ops.rigidbody.constraint_add()
con_obj = context.active_object
- con_obj.empty_draw_type = 'ARROWS'
+ con_obj.empty_display_type = 'ARROWS'
con = con_obj.rigid_body_constraint
con.type = self.con_type
@@ -341,7 +341,7 @@ class ConnectRigidBodies(Operator):
# restore selection
bpy.ops.object.select_all(action='DESELECT')
for obj in objects:
- obj.select_set(action='SELECT')
+ obj.select_set(True)
view_layer.objects.active = obj_act
return {'FINISHED'}
else:
diff --git a/release/scripts/startup/bl_operators/uvcalc_follow_active.py b/release/scripts/startup/bl_operators/uvcalc_follow_active.py
index 414fc9c7b32..58d60426464 100644
--- a/release/scripts/startup/bl_operators/uvcalc_follow_active.py
+++ b/release/scripts/startup/bl_operators/uvcalc_follow_active.py
@@ -25,8 +25,13 @@ import bpy
from bpy.types import Operator
-def extend(obj, operator, EXTEND_MODE):
+STATUS_OK = (1 << 0)
+STATUS_ERR_ACTIVE_FACE = (1 << 1)
+STATUS_ERR_NOT_SELECTED = (1 << 2)
+STATUS_ERR_NOT_QUAD = (1 << 3)
+
+def extend(obj, operator, EXTEND_MODE):
import bmesh
me = obj.data
# script will fail without UVs
@@ -39,20 +44,17 @@ def extend(obj, operator, EXTEND_MODE):
uv_act = bm.loops.layers.uv.active
if f_act is None:
- operator.report({'ERROR'}, "No active face")
- return
+ return STATUS_ERR_ACTIVE_FACE
if not f_act.select:
- operator.report({'ERROR'}, "No active face is not selected")
- return
+ return STATUS_ERR_NOT_SELECTED
elif len(f_act.verts) != 4:
- operator.report({'ERROR'}, "Active face must be a quad")
- return
+ return STATUS_ERR_NOT_QUAD
faces = [f for f in bm.faces if f.select and len(f.verts) == 4]
# our own local walker
def walk_face_init(faces, f_act):
- # first tag all faces True (so we dont uvmap them)
+ # first tag all faces True (so we don't uvmap them)
for f in bm.faces:
f.tag = True
# then tag faces arg False
@@ -212,12 +214,38 @@ def extend(obj, operator, EXTEND_MODE):
apply_uv(*f_triple)
bmesh.update_edit_mesh(me, False)
+ return STATUS_OK
def main(context, operator):
- obj = context.active_object
-
- extend(obj, operator, operator.properties.mode)
+ num_meshes = 0
+ num_errors = 0
+ status = 0
+
+ ob_list = [ob for ob in context.selected_objects if ob and ob.type == 'MESH']
+ for ob in ob_list:
+ ob.data.tag = False
+
+ for ob in ob_list:
+ if ob.data.tag:
+ continue
+
+ num_meshes += 1
+ ob.data.tag = True
+
+ ret = extend(ob, operator, operator.properties.mode)
+ if ret != STATUS_OK:
+ num_errors += 1
+ status |= ret
+
+ if num_errors == num_meshes:
+ if status & STATUS_ERR_NOT_QUAD:
+ operator.report({'ERROR'}, "Active face must be a quad")
+ elif status & STATUS_ERR_NOT_SELECTED:
+ operator.report({'ERROR'}, "Active face not selected")
+ else:
+ assert((status & STATUS_ERR_ACTIVE_FACE) != 0)
+ operator.report({'ERROR'}, "No active face")
class FollowActiveQuads(Operator):
diff --git a/release/scripts/startup/bl_operators/uvcalc_lightmap.py b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
index b866fb1ce40..1382d84db49 100644
--- a/release/scripts/startup/bl_operators/uvcalc_lightmap.py
+++ b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
@@ -77,9 +77,9 @@ class prettyface:
# f, (len_min, len_mid, len_max)
self.uv = data
- f1, lens1, lens1ord = data[0]
+ _f1, lens1, lens1ord = data[0]
if data[1]:
- f2, lens2, lens2ord = data[1]
+ _f2, lens2, lens2ord = data[1]
self.width = (lens1[lens1ord[0]] + lens2[lens2ord[0]]) / 2.0
self.height = (lens1[lens1ord[1]] + lens2[lens2ord[1]]) / 2.0
else: # 1 tri :/
@@ -205,12 +205,12 @@ class prettyface:
fuv[I[0]][:] = p2
fuv[I[1]][:] = p3
- f, lens, lensord = uv[0]
+ f = uv[0][0]
set_uv(f, (x1, y1), (x1, y2 - margin_h), (x2 - margin_w, y1))
if uv[1]:
- f, lens, lensord = uv[1]
+ f = uv[1][0]
set_uv(f, (x2, y2), (x2, y1 + margin_h), (x1 + margin_w, y2))
else: # 1 QUAD
@@ -450,7 +450,7 @@ def lightmap_uvpack(meshes,
max_int_dimension = int(((side_len / float_to_int_factor)) / PREF_BOX_DIV)
ok = True
else:
- max_int_dimension = 0.0 # wont be used
+ max_int_dimension = 0.0 # won't be used
ok = False
# RECURSIVE pretty face grouping
@@ -558,32 +558,13 @@ def lightmap_uvpack(meshes,
def unwrap(operator, context, **kwargs):
-
- # only unwrap active object if True
- PREF_ACT_ONLY = kwargs.pop("PREF_ACT_ONLY")
-
- # ensure object(s) are selected if necessary and active object is set
- if context.object is None:
- if PREF_ACT_ONLY:
- operator.report({'WARNING'}, "Active object not set")
- return {'CANCELLED'}
- elif len(context.selected_objects) == 0:
- operator.report({'WARNING'}, "No selected objects")
- return {'CANCELLED'}
-
# switch to object mode
is_editmode = context.object and context.object.mode == 'EDIT'
if is_editmode:
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
# define list of meshes
- meshes = []
- if PREF_ACT_ONLY:
- obj = context.view_layer.objects.active
- if obj and obj.type == 'MESH':
- meshes = [obj.data]
- else:
- meshes = list({me for obj in context.selected_objects if obj.type == 'MESH' for me in (obj.data,) if me.polygons and me.library is None})
+ meshes = list({me for obj in context.selected_objects if obj.type == 'MESH' for me in (obj.data,) if me.polygons and me.library is None})
if not meshes:
operator.report({'ERROR'}, "No mesh object")
@@ -621,7 +602,6 @@ class LightMapPack(Operator):
items=(
('SEL_FACES', "Selected Faces", "Space all UVs evenly"),
('ALL_FACES', "All Faces", "Average space UVs edge length of each loop"),
- ('ALL_OBJECTS', "Selected Mesh Object", "Average space UVs edge length of each loop")
),
)
@@ -667,18 +647,37 @@ class LightMapPack(Operator):
default=0.1,
)
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ is_editmode = context.active_object.mode == 'EDIT'
+ if is_editmode:
+ layout.prop(self, "PREF_CONTEXT")
+
+ layout.prop(self, "PREF_PACK_IN_ONE")
+ layout.prop(self, "PREF_NEW_UVLAYER")
+ layout.prop(self, "PREF_APPLY_IMAGE")
+ layout.prop(self, "PREF_IMG_PX_SIZE")
+ layout.prop(self, "PREF_BOX_DIV")
+ layout.prop(self, "PREF_MARGIN_DIV")
+
+ @classmethod
+ def poll(cls, context):
+ ob = context.active_object
+ return ob and ob.type == 'MESH'
+
def execute(self, context):
kwargs = self.as_keywords()
PREF_CONTEXT = kwargs.pop("PREF_CONTEXT")
- if PREF_CONTEXT == 'SEL_FACES':
- kwargs["PREF_ACT_ONLY"] = True
+ is_editmode = context.active_object.mode == 'EDIT'
+
+ if not is_editmode:
+ kwargs["PREF_SEL_ONLY"] = False
+ elif PREF_CONTEXT == 'SEL_FACES':
kwargs["PREF_SEL_ONLY"] = True
elif PREF_CONTEXT == 'ALL_FACES':
- kwargs["PREF_ACT_ONLY"] = True
- kwargs["PREF_SEL_ONLY"] = False
- elif PREF_CONTEXT == 'ALL_OBJECTS':
- kwargs["PREF_ACT_ONLY"] = False
kwargs["PREF_SEL_ONLY"] = False
else:
raise Exception("invalid context")
diff --git a/release/scripts/startup/bl_operators/uvcalc_smart_project.py b/release/scripts/startup/bl_operators/uvcalc_smart_project.py
index b01a50d5d6a..1695b012108 100644
--- a/release/scripts/startup/bl_operators/uvcalc_smart_project.py
+++ b/release/scripts/startup/bl_operators/uvcalc_smart_project.py
@@ -143,9 +143,9 @@ def island2Edge(island):
unique_points = {}
for f in island:
- f_uvkey = map(tuple, f.uv)
+ f_uvkey = list(map(tuple, f.uv))
- for vIdx, edkey in enumerate(f.edge_keys):
+ for vIdx in range(len(f_uvkey)):
unique_points[f_uvkey[vIdx]] = f.uv[vIdx]
if f.v[vIdx].index > f.v[vIdx - 1].index:
@@ -158,18 +158,14 @@ def island2Edge(island):
try:
edges[f_uvkey[i1], f_uvkey[i2]] *= 0 # sets any edge with more than 1 user to 0 are not returned.
except:
- edges[f_uvkey[i1], f_uvkey[i2]] = (f.uv[i1] - f.uv[i2]).length,
+ edges[f_uvkey[i1], f_uvkey[i2]] = (f.uv[i1] - f.uv[i2]).length
# If 2 are the same then they will be together, but full [a,b] order is not correct.
# Sort by length
-
length_sorted_edges = [(Vector(key[0]), Vector(key[1]), value) for key, value in edges.items() if value != 0]
- try:
- length_sorted_edges.sort(key=lambda A: -A[2]) # largest first
- except:
- length_sorted_edges.sort(lambda A, B: cmp(B[2], A[2]))
+ length_sorted_edges.sort(key=lambda a: -a[2]) # largest first
# Its okay to leave the length in there.
# for e in length_sorted_edges:
@@ -179,30 +175,6 @@ def island2Edge(island):
return length_sorted_edges, [v.to_3d() for v in unique_points.values()]
-# ========================= NOT WORKING????
-# Find if a points inside an edge loop, unordered.
-# pt is and x/y
-# edges are a non ordered loop of edges.
-# offsets are the edge x and y offset.
-"""
-def pointInEdges(pt, edges):
- #
- x1 = pt[0]
- y1 = pt[1]
-
- # Point to the left of this line.
- x2 = -100000
- y2 = -10000
- intersectCount = 0
- for ed in edges:
- xi, yi = lineIntersection2D(x1,y1, x2,y2, ed[0][0], ed[0][1], ed[1][0], ed[1][1])
- if xi is not None: # Is there an intersection.
- intersectCount+=1
-
- return intersectCount % 2
-"""
-
-
def pointInIsland(pt, island):
vec1, vec2, vec3 = Vector(), Vector(), Vector()
for f in island:
@@ -271,7 +243,7 @@ def optiRotateUvIsland(faces):
# orient them vertically (could be an option)
minx, miny, maxx, maxy = boundsIsland(faces)
w, h = maxx - minx, maxy - miny
- # use epsilon so we dont randomly rotate (almost) perfect squares.
+ # use epsilon so we don't randomly rotate (almost) perfect squares.
if h + 0.00001 < w:
from math import pi
angle = pi / 2.0
@@ -357,7 +329,7 @@ def mergeUvIslands(islandList):
BREAK = True
break
- # Now we have 2 islands, if the efficiency of the islands lowers theres an
+ # Now we have 2 islands, if the efficiency of the islands lowers there's an
# increasing likely hood that we can fit merge into the bigger UV island.
# this ensures a tight fit.
@@ -625,7 +597,7 @@ def packIslands(islandList):
h = SMALL_NUM
"""Save the offset to be applied later,
- we could apply to the UVs now and allign them to the bottom left hand area
+ we could apply to the UVs now and align them to the bottom left hand area
of the UV coords like the box packer imagines they are
but, its quicker just to remember their offset and
apply the packing and offset in 1 pass """
@@ -756,11 +728,10 @@ def main(context,
USER_FILL_HOLES_QUALITY = 50 # Only for hole filling.
USER_VIEW_INIT = 0 # Only for hole filling.
+ obList = [ob for ob in context.selected_editable_objects if ob and ob.type == 'MESH']
is_editmode = (context.active_object.mode == 'EDIT')
- if is_editmode:
- obList = [ob for ob in [context.active_object] if ob and ob.type == 'MESH']
- else:
- obList = [ob for ob in context.selected_editable_objects if ob and ob.type == 'MESH']
+
+ if not is_editmode:
USER_ONLY_SELECTED_FACES = False
if not obList:
@@ -772,23 +743,11 @@ def main(context,
else:
ob = "Unwrap %i Selected Meshes"
- # HACK, loop until mouse is lifted.
- '''
- while Window.GetMouseButtons() != 0:
- time.sleep(10)
- '''
-
-# ~ XXX if not Draw.PupBlock(ob % len(obList), pup_block):
-# ~ XXX return
-# ~ XXX del ob
-
# Convert from being button types
-
USER_PROJECTION_LIMIT_CONVERTED = cos(USER_PROJECTION_LIMIT * DEG_TO_RAD)
USER_PROJECTION_LIMIT_HALF_CONVERTED = cos((USER_PROJECTION_LIMIT / 2) * DEG_TO_RAD)
# Toggle Edit mode
- is_editmode = (context.active_object.mode == 'EDIT')
if is_editmode:
bpy.ops.object.mode_set(mode='OBJECT')
# Assume face select mode! an annoying hack to toggle face select mode because Mesh doesn't like faceSelectMode.
@@ -798,12 +757,9 @@ def main(context,
obList.sort(key=lambda ob: ob.data.name)
collected_islandList = []
-# XXX Window.WaitCursor(1)
-
time1 = time.time()
# Tag as False so we don't operate on the same mesh twice.
-# XXX bpy.data.meshes.tag = False
for me in bpy.data.meshes:
me.tag = False
@@ -827,8 +783,6 @@ def main(context,
else:
meshFaces = [thickface(f, uv_layer, me_verts) for i, f in enumerate(me.polygons)]
-# XXX Window.DrawProgressBar(0.1, 'SmartProj UV Unwrapper, mapping "%s", %i faces.' % (me.name, len(meshFaces)))
-
# =======
# Generate a projection list from face normals, this is meant to be smart :)
@@ -873,7 +827,7 @@ def main(context,
# This while only gathers projection vecs, faces are assigned later on.
while 1:
- # If theres none there then start with the largest face
+ # If there's none there then start with the largest face
# add all the faces that are close.
for fIdx in range(len(tempMeshFaces) - 1, -1, -1):
@@ -898,7 +852,7 @@ def main(context,
projectVecs.append(averageVec.normalized())
# Get the next vec!
- # Pick the face thats most different to all existing angles :)
+ # Pick the face that's most different to all existing angles :)
mostUniqueAngle = 1.0 # 1.0 is 0d. no difference.
mostUniqueIndex = 0 # dummy
@@ -974,7 +928,6 @@ def main(context,
for f in faceProjectionGroupList[i]:
f_uv = f.uv
for j, v in enumerate(f.v):
- # XXX - note, between mathutils in 2.4 and 2.5 the order changed.
f_uv[j][:] = (MatQuat @ v.co).xy
if USER_SHARE_SPACE:
@@ -991,11 +944,9 @@ def main(context,
# We want to pack all in 1 go, so pack now
if USER_SHARE_SPACE:
- # XXX Window.DrawProgressBar(0.9, "Box Packing for all objects...")
packIslands(collected_islandList)
print("Smart Projection time: %.2f" % (time.time() - time1))
- # Window.DrawProgressBar(0.9, "Smart Projections done, time: %.2f sec" % (time.time() - time1))
# aspect correction is only done in edit mode - and only smart unwrap supports currently
if is_editmode:
@@ -1024,25 +975,6 @@ def main(context,
dict_matrix.clear()
-# XXX Window.DrawProgressBar(1.0, "")
-# XXX Window.WaitCursor(0)
-# XXX Window.RedrawAll()
-
-
-"""
- pup_block = [\
- 'Projection',\
- ('Selected Faces Only', USER_ONLY_SELECTED_FACES, 'Use only selected faces from all selected meshes.'),\
- ('Init from view', USER_VIEW_INIT, 'The first projection will be from the view vector.'),\
- '',\
- 'UV Layout',\
- ('Share Tex Space', USER_SHARE_SPACE, 'Objects Share texture space, map all objects into 1 uvmap.'),\
- ('Island Margin:', USER_ISLAND_MARGIN, 0.0, 0.5, ''),\
- 'Fill in empty areas',\
- ('Fill Holes', USER_FILL_HOLES, 'Fill in empty areas reduced texture waistage (slow).'),\
- ('Fill Quality:', USER_FILL_HOLES_QUALITY, 1, 100, 'Depends on fill holes, how tightly to fill UV holes, (higher is slower)'),\
- ]
-"""
from bpy.props import FloatProperty, BoolProperty
diff --git a/release/scripts/startup/bl_operators/vertexpaint_dirt.py b/release/scripts/startup/bl_operators/vertexpaint_dirt.py
index 335c3d8bbda..e0bc5286bfe 100644
--- a/release/scripts/startup/bl_operators/vertexpaint_dirt.py
+++ b/release/scripts/startup/bl_operators/vertexpaint_dirt.py
@@ -155,14 +155,14 @@ class VertexPaintDirt(Operator):
description="Less than 90 limits the angle used in the tonal range",
min=0.0, max=pi,
default=pi,
- unit="ROTATION",
+ unit='ROTATION',
)
dirt_angle: FloatProperty(
name="Dirt Angle",
description="Less than 90 limits the angle used in the tonal range",
min=0.0, max=pi,
default=0.0,
- unit="ROTATION",
+ unit='ROTATION',
)
dirt_only: BoolProperty(
name="Dirt Only",
diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py
index 0ccdd3cf5c6..92ac18e0f6f 100644
--- a/release/scripts/startup/bl_operators/wm.py
+++ b/release/scripts/startup/bl_operators/wm.py
@@ -20,6 +20,7 @@
import bpy
from bpy.types import (
+ Menu,
Operator,
OperatorFileListElement
)
@@ -111,7 +112,7 @@ def operator_path_is_undo(context, data_path):
# note that if we have data paths that use strings this could fail
# luckily we don't do this!
#
- # When we cant find the data owner assume no undo is needed.
+ # When we can't find the data owner assume no undo is needed.
data_path_head = data_path.rpartition(".")[0]
if not data_path_head:
@@ -628,7 +629,7 @@ class WM_OT_operator_pie_enum(Operator):
del op_mod_str, ob_id_str
try:
- op_rna = op.get_rna()
+ op_rna = op.get_rna_type()
except KeyError:
self.report({'ERROR'}, "Operator not found: bpy.ops.%s" % data_path)
return {'CANCELLED'}
@@ -638,7 +639,7 @@ class WM_OT_operator_pie_enum(Operator):
pie = layout.menu_pie()
pie.operator_enum(data_path, prop_string)
- wm.popup_menu_pie(draw_func=draw_cb, title=op_rna.bl_rna.name, event=event)
+ wm.popup_menu_pie(draw_func=draw_cb, title=op_rna.name, event=event)
return {'FINISHED'}
@@ -836,12 +837,12 @@ class WM_OT_context_modal_mouse(Operator):
elif 'LEFTMOUSE' == event_type:
item = next(iter(self._values.keys()))
self._values_clear()
- context.area.header_text_set()
+ context.area.header_text_set(None)
return operator_value_undo_return(item)
elif event_type in {'RIGHTMOUSE', 'ESC'}:
self._values_restore()
- context.area.header_text_set()
+ context.area.header_text_set(None)
return {'CANCELLED'}
return {'RUNNING_MODAL'}
@@ -1444,10 +1445,10 @@ class WM_OT_appconfig_activate(Operator):
def execute(self, context):
import os
- bpy.utils.keyconfig_set(self.filepath)
-
- filepath = self.filepath.replace("keyconfig", "interaction")
-
+ filepath = self.filepath
+ bpy.utils.keyconfig_set(filepath)
+ dirname, filename = os.path.split(filepath)
+ filepath = os.path.normpath(os.path.join(dirname, os.pardir, "interaction", filename))
if os.path.exists(filepath):
bpy.ops.script.execute_preset(
filepath=filepath,
@@ -1490,33 +1491,50 @@ class WM_OT_copy_prev_settings(Operator):
bl_idname = "wm.copy_prev_settings"
bl_label = "Copy Previous Settings"
- def execute(self, context):
- import os
- import shutil
+ @staticmethod
+ def previous_version():
ver = bpy.app.version
ver_old = ((ver[0] * 100) + ver[1]) - 1
- path_src = bpy.utils.resource_path('USER', ver_old // 100, ver_old % 100)
- path_dst = bpy.utils.resource_path('USER')
+ return ver_old // 100, ver_old % 100
- if os.path.isdir(path_dst):
- self.report({'ERROR'}, "Target path %r exists" % path_dst)
- elif not os.path.isdir(path_src):
- self.report({'ERROR'}, "Source path %r does not exist" % path_src)
- else:
- shutil.copytree(path_src, path_dst, symlinks=True)
+ @staticmethod
+ def _old_path():
+ ver = bpy.app.version
+ ver_old = ((ver[0] * 100) + ver[1]) - 1
+ return bpy.utils.resource_path('USER', ver_old // 100, ver_old % 100)
- # reload recent-files.txt
- bpy.ops.wm.read_history()
+ @staticmethod
+ def _new_path():
+ return bpy.utils.resource_path('USER')
- # don't loose users work if they open the splash later.
- if bpy.data.is_saved is bpy.data.is_dirty is False:
- bpy.ops.wm.read_homefile()
- else:
- self.report({'INFO'}, "Reload Start-Up file to restore settings")
+ @classmethod
+ def poll(cls, context):
+ import os
- return {'FINISHED'}
+ old = cls._old_path()
+ new = cls._new_path()
+ if os.path.isdir(old) and not os.path.isdir(new):
+ return True
- return {'CANCELLED'}
+ old_userpref = os.path.join(old, "config", "userpref.blend")
+ new_userpref = os.path.join(new, "config", "userpref.blend")
+ return os.path.isfile(old_userpref) and not os.path.isfile(new_userpref)
+
+ def execute(self, context):
+ import shutil
+
+ shutil.copytree(self._old_path(), self._new_path(), symlinks=True)
+
+ # reload recent-files.txt
+ bpy.ops.wm.read_history()
+
+ # don't loose users work if they open the splash later.
+ if bpy.data.is_saved is bpy.data.is_dirty is False:
+ bpy.ops.wm.read_homefile()
+ else:
+ self.report({'INFO'}, "Reload Start-Up file to restore settings")
+
+ return {'FINISHED'}
class WM_OT_keyconfig_test(Operator):
@@ -2185,7 +2203,7 @@ class WM_OT_addon_remove(Operator):
# lame confirmation check
def draw(self, context):
self.layout.label(text="Remove Add-on: %r?" % self.module)
- path, isdir = WM_OT_addon_remove.path_from_addon(self.module)
+ path, _isdir = WM_OT_addon_remove.path_from_addon(self.module)
self.layout.label(text="Path: %r" % path)
def invoke(self, context, event):
@@ -2276,7 +2294,6 @@ class WM_OT_app_template_install(Operator):
def execute(self, context):
import traceback
import zipfile
- import shutil
import os
filepath = self.filepath
@@ -2381,7 +2398,7 @@ class WM_OT_tool_set_by_name(Operator):
if fn(context, space_type, self.name):
return {'FINISHED'}
else:
- self.report({'WARNING'}, f"Tool {self.name!r} not found.")
+ self.report({'WARNING'}, f"Tool {self.name!r:s} not found for space {space_type!r:s}.")
return {'CANCELLED'}
@@ -2389,6 +2406,10 @@ class WM_OT_toolbar(Operator):
bl_idname = "wm.toolbar"
bl_label = "Toolbar"
+ @classmethod
+ def poll(cls, context):
+ return context.space_data is not None
+
def execute(self, context):
from bl_ui.space_toolsystem_common import (
ToolSelectPanelHelper,
@@ -2406,10 +2427,7 @@ class WM_OT_toolbar(Operator):
def draw_menu(popover, context):
layout = popover.layout
-
- layout.operator_context = 'INVOKE_DEFAULT'
- layout.operator("wm.search_menu", text="Search Commands...", icon='VIEWZOOM')
-
+ layout.operator_context = 'INVOKE_REGION_WIN'
cls.draw_cls(layout, context, detect_layout=False, scale_y=1.0)
wm.popover(draw_menu, ui_units_x=8, keymap=keymap)
@@ -2499,11 +2517,11 @@ class WM_OT_studiolight_uninstall(Operator):
userpref = context.user_preferences
for studio_light in userpref.studio_lights:
if studio_light.index == self.index:
- if len(studio_light.path) > 0:
+ if studio_light.path:
self._remove_path(pathlib.Path(studio_light.path))
- if len(studio_light.path_irr_cache) > 0:
+ if studio_light.path_irr_cache:
self._remove_path(pathlib.Path(studio_light.path_irr_cache))
- if len(studio_light.path_sh_cache) > 0:
+ if studio_light.path_sh_cache:
self._remove_path(pathlib.Path(studio_light.path_sh_cache))
userpref.studio_lights.remove(studio_light)
return {'FINISHED'}
@@ -2522,6 +2540,163 @@ class WM_OT_studiolight_userpref_show(Operator):
return {'FINISHED'}
+class WM_MT_splash(Menu):
+ bl_label = "Splash"
+
+ def draw_setup(self, context):
+ layout = self.layout
+ layout.operator_context = 'EXEC_DEFAULT'
+
+ layout.label(text="Quick Setup")
+
+ split = layout.split(factor=0.25)
+ split.label()
+ split = split.split(factor=2.0 / 3.0)
+
+ col = split.column()
+
+ sub = col.column(align=True)
+ sub.label(text="Input and Shortcuts:")
+ text = bpy.path.display_name(context.window_manager.keyconfigs.active.name)
+ if not text:
+ text = "Blender (default)"
+ sub.menu("USERPREF_MT_appconfigs", text=text)
+
+ col.separator()
+
+ sub = col.column(align=True)
+ sub.label(text="Theme:")
+ label = bpy.types.USERPREF_MT_interface_theme_presets.bl_label
+ if label == "Presets":
+ label = "Blender Dark"
+ sub.menu("USERPREF_MT_interface_theme_presets", text=label)
+
+ # We need to make switching to a language easier first
+ #sub = col.column(align=False)
+ # sub.label(text="Language:")
+ #userpref = context.user_preferences
+ #sub.prop(userpref.system, "language", text="")
+
+ col.label()
+
+ layout.label()
+
+ row = layout.row()
+
+ sub = row.row()
+ if bpy.types.WM_OT_copy_prev_settings.poll(context):
+ old_version = bpy.types.WM_OT_copy_prev_settings.previous_version()
+ sub.operator("wm.copy_prev_settings", text="Load %d.%d Settings" % old_version)
+ sub.operator("wm.save_userpref", text="Save New Settings")
+ else:
+ sub.label()
+ sub.label()
+ sub.operator("wm.save_userpref", text="Next")
+
+ layout.separator()
+
+ def draw(self, context):
+ # Draw setup screen if no user preferences have been saved yet.
+ import os
+
+ user_path = bpy.utils.resource_path('USER')
+ userdef_path = os.path.join(user_path, "config", "userpref.blend")
+
+ if not os.path.isfile(userdef_path):
+ self.draw_setup(context)
+ return
+
+ # Pass
+ layout = self.layout
+ layout.operator_context = 'EXEC_DEFAULT'
+ layout.emboss = 'PULLDOWN_MENU'
+
+ split = layout.split()
+
+ # Templates
+ col1 = split.column()
+ col1.label(text="New File")
+
+ bpy.types.TOPBAR_MT_file_new.draw_ex(col1, context, use_splash=True)
+
+ # Recent
+ col2 = split.column()
+ col2_title = col2.row()
+
+ found_recent = col2.template_recent_files()
+
+ if found_recent:
+ col2_title.label(text="Recent Files")
+ else:
+ # Links if no recent files
+ col2_title.label(text="Getting Started")
+
+ col2.operator(
+ "wm.url_open", text="Manual", icon='URL'
+ ).url = "https://docs.blender.org/manual/en/dev/"
+ col2.operator(
+ "wm.url_open", text="Release Notes", icon='URL',
+ ).url = "https://www.blender.org/download/releases/%d-%d/" % bpy.app.version[:2]
+ col2.operator(
+ "wm.url_open", text="Blender Website", icon='URL',
+ ).url = "https://www.blender.org"
+ col2.operator(
+ "wm.url_open", text="Credits", icon='URL',
+ ).url = "https://www.blender.org/about/credits/"
+
+ layout.separator()
+
+ split = layout.split()
+
+ col1 = split.column()
+ sub = col1.row()
+ sub.operator_context = 'INVOKE_DEFAULT'
+ sub.operator("wm.open_mainfile", text="Open...", icon='FILE_FOLDER')
+ col1.operator("wm.recover_last_session", icon='RECOVER_LAST')
+
+ col2 = split.column()
+ if found_recent:
+ col2.operator(
+ "wm.url_open", text="Release Notes", icon='URL',
+ ).url = "https://www.blender.org/download/releases/%d-%d/" % bpy.app.version[:2]
+ col2.operator(
+ "wm.url_open", text="Development Fund", icon='URL'
+ ).url = "https://fund.blender.org"
+ else:
+ col2.operator(
+ "wm.url_open", text="Development Fund", icon='URL'
+ ).url = "https://fund.blender.org"
+ col2.operator(
+ "wm.url_open", text="Donate", icon='URL'
+ ).url = "https://www.blender.org/foundation/donation-payment/"
+
+ layout.separator()
+
+
+class WM_OT_drop_blend_file(Operator):
+ bl_idname = "wm.drop_blend_file"
+ bl_label = "Handle dropped .blend file"
+ bl_options = {'INTERNAL'}
+
+ filepath: StringProperty()
+
+ def invoke(self, context, event):
+ context.window_manager.popup_menu(self.draw_menu, title=bpy.path.basename(self.filepath), icon='QUESTION')
+ return {"FINISHED"}
+
+ def draw_menu(self, menu, context):
+ layout = menu.layout
+
+ col = layout.column()
+ col.operator_context = 'EXEC_DEFAULT'
+ col.operator("wm.open_mainfile", text="Open", icon='FILE_FOLDER').filepath = self.filepath
+
+ layout.separator()
+ col = layout.column()
+ col.operator_context = 'INVOKE_DEFAULT'
+ col.operator("wm.link", text="Link...", icon='LINK_BLEND').filepath = self.filepath
+ col.operator("wm.append", text="Append...", icon='APPEND_BLEND').filepath = self.filepath
+
classes = (
BRUSH_OT_active_index_set,
WM_OT_addon_disable,
@@ -2555,6 +2730,7 @@ classes = (
WM_OT_copy_prev_settings,
WM_OT_doc_view,
WM_OT_doc_view_manual,
+ WM_OT_drop_blend_file,
WM_OT_keyconfig_activate,
WM_OT_keyconfig_export,
WM_OT_keyconfig_import,
@@ -2581,4 +2757,5 @@ classes = (
WM_OT_studiolight_userpref_show,
WM_OT_tool_set_by_name,
WM_OT_toolbar,
+ WM_MT_splash,
)
diff --git a/release/scripts/startup/bl_ui/__init__.py b/release/scripts/startup/bl_ui/__init__.py
index 73adf56cfd3..e0170c94d73 100644
--- a/release/scripts/startup/bl_ui/__init__.py
+++ b/release/scripts/startup/bl_ui/__init__.py
@@ -61,6 +61,7 @@ _modules = [
"properties_physics_smoke",
"properties_physics_softbody",
"properties_render",
+ "properties_output",
"properties_view_layer",
"properties_scene",
"properties_texture",
diff --git a/release/scripts/startup/bl_ui/properties_animviz.py b/release/scripts/startup/bl_ui/properties_animviz.py
index 7ba503bffd2..9a100a654b1 100644
--- a/release/scripts/startup/bl_ui/properties_animviz.py
+++ b/release/scripts/startup/bl_ui/properties_animviz.py
@@ -38,63 +38,68 @@ class MotionPathButtonsPanel:
# Display Range
layout.use_property_split = True
- layout.row().prop(mps, "type")
+ layout.use_property_decorate = False
- col = layout.column()
+ layout.prop(mps, "type")
- sub = col.column(align=True)
if mps.type == 'CURRENT_FRAME':
- sub.prop(mps, "frame_before", text="Frame Range Before")
- sub.prop(mps, "frame_after", text="After")
+ col = layout.column(align=True)
+ col.prop(mps, "frame_before", text="Frame Range Before")
+ col.prop(mps, "frame_after", text="After")
+ col.prop(mps, "frame_step", text="Step")
elif mps.type == 'RANGE':
+ row = layout.row()
+ sub = row.column()
+ if mps.type == 'RANGE':
+ if bones:
+ sub.operator("pose.paths_range_update", text="", icon='TIME')
+ else:
+ sub.operator("object.paths_range_update", text="", icon='TIME')
+ sub = row.column(align=True)
sub.prop(mps, "frame_start", text="Frame Range Start")
sub.prop(mps, "frame_end", text="End")
+ sub.prop(mps, "frame_step", text="Step")
- sub.prop(mps, "frame_step", text="Step")
-
- if mps.type == 'RANGE':
+ if mpath:
+ col = layout.column(align=True)
+ col.enabled = False
if bones:
- sub.operator("pose.paths_range_update")
+ col.prop(mpath, "frame_start", text="Bone Cache From")
else:
- sub.operator("object.paths_range_update")
-
- col = layout.column(align=True)
- if bones:
- col.label(text="Cache for Bone:")
- else:
- col.label(text="Cache")
+ col.prop(mpath, "frame_start", text="Cache From")
+ col.prop(mpath, "frame_end", text="To")
- if mpath:
- sub = col.column(align=True)
- sub.enabled = False
- sub.prop(mpath, "frame_start", text="From")
- sub.prop(mpath, "frame_end", text="To")
-
- sub = col.row(align=True)
+ row = layout.row(align=True)
if bones:
- sub.operator("pose.paths_update", text="Update Paths", icon='BONE_DATA')
- sub.operator("pose.paths_clear", text="", icon='X')
+ row.operator("pose.paths_update", text="Update Paths", icon='BONE_DATA')
+ row.operator("pose.paths_clear", text="", icon='X')
else:
- sub.operator("object.paths_update", text="Update Paths", icon='OBJECT_DATA')
- sub.operator("object.paths_clear", text="", icon='X')
+ row.operator("object.paths_update", text="Update Paths", icon='OBJECT_DATA')
+ row.operator("object.paths_clear", text="", icon='X')
else:
- sub = col.column(align=True)
- sub.label(text="Nothing to show yet...", icon='ERROR')
+ col = layout.column(align=True)
+ col.label(text="Nothing to show yet...", icon='ERROR')
if bones:
- sub.operator("pose.paths_calculate", text="Calculate...", icon='BONE_DATA')
+ col.operator("pose.paths_calculate", text="Calculate...", icon='BONE_DATA')
else:
- sub.operator("object.paths_calculate", text="Calculate...", icon='OBJECT_DATA')
+ col.operator("object.paths_calculate", text="Calculate...", icon='OBJECT_DATA')
- # Display Settings
- layout.label(text="Display")
+class MotionPathButtonsPanel_display:
+ bl_space_type = 'PROPERTIES'
+ bl_region_type = 'WINDOW'
+ bl_label = "Display"
+
+ def draw_settings(self, context, avs, mpath, bones=False):
+ layout = self.layout
+
+ mps = avs.motion_path
+
+ layout.use_property_split = True
+ layout.use_property_decorate = False
col = layout.column()
col.prop(mps, "show_frame_numbers", text="Frame Numbers")
- if mpath is not None:
- col.prop(mpath, "lines", text="Lines")
- col.prop(mpath, "line_thickness", text="Thickness")
-
col.prop(mps, "show_keyframe_highlight", text="Keyframes")
sub = col.column()
sub.enabled = mps.show_keyframe_highlight
@@ -104,11 +109,15 @@ class MotionPathButtonsPanel:
# Customize path
if mpath is not None:
+ col.prop(mpath, "lines", text="Lines")
+ col.prop(mpath, "line_thickness", text="Thickness")
+
+ split = col.split(factor=0.6)
- col.prop(mpath, "use_custom_color", text="Custom Color")
- sub = col.column()
+ split.prop(mpath, "use_custom_color", text="Custom Color")
+ sub = split.column()
sub.enabled = mpath.use_custom_color
- sub.prop(mpath, "color")
+ sub.prop(mpath, "color", text="")
# FIXME: this panel still needs to be ported so that it will work correctly with animviz
diff --git a/release/scripts/startup/bl_ui/properties_constraint.py b/release/scripts/startup/bl_ui/properties_constraint.py
index 76b87a9011d..dcd84d105ad 100644
--- a/release/scripts/startup/bl_ui/properties_constraint.py
+++ b/release/scripts/startup/bl_ui/properties_constraint.py
@@ -748,6 +748,9 @@ class ConstraintButtonsPanel:
layout.prop(con, "distance")
layout.prop(con, "shrinkwrap_type")
+ if con.shrinkwrap_type in {'PROJECT', 'NEAREST_SURFACE', 'TARGET_PROJECT'}:
+ layout.prop(con, 'wrap_mode', text="Snap Mode")
+
if con.shrinkwrap_type == 'PROJECT':
row = layout.row(align=True)
row.prop(con, "project_axis", expand=True)
@@ -755,8 +758,24 @@ class ConstraintButtonsPanel:
split.label(text="Axis Space:")
rowsub = split.row()
rowsub.prop(con, "project_axis_space", text="")
+ split = layout.split(factor=0.4)
+ split.label(text="Face Culling:")
+ rowsub = split.row()
+ rowsub.prop(con, "cull_face", expand=True)
+ row = layout.row()
+ row.prop(con, "use_project_opposite")
+ rowsub = row.row()
+ rowsub.active = con.use_project_opposite and con.cull_face != 'OFF'
+ rowsub.prop(con, "use_invert_cull")
layout.prop(con, "project_limit")
+ if con.shrinkwrap_type in {'PROJECT', 'NEAREST_SURFACE', 'TARGET_PROJECT'}:
+ layout.prop(con, "use_track_normal")
+
+ row = layout.row(align=True)
+ row.active = con.use_track_normal
+ row.prop(con, "track_axis", expand=True)
+
def DAMPED_TRACK(self, context, layout, con):
self.target_template(layout, con)
@@ -900,6 +919,46 @@ class ConstraintButtonsPanel:
def SCRIPT(self, context, layout, con):
layout.label(text="Blender 2.6 doesn't support python constraints yet")
+ def ARMATURE(self, context, layout, con):
+ topcol = layout.column()
+ topcol.use_property_split = True
+ topcol.operator("constraint.add_target", text="Add Target Bone")
+
+ if not con.targets:
+ box = topcol.box()
+ box.label(text="No target bones were added", icon="ERROR")
+
+ for i, tgt in enumerate(con.targets):
+ box = topcol.box()
+
+ has_target = tgt.target is not None
+
+ header = box.row()
+ header.use_property_split = False
+
+ split = header.split(factor=0.45, align=True)
+ split.prop(tgt, "target", text="")
+
+ row = split.row(align=True)
+ row.active = has_target
+ if has_target:
+ row.prop_search(tgt, "subtarget", tgt.target.data, "bones", text="")
+ else:
+ row.prop(tgt, "subtarget", text="", icon="BONE_DATA")
+
+ header.operator("constraint.remove_target", icon="REMOVE", text="").index = i
+
+ col = box.column()
+ col.active = has_target and tgt.subtarget != ""
+ col.prop(tgt, "weight", slider=True)
+
+ topcol.operator("constraint.normalize_target_weights")
+ topcol.prop(con, "use_deform_preserve_volume")
+ topcol.prop(con, "use_bone_envelopes")
+
+ if context.pose_bone:
+ topcol.prop(con, "use_current_location")
+
class OBJECT_PT_constraints(ConstraintButtonsPanel, Panel):
bl_label = "Object Constraints"
diff --git a/release/scripts/startup/bl_ui/properties_data_armature.py b/release/scripts/startup/bl_ui/properties_data_armature.py
index 8ea20ada390..16d40e25324 100644
--- a/release/scripts/startup/bl_ui/properties_data_armature.py
+++ b/release/scripts/startup/bl_ui/properties_data_armature.py
@@ -68,6 +68,7 @@ class DATA_PT_skeleton(ArmatureButtonsPanel, Panel):
class DATA_PT_display(ArmatureButtonsPanel, Panel):
bl_label = "Display"
+ bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
@@ -75,7 +76,7 @@ class DATA_PT_display(ArmatureButtonsPanel, Panel):
ob = context.object
arm = context.armature
- layout.row().prop(arm, "draw_type", expand=True)
+ layout.row().prop(arm, "display_type", expand=True)
layout.use_property_split = True
@@ -85,7 +86,7 @@ class DATA_PT_display(ArmatureButtonsPanel, Panel):
col.prop(arm, "show_bone_custom_shapes", text="Shapes")
col.prop(arm, "show_group_colors", text="Group Colors")
if ob:
- col.prop(ob, "show_x_ray", text="X-Ray")
+ col.prop(ob, "show_in_front", text="In Front")
col.prop(arm, "use_deform_delay", text="Delay Refresh")
@@ -100,6 +101,7 @@ class DATA_MT_bone_group_specials(Menu):
class DATA_PT_bone_groups(ArmatureButtonsPanel, Panel):
bl_label = "Bone Groups"
+ bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
@@ -121,8 +123,8 @@ class DATA_PT_bone_groups(ArmatureButtonsPanel, Panel):
col = row.column(align=True)
col.active = (ob.proxy is None)
- col.operator("pose.group_add", icon='ZOOMIN', text="")
- col.operator("pose.group_remove", icon='ZOOMOUT', text="")
+ col.operator("pose.group_add", icon='ADD', text="")
+ col.operator("pose.group_remove", icon='REMOVE', text="")
col.menu("DATA_MT_bone_group_specials", icon='DOWNARROW_HLT', text="")
if group:
col.separator()
@@ -173,7 +175,7 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, Panel):
if poselib:
# warning about poselib being in an invalid state
- if len(poselib.fcurves) > 0 and len(poselib.pose_markers) == 0:
+ if poselib.fcurves and not poselib.pose_markers:
layout.label(icon='ERROR', text="Error: Potentially corrupt library, run 'Sanitize' operator to fix")
# list of poses in pose library
@@ -187,14 +189,14 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, Panel):
# invoke should still be used for 'add', as it is needed to allow
# add/replace options to be used properly
- col.operator("poselib.pose_add", icon='ZOOMIN', text="")
+ col.operator("poselib.pose_add", icon='ADD', text="")
col.operator_context = 'EXEC_DEFAULT' # exec not invoke, so that menu doesn't need showing
pose_marker_active = poselib.pose_markers.active
if pose_marker_active is not None:
- col.operator("poselib.pose_remove", icon='ZOOMOUT', text="")
+ col.operator("poselib.pose_remove", icon='REMOVE', text="")
col.operator(
"poselib.apply_pose",
icon='ZOOM_SELECTED',
@@ -288,12 +290,14 @@ class DATA_PT_iksolver_itasc(ArmatureButtonsPanel, Panel):
from .properties_animviz import (
MotionPathButtonsPanel,
+ MotionPathButtonsPanel_display,
OnionSkinButtonsPanel,
)
class DATA_PT_motion_paths(MotionPathButtonsPanel, Panel):
#bl_label = "Bones Motion Paths"
+ bl_options = {'DEFAULT_CLOSED'}
bl_context = "data"
@classmethod
@@ -313,6 +317,29 @@ class DATA_PT_motion_paths(MotionPathButtonsPanel, Panel):
self.draw_settings(context, avs, mpath, bones=True)
+class DATA_PT_motion_paths_display(MotionPathButtonsPanel_display, Panel):
+ #bl_label = "Bones Motion Paths"
+ bl_context = "data"
+ bl_parent_id = "DATA_PT_motion_paths"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ # XXX: include pose-mode check?
+ return (context.object) and (context.armature)
+
+ def draw(self, context):
+ # layout = self.layout
+
+ ob = context.object
+ avs = ob.pose.animation_visualization
+
+ pchan = context.active_pose_bone
+ mpath = pchan.motion_path if pchan else None
+
+ self.draw_settings(context, avs, mpath, bones=True)
+
+
class DATA_PT_onion_skinning(OnionSkinButtonsPanel): # , Panel): # inherit from panel when ready
#bl_label = "Bones Onion Skinning"
bl_context = "data"
@@ -320,7 +347,7 @@ class DATA_PT_onion_skinning(OnionSkinButtonsPanel): # , Panel): # inherit from
@classmethod
def poll(cls, context):
# XXX: include pose-mode check?
- return (context.object) and (context.armature)
+ return context.object and context.armature
def draw(self, context):
ob = context.object
@@ -342,6 +369,7 @@ classes = (
DATA_PT_bone_groups,
DATA_PT_pose_library,
DATA_PT_motion_paths,
+ DATA_PT_motion_paths_display,
DATA_PT_ghost,
DATA_PT_iksolver_itasc,
DATA_PT_custom_props_arm,
diff --git a/release/scripts/startup/bl_ui/properties_data_bone.py b/release/scripts/startup/bl_ui/properties_data_bone.py
index 3fc0c66b0b4..4fafadc0559 100644
--- a/release/scripts/startup/bl_ui/properties_data_bone.py
+++ b/release/scripts/startup/bl_ui/properties_data_bone.py
@@ -123,13 +123,14 @@ class BONE_PT_transform(BoneButtonsPanel, Panel):
class BONE_PT_curved(BoneButtonsPanel, Panel):
bl_label = "Bendy Bones"
- #bl_options = {'DEFAULT_CLOSED'}
+ bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
ob = context.object
bone = context.bone
# arm = context.armature
pchan = None
+ bone_list = "bones"
if ob and bone:
pchan = ob.pose.bones[bone.name]
@@ -137,6 +138,7 @@ class BONE_PT_curved(BoneButtonsPanel, Panel):
elif bone is None:
bone = context.edit_bone
bbone = bone
+ bone_list = "edit_bones"
else:
bbone = bone
@@ -169,27 +171,23 @@ class BONE_PT_curved(BoneButtonsPanel, Panel):
col.prop(bbone, "bbone_easein", text="Ease In")
col.prop(bbone, "bbone_easeout", text="Out")
- if pchan:
- topcol.separator()
-
- col = topcol.column()
- col.use_property_split = False
- col.prop(pchan, "use_bbone_custom_handles")
+ col = topcol.column(align=True)
+ col.prop(bone, "bbone_handle_type_start", text="Start Handle")
- col = topcol.column(align=True)
- col.active = pchan.use_bbone_custom_handles
- col.use_property_split = True
+ col = col.column(align=True)
+ col.active = (bone.bbone_handle_type_start != "AUTO")
+ col.prop_search(bone, "bbone_custom_handle_start", ob.data, bone_list, text="Custom")
- sub = col.column()
- sub.prop_search(pchan, "bbone_custom_handle_start", ob.pose, "bones", text="Custom Handle Start")
- sub.prop_search(pchan, "bbone_custom_handle_end", ob.pose, "bones", text="End")
+ col = topcol.column(align=True)
+ col.prop(bone, "bbone_handle_type_end", text="End Handle")
- sub = col.column(align=True)
- sub.prop(pchan, "use_bbone_relative_start_handle", text="Relative Handle Start")
- sub.prop(pchan, "use_bbone_relative_end_handle", text="End")
+ col = col.column(align=True)
+ col.active = (bone.bbone_handle_type_end != "AUTO")
+ col.prop_search(bone, "bbone_custom_handle_end", ob.data, bone_list, text="Custom")
class BONE_PT_relations(BoneButtonsPanel, Panel):
+ bl_options = {'DEFAULT_CLOSED'}
bl_label = "Relations"
def draw(self, context):
@@ -235,6 +233,7 @@ class BONE_PT_relations(BoneButtonsPanel, Panel):
class BONE_PT_display(BoneButtonsPanel, Panel):
bl_label = "Display"
+ bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
diff --git a/release/scripts/startup/bl_ui/properties_data_camera.py b/release/scripts/startup/bl_ui/properties_data_camera.py
index 0ecce3b2f78..a66e82c7f74 100644
--- a/release/scripts/startup/bl_ui/properties_data_camera.py
+++ b/release/scripts/startup/bl_ui/properties_data_camera.py
@@ -18,7 +18,7 @@
# <pep8 compliant>
import bpy
-from bpy.types import Panel, Menu
+from bpy.types import Panel
from rna_prop_ui import PropertyPanel
from bl_operators.presets import PresetMenu
@@ -181,6 +181,7 @@ class DATA_PT_camera_stereoscopy(CameraButtonsPanel, Panel):
class DATA_PT_camera(CameraButtonsPanel, Panel):
bl_label = "Camera"
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
def draw_header_preset(self, context):
@@ -218,7 +219,6 @@ class DATA_PT_camera_dof(CameraButtonsPanel, Panel):
layout.use_property_split = True
cam = context.camera
- dof_options = cam.gpu_dof
col = layout.column()
col.prop(cam, "dof_object", text="Focus on Object")
@@ -268,6 +268,8 @@ class DATA_PT_camera_background_image(CameraButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
cam = context.camera
use_multiview = context.scene.render.use_multiview
@@ -339,27 +341,25 @@ class DATA_PT_camera_background_image(CameraButtonsPanel, Panel):
column = box.column()
column.active = has_bg
- column.prop(bg.clip_user, "proxy_render_size", text="")
column.prop(bg.clip_user, "use_render_undistorted")
+ column.prop(bg.clip_user, "proxy_render_size")
if has_bg:
col = box.column()
col.prop(bg, "alpha", slider=True)
- col.row().prop(bg, "draw_depth", expand=True)
+ col.row().prop(bg, "display_depth", expand=True)
col.row().prop(bg, "frame_method", expand=True)
- box = col.box()
row = box.row()
row.prop(bg, "offset")
- row = box.row()
- row.prop(bg, "use_flip_x")
- row.prop(bg, "use_flip_y")
+ col = box.column()
+ col.prop(bg, "rotation")
+ col.prop(bg, "scale")
- row = box.row()
- row.prop(bg, "rotation")
- row.prop(bg, "scale")
+ col.prop(bg, "use_flip_x")
+ col.prop(bg, "use_flip_y")
class DATA_PT_camera_display(CameraButtonsPanel, Panel):
@@ -380,7 +380,7 @@ class DATA_PT_camera_display(CameraButtonsPanel, Panel):
col = layout.column(align=True)
col.separator()
- col.prop(cam, "draw_size", text="Size")
+ col.prop(cam, "display_size", text="Size")
col.separator()
col.prop(cam, "show_passepartout", text="Passepartout")
sub = col.column()
@@ -450,13 +450,13 @@ classes = (
SAFE_AREAS_PT_presets,
DATA_PT_context_camera,
DATA_PT_lens,
- DATA_PT_camera,
- DATA_PT_camera_stereoscopy,
DATA_PT_camera_dof,
DATA_PT_camera_dof_aperture,
- DATA_PT_camera_display,
+ DATA_PT_camera,
+ DATA_PT_camera_stereoscopy,
DATA_PT_camera_safe_areas,
DATA_PT_camera_background_image,
+ DATA_PT_camera_display,
DATA_PT_custom_props_camera,
)
diff --git a/release/scripts/startup/bl_ui/properties_data_curve.py b/release/scripts/startup/bl_ui/properties_data_curve.py
index 671cff4ebb4..9155da14c6b 100644
--- a/release/scripts/startup/bl_ui/properties_data_curve.py
+++ b/release/scripts/startup/bl_ui/properties_data_curve.py
@@ -156,6 +156,7 @@ class DATA_PT_curve_texture_space(CurveButtonsPanel, Panel):
class DATA_PT_geometry_curve(CurveButtonsPanelCurve, Panel):
bl_label = "Geometry"
+ bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
@@ -226,6 +227,7 @@ class DATA_PT_geometry_curve_bevel(CurveButtonsPanelCurve, Panel):
class DATA_PT_pathanim(CurveButtonsPanelCurve, Panel):
bl_label = "Path Animation"
+ bl_options = {'DEFAULT_CLOSED'}
def draw_header(self, context):
curve = context.curve
@@ -252,6 +254,7 @@ class DATA_PT_pathanim(CurveButtonsPanelCurve, Panel):
class DATA_PT_active_spline(CurveButtonsPanelActive, Panel):
bl_label = "Active Spline"
+ bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
@@ -321,6 +324,7 @@ class DATA_PT_active_spline(CurveButtonsPanelActive, Panel):
class DATA_PT_font(CurveButtonsPanelText, Panel):
bl_label = "Font"
+ bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
@@ -358,7 +362,6 @@ class DATA_PT_font_transform(CurveButtonsPanelText, Panel):
layout = self.layout
text = context.curve
- char = context.curve.edit_format
layout.use_property_split = True
@@ -387,9 +390,8 @@ class DATA_PT_paragraph(CurveButtonsPanelText, Panel):
bl_label = "Paragraph"
def draw(self, context):
- layout = self.layout
-
- text = context.curve
+ # Parent panel
+ pass
class DATA_PT_paragraph_alignment(CurveButtonsPanelText, Panel):
@@ -398,12 +400,13 @@ class DATA_PT_paragraph_alignment(CurveButtonsPanelText, Panel):
def draw(self, context):
layout = self.layout
- layout.use_property_split = False
+ layout.use_property_split = True
text = context.curve
- layout.row().prop(text, "align_x", expand=True)
- layout.row().prop(text, "align_y", expand=True)
+ col = layout.column()
+ col.prop(text, "align_x", text="Horizontal")
+ col.prop(text, "align_y", text="Vertical")
class DATA_PT_paragraph_spacing(CurveButtonsPanelText, Panel):
@@ -430,13 +433,14 @@ class DATA_PT_paragraph_spacing(CurveButtonsPanelText, Panel):
class DATA_PT_text_boxes(CurveButtonsPanelText, Panel):
bl_label = "Text Boxes"
+ bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
text = context.curve
- layout.operator("font.textbox_add", icon='ZOOMIN')
+ layout.operator("font.textbox_add", icon='ADD')
for i, box in enumerate(text.text_boxes):
diff --git a/release/scripts/startup/bl_ui/properties_data_empty.py b/release/scripts/startup/bl_ui/properties_data_empty.py
index ab12d0f5c5f..f3a176a52fc 100644
--- a/release/scripts/startup/bl_ui/properties_data_empty.py
+++ b/release/scripts/startup/bl_ui/properties_data_empty.py
@@ -40,23 +40,23 @@ class DATA_PT_empty(DataButtonsPanel, Panel):
ob = context.object
- layout.prop(ob, "empty_draw_type", text="Display As")
+ layout.prop(ob, "empty_display_type", text="Display As")
+ layout.prop(ob, "empty_display_size", text="Size")
- if ob.empty_draw_type == 'IMAGE':
+ if ob.empty_display_type == 'IMAGE':
layout.template_ID(ob, "data", open="image.open", unlink="object.unlink_data")
layout.template_image(ob, "data", ob.image_user, compact=True)
- row = layout.row(align=True)
- row = layout.row(align=True)
+ layout.row(align=True).row(align=True)
layout.prop(ob, "color", text="Transparency", index=3, slider=True)
col = layout.column(align=True)
col.prop(ob, "empty_image_offset", text="Offset X", index=0)
col.prop(ob, "empty_image_offset", text="Y", index=1)
- layout.separator()
-
- layout.prop(ob, "empty_draw_size", text="Size")
+ layout.prop(ob, "empty_image_depth", text="Depth", expand=True)
+ layout.prop(ob, "show_empty_image_orthographic", text="Display Orthographic")
+ layout.prop(ob, "show_empty_image_perspective", text="Display Perspective")
classes = (
diff --git a/release/scripts/startup/bl_ui/properties_data_gpencil.py b/release/scripts/startup/bl_ui/properties_data_gpencil.py
index 8230047657b..949a48ed7f1 100644
--- a/release/scripts/startup/bl_ui/properties_data_gpencil.py
+++ b/release/scripts/startup/bl_ui/properties_data_gpencil.py
@@ -22,6 +22,7 @@ from bpy.types import Menu, Panel, UIList
from rna_prop_ui import PropertyPanel
from .properties_grease_pencil_common import (
GreasePencilOnionPanel,
+ GPENCIL_UL_layer,
)
###############################
@@ -62,53 +63,18 @@ class DATA_PT_gpencil(DataButtonsPanel, Panel):
# Grease Pencil data selector
gpd_owner = context.gpencil_data_owner
- gpd = context.gpencil_data
layout.template_ID(gpd_owner, "data")
-class GPENCIL_UL_layer(UIList):
- def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
- # assert(isinstance(item, bpy.types.GPencilLayer)
- gpl = item
- gpd = context.gpencil_data
-
- if self.layout_type in {'DEFAULT', 'COMPACT'}:
- if gpl.lock:
- layout.active = False
-
- row = layout.row(align=True)
- if gpl.is_parented:
- icon = 'BONE_DATA'
- else:
- icon = 'BLANK1'
-
- row.label(text="", icon=icon)
- row.prop(gpl, "info", text="", emboss=False)
-
- row = layout.row(align=True)
- row.prop(gpl, "lock", text="", emboss=False)
- row.prop(gpl, "hide", text="", emboss=False)
- row.prop(gpl, "unlock_color", text="", emboss=False)
- if gpl.use_onion_skinning is False:
- icon = 'GHOST_DISABLED'
- else:
- icon = 'GHOST_ENABLED'
- subrow = row.row(align=True)
- subrow.prop(gpl, "use_onion_skinning", text="", icon=icon, emboss=False)
- subrow.active = gpd.use_onion_skinning
- elif self.layout_type == 'GRID':
- layout.alignment = 'CENTER'
- layout.label(text="", icon_value=icon)
-
-
class GPENCIL_MT_layer_specials(Menu):
bl_label = "Layer"
def draw(self, context):
layout = self.layout
+ gpd = context.gpencil_data
- layout.operator("gpencil.layer_duplicate", icon='COPY_ID') # XXX: needs a dedicated icon
+ layout.operator("gpencil.layer_duplicate", icon='ADD') # XXX: needs a dedicated icon
layout.separator()
@@ -119,10 +85,11 @@ class GPENCIL_MT_layer_specials(Menu):
layout.operator("gpencil.lock_all", icon='LOCKED', text="Lock All")
layout.operator("gpencil.unlock_all", icon='UNLOCKED', text="UnLock All")
+ layout.prop(gpd, "use_autolock_layers", text="Autolock Inactive Layers")
layout.separator()
- layout.operator("gpencil.layer_merge", icon='NLA', text="Merge Down")
+ layout.operator("gpencil.layer_merge", icon='SORT_ASC', text="Merge Down")
layout.separator()
layout.menu("VIEW3D_MT_gpencil_copy_layer")
@@ -160,20 +127,19 @@ class DATA_PT_gpencil_datapanel(Panel):
self.draw_layers(context, layout, gpd)
def draw_layers(self, context, layout, gpd):
+
row = layout.row()
col = row.column()
- if len(gpd.layers) >= 2:
- layer_rows = 5
- else:
- layer_rows = 2
- col.template_list("GPENCIL_UL_layer", "", gpd, "layers", gpd.layers, "active_index", rows=layer_rows)
+ layer_rows = 7
+ col.template_list("GPENCIL_UL_layer", "", gpd, "layers", gpd.layers, "active_index",
+ rows=layer_rows, reverse=True)
col = row.column()
sub = col.column(align=True)
- sub.operator("gpencil.layer_add", icon='ZOOMIN', text="")
- sub.operator("gpencil.layer_remove", icon='ZOOMOUT', text="")
+ sub.operator("gpencil.layer_add", icon='ADD', text="")
+ sub.operator("gpencil.layer_remove", icon='REMOVE', text="")
gpl = context.active_gpencil_layer
if gpl:
@@ -190,7 +156,7 @@ class DATA_PT_gpencil_datapanel(Panel):
sub = col.column(align=True)
sub.operator("gpencil.layer_isolate", icon='LOCKED', text="").affect_visibility = False
- sub.operator("gpencil.layer_isolate", icon='RESTRICT_VIEW_OFF', text="").affect_visibility = True
+ sub.operator("gpencil.layer_isolate", icon='RESTRICT_VIEW_ON', text="").affect_visibility = True
row = layout.row(align=True)
if gpl:
@@ -208,6 +174,7 @@ class DATA_PT_gpencil_layer_optionpanel(LayerDataButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ scene = context.scene
gpl = context.active_gpencil_layer
layout.active = not gpl.lock
@@ -223,6 +190,15 @@ class DATA_PT_gpencil_layer_optionpanel(LayerDataButtonsPanel, Panel):
col = layout.row(align=True)
col.prop(gpl, "line_change", text="Stroke Thickness")
+ col = layout.row(align=True)
+ col.prop(gpl, "pass_index")
+
+ col = layout.row(align=True)
+ col.prop_search(gpl, "viewlayer_render", scene, "view_layers", text="View Layer")
+
+ col = layout.row(align=True)
+ col.prop(gpl, "lock_material")
+
class DATA_PT_gpencil_parentpanel(LayerDataButtonsPanel, Panel):
bl_space_type = 'PROPERTIES'
@@ -335,8 +311,8 @@ class DATA_PT_gpencil_vertexpanel(DataButtonsPanel, Panel):
row.template_list("GPENCIL_UL_vgroups", "", ob, "vertex_groups", ob.vertex_groups, "active_index", rows=rows)
col = row.column(align=True)
- col.operator("object.vertex_group_add", icon='ZOOMIN', text="")
- col.operator("object.vertex_group_remove", icon='ZOOMOUT', text="").all = False
+ col.operator("object.vertex_group_add", icon='ADD', text="")
+ col.operator("object.vertex_group_remove", icon='REMOVE', text="").all = False
if ob.vertex_groups:
row = layout.row()
@@ -359,6 +335,7 @@ class DATA_PT_gpencil_display(DataButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
ob = context.object
@@ -366,10 +343,7 @@ class DATA_PT_gpencil_display(DataButtonsPanel, Panel):
gpl = context.active_gpencil_layer
layout.prop(gpd, "xray_mode", text="Depth Ordering")
- layout.prop(gpd, "edit_line_color", text="Edit Line Color")
- layout.prop(ob, "empty_draw_size", text="Marker Size")
-
- layout.prop(gpd, "use_force_fill_recalc", text="Force Fill Update")
+ layout.prop(ob, "empty_display_size", text="Marker Size")
col = layout.column(align=True)
col.prop(gpd, "show_constant_thickness")
@@ -377,9 +351,35 @@ class DATA_PT_gpencil_display(DataButtonsPanel, Panel):
sub.active = not gpd.show_constant_thickness
sub.prop(gpd, "pixel_factor", text="Thickness Scale")
+ layout.prop(gpd, "edit_line_color", text="Edit Line Color")
if gpl:
layout.prop(gpd, "show_stroke_direction", text="Show Stroke Directions")
+ layout.prop(gpd, "use_force_fill_recalc", text="Force Fill Update")
+ layout.prop(gpd, "use_adaptative_uv", text="Adaptative UVs")
+
+
+class DATA_PT_gpencil_canvas(DataButtonsPanel, Panel):
+ bl_label = "Canvas"
+ bl_parent_id = 'DATA_PT_gpencil_display'
+ bl_options = {'DEFAULT_CLOSED'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+ gpd = context.gpencil_data
+ grid = gpd.grid
+
+ row = layout.row(align=True)
+ col = row.column()
+ col.prop(grid, "color", text="Color")
+ col.prop(grid, "scale", text="Scale")
+ col.prop(grid, "offset")
+ row = layout.row(align=True)
+ col = row.column()
+ col.prop(grid, "lines", text="Subdivisions")
+
class DATA_PT_custom_props_gpencil(DataButtonsPanel, PropertyPanel, Panel):
_context_path = "object.data"
@@ -396,9 +396,9 @@ classes = (
DATA_PT_gpencil_parentpanel,
DATA_PT_gpencil_vertexpanel,
DATA_PT_gpencil_display,
+ DATA_PT_gpencil_canvas,
DATA_PT_custom_props_gpencil,
- GPENCIL_UL_layer,
GPENCIL_UL_vgroups,
GPENCIL_MT_layer_specials,
diff --git a/release/scripts/startup/bl_ui/properties_data_light.py b/release/scripts/startup/bl_ui/properties_data_light.py
index f5c985f2abe..8aa70d1e05f 100644
--- a/release/scripts/startup/bl_ui/properties_data_light.py
+++ b/release/scripts/startup/bl_ui/properties_data_light.py
@@ -107,6 +107,7 @@ class DATA_PT_EEVEE_light(DataButtonsPanel, Panel):
class DATA_PT_EEVEE_shadow(DataButtonsPanel, Panel):
bl_label = "Shadow"
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
diff --git a/release/scripts/startup/bl_ui/properties_data_lightprobe.py b/release/scripts/startup/bl_ui/properties_data_lightprobe.py
index 4faf1fcef3d..2ca7e1723b6 100644
--- a/release/scripts/startup/bl_ui/properties_data_lightprobe.py
+++ b/release/scripts/startup/bl_ui/properties_data_lightprobe.py
@@ -58,7 +58,6 @@ class DATA_PT_lightprobe(DataButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- ob = context.object
probe = context.lightprobe
# layout.prop(probe, "type")
@@ -94,7 +93,7 @@ class DATA_PT_lightprobe(DataButtonsPanel, Panel):
sub = col.column()
sub.prop(probe, "clip_start", text="Clipping Start")
- if probe.type != "PLANAR":
+ if probe.type != 'PLANAR':
sub.prop(probe, "clip_end", text="End")
if probe.type == 'GRID':
@@ -113,6 +112,7 @@ class DATA_PT_lightprobe(DataButtonsPanel, Panel):
class DATA_PT_lightprobe_parallax(DataButtonsPanel, Panel):
bl_label = "Custom Parallax"
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
@@ -142,7 +142,8 @@ class DATA_PT_lightprobe_parallax(DataButtonsPanel, Panel):
class DATA_PT_lightprobe_display(DataButtonsPanel, Panel):
- bl_label = "Display"
+ bl_label = "Viewport Display"
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE'}
def draw(self, context):
@@ -155,7 +156,7 @@ class DATA_PT_lightprobe_display(DataButtonsPanel, Panel):
col = layout.column()
if probe.type == 'PLANAR':
- col.prop(ob, "empty_draw_size", text="Arrow Size")
+ col.prop(ob, "empty_display_size", text="Arrow Size")
col.prop(probe, "show_data")
if probe.type in {'GRID', 'CUBEMAP'}:
diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py
index d455b56b3f4..dd828c7a8c6 100644
--- a/release/scripts/startup/bl_ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@ -29,20 +29,23 @@ class MESH_MT_vertex_group_specials(Menu):
layout = self.layout
layout.operator("object.vertex_group_sort", icon='SORTALPHA', text="Sort by Name").sort_type = 'NAME'
- layout.operator("object.vertex_group_sort", icon='ARMATURE_DATA', text="Sort by Bone Hierarchy").sort_type = 'BONE_HIERARCHY'
- layout.operator("object.vertex_group_copy", icon='COPY_ID')
- layout.operator("object.vertex_group_copy_to_linked", icon='LINK_AREA')
- layout.operator("object.vertex_group_copy_to_selected", icon='LINK_AREA')
+ layout.operator("object.vertex_group_sort", icon='BONE_DATA', text="Sort by Bone Hierarchy").sort_type = 'BONE_HIERARCHY'
+ layout.separator()
+ layout.operator("object.vertex_group_copy", icon='DUPLICATE')
+ layout.operator("object.vertex_group_copy_to_linked")
+ layout.operator("object.vertex_group_copy_to_selected")
+ layout.separator()
layout.operator("object.vertex_group_mirror", icon='ARROW_LEFTRIGHT').use_topology = False
- layout.operator("object.vertex_group_mirror", text="Mirror Vertex Group (Topology)", icon='ARROW_LEFTRIGHT').use_topology = True
+ layout.operator("object.vertex_group_mirror", text="Mirror Vertex Group (Topology)").use_topology = True
+ layout.separator()
layout.operator("object.vertex_group_remove_from", icon='X', text="Remove from All Groups").use_all_groups = True
- layout.operator("object.vertex_group_remove_from", icon='X', text="Clear Active Group").use_all_verts = True
- layout.operator("object.vertex_group_remove", icon='X', text="Delete All Unlocked Groups").all_unlocked = True
- layout.operator("object.vertex_group_remove", icon='X', text="Delete All Groups").all = True
+ layout.operator("object.vertex_group_remove_from", text="Clear Active Group").use_all_verts = True
+ layout.operator("object.vertex_group_remove", text="Delete All Unlocked Groups").all_unlocked = True
+ layout.operator("object.vertex_group_remove", text="Delete All Groups").all = True
layout.separator()
layout.operator("object.vertex_group_lock", icon='LOCKED', text="Lock All").action = 'LOCK'
layout.operator("object.vertex_group_lock", icon='UNLOCKED', text="UnLock All").action = 'UNLOCK'
- layout.operator("object.vertex_group_lock", icon='LOCKED', text="Lock Invert All").action = 'INVERT'
+ layout.operator("object.vertex_group_lock", text="Lock Invert All").action = 'INVERT'
class MESH_MT_shape_key_specials(Menu):
@@ -51,12 +54,16 @@ class MESH_MT_shape_key_specials(Menu):
def draw(self, context):
layout = self.layout
- layout.operator("object.shape_key_transfer", icon='COPY_ID') # icon is not ideal
- layout.operator("object.join_shapes", icon='COPY_ID') # icon is not ideal
+ layout.operator("object.shape_key_add", icon='ADD', text="New Shape From Mix").from_mix = True
+ layout.separator()
layout.operator("object.shape_key_mirror", icon='ARROW_LEFTRIGHT').use_topology = False
- layout.operator("object.shape_key_mirror", text="Mirror Shape Key (Topology)", icon='ARROW_LEFTRIGHT').use_topology = True
- layout.operator("object.shape_key_add", icon='ZOOMIN', text="New Shape From Mix").from_mix = True
- layout.operator("object.shape_key_remove", icon='X', text="Delete All Shapes").all = True
+ layout.operator("object.shape_key_mirror", text="Mirror Shape Key (Topology)").use_topology = True
+ layout.separator()
+ layout.operator("object.join_shapes")
+ layout.operator("object.shape_key_transfer")
+ layout.separator()
+ layout.operator("object.shape_key_remove", icon='X', text="Delete All Shape Keys").all = True
+ layout.separator()
layout.operator("object.shape_key_move", icon='TRIA_UP_BAR', text="Move To Top").type = 'TOP'
layout.operator("object.shape_key_move", icon='TRIA_DOWN_BAR', text="Move To Bottom").type = 'BOTTOM'
@@ -79,7 +86,7 @@ class MESH_UL_fmaps(UIList):
# assert(isinstance(item, bpy.types.FaceMap))
fmap = item
if self.layout_type in {'DEFAULT', 'COMPACT'}:
- layout.prop(fmap, "name", text="", emboss=False, icon_value=icon)
+ layout.prop(fmap, "name", text="", emboss=False, icon='FACE_MAPS')
elif self.layout_type in {'GRID'}:
layout.alignment = 'CENTER'
layout.label(text="", icon_value=icon)
@@ -109,11 +116,23 @@ class MESH_UL_shape_keys(UIList):
layout.label(text="", icon_value=icon)
-class MESH_UL_uvmaps_vcols(UIList):
+class MESH_UL_uvmaps(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
# assert(isinstance(item, (bpy.types.MeshTexturePolyLayer, bpy.types.MeshLoopColorLayer)))
if self.layout_type in {'DEFAULT', 'COMPACT'}:
- layout.prop(item, "name", text="", emboss=False, icon_value=icon)
+ layout.prop(item, "name", text="", emboss=False, icon='GROUP_UVS')
+ icon = 'RESTRICT_RENDER_OFF' if item.active_render else 'RESTRICT_RENDER_ON'
+ layout.prop(item, "active_render", text="", icon=icon, emboss=False)
+ elif self.layout_type == 'GRID':
+ layout.alignment = 'CENTER'
+ layout.label(text="", icon_value=icon)
+
+
+class MESH_UL_vcols(UIList):
+ def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
+ # assert(isinstance(item, (bpy.types.MeshTexturePolyLayer, bpy.types.MeshLoopColorLayer)))
+ if self.layout_type in {'DEFAULT', 'COMPACT'}:
+ layout.prop(item, "name", text="", emboss=False, icon='GROUP_VCOL')
icon = 'RESTRICT_RENDER_OFF' if item.active_render else 'RESTRICT_RENDER_ON'
layout.prop(item, "active_render", text="", icon=icon, emboss=False)
elif self.layout_type == 'GRID':
@@ -207,18 +226,23 @@ class DATA_PT_vertex_groups(MeshButtonsPanel, Panel):
ob = context.object
group = ob.vertex_groups.active
- rows = 2
+ rows = 3
if group:
- rows = 4
+ rows = 5
row = layout.row()
row.template_list("MESH_UL_vgroups", "", ob, "vertex_groups", ob.vertex_groups, "active_index", rows=rows)
col = row.column(align=True)
- col.operator("object.vertex_group_add", icon='ZOOMIN', text="")
- props = col.operator("object.vertex_group_remove", icon='ZOOMOUT', text="")
+
+ col.operator("object.vertex_group_add", icon='ADD', text="")
+ props = col.operator("object.vertex_group_remove", icon='REMOVE', text="")
props.all_unlocked = props.all = False
+
+ col.separator()
+
col.menu("MESH_MT_vertex_group_specials", icon='DOWNARROW_HLT', text="")
+
if group:
col.separator()
col.operator("object.vertex_group_move", icon='TRIA_UP', text="").direction = 'UP'
@@ -262,8 +286,9 @@ class DATA_PT_face_maps(MeshButtonsPanel, Panel):
row.template_list("MESH_UL_fmaps", "", ob, "face_maps", ob.face_maps, "active_index", rows=rows)
col = row.column(align=True)
- col.operator("object.face_map_add", icon='ZOOMIN', text="")
- col.operator("object.face_map_remove", icon='ZOOMOUT', text="")
+ col.operator("object.face_map_add", icon='ADD', text="")
+ col.operator("object.face_map_remove", icon='REMOVE', text="")
+
if facemap:
col.separator()
col.operator("object.face_map_move", icon='TRIA_UP', text="").direction = 'UP'
@@ -307,17 +332,20 @@ class DATA_PT_shape_keys(MeshButtonsPanel, Panel):
row = layout.row()
- rows = 2
+ rows = 3
if kb:
- rows = 4
+ rows = 5
+
row.template_list("MESH_UL_shape_keys", "", key, "key_blocks", ob, "active_shape_key_index", rows=rows)
- col = row.column()
+ col = row.column(align=True)
+
+ col.operator("object.shape_key_add", icon='ADD', text="").from_mix = False
+ col.operator("object.shape_key_remove", icon='REMOVE', text="").all = False
+
+ col.separator()
- sub = col.column(align=True)
- sub.operator("object.shape_key_add", icon='ZOOMIN', text="").from_mix = False
- sub.operator("object.shape_key_remove", icon='ZOOMOUT', text="").all = False
- sub.menu("MESH_MT_shape_key_specials", icon='DOWNARROW_HLT', text="")
+ col.menu("MESH_MT_shape_key_specials", icon='DOWNARROW_HLT', text="")
if kb:
col.separator()
@@ -349,12 +377,12 @@ class DATA_PT_shape_keys(MeshButtonsPanel, Panel):
if key.use_relative:
if ob.active_shape_key_index != 0:
+ layout.use_property_split = True
+
row = layout.row()
row.active = enable_edit_value
row.prop(kb, "value")
- layout.use_property_split = True
-
col = layout.column()
sub.active = enable_edit_value
sub = col.column(align=True)
@@ -373,6 +401,7 @@ class DATA_PT_shape_keys(MeshButtonsPanel, Panel):
class DATA_PT_uv_texture(MeshButtonsPanel, Panel):
bl_label = "UV Maps"
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
def draw(self, context):
@@ -383,15 +412,16 @@ class DATA_PT_uv_texture(MeshButtonsPanel, Panel):
row = layout.row()
col = row.column()
- col.template_list("MESH_UL_uvmaps_vcols", "uvmaps", me, "uv_layers", me.uv_layers, "active_index", rows=1)
+ col.template_list("MESH_UL_uvmaps", "uvmaps", me, "uv_layers", me.uv_layers, "active_index", rows=2)
col = row.column(align=True)
- col.operator("mesh.uv_texture_add", icon='ZOOMIN', text="")
- col.operator("mesh.uv_texture_remove", icon='ZOOMOUT', text="")
+ col.operator("mesh.uv_texture_add", icon='ADD', text="")
+ col.operator("mesh.uv_texture_remove", icon='REMOVE', text="")
class DATA_PT_vertex_colors(MeshButtonsPanel, Panel):
bl_label = "Vertex Colors"
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
def draw(self, context):
@@ -402,11 +432,11 @@ class DATA_PT_vertex_colors(MeshButtonsPanel, Panel):
row = layout.row()
col = row.column()
- col.template_list("MESH_UL_uvmaps_vcols", "vcols", me, "vertex_colors", me.vertex_colors, "active_index", rows=1)
+ col.template_list("MESH_UL_vcols", "vcols", me, "vertex_colors", me.vertex_colors, "active_index", rows=2)
col = row.column(align=True)
- col.operator("mesh.vertex_color_add", icon='ZOOMIN', text="")
- col.operator("mesh.vertex_color_remove", icon='ZOOMOUT', text="")
+ col.operator("mesh.vertex_color_add", icon='ADD', text="")
+ col.operator("mesh.vertex_color_remove", icon='REMOVE', text="")
class DATA_PT_customdata(MeshButtonsPanel, Panel):
@@ -428,7 +458,7 @@ class DATA_PT_customdata(MeshButtonsPanel, Panel):
if me.has_custom_normals:
col.operator("mesh.customdata_custom_splitnormals_clear", icon='X')
else:
- col.operator("mesh.customdata_custom_splitnormals_add", icon='ZOOMIN')
+ col.operator("mesh.customdata_custom_splitnormals_add", icon='ADD')
col = layout.column()
@@ -450,7 +480,8 @@ classes = (
MESH_UL_vgroups,
MESH_UL_fmaps,
MESH_UL_shape_keys,
- MESH_UL_uvmaps_vcols,
+ MESH_UL_uvmaps,
+ MESH_UL_vcols,
DATA_PT_context_mesh,
DATA_PT_vertex_groups,
DATA_PT_shape_keys,
diff --git a/release/scripts/startup/bl_ui/properties_data_metaball.py b/release/scripts/startup/bl_ui/properties_data_metaball.py
index 75015a57f5f..267577ae3b4 100644
--- a/release/scripts/startup/bl_ui/properties_data_metaball.py
+++ b/release/scripts/startup/bl_ui/properties_data_metaball.py
@@ -106,6 +106,7 @@ class DATA_PT_metaball_element(DataButtonsPanel, Panel):
col.separator()
col.prop(metaelem, "stiffness", text="Stiffness")
+ col.prop(metaelem, "radius", text="Radius")
col.prop(metaelem, "use_negative", text="Negative")
col.prop(metaelem, "hide", text="Hide")
@@ -116,7 +117,7 @@ class DATA_PT_metaball_element(DataButtonsPanel, Panel):
sub.prop(metaelem, "size_y", text="Y")
sub.prop(metaelem, "size_z", text="Z")
- elif metaelem.type == 'TUBE':
+ elif metaelem.type == 'CAPSULE':
sub.prop(metaelem, "size_x", text="Size X")
elif metaelem.type == 'PLANE':
diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 79113e3c13a..97360ed5ea3 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -544,6 +544,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
sub.active = bool(md.vertex_group)
sub.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT')
+ col = layout.column()
+ col.prop(md, "threshold")
+
def MESH_DEFORM(self, layout, ob, md):
split = layout.split()
@@ -832,6 +835,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
col.label(text="Mode:")
col.prop(md, "wrap_method", text="")
+ if md.wrap_method in {'PROJECT', 'NEAREST_SURFACEPOINT', 'TARGET_PROJECT'}:
+ col.prop(md, "wrap_mode", text="")
+
if md.wrap_method == 'PROJECT':
split = layout.split()
col = split.column()
@@ -852,15 +858,16 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
col.prop(md, "use_negative_direction")
col.prop(md, "use_positive_direction")
+ subcol = col.column()
+ subcol.active = md.use_negative_direction and md.cull_face != 'OFF'
+ subcol.prop(md, "use_invert_cull")
+
col = split.column()
col.label(text="Cull Faces:")
col.prop(md, "cull_face", expand=True)
layout.prop(md, "auxiliary_target")
- elif md.wrap_method == 'NEAREST_SURFACEPOINT':
- layout.prop(md, "use_keep_above_surface")
-
def SIMPLE_DEFORM(self, layout, ob, md):
layout.row().prop(md, "deform_method", expand=True)
@@ -1015,7 +1022,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
render = max(scene.cycles.dicing_rate * ob.cycles.dicing_rate, 0.1)
preview = max(scene.cycles.preview_dicing_rate * ob.cycles.dicing_rate, 0.1)
- col.label(text=f"Render {render:10.2f} px, Preview {preview:10.2f} px")
+ col.label(text=f"Render {render:.2f} px, Preview {preview:.2f} px")
def SURFACE(self, layout, ob, md):
layout.label(text="Settings are inside the Physics tab")
@@ -1626,6 +1633,13 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
bl_label = "Modifiers"
+ def check_conflicts(self, layout, ob):
+ for md in ob.grease_pencil_modifiers:
+ if md.type == 'GP_TIME':
+ row = layout.row()
+ row.label(text="Build and Time Offset modifier not compatible", icon='ERROR')
+ break
+
@classmethod
def poll(cls, context):
ob = context.object
@@ -1655,66 +1669,72 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col = split.column()
row = col.row(align=True)
row.prop(md, "factor")
- row.prop(md, "random", text="", icon="TIME", toggle=True)
+ row.prop(md, "random", text="", icon='TIME', toggle=True)
row = col.row()
row.enabled = md.random
row.prop(md, "step")
col.prop(md, "full_stroke")
col.prop(md, "move_extreme")
- col = split.column()
- col.label(text="Layer:")
- row = col.row(align=True)
- row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
- row.prop(md, "invert_layers", text="", icon="ARROW_LEFTRIGHT")
+ row = layout.row(align=True)
+ row.label(text="Affect:")
+ row = layout.row(align=True)
+ row.prop(md, "use_edit_position", text="Position", icon='MESH_DATA', toggle=True)
+ row.prop(md, "use_edit_strength", text="Strength", icon='COLOR', toggle=True)
+ row.prop(md, "use_edit_thickness", text="Thickness", icon='LINE_DATA', toggle=True)
+ row.prop(md, "use_edit_uv", text="UV", icon='MOD_UVPROJECT', toggle=True)
+ col = layout.column()
+ col.separator()
col.label(text="Vertex Group:")
row = col.row(align=True)
row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_vertex", text="", icon='ARROW_LEFTRIGHT')
+ col.label(text="Material:")
row = col.row(align=True)
row.prop(md, "pass_index", text="Pass")
- row.prop(md, "invert_pass", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_material_pass", text="", icon='ARROW_LEFTRIGHT')
+ col.label(text="Layer:")
+ row = col.row(align=True)
+ row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
+ row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
row = layout.row(align=True)
- row.label(text="Affect:")
- row = layout.row(align=True)
- row.prop(md, "affect_position", text="Position", icon='MESH_DATA', toggle=True)
- row.prop(md, "affect_strength", text="Strength", icon='COLOR', toggle=True)
- row.prop(md, "affect_thickness", text="Thickness", icon='LINE_DATA', toggle=True)
- row.prop(md, "affect_uv", text="UV", icon='MOD_UVPROJECT', toggle=True)
+ row.prop(md, "layer_pass", text="Pass")
+ row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
def GP_SMOOTH(self, layout, ob, md):
gpd = ob.data
- row = layout.row(align=False)
- row.prop(md, "factor")
- row.prop(md, "step")
+ col = layout.column()
+ col.prop(md, "factor")
+ col.prop(md, "step")
- split = layout.split()
- col = split.column()
- col.label(text="Layer:")
+ col.label(text="Affect:")
row = col.row(align=True)
- row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
- row.prop(md, "invert_layers", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "use_edit_position", text="Position", icon='MESH_DATA', toggle=True)
+ row.prop(md, "use_edit_strength", text="Strength", icon='COLOR', toggle=True)
+ row.prop(md, "use_edit_thickness", text="Thickness", icon='LINE_DATA', toggle=True)
+ row.prop(md, "use_edit_uv", text="UV", icon='MOD_UVPROJECT', toggle=True)
- col = split.column()
+ col.separator()
col.label(text="Vertex Group:")
row = col.row(align=True)
row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_vertex", text="", icon='ARROW_LEFTRIGHT')
+ col.label(text="Material:")
row = col.row(align=True)
row.prop(md, "pass_index", text="Pass")
- row.prop(md, "invert_pass", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_material_pass", text="", icon='ARROW_LEFTRIGHT')
+ col.label(text="Layer:")
+ row = col.row(align=True)
+ row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
+ row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
row = layout.row(align=True)
- row.label(text="Affect:")
- row = layout.row(align=True)
- row.prop(md, "affect_position", text="Position", icon='MESH_DATA', toggle=True)
- row.prop(md, "affect_strength", text="Strength", icon='COLOR', toggle=True)
- row.prop(md, "affect_thickness", text="Thickness", icon='LINE_DATA', toggle=True)
- row.prop(md, "affect_uv", text="UV", icon='MOD_UVPROJECT', toggle=True)
+ row.prop(md, "layer_pass", text="Pass")
+ row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
def GP_SUBDIV(self, layout, ob, md):
gpd = ob.data
@@ -1723,16 +1743,22 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col = split.column()
row = col.row(align=True)
row.prop(md, "level")
- row.prop(md, "simple", text="", icon="PARTICLE_POINT")
+ row.prop(md, "simple", text="", icon='PARTICLE_POINT')
+
+ col = layout.column()
+ col.separator()
+ col.label(text="Material:")
row = col.row(align=True)
row.prop(md, "pass_index", text="Pass")
- row.prop(md, "invert_pass", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_material_pass", text="", icon='ARROW_LEFTRIGHT')
- col = split.column()
col.label(text="Layer:")
row = col.row(align=True)
row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
- row.prop(md, "invert_layers", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
+ row = layout.row(align=True)
+ row.prop(md, "layer_pass", text="Pass")
+ row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
def GP_SIMPLIFY(self, layout, ob, md):
gpd = ob.data
@@ -1752,14 +1778,20 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
row.enabled = not md.mode == 'FIXED'
row.prop(md, "factor")
- col = split.column()
- col.label(text="Layer:")
+ col = layout.column()
+ col.separator()
+ col.label(text="Material:")
row = col.row(align=True)
- row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
+ row.prop(md, "pass_index", text="Pass")
+ row.prop(md, "invert_material_pass", text="", icon='ARROW_LEFTRIGHT')
+ col.label(text="Layer:")
row = col.row(align=True)
- row.prop(md, "pass_index", text="Pass")
- row.prop(md, "invert_pass", text="", icon="ARROW_LEFTRIGHT")
+ row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
+ row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
+ row = layout.row(align=True)
+ row.prop(md, "layer_pass", text="Pass")
+ row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
def GP_THICK(self, layout, ob, md):
gpd = ob.data
@@ -1767,24 +1799,10 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col = split.column()
row = col.row(align=True)
- row.prop(md, "thickness")
- row = col.row(align=True)
- row.prop(md, "pass_index", text="Pass")
- row.prop(md, "invert_pass", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "thickness", text="Thickness Factor")
col.prop(md, "normalize_thickness")
- col = split.column()
- col.label(text="Layer:")
- row = col.row(align=True)
- row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
- row.prop(md, "invert_layers", text="", icon="ARROW_LEFTRIGHT")
-
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex", text="", icon="ARROW_LEFTRIGHT")
-
if not md.normalize_thickness:
split = layout.split()
col = split.column()
@@ -1793,6 +1811,26 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
if md.use_custom_curve:
col.template_curve_mapping(md, "curve")
+ col = layout.column()
+ col.separator()
+ col.label(text="Vertex Group:")
+ row = col.row(align=True)
+ row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+ row.prop(md, "invert_vertex", text="", icon='ARROW_LEFTRIGHT')
+
+ col.label(text="Material:")
+ row = col.row(align=True)
+ row.prop(md, "pass_index", text="Pass")
+ row.prop(md, "invert_material_pass", text="", icon='ARROW_LEFTRIGHT')
+
+ col.label(text="Layer:")
+ row = col.row(align=True)
+ row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
+ row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
+ row = layout.row(align=True)
+ row.prop(md, "layer_pass", text="Pass")
+ row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
+
def GP_TINT(self, layout, ob, md):
gpd = ob.data
split = layout.split()
@@ -1801,18 +1839,67 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col.prop(md, "color")
col.prop(md, "factor")
- col = split.column()
+ row = layout.row()
+ row.prop(md, "create_materials")
+ row.prop(md, "modify_color")
+
+ col = layout.column()
+ col.separator()
+ col.label(text="Material:")
+ row = col.row(align=True)
+ row.prop(md, "pass_index", text="Pass")
+ row.prop(md, "invert_material_pass", text="", icon='ARROW_LEFTRIGHT')
+
col.label(text="Layer:")
row = col.row(align=True)
row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
- row.prop(md, "invert_layers", text="", icon="ARROW_LEFTRIGHT")
- row = col.row(align=True)
- row.prop(md, "pass_index", text="Pass")
- row.prop(md, "invert_pass", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
+ row = layout.row(align=True)
+ row.prop(md, "layer_pass", text="Pass")
+ row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
+
+ def GP_TIME(self, layout, ob, md):
+ gpd = ob.data
row = layout.row()
- row.prop(md, "create_materials")
- row.prop(md, "modify_color")
+ row.prop(md, "mode", text="Mode")
+
+ row = layout.row()
+ if md.mode == 'FIX':
+ txt = "Frame"
+ else:
+ txt = "Frame Offset"
+ row.prop(md, "offset", text=txt)
+
+ row = layout.row()
+ row.enabled = md.mode != 'FIX'
+ row.prop(md, "frame_scale")
+
+ row = layout.row()
+ row.separator()
+
+ row = layout.row()
+ row.enabled = md.mode != 'FIX'
+ row.prop(md, "use_custom_frame_range")
+
+ row = layout.row(align=True)
+ row.enabled = md.mode != 'FIX' and md.use_custom_frame_range is True
+ row.prop(md, "frame_start")
+ row.prop(md, "frame_end")
+
+ row = layout.row()
+ row.enabled = md.mode != 'FIX'
+ row.prop(md, "use_keep_loop")
+
+ row = layout.row()
+ row.label(text="Layer:")
+ row = layout.row(align=True)
+ row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
+ row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
+
+ row = layout.row(align=True)
+ row.prop(md, "layer_pass", text="Pass")
+ row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
def GP_COLOR(self, layout, ob, md):
gpd = ob.data
@@ -1824,19 +1911,25 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col.prop(md, "saturation", text="S")
col.prop(md, "value", text="V")
- col = split.column()
- col.label(text="Layer:")
- row = col.row(align=True)
- row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
- row.prop(md, "invert_layers", text="", icon="ARROW_LEFTRIGHT")
- row = col.row(align=True)
- row.prop(md, "pass_index", text="Pass")
- row.prop(md, "invert_pass", text="", icon="ARROW_LEFTRIGHT")
-
row = layout.row()
row.prop(md, "create_materials")
row.prop(md, "modify_color")
+ col = layout.column()
+ col.separator()
+ col.label(text="Material:")
+ row = col.row(align=True)
+ row.prop(md, "pass_index", text="Pass")
+ row.prop(md, "invert_material_pass", text="", icon='ARROW_LEFTRIGHT')
+
+ col.label(text="Layer:")
+ row = col.row(align=True)
+ row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
+ row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
+ row = layout.row(align=True)
+ row.prop(md, "layer_pass", text="Pass")
+ row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
+
def GP_OPACITY(self, layout, ob, md):
gpd = ob.data
split = layout.split()
@@ -1845,26 +1938,31 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col.label(text="Opacity:")
col.prop(md, "factor")
- col = split.column()
- col.label(text="Layer:")
- row = col.row(align=True)
- row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
- row.prop(md, "invert_layers", text="", icon="ARROW_LEFTRIGHT")
+ row = layout.row()
+ row.prop(md, "create_materials")
+ row.prop(md, "modify_color")
+ col = layout.column()
+ col.separator()
col.label(text="Vertex Group:")
row = col.row(align=True)
row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_vertex", text="", icon='ARROW_LEFTRIGHT')
+ col.label(text="Material:")
row = col.row(align=True)
row.prop(md, "pass_index", text="Pass")
- row.prop(md, "invert_pass", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_material_pass", text="", icon='ARROW_LEFTRIGHT')
- row = layout.row()
- row.prop(md, "create_materials")
- row.prop(md, "modify_color")
+ col.label(text="Layer:")
+ row = col.row(align=True)
+ row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
+ row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
+ row = layout.row(align=True)
+ row.prop(md, "layer_pass", text="Pass")
+ row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
- def GP_INSTANCE(self, layout, ob, md):
+ def GP_ARRAY(self, layout, ob, md):
gpd = ob.data
col = layout.column()
@@ -1874,12 +1972,11 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col = split.column()
col.label(text="Offset:")
col.prop(md, "offset", text="")
+ col.prop(md, "offset_object", text="Object")
col = split.column()
col.label(text="Shift:")
col.prop(md, "shift", text="")
- row = col.row(align=True)
- row.prop(md, "lock_axis", expand=True)
split = layout.split()
col = split.column()
@@ -1887,7 +1984,7 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col.prop(md, "rotation", text="")
col.separator()
row = col.row(align=True)
- row.prop(md, "random_rot", text="", icon="TIME", toggle=True)
+ row.prop(md, "random_rot", text="", icon='TIME', toggle=True)
row.prop(md, "rot_factor", text="")
col = split.column()
@@ -1895,18 +1992,27 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col.prop(md, "scale", text="")
col.separator()
row = col.row(align=True)
- row.prop(md, "random_scale", text="", icon="TIME", toggle=True)
+ row.prop(md, "random_scale", text="", icon='TIME', toggle=True)
row.prop(md, "scale_factor", text="")
- split = layout.split()
- col = split.column()
+ col = layout.column()
+ col.prop(md, "replace_material", text="Material")
+ col.prop(md, "keep_on_top", text="Keep original stroke on top")
+
+ col = layout.column()
+ col.separator()
+ col.label(text="Material:")
+ row = col.row(align=True)
+ row.prop(md, "pass_index", text="Pass")
+ row.prop(md, "invert_material_pass", text="", icon='ARROW_LEFTRIGHT')
+
col.label(text="Layer:")
row = col.row(align=True)
row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
- row.prop(md, "invert_layers", text="", icon="ARROW_LEFTRIGHT")
- row = col.row(align=True)
- row.prop(md, "pass_index", text="Pass")
- row.prop(md, "invert_pass", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
+ row = layout.row(align=True)
+ row.prop(md, "layer_pass", text="Pass")
+ row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
def GP_BUILD(self, layout, ob, md):
gpd = ob.data
@@ -1914,31 +2020,34 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
split = layout.split()
col = split.column()
+ self.check_conflicts(col, ob)
+
col.prop(md, "mode")
if md.mode == 'CONCURRENT':
col.prop(md, "concurrent_time_alignment")
- else:
- col.separator() # For spacing
- col.separator()
- col.separator()
+ col.separator()
col.prop(md, "transition")
sub = col.column(align=True)
sub.prop(md, "start_delay")
sub.prop(md, "length")
- col = split.column(align=True)
+ col = layout.column(align=True)
col.prop(md, "use_restrict_frame_range")
sub = col.column(align=True)
sub.active = md.use_restrict_frame_range
sub.prop(md, "frame_start", text="Start")
sub.prop(md, "frame_end", text="End")
- col.separator()
+ col = layout.column()
+ col.separator()
col.label(text="Layer:")
row = col.row(align=True)
row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
- row.prop(md, "invert_layers", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
+ row = layout.row(align=True)
+ row.prop(md, "layer_pass", text="Pass")
+ row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
def GP_LATTICE(self, layout, ob, md):
gpd = ob.data
@@ -1948,23 +2057,27 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col.label(text="Object:")
col.prop(md, "object", text="")
- col = split.column()
- col.label(text="Layer:")
- row = col.row(align=True)
- row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
- row.prop(md, "invert_layers", text="", icon="ARROW_LEFTRIGHT")
+ layout.prop(md, "strength", slider=True)
+ col = layout.column()
+ col.separator()
col.label(text="Vertex Group:")
row = col.row(align=True)
row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_vertex", text="", icon='ARROW_LEFTRIGHT')
+ col.label(text="Material:")
row = col.row(align=True)
row.prop(md, "pass_index", text="Pass")
- row.prop(md, "invert_pass", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_material_pass", text="", icon='ARROW_LEFTRIGHT')
- layout.separator()
- layout.prop(md, "strength", slider=True)
+ col.label(text="Layer:")
+ row = col.row(align=True)
+ row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
+ row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
+ row = layout.row(align=True)
+ row.prop(md, "layer_pass", text="Pass")
+ row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
def GP_MIRROR(self, layout, ob, md):
gpd = ob.data
@@ -1974,21 +2087,23 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
row.prop(md, "y_axis")
row.prop(md, "z_axis")
- # GPXX: Not implemented yet
- # layout.separator()
- # layout.prop(md, "clip")
-
- layout.label(text="Layer:")
- row = layout.row(align=True)
- row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
- row.prop(md, "invert_layers", text="", icon="ARROW_LEFTRIGHT")
+ layout.label(text="Object:")
+ layout.prop(md, "object", text="")
- row = layout.row(align=True)
+ col = layout.column()
+ col.separator()
+ col.label(text="Material:")
+ row = col.row(align=True)
row.prop(md, "pass_index", text="Pass")
- row.prop(md, "invert_pass", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_material_pass", text="", icon='ARROW_LEFTRIGHT')
- layout.label(text="Object:")
- layout.prop(md, "object", text="")
+ col.label(text="Layer:")
+ row = col.row(align=True)
+ row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
+ row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
+ row = layout.row(align=True)
+ row.prop(md, "layer_pass", text="Pass")
+ row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
def GP_HOOK(self, layout, ob, md):
gpd = ob.data
@@ -2001,23 +2116,7 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col.label(text="Bone:")
col.prop_search(md, "subtarget", md.object.data, "bones", text="")
- col = split.column()
- col.label(text="Layer:")
- row = col.row(align=True)
- row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
- row.prop(md, "invert_layers", text="", icon="ARROW_LEFTRIGHT")
-
- col.label(text="Vertex Group:")
- row = col.row(align=True)
- row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex", text="", icon="ARROW_LEFTRIGHT")
-
- row = col.row(align=True)
- row.prop(md, "pass_index", text="Pass")
- row.prop(md, "invert_pass", text="", icon="ARROW_LEFTRIGHT")
-
use_falloff = (md.falloff_type != 'NONE')
- split = layout.split()
layout.separator()
@@ -2037,30 +2136,53 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col = split.column()
col.prop(md, "use_falloff_uniform")
+ col = layout.column()
+ col.separator()
+ col.label(text="Vertex Group:")
+ row = col.row(align=True)
+ row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+ row.prop(md, "invert_vertex", text="", icon='ARROW_LEFTRIGHT')
+
+ col.label(text="Material:")
+ row = col.row(align=True)
+ row.prop(md, "pass_index", text="Pass")
+ row.prop(md, "invert_material_pass", text="", icon='ARROW_LEFTRIGHT')
+
+ col.label(text="Layer:")
+ row = col.row(align=True)
+ row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
+ row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
+ row = layout.row(align=True)
+ row.prop(md, "layer_pass", text="Pass")
+ row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
+
def GP_OFFSET(self, layout, ob, md):
gpd = ob.data
- split = layout.split()
+ col = layout.column()
- col = split.column()
col.prop(md, "location")
col.prop(md, "scale")
-
- col = split.column()
col.prop(md, "rotation")
- col.label(text="Layer:")
- row = col.row(align=True)
- row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
- row.prop(md, "invert_layers", text="", icon="ARROW_LEFTRIGHT")
-
+ col = layout.column()
+ col.separator()
col.label(text="Vertex Group:")
row = col.row(align=True)
row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- row.prop(md, "invert_vertex", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_vertex", text="", icon='ARROW_LEFTRIGHT')
+ col.label(text="Material:")
row = col.row(align=True)
row.prop(md, "pass_index", text="Pass")
- row.prop(md, "invert_pass", text="", icon="ARROW_LEFTRIGHT")
+ row.prop(md, "invert_material_pass", text="", icon='ARROW_LEFTRIGHT')
+
+ col.label(text="Layer:")
+ row = col.row(align=True)
+ row.prop_search(md, "layer", gpd, "layers", text="", icon='GREASEPENCIL')
+ row.prop(md, "invert_layers", text="", icon='ARROW_LEFTRIGHT')
+ row = layout.row(align=True)
+ row.prop(md, "layer_pass", text="Pass")
+ row.prop(md, "invert_layer_pass", text="", icon='ARROW_LEFTRIGHT')
def GP_ARMATURE(self, layout, ob, md):
split = layout.split()
@@ -2068,7 +2190,7 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col = split.column()
col.label(text="Object:")
col.prop(md, "object", text="")
- col.prop(md, "use_deform_preserve_volume")
+ # col.prop(md, "use_deform_preserve_volume")
col = split.column()
col.label(text="Bind To:")
@@ -2077,9 +2199,9 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
layout.separator()
- split = layout.split()
-
- row = split.row(align=True)
+ row = layout.row(align=True)
+ row.label(text="Vertex Group:")
+ row = layout.row(align=True)
row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
sub = row.row(align=True)
sub.active = bool(md.vertex_group)
diff --git a/release/scripts/startup/bl_ui/properties_data_shaderfx.py b/release/scripts/startup/bl_ui/properties_data_shaderfx.py
index 3798a273e09..8b4bd03bc6d 100644
--- a/release/scripts/startup/bl_ui/properties_data_shaderfx.py
+++ b/release/scripts/startup/bl_ui/properties_data_shaderfx.py
@@ -19,7 +19,6 @@
# <pep8 compliant>
import bpy
from bpy.types import Panel
-from bpy.app.translations import pgettext_iface as iface_
class ShaderFxButtonsPanel:
@@ -40,7 +39,6 @@ class DATA_PT_shader_fx(ShaderFxButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
- layout.use_property_split = True
ob = context.object
@@ -81,7 +79,8 @@ class DATA_PT_shader_fx(ShaderFxButtonsPanel, Panel):
layout.prop(fx, "factor")
def FX_WAVE(self, layout, fx):
- layout.prop(fx, "orientation", expand=True)
+ row = layout.row(align=True)
+ row.prop(fx, "orientation", expand=True)
layout.separator()
layout.prop(fx, "amplitude")
@@ -91,12 +90,6 @@ class DATA_PT_shader_fx(ShaderFxButtonsPanel, Panel):
def FX_PIXEL(self, layout, fx):
layout.prop(fx, "size", text="Size")
- layout.prop(fx, "use_lines", text="Display Lines")
-
- col = layout.column()
- col.enabled = fx.use_lines
- col.prop(fx, "color")
-
def FX_RIM(self, layout, fx):
layout.prop(fx, "offset", text="Offset")
@@ -106,6 +99,45 @@ class DATA_PT_shader_fx(ShaderFxButtonsPanel, Panel):
layout.prop(fx, "blur")
layout.prop(fx, "samples")
+ def FX_SHADOW(self, layout, fx):
+ layout.prop(fx, "offset", text="Offset")
+
+ layout.prop(fx, "shadow_color")
+ layout.prop(fx, "scale")
+ layout.prop(fx, "rotation")
+
+ layout.separator()
+ layout.prop(fx, "blur")
+ layout.prop(fx, "samples")
+
+ layout.separator()
+ layout.prop(fx, "use_object", text="Use object as pivot")
+ if fx.use_object:
+ row = layout.row()
+ row.prop(fx, "object", text="Object")
+
+ layout.separator()
+ layout.prop(fx, "use_wave", text="Use Wave effect")
+ if fx.use_wave is True:
+ row = layout.row(align=True)
+ row.prop(fx, "orientation", expand=True)
+ layout.prop(fx, "amplitude")
+ layout.prop(fx, "period")
+ layout.prop(fx, "phase")
+
+ def FX_GLOW(self, layout, fx):
+ layout.prop(fx, "mode")
+ layout.prop(fx, "glow_color")
+ if fx.mode == 'LUMINANCE':
+ layout.prop(fx, "threshold")
+ else:
+ layout.prop(fx, "select_color")
+
+ layout.separator()
+ layout.prop(fx, "radius")
+ layout.prop(fx, "samples")
+ layout.prop(fx, "use_alpha_mode", text="Use alpha mode")
+
def FX_SWIRL(self, layout, fx):
layout.prop(fx, "object", text="Object")
diff --git a/release/scripts/startup/bl_ui/properties_data_speaker.py b/release/scripts/startup/bl_ui/properties_data_speaker.py
index f1482dbe61d..cd2b9934aaf 100644
--- a/release/scripts/startup/bl_ui/properties_data_speaker.py
+++ b/release/scripts/startup/bl_ui/properties_data_speaker.py
@@ -76,6 +76,7 @@ class DATA_PT_speaker(DataButtonsPanel, Panel):
class DATA_PT_distance(DataButtonsPanel, Panel):
bl_label = "Distance"
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
def draw(self, context):
@@ -99,6 +100,7 @@ class DATA_PT_distance(DataButtonsPanel, Panel):
class DATA_PT_cone(DataButtonsPanel, Panel):
bl_label = "Cone"
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
def draw(self, context):
diff --git a/release/scripts/startup/bl_ui/properties_freestyle.py b/release/scripts/startup/bl_ui/properties_freestyle.py
index 17839258062..f5f15c7ca58 100644
--- a/release/scripts/startup/bl_ui/properties_freestyle.py
+++ b/release/scripts/startup/bl_ui/properties_freestyle.py
@@ -47,14 +47,14 @@ class RENDER_PT_freestyle(RenderFreestyleButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False # No animation.
rd = context.scene.render
layout.active = rd.use_freestyle
- row = layout.row()
- row.label(text="Line Thickness:")
- row.prop(rd, "line_thickness_mode", expand=True)
+ layout.prop(rd, "line_thickness_mode", expand=True)
if (rd.line_thickness_mode == 'ABSOLUTE'):
layout.prop(rd, "line_thickness")
@@ -116,7 +116,6 @@ class VIEWLAYER_PT_freestyle(ViewLayerFreestyleButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
- scene = context.scene
view_layer = context.view_layer
freestyle = view_layer.freestyle_settings
@@ -153,13 +152,13 @@ class VIEWLAYER_PT_freestyle(ViewLayerFreestyleButtonsPanel, Panel):
row = layout.row()
row.label(text="Style modules:")
row.operator("scene.freestyle_module_add", text="Add")
- for i, module in enumerate(freestyle.modules):
+ for module in freestyle.modules:
box = layout.box()
box.context_pointer_set("freestyle_module", module)
row = box.row(align=True)
row.prop(module, "use", text="")
row.prop(module, "script", text="")
- row.operator("scene.freestyle_module_open", icon='FILESEL', text="")
+ row.operator("scene.freestyle_module_open", icon='FILEBROWSER', text="")
row.operator("scene.freestyle_module_remove", icon='X', text="")
row.operator("scene.freestyle_module_move", icon='TRIA_UP', text="").direction = 'UP'
row.operator("scene.freestyle_module_move", icon='TRIA_DOWN', text="").direction = 'DOWN'
@@ -183,9 +182,6 @@ class VIEWLAYER_PT_freestyle_lineset(ViewLayerFreestyleEditorButtonsPanel, Panel
def draw(self, context):
layout = self.layout
- scene = context.scene
- rd = scene.render
-
view_layer = context.view_layer
freestyle = view_layer.freestyle_settings
lineset = freestyle.linesets.active
@@ -197,8 +193,8 @@ class VIEWLAYER_PT_freestyle_lineset(ViewLayerFreestyleEditorButtonsPanel, Panel
row.template_list("VIEWLAYER_UL_linesets", "", freestyle, "linesets", freestyle.linesets, "active_index", rows=rows)
sub = row.column(align=True)
- sub.operator("scene.freestyle_lineset_add", icon='ZOOMIN', text="")
- sub.operator("scene.freestyle_lineset_remove", icon='ZOOMOUT', text="")
+ sub.operator("scene.freestyle_lineset_add", icon='ADD', text="")
+ sub.operator("scene.freestyle_lineset_remove", icon='REMOVE', text="")
sub.menu("RENDER_MT_lineset_specials", icon='DOWNARROW_HLT', text="")
if lineset:
sub.separator()
@@ -613,7 +609,6 @@ class VIEWLAYER_PT_freestyle_linestyle(ViewLayerFreestyleEditorButtonsPanel, Pan
def draw(self, context):
layout = self.layout
- scene = context.scene
view_layer = context.view_layer
lineset = view_layer.freestyle_settings.linesets.active
@@ -809,8 +804,10 @@ class MaterialFreestyleButtonsPanel:
scene = context.scene
material = context.material
with_freestyle = bpy.app.build_options.freestyle
- return with_freestyle and material and scene and scene.render.use_freestyle and \
+ return (
+ with_freestyle and material and scene and scene.render.use_freestyle and
(context.engine in cls.COMPAT_ENGINES)
+ )
class MATERIAL_PT_freestyle_line(MaterialFreestyleButtonsPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
index ded6106c5c3..2c56e6d2178 100644
--- a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
+++ b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
@@ -108,11 +108,11 @@ class AnnotationDrawingToolsPanel:
col.separator()
sub = col.column(align=True)
- sub.operator("gpencil.blank_frame_add", icon='NEW')
+ sub.operator("gpencil.blank_frame_add", icon='FILE_NEW')
sub.operator("gpencil.active_frames_delete_all", icon='X', text="Delete Frame(s)")
#sub = col.column(align=True)
- #sub.prop(context.tool_settings, "use_gpencil_additive_drawing", text="Additive Drawing")
+ #sub.prop(context.tool_settings, "use_gpencil_draw_additive", text="Additive Drawing")
#sub.prop(context.tool_settings, "use_gpencil_continuous_drawing", text="Continuous Drawing")
#sub.prop(context.tool_settings, "use_gpencil_draw_onback", text="Draw on Back")
@@ -168,7 +168,7 @@ class GreasePencilStrokeEditPanel:
layout.label(text="Select:")
col = layout.column(align=True)
col.operator("gpencil.select_all", text="Select All")
- col.operator("gpencil.select_border")
+ col.operator("gpencil.select_box")
col.operator("gpencil.select_circle")
layout.separator()
@@ -252,25 +252,60 @@ class GreasePencilStrokeSculptPanel:
layout.template_icon_view(settings, "tool", show_labels=True)
- layout.prop(brush, "size", slider=True)
+ row = layout.row(align=True)
+ row.prop(brush, "size", slider=True)
+ sub = row.row(align=True)
+ sub.enabled = tool not in {'GRAB', 'CLONE'}
+ sub.prop(brush, "use_pressure_radius", text="")
+
row = layout.row(align=True)
row.prop(brush, "strength", slider=True)
row.prop(brush, "use_pressure_strength", text="")
layout.prop(brush, "use_falloff")
+ layout.use_property_split = False
+ if tool in {'THICKNESS', 'STRENGTH'}:
+ layout.row().prop(brush, "direction", expand=True)
+ elif tool == 'PINCH':
+ row = layout.row(align=True)
+ row.prop_enum(brush, "direction", value='ADD', text="Pinch")
+ row.prop_enum(brush, "direction", value='SUBTRACT', text="Inflate")
+ elif settings.tool == 'TWIST':
+ row = layout.row(align=True)
+ row.prop_enum(brush, "direction", value='ADD', text="CCW")
+ row.prop_enum(brush, "direction", value='SUBTRACT', text="CW")
+
+
+class GreasePencilSculptOptionsPanel:
+ bl_label = "Sculpt Strokes"
+
+ @classmethod
+ def poll(cls, context):
+ settings = context.tool_settings.gpencil_sculpt
+ tool = settings.tool
+
+ return bool(tool in {'SMOOTH', 'RANDOMIZE', 'SMOOTH'})
+
+ @staticmethod
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ settings = context.tool_settings.gpencil_sculpt
+ tool = settings.tool
+ brush = settings.brush
+
if tool in {'SMOOTH', 'RANDOMIZE'}:
- layout.prop(settings, "affect_position", text="Affect Position")
- layout.prop(settings, "affect_strength", text="Affect Strength")
- layout.prop(settings, "affect_thickness", text="Affect Thickness")
+ layout.prop(settings, "use_edit_position", text="Affect Position")
+ layout.prop(settings, "use_edit_strength", text="Affect Strength")
+ layout.prop(settings, "use_edit_thickness", text="Affect Thickness")
if tool == 'SMOOTH':
- layout.prop(brush, "affect_pressure")
-
- layout.prop(settings, "affect_uv", text="Affect UV")
+ layout.prop(brush, "use_edit_pressure")
- if tool in {'THICKNESS', 'PINCH', 'TWIST'}:
- layout.prop(brush, "direction", expand=True)
+ layout.prop(settings, "use_edit_uv", text="Affect UV")
# GP Object Tool Settings
@@ -295,8 +330,6 @@ class GreasePencilAppearancePanel:
brush = context.active_gpencil_brush
gp_settings = brush.gpencil_settings
- layout.prop(gp_settings, "gpencil_brush_type", text="Brush Type")
-
sub = layout.column(align=True)
sub.enabled = not brush.use_custom_icon
sub.prop(gp_settings, "gp_icon", text="Icon")
@@ -308,17 +341,31 @@ class GreasePencilAppearancePanel:
layout.prop(gp_settings, "use_cursor", text="Show Brush")
- if gp_settings.gpencil_brush_type == 'FILL':
+ if brush.gpencil_tool == 'DRAW':
+ layout.prop(gp_settings, "show_lasso", text="Show fill color while drawing")
+
+ if brush.gpencil_tool == 'FILL':
layout.prop(brush, "cursor_color_add", text="Color")
- elif ob.mode in ('GPENCIL_SCULPT', 'GPENCIL_WEIGHT'):
+ elif ob.mode in {'GPENCIL_SCULPT', 'GPENCIL_WEIGHT'}:
settings = context.tool_settings.gpencil_sculpt
brush = settings.brush
+ tool = settings.tool
col = layout.column(align=True)
col.prop(brush, "use_cursor", text="Show Brush")
- col.row().prop(brush, "cursor_color_add", text="Add")
- col.row().prop(brush, "cursor_color_sub", text="Subtract")
+
+ if tool in {'THICKNESS', 'STRENGTH'}:
+ col.prop(brush, "cursor_color_add", text="Add")
+ col.prop(brush, "cursor_color_sub", text="Substract")
+ elif tool == 'PINCH':
+ col.prop(brush, "cursor_color_add", text="Pinch")
+ col.prop(brush, "cursor_color_sub", text="Inflate")
+ elif settings.tool == 'TWIST':
+ col.prop(brush, "cursor_color_add", text="CCW")
+ col.prop(brush, "cursor_color_sub", text="CW")
+ else:
+ col.prop(brush, "cursor_color_add", text="")
class GPENCIL_MT_pie_tool_palette(Menu):
@@ -373,7 +420,7 @@ class GPENCIL_MT_pie_tool_palette(Menu):
# NE - Select (Modal)
col = pie.column()
- col.operator("gpencil.select_border", text="Border Select", icon='BORDER_RECT')
+ col.operator("gpencil.select_box", text="Box Select", icon='BORDER_RECT')
col.operator("gpencil.select_circle", text="Circle Select", icon='META_EMPTY')
col.operator("gpencil.select_lasso", text="Lasso Select", icon='BORDER_LASSO')
col.operator("gpencil.select_alternate", text="Alternate Select", icon='BORDER_LASSO')
@@ -405,7 +452,7 @@ class GPENCIL_MT_pie_settings_palette(Menu):
gpd = context.gpencil_data
gpl = context.active_gpencil_layer
palcolor = None # context.active_gpencil_palettecolor
- brush = context.active_gpencil_brush
+ # brush = context.active_gpencil_brush
is_editmode = bool(gpd and gpd.use_stroke_edit_mode and context.editable_gpencil_strokes)
@@ -493,8 +540,8 @@ class GPENCIL_MT_pie_tools_more(Menu):
col.operator("gpencil.paste", icon='PASTEDOWN', text="Paste")
col = pie.column(align=True)
- col.operator("gpencil.select_more", icon='ZOOMIN')
- col.operator("gpencil.select_less", icon='ZOOMOUT')
+ col.operator("gpencil.select_more", icon='ADD')
+ col.operator("gpencil.select_less", icon='REMOVE')
pie.operator("transform.mirror", icon='MOD_MIRROR')
pie.operator("transform.bend", icon='MOD_SIMPLEDEFORM')
@@ -537,9 +584,9 @@ class GPENCIL_MT_pie_sculpt(Menu):
col.prop(brush, "use_falloff")
if settings.tool in {'SMOOTH', 'RANDOMIZE'}:
row = col.row(align=True)
- row.prop(settings, "affect_position", text="Position", icon='MESH_DATA', toggle=True)
- row.prop(settings, "affect_strength", text="Strength", icon='COLOR', toggle=True)
- row.prop(settings, "affect_thickness", text="Thickness", icon='LINE_DATA', toggle=True)
+ row.prop(settings, "use_edit_position", text="Position", icon='MESH_DATA', toggle=True)
+ row.prop(settings, "use_edit_strength", text="Strength", icon='COLOR', toggle=True)
+ row.prop(settings, "use_edit_thickness", text="Thickness", icon='LINE_DATA', toggle=True)
# S - Change Brush Type Shortcuts
row = pie.row()
@@ -568,7 +615,7 @@ class GPENCIL_MT_snap(Menu):
layout.separator()
layout.operator("gpencil.snap_cursor_to_selected", text="Cursor to Selected")
- layout.operator("view3d.snap_cursor_to_center", text="Cursor to Center")
+ layout.operator("view3d.snap_cursor_to_center", text="Cursor to World Origin")
layout.operator("view3d.snap_cursor_to_grid", text="Cursor to Grid")
@@ -587,7 +634,6 @@ class GPENCIL_MT_gpencil_draw_specials(Menu):
def draw(self, context):
layout = self.layout
- is_3d_view = context.space_data.type == 'VIEW_3D'
layout.operator_context = 'INVOKE_REGION_WIN'
@@ -605,7 +651,6 @@ class GPENCIL_MT_gpencil_draw_delete(Menu):
def draw(self, context):
layout = self.layout
- is_3d_view = context.space_data.type == 'VIEW_3D'
layout.operator_context = 'INVOKE_REGION_WIN'
@@ -631,7 +676,6 @@ class GPENCIL_UL_annotation_layer(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
# assert(isinstance(item, bpy.types.GPencilLayer)
gpl = item
- gpd = context.gpencil_data
if self.layout_type in {'DEFAULT', 'COMPACT'}:
if gpl.lock:
@@ -667,7 +711,7 @@ class AnnotationDataPanel:
@staticmethod
def draw_header(self, context):
- if context.space_data.type != 'VIEW_3D':
+ if context.space_data.type not in {'VIEW_3D', 'TOPBAR'}:
self.layout.prop(context.space_data, "show_annotation", text="")
@staticmethod
@@ -696,14 +740,15 @@ class AnnotationDataPanel:
if len(gpd.layers) >= 2:
layer_rows = 5
else:
- layer_rows = 2
- col.template_list("GPENCIL_UL_annotation_layer", "", gpd, "layers", gpd.layers, "active_index", rows=layer_rows)
+ layer_rows = 3
+ col.template_list("GPENCIL_UL_annotation_layer", "", gpd, "layers", gpd.layers, "active_index",
+ rows=layer_rows, reverse=True)
col = row.column()
sub = col.column(align=True)
- sub.operator("gpencil.layer_add", icon='ZOOMIN', text="")
- sub.operator("gpencil.layer_remove", icon='ZOOMOUT', text="")
+ sub.operator("gpencil.layer_add", icon='ADD', text="")
+ sub.operator("gpencil.layer_remove", icon='REMOVE', text="")
gpl = context.active_gpencil_layer
if gpl:
@@ -742,10 +787,14 @@ class GreasePencilOnionPanel:
col.prop(gp, "onion_mode")
col.prop(gp, "onion_factor", text="Opacity", slider=True)
- if gp.onion_mode in ('ABSOLUTE', 'RELATIVE'):
+ if gp.onion_mode == 'ABSOLUTE':
col = layout.column(align=True)
col.prop(gp, "ghost_before_range", text="Frames Before")
- col.prop(gp, "ghost_after_range", text="After")
+ col.prop(gp, "ghost_after_range", text="Frames After")
+ if gp.onion_mode == 'RELATIVE':
+ col = layout.column(align=True)
+ col.prop(gp, "ghost_before_range", text="Keyframes Before")
+ col.prop(gp, "ghost_after_range", text="Keyframes After")
layout.prop(gp, "use_ghost_custom_colors", text="Use Custom Colors")
@@ -785,7 +834,6 @@ class GreasePencilToolsPanel:
def draw(self, context):
layout = self.layout
- # gpd_owner = context.gpencil_data_owner
gpd = context.gpencil_data
layout.prop(gpd, "use_stroke_edit_mode", text="Enable Editing", icon='EDIT', toggle=True)
@@ -807,6 +855,43 @@ class GreasePencilToolsPanel:
gpencil_stroke_placement_settings(context, layout)
+class GPENCIL_UL_layer(UIList):
+ def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
+ # assert(isinstance(item, bpy.types.GPencilLayer)
+ gpl = item
+ gpd = context.gpencil_data
+
+ if self.layout_type in {'DEFAULT', 'COMPACT'}:
+ if gpl.lock:
+ layout.active = False
+
+ row = layout.row(align=True)
+ row.label(
+ text="",
+ icon='BONE_DATA' if gpl.is_parented else 'BLANK1',
+ )
+ row.prop(gpl, "info", text="", emboss=False)
+
+ row = layout.row(align=True)
+ row.prop(gpl, "lock", text="", emboss=False)
+ row.prop(gpl, "hide", text="", emboss=False)
+ subrow = row.row(align=True)
+ subrow.prop(
+ gpl,
+ "use_onion_skinning",
+ text="",
+ icon='ONIONSKIN_ON' if gpl.use_onion_skinning else 'ONIONSKIN_OFF',
+ emboss=False,
+ )
+ subrow.active = gpd.use_onion_skinning
+ elif self.layout_type == 'GRID':
+ layout.alignment = 'CENTER'
+ layout.label(
+ text="",
+ icon_value=icon,
+ )
+
+
classes = (
GPENCIL_MT_pie_tool_palette,
GPENCIL_MT_pie_settings_palette,
@@ -821,6 +906,7 @@ classes = (
GPENCIL_MT_gpencil_draw_delete,
GPENCIL_UL_annotation_layer,
+ GPENCIL_UL_layer,
)
if __name__ == "__main__": # only for live edit.
diff --git a/release/scripts/startup/bl_ui/properties_mask_common.py b/release/scripts/startup/bl_ui/properties_mask_common.py
index bf32ebfc55a..4d502cf3c46 100644
--- a/release/scripts/startup/bl_ui/properties_mask_common.py
+++ b/release/scripts/startup/bl_ui/properties_mask_common.py
@@ -55,6 +55,8 @@ class MASK_PT_mask:
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
sc = context.space_data
mask = sc.mask
@@ -77,6 +79,8 @@ class MASK_PT_layers:
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
sc = context.space_data
mask = sc.mask
@@ -90,8 +94,8 @@ class MASK_PT_layers:
sub = row.column(align=True)
- sub.operator("mask.layer_new", icon='ZOOMIN', text="")
- sub.operator("mask.layer_remove", icon='ZOOMOUT', text="")
+ sub.operator("mask.layer_new", icon='ADD', text="")
+ sub.operator("mask.layer_remove", icon='REMOVE', text="")
if active_layer:
sub.separator()
@@ -107,9 +111,9 @@ class MASK_PT_layers:
layout.prop(active_layer, "blend")
layout.prop(active_layer, "falloff")
- row = layout.row(align=True)
- row.prop(active_layer, "use_fill_overlap", text="Overlap")
- row.prop(active_layer, "use_fill_holes", text="Holes")
+ col = layout.column()
+ col.prop(active_layer, "use_fill_overlap", text="Overlap")
+ col.prop(active_layer, "use_fill_holes", text="Holes")
class MASK_PT_spline:
@@ -130,6 +134,8 @@ class MASK_PT_spline:
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
sc = context.space_data
mask = sc.mask
@@ -137,11 +143,10 @@ class MASK_PT_spline:
col = layout.column()
col.prop(spline, "offset_mode")
- col.prop(spline, "weight_interpolation")
+ col.prop(spline, "weight_interpolation", text="Interpolation")
- row = col.row()
- row.prop(spline, "use_cyclic")
- row.prop(spline, "use_fill")
+ col.prop(spline, "use_cyclic")
+ col.prop(spline, "use_fill")
col.prop(spline, "use_self_intersection_check")
@@ -166,6 +171,8 @@ class MASK_PT_point:
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
sc = context.space_data
mask = sc.mask
@@ -188,17 +195,17 @@ class MASK_PT_point:
row.prop(parent, "type", expand=True)
col.prop_search(parent, "parent", tracking,
- "objects", icon='OBJECT_DATA', text="Object:")
+ "objects", icon='OBJECT_DATA', text="Object")
tracks_list = "tracks" if parent.type == 'POINT_TRACK' else "plane_tracks"
if parent.parent in tracking.objects:
object = tracking.objects[parent.parent]
col.prop_search(parent, "sub_parent", object,
- tracks_list, icon='ANIM_DATA', text="Track:")
+ tracks_list, icon='ANIM_DATA', text="Track")
else:
col.prop_search(parent, "sub_parent", tracking,
- tracks_list, icon='ANIM_DATA', text="Track:")
+ tracks_list, icon='ANIM_DATA', text="Track")
class MASK_PT_display:
@@ -219,7 +226,7 @@ class MASK_PT_display:
space_data = context.space_data
row = layout.row(align=True)
row.prop(space_data, "show_mask_smooth", text="Smooth")
- row.prop(space_data, "mask_draw_type", text="")
+ row.prop(space_data, "mask_display_type", text="")
row = layout.row(align=True)
row.prop(space_data, "show_mask_overlay", text="Overlay")
sub = row.row()
@@ -251,62 +258,14 @@ class MASK_PT_transforms:
col.operator("transform.transform", text="Scale Feather").mode = 'MASK_SHRINKFATTEN'
-class MASK_PT_tools:
- # subclasses must define...
- # ~ bl_space_type = 'CLIP_EDITOR'
- # ~ bl_region_type = 'TOOLS'
- bl_label = "Mask Tools"
- bl_category = "Mask"
-
- @classmethod
- def poll(cls, context):
- space_data = context.space_data
- return space_data.mask and space_data.mode == 'MASK'
-
- def draw(self, context):
- layout = self.layout
-
- col = layout.column(align=True)
- col.label(text="Spline:")
- col.operator("mask.delete")
- col.operator("mask.cyclic_toggle")
- col.operator("mask.switch_direction")
- col.operator("mask.handle_type_set")
- col.operator("mask.feather_weight_clear")
-
- col = layout.column(align=True)
- col.label(text="Parenting:")
- row = col.row(align=True)
- row.operator("mask.parent_set", text="Parent")
- row.operator("mask.parent_clear", text="Clear")
-
- col = layout.column(align=True)
- col.label(text="Animation:")
- row = col.row(align=True)
- row.operator("mask.shape_key_insert", text="Insert Key")
- row.operator("mask.shape_key_clear", text="Clear Key")
- col.operator("mask.shape_key_feather_reset", text="Reset Feather Animation")
- col.operator("mask.shape_key_rekey", text="Re-Key Shape Points")
-
-
-class MASK_PT_add:
- # subclasses must define...
- # ~ bl_space_type = 'CLIP_EDITOR'
- # ~ bl_region_type = 'TOOLS'
+class MASK_MT_add(Menu):
bl_label = "Add"
- bl_category = "Mask"
-
- @classmethod
- def poll(cls, context):
- space_data = context.space_data
- return space_data.mode == 'MASK'
def draw(self, context):
layout = self.layout
- col = layout.column(align=True)
- col.operator("mask.primitive_circle_add", icon='MESH_CIRCLE')
- col.operator("mask.primitive_square_add", icon='MESH_PLANE')
+ layout.operator("mask.primitive_circle_add", icon='MESH_CIRCLE')
+ layout.operator("mask.primitive_square_add", icon='MESH_PLANE')
class MASK_MT_mask(Menu):
@@ -321,6 +280,7 @@ class MASK_MT_mask(Menu):
layout.operator("mask.cyclic_toggle")
layout.operator("mask.switch_direction")
layout.operator("mask.normals_make_consistent")
+ layout.operator("mask.handle_type_set")
layout.operator("mask.feather_weight_clear") # TODO, better place?
layout.separator()
@@ -384,7 +344,7 @@ class MASK_MT_select(Menu):
layout.separator()
- layout.operator("mask.select_border")
+ layout.operator("mask.select_box")
layout.operator("mask.select_circle")
layout.separator()
@@ -399,6 +359,7 @@ class MASK_MT_select(Menu):
classes = (
MASK_UL_layers,
+ MASK_MT_add,
MASK_MT_mask,
MASK_MT_visibility,
MASK_MT_transform,
diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py
index 706ce497dee..4f28b14e3b5 100644
--- a/release/scripts/startup/bl_ui/properties_material.py
+++ b/release/scripts/startup/bl_ui/properties_material.py
@@ -30,8 +30,8 @@ class MATERIAL_MT_specials(Menu):
def draw(self, context):
layout = self.layout
- layout.operator("object.material_slot_copy", icon='COPY_ID')
layout.operator("material.copy", icon='COPYDOWN')
+ layout.operator("object.material_slot_copy")
layout.operator("material.paste", icon='PASTEDOWN')
@@ -102,17 +102,19 @@ class EEVEE_MATERIAL_PT_context_material(MaterialButtonsPanel, Panel):
if ob:
is_sortable = len(ob.material_slots) > 1
- rows = 2
+ rows = 3
if (is_sortable):
- rows = 4
+ rows = 5
row = layout.row()
row.template_list("MATERIAL_UL_matslots", "", ob, "material_slots", ob, "active_material_index", rows=rows)
col = row.column(align=True)
- col.operator("object.material_slot_add", icon='ZOOMIN', text="")
- col.operator("object.material_slot_remove", icon='ZOOMOUT', text="")
+ col.operator("object.material_slot_add", icon='ADD', text="")
+ col.operator("object.material_slot_remove", icon='REMOVE', text="")
+
+ col.separator()
col.menu("MATERIAL_MT_specials", icon='DOWNARROW_HLT', text="")
@@ -141,11 +143,11 @@ class EEVEE_MATERIAL_PT_context_material(MaterialButtonsPanel, Panel):
row.template_ID(space, "pin_id")
-def panel_node_draw(layout, ntree, output_type):
+def panel_node_draw(layout, ntree, output_type, input_name):
node = ntree.get_output_node('EEVEE')
if node:
- input = find_node_input(node, 'Surface')
+ input = find_node_input(node, input_name)
if input:
layout.template_node_view(ntree, node, input)
else:
@@ -173,7 +175,7 @@ class EEVEE_MATERIAL_PT_surface(MaterialButtonsPanel, Panel):
layout.separator()
if mat.use_nodes:
- panel_node_draw(layout, mat.node_tree, 'OUTPUT_MATERIAL')
+ panel_node_draw(layout, mat.node_tree, 'OUTPUT_MATERIAL', "Surface")
else:
layout.use_property_split = True
layout.prop(mat, "diffuse_color", text="Base Color")
@@ -182,6 +184,26 @@ class EEVEE_MATERIAL_PT_surface(MaterialButtonsPanel, Panel):
layout.prop(mat, "roughness")
+class EEVEE_MATERIAL_PT_volume(MaterialButtonsPanel, Panel):
+ bl_label = "Volume"
+ bl_context = "material"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_EEVEE'}
+
+ @classmethod
+ def poll(cls, context):
+ engine = context.engine
+ mat = context.material
+ return mat and mat.use_nodes and (engine in cls.COMPAT_ENGINES)
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = context.material
+
+ panel_node_draw(layout, mat.node_tree, 'OUTPUT_MATERIAL', "Volume")
+
+
class EEVEE_MATERIAL_PT_options(MaterialButtonsPanel, Panel):
bl_label = "Options"
bl_context = "material"
@@ -242,6 +264,7 @@ classes = (
MATERIAL_PT_preview,
EEVEE_MATERIAL_PT_context_material,
EEVEE_MATERIAL_PT_surface,
+ EEVEE_MATERIAL_PT_volume,
EEVEE_MATERIAL_PT_options,
MATERIAL_PT_viewport,
MATERIAL_PT_custom_props,
diff --git a/release/scripts/startup/bl_ui/properties_material_gpencil.py b/release/scripts/startup/bl_ui/properties_material_gpencil.py
index 549e3a36420..a3fdd37e029 100644
--- a/release/scripts/startup/bl_ui/properties_material_gpencil.py
+++ b/release/scripts/startup/bl_ui/properties_material_gpencil.py
@@ -37,10 +37,8 @@ class GPENCIL_MT_color_specials(Menu):
layout.operator("gpencil.color_lock_all", icon='LOCKED', text="Lock All")
layout.operator("gpencil.color_unlock_all", icon='UNLOCKED', text="UnLock All")
- layout.separator()
-
- layout.operator("gpencil.stroke_lock_color", icon='BORDER_RECT', text="Lock Unselected")
- layout.operator("gpencil.lock_layer", icon='COLOR', text="Lock Unused")
+ layout.operator("gpencil.stroke_lock_color", text="Lock Unselected")
+ layout.operator("gpencil.lock_layer", text="Lock Unused")
class GPENCIL_UL_matslots(UIList):
@@ -62,9 +60,9 @@ class GPENCIL_UL_matslots(UIList):
row.prop(gpcolor, "lock", text="", emboss=False)
row.prop(gpcolor, "hide", text="", emboss=False)
if gpcolor.ghost is True:
- icon = 'GHOST_DISABLED'
+ icon = 'ONIONSKIN_OFF'
else:
- icon = 'GHOST_ENABLED'
+ icon = 'ONIONSKIN_ON'
row.prop(gpcolor, "ghost", text="", icon=icon, emboss=False)
elif self.layout_type == 'GRID':
@@ -109,17 +107,15 @@ class MATERIAL_PT_gpencil_slots(Panel):
if ob:
is_sortable = len(ob.material_slots) > 1
- rows = 1
- if (is_sortable):
- rows = 4
+ rows = 7
row = layout.row()
row.template_list("GPENCIL_UL_matslots", "", ob, "material_slots", ob, "active_material_index", rows=rows)
col = row.column(align=True)
- col.operator("object.material_slot_add", icon='ZOOMIN', text="")
- col.operator("object.material_slot_remove", icon='ZOOMOUT', text="")
+ col.operator("object.material_slot_add", icon='ADD', text="")
+ col.operator("object.material_slot_remove", icon='REMOVE', text="")
col.menu("GPENCIL_MT_color_specials", icon='DOWNARROW_HLT', text="")
@@ -133,7 +129,7 @@ class MATERIAL_PT_gpencil_slots(Panel):
sub = col.column(align=True)
sub.operator("gpencil.color_isolate", icon='LOCKED', text="").affect_visibility = False
- sub.operator("gpencil.color_isolate", icon='RESTRICT_VIEW_OFF', text="").affect_visibility = True
+ sub.operator("gpencil.color_isolate", icon='RESTRICT_VIEW_ON', text="").affect_visibility = True
row = layout.row()
@@ -147,7 +143,8 @@ class MATERIAL_PT_gpencil_slots(Panel):
if gpd.use_stroke_edit_mode:
row = layout.row(align=True)
row.operator("gpencil.stroke_change_color", text="Assign")
- row.operator("gpencil.color_select", text="Select")
+ row.operator("gpencil.color_select", text="Select").deselect = False
+ row.operator("gpencil.color_select", text="Deselect").deselect = True
elif mat:
row.template_ID(space, "pin_id")
@@ -160,11 +157,14 @@ class MATERIAL_PT_gpencil_surface(GPMaterialButtonsPanel, Panel):
@classmethod
def poll(cls, context):
ob = context.object
+ if ob is None:
+ return False
+
ma = context.object.active_material
if ma is None or ma.grease_pencil is None:
return False
- return ob and ob.type == 'GPENCIL'
+ return ob.type == 'GPENCIL'
def draw_header_preset(self, context):
MATERIAL_PT_gpencil_material_presets.draw_panel_header(self.layout)
@@ -179,6 +179,12 @@ class MATERIAL_PT_gpencil_strokecolor(GPMaterialButtonsPanel, Panel):
bl_label = "Stroke"
bl_parent_id = 'MATERIAL_PT_gpencil_surface'
+ def draw_header(self, context):
+ ma = context.object.active_material
+ if ma is not None and ma.grease_pencil is not None:
+ gpcolor = ma.grease_pencil
+ self.layout.prop(gpcolor, "show_stroke", text="")
+
@staticmethod
def draw(self, context):
layout = self.layout
@@ -211,6 +217,12 @@ class MATERIAL_PT_gpencil_fillcolor(GPMaterialButtonsPanel, Panel):
bl_label = "Fill"
bl_parent_id = 'MATERIAL_PT_gpencil_surface'
+ def draw_header(self, context):
+ ma = context.object.active_material
+ if ma is not None and ma.grease_pencil is not None:
+ gpcolor = ma.grease_pencil
+ self.layout.prop(gpcolor, "show_fill", text="")
+
@staticmethod
def draw(self, context):
layout = self.layout
@@ -231,19 +243,19 @@ class MATERIAL_PT_gpencil_fillcolor(GPMaterialButtonsPanel, Panel):
if gpcolor.fill_style != 'TEXTURE':
col.prop(gpcolor, "fill_color", text="Color")
- if gpcolor.fill_style in ('GRADIENT', 'CHESSBOARD'):
+ if gpcolor.fill_style in {'GRADIENT', 'CHESSBOARD'}:
col.prop(gpcolor, "mix_color", text="Secondary Color")
if gpcolor.fill_style == 'GRADIENT':
col.prop(gpcolor, "mix_factor", text="Mix Factor", slider=True)
- if gpcolor.fill_style in ('GRADIENT', 'CHESSBOARD'):
+ if gpcolor.fill_style in {'GRADIENT', 'CHESSBOARD'}:
col.prop(gpcolor, "flip", text="Flip Colors")
col.prop(gpcolor, "pattern_shift", text="Location")
col.prop(gpcolor, "pattern_scale", text="Scale")
- if gpcolor.gradient_type == 'RADIAL' and gpcolor.fill_style not in ('SOLID', 'CHESSBOARD'):
+ if gpcolor.gradient_type == 'RADIAL' and gpcolor.fill_style not in {'SOLID', 'CHESSBOARD'}:
col.prop(gpcolor, "pattern_radius", text="Radius")
else:
if gpcolor.fill_style != 'SOLID':
diff --git a/release/scripts/startup/bl_ui/properties_object.py b/release/scripts/startup/bl_ui/properties_object.py
index 79b2f7b8df8..d25d3c1f86e 100644
--- a/release/scripts/startup/bl_ui/properties_object.py
+++ b/release/scripts/startup/bl_ui/properties_object.py
@@ -58,7 +58,7 @@ class OBJECT_PT_transform(ObjectButtonsPanel, Panel):
row = col.row(align=True)
row.prop(ob, "location")
row.use_property_decorate = False
- row.prop(ob, "lock_location", text="", emboss=False)
+ row.prop(ob, "lock_location", text="", emboss=False, icon='DECORATE_UNLOCKED')
if ob.rotation_mode == 'QUATERNION':
col = flow.column()
@@ -66,8 +66,8 @@ class OBJECT_PT_transform(ObjectButtonsPanel, Panel):
row.prop(ob, "rotation_quaternion", text="Rotation")
sub = row.column(align=True)
sub.use_property_decorate = False
- sub.prop(ob, "lock_rotation_w", text="", emboss=False)
- sub.prop(ob, "lock_rotation", text="", emboss=False)
+ sub.prop(ob, "lock_rotation_w", text="", emboss=False, icon='DECORATE_UNLOCKED')
+ sub.prop(ob, "lock_rotation", text="", emboss=False, icon='DECORATE_UNLOCKED')
elif ob.rotation_mode == 'AXIS_ANGLE':
# row.column().label(text="Rotation")
#row.column().prop(pchan, "rotation_angle", text="Angle")
@@ -78,20 +78,20 @@ class OBJECT_PT_transform(ObjectButtonsPanel, Panel):
sub = row.column(align=True)
sub.use_property_decorate = False
- sub.prop(ob, "lock_rotation_w", text="", emboss=False)
- sub.prop(ob, "lock_rotation", text="", emboss=False)
+ sub.prop(ob, "lock_rotation_w", text="", emboss=False, icon='DECORATE_UNLOCKED')
+ sub.prop(ob, "lock_rotation", text="", emboss=False, icon='DECORATE_UNLOCKED')
else:
col = flow.column()
row = col.row(align=True)
row.prop(ob, "rotation_euler", text="Rotation")
row.use_property_decorate = False
- row.prop(ob, "lock_rotation", text="", emboss=False)
+ row.prop(ob, "lock_rotation", text="", emboss=False, icon='DECORATE_UNLOCKED')
col = flow.column()
row = col.row(align=True)
row.prop(ob, "scale")
row.use_property_decorate = False
- row.prop(ob, "lock_scale", text="", emboss=False)
+ row.prop(ob, "lock_scale", text="", emboss=False, icon='DECORATE_UNLOCKED')
row = layout.row(align=True)
row.prop(ob, "rotation_mode")
@@ -193,11 +193,11 @@ class OBJECT_PT_collections(ObjectButtonsPanel, Panel):
row.operator("object.collection_link", text="Add to Collection")
else:
row.operator("object.collection_add", text="Add to Collection")
- row.operator("object.collection_add", text="", icon='ZOOMIN')
+ row.operator("object.collection_add", text="", icon='ADD')
obj_name = obj.name
for collection in bpy.data.collections:
- # XXX this is slow and stupid!, we need 2 checks, one thats fast
+ # XXX this is slow and stupid!, we need 2 checks, one that's fast
# and another that we can be sure its not a name collision
# from linked library data
collection_objects = collection.objects
@@ -222,53 +222,59 @@ class OBJECT_PT_display(ObjectButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+
flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
obj = context.object
obj_type = obj.type
is_geometry = (obj_type in {'MESH', 'CURVE', 'SURFACE', 'META', 'FONT'})
is_wire = (obj_type in {'CAMERA', 'EMPTY'})
- is_empty_image = (obj_type == 'EMPTY' and obj.empty_draw_type == 'IMAGE')
+ is_empty_image = (obj_type == 'EMPTY' and obj.empty_display_type == 'IMAGE')
is_dupli = (obj.dupli_type != 'NONE')
- col = flow.column(align=True)
+ col = flow.column()
col.prop(obj, "show_name", text="Name")
+
+ col = flow.column()
col.prop(obj, "show_axis", text="Axis")
# Makes no sense for cameras, armatures, etc.!
# but these settings do apply to dupli instances
- col = flow.column(align=True)
if is_geometry or is_dupli:
+ col = flow.column()
col.prop(obj, "show_wire", text="Wireframe")
if obj_type == 'MESH' or is_dupli:
- col.prop(obj, "show_all_edges")
-
- col = flow.column()
- col.prop(obj, "show_bounds", text="Bounds")
- sub = col.column()
- sub.active = obj.show_bounds
- sub.prop(obj, "draw_bounds_type")
+ col = flow.column()
+ col.prop(obj, "show_all_edges", text="All Edges")
col = flow.column()
if is_geometry:
col.prop(obj, "show_texture_space", text="Texture Space")
+ col = flow.column()
col.prop(obj.display, "show_shadows", text="Shadow")
- col.prop(obj, "show_x_ray", text="X-Ray")
+ col = flow.column()
+ col.prop(obj, "show_in_front", text="In Front")
# if obj_type == 'MESH' or is_empty_image:
# col.prop(obj, "show_transparent", text="Transparency")
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+
col = flow.column()
if is_wire:
- # wire objects only use the max. draw type for duplis
+ # wire objects only use the max. display type for duplis
col.active = is_dupli
- col.prop(
- obj, "draw_type",
- text="Maximum Draw Type" if is_wire else "Maximum Draw Type",
- )
+ col.prop(obj, "display_type", text="Display As")
+
+ split = flow.split(factor=0.6)
+ split.prop(obj, "show_bounds", text="Bounds")
+ row = split.row()
+ row.active = obj.show_bounds or (obj.display_type == 'BOUNDS')
+ row.prop(obj, "display_bounds_type", text="")
if is_geometry or is_empty_image:
# Only useful with object having faces/materials...
+ col = flow.column()
col.prop(obj, "color")
@@ -322,6 +328,7 @@ class OBJECT_PT_duplication(ObjectButtonsPanel, Panel):
from .properties_animviz import (
MotionPathButtonsPanel,
+ MotionPathButtonsPanel_display,
OnionSkinButtonsPanel,
)
@@ -345,6 +352,26 @@ class OBJECT_PT_motion_paths(MotionPathButtonsPanel, Panel):
self.draw_settings(context, avs, mpath)
+class OBJECT_PT_motion_paths_display(MotionPathButtonsPanel_display, Panel):
+ #bl_label = "Object Motion Paths"
+ bl_context = "object"
+ bl_parent_id = "OBJECT_PT_motion_paths"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ return (context.object)
+
+ def draw(self, context):
+ # layout = self.layout
+
+ ob = context.object
+ avs = ob.animation_visualization
+ mpath = ob.motion_path
+
+ self.draw_settings(context, avs, mpath)
+
+
class OBJECT_PT_onion_skinning(OnionSkinButtonsPanel): # , Panel): # inherit from panel when ready
#bl_label = "Object Onion Skinning"
bl_context = "object"
@@ -373,8 +400,9 @@ classes = (
COLLECTION_MT_specials,
OBJECT_PT_collections,
OBJECT_PT_duplication,
- OBJECT_PT_display,
OBJECT_PT_motion_paths,
+ OBJECT_PT_motion_paths_display,
+ OBJECT_PT_display,
OBJECT_PT_custom_props,
)
diff --git a/release/scripts/startup/bl_ui/properties_output.py b/release/scripts/startup/bl_ui/properties_output.py
new file mode 100644
index 00000000000..cf5f65738c8
--- /dev/null
+++ b/release/scripts/startup/bl_ui/properties_output.py
@@ -0,0 +1,523 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+import bpy
+from bpy.types import Menu, Panel, UIList
+from bl_operators.presets import PresetMenu
+
+
+class RENDER_PT_presets(PresetMenu):
+ bl_label = "Render Presets"
+ preset_subdir = "render"
+ preset_operator = "script.execute_preset"
+ preset_add_operator = "render.preset_add"
+
+
+class RENDER_PT_ffmpeg_presets(PresetMenu):
+ bl_label = "FFMPEG Presets"
+ preset_subdir = "ffmpeg"
+ preset_operator = "script.python_file_run"
+
+
+class RENDER_MT_framerate_presets(Menu):
+ bl_label = "Frame Rate Presets"
+ preset_subdir = "framerate"
+ preset_operator = "script.execute_preset"
+ draw = Menu.draw_preset
+
+
+class RenderOutputButtonsPanel:
+ bl_space_type = 'PROPERTIES'
+ bl_region_type = 'WINDOW'
+ bl_context = "output"
+ # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here
+
+ @classmethod
+ def poll(cls, context):
+ return (context.engine in cls.COMPAT_ENGINES)
+
+
+class RENDER_PT_dimensions(RenderOutputButtonsPanel, Panel):
+ bl_label = "Dimensions"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ _frame_rate_args_prev = None
+ _preset_class = None
+
+ def draw_header_preset(self, context):
+ RENDER_PT_presets.draw_panel_header(self.layout)
+
+ @staticmethod
+ def _draw_framerate_label(*args):
+ # avoids re-creating text string each draw
+ if RENDER_PT_dimensions._frame_rate_args_prev == args:
+ return RENDER_PT_dimensions._frame_rate_ret
+
+ fps, fps_base, preset_label = args
+
+ if fps_base == 1.0:
+ fps_rate = round(fps)
+ else:
+ fps_rate = round(fps / fps_base, 2)
+
+ # TODO: Change the following to iterate over existing presets
+ custom_framerate = (fps_rate not in {23.98, 24, 25, 29.97, 30, 50, 59.94, 60})
+
+ if custom_framerate is True:
+ fps_label_text = f"Custom ({fps_rate!r} fps)"
+ show_framerate = True
+ else:
+ fps_label_text = f"{fps_rate!r} fps"
+ show_framerate = (preset_label == "Custom")
+
+ RENDER_PT_dimensions._frame_rate_args_prev = args
+ RENDER_PT_dimensions._frame_rate_ret = args = (fps_label_text, show_framerate)
+ return args
+
+ @staticmethod
+ def draw_framerate(layout, sub, rd):
+ if RENDER_PT_dimensions._preset_class is None:
+ RENDER_PT_dimensions._preset_class = bpy.types.RENDER_MT_framerate_presets
+
+ args = rd.fps, rd.fps_base, RENDER_PT_dimensions._preset_class.bl_label
+ fps_label_text, show_framerate = RENDER_PT_dimensions._draw_framerate_label(*args)
+
+ sub.menu("RENDER_MT_framerate_presets", text=fps_label_text)
+
+ if show_framerate:
+ col = layout.column(align=True)
+ col.prop(rd, "fps")
+ col.prop(rd, "fps_base", text="Base")
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False # No animation.
+
+ scene = context.scene
+ rd = scene.render
+
+ col = layout.column(align=True)
+ col.prop(rd, "resolution_x", text="Resolution X")
+ col.prop(rd, "resolution_y", text="Y")
+ col.prop(rd, "resolution_percentage", text="%")
+
+ col = layout.column(align=True)
+ col.prop(rd, "pixel_aspect_x", text="Aspect X")
+ col.prop(rd, "pixel_aspect_y", text="Y")
+
+ col = layout.column(align=True)
+ col.prop(rd, "use_border", text="Border")
+ sub = col.column(align=True)
+ sub.active = rd.use_border
+ sub.prop(rd, "use_crop_to_border", text="Crop")
+
+ col = layout.column(align=True)
+ col.prop(scene, "frame_start", text="Frame Start")
+ col.prop(scene, "frame_end", text="End")
+ col.prop(scene, "frame_step", text="Step")
+
+ col = layout.split()
+ col.alignment = 'RIGHT'
+ col.label(text="Frame Rate")
+ self.draw_framerate(layout, col, rd)
+
+
+class RENDER_PT_frame_remapping(RenderOutputButtonsPanel, Panel):
+ bl_label = "Time Remapping"
+ bl_parent_id = "RENDER_PT_dimensions"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False # No animation.
+
+ rd = context.scene.render
+
+ col = layout.column(align=True)
+ col.prop(rd, "frame_map_old", text="Old")
+ col.prop(rd, "frame_map_new", text="New")
+
+
+class RENDER_PT_post_processing(RenderOutputButtonsPanel, Panel):
+ bl_label = "Post Processing"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ rd = context.scene.render
+
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+ col = flow.column()
+ col.prop(rd, "use_compositing")
+ col = flow.column()
+ col.prop(rd, "use_sequencer")
+
+ layout.prop(rd, "dither_intensity", text="Dither", slider=True)
+
+
+class RENDER_PT_stamp(RenderOutputButtonsPanel, Panel):
+ bl_label = "Metadata"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False # No animation.
+
+ rd = context.scene.render
+
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+
+ col = flow.column()
+ col.prop(rd, "use_stamp_date", text="Date")
+ col = flow.column()
+ col.prop(rd, "use_stamp_time", text="Time")
+
+ col = flow.column()
+ col.prop(rd, "use_stamp_render_time", text="Render Time")
+ col = flow.column()
+ col.prop(rd, "use_stamp_frame", text="Frame")
+ col = flow.column()
+ col.prop(rd, "use_stamp_frame_range", text="Frame Range")
+ col = flow.column()
+ col.prop(rd, "use_stamp_memory", text="Memory")
+
+ col = flow.column()
+ col.prop(rd, "use_stamp_camera", text="Camera")
+ col = flow.column()
+ col.prop(rd, "use_stamp_lens", text="Lens")
+
+ col = flow.column()
+ col.prop(rd, "use_stamp_scene", text="Scene")
+ col = flow.column()
+ col.prop(rd, "use_stamp_marker", text="Marker")
+
+ col = flow.column()
+ col.prop(rd, "use_stamp_filename", text="Filename")
+
+ col = flow.column()
+ col.prop(rd, "use_stamp_sequencer_strip", text="Strip Name")
+
+ if rd.use_sequencer:
+ col = flow.column()
+ col.prop(rd, "use_stamp_strip_meta", text="Use Strip Metadata")
+
+
+class RENDER_PT_stamp_note(RenderOutputButtonsPanel, Panel):
+ bl_label = "Note"
+ bl_parent_id = "RENDER_PT_stamp"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw_header(self, context):
+ rd = context.scene.render
+
+ self.layout.prop(rd, "use_stamp_note", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ rd = context.scene.render
+
+ layout.active = rd.use_stamp_note
+ layout.prop(rd, "stamp_note_text", text="")
+
+
+class RENDER_PT_stamp_burn(RenderOutputButtonsPanel, Panel):
+ bl_label = "Burn Into Image"
+ bl_parent_id = "RENDER_PT_stamp"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw_header(self, context):
+ rd = context.scene.render
+
+ self.layout.prop(rd, "use_stamp", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ rd = context.scene.render
+
+ layout.use_property_split = True
+
+ col = layout.column()
+ col.active = rd.use_stamp
+ col.prop(rd, "stamp_font_size", text="Font Size")
+ col.prop(rd, "use_stamp_labels", text="Draw Labels")
+ col.column().prop(rd, "stamp_foreground", slider=True)
+ col.column().prop(rd, "stamp_background", slider=True)
+
+
+class RENDER_PT_output(RenderOutputButtonsPanel, Panel):
+ bl_label = "Output"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = False
+ layout.use_property_decorate = False # No animation.
+
+ rd = context.scene.render
+ image_settings = rd.image_settings
+
+ layout.prop(rd, "filepath", text="")
+
+ layout.use_property_split = True
+
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+
+ col = flow.column()
+ col.active = not rd.is_movie_format
+ col.prop(rd, "use_overwrite")
+ col = flow.column()
+ col.active = not rd.is_movie_format
+ col.prop(rd, "use_placeholder")
+ col = flow.column()
+ col.prop(rd, "use_file_extension")
+ col = flow.column()
+ col.prop(rd, "use_render_cache")
+
+ layout.template_image_settings(image_settings, color_management=False)
+
+
+class RENDER_PT_output_views(RenderOutputButtonsPanel, Panel):
+ bl_label = "Views"
+ bl_parent_id = "RENDER_PT_output"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(self, context):
+ rd = context.scene.render
+ return rd.use_multiview
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = False
+ layout.use_property_decorate = False # No animation.
+
+ rd = context.scene.render
+ layout.template_image_views(rd.image_settings)
+
+
+class RENDER_PT_encoding(RenderOutputButtonsPanel, Panel):
+ bl_label = "Encoding"
+ bl_parent_id = "RENDER_PT_output"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw_header_preset(self, context):
+ RENDER_PT_ffmpeg_presets.draw_panel_header(self.layout)
+
+ @classmethod
+ def poll(cls, context):
+ rd = context.scene.render
+ return rd.image_settings.file_format in {'FFMPEG', 'XVID', 'H264', 'THEORA'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ rd = context.scene.render
+ ffmpeg = rd.ffmpeg
+
+ layout.prop(rd.ffmpeg, "format")
+ layout.prop(ffmpeg, "use_autosplit")
+
+
+class RENDER_PT_encoding_video(RenderOutputButtonsPanel, Panel):
+ bl_label = "Video"
+ bl_parent_id = "RENDER_PT_encoding"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(cls, context):
+ rd = context.scene.render
+ return rd.image_settings.file_format in {'FFMPEG', 'XVID', 'H264', 'THEORA'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ self.draw_vcodec(context)
+
+ def draw_vcodec(self, context):
+ """Video codec options."""
+ layout = self.layout
+ ffmpeg = context.scene.render.ffmpeg
+
+ needs_codec = ffmpeg.format in {'AVI', 'QUICKTIME', 'MKV', 'OGG', 'MPEG4'}
+ if needs_codec:
+ layout.prop(ffmpeg, "codec")
+
+ if needs_codec and ffmpeg.codec == 'NONE':
+ return
+
+ if ffmpeg.codec in {'DNXHD'}:
+ layout.prop(ffmpeg, "use_lossless_output")
+
+ # Output quality
+ use_crf = needs_codec and ffmpeg.codec in {'H264', 'MPEG4', 'WEBM'}
+ if use_crf:
+ layout.prop(ffmpeg, "constant_rate_factor")
+
+ # Encoding speed
+ layout.prop(ffmpeg, "ffmpeg_preset")
+ # I-frames
+ layout.prop(ffmpeg, "gopsize")
+ # B-Frames
+ split = layout.split(factor=0.5)
+ split.prop(ffmpeg, "use_max_b_frames", text="Max B-frames")
+ pbox = split.column()
+ pbox.prop(ffmpeg, "max_b_frames", text="")
+ pbox.enabled = ffmpeg.use_max_b_frames
+
+ if not use_crf or ffmpeg.constant_rate_factor == 'NONE':
+ col = layout.column()
+
+ sub = col.column(align=True)
+ sub.prop(ffmpeg, "video_bitrate")
+ sub.prop(ffmpeg, "minrate", text="Minimum")
+ sub.prop(ffmpeg, "maxrate", text="Maximum")
+
+ col.prop(ffmpeg, "buffersize", text="Buffer")
+
+ col.separator()
+
+ col.prop(ffmpeg, "muxrate", text="Mux Rate")
+ col.prop(ffmpeg, "packetsize", text="Mux Packet Size")
+
+
+class RENDER_PT_encoding_audio(RenderOutputButtonsPanel, Panel):
+ bl_label = "Audio"
+ bl_parent_id = "RENDER_PT_encoding"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ @classmethod
+ def poll(cls, context):
+ rd = context.scene.render
+ return rd.image_settings.file_format in {'FFMPEG', 'XVID', 'H264', 'THEORA'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ rd = context.scene.render
+ ffmpeg = rd.ffmpeg
+
+ if ffmpeg.format != 'MP3':
+ layout.prop(ffmpeg, "audio_codec", text="Audio Codec")
+
+ if ffmpeg.audio_codec != 'NONE':
+ layout.prop(ffmpeg, "audio_bitrate")
+ layout.prop(ffmpeg, "audio_volume", slider=True)
+
+
+class RENDER_UL_renderviews(UIList):
+ def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
+ view = item
+ if self.layout_type in {'DEFAULT', 'COMPACT'}:
+ if view.name in {"left", "right"}:
+ layout.label(text=view.name, icon_value=icon + (not view.use))
+ else:
+ layout.prop(view, "name", text="", index=index, icon_value=icon, emboss=False)
+ layout.prop(view, "use", text="", index=index)
+
+ elif self.layout_type == 'GRID':
+ layout.alignment = 'CENTER'
+ layout.label(text="", icon_value=icon + (not view.use))
+
+
+class RENDER_PT_stereoscopy(RenderOutputButtonsPanel, Panel):
+ bl_label = "Stereoscopy"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+ bl_options = {'DEFAULT_CLOSED'}
+
+ def draw_header(self, context):
+ rd = context.scene.render
+ self.layout.prop(rd, "use_multiview", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ scene = context.scene
+ rd = scene.render
+ rv = rd.views.active
+
+ layout.active = rd.use_multiview
+ basic_stereo = rd.views_format == 'STEREO_3D'
+
+ row = layout.row()
+ row.prop(rd, "views_format", expand=True)
+
+ if basic_stereo:
+ row = layout.row()
+ row.template_list("RENDER_UL_renderviews", "name", rd, "stereo_views", rd.views, "active_index", rows=2)
+
+ row = layout.row()
+ row.label(text="File Suffix:")
+ row.prop(rv, "file_suffix", text="")
+
+ else:
+ row = layout.row()
+ row.template_list("RENDER_UL_renderviews", "name", rd, "views", rd.views, "active_index", rows=2)
+
+ col = row.column(align=True)
+ col.operator("scene.render_view_add", icon='ADD', text="")
+ col.operator("scene.render_view_remove", icon='REMOVE', text="")
+
+ row = layout.row()
+ row.label(text="Camera Suffix:")
+ row.prop(rv, "camera_suffix", text="")
+
+
+classes = (
+ RENDER_PT_presets,
+ RENDER_PT_ffmpeg_presets,
+ RENDER_MT_framerate_presets,
+ RENDER_PT_dimensions,
+ RENDER_PT_frame_remapping,
+ RENDER_PT_output,
+ RENDER_PT_output_views,
+ RENDER_PT_encoding,
+ RENDER_PT_encoding_video,
+ RENDER_PT_encoding_audio,
+ RENDER_PT_stamp,
+ RENDER_PT_stamp_note,
+ RENDER_PT_stamp_burn,
+ RENDER_UL_renderviews,
+ RENDER_PT_stereoscopy,
+ RENDER_PT_post_processing,
+)
+
+if __name__ == "__main__": # only for live edit.
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py
index 7649925b52b..1bd95019a45 100644
--- a/release/scripts/startup/bl_ui/properties_paint_common.py
+++ b/release/scripts/startup/bl_ui/properties_paint_common.py
@@ -48,16 +48,22 @@ class UnifiedPaintPanel:
@staticmethod
def unified_paint_settings(parent, context):
ups = context.tool_settings.unified_paint_settings
- parent.label(text="Unified Settings:")
- row = parent.row()
- row.prop(ups, "use_unified_size", text="Size")
- row.prop(ups, "use_unified_strength", text="Strength")
+
+ flow = parent.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+
+ col = flow.column()
+ col.prop(ups, "use_unified_size", text="Size")
+ col = flow.column()
+ col.prop(ups, "use_unified_strength", text="Strength")
if context.weight_paint_object:
- parent.prop(ups, "use_unified_weight", text="Weight")
+ col = flow.column()
+ col.prop(ups, "use_unified_weight", text="Weight")
elif context.vertex_paint_object or context.image_paint_object:
- parent.prop(ups, "use_unified_color", text="Color")
+ col = flow.column()
+ col.prop(ups, "use_unified_color", text="Color")
else:
- parent.prop(ups, "use_unified_color", text="Color")
+ col = flow.column()
+ col.prop(ups, "use_unified_color", text="Color")
@staticmethod
def prop_unified_size(parent, context, brush, prop_name, icon='NONE', text="", slider=False):
@@ -98,7 +104,7 @@ class VIEW3D_MT_tools_projectpaint_clone(Menu):
for i, uv_layer in enumerate(context.active_object.data.uv_layers):
props = layout.operator("wm.context_set_int", text=uv_layer.name, translate=False)
- props.data_path = "active_object.data.uv_texture_clone_index"
+ props.data_path = "active_object.data.uv_layer_clone_index"
props.value = i
@@ -182,7 +188,7 @@ def brush_texpaint_common(panel, context, layout, brush, settings, projpaint=Fal
elif settings.mode == 'IMAGE':
mesh = ob.data
- clone_text = mesh.uv_texture_clone.name if mesh.uv_texture_clone else ""
+ clone_text = mesh.uv_layer_clone.name if mesh.uv_layer_clone else ""
col.label(text="Source Clone Image")
col.template_ID(settings, "clone_image")
col.label(text="Source Clone UV Map")
@@ -230,15 +236,16 @@ def brush_texpaint_common(panel, context, layout, brush, settings, projpaint=Fal
def brush_texture_settings(layout, brush, sculpt):
tex_slot = brush.texture_slot
- layout.label(text="Brush Mapping:")
+ layout.use_property_split = True
+ layout.use_property_decorate = False
# map_mode
if sculpt:
- layout.row().prop(tex_slot, "map_mode", text="")
- layout.separator()
+ layout.prop(tex_slot, "map_mode", text="Mapping")
else:
- layout.row().prop(tex_slot, "tex_paint_map_mode", text="")
- layout.separator()
+ layout.prop(tex_slot, "tex_paint_map_mode", text="Mapping")
+
+ layout.separator()
if tex_slot.map_mode == 'STENCIL':
if brush.texture and brush.texture.type == 'IMAGE':
@@ -248,8 +255,7 @@ def brush_texture_settings(layout, brush, sculpt):
# angle and texture_angle_source
if tex_slot.has_texture_angle:
col = layout.column()
- col.label(text="Angle:")
- col.prop(tex_slot, "angle", text="")
+ col.prop(tex_slot, "angle", text="Angle")
if tex_slot.has_texture_angle_source:
col.prop(tex_slot, "use_rake", text="Rake")
@@ -258,32 +264,29 @@ def brush_texture_settings(layout, brush, sculpt):
if brush.sculpt_capabilities.has_random_texture_angle:
col.prop(tex_slot, "use_random", text="Random")
if tex_slot.use_random:
- col.prop(tex_slot, "random_angle", text="")
+ col.prop(tex_slot, "random_angle", text="Raandom Angle")
else:
col.prop(tex_slot, "use_random", text="Random")
if tex_slot.use_random:
- col.prop(tex_slot, "random_angle", text="")
+ col.prop(tex_slot, "random_angle", text="Random Angle")
# scale and offset
- split = layout.split()
- split.prop(tex_slot, "offset")
- split.prop(tex_slot, "scale")
+ layout.prop(tex_slot, "offset")
+ layout.prop(tex_slot, "scale")
if sculpt:
# texture_sample_bias
- col = layout.column(align=True)
- col.label(text="Sample Bias:")
- col.prop(brush, "texture_sample_bias", slider=True, text="")
+ layout.prop(brush, "texture_sample_bias", slider=True, text="Sample Bias")
def brush_mask_texture_settings(layout, brush):
mask_tex_slot = brush.mask_texture_slot
- layout.label(text="Mask Mapping:")
+ layout.use_property_split = True
+ layout.use_property_decorate = False
# map_mode
- layout.row().prop(mask_tex_slot, "mask_map_mode", text="")
- layout.separator()
+ layout.row().prop(mask_tex_slot, "mask_map_mode", text="Mask Mapping")
if mask_tex_slot.map_mode == 'STENCIL':
if brush.mask_texture and brush.mask_texture.type == 'IMAGE':
@@ -291,25 +294,22 @@ def brush_mask_texture_settings(layout, brush):
layout.operator("brush.stencil_reset_transform").mask = True
col = layout.column()
- col.prop(brush, "use_pressure_masking", text="")
+ col.prop(brush, "use_pressure_masking", text="Pressure Masking")
# angle and texture_angle_source
if mask_tex_slot.has_texture_angle:
col = layout.column()
- col.label(text="Angle:")
- col.prop(mask_tex_slot, "angle", text="")
+ col.prop(mask_tex_slot, "angle", text="Angle")
if mask_tex_slot.has_texture_angle_source:
col.prop(mask_tex_slot, "use_rake", text="Rake")
if brush.brush_capabilities.has_random_texture_angle and mask_tex_slot.has_random_texture_angle:
col.prop(mask_tex_slot, "use_random", text="Random")
if mask_tex_slot.use_random:
- col.prop(mask_tex_slot, "random_angle", text="")
+ col.prop(mask_tex_slot, "random_angle", text="Random Angle")
# scale and offset
- split = layout.split()
- split.prop(mask_tex_slot, "offset")
- split.prop(mask_tex_slot, "scale")
-
+ col.prop(mask_tex_slot, "offset")
+ col.prop(mask_tex_slot, "scale")
classes = (
VIEW3D_MT_tools_projectpaint_clone,
diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py
index ff8aeb3106b..1618b2dccfa 100644
--- a/release/scripts/startup/bl_ui/properties_particle.py
+++ b/release/scripts/startup/bl_ui/properties_particle.py
@@ -72,7 +72,7 @@ class PARTICLE_MT_specials(Menu):
def draw(self, context):
layout = self.layout
- props = layout.operator("particle.copy_particle_systems", text="Copy Active to Selected Objects")
+ props = layout.operator("particle.copy_particle_systems", text="Copy Active to Selected Objects", icon="COPYDOWN")
props.use_active = True
props.remove_target_particles = False
@@ -80,7 +80,9 @@ class PARTICLE_MT_specials(Menu):
props.use_active = False
props.remove_target_particles = True
- layout.operator("particle.duplicate_particle_system")
+ layout.separator()
+
+ layout.operator("particle.duplicate_particle_system", icon="DUPLICATE")
class PARTICLE_PT_hair_dynamics_presets(PresetMenu):
@@ -124,14 +126,12 @@ class PARTICLE_UL_particle_systems(bpy.types.UIList):
"show_render",
emboss=False,
icon_only=True,
- icon='RESTRICT_RENDER_OFF' if md.show_render else 'RESTRICT_RENDER_ON',
)
layout.prop(
md,
"show_viewport",
emboss=False,
icon_only=True,
- icon='RESTRICT_VIEW_OFF' if md.show_viewport else 'RESTRICT_VIEW_ON',
)
elif self.layout_type == 'GRID':
@@ -160,17 +160,20 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel, Panel):
row = layout.row()
row.template_list("PARTICLE_UL_particle_systems", "particle_systems", ob, "particle_systems",
- ob.particle_systems, "active_index", rows=2)
+ ob.particle_systems, "active_index", rows=3)
col = row.column(align=True)
- col.operator("object.particle_system_add", icon='ZOOMIN', text="")
- col.operator("object.particle_system_remove", icon='ZOOMOUT', text="")
+ col.operator("object.particle_system_add", icon='ADD', text="")
+ col.operator("object.particle_system_remove", icon='REMOVE', text="")
+
+ col.separator()
+
col.menu("PARTICLE_MT_specials", icon='DOWNARROW_HLT', text="")
if psys is None:
part = particle_get_settings(context)
- layout.operator("object.particle_system_add", icon='ZOOMIN', text="New")
+ layout.operator("object.particle_system_add", icon='ADD', text="New")
if part is None:
return
@@ -184,23 +187,12 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel, Panel):
layout.prop(part, "type", text="Type")
elif not psys.settings:
- split = layout.split(factor=0.32)
-
- col = split.column()
- col.label(text="Settings:")
-
- col = split.column()
col.template_ID(psys, "settings", new="particle.new")
else:
part = psys.settings
- split = layout.split(factor=0.32)
- col = split.column()
- if part.is_fluid is False:
- col.label(text="Settings:")
- col.label(text="Type:")
+ col = layout.column()
- col = split.column()
if part.is_fluid is False:
row = col.row()
row.enabled = particle_panel_enabled(context, psys)
@@ -210,13 +202,12 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel, Panel):
layout.label(text=iface_("%d fluid particles for this frame") % part.count, translate=False)
return
- row = col.row()
+ row = layout.row()
row.enabled = particle_panel_enabled(context, psys)
- row.prop(part, "type", text="")
- row.prop(psys, "seed")
+ row.prop(part, "type", expand=True)
if part:
- split = layout.split(factor=0.65)
+ split = layout.split()
if part.type == 'HAIR':
if psys is not None and psys.is_edited:
split.operator("particle.edited_clear", text="Free Edit")
@@ -225,9 +216,7 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel, Panel):
row.enabled = particle_panel_enabled(context, psys)
row.prop(part, "regrow_hair")
row.prop(part, "use_advanced_hair")
- row = split.row()
- row.enabled = particle_panel_enabled(context, psys)
- row.prop(part, "hair_step")
+
if psys is not None and psys.is_edited:
if psys.is_global_hair:
row = layout.row(align=True)
@@ -273,11 +262,13 @@ class PARTICLE_PT_emission(ParticleButtonsPanel, Panel):
col = layout.column()
col.active = part.emit_from == 'VERT' or part.distribution != 'GRID'
col.prop(part, "count")
+ col.prop(psys, "seed")
if part.type == 'HAIR':
col.prop(part, "hair_length")
+ col.prop(part, "hair_step")
+
if not part.use_advanced_hair:
- row = layout.row()
col.prop(part, "use_modifier_stack")
return
@@ -428,7 +419,6 @@ class PARTICLE_PT_hair_dynamics_structure(ParticleButtonsPanel, Panel):
psys = context.particle_system
cloth_md = psys.cloth
cloth = cloth_md.settings
- result = cloth_md.solver_result
layout.enabled = psys.use_hair_dynamics and psys.point_cache.is_baked is False
@@ -460,7 +450,6 @@ class PARTICLE_PT_hair_dynamics_volume(ParticleButtonsPanel, Panel):
psys = context.particle_system
cloth_md = psys.cloth
cloth = cloth_md.settings
- result = cloth_md.solver_result
layout.enabled = psys.use_hair_dynamics and psys.point_cache.is_baked is False
@@ -698,7 +687,6 @@ class PARTICLE_PT_physics_fluid_advanced(ParticleButtonsPanel, Panel):
@classmethod
def poll(cls, context):
part = particle_get_settings(context)
- fluid = part.fluid
if part.physics_type == 'FLUID':
return True
else:
@@ -708,7 +696,6 @@ class PARTICLE_PT_physics_fluid_advanced(ParticleButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
part = particle_get_settings(context)
fluid = part.fluid
@@ -758,7 +745,6 @@ class PARTICLE_PT_physics_fluid_springs(ParticleButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
part = particle_get_settings(context)
fluid = part.fluid
@@ -783,7 +769,6 @@ class PARTICLE_PT_physics_fluid_springs_viscoelastic(ParticleButtonsPanel, Panel
return False
def draw_header(self, context):
- psys = context.particle_system
part = particle_get_settings(context)
fluid = part.fluid
@@ -793,7 +778,6 @@ class PARTICLE_PT_physics_fluid_springs_viscoelastic(ParticleButtonsPanel, Panel
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
part = particle_get_settings(context)
fluid = part.fluid
@@ -827,7 +811,6 @@ class PARTICLE_PT_physics_fluid_springs_advanced(ParticleButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
part = particle_get_settings(context)
fluid = part.fluid
@@ -851,7 +834,6 @@ class PARTICLE_PT_physics_boids_movement(ParticleButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
part = particle_get_settings(context)
boids = part.boids
@@ -905,7 +887,6 @@ class PARTICLE_PT_physics_boids_battle(ParticleButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
part = particle_get_settings(context)
boids = part.boids
@@ -933,7 +914,6 @@ class PARTICLE_PT_physics_boids_misc(ParticleButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
part = particle_get_settings(context)
boids = part.boids
@@ -969,8 +949,8 @@ class PARTICLE_PT_physics_relations(ParticleButtonsPanel, Panel):
col = row.column()
sub = col.row()
subsub = sub.column(align=True)
- subsub.operator("particle.new_target", icon='ZOOMIN', text="")
- subsub.operator("particle.target_remove", icon='ZOOMOUT', text="")
+ subsub.operator("particle.new_target", icon='ADD', text="")
+ subsub.operator("particle.target_remove", icon='REMOVE', text="")
sub = col.row()
subsub = sub.column(align=True)
subsub.operator("particle.target_move_up", icon='TRIA_UP', text="")
@@ -1123,8 +1103,8 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel, Panel):
# boids, "active_boid_state_index", compact="True")
#col = row.row()
#sub = col.row(align=True)
- #sub.operator("boid.state_add", icon='ZOOMIN', text="")
- #sub.operator("boid.state_del", icon='ZOOMOUT', text="")
+ #sub.operator("boid.state_add", icon='ADD', text="")
+ #sub.operator("boid.state_del", icon='REMOVE', text="")
#sub = row.row(align=True)
#sub.operator("boid.state_move_up", icon='TRIA_UP', text="")
#sub.operator("boid.state_move_down", icon='TRIA_DOWN', text="")
@@ -1147,8 +1127,8 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel, Panel):
col = row.column()
sub = col.row()
subsub = sub.column(align=True)
- subsub.operator_menu_enum("boid.rule_add", "type", icon='ZOOMIN', text="")
- subsub.operator("boid.rule_del", icon='ZOOMOUT', text="")
+ subsub.operator_menu_enum("boid.rule_add", "type", icon='ADD', text="")
+ subsub.operator("boid.rule_del", icon='REMOVE', text="")
sub = col.row()
subsub = sub.column(align=True)
subsub.operator("boid.rule_move_up", icon='TRIA_UP', text="")
@@ -1220,8 +1200,10 @@ class PARTICLE_PT_render(ParticleButtonsPanel, Panel):
layout.prop(part, "render_type", text="Render As")
- if part.type == 'EMITTER' or \
- (part.render_type in {'OBJECT', 'COLLECTION'} and part.type == 'HAIR'):
+ if (
+ part.type == 'EMITTER' or
+ (part.render_type in {'OBJECT', 'COLLECTION'} and part.type == 'HAIR')
+ ):
if part.render_type not in {'NONE'}:
col = layout.column(align=True)
@@ -1235,6 +1217,10 @@ class PARTICLE_PT_render(ParticleButtonsPanel, Panel):
col.prop(part, "material_slot", text="Material")
col.prop(psys, "parent", text="Coordinate System")
+ if context.object:
+ layout.separator()
+ layout.prop(context.object, "show_duplicator_for_render", text="Show Emitter")
+
class PARTICLE_PT_render_extra(ParticleButtonsPanel, Panel):
bl_label = "Extra"
@@ -1251,8 +1237,6 @@ class PARTICLE_PT_render_extra(ParticleButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
- ob = context.object
part = particle_get_settings(context)
col = layout.column()
@@ -1278,8 +1262,6 @@ class PARTICLE_PT_render_line(ParticleButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
- ob = context.object
part = particle_get_settings(context)
col = layout.column()
@@ -1306,8 +1288,6 @@ class PARTICLE_PT_render_path(ParticleButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
- ob = context.object
part = particle_get_settings(context)
col = layout.column()
@@ -1342,7 +1322,6 @@ class PARTICLE_PT_render_path_timing(ParticleButtonsPanel, Panel):
layout.use_property_split = True
psys = context.particle_system
- ob = context.object
part = particle_get_settings(context)
col = layout.column()
@@ -1373,8 +1352,6 @@ class PARTICLE_PT_render_object(ParticleButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
- ob = context.object
part = particle_get_settings(context)
col = layout.column()
@@ -1401,8 +1378,6 @@ class PARTICLE_PT_render_collection(ParticleButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
- ob = context.object
part = particle_get_settings(context)
col = layout.column()
@@ -1441,8 +1416,6 @@ class PARTICLE_PT_render_collection_use_count(ParticleButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
- ob = context.object
part = particle_get_settings(context)
col = layout.column()
@@ -1456,8 +1429,8 @@ class PARTICLE_PT_render_collection_use_count(ParticleButtonsPanel, Panel):
col = row.column()
sub = col.row()
subsub = sub.column(align=True)
- subsub.operator("particle.dupliob_copy", icon='ZOOMIN', text="")
- subsub.operator("particle.dupliob_remove", icon='ZOOMOUT', text="")
+ subsub.operator("particle.dupliob_copy", icon='ADD', text="")
+ subsub.operator("particle.dupliob_remove", icon='REMOVE', text="")
subsub.operator("particle.dupliob_move_up", icon='TRIA_UP', text="")
subsub.operator("particle.dupliob_move_down", icon='TRIA_DOWN', text="")
subsub.separator()
@@ -1484,8 +1457,6 @@ class PARTICLE_PT_render_billboards_alignment(ParticleButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
- ob = context.object
part = particle_get_settings(context)
col = layout.column()
@@ -1510,8 +1481,6 @@ class PARTICLE_PT_render_billboards_tilt(ParticleButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
- ob = context.object
part = particle_get_settings(context)
col = layout.column()
@@ -1580,7 +1549,6 @@ class PARTICLE_PT_render_trails(ParticleButtonsPanel, Panel):
layout = self.layout
layout.use_property_split = True
- psys = context.particle_system
part = particle_get_settings(context)
col = layout.column()
@@ -1614,29 +1582,29 @@ class PARTICLE_PT_draw(ParticleButtonsPanel, Panel):
psys = context.particle_system
part = particle_get_settings(context)
- layout.prop(part, "draw_method", text="Display As")
+ layout.prop(part, "display_method", text="Display As")
- if part.draw_method == 'NONE' or (part.render_type == 'NONE' and part.draw_method == 'RENDER'):
+ if part.display_method == 'NONE' or (part.render_type == 'NONE' and part.display_method == 'RENDER'):
return
- path = (part.render_type == 'PATH' and part.draw_method == 'RENDER') or part.draw_method == 'PATH'
+ path = (part.render_type == 'PATH' and part.display_method == 'RENDER') or part.display_method == 'PATH'
layout.separator()
col = layout.column()
- col.prop(part, "draw_color", text="Color")
- if part.draw_color in {'VELOCITY', 'ACCELERATION'}:
+ col.prop(part, "display_color", text="Color")
+ if part.display_color in {'VELOCITY', 'ACCELERATION'}:
col.prop(part, "color_maximum", text="Fade Distance")
col = layout.column()
if path:
- col.prop(part, "draw_step", text="Strand Steps")
- col.prop(part, "draw_percentage", slider=True, text="Amount")
- if part.draw_method != 'RENDER' or part.render_type == 'HALO':
- col.prop(part, "draw_size", text="Size")
+ col.prop(part, "display_step", text="Strand Steps")
+ col.prop(part, "display_percentage", slider=True, text="Amount")
+ if part.display_method != 'RENDER' or part.render_type == 'HALO':
+ col.prop(part, "display_size", text="Size")
- if part.draw_percentage != 100 and psys is not None:
+ if part.display_percentage != 100 and psys is not None:
if part.type == 'HAIR':
if psys.use_hair_dynamics and psys.point_cache.is_baked is False:
layout.row().label(text="Display percentage makes dynamics inaccurate without baking")
@@ -1645,7 +1613,7 @@ class PARTICLE_PT_draw(ParticleButtonsPanel, Panel):
if phystype != 'NO' and phystype != 'KEYED' and psys.point_cache.is_baked is False:
layout.row().label(text="Display percentage makes dynamics inaccurate without baking")
else:
- layout.row().label(text="")
+ layout.separator()
col = layout.column()
col.prop(part, "show_guide_hairs", text="Guide Hairs")
@@ -1655,6 +1623,10 @@ class PARTICLE_PT_draw(ParticleButtonsPanel, Panel):
if part.physics_type == 'BOIDS':
col.prop(part, "show_health")
+ if context.object:
+ layout.separator()
+ layout.prop(context.object, "show_duplicator_for_viewport", text="Show Emitter")
+
class PARTICLE_PT_children(ParticleButtonsPanel, Panel):
bl_label = "Children"
@@ -1725,7 +1697,6 @@ class PARTICLE_PT_children_parting(ParticleButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
- psys = context.particle_system
part = particle_get_settings(context)
layout.use_property_split = True
@@ -1750,7 +1721,6 @@ class PARTICLE_PT_children_clumping(ParticleButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
- psys = context.particle_system
part = particle_get_settings(context)
layout.use_property_split = True
@@ -1792,7 +1762,6 @@ class PARTICLE_PT_children_roughness(ParticleButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
- psys = context.particle_system
part = particle_get_settings(context)
layout.use_property_split = True
@@ -1834,7 +1803,6 @@ class PARTICLE_PT_children_kink(ParticleButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
- psys = context.particle_system
part = particle_get_settings(context)
layout.use_property_split = True
diff --git a/release/scripts/startup/bl_ui/properties_physics_cloth.py b/release/scripts/startup/bl_ui/properties_physics_cloth.py
index d65be4e578a..ab281ef64d6 100644
--- a/release/scripts/startup/bl_ui/properties_physics_cloth.py
+++ b/release/scripts/startup/bl_ui/properties_physics_cloth.py
@@ -64,7 +64,6 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel, Panel):
layout.use_property_split = True
md = context.cloth
- ob = context.object
cloth = md.settings
layout.active = cloth_panel_enabled(md)
@@ -73,73 +72,94 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel, Panel):
col = flow.column()
col.prop(cloth, "quality", text="Quality Steps")
+ col = flow.column()
col.prop(cloth, "time_scale", text="Speed Multiplier")
- col.separator()
- col = flow.column()
- col.prop(cloth, "mass", text="Material Mass")
- col.prop(cloth, "structural_stiffness", text="Structural")
- col.prop(cloth, "bending_stiffness", text="Bending")
+class PHYSICS_PT_cloth_physical_properties(PhysicButtonsPanel, Panel):
+ bl_label = "Physical Properties"
+ bl_parent_id = 'PHYSICS_PT_cloth'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
- col.separator()
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
- col = flow.column()
- col.prop(cloth, "spring_damping", text="Damping Spring")
- col.prop(cloth, "air_damping", text="Air")
- col.prop(cloth, "vel_damping", text="Velocity")
+ md = context.cloth
+ cloth = md.settings
- col = flow.column()
- col.prop(cloth, "use_dynamic_mesh", text="Dynamic Mesh")
+ layout.active = cloth_panel_enabled(md)
- key = ob.data.shape_keys
+ flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True)
- if key:
- row = col.row(align=True)
- row.active = not cloth.use_dynamic_mesh
- row.prop_search(cloth, "rest_shape_key", key, "key_blocks", text="Rest Shape Key")
+ col = flow.column()
+ col.prop(cloth, "mass", text="Mass")
+ col = flow.column()
+ col.prop(cloth, "air_damping", text="Air Viscosity")
+ col = flow.column()
+ col.prop(cloth, "bending_model")
-class PHYSICS_PT_cloth_pinning(PhysicButtonsPanel, Panel):
- bl_label = "Pinning"
- bl_parent_id = 'PHYSICS_PT_cloth'
- bl_options = {'DEFAULT_CLOSED'}
+class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel, Panel):
+ bl_label = "Stiffness"
+ bl_parent_id = 'PHYSICS_PT_cloth_physical_properties'
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
- def draw_header(self, context):
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
md = context.cloth
cloth = md.settings
- self.layout.active = cloth_panel_enabled(md)
- self.layout.prop(cloth, "use_pin_cloth", text="")
+ layout.active = cloth_panel_enabled(md)
+
+ flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True)
+
+ col = flow.column()
+
+ if cloth.bending_model == 'ANGULAR':
+ col.prop(cloth, "tension_stiffness", text="Tension")
+ col = flow.column()
+ col.prop(cloth, "compression_stiffness", text="Compression")
+ else:
+ col.prop(cloth, "tension_stiffness", text="Structural")
+
+ col = flow.column()
+ col.prop(cloth, "shear_stiffness", text="Shear")
+ col = flow.column()
+ col.prop(cloth, "bending_stiffness", text="Bending")
+
+
+class PHYSICS_PT_cloth_damping(PhysicButtonsPanel, Panel):
+ bl_label = "Damping"
+ bl_parent_id = 'PHYSICS_PT_cloth_physical_properties'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
md = context.cloth
- ob = context.object
cloth = md.settings
- layout.active = cloth_panel_enabled(md) and cloth.use_pin_cloth
+ layout.active = cloth_panel_enabled(md)
flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True)
col = flow.column()
- col.prop_search(cloth, "vertex_group_mass", ob, "vertex_groups", text="Mass Group")
+ if cloth.bending_model == 'ANGULAR':
+ col.prop(cloth, "tension_damping", text="Tension")
+ col = flow.column()
+ col.prop(cloth, "compression_damping", text="Compression")
+ else:
+ col.prop(cloth, "tension_damping", text="Structural")
col = flow.column()
- col.prop(cloth, "pin_stiffness", text="Stiffness")
-
- # Disabled for now.
- """
- if cloth.vertex_group_mass:
- col = flow.column()
- col.prop(cloth, "goal_default", text="Goal Default")
- col.prop(cloth, "goal_spring", text="Stiffness")
- col.prop(cloth, "goal_friction", text="Friction")
- """
+ col.prop(cloth, "shear_damping", text="Shear")
+ col = flow.column()
+ col.prop(cloth, "bending_damping", text="Bending")
class PHYSICS_PT_cloth_cache(PhysicButtonsPanel, Panel):
@@ -153,12 +173,82 @@ class PHYSICS_PT_cloth_cache(PhysicButtonsPanel, Panel):
point_cache_ui(self, context, md.point_cache, cloth_panel_enabled(md), 'CLOTH')
+class PHYSICS_PT_cloth_shape(PhysicButtonsPanel, Panel):
+ bl_label = "Shape"
+ bl_parent_id = 'PHYSICS_PT_cloth'
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ md = context.cloth
+ ob = context.object
+ cloth = md.settings
+
+ layout.active = cloth_panel_enabled(md)
+
+ flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True)
+
+ col = flow.column(align=True)
+ col.prop_search(cloth, "vertex_group_mass", ob, "vertex_groups", text="Pin Group")
+
+ sub = col.column(align=True)
+ sub.active = cloth.vertex_group_mass != ""
+ sub.prop(cloth, "pin_stiffness", text="Stiffness")
+
+ col.separator()
+
+ col = flow.column(align=True)
+ col.prop(cloth, "use_sewing_springs", text="Sewing")
+
+ sub = col.column(align=True)
+ sub.active = cloth.use_sewing_springs
+ sub.prop(cloth, "sewing_force_max", text="Max Sewing Force")
+
+ col.separator()
+
+ col = flow.column()
+ col.prop(cloth, "shrink_min", text="Shrinking Factor")
+
+ col = flow.column()
+ col.prop(cloth, "use_dynamic_mesh", text="Dynamic Mesh")
+
+ key = ob.data.shape_keys
+
+ if key:
+ col = flow.column()
+ col.active = not cloth.use_dynamic_mesh
+ col.prop_search(cloth, "rest_shape_key", key, "key_blocks", text="Rest Shape Key")
+
+
class PHYSICS_PT_cloth_collision(PhysicButtonsPanel, Panel):
bl_label = "Collision"
bl_parent_id = 'PHYSICS_PT_cloth'
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ cloth = context.cloth.collision_settings
+ md = context.cloth
+
+ layout.active = (cloth.use_collision or cloth.use_self_collision) and cloth_panel_enabled(md)
+
+ flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True)
+
+ col = flow.column()
+ col.prop(cloth, "collision_quality", text="Quality")
+
+
+class PHYSICS_PT_cloth_object_collision(PhysicButtonsPanel, Panel):
+ bl_label = "Object Collision"
+ bl_parent_id = 'PHYSICS_PT_cloth_collision'
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
def draw_header(self, context):
cloth = context.cloth.collision_settings
@@ -177,26 +267,24 @@ class PHYSICS_PT_cloth_collision(PhysicButtonsPanel, Panel):
flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True)
col = flow.column()
- col.prop(cloth, "collision_quality", text="Quality")
col.prop(cloth, "distance_min", slider=True, text="Distance")
- col.prop(cloth, "repel_force", slider=True, text="Repel")
col = flow.column()
- col.prop(cloth, "distance_repel", slider=True, text="Repel Distance")
- col.prop(cloth, "friction")
+ col.prop(cloth, "impulse_clamp")
+
+ col = flow.column()
col.prop(cloth, "group")
class PHYSICS_PT_cloth_self_collision(PhysicButtonsPanel, Panel):
bl_label = "Self Collision"
bl_parent_id = 'PHYSICS_PT_cloth_collision'
- bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
def draw_header(self, context):
cloth = context.cloth.collision_settings
- self.layout.active = cloth_panel_enabled(context.cloth) and cloth.use_self_collision
+ self.layout.active = cloth_panel_enabled(context.cloth)
self.layout.prop(cloth, "use_self_collision", text="")
def draw(self, context):
@@ -207,30 +295,29 @@ class PHYSICS_PT_cloth_self_collision(PhysicButtonsPanel, Panel):
md = context.cloth
ob = context.object
- layout.active = cloth.use_collision and cloth_panel_enabled(md) and cloth.use_self_collision
+ layout.active = cloth.use_self_collision and cloth_panel_enabled(md)
flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True)
col = flow.column()
- col.prop(cloth, "self_collision_quality", text="Quality")
+ col.prop(cloth, "self_friction", text="Friction")
+
+ col = flow.column()
col.prop(cloth, "self_distance_min", slider=True, text="Distance")
col = flow.column()
+ col.prop(cloth, "self_impulse_clamp")
+
+ col = flow.column()
col.prop_search(cloth, "vertex_group_self_collisions", ob, "vertex_groups", text="Vertex Group")
-class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel, Panel):
- bl_label = "Stiffness Scaling"
+class PHYSICS_PT_cloth_property_weights(PhysicButtonsPanel, Panel):
+ bl_label = "Property Weights"
bl_parent_id = 'PHYSICS_PT_cloth'
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
- def draw_header(self, context):
- cloth = context.cloth.settings
-
- self.layout.active = cloth_panel_enabled(context.cloth)
- self.layout.prop(cloth, "use_stiffness_scale", text="")
-
def draw(self, context):
layout = self.layout
layout.use_property_split = True
@@ -239,7 +326,7 @@ class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel, Panel):
ob = context.object
cloth = context.cloth.settings
- layout.active = (cloth.use_stiffness_scale and cloth_panel_enabled(md))
+ layout.active = cloth_panel_enabled(md)
flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=True)
@@ -248,52 +335,35 @@ class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel, Panel):
cloth, "vertex_group_structural_stiffness", ob, "vertex_groups",
text="Structural Group"
)
- col.prop(cloth, "structural_stiffness_max", text="Max")
+ col.prop(cloth, "tension_stiffness_max", text="Max Tension")
+ col.prop(cloth, "compression_stiffness_max", text="Max Compression")
col.separator()
col = flow.column()
col.prop_search(
- cloth, "vertex_group_bending", ob, "vertex_groups",
- text="Bending Group"
+ cloth, "vertex_group_shear_stiffness", ob, "vertex_groups",
+ text="Shear Group"
)
- col.prop(cloth, "bending_stiffness_max", text="Max")
-
-
-class PHYSICS_PT_cloth_sewing(PhysicButtonsPanel, Panel):
- bl_label = "Sewing Springs"
- bl_parent_id = 'PHYSICS_PT_cloth'
- bl_options = {'DEFAULT_CLOSED'}
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
-
- def draw_header(self, context):
- cloth = context.cloth.settings
-
- self.layout.active = cloth_panel_enabled(context.cloth)
- self.layout.prop(cloth, "use_sewing_springs", text="")
-
- def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
-
- md = context.cloth
- ob = context.object
- cloth = context.cloth.settings
+ col.prop(cloth, "shear_stiffness_max", text="Max Shearing")
- layout.active = (cloth.use_sewing_springs and cloth_panel_enabled(md))
- flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=True)
+ col.separator()
col = flow.column()
- col.prop(cloth, "sewing_force_max", text="Sewing Force")
+ col.prop_search(
+ cloth, "vertex_group_bending", ob, "vertex_groups",
+ text="Bending Group"
+ )
+ col.prop(cloth, "bending_stiffness_max", text="Max Bending")
col.separator()
- col = col.column()
- col.prop_search(cloth, "vertex_group_shrink", ob, "vertex_groups", text="Shrinking Group")
-
- col = flow.column(align=True)
- col.prop(cloth, "shrink_min", text="Min")
- col.prop(cloth, "shrink_max", text="Max")
+ col = flow.column()
+ col.prop_search(
+ cloth, "vertex_group_shrink", ob, "vertex_groups",
+ text="Shrinking Group"
+ )
+ col.prop(cloth, "shrink_max", text="Max Shrinking")
class PHYSICS_PT_cloth_field_weights(PhysicButtonsPanel, Panel):
@@ -310,12 +380,15 @@ class PHYSICS_PT_cloth_field_weights(PhysicButtonsPanel, Panel):
classes = (
CLOTH_PT_presets,
PHYSICS_PT_cloth,
+ PHYSICS_PT_cloth_physical_properties,
+ PHYSICS_PT_cloth_stiffness,
+ PHYSICS_PT_cloth_damping,
PHYSICS_PT_cloth_cache,
+ PHYSICS_PT_cloth_shape,
PHYSICS_PT_cloth_collision,
+ PHYSICS_PT_cloth_object_collision,
PHYSICS_PT_cloth_self_collision,
- PHYSICS_PT_cloth_pinning,
- PHYSICS_PT_cloth_stiffness,
- PHYSICS_PT_cloth_sewing,
+ PHYSICS_PT_cloth_property_weights,
PHYSICS_PT_cloth_field_weights,
)
diff --git a/release/scripts/startup/bl_ui/properties_physics_common.py b/release/scripts/startup/bl_ui/properties_physics_common.py
index 69d9907ff99..0f7d7dd5afd 100644
--- a/release/scripts/startup/bl_ui/properties_physics_common.py
+++ b/release/scripts/startup/bl_ui/properties_physics_common.py
@@ -45,7 +45,7 @@ def physics_add(self, layout, md, name, type, typeicon, toggles):
row.prop(md, "show_viewport", text="")
else:
row.operator(
- "object.modifier_add", text=name, text_ctxt=i18n_contexts.default, icon=typeicon
+ "object.modifier_add", text=name, text_ctxt=i18n_contexts.default, icon='BLANK1'
).type = type
@@ -54,7 +54,7 @@ def physics_add_special(self, layout, data, name, addop, removeop, typeicon):
if data:
row.operator(removeop, text=name, text_ctxt=i18n_contexts.default, icon='X')
else:
- row.operator(addop, text=name, text_ctxt=i18n_contexts.default, icon=typeicon)
+ row.operator(addop, text=name, text_ctxt=i18n_contexts.default, icon='BLANK1')
class PHYSICS_PT_add(PhysicButtonsPanel, Panel):
@@ -76,7 +76,7 @@ class PHYSICS_PT_add(PhysicButtonsPanel, Panel):
col = flow.column()
if obj.field.type == 'NONE':
- col.operator("object.forcefield_toggle", text="Force Field", icon='FORCE_FORCE')
+ col.operator("object.forcefield_toggle", text="Force Field", icon='BLANK1')
else:
col.operator("object.forcefield_toggle", text="Force Field", icon='X')
@@ -133,8 +133,8 @@ def point_cache_ui(self, context, cache, enabled, cachetype):
cache.point_caches, "active_index", rows=1
)
col = row.column(align=True)
- col.operator("ptcache.add", icon='ZOOMIN', text="")
- col.operator("ptcache.remove", icon='ZOOMOUT', text="")
+ col.operator("ptcache.add", icon='ADD', text="")
+ col.operator("ptcache.remove", icon='REMOVE', text="")
if cachetype in {'PSYS', 'HAIR', 'SMOKE'}:
col = layout.column()
diff --git a/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py b/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
index 9228c40e13b..1b06af294b7 100644
--- a/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
+++ b/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
@@ -158,8 +158,8 @@ class PHYSICS_PT_dynamic_paint_settings(PhysicButtonsPanel, Panel):
)
col = row.column(align=True)
- col.operator("dpaint.surface_slot_add", icon='ZOOMIN', text="")
- col.operator("dpaint.surface_slot_remove", icon='ZOOMOUT', text="")
+ col.operator("dpaint.surface_slot_add", icon='ADD', text="")
+ col.operator("dpaint.surface_slot_remove", icon='REMOVE', text="")
layout.separator()
@@ -375,21 +375,21 @@ class PHYSICS_PT_dp_canvas_output(PhysicButtonsPanel, Panel):
row = layout.row()
row.prop_search(surface, "output_name_a", ob.data, "vertex_colors", text="Paintmap Layer")
- icons = 'ZOOMOUT' if surface.output_exists(object=ob, index=0) else 'ZOOMIN'
+ icons = 'REMOVE' if surface.output_exists(object=ob, index=0) else 'ADD'
row.operator("dpaint.output_toggle", icon=icons, text="").output = 'A'
# wet-map output.
row = layout.row()
row.prop_search(surface, "output_name_b", ob.data, "vertex_colors", text="Wetmap Layer")
- icons = 'ZOOMOUT' if surface.output_exists(object=ob, index=1) else 'ZOOMIN'
+ icons = 'REMOVE' if surface.output_exists(object=ob, index=1) else 'ADD'
row.operator("dpaint.output_toggle", icon=icons, text="").output = 'B'
elif surface_type == 'WEIGHT':
row = layout.row()
row.prop_search(surface, "output_name_a", ob, "vertex_groups", text="Vertex Group")
- icons = 'ZOOMOUT' if surface.output_exists(object=ob, index=0) else 'ZOOMIN'
+ icons = 'REMOVE' if surface.output_exists(object=ob, index=0) else 'ADD'
row.operator("dpaint.output_toggle", icon=icons, text="").output = 'A'
# image format outputs.
diff --git a/release/scripts/startup/bl_ui/properties_physics_field.py b/release/scripts/startup/bl_ui/properties_physics_field.py
index ad840bbc89f..394f42190c4 100644
--- a/release/scripts/startup/bl_ui/properties_physics_field.py
+++ b/release/scripts/startup/bl_ui/properties_physics_field.py
@@ -377,7 +377,7 @@ class PHYSICS_PT_collision_particle(PhysicButtonsPanel, Panel):
class PHYSICS_PT_collision_softbody(PhysicButtonsPanel, Panel):
- bl_label = "Softbody"
+ bl_label = "Softbody And Cloth"
bl_parent_id = "PHYSICS_PT_collision"
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
@@ -414,6 +414,15 @@ class PHYSICS_PT_collision_softbody(PhysicButtonsPanel, Panel):
col = flow.column()
col.prop(settings, "thickness_inner", text="Inner", slider=True)
+ col = flow.column()
+ col.prop(settings, "cloth_friction")
+
+ col = flow.column()
+ col.prop(settings, "use_culling")
+
+ col = flow.column()
+ col.prop(settings, "use_normal")
+
classes = (
PHYSICS_PT_field,
diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index b53777444d8..b3be04f9c5d 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -20,14 +20,14 @@
import bpy
from bpy.types import Panel, Menu, UIList
from bpy.app.translations import pgettext_iface as iface_
+from bl_operators.presets import PresetMenu
-class FRACTURE_MT_presets(Menu):
+class FRACTURE_PT_presets(PresetMenu):
bl_label = "Fracture Presets"
preset_subdir = "fracture"
preset_operator = "script.execute_preset"
- draw = Menu.draw_preset
-
+ preset_add_operator = "fracture.preset_add"
class PhysicButtonsPanel():
bl_space_type = 'PROPERTIES'
@@ -134,14 +134,12 @@ class PHYSICS_PT_fracture_dynamic(PhysicButtonsPanel, Panel):
class PHYSICS_PT_fracture(PhysicButtonsPanel, Panel):
bl_label = "Fracture"
+ def draw_header_preset(self, context):
+ FRACTURE_PT_presets.draw_panel_header(self.layout)
+
def draw(self, context):
md = context.fracture
layout = self.layout
- layout.label(text="Presets")
- sub = layout.row(align=True)
- sub.menu("FRACTURE_MT_presets", text=bpy.types.FRACTURE_MT_presets.bl_label)
- sub.operator("fracture.preset_add", text="", icon='ZOOMIN')
- sub.operator("fracture.preset_add", text="", icon='ZOOMOUT').remove_active = True
layout.context_pointer_set("modifier", md)
row = layout.row()
@@ -175,7 +173,7 @@ class PHYSICS_PT_fracture_basic(PhysicButtonsPanel, Panel):
if md.frac_algorithm in {'BOOLEAN', 'BISECT_FILL', 'BISECT_FAST_FILL', 'BOOLEAN_FRACTAL'}:
col = layout.column()
col.prop(md, "inner_material")
- col.prop_search(md, "uv_layer", ob.data, "uv_layers")
+ col.prop_search(md, "uv_layer", ob.data, "uv_layers", icon="GROUP_UVS")
if md.frac_algorithm == 'BOOLEAN_FRACTAL':
col = layout.column(align=True)
row = col.row(align=True)
@@ -329,7 +327,7 @@ class PHYSICS_PT_fracture_utilities(PhysicButtonsPanel, Panel):
col.operator("object.rigidbody_convert_to_keyframes", text = "Convert To Keyframed Objects", icon="KEY_HLT")
classes = (
- FRACTURE_MT_presets,
+ FRACTURE_PT_presets,
PHYSICS_PT_fracture,
PHYSICS_PT_fracture_basic,
PHYSICS_PT_fracture_advanced,
diff --git a/release/scripts/startup/bl_ui/properties_physics_smoke.py b/release/scripts/startup/bl_ui/properties_physics_smoke.py
index 7c9e843fcad..2e698ffb58d 100644
--- a/release/scripts/startup/bl_ui/properties_physics_smoke.py
+++ b/release/scripts/startup/bl_ui/properties_physics_smoke.py
@@ -596,9 +596,11 @@ class PHYSICS_PT_smoke_viewport_display(PhysicButtonsPanel, Panel):
sub.prop(domain, "slice_axis")
sub.prop(domain, "slice_depth")
- col = col.row()
- col.enabled = do_full_slicing or not do_axis_slicing
- col.prop(domain, "slice_per_voxel")
+ row = col.row()
+ row.enabled = do_full_slicing or not do_axis_slicing
+ row.prop(domain, "slice_per_voxel")
+
+ col.prop(domain, "display_interpolation")
class PHYSICS_PT_smoke_viewport_display_color(PhysicButtonsPanel, Panel):
@@ -643,7 +645,7 @@ class PHYSICS_PT_smoke_viewport_display_debug(PhysicButtonsPanel, Panel):
def draw_header(self, context):
md = context.smoke.domain_settings
- self.layout.prop(md, "draw_velocity", text="")
+ self.layout.prop(md, "display_velocity", text="")
def draw(self, context):
layout = self.layout
@@ -653,8 +655,8 @@ class PHYSICS_PT_smoke_viewport_display_debug(PhysicButtonsPanel, Panel):
domain = context.smoke.domain_settings
col = flow.column()
- col.enabled = domain.draw_velocity
- col.prop(domain, "vector_draw_type", text="Display As")
+ col.enabled = domain.display_velocity
+ col.prop(domain, "vector_display_type", text="Display As")
col.prop(domain, "vector_scale")
diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index 6b8cbc55c08..bbb1a067dd7 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -20,7 +20,6 @@
# <pep8 compliant>
import bpy
from bpy.types import Menu, Panel, UIList
-from bl_operators.presets import PresetMenu
from .space_view3d import (
VIEW3D_PT_shading_lighting,
VIEW3D_PT_shading_color,
@@ -28,26 +27,6 @@ from .space_view3d import (
)
-class RENDER_PT_presets(PresetMenu):
- bl_label = "Render Presets"
- preset_subdir = "render"
- preset_operator = "script.execute_preset"
- preset_add_operator = "render.preset_add"
-
-
-class RENDER_PT_ffmpeg_presets(PresetMenu):
- bl_label = "FFMPEG Presets"
- preset_subdir = "ffmpeg"
- preset_operator = "script.python_file_run"
-
-
-class RENDER_MT_framerate_presets(Menu):
- bl_label = "Frame Rate Presets"
- preset_subdir = "framerate"
- preset_operator = "script.execute_preset"
- draw = Menu.draw_preset
-
-
class RenderButtonsPanel:
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
@@ -82,95 +61,8 @@ class RENDER_PT_context(Panel):
layout.prop(rd, "engine", text="Render Engine")
-class RENDER_PT_dimensions(RenderButtonsPanel, Panel):
- bl_label = "Dimensions"
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
-
- _frame_rate_args_prev = None
- _preset_class = None
-
- def draw_header_preset(self, context):
- RENDER_PT_presets.draw_panel_header(self.layout)
-
- @staticmethod
- def _draw_framerate_label(*args):
- # avoids re-creating text string each draw
- if RENDER_PT_dimensions._frame_rate_args_prev == args:
- return RENDER_PT_dimensions._frame_rate_ret
-
- fps, fps_base, preset_label = args
-
- if fps_base == 1.0:
- fps_rate = round(fps)
- else:
- fps_rate = round(fps / fps_base, 2)
-
- # TODO: Change the following to iterate over existing presets
- custom_framerate = (fps_rate not in {23.98, 24, 25, 29.97, 30, 50, 59.94, 60})
-
- if custom_framerate is True:
- fps_label_text = f"Custom ({fps_rate!r} fps)"
- show_framerate = True
- else:
- fps_label_text = f"{fps_rate!r} fps"
- show_framerate = (preset_label == "Custom")
-
- RENDER_PT_dimensions._frame_rate_args_prev = args
- RENDER_PT_dimensions._frame_rate_ret = args = (fps_label_text, show_framerate)
- return args
-
- @staticmethod
- def draw_framerate(layout, sub, rd):
- if RENDER_PT_dimensions._preset_class is None:
- RENDER_PT_dimensions._preset_class = bpy.types.RENDER_MT_framerate_presets
-
- args = rd.fps, rd.fps_base, RENDER_PT_dimensions._preset_class.bl_label
- fps_label_text, show_framerate = RENDER_PT_dimensions._draw_framerate_label(*args)
-
- sub.menu("RENDER_MT_framerate_presets", text=fps_label_text)
-
- if show_framerate:
- col = layout.column(align=True)
- col.prop(rd, "fps")
- col.prop(rd, "fps_base", text="Base")
-
- def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
- layout.use_property_decorate = False # No animation.
-
- scene = context.scene
- rd = scene.render
-
- col = layout.column(align=True)
- col.prop(rd, "resolution_x", text="Resolution X")
- col.prop(rd, "resolution_y", text="Y")
- col.prop(rd, "resolution_percentage", text="%")
-
- col = layout.column(align=True)
- col.prop(rd, "pixel_aspect_x", text="Aspect X")
- col.prop(rd, "pixel_aspect_y", text="Y")
-
- col = layout.column(align=True)
- col.prop(rd, "use_border", text="Border")
- sub = col.column(align=True)
- sub.active = rd.use_border
- sub.prop(rd, "use_crop_to_border", text="Crop")
-
- col = layout.column(align=True)
- col.prop(scene, "frame_start", text="Frame Start")
- col.prop(scene, "frame_end", text="End")
- col.prop(scene, "frame_step", text="Step")
-
- col = layout.split()
- col.alignment = 'RIGHT'
- col.label(text="Frame Rate")
- self.draw_framerate(layout, col, rd)
-
-
-class RENDER_PT_frame_remapping(RenderButtonsPanel, Panel):
- bl_label = "Time Remapping"
- bl_parent_id = "RENDER_PT_dimensions"
+class RENDER_PT_color_management(RenderButtonsPanel, Panel):
+ bl_label = "Color Management"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
@@ -179,279 +71,53 @@ class RENDER_PT_frame_remapping(RenderButtonsPanel, Panel):
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
- rd = context.scene.render
-
- col = layout.column(align=True)
- col.prop(rd, "frame_map_old", text="Old")
- col.prop(rd, "frame_map_new", text="New")
-
-
-class RENDER_PT_post_processing(RenderButtonsPanel, Panel):
- bl_label = "Post Processing"
- bl_options = {'DEFAULT_CLOSED'}
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
-
- def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
-
- rd = context.scene.render
-
- col = layout.column(align=True)
- col.prop(rd, "use_compositing")
- col.prop(rd, "use_sequencer")
-
- col.prop(rd, "dither_intensity", text="Dither", slider=True)
-
-
-class RENDER_PT_stamp(RenderButtonsPanel, Panel):
- bl_label = "Metadata"
- bl_options = {'DEFAULT_CLOSED'}
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
-
- def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
- layout.use_property_decorate = False # No animation.
-
- rd = context.scene.render
-
- split = layout.split()
-
- col = split.column(align=True)
- col.prop(rd, "use_stamp_date", text="Date")
- col.prop(rd, "use_stamp_time", text="Time")
-
- col.separator()
+ scene = context.scene
+ view = scene.view_settings
- col.prop(rd, "use_stamp_render_time", text="Render Time")
- col.prop(rd, "use_stamp_frame", text="Frame")
- col.prop(rd, "use_stamp_frame_range", text="Frame Range")
- col.prop(rd, "use_stamp_memory", text="Memory")
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=True)
- col = split.column(align=True)
- col.prop(rd, "use_stamp_camera", text="Camera")
- col.prop(rd, "use_stamp_lens", text="Lens")
+ col = flow.column()
+ col.prop(scene.display_settings, "display_device")
col.separator()
- col.prop(rd, "use_stamp_scene", text="Scene")
- col.prop(rd, "use_stamp_marker", text="Marker")
+ col.prop(view, "view_transform")
+ col.prop(view, "look")
- col.separator()
-
- col.prop(rd, "use_stamp_filename", text="Filename")
+ col = flow.column()
+ col.prop(view, "exposure")
+ col.prop(view, "gamma")
col.separator()
- col.prop(rd, "use_stamp_sequencer_strip", text="Strip Name")
-
- if rd.use_sequencer:
- col.prop(rd, "use_stamp_strip_meta", text="Use Strip Metadata")
+ col.prop(scene.sequencer_colorspace_settings, "name", text="Sequencer")
- row = layout.split(factor=0.3)
- row.prop(rd, "use_stamp_note", text="Note")
- sub = row.row()
- sub.active = rd.use_stamp_note
- sub.prop(rd, "stamp_note_text", text="")
-
-class RENDER_PT_stamp_burn(RenderButtonsPanel, Panel):
- bl_label = "Burn Into Image"
- bl_parent_id = "RENDER_PT_stamp"
+class RENDER_PT_color_management_curves(RenderButtonsPanel, Panel):
+ bl_label = "Use Curves"
+ bl_parent_id = "RENDER_PT_color_management"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
def draw_header(self, context):
- rd = context.scene.render
-
- self.layout.prop(rd, "use_stamp", text="")
-
- def draw(self, context):
- layout = self.layout
-
- rd = context.scene.render
-
- layout.use_property_split = True
-
- col = layout.column()
- col.active = rd.use_stamp
- col.prop(rd, "stamp_font_size", text="Font Size")
- col.prop(rd, "use_stamp_labels", text="Draw Labels")
- col.column().prop(rd, "stamp_foreground", slider=True)
- col.column().prop(rd, "stamp_background", slider=True)
-
-
-class RENDER_PT_output(RenderButtonsPanel, Panel):
- bl_label = "Output"
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
-
- def draw(self, context):
- layout = self.layout
- layout.use_property_split = False
- layout.use_property_decorate = False # No animation.
-
- rd = context.scene.render
- image_settings = rd.image_settings
- file_format = image_settings.file_format
-
- layout.prop(rd, "filepath", text="")
-
- layout.use_property_split = True
-
- col = layout.column(align=True)
- sub = col.column(align=True)
- sub.active = not rd.is_movie_format
- sub.prop(rd, "use_overwrite")
- sub.prop(rd, "use_placeholder")
- col.prop(rd, "use_file_extension")
- col.prop(rd, "use_render_cache")
- layout.use_property_split = False
- layout.template_image_settings(image_settings, color_management=False)
- if rd.use_multiview:
- layout.template_image_views(image_settings)
-
-
-class RENDER_PT_encoding(RenderButtonsPanel, Panel):
- bl_label = "Encoding"
- bl_options = {'DEFAULT_CLOSED'}
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
-
- def draw_header_preset(self, context):
- RENDER_PT_ffmpeg_presets.draw_panel_header(self.layout)
-
- @classmethod
- def poll(cls, context):
- rd = context.scene.render
- return rd.image_settings.file_format in {'FFMPEG', 'XVID', 'H264', 'THEORA'}
-
- def draw(self, context):
- layout = self.layout
-
- rd = context.scene.render
- ffmpeg = rd.ffmpeg
-
- split = layout.split()
- split.prop(rd.ffmpeg, "format")
- split.prop(ffmpeg, "use_autosplit")
-
- # Video:
- layout.separator()
- self.draw_vcodec(context)
-
- # Audio:
- layout.separator()
- if ffmpeg.format != 'MP3':
- layout.prop(ffmpeg, "audio_codec", text="Audio Codec")
-
- if ffmpeg.audio_codec != 'NONE':
- row = layout.row()
- row.prop(ffmpeg, "audio_bitrate")
- row.prop(ffmpeg, "audio_volume", slider=True)
-
- def draw_vcodec(self, context):
- """Video codec options."""
- layout = self.layout
- ffmpeg = context.scene.render.ffmpeg
-
- needs_codec = ffmpeg.format in {'AVI', 'QUICKTIME', 'MKV', 'OGG', 'MPEG4'}
- if needs_codec:
- layout.prop(ffmpeg, "codec")
-
- if needs_codec and ffmpeg.codec == 'NONE':
- return
-
- if ffmpeg.codec in {'DNXHD'}:
- layout.prop(ffmpeg, "use_lossless_output")
-
- # Output quality
- use_crf = needs_codec and ffmpeg.codec in {'H264', 'MPEG4', 'WEBM'}
- if use_crf:
- layout.prop(ffmpeg, "constant_rate_factor")
-
- # Encoding speed
- layout.prop(ffmpeg, "ffmpeg_preset")
- # I-frames
- layout.prop(ffmpeg, "gopsize")
- # B-Frames
- row = layout.row()
- row.prop(ffmpeg, "use_max_b_frames", text="Max B-frames")
- pbox = row.split()
- pbox.prop(ffmpeg, "max_b_frames", text="")
- pbox.enabled = ffmpeg.use_max_b_frames
-
- if not use_crf or ffmpeg.constant_rate_factor == 'NONE':
- split = layout.split()
- col = split.column()
- col.label(text="Rate:")
- col.prop(ffmpeg, "video_bitrate")
- col.prop(ffmpeg, "minrate", text="Minimum")
- col.prop(ffmpeg, "maxrate", text="Maximum")
- col.prop(ffmpeg, "buffersize", text="Buffer")
-
- col = split.column()
- col.label(text="Mux:")
- col.prop(ffmpeg, "muxrate", text="Rate")
- col.prop(ffmpeg, "packetsize", text="Packet Size")
-
-
-class RENDER_UL_renderviews(UIList):
- def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
- view = item
- if self.layout_type in {'DEFAULT', 'COMPACT'}:
- if view.name in {"left", "right"}:
- layout.label(text=view.name, icon_value=icon + (not view.use))
- else:
- layout.prop(view, "name", text="", index=index, icon_value=icon, emboss=False)
- layout.prop(view, "use", text="", index=index)
-
- elif self.layout_type == 'GRID':
- layout.alignment = 'CENTER'
- layout.label(text="", icon_value=icon + (not view.use))
-
-
-class RENDER_PT_stereoscopy(RenderButtonsPanel, Panel):
- bl_label = "Stereoscopy"
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
- bl_options = {'DEFAULT_CLOSED'}
+ scene = context.scene
+ view = scene.view_settings
- def draw_header(self, context):
- rd = context.scene.render
- self.layout.prop(rd, "use_multiview", text="")
+ self.layout.prop(view, "use_curve_mapping", text="")
def draw(self, context):
layout = self.layout
scene = context.scene
- rd = scene.render
- rv = rd.views.active
-
- layout.active = rd.use_multiview
- basic_stereo = rd.views_format == 'STEREO_3D'
+ view = scene.view_settings
- row = layout.row()
- row.prop(rd, "views_format", expand=True)
-
- if basic_stereo:
- row = layout.row()
- row.template_list("RENDER_UL_renderviews", "name", rd, "stereo_views", rd.views, "active_index", rows=2)
-
- row = layout.row()
- row.label(text="File Suffix:")
- row.prop(rv, "file_suffix", text="")
-
- else:
- row = layout.row()
- row.template_list("RENDER_UL_renderviews", "name", rd, "views", rd.views, "active_index", rows=2)
+ layout.use_property_split = False
+ layout.use_property_decorate = False # No animation.
- col = row.column(align=True)
- col.operator("scene.render_view_add", icon='ZOOMIN', text="")
- col.operator("scene.render_view_remove", icon='ZOOMOUT', text="")
+ layout.enabled = view.use_curve_mapping
- row = layout.row()
- row.label(text="Camera Suffix:")
- row.prop(rv, "camera_suffix", text="")
+ layout.template_curve_mapping(view, "curve_mapping", levels=True)
class RENDER_PT_eevee_ambient_occlusion(RenderButtonsPanel, Panel):
@@ -476,12 +142,11 @@ class RENDER_PT_eevee_ambient_occlusion(RenderButtonsPanel, Panel):
layout.active = props.use_gtao
col = layout.column()
- col.prop(props, "use_gtao_bent_normals")
- col.prop(props, "use_gtao_bounce")
col.prop(props, "gtao_distance")
col.prop(props, "gtao_factor")
col.prop(props, "gtao_quality")
-
+ col.prop(props, "use_gtao_bent_normals")
+ col.prop(props, "use_gtao_bounce")
class RENDER_PT_eevee_motion_blur(RenderButtonsPanel, Panel):
bl_label = "Motion Blur"
@@ -532,7 +197,8 @@ class RENDER_PT_eevee_depth_of_field(RenderButtonsPanel, Panel):
layout.active = props.use_dof
col = layout.column()
col.prop(props, "bokeh_max_size")
- col.prop(props, "bokeh_threshold")
+ # Not supported yet
+ # col.prop(props, "bokeh_threshold")
class RENDER_PT_eevee_bloom(RenderButtonsPanel, Panel):
@@ -588,25 +254,57 @@ class RENDER_PT_eevee_volumetric(RenderButtonsPanel, Panel):
props = scene.eevee
layout.active = props.use_volumetric
+
+ col = layout.column(align=True)
+ col.prop(props, "volumetric_start")
+ col.prop(props, "volumetric_end")
+
col = layout.column()
- sub = col.column(align=True)
- sub.prop(props, "volumetric_start")
- sub.prop(props, "volumetric_end")
col.prop(props, "volumetric_tile_size")
- col.separator()
col.prop(props, "volumetric_samples")
- sub.prop(props, "volumetric_sample_distribution")
- col.separator()
- col.prop(props, "use_volumetric_lights")
+ col.prop(props, "volumetric_sample_distribution")
- sub = col.column()
- sub.active = props.use_volumetric_lights
- sub.prop(props, "volumetric_light_clamp", text="Light Clamping")
- col.separator()
- col.prop(props, "use_volumetric_shadows")
- sub = col.column()
- sub.active = props.use_volumetric_shadows
- sub.prop(props, "volumetric_shadow_samples", text="Shadow Samples")
+
+class RENDER_PT_eevee_volumetric_lighting(RenderButtonsPanel, Panel):
+ bl_label = "Volumetric Lighting"
+ bl_parent_id = "RENDER_PT_eevee_volumetric"
+ COMPAT_ENGINES = {'BLENDER_EEVEE'}
+
+ def draw_header(self, context):
+ scene = context.scene
+ props = scene.eevee
+ self.layout.prop(props, "use_volumetric_lights", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ scene = context.scene
+ props = scene.eevee
+
+ layout.active = props.use_volumetric_lights
+ layout.prop(props, "volumetric_light_clamp", text="Light Clamping")
+
+
+class RENDER_PT_eevee_volumetric_shadows(RenderButtonsPanel, Panel):
+ bl_label = "Volumetric Shadows"
+ bl_parent_id = "RENDER_PT_eevee_volumetric"
+ COMPAT_ENGINES = {'BLENDER_EEVEE'}
+
+ def draw_header(self, context):
+ scene = context.scene
+ props = scene.eevee
+ self.layout.prop(props, "use_volumetric_shadows", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ scene = context.scene
+ props = scene.eevee
+
+ layout.active = props.use_volumetric_shadows
+ layout.prop(props, "volumetric_shadow_samples", text="Shadow Samples")
class RENDER_PT_eevee_subsurface_scattering(RenderButtonsPanel, Panel):
@@ -691,11 +389,11 @@ class RENDER_PT_eevee_shadows(RenderButtonsPanel, Panel):
col.prop(props, "shadow_cube_size", text="Cube Size")
col.prop(props, "shadow_cascade_size", text="Cascade Size")
col.prop(props, "use_shadow_high_bitdepth")
+ col.prop(props, "use_soft_shadows")
class RENDER_PT_eevee_sampling(RenderButtonsPanel, Panel):
bl_label = "Sampling"
- bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
@@ -735,7 +433,7 @@ class RENDER_PT_eevee_indirect_lighting(RenderButtonsPanel, Panel):
col = layout.column()
col.operator("scene.light_cache_bake", text="Bake Indirect Lighting", icon='RENDER_STILL')
- col.operator("scene.light_cache_bake", text="Bake Cubemap Only", icon='LIGHTPROBE_CUBEMAP').subset = "CUBEMAPS"
+ col.operator("scene.light_cache_bake", text="Bake Cubemap Only", icon='LIGHTPROBE_CUBEMAP').subset = 'CUBEMAPS'
col.operator("scene.light_cache_free", text="Free Lighting Cache")
cache_info = scene.eevee.gi_cache_info
@@ -748,28 +446,30 @@ class RENDER_PT_eevee_indirect_lighting(RenderButtonsPanel, Panel):
col.prop(props, "gi_cubemap_resolution")
col.prop(props, "gi_visibility_resolution", text="Diffuse Occlusion")
- layout.use_property_split = False
- row = layout.split(factor=0.5)
- row.alignment = 'RIGHT'
- row.label(text="Cubemap Display")
+class RENDER_PT_eevee_indirect_lighting_display(RenderButtonsPanel, Panel):
+ bl_label = "Display"
+ bl_parent_id = "RENDER_PT_eevee_indirect_lighting"
+ COMPAT_ENGINES = {'BLENDER_EEVEE'}
- sub = row.row(align=True)
- sub.prop(props, "gi_cubemap_draw_size", text="Size")
- if props.gi_show_cubemaps:
- sub.prop(props, "gi_show_cubemaps", text="", toggle=True, icon='HIDE_OFF')
- else:
- sub.prop(props, "gi_show_cubemaps", text="", toggle=True, icon='HIDE_ON')
+ @classmethod
+ def poll(cls, context):
+ return (context.engine in cls.COMPAT_ENGINES)
- row = layout.split(factor=0.5)
- row.alignment = 'RIGHT'
- row.label(text="Irradiance Display")
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False # No animation.
+
+ scene = context.scene
+ props = scene.eevee
+
+ row = layout.row(align=True)
+ row.prop(props, "gi_cubemap_display_size", text="Cubemap Size")
+ row.prop(props, "gi_show_cubemaps", text="", toggle=True)
- sub = row.row(align=True)
- sub.prop(props, "gi_irradiance_draw_size", text="Size")
- if props.gi_show_irradiance:
- sub.prop(props, "gi_show_irradiance", text="", toggle=True, icon='HIDE_OFF')
- else:
- sub.prop(props, "gi_show_irradiance", text="", toggle=True, icon='HIDE_ON')
+ row = layout.row(align=True)
+ row.prop(props, "gi_irradiance_display_size", text="Irradiance Size")
+ row.prop(props, "gi_show_irradiance", text="", toggle=True)
class RENDER_PT_eevee_film(RenderButtonsPanel, Panel):
@@ -786,13 +486,21 @@ class RENDER_PT_eevee_film(RenderButtonsPanel, Panel):
layout.use_property_split = True
scene = context.scene
+ props = scene.eevee
rd = scene.render
+ split = layout.split()
+ split.prop(props, "use_overscan")
+ row = split.row()
+ row.active = props.use_overscan
+ row.prop(props, "overscan_size", text="")
+
col = layout.column()
col.prop(rd, "filter_size")
col.prop(rd, "alpha_mode", text="Alpha")
+
class RENDER_PT_eevee_hair(RenderButtonsPanel, Panel):
bl_label = "Hair"
bl_options = {'DEFAULT_CLOSED'}
@@ -807,10 +515,9 @@ class RENDER_PT_eevee_hair(RenderButtonsPanel, Panel):
scene = context.scene
rd = scene.render
- row = layout.row()
- row.prop(rd, "hair_type", expand=True)
-
layout.use_property_split = True
+
+ layout.prop(rd, "hair_type", expand=True)
layout.prop(rd, "hair_subdiv")
@@ -868,36 +575,120 @@ class RENDER_PT_opengl_options(RenderButtonsPanel, Panel):
VIEW3D_PT_shading_options.draw(self, context)
+class RENDER_PT_simplify(RenderButtonsPanel, Panel):
+ bl_label = "Simplify"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw_header(self, context):
+ rd = context.scene.render
+ self.layout.prop(rd, "use_simplify", text="")
+
+ def draw(self, context):
+ pass
+
+
+class RENDER_PT_simplify_viewport(RenderButtonsPanel, Panel):
+ bl_label = "Viewport"
+ bl_parent_id = "RENDER_PT_simplify"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ rd = context.scene.render
+
+ layout.active = rd.use_simplify
+
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=True)
+
+ col = flow.column()
+ col.prop(rd, "simplify_subdivision", text="Max Subdivision")
+
+ col = flow.column()
+ col.prop(rd, "simplify_child_particles", text="Max Child Particles")
+
+
+class RENDER_PT_simplify_render(RenderButtonsPanel, Panel):
+ bl_label = "Render"
+ bl_parent_id = "RENDER_PT_simplify"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ rd = context.scene.render
+
+ layout.active = rd.use_simplify
+
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=True)
+
+ col = flow.column()
+ col.prop(rd, "simplify_subdivision_render", text="Max Subdivision")
+
+ col = flow.column()
+ col.prop(rd, "simplify_child_particles_render", text="Max Child Particles")
+
+
+class RENDER_PT_simplify_greasepencil(RenderButtonsPanel, Panel):
+ bl_label = "Grease Pencil"
+ bl_parent_id = "RENDER_PT_simplify"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY', 'BLENDER_EEVEE'}
+ bl_options = {'DEFAULT_CLOSED'}
+
+ def draw_header(self, context):
+ rd = context.scene.render
+ self.layout.prop(rd, "simplify_gpencil", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+
+ rd = context.scene.render
+
+ layout.active = rd.simplify_gpencil
+
+ col = layout.column()
+ col.prop(rd, "simplify_gpencil_onplay", text="Playback Only")
+ col.prop(rd, "simplify_gpencil_view_modifier", text="Modifiers")
+ col.prop(rd, "simplify_gpencil_shader_fx", text="ShaderFX")
+
+ col = layout.column(align=True)
+ col.prop(rd, "simplify_gpencil_view_fill")
+ sub = col.column()
+ sub.active = rd.simplify_gpencil_view_fill
+ sub.prop(rd, "simplify_gpencil_remove_lines", text="Lines")
+
+
classes = (
- RENDER_PT_presets,
- RENDER_PT_ffmpeg_presets,
- RENDER_MT_framerate_presets,
RENDER_PT_context,
- RENDER_PT_dimensions,
- RENDER_PT_frame_remapping,
- RENDER_PT_post_processing,
- RENDER_PT_output,
- RENDER_PT_encoding,
- RENDER_PT_stamp,
- RENDER_PT_stamp_burn,
- RENDER_UL_renderviews,
- RENDER_PT_stereoscopy,
- RENDER_PT_eevee_hair,
RENDER_PT_eevee_sampling,
- RENDER_PT_eevee_film,
- RENDER_PT_eevee_shadows,
- RENDER_PT_eevee_indirect_lighting,
+ RENDER_PT_eevee_ambient_occlusion,
+ RENDER_PT_eevee_bloom,
+ RENDER_PT_eevee_depth_of_field,
RENDER_PT_eevee_subsurface_scattering,
RENDER_PT_eevee_screen_space_reflections,
- RENDER_PT_eevee_ambient_occlusion,
- RENDER_PT_eevee_volumetric,
RENDER_PT_eevee_motion_blur,
- RENDER_PT_eevee_depth_of_field,
- RENDER_PT_eevee_bloom,
- RENDER_PT_opengl_film,
+ RENDER_PT_eevee_volumetric,
+ RENDER_PT_eevee_volumetric_lighting,
+ RENDER_PT_eevee_volumetric_shadows,
+ RENDER_PT_eevee_hair,
+ RENDER_PT_eevee_shadows,
+ RENDER_PT_eevee_indirect_lighting,
+ RENDER_PT_eevee_indirect_lighting_display,
+ RENDER_PT_eevee_film,
RENDER_PT_opengl_lighting,
RENDER_PT_opengl_color,
RENDER_PT_opengl_options,
+ RENDER_PT_opengl_film,
+ RENDER_PT_color_management,
+ RENDER_PT_color_management_curves,
+ RENDER_PT_simplify,
+ RENDER_PT_simplify_viewport,
+ RENDER_PT_simplify_render,
+ RENDER_PT_simplify_greasepencil,
)
if __name__ == "__main__": # only for live edit.
diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index 4f3c9ed616f..d047dd1f0c5 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -33,14 +33,6 @@ from .properties_physics_common import (
)
-class SCENE_PT_units_length_presets(PresetMenu):
- """Unit of measure for properties that use length values"""
- bl_label = "Unit Presets"
- preset_subdir = "units_length"
- preset_operator = "script.execute_preset"
- preset_add_operator = "scene.units_length_preset_add"
-
-
class SCENE_UL_keying_set_paths(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
# assert(isinstance(item, bpy.types.KeyingSetPath)
@@ -82,11 +74,9 @@ class SCENE_PT_scene(SceneButtonsPanel, Panel):
class SCENE_PT_unit(SceneButtonsPanel, Panel):
bl_label = "Units"
+ bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
- def draw_header_preset(self, context):
- SCENE_PT_units_length_presets.draw_panel_header(self.layout)
-
def draw(self, context):
layout = self.layout
@@ -95,17 +85,21 @@ class SCENE_PT_unit(SceneButtonsPanel, Panel):
layout.use_property_split = True
layout.use_property_decorate = False
- flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=True)
-
- col = flow.column()
- col.prop(unit, "system")
- col.prop(unit, "system_rotation")
+ layout.prop(unit, "system")
- col = flow.column()
+ col = layout.column()
col.enabled = unit.system != 'NONE'
col.prop(unit, "scale_length")
col.prop(unit, "use_separate")
+ col = layout.column()
+ col.prop(unit, "system_rotation", text="Rotation")
+ subcol = col.column()
+ subcol.enabled = unit.system != 'NONE'
+ subcol.prop(unit, "length_unit", text="Length")
+ subcol.prop(unit, "mass_unit", text="Mass")
+ subcol.prop(unit, "time_unit", text="Time")
+
class SceneKeyingSetsPanel:
@@ -178,8 +172,8 @@ class SCENE_PT_keying_sets(SceneButtonsPanel, SceneKeyingSetsPanel, Panel):
col.template_list("UI_UL_list", "keying_sets", scene, "keying_sets", scene.keying_sets, "active_index", rows=1)
col = row.column(align=True)
- col.operator("anim.keying_set_add", icon='ZOOMIN', text="")
- col.operator("anim.keying_set_remove", icon='ZOOMOUT', text="")
+ col.operator("anim.keying_set_add", icon='ADD', text="")
+ col.operator("anim.keying_set_remove", icon='REMOVE', text="")
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
@@ -258,8 +252,8 @@ class SCENE_PT_keying_set_paths(SceneButtonsPanel, SceneKeyingSetsPanel, Panel):
col.template_list("SCENE_UL_keying_set_paths", "", ks, "paths", ks.paths, "active_index", rows=1)
col = row.column(align=True)
- col.operator("anim.keying_set_path_add", icon='ZOOMIN', text="")
- col.operator("anim.keying_set_path_remove", icon='ZOOMOUT', text="")
+ col.operator("anim.keying_set_path_add", icon='ADD', text="")
+ col.operator("anim.keying_set_path_remove", icon='REMOVE', text="")
# TODO: 1) the template_any_ID needs to be fixed for the text alignment.
# 2) use_property_decorate has to properly skip the non animatable properties.
@@ -296,62 +290,6 @@ class SCENE_PT_keying_set_paths(SceneButtonsPanel, SceneKeyingSetsPanel, Panel):
col.prop(ksp, "group")
-class SCENE_PT_color_management(SceneButtonsPanel, Panel):
- bl_label = "Color Management"
- bl_options = {'DEFAULT_CLOSED'}
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
-
- def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
-
- scene = context.scene
- view = scene.view_settings
-
- flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=True)
-
- col = flow.column()
- col.prop(scene.display_settings, "display_device")
-
- col.separator()
-
- col.prop(view, "view_transform")
- col.prop(view, "look")
-
- col = flow.column()
- col.prop(view, "exposure")
- col.prop(view, "gamma")
-
- col.separator()
-
- col.prop(scene.sequencer_colorspace_settings, "name", text="Sequencer")
-
-
-class SCENE_PT_color_management_curves(SceneButtonsPanel, Panel):
- bl_label = "Use Curves"
- bl_parent_id = "SCENE_PT_color_management"
- bl_options = {'DEFAULT_CLOSED'}
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
-
- def draw_header(self, context):
-
- scene = context.scene
- view = scene.view_settings
-
- self.layout.prop(view, "use_curve_mapping", text="")
-
- def draw(self, context):
- layout = self.layout
-
- scene = context.scene
- view = scene.view_settings
-
- layout.use_property_split = False
- layout.enabled = view.use_curve_mapping
-
- layout.template_curve_mapping(view, "curve_mapping", levels=True)
-
-
class SCENE_PT_audio(SceneButtonsPanel, Panel):
bl_label = "Audio"
bl_options = {'DEFAULT_CLOSED'}
@@ -515,93 +453,6 @@ class SCENE_PT_rigid_body_field_weights(SceneButtonsPanel, Panel):
effector_weights_ui(self, context, rbw.effector_weights, 'RIGID_BODY')
-class SCENE_PT_simplify(SceneButtonsPanel, Panel):
- bl_label = "Simplify"
- bl_options = {'DEFAULT_CLOSED'}
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
-
- def draw_header(self, context):
- rd = context.scene.render
- self.layout.prop(rd, "use_simplify", text="")
-
- def draw(self, context):
- layout = self.layout
-
-
-class SCENE_PT_simplify_viewport(SceneButtonsPanel, Panel):
- bl_label = "Viewport"
- bl_parent_id = "SCENE_PT_simplify"
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
-
- def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
-
- rd = context.scene.render
-
- layout.active = rd.use_simplify
-
- flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=True)
-
- col = flow.column()
- col.prop(rd, "simplify_subdivision", text="Max Subdivision")
-
- col = flow.column()
- col.prop(rd, "simplify_child_particles", text="Max Child Particles")
-
-
-class SCENE_PT_simplify_render(SceneButtonsPanel, Panel):
- bl_label = "Render"
- bl_parent_id = "SCENE_PT_simplify"
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
-
- def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
-
- rd = context.scene.render
-
- layout.active = rd.use_simplify
-
- flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=True)
-
- col = flow.column()
- col.prop(rd, "simplify_subdivision_render", text="Max Subdivision")
-
- col = flow.column()
- col.prop(rd, "simplify_child_particles_render", text="Max Child Particles")
-
-
-class SCENE_PT_simplify_greasepencil(SceneButtonsPanel, Panel):
- bl_label = "Grease Pencil"
- bl_parent_id = "SCENE_PT_simplify"
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY', 'BLENDER_EEVEE'}
- bl_options = {'DEFAULT_CLOSED'}
-
- def draw_header(self, context):
- rd = context.scene.render
- self.layout.prop(rd, "simplify_gpencil", text="")
-
- def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
-
- rd = context.scene.render
-
- layout.active = rd.simplify_gpencil
-
- col = layout.column()
- col.prop(rd, "simplify_gpencil_onplay", text="Playback Only")
- col.prop(rd, "simplify_gpencil_view_modifier", text="Modifiers")
- col.prop(rd, "simplify_gpencil_shader_fx", text="ShaderFX")
-
- col = layout.column(align=True)
- col.prop(rd, "simplify_gpencil_view_fill")
- sub = col.column()
- sub.active = rd.simplify_gpencil_view_fill
- sub.prop(rd, "simplify_gpencil_remove_lines", text="Lines")
-
-
class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, Panel):
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_OPENGL'}
_context_path = "scene"
@@ -609,25 +460,18 @@ class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, Panel):
classes = (
- SCENE_PT_units_length_presets,
SCENE_UL_keying_set_paths,
SCENE_PT_scene,
SCENE_PT_unit,
+ SCENE_PT_physics,
SCENE_PT_keying_sets,
SCENE_PT_keying_set_paths,
SCENE_PT_keyframing_settings,
- SCENE_PT_color_management,
- SCENE_PT_color_management_curves,
SCENE_PT_audio,
- SCENE_PT_physics,
SCENE_PT_rigid_body_world,
SCENE_PT_rigid_body_world_settings,
SCENE_PT_rigid_body_cache,
SCENE_PT_rigid_body_field_weights,
- SCENE_PT_simplify,
- SCENE_PT_simplify_viewport,
- SCENE_PT_simplify_render,
- SCENE_PT_simplify_greasepencil,
SCENE_PT_custom_props,
)
diff --git a/release/scripts/startup/bl_ui/properties_texture.py b/release/scripts/startup/bl_ui/properties_texture.py
index e112ad2ec4c..f1407672e0d 100644
--- a/release/scripts/startup/bl_ui/properties_texture.py
+++ b/release/scripts/startup/bl_ui/properties_texture.py
@@ -907,7 +907,7 @@ class TEXTURE_PT_colors_ramp(TextureButtonsPanel, TextureColorsPoll, Panel):
layout.template_color_ramp(tex, "color_ramp", expand=True)
else:
layout.alignment = 'RIGHT'
- layout.label(text="Please enable the Color Ramp first")
+ layout.label(text="Enable the Color Ramp first")
class TEXTURE_PT_custom_props(TextureButtonsPanel, PropertyPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_view_layer.py b/release/scripts/startup/bl_ui/properties_view_layer.py
index f96bf041311..b9e6b5ded43 100644
--- a/release/scripts/startup/bl_ui/properties_view_layer.py
+++ b/release/scripts/startup/bl_ui/properties_view_layer.py
@@ -38,14 +38,21 @@ class VIEWLAYER_PT_layer(ViewLayerButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+
+ layout.use_property_split = True
+
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+
layout.use_property_split = True
scene = context.scene
rd = scene.render
layer = bpy.context.view_layer
- layout.prop(layer, "use", text="Use for Rendering")
- layout.prop(rd, "use_single_layer", text="Render Single Layer")
+ col = flow.column()
+ col.prop(layer, "use", text="Use for Rendering")
+ col = flow.column()
+ col.prop(rd, "use_single_layer", text="Render Single Layer")
class VIEWLAYER_PT_eevee_layer_passes(ViewLayerButtonsPanel, Panel):
@@ -55,19 +62,26 @@ class VIEWLAYER_PT_eevee_layer_passes(ViewLayerButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+
layout.use_property_split = True
- scene = context.scene
- rd = scene.render
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+
view_layer = context.view_layer
- col = layout.column()
+ col = flow.column()
col.prop(view_layer, "use_pass_combined")
+ col = flow.column()
col.prop(view_layer, "use_pass_z")
+ col = flow.column()
col.prop(view_layer, "use_pass_mist")
+ col = flow.column()
col.prop(view_layer, "use_pass_normal")
+ col = flow.column()
col.prop(view_layer, "use_pass_ambient_occlusion")
+ col = flow.column()
col.prop(view_layer, "use_pass_subsurface_direct", text="Subsurface Direct")
+ col = flow.column()
col.prop(view_layer, "use_pass_subsurface_color", text="Subsurface Color")
diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py
index 459fd4c5f48..a9e5443fcbe 100644
--- a/release/scripts/startup/bl_ui/space_clip.py
+++ b/release/scripts/startup/bl_ui/space_clip.py
@@ -44,6 +44,87 @@ class CLIP_UL_tracking_objects(UIList):
else 'OBJECT_DATA')
+class CLIP_PT_display(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'HEADER'
+ bl_label = "Clip Display"
+ bl_ui_units_x = 13
+
+ def draw(self, context):
+ pass
+
+
+class CLIP_PT_marker_display(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'HEADER'
+ bl_label = "Marker Display"
+ bl_parent_id = 'CLIP_PT_display'
+ bl_ui_units_x = 13
+
+ def draw(self, context):
+ layout = self.layout
+
+ view = context.space_data
+
+ row = layout.row()
+
+ col = row.column()
+ col.prop(view, "show_marker_pattern", text="Pattern")
+ col.prop(view, "show_marker_search", text="Search")
+
+ col.active = view.show_track_path
+ col.prop(view, "show_track_path", text="Path")
+ col.prop(view, "path_length", text="Length")
+
+ col = row.column()
+ col.prop(view, "show_disabled", text="Show Disabled")
+ col.prop(view, "show_names", text="Info")
+
+ if view.mode != 'MASK':
+ col.prop(view, "show_bundles", text="3D Markers")
+ col.prop(view, "show_tiny_markers", text="Draw Thin")
+
+
+class CLIP_PT_clip_display(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'HEADER'
+ bl_label = "Clip Display"
+ bl_parent_id = 'CLIP_PT_display'
+ bl_ui_units_x = 13
+
+ def draw(self, context):
+ layout = self.layout
+
+ sc = context.space_data
+
+ col = layout.column(align=True)
+
+ row = layout.row(align=True)
+ row.prop(sc, "show_red_channel", text="R", toggle=True)
+ row.prop(sc, "show_green_channel", text="G", toggle=True)
+ row.prop(sc, "show_blue_channel", text="B", toggle=True)
+ row.separator()
+ row.prop(sc, "use_grayscale_preview", text="B/W", toggle=True)
+ row.separator()
+ row.prop(sc, "use_mute_footage", text="", icon='VISIBLE_IPO_ON', toggle=True)
+
+ layout.separator()
+
+ row = layout.row()
+ col = row.column()
+ col.prop(sc.clip_user, "use_render_undistorted", text="Render Undistorted")
+ col.prop(sc, "lock_selection", text="Lock to Selection")
+ col = row.column()
+ col.prop(sc, "show_stable", text="Show Stable")
+ col.prop(sc, "show_grid", text="Grid")
+ col.prop(sc, "use_manual_calibration", text="Calibration")
+
+ clip = sc.clip
+ if clip:
+ col = layout.column()
+ col.prop(clip, "display_aspect", text="Display Aspect Ratio")
+
+
class CLIP_HT_header(Header):
bl_space_type = 'CLIP_EDITOR'
@@ -58,7 +139,39 @@ class CLIP_HT_header(Header):
layout.separator_spacer()
row = layout.row()
- row.template_ID(sc, "clip", open="clip.open")
+ if sc.view == 'CLIP':
+ row.template_ID(sc, "clip", open="clip.open")
+ else:
+ row = layout.row(align=True)
+ props = row.operator("clip.refine_markers", text="", icon='TRACKING_REFINE_BACKWARDS')
+ props.backwards = True
+ row.separator()
+
+ props = row.operator("clip.clear_track_path", text="", icon='TRACKING_CLEAR_BACKWARDS')
+ props.action = 'UPTO'
+ row.separator()
+
+ props = row.operator("clip.track_markers", text="", icon='TRACKING_BACKWARDS_SINGLE')
+ props.backwards = True
+ props.sequence = False
+ props = row.operator("clip.track_markers", text="",
+ icon='TRACKING_BACKWARDS')
+ props.backwards = True
+ props.sequence = True
+ props = row.operator("clip.track_markers", text="", icon='TRACKING_FORWARDS')
+ props.backwards = False
+ props.sequence = True
+ props = row.operator("clip.track_markers", text="", icon='TRACKING_FORWARDS_SINGLE')
+ props.backwards = False
+ props.sequence = False
+ row.separator()
+
+ props = row.operator("clip.clear_track_path", text="", icon='TRACKING_CLEAR_FORWARDS')
+ props.action = 'REMAINED'
+ row.separator()
+
+ props = row.operator("clip.refine_markers", text="", icon='TRACKING_REFINE_FORWARDS')
+ props.backwards = False
layout.separator_spacer()
@@ -67,13 +180,21 @@ class CLIP_HT_header(Header):
active_object = tracking.objects.active
if sc.view == 'CLIP':
- layout.prop(sc, "pivot_point", text="", icon_only=True)
+ layout.template_running_jobs()
r = active_object.reconstruction
if r.is_valid and sc.view == 'CLIP':
layout.label(text="Solve error: %.4f" %
(r.average_error))
+
+ row = layout.row()
+ row.prop(sc, "pivot_point", text="", icon_only=True)
+ row = layout.row(align=True)
+ icon = 'LOCKED' if sc.lock_selection else 'UNLOCKED'
+ row.prop(sc, "lock_selection", icon=icon, text="")
+ row.popover(panel='CLIP_PT_display')
+
elif sc.view == 'GRAPH':
row = layout.row(align=True)
row.prop(sc, "show_graph_only_selected", text="")
@@ -94,6 +215,7 @@ class CLIP_HT_header(Header):
else:
row.prop(sc, "show_filters", icon='DISCLOSURE_TRI_RIGHT',
text="Filters")
+
elif sc.view == 'DOPESHEET':
dopesheet = tracking.dopesheet
@@ -123,10 +245,6 @@ class CLIP_HT_header(Header):
layout.separator_spacer()
if clip:
- row = layout.row()
- row.template_ID(sc, "mask", new="mask.new")
-
- layout.separator_spacer()
layout.prop(sc, "pivot_point", text="", icon_only=True)
@@ -136,6 +254,14 @@ class CLIP_HT_header(Header):
sub.active = toolsettings.use_proportional_edit_mask
sub.prop(toolsettings, "proportional_edit_falloff", text="", icon_only=True)
+ row = layout.row()
+ row.template_ID(sc, "mask", new="mask.new")
+ row.popover(panel='CLIP_PT_mask_display')
+ row = layout.row(align=True)
+ icon = 'LOCKED' if sc.lock_selection else 'UNLOCKED'
+ row.prop(sc, "lock_selection", icon=icon, text="")
+ row.popover(panel='CLIP_PT_display')
+
def draw(self, context):
layout = self.layout
@@ -151,8 +277,6 @@ class CLIP_HT_header(Header):
else:
self._draw_masking(context)
- layout.template_running_jobs()
-
class CLIP_MT_tracking_editor_menus(Menu):
bl_idname = "CLIP_MT_tracking_editor_menus"
@@ -196,6 +320,7 @@ class CLIP_MT_masking_editor_menus(Menu):
if clip:
layout.menu("MASK_MT_select")
layout.menu("CLIP_MT_clip") # XXX - remove?
+ layout.menu("MASK_MT_add")
layout.menu("MASK_MT_mask")
else:
layout.menu("CLIP_MT_clip") # XXX - remove?
@@ -247,11 +372,12 @@ class CLIP_PT_tools_clip(Panel):
def draw(self, context):
layout = self.layout
+
col = layout.column(align=True)
+ col.operator("clip.set_scene_frames")
row = col.row(align=True)
row.operator("clip.prefetch", text="Prefetch")
row.operator("clip.reload", text="Reload")
- col.operator("clip.set_scene_frames")
class CLIP_PT_tools_marker(CLIP_PT_tracking_panel, Panel):
@@ -263,8 +389,7 @@ class CLIP_PT_tools_marker(CLIP_PT_tracking_panel, Panel):
def draw(self, context):
layout = self.layout
- # sc = context.space_data
- # clip = sc.clip
+ sc = context.space_data
col = layout.column(align=True)
row = col.row(align=True)
@@ -283,14 +408,30 @@ class CLIP_PT_tracking_settings(CLIP_PT_tracking_panel, Panel):
CLIP_PT_tracking_settings_presets.draw_panel_header(self.layout)
def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
sc = context.space_data
clip = sc.clip
settings = clip.tracking.settings
- layout = self.layout
+
+ col = layout.column(align=True)
+ col.prop(settings, "default_pattern_size")
+ col.prop(settings, "default_search_size")
+
+ col.separator()
+
+ col.prop(settings, "default_motion_model")
+ col.prop(settings, "default_pattern_match", text="Match")
+
+ col.prop(settings, "use_default_brute")
+ col.prop(settings, "use_default_normalization")
+
col = layout.column()
row = col.row(align=True)
+ row.use_property_split = False
row.prop(settings, "use_default_red_channel",
text="R", toggle=True)
row.prop(settings, "use_default_green_channel",
@@ -299,42 +440,32 @@ class CLIP_PT_tracking_settings(CLIP_PT_tracking_panel, Panel):
text="B", toggle=True)
col.separator()
-
- sub = col.column(align=True)
- sub.prop(settings, "default_pattern_size")
- sub.prop(settings, "default_search_size")
-
- col.prop(settings, "default_motion_model")
-
- row = col.row(align=True)
- row.label(text="Match:")
- row.prop(settings, "default_pattern_match", text="")
-
- row = col.row(align=True)
- row.prop(settings, "use_default_brute")
- row.prop(settings, "use_default_normalization")
-
- col.separator()
col.operator("clip.track_settings_as_default",
text="Copy From Active Track")
- box = layout.box()
- row = box.row(align=True)
- row.prop(settings, "show_default_expanded", text="", emboss=False)
- row.label(text="Extra Settings")
- if settings.show_default_expanded:
- col = box.column()
- row = col.row()
- row.prop(settings, "use_default_mask")
+class CLIP_PT_tracking_settings_extras(CLIP_PT_tracking_panel, Panel):
+ bl_label = "Tracking Settings Extra"
+ bl_parent_id = "CLIP_PT_tracking_settings"
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'TOOLS'
+ bl_options = {'DEFAULT_CLOSED'}
- sub = col.column(align=True)
- sub.prop(settings, "default_correlation_min")
- sub.prop(settings, "default_frames_limit")
- sub.prop(settings, "default_margin")
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
- col = box.column()
- col.prop(settings, "default_weight")
+ sc = context.space_data
+ clip = sc.clip
+ settings = clip.tracking.settings
+
+ col = layout.column()
+ col.prop(settings, "default_weight")
+ col = layout.column(align=True)
+ col.prop(settings, "default_correlation_min")
+ col.prop(settings, "default_margin")
+ col.prop(settings, "use_default_mask")
class CLIP_PT_tools_tracking(CLIP_PT_tracking_panel, Panel):
@@ -342,6 +473,7 @@ class CLIP_PT_tools_tracking(CLIP_PT_tracking_panel, Panel):
bl_region_type = 'TOOLS'
bl_label = "Track"
bl_category = "Track"
+ bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
@@ -411,6 +543,8 @@ class CLIP_PT_tools_solve(CLIP_PT_tracking_panel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
clip = context.space_data.clip
tracking = clip.tracking
@@ -418,11 +552,10 @@ class CLIP_PT_tools_solve(CLIP_PT_tracking_panel, Panel):
tracking_object = tracking.objects.active
col = layout.column()
- row = col.row()
- row.prop(settings, "use_tripod_solver", text="Tripod")
- sub = row.row()
- sub.active = not settings.use_tripod_solver
- sub.prop(settings, "use_keyframe_selection", text="Keyframe")
+ col.prop(settings, "use_tripod_solver", text="Tripod")
+ col = layout.column()
+ col.active = not settings.use_tripod_solver
+ col.prop(settings, "use_keyframe_selection", text="Keyframe")
col = layout.column(align=True)
col.active = (not settings.use_tripod_solver and
@@ -430,11 +563,9 @@ class CLIP_PT_tools_solve(CLIP_PT_tracking_panel, Panel):
col.prop(tracking_object, "keyframe_a")
col.prop(tracking_object, "keyframe_b")
- col = layout.column(align=True)
+ col = layout.column()
col.active = tracking_object.is_camera
- row = col.row(align=True)
- row.label(text="Refine:")
- row.prop(settings, "refine_intrinsics", text="")
+ col.prop(settings, "refine_intrinsics", text="Refine")
col = layout.column(align=True)
col.scale_y = 2.0
@@ -453,16 +584,19 @@ class CLIP_PT_tools_cleanup(CLIP_PT_tracking_panel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
clip = context.space_data.clip
settings = clip.tracking.settings
- layout.operator("clip.clean_tracks")
-
- layout.prop(settings, "clean_frames", text="Frames")
- layout.prop(settings, "clean_error", text="Error")
- layout.prop(settings, "clean_action", text="")
- layout.separator()
- layout.operator("clip.filter_tracks")
+ col = layout.column()
+ col.prop(settings, "clean_frames", text="Frames")
+ col.prop(settings, "clean_error", text="Error")
+ col.prop(settings, "clean_action", text="Type")
+ col.separator()
+ col.operator("clip.clean_tracks")
+ col.operator("clip.filter_tracks")
class CLIP_PT_tools_geometry(CLIP_PT_tracking_panel, Panel):
@@ -486,11 +620,15 @@ class CLIP_PT_tools_orientation(CLIP_PT_tracking_panel, Panel):
bl_category = "Solve"
def draw(self, context):
- sc = context.space_data
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ sc = context.space_data
settings = sc.clip.tracking.settings
col = layout.column(align=True)
+
row = col.row(align=True)
row.operator("clip.set_plane", text="Floor").plane = 'FLOOR'
row.operator("clip.set_plane", text="Wall").plane = 'WALL'
@@ -504,6 +642,7 @@ class CLIP_PT_tools_orientation(CLIP_PT_tracking_panel, Panel):
layout.separator()
col = layout.column()
+
row = col.row(align=True)
row.operator("clip.set_scale")
row.operator("clip.apply_solution_scale", text="Apply Scale")
@@ -519,8 +658,8 @@ class CLIP_PT_tools_object(CLIP_PT_reconstruction_panel, Panel):
@classmethod
def poll(cls, context):
- if CLIP_PT_reconstruction_panel.poll(context):
- sc = context.space_data
+ sc = context.space_data
+ if CLIP_PT_reconstruction_panel.poll(context) and sc.mode == 'TRACKING':
clip = sc.clip
tracking_object = clip.tracking.objects.active
@@ -565,8 +704,8 @@ class CLIP_PT_objects(CLIP_PT_clip_view_panel, Panel):
sub = row.column(align=True)
- sub.operator("clip.tracking_object_new", icon='ZOOMIN', text="")
- sub.operator("clip.tracking_object_remove", icon='ZOOMOUT', text="")
+ sub.operator("clip.tracking_object_new", icon='ADD', text="")
+ sub.operator("clip.tracking_object_remove", icon='REMOVE', text="")
class CLIP_PT_track(CLIP_PT_tracking_panel, Panel):
@@ -591,7 +730,7 @@ class CLIP_PT_track(CLIP_PT_tracking_panel, Panel):
sub = row.row(align=True)
- sub.template_marker(sc, "clip", sc.clip_user, act_track, True)
+ sub.template_marker(sc, "clip", sc.clip_user, act_track, compact=True)
icon = 'LOCKED' if act_track.lock else 'UNLOCKED'
sub.prop(act_track, "lock", text="", icon=icon)
@@ -606,6 +745,8 @@ class CLIP_PT_track(CLIP_PT_tracking_panel, Panel):
row.separator()
+ layout.use_property_split = True
+
row.prop(act_track, "use_grayscale_preview", text="B/W", toggle=True)
row.separator()
@@ -619,15 +760,15 @@ class CLIP_PT_track(CLIP_PT_tracking_panel, Panel):
label_text = "Average Error: %.4f" % (act_track.average_error)
layout.label(text=label_text)
- layout.separator()
+ layout.use_property_split = False
row = layout.row(align=True)
- CLIP_PT_track_color_presets.draw_menu(row, 'Color Presets')
- row.menu('CLIP_MT_track_color_specials', text="", icon='DOWNARROW_HLT')
+ row.prop(act_track, "use_custom_color", text="")
+ CLIP_PT_track_color_presets.draw_menu(row, 'Custom Color Presets')
+ row.operator("clip.track_copy_color", icon='COPY_ID', text="")
- row = layout.row()
- row.prop(act_track, "use_custom_color")
if act_track.use_custom_color:
+ row = layout.row()
row.prop(act_track, "color", text="")
@@ -639,6 +780,7 @@ class CLIP_PT_plane_track(CLIP_PT_tracking_panel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
clip = context.space_data.clip
active_track = clip.tracking.plane_tracks.active
@@ -665,9 +807,10 @@ class CLIP_PT_track_settings(CLIP_PT_tracking_panel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
clip = context.space_data.clip
- settings = clip.tracking.settings
col = layout.column()
@@ -675,27 +818,35 @@ class CLIP_PT_track_settings(CLIP_PT_tracking_panel, Panel):
if active:
col.prop(active, "motion_model")
col.prop(active, "pattern_match", text="Match")
- col = layout.column()
- row = col.row(align=True)
- row.prop(active, "use_brute")
- row.prop(active, "use_normalization")
- box = layout.box()
- row = box.row(align=True)
- row.prop(settings, "show_extra_expanded", text="", emboss=False)
- row.label(text="Extra Settings")
+ col.prop(active, "use_brute")
+ col.prop(active, "use_normalization")
+
+
+class CLIP_PT_track_settings_extras(CLIP_PT_tracking_panel, Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'UI'
+ bl_label = "Tracking Settings Extras"
+ bl_parent_id = 'CLIP_PT_track_settings'
+ bl_options = {'DEFAULT_CLOSED'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ clip = context.space_data.clip
+ active = clip.tracking.tracks.active
+ settings = clip.tracking.settings
- if settings.show_extra_expanded:
- col = box.column()
- row = col.row()
- row.prop(active, "use_mask")
+ col = layout.column(align=True)
+ col.prop(active, "correlation_min")
+ col.prop(active, "margin")
- sub = col.column(align=True)
- sub.prop(active, "correlation_min")
- sub.prop(active, "frames_limit")
- sub.prop(active, "margin")
- sub.separator()
- sub.prop(settings, "speed")
+ col = layout.column()
+ col.prop(active, "use_mask")
+ col.prop(active, "frames_limit")
+ col.prop(settings, "speed")
class CLIP_PT_tracking_camera(Panel):
@@ -718,20 +869,19 @@ class CLIP_PT_tracking_camera(Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
sc = context.space_data
clip = sc.clip
col = layout.column(align=True)
- col.label(text="Sensor:")
- col.prop(clip.tracking.camera, "sensor_width", text="Width")
- col.prop(clip.tracking.camera, "pixel_aspect")
+ col.prop(clip.tracking.camera, "sensor_width", text="Sensor Width")
+ col.prop(clip.tracking.camera, "pixel_aspect", text="Pixel Aspect")
col = layout.column()
- col.label(text="Optical Center:")
- row = col.row()
- row.prop(clip.tracking.camera, "principal", text="")
- col.operator("clip.set_center_principal", text="Center")
+ col.prop(clip.tracking.camera, "principal", text="Optical Center")
+ col.operator("clip.set_center_principal", text="Set Center")
class CLIP_PT_tracking_lens(Panel):
@@ -751,22 +901,23 @@ class CLIP_PT_tracking_lens(Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
sc = context.space_data
clip = sc.clip
+ camera = clip.tracking.camera
- row = layout.row(align=True)
- sub = row.split(factor=0.65, align=True)
- if clip.tracking.camera.units == 'MILLIMETERS':
- sub.prop(clip.tracking.camera, "focal_length")
+ col = layout.column()
+
+ if camera.units == 'MILLIMETERS':
+ col.prop(camera, "focal_length")
else:
- sub.prop(clip.tracking.camera, "focal_length_pixels")
- sub.prop(clip.tracking.camera, "units", text="")
+ col.prop(camera, "focal_length_pixels")
+ col.prop(camera, "units", text="Units")
col = layout.column()
- col.label(text="Lens Distortion:")
- camera = clip.tracking.camera
- col.prop(camera, "distortion_model", text="")
+ col.prop(camera, "distortion_model", text="Lens Distortion")
if camera.distortion_model == 'POLYNOMIAL':
col = layout.column(align=True)
col.prop(camera, "k1")
@@ -778,79 +929,6 @@ class CLIP_PT_tracking_lens(Panel):
col.prop(camera, "division_k2")
-class CLIP_PT_display(CLIP_PT_clip_view_panel, Panel):
- bl_space_type = 'CLIP_EDITOR'
- bl_region_type = 'UI'
- bl_label = "Display"
-
- def draw(self, context):
- layout = self.layout
- sc = context.space_data
-
- row = layout.row(align=True)
-
- sub = row.row(align=True)
- sub.prop(sc, "show_red_channel", text="R", toggle=True)
- sub.prop(sc, "show_green_channel", text="G", toggle=True)
- sub.prop(sc, "show_blue_channel", text="B", toggle=True)
- row.separator()
- row.prop(sc, "use_grayscale_preview", text="B/W", toggle=True)
- row.separator()
- row.prop(sc, "use_mute_footage", text="", icon='VISIBLE_IPO_ON', toggle=True)
-
- col = layout.column(align=True)
- col.prop(sc.clip_user, "use_render_undistorted", text="Render Undistorted")
- col.prop(sc, "lock_selection", text="Lock to Selection")
- col.prop(sc, "show_stable", text="Display Stabilization")
- if sc.view == 'GRAPH':
- col.prop(sc, "lock_time_cursor")
- row = col.row(align=True)
- row.prop(sc, "show_grid", text="Grid")
- row.prop(sc, "use_manual_calibration", text="Calibration")
-
- clip = sc.clip
- if clip:
- col.label(text="Display Aspect Ratio:")
- row = col.row()
- row.prop(clip, "display_aspect", text="")
-
-
-class CLIP_PT_marker_display(CLIP_PT_clip_view_panel, Panel):
- bl_space_type = 'CLIP_EDITOR'
- bl_region_type = 'UI'
- bl_label = "Marker Display"
-
- @classmethod
- def poll(cls, context):
- sc = context.space_data
-
- return sc.mode != 'MASK'
-
- def draw(self, context):
- layout = self.layout
- sc = context.space_data
-
- col = layout.column(align=True)
- row = col.row(align=True)
- row.prop(sc, "show_marker_pattern", text="Pattern")
- row.prop(sc, "show_marker_search", text="Search")
-
- row = col.row(align=True)
- row.active = sc.show_track_path
- row.prop(sc, "show_track_path", text="Path")
- row.prop(sc, "path_length", text="Length")
-
- col = layout.column(align=True)
- row = col.row(align=True)
- row.prop(sc, "show_disabled", text="Disabled")
- row.prop(sc, "show_names", text="Info")
-
- row = col.row(align=True)
- if sc.mode != 'MASK':
- row.prop(sc, "show_bundles", text="3D Markers")
- row.prop(sc, "show_tiny_markers", text="Thin")
-
-
class CLIP_PT_marker(CLIP_PT_tracking_panel, Panel):
bl_space_type = 'CLIP_EDITOR'
bl_region_type = 'UI'
@@ -859,12 +937,15 @@ class CLIP_PT_marker(CLIP_PT_tracking_panel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
sc = context.space_data
clip = context.space_data.clip
act_track = clip.tracking.tracks.active
if act_track:
- layout.template_marker(sc, "clip", sc.clip_user, act_track, False)
+ layout.template_marker(sc, "clip", sc.clip_user, act_track, compact=False)
else:
layout.active = False
layout.label(text="No active track")
@@ -892,19 +973,22 @@ class CLIP_PT_stabilization(CLIP_PT_reconstruction_panel, Panel):
self.layout.prop(stab, "use_2d_stabilization", text="")
def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
tracking = context.space_data.clip.tracking
stab = tracking.stabilization
- layout = self.layout
layout.active = stab.use_2d_stabilization
layout.prop(stab, "anchor_frame")
row = layout.row(align=True)
- row.prop(stab, "use_stabilize_rotation", text="Rotation", toggle=True)
+ row.prop(stab, "use_stabilize_rotation", text="Rotation")
sub = row.row(align=True)
sub.active = stab.use_stabilize_rotation
- sub.prop(stab, "use_stabilize_scale", text="Scale", toggle=True)
+ sub.prop(stab, "use_stabilize_scale", text="Scale")
box = layout.box()
row = box.row(align=True)
@@ -920,8 +1004,8 @@ class CLIP_PT_stabilization(CLIP_PT_reconstruction_panel, Panel):
sub = row.column(align=True)
- sub.operator("clip.stabilize_2d_add", icon='ZOOMIN', text="")
- sub.operator("clip.stabilize_2d_remove", icon='ZOOMOUT', text="")
+ sub.operator("clip.stabilize_2d_add", icon='ADD', text="")
+ sub.operator("clip.stabilize_2d_remove", icon='REMOVE', text="")
sub.menu('CLIP_MT_stabilize_2d_specials', text="",
icon='DOWNARROW_HLT')
@@ -937,22 +1021,21 @@ class CLIP_PT_stabilization(CLIP_PT_reconstruction_panel, Panel):
sub = row.column(align=True)
- sub.operator("clip.stabilize_2d_rotation_add", icon='ZOOMIN', text="")
- sub.operator("clip.stabilize_2d_rotation_remove", icon='ZOOMOUT', text="")
+ sub.operator("clip.stabilize_2d_rotation_add", icon='ADD', text="")
+ sub.operator("clip.stabilize_2d_rotation_remove", icon='REMOVE', text="")
sub.menu('CLIP_MT_stabilize_2d_rotation_specials', text="",
icon='DOWNARROW_HLT')
- row = layout.row()
- row.prop(stab, "use_autoscale")
- sub = row.row()
+ col = layout.column()
+ col.prop(stab, "use_autoscale")
+ sub = col.row()
sub.active = stab.use_autoscale
sub.prop(stab, "scale_max", text="Max")
col = layout.column(align=True)
row = col.row(align=True)
- # Hrm, how to make it more obvious label?
- row.prop(stab, "target_position", text="")
+ row.prop(stab, "target_position", text="Target")
col.prop(stab, "target_rotation")
row = col.row(align=True)
row.prop(stab, "target_scale")
@@ -1004,6 +1087,9 @@ class CLIP_PT_proxy(CLIP_PT_clip_view_panel, Panel):
row.prop(clip.proxy, "build_undistorted_75", toggle=True)
row.prop(clip.proxy, "build_undistorted_100", toggle=True)
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+ col = layout.column()
col.prop(clip.proxy, "quality")
col.prop(clip, "use_proxy_custom_directory")
@@ -1018,14 +1104,11 @@ class CLIP_PT_proxy(CLIP_PT_clip_view_panel, Panel):
if clip.source == 'MOVIE':
col2 = col.column()
+ col2.prop(clip.proxy, "timecode", text="Timecode Index")
- col2.label(text="Use Timecode Index:")
- col2.prop(clip.proxy, "timecode", text="")
-
- col2 = col.column()
- col2.label(text="Proxy Render Size:")
+ col.separator()
- col.prop(sc.clip_user, "proxy_render_size", text="")
+ col.prop(sc.clip_user, "proxy_render_size", text="Proxy Size")
# -----------------------------------------------------------------------------
@@ -1037,9 +1120,7 @@ from .properties_mask_common import (
MASK_PT_spline,
MASK_PT_point,
MASK_PT_display,
- MASK_PT_tools,
MASK_PT_transforms,
- MASK_PT_add,
)
@@ -1050,7 +1131,7 @@ class CLIP_PT_mask_layers(MASK_PT_layers, Panel):
class CLIP_PT_mask_display(MASK_PT_display, Panel):
bl_space_type = 'CLIP_EDITOR'
- bl_region_type = 'UI'
+ bl_region_type = 'HEADER'
class CLIP_PT_active_mask_spline(MASK_PT_spline, Panel):
@@ -1068,20 +1149,11 @@ class CLIP_PT_mask(MASK_PT_mask, Panel):
bl_region_type = 'UI'
-class CLIP_PT_tools_mask_add(MASK_PT_add, Panel):
- bl_space_type = 'CLIP_EDITOR'
- bl_region_type = 'TOOLS'
-
-
class CLIP_PT_tools_mask_transforms(MASK_PT_transforms, Panel):
bl_space_type = 'CLIP_EDITOR'
bl_region_type = 'TOOLS'
-class CLIP_PT_tools_mask(MASK_PT_tools, Panel):
- bl_space_type = 'CLIP_EDITOR'
- bl_region_type = 'TOOLS'
-
# --- end mask ---
@@ -1093,6 +1165,8 @@ class CLIP_PT_footage(CLIP_PT_clip_view_panel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
sc = context.space_data
clip = sc.clip
@@ -1101,20 +1175,6 @@ class CLIP_PT_footage(CLIP_PT_clip_view_panel, Panel):
col.template_movieclip(sc, "clip", compact=True)
col.prop(clip, "frame_start")
col.prop(clip, "frame_offset")
-
-
-class CLIP_PT_footage_info(CLIP_PT_clip_view_panel, Panel):
- bl_space_type = 'CLIP_EDITOR'
- bl_region_type = 'UI'
- bl_label = "Footage Information"
- bl_options = {'DEFAULT_CLOSED'}
-
- def draw(self, context):
- layout = self.layout
-
- sc = context.space_data
-
- col = layout.column()
col.template_movieclip_information(sc, "clip", sc.clip_user)
@@ -1339,7 +1399,7 @@ class CLIP_MT_select(Menu):
def draw(self, context):
layout = self.layout
- layout.operator("clip.select_border")
+ layout.operator("clip.select_box")
layout.operator("clip.select_circle")
layout.separator()
@@ -1415,15 +1475,6 @@ class CLIP_PT_tracking_settings_presets(PresetMenu):
preset_add_operator = "clip.tracking_settings_preset_add"
-class CLIP_MT_track_color_specials(Menu):
- bl_label = "Track Color Specials"
-
- def draw(self, context):
- layout = self.layout
-
- layout.operator("clip.track_copy_color", icon='COPY_ID')
-
-
class CLIP_MT_stabilize_2d_specials(Menu):
bl_label = "Translation Track Specials"
@@ -1442,9 +1493,25 @@ class CLIP_MT_stabilize_2d_rotation_specials(Menu):
layout.operator("clip.stabilize_2d_rotation_select")
+class CLIP_MT_pivot_pie(Menu):
+ bl_label = "Pivot Point"
+
+ def draw(self, context):
+ layout = self.layout
+ pie = layout.menu_pie()
+
+ pie.prop_enum(context.space_data, "pivot_point", value='BOUNDING_BOX_CENTER')
+ pie.prop_enum(context.space_data, "pivot_point", value='CURSOR')
+ pie.prop_enum(context.space_data, "pivot_point", value='INDIVIDUAL_ORIGINS')
+ pie.prop_enum(context.space_data, "pivot_point", value='MEDIAN_POINT')
+
+
classes = (
CLIP_UL_tracking_objects,
CLIP_HT_header,
+ CLIP_PT_display,
+ CLIP_PT_clip_display,
+ CLIP_PT_marker_display,
CLIP_MT_track,
CLIP_MT_tracking_editor_menus,
CLIP_MT_masking_editor_menus,
@@ -1452,6 +1519,7 @@ classes = (
CLIP_PT_tools_clip,
CLIP_PT_tools_marker,
CLIP_PT_tracking_settings,
+ CLIP_PT_tracking_settings_extras,
CLIP_PT_tools_tracking,
CLIP_PT_tools_plane_tracking,
CLIP_PT_tools_solve,
@@ -1462,11 +1530,10 @@ classes = (
CLIP_PT_objects,
CLIP_PT_plane_track,
CLIP_PT_track_settings,
+ CLIP_PT_track_settings_extras,
CLIP_PT_tracking_camera,
CLIP_PT_tracking_lens,
- CLIP_PT_display,
CLIP_PT_marker,
- CLIP_PT_marker_display,
CLIP_PT_stabilization,
CLIP_PT_proxy,
CLIP_PT_mask,
@@ -1474,11 +1541,8 @@ classes = (
CLIP_PT_mask_display,
CLIP_PT_active_mask_spline,
CLIP_PT_active_mask_point,
- CLIP_PT_tools_mask,
- CLIP_PT_tools_mask_add,
CLIP_PT_tools_mask_transforms,
CLIP_PT_footage,
- CLIP_PT_footage_info,
CLIP_PT_tools_scenesetup,
CLIP_PT_grease_pencil,
CLIP_PT_tools_grease_pencil_draw,
@@ -1494,9 +1558,9 @@ classes = (
CLIP_PT_camera_presets,
CLIP_PT_track_color_presets,
CLIP_PT_tracking_settings_presets,
- CLIP_MT_track_color_specials,
CLIP_MT_stabilize_2d_specials,
CLIP_MT_stabilize_2d_rotation_specials,
+ CLIP_MT_pivot_pie,
)
if __name__ == "__main__": # only for live edit.
diff --git a/release/scripts/startup/bl_ui/space_dopesheet.py b/release/scripts/startup/bl_ui/space_dopesheet.py
index f16a906f4cf..5ef42dcd129 100644
--- a/release/scripts/startup/bl_ui/space_dopesheet.py
+++ b/release/scripts/startup/bl_ui/space_dopesheet.py
@@ -19,15 +19,19 @@
# <pep8 compliant>
import bpy
-from bpy.types import Header, Menu, Panel
-from .space_time import *
-
+from bpy.types import (
+ Header,
+ Menu,
+ Panel,
+)
#######################################
# DopeSheet Filtering - Header Buttons
# used for DopeSheet, NLA, and Graph Editors
-def dopesheet_filter(layout, context, genericFiltersOnly=False):
+
+
+def dopesheet_filter(layout, context, generic_filters_only=False):
dopesheet = context.space_data.dopesheet
is_nla = context.area.type == 'NLA_EDITOR'
@@ -40,7 +44,7 @@ def dopesheet_filter(layout, context, genericFiltersOnly=False):
else: # graph and dopesheet editors - F-Curves and drivers only
row.prop(dopesheet, "show_only_errors", text="")
- if not genericFiltersOnly:
+ if not generic_filters_only:
if bpy.data.collections:
row = layout.row(align=True)
row.prop(dopesheet, "filter_collection", text="")
@@ -105,27 +109,14 @@ class DopesheetFilterPopoverBase:
def draw_standard_filters(cls, context, layout):
dopesheet = context.space_data.dopesheet
- # Object Data Filters
- layout.label(text="Include Sub-Object Data:")
- split = layout.split()
-
- # TODO: Add per-channel/axis convenience toggles?
- col = split.column()
- col.prop(dopesheet, "show_transforms", text="Transforms")
-
- col = split.column()
- col.prop(dopesheet, "show_modifiers", text="Modifiers")
-
- layout.separator()
-
# datablock filters
- layout.label(text="Include From Types:")
+ layout.label(text="Filter by Type:")
flow = layout.grid_flow(row_major=True, columns=2, even_rows=False, align=False)
flow.prop(dopesheet, "show_scenes", text="Scenes")
- flow.prop(dopesheet, "show_worlds", text="Worlds")
flow.prop(dopesheet, "show_nodes", text="Node Trees")
+ # object types
if bpy.data.armatures:
flow.prop(dopesheet, "show_armatures", text="Armatures")
if bpy.data.cameras:
@@ -134,26 +125,42 @@ class DopesheetFilterPopoverBase:
flow.prop(dopesheet, "show_gpencil", text="Grease Pencil Objects")
if bpy.data.lights:
flow.prop(dopesheet, "show_lights", text="Lights")
- if bpy.data.materials:
- flow.prop(dopesheet, "show_materials", text="Materials")
- if bpy.data.textures:
- flow.prop(dopesheet, "show_textures", text="Textures")
if bpy.data.meshes:
flow.prop(dopesheet, "show_meshes", text="Meshes")
- if bpy.data.shape_keys:
- flow.prop(dopesheet, "show_shapekeys", text="Shape Keys")
if bpy.data.curves:
flow.prop(dopesheet, "show_curves", text="Curves")
- if bpy.data.particles:
- flow.prop(dopesheet, "show_particles", text="Particles")
if bpy.data.lattices:
flow.prop(dopesheet, "show_lattices", text="Lattices")
+ if bpy.data.metaballs:
+ flow.prop(dopesheet, "show_metaballs", text="Metaballs")
+
+ # data types
+ flow.prop(dopesheet, "show_worlds", text="Worlds")
+ if bpy.data.particles:
+ flow.prop(dopesheet, "show_particles", text="Particles")
if bpy.data.linestyles:
flow.prop(dopesheet, "show_linestyles", text="Line Styles")
- if bpy.data.metaballs:
- flow.prop(dopesheet, "show_metaballs", text="Metas")
if bpy.data.speakers:
flow.prop(dopesheet, "show_speakers", text="Speakers")
+ if bpy.data.materials:
+ flow.prop(dopesheet, "show_materials", text="Materials")
+ if bpy.data.textures:
+ flow.prop(dopesheet, "show_textures", text="Textures")
+ if bpy.data.shape_keys:
+ flow.prop(dopesheet, "show_shapekeys", text="Shape Keys")
+
+ layout.separator()
+
+ # Object Data Filters
+
+ # TODO: Add per-channel/axis convenience toggles?
+ split = layout.split()
+
+ col = split.column()
+ col.prop(dopesheet, "show_transforms", text="Transforms")
+
+ col = split.column()
+ col.prop(dopesheet, "show_modifiers", text="Modifiers")
layout.separator()
@@ -205,6 +212,10 @@ class DOPESHEET_HT_header(Header):
row.template_header()
if st.mode == 'TIMELINE':
+ from .space_time import (
+ TIME_MT_editor_menus,
+ TIME_HT_editor_buttons,
+ )
TIME_MT_editor_menus.draw_collapsible(context, layout)
TIME_HT_editor_buttons.draw_header(context, layout)
else:
@@ -247,9 +258,9 @@ class DOPESHEET_HT_editor_buttons(Header):
if st.mode == 'DOPESHEET':
dopesheet_filter(layout, context)
elif st.mode == 'ACTION':
- # 'genericFiltersOnly' limits the options to only the relevant 'generic' subset of
+ # 'generic_filters_only' limits the options to only the relevant 'generic' subset of
# filters which will work here and are useful (especially for character animation)
- dopesheet_filter(layout, context, genericFiltersOnly=True)
+ dopesheet_filter(layout, context, generic_filters_only=True)
elif st.mode == 'GPENCIL':
row = layout.row(align=True)
row.prop(st.dopesheet, "show_gpencil_3d_only", text="Active Only")
@@ -278,12 +289,6 @@ class DOPESHEET_HT_editor_buttons(Header):
sub.active = toolsettings.use_proportional_action
sub.prop(toolsettings, "proportional_edit_falloff", text="", icon_only=True)
- row = layout.row(align=True)
- row.operator("action.copy", text="", icon='COPYDOWN')
- row.operator("action.paste", text="", icon='PASTEDOWN')
- if st.mode not in {'GPENCIL', 'MASK'}:
- row.operator("action.paste", text="", icon='PASTEFLIPDOWN').flipped = True
-
class DOPESHEET_MT_editor_menus(Menu):
bl_idname = "DOPESHEET_MT_editor_menus"
@@ -330,8 +335,9 @@ class DOPESHEET_MT_view(Menu):
layout.prop(st, "show_frame_indicator")
layout.prop(st, "show_sliders")
layout.prop(st, "show_group_colors")
+ layout.prop(st, "show_interpolation")
+ layout.prop(st, "show_extremes")
layout.prop(st, "use_auto_merge_keyframes")
- layout.prop(st, "use_marker_sync")
layout.prop(st, "show_seconds")
layout.prop(st, "show_locked_time")
@@ -361,8 +367,8 @@ class DOPESHEET_MT_select(Menu):
layout.operator("action.select_all", text="Invert").action = 'INVERT'
layout.separator()
- layout.operator("action.select_border").axis_range = False
- layout.operator("action.select_border", text="Border Axis Range").axis_range = True
+ layout.operator("action.select_box").axis_range = False
+ layout.operator("action.select_box", text="Border Axis Range").axis_range = True
layout.operator("action.select_circle")
@@ -409,6 +415,7 @@ class DOPESHEET_MT_marker(Menu):
if st.show_pose_markers is False:
layout.operator("action.markers_make_local")
+ layout.prop(st, "use_marker_sync")
#######################################
# Keyframe Editing
@@ -465,6 +472,9 @@ class DOPESHEET_MT_key(Menu):
layout.operator("action.frame_jump")
layout.separator()
+ layout.operator("action.copy")
+ layout.operator("action.paste")
+ layout.operator("action.paste", text="Paste Flipped").flipped = True
layout.operator("action.duplicate_move")
layout.operator("action.delete")
@@ -478,10 +488,6 @@ class DOPESHEET_MT_key(Menu):
layout.operator("action.clean", text="Clean Channels").channels = True
layout.operator("action.sample")
- layout.separator()
- layout.operator("action.copy")
- layout.operator("action.paste")
-
class DOPESHEET_MT_key_transform(Menu):
bl_label = "Transform"
@@ -489,7 +495,7 @@ class DOPESHEET_MT_key_transform(Menu):
def draw(self, context):
layout = self.layout
- layout.operator("transform.transform", text="Grab/Move").mode = 'TIME_TRANSLATE'
+ layout.operator("transform.transform", text="Move").mode = 'TIME_TRANSLATE'
layout.operator("transform.transform", text="Extend").mode = 'TIME_EXTEND'
layout.operator("transform.transform", text="Slide").mode = 'TIME_SLIDE'
layout.operator("transform.transform", text="Scale").mode = 'TIME_SCALE'
@@ -621,6 +627,19 @@ class DOPESHEET_MT_channel_specials(Menu):
layout.operator("anim.channels_delete")
+class DOPESHEET_MT_snap_pie(Menu):
+ bl_label = "Snap"
+
+ def draw(self, context):
+ layout = self.layout
+ pie = layout.menu_pie()
+
+ pie.operator("action.snap", text="Current Frame").type = 'CFRA'
+ pie.operator("action.snap", text="Nearest Frame").type = 'NEAREST_FRAME'
+ pie.operator("action.snap", text="Nearest Second").type = 'NEAREST_SECOND'
+ pie.operator("action.snap", text="Nearest Marker").type = 'NEAREST_MARKER'
+
+
classes = (
DOPESHEET_HT_header,
DOPESHEET_HT_editor_buttons,
@@ -636,6 +655,7 @@ classes = (
DOPESHEET_MT_delete,
DOPESHEET_MT_specials,
DOPESHEET_MT_channel_specials,
+ DOPESHEET_MT_snap_pie,
DOPESHEET_PT_filters,
)
diff --git a/release/scripts/startup/bl_ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py
index 2f659b8d248..eb94adc1964 100644
--- a/release/scripts/startup/bl_ui/space_filebrowser.py
+++ b/release/scripts/startup/bl_ui/space_filebrowser.py
@@ -183,8 +183,8 @@ class FILEBROWSER_PT_bookmarks(Panel):
rows=(2 if num_rows < 2 else 4), maxrows=10)
col = row.column(align=True)
- col.operator("file.bookmark_add", icon='ZOOMIN', text="")
- col.operator("file.bookmark_delete", icon='ZOOMOUT', text="")
+ col.operator("file.bookmark_add", icon='ADD', text="")
+ col.operator("file.bookmark_delete", icon='REMOVE', text="")
col.menu("FILEBROWSER_MT_bookmarks_specials", icon='DOWNARROW_HLT', text="")
if num_rows > 1:
@@ -192,7 +192,7 @@ class FILEBROWSER_PT_bookmarks(Panel):
col.operator("file.bookmark_move", icon='TRIA_UP', text="").direction = 'UP'
col.operator("file.bookmark_move", icon='TRIA_DOWN', text="").direction = 'DOWN'
else:
- layout.operator("file.bookmark_add", icon='ZOOMIN')
+ layout.operator("file.bookmark_add", icon='ADD')
class FILEBROWSER_PT_recent_folders(Panel):
diff --git a/release/scripts/startup/bl_ui/space_graph.py b/release/scripts/startup/bl_ui/space_graph.py
index eacfb364130..d668bb7ec25 100644
--- a/release/scripts/startup/bl_ui/space_graph.py
+++ b/release/scripts/startup/bl_ui/space_graph.py
@@ -75,11 +75,6 @@ class GRAPH_HT_header(Header):
layout.prop(st, "pivot_point", icon_only=True)
- row = layout.row(align=True)
- row.operator("graph.copy", text="", icon='COPYDOWN')
- row.operator("graph.paste", text="", icon='PASTEDOWN')
- row.operator("graph.paste", text="", icon='PASTEFLIPDOWN').flipped = True
-
class GRAPH_PT_filters(DopesheetFilterPopoverBase, Panel):
bl_space_type = 'GRAPH_EDITOR'
@@ -169,13 +164,13 @@ class GRAPH_MT_select(Menu):
layout.separator()
- props = layout.operator("graph.select_border")
+ props = layout.operator("graph.select_box")
props.axis_range = False
props.include_handles = False
- props = layout.operator("graph.select_border", text="Border Axis Range")
+ props = layout.operator("graph.select_box", text="Border Axis Range")
props.axis_range = True
props.include_handles = False
- props = layout.operator("graph.select_border", text="Border (Include Handles)")
+ props = layout.operator("graph.select_box", text="Border (Include Handles)")
props.axis_range = False
props.include_handles = True
@@ -277,6 +272,9 @@ class GRAPH_MT_key(Menu):
layout.operator("graph.frame_jump")
layout.separator()
+ layout.operator("graph.copy")
+ layout.operator("graph.paste")
+ layout.operator("graph.paste", text="Paste Flipped").flipped = True
layout.operator("graph.duplicate_move")
layout.operator("graph.delete")
@@ -293,10 +291,6 @@ class GRAPH_MT_key(Menu):
layout.operator("graph.bake")
layout.separator()
- layout.operator("graph.copy")
- layout.operator("graph.paste")
-
- layout.separator()
layout.operator("graph.euler_filter", text="Discontinuity (Euler) Filter")
@@ -306,7 +300,7 @@ class GRAPH_MT_key_transform(Menu):
def draw(self, context):
layout = self.layout
- layout.operator("transform.translate", text="Grab/Move")
+ layout.operator("transform.translate", text="Move")
layout.operator("transform.transform", text="Extend").mode = 'TIME_EXTEND'
layout.operator("transform.rotate", text="Rotate")
layout.operator("transform.resize", text="Scale")
@@ -354,6 +348,33 @@ class GRAPH_MT_specials(Menu):
layout.operator_menu_enum("graph.snap", "type", text="Snap")
+class GRAPH_MT_pivot_pie(Menu):
+ bl_label = "Pivot Point"
+
+ def draw(self, context):
+ layout = self.layout
+ pie = layout.menu_pie()
+
+ pie.prop_enum(context.space_data, "pivot_point", value='BOUNDING_BOX_CENTER')
+ pie.prop_enum(context.space_data, "pivot_point", value='CURSOR')
+ pie.prop_enum(context.space_data, "pivot_point", value='INDIVIDUAL_ORIGINS')
+
+
+class GRAPH_MT_snap_pie(Menu):
+ bl_label = "Snap"
+
+ def draw(self, context):
+ layout = self.layout
+ pie = layout.menu_pie()
+
+ pie.operator("graph.snap", text="Current Frame").type = 'CFRA'
+ pie.operator("graph.snap", text="Cursor Value").type = 'VALUE'
+ pie.operator("graph.snap", text="Nearest Frame").type = 'NEAREST_FRAME'
+ pie.operator("graph.snap", text="Nearest Second").type = 'NEAREST_SECOND'
+ pie.operator("graph.snap", text="Nearest Marker").type = 'NEAREST_MARKER'
+ pie.operator("graph.snap", text="Flatten Handles").type = 'HORIZONTAL'
+
+
class GRAPH_MT_channel_specials(Menu):
bl_label = "F-Curve Channel Context Menu"
@@ -407,6 +428,8 @@ classes = (
GRAPH_MT_delete,
GRAPH_MT_specials,
GRAPH_MT_channel_specials,
+ GRAPH_MT_pivot_pie,
+ GRAPH_MT_snap_pie,
GRAPH_PT_filters,
)
diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index 95c7072f14a..b3daba47a13 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -33,37 +33,24 @@ from .properties_paint_common import (
brush_mask_texture_settings,
)
from .properties_grease_pencil_common import (
- AnnotationDrawingToolsPanel,
AnnotationDataPanel,
)
from bpy.app.translations import pgettext_iface as iface_
class ImagePaintPanel(UnifiedPaintPanel):
- bl_space_type = 'IMAGE_EDITOR'
- bl_region_type = 'TOOLS'
+ bl_space_type = 'PROPERTIES'
+ bl_region_type = 'WINDOW'
class BrushButtonsPanel(UnifiedPaintPanel):
- bl_space_type = 'IMAGE_EDITOR'
- bl_region_type = 'TOOLS'
+ bl_space_type = 'PROPERTIES'
+ bl_region_type = 'WINDOW'
@classmethod
def poll(cls, context):
- sima = context.space_data
toolsettings = context.tool_settings.image_paint
- return sima.show_paint and toolsettings.brush
-
-
-class UVToolsPanel:
- bl_space_type = 'IMAGE_EDITOR'
- bl_region_type = 'TOOLS'
- bl_category = "Tools"
-
- @classmethod
- def poll(cls, context):
- sima = context.space_data
- return sima.show_uvedit and not context.tool_settings.use_uv_sculpt
+ return toolsettings.brush
class IMAGE_MT_view(Menu):
@@ -89,7 +76,6 @@ class IMAGE_MT_view(Menu):
if show_uvedit:
layout.prop(toolsettings, "show_uv_local_view")
- layout.prop(uv, "show_other_objects")
layout.prop(uv, "show_metadata")
if paint.brush and (context.image_paint_object or sima.mode == 'PAINT'):
@@ -159,8 +145,8 @@ class IMAGE_MT_select(Menu):
layout.separator()
- layout.operator("uv.select_border").pinned = False
- layout.operator("uv.select_border", text="Border Select Pinned").pinned = True
+ layout.operator("uv.select_box").pinned = False
+ layout.operator("uv.select_box", text="Box Select Pinned").pinned = True
layout.operator("uv.circle_select")
layout.separator()
@@ -208,7 +194,7 @@ class IMAGE_MT_image(Menu):
show_render = sima.show_render
layout.operator("image.new", text="New")
- layout.operator("image.open", text="Open...")
+ layout.operator("image.open", text="Open...", icon='FILE_FOLDER')
layout.operator("image.read_viewlayers")
@@ -224,7 +210,7 @@ class IMAGE_MT_image(Menu):
layout.separator()
if ima:
- layout.operator("image.save", text="Save")
+ layout.operator("image.save", text="Save", icon='FILE_TICK')
layout.operator("image.save_as", text="Save As...")
layout.operator("image.save_as", text="Save a Copy...").copy = True
@@ -258,17 +244,17 @@ class IMAGE_MT_image_invert(Menu):
def draw(self, context):
layout = self.layout
- props = layout.operator("image.invert", text="Invert Image Colors")
+ props = layout.operator("image.invert", text="Invert Image Colors", icon='IMAGE_RGB')
props.invert_r = True
props.invert_g = True
props.invert_b = True
layout.separator()
- layout.operator("image.invert", text="Invert Red Channel").invert_r = True
- layout.operator("image.invert", text="Invert Green Channel").invert_g = True
- layout.operator("image.invert", text="Invert Blue Channel").invert_b = True
- layout.operator("image.invert", text="Invert Alpha Channel").invert_a = True
+ layout.operator("image.invert", text="Invert Red Channel", icon='COLOR_RED').invert_r = True
+ layout.operator("image.invert", text="Invert Green Channel", icon='COLOR_GREEN').invert_g = True
+ layout.operator("image.invert", text="Invert Blue Channel", icon='COLOR_BLUE').invert_b = True
+ layout.operator("image.invert", text="Invert Alpha Channel", icon='IMAGE_ALPHA').invert_a = True
class IMAGE_MT_uvs_showhide(Menu):
@@ -358,7 +344,7 @@ class IMAGE_MT_uvs_weldalign(Menu):
class IMAGE_MT_uvs(Menu):
- bl_label = "UVs"
+ bl_label = "UV"
def draw(self, context):
layout = self.layout
@@ -489,6 +475,36 @@ class IMAGE_MT_specials(Menu):
layout.menu("IMAGE_MT_uvs_snap")
+class IMAGE_MT_pivot_pie(Menu):
+ bl_label = "Pivot Point"
+
+ def draw(self, context):
+ layout = self.layout
+ pie = layout.menu_pie()
+
+ pie.prop_enum(context.space_data, "pivot_point", value='CENTER')
+ pie.prop_enum(context.space_data, "pivot_point", value='CURSOR')
+ pie.prop_enum(context.space_data, "pivot_point", value='INDIVIDUAL_ORIGINS')
+ pie.prop_enum(context.space_data, "pivot_point", value='MEDIAN')
+
+
+class IMAGE_MT_uvs_snap_pie(Menu):
+ bl_label = "Snap"
+
+ def draw(self, context):
+ layout = self.layout
+ pie = layout.menu_pie()
+
+ layout.operator_context = 'EXEC_REGION_WIN'
+
+ pie.operator("uv.snap_selected", text="Selected to Pixels", icon='RESTRICT_SELECT_OFF').target = 'PIXELS'
+ pie.operator("uv.snap_cursor", text="Cursor to Pixels", icon='CURSOR').target = 'PIXELS'
+ pie.operator("uv.snap_cursor", text="Cursor to Selected", icon='CURSOR').target = 'SELECTED'
+ pie.operator("uv.snap_selected", text="Selected to Cursor", icon='RESTRICT_SELECT_OFF').target = 'CURSOR'
+ pie.operator("uv.snap_selected", text="Selected to Cursor (Offset)", icon='RESTRICT_SELECT_OFF').target = 'CURSOR_OFFSET'
+ pie.operator("uv.snap_selected", text="Selected to Adjacent Unselected", icon='RESTRICT_SELECT_OFF').target = 'ADJACENT_UNSELECTED'
+
+
class IMAGE_HT_header(Header):
bl_space_type = 'IMAGE_EDITOR'
@@ -499,7 +515,6 @@ class IMAGE_HT_header(Header):
ima = sima.image
iuser = sima.image_user
toolsettings = context.tool_settings
- mode = sima.mode
show_render = sima.show_render
show_uvedit = sima.show_uvedit
@@ -532,14 +547,11 @@ class IMAGE_HT_header(Header):
row = layout.row()
row.template_ID(sima, "mask", new="mask.new")
- layout.separator_spacer()
-
- if show_uvedit or show_maskedit or mode == 'PAINT':
- layout.prop(sima, "use_realtime_update", icon_only=True, icon='FILE_REFRESH')
-
if not show_render:
layout.prop(sima, "use_image_pin", text="")
+ layout.separator_spacer()
+
if show_uvedit:
uvedit = sima.uv_editor
@@ -560,7 +572,8 @@ class IMAGE_HT_header(Header):
sub.active = toolsettings.proportional_edit != 'DISABLED'
sub.prop(toolsettings, "proportional_edit_falloff", icon_only=True)
- layout.prop(sima, "pivot_point", icon_only=True)
+ if show_uvedit or show_maskedit:
+ layout.prop(sima, "pivot_point", icon_only=True)
row = layout.row()
row.popover(
@@ -578,7 +591,7 @@ class IMAGE_HT_header(Header):
# draw options.
row = layout.row()
- row.prop(sima, "draw_channels", icon_only=True)
+ row.prop(sima, "display_channels", icon_only=True)
row = layout.row(align=True)
if ima.type == 'COMPOSITE':
@@ -620,6 +633,7 @@ class MASK_MT_editor_menus(Menu):
if show_uvedit:
layout.menu("IMAGE_MT_uvs")
if show_maskedit:
+ layout.menu("MASK_MT_add")
layout.menu("MASK_MT_mask")
@@ -633,8 +647,6 @@ from .properties_mask_common import (
MASK_PT_spline,
MASK_PT_point,
MASK_PT_display,
- MASK_PT_tools,
- MASK_PT_add,
)
@@ -663,18 +675,6 @@ class IMAGE_PT_active_mask_point(MASK_PT_point, Panel):
bl_region_type = 'UI'
-class IMAGE_PT_tools_mask(MASK_PT_tools, Panel):
- bl_space_type = 'IMAGE_EDITOR'
- bl_region_type = 'TOOLS'
- bl_category = 'Mask'
-
-
-class IMAGE_PT_tools_mask_add(MASK_PT_add, Panel):
- bl_space_type = 'IMAGE_EDITOR'
- bl_region_type = 'TOOLS'
- bl_category = 'Mask'
-
-
# --- end mask ---
@@ -755,7 +755,10 @@ class IMAGE_PT_view_display_uv_edit_overlays(Panel):
col = layout.column()
- col.prop(uvedit, "edge_draw_type", text="Edges")
+ split = col.split(factor=0.6)
+ split.prop(uvedit, "show_edges", text="Edges")
+ split.prop(uvedit, "edge_display_type", text="")
+
col.prop(uvedit, "show_faces", text="Faces")
col = layout.column()
@@ -783,20 +786,11 @@ class IMAGE_PT_view_display_uv_edit_overlays_advanced(Panel):
uvedit = sima.uv_editor
col = layout.column()
- col.prop(uvedit, "show_other_objects", text="Other Objects")
-
- sub = col.column()
- sub.active = uvedit.show_other_objects
- sub.prop(uvedit, "other_uv_filter", text="Filter")
-
- col.separator()
-
- col = layout.column()
col.prop(uvedit, "show_stretch", text="Stretch")
sub = col.column()
sub.active = uvedit.show_stretch
- sub.prop(uvedit, "draw_stretch_type", text="Type")
+ sub.prop(uvedit, "display_stretch_type", text="Type")
class IMAGE_UL_render_slots(UIList):
@@ -830,98 +824,17 @@ class IMAGE_PT_render_slots(Panel):
)
col = row.column(align=True)
- col.operator("image.add_render_slot", icon='ZOOMIN', text="")
- col.operator("image.remove_render_slot", icon='ZOOMOUT', text="")
+ col.operator("image.add_render_slot", icon='ADD', text="")
+ col.operator("image.remove_render_slot", icon='REMOVE', text="")
col.separator()
col.operator("image.clear_render_slot", icon='X', text="")
-class IMAGE_PT_tools_transform_uvs(Panel, UVToolsPanel):
- bl_label = "Transform"
-
- @classmethod
- def poll(cls, context):
- sima = context.space_data
- return sima.show_uvedit and not context.tool_settings.use_uv_sculpt
-
- def draw(self, context):
- layout = self.layout
-
- col = layout.column(align=True)
- col.operator("transform.translate")
- col.operator("transform.rotate")
- col.operator("transform.resize", text="Scale")
- col.operator("transform.shear")
-
-
-class IMAGE_PT_tools_align_uvs(Panel, UVToolsPanel):
- bl_label = "UV Align"
-
- @classmethod
- def poll(cls, context):
- sima = context.space_data
- return sima.show_uvedit and not context.tool_settings.use_uv_sculpt
-
- def draw(self, context):
- layout = self.layout
- layout.operator_context = 'EXEC_REGION_WIN'
-
- split = layout.split()
- col = split.column(align=True)
- col.operator("transform.mirror", text="Mirror X").constraint_axis[0] = True
- col.operator("transform.mirror", text="Mirror Y").constraint_axis[1] = True
- col = split.column(align=True)
- col.operator("transform.rotate", text="Rotate +90°").value = math.pi / 2
- col.operator("transform.rotate", text="Rotate - 90°").value = math.pi / -2
-
- split = layout.split()
- col = split.column(align=True)
- col.operator("uv.align", text="Straighten").axis = 'ALIGN_S'
- col.operator("uv.align", text="Straighten X").axis = 'ALIGN_T'
- col.operator("uv.align", text="Straighten Y").axis = 'ALIGN_U'
- col = split.column(align=True)
- col.operator("uv.align", text="Align Auto").axis = 'ALIGN_AUTO'
- col.operator("uv.align", text="Align X").axis = 'ALIGN_X'
- col.operator("uv.align", text="Align Y").axis = 'ALIGN_Y'
-
-
-class IMAGE_PT_tools_uvs(Panel, UVToolsPanel):
- bl_label = "UV Tools"
-
- @classmethod
- def poll(cls, context):
- sima = context.space_data
- return sima.show_uvedit and not context.tool_settings.use_uv_sculpt
-
- def draw(self, context):
- layout = self.layout
-
- col = layout.column(align=True)
- row = col.row(align=True)
- row.operator("uv.weld")
- row.operator("uv.stitch")
- col.operator("uv.remove_doubles")
- col.operator("uv.average_islands_scale")
- col.operator("uv.pack_islands")
- col.operator("mesh.faces_mirror_uv")
- col.operator("uv.minimize_stretch")
-
- layout.label(text="UV Unwrap:")
- row = layout.row(align=True)
- row.operator("uv.pin").clear = False
- row.operator("uv.pin", text="Unpin").clear = True
- col = layout.column(align=True)
- row = col.row(align=True)
- row.operator("uv.mark_seam", text="Mark Seam").clear = False
- row.operator("uv.mark_seam", text="Clear Seam").clear = True
- col.operator("uv.seams_from_islands", text="Mark Seams from Islands")
- col.operator("uv.unwrap")
-
-
class IMAGE_PT_paint(Panel, ImagePaintPanel):
- bl_label = "Paint"
+ bl_label = "Brush"
+ bl_context = ".paint_common_2d"
bl_category = "Tools"
def draw(self, context):
@@ -936,14 +849,10 @@ class IMAGE_PT_paint(Panel, ImagePaintPanel):
if brush:
brush_texpaint_common(self, context, layout, brush, settings)
- @classmethod
- def poll(cls, context):
- sima = context.space_data
- return sima.show_paint
-
class IMAGE_PT_tools_brush_overlay(BrushButtonsPanel, Panel):
bl_label = "Overlay"
+ bl_context = ".paint_common_2d"
bl_options = {'DEFAULT_CLOSED'}
bl_category = "Options"
@@ -965,7 +874,7 @@ class IMAGE_PT_tools_brush_overlay(BrushButtonsPanel, Panel):
"use_cursor_overlay",
text="",
toggle=True,
- icon='RESTRICT_VIEW_OFF' if brush.use_cursor_overlay else 'RESTRICT_VIEW_ON',
+ icon='RESTRICT_VIEW_ON' if brush.use_cursor_overlay else 'RESTRICT_VIEW_OFF',
)
sub = row.row(align=True)
@@ -981,7 +890,7 @@ class IMAGE_PT_tools_brush_overlay(BrushButtonsPanel, Panel):
"use_primary_overlay",
text="",
toggle=True,
- icon='RESTRICT_VIEW_OFF' if brush.use_primary_overlay else 'RESTRICT_VIEW_ON',
+ icon='RESTRICT_VIEW_ON' if brush.use_primary_overlay else 'RESTRICT_VIEW_OFF',
)
sub = row.row(align=True)
@@ -997,7 +906,7 @@ class IMAGE_PT_tools_brush_overlay(BrushButtonsPanel, Panel):
"use_secondary_overlay",
text="",
toggle=True,
- icon='RESTRICT_VIEW_OFF' if brush.use_secondary_overlay else 'RESTRICT_VIEW_ON',
+ icon='RESTRICT_VIEW_ON' if brush.use_secondary_overlay else 'RESTRICT_VIEW_OFF',
)
sub = row.row(align=True)
@@ -1007,6 +916,7 @@ class IMAGE_PT_tools_brush_overlay(BrushButtonsPanel, Panel):
class IMAGE_PT_tools_brush_texture(BrushButtonsPanel, Panel):
bl_label = "Texture"
+ bl_context = ".paint_common_2d"
bl_options = {'DEFAULT_CLOSED'}
bl_category = "Tools"
@@ -1024,6 +934,7 @@ class IMAGE_PT_tools_brush_texture(BrushButtonsPanel, Panel):
class IMAGE_PT_tools_mask_texture(BrushButtonsPanel, Panel):
bl_label = "Texture Mask"
+ bl_context = ".paint_common_2d"
bl_options = {'DEFAULT_CLOSED'}
bl_category = "Tools"
@@ -1039,27 +950,9 @@ class IMAGE_PT_tools_mask_texture(BrushButtonsPanel, Panel):
brush_mask_texture_settings(col, brush)
-class IMAGE_PT_tools_brush_tool(BrushButtonsPanel, Panel):
- bl_label = "Tool"
- bl_options = {'DEFAULT_CLOSED'}
- bl_category = "Options"
-
- def draw(self, context):
- layout = self.layout
- toolsettings = context.tool_settings.image_paint
- brush = toolsettings.brush
-
- layout.prop(brush, "image_tool", text="")
-
- row = layout.row(align=True)
- row.prop(brush, "use_paint_sculpt", text="", icon='SCULPTMODE_HLT')
- row.prop(brush, "use_paint_vertex", text="", icon='VPAINT_HLT')
- row.prop(brush, "use_paint_weight", text="", icon='WPAINT_HLT')
- row.prop(brush, "use_paint_image", text="", icon='TPAINT_HLT')
-
-
class IMAGE_PT_paint_stroke(BrushButtonsPanel, Panel):
- bl_label = "Paint Stroke"
+ bl_label = "Stroke"
+ bl_context = ".paint_common_2d"
bl_options = {'DEFAULT_CLOSED'}
bl_category = "Tools"
@@ -1127,7 +1020,8 @@ class IMAGE_PT_paint_stroke(BrushButtonsPanel, Panel):
class IMAGE_PT_paint_curve(BrushButtonsPanel, Panel):
- bl_label = "Paint Curve"
+ bl_label = "Curve"
+ bl_context = ".paint_common_2d"
bl_options = {'DEFAULT_CLOSED'}
bl_category = "Tools"
@@ -1151,7 +1045,7 @@ class IMAGE_PT_paint_curve(BrushButtonsPanel, Panel):
class IMAGE_PT_tools_imagepaint_symmetry(BrushButtonsPanel, Panel):
bl_category = "Tools"
- bl_context = "imagepaint"
+ bl_context = ".imagepaint_2d"
bl_label = "Tiling"
bl_options = {'DEFAULT_CLOSED'}
@@ -1169,8 +1063,10 @@ class IMAGE_PT_tools_imagepaint_symmetry(BrushButtonsPanel, Panel):
class IMAGE_PT_tools_brush_appearance(BrushButtonsPanel, Panel):
bl_label = "Appearance"
+ bl_context = ".paint_common_2d"
bl_options = {'DEFAULT_CLOSED'}
bl_category = "Options"
+ bl_parent_id = "IMAGE_PT_tools_brush_overlay"
def draw(self, context):
layout = self.layout
@@ -1197,43 +1093,17 @@ class IMAGE_PT_tools_brush_appearance(BrushButtonsPanel, Panel):
sub.prop(brush, "icon_filepath", text="")
-class IMAGE_PT_tools_paint_options(BrushButtonsPanel, Panel):
- bl_label = "Image Paint"
- bl_category = "Options"
-
- def draw(self, context):
- layout = self.layout
-
- toolsettings = context.tool_settings
- # brush = toolsettings.image_paint.brush
- ups = toolsettings.unified_paint_settings
-
- col = layout.column(align=True)
- col.label(text="Unified Settings:")
-
- row = col.row()
- row.prop(ups, "use_unified_size", text="Size")
- row.prop(ups, "use_unified_strength", text="Strength")
- col.prop(ups, "use_unified_color", text="Color")
-
-
class IMAGE_PT_uv_sculpt_curve(Panel):
- bl_space_type = 'IMAGE_EDITOR'
- bl_region_type = 'TOOLS'
+ bl_space_type = 'PROPERTIES'
+ bl_region_type = 'WINDOW'
+ bl_context = ".uv_sculpt" # dot on purpose (access from topbar)
+ bl_category = "Options"
bl_label = "UV Sculpt Curve"
- bl_category = "Tools"
bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
- sima = context.space_data
- toolsettings = context.tool_settings.image_paint
-
- return (
- sima.show_uvedit and
- context.tool_settings.use_uv_sculpt and
- not (sima.show_paint and toolsettings.brush)
- )
+ return (context.uv_sculpt_object is not None)
def draw(self, context):
layout = self.layout
@@ -1253,39 +1123,36 @@ class IMAGE_PT_uv_sculpt_curve(Panel):
row.operator("brush.curve_preset", icon='NOCURVE', text="").shape = 'MAX'
-class IMAGE_PT_uv_sculpt(Panel, ImagePaintPanel):
- bl_space_type = 'IMAGE_EDITOR'
- bl_region_type = 'TOOLS'
- bl_category = "Tools"
+class IMAGE_PT_uv_sculpt(Panel):
+ bl_space_type = 'PROPERTIES'
+ bl_region_type = 'WINDOW'
+ bl_context = ".uv_sculpt" # dot on purpose (access from topbar)
+ bl_category = "Options"
bl_label = "UV Sculpt"
@classmethod
def poll(cls, context):
- sima = context.space_data
- toolsettings = context.tool_settings.image_paint
- return (
- sima.show_uvedit and
- context.tool_settings.use_uv_sculpt and
- not (sima.show_paint and toolsettings.brush)
- )
+ return (context.uv_sculpt_object is not None)
def draw(self, context):
+ from .properties_paint_common import UnifiedPaintPanel
layout = self.layout
toolsettings = context.tool_settings
uvsculpt = toolsettings.uv_sculpt
brush = uvsculpt.brush
- if brush:
- col = layout.column()
+ if not self.is_popover:
+ if brush:
+ col = layout.column()
- row = col.row(align=True)
- self.prop_unified_size(row, context, brush, "size", slider=True, text="Radius")
- self.prop_unified_size(row, context, brush, "use_pressure_size")
+ row = col.row(align=True)
+ UnifiedPaintPanel.prop_unified_size(row, context, brush, "size", slider=True, text="Radius")
+ UnifiedPaintPanel.prop_unified_size(row, context, brush, "use_pressure_size")
- row = col.row(align=True)
- self.prop_unified_strength(row, context, brush, "strength", slider=True, text="Strength")
- self.prop_unified_strength(row, context, brush, "use_pressure_strength")
+ row = col.row(align=True)
+ UnifiedPaintPanel.prop_unified_strength(row, context, brush, "strength", slider=True, text="Strength")
+ UnifiedPaintPanel.prop_unified_strength(row, context, brush, "use_pressure_strength")
col = layout.column()
col.prop(toolsettings, "uv_sculpt_lock_borders")
@@ -1298,29 +1165,6 @@ class IMAGE_PT_uv_sculpt(Panel, ImagePaintPanel):
col.prop(uvsculpt, "show_brush")
-class IMAGE_PT_options_uvs(Panel, UVToolsPanel):
- bl_label = "UV Options"
- bl_category = "Options"
-
- @classmethod
- def poll(cls, context):
- sima = context.space_data
- return sima.show_uvedit
-
- def draw(self, context):
- layout = self.layout
-
- sima = context.space_data
- uv = sima.uv_editor
- toolsettings = context.tool_settings
-
- layout.prop(toolsettings, "use_uv_sculpt")
- layout.prop(uv, "use_live_unwrap")
-
- layout.prop(uv, "use_snap_to_pixels")
- layout.prop(uv, "lock_bounds")
-
-
class ImageScopesPanel:
@classmethod
def poll(cls, context):
@@ -1454,11 +1298,6 @@ class IMAGE_PT_grease_pencil(AnnotationDataPanel, Panel):
# Grease Pencil drawing tools.
-class IMAGE_PT_tools_grease_pencil_draw(AnnotationDrawingToolsPanel, Panel):
- bl_space_type = 'IMAGE_EDITOR'
- bl_region_type = 'TOOLS'
-
-
classes = (
IMAGE_MT_view,
IMAGE_MT_view_zoom,
@@ -1475,10 +1314,11 @@ classes = (
IMAGE_MT_uvs_weldalign,
IMAGE_MT_uvs_select_mode,
IMAGE_MT_specials,
+ IMAGE_MT_pivot_pie,
+ IMAGE_MT_uvs_snap_pie,
IMAGE_HT_header,
MASK_MT_editor_menus,
IMAGE_PT_mask,
- IMAGE_PT_tools_mask_add,
IMAGE_PT_mask_layers,
IMAGE_PT_mask_display,
IMAGE_PT_active_mask_spline,
@@ -1489,21 +1329,14 @@ classes = (
IMAGE_PT_view_display,
IMAGE_PT_view_display_uv_edit_overlays,
IMAGE_PT_view_display_uv_edit_overlays_advanced,
- IMAGE_PT_tools_transform_uvs,
- IMAGE_PT_tools_align_uvs,
- IMAGE_PT_tools_uvs,
- IMAGE_PT_options_uvs,
IMAGE_PT_paint,
IMAGE_PT_tools_brush_overlay,
IMAGE_PT_tools_brush_texture,
- IMAGE_PT_tools_mask,
IMAGE_PT_tools_mask_texture,
- IMAGE_PT_tools_brush_tool,
IMAGE_PT_paint_stroke,
IMAGE_PT_paint_curve,
IMAGE_PT_tools_imagepaint_symmetry,
IMAGE_PT_tools_brush_appearance,
- IMAGE_PT_tools_paint_options,
IMAGE_PT_uv_sculpt,
IMAGE_PT_uv_sculpt_curve,
IMAGE_PT_view_scopes,
@@ -1513,7 +1346,6 @@ classes = (
IMAGE_PT_sample_line,
IMAGE_PT_scope_sample,
IMAGE_PT_grease_pencil,
- IMAGE_PT_tools_grease_pencil_draw,
)
diff --git a/release/scripts/startup/bl_ui/space_info.py b/release/scripts/startup/bl_ui/space_info.py
index e5ef5f9a0da..829ccd706b9 100644
--- a/release/scripts/startup/bl_ui/space_info.py
+++ b/release/scripts/startup/bl_ui/space_info.py
@@ -39,11 +39,14 @@ class INFO_MT_area(Menu):
def draw(self, context):
layout = self.layout
- layout.operator("screen.area_dupli")
if context.space_data.type == 'VIEW_3D':
layout.operator("screen.region_quadview")
+ layout.separator()
+
+ layout.operator("screen.area_dupli", icon='DUPLICATE')
+ layout.separator()
layout.operator("screen.screen_full_area")
- layout.operator("screen.screen_full_area", text="Toggle Fullscreen Area").use_hide_panels = True
+ layout.operator("screen.screen_full_area", text="Toggle Fullscreen Area", icon='FULLSCREEN_ENTER').use_hide_panels = True
classes = (
diff --git a/release/scripts/startup/bl_ui/space_nla.py b/release/scripts/startup/bl_ui/space_nla.py
index 4e20001b133..a3179097046 100644
--- a/release/scripts/startup/bl_ui/space_nla.py
+++ b/release/scripts/startup/bl_ui/space_nla.py
@@ -129,8 +129,8 @@ class NLA_MT_select(Menu):
layout.operator("nla.select_all", text="Invert").action = 'INVERT'
layout.separator()
- layout.operator("nla.select_border").axis_range = False
- layout.operator("nla.select_border", text="Border Axis Range").axis_range = True
+ layout.operator("nla.select_box").axis_range = False
+ layout.operator("nla.select_box", text="Border Axis Range").axis_range = True
layout.separator()
props = layout.operator("nla.select_leftright", text="Before Current Frame")
@@ -228,11 +228,24 @@ class NLA_MT_edit_transform(Menu):
def draw(self, context):
layout = self.layout
- layout.operator("transform.translate", text="Grab/Move")
+ layout.operator("transform.translate", text="Move")
layout.operator("transform.transform", text="Extend").mode = 'TIME_EXTEND'
layout.operator("transform.transform", text="Scale").mode = 'TIME_SCALE'
+class NLA_MT_snap_pie(Menu):
+ bl_label = "Snap"
+
+ def draw(self, context):
+ layout = self.layout
+ pie = layout.menu_pie()
+
+ pie.operator("nla.snap", text="Current Frame").type = 'CFRA'
+ pie.operator("nla.snap", text="Nearest Frame").type = 'NEAREST_FRAME'
+ pie.operator("nla.snap", text="Nearest Second").type = 'NEAREST_SECOND'
+ pie.operator("nla.snap", text="Nearest Marker").type = 'NEAREST_MARKER'
+
+
classes = (
NLA_HT_header,
NLA_MT_edit,
@@ -242,6 +255,7 @@ classes = (
NLA_MT_marker,
NLA_MT_add,
NLA_MT_edit_transform,
+ NLA_MT_snap_pie,
NLA_PT_filters,
)
diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py
index c106c197ecf..26b52617616 100644
--- a/release/scripts/startup/bl_ui/space_node.py
+++ b/release/scripts/startup/bl_ui/space_node.py
@@ -63,10 +63,12 @@ class NODE_HT_header(Header):
layout.separator_spacer()
row = layout.row()
+ types_that_support_material = {'MESH', 'CURVE', 'SURFACE', 'FONT', 'META', 'GPENCIL'}
# disable material slot buttons when pinned, cannot find correct slot within id_from (#36589)
- row.enabled = not snode.pin
+ # disable also when the selected object does not support materials
+ row.enabled = not snode.pin and ob.type in types_that_support_material
# Show material.new when no active ID/slot exists
- if not id_from and ob.type in {'MESH', 'CURVE', 'SURFACE', 'FONT', 'METABALL'}:
+ if not id_from and ob.type in types_that_support_material:
row.template_ID(ob, "active_material", new="material.new")
# Material ID, but not for Lights
if id_from and ob.type != 'LIGHT':
@@ -139,11 +141,12 @@ class NODE_HT_header(Header):
layout.template_ID(snode, "node_tree", new="node.new_node_tree")
+
+ layout.prop(snode, "pin", text="")
layout.separator_spacer()
layout.template_running_jobs()
- layout.prop(snode, "pin", text="")
layout.operator("node.tree_path_parent", text="", icon='FILE_PARENT')
# Snap
@@ -153,10 +156,6 @@ class NODE_HT_header(Header):
if toolsettings.snap_node_element != 'GRID':
row.prop(toolsettings, "snap_target", text="")
- row = layout.row(align=True)
- row.operator("node.clipboard_copy", text="", icon='COPYDOWN')
- row.operator("node.clipboard_paste", text="", icon='PASTEDOWN')
-
class NODE_MT_editor_menus(Menu):
bl_idname = "NODE_MT_editor_menus"
@@ -233,7 +232,7 @@ class NODE_MT_select(Menu):
def draw(self, context):
layout = self.layout
- layout.operator("node.select_border").tweak = False
+ layout.operator("node.select_box").tweak = False
layout.operator("node.select_circle")
layout.separator()
@@ -264,7 +263,8 @@ class NODE_MT_node(Menu):
layout.operator("transform.resize")
layout.separator()
-
+ layout.operator("node.clipboard_copy", text="Copy")
+ layout.operator("node.clipboard_paste", text="Paste")
layout.operator("node.duplicate_move")
layout.operator("node.delete")
layout.operator("node.delete_reconnect")
@@ -507,17 +507,17 @@ class NODE_UL_interface_sockets(bpy.types.UIList):
# inputs get icon on the left
if not socket.is_output:
- row.template_node_socket(color)
+ row.template_node_socket(color=color)
row.prop(socket, "name", text="", emboss=False, icon_value=icon)
# outputs get icon on the right
if socket.is_output:
- row.template_node_socket(color)
+ row.template_node_socket(color=color)
elif self.layout_type == 'GRID':
layout.alignment = 'CENTER'
- layout.template_node_socket(color)
+ layout.template_node_socket(color=color)
# Grease Pencil properties
diff --git a/release/scripts/startup/bl_ui/space_outliner.py b/release/scripts/startup/bl_ui/space_outliner.py
index 20ef5ae0c53..877b81f26ae 100644
--- a/release/scripts/startup/bl_ui/space_outliner.py
+++ b/release/scripts/startup/bl_ui/space_outliner.py
@@ -70,8 +70,8 @@ class OUTLINER_HT_header(Header):
layout.separator()
row = layout.row(align=True)
- row.operator("outliner.keyingset_add_selected", icon='ZOOMIN', text="")
- row.operator("outliner.keyingset_remove_selected", icon='ZOOMOUT', text="")
+ row.operator("outliner.keyingset_add_selected", icon='ADD', text="")
+ row.operator("outliner.keyingset_remove_selected", icon='REMOVE', text="")
if ks:
row = layout.row()
@@ -140,8 +140,6 @@ class OUTLINER_MT_collection_view_layer(Menu):
def draw(self, context):
layout = self.layout
- space = context.space_data
-
layout.operator("outliner.collection_exclude_set")
layout.operator("outliner.collection_exclude_clear")
@@ -260,7 +258,7 @@ class OUTLINER_PT_filter(Panel):
layout.separator()
- if space.display_mode != 'DATA_API':
+ if display_mode != 'DATA_API':
layout.prop(space, "use_sort_alpha")
layout.prop(space, "show_restrict_columns")
layout.separator()
diff --git a/release/scripts/startup/bl_ui/space_properties.py b/release/scripts/startup/bl_ui/space_properties.py
index 2d1725b2087..b60e1e7d6fb 100644
--- a/release/scripts/startup/bl_ui/space_properties.py
+++ b/release/scripts/startup/bl_ui/space_properties.py
@@ -18,7 +18,7 @@
# <pep8 compliant>
import bpy
-from bpy.types import Header
+from bpy.types import Header, Panel
class PROPERTIES_HT_header(Header):
@@ -27,16 +27,29 @@ class PROPERTIES_HT_header(Header):
def draw(self, context):
layout = self.layout
- view = context.space_data
-
row = layout.row()
row.template_header()
- row.prop(view, "context", expand=True, icon_only=True)
+
+class PROPERTIES_PT_navigation_bar(Panel):
+ bl_space_type = 'PROPERTIES'
+ bl_region_type = 'NAVIGATION_BAR'
+ bl_label = "Navigation Bar"
+ bl_options = {'HIDE_HEADER'}
+
+ def draw(self, context):
+ layout = self.layout
+
+ view = context.space_data
+
+ layout.scale_x = 1.4
+ layout.scale_y = 1.4
+ layout.prop_tabs_enum(view, "context", icon_only=True)
classes = (
PROPERTIES_HT_header,
+ PROPERTIES_PT_navigation_bar,
)
if __name__ == "__main__": # only for live edit.
diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py
index 57c7f7cac14..402913ab642 100644
--- a/release/scripts/startup/bl_ui/space_sequencer.py
+++ b/release/scripts/startup/bl_ui/space_sequencer.py
@@ -34,6 +34,13 @@ def act_strip(context):
return None
+def sel_sequences(context):
+ try:
+ return len(context.selected_sequences) if context.selected_sequences else 0
+ except AttributeError:
+ return 0
+
+
def draw_color_balance(layout, color_balance):
box = layout.box()
split = box.split(factor=0.35)
@@ -89,19 +96,15 @@ class SEQUENCER_HT_header(Header):
layout.template_running_jobs()
- if st.view_type == 'SEQUENCER':
- layout.separator()
- layout.operator("sequencer.refresh_all")
-
- if st.view_type == 'SEQUENCER_PREVIEW':
+ if st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}:
layout.separator()
- layout.operator("sequencer.refresh_all")
+ layout.operator("sequencer.refresh_all", icon="FILE_REFRESH", text="")
if st.view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'}:
- layout.prop(st, "display_mode", expand=True, text="")
+ layout.prop(st, "display_mode", text="", icon_only=True)
if st.view_type != 'SEQUENCER':
- layout.prop(st, "preview_channels", expand=True, text="")
+ layout.prop(st, "preview_channels", text="", icon_only=True)
layout.prop(st, "display_channel", text="Channel")
ed = scene.sequence_editor
@@ -126,18 +129,6 @@ class SEQUENCER_HT_header(Header):
if toolsettings.proportional_edit != 'DISABLED':
row.prop(toolsettings, "proportional_edit_falloff", icon_only=True)
- row = layout.row(align=True)
- row.operator("render.opengl", text="", icon='RENDER_STILL').sequencer = True
- props = row.operator("render.opengl", text="", icon='RENDER_ANIMATION')
- props.animation = True
- props.sequencer = True
-
- if st.view_type == 'SEQUENCER':
-
- row = layout.row(align=True)
- row.operator("sequencer.copy", text="", icon='COPYDOWN')
- row.operator("sequencer.paste", text="", icon='PASTEDOWN')
-
class SEQUENCER_MT_editor_menus(Menu):
bl_idname = "SEQUENCER_MT_editor_menus"
@@ -224,7 +215,7 @@ class SEQUENCER_MT_view(Menu):
layout.prop(st, "show_frame_indicator")
layout.prop(st, "show_strip_offset")
- layout.prop_menu_enum(st, "waveform_draw_type")
+ layout.prop_menu_enum(st, "waveform_display_type")
if is_preview:
if st.display_mode == 'IMAGE':
@@ -235,9 +226,12 @@ class SEQUENCER_MT_view(Menu):
layout.separator()
- if is_sequencer_view:
- layout.prop(st, "use_marker_sync")
- layout.separator()
+ layout.operator("render.opengl", text="Sequence Render", icon='RENDER_STILL').sequencer = True
+ props = layout.operator("render.opengl", text="Sequence Render Animation", icon='RENDER_ANIMATION')
+ props.animation = True
+ props.sequencer = True
+
+ layout.separator()
layout.menu("INFO_MT_area")
@@ -280,9 +274,15 @@ class SEQUENCER_MT_marker(Menu):
def draw(self, context):
layout = self.layout
+ st = context.space_data
+ is_sequencer_view = st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}
+
from .space_time import marker_menu_generic
marker_menu_generic(layout)
+ if is_sequencer_view:
+ layout.prop(st, "use_marker_sync")
+
class SEQUENCER_MT_frame(Menu):
bl_label = "Frame"
@@ -316,71 +316,117 @@ class SEQUENCER_MT_add(Menu):
bl_label = "Add"
def draw(self, context):
- layout = self.layout
+ layout = self.layout
layout.operator_context = 'INVOKE_REGION_WIN'
if len(bpy.data.scenes) > 10:
layout.operator_context = 'INVOKE_DEFAULT'
- layout.operator("sequencer.scene_strip_add", text="Scene...")
+ layout.operator("sequencer.scene_strip_add", text="Scene...", icon='SCENE_DATA')
+ elif len(bpy.data.scenes) > 1:
+ layout.operator_menu_enum("sequencer.scene_strip_add", "scene", text="Scene", icon='SCENE_DATA')
else:
- layout.operator_menu_enum("sequencer.scene_strip_add", "scene", text="Scene")
+ layout.menu("SEQUENCER_MT_add_empty", text="Scene", icon='SCENE_DATA')
if len(bpy.data.movieclips) > 10:
layout.operator_context = 'INVOKE_DEFAULT'
- layout.operator("sequencer.movieclip_strip_add", text="Clips...")
+ layout.operator("sequencer.movieclip_strip_add", text="Clip...", icon='CLIP')
+ elif len(bpy.data.movieclips) > 1:
+ layout.operator_menu_enum("sequencer.movieclip_strip_add", "clip", text="Clip", icon='CLIP')
else:
- layout.operator_menu_enum("sequencer.movieclip_strip_add", "clip", text="Clip")
+ layout.menu("SEQUENCER_MT_add_empty", text="Clip", icon='CLIP')
if len(bpy.data.masks) > 10:
layout.operator_context = 'INVOKE_DEFAULT'
- layout.operator("sequencer.mask_strip_add", text="Masks...")
+ layout.operator("sequencer.mask_strip_add", text="Mask...", icon='MOD_MASK')
+ elif len(bpy.data.masks) > 1:
+ layout.operator_menu_enum("sequencer.mask_strip_add", "mask", text="Mask", icon='MOD_MASK')
else:
- layout.operator_menu_enum("sequencer.mask_strip_add", "mask", text="Mask")
+ layout.menu("SEQUENCER_MT_add_empty", text="Mask", icon='MOD_MASK')
- layout.operator("sequencer.movie_strip_add", text="Movie")
- layout.operator("sequencer.image_strip_add", text="Image")
- layout.operator("sequencer.sound_strip_add", text="Sound")
+ layout.separator()
- layout.menu("SEQUENCER_MT_add_generate")
+ layout.operator("sequencer.movie_strip_add", text="Movie", icon='FILE_MOVIE')
+ layout.operator("sequencer.sound_strip_add", text="Sound", icon='FILE_SOUND')
+ layout.operator("sequencer.image_strip_add", text="Image/Sequence", icon='FILE_IMAGE')
+
+ layout.separator()
+
+ layout.operator_context = 'INVOKE_REGION_WIN'
+ layout.operator("sequencer.effect_strip_add", text="Color", icon='COLOR').type = 'COLOR'
+ layout.operator("sequencer.effect_strip_add", text="Text", icon='FONT_DATA').type = 'TEXT'
+
+ layout.separator()
+
+ layout.operator("sequencer.effect_strip_add", text="Adjustment Layer", icon='COLOR').type = 'ADJUSTMENT'
+
+ layout.operator_context = 'INVOKE_DEFAULT'
layout.menu("SEQUENCER_MT_add_effect")
+ col = layout.column()
+ col.menu("SEQUENCER_MT_add_transitions")
+ col.enabled = sel_sequences(context) >= 2
+
-class SEQUENCER_MT_add_generate(Menu):
- bl_label = "Generate"
+class SEQUENCER_MT_add_empty(Menu):
+ bl_label = "Empty"
def draw(self, context):
layout = self.layout
- layout.operator_context = 'INVOKE_REGION_WIN'
- layout.operator("sequencer.effect_strip_add", text="Color").type = 'COLOR'
- layout.operator("sequencer.effect_strip_add", text="Text").type = 'TEXT'
+ layout.label(text="No Items Available")
+
+
+class SEQUENCER_MT_add_transitions(Menu):
+ bl_label = "Transitions"
+
+ def draw(self, context):
+
+ layout = self.layout
+
+ col = layout.column()
+ col.operator("sequencer.effect_strip_add", text="Cross").type = 'CROSS'
+ col.operator("sequencer.effect_strip_add", text="Gamma Cross").type = 'GAMMA_CROSS'
+
+ col.separator()
+
+ col.operator("sequencer.effect_strip_add", text="Wipe").type = 'WIPE'
+ col.enabled = sel_sequences(context) >= 2
class SEQUENCER_MT_add_effect(Menu):
bl_label = "Effect Strip"
def draw(self, context):
- layout = self.layout
+ layout = self.layout
layout.operator_context = 'INVOKE_REGION_WIN'
- layout.operator("sequencer.effect_strip_add", text="Add").type = 'ADD'
- layout.operator("sequencer.effect_strip_add", text="Subtract").type = 'SUBTRACT'
- layout.operator("sequencer.effect_strip_add", text="Alpha Over").type = 'ALPHA_OVER'
- layout.operator("sequencer.effect_strip_add", text="Alpha Under").type = 'ALPHA_UNDER'
- layout.operator("sequencer.effect_strip_add", text="Cross").type = 'CROSS'
- layout.operator("sequencer.effect_strip_add", text="Gamma Cross").type = 'GAMMA_CROSS'
- layout.operator("sequencer.effect_strip_add", text="Gaussian Blur").type = 'GAUSSIAN_BLUR'
- layout.operator("sequencer.effect_strip_add", text="Multiply").type = 'MULTIPLY'
- layout.operator("sequencer.effect_strip_add", text="Over Drop").type = 'OVER_DROP'
- layout.operator("sequencer.effect_strip_add", text="Wipe").type = 'WIPE'
- layout.operator("sequencer.effect_strip_add", text="Glow").type = 'GLOW'
- layout.operator("sequencer.effect_strip_add", text="Color Mix").type = 'COLORMIX'
- layout.operator("sequencer.effect_strip_add", text="Transform").type = 'TRANSFORM'
- layout.operator("sequencer.effect_strip_add", text="Speed Control").type = 'SPEED'
+ col = layout.column()
+ col.operator("sequencer.effect_strip_add", text="Add").type = 'ADD'
+ col.operator("sequencer.effect_strip_add", text="Subtract").type = 'SUBTRACT'
+ col.operator("sequencer.effect_strip_add", text="Multiply").type = 'MULTIPLY'
+ col.operator("sequencer.effect_strip_add", text="Over Drop").type = 'OVER_DROP'
+ col.operator("sequencer.effect_strip_add", text="Alpha Over").type = 'ALPHA_OVER'
+ col.operator("sequencer.effect_strip_add", text="Alpha Under").type = 'ALPHA_UNDER'
+ col.operator("sequencer.effect_strip_add", text="Color Mix").type = 'COLORMIX'
+ col.enabled = sel_sequences(context) >=2
+
+ layout.separator()
+
layout.operator("sequencer.effect_strip_add", text="Multicam Selector").type = 'MULTICAM'
- layout.operator("sequencer.effect_strip_add", text="Adjustment Layer").type = 'ADJUSTMENT'
+
+ layout.separator()
+
+ col = layout.column()
+ col.operator("sequencer.effect_strip_add", text="Transform").type = 'TRANSFORM'
+ col.operator("sequencer.effect_strip_add", text="Speed Control").type = 'SPEED'
+
+ col.separator()
+
+ col.operator("sequencer.effect_strip_add", text="Glow").type = 'GLOW'
+ col.operator("sequencer.effect_strip_add", text="Gaussian Blur").type = 'GAUSSIAN_BLUR'
+ col.enabled = sel_sequences(context) != 0
class SEQUENCER_MT_strip_transform(Menu):
@@ -389,8 +435,8 @@ class SEQUENCER_MT_strip_transform(Menu):
def draw(self, context):
layout = self.layout
- layout.operator("transform.transform", text="Grab/Move").mode = 'TRANSLATION'
- layout.operator("transform.transform", text="Grab/Extend from Frame").mode = 'TIME_EXTEND'
+ layout.operator("transform.transform", text="Move").mode = 'TRANSLATION'
+ layout.operator("transform.transform", text="Move/Extend from Frame").mode = 'TIME_EXTEND'
layout.operator("sequencer.slip", text="Slip Strip Contents")
layout.separator()
@@ -430,8 +476,11 @@ class SEQUENCER_MT_strip_lock_mute(Menu):
def draw(self, context):
layout = self.layout
- layout.operator("sequencer.lock")
+ layout.operator("sequencer.lock", icon='LOCK')
layout.operator("sequencer.unlock")
+
+ layout.separator()
+
layout.operator("sequencer.mute").unselected = False
layout.operator("sequencer.unmute").unselected = False
layout.operator("sequencer.mute", text="Mute Deselected Strips").unselected = True
@@ -451,6 +500,8 @@ class SEQUENCER_MT_strip(Menu):
layout.operator("sequencer.offset_clear")
layout.separator()
+ layout.operator("sequencer.copy", text="Copy")
+ layout.operator("sequencer.paste", text="Paste")
layout.operator("sequencer.duplicate_move")
layout.operator("sequencer.delete", text="Delete...")
@@ -750,7 +801,7 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel):
row = col.row(align=True)
row.prop(strip, "location", text="")
col.prop(strip, "wrap_width")
- layout.operator("sequencer.export_subtitles")
+ layout.operator("sequencer.export_subtitles", icon='EXPORT')
col = layout.column(align=True)
if strip.type == 'SPEED':
@@ -822,7 +873,7 @@ class SEQUENCER_PT_input(SequencerButtonsPanel, Panel):
split.label(text="Alpha:")
split.prop(strip, "alpha_mode", text="")
- layout.operator("sequencer.change_path", icon='FILESEL').filter_image = True
+ layout.operator("sequencer.change_path", icon='FILEBROWSER').filter_image = True
elif seq_type == 'MOVIE':
split = layout.split(factor=0.2)
@@ -912,7 +963,7 @@ class SEQUENCER_PT_sound(SequencerButtonsPanel, Panel):
layout.prop(sound, "use_mono")
- if st.waveform_draw_type == 'DEFAULT_WAVEFORMS':
+ if st.waveform_display_type == 'DEFAULT_WAVEFORMS':
layout.prop(strip, "show_waveform")
col = layout.column(align=True)
@@ -1160,7 +1211,7 @@ class SEQUENCER_PT_view(SequencerButtonsPanel_Output, Panel):
col = layout.column()
if st.display_mode == 'IMAGE':
- col.prop(st, "draw_overexposed")
+ col.prop(st, "show_overexposed")
col.separator()
elif st.display_mode == 'WAVEFORM':
@@ -1305,8 +1356,9 @@ classes = (
SEQUENCER_MT_marker,
SEQUENCER_MT_frame,
SEQUENCER_MT_add,
- SEQUENCER_MT_add_generate,
SEQUENCER_MT_add_effect,
+ SEQUENCER_MT_add_transitions,
+ SEQUENCER_MT_add_empty,
SEQUENCER_MT_strip,
SEQUENCER_MT_strip_transform,
SEQUENCER_MT_strip_input,
diff --git a/release/scripts/startup/bl_ui/space_statusbar.py b/release/scripts/startup/bl_ui/space_statusbar.py
index 2cc5bd94bd7..87085e4ceea 100644
--- a/release/scripts/startup/bl_ui/space_statusbar.py
+++ b/release/scripts/startup/bl_ui/space_statusbar.py
@@ -34,19 +34,6 @@ class STATUSBAR_HT_header(Header):
# messages
layout.template_reports_banner()
-
- row = layout.row(align=True)
- if bpy.app.autoexec_fail is True and bpy.app.autoexec_fail_quiet is False:
- row.label(text="Auto-run disabled", icon='ERROR')
- if bpy.data.is_saved:
- props = row.operator("wm.revert_mainfile", icon='SCREEN_BACK', text="Reload Trusted")
- props.use_scripts = True
-
- row.operator("script.autoexec_warn_clear", text="Ignore")
-
- # include last so text doesn't push buttons out of the header
- row.label(text=bpy.app.autoexec_fail_message)
-
layout.template_running_jobs()
layout.separator_spacer()
diff --git a/release/scripts/startup/bl_ui/space_time.py b/release/scripts/startup/bl_ui/space_time.py
index 7dc23550f52..79c0c5264e1 100644
--- a/release/scripts/startup/bl_ui/space_time.py
+++ b/release/scripts/startup/bl_ui/space_time.py
@@ -196,7 +196,7 @@ def marker_menu_generic(layout):
layout.separator()
layout.operator("marker.rename", text="Rename Marker")
- layout.operator("marker.move", text="Grab/Move Marker")
+ layout.operator("marker.move", text="Move Marker")
layout.separator()
@@ -298,6 +298,8 @@ class TIME_PT_keyframing_settings(TimelinePanelButtons, Panel):
if not userprefs.edit.use_keyframe_insert_available:
col.prop(toolsettings, "use_record_with_nla", text="Layered Recording")
+ layout.prop(toolsettings, "use_keyframe_cycle_aware")
+
###################################
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_common.py b/release/scripts/startup/bl_ui/space_toolsystem_common.py
index 1be86ea7c1c..8a84f2d7d3c 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_common.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_common.py
@@ -60,7 +60,7 @@ def _keymap_fn_from_seq(keymap_data):
kmi = km.keymap_items.new(op_idname, **kmi_kwargs)
kmi_props = kmi.properties
if op_props_dict:
- _props_assign_recursive(kmi.properties, op_props_dict)
+ _props_assign_recursive(kmi_props, op_props_dict)
keymap_fn.keymap_data = keymap_data
return keymap_fn
@@ -99,6 +99,8 @@ ToolDef = namedtuple(
"operator",
# Optional draw settings (operator options, toolsettings).
"draw_settings",
+ # Optional draw cursor.
+ "draw_cursor",
)
)
del namedtuple
@@ -119,6 +121,7 @@ def from_dict(kw_args):
"data_block": None,
"operator": None,
"draw_settings": None,
+ "draw_cursor": None,
}
kw.update(kw_args)
@@ -140,10 +143,16 @@ def from_fn(fn):
return ToolDef.from_dict(fn())
+def with_args(**kw):
+ def from_fn(fn):
+ return ToolDef.from_dict(fn(**kw))
+ return from_fn
+
+
+from_fn.with_args = with_args
ToolDef.from_dict = from_dict
ToolDef.from_fn = from_fn
-del from_dict
-del from_fn
+del from_dict, from_fn, with_args
class ToolSelectPanelHelper:
@@ -248,7 +257,6 @@ class ToolSelectPanelHelper:
"""
Return the active Python tool definition and icon name.
"""
- workspace = context.workspace
cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type)
if cls is not None:
tool_active = ToolSelectPanelHelper._tool_active_from_context(context, space_type, mode)
@@ -303,25 +311,32 @@ class ToolSelectPanelHelper:
return context.button_operator.name
@classmethod
- def _km_action_simple(cls, kc, context_mode, text, keymap_fn):
- if context_mode is None:
- context_mode = "All"
- km_idname = f"{cls.keymap_prefix:s} {context_mode:s}, {text:s}"
+ def _km_action_simple(cls, kc, context_descr, text, keymap_fn):
+ km_idname = f"{cls.keymap_prefix:s} {context_descr:s}, {text:s}"
km = kc.keymaps.get(km_idname)
if km is None:
km = kc.keymaps.new(km_idname, space_type=cls.bl_space_type, region_type='WINDOW')
keymap_fn[0](km)
keymap_fn[0] = km
+ # Special internal function, gives use items that contain keymaps.
+ @staticmethod
+ def _tools_flatten_with_keymap(tools):
+ for item_parent in tools:
+ if item_parent is None:
+ continue
+ for item in item_parent if (type(item_parent) is tuple) else (item_parent,):
+ # skip None or generator function
+ if item is None or _item_is_fn(item):
+ continue
+ if item.keymap is not None:
+ yield item
+
@classmethod
def register(cls):
wm = bpy.context.window_manager
-
- # XXX, should we be manipulating the user-keyconfig on load?
- # Perhaps this should only add when keymap items don't already exist.
- #
- # This needs some careful consideration.
- kc = wm.keyconfigs.user
+ # Write into defaults, users may modify in preferences.
+ kc = wm.keyconfigs.default
# Track which tool-group was last used for non-active groups.
# Blender stores the active tool-group index.
@@ -334,18 +349,25 @@ class ToolSelectPanelHelper:
return
for context_mode, tools in cls.tools_all():
- for item_parent in tools:
- if item_parent is None:
- continue
- for item in item_parent if (type(item_parent) is tuple) else (item_parent,):
- # skip None or generator function
- if item is None or _item_is_fn(item):
- continue
- keymap_data = item.keymap
- if keymap_data is not None and callable(keymap_data[0]):
- text = item.text
- icon_name = item.icon
- cls._km_action_simple(kc, context_mode, text, keymap_data)
+ if context_mode is None:
+ context_descr = "All"
+ else:
+ context_descr = context_mode.replace("_", " ").title()
+
+ for item in cls._tools_flatten_with_keymap(tools):
+ keymap_data = item.keymap
+ if callable(keymap_data[0]):
+ cls._km_action_simple(kc, context_descr, item.text, keymap_data)
+
+ @classmethod
+ def keymap_ui_hierarchy(cls, context_mode):
+ # See: bpy_extras.keyconfig_utils
+ for context_mode_test, tools in cls.tools_all():
+ if context_mode_test == context_mode:
+ for item in cls._tools_flatten_with_keymap(tools):
+ km = item.keymap[0]
+ # print((km.name, cls.bl_space_type, 'WINDOW', []))
+ yield (km.name, cls.bl_space_type, 'WINDOW', [])
# -------------------------------------------------------------------------
# Layout Generators
@@ -429,7 +451,6 @@ class ToolSelectPanelHelper:
# 2 column layout, disabled
if width_scale > 80.0:
column_count = 2
- use_columns = True
else:
column_count = 1
@@ -521,6 +542,14 @@ class ToolSelectPanelHelper:
self.draw_cls(self.layout, context)
@staticmethod
+ def tool_active_from_context(context):
+ # BAD DESIGN WARNING: last used tool
+ workspace = context.workspace
+ space_type = workspace.tools_space_type
+ mode = workspace.tools_mode
+ return ToolSelectPanelHelper._tool_active_from_context(context, space_type, mode)
+
+ @staticmethod
def draw_active_tool_header(
context, layout,
*,
@@ -564,7 +593,7 @@ class WM_MT_toolsystem_submenu(Menu):
layout = self.layout
layout.scale_y = 2.0
- cls, item_group = self._tool_group_from_button(context)
+ _cls, item_group = self._tool_group_from_button(context)
if item_group is None:
# Should never happen, just in case
layout.label(text="Unable to find toolbar group")
@@ -594,9 +623,23 @@ def _activate_by_item(context, space_type, item, index):
index=index,
)
+ WindowManager = bpy.types.WindowManager
+
+ handle_map = _activate_by_item._cursor_draw_handle
+ handle = handle_map.pop(space_type, None)
+ if (handle is not None):
+ WindowManager.draw_cursor_remove(handle)
+ if item.draw_cursor is not None:
+ def handle_fn(context, item, tool, xy):
+ item.draw_cursor(context, tool, xy)
+ handle = WindowManager.draw_cursor_add(handle_fn, (context, item, tool), space_type)
+ handle_map[space_type] = handle
+
+_activate_by_item._cursor_draw_handle = {}
+
def activate_by_name(context, space_type, text):
- cls, item, index = ToolSelectPanelHelper._tool_get_by_name(context, space_type, text)
+ _cls, item, index = ToolSelectPanelHelper._tool_get_by_name(context, space_type, text)
if item is None:
return False
_activate_by_item(context, space_type, item, index)
@@ -606,7 +649,7 @@ def activate_by_name(context, space_type, text):
def activate_by_name_or_cycle(context, space_type, text, offset=1):
# Only cycle when the active tool is activated again.
- cls, item, index = ToolSelectPanelHelper._tool_get_by_name(context, space_type, text)
+ cls, item, _index = ToolSelectPanelHelper._tool_get_by_name(context, space_type, text)
if item is None:
return False
@@ -617,8 +660,7 @@ def activate_by_name_or_cycle(context, space_type, text, offset=1):
for item_group in cls.tools_from_context(context):
if type(item_group) is tuple:
index_current = cls._tool_group_active.get(item_group[0].text, 0)
- ok = False
- for i, sub_item in enumerate(item_group):
+ for sub_item in item_group:
if sub_item.text == text:
text_current = item_group[index_current].text
break
@@ -641,7 +683,7 @@ def activate_by_name_or_cycle(context, space_type, text, offset=1):
def description_from_name(context, space_type, text, *, use_operator=True):
# Used directly for tooltips.
- cls, item, index = ToolSelectPanelHelper._tool_get_by_name(context, space_type, text)
+ _cls, item, _index = ToolSelectPanelHelper._tool_get_by_name(context, space_type, text)
if item is None:
return False
@@ -660,13 +702,13 @@ def description_from_name(context, space_type, text, *, use_operator=True):
if operator is not None:
import _bpy
- return _bpy.ops.get_rna(operator).bl_rna.description
+ return _bpy.ops.get_rna_type(operator).description
return ""
def keymap_from_name(context, space_type, text):
# Used directly for tooltips.
- cls, item, index = ToolSelectPanelHelper._tool_get_by_name(context, space_type, text)
+ _cls, item, _index = ToolSelectPanelHelper._tool_get_by_name(context, space_type, text)
if item is None:
return False
@@ -702,9 +744,27 @@ def keymap_from_context(context, space_type):
use_simple_keymap = False
+ # Press the toolbar popup key again to set the default tool,
+ # this is useful because the cursor tool is useful as a way
+ # to 'drop' currently active tools (it's basically a 'none' tool).
+ # so this allows us to quickly go back to a state that allows
+ # a shortcut based workflow (before the tool system was added).
+ use_tap_reset = True
+ # TODO: support other tools for modes which don't use the cursor.
+ tap_reset_tool = "Cursor"
+ # Check the tool is available in the current context.
+ if ToolSelectPanelHelper._tool_get_by_name(context, space_type, tap_reset_tool)[1] is None:
+ use_tap_reset = False
+
+ # Pie-menu style release to activate.
+ use_release_confirm = True
+
# Generate items when no keys are mapped.
use_auto_keymap = True
+ # Temporary, only create so we can pass 'properties' to find_item_from_operator.
+ use_hack_properties = True
+
km_name = "Toolbar Popup"
wm = context.window_manager
keyconf = wm.keyconfigs.active
@@ -727,6 +787,52 @@ def keymap_from_context(context, space_type):
if item is not None
]
+ if use_hack_properties:
+ kmi_hack = keymap.keymap_items.new("wm.tool_set_by_name", 'A', 'PRESS')
+ kmi_hack_properties = kmi_hack.properties
+
+ kmi_hack_brush_select = keymap.keymap_items.new("paint.brush_select", 'A', 'PRESS')
+ kmi_hack_brush_select_properties = kmi_hack_brush_select.properties
+
+ if use_release_confirm or use_tap_reset:
+ kmi_toolbar = wm.keyconfigs.find_item_from_operator(idname="wm.toolbar")[1]
+ kmi_toolbar_type = None if not kmi_toolbar else kmi_toolbar.type
+ if use_tap_reset and kmi_toolbar_type is not None:
+ kmi_toolbar_args = {
+ "type": kmi_toolbar_type,
+ **modifier_keywords_from_item(kmi_toolbar),
+ }
+ else:
+ use_tap_reset = False
+ del kmi_toolbar
+
+ if use_tap_reset:
+ kmi_found = None
+ if use_hack_properties:
+ # First check for direct assignment, if this tool already has a key, no need to add a new one.
+ kmi_hack_properties.name = tap_reset_tool
+ kmi_found = wm.keyconfigs.find_item_from_operator(
+ idname="wm.tool_set_by_name",
+ context='INVOKE_REGION_WIN',
+ # properties={"name": item.text},
+ properties=kmi_hack_properties,
+ )[1]
+ if kmi_found:
+ use_tap_reset = False
+ del kmi_found
+
+ if use_tap_reset:
+ kmi_toolbar_tuple = dict_as_tuple(kmi_toolbar_args)
+ if kmi_toolbar_tuple not in kmi_unique_args:
+ kmi = keymap.keymap_items.new(
+ "wm.tool_set_by_name",
+ value='DOUBLE_CLICK',
+ **kmi_toolbar_args,
+ )
+ kmi.properties.name = tap_reset_tool
+ kmi_unique_args.add(kmi_toolbar_tuple)
+ del kmi_toolbar_tuple
+
if use_simple_keymap:
# Simply assign a key from A-Z.
for i, (item, _, _) in enumerate(items_all):
@@ -737,15 +843,57 @@ def keymap_from_context(context, space_type):
for item_container in items_all:
item = item_container[0]
# Only check the first item in the tools key-map (a little arbitrary).
- if item.operator is not None:
+
+ if use_hack_properties:
+ # First check for direct assignment.
+ kmi_hack_properties.name = item.text
+ kmi_found = wm.keyconfigs.find_item_from_operator(
+ idname="wm.tool_set_by_name",
+ context='INVOKE_REGION_WIN',
+ # properties={"name": item.text},
+ properties=kmi_hack_properties,
+ )[1]
+
+ if kmi_found is None:
+ if item.data_block:
+ # PAINT_OT_brush_select
+ mode = context.active_object.mode
+ # See: BKE_paint_get_tool_prop_id_from_paintmode
+ attr = {
+ 'SCULPT': "sculpt_tool",
+ 'VERTEX_PAINT': "vertex_tool",
+ 'WEIGHT_PAINT': "weight_tool",
+ 'TEXTURE_PAINT': "image_tool",
+ 'GPENCIL_PAINT': "gpencil_tool",
+ }.get(mode, (None, None))
+ if attr is not None:
+ kmi_hack_brush_select_properties.paint_mode = mode
+ setattr(kmi_hack_brush_select_properties, attr, item.data_block)
+ kmi_found = wm.keyconfigs.find_item_from_operator(
+ idname="paint.brush_select",
+ context='INVOKE_REGION_WIN',
+ properties=kmi_hack_brush_select_properties,
+ )[1]
+ else:
+ print("Unsupported mode:", mode)
+ del mode, attr
+
+ else:
+ kmi_found = None
+
+ if kmi_found is not None:
+ pass
+ elif item.operator is not None:
kmi_found = wm.keyconfigs.find_item_from_operator(
idname=item.operator,
+ context='INVOKE_REGION_WIN',
)[1]
elif item.keymap is not None:
kmi_first = item.keymap[0].keymap_items[0]
kmi_found = wm.keyconfigs.find_item_from_operator(
idname=kmi_first.idname,
# properties=kmi_first.properties, # prevents matches, don't use.
+ context='INVOKE_REGION_WIN',
)[1]
del kmi_first
else:
@@ -760,7 +908,11 @@ def keymap_from_context(context, space_type):
kmi_found_type = kmi_found.type
# Only for single keys.
- if len(kmi_found_type) == 1:
+ if (
+ (len(kmi_found_type) == 1) or
+ # When a tool is being activated instead of running an operator, just copy the shortcut.
+ (kmi_found.idname in {"wm.tool_set_by_name", "WM_OT_tool_set_by_name"})
+ ):
kmi_args = {"type": kmi_found_type, **modifier_keywords_from_item(kmi_found)}
kmi = keymap.keymap_items.new(idname="wm.tool_set_by_name", value='PRESS', **kmi_args)
kmi.properties.name = item.text
@@ -861,16 +1013,16 @@ def keymap_from_context(context, space_type):
if use_auto_keymap:
kmi_unique_args.add(kmi_tuple)
- if True:
- # The shortcut will show, so we better support running it.
- kmi_search = wm.keyconfigs.find_item_from_operator(idname="wm.search_menu")[1]
- if kmi_search:
- keymap.keymap_items.new(
- "wm.search_menu",
- type=kmi_search.type,
- value='PRESS',
- **modifier_keywords_from_item(kmi_search),
- )
+ if use_hack_properties:
+ keymap.keymap_items.remove(kmi_hack)
+
+ if use_release_confirm:
+ kmi = keymap.keymap_items.new(
+ "ui.button_execute",
+ type=kmi_toolbar_type,
+ value='RELEASE',
+ )
+ kmi.properties.skip_depressed = True
wm.keyconfigs.update()
return keymap
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index 003f1fa4a7a..4a028271bad 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -31,114 +31,23 @@ from .space_toolsystem_common import (
ToolSelectPanelHelper,
ToolDef,
)
-
-
-def generate_from_brushes_ex(
- context, *,
- icon_prefix,
- brush_test_attr,
- brush_category_attr,
- brush_category_layout,
-):
- # Categories
- brush_categories = {}
- if context.mode != 'GPENCIL_PAINT':
- for brush in context.blend_data.brushes:
- if getattr(brush, brush_test_attr) and brush.gpencil_settings is None:
- category = getattr(brush, brush_category_attr)
- name = brush.name
- brush_categories.setdefault(category, []).append(
- ToolDef.from_dict(
- dict(
- text=name,
- icon=icon_prefix + category.lower(),
- data_block=name,
- )
- )
- )
- else:
- def draw_settings(context, layout, tool):
- _defs_gpencil_paint.draw_settings_common(context, layout, tool)
-
- for brush_type in brush_category_layout:
- for brush in context.blend_data.brushes:
- if getattr(brush, brush_test_attr) and brush.gpencil_settings.gp_icon == brush_type[0]:
- category = brush_type[0]
- name = brush.name
- text = name
-
- # XXX, disabled since changing the brush needs to sync back to the tool.
- """
- # rename default brushes for tool bar
- if name.startswith("Draw "):
- text = name.replace("Draw ", "")
- elif name.startswith("Eraser "):
- text = name.replace("Eraser ", "")
- elif name.startswith("Fill "):
- text = name.replace(" Area", "")
- else:
- text = name
- """
- # Define icon.
- icon_name = {
- 'PENCIL': 'draw_pencil',
- 'PEN': 'draw_pen',
- 'INK': 'draw_ink',
- 'INKNOISE': 'draw_noise',
- 'BLOCK': 'draw_block',
- 'MARKER': 'draw_marker',
- 'FILL': 'draw_fill',
- 'SOFT': 'draw.eraser_soft',
- 'HARD': 'draw.eraser_hard',
- 'STROKE': 'draw.eraser_stroke',
- }[category]
- brush_categories.setdefault(category, []).append(
- ToolDef.from_dict(
- dict(
- text=text,
- icon=icon_prefix + icon_name,
- data_block=name,
- widget=None,
- operator="gpencil.draw",
- draw_settings=draw_settings,
- )
- )
- )
-
- def tools_from_brush_group(groups):
- assert(type(groups) is tuple)
- if len(groups) == 1:
- tool_defs = tuple(brush_categories.pop(groups[0], ()))
- else:
- tool_defs = tuple(item for g in groups for item in brush_categories.pop(g, ()))
-
- if len(tool_defs) > 1:
- return (tool_defs,)
- else:
- return tool_defs
-
- # Each item below is a single toolbar entry:
- # Grouped for multiple or none if no brushes are found.
- tool_defs = tuple(
- tool_def
- for category in brush_category_layout
- for tool_def in tools_from_brush_group(category)
- )
- # Ensure we use all types.
- if brush_categories:
- print(brush_categories)
- assert(len(brush_categories) == 0)
- return tool_defs
+from .properties_material_gpencil import (
+ GPENCIL_UL_matslots,
+)
+from .properties_grease_pencil_common import (
+ AnnotationDataPanel,
+)
def generate_from_enum_ex(
context, *,
icon_prefix,
- data,
+ type,
attr,
+ tooldef_keywords={},
):
tool_defs = []
- for enum in data.rna_type.properties[attr].enum_items_static:
+ for enum in type.bl_rna.properties[attr].enum_items_static:
name = enum.name
identifier = enum.identifier
tool_defs.append(
@@ -147,6 +56,7 @@ def generate_from_enum_ex(
text=name,
icon=icon_prefix + identifier.lower(),
data_block=identifier,
+ **tooldef_keywords,
)
)
)
@@ -160,11 +70,10 @@ class _defs_view3d_generic:
props = tool.operator_properties("view3d.cursor3d")
layout.prop(props, "use_depth")
layout.prop(props, "orientation")
-
return dict(
text="Cursor",
description=(
- "Set the 3D cursor location, drag to transform"
+ "Set the cursor location, drag to transform"
),
icon="ops.generic.cursor",
keymap=(
@@ -192,6 +101,14 @@ class _defs_view3d_generic:
def ruler():
return dict(
text="Measure",
+ description=(
+ "Measure distance and angles.\n"
+ "\u2022 Drag anywhere for new measurement.\n"
+ "\u2022 Drag ruler segment to measure an angle.\n"
+ "\u2022 Drag ruler outside the view to remove.\n"
+ "\u2022 Ctrl to snap.\n"
+ "\u2022 Shift to measure surface thickness"
+ ),
icon="ops.view3d.ruler",
widget="VIEW3D_GGT_ruler",
keymap=(
@@ -203,26 +120,48 @@ class _defs_view3d_generic:
def _defs_annotate_factory():
class _defs_annotate:
- @staticmethod
+
def draw_settings_common(context, layout, tool):
- ts = context.tool_settings
+ if type(context.gpencil_data_owner) is bpy.types.Object:
+ gpd = context.scene.grease_pencil
+ else:
+ gpd = context.gpencil_data
+
+ if gpd is not None:
+ if gpd.layers.active_note is not None:
+ text = gpd.layers.active_note
+ maxw = 25
+ if len(text) > maxw:
+ text = text[:maxw - 5] + '..' + text[-3:]
+ else:
+ text = ""
+
+ layout.label(text="Annotation:")
+ gpl = context.active_gpencil_layer
+ if gpl is not None:
+ sub = layout.row(align=True)
+ sub.ui_units_x = 8
+
+ sub.prop(gpl, "color", text="")
+ sub.popover(
+ panel="TOPBAR_PT_annotation_layers",
+ text=text,
+ )
+ tool_settings = context.tool_settings
space_type = tool.space_type
if space_type == 'VIEW_3D':
layout.separator()
row = layout.row(align=True)
- row.prop(ts, "annotation_stroke_placement_view3d", text="Placement")
- if ts.gpencil_stroke_placement_view3d == 'CURSOR':
- row.prop(ts.gpencil_sculpt, "lockaxis")
- elif ts.gpencil_stroke_placement_view3d in {'SURFACE', 'STROKE'}:
- row.prop(ts, "use_gpencil_stroke_endpoints")
-
- @ToolDef.from_fn
- def scribble():
- def draw_settings(context, layout, tool):
- _defs_annotate.draw_settings_common(context, layout, tool)
-
+ row.prop(tool_settings, "annotation_stroke_placement_view3d", text="Placement")
+ if tool_settings.gpencil_stroke_placement_view3d == 'CURSOR':
+ row.prop(tool_settings.gpencil_sculpt, "lockaxis")
+ elif tool_settings.gpencil_stroke_placement_view3d in {'SURFACE', 'STROKE'}:
+ row.prop(tool_settings, "use_gpencil_stroke_endpoints")
+
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def scribble(*, draw_settings):
return dict(
text="Annotate",
icon="ops.gpencil.draw",
@@ -230,16 +169,13 @@ def _defs_annotate_factory():
keymap=(
("gpencil.annotate",
dict(mode='DRAW', wait_for_input=False),
- dict(type='EVT_TWEAK_A', value='ANY')),
+ dict(type='ACTIONMOUSE', value='PRESS')),
),
draw_settings=draw_settings,
)
- @ToolDef.from_fn
- def line():
- def draw_settings(context, layout, tool):
- _defs_annotate.draw_settings_common(context, layout, tool)
-
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def line(*, draw_settings):
return dict(
text="Annotate Line",
icon="ops.gpencil.draw.line",
@@ -252,11 +188,8 @@ def _defs_annotate_factory():
draw_settings=draw_settings,
)
- @ToolDef.from_fn
- def poly():
- def draw_settings(context, layout, tool):
- _defs_annotate.draw_settings_common(context, layout, tool)
-
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def poly(*, draw_settings):
return dict(
text="Annotate Polygon",
icon="ops.gpencil.draw.poly",
@@ -272,10 +205,9 @@ def _defs_annotate_factory():
@ToolDef.from_fn
def eraser():
def draw_settings(context, layout, tool):
- # TODO: Move this setting to toolsettings
+ # TODO: Move this setting to tool_settings
user_prefs = context.user_preferences
layout.prop(user_prefs.edit, "grease_pencil_eraser_radius", text="Radius")
-
return dict(
text="Annotate Eraser",
icon="ops.gpencil.draw.eraser",
@@ -287,6 +219,7 @@ def _defs_annotate_factory():
),
draw_settings=draw_settings,
)
+
return _defs_annotate
@@ -299,59 +232,41 @@ class _defs_transform:
@ToolDef.from_fn
def translate():
- def draw_settings(context, layout, tool):
- tool_settings = context.tool_settings
- layout.prop(tool_settings, "use_gizmo_apron")
-
return dict(
- text="Grab",
+ text="Move",
# cursor='SCROLL_XY',
icon="ops.transform.translate",
widget="TRANSFORM_GGT_gizmo",
operator="transform.translate",
- # TODO, implement as optional fallback gizmo
- # keymap=(
- # ("transform.translate", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),
- # ),
- draw_settings=draw_settings,
+ keymap=(
+ ("transform.translate", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),
+ ),
)
@ToolDef.from_fn
def rotate():
- def draw_settings(context, layout, tool):
- tool_settings = context.tool_settings
- layout.prop(tool_settings, "use_gizmo_apron")
-
return dict(
text="Rotate",
# cursor='SCROLL_XY',
icon="ops.transform.rotate",
widget="TRANSFORM_GGT_gizmo",
operator="transform.rotate",
- # TODO, implement as optional fallback gizmo
- # keymap=(
- # ("transform.rotate", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),
- # ),
- draw_settings=draw_settings,
+ keymap=(
+ ("transform.rotate", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),
+ ),
)
@ToolDef.from_fn
def scale():
- def draw_settings(context, layout, tool):
- tool_settings = context.tool_settings
- layout.prop(tool_settings, "use_gizmo_apron")
-
return dict(
text="Scale",
# cursor='SCROLL_XY',
icon="ops.transform.resize",
widget="TRANSFORM_GGT_gizmo",
operator="transform.resize",
- # TODO, implement as optional fallback gizmo
- # keymap=(
- # ("transform.resize", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),
- # ),
- draw_settings=draw_settings,
+ keymap=(
+ ("transform.resize", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),
+ ),
)
@ToolDef.from_fn
@@ -366,10 +281,13 @@ class _defs_transform:
@ToolDef.from_fn
def transform():
def draw_settings(context, layout, tool):
+ layout.label(text="Gizmos:")
tool_settings = context.tool_settings
- layout.prop(tool_settings, "use_gizmo_apron")
layout.prop(tool_settings, "use_gizmo_mode")
+ props = tool.gizmo_group_properties("TRANSFORM_GGT_gizmo")
+ layout.prop(props, "drag_action")
+
return dict(
text="Transform",
description=(
@@ -377,7 +295,9 @@ class _defs_transform:
),
icon="ops.transform.transform",
widget="TRANSFORM_GGT_gizmo",
- # No keymap default action, only for gizmo!
+ keymap=(
+ ("transform.from_gizmo", dict(), dict(type='EVT_TWEAK_A', value='ANY')),
+ ),
draw_settings=draw_settings,
)
@@ -387,17 +307,17 @@ class _defs_view3d_select:
@ToolDef.from_fn
def border():
def draw_settings(context, layout, tool):
- props = tool.operator_properties("view3d.select_border")
+ props = tool.operator_properties("view3d.select_box")
layout.prop(props, "mode", expand=True)
return dict(
- text="Select Border",
- icon="ops.generic.select_border",
+ text="Select Box",
+ icon="ops.generic.select_box",
widget=None,
keymap=(
- ("view3d.select_border",
+ ("view3d.select_box",
dict(mode='ADD'),
dict(type='EVT_TWEAK_A', value='ANY')),
- ("view3d.select_border",
+ ("view3d.select_box",
dict(mode='SUB'),
dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)),
),
@@ -409,6 +329,13 @@ class _defs_view3d_select:
def draw_settings(context, layout, tool):
props = tool.operator_properties("view3d.select_circle")
layout.prop(props, "radius")
+
+ def draw_cursor(context, tool, xy):
+ from gpu_extras.presets import draw_circle_2d
+ props = tool.operator_properties("view3d.select_circle")
+ radius = props.radius
+ draw_circle_2d(xy, (1.0,) * 4, radius, 32)
+
return dict(
text="Select Circle",
icon="ops.generic.select_circle",
@@ -422,6 +349,7 @@ class _defs_view3d_select:
dict(type='ACTIONMOUSE', value='PRESS', ctrl=True)),
),
draw_settings=draw_settings,
+ draw_cursor=draw_cursor,
)
@ToolDef.from_fn
@@ -553,7 +481,8 @@ class _defs_edit_mesh:
icon="ops.mesh.rip_edge",
widget=None,
keymap=(
- ("mesh.rip_edge_edge_move", dict(),
+ ("mesh.rip_edge_move",
+ dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
dict(type='ACTIONMOUSE', value='PRESS')),
),
)
@@ -563,7 +492,7 @@ class _defs_edit_mesh:
return dict(
text="Poly Build",
icon="ops.mesh.polybuild_hover",
- widget=None,
+ widget="VIEW3D_GGT_mesh_preselect_elem",
keymap=(
("mesh.polybuild_face_at_cursor_move",
dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
@@ -572,8 +501,6 @@ class _defs_edit_mesh:
dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
dict(type='ACTIONMOUSE', value='PRESS', ctrl=True)),
("mesh.polybuild_dissolve_at_cursor", dict(), dict(type='ACTIONMOUSE', value='CLICK', alt=True)),
- ("mesh.polybuild_hover", dict(use_boundary=False), dict(type='MOUSEMOVE', value='ANY', alt=True)),
- ("mesh.polybuild_hover", dict(use_boundary=True), dict(type='MOUSEMOVE', value='ANY', any=True)),
),
)
@@ -614,26 +541,40 @@ class _defs_edit_mesh:
@ToolDef.from_fn
def spin():
+ def draw_settings(context, layout, tool):
+ props = tool.operator_properties("mesh.spin")
+ layout.prop(props, "steps")
+ props = tool.gizmo_group_properties("MESH_GGT_spin")
+ layout.prop(props, "axis")
+
return dict(
text="Spin",
icon="ops.mesh.spin",
- widget=None,
+ widget="MESH_GGT_spin",
keymap=(
("mesh.spin", dict(),
- dict(type='ACTIONMOUSE', value='PRESS')),
+ dict(type='EVT_TWEAK_A', value='ANY')),
),
+ draw_settings=draw_settings,
)
@ToolDef.from_fn
def spin_duplicate():
+ def draw_settings(context, layout, tool):
+ props = tool.operator_properties("mesh.spin")
+ layout.prop(props, "steps")
+ props = tool.gizmo_group_properties("MESH_GGT_spin")
+ layout.prop(props, "axis")
+
return dict(
text="Spin (Duplicate)",
icon="ops.mesh.spin.duplicate",
- widget=None,
+ widget="MESH_GGT_spin",
keymap=(
("mesh.spin", dict(dupli=True),
- dict(type='ACTIONMOUSE', value='PRESS')),
+ dict(type='EVT_TWEAK_A', value='ANY')),
),
+ draw_settings=draw_settings,
)
@ToolDef.from_fn
@@ -678,16 +619,25 @@ class _defs_edit_mesh:
@ToolDef.from_fn
def extrude():
+ def draw_settings(context, layout, tool):
+ props = tool.gizmo_group_properties("MESH_GGT_extrude")
+ layout.prop(props, "axis_type", expand=True)
return dict(
text="Extrude Region",
+ # The operator description isn't useful in this case, give our own.
+ description=(
+ "Extrude freely or along an axis"
+ ),
icon="ops.mesh.extrude_region_move",
widget="MESH_GGT_extrude",
+ # Important to use same operator as 'E' key.
operator="view3d.edit_mesh_extrude_move_normal",
keymap=(
("mesh.extrude_context_move",
dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
dict(type='EVT_TWEAK_A', value='ANY')),
),
+ draw_settings=draw_settings,
)
@ToolDef.from_fn
@@ -700,6 +650,7 @@ class _defs_edit_mesh:
text="Extrude Along Normals",
icon="ops.mesh.extrude_region_shrink_fatten",
widget=None,
+ operator="mesh.extrude_region_shrink_fatten",
keymap=(
("mesh.extrude_region_shrink_fatten",
dict(TRANSFORM_OT_shrink_fatten=dict(release_confirm=True)),
@@ -722,6 +673,10 @@ class _defs_edit_mesh:
@ToolDef.from_fn
def extrude_cursor():
+ def draw_settings(context, layout, tool):
+ props = tool.operator_properties("mesh.dupli_extrude_cursor")
+ layout.prop(props, "rotate_source")
+
return dict(
text="Extrude to Cursor",
icon="ops.mesh.dupli_extrude_cursor",
@@ -729,6 +684,7 @@ class _defs_edit_mesh:
keymap=(
("mesh.dupli_extrude_cursor", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
),
+ draw_settings=draw_settings,
)
@ToolDef.from_fn
@@ -766,38 +722,55 @@ class _defs_edit_mesh:
@ToolDef.from_fn
def vertex_smooth():
+ def draw_settings(context, layout, tool):
+ props = tool.operator_properties("mesh.vertices_smooth")
+ layout.prop(props, "repeat")
return dict(
text="Smooth",
icon="ops.mesh.vertices_smooth",
- widget=None,
+ widget="WM_GGT_value_operator_redo",
keymap=(
- ("mesh.vertices_smooth", dict(),
+ # Use 0.0, so dragging increases from nothing.
+ ("mesh.vertices_smooth", dict(factor=0.0),
dict(type='ACTIONMOUSE', value='PRESS')),
),
+ draw_settings=draw_settings,
)
@ToolDef.from_fn
def vertex_randomize():
+ def draw_settings(context, layout, tool):
+ props = tool.operator_properties("transform.vertex_random")
+ layout.prop(props, "uniform")
+ layout.prop(props, "normal")
+ layout.prop(props, "seed")
return dict(
text="Randomize",
icon="ops.transform.vertex_random",
- widget=None,
+ widget="WM_GGT_value_operator_redo",
keymap=(
- ("transform.vertex_random", dict(),
+ # Use 0.0, so dragging increases from nothing.
+ ("transform.vertex_random", dict(offset=0.0),
dict(type='ACTIONMOUSE', value='PRESS')),
),
+ draw_settings=draw_settings,
)
@ToolDef.from_fn
def shear():
+ def draw_settings(context, layout, tool):
+ props = tool.operator_properties("transform.shear")
+ layout.label(text="View Axis:")
+ layout.prop(props, "shear_axis", expand=True)
return dict(
text="Shear",
icon="ops.transform.shear",
- widget=None,
+ widget="VIEW3D_GGT_xform_shear",
keymap=(
("transform.shear", dict(release_confirm=True),
- dict(type='ACTIONMOUSE', value='PRESS')),
+ dict(type='EVT_TWEAK_A', value='ANY')),
),
+ draw_settings=draw_settings,
)
@ToolDef.from_fn
@@ -862,6 +835,12 @@ class _defs_edit_mesh:
@ToolDef.from_fn
def bisect():
+ def draw_settings(context, layout, tool):
+ props = tool.operator_properties("mesh.bisect")
+ layout.prop(props, "use_fill")
+ layout.prop(props, "clear_inner")
+ layout.prop(props, "clear_outer")
+ layout.prop(props, "threshold")
return dict(
text="Bisect",
icon="ops.mesh.bisect",
@@ -871,6 +850,7 @@ class _defs_edit_mesh:
dict(),
dict(type='EVT_TWEAK_A', value='ANY')),
),
+ draw_settings=draw_settings,
)
@@ -899,7 +879,7 @@ class _defs_edit_curve:
return dict(
text="Draw",
cursor='PAINT_BRUSH',
- icon=None,
+ icon="ops.curve.draw",
widget=None,
keymap=(
("curve.draw", dict(wait_for_input=False), dict(type='ACTIONMOUSE', value='PRESS')),
@@ -911,7 +891,7 @@ class _defs_edit_curve:
def extrude():
return dict(
text="Extrude",
- icon=None,
+ icon="ops.curve.extrude_move",
widget=None,
keymap=(
("curve.extrude_move",
@@ -924,7 +904,7 @@ class _defs_edit_curve:
def extrude_cursor():
return dict(
text="Extrude Cursor",
- icon=None,
+ icon="ops.curve.extrude_cursor",
widget=None,
keymap=(
("curve.vertex_add", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
@@ -975,7 +955,7 @@ class _defs_particle:
return generate_from_enum_ex(
context,
icon_prefix="brush.particle.",
- data=context.tool_settings.particle_edit,
+ type=bpy.types.ParticleEdit,
attr="tool",
)
@@ -984,31 +964,17 @@ class _defs_sculpt:
@staticmethod
def generate_from_brushes(context):
- return generate_from_brushes_ex(
+ return generate_from_enum_ex(
context,
icon_prefix="brush.sculpt.",
- brush_test_attr="use_paint_sculpt",
- brush_category_attr="sculpt_tool",
- brush_category_layout=(
- ('DRAW',),
- ('GRAB', 'THUMB'),
- ('SNAKE_HOOK',),
- ('BLOB', 'INFLATE'),
- ('SMOOTH', 'SCRAPE', 'FLATTEN'),
- ('CREASE', 'PINCH'),
- ('CLAY', 'CLAY_STRIPS'),
- ('LAYER',),
- ('NUDGE', 'ROTATE'),
- ('FILL',),
- ('SIMPLIFY',),
- ('MASK',),
- )
+ type=bpy.types.Brush,
+ attr="sculpt_tool",
)
@ToolDef.from_fn
def hide_border():
return dict(
- text="Border Hide",
+ text="Box Hide",
icon="ops.sculpt.border_hide",
widget=None,
keymap=(
@@ -1021,12 +987,12 @@ class _defs_sculpt:
@ToolDef.from_fn
def mask_border():
return dict(
- text="Border Mask",
+ text="Box Mask",
icon="ops.sculpt.border_mask",
widget=None,
keymap=(
- ("view3d.select_border", dict(mode='ADD'), dict(type='EVT_TWEAK_A', value='ANY')),
- ("view3d.select_border", dict(mode='SUB'), dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)),
+ ("view3d.select_box", dict(mode='ADD'), dict(type='EVT_TWEAK_A', value='ANY')),
+ ("view3d.select_box", dict(mode='SUB'), dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)),
),
)
@@ -1035,47 +1001,27 @@ class _defs_vertex_paint:
@staticmethod
def poll_select_mask(context):
- mesh = context.object.data
- return mesh.use_paint_mask
+ ob = context.active_object
+ return ob.type == 'MESH' and ob.data.use_paint_mask
@staticmethod
def generate_from_brushes(context):
- return generate_from_brushes_ex(
+ return generate_from_enum_ex(
context,
icon_prefix="brush.paint_vertex.",
- brush_test_attr="use_paint_vertex",
- brush_category_attr="vertex_tool",
- brush_category_layout=(
- ('MIX',),
- ('BLUR', 'AVERAGE'),
- ('SMEAR',),
- (
- 'ADD', 'SUB', 'MUL', 'LIGHTEN', 'DARKEN',
- 'COLORDODGE', 'DIFFERENCE', 'SCREEN', 'HARDLIGHT',
- 'OVERLAY', 'SOFTLIGHT', 'EXCLUSION', 'LUMINOCITY',
- 'SATURATION', 'HUE', 'ERASE_ALPHA', 'ADD_ALPHA',
- ),
- )
+ type=bpy.types.Brush,
+ attr="vertex_tool",
)
-
class _defs_texture_paint:
@staticmethod
def generate_from_brushes(context):
- return generate_from_brushes_ex(
+ return generate_from_enum_ex(
context,
icon_prefix="brush.paint_texture.",
- brush_test_attr="use_paint_image",
- brush_category_attr="image_tool",
- brush_category_layout=(
- ('DRAW',),
- ('SOFTEN',),
- ('SMEAR',),
- ('CLONE',),
- ('FILL',),
- ('MASK',),
- )
+ type=bpy.types.Brush,
+ attr="image_tool",
)
@@ -1083,27 +1029,18 @@ class _defs_weight_paint:
@staticmethod
def poll_select_mask(context):
- mesh = context.object.data
- return (mesh.use_paint_mask or mesh.use_paint_mask_vertex)
+ ob = context.active_object
+ return (ob.type == 'MESH' and
+ (ob.data.use_paint_mask or
+ ob.data.use_paint_mask_vertex))
@staticmethod
def generate_from_brushes(context):
- return generate_from_brushes_ex(
+ return generate_from_enum_ex(
context,
icon_prefix="brush.paint_weight.",
- brush_test_attr="use_paint_weight",
- brush_category_attr="vertex_tool",
- brush_category_layout=(
- ('MIX',),
- ('BLUR', 'AVERAGE'),
- ('SMEAR',),
- (
- 'ADD', 'SUB', 'MUL', 'LIGHTEN', 'DARKEN',
- 'COLORDODGE', 'DIFFERENCE', 'SCREEN', 'HARDLIGHT',
- 'OVERLAY', 'SOFTLIGHT', 'EXCLUSION', 'LUMINOCITY',
- 'SATURATION', 'HUE',
- ),
- )
+ type=bpy.types.Brush,
+ attr="weight_tool",
)
@ToolDef.from_fn
@@ -1131,6 +1068,10 @@ class _defs_weight_paint:
@ToolDef.from_fn
def gradient():
def draw_settings(context, layout, tool):
+ brush = context.tool_settings.weight_paint.brush
+ if brush is not None:
+ from .properties_paint_common import UnifiedPaintPanel
+ UnifiedPaintPanel.prop_unified_weight(layout, context, brush, "weight", slider=True, text="Weight")
props = tool.operator_properties("paint.weight_gradient")
layout.prop(props, "type")
@@ -1145,38 +1086,90 @@ class _defs_weight_paint:
)
-class _defs_uv_select:
+class _defs_image_generic:
+
+ @staticmethod
+ def poll_uvedit(context):
+ ob = context.edit_object
+ if ob is not None:
+ data = ob.data
+ if data is not None:
+ return bool(getattr(data, "uv_layers", False))
+ return False
+
+ @ToolDef.from_fn
+ def cursor():
+ return dict(
+ text="Cursor",
+ description=(
+ "Set the cursor location, drag to transform"
+ ),
+ icon="ops.generic.cursor",
+ keymap=(
+ ("uv.cursor_set", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
+ ("transform.translate",
+ dict(release_confirm=True, cursor_transform=True),
+ dict(type='EVT_TWEAK_A', value='ANY'),
+ ),
+ ),
+ )
+
+
+class _defs_image_uv_transform:
+
+ @ToolDef.from_fn
+ def transform():
+ return dict(
+ text="Transform",
+ description=(
+ "Supports any combination of grab, rotate & scale at once"
+ ),
+ icon="ops.transform.transform",
+ widget="IMAGE_GGT_gizmo2d",
+ # No keymap default action, only for gizmo!
+ )
+
+
+class _defs_image_uv_select:
@ToolDef.from_fn
def border():
+ def draw_settings(context, layout, tool):
+ props = tool.operator_properties("uv.select_box")
+ layout.prop(props, "deselect")
return dict(
- text="Select Border",
- icon="ops.generic.select_border",
+ text="Select Box",
+ icon="ops.generic.select_box",
widget=None,
keymap=(
- ("uv.select_border",
- dict(deselect=False),
+ ("uv.select_box",
+ dict(),
dict(type='EVT_TWEAK_A', value='ANY')),
- # ("uv.select_border",
- # dict(deselect=True),
- # dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)),
+ ("uv.select_box",
+ dict(deselect=True),
+ dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)),
),
+ draw_settings=draw_settings,
)
@ToolDef.from_fn
def circle():
+ def draw_settings(context, layout, tool):
+ props = tool.operator_properties("uv.select_circle")
+ layout.prop(props, "radius")
return dict(
text="Select Circle",
icon="ops.generic.select_circle",
widget=None,
keymap=(
("uv.select_circle",
- dict(), # dict(deselect=False),
+ dict(deselect=False),
dict(type='ACTIONMOUSE', value='PRESS')),
- # ("uv.select_circle",
- # dict(deselect=True),
- # dict(type='ACTIONMOUSE', value='PRESS', ctrl=True)),
+ ("uv.select_circle",
+ dict(deselect=True),
+ dict(type='ACTIONMOUSE', value='PRESS', ctrl=True)),
),
+ draw_settings=draw_settings,
)
@ToolDef.from_fn
@@ -1196,72 +1189,114 @@ class _defs_uv_select:
)
+class _defs_image_uv_sculpt:
+
+ @staticmethod
+ def generate_from_brushes(context):
+ return generate_from_enum_ex(
+ context,
+ icon_prefix="brush.uv_sculpt.",
+ data=context.tool_settings,
+ attr="uv_sculpt_tool",
+ )
+
+
class _defs_gpencil_paint:
+
+ @staticmethod
+ def generate_from_brushes(context):
+ return generate_from_enum_ex(
+ context,
+ icon_prefix="brush.gpencil_draw.",
+ type=bpy.types.Brush,
+ attr="gpencil_tool",
+ tooldef_keywords=dict(
+ operator="gpencil.draw",
+ ),
+ )
+
@staticmethod
- def draw_color_selector(context, layout):
- brush = context.active_gpencil_brush
- gp_settings = brush.gpencil_settings
- ts = context.tool_settings
+ def draw_color_selector(context, layout, gp_settings):
+ ma = gp_settings.material
row = layout.row(align=True)
- row.prop(ts, "use_gpencil_thumbnail_list", text="", icon="IMGDISPLAY")
- if ts.use_gpencil_thumbnail_list is False:
- row.template_ID(gp_settings, "material", live_icon=True)
+
+ icon_id = 0
+ if ma:
+ icon_id = ma.id_data.preview.icon_id
+ txt_ma = ma.name
+ maxw = 25
+ if len(txt_ma) > maxw:
+ txt_ma = txt_ma[:maxw - 5] + '..' + txt_ma[-3:]
else:
- row.template_greasepencil_color(gp_settings, "material", rows=3, cols=8, scale=0.8)
- row.prop(gp_settings, "pin_material", text="")
+ txt_ma = ""
- @staticmethod
- def draw_settings_common(context, layout, tool):
- ob = context.active_object
- if ob and ob.mode == 'GPENCIL_PAINT':
- brush = context.active_gpencil_brush
- gp_settings = brush.gpencil_settings
- tool_settings = context.tool_settings
+ row.label(text="Material:")
+ sub = row.row()
+ sub.ui_units_x = 8
+ sub.popover(
+ panel="TOPBAR_PT_gpencil_materials",
+ text=txt_ma,
+ icon_value=icon_id,
+ )
- if gp_settings.gpencil_brush_type == 'ERASE':
- row = layout.row()
- row.prop(brush, "size", text="Radius")
- elif gp_settings.gpencil_brush_type == 'FILL':
- row = layout.row()
- row.prop(gp_settings, "gpencil_fill_leak", text="Leak Size")
- row.prop(brush, "size", text="Thickness")
- row.prop(gp_settings, "gpencil_fill_simplyfy_level", text="Simplify")
+ row.prop(gp_settings, "use_material_pin", text="")
- _defs_gpencil_paint.draw_color_selector(context, layout)
+ def draw_settings_common(context, layout, tool):
+ row = layout.row(align=True)
+ ts = context.scene.tool_settings
+ gp_settings = ts.gpencil_paint
+ brush = gp_settings.brush
+ gp_brush = brush.gpencil_settings
+ row.template_ID_preview(gp_settings, "brush", rows=3, cols=8, hide_buttons=True)
- row = layout.row(align=True)
- row.prop(gp_settings, "gpencil_fill_draw_mode", text="")
- row.prop(gp_settings, "gpencil_fill_show_boundary", text="", icon='GRID')
+ if brush and brush.gpencil_tool == 'DRAW':
+ row = layout.row(align=True)
+ row.prop(brush, "size", text="Radius")
+ row = layout.row(align=True)
+ row.prop(gp_brush, "pen_strength", slider=True)
- else: # bgpsettings.gpencil_brush_type == 'DRAW':
- row = layout.row(align=True)
- row.prop(brush, "size", text="Radius")
- row.prop(gp_settings, "use_pressure", text="", icon='STYLUS_PRESSURE')
- row = layout.row(align=True)
- row.prop(gp_settings, "pen_strength", slider=True)
- row.prop(gp_settings, "use_strength_pressure", text="", icon='STYLUS_PRESSURE')
+ _defs_gpencil_paint.draw_color_selector(context, layout, gp_brush)
+
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def line(*, draw_settings):
+ return dict(
+ text="Line",
+ icon="ops.gpencil.primitive_line",
+ widget=None,
+ keymap=(
+ ("gpencil.primitive",
+ dict(type='LINE', wait_for_input=False),
+ dict(type='EVT_TWEAK_A', value='ANY')),
+ ),
+ draw_settings=draw_settings,
+ )
- _defs_gpencil_paint.draw_color_selector(context, layout)
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def box(*, draw_settings):
+ return dict(
+ text="Box",
+ icon="ops.gpencil.primitive_box",
+ widget=None,
+ keymap=(
+ ("gpencil.primitive",
+ dict(type='BOX', wait_for_input=False),
+ dict(type='EVT_TWEAK_A', value='ANY')),
+ ),
+ draw_settings=draw_settings,
+ )
- @staticmethod
- def generate_from_brushes(context):
- return generate_from_brushes_ex(
- context,
- icon_prefix="brush.gpencil.",
- brush_test_attr="use_paint_grease_pencil",
- brush_category_attr="grease_pencil_tool",
- brush_category_layout=(
- ('PENCIL',),
- ('PEN',),
- ('INK',),
- ('INKNOISE',),
- ('BLOCK',),
- ('MARKER',),
- ('FILL',),
- ('SOFT',),
- ('HARD',),
- ('STROKE',),
- )
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def circle(*, draw_settings):
+ return dict(
+ text="Circle",
+ icon="ops.gpencil.primitive_circle",
+ widget=None,
+ keymap=(
+ ("gpencil.primitive",
+ dict(type='CIRCLE', wait_for_input=False),
+ dict(type='EVT_TWEAK_A', value='ANY')),
+ ),
+ draw_settings=draw_settings,
)
@@ -1280,14 +1315,40 @@ class _defs_gpencil_edit:
)
@ToolDef.from_fn
- def mirror():
+ def box_select():
return dict(
- text="Mirror",
- icon="ops.gpencil.edit_mirror",
+ text="Select Box",
+ icon="ops.generic.select_box",
widget=None,
keymap=(
- ("transform.mirror",
- dict(release_confirm=True),
+ ("gpencil.select_box",
+ dict(),
+ dict(type='EVT_TWEAK_A', value='ANY')),
+ ),
+ )
+
+ @ToolDef.from_fn
+ def circle_select():
+ return dict(
+ text="Select Circle",
+ icon="ops.generic.select_circle",
+ widget=None,
+ keymap=(
+ ("gpencil.select_circle",
+ dict(),
+ dict(type='EVT_TWEAK_A', value='ANY')),
+ ),
+ )
+
+ @ToolDef.from_fn
+ def lasso_select():
+ return dict(
+ text="Select Lasso",
+ icon="ops.generic.select_lasso",
+ widget=None,
+ keymap=(
+ ("gpencil.select_lasso",
+ dict(),
dict(type='EVT_TWEAK_A', value='ANY')),
),
)
@@ -1309,7 +1370,7 @@ class _defs_gpencil_edit:
def tosphere():
return dict(
text="To Sphere",
- icon="ops.gpencil.edit_to_sphere",
+ icon="ops.transform.tosphere",
widget=None,
keymap=(
("transform.tosphere",
@@ -1320,12 +1381,13 @@ class _defs_gpencil_edit:
class _defs_gpencil_sculpt:
- @staticmethod
+
def draw_settings_common(context, layout, tool):
ob = context.active_object
if ob and ob.mode == 'GPENCIL_SCULPT':
- ts = context.tool_settings
- settings = ts.gpencil_sculpt
+ tool_settings = context.tool_settings
+ settings = tool_settings.gpencil_sculpt
+ tool = settings.tool
brush = settings.brush
layout.prop(brush, "size", slider=True)
@@ -1333,14 +1395,13 @@ class _defs_gpencil_sculpt:
row = layout.row(align=True)
row.prop(brush, "strength", slider=True)
row.prop(brush, "use_pressure_strength", text="")
- row.separator()
- row.prop(ts.gpencil_sculpt, "use_select_mask", text="")
- @ToolDef.from_fn
- def smooth():
- def draw_settings(context, layout, tool):
- _defs_gpencil_sculpt.draw_settings_common(context, layout, tool)
+ if tool in {'THICKNESS', 'STRENGTH', 'PINCH', 'TWIST'}:
+ row.separator()
+ row.prop(brush, "direction", expand=True, text="")
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def smooth(*, draw_settings):
return dict(
text="Smooth",
icon="ops.gpencil.sculpt_smooth",
@@ -1353,11 +1414,8 @@ class _defs_gpencil_sculpt:
draw_settings=draw_settings,
)
- @ToolDef.from_fn
- def thickness():
- def draw_settings(context, layout, tool):
- _defs_gpencil_sculpt.draw_settings_common(context, layout, tool)
-
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def thickness(*, draw_settings):
return dict(
text="Thickness",
icon="ops.gpencil.sculpt_thickness",
@@ -1370,11 +1428,8 @@ class _defs_gpencil_sculpt:
draw_settings=draw_settings,
)
- @ToolDef.from_fn
- def strength():
- def draw_settings(context, layout, tool):
- _defs_gpencil_sculpt.draw_settings_common(context, layout, tool)
-
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def strength(*, draw_settings):
return dict(
text="Strength",
icon="ops.gpencil.sculpt_strength",
@@ -1387,11 +1442,8 @@ class _defs_gpencil_sculpt:
draw_settings=draw_settings,
)
- @ToolDef.from_fn
- def grab():
- def draw_settings(context, layout, tool):
- _defs_gpencil_sculpt.draw_settings_common(context, layout, tool)
-
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def grab(*, draw_settings):
return dict(
text="Grab",
icon="ops.gpencil.sculpt_grab",
@@ -1404,11 +1456,8 @@ class _defs_gpencil_sculpt:
draw_settings=draw_settings,
)
- @ToolDef.from_fn
- def push():
- def draw_settings(context, layout, tool):
- _defs_gpencil_sculpt.draw_settings_common(context, layout, tool)
-
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def push(*, draw_settings):
return dict(
text="Push",
icon="ops.gpencil.sculpt_push",
@@ -1421,11 +1470,8 @@ class _defs_gpencil_sculpt:
draw_settings=draw_settings,
)
- @ToolDef.from_fn
- def twist():
- def draw_settings(context, layout, tool):
- _defs_gpencil_sculpt.draw_settings_common(context, layout, tool)
-
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def twist(*, draw_settings):
return dict(
text="Twist",
icon="ops.gpencil.sculpt_twist",
@@ -1438,11 +1484,8 @@ class _defs_gpencil_sculpt:
draw_settings=draw_settings,
)
- @ToolDef.from_fn
- def pinch():
- def draw_settings(context, layout, tool):
- _defs_gpencil_sculpt.draw_settings_common(context, layout, tool)
-
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def pinch(*, draw_settings):
return dict(
text="Pinch",
icon="ops.gpencil.sculpt_pinch",
@@ -1455,11 +1498,8 @@ class _defs_gpencil_sculpt:
draw_settings=draw_settings,
)
- @ToolDef.from_fn
- def randomize():
- def draw_settings(context, layout, tool):
- _defs_gpencil_sculpt.draw_settings_common(context, layout, tool)
-
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def randomize(*, draw_settings):
return dict(
text="Randomize",
icon="ops.gpencil.sculpt_randomize",
@@ -1472,11 +1512,8 @@ class _defs_gpencil_sculpt:
draw_settings=draw_settings,
)
- @ToolDef.from_fn
- def clone():
- def draw_settings(context, layout, tool):
- _defs_gpencil_sculpt.draw_settings_common(context, layout, tool)
-
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def clone(*, draw_settings):
return dict(
text="Clone",
icon="ops.gpencil.sculpt_clone",
@@ -1491,7 +1528,7 @@ class _defs_gpencil_sculpt:
class _defs_gpencil_weight:
- @staticmethod
+
def draw_settings_common(context, layout, tool):
ob = context.active_object
if ob and ob.mode == 'GPENCIL_WEIGHT':
@@ -1504,11 +1541,8 @@ class _defs_gpencil_weight:
row.prop(brush, "strength", slider=True)
row.prop(brush, "use_pressure_strength", text="")
- @ToolDef.from_fn
- def paint():
- def draw_settings(context, layout, tool):
- _defs_gpencil_weight.draw_settings_common(context, layout, tool)
-
+ @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
+ def paint(*, draw_settings):
return dict(
text="Draw",
icon="ops.gpencil.sculpt_weight",
@@ -1522,10 +1556,51 @@ class _defs_gpencil_weight:
)
+class TOPBAR_PT_gpencil_materials(Panel):
+ bl_space_type = 'VIEW_3D'
+ bl_region_type = 'HEADER'
+ bl_label = "Materials"
+ bl_ui_units_x = 14
+
+ @classmethod
+ def poll(cls, context):
+ ob = context.object
+ return ob and ob.type == 'GPENCIL'
+
+ @staticmethod
+ def draw(self, context):
+ layout = self.layout
+ ob = context.object
+
+ if ob:
+ is_sortable = len(ob.material_slots) > 1
+ rows = 1
+ if (is_sortable):
+ rows = 10
+
+ row = layout.row()
+
+ row.template_list("GPENCIL_UL_matslots", "", ob, "material_slots", ob, "active_material_index", rows=rows)
+
+ col = row.column(align=True)
+ col.menu("GPENCIL_MT_color_specials", icon='DOWNARROW_HLT', text="")
+
+ if is_sortable:
+ col.separator()
+
+ col.operator("object.material_slot_move", icon='TRIA_UP', text="").direction = 'UP'
+ col.operator("object.material_slot_move", icon='TRIA_DOWN', text="").direction = 'DOWN'
+
+ col.separator()
+
+ sub = col.column(align=True)
+ sub.operator("gpencil.color_isolate", icon='LOCKED', text="").affect_visibility = False
+ sub.operator("gpencil.color_isolate", icon='HIDE_OFF', text="").affect_visibility = True
+
+
class IMAGE_PT_tools_active(ToolSelectPanelHelper, Panel):
bl_space_type = 'IMAGE_EDITOR'
bl_region_type = 'TOOLS'
- bl_category = "Tools"
bl_label = "Tools" # not visible
bl_options = {'HIDE_HEADER'}
@@ -1551,11 +1626,15 @@ class IMAGE_PT_tools_active(ToolSelectPanelHelper, Panel):
yield from cls._tools.items()
# for reuse
+ _tools_transform = (
+ _defs_image_uv_transform.transform,
+ )
+
_tools_select = (
(
- _defs_uv_select.border,
- _defs_uv_select.circle,
- _defs_uv_select.lasso,
+ _defs_image_uv_select.border,
+ _defs_image_uv_select.circle,
+ _defs_image_uv_select.lasso,
),
)
@@ -1573,8 +1652,20 @@ class IMAGE_PT_tools_active(ToolSelectPanelHelper, Panel):
# for all modes
],
'VIEW': [
+ ],
+ 'UV': [
+ _defs_image_generic.cursor,
*_tools_select,
+ None,
+ *_tools_transform,
+ None,
*_tools_annotate,
+ None,
+ lambda context: (
+ _defs_image_uv_sculpt.generate_from_brushes(context)
+ if _defs_image_generic.poll_uvedit(context)
+ else ()
+ ),
],
'MASK': [
None,
@@ -1588,7 +1679,6 @@ class IMAGE_PT_tools_active(ToolSelectPanelHelper, Panel):
class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'TOOLS'
- bl_category = "Tools"
bl_label = "Tools" # not visible
bl_options = {'HIDE_HEADER'}
@@ -1639,6 +1729,14 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
_defs_view3d_generic.ruler,
)
+ _tools_gpencil_select = (
+ (
+ _defs_gpencil_edit.box_select,
+ _defs_gpencil_edit.circle_select,
+ _defs_gpencil_edit.lasso_select,
+ ),
+ )
+
_tools = {
None: [
# Don't use this! because of paint modes.
@@ -1790,20 +1888,27 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
_defs_weight_paint.gradient,
],
'GPENCIL_PAINT': [
+ _defs_view3d_generic.cursor,
+ None,
_defs_gpencil_paint.generate_from_brushes,
+ None,
+ _defs_gpencil_paint.line,
+ _defs_gpencil_paint.box,
+ _defs_gpencil_paint.circle,
],
'GPENCIL_EDIT': [
_defs_view3d_generic.cursor,
- *_tools_select,
+ *_tools_gpencil_select,
None,
*_tools_transform,
None,
_defs_gpencil_edit.bend,
- _defs_gpencil_edit.mirror,
_defs_gpencil_edit.shear,
_defs_gpencil_edit.tosphere,
],
'GPENCIL_SCULPT': [
+ *_tools_gpencil_select,
+ None,
_defs_gpencil_sculpt.smooth,
_defs_gpencil_sculpt.thickness,
_defs_gpencil_sculpt.strength,
@@ -1820,9 +1925,18 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
}
+class TOPBAR_PT_annotation_layers(Panel, AnnotationDataPanel):
+ bl_space_type = 'VIEW_3D'
+ bl_region_type = 'HEADER'
+ bl_label = "Layers"
+ bl_ui_units_x = 14
+
+
classes = (
IMAGE_PT_tools_active,
VIEW3D_PT_tools_active,
+ TOPBAR_PT_gpencil_materials,
+ TOPBAR_PT_annotation_layers,
)
if __name__ == "__main__": # only for live edit.
diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py
index ea120a0e1fb..ac6bd4002ca 100644
--- a/release/scripts/startup/bl_ui/space_topbar.py
+++ b/release/scripts/startup/bl_ui/space_topbar.py
@@ -19,6 +19,9 @@
# <pep8 compliant>
import bpy
from bpy.types import Header, Menu, Panel
+from .properties_grease_pencil_common import (
+ GPENCIL_UL_layer,
+)
class TOPBAR_HT_upper_bar(Header):
@@ -47,7 +50,7 @@ class TOPBAR_HT_upper_bar(Header):
if not screen.show_fullscreen:
layout.template_ID_tabs(
window, "workspace",
- new="workspace.add_menu",
+ new="workspace.add",
menu="TOPBAR_MT_workspace_menu",
)
else:
@@ -61,8 +64,14 @@ class TOPBAR_HT_upper_bar(Header):
layout = self.layout
window = context.window
+ screen = context.screen
scene = window.scene
+ # If statusbar is hidden, still show messages at the top
+ if not screen.show_statusbar:
+ layout.template_reports_banner()
+ layout.template_running_jobs()
+
# Active workspace view-layer is retrieved through window, not through workspace.
layout.template_ID(window, "scene", new="scene.new", unlink="scene.delete")
@@ -79,7 +88,6 @@ class TOPBAR_HT_lower_bar(Header):
bl_region_type = 'WINDOW'
def draw(self, context):
- layout = self.layout
region = context.region
if region.alignment == 'LEFT':
@@ -91,12 +99,13 @@ class TOPBAR_HT_lower_bar(Header):
def draw_left(self, context):
layout = self.layout
- mode = context.mode
# Active Tool
# -----------
from .space_toolsystem_common import ToolSelectPanelHelper
tool = ToolSelectPanelHelper.draw_active_tool_header(context, layout)
+ tool_space_type = 'VIEW_3D' if tool is None else tool.space_type
+ tool_mode = context.mode if tool is None else tool.mode
# Object Mode Options
# -------------------
@@ -105,38 +114,50 @@ class TOPBAR_HT_lower_bar(Header):
# TODO(campbell): editing options should be after active tool options
# (obviously separated for from the users POV)
- draw_fn = getattr(_draw_left_context_mode, mode, None)
+ draw_fn = getattr(getattr(_draw_left_context_mode, tool_space_type, None), tool_mode, None)
if draw_fn is not None:
draw_fn(context, layout, tool)
- # Note: general mode options should be added to 'draw_right'.
- if mode == 'SCULPT':
- if tool.has_datablock:
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".paint_common", category="")
- elif mode == 'PAINT_VERTEX':
- if tool.has_datablock:
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".paint_common", category="")
- elif mode == 'PAINT_WEIGHT':
- if tool.has_datablock:
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".paint_common", category="")
- elif mode == 'PAINT_TEXTURE':
- if tool.has_datablock:
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".paint_common", category="")
- elif mode == 'EDIT_ARMATURE':
- pass
- elif mode == 'EDIT_CURVE':
- pass
- elif mode == 'EDIT_MESH':
- pass
- elif mode == 'POSE':
- pass
- elif mode == 'PARTICLE':
- # Disable, only shows "Brush" panel, which is already in the top-bar.
- # if tool.has_datablock:
- # layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".paint_common", category="")
- pass
- elif mode == 'GPENCIL_PAINT':
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".greasepencil_paint", category="")
+ if tool_space_type == 'VIEW_3D':
+ # Note: general mode options should be added to 'draw_right'.
+ if tool_mode == 'SCULPT':
+ if (tool is not None) and tool.has_datablock:
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".paint_common", category="")
+ elif tool_mode == 'PAINT_VERTEX':
+ if (tool is not None) and tool.has_datablock:
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".paint_common", category="")
+ elif tool_mode == 'PAINT_WEIGHT':
+ if (tool is not None) and tool.has_datablock:
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".paint_common", category="")
+ elif tool_mode == 'PAINT_TEXTURE':
+ if (tool is not None) and tool.has_datablock:
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".paint_common", category="")
+ elif tool_mode == 'EDIT_ARMATURE':
+ pass
+ elif tool_mode == 'EDIT_CURVE':
+ pass
+ elif tool_mode == 'EDIT_MESH':
+ pass
+ elif tool_mode == 'POSE':
+ pass
+ elif tool_mode == 'PARTICLE':
+ # Disable, only shows "Brush" panel, which is already in the top-bar.
+ # if tool.has_datablock:
+ # layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".paint_common", category="")
+ pass
+ elif tool_mode == 'GPENCIL_PAINT':
+ if (tool is not None) and tool.has_datablock:
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".greasepencil_paint", category="")
+ elif tool_mode == 'GPENCIL_SCULPT':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".greasepencil_sculpt", category="")
+ elif tool_mode == 'GPENCIL_WEIGHT':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".greasepencil_weight", category="")
+ elif tool_space_type == 'IMAGE_EDITOR':
+ if tool_mode == 'PAINT':
+ if (tool is not None) and tool.has_datablock:
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".paint_common_2d", category="")
+ elif context.uv_sculpt_object is not None:
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".uv_sculpt", category="")
def draw_center(self, context):
pass
@@ -144,123 +165,341 @@ class TOPBAR_HT_lower_bar(Header):
def draw_right(self, context):
layout = self.layout
- # General options, note, these _could_ display at the RHS of the draw_left callback.
- # we just want them not to be confused with tool options.
- mode = context.mode
-
- if mode == 'SCULPT':
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".sculpt_mode", category="")
- elif mode == 'PAINT_VERTEX':
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".vertexpaint", category="")
- elif mode == 'PAINT_WEIGHT':
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".weightpaint", category="")
- elif mode == 'PAINT_TEXTURE':
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".imagepaint", category="")
- elif mode == 'EDIT_TEXT':
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".text_edit", category="")
- elif mode == 'EDIT_ARMATURE':
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".armature_edit", category="")
- elif mode == 'EDIT_METABALL':
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".mball_edit", category="")
- elif mode == 'EDIT_LATTICE':
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".lattice_edit", category="")
- elif mode == 'EDIT_CURVE':
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".curve_edit", category="")
- elif mode == 'EDIT_MESH':
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".mesh_edit", category="")
- elif mode == 'POSE':
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".posemode", category="")
- elif mode == 'PARTICLE':
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".particlemode", category="")
- elif mode == 'OBJECT':
- layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".objectmode", category="")
- elif mode == 'GPENCIL_PAINT':
- layout.prop(context.tool_settings, "gpencil_stroke_placement_view3d", text='')
- if context.tool_settings.gpencil_stroke_placement_view3d in ('ORIGIN', 'CURSOR'):
- layout.prop(context.tool_settings.gpencil_sculpt, "lockaxis", text='')
- layout.prop(context.tool_settings, "use_gpencil_draw_onback", text="", icon='ORTHO')
- layout.prop(context.tool_settings, "add_gpencil_weight_data", text="", icon='WPAINT_HLT')
- layout.prop(context.tool_settings, "use_gpencil_additive_drawing", text="", icon='FREEZE')
-
- elif mode == 'GPENCIL_SCULPT':
- layout.prop(context.tool_settings.gpencil_sculpt, "lockaxis", text='')
+ # Active Tool
+ # -----------
+ from .space_toolsystem_common import ToolSelectPanelHelper
+ tool = ToolSelectPanelHelper.tool_active_from_context(context)
+ tool_space_type = 'VIEW_3D' if tool is None else tool.space_type
+ tool_mode = context.mode if tool is None else tool.mode
+
+ if tool_space_type == 'VIEW_3D':
+ if tool_mode == 'SCULPT':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".sculpt_mode", category="")
+ elif tool_mode == 'PAINT_VERTEX':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".vertexpaint", category="")
+ elif tool_mode == 'PAINT_WEIGHT':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".weightpaint", category="")
+ elif tool_mode == 'PAINT_TEXTURE':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".imagepaint", category="")
+ elif tool_mode == 'EDIT_TEXT':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".text_edit", category="")
+ elif tool_mode == 'EDIT_ARMATURE':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".armature_edit", category="")
+ elif tool_mode == 'EDIT_METABALL':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".mball_edit", category="")
+ elif tool_mode == 'EDIT_LATTICE':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".lattice_edit", category="")
+ elif tool_mode == 'EDIT_CURVE':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".curve_edit", category="")
+ elif tool_mode == 'EDIT_MESH':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".mesh_edit", category="")
+ elif tool_mode == 'POSE':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".posemode", category="")
+ elif tool_mode == 'PARTICLE':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".particlemode", category="")
+ elif tool_mode == 'OBJECT':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".objectmode", category="")
+ elif tool_mode in {'GPENCIL_PAINT', 'GPENCIL_EDIT', 'GPENCIL_SCULPT', 'GPENCIL_WEIGHT'}:
+ # Grease pencil layer.
+ gpl = context.active_gpencil_layer
+ if gpl and gpl.info is not None:
+ text = gpl.info
+ maxw = 25
+ if len(text) > maxw:
+ text = text[:maxw - 5] + '..' + text[-3:]
+ else:
+ text = ""
+
+ layout.label(text="Layer:")
+ sub = layout.row()
+ sub.ui_units_x = 8
+ sub.popover(
+ panel="TOPBAR_PT_gpencil_layers",
+ text=text,
+ )
+ elif tool_space_type == 'IMAGE_EDITOR':
+ if tool_mode == 'PAINT':
+ layout.popover_group(space_type='PROPERTIES', region_type='WINDOW', context=".imagepaint_2d", category="")
class _draw_left_context_mode:
+ class VIEW_3D:
+ @staticmethod
+ def SCULPT(context, layout, tool):
+ if (tool is None) or (not tool.has_datablock):
+ return
+
+ paint = context.tool_settings.sculpt
+ layout.template_ID_preview(paint, "brush", rows=3, cols=8, hide_buttons=True)
+
+ brush = paint.brush
+ if brush is None:
+ return
+
+ from .properties_paint_common import UnifiedPaintPanel
+
+ UnifiedPaintPanel.prop_unified_size(layout, context, brush, "size", slider=True, text="Radius")
+ UnifiedPaintPanel.prop_unified_strength(layout, context, brush, "strength", slider=True, text="Strength")
+ layout.prop(brush, "direction", text="", expand=True)
+
+ @staticmethod
+ def PAINT_TEXTURE(context, layout, tool):
+ if (tool is None) or (not tool.has_datablock):
+ return
+
+ paint = context.tool_settings.image_paint
+ layout.template_ID_preview(paint, "brush", rows=3, cols=8, hide_buttons=True)
+
+ brush = paint.brush
+ if brush is None:
+ return
+
+ from .properties_paint_common import UnifiedPaintPanel
+
+ UnifiedPaintPanel.prop_unified_color(layout, context, brush, "color", text="")
+ UnifiedPaintPanel.prop_unified_size(layout, context, brush, "size", slider=True, text="Radius")
+ UnifiedPaintPanel.prop_unified_strength(layout, context, brush, "strength", slider=True, text="Strength")
+
+ @staticmethod
+ def PAINT_VERTEX(context, layout, tool):
+ if (tool is None) or (not tool.has_datablock):
+ return
+
+ paint = context.tool_settings.vertex_paint
+ layout.template_ID_preview(paint, "brush", rows=3, cols=8, hide_buttons=True)
+
+ brush = paint.brush
+ if brush is None:
+ return
+
+ from .properties_paint_common import UnifiedPaintPanel
+
+ UnifiedPaintPanel.prop_unified_color(layout, context, brush, "color", text="")
+ UnifiedPaintPanel.prop_unified_size(layout, context, brush, "size", slider=True, text="Radius")
+ UnifiedPaintPanel.prop_unified_strength(layout, context, brush, "strength", slider=True, text="Strength")
+
+ @staticmethod
+ def PAINT_WEIGHT(context, layout, tool):
+ if (tool is None) or (not tool.has_datablock):
+ return
+
+ paint = context.tool_settings.weight_paint
+ layout.template_ID_preview(paint, "brush", rows=3, cols=8, hide_buttons=True)
+ brush = paint.brush
+ if brush is None:
+ return
+
+ from .properties_paint_common import UnifiedPaintPanel
+
+ UnifiedPaintPanel.prop_unified_weight(layout, context, brush, "weight", slider=True, text="Weight")
+ UnifiedPaintPanel.prop_unified_size(layout, context, brush, "size", slider=True, text="Radius")
+ UnifiedPaintPanel.prop_unified_strength(layout, context, brush, "strength", slider=True, text="Strength")
+
+ @staticmethod
+ def GPENCIL_PAINT(context, layout, tool):
+
+ if (tool is None) or (not tool.has_datablock):
+ return
+
+ paint = context.tool_settings.gpencil_paint
+ brush = paint.brush
+ if brush is None:
+ return
+
+ gp_settings = brush.gpencil_settings
+
+ def draw_color_selector():
+ ma = gp_settings.material
+ row = layout.row(align=True)
+
+ icon_id = 0
+ if ma:
+ icon_id = ma.id_data.preview.icon_id
+ txt_ma = ma.name
+ maxw = 25
+ if len(txt_ma) > maxw:
+ txt_ma = txt_ma[:maxw - 5] + '..' + txt_ma[-3:]
+ else:
+ txt_ma = ""
+
+ row.label(text="Material:")
+ sub = row.row()
+ sub.ui_units_x = 8
+ sub.popover(
+ panel="TOPBAR_PT_gpencil_materials",
+ text=txt_ma,
+ icon_value=icon_id,
+ )
+
+ row.prop(gp_settings, "use_material_pin", text="")
+
+ row = layout.row(align=True)
+ ts = context.scene.tool_settings
+ settings = ts.gpencil_paint
+ row.template_ID_preview(settings, "brush", rows=3, cols=8, hide_buttons=True)
+
+ if brush.gpencil_tool == 'ERASE':
+ row = layout.row(align=True)
+ row.prop(brush, "size", text="Radius")
+ row.prop(gp_settings, "use_pressure", text="", icon='STYLUS_PRESSURE')
+ if gp_settings.eraser_mode == 'SOFT':
+ row = layout.row(align=True)
+ row.prop(gp_settings, "pen_strength", slider=True)
+ row.prop(gp_settings, "use_strength_pressure", text="", icon='STYLUS_PRESSURE')
+ elif brush.gpencil_tool == 'FILL':
+ row = layout.row()
+ row.prop(gp_settings, "fill_leak", text="Leak Size")
+ row.prop(brush, "size", text="Thickness")
+ row.prop(gp_settings, "fill_simplify_level", text="Simplify")
+
+ draw_color_selector()
+
+ row = layout.row(align=True)
+ row.prop(gp_settings, "fill_draw_mode", text="")
+ row.prop(gp_settings, "show_fill_boundary", text="", icon='GRID')
+
+ else: # bgpsettings.tool == 'DRAW':
+ row = layout.row(align=True)
+ row.prop(brush, "size", text="Radius")
+ row.prop(gp_settings, "use_pressure", text="", icon='STYLUS_PRESSURE')
+ row = layout.row(align=True)
+ row.prop(gp_settings, "pen_strength", slider=True)
+ row.prop(gp_settings, "use_strength_pressure", text="", icon='STYLUS_PRESSURE')
+
+ draw_color_selector()
+
+ @staticmethod
+ def PARTICLE(context, layout, tool):
+ # See: 'VIEW3D_PT_tools_brush', basically a duplicate
+ settings = context.tool_settings.particle_edit
+ brush = settings.brush
+ tool = settings.tool
+ if tool != 'NONE':
+ layout.prop(brush, "size", slider=True)
+ if tool == 'ADD':
+ layout.prop(brush, "count")
+
+ layout.prop(settings, "use_default_interpolate")
+ layout.prop(brush, "steps", slider=True)
+ layout.prop(settings, "default_key_count", slider=True)
+ else:
+ layout.prop(brush, "strength", slider=True)
+
+ if tool == 'LENGTH':
+ layout.row().prop(brush, "length_mode", expand=True)
+ elif tool == 'PUFF':
+ layout.row().prop(brush, "puff_mode", expand=True)
+ layout.prop(brush, "use_puff_volume")
+ elif tool == 'COMB':
+ # Note: actually in 'Options' panel,
+ # disabled when used in popover.
+ row = layout.row()
+ row.active = settings.is_editable
+ row.prop(settings, "use_emitter_deflect", text="Deflect Emitter")
+ sub = row.row(align=True)
+ sub.active = settings.use_emitter_deflect
+ sub.prop(settings, "emitter_distance", text="Distance")
+
+ class IMAGE_EDITOR:
+ @staticmethod
+ def VIEW(context, layout, tool):
+ tool_settings = context.tool_settings
+ if tool_settings.use_uv_sculpt:
+ if context.mode == 'EDIT_MESH':
+ uv_sculpt = tool_settings.uv_sculpt
+ brush = uv_sculpt.brush
+ if brush:
+ from .properties_paint_common import UnifiedPaintPanel
+
+ row = layout.row(align=True)
+ UnifiedPaintPanel.prop_unified_size(row, context, brush, "size", slider=True, text="Radius")
+ UnifiedPaintPanel.prop_unified_size(row, context, brush, "use_pressure_size")
+
+ row = layout.row(align=True)
+ UnifiedPaintPanel.prop_unified_strength(row, context, brush, "strength", slider=True, text="Strength")
+ UnifiedPaintPanel.prop_unified_strength(row, context, brush, "use_pressure_strength")
+
+ @staticmethod
+ def PAINT(context, layout, tool):
+ if (tool is None) or (not tool.has_datablock):
+ return
+
+ paint = context.tool_settings.image_paint
+ layout.template_ID_preview(paint, "brush", rows=3, cols=8, hide_buttons=True)
+
+ brush = paint.brush
+ if brush is None:
+ return
+
+ from .properties_paint_common import UnifiedPaintPanel
+
+ UnifiedPaintPanel.prop_unified_color(layout, context, brush, "color", text="")
+ UnifiedPaintPanel.prop_unified_size(layout, context, brush, "size", slider=True, text="Radius")
+ UnifiedPaintPanel.prop_unified_strength(layout, context, brush, "strength", slider=True, text="Strength")
+
+
+class TOPBAR_PT_gpencil_layers(Panel):
+ bl_space_type = 'VIEW_3D'
+ bl_region_type = 'HEADER'
+ bl_label = "Layers"
+ bl_ui_units_x = 14
+
+ @classmethod
+ def poll(cls, context):
+ if context.gpencil_data is None:
+ return False
+
+ ob = context.object
+ if ob is not None and ob.type == 'GPENCIL':
+ return True
+
+ return False
+
@staticmethod
- def SCULPT(context, layout, tool):
- if not tool.has_datablock:
- return
- brush = context.tool_settings.sculpt.brush
- if brush is None:
- return
-
- from .properties_paint_common import UnifiedPaintPanel
-
- UnifiedPaintPanel.prop_unified_size(layout, context, brush, "size", slider=True, text="Radius")
- UnifiedPaintPanel.prop_unified_strength(layout, context, brush, "strength", slider=True, text="Strength")
- layout.prop(brush, "direction", text="", expand=True)
-
- def PAINT_TEXTURE(context, layout, tool):
- if not tool.has_datablock:
- return
- brush = context.tool_settings.vertex_paint.brush
- if brush is None:
- return
-
- from .properties_paint_common import UnifiedPaintPanel
-
- layout.prop(brush, "color", text="")
- UnifiedPaintPanel.prop_unified_size(layout, context, brush, "size", slider=True, text="Radius")
- UnifiedPaintPanel.prop_unified_strength(layout, context, brush, "strength", slider=True, text="Strength")
-
- def PAINT_VERTEX(context, layout, tool):
- if not tool.has_datablock:
- return
- brush = context.tool_settings.vertex_paint.brush
- if brush is None:
- return
-
- from .properties_paint_common import UnifiedPaintPanel
-
- layout.prop(brush, "color", text="")
- UnifiedPaintPanel.prop_unified_size(layout, context, brush, "size", slider=True, text="Radius")
- UnifiedPaintPanel.prop_unified_strength(layout, context, brush, "strength", slider=True, text="Strength")
-
- def PAINT_WEIGHT(context, layout, tool):
- if not tool.has_datablock:
- return
- brush = context.tool_settings.weight_paint.brush
- if brush is None:
- return
-
- from .properties_paint_common import UnifiedPaintPanel
-
- UnifiedPaintPanel.prop_unified_weight(layout, context, brush, "weight", slider=True, text="Weight")
- UnifiedPaintPanel.prop_unified_size(layout, context, brush, "size", slider=True, text="Radius")
- UnifiedPaintPanel.prop_unified_strength(layout, context, brush, "strength", slider=True, text="Strength")
-
- def PARTICLE(context, layout, tool):
- # See: 'VIEW3D_PT_tools_brush', basically a duplicate
- settings = context.tool_settings.particle_edit
- brush = settings.brush
- tool = settings.tool
- if tool != 'NONE':
- layout.prop(brush, "size", slider=True)
- if tool == 'ADD':
- layout.prop(brush, "count")
-
- layout.prop(settings, "use_default_interpolate")
- layout.prop(brush, "steps", slider=True)
- layout.prop(settings, "default_key_count", slider=True)
- else:
- layout.prop(brush, "strength", slider=True)
-
- if tool == 'LENGTH':
- layout.row().prop(brush, "length_mode", expand=True)
- elif tool == 'PUFF':
- layout.row().prop(brush, "puff_mode", expand=True)
- layout.prop(brush, "use_puff_volume")
+ def draw(self, context):
+ layout = self.layout
+ gpd = context.gpencil_data
+
+ # Grease Pencil data...
+ if (gpd is None) or (not gpd.layers):
+ layout.operator("gpencil.layer_add", text="New Layer")
+ else:
+ self.draw_layers(context, layout, gpd)
+
+ def draw_layers(self, context, layout, gpd):
+ row = layout.row()
+
+ col = row.column()
+ layer_rows = 10
+ col.template_list("GPENCIL_UL_layer", "", gpd, "layers", gpd.layers, "active_index",
+ rows=layer_rows, reverse=True)
+
+ col = row.column()
+
+ sub = col.column(align=True)
+ sub.operator("gpencil.layer_add", icon='ADD', text="")
+ sub.operator("gpencil.layer_remove", icon='REMOVE', text="")
+
+ gpl = context.active_gpencil_layer
+ if gpl:
+ sub.menu("GPENCIL_MT_layer_specials", icon='DOWNARROW_HLT', text="")
+
+ if len(gpd.layers) > 1:
+ col.separator()
+
+ sub = col.column(align=True)
+ sub.operator("gpencil.layer_move", icon='TRIA_UP', text="").type = 'UP'
+ sub.operator("gpencil.layer_move", icon='TRIA_DOWN', text="").type = 'DOWN'
+
+ col.separator()
+
+ sub = col.column(align=True)
+ sub.operator("gpencil.layer_isolate", icon='LOCKED', text="").affect_visibility = False
+ sub.operator("gpencil.layer_isolate", icon='HIDE_OFF', text="").affect_visibility = True
+
+ row = layout.row(align=True)
+ if gpl:
+ row.prop(gpl, "opacity", text="Opacity", slider=True)
class TOPBAR_MT_editor_menus(Menu):
@@ -288,7 +527,7 @@ class TOPBAR_MT_file(Menu):
layout = self.layout
layout.operator_context = 'INVOKE_AREA'
- layout.operator("wm.read_homefile", text="New", icon='NEW')
+ layout.menu("TOPBAR_MT_file_new", text="New", icon='FILE_NEW')
layout.operator("wm.open_mainfile", text="Open...", icon='FILE_FOLDER')
layout.menu("TOPBAR_MT_file_open_recent")
layout.operator("wm.revert_mainfile")
@@ -306,10 +545,27 @@ class TOPBAR_MT_file(Menu):
layout.operator("wm.save_as_mainfile", text="Save Copy...").copy = True
layout.separator()
-
layout.operator_context = 'INVOKE_AREA'
- layout.operator("wm.save_homefile")
- layout.operator("wm.read_factory_settings")
+
+ if any(bpy.utils.app_template_paths()):
+ app_template = context.user_preferences.app_template
+ else:
+ app_template = None
+
+ if app_template:
+ layout.label(text=bpy.path.display_name(app_template))
+ layout.operator("wm.save_homefile")
+ layout.operator(
+ "wm.read_factory_settings",
+ text="Load Factory Settings",
+ ).app_template = app_template
+ else:
+ layout.operator("wm.save_homefile")
+ layout.operator("wm.read_factory_settings")
+
+ layout.separator()
+
+ layout.operator("wm.app_template_install", text="Install Application Template...")
layout.separator()
@@ -335,6 +591,75 @@ class TOPBAR_MT_file(Menu):
layout.operator("wm.quit_blender", text="Quit", icon='QUIT')
+class TOPBAR_MT_file_new(Menu):
+ bl_label = "New File"
+
+ @staticmethod
+ def app_template_paths():
+ import os
+
+ template_paths = bpy.utils.app_template_paths()
+
+ # expand template paths
+ app_templates = []
+ for path in template_paths:
+ for d in os.listdir(path):
+ if d.startswith(("__", ".")):
+ continue
+ template = os.path.join(path, d)
+ if os.path.isdir(template):
+ # template_paths_expand.append(template)
+ app_templates.append(d)
+
+ return sorted(app_templates)
+
+ def draw_ex(layout, context, *, use_splash=False, use_more=False):
+ layout.operator_context = 'EXEC_DEFAULT'
+
+ # Limit number of templates in splash screen, spill over into more menu.
+ paths = TOPBAR_MT_file_new.app_template_paths()
+ splash_limit = 5
+
+ if use_splash:
+ icon = 'FILE_NEW'
+ show_more = len(paths) > (splash_limit - 1)
+ if show_more:
+ paths = paths[:splash_limit - 2]
+ elif use_more:
+ icon = 'FILE_NEW'
+ paths = paths[splash_limit - 2:]
+ show_more = False
+ else:
+ icon = 'NONE'
+ show_more = False
+
+ # Draw application templates.
+ if not use_more:
+ props = layout.operator("wm.read_homefile", text="General", icon=icon)
+ props.app_template = ""
+
+ for d in paths:
+ props = layout.operator(
+ "wm.read_homefile",
+ text=bpy.path.display_name(d),
+ icon=icon,
+ )
+ props.app_template = d
+
+ if show_more:
+ layout.menu("TOPBAR_MT_templates_more", text="...")
+
+ def draw(self, context):
+ TOPBAR_MT_file_new.draw_ex(self.layout, context)
+
+
+class TOPBAR_MT_templates_more(Menu):
+ bl_label = "Templates"
+
+ def draw(self, context):
+ bpy.types.TOPBAR_MT_file_new.draw_ex(self.layout, context, use_more=True)
+
+
class TOPBAR_MT_file_import(Menu):
bl_idname = "TOPBAR_MT_file_import"
bl_label = "Import"
@@ -451,7 +776,7 @@ class TOPBAR_MT_edit(Menu):
layout.separator()
- layout.operator("wm.search_menu", text="Operator Search...")
+ layout.operator("wm.search_menu", text="Operator Search...", icon='VIEWZOOM')
layout.separator()
@@ -533,12 +858,23 @@ class TOPBAR_MT_help(Menu):
"wm.url_open", text="Blender Website", icon='URL',
).url = "https://www.blender.org"
layout.operator(
+ "wm.url_open", text="Release Notes", icon='URL',
+ ).url = "https://www.blender.org/download/releases/%d-%d/" % bpy.app.version[:2]
+ layout.operator(
+ "wm.url_open", text="Credits", icon='URL',
+ ).url = "https://www.blender.org/about/credits/"
+
+ layout.separator()
+
+ layout.operator(
"wm.url_open", text="Blender Store", icon='URL',
).url = "https://store.blender.org"
-
layout.operator(
- "wm.url_open", text="Release Notes", icon='URL',
- ).url = "https://www.blender.org/download/releases/%d-%d/" % bpy.app.version[:2]
+ "wm.url_open", text="Development Fund", icon='URL'
+ ).url = "https://fund.blender.org"
+ layout.operator(
+ "wm.url_open", text="Donate", icon='URL',
+ ).url = "https://www.blender.org/foundation/donation-payment/"
layout.separator()
@@ -563,7 +899,7 @@ class TOPBAR_MT_file_specials(Menu):
layout = self.layout
layout.operator_context = 'INVOKE_AREA'
- layout.operator("wm.read_homefile", text="New", icon='NEW')
+ layout.operator("wm.read_homefile", text="New", icon='FILE_NEW')
layout.operator("wm.open_mainfile", text="Open...", icon='FILE_FOLDER')
layout.separator()
@@ -590,9 +926,7 @@ class TOPBAR_MT_window_specials(Menu):
layout.operator_context = 'INVOKE_AREA'
- layout.operator("screen.area_dupli")
-
- layout.operator("wm.window_fullscreen_toggle", icon='FULLSCREEN_ENTER')
+ layout.operator("screen.area_dupli", icon='DUPLICATE')
layout.separator()
@@ -601,6 +935,10 @@ class TOPBAR_MT_window_specials(Menu):
layout.separator()
+ layout.operator("wm.window_fullscreen_toggle", icon='FULLSCREEN_ENTER')
+
+ layout.separator()
+
layout.operator("screen.userpref_show", text="User Preferences...", icon='PREFERENCES')
@@ -610,9 +948,14 @@ class TOPBAR_MT_workspace_menu(Menu):
def draw(self, context):
layout = self.layout
- layout.operator("workspace.duplicate", text="Duplicate")
+ layout.operator("workspace.duplicate", text="Duplicate", icon='DUPLICATE')
if len(bpy.data.workspaces) > 1:
- layout.operator("workspace.delete", text="Delete")
+ layout.operator("workspace.delete", text="Delete", icon='REMOVE')
+
+ layout.separator()
+
+ layout.operator("workspace.reorder_to_front", text="Reorder to Front", icon='TRIA_LEFT_BAR')
+ layout.operator("workspace.reorder_to_back", text="Reorder to Back", icon='TRIA_RIGHT_BAR')
class TOPBAR_PT_active_tool(Panel):
@@ -621,6 +964,7 @@ class TOPBAR_PT_active_tool(Panel):
bl_category = ""
bl_context = ".active_tool" # dot on purpose (access from tool settings)
bl_label = "Active Tool"
+ bl_options = {'HIDE_HEADER'}
def draw(self, context):
layout = self.layout
@@ -643,6 +987,8 @@ classes = (
TOPBAR_MT_workspace_menu,
TOPBAR_MT_editor_menus,
TOPBAR_MT_file,
+ TOPBAR_MT_file_new,
+ TOPBAR_MT_templates_more,
TOPBAR_MT_file_import,
TOPBAR_MT_file_export,
TOPBAR_MT_file_external_data,
@@ -652,6 +998,7 @@ classes = (
TOPBAR_MT_window,
TOPBAR_MT_help,
TOPBAR_PT_active_tool,
+ TOPBAR_PT_gpencil_layers,
)
if __name__ == "__main__": # only for live edit.
diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index a4d61f94fce..149206fc151 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -22,7 +22,6 @@ from bpy.types import (
Header,
Menu,
Panel,
- Operator,
)
from bpy.app.translations import pgettext_iface as iface_
from bpy.app.translations import contexts as i18n_contexts
@@ -39,25 +38,25 @@ class USERPREF_HT_header(Header):
userpref = context.user_preferences
- layout.operator_context = 'EXEC_AREA'
- layout.operator("wm.save_userpref")
-
- layout.operator_context = 'INVOKE_DEFAULT'
-
if userpref.active_section == 'INPUT':
- layout.operator("wm.keyconfig_import")
- layout.operator("wm.keyconfig_export")
+ layout.operator("wm.keyconfig_import", icon='IMPORT')
+ layout.operator("wm.keyconfig_export", icon='EXPORT')
elif userpref.active_section == 'ADDONS':
- layout.operator("wm.addon_install", icon='FILESEL')
+ layout.operator("wm.addon_install", icon='FILEBROWSER')
layout.operator("wm.addon_refresh", icon='FILE_REFRESH')
layout.menu("USERPREF_MT_addons_online_resources")
elif userpref.active_section == 'LIGHTS':
- layout.operator('wm.studiolight_install', text="Install MatCap").orientation = 'MATCAP'
- layout.operator('wm.studiolight_install', text="Install World HDRI").orientation = 'WORLD'
- layout.operator('wm.studiolight_install', text="Install Camera HDRI").orientation = 'CAMERA'
+ layout.operator('wm.studiolight_install', text="Add MatCap").orientation = 'MATCAP'
+ layout.operator('wm.studiolight_install', text="Add World HDRI").orientation = 'WORLD'
+ layout.operator('wm.studiolight_install', text="Add Camera HDRI").orientation = 'CAMERA'
elif userpref.active_section == 'THEMES':
- layout.operator("ui.reset_default_theme")
- layout.operator("wm.theme_install")
+ layout.operator("wm.theme_install", icon='FILEBROWSER')
+ layout.operator("ui.reset_default_theme", icon='LOOP_BACK')
+
+ layout.separator_spacer()
+
+ layout.operator_context = 'EXEC_AREA'
+ layout.operator("wm.save_userpref")
class USERPREF_PT_tabs(Panel):
@@ -81,62 +80,6 @@ class USERPREF_MT_interaction_presets(Menu):
draw = Menu.draw_preset
-class USERPREF_MT_app_templates(Menu):
- bl_label = "Application Templates"
- preset_subdir = "app_templates"
-
- def draw_ex(self, context, *, use_splash=False, use_default=False, use_install=False):
- import os
-
- layout = self.layout
-
- # now draw the presets
- layout.operator_context = 'EXEC_DEFAULT'
-
- if use_default:
- props = layout.operator("wm.read_homefile", text="Default")
- props.use_splash = True
- props.app_template = ""
- layout.separator()
-
- template_paths = bpy.utils.app_template_paths()
-
- # expand template paths
- app_templates = []
- for path in template_paths:
- for d in os.listdir(path):
- if d.startswith(("__", ".")):
- continue
- template = os.path.join(path, d)
- if os.path.isdir(template):
- # template_paths_expand.append(template)
- app_templates.append(d)
-
- for d in sorted(app_templates):
- props = layout.operator(
- "wm.read_homefile",
- text=bpy.path.display_name(d),
- )
- props.use_splash = True
- props.app_template = d
-
- if use_install:
- layout.separator()
- layout.operator_context = 'INVOKE_DEFAULT'
- props = layout.operator("wm.app_template_install")
-
- def draw(self, context):
- self.draw_ex(context, use_splash=False, use_default=True, use_install=True)
-
-
-class USERPREF_MT_templates_splash(Menu):
- bl_label = "Startup Templates"
- preset_subdir = "templates"
-
- def draw(self, context):
- USERPREF_MT_app_templates.draw_ex(self, context, use_splash=True, use_default=True)
-
-
class USERPREF_MT_appconfigs(Menu):
bl_label = "AppPresets"
preset_subdir = "keyconfig"
@@ -149,42 +92,6 @@ class USERPREF_MT_appconfigs(Menu):
Menu.draw_preset(self, context)
-class USERPREF_MT_splash(Menu):
- bl_label = "Splash"
-
- def draw(self, context):
- layout = self.layout
-
- split = layout.split()
- row = split.row()
-
- if any(bpy.utils.app_template_paths()):
- row.label(text="Template:")
- template = context.user_preferences.app_template
- row.menu(
- "USERPREF_MT_templates_splash",
- text=bpy.path.display_name(template) if template else "Default",
- )
- else:
- row.label(text="")
-
- row = split.row()
- row.label(text="Interaction:")
-
- text = bpy.path.display_name(context.window_manager.keyconfigs.active.name)
- if not text:
- text = "Blender (default)"
- row.menu("USERPREF_MT_appconfigs", text=text)
-
-
-# only for addons
-class USERPREF_MT_splash_footer(Menu):
- bl_label = ""
-
- def draw(self, context):
- pass
-
-
class USERPREF_PT_interface(Panel):
bl_space_type = 'USER_PREFERENCES'
bl_label = "Interface"
@@ -360,26 +267,26 @@ class USERPREF_PT_edit(Panel):
row.separator()
col = row.column()
- col.label(text="Annotations:")
- sub = col.row()
- sub.prop(edit, "grease_pencil_default_color", text="Default Color")
- col.prop(edit, "grease_pencil_eraser_radius", text="Eraser Radius")
- col.separator()
col.label(text="Grease Pencil/Annotations:")
col.separator()
col.prop(edit, "grease_pencil_manhattan_distance", text="Manhattan Distance")
col.prop(edit, "grease_pencil_euclidean_distance", text="Euclidean Distance")
col.separator()
+
+ col.label(text="Annotations:")
+ sub = col.row()
+ sub.prop(edit, "grease_pencil_default_color", text="Default Color")
+ col.prop(edit, "grease_pencil_eraser_radius", text="Eraser Radius")
+ col.separator()
col.prop(edit, "use_grease_pencil_simplify_stroke", text="Simplify Stroke")
col.separator()
+
col.separator()
col.separator()
col.separator()
col.label(text="Playback:")
col.prop(edit, "use_negative_frames")
col.separator()
- col.separator()
- col.separator()
col.label(text="Node Editor:")
col.prop(edit, "node_margin")
col.label(text="Animation Editors:")
@@ -597,6 +504,9 @@ class USERPREF_MT_interface_theme_presets(Menu):
)
draw = Menu.draw_preset
+ def reset_cb(context):
+ bpy.ops.ui.reset_default_theme()
+
class USERPREF_PT_theme(Panel):
bl_space_type = 'USER_PREFERENCES'
@@ -755,8 +665,8 @@ class USERPREF_PT_theme(Panel):
subrow = sub.row(align=True)
subrow.menu("USERPREF_MT_interface_theme_presets", text=USERPREF_MT_interface_theme_presets.bl_label)
- subrow.operator("wm.interface_theme_preset_add", text="", icon='ZOOMIN')
- subrow.operator("wm.interface_theme_preset_add", text="", icon='ZOOMOUT').remove_active = True
+ subrow.operator("wm.interface_theme_preset_add", text="", icon='ADD')
+ subrow.operator("wm.interface_theme_preset_add", text="", icon='REMOVE').remove_active = True
sub.separator()
sub.prop(theme, "theme_area", expand=True)
@@ -911,6 +821,30 @@ class USERPREF_PT_theme(Panel):
col.separator()
col.separator()
+
+ col.label(text="Icon Colors:")
+
+ row = col.row()
+
+ subsplit = row.split(factor=0.95)
+
+ padding = subsplit.split(factor=0.15)
+ colsub = padding.column()
+ colsub = padding.column()
+ colsub.row().prop(ui, "icon_collection")
+ colsub.row().prop(ui, "icon_object")
+ colsub.row().prop(ui, "icon_object_data")
+
+ subsplit = row.split(factor=0.85)
+
+ padding = subsplit.split(factor=0.15)
+ colsub = padding.column()
+ colsub = padding.column()
+ colsub.row().prop(ui, "icon_modifier")
+ colsub.row().prop(ui, "icon_shading")
+
+ col.separator()
+ col.separator()
elif theme.theme_area == 'BONE_COLOR_SETS':
col = split.column()
@@ -1021,7 +955,7 @@ class USERPREF_PT_file(Panel):
box = sub.box()
row = box.row()
row.label(text="Excluded Paths:")
- row.operator("wm.userpref_autoexec_path_add", text="", icon='ZOOMIN', emboss=False)
+ row.operator("wm.userpref_autoexec_path_add", text="", icon='ADD', emboss=False)
for i, path_cmp in enumerate(userpref.autoexec_paths):
row = box.row()
row.prop(path_cmp, "path", text="")
@@ -1121,11 +1055,6 @@ class USERPREF_MT_keyconfigs(Menu):
preset_operator = "wm.keyconfig_activate"
def draw(self, context):
- props = self.layout.operator("wm.context_set_value", text="Blender (default)")
- props.data_path = "window_manager.keyconfigs.active"
- props.value = "context.window_manager.keyconfigs.default"
-
- # now draw the presets
Menu.draw_preset(self, context)
@@ -1153,8 +1082,8 @@ class USERPREF_PT_input(Panel):
subrow = sub.row(align=True)
subrow.menu("USERPREF_MT_interaction_presets", text=bpy.types.USERPREF_MT_interaction_presets.bl_label)
- subrow.operator("wm.interaction_preset_add", text="", icon='ZOOMIN')
- subrow.operator("wm.interaction_preset_add", text="", icon='ZOOMOUT').remove_active = True
+ subrow.operator("wm.interaction_preset_add", text="", icon='ADD')
+ subrow.operator("wm.interaction_preset_add", text="", icon='REMOVE').remove_active = True
sub.separator()
sub.label(text="Mouse:")
@@ -1349,8 +1278,18 @@ class USERPREF_PT_addons(Panel):
userpref = context.user_preferences
used_ext = {ext.module for ext in userpref.addons}
- userpref_addons_folder = os.path.join(userpref.filepaths.script_directory, "addons")
- scripts_addons_folder = bpy.utils.user_resource('SCRIPTS', "addons")
+ addon_user_dirs = tuple(
+ p for p in (
+ os.path.join(userpref.filepaths.script_directory, "addons"),
+ bpy.utils.user_resource('SCRIPTS', "addons"),
+ )
+ if p
+ )
+
+ # Development option for 2.8x, don't show users bundled addons
+ # unless they have been updated for 2.8x.
+ # Developers can turn them on with '--debug'
+ show_official_27x_addons = bpy.app.debug
# collect the categories that can be filtered on
addons = [
@@ -1376,7 +1315,7 @@ class USERPREF_PT_addons(Panel):
row = box.row()
row.label(text="Multiple add-ons with the same name found!")
row.label(icon='ERROR')
- box.label(text="Please delete one of each pair:")
+ box.label(text="Delete one of each pair to resolve:")
for (addon_name, addon_file, addon_path) in addon_utils.error_duplicates:
box.separator()
sub_col = box.column(align=True)
@@ -1412,7 +1351,7 @@ class USERPREF_PT_addons(Panel):
(filter == info["category"]) or
(filter == "Enabled" and is_enabled) or
(filter == "Disabled" and not is_enabled) or
- (filter == "User" and (mod.__file__.startswith((scripts_addons_folder, userpref_addons_folder))))
+ (filter == "User" and (mod.__file__.startswith(addon_user_dirs)))
):
if search and search not in info["name"].lower():
if info["author"]:
@@ -1421,6 +1360,15 @@ class USERPREF_PT_addons(Panel):
else:
continue
+ # Skip 2.7x add-ons included with Blender, unless in debug mode.
+ is_addon_27x = info.get("blender", (0,)) < (2, 80)
+ if (
+ is_addon_27x and
+ (not show_official_27x_addons) and
+ (not mod.__file__.startswith(addon_user_dirs))
+ ):
+ continue
+
# Addon UI Code
col_box = col.column()
box = col_box.box()
@@ -1445,7 +1393,7 @@ class USERPREF_PT_addons(Panel):
# WARNING: 2.8x exception, may be removed
# use disabled state for old add-ons, chances are they are broken.
- if info.get("blender", (0,)) < (2, 80):
+ if is_addon_27x:
sub.label(text="upgrade to 2.8x required")
sub.label(icon='ERROR')
# Remove code above after 2.8x migration is complete.
@@ -1506,7 +1454,7 @@ class USERPREF_PT_addons(Panel):
"wm.addon_remove", text="Remove", icon='CANCEL',
).module = mod.__name__
- for i in range(4 - tot_row):
+ for _ in range(4 - tot_row):
split.separator()
# Show addon user preferences
@@ -1571,7 +1519,7 @@ class StudioLightPanelMixin():
userpref = context.user_preferences
lights = self._get_lights(userpref)
if lights:
- flow = layout.column_flow(4)
+ flow = layout.column_flow(columns=4)
for studio_light in lights:
self.draw_studio_light(flow, studio_light)
else:
@@ -1582,7 +1530,7 @@ class StudioLightPanelMixin():
row = box.row()
row.template_icon(layout.icon(studio_light), scale=6.0)
- op = row.operator('wm.studiolight_uninstall', text="", icon='ZOOMOUT')
+ op = row.operator('wm.studiolight_uninstall', text="", icon='REMOVE')
op.index = studio_light.index
box.label(text=studio_light.name)
@@ -1649,11 +1597,7 @@ classes = (
USERPREF_HT_header,
USERPREF_PT_tabs,
USERPREF_MT_interaction_presets,
- USERPREF_MT_templates_splash,
- USERPREF_MT_app_templates,
USERPREF_MT_appconfigs,
- USERPREF_MT_splash,
- USERPREF_MT_splash_footer,
USERPREF_PT_interface,
USERPREF_PT_edit,
USERPREF_PT_system,
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index e29619800ea..ae360788a36 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -43,54 +43,48 @@ class VIEW3D_HT_header(Header):
object_mode = 'OBJECT' if obj is None else obj.mode
act_mode_item = bpy.types.Object.bl_rna.properties["mode"].enum_items[object_mode]
- layout.operator_menu_enum("object.mode_set", "mode", text=act_mode_item.name, icon=act_mode_item.icon)
+
+ row.separator()
+
+ sub = row.row()
+ sub.ui_units_x = 5.5
+ sub.operator_menu_enum("object.mode_set", "mode", text=act_mode_item.name, icon=act_mode_item.icon)
del act_mode_item
layout.template_header_3D_mode()
# Contains buttons like Mode, Pivot, Layer, Mesh Select Mode...
- shading_type = view.shading.type
- shading_item = bpy.types.View3DShading.bl_rna.properties["type"].enum_items[shading_type]
-
if obj:
- # Set above:
- # object_mode = obj.mode
-
# Particle edit
if object_mode == 'PARTICLE_EDIT':
row = layout.row()
row.prop(tool_settings.particle_edit, "select_mode", text="", expand=True)
- # Occlude geometry
- if (
- (((shading.type not in {'SOLID', 'TEXTURED'}) or not shading.show_xray) and
- (object_mode == 'PARTICLE_EDIT' or (object_mode == 'EDIT' and obj.type == 'MESH'))) or
- (object_mode in {'WEIGHT_PAINT', 'VERTEX_PAINT'})
- ):
- row = layout.row()
- row.prop(view, "use_occlude_geometry", text="")
-
- # Pose
- if obj and object_mode == 'POSE':
- row = layout.row(align=True)
- row.operator("pose.copy", text="", icon='COPYDOWN')
- row.operator("pose.paste", text="", icon='PASTEDOWN').flipped = False
- row.operator("pose.paste", text="", icon='PASTEFLIPDOWN').flipped = True
-
# Grease Pencil
if obj and obj.type == 'GPENCIL' and context.gpencil_data:
gpd = context.gpencil_data
if gpd.is_stroke_paint_mode:
+ row = layout.row()
+ sub = row.row(align=True)
+ sub.prop(tool_settings, "use_gpencil_draw_onback", text="", icon='MOD_OPACITY')
+ sub.separator(factor=0.4)
+ sub.prop(tool_settings, "use_gpencil_weight_data_add", text="", icon='WPAINT_HLT')
+ sub.separator(factor=0.4)
+ sub.prop(tool_settings, "use_gpencil_draw_additive", text="", icon='FREEZE')
+
+ if gpd.use_stroke_edit_mode:
row = layout.row(align=True)
- row.popover(
- panel="VIEW3D_PT_tools_grease_pencil_shapes",
- text="Shapes"
- )
+ row.prop(tool_settings, "gpencil_selectmode", text="", expand=True)
if gpd.use_stroke_edit_mode or gpd.is_stroke_sculpt_mode or gpd.is_stroke_weight_mode:
row = layout.row(align=True)
- row.prop(gpd, "use_multiedit", text="", icon="FORCE_HARMONIC")
+
+ if gpd.is_stroke_sculpt_mode:
+ row.prop(tool_settings.gpencil_sculpt, "use_select_mask", text="")
+ row.separator()
+
+ row.prop(gpd, "use_multiedit", text="", icon='GP_MULTIFRAME_EDITING')
sub = row.row(align=True)
sub.active = gpd.use_multiedit
@@ -101,10 +95,6 @@ class VIEW3D_HT_header(Header):
if gpd.use_stroke_edit_mode:
row = layout.row(align=True)
- row.operator("gpencil.copy", text="", icon='COPYDOWN')
- row.operator("gpencil.paste", text="", icon='PASTEDOWN')
-
- row = layout.row(align=True)
row.prop(tool_settings.gpencil_sculpt, "use_select_mask", text="")
row.popover(
@@ -125,16 +115,18 @@ class VIEW3D_HT_header(Header):
current_orientation = scene.current_orientation
if not current_orientation:
- trans_orientation = \
- bpy.types.Scene.bl_rna.properties["transform_orientation"].enum_items[orientation]
+ trans_orientation = bpy.types.Scene.bl_rna.properties["transform_orientation"].enum_items[orientation]
trans_icon = getattr(trans_orientation, "icon", "BLANK1")
trans_name = getattr(trans_orientation, "name", "Orientation")
else:
- trans_icon = 'VISIBLE_IPO_OFF'
+ trans_icon = 'OBJECT_ORIGIN'
trans_name = getattr(current_orientation, "name", "Orientation")
row = layout.row(align=True)
- row.popover(
+
+ sub = row.row()
+ sub.ui_units_x = 4
+ sub.popover(
panel="VIEW3D_PT_transform_orientations",
text=trans_name,
icon=trans_icon,
@@ -160,13 +152,16 @@ class VIEW3D_HT_header(Header):
if show_snap:
snap_items = bpy.types.ToolSettings.bl_rna.properties['snap_elements'].enum_items
- for elem in tool_settings.snap_elements:
- # TODO: Display multiple icons.
- # (Currently only one of the enabled modes icons is displayed)
- icon = snap_items[elem].icon
- break
+ snap_elements = tool_settings.snap_elements
+ if len(snap_elements) == 1:
+ text = ""
+ for elem in snap_elements:
+ icon = snap_items[elem].icon
+ break
else:
+ text = "Mix"
icon = 'NONE'
+ del snap_items, snap_elements
row = layout.row(align=True)
row.prop(tool_settings, "use_snap", text="")
@@ -175,7 +170,7 @@ class VIEW3D_HT_header(Header):
sub.popover(
panel="VIEW3D_PT_snapping",
icon=icon,
- text="",
+ text=text,
)
# Proportional editing
@@ -221,6 +216,32 @@ class VIEW3D_HT_header(Header):
icon=act_pivot_point.icon,
text="",
)
+ # grease pencil
+ if object_mode == 'GPENCIL_PAINT':
+ origin = tool_settings.gpencil_stroke_placement_view3d
+ gp_origin = tool_settings.bl_rna.properties['gpencil_stroke_placement_view3d'].enum_items[origin]
+
+ or_icon = getattr(gp_origin, "icon", "BLANK1")
+ or_name = getattr(gp_origin, "name", "Stroke Placement")
+ layout.popover(
+ panel="VIEW3D_PT_gpencil_origin",
+ text=or_name,
+ icon=or_icon,
+ )
+
+ if object_mode in {'GPENCIL_PAINT', 'GPENCIL_SCULPT'}:
+ lock = tool_settings.gpencil_sculpt.lock_axis
+ gp_lock = tool_settings.gpencil_sculpt.bl_rna.properties["lock_axis"].enum_items[lock]
+
+ lk_icon = getattr(gp_lock, "icon", "BLANK1")
+ lk_name = getattr(gp_lock, "name", "None")
+ row = layout.row()
+ row.enabled = tool_settings.gpencil_stroke_placement_view3d in {'ORIGIN', 'CURSOR'}
+ row.popover(
+ panel="VIEW3D_PT_gpencil_lock",
+ text=lk_name,
+ icon=lk_icon,
+ )
layout.separator_spacer()
@@ -237,6 +258,14 @@ class VIEW3D_HT_header(Header):
sub.active = overlay.show_overlays
sub.popover(panel="VIEW3D_PT_overlay")
+ row = layout.row()
+ row.active = (shading.type in {'WIREFRAME', 'SOLID'}) or object_mode in {'EDIT'}
+
+ if shading.type == 'WIREFRAME':
+ row.prop(shading, "show_xray_wireframe", text="", icon='XRAY')
+ else:
+ row.prop(shading, "show_xray", text="", icon='XRAY')
+
row = layout.row(align=True)
row.prop(shading, "type", text="", expand=True)
sub = row.row(align=True)
@@ -293,8 +322,6 @@ class VIEW3D_MT_editor_menus(Menu):
layout.menu("VIEW3D_MT_paint_gpencil")
elif obj and obj.mode == 'GPENCIL_EDIT':
layout.menu("VIEW3D_MT_edit_gpencil")
- elif obj and obj.mode == 'GPENCIL_SCULPT':
- layout.menu("VIEW3D_MT_sculpt_gpencil")
elif obj and obj.mode == 'GPENCIL_WEIGHT':
layout.menu("VIEW3D_MT_weight_gpencil")
@@ -340,6 +367,7 @@ class ShowHideMenu:
# NOTE: this doesn't seem to be able to be used directly
class VIEW3D_MT_transform_base(Menu):
bl_label = "Transform"
+ bl_category = "View"
# TODO: get rid of the custom text strings?
def draw(self, context):
@@ -393,15 +421,6 @@ class VIEW3D_MT_transform_object(VIEW3D_MT_transform_base):
layout.separator()
- layout.operator_context = 'EXEC_AREA'
-
- layout.operator("object.origin_set", text="Geometry to Origin").type = 'GEOMETRY_ORIGIN'
- layout.operator("object.origin_set", text="Origin to Geometry").type = 'ORIGIN_GEOMETRY'
- layout.operator("object.origin_set", text="Origin to 3D Cursor").type = 'ORIGIN_CURSOR'
- layout.operator("object.origin_set", text="Origin to Center of Mass (Surface)").type = 'ORIGIN_CENTER_OF_MASS'
- layout.operator("object.origin_set", text="Origin to Center of Mass (Volume)").type = 'ORIGIN_CENTER_OF_VOLUME'
- layout.separator()
-
layout.operator("object.randomize_transform")
layout.operator("object.align")
@@ -412,6 +431,22 @@ class VIEW3D_MT_transform_object(VIEW3D_MT_transform_base):
"""
+class VIEW3D_MT_transform_origin(Menu):
+ bl_label = "Origin"
+
+ def draw(self, context):
+
+ layout = self.layout
+
+ layout.operator_context = 'EXEC_AREA'
+
+ layout.operator("object.origin_set", text="Geometry to Origin").type = 'GEOMETRY_ORIGIN'
+ layout.operator("object.origin_set", text="Origin to Geometry").type = 'ORIGIN_GEOMETRY'
+ layout.operator("object.origin_set", text="Origin to 3D Cursor").type = 'ORIGIN_CURSOR'
+ layout.operator("object.origin_set", text="Origin to Center of Mass (Surface)").type = 'ORIGIN_CENTER_OF_MASS'
+ layout.operator("object.origin_set", text="Origin to Center of Mass (Volume)").type = 'ORIGIN_CENTER_OF_VOLUME'
+
+
# Armature EditMode extensions to Transform menu
class VIEW3D_MT_transform_armature(VIEW3D_MT_transform_base):
def draw(self, context):
@@ -423,11 +458,11 @@ class VIEW3D_MT_transform_armature(VIEW3D_MT_transform_base):
# armature specific extensions follow...
obj = context.object
if obj.type == 'ARMATURE' and obj.mode in {'EDIT', 'POSE'}:
- if obj.data.draw_type == 'BBONE':
+ if obj.data.display_type == 'BBONE':
layout.separator()
layout.operator("transform.transform", text="Scale BBone").mode = 'BONE_SIZE'
- elif obj.data.draw_type == 'ENVELOPE':
+ elif obj.data.display_type == 'ENVELOPE':
layout.separator()
layout.operator("transform.transform", text="Scale Envelope Distance").mode = 'BONE_SIZE'
@@ -491,7 +526,7 @@ class VIEW3D_MT_snap(Menu):
layout.separator()
layout.operator("view3d.snap_cursor_to_selected", text="Cursor to Selected")
- layout.operator("view3d.snap_cursor_to_center", text="Cursor to Center")
+ layout.operator("view3d.snap_cursor_to_center", text="Cursor to World Origin")
layout.operator("view3d.snap_cursor_to_grid", text="Cursor to Grid")
layout.operator("view3d.snap_cursor_to_active", text="Cursor to Active")
@@ -524,12 +559,12 @@ class VIEW3D_MT_uv_map(Menu):
layout.separator()
- layout.operator("uv.reset")
+ layout.operator("mesh.mark_seam").clear = False
+ layout.operator("mesh.mark_seam", text="Clear Seam").clear = True
layout.separator()
- layout.operator("mesh.uvs_rotate")
- layout.operator("mesh.uvs_reverse")
+ layout.operator("uv.reset")
class VIEW3D_MT_edit_proportional(Menu):
@@ -589,7 +624,7 @@ class VIEW3D_MT_view(Menu):
layout.separator()
layout.operator("render.opengl", icon='RENDER_STILL')
- layout.operator("render.opengl", text="OpenGL Render Animation", icon='RENDER_ANIMATION').animation = True
+ layout.operator("render.opengl", text="Viewport Render Animation", icon='RENDER_ANIMATION').animation = True
layout.separator()
@@ -782,7 +817,7 @@ class VIEW3D_MT_select_object(Menu):
layout.separator()
- layout.operator("view3d.select_border")
+ layout.operator("view3d.select_box")
layout.operator("view3d.select_circle")
layout.separator()
@@ -842,7 +877,7 @@ class VIEW3D_MT_select_pose(Menu):
layout.separator()
- layout.operator("view3d.select_border")
+ layout.operator("view3d.select_box")
layout.operator("view3d.select_circle")
layout.separator()
@@ -876,7 +911,7 @@ class VIEW3D_MT_select_particle(Menu):
layout.separator()
- layout.operator("view3d.select_border")
+ layout.operator("view3d.select_box")
layout.operator("view3d.select_circle")
layout.separator()
@@ -982,7 +1017,7 @@ class VIEW3D_MT_select_edit_mesh(Menu):
layout.separator()
- layout.operator("view3d.select_border")
+ layout.operator("view3d.select_box")
layout.operator("view3d.select_circle")
layout.separator()
@@ -1035,7 +1070,7 @@ class VIEW3D_MT_select_edit_curve(Menu):
layout.separator()
- layout.operator("view3d.select_border")
+ layout.operator("view3d.select_box")
layout.operator("view3d.select_circle")
layout.separator()
@@ -1070,7 +1105,7 @@ class VIEW3D_MT_select_edit_surface(Menu):
layout.separator()
- layout.operator("view3d.select_border")
+ layout.operator("view3d.select_box")
layout.operator("view3d.select_circle")
layout.separator()
@@ -1091,7 +1126,7 @@ class VIEW3D_MT_select_edit_surface(Menu):
class VIEW3D_MT_select_edit_text(Menu):
- # intentional name mis-match
+ # intentional name mismatch
# select menu for 3d-text doesn't make sense
bl_label = "Edit"
@@ -1123,7 +1158,7 @@ class VIEW3D_MT_select_edit_metaball(Menu):
layout.separator()
- layout.operator("view3d.select_border")
+ layout.operator("view3d.select_box")
layout.operator("view3d.select_circle")
layout.separator()
@@ -1147,7 +1182,7 @@ class VIEW3D_MT_select_edit_lattice(Menu):
layout.separator()
- layout.operator("view3d.select_border")
+ layout.operator("view3d.select_box")
layout.operator("view3d.select_circle")
layout.separator()
@@ -1157,6 +1192,11 @@ class VIEW3D_MT_select_edit_lattice(Menu):
layout.separator()
+ layout.operator("lattice.select_more")
+ layout.operator("lattice.select_less")
+
+ layout.separator()
+
layout.operator("lattice.select_ungrouped", text="Ungrouped Verts")
@@ -1172,7 +1212,7 @@ class VIEW3D_MT_select_edit_armature(Menu):
layout.separator()
- layout.operator("view3d.select_border")
+ layout.operator("view3d.select_box")
layout.operator("view3d.select_circle")
layout.separator()
@@ -1220,7 +1260,7 @@ class VIEW3D_MT_select_gpencil(Menu):
layout.separator()
- layout.operator("gpencil.select_border")
+ layout.operator("gpencil.select_box")
layout.operator("gpencil.select_circle")
layout.separator()
@@ -1252,7 +1292,7 @@ class VIEW3D_MT_select_paint_mask(Menu):
layout.separator()
- layout.operator("view3d.select_border")
+ layout.operator("view3d.select_box")
layout.operator("view3d.select_circle")
layout.separator()
@@ -1272,7 +1312,7 @@ class VIEW3D_MT_select_paint_mask_vertex(Menu):
layout.separator()
- layout.operator("view3d.select_border")
+ layout.operator("view3d.select_box")
layout.operator("view3d.select_circle")
layout.separator()
@@ -1466,7 +1506,7 @@ class VIEW3D_MT_add(Menu):
def draw(self, context):
layout = self.layout
- # note, don't use 'EXEC_SCREEN' or operators wont get the 'v3d' context.
+ # note, don't use 'EXEC_SCREEN' or operators won't get the 'v3d' context.
# Note: was EXEC_AREA, but this context does not have the 'rv3d', which prevents
# "align_view" to work on first call (see [#32719]).
@@ -1487,6 +1527,10 @@ class VIEW3D_MT_add(Menu):
layout.menu("VIEW3D_MT_armature_add", icon='OUTLINER_OB_ARMATURE')
layout.operator("object.add", text="Lattice", icon='OUTLINER_OB_LATTICE').type = 'LATTICE'
layout.operator_menu_enum("object.empty_add", "type", text="Empty", icon='OUTLINER_OB_EMPTY')
+
+ sublayout = layout.column()
+ sublayout.operator_context = 'INVOKE_DEFAULT'
+ sublayout.operator("object.load_image_as_empty", text="Image", icon="OUTLINER_OB_IMAGE")
layout.separator()
layout.operator("object.speaker_add", text="Speaker", icon='OUTLINER_OB_SPEAKER')
@@ -1554,6 +1598,7 @@ class VIEW3D_MT_object(Menu):
layout = self.layout
layout.menu("VIEW3D_MT_transform_object")
+ layout.menu("VIEW3D_MT_transform_origin")
layout.menu("VIEW3D_MT_mirror")
layout.menu("VIEW3D_MT_object_clear")
layout.menu("VIEW3D_MT_object_apply")
@@ -1603,7 +1648,9 @@ class VIEW3D_MT_object(Menu):
layout.separator()
- layout.operator("object.delete", text="Delete...").use_global = False
+ layout.operator_context = 'EXEC_DEFAULT'
+ layout.operator("object.delete", text="Delete").use_global = False
+ layout.operator("object.delete", text="Delete Global").use_global = True
class VIEW3D_MT_object_animation(Menu):
@@ -1674,7 +1721,6 @@ class VIEW3D_MT_object_specials(Menu):
def draw(self, context):
layout = self.layout
- scene = context.scene
obj = context.object
layout.operator("view3d.copybuffer", text="Copy Objects", icon='COPYDOWN')
@@ -1765,7 +1811,7 @@ class VIEW3D_MT_object_specials(Menu):
props = layout.operator("wm.context_modal_mouse", text="Empty Draw Size")
props.data_path_iter = "selected_editable_objects"
- props.data_path_item = "empty_draw_size"
+ props.data_path_item = "empty_display_size"
props.input_scale = 0.01
props.header_text = "Empty Draw Size: %.3f"
@@ -1784,9 +1830,11 @@ class VIEW3D_MT_object_specials(Menu):
if emission_node is not None:
props = layout.operator("wm.context_modal_mouse", text="Strength")
props.data_path_iter = "selected_editable_objects"
- props.data_path_item = "data.node_tree" \
- ".nodes[\"" + emission_node.name + "\"]" \
- ".inputs[\"Strength\"].default_value"
+ props.data_path_item = (
+ "data.node_tree"
+ ".nodes[\"" + emission_node.name + "\"]"
+ ".inputs[\"Strength\"].default_value"
+ )
props.header_text = "Light Strength: %.3f"
props.input_scale = 0.1
@@ -2054,8 +2102,10 @@ class VIEW3D_MT_brush(Menu):
layout.prop_menu_enum(brush, "sculpt_tool")
elif context.image_paint_object:
layout.prop_menu_enum(brush, "image_tool")
- elif context.vertex_paint_object or context.weight_paint_object:
+ elif context.vertex_paint_object:
layout.prop_menu_enum(brush, "vertex_tool")
+ elif context.weight_paint_object:
+ layout.prop_menu_enum(brush, "weight_tool")
# TODO: still missing a lot of brush options here
@@ -2274,7 +2324,7 @@ class VIEW3D_MT_hide_mask(Menu):
props.mode = 'VALUE'
props.value = 0
- props = layout.operator("view3d.select_border", text="Box Mask")
+ props = layout.operator("view3d.select_box", text="Box Mask")
props = layout.operator("paint.mask_lasso_gesture", text="Lasso Mask")
@@ -2394,7 +2444,7 @@ class VIEW3D_MT_pose(Menu):
layout.operator("pose.copy")
layout.operator("pose.paste").flipped = False
- layout.operator("pose.paste", text="Paste X-Flipped Pose").flipped = True
+ layout.operator("pose.paste", text="Paste Pose Flipped").flipped = True
layout.separator()
@@ -2656,7 +2706,6 @@ class VIEW3D_MT_edit_mesh(Menu):
def draw(self, context):
layout = self.layout
- tool_settings = context.tool_settings
with_bullet = bpy.app.build_options.bullet
@@ -2931,6 +2980,8 @@ class VIEW3D_MT_edit_mesh_edges(Menu):
def draw(self, context):
layout = self.layout
+ with_freestyle = bpy.app.build_options.freestyle
+
layout.operator_context = 'INVOKE_REGION_WIN'
layout.operator("mesh.extrude_edges_move", text="Extrude Edges"),
@@ -2955,7 +3006,29 @@ class VIEW3D_MT_edit_mesh_edges(Menu):
layout.separator()
- layout.menu("VIEW3D_MT_edit_mesh_edges_data")
+ layout.operator("transform.edge_crease")
+ layout.operator("transform.edge_bevelweight")
+
+ layout.separator()
+
+ layout.operator("mesh.mark_seam").clear = False
+ layout.operator("mesh.mark_seam", text="Clear Seam").clear = True
+
+ layout.separator()
+
+ layout.operator("mesh.mark_sharp")
+ layout.operator("mesh.mark_sharp", text="Clear Sharp").clear = True
+
+ layout.operator("mesh.mark_sharp", text="Mark Sharp from Vertices").use_verts = True
+ props = layout.operator("mesh.mark_sharp", text="Clear Sharp from Vertices")
+ props.use_verts = True
+ props.clear = True
+
+ if with_freestyle:
+ layout.separator()
+
+ layout.operator("mesh.mark_freestyle_edge").clear = False
+ layout.operator("mesh.mark_freestyle_edge", text="Clear Freestyle Edge").clear = True
class VIEW3D_MT_edit_mesh_faces_data(Menu):
@@ -2990,8 +3063,6 @@ class VIEW3D_MT_edit_mesh_faces(Menu):
def draw(self, context):
layout = self.layout
- with_freestyle = bpy.app.build_options.freestyle
-
layout.operator_context = 'INVOKE_REGION_WIN'
layout.operator("view3d.edit_mesh_extrude_move_normal", text="Extrude Faces"),
@@ -3069,7 +3140,7 @@ class VIEW3D_MT_edit_mesh_normals(Menu):
layout.label(text="Face Strength")
layout.operator("mesh.mod_weighted_strength", text="Face Select", icon='FACESEL').set = False
- layout.operator("mesh.mod_weighted_strength", text="Set Strength", icon='ZOOMIN').set = True
+ layout.operator("mesh.mod_weighted_strength", text="Set Strength", icon='ADD').set = True
class VIEW3D_MT_edit_mesh_shading(Menu):
@@ -3168,13 +3239,6 @@ class VIEW3D_MT_edit_gpencil_delete(Menu):
layout.separator()
layout.operator("gpencil.active_frames_delete_all")
-
- layout.separator()
-
- layout.operator("gpencil.frame_clean_fill", text="Clean Boundary Strokes").mode = 'ACTIVE'
- layout.operator("gpencil.frame_clean_fill", text="Clean Boundary Strokes all Frames").mode = 'ALL'
-
-
# Edit Curve
# draw_curve is used by VIEW3D_MT_edit_curve and VIEW3D_MT_edit_surface
@@ -3380,7 +3444,9 @@ class VIEW3D_MT_edit_meta(Menu):
layout.separator()
layout.menu("VIEW3D_MT_edit_meta_showhide")
- layout.operator("mball.delete_metaelems", text="Delete...")
+
+ layout.operator_context = 'EXEC_DEFAULT'
+ layout.operator("mball.delete_metaelems", text="Delete")
class VIEW3D_MT_edit_meta_showhide(Menu):
@@ -3473,7 +3539,7 @@ class VIEW3D_MT_edit_armature(Menu):
layout.separator()
- layout.operator("armature.delete")
+ layout.menu("VIEW3D_MT_edit_armature_delete")
class VIEW3D_MT_armature_specials(Menu):
@@ -3526,12 +3592,13 @@ class VIEW3D_MT_edit_armature_delete(Menu):
def draw(self, context):
layout = self.layout
+ layout.operator_context = 'EXEC_AREA'
- layout.operator("armature.delete", text="Delete Bones")
+ layout.operator("armature.delete", text="Bones")
layout.separator()
- layout.operator("armature.dissolve", text="Dissolve")
+ layout.operator("armature.dissolve", text="Dissolve Bones")
# ********** Grease Pencil Stroke menus **********
@@ -3598,17 +3665,15 @@ class VIEW3D_MT_gpencil_copy_layer(Menu):
done = True
if done is False:
- layout.label(text="No destination object", icon="ERROR")
+ layout.label(text="No destination object", icon='ERROR')
else:
- layout.label(text="No layer to copy", icon="ERROR")
+ layout.label(text="No layer to copy", icon='ERROR')
class VIEW3D_MT_edit_gpencil(Menu):
bl_label = "Strokes"
def draw(self, context):
- tool_settings = context.tool_settings
-
layout = self.layout
layout.menu("VIEW3D_MT_edit_gpencil_transform")
@@ -3663,47 +3728,6 @@ class VIEW3D_MT_edit_gpencil(Menu):
layout.menu("GPENCIL_MT_cleanup")
-class VIEW3D_MT_sculpt_gpencil(Menu):
- bl_label = "Strokes"
-
- def draw(self, context):
- layout = self.layout
-
- layout.menu("VIEW3D_MT_edit_gpencil_transform")
-
- layout.separator()
- layout.menu("GPENCIL_MT_snap")
-
- layout.separator()
-
- layout.operator("gpencil.duplicate_move", text="Duplicate")
- layout.operator("gpencil.stroke_subdivide", text="Subdivide")
- layout.menu("VIEW3D_MT_gpencil_simplify")
-
- layout.separator()
-
- layout.operator_menu_enum("gpencil.stroke_separate", "mode", text="Separate...")
- layout.operator("gpencil.stroke_split", text="Split")
- layout.operator_menu_enum("gpencil.stroke_join", "type", text="Join...")
- layout.operator("gpencil.stroke_flip", text="Flip Direction")
-
- layout.separator()
-
- layout.operator("gpencil.copy", text="Copy")
- layout.operator("gpencil.paste", text="Paste").type = 'COPY'
- layout.operator("gpencil.paste", text="Paste & Merge").type = 'MERGE'
-
- layout.separator()
-
- layout.operator_menu_enum("gpencil.move_to_layer", "layer", text="Move to Layer")
- layout.menu("VIEW3D_MT_assign_material")
- layout.operator_menu_enum("gpencil.stroke_arrange", "direction", text="Arrange Strokes...")
-
- layout.separator()
-
- layout.operator_menu_enum("gpencil.convert", "type", text="Convert to Geometry...")
-
-
class VIEW3D_MT_weight_gpencil(Menu):
bl_label = "Weights"
@@ -3792,12 +3816,106 @@ class VIEW3D_MT_view_pie(Menu):
pie.operator("view3d.view_selected", text="View Selected", icon='ZOOM_SELECTED')
+class VIEW3D_MT_shading_pie(Menu):
+ bl_label = "Shading"
+
+ def draw(self, context):
+ layout = self.layout
+ pie = layout.menu_pie()
+
+ view = context.space_data
+
+ pie.prop_enum(view.shading, "type", value='WIREFRAME')
+ pie.prop_enum(view.shading, "type", value='SOLID')
+
+ if context.mode == 'POSE':
+ pie.prop(view.overlay, "show_bone_select", icon='XRAY')
+ else:
+ xray_active = (
+ (context.mode in 'EDIT_MESH') or
+ (view.shading.type in {'SOLID', 'WIREFRAME'})
+ )
+
+ if xray_active:
+ sub = pie
+ else:
+ sub = pie.row()
+ sub.active = False
+
+ if view.shading.type == 'WIREFRAME':
+ sub.prop(view.shading, "show_xray_wireframe", text="Toggle X-Ray", icon='XRAY')
+ else:
+ sub.prop(view.shading, "show_xray", text="Toggle X-Ray", icon='XRAY')
+
+ pie.prop(view.overlay, "show_overlays", text="Toggle Overlays", icon='OVERLAY')
+ pie.prop_enum(view.shading, "type", value='MATERIAL')
+ pie.prop_enum(view.shading, "type", value='RENDERED')
+
+
+class VIEW3D_MT_pivot_pie(Menu):
+ bl_label = "Pivot Point"
+
+ def draw(self, context):
+ layout = self.layout
+ pie = layout.menu_pie()
+ obj = context.active_object
+ mode = context.mode
+
+ pie.prop_enum(context.scene.tool_settings, "transform_pivot_point", value='BOUNDING_BOX_CENTER')
+ pie.prop_enum(context.scene.tool_settings, "transform_pivot_point", value='CURSOR')
+ pie.prop_enum(context.scene.tool_settings, "transform_pivot_point", value='INDIVIDUAL_ORIGINS')
+ pie.prop_enum(context.scene.tool_settings, "transform_pivot_point", value='MEDIAN_POINT')
+ pie.prop_enum(context.scene.tool_settings, "transform_pivot_point", value='ACTIVE_ELEMENT')
+ if (obj is None) or (mode in {'OBJECT', 'POSE', 'WEIGHT_PAINT'}):
+ pie.prop(context.scene.tool_settings, "use_transform_pivot_point_align", text="Center Points Only")
+
+
+class VIEW3D_MT_orientations_pie(Menu):
+ bl_label = "Orientation"
+
+ def draw(self, context):
+ layout = self.layout
+ pie = layout.menu_pie()
+ scene = context.scene
+
+ pie.prop(scene, "transform_orientation", expand=True)
+
+
+class VIEW3D_MT_snap_pie(Menu):
+ bl_label = "Snap"
+
+ def draw(self, context):
+ layout = self.layout
+ pie = layout.menu_pie()
+
+ pie.operator("view3d.snap_cursor_to_grid", text="Cursor to Grid", icon='PIVOT_CURSOR')
+ pie.operator("view3d.snap_selected_to_grid", text="Selection to Grid", icon='RESTRICT_SELECT_OFF')
+ pie.operator("view3d.snap_cursor_to_selected", text="Cursor to Selected", icon='PIVOT_CURSOR')
+ pie.operator("view3d.snap_selected_to_cursor", text="Selection to Cursor", icon='RESTRICT_SELECT_OFF').use_offset = False
+ pie.operator("view3d.snap_selected_to_cursor", text="Selection to Cursor (Keep Offset)", icon='RESTRICT_SELECT_OFF').use_offset = True
+ pie.operator("view3d.snap_selected_to_active", text="Selection to Active", icon='RESTRICT_SELECT_OFF')
+ pie.operator("view3d.snap_cursor_to_center", text="Cursor to World Origin", icon='PIVOT_CURSOR')
+ pie.operator("view3d.snap_cursor_to_active", text="Cursor to Active", icon='PIVOT_CURSOR')
+
+
+class VIEW3D_MT_proportional_editing_falloff_pie(Menu):
+ bl_label = "Proportional Editing Falloff"
+
+ def draw(self, context):
+ layout = self.layout
+ pie = layout.menu_pie()
+ tool_settings = context.scene.tool_settings
+
+ pie.prop(tool_settings, "proportional_edit_falloff", expand=True)
+
+
# ********** Panel **********
class VIEW3D_PT_view3d_properties(Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
+ bl_category = "View"
bl_label = "View"
def draw(self, context):
@@ -3835,6 +3953,7 @@ class VIEW3D_PT_view3d_properties(Panel):
class VIEW3D_PT_view3d_camera_lock(Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
+ bl_category = "View"
bl_label = "Camera Lock"
bl_parent_id = "VIEW3D_PT_view3d_properties"
@@ -3869,6 +3988,7 @@ class VIEW3D_PT_view3d_camera_lock(Panel):
class VIEW3D_PT_view3d_cursor(Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
+ bl_category = "View"
bl_label = "3D Cursor"
def draw(self, context):
@@ -3892,28 +4012,29 @@ class VIEW3D_PT_object_type_visibility(Panel):
view = context.space_data
+ layout.label(text="Object Types Visibility")
col = layout.column()
attr_object_types = (
# Geometry
- "mesh",
- "curve",
- "surf",
- "meta",
- "font",
- None,
+ ("mesh", "Mesh"),
+ ("curve", "Curve"),
+ ("surf", "Surface"),
+ ("meta", "Meta"),
+ ("font", "Font"),
+ (None, None),
# Other
- "armature",
- "lattice",
- "empty",
- "grease_pencil",
- "camera",
- "light",
- "light_probe",
- "speaker",
+ ("armature", "Armature"),
+ ("lattice", "Lattice"),
+ ("empty", "Empty"),
+ ("grease_pencil", "Grease Pencil"),
+ ("camera", "Camera"),
+ ("light", "Light"),
+ ("light_probe", "Light Probe"),
+ ("speaker", "Speaker"),
)
- for attr in attr_object_types:
+ for attr, attr_name in attr_object_types:
if attr is None:
col.separator()
continue
@@ -3921,12 +4042,17 @@ class VIEW3D_PT_object_type_visibility(Panel):
attr_v = "show_object_viewport_" f"{attr:s}"
attr_s = "show_object_select_" f"{attr:s}"
+ icon_v = 'HIDE_OFF' if getattr(view, attr_v) else 'HIDE_ON'
icon_s = 'RESTRICT_SELECT_OFF' if getattr(view, attr_s) else 'RESTRICT_SELECT_ON'
row = col.row(align=True)
- row.prop(view, attr_v)
- row.active = getattr(view, attr_v)
- row.prop(view, attr_s, text="", icon=icon_s, emboss=False)
+ row.alignment = 'RIGHT'
+
+ row.label(text=attr_name)
+ row.prop(view, attr_v, text="", icon=icon_v, emboss=False)
+ rowsub = row.row(align=True)
+ rowsub.active = getattr(view, attr_v)
+ rowsub.prop(view, attr_s, text="", icon=icon_s, emboss=False)
class VIEW3D_PT_shading(Panel):
@@ -3954,6 +4080,11 @@ class VIEW3D_PT_shading_lighting(Panel):
bl_label = "Lighting"
bl_parent_id = 'VIEW3D_PT_shading'
+ @classmethod
+ def poll(cls, context):
+ shading = VIEW3D_PT_shading.get_shading(context)
+ return shading.type in {'SOLID', 'MATERIAL'}
+
def draw(self, context):
layout = self.layout
shading = VIEW3D_PT_shading.get_shading(context)
@@ -4019,7 +4150,7 @@ class VIEW3D_PT_shading_color(Panel):
@classmethod
def poll(cls, context):
shading = VIEW3D_PT_shading.get_shading(context)
- return shading.type == 'SOLID'
+ return shading.type in {'WIREFRAME', 'SOLID'}
def _draw_color_type(self, context):
layout = self.layout
@@ -4039,7 +4170,10 @@ class VIEW3D_PT_shading_color(Panel):
layout.row().prop(shading, "background_color", text="")
def draw(self, context):
- self._draw_color_type(context)
+ shading = VIEW3D_PT_shading.get_shading(context)
+ if shading.type != 'WIREFRAME':
+ self._draw_color_type(context)
+ self.layout.separator()
self._draw_background_color(context)
@@ -4052,7 +4186,7 @@ class VIEW3D_PT_shading_options(Panel):
@classmethod
def poll(cls, context):
shading = VIEW3D_PT_shading.get_shading(context)
- return shading.type == 'SOLID'
+ return shading.type in {'WIREFRAME', 'SOLID'}
def draw(self, context):
layout = self.layout
@@ -4061,45 +4195,47 @@ class VIEW3D_PT_shading_options(Panel):
col = layout.column()
- is_xray = shading.show_xray
- is_shadows = shading.show_shadows
-
- icon_x = 'CHECKBOX_HLT' if is_xray else 'CHECKBOX_DEHLT'
row = col.row()
- row.prop(shading, "show_xray", text="")
- sub = row.row()
- sub.active = is_xray
- sub.prop(shading, "xray_alpha", text="X-Ray")
- icon_s = 'CHECKBOX_HLT' if is_shadows else 'CHECKBOX_DEHLT'
- row = col.row()
- row.prop(shading, "show_shadows", text="")
- row.active = not is_xray
- sub = row.row(align=True)
- sub.active = is_shadows
- sub.prop(shading, "shadow_intensity", text="Shadow")
- sub.popover(
- panel="VIEW3D_PT_shading_options_shadow",
- icon='SCRIPTWIN',
- text=""
- )
-
- col = layout.column()
- row = col.row()
- row.active = not is_xray
- row.prop(shading, "show_cavity")
-
- if shading.show_cavity:
- sub = col.row(align=True)
- sub.active = not shading.show_xray and shading.show_cavity
- sub.prop(shading, "cavity_ridge_factor")
- sub.prop(shading, "cavity_valley_factor")
+ if shading.type == 'WIREFRAME':
+ row.prop(shading, "show_xray_wireframe", text="")
+ sub = row.row()
+ sub.active = shading.show_xray_wireframe
+ sub.prop(shading, "xray_alpha_wireframe", text="X-Ray")
+ elif shading.type == 'SOLID':
+ row.prop(shading, "show_xray", text="")
+ sub = row.row()
+ sub.active = shading.show_xray
+ sub.prop(shading, "xray_alpha", text="X-Ray")
+
+ row = col.row()
+ row.prop(shading, "show_shadows", text="")
+ row.active = not shading.show_xray
+ sub = row.row(align=True)
+ sub.active = shading.show_shadows
+ sub.prop(shading, "shadow_intensity", text="Shadow")
sub.popover(
- panel="VIEW3D_PT_shading_options_ssao",
- icon='SCRIPTWIN',
+ panel="VIEW3D_PT_shading_options_shadow",
+ icon='PREFERENCES',
text=""
)
+ col = layout.column()
+ row = col.row()
+ row.active = not shading.show_xray
+ row.prop(shading, "show_cavity")
+
+ if shading.show_cavity:
+ sub = col.row(align=True)
+ sub.active = not shading.show_xray and shading.show_cavity
+ sub.prop(shading, "cavity_ridge_factor")
+ sub.prop(shading, "cavity_valley_factor")
+ sub.popover(
+ panel="VIEW3D_PT_shading_options_ssao",
+ icon='PREFERENCES',
+ text=""
+ )
+
row = layout.split()
row.prop(shading, "show_object_outline")
sub = row.row()
@@ -4107,7 +4243,7 @@ class VIEW3D_PT_shading_options(Panel):
sub.prop(shading, "object_outline_color", text="")
col = layout.column()
- if not shading.light == 'MATCAP':
+ if (shading.light is not 'MATCAP') and (shading.type is not 'WIREFRAME'):
col.prop(shading, "show_specular_highlight")
@@ -4247,7 +4383,6 @@ class VIEW3D_PT_overlay_object(Panel):
layout = self.layout
view = context.space_data
overlay = view.overlay
- shading = view.shading
display_all = overlay.show_overlays
col = layout.column(align=True)
@@ -4256,7 +4391,7 @@ class VIEW3D_PT_overlay_object(Panel):
split = col.split()
sub = split.column(align=True)
- sub.prop(overlay, "show_ornaments", text="Ornaments")
+ sub.prop(overlay, "show_extras", text="Extras")
sub.prop(overlay, "show_relationship_lines")
sub.prop(overlay, "show_outline_selected")
@@ -4280,14 +4415,16 @@ class VIEW3D_PT_overlay_geometry(Panel):
view = context.space_data
overlay = view.overlay
display_all = overlay.show_overlays
+ is_wireframes = view.shading.type == 'WIREFRAME'
col = layout.column()
col.active = display_all
row = col.row()
- row.prop(overlay, "show_wireframes", text="")
+ if not is_wireframes:
+ row.prop(overlay, "show_wireframes", text="")
sub = row.row()
- sub.active = overlay.show_wireframes
+ sub.active = overlay.show_wireframes or is_wireframes
sub.prop(overlay, "wireframe_threshold", text="Wireframe")
col = layout.column(align=True)
@@ -4334,8 +4471,8 @@ class VIEW3D_PT_overlay_motion_tracking(Panel):
col = layout.column()
col.label(text="Tracks:")
row = col.row(align=True)
- row.prop(view, "tracks_draw_type", text="")
- row.prop(view, "tracks_draw_size", text="Size")
+ row.prop(view, "tracks_display_type", text="")
+ row.prop(view, "tracks_display_size", text="Size")
class VIEW3D_PT_overlay_edit_mesh(Panel):
@@ -4353,9 +4490,8 @@ class VIEW3D_PT_overlay_edit_mesh(Panel):
view = context.space_data
overlay = view.overlay
+ shading = view.shading
display_all = overlay.show_overlays
- data = context.active_object.data
- with_freestyle = bpy.app.build_options.freestyle
col = layout.column()
col.active = display_all
@@ -4363,20 +4499,21 @@ class VIEW3D_PT_overlay_edit_mesh(Panel):
split = col.split()
sub = split.column()
- sub.prop(data, "show_edges", text="Edges")
+ sub.prop(overlay, "show_edges", text="Edges")
sub = split.column()
- sub.prop(data, "show_faces", text="Faces")
+ sub.prop(overlay, "show_faces", text="Faces")
sub = split.column()
- sub.active = view.use_occlude_geometry
- sub.prop(data, "show_face_center", text="Center")
+ if shading.type == 'WIREFRAME':
+ sub.active = not shading.show_xray_wireframe
+ else:
+ sub.active = not shading.show_xray
+ sub.prop(overlay, "show_face_center", text="Center")
row = col.row(align=True)
- row.prop(data, "show_edge_crease", text="Creases", toggle=True)
- row.prop(data, "show_edge_sharp", text="Sharp", text_ctxt=i18n_contexts.plural, toggle=True)
- row.prop(data, "show_edge_bevel_weight", text="Bevel", toggle=True)
-
- if not with_freestyle:
- row.prop(data, "show_edge_seams", text="Seams", toggle=True)
+ row.prop(overlay, "show_edge_crease", text="Creases", toggle=True)
+ row.prop(overlay, "show_edge_sharp", text="Sharp", text_ctxt=i18n_contexts.plural, toggle=True)
+ row.prop(overlay, "show_edge_bevel_weight", text="Bevel", toggle=True)
+ row.prop(overlay, "show_edge_seams", text="Seams", toggle=True)
class VIEW3D_PT_overlay_edit_mesh_shading(Panel):
@@ -4396,7 +4533,6 @@ class VIEW3D_PT_overlay_edit_mesh_shading(Panel):
overlay = view.overlay
tool_settings = context.tool_settings
display_all = overlay.show_overlays
- data = context.active_object.data
statvis = tool_settings.statvis
col = layout.column()
@@ -4406,16 +4542,17 @@ class VIEW3D_PT_overlay_edit_mesh_shading(Panel):
col.prop(overlay, "show_weight", text="Vertex Group Weights")
if overlay.show_weight:
- row = col.split()
+ row = col.split(factor=0.33)
row.label(text="Zero Weights")
- row.prop(tool_settings, "vertex_group_user", text="")
+ sub = row.row()
+ sub.prop(tool_settings, "vertex_group_user", expand=True)
- col.prop(data, "show_statvis", text="Mesh Analysis")
- if data.show_statvis:
+ col.prop(overlay, "show_statvis", text="Mesh Analysis")
+ if overlay.show_statvis:
col = col.column()
sub = col.split()
- sub.active = data.show_statvis
+ sub.active = overlay.show_statvis
sub.label(text="Type")
sub.prop(statvis, "type", text="")
@@ -4458,7 +4595,6 @@ class VIEW3D_PT_overlay_edit_mesh_measurement(Panel):
view = context.space_data
overlay = view.overlay
display_all = overlay.show_overlays
- data = context.active_object.data
col = layout.column()
col.active = display_all
@@ -4466,12 +4602,12 @@ class VIEW3D_PT_overlay_edit_mesh_measurement(Panel):
split = col.split()
sub = split.column()
- sub.prop(data, "show_extra_edge_length", text="Edge Length")
- sub.prop(data, "show_extra_edge_angle", text="Edge Angle")
+ sub.prop(overlay, "show_extra_edge_length", text="Edge Length")
+ sub.prop(overlay, "show_extra_edge_angle", text="Edge Angle")
sub = split.column()
- sub.prop(data, "show_extra_face_area", text="Face Area")
- sub.prop(data, "show_extra_face_angle", text="Face Angle")
+ sub.prop(overlay, "show_extra_face_area", text="Face Area")
+ sub.prop(overlay, "show_extra_face_angle", text="Face Angle")
class VIEW3D_PT_overlay_edit_mesh_normals(Panel):
@@ -4495,9 +4631,9 @@ class VIEW3D_PT_overlay_edit_mesh_normals(Panel):
col.active = display_all
row = col.row(align=True)
- row.prop(overlay, "show_vertex_normals", text="", icon='VERTEXSEL')
- row.prop(overlay, "show_split_normals", text="", icon='LOOPSEL')
- row.prop(overlay, "show_face_normals", text="", icon='FACESEL')
+ row.prop(overlay, "show_vertex_normals", text="", icon='NORMALS_VERTEX')
+ row.prop(overlay, "show_split_normals", text="", icon='NORMALS_VERTEX_FACE')
+ row.prop(overlay, "show_face_normals", text="", icon='NORMALS_FACE')
sub = row.row(align=True)
sub.active = overlay.show_vertex_normals or overlay.show_face_normals or overlay.show_split_normals
@@ -4520,15 +4656,13 @@ class VIEW3D_PT_overlay_edit_mesh_freestyle(Panel):
view = context.space_data
overlay = view.overlay
display_all = overlay.show_overlays
- data = context.active_object.data
col = layout.column()
col.active = display_all
row = col.row()
- row.prop(data, "show_freestyle_edge_marks", text="Edge Marks")
- row.prop(data, "show_freestyle_face_marks", text="Face Marks")
- row.prop(data, "show_edge_seams", text="Seams")
+ row.prop(overlay, "show_freestyle_edge_marks", text="Edge Marks")
+ row.prop(overlay, "show_freestyle_face_marks", text="Face Marks")
class VIEW3D_PT_overlay_edit_mesh_developer(Panel):
@@ -4547,12 +4681,11 @@ class VIEW3D_PT_overlay_edit_mesh_developer(Panel):
view = context.space_data
overlay = view.overlay
display_all = overlay.show_overlays
- data = context.active_object.data
col = layout.column()
col.active = display_all
- col.prop(data, "show_extra_indices", text="Indices")
+ col.prop(overlay, "show_extra_indices", text="Indices")
class VIEW3D_PT_overlay_edit_curve(Panel):
@@ -4568,7 +4701,6 @@ class VIEW3D_PT_overlay_edit_curve(Panel):
def draw(self, context):
layout = self.layout
view = context.space_data
- data = context.active_object.data
overlay = view.overlay
display_all = overlay.show_overlays
@@ -4576,8 +4708,8 @@ class VIEW3D_PT_overlay_edit_curve(Panel):
col.active = display_all
row = col.row()
- row.prop(data, "show_handles", text="Handles")
- row.prop(data, "show_normal_face", text="Normals")
+ row.prop(overlay, "show_curve_handles", text="Handles")
+ row.prop(overlay, "show_curve_normals", text="Normals")
class VIEW3D_PT_overlay_sculpt(Panel):
@@ -4684,6 +4816,14 @@ class VIEW3D_PT_overlay_paint(Panel):
'PAINT_WEIGHT': "weight_paint_mode_opacity",
}[context.mode], text="Opacity")
+ if context.mode == 'PAINT_WEIGHT':
+ row = col.split(factor=0.33)
+ row.label(text="Zero Weights")
+ sub = row.row()
+ sub.prop(context.tool_settings, "vertex_group_user", expand=True)
+
+ col.prop(overlay, "show_wpaint_contours")
+
if context.mode in {'PAINT_WEIGHT', 'PAINT_VERTEX'}:
col.prop(overlay, "show_paint_wire")
@@ -4723,7 +4863,6 @@ class VIEW3D_PT_snapping(Panel):
toolsettings = context.tool_settings
snap_elements = toolsettings.snap_elements
obj = context.active_object
- mode = context.mode
object_mode = 'OBJECT' if obj is None else obj.mode
layout = self.layout
@@ -4744,10 +4883,10 @@ class VIEW3D_PT_snapping(Panel):
if object_mode == 'EDIT':
col.prop(toolsettings, "use_snap_self")
if object_mode in {'OBJECT', 'POSE', 'EDIT'}:
- col.prop(toolsettings, "use_snap_align_rotation", text="Align Rotation")
+ col.prop(toolsettings, "use_snap_align_rotation")
if 'FACE' in snap_elements:
- col.prop(toolsettings, "use_snap_project", text="Project Elements")
+ col.prop(toolsettings, "use_snap_project")
if 'VOLUME' in snap_elements:
col.prop(toolsettings, "use_snap_peel_object")
@@ -4769,14 +4908,57 @@ class VIEW3D_PT_transform_orientations(Panel):
row = layout.row()
col = row.column()
col.prop(scene, "transform_orientation", expand=True)
- row.operator("transform.create_orientation", text="", icon='ZOOMIN', emboss=False).use = True
+ row.operator("transform.create_orientation", text="", icon='ADD', emboss=False).use = True
if orientation:
row = layout.row(align=False)
- row.prop(orientation, "name", text="")
+ row.prop(orientation, "name", text="", icon="OBJECT_ORIGIN")
row.operator("transform.delete_orientation", text="", icon='X', emboss=False)
+class VIEW3D_PT_gpencil_origin(Panel):
+ bl_space_type = 'VIEW_3D'
+ bl_region_type = 'HEADER'
+ bl_label = "Stroke Placement"
+
+ def draw(self, context):
+ layout = self.layout
+ ts = context.tool_settings
+ gpd = context.gpencil_data
+
+ layout.label(text="Stroke Placement")
+
+ row = layout.row()
+ col = row.column()
+ col.prop(ts, "gpencil_stroke_placement_view3d", expand=True)
+
+ if ts.gpencil_stroke_placement_view3d == 'SURFACE':
+ row = layout.row()
+ row.label(text="Offset")
+ row = layout.row()
+ row.prop(gpd, "zdepth_offset", text="")
+
+ if ts.gpencil_stroke_placement_view3d == 'STROKE':
+ row = layout.row()
+ row.label(text="Target")
+ row = layout.row()
+ row.prop(ts, "gpencil_stroke_snap_mode", expand=True)
+
+
+class VIEW3D_PT_gpencil_lock(Panel):
+ bl_space_type = 'VIEW_3D'
+ bl_region_type = 'HEADER'
+ bl_label = "Drawing Plane"
+
+ def draw(self, context):
+ layout = self.layout
+ layout.label(text="Drawing Plane")
+
+ row = layout.row()
+ col = row.column()
+ col.prop(context.tool_settings.gpencil_sculpt, "lock_axis", expand=True)
+
+
class VIEW3D_PT_overlay_gpencil_options(Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'HEADER'
@@ -4806,24 +4988,23 @@ class VIEW3D_PT_overlay_gpencil_options(Panel):
col = layout.column()
row = col.row()
- row.prop(overlay, "use_gpencil_paper", text="")
+ row.prop(overlay, "use_gpencil_grid", text="")
sub = row.row()
- sub.active = overlay.use_gpencil_paper
- sub.prop(overlay, "gpencil_paper_opacity", text="Fade 3D Objects", slider=True)
+ sub.active = overlay.use_gpencil_grid
+ sub.prop(overlay, "gpencil_grid_opacity", text="Canvas", slider=True)
- col = layout.column()
row = col.row()
- row.prop(overlay, "use_gpencil_grid", text="")
+ row.prop(overlay, "use_gpencil_paper", text="")
sub = row.row()
- sub.active = overlay.use_gpencil_grid
- sub.prop(overlay, "gpencil_grid_opacity", text="Canvas Grid", slider=True)
+ sub.active = overlay.use_gpencil_paper
+ sub.prop(overlay, "gpencil_paper_opacity", text="Fade 3D Objects", slider=True)
- if overlay.use_gpencil_grid:
- row = layout.row(align=True)
- row.prop(overlay, "gpencil_grid_scale")
- col = row.column()
- col.prop(overlay, "gpencil_grid_lines", text="Subdivisions")
- col.prop(overlay, "gpencil_grid_axis")
+ if context.object.mode == 'GPENCIL_PAINT':
+ row = col.row()
+ row.prop(overlay, "use_gpencil_fade_layers", text="")
+ sub = row.row()
+ sub.active = overlay.use_gpencil_fade_layers
+ sub.prop(overlay, "gpencil_fade_layer", text="Fade Layers", slider=True)
if context.object.mode in {'GPENCIL_EDIT', 'GPENCIL_SCULPT', 'GPENCIL_WEIGHT'}:
layout.prop(overlay, "use_gpencil_edit_lines", text="Edit Lines")
@@ -4862,6 +5043,7 @@ class VIEW3D_PT_quad_view(Panel):
class VIEW3D_PT_grease_pencil(AnnotationDataPanel, Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
+ bl_category = "View"
# NOTE: this is just a wrapper around the generic GP Panel
@@ -4869,6 +5051,7 @@ class VIEW3D_PT_grease_pencil(AnnotationDataPanel, Panel):
class VIEW3D_PT_view3d_stereo(Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
+ bl_category = "View"
bl_label = "Stereoscopy"
bl_options = {'DEFAULT_CLOSED'}
@@ -4909,6 +5092,7 @@ class VIEW3D_PT_view3d_stereo(Panel):
class VIEW3D_PT_context_properties(Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
+ bl_category = "View"
bl_label = "Properties"
bl_options = {'DEFAULT_CLOSED'}
@@ -5031,12 +5215,14 @@ class VIEW3D_MT_gpencil_sculpt_specials(Menu):
layout.separator()
layout.menu("VIEW3D_MT_gpencil_autoweights")
+
classes = (
VIEW3D_HT_header,
VIEW3D_MT_editor_menus,
VIEW3D_MT_transform,
VIEW3D_MT_transform_base,
VIEW3D_MT_transform_object,
+ VIEW3D_MT_transform_origin,
VIEW3D_MT_transform_armature,
VIEW3D_MT_mirror,
VIEW3D_MT_snap,
@@ -5142,7 +5328,6 @@ classes = (
VIEW3D_MT_assign_material,
VIEW3D_MT_edit_gpencil,
VIEW3D_MT_edit_gpencil_delete,
- VIEW3D_MT_sculpt_gpencil,
VIEW3D_MT_weight_gpencil,
VIEW3D_MT_gpencil_animation,
VIEW3D_MT_gpencil_simplify,
@@ -5169,6 +5354,11 @@ classes = (
VIEW3D_MT_edit_gpencil_interpolate,
VIEW3D_MT_object_mode_pie,
VIEW3D_MT_view_pie,
+ VIEW3D_MT_shading_pie,
+ VIEW3D_MT_pivot_pie,
+ VIEW3D_MT_snap_pie,
+ VIEW3D_MT_orientations_pie,
+ VIEW3D_MT_proportional_editing_falloff_pie,
VIEW3D_PT_view3d_properties,
VIEW3D_PT_view3d_camera_lock,
VIEW3D_PT_view3d_cursor,
@@ -5205,6 +5395,8 @@ classes = (
VIEW3D_PT_overlay_sculpt,
VIEW3D_PT_pivot_point,
VIEW3D_PT_snapping,
+ VIEW3D_PT_gpencil_origin,
+ VIEW3D_PT_gpencil_lock,
VIEW3D_PT_transform_orientations,
VIEW3D_PT_overlay_gpencil_options,
VIEW3D_PT_context_properties,
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 6915129ef2c..2fb056cdfb7 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -22,6 +22,7 @@ from bpy.types import Menu, Panel, UIList
from .properties_grease_pencil_common import (
GreasePencilStrokeEditPanel,
GreasePencilStrokeSculptPanel,
+ GreasePencilSculptOptionsPanel,
GreasePencilAppearancePanel,
)
from .properties_paint_common import (
@@ -66,6 +67,7 @@ def draw_vpaint_symmetry(layout, vpaint):
col = layout.column()
col.use_property_split = True
+ col.use_property_decorate = False
col.prop(vpaint, "radial_symmetry", text="Radial")
# Most of these panels should not be visible in GP edit modes
@@ -86,6 +88,7 @@ class VIEW3D_PT_tools_meshedit_options(View3DPanel, Panel):
bl_category = "Options"
bl_context = ".mesh_edit" # dot on purpose (access from topbar)
bl_label = "Mesh Options"
+ bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
@@ -109,11 +112,11 @@ class VIEW3D_PT_tools_meshedit_options(View3DPanel, Panel):
row.active = ob.data.use_mirror_x
row.prop(mesh, "use_mirror_topology")
- layout.prop(tool_settings, "edge_path_mode")
layout.prop(tool_settings, "edge_path_live_unwrap")
- layout.prop(tool_settings, "double_threshold")
- layout.prop(tool_settings, "use_mesh_automerge") # , icon='AUTOMERGE_ON'
+ layout.prop(tool_settings, "use_mesh_automerge")
+ layout.prop(tool_settings, "double_threshold")
+ layout.prop(tool_settings, "edge_path_mode")
# ********** default tools for editmode_curve ****************
@@ -207,64 +210,6 @@ class View3DPaintPanel(UnifiedPaintPanel):
bl_region_type = 'WINDOW'
-class VIEW3D_PT_imapaint_tools_missing(Panel, View3DPaintPanel):
- bl_category = "Tools"
- bl_context = ".imagepaint" # dot on purpose (access from topbar)
- bl_label = "Missing Data"
-
- @classmethod
- def poll(cls, context):
- toolsettings = context.tool_settings.image_paint
- return context.image_paint_object and not toolsettings.detect_data()
-
- def draw(self, context):
- layout = self.layout
- toolsettings = context.tool_settings.image_paint
-
- col = layout.column()
- col.label(text="Missing Data", icon='ERROR')
- if toolsettings.missing_uvs:
- col.separator()
- col.label(text="Missing UVs", icon='INFO')
- col.label(text="Unwrap the mesh in edit mode or generate a simple UV layer")
- col.operator("paint.add_simple_uvs")
-
- if toolsettings.mode == 'MATERIAL':
- if toolsettings.missing_materials:
- col.separator()
- col.label(text="Missing Materials", icon='INFO')
- col.label(text="Add a material and paint slot below")
- col.operator_menu_enum("paint.add_texture_paint_slot", "type", text="Add Paint Slot")
- elif toolsettings.missing_texture:
- ob = context.active_object
- mat = ob.active_material
-
- col.separator()
- if mat:
- col.label(text="Missing Texture Slots", icon='INFO')
- col.label(text="Add a paint slot below")
- col.operator_menu_enum("paint.add_texture_paint_slot", "type", text="Add Paint Slot")
- else:
- col.label(text="Missing Materials", icon='INFO')
- col.label(text="Add a material and paint slot below")
- col.operator_menu_enum("paint.add_texture_paint_slot", "type", text="Add Paint Slot")
-
- elif toolsettings.mode == 'IMAGE':
- if toolsettings.missing_texture:
- col.separator()
- col.label(text="Missing Canvas", icon='INFO')
- col.label(text="Add or assign a canvas image below")
- col.label(text="Canvas Image:")
- col.template_ID(toolsettings, "canvas", new="image.new", open="image.open")
-
- if toolsettings.missing_stencil:
- col.separator()
- col.label(text="Missing Stencil", icon='INFO')
- col.label(text="Add or assign a stencil image below")
- col.label(text="Stencil Image:")
- col.template_ID(toolsettings, "stencil_image", new="image.new", open="image.open")
-
-
# TODO, move to space_view3d.py
class VIEW3D_PT_tools_brush(Panel, View3DPaintPanel):
bl_context = ".paint_common" # dot on purpose (access from topbar)
@@ -454,9 +399,9 @@ class VIEW3D_PT_tools_brush(Panel, View3DPaintPanel):
self.prop_unified_strength(row, context, brush, "use_pressure_strength")
col.separator()
- col.prop(brush, "vertex_tool", text="Blend")
+ col.prop(brush, "blend", text="Blend")
- if brush.vertex_tool != 'SMEAR':
+ if brush.weight_tool != 'SMEAR':
col.prop(brush, "use_accumulate")
col.separator()
@@ -495,7 +440,7 @@ class VIEW3D_PT_tools_brush(Panel, View3DPaintPanel):
self.prop_unified_strength(row, context, brush, "use_pressure_strength")
col.separator()
- col.prop(brush, "vertex_tool", text="Blend")
+ col.prop(brush, "blend", text="Blend")
col.prop(brush, "use_alpha")
if brush.vertex_tool != 'SMEAR':
@@ -517,7 +462,7 @@ class VIEW3D_PT_tools_brush(Panel, View3DPaintPanel):
class TEXTURE_UL_texpaintslots(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
- mat = data
+ # mat = data
if self.layout_type in {'DEFAULT', 'COMPACT'}:
layout.prop(item, "name", text="", emboss=False, icon_value=icon)
@@ -538,10 +483,9 @@ class VIEW3D_MT_tools_projectpaint_uvlayer(Menu):
props.value = i
-# TODO, move to space_view3d.py
class VIEW3D_PT_slots_projectpaint(View3DPanel, Panel):
bl_context = ".imagepaint" # dot on purpose (access from topbar)
- bl_label = "Slots"
+ bl_label = "Texture Slots"
@classmethod
def poll(cls, context):
@@ -551,28 +495,25 @@ class VIEW3D_PT_slots_projectpaint(View3DPanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
settings = context.tool_settings.image_paint
- # brush = settings.brush
ob = context.active_object
- col = layout.column()
- col.label(text="Painting Mode:")
- col.prop(settings, "mode", text="")
- col.separator()
+ layout.prop(settings, "mode", text="Mode")
+ layout.separator()
if settings.mode == 'MATERIAL':
if len(ob.material_slots) > 1:
- col.label(text="Materials:")
- col.template_list("MATERIAL_UL_matslots", "layers",
- ob, "material_slots",
- ob, "active_material_index", rows=2)
-
+ layout.template_list("MATERIAL_UL_matslots", "layers",
+ ob, "material_slots",
+ ob, "active_material_index", rows=2)
mat = ob.active_material
- if mat:
- col.label(text="Available Paint Slots:")
- col.template_list("TEXTURE_UL_texpaintslots", "",
+ if mat and mat.texture_paint_images:
+ row = layout.row()
+ row.template_list("TEXTURE_UL_texpaintslots", "",
mat, "texture_paint_images",
mat, "paint_active_slot", rows=2)
@@ -581,26 +522,43 @@ class VIEW3D_PT_slots_projectpaint(View3DPanel, Panel):
else:
slot = None
- if slot and slot.is_valid:
- col.label(text="UV Map:")
- col.prop_search(slot, "uv_layer", ob.data, "uv_layers", text="")
+ have_image = slot is not None
+ else:
+ row = layout.row()
+
+ box = row.box()
+ box.label(text="No Textures")
+ have_image = False
+
+ sub = row.column(align=True)
+ sub.operator_menu_enum("paint.add_texture_paint_slot", "type", icon='ADD', text="")
elif settings.mode == 'IMAGE':
mesh = ob.data
uv_text = mesh.uv_layers.active.name if mesh.uv_layers.active else ""
- col.label(text="Canvas Image:")
- col.template_ID(settings, "canvas", new="image.new", open="image.open")
- col.label(text="UV Map:")
- col.menu("VIEW3D_MT_tools_projectpaint_uvlayer", text=uv_text, translate=False)
+ layout.template_ID(settings, "canvas", new="image.new", open="image.open")
+ if settings.missing_uvs:
+ layout.operator("paint.add_simple_uvs", icon='ADD', text="Add UVs")
+ else:
+ layout.menu("VIEW3D_MT_tools_projectpaint_uvlayer", text=uv_text, translate=False)
+ have_image = settings.canvas is not None
+
+ if settings.missing_uvs:
+ layout.separator()
+ split = layout.split()
+ split.label(text="UV Map Needed", icon='INFO')
+ split.operator("paint.add_simple_uvs", icon='ADD', text="Add Simple UVs")
+ elif have_image:
+ layout.separator()
+ layout.operator("image.save_dirty", text="Save All Images", icon='FILE_TICK')
- col.separator()
- col.operator("image.save_dirty", text="Save All Images")
+# TODO, move to space_view3d.py
-# TODO, move to space_view3d.py
class VIEW3D_PT_stencil_projectpaint(View3DPanel, Panel):
bl_context = ".imagepaint" # dot on purpose (access from topbar)
bl_label = "Mask"
+ bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
@@ -615,6 +573,7 @@ class VIEW3D_PT_stencil_projectpaint(View3DPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
toolsettings = context.tool_settings
ipaint = toolsettings.image_paint
@@ -648,6 +607,7 @@ class VIEW3D_PT_stencil_projectpaint(View3DPanel, Panel):
class VIEW3D_PT_tools_brush_overlay(Panel, View3DPaintPanel):
bl_context = ".paint_common" # dot on purpose (access from topbar)
bl_label = "Overlay"
+ bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
@@ -661,6 +621,8 @@ class VIEW3D_PT_tools_brush_overlay(Panel, View3DPaintPanel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
settings = self.paint_settings(context)
brush = settings.brush
@@ -669,54 +631,33 @@ class VIEW3D_PT_tools_brush_overlay(Panel, View3DPaintPanel):
col = layout.column()
- col.label(text="Curve:")
row = col.row(align=True)
- row.prop(
- brush,
- "use_cursor_overlay",
- text="",
- toggle=True,
- icon='RESTRICT_VIEW_OFF' if brush.use_cursor_overlay else 'RESTRICT_VIEW_ON',
- )
+
sub = row.row(align=True)
- sub.prop(brush, "cursor_overlay_alpha", text="Alpha")
+ sub.prop(brush, "cursor_overlay_alpha", text="Curve Alpha")
sub.prop(brush, "use_cursor_overlay_override", toggle=True, text="", icon='BRUSH_DATA')
+ row.prop(brush,"use_cursor_overlay", text="", toggle=True, icon='HIDE_ON' if brush.use_cursor_overlay else 'HIDE_OFF')
col.active = brush.brush_capabilities.has_overlay
if context.image_paint_object or context.sculpt_object or context.vertex_paint_object:
- col.label(text="Texture:")
row = col.row(align=True)
- if tex_slot.map_mode != 'STENCIL':
- row.prop(
- brush,
- "use_primary_overlay",
- text="",
- toggle=True,
- icon='RESTRICT_VIEW_OFF' if brush.use_primary_overlay else 'RESTRICT_VIEW_ON',
- )
sub = row.row(align=True)
- sub.prop(brush, "texture_overlay_alpha", text="Alpha")
+ sub.prop(brush, "texture_overlay_alpha", text="Texture Alpha")
sub.prop(brush, "use_primary_overlay_override", toggle=True, text="", icon='BRUSH_DATA')
+ if tex_slot.map_mode != 'STENCIL':
+ row.prop(brush, "use_primary_overlay", text="", toggle=True, icon='HIDE_ON' if brush.use_primary_overlay else 'HIDE_OFF')
if context.image_paint_object:
- col.label(text="Mask Texture:")
-
row = col.row(align=True)
- if tex_slot_mask.map_mode != 'STENCIL':
- row.prop(
- brush,
- "use_secondary_overlay",
- text="",
- toggle=True,
- icon='RESTRICT_VIEW_OFF' if brush.use_secondary_overlay else 'RESTRICT_VIEW_ON',
- )
sub = row.row(align=True)
- sub.prop(brush, "mask_overlay_alpha", text="Alpha")
+ sub.prop(brush, "mask_overlay_alpha", text="Mask Texture Alpha")
sub.prop(brush, "use_secondary_overlay_override", toggle=True, text="", icon='BRUSH_DATA')
+ if tex_slot_mask.map_mode != 'STENCIL':
+ row.prop(brush, "use_secondary_overlay", text="", toggle=True, icon='HIDE_ON' if brush.use_secondary_overlay else 'HIDE_OFF')
# TODO, move to space_view3d.py
@@ -789,84 +730,88 @@ class VIEW3D_PT_tools_brush_stroke(Panel, View3DPaintPanel):
settings = self.paint_settings(context)
brush = settings.brush
layout.use_property_split = True
+ layout.use_property_decorate = False
col = layout.column()
col.prop(brush, "stroke_method")
if brush.use_anchor:
- col.separator()
col.prop(brush, "use_edge_to_edge", text="Edge To Edge")
if brush.use_airbrush:
- col.separator()
col.prop(brush, "rate", text="Rate", slider=True)
if brush.use_space:
- col.separator()
row = col.row(align=True)
row.prop(brush, "spacing", text="Spacing")
row.prop(brush, "use_pressure_spacing", toggle=True, text="")
if brush.use_line or brush.use_curve:
- col.separator()
row = col.row(align=True)
row.prop(brush, "spacing", text="Spacing")
if brush.use_curve:
- col.separator()
col.template_ID(brush, "paint_curve", new="paintcurve.new")
col.operator("paintcurve.draw")
if context.sculpt_object:
if brush.sculpt_capabilities.has_jitter:
- col.separator()
- colsub = col.split(factor=0.5)
- row = colsub.row(align=True)
- row.alignment = 'RIGHT'
- row.label(text="Jitter")
- row = colsub.row(align=True)
- row.prop(brush, "use_relative_jitter", icon_only=True)
+ row = col.row(align=True)
if brush.use_relative_jitter:
- row.prop(brush, "jitter", slider=True, text="")
+ row.prop(brush, "jitter", slider=True)
else:
- row.prop(brush, "jitter_absolute", text="")
+ row.prop(brush, "jitter_absolute")
+ row.prop(brush, "use_relative_jitter", icon_only=True)
row.prop(brush, "use_pressure_jitter", toggle=True, text="")
- if brush.sculpt_capabilities.has_smooth_stroke:
- col = layout.column()
- col.separator()
-
- col.prop(brush, "use_smooth_stroke")
-
- sub = col.column()
- sub.active = brush.use_smooth_stroke
- sub.prop(brush, "smooth_stroke_radius", text="Radius", slider=True)
- sub.prop(brush, "smooth_stroke_factor", text="Factor", slider=True)
else:
- col.separator()
row = col.row(align=True)
- row.prop(brush, "use_relative_jitter", icon_only=True)
if brush.use_relative_jitter:
row.prop(brush, "jitter", slider=True)
else:
row.prop(brush, "jitter_absolute")
+ row.prop(brush, "use_relative_jitter", icon_only=True)
row.prop(brush, "use_pressure_jitter", toggle=True, text="")
col = layout.column()
- col.separator()
- if brush.brush_capabilities.has_smooth_stroke:
- col.prop(brush, "use_smooth_stroke")
+ layout.prop(settings, "input_samples")
- sub = col.column()
- sub.active = brush.use_smooth_stroke
- sub.prop(brush, "smooth_stroke_radius", text="Radius", slider=True)
- sub.prop(brush, "smooth_stroke_factor", text="Factor", slider=True)
- layout.prop(settings, "input_samples")
+class VIEW3D_PT_tools_brush_stroke_smooth_stroke(Panel, View3DPaintPanel):
+ bl_context = ".paint_common" # dot on purpose (access from topbar)
+ bl_label = "Smooth Stroke"
+ bl_parent_id = "VIEW3D_PT_tools_brush_stroke"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ settings = cls.paint_settings(context)
+ brush = settings.brush
+ if brush.brush_capabilities.has_smooth_stroke:
+ return True
+
+ def draw_header(self, context):
+ settings = self.paint_settings(context)
+ brush = settings.brush
+
+ self.layout.prop(brush, "use_smooth_stroke", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ settings = self.paint_settings(context)
+ brush = settings.brush
+
+ col = layout.column()
+ col.active = brush.use_smooth_stroke
+ col.prop(brush, "smooth_stroke_radius", text="Radius", slider=True)
+ col.prop(brush, "smooth_stroke_factor", text="Factor", slider=True)
# TODO, move to space_view3d.py
@@ -948,15 +893,37 @@ class VIEW3D_PT_sculpt_dyntopo(Panel, View3DPaintPanel):
col.prop(sculpt, "use_smooth_shading")
- col.separator()
+
+class VIEW3D_PT_sculpt_dyntopo_remesh(Panel, View3DPaintPanel):
+ bl_context = ".sculpt_mode" # dot on purpose (access from topbar)
+ bl_label = "Remesh"
+ bl_parent_id = "VIEW3D_PT_sculpt_dyntopo"
+ bl_options = {'DEFAULT_CLOSED'}
+ bl_ui_units_x = 12
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ toolsettings = context.tool_settings
+ sculpt = toolsettings.sculpt
+
+ col = layout.column()
+ col.active = context.sculpt_object.use_dynamic_topology_sculpting
col.prop(sculpt, "symmetrize_direction")
+
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+
+ col = flow.column()
col.operator("sculpt.symmetrize")
+ col = flow.column()
col.operator("sculpt.optimize")
if sculpt.detail_type_method in {'CONSTANT', 'MANUAL'}:
+ col = flow.column()
col.operator("sculpt.detail_flood_fill")
-
# TODO, move to space_view3d.py
class VIEW3D_PT_sculpt_options(Panel, View3DPaintPanel):
bl_context = ".sculpt_mode" # dot on purpose (access from topbar)
@@ -969,26 +936,64 @@ class VIEW3D_PT_sculpt_options(Panel, View3DPaintPanel):
def draw(self, context):
layout = self.layout
- # scene = context.scene
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ toolsettings = context.tool_settings
+ sculpt = toolsettings.sculpt
+
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+
+ col = flow.column()
+ col.prop(sculpt, "use_threaded", text="Threaded Sculpt")
+ col = flow.column()
+ col.prop(sculpt, "show_low_resolution")
+ col = flow.column()
+ col.prop(sculpt, "use_deform_only")
+ col = flow.column()
+ col.prop(sculpt, "show_diffuse_color")
+ col = flow.column()
+ col.prop(sculpt, "show_mask")
+
+
+class VIEW3D_PT_sculpt_options_unified(Panel, View3DPaintPanel):
+ bl_context = ".sculpt_mode" # dot on purpose (access from topbar)
+ bl_parent_id = "VIEW3D_PT_sculpt_options"
+ bl_label = "Unified Brush"
+
+ @classmethod
+ def poll(cls, context):
+ return (context.sculpt_object and context.tool_settings.sculpt)
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ self.unified_paint_settings(layout, context)
+
+class VIEW3D_PT_sculpt_options_gravity(Panel, View3DPaintPanel):
+ bl_context = ".sculpt_mode" # dot on purpose (access from topbar)
+ bl_parent_id = "VIEW3D_PT_sculpt_options"
+ bl_label = "Gravity"
+
+ @classmethod
+ def poll(cls, context):
+ return (context.sculpt_object and context.tool_settings.sculpt)
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
toolsettings = context.tool_settings
sculpt = toolsettings.sculpt
capabilities = sculpt.brush.sculpt_capabilities
- col = layout.column(align=True)
+ col = layout.column()
col.active = capabilities.has_gravity
- col.label(text="Gravity:")
col.prop(sculpt, "gravity", slider=True, text="Factor")
col.prop(sculpt, "gravity_object")
- col.separator()
-
- layout.prop(sculpt, "use_threaded", text="Threaded Sculpt")
- layout.prop(sculpt, "show_low_resolution")
- layout.prop(sculpt, "use_deform_only")
- layout.prop(sculpt, "show_diffuse_color")
- layout.prop(sculpt, "show_mask")
-
- self.unified_paint_settings(layout, context)
# TODO, move to space_view3d.py
@@ -1046,6 +1051,7 @@ class VIEW3D_PT_sculpt_symmetry(Panel, View3DPaintPanel):
row.prop(sculpt, "tile_z", text="Z", toggle=True)
layout.use_property_split = True
+ layout.use_property_decorate = False
layout.prop(sculpt, "use_symmetry_feather", text="Feather")
layout.column().prop(sculpt, "radial_symmetry", text="Radial")
@@ -1057,6 +1063,7 @@ class VIEW3D_PT_tools_brush_appearance(Panel, View3DPaintPanel):
bl_context = ".paint_common" # dot on purpose (access from topbar)
bl_label = "Appearance"
bl_parent_id = "VIEW3D_PT_tools_brush_overlay"
+ bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
@@ -1073,28 +1080,64 @@ class VIEW3D_PT_tools_brush_appearance(Panel, View3DPaintPanel):
layout.label(text="Brush Unset")
return
- col = layout.column()
- col.prop(settings, "show_brush")
- sub = col.column()
- sub.active = settings.show_brush
+class VIEW3D_PT_tools_brush_appearance_show_brush(Panel, View3DPaintPanel):
+ bl_context = ".paint_common" # dot on purpose (access from topbar)
+ bl_label = "Show Brush"
+ bl_parent_id = "VIEW3D_PT_tools_brush_appearance"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ def draw_header(self, context):
+ settings = self.paint_settings(context)
+
+ self.layout.prop(settings, "show_brush", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ settings = self.paint_settings(context)
+ brush = settings.brush
+
+ col = layout.column()
+ col.active = settings.show_brush
if context.sculpt_object and context.tool_settings.sculpt:
if brush.sculpt_capabilities.has_secondary_color:
- sub.row().prop(brush, "cursor_color_add", text="Add")
- sub.row().prop(brush, "cursor_color_subtract", text="Subtract")
+ col.prop(brush, "cursor_color_add", text="Add")
+ col.prop(brush, "cursor_color_subtract", text="Subtract")
else:
- sub.prop(brush, "cursor_color_add", text="")
+ col.prop(brush, "cursor_color_add", text="Color")
else:
- sub.prop(brush, "cursor_color_add", text="")
+ col.prop(brush, "cursor_color_add", text="Color")
- col.separator()
- col = col.column(align=True)
- col.prop(brush, "use_custom_icon")
- sub = col.column()
- sub.active = brush.use_custom_icon
- sub.prop(brush, "icon_filepath", text="")
+class VIEW3D_PT_tools_brush_appearance_custom_icon(Panel, View3DPaintPanel):
+ bl_context = ".paint_common" # dot on purpose (access from topbar)
+ bl_label = "Custom Icon"
+ bl_parent_id = "VIEW3D_PT_tools_brush_appearance"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ def draw_header(self, context):
+ settings = self.paint_settings(context)
+ brush = settings.brush
+
+ self.layout.prop(brush, "use_custom_icon", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ settings = self.paint_settings(context)
+ brush = settings.brush
+
+ col = layout.column()
+ col.active = brush.use_custom_icon
+ col.prop(brush, "icon_filepath", text="")
# ********** default tools for weight-paint ****************
@@ -1134,10 +1177,6 @@ class VIEW3D_PT_tools_weightpaint_options(Panel, View3DPaintPanel):
row.active = mesh.use_mirror_x
row.prop(mesh, "use_mirror_topology")
- col.label(text="Show Zero Weights:")
- sub = col.row()
- sub.prop(tool_settings, "vertex_group_user", expand=True)
-
self.unified_paint_settings(col, context)
# ********** default tools for vertex-paint ****************
@@ -1151,9 +1190,6 @@ class VIEW3D_PT_tools_vertexpaint(Panel, View3DPaintPanel):
def draw(self, context):
layout = self.layout
- toolsettings = context.tool_settings
- vpaint = toolsettings.vertex_paint
-
col = layout.column()
self.unified_paint_settings(col, context)
@@ -1183,17 +1219,22 @@ class VIEW3D_PT_tools_imagepaint_external(Panel, View3DPaintPanel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
toolsettings = context.tool_settings
ipaint = toolsettings.image_paint
- col = layout.column()
- row = col.split(factor=0.55, align=True)
- row.operator("image.project_edit", text="Quick Edit")
- row.operator("image.project_apply", text="Apply")
+ layout.prop(ipaint, "screen_grab_size", text="Screen Grab Size")
- col.row().prop(ipaint, "screen_grab_size", text="")
+ layout.separator()
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+ col = flow.column()
+ col.operator("image.project_edit", text="Quick Edit")
+ col = flow.column()
+ col.operator("image.project_apply", text="Apply")
+ col = flow.column()
col.operator("paint.project_image", text="Apply Camera Image")
@@ -1227,6 +1268,7 @@ class VIEW3D_PT_tools_imagepaint_symmetry(Panel, View3DPaintPanel):
class VIEW3D_PT_tools_projectpaint(View3DPaintPanel, Panel):
bl_context = ".imagepaint" # dot on purpose (access from topbar)
bl_label = "Project Paint"
+ bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
@@ -1236,14 +1278,12 @@ class VIEW3D_PT_tools_projectpaint(View3DPaintPanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
toolsettings = context.tool_settings
ipaint = toolsettings.image_paint
- col = layout.column()
-
- col.prop(ipaint, "use_occlude")
- col.prop(ipaint, "use_backface_culling")
-
row = layout.row()
row.prop(ipaint, "use_normal_falloff")
@@ -1251,14 +1291,51 @@ class VIEW3D_PT_tools_projectpaint(View3DPaintPanel, Panel):
sub.active = (ipaint.use_normal_falloff)
sub.prop(ipaint, "normal_angle", text="")
- layout.prop(ipaint, "use_cavity")
- if ipaint.use_cavity:
- layout.template_curve_mapping(ipaint, "cavity_curve", brush=True)
-
layout.prop(ipaint, "seam_bleed")
layout.prop(ipaint, "dither")
+
+ flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
+
+ col = flow.column()
+ col.prop(ipaint, "use_occlude")
+
+ col = flow.column()
+ col.prop(ipaint, "use_backface_culling")
+
+class VIEW3D_PT_tools_projectpaint_unified(Panel, View3DPaintPanel):
+ bl_context = ".imagepaint" # dot on purpose (access from topbar)
+ bl_parent_id = "VIEW3D_PT_tools_projectpaint"
+ bl_label = "Unified Brush"
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
self.unified_paint_settings(layout, context)
+class VIEW3D_PT_tools_projectpaint_cavity(View3DPaintPanel, Panel):
+ bl_context = ".imagepaint" # dot on purpose (access from topbar)
+ bl_label = "Cavity Mask"
+ bl_parent_id = "VIEW3D_PT_tools_projectpaint"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ def draw_header(self, context):
+ toolsettings = context.tool_settings
+ ipaint = toolsettings.image_paint
+
+ self.layout.prop(ipaint, "use_cavity", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ toolsettings = context.tool_settings
+ ipaint = toolsettings.image_paint
+
+ layout.active = ipaint.use_cavity
+
+ layout.template_curve_mapping(ipaint, "cavity_curve", brush=True)
+
# TODO, move to space_view3d.py
class VIEW3D_PT_imagepaint_options(View3DPaintPanel):
@@ -1345,8 +1422,8 @@ class VIEW3D_PT_tools_particlemode(View3DPanel, Panel):
col = layout.column(align=True)
col.active = pe.is_editable
- col.label(text="Draw:")
- col.prop(pe, "draw_step", text="Path Steps")
+ col.label(text="Display:")
+ col.prop(pe, "display_step", text="Path Steps")
if pe.is_hair:
col.prop(pe, "show_particles", text="Children")
else:
@@ -1361,22 +1438,18 @@ class VIEW3D_PT_tools_particlemode(View3DPanel, Panel):
class VIEW3D_PT_tools_normal(View3DPanel, Panel):
bl_category = ""
bl_context = ".mesh_edit"
- bl_label = "Normal Tools"
+ bl_label = "Normals"
+ bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
- toolsettings = context.tool_settings
-
- col = layout.column(align=True)
- col.label(text="Normal Vector")
- col.prop(toolsettings, "normal_vector", text="")
-
- layout.separator()
- layout.label(text="Face Strength")
- layout.prop(toolsettings, "face_strength", text="")
+ layout.use_property_split = True
+ layout.use_property_decorate = False # No animation.
- col = layout.column(align=True)
+ toolsettings = context.tool_settings
+ layout.prop(toolsettings, "normal_vector", text="Normal Vector")
+ layout.prop(toolsettings, "face_strength", text="Face Strength")
# ********** grease pencil object tool panels ****************
@@ -1419,37 +1492,44 @@ class VIEW3D_PT_tools_grease_pencil_brush(View3DPanel, Panel):
if brush is not None:
# XXX: Items in "sub" currently show up beside the brush selector in a separate column
- if gp_settings.gpencil_brush_type == 'ERASE':
- sub.prop(gp_settings, "default_eraser", text="")
+ if brush.gpencil_tool == 'ERASE':
+ sub.prop(gp_settings, "use_default_eraser", text="")
# Brush details
- if gp_settings.gpencil_brush_type == 'ERASE':
- col = layout.column(align=True)
- col.prop(brush, "size", text="Radius")
+ if brush.gpencil_tool == 'ERASE':
+ row = layout.row(align=True)
+ row.prop(brush, "size", text="Radius")
+ row.prop(gp_settings, "use_pressure", text="", icon='STYLUS_PRESSURE')
- col.separator()
- row = col.row()
- row.prop(gp_settings, "eraser_mode", expand=True)
- elif gp_settings.gpencil_brush_type == 'FILL':
+ if gp_settings.eraser_mode == 'SOFT':
+ row = layout.row(align=True)
+ row.prop(gp_settings, "pen_strength", slider=True)
+ row.prop(gp_settings, "use_strength_pressure", text="", icon='STYLUS_PRESSURE')
+ row = layout.row(align=True)
+ row.prop(gp_settings, "eraser_strength_factor")
+ row = layout.row(align=True)
+ row.prop(gp_settings, "eraser_thickness_factor")
+ elif brush.gpencil_tool == 'FILL':
col = layout.column(align=True)
- col.prop(gp_settings, "gpencil_fill_leak", text="Leak Size")
+ col.prop(gp_settings, "fill_leak", text="Leak Size")
+ col.separator()
col.prop(brush, "size", text="Thickness")
- col.prop(gp_settings, "gpencil_fill_simplyfy_level", text="Simplify")
+ col.prop(gp_settings, "fill_simplify_level", text="Simplify")
col = layout.row(align=True)
col.template_ID(gp_settings, "material")
row = layout.row(align=True)
- row.prop(gp_settings, "gpencil_fill_draw_mode", text="Boundary Draw Mode")
- row.prop(gp_settings, "gpencil_fill_show_boundary", text="", icon='GRID')
+ row.prop(gp_settings, "fill_draw_mode", text="Boundary Draw Mode")
+ row.prop(gp_settings, "show_fill_boundary", text="", icon='GRID')
col = layout.column(align=True)
- col.enabled = gp_settings.gpencil_fill_draw_mode != "STROKE"
- col.prop(gp_settings, "gpencil_fill_hide", text="Hide Transparent Lines")
+ col.enabled = gp_settings.fill_draw_mode != 'STROKE'
+ col.prop(gp_settings, "show_fill", text="Ignore Transparent Strokes")
sub = col.row(align=True)
- sub.enabled = gp_settings.gpencil_fill_hide
- sub.prop(gp_settings, "gpencil_fill_threshold", text="Threshold")
- else: # bgpsettings.gpencil_brush_type == 'DRAW':
+ sub.enabled = not gp_settings.show_fill
+ sub.prop(gp_settings, "fill_threshold", text="Threshold")
+ else: # bgpsettings.tool == 'DRAW':
row = layout.row(align=True)
row.prop(brush, "size", text="Radius")
row.prop(gp_settings, "use_pressure", text="", icon='STYLUS_PRESSURE')
@@ -1467,6 +1547,11 @@ class VIEW3D_PT_tools_grease_pencil_brush_option(View3DPanel, Panel):
bl_label = "Options"
bl_options = {'DEFAULT_CLOSED'}
+ @classmethod
+ def poll(cls, context):
+ brush = context.active_gpencil_brush
+ return brush is not None and brush.gpencil_tool != 'ERASE'
+
def draw_header_preset(self, context):
VIEW3D_PT_gpencil_brush_presets.draw_panel_header(self.layout)
@@ -1495,20 +1580,18 @@ class VIEW3D_PT_tools_grease_pencil_brush_option(View3DPanel, Panel):
class VIEW3D_PT_tools_grease_pencil_brush_stabilizer(View3DPanel, Panel):
bl_context = ".greasepencil_paint"
bl_parent_id = 'VIEW3D_PT_tools_grease_pencil_brush_option'
- bl_label = "Stabilizer"
+ bl_label = "Stabilizer Settings"
bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
brush = context.active_gpencil_brush
- gp_settings = brush.gpencil_settings
-
- return brush is not None and gp_settings.gpencil_brush_type == 'DRAW'
+ return brush is not None and brush.gpencil_tool == 'DRAW'
def draw_header(self, context):
brush = context.active_gpencil_brush
gp_settings = brush.gpencil_settings
- self.layout.prop(gp_settings, "use_stabilizer", text="")
+ self.layout.prop(gp_settings, "use_settings_stabilizer", text="")
@staticmethod
def draw(self, context):
@@ -1518,7 +1601,7 @@ class VIEW3D_PT_tools_grease_pencil_brush_stabilizer(View3DPanel, Panel):
brush = context.active_gpencil_brush
gp_settings = brush.gpencil_settings
- layout.active = gp_settings.use_stabilizer
+ layout.active = gp_settings.use_settings_stabilizer
layout.prop(brush, "smooth_stroke_radius", text="Radius", slider=True)
layout.prop(brush, "smooth_stroke_factor", text="Factor", slider=True)
@@ -1533,13 +1616,12 @@ class VIEW3D_PT_tools_grease_pencil_brush_settings(View3DPanel, Panel):
@classmethod
def poll(cls, context):
brush = context.active_gpencil_brush
-
- return brush is not None
+ return brush is not None and brush.gpencil_tool != 'ERASE'
def draw_header(self, context):
brush = context.active_gpencil_brush
gp_settings = brush.gpencil_settings
- self.layout.prop(gp_settings, "enable_settings", text="")
+ self.layout.prop(gp_settings, "use_settings_postprocess", text="")
@staticmethod
def draw(self, context):
@@ -1549,15 +1631,15 @@ class VIEW3D_PT_tools_grease_pencil_brush_settings(View3DPanel, Panel):
brush = context.active_gpencil_brush
gp_settings = brush.gpencil_settings
- layout.active = gp_settings.enable_settings
+ layout.active = gp_settings.use_settings_postprocess
col = layout.column(align=True)
col.prop(gp_settings, "pen_smooth_factor")
- col.prop(gp_settings, "pen_thick_smooth_factor")
+ col.prop(gp_settings, "pen_smooth_steps")
col = layout.column(align=True)
- col.prop(gp_settings, "pen_smooth_steps")
- col.prop(gp_settings, "pen_thick_smooth_steps")
+ col.prop(gp_settings, "pen_thick_smooth_factor")
+ col.prop(gp_settings, "pen_thick_smooth_steps", text="Iterations")
col = layout.column(align=True)
col.prop(gp_settings, "pen_subdivision_steps")
@@ -1573,13 +1655,12 @@ class VIEW3D_PT_tools_grease_pencil_brush_random(View3DPanel, Panel):
@classmethod
def poll(cls, context):
brush = context.active_gpencil_brush
-
- return brush is not None
+ return brush is not None and brush.gpencil_tool != 'ERASE'
def draw_header(self, context):
brush = context.active_gpencil_brush
gp_settings = brush.gpencil_settings
- self.layout.prop(gp_settings, "enable_random", text="")
+ self.layout.prop(gp_settings, "use_settings_random", text="")
@staticmethod
def draw(self, context):
@@ -1589,7 +1670,7 @@ class VIEW3D_PT_tools_grease_pencil_brush_random(View3DPanel, Panel):
brush = context.active_gpencil_brush
gp_settings = brush.gpencil_settings
- layout.active = gp_settings.enable_random
+ layout.active = gp_settings.use_settings_random
layout.prop(gp_settings, "random_pressure", text="Pressure", slider=True)
layout.prop(gp_settings, "random_strength", text="Strength", slider=True)
@@ -1606,6 +1687,21 @@ class VIEW3D_PT_tools_grease_pencil_brushcurves(View3DPanel, Panel):
bl_label = "Curves"
bl_options = {'DEFAULT_CLOSED'}
+ @classmethod
+ def poll(cls, context):
+ brush = context.active_gpencil_brush
+ return brush is not None and brush.gpencil_tool != 'ERASE'
+
+ @staticmethod
+ def draw(self, context):
+ layout = self.layout
+
+
+class VIEW3D_PT_tools_grease_pencil_brushcurves_sensitivity(View3DPanel, Panel):
+ bl_context = ".greasepencil_paint"
+ bl_label = "Sensitivity"
+ bl_parent_id ="VIEW3D_PT_tools_grease_pencil_brushcurves"
+
@staticmethod
def draw(self, context):
layout = self.layout
@@ -1614,39 +1710,39 @@ class VIEW3D_PT_tools_grease_pencil_brushcurves(View3DPanel, Panel):
brush = context.active_gpencil_brush
gp_settings = brush.gpencil_settings
- # Brush
- layout.label(text="Sensitivity")
layout.template_curve_mapping(gp_settings, "curve_sensitivity", brush=True)
- layout.label(text="Strength")
- layout.template_curve_mapping(gp_settings, "curve_strength", brush=True)
- layout.label(text="Jitter")
- layout.template_curve_mapping(gp_settings, "curve_jitter", brush=True)
+class VIEW3D_PT_tools_grease_pencil_brushcurves_strength(View3DPanel, Panel):
+ bl_context = ".greasepencil_paint"
+ bl_label = "Strength"
+ bl_parent_id ="VIEW3D_PT_tools_grease_pencil_brushcurves"
+ @staticmethod
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
-# Grease Pencil create shapes
-class VIEW3D_PT_tools_grease_pencil_shapes(View3DPanel, Panel):
- bl_space_type = 'VIEW_3D'
- bl_region_type = 'HEADER'
- bl_label = "Shapes"
+ brush = context.active_gpencil_brush
+ gp_settings = brush.gpencil_settings
- @classmethod
- def poll(cls, context):
- ob = context.active_object
- return ob and ob.type == 'GPENCIL'
+ layout.template_curve_mapping(gp_settings, "curve_strength", brush=True)
+
+
+class VIEW3D_PT_tools_grease_pencil_brushcurves_jitter(View3DPanel, Panel):
+ bl_context = ".greasepencil_paint"
+ bl_label = "Jitter"
+ bl_parent_id ="VIEW3D_PT_tools_grease_pencil_brushcurves"
@staticmethod
def draw(self, context):
layout = self.layout
layout.use_property_split = True
- col = layout.column(align=True)
- col.operator("gpencil.primitive", text="Line", icon='IPO_CONSTANT').type = 'LINE'
- col.operator("gpencil.primitive", text="Rectangle", icon='UV_FACESEL').type = 'BOX'
- col.operator("gpencil.primitive", text="Circle", icon='ANTIALIASED').type = 'CIRCLE'
+ brush = context.active_gpencil_brush
+ gp_settings = brush.gpencil_settings
- layout.operator("object.gpencil_add", text="Monkey", icon='MONKEY').type = 'MONKEY'
+ layout.template_curve_mapping(gp_settings, "curve_jitter", brush=True)
# Grease Pencil stroke editing tools
@@ -1705,14 +1801,14 @@ class VIEW3D_PT_tools_grease_pencil_interpolate(Panel):
class VIEW3D_PT_tools_grease_pencil_sculpt(GreasePencilStrokeSculptPanel, View3DPanel, Panel):
bl_context = ".greasepencil_sculpt"
bl_category = "Tools"
- bl_label = "Sculpt Strokes"
+ bl_label = "Brush"
# Grease Pencil weight painting tools
class VIEW3D_PT_tools_grease_pencil_weight_paint(View3DPanel, Panel):
bl_context = ".greasepencil_weight"
bl_category = "Tools"
- bl_label = "Weight Paint"
+ bl_label = "Brush"
@staticmethod
def draw(self, context):
@@ -1720,9 +1816,7 @@ class VIEW3D_PT_tools_grease_pencil_weight_paint(View3DPanel, Panel):
layout.use_property_split = True
layout.use_property_decorate = False
- gpd = context.gpencil_data
settings = context.tool_settings.gpencil_sculpt
- tool = settings.tool
brush = settings.brush
layout.template_icon_view(settings, "weight_tool", show_labels=True)
@@ -1747,6 +1841,12 @@ class VIEW3D_PT_tools_grease_pencil_sculpt_appearance(GreasePencilAppearancePane
bl_label = "Appearance"
+class VIEW3D_PT_tools_grease_pencil_sculpt_options(GreasePencilSculptOptionsPanel, View3DPanel, Panel):
+ bl_context = ".greasepencil_sculpt"
+ bl_label = "Sculpt Strokes"
+ bl_parent_id = 'VIEW3D_PT_tools_grease_pencil_sculpt'
+
+
class VIEW3D_PT_tools_grease_pencil_weight_appearance(GreasePencilAppearancePanel, View3DPanel, Panel):
bl_context = ".greasepencil_weight"
bl_label = "Appearance"
@@ -1765,21 +1865,26 @@ classes = (
VIEW3D_PT_tools_curveedit_options_stroke,
VIEW3D_PT_tools_armatureedit_options,
VIEW3D_PT_tools_posemode_options,
- VIEW3D_PT_imapaint_tools_missing,
+ VIEW3D_PT_slots_projectpaint,
VIEW3D_PT_tools_brush,
TEXTURE_UL_texpaintslots,
VIEW3D_MT_tools_projectpaint_uvlayer,
- VIEW3D_PT_slots_projectpaint,
VIEW3D_PT_stencil_projectpaint,
VIEW3D_PT_tools_brush_overlay,
VIEW3D_PT_tools_brush_texture,
VIEW3D_PT_tools_mask_texture,
VIEW3D_PT_tools_brush_stroke,
+ VIEW3D_PT_tools_brush_stroke_smooth_stroke,
VIEW3D_PT_tools_brush_curve,
VIEW3D_PT_sculpt_dyntopo,
+ VIEW3D_PT_sculpt_dyntopo_remesh,
VIEW3D_PT_sculpt_options,
+ VIEW3D_PT_sculpt_options_unified,
+ VIEW3D_PT_sculpt_options_gravity,
VIEW3D_PT_sculpt_symmetry,
VIEW3D_PT_tools_brush_appearance,
+ VIEW3D_PT_tools_brush_appearance_show_brush,
+ VIEW3D_PT_tools_brush_appearance_custom_icon,
VIEW3D_PT_tools_weightpaint_symmetry,
VIEW3D_PT_tools_weightpaint_options,
VIEW3D_PT_tools_vertexpaint,
@@ -1787,6 +1892,8 @@ classes = (
VIEW3D_PT_tools_imagepaint_external,
VIEW3D_PT_tools_imagepaint_symmetry,
VIEW3D_PT_tools_projectpaint,
+ VIEW3D_PT_tools_projectpaint_unified,
+ VIEW3D_PT_tools_projectpaint_cavity,
VIEW3D_MT_tools_projectpaint_stencil,
VIEW3D_PT_tools_particlemode,
@@ -1797,10 +1904,13 @@ classes = (
VIEW3D_PT_tools_grease_pencil_brush_stabilizer,
VIEW3D_PT_tools_grease_pencil_brush_random,
VIEW3D_PT_tools_grease_pencil_brushcurves,
- VIEW3D_PT_tools_grease_pencil_shapes,
+ VIEW3D_PT_tools_grease_pencil_brushcurves_sensitivity,
+ VIEW3D_PT_tools_grease_pencil_brushcurves_strength,
+ VIEW3D_PT_tools_grease_pencil_brushcurves_jitter,
VIEW3D_PT_tools_grease_pencil_sculpt,
VIEW3D_PT_tools_grease_pencil_weight_paint,
VIEW3D_PT_tools_grease_pencil_paint_appearance,
+ VIEW3D_PT_tools_grease_pencil_sculpt_options,
VIEW3D_PT_tools_grease_pencil_sculpt_appearance,
VIEW3D_PT_tools_grease_pencil_weight_appearance,
VIEW3D_PT_tools_grease_pencil_interpolate,
diff --git a/release/scripts/startup/keyingsets_builtins.py b/release/scripts/startup/keyingsets_builtins.py
index 0d904de1d27..9ba32150bbe 100644
--- a/release/scripts/startup/keyingsets_builtins.py
+++ b/release/scripts/startup/keyingsets_builtins.py
@@ -432,9 +432,9 @@ class BUILTIN_KSI_WholeCharacter(KeyingSetInfo):
# add Keying Set entry for this...
if use_groups:
- ks.paths.add(id_block, path, index, group_method='NAMED', group_name=bone.name)
+ ks.paths.add(id_block, path, index=index, group_method='NAMED', group_name=bone.name)
else:
- ks.paths.add(id_block, path, index)
+ ks.paths.add(id_block, path, index=index)
# ----------------
@@ -538,7 +538,7 @@ class BUILTIN_KSI_WholeCharacterSelected(KeyingSetInfo):
# iterator - all bones regardless of selection
def iterator(ksi, context, ks):
# Use either the selected bones, or all of them if none are selected.
- bones = context.selected_pose_bones or context.active_object.pose.bones
+ bones = context.selected_pose_bones_from_active_object or context.active_object.pose.bones
for bone in bones:
if bone.name.startswith(BUILTIN_KSI_WholeCharacter.badBonePrefixes):
diff --git a/release/scripts/templates_py/background_job.py b/release/scripts/templates_py/background_job.py
index 020dabeb258..c64c1de91d1 100644
--- a/release/scripts/templates_py/background_job.py
+++ b/release/scripts/templates_py/background_job.py
@@ -95,7 +95,7 @@ def main():
help="Render an image to the specified path",
)
- args = parser.parse_args(argv) # In this example we wont use the args
+ args = parser.parse_args(argv) # In this example we won't use the args
if not argv:
parser.print_help()
diff --git a/release/scripts/templates_py/batch_export.py b/release/scripts/templates_py/batch_export.py
index a07491742ec..54e5d166c36 100644
--- a/release/scripts/templates_py/batch_export.py
+++ b/release/scripts/templates_py/batch_export.py
@@ -18,7 +18,7 @@ bpy.ops.object.select_all(action='DESELECT')
for obj in selection:
- obj.select_set(action='SELECT')
+ obj.select_set(True)
# some exporters only use the active object
view_layer.objects.active = obj
@@ -31,7 +31,7 @@ for obj in selection:
# Can be used for multiple formats
# bpy.ops.export_scene.x3d(filepath=fn + ".x3d", use_selection=True)
- obj.select_set(action='DESELECT')
+ obj.select_set(False)
print("written:", fn)
@@ -39,4 +39,4 @@ for obj in selection:
view_layer.objects.active = obj_active
for obj in selection:
- obj.select_set(action='SELECT')
+ obj.select_set(True)
diff --git a/release/scripts/templates_py/builtin_keyingset.py b/release/scripts/templates_py/builtin_keyingset.py
index 19f92dc75e7..cafbc2df542 100644
--- a/release/scripts/templates_py/builtin_keyingset.py
+++ b/release/scripts/templates_py/builtin_keyingset.py
@@ -22,7 +22,7 @@ class BUILTIN_KSI_hello(bpy.types.KeyingSetInfo):
for i in range(5):
ks.paths.add(id_block, "layers", i, group_method='NAMED', group_name="5x Hello Layers")
- ks.paths.add(id_block, "show_x_ray", group_method='NONE')
+ ks.paths.add(id_block, "show_in_front", group_method='NONE')
def register():
diff --git a/release/scripts/templates_py/gizmo_custom_geometry.py b/release/scripts/templates_py/gizmo_custom_geometry.py
index 8125498fa85..fba2b0269c4 100644
--- a/release/scripts/templates_py/gizmo_custom_geometry.py
+++ b/release/scripts/templates_py/gizmo_custom_geometry.py
@@ -96,7 +96,7 @@ class MyCustomShapeWidget(Gizmo):
return {'RUNNING_MODAL'}
def exit(self, context, cancel):
- context.area.header_text_set()
+ context.area.header_text_set(None)
if cancel:
self.target_set_value("offset", self.init_value)
@@ -129,7 +129,6 @@ class MyCustomShapeWidgetGroup(GizmoGroup):
ob = context.object
mpr = self.gizmos.new(MyCustomShapeWidget.bl_idname)
mpr.target_set_prop("offset", ob.data, "energy")
- mpr.matrix_basis = ob.matrix_world.normalized()
mpr.color = 1.0, 0.5, 1.0
mpr.alpha = 0.5
diff --git a/release/scripts/templates_py/gizmo_operator.py b/release/scripts/templates_py/gizmo_operator.py
index bdc1bc9893c..524dd1dd20e 100644
--- a/release/scripts/templates_py/gizmo_operator.py
+++ b/release/scripts/templates_py/gizmo_operator.py
@@ -1,6 +1,6 @@
# Example of an operator which uses gizmos to control its properties.
#
-# Usage: Run this script, then in mesh edit-mode press Spacebar
+# Usage: Run this script, then in mesh edit-mode press F3
# to activate the operator "Select Side of Plane"
# The gizmos can then be used to adjust the plane in the 3D view.
#
@@ -26,7 +26,7 @@ def main(context, plane_co, plane_no):
plane_dot = plane_no.dot(plane_co)
for v in bm.verts:
- co = matrix * v.co
+ co = matrix @ v.co
v.select = (plane_no.dot(co) > plane_dot)
bm.select_flush_mode()
@@ -114,20 +114,20 @@ class SelectSideOfPlaneGizmoGroup(GizmoGroup):
from mathutils import Matrix, Vector
# ----
- # Grab
+ # Move
- def grab_get_cb():
+ def move_get_cb():
op = SelectSideOfPlaneGizmoGroup.my_target_operator(context)
return op.plane_co
- def grab_set_cb(value):
+ def move_set_cb(value):
op = SelectSideOfPlaneGizmoGroup.my_target_operator(context)
op.plane_co = value
# XXX, this may change!
op.execute(context)
- mpr = self.gizmos.new("GIZMO_GT_grab_3d")
- mpr.target_set_handler("offset", get=grab_get_cb, set=grab_set_cb)
+ mpr = self.gizmos.new("GIZMO_GT_move_3d")
+ mpr.target_set_handler("offset", get=move_get_cb, set=move_set_cb)
mpr.use_draw_value = True
@@ -139,7 +139,7 @@ class SelectSideOfPlaneGizmoGroup(GizmoGroup):
mpr.scale_basis = 0.2
- self.widget_grab = mpr
+ self.widget_move = mpr
# ----
# Dial
@@ -150,14 +150,14 @@ class SelectSideOfPlaneGizmoGroup(GizmoGroup):
no_a = self.widget_dial.matrix_basis.col[1].xyz
no_b = Vector(op.plane_no)
- no_a = (no_a * self.view_inv).xy.normalized()
- no_b = (no_b * self.view_inv).xy.normalized()
+ no_a = (no_a @ self.view_inv).xy.normalized()
+ no_b = (no_b @ self.view_inv).xy.normalized()
return no_a.angle_signed(no_b)
def direction_set_cb(value):
op = SelectSideOfPlaneGizmoGroup.my_target_operator(context)
matrix_rotate = Matrix.Rotation(-value, 3, self.rotate_axis)
- no = matrix_rotate * self.widget_dial.matrix_basis.col[1].xyz
+ no = matrix_rotate @ self.widget_dial.matrix_basis.col[1].xyz
op.plane_no = no
op.execute(context)
@@ -189,12 +189,12 @@ class SelectSideOfPlaneGizmoGroup(GizmoGroup):
co = Vector(op.plane_co)
no = Vector(op.plane_no).normalized()
- # Grab
+ # Move
no_z = no
no_y = no_z.orthogonal()
no_x = no_z.cross(no_y)
- matrix = self.widget_grab.matrix_basis
+ matrix = self.widget_move.matrix_basis
matrix.identity()
matrix.col[0].xyz = no_x
matrix.col[1].xyz = no_y
diff --git a/release/scripts/templates_py/operator_modal_view3d.py b/release/scripts/templates_py/operator_modal_view3d.py
index 9d371446829..93c5ae84e2c 100644
--- a/release/scripts/templates_py/operator_modal_view3d.py
+++ b/release/scripts/templates_py/operator_modal_view3d.py
@@ -29,12 +29,12 @@ class ViewOperator(bpy.types.Operator):
context.area.header_text_set("Offset %.4f %.4f %.4f" % tuple(self.offset))
elif event.type == 'LEFTMOUSE':
- context.area.header_text_set()
+ context.area.header_text_set(None)
return {'FINISHED'}
elif event.type in {'RIGHTMOUSE', 'ESC'}:
rv3d.view_location = self._initial_location
- context.area.header_text_set()
+ context.area.header_text_set(None)
return {'CANCELLED'}
return {'RUNNING_MODAL'}
diff --git a/release/scripts/templates_py/operator_modal_view3d_raycast.py b/release/scripts/templates_py/operator_modal_view3d_raycast.py
index 613501143f7..103c13dc1c2 100644
--- a/release/scripts/templates_py/operator_modal_view3d_raycast.py
+++ b/release/scripts/templates_py/operator_modal_view3d_raycast.py
@@ -67,7 +67,7 @@ def main(context, event):
# now we have the object under the mouse cursor,
# we could do lots of stuff but for the example just select.
if best_obj is not None:
- best_obj.select_set(action='SELECT')
+ best_obj.select_set(True)
context.view_layer.objects.active = best_obj
diff --git a/release/scripts/templates_py/ui_tool_simple.py b/release/scripts/templates_py/ui_tool_simple.py
new file mode 100644
index 00000000000..920a23b081a
--- /dev/null
+++ b/release/scripts/templates_py/ui_tool_simple.py
@@ -0,0 +1,35 @@
+# This example adds an object mode tool to the toolbar.
+# This is just the circle-select tool.
+import bpy
+from bpy.utils.toolsystem import ToolDef
+
+@ToolDef.from_fn
+def my_tool():
+ def draw_settings(context, layout, tool):
+ props = tool.operator_properties("view3d.select_circle")
+ layout.prop(props, "radius")
+ return dict(
+ text="My Circle Select",
+ description=(
+ "This is a tooltip\n"
+ "with multiple lines"
+ ),
+ icon="ops.generic.select_circle",
+ widget=None,
+ keymap=(
+ ("view3d.select_circle", dict(deselect=False), dict(type='ACTIONMOUSE', value='PRESS')),
+ ("view3d.select_circle", dict(deselect=True), dict(type='ACTIONMOUSE', value='PRESS', ctrl=True)),
+ ),
+ draw_settings=draw_settings,
+ )
+
+
+def register():
+ bpy.utils.register_tool('VIEW_3D', 'OBJECT', my_tool)
+
+
+def unregister():
+ bpy.utils.unregister_tool('VIEW_3D', 'OBJECT', my_tool)
+
+if __name__ == "__main__":
+ register()
diff --git a/release/text/readme.html b/release/text/readme.html
index 47c8596e996..e23d1ac5b0f 100644
--- a/release/text/readme.html
+++ b/release/text/readme.html
@@ -23,8 +23,8 @@
<p class="p3"><b>About</b></p>
<p class="p4">
Welcome to Blender, the free, open source 3D application for modeling, animation, rendering,
-compositing, video editing and game creation.
-Blender is available for Linux, Mac OS X and Windows and has a large world-wide community.
+compositing and video editing.
+Blender is available for Linux, macOS and Windows and has a large world-wide community.
</p>
<p class="p4">
Blender can be used freely for any purpose, including commercial use and distribution.
@@ -66,7 +66,7 @@ To launch Blender, double-click on Blender.exe.
<b>Linux: </b>Unpack the archive, then run the Blender executable.
</p>
<p class="p4">
-<b>Mac OS X: </b>The downloaded package includes blender.app.
+<b>macOS: </b>The downloaded package includes blender.app.
Optionally copy this to your Applications folder, and add it to the dock by dragging it from there to the dock.
</p>
<p class="p2"><br></p>
diff --git a/source/blender/alembic/intern/abc_archive.h b/source/blender/alembic/intern/abc_archive.h
index 84309fbc9df..5696aed9ef3 100644
--- a/source/blender/alembic/intern/abc_archive.h
+++ b/source/blender/alembic/intern/abc_archive.h
@@ -53,7 +53,7 @@ public:
/**
* Returns true when either Blender is compiled with HDF5 support and
- * the archive was succesfully opened (valid() will also return true),
+ * the archive was successfully opened (valid() will also return true),
* or when Blender was built without HDF5 support but a HDF5 file was
* detected (valid() will return false).
*/
diff --git a/source/blender/alembic/intern/abc_curves.cc b/source/blender/alembic/intern/abc_curves.cc
index e27403305da..f9880eda451 100644
--- a/source/blender/alembic/intern/abc_curves.cc
+++ b/source/blender/alembic/intern/abc_curves.cc
@@ -153,7 +153,7 @@ void AbcCurveWriter::do_write()
if (nurbs->knotsu != NULL) {
const size_t num_knots = KNOTSU(nurbs);
- /* Add an extra knot at the beggining and end of the array since most apps
+ /* Add an extra knot at the beginning and end of the array since most apps
* require/expect them. */
knots.resize(num_knots + 2);
diff --git a/source/blender/alembic/intern/abc_customdata.cc b/source/blender/alembic/intern/abc_customdata.cc
index 0ae6825d489..f62e0ec214e 100644
--- a/source/blender/alembic/intern/abc_customdata.cc
+++ b/source/blender/alembic/intern/abc_customdata.cc
@@ -185,7 +185,11 @@ static void write_mcol(const OCompoundProperty &prop, const CDStreamConfig &conf
MLoop *mloops = config.mloop;
MCol *cfaces = static_cast<MCol *>(data);
- std::vector<Imath::C4f> buffer(config.totvert);
+ std::vector<Imath::C4f> buffer;
+ std::vector<uint32_t> indices;
+
+ buffer.reserve(config.totvert);
+ indices.reserve(config.totvert);
Imath::C4f col;
@@ -203,7 +207,8 @@ static void write_mcol(const OCompoundProperty &prop, const CDStreamConfig &conf
col[2] = cface->g * cscale;
col[3] = cface->b * cscale;
- buffer[mloop->v] = col;
+ buffer.push_back(col);
+ indices.push_back(buffer.size() - 1);
}
}
@@ -211,6 +216,7 @@ static void write_mcol(const OCompoundProperty &prop, const CDStreamConfig &conf
OC4fGeomParam::Sample sample(
C4fArraySample(&buffer.front(), buffer.size()),
+ UInt32ArraySample(&indices.front(), indices.size()),
kVertexScope);
param.set(sample);
diff --git a/source/blender/alembic/intern/abc_exporter.cc b/source/blender/alembic/intern/abc_exporter.cc
index d050f3b78b1..d470488937a 100644
--- a/source/blender/alembic/intern/abc_exporter.cc
+++ b/source/blender/alembic/intern/abc_exporter.cc
@@ -421,7 +421,7 @@ void AbcExporter::exploreTransform(Base *ob_base, Object *parent, Object *dupliO
}
}
-AbcTransformWriter * AbcExporter::createTransformWriter(Object *ob, Object *parent, Object *dupliObParent)
+AbcTransformWriter *AbcExporter::createTransformWriter(Object *ob, Object *parent, Object *dupliObParent)
{
/* An object should not be its own parent, or we'll get infinite loops. */
BLI_assert(ob != parent);
diff --git a/source/blender/alembic/intern/abc_exporter.h b/source/blender/alembic/intern/abc_exporter.h
index a92e426292c..74af85bfef9 100644
--- a/source/blender/alembic/intern/abc_exporter.h
+++ b/source/blender/alembic/intern/abc_exporter.h
@@ -116,7 +116,7 @@ private:
Alembic::Abc::TimeSamplingPtr createTimeSampling(double step);
void createTransformWritersHierarchy();
- AbcTransformWriter * createTransformWriter(Object *ob, Object *parent, Object *dupliObParent);
+ AbcTransformWriter *createTransformWriter(Object *ob, Object *parent, Object *dupliObParent);
void exploreTransform(Base *ob_base, Object *parent, Object *dupliObParent);
void exploreObject(Base *ob_base, Object *dupliObParent);
void createShapeWriters();
diff --git a/source/blender/alembic/intern/abc_hair.cc b/source/blender/alembic/intern/abc_hair.cc
index 83a46a330fd..efe8ea6e79e 100644
--- a/source/blender/alembic/intern/abc_hair.cc
+++ b/source/blender/alembic/intern/abc_hair.cc
@@ -37,7 +37,6 @@ extern "C" {
#include "BLI_listbase.h"
#include "BLI_math_geom.h"
-#include "BKE_library.h"
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
#include "BKE_object.h"
@@ -133,7 +132,7 @@ void AbcHairWriter::write_hair_sample(Mesh *mesh,
m_uv_warning_shown = true;
}
- ParticleData * pa = m_psys->particles;
+ ParticleData *pa = m_psys->particles;
int k;
ParticleCacheKey **cache = m_psys->pathcache;
diff --git a/source/blender/alembic/intern/abc_mball.cc b/source/blender/alembic/intern/abc_mball.cc
index 04bfb39fcc5..b9b4feab52a 100644
--- a/source/blender/alembic/intern/abc_mball.cc
+++ b/source/blender/alembic/intern/abc_mball.cc
@@ -31,7 +31,7 @@ extern "C" {
#include "BKE_curve.h"
#include "BKE_displist.h"
-#include "BKE_main.h"
+#include "BKE_library.h"
#include "BKE_mball.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
diff --git a/source/blender/alembic/intern/abc_mesh.cc b/source/blender/alembic/intern/abc_mesh.cc
index 2b739837239..50698ef728e 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -38,6 +38,7 @@ extern "C" {
#include "BLI_math_geom.h"
#include "BLI_string.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
@@ -505,10 +506,10 @@ void AbcMeshWriter::writeSubD(struct Mesh *mesh)
}
template <typename Schema>
-void AbcMeshWriter::writeFaceSets(struct Mesh *dm, Schema &schema)
+void AbcMeshWriter::writeFaceSets(struct Mesh *me, Schema &schema)
{
std::map< std::string, std::vector<int32_t> > geo_groups;
- getGeoGroups(dm, geo_groups);
+ getGeoGroups(me, geo_groups);
std::map< std::string, std::vector<int32_t> >::iterator it;
for (it = geo_groups.begin(); it != geo_groups.end(); ++it) {
@@ -546,8 +547,7 @@ Mesh *AbcMeshWriter::getFinalMesh(bool &r_needsfree)
BM_mesh_triangulate(bm, quad_method, ngon_method, tag_only, NULL, NULL, NULL);
- struct BMeshToMeshParams bmmp = {0};
- Mesh *result = BKE_bmesh_to_mesh_nomain(bm, &bmmp);
+ Mesh *result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BM_mesh_free(bm);
mesh = result;
@@ -564,7 +564,7 @@ Mesh *AbcMeshWriter::getFinalMesh(bool &r_needsfree)
return mesh;
}
-void AbcMeshWriter::writeArbGeoParams(struct Mesh *dm)
+void AbcMeshWriter::writeArbGeoParams(struct Mesh *me)
{
if (m_is_liquid) {
/* We don't need anything more for liquid meshes. */
@@ -573,10 +573,10 @@ void AbcMeshWriter::writeArbGeoParams(struct Mesh *dm)
if (m_first_frame && m_settings.export_vcols) {
if (m_subdiv_schema.valid()) {
- write_custom_data(m_subdiv_schema.getArbGeomParams(), m_custom_data_config, &dm->ldata, CD_MLOOPCOL);
+ write_custom_data(m_subdiv_schema.getArbGeomParams(), m_custom_data_config, &me->ldata, CD_MLOOPCOL);
}
else {
- write_custom_data(m_mesh_schema.getArbGeomParams(), m_custom_data_config, &dm->ldata, CD_MLOOPCOL);
+ write_custom_data(m_mesh_schema.getArbGeomParams(), m_custom_data_config, &me->ldata, CD_MLOOPCOL);
}
}
}
diff --git a/source/blender/alembic/intern/abc_nurbs.cc b/source/blender/alembic/intern/abc_nurbs.cc
index bf41b44e418..fcb2f5c5ec5 100644
--- a/source/blender/alembic/intern/abc_nurbs.cc
+++ b/source/blender/alembic/intern/abc_nurbs.cc
@@ -102,7 +102,7 @@ static void get_knots(std::vector<float> &knots, const int num_knots, float *nu_
return;
}
- /* Add an extra knot at the beggining and end of the array since most apps
+ /* Add an extra knot at the beginning and end of the array since most apps
* require/expect them. */
knots.reserve(num_knots + 2);
@@ -166,7 +166,7 @@ void AbcNurbsWriter::do_write()
sample.setNu(nu->pntsu);
sample.setNv(nu->pntsv);
- /* TODO(kevin): to accomodate other software we should duplicate control
+ /* TODO(kevin): to accommodate other software we should duplicate control
* points to indicate that a NURBS is cyclic. */
OCompoundProperty user_props = m_nurbs_schema[count].getUserProperties();
diff --git a/source/blender/alembic/intern/abc_points.cc b/source/blender/alembic/intern/abc_points.cc
index 9ff995ffcbf..c748139a0e6 100644
--- a/source/blender/alembic/intern/abc_points.cc
+++ b/source/blender/alembic/intern/abc_points.cc
@@ -61,10 +61,10 @@ using Alembic::AbcGeom::OPointsSchema;
/* ************************************************************************** */
AbcPointsWriter::AbcPointsWriter(Object *ob,
- AbcTransformWriter *parent,
- uint32_t time_sampling,
- ExportSettings &settings,
- ParticleSystem *psys)
+ AbcTransformWriter *parent,
+ uint32_t time_sampling,
+ ExportSettings &settings,
+ ParticleSystem *psys)
: AbcObjectWriter(ob, time_sampling, settings, parent)
{
m_psys = psys;
diff --git a/source/blender/alembic/intern/abc_util.h b/source/blender/alembic/intern/abc_util.h
index fcc3b19c48b..fae73ec9d11 100644
--- a/source/blender/alembic/intern/abc_util.h
+++ b/source/blender/alembic/intern/abc_util.h
@@ -167,7 +167,7 @@ typedef enum {
} AbcAxisSwapMode;
/* Create a rotation matrix for each axis from euler angles.
- * Euler angles are swaped to change coordinate system. */
+ * Euler angles are swapped to change coordinate system. */
void create_swapped_rotation_matrix(
float rot_x_mat[3][3], float rot_y_mat[3][3],
float rot_z_mat[3][3], const float euler[3],
@@ -197,7 +197,7 @@ public:
/* *************************** */
/**
- * Utility class whose purpose is to more easily log related informations. An
+ * Utility class whose purpose is to more easily log related information. An
* instance of the SimpleLogger can be created in any context, and will hold a
* copy of all the strings passed to its output stream.
*
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index 79dfb8c2b58..e1d4eb3490b 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -51,7 +51,6 @@ extern "C" {
#include "BKE_global.h"
#include "BKE_layer.h"
#include "BKE_library.h"
-#include "BKE_main.h"
#include "BKE_scene.h"
#include "DEG_depsgraph.h"
@@ -301,7 +300,7 @@ static void export_endjob(void *customdata)
if (!data->settings.logger.empty()) {
std::cerr << data->settings.logger;
- WM_report(RPT_ERROR, "Errors occured during the export, look in the console to know more...");
+ WM_report(RPT_ERROR, "Errors occurred during the export, look in the console to know more...");
}
G.is_rendering = false;
@@ -327,7 +326,7 @@ bool ABC_export(
* ExportJobData contains an ExportSettings containing a SimpleLogger.
*
* Since ExportJobData is a C-style struct dynamically allocated with
- * MEM_mallocN (see above), its construtor is never called, therefore the
+ * MEM_mallocN (see above), its constructor is never called, therefore the
* ExportSettings constructor is not called which implies that the
* SimpleLogger one is not called either. SimpleLogger in turn does not call
* the constructor of its data members which ultimately means that its
@@ -648,39 +647,6 @@ struct ImportJobData {
bool import_ok;
};
-#if 0
-ABC_INLINE bool is_mesh_and_strands(const IObject &object)
-{
- bool has_mesh = false;
- bool has_curve = false;
-
- for (int i = 0; i < object.getNumChildren(); ++i) {
- const IObject &child = object.getChild(i);
-
- if (!child.valid()) {
- continue;
- }
-
- const MetaData &md = child.getMetaData();
-
- if (IPolyMesh::matches(md)) {
- has_mesh = true;
- }
- else if (ISubD::matches(md)) {
- has_mesh = true;
- }
- else if (ICurves::matches(md)) {
- has_curve = true;
- }
- else if (IPoints::matches(md)) {
- has_curve = true;
- }
- }
-
- return has_mesh && has_curve;
-}
-#endif
-
static void import_startjob(void *user_data, short *stop, short *do_update, float *progress)
{
SCOPE_TIMER("Alembic import, objects reading and creation");
@@ -826,7 +792,7 @@ static void import_endjob(void *user_data)
for (iter = data->readers.begin(); iter != data->readers.end(); ++iter) {
Object *ob = (*iter)->object();
- /* It's possible that cancellation occured between the creation of
+ /* It's possible that cancellation occurred between the creation of
* the reader and the creation of the Blender object. */
if (ob == NULL) continue;
@@ -845,12 +811,12 @@ static void import_endjob(void *user_data)
for (iter = data->readers.begin(); iter != data->readers.end(); ++iter) {
Object *ob = (*iter)->object();
- ob->lay = data->scene->lay;
BKE_collection_object_add(data->bmain, lc->collection, ob);
base = BKE_view_layer_base_find(view_layer, ob);
- BKE_view_layer_base_select(view_layer, base);
+ /* TODO: is setting active needed? */
+ BKE_view_layer_base_select_and_set_active(view_layer, base);
DEG_id_tag_update(&lc->collection->id, DEG_TAG_COPY_ON_WRITE);
DEG_id_tag_update_ex(data->bmain, &ob->id,
diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c
index 2d8a0b0038f..94f409d2753 100644
--- a/source/blender/avi/intern/avi.c
+++ b/source/blender/avi/intern/avi.c
@@ -64,7 +64,7 @@ char *tcc_to_char(unsigned int tcc);
-/* implemetation */
+/* implementation */
unsigned int GET_FCC(FILE *fp)
{
@@ -200,35 +200,6 @@ AviError AVI_print_error(AviError in_error)
return in_error;
}
-#if 0
-void AVI_set_debug(int mode)
-{
- AVI_DEBUG = mode;
-}
-
-bool AVI_is_avi(char *name)
-{
- FILE *fp;
- int ret;
-
- fp = BLI_fopen(name, "rb");
- if (fp == NULL)
- return 0;
-
- if (GET_FCC(fp) != FCC("RIFF") ||
- !GET_FCC(fp) ||
- GET_FCC(fp) != FCC("AVI "))
- {
- ret = 0;
- }
- else {
- ret = 1;
- }
-
- fclose(fp);
- return ret;
-}
-#endif
bool AVI_is_avi(const char *name)
{
@@ -286,7 +257,7 @@ bool AVI_is_avi(const char *name)
fseek(movie.fp, movie.header->size - 14 * 4, SEEK_CUR);
/* Limit number of streams to some reasonable amount to prevent
- * buffer oveflow vulnerabilities. */
+ * buffer overflow vulnerabilities. */
if (movie.header->Streams < 1 || movie.header->Streams > 65536) {
DEBUG_PRINT("Number of streams should be in range 1-65536\n");
fclose(movie.fp);
@@ -489,7 +460,7 @@ AviError AVI_open_movie(const char *name, AviMovie *movie)
fseek(movie->fp, movie->header->size - 14 * 4, SEEK_CUR);
/* Limit number of streams to some reasonable amount to prevent
- * buffer oveflow vulnerabilities. */
+ * buffer overflow vulnerabilities. */
if (movie->header->Streams < 1 || movie->header->Streams > 65536) {
DEBUG_PRINT("Number of streams should be in range 1-65536\n");
return AVI_ERROR_FORMAT;
@@ -687,7 +658,7 @@ AviError AVI_open_movie(const char *name, AviMovie *movie)
movie->read_offset = 4;
}
- DEBUG_PRINT("movie succesfully opened\n");
+ DEBUG_PRINT("movie successfully opened\n");
return AVI_ERROR_NONE;
}
@@ -806,7 +777,7 @@ AviError AVI_open_compress(char *name, AviMovie *movie, int streams, ...)
movie->header->Reserved[3] = 0;
/* Limit number of streams to some reasonable amount to prevent
- * buffer oveflow vulnerabilities. */
+ * buffer overflow vulnerabilities. */
if (movie->header->Streams < 0 || movie->header->Streams > 65536) {
DEBUG_PRINT("Number of streams should be in range 0-65536\n");
return AVI_ERROR_FORMAT;
@@ -850,14 +821,6 @@ AviError AVI_open_compress(char *name, AviMovie *movie, int streams, ...)
movie->streams[i].sh.bottom = 0;
if (movie->streams[i].sh.Type == FCC("vids")) {
-#if 0
- if (movie->streams[i].format == AVI_FORMAT_MJPEG) {
- movie->streams[i].sf = MEM_mallocN(sizeof(AviBitmapInfoHeader) +
- sizeof(AviMJPEGUnknown), "moviestreamformatL");
- movie->streams[i].sf_size = sizeof(AviBitmapInfoHeader) + sizeof(AviMJPEGUnknown);
- }
- else {
-#endif
movie->streams[i].sf = MEM_mallocN(sizeof(AviBitmapInfoHeader), "moviestreamformatS");
movie->streams[i].sf_size = sizeof(AviBitmapInfoHeader);
@@ -874,26 +837,6 @@ AviError AVI_open_compress(char *name, AviMovie *movie, int streams, ...)
((AviBitmapInfoHeader *) movie->streams[i].sf)->YPelsPerMeter = 0;
((AviBitmapInfoHeader *) movie->streams[i].sf)->ClrUsed = 0;
((AviBitmapInfoHeader *) movie->streams[i].sf)->ClrImportant = 0;
-
-#if 0
- if (movie->streams[i].format == AVI_FORMAT_MJPEG) {
- AviMJPEGUnknown *tmp;
-
- tmp = (AviMJPEGUnknown *)((char *) movie->streams[i].sf + sizeof(AviBitmapInfoHeader));
-
- tmp->a = 44;
- tmp->b = 24;
- tmp->c = 0;
- tmp->d = 2;
- tmp->e = 8;
- tmp->f = 2;
- tmp->g = 1;
- }
- }
- else if (movie->streams[i].sh.Type == FCC("auds")) {
- /* pass */
- }
-#endif
}
}
diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c
index ff5c1151a82..f37ed3cb54f 100644
--- a/source/blender/blenfont/intern/blf_dir.c
+++ b/source/blender/blenfont/intern/blf_dir.c
@@ -154,32 +154,6 @@ char *blf_dir_search(const char *file)
return s;
}
-#if 0 /* UNUSED */
-int blf_dir_split(const char *str, char *file, int *size)
-{
- int i, len;
- char *s;
-
- /* Window, Linux or Mac, this is always / */
- s = strrchr(str, '/');
- if (s) {
- len = s - str;
- for (i = 0; i < len; i++)
- file[i] = str[i];
-
- file[i] = '.';
- file[i + 1] = 't';
- file[i + 2] = 't';
- file[i + 3] = 'f';
- file[i + 4] = '\0';
- s++;
- *size = atoi(s);
- return 1;
- }
- return 0;
-}
-#endif
-
/* Some font have additional file with metrics information,
* in general, the extension of the file is: .afm or .pfm
*/
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index f7a926275a9..eaf45d91034 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -645,41 +645,55 @@ void blf_font_draw_buffer(
blf_font_draw_buffer_ex(font, str, len, r_info, 0);
}
+static bool blf_font_width_to_strlen_glyph_process(
+ FontBLF *font, const bool has_kerning, const FT_UInt kern_mode,
+ const uint c_prev, const uint c, GlyphBLF *g_prev, GlyphBLF *g,
+ int *pen_x, const int width_i)
+{
+ if (UNLIKELY(c == BLI_UTF8_ERR)) {
+ return true; /* break the calling loop. */
+ }
+ if (UNLIKELY(g == NULL)) {
+ return false; /* continue the calling loop. */
+ }
+ if (has_kerning) {
+ BLF_KERNING_STEP_FAST(font, kern_mode, g_prev, g, c_prev, c, *pen_x);
+ }
+
+ *pen_x += g->advance_i;
+
+ return (*pen_x >= width_i);
+}
+
size_t blf_font_width_to_strlen(FontBLF *font, const char *str, size_t len, float width, float *r_width)
{
- unsigned int c;
- GlyphBLF *g, *g_prev = NULL;
- FT_Vector delta;
- int pen_x = 0;
- size_t i = 0, i_prev;
+ unsigned int c, c_prev;
+ GlyphBLF *g, *g_prev;
+ int pen_x, width_new;
+ size_t i, i_prev;
GlyphBLF **glyph_ascii_table = font->glyph_cache->glyph_ascii_table;
const int width_i = (int)width;
- int width_new;
BLF_KERNING_VARS(font, has_kerning, kern_mode);
blf_font_ensure_ascii_table(font);
+ if (has_kerning) {
+ blf_font_ensure_ascii_kerning(font, kern_mode);
+ }
- while ((void)(i_prev = i),
- (void)(width_new = pen_x),
- ((i < len) && str[i]))
+ for (i_prev = i = 0, width_new = pen_x = 0, g_prev = NULL, c_prev = 0;
+ (i < len) && str[i];
+ i_prev = i, width_new = pen_x, c_prev = c, g_prev = g)
{
BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table);
- if (UNLIKELY(c == BLI_UTF8_ERR))
- break;
- if (UNLIKELY(g == NULL))
- continue;
- if (has_kerning)
- BLF_KERNING_STEP(font, kern_mode, g_prev, g, delta, pen_x);
-
- pen_x += g->advance_i;
-
- if (width_i <= pen_x) {
+ if (blf_font_width_to_strlen_glyph_process(
+ font, has_kerning, kern_mode,
+ c_prev, c, g_prev, g,
+ &pen_x, width_i))
+ {
break;
}
-
- g_prev = g;
}
if (r_width) {
@@ -691,88 +705,56 @@ size_t blf_font_width_to_strlen(FontBLF *font, const char *str, size_t len, floa
size_t blf_font_width_to_rstrlen(FontBLF *font, const char *str, size_t len, float width, float *r_width)
{
- unsigned int c;
- GlyphBLF *g, *g_prev = NULL;
- FT_Vector delta;
- int pen_x = 0;
- size_t i = 0, i_prev;
+ unsigned int c, c_prev;
+ GlyphBLF *g, *g_prev;
+ int pen_x, width_new;
+ size_t i, i_prev, i_tmp;
+ char *s, *s_prev;
GlyphBLF **glyph_ascii_table = font->glyph_cache->glyph_ascii_table;
- const int width_i = (int)width + 1;
- int width_new;
-
- bool is_malloc;
- int (*width_accum)[2];
- int width_accum_ofs = 0;
+ const int width_i = (int)width;
BLF_KERNING_VARS(font, has_kerning, kern_mode);
- /* skip allocs in simple cases */
- len = BLI_strnlen(str, len);
- if (width_i <= 1 || len == 0) {
- if (r_width) {
- *r_width = 0.0f;
- }
- return len;
- }
-
- if (len < 2048) {
- width_accum = BLI_array_alloca(width_accum, len);
- is_malloc = false;
- }
- else {
- width_accum = MEM_mallocN(sizeof(*width_accum) * len, __func__);
- is_malloc = true;
- }
-
blf_font_ensure_ascii_table(font);
-
- while ((i < len) && str[i]) {
- BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table);
-
- if (UNLIKELY(c == BLI_UTF8_ERR))
- break;
- if (UNLIKELY(g == NULL))
- continue;
- if (has_kerning)
- BLF_KERNING_STEP(font, kern_mode, g_prev, g, delta, pen_x);
-
- pen_x += g->advance_i;
-
- width_accum[width_accum_ofs][0] = (int)i;
- width_accum[width_accum_ofs][1] = pen_x;
- width_accum_ofs++;
-
- g_prev = g;
+ if (has_kerning) {
+ blf_font_ensure_ascii_kerning(font, kern_mode);
}
- if (pen_x > width_i && width_accum_ofs != 0) {
- const int min_x = pen_x - width_i;
+ i = BLI_strnlen(str, len);
+ s = BLI_str_find_prev_char_utf8(str, &str[i]);
+ i = (size_t)((s != NULL) ? s - str : 0);
+ s_prev = BLI_str_find_prev_char_utf8(str, s);
+ i_prev = (size_t)((s_prev != NULL) ? s_prev - str : 0);
+
+ i_tmp = i;
+ BLF_UTF8_NEXT_FAST(font, g, str, i_tmp, c, glyph_ascii_table);
+ for (width_new = pen_x = 0;
+ (s != NULL);
+ i = i_prev, s = s_prev, c = c_prev, g = g_prev, g_prev = NULL, width_new = pen_x)
+ {
+ s_prev = BLI_str_find_prev_char_utf8(str, s);
+ i_prev = (size_t)((s_prev != NULL) ? s_prev - str : 0);
- /* search backwards */
- width_new = pen_x;
- while (width_accum_ofs-- > 0) {
- if (min_x > width_accum[width_accum_ofs][1]) {
- break;
- }
+ if (s_prev != NULL) {
+ i_tmp = i_prev;
+ BLF_UTF8_NEXT_FAST(font, g_prev, str, i_tmp, c_prev, glyph_ascii_table);
+ BLI_assert(i_tmp == i);
}
- width_accum_ofs++;
- width_new = pen_x - width_accum[width_accum_ofs][1];
- i_prev = (size_t)width_accum[width_accum_ofs][0];
- }
- else {
- width_new = pen_x;
- i_prev = 0;
- }
- if (is_malloc) {
- MEM_freeN(width_accum);
+ if (blf_font_width_to_strlen_glyph_process(
+ font, has_kerning, kern_mode,
+ c_prev, c, g_prev, g,
+ &pen_x, width_i))
+ {
+ break;
+ }
}
if (r_width) {
*r_width = (float)width_new;
}
- return i_prev;
+ return i;
}
static void blf_font_boundbox_ex(
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index cdf0d683779..baec7e77328 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -85,18 +85,13 @@ struct CCGKey;
struct MVert;
struct MEdge;
struct MFace;
-struct MTFace;
struct Object;
struct Scene;
struct Mesh;
struct MLoopNorSpaceArray;
struct BMEditMesh;
-struct KeyBlock;
struct ModifierData;
-struct MCol;
-struct ColorBand;
struct Depsgraph;
-struct GPUVertexAttribs;
struct PBVH;
/* number of sub-elements each mesh element has (for interpolation) */
@@ -122,7 +117,6 @@ typedef struct DMFlagMat {
typedef enum DerivedMeshType {
DM_TYPE_CDDM,
- DM_TYPE_EDITBMESH,
DM_TYPE_CCGDM
} DerivedMeshType;
@@ -465,16 +459,8 @@ void DM_free_poly_data(struct DerivedMesh *dm, int index, int count);
void DM_DupPolys(DerivedMesh *source, DerivedMesh *target);
void DM_ensure_normals(DerivedMesh *dm);
-void DM_ensure_tessface(DerivedMesh *dm);
void DM_ensure_looptri_data(DerivedMesh *dm);
-void DM_verttri_from_looptri(MVertTri *verttri, const MLoop *mloop, const MLoopTri *looptri, int looptri_num);
-
-void DM_update_tessface_data(DerivedMesh *dm);
-void DM_generate_tangent_tessface_data(DerivedMesh *dm, bool generate);
-
-void DM_update_materials(DerivedMesh *dm, struct Object *ob);
-struct MLoopUV *DM_paint_uvlayer_active_get(DerivedMesh *dm, int mat_nr);
void DM_interp_vert_data(
struct DerivedMesh *source, struct DerivedMesh *dest,
@@ -495,8 +481,6 @@ void DM_interp_tessface_data(
float *weights, FaceVertWeight *vert_weights,
int count, int dest_index);
-void DM_swap_tessface_data(struct DerivedMesh *dm, int index, const int *corner_indices);
-
void DM_interp_loop_data(
struct DerivedMesh *source, struct DerivedMesh *dest,
int *src_indices,
@@ -507,16 +491,8 @@ void DM_interp_poly_data(
int *src_indices,
float *weights, int count, int dest_index);
-/* UNUSED */
-#if 0
-/** Simple function to get me->totvert amount of vertices/normals,
- * correctly deformed and subsurfered. Needed especially when vertexgroups are involved.
- * In use now by vertex/weight paint and particles */
-DMCoNo *mesh_get_mapped_verts_nors(struct Scene *scene, struct Object *ob);
-#endif
-void mesh_get_mapped_verts_coords(DerivedMesh *dm, float (*r_cos)[3], const int totcos);
-/* */
+void mesh_get_mapped_verts_coords(struct Mesh *me_eval, float (*r_cos)[3], const int totcos);
DerivedMesh *mesh_create_derived_for_modifier(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob,
@@ -526,10 +502,6 @@ DerivedMesh *mesh_create_derived_render(
struct Depsgraph *depsgraph, struct Scene *scene,
struct Object *ob, CustomDataMask dataMask);
-DerivedMesh *getEditDerivedBMesh(
- struct BMEditMesh *em, struct Object *ob, CustomDataMask data_mask,
- float (*vertexCos)[3]);
-
/* same as above but wont use render settings */
DerivedMesh *mesh_create_derived(struct Mesh *me, float (*vertCos)[3]);
DerivedMesh *mesh_create_derived_no_deform(
@@ -541,69 +513,20 @@ DerivedMesh *mesh_create_derived_no_deform_render(
struct Object *ob, float (*vertCos)[3],
CustomDataMask dataMask);
-DerivedMesh *editbmesh_get_derived_base(
- struct Object *ob, struct BMEditMesh *em, CustomDataMask data_mask);
-DerivedMesh *editbmesh_get_derived_cage(
+struct Mesh *editbmesh_get_eval_cage(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *,
struct BMEditMesh *em, CustomDataMask dataMask);
-DerivedMesh *editbmesh_get_derived_cage_and_final(
+struct Mesh *editbmesh_get_eval_cage_and_final(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *,
struct BMEditMesh *em, CustomDataMask dataMask,
- DerivedMesh **r_final);
-
-DerivedMesh *object_get_derived_final(struct Object *ob, const bool for_render);
+ struct Mesh **r_final);
float (*editbmesh_get_vertex_cos(struct BMEditMesh *em, int *r_numVerts))[3];
-bool editbmesh_modifier_is_enabled(struct Scene *scene, struct ModifierData *md, DerivedMesh *dm);
+bool editbmesh_modifier_is_enabled(struct Scene *scene, struct ModifierData *md, bool has_prev_mesh);
void makeDerivedMesh(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct BMEditMesh *em,
CustomDataMask dataMask, const bool build_shapekey_layers);
-/** Update the weight MCOL preview layer.
- * If weights are NULL, use object's active vgroup(s).
- * Else, weights must be an array of weight float values.
- * If indices is NULL, it must be of numVerts length.
- * Else, it must be of num length, as indices, which contains vertices' idx to apply weights to.
- * (other vertices are assumed zero weight).
- */
-void DM_update_weight_mcol(
- struct Object *ob, struct DerivedMesh *dm, int const draw_flag,
- float *weights, int num, const int *indices);
-
-/** convert layers requested by a GLSL material to actually available layers in
- * the DerivedMesh, with both a pointer for arrays and an offset for editmesh */
-typedef struct DMVertexAttribs {
- struct {
- struct MLoopUV *array;
- int em_offset, gl_index, gl_texco, gl_info_index;
- } tface[MAX_MTFACE];
-
- struct {
- struct MLoopCol *array;
- int em_offset, gl_index, gl_info_index;
- } mcol[MAX_MCOL];
-
- struct {
- float (*array)[4];
- int em_offset, gl_index, gl_info_index;
- } tang[MAX_MTFACE];
-
- struct {
- float (*array)[3];
- int em_offset, gl_index, gl_texco, gl_info_index;
- } orco;
-
- int tottface, totmcol, tottang, totorco;
-} DMVertexAttribs;
-
-void DM_vertex_attributes_from_gpu(
- DerivedMesh *dm,
- struct GPUVertexAttribs *gattribs, DMVertexAttribs *attribs);
-
-void DM_calc_tangents_names_from_gpu(
- const struct GPUVertexAttribs *gattribs,
- char (*tangent_names)[MAX_NAME], int *tangent_names_count);
-
void DM_add_named_tangent_layer_for_uv(
CustomData *uv_data, CustomData *tan_data, int numLoopData,
const char *layer_name);
@@ -614,9 +537,6 @@ void DM_calc_loop_tangents(
void DM_calc_auto_bump_scale(DerivedMesh *dm);
-/** Set object's bounding box based on DerivedMesh min/max data */
-void DM_set_object_boundbox(struct Object *ob, DerivedMesh *dm);
-
void DM_init_origspace(DerivedMesh *dm);
/* debug only */
@@ -628,20 +548,4 @@ void DM_debug_print_cdlayers(CustomData *cdata);
bool DM_is_valid(DerivedMesh *dm);
#endif
-BLI_INLINE int DM_origindex_mface_mpoly(
- const int *index_mf_to_mpoly, const int *index_mp_to_orig, const int i) ATTR_NONNULL(1);
-
-BLI_INLINE int DM_origindex_mface_mpoly(
- const int *index_mf_to_mpoly, const int *index_mp_to_orig, const int i)
-{
- const int j = index_mf_to_mpoly[i];
- return (j != ORIGINDEX_NONE) ? (index_mp_to_orig ? index_mp_to_orig[j] : j) : ORIGINDEX_NONE;
-}
-
-struct MVert *DM_get_vert_array(struct DerivedMesh *dm, bool *r_allocated);
-struct MEdge *DM_get_edge_array(struct DerivedMesh *dm, bool *r_allocated);
-struct MLoop *DM_get_loop_array(struct DerivedMesh *dm, bool *r_allocated);
-struct MPoly *DM_get_poly_array(struct DerivedMesh *dm, bool *r_allocated);
-struct MFace *DM_get_tessface_array(struct DerivedMesh *dm, bool *r_allocated);
-
#endif /* __BKE_DERIVEDMESH_H__ */
diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h
index 263a54eab4e..882078e6e99 100644
--- a/source/blender/blenkernel/BKE_action.h
+++ b/source/blender/blenkernel/BKE_action.h
@@ -70,7 +70,7 @@ void BKE_action_make_local(struct Main *bmain, struct bAction *act, const bool l
/* Action API ----------------- */
/* types of transforms applied to the given item
- * - these are the return falgs for action_get_item_transforms()
+ * - these are the return flags for action_get_item_transforms()
*/
typedef enum eAction_TransformFlags {
/* location */
diff --git a/source/blender/blenkernel/BKE_anim.h b/source/blender/blenkernel/BKE_anim.h
index 2f7d0eaba03..0d8a50c5325 100644
--- a/source/blender/blenkernel/BKE_anim.h
+++ b/source/blender/blenkernel/BKE_anim.h
@@ -57,7 +57,12 @@ void animviz_free_motionpath(struct bMotionPath *mpath);
struct bMotionPath *animviz_verify_motionpaths(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan);
void animviz_get_object_motionpaths(struct Object *ob, ListBase *targets);
-void animviz_calc_motionpaths(struct Depsgraph *depsgraph, struct Main *bmain, struct Scene *scene, ListBase *targets);
+void animviz_calc_motionpaths(struct Depsgraph *depsgraph,
+ struct Main *bmain,
+ struct Scene *scene,
+ ListBase *targets,
+ bool restore,
+ bool current_frame_only);
/* ---------------------------------------------------- */
/* Curve Paths */
@@ -73,16 +78,6 @@ struct ListBase *object_duplilist(struct Depsgraph *depsgraph, struct Scene *sce
void free_object_duplilist(struct ListBase *lb);
int count_duplilist(struct Object *ob);
-typedef struct DupliExtraData {
- float obmat[4][4];
- unsigned int lay;
-} DupliExtraData;
-
-typedef struct DupliApplyData {
- int num_objects;
- DupliExtraData *extra;
-} DupliApplyData;
-
typedef struct DupliObject {
struct DupliObject *next, *prev;
struct Object *ob;
@@ -103,8 +98,4 @@ typedef struct DupliObject {
unsigned int random_id;
} DupliObject;
-DupliApplyData *duplilist_apply(struct Depsgraph *depsgraph, struct Object *ob, struct Scene *scene, struct ListBase *duplilist);
-void duplilist_restore(struct ListBase *duplilist, DupliApplyData *apply_data);
-void duplilist_free_apply_data(DupliApplyData *apply_data);
-
#endif
diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h
index 9e8e7f7b724..394351d1df2 100644
--- a/source/blender/blenkernel/BKE_animsys.h
+++ b/source/blender/blenkernel/BKE_animsys.h
@@ -32,7 +32,6 @@
*/
struct AnimData;
-struct AnimMapper;
struct ChannelDriver;
struct Depsgraph;
struct FCurve;
@@ -70,10 +69,10 @@ bool BKE_animdata_set_action(struct ReportList *reports, struct ID *id, struct b
void BKE_animdata_free(struct ID *id, const bool do_id_user);
/* Copy AnimData */
-struct AnimData *BKE_animdata_copy(struct Main *bmain, struct AnimData *adt, const bool do_action, const bool do_id_user);
+struct AnimData *BKE_animdata_copy(struct Main *bmain, struct AnimData *adt, const int flag);
/* Copy AnimData */
-bool BKE_animdata_copy_id(struct Main *bmain, struct ID *id_to, struct ID *id_from, const bool do_action, const bool do_id_user);
+bool BKE_animdata_copy_id(struct Main *bmain, struct ID *id_to, struct ID *id_from, const int flag);
/* Copy AnimData Actions */
void BKE_animdata_copy_id_action(struct Main *bmain, struct ID *id, const bool set_newid);
@@ -184,7 +183,7 @@ void BKE_animsys_evaluate_animdata(struct Depsgraph *depsgraph, struct Scene *sc
void BKE_animsys_evaluate_all_animation(struct Main *main, struct Depsgraph *depsgraph, struct Scene *scene, float ctime);
/* TODO(sergey): This is mainly a temp public function. */
-bool BKE_animsys_execute_fcurve(struct PointerRNA *ptr, struct AnimMapper *remap, struct FCurve *fcu, float curval);
+bool BKE_animsys_execute_fcurve(struct PointerRNA *ptr, struct FCurve *fcu, float curval);
/* ------------ Specialized API --------------- */
/* There are a few special tools which require these following functions. They are NOT to be used
@@ -195,10 +194,10 @@ bool BKE_animsys_execute_fcurve(struct PointerRNA *ptr, struct AnimMapper *remap
*/
/* Evaluate Action (F-Curve Bag) */
-void animsys_evaluate_action(struct Depsgraph *depsgraph, struct PointerRNA *ptr, struct bAction *act, struct AnimMapper *remap, float ctime);
+void animsys_evaluate_action(struct Depsgraph *depsgraph, struct PointerRNA *ptr, struct bAction *act, float ctime);
/* Evaluate Action Group */
-void animsys_evaluate_action_group(struct PointerRNA *ptr, struct bAction *act, struct bActionGroup *agrp, struct AnimMapper *remap, float ctime);
+void animsys_evaluate_action_group(struct PointerRNA *ptr, struct bAction *act, struct bActionGroup *agrp, float ctime);
/* ************************************* */
diff --git a/source/blender/blenkernel/BKE_appdir.h b/source/blender/blenkernel/BKE_appdir.h
index ac8f861fa56..6162c7b6bf6 100644
--- a/source/blender/blenkernel/BKE_appdir.h
+++ b/source/blender/blenkernel/BKE_appdir.h
@@ -23,6 +23,7 @@
/** \file BKE_appdir.h
* \ingroup bli
*/
+struct ListBase;
/* note on naming: typical _get() suffix is omitted here,
* since its the main purpose of the API. */
@@ -35,6 +36,7 @@ const char *BKE_appdir_folder_id_version(const int folder_id, const int ver, con
bool BKE_appdir_app_template_any(void);
bool BKE_appdir_app_template_id_search(const char *app_template, char *path, size_t path_len);
+void BKE_appdir_app_templates(struct ListBase *templates);
/* Initialize path to program executable */
void BKE_appdir_program_path_init(const char *argv0);
diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h
index 2e2da281af4..23a9afbda31 100644
--- a/source/blender/blenkernel/BKE_armature.h
+++ b/source/blender/blenkernel/BKE_armature.h
@@ -49,7 +49,7 @@ struct ListBase;
typedef struct PoseTarget {
struct PoseTarget *next, *prev;
- struct bConstraint *con; /* the constrait of this target */
+ struct bConstraint *con; /* the constraint of this target */
int tip; /* index of tip pchan in PoseTree */
} PoseTarget;
@@ -100,6 +100,7 @@ void BKE_armature_where_is(struct bArmature *arm);
void BKE_armature_where_is_bone(struct Bone *bone, struct Bone *prevbone, const bool use_recursion);
void BKE_pose_clear_pointers(struct bPose *pose);
void BKE_pose_remap_bone_pointers(struct bArmature *armature, struct bPose *pose);
+void BKE_pchan_rebuild_bbone_handles(struct bPose *pose, struct bPoseChannel *pchan);
void BKE_pose_rebuild(struct Main *bmain, struct Object *ob, struct bArmature *arm, const bool do_id_user);
void BKE_pose_where_is(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob);
void BKE_pose_where_is_bone(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime, bool do_extra);
@@ -109,7 +110,8 @@ void BKE_pose_where_is_bone_tail(struct bPoseChannel *pchan);
void get_objectspace_bone_matrix(struct Bone *bone, float M_accumulatedMatrix[4][4], int root, int posed);
void vec_roll_to_mat3(const float vec[3], const float roll, float mat[3][3]);
void vec_roll_to_mat3_normalized(const float nor[3], const float roll, float mat[3][3]);
-void mat3_to_vec_roll(float mat[3][3], float r_vec[3], float *r_roll);
+void mat3_to_vec_roll(const float mat[3][3], float r_vec[3], float *r_roll);
+void mat3_vec_to_roll(const float mat[3][3], const float vec[3], float *r_roll);
/* Common Conversions Between Co-ordinate Spaces */
void BKE_armature_mat_world_to_pose(struct Object *ob, float inmat[4][4], float outmat[4][4]);
@@ -140,10 +142,33 @@ typedef struct Mat4 {
float mat[4][4];
} Mat4;
+typedef struct BBoneSplineParameters {
+ int segments;
+ float length;
+
+ /* Non-uniform scale correction. */
+ bool do_scale;
+ float scale[3];
+
+ /* Handle control bone data. */
+ bool use_prev, prev_bbone;
+ bool use_next, next_bbone;
+
+ float prev_h[3], next_h[3];
+ float prev_mat[4][4], next_mat[4][4];
+
+ /* Control values. */
+ float ease1, ease2;
+ float roll1, roll2;
+ float scaleIn, scaleOut;
+ float curveInX, curveInY, curveOutX, curveOutY;
+} BBoneSplineParameters;
+
void BKE_pchan_get_bbone_handles(struct bPoseChannel *pchan, struct bPoseChannel **r_prev, struct bPoseChannel **r_next);
-void equalize_bbone_bezier(float *data, int desired);
-void b_bone_spline_setup(struct bPoseChannel *pchan, int rest, Mat4 result_array[MAX_BBONE_SUBDIV]);
+void b_bone_spline_setup(struct bPoseChannel *pchan, const bool rest, Mat4 result_array[MAX_BBONE_SUBDIV]);
+
+int BKE_compute_b_bone_spline(struct BBoneSplineParameters *param, Mat4 result_array[MAX_BBONE_SUBDIV]);
/* like EBONE_VISIBLE */
#define PBONE_VISIBLE(arm, bone) ( \
@@ -228,16 +253,15 @@ void BKE_pose_splineik_evaluate(
struct Object *ob,
int rootchan_index);
-void BKE_pose_eval_flush(
+void BKE_pose_eval_cleanup(
struct Depsgraph *depsgraph,
struct Scene *scene,
struct Object *ob);
-void BKE_pose_eval_proxy_pose_init(struct Depsgraph *depsgraph,
- struct Object *object);
-
-void BKE_pose_eval_proxy_pose_done(struct Depsgraph *depsgraph,
- struct Object *object);
+void BKE_pose_eval_proxy_init(struct Depsgraph *depsgraph,
+ struct Object *object);
+void BKE_pose_eval_proxy_cleanup(struct Depsgraph *depsgraph,
+ struct Object *object);
void BKE_pose_eval_proxy_copy_bone(
struct Depsgraph *depsgraph,
diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h
index 6d8861aae1c..298e13fe103 100644
--- a/source/blender/blenkernel/BKE_blender_version.h
+++ b/source/blender/blenkernel/BKE_blender_version.h
@@ -28,7 +28,7 @@
* and keep comment above the defines.
* Use STRINGIFY() rather than defining with quotes */
#define BLENDER_VERSION 280
-#define BLENDER_SUBVERSION 21
+#define BLENDER_SUBVERSION 30
/* Several breakages with 280, e.g. collections vs layers */
#define BLENDER_MINVERSION 280
#define BLENDER_MINSUBVERSION 0
diff --git a/source/blender/blenkernel/BKE_bmfont.h b/source/blender/blenkernel/BKE_bmfont.h
deleted file mode 100644
index 3be84c83892..00000000000
--- a/source/blender/blenkernel/BKE_bmfont.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-#ifndef __BKE_BMFONT_H__
-#define __BKE_BMFONT_H__
-
-/** \file BKE_bmfont.h
- * \ingroup bke
- * \since March 2001
- * \author nzc
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct bmGlyph;
-struct ImBuf;
-struct bmFont;
-
-void printfGlyph(struct bmGlyph *glyph);
-void calcAlpha(struct ImBuf *ibuf);
-void readBitmapFontVersion0(struct ImBuf *ibuf,
- unsigned char *rect,
- int step);
-void detectBitmapFont(struct ImBuf *ibuf);
-int locateGlyph(struct bmFont *bmfont, unsigned short unicode);
-void matrixGlyph(struct ImBuf *ibuf, unsigned short unicode,
- float *centerx, float *centery,
- float *sizex, float *sizey,
- float *transx, float *transy,
- float *movex, float *movey, float *advance);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/source/blender/blenkernel/BKE_brush.h b/source/blender/blenkernel/BKE_brush.h
index 3a1fd5c5ba6..b152053f25b 100644
--- a/source/blender/blenkernel/BKE_brush.h
+++ b/source/blender/blenkernel/BKE_brush.h
@@ -61,8 +61,6 @@ void BKE_brush_free(struct Brush *brush);
void BKE_brush_sculpt_reset(struct Brush *brush);
void BKE_brush_gpencil_presets(struct bContext *C);
void BKE_brush_update_material(struct Main *bmain, struct Material *ma, struct Brush *exclude_brush);
-struct Brush *BKE_brush_getactive_gpencil(struct ToolSettings *ts);
-struct Paint *BKE_brush_get_gpencil_paint(struct ToolSettings *ts);
/* image icon function */
struct ImBuf *get_brush_icon(struct Brush *brush);
@@ -129,6 +127,14 @@ void BKE_brush_scale_size(
float new_unprojected_radius,
float old_unprojected_radius);
+/* Accessors */
+#define BKE_brush_tool_get(brush, p) \
+ (CHECK_TYPE_ANY(brush, struct Brush *, const struct Brush *), \
+ *(const char *)POINTER_OFFSET(brush, (p)->runtime.tool_offset))
+#define BKE_brush_tool_set(brush, p, tool) { \
+ CHECK_TYPE_ANY(brush, struct Brush *); \
+ *(char *)POINTER_OFFSET(brush, (p)->runtime.tool_offset) = tool; } ((void)0)
+
/* debugging only */
void BKE_brush_debug_print_state(struct Brush *br);
diff --git a/source/blender/blenkernel/BKE_bvhutils.h b/source/blender/blenkernel/BKE_bvhutils.h
index a0780a5be54..018f535a4cb 100644
--- a/source/blender/blenkernel/BKE_bvhutils.h
+++ b/source/blender/blenkernel/BKE_bvhutils.h
@@ -35,7 +35,7 @@
#include "BLI_kdopbvh.h"
/**
- * This header encapsulates necessary code to buld a BVH
+ * This header encapsulates necessary code to build a BVH
*/
struct DerivedMesh;
@@ -151,10 +151,6 @@ BVHTree *bvhtree_from_mesh_looptri_ex(
const BLI_bitmap *mask, int looptri_num_active,
float epsilon, int tree_type, int axis);
-BVHTree *bvhtree_from_mesh_get(
- struct BVHTreeFromMesh *data, struct DerivedMesh *mesh,
- const int type, const int tree_type);
-
BVHTree *BKE_bvhtree_from_mesh_get(
struct BVHTreeFromMesh *data, struct Mesh *mesh,
const int type, const int tree_type);
diff --git a/source/blender/blenkernel/BKE_ccg.h b/source/blender/blenkernel/BKE_ccg.h
index 7d5d423282d..4d0f6d53820 100644
--- a/source/blender/blenkernel/BKE_ccg.h
+++ b/source/blender/blenkernel/BKE_ccg.h
@@ -33,7 +33,7 @@
*/
/* defines BLI_INLINE */
-#include "BLI_utildefines.h"
+#include "BLI_compiler_compat.h"
/* declares fprintf() and abort(), needed for BLI_assert */
#include <stdio.h>
@@ -72,7 +72,6 @@ typedef struct CCGKey {
* true */
int mask_offset;
- int num_layers;
int has_normals;
int has_mask;
} CCGKey;
diff --git a/source/blender/blenkernel/BKE_cdderivedmesh.h b/source/blender/blenkernel/BKE_cdderivedmesh.h
index 6d96bd6ab7c..f2c0b96aa80 100644
--- a/source/blender/blenkernel/BKE_cdderivedmesh.h
+++ b/source/blender/blenkernel/BKE_cdderivedmesh.h
@@ -63,15 +63,6 @@ struct DerivedMesh *CDDM_from_bmesh(struct BMesh *bm, const bool use_mdisps);
/* creates a CDDerivedMesh from the given BMEditMesh */
DerivedMesh *CDDM_from_editbmesh(struct BMEditMesh *em, const bool use_mdisps, const bool use_tessface);
-/* merge verts */
-/* Enum for merge_mode of CDDM_merge_verts.
- * Refer to cdderivedmesh.c for details. */
-enum {
- CDDM_MERGE_VERTS_DUMP_IF_MAPPED,
- CDDM_MERGE_VERTS_DUMP_IF_EQUAL,
-};
-DerivedMesh *CDDM_merge_verts(DerivedMesh *dm, const int *vtargetmap, const int tot_vtargetmap, const int merge_mode);
-
/* creates a CDDerivedMesh from the given curve object */
struct DerivedMesh *CDDM_from_curve(struct Object *ob);
@@ -83,8 +74,6 @@ DerivedMesh *CDDM_from_curve_displist(struct Object *ob, struct ListBase *dispba
* custom element data.
*/
struct DerivedMesh *CDDM_copy(struct DerivedMesh *dm);
-struct DerivedMesh *CDDM_copy_from_tessface(struct DerivedMesh *dm);
-struct DerivedMesh *CDDM_copy_with_tessface(struct DerivedMesh *dm);
/* creates a CDDerivedMesh with the same layer stack configuration as the
* given DerivedMesh and containing the requested numbers of elements.
@@ -100,11 +89,6 @@ struct DerivedMesh *CDDM_from_template(
int numVerts, int numEdges, int numFaces,
int numLoops, int numPolys);
-/* converts mfaces to mpolys. note things may break if there are not valid
- * medges surrounding each mface.
- */
-void CDDM_tessfaces_to_faces(struct DerivedMesh *dm);
-
/* applies vertex coordinates or normals to a CDDerivedMesh. if the MVert
* layer is a referenced layer, it will be duplicate to not overwrite the
* original
@@ -117,22 +101,11 @@ void CDDM_apply_vert_normals(struct DerivedMesh *cddm, short (*vertNormals)[3]);
void CDDM_calc_normals_mapping_ex(struct DerivedMesh *dm, const bool only_face_normals);
void CDDM_calc_normals_mapping(struct DerivedMesh *dm);
void CDDM_calc_normals(struct DerivedMesh *dm);
-void CDDM_calc_normals_tessface(struct DerivedMesh *dm);
void CDDM_calc_loop_normals(struct DerivedMesh *dm, const bool use_split_normals, const float split_angle);
void CDDM_calc_loop_normals_spacearr(struct DerivedMesh *dm, const bool use_split_normals, const float split_angle,
struct MLoopNorSpaceArray *r_lnors_spacearr);
-/* calculates edges for a CDDerivedMesh (from face data)
- * this completely replaces the current edge data in the DerivedMesh
- * builds edges from the tessellated face data.
- */
-void CDDM_calc_edges_tessface(struct DerivedMesh *dm);
-
-/* same as CDDM_calc_edges_tessface only makes edges from ngon faces instead of tessellation
- * faces*/
-void CDDM_calc_edges(struct DerivedMesh *dm);
-
/* reconstitute face triangulation */
void CDDM_recalc_tessellation(struct DerivedMesh *dm);
void CDDM_recalc_tessellation_ex(struct DerivedMesh *dm, const bool do_face_nor_cpy);
diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h
index 82a8d7f4e43..87094e77953 100644
--- a/source/blender/blenkernel/BKE_cloth.h
+++ b/source/blender/blenkernel/BKE_cloth.h
@@ -117,6 +117,7 @@ typedef struct ClothVertex {
float goal; /* goal, from SB */
float impulse[3]; /* used in collision.c */
float xrest[3]; /* rest position of the vertex */
+ float dcvel[3]; /* delta velocities to be applied by collision response */
unsigned int impulse_count; /* same as above */
float avg_spring_len; /* average length of connected springs */
float struct_stiff;
@@ -133,11 +134,17 @@ ClothVertex;
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 mn;
- float restlen; /* The original length of the spring. */
- int type; /* types defined in BKE_cloth.h ("springType") */
- int flags; /* defined in BKE_cloth.h, e.g. deactivated due to tearing */
- float stiffness; /* stiffness factor from the vertex groups */
+ 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. */
+ 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"). */
+ int flags; /* Defined in BKE_cloth.h, e.g. deactivated due to tearing. */
+ float lin_stiffness; /* Linear stiffness factor from the vertex groups. */
+ float ang_stiffness; /* Angular stiffness factor from the vertex groups. */
float editrestlen;
/* angular bending spring target and derivatives */
@@ -163,15 +170,21 @@ ClothSpring;
/* These are the bits used in SimSettings.flags. */
typedef enum {
CLOTH_SIMSETTINGS_FLAG_COLLOBJ = ( 1 << 2 ),// object is only collision object, no cloth simulation is done
- CLOTH_SIMSETTINGS_FLAG_GOAL = ( 1 << 3 ), // we have goals enabled
+ CLOTH_SIMSETTINGS_FLAG_GOAL = ( 1 << 3 ), /* DEPRECATED, for versioning only. */
CLOTH_SIMSETTINGS_FLAG_TEARING = ( 1 << 4 ),// true if tearing is enabled
- CLOTH_SIMSETTINGS_FLAG_SCALING = ( 1 << 8 ), /* is advanced scaling active? */
+ CLOTH_SIMSETTINGS_FLAG_SCALING = ( 1 << 8 ), /* DEPRECATED, for versioning only. */
CLOTH_SIMSETTINGS_FLAG_CCACHE_EDIT = (1 << 12), /* edit cache in editmode */
- CLOTH_SIMSETTINGS_FLAG_NO_SPRING_COMPRESS = (1 << 13), /* don't allow spring compression */
+ CLOTH_SIMSETTINGS_FLAG_RESIST_SPRING_COMPRESS = (1 << 13), /* don't allow spring compression */
CLOTH_SIMSETTINGS_FLAG_SEW = (1 << 14), /* pull ends of loose edges together */
CLOTH_SIMSETTINGS_FLAG_DYNAMIC_BASEMESH = (1 << 15), /* make simulation respect deformations in the base object */
} CLOTH_SIMSETTINGS_FLAGS;
+/* ClothSimSettings.bending_model. */
+typedef enum {
+ CLOTH_BENDING_LINEAR = 0,
+ CLOTH_BENDING_ANGULAR = 1,
+} CLOTH_BENDING_MODEL;
+
/* COLLISION FLAGS */
typedef enum {
CLOTH_COLLSETTINGS_FLAG_ENABLED = ( 1 << 1 ), /* enables cloth - object collisions */
@@ -180,12 +193,12 @@ typedef enum {
/* Spring types as defined in the paper.*/
typedef enum {
- CLOTH_SPRING_TYPE_STRUCTURAL = (1 << 1),
- CLOTH_SPRING_TYPE_SHEAR = (1 << 2),
- CLOTH_SPRING_TYPE_BENDING = (1 << 3),
- CLOTH_SPRING_TYPE_GOAL = (1 << 4),
- CLOTH_SPRING_TYPE_SEWING = (1 << 5),
- CLOTH_SPRING_TYPE_BENDING_ANG = (1 << 6),
+ CLOTH_SPRING_TYPE_STRUCTURAL = (1 << 1),
+ CLOTH_SPRING_TYPE_SHEAR = (1 << 2),
+ CLOTH_SPRING_TYPE_BENDING = (1 << 3),
+ CLOTH_SPRING_TYPE_GOAL = (1 << 4),
+ CLOTH_SPRING_TYPE_SEWING = (1 << 5),
+ CLOTH_SPRING_TYPE_BENDING_HAIR = (1 << 6),
} CLOTH_SPRING_TYPES;
/* SPRING FLAGS */
@@ -210,8 +223,7 @@ typedef struct ColliderContacts {
} ColliderContacts;
// needed for implicit.c
-int cloth_bvh_objcollision (struct Depsgraph *depsgraph, struct Object *ob, struct ClothModifierData *clmd, float step, float dt );
-int cloth_points_objcollision(struct Depsgraph *depsgraph, struct Object *ob, struct ClothModifierData *clmd, float step, float dt);
+int cloth_bvh_collision(struct Depsgraph *depsgraph, struct Object *ob, struct ClothModifierData *clmd, float step, float dt);
void cloth_find_point_contacts(struct Depsgraph *depsgraph, struct Object *ob, struct ClothModifierData *clmd, float step, float dt,
ColliderContacts **r_collider_contacts, int *r_totcolliders);
@@ -227,13 +239,14 @@ void cloth_free_contacts(ColliderContacts *collider_contacts, int totcolliders);
void cloth_free_modifier_extern (struct ClothModifierData *clmd );
void cloth_free_modifier (struct ClothModifierData *clmd );
void cloth_init (struct ClothModifierData *clmd );
-void clothModifier_do(struct ClothModifierData *clmd, struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct Mesh *dm, float (*vertexCos)[3]);
+void clothModifier_do(
+ struct ClothModifierData *clmd, struct Depsgraph *depsgraph, struct Scene *scene,
+ struct Object *ob, struct Mesh *me, float (*vertexCos)[3]);
int cloth_uses_vgroup(struct ClothModifierData *clmd);
// needed for collision.c
-void bvhtree_update_from_cloth(struct ClothModifierData *clmd, bool moving);
-void bvhselftree_update_from_cloth(struct ClothModifierData *clmd, bool moving);
+void bvhtree_update_from_cloth(struct ClothModifierData *clmd, bool moving, bool self);
// needed for button_object.c
void cloth_clear_cache(
diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h
index 175ee61c690..a9539b3a3c4 100644
--- a/source/blender/blenkernel/BKE_collection.h
+++ b/source/blender/blenkernel/BKE_collection.h
@@ -75,6 +75,7 @@ struct Collection *BKE_collection_master_add(void);
bool BKE_collection_has_object(struct Collection *collection, struct Object *ob);
bool BKE_collection_has_object_recursive(struct Collection *collection, struct Object *ob);
struct Collection *BKE_collection_object_find(struct Main *bmain, struct Collection *collection, struct Object *ob);
+bool BKE_collection_is_empty(struct Collection *collection);
bool BKE_collection_object_add(struct Main *bmain, struct Collection *collection, struct Object *ob);
void BKE_collection_object_add_from(struct Main *bmain, struct Scene *scene, struct Object *ob_src, struct Object *ob_dst);
diff --git a/source/blender/blenkernel/BKE_collision.h b/source/blender/blenkernel/BKE_collision.h
index a082b5be804..9bd1f5385da 100644
--- a/source/blender/blenkernel/BKE_collision.h
+++ b/source/blender/blenkernel/BKE_collision.h
@@ -63,6 +63,7 @@ typedef enum {
COLLISION_USE_COLLFACE = (1 << 2),
COLLISION_IS_EDGES = (1 << 3),
#endif
+ COLLISION_INACTIVE = (1 << 4),
} COLLISION_FLAGS;
@@ -73,7 +74,7 @@ typedef enum {
typedef struct CollPair {
unsigned int face1; // cloth face
unsigned int face2; // object face
- double distance; // magnitude of vector
+ float distance;
float normal[3];
float vector[3]; // unnormalized collision vector: p2-p1
float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
diff --git a/source/blender/blenkernel/BKE_constraint.h b/source/blender/blenkernel/BKE_constraint.h
index 6f83dbcce59..e7672001a15 100644
--- a/source/blender/blenkernel/BKE_constraint.h
+++ b/source/blender/blenkernel/BKE_constraint.h
@@ -68,16 +68,18 @@ typedef void (*ConstraintIDFunc)(struct bConstraint *con, struct ID **idpoin, bo
/* ....... */
-/* Constraint Type-Info (shorthand in code = cti):
- * This struct provides function pointers for runtime, so that functions can be
- * written more generally (with fewer/no special exceptions for various constraints).
+/**
+ * Constraint Type-Info (shorthand in code = cti):
+ * This struct provides function pointers for runtime, so that functions can be
+ * written more generally (with fewer/no special exceptions for various constraints).
*
- * Callers of these functions must check that they actually point to something useful,
- * as some constraints don't define some of these.
+ * Callers of these functions must check that they actually point to something useful,
+ * as some constraints don't define some of these.
*
- * Warning: it is not too advisable to reorder order of members of this struct,
- * as you'll have to edit quite a few ($NUM_CONSTRAINT_TYPES) of these
- * structs.
+ * Warning:
+ * it is not too advisable to reorder order of members of this struct,
+ * as you'll have to edit quite a few #NUM_CONSTRAINT_TYPES of these
+ * structs.
*/
typedef struct bConstraintTypeInfo {
/* admin/ident */
@@ -129,11 +131,15 @@ void BKE_constraints_id_loop(struct ListBase *list, ConstraintIDFunc func, void
void BKE_constraint_free_data(struct bConstraint *con);
void BKE_constraint_free_data_ex(struct bConstraint *con, bool do_id_user);
+bool BKE_constraint_target_uses_bbone(struct bConstraint *con, struct bConstraintTarget *ct);
+
/* Constraint API function prototypes */
struct bConstraint *BKE_constraints_active_get(struct ListBase *list);
void BKE_constraints_active_set(ListBase *list, struct bConstraint *con);
struct bConstraint *BKE_constraints_find_name(struct ListBase *list, const char *name);
+struct bConstraint *BKE_constraint_find_from_target(struct Object *ob, struct bConstraintTarget *tgt);
+
struct bConstraint *BKE_constraint_add_for_object(struct Object *ob, const char *name, short type);
struct bConstraint *BKE_constraint_add_for_pose(struct Object *ob, struct bPoseChannel *pchan, const char *name, short type);
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h
index 9d88cf33f88..86c21ffe828 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -225,11 +225,6 @@ short CTX_data_type_get(struct bContextDataResult *result);
bool CTX_data_equals(const char *member, const char *str);
bool CTX_data_dir(const char *member);
-#if 0
-void CTX_data_pointer_set(bContextDataResult *result, void *data);
-void CTX_data_list_add(bContextDataResult *result, void *data);
-#endif
-
#define CTX_DATA_BEGIN(C, Type, instance, member) \
{ \
ListBase ctx_data_list; \
@@ -311,6 +306,7 @@ int CTX_data_editable_bones(const bContext *C, ListBase *list);
struct bPoseChannel *CTX_data_active_pose_bone(const bContext *C);
int CTX_data_selected_pose_bones(const bContext *C, ListBase *list);
+int CTX_data_selected_pose_bones_from_active_object(const bContext *C, ListBase *list);
int CTX_data_visible_pose_bones(const bContext *C, ListBase *list);
struct bGPdata *CTX_data_gpencil_data(const bContext *C);
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index 493fa8f6cef..50e3abdbd0c 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -224,18 +224,24 @@ void CustomData_copy_data(const struct CustomData *source,
struct CustomData *dest, int source_index,
int dest_index, int count);
void CustomData_copy_data_named(const struct CustomData *source,
- struct CustomData *dest, int source_index,
- int dest_index, int count);
+ struct CustomData *dest, int source_index,
+ int dest_index, int count);
void CustomData_copy_elements(int type, void *src_data_ofs, void *dst_data_ofs, int count);
void CustomData_bmesh_copy_data(const struct CustomData *source,
struct CustomData *dest, void *src_block,
void **dest_block);
-/* need this function exposed to deal with customdata in Fracture Modifier properly */
-void CustomData_copy_data_layer(
- const CustomData *source, CustomData *dest,
- int src_i, int dst_i,
- int src_index, int dst_index, int count);
+/* Copies data of a single layer of a given type. */
+void CustomData_copy_layer_type_data(const struct CustomData *source,
+ struct CustomData *destination,
+ int type,
+ int source_index, int destination_index,
+ int count);
+
+/* put here so fracture code can access it */
+void CustomData_copy_data_layer(const CustomData *source, CustomData *dest,
+ int src_i, int dst_i,
+ int src_index, int dst_index, int count);
/* frees data in a CustomData object
* return 1 on success, 0 on failure
@@ -295,8 +301,7 @@ const char *CustomData_get_layer_name(const struct CustomData *data, int type, i
*/
void *CustomData_get_layer(const struct CustomData *data, int type);
void *CustomData_get_layer_n(const struct CustomData *data, int type, int n);
-void *CustomData_get_layer_named(const struct CustomData *data, int type,
- const char *name);
+void *CustomData_get_layer_named(const struct CustomData *data, int type, const char *name);
int CustomData_get_offset(const struct CustomData *data, int type);
int CustomData_get_n_offset(const struct CustomData *data, int type, int n);
@@ -485,7 +490,7 @@ typedef struct CustomDataTransferLayerMap {
size_t data_size; /* Size of actual data we transfer. */
size_t data_offset; /* Offset of actual data we transfer (in element contained in data_src/dst). */
- uint64_t data_flag; /* For bitflag transfer, flag(s) to affect in transfered data. */
+ uint64_t data_flag; /* For bitflag transfer, flag(s) to affect in transferred data. */
void *interp_data; /* Opaque pointer, to be used by specific interp callback (e.g. transformspace for normals). */
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index 034f9b2b6a8..02c86642b11 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -58,7 +58,7 @@ enum {
/* prototypes */
struct Depsgraph;
-struct DerivedMesh;
+struct Mesh;
struct ListBase;
struct Main;
struct Object;
@@ -89,12 +89,12 @@ bool BKE_displist_has_faces(struct ListBase *lb);
void BKE_displist_make_surf(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct ListBase *dispbase,
- struct DerivedMesh **r_dm_final, const bool for_render, const bool for_orco, const bool use_render_resolution);
+ struct Mesh **r_final, const bool for_render, const bool for_orco, const bool use_render_resolution);
void BKE_displist_make_curveTypes(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, const bool for_orco);
void BKE_displist_make_curveTypes_forRender(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct ListBase *dispbase,
- struct DerivedMesh **r_dm_final, const bool for_orco, const bool use_render_resolution);
+ struct Mesh **r_final, const bool for_orco, const bool use_render_resolution);
void BKE_displist_make_curveTypes_forOrco(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct ListBase *dispbase);
void BKE_displist_make_mball(
@@ -107,11 +107,6 @@ void BKE_displist_fill(struct ListBase *dispbase, struct ListBase *to, const flo
float BKE_displist_calc_taper(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *taperobj, int cur, int tot);
-/* add Orco layer to the displist object which has got derived mesh and return orco */
-float *BKE_displist_make_orco(
- struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm_final,
- const bool for_render, const bool use_render_resolution);
-
void BKE_displist_minmax(struct ListBase *dispbase, float min[3], float max[3]);
#endif
diff --git a/source/blender/blenkernel/BKE_dynamicpaint.h b/source/blender/blenkernel/BKE_dynamicpaint.h
index 12f61116f5f..537a2946f36 100644
--- a/source/blender/blenkernel/BKE_dynamicpaint.h
+++ b/source/blender/blenkernel/BKE_dynamicpaint.h
@@ -56,7 +56,7 @@ typedef struct PaintPoint {
float color[4];
} PaintPoint;
-/* heigh field waves */
+/* height field waves */
typedef struct PaintWavePoint {
float height;
@@ -65,8 +65,9 @@ typedef struct PaintWavePoint {
short state;
} PaintWavePoint;
-struct DerivedMesh *dynamicPaint_Modifier_do(struct DynamicPaintModifierData *pmd, struct Depsgraph *depsgraph, struct Scene *scene,
- struct Object *ob, struct DerivedMesh *dm);
+struct Mesh *dynamicPaint_Modifier_do(
+ struct DynamicPaintModifierData *pmd, struct Depsgraph *depsgraph, struct Scene *scene,
+ struct Object *ob, struct Mesh *me);
void dynamicPaint_Modifier_free(struct DynamicPaintModifierData *pmd);
void dynamicPaint_Modifier_copy(const struct DynamicPaintModifierData *pmd, struct DynamicPaintModifierData *tsmd);
diff --git a/source/blender/blenkernel/BKE_editmesh.h b/source/blender/blenkernel/BKE_editmesh.h
index 690a42894f2..de4efaf37b0 100644
--- a/source/blender/blenkernel/BKE_editmesh.h
+++ b/source/blender/blenkernel/BKE_editmesh.h
@@ -27,7 +27,7 @@
* \ingroup bke
*
* The \link edmesh EDBM module\endlink is for editmode bmesh stuff.
- * In contrast, the this module is for code shared with blenkernel thats
+ * In contrast, this module is for code shared with blenkernel that's
* only concerned with low level operations on the #BMEditMesh structure.
*/
@@ -41,6 +41,7 @@ struct Scene;
struct DerivedMesh;
struct MeshStatVis;
struct Depsgraph;
+struct EditMeshData;
/**
* This structure is used for mesh edit-mode.
@@ -63,8 +64,9 @@ typedef struct BMEditMesh {
struct BMLoop *(*looptris)[3];
int tottri;
+ struct Mesh *mesh_eval_final, *mesh_eval_cage;
+
/*derivedmesh stuff*/
- struct DerivedMesh *derivedFinal, *derivedCage;
CustomDataMask lastDataMask;
unsigned char (*derivedVertColor)[4];
int derivedVertColorLen;
@@ -97,8 +99,8 @@ void BKE_editmesh_lnorspace_update(BMEditMesh *em);
/* editderivedmesh.c */
/* should really be defined in editmesh.c, but they use 'EditDerivedBMesh' */
-void BKE_editmesh_statvis_calc(BMEditMesh *em, struct DerivedMesh *dm,
- const struct MeshStatVis *statvis);
+void BKE_editmesh_statvis_calc(
+ BMEditMesh *em, struct EditMeshData *emd, const struct MeshStatVis *statvis);
float (*BKE_editmesh_vertexCos_get(
struct Depsgraph *depsgraph, struct BMEditMesh *em, struct Scene *scene, int *r_numVerts))[3];
diff --git a/source/blender/blenkernel/BKE_bmfont_types.h b/source/blender/blenkernel/BKE_editmesh_cache.h
index 31513e4b8f1..aaaa79a0857 100644
--- a/source/blender/blenkernel/BKE_bmfont_types.h
+++ b/source/blender/blenkernel/BKE_editmesh_cache.h
@@ -15,44 +15,22 @@
* 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.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef __BKE_BMFONT_TYPES_H__
-#define __BKE_BMFONT_TYPES_H__
-/** \file BKE_bmfont_types.h
+#ifndef __BKE_EDITMESH_CACHE_H__
+#define __BKE_EDITMESH_CACHE_H__
+
+/** \file BKE_editmesh_cache.h
* \ingroup bke
- * \since March 2001
- * \author nzc
*/
-#define is_power_of_two(N) ((N ^ (N - 1)) == (2 * N - 1))
-/*
- * Moved to IMB_imbuf_types.h where it will live close to the ImBuf type.
- * It is used as a userflag bit mask.
- */
-// #define IB_BITMAPFONT 1
-typedef struct bmGlyph {
- unsigned short unicode;
- short locx, locy;
- signed char ofsx, ofsy;
- unsigned char sizex, sizey;
- unsigned char advance, reserved;
-} bmGlyph;
+struct BMEditMesh;
+struct EditMeshData;
+
+void BKE_editmesh_cache_ensure_poly_normals(struct BMEditMesh *em, struct EditMeshData *emd);
+void BKE_editmesh_cache_ensure_vert_normals(struct BMEditMesh *em, struct EditMeshData *emd);
-typedef struct bmFont {
- char magic[4];
- short version;
- short glyphcount;
- short xsize, ysize;
- bmGlyph glyphs[1];
-} bmFont;
+void BKE_editmesh_cache_ensure_poly_centers(struct BMEditMesh *em, struct EditMeshData *emd);
-#endif
+#endif /* __BKE_EDITMESH_CACHE_H__ */
diff --git a/source/blender/blenkernel/BKE_fcurve.h b/source/blender/blenkernel/BKE_fcurve.h
index c0bbf146afd..ae87009b4a1 100644
--- a/source/blender/blenkernel/BKE_fcurve.h
+++ b/source/blender/blenkernel/BKE_fcurve.h
@@ -108,6 +108,9 @@ bool driver_get_variable_property(
struct ChannelDriver *driver, struct DriverTarget *dtar,
struct PointerRNA *r_ptr, struct PropertyRNA **r_prop, int *r_index);
+bool BKE_driver_has_simple_expression(struct ChannelDriver *driver);
+void BKE_driver_invalidate_expression(struct ChannelDriver *driver, bool expr_changed, bool varname_changed);
+
float evaluate_driver(struct PathResolvedRNA *anim_rna, struct ChannelDriver *driver,
struct ChannelDriver *driver_orig, const float evaltime);
@@ -270,6 +273,17 @@ bool BKE_fcurve_is_protected(struct FCurve *fcu);
/* The curve is an infinite cycle via Cycles modifier */
bool BKE_fcurve_is_cyclic(struct FCurve *fcu);
+/* Type of infinite cycle for a curve. */
+typedef enum eFCU_Cycle_Type {
+ FCU_CYCLE_NONE = 0,
+ /* The cycle repeats identically to the base range. */
+ FCU_CYCLE_PERFECT,
+ /* The cycle accumulates the change between start and end keys. */
+ FCU_CYCLE_OFFSET
+} eFCU_Cycle_Type;
+
+eFCU_Cycle_Type BKE_fcurve_get_cycle_type(struct FCurve *fcu);
+
/* -------- Curve Sanity -------- */
void calchandles_fcurve(struct FCurve *fcu);
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h
index 7497a9f04e3..410c8bb3a65 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -120,14 +120,14 @@ typedef struct Global {
/* G.debug */
enum {
- G_DEBUG = (1 << 0), /* general debug flag, print more info in unexpected cases */
+ G_DEBUG = (1 << 0), /* general debug flag, print more info in unexpected cases */
G_DEBUG_FFMPEG = (1 << 1),
- G_DEBUG_PYTHON = (1 << 2), /* extra python info */
- G_DEBUG_EVENTS = (1 << 3), /* input/window/screen events */
- G_DEBUG_HANDLERS = (1 << 4), /* events handling */
- G_DEBUG_WM = (1 << 5), /* operator, undo */
- G_DEBUG_JOBS = (1 << 6), /* jobs time profiling */
- G_DEBUG_FREESTYLE = (1 << 7), /* freestyle messages */
+ G_DEBUG_PYTHON = (1 << 2), /* extra python info */
+ G_DEBUG_EVENTS = (1 << 3), /* input/window/screen events */
+ G_DEBUG_HANDLERS = (1 << 4), /* events handling */
+ G_DEBUG_WM = (1 << 5), /* operator, undo */
+ G_DEBUG_JOBS = (1 << 6), /* jobs time profiling */
+ G_DEBUG_FREESTYLE = (1 << 7), /* freestyle messages */
G_DEBUG_DEPSGRAPH_BUILD = (1 << 8), /* depsgraph construction messages */
G_DEBUG_DEPSGRAPH_EVAL = (1 << 9), /* depsgraph evaluation messages */
G_DEBUG_DEPSGRAPH_TAG = (1 << 10), /* depsgraph tagging messages */
@@ -138,11 +138,11 @@ enum {
G_DEBUG_DEPSGRAPH_EVAL |
G_DEBUG_DEPSGRAPH_TAG |
G_DEBUG_DEPSGRAPH_TIME),
- G_DEBUG_SIMDATA = (1 << 14), /* sim debug data display */
- G_DEBUG_GPU_MEM = (1 << 15), /* gpu memory in status bar */
- G_DEBUG_GPU = (1 << 16), /* gpu debug */
- G_DEBUG_IO = (1 << 17), /* IO Debugging (for Collada, ...)*/
- G_DEBUG_GPU_SHADERS = (1 << 18), /* GLSL shaders */
+ G_DEBUG_SIMDATA = (1 << 14), /* sim debug data display */
+ G_DEBUG_GPU_MEM = (1 << 15), /* gpu memory in status bar */
+ G_DEBUG_GPU = (1 << 16), /* gpu debug */
+ G_DEBUG_IO = (1 << 17), /* IO Debugging (for Collada, ...)*/
+ G_DEBUG_GPU_SHADERS = (1 << 18), /* GLSL shaders */
};
#define G_DEBUG_ALL (G_DEBUG | G_DEBUG_FFMPEG | G_DEBUG_PYTHON | G_DEBUG_EVENTS | G_DEBUG_WM | G_DEBUG_JOBS | \
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index aad02c371db..1debfecc895 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -50,7 +50,7 @@ struct Brush;
struct Object;
struct bDeformGroup;
struct SimplifyGpencilModifierData;
-struct InstanceGpencilModifierData;
+struct ArrayGpencilModifierData;
struct LatticeGpencilModifierData;
struct MDeformVert;
@@ -122,7 +122,7 @@ bool gpencil_layer_is_editable(const struct bGPDlayer *gpl);
* is no existing GP-Frame on the frame requested.
*/
typedef enum eGP_GetFrame_Mode {
- /* Use the preceeding gp-frame (i.e. don't add anything) */
+ /* Use the preceding gp-frame (i.e. don't add anything) */
GP_GETFRAME_USE_PREV = 0,
/* Add a new empty/blank frame */
@@ -143,6 +143,9 @@ struct Material *BKE_gpencil_get_material_from_brush(struct Brush *brush);
struct Material *BKE_gpencil_material_ensure(struct Main *bmain, struct Object *ob);
/* object boundbox */
+bool BKE_gpencil_data_minmax(
+ struct Object *ob, const struct bGPdata *gpd,
+ float r_min[3], float r_max[3]);
bool BKE_gpencil_stroke_minmax(
const struct bGPDstroke *gps, const bool use_select,
float r_min[3], float r_max[3]);
diff --git a/source/blender/blenkernel/BKE_gpencil_modifier.h b/source/blender/blenkernel/BKE_gpencil_modifier.h
index be27560bbf2..91f368613cb 100644
--- a/source/blender/blenkernel/BKE_gpencil_modifier.h
+++ b/source/blender/blenkernel/BKE_gpencil_modifier.h
@@ -66,16 +66,16 @@ typedef enum {
eGpencilModifierTypeFlag_SupportsEditmode = (1 << 1),
/* For modifiers that support editmode this determines if the
- * modifier should be enabled by default in editmode. This should
- * only be used by modifiers that are relatively speedy and
- * also generally used in editmode, otherwise let the user enable
- * it by hand.
- */
+ * modifier should be enabled by default in editmode. This should
+ * only be used by modifiers that are relatively speedy and
+ * also generally used in editmode, otherwise let the user enable
+ * it by hand.
+ */
eGpencilModifierTypeFlag_EnableInEditmode = (1 << 2),
/* For modifiers that require original data and so cannot
- * be placed after any non-deformative modifier.
- */
+ * be placed after any non-deformative modifier.
+ */
eGpencilModifierTypeFlag_RequiresOriginalData = (1 << 3),
/* max one per type */
@@ -83,6 +83,8 @@ typedef enum {
/* can't be added manually by user */
eGpencilModifierTypeFlag_NoUserAdd = (1 << 5),
+ /* can't be applied */
+ eGpencilModifierTypeFlag_NoApply = (1 << 6),
} GpencilModifierTypeFlag;
/* IMPORTANT! Keep ObjectWalkFunc and IDWalkFunc signatures compatible. */
@@ -102,7 +104,7 @@ typedef struct GpencilModifierTypeInfo {
/* The size of the modifier data type, used by allocation. */
int struct_size;
- GpencilModifierType type;
+ GpencilModifierTypeType type;
GpencilModifierTypeFlag flags;
@@ -150,8 +152,18 @@ typedef struct GpencilModifierTypeInfo {
void (*bakeModifier)(struct Main *bmain, struct Depsgraph *depsgraph,
struct GpencilModifierData *md, struct Object *ob);
+
/********************* Optional functions *********************/
+ /* Callback for GP "time" modifiers that offset keyframe time
+ * Returns the frame number to be used after apply the modifier. This is
+ * usually an offset of the animation for duplicated datablocks.
+ *
+ * This function is optional.
+ */
+ int (*remapTime)(struct GpencilModifierData *md, struct Depsgraph *depsgraph,
+ struct Scene *scene, struct Object *ob, struct bGPDlayer *gpl, int cfra);
+
/* Initialize new instance data for this modifier type, this function
* should set modifier variables to their default values.
*
@@ -222,8 +234,6 @@ typedef struct GpencilModifierTypeInfo {
GreasePencilTexWalkFunc walk, void *userData);
} GpencilModifierTypeInfo;
-void BKE_gpencil_instance_modifier_instance_tfm(struct InstanceGpencilModifierData *mmd, const int elem_idx[3], float r_mat[4][4]);
-
/* Initialize modifier's global data (type info and some common global storages). */
void BKE_gpencil_modifier_init(void);
@@ -242,6 +252,7 @@ void BKE_gpencil_modifiers_foreachIDLink(struct Object *ob, GreasePencilIDWalkFu
void BKE_gpencil_modifiers_foreachTexLink(struct Object *ob, GreasePencilTexWalkFunc walk, void *userData);
bool BKE_gpencil_has_geometry_modifiers(struct Object *ob);
+bool BKE_gpencil_has_time_modifiers(struct Object *ob);
void BKE_gpencil_stroke_modifiers(
struct Depsgraph *depsgraph, struct Object *ob,
@@ -249,6 +260,9 @@ void BKE_gpencil_stroke_modifiers(
void BKE_gpencil_geometry_modifiers(
struct Depsgraph *depsgraph, struct Object *ob,
struct bGPDlayer *gpl, struct bGPDframe *gpf, bool is_render);
+int BKE_gpencil_time_modifier(
+ struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob,
+ struct bGPDlayer *gpl, int cfra, bool is_render);
void BKE_gpencil_lattice_init(struct Object *ob);
void BKE_gpencil_lattice_clear(struct Object *ob);
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index a41d9582add..4bcb8e0c15d 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -211,9 +211,9 @@ struct Image *BKE_image_verify_viewer(struct Main *bmain, int type, const char *
void BKE_image_verify_viewer_views(const struct RenderData *rd, struct Image *ima, struct ImageUser *iuser);
/* called on frame change or before render */
-void BKE_image_user_frame_calc(struct ImageUser *iuser, int cfra, int fieldnr);
-void BKE_image_user_check_frame_calc(struct ImageUser *iuser, int cfra, int fieldnr);
-int BKE_image_user_frame_get(const struct ImageUser *iuser, int cfra, int fieldnr, bool *r_is_in_range);
+void BKE_image_user_frame_calc(struct ImageUser *iuser, int cfra);
+void BKE_image_user_check_frame_calc(struct ImageUser *iuser, int cfra);
+int BKE_image_user_frame_get(const struct ImageUser *iuser, int cfra, bool *r_is_in_range);
void BKE_image_user_file_path(struct ImageUser *iuser, struct Image *ima, char *path);
void BKE_image_update_frame(const struct Main *bmain, int cfra);
diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h
index 0af608a926d..73a6f5047b2 100644
--- a/source/blender/blenkernel/BKE_key.h
+++ b/source/blender/blenkernel/BKE_key.h
@@ -80,23 +80,13 @@ struct KeyBlock *BKE_keyblock_find_name(struct Key *key, const char name[]);
void BKE_keyblock_copy_settings(struct KeyBlock *kb_dst, const struct KeyBlock *kb_src);
char *BKE_keyblock_curval_rnapath_get(struct Key *key, struct KeyBlock *kb);
-// needed for the GE
-typedef struct WeightsArrayCache {
- int num_defgroup_weights;
- float **defgroup_weights;
-} WeightsArrayCache;
-
-float **BKE_keyblock_get_per_block_weights(struct Object *ob, struct Key *key, struct WeightsArrayCache *cache);
-void BKE_keyblock_free_per_block_weights(struct Key *key, float **per_keyblock_weights, struct WeightsArrayCache *cache);
-void BKE_key_evaluate_relative(const int start, int end, const int tot, char *basispoin, struct Key *key, struct KeyBlock *actkb,
- float **per_keyblock_weights, const int mode);
-
/* conversion functions */
/* Note: 'update_from' versions do not (re)allocate mem in kb, while 'convert_from' do. */
void BKE_keyblock_update_from_lattice(struct Lattice *lt, struct KeyBlock *kb);
void BKE_keyblock_convert_from_lattice(struct Lattice *lt, struct KeyBlock *kb);
void BKE_keyblock_convert_to_lattice(struct KeyBlock *kb, struct Lattice *lt);
+int BKE_keyblock_curve_element_count(struct ListBase *nurb);
void BKE_keyblock_update_from_curve(struct Curve *cu, struct KeyBlock *kb, struct ListBase *nurb);
void BKE_keyblock_convert_from_curve(struct Curve *cu, struct KeyBlock *kb, struct ListBase *nurb);
void BKE_keyblock_convert_to_curve(struct KeyBlock *kb, struct Curve *cu, struct ListBase *nurb);
diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h
index 2ca6a35eec5..2e093ba11a2 100644
--- a/source/blender/blenkernel/BKE_lattice.h
+++ b/source/blender/blenkernel/BKE_lattice.h
@@ -62,20 +62,24 @@ void end_latt_deform(struct LatticeDeformData *lattice_deform_data);
bool object_deform_mball(struct Object *ob, struct ListBase *dispbase);
void outside_lattice(struct Lattice *lt);
-void curve_deform_verts(struct Object *cuOb, struct Object *target,
+void curve_deform_verts(
+ struct Object *cuOb, struct Object *target,
struct Mesh *mesh, float (*vertexCos)[3],
int numVerts, const char *vgroup, short defaxis);
-void curve_deform_vector(struct Object *cuOb, struct Object *target,
- float orco[3], float vec[3], float mat[3][3], int no_rot_axis);
-
-void lattice_deform_verts(struct Object *laOb, struct Object *target,
- struct Mesh *mesh, float (*vertexCos)[3],
- int numVerts, const char *vgroup, float influence);
-void armature_deform_verts(struct Object *armOb, struct Object *target,
- const struct Mesh *mesh, float (*vertexCos)[3],
- float (*defMats)[3][3], int numVerts, int deformflag,
- float (*prevCos)[3], const char *defgrp_name,
- struct bGPDstroke *gps);
+void curve_deform_vector(
+ struct Object *cuOb, struct Object *target,
+ float orco[3], float vec[3], float mat[3][3], int no_rot_axis);
+
+void lattice_deform_verts(
+ struct Object *laOb, struct Object *target,
+ struct Mesh *mesh, float (*vertexCos)[3],
+ int numVerts, const char *vgroup, float influence);
+void armature_deform_verts(
+ struct Object *armOb, struct Object *target,
+ const struct Mesh *mesh, float (*vertexCos)[3],
+ float (*defMats)[3][3], int numVerts, int deformflag,
+ float (*prevCos)[3], const char *defgrp_name,
+ struct bGPDstroke *gps);
float (*BKE_lattice_vertexcos_get(struct Object *ob, int *r_numVerts))[3];
void BKE_lattice_vertexcos_apply(struct Object *ob, float (*vertexCos)[3]);
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index db0e5f21284..2d736b41d1a 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -73,7 +73,9 @@ struct Object *BKE_view_layer_camera_find(struct ViewLayer *view_layer);
struct ViewLayer *BKE_view_layer_find_from_collection(const struct Scene *scene, struct LayerCollection *lc);
struct Base *BKE_view_layer_base_find(struct ViewLayer *view_layer, struct Object *ob);
void BKE_view_layer_base_deselect_all(struct ViewLayer *view_layer);
-void BKE_view_layer_base_select(struct ViewLayer *view_layer, struct Base *selbase);
+
+void BKE_view_layer_base_select(struct Base *selbase);
+void BKE_view_layer_base_select_and_set_active(struct ViewLayer *view_layer, struct Base *selbase);
void BKE_view_layer_copy_data(
struct Scene *scene_dst, const struct Scene *scene_src,
@@ -381,6 +383,11 @@ bool BKE_view_layer_filter_edit_mesh_has_edges(struct Object *ob, void *user_dat
.no_dup_data = true, \
.filter_fn = BKE_view_layer_filter_edit_mesh_has_uvs});
+#define BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, r_len, mode) \
+ BKE_view_layer_array_from_objects_in_mode( \
+ view_layer, r_len, { \
+ .object_mode = mode, \
+ .no_dup_data = true});
#ifdef __cplusplus
}
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index 3a6d06d256b..273f074777a 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -166,28 +166,7 @@ bool new_id(struct ListBase *lb, struct ID *id, const char *name) ATTR_NONNULL(1
void id_clear_lib_data(struct Main *bmain, struct ID *id);
void id_clear_lib_data_ex(struct Main *bmain, struct ID *id, const bool id_in_mainlist);
-struct ListBase *which_libbase(struct Main *mainlib, short type);
-
-#define MAX_LIBARRAY 37
-int set_listbasepointers(struct Main *main, struct ListBase *lb[MAX_LIBARRAY]);
-
-/* Main API */
-struct Main *BKE_main_new(void);
-void BKE_main_free(struct Main *mainvar);
-
-void BKE_main_lock(struct Main *bmain);
-void BKE_main_unlock(struct Main *bmain);
-
-void BKE_main_relations_create(struct Main *bmain);
-void BKE_main_relations_free(struct Main *bmain);
-
-struct BlendThumbnail *BKE_main_thumbnail_from_imbuf(struct Main *bmain, struct ImBuf *img);
-struct ImBuf *BKE_main_thumbnail_to_imbuf(struct Main *bmain, struct BlendThumbnail *data);
-void BKE_main_thumbnail_create(struct Main *bmain);
-
-const char *BKE_main_blendfile_path(const struct Main *bmain) ATTR_NONNULL();
-const char *BKE_main_blendfile_path_from_global(void);
-
+/* Affect whole Main database. */
void BKE_main_id_tag_idcode(struct Main *mainvar, const short type, const int tag, const bool value);
void BKE_main_id_tag_listbase(struct ListBase *lb, const int tag, const bool value);
void BKE_main_id_tag_all(struct Main *mainvar, const int tag, const bool value);
@@ -199,8 +178,10 @@ void BKE_main_id_clear_newpoins(struct Main *bmain);
void BKE_main_lib_objects_recalc_all(struct Main *bmain);
-/* (MAX_ID_NAME - 2) + 3 */
-void BKE_id_ui_prefix(char name[66 + 1], const struct ID *id);
+#define MAX_ID_FULL_NAME (64 + 64 + 3 + 1) /* 64 is MAX_ID_NAME - 2 */
+#define MAX_ID_FULL_NAME_UI (MAX_ID_FULL_NAME + 3) /* Adds 'keycode' two letters at begining. */
+void BKE_id_full_name_get(char name[MAX_ID_FULL_NAME], const struct ID *id);
+void BKE_id_full_name_ui_prefix_get(char name[MAX_ID_FULL_NAME_UI], const struct ID *id);
char *BKE_id_to_unique_string_key(const struct ID *id);
@@ -213,7 +194,10 @@ void BKE_library_make_local(
void BKE_id_tag_set_atomic(struct ID *id, int tag);
void BKE_id_tag_clear_atomic(struct ID *id, int tag);
-bool BKE_id_is_in_gobal_main(struct ID *id);
+bool BKE_id_is_in_global_main(struct ID *id);
+
+void BKE_id_ordered_list(struct ListBase *ordered_lb, const struct ListBase *lb);
+void BKE_id_reorder(const struct ListBase *lb, struct ID *id, struct ID *relative, bool after);
/* use when "" is given to new_id() */
#define ID_FALLBACK_NAME N_("Untitled")
diff --git a/source/blender/blenkernel/BKE_library_override.h b/source/blender/blenkernel/BKE_library_override.h
index 4792d203d23..b6642bfa726 100644
--- a/source/blender/blenkernel/BKE_library_override.h
+++ b/source/blender/blenkernel/BKE_library_override.h
@@ -38,6 +38,9 @@ struct IDOverrideStaticProperty;
struct IDOverrideStaticPropertyOperation;
struct Main;
+void BKE_override_static_enable(const bool do_enable);
+bool BKE_override_static_is_enabled(void);
+
struct IDOverrideStatic *BKE_override_static_init(struct ID *local_id, struct ID *reference_id);
void BKE_override_static_copy(struct ID *dst_id, const struct ID *src_id);
void BKE_override_static_clear(struct IDOverrideStatic *override);
diff --git a/source/blender/blenkernel/BKE_library_query.h b/source/blender/blenkernel/BKE_library_query.h
index b66fc0aab16..dcba5df9a72 100644
--- a/source/blender/blenkernel/BKE_library_query.h
+++ b/source/blender/blenkernel/BKE_library_query.h
@@ -70,7 +70,7 @@ enum {
enum {
IDWALK_RET_NOP = 0,
- IDWALK_RET_STOP_ITER = 1 << 0, /* Completly stop iteration. */
+ IDWALK_RET_STOP_ITER = 1 << 0, /* Completely stop iteration. */
IDWALK_RET_STOP_RECURSION = 1 << 1, /* Stop recursion, that is, do not loop over ID used by current one. */
};
diff --git a/source/blender/blenkernel/BKE_main.h b/source/blender/blenkernel/BKE_main.h
index 0913cf208eb..e5a816b92ce 100644
--- a/source/blender/blenkernel/BKE_main.h
+++ b/source/blender/blenkernel/BKE_main.h
@@ -42,17 +42,20 @@
*/
#include "DNA_listBase.h"
-#include "BKE_library.h"
+#include "BLI_compiler_attrs.h"
+#include "BLI_sys_types.h"
#ifdef __cplusplus
extern "C" {
#endif
+struct BlendThumbnail;
+struct BLI_mempool;
struct Depsgraph;
+struct GHash;
+struct ImBuf;
struct Library;
struct MainLock;
-struct GHash;
-struct BLI_mempool;
/* Blender thumbnail, as written on file (width, height, and data as char RGBA). */
/* We pack pixel data after that struct. */
@@ -136,6 +139,27 @@ typedef struct Main {
struct MainLock *lock;
} Main;
+struct Main *BKE_main_new(void);
+void BKE_main_free(struct Main *mainvar);
+
+void BKE_main_lock(struct Main *bmain);
+void BKE_main_unlock(struct Main *bmain);
+
+void BKE_main_relations_create(struct Main *bmain);
+void BKE_main_relations_free(struct Main *bmain);
+
+struct BlendThumbnail *BKE_main_thumbnail_from_imbuf(struct Main *bmain, struct ImBuf *img);
+struct ImBuf *BKE_main_thumbnail_to_imbuf(struct Main *bmain, struct BlendThumbnail *data);
+void BKE_main_thumbnail_create(struct Main *bmain);
+
+const char *BKE_main_blendfile_path(const struct Main *bmain) ATTR_NONNULL();
+const char *BKE_main_blendfile_path_from_global(void);
+
+struct ListBase *which_libbase(struct Main *mainlib, short type);
+
+#define MAX_LIBARRAY 37
+int set_listbasepointers(struct Main *main, struct ListBase *lb[MAX_LIBARRAY]);
+
#define MAIN_VERSION_ATLEAST(main, ver, subver) \
((main)->versionfile > (ver) || (main->versionfile == (ver) && (main)->subversionfile >= (subver)))
diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h
index 2eee5f72c0f..a7706915bc5 100644
--- a/source/blender/blenkernel/BKE_mball.h
+++ b/source/blender/blenkernel/BKE_mball.h
@@ -49,6 +49,7 @@ struct MetaBall *BKE_mball_copy(struct Main *bmain, const struct MetaBall *mb);
void BKE_mball_make_local(struct Main *bmain, struct MetaBall *mb, const bool lib_local);
bool BKE_mball_is_any_selected(const struct MetaBall *mb);
+bool BKE_mball_is_any_selected_multi(struct Object **objects, int objects_len);
bool BKE_mball_is_any_unselected(const struct MetaBall *mb);
bool BKE_mball_is_basis_for(struct Object *ob1, struct Object *ob2);
bool BKE_mball_is_basis(struct Object *ob);
@@ -60,19 +61,25 @@ float *BKE_mball_make_orco(struct Object *ob, struct ListBase *dispbase);
void BKE_mball_properties_copy(struct Scene *scene, struct Object *active_object);
-bool BKE_mball_minmax(struct MetaBall *mb, float min[3], float max[3]);
-bool BKE_mball_minmax_ex(struct MetaBall *mb, float min[3], float max[3],
- float obmat[4][4], const short flag);
-bool BKE_mball_center_median(struct MetaBall *mb, float r_cent[3]);
-bool BKE_mball_center_bounds(struct MetaBall *mb, float r_cent[3]);
+bool BKE_mball_minmax_ex(
+ const struct MetaBall *mb, float min[3], float max[3],
+ const float obmat[4][4], const short flag);
+bool BKE_mball_minmax(const struct MetaBall *mb, float min[3], float max[3]);
+bool BKE_mball_center_median(const struct MetaBall *mb, float r_cent[3]);
+bool BKE_mball_center_bounds(const struct MetaBall *mb, float r_cent[3]);
void BKE_mball_transform(struct MetaBall *mb, float mat[4][4], const bool do_props);
void BKE_mball_translate(struct MetaBall *mb, const float offset[3]);
struct MetaElem *BKE_mball_element_add(struct MetaBall *mb, const int type);
+int BKE_mball_select_count(const struct MetaBall *mb);
+int BKE_mball_select_count_multi(struct Object **objects, int objects_len);
void BKE_mball_select_all(struct MetaBall *mb);
+void BKE_mball_select_all_multi(struct Object **objects, int objects_len);
void BKE_mball_deselect_all(struct MetaBall *mb);
+void BKE_mball_deselect_all_multi(struct Object **objects, int objects_len);
void BKE_mball_select_swap(struct MetaBall *mb);
+void BKE_mball_select_swap_multi(struct Object **objects, int objects_len);
/* **** Depsgraph evaluation **** */
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 0d7c4c6f597..8f0c81ce4f9 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -32,7 +32,7 @@
*/
/* defines BLI_INLINE */
-#include "BLI_utildefines.h"
+#include "BLI_compiler_compat.h"
/* defines CustomDataMask */
#include "BKE_customdata.h"
@@ -67,6 +67,7 @@ struct CustomData;
struct Scene;
struct MLoopUV;
struct ReportList;
+struct BMEditMesh;
#ifdef __cplusplus
extern "C" {
@@ -89,7 +90,11 @@ struct BMesh *BKE_mesh_to_bmesh(
struct Mesh *me, struct Object *ob,
const bool add_key_index, const struct BMeshCreateParams *params);
-struct Mesh *BKE_bmesh_to_mesh_nomain(struct BMesh *bm, const struct BMeshToMeshParams *params);
+struct Mesh *BKE_mesh_from_bmesh_nomain(struct BMesh *bm, const struct BMeshToMeshParams *params);
+struct Mesh *BKE_mesh_from_bmesh_for_eval_nomain(struct BMesh *bm, int64_t cd_mask_extra);
+
+struct Mesh *BKE_mesh_from_editmesh_with_coords_thin_wrap(
+ struct BMEditMesh *em, CustomDataMask data_mask, float (*vertexCos)[3]);
int poly_find_loop_from_vert(
const struct MPoly *poly,
@@ -100,6 +105,7 @@ int poly_get_adj_loops_from_vert(
unsigned int r_adj[2]);
int BKE_mesh_edge_other_vert(const struct MEdge *e, int v);
+void BKE_mesh_looptri_get_real_edges(const struct Mesh *mesh, const struct MLoopTri *looptri, int r_edges[3]);
void BKE_mesh_free(struct Mesh *me);
void BKE_mesh_init(struct Mesh *me);
@@ -117,8 +123,8 @@ struct Mesh *BKE_mesh_new_nomain_from_template(
int verts_len, int edges_len, int tessface_len,
int loops_len, int polys_len);
-/* Performs copy for use during evaluation. */
-struct Mesh *BKE_mesh_copy_for_eval(struct Mesh *source);
+/* Performs copy for use during evaluation, optional referencing original arrays to reduce memory. */
+struct Mesh *BKE_mesh_copy_for_eval(struct Mesh *source, bool reference);
/* These functions construct a new Mesh, contrary to BKE_mesh_from_nurbs which modifies ob itself. */
struct Mesh *BKE_mesh_new_nomain_from_curve(struct Object *ob);
@@ -174,7 +180,7 @@ void BKE_mesh_split_faces(struct Mesh *mesh, bool free_loop_normals);
struct Mesh *BKE_mesh_new_from_object(
struct Depsgraph *depsgraph, struct Main *bmain, struct Scene *sce, struct Object *ob,
- const bool apply_modifiers, const bool calc_tessface, const bool calc_undeformed);
+ const bool apply_modifiers, const bool calc_undeformed);
struct Mesh *BKE_mesh_create_derived_for_modifier(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob,
struct ModifierData *md, int build_shapekey_layers);
@@ -230,6 +236,7 @@ void BKE_mesh_calc_normals_poly(
const bool only_face_normals);
void BKE_mesh_calc_normals(struct Mesh *me);
void BKE_mesh_ensure_normals(struct Mesh *me);
+void BKE_mesh_ensure_normals_for_display(struct Mesh *mesh);
void BKE_mesh_calc_normals_tessface(
struct MVert *mverts, int numVerts,
const struct MFace *mfaces, int numFaces,
@@ -239,13 +246,6 @@ void BKE_mesh_calc_normals_looptri(
const struct MLoop *mloop,
const struct MLoopTri *looptri, int looptri_num,
float (*r_tri_nors)[3]);
-void BKE_mesh_loop_tangents_ex(
- const struct MVert *mverts, const int numVerts, const struct MLoop *mloops,
- float (*r_looptangent)[4], float (*loopnors)[3], const struct MLoopUV *loopuv,
- const int numLoops, const struct MPoly *mpolys, const int numPolys,
- struct ReportList *reports);
-void BKE_mesh_loop_tangents(
- struct Mesh *mesh, const char *uvmap, float (*r_looptangents)[4], struct ReportList *reports);
void BKE_mesh_loop_manifold_fan_around_vert_next(
const struct MLoop *mloops, const struct MPoly *mpolys,
const int *loop_to_poly, const int *e2lfan_curr, const uint mv_pivot_index,
@@ -498,7 +498,9 @@ void BKE_mesh_strip_loose_polysloops(struct Mesh *me);
void BKE_mesh_strip_loose_edges(struct Mesh *me);
void BKE_mesh_calc_edges_legacy(struct Mesh *me, const bool use_old);
+void BKE_mesh_calc_edges_loose(struct Mesh *mesh);
void BKE_mesh_calc_edges(struct Mesh *mesh, bool update, const bool select);
+void BKE_mesh_calc_edges_tessface(struct Mesh *mesh);
/* **** Depsgraph evaluation **** */
@@ -512,6 +514,8 @@ enum {
BKE_MESH_BATCH_DIRTY_SELECT,
BKE_MESH_BATCH_DIRTY_SHADING,
BKE_MESH_BATCH_DIRTY_SCULPT_COORDS,
+ BKE_MESH_BATCH_DIRTY_UVEDIT_ALL,
+ BKE_MESH_BATCH_DIRTY_UVEDIT_SELECT,
};
void BKE_mesh_batch_cache_dirty_tag(struct Mesh *me, int mode);
void BKE_mesh_batch_cache_free(struct Mesh *me);
@@ -519,8 +523,7 @@ void BKE_mesh_batch_cache_free(struct Mesh *me);
/* Inlines */
-/* This is a copy of DM_origindex_mface_mpoly().
- * Instead of -1 that function uses ORIGINDEX_NONE as defined in BKE_customdata.h,
+/* Instead of -1 that function uses ORIGINDEX_NONE as defined in BKE_customdata.h,
* but I don't want to force every user of BKE_mesh.h to also include that file.
* ~~ Sybren */
BLI_INLINE int BKE_mesh_origindex_mface_mpoly(
diff --git a/source/blender/blenkernel/BKE_mesh_runtime.h b/source/blender/blenkernel/BKE_mesh_runtime.h
index 9d29299cacd..050d17771c9 100644
--- a/source/blender/blenkernel/BKE_mesh_runtime.h
+++ b/source/blender/blenkernel/BKE_mesh_runtime.h
@@ -87,6 +87,10 @@ struct Mesh *mesh_get_eval_deform(
struct Depsgraph *depsgraph, struct Scene *scene,
struct Object *ob, CustomDataMask dataMask);
+struct Mesh *mesh_create_eval_final_render(
+ struct Depsgraph *depsgraph, struct Scene *scene,
+ struct Object *ob, CustomDataMask dataMask);
+
#ifdef USE_DERIVEDMESH
struct DerivedMesh *mesh_create_derived_index_render(
struct Depsgraph *depsgraph, struct Scene *scene,
@@ -107,9 +111,6 @@ struct Mesh *mesh_create_eval_final_view(
void BKE_mesh_runtime_eval_to_meshkey(struct Mesh *me_deformed, struct Mesh *me, struct KeyBlock *kb);
-/* Temporary? A function to give a colorband to derivedmesh for vertexcolor ranges */
-void BKE_mesh_runtime_color_band_store(const struct ColorBand *coba, const char alert_color[4]);
-
#ifndef NDEBUG
char *BKE_mesh_runtime_debug_info(struct Mesh *me_eval);
diff --git a/source/blender/blenkernel/BKE_mesh_tangent.h b/source/blender/blenkernel/BKE_mesh_tangent.h
index 09575f39e98..62d8f3ada84 100644
--- a/source/blender/blenkernel/BKE_mesh_tangent.h
+++ b/source/blender/blenkernel/BKE_mesh_tangent.h
@@ -49,6 +49,10 @@ void BKE_mesh_calc_loop_tangent_ex(
const uint loopdata_out_len,
short *tangent_mask_curr_p);
+void BKE_mesh_calc_loop_tangents(
+ struct Mesh *me_eval, bool calc_active_tangent,
+ const char (*tangent_names)[MAX_NAME], int tangent_names_len);
+
/* Helpers */
void BKE_mesh_add_loop_tangent_named_layer_for_uv(
struct CustomData *uv_data, struct CustomData *tan_data, int numLoopData,
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index d0b9d2adc5b..6b64b1663d8 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -119,12 +119,6 @@ typedef enum ModifierApplyFlag {
MOD_APPLY_IGNORE_SIMPLIFY = 1 << 3, /* Ignore scene simplification flag and use subdivisions
* level set in multires modifier.
*/
- MOD_APPLY_ALLOW_GPU = 1 << 4, /* Allow modifier to be applied and stored in the GPU.
- * Used by the viewport in order to be able to have SS
- * happening on GPU.
- * Render pipeline (including viewport render) should
- * have DM on the CPU.
- */
} ModifierApplyFlag;
typedef struct ModifierUpdateDepsgraphContext {
@@ -170,59 +164,14 @@ typedef struct ModifierTypeInfo {
/********************* Deform modifier functions *********************/ /* DEPRECATED */
- /* Only for deform types, should apply the deformation
- * to the given vertex array. If the deformer requires information from
- * the object it can obtain it from the derivedData argument if non-NULL,
- * and otherwise the ob argument.
- */
- void (*deformVerts_DM)(struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts);
-
- /* Like deformMatricesEM but called from object mode (for supporting modifiers in sculpt mode) */
- void (*deformMatrices_DM)(struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct DerivedMesh *derivedData,
- float (*vertexCos)[3], float (*defMats)[3][3], int numVerts);
-
- /* Like deformVerts but called during editmode (for supporting modifiers)
- */
- void (*deformVertsEM_DM)(struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *editData,
- struct DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts);
-
- /* Set deform matrix per vertex for crazyspace correction */
- void (*deformMatricesEM_DM)(struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *editData,
- struct DerivedMesh *derivedData,
- float (*vertexCos)[3], float (*defMats)[3][3], int numVerts);
+ void (*deformVerts_DM_removed)(void);
+ void (*deformMatrices_DM_removed)(void);
+ void (*deformVertsEM_DM_removed)(void);
+ void (*deformMatricesEM_DM_removed)(void);
/********************* Non-deform modifier functions *********************/ /* DEPRECATED */
- /* For non-deform types: apply the modifier and return a derived
- * data object (type is dependent on object type).
- *
- * The derivedData argument should always be non-NULL; the modifier
- * should read the object data from the derived object instead of the
- * actual object data.
- *
- * The modifier may reuse the derivedData argument (i.e. return it in
- * modified form), but must not release it.
- */
- struct DerivedMesh *(*applyModifier_DM)(struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct DerivedMesh *derivedData);
-
- /* Like applyModifier but called during editmode (for supporting
- * modifiers).
- *
- * The derived object that is returned must support the operations that
- * are expected from editmode objects. The same qualifications regarding
- * derivedData apply as for applyModifier.
- */
- struct DerivedMesh *(*applyModifierEM_DM)(struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *editData,
- struct DerivedMesh *derivedData);
-
+ void (*applyModifier_DM_removed)(void);
/********************* Deform modifier functions *********************/
@@ -263,17 +212,6 @@ typedef struct ModifierTypeInfo {
struct Mesh *(*applyModifier)(struct ModifierData *md, const struct ModifierEvalContext *ctx,
struct Mesh *mesh);
- /* Like applyModifier but called during editmode (for supporting
- * modifiers).
- *
- * The mesh object that is returned must support the operations that
- * are expected from editmode objects. The same qualifications regarding
- * mesh apply as for applyModifier.
- */
- struct Mesh *(*applyModifierEM)(struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *editData,
- struct Mesh *mesh);
-
/********************* Optional functions *********************/
@@ -474,91 +412,38 @@ const char *modifier_path_relbase_from_global(struct Object *ob);
/* wrappers for modifier callbacks that ensure valid normals */
-struct DerivedMesh *modwrap_applyModifier(
+struct Mesh *modwrap_applyModifier(
ModifierData *md, const struct ModifierEvalContext *ctx,
- struct DerivedMesh *dm);
-
-struct DerivedMesh *modwrap_applyModifierEM(
- ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *em, struct DerivedMesh *dm);
+ struct Mesh *me);
void modwrap_deformVerts(
ModifierData *md, const struct ModifierEvalContext *ctx,
- struct DerivedMesh *dm,
+ struct Mesh *me,
float (*vertexCos)[3], int numVerts);
void modwrap_deformVertsEM(
ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *em, struct DerivedMesh *dm,
+ struct BMEditMesh *em, struct Mesh *me,
float (*vertexCos)[3], int numVerts);
+#define applyModifier_DM_wrapper(NEW_FUNC_NAME, OLD_FUNC_NAME) \
+ static Mesh *NEW_FUNC_NAME(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) \
+ { \
+ DerivedMesh *dm = CDDM_from_mesh_ex(mesh, CD_REFERENCE, CD_MASK_EVERYTHING); \
+ DerivedMesh *ndm = OLD_FUNC_NAME(md, ctx, dm); \
+ if (ndm != dm) dm->release(dm); \
+ DM_to_mesh(ndm, mesh, ctx->object, CD_MASK_EVERYTHING, true); \
+ return mesh; \
+ }
+
/* wrappers for modifier callbacks that accept Mesh and select the proper implementation
* depending on if the modifier has been ported to Mesh or is still using DerivedMesh
*/
-void modifier_deformVerts(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct Mesh *mesh, float (*vertexCos)[3], int numVerts);
-
-void modifier_deformVerts_ensure_normals(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct Mesh *mesh, float (*vertexCos)[3], int numVerts);
-
-void modifier_deformMatrices(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct Mesh *mesh, float (*vertexCos)[3], float (*defMats)[3][3], int numVerts);
-
-void modifier_deformVertsEM(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *editData, struct Mesh *mesh,
- float (*vertexCos)[3], int numVerts);
-
-void modifier_deformMatricesEM(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *editData, struct Mesh *mesh,
- float (*vertexCos)[3], float (*defMats)[3][3], int numVerts);
-
-struct Mesh *modifier_applyModifier(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct Mesh *mesh);
-
-struct Mesh *modifier_applyModifier_ensure_normals(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct Mesh *mesh);
-
-struct Mesh *modifier_applyModifierEM(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *editData, struct Mesh *mesh);
-
-/* depricated variants of above that accept DerivedMesh */
-
-void modifier_deformVerts_DM_deprecated(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts);
-
-void modifier_deformMatrices_DM_deprecated(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct DerivedMesh *dm,
- float (*vertexCos)[3], float (*defMats)[3][3], int numVerts);
-
-void modifier_deformVertsEM_DM_deprecated(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *editData, struct DerivedMesh *dm,
- float (*vertexCos)[3], int numVerts);
-
-void modifier_deformMatricesEM_DM_deprecated(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *editData, struct DerivedMesh *dm,
- float (*vertexCos)[3], float (*defMats)[3][3], int numVerts);
-
struct DerivedMesh *modifier_applyModifier_DM_deprecated(
struct ModifierData *md, const struct ModifierEvalContext *ctx,
struct DerivedMesh *dm);
-struct DerivedMesh *modifier_applyModifierEM_DM_deprecated(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *editData, struct DerivedMesh *dm);
-
struct Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(
struct Object *ob_eval, bool *r_free_mesh);
diff --git a/source/blender/blenkernel/BKE_movieclip.h b/source/blender/blenkernel/BKE_movieclip.h
index ee8e22048a1..5071724d772 100644
--- a/source/blender/blenkernel/BKE_movieclip.h
+++ b/source/blender/blenkernel/BKE_movieclip.h
@@ -88,7 +88,7 @@ bool BKE_movieclip_put_frame_if_possible(struct MovieClip *clip, struct MovieCli
void BKE_movieclip_eval_update(struct Depsgraph *depsgraph, struct MovieClip *clip);
void BKE_movieclip_eval_selection_update(struct Depsgraph *depsgraph, struct MovieClip *clip);
-/* cacheing flags */
+/* caching flags */
#define MOVIECLIP_CACHE_SKIP (1 << 0)
/* postprocessing flags */
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h
index d9136846830..decfdc532a6 100644
--- a/source/blender/blenkernel/BKE_multires.h
+++ b/source/blender/blenkernel/BKE_multires.h
@@ -32,7 +32,10 @@
* \ingroup bke
*/
+#include "BLI_compiler_compat.h"
+
enum MultiresModifiedFlags;
+
struct Depsgraph;
struct DerivedMesh;
struct MDisps;
@@ -42,6 +45,7 @@ struct Multires;
struct MultiresModifierData;
struct Object;
struct Scene;
+struct SubdivCCG;
struct MLoop;
struct MVert;
@@ -86,7 +90,7 @@ int multires_get_level(const struct Scene *scene, const struct Object *ob, const
bool render, bool ignore_simplify);
struct DerivedMesh *get_multires_dm(struct Depsgraph *depsgraph, struct Scene *scene, struct MultiresModifierData *mmd,
struct Object *ob);
-struct Mesh *get_multires_mesh(
+struct Mesh *BKE_multires_create_mesh(
struct Depsgraph *depsgraph, struct Scene *scene,
struct MultiresModifierData *mmd, struct Object *ob);
void multiresModifier_del_levels(struct MultiresModifierData *mmd, struct Scene *scene, struct Object *object, int direction);
@@ -116,7 +120,7 @@ int mdisp_rot_face_to_crn(struct MVert *mvert, struct MPoly *mpoly, struct MLoop
/* Reshaping, define in multires_reshape.c */
-bool multiresModifier_reshape(
+bool multiresModifier_reshapeFromObject(
struct Depsgraph *depsgraph,
struct MultiresModifierData *mmd,
struct Object *dst,
@@ -126,6 +130,10 @@ bool multiresModifier_reshapeFromDeformModifier(
struct MultiresModifierData *mmd,
struct Object *ob,
struct ModifierData *md);
+bool multiresModifier_reshapeFromCCG(
+ const int tot_level,
+ struct Mesh *coarse_mesh,
+ struct SubdivCCG *subdiv_ccg);
/* Subdivision integration, defined in multires_subdiv.c */
@@ -145,4 +153,18 @@ void BKE_multires_subdiv_mesh_settings_init(
const bool use_render_params,
const bool ignore_simplify);
+/* General helpers. */
+
+/* For a given partial derivatives of a ptex face get tangent matrix for
+ * displacement.
+ * Corner needs to be known to properly "rotate" partial derivatives.
+ */
+BLI_INLINE void BKE_multires_construct_tangent_matrix(
+ float tangent_matrix[3][3],
+ const float dPdu[3],
+ const float dPdv[3],
+ const int corner);
+
#endif /* __BKE_MULTIRES_H__ */
+
+#include "intern/multires_inline.h"
diff --git a/source/blender/blenkernel/BKE_nla.h b/source/blender/blenkernel/BKE_nla.h
index 37929bae042..a42819e52a2 100644
--- a/source/blender/blenkernel/BKE_nla.h
+++ b/source/blender/blenkernel/BKE_nla.h
@@ -47,13 +47,13 @@ struct PropertyRNA;
/* ----------------------------- */
/* Data Management */
-void BKE_nlastrip_free(ListBase *strips, struct NlaStrip *strip);
-void BKE_nlatrack_free(ListBase *tracks, struct NlaTrack *nlt);
-void BKE_nla_tracks_free(ListBase *tracks);
+void BKE_nlastrip_free(ListBase *strips, struct NlaStrip *strip, bool do_id_user);
+void BKE_nlatrack_free(ListBase *tracks, struct NlaTrack *nlt, bool do_id_user);
+void BKE_nla_tracks_free(ListBase *tracks, bool do_id_user);
-struct NlaStrip *BKE_nlastrip_copy(struct Main *bmain, struct NlaStrip *strip, const bool use_same_action);
-struct NlaTrack *BKE_nlatrack_copy(struct Main *bmain, struct NlaTrack *nlt, const bool use_same_actions);
-void BKE_nla_tracks_copy(struct Main *bmain, ListBase *dst, ListBase *src);
+struct NlaStrip *BKE_nlastrip_copy(struct Main *bmain, struct NlaStrip *strip, const bool use_same_action, const int flag);
+struct NlaTrack *BKE_nlatrack_copy(struct Main *bmain, struct NlaTrack *nlt, const bool use_same_actions, const int flag);
+void BKE_nla_tracks_copy(struct Main *bmain, ListBase *dst, ListBase *src, const int flag);
struct NlaTrack *BKE_nlatrack_add(struct AnimData *adt, struct NlaTrack *prev);
struct NlaStrip *BKE_nlastrip_new(struct bAction *act);
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 901822583cb..9b8febce756 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -32,7 +32,7 @@
* \ingroup bke
*/
-#include "BLI_utildefines.h"
+#include "BLI_compiler_compat.h"
#include "BLI_ghash.h"
#include "DNA_listBase.h"
@@ -466,6 +466,10 @@ bool nodeAttachNodeCheck(struct bNode *node, struct bNode *parent);
void nodeAttachNode(struct bNode *node, struct bNode *parent);
void nodeDetachNode(struct bNode *node);
+void nodePositionRelative(struct bNode *from_node, struct bNode *to_node,
+ struct bNodeSocket *from_sock, struct bNodeSocket *to_sock);
+void nodePositionPropagate(struct bNode *node);
+
struct bNode *nodeFindNodebyName(struct bNodeTree *ntree, const char *name);
int nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex);
struct bNode *nodeFindRootParent(bNode *node);
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 637ee304e72..bf0ed787e9a 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -102,7 +102,7 @@ typedef enum eObjectVisibilityCheck {
OB_VISIBILITY_CHECK_UNKNOWN_RENDER_MODE,
} eObjectVisibilityCheck;
-bool BKE_object_is_visible(struct Object *ob, const eObjectVisibilityCheck mode);
+bool BKE_object_is_visible(const struct Object *ob, const eObjectVisibilityCheck mode);
void BKE_object_init(struct Object *ob);
struct Object *BKE_object_add_only_object(
@@ -183,6 +183,7 @@ void BKE_object_dimensions_get(struct Object *ob, float vec[3]);
void BKE_object_dimensions_set(struct Object *ob, const float value[3]);
void BKE_object_empty_draw_type_set(struct Object *ob, const int value);
void BKE_object_boundbox_flag(struct Object *ob, int flag, const bool set);
+void BKE_object_boundbox_calc_from_mesh(struct Object *ob, struct Mesh *me_eval);
void BKE_object_minmax(struct Object *ob, float r_min[3], float r_max[3], const bool use_hidden);
bool BKE_object_minmax_dupli(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob,
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index c440a634c9f..6f54e2b3b17 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -33,10 +33,12 @@
*/
struct bContext;
+struct bToolRef;
struct BMesh;
struct BMFace;
struct Brush;
struct CurveMapping;
+struct EnumPropertyItem;
struct MeshElemMap;
struct GridPaintMask;
struct Main;
@@ -56,10 +58,12 @@ struct Scene;
struct ViewLayer;
struct Sculpt;
struct StrokeCache;
+struct SubdivCCG;
struct Tex;
struct ImagePool;
struct UnifiedPaintSettings;
struct Depsgraph;
+struct ToolSettings;
enum eOverlayFlags;
@@ -72,13 +76,17 @@ extern const char PAINT_CURSOR_TEXTURE_PAINT[3];
typedef enum ePaintMode {
ePaintSculpt = 0,
+ /** Vertex color. */
ePaintVertex = 1,
ePaintWeight = 2,
- ePaintTextureProjective = 3,
+ /** 3D view (projection painting). */
+ ePaintTexture3D = 3,
+ /** Image space (2D painting). */
ePaintTexture2D = 4,
ePaintSculptUV = 5,
- ePaintInvalid = 6,
- ePaintGpencil = 7
+ ePaintGpencil = 6,
+
+ ePaintInvalid = 7,
} ePaintMode;
/* overlay invalidation */
@@ -103,6 +111,7 @@ void BKE_paint_reset_overlay_invalid(eOverlayControlFlags flag);
void BKE_paint_set_overlay_override(enum eOverlayFlags flag);
/* palettes */
+void BKE_palette_init(struct Palette *palette);
void BKE_palette_free(struct Palette *palette);
struct Palette *BKE_palette_add(struct Main *bmain, const char *name);
void BKE_palette_copy_data(
@@ -122,17 +131,24 @@ void BKE_paint_curve_copy_data(
struct PaintCurve *BKE_paint_curve_copy(struct Main *bmain, const struct PaintCurve *pc);
void BKE_paint_curve_make_local(struct Main *bmain, struct PaintCurve *pc, const bool lib_local);
+bool BKE_paint_ensure(const struct ToolSettings *ts, struct Paint **r_paint);
void BKE_paint_init(struct Main *bmain, struct Scene *sce, ePaintMode mode, const char col[3]);
void BKE_paint_free(struct Paint *p);
void BKE_paint_copy(struct Paint *src, struct Paint *tar, const int flag);
+void BKE_paint_runtime_init(const struct ToolSettings *ts, struct Paint *paint);
+
void BKE_paint_cavity_curve_preset(struct Paint *p, int preset);
-eObjectMode BKE_paint_object_mode_from_paint_mode(ePaintMode mode);
+eObjectMode BKE_paint_object_mode_from_paintmode(ePaintMode mode);
struct Paint *BKE_paint_get_active_from_paintmode(struct Scene *sce, ePaintMode mode);
+const struct EnumPropertyItem *BKE_paint_get_tool_enum_from_paintmode(ePaintMode mode);
+const char *BKE_paint_get_tool_prop_id_from_paintmode(ePaintMode mode);
+uint BKE_paint_get_brush_tool_offset_from_paintmode(const ePaintMode mode);
struct Paint *BKE_paint_get_active(struct Scene *sce, struct ViewLayer *view_layer);
struct Paint *BKE_paint_get_active_from_context(const struct bContext *C);
ePaintMode BKE_paintmode_get_active_from_context(const struct bContext *C);
+ePaintMode BKE_paintmode_get_from_tool(const struct bToolRef *tref);
struct Brush *BKE_paint_brush(struct Paint *paint);
void BKE_paint_brush_set(struct Paint *paint, struct Brush *br);
struct Palette *BKE_paint_palette(struct Paint *paint);
@@ -166,6 +182,15 @@ void paint_update_brush_rake_rotation(struct UnifiedPaintSettings *ups, struct B
void BKE_paint_stroke_get_average(struct Scene *scene, struct Object *ob, float stroke[3]);
+
+/* Tool slot API. */
+void BKE_paint_toolslots_init_from_main(struct Main *bmain);
+void BKE_paint_toolslots_len_ensure(struct Paint *paint, int len);
+void BKE_paint_toolslots_brush_update_ex(struct Paint *paint, struct Brush *brush);
+void BKE_paint_toolslots_brush_update(struct Paint *paint);
+void BKE_paint_toolslots_brush_validate(struct Main *bmain, struct Paint *paint);
+struct Brush *BKE_paint_toolslots_brush_get(struct Paint *paint, int slot_index);
+
/* Used for both vertex color and weight paint */
struct SculptVertexPaintGeomMap {
int *vert_map_mem;
@@ -198,6 +223,9 @@ typedef struct SculptSession {
/* Undo/redo log for dynamic topology sculpting */
struct BMLog *bm_log;
+ /* Limit surface/grids. */
+ struct SubdivCCG *subdiv_ccg;
+
/* PBVH acceleration structure */
struct PBVH *pbvh;
bool show_diffuse_color;
@@ -261,7 +289,7 @@ int BKE_sculpt_mask_layers_ensure(struct Object *ob,
struct MultiresModifierData *mmd);
void BKE_sculpt_toolsettings_data_ensure(struct Scene *scene);
-struct PBVH *BKE_sculpt_object_pbvh_ensure(struct Object *ob, struct Mesh *me_eval_deform);
+struct PBVH *BKE_sculpt_object_pbvh_ensure(struct Depsgraph *depsgraph, struct Object *ob);
enum {
SCULPT_MASK_LAYER_CALC_VERT = (1 << 0),
diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
index 3279839f8b5..aa00024b27b 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -67,7 +67,7 @@ struct ViewLayer;
#define PARTICLE_COLLISION_MAX_COLLISIONS 10
-#define PARTICLE_P ParticleData * pa; int p
+#define PARTICLE_P ParticleData *pa; int p
#define LOOP_PARTICLES for (p = 0, pa = psys->particles; p < psys->totpart; p++, pa++)
#define LOOP_EXISTING_PARTICLES for (p = 0, pa = psys->particles; p < psys->totpart; p++, pa++) if (!(pa->flag & PARS_UNEXIST))
#define LOOP_SHOWN_PARTICLES for (p = 0, pa = psys->particles; p < psys->totpart; p++, pa++) if (!(pa->flag & (PARS_UNEXIST | PARS_NO_DISP)))
@@ -75,7 +75,7 @@ struct ViewLayer;
#define LOOP_DYNAMIC_PARTICLES for (p = 0; p < psys->totpart; p++) if ((pa = psys->particles + p)->state.time > 0.0f)
/* fast but sure way to get the modifier*/
-#define PARTICLE_PSMD ParticleSystemModifierData * psmd = sim->psmd ? sim->psmd : psys_get_modifier(sim->ob, sim->psys)
+#define PARTICLE_PSMD ParticleSystemModifierData *psmd = sim->psmd ? sim->psmd : psys_get_modifier(sim->ob, sim->psys)
/* common stuff that many particle functions need */
typedef struct ParticleSimulationData {
@@ -304,7 +304,7 @@ void psys_set_current_num(Object *ob, int index);
struct LatticeDeformData *psys_create_lattice_deform_data(struct ParticleSimulationData *sim);
struct ParticleSystem *psys_orig_get(struct ParticleSystem *psys);
-bool psys_in_edit_mode(struct Depsgraph *depsgraph, struct ParticleSystem *psys);
+bool psys_in_edit_mode(struct Depsgraph *depsgraph, const struct ParticleSystem *psys);
bool psys_check_enabled(struct Object *ob, struct ParticleSystem *psys, const bool use_render_params);
bool psys_check_edited(struct ParticleSystem *psys);
diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index a0c8cab10fc..47fedb565fc 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -75,7 +75,6 @@ void BKE_pbvh_build_grids(PBVH *bvh, struct CCGElem **grid_elems,
struct CCGKey *key, void **gridfaces, struct DMFlagMat *flagmats,
unsigned int **grid_hidden);
void BKE_pbvh_build_bmesh(PBVH *bvh, struct BMesh *bm, bool smooth_shading, struct BMLog *log, const int cd_vert_node_offset, const int cd_face_node_offset);
-void BKE_pbvh_set_ccgdm(PBVH *bvh, struct CCGDerivedMesh *ccgdm);
void BKE_pbvh_free(PBVH *bvh);
void BKE_pbvh_free_layer_disp(PBVH *bvh);
@@ -155,7 +154,8 @@ int BKE_pbvh_count_grid_quads(BLI_bitmap **grid_hidden,
/* multires level, only valid for type == PBVH_GRIDS */
void BKE_pbvh_get_grid_key(const PBVH *pbvh, struct CCGKey *key);
-struct CCGDerivedMesh *BKE_pbvh_get_ccgdm(const PBVH *bvh);
+
+struct CCGElem **BKE_pbvh_get_grids(const PBVH *pbvh, int *num_grids);
/* Only valid for type == PBVH_BMESH */
struct BMesh *BKE_pbvh_get_bmesh(PBVH *pbvh);
diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h
index 21673213db1..7456a4bfb15 100644
--- a/source/blender/blenkernel/BKE_pointcache.h
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -310,7 +310,7 @@ void BKE_ptcache_update_info(PTCacheID *pid);
/* Size of cache data type. */
int BKE_ptcache_data_size(int data_type);
-/* Is point with indes in memory cache */
+/* Is point with index in memory cache */
int BKE_ptcache_mem_index_find(struct PTCacheMem *pm, unsigned int index);
/* Memory cache read/write helpers. */
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index acf175b5ced..0d766e83299 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -238,7 +238,7 @@ typedef void (*uiListDrawItemFunc)(
/* Draw the filtering part of an uiList */
typedef void (*uiListDrawFilterFunc)(
- struct uiList *ui_list, struct bContext *C, struct uiLayout *layout);
+ struct uiList *ui_list, struct bContext *C, struct uiLayout *layout, bool reverse);
/* Filter items of an uiList */
typedef void (*uiListFilterItemsFunc)(
@@ -266,6 +266,7 @@ typedef struct HeaderType {
int space_type;
int region_type;
+ bool (*poll)(const struct bContext *C, struct HeaderType *ht);
/* draw entirely, view changes should be handled here */
void (*draw)(const struct bContext *C, struct Header *header);
@@ -339,13 +340,6 @@ struct ScrArea *BKE_screen_find_big_area(struct bScreen *sc, const int spacetype
struct ScrArea *BKE_screen_area_map_find_area_xy(const struct ScrAreaMap *areamap, const int spacetype, int x, int y);
struct ScrArea *BKE_screen_find_area_xy(struct bScreen *sc, const int spacetype, int x, int y);
-unsigned int BKE_screen_view3d_layer_active_ex(
- const struct View3D *v3d, const struct Scene *scene, bool use_localvd) ATTR_NONNULL(2);
-unsigned int BKE_screen_view3d_layer_active(
- const struct View3D *v3d, const struct Scene *scene) ATTR_NONNULL(2);
-
-unsigned int BKE_screen_view3d_layer_all(const struct bScreen *sc) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
-
void BKE_screen_gizmo_tag_refresh(struct bScreen *sc);
void BKE_screen_view3d_sync(struct View3D *v3d, struct Scene *scene);
@@ -362,7 +356,6 @@ void BKE_screen_view3d_shading_init(struct View3DShading *shading);
/* screen */
void BKE_screen_free(struct bScreen *sc);
void BKE_screen_area_map_free(struct ScrAreaMap *area_map) ATTR_NONNULL();
-unsigned int BKE_screen_visible_layers(struct bScreen *screen, struct Scene *scene);
struct ScrEdge *BKE_screen_find_edge(struct bScreen *sc, struct ScrVert *v1, struct ScrVert *v2);
void BKE_screen_sort_scrvert(struct ScrVert **v1, struct ScrVert **v2);
diff --git a/source/blender/blenkernel/BKE_shader_fx.h b/source/blender/blenkernel/BKE_shader_fx.h
index d2c8cfb457c..3306d8256e8 100644
--- a/source/blender/blenkernel/BKE_shader_fx.h
+++ b/source/blender/blenkernel/BKE_shader_fx.h
@@ -63,8 +63,8 @@ typedef enum {
eShaderFxTypeFlag_SupportsEditmode = (1 << 0),
/* For effects that support editmode this determines if the
- * effect should be enabled by default in editmode.
- */
+ * effect should be enabled by default in editmode.
+ */
eShaderFxTypeFlag_EnableInEditmode = (1 << 2),
/* max one per type */
@@ -95,8 +95,8 @@ typedef struct ShaderFxTypeInfo {
ShaderFxTypeFlag flags;
/* Copy instance data for this effect type. Should copy all user
- * level settings to the target effect.
- */
+ * level settings to the target effect.
+ */
void(*copyData)(const struct ShaderFxData *fx, struct ShaderFxData *target);
/* Initialize new instance data for this effect type, this function
diff --git a/source/blender/blenkernel/BKE_shrinkwrap.h b/source/blender/blenkernel/BKE_shrinkwrap.h
index d4df12783fa..04c0f1c5d9a 100644
--- a/source/blender/blenkernel/BKE_shrinkwrap.h
+++ b/source/blender/blenkernel/BKE_shrinkwrap.h
@@ -33,6 +33,7 @@
/* Shrinkwrap stuff */
#include "BKE_bvhutils.h"
+#include "BLI_bitmap.h"
/*
* Shrinkwrap is composed by a set of functions and options that define the type of shrink.
@@ -55,27 +56,54 @@ struct ShrinkwrapModifierData;
struct BVHTree;
struct SpaceTransform;
+/* Information about boundary edges in the mesh. */
+typedef struct ShrinkwrapBoundaryVertData {
+ /* Average direction of edges that meet here. */
+ float direction[3];
-typedef struct ShrinkwrapCalcData {
- ShrinkwrapModifierData *smd; //shrinkwrap modifier data
+ /* Closest vector to direction that is orthogonal to vertex normal. */
+ float normal_plane[3];
+} ShrinkwrapBoundaryVertData;
- struct Object *ob; //object we are applying shrinkwrap to
+typedef struct ShrinkwrapBoundaryData {
+ /* True if the edge belongs to exactly one face. */
+ const BLI_bitmap *edge_is_boundary;
+ /* True if the looptri has any boundary edges. */
+ const BLI_bitmap *looptri_has_boundary;
- struct MVert *vert; //Array of verts being projected (to fetch normals or other data)
- float (*vertexCos)[3]; //vertexs being shrinkwraped
- int numVerts;
+ /* Mapping from vertex index to boundary vertex index, or -1.
+ * Used for compact storage of data about boundary vertices. */
+ const int *vert_boundary_id;
+ unsigned int num_boundary_verts;
- struct MDeformVert *dvert; //Pointer to mdeform array
- int vgroup; //Vertex group num
- bool invert_vgroup; /* invert vertex group influence */
+ /* Direction data about boundary vertices. */
+ const ShrinkwrapBoundaryVertData *boundary_verts;
+} ShrinkwrapBoundaryData;
- struct Mesh *target; //mesh we are shrinking to
- struct SpaceTransform local2target; //transform to move between local and target space
+void BKE_shrinkwrap_discard_boundary_data(struct Mesh *mesh);
+void BKE_shrinkwrap_compute_boundary_data(struct Mesh *mesh);
- float keepDist; //Distance to keep above target surface (units are in local space)
+/* Information about a mesh and BVH tree. */
+typedef struct ShrinkwrapTreeData {
+ Mesh *mesh;
-} ShrinkwrapCalcData;
+ BVHTree *bvh;
+ BVHTreeFromMesh treeData;
+ float (*clnors)[3];
+ ShrinkwrapBoundaryData *boundary;
+} ShrinkwrapTreeData;
+
+/* Checks if the modifier needs target normals with these settings. */
+bool BKE_shrinkwrap_needs_normals(int shrinkType, int shrinkMode);
+
+/* Initializes the mesh data structure from the given mesh and settings. */
+bool BKE_shrinkwrap_init_tree(struct ShrinkwrapTreeData *data, Mesh *mesh, int shrinkType, int shrinkMode, bool force_normals);
+
+/* Frees the tree data if necessary. */
+void BKE_shrinkwrap_free_tree(struct ShrinkwrapTreeData *data);
+
+/* Implementation of the Shrinkwrap modifier */
void shrinkwrapModifier_deform(struct ShrinkwrapModifierData *smd, struct Scene *scene, struct Object *ob, struct Mesh *mesh,
float (*vertexCos)[3], int numVerts);
@@ -91,8 +119,22 @@ void shrinkwrapModifier_deform(struct ShrinkwrapModifierData *smd, struct Scene
*/
bool BKE_shrinkwrap_project_normal(
char options, const float vert[3], const float dir[3], const float ray_radius,
- const struct SpaceTransform *transf, BVHTree *tree, BVHTreeRayHit *hit,
- BVHTree_RayCastCallback callback, void *userdata);
+ const struct SpaceTransform *transf, struct ShrinkwrapTreeData *tree, BVHTreeRayHit *hit);
+
+/* Maps the point to the nearest surface, either by simple nearest, or by target normal projection. */
+void BKE_shrinkwrap_find_nearest_surface(
+ struct ShrinkwrapTreeData *tree, struct BVHTreeNearest *nearest, float co[3], int type);
+
+/* Computes a smooth normal of the target (if applicable) at the hit location. */
+void BKE_shrinkwrap_compute_smooth_normal(
+ const struct ShrinkwrapTreeData *tree, const struct SpaceTransform *transform,
+ int looptri_idx, const float hit_co[3], const float hit_no[3], float r_no[3]);
+
+/* Apply the shrink to surface modes to the given original coordinates and nearest point. */
+void BKE_shrinkwrap_snap_point_to_surface(
+ const struct ShrinkwrapTreeData *tree, const struct SpaceTransform *transform,
+ int mode, int hit_idx, const float hit_co[3], const float hit_no[3], float goal_dist,
+ const float point_co[3], float r_point_co[3]);
/*
* NULL initializers to local data
diff --git a/source/blender/blenkernel/BKE_smoke.h b/source/blender/blenkernel/BKE_smoke.h
index 70417b281d3..deee85c02d4 100644
--- a/source/blender/blenkernel/BKE_smoke.h
+++ b/source/blender/blenkernel/BKE_smoke.h
@@ -35,9 +35,10 @@
typedef float (*bresenham_callback)(float *result, float *input, int res[3], int *pixel, float *tRay, float correct);
-struct DerivedMesh *smokeModifier_do(struct SmokeModifierData *smd, struct Depsgraph *depsgraph,
- struct Scene *scene,
- struct Object *ob, struct DerivedMesh *dm);
+struct Mesh *smokeModifier_do(
+ struct SmokeModifierData *smd, struct Depsgraph *depsgraph,
+ struct Scene *scene,
+ struct Object *ob, struct Mesh *me);
void smoke_reallocate_fluid(struct SmokeDomainSettings *sds, float dx, int res[3], int free_old);
void smoke_reallocate_highres_fluid(struct SmokeDomainSettings *sds, float dx, int res[3], int free_old);
@@ -45,7 +46,7 @@ void smokeModifier_free(struct SmokeModifierData *smd);
void smokeModifier_reset(struct SmokeModifierData *smd);
void smokeModifier_reset_turbulence(struct SmokeModifierData *smd);
void smokeModifier_createType(struct SmokeModifierData *smd);
-void smokeModifier_copy(const SmokeModifierData *smd, struct SmokeModifierData *tsmd);
+void smokeModifier_copy(const SmokeModifierData *smd, struct SmokeModifierData *tsmd, const int flag);
float smoke_get_velocity_at(struct Object *ob, float position[3], float velocity[3]);
int smoke_get_data_flags(struct SmokeDomainSettings *sds);
diff --git a/source/blender/blenkernel/BKE_subdiv.h b/source/blender/blenkernel/BKE_subdiv.h
index aa14f9724fb..0a09d3528b4 100644
--- a/source/blender/blenkernel/BKE_subdiv.h
+++ b/source/blender/blenkernel/BKE_subdiv.h
@@ -23,9 +23,16 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file BKE_subdiv.h
+ * \ingroup bke
+ * \since July 2018
+ * \author Sergey Sharybin
+ */
+
#ifndef __BKE_SUBDIV_H__
#define __BKE_SUBDIV_H__
+#include "BLI_compiler_compat.h"
#include "BLI_sys_types.h"
struct Mesh;
@@ -37,13 +44,16 @@ struct OpenSubdiv_TopologyRefiner;
struct Subdiv;
struct SubdivToMeshSettings;
-/** \file BKE_subdiv.h
- * \ingroup bke
- * \since July 2018
- * \author Sergey Sharybin
- */
+typedef enum eSubdivVtxBoundaryInterpolation {
+ /* Do not interpolate boundaries. */
+ SUBDIV_VTX_BOUNDARY_NONE,
+ /* Sharpen edges. */
+ SUBDIV_VTX_BOUNDARY_EDGE_ONLY,
+ /* sharpen edges and corners, */
+ SUBDIV_VTX_BOUNDARY_EDGE_AND_CORNER,
+} eSubdivVtxBoundaryInterpolation;
-typedef enum {
+typedef enum eSubdivFVarLinearInterpolation {
SUBDIV_FVAR_LINEAR_INTERPOLATION_NONE,
SUBDIV_FVAR_LINEAR_INTERPOLATION_CORNERS_ONLY,
SUBDIV_FVAR_LINEAR_INTERPOLATION_CORNERS_AND_JUNCTIONS,
@@ -56,6 +66,7 @@ typedef struct SubdivSettings {
bool is_simple;
bool is_adaptive;
int level;
+ eSubdivVtxBoundaryInterpolation vtx_boundary_interpolation;
eSubdivFVarLinearInterpolation fvar_linear_interpolation;
} SubdivSettings;
@@ -66,6 +77,8 @@ typedef enum eSubdivStatsValue {
SUBDIV_STATS_SUBDIV_TO_MESH_GEOMETRY,
SUBDIV_STATS_EVALUATOR_CREATE,
SUBDIV_STATS_EVALUATOR_REFINE,
+ SUBDIV_STATS_SUBDIV_TO_CCG,
+ SUBDIV_STATS_SUBDIV_TO_CCG_ELEMENTS,
NUM_SUBDIV_STATS_VALUES,
} eSubdivStatsValue;
@@ -86,6 +99,10 @@ typedef struct SubdivStats {
double evaluator_creation_time;
/* Time spent on evaluator->refine(). */
double evaluator_refine_time;
+ /* Total time spent on whole CCG creation. */
+ double subdiv_to_ccg_time;
+ /* Time spent on CCG elements evaluation/initialization. */
+ double subdiv_to_ccg_elements_time;
};
double values_[NUM_SUBDIV_STATS_VALUES];
};
@@ -121,6 +138,12 @@ typedef struct SubdivDisplacement {
void *user_data;
} SubdivDisplacement;
+/* This structure contains everything needed to construct subdivided surface.
+ * It does not specify storage, memory layout or anything else.
+ * It is possible to create different storages (like, grid based CPU side
+ * buffers, GPU subdivision mesh, CPU side fully qualified mesh) from the same
+ * Subdiv structure.
+ */
typedef struct Subdiv {
/* Settings this subdivision surface is created for.
*
@@ -138,6 +161,14 @@ typedef struct Subdiv {
struct SubdivDisplacement *displacement_evaluator;
/* Statistics for debugging. */
SubdivStats stats;
+
+ /* Cached values, are not supposed to be accessed directly. */
+ struct {
+ /* Indexed by base face index, element indicates total number of ptex
+ *faces created for preceding base faces.
+ */
+ int *face_ptex_offset;
+ } cache_;
} Subdiv;
/* ================================ HELPERS ================================= */
@@ -165,260 +196,42 @@ Subdiv *BKE_subdiv_new_from_mesh(const SubdivSettings *settings,
void BKE_subdiv_free(Subdiv *subdiv);
-/* ============================= EVALUATION API ============================= */
-
-/* Returns true if evaluator is ready for use. */
-bool BKE_subdiv_eval_begin(Subdiv *subdiv);
-bool BKE_subdiv_eval_update_from_mesh(Subdiv *subdiv, const struct Mesh *mesh);
-
-/* Single point queries. */
-
-void BKE_subdiv_eval_limit_point(
- Subdiv *subdiv,
- const int ptex_face_index,
- const float u, const float v,
- float r_P[3]);
-void BKE_subdiv_eval_limit_point_and_derivatives(
- Subdiv *subdiv,
- const int ptex_face_index,
- const float u, const float v,
- float r_P[3], float r_dPdu[3], float r_dPdv[3]);
-void BKE_subdiv_eval_limit_point_and_normal(
- Subdiv *subdiv,
- const int ptex_face_index,
- const float u, const float v,
- float r_P[3], float r_N[3]);
-void BKE_subdiv_eval_limit_point_and_short_normal(
- Subdiv *subdiv,
- const int ptex_face_index,
- const float u, const float v,
- float r_P[3], short r_N[3]);
+/* ============================ DISPLACEMENT API ============================ */
-void BKE_subdiv_eval_face_varying(
+void BKE_subdiv_displacement_attach_from_multires(
Subdiv *subdiv,
- const int face_varying_channel,
- const int ptex_face_index,
- const float u, const float v,
- float r_varying[2]);
+ const struct Mesh *mesh,
+ const struct MultiresModifierData *mmd);
-/* NOTE: Expects derivatives to be correct.
- *
- * TODO(sergey): This is currently used together with
- * BKE_subdiv_eval_final_point() which cas easily evaluate derivatives.
- * Would be nice to have dispalcement evaluation function which does not require
- * knowing derivatives ahead of a time.
- */
-void BKE_subdiv_eval_displacement(
- Subdiv *subdiv,
- const int ptex_face_index,
- const float u, const float v,
- const float dPdu[3], const float dPdv[3],
- float r_D[3]);
+void BKE_subdiv_displacement_detach(Subdiv *subdiv);
-void BKE_subdiv_eval_final_point(
- Subdiv *subdiv,
- const int ptex_face_index,
- const float u, const float v,
- float r_P[3]);
+/* ============================ TOPOLOGY HELPERS ============================ */
-/* Patch queries at given resolution.
- *
- * Will evaluate patch at uniformly distributed (u, v) coordinates on a grid
- * of given resolution, producing resolution^2 evaluation points. The order
- * goes as u in rows, v in columns.
- */
+int *BKE_subdiv_face_ptex_offset_get(Subdiv *subdiv);
-void BKE_subdiv_eval_limit_patch_resolution_point(
- Subdiv *subdiv,
- const int ptex_face_index,
- const int resolution,
- void *buffer, const int offset, const int stride);
-void BKE_subdiv_eval_limit_patch_resolution_point_and_derivatives(
- Subdiv *subdiv,
- const int ptex_face_index,
- const int resolution,
- void *point_buffer, const int point_offset, const int point_stride,
- void *du_buffer, const int du_offset, const int du_stride,
- void *dv_buffer, const int dv_offset, const int dv_stride);
-void BKE_subdiv_eval_limit_patch_resolution_point_and_normal(
- Subdiv *subdiv,
- const int ptex_face_index,
- const int resolution,
- void *point_buffer, const int point_offset, const int point_stride,
- void *normal_buffer, const int normal_offset, const int normal_stride);
-void BKE_subdiv_eval_limit_patch_resolution_point_and_short_normal(
- Subdiv *subdiv,
- const int ptex_face_index,
- const int resolution,
- void *point_buffer, const int point_offset, const int point_stride,
- void *normal_buffer, const int normal_offset, const int normal_stride);
-
-/* ========================== FOREACH/TRAVERSE API ========================== */
-
-struct SubdivForeachContext;
-
-typedef bool (*SubdivForeachTopologyInformationCb)(
- const struct SubdivForeachContext *context,
- const int num_vertices,
- const int num_edges,
- const int num_loops,
- const int num_polygons);
-
-typedef void (*SubdivForeachVertexFromCornerCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int ptex_face_index,
- const float u, const float v,
- const int coarse_vertex_index,
- const int coarse_poly_index,
- const int coarse_corner,
- const int subdiv_vertex_index);
-
-typedef void (*SubdivForeachVertexFromEdgeCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int ptex_face_index,
- const float u, const float v,
- const int coarse_edge_index,
- const int coarse_poly_index,
- const int coarse_corner,
- const int subdiv_vertex_index);
-
-typedef void (*SubdivForeachVertexInnerCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int ptex_face_index,
- const float u, const float v,
- const int coarse_poly_index,
- const int coarse_corner,
- const int subdiv_vertex_index);
-
-typedef void (*SubdivForeachEdgeCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int coarse_edge_index,
- const int subdiv_edge_index,
- const int subdiv_v1, const int subdiv_v2);
-
-typedef void (*SubdivForeachLoopCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int ptex_face_index,
- const float u, const float v,
- const int coarse_loop_index,
- const int coarse_poly_index,
- const int coarse_corner,
- const int subdiv_loop_index,
- const int subdiv_vertex_index, const int subdiv_edge_index);
-
-typedef void (*SubdivForeachPolygonCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int coarse_poly_index,
- const int subdiv_poly_index,
- const int start_loop_index, const int num_loops);
-
-typedef void (*SubdivForeachLooseCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int coarse_vertex_index,
- const int subdiv_vertex_index);
-
-typedef void (*SubdivForeachVertexOfLooseEdgeCb)(
- const struct SubdivForeachContext *context,
- void *tls,
- const int coarse_edge_index,
- const float u,
- const int subdiv_vertex_index);
-
-typedef struct SubdivForeachContext {
- /* Is called when topology information becomes available.
- * Is only called once.
- *
- * NOTE: If this callback returns false, the foreach loop is aborted.
- */
- SubdivForeachTopologyInformationCb topology_info;
- /* These callbacks are called from every ptex which shares "emitting"
- * vertex or edge.
- */
- SubdivForeachVertexFromCornerCb vertex_every_corner;
- SubdivForeachVertexFromEdgeCb vertex_every_edge;
- /* Those callbacks are run once per subdivision vertex, ptex is undefined
- * as in it will be whatever first ptex face happened to be tarversed in
- * the multi-threaded environment ahd which shares "emitting" vertex or
- * edge.
- */
- SubdivForeachVertexFromCornerCb vertex_corner;
- SubdivForeachVertexFromEdgeCb vertex_edge;
- /* Called exactly once, always corresponds to a single ptex face. */
- SubdivForeachVertexInnerCb vertex_inner;
- /* Called once for each loose vertex. One loose coarse vertexcorresponds
- * to a single subdivision vertex.
- */
- SubdivForeachLooseCb vertex_loose;
- /* Called once per vertex created for loose edge. */
- SubdivForeachVertexOfLooseEdgeCb vertex_of_loose_edge;
- /* NOTE: If subdivided edge does not come from coarse edge, ORIGINDEX_NONE
- * will be passed as coarse_edge_index.
- */
- SubdivForeachEdgeCb edge;
- /* NOTE: If subdivided loop does not come from coarse loop, ORIGINDEX_NONE
- * will be passed as coarse_loop_index.
- */
- SubdivForeachLoopCb loop;
- SubdivForeachPolygonCb poly;
+/* ============================= VARIOUS HELPERS ============================ */
- /* User-defined pointer, to allow callbacks know something about context the
- * traversal is happening for,
- */
- void *user_data;
+/* For a given (ptex_u, ptex_v) within a ptex face get corresponding
+ * (grid_u, grid_v) within a grid.
+ */
+BLI_INLINE void BKE_subdiv_ptex_face_uv_to_grid_uv(
+ const float ptex_u, const float ptex_v,
+ float *r_grid_u, float *r_grid_v);
- /* Initial value of TLS data. */
- void *user_data_tls;
- /* Size of TLS data. */
- size_t user_data_tls_size;
- /* Function to free TLS storage. */
- void (*user_data_tls_free)(void *tls);
-} SubdivForeachContext;
+/* For a given subdivision level (which is NOT refinement level) get size of
+ * CCG grid (number of grid points on a side).
+ */
+BLI_INLINE int BKE_subdiv_grid_size_from_level(const int level);
-/* Invokes callbacks in the order and with values which corresponds to creation
- * of final subdivided mesh.
+/* Simplified version of mdisp_rot_face_to_crn, only handles quad and
+ * works in normalized coordinates.
*
- * Returns truth if the whole topology was traversed, without any early exits.
- *
- * TODO(sergey): Need to either get rid of subdiv or of coarse_mesh.
- * The main point here is th be abel to get base level topology, which can be
- * done with either of those. Having both of them is kind of redundant.
+ * NOTE: Output coordinates are in ptex coordinates.
*/
-bool BKE_subdiv_foreach_subdiv_geometry(
- struct Subdiv *subdiv,
- const struct SubdivForeachContext *context,
- const struct SubdivToMeshSettings *mesh_settings,
- const struct Mesh *coarse_mesh);
-
-/* =========================== SUBDIV TO MESH API =========================== */
-
-typedef struct SubdivToMeshSettings {
- /* Resolution at which ptex are being evaluated.
- * This defines how many vertices final mesh will have: every ptex has
- * resolution^2 vertices.
- */
- int resolution;
-} SubdivToMeshSettings;
-
-/* Create real hi-res mesh from subdivision, all geometry is "real". */
-struct Mesh *BKE_subdiv_to_mesh(
- Subdiv *subdiv,
- const SubdivToMeshSettings *settings,
- const struct Mesh *coarse_mesh);
-
-/* ============================ DISPLACEMENT API ============================ */
-
-void BKE_subdiv_displacement_attach_from_multires(
- Subdiv *subdiv,
- const struct Mesh *mesh,
- const struct MultiresModifierData *mmd);
-
-void BKE_subdiv_displacement_detach(Subdiv *subdiv);
+BLI_INLINE int BKE_subdiv_rotate_quad_to_corner(
+ const float u, const float v,
+ float *r_u, float *r_v);
#endif /* __BKE_SUBDIV_H__ */
+
+#include "intern/subdiv_inline.h"
diff --git a/source/blender/blenkernel/BKE_subdiv_ccg.h b/source/blender/blenkernel/BKE_subdiv_ccg.h
new file mode 100644
index 00000000000..b2aaf6fc4cc
--- /dev/null
+++ b/source/blender/blenkernel/BKE_subdiv_ccg.h
@@ -0,0 +1,249 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2018 by Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Sergey Sharybin.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file BKE_subdiv_ccg.h
+ * \ingroup bke
+ * \since July 2018
+ * \author Sergey Sharybin
+ */
+
+#ifndef __BKE_SUBDIV_CCG_H__
+#define __BKE_SUBDIV_CCG_H__
+
+#include "BKE_customdata.h"
+#include "BLI_bitmap.h"
+#include "BLI_sys_types.h"
+
+struct CCGElem;
+struct CCGFace;
+struct CCGKey;
+struct DMFlagMat;
+struct Mesh;
+struct Subdiv;
+
+/* =============================================================================
+ * Masks.
+ */
+
+/* Functor which evaluates mask value at a given (u, v) of given ptex face. */
+typedef struct SubdivCCGMask {
+ float (*eval_mask)(struct SubdivCCGMask *mask,
+ const int ptex_face_index,
+ const float u, const float v);
+
+ /* Free the data, not the evaluator itself. */
+ void (*free)(struct SubdivCCGMask *mask);
+
+ void *user_data;
+} SubdivCCGMask;
+
+/* Return true if mesh has mask and evaluator can be used. */
+bool BKE_subdiv_ccg_mask_init_from_paint(
+ SubdivCCGMask *mask_evaluator,
+ const struct Mesh *mesh);
+
+/* =============================================================================
+ * SubdivCCG.
+ */
+
+typedef struct SubdivToCCGSettings {
+ /* Resolution at which regular ptex (created for quad polygon) are being
+ * evaluated. This defines how many vertices final mesh will have: every
+ * regular ptex has resolution^2 vertices. Special (irregular, or ptex
+ * created for a corner of non-quad polygon) will have resolution of
+ * `resolution - 1`.
+ */
+ int resolution;
+ /* Denotes which extra layers to be added to CCG elements. */
+ bool need_normal;
+ bool need_mask;
+} SubdivToCCGSettings;
+
+/* This is actually a coarse face, which consists of multiple CCG grids. */
+typedef struct SubdivCCGFace {
+ /* Total number of grids in this face.
+ *
+ * This 1:1 corresponds to a number of corners (or loops) from a coarse
+ * face.
+ */
+ int num_grids;
+ /* Index of first grid from this face in SubdivCCG->grids array. */
+ int start_grid_index;
+} SubdivCCGFace;
+
+/* Definition of an edge which is adjacent to at least one of the faces. */
+typedef struct SubdivCCGAdjacentEdge {
+ int num_adjacent_faces;
+ /* Indexed by adjacent face index. */
+ SubdivCCGFace **faces;
+ /* Indexed by adjacent face index, then by point index on the edge.
+ * points to a grid element.
+ */
+ struct CCGElem ***boundary_elements;
+} SubdivCCGAdjacentEdge;
+
+/* Definition of a vertex which is adjacent to at least one of the faces. */
+typedef struct SubdivCCGAdjacentVertex {
+ int num_adjacent_faces;
+ /* Indexed by adjacent face index. */
+ SubdivCCGFace **faces;
+ /* Indexed by adjacent face index, points to a grid element.
+ */
+ struct CCGElem **corner_elements;
+} SubdivCCGAdjacentVertex;
+
+/* Representation of subdivision surface which uses CCG grids. */
+typedef struct SubdivCCG {
+ /* This is a subdivision surface this CCG was created for.
+ *
+ * TODO(sergey): Make sure the whole descriptor is valid, including all the
+ * displacement attached to the surface.
+ */
+ struct Subdiv *subdiv;
+ /* A level at which geometry was subdivided. This is what defines grid
+ * resolution. It is NOT the topology refinement level.
+ */
+ int level;
+ /* Resolution of grid. All grids have matching resolution, and resolution
+ * is same as ptex created for non-quad polygons.
+ */
+ int grid_size;
+ /* Grids represent limit surface, with displacement applied. Grids are
+ * corresponding to face-corners of coarse mesh, each grid has
+ * grid_size^2 elements.
+ */
+ /* Indexed by a grid index, points to a grid data which is stored in
+ * grids_storage.
+ */
+ struct CCGElem **grids;
+ /* Flat array of all grids' data. */
+ unsigned char *grids_storage;
+ int num_grids;
+ /* Loose edges, each array element contains grid_size elements
+ * corresponding to vertices created by subdividing coarse edges.
+ */
+ struct CCGElem **edges;
+ int num_edges;
+ /* Loose vertices. Every element corresponds to a loose vertex from a coarse
+ * mesh, every coarse loose vertex corresponds to a single sundivided
+ * element.
+ */
+ struct CCGElem *vertices;
+ int num_vertices;
+ /* Denotes which layers present in the elements.
+ *
+ * Grids always has coordinates, followed by extra layers which are set to
+ * truth here.
+ */
+ bool has_normal;
+ bool has_mask;
+ /* Offsets of corresponding data layers in the elements. */
+ int normal_offset;
+ int mask_offset;
+
+ /* Faces from which grids are emitted. */
+ int num_faces;
+ SubdivCCGFace *faces;
+ /* Indexed by grid index, points to corresponding face from `faces`. */
+ SubdivCCGFace **grid_faces;
+
+ /* Edges which are adjacent to faces.
+ * Used for faster grid stitching, in the cost of extra memory.
+ */
+ int num_adjacent_edges;
+ SubdivCCGAdjacentEdge *adjacent_edges;
+
+ /* Vertices which are adjacent to faces
+ * Used for faster grid stitching, in the cost of extra memory.
+ */
+ int num_adjacent_vertices;
+ SubdivCCGAdjacentVertex *adjacent_vertices;
+
+ struct DMFlagMat *grid_flag_mats;
+ BLI_bitmap **grid_hidden;
+
+ /* TODO(sergey): Consider adding some accessors to a "decoded" geometry,
+ * to make integration with draw manager and such easy.
+ */
+
+ /* TODO(sergey): Consider adding CD layers here, so we can draw final mesh
+ * from grids, and have UVs and such work.
+ */
+
+ /* Integration with sculpting. */
+ /* TODO(sergey): Is this really best way to go? Kind of annoying to have
+ * such use-related flags in a more or less generic structure.
+ */
+ struct {
+ /* Corresponds to MULTIRES_COORDS_MODIFIED. */
+ bool coords;
+ /* Corresponds to MULTIRES_HIDDEN_MODIFIED. */
+ bool hidden;
+ } dirty;
+} SubdivCCG;
+
+/* Create real hi-res CCG from subdivision.
+ *
+ * NOTE: Subdiv is expected to be refined and ready for evaluation.
+ * NOTE: CCG becomes an owner of subdiv.
+ *
+ * TODO(sergey): Allow some user-counter or more explicit control over who owns
+ * the Subdiv. The goal should be to allow viewport GL Mesh and CCG to share
+ * same Subsurf without conflicts.
+ */
+struct SubdivCCG *BKE_subdiv_to_ccg(
+ struct Subdiv *subdiv,
+ const SubdivToCCGSettings *settings,
+ SubdivCCGMask *mask_evaluator);
+
+/* Destroy CCG representation of subdivision surface. */
+void BKE_subdiv_ccg_destroy(SubdivCCG *subdiv_ccg);
+
+/* Helper function, creates Mesh structure which is properly setup to use
+ * grids.
+ */
+struct Mesh *BKE_subdiv_to_ccg_mesh(
+ struct Subdiv *subdiv,
+ const SubdivToCCGSettings *settings,
+ const struct Mesh *coarse_mesh);
+
+/* Create a key for accessing grid elements at a given level. */
+void BKE_subdiv_ccg_key(
+ struct CCGKey *key, const SubdivCCG *subdiv_ccg, int level);
+void BKE_subdiv_ccg_key_top_level(
+ struct CCGKey *key, const SubdivCCG *subdiv_ccg);
+
+/* Recalculate all normals based on grid element coordinates. */
+void BKE_subdiv_ccg_recalc_normals(SubdivCCG *subdiv_ccg);
+
+/* Average grid coordinates and normals along the grid boundatries. */
+void BKE_subdiv_ccg_average_grids(SubdivCCG *subdiv_ccg);
+
+/* Similar to above, but only updates given faces. */
+void BKE_subdiv_ccg_average_stitch_faces(SubdivCCG *subdiv_ccg,
+ struct CCGFace **effected_faces,
+ int num_effected_faces);
+
+#endif /* __BKE_SUBDIV_CCG_H__ */
diff --git a/source/blender/blenkernel/BKE_subdiv_eval.h b/source/blender/blenkernel/BKE_subdiv_eval.h
new file mode 100644
index 00000000000..0ea5c978e62
--- /dev/null
+++ b/source/blender/blenkernel/BKE_subdiv_eval.h
@@ -0,0 +1,127 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2018 by Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Sergey Sharybin.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file BKE_subdiv_eval.h
+ * \ingroup bke
+ * \since September 2018
+ * \author Sergey Sharybin
+ */
+
+#ifndef __BKE_SUBDIV_EVAL_H__
+#define __BKE_SUBDIV_EVAL_H__
+
+#include "BLI_sys_types.h"
+
+struct Mesh;
+struct Subdiv;
+
+/* Returns true if evaluator is ready for use. */
+bool BKE_subdiv_eval_begin(struct Subdiv *subdiv);
+bool BKE_subdiv_eval_update_from_mesh(struct Subdiv *subdiv,
+ const struct Mesh *mesh);
+
+/* Single point queries. */
+
+void BKE_subdiv_eval_limit_point(
+ struct Subdiv *subdiv,
+ const int ptex_face_index,
+ const float u, const float v,
+ float r_P[3]);
+void BKE_subdiv_eval_limit_point_and_derivatives(
+ struct Subdiv *subdiv,
+ const int ptex_face_index,
+ const float u, const float v,
+ float r_P[3], float r_dPdu[3], float r_dPdv[3]);
+void BKE_subdiv_eval_limit_point_and_normal(
+ struct Subdiv *subdiv,
+ const int ptex_face_index,
+ const float u, const float v,
+ float r_P[3], float r_N[3]);
+void BKE_subdiv_eval_limit_point_and_short_normal(
+ struct Subdiv *subdiv,
+ const int ptex_face_index,
+ const float u, const float v,
+ float r_P[3], short r_N[3]);
+
+void BKE_subdiv_eval_face_varying(
+ struct Subdiv *subdiv,
+ const int face_varying_channel,
+ const int ptex_face_index,
+ const float u, const float v,
+ float r_varying[2]);
+
+/* NOTE: Expects derivatives to be correct.
+ *
+ * TODO(sergey): This is currently used together with
+ * BKE_subdiv_eval_final_point() which cas easily evaluate derivatives.
+ * Would be nice to have dispalcement evaluation function which does not require
+ * knowing derivatives ahead of a time.
+ */
+void BKE_subdiv_eval_displacement(
+ struct Subdiv *subdiv,
+ const int ptex_face_index,
+ const float u, const float v,
+ const float dPdu[3], const float dPdv[3],
+ float r_D[3]);
+
+void BKE_subdiv_eval_final_point(
+ struct Subdiv *subdiv,
+ const int ptex_face_index,
+ const float u, const float v,
+ float r_P[3]);
+
+/* Patch queries at given resolution.
+ *
+ * Will evaluate patch at uniformly distributed (u, v) coordinates on a grid
+ * of given resolution, producing resolution^2 evaluation points. The order
+ * goes as u in rows, v in columns.
+ */
+
+void BKE_subdiv_eval_limit_patch_resolution_point(
+ struct Subdiv *subdiv,
+ const int ptex_face_index,
+ const int resolution,
+ void *buffer, const int offset, const int stride);
+void BKE_subdiv_eval_limit_patch_resolution_point_and_derivatives(
+ struct Subdiv *subdiv,
+ const int ptex_face_index,
+ const int resolution,
+ void *point_buffer, const int point_offset, const int point_stride,
+ void *du_buffer, const int du_offset, const int du_stride,
+ void *dv_buffer, const int dv_offset, const int dv_stride);
+void BKE_subdiv_eval_limit_patch_resolution_point_and_normal(
+ struct Subdiv *subdiv,
+ const int ptex_face_index,
+ const int resolution,
+ void *point_buffer, const int point_offset, const int point_stride,
+ void *normal_buffer, const int normal_offset, const int normal_stride);
+void BKE_subdiv_eval_limit_patch_resolution_point_and_short_normal(
+ struct Subdiv *subdiv,
+ const int ptex_face_index,
+ const int resolution,
+ void *point_buffer, const int point_offset, const int point_stride,
+ void *normal_buffer, const int normal_offset, const int normal_stride);
+
+#endif /* __BKE_SUBDIV_EVAL_H__ */
diff --git a/source/blender/blenkernel/BKE_subdiv_foreach.h b/source/blender/blenkernel/BKE_subdiv_foreach.h
new file mode 100644
index 00000000000..d4ef0ee3601
--- /dev/null
+++ b/source/blender/blenkernel/BKE_subdiv_foreach.h
@@ -0,0 +1,181 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2018 by Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Sergey Sharybin.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file BKE_subdiv_foreach.h
+ * \ingroup bke
+ * \since September 2018
+ * \author Sergey Sharybin
+ */
+
+#ifndef __BKE_SUBDIV_FOREACH_H__
+#define __BKE_SUBDIV_FOREACH_H__
+
+#include "BLI_sys_types.h"
+
+struct Mesh;
+struct Subdiv;
+struct SubdivForeachContext;
+struct SubdivToMeshSettings;
+
+typedef bool (*SubdivForeachTopologyInformationCb)(
+ const struct SubdivForeachContext *context,
+ const int num_vertices,
+ const int num_edges,
+ const int num_loops,
+ const int num_polygons);
+
+typedef void (*SubdivForeachVertexFromCornerCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int ptex_face_index,
+ const float u, const float v,
+ const int coarse_vertex_index,
+ const int coarse_poly_index,
+ const int coarse_corner,
+ const int subdiv_vertex_index);
+
+typedef void (*SubdivForeachVertexFromEdgeCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int ptex_face_index,
+ const float u, const float v,
+ const int coarse_edge_index,
+ const int coarse_poly_index,
+ const int coarse_corner,
+ const int subdiv_vertex_index);
+
+typedef void (*SubdivForeachVertexInnerCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int ptex_face_index,
+ const float u, const float v,
+ const int coarse_poly_index,
+ const int coarse_corner,
+ const int subdiv_vertex_index);
+
+typedef void (*SubdivForeachEdgeCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int coarse_edge_index,
+ const int subdiv_edge_index,
+ const int subdiv_v1, const int subdiv_v2);
+
+typedef void (*SubdivForeachLoopCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int ptex_face_index,
+ const float u, const float v,
+ const int coarse_loop_index,
+ const int coarse_poly_index,
+ const int coarse_corner,
+ const int subdiv_loop_index,
+ const int subdiv_vertex_index, const int subdiv_edge_index);
+
+typedef void (*SubdivForeachPolygonCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int coarse_poly_index,
+ const int subdiv_poly_index,
+ const int start_loop_index, const int num_loops);
+
+typedef void (*SubdivForeachLooseCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int coarse_vertex_index,
+ const int subdiv_vertex_index);
+
+typedef void (*SubdivForeachVertexOfLooseEdgeCb)(
+ const struct SubdivForeachContext *context,
+ void *tls,
+ const int coarse_edge_index,
+ const float u,
+ const int subdiv_vertex_index);
+
+typedef struct SubdivForeachContext {
+ /* Is called when topology information becomes available.
+ * Is only called once.
+ *
+ * NOTE: If this callback returns false, the foreach loop is aborted.
+ */
+ SubdivForeachTopologyInformationCb topology_info;
+ /* These callbacks are called from every ptex which shares "emitting"
+ * vertex or edge.
+ */
+ SubdivForeachVertexFromCornerCb vertex_every_corner;
+ SubdivForeachVertexFromEdgeCb vertex_every_edge;
+ /* Those callbacks are run once per subdivision vertex, ptex is undefined
+ * as in it will be whatever first ptex face happened to be tarversed in
+ * the multi-threaded environment ahd which shares "emitting" vertex or
+ * edge.
+ */
+ SubdivForeachVertexFromCornerCb vertex_corner;
+ SubdivForeachVertexFromEdgeCb vertex_edge;
+ /* Called exactly once, always corresponds to a single ptex face. */
+ SubdivForeachVertexInnerCb vertex_inner;
+ /* Called once for each loose vertex. One loose coarse vertexcorresponds
+ * to a single subdivision vertex.
+ */
+ SubdivForeachLooseCb vertex_loose;
+ /* Called once per vertex created for loose edge. */
+ SubdivForeachVertexOfLooseEdgeCb vertex_of_loose_edge;
+ /* NOTE: If subdivided edge does not come from coarse edge, ORIGINDEX_NONE
+ * will be passed as coarse_edge_index.
+ */
+ SubdivForeachEdgeCb edge;
+ /* NOTE: If subdivided loop does not come from coarse loop, ORIGINDEX_NONE
+ * will be passed as coarse_loop_index.
+ */
+ SubdivForeachLoopCb loop;
+ SubdivForeachPolygonCb poly;
+
+ /* User-defined pointer, to allow callbacks know something about context the
+ * traversal is happening for,
+ */
+ void *user_data;
+
+ /* Initial value of TLS data. */
+ void *user_data_tls;
+ /* Size of TLS data. */
+ size_t user_data_tls_size;
+ /* Function to free TLS storage. */
+ void (*user_data_tls_free)(void *tls);
+} SubdivForeachContext;
+
+/* Invokes callbacks in the order and with values which corresponds to creation
+ * of final subdivided mesh.
+ *
+ * Returns truth if the whole topology was traversed, without any early exits.
+ *
+ * TODO(sergey): Need to either get rid of subdiv or of coarse_mesh.
+ * The main point here is th be abel to get base level topology, which can be
+ * done with either of those. Having both of them is kind of redundant.
+ */
+bool BKE_subdiv_foreach_subdiv_geometry(
+ struct Subdiv *subdiv,
+ const struct SubdivForeachContext *context,
+ const struct SubdivToMeshSettings *mesh_settings,
+ const struct Mesh *coarse_mesh);
+
+#endif /* __BKE_SUBDIV_FOREACH_H__ */
diff --git a/source/blender/blenkernel/BKE_subdiv_mesh.h b/source/blender/blenkernel/BKE_subdiv_mesh.h
new file mode 100644
index 00000000000..f719527eed8
--- /dev/null
+++ b/source/blender/blenkernel/BKE_subdiv_mesh.h
@@ -0,0 +1,56 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2018 by Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Sergey Sharybin.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file BKE_subdiv_mesh.h
+ * \ingroup bke
+ * \since September 2018
+ * \author Sergey Sharybin
+ */
+
+#ifndef __BKE_SUBDIV_MESH_H__
+#define __BKE_SUBDIV_MESH_H__
+
+#include "BLI_sys_types.h"
+
+struct Mesh;
+struct Subdiv;
+
+typedef struct SubdivToMeshSettings {
+ /* Resolution at which regular ptex (created for quad polygon) are being
+ * evaluated. This defines how many vertices final mesh will have: every
+ * regular ptex has resolution^2 vertices. Special (irregular, or ptex
+ * created for a corner of non-quad polygon) will have resolution of
+ * `resolution - 1`.
+ */
+ int resolution;
+} SubdivToMeshSettings;
+
+/* Create real hi-res mesh from subdivision, all geometry is "real". */
+struct Mesh *BKE_subdiv_to_mesh(
+ struct Subdiv *subdiv,
+ const SubdivToMeshSettings *settings,
+ const struct Mesh *coarse_mesh);
+
+#endif /* __BKE_SUBDIV)MESH_H__ */
diff --git a/source/blender/blenkernel/BKE_text.h b/source/blender/blenkernel/BKE_text.h
index b53af3cec53..e7a8fb1c4a9 100644
--- a/source/blender/blenkernel/BKE_text.h
+++ b/source/blender/blenkernel/BKE_text.h
@@ -112,10 +112,6 @@ bool txt_cursor_is_line_end(struct Text *text);
int txt_calc_tab_left(struct TextLine *line, int ch);
int txt_calc_tab_right(struct TextLine *line, int ch);
-#if 0
-void txt_print_undo (struct Text *text);
-#endif
-
/* utility functions, could be moved somewhere more generic but are python/text related */
int text_check_bracket(const char ch);
bool text_check_delim(const char ch);
diff --git a/source/blender/blenkernel/BKE_unit.h b/source/blender/blenkernel/BKE_unit.h
index 278b303a315..bb7fb006038 100644
--- a/source/blender/blenkernel/BKE_unit.h
+++ b/source/blender/blenkernel/BKE_unit.h
@@ -31,14 +31,23 @@
extern "C" {
#endif
+struct UnitSettings;
+
/* in all cases the value is assumed to be scaled by the user preference */
/* humanly readable representation of a value in units (used for button drawing) */
-size_t bUnit_AsString(char *str, int len_max, double value, int prec, int system, int type, bool split, bool pad);
+size_t bUnit_AsString(char *str, int len_max, double value, int prec, int system, int type, bool split, bool pad);
+size_t bUnit_AsString2(char *str, int len_max, double value, int prec, int type, const struct UnitSettings *settings, bool pad);
/* replace units with values, used before python button evaluation */
bool bUnit_ReplaceString(char *str, int len_max, const char *str_prev, double scale_pref, int system, int type);
+/* return true if the string contains any valid unit for the given type */
+bool bUnit_ContainsUnit(const char *str, int system, int type);
+
+/* if user does not specify a unit, multiply with this value */
+double bUnit_PreferredUnitScalar(const struct UnitSettings *settings, int type);
+
/* make string keyboard-friendly: 10µm --> 10um */
void bUnit_ToUnitAltName(char *str, int len_max, const char *orig_str, int system, int type);
@@ -51,14 +60,16 @@ double bUnit_BaseScalar(int system, int type);
/* return true is the unit system exists */
bool bUnit_IsValid(int system, int type);
-/* loop over scales, coudl add names later */
+/* loop over scales, could add names later */
//double bUnit_Iter(void **unit, char **name, int system, int type);
void bUnit_GetSystem(int system, int type, void const **r_usys_pt, int *r_len);
int bUnit_GetBaseUnit(const void *usys_pt);
+int bUnit_GetBaseUnitOfType(int system, int type);
const char *bUnit_GetName(const void *usys_pt, int index);
const char *bUnit_GetNameDisplay(const void *usys_pt, int index);
double bUnit_GetScaler(const void *usys_pt, int index);
+bool bUnit_IsSuppressed(const void *usys_pt, int index);
/* aligned with PropertyUnit */
enum {
diff --git a/source/blender/blenkernel/BKE_workspace.h b/source/blender/blenkernel/BKE_workspace.h
index 4f4ae9f375b..6902fb631e4 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -28,6 +28,7 @@
#include "BLI_compiler_attrs.h"
struct bScreen;
+struct bToolRef;
struct Main;
struct Scene;
struct TransformOrientation;
@@ -70,6 +71,8 @@ struct WorkSpaceLayout *BKE_workspace_layout_iter_circular(
bool (*callback)(const struct WorkSpaceLayout *layout, void *arg),
void *arg, const bool iter_backward);
+void BKE_workspace_tool_remove(
+ struct WorkSpace *workspace, struct bToolRef *tref) ATTR_NONNULL(1, 2);
/* -------------------------------------------------------------------- */
/* Getters/Setters */
diff --git a/source/blender/blenkernel/BKE_world.h b/source/blender/blenkernel/BKE_world.h
index 6a9a75828e5..eb0548c682e 100644
--- a/source/blender/blenkernel/BKE_world.h
+++ b/source/blender/blenkernel/BKE_world.h
@@ -33,6 +33,7 @@
* \author nzc
*/
+struct Depsgraph;
struct Main;
struct World;
@@ -43,5 +44,6 @@ void BKE_world_copy_data(struct Main *bmain, struct World *wrld_dst, const struc
struct World *BKE_world_copy(struct Main *bmain, const struct World *wrld);
struct World *BKE_world_localize(struct World *wrld);
void BKE_world_make_local(struct Main *bmain, struct World *wrld, const bool lib_local);
+void BKE_world_eval(struct Depsgraph *depsgraph, struct World *world);
#endif
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index c164d28815a..ac892977cca 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -82,7 +82,6 @@ set(SRC
intern/blender_undo.c
intern/blender_user_menu.c
intern/blendfile.c
- intern/bmfont.c
intern/boids.c
intern/boolean.c
intern/bpath.c
@@ -111,6 +110,7 @@ set(SRC
intern/editlattice.c
intern/editmesh.c
intern/editmesh_bvh.c
+ intern/editmesh_cache.c
intern/editmesh_tangent.c
intern/effect.c
intern/fcurve.c
@@ -145,6 +145,7 @@ set(SRC
intern/library_query.c
intern/library_remap.c
intern/linestyle.c
+ intern/main.c
intern/mask.c
intern/mask_evaluate.c
intern/mask_rasterize.c
@@ -177,6 +178,7 @@ set(SRC
intern/outliner_treehash.c
intern/packedFile.c
intern/paint.c
+ intern/paint_toolslots.c
intern/particle.c
intern/particle_child.c
intern/particle_distribute.c
@@ -203,6 +205,8 @@ set(SRC
intern/speaker.c
intern/studiolight.c
intern/subdiv.c
+ intern/subdiv_ccg.c
+ intern/subdiv_ccg_mask.c
intern/subdiv_converter.c
intern/subdiv_converter_mesh.c
intern/subdiv_displacement.c
@@ -240,10 +244,9 @@ set(SRC
BKE_blender.h
BKE_blender_copybuffer.h
BKE_blender_undo.h
+ BKE_blender_user_menu.h
BKE_blender_version.h
BKE_blendfile.h
- BKE_bmfont.h
- BKE_bmfont_types.h
BKE_boids.h
BKE_boolean.h
BKE_bpath.h
@@ -271,6 +274,7 @@ set(SRC
BKE_editlattice.h
BKE_editmesh.h
BKE_editmesh_bvh.h
+ BKE_editmesh_cache.h
BKE_editmesh_tangent.h
BKE_effect.h
BKE_fcurve.h
@@ -337,6 +341,10 @@ set(SRC
BKE_speaker.h
BKE_studiolight.h
BKE_subdiv.h
+ BKE_subdiv_ccg.h
+ BKE_subdiv_eval.h
+ BKE_subdiv_foreach.h
+ BKE_subdiv_mesh.h
BKE_subsurf.h
BKE_suggestions.h
BKE_text.h
@@ -557,6 +565,9 @@ if(WITH_OPENSUBDIV)
list(APPEND INC_SYS
${OPENSUBDIV_INCLUDE_DIRS}
)
+ if(WITH_OPENSUBDIV_MODIFIER)
+ add_definitions(-DWITH_OPENSUBDIV_MODIFIER)
+ endif()
endif()
if(WITH_OPENVDB)
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index dd5a87a445d..6ec1b1b36b9 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -1555,7 +1555,6 @@ void CCG_key(CCGKey *key, const CCGSubSurf *ss, int level)
key->elem_size = ss->meshIFC.vertDataSize;
key->has_normals = ss->calcVertNormals;
- key->num_layers = ss->meshIFC.numLayers;
/* if normals are present, always the last three floats of an
* element */
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_intern.h b/source/blender/blenkernel/intern/CCGSubSurf_intern.h
index 29e327d8973..e1cb82d7868 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_intern.h
+++ b/source/blender/blenkernel/intern/CCGSubSurf_intern.h
@@ -229,7 +229,7 @@ struct CCGSubSurf {
*/
bool osd_coarse_coords_invalid;
- /* GL mesh descriptor, used for refinment and draw. */
+ /* GL mesh descriptor, used for refinement and draw. */
struct OpenSubdiv_GLMesh *osd_mesh;
/* Refiner which is used to create GL mesh.
*
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
index 98a17ad8009..004a50205ba 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv.c
@@ -78,7 +78,7 @@ static bool compare_ccg_derivedmesh_topology(CCGSubSurf *ss, DerivedMesh *dm)
ccgFaceIterator_next(&ccg_face_iter))
{
/*const*/ CCGFace *ccg_face = ccgFaceIterator_getCurrent(&ccg_face_iter);
- const int poly_index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ccg_face));
+ const int poly_index = POINTER_AS_INT(ccgSubSurf_getFaceFaceHandle(ccg_face));
const MPoly *mp = &mpoly[poly_index];
int corner;
if (ccg_face->numVerts != mp->totloop) {
@@ -86,7 +86,7 @@ static bool compare_ccg_derivedmesh_topology(CCGSubSurf *ss, DerivedMesh *dm)
}
for (corner = 0; corner < ccg_face->numVerts; corner++) {
/*const*/ CCGVert *ccg_vert = FACE_getVerts(ccg_face)[corner];
- const int vert_index = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ccg_vert));
+ const int vert_index = POINTER_AS_INT(ccgSubSurf_getVertVertHandle(ccg_vert));
if (vert_index != mloop[mp->loopstart + corner].v) {
return false;
}
@@ -104,9 +104,9 @@ static bool compare_ccg_derivedmesh_topology(CCGSubSurf *ss, DerivedMesh *dm)
/* const */ CCGEdge *ccg_edge = ccgEdgeIterator_getCurrent(&ccg_edge_iter);
/* const */ CCGVert *ccg_vert1 = ccg_edge->v0;
/* const */ CCGVert *ccg_vert2 = ccg_edge->v1;
- const int ccg_vert1_index = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ccg_vert1));
- const int ccg_vert2_index = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ccg_vert2));
- const int edge_index = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(ccg_edge));
+ const int ccg_vert1_index = POINTER_AS_INT(ccgSubSurf_getVertVertHandle(ccg_vert1));
+ const int ccg_vert2_index = POINTER_AS_INT(ccgSubSurf_getVertVertHandle(ccg_vert2));
+ const int edge_index = POINTER_AS_INT(ccgSubSurf_getEdgeEdgeHandle(ccg_edge));
const MEdge *me = &medge[edge_index];
if (me->v1 != ccg_vert1_index || me->v2 != ccg_vert2_index) {
return false;
@@ -122,7 +122,7 @@ static bool compare_ccg_derivedmesh_topology(CCGSubSurf *ss, DerivedMesh *dm)
ccgEdgeIterator_next(&ccg_edge_iter))
{
/* const */ CCGEdge *ccg_edge = ccgEdgeIterator_getCurrent(&ccg_edge_iter);
- const int edge_index = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(ccg_edge));
+ const int edge_index = POINTER_AS_INT(ccgSubSurf_getEdgeEdgeHandle(ccg_edge));
if (ccg_edge->crease != medge[edge_index].crease) {
return false;
}
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c
index b378744fa7a..0301582b303 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf_opensubdiv_converter.c
@@ -84,6 +84,13 @@ static OpenSubdiv_SchemeType conv_dm_get_type(
return OSD_SCHEME_CATMARK;
}
+static OpenSubdiv_VtxBoundaryInterpolation
+conv_dm_get_vtx_boundary_interpolation(
+ const OpenSubdiv_Converter *UNUSED(converter))
+{
+ return OSD_VTX_BOUNDARY_EDGE_ONLY;
+}
+
static OpenSubdiv_FVarLinearInterpolation conv_dm_get_fvar_linear_interpolation(
const OpenSubdiv_Converter *converter)
{
@@ -448,6 +455,8 @@ void ccgSubSurf_converter_setup_from_derivedmesh(
converter->getSchemeType = conv_dm_get_type;
+ converter->getVtxBoundaryInterpolation =
+ conv_dm_get_vtx_boundary_interpolation;
converter->getFVarLinearInterpolation =
conv_dm_get_fvar_linear_interpolation;
converter->specifiesFullTopology = conv_dm_specifies_full_topology;
@@ -546,6 +555,13 @@ static OpenSubdiv_SchemeType conv_ccg_get_bilinear_type(
}
}
+static OpenSubdiv_VtxBoundaryInterpolation
+conv_ccg_get_vtx_boundary_interpolation(
+ const OpenSubdiv_Converter *UNUSED(converter))
+{
+ return OSD_VTX_BOUNDARY_EDGE_ONLY;
+}
+
static OpenSubdiv_FVarLinearInterpolation
conv_ccg_get_fvar_linear_interpolation(const OpenSubdiv_Converter *converter)
{
@@ -584,7 +600,7 @@ static int conv_ccg_get_num_face_verts(const OpenSubdiv_Converter *converter,
int face)
{
CCGSubSurf *ss = converter->user_data;
- CCGFace *ccg_face = ccgSubSurf_getFace(ss, SET_INT_IN_POINTER(face));
+ CCGFace *ccg_face = ccgSubSurf_getFace(ss, POINTER_FROM_INT(face));
return ccgSubSurf_getFaceNumVerts(ccg_face);
}
@@ -593,12 +609,12 @@ static void conv_ccg_get_face_verts(const OpenSubdiv_Converter *converter,
int *face_verts)
{
CCGSubSurf *ss = converter->user_data;
- CCGFace *ccg_face = ccgSubSurf_getFace(ss, SET_INT_IN_POINTER(face));
+ CCGFace *ccg_face = ccgSubSurf_getFace(ss, POINTER_FROM_INT(face));
int num_face_verts = ccgSubSurf_getFaceNumVerts(ccg_face);
int loop;
for (loop = 0; loop < num_face_verts; loop++) {
CCGVert *ccg_vert = ccgSubSurf_getFaceVert(ccg_face, loop);
- face_verts[loop] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ccg_vert));
+ face_verts[loop] = POINTER_AS_INT(ccgSubSurf_getVertVertHandle(ccg_vert));
}
}
@@ -607,12 +623,12 @@ static void conv_ccg_get_face_edges(const OpenSubdiv_Converter *converter,
int *face_edges)
{
CCGSubSurf *ss = converter->user_data;
- CCGFace *ccg_face = ccgSubSurf_getFace(ss, SET_INT_IN_POINTER(face));
+ CCGFace *ccg_face = ccgSubSurf_getFace(ss, POINTER_FROM_INT(face));
int num_face_verts = ccgSubSurf_getFaceNumVerts(ccg_face);
int loop;
for (loop = 0; loop < num_face_verts; loop++) {
CCGEdge *ccg_edge = ccgSubSurf_getFaceEdge(ccg_face, loop);
- face_edges[loop] = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(ccg_edge));
+ face_edges[loop] = POINTER_AS_INT(ccgSubSurf_getEdgeEdgeHandle(ccg_edge));
}
}
@@ -621,18 +637,18 @@ static void conv_ccg_get_edge_verts(const OpenSubdiv_Converter *converter,
int *edge_verts)
{
CCGSubSurf *ss = converter->user_data;
- CCGEdge *ccg_edge = ccgSubSurf_getEdge(ss, SET_INT_IN_POINTER(edge));
+ CCGEdge *ccg_edge = ccgSubSurf_getEdge(ss, POINTER_FROM_INT(edge));
CCGVert *ccg_vert0 = ccgSubSurf_getEdgeVert0(ccg_edge);
CCGVert *ccg_vert1 = ccgSubSurf_getEdgeVert1(ccg_edge);
- edge_verts[0] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ccg_vert0));
- edge_verts[1] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(ccg_vert1));
+ edge_verts[0] = POINTER_AS_INT(ccgSubSurf_getVertVertHandle(ccg_vert0));
+ edge_verts[1] = POINTER_AS_INT(ccgSubSurf_getVertVertHandle(ccg_vert1));
}
static int conv_ccg_get_num_edge_faces(const OpenSubdiv_Converter *converter,
int edge)
{
CCGSubSurf *ss = converter->user_data;
- CCGEdge *ccg_edge = ccgSubSurf_getEdge(ss, SET_INT_IN_POINTER(edge));
+ CCGEdge *ccg_edge = ccgSubSurf_getEdge(ss, POINTER_FROM_INT(edge));
return ccgSubSurf_getEdgeNumFaces(ccg_edge);
}
@@ -641,12 +657,12 @@ static void conv_ccg_get_edge_faces(const OpenSubdiv_Converter *converter,
int *edge_faces)
{
CCGSubSurf *ss = converter->user_data;
- CCGEdge *ccg_edge = ccgSubSurf_getEdge(ss, SET_INT_IN_POINTER(edge));
+ CCGEdge *ccg_edge = ccgSubSurf_getEdge(ss, POINTER_FROM_INT(edge));
int num_edge_faces = ccgSubSurf_getEdgeNumFaces(ccg_edge);
int face;
for (face = 0; face < num_edge_faces; face++) {
CCGFace *ccg_face = ccgSubSurf_getEdgeFace(ccg_edge, face);
- edge_faces[face] = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ccg_face));
+ edge_faces[face] = POINTER_AS_INT(ccgSubSurf_getFaceFaceHandle(ccg_face));
}
}
@@ -654,7 +670,7 @@ static float conv_ccg_get_edge_sharpness(const OpenSubdiv_Converter *converter,
int edge)
{
CCGSubSurf *ss = converter->user_data;
- CCGEdge *ccg_edge = ccgSubSurf_getEdge(ss, SET_INT_IN_POINTER(edge));
+ CCGEdge *ccg_edge = ccgSubSurf_getEdge(ss, POINTER_FROM_INT(edge));
/* TODO(sergey): Multiply by subdivision level once CPU evaluator
* is switched to uniform subdivision type.
*/
@@ -665,7 +681,7 @@ static int conv_ccg_get_num_vert_edges(const OpenSubdiv_Converter *converter,
int vert)
{
CCGSubSurf *ss = converter->user_data;
- CCGVert *ccg_vert = ccgSubSurf_getVert(ss, SET_INT_IN_POINTER(vert));
+ CCGVert *ccg_vert = ccgSubSurf_getVert(ss, POINTER_FROM_INT(vert));
return ccgSubSurf_getVertNumEdges(ccg_vert);
}
@@ -674,12 +690,12 @@ static void conv_ccg_get_vert_edges(const OpenSubdiv_Converter *converter,
int *vert_edges)
{
CCGSubSurf *ss = converter->user_data;
- CCGVert *ccg_vert = ccgSubSurf_getVert(ss, SET_INT_IN_POINTER(vert));
+ CCGVert *ccg_vert = ccgSubSurf_getVert(ss, POINTER_FROM_INT(vert));
int num_vert_edges = ccgSubSurf_getVertNumEdges(ccg_vert);
int edge;
for (edge = 0; edge < num_vert_edges; edge++) {
CCGEdge *ccg_edge = ccgSubSurf_getVertEdge(ccg_vert, edge);
- vert_edges[edge] = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(ccg_edge));
+ vert_edges[edge] = POINTER_AS_INT(ccgSubSurf_getEdgeEdgeHandle(ccg_edge));
}
}
@@ -687,7 +703,7 @@ static int conv_ccg_get_num_vert_faces(const OpenSubdiv_Converter *converter,
int vert)
{
CCGSubSurf *ss = converter->user_data;
- CCGVert *ccg_vert = ccgSubSurf_getVert(ss, SET_INT_IN_POINTER(vert));
+ CCGVert *ccg_vert = ccgSubSurf_getVert(ss, POINTER_FROM_INT(vert));
return ccgSubSurf_getVertNumFaces(ccg_vert);
}
@@ -696,12 +712,12 @@ static void conv_ccg_get_vert_faces(const OpenSubdiv_Converter *converter,
int *vert_faces)
{
CCGSubSurf *ss = converter->user_data;
- CCGVert *ccg_vert = ccgSubSurf_getVert(ss, SET_INT_IN_POINTER(vert));
+ CCGVert *ccg_vert = ccgSubSurf_getVert(ss, POINTER_FROM_INT(vert));
int num_vert_faces = ccgSubSurf_getVertNumFaces(ccg_vert);
int face;
for (face = 0; face < num_vert_faces; face++) {
CCGFace *ccg_face = ccgSubSurf_getVertFace(ccg_vert, face);
- vert_faces[face] = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ccg_face));
+ vert_faces[face] = POINTER_AS_INT(ccgSubSurf_getFaceFaceHandle(ccg_face));
}
}
@@ -750,6 +766,8 @@ void ccgSubSurf_converter_setup_from_ccg(CCGSubSurf *ss,
{
converter->getSchemeType = conv_ccg_get_bilinear_type;
+ converter->getVtxBoundaryInterpolation =
+ conv_ccg_get_vtx_boundary_interpolation;
converter->getFVarLinearInterpolation =
conv_ccg_get_fvar_linear_interpolation;
converter->specifiesFullTopology = conv_ccg_specifies_full_topology;
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 86c6f175340..1d787388774 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -60,6 +60,7 @@
#include "BKE_material.h"
#include "BKE_modifier.h"
#include "BKE_mesh.h"
+#include "BKE_mesh_iterators.h"
#include "BKE_mesh_mapping.h"
#include "BKE_mesh_runtime.h"
#include "BKE_mesh_tangent.h"
@@ -69,12 +70,12 @@
#include "BKE_multires.h"
#include "BKE_bvhutils.h"
#include "BKE_deform.h"
-#include "BKE_global.h" /* For debug flag, DM_update_tessface_data() func. */
#include "BLI_sys_types.h" /* for intptr_t support */
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
+#include "BKE_shrinkwrap.h"
#ifdef WITH_OPENSUBDIV
# include "DNA_userdef_types.h"
@@ -463,39 +464,6 @@ void DM_ensure_normals(DerivedMesh *dm)
BLI_assert((dm->dirty & DM_DIRTY_NORMALS) == 0);
}
-static void DM_calc_loop_normals(DerivedMesh *dm, const bool use_split_normals, float split_angle)
-{
- dm->calcLoopNormals(dm, use_split_normals, split_angle);
- dm->dirty |= DM_DIRTY_TESS_CDLAYERS;
-}
-
-/* note: until all modifiers can take MPoly's as input,
- * use this at the start of modifiers */
-void DM_ensure_tessface(DerivedMesh *dm)
-{
- const int numTessFaces = dm->getNumTessFaces(dm);
- const int numPolys = dm->getNumPolys(dm);
-
- if ((numTessFaces == 0) && (numPolys != 0)) {
- dm->recalcTessellation(dm);
-
- if (dm->getNumTessFaces(dm) != 0) {
- /* printf("info %s: polys -> ngons calculated\n", __func__); */
- }
- else {
- printf("warning %s: could not create tessfaces from %d polygons, dm->type=%u\n",
- __func__, numPolys, dm->type);
- }
- }
-
- else if (dm->dirty & DM_DIRTY_TESS_CDLAYERS) {
- BLI_assert(CustomData_has_layer(&dm->faceData, CD_ORIGINDEX) || numTessFaces == 0);
- DM_update_tessface_data(dm);
- }
-
- dm->dirty &= ~DM_DIRTY_TESS_CDLAYERS;
-}
-
/**
* Ensure the array is large enough
*
@@ -530,186 +498,6 @@ void DM_ensure_looptri_data(DerivedMesh *dm)
}
}
-void DM_verttri_from_looptri(MVertTri *verttri, const MLoop *mloop, const MLoopTri *looptri, int looptri_num)
-{
- int i;
- for (i = 0; i < looptri_num; i++) {
- verttri[i].tri[0] = mloop[looptri[i].tri[0]].v;
- verttri[i].tri[1] = mloop[looptri[i].tri[1]].v;
- verttri[i].tri[2] = mloop[looptri[i].tri[2]].v;
- }
-}
-
-/* Update tessface CD data from loop/poly ones. Needed when not retessellating after modstack evaluation. */
-/* NOTE: Assumes dm has valid tessellated data! */
-void DM_update_tessface_data(DerivedMesh *dm)
-{
- MFace *mf, *mface = dm->getTessFaceArray(dm);
- MPoly *mp = dm->getPolyArray(dm);
- MLoop *ml = dm->getLoopArray(dm);
-
- CustomData *fdata = dm->getTessFaceDataLayout(dm);
- CustomData *ldata = dm->getLoopDataLayout(dm);
-
- const int totface = dm->getNumTessFaces(dm);
- int mf_idx;
-
- int *polyindex = CustomData_get_layer(fdata, CD_ORIGINDEX);
- unsigned int (*loopindex)[4];
-
- /* Should never occure, but better abort than segfault! */
- if (!polyindex)
- return;
-
- CustomData_from_bmeshpoly(fdata, ldata, totface);
-
- if (CustomData_has_layer(fdata, CD_MTFACE) ||
- CustomData_has_layer(fdata, CD_MCOL) ||
- CustomData_has_layer(fdata, CD_PREVIEW_MCOL) ||
- CustomData_has_layer(fdata, CD_ORIGSPACE) ||
- CustomData_has_layer(fdata, CD_TESSLOOPNORMAL) ||
- CustomData_has_layer(fdata, CD_TANGENT))
- {
- loopindex = MEM_malloc_arrayN(totface, sizeof(*loopindex), __func__);
-
- for (mf_idx = 0, mf = mface; mf_idx < totface; mf_idx++, mf++) {
- const int mf_len = mf->v4 ? 4 : 3;
- unsigned int *ml_idx = loopindex[mf_idx];
- int i, not_done;
-
- /* Find out loop indices. */
- /* NOTE: This assumes tessface are valid and in sync with loop/poly... Else, most likely, segfault! */
- for (i = mp[polyindex[mf_idx]].loopstart, not_done = mf_len; not_done; i++) {
- const int tf_v = BKE_MESH_TESSFACE_VINDEX_ORDER(mf, ml[i].v);
- if (tf_v != -1) {
- ml_idx[tf_v] = i;
- not_done--;
- }
- }
- }
-
- /* NOTE: quad detection issue - fourth vertidx vs fourth loopidx:
- * Here, our tfaces' fourth vertex index is never 0 for a quad. However, we know our fourth loop index may be
- * 0 for quads (because our quads may have been rotated compared to their org poly, see tessellation code).
- * So we pass the MFace's, and BKE_mesh_loops_to_tessdata will use MFace->v4 index as quad test.
- */
- BKE_mesh_loops_to_tessdata(fdata, ldata, mface, polyindex, loopindex, totface);
-
- MEM_freeN(loopindex);
- }
-
- if (G.debug & G_DEBUG)
- printf("%s: Updated tessellated customdata of dm %p\n", __func__, dm);
-
- dm->dirty &= ~DM_DIRTY_TESS_CDLAYERS;
-}
-
-void DM_generate_tangent_tessface_data(DerivedMesh *dm, bool generate)
-{
- MFace *mf, *mface = dm->getTessFaceArray(dm);
- MPoly *mp = dm->getPolyArray(dm);
- MLoop *ml = dm->getLoopArray(dm);
-
- CustomData *fdata = dm->getTessFaceDataLayout(dm);
- CustomData *ldata = dm->getLoopDataLayout(dm);
-
- const int totface = dm->getNumTessFaces(dm);
- int mf_idx;
-
- int *polyindex = CustomData_get_layer(fdata, CD_ORIGINDEX);
- unsigned int (*loopindex)[4] = NULL;
-
- /* Should never occure, but better abort than segfault! */
- if (!polyindex)
- return;
-
- if (generate) {
- for (int j = 0; j < ldata->totlayer; j++) {
- if (ldata->layers[j].type == CD_TANGENT) {
- CustomData_add_layer_named(fdata, CD_TANGENT, CD_CALLOC, NULL, totface, ldata->layers[j].name);
- CustomData_bmesh_update_active_layers(fdata, ldata);
-
- if (!loopindex) {
- loopindex = MEM_malloc_arrayN(totface, sizeof(*loopindex), __func__);
- for (mf_idx = 0, mf = mface; mf_idx < totface; mf_idx++, mf++) {
- const int mf_len = mf->v4 ? 4 : 3;
- unsigned int *ml_idx = loopindex[mf_idx];
-
- /* Find out loop indices. */
- /* NOTE: This assumes tessface are valid and in sync with loop/poly... Else, most likely, segfault! */
- for (int i = mp[polyindex[mf_idx]].loopstart, not_done = mf_len; not_done; i++) {
- const int tf_v = BKE_MESH_TESSFACE_VINDEX_ORDER(mf, ml[i].v);
- if (tf_v != -1) {
- ml_idx[tf_v] = i;
- not_done--;
- }
- }
- }
- }
-
- /* NOTE: quad detection issue - fourth vertidx vs fourth loopidx:
- * Here, our tfaces' fourth vertex index is never 0 for a quad. However, we know our fourth loop index may be
- * 0 for quads (because our quads may have been rotated compared to their org poly, see tessellation code).
- * So we pass the MFace's, and BKE_mesh_loops_to_tessdata will use MFace->v4 index as quad test.
- */
- BKE_mesh_tangent_loops_to_tessdata(fdata, ldata, mface, polyindex, loopindex, totface, ldata->layers[j].name);
- }
- }
- if (loopindex)
- MEM_freeN(loopindex);
- BLI_assert(CustomData_from_bmeshpoly_test(fdata, ldata, true));
- }
-
- if (G.debug & G_DEBUG)
- printf("%s: Updated tessellated tangents of dm %p\n", __func__, dm);
-}
-
-
-void DM_update_materials(DerivedMesh *dm, Object *ob)
-{
- int i, totmat = ob->totcol + 1; /* materials start from 1, default material is 0 */
-
- if (dm->totmat != totmat) {
- dm->totmat = totmat;
- /* invalidate old materials */
- if (dm->mat)
- MEM_freeN(dm->mat);
-
- dm->mat = MEM_malloc_arrayN(totmat, sizeof(*dm->mat), "DerivedMesh.mat");
- }
-
- /* we leave last material as empty - rationale here is being able to index
- * the materials by using the mf->mat_nr directly and leaving the last
- * material as NULL in case no materials exist on mesh, so indexing will not fail */
- for (i = 0; i < totmat - 1; i++) {
- dm->mat[i] = give_current_material(ob, i + 1);
- }
- dm->mat[i] = NULL;
-}
-
-MLoopUV *DM_paint_uvlayer_active_get(DerivedMesh *dm, int mat_nr)
-{
- MLoopUV *uv_base;
-
- BLI_assert(mat_nr < dm->totmat);
-
- if (dm->mat[mat_nr] && dm->mat[mat_nr]->texpaintslot &&
- dm->mat[mat_nr]->texpaintslot[dm->mat[mat_nr]->paint_active_slot].uvname)
- {
- uv_base = CustomData_get_layer_named(&dm->loopData, CD_MLOOPUV,
- dm->mat[mat_nr]->texpaintslot[dm->mat[mat_nr]->paint_active_slot].uvname);
- /* This can fail if we have changed the name in the UV layer list and have assigned the old name in the material
- * texture slot.*/
- if (!uv_base)
- uv_base = CustomData_get_layer(&dm->loopData, CD_MLOOPUV);
- }
- else {
- uv_base = CustomData_get_layer(&dm->loopData, CD_MLOOPUV);
- }
-
- return uv_base;
-}
-
void DM_to_mesh(DerivedMesh *dm, Mesh *me, Object *ob, CustomDataMask mask, bool take_ownership)
{
/* dm might depend on me, so we need to do everything with a local copy */
@@ -1112,11 +900,6 @@ void DM_interp_tessface_data(
weights, (float *)vert_weights, count, dest_index);
}
-void DM_swap_tessface_data(DerivedMesh *dm, int index, const int *corner_indices)
-{
- CustomData_swap_corners(&dm->faceData, index, corner_indices);
-}
-
void DM_interp_loop_data(
DerivedMesh *source, DerivedMesh *dest,
int *src_indices,
@@ -1149,60 +932,6 @@ DerivedMesh *mesh_create_derived(Mesh *me, float (*vertCos)[3])
return dm;
}
-/* XXX2.8(Sybren): can be removed once DerivedMesh port is done */
-#ifdef WITH_DERIVEDMESH_DEPRECATED_FUNCS
-DerivedMesh *mesh_create_derived_for_modifier(
- struct Depsgraph *depsgraph, Scene *scene, Object *ob,
- ModifierData *md, int build_shapekey_layers)
-{
- Mesh *me = ob->data;
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- DerivedMesh *dm;
- KeyBlock *kb;
- ModifierEvalContext mectx = {depsgraph, ob, 0};
-
- md->scene = scene;
-
- if (!(md->mode & eModifierMode_Realtime)) {
- return NULL;
- }
-
- if (mti->isDisabled && mti->isDisabled(md, 0)) {
- return NULL;
- }
-
- if (build_shapekey_layers && me->key && (kb = BLI_findlink(&me->key->block, ob->shapenr - 1))) {
- BKE_keyblock_convert_to_mesh(kb, me);
- }
-
- if (mti->type == eModifierTypeType_OnlyDeform) {
- int numVerts;
- float (*deformedVerts)[3] = BKE_mesh_vertexCos_get(me, &numVerts);
-
- modwrap_deformVerts(md, &mectx, NULL, deformedVerts, numVerts);
- dm = mesh_create_derived(me, deformedVerts);
-
- if (build_shapekey_layers)
- add_shapekey_layers(dm, me, ob);
-
- MEM_freeN(deformedVerts);
- }
- else {
- DerivedMesh *tdm = mesh_create_derived(me, NULL);
-
- if (build_shapekey_layers)
- add_shapekey_layers(tdm, me, ob);
-
- dm = modwrap_applyModifier(md, &mectx, tdm);
- ASSERT_IS_VALID_DM(dm);
-
- if (tdm != dm) tdm->release(tdm);
- }
-
- return dm;
-}
-#endif
-
static float (*get_editbmesh_orco_verts(BMEditMesh *em))[3]
{
BMIter iter;
@@ -1223,7 +952,7 @@ static float (*get_editbmesh_orco_verts(BMEditMesh *em))[3]
}
/* orco custom data layer */
-static float (*get_orco_coords_dm(Object *ob, BMEditMesh *em, int layer, int *free))[3]
+static float (*get_orco_coords(Object *ob, BMEditMesh *em, int layer, int *free))[3]
{
*free = 0;
@@ -1254,29 +983,6 @@ static float (*get_orco_coords_dm(Object *ob, BMEditMesh *em, int layer, int *fr
return NULL;
}
-static DerivedMesh *create_orco_dm(Object *ob, Mesh *me, BMEditMesh *em, int layer)
-{
- DerivedMesh *dm;
- float (*orco)[3];
- int free;
-
- if (em) {
- dm = CDDM_from_editbmesh(em, false, false);
- }
- else {
- dm = CDDM_from_mesh(me);
- }
-
- orco = get_orco_coords_dm(ob, em, layer, &free);
-
- if (orco) {
- CDDM_apply_vert_coords(dm, orco);
- if (free) MEM_freeN(orco);
- }
-
- return dm;
-}
-
static Mesh *create_orco_mesh(Object *ob, Mesh *me, BMEditMesh *em, int layer)
{
Mesh *mesh;
@@ -1284,13 +990,13 @@ static Mesh *create_orco_mesh(Object *ob, Mesh *me, BMEditMesh *em, int layer)
int free;
if (em) {
- mesh = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0});
+ mesh = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0);
}
else {
- mesh = BKE_mesh_copy_for_eval(me);
+ mesh = BKE_mesh_copy_for_eval(me, true);
}
- orco = get_orco_coords_dm(ob, em, layer, &free);
+ orco = get_orco_coords(ob, em, layer, &free);
if (orco) {
BKE_mesh_apply_vert_coords(mesh, orco);
@@ -1300,58 +1006,20 @@ static Mesh *create_orco_mesh(Object *ob, Mesh *me, BMEditMesh *em, int layer)
return mesh;
}
-static void add_orco_dm(
- Object *ob, BMEditMesh *em, DerivedMesh *dm,
- DerivedMesh *orcodm, int layer)
-{
- float (*orco)[3], (*layerorco)[3];
- int totvert, free;
-
- totvert = dm->getNumVerts(dm);
-
- if (orcodm) {
- orco = MEM_calloc_arrayN(totvert, sizeof(float[3]), "dm orco");
- free = 1;
-
- if (orcodm->getNumVerts(orcodm) == totvert)
- orcodm->getVertCos(orcodm, orco);
- else
- dm->getVertCos(dm, orco);
- }
- else {
- /* TODO(sybren): totvert should potentially change here, as ob->data
- * or em may have a different number of vertices than dm. */
- orco = get_orco_coords_dm(ob, em, layer, &free);
- }
-
- if (orco) {
- if (layer == CD_ORCO)
- BKE_mesh_orco_verts_transform(ob->data, orco, totvert, 0);
-
- if (!(layerorco = DM_get_vert_data_layer(dm, layer))) {
- DM_add_vert_layer(dm, layer, CD_CALLOC, NULL);
- layerorco = DM_get_vert_data_layer(dm, layer);
- }
-
- memcpy(layerorco, orco, sizeof(float) * 3 * totvert);
- if (free) MEM_freeN(orco);
- }
-}
-
static void add_orco_mesh(
Object *ob, BMEditMesh *em, Mesh *mesh,
- Mesh *orco_mesh, int layer)
+ Mesh *me_orco, int layer)
{
float (*orco)[3], (*layerorco)[3];
int totvert, free;
totvert = mesh->totvert;
- if (orco_mesh) {
+ if (me_orco) {
free = 1;
- if (orco_mesh->totvert == totvert) {
- orco = BKE_mesh_vertexCos_get(orco_mesh, NULL);
+ if (me_orco->totvert == totvert) {
+ orco = BKE_mesh_vertexCos_get(me_orco, NULL);
}
else {
orco = BKE_mesh_vertexCos_get(mesh, NULL);
@@ -1360,7 +1028,7 @@ static void add_orco_mesh(
else {
/* TODO(sybren): totvert should potentially change here, as ob->data
* or em may have a different number of vertices than dm. */
- orco = get_orco_coords_dm(ob, em, layer, &free);
+ orco = get_orco_coords(ob, em, layer, &free);
}
if (orco) {
@@ -1380,444 +1048,12 @@ static void add_orco_mesh(
}
}
-/* weight paint colors */
-
-/* Something of a hack, at the moment deal with weightpaint
- * by tucking into colors during modifier eval, only in
- * wpaint mode. Works ok but need to make sure recalc
- * happens on enter/exit wpaint.
- */
-
-/* draw_flag's for calc_weightpaint_vert_color */
-enum {
- /* only one of these should be set, keep first (for easy bit-shifting) */
- CALC_WP_GROUP_USER_ACTIVE = (1 << 1),
- CALC_WP_GROUP_USER_ALL = (1 << 2),
-
- CALC_WP_MULTIPAINT = (1 << 3),
- CALC_WP_AUTO_NORMALIZE = (1 << 4),
- CALC_WP_MIRROR_X = (1 << 5),
-};
-
-typedef struct MERuntimeWeightColorInfo {
- const ColorBand *coba;
- const char *alert_color;
-} MERuntimeWeightColorInfo;
-
-
-static int dm_drawflag_calc(const ToolSettings *ts, const Mesh *me)
-{
- return ((ts->multipaint ? CALC_WP_MULTIPAINT : 0) |
- /* CALC_WP_GROUP_USER_ACTIVE or CALC_WP_GROUP_USER_ALL */
- (1 << ts->weightuser) |
- (ts->auto_normalize ? CALC_WP_AUTO_NORMALIZE : 0) |
- ((me->editflag & ME_EDIT_MIRROR_X) ? CALC_WP_MIRROR_X : 0));
-}
-
-static void weightpaint_color(unsigned char r_col[4], MERuntimeWeightColorInfo *dm_wcinfo, const float input)
-{
- float colf[4];
-
- if (dm_wcinfo && dm_wcinfo->coba) {
- BKE_colorband_evaluate(dm_wcinfo->coba, input, colf);
- }
- else {
- BKE_defvert_weight_to_rgb(colf, input);
- }
-
- /* don't use rgb_float_to_uchar() here because
- * the resulting float doesn't need 0-1 clamp check */
- r_col[0] = (unsigned char)(colf[0] * 255.0f);
- r_col[1] = (unsigned char)(colf[1] * 255.0f);
- r_col[2] = (unsigned char)(colf[2] * 255.0f);
- r_col[3] = 255;
-}
-
-
-static void calc_weightpaint_vert_color(
- unsigned char r_col[4],
- const MDeformVert *dv,
- MERuntimeWeightColorInfo *dm_wcinfo,
- const int defbase_tot, const int defbase_act,
- const bool *defbase_sel, const int defbase_sel_tot,
- const int draw_flag)
-{
- float input = 0.0f;
-
- bool show_alert_color = false;
-
- if ((defbase_sel_tot > 1) && (draw_flag & CALC_WP_MULTIPAINT)) {
- /* Multi-Paint feature */
- input = BKE_defvert_multipaint_collective_weight(
- dv, defbase_tot, defbase_sel, defbase_sel_tot, (draw_flag & CALC_WP_AUTO_NORMALIZE) != 0);
-
- /* make it black if the selected groups have no weight on a vertex */
- if (input == 0.0f) {
- show_alert_color = true;
- }
- }
- else {
- /* default, non tricky behavior */
- input = defvert_find_weight(dv, defbase_act);
-
- if (draw_flag & CALC_WP_GROUP_USER_ACTIVE) {
- if (input == 0.0f) {
- show_alert_color = true;
- }
- }
- else if (draw_flag & CALC_WP_GROUP_USER_ALL) {
- if (input == 0.0f) {
- show_alert_color = defvert_is_weight_zero(dv, defbase_tot);
- }
- }
- }
-
- if (show_alert_color == false) {
- CLAMP(input, 0.0f, 1.0f);
- weightpaint_color(r_col, dm_wcinfo, input);
- }
- else {
- copy_v3_v3_char((char *)r_col, dm_wcinfo->alert_color);
- r_col[3] = 255;
- }
-}
-
-static MERuntimeWeightColorInfo G_me_runtime_wcinfo;
-
-void BKE_mesh_runtime_color_band_store(const ColorBand *coba, const char alert_color[4])
-{
- G_me_runtime_wcinfo.coba = coba;
- G_me_runtime_wcinfo.alert_color = alert_color;
-}
-
-/**
- * return an array of vertex weight colors, caller must free.
- *
- * \note that we could save some memory and allocate RGB only but then we'd need to
- * re-arrange the colors when copying to the face since MCol has odd ordering,
- * so leave this as is - campbell
- */
-static void calc_weightpaint_vert_array(
- Object *ob, DerivedMesh *dm, int const draw_flag, MERuntimeWeightColorInfo *dm_wcinfo,
- unsigned char (*r_wtcol_v)[4])
-{
- BMEditMesh *em = (dm->type == DM_TYPE_EDITBMESH) ? BKE_editmesh_from_object(ob) : NULL;
- const int numVerts = dm->getNumVerts(dm);
-
- if ((ob->actdef != 0) &&
- (CustomData_has_layer(em ? &em->bm->vdata : &dm->vertData, CD_MDEFORMVERT)))
- {
- unsigned char (*wc)[4] = r_wtcol_v;
- unsigned int i;
-
- /* variables for multipaint */
- const int defbase_tot = BLI_listbase_count(&ob->defbase);
- const int defbase_act = ob->actdef - 1;
-
- int defbase_sel_tot = 0;
- bool *defbase_sel = NULL;
-
- if (draw_flag & CALC_WP_MULTIPAINT) {
- defbase_sel = BKE_object_defgroup_selected_get(ob, defbase_tot, &defbase_sel_tot);
-
- if (defbase_sel_tot > 1 && (draw_flag & CALC_WP_MIRROR_X)) {
- BKE_object_defgroup_mirror_selection(ob, defbase_tot, defbase_sel, defbase_sel, &defbase_sel_tot);
- }
- }
-
- /* editmesh won't have deform verts unless modifiers require it,
- * avoid having to create an array of deform-verts only for drawing
- * by reading from the bmesh directly. */
- if (em) {
- BMIter iter;
- BMVert *eve;
- const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
- BLI_assert(cd_dvert_offset != -1);
-
- BM_ITER_MESH_INDEX (eve, &iter, em->bm, BM_VERTS_OF_MESH, i) {
- const MDeformVert *dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
- calc_weightpaint_vert_color(
- (unsigned char *)wc, dv, dm_wcinfo,
- defbase_tot, defbase_act, defbase_sel, defbase_sel_tot, draw_flag);
- wc++;
- }
- }
- else {
- const MDeformVert *dv = DM_get_vert_data_layer(dm, CD_MDEFORMVERT);
- for (i = numVerts; i != 0; i--, wc++, dv++) {
- calc_weightpaint_vert_color(
- (unsigned char *)wc, dv, dm_wcinfo,
- defbase_tot, defbase_act, defbase_sel, defbase_sel_tot, draw_flag);
- }
- }
-
- if (defbase_sel) {
- MEM_freeN(defbase_sel);
- }
- }
- else {
- unsigned char col[4];
- if ((ob->actdef == 0) && !BLI_listbase_is_empty(&ob->defbase)) {
- /* color-code for missing data (full brightness isn't easy on the eye). */
- ARRAY_SET_ITEMS(col, 0xa0, 0, 0xa0, 0xff);
- }
- else if (draw_flag & (CALC_WP_GROUP_USER_ACTIVE | CALC_WP_GROUP_USER_ALL)) {
- copy_v3_v3_char((char *)col, dm_wcinfo->alert_color);
- col[3] = 255;
- }
- else {
- weightpaint_color(col, dm_wcinfo, 0.0f);
- }
- copy_vn_i((int *)r_wtcol_v, numVerts, *((int *)col));
- }
-}
-
-static void calc_weightpaint_vert_array_mesh(
- Object *ob, Mesh *mesh, int const draw_flag, MERuntimeWeightColorInfo *dm_wcinfo,
- unsigned char (*r_wtcol_v)[4])
+static void editmesh_update_statvis_color(const Scene *scene, Object *ob)
{
BMEditMesh *em = BKE_editmesh_from_object(ob);
- const int numVerts = mesh->totvert;
-
- if ((ob->actdef != 0) &&
- (CustomData_has_layer(em ? &em->bm->vdata : &mesh->vdata, CD_MDEFORMVERT)))
- {
- unsigned char (*wc)[4] = r_wtcol_v;
- unsigned int i;
-
- /* variables for multipaint */
- const int defbase_tot = BLI_listbase_count(&ob->defbase);
- const int defbase_act = ob->actdef - 1;
-
- int defbase_sel_tot = 0;
- bool *defbase_sel = NULL;
-
- if (draw_flag & CALC_WP_MULTIPAINT) {
- defbase_sel = BKE_object_defgroup_selected_get(ob, defbase_tot, &defbase_sel_tot);
-
- if (defbase_sel_tot > 1 && (draw_flag & CALC_WP_MIRROR_X)) {
- BKE_object_defgroup_mirror_selection(ob, defbase_tot, defbase_sel, defbase_sel, &defbase_sel_tot);
- }
- }
-
- /* editmesh won't have deform verts unless modifiers require it,
- * avoid having to create an array of deform-verts only for drawing
- * by reading from the bmesh directly. */
- if (em) {
- BMIter iter;
- BMVert *eve;
- const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
- BLI_assert(cd_dvert_offset != -1);
-
- BM_ITER_MESH_INDEX (eve, &iter, em->bm, BM_VERTS_OF_MESH, i) {
- const MDeformVert *dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
- calc_weightpaint_vert_color(
- (unsigned char *)wc, dv, dm_wcinfo,
- defbase_tot, defbase_act, defbase_sel, defbase_sel_tot, draw_flag);
- wc++;
- }
- }
- else {
- const MDeformVert *dv = CustomData_get_layer(&mesh->vdata, CD_MDEFORMVERT);
- for (i = numVerts; i != 0; i--, wc++, dv++) {
- calc_weightpaint_vert_color(
- (unsigned char *)wc, dv, dm_wcinfo,
- defbase_tot, defbase_act, defbase_sel, defbase_sel_tot, draw_flag);
- }
- }
-
- if (defbase_sel) {
- MEM_freeN(defbase_sel);
- }
- }
- else {
- unsigned char col[4];
- if ((ob->actdef == 0) && !BLI_listbase_is_empty(&ob->defbase)) {
- /* color-code for missing data (full brightness isn't easy on the eye). */
- ARRAY_SET_ITEMS(col, 0xa0, 0, 0xa0, 0xff);
- }
- else if (draw_flag & (CALC_WP_GROUP_USER_ACTIVE | CALC_WP_GROUP_USER_ALL)) {
- copy_v3_v3_char((char *)col, dm_wcinfo->alert_color);
- col[3] = 255;
- }
- else {
- weightpaint_color(col, dm_wcinfo, 0.0f);
- }
- copy_vn_i((int *)r_wtcol_v, numVerts, *((int *)col));
- }
-}
-
-/** return an array of vertex weight colors from given weights, caller must free.
- *
- * \note that we could save some memory and allocate RGB only but then we'd need to
- * re-arrange the colors when copying to the face since MCol has odd ordering,
- * so leave this as is - campbell
- */
-static void calc_colors_from_weights_array(
- const int num, const float *weights,
- unsigned char (*r_wtcol_v)[4])
-{
- unsigned char (*wc)[4] = r_wtcol_v;
- int i;
-
- for (i = 0; i < num; i++, wc++, weights++) {
- weightpaint_color((unsigned char *)wc, NULL, *weights);
- }
-}
-
-void DM_update_weight_mcol(
- Object *ob, DerivedMesh *dm, int const draw_flag,
- float *weights, int num, const int *indices)
-{
- BMEditMesh *em = (dm->type == DM_TYPE_EDITBMESH) ? BKE_editmesh_from_object(ob) : NULL;
- unsigned char (*wtcol_v)[4];
- int numVerts = dm->getNumVerts(dm);
- int i;
-
- if (em) {
- BKE_editmesh_color_ensure(em, BM_VERT);
- wtcol_v = em->derivedVertColor;
- }
- else {
- wtcol_v = MEM_malloc_arrayN(numVerts, sizeof(*wtcol_v), __func__);
- }
-
- /* Weights are given by caller. */
- if (weights) {
- float *w = weights;
- /* If indices is not NULL, it means we do not have weights for all vertices,
- * so we must create them (and set them to zero)... */
- if (indices) {
- w = MEM_calloc_arrayN(numVerts, sizeof(float), "Temp weight array DM_update_weight_mcol");
- i = num;
- while (i--)
- w[indices[i]] = weights[i];
- }
-
- /* Convert float weights to colors. */
- calc_colors_from_weights_array(numVerts, w, wtcol_v);
-
- if (indices)
- MEM_freeN(w);
- }
- else {
- /* No weights given, take them from active vgroup(s). */
- calc_weightpaint_vert_array(ob, dm, draw_flag, &G_me_runtime_wcinfo, wtcol_v);
- }
-
- if (dm->type == DM_TYPE_EDITBMESH) {
- /* editmesh draw function checks specifically for this */
- }
- else {
- const int dm_totpoly = dm->getNumPolys(dm);
- const int dm_totloop = dm->getNumLoops(dm);
- unsigned char(*wtcol_l)[4] = CustomData_get_layer(dm->getLoopDataLayout(dm), CD_PREVIEW_MLOOPCOL);
- MLoop *mloop = dm->getLoopArray(dm), *ml;
- MPoly *mp = dm->getPolyArray(dm);
- int l_index;
- int j;
-
- /* now add to loops, so the data can be passed through the modifier stack
- * If no CD_PREVIEW_MLOOPCOL existed yet, we have to add a new one! */
- if (!wtcol_l) {
- wtcol_l = MEM_malloc_arrayN(dm_totloop, sizeof(*wtcol_l), __func__);
- CustomData_add_layer(&dm->loopData, CD_PREVIEW_MLOOPCOL, CD_ASSIGN, wtcol_l, dm_totloop);
- }
-
- l_index = 0;
- for (i = 0; i < dm_totpoly; i++, mp++) {
- ml = mloop + mp->loopstart;
-
- for (j = 0; j < mp->totloop; j++, ml++, l_index++) {
- copy_v4_v4_uchar(&wtcol_l[l_index][0],
- &wtcol_v[ml->v][0]);
- }
- }
- MEM_freeN(wtcol_v);
-
- dm->dirty |= DM_DIRTY_TESS_CDLAYERS;
- }
-}
-
-static void mesh_update_weight_mcol(
- Object *ob, Mesh *mesh, int const draw_flag,
- float *weights, int num, const int *indices)
-{
- BMEditMesh *em = BKE_editmesh_from_object(ob);
- unsigned char (*wtcol_v)[4];
- int numVerts = mesh->totvert;
- int i;
-
- if (em) {
- BKE_editmesh_color_ensure(em, BM_VERT);
- wtcol_v = em->derivedVertColor;
- }
- else {
- wtcol_v = MEM_malloc_arrayN(numVerts, sizeof(*wtcol_v), __func__);
- }
-
- /* Weights are given by caller. */
- if (weights) {
- float *w = weights;
- /* If indices is not NULL, it means we do not have weights for all vertices,
- * so we must create them (and set them to zero)... */
- if (indices) {
- w = MEM_calloc_arrayN(numVerts, sizeof(float), "Temp weight array DM_update_weight_mcol");
- i = num;
- while (i--)
- w[indices[i]] = weights[i];
- }
-
- /* Convert float weights to colors. */
- calc_colors_from_weights_array(numVerts, w, wtcol_v);
-
- if (indices)
- MEM_freeN(w);
- }
- else {
- /* No weights given, take them from active vgroup(s). */
- calc_weightpaint_vert_array_mesh(ob, mesh, draw_flag, &G_me_runtime_wcinfo, wtcol_v);
- }
-
- if (em) {
- /* editmesh draw function checks specifically for this */
- }
- else {
- const int totpoly = mesh->totpoly;
- const int totloop = mesh->totloop;
- unsigned char(*wtcol_l)[4] = CustomData_get_layer(&mesh->ldata, CD_PREVIEW_MLOOPCOL);
- MLoop *mloop = mesh->mloop, *ml;
- MPoly *mp = mesh->mpoly;
- int l_index;
- int j;
-
- /* now add to loops, so the data can be passed through the modifier stack
- * If no CD_PREVIEW_MLOOPCOL existed yet, we have to add a new one! */
- if (!wtcol_l) {
- wtcol_l = MEM_malloc_arrayN(totloop, sizeof(*wtcol_l), __func__);
- CustomData_add_layer(&mesh->ldata, CD_PREVIEW_MLOOPCOL, CD_ASSIGN, wtcol_l, totloop);
- }
-
- l_index = 0;
- for (i = 0; i < totpoly; i++, mp++) {
- ml = mloop + mp->loopstart;
-
- for (j = 0; j < mp->totloop; j++, ml++, l_index++) {
- copy_v4_v4_uchar(&wtcol_l[l_index][0],
- &wtcol_v[ml->v][0]);
- }
- }
- MEM_freeN(wtcol_v);
-
- BKE_mesh_tessface_clear(mesh);
- }
-}
-
-static void DM_update_statvis_color(const Scene *scene, Object *ob, DerivedMesh *dm)
-{
- BMEditMesh *em = BKE_editmesh_from_object(ob);
-
- BKE_editmesh_statvis_calc(em, dm, &scene->toolsettings->statvis);
+ Mesh *me = ob->data;
+ BKE_mesh_runtime_ensure_edit_data(me);
+ BKE_editmesh_statvis_calc(em, me->runtime.edit_data, &scene->toolsettings->statvis);
}
static void shapekey_layers_to_keyblocks(DerivedMesh *dm, Mesh *me, int actshape_uid)
@@ -1876,20 +1112,20 @@ static void shapekey_layers_to_keyblocks(DerivedMesh *dm, Mesh *me, int actshape
}
}
-static void UNUSED_FUNCTION(add_shapekey_layers)(DerivedMesh *dm, Mesh *me, Object *UNUSED(ob))
+static void add_shapekey_layers(Mesh *me_dst, Mesh *me_src, Object *UNUSED(ob))
{
KeyBlock *kb;
- Key *key = me->key;
+ Key *key = me_src->key;
int i;
- if (!me->key)
+ if (!me_src->key)
return;
/* ensure we can use mesh vertex count for derived mesh custom data */
- if (me->totvert != dm->getNumVerts(dm)) {
+ if (me_src->totvert != me_dst->totvert) {
fprintf(stderr,
- "%s: vertex size mismatch (mesh/dm) '%s' (%d != %d)\n",
- __func__, me->id.name + 2, me->totvert, dm->getNumVerts(dm));
+ "%s: vertex size mismatch (mesh/eval) '%s' (%d != %d)\n",
+ __func__, me_src->id.name + 2, me_src->totvert, me_dst->totvert);
return;
}
@@ -1897,67 +1133,21 @@ static void UNUSED_FUNCTION(add_shapekey_layers)(DerivedMesh *dm, Mesh *me, Obje
int ci;
float *array;
- if (me->totvert != kb->totelem) {
+ if (me_src->totvert != kb->totelem) {
fprintf(stderr,
"%s: vertex size mismatch (Mesh '%s':%d != KeyBlock '%s':%d)\n",
- __func__, me->id.name + 2, me->totvert, kb->name, kb->totelem);
- array = MEM_calloc_arrayN((size_t)me->totvert, 3 * sizeof(float), __func__);
+ __func__, me_src->id.name + 2, me_src->totvert, kb->name, kb->totelem);
+ array = MEM_calloc_arrayN((size_t)me_src->totvert, sizeof(float[3]), __func__);
}
else {
- array = MEM_malloc_arrayN((size_t)me->totvert, 3 * sizeof(float), __func__);
- memcpy(array, kb->data, (size_t)me->totvert * 3 * sizeof(float));
+ array = MEM_malloc_arrayN((size_t)me_src->totvert, sizeof(float[3]), __func__);
+ memcpy(array, kb->data, (size_t)me_src->totvert * sizeof(float[3]));
}
- CustomData_add_layer_named(&dm->vertData, CD_SHAPEKEY, CD_ASSIGN, array, dm->numVertData, kb->name);
- ci = CustomData_get_layer_index_n(&dm->vertData, CD_SHAPEKEY, i);
-
- dm->vertData.layers[ci].uid = kb->uid;
- }
-}
-
-/**
- * Called after calculating all modifiers.
- *
- * \note tessfaces should already be calculated.
- */
-static void dm_ensure_display_normals(DerivedMesh *dm)
-{
- /* Note: dm *may* have a poly CD_NORMAL layer (generated by a modifier needing poly normals e.g.).
- * We do not use it here, though. And it should be tagged as temp!
- */
- /* BLI_assert((CustomData_has_layer(&dm->polyData, CD_NORMAL) == false)); */
-
- if ((dm->type == DM_TYPE_CDDM) &&
- ((dm->dirty & DM_DIRTY_NORMALS) || CustomData_has_layer(&dm->polyData, CD_NORMAL) == false))
- {
- /* if normals are dirty we want to calculate vertex normals too */
- CDDM_calc_normals_mapping_ex(dm, (dm->dirty & DM_DIRTY_NORMALS) ? false : true);
- }
-}
-
-static void mesh_ensure_display_normals(Mesh *mesh)
-{
- /* Note: mesh *may* have a poly CD_NORMAL layer (generated by a modifier needing poly normals e.g.).
- * We do not use it here, though. And it should be tagged as temp!
- */
- /* BLI_assert((CustomData_has_layer(&mesh->pdata, CD_NORMAL) == false)); */
-
- if (mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL || !CustomData_has_layer(&mesh->pdata, CD_NORMAL)) {
- float (*face_nors)[3] = NULL;
- face_nors = MEM_malloc_arrayN(mesh->totpoly, sizeof(*face_nors), "face_nors");
+ CustomData_add_layer_named(&me_dst->vdata, CD_SHAPEKEY, CD_ASSIGN, array, me_dst->totvert, kb->name);
+ ci = CustomData_get_layer_index_n(&me_dst->vdata, CD_SHAPEKEY, i);
- /* if normals are dirty we want to calculate vertex normals too */
- bool only_face_normals = !(mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL);
-
- /* calculate face normals */
- BKE_mesh_calc_normals_poly(
- mesh->mvert, NULL, mesh->totvert, mesh->mloop, mesh->mpoly,
- mesh->totloop, mesh->totpoly, face_nors,
- only_face_normals);
-
- CustomData_add_layer(&mesh->pdata, CD_NORMAL, CD_ASSIGN, face_nors, mesh->totpoly);
-
- mesh->runtime.cd_dirty_vert &= ~CD_MASK_NORMAL;
+ me_dst->vdata.layers[ci].uid = kb->uid;
}
}
@@ -1966,17 +1156,15 @@ static void mesh_calc_modifiers(
int useDeform,
const bool need_mapping, CustomDataMask dataMask,
const int index, const bool useCache, const bool build_shapekey_layers,
- const bool allow_gpu,
/* return args */
- Mesh **r_deform_mesh, Mesh **r_final_mesh)
+ Mesh **r_deform, Mesh **r_final)
{
- Mesh *me = ob->data;
ModifierData *firstmd, *md, *previewmd = NULL;
CDMaskLink *datamasks, *curr;
/* XXX Always copying POLYINDEX, else tessellated data are no more valid! */
CustomDataMask mask, nextmask, previewmask = 0, append_mask = CD_MASK_ORIGINDEX;
float (*deformedVerts)[3] = NULL;
- int numVerts = me->totvert;
+ int numVerts = ((Mesh *)ob->data)->totvert;
const bool useRenderParams = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
const int required_mode = useRenderParams ? eModifierMode_Render : eModifierMode_Realtime;
bool isPrevDeform = false;
@@ -1985,31 +1173,20 @@ static void mesh_calc_modifiers(
bool multires_applied = false;
const bool sculpt_mode = ob->mode & OB_MODE_SCULPT && ob->sculpt && !useRenderParams;
const bool sculpt_dyntopo = (sculpt_mode && ob->sculpt->bm) && !useRenderParams;
- const int draw_flag = dm_drawflag_calc(scene->toolsettings, me);
/* Generic preview only in object mode! */
const bool do_mod_mcol = (ob->mode == OB_MODE_OBJECT);
-#if 0 /* XXX Will re-enable this when we have global mod stack options. */
- const bool do_final_wmcol = (scene->toolsettings->weights_preview == WP_WPREVIEW_FINAL) && do_wmcol;
-#endif
- const bool do_final_wmcol = false;
- const bool do_init_wmcol = ((dataMask & CD_MASK_PREVIEW_MLOOPCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT) && !do_final_wmcol);
- /* XXX Same as above... For now, only weights preview in WPaint mode. */
- const bool do_mod_wmcol = do_init_wmcol;
-
- const bool do_loop_normals = (me->flag & ME_AUTOSMOOTH) != 0;
+ const bool do_loop_normals = (((Mesh *)ob->data)->flag & ME_AUTOSMOOTH) != 0;
VirtualModifierData virtualModifierData;
ModifierApplyFlag app_flags = useRenderParams ? MOD_APPLY_RENDER : 0;
ModifierApplyFlag deform_app_flags = app_flags;
- BLI_assert((me->id.tag & LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT) == 0);
+ BLI_assert((((Mesh *)ob->data)->id.tag & LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT) == 0);
if (useCache)
app_flags |= MOD_APPLY_USECACHE;
- if (allow_gpu)
- app_flags |= MOD_APPLY_ALLOW_GPU;
if (useDeform)
deform_app_flags |= MOD_APPLY_USECACHE;
@@ -2023,28 +1200,21 @@ static void mesh_calc_modifiers(
modifiers_clearErrors(ob);
- if (do_mod_wmcol || do_mod_mcol) {
+ if (do_mod_mcol) {
/* Find the last active modifier generating a preview, or NULL if none. */
/* XXX Currently, DPaint modifier just ignores this.
* Needs a stupid hack...
* The whole "modifier preview" thing has to be (re?)designed, anyway! */
previewmd = modifiers_getLastPreview(scene, md, required_mode);
-
- /* even if the modifier doesn't need the data, to make a preview it may */
- if (previewmd) {
- if (do_mod_wmcol) {
- previewmask = CD_MASK_MDEFORMVERT;
- }
- }
}
datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, previewmd, previewmask);
curr = datamasks;
- if (r_deform_mesh) {
- *r_deform_mesh = NULL;
+ if (r_deform) {
+ *r_deform = NULL;
}
- *r_final_mesh = NULL;
+ *r_final = NULL;
if (useDeform) {
if (inputVertexCos)
@@ -2064,9 +1234,9 @@ static void mesh_calc_modifiers(
if (mti->type == eModifierTypeType_OnlyDeform && !sculpt_dyntopo) {
if (!deformedVerts)
- deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
+ deformedVerts = BKE_mesh_vertexCos_get(ob->data, &numVerts);
- modifier_deformVerts_ensure_normals(md, &mectx_deform, NULL, deformedVerts, numVerts);
+ modwrap_deformVerts(md, &mectx_deform, NULL, deformedVerts, numVerts);
}
else {
break;
@@ -2081,17 +1251,17 @@ static void mesh_calc_modifiers(
* places that wish to use the original mesh but with deformed
* coordinates (vpaint, etc.)
*/
- if (r_deform_mesh) {
- *r_deform_mesh = BKE_mesh_copy_for_eval(me);
+ if (r_deform) {
+ *r_deform = BKE_mesh_copy_for_eval(ob->data, true);
/* XXX: Is build_shapekey_layers ever even true? This should have crashed long ago... */
BLI_assert(!build_shapekey_layers);
- UNUSED_VARS_NDEBUG(build_shapekey_layers);
- //if (build_shapekey_layers)
- // add_shapekey_layers(*r_deform_mesh, me, ob);
+ if (build_shapekey_layers) {
+ add_shapekey_layers(*r_deform, ob->data, ob);
+ }
if (deformedVerts) {
- BKE_mesh_apply_vert_coords(*r_deform_mesh, deformedVerts);
+ BKE_mesh_apply_vert_coords(*r_deform, deformedVerts);
}
}
}
@@ -2100,16 +1270,16 @@ static void mesh_calc_modifiers(
if (inputVertexCos)
deformedVerts = inputVertexCos;
else
- deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
+ deformedVerts = BKE_mesh_vertexCos_get(ob->data, &numVerts);
}
/* Now apply all remaining modifiers. If useDeform is off then skip
* OnlyDeform ones.
*/
- Mesh *mesh = NULL;
- Mesh *orco_mesh = NULL;
- Mesh *cloth_orco_mesh = NULL;
+ Mesh *me = NULL;
+ Mesh *me_orco = NULL;
+ Mesh *me_orco_cloth = NULL;
for (; md; md = md->next, curr = curr->next) {
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
@@ -2122,7 +1292,7 @@ static void mesh_calc_modifiers(
continue;
}
- if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && mesh) {
+ if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && me) {
modifier_setError(md, "Modifier requires original data, bad stack position");
continue;
}
@@ -2173,8 +1343,8 @@ static void mesh_calc_modifiers(
else
mask = 0;
- if (mesh && (mask & CD_MASK_ORCO)) {
- add_orco_mesh(ob, NULL, mesh, orco_mesh, CD_ORCO);
+ if (me && (mask & CD_MASK_ORCO)) {
+ add_orco_mesh(ob, NULL, me, me_orco, CD_ORCO);
}
/* How to apply modifier depends on (a) what we already have as
@@ -2185,15 +1355,15 @@ static void mesh_calc_modifiers(
if (mti->type == eModifierTypeType_OnlyDeform) {
/* No existing verts to deform, need to build them. */
if (!deformedVerts) {
- if (mesh) {
+ if (me) {
/* 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.
*/
- deformedVerts = BKE_mesh_vertexCos_get(mesh, &numVerts);
+ deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
}
else {
- deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
+ deformedVerts = BKE_mesh_vertexCos_get(ob->data, &numVerts);
}
}
@@ -2201,12 +1371,12 @@ static void mesh_calc_modifiers(
* to avoid giving bogus normals to the next modifier see: [#23673] */
if (isPrevDeform && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
/* XXX, this covers bug #23673, but we may need normal calc for other types */
- if (mesh) {
- BKE_mesh_apply_vert_coords(mesh, deformedVerts);
+ if (me) {
+ BKE_mesh_apply_vert_coords(me, deformedVerts);
}
}
- modifier_deformVerts_ensure_normals(md, &mectx_deform, mesh, deformedVerts, numVerts);
+ modwrap_deformVerts(md, &mectx_deform, me, deformedVerts, numVerts);
}
else {
/* determine which data layers are needed by following modifiers */
@@ -2216,26 +1386,23 @@ static void mesh_calc_modifiers(
nextmask = dataMask;
/* apply vertex coordinates or build a Mesh as necessary */
- if (mesh) {
+ if (me) {
if (deformedVerts) {
- BKE_mesh_apply_vert_coords(mesh, deformedVerts);
+ BKE_mesh_apply_vert_coords(me, deformedVerts);
}
}
else {
- mesh = BKE_mesh_copy_for_eval(me);
- ASSERT_IS_VALID_MESH(mesh);
+ me = BKE_mesh_copy_for_eval(ob->data, true);
+ ASSERT_IS_VALID_MESH(me);
- // XXX: port to Mesh if build_shapekey_layers can ever be true
- //if (build_shapekey_layers)
- // add_shapekey_layers(mesh, me, ob);
+ if (build_shapekey_layers) {
+ add_shapekey_layers(me, ob->data, ob);
+ }
if (deformedVerts) {
- BKE_mesh_apply_vert_coords(mesh, deformedVerts);
+ BKE_mesh_apply_vert_coords(me, deformedVerts);
}
- if (do_init_wmcol)
- mesh_update_weight_mcol(ob, mesh, draw_flag, NULL, 0, NULL);
-
/* Constructive modifiers need to have an origindex
* otherwise they wont have anywhere to copy the data from.
*
@@ -2245,14 +1412,14 @@ static void mesh_calc_modifiers(
*/
if (need_mapping || (nextmask & CD_MASK_ORIGINDEX)) {
/* calc */
- CustomData_add_layer(&mesh->vdata, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totvert);
- CustomData_add_layer(&mesh->edata, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totedge);
- CustomData_add_layer(&mesh->pdata, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totpoly);
+ CustomData_add_layer(&me->vdata, CD_ORIGINDEX, CD_CALLOC, NULL, me->totvert);
+ CustomData_add_layer(&me->edata, CD_ORIGINDEX, CD_CALLOC, NULL, me->totedge);
+ CustomData_add_layer(&me->pdata, CD_ORIGINDEX, CD_CALLOC, NULL, me->totpoly);
/* Not worth parallelizing this, gives less than 0.1% overall speedup in best of best cases... */
- range_vn_i(CustomData_get_layer(&mesh->vdata, CD_ORIGINDEX), mesh->totvert, 0);
- range_vn_i(CustomData_get_layer(&mesh->edata, CD_ORIGINDEX), mesh->totedge, 0);
- range_vn_i(CustomData_get_layer(&mesh->pdata, CD_ORIGINDEX), mesh->totpoly, 0);
+ range_vn_i(CustomData_get_layer(&me->vdata, CD_ORIGINDEX), me->totvert, 0);
+ range_vn_i(CustomData_get_layer(&me->edata, CD_ORIGINDEX), me->totedge, 0);
+ range_vn_i(CustomData_get_layer(&me->pdata, CD_ORIGINDEX), me->totpoly, 0);
}
}
@@ -2262,85 +1429,84 @@ static void mesh_calc_modifiers(
/* needMapping check here fixes bug [#28112], otherwise it's
* possible that it won't be copied */
mask |= append_mask;
- mesh_set_only_copy(mesh, mask | (need_mapping ? CD_MASK_ORIGINDEX : 0));
+ mesh_set_only_copy(me, mask | (need_mapping ? CD_MASK_ORIGINDEX : 0));
/* add cloth rest shape key if needed */
if (mask & CD_MASK_CLOTH_ORCO)
- add_orco_mesh(ob, NULL, mesh, orco_mesh, CD_CLOTH_ORCO);
+ add_orco_mesh(ob, NULL, me, me_orco, CD_CLOTH_ORCO);
/* add an origspace layer if needed */
if ((curr->mask) & CD_MASK_ORIGSPACE_MLOOP) {
- if (!CustomData_has_layer(&mesh->ldata, CD_ORIGSPACE_MLOOP)) {
- CustomData_add_layer(&mesh->ldata, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL, mesh->totloop);
- mesh_init_origspace(mesh);
+ if (!CustomData_has_layer(&me->ldata, CD_ORIGSPACE_MLOOP)) {
+ CustomData_add_layer(&me->ldata, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL, me->totloop);
+ mesh_init_origspace(me);
}
}
- Mesh *new_mesh = modifier_applyModifier_ensure_normals(md, &mectx_apply, mesh);
- ASSERT_IS_VALID_MESH(new_mesh);
+ Mesh *me_next = modwrap_applyModifier(md, &mectx_apply, me);
+ ASSERT_IS_VALID_MESH(me_next);
- if (new_mesh) {
+ if (me_next) {
/* if the modifier returned a new mesh, release the old one */
- if (mesh && mesh != new_mesh) {
- BLI_assert(mesh != me);
- BKE_id_free(NULL, mesh);
+ if (me && me != me_next) {
+ BLI_assert(me != ob->data);
+ BKE_id_free(NULL, me);
}
-
- mesh = new_mesh;
+ me = me_next;
if (deformedVerts) {
- if (deformedVerts != inputVertexCos)
+ if (deformedVerts != inputVertexCos) {
MEM_freeN(deformedVerts);
-
+ }
deformedVerts = NULL;
}
}
/* create an orco mesh in parallel */
if (nextmask & CD_MASK_ORCO) {
- if (!orco_mesh) {
- orco_mesh = create_orco_mesh(ob, me, NULL, CD_ORCO);
+ if (!me_orco) {
+ me_orco = create_orco_mesh(ob, ob->data, NULL, CD_ORCO);
}
nextmask &= ~CD_MASK_ORCO;
- mesh_set_only_copy(orco_mesh, nextmask | CD_MASK_ORIGINDEX |
+ mesh_set_only_copy(me_orco, nextmask | CD_MASK_ORIGINDEX |
(mti->requiredDataMask ?
mti->requiredDataMask(ob, md) : 0));
- new_mesh = modifier_applyModifier_ensure_normals(md, &mectx_orco, orco_mesh);
- ASSERT_IS_VALID_MESH(new_mesh);
+ me_next = modwrap_applyModifier(md, &mectx_orco, me_orco);
+ ASSERT_IS_VALID_MESH(me_next);
- if (new_mesh) {
+ if (me_next) {
/* if the modifier returned a new mesh, release the old one */
- if (orco_mesh && orco_mesh != new_mesh) {
- BLI_assert(orco_mesh != me);
- BKE_id_free(NULL, orco_mesh);
+ if (me_orco && me_orco != me_next) {
+ BLI_assert(me_orco != ob->data);
+ BKE_id_free(NULL, me_orco);
}
- orco_mesh = new_mesh;
+ me_orco = me_next;
}
}
/* create cloth orco mesh in parallel */
if (nextmask & CD_MASK_CLOTH_ORCO) {
- if (!cloth_orco_mesh) {
- cloth_orco_mesh = create_orco_mesh(ob, me, NULL, CD_CLOTH_ORCO);
+ if (!me_orco_cloth) {
+ me_orco_cloth = create_orco_mesh(ob, ob->data, NULL, CD_CLOTH_ORCO);
}
nextmask &= ~CD_MASK_CLOTH_ORCO;
- mesh_set_only_copy(cloth_orco_mesh, nextmask | CD_MASK_ORIGINDEX);
+ mesh_set_only_copy(me_orco_cloth, nextmask | CD_MASK_ORIGINDEX);
- new_mesh = modifier_applyModifier_ensure_normals(md, &mectx_orco, cloth_orco_mesh);
- ASSERT_IS_VALID_DM(new_mesh);
+ me_next = modwrap_applyModifier(md, &mectx_orco, me_orco_cloth);
+ ASSERT_IS_VALID_DM(me_next);
- if (new_mesh) {
+ if (me_next) {
/* if the modifier returned a new mesh, release the old one */
- if (cloth_orco_mesh && cloth_orco_mesh != new_mesh) {
- BLI_assert(orco_mesh != me);
- BKE_id_free(NULL, cloth_orco_mesh);
+ if (me_orco_cloth && me_orco_cloth != me_next) {
+ BLI_assert(me_orco != ob->data);
+ BKE_id_free(NULL, me_orco_cloth);
}
- cloth_orco_mesh = new_mesh;
+ me_orco_cloth = me_next;
}
}
@@ -2348,13 +1514,8 @@ static void mesh_calc_modifiers(
/* XXX Temp and hackish solution! */
if (md->type == eModifierType_DynamicPaint)
append_mask |= CD_MASK_PREVIEW_MLOOPCOL;
- /* In case of active preview modifier, make sure preview mask remains for following modifiers. */
- else if ((md == previewmd) && (do_mod_wmcol)) {
- mesh_update_weight_mcol(ob, mesh, draw_flag, NULL, 0, NULL);
- append_mask |= CD_MASK_PREVIEW_MLOOPCOL;
- }
- mesh->runtime.deformed_only = false;
+ me->runtime.deformed_only = false;
}
isPrevDeform = (mti->type == eModifierTypeType_OnlyDeform);
@@ -2375,55 +1536,43 @@ static void mesh_calc_modifiers(
* need to apply these back onto the Mesh. If we have no
* Mesh then we need to build one.
*/
- Mesh *final_mesh;
-
- if (mesh) {
- final_mesh = mesh;
+ if (me) {
+ *r_final = me;
if (deformedVerts) {
- BKE_mesh_apply_vert_coords(final_mesh, deformedVerts);
+ BKE_mesh_apply_vert_coords(*r_final, deformedVerts);
}
-
-#if 0 /* For later nice mod preview! */
- /* In case we need modified weights in CD_PREVIEW_MCOL, we have to re-compute it. */
- if (do_final_wmcol)
- mesh_update_weight_mcol(ob, final_mesh, draw_flag, NULL, 0, NULL);
-#endif
}
else {
- final_mesh = BKE_mesh_copy_for_eval(me);
+ *r_final = BKE_mesh_copy_for_eval(ob->data, true);
- //if (build_shapekey_layers) {
- // add_shapekey_layers(final_mesh, me, ob);
- //}
+ if (build_shapekey_layers) {
+ add_shapekey_layers(*r_final, ob->data, ob);
+ }
if (deformedVerts) {
- BKE_mesh_apply_vert_coords(final_mesh, deformedVerts);
+ BKE_mesh_apply_vert_coords(*r_final, deformedVerts);
}
-
- /* In this case, we should never have weight-modifying modifiers in stack... */
- if (do_init_wmcol)
- mesh_update_weight_mcol(ob, final_mesh, draw_flag, NULL, 0, NULL);
}
/* add an orco layer if needed */
if (dataMask & CD_MASK_ORCO) {
- add_orco_mesh(ob, NULL, final_mesh, orco_mesh, CD_ORCO);
+ add_orco_mesh(ob, NULL, *r_final, me_orco, CD_ORCO);
- if (r_deform_mesh && *r_deform_mesh)
- add_orco_mesh(ob, NULL, *r_deform_mesh, NULL, CD_ORCO);
+ if (r_deform && *r_deform)
+ add_orco_mesh(ob, NULL, *r_deform, NULL, CD_ORCO);
}
if (do_loop_normals) {
/* Compute loop normals (note: will compute poly and vert normals as well, if needed!) */
- BKE_mesh_calc_normals_split(final_mesh);
- BKE_mesh_tessface_clear(final_mesh);
+ BKE_mesh_calc_normals_split(*r_final);
+ BKE_mesh_tessface_clear(*r_final);
}
if (sculpt_dyntopo == false) {
/* watch this! after 2.75a we move to from tessface to looptri (by default) */
if (dataMask & CD_MASK_MFACE) {
- BKE_mesh_tessface_ensure(final_mesh);
+ BKE_mesh_tessface_ensure(*r_final);
}
/* without this, drawing ngon tri's faces will show ugly tessellated face
@@ -2436,23 +1585,21 @@ static void mesh_calc_modifiers(
* If using loop normals, poly nors have already been computed.
*/
if (!do_loop_normals) {
- mesh_ensure_display_normals(final_mesh);
+ BKE_mesh_ensure_normals_for_display(*r_final);
}
}
/* Some modifiers, like datatransfer, may generate those data as temp layer, we do not want to keep them,
* as they are used by display code when available (i.e. even if autosmooth is disabled). */
- if (!do_loop_normals && CustomData_has_layer(&final_mesh->ldata, CD_NORMAL)) {
- CustomData_free_layers(&final_mesh->ldata, CD_NORMAL, final_mesh->totloop);
+ if (!do_loop_normals && CustomData_has_layer(&(*r_final)->ldata, CD_NORMAL)) {
+ CustomData_free_layers(&(*r_final)->ldata, CD_NORMAL, (*r_final)->totloop);
}
- *r_final_mesh = final_mesh;
-
- if (orco_mesh) {
- BKE_id_free(NULL, orco_mesh);
+ if (me_orco) {
+ BKE_id_free(NULL, me_orco);
}
- if (cloth_orco_mesh) {
- BKE_id_free(NULL, cloth_orco_mesh);
+ if (me_orco_cloth) {
+ BKE_id_free(NULL, me_orco_cloth);
}
if (deformedVerts && deformedVerts != inputVertexCos)
@@ -2466,7 +1613,6 @@ static void mesh_calc_modifiers_dm(
int useDeform,
const bool need_mapping, CustomDataMask dataMask,
const int index, const bool useCache, const bool build_shapekey_layers,
- const bool allow_gpu,
/* return args */
DerivedMesh **r_deformdm, DerivedMesh **r_finaldm)
{
@@ -2474,7 +1620,7 @@ static void mesh_calc_modifiers_dm(
mesh_calc_modifiers(
depsgraph, scene, ob, inputVertexCos, useDeform,
- need_mapping, dataMask, index, useCache, build_shapekey_layers, allow_gpu,
+ need_mapping, dataMask, index, useCache, build_shapekey_layers,
(r_deformdm ? &deform_mesh : NULL), &final_mesh);
if (deform_mesh) {
@@ -2504,7 +1650,7 @@ float (*editbmesh_get_vertex_cos(BMEditMesh *em, int *r_numVerts))[3]
return cos;
}
-bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh *dm)
+bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, bool has_prev_mesh)
{
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
const int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
@@ -2513,7 +1659,7 @@ bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh *
return false;
}
- if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) {
+ if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && has_prev_mesh) {
modifier_setError(md, "Modifier requires original data, bad stack position");
return false;
}
@@ -2525,68 +1671,53 @@ static void editbmesh_calc_modifiers(
struct Depsgraph *depsgraph, Scene *scene, Object *ob,
BMEditMesh *em, CustomDataMask dataMask,
/* return args */
- DerivedMesh **r_cage, DerivedMesh **r_final)
+ Mesh **r_cage, Mesh **r_final)
{
- ModifierData *md, *previewmd = NULL;
+ ModifierData *md;
float (*deformedVerts)[3] = NULL;
- CustomDataMask mask = 0, previewmask = 0, append_mask = 0;
- DerivedMesh *dm = NULL, *orcodm = NULL;
+ CustomDataMask mask = 0, append_mask = 0;
int i, numVerts = 0, cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
CDMaskLink *datamasks, *curr;
const int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
- int draw_flag = dm_drawflag_calc(scene->toolsettings, ob->data);
-
- // const bool do_mod_mcol = true; // (ob->mode == OB_MODE_OBJECT);
-#if 0 /* XXX Will re-enable this when we have global mod stack options. */
- const bool do_final_wmcol = (scene->toolsettings->weights_preview == WP_WPREVIEW_FINAL) && do_wmcol;
-#endif
- const bool do_final_wmcol = false;
- const bool do_init_wmcol = ((((Mesh *)ob->data)->drawflag & ME_DRAWEIGHT) && !do_final_wmcol);
-
- const bool do_init_statvis = ((((Mesh *)ob->data)->drawflag & ME_DRAW_STATVIS) && !do_init_wmcol);
- const bool do_mod_wmcol = do_init_wmcol;
+ const bool do_init_statvis = false; /* FIXME: use V3D_OVERLAY_EDIT_STATVIS. */
VirtualModifierData virtualModifierData;
/* TODO(sybren): do we really need multiple objects, or shall we change the flags where needed? */
const ModifierEvalContext mectx = {depsgraph, ob, 0};
const ModifierEvalContext mectx_orco = {depsgraph, ob, MOD_APPLY_ORCO};
- const ModifierEvalContext mectx_cache_gpu = {depsgraph, ob, MOD_APPLY_USECACHE | MOD_APPLY_ALLOW_GPU};
+ const ModifierEvalContext mectx_cache = {depsgraph, ob, MOD_APPLY_USECACHE};
const bool do_loop_normals = (((Mesh *)(ob->data))->flag & ME_AUTOSMOOTH) != 0;
- const float loop_normals_split_angle = ((Mesh *)(ob->data))->smoothresh;
modifiers_clearErrors(ob);
if (r_cage && cageIndex == -1) {
- *r_cage = getEditDerivedBMesh(em, ob, dataMask, NULL);
+ *r_cage = BKE_mesh_from_editmesh_with_coords_thin_wrap(em, dataMask, NULL);
}
md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
/* copied from mesh_calc_modifiers */
- if (do_mod_wmcol) {
- previewmd = modifiers_getLastPreview(scene, md, required_mode);
- /* even if the modifier doesn't need the data, to make a preview it may */
- if (previewmd) {
- previewmask = CD_MASK_MDEFORMVERT;
- }
- }
-
- datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, previewmd, previewmask);
+ datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, NULL, 0);
curr = datamasks;
+
+ Mesh *me = NULL;
+ Mesh *me_orco = NULL;
+
for (i = 0; md; i++, md = md->next, curr = curr->next) {
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- if (!editbmesh_modifier_is_enabled(scene, md, dm)) {
+ if (!editbmesh_modifier_is_enabled(scene, md, me != NULL)) {
continue;
}
/* add an orco layer if needed by this modifier */
- if (dm && mti->requiredDataMask) {
+ if (me && mti->requiredDataMask) {
mask = mti->requiredDataMask(ob, md);
- if (mask & CD_MASK_ORCO)
- add_orco_dm(ob, em, dm, orcodm, CD_ORCO);
+ if (mask & CD_MASK_ORCO) {
+ add_orco_mesh(ob, em, me, me_orco, CD_ORCO);
+ }
}
/* How to apply modifier depends on (a) what we already have as
@@ -2597,80 +1728,71 @@ static void editbmesh_calc_modifiers(
if (mti->type == eModifierTypeType_OnlyDeform) {
/* No existing verts to deform, need to build them. */
if (!deformedVerts) {
- if (dm) {
+ if (me) {
/* Deforming a derived mesh, read the vertex locations
* out of the mesh and deform them. Once done with this
* run of deformers verts will be written back.
*/
- numVerts = dm->getNumVerts(dm);
- deformedVerts =
- MEM_malloc_arrayN(numVerts, sizeof(*deformedVerts), "dfmv");
- dm->getVertCos(dm, deformedVerts);
+ deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
}
else {
deformedVerts = editbmesh_get_vertex_cos(em, &numVerts);
}
}
- if (mti->deformVertsEM || mti->deformVertsEM_DM)
- modwrap_deformVertsEM(md, &mectx, em, dm, deformedVerts, numVerts);
+ if (mti->deformVertsEM)
+ modwrap_deformVertsEM(md, &mectx, em, me, deformedVerts, numVerts);
else
- modwrap_deformVerts(md, &mectx, dm, deformedVerts, numVerts);
+ modwrap_deformVerts(md, &mectx, me, deformedVerts, numVerts);
}
else {
- DerivedMesh *ndm;
+ Mesh *me_next;
/* apply vertex coordinates or build a DerivedMesh as necessary */
- if (dm) {
+ if (me) {
if (deformedVerts) {
- DerivedMesh *tdm = CDDM_copy(dm);
- if (!(r_cage && dm == *r_cage)) {
- dm->release(dm);
- }
- dm = tdm;
+ Mesh *me_temp = BKE_mesh_copy_for_eval(me, false);
- CDDM_apply_vert_coords(dm, deformedVerts);
+ if (!(r_cage && me == *r_cage)) {
+ BKE_id_free(NULL, me);
+ }
+ me = me_temp;
+ BKE_mesh_apply_vert_coords(me, deformedVerts);
}
- else if (r_cage && dm == *r_cage) {
- /* dm may be changed by this modifier, so we need to copy it */
- dm = CDDM_copy(dm);
+ else if (r_cage && me == *r_cage) {
+ /* 'me' may be changed by this modifier, so we need to copy it. */
+ me = BKE_mesh_copy_for_eval(me, false);
}
}
else {
- dm = CDDM_from_editbmesh(em, false, false);
- ASSERT_IS_VALID_DM(dm);
+ me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0);
+ ASSERT_IS_VALID_MESH(me);
if (deformedVerts) {
- CDDM_apply_vert_coords(dm, deformedVerts);
- }
-
- if (do_init_wmcol) {
- DM_update_weight_mcol(ob, dm, draw_flag, NULL, 0, NULL);
+ BKE_mesh_apply_vert_coords(me, deformedVerts);
}
}
/* create an orco derivedmesh in parallel */
mask = curr->mask;
if (mask & CD_MASK_ORCO) {
- if (!orcodm)
- orcodm = create_orco_dm(ob, ob->data, em, CD_ORCO);
+ if (!me_orco) {
+ me_orco = create_orco_mesh(ob, ob->data, em, CD_ORCO);
+ }
mask &= ~CD_MASK_ORCO;
- DM_set_only_copy(orcodm, mask | CD_MASK_ORIGINDEX);
+ mesh_set_only_copy(me_orco, mask | CD_MASK_ORIGINDEX);
- if (mti->applyModifierEM || mti->applyModifierEM_DM) {
- ndm = modwrap_applyModifierEM(md, &mectx_orco, em, orcodm);
- }
- else {
- ndm = modwrap_applyModifier(md, &mectx_orco, orcodm);
- }
- ASSERT_IS_VALID_DM(ndm);
+ me_next = modwrap_applyModifier(md, &mectx_orco, me_orco);
+ ASSERT_IS_VALID_MESH(me_next);
- if (ndm) {
+ if (me_next) {
/* if the modifier returned a new dm, release the old one */
- if (orcodm && orcodm != ndm) orcodm->release(orcodm);
- orcodm = ndm;
+ if (me_orco && me_orco != me_next) {
+ BKE_id_free(NULL, me_orco);
+ }
+ me_orco = me_next;
}
}
@@ -2678,58 +1800,48 @@ static void editbmesh_calc_modifiers(
mask |= append_mask;
mask = curr->mask; /* CD_MASK_ORCO may have been cleared above */
- DM_set_only_copy(dm, mask | CD_MASK_ORIGINDEX);
+ mesh_set_only_copy(me, mask | CD_MASK_ORIGINDEX);
if (mask & CD_MASK_ORIGSPACE_MLOOP) {
- if (!CustomData_has_layer(&dm->loopData, CD_ORIGSPACE_MLOOP)) {
- DM_add_loop_layer(dm, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL);
- DM_init_origspace(dm);
+ if (!CustomData_has_layer(&me->ldata, CD_ORIGSPACE_MLOOP)) {
+ CustomData_add_layer(&me->ldata, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL, me->totloop);
+ mesh_init_origspace(me);
}
}
- if (mti->applyModifierEM || mti->applyModifierEM_DM)
- ndm = modwrap_applyModifierEM(md, &mectx_cache_gpu, em, dm);
- else
- ndm = modwrap_applyModifier(md, &mectx_cache_gpu, dm);
- ASSERT_IS_VALID_DM(ndm);
-
- if (ndm) {
- if (dm && dm != ndm)
- dm->release(dm);
+ me_next = modwrap_applyModifier(md, &mectx_cache, me);
+ ASSERT_IS_VALID_MESH(me_next);
- dm = ndm;
+ if (me_next) {
+ if (me && me != me_next) {
+ BKE_id_free(NULL, me);
+ }
+ me = me_next;
if (deformedVerts) {
MEM_freeN(deformedVerts);
deformedVerts = NULL;
}
}
-
- dm->deformedOnly = false;
- }
-
- /* In case of active preview modifier, make sure preview mask remains for following modifiers. */
- if ((md == previewmd) && (do_mod_wmcol)) {
- DM_update_weight_mcol(ob, dm, draw_flag, NULL, 0, NULL);
- append_mask |= CD_MASK_PREVIEW_MLOOPCOL;
+ me->runtime.deformed_only = false;
}
if (r_cage && i == cageIndex) {
- if (dm && deformedVerts) {
- *r_cage = CDDM_copy(dm);
- CDDM_apply_vert_coords(*r_cage, deformedVerts);
+ if (me && deformedVerts) {
+ *r_cage = BKE_mesh_copy_for_eval(me, false);
+ BKE_mesh_apply_vert_coords(*r_cage, deformedVerts);
}
- else if (dm) {
- *r_cage = dm;
+ else if (me) {
+ *r_cage = me;
}
else {
- struct Mesh *mesh = ob->data;
- if (mesh->id.tag & LIB_TAG_COPIED_ON_WRITE) {
- BKE_mesh_runtime_ensure_edit_data(mesh);
- mesh->runtime.edit_data->vertexCos = MEM_dupallocN(deformedVerts);
+ Mesh *me_orig = ob->data;
+ if (me_orig->id.tag & LIB_TAG_COPIED_ON_WRITE) {
+ BKE_mesh_runtime_ensure_edit_data(me_orig);
+ me_orig->runtime.edit_data->vertexCos = MEM_dupallocN(deformedVerts);
}
- *r_cage = getEditDerivedBMesh(
- em, ob, mask,
+ *r_cage = BKE_mesh_from_editmesh_with_coords_thin_wrap(
+ em, mask,
deformedVerts ? MEM_dupallocN(deformedVerts) : NULL);
}
}
@@ -2741,52 +1853,44 @@ static void editbmesh_calc_modifiers(
* to apply these back onto the DerivedMesh. If we have no DerivedMesh
* then we need to build one.
*/
- if (dm && deformedVerts) {
- *r_final = CDDM_copy(dm);
+ if (me && deformedVerts) {
+ *r_final = BKE_mesh_copy_for_eval(me, false);
- if (!(r_cage && dm == *r_cage)) {
- dm->release(dm);
+ if (!(r_cage && me == *r_cage)) {
+ BKE_id_free(NULL, me);
}
-
- CDDM_apply_vert_coords(*r_final, deformedVerts);
+ BKE_mesh_apply_vert_coords(*r_final, deformedVerts);
}
- else if (dm) {
- *r_final = dm;
+ else if (me) {
+ *r_final = me;
}
else if (!deformedVerts && r_cage && *r_cage) {
/* cage should already have up to date normals */
*r_final = *r_cage;
/* In this case, we should never have weight-modifying modifiers in stack... */
- if (do_init_wmcol)
- DM_update_weight_mcol(ob, *r_final, draw_flag, NULL, 0, NULL);
- if (do_init_statvis)
- DM_update_statvis_color(scene, ob, *r_final);
+ if (do_init_statvis) {
+ editmesh_update_statvis_color(scene, ob);
+ }
}
else {
/* this is just a copy of the editmesh, no need to calc normals */
- struct Mesh *mesh = ob->data;
- if (mesh->id.tag & LIB_TAG_COPIED_ON_WRITE) {
- BKE_mesh_runtime_ensure_edit_data(mesh);
- if (mesh->runtime.edit_data->vertexCos != NULL)
- MEM_freeN((void *)mesh->runtime.edit_data->vertexCos);
- mesh->runtime.edit_data->vertexCos = MEM_dupallocN(deformedVerts);
- }
- *r_final = getEditDerivedBMesh(em, ob, dataMask, deformedVerts);
+ *r_final = BKE_mesh_from_editmesh_with_coords_thin_wrap(em, dataMask, deformedVerts);
deformedVerts = NULL;
/* In this case, we should never have weight-modifying modifiers in stack... */
- if (do_init_wmcol)
- DM_update_weight_mcol(ob, *r_final, draw_flag, NULL, 0, NULL);
- if (do_init_statvis)
- DM_update_statvis_color(scene, ob, *r_final);
+ if (do_init_statvis) {
+ editmesh_update_statvis_color(scene, ob);
+ }
}
if (do_loop_normals) {
/* Compute loop normals */
- DM_calc_loop_normals(*r_final, do_loop_normals, loop_normals_split_angle);
+ BKE_mesh_calc_normals_split(*r_final);
+ BKE_mesh_tessface_clear(*r_final);
if (r_cage && *r_cage && (*r_cage != *r_final)) {
- DM_calc_loop_normals(*r_cage, do_loop_normals, loop_normals_split_angle);
+ BKE_mesh_calc_normals_split(*r_cage);
+ BKE_mesh_tessface_clear(*r_cage);
}
}
@@ -2795,13 +1899,13 @@ static void editbmesh_calc_modifiers(
* check if the derived meshes are DM_TYPE_EDITBMESH before calling, this isn't essential
* but quiets annoying error messages since tessfaces wont be created. */
if (dataMask & CD_MASK_MFACE) {
- if ((*r_final)->type != DM_TYPE_EDITBMESH) {
- DM_ensure_tessface(*r_final);
+ if ((*r_final)->edit_btmesh == NULL) {
+ BKE_mesh_tessface_ensure(*r_final);
}
if (r_cage && *r_cage) {
- if ((*r_cage)->type != DM_TYPE_EDITBMESH) {
+ if ((*r_cage)->edit_btmesh == NULL) {
if (*r_cage != *r_final) {
- DM_ensure_tessface(*r_cage);
+ BKE_mesh_tessface_ensure(*r_cage);
}
}
}
@@ -2810,27 +1914,29 @@ static void editbmesh_calc_modifiers(
/* same as mesh_calc_modifiers (if using loop normals, poly nors have already been computed). */
if (!do_loop_normals) {
- dm_ensure_display_normals(*r_final);
+ BKE_mesh_ensure_normals_for_display(*r_final);
/* Some modifiers, like datatransfer, may generate those data, we do not want to keep them,
* as they are used by display code when available (i.e. even if autosmooth is disabled). */
- if (CustomData_has_layer(&(*r_final)->loopData, CD_NORMAL)) {
- CustomData_free_layers(&(*r_final)->loopData, CD_NORMAL, (*r_final)->numLoopData);
+ if (CustomData_has_layer(&(*r_final)->ldata, CD_NORMAL)) {
+ CustomData_free_layers(&(*r_final)->ldata, CD_NORMAL, (*r_final)->totloop);
}
- if (r_cage && CustomData_has_layer(&(*r_cage)->loopData, CD_NORMAL)) {
- CustomData_free_layers(&(*r_cage)->loopData, CD_NORMAL, (*r_cage)->numLoopData);
+ if (r_cage && CustomData_has_layer(&(*r_cage)->ldata, CD_NORMAL)) {
+ CustomData_free_layers(&(*r_cage)->ldata, CD_NORMAL, (*r_cage)->totloop);
}
}
/* add an orco layer if needed */
if (dataMask & CD_MASK_ORCO)
- add_orco_dm(ob, em, *r_final, orcodm, CD_ORCO);
+ add_orco_mesh(ob, em, *r_final, me_orco, CD_ORCO);
- if (orcodm)
- orcodm->release(orcodm);
+ if (me_orco) {
+ BKE_id_free(NULL, me_orco);
+ }
- if (deformedVerts)
+ if (deformedVerts) {
MEM_freeN(deformedVerts);
+ }
}
static void mesh_finalize_eval(Object *object)
@@ -2875,6 +1981,15 @@ static void mesh_finalize_eval(Object *object)
}
}
+static void mesh_build_extra_data(struct Depsgraph *depsgraph, Object *ob)
+{
+ uint32_t eval_flags = DEG_get_eval_flags_for_id(depsgraph, &ob->id);
+
+ if (eval_flags & DAG_EVAL_NEED_SHRINKWRAP_BOUNDARY) {
+ BKE_shrinkwrap_compute_boundary_data(ob->runtime.mesh_eval);
+ }
+}
+
static void mesh_build_data(
struct Depsgraph *depsgraph, Scene *scene, Object *ob, CustomDataMask dataMask,
const bool build_shapekey_layers, const bool need_mapping)
@@ -2886,18 +2001,15 @@ static void mesh_build_data(
mesh_calc_modifiers(
depsgraph, scene, ob, NULL, 1, need_mapping, dataMask, -1, true, build_shapekey_layers,
- true,
&ob->runtime.mesh_deform_eval, &ob->runtime.mesh_eval);
mesh_finalize_eval(ob);
+ /* TODO(campbell): remove these copies, they are expected in various places over the code. */
ob->derivedDeform = CDDM_from_mesh_ex(ob->runtime.mesh_deform_eval, CD_REFERENCE, CD_MASK_MESH);
ob->derivedFinal = CDDM_from_mesh_ex(ob->runtime.mesh_eval, CD_REFERENCE, CD_MASK_MESH);
- DM_set_object_boundbox(ob, ob->derivedFinal);
- /* TODO(sergey): Convert bounding box calculation to use mesh, then
- * we can skip this copy.
- */
+ BKE_object_boundbox_calc_from_mesh(ob, ob->runtime.mesh_eval);
BKE_mesh_texspace_copy_from_object(ob->runtime.mesh_eval, ob);
ob->derivedFinal->needsFree = 0;
@@ -2914,6 +2026,8 @@ static void mesh_build_data(
}
BLI_assert(!(ob->derivedFinal->dirty & DM_DIRTY_NORMALS));
+
+ mesh_build_extra_data(depsgraph, ob);
}
static void editbmesh_build_data(
@@ -2925,17 +2039,21 @@ static void editbmesh_build_data(
BKE_editmesh_free_derivedmesh(em);
+ Mesh *me_cage;
+ Mesh *me_final;
+
editbmesh_calc_modifiers(
depsgraph, scene, obedit, em, dataMask,
- &em->derivedCage, &em->derivedFinal);
+ &me_cage, &me_final);
+
+ em->mesh_eval_final = me_final;
+ em->mesh_eval_cage = me_cage;
- DM_set_object_boundbox(obedit, em->derivedFinal);
+ BKE_object_boundbox_calc_from_mesh(obedit, em->mesh_eval_final);
em->lastDataMask = dataMask;
- em->derivedFinal->needsFree = 0;
- em->derivedCage->needsFree = 0;
- BLI_assert(!(em->derivedFinal->dirty & DM_DIRTY_NORMALS));
+ BLI_assert(!(em->mesh_eval_final->runtime.cd_dirty_vert & DM_DIRTY_NORMALS));
}
static CustomDataMask object_get_datamask(const Depsgraph *depsgraph, Object *ob, bool *r_need_mapping)
@@ -2967,7 +2085,7 @@ static CustomDataMask object_get_datamask(const Depsgraph *depsgraph, Object *ob
}
if (ob->mode & OB_MODE_WEIGHT_PAINT) {
- mask |= CD_MASK_PREVIEW_MLOOPCOL;
+ mask |= CD_MASK_MDEFORMVERT;
}
if (ob->mode & OB_MODE_EDIT)
@@ -3077,12 +2195,25 @@ Mesh *mesh_get_eval_deform(struct Depsgraph *depsgraph, Scene *scene, Object *ob
}
+#ifdef USE_DERIVEDMESH
+/* Deprecated, use `mesh_create_eval_final_render` instead. */
DerivedMesh *mesh_create_derived_render(struct Depsgraph *depsgraph, Scene *scene, Object *ob, CustomDataMask dataMask)
{
DerivedMesh *final;
mesh_calc_modifiers_dm(
- depsgraph, scene, ob, NULL, 1, false, dataMask, -1, false, false, false,
+ depsgraph, scene, ob, NULL, 1, false, dataMask, -1, false, false,
+ NULL, &final);
+
+ return final;
+}
+#endif
+Mesh *mesh_create_eval_final_render(struct Depsgraph *depsgraph, Scene *scene, Object *ob, CustomDataMask dataMask)
+{
+ Mesh *final;
+
+ mesh_calc_modifiers(
+ depsgraph, scene, ob, NULL, 1, false, dataMask, -1, false, false,
NULL, &final);
return final;
@@ -3095,20 +2226,20 @@ DerivedMesh *mesh_create_derived_index_render(struct Depsgraph *depsgraph, Scene
DerivedMesh *final;
mesh_calc_modifiers_dm(
- depsgraph, scene, ob, NULL, 1, false, dataMask, index, false, false, false,
+ depsgraph, scene, ob, NULL, 1, false, dataMask, index, false, false,
NULL, &final);
return final;
}
#endif
-struct Mesh *mesh_create_eval_final_index_render(
+Mesh *mesh_create_eval_final_index_render(
struct Depsgraph *depsgraph, struct Scene *scene,
struct Object *ob, CustomDataMask dataMask, int index)
{
Mesh *final;
mesh_calc_modifiers(
- depsgraph, scene, ob, NULL, 1, false, dataMask, index, false, false, false,
+ depsgraph, scene, ob, NULL, 1, false, dataMask, index, false, false,
NULL, &final);
return final;
@@ -3129,7 +2260,7 @@ DerivedMesh *mesh_create_derived_view(
ob->transflag |= OB_NO_PSYS_UPDATE;
mesh_calc_modifiers_dm(
- depsgraph, scene, ob, NULL, 1, false, dataMask, -1, false, false, false,
+ depsgraph, scene, ob, NULL, 1, false, dataMask, -1, false, false,
NULL, &final);
ob->transflag &= ~OB_NO_PSYS_UPDATE;
@@ -3151,7 +2282,7 @@ Mesh *mesh_create_eval_final_view(
ob->transflag |= OB_NO_PSYS_UPDATE;
mesh_calc_modifiers(
- depsgraph, scene, ob, NULL, 1, false, dataMask, -1, false, false, false,
+ depsgraph, scene, ob, NULL, 1, false, dataMask, -1, false, false,
NULL, &final);
ob->transflag &= ~OB_NO_PSYS_UPDATE;
@@ -3166,7 +2297,7 @@ DerivedMesh *mesh_create_derived_no_deform(
DerivedMesh *final;
mesh_calc_modifiers_dm(
- depsgraph, scene, ob, vertCos, 0, false, dataMask, -1, false, false, false,
+ depsgraph, scene, ob, vertCos, 0, false, dataMask, -1, false, false,
NULL, &final);
return final;
@@ -3174,29 +2305,29 @@ DerivedMesh *mesh_create_derived_no_deform(
/***/
-DerivedMesh *editbmesh_get_derived_cage_and_final(
+Mesh *editbmesh_get_eval_cage_and_final(
struct Depsgraph *depsgraph, Scene *scene, Object *obedit, BMEditMesh *em,
CustomDataMask dataMask,
/* return args */
- DerivedMesh **r_final)
+ Mesh **r_final)
{
/* if there's no derived mesh or the last data mask used doesn't include
* the data we need, rebuild the derived mesh
*/
dataMask |= object_get_datamask(depsgraph, obedit, NULL);
- if (!em->derivedCage ||
+ if (!em->mesh_eval_cage ||
(em->lastDataMask & dataMask) != dataMask)
{
editbmesh_build_data(depsgraph, scene, obedit, em, dataMask);
}
- *r_final = em->derivedFinal;
- if (em->derivedFinal) { BLI_assert(!(em->derivedFinal->dirty & DM_DIRTY_NORMALS)); }
- return em->derivedCage;
+ *r_final = em->mesh_eval_final;
+ if (em->mesh_eval_final) { BLI_assert(!(em->mesh_eval_final->runtime.cd_dirty_vert & DM_DIRTY_NORMALS)); }
+ return em->mesh_eval_cage;
}
-DerivedMesh *editbmesh_get_derived_cage(
+Mesh *editbmesh_get_eval_cage(
struct Depsgraph *depsgraph, Scene *scene, Object *obedit, BMEditMesh *em,
CustomDataMask dataMask)
{
@@ -3205,45 +2336,17 @@ DerivedMesh *editbmesh_get_derived_cage(
*/
dataMask |= object_get_datamask(depsgraph, obedit, NULL);
- if (!em->derivedCage ||
+ if (!em->mesh_eval_cage ||
(em->lastDataMask & dataMask) != dataMask)
{
editbmesh_build_data(depsgraph, scene, obedit, em, dataMask);
}
- return em->derivedCage;
-}
-
-DerivedMesh *editbmesh_get_derived_base(Object *obedit, BMEditMesh *em, CustomDataMask data_mask)
-{
- return getEditDerivedBMesh(em, obedit, data_mask, NULL);
+ return em->mesh_eval_cage;
}
/***/
-/* get derived mesh from an object, using editbmesh if available. */
-DerivedMesh *object_get_derived_final(Object *ob, const bool for_render)
-{
- if (for_render) {
- /* TODO(sergey): use proper derived render here in the future. */
- return ob->derivedFinal;
- }
-
- /* only return the editmesh if its from this object because
- * we don't a mesh from another object's modifier stack: T43122 */
- if (ob->type == OB_MESH) {
- Mesh *me = ob->data;
- BMEditMesh *em = me->edit_btmesh;
- if (em && (em->ob == ob)) {
- DerivedMesh *dm = em->derivedFinal;
- return dm;
- }
- }
-
- return ob->derivedFinal;
-}
-
-
/* UNUSED */
#if 0
@@ -3325,20 +2428,20 @@ static void make_vertexcos__mapFunc(
}
}
-void mesh_get_mapped_verts_coords(DerivedMesh *dm, float (*r_cos)[3], const int totcos)
+void mesh_get_mapped_verts_coords(Mesh *me_eval, float (*r_cos)[3], const int totcos)
{
- if (dm->foreachMappedVert) {
+ if (me_eval->runtime.deformed_only == false) {
MappedUserData userData;
memset(r_cos, 0, sizeof(*r_cos) * totcos);
userData.vertexcos = r_cos;
userData.vertex_visit = BLI_BITMAP_NEW(totcos, "vertexcos flags");
- dm->foreachMappedVert(dm, make_vertexcos__mapFunc, &userData, DM_FOREACH_NOP);
+ BKE_mesh_foreach_mapped_vert(me_eval, make_vertexcos__mapFunc, &userData, MESH_FOREACH_NOP);
MEM_freeN(userData.vertex_visit);
}
else {
- int i;
- for (i = 0; i < totcos; i++) {
- dm->getVertCo(dm, i, r_cos[i]);
+ MVert *mv = me_eval->mvert;
+ for (int i = 0; i < totcos; i++, mv++) {
+ copy_v3_v3(r_cos[i], mv->co);
}
}
}
@@ -3376,22 +2479,6 @@ void DM_calc_loop_tangents(
&dm->tangent_mask);
}
-/* Set object's bounding box based on DerivedMesh min/max data */
-void DM_set_object_boundbox(Object *ob, DerivedMesh *dm)
-{
- float min[3], max[3];
-
- INIT_MINMAX(min, max);
- dm->getMinMax(dm, min, max);
-
- if (!ob->bb)
- ob->bb = MEM_callocN(sizeof(BoundBox), "DM-BoundBox");
-
- BKE_boundbox_init_from_minmax(ob->bb, min, max);
-
- ob->bb->flag &= ~BOUNDBOX_DIRTY;
-}
-
void DM_init_origspace(DerivedMesh *dm)
{
const float default_osf[4][2] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}};
@@ -3451,7 +2538,7 @@ void DM_init_origspace(DerivedMesh *dm)
scale[1] = 1e-9f;
invert_v2(scale);
- /* Finally, transform all vcos_2d into ((0, 0), (1, 1)) square and assing them as origspace. */
+ /* Finally, transform all vcos_2d into ((0, 0), (1, 1)) square and assign them as origspace. */
for (j = 0; j < mp->totloop; j++, lof++) {
add_v2_v2v2(lof->uv, vcos_2d[j], translate);
mul_v2_v2(lof->uv, scale);
@@ -3522,7 +2609,7 @@ static void mesh_init_origspace(Mesh *mesh)
scale[1] = 1e-9f;
invert_v2(scale);
- /* Finally, transform all vcos_2d into ((0, 0), (1, 1)) square and assing them as origspace. */
+ /* Finally, transform all vcos_2d into ((0, 0), (1, 1)) square and assign them as origspace. */
for (j = 0; j < mp->totloop; j++, lof++) {
add_v2_v2v2(lof->uv, vcos_2d[j], translate);
mul_v2_v2(lof->uv, scale);
@@ -3549,7 +2636,7 @@ static void dm_debug_info_layers(
for (type = 0; type < CD_NUMTYPES; type++) {
if (CustomData_has_layer(cd, type)) {
- /* note: doesnt account for multiple layers */
+ /* note: doesn't account for multiple layers */
const char *name = CustomData_layertype_name(type);
const int size = CustomData_sizeof(type);
const void *pt = getElemDataArray(dm, type);
@@ -3574,7 +2661,6 @@ char *DM_debug_info(DerivedMesh *dm)
BLI_dynstr_appendf(dynstr, " 'ptr': '%p',\n", (void *)dm);
switch (dm->type) {
case DM_TYPE_CDDM: tstr = "DM_TYPE_CDDM"; break;
- case DM_TYPE_EDITBMESH: tstr = "DM_TYPE_EDITMESH"; break;
case DM_TYPE_CCGDM: tstr = "DM_TYPE_CCGDM"; break;
default: tstr = "UNKNOWN"; break;
}
@@ -3673,84 +2759,3 @@ bool DM_is_valid(DerivedMesh *dm)
}
#endif /* NDEBUG */
-
-/* -------------------------------------------------------------------- */
-
-MVert *DM_get_vert_array(DerivedMesh *dm, bool *allocated)
-{
- CustomData *vert_data = dm->getVertDataLayout(dm);
- MVert *mvert = CustomData_get_layer(vert_data, CD_MVERT);
- *allocated = false;
-
- if (mvert == NULL) {
- mvert = MEM_malloc_arrayN(dm->getNumVerts(dm), sizeof(MVert), "dmvh vert data array");
- dm->copyVertArray(dm, mvert);
- *allocated = true;
- }
-
- return mvert;
-}
-
-MEdge *DM_get_edge_array(DerivedMesh *dm, bool *allocated)
-{
- CustomData *edge_data = dm->getEdgeDataLayout(dm);
- MEdge *medge = CustomData_get_layer(edge_data, CD_MEDGE);
- *allocated = false;
-
- if (medge == NULL) {
- medge = MEM_malloc_arrayN(dm->getNumEdges(dm), sizeof(MEdge), "dm medge data array");
- dm->copyEdgeArray(dm, medge);
- *allocated = true;
- }
-
- return medge;
-}
-
-MLoop *DM_get_loop_array(DerivedMesh *dm, bool *r_allocated)
-{
- CustomData *loop_data = dm->getLoopDataLayout(dm);
- MLoop *mloop = CustomData_get_layer(loop_data, CD_MLOOP);
- *r_allocated = false;
-
- if (mloop == NULL) {
- mloop = MEM_malloc_arrayN(dm->getNumLoops(dm), sizeof(MLoop), "dm loop data array");
- dm->copyLoopArray(dm, mloop);
- *r_allocated = true;
- }
-
- return mloop;
-}
-
-MPoly *DM_get_poly_array(DerivedMesh *dm, bool *r_allocated)
-{
- CustomData *poly_data = dm->getPolyDataLayout(dm);
- MPoly *mpoly = CustomData_get_layer(poly_data, CD_MPOLY);
- *r_allocated = false;
-
- if (mpoly == NULL) {
- mpoly = MEM_malloc_arrayN(dm->getNumPolys(dm), sizeof(MPoly), "dm poly data array");
- dm->copyPolyArray(dm, mpoly);
- *r_allocated = true;
- }
-
- return mpoly;
-}
-
-MFace *DM_get_tessface_array(DerivedMesh *dm, bool *r_allocated)
-{
- CustomData *tessface_data = dm->getTessFaceDataLayout(dm);
- MFace *mface = CustomData_get_layer(tessface_data, CD_MFACE);
- *r_allocated = false;
-
- if (mface == NULL) {
- int numTessFaces = dm->getNumTessFaces(dm);
-
- if (numTessFaces > 0) {
- mface = MEM_malloc_arrayN(numTessFaces, sizeof(MFace), "bvh mface data array");
- dm->copyTessFaceArray(dm, mface);
- *r_allocated = true;
- }
- }
-
- return mface;
-}
diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c
index 6f97187f1e3..115ed29818a 100644
--- a/source/blender/blenkernel/intern/action.c
+++ b/source/blender/blenkernel/intern/action.c
@@ -199,7 +199,7 @@ void set_active_action_group(bAction *act, bActionGroup *agrp, short select)
if (act == NULL)
return;
- /* Deactive all others */
+ /* Deactivate all others */
for (grp = act->groups.first; grp; grp = grp->next) {
if ((grp == agrp) && (select))
grp->flag |= AGRP_ACTIVE;
@@ -887,7 +887,6 @@ void BKE_pose_channel_copy_data(bPoseChannel *pchan, const bPoseChannel *pchan_f
pchan->iklinweight = pchan_from->iklinweight;
/* bbone settings (typically not animated) */
- pchan->bboneflag = pchan_from->bboneflag;
pchan->bbone_next = pchan_from->bbone_next;
pchan->bbone_prev = pchan_from->bbone_prev;
@@ -1356,7 +1355,6 @@ void BKE_pose_copyesult_pchan_result(bPoseChannel *pchanto, const bPoseChannel *
pchanto->rotmode = pchanfrom->rotmode;
pchanto->flag = pchanfrom->flag;
pchanto->protectflag = pchanfrom->protectflag;
- pchanto->bboneflag = pchanfrom->bboneflag;
}
/* both poses should be in sync */
@@ -1449,7 +1447,7 @@ void what_does_obaction(Object *ob, Object *workob, bPose *pose, bAction *act, c
RNA_id_pointer_create(&workob->id, &id_ptr);
/* execute action for this group only */
- animsys_evaluate_action_group(&id_ptr, act, agrp, NULL, cframe);
+ animsys_evaluate_action_group(&id_ptr, act, agrp, cframe);
}
else {
AnimData adt = {NULL};
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c
index 68f691e4b1c..89291b158b7 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -65,8 +65,8 @@
// XXX bad level call...
extern short compare_ak_cfraPtr(void *node, void *data);
-extern void agroup_to_keylist(struct AnimData *adt, struct bActionGroup *agrp, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
-extern void action_to_keylist(struct AnimData *adt, struct bAction *act, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+extern void agroup_to_keylist(struct AnimData *adt, struct bActionGroup *agrp, struct DLRBT_Tree *keys, int saction_flag);
+extern void action_to_keylist(struct AnimData *adt, struct bAction *act, struct DLRBT_Tree *keys, int saction_flag);
/* --------------------- */
/* forward declarations */
@@ -347,7 +347,6 @@ static void motionpaths_calc_bake_targets(ListBase *targets, int cframe)
/* for each target, check if it can be baked on the current frame */
for (mpt = targets->first; mpt; mpt = mpt->next) {
bMotionPath *mpath = mpt->mpath;
- bMotionPathVert *mpv;
/* current frame must be within the range the cache works for
* - is inclusive of the first frame, but not the last otherwise we get buffer overruns
@@ -357,7 +356,7 @@ static void motionpaths_calc_bake_targets(ListBase *targets, int cframe)
}
/* get the relevant cache vert to write to */
- mpv = mpath->points + (cframe - mpath->start_frame);
+ bMotionPathVert *mpv = mpath->points + (cframe - mpath->start_frame);
Object *ob_eval = mpt->ob_eval;
@@ -392,6 +391,25 @@ static void motionpaths_calc_bake_targets(ListBase *targets, int cframe)
if (BLI_dlrbTree_search_exact(&mpt->keys, compare_ak_cfraPtr, &mframe)) {
mpv->flag |= MOTIONPATH_VERT_KEY;
}
+
+ /* Incremental update on evaluated object if possible, for fast updating
+ * while dragging in transform. */
+ bMotionPath *mpath_eval = NULL;
+ if (mpt->pchan) {
+ mpath_eval = (pchan_eval) ? pchan_eval->mpath : NULL;
+ }
+ else {
+ mpath_eval = ob_eval->mpath;
+ }
+
+ if (mpath_eval && mpath_eval->length == mpath->length) {
+ bMotionPathVert *mpv_eval = mpath_eval->points + (cframe - mpath_eval->start_frame);
+ *mpv_eval = *mpv;
+
+ GPU_VERTBUF_DISCARD_SAFE(mpath_eval->points_vbo);
+ GPU_BATCH_DISCARD_SAFE(mpath_eval->batch_line);
+ GPU_BATCH_DISCARD_SAFE(mpath_eval->batch_points);
+ }
}
}
@@ -401,36 +419,49 @@ static void motionpaths_calc_bake_targets(ListBase *targets, int cframe)
* - recalc: whether we need to
*/
/* TODO: include reports pointer? */
- void animviz_calc_motionpaths(Depsgraph *depsgraph, Main *bmain, Scene *scene, ListBase *targets)
+void animviz_calc_motionpaths(Depsgraph *depsgraph,
+ Main *bmain,
+ Scene *scene,
+ ListBase *targets,
+ bool restore,
+ bool current_frame_only)
{
- MPathTarget *mpt;
- int sfra, efra;
- int cfra;
-
/* sanity check */
if (ELEM(NULL, targets, targets->first))
return;
- /* set frame values */
- cfra = CFRA;
- sfra = efra = cfra;
-
- /* TODO: this method could be improved...
+ /* Compute frame range to bake within.
+ * TODO: this method could be improved...
* 1) max range for standard baking
* 2) minimum range for recalc baking (i.e. between keyframes, but how?) */
- for (mpt = targets->first; mpt; mpt = mpt->next) {
+ int sfra = INT_MAX;
+ int efra = INT_MIN;
+
+ for (MPathTarget *mpt = targets->first; mpt; mpt = mpt->next) {
/* try to increase area to do (only as much as needed) */
sfra = MIN2(sfra, mpt->mpath->start_frame);
efra = MAX2(efra, mpt->mpath->end_frame);
}
- if (efra <= sfra) return;
+ if (efra <= sfra) {
+ return;
+ }
+
+ /* Limit frame range if we are updating just the current frame. */
+ /* set frame values */
+ int cfra = CFRA;
+ if (current_frame_only) {
+ if (cfra < sfra || cfra > efra) {
+ return;
+ }
+ sfra = efra = cfra;
+ }
/* get copies of objects/bones to get the calculated results from
* (for copy-on-write evaluation), so that we actually get some results
*/
// TODO: Create a copy of background depsgraph that only contain these entities, and only evaluates them..
- for (mpt = targets->first; mpt; mpt = mpt->next) {
+ for (MPathTarget *mpt = targets->first; mpt; mpt = mpt->next) {
mpt->ob_eval = DEG_get_evaluated_object(depsgraph, mpt->ob);
AnimData *adt = BKE_animdata_from_id(&mpt->ob_eval->id);
@@ -454,13 +485,11 @@ static void motionpaths_calc_bake_targets(ListBase *targets, int cframe)
bActionGroup *agrp = BKE_action_group_find_name(adt->action, mpt->pchan->name);
if (agrp) {
- agroup_to_keylist(adt, agrp, &mpt->keys, NULL);
- BLI_dlrbTree_linkedlist_sync(&mpt->keys);
+ agroup_to_keylist(adt, agrp, &mpt->keys, 0);
}
}
else {
- action_to_keylist(adt, adt->action, &mpt->keys, NULL);
- BLI_dlrbTree_linkedlist_sync(&mpt->keys);
+ action_to_keylist(adt, adt->action, &mpt->keys, 0);
}
}
}
@@ -468,23 +497,30 @@ static void motionpaths_calc_bake_targets(ListBase *targets, int cframe)
/* calculate path over requested range */
printf("Calculating MotionPaths between frames %d - %d (%d frames)\n", sfra, efra, efra - sfra + 1);
for (CFRA = sfra; CFRA <= efra; CFRA++) {
- /* update relevant data for new frame */
- motionpaths_calc_update_scene(bmain, depsgraph);
+ if (current_frame_only) {
+ /* For current frame, only update tagged. */
+ BKE_scene_graph_update_tagged(depsgraph, bmain);
+ }
+ else {
+ /* Update relevant data for new frame. */
+ motionpaths_calc_update_scene(bmain, depsgraph);
+ }
/* perform baking for targets */
motionpaths_calc_bake_targets(targets, CFRA);
}
/* reset original environment */
- /* NOTE: We shouldn't need to reevaluate the main scene,
- * as the depsgraph passed in calculates the results on a
- * a copy-on-write copy of the data. That said, we have to
- * restore the current frame settings
- */
+ /* NOTE: We don't always need to reevaluate the main scene, as the depsgraph
+ * may be a temporary one that works on a subset of the data. We always have
+ * to resoture the current frame though. */
CFRA = cfra;
+ if (!current_frame_only && restore) {
+ motionpaths_calc_update_scene(bmain, depsgraph);
+ }
/* clear recalc flags from targets */
- for (mpt = targets->first; mpt; mpt = mpt->next) {
+ for (MPathTarget *mpt = targets->first; mpt; mpt = mpt->next) {
bAnimVizSettings *avs;
bMotionPath *mpath = mpt->mpath;
@@ -690,7 +726,7 @@ int where_on_path(Object *ob, float ctime, float vec[4], float dir[3], float qua
s1 = (int)floor(ctime);
fac = (float)(s1 + 1) - ctime;
- /* path->len is corected for cyclic */
+ /* path->len is corrected for cyclic */
s0 = interval_test(0, path->len - 1 - cycl, s1 - 1, cycl);
s1 = interval_test(0, path->len - 1 - cycl, s1, cycl);
s2 = interval_test(0, path->len - 1 - cycl, s1 + 1, cycl);
diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c
index b02b6b6ce15..d4355546c19 100644
--- a/source/blender/blenkernel/intern/anim_sys.c
+++ b/source/blender/blenkernel/intern/anim_sys.c
@@ -57,15 +57,15 @@
#include "DNA_texture_types.h"
#include "DNA_world_types.h"
-#include "BKE_animsys.h"
#include "BKE_action.h"
+#include "BKE_animsys.h"
#include "BKE_context.h"
#include "BKE_fcurve.h"
-#include "BKE_nla.h"
#include "BKE_global.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_material.h"
-#include "BKE_library.h"
+#include "BKE_nla.h"
#include "BKE_report.h"
#include "BKE_texture.h"
@@ -246,7 +246,7 @@ void BKE_animdata_free(ID *id, const bool do_id_user)
}
/* free nla data */
- BKE_nla_tracks_free(&adt->nla_tracks);
+ BKE_nla_tracks_free(&adt->nla_tracks, do_id_user);
/* free drivers - stored as a list of F-Curves */
free_fcurves(&adt->drivers);
@@ -266,11 +266,18 @@ void BKE_animdata_free(ID *id, const bool do_id_user)
/* Copying -------------------------------------------- */
-/* Make a copy of the given AnimData - to be used when copying datablocks */
-AnimData *BKE_animdata_copy(Main *bmain, AnimData *adt, const bool do_action, const bool do_id_user)
+/**
+ * Make a copy of the given AnimData - to be used when copying datablocks.
+ * \param flag Control ID pointers management, see LIB_ID_CREATE_.../LIB_ID_COPY_... flags in BKE_library.h
+ * \return The copied animdata.
+ */
+AnimData *BKE_animdata_copy(Main *bmain, AnimData *adt, const int flag)
{
AnimData *dadt;
+ const bool do_action = (flag & LIB_ID_COPY_ACTIONS) != 0 && (flag & LIB_ID_CREATE_NO_MAIN) == 0;
+ const bool do_id_user = (flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0;
+
/* sanity check before duplicating struct */
if (adt == NULL)
return NULL;
@@ -288,7 +295,7 @@ AnimData *BKE_animdata_copy(Main *bmain, AnimData *adt, const bool do_action, co
}
/* duplicate NLA data */
- BKE_nla_tracks_copy(bmain, &dadt->nla_tracks, &adt->nla_tracks);
+ BKE_nla_tracks_copy(bmain, &dadt->nla_tracks, &adt->nla_tracks, flag);
/* duplicate drivers (F-Curves) */
copy_fcurves(&dadt->drivers, &adt->drivers);
@@ -301,19 +308,23 @@ AnimData *BKE_animdata_copy(Main *bmain, AnimData *adt, const bool do_action, co
return dadt;
}
-bool BKE_animdata_copy_id(Main *bmain, ID *id_to, ID *id_from, const bool do_action, const bool do_id_user)
+/**
+ * \param flag Control ID pointers management, see LIB_ID_CREATE_.../LIB_ID_COPY_... flags in BKE_library.h
+ * \return true is succesfully copied.
+ */
+bool BKE_animdata_copy_id(Main *bmain, ID *id_to, ID *id_from, const int flag)
{
AnimData *adt;
if ((id_to && id_from) && (GS(id_to->name) != GS(id_from->name)))
return false;
- BKE_animdata_free(id_to, do_id_user);
+ BKE_animdata_free(id_to, (flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0);
adt = BKE_animdata_from_id(id_from);
if (adt) {
IdAdtTemplate *iat = (IdAdtTemplate *)id_to;
- iat->adt = BKE_animdata_copy(bmain, adt, do_action, do_id_user);
+ iat->adt = BKE_animdata_copy(bmain, adt, flag);
}
return true;
@@ -373,7 +384,7 @@ void BKE_animdata_merge_copy(
if (src->nla_tracks.first) {
ListBase tracks = {NULL, NULL};
- BKE_nla_tracks_copy(bmain, &tracks, &src->nla_tracks);
+ BKE_nla_tracks_copy(bmain, &tracks, &src->nla_tracks, 0);
BLI_movelisttolist(&dst->nla_tracks, &tracks);
}
@@ -1457,42 +1468,14 @@ void BKE_keyingsets_free(ListBase *list)
/* ***************************************** */
/* Evaluation Data-Setting Backend */
-/* Retrieve string to act as RNA-path, adjusted using mapping-table if provided
- * It returns whether the string needs to be freed (i.e. if it was a temp remapped one)
- * // FIXME: maybe it would be faster if we didn't have to alloc/free strings like this all the time, but for now it's safer
- *
- * - remap: remapping table to use
- * - path: original path string (as stored in F-Curve data)
- * - dst: destination string to write data to
- */
-static bool animsys_remap_path(AnimMapper *UNUSED(remap), char *path, char **dst)
-{
- /* is there a valid remapping table to use? */
-#if 0
- if (remap) {
- /* find a matching entry... to use to remap */
- /* ...TODO... */
- }
-#endif
-
- /* nothing suitable found, so just set dst to look at path (i.e. no alloc/free needed) */
- *dst = path;
- return false;
-}
-
static bool animsys_store_rna_setting(
- PointerRNA *ptr, AnimMapper *remap,
+ PointerRNA *ptr,
/* typically 'fcu->rna_path', 'fcu->array_index' */
const char *rna_path, const int array_index,
PathResolvedRNA *r_result)
{
bool success = false;
-
- char *path = NULL;
- bool free_path;
-
- /* get path, remapped as appropriate to work in its new environment */
- free_path = animsys_remap_path(remap, (char *)rna_path, &path);
+ const char *path = rna_path;
/* write value to setting */
if (path) {
@@ -1526,11 +1509,6 @@ static bool animsys_store_rna_setting(
}
}
- /* free temp path-info */
- if (free_path) {
- MEM_freeN((void *)path);
- }
-
return success;
}
@@ -1670,37 +1648,17 @@ static bool animsys_write_rna_setting(PathResolvedRNA *anim_rna, const float val
return false;
}
- /* RNA property update disabled for now - [#28525] [#28690] [#28774] [#28777] */
-#if 0
- /* buffer property update for later flushing */
- if (written && RNA_property_update_check(prop)) {
- short skip_updates_hack = 0;
-
- /* optimization hacks: skip property updates for those properties
- * for we know that which the updates in RNA were really just for
- * flushing property editing via UI/Py
- */
- if (new_ptr.type == &RNA_PoseBone) {
- /* bone transforms - update pose (i.e. tag depsgraph) */
- skip_updates_hack = 1;
- }
-
- if (skip_updates_hack == 0)
- RNA_property_update_cache_add(ptr, prop);
- }
-#endif
-
/* successful */
return true;
}
/* Simple replacement based data-setting of the FCurve using RNA */
-bool BKE_animsys_execute_fcurve(PointerRNA *ptr, AnimMapper *remap, FCurve *fcu, float curval)
+bool BKE_animsys_execute_fcurve(PointerRNA *ptr, FCurve *fcu, float curval)
{
PathResolvedRNA anim_rna;
bool ok = false;
- if (animsys_store_rna_setting(ptr, remap, fcu->rna_path, fcu->array_index, &anim_rna)) {
+ if (animsys_store_rna_setting(ptr, fcu->rna_path, fcu->array_index, &anim_rna)) {
ok = animsys_write_rna_setting(&anim_rna, curval);
}
@@ -1710,17 +1668,24 @@ bool BKE_animsys_execute_fcurve(PointerRNA *ptr, AnimMapper *remap, FCurve *fcu,
static void animsys_write_orig_anim_rna(
PointerRNA *ptr,
- AnimMapper *remap,
- FCurve *fcu,
+ const char *rna_path,
+ int array_index,
float value)
{
- /* Pointer is expected to be an ID pointer, if it's not -- we are doomed. */
+ /* Pointer is expected to be an ID pointer, if it's not -- we are doomed.
+ *
+ * NOTE: It is possible to have animation data on NLA strip, see T57360.
+ * TODO(sergey): Find solution for those cases.
+ */
+ if (ptr->id.data == NULL) {
+ return;
+ }
PointerRNA orig_ptr = *ptr;
orig_ptr.id.data = ((ID *)orig_ptr.id.data)->orig_id;
orig_ptr.data = orig_ptr.id.data;
PathResolvedRNA orig_anim_rna;
/* TODO(sergey): Is there a faster way to get anim_rna of original ID? */
- if (animsys_store_rna_setting(&orig_ptr, remap, fcu->rna_path, fcu->array_index, &orig_anim_rna)) {
+ if (animsys_store_rna_setting(&orig_ptr, rna_path, array_index, &orig_anim_rna)) {
animsys_write_rna_setting(&orig_anim_rna, value);
}
}
@@ -1729,7 +1694,7 @@ static void animsys_write_orig_anim_rna(
* This performs a set of standard checks. If extra checks are required, separate code should be used
*/
static void animsys_evaluate_fcurves(
- Depsgraph *depsgraph, PointerRNA *ptr, ListBase *list, AnimMapper *remap, float ctime)
+ Depsgraph *depsgraph, PointerRNA *ptr, ListBase *list, float ctime)
{
const bool is_active_depsgraph = DEG_is_active(depsgraph);
/* Calculate then execute each curve. */
@@ -1743,11 +1708,11 @@ static void animsys_evaluate_fcurves(
continue;
}
PathResolvedRNA anim_rna;
- if (animsys_store_rna_setting(ptr, remap, fcu->rna_path, fcu->array_index, &anim_rna)) {
+ if (animsys_store_rna_setting(ptr, fcu->rna_path, fcu->array_index, &anim_rna)) {
const float curval = calculate_fcurve(&anim_rna, fcu, ctime);
animsys_write_rna_setting(&anim_rna, curval);
if (is_active_depsgraph) {
- animsys_write_orig_anim_rna(ptr, remap, fcu, curval);
+ animsys_write_orig_anim_rna(ptr, fcu->rna_path, fcu->array_index, curval);
}
}
}
@@ -1778,7 +1743,7 @@ static void animsys_evaluate_drivers(PointerRNA *ptr, AnimData *adt, float ctime
* new to only be done when drivers only changed */
PathResolvedRNA anim_rna;
- if (animsys_store_rna_setting(ptr, NULL, fcu->rna_path, fcu->array_index, &anim_rna)) {
+ if (animsys_store_rna_setting(ptr, fcu->rna_path, fcu->array_index, &anim_rna)) {
const float curval = calculate_fcurve(&anim_rna, fcu, ctime);
ok = animsys_write_rna_setting(&anim_rna, curval);
}
@@ -1831,13 +1796,12 @@ static void action_idcode_patch_check(ID *id, bAction *act)
/* ----------------------------------------- */
/* Evaluate Action Group */
-void animsys_evaluate_action_group(PointerRNA *ptr, bAction *act, bActionGroup *agrp, AnimMapper *remap, float ctime)
+void animsys_evaluate_action_group(PointerRNA *ptr, bAction *act, bActionGroup *agrp, float ctime)
{
FCurve *fcu;
/* check if mapper is appropriate for use here (we set to NULL if it's inappropriate) */
if (ELEM(NULL, act, agrp)) return;
- if ((remap) && (remap->target != act)) remap = NULL;
action_idcode_patch_check(ptr->id.data, act);
@@ -1850,7 +1814,7 @@ void animsys_evaluate_action_group(PointerRNA *ptr, bAction *act, bActionGroup *
/* check if this curve should be skipped */
if ((fcu->flag & (FCURVE_MUTED | FCURVE_DISABLED)) == 0) {
PathResolvedRNA anim_rna;
- if (animsys_store_rna_setting(ptr, remap, fcu->rna_path, fcu->array_index, &anim_rna)) {
+ if (animsys_store_rna_setting(ptr, fcu->rna_path, fcu->array_index, &anim_rna)) {
const float curval = calculate_fcurve(&anim_rna, fcu, ctime);
animsys_write_rna_setting(&anim_rna, curval);
}
@@ -1860,21 +1824,20 @@ void animsys_evaluate_action_group(PointerRNA *ptr, bAction *act, bActionGroup *
/* Evaluate Action (F-Curve Bag) */
static void animsys_evaluate_action_ex(
- Depsgraph *depsgraph, PointerRNA *ptr, bAction *act, AnimMapper *remap, float ctime)
+ Depsgraph *depsgraph, PointerRNA *ptr, bAction *act, float ctime)
{
/* check if mapper is appropriate for use here (we set to NULL if it's inappropriate) */
if (act == NULL) return;
- if ((remap) && (remap->target != act)) remap = NULL;
action_idcode_patch_check(ptr->id.data, act);
/* calculate then execute each curve */
- animsys_evaluate_fcurves(depsgraph, ptr, &act->curves, remap, ctime);
+ animsys_evaluate_fcurves(depsgraph, ptr, &act->curves, ctime);
}
-void animsys_evaluate_action(Depsgraph *depsgraph, PointerRNA *ptr, bAction *act, AnimMapper *remap, float ctime)
+void animsys_evaluate_action(Depsgraph *depsgraph, PointerRNA *ptr, bAction *act, float ctime)
{
- animsys_evaluate_action_ex(depsgraph, ptr, act, remap, ctime);
+ animsys_evaluate_action_ex(depsgraph, ptr, act, ctime);
}
/* ***************************************** */
@@ -1913,7 +1876,7 @@ static void nlastrip_evaluate_controls(Depsgraph *depsgraph, NlaStrip *strip, fl
RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &strip_ptr);
/* execute these settings as per normal */
- animsys_evaluate_fcurves(depsgraph, &strip_ptr, &strip->fcurves, NULL, ctime);
+ animsys_evaluate_fcurves(depsgraph, &strip_ptr, &strip->fcurves, ctime);
}
/* analytically generate values for influence and time (if applicable)
@@ -2055,7 +2018,7 @@ NlaEvalStrip *nlastrips_ctime_get_strip(Depsgraph *depsgraph, ListBase *list, Li
/* find an NlaEvalChannel that matches the given criteria
* - ptr and prop are the RNA data to find a match for
*/
-static NlaEvalChannel *nlaevalchan_find_match(ListBase *channels, PointerRNA *ptr, PropertyRNA *prop, int array_index)
+static NlaEvalChannel *nlaevalchan_find_match(ListBase *channels, const PathResolvedRNA *prna)
{
NlaEvalChannel *nec;
@@ -2070,7 +2033,7 @@ static NlaEvalChannel *nlaevalchan_find_match(ListBase *channels, PointerRNA *pt
* other data stored in PointerRNA cannot allow us to definitively
* identify the data
*/
- if ((nec->ptr.data == ptr->data) && (nec->prop == prop) && (nec->index == array_index))
+ if ((nec->rna.ptr.data == prna->ptr.data) && (nec->rna.prop == prna->prop) && ELEM(nec->rna.prop_index, -1, prna->prop_index))
return nec;
}
@@ -2079,11 +2042,11 @@ static NlaEvalChannel *nlaevalchan_find_match(ListBase *channels, PointerRNA *pt
}
/* initialise default value for NlaEvalChannel, so that it doesn't blend things wrong */
-static void nlaevalchan_value_init(NlaEvalChannel *nec)
+static float nlaevalchan_init_value(PathResolvedRNA *rna)
{
- PointerRNA *ptr = &nec->ptr;
- PropertyRNA *prop = nec->prop;
- int index = nec->index;
+ PointerRNA *ptr = &rna->ptr;
+ PropertyRNA *prop = rna->prop;
+ int index = rna->prop_index;
/* NOTE: while this doesn't work for all RNA properties as default values aren't in fact
* set properly for most of them, at least the common ones (which also happen to get used
@@ -2092,61 +2055,43 @@ static void nlaevalchan_value_init(NlaEvalChannel *nec)
switch (RNA_property_type(prop)) {
case PROP_BOOLEAN:
if (RNA_property_array_check(prop))
- nec->value = (float)RNA_property_boolean_get_default_index(ptr, prop, index);
+ return (float)RNA_property_boolean_get_default_index(ptr, prop, index);
else
- nec->value = (float)RNA_property_boolean_get_default(ptr, prop);
- break;
+ return (float)RNA_property_boolean_get_default(ptr, prop);
case PROP_INT:
if (RNA_property_array_check(prop))
- nec->value = (float)RNA_property_int_get_default_index(ptr, prop, index);
+ return (float)RNA_property_int_get_default_index(ptr, prop, index);
else
- nec->value = (float)RNA_property_int_get_default(ptr, prop);
- break;
+ return (float)RNA_property_int_get_default(ptr, prop);
case PROP_FLOAT:
if (RNA_property_array_check(prop))
- nec->value = RNA_property_float_get_default_index(ptr, prop, index);
+ return RNA_property_float_get_default_index(ptr, prop, index);
else
- nec->value = RNA_property_float_get_default(ptr, prop);
- break;
+ return RNA_property_float_get_default(ptr, prop);
case PROP_ENUM:
- nec->value = (float)RNA_property_enum_get_default(ptr, prop);
- break;
+ return (float)RNA_property_enum_get_default(ptr, prop);
default:
- break;
+ return 0.0f;
}
}
/* verify that an appropriate NlaEvalChannel for this F-Curve exists */
-static NlaEvalChannel *nlaevalchan_verify(PointerRNA *ptr, ListBase *channels, NlaEvalStrip *nes, FCurve *fcu, bool *newChan)
+static NlaEvalChannel *nlaevalchan_verify(PointerRNA *ptr, ListBase *channels, FCurve *fcu, bool *newChan)
{
NlaEvalChannel *nec;
- NlaStrip *strip = nes->strip;
- PropertyRNA *prop;
- PointerRNA new_ptr;
- char *path = NULL;
- /* short free_path = 0; */
+ PathResolvedRNA rna;
/* sanity checks */
if (channels == NULL)
return NULL;
/* get RNA pointer+property info from F-Curve for more convenient handling */
- /* get path, remapped as appropriate to work in its new environment */
- /* free_path = */ /* UNUSED */ animsys_remap_path(strip->remap, fcu->rna_path, &path);
-
- /* a valid property must be available, and it must be animatable */
- if (RNA_path_resolve_property(ptr, path, &new_ptr, &prop) == false) {
- if (G.debug & G_DEBUG) printf("NLA Strip Eval: Cannot resolve path\n");
- return NULL;
- }
- /* only ok if animatable */
- else if (RNA_property_animateable(&new_ptr, prop) == 0) {
- if (G.debug & G_DEBUG) printf("NLA Strip Eval: Property not animatable\n");
+ if (!animsys_store_rna_setting(ptr, fcu->rna_path, fcu->array_index, &rna)) {
return NULL;
}
/* try to find a match */
- nec = nlaevalchan_find_match(channels, &new_ptr, prop, fcu->array_index);
+ nec = nlaevalchan_find_match(channels, &rna);
/* allocate a new struct for this if none found */
if (nec == NULL) {
@@ -2154,12 +2099,13 @@ static NlaEvalChannel *nlaevalchan_verify(PointerRNA *ptr, ListBase *channels, N
BLI_addtail(channels, nec);
/* store property links for writing to the property later */
- nec->ptr = new_ptr;
- nec->prop = prop;
- nec->index = fcu->array_index;
+ nec->rna = rna;
+
+ /* store parameters for use with write_orig_anim_rna */
+ nec->rna_path = fcu->rna_path;
/* initialise value using default value of property [#35856] */
- nlaevalchan_value_init(nec);
+ nec->value = nlaevalchan_init_value(&rna);
*newChan = true;
}
else
@@ -2238,7 +2184,7 @@ static void nlaevalchan_buffers_accumulate(ListBase *channels, ListBase *tmp_buf
necn = nec->next;
/* try to find an existing matching channel for this setting in the accumulation buffer */
- necd = nlaevalchan_find_match(channels, &nec->ptr, nec->prop, nec->index);
+ necd = nlaevalchan_find_match(channels, &nec->rna);
/* if there was a matching channel already in the buffer, accumulate to it,
* otherwise, add the current channel to the buffer for efficiency
@@ -2365,7 +2311,7 @@ static void nlastrip_evaluate_actionclip(PointerRNA *ptr, ListBase *channels, Li
/* 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
*/
- nec = nlaevalchan_verify(ptr, channels, nes, fcu, &newChan);
+ nec = nlaevalchan_verify(ptr, channels, fcu, &newChan);
if (nec)
nlaevalchan_accumulate(nec, nes, value, newChan);
}
@@ -2506,7 +2452,7 @@ void nlastrip_evaluate(Depsgraph *depsgraph, PointerRNA *ptr, ListBase *channels
}
/* write the accumulated settings to */
-void nladata_flush_channels(ListBase *channels)
+void nladata_flush_channels(Depsgraph *depsgraph, PointerRNA *ptr, ListBase *channels)
{
NlaEvalChannel *nec;
@@ -2514,39 +2460,13 @@ void nladata_flush_channels(ListBase *channels)
if (channels == NULL)
return;
+ const bool is_active_depsgraph = DEG_is_active(depsgraph);
+
/* for each channel with accumulated values, write its value on the property it affects */
for (nec = channels->first; nec; nec = nec->next) {
- PointerRNA *ptr = &nec->ptr;
- PropertyRNA *prop = nec->prop;
- int array_index = nec->index;
- float value = nec->value;
-
- /* write values - see animsys_write_rna_setting() to sync the code */
- switch (RNA_property_type(prop)) {
- case PROP_BOOLEAN:
- if (RNA_property_array_check(prop))
- RNA_property_boolean_set_index(ptr, prop, array_index, ANIMSYS_FLOAT_AS_BOOL(value));
- else
- RNA_property_boolean_set(ptr, prop, ANIMSYS_FLOAT_AS_BOOL(value));
- break;
- case PROP_INT:
- if (RNA_property_array_check(prop))
- RNA_property_int_set_index(ptr, prop, array_index, (int)value);
- else
- RNA_property_int_set(ptr, prop, (int)value);
- break;
- case PROP_FLOAT:
- if (RNA_property_array_check(prop))
- RNA_property_float_set_index(ptr, prop, array_index, value);
- else
- RNA_property_float_set(ptr, prop, value);
- break;
- case PROP_ENUM:
- RNA_property_enum_set(ptr, prop, (int)value);
- break;
- default:
- /* can't do anything with other types of property.... */
- break;
+ animsys_write_rna_setting(&nec->rna, nec->value);
+ if (is_active_depsgraph) {
+ animsys_write_orig_anim_rna(ptr, nec->rna_path, nec->rna.prop_index, nec->value);
}
}
}
@@ -2623,7 +2543,6 @@ static void animsys_evaluate_nla(Depsgraph *depsgraph, ListBase *echannels, Poin
else {
/* set settings of dummy NLA strip from AnimData settings */
dummy_strip.act = adt->action;
- dummy_strip.remap = adt->remap;
/* 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);
@@ -2646,7 +2565,7 @@ static void animsys_evaluate_nla(Depsgraph *depsgraph, ListBase *echannels, Poin
/* TODO: this is really just a stop-gap measure... */
if (G.debug & G_DEBUG) printf("NLA Eval: Stopgap for active action on NLA Stack - no strips case\n");
- animsys_evaluate_action(depsgraph, ptr, adt->action, adt->remap, ctime);
+ animsys_evaluate_action(depsgraph, ptr, adt->action, ctime);
BLI_freelistN(&estrips);
return;
}
@@ -2680,7 +2599,7 @@ static void animsys_calculate_nla(Depsgraph *depsgraph, PointerRNA *ptr, AnimDat
animsys_evaluate_nla(depsgraph, &echannels, ptr, adt, ctime);
/* flush effects of accumulating channels in NLA to the actual data they affect */
- nladata_flush_channels(&echannels);
+ nladata_flush_channels(depsgraph, ptr, &echannels);
/* free temp data */
BLI_freelistN(&echannels);
@@ -2689,19 +2608,6 @@ static void animsys_calculate_nla(Depsgraph *depsgraph, PointerRNA *ptr, AnimDat
/* ***************************************** */
/* Overrides System - Public API */
-/* Clear all overrides */
-
-/* Add or get existing Override for given setting */
-#if 0
-AnimOverride *BKE_animsys_validate_override(PointerRNA *UNUSED(ptr), char *UNUSED(path), int UNUSED(array_index))
-{
- /* FIXME: need to define how to get overrides */
- return NULL;
-}
-#endif
-
-/* -------------------- */
-
/* Evaluate Overrides */
static void animsys_evaluate_overrides(PointerRNA *ptr, AnimData *adt)
{
@@ -2710,7 +2616,7 @@ static void animsys_evaluate_overrides(PointerRNA *ptr, AnimData *adt)
/* for each override, simply execute... */
for (aor = adt->overrides.first; aor; aor = aor->next) {
PathResolvedRNA anim_rna;
- if (animsys_store_rna_setting(ptr, NULL, aor->rna_path, aor->array_index, &anim_rna)) {
+ if (animsys_store_rna_setting(ptr, aor->rna_path, aor->array_index, &anim_rna)) {
animsys_write_rna_setting(&anim_rna, aor->value);
}
}
@@ -2782,7 +2688,7 @@ void BKE_animsys_evaluate_animdata(Depsgraph *depsgraph, Scene *scene, ID *id, A
}
/* evaluate Active Action only */
else if (adt->action)
- animsys_evaluate_action_ex(depsgraph, &id_ptr, adt->action, adt->remap, ctime);
+ animsys_evaluate_action_ex(depsgraph, &id_ptr, adt->action, ctime);
/* reset tag */
adt->recalc &= ~ADT_RECALC_ANIM;
@@ -3024,12 +2930,12 @@ void BKE_animsys_eval_driver(Depsgraph *depsgraph,
//printf("\told val = %f\n", fcu->curval);
PathResolvedRNA anim_rna;
- if (animsys_store_rna_setting(&id_ptr, NULL, fcu->rna_path, fcu->array_index, &anim_rna)) {
+ if (animsys_store_rna_setting(&id_ptr, fcu->rna_path, fcu->array_index, &anim_rna)) {
const float ctime = DEG_get_ctime(depsgraph);
const float curval = evaluate_fcurve_driver(&anim_rna, fcu, driver_orig, ctime);
ok = animsys_write_rna_setting(&anim_rna, curval);
if (ok && DEG_is_active(depsgraph)) {
- animsys_write_orig_anim_rna(&id_ptr, NULL, fcu, curval);
+ animsys_write_orig_anim_rna(&id_ptr, fcu->rna_path, fcu->array_index, curval);
}
}
diff --git a/source/blender/blenkernel/intern/appdir.c b/source/blender/blenkernel/intern/appdir.c
index ccff6216cb3..2848c245553 100644
--- a/source/blender/blenkernel/intern/appdir.c
+++ b/source/blender/blenkernel/intern/appdir.c
@@ -28,9 +28,11 @@
#include <stdio.h>
#include "BLI_utildefines.h"
-#include "BLI_string.h"
#include "BLI_fileops.h"
+#include "BLI_fileops_types.h"
+#include "BLI_listbase.h"
#include "BLI_path_util.h"
+#include "BLI_string.h"
#include "BKE_blender_version.h"
#include "BKE_appdir.h" /* own include */
@@ -69,12 +71,12 @@ static char btempdir_session[FILE_MAX] = ""; /* volatile temporary directory */
const char *BKE_appdir_folder_default(void)
{
#ifndef WIN32
- const char * const xdg_documents_dir = getenv("XDG_DOCUMENTS_DIR");
+ const char * const xdg_documents_dir = BLI_getenv("XDG_DOCUMENTS_DIR");
if (xdg_documents_dir)
return xdg_documents_dir;
- return getenv("HOME");
+ return BLI_getenv("HOME");
#else /* Windows */
static char documentfolder[MAXPATHLEN];
HRESULT hResult;
@@ -159,7 +161,7 @@ static bool test_path(
*/
static bool test_env_path(char *path, const char *envvar)
{
- const char *env = envvar ? getenv(envvar) : NULL;
+ const char *env = envvar ? BLI_getenv(envvar) : NULL;
if (!env) return false;
if (BLI_is_dir(env)) {
@@ -237,19 +239,51 @@ static bool is_portable_install(void)
}
/**
+ * Returns the path of a folder from environment variables
+ *
+ * \param targetpath: String to return path.
+ * \param subfolder_name: optional name of subfolder within folder.
+ * \param envvar: name of environment variable to check folder_name.
+ * \return true if it was able to construct such a path.
+ */
+static bool get_path_environment(
+ char *targetpath,
+ size_t targetpath_len,
+ const char *subfolder_name,
+ const char *envvar)
+{
+ char user_path[FILE_MAX];
+
+ if (test_env_path(user_path, envvar)) {
+ if (subfolder_name) {
+ return test_path(
+ targetpath,
+ targetpath_len,
+ user_path,
+ NULL,
+ subfolder_name);
+ }
+ else {
+ BLI_strncpy(targetpath, user_path, FILE_MAX);
+ return true;
+ }
+ }
+ return false;
+}
+
+/**
* Returns the path of a folder within the user-files area.
*
*
* \param targetpath String to return path
* \param folder_name default name of folder within user area
* \param subfolder_name optional name of subfolder within folder
- * \param envvar name of environment variable which, if defined, overrides folder_name
- * \param ver Blender version, used to construct a subdirectory name
+ * \param ver Blender version, used to construct a subdirectory name
* \return true if it was able to construct such a path.
*/
static bool get_path_user(
char *targetpath, size_t targetpath_len, const char *folder_name, const char *subfolder_name,
- const char *envvar, const int ver)
+ const int ver)
{
char user_path[FILE_MAX];
const char *user_base_path;
@@ -260,16 +294,6 @@ static bool get_path_user(
}
user_path[0] = '\0';
- if (test_env_path(user_path, envvar)) {
- if (subfolder_name) {
- return test_path(targetpath, targetpath_len, user_path, NULL, subfolder_name);
- }
- else {
- BLI_strncpy(targetpath, user_path, FILE_MAX);
- return true;
- }
- }
-
user_base_path = (const char *)GHOST_getUserDir(ver, blender_version_decimal(ver));
if (user_base_path)
BLI_strncpy(user_path, user_base_path, FILE_MAX);
@@ -295,13 +319,12 @@ static bool get_path_user(
* \param targetpath String to return path
* \param folder_name default name of folder within installation area
* \param subfolder_name optional name of subfolder within folder
- * \param envvar name of environment variable which, if defined, overrides folder_name
* \param ver Blender version, used to construct a subdirectory name
* \return true if it was able to construct such a path.
*/
static bool get_path_system(
char *targetpath, size_t targetpath_len, const char *folder_name, const char *subfolder_name,
- const char *envvar, const int ver)
+ const int ver)
{
char system_path[FILE_MAX];
const char *system_base_path;
@@ -320,17 +343,6 @@ static bool get_path_system(
}
system_path[0] = '\0';
-
- if (test_env_path(system_path, envvar)) {
- if (subfolder_name) {
- return test_path(targetpath, targetpath_len, system_path, NULL, subfolder_name);
- }
- else {
- BLI_strncpy(targetpath, system_path, FILE_MAX);
- return true;
- }
- }
-
system_base_path = (const char *)GHOST_getSystemDir(ver, blender_version_decimal(ver));
if (system_base_path)
BLI_strncpy(system_path, system_base_path, FILE_MAX);
@@ -367,40 +379,49 @@ const char *BKE_appdir_folder_id_ex(
switch (folder_id) {
case BLENDER_DATAFILES: /* general case */
- if (get_path_user(path, path_len, "datafiles", subfolder, "BLENDER_USER_DATAFILES", ver)) break;
+ if (get_path_environment(path, path_len, subfolder, "BLENDER_USER_DATAFILES")) break;
+ if (get_path_user(path, path_len, "datafiles", subfolder, ver)) break;
+ if (get_path_environment(path, path_len, subfolder, "BLENDER_SYSTEM_DATAFILES")) break;
if (get_path_local(path, path_len, "datafiles", subfolder, ver)) break;
- if (get_path_system(path, path_len, "datafiles", subfolder, "BLENDER_SYSTEM_DATAFILES", ver)) break;
+ if (get_path_system(path, path_len, "datafiles", subfolder, ver)) break;
return NULL;
case BLENDER_USER_DATAFILES:
- if (get_path_user(path, path_len, "datafiles", subfolder, "BLENDER_USER_DATAFILES", ver)) break;
+ if (get_path_environment(path, path_len, subfolder, "BLENDER_USER_DATAFILES")) break;
+ if (get_path_user(path, path_len, "datafiles", subfolder, ver)) break;
return NULL;
case BLENDER_SYSTEM_DATAFILES:
+ if (get_path_environment(path, path_len, subfolder, "BLENDER_SYSTEM_DATAFILES")) break;
+ if (get_path_system(path, path_len, "datafiles", subfolder, ver)) break;
if (get_path_local(path, path_len, "datafiles", subfolder, ver)) break;
- if (get_path_system(path, path_len, "datafiles", subfolder, "BLENDER_SYSTEM_DATAFILES", ver)) break;
return NULL;
case BLENDER_USER_AUTOSAVE:
- if (get_path_user(path, path_len, "autosave", subfolder, "BLENDER_USER_DATAFILES", ver)) break;
+ if (get_path_environment(path, path_len, subfolder, "BLENDER_USER_DATAFILES")) break;
+ if (get_path_user(path, path_len, "autosave", subfolder, ver)) break;
return NULL;
case BLENDER_USER_CONFIG:
- if (get_path_user(path, path_len, "config", subfolder, "BLENDER_USER_CONFIG", ver)) break;
+ if (get_path_environment(path, path_len, subfolder, "BLENDER_USER_CONFIG")) break;
+ if (get_path_user(path, path_len, "config", subfolder, ver)) break;
return NULL;
case BLENDER_USER_SCRIPTS:
- if (get_path_user(path, path_len, "scripts", subfolder, "BLENDER_USER_SCRIPTS", ver)) break;
+ if (get_path_environment(path, path_len, subfolder, "BLENDER_USER_SCRIPTS")) break;
+ if (get_path_user(path, path_len, "scripts", subfolder, ver)) break;
return NULL;
case BLENDER_SYSTEM_SCRIPTS:
+ if (get_path_environment(path, path_len, subfolder, "BLENDER_SYSTEM_SCRIPTS")) break;
+ if (get_path_system(path, path_len, "scripts", subfolder, ver)) break;
if (get_path_local(path, path_len, "scripts", subfolder, ver)) break;
- if (get_path_system(path, path_len, "scripts", subfolder, "BLENDER_SYSTEM_SCRIPTS", ver)) break;
return NULL;
case BLENDER_SYSTEM_PYTHON:
+ if (get_path_environment(path, path_len, subfolder, "BLENDER_SYSTEM_PYTHON")) break;
+ if (get_path_system(path, path_len, "python", subfolder, ver)) break;
if (get_path_local(path, path_len, "python", subfolder, ver)) break;
- if (get_path_system(path, path_len, "python", subfolder, "BLENDER_SYSTEM_PYTHON", ver)) break;
return NULL;
default:
@@ -428,16 +449,20 @@ const char *BKE_appdir_folder_id_user_notest(const int folder_id, const char *su
switch (folder_id) {
case BLENDER_USER_DATAFILES:
- get_path_user(path, sizeof(path), "datafiles", subfolder, "BLENDER_USER_DATAFILES", ver);
+ if (get_path_environment(path, sizeof(path), subfolder, "BLENDER_USER_DATAFILES")) break;
+ get_path_user(path, sizeof(path), "datafiles", subfolder, ver);
break;
case BLENDER_USER_CONFIG:
- get_path_user(path, sizeof(path), "config", subfolder, "BLENDER_USER_CONFIG", ver);
+ if (get_path_environment(path, sizeof(path), subfolder, "BLENDER_USER_CONFIG")) break;
+ get_path_user(path, sizeof(path), "config", subfolder, ver);
break;
case BLENDER_USER_AUTOSAVE:
- get_path_user(path, sizeof(path), "autosave", subfolder, "BLENDER_USER_AUTOSAVE", ver);
+ if (get_path_environment(path, sizeof(path), subfolder, "BLENDER_USER_AUTOSAVE")) break;
+ get_path_user(path, sizeof(path), "autosave", subfolder, ver);
break;
case BLENDER_USER_SCRIPTS:
- get_path_user(path, sizeof(path), "scripts", subfolder, "BLENDER_USER_SCRIPTS", ver);
+ if (get_path_environment(path, sizeof(path), subfolder, "BLENDER_USER_SCRIPTS")) break;
+ get_path_user(path, sizeof(path), "scripts", subfolder, ver);
break;
default:
BLI_assert(0);
@@ -481,13 +506,13 @@ const char *BKE_appdir_folder_id_version(const int folder_id, const int ver, con
bool ok;
switch (folder_id) {
case BLENDER_RESOURCE_PATH_USER:
- ok = get_path_user(path, sizeof(path), NULL, NULL, NULL, ver);
+ ok = get_path_user(path, sizeof(path), NULL, NULL, ver);
break;
case BLENDER_RESOURCE_PATH_LOCAL:
ok = get_path_local(path, sizeof(path), NULL, NULL, ver);
break;
case BLENDER_RESOURCE_PATH_SYSTEM:
- ok = get_path_system(path, sizeof(path), NULL, NULL, NULL, ver);
+ ok = get_path_system(path, sizeof(path), NULL, NULL, ver);
break;
default:
path[0] = '\0'; /* in case do_check is false */
@@ -715,6 +740,32 @@ bool BKE_appdir_app_template_id_search(const char *app_template, char *path, siz
return false;
}
+void BKE_appdir_app_templates(ListBase *templates)
+{
+ BLI_listbase_clear(templates);
+
+ for (int i = 0; i < 2; i++) {
+ char subdir[FILE_MAX];
+ if (!BKE_appdir_folder_id_ex(
+ app_template_directory_id[i], app_template_directory_search[i],
+ subdir, sizeof(subdir)))
+ {
+ continue;
+ }
+
+ struct direntry *dir;
+ uint totfile = BLI_filelist_dir_contents(subdir, &dir);
+ for (int f = 0; f < totfile; f++) {
+ if (!FILENAME_IS_CURRPAR(dir[f].relname) && S_ISDIR(dir[f].type)) {
+ char *template = BLI_strdup(dir[f].relname);
+ BLI_addtail(templates, BLI_genericNodeN(template));
+ }
+ }
+
+ BLI_filelist_free(dir, totfile);
+ }
+}
+
/**
* Gets the temp directory when blender first runs.
* If the default path is not found, use try $TEMP
@@ -743,7 +794,7 @@ static void where_is_temp(char *fullname, char *basename, const size_t maxlen, c
#ifdef WIN32
if (fullname[0] == '\0') {
- const char *tmp = getenv("TEMP"); /* Windows */
+ const char *tmp = BLI_getenv("TEMP"); /* Windows */
if (tmp && BLI_is_dir(tmp)) {
BLI_strncpy(fullname, tmp, maxlen);
}
@@ -751,14 +802,14 @@ static void where_is_temp(char *fullname, char *basename, const size_t maxlen, c
#else
/* Other OS's - Try TMP and TMPDIR */
if (fullname[0] == '\0') {
- const char *tmp = getenv("TMP");
+ const char *tmp = BLI_getenv("TMP");
if (tmp && BLI_is_dir(tmp)) {
BLI_strncpy(fullname, tmp, maxlen);
}
}
if (fullname[0] == '\0') {
- const char *tmp = getenv("TMPDIR");
+ const char *tmp = BLI_getenv("TMPDIR");
if (tmp && BLI_is_dir(tmp)) {
BLI_strncpy(fullname, tmp, maxlen);
}
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index a3f7dbe70be..fa5b59b739d 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -393,7 +393,7 @@ int bone_autoside_name(char name[MAXBONENAME], int UNUSED(strip_number), short a
/* ************* B-Bone support ******************* */
/* data has MAX_BBONE_SUBDIV+1 interpolated points, will become desired amount with equal distances */
-void equalize_bbone_bezier(float *data, int desired)
+static void equalize_bbone_bezier(float *data, int desired)
{
float *fp, totdist, ddist, dist, fac1, fac2;
float pdist[MAX_BBONE_SUBDIV + 1];
@@ -433,174 +433,276 @@ void equalize_bbone_bezier(float *data, int desired)
copy_qt_qt(fp, temp[MAX_BBONE_SUBDIV]);
}
-/* get "next" and "prev" bones - these are used for handle calculations */
+/* Get "next" and "prev" bones - these are used for handle calculations. */
void BKE_pchan_get_bbone_handles(bPoseChannel *pchan, bPoseChannel **r_prev, bPoseChannel **r_next)
{
- if (pchan->bboneflag & PCHAN_BBONE_CUSTOM_HANDLES) {
- /* use the provided bones as the next/prev - leave blank to eliminate this effect altogether */
- *r_prev = pchan->bbone_prev;
- *r_next = pchan->bbone_next;
- }
- else {
- /* evaluate next and prev bones */
- if (pchan->bone->flag & BONE_CONNECTED)
+ if (pchan->bone->bbone_prev_type == BBONE_HANDLE_AUTO) {
+ /* Use connected parent. */
+ if (pchan->bone->flag & BONE_CONNECTED) {
*r_prev = pchan->parent;
- else
+ }
+ else {
*r_prev = NULL;
+ }
+ }
+ else {
+ /* Use the provided bone as prev - leave blank to eliminate this effect altogether. */
+ *r_prev = pchan->bbone_prev;
+ }
+ if (pchan->bone->bbone_next_type == BBONE_HANDLE_AUTO) {
+ /* Use connected child. */
*r_next = pchan->child;
}
+ else {
+ /* Use the provided bone as next - leave blank to eliminate this effect altogether. */
+ *r_next = pchan->bbone_next;
+ }
}
-/* returns pointer to static array, filled with desired amount of bone->segments elements */
-/* this calculation is done within unit bone space */
-void b_bone_spline_setup(bPoseChannel *pchan, int rest, Mat4 result_array[MAX_BBONE_SUBDIV])
+/* Fills the array with the desired amount of bone->segments elements.
+ * This calculation is done within unit bone space. */
+void b_bone_spline_setup(bPoseChannel *pchan, const bool rest, Mat4 result_array[MAX_BBONE_SUBDIV])
{
bPoseChannel *next, *prev;
Bone *bone = pchan->bone;
- float h1[3], h2[3], scale[3], length, roll1 = 0.0f, roll2;
- float mat3[3][3], imat[4][4], posemat[4][4], scalemat[4][4], iscalemat[4][4];
- float data[MAX_BBONE_SUBDIV + 1][4], *fp;
- int a;
- bool do_scale = false;
+ BBoneSplineParameters param;
+ float imat[4][4], posemat[4][4];
+ float delta[3];
+
+ memset(&param, 0, sizeof(param));
- length = bone->length;
+ param.segments = bone->segments;
+ param.length = bone->length;
if (!rest) {
- /* check if we need to take non-uniform bone scaling into account */
+ float scale[3];
+
+ /* Check if we need to take non-uniform bone scaling into account. */
mat4_to_size(scale, pchan->pose_mat);
if (fabsf(scale[0] - scale[1]) > 1e-6f || fabsf(scale[1] - scale[2]) > 1e-6f) {
- size_to_mat4(scalemat, scale);
- invert_m4_m4(iscalemat, scalemat);
-
- length *= scale[1];
- do_scale = 1;
+ param.do_scale = true;
+ copy_v3_v3(param.scale, scale);
}
}
BKE_pchan_get_bbone_handles(pchan, &prev, &next);
- /* find the handle points, since this is inside bone space, the
+ /* Find the handle points, since this is inside bone space, the
* first point = (0, 0, 0)
* last point = (0, length, 0) */
if (rest) {
invert_m4_m4(imat, pchan->bone->arm_mat);
}
- else if (do_scale) {
+ else if (param.do_scale) {
copy_m4_m4(posemat, pchan->pose_mat);
normalize_m4(posemat);
invert_m4_m4(imat, posemat);
}
- else
+ else {
invert_m4_m4(imat, pchan->pose_mat);
+ }
if (prev) {
- float difmat[4][4], result[3][3], imat3[3][3];
+ float h1[3];
+ bool done = false;
- /* transform previous point inside this bone space */
- if ((pchan->bboneflag & PCHAN_BBONE_CUSTOM_HANDLES) &&
- (pchan->bboneflag & PCHAN_BBONE_CUSTOM_START_REL))
- {
- /* Use delta movement (from restpose), and apply this relative to the current bone's head */
+ param.use_prev = true;
+
+ /* Transform previous point inside this bone space. */
+ if (bone->bbone_prev_type == BBONE_HANDLE_RELATIVE) {
+ /* Use delta movement (from restpose), and apply this relative to the current bone's head. */
if (rest) {
- /* in restpose, arm_head == pose_head */
- h1[0] = h1[1] = h1[2] = 0.0f;
+ /* In restpose, arm_head == pose_head */
+ zero_v3(param.prev_h);
+ done = true;
}
else {
- float delta[3];
sub_v3_v3v3(delta, prev->pose_head, prev->bone->arm_head);
sub_v3_v3v3(h1, pchan->pose_head, delta);
}
}
- else {
- /* Use bone head as absolute position */
- if (rest)
- copy_v3_v3(h1, prev->bone->arm_head);
- else
- copy_v3_v3(h1, prev->pose_head);
+ else if (bone->bbone_prev_type == BBONE_HANDLE_TANGENT) {
+ /* Use bone direction by offsetting so that its tail meets current bone's head */
+ if (rest) {
+ sub_v3_v3v3(delta, prev->bone->arm_tail, prev->bone->arm_head);
+ sub_v3_v3v3(h1, bone->arm_head, delta);
+ }
+ else {
+ sub_v3_v3v3(delta, prev->pose_tail, prev->pose_head);
+ sub_v3_v3v3(h1, pchan->pose_head, delta);
+ }
}
- mul_m4_v3(imat, h1);
+ else {
+ /* Apply special handling for smoothly joining B-Bone chains */
+ param.prev_bbone = (prev->bone->segments > 1);
- if (prev->bone->segments > 1) {
- /* if previous bone is B-bone too, use average handle direction */
- h1[1] -= length;
- roll1 = 0.0f;
+ /* Use bone head as absolute position. */
+ copy_v3_v3(h1, rest ? prev->bone->arm_head : prev->pose_head);
}
- normalize_v3(h1);
- negate_v3(h1);
-
- if (prev->bone->segments == 1) {
- /* find the previous roll to interpolate */
- if (rest)
- mul_m4_m4m4(difmat, imat, prev->bone->arm_mat);
- else
- mul_m4_m4m4(difmat, imat, prev->pose_mat);
- copy_m3_m4(result, difmat); /* the desired rotation at beginning of next bone */
-
- vec_roll_to_mat3(h1, 0.0f, mat3); /* the result of vec_roll without roll */
-
- invert_m3_m3(imat3, mat3);
- mul_m3_m3m3(mat3, result, imat3); /* the matrix transforming vec_roll to desired roll */
+ if (!done) {
+ mul_v3_m4v3(param.prev_h, imat, h1);
+ }
- roll1 = atan2f(mat3[2][0], mat3[2][2]);
+ if (!param.prev_bbone) {
+ /* Find the previous roll to interpolate. */
+ mul_m4_m4m4(param.prev_mat, imat, rest ? prev->bone->arm_mat : prev->pose_mat);
}
}
- else {
- h1[0] = 0.0f; h1[1] = 1.0; h1[2] = 0.0f;
- roll1 = 0.0f;
- }
+
if (next) {
- float difmat[4][4], result[3][3], imat3[3][3];
+ float h2[3];
+ bool done = false;
- /* transform next point inside this bone space */
- if ((pchan->bboneflag & PCHAN_BBONE_CUSTOM_HANDLES) &&
- (pchan->bboneflag & PCHAN_BBONE_CUSTOM_END_REL))
- {
- /* Use delta movement (from restpose), and apply this relative to the current bone's tail */
+ param.use_next = true;
+
+ /* Transform next point inside this bone space. */
+ if (bone->bbone_next_type == BBONE_HANDLE_RELATIVE) {
+ /* Use delta movement (from restpose), and apply this relative to the current bone's tail. */
+ if (rest) {
+ /* In restpose, arm_head == pose_head */
+ copy_v3_fl3(param.next_h, 0.0f, param.length, 0.0);
+ done = true;
+ }
+ else {
+ sub_v3_v3v3(delta, next->pose_head, next->bone->arm_head);
+ add_v3_v3v3(h2, pchan->pose_tail, delta);
+ }
+ }
+ else if (bone->bbone_next_type == BBONE_HANDLE_TANGENT) {
+ /* Use bone direction by offsetting so that its head meets current bone's tail */
if (rest) {
- /* in restpose, arm_tail == pose_tail */
- h2[0] = h2[1] = h2[2] = 0.0f;
+ sub_v3_v3v3(delta, next->bone->arm_tail, next->bone->arm_head);
+ add_v3_v3v3(h2, bone->arm_tail, delta);
}
else {
- float delta[3];
- sub_v3_v3v3(delta, next->pose_tail, next->bone->arm_tail);
+ sub_v3_v3v3(delta, next->pose_tail, next->pose_head);
add_v3_v3v3(h2, pchan->pose_tail, delta);
}
}
else {
- /* Use bone tail as absolute position */
- if (rest)
- copy_v3_v3(h2, next->bone->arm_tail);
- else
- copy_v3_v3(h2, next->pose_tail);
+ /* Apply special handling for smoothly joining B-Bone chains */
+ param.next_bbone = (next->bone->segments > 1);
+
+ /* Use bone tail as absolute position. */
+ copy_v3_v3(h2, rest ? next->bone->arm_tail : next->pose_tail);
}
- mul_m4_v3(imat, h2);
- /* if next bone is B-bone too, use average handle direction */
- if (next->bone->segments > 1) {
- /* pass */
+ if (!done) {
+ mul_v3_m4v3(param.next_h, imat, h2);
}
- else {
- h2[1] -= length;
+
+ /* Find the next roll to interpolate as well. */
+ mul_m4_m4m4(param.next_mat, imat, rest ? next->bone->arm_mat : next->pose_mat);
+ }
+
+ /* Add effects from bbone properties over the top
+ * - These properties allow users to hand-animate the
+ * bone curve/shape, without having to resort to using
+ * extra bones
+ * - The "bone" level offsets are for defining the restpose
+ * shape of the bone (e.g. for curved eyebrows for example).
+ * -> In the viewport, it's needed to define what the rest pose
+ * looks like
+ * -> For "rest == 0", we also still need to have it present
+ * so that we can "cancel out" this restpose when it comes
+ * time to deform some geometry, it won't cause double transforms.
+ * - The "pchan" level offsets are the ones that animators actually
+ * end up animating
+ */
+ {
+ param.ease1 = bone->ease1 + (!rest ? pchan->ease1 : 0.0f);
+ param.ease2 = bone->ease2 + (!rest ? pchan->ease2 : 0.0f);
+
+ param.roll1 = bone->roll1 + (!rest ? pchan->roll1 : 0.0f);
+ param.roll2 = bone->roll2 + (!rest ? pchan->roll2 : 0.0f);
+
+ if (bone->flag & BONE_ADD_PARENT_END_ROLL) {
+ if (prev) {
+ if (prev->bone) {
+ param.roll1 += prev->bone->roll2;
+ }
+
+ if (!rest) {
+ param.roll1 += prev->roll2;
+ }
+ }
}
- normalize_v3(h2);
- /* find the next roll to interpolate as well */
- if (rest)
- mul_m4_m4m4(difmat, imat, next->bone->arm_mat);
- else
- mul_m4_m4m4(difmat, imat, next->pose_mat);
- copy_m3_m4(result, difmat); /* the desired rotation at beginning of next bone */
+ param.scaleIn = bone->scaleIn * (!rest ? pchan->scaleIn : 1.0f);
+ param.scaleOut = bone->scaleOut * (!rest ? pchan->scaleOut : 1.0f);
- vec_roll_to_mat3(h2, 0.0f, mat3); /* the result of vec_roll without roll */
+ /* Extra curve x / y */
+ param.curveInX = bone->curveInX + (!rest ? pchan->curveInX : 0.0f);
+ param.curveInY = bone->curveInY + (!rest ? pchan->curveInY : 0.0f);
- invert_m3_m3(imat3, mat3);
- mul_m3_m3m3(mat3, imat3, result); /* the matrix transforming vec_roll to desired roll */
+ param.curveOutX = bone->curveOutX + (!rest ? pchan->curveOutX : 0.0f);
+ param.curveOutY = bone->curveOutY + (!rest ? pchan->curveOutY : 0.0f);
+ }
- roll2 = atan2f(mat3[2][0], mat3[2][2]);
+ bone->segments = BKE_compute_b_bone_spline(&param, result_array);
+}
+
+/* Fills the array with the desired amount of bone->segments elements.
+ * This calculation is done within unit bone space. */
+int BKE_compute_b_bone_spline(BBoneSplineParameters *param, Mat4 result_array[MAX_BBONE_SUBDIV])
+{
+ float scalemat[4][4], iscalemat[4][4];
+ float mat3[3][3];
+ float h1[3], roll1, h2[3], roll2;
+ float data[MAX_BBONE_SUBDIV + 1][4], *fp;
+ int a;
+ float length = param->length;
+
+ if (param->do_scale) {
+ size_to_mat4(scalemat, param->scale);
+ invert_m4_m4(iscalemat, scalemat);
+
+ length *= param->scale[1];
+ }
+
+ if (param->use_prev) {
+ copy_v3_v3(h1, param->prev_h);
+
+ if (param->prev_bbone) {
+ /* If previous bone is B-bone too, use average handle direction. */
+ h1[1] -= length;
+ roll1 = 0.0f;
+ }
+
+ normalize_v3(h1);
+ negate_v3(h1);
+
+ if (!param->prev_bbone) {
+ /* Find the previous roll to interpolate. */
+ copy_m3_m4(mat3, param->prev_mat);
+ mat3_vec_to_roll(mat3, h1, &roll1);
+ }
+ }
+ else {
+ h1[0] = 0.0f; h1[1] = 1.0; h1[2] = 0.0f;
+ roll1 = 0.0f;
+ }
+
+ if (param->use_next) {
+ copy_v3_v3(h2, param->next_h);
+
+ /* If next bone is B-bone too, use average handle direction. */
+ if (param->next_bbone) {
+ /* pass */
+ }
+ else {
+ h2[1] -= length;
+ }
+
+ normalize_v3(h2);
+
+ /* Find the next roll to interpolate as well. */
+ copy_m3_m4(mat3, param->next_mat);
+ mat3_vec_to_roll(mat3, h2, &roll2);
}
else {
h2[0] = 0.0f; h2[1] = 1.0f; h2[2] = 0.0f;
@@ -610,10 +712,8 @@ void b_bone_spline_setup(bPoseChannel *pchan, int rest, Mat4 result_array[MAX_BB
{
const float circle_factor = length * (cubic_tangent_factor_circle_v3(h1, h2) / 0.75f);
- const float combined_ease1 = bone->ease1 + (!rest ? pchan->ease1 : 0.0f);
- const float combined_ease2 = bone->ease2 + (!rest ? pchan->ease2 : 0.0f);
- const float hlength1 = combined_ease1 * circle_factor;
- const float hlength2 = combined_ease2 * circle_factor;
+ const float hlength1 = param->ease1 * circle_factor;
+ const float hlength2 = param->ease2 * circle_factor;
/* and only now negate h2 */
mul_v3_fl(h1, hlength1);
@@ -635,67 +735,56 @@ void b_bone_spline_setup(bPoseChannel *pchan, int rest, Mat4 result_array[MAX_BB
* end up animating
*/
{
- /* add extra rolls */
- roll1 += bone->roll1 + (!rest ? pchan->roll1 : 0.0f);
- roll2 += bone->roll2 + (!rest ? pchan->roll2 : 0.0f);
-
- if (bone->flag & BONE_ADD_PARENT_END_ROLL) {
- if (prev) {
- if (prev->bone)
- roll1 += prev->bone->roll2;
-
- if (!rest)
- roll1 += prev->roll2;
- }
- }
+ /* Add extra rolls. */
+ roll1 += param->roll1;
+ roll2 += param->roll2;
- /* extra curve x / y */
+ /* Extra curve x / y */
/* NOTE: Scale correction factors here are to compensate for some random floating-point glitches
* when scaling up the bone or it's parent by a factor of approximately 8.15/6, which results
* in the bone length getting scaled up too (from 1 to 8), causing the curve to flatten out.
*/
- const float xscale_correction = (do_scale) ? scale[0] : 1.0f;
- const float yscale_correction = (do_scale) ? scale[2] : 1.0f;
+ const float xscale_correction = (param->do_scale) ? param->scale[0] : 1.0f;
+ const float yscale_correction = (param->do_scale) ? param->scale[2] : 1.0f;
- h1[0] += (bone->curveInX + (!rest ? pchan->curveInX : 0.0f)) * xscale_correction;
- h1[2] += (bone->curveInY + (!rest ? pchan->curveInY : 0.0f)) * yscale_correction;
+ h1[0] += param->curveInX * xscale_correction;
+ h1[2] += param->curveInY * yscale_correction;
- h2[0] += (bone->curveOutX + (!rest ? pchan->curveOutX : 0.0f)) * xscale_correction;
- h2[2] += (bone->curveOutY + (!rest ? pchan->curveOutY : 0.0f)) * yscale_correction;
+ h2[0] += param->curveOutX * xscale_correction;
+ h2[2] += param->curveOutY * yscale_correction;
}
- /* make curve */
- if (bone->segments > MAX_BBONE_SUBDIV)
- bone->segments = MAX_BBONE_SUBDIV;
+ /* Make curve. */
+ CLAMP_MAX(param->segments, MAX_BBONE_SUBDIV);
BKE_curve_forward_diff_bezier(0.0f, h1[0], h2[0], 0.0f, data[0], MAX_BBONE_SUBDIV, 4 * sizeof(float));
BKE_curve_forward_diff_bezier(0.0f, h1[1], length + h2[1], length, data[0] + 1, MAX_BBONE_SUBDIV, 4 * sizeof(float));
BKE_curve_forward_diff_bezier(0.0f, h1[2], h2[2], 0.0f, data[0] + 2, MAX_BBONE_SUBDIV, 4 * sizeof(float));
BKE_curve_forward_diff_bezier(roll1, roll1 + 0.390464f * (roll2 - roll1), roll2 - 0.390464f * (roll2 - roll1), roll2, data[0] + 3, MAX_BBONE_SUBDIV, 4 * sizeof(float));
- equalize_bbone_bezier(data[0], bone->segments); /* note: does stride 4! */
+ equalize_bbone_bezier(data[0], param->segments); /* note: does stride 4! */
- /* make transformation matrices for the segments for drawing */
- for (a = 0, fp = data[0]; a < bone->segments; a++, fp += 4) {
+ /* Make transformation matrices for the segments for drawing. */
+ for (a = 0, fp = data[0]; a < param->segments; a++, fp += 4) {
sub_v3_v3v3(h1, fp + 4, fp);
vec_roll_to_mat3(h1, fp[3], mat3); /* fp[3] is roll */
copy_m4_m3(result_array[a].mat, mat3);
copy_v3_v3(result_array[a].mat[3], fp);
- if (do_scale) {
- /* correct for scaling when this matrix is used in scaled space */
+ if (param->do_scale) {
+ /* Correct for scaling when this matrix is used in scaled space. */
mul_m4_series(result_array[a].mat, iscalemat, result_array[a].mat, scalemat);
}
/* BBone scale... */
{
- const int num_segments = bone->segments;
+ const int num_segments = param->segments;
- const float scaleIn = bone->scaleIn * (!rest ? pchan->scaleIn : 1.0f);
+ const float scaleIn = param->scaleIn;
const float scaleFactorIn = 1.0f + (scaleIn - 1.0f) * ((float)(num_segments - a) / (float)num_segments);
- const float scaleOut = bone->scaleOut * (!rest ? pchan->scaleOut : 1.0f);
+ const float scaleOut = param->scaleOut;
const float scaleFactorOut = 1.0f + (scaleOut - 1.0f) * ((float)(a + 1) / (float)num_segments);
const float scalefac = scaleFactorIn * scaleFactorOut;
@@ -711,8 +800,9 @@ void b_bone_spline_setup(bPoseChannel *pchan, int rest, Mat4 result_array[MAX_BB
/*mul_m4_series(result_array[a].mat, ibscalemat, result_array[a].mat, bscalemat);*/
mul_m4_series(result_array[a].mat, result_array[a].mat, bscalemat);
}
-
}
+
+ return param->segments;
}
/* ************ Armature Deform ******************* */
@@ -731,8 +821,8 @@ static void pchan_b_bone_defmats(bPoseChannel *pchan, bPoseChanDeform *pdef_info
DualQuat *b_bone_dual_quats = NULL;
int a;
- b_bone_spline_setup(pchan, 0, b_bone);
- b_bone_spline_setup(pchan, 1, b_bone_rest);
+ b_bone_spline_setup(pchan, false, b_bone);
+ b_bone_spline_setup(pchan, true, b_bone_rest);
/* allocate b_bone matrices and dual quats */
b_bone_mats = MEM_mallocN((1 + bone->segments) * sizeof(Mat4), "BBone defmats");
@@ -969,9 +1059,10 @@ static void armature_bbone_defmats_cb(void *userdata, Link *iter, int index)
}
}
-void armature_deform_verts(Object *armOb, Object *target, const Mesh * mesh, float (*vertexCos)[3],
- float (*defMats)[3][3], int numVerts, int deformflag,
- float (*prevCos)[3], const char *defgrp_name, bGPDstroke *gps)
+void armature_deform_verts(
+ Object *armOb, Object *target, const Mesh *mesh, float (*vertexCos)[3],
+ float (*defMats)[3][3], int numVerts, int deformflag,
+ float (*prevCos)[3], const char *defgrp_name, bGPDstroke *gps)
{
bPoseChanDeform *pdef_info_array;
bPoseChanDeform *pdef_info = NULL;
@@ -1070,7 +1161,7 @@ void armature_deform_verts(Object *armOb, Object *target, const Mesh * mesh, flo
GHash *idx_hash = BLI_ghash_ptr_new("pose channel index by name");
int pchan_index = 0;
for (pchan = armOb->pose->chanbase.first; pchan != NULL; pchan = pchan->next, ++pchan_index) {
- BLI_ghash_insert(idx_hash, pchan, SET_INT_IN_POINTER(pchan_index));
+ BLI_ghash_insert(idx_hash, pchan, POINTER_FROM_INT(pchan_index));
}
for (i = 0, dg = target->defbase.first; dg; i++, dg = dg->next) {
defnrToPC[i] = BKE_pose_channel_find_name(armOb->pose, dg->name);
@@ -1080,7 +1171,7 @@ void armature_deform_verts(Object *armOb, Object *target, const Mesh * mesh, flo
defnrToPC[i] = NULL;
}
else {
- defnrToPCIndex[i] = GET_INT_FROM_POINTER(BLI_ghash_lookup(idx_hash, defnrToPC[i]));
+ defnrToPCIndex[i] = POINTER_AS_INT(BLI_ghash_lookup(idx_hash, defnrToPC[i]));
}
}
}
@@ -1153,7 +1244,7 @@ void armature_deform_verts(Object *armOb, Object *target, const Mesh * mesh, flo
MDeformWeight *dw = dvert->dw;
int deformed = 0;
unsigned int j;
-
+ float acum_weight = 0;
for (j = dvert->totweight; j != 0; j--, dw++) {
const int index = dw->def_nr;
if (index >= 0 && index < defbase_tot && (pchan = defnrToPC[index])) {
@@ -1167,7 +1258,21 @@ void armature_deform_verts(Object *armOb, Object *target, const Mesh * mesh, flo
weight *= distfactor_to_bone(co, bone->arm_head, bone->arm_tail,
bone->rad_head, bone->rad_tail, bone->dist);
}
+
+ /* check limit of weight */
+ if (target->type == OB_GPENCIL) {
+ if (acum_weight + weight >= 1.0f) {
+ weight = 1.0f - acum_weight;
+ }
+ acum_weight += weight;
+ }
+
pchan_bone_deform(pchan, pdef_info, weight, vec, dq, smat, co, &contrib);
+
+ /* if acumulated weight limit exceed, exit loop */
+ if ((target->type == OB_GPENCIL) && (acum_weight >= 1.0f)) {
+ break;
+ }
}
}
/* if there are vertexgroups but not groups with bones
@@ -1206,7 +1311,9 @@ void armature_deform_verts(Object *armOb, Object *target, const Mesh * mesh, flo
smat = summat;
}
else {
- mul_v3_fl(vec, armature_weight / contrib);
+ if (target->type != OB_GPENCIL) {
+ mul_v3_fl(vec, armature_weight / contrib);
+ }
add_v3_v3v3(co, vec, co);
}
@@ -1476,7 +1583,7 @@ void BKE_armature_mat_pose_to_bone_ex(struct Depsgraph *depsgraph, Object *ob, b
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 then a difference ontop of whats
+ * calculated as a matrix to set rather then a difference ontop of what's
* already there. */
unit_m4(outmat);
BKE_pchan_apply_mat4(&work_pchan, outmat, false);
@@ -1598,21 +1705,28 @@ void BKE_rotMode_change_values(float quat[4], float eul[3], float axis[3], float
/* Computes vector and roll based on a rotation.
* "mat" must contain only a rotation, and no scaling. */
-void mat3_to_vec_roll(float mat[3][3], float r_vec[3], float *r_roll)
+void mat3_to_vec_roll(const float mat[3][3], float r_vec[3], float *r_roll)
{
if (r_vec) {
copy_v3_v3(r_vec, mat[1]);
}
if (r_roll) {
- float vecmat[3][3], vecmatinv[3][3], rollmat[3][3];
+ mat3_vec_to_roll(mat, mat[1], r_roll);
+ }
+}
- vec_roll_to_mat3(mat[1], 0.0f, vecmat);
- invert_m3_m3(vecmatinv, vecmat);
- mul_m3_m3m3(rollmat, vecmatinv, mat);
+/* Computes roll around the vector that best approximates the matrix.
+ * If vec is the Y vector from purely rotational mat, result should be exact. */
+void mat3_vec_to_roll(const float mat[3][3], const float vec[3], float *r_roll)
+{
+ float vecmat[3][3], vecmatinv[3][3], rollmat[3][3];
- *r_roll = atan2f(rollmat[2][0], rollmat[2][2]);
- }
+ vec_roll_to_mat3(vec, 0.0f, vecmat);
+ invert_m3_m3(vecmatinv, vecmat);
+ mul_m3_m3m3(rollmat, vecmatinv, mat);
+
+ *r_roll = atan2f(rollmat[2][0], rollmat[2][2]);
}
/* Calculates the rest matrix of a bone based on its vector and a roll around that vector. */
@@ -1839,6 +1953,8 @@ static void pose_proxy_synchronize(Object *ob, Object *from, int layer_protected
pchanw.parent = pchan->parent;
pchanw.child = pchan->child;
pchanw.custom_tx = pchan->custom_tx;
+ pchanw.bbone_prev = pchan->bbone_prev;
+ pchanw.bbone_next = pchan->bbone_next;
pchanw.mpath = pchan->mpath;
pchan->mpath = NULL;
@@ -1963,6 +2079,19 @@ void BKE_pose_remap_bone_pointers(bArmature *armature, bPose *pose)
BLI_ghash_free(bone_hash, NULL, NULL);
}
+/** Find the matching pose channel using the bone name, if not NULL. */
+static bPoseChannel *pose_channel_find_bone(bPose *pose, Bone *bone)
+{
+ return (bone != NULL) ? BKE_pose_channel_find_name(pose, bone->name) : NULL;
+}
+
+/** Update the links for the B-Bone handles from Bone data. */
+void BKE_pchan_rebuild_bbone_handles(bPose *pose, bPoseChannel *pchan)
+{
+ pchan->bbone_prev = pose_channel_find_bone(pose, pchan->bone->bbone_prev);
+ pchan->bbone_next = pose_channel_find_bone(pose, pchan->bone->bbone_next);
+}
+
/**
* Only after leave editmode, duplicating, validating older files, library syncing.
*
@@ -2004,11 +2133,19 @@ void BKE_pose_rebuild(Main *bmain, Object *ob, bArmature *arm, const bool do_id_
BLI_freelinkN(&pose->chanbase, pchan);
}
}
+
+ BKE_pose_channels_hash_make(pose);
+
+ for (pchan = pose->chanbase.first; pchan; pchan = pchan->next) {
+ /* Find the custom B-Bone handles. */
+ BKE_pchan_rebuild_bbone_handles(pose, pchan);
+ }
+
/* printf("rebuild pose %s, %d bones\n", ob->id.name, counter); */
/* synchronize protected layers with proxy */
/* HACK! To preserve 2.7x behavior that you always can pose even locked bones,
- * do not do any restauration if this is a COW temp copy! */
+ * do not do any restoration if this is a COW temp copy! */
/* Switched back to just NO_MAIN tag, for some reasons (c) using COW tag was working this morning, but not anymore... */
if (ob->proxy != NULL && (ob->id.tag & LIB_TAG_NO_MAIN) == 0) {
BKE_object_copy_proxy_drivers(ob, ob->proxy);
@@ -2020,8 +2157,6 @@ void BKE_pose_rebuild(Main *bmain, Object *ob, bArmature *arm, const bool do_id_
pose->flag &= ~POSE_RECALC;
pose->flag |= POSE_WAS_REBUILT;
- BKE_pose_channels_hash_make(pose);
-
/* Rebuilding poses forces us to also rebuild the dependency graph, since there is one node per pose/bone... */
if (bmain != NULL) {
DEG_relations_tag_update(bmain);
@@ -2082,132 +2217,6 @@ void BKE_pchan_calc_mat(bPoseChannel *pchan)
BKE_pchan_to_mat4(pchan, pchan->chan_mat);
}
-#if 0 /* XXX OLD ANIMSYS, NLASTRIPS ARE NO LONGER USED */
-
-/* NLA strip modifiers */
-static void do_strip_modifiers(Scene *scene, Object *armob, Bone *bone, bPoseChannel *pchan)
-{
- bActionModifier *amod;
- bActionStrip *strip, *strip2;
- float scene_cfra = BKE_scene_frame_get(scene);
- int do_modif;
-
- for (strip = armob->nlastrips.first; strip; strip = strip->next) {
- do_modif = false;
-
- if (scene_cfra >= strip->start && scene_cfra <= strip->end)
- do_modif = true;
-
- if ((scene_cfra > strip->end) && (strip->flag & ACTSTRIP_HOLDLASTFRAME)) {
- do_modif = true;
-
- /* if there are any other strips active, ignore modifiers for this strip -
- * 'hold' option should only hold action modifiers if there are
- * no other active strips */
- for (strip2 = strip->next; strip2; strip2 = strip2->next) {
- if (strip2 == strip) continue;
-
- if (scene_cfra >= strip2->start && scene_cfra <= strip2->end) {
- if (!(strip2->flag & ACTSTRIP_MUTE))
- do_modif = false;
- }
- }
-
- /* if there are any later, activated, strips with 'hold' set, they take precedence,
- * so ignore modifiers for this strip */
- for (strip2 = strip->next; strip2; strip2 = strip2->next) {
- if (scene_cfra < strip2->start) continue;
- if ((strip2->flag & ACTSTRIP_HOLDLASTFRAME) && !(strip2->flag & ACTSTRIP_MUTE)) {
- do_modif = false;
- }
- }
- }
-
- if (do_modif) {
- /* temporal solution to prevent 2 strips accumulating */
- if (scene_cfra == strip->end && strip->next && strip->next->start == scene_cfra)
- continue;
-
- for (amod = strip->modifiers.first; amod; amod = amod->next) {
- switch (amod->type) {
- case ACTSTRIP_MOD_DEFORM:
- {
- /* validate first */
- if (amod->ob && amod->ob->type == OB_CURVE && amod->channel[0]) {
-
- if (STREQ(pchan->name, amod->channel)) {
- float mat4[4][4], mat3[3][3];
-
- curve_deform_vector(amod->ob, armob, bone->arm_mat[3], pchan->pose_mat[3], mat3, amod->no_rot_axis);
- copy_m4_m4(mat4, pchan->pose_mat);
- mul_m4_m3m4(pchan->pose_mat, mat3, mat4);
-
- }
- }
- }
- break;
- case ACTSTRIP_MOD_NOISE:
- {
- if (STREQ(pchan->name, amod->channel)) {
- float nor[3], loc[3], ofs;
- float eul[3], size[3], eulo[3], sizeo[3];
-
- /* calculate turbulance */
- ofs = amod->turbul / 200.0f;
-
- /* make a copy of starting conditions */
- copy_v3_v3(loc, pchan->pose_mat[3]);
- mat4_to_eul(eul, pchan->pose_mat);
- mat4_to_size(size, pchan->pose_mat);
- copy_v3_v3(eulo, eul);
- copy_v3_v3(sizeo, size);
-
- /* apply noise to each set of channels */
- if (amod->channels & 4) {
- /* for scaling */
- nor[0] = BLI_gNoise(amod->noisesize, size[0] + ofs, size[1], size[2], 0, 0) - ofs;
- nor[1] = BLI_gNoise(amod->noisesize, size[0], size[1] + ofs, size[2], 0, 0) - ofs;
- nor[2] = BLI_gNoise(amod->noisesize, size[0], size[1], size[2] + ofs, 0, 0) - ofs;
- add_v3_v3(size, nor);
-
- if (sizeo[0] != 0)
- mul_v3_fl(pchan->pose_mat[0], size[0] / sizeo[0]);
- if (sizeo[1] != 0)
- mul_v3_fl(pchan->pose_mat[1], size[1] / sizeo[1]);
- if (sizeo[2] != 0)
- mul_v3_fl(pchan->pose_mat[2], size[2] / sizeo[2]);
- }
- if (amod->channels & 2) {
- /* for rotation */
- nor[0] = BLI_gNoise(amod->noisesize, eul[0] + ofs, eul[1], eul[2], 0, 0) - ofs;
- nor[1] = BLI_gNoise(amod->noisesize, eul[0], eul[1] + ofs, eul[2], 0, 0) - ofs;
- nor[2] = BLI_gNoise(amod->noisesize, eul[0], eul[1], eul[2] + ofs, 0, 0) - ofs;
-
- compatible_eul(nor, eulo);
- add_v3_v3(eul, nor);
- compatible_eul(eul, eulo);
-
- loc_eul_size_to_mat4(pchan->pose_mat, loc, eul, size);
- }
- if (amod->channels & 1) {
- /* for location */
- nor[0] = BLI_gNoise(amod->noisesize, loc[0] + ofs, loc[1], loc[2], 0, 0) - ofs;
- nor[1] = BLI_gNoise(amod->noisesize, loc[0], loc[1] + ofs, loc[2], 0, 0) - ofs;
- nor[2] = BLI_gNoise(amod->noisesize, loc[0], loc[1], loc[2] + ofs, 0, 0) - ofs;
-
- add_v3_v3v3(pchan->pose_mat[3], loc, nor);
- }
- }
- }
- break;
- }
- }
- }
- }
-}
-
-#endif
-
/* calculate tail of posechannel */
void BKE_pose_where_is_bone_tail(bPoseChannel *pchan)
{
@@ -2244,11 +2253,6 @@ void BKE_pose_where_is_bone(
}
if (do_extra) {
-#if 0 /* XXX OLD ANIMSYS, NLASTRIPS ARE NO LONGER USED */
- /* do NLA strip modifiers - i.e. curve follow */
- do_strip_modifiers(scene, ob, bone, pchan);
-#endif
-
/* Do constraints */
if (pchan->constraints.first) {
bConstraintOb *cob;
@@ -2263,7 +2267,7 @@ void BKE_pose_where_is_bone(
cob = BKE_constraints_make_evalob(depsgraph, scene, ob, pchan, CONSTRAINT_OBTYPE_BONE);
/* Solve PoseChannel's Constraints */
- BKE_constraints_solve(depsgraph, &pchan->constraints, cob, ctime); /* ctime doesnt alter objects */
+ BKE_constraints_solve(depsgraph, &pchan->constraints, cob, ctime); /* ctime doesn't alter objects */
/* cleanup after Constraint Solving
* - applies matrix back to pchan, and frees temporary struct used
diff --git a/source/blender/blenkernel/intern/armature_update.c b/source/blender/blenkernel/intern/armature_update.c
index 42a1a308de2..8b4cd11ffb2 100644
--- a/source/blender/blenkernel/intern/armature_update.c
+++ b/source/blender/blenkernel/intern/armature_update.c
@@ -577,6 +577,7 @@ BLI_INLINE bPoseChannel *pose_pchan_get_indexed(Object *ob, int pchan_index)
{
bPose *pose = ob->pose;
BLI_assert(pose != NULL);
+ BLI_assert(pose->chan_array != NULL);
BLI_assert(pchan_index >= 0);
BLI_assert(pchan_index < MEM_allocN_len(pose->chan_array) / sizeof(bPoseChannel *));
return pose->chan_array[pchan_index];
@@ -703,6 +704,7 @@ void BKE_pose_bone_done(struct Depsgraph *depsgraph,
copy_m4_m4(pchan_orig->pose_mat, pchan->pose_mat);
copy_m4_m4(pchan_orig->chan_mat, pchan->chan_mat);
copy_v3_v3(pchan_orig->pose_head, pchan->pose_mat[3]);
+ copy_m4_m4(pchan_orig->constinv, pchan->constinv);
BKE_pose_where_is_bone_tail(pchan_orig);
}
}
@@ -742,9 +744,9 @@ void BKE_pose_splineik_evaluate(struct Depsgraph *depsgraph,
BKE_splineik_execute_tree(depsgraph, scene, ob, rootchan, ctime);
}
-void BKE_pose_eval_flush(struct Depsgraph *depsgraph,
- Scene *scene,
- Object *ob)
+void BKE_pose_eval_cleanup(struct Depsgraph *depsgraph,
+ Scene *scene,
+ Object *ob)
{
bPose *pose = ob->pose;
BLI_assert(pose != NULL);
@@ -761,7 +763,7 @@ void BKE_pose_eval_flush(struct Depsgraph *depsgraph,
pose->chan_array = NULL;
}
-void BKE_pose_eval_proxy_pose_init(struct Depsgraph *depsgraph, Object *object)
+void BKE_pose_eval_proxy_init(struct Depsgraph *depsgraph, Object *object)
{
BLI_assert(ID_IS_LINKED(object) && object->proxy_from != NULL);
DEG_debug_print_eval(depsgraph, __func__, object->id.name, object);
@@ -769,7 +771,7 @@ void BKE_pose_eval_proxy_pose_init(struct Depsgraph *depsgraph, Object *object)
pose_pchan_index_create(object->pose);
}
-void BKE_pose_eval_proxy_pose_done(struct Depsgraph *depsgraph, Object *object)
+void BKE_pose_eval_proxy_cleanup(struct Depsgraph *depsgraph, Object *object)
{
BLI_assert(ID_IS_LINKED(object) && object->proxy_from != NULL);
DEG_debug_print_eval(depsgraph, __func__, object->id.name, object);
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index 66020679bf7..d0dea75860e 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -58,6 +58,7 @@
#include "BKE_image.h"
#include "BKE_layer.h"
#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_report.h"
#include "BKE_scene.h"
diff --git a/source/blender/blenkernel/intern/blender_undo.c b/source/blender/blenkernel/intern/blender_undo.c
index 857fc72672c..a00ad5ff05f 100644
--- a/source/blender/blenkernel/intern/blender_undo.c
+++ b/source/blender/blenkernel/intern/blender_undo.c
@@ -46,11 +46,12 @@
#include "BLI_string.h"
#include "BLI_utildefines.h"
+#include "BKE_appdir.h"
#include "BKE_blender_undo.h" /* own include */
#include "BKE_blendfile.h"
-#include "BKE_appdir.h"
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BLO_undofile.h"
@@ -89,7 +90,7 @@ bool BKE_memfile_undo_decode(MemFileUndoData *mfu, bContext *C)
G.fileflags = fileflags;
if (success) {
- /* important not to update time here, else non keyed tranforms are lost */
+ /* important not to update time here, else non keyed transforms are lost */
DEG_on_visible_update(bmain, false);
}
diff --git a/source/blender/blenkernel/intern/blendfile.c b/source/blender/blenkernel/intern/blendfile.c
index 7d91c6e3639..d06ef96dafc 100644
--- a/source/blender/blenkernel/intern/blendfile.c
+++ b/source/blender/blenkernel/intern/blendfile.c
@@ -225,7 +225,7 @@ static void setup_app_data(
/* We need to tag this here because events may be handled immediately after.
* only the current screen is important because we wont have to handle
* events from multiple screens at once.*/
- {
+ if (curscreen) {
BKE_screen_gizmo_tag_refresh(curscreen);
}
}
@@ -416,7 +416,7 @@ bool BKE_blendfile_read_from_memory(
bfd = BLO_read_from_memory(filebuf, filelength, reports, skip_flags);
if (bfd) {
if (update_defaults)
- BLO_update_defaults_startup_blend(bfd->main);
+ BLO_update_defaults_startup_blend(bfd->main, NULL);
setup_app_data(C, bfd, "<memory2>", reports);
}
else {
@@ -662,10 +662,6 @@ bool BKE_blendfile_write_partial(
* (otherwise main->name will not be set at read time). */
BLI_strncpy(bmain_dst->name, bmain_src->name, sizeof(bmain_dst->name));
- if (write_flags & G_FILE_RELATIVE_REMAP) {
- path_list_backup = BKE_bpath_list_backup(bmain_src, path_list_flag);
- }
-
BLO_main_expander(blendfile_write_partial_cb);
BLO_expand_main(NULL, bmain_src);
@@ -685,10 +681,27 @@ bool BKE_blendfile_write_partial(
}
}
+ /* Backup paths because remap relative will overwrite them.
+ *
+ * NOTE: we do this only on the list of datablocks that we are writing
+ * because the restored full list is not guaranteed to be in the same
+ * order as before, as expected by BKE_bpath_list_restore.
+ *
+ * This happens because id_sort_by_name does not take into account
+ * string case or the library name, so the order is not strictly
+ * defined for two linked datablocks with the same name! */
+ if (write_flags & G_FILE_RELATIVE_REMAP) {
+ path_list_backup = BKE_bpath_list_backup(bmain_dst, path_list_flag);
+ }
/* save the buffer */
retval = BLO_write_file(bmain_dst, filepath, write_flags, reports, NULL);
+ if (path_list_backup) {
+ BKE_bpath_list_restore(bmain_dst, path_list_flag, path_list_backup);
+ BKE_bpath_list_free(path_list_backup);
+ }
+
/* move back the main, now sorted again */
set_listbasepointers(bmain_src, lbarray_dst);
a = set_listbasepointers(bmain_dst, lbarray_src);
@@ -704,11 +717,6 @@ bool BKE_blendfile_write_partial(
MEM_freeN(bmain_dst);
- if (path_list_backup) {
- BKE_bpath_list_restore(bmain_src, path_list_flag, path_list_backup);
- BKE_bpath_list_free(path_list_backup);
- }
-
return retval;
}
diff --git a/source/blender/blenkernel/intern/bmfont.c b/source/blender/blenkernel/intern/bmfont.c
deleted file mode 100644
index c99894bfbaf..00000000000
--- a/source/blender/blenkernel/intern/bmfont.c
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): 04-10-2000 frank.
- *
- * ***** END GPL LICENSE BLOCK *****
- *
- */
-
-/** \file blender/blenkernel/intern/bmfont.c
- * \ingroup bke
- */
-
-
-/**
- * Two external functions:
- *
- * void detectBitmapFont(ImBuf *ibuf)
- * detects if an image buffer contains a bitmap font. It makes the
- * specific bitmap data which is stored in the bitmap invisible to blender.
- *
- * void matrixGlyph(ImBuf *ibuf, unsigned short unicode, *float x 7)
- * returns all the information about the character (unicode) in the floats
- *
- * Room for improvement:
- * add kerning data in the bitmap
- * all calculations in matrixGlyph() are static and could be done during
- * initialization
- */
-
-#include <stdio.h>
-
-#include "MEM_guardedalloc.h"
-#include "IMB_imbuf_types.h"
-
-#include "BLI_utildefines.h"
-
-#include "BKE_bmfont.h"
-#include "BKE_bmfont_types.h"
-#include "BKE_global.h"
-
-void printfGlyph(bmGlyph *glyph)
-{
- printf("unicode: %d '%c'\n", glyph->unicode, glyph->unicode);
- printf(" locx: %4d locy: %4d\n", glyph->locx, glyph->locy);
- printf(" sizex: %3d sizey: %3d\n", glyph->sizex, glyph->sizey);
- printf(" ofsx: %3d ofsy: %3d\n", glyph->ofsx, glyph->ofsy);
- printf(" advan: %3d reser: %3d\n", glyph->advance, glyph->reserved);
-}
-
-void calcAlpha(ImBuf *ibuf)
-{
- int i;
- char *rect;
-
- if (ibuf) {
- rect = (char *) ibuf->rect;
- for (i = ibuf->x * ibuf->y; i > 0; i--) {
- rect[3] = MAX3(rect[0], rect[1], rect[2]);
- rect += 4;
- }
- }
-}
-
-void readBitmapFontVersion0(ImBuf *ibuf, unsigned char *rect, int step)
-{
- int glyphcount, bytes, i, index, linelength, ysize;
- unsigned char *buffer;
- bmFont * bmfont;
-
- linelength = ibuf->x * step;
-
- glyphcount = (rect[6 * step] << 8) | rect[7 * step];
- bytes = ((glyphcount - 1) * sizeof(bmGlyph)) + sizeof(bmFont);
-
- ysize = (bytes + (ibuf->x - 1)) / ibuf->x;
-
- if (ysize < ibuf->y) {
- /* we're first going to copy all data into a linear buffer.
- * step can be 4 or 1 bytes, and the data is not sequential because
- * the bitmap was flipped vertically. */
-
- buffer = MEM_mallocN(bytes, "readBitmapFontVersion0:buffer");
-
- index = 0;
- for (i = 0; i < bytes; i++) {
- buffer[i] = rect[index];
- index += step;
- if (index >= linelength) {
- /* we've read one line, no skip to the line *before* that */
- rect -= linelength;
- index -= linelength;
- }
- }
-
- /* we're now going to endian convert the data */
-
- bmfont = MEM_mallocN(bytes, "readBitmapFontVersion0:bmfont");
- index = 0;
-
- /* first read the header */
- bmfont->magic[0] = buffer[index++];
- bmfont->magic[1] = buffer[index++];
- bmfont->magic[2] = buffer[index++];
- bmfont->magic[3] = buffer[index++];
- bmfont->version = (buffer[index] << 8) | buffer[index + 1]; index += 2;
- bmfont->glyphcount = (buffer[index] << 8) | buffer[index + 1]; index += 2;
- bmfont->xsize = (buffer[index] << 8) | buffer[index + 1]; index += 2;
- bmfont->ysize = (buffer[index] << 8) | buffer[index + 1]; index += 2;
-
- for (i = 0; i < bmfont->glyphcount; i++) {
- bmfont->glyphs[i].unicode = (buffer[index] << 8) | buffer[index + 1]; index += 2;
- bmfont->glyphs[i].locx = (buffer[index] << 8) | buffer[index + 1]; index += 2;
- bmfont->glyphs[i].locy = (buffer[index] << 8) | buffer[index + 1]; index += 2;
- bmfont->glyphs[i].ofsx = buffer[index++];
- bmfont->glyphs[i].ofsy = buffer[index++];
- bmfont->glyphs[i].sizex = buffer[index++];
- bmfont->glyphs[i].sizey = buffer[index++];
- bmfont->glyphs[i].advance = buffer[index++];
- bmfont->glyphs[i].reserved = buffer[index++];
- if (G.debug & G_DEBUG) {
- printfGlyph(&bmfont->glyphs[i]);
- }
- }
-
- MEM_freeN(buffer);
-
- if (G.debug & G_DEBUG) {
- printf("Oldy = %d Newy = %d\n", ibuf->y, ibuf->y - ysize);
- printf("glyphcount = %d\n", glyphcount);
- printf("bytes = %d\n", bytes);
- }
-
- /* we've read the data from the image. Now we're going
- * to crop the image vertically so only the bitmap data
- * remains visible */
-
- ibuf->y -= ysize;
- ibuf->userdata = bmfont;
- ibuf->userflags |= IB_BITMAPFONT;
-
- if (ibuf->planes < 32) {
- /* we're going to fake alpha here: */
- calcAlpha(ibuf);
- }
- }
- else {
- printf("readBitmapFontVersion0: corrupted bitmapfont\n");
- }
-}
-
-void detectBitmapFont(ImBuf *ibuf)
-{
- unsigned char *rect;
- unsigned short version;
- int i;
-
- if (ibuf != NULL && ibuf->rect != NULL) {
- /* bitmap must have an x size that is a power of two */
- if (is_power_of_two(ibuf->x)) {
- rect = (unsigned char *) (ibuf->rect + (ibuf->x * (ibuf->y - 1)));
- /* printf ("starts with: %s %c %c %c %c\n", rect, rect[0], rect[1], rect[2], rect[3]); */
- if (rect[0] == 'B' && rect[1] == 'F' && rect[2] == 'N' && rect[3] == 'T') {
- /* printf("found 8bit font !\n");
- * round y size down
- * do the 8 bit font stuff. (not yet) */
- }
- else {
- /* we try all 4 possible combinations */
- for (i = 0; i < 4; i++) {
- if (rect[0] == 'B' && rect[4] == 'F' && rect[8] == 'N' && rect[12] == 'T') {
- /* printf("found 24bit font !\n");
- * We're going to parse the file: */
-
- version = (rect[16] << 8) | rect[20];
-
- if (version == 0) {
- readBitmapFontVersion0(ibuf, rect, 4);
- }
- else {
- printf("detectBitmapFont :Unsupported version %d\n", (int)version);
- }
-
- /* on success ibuf->userdata points to the bitmapfont */
- if (ibuf->userdata) {
- break;
- }
- }
- rect++;
- }
- }
- }
- }
-}
-
-int locateGlyph(bmFont *bmfont, unsigned short unicode)
-{
- int min, max, current = 0;
-
- if (bmfont) {
- min = 0;
- max = bmfont->glyphcount;
- while (1) {
- /* look halfway for glyph */
- current = (min + max) >> 1;
-
- if (bmfont->glyphs[current].unicode == unicode) {
- break;
- }
- else if (bmfont->glyphs[current].unicode < unicode) {
- /* have to move up */
- min = current;
- }
- else {
- /* have to move down */
- max = current;
- }
-
- if (max - min <= 1) {
- /* unable to locate glyph */
- current = 0;
- break;
- }
- }
- }
-
- return(current);
-}
-
-void matrixGlyph(
- ImBuf *ibuf, unsigned short unicode,
- float *centerx, float *centery,
- float *sizex, float *sizey,
- float *transx, float *transy,
- float *movex, float *movey,
- float *advance)
-{
- int index;
- bmFont *bmfont;
-
- *centerx = *centery = 0.0;
- *sizex = *sizey = 1.0;
- *transx = *transy = 0.0;
- *movex = *movey = 0.0;
- *advance = 1.0;
-
- if (ibuf) {
- bmfont = ibuf->userdata;
- if (bmfont && (ibuf->userflags & IB_BITMAPFONT)) {
- index = locateGlyph(bmfont, unicode);
- if (index) {
-
- *sizex = (bmfont->glyphs[index].sizex) / (float) (bmfont->glyphs[0].sizex);
- *sizey = (bmfont->glyphs[index].sizey) / (float) (bmfont->glyphs[0].sizey);
-
- *transx = bmfont->glyphs[index].locx / (float) ibuf->x;
- *transy = (ibuf->y - bmfont->glyphs[index].locy) / (float) ibuf->y;
-
- *centerx = bmfont->glyphs[0].locx / (float) ibuf->x;
- *centery = (ibuf->y - bmfont->glyphs[0].locy) / (float) ibuf->y;
-
- /* 2.0 units is the default size of an object */
-
- *movey = 1.0f - *sizey + 2.0f * (bmfont->glyphs[index].ofsy - bmfont->glyphs[0].ofsy) / (float) bmfont->glyphs[0].sizey;
- *movex = *sizex - 1.0f + 2.0f * (bmfont->glyphs[index].ofsx - bmfont->glyphs[0].ofsx) / (float) bmfont->glyphs[0].sizex;
-
- *advance = 2.0f * bmfont->glyphs[index].advance / (float) bmfont->glyphs[0].advance;
-
- // printfGlyph(&bmfont->glyphs[index]);
- // printf("%c %d %0.5f %0.5f %0.5f %0.5f %0.5f\n", unicode, index, *sizex, *sizey, *transx, *transy, *advance);
- }
- }
- }
-}
diff --git a/source/blender/blenkernel/intern/boids.c b/source/blender/blenkernel/intern/boids.c
index 1e4a99beec4..e88dcc71b2e 100644
--- a/source/blender/blenkernel/intern/boids.c
+++ b/source/blender/blenkernel/intern/boids.c
@@ -1284,7 +1284,7 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa)
/* integrate new location & velocity */
/* by regarding the acceleration as a force at this stage we*/
- /* can get better control allthough it's a bit unphysical */
+ /* can get better control although it's a bit unphysical */
mul_v3_fl(acc, 1.0f/pa_mass);
copy_v3_v3(dvec, acc);
diff --git a/source/blender/blenkernel/intern/boolean.c b/source/blender/blenkernel/intern/boolean.c
index 56ef6e021fc..3e70de314f4 100644
--- a/source/blender/blenkernel/intern/boolean.c
+++ b/source/blender/blenkernel/intern/boolean.c
@@ -260,7 +260,7 @@ Mesh *BKE_boolean_operation(Mesh *mesh, struct Object *ob,
MEM_freeN(looptris);
}
- result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0}));
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BM_mesh_free(bm);
diff --git a/source/blender/blenkernel/intern/bpath.c b/source/blender/blenkernel/intern/bpath.c
index 34f54704f75..88a4b7905ef 100644
--- a/source/blender/blenkernel/intern/bpath.c
+++ b/source/blender/blenkernel/intern/bpath.c
@@ -478,13 +478,6 @@ void BKE_bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int
} \
} (void)0
- /* do via modifiers instead */
-#if 0
- if (ob->fluidsimSettings) {
- rewrite_path_fixed(ob->fluidsimSettings->surfdataPath, visit_cb, absbase, bpath_user_data);
- }
-#endif
-
for (md = ob->modifiers.first; md; md = md->next) {
if (md->type == eModifierType_Fluidsim) {
FluidsimModifierData *fluidmd = (FluidsimModifierData *)md;
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index 84df994f051..62c72a4fa58 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -167,7 +167,7 @@ Brush *BKE_brush_add(Main *bmain, const char *name, const eObjectMode ob_mode)
return brush;
}
-/* add grese pencil settings */
+/* add grease pencil settings */
void BKE_brush_init_gpencil_settings(Brush *brush)
{
if (brush->gpencil_settings == NULL) {
@@ -193,7 +193,7 @@ void BKE_brush_init_gpencil_settings(Brush *brush)
Brush *BKE_brush_add_gpencil(Main *bmain, ToolSettings *ts, const char *name)
{
Brush *brush;
- Paint *paint = BKE_brush_get_gpencil_paint(ts);
+ Paint *paint = &ts->gp_paint->paint;
brush = BKE_brush_add(bmain, name, OB_MODE_GPENCIL_PAINT);
BKE_paint_brush_set(paint, brush);
@@ -208,16 +208,6 @@ Brush *BKE_brush_add_gpencil(Main *bmain, ToolSettings *ts, const char *name)
return brush;
}
-Paint *BKE_brush_get_gpencil_paint(ToolSettings *ts)
-{
- /* alloc paint session */
- if (ts->gp_paint == NULL) {
- ts->gp_paint = MEM_callocN(sizeof(GpPaint), "GpPaint");
- }
-
- return &ts->gp_paint->paint;
-}
-
/* grease pencil cumapping->preset */
typedef enum eGPCurveMappingPreset {
GPCURVE_PRESET_PENCIL = 0,
@@ -273,7 +263,7 @@ void BKE_brush_gpencil_presets(bContext *C)
#define SMOOTH_STROKE_FACTOR 0.9f
ToolSettings *ts = CTX_data_tool_settings(C);
- Paint *paint = BKE_brush_get_gpencil_paint(ts);
+ Paint *paint = &ts->gp_paint->paint;
Main *bmain = CTX_data_main(C);
Brush *brush, *deft;
@@ -304,7 +294,7 @@ void BKE_brush_gpencil_presets(bContext *C)
brush->gpencil_settings->draw_subdivide = 1;
brush->gpencil_settings->draw_random_sub = 0.0f;
brush->gpencil_settings->icon_id = GP_BRUSH_ICON_PENCIL;
- brush->gpencil_settings->brush_type = GP_BRUSH_TYPE_DRAW;
+ brush->gpencil_tool = GPAINT_TOOL_DRAW;
brush->smooth_stroke_radius = SMOOTH_STROKE_RADIUS;
brush->smooth_stroke_factor = SMOOTH_STROKE_FACTOR;
@@ -336,7 +326,7 @@ void BKE_brush_gpencil_presets(bContext *C)
brush->gpencil_settings->thick_smoothlvl = 3;
brush->gpencil_settings->draw_random_sub = 0.0f;
brush->gpencil_settings->icon_id = GP_BRUSH_ICON_PEN;
- brush->gpencil_settings->brush_type = GP_BRUSH_TYPE_DRAW;
+ brush->gpencil_tool = GPAINT_TOOL_DRAW;
brush->smooth_stroke_radius = SMOOTH_STROKE_RADIUS;
brush->smooth_stroke_factor = SMOOTH_STROKE_FACTOR;
@@ -365,7 +355,7 @@ void BKE_brush_gpencil_presets(bContext *C)
brush->gpencil_settings->draw_subdivide = 1;
brush->gpencil_settings->draw_random_sub = 0.0f;
brush->gpencil_settings->icon_id = GP_BRUSH_ICON_INK;
- brush->gpencil_settings->brush_type = GP_BRUSH_TYPE_DRAW;
+ brush->gpencil_tool = GPAINT_TOOL_DRAW;
brush->smooth_stroke_radius = SMOOTH_STROKE_RADIUS;
brush->smooth_stroke_factor = SMOOTH_STROKE_FACTOR;
@@ -402,7 +392,7 @@ void BKE_brush_gpencil_presets(bContext *C)
brush->gpencil_settings->draw_subdivide = 1;
brush->gpencil_settings->draw_random_sub = 0.0f;
brush->gpencil_settings->icon_id = GP_BRUSH_ICON_INKNOISE;
- brush->gpencil_settings->brush_type = GP_BRUSH_TYPE_DRAW;
+ brush->gpencil_tool = GPAINT_TOOL_DRAW;
brush->smooth_stroke_radius = SMOOTH_STROKE_RADIUS;
brush->smooth_stroke_factor = SMOOTH_STROKE_FACTOR;
@@ -438,7 +428,7 @@ void BKE_brush_gpencil_presets(bContext *C)
brush->gpencil_settings->draw_subdivide = 0;
brush->gpencil_settings->draw_random_sub = 0;
brush->gpencil_settings->icon_id = GP_BRUSH_ICON_BLOCK;
- brush->gpencil_settings->brush_type = GP_BRUSH_TYPE_DRAW;
+ brush->gpencil_tool = GPAINT_TOOL_DRAW;
brush->smooth_stroke_radius = SMOOTH_STROKE_RADIUS;
brush->smooth_stroke_factor = SMOOTH_STROKE_FACTOR;
@@ -469,7 +459,7 @@ void BKE_brush_gpencil_presets(bContext *C)
brush->gpencil_settings->draw_subdivide = 1;
brush->gpencil_settings->draw_random_sub = 0.0f;
brush->gpencil_settings->icon_id = GP_BRUSH_ICON_MARKER;
- brush->gpencil_settings->brush_type = GP_BRUSH_TYPE_DRAW;
+ brush->gpencil_tool = GPAINT_TOOL_DRAW;
brush->smooth_stroke_radius = SMOOTH_STROKE_RADIUS;
brush->smooth_stroke_factor = SMOOTH_STROKE_FACTOR;
@@ -483,7 +473,7 @@ void BKE_brush_gpencil_presets(bContext *C)
brush->gpencil_settings->fill_threshold = 0.1f;
brush->gpencil_settings->fill_simplylvl = 1;
brush->gpencil_settings->icon_id = GP_BRUSH_ICON_FILL;
- brush->gpencil_settings->brush_type = GP_BRUSH_TYPE_FILL;
+ brush->gpencil_tool = GPAINT_TOOL_FILL;
brush->gpencil_settings->draw_smoothfac = 0.1f;
brush->gpencil_settings->draw_smoothlvl = 1;
@@ -497,19 +487,21 @@ void BKE_brush_gpencil_presets(bContext *C)
brush->gpencil_settings->draw_strength = 1.0f;
/* Soft Eraser brush */
- brush = BKE_brush_add_gpencil(bmain, ts, "Eraser Soft");
+ brush = BKE_brush_add_gpencil(bmain, ts, "Eraser");
brush->size = 30.0f;
brush->gpencil_settings->flag |= (GP_BRUSH_ENABLE_CURSOR | GP_BRUSH_DEFAULT_ERASER);
brush->gpencil_settings->icon_id = GP_BRUSH_ICON_ERASE_SOFT;
- brush->gpencil_settings->brush_type = GP_BRUSH_TYPE_ERASE;
+ brush->gpencil_tool = GPAINT_TOOL_ERASE;
brush->gpencil_settings->eraser_mode = GP_BRUSH_ERASER_SOFT;
+ brush->gpencil_settings->era_strength_f = 100.0f;
+ brush->gpencil_settings->era_thickness_f = 0.10f;
/* Hard Eraser brush */
- brush = BKE_brush_add_gpencil(bmain, ts, "Eraser Hard");
+ brush = BKE_brush_add_gpencil(bmain, ts, "Eraser Vertex");
brush->size = 30.0f;
brush->gpencil_settings->flag |= GP_BRUSH_ENABLE_CURSOR;
brush->gpencil_settings->icon_id = GP_BRUSH_ICON_ERASE_HARD;
- brush->gpencil_settings->brush_type = GP_BRUSH_TYPE_ERASE;
+ brush->gpencil_tool = GPAINT_TOOL_ERASE;
brush->gpencil_settings->eraser_mode = GP_BRUSH_ERASER_HARD;
/* Stroke Eraser brush */
@@ -517,10 +509,10 @@ void BKE_brush_gpencil_presets(bContext *C)
brush->size = 30.0f;
brush->gpencil_settings->flag |= GP_BRUSH_ENABLE_CURSOR;
brush->gpencil_settings->icon_id = GP_BRUSH_ICON_ERASE_STROKE;
- brush->gpencil_settings->brush_type = GP_BRUSH_TYPE_ERASE;
+ brush->gpencil_tool = GPAINT_TOOL_ERASE;
brush->gpencil_settings->eraser_mode = GP_BRUSH_ERASER_STROKE;
- /* set defaut brush */
+ /* set default brush */
BKE_paint_brush_set(paint, deft);
}
@@ -543,18 +535,6 @@ void BKE_brush_update_material(Main *bmain, Material *ma, Brush *exclude_brush)
}
}
-/* get the active gp-brush for editing */
-Brush *BKE_brush_getactive_gpencil(ToolSettings *ts)
-{
- /* error checking */
- if (ELEM(NULL, ts, ts->gp_paint)) {
- return NULL;
- }
- Paint *paint = &ts->gp_paint->paint;
-
- return paint->brush;
-}
-
struct Brush *BKE_brush_first_search(struct Main *bmain, const eObjectMode ob_mode)
{
Brush *brush;
@@ -1358,7 +1338,7 @@ unsigned int *BKE_brush_gen_texture_cache(Brush *br, int half_side, bool use_sec
texcache = MEM_callocN(sizeof(int) * side * side, "Brush texture cache");
- /* do normalized cannonical view coords for texture */
+ /* do normalized canonical view coords for texture */
for (y = -1.0, iy = 0; iy < side; iy++, y += step) {
for (x = -1.0, ix = 0; ix < side; ix++, x += step) {
co[0] = x;
@@ -1366,7 +1346,7 @@ unsigned int *BKE_brush_gen_texture_cache(Brush *br, int half_side, bool use_sec
co[2] = 0.0f;
/* This is copied from displace modifier code */
- /* TODO(sergey): brush are always cacheing with CM enabled for now. */
+ /* TODO(sergey): brush are always caching with CM enabled for now. */
externtex(mtex, co, &intensity,
rgba, rgba + 1, rgba + 2, rgba + 3, 0, NULL, false, false);
diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c
index 6785f7b948f..5c27b1b6207 100644
--- a/source/blender/blenkernel/intern/bvhutils.c
+++ b/source/blender/blenkernel/intern/bvhutils.c
@@ -42,7 +42,7 @@
#include "BLI_math.h"
#include "BLI_threads.h"
-#include "BKE_DerivedMesh.h"
+#include "BKE_bvhutils.h"
#include "BKE_editmesh.h"
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
@@ -469,7 +469,6 @@ static void bvhtree_from_mesh_verts_setup_data(
data->vert = vert;
data->vert_allocated = vert_allocated;
- //data->face = DM_get_tessface_array(dm, &data->face_allocated); /* XXX WHY???? */
}
/* Builds a bvh tree where nodes are the vertices of the given em */
@@ -1089,221 +1088,6 @@ static BLI_bitmap *loose_edges_map_get(
/**
* Builds or queries a bvhcache for the cache bvhtree of the request type.
*/
-BVHTree *bvhtree_from_mesh_get(
- struct BVHTreeFromMesh *data, struct DerivedMesh *dm,
- const int type, const int tree_type)
-{
- BVHTree *tree = NULL;
-
- BVHTree_NearestPointCallback nearest_callback = NULL;
- BVHTree_RayCastCallback raycast_callback = NULL;
-
- MVert *mvert = NULL;
- MEdge *medge = NULL;
- MFace *mface = NULL;
- MLoop *mloop = NULL;
- const MLoopTri *looptri = NULL;
- bool vert_allocated = false;
- bool edge_allocated = false;
- bool face_allocated = false;
- bool loop_allocated = false;
-
- BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_READ);
- bool in_cache = bvhcache_find(dm->bvhCache, type, &tree);
- BLI_rw_mutex_unlock(&cache_rwlock);
-
- if (in_cache && tree == NULL) {
- memset(data, 0, sizeof(*data));
- return tree;
- }
-
- switch (type) {
- case BVHTREE_FROM_VERTS:
- case BVHTREE_FROM_LOOSEVERTS:
- raycast_callback = mesh_verts_spherecast;
-
- mvert = DM_get_vert_array(dm, &vert_allocated);
-
- if (in_cache == false) {
- BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_WRITE);
- in_cache = bvhcache_find(dm->bvhCache, type, &tree);
- if (in_cache == false) {
- BLI_bitmap *loose_verts_mask = NULL;
- int loose_vert_num = -1;
- int verts_num = dm->getNumVerts(dm);
-
- if (type == BVHTREE_FROM_LOOSEVERTS) {
- medge = DM_get_edge_array(dm, &edge_allocated);
-
- loose_verts_mask = loose_verts_map_get(
- medge, dm->getNumEdges(dm), mvert,
- verts_num, &loose_vert_num);
-
- if (edge_allocated) {
- MEM_freeN(medge);
- edge_allocated = false;
- }
- medge = NULL;
- }
-
- tree = bvhtree_from_mesh_verts_create_tree(
- 0.0, tree_type, 6, mvert, verts_num,
- loose_verts_mask, loose_vert_num);
-
- if (loose_verts_mask != NULL) {
- MEM_freeN(loose_verts_mask);
- }
-
-
- /* Save on cache for later use */
- /* printf("BVHTree built and saved on cache\n"); */
- bvhcache_insert(&dm->bvhCache, tree, type);
-
- }
-
- BLI_rw_mutex_unlock(&cache_rwlock);
- }
- break;
-
- case BVHTREE_FROM_EDGES:
- case BVHTREE_FROM_LOOSEEDGES:
- nearest_callback = mesh_edges_nearest_point;
- raycast_callback = mesh_edges_spherecast;
-
- mvert = DM_get_vert_array(dm, &vert_allocated);
- medge = DM_get_edge_array(dm, &edge_allocated);
-
- if (in_cache == false) {
- BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_WRITE);
- in_cache = bvhcache_find(dm->bvhCache, type, &tree);
- if (in_cache == false) {
- BLI_bitmap *loose_edges_mask = NULL;
- int loose_edges_num = -1;
- int edges_num = dm->getNumEdges(dm);
-
- if (type == BVHTREE_FROM_LOOSEEDGES) {
- loose_edges_mask = loose_edges_map_get(
- medge, edges_num, &loose_edges_num);
- }
-
- tree = bvhtree_from_mesh_edges_create_tree(
- mvert, medge, edges_num,
- loose_edges_mask, loose_edges_num, 0.0, tree_type, 6);
-
- if (loose_edges_mask != NULL) {
- MEM_freeN(loose_edges_mask);
- }
-
- /* Save on cache for later use */
- /* printf("BVHTree built and saved on cache\n"); */
- bvhcache_insert(&dm->bvhCache, tree, type);
- }
- BLI_rw_mutex_unlock(&cache_rwlock);
- }
- break;
-
- case BVHTREE_FROM_FACES:
- nearest_callback = mesh_faces_nearest_point;
- raycast_callback = mesh_faces_spherecast;
-
- mvert = DM_get_vert_array(dm, &vert_allocated);
- mface = DM_get_tessface_array(dm, &face_allocated);
-
- if (in_cache == false) {
- BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_WRITE);
- in_cache = bvhcache_find(dm->bvhCache, BVHTREE_FROM_FACES, &tree);
- if (in_cache == false) {
- int numFaces = dm->getNumTessFaces(dm);
- BLI_assert(!(numFaces == 0 && dm->getNumPolys(dm) != 0));
-
- tree = bvhtree_from_mesh_faces_create_tree(
- 0.0, tree_type, 6, mvert, mface, numFaces, NULL, -1);
-
- /* Save on cache for later use */
- /* printf("BVHTree built and saved on cache\n"); */
- bvhcache_insert(&dm->bvhCache, tree, BVHTREE_FROM_FACES);
- }
- BLI_rw_mutex_unlock(&cache_rwlock);
- }
- break;
-
- case BVHTREE_FROM_LOOPTRI:
- nearest_callback = mesh_looptri_nearest_point;
- raycast_callback = mesh_looptri_spherecast;
-
- mvert = DM_get_vert_array(dm, &vert_allocated);
- mloop = DM_get_loop_array(dm, &loop_allocated);
- looptri = dm->getLoopTriArray(dm);
-
- if (in_cache == false) {
- BLI_rw_mutex_lock(&cache_rwlock, THREAD_LOCK_WRITE);
- in_cache = bvhcache_find(dm->bvhCache, BVHTREE_FROM_LOOPTRI, &tree);
- if (in_cache == false) {
- int looptri_num = dm->getNumLoopTri(dm);
-
- /* this assert checks we have looptris,
- * if not caller should use DM_ensure_looptri() */
- BLI_assert(!(looptri_num == 0 && dm->getNumPolys(dm) != 0));
-
- tree = bvhtree_from_mesh_looptri_create_tree(
- 0.0, tree_type, 6,
- mvert, mloop, looptri, looptri_num, NULL, -1);
-
- /* Save on cache for later use */
- /* printf("BVHTree built and saved on cache\n"); */
- bvhcache_insert(&dm->bvhCache, tree, BVHTREE_FROM_LOOPTRI);
- }
- BLI_rw_mutex_unlock(&cache_rwlock);
- }
- break;
- }
-
- if (tree != NULL) {
-#ifdef DEBUG
- if (BLI_bvhtree_get_tree_type(tree) != tree_type) {
- printf("tree_type %d obtained instead of %d\n", BLI_bvhtree_get_tree_type(tree), tree_type);
- }
-#endif
- data->tree = tree;
-
- data->nearest_callback = nearest_callback;
- data->raycast_callback = raycast_callback;
-
- data->vert = mvert;
- data->edge = medge;
- data->face = mface;
- data->loop = mloop;
- data->looptri = looptri;
- data->vert_allocated = vert_allocated;
- data->edge_allocated = edge_allocated;
- data->face_allocated = face_allocated;
- data->loop_allocated = loop_allocated;
-
- data->cached = true;
- }
- else {
- if (vert_allocated) {
- MEM_freeN(mvert);
- }
- if (edge_allocated) {
- MEM_freeN(medge);
- }
- if (face_allocated) {
- MEM_freeN(mface);
- }
- if (loop_allocated) {
- MEM_freeN(mloop);
- }
-
- memset(data, 0, sizeof(*data));
- }
-
- return tree;
-}
-
-/**
- * Builds or queries a bvhcache for the cache bvhtree of the request type.
- */
BVHTree *BKE_bvhtree_from_mesh_get(
struct BVHTreeFromMesh *data, struct Mesh *mesh,
const int type, const int tree_type)
@@ -1440,7 +1224,7 @@ BVHTree *BKE_bvhtree_from_mesh_get(
if (data_cp.cached == false) {
int looptri_num = BKE_mesh_runtime_looptri_len(mesh);
/* this assert checks we have looptris,
- * if not caller should use DM_ensure_looptri() */
+ * if not caller should use DM_ensure_looptri() */
BLI_assert(!(looptri_num == 0 && mesh->totpoly != 0));
data_cp.tree = bvhtree_from_mesh_looptri_create_tree(
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index f65f1e684d6..54ce0d3a903 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -139,15 +139,10 @@ float BKE_camera_object_dof_distance(Object *ob)
if (ob->type != OB_CAMERA)
return 0.0f;
if (cam->dof_ob) {
-#if 0
- /* too simple, better to return the distance on the view axis only */
- return len_v3v3(ob->obmat[3], cam->dof_ob->obmat[3]);
-#else
float view_dir[3], dof_dir[3];
normalize_v3_v3(view_dir, ob->obmat[2]);
sub_v3_v3v3(dof_dir, ob->obmat[3], cam->dof_ob->obmat[3]);
return fabsf(dot_v3v3(view_dir, dof_dir));
-#endif
}
return cam->YF_dofdist;
}
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 3f50321b4d5..1c3b75b1771 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -99,7 +99,7 @@ static int cdDM_getNumTessFaces(DerivedMesh *dm)
* to help debug tessfaces issues since BMESH merge. */
#if 0
if (dm->numTessFaceData == 0 && dm->numPolyData != 0) {
- printf("%s: has no faces!, call DM_ensure_tessface() if you need them\n");
+ printf("%s: has no faces!\n");
}
#endif
return dm->numTessFaceData;
@@ -752,6 +752,8 @@ static void loops_to_customdata_corners(
}
}
+/* TODO(campbell): remove, use BKE_mesh_from_bmesh_for_eval_nomain instead. */
+
/* used for both editbmesh and bmesh */
static DerivedMesh *cddm_from_bmesh_ex(
struct BMesh *bm, const bool use_mdisps,
@@ -936,16 +938,13 @@ DerivedMesh *CDDM_from_editbmesh(BMEditMesh *em, const bool use_mdisps, const bo
use_tessface, em->tottri, (const BMLoop *(*)[3])em->looptris);
}
-static DerivedMesh *cddm_copy_ex(DerivedMesh *source,
- const bool need_tessface_data,
- const bool faces_from_tessfaces)
+DerivedMesh *CDDM_copy(DerivedMesh *source)
{
- const bool copy_tessface_data = (faces_from_tessfaces || need_tessface_data);
CDDerivedMesh *cddm = cdDM_create("CDDM_copy cddm");
DerivedMesh *dm = &cddm->dm;
int numVerts = source->numVertData;
int numEdges = source->numEdgeData;
- int numTessFaces = copy_tessface_data ? source->numTessFaceData : 0;
+ int numTessFaces = 0;
int numLoops = source->numLoopData;
int numPolys = source->numPolyData;
@@ -955,9 +954,6 @@ static DerivedMesh *cddm_copy_ex(DerivedMesh *source,
source->getVertDataArray(source, CD_ORIGINDEX);
source->getEdgeDataArray(source, CD_ORIGINDEX);
source->getPolyDataArray(source, CD_ORIGINDEX);
- if (copy_tessface_data) {
- source->getTessFaceDataArray(source, CD_ORIGINDEX);
- }
/* this initializes dm, and copies all non mvert/medge/mface layers */
DM_from_template(dm, source, DM_TYPE_CDDM, numVerts, numEdges, numTessFaces,
@@ -969,15 +965,10 @@ static DerivedMesh *cddm_copy_ex(DerivedMesh *source,
/* Tessellation data is never copied, so tag it here.
* Only tag dirty layers if we really ignored tessellation faces.
*/
- if (!copy_tessface_data) {
- dm->dirty |= DM_DIRTY_TESS_CDLAYERS;
- }
+ dm->dirty |= DM_DIRTY_TESS_CDLAYERS;
CustomData_copy_data(&source->vertData, &dm->vertData, 0, 0, numVerts);
CustomData_copy_data(&source->edgeData, &dm->edgeData, 0, 0, numEdges);
- if (copy_tessface_data) {
- CustomData_copy_data(&source->faceData, &dm->faceData, 0, 0, numTessFaces);
- }
/* now add mvert/medge/mface layers */
cddm->mvert = source->dupVertArray(source);
@@ -986,17 +977,7 @@ static DerivedMesh *cddm_copy_ex(DerivedMesh *source,
CustomData_add_layer(&dm->vertData, CD_MVERT, CD_ASSIGN, cddm->mvert, numVerts);
CustomData_add_layer(&dm->edgeData, CD_MEDGE, CD_ASSIGN, cddm->medge, numEdges);
- if (faces_from_tessfaces || copy_tessface_data) {
- cddm->mface = source->dupTessFaceArray(source);
- CustomData_add_layer(&dm->faceData, CD_MFACE, CD_ASSIGN, cddm->mface, numTessFaces);
- }
-
- if (!faces_from_tessfaces) {
- DM_DupPolys(source, dm);
- }
- else {
- CDDM_tessfaces_to_faces(dm);
- }
+ DM_DupPolys(source, dm);
cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
@@ -1004,21 +985,6 @@ static DerivedMesh *cddm_copy_ex(DerivedMesh *source,
return dm;
}
-DerivedMesh *CDDM_copy(DerivedMesh *source)
-{
- return cddm_copy_ex(source, false, false);
-}
-
-DerivedMesh *CDDM_copy_from_tessface(DerivedMesh *source)
-{
- return cddm_copy_ex(source, false, true);
-}
-
-DerivedMesh *CDDM_copy_with_tessface(DerivedMesh *source)
-{
- return cddm_copy_ex(source, true, false);
-}
-
/* note, the CD_ORIGINDEX layers are all 0, so if there is a direct
* relationship between mesh data this needs to be set by the caller. */
DerivedMesh *CDDM_from_template_ex(
@@ -1274,7 +1240,7 @@ void CDDM_calc_loop_normals_spacearr(
r_lnors_spacearr->lspacearr[i]->ref_beta, r_lnors_spacearr->lspacearr[i]->loops);
printf("\t\t(shared with loops");
while (loops) {
- printf(" %d", GET_INT_FROM_POINTER(loops->link));
+ printf(" %d", POINTER_AS_INT(loops->link));
loops = loops->next;
}
printf(")\n");
@@ -1287,815 +1253,6 @@ void CDDM_calc_loop_normals_spacearr(
#endif
}
-
-void CDDM_calc_normals_tessface(DerivedMesh *dm)
-{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- float (*face_nors)[3];
-
- if (dm->numVertData == 0) return;
-
- /* we don't want to overwrite any referenced layers */
- cddm->mvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
-
- /* fill in if it exists */
- face_nors = CustomData_get_layer(&dm->faceData, CD_NORMAL);
- if (!face_nors) {
- face_nors = CustomData_add_layer(&dm->faceData, CD_NORMAL, CD_CALLOC, NULL, dm->numTessFaceData);
- }
-
- BKE_mesh_calc_normals_tessface(cddm->mvert, dm->numVertData,
- cddm->mface, dm->numTessFaceData, face_nors);
-
- cddm->dm.dirty &= ~DM_DIRTY_NORMALS;
-}
-
-#if 1
-/* TODO(sybren): Delete everything in this #if block after we have ported the modifiers
- * to use Mesh instead of DerivedMesh. The code has been copied to mesh_merge.c and ported. */
-/**
- * Poly compare with vtargetmap
- * Function used by #CDDM_merge_verts.
- * The function compares poly_source after applying vtargetmap, with poly_target.
- * The two polys are identical if they share the same vertices in the same order, or in reverse order,
- * but starting position loopstart may be different.
- * The function is called with direct_reverse=1 for same order (i.e. same normal),
- * and may be called again with direct_reverse=-1 for reverse order.
- * \return 1 if polys are identical, 0 if polys are different.
- */
-static int cddm_poly_compare(
- MLoop *mloop_array,
- MPoly *mpoly_source, MPoly *mpoly_target,
- const int *vtargetmap, const int direct_reverse)
-{
- int vert_source, first_vert_source, vert_target;
- int i_loop_source;
- int i_loop_target, i_loop_target_start, i_loop_target_offset, i_loop_target_adjusted;
- bool compare_completed = false;
- bool same_loops = false;
-
- MLoop *mloop_source, *mloop_target;
-
- BLI_assert(direct_reverse == 1 || direct_reverse == -1);
-
- i_loop_source = 0;
- mloop_source = mloop_array + mpoly_source->loopstart;
- vert_source = mloop_source->v;
-
- if (vtargetmap[vert_source] != -1) {
- vert_source = vtargetmap[vert_source];
- }
- else {
- /* All source loop vertices should be mapped */
- BLI_assert(false);
- }
-
- /* Find same vertex within mpoly_target's loops */
- mloop_target = mloop_array + mpoly_target->loopstart;
- for (i_loop_target = 0; i_loop_target < mpoly_target->totloop; i_loop_target++, mloop_target++) {
- if (mloop_target->v == vert_source) {
- break;
- }
- }
-
- /* If same vertex not found, then polys cannot be equal */
- if (i_loop_target >= mpoly_target->totloop) {
- return false;
- }
-
- /* Now mloop_source and m_loop_target have one identical vertex */
- /* mloop_source is at position 0, while m_loop_target has advanced to find identical vertex */
- /* Go around the loop and check that all vertices match in same order */
- /* Skipping source loops when consecutive source vertices are mapped to same target vertex */
-
- i_loop_target_start = i_loop_target;
- i_loop_target_offset = 0;
- first_vert_source = vert_source;
-
- compare_completed = false;
- same_loops = false;
-
- while (!compare_completed) {
-
- vert_target = mloop_target->v;
-
- /* First advance i_loop_source, until it points to different vertex, after mapping applied */
- do {
- i_loop_source++;
-
- if (i_loop_source == mpoly_source->totloop) {
- /* End of loops for source, must match end of loop for target. */
- if (i_loop_target_offset == mpoly_target->totloop - 1) {
- compare_completed = true;
- same_loops = true;
- break; /* Polys are identical */
- }
- else {
- compare_completed = true;
- same_loops = false;
- break; /* Polys are different */
- }
- }
-
- mloop_source++;
- vert_source = mloop_source->v;
-
- if (vtargetmap[vert_source] != -1) {
- vert_source = vtargetmap[vert_source];
- }
- else {
- /* All source loop vertices should be mapped */
- BLI_assert(false);
- }
-
- } while (vert_source == vert_target);
-
- if (compare_completed) {
- break;
- }
-
- /* Now advance i_loop_target as well */
- i_loop_target_offset++;
-
- if (i_loop_target_offset == mpoly_target->totloop) {
- /* End of loops for target only, that means no match */
- /* except if all remaining source vertices are mapped to first target */
- for (; i_loop_source < mpoly_source->totloop; i_loop_source++, mloop_source++) {
- vert_source = vtargetmap[mloop_source->v];
- if (vert_source != first_vert_source) {
- compare_completed = true;
- same_loops = false;
- break;
- }
- }
- if (!compare_completed) {
- same_loops = true;
- }
- break;
- }
-
- /* Adjust i_loop_target for cycling around and for direct/reverse order defined by delta = +1 or -1 */
- i_loop_target_adjusted = (i_loop_target_start + direct_reverse * i_loop_target_offset) % mpoly_target->totloop;
- if (i_loop_target_adjusted < 0) {
- i_loop_target_adjusted += mpoly_target->totloop;
- }
- mloop_target = mloop_array + mpoly_target->loopstart + i_loop_target_adjusted;
- vert_target = mloop_target->v;
-
- if (vert_target != vert_source) {
- same_loops = false; /* Polys are different */
- break;
- }
- }
- return same_loops;
-}
-
-/* Utility stuff for using GHash with polys */
-
-typedef struct PolyKey {
- int poly_index; /* index of the MPoly within the derived mesh */
- int totloops; /* number of loops in the poly */
- unsigned int hash_sum; /* Sum of all vertices indices */
- unsigned int hash_xor; /* Xor of all vertices indices */
-} PolyKey;
-
-
-static unsigned int poly_gset_hash_fn(const void *key)
-{
- const PolyKey *pk = key;
- return pk->hash_sum;
-}
-
-static bool poly_gset_compare_fn(const void *k1, const void *k2)
-{
- const PolyKey *pk1 = k1;
- const PolyKey *pk2 = k2;
- if ((pk1->hash_sum == pk2->hash_sum) &&
- (pk1->hash_xor == pk2->hash_xor) &&
- (pk1->totloops == pk2->totloops))
- {
- /* Equality - note that this does not mean equality of polys */
- return false;
- }
- else {
- return true;
- }
-}
-
-/**
- * Merge Verts
- *
- * This frees dm, and returns a new one.
- *
- * \param vtargetmap The table that maps vertices to target vertices. a value of -1
- * indicates a vertex is a target, and is to be kept.
- * This array is aligned with 'dm->numVertData'
- * \warning \a vtargetmap must **not** contain any chained mapping (v1 -> v2 -> v3 etc.), this is not supported
- * and will likely generate corrupted geometry.
- *
- * \param tot_vtargetmap The number of non '-1' values in vtargetmap. (not the size)
- *
- * \param merge_mode enum with two modes.
- * - #CDDM_MERGE_VERTS_DUMP_IF_MAPPED
- * When called by the Mirror Modifier,
- * In this mode it skips any faces that have all vertices merged (to avoid creating pairs
- * of faces sharing the same set of vertices)
- * - #CDDM_MERGE_VERTS_DUMP_IF_EQUAL
- * When called by the Array Modifier,
- * In this mode, faces where all vertices are merged are double-checked,
- * to see whether all target vertices actually make up a poly already.
- * Indeed it could be that all of a poly's vertices are merged,
- * but merged to vertices that do not make up a single poly,
- * in which case the original poly should not be dumped.
- * Actually this later behavior could apply to the Mirror Modifier as well, but the additional checks are
- * costly and not necessary in the case of mirror, because each vertex is only merged to its own mirror.
- *
- * \note #CDDM_recalc_tessellation has to run on the returned DM if you want to access tessfaces.
- */
-DerivedMesh *CDDM_merge_verts(DerivedMesh *dm, const int *vtargetmap, const int tot_vtargetmap, const int merge_mode)
-{
-// This was commented out back in 2013, see commit f45d8827bafe6b9eaf9de42f4054e9d84a21955d.
-// #define USE_LOOPS
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- CDDerivedMesh *cddm2 = NULL;
-
- const int totvert = dm->numVertData;
- const int totedge = dm->numEdgeData;
- const int totloop = dm->numLoopData;
- const int totpoly = dm->numPolyData;
-
- const int totvert_final = totvert - tot_vtargetmap;
-
- MVert *mv, *mvert = MEM_malloc_arrayN(totvert_final, sizeof(*mvert), __func__);
- int *oldv = MEM_malloc_arrayN(totvert_final, sizeof(*oldv), __func__);
- int *newv = MEM_malloc_arrayN(totvert, sizeof(*newv), __func__);
- STACK_DECLARE(mvert);
- STACK_DECLARE(oldv);
-
- /* Note: create (totedge + totloop) elements because partially invalid polys due to merge may require
- * generating new edges, and while in 99% cases we'll still end with less final edges than totedge,
- * cases can be forged that would end requiring more... */
- MEdge *med, *medge = MEM_malloc_arrayN((totedge + totloop), sizeof(*medge), __func__);
- int *olde = MEM_malloc_arrayN((totedge + totloop), sizeof(*olde), __func__);
- int *newe = MEM_malloc_arrayN((totedge + totloop), sizeof(*newe), __func__);
- STACK_DECLARE(medge);
- STACK_DECLARE(olde);
-
- MLoop *ml, *mloop = MEM_malloc_arrayN(totloop, sizeof(*mloop), __func__);
- int *oldl = MEM_malloc_arrayN(totloop, sizeof(*oldl), __func__);
-#ifdef USE_LOOPS
- int *newl = MEM_malloc_arrayN(totloop, sizeof(*newl), __func__);
-#endif
- STACK_DECLARE(mloop);
- STACK_DECLARE(oldl);
-
- MPoly *mp, *mpoly = MEM_malloc_arrayN(totpoly, sizeof(*medge), __func__);
- int *oldp = MEM_malloc_arrayN(totpoly, sizeof(*oldp), __func__);
- STACK_DECLARE(mpoly);
- STACK_DECLARE(oldp);
-
- EdgeHash *ehash = BLI_edgehash_new_ex(__func__, totedge);
-
- int i, j, c;
-
- PolyKey *poly_keys;
- GSet *poly_gset = NULL;
-
- STACK_INIT(oldv, totvert_final);
- STACK_INIT(olde, totedge);
- STACK_INIT(oldl, totloop);
- STACK_INIT(oldp, totpoly);
-
- STACK_INIT(mvert, totvert_final);
- STACK_INIT(medge, totedge);
- STACK_INIT(mloop, totloop);
- STACK_INIT(mpoly, totpoly);
-
- /* fill newv with destination vertex indices */
- mv = cddm->mvert;
- c = 0;
- for (i = 0; i < totvert; i++, mv++) {
- if (vtargetmap[i] == -1) {
- STACK_PUSH(oldv, i);
- STACK_PUSH(mvert, *mv);
- newv[i] = c++;
- }
- else {
- /* dummy value */
- newv[i] = 0;
- }
- }
-
- /* now link target vertices to destination indices */
- for (i = 0; i < totvert; i++) {
- if (vtargetmap[i] != -1) {
- newv[i] = newv[vtargetmap[i]];
- }
- }
-
- /* Don't remap vertices in cddm->mloop, because we need to know the original
- * indices in order to skip faces with all vertices merged.
- * The "update loop indices..." section further down remaps vertices in mloop.
- */
-
- /* now go through and fix edges and faces */
- med = cddm->medge;
- c = 0;
- for (i = 0; i < totedge; i++, med++) {
- const unsigned int v1 = (vtargetmap[med->v1] != -1) ? vtargetmap[med->v1] : med->v1;
- const unsigned int v2 = (vtargetmap[med->v2] != -1) ? vtargetmap[med->v2] : med->v2;
- if (LIKELY(v1 != v2)) {
- void **val_p;
-
- if (BLI_edgehash_ensure_p(ehash, v1, v2, &val_p)) {
- newe[i] = GET_INT_FROM_POINTER(*val_p);
- }
- else {
- STACK_PUSH(olde, i);
- STACK_PUSH(medge, *med);
- newe[i] = c;
- *val_p = SET_INT_IN_POINTER(c);
- c++;
- }
- }
- else {
- newe[i] = -1;
- }
- }
-
- if (merge_mode == CDDM_MERGE_VERTS_DUMP_IF_EQUAL) {
- /* In this mode, we need to determine, whenever a poly' vertices are all mapped */
- /* if the targets already make up a poly, in which case the new poly is dropped */
- /* This poly equality check is rather complex. We use a BLI_ghash to speed it up with a first level check */
- PolyKey *mpgh;
- poly_keys = MEM_malloc_arrayN(totpoly, sizeof(PolyKey), __func__);
- poly_gset = BLI_gset_new_ex(poly_gset_hash_fn, poly_gset_compare_fn, __func__, totpoly);
- /* Duplicates allowed because our compare function is not pure equality */
- BLI_gset_flag_set(poly_gset, GHASH_FLAG_ALLOW_DUPES);
-
- mp = cddm->mpoly;
- mpgh = poly_keys;
- for (i = 0; i < totpoly; i++, mp++, mpgh++) {
- mpgh->poly_index = i;
- mpgh->totloops = mp->totloop;
- ml = cddm->mloop + mp->loopstart;
- mpgh->hash_sum = mpgh->hash_xor = 0;
- for (j = 0; j < mp->totloop; j++, ml++) {
- mpgh->hash_sum += ml->v;
- mpgh->hash_xor ^= ml->v;
- }
- BLI_gset_insert(poly_gset, mpgh);
- }
-
- if (cddm->pmap) {
- MEM_freeN(cddm->pmap);
- MEM_freeN(cddm->pmap_mem);
- }
- /* 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. */
- BKE_mesh_vert_poly_map_create(&cddm->pmap, &cddm->pmap_mem,
- cddm->mpoly, cddm->mloop,
- totvert, totpoly, totloop);
- } /* done preparing for fast poly compare */
-
-
- mp = cddm->mpoly;
- mv = cddm->mvert;
- for (i = 0; i < totpoly; i++, mp++) {
- MPoly *mp_new;
-
- ml = cddm->mloop + mp->loopstart;
-
- /* check faces with all vertices merged */
- bool all_vertices_merged = true;
-
- for (j = 0; j < mp->totloop; j++, ml++) {
- if (vtargetmap[ml->v] == -1) {
- all_vertices_merged = false;
- /* This will be used to check for poly using several time the same vert. */
- mv[ml->v].flag &= ~ME_VERT_TMP_TAG;
- }
- else {
- /* This will be used to check for poly using several time the same vert. */
- mv[vtargetmap[ml->v]].flag &= ~ME_VERT_TMP_TAG;
- }
- }
-
- if (UNLIKELY(all_vertices_merged)) {
- if (merge_mode == CDDM_MERGE_VERTS_DUMP_IF_MAPPED) {
- /* In this mode, all vertices merged is enough to dump face */
- continue;
- }
- else if (merge_mode == CDDM_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 */
- int i_poly, v_target;
- bool found = false;
- PolyKey pkey;
-
- /* Use poly_gset for fast (although not 100% certain) identification of same poly */
- /* First, make up a poly_summary structure */
- ml = cddm->mloop + mp->loopstart;
- pkey.hash_sum = pkey.hash_xor = 0;
- pkey.totloops = 0;
- for (j = 0; j < mp->totloop; j++, ml++) {
- v_target = vtargetmap[ml->v]; /* Cannot be -1, they are all mapped */
- pkey.hash_sum += v_target;
- pkey.hash_xor ^= v_target;
- pkey.totloops++;
- }
- if (BLI_gset_haskey(poly_gset, &pkey)) {
-
- /* There might be a poly that matches this one.
- * We could just leave it there and say there is, and do a "continue".
- * ... but we are checking whether there is an exact poly match.
- * It's not so costly in terms of CPU since it's very rare, just a lot of complex code.
- */
-
- /* Consider current loop again */
- ml = cddm->mloop + mp->loopstart;
- /* Consider the target of the loop's first vert */
- v_target = vtargetmap[ml->v];
- /* Now see if v_target belongs to a poly that shares all vertices with source poly,
- * in same order, or reverse order */
-
- for (i_poly = 0; i_poly < cddm->pmap[v_target].count; i_poly++) {
- MPoly *target_poly = cddm->mpoly + *(cddm->pmap[v_target].indices + i_poly);
-
- if (cddm_poly_compare(cddm->mloop, mp, target_poly, vtargetmap, +1) ||
- cddm_poly_compare(cddm->mloop, mp, target_poly, vtargetmap, -1))
- {
- found = true;
- break;
- }
- }
- if (found) {
- /* Current poly's vertices are mapped to a poly that is strictly identical */
- /* Current poly is dumped */
- continue;
- }
- }
- }
- }
-
-
- /* Here either the poly's vertices were not all merged
- * or they were all merged, but targets do not make up an identical poly,
- * the poly is retained.
- */
- ml = cddm->mloop + mp->loopstart;
-
- c = 0;
- MLoop *last_valid_ml = NULL;
- MLoop *first_valid_ml = NULL;
- bool need_edge_from_last_valid_ml = false;
- bool need_edge_to_first_valid_ml = false;
- int created_edges = 0;
- for (j = 0; j < mp->totloop; j++, ml++) {
- const uint mlv = (vtargetmap[ml->v] != -1) ? vtargetmap[ml->v] : ml->v;
-#ifndef NDEBUG
- {
- MLoop *next_ml = cddm->mloop + mp->loopstart + ((j + 1) % mp->totloop);
- uint next_mlv = (vtargetmap[next_ml->v] != -1) ? vtargetmap[next_ml->v] : next_ml->v;
- med = cddm->medge + ml->e;
- uint v1 = (vtargetmap[med->v1] != -1) ? vtargetmap[med->v1] : med->v1;
- uint v2 = (vtargetmap[med->v2] != -1) ? vtargetmap[med->v2] : med->v2;
- BLI_assert((mlv == v1 && next_mlv == v2) || (mlv == v2 && next_mlv == v1));
- }
-#endif
- /* A loop is only valid if its matching edge is, and it's not reusing a vertex already used by this poly. */
- if (LIKELY((newe[ml->e] != -1) && ((mv[mlv].flag & ME_VERT_TMP_TAG) == 0))) {
- mv[mlv].flag |= ME_VERT_TMP_TAG;
-
- if (UNLIKELY(last_valid_ml != NULL && need_edge_from_last_valid_ml)) {
- /* We need to create a new edge between last valid loop and this one! */
- void **val_p;
-
- uint v1 = (vtargetmap[last_valid_ml->v] != -1) ? vtargetmap[last_valid_ml->v] : last_valid_ml->v;
- uint v2 = mlv;
- BLI_assert(v1 != v2);
- if (BLI_edgehash_ensure_p(ehash, v1, v2, &val_p)) {
- last_valid_ml->e = GET_INT_FROM_POINTER(*val_p);
- }
- else {
- const int new_eidx = STACK_SIZE(medge);
- STACK_PUSH(olde, olde[last_valid_ml->e]);
- STACK_PUSH(medge, cddm->medge[last_valid_ml->e]);
- medge[new_eidx].v1 = last_valid_ml->v;
- medge[new_eidx].v2 = ml->v;
- /* DO NOT change newe mapping, could break actual values due to some deleted original edges. */
- *val_p = SET_INT_IN_POINTER(new_eidx);
- created_edges++;
-
- last_valid_ml->e = new_eidx;
- }
- need_edge_from_last_valid_ml = false;
- }
-
-#ifdef USE_LOOPS
- newl[j + mp->loopstart] = STACK_SIZE(mloop);
-#endif
- STACK_PUSH(oldl, j + mp->loopstart);
- last_valid_ml = STACK_PUSH_RET_PTR(mloop);
- *last_valid_ml = *ml;
- if (first_valid_ml == NULL) {
- first_valid_ml = last_valid_ml;
- }
- c++;
-
- /* We absolutely HAVE to handle edge index remapping here, otherwise potential newly created edges
- * in that part of code make remapping later totally unreliable. */
- BLI_assert(newe[ml->e] != -1);
- last_valid_ml->e = newe[ml->e];
- }
- else {
- if (last_valid_ml != NULL) {
- need_edge_from_last_valid_ml = true;
- }
- else {
- need_edge_to_first_valid_ml = true;
- }
- }
- }
- if (UNLIKELY(last_valid_ml != NULL && !ELEM(first_valid_ml, NULL, last_valid_ml) &&
- (need_edge_to_first_valid_ml || need_edge_from_last_valid_ml)))
- {
- /* We need to create a new edge between last valid loop and first valid one! */
- void **val_p;
-
- uint v1 = (vtargetmap[last_valid_ml->v] != -1) ? vtargetmap[last_valid_ml->v] : last_valid_ml->v;
- uint v2 = (vtargetmap[first_valid_ml->v] != -1) ? vtargetmap[first_valid_ml->v] : first_valid_ml->v;
- BLI_assert(v1 != v2);
- if (BLI_edgehash_ensure_p(ehash, v1, v2, &val_p)) {
- last_valid_ml->e = GET_INT_FROM_POINTER(*val_p);
- }
- else {
- const int new_eidx = STACK_SIZE(medge);
- STACK_PUSH(olde, olde[last_valid_ml->e]);
- STACK_PUSH(medge, cddm->medge[last_valid_ml->e]);
- medge[new_eidx].v1 = last_valid_ml->v;
- medge[new_eidx].v2 = first_valid_ml->v;
- /* DO NOT change newe mapping, could break actual values due to some deleted original edges. */
- *val_p = SET_INT_IN_POINTER(new_eidx);
- created_edges++;
-
- last_valid_ml->e = new_eidx;
- }
- need_edge_to_first_valid_ml = need_edge_from_last_valid_ml = false;
- }
-
- if (UNLIKELY(c == 0)) {
- BLI_assert(created_edges == 0);
- continue;
- }
- else if (UNLIKELY(c < 3)) {
- STACK_DISCARD(oldl, c);
- STACK_DISCARD(mloop, c);
- if (created_edges > 0) {
- for (j = STACK_SIZE(medge) - created_edges; j < STACK_SIZE(medge); j++) {
- BLI_edgehash_remove(ehash, medge[j].v1, medge[j].v2, NULL);
- }
- STACK_DISCARD(olde, created_edges);
- STACK_DISCARD(medge, created_edges);
- }
- continue;
- }
-
- mp_new = STACK_PUSH_RET_PTR(mpoly);
- *mp_new = *mp;
- mp_new->totloop = c;
- BLI_assert(mp_new->totloop >= 3);
- mp_new->loopstart = STACK_SIZE(mloop) - c;
-
- STACK_PUSH(oldp, i);
- } /* end of the loop that tests polys */
-
-
- if (poly_gset) {
- // printf("hash quality %.6f\n", BLI_gset_calc_quality(poly_gset));
-
- BLI_gset_free(poly_gset, NULL);
- MEM_freeN(poly_keys);
- }
-
- /*create new cddm*/
- cddm2 = (CDDerivedMesh *)CDDM_from_template(
- (DerivedMesh *)cddm, STACK_SIZE(mvert), STACK_SIZE(medge), 0, STACK_SIZE(mloop), STACK_SIZE(mpoly));
-
- /*update edge indices and copy customdata*/
- med = medge;
- for (i = 0; i < cddm2->dm.numEdgeData; i++, med++) {
- BLI_assert(newv[med->v1] != -1);
- med->v1 = newv[med->v1];
- BLI_assert(newv[med->v2] != -1);
- med->v2 = newv[med->v2];
-
- /* Can happen in case vtargetmap contains some double chains, we do not support that. */
- BLI_assert(med->v1 != med->v2);
-
- CustomData_copy_data(&dm->edgeData, &cddm2->dm.edgeData, olde[i], i, 1);
- }
-
- /*update loop indices and copy customdata*/
- ml = mloop;
- for (i = 0; i < cddm2->dm.numLoopData; i++, ml++) {
- /* Edge remapping has already be done in main loop handling part above. */
- BLI_assert(newv[ml->v] != -1);
- ml->v = newv[ml->v];
-
- CustomData_copy_data(&dm->loopData, &cddm2->dm.loopData, oldl[i], i, 1);
- }
-
- /*copy vertex customdata*/
- mv = mvert;
- for (i = 0; i < cddm2->dm.numVertData; i++, mv++) {
- CustomData_copy_data(&dm->vertData, &cddm2->dm.vertData, oldv[i], i, 1);
- }
-
- /*copy poly customdata*/
- mp = mpoly;
- for (i = 0; i < cddm2->dm.numPolyData; i++, mp++) {
- CustomData_copy_data(&dm->polyData, &cddm2->dm.polyData, oldp[i], i, 1);
- }
-
- /*copy over data. CustomData_add_layer can do this, need to look it up.*/
- memcpy(cddm2->mvert, mvert, sizeof(MVert) * STACK_SIZE(mvert));
- memcpy(cddm2->medge, medge, sizeof(MEdge) * STACK_SIZE(medge));
- memcpy(cddm2->mloop, mloop, sizeof(MLoop) * STACK_SIZE(mloop));
- memcpy(cddm2->mpoly, mpoly, sizeof(MPoly) * STACK_SIZE(mpoly));
-
- MEM_freeN(mvert);
- MEM_freeN(medge);
- MEM_freeN(mloop);
- MEM_freeN(mpoly);
-
- MEM_freeN(newv);
- MEM_freeN(newe);
-#ifdef USE_LOOPS
- MEM_freeN(newl);
-#endif
-
- MEM_freeN(oldv);
- MEM_freeN(olde);
- MEM_freeN(oldl);
- MEM_freeN(oldp);
-
- BLI_edgehash_free(ehash, NULL);
-
- /*free old derivedmesh*/
- dm->needsFree = 1;
- dm->release(dm);
-
- return (DerivedMesh *)cddm2;
-}
-#endif
-
-void CDDM_calc_edges_tessface(DerivedMesh *dm)
-{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- CustomData edgeData;
- EdgeSetIterator *ehi;
- MFace *mf = cddm->mface;
- MEdge *med;
- EdgeSet *eh;
- int i, *index, numEdges, numFaces = dm->numTessFaceData;
-
- eh = BLI_edgeset_new_ex(__func__, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(numFaces));
-
- for (i = 0; i < numFaces; i++, mf++) {
- BLI_edgeset_add(eh, mf->v1, mf->v2);
- BLI_edgeset_add(eh, mf->v2, mf->v3);
-
- if (mf->v4) {
- BLI_edgeset_add(eh, mf->v3, mf->v4);
- BLI_edgeset_add(eh, mf->v4, mf->v1);
- }
- else {
- BLI_edgeset_add(eh, mf->v3, mf->v1);
- }
- }
-
- numEdges = BLI_edgeset_len(eh);
-
- /* write new edges into a temporary CustomData */
- CustomData_reset(&edgeData);
- CustomData_add_layer(&edgeData, CD_MEDGE, CD_CALLOC, NULL, numEdges);
- CustomData_add_layer(&edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, numEdges);
-
- med = CustomData_get_layer(&edgeData, CD_MEDGE);
- index = CustomData_get_layer(&edgeData, CD_ORIGINDEX);
-
- for (ehi = BLI_edgesetIterator_new(eh), i = 0;
- BLI_edgesetIterator_isDone(ehi) == false;
- BLI_edgesetIterator_step(ehi), i++, med++, index++)
- {
- BLI_edgesetIterator_getKey(ehi, &med->v1, &med->v2);
-
- med->flag = ME_EDGEDRAW | ME_EDGERENDER;
- *index = ORIGINDEX_NONE;
- }
- BLI_edgesetIterator_free(ehi);
-
- /* free old CustomData and assign new one */
- CustomData_free(&dm->edgeData, dm->numEdgeData);
- dm->edgeData = edgeData;
- dm->numEdgeData = numEdges;
-
- cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
-
- BLI_edgeset_free(eh);
-}
-
-/* warning, this uses existing edges but CDDM_calc_edges_tessface() doesn't */
-void CDDM_calc_edges(DerivedMesh *dm)
-{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- CustomData edgeData;
- EdgeHashIterator *ehi;
- MPoly *mp = cddm->mpoly;
- MLoop *ml;
- MEdge *med, *origmed;
- EdgeHash *eh;
- unsigned int eh_reserve;
- int v1, v2;
- const int *eindex;
- int i, j, *index;
- const int numFaces = dm->numPolyData;
- const int numLoops = dm->numLoopData;
- int numEdges = dm->numEdgeData;
-
- eindex = DM_get_edge_data_layer(dm, CD_ORIGINDEX);
- med = cddm->medge;
-
- eh_reserve = max_ii(med ? numEdges : 0, BLI_EDGEHASH_SIZE_GUESS_FROM_LOOPS(numLoops));
- eh = BLI_edgehash_new_ex(__func__, eh_reserve);
- if (med) {
- for (i = 0; i < numEdges; i++, med++) {
- BLI_edgehash_insert(eh, med->v1, med->v2, SET_INT_IN_POINTER(i + 1));
- }
- }
-
- for (i = 0; i < numFaces; i++, mp++) {
- ml = cddm->mloop + mp->loopstart;
- for (j = 0; j < mp->totloop; j++, ml++) {
- v1 = ml->v;
- v2 = ME_POLY_LOOP_NEXT(cddm->mloop, mp, j)->v;
- BLI_edgehash_reinsert(eh, v1, v2, NULL);
- }
- }
-
- numEdges = BLI_edgehash_len(eh);
-
- /* write new edges into a temporary CustomData */
- CustomData_reset(&edgeData);
- CustomData_add_layer(&edgeData, CD_MEDGE, CD_CALLOC, NULL, numEdges);
- CustomData_add_layer(&edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, numEdges);
-
- origmed = cddm->medge;
- med = CustomData_get_layer(&edgeData, CD_MEDGE);
- index = CustomData_get_layer(&edgeData, CD_ORIGINDEX);
-
- for (ehi = BLI_edgehashIterator_new(eh), i = 0;
- BLI_edgehashIterator_isDone(ehi) == false;
- BLI_edgehashIterator_step(ehi), ++i, ++med, ++index)
- {
- BLI_edgehashIterator_getKey(ehi, &med->v1, &med->v2);
- j = GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
-
- if (j == 0 || !eindex) {
- med->flag = ME_EDGEDRAW | ME_EDGERENDER;
- *index = ORIGINDEX_NONE;
- }
- else {
- med->flag = ME_EDGEDRAW | ME_EDGERENDER | origmed[j - 1].flag;
- *index = eindex[j - 1];
- }
-
- BLI_edgehashIterator_setValue(ehi, SET_INT_IN_POINTER(i));
- }
- BLI_edgehashIterator_free(ehi);
-
- /* free old CustomData and assign new one */
- CustomData_free(&dm->edgeData, dm->numEdgeData);
- dm->edgeData = edgeData;
- dm->numEdgeData = numEdges;
-
- cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
-
- mp = cddm->mpoly;
- for (i = 0; i < numFaces; i++, mp++) {
- ml = cddm->mloop + mp->loopstart;
- for (j = 0; j < mp->totloop; j++, ml++) {
- v1 = ml->v;
- v2 = ME_POLY_LOOP_NEXT(cddm->mloop, mp, j)->v;
- ml->e = GET_INT_FROM_POINTER(BLI_edgehash_lookup(eh, v1, v2));
- }
- }
-
- BLI_edgehash_free(eh, NULL);
-}
-
void CDDM_lower_num_verts(DerivedMesh *dm, int numVerts)
{
BLI_assert(numVerts >= 0);
@@ -2195,20 +1352,6 @@ MPoly *CDDM_get_polys(DerivedMesh *dm)
return ((CDDerivedMesh *)dm)->mpoly;
}
-void CDDM_tessfaces_to_faces(DerivedMesh *dm)
-{
- /* converts mfaces to mpolys/mloops */
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
-
- BKE_mesh_convert_mfaces_to_mpolys_ex(
- NULL, &cddm->dm.faceData, &cddm->dm.loopData, &cddm->dm.polyData,
- cddm->dm.numEdgeData, cddm->dm.numTessFaceData,
- cddm->dm.numLoopData, cddm->dm.numPolyData,
- cddm->medge, cddm->mface,
- &cddm->dm.numLoopData, &cddm->dm.numPolyData,
- &cddm->mloop, &cddm->mpoly);
-}
-
void CDDM_set_mvert(DerivedMesh *dm, MVert *mvert)
{
CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index caf5b94b30e..fded9580681 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -68,6 +68,12 @@ static void cloth_update_spring_lengths( ClothModifierData *clmd, Mesh *mesh );
static int cloth_build_springs ( ClothModifierData *clmd, Mesh *mesh );
static void cloth_apply_vgroup ( ClothModifierData *clmd, Mesh *mesh );
+typedef struct BendSpringRef {
+ int index;
+ int polys;
+ ClothSpring *spring;
+} BendSpringRef;
+
/******************************************************************************
*
* External interface called by modifier.c clothModifier functions.
@@ -85,13 +91,18 @@ void cloth_init(ClothModifierData *clmd )
clmd->sim_parms->gravity[0] = 0.0;
clmd->sim_parms->gravity[1] = 0.0;
clmd->sim_parms->gravity[2] = -9.81;
- clmd->sim_parms->structural = 15.0;
- clmd->sim_parms->max_struct = 15.0;
- clmd->sim_parms->shear = 15.0;
+ clmd->sim_parms->tension = 15.0;
+ clmd->sim_parms->max_tension = 15.0;
+ clmd->sim_parms->compression = 15.0;
+ clmd->sim_parms->max_compression = 15.0;
+ clmd->sim_parms->shear = 5.0;
+ clmd->sim_parms->max_shear = 5.0;
clmd->sim_parms->bending = 0.5;
clmd->sim_parms->max_bend = 0.5;
+ clmd->sim_parms->tension_damp = 5.0;
+ clmd->sim_parms->compression_damp = 5.0;
+ clmd->sim_parms->shear_damp = 5.0;
clmd->sim_parms->bending_damping = 0.5;
- clmd->sim_parms->Cdis = 5.0;
clmd->sim_parms->Cvi = 1.0;
clmd->sim_parms->mass = 0.3f;
clmd->sim_parms->stepsPerFrame = 5;
@@ -106,7 +117,6 @@ void cloth_init(ClothModifierData *clmd )
clmd->sim_parms->timescale = 1.0f; /* speed factor, describes how fast cloth moves */
clmd->sim_parms->time_scale = 1.0f; /* multiplies cloth speed */
clmd->sim_parms->reset = 0;
- clmd->sim_parms->vel_damping = 1.0f; /* 1.0 = no damping, 0.0 = fully dampened */
clmd->coll_parms->self_friction = 5.0;
clmd->coll_parms->friction = 5.0;
@@ -114,8 +124,7 @@ void cloth_init(ClothModifierData *clmd )
clmd->coll_parms->epsilon = 0.015f;
clmd->coll_parms->flags = CLOTH_COLLSETTINGS_FLAG_ENABLED;
clmd->coll_parms->collision_list = NULL;
- clmd->coll_parms->self_loop_count = 1.0;
- clmd->coll_parms->selfepsilon = 0.75;
+ clmd->coll_parms->selfepsilon = 0.015;
clmd->coll_parms->vgroup_selfcol = 0;
/* These defaults are copied from softbody.c's
@@ -134,6 +143,8 @@ void cloth_init(ClothModifierData *clmd )
clmd->sim_parms->voxel_cell_size = 0.1f;
+ clmd->sim_parms->bending_model = CLOTH_BENDING_ANGULAR;
+
if (!clmd->sim_parms->effector_weights)
clmd->sim_parms->effector_weights = BKE_add_effector_weights(NULL);
@@ -141,44 +152,6 @@ void cloth_init(ClothModifierData *clmd )
clmd->point_cache->step = 1;
}
-static BVHTree *bvhselftree_build_from_cloth (ClothModifierData *clmd, float epsilon)
-{
- unsigned int i;
- BVHTree *bvhtree;
- Cloth *cloth;
- ClothVertex *verts;
-
- if (!clmd)
- return NULL;
-
- cloth = clmd->clothObject;
-
- if (!cloth)
- return NULL;
-
- verts = cloth->verts;
-
- /* in the moment, return zero if no faces there */
- if (!cloth->mvert_num)
- return NULL;
-
- /* create quadtree with k=26 */
- bvhtree = BLI_bvhtree_new(cloth->mvert_num, epsilon, 4, 6);
-
- /* fill tree */
- for (i = 0; i < cloth->mvert_num; i++, verts++) {
- const float *co;
- co = verts->xold;
-
- BLI_bvhtree_insert(bvhtree, i, co, 1);
- }
-
- /* balance tree */
- BLI_bvhtree_balance(bvhtree);
-
- return bvhtree;
-}
-
static BVHTree *bvhtree_build_from_cloth (ClothModifierData *clmd, float epsilon)
{
unsigned int i;
@@ -222,14 +195,21 @@ static BVHTree *bvhtree_build_from_cloth (ClothModifierData *clmd, float epsilon
return bvhtree;
}
-void bvhtree_update_from_cloth(ClothModifierData *clmd, bool moving)
+void bvhtree_update_from_cloth(ClothModifierData *clmd, bool moving, bool self)
{
unsigned int i = 0;
Cloth *cloth = clmd->clothObject;
- BVHTree *bvhtree = cloth->bvhtree;
+ BVHTree *bvhtree;
ClothVertex *verts = cloth->verts;
const MVertTri *vt;
+ if (self) {
+ bvhtree = cloth->bvhselftree;
+ }
+ else {
+ bvhtree = cloth->bvhtree;
+ }
+
if (!bvhtree)
return;
@@ -241,12 +221,12 @@ void bvhtree_update_from_cloth(ClothModifierData *clmd, bool moving)
float co[3][3], co_moving[3][3];
bool ret;
- copy_v3_v3(co[0], verts[vt->tri[0]].txold);
- copy_v3_v3(co[1], verts[vt->tri[1]].txold);
- copy_v3_v3(co[2], verts[vt->tri[2]].txold);
-
/* copy new locations into array */
if (moving) {
+ copy_v3_v3(co[0], verts[vt->tri[0]].txold);
+ copy_v3_v3(co[1], verts[vt->tri[1]].txold);
+ copy_v3_v3(co[2], verts[vt->tri[2]].txold);
+
/* update moving positions */
copy_v3_v3(co_moving[0], verts[vt->tri[0]].tx);
copy_v3_v3(co_moving[1], verts[vt->tri[1]].tx);
@@ -255,48 +235,11 @@ void bvhtree_update_from_cloth(ClothModifierData *clmd, bool moving)
ret = BLI_bvhtree_update_node(bvhtree, i, co[0], co_moving[0], 3);
}
else {
- ret = BLI_bvhtree_update_node(bvhtree, i, co[0], NULL, 3);
- }
+ copy_v3_v3(co[0], verts[vt->tri[0]].tx);
+ copy_v3_v3(co[1], verts[vt->tri[1]].tx);
+ copy_v3_v3(co[2], verts[vt->tri[2]].tx);
- /* check if tree is already full */
- if (ret == false) {
- break;
- }
- }
-
- BLI_bvhtree_update_tree(bvhtree);
- }
-}
-
-void bvhselftree_update_from_cloth(ClothModifierData *clmd, bool moving)
-{
- unsigned int i = 0;
- Cloth *cloth = clmd->clothObject;
- BVHTree *bvhtree = cloth->bvhselftree;
- ClothVertex *verts = cloth->verts;
- const MVertTri *vt;
-
- if (!bvhtree)
- return;
-
- vt = cloth->tri;
-
- /* update vertex position in bvh tree */
- if (verts && vt) {
- for (i = 0; i < cloth->mvert_num; i++, verts++) {
- const float *co, *co_moving;
- bool ret;
-
- co = verts->txold;
-
- /* copy new locations into array */
- if (moving) {
- /* update moving positions */
- co_moving = verts->tx;
- ret = BLI_bvhtree_update_node(bvhtree, i, co, co_moving, 1);
- }
- else {
- ret = BLI_bvhtree_update_node(bvhtree, i, co, NULL, 1);
+ ret = BLI_bvhtree_update_node(bvhtree, i, co[0], NULL, 3);
}
/* check if tree is already full */
@@ -345,6 +288,7 @@ static int do_init_cloth(Object *ob, ClothModifierData *clmd, Mesh *result, int
BKE_cloth_solver_set_positions(clmd);
clmd->clothObject->last_frame= MINFRAME-1;
+ clmd->sim_parms->dt = 1.0f / clmd->sim_parms->stepsPerFrame;
}
return 1;
@@ -383,8 +327,11 @@ static int do_step_cloth(Depsgraph *depsgraph, Object *ob, ClothModifierData *cl
/* Support for dynamic vertex groups, changing from frame to frame */
cloth_apply_vgroup ( clmd, result );
- if ( clmd->sim_parms->flags & (CLOTH_SIMSETTINGS_FLAG_SEW | CLOTH_SIMSETTINGS_FLAG_DYNAMIC_BASEMESH) )
+ if ((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_DYNAMIC_BASEMESH) ||
+ (clmd->sim_parms->vgroup_shrink > 0) || (clmd->sim_parms->shrink_min > 0.0f))
+ {
cloth_update_spring_lengths ( clmd, result );
+ }
cloth_update_springs( clmd );
@@ -429,9 +376,6 @@ void clothModifier_do(ClothModifierData *clmd, Depsgraph *depsgraph, Scene *scen
cache->flag &= ~PTCACHE_REDO_NEEDED;
}
- // unused in the moment, calculated separately in implicit.c
- clmd->sim_parms->dt = clmd->sim_parms->timescale / clmd->sim_parms->stepsPerFrame;
-
/* simulation is only active during a specific period */
if (framenr < startframe) {
BKE_ptcache_invalidate(cache);
@@ -529,6 +473,9 @@ void cloth_free_modifier(ClothModifierData *clmd )
while (search) {
ClothSpring *spring = search->link;
+ MEM_SAFE_FREE(spring->pa);
+ MEM_SAFE_FREE(spring->pb);
+
MEM_freeN ( spring );
search = search->next;
}
@@ -554,11 +501,11 @@ void cloth_free_modifier(ClothModifierData *clmd )
if (cloth->edgeset)
BLI_edgeset_free(cloth->edgeset);
-
- /*
- if (clmd->clothObject->facemarks)
- MEM_freeN(clmd->clothObject->facemarks);
- */
+#if 0
+ if (clmd->clothObject->facemarks) {
+ MEM_freeN(clmd->clothObject->facemarks);
+ }
+#endif
MEM_freeN ( cloth );
clmd->clothObject = NULL;
}
@@ -595,6 +542,9 @@ void cloth_free_modifier_extern(ClothModifierData *clmd )
while (search) {
ClothSpring *spring = search->link;
+ MEM_SAFE_FREE(spring->pa);
+ MEM_SAFE_FREE(spring->pb);
+
MEM_freeN ( spring );
search = search->next;
}
@@ -621,10 +571,11 @@ void cloth_free_modifier_extern(ClothModifierData *clmd )
BLI_edgeset_free(cloth->edgeset);
- /*
- if (clmd->clothObject->facemarks)
- MEM_freeN(clmd->clothObject->facemarks);
- */
+#if 0
+ if (clmd->clothObject->facemarks) {
+ MEM_freeN(clmd->clothObject->facemarks);
+ }
+#endif
MEM_freeN ( cloth );
clmd->clothObject = NULL;
}
@@ -659,15 +610,11 @@ static void cloth_to_object (Object *ob, ClothModifierData *clmd, float (*verte
int cloth_uses_vgroup(ClothModifierData *clmd)
{
- return (((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SCALING ) ||
- (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL ) ||
- (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SEW) ||
- (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF)) &&
- ((clmd->sim_parms->vgroup_mass>0) ||
- (clmd->sim_parms->vgroup_struct>0)||
- (clmd->sim_parms->vgroup_bend>0) ||
- (clmd->sim_parms->vgroup_shrink>0) ||
- (clmd->coll_parms->vgroup_selfcol>0)));
+ return (((clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF) && (clmd->coll_parms->vgroup_selfcol > 0)) ||
+ (clmd->sim_parms->vgroup_struct > 0) ||
+ (clmd->sim_parms->vgroup_bend > 0) ||
+ (clmd->sim_parms->vgroup_shrink > 0) ||
+ (clmd->sim_parms->vgroup_mass > 0));
}
/**
@@ -697,7 +644,7 @@ static void cloth_apply_vgroup ( ClothModifierData *clmd, Mesh *mesh )
for (i = 0; i < mvert_num; i++, verts++) {
/* Reset Goal values to standard */
- if ( clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL )
+ if (clmd->sim_parms->vgroup_mass > 0)
verts->goal= clmd->sim_parms->defgoal;
else
verts->goal= 0.0f;
@@ -712,7 +659,7 @@ static void cloth_apply_vgroup ( ClothModifierData *clmd, Mesh *mesh )
dvert = CustomData_get(&mesh->vdata, i, CD_MDEFORMVERT);
if ( dvert ) {
for ( j = 0; j < dvert->totweight; j++ ) {
- if (( dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_mass-1)) && (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL )) {
+ if (dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_mass - 1)) {
verts->goal = dvert->dw [j].weight;
/* goalfac= 1.0f; */ /* UNUSED */
@@ -725,15 +672,16 @@ static void cloth_apply_vgroup ( ClothModifierData *clmd, Mesh *mesh )
verts->flags |= CLOTH_VERT_FLAG_PINNED;
}
- if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SCALING ) {
- if ( dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_struct-1)) {
- verts->struct_stiff = dvert->dw [j].weight;
- verts->shear_stiff = dvert->dw [j].weight;
- }
+ if (dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_struct - 1)) {
+ verts->struct_stiff = dvert->dw[j].weight;
+ }
- if ( dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_bend-1)) {
- verts->bend_stiff = dvert->dw [j].weight;
- }
+ if (dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_shear - 1)) {
+ verts->shear_stiff = dvert->dw[j].weight;
+ }
+
+ if (dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_bend - 1)) {
+ verts->bend_stiff = dvert->dw[j].weight;
}
if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF ) {
@@ -743,12 +691,10 @@ static void cloth_apply_vgroup ( ClothModifierData *clmd, Mesh *mesh )
}
}
}
- if ( clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SEW ) {
- if (clmd->sim_parms->vgroup_shrink > 0) {
- if (dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_shrink - 1)) {
- /* used for linear interpolation between min and max shrink factor based on weight */
- verts->shrink_factor = dvert->dw[j].weight;
- }
+ if (clmd->sim_parms->vgroup_shrink > 0) {
+ if (dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_shrink - 1)) {
+ /* Used for linear interpolation between min and max shrink factor based on weight. */
+ verts->shrink_factor = dvert->dw[j].weight;
}
}
}
@@ -759,20 +705,16 @@ static void cloth_apply_vgroup ( ClothModifierData *clmd, Mesh *mesh )
static float cloth_shrink_factor(ClothModifierData *clmd, ClothVertex *verts, int i1, int i2)
{
- if ( clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SEW ) {
- /* linear interpolation between min and max shrink factor based on weight */
- float base = 1.0f - clmd->sim_parms->shrink_min;
- float delta = clmd->sim_parms->shrink_min - clmd->sim_parms->shrink_max;
+ /* Linear interpolation between min and max shrink factor based on weight. */
+ float base = 1.0f - clmd->sim_parms->shrink_min;
+ float delta = clmd->sim_parms->shrink_min - clmd->sim_parms->shrink_max;
- float k1 = base + delta * verts[i1].shrink_factor;
- float k2 = base + delta * verts[i2].shrink_factor;
+ float k1 = base + delta * verts[i1].shrink_factor;
+ float k2 = base + delta * verts[i2].shrink_factor;
- /* Use geometrical mean to average two factors since it behaves better
- for diagonals when a rectangle transforms into a trapezoid. */
- return sqrtf(k1 * k2);
- }
- else
- return 1.0f;
+ /* Use geometrical mean to average two factors since it behaves better
+ for diagonals when a rectangle transforms into a trapezoid. */
+ return sqrtf(k1 * k2);
}
static int cloth_from_object(Object *ob, ClothModifierData *clmd, Mesh *mesh, float UNUSED(framenr), int first)
@@ -782,8 +724,6 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, Mesh *mesh, fl
ClothVertex *verts = NULL;
float (*shapekey_rest)[3] = NULL;
float tnull[3] = {0, 0, 0};
- Cloth *cloth = NULL;
- float maxdist = 0;
// If we have a clothObject, free it.
if ( clmd->clothObject != NULL ) {
@@ -796,8 +736,6 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, Mesh *mesh, fl
clmd->clothObject = MEM_callocN ( sizeof ( Cloth ), "cloth" );
if ( clmd->clothObject ) {
clmd->clothObject->old_solver_type = 255;
- // clmd->clothObject->old_collision_type = 255;
- cloth = clmd->clothObject;
clmd->clothObject->edgeset = NULL;
}
else if (!clmd->clothObject) {
@@ -841,7 +779,7 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, Mesh *mesh, fl
verts->mass = clmd->sim_parms->mass;
verts->impulse_count = 0;
- if ( clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL )
+ if (clmd->sim_parms->vgroup_mass > 0)
verts->goal= clmd->sim_parms->defgoal;
else
verts->goal= 0.0f;
@@ -876,13 +814,8 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, Mesh *mesh, fl
if (!first)
BKE_cloth_solver_set_positions(clmd);
- clmd->clothObject->bvhtree = bvhtree_build_from_cloth ( clmd, MAX2(clmd->coll_parms->epsilon, clmd->coll_parms->distance_repel) );
-
- for (i = 0; i < mesh->totvert; i++) {
- maxdist = MAX2(maxdist, clmd->coll_parms->selfepsilon* ( cloth->verts[i].avg_spring_len*2.0f));
- }
-
- clmd->clothObject->bvhselftree = bvhselftree_build_from_cloth ( clmd, maxdist );
+ clmd->clothObject->bvhtree = bvhtree_build_from_cloth (clmd, clmd->coll_parms->epsilon);
+ clmd->clothObject->bvhselftree = bvhtree_build_from_cloth(clmd, clmd->coll_parms->selfepsilon);
return 1;
}
@@ -951,13 +884,16 @@ static void cloth_free_edgelist(LinkNodePair *edgelist, unsigned int mvert_num)
}
}
-static void cloth_free_errorsprings(Cloth *cloth, LinkNodePair *edgelist)
+static void cloth_free_errorsprings(Cloth *cloth, LinkNodePair *edgelist, BendSpringRef *spring_ref)
{
if ( cloth->springs != NULL ) {
LinkNode *search = cloth->springs;
while (search) {
ClothSpring *spring = search->link;
+ MEM_SAFE_FREE(spring->pa);
+ MEM_SAFE_FREE(spring->pb);
+
MEM_freeN ( spring );
search = search->next;
}
@@ -968,12 +904,49 @@ static void cloth_free_errorsprings(Cloth *cloth, LinkNodePair *edgelist)
cloth_free_edgelist(edgelist, cloth->mvert_num);
+ MEM_SAFE_FREE(spring_ref);
+
if (cloth->edgeset) {
BLI_edgeset_free(cloth->edgeset);
cloth->edgeset = NULL;
}
}
+BLI_INLINE void cloth_bend_poly_dir(ClothVertex *verts, int i, int j, int *inds, int len, float r_dir[3])
+{
+ float cent[3] = {0};
+ float fact = 1.0f / len;
+
+ for (int x = 0; x < len; x++) {
+ madd_v3_v3fl(cent, verts[inds[x]].xrest, fact);
+ }
+
+ normal_tri_v3(r_dir, verts[i].xrest, verts[j].xrest, cent);
+}
+
+static float cloth_spring_angle(ClothVertex *verts, int i, int j, int *i_a, int *i_b, int len_a, int len_b)
+{
+ float dir_a[3], dir_b[3];
+ float tmp[3], vec_e[3];
+ float sin, cos;
+
+ /* Poly vectors. */
+ cloth_bend_poly_dir(verts, j, i, i_a, len_a, dir_a);
+ cloth_bend_poly_dir(verts, i, j, i_b, len_b, dir_b);
+
+ /* Edge vector. */
+ sub_v3_v3v3(vec_e, verts[i].xrest, verts[j].xrest);
+ normalize_v3(vec_e);
+
+ /* Compute angle. */
+ cos = dot_v3v3(dir_a, dir_b);
+
+ cross_v3_v3v3(tmp, dir_a, dir_b);
+ sin = dot_v3v3(tmp, vec_e);
+
+ return atan2f(sin, cos);
+}
+
static void cloth_hair_update_bending_targets(ClothModifierData *clmd)
{
Cloth *cloth = clmd->clothObject;
@@ -998,7 +971,7 @@ static void cloth_hair_update_bending_targets(ClothModifierData *clmd)
ClothHairData *hair_ij, *hair_kl;
bool is_root = spring->kl != prev_mn;
- if (spring->type != CLOTH_SPRING_TYPE_BENDING_ANG) {
+ if (spring->type != CLOTH_SPRING_TYPE_BENDING_HAIR) {
continue;
}
@@ -1017,24 +990,6 @@ static void cloth_hair_update_bending_targets(ClothModifierData *clmd)
sub_v3_v3v3(dir_new, cloth->verts[spring->mn].x, cloth->verts[spring->kl].x);
normalize_v3(dir_new);
-#if 0
- if (clmd->debug_data && (spring->ij == 0 || spring->ij == 1)) {
- float a[3], b[3];
-
- copy_v3_v3(a, cloth->verts[spring->kl].x);
-// BKE_sim_debug_data_add_dot(clmd->debug_data, cloth_vert ? cloth_vert->x : key->co, 1, 1, 0, "frames", 8246, p, k);
-
- mul_v3_v3fl(b, hair_frame[0], clmd->sim_parms->avg_spring_len);
- BKE_sim_debug_data_add_vector(clmd->debug_data, a, b, 1, 0, 0, "frames", 8247, spring->kl, spring->mn);
-
- mul_v3_v3fl(b, hair_frame[1], clmd->sim_parms->avg_spring_len);
- BKE_sim_debug_data_add_vector(clmd->debug_data, a, b, 0, 1, 0, "frames", 8248, spring->kl, spring->mn);
-
- mul_v3_v3fl(b, hair_frame[2], clmd->sim_parms->avg_spring_len);
- BKE_sim_debug_data_add_vector(clmd->debug_data, a, b, 0, 0, 1, "frames", 8249, spring->kl, spring->mn);
- }
-#endif
-
/* get local targets for kl/mn vertices by putting rest targets into the current frame,
* then multiply with the rest length to get the actual goals
*/
@@ -1073,7 +1028,7 @@ static void cloth_hair_update_bending_rest_targets(ClothModifierData *clmd)
ClothHairData *hair_ij, *hair_kl;
bool is_root = spring->kl != prev_mn;
- if (spring->type != CLOTH_SPRING_TYPE_BENDING_ANG) {
+ if (spring->type != CLOTH_SPRING_TYPE_BENDING_HAIR) {
continue;
}
@@ -1113,18 +1068,24 @@ static void cloth_update_springs( ClothModifierData *clmd )
while (search) {
ClothSpring *spring = search->link;
- spring->stiffness = 0.0f;
+ spring->lin_stiffness = 0.0f;
- if (spring->type == CLOTH_SPRING_TYPE_STRUCTURAL) {
- spring->stiffness = (cloth->verts[spring->kl].struct_stiff + cloth->verts[spring->ij].struct_stiff) / 2.0f;
+ if (clmd->sim_parms->bending_model == CLOTH_BENDING_ANGULAR) {
+ if (spring->type & CLOTH_SPRING_TYPE_BENDING) {
+ spring->ang_stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0f;
+ }
+ }
+
+ if (spring->type & CLOTH_SPRING_TYPE_STRUCTURAL) {
+ spring->lin_stiffness = (cloth->verts[spring->kl].struct_stiff + cloth->verts[spring->ij].struct_stiff) / 2.0f;
}
- else if (spring->type == CLOTH_SPRING_TYPE_SHEAR) {
- spring->stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0f;
+ else if (spring->type & CLOTH_SPRING_TYPE_SHEAR) {
+ spring->lin_stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0f;
}
else if (spring->type == CLOTH_SPRING_TYPE_BENDING) {
- spring->stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0f;
+ spring->lin_stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0f;
}
- else if (spring->type == CLOTH_SPRING_TYPE_BENDING_ANG) {
+ else if (spring->type == CLOTH_SPRING_TYPE_BENDING_HAIR) {
ClothVertex *v1 = &cloth->verts[spring->ij];
ClothVertex *v2 = &cloth->verts[spring->kl];
if (clmd->hairdata) {
@@ -1132,7 +1093,7 @@ static void cloth_update_springs( ClothModifierData *clmd )
v1->bend_stiff = clmd->hairdata[spring->ij].bending_stiffness;
v2->bend_stiff = clmd->hairdata[spring->kl].bending_stiffness;
}
- spring->stiffness = (v1->bend_stiff + v2->bend_stiff) / 2.0f;
+ spring->lin_stiffness = (v1->bend_stiff + v2->bend_stiff) / 2.0f;
}
else if (spring->type == CLOTH_SPRING_TYPE_GOAL) {
/* Warning: Appending NEW goal springs does not work because implicit solver would need reset! */
@@ -1168,7 +1129,7 @@ static void cloth_update_verts( Object *ob, ClothModifierData *clmd, Mesh *mesh
}
}
-/* Update spring rest lenght, for dynamically deformable cloth */
+/* Update spring rest length, for dynamically deformable cloth */
static void cloth_update_spring_lengths( ClothModifierData *clmd, Mesh *mesh )
{
Cloth *cloth = clmd->clothObject;
@@ -1187,16 +1148,23 @@ static void cloth_update_spring_lengths( ClothModifierData *clmd, Mesh *mesh )
while (search) {
ClothSpring *spring = search->link;
- if ( spring->type != CLOTH_SPRING_TYPE_SEWING ) {
- if ( spring->type & (CLOTH_SPRING_TYPE_STRUCTURAL | CLOTH_SPRING_TYPE_SHEAR | CLOTH_SPRING_TYPE_BENDING) )
+ if (spring->type != CLOTH_SPRING_TYPE_SEWING) {
+ if (spring->type & (CLOTH_SPRING_TYPE_STRUCTURAL | CLOTH_SPRING_TYPE_SHEAR | CLOTH_SPRING_TYPE_BENDING)) {
shrink_factor = cloth_shrink_factor(clmd, cloth->verts, spring->ij, spring->kl);
- else
+ }
+ else {
shrink_factor = 1.0f;
+ }
spring->restlen = len_v3v3(cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest) * shrink_factor;
+
+ if (spring->type & CLOTH_SPRING_TYPE_BENDING) {
+ spring->restang = cloth_spring_angle(cloth->verts, spring->ij, spring->kl,
+ spring->pa, spring->pb, spring->la, spring->lb);
+ }
}
- if ( spring->type == CLOTH_SPRING_TYPE_STRUCTURAL ) {
+ if (spring->type & CLOTH_SPRING_TYPE_STRUCTURAL) {
clmd->sim_parms->avg_spring_len += spring->restlen;
cloth->verts[spring->ij].avg_spring_len += spring->restlen;
cloth->verts[spring->kl].avg_spring_len += spring->restlen;
@@ -1206,12 +1174,14 @@ static void cloth_update_spring_lengths( ClothModifierData *clmd, Mesh *mesh )
search = search->next;
}
- if (struct_springs > 0)
+ if (struct_springs > 0) {
clmd->sim_parms->avg_spring_len /= struct_springs;
+ }
for (i = 0; i < mvert_num; i++) {
- if (cloth->verts[i].spring_count > 0)
+ if (cloth->verts[i].spring_count > 0) {
cloth->verts[i].avg_spring_len = cloth->verts[i].avg_spring_len * 0.49f / ((float)cloth->verts[i].spring_count);
+ }
}
}
@@ -1250,12 +1220,103 @@ void cloth_parallel_transport_hair_frame(float mat[3][3], const float dir_old[3]
mul_m3_m3m3(mat, rot, mat);
}
+/* Add a shear and a bend spring between two verts within a poly. */
+static bool cloth_add_shear_bend_spring(ClothModifierData *clmd, LinkNodePair *edgelist,
+ const MLoop *mloop, const MPoly *mpoly, int i, int j, int k)
+{
+ Cloth *cloth = clmd->clothObject;
+ ClothSpring *spring;
+ const MLoop *tmp_loop;
+ float shrink_factor;
+ int x, y;
+
+ /* Combined shear/bend properties. */
+ spring = (ClothSpring *)MEM_callocN(sizeof(ClothSpring), "cloth spring");
+
+ if (!spring) {
+ return false;
+ }
+
+ spring_verts_ordered_set(spring,
+ mloop[mpoly[i].loopstart + j].v,
+ mloop[mpoly[i].loopstart + k].v);
+
+ shrink_factor = cloth_shrink_factor(clmd, cloth->verts, spring->ij, spring->kl);
+ spring->restlen = len_v3v3(cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest) * shrink_factor;
+ spring->type |= CLOTH_SPRING_TYPE_SHEAR;
+ spring->lin_stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0f;
+
+ if (edgelist) {
+ BLI_linklist_append(&edgelist[spring->ij], spring);
+ BLI_linklist_append(&edgelist[spring->kl], spring);
+ }
+
+ /* Bending specific properties. */
+ if (clmd->sim_parms->bending_model == CLOTH_BENDING_ANGULAR) {
+ spring->type |= CLOTH_SPRING_TYPE_BENDING;
+
+ spring->la = k - j + 1;
+ spring->lb = mpoly[i].totloop - k + j + 1;
+
+ spring->pa = MEM_mallocN(sizeof(*spring->pa) * spring->la, "spring poly");
+ if (!spring->pa) {
+ return false;
+ }
+
+ spring->pb = MEM_mallocN(sizeof(*spring->pb) * spring->lb, "spring poly");
+ if (!spring->pb) {
+ return false;
+ }
+
+ tmp_loop = mloop + mpoly[i].loopstart;
+
+ for (x = 0; x < spring->la; x++) {
+ spring->pa[x] = tmp_loop[j + x].v;
+ }
+
+ for (x = 0; x <= j; x++) {
+ spring->pb[x] = tmp_loop[x].v;
+ }
+
+ for (y = k; y < mpoly[i].totloop; x++, y++) {
+ spring->pb[x] = tmp_loop[y].v;
+ }
+
+ spring->mn = -1;
+
+ spring->restang = cloth_spring_angle(cloth->verts, spring->ij, spring->kl,
+ spring->pa, spring->pb, spring->la, spring->lb);
+
+ spring->ang_stiffness = (cloth->verts[spring->ij].bend_stiff + cloth->verts[spring->kl].bend_stiff) / 2.0f;
+ }
+
+ BLI_linklist_prepend(&cloth->springs, spring);
+
+ return true;
+}
+
+BLI_INLINE bool cloth_bend_set_poly_vert_array(int **poly, int len, const MLoop *mloop)
+{
+ int *p = MEM_mallocN(sizeof(int) * len, "spring poly");
+
+ if (!p) {
+ return false;
+ }
+
+ for (int i = 0; i < len; i++, mloop++) {
+ p[i] = mloop->v;
+ }
+
+ *poly = p;
+
+ return true;
+}
+
static int cloth_build_springs ( ClothModifierData *clmd, Mesh *mesh )
{
Cloth *cloth = clmd->clothObject;
ClothSpring *spring = NULL, *tspring = NULL, *tspring2 = NULL;
unsigned int struct_springs = 0, shear_springs=0, bend_springs = 0, struct_springs_real = 0;
- unsigned int i = 0;
unsigned int mvert_num = (unsigned int)mesh->totvert;
unsigned int numedges = (unsigned int)mesh->totedge;
unsigned int numpolys = (unsigned int)mesh->totpoly;
@@ -1264,9 +1325,10 @@ static int cloth_build_springs ( ClothModifierData *clmd, Mesh *mesh )
const MPoly *mpoly = mesh->mpoly;
const MLoop *mloop = mesh->mloop;
int index2 = 0; // our second vertex index
- LinkNodePair *edgelist;
+ LinkNodePair *edgelist = NULL;
EdgeSet *edgeset = NULL;
LinkNode *search = NULL, *search2 = NULL;
+ BendSpringRef *spring_ref = NULL;
// error handling
if ( numedges==0 )
@@ -1280,13 +1342,23 @@ static int cloth_build_springs ( ClothModifierData *clmd, Mesh *mesh )
cloth->springs = NULL;
cloth->edgeset = NULL;
- edgelist = MEM_callocN(sizeof(*edgelist) * mvert_num, "cloth_edgelist_alloc" );
+ if (clmd->sim_parms->bending_model == CLOTH_BENDING_ANGULAR) {
+ spring_ref = MEM_callocN(sizeof(*spring_ref) * numedges, "temp bend spring reference");
- if (!edgelist)
- return 0;
+ if (!spring_ref) {
+ return 0;
+ }
+ }
+ else {
+ edgelist = MEM_callocN(sizeof(*edgelist) * mvert_num, "cloth_edgelist_alloc" );
+
+ if (!edgelist) {
+ return 0;
+ }
+ }
- // structural springs
- for ( i = 0; i < numedges; i++ ) {
+ /* Structural springs. */
+ for (int i = 0; i < numedges; i++) {
spring = (ClothSpring *)MEM_callocN ( sizeof ( ClothSpring ), "cloth spring" );
if ( spring ) {
@@ -1294,13 +1366,13 @@ static int cloth_build_springs ( ClothModifierData *clmd, Mesh *mesh )
if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SEW && medge[i].flag & ME_LOOSEEDGE) {
// handle sewing (loose edges will be pulled together)
spring->restlen = 0.0f;
- spring->stiffness = 1.0f;
+ spring->lin_stiffness = 1.0f;
spring->type = CLOTH_SPRING_TYPE_SEWING;
}
else {
shrink_factor = cloth_shrink_factor(clmd, cloth->verts, spring->ij, spring->kl);
spring->restlen = len_v3v3(cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest) * shrink_factor;
- spring->stiffness = (cloth->verts[spring->kl].struct_stiff + cloth->verts[spring->ij].struct_stiff) / 2.0f;
+ spring->lin_stiffness = (cloth->verts[spring->kl].struct_stiff + cloth->verts[spring->ij].struct_stiff) / 2.0f;
spring->type = CLOTH_SPRING_TYPE_STRUCTURAL;
clmd->sim_parms->avg_spring_len += spring->restlen;
@@ -1315,9 +1387,13 @@ static int cloth_build_springs ( ClothModifierData *clmd, Mesh *mesh )
struct_springs++;
BLI_linklist_prepend ( &cloth->springs, spring );
+
+ if (spring_ref) {
+ spring_ref[i].spring = spring;
+ }
}
else {
- cloth_free_errorsprings(cloth, edgelist);
+ cloth_free_errorsprings(cloth, edgelist, spring_ref);
return 0;
}
}
@@ -1325,86 +1401,147 @@ static int cloth_build_springs ( ClothModifierData *clmd, Mesh *mesh )
if (struct_springs_real > 0)
clmd->sim_parms->avg_spring_len /= struct_springs_real;
- for (i = 0; i < mvert_num; i++) {
+ for (int i = 0; i < mvert_num; i++) {
if (cloth->verts[i].spring_count > 0)
cloth->verts[i].avg_spring_len = cloth->verts[i].avg_spring_len * 0.49f / ((float)cloth->verts[i].spring_count);
}
- // shear springs
- for (i = 0; i < numpolys; i++) {
- /* triangle faces already have shear springs due to structural geometry */
- if (mpoly[i].totloop == 4) {
- int j;
+ edgeset = BLI_edgeset_new_ex(__func__, numedges);
+ cloth->edgeset = edgeset;
- for (j = 0; j != 2; j++) {
- spring = (ClothSpring *)MEM_callocN(sizeof(ClothSpring), "cloth spring");
+ if (numpolys) {
+ for (int i = 0; i < numpolys; i++) {
+ /* Shear springs. */
+ /* Triangle faces already have shear springs due to structural geometry. */
+ if (mpoly[i].totloop > 3) {
+ for (int j = 1; j < mpoly[i].totloop - 1; j++) {
+ if (j > 1) {
+ if (cloth_add_shear_bend_spring(clmd, edgelist, mloop, mpoly, i, 0, j)) {
+ shear_springs++;
+
+ if (clmd->sim_parms->bending_model == CLOTH_BENDING_ANGULAR) {
+ bend_springs++;
+ }
+ }
+ else {
+ cloth_free_errorsprings(cloth, edgelist, spring_ref);
+ return 0;
+ }
+ }
- if (!spring) {
- cloth_free_errorsprings(cloth, edgelist);
- return 0;
+ for (int k = j + 2; k < mpoly[i].totloop; k++) {
+ if (cloth_add_shear_bend_spring(clmd, edgelist, mloop, mpoly, i, j, k)) {
+ shear_springs++;
+
+ if (clmd->sim_parms->bending_model == CLOTH_BENDING_ANGULAR) {
+ bend_springs++;
+ }
+ }
+ else {
+ cloth_free_errorsprings(cloth, edgelist, spring_ref);
+ return 0;
+ }
+ }
}
+ }
- spring_verts_ordered_set(
- spring,
- mloop[mpoly[i].loopstart + (j + 0)].v,
- mloop[mpoly[i].loopstart + (j + 2)].v);
+ /* Angular bending springs along struct springs. */
+ if (clmd->sim_parms->bending_model == CLOTH_BENDING_ANGULAR) {
+ const MLoop *ml = mloop + mpoly[i].loopstart;
- shrink_factor = cloth_shrink_factor(clmd, cloth->verts, spring->ij, spring->kl);
- spring->restlen = len_v3v3(cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest) * shrink_factor;
- spring->type = CLOTH_SPRING_TYPE_SHEAR;
- spring->stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0f;
+ for (int j = 0; j < mpoly[i].totloop; j++, ml++) {
+ BendSpringRef *curr_ref = &spring_ref[ml->e];
+ curr_ref->polys++;
+
+ /* First poly found for this edge, store poly index. */
+ if (curr_ref->polys == 1) {
+ curr_ref->index = i;
+ }
+ /* Second poly found for this edge, add bending data. */
+ else if (curr_ref->polys == 2) {
+ spring = curr_ref->spring;
- BLI_linklist_append(&edgelist[spring->ij], spring);
- BLI_linklist_append(&edgelist[spring->kl], spring);
+ spring->type |= CLOTH_SPRING_TYPE_BENDING;
- shear_springs++;
+ spring->la = mpoly[curr_ref->index].totloop;
+ spring->lb = mpoly[i].totloop;
- BLI_linklist_prepend(&cloth->springs, spring);
+ if (!cloth_bend_set_poly_vert_array(&spring->pa, spring->la, &mloop[mpoly[curr_ref->index].loopstart]) ||
+ !cloth_bend_set_poly_vert_array(&spring->pb, spring->lb, &mloop[mpoly[i].loopstart]))
+ {
+ cloth_free_errorsprings(cloth, edgelist, spring_ref);
+ return 0;
+ }
+
+ spring->mn = ml->e;
+
+ spring->restang = cloth_spring_angle(cloth->verts, spring->ij, spring->kl,
+ spring->pa, spring->pb, spring->la, spring->lb);
+
+ spring->ang_stiffness = (cloth->verts[spring->ij].bend_stiff + cloth->verts[spring->kl].bend_stiff) / 2.0f;
+
+ bend_springs++;
+ }
+ /* Third poly found for this edge, remove bending data. */
+ else if (curr_ref->polys == 3) {
+ spring = curr_ref->spring;
+
+ spring->type &= ~CLOTH_SPRING_TYPE_BENDING;
+ MEM_freeN(spring->pa);
+ MEM_freeN(spring->pb);
+ spring->pa = NULL;
+ spring->pb = NULL;
+
+ bend_springs--;
+ }
+ }
}
}
- }
- edgeset = BLI_edgeset_new_ex(__func__, numedges);
- cloth->edgeset = edgeset;
+ /* Linear bending springs. */
+ if (clmd->sim_parms->bending_model == CLOTH_BENDING_LINEAR) {
+ search2 = cloth->springs;
- if (numpolys) {
- // bending springs
- search2 = cloth->springs;
- for ( i = struct_springs; i < struct_springs+shear_springs; i++ ) {
- if ( !search2 )
- break;
+ for (int i = struct_springs; i < struct_springs+shear_springs; i++) {
+ if (!search2) {
+ break;
+ }
- tspring2 = search2->link;
- search = edgelist[tspring2->kl].list;
- while ( search ) {
- tspring = search->link;
- index2 = ( ( tspring->ij==tspring2->kl ) ? ( tspring->kl ) : ( tspring->ij ) );
+ tspring2 = search2->link;
+ search = edgelist[tspring2->kl].list;
+
+ while (search) {
+ tspring = search->link;
+ index2 = ((tspring->ij == tspring2->kl) ? (tspring->kl) : (tspring->ij));
+
+ /* Check for existing spring. */
+ /* Check also if startpoint is equal to endpoint. */
+ if ((index2 != tspring2->ij) &&
+ !BLI_edgeset_haskey(edgeset, tspring2->ij, index2))
+ {
+ spring = (ClothSpring *)MEM_callocN(sizeof(ClothSpring), "cloth spring");
+
+ if (!spring) {
+ cloth_free_errorsprings(cloth, edgelist, spring_ref);
+ return 0;
+ }
- // check for existing spring
- // check also if startpoint is equal to endpoint
- if ((index2 != tspring2->ij) &&
- !BLI_edgeset_haskey(edgeset, tspring2->ij, index2))
- {
- spring = (ClothSpring *)MEM_callocN ( sizeof ( ClothSpring ), "cloth spring" );
+ spring_verts_ordered_set(spring, tspring2->ij, index2);
+ shrink_factor = cloth_shrink_factor(clmd, cloth->verts, spring->ij, spring->kl);
+ spring->restlen = len_v3v3(cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest) * shrink_factor;
+ spring->type = CLOTH_SPRING_TYPE_BENDING;
+ spring->lin_stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0f;
+ BLI_edgeset_insert(edgeset, spring->ij, spring->kl);
+ bend_springs++;
- if (!spring) {
- cloth_free_errorsprings(cloth, edgelist);
- return 0;
+ BLI_linklist_prepend(&cloth->springs, spring);
}
- spring_verts_ordered_set(spring, tspring2->ij, index2);
- shrink_factor = cloth_shrink_factor(clmd, cloth->verts, spring->ij, spring->kl);
- spring->restlen = len_v3v3(cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest) * shrink_factor;
- spring->type = CLOTH_SPRING_TYPE_BENDING;
- spring->stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0f;
- BLI_edgeset_insert(edgeset, spring->ij, spring->kl);
- bend_springs++;
-
- BLI_linklist_prepend ( &cloth->springs, spring );
+ search = search->next;
}
- search = search->next;
+
+ search2 = search2->next;
}
- search2 = search2->next;
}
}
else if (struct_springs > 2) {
@@ -1419,7 +1556,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, Mesh *mesh )
spring = (ClothSpring *)MEM_callocN ( sizeof ( ClothSpring ), "cloth spring" );
if (!spring) {
- cloth_free_errorsprings(cloth, edgelist);
+ cloth_free_errorsprings(cloth, edgelist, spring_ref);
return 0;
}
@@ -1427,8 +1564,8 @@ static int cloth_build_springs ( ClothModifierData *clmd, Mesh *mesh )
spring->kl = tspring->ij;
spring->mn = tspring->kl;
spring->restlen = len_v3v3(cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest);
- spring->type = CLOTH_SPRING_TYPE_BENDING_ANG;
- spring->stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0f;
+ spring->type = CLOTH_SPRING_TYPE_BENDING_HAIR;
+ spring->lin_stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0f;
bend_springs++;
BLI_linklist_prepend ( &cloth->springs, spring );
@@ -1440,7 +1577,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, Mesh *mesh )
}
else {
/* bending springs for hair strands */
- /* The current algorightm only goes through the edges in order of the mesh edges list */
+ /* The current algorithm only goes through the edges in order of the mesh edges list */
/* and makes springs between the outer vert of edges sharing a vertice. This works just */
/* fine for hair, but not for user generated string meshes. This could/should be later */
/* extended to work with non-ordered edges so that it can be used for general "rope */
@@ -1456,7 +1593,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, Mesh *mesh )
spring = (ClothSpring *)MEM_callocN ( sizeof ( ClothSpring ), "cloth spring" );
if (!spring) {
- cloth_free_errorsprings(cloth, edgelist);
+ cloth_free_errorsprings(cloth, edgelist, spring_ref);
return 0;
}
@@ -1464,7 +1601,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, Mesh *mesh )
spring->kl = tspring->kl;
spring->restlen = len_v3v3(cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest);
spring->type = CLOTH_SPRING_TYPE_BENDING;
- spring->stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0f;
+ spring->lin_stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0f;
bend_springs++;
BLI_linklist_prepend ( &cloth->springs, spring );
@@ -1481,17 +1618,18 @@ static int cloth_build_springs ( ClothModifierData *clmd, Mesh *mesh )
/* note: the edges may already exist so run reinsert */
/* insert other near springs in edgeset AFTER bending springs are calculated (for selfcolls) */
- for (i = 0; i < numedges; i++) { /* struct springs */
+ for (int i = 0; i < numedges; i++) { /* struct springs */
BLI_edgeset_add(edgeset, medge[i].v1, medge[i].v2);
}
- for (i = 0; i < numpolys; i++) { /* edge springs */
+ for (int i = 0; i < numpolys; i++) { /* edge springs */
if (mpoly[i].totloop == 4) {
BLI_edgeset_add(edgeset, mloop[mpoly[i].loopstart + 0].v, mloop[mpoly[i].loopstart + 2].v);
BLI_edgeset_add(edgeset, mloop[mpoly[i].loopstart + 1].v, mloop[mpoly[i].loopstart + 3].v);
}
}
+ MEM_SAFE_FREE(spring_ref);
cloth->numsprings = struct_springs + shear_springs + bend_springs;
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index 1537743fff4..9cec20a8f2b 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -97,7 +97,7 @@ static Collection *collection_add(Main *bmain, Collection *collection_parent, co
}
/**
- * Add a collection to a collection ListBase and syncronize all render layers
+ * Add a collection to a collection ListBase and synchronize all render layers
* The ListBase is NULL when the collection is to be added to the master collection
*/
Collection *BKE_collection_add(Main *bmain, Collection *collection_parent, const char *name_custom)
@@ -130,7 +130,7 @@ bool BKE_collection_delete(Main *bmain, Collection *collection, bool hierarchy)
{
/* Master collection is not real datablock, can't be removed. */
if (collection->flag & COLLECTION_IS_MASTER) {
- BLI_assert("!Scene master collection can't be deleted");
+ BLI_assert(!"Scene master collection can't be deleted");
return false;
}
@@ -231,6 +231,7 @@ Collection *BKE_collection_copy(Main *bmain, Collection *parent, Collection *col
Collection *collection_new;
BKE_id_copy_ex(bmain, &collection->id, (ID **)&collection_new, 0, false);
+ id_us_min(&collection_new->id); /* Copying add one user by default, need to get rid of that one. */
/* Optionally add to parent. */
if (parent) {
@@ -467,6 +468,11 @@ Collection *BKE_collection_object_find(Main *bmain, Collection *collection, Obje
return NULL;
}
+bool BKE_collection_is_empty(Collection *collection)
+{
+ return BLI_listbase_is_empty(&collection->gobject) && BLI_listbase_is_empty(&collection->children);
+}
+
/********************** Collection Objects *********************/
static bool collection_object_add(Main *bmain, Collection *collection, Object *ob, int flag, const bool add_us)
@@ -611,66 +617,102 @@ bool BKE_scene_collections_object_remove(Main *bmain, Scene *scene, Object *ob,
}
/*
- * Remove all NULL objects from non-scene collections.
+ * Remove all NULL objects from collections.
* This is used for library remapping, where these pointers have been set to NULL.
* Otherwise this should never happen.
*/
+static void collection_object_remove_nulls(Collection *collection)
+{
+ bool changed = false;
+
+ for (CollectionObject *cob = collection->gobject.first, *cob_next = NULL; cob; cob = cob_next) {
+ cob_next = cob->next;
+
+ if (cob->ob == NULL) {
+ BLI_freelinkN(&collection->gobject, cob);
+ changed = true;
+ }
+ }
+
+ if (changed) {
+ BKE_collection_object_cache_free(collection);
+ }
+}
+
void BKE_collections_object_remove_nulls(Main *bmain)
{
+ for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) {
+ collection_object_remove_nulls(scene->master_collection);
+ }
+
for (Collection *collection = bmain->collection.first; collection; collection = collection->id.next) {
- if (!BKE_collection_is_in_scene(collection)) {
- bool changed = false;
+ collection_object_remove_nulls(collection);
+ }
+}
- for (CollectionObject *cob = collection->gobject.first, *cob_next = NULL; cob; cob = cob_next) {
- cob_next = cob->next;
+static void collection_null_children_remove(Collection *collection)
+{
+ for (CollectionChild *child = collection->children.first, *child_next = NULL; child; child = child_next) {
+ child_next = child->next;
- if (cob->ob == NULL) {
- BLI_freelinkN(&collection->gobject, cob);
- changed = true;
- }
- }
+ if (child->collection == NULL) {
+ BLI_freelinkN(&collection->children, child);
+ }
+ }
+}
- if (changed) {
- BKE_collection_object_cache_free(collection);
- }
+static void collection_missing_parents_remove(Collection *collection)
+{
+ for (CollectionParent *parent = collection->parents.first, *parent_next; parent != NULL; parent = parent_next) {
+ parent_next = parent->next;
+
+ if (!collection_find_child(parent->collection, collection)) {
+ BLI_freelinkN(&collection->parents, parent);
}
}
}
-/*
- * Remove all NULL children from parent objects of changed old_collection.
+/**
+ * Remove all NULL children from parent collections of changed \a collection.
* This is used for library remapping, where these pointers have been set to NULL.
* Otherwise this should never happen.
+ *
+ * \note caller must ensure BKE_main_collection_sync_remap() is called afterwards!
+ *
+ * \param collection may be \a NULL, in which case whole \a bmain database of collections is checked.
*/
-void BKE_collections_child_remove_nulls(Main *bmain, Collection *old_collection)
+void BKE_collections_child_remove_nulls(Main *bmain, Collection *collection)
{
- bool changed = false;
+ if (collection == NULL) {
+ /* We need to do the checks in two steps when more than one collection may be involved,
+ * otherwise we can miss some cases...
+ * Also, master collections are not in bmain, so we also need to loop over scenes.
+ */
+ for (collection = bmain->collection.first; collection != NULL; collection = collection->id.next) {
+ collection_null_children_remove(collection);
+ }
+ for (Scene *scene = bmain->scene.first; scene != NULL; scene = scene->id.next) {
+ collection_null_children_remove(BKE_collection_master(scene));
+ }
- for (CollectionChild *child = old_collection->children.first; child; child = child->next) {
- CollectionParent *cparent = collection_find_parent(child->collection, old_collection);
- if (cparent) {
- BLI_freelinkN(&child->collection->parents, cparent);
+ for (collection = bmain->collection.first; collection != NULL; collection = collection->id.next) {
+ collection_missing_parents_remove(collection);
+ }
+ for (Scene *scene = bmain->scene.first; scene != NULL; scene = scene->id.next) {
+ collection_missing_parents_remove(BKE_collection_master(scene));
}
}
+ else {
+ for (CollectionParent *parent = collection->parents.first, *parent_next; parent; parent = parent_next) {
+ parent_next = parent->next;
- for (CollectionParent *cparent = old_collection->parents.first; cparent; cparent = cparent->next) {
- Collection *parent = cparent->collection;
-
- for (CollectionChild *child = parent->children.first, *child_next = NULL; child; child = child_next) {
- child_next = child->next;
+ collection_null_children_remove(parent->collection);
- if (child->collection == NULL) {
- BLI_freelinkN(&parent->children, child);
- changed = true;
+ if (!collection_find_child(parent->collection, collection)) {
+ BLI_freelinkN(&collection->parents, parent);
}
}
}
-
- BLI_freelistN(&old_collection->parents);
-
- if (changed) {
- BKE_main_collection_sync(bmain);
- }
}
/**
diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
index 0ba30fedc32..d868a06d134 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -43,7 +43,8 @@
#include "BLI_utildefines.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
-#include "BLI_edgehash.h"
+#include "BLI_task.h"
+#include "BLI_threads.h"
#include "BKE_cloth.h"
#include "BKE_collection.h"
@@ -52,9 +53,6 @@
#include "BKE_modifier.h"
#include "BKE_scene.h"
-#ifdef WITH_BULLET
-#include "Bullet-C-Api.h"
-#endif
#include "BLI_kdopbvh.h"
#include "BKE_collision.h"
@@ -67,6 +65,23 @@
#endif
+typedef struct ColDetectData {
+ ClothModifierData *clmd;
+ CollisionModifierData *collmd;
+ BVHTreeOverlap *overlap;
+ CollPair *collisions;
+ bool culling;
+ bool use_normal;
+ bool collided;
+} ColDetectData;
+
+typedef struct SelfColDetectData {
+ ClothModifierData *clmd;
+ BVHTreeOverlap *overlap;
+ CollPair *collisions;
+ bool collided;
+} SelfColDetectData;
+
/***********************************
Collision modifier code start
***********************************/
@@ -74,7 +89,7 @@ Collision modifier code start
/* step is limited from 0 (frame start position) to 1 (frame end position) */
void collision_move_object(CollisionModifierData *collmd, float step, float prevstep)
{
- float tv[3] = {0, 0, 0};
+ float oldx[3];
unsigned int i = 0;
/* the collider doesn't move this frame */
@@ -87,15 +102,14 @@ void collision_move_object(CollisionModifierData *collmd, float step, float prev
}
for (i = 0; i < collmd->mvert_num; i++) {
- sub_v3_v3v3(tv, collmd->xnew[i].co, collmd->x[i].co);
- VECADDS(collmd->current_x[i].co, collmd->x[i].co, tv, prevstep);
- VECADDS(collmd->current_xnew[i].co, collmd->x[i].co, tv, step);
- sub_v3_v3v3(collmd->current_v[i].co, collmd->current_xnew[i].co, collmd->current_x[i].co);
+ interp_v3_v3v3(oldx, collmd->x[i].co, collmd->xnew[i].co, prevstep);
+ interp_v3_v3v3(collmd->current_x[i].co, collmd->x[i].co, collmd->xnew[i].co, step);
+ sub_v3_v3v3(collmd->current_v[i].co, collmd->current_x[i].co, oldx);
}
bvhtree_update_from_mvert(
- collmd->bvhtree, collmd->current_x, collmd->current_xnew,
- collmd->tri, collmd->tri_num, true);
+ collmd->bvhtree, collmd->current_x, NULL,
+ collmd->tri, collmd->tri_num, false);
}
BVHTree *bvhtree_build_from_mvert(
@@ -178,6 +192,233 @@ void bvhtree_update_from_mvert(
Collision modifier code end
***********************************/
+BLI_INLINE int next_ind(int i)
+{
+ return (++i < 3) ? i : 0;
+}
+
+static float compute_collision_point(float a1[3], float a2[3], float a3[3], float b1[3], float b2[3], float b3[3],
+ bool culling, bool use_normal, float r_a[3], float r_b[3], float r_vec[3])
+{
+ float a[3][3];
+ float b[3][3];
+ float dist = FLT_MAX;
+ float tmp_co1[3], tmp_co2[3];
+ float isect_a[3], isect_b[3];
+ int isect_count = 0;
+ float tmp, tmp_vec[3];
+ float normal[3], cent[3];
+ bool backside = false;
+
+ copy_v3_v3(a[0], a1);
+ copy_v3_v3(a[1], a2);
+ copy_v3_v3(a[2], a3);
+
+ copy_v3_v3(b[0], b1);
+ copy_v3_v3(b[1], b2);
+ copy_v3_v3(b[2], b3);
+
+ /* Find intersections. */
+ for (int i = 0; i < 3; i++) {
+ if (isect_line_segment_tri_v3(a[i], a[next_ind(i)], b[0], b[1], b[2], &tmp, NULL)) {
+ interp_v3_v3v3(isect_a, a[i], a[next_ind(i)], tmp);
+ isect_count++;
+ }
+ }
+
+ if (isect_count == 0) {
+ for (int i = 0; i < 3; i++) {
+ if (isect_line_segment_tri_v3(b[i], b[next_ind(i)], a[0], a[1], a[2], &tmp, NULL)) {
+ isect_count++;
+ }
+ }
+ }
+ else if (isect_count == 1) {
+ for (int i = 0; i < 3; i++) {
+ if (isect_line_segment_tri_v3(b[i], b[next_ind(i)], a[0], a[1], a[2], &tmp, NULL)) {
+ interp_v3_v3v3(isect_b, b[i], b[next_ind(i)], tmp);
+ break;
+ }
+ }
+ }
+
+ /* Determine collision side. */
+ if (culling) {
+ normal_tri_v3(normal, b[0], b[1], b[2]);
+ mid_v3_v3v3v3(cent, b[0], b[1], b[2]);
+
+ if (isect_count == 2) {
+ backside = true;
+ }
+ else if (isect_count == 0) {
+ for (int i = 0; i < 3; i++) {
+ sub_v3_v3v3(tmp_vec, a[i], cent);
+ if (dot_v3v3(tmp_vec, normal) < 0.0f) {
+ backside = true;
+ break;
+ }
+ }
+ }
+ }
+ else if (use_normal) {
+ normal_tri_v3(normal, b[0], b[1], b[2]);
+ }
+
+ if (isect_count == 1) {
+ /* Edge intersection. */
+ copy_v3_v3(r_a, isect_a);
+ copy_v3_v3(r_b, isect_b);
+
+ if (use_normal) {
+ copy_v3_v3(r_vec, normal);
+ }
+ else {
+ sub_v3_v3v3(r_vec, r_b, r_a);
+ }
+
+ return 0.0f;
+ }
+
+ if (backside) {
+ float maxdist = 0.0f;
+ bool found = false;
+
+ /* Point projections. */
+ for (int i = 0; i < 3; i++) {
+ if (isect_ray_tri_v3(a[i], normal, b[0], b[1], b[2], &tmp, NULL)) {
+ if (tmp > maxdist) {
+ maxdist = tmp;
+ copy_v3_v3(r_a, a[i]);
+ madd_v3_v3v3fl(r_b, a[i], normal, tmp);
+ found = true;
+ }
+ }
+ }
+
+ negate_v3(normal);
+
+ for (int i = 0; i < 3; i++) {
+ if (isect_ray_tri_v3(b[i], normal, a[0], a[1], a[2], &tmp, NULL)) {
+ if (tmp > maxdist) {
+ maxdist = tmp;
+ madd_v3_v3v3fl(r_a, b[i], normal, tmp);
+ copy_v3_v3(r_b, b[i]);
+ found = true;
+ }
+ }
+ }
+
+ negate_v3(normal);
+
+ /* Edge projections. */
+ for (int i = 0; i < 3; i++) {
+ float dir[3];
+
+ sub_v3_v3v3(tmp_vec, b[next_ind(i)], b[i]);
+ cross_v3_v3v3(dir, tmp_vec, normal);
+
+ for (int j = 0; j < 3; j++) {
+ if (isect_line_plane_v3(tmp_co1, a[j], a[next_ind(j)], b[i], dir) &&
+ point_in_slice_seg(tmp_co1, a[j], a[next_ind(j)]) &&
+ point_in_slice_seg(tmp_co1, b[i], b[next_ind(i)]))
+ {
+ closest_to_line_v3(tmp_co2, tmp_co1, b[i], b[next_ind(i)]);
+ sub_v3_v3v3(tmp_vec, tmp_co1, tmp_co2);
+ tmp = len_v3(tmp_vec);
+
+ if ((tmp > maxdist) && (dot_v3v3(tmp_vec, normal) < 0.0f)) {
+ maxdist = tmp;
+ copy_v3_v3(r_a, tmp_co1);
+ copy_v3_v3(r_b, tmp_co2);
+ found = true;
+ }
+ }
+ }
+ }
+
+ /* If no point is found, will fallback onto regular proximity test below. */
+ if (found) {
+ sub_v3_v3v3(r_vec, r_b, r_a);
+
+ if (use_normal) {
+ if (dot_v3v3(normal, r_vec) >= 0.0f) {
+ copy_v3_v3(r_vec, normal);
+ }
+ else {
+ negate_v3_v3(r_vec, normal);
+ }
+ }
+
+ return 0.0f;
+ }
+ }
+
+ /* Closest point. */
+ for (int i = 0; i < 3; i++) {
+ closest_on_tri_to_point_v3(tmp_co1, a[i], b[0], b[1], b[2]);
+ tmp = len_squared_v3v3(tmp_co1, a[i]);
+
+ if (tmp < dist) {
+ dist = tmp;
+ copy_v3_v3(r_a, a[i]);
+ copy_v3_v3(r_b, tmp_co1);
+ }
+ }
+
+ for (int i = 0; i < 3; i++) {
+ closest_on_tri_to_point_v3(tmp_co1, b[i], a[0], a[1], a[2]);
+ tmp = len_squared_v3v3(tmp_co1, b[i]);
+
+ if (tmp < dist) {
+ dist = tmp;
+ copy_v3_v3(r_a, tmp_co1);
+ copy_v3_v3(r_b, b[i]);
+ }
+ }
+
+ /* Closest edge. */
+ if (isect_count == 0) {
+ for (int i = 0; i < 3; i++) {
+ for (int j = 0; j < 3; j++) {
+ isect_seg_seg_v3(a[i], a[next_ind(i)], b[j], b[next_ind(j)], tmp_co1, tmp_co2);
+ tmp = len_squared_v3v3(tmp_co1, tmp_co2);
+
+ if (tmp < dist) {
+ dist = tmp;
+ copy_v3_v3(r_a, tmp_co1);
+ copy_v3_v3(r_b, tmp_co2);
+ }
+ }
+ }
+ }
+
+ if (isect_count == 0) {
+ sub_v3_v3v3(r_vec, r_a, r_b);
+ dist = sqrtf(dist);
+ }
+ else {
+ sub_v3_v3v3(r_vec, r_b, r_a);
+ dist = 0.0f;
+ }
+
+ if (culling && use_normal) {
+ copy_v3_v3(r_vec, normal);
+ }
+ else if (use_normal) {
+ if (dot_v3v3(normal, r_vec) >= 0.0f) {
+ copy_v3_v3(r_vec, normal);
+ }
+ else {
+ negate_v3_v3(r_vec, normal);
+ }
+ }
+ else if (culling && (dot_v3v3(r_vec, normal) < 0.0f)) {
+ return FLT_MAX;
+ }
+
+ return dist;
+}
+
// w3 is not perfect
static void collision_compute_barycentric ( float pv[3], float p1[3], float p2[3], float p3[3], float *w1, float *w2, float *w3 )
{
@@ -232,141 +473,131 @@ DO_INLINE void collision_interpolateOnTriangle ( float to[3], float v1[3], float
VECADDMUL(to, v3, w3);
}
-static int cloth_collision_response_static ( ClothModifierData *clmd, CollisionModifierData *collmd, CollPair *collpair, CollPair *collision_end )
+static int cloth_collision_response_static(ClothModifierData *clmd, CollisionModifierData *collmd, Object *collob,
+ CollPair *collpair, uint collision_count, const float dt)
{
int result = 0;
Cloth *cloth1;
float w1, w2, w3, u1, u2, u3;
float v1[3], v2[3], relativeVelocity[3];
float magrelVel;
- float epsilon2 = BLI_bvhtree_get_epsilon ( collmd->bvhtree );
+ float epsilon2 = BLI_bvhtree_get_epsilon(collmd->bvhtree);
cloth1 = clmd->clothObject;
- for ( ; collpair != collision_end; collpair++ ) {
+ for (int i = 0; i < collision_count; i++, collpair++) {
float i1[3], i2[3], i3[3];
zero_v3(i1);
zero_v3(i2);
zero_v3(i3);
- /* only handle static collisions here */
- if ( collpair->flag & COLLISION_IN_FUTURE )
+ /* Only handle static collisions here. */
+ if (collpair->flag & (COLLISION_IN_FUTURE | COLLISION_INACTIVE)) {
continue;
+ }
- /* compute barycentric coordinates for both collision points */
- collision_compute_barycentric ( collpair->pa,
- cloth1->verts[collpair->ap1].txold,
- cloth1->verts[collpair->ap2].txold,
- cloth1->verts[collpair->ap3].txold,
- &w1, &w2, &w3 );
+ /* Compute barycentric coordinates for both collision points. */
+ collision_compute_barycentric(collpair->pa,
+ cloth1->verts[collpair->ap1].tx,
+ cloth1->verts[collpair->ap2].tx,
+ cloth1->verts[collpair->ap3].tx,
+ &w1, &w2, &w3);
- /* was: txold */
- collision_compute_barycentric ( collpair->pb,
- collmd->current_x[collpair->bp1].co,
- collmd->current_x[collpair->bp2].co,
- collmd->current_x[collpair->bp3].co,
- &u1, &u2, &u3 );
+ collision_compute_barycentric(collpair->pb,
+ collmd->current_x[collpair->bp1].co,
+ collmd->current_x[collpair->bp2].co,
+ collmd->current_x[collpair->bp3].co,
+ &u1, &u2, &u3);
/* Calculate relative "velocity". */
- collision_interpolateOnTriangle ( v1, cloth1->verts[collpair->ap1].tv, cloth1->verts[collpair->ap2].tv, cloth1->verts[collpair->ap3].tv, w1, w2, w3 );
+ collision_interpolateOnTriangle(v1, cloth1->verts[collpair->ap1].tv, cloth1->verts[collpair->ap2].tv, cloth1->verts[collpair->ap3].tv, w1, w2, w3);
- collision_interpolateOnTriangle ( v2, collmd->current_v[collpair->bp1].co, collmd->current_v[collpair->bp2].co, collmd->current_v[collpair->bp3].co, u1, u2, u3 );
+ collision_interpolateOnTriangle(v2, collmd->current_v[collpair->bp1].co, collmd->current_v[collpair->bp2].co, collmd->current_v[collpair->bp3].co, u1, u2, u3);
sub_v3_v3v3(relativeVelocity, v2, v1);
/* Calculate the normal component of the relative velocity (actually only the magnitude - the direction is stored in 'normal'). */
magrelVel = dot_v3v3(relativeVelocity, collpair->normal);
- /* printf("magrelVel: %f\n", magrelVel); */
-
- /* Calculate masses of points.
- * TODO */
-
- /* If v_n_mag < 0 the edges are approaching each other. */
- if ( magrelVel > ALMOST_ZERO ) {
+ /* If magrelVel < 0 the edges are approaching each other. */
+ if (magrelVel > 0.0f) {
/* Calculate Impulse magnitude to stop all motion in normal direction. */
float magtangent = 0, repulse = 0, d = 0;
double impulse = 0.0;
float vrel_t_pre[3];
- float temp[3], spf;
+ float temp[3];
+ float time_multiplier;
- /* calculate tangential velocity */
- copy_v3_v3 ( temp, collpair->normal );
+ /* Calculate tangential velocity. */
+ copy_v3_v3(temp, collpair->normal);
mul_v3_fl(temp, magrelVel);
sub_v3_v3v3(vrel_t_pre, relativeVelocity, temp);
/* Decrease in magnitude of relative tangential velocity due to coulomb friction
- * in original formula "magrelVel" should be the "change of relative velocity in normal direction" */
- magtangent = min_ff(clmd->coll_parms->friction * 0.01f * magrelVel, len_v3(vrel_t_pre));
+ * in original formula "magrelVel" should be the "change of relative velocity in normal direction". */
+ magtangent = min_ff(collob->pd->pdef_cfrict * 0.01f * magrelVel, len_v3(vrel_t_pre));
/* Apply friction impulse. */
if ( magtangent > ALMOST_ZERO ) {
normalize_v3(vrel_t_pre);
- impulse = magtangent / ( 1.0f + w1*w1 + w2*w2 + w3*w3 ); /* 2.0 * */
- VECADDMUL ( i1, vrel_t_pre, w1 * impulse );
- VECADDMUL ( i2, vrel_t_pre, w2 * impulse );
- VECADDMUL ( i3, vrel_t_pre, w3 * impulse );
+ impulse = magtangent / 1.5;
+
+ VECADDMUL(i1, vrel_t_pre, w1 * impulse);
+ VECADDMUL(i2, vrel_t_pre, w2 * impulse);
+ VECADDMUL(i3, vrel_t_pre, w3 * impulse);
}
- /* Apply velocity stopping impulse
- * I_c = m * v_N / 2.0
- * no 2.0 * magrelVel normally, but looks nicer DG */
- impulse = magrelVel / ( 1.0 + w1*w1 + w2*w2 + w3*w3 );
+ /* Apply velocity stopping impulse. */
+ impulse = magrelVel / 1.5f;
- VECADDMUL ( i1, collpair->normal, w1 * impulse );
+ VECADDMUL(i1, collpair->normal, w1 * impulse);
cloth1->verts[collpair->ap1].impulse_count++;
- VECADDMUL ( i2, collpair->normal, w2 * impulse );
+ VECADDMUL(i2, collpair->normal, w2 * impulse);
cloth1->verts[collpair->ap2].impulse_count++;
- VECADDMUL ( i3, collpair->normal, w3 * impulse );
+ VECADDMUL(i3, collpair->normal, w3 * impulse);
cloth1->verts[collpair->ap3].impulse_count++;
- /* Apply repulse impulse if distance too short
- * I_r = -min(dt*kd, m(0, 1d/dt - v_n))
- * DG: this formula ineeds to be changed for this code since we apply impulses/repulses like this:
- * v += impulse; x_new = x + v;
- * We don't use dt!!
- * DG TODO: Fix usage of dt here! */
- spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale;
+ time_multiplier = 1.0f / (clmd->sim_parms->dt * clmd->sim_parms->timescale);
d = clmd->coll_parms->epsilon*8.0f/9.0f + epsilon2*8.0f/9.0f - collpair->distance;
- if ( ( magrelVel < 0.1f*d*spf ) && ( d > ALMOST_ZERO ) ) {
- repulse = MIN2 ( d*1.0f/spf, 0.1f*d*spf - magrelVel );
- /* stay on the safe side and clamp repulse */
- if ( impulse > ALMOST_ZERO )
- repulse = min_ff( repulse, 5.0*impulse );
+ if ((magrelVel < 0.1f * d * time_multiplier) && (d > ALMOST_ZERO)) {
+ repulse = MIN2(d / time_multiplier, 0.1f * d * time_multiplier - magrelVel);
+
+ /* Stay on the safe side and clamp repulse. */
+ if (impulse > ALMOST_ZERO) {
+ repulse = min_ff(repulse, 5.0f * impulse);
+ }
+
repulse = max_ff(impulse, repulse);
- impulse = repulse / ( 1.0f + w1*w1 + w2*w2 + w3*w3 ); /* original 2.0 / 0.25 */
- VECADDMUL ( i1, collpair->normal, impulse );
- VECADDMUL ( i2, collpair->normal, impulse );
- VECADDMUL ( i3, collpair->normal, impulse );
+ impulse = repulse / 1.5f;
+
+ VECADDMUL(i1, collpair->normal, impulse);
+ VECADDMUL(i2, collpair->normal, impulse);
+ VECADDMUL(i3, collpair->normal, impulse);
}
result = 1;
}
else {
- /* Apply repulse impulse if distance too short
- * I_r = -min(dt*kd, max(0, 1d/dt - v_n))
- * DG: this formula ineeds to be changed for this code since we apply impulses/repulses like this:
- * v += impulse; x_new = x + v;
- * We don't use dt!! */
- float spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale;
-
- float d = clmd->coll_parms->epsilon*8.0f/9.0f + epsilon2*8.0f/9.0f - (float)collpair->distance;
- if ( d > ALMOST_ZERO) {
- /* stay on the safe side and clamp repulse */
- float repulse = d*1.0f/spf;
+ float time_multiplier = 1.0f / (clmd->sim_parms->dt * clmd->sim_parms->timescale);
+ float d;
+
+ d = clmd->coll_parms->epsilon*8.0f/9.0f + epsilon2*8.0f/9.0f - collpair->distance;
- float impulse = repulse / ( 3.0f * ( 1.0f + w1*w1 + w2*w2 + w3*w3 )); /* original 2.0 / 0.25 */
+ if (d > ALMOST_ZERO) {
+ /* Stay on the safe side and clamp repulse. */
+ float repulse = d / time_multiplier;
+ float impulse = repulse / 4.5f;
- VECADDMUL ( i1, collpair->normal, impulse );
- VECADDMUL ( i2, collpair->normal, impulse );
- VECADDMUL ( i3, collpair->normal, impulse );
+ VECADDMUL(i1, collpair->normal, w1 * impulse);
+ VECADDMUL(i2, collpair->normal, w2 * impulse);
+ VECADDMUL(i3, collpair->normal, w3 * impulse);
cloth1->verts[collpair->ap1].impulse_count++;
cloth1->verts[collpair->ap2].impulse_count++;
@@ -377,20 +608,190 @@ static int cloth_collision_response_static ( ClothModifierData *clmd, CollisionM
}
if (result) {
- int i = 0;
+ float clamp = clmd->coll_parms->clamp * dt;
+
+ if ((clamp > 0.0f) &&
+ ((len_v3(i1) > clamp) ||
+ (len_v3(i2) > clamp) ||
+ (len_v3(i3) > clamp)))
+ {
+ return 0;
+ }
- for (i = 0; i < 3; i++) {
- if (cloth1->verts[collpair->ap1].impulse_count > 0 && ABS(cloth1->verts[collpair->ap1].impulse[i]) < ABS(i1[i]))
- cloth1->verts[collpair->ap1].impulse[i] = i1[i];
+ for (int j = 0; j < 3; j++) {
+ if (cloth1->verts[collpair->ap1].impulse_count > 0 && ABS(cloth1->verts[collpair->ap1].impulse[j]) < ABS(i1[j]))
+ cloth1->verts[collpair->ap1].impulse[j] = i1[j];
- if (cloth1->verts[collpair->ap2].impulse_count > 0 && ABS(cloth1->verts[collpair->ap2].impulse[i]) < ABS(i2[i]))
- cloth1->verts[collpair->ap2].impulse[i] = i2[i];
+ if (cloth1->verts[collpair->ap2].impulse_count > 0 && ABS(cloth1->verts[collpair->ap2].impulse[j]) < ABS(i2[j]))
+ cloth1->verts[collpair->ap2].impulse[j] = i2[j];
- if (cloth1->verts[collpair->ap3].impulse_count > 0 && ABS(cloth1->verts[collpair->ap3].impulse[i]) < ABS(i3[i]))
- cloth1->verts[collpair->ap3].impulse[i] = i3[i];
+ if (cloth1->verts[collpair->ap3].impulse_count > 0 && ABS(cloth1->verts[collpair->ap3].impulse[j]) < ABS(i3[j]))
+ cloth1->verts[collpair->ap3].impulse[j] = i3[j];
}
}
}
+
+ return result;
+}
+
+static int cloth_selfcollision_response_static(ClothModifierData *clmd, CollPair *collpair,
+ uint collision_count, const float dt)
+{
+ int result = 0;
+ Cloth *cloth1;
+ float w1, w2, w3, u1, u2, u3;
+ float v1[3], v2[3], relativeVelocity[3];
+ float magrelVel;
+
+ cloth1 = clmd->clothObject;
+
+ for (int i = 0; i < collision_count; i++, collpair++) {
+ float i1[3], i2[3], i3[3];
+
+ zero_v3(i1);
+ zero_v3(i2);
+ zero_v3(i3);
+
+ /* Only handle static collisions here. */
+ if (collpair->flag & (COLLISION_IN_FUTURE | COLLISION_INACTIVE)) {
+ continue;
+ }
+
+ /* Compute barycentric coordinates for both collision points. */
+ collision_compute_barycentric(collpair->pa,
+ cloth1->verts[collpair->ap1].tx,
+ cloth1->verts[collpair->ap2].tx,
+ cloth1->verts[collpair->ap3].tx,
+ &w1, &w2, &w3);
+
+ collision_compute_barycentric(collpair->pb,
+ cloth1->verts[collpair->bp1].tx,
+ cloth1->verts[collpair->bp2].tx,
+ cloth1->verts[collpair->bp3].tx,
+ &u1, &u2, &u3);
+
+ /* Calculate relative "velocity". */
+ collision_interpolateOnTriangle(v1, cloth1->verts[collpair->ap1].tv, cloth1->verts[collpair->ap2].tv, cloth1->verts[collpair->ap3].tv, w1, w2, w3);
+
+ collision_interpolateOnTriangle(v2, cloth1->verts[collpair->bp1].tv, cloth1->verts[collpair->bp2].tv, cloth1->verts[collpair->bp3].tv, u1, u2, u3);
+
+ sub_v3_v3v3(relativeVelocity, v2, v1);
+
+ /* Calculate the normal component of the relative velocity (actually only the magnitude - the direction is stored in 'normal'). */
+ magrelVel = dot_v3v3(relativeVelocity, collpair->normal);
+
+ /* TODO: Impulses should be weighed by mass as this is self col,
+ * this has to be done after mass distribution is implemented. */
+
+ /* If magrelVel < 0 the edges are approaching each other. */
+ if (magrelVel > 0.0f) {
+ /* Calculate Impulse magnitude to stop all motion in normal direction. */
+ float magtangent = 0, repulse = 0, d = 0;
+ double impulse = 0.0;
+ float vrel_t_pre[3];
+ float temp[3], time_multiplier;
+
+ /* Calculate tangential velocity. */
+ copy_v3_v3(temp, collpair->normal);
+ mul_v3_fl(temp, magrelVel);
+ sub_v3_v3v3(vrel_t_pre, relativeVelocity, temp);
+
+ /* Decrease in magnitude of relative tangential velocity due to coulomb friction
+ * in original formula "magrelVel" should be the "change of relative velocity in normal direction". */
+ magtangent = min_ff(clmd->coll_parms->self_friction * 0.01f * magrelVel, len_v3(vrel_t_pre));
+
+ /* Apply friction impulse. */
+ if (magtangent > ALMOST_ZERO) {
+ normalize_v3(vrel_t_pre);
+
+ impulse = magtangent / 1.5;
+
+ VECADDMUL(i1, vrel_t_pre, w1 * impulse);
+ VECADDMUL(i2, vrel_t_pre, w2 * impulse);
+ VECADDMUL(i3, vrel_t_pre, w3 * impulse);
+ }
+
+ /* Apply velocity stopping impulse. */
+ impulse = magrelVel / 3.0f;
+
+ VECADDMUL(i1, collpair->normal, w1 * impulse);
+ cloth1->verts[collpair->ap1].impulse_count++;
+
+ VECADDMUL(i2, collpair->normal, w2 * impulse);
+ cloth1->verts[collpair->ap2].impulse_count++;
+
+ VECADDMUL(i3, collpair->normal, w3 * impulse);
+ cloth1->verts[collpair->ap3].impulse_count++;
+
+ time_multiplier = 1.0f / (clmd->sim_parms->dt * clmd->sim_parms->timescale);
+
+ d = clmd->coll_parms->selfepsilon * 8.0f / 9.0f * 2.0f - collpair->distance;
+
+ if ((magrelVel < 0.1f * d * time_multiplier) && (d > ALMOST_ZERO)) {
+ repulse = MIN2 (d / time_multiplier, 0.1f * d * time_multiplier - magrelVel);
+
+ if (impulse > ALMOST_ZERO) {
+ repulse = min_ff(repulse, 5.0*impulse);
+ }
+
+ repulse = max_ff(impulse, repulse);
+
+ impulse = repulse / 1.5f;
+
+ VECADDMUL(i1, collpair->normal, w1 * impulse);
+ VECADDMUL(i2, collpair->normal, w2 * impulse);
+ VECADDMUL(i3, collpair->normal, w3 * impulse);
+ }
+
+ result = 1;
+ }
+ else {
+ float time_multiplier = 1.0f / (clmd->sim_parms->dt * clmd->sim_parms->timescale);
+ float d;
+
+ d = clmd->coll_parms->selfepsilon * 8.0f / 9.0f * 2.0f - collpair->distance;
+
+ if ( d > ALMOST_ZERO) {
+ /* Stay on the safe side and clamp repulse. */
+ float repulse = d*1.0f/time_multiplier;
+ float impulse = repulse / 9.0f;
+
+ VECADDMUL(i1, collpair->normal, w1 * impulse);
+ VECADDMUL(i2, collpair->normal, w2 * impulse);
+ VECADDMUL(i3, collpair->normal, w3 * impulse);
+
+ cloth1->verts[collpair->ap1].impulse_count++;
+ cloth1->verts[collpair->ap2].impulse_count++;
+ cloth1->verts[collpair->ap3].impulse_count++;
+
+ result = 1;
+ }
+ }
+
+ if (result) {
+ float clamp = clmd->coll_parms->self_clamp * dt;
+
+ if ((clamp > 0.0f) &&
+ ((len_v3(i1) > clamp) ||
+ (len_v3(i2) > clamp) ||
+ (len_v3(i3) > clamp)))
+ {
+ return 0;
+ }
+
+ for (int j = 0; j < 3; j++) {
+ if (cloth1->verts[collpair->ap1].impulse_count > 0 && ABS(cloth1->verts[collpair->ap1].impulse[j]) < ABS(i1[j]))
+ cloth1->verts[collpair->ap1].impulse[j] = i1[j];
+
+ if (cloth1->verts[collpair->ap2].impulse_count > 0 && ABS(cloth1->verts[collpair->ap2].impulse[j]) < ABS(i2[j]))
+ cloth1->verts[collpair->ap2].impulse[j] = i2[j];
+
+ if (cloth1->verts[collpair->ap3].impulse_count > 0 && ABS(cloth1->verts[collpair->ap3].impulse[j]) < ABS(i3[j]))
+ cloth1->verts[collpair->ap3].impulse[j] = i3[j];
+ }
+ }
+ }
+
return result;
}
@@ -398,89 +799,118 @@ static int cloth_collision_response_static ( ClothModifierData *clmd, CollisionM
# pragma GCC diagnostic pop
#endif
-//Determines collisions on overlap, collisions are written to collpair[i] and collision+number_collision_found is returned
-static CollPair* cloth_collision(ModifierData *md1, ModifierData *md2,
- BVHTreeOverlap *overlap, CollPair *collpair, float UNUSED(dt))
+static void cloth_collision(
+ void *__restrict userdata,
+ const int index,
+ const ParallelRangeTLS *__restrict UNUSED(tls))
{
- ClothModifierData *clmd = (ClothModifierData *)md1;
- CollisionModifierData *collmd = (CollisionModifierData *) md2;
- /* Cloth *cloth = clmd->clothObject; */ /* UNUSED */
+ ColDetectData *data = (ColDetectData *)userdata;
+
+ ClothModifierData *clmd = data->clmd;
+ CollisionModifierData *collmd = data->collmd;
+ CollPair *collpair = data->collisions;
const MVertTri *tri_a, *tri_b;
-#ifdef WITH_BULLET
ClothVertex *verts1 = clmd->clothObject->verts;
-#endif
- double distance = 0;
+ float distance = 0.0f;
float epsilon1 = clmd->coll_parms->epsilon;
- float epsilon2 = BLI_bvhtree_get_epsilon ( collmd->bvhtree );
+ float epsilon2 = BLI_bvhtree_get_epsilon(collmd->bvhtree);
+ float pa[3], pb[3], vect[3];
- tri_a = &clmd->clothObject->tri[overlap->indexA];
- tri_b = &collmd->tri[overlap->indexB];
+ tri_a = &clmd->clothObject->tri[data->overlap[index].indexA];
+ tri_b = &collmd->tri[data->overlap[index].indexB];
- /* fill face_a */
- collpair->ap1 = tri_a->tri[0];
- collpair->ap2 = tri_a->tri[1];
- collpair->ap3 = tri_a->tri[2];
+ /* Compute distance and normal. */
+ distance = compute_collision_point(verts1[tri_a->tri[0]].tx, verts1[tri_a->tri[1]].tx, verts1[tri_a->tri[2]].tx,
+ collmd->current_x[tri_b->tri[0]].co, collmd->current_x[tri_b->tri[1]].co, collmd->current_x[tri_b->tri[2]].co,
+ data->culling, data->use_normal, pa, pb, vect);
- /* fill face_b */
- collpair->bp1 = tri_b->tri[0];
- collpair->bp2 = tri_b->tri[1];
- collpair->bp3 = tri_b->tri[2];
+ if ((distance <= (epsilon1 + epsilon2 + ALMOST_ZERO)) && (len_squared_v3(vect) > ALMOST_ZERO)) {
+ collpair[index].ap1 = tri_a->tri[0];
+ collpair[index].ap2 = tri_a->tri[1];
+ collpair[index].ap3 = tri_a->tri[2];
- {
+ collpair[index].bp1 = tri_b->tri[0];
+ collpair[index].bp2 = tri_b->tri[1];
+ collpair[index].bp3 = tri_b->tri[2];
-#ifdef WITH_BULLET
- // calc distance + normal
- distance = plNearestPoints (
- verts1[collpair->ap1].txold, verts1[collpair->ap2].txold, verts1[collpair->ap3].txold, collmd->current_x[collpair->bp1].co, collmd->current_x[collpair->bp2].co, collmd->current_x[collpair->bp3].co, collpair->pa, collpair->pb, collpair->vector );
-#else
- // just be sure that we don't add anything
- distance = 2.0 * (double)( epsilon1 + epsilon2 + ALMOST_ZERO );
-#endif
+ copy_v3_v3(collpair[index].pa, pa);
+ copy_v3_v3(collpair[index].pb, pb);
+ copy_v3_v3(collpair[index].vector, vect);
- // distance -1 means no collision result
- if (distance != -1.0 && (distance <= (double)(epsilon1 + epsilon2 + ALMOST_ZERO))) {
- normalize_v3_v3(collpair->normal, collpair->vector);
+ normalize_v3_v3(collpair[index].normal, collpair[index].vector);
- collpair->distance = distance;
- collpair->flag = 0;
- collpair++;
- }/*
- else {
- float w1, w2, w3, u1, u2, u3;
- float v1[3], v2[3], relativeVelocity[3];
+ collpair[index].distance = distance;
+ collpair[index].flag = 0;
- // calc relative velocity
+ data->collided = true;
+ }
+ else {
+ collpair[index].flag = COLLISION_INACTIVE;
+ }
+}
- // compute barycentric coordinates for both collision points
- collision_compute_barycentric ( collpair->pa,
- verts1[collpair->ap1].txold,
- verts1[collpair->ap2].txold,
- verts1[collpair->ap3].txold,
- &w1, &w2, &w3 );
+static void cloth_selfcollision(
+ void *__restrict userdata,
+ const int index,
+ const ParallelRangeTLS *__restrict UNUSED(tls))
+{
+ SelfColDetectData *data = (SelfColDetectData *)userdata;
- // was: txold
- collision_compute_barycentric ( collpair->pb,
- collmd->current_x[collpair->bp1].co,
- collmd->current_x[collpair->bp2].co,
- collmd->current_x[collpair->bp3].co,
- &u1, &u2, &u3 );
+ ClothModifierData *clmd = data->clmd;
+ CollPair *collpair = data->collisions;
+ const MVertTri *tri_a, *tri_b;
+ ClothVertex *verts1 = clmd->clothObject->verts;
+ float distance = 0.0f;
+ float epsilon = clmd->coll_parms->selfepsilon;
+ float pa[3], pb[3], vect[3];
+
+ tri_a = &clmd->clothObject->tri[data->overlap[index].indexA];
+ tri_b = &clmd->clothObject->tri[data->overlap[index].indexB];
+
+ for (uint i = 0; i < 3; i++) {
+ for (uint j = 0; j < 3; j++) {
+ if (tri_a->tri[i] == tri_b->tri[j]) {
+ collpair[index].flag = COLLISION_INACTIVE;
+ return;
+ }
+ }
+ }
- // Calculate relative "velocity".
- collision_interpolateOnTriangle ( v1, verts1[collpair->ap1].tv, verts1[collpair->ap2].tv, verts1[collpair->ap3].tv, w1, w2, w3 );
+ if (((verts1[tri_a->tri[0]].flags & verts1[tri_a->tri[1]].flags & verts1[tri_a->tri[2]].flags) |
+ (verts1[tri_b->tri[0]].flags & verts1[tri_b->tri[1]].flags & verts1[tri_b->tri[2]].flags)) & CLOTH_VERT_FLAG_NOSELFCOLL)
+ {
+ collpair[index].flag = COLLISION_INACTIVE;
+ return;
+ }
- collision_interpolateOnTriangle ( v2, collmd->current_v[collpair->bp1].co, collmd->current_v[collpair->bp2].co, collmd->current_v[collpair->bp3].co, u1, u2, u3 );
+ /* Compute distance and normal. */
+ distance = compute_collision_point(verts1[tri_a->tri[0]].tx, verts1[tri_a->tri[1]].tx, verts1[tri_a->tri[2]].tx,
+ verts1[tri_b->tri[0]].tx, verts1[tri_b->tri[1]].tx, verts1[tri_b->tri[2]].tx,
+ false, false, pa, pb, vect);
- sub_v3_v3v3(relativeVelocity, v2, v1);
+ if ((distance <= (epsilon * 2.0f + ALMOST_ZERO)) && (len_squared_v3(vect) > ALMOST_ZERO)) {
+ collpair[index].ap1 = tri_a->tri[0];
+ collpair[index].ap2 = tri_a->tri[1];
+ collpair[index].ap3 = tri_a->tri[2];
- if (sqrt(dot_v3v3(relativeVelocity, relativeVelocity)) >= distance)
- {
- // check for collision in the future
- collpair->flag |= COLLISION_IN_FUTURE;
- collpair++;
- }
- }*/
+ collpair[index].bp1 = tri_b->tri[0];
+ collpair[index].bp2 = tri_b->tri[1];
+ collpair[index].bp3 = tri_b->tri[2];
+
+ copy_v3_v3(collpair[index].pa, pa);
+ copy_v3_v3(collpair[index].pb, pb);
+ copy_v3_v3(collpair[index].vector, vect);
+
+ normalize_v3_v3(collpair[index].normal, collpair[index].vector);
+
+ collpair[index].distance = distance;
+ collpair[index].flag = 0;
+
+ data->collided = true;
+ }
+ else {
+ collpair[index].flag = COLLISION_INACTIVE;
}
- return collpair;
}
static void add_collision_object(ListBase *relations, Object *ob, int level, unsigned int modifier_type)
@@ -628,25 +1058,49 @@ void BKE_collider_cache_free(ListBase **colliders)
}
}
+static bool cloth_bvh_objcollisions_nearcheck(ClothModifierData * clmd, CollisionModifierData *collmd,
+ CollPair **collisions, int numresult,
+ BVHTreeOverlap *overlap, bool culling, bool use_normal)
+{
+ *collisions = (CollPair *)MEM_mallocN(sizeof(CollPair) * numresult, "collision array");
+
+ ColDetectData data = {.clmd = clmd,
+ .collmd = collmd,
+ .overlap = overlap,
+ .collisions = *collisions,
+ .culling = culling,
+ .use_normal = use_normal,
+ .collided = false};
+
+ ParallelRangeSettings settings;
+ BLI_parallel_range_settings_defaults(&settings);
+ settings.use_threading = true;
+ BLI_task_parallel_range(0, numresult, &data, cloth_collision, &settings);
+
+ return data.collided;
+}
-static void cloth_bvh_objcollisions_nearcheck ( ClothModifierData * clmd, CollisionModifierData *collmd,
- CollPair **collisions, CollPair **collisions_index, int numresult, BVHTreeOverlap *overlap, double dt)
+static bool cloth_bvh_selfcollisions_nearcheck(ClothModifierData * clmd, CollPair *collisions,
+ int numresult, BVHTreeOverlap *overlap)
{
- int i;
+ SelfColDetectData data = {.clmd = clmd,
+ .overlap = overlap,
+ .collisions = collisions,
+ .collided = false};
- *collisions = (CollPair *) MEM_mallocN(sizeof(CollPair) * numresult * 4, "collision array" ); // * 4 since cloth_collision_static can return more than 1 collision
- *collisions_index = *collisions;
+ ParallelRangeSettings settings;
+ BLI_parallel_range_settings_defaults(&settings);
+ settings.use_threading = true;
+ BLI_task_parallel_range(0, numresult, &data, cloth_selfcollision, &settings);
- for ( i = 0; i < numresult; i++ ) {
- *collisions_index = cloth_collision((ModifierData *)clmd, (ModifierData *)collmd,
- overlap+i, *collisions_index, dt);
- }
+ return data.collided;
}
-static int cloth_bvh_objcollisions_resolve ( ClothModifierData * clmd, CollisionModifierData *collmd, CollPair *collisions, CollPair *collisions_index)
+static int cloth_bvh_objcollisions_resolve(ClothModifierData * clmd, Object **collobjs, CollPair **collisions,
+ uint *collision_counts, const uint numcollobj, const float dt)
{
Cloth *cloth = clmd->clothObject;
- int i=0, j = 0, /*numfaces = 0, */ mvert_num = 0;
+ int i = 0, j = 0, mvert_num = 0;
ClothVertex *verts = NULL;
int ret = 0;
int result = 0;
@@ -654,26 +1108,68 @@ static int cloth_bvh_objcollisions_resolve ( ClothModifierData * clmd, Collision
mvert_num = clmd->clothObject->mvert_num;
verts = cloth->verts;
- // process all collisions (calculate impulses, TODO: also repulses if distance too short)
result = 1;
- for ( j = 0; j < 2; j++ ) { /* 5 is just a value that ensures convergence */
+
+ for (j = 0; j < 2; j++) {
result = 0;
- if ( collmd->bvhtree ) {
- result += cloth_collision_response_static ( clmd, collmd, collisions, collisions_index );
+ for (i = 0; i < numcollobj; i++) {
+ Object *collob= collobjs[i];
+ CollisionModifierData *collmd = (CollisionModifierData *)modifiers_findByType(collob, eModifierType_Collision);
- // apply impulses in parallel
- if (result) {
- for (i = 0; i < mvert_num; i++) {
- // calculate "velocities" (just xnew = xold + v; no dt in v)
- if (verts[i].impulse_count) {
- // VECADDMUL ( verts[i].tv, verts[i].impulse, 1.0f / verts[i].impulse_count );
- VECADD ( verts[i].tv, verts[i].tv, verts[i].impulse);
- zero_v3(verts[i].impulse);
- verts[i].impulse_count = 0;
+ if ( collmd->bvhtree ) {
+ result += cloth_collision_response_static(clmd, collmd, collob, collisions[i], collision_counts[i], dt);
+ }
+ }
- ret++;
- }
+ /* Apply impulses in parallel. */
+ if (result) {
+ for (i = 0; i < mvert_num; i++) {
+ // calculate "velocities" (just xnew = xold + v; no dt in v)
+ if (verts[i].impulse_count) {
+ VECADD ( verts[i].tv, verts[i].tv, verts[i].impulse);
+ VECADD ( verts[i].dcvel, verts[i].dcvel, verts[i].impulse);
+ zero_v3(verts[i].impulse);
+ verts[i].impulse_count = 0;
+
+ ret++;
+ }
+ }
+ }
+ else {
+ break;
+ }
+ }
+ return ret;
+}
+
+static int cloth_bvh_selfcollisions_resolve(ClothModifierData * clmd, CollPair *collisions, int collision_count, const float dt)
+{
+ Cloth *cloth = clmd->clothObject;
+ int i = 0, j = 0, mvert_num = 0;
+ ClothVertex *verts = NULL;
+ int ret = 0;
+ int result = 0;
+
+ mvert_num = clmd->clothObject->mvert_num;
+ verts = cloth->verts;
+
+ for (j = 0; j < 2; j++) {
+ result = 0;
+
+ result += cloth_selfcollision_response_static(clmd, collisions, collision_count, dt);
+
+ /* Apply impulses in parallel. */
+ if (result) {
+ for (i = 0; i < mvert_num; i++) {
+ if (verts[i].impulse_count) {
+ // VECADDMUL ( verts[i].tv, verts[i].impulse, 1.0f / verts[i].impulse_count );
+ VECADD ( verts[i].tv, verts[i].tv, verts[i].impulse);
+ VECADD ( verts[i].dcvel, verts[i].dcvel, verts[i].impulse);
+ zero_v3(verts[i].impulse);
+ verts[i].impulse_count = 0;
+
+ ret++;
}
}
}
@@ -685,218 +1181,149 @@ static int cloth_bvh_objcollisions_resolve ( ClothModifierData * clmd, Collision
return ret;
}
-// cloth - object collisions
-int cloth_bvh_objcollision(Depsgraph *depsgraph, Object *ob, ClothModifierData *clmd, float step, float dt )
+int cloth_bvh_collision(Depsgraph *depsgraph, Object *ob, ClothModifierData *clmd, float step, float dt)
{
- Cloth *cloth= clmd->clothObject;
- BVHTree *cloth_bvh= cloth->bvhtree;
- unsigned int i=0, /* numfaces = 0, */ /* UNUSED */ mvert_num = 0, k, l, j;
- int rounds = 0; // result counts applied collisions; ic is for debug output;
+ Cloth *cloth = clmd->clothObject;
+ BVHTree *cloth_bvh = cloth->bvhtree;
+ uint i = 0, mvert_num = 0;
+ int rounds = 0;
ClothVertex *verts = NULL;
int ret = 0, ret2 = 0;
Object **collobjs = NULL;
unsigned int numcollobj = 0;
+ uint *coll_counts_obj = NULL;
+ BVHTreeOverlap **overlap_obj = NULL;
+ uint coll_count_self = 0;
+ BVHTreeOverlap *overlap_self = NULL;
if ((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_COLLOBJ) || cloth_bvh==NULL)
return 0;
verts = cloth->verts;
- /* numfaces = cloth->numfaces; */ /* UNUSED */
mvert_num = cloth->mvert_num;
- ////////////////////////////////////////////////////////////
- // static collisions
- ////////////////////////////////////////////////////////////
+ if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED) {
+ bvhtree_update_from_cloth(clmd, false, false);
- // update cloth bvh
- bvhtree_update_from_cloth ( clmd, 1 ); // 0 means STATIC, 1 means MOVING (see later in this function)
- bvhselftree_update_from_cloth ( clmd, 0 ); // 0 means STATIC, 1 means MOVING (see later in this function)
+ collobjs = BKE_collision_objects_create(depsgraph, ob, clmd->coll_parms->group, &numcollobj, eModifierType_Collision);
- collobjs = BKE_collision_objects_create(depsgraph, ob, clmd->coll_parms->group, &numcollobj, eModifierType_Collision);
+ if (collobjs) {
+ coll_counts_obj = MEM_callocN(sizeof(uint) * numcollobj, "CollCounts");
+ overlap_obj = MEM_callocN(sizeof(*overlap_obj) * numcollobj, "BVHOverlap");
- if (!collobjs)
- return 0;
+ for (i = 0; i < numcollobj; i++) {
+ Object *collob = collobjs[i];
+ CollisionModifierData *collmd = (CollisionModifierData *)modifiers_findByType(collob, eModifierType_Collision);
- /* move object to position (step) in time */
- for (i = 0; i < numcollobj; i++) {
- Object *collob= collobjs[i];
- CollisionModifierData *collmd = (CollisionModifierData *)modifiers_findByType(collob, eModifierType_Collision);
+ if (!collmd->bvhtree) {
+ continue;
+ }
- if (!collmd->bvhtree)
- continue;
+ /* Move object to position (step) in time. */
+ collision_move_object(collmd, step + dt, step);
- /* move object to position (step) in time */
- collision_move_object ( collmd, step + dt, step );
+ overlap_obj[i] = BLI_bvhtree_overlap(cloth_bvh, collmd->bvhtree, &coll_counts_obj[i], NULL, NULL);
+ }
+ }
}
- do {
- CollPair **collisions, **collisions_index;
+ if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF) {
+ bvhtree_update_from_cloth(clmd, false, true);
+ overlap_self = BLI_bvhtree_overlap(cloth->bvhselftree, cloth->bvhselftree, &coll_count_self, NULL, NULL);
+ }
+
+ do {
ret2 = 0;
- collisions = MEM_callocN(sizeof(CollPair *) *numcollobj, "CollPair");
- collisions_index = MEM_callocN(sizeof(CollPair *) *numcollobj, "CollPair");
+ /* Object collisions. */
+ if ((clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED) && collobjs) {
+ CollPair **collisions;
+ bool collided = false;
- // check all collision objects
- for (i = 0; i < numcollobj; i++) {
- Object *collob= collobjs[i];
- CollisionModifierData *collmd = (CollisionModifierData *)modifiers_findByType(collob, eModifierType_Collision);
- BVHTreeOverlap *overlap = NULL;
- unsigned int result = 0;
+ collisions = MEM_callocN(sizeof(CollPair *) * numcollobj, "CollPair");
- if (!collmd->bvhtree)
- continue;
+ for (i = 0; i < numcollobj; i++) {
+ Object *collob = collobjs[i];
+ CollisionModifierData *collmd = (CollisionModifierData *)modifiers_findByType(collob, eModifierType_Collision);
- /* search for overlapping collision pairs */
- overlap = BLI_bvhtree_overlap(cloth_bvh, collmd->bvhtree, &result, NULL, NULL);
+ if (!collmd->bvhtree) {
+ continue;
+ }
- // go to next object if no overlap is there
- if ( result && overlap ) {
- /* check if collisions really happen (costly near check) */
- cloth_bvh_objcollisions_nearcheck ( clmd, collmd, &collisions[i],
- &collisions_index[i], result, overlap, dt/(float)clmd->coll_parms->loop_count);
+ if (coll_counts_obj[i] && overlap_obj[i]) {
+ collided = cloth_bvh_objcollisions_nearcheck(clmd, collmd, &collisions[i], coll_counts_obj[i], overlap_obj[i],
+ (collob->pd->flag & PFIELD_CLOTH_USE_CULLING),
+ (collob->pd->flag & PFIELD_CLOTH_USE_NORMAL)) || collided;
+ }
+ }
- // resolve nearby collisions
- ret += cloth_bvh_objcollisions_resolve ( clmd, collmd, collisions[i], collisions_index[i]);
+ if (collided) {
+ ret += cloth_bvh_objcollisions_resolve(clmd, collobjs, collisions, coll_counts_obj, numcollobj, dt);
ret2 += ret;
}
- if ( overlap )
- MEM_freeN ( overlap );
- }
- rounds++;
+ for (i = 0; i < numcollobj; i++) {
+ MEM_SAFE_FREE(collisions[i]);
+ }
- for (i = 0; i < numcollobj; i++) {
- if ( collisions[i] ) MEM_freeN ( collisions[i] );
+ MEM_freeN(collisions);
}
- MEM_freeN(collisions);
- MEM_freeN(collisions_index);
+ /* Self collisions. */
+ if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF) {
+ CollPair *collisions = NULL;
- ////////////////////////////////////////////////////////////
- // update positions
- // this is needed for bvh_calc_DOP_hull_moving() [kdop.c]
- ////////////////////////////////////////////////////////////
+ verts = cloth->verts;
+ mvert_num = cloth->mvert_num;
- /* verts come from clmd */
- for (i = 0; i < mvert_num; i++) {
- if ( clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL ) {
- if ( verts [i].flags & CLOTH_VERT_FLAG_PINNED ) {
- continue;
+ if (cloth->bvhselftree) {
+ if (coll_count_self && overlap_self) {
+ collisions = (CollPair *)MEM_mallocN(sizeof(CollPair) * coll_count_self, "collision array");
+
+ if (cloth_bvh_selfcollisions_nearcheck(clmd, collisions, coll_count_self, overlap_self)) {
+ ret += cloth_bvh_selfcollisions_resolve(clmd, collisions, coll_count_self, dt);
+ ret2 += ret;
+ }
}
+
}
- VECADD ( verts[i].tx, verts[i].txold, verts[i].tv );
+ MEM_SAFE_FREE(collisions);
}
- ////////////////////////////////////////////////////////////
-
-
- ////////////////////////////////////////////////////////////
- // Test on *simple* selfcollisions
- ////////////////////////////////////////////////////////////
- if ( clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF ) {
- for (l = 0; l < (unsigned int)clmd->coll_parms->self_loop_count; l++) {
- /* TODO: add coll quality rounds again */
- BVHTreeOverlap *overlap = NULL;
- unsigned int result = 0;
-
- // collisions = 1;
- verts = cloth->verts; // needed for openMP
-
- /* numfaces = cloth->numfaces; */ /* UNUSED */
- mvert_num = cloth->mvert_num;
-
- verts = cloth->verts;
-
- if ( cloth->bvhselftree ) {
- // search for overlapping collision pairs
- overlap = BLI_bvhtree_overlap(cloth->bvhselftree, cloth->bvhselftree, &result, NULL, NULL);
-
- /* Could be parallelized (using BLI_task)... */
- for ( k = 0; k < result; k++ ) {
- float temp[3];
- float length = 0;
- float mindistance;
-
- i = overlap[k].indexA;
- j = overlap[k].indexB;
-
- mindistance = clmd->coll_parms->selfepsilon* ( cloth->verts[i].avg_spring_len + cloth->verts[j].avg_spring_len );
-
- if ( clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL ) {
- if ( ( cloth->verts [i].flags & CLOTH_VERT_FLAG_PINNED ) &&
- ( cloth->verts [j].flags & CLOTH_VERT_FLAG_PINNED ) )
- {
- continue;
- }
- }
-
- if ((cloth->verts[i].flags & CLOTH_VERT_FLAG_NOSELFCOLL) ||
- (cloth->verts[j].flags & CLOTH_VERT_FLAG_NOSELFCOLL))
- {
- continue;
- }
-
- sub_v3_v3v3(temp, verts[i].tx, verts[j].tx);
-
- if ( ( ABS ( temp[0] ) > mindistance ) || ( ABS ( temp[1] ) > mindistance ) || ( ABS ( temp[2] ) > mindistance ) ) continue;
-
- if (BLI_edgeset_haskey(cloth->edgeset, i, j)) {
- continue;
- }
-
- length = normalize_v3(temp );
-
- if ( length < mindistance ) {
- float correction = mindistance - length;
-
- if ( cloth->verts [i].flags & CLOTH_VERT_FLAG_PINNED ) {
- mul_v3_fl(temp, -correction);
- VECADD ( verts[j].tx, verts[j].tx, temp );
- }
- else if ( cloth->verts [j].flags & CLOTH_VERT_FLAG_PINNED ) {
- mul_v3_fl(temp, correction);
- VECADD ( verts[i].tx, verts[i].tx, temp );
- }
- else {
- mul_v3_fl(temp, correction * -0.5f);
- VECADD ( verts[j].tx, verts[j].tx, temp );
-
- sub_v3_v3v3(verts[i].tx, verts[i].tx, temp);
- }
- ret = 1;
- ret2 += ret;
- }
- else {
- // check for approximated time collisions
- }
- }
-
- if ( overlap )
- MEM_freeN ( overlap );
- }
- }
- ////////////////////////////////////////////////////////////
-
- ////////////////////////////////////////////////////////////
- // SELFCOLLISIONS: update velocities
- ////////////////////////////////////////////////////////////
- if (ret2) {
- for (i = 0; i < cloth->mvert_num; i++) {
- if ( ! ( verts [i].flags & CLOTH_VERT_FLAG_PINNED ) ) {
- sub_v3_v3v3(verts[i].tv, verts[i].tx, verts[i].txold);
+ /* Apply all collision resolution. */
+ if (ret2) {
+ for (i = 0; i < mvert_num; i++) {
+ if (clmd->sim_parms->vgroup_mass > 0) {
+ if (verts [i].flags & CLOTH_VERT_FLAG_PINNED) {
+ continue;
}
}
+
+ VECADD(verts[i].tx, verts[i].txold, verts[i].tv);
}
- ////////////////////////////////////////////////////////////
}
+
+ rounds++;
+ }
+ while (ret2 && (clmd->coll_parms->loop_count > rounds));
+
+ if (overlap_obj) {
+ for (i = 0; i < numcollobj; i++) {
+ MEM_SAFE_FREE(overlap_obj[i]);
+ }
+
+ MEM_freeN(overlap_obj);
}
- while ( ret2 && ( clmd->coll_parms->loop_count>rounds ) );
+
+ MEM_SAFE_FREE(coll_counts_obj);
+
+ MEM_SAFE_FREE(overlap_self);
BKE_collision_objects_free(collobjs);
- return 1|MIN2 ( ret, 1 );
+ return MIN2(ret, 1);
}
BLI_INLINE void max_v3_v3v3(float r[3], const float a[3], const float b[3])
@@ -922,106 +1349,6 @@ void collision_get_collider_velocity(float vel_old[3], float vel_new[3], Collisi
copy_v3_v3(vel_old, vel_new);
}
-static bool cloth_points_collision_response_static(ClothModifierData *clmd, CollisionModifierData *collmd, PartDeflect *pd,
- CollPair *collpair, CollPair *collision_end, float dt)
-{
- bool result = false;
- float restitution = (1.0f - clmd->coll_parms->damping) * (1.0f - pd->pdef_sbdamp);
- float inv_dt = 1.0f / dt;
- Cloth *cloth1 = clmd->clothObject;
-
- // float w1, w2;
- float u1, u2, u3;
- float v1[3], v2_old[3], v2_new[3], v_rel_old[3], v_rel_new[3];
- float epsilon2 = BLI_bvhtree_get_epsilon ( collmd->bvhtree );
-
- for ( ; collpair != collision_end; collpair++ ) {
- float margin_distance = (float)(collpair->distance - (double)epsilon2);
- float impulse[3];
- float mag_v_rel;
-
- if (margin_distance > 0.0f)
- continue;
-
- zero_v3(impulse);
-
- /* only handle static collisions here */
- if ( collpair->flag & COLLISION_IN_FUTURE )
- continue;
-
- /* compute barycentric coordinates for both collision points */
- // w1 = 1.0f - collpair->time;
- // w2 = collpair->time;
-
- /* was: txold */
- collision_compute_barycentric ( collpair->pb,
- collmd->current_x[collpair->bp1].co,
- collmd->current_x[collpair->bp2].co,
- collmd->current_x[collpair->bp3].co,
- &u1, &u2, &u3 );
-
- /* Calculate relative velocity */
- copy_v3_v3(v1, cloth1->verts[collpair->ap1].tv);
-
- collision_interpolateOnTriangle ( v2_new, collmd->current_v[collpair->bp1].co, collmd->current_v[collpair->bp2].co, collmd->current_v[collpair->bp3].co, u1, u2, u3 );
- /* XXX assume constant velocity of the collider for now */
- copy_v3_v3(v2_old, v2_new);
-
- sub_v3_v3v3(v_rel_old, v1, v2_old);
- sub_v3_v3v3(v_rel_new, v1, v2_new);
-
- /* normal component of the relative velocity */
- mag_v_rel = dot_v3v3(v_rel_old, collpair->normal);
-
- /**** DEBUG ****/
- BKE_sim_debug_data_add_dot(collpair->pa, 0.9, 0.2, 0.2, "collision", 833, collpair->face1, collpair->face2);
- BKE_sim_debug_data_add_dot(collpair->pb, 0.2, 0.9, 0.2, "collision", 834, collpair->face1, collpair->face2);
- BKE_sim_debug_data_add_line(collpair->pa, collpair->pb, 0.8, 0.8, 0.8, "collision", 835, collpair->face1, collpair->face2);
- /********/
-
- if (mag_v_rel < -ALMOST_ZERO) {
- float v_nor_old, v_nor_new;
- float v_tan_old[3], v_tan_new[3];
- float bounce, repulse;
-
- /* Collision response based on
- * "Simulating Complex Hair with Robust Collision Handling" (Choe, Choi, Ko, ACM SIGGRAPH 2005)
- * http://graphics.snu.ac.kr/publications/2005-choe-HairSim/Choe_2005_SCA.pdf
- */
-
- v_nor_old = mag_v_rel;
- v_nor_new = dot_v3v3(v_rel_new, collpair->normal);
-
- madd_v3_v3v3fl(v_tan_old, v_rel_old, collpair->normal, -v_nor_old);
- madd_v3_v3v3fl(v_tan_new, v_rel_new, collpair->normal, -v_nor_new);
-
- repulse = -margin_distance * inv_dt + dot_v3v3(v1, collpair->normal);
-
- if (margin_distance < -epsilon2) {
- bounce = -v_nor_new + v_nor_old * restitution;
- mul_v3_v3fl(impulse, collpair->normal, max_ff(repulse, bounce));
- }
- else {
- bounce = 0.0f;
- mul_v3_v3fl(impulse, collpair->normal, repulse);
- }
- cloth1->verts[collpair->ap1].impulse_count++;
-
- result = true;
- }
-
- if (result) {
- int i = 0;
-
- for (i = 0; i < 3; i++) {
- if (cloth1->verts[collpair->ap1].impulse_count > 0 && fabsf(cloth1->verts[collpair->ap1].impulse[i]) < fabsf(impulse[i]))
- cloth1->verts[collpair->ap1].impulse[i] = impulse[i];
- }
- }
- }
- return result;
-}
-
BLI_INLINE bool cloth_point_face_collision_params(const float p1[3], const float p2[3], const float v0[3], const float v1[3], const float v2[3],
float r_nor[3], float *r_lambda, float r_w[3])
{
@@ -1033,58 +1360,16 @@ BLI_INLINE bool cloth_point_face_collision_params(const float p1[3], const float
cross_v3_v3v3(r_nor, edge1, edge2);
normalize_v3(r_nor);
+ sub_v3_v3v3(v0p2, p2, v0);
nor_v0p2 = dot_v3v3(v0p2, r_nor);
madd_v3_v3v3fl(p2face, p2, r_nor, -nor_v0p2);
interp_weights_tri_v3(r_w, v0, v1, v2, p2face);
sub_v3_v3v3(p1p2, p2, p1);
- sub_v3_v3v3(v0p2, p2, v0);
nor_p1p2 = dot_v3v3(p1p2, r_nor);
*r_lambda = (nor_p1p2 != 0.0f ? nor_v0p2 / nor_p1p2 : 0.0f);
return r_w[1] >= 0.0f && r_w[2] >= 0.0f && r_w[1] + r_w[2] <= 1.0f;
-
-#if 0 /* XXX this method uses the intersection point, but is broken and doesn't work well in general */
- float p[3], vec1[3], line[3], edge1[3], edge2[3], q[3];
- float a, f, u, v;
-
- sub_v3_v3v3(edge1, v1, v0);
- sub_v3_v3v3(edge2, v2, v0);
- sub_v3_v3v3(line, p2, p1);
-
- cross_v3_v3v3(p, line, edge2);
- a = dot_v3v3(edge1, p);
- if (a == 0.0f) return 0;
- f = 1.0f / a;
-
- sub_v3_v3v3(vec1, p1, v0);
-
- u = f * dot_v3v3(vec1, p);
- if ((u < 0.0f) || (u > 1.0f))
- return false;
-
- cross_v3_v3v3(q, vec1, edge1);
-
- v = f * dot_v3v3(line, q);
- if ((v < 0.0f) || ((u + v) > 1.0f))
- return false;
-
- *r_lambda = f * dot_v3v3(edge2, q);
- /* don't care about 0..1 lambda range here */
- /*if ((*r_lambda < 0.0f) || (*r_lambda > 1.0f))
- * return 0;
- */
-
- r_w[0] = 1.0f - u - v;
- r_w[1] = u;
- r_w[2] = v;
- r_w[3] = 0.0f;
-
- cross_v3_v3v3(r_nor, edge1, edge2);
- normalize_v3(r_nor);
-
- return true;
-#endif
}
static CollPair *cloth_point_collpair(
@@ -1173,160 +1458,6 @@ static void cloth_points_objcollisions_nearcheck(
}
}
-static int cloth_points_objcollisions_resolve(
- ClothModifierData *clmd, CollisionModifierData *collmd, PartDeflect *pd,
- CollPair *collisions, CollPair *collisions_index, float dt)
-{
- Cloth *cloth = clmd->clothObject;
- int i = 0, mvert_num = clmd->clothObject->mvert_num;
- ClothVertex *verts = cloth->verts;
- int ret = 0;
-
- // process all collisions
- if ( collmd->bvhtree ) {
- bool result = cloth_points_collision_response_static(clmd, collmd, pd, collisions, collisions_index, dt);
-
- // apply impulses in parallel
- if (result) {
- for (i = 0; i < mvert_num; i++) {
- // calculate "velocities" (just xnew = xold + v; no dt in v)
- if (verts[i].impulse_count) {
- // VECADDMUL ( verts[i].tv, verts[i].impulse, 1.0f / verts[i].impulse_count );
- VECADD ( verts[i].tv, verts[i].tv, verts[i].impulse);
- zero_v3(verts[i].impulse);
- verts[i].impulse_count = 0;
-
- ret++;
- }
- }
- }
- }
-
- return ret;
-}
-
-// cloth - object collisions
-int cloth_points_objcollision(Depsgraph *depsgraph, Object *ob, ClothModifierData *clmd, float step, float dt)
-{
- Cloth *cloth= clmd->clothObject;
- BVHTree *cloth_bvh;
- int rounds = 0; // result counts applied collisions; ic is for debug output;
- float round_dt = dt / (float)clmd->coll_parms->loop_count;
- unsigned int i = 0, mvert_num = 0;
- ClothVertex *verts = NULL;
- int ret = 0, ret2 = 0;
- Object **collobjs = NULL;
- unsigned int numcollobj = 0;
-
- verts = cloth->verts;
- mvert_num = cloth->mvert_num;
-
- ////////////////////////////////////////////////////////////
- // static collisions
- ////////////////////////////////////////////////////////////
-
- // create temporary cloth points bvh
- cloth_bvh = BLI_bvhtree_new(mvert_num, max_ff(clmd->coll_parms->epsilon, clmd->coll_parms->distance_repel), 4, 6);
- /* fill tree */
- for (i = 0; i < mvert_num; i++) {
- float co[2][3];
-
- copy_v3_v3(co[0], verts[i].x);
- copy_v3_v3(co[1], verts[i].tx);
-
- BLI_bvhtree_insert(cloth_bvh, i, co[0], 2);
- }
- /* balance tree */
- BLI_bvhtree_balance(cloth_bvh);
-
- collobjs = BKE_collision_objects_create(depsgraph, ob, clmd->coll_parms->group, &numcollobj, eModifierType_Collision);
- if (!collobjs)
- return 0;
-
- /* move object to position (step) in time */
- for (i = 0; i < numcollobj; i++) {
- Object *collob= collobjs[i];
- CollisionModifierData *collmd = (CollisionModifierData *)modifiers_findByType(collob, eModifierType_Collision);
- if (!collmd->bvhtree)
- continue;
-
- /* move object to position (step) in time */
- collision_move_object ( collmd, step + dt, step );
- }
-
- do {
- CollPair **collisions, **collisions_index;
-
- ret2 = 0;
-
- collisions = MEM_callocN(sizeof(CollPair *) *numcollobj, "CollPair");
- collisions_index = MEM_callocN(sizeof(CollPair *) *numcollobj, "CollPair");
-
- // check all collision objects
- for (i = 0; i < numcollobj; i++) {
- Object *collob= collobjs[i];
- CollisionModifierData *collmd = (CollisionModifierData *)modifiers_findByType(collob, eModifierType_Collision);
- BVHTreeOverlap *overlap = NULL;
- unsigned int result = 0;
- float epsilon;
-
- if (!collmd->bvhtree)
- continue;
-
- /* search for overlapping collision pairs */
- overlap = BLI_bvhtree_overlap(cloth_bvh, collmd->bvhtree, &result, NULL, NULL);
- epsilon = BLI_bvhtree_get_epsilon(collmd->bvhtree);
-
- // go to next object if no overlap is there
- if (result && overlap) {
- /* check if collisions really happen (costly near check) */
- cloth_points_objcollisions_nearcheck(clmd, collmd, &collisions[i], &collisions_index[i],
- result, overlap, epsilon, round_dt);
-
- // resolve nearby collisions
- ret += cloth_points_objcollisions_resolve(clmd, collmd, collob->pd, collisions[i], collisions_index[i], round_dt);
- ret2 += ret;
- }
-
- if (overlap)
- MEM_freeN ( overlap );
- }
- rounds++;
-
- for (i = 0; i < numcollobj; i++) {
- if (collisions[i])
- MEM_freeN(collisions[i]);
- }
-
- MEM_freeN(collisions);
- MEM_freeN(collisions_index);
-
- ////////////////////////////////////////////////////////////
- // update positions
- // this is needed for bvh_calc_DOP_hull_moving() [kdop.c]
- ////////////////////////////////////////////////////////////
-
- // verts come from clmd
- for (i = 0; i < mvert_num; i++) {
- if ( clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL ) {
- if ( verts [i].flags & CLOTH_VERT_FLAG_PINNED ) {
- continue;
- }
- }
-
- VECADD ( verts[i].tx, verts[i].txold, verts[i].tv );
- }
- ////////////////////////////////////////////////////////////
- }
- while ( ret2 && ( clmd->coll_parms->loop_count>rounds ) );
-
- BKE_collision_objects_free(collobjs);
-
- BLI_bvhtree_free(cloth_bvh);
-
- return 1|MIN2 ( ret, 1 );
-}
-
void cloth_find_point_contacts(Depsgraph *depsgraph, Object *ob, ClothModifierData *clmd, float step, float dt,
ColliderContacts **r_collider_contacts, int *r_totcolliders)
{
@@ -1347,8 +1478,16 @@ void cloth_find_point_contacts(Depsgraph *depsgraph, Object *ob, ClothModifierDa
// static collisions
////////////////////////////////////////////////////////////
+ /* Check we do have collision objects to test against, before doing anything else. */
+ collobjs = BKE_collision_objects_create(depsgraph, ob, clmd->coll_parms->group, &numcollobj, eModifierType_Collision);
+ if (!collobjs) {
+ *r_collider_contacts = NULL;
+ *r_totcolliders = 0;
+ return;
+ }
+
// create temporary cloth points bvh
- cloth_bvh = BLI_bvhtree_new(mvert_num, max_ff(clmd->coll_parms->epsilon, clmd->coll_parms->distance_repel), 4, 6);
+ cloth_bvh = BLI_bvhtree_new(mvert_num, clmd->coll_parms->epsilon, 4, 6);
/* fill tree */
for (i = 0; i < mvert_num; i++) {
float co[6];
@@ -1361,13 +1500,6 @@ void cloth_find_point_contacts(Depsgraph *depsgraph, Object *ob, ClothModifierDa
/* balance tree */
BLI_bvhtree_balance(cloth_bvh);
- collobjs = BKE_collision_objects_create(depsgraph, ob, clmd->coll_parms->group, &numcollobj, eModifierType_Collision);
- if (!collobjs) {
- *r_collider_contacts = NULL;
- *r_totcolliders = 0;
- return;
- }
-
/* move object to position (step) in time */
for (i = 0; i < numcollobj; i++) {
Object *collob= collobjs[i];
@@ -1430,7 +1562,7 @@ void cloth_find_point_contacts(Depsgraph *depsgraph, Object *ob, ClothModifierDa
// verts come from clmd
for (i = 0; i < mvert_num; i++) {
- if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) {
+ if (clmd->sim_parms->vgroup_mass > 0) {
if (verts [i].flags & CLOTH_VERT_FLAG_PINNED) {
continue;
}
diff --git a/source/blender/blenkernel/intern/colorband.c b/source/blender/blenkernel/intern/colorband.c
index f72d4df725a..38631c76009 100644
--- a/source/blender/blenkernel/intern/colorband.c
+++ b/source/blender/blenkernel/intern/colorband.c
@@ -208,7 +208,7 @@ static void colorband_init_from_table_rgba_resample(
}
while ((carr_len > 1 && !BLI_heap_is_empty(heap)) &&
- ((carr_len >= MAXCOLORBAND) || (BLI_heap_node_value(BLI_heap_top(heap)) <= eps_2x)))
+ ((carr_len >= MAXCOLORBAND) || (BLI_heap_top_value(heap) <= eps_2x)))
{
c = BLI_heap_pop_min(heap);
struct ColorResampleElem *c_next = c->next, *c_prev = c->prev;
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c
index c090569421d..108e188fe92 100644
--- a/source/blender/blenkernel/intern/colortools.c
+++ b/source/blender/blenkernel/intern/colortools.c
@@ -954,25 +954,6 @@ static void curvemapping_evaluateRGBF_filmlike(const CurveMapping *cumap, float
vecout[channel_offset[2]] = v2;
}
-static float curvemapping_weighted_standard_triangle(float a, float b, float a1)
-{
- if (a != b) {
- float b1;
- float a2 = a1 - a;
-
- if (b < a) {
- b1 = b + a2 * b / a ;
- }
- else {
- b1 = b + a2 * (65535.0f - b) / (65535.0f - a);
- }
-
- return b1;
- }
-
- return a1;
-}
-
/** same as #curvemapping_evaluate_premulRGBF
* but black/bwmul are passed as args for the compositor
* where they can change per pixel.
@@ -999,25 +980,6 @@ void curvemapping_evaluate_premulRGBF_ex(
vecout[2] = curvemap_evaluateF(&cumap->cm[2], b);
break;
}
- case CURVE_TONE_WEIGHTED_STANDARD:
- {
- float r1 = curvemap_evaluateF(&cumap->cm[0], r);
- float g1 = curvemapping_weighted_standard_triangle(r, r1, g);
- float b1 = curvemapping_weighted_standard_triangle(r, r1, b);
-
- float g2 = curvemap_evaluateF(&cumap->cm[1], g);
- float r2 = curvemapping_weighted_standard_triangle(g, g2, r);
- float b2 = curvemapping_weighted_standard_triangle(g, g2, b);
-
- float b3 = curvemap_evaluateF(&cumap->cm[2], b);
- float r3 = curvemapping_weighted_standard_triangle(b, b3, r);
- float g3 = curvemapping_weighted_standard_triangle(b, b3, g);
-
- vecout[0] = r1 * 0.50f + r2 * 0.25f + r3 * 0.25f;
- vecout[1] = g1 * 0.25f + g2 * 0.50f + g3 * 0.25f;
- vecout[2] = b1 * 0.25f + b2 * 0.25f + b3 * 0.50f;
- break;
- }
case CURVE_TONE_FILMLIKE:
{
if (r >= g) {
@@ -1527,17 +1489,6 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, const ColorManagedViewSettings *
scopes_update_cb,
&settings);
- /* test for nicer distribution even - non standard, leave it out for a while */
-#if 0
- for (a = 0; a < 256; a++) {
- bin_lum[a] = sqrt (bin_lum[a]);
- bin_r[a] = sqrt(bin_r[a]);
- bin_g[a] = sqrt(bin_g[a]);
- bin_b[a] = sqrt(bin_b[a]);
- bin_a[a] = sqrt(bin_a[a]);
- }
-#endif
-
/* convert hist data to float (proportional to max count) */
nl = na = nr = nb = ng = 0;
for (a = 0; a < 256; a++) {
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index 4674b2c7554..dccc959b4ea 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -107,6 +107,8 @@
* type-info structs.
*/
+static void damptrack_do_transform(float matrix[4][4], const float tarvec[3], int track_axis);
+
/* -------------- Naming -------------- */
/* Find the first available, non-duplicate name for a given constraint */
@@ -593,7 +595,7 @@ static void constraint_target_to_mat4(Object *ob, const char *substring, float m
float loc[3], fac;
/* get bbone segments */
- b_bone_spline_setup(pchan, 0, bbone);
+ b_bone_spline_setup(pchan, false, bbone);
/* figure out which segment(s) the headtail value falls in */
fac = (float)pchan->bone->segments * headtail;
@@ -1326,21 +1328,7 @@ static void followpath_get_tarmat(struct Depsgraph *UNUSED(depsgraph),
unit_m4(totmat);
if (data->followflag & FOLLOWPATH_FOLLOW) {
-#if 0
- float x1, q[4];
- vec_to_quat(quat, dir, (short)data->trackflag, (short)data->upflag);
-
- normalize_v3(dir);
- q[0] = cosf(0.5 * vec[3]);
- x1 = sinf(0.5 * vec[3]);
- q[1] = -x1 * dir[0];
- q[2] = -x1 * dir[1];
- q[3] = -x1 * dir[2];
- mul_qt_qtqt(quat, q, quat);
-#else
quat_apply_track(quat, data->trackflag, data->upflag);
-#endif
-
quat_to_mat4(totmat, quat);
}
@@ -2090,15 +2078,6 @@ static void pycon_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *targe
/* only evaluate in python if we're allowed to do so */
if ((G.f & G_SCRIPT_AUTOEXEC) == 0) return;
-/* currently removed, until I this can be re-implemented for multiple targets */
-#if 0
- /* Firstly, run the 'driver' function which has direct access to the objects involved
- * Technically, this is potentially dangerous as users may abuse this and cause dependency-problems,
- * but it also allows certain 'clever' rigging hacks to work.
- */
- BPY_pyconstraint_driver(data, cob, targets);
-#endif
-
/* Now, run the actual 'constraint' function, which should only access the matrices */
BPY_pyconstraint_exec(data, cob, targets);
#endif /* WITH_PYTHON */
@@ -2119,6 +2098,206 @@ static bConstraintTypeInfo CTI_PYTHON = {
pycon_evaluate /* evaluate */
};
+/* ----------- Armature Constraint -------------- */
+
+static void armdef_free(bConstraint *con)
+{
+ bArmatureConstraint *data = con->data;
+
+ /* Target list. */
+ BLI_freelistN(&data->targets);
+}
+
+static void armdef_copy(bConstraint *con, bConstraint *srccon)
+{
+ bArmatureConstraint *pcon = (bArmatureConstraint *)con->data;
+ bArmatureConstraint *opcon = (bArmatureConstraint *)srccon->data;
+
+ BLI_duplicatelist(&pcon->targets, &opcon->targets);
+}
+
+static int armdef_get_tars(bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bArmatureConstraint *data = con->data;
+
+ *list = data->targets;
+
+ return BLI_listbase_count(&data->targets);
+ }
+
+ return 0;
+}
+
+static void armdef_id_looper(bConstraint *con, ConstraintIDFunc func, void *userdata)
+{
+ bArmatureConstraint *data = con->data;
+ bConstraintTarget *ct;
+
+ /* Target list. */
+ for (ct = data->targets.first; ct; ct = ct->next) {
+ func(con, (ID **)&ct->tar, false, userdata);
+ }
+}
+
+/* Compute the world space pose matrix of the target bone. */
+static void armdef_get_tarmat(struct Depsgraph *UNUSED(depsgraph),
+ bConstraint *UNUSED(con), bConstraintOb *UNUSED(cob),
+ bConstraintTarget *ct, float UNUSED(ctime))
+{
+ if (ct != NULL) {
+ if (ct->tar && ct->tar->type == OB_ARMATURE) {
+ bPoseChannel *pchan = BKE_pose_channel_find_name(ct->tar->pose, ct->subtarget);
+
+ if (pchan != NULL) {
+ mul_m4_m4m4(ct->matrix, ct->tar->obmat, pchan->pose_mat);
+ return;
+ }
+ }
+
+ unit_m4(ct->matrix);
+ }
+}
+
+/* Compute and accumulate transformation for a single target bone. */
+static void armdef_accumulate_bone(bConstraintTarget *ct, bPoseChannel *pchan, const float wco[3], bool force_envelope, float *r_totweight, float r_sum_mat[4][4], DualQuat *r_sum_dq)
+{
+ float mat[4][4], iobmat[4][4], iamat[4][4], basemat[4][4], co[3];
+ Bone *bone = pchan->bone;
+ float weight = ct->weight;
+
+ /* Our object's location in target pose space. */
+ invert_m4_m4(iobmat, ct->tar->obmat);
+ mul_v3_m4v3(co, iobmat, wco);
+
+ /* Inverted rest pose matrix: bone->chan_mat may not be final yet. */
+ invert_m4_m4(iamat, bone->arm_mat);
+
+ /* Multiply by the envelope weight when appropriate. */
+ if (force_envelope || (bone->flag & BONE_MULT_VG_ENV)) {
+ weight *= distfactor_to_bone(co, bone->arm_head, bone->arm_tail,
+ bone->rad_head, bone->rad_tail, bone->dist);
+ }
+
+ /* Find the correct bone transform matrix in world space. */
+ if (bone->segments > 1) {
+ /* The target is a B-Bone:
+ * FIRST: find the segment (see b_bone_deform in armature.c)
+ * Need to transform co back to bonespace, only need y. */
+ float y = iamat[0][1] * co[0] + iamat[1][1] * co[1] + iamat[2][1] * co[2] + iamat[3][1];
+
+ float segment = bone->length / ((float)bone->segments);
+ int a = (int)(y / segment);
+
+ CLAMP(a, 0, bone->segments - 1);
+
+ /* SECOND: compute the matrix (see pchan_b_bone_defmats in armature.c) */
+ Mat4 b_bone[MAX_BBONE_SUBDIV], b_bone_rest[MAX_BBONE_SUBDIV];
+ float irmat[4][4];
+
+ b_bone_spline_setup(pchan, false, b_bone);
+ b_bone_spline_setup(pchan, true, b_bone_rest);
+
+ invert_m4_m4(irmat, b_bone_rest[a].mat);
+ mul_m4_series(mat, ct->matrix, b_bone[a].mat, irmat, iamat, iobmat);
+ }
+ else {
+ /* Simple bone. */
+ mul_m4_series(mat, ct->matrix, iamat, iobmat);
+ }
+
+ /* Accumulate the transformation. */
+ *r_totweight += weight;
+
+ if (r_sum_dq != NULL) {
+ DualQuat tmpdq;
+
+ mul_m4_series(basemat, ct->tar->obmat, bone->arm_mat, iobmat);
+
+ mat4_to_dquat(&tmpdq, basemat, mat);
+ add_weighted_dq_dq(r_sum_dq, &tmpdq, weight);
+ }
+ else {
+ mul_m4_fl(mat, weight);
+ add_m4_m4m4(r_sum_mat, r_sum_mat, mat);
+ }
+}
+
+static void armdef_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bArmatureConstraint *data = con->data;
+
+ float sum_mat[4][4], input_co[3];
+ DualQuat sum_dq;
+ float weight = 0.0f;
+
+ /* Prepare for blending. */
+ zero_m4(sum_mat);
+ memset(&sum_dq, 0, sizeof(sum_dq));
+
+ DualQuat *pdq = (data->flag & CONSTRAINT_ARMATURE_QUATERNION) ? &sum_dq : NULL;
+ bool use_envelopes = (data->flag & CONSTRAINT_ARMATURE_ENVELOPE) != 0;
+
+ if (cob->pchan && cob->pchan->bone && !(data->flag & CONSTRAINT_ARMATURE_CUR_LOCATION)) {
+ /* For constraints on bones, use the rest position to bind b-bone segments
+ * and envelopes, to allow safely changing the bone location as if parented. */
+ copy_v3_v3(input_co, cob->pchan->bone->arm_head);
+ mul_m4_v3(cob->ob->obmat, input_co);
+ }
+ else {
+ copy_v3_v3(input_co, cob->matrix[3]);
+ }
+
+ /* Process all targets. */
+ for (bConstraintTarget *ct = targets->first; ct; ct = ct->next) {
+ if (ct->weight <= 0.0f) {
+ continue;
+ }
+
+ /* Lookup the bone and abort if failed. */
+ if (!VALID_CONS_TARGET(ct) || ct->tar->type != OB_ARMATURE) {
+ return;
+ }
+
+ bPoseChannel *pchan = BKE_pose_channel_find_name(ct->tar->pose, ct->subtarget);
+
+ if (pchan == NULL || pchan->bone == NULL) {
+ return;
+ }
+
+ armdef_accumulate_bone(ct, pchan, input_co, use_envelopes, &weight, sum_mat, pdq);
+ }
+
+ /* Compute the final transform. */
+ if (weight > 0.0f) {
+ if (pdq != NULL) {
+ normalize_dq(pdq, weight);
+ dquat_to_mat4(sum_mat, pdq);
+ }
+ else {
+ mul_m4_fl(sum_mat, 1.0f / weight);
+ }
+
+ /* Apply the transform to the result matrix. */
+ mul_m4_m4m4(cob->matrix, sum_mat, cob->matrix);
+ }
+}
+
+static bConstraintTypeInfo CTI_ARMATURE = {
+ CONSTRAINT_TYPE_ARMATURE, /* type */
+ sizeof(bArmatureConstraint), /* size */
+ "Armature", /* name */
+ "bArmatureConstraint", /* struct name */
+ armdef_free, /* free data */
+ armdef_id_looper, /* id looper */
+ armdef_copy, /* copy data */
+ NULL, /* new data */
+ armdef_get_tars, /* get constraint targets */
+ NULL, /* flush constraint targets */
+ armdef_get_tarmat, /* get target matrix */
+ armdef_evaluate /* evaluate */
+};
+
/* -------- Action Constraint ----------- */
static void actcon_new_data(void *cdata)
@@ -2571,7 +2750,7 @@ static void locktrack_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *t
unit_m3(totmat);
}
- /* apply out transformaton to the object */
+ /* apply out transformation to the object */
mul_m4_m3m4(cob->matrix, totmat, cob->matrix);
}
}
@@ -3432,7 +3611,7 @@ static void shrinkwrap_flush_tars(bConstraint *con, ListBase *list, bool no_copy
}
-static void shrinkwrap_get_tarmat(struct Depsgraph *depsgraph, bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
+static void shrinkwrap_get_tarmat(struct Depsgraph *UNUSED(depsgraph), bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
bShrinkwrapConstraint *scon = (bShrinkwrapConstraint *) con->data;
@@ -3440,45 +3619,56 @@ static void shrinkwrap_get_tarmat(struct Depsgraph *depsgraph, bConstraint *con,
bool fail = false;
float co[3] = {0.0f, 0.0f, 0.0f};
+ bool track_normal = false;
+ float track_no[3] = {0.0f, 0.0f, 0.0f};
SpaceTransform transform;
- Mesh *target_eval = mesh_get_eval_final(depsgraph, DEG_get_input_scene(depsgraph), ct->tar, CD_MASK_BAREMESH);
+ Mesh *target_eval = ct->tar->runtime.mesh_eval;
- BVHTreeFromMesh treeData = {NULL};
+ copy_m4_m4(ct->matrix, cob->matrix);
- unit_m4(ct->matrix);
+ bool do_track_normal = (scon->flag & CON_SHRINKWRAP_TRACK_NORMAL) != 0;
+ ShrinkwrapTreeData tree;
- if (target_eval != NULL) {
+ if (BKE_shrinkwrap_init_tree(&tree, target_eval, scon->shrinkType, scon->shrinkMode, do_track_normal)) {
BLI_space_transform_from_matrices(&transform, cob->matrix, ct->tar->obmat);
switch (scon->shrinkType) {
case MOD_SHRINKWRAP_NEAREST_SURFACE:
case MOD_SHRINKWRAP_NEAREST_VERTEX:
+ case MOD_SHRINKWRAP_TARGET_PROJECT:
{
BVHTreeNearest nearest;
- float dist;
nearest.index = -1;
nearest.dist_sq = FLT_MAX;
- if (scon->shrinkType == MOD_SHRINKWRAP_NEAREST_VERTEX)
- BKE_bvhtree_from_mesh_get(&treeData, target_eval, BVHTREE_FROM_VERTS, 2);
- else
- BKE_bvhtree_from_mesh_get(&treeData, target_eval, BVHTREE_FROM_LOOPTRI, 2);
+ BLI_space_transform_apply(&transform, co);
- if (treeData.tree == NULL) {
+ BKE_shrinkwrap_find_nearest_surface(&tree, &nearest, co, scon->shrinkType);
+
+ if (nearest.index < 0) {
fail = true;
break;
}
- BLI_space_transform_apply(&transform, co);
+ if (scon->shrinkType != MOD_SHRINKWRAP_NEAREST_VERTEX) {
+ if (do_track_normal) {
+ track_normal = true;
+ BKE_shrinkwrap_compute_smooth_normal(&tree, NULL, nearest.index, nearest.co, nearest.no, track_no);
+ BLI_space_transform_invert_normal(&transform, track_no);
+ }
- BLI_bvhtree_find_nearest(treeData.tree, co, &nearest, treeData.nearest_callback, &treeData);
+ BKE_shrinkwrap_snap_point_to_surface(&tree, NULL, scon->shrinkMode, nearest.index, nearest.co, nearest.no, scon->dist, co, co);
+ }
+ else {
+ const float dist = len_v3v3(co, nearest.co);
- dist = len_v3v3(co, nearest.co);
- if (dist != 0.0f) {
- interp_v3_v3v3(co, co, nearest.co, (dist - scon->dist) / dist); /* linear interpolation */
+ if (dist != 0.0f) {
+ interp_v3_v3v3(co, co, nearest.co, (dist - scon->dist) / dist); /* linear interpolation */
+ }
}
+
BLI_space_transform_invert(&transform, co);
break;
}
@@ -3516,24 +3706,37 @@ static void shrinkwrap_get_tarmat(struct Depsgraph *depsgraph, bConstraint *con,
break;
}
- BKE_bvhtree_from_mesh_get(&treeData, target_eval, BVHTREE_FROM_LOOPTRI, 4);
- if (treeData.tree == NULL) {
- fail = true;
- break;
+ char cull_mode = scon->flag & CON_SHRINKWRAP_PROJECT_CULL_MASK;
+
+ BKE_shrinkwrap_project_normal(cull_mode, co, no, 0.0f, &transform, &tree, &hit);
+
+ if (scon->flag & CON_SHRINKWRAP_PROJECT_OPPOSITE) {
+ float inv_no[3];
+ negate_v3_v3(inv_no, no);
+
+ if ((scon->flag & CON_SHRINKWRAP_PROJECT_INVERT_CULL) && (cull_mode != 0)) {
+ cull_mode ^= CON_SHRINKWRAP_PROJECT_CULL_MASK;
+ }
+
+ BKE_shrinkwrap_project_normal(cull_mode, co, inv_no, 0.0f, &transform, &tree, &hit);
}
- if (BKE_shrinkwrap_project_normal(0, co, no, scon->dist, &transform, treeData.tree,
- &hit, treeData.raycast_callback, &treeData) == false)
- {
+ if (hit.index < 0) {
fail = true;
break;
}
- copy_v3_v3(co, hit.co);
+
+ if (do_track_normal) {
+ track_normal = true;
+ BKE_shrinkwrap_compute_smooth_normal(&tree, &transform, hit.index, hit.co, hit.no, track_no);
+ }
+
+ BKE_shrinkwrap_snap_point_to_surface(&tree, &transform, scon->shrinkMode, hit.index, hit.co, hit.no, scon->dist, co, co);
break;
}
}
- free_bvhtree_from_mesh(&treeData);
+ BKE_shrinkwrap_free_tree(&tree);
if (fail == true) {
/* Don't move the point */
@@ -3543,6 +3746,11 @@ static void shrinkwrap_get_tarmat(struct Depsgraph *depsgraph, bConstraint *con,
/* co is in local object coordinates, change it to global and update target position */
mul_m4_v3(cob->matrix, co);
copy_v3_v3(ct->matrix[3], co);
+
+ if (track_normal) {
+ mul_mat3_m4_v3(cob->matrix, track_no);
+ damptrack_do_transform(ct->matrix, track_no, scon->trackAxis);
+ }
}
}
}
@@ -3553,7 +3761,7 @@ static void shrinkwrap_evaluate(bConstraint *UNUSED(con), bConstraintOb *cob, Li
/* only evaluate if there is a target */
if (VALID_CONS_TARGET(ct)) {
- copy_v3_v3(cob->matrix[3], ct->matrix[3]);
+ copy_m4_m4(cob->matrix, ct->matrix);
}
}
@@ -3627,7 +3835,22 @@ static void damptrack_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *t
bConstraintTarget *ct = targets->first;
if (VALID_CONS_TARGET(ct)) {
- float obvec[3], tarvec[3], obloc[3];
+ float tarvec[3];
+
+ /* find the (unit) direction vector going from the owner to the target */
+ sub_v3_v3v3(tarvec, ct->matrix[3], cob->matrix[3]);
+
+ damptrack_do_transform(cob->matrix, tarvec, data->trackflag);
+ }
+}
+
+static void damptrack_do_transform(float matrix[4][4], const float tarvec_in[3], int track_axis)
+{
+ /* find the (unit) direction vector going from the owner to the target */
+ float tarvec[3];
+
+ if (normalize_v3_v3(tarvec, tarvec_in) != 0.0f) {
+ float obvec[3], obloc[3];
float raxis[3], rangle;
float rmat[3][3], tmat[4][4];
@@ -3636,24 +3859,15 @@ static void damptrack_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *t
* - the normalization step at the end should take care of any unwanted scaling
* left over in the 3x3 matrix we used
*/
- copy_v3_v3(obvec, track_dir_vecs[data->trackflag]);
- mul_mat3_m4_v3(cob->matrix, obvec);
+ copy_v3_v3(obvec, track_dir_vecs[track_axis]);
+ mul_mat3_m4_v3(matrix, obvec);
if (normalize_v3(obvec) == 0.0f) {
/* exceptional case - just use the track vector as appropriate */
- copy_v3_v3(obvec, track_dir_vecs[data->trackflag]);
+ copy_v3_v3(obvec, track_dir_vecs[track_axis]);
}
- /* find the (unit) direction vector going from the owner to the target */
- copy_v3_v3(obloc, cob->matrix[3]);
- sub_v3_v3v3(tarvec, ct->matrix[3], obloc);
-
- if (normalize_v3(tarvec) == 0.0f) {
- /* the target is sitting on the owner, so just make them use the same direction vectors */
- /* FIXME: or would it be better to use the pure direction vector? */
- copy_v3_v3(tarvec, obvec);
- //copy_v3_v3(tarvec, track_dir_vecs[data->trackflag]);
- }
+ copy_v3_v3(obloc, matrix[3]);
/* determine the axis-angle rotation, which represents the smallest possible rotation
* between the two rotation vectors (i.e. the 'damping' referred to in the name)
@@ -3686,8 +3900,8 @@ static void damptrack_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *t
}
rangle = M_PI;
- copy_v3_v3(tmpvec, track_dir_vecs[(data->trackflag + 1) % 6]);
- mul_mat3_m4_v3(cob->matrix, tmpvec);
+ copy_v3_v3(tmpvec, track_dir_vecs[(track_axis + 1) % 6]);
+ mul_mat3_m4_v3(matrix, tmpvec);
cross_v3_v3v3(raxis, obvec, tmpvec);
if (normalize_v3(raxis) == 0.0f) {
@@ -3705,10 +3919,10 @@ static void damptrack_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *t
* we may have destroyed that in the process of multiplying the matrix
*/
unit_m4(tmat);
- mul_m4_m3m4(tmat, rmat, cob->matrix); // m1, m3, m2
+ mul_m4_m3m4(tmat, rmat, matrix); // m1, m3, m2
- copy_m4_m4(cob->matrix, tmat);
- copy_v3_v3(cob->matrix[3], obloc);
+ copy_m4_m4(matrix, tmat);
+ copy_v3_v3(matrix[3], obloc);
}
}
@@ -3974,7 +4188,7 @@ static void followtrack_evaluate(bConstraint *con, bConstraintOb *cob, ListBase
depsgraph,
data->camera ? data->camera : scene->camera);
- float ctime = DEG_get_ctime(depsgraph);;
+ float ctime = DEG_get_ctime(depsgraph);
float framenr;
if (data->flag & FOLLOWTRACK_ACTIVECLIP)
@@ -4142,8 +4356,7 @@ static void followtrack_evaluate(bConstraint *con, bConstraintOb *cob, ListBase
if (data->depth_ob) {
Object *depth_ob = data->depth_ob;
- Mesh *target_eval = mesh_get_eval_final(
- depsgraph, DEG_get_input_scene(depsgraph), depth_ob, CD_MASK_BAREMESH);
+ Mesh *target_eval = depth_ob->runtime.mesh_eval;
if (target_eval) {
BVHTreeFromMesh treeData = NULL_BVHTreeFromMesh;
BVHTreeRayHit hit;
@@ -4456,6 +4669,7 @@ static void constraints_init_typeinfo(void)
constraintsTypeInfo[27] = &CTI_CAMERASOLVER; /* Camera Solver Constraint */
constraintsTypeInfo[28] = &CTI_OBJECTSOLVER; /* Object Solver Constraint */
constraintsTypeInfo[29] = &CTI_TRANSFORM_CACHE; /* Transform Cache Constraint */
+ constraintsTypeInfo[30] = &CTI_ARMATURE; /* Armature Constraint */
}
/* This function should be used for getting the appropriate type-info when only
@@ -4671,6 +4885,11 @@ static bConstraint *add_new_constraint(Object *ob, bPoseChannel *pchan, const ch
return con;
}
+bool BKE_constraint_target_uses_bbone(struct bConstraint *con, struct bConstraintTarget *UNUSED(ct))
+{
+ return (con->flag & CONSTRAINT_BBONE_SHAPE) || (con->type == CONSTRAINT_TYPE_ARMATURE);
+}
+
/* ......... */
/* Add new constraint for the given bone */
@@ -4816,6 +5035,48 @@ void BKE_constraints_active_set(ListBase *list, bConstraint *con)
}
}
+static bConstraint *constraint_list_find_from_target(ListBase *constraints, bConstraintTarget *tgt)
+{
+ for (bConstraint *con = constraints->first; con; con = con->next) {
+ ListBase *targets = NULL;
+
+ if (con->type == CONSTRAINT_TYPE_PYTHON) {
+ targets = &((bPythonConstraint *)con->data)->targets;
+ }
+ else if (con->type == CONSTRAINT_TYPE_ARMATURE) {
+ targets = &((bArmatureConstraint *)con->data)->targets;
+ }
+
+ if (targets && BLI_findindex(targets, tgt) != -1) {
+ return con;
+ }
+ }
+
+ return NULL;
+}
+
+/* Finds the constraint that owns the given target within the object. */
+bConstraint *BKE_constraint_find_from_target(Object *ob, bConstraintTarget *tgt)
+{
+ bConstraint *result = constraint_list_find_from_target(&ob->constraints, tgt);
+
+ if (result != NULL) {
+ return result;
+ }
+
+ if (ob->pose != NULL) {
+ for (bPoseChannel *pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
+ result = constraint_list_find_from_target(&pchan->constraints, tgt);
+
+ if (result != NULL) {
+ return result;
+ }
+ }
+ }
+
+ return NULL;
+}
+
/* -------- Constraints and Proxies ------- */
/* Rescue all constraints tagged as being CONSTRAINT_PROXY_LOCAL (i.e. added to bone that's proxy-synced in this file) */
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index 2eb5b2f4f13..b3a26087dd0 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -94,13 +94,6 @@ struct bContext {
int py_init; /* true if python is initialized */
void *py_context;
} data;
-
- /* data evaluation */
-#if 0
- struct {
- int render;
- } eval;
-#endif
};
/* context */
@@ -217,7 +210,7 @@ void CTX_store_free_list(ListBase *contexts)
}
}
-/* is python initialied? */
+/* is python initialized? */
int CTX_py_init_get(bContext *C)
{
@@ -1205,6 +1198,11 @@ int CTX_data_selected_pose_bones(const bContext *C, ListBase *list)
return ctx_data_collection_get(C, "selected_pose_bones", list);
}
+int CTX_data_selected_pose_bones_from_active_object(const bContext *C, ListBase *list)
+{
+ return ctx_data_collection_get(C, "selected_pose_bones_from_active_object", list);
+}
+
int CTX_data_visible_pose_bones(const bContext *C, ListBase *list)
{
return ctx_data_collection_get(C, "visible_pose_bones", list);
diff --git a/source/blender/blenkernel/intern/crazyspace.c b/source/blender/blenkernel/intern/crazyspace.c
index 2b4daae503d..354cc4926f1 100644
--- a/source/blender/blenkernel/intern/crazyspace.c
+++ b/source/blender/blenkernel/intern/crazyspace.c
@@ -48,6 +48,7 @@
#include "BKE_multires.h"
#include "BKE_mesh.h"
#include "BKE_editmesh.h"
+#include "BKE_library.h"
BLI_INLINE void tan_calc_quat_v3(
float r_quat[4],
@@ -103,7 +104,7 @@ float (*BKE_crazyspace_get_mapped_editverts(
struct Depsgraph *depsgraph, Scene *scene, Object *obedit))[3]
{
Mesh *me = obedit->data;
- DerivedMesh *dm;
+ Mesh *me_eval;
float (*vertexcos)[3];
int nverts = me->edit_btmesh->bm->totvert;
@@ -116,11 +117,9 @@ float (*BKE_crazyspace_get_mapped_editverts(
/* now get the cage */
vertexcos = MEM_mallocN(sizeof(*vertexcos) * nverts, "vertexcos map");
- dm = editbmesh_get_derived_cage(depsgraph, scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH);
+ me_eval = editbmesh_get_eval_cage(depsgraph, scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH);
- mesh_get_mapped_verts_coords(dm, vertexcos, nverts);
-
- dm->release(dm);
+ mesh_get_mapped_verts_coords(me_eval, vertexcos, nverts);
/* set back the flag, no new cage needs to be built, transform does it */
modifiers_disable_subsurf_temporary(obedit);
@@ -256,7 +255,7 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh(
float (**deformmats)[3][3], float (**deformcos)[3])
{
ModifierData *md;
- DerivedMesh *dm;
+ Mesh *me;
int i, a, numleft = 0, numVerts = 0;
int cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL;
@@ -265,7 +264,7 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh(
modifiers_clearErrors(ob);
- dm = NULL;
+ me = NULL;
md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
/* compute the deformation matrices and coordinates for the first
@@ -274,10 +273,10 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh(
for (i = 0; md && i <= cageIndex; i++, md = md->next) {
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- if (!editbmesh_modifier_is_enabled(scene, md, dm))
+ if (!editbmesh_modifier_is_enabled(scene, md, me != NULL))
continue;
- if (mti->type == eModifierTypeType_OnlyDeform && (mti->deformMatricesEM || mti->deformMatricesEM_DM)) {
+ if (mti->type == eModifierTypeType_OnlyDeform && mti->deformMatricesEM) {
if (!defmats) {
const int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
CustomDataMask data_mask = CD_MASK_BAREMESH;
@@ -285,26 +284,26 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh(
data_mask = datamasks->mask;
BLI_linklist_free((LinkNode *)datamasks, NULL);
- dm = getEditDerivedBMesh(em, ob, data_mask, NULL);
+ me = BKE_mesh_from_editmesh_with_coords_thin_wrap(em, data_mask, NULL);
deformedVerts = editbmesh_get_vertex_cos(em, &numVerts);
defmats = MEM_mallocN(sizeof(*defmats) * numVerts, "defmats");
for (a = 0; a < numVerts; a++)
unit_m3(defmats[a]);
}
-
- modifier_deformMatricesEM_DM_deprecated(md, &mectx, em, dm, deformedVerts, defmats, numVerts);
+ mti->deformMatricesEM(md, &mectx, em, me, deformedVerts, defmats, numVerts);
}
else
break;
}
for (; md && i <= cageIndex; md = md->next, i++)
- if (editbmesh_modifier_is_enabled(scene, md, dm) && modifier_isCorrectableDeformed(md))
+ if (editbmesh_modifier_is_enabled(scene, md, me != NULL) && modifier_isCorrectableDeformed(md))
numleft++;
- if (dm)
- dm->release(dm);
+ if (me) {
+ BKE_id_free(NULL, me);
+ }
*deformmats = defmats;
*deformcos = deformedVerts;
@@ -317,14 +316,14 @@ int BKE_sculpt_get_first_deform_matrices(
Object *ob, float (**deformmats)[3][3], float (**deformcos)[3])
{
ModifierData *md;
- DerivedMesh *dm;
+ Mesh *me_eval;
int a, numVerts = 0;
float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL;
MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
const bool has_multires = mmd != NULL && mmd->sculptlvl > 0;
int numleft = 0;
VirtualModifierData virtualModifierData;
- ModifierEvalContext mectx = {depsgraph, ob, 0};
+ const ModifierEvalContext mectx = {depsgraph, ob, 0};
if (has_multires) {
*deformmats = NULL;
@@ -332,7 +331,7 @@ int BKE_sculpt_get_first_deform_matrices(
return numleft;
}
- dm = NULL;
+ me_eval = NULL;
md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
for (; md; md = md->next) {
@@ -342,8 +341,8 @@ int BKE_sculpt_get_first_deform_matrices(
if (mti->type == eModifierTypeType_OnlyDeform) {
if (!defmats) {
- Mesh *me = (Mesh *)ob->data;
- dm = mesh_create_derived(me, NULL);
+ Mesh *me = ob->data;
+ me_eval = BKE_mesh_copy_for_eval(me, true);
deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
defmats = MEM_callocN(sizeof(*defmats) * numVerts, "defmats");
@@ -351,8 +350,8 @@ int BKE_sculpt_get_first_deform_matrices(
unit_m3(defmats[a]);
}
- if (mti->deformMatrices || mti->deformMatrices_DM) {
- modifier_deformMatrices_DM_deprecated(md, &mectx, dm, deformedVerts, defmats, numVerts);
+ if (mti->deformMatrices) {
+ mti->deformMatrices(md, &mectx, me_eval, deformedVerts, defmats, numVerts);
}
else break;
}
@@ -367,8 +366,9 @@ int BKE_sculpt_get_first_deform_matrices(
numleft++;
}
- if (dm)
- dm->release(dm);
+ if (me_eval) {
+ BKE_id_free(NULL, me_eval);
+ }
*deformmats = defmats;
*deformcos = deformedVerts;
@@ -390,7 +390,7 @@ void BKE_crazyspace_build_sculpt(struct Depsgraph *depsgraph, Scene *scene, Obje
int i, deformed = 0;
VirtualModifierData virtualModifierData;
ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
- ModifierEvalContext mectx = {depsgraph, ob, 0};
+ const ModifierEvalContext mectx = {depsgraph, ob, 0};
Mesh *me = (Mesh *)ob->data;
for (; md; md = md->next) {
@@ -401,10 +401,10 @@ void BKE_crazyspace_build_sculpt(struct Depsgraph *depsgraph, Scene *scene, Obje
if (mti->type == eModifierTypeType_OnlyDeform) {
/* skip leading modifiers which have been already
* handled in sculpt_get_first_deform_matrices */
- if ((mti->deformMatrices || mti->deformMatrices_DM) && !deformed)
+ if (mti->deformMatrices && !deformed)
continue;
- modifier_deformVerts(md, &mectx, NULL, deformedVerts, me->totvert);
+ mti->deformVerts(md, &mectx, NULL, deformedVerts, me->totvert);
deformed = 1;
}
}
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index a9e86087f42..6a3f8472abd 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -2080,7 +2080,7 @@ static bool bevelinside(BevList *bl1, BevList *bl2)
copy_v3_v3(hvec2, hvec1);
hvec2[0] += 1000;
- /* test it with all edges of potential surounding poly */
+ /* test it with all edges of potential surrounding poly */
/* count number of transitions left-right */
bevp = bl1->bevpoints;
@@ -2643,7 +2643,7 @@ static void make_bevel_list_segment_2D(BevList *bl)
static void make_bevel_list_2D(BevList *bl)
{
/* note: bevp->dir and bevp->quat are not needed for beveling but are
- * used when making a path from a 2D curve, therefor they need to be set - Campbell */
+ * used when making a path from a 2D curve, therefore they need to be set - Campbell */
BevPoint *bevp0, *bevp1, *bevp2;
int nr;
@@ -3410,44 +3410,16 @@ static void calchandleNurb_intern(
}
if (leftviolate || rightviolate) { /* align left handle */
BLI_assert(is_fcurve);
-#if 0
- if (is_fcurve)
-#endif
- {
- /* simple 2d calculation */
- float h1_x = p2_h1[0] - p2[0];
- float h2_x = p2[0] - p2_h2[0];
-
- if (leftviolate) {
- p2_h2[1] = p2[1] + ((p2[1] - p2_h1[1]) / h1_x) * h2_x;
- }
- else {
- p2_h1[1] = p2[1] + ((p2[1] - p2_h2[1]) / h2_x) * h1_x;
- }
+ /* simple 2d calculation */
+ float h1_x = p2_h1[0] - p2[0];
+ float h2_x = p2[0] - p2_h2[0];
+
+ if (leftviolate) {
+ p2_h2[1] = p2[1] + ((p2[1] - p2_h1[1]) / h1_x) * h2_x;
}
-#if 0
else {
- float h1[3], h2[3];
- float dot;
-
- sub_v3_v3v3(h1, p2_h1, p2);
- sub_v3_v3v3(h2, p2, p2_h2);
-
- len_a = normalize_v3(h1);
- len_b = normalize_v3(h2);
-
- dot = dot_v3v3(h1, h2);
-
- if (leftviolate) {
- mul_v3_fl(h1, dot * len_b);
- sub_v3_v3v3(p2_h2, p2, h1);
- }
- else {
- mul_v3_fl(h2, dot * len_a);
- add_v3_v3v3(p2_h1, p2, h2);
- }
+ p2_h1[1] = p2[1] + ((p2[1] - p2_h2[1]) / h2_x) * h1_x;
}
-#endif
}
}
}
@@ -3941,7 +3913,7 @@ static void bezier_handle_calc_smooth_fcurve(BezTriple *bezt, int total, int sta
float first_handle_adj = 0.0f, last_handle_adj = 0.0f;
if (full_cycle) {
- /* reduce the number of uknowns by one */
+ /* reduce the number of unknowns by one */
int i = solve_count = count - 1;
dx[0] = dx[i];
@@ -4657,18 +4629,18 @@ float (*BKE_curve_nurbs_keyVertexCos_get(ListBase *lb, float *key))[3]
BezTriple *bezt = nu->bezt;
for (i = 0; i < nu->pntsu; i++, bezt++) {
- copy_v3_v3(co, key); co += 3; key += 3;
- copy_v3_v3(co, key); co += 3; key += 3;
- copy_v3_v3(co, key); co += 3; key += 3;
- key += 3; /* skip tilt */
+ copy_v3_v3(co, &key[0]); co += 3;
+ copy_v3_v3(co, &key[3]); co += 3;
+ copy_v3_v3(co, &key[6]); co += 3;
+ key += KEYELEM_FLOAT_LEN_BEZTRIPLE;
}
}
else {
BPoint *bp = nu->bp;
for (i = 0; i < nu->pntsu * nu->pntsv; i++, bp++) {
- copy_v3_v3(co, key); co += 3; key += 3;
- key++; /* skip tilt */
+ copy_v3_v3(co, key); co += 3;
+ key += KEYELEM_FLOAT_LEN_BPOINT;
}
}
}
@@ -4686,18 +4658,18 @@ void BKE_curve_nurbs_keyVertexTilts_apply(ListBase *lb, float *key)
BezTriple *bezt = nu->bezt;
for (i = 0; i < nu->pntsu; i++, bezt++) {
- key += 3 * 3;
- bezt->alfa = *key;
- key += 3;
+ bezt->alfa = key[9];
+ bezt->radius = key[10];
+ key += KEYELEM_FLOAT_LEN_BEZTRIPLE;
}
}
else {
BPoint *bp = nu->bp;
for (i = 0; i < nu->pntsu * nu->pntsv; i++, bp++) {
- key += 3;
- bp->alfa = *key;
- key++;
+ bp->alfa = key[3];
+ bp->radius = key[4];
+ key += KEYELEM_FLOAT_LEN_BPOINT;
}
}
}
@@ -4867,11 +4839,6 @@ bool BKE_nurb_type_convert(Nurb *nu, const short type, const bool use_handles)
nu->orderv = 1;
nu->type = type;
-#if 0 /* UNUSED */
- if (nu->flagu & CU_NURB_CYCLIC) c = nu->orderu - 1;
- else c = 0;
-#endif
-
if (type == CU_NURBS) {
nu->flagu &= CU_NURB_CYCLIC; /* disable all flags except for cyclic */
nu->flagu |= CU_NURB_BEZIER;
@@ -5013,12 +4980,6 @@ bool BKE_curve_nurb_vert_active_get(Curve *cu, Nurb **r_nu, void **r_vert)
vert = &nu->bp[cu->actvert];
}
}
- /* get functions should never set! */
-#if 0
- else {
- cu->actnu = cu->actvert = CU_ACT_NONE;
- }
-#endif
}
*r_nu = nu;
@@ -5167,8 +5128,29 @@ void BKE_curve_transform_ex(
KeyBlock *kb;
for (kb = cu->key->block.first; kb; kb = kb->next) {
float *fp = kb->data;
- for (i = kb->totelem; i--; fp += 3) {
- mul_m4_v3(mat, fp);
+ int n = kb->totelem;
+
+ for (nu = cu->nurb.first; nu; nu = nu->next) {
+ if (nu->type == CU_BEZIER) {
+ for (i = nu->pntsu; i && (n -= KEYELEM_ELEM_LEN_BEZTRIPLE) >= 0; i--) {
+ mul_m4_v3(mat, &fp[0]);
+ mul_m4_v3(mat, &fp[3]);
+ mul_m4_v3(mat, &fp[6]);
+ if (do_props) {
+ fp[10] *= unit_scale; /* radius */
+ }
+ fp += KEYELEM_FLOAT_LEN_BEZTRIPLE;
+ }
+ }
+ else {
+ for (i = nu->pntsu * nu->pntsv; i && (n -= KEYELEM_ELEM_LEN_BPOINT) >= 0; i--) {
+ mul_m4_v3(mat, fp);
+ if (do_props) {
+ fp[4] *= unit_scale; /* radius */
+ }
+ fp += KEYELEM_FLOAT_LEN_BPOINT;
+ }
+ }
}
}
}
@@ -5212,8 +5194,23 @@ void BKE_curve_translate(Curve *cu, float offset[3], const bool do_keys)
KeyBlock *kb;
for (kb = cu->key->block.first; kb; kb = kb->next) {
float *fp = kb->data;
- for (i = kb->totelem; i--; fp += 3) {
- add_v3_v3(fp, offset);
+ int n = kb->totelem;
+
+ for (nu = cu->nurb.first; nu; nu = nu->next) {
+ if (nu->type == CU_BEZIER) {
+ for (i = nu->pntsu; i && (n -= KEYELEM_ELEM_LEN_BEZTRIPLE) >= 0; i--) {
+ add_v3_v3(&fp[0], offset);
+ add_v3_v3(&fp[3], offset);
+ add_v3_v3(&fp[6], offset);
+ fp += KEYELEM_FLOAT_LEN_BEZTRIPLE;
+ }
+ }
+ else {
+ for (i = nu->pntsu * nu->pntsv; i && (n -= KEYELEM_ELEM_LEN_BPOINT) >= 0; i--) {
+ add_v3_v3(fp, offset);
+ fp += KEYELEM_FLOAT_LEN_BPOINT;
+ }
+ }
}
}
}
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 4afe1877b83..aa27a8654ef 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -53,6 +53,7 @@
#include "BKE_customdata.h"
#include "BKE_customdata_file.h"
#include "BKE_global.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_mesh_mapping.h"
#include "BKE_mesh_remap.h"
@@ -471,11 +472,7 @@ static void layerInterp_origspace_face(
}
}
- /* delay writing to the destination incase dest is in sources */
-
-#if 0 /* no need, this ONLY contains UV's */
- *osf = *(OrigSpaceFace *)(*sources);
-#endif
+ /* delay writing to the destination in case dest is in sources */
memcpy(osf->uv, uv, sizeof(osf->uv));
}
@@ -2239,6 +2236,27 @@ void CustomData_copy_data(const CustomData *source, CustomData *dest,
}
}
+void CustomData_copy_layer_type_data(const CustomData *source,
+ CustomData *destination,
+ int type,
+ int source_index, int destination_index,
+ int count)
+{
+ const int source_layer_index = CustomData_get_layer_index(source, type);
+ if (source_layer_index == -1) {
+ return;
+ }
+ const int destinaiton_layer_index =
+ CustomData_get_layer_index(destination, type);
+ if (destinaiton_layer_index == -1) {
+ return;
+ }
+ CustomData_copy_data_layer(source, destination,
+ source_layer_index, destinaiton_layer_index,
+ source_index, destination_index,
+ count);
+}
+
void CustomData_free_elem(CustomData *data, int index, int count)
{
int i;
@@ -2874,7 +2892,7 @@ void CustomData_bmesh_copy_data(const CustomData *source, CustomData *dest,
}
}
-/*Bmesh Custom Data Functions. Should replace editmesh ones with these as well, due to more effecient memory alloc*/
+/*Bmesh Custom Data Functions. Should replace editmesh ones with these as well, due to more efficient memory alloc*/
void *CustomData_bmesh_get(const CustomData *data, void *block, int type)
{
int layer_index;
@@ -3737,19 +3755,6 @@ void CustomData_external_remove(CustomData *data, ID *id, int type, int totelem)
CustomData_external_read(data, id, CD_TYPE_AS_MASK(layer->type), totelem);
layer->flag &= ~CD_FLAG_EXTERNAL;
-
-#if 0
- remove_file = 1;
- for (i = 0; i < data->totlayer; i++)
- if (data->layers[i].flag & CD_FLAG_EXTERNAL)
- remove_file = 0;
-
- if (remove_file) {
- customdata_external_filename(filename, id, external);
- cdf_remove(filename);
- CustomData_external_free(data);
- }
-#endif
}
}
@@ -3765,21 +3770,6 @@ bool CustomData_external_test(CustomData *data, int type)
return (layer->flag & CD_FLAG_EXTERNAL) != 0;
}
-#if 0
-void CustomData_external_remove_object(CustomData *data, ID *id)
-{
- CustomDataExternal *external = data->external;
- char filename[FILE_MAX];
-
- if (!external)
- return;
-
- customdata_external_filename(filename, id, external);
- cdf_remove(filename);
- CustomData_external_free(data);
-}
-#endif
-
/* ********** Mesh-to-mesh data transfer ********** */
static void copy_bit_flag(void *dst, const void *src, const size_t data_size, const uint64_t flag)
{
diff --git a/source/blender/blenkernel/intern/customdata_file.c b/source/blender/blenkernel/intern/customdata_file.c
index 3fee2ef6021..3350d8e7b2f 100644
--- a/source/blender/blenkernel/intern/customdata_file.c
+++ b/source/blender/blenkernel/intern/customdata_file.c
@@ -110,16 +110,6 @@ static int cdf_endian(void)
return CDF_ENDIAN_BIG;
}
-#if 0
-static int cdf_data_type_size(int datatype)
-{
- if (datatype == CDF_DATA_FLOAT)
- return sizeof(float);
-
- return 0;
-}
-#endif
-
CDataFile *cdf_create(int type)
{
CDataFile *cdf = MEM_callocN(sizeof(CDataFile), "CDataFile");
diff --git a/source/blender/blenkernel/intern/data_transfer.c b/source/blender/blenkernel/intern/data_transfer.c
index 7006e4ddaa6..73c5f6cecdf 100644
--- a/source/blender/blenkernel/intern/data_transfer.c
+++ b/source/blender/blenkernel/intern/data_transfer.c
@@ -824,7 +824,7 @@ static bool data_transfer_layersmapping_generate(
return ret;
}
else if (cddata_type == CD_FAKE_SHAPEKEY) {
- /* TODO: leaving shapekeys asside for now, quite specific case, since we can't access them from MVert :/ */
+ /* TODO: leaving shapekeys aside for now, quite specific case, since we can't access them from MVert :/ */
return false;
}
}
diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c
index 78a287919d0..bbb7fc4b3bd 100644
--- a/source/blender/blenkernel/intern/deform.c
+++ b/source/blender/blenkernel/intern/deform.c
@@ -56,6 +56,7 @@
#include "BKE_deform.h" /* own include */
#include "BKE_mesh.h"
#include "BKE_mesh_mapping.h"
+#include "BKE_object.h"
#include "BKE_object_deform.h"
#include "data_transfer_intern.h"
@@ -74,9 +75,7 @@ bDeformGroup *BKE_defgroup_new(Object *ob, const char *name)
BLI_addtail(&ob->defbase, defgroup);
defgroup_unique_name(defgroup, ob);
- if (ob->type != OB_GPENCIL) {
- BKE_mesh_batch_cache_dirty_tag(ob->data, BKE_MESH_BATCH_DIRTY_ALL);
- }
+ BKE_object_batch_cache_dirty_tag(ob);
return defgroup;
}
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 562e2257ea0..8d49521831f 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -813,7 +813,7 @@ static void curve_calc_modifiers_pre(
ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
ModifierData *pretessellatePoint;
Curve *cu = ob->data;
- int numVerts = 0;
+ int numElems = 0, numVerts = 0;
const bool editmode = (!for_render && (cu->editnurb || cu->editfont));
ModifierApplyFlag app_flag = 0;
float (*deformedVerts)[3] = NULL;
@@ -839,15 +839,17 @@ static void curve_calc_modifiers_pre(
required_mode |= eModifierMode_Editmode;
if (!editmode) {
- keyVerts = BKE_key_evaluate_object(ob, &numVerts);
+ keyVerts = BKE_key_evaluate_object(ob, &numElems);
if (keyVerts) {
+ BLI_assert(BKE_keyblock_curve_element_count(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_keyVertexCos_get(nurb, keyVerts);
- BLI_assert(BKE_nurbList_verts_count(nurb) == numVerts);
+ numVerts = BKE_nurbList_verts_count(nurb);
}
}
@@ -864,7 +866,7 @@ static void curve_calc_modifiers_pre(
deformedVerts = BKE_curve_nurbs_vertexCos_get(nurb, &numVerts);
}
- modifier_deformVerts(md, &mectx, NULL, deformedVerts, numVerts);
+ mti->deformVerts(md, &mectx, NULL, deformedVerts, numVerts);
if (md == pretessellatePoint)
break;
@@ -918,7 +920,7 @@ static void displist_apply_allverts(ListBase *dispbase, float (*allverts)[3])
static void curve_calc_modifiers_post(
Depsgraph *depsgraph, Scene *scene, Object *ob, ListBase *nurb,
- ListBase *dispbase, DerivedMesh **r_dm_final,
+ ListBase *dispbase, Mesh **r_final,
const bool for_render, const bool use_render_resolution)
{
VirtualModifierData virtualModifierData;
@@ -953,8 +955,8 @@ static void curve_calc_modifiers_post(
md = pretessellatePoint->next;
}
- if (r_dm_final && *r_dm_final) {
- (*r_dm_final)->release(*r_dm_final);
+ if (r_final && *r_final) {
+ BKE_id_free(NULL, r_final);
}
for (; md; md = md->next) {
@@ -970,19 +972,17 @@ static void curve_calc_modifiers_post(
if (!vertCos) {
vertCos = BKE_mesh_vertexCos_get(modified, &totvert);
}
-
- modifier_deformVerts(md, &mectx_deform, modified, vertCos, totvert);
+ mti->deformVerts(md, &mectx_deform, modified, vertCos, totvert);
}
else {
if (!vertCos) {
vertCos = displist_get_allverts(dispbase, &totvert);
}
-
- modifier_deformVerts(md, &mectx_deform, NULL, vertCos, totvert);
+ mti->deformVerts(md, &mectx_deform, NULL, vertCos, totvert);
}
}
else {
- if (!r_dm_final) {
+ if (!r_final) {
/* makeDisplistCurveTypes could be used for beveling, where derived mesh
* is totally unnecessary, so we could stop modifiers applying
* when we found constructive modifier but derived mesh is unwanted result
@@ -1021,7 +1021,7 @@ static void curve_calc_modifiers_post(
vertCos = NULL;
}
- mesh_applied = modifier_applyModifier(md, &mectx_apply, modified);
+ mesh_applied = mti->applyModifier(md, &mectx_apply, modified);
if (mesh_applied) {
/* Modifier returned a new derived mesh */
@@ -1055,7 +1055,7 @@ static void curve_calc_modifiers_post(
}
}
- if (r_dm_final) {
+ if (r_final) {
if (modified) {
/* see: mesh_calc_modifiers */
if (modified->totface == 0) {
@@ -1070,11 +1070,10 @@ static void curve_calc_modifiers_post(
/* XXX2.8(Sybren): make sure the face normals are recalculated as well */
BKE_mesh_ensure_normals(modified);
- (*r_dm_final) = CDDM_from_mesh_ex(modified, CD_DUPLICATE, CD_MASK_MESH);
- BKE_id_free(NULL, modified);
+ (*r_final) = modified;
}
else {
- (*r_dm_final) = NULL;
+ (*r_final) = NULL;
}
}
@@ -1230,7 +1229,7 @@ static void curve_calc_orcodm(
void BKE_displist_make_surf(
Depsgraph *depsgraph, Scene *scene, Object *ob, ListBase *dispbase,
- DerivedMesh **r_dm_final,
+ Mesh **r_final,
const bool for_render, const bool for_orco, const bool use_render_resolution)
{
ListBase nubase = {NULL, NULL};
@@ -1315,7 +1314,7 @@ void BKE_displist_make_surf(
if (!for_orco) {
BKE_nurbList_duplicate(&ob->runtime.curve_cache->deformed_nurbs, &nubase);
- curve_calc_modifiers_post(depsgraph, scene, ob, &nubase, dispbase, r_dm_final,
+ curve_calc_modifiers_post(depsgraph, scene, ob, &nubase, dispbase, r_final,
for_render, use_render_resolution);
}
@@ -1543,7 +1542,7 @@ static void calc_bevfac_mapping(Curve *cu, BevList *bl, Nurb *nu,
static void do_makeDispListCurveTypes(
Depsgraph *depsgraph, Scene *scene, Object *ob, ListBase *dispbase,
- DerivedMesh **r_dm_final,
+ Mesh **r_final,
const bool for_render, const bool for_orco, const bool use_render_resolution)
{
Curve *cu = ob->data;
@@ -1552,7 +1551,7 @@ static void do_makeDispListCurveTypes(
if (!ELEM(ob->type, OB_SURF, OB_CURVE, OB_FONT)) return;
if (ob->type == OB_SURF) {
- BKE_displist_make_surf(depsgraph, scene, ob, dispbase, r_dm_final, for_render, for_orco, use_render_resolution);
+ BKE_displist_make_surf(depsgraph, scene, ob, dispbase, r_final, for_render, for_orco, use_render_resolution);
}
else if (ELEM(ob->type, OB_CURVE, OB_FONT)) {
ListBase dlbev;
@@ -1778,10 +1777,10 @@ static void do_makeDispListCurveTypes(
if (!for_orco) {
BKE_nurbList_duplicate(&ob->runtime.curve_cache->deformed_nurbs, &nubase);
- curve_calc_modifiers_post(depsgraph, scene, ob, &nubase, dispbase, r_dm_final, for_render, use_render_resolution);
+ curve_calc_modifiers_post(depsgraph, scene, ob, &nubase, dispbase, r_final, for_render, use_render_resolution);
}
- if (cu->flag & CU_DEFORM_FILL && !ob->derivedFinal) {
+ if (cu->flag & CU_DEFORM_FILL && !ob->runtime.mesh_eval) {
curve_to_filledpoly(cu, &nubase, dispbase);
}
@@ -1807,21 +1806,21 @@ void BKE_displist_make_curveTypes(Depsgraph *depsgraph, Scene *scene, Object *ob
dispbase = &(ob->runtime.curve_cache->disp);
- do_makeDispListCurveTypes(depsgraph, scene, ob, dispbase, &ob->derivedFinal, 0, for_orco, 0);
+ do_makeDispListCurveTypes(depsgraph, scene, ob, dispbase, &ob->runtime.mesh_eval, 0, for_orco, 0);
boundbox_displist_object(ob);
}
void BKE_displist_make_curveTypes_forRender(
Depsgraph *depsgraph, Scene *scene, Object *ob, ListBase *dispbase,
- DerivedMesh **r_dm_final, const bool for_orco,
+ Mesh **r_final, const bool for_orco,
const bool use_render_resolution)
{
if (ob->runtime.curve_cache == NULL) {
ob->runtime.curve_cache = MEM_callocN(sizeof(CurveCache), "CurveCache for Curve");
}
- do_makeDispListCurveTypes(depsgraph, scene, ob, dispbase, r_dm_final, true, for_orco, use_render_resolution);
+ do_makeDispListCurveTypes(depsgraph, scene, ob, dispbase, r_final, true, for_orco, use_render_resolution);
}
void BKE_displist_make_curveTypes_forOrco(
@@ -1834,33 +1833,6 @@ void BKE_displist_make_curveTypes_forOrco(
do_makeDispListCurveTypes(depsgraph, scene, ob, dispbase, NULL, 1, 1, 1);
}
-/* add Orco layer to the displist object which has got derived mesh and return orco */
-/* XXX2.8(Sybren): can be removed once DerivedMesh port is done */
-#ifdef WITH_DERIVEDMESH_DEPRECATED_FUNCS
-float *BKE_displist_make_orco(
- Depsgraph *depsgraph, Scene *scene, Object *ob, DerivedMesh *dm_final,
- const bool for_render,
- const bool use_render_resolution)
-{
- float *orco;
-
- if (dm_final == NULL)
- dm_final = ob->derivedFinal;
-
- if (!dm_final->getVertDataArray(dm_final, CD_ORCO)) {
- curve_calc_orcodm(depsgraph, scene, ob, dm_final, for_render, use_render_resolution);
- }
-
- orco = dm_final->getVertDataArray(dm_final, CD_ORCO);
-
- if (orco) {
- orco = MEM_dupallocN(orco);
- }
-
- return orco;
-}
-#endif
-
void BKE_displist_minmax(ListBase *dispbase, float min[3], float max[3])
{
DispList *dl;
@@ -1896,8 +1868,8 @@ static void boundbox_displist_object(Object *ob)
if (ob->bb == NULL)
ob->bb = MEM_callocN(sizeof(BoundBox), "boundbox");
- if (ob->derivedFinal) {
- DM_set_object_boundbox(ob, ob->derivedFinal);
+ if (ob->runtime.mesh_eval) {
+ BKE_object_boundbox_calc_from_mesh(ob, ob->runtime.mesh_eval);
}
else {
float min[3], max[3];
diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c
index 4b61d35cac8..8c39b50101b 100644
--- a/source/blender/blenkernel/intern/dynamicpaint.c
+++ b/source/blender/blenkernel/intern/dynamicpaint.c
@@ -58,18 +58,19 @@
#include "BKE_collection.h"
#include "BKE_collision.h"
#include "BKE_colorband.h"
-#include "BKE_cdderivedmesh.h"
#include "BKE_constraint.h"
#include "BKE_customdata.h"
#include "BKE_deform.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_dynamicpaint.h"
#include "BKE_effect.h"
#include "BKE_global.h"
#include "BKE_image.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_material.h"
+#include "BKE_mesh.h"
#include "BKE_mesh_mapping.h"
+#include "BKE_mesh_runtime.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
#include "BKE_particle.h"
@@ -250,7 +251,7 @@ static int dynamicPaint_surfaceNumOfPoints(DynamicPaintSurface *surface)
return 0; /* not supported atm */
}
else if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
- return (surface->canvas->dm) ? surface->canvas->dm->getNumVerts(surface->canvas->dm) : 0;
+ return (surface->canvas->mesh) ? surface->canvas->mesh->totvert : 0;
}
return 0;
@@ -754,7 +755,7 @@ static void surfaceGenerateGrid(struct DynamicPaintSurface *surface)
error = 1;
if (!error) {
- /* calculate number of points withing each cell */
+ /* calculate number of points within each cell */
{
ParallelRangeSettings settings;
BLI_parallel_range_settings_defaults(&settings);
@@ -813,9 +814,10 @@ static void surfaceGenerateGrid(struct DynamicPaintSurface *surface)
void dynamicPaint_freeBrush(struct DynamicPaintModifierData *pmd)
{
if (pmd->brush) {
- if (pmd->brush->dm)
- pmd->brush->dm->release(pmd->brush->dm);
- pmd->brush->dm = NULL;
+ if (pmd->brush->mesh) {
+ BKE_id_free(NULL, pmd->brush->mesh);
+ }
+ pmd->brush->mesh = NULL;
if (pmd->brush->paint_ramp)
MEM_freeN(pmd->brush->paint_ramp);
@@ -942,10 +944,11 @@ void dynamicPaint_freeCanvas(DynamicPaintModifierData *pmd)
surface = next_surface;
}
- /* free dm copy */
- if (pmd->canvas->dm)
- pmd->canvas->dm->release(pmd->canvas->dm);
- pmd->canvas->dm = NULL;
+ /* free mesh copy */
+ if (pmd->canvas->mesh) {
+ BKE_id_free(NULL, pmd->canvas->mesh);
+ }
+ pmd->canvas->mesh = NULL;
MEM_freeN(pmd->canvas);
pmd->canvas = NULL;
@@ -1057,7 +1060,7 @@ bool dynamicPaint_createType(struct DynamicPaintModifierData *pmd, int type, str
if (!canvas)
return false;
canvas->pmd = pmd;
- canvas->dm = NULL;
+ canvas->mesh = NULL;
/* Create one surface */
if (!dynamicPaint_createNewSurface(canvas, scene))
@@ -1097,7 +1100,7 @@ bool dynamicPaint_createType(struct DynamicPaintModifierData *pmd, int type, str
brush->smudge_strength = 0.3f;
brush->max_velocity = 1.0f;
- brush->dm = NULL;
+ brush->mesh = NULL;
/* Paint proximity falloff colorramp. */
{
@@ -1285,7 +1288,7 @@ static bool surface_usesAdjData(DynamicPaintSurface *surface)
static void dynamicPaint_initAdjacencyData(DynamicPaintSurface *surface, const bool force_init)
{
PaintSurfaceData *sData = surface->data;
- DerivedMesh *dm = surface->canvas->dm;
+ Mesh *mesh = surface->canvas->mesh;
PaintAdjData *ad;
int *temp_data;
int neigh_points = 0;
@@ -1295,7 +1298,7 @@ static void dynamicPaint_initAdjacencyData(DynamicPaintSurface *surface, const b
if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
/* For vertex format, neighbors are connected by edges */
- neigh_points = 2 * dm->getNumEdges(dm);
+ neigh_points = 2 * mesh->totedge;
}
else if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) {
neigh_points = sData->total_points * 8;
@@ -1331,11 +1334,11 @@ static void dynamicPaint_initAdjacencyData(DynamicPaintSurface *surface, const b
int n_pos;
/* For vertex format, count every vertex that is connected by an edge */
- int numOfEdges = dm->getNumEdges(dm);
- int numOfPolys = dm->getNumPolys(dm);
- struct MEdge *edge = dm->getEdgeArray(dm);
- struct MPoly *mpoly = dm->getPolyArray(dm);
- struct MLoop *mloop = dm->getLoopArray(dm);
+ int numOfEdges = mesh->totedge;
+ int numOfPolys = mesh->totpoly;
+ struct MEdge *edge = mesh->medge;
+ struct MPoly *mpoly = mesh->mpoly;
+ struct MLoop *mloop = mesh->mloop;
/* count number of edges per vertex */
for (i = 0; i < numOfEdges; i++) {
@@ -1347,7 +1350,7 @@ static void dynamicPaint_initAdjacencyData(DynamicPaintSurface *surface, const b
}
/* also add number of vertices to temp_data
- * to locate points on "mesh edge" */
+ * to locate points on "mesh edge" */
for (i = 0; i < numOfPolys; i++) {
for (int j = 0; j < mpoly[i].totloop; j++) {
temp_data[mloop[mpoly[i].loopstart + j].v]++;
@@ -1355,7 +1358,7 @@ static void dynamicPaint_initAdjacencyData(DynamicPaintSurface *surface, const b
}
/* now check if total number of edges+faces for
- * each vertex is even, if not -> vertex is on mesh edge */
+ * each vertex is even, if not -> vertex is on mesh edge */
for (i = 0; i < sData->total_points; i++) {
if ((temp_data[i] % 2) || (temp_data[i] < 4)) {
ad->flags[i] |= ADJ_ON_MESH_EDGE;
@@ -1389,7 +1392,7 @@ static void dynamicPaint_initAdjacencyData(DynamicPaintSurface *surface, const b
}
else if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) {
/* for image sequences, only allocate memory.
- * bake initialization takes care of rest */
+ * bake initialization takes care of rest */
}
MEM_freeN(temp_data);
@@ -1519,7 +1522,7 @@ static void dynamicPaint_setInitialColor(const Scene *scene, DynamicPaintSurface
{
PaintSurfaceData *sData = surface->data;
PaintPoint *pPoint = (PaintPoint *)sData->type_data;
- DerivedMesh *dm = surface->canvas->dm;
+ Mesh *mesh = surface->canvas->mesh;
int i;
const bool scene_color_manage = BKE_scene_check_color_management_enabled(scene);
@@ -1540,9 +1543,9 @@ static void dynamicPaint_setInitialColor(const Scene *scene, DynamicPaintSurface
else if (surface->init_color_type == MOD_DPAINT_INITIAL_TEXTURE) {
Tex *tex = surface->init_texture;
- const MLoop *mloop = dm->getLoopArray(dm);
- const MLoopTri *mlooptri = dm->getLoopTriArray(dm);
- const int tottri = dm->getNumLoopTri(dm);
+ const MLoop *mloop = mesh->mloop;
+ const MLoopTri *mlooptri = BKE_mesh_runtime_looptri_ensure(mesh);
+ const int tottri = BKE_mesh_runtime_looptri_len(mesh);
const MLoopUV *mloopuv = NULL;
char uvname[MAX_CUSTOMDATA_LAYER_NAME];
@@ -1551,13 +1554,13 @@ static void dynamicPaint_setInitialColor(const Scene *scene, DynamicPaintSurface
return;
/* get uv map */
- CustomData_validate_layer_name(&dm->loopData, CD_MLOOPUV, surface->init_layername, uvname);
- mloopuv = CustomData_get_layer_named(&dm->loopData, CD_MLOOPUV, uvname);
+ CustomData_validate_layer_name(&mesh->ldata, CD_MLOOPUV, surface->init_layername, uvname);
+ mloopuv = CustomData_get_layer_named(&mesh->ldata, CD_MLOOPUV, uvname);
if (!mloopuv)
return;
/* for vertex surface loop through tfaces and find uv color
- * that provides highest alpha */
+ * that provides highest alpha */
if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
struct ImagePool *pool = BKE_image_pool_new();
@@ -1595,9 +1598,9 @@ static void dynamicPaint_setInitialColor(const Scene *scene, DynamicPaintSurface
/* for vertex surface, just copy colors from mcol */
if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
- const MLoop *mloop = dm->getLoopArray(dm);
- const int totloop = dm->getNumLoops(dm);
- const MLoopCol *col = CustomData_get_layer_named(&dm->loopData, CD_MLOOPCOL, surface->init_layername);
+ const MLoop *mloop = mesh->mloop;
+ const int totloop = mesh->totloop;
+ const MLoopCol *col = CustomData_get_layer_named(&mesh->ldata, CD_MLOOPCOL, surface->init_layername);
if (!col)
return;
@@ -1606,8 +1609,8 @@ static void dynamicPaint_setInitialColor(const Scene *scene, DynamicPaintSurface
}
}
else if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) {
- const MLoopTri *mlooptri = dm->getLoopTriArray(dm);
- MLoopCol *col = CustomData_get_layer_named(&dm->loopData, CD_MLOOPCOL, surface->init_layername);
+ const MLoopTri *mlooptri = BKE_mesh_runtime_looptri_ensure(mesh);
+ MLoopCol *col = CustomData_get_layer_named(&mesh->ldata, CD_MLOOPCOL, surface->init_layername);
if (!col)
return;
@@ -1729,7 +1732,7 @@ static void dynamic_paint_apply_surface_displace_cb(
}
/* apply displacing vertex surface to the derived mesh */
-static void dynamicPaint_applySurfaceDisplace(DynamicPaintSurface *surface, DerivedMesh *result)
+static void dynamicPaint_applySurfaceDisplace(DynamicPaintSurface *surface, Mesh *result)
{
PaintSurfaceData *sData = surface->data;
@@ -1738,7 +1741,7 @@ static void dynamicPaint_applySurfaceDisplace(DynamicPaintSurface *surface, Deri
/* displace paint */
if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE) {
- MVert *mvert = result->getVertArray(result);
+ MVert *mvert = result->mvert;
DynamicPaintModifierApplyData data = {.surface = surface, .mvert = mvert};
ParallelRangeSettings settings;
@@ -1856,10 +1859,10 @@ static void dynamic_paint_apply_surface_wave_cb(
/*
* Apply canvas data to the object derived mesh
*/
-static DerivedMesh *dynamicPaint_Modifier_apply(
- DynamicPaintModifierData *pmd, Object *ob, DerivedMesh *dm)
+static Mesh *dynamicPaint_Modifier_apply(
+ DynamicPaintModifierData *pmd, Object *ob, Mesh *mesh)
{
- DerivedMesh *result = CDDM_copy(dm);
+ Mesh *result = BKE_mesh_copy_for_eval(mesh, false);
if (pmd->canvas && !(pmd->canvas->flags & MOD_DPAINT_BAKING)) {
@@ -1879,10 +1882,10 @@ static DerivedMesh *dynamicPaint_Modifier_apply(
/* vertex color paint */
if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
- MLoop *mloop = CDDM_get_loops(result);
- const int totloop = result->numLoopData;
- MPoly *mpoly = CDDM_get_polys(result);
- const int totpoly = result->numPolyData;
+ MLoop *mloop = result->mloop;
+ const int totloop = result->totloop;
+ MPoly *mpoly = result->mpoly;
+ const int totpoly = result->totpoly;
/* paint is stored on dry and wet layers, so mix final color first */
float (*fcolor)[4] = MEM_callocN(sizeof(*fcolor) * sData->total_points, "Temp paint color");
@@ -1900,28 +1903,28 @@ static DerivedMesh *dynamicPaint_Modifier_apply(
}
/* paint layer */
- MLoopCol *mloopcol = CustomData_get_layer_named(&result->loopData, CD_MLOOPCOL, surface->output_name);
+ MLoopCol *mloopcol = CustomData_get_layer_named(&result->ldata, CD_MLOOPCOL, surface->output_name);
/* if output layer is lost from a constructive modifier, re-add it */
if (!mloopcol && dynamicPaint_outputLayerExists(surface, ob, 0)) {
mloopcol = CustomData_add_layer_named(
- &result->loopData, CD_MLOOPCOL, CD_CALLOC, NULL, totloop, surface->output_name);
+ &result->ldata, CD_MLOOPCOL, CD_CALLOC, NULL, totloop, surface->output_name);
}
/* wet layer */
- MLoopCol *mloopcol_wet = CustomData_get_layer_named(&result->loopData, CD_MLOOPCOL, surface->output_name2);
+ MLoopCol *mloopcol_wet = CustomData_get_layer_named(&result->ldata, CD_MLOOPCOL, surface->output_name2);
/* if output layer is lost from a constructive modifier, re-add it */
if (!mloopcol_wet && dynamicPaint_outputLayerExists(surface, ob, 1)) {
mloopcol_wet = CustomData_add_layer_named(
- &result->loopData, CD_MLOOPCOL, CD_CALLOC, NULL, totloop, surface->output_name2);
+ &result->ldata, CD_MLOOPCOL, CD_CALLOC, NULL, totloop, surface->output_name2);
}
/* Save preview results to weight layer to be able to share same drawing methods */
MLoopCol *mloopcol_preview = NULL;
if (surface->flags & MOD_DPAINT_PREVIEW) {
- mloopcol_preview = CustomData_get_layer(&result->loopData, CD_PREVIEW_MLOOPCOL);
+ mloopcol_preview = CustomData_get_layer(&result->ldata, CD_PREVIEW_MLOOPCOL);
if (!mloopcol_preview) {
mloopcol_preview = CustomData_add_layer(
- &result->loopData, CD_PREVIEW_MLOOPCOL, CD_CALLOC, NULL, totloop);
+ &result->ldata, CD_PREVIEW_MLOOPCOL, CD_CALLOC, NULL, totloop);
}
}
@@ -1946,12 +1949,12 @@ static DerivedMesh *dynamicPaint_Modifier_apply(
MEM_freeN(fcolor);
/* Mark tessellated CD layers as dirty. */
- result->dirty |= DM_DIRTY_TESS_CDLAYERS;
+ //result->dirty |= DM_DIRTY_TESS_CDLAYERS;
}
/* vertex group paint */
else if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) {
int defgrp_index = defgroup_name_index(ob, surface->output_name);
- MDeformVert *dvert = result->getVertDataArray(result, CD_MDEFORMVERT);
+ MDeformVert *dvert = CustomData_get_layer(&result->vdata, CD_MDEFORMVERT);
float *weight = (float *)sData->type_data;
/* viewport preview */
@@ -1959,12 +1962,13 @@ static DerivedMesh *dynamicPaint_Modifier_apply(
/* Save preview results to weight layer to be
* able to share same drawing methods.
* Note this func also sets DM_DIRTY_TESS_CDLAYERS flag! */
- DM_update_weight_mcol(ob, result, 0, weight, 0, NULL);
+ //TODO port this function
+ //DM_update_weight_mcol(ob, result, 0, weight, 0, NULL);
}
- /* apply weights into a vertex group, if doesnt exists add a new layer */
+ /* apply weights into a vertex group, if doesn't exists add a new layer */
if (defgrp_index != -1 && !dvert && (surface->output_name[0] != '\0')) {
- dvert = CustomData_add_layer(&result->vertData, CD_MDEFORMVERT, CD_CALLOC,
+ dvert = CustomData_add_layer(&result->vdata, CD_MDEFORMVERT, CD_CALLOC,
NULL, sData->total_points);
}
if (defgrp_index != -1 && dvert) {
@@ -1988,7 +1992,7 @@ static DerivedMesh *dynamicPaint_Modifier_apply(
}
/* wave simulation */
else if (surface->type == MOD_DPAINT_SURFACE_T_WAVE) {
- MVert *mvert = result->getVertArray(result);
+ MVert *mvert = result->mvert;
DynamicPaintModifierApplyData data = {.surface = surface, .mvert = mvert};
ParallelRangeSettings settings;
@@ -2012,14 +2016,15 @@ static DerivedMesh *dynamicPaint_Modifier_apply(
}
if (update_normals) {
- result->dirty |= DM_DIRTY_NORMALS;
+ //result->dirty |= DM_DIRTY_NORMALS;
}
}
- /* make a copy of dm to use as brush data */
+ /* make a copy of mesh to use as brush data */
if (pmd->brush) {
- if (pmd->brush->dm)
- pmd->brush->dm->release(pmd->brush->dm);
- pmd->brush->dm = CDDM_copy(result);
+ if (pmd->brush->mesh) {
+ BKE_id_free(NULL, pmd->brush->mesh);
+ }
+ pmd->brush->mesh = BKE_mesh_copy_for_eval(result, false);
}
return result;
@@ -2034,13 +2039,13 @@ void dynamicPaint_cacheUpdateFrames(DynamicPaintSurface *surface)
}
}
-static void canvas_copyDerivedMesh(DynamicPaintCanvasSettings *canvas, DerivedMesh *dm)
+static void canvas_copyMesh(DynamicPaintCanvasSettings *canvas, Mesh *mesh)
{
- if (canvas->dm) {
- canvas->dm->release(canvas->dm);
+ if (canvas->mesh) {
+ BKE_id_free(NULL, canvas->mesh);
}
- canvas->dm = CDDM_copy(dm);
+ canvas->mesh = BKE_mesh_copy_for_eval(mesh, false);
}
/*
@@ -2048,14 +2053,14 @@ static void canvas_copyDerivedMesh(DynamicPaintCanvasSettings *canvas, DerivedMe
*/
static void dynamicPaint_frameUpdate(
DynamicPaintModifierData *pmd, struct Depsgraph *depsgraph, Scene *scene,
- Object *ob, DerivedMesh *dm)
+ Object *ob, Mesh *mesh)
{
if (pmd->canvas) {
DynamicPaintCanvasSettings *canvas = pmd->canvas;
DynamicPaintSurface *surface = canvas->surfaces.first;
/* update derived mesh copy */
- canvas_copyDerivedMesh(canvas, dm);
+ canvas_copyMesh(canvas, mesh);
/* in case image sequence baking, stop here */
if (canvas->flags & MOD_DPAINT_BAKING)
@@ -2114,11 +2119,11 @@ static void dynamicPaint_frameUpdate(
dynamicPaint_calculateFrame(surface, depsgraph, scene, ob, current_frame);
canvas->flags &= ~MOD_DPAINT_BAKING;
- /* restore canvas derivedmesh if required */
+ /* restore canvas mesh if required */
if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE &&
surface->flags & MOD_DPAINT_DISP_INCREMENTAL && surface->next)
{
- canvas_copyDerivedMesh(canvas, dm);
+ canvas_copyMesh(canvas, mesh);
}
BKE_ptcache_validate(cache, surface->current_frame);
@@ -2130,27 +2135,27 @@ static void dynamicPaint_frameUpdate(
}
/* Modifier call. Processes dynamic paint modifier step. */
-DerivedMesh *dynamicPaint_Modifier_do(
+Mesh *dynamicPaint_Modifier_do(
DynamicPaintModifierData *pmd, struct Depsgraph *depsgraph, Scene *scene,
- Object *ob, DerivedMesh *dm)
+ Object *ob, Mesh *mesh)
{
if (pmd->canvas) {
- DerivedMesh *ret;
+ Mesh *ret;
/* Update canvas data for a new frame */
- dynamicPaint_frameUpdate(pmd, depsgraph, scene, ob, dm);
+ dynamicPaint_frameUpdate(pmd, depsgraph, scene, ob, mesh);
/* Return output mesh */
- ret = dynamicPaint_Modifier_apply(pmd, ob, dm);
+ ret = dynamicPaint_Modifier_apply(pmd, ob, mesh);
return ret;
}
else {
/* Update canvas data for a new frame */
- dynamicPaint_frameUpdate(pmd, depsgraph, scene, ob, dm);
+ dynamicPaint_frameUpdate(pmd, depsgraph, scene, ob, mesh);
/* Return output mesh */
- return dynamicPaint_Modifier_apply(pmd, ob, dm);
+ return dynamicPaint_Modifier_apply(pmd, ob, mesh);
}
}
@@ -2752,7 +2757,7 @@ int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface, flo
PaintSurfaceData *sData;
DynamicPaintCanvasSettings *canvas = surface->canvas;
- DerivedMesh *dm = canvas->dm;
+ Mesh *mesh = canvas->mesh;
PaintUVPoint *tempPoints = NULL;
Vec3f *tempWeights = NULL;
@@ -2766,19 +2771,19 @@ int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface, flo
*progress = 0.0f;
*do_update = true;
- if (!dm)
+ if (!mesh)
return setError(canvas, N_("Canvas mesh not updated"));
if (surface->format != MOD_DPAINT_SURFACE_F_IMAGESEQ)
return setError(canvas, N_("Cannot bake non-'image sequence' formats"));
- mloop = dm->getLoopArray(dm);
- mlooptri = dm->getLoopTriArray(dm);
- const int tottri = dm->getNumLoopTri(dm);
+ mloop = mesh->mloop;
+ mlooptri = BKE_mesh_runtime_looptri_ensure(mesh);;
+ const int tottri = BKE_mesh_runtime_looptri_len(mesh);
/* get uv map */
- if (CustomData_has_layer(&dm->loopData, CD_MLOOPUV)) {
- CustomData_validate_layer_name(&dm->loopData, CD_MLOOPUV, surface->uvlayer_name, uvname);
- mloopuv = CustomData_get_layer_named(&dm->loopData, CD_MLOOPUV, uvname);
+ if (CustomData_has_layer(&mesh->ldata, CD_MLOOPUV)) {
+ CustomData_validate_layer_name(&mesh->ldata, CD_MLOOPUV, surface->uvlayer_name, uvname);
+ mloopuv = CustomData_get_layer_named(&mesh->ldata, CD_MLOOPUV, uvname);
}
/* Check for validity */
@@ -2884,7 +2889,7 @@ int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface, flo
int cursor = 0;
/* Create a temporary array of final indexes (before unassigned
- * pixels have been dropped) */
+ * pixels have been dropped) */
for (int i = 0; i < w * h; i++) {
if (tempPoints[i].tri_index != -1) {
final_index[i] = cursor;
@@ -2904,7 +2909,7 @@ int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface, flo
BKE_mesh_vert_looptri_map_create(
&vert_to_looptri_map, &vert_to_looptri_map_mem,
- dm->getVertArray(dm), dm->getNumVerts(dm), mlooptri, tottri, mloop, dm->getNumLoops(dm));
+ mesh->mvert, mesh->totvert, mlooptri, tottri, mloop, mesh->totloop);
int total_border = 0;
@@ -3199,7 +3204,7 @@ void dynamicPaint_outputSurfaceImage(DynamicPaintSurface *surface, char *filenam
setError(surface->canvas, N_("Image save failed: invalid surface"));
return;
}
- /* if selected format is openexr, but current build doesnt support one */
+ /* if selected format is openexr, but current build doesn't support one */
#ifndef WITH_OPENEXR
if (format == R_IMF_IMTYPE_OPENEXR)
format = R_IMF_IMTYPE_PNG;
@@ -3349,9 +3354,9 @@ static void mesh_tris_spherecast_dp(void *userdata, int index, const BVHTreeRay
}
/* A modified callback to bvh tree nearest point. The tree must have been built using bvhtree_from_mesh_looptri.
- * userdata must be a BVHMeshCallbackUserdata built from the same mesh as the tree.
+ * userdata must be a BVHMeshCallbackUserdata built from the same mesh as the tree.
*
- * To optimize brush detection speed this doesn't calculate hit normal.
+ * To optimize brush detection speed this doesn't calculate hit normal.
*/
static void mesh_tris_nearest_point_dp(void *userdata, int index, const float co[3], BVHTreeNearest *nearest)
{
@@ -3407,7 +3412,7 @@ static void dynamicPaint_mixPaintColors(
/* mix wetness and alpha depending on selected alpha mode */
if (paintFlags & MOD_DPAINT_ABS_ALPHA) {
- /* update values to the brush level unless theyre higher already */
+ /* update values to the brush level unless they're higher already */
CLAMP_MIN(pPoint->e_color[3], paintAlpha);
CLAMP_MIN(pPoint->wetness, paintWetness);
}
@@ -3641,7 +3646,7 @@ static void dynamicPaint_brushMeshCalculateVelocity(
Object *ob, DynamicPaintBrushSettings *brush, Vec3f **brushVel, float timescale)
{
float prev_obmat[4][4];
- DerivedMesh *dm_p, *dm_c;
+ Mesh *mesh_p, *mesh_c;
MVert *mvert_p, *mvert_c;
int numOfVerts_p, numOfVerts_c;
@@ -3655,26 +3660,26 @@ static void dynamicPaint_brushMeshCalculateVelocity(
prev_fra = cur_fra - 1;
}
- /* previous frame dm */
+ /* previous frame mesh */
scene->r.cfra = prev_fra;
scene->r.subframe = prev_sfra;
BKE_object_modifier_update_subframe(
depsgraph, scene, ob, true, SUBFRAME_RECURSION, BKE_scene_frame_get(scene), eModifierType_DynamicPaint);
- dm_p = CDDM_copy(brush->dm);
- numOfVerts_p = dm_p->getNumVerts(dm_p);
- mvert_p = dm_p->getVertArray(dm_p);
+ mesh_p = BKE_mesh_copy_for_eval(brush->mesh, false);
+ numOfVerts_p = mesh_p->totvert;
+ mvert_p = mesh_p->mvert;
copy_m4_m4(prev_obmat, ob->obmat);
- /* current frame dm */
+ /* current frame mesh */
scene->r.cfra = cur_fra;
scene->r.subframe = cur_sfra;
BKE_object_modifier_update_subframe(
depsgraph, scene, ob, true, SUBFRAME_RECURSION, BKE_scene_frame_get(scene), eModifierType_DynamicPaint);
- dm_c = brush->dm;
- numOfVerts_c = dm_c->getNumVerts(dm_c);
- mvert_c = dm_p->getVertArray(dm_c);
+ mesh_c = brush->mesh;
+ numOfVerts_c = mesh_c->totvert;
+ mvert_c = mesh_c->mvert;
(*brushVel) = (struct Vec3f *) MEM_mallocN(numOfVerts_c * sizeof(Vec3f), "Dynamic Paint brush velocity");
if (!(*brushVel))
@@ -3698,7 +3703,7 @@ static void dynamicPaint_brushMeshCalculateVelocity(
dynamic_paint_brush_velocity_compute_cb,
&settings);
- dm_p->release(dm_p);
+ BKE_id_free(NULL, mesh_p);
}
/* calculate velocity for object center point */
@@ -3718,14 +3723,14 @@ static void dynamicPaint_brushObjectCalculateVelocity(
prev_fra = cur_fra - 1;
}
- /* previous frame dm */
+ /* previous frame mesh */
scene->r.cfra = prev_fra;
scene->r.subframe = prev_sfra;
BKE_object_modifier_update_subframe(
depsgraph, scene, ob, false, SUBFRAME_RECURSION, BKE_scene_frame_get(scene), eModifierType_DynamicPaint);
copy_m4_m4(prev_obmat, ob->obmat);
- /* current frame dm */
+ /* current frame mesh */
scene->r.cfra = cur_fra;
scene->r.subframe = cur_sfra;
BKE_object_modifier_update_subframe(
@@ -3747,7 +3752,7 @@ typedef struct DynamicPaintPaintData {
const float timescale;
const int c_index;
- DerivedMesh *dm;
+ Mesh *mesh;
const MVert *mvert;
const MLoop *mloop;
const MLoopTri *mlooptri;
@@ -4005,7 +4010,7 @@ static void dynamic_paint_paint_mesh_cell_point_cb_ex(
interp_weights_tri_v3(weights, mvert[v1].co, mvert[v2].co, mvert[v3].co, hitCoord);
/* simple check based on brush surface velocity,
- * todo: perhaps implement something that handles volume movement as well */
+ * todo: perhaps implement something that handles volume movement as well. */
/* interpolate vertex speed vectors to get hit point velocity */
interp_v3_v3v3v3(brushPointVelocity,
@@ -4097,7 +4102,7 @@ static int dynamicPaint_paintMesh(Depsgraph *depsgraph, DynamicPaintSurface *sur
{
PaintSurfaceData *sData = surface->data;
PaintBakeData *bData = sData->bData;
- DerivedMesh *dm = NULL;
+ Mesh *mesh = NULL;
Vec3f *brushVelocity = NULL;
MVert *mvert = NULL;
const MLoopTri *mlooptri = NULL;
@@ -4106,7 +4111,7 @@ static int dynamicPaint_paintMesh(Depsgraph *depsgraph, DynamicPaintSurface *sur
if (brush->flags & MOD_DPAINT_USES_VELOCITY)
dynamicPaint_brushMeshCalculateVelocity(depsgraph, scene, brushOb, brush, &brushVelocity, timescale);
- if (!brush->dm)
+ if (!brush->mesh)
return 0;
{
@@ -4118,11 +4123,11 @@ static int dynamicPaint_paintMesh(Depsgraph *depsgraph, DynamicPaintSurface *sur
Bounds3D mesh_bb = {{0}};
VolumeGrid *grid = bData->grid;
- dm = CDDM_copy(brush->dm);
- mvert = dm->getVertArray(dm);
- mlooptri = dm->getLoopTriArray(dm);
- mloop = dm->getLoopArray(dm);
- numOfVerts = dm->getNumVerts(dm);
+ mesh = BKE_mesh_copy_for_eval(brush->mesh, false);
+ mvert = mesh->mvert;
+ mlooptri = BKE_mesh_runtime_looptri_ensure(mesh);
+ mloop = mesh->mloop;
+ numOfVerts = mesh->totvert;
/* Transform collider vertices to global space
* (Faster than transforming per surface point
@@ -4153,7 +4158,7 @@ static int dynamicPaint_paintMesh(Depsgraph *depsgraph, DynamicPaintSurface *sur
/* check bounding box collision */
if (grid && meshBrush_boundsIntersect(&grid->grid_bounds, &mesh_bb, brush, brush_radius)) {
/* Build a bvh tree from transformed vertices */
- if (bvhtree_from_mesh_get(&treeData, dm, BVHTREE_FROM_LOOPTRI, 4)) {
+ if (BKE_bvhtree_from_mesh_get(&treeData, mesh, BVHTREE_FROM_LOOPTRI, 4)) {
int c_index;
int total_cells = grid->dim[0] * grid->dim[1] * grid->dim[2];
@@ -4171,7 +4176,7 @@ static int dynamicPaint_paintMesh(Depsgraph *depsgraph, DynamicPaintSurface *sur
.surface = surface,
.brush = brush, .brushOb = brushOb,
.scene = scene, .timescale = timescale, .c_index = c_index,
- .dm = dm, .mvert = mvert, .mloop = mloop, .mlooptri = mlooptri,
+ .mesh = mesh, .mvert = mvert, .mloop = mloop, .mlooptri = mlooptri,
.brush_radius = brush_radius, .avg_brushNor = avg_brushNor, .brushVelocity = brushVelocity,
.treeData = &treeData
};
@@ -4187,7 +4192,7 @@ static int dynamicPaint_paintMesh(Depsgraph *depsgraph, DynamicPaintSurface *sur
}
/* free bvh tree */
free_bvhtree_from_mesh(&treeData);
- dm->release(dm);
+ BKE_id_free(NULL, mesh);
}
@@ -4587,7 +4592,7 @@ static int dynamicPaint_paintSinglePoint(
if (brush->flags & MOD_DPAINT_USES_VELOCITY)
dynamicPaint_brushObjectCalculateVelocity(depsgraph, scene, brushOb, &brushVel, timescale);
- const MVert *mvert = brush->dm->getVertArray(brush->dm);
+ const MVert *mvert = brush->mesh->mvert;
/*
* Loop through every surface point
@@ -4717,7 +4722,7 @@ static void surface_determineForceTargetPoints(
const float closest_dot = dot_v3v3(bNeighs[n_index].dir, bNeighs[closest_id[0]].dir);
/* only accept neighbor at "other side" of the first one in relation to force dir
- * so make sure angle between this and closest neigh is greater than first angle */
+ * so make sure angle between this and closest neigh is greater than first angle. */
if (dir_dot > closest_d[1] && closest_dot < closest_d[0] && dir_dot > 0.0f) {
closest_d[1] = dir_dot;
closest_id[1] = n_index;
@@ -4734,7 +4739,7 @@ static void surface_determineForceTargetPoints(
float temp;
/* project force vector on the plane determined by these two neighbor points
- * and calculate relative force angle from it*/
+ * and calculate relative force angle from it. */
cross_v3_v3v3(tangent, bNeighs[closest_id[0]].dir, bNeighs[closest_id[1]].dir);
normalize_v3(tangent);
force_intersect = dot_v3v3(force, tangent);
@@ -4884,7 +4889,7 @@ static void dynamic_paint_prepare_effect_cb(
/* if global gravity is enabled, add it too */
if (scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY)
/* also divide by 10 to about match default grav
- * with default force strength (1.0) */
+ * with default force strength (1.0). */
madd_v3_v3fl(forc, scene->physics_settings.gravity,
surface->effector_weights->global_gravity * surface->effector_weights->weight[0] / 10.f);
@@ -4946,7 +4951,7 @@ static int dynamicPaint_prepareEffectStep(
}
/* Get number of required steps using average point distance
- * so that just a few ultra close pixels wont up substeps to max */
+ * so that just a few ultra close pixels wont up substeps to max. */
/* adjust number of required substep by fastest active effect */
if (surface->effect & MOD_DPAINT_EFFECT_DO_SPREAD)
@@ -5047,7 +5052,7 @@ static void dynamic_paint_effect_shrink_cb(
totalAlpha += pPoint_prev->e_color[3];
/* Check if neighboring point has lower alpha,
- * if so, decrease this point's alpha as well*/
+ * if so, decrease this point's alpha as well. */
if (pPoint->color[3] <= 0.0f && pPoint->e_color[3] <= 0.0f && pPoint->wetness <= 0.0f)
continue;
@@ -5432,7 +5437,7 @@ static void dynamic_paint_wave_step_cb(
}
if (data->reset_wave) {
- /* if there wasnt any brush intersection, clear isect height */
+ /* if there wasn't any brush intersection, clear isect height */
if (wPoint->state == DPAINT_WAVE_NONE) {
wPoint->brush_isect = 0.0f;
}
@@ -5558,7 +5563,7 @@ static void dynamic_paint_surface_pre_step_cb(
/* now calculate new alpha for dry layer that keeps final blended color unchanged */
pPoint->color[3] = (f_color[3] - pPoint->e_color[3]) / (1.0f - pPoint->e_color[3]);
/* for each rgb component, calculate a new dry layer color that keeps the final blend color
- * with these new alpha values. (wet layer color doesnt change)*/
+ * with these new alpha values. (wet layer color doesn't change)*/
if (pPoint->color[3]) {
for (i = 0; i < 3; i++) {
pPoint->color[i] = (f_color[i] * f_color[3] - pPoint->e_color[i] * pPoint->e_color[3]) /
@@ -5606,10 +5611,10 @@ static bool dynamicPaint_surfaceHasMoved(DynamicPaintSurface *surface, Object *o
{
PaintSurfaceData *sData = surface->data;
PaintBakeData *bData = sData->bData;
- DerivedMesh *dm = surface->canvas->dm;
- MVert *mvert = dm->getVertArray(dm);
+ Mesh *mesh = surface->canvas->mesh;
+ MVert *mvert = mesh->mvert;
- int numOfVerts = dm->getNumVerts(dm);
+ int numOfVerts = mesh->totvert;
int i;
if (!bData->prev_verts)
@@ -5754,15 +5759,15 @@ static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, Depsgraph
{
PaintSurfaceData *sData = surface->data;
PaintBakeData *bData = sData->bData;
- DerivedMesh *dm = surface->canvas->dm;
+ Mesh *mesh = surface->canvas->mesh;
int index;
bool new_bdata = false;
const bool do_velocity_data = ((surface->effect & MOD_DPAINT_EFFECT_DO_DRIP) ||
(surface_getBrushFlags(surface, depsgraph) & BRUSH_USES_VELOCITY));
const bool do_accel_data = (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP) != 0;
- int canvasNumOfVerts = dm->getNumVerts(dm);
- MVert *mvert = dm->getVertArray(dm);
+ int canvasNumOfVerts = mesh->totvert;
+ MVert *mvert = mesh->mvert;
Vec3f *canvas_verts;
if (bData) {
@@ -6031,7 +6036,7 @@ int dynamicPaint_calculateFrame(
/* apply previous displace on derivedmesh if incremental surface */
if (surface->flags & MOD_DPAINT_DISP_INCREMENTAL)
- dynamicPaint_applySurfaceDisplace(surface, surface->canvas->dm);
+ dynamicPaint_applySurfaceDisplace(surface, surface->canvas->mesh);
/* update bake data */
dynamicPaint_generateBakeData(surface, depsgraph, cObject);
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c
index 87d93db640d..e6873e66c91 100644
--- a/source/blender/blenkernel/intern/editderivedmesh.c
+++ b/source/blender/blenkernel/intern/editderivedmesh.c
@@ -51,8 +51,10 @@
#include "BKE_cdderivedmesh.h"
#include "BKE_deform.h"
#include "BKE_mesh.h"
+#include "BKE_mesh_iterators.h"
#include "BKE_editmesh.h"
#include "BKE_editmesh_bvh.h"
+#include "BKE_editmesh_cache.h"
#include "BKE_editmesh_tangent.h"
#include "DNA_scene_types.h"
@@ -61,986 +63,6 @@
#include "MEM_guardedalloc.h"
-typedef struct EditDerivedBMesh {
- DerivedMesh dm;
-
- BMEditMesh *em;
-
- EditMeshData emd;
-} EditDerivedBMesh;
-
-/* -------------------------------------------------------------------- */
-/* Lazy initialize datastructures */
-
-static void emDM_ensurePolyNormals(EditDerivedBMesh *bmdm);
-
-static void emDM_ensureVertNormals(EditDerivedBMesh *bmdm)
-{
- if (bmdm->emd.vertexCos && (bmdm->emd.vertexNos == NULL)) {
-
- BMesh *bm = bmdm->em->bm;
- const float (*vertexCos)[3], (*polyNos)[3];
- float (*vertexNos)[3];
-
- /* calculate vertex normals from poly normals */
- emDM_ensurePolyNormals(bmdm);
-
- BM_mesh_elem_index_ensure(bm, BM_FACE);
-
- polyNos = bmdm->emd.polyNos;
- vertexCos = bmdm->emd.vertexCos;
- vertexNos = MEM_callocN(sizeof(*vertexNos) * bm->totvert, __func__);
-
- BM_verts_calc_normal_vcos(bm, polyNos, vertexCos, vertexNos);
-
- bmdm->emd.vertexNos = (const float (*)[3])vertexNos;
- }
-}
-
-static void emDM_ensurePolyNormals(EditDerivedBMesh *bmdm)
-{
- if (bmdm->emd.vertexCos && (bmdm->emd.polyNos == NULL)) {
- BMesh *bm = bmdm->em->bm;
- const float (*vertexCos)[3];
- float (*polyNos)[3];
-
- BMFace *efa;
- BMIter fiter;
- int i;
-
- BM_mesh_elem_index_ensure(bm, BM_VERT);
-
- polyNos = MEM_mallocN(sizeof(*polyNos) * bm->totface, __func__);
-
- vertexCos = bmdm->emd.vertexCos;
-
- BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
- BM_elem_index_set(efa, i); /* set_inline */
- BM_face_calc_normal_vcos(bm, efa, polyNos[i], vertexCos);
- }
- bm->elem_index_dirty &= ~BM_FACE;
-
- bmdm->emd.polyNos = (const float (*)[3])polyNos;
- }
-}
-
-static void emDM_ensurePolyCenters(EditDerivedBMesh *bmdm)
-{
- if (bmdm->emd.polyCos == NULL) {
- BMesh *bm = bmdm->em->bm;
- float (*polyCos)[3];
-
- BMFace *efa;
- BMIter fiter;
- int i;
-
- polyCos = MEM_mallocN(sizeof(*polyCos) * bm->totface, __func__);
-
- if (bmdm->emd.vertexCos) {
- const float (*vertexCos)[3];
- vertexCos = bmdm->emd.vertexCos;
-
- BM_mesh_elem_index_ensure(bm, BM_VERT);
-
- BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
- BM_face_calc_center_mean_vcos(bm, efa, polyCos[i], vertexCos);
- }
- }
- else {
- BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
- BM_face_calc_center_mean(efa, polyCos[i]);
- }
- }
-
- bmdm->emd.polyCos = (const float (*)[3])polyCos;
- }
-}
-
-static void emDM_calcNormals(DerivedMesh *dm)
-{
- /* Nothing to do: normals are already calculated and stored on the
- * BMVerts and BMFaces */
- dm->dirty &= ~DM_DIRTY_NORMALS;
-}
-
-static void emDM_calcLoopNormalsSpaceArray(
- DerivedMesh *dm, const bool use_split_normals, const float split_angle, MLoopNorSpaceArray *r_lnors_spacearr);
-
-static void emDM_calcLoopNormals(DerivedMesh *dm, const bool use_split_normals, const float split_angle)
-{
- emDM_calcLoopNormalsSpaceArray(dm, use_split_normals, split_angle, NULL);
-}
-
-/* #define DEBUG_CLNORS */
-
-static void emDM_calcLoopNormalsSpaceArray(
- DerivedMesh *dm, const bool use_split_normals, const float split_angle, MLoopNorSpaceArray *r_lnors_spacearr)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- const float (*vertexCos)[3], (*vertexNos)[3], (*polyNos)[3];
- float (*loopNos)[3];
- short (*clnors_data)[2];
- int cd_loop_clnors_offset;
-
- /* calculate loop normals from poly and vertex normals */
- emDM_ensureVertNormals(bmdm);
- emDM_ensurePolyNormals(bmdm);
- dm->dirty &= ~DM_DIRTY_NORMALS;
-
- vertexCos = bmdm->emd.vertexCos;
- vertexNos = bmdm->emd.vertexNos;
- polyNos = bmdm->emd.polyNos;
-
- loopNos = dm->getLoopDataArray(dm, CD_NORMAL);
- if (!loopNos) {
- DM_add_loop_layer(dm, CD_NORMAL, CD_CALLOC, NULL);
- loopNos = dm->getLoopDataArray(dm, CD_NORMAL);
- }
-
- /* We can have both, give priority to dm's data, and fallback to bm's ones. */
- clnors_data = dm->getLoopDataArray(dm, CD_CUSTOMLOOPNORMAL);
- cd_loop_clnors_offset = clnors_data ? -1 : CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL);
-
- BM_loops_calc_normal_vcos(bm, vertexCos, vertexNos, polyNos, use_split_normals, split_angle, loopNos,
- r_lnors_spacearr, clnors_data, cd_loop_clnors_offset, false);
-#ifdef DEBUG_CLNORS
- if (r_lnors_spacearr) {
- int i;
- for (i = 0; i < numLoops; i++) {
- if (r_lnors_spacearr->lspacearr[i]->ref_alpha != 0.0f) {
- LinkNode *loops = r_lnors_spacearr->lspacearr[i]->loops;
- printf("Loop %d uses lnor space %p:\n", i, r_lnors_spacearr->lspacearr[i]);
- print_v3("\tfinal lnor:", loopNos[i]);
- print_v3("\tauto lnor:", r_lnors_spacearr->lspacearr[i]->vec_lnor);
- print_v3("\tref_vec:", r_lnors_spacearr->lspacearr[i]->vec_ref);
- printf("\talpha: %f\n\tbeta: %f\n\tloops: %p\n", r_lnors_spacearr->lspacearr[i]->ref_alpha,
- r_lnors_spacearr->lspacearr[i]->ref_beta, r_lnors_spacearr->lspacearr[i]->loops);
- printf("\t\t(shared with loops");
- while (loops) {
- printf(" %d", GET_INT_FROM_POINTER(loops->link));
- loops = loops->next;
- }
- printf(")\n");
- }
- else {
- printf("Loop %d has no lnor space\n", i);
- }
- }
- }
-#endif
-}
-
-static void emDM_calc_loop_tangents(
- DerivedMesh *dm, bool calc_active_tangent,
- const char (*tangent_names)[MAX_NAME], int tangent_names_len)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMEditMesh *em = bmdm->em;
-
- if (CustomData_number_of_layers(&em->bm->ldata, CD_MLOOPUV) == 0) {
- return;
- }
-
- const float (*poly_normals)[3] = bmdm->emd.polyNos;
- const float (*loop_normals)[3] = CustomData_get_layer(&dm->loopData, CD_NORMAL);
- const float (*vert_orco)[3] = dm->getVertDataArray(dm, CD_ORCO); /* can be NULL */
- BKE_editmesh_loop_tangent_calc(
- em, calc_active_tangent,
- tangent_names, tangent_names_len,
- poly_normals, loop_normals,
- vert_orco,
- &dm->loopData, dm->numLoopData,
- &dm->tangent_mask);
-}
-
-
-static void emDM_recalcTessellation(DerivedMesh *UNUSED(dm))
-{
- /* do nothing */
-}
-
-static void emDM_recalcLoopTri(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMLoop *(*looptris)[3] = bmdm->em->looptris;
- MLoopTri *mlooptri;
- const int tottri = bmdm->em->tottri;
- int i;
-
- DM_ensure_looptri_data(dm);
- mlooptri = dm->looptris.array_wip;
-
- BLI_assert(tottri == 0 || mlooptri != NULL);
- BLI_assert(poly_to_tri_count(dm->numPolyData, dm->numLoopData) == dm->looptris.num);
- BLI_assert(tottri == dm->looptris.num);
-
- BM_mesh_elem_index_ensure(bmdm->em->bm, BM_FACE | BM_LOOP);
-
- for (i = 0; i < tottri; i++) {
- BMLoop **ltri = looptris[i];
- MLoopTri *lt = &mlooptri[i];
-
- ARRAY_SET_ITEMS(
- lt->tri,
- BM_elem_index_get(ltri[0]),
- BM_elem_index_get(ltri[1]),
- BM_elem_index_get(ltri[2]));
- lt->poly = BM_elem_index_get(ltri[0]->f);
- }
-
- BLI_assert(dm->looptris.array == NULL);
- atomic_cas_ptr((void **)&dm->looptris.array, dm->looptris.array, dm->looptris.array_wip);
- dm->looptris.array_wip = NULL;
-}
-
-static void emDM_foreachMappedVert(
- DerivedMesh *dm,
- void (*func)(void *userData, int index, const float co[3], const float no_f[3], const short no_s[3]),
- void *userData,
- DMForeachFlag flag)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMVert *eve;
- BMIter iter;
- int i;
-
- if (bmdm->emd.vertexCos) {
- const float (*vertexCos)[3] = bmdm->emd.vertexCos;
- const float (*vertexNos)[3];
-
- if (flag & DM_FOREACH_USE_NORMAL) {
- emDM_ensureVertNormals(bmdm);
- vertexNos = bmdm->emd.vertexNos;
- }
- else {
- vertexNos = NULL;
- }
-
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- const float *no = (flag & DM_FOREACH_USE_NORMAL) ? vertexNos[i] : NULL;
- func(userData, i, vertexCos[i], no, NULL);
- }
- }
- else {
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- const float *no = (flag & DM_FOREACH_USE_NORMAL) ? eve->no : NULL;
- func(userData, i, eve->co, no, NULL);
- }
- }
-}
-static void emDM_foreachMappedEdge(
- DerivedMesh *dm,
- void (*func)(void *userData, int index, const float v0co[3], const float v1co[3]),
- void *userData)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMEdge *eed;
- BMIter iter;
- int i;
-
- if (bmdm->emd.vertexCos) {
-
- BM_mesh_elem_index_ensure(bm, BM_VERT);
-
- BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) {
- func(userData, i,
- bmdm->emd.vertexCos[BM_elem_index_get(eed->v1)],
- bmdm->emd.vertexCos[BM_elem_index_get(eed->v2)]);
- }
- }
- else {
- BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) {
- func(userData, i, eed->v1->co, eed->v2->co);
- }
- }
-}
-
-static void emDM_foreachMappedLoop(
- DerivedMesh *dm,
- void (*func)(void *userData, int vertex_index, int face_index, const float co[3], const float no[3]),
- void *userData,
- DMForeachFlag flag)
-{
- /* We can't use dm->getLoopDataLayout(dm) here, we want to always access dm->loopData, EditDerivedBMesh would
- * return loop data from bmesh itself. */
- const float (*lnors)[3] = (flag & DM_FOREACH_USE_NORMAL) ? DM_get_loop_data_layer(dm, CD_NORMAL) : NULL;
-
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMFace *efa;
- BMIter iter;
-
- const float (*vertexCos)[3] = bmdm->emd.vertexCos;
- int f_idx;
-
- BM_mesh_elem_index_ensure(bm, BM_VERT);
-
- BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, f_idx) {
- BMLoop *l_iter, *l_first;
-
- l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
- do {
- const BMVert *eve = l_iter->v;
- const int v_idx = BM_elem_index_get(eve);
- const float *no = lnors ? *lnors++ : NULL;
- func(userData, v_idx, f_idx, vertexCos ? vertexCos[v_idx] : eve->co, no);
- } while ((l_iter = l_iter->next) != l_first);
- }
-}
-
-static void emDM_foreachMappedFaceCenter(
- DerivedMesh *dm,
- void (*func)(void *userData, int index, const float co[3], const float no[3]),
- void *userData,
- DMForeachFlag flag)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- const float (*polyNos)[3];
- const float (*polyCos)[3];
- BMFace *efa;
- BMIter iter;
- int i;
-
- emDM_ensurePolyCenters(bmdm);
- polyCos = bmdm->emd.polyCos; /* always set */
-
- if (flag & DM_FOREACH_USE_NORMAL) {
- emDM_ensurePolyNormals(bmdm);
- polyNos = bmdm->emd.polyNos; /* maybe NULL */
- }
- else {
- polyNos = NULL;
- }
-
- if (polyNos) {
- BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) {
- const float *no = polyNos[i];
- func(userData, i, polyCos[i], no);
- }
- }
- else {
- BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) {
- const float *no = (flag & DM_FOREACH_USE_NORMAL) ? efa->no : NULL;
- func(userData, i, polyCos[i], no);
- }
- }
-}
-
-static void emDM_getMinMax(DerivedMesh *dm, float r_min[3], float r_max[3])
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMVert *eve;
- BMIter iter;
- int i;
-
- if (bm->totvert) {
- if (bmdm->emd.vertexCos) {
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- minmax_v3v3_v3(r_min, r_max, bmdm->emd.vertexCos[i]);
- }
- }
- else {
- BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
- minmax_v3v3_v3(r_min, r_max, eve->co);
- }
- }
- }
- else {
- zero_v3(r_min);
- zero_v3(r_max);
- }
-}
-static int emDM_getNumVerts(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return bmdm->em->bm->totvert;
-}
-
-static int emDM_getNumEdges(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return bmdm->em->bm->totedge;
-}
-
-static int emDM_getNumTessFaces(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return bmdm->em->tottri;
-}
-
-static int emDM_getNumLoops(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return bmdm->em->bm->totloop;
-}
-
-static int emDM_getNumPolys(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return bmdm->em->bm->totface;
-}
-
-static void bmvert_to_mvert(BMesh *bm, BMVert *ev, MVert *r_vert)
-{
- const float *f;
-
- copy_v3_v3(r_vert->co, ev->co);
-
- normal_float_to_short_v3(r_vert->no, ev->no);
-
- r_vert->flag = BM_vert_flag_to_mflag(ev);
-
- if ((f = CustomData_bmesh_get(&bm->vdata, ev->head.data, CD_BWEIGHT))) {
- r_vert->bweight = (unsigned char)((*f) * 255.0f);
- }
-}
-
-static void emDM_getVert(DerivedMesh *dm, int index, MVert *r_vert)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMVert *ev;
-
- if (UNLIKELY(index < 0 || index >= bm->totvert)) {
- BLI_assert(!"error in emDM_getVert");
- return;
- }
-
- BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
- ev = bm->vtable[index]; /* should be BM_vert_at_index() */
- // ev = BM_vert_at_index(bm, index); /* warning, does list loop, _not_ ideal */
-
- bmvert_to_mvert(bm, ev, r_vert);
- if (bmdm->emd.vertexCos)
- copy_v3_v3(r_vert->co, bmdm->emd.vertexCos[index]);
-}
-
-static void emDM_getVertCo(DerivedMesh *dm, int index, float r_co[3])
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
-
- if (UNLIKELY(index < 0 || index >= bm->totvert)) {
- BLI_assert(!"error in emDM_getVertCo");
- return;
- }
-
- if (bmdm->emd.vertexCos) {
- copy_v3_v3(r_co, bmdm->emd.vertexCos[index]);
- }
- else {
- BMVert *ev;
-
- BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
- ev = bm->vtable[index]; /* should be BM_vert_at_index() */
- // ev = BM_vert_at_index(bm, index); /* warning, does list loop, _not_ ideal */
- copy_v3_v3(r_co, ev->co);
- }
-}
-
-static void emDM_getVertNo(DerivedMesh *dm, int index, float r_no[3])
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
-
- if (UNLIKELY(index < 0 || index >= bm->totvert)) {
- BLI_assert(!"error in emDM_getVertNo");
- return;
- }
-
-
- if (bmdm->emd.vertexCos) {
- emDM_ensureVertNormals(bmdm);
- copy_v3_v3(r_no, bmdm->emd.vertexNos[index]);
- }
- else {
- BMVert *ev;
-
- BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
- ev = bm->vtable[index]; /* should be BM_vert_at_index() */
- // ev = BM_vert_at_index(bm, index); /* warning, does list loop, _not_ ideal */
- copy_v3_v3(r_no, ev->no);
- }
-}
-
-static void emDM_getPolyNo(DerivedMesh *dm, int index, float r_no[3])
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
-
- if (UNLIKELY(index < 0 || index >= bm->totface)) {
- BLI_assert(!"error in emDM_getPolyNo");
- return;
- }
-
- if (bmdm->emd.vertexCos) {
- emDM_ensurePolyNormals(bmdm);
- copy_v3_v3(r_no, bmdm->emd.polyNos[index]);
- }
- else {
- BMFace *efa;
-
- BLI_assert((bm->elem_table_dirty & BM_FACE) == 0);
- efa = bm->ftable[index]; /* should be BM_vert_at_index() */
- // efa = BM_face_at_index(bm, index); /* warning, does list loop, _not_ ideal */
- copy_v3_v3(r_no, efa->no);
- }
-}
-
-static void emDM_getEdge(DerivedMesh *dm, int index, MEdge *r_edge)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMEdge *e;
- const float *f;
-
- if (UNLIKELY(index < 0 || index >= bm->totedge)) {
- BLI_assert(!"error in emDM_getEdge");
- return;
- }
-
- BLI_assert((bm->elem_table_dirty & BM_EDGE) == 0);
- e = bm->etable[index]; /* should be BM_edge_at_index() */
- // e = BM_edge_at_index(bm, index); /* warning, does list loop, _not_ ideal */
-
- r_edge->flag = BM_edge_flag_to_mflag(e);
-
- r_edge->v1 = BM_elem_index_get(e->v1);
- r_edge->v2 = BM_elem_index_get(e->v2);
-
- if ((f = CustomData_bmesh_get(&bm->edata, e->head.data, CD_BWEIGHT))) {
- r_edge->bweight = (unsigned char)((*f) * 255.0f);
- }
- if ((f = CustomData_bmesh_get(&bm->edata, e->head.data, CD_CREASE))) {
- r_edge->crease = (unsigned char)((*f) * 255.0f);
- }
-}
-
-static void emDM_getTessFace(DerivedMesh *dm, int index, MFace *r_face)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMFace *ef;
- BMLoop **ltri;
-
- if (UNLIKELY(index < 0 || index >= bmdm->em->tottri)) {
- BLI_assert(!"error in emDM_getTessFace");
- return;
- }
-
- ltri = bmdm->em->looptris[index];
-
- ef = ltri[0]->f;
-
- r_face->mat_nr = (unsigned char) ef->mat_nr;
- r_face->flag = BM_face_flag_to_mflag(ef);
-
- r_face->v1 = BM_elem_index_get(ltri[0]->v);
- r_face->v2 = BM_elem_index_get(ltri[1]->v);
- r_face->v3 = BM_elem_index_get(ltri[2]->v);
- r_face->v4 = 0;
-
- test_index_face(r_face, NULL, 0, 3);
-}
-
-static void emDM_copyVertArray(DerivedMesh *dm, MVert *r_vert)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMVert *eve;
- BMIter iter;
- const int cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT);
-
- if (bmdm->emd.vertexCos) {
- int i;
-
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- copy_v3_v3(r_vert->co, bmdm->emd.vertexCos[i]);
- normal_float_to_short_v3(r_vert->no, eve->no);
- r_vert->flag = BM_vert_flag_to_mflag(eve);
-
- r_vert->bweight = (cd_vert_bweight_offset != -1) ? BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset) : 0;
-
- r_vert++;
- }
- }
- else {
- BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
- copy_v3_v3(r_vert->co, eve->co);
- normal_float_to_short_v3(r_vert->no, eve->no);
- r_vert->flag = BM_vert_flag_to_mflag(eve);
-
- r_vert->bweight = (cd_vert_bweight_offset != -1) ? BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset) : 0;
-
- r_vert++;
- }
- }
-}
-
-static void emDM_copyEdgeArray(DerivedMesh *dm, MEdge *r_edge)
-{
- BMesh *bm = ((EditDerivedBMesh *)dm)->em->bm;
- BMEdge *eed;
- BMIter iter;
-
- const int cd_edge_bweight_offset = CustomData_get_offset(&bm->edata, CD_BWEIGHT);
- const int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
-
- BM_mesh_elem_index_ensure(bm, BM_VERT);
-
- BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
- r_edge->v1 = BM_elem_index_get(eed->v1);
- r_edge->v2 = BM_elem_index_get(eed->v2);
-
- r_edge->flag = BM_edge_flag_to_mflag(eed);
-
- r_edge->crease = (cd_edge_crease_offset != -1) ? BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_crease_offset) : 0;
- r_edge->bweight = (cd_edge_bweight_offset != -1) ? BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_bweight_offset) : 0;
-
- r_edge++;
- }
-}
-
-static void emDM_copyTessFaceArray(DerivedMesh *dm, MFace *r_face)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- struct BMLoop *(*looptris)[3] = bmdm->em->looptris;
- BMFace *ef;
- int i;
-
- BM_mesh_elem_index_ensure(bm, BM_VERT);
-
- for (i = 0; i < bmdm->em->tottri; i++, r_face++) {
- BMLoop **ltri = looptris[i];
- ef = ltri[0]->f;
-
- r_face->mat_nr = (unsigned char) ef->mat_nr;
-
- r_face->flag = BM_face_flag_to_mflag(ef);
- r_face->edcode = 0;
-
- r_face->v1 = BM_elem_index_get(ltri[0]->v);
- r_face->v2 = BM_elem_index_get(ltri[1]->v);
- r_face->v3 = BM_elem_index_get(ltri[2]->v);
- r_face->v4 = 0;
-
- test_index_face(r_face, NULL, 0, 3);
- }
-}
-
-static void emDM_copyLoopArray(DerivedMesh *dm, MLoop *r_loop)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMIter iter;
- BMFace *efa;
-
- BM_mesh_elem_index_ensure(bm, BM_VERT | BM_EDGE);
-
- BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- BMLoop *l_iter, *l_first;
- l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
- do {
- r_loop->v = BM_elem_index_get(l_iter->v);
- r_loop->e = BM_elem_index_get(l_iter->e);
- r_loop++;
- } while ((l_iter = l_iter->next) != l_first);
- }
-}
-
-static void emDM_copyPolyArray(DerivedMesh *dm, MPoly *r_poly)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMIter iter;
- BMFace *efa;
- int i;
-
- i = 0;
- BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- r_poly->flag = BM_face_flag_to_mflag(efa);
- r_poly->loopstart = i;
- r_poly->totloop = efa->len;
- r_poly->mat_nr = efa->mat_nr;
-
- r_poly++;
- i += efa->len;
- }
-}
-
-static void *emDM_getTessFaceDataArray(DerivedMesh *dm, int type)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- void *datalayer;
-
- datalayer = DM_get_tessface_data_layer(dm, type);
- if (datalayer)
- return datalayer;
-
- /* layers are store per face for editmesh, we convert to a temporary
- * data layer array in the derivedmesh when these are requested */
- if (type == CD_MTFACE || type == CD_MCOL) {
- const char *bmdata;
- char *data;
-
- bool has_type_source = CustomData_has_layer(&bm->ldata, (type == CD_MTFACE) ? CD_MLOOPUV : CD_MLOOPCOL);
-
- if (has_type_source) {
- /* offset = bm->pdata.layers[index].offset; */ /* UNUSED */
- BMLoop *(*looptris)[3] = bmdm->em->looptris;
- const int size = CustomData_sizeof(type);
- int i, j;
-
- DM_add_tessface_layer(dm, type, CD_CALLOC, NULL);
- const int index = CustomData_get_layer_index(&dm->faceData, type);
- dm->faceData.layers[index].flag |= CD_FLAG_TEMPORARY;
-
- data = datalayer = DM_get_tessface_data_layer(dm, type);
-
- if (type == CD_MTFACE) {
- const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
-
- for (i = 0; i < bmdm->em->tottri; i++, data += size) {
- for (j = 0; j < 3; j++) {
- // bmdata = CustomData_bmesh_get(&bm->ldata, looptris[i][j]->head.data, CD_MLOOPUV);
- bmdata = BM_ELEM_CD_GET_VOID_P(looptris[i][j], cd_loop_uv_offset);
- copy_v2_v2(((MTFace *)data)->uv[j], ((const MLoopUV *)bmdata)->uv);
- }
- }
- }
- else {
- const int cd_loop_color_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPCOL);
- for (i = 0; i < bmdm->em->tottri; i++, data += size) {
- for (j = 0; j < 3; j++) {
- // bmdata = CustomData_bmesh_get(&bm->ldata, looptris[i][j]->head.data, CD_MLOOPCOL);
- bmdata = BM_ELEM_CD_GET_VOID_P(looptris[i][j], cd_loop_color_offset);
- MESH_MLOOPCOL_TO_MCOL(((const MLoopCol *)bmdata), (((MCol *)data) + j));
- }
- }
- }
- }
- }
-
- /* Special handling for CD_TESSLOOPNORMAL, we generate it on demand as well. */
- if (type == CD_TESSLOOPNORMAL) {
- const float (*lnors)[3] = dm->getLoopDataArray(dm, CD_NORMAL);
-
- if (lnors) {
- BMLoop *(*looptris)[3] = bmdm->em->looptris;
- short (*tlnors)[4][3], (*tlnor)[4][3];
- int index, i, j;
-
- DM_add_tessface_layer(dm, type, CD_CALLOC, NULL);
- index = CustomData_get_layer_index(&dm->faceData, type);
- dm->faceData.layers[index].flag |= CD_FLAG_TEMPORARY;
-
- tlnor = tlnors = DM_get_tessface_data_layer(dm, type);
-
- BM_mesh_elem_index_ensure(bm, BM_LOOP);
-
- for (i = 0; i < bmdm->em->tottri; i++, tlnor++, looptris++) {
- for (j = 0; j < 3; j++) {
- normal_float_to_short_v3((*tlnor)[j], lnors[BM_elem_index_get((*looptris)[j])]);
- }
- }
- }
- }
-
- return datalayer;
-}
-
-static void emDM_getVertCos(DerivedMesh *dm, float (*r_cos)[3])
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMVert *eve;
- BMIter iter;
- int i;
-
- if (bmdm->emd.vertexCos) {
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- copy_v3_v3(r_cos[i], bmdm->emd.vertexCos[i]);
- }
- }
- else {
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- copy_v3_v3(r_cos[i], eve->co);
- }
- }
-}
-
-static void emDM_release(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- if (DM_release(dm)) {
- if (bmdm->emd.vertexCos) {
- MEM_freeN((void *)bmdm->emd.vertexCos);
- if (bmdm->emd.vertexNos) {
- MEM_freeN((void *)bmdm->emd.vertexNos);
- }
- if (bmdm->emd.polyNos) {
- MEM_freeN((void *)bmdm->emd.polyNos);
- }
- }
-
- if (bmdm->emd.polyCos) {
- MEM_freeN((void *)bmdm->emd.polyCos);
- }
-
- MEM_freeN(bmdm);
- }
-}
-
-static CustomData *bmDm_getVertDataLayout(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return &bmdm->em->bm->vdata;
-}
-
-static CustomData *bmDm_getEdgeDataLayout(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return &bmdm->em->bm->edata;
-}
-
-static CustomData *bmDm_getTessFaceDataLayout(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return &bmdm->dm.faceData;
-}
-
-static CustomData *bmDm_getLoopDataLayout(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return &bmdm->em->bm->ldata;
-}
-
-static CustomData *bmDm_getPolyDataLayout(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return &bmdm->em->bm->pdata;
-}
-
-/**
- * \note This may be called per-draw,
- * avoid allocating large arrays where possible and keep this a thin wrapper for #BMesh.
- */
-DerivedMesh *getEditDerivedBMesh(
- BMEditMesh *em, struct Object *UNUSED(ob),
- CustomDataMask data_mask,
- float (*vertexCos)[3])
-{
- EditDerivedBMesh *bmdm = MEM_callocN(sizeof(*bmdm), __func__);
- BMesh *bm = em->bm;
-
- bmdm->em = em;
-
- DM_init((DerivedMesh *)bmdm, DM_TYPE_EDITBMESH, bm->totvert,
- bm->totedge, em->tottri, bm->totloop, bm->totface);
-
- /* could also get from the objects mesh directly */
- bmdm->dm.cd_flag = BM_mesh_cd_flag_from_bmesh(bm);
-
- bmdm->dm.getVertCos = emDM_getVertCos;
- bmdm->dm.getMinMax = emDM_getMinMax;
-
- bmdm->dm.getVertDataLayout = bmDm_getVertDataLayout;
- bmdm->dm.getEdgeDataLayout = bmDm_getEdgeDataLayout;
- bmdm->dm.getTessFaceDataLayout = bmDm_getTessFaceDataLayout;
- bmdm->dm.getLoopDataLayout = bmDm_getLoopDataLayout;
- bmdm->dm.getPolyDataLayout = bmDm_getPolyDataLayout;
-
- bmdm->dm.getNumVerts = emDM_getNumVerts;
- bmdm->dm.getNumEdges = emDM_getNumEdges;
- bmdm->dm.getNumTessFaces = emDM_getNumTessFaces;
- bmdm->dm.getNumLoops = emDM_getNumLoops;
- bmdm->dm.getNumPolys = emDM_getNumPolys;
-
- bmdm->dm.getVert = emDM_getVert;
- bmdm->dm.getVertCo = emDM_getVertCo;
- bmdm->dm.getVertNo = emDM_getVertNo;
- bmdm->dm.getPolyNo = emDM_getPolyNo;
- bmdm->dm.getEdge = emDM_getEdge;
- bmdm->dm.getTessFace = emDM_getTessFace;
- bmdm->dm.copyVertArray = emDM_copyVertArray;
- bmdm->dm.copyEdgeArray = emDM_copyEdgeArray;
- bmdm->dm.copyTessFaceArray = emDM_copyTessFaceArray;
- bmdm->dm.copyLoopArray = emDM_copyLoopArray;
- bmdm->dm.copyPolyArray = emDM_copyPolyArray;
-
- bmdm->dm.getTessFaceDataArray = emDM_getTessFaceDataArray;
-
- bmdm->dm.calcNormals = emDM_calcNormals;
- bmdm->dm.calcLoopNormals = emDM_calcLoopNormals;
- bmdm->dm.calcLoopNormalsSpaceArray = emDM_calcLoopNormalsSpaceArray;
- bmdm->dm.calcLoopTangents = emDM_calc_loop_tangents;
- bmdm->dm.recalcTessellation = emDM_recalcTessellation;
- bmdm->dm.recalcLoopTri = emDM_recalcLoopTri;
-
- bmdm->dm.foreachMappedVert = emDM_foreachMappedVert;
- bmdm->dm.foreachMappedLoop = emDM_foreachMappedLoop;
- bmdm->dm.foreachMappedEdge = emDM_foreachMappedEdge;
- bmdm->dm.foreachMappedFaceCenter = emDM_foreachMappedFaceCenter;
-
- bmdm->dm.release = emDM_release;
-
- bmdm->emd.vertexCos = (const float (*)[3])vertexCos;
- bmdm->dm.deformedOnly = (vertexCos != NULL);
-
- const int cd_dvert_offset = (data_mask & CD_MASK_MDEFORMVERT) ?
- CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT) : -1;
-
- if (cd_dvert_offset != -1) {
- BMIter iter;
- BMVert *eve;
- int i;
-
- DM_add_vert_layer(&bmdm->dm, CD_MDEFORMVERT, CD_CALLOC, NULL);
-
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- DM_set_vert_data(&bmdm->dm, i, CD_MDEFORMVERT,
- BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset));
- }
- }
-
- const int cd_skin_offset = (data_mask & CD_MASK_MVERT_SKIN) ?
- CustomData_get_offset(&bm->vdata, CD_MVERT_SKIN) : -1;
-
- if (cd_skin_offset != -1) {
- BMIter iter;
- BMVert *eve;
- int i;
-
- DM_add_vert_layer(&bmdm->dm, CD_MVERT_SKIN, CD_CALLOC, NULL);
-
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- DM_set_vert_data(&bmdm->dm, i, CD_MVERT_SKIN,
- BM_ELEM_CD_GET_VOID_P(eve, cd_skin_offset));
- }
- }
-
- return (DerivedMesh *)bmdm;
-}
-
-
-
/* -------------------------------------------------------------------- */
/* StatVis Functions */
@@ -1418,18 +440,15 @@ static void statvis_calc_sharp(
}
void BKE_editmesh_statvis_calc(
- BMEditMesh *em, DerivedMesh *dm,
+ BMEditMesh *em, EditMeshData *emd,
const MeshStatVis *statvis)
{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BLI_assert(dm == NULL || dm->type == DM_TYPE_EDITBMESH);
-
switch (statvis->type) {
case SCE_STATVIS_OVERHANG:
{
BKE_editmesh_color_ensure(em, BM_FACE);
statvis_calc_overhang(
- em, bmdm ? bmdm->emd.polyNos : NULL,
+ em, emd ? emd->polyNos : NULL,
statvis->overhang_min / (float)M_PI,
statvis->overhang_max / (float)M_PI,
statvis->overhang_axis,
@@ -1441,7 +460,7 @@ void BKE_editmesh_statvis_calc(
const float scale = 1.0f / mat4_to_scale(em->ob->obmat);
BKE_editmesh_color_ensure(em, BM_FACE);
statvis_calc_thickness(
- em, bmdm ? bmdm->emd.vertexCos : NULL,
+ em, emd ? emd->vertexCos : NULL,
statvis->thickness_min * scale,
statvis->thickness_max * scale,
statvis->thickness_samples,
@@ -1452,7 +471,7 @@ void BKE_editmesh_statvis_calc(
{
BKE_editmesh_color_ensure(em, BM_FACE);
statvis_calc_intersect(
- em, bmdm ? bmdm->emd.vertexCos : NULL,
+ em, emd ? emd->vertexCos : NULL,
em->derivedFaceColor);
break;
}
@@ -1460,11 +479,12 @@ void BKE_editmesh_statvis_calc(
{
BKE_editmesh_color_ensure(em, BM_FACE);
- if (bmdm)
- emDM_ensurePolyNormals(bmdm);
+ if (emd) {
+ BKE_editmesh_cache_ensure_poly_normals(em, emd);
+ }
statvis_calc_distort(
- em, bmdm ? bmdm->emd.vertexCos : NULL, bmdm ? bmdm->emd.polyNos : NULL,
+ em, emd ? emd->vertexCos : NULL, emd ? emd->polyNos : NULL,
statvis->distort_min,
statvis->distort_max,
em->derivedFaceColor);
@@ -1474,7 +494,7 @@ void BKE_editmesh_statvis_calc(
{
BKE_editmesh_color_ensure(em, BM_VERT);
statvis_calc_sharp(
- em, bmdm ? bmdm->emd.vertexCos : NULL,
+ em, emd ? emd->vertexCos : NULL,
statvis->sharp_min,
statvis->sharp_max,
/* in this case they are vertex colors */
@@ -1509,12 +529,12 @@ static void cage_mapped_verts_callback(
float (*BKE_editmesh_vertexCos_get(struct Depsgraph *depsgraph, BMEditMesh *em, Scene *scene, int *r_numVerts))[3]
{
- DerivedMesh *cage, *final;
+ Mesh *cage, *final;
BLI_bitmap *visit_bitmap;
struct CageUserData data;
float (*cos_cage)[3];
- cage = editbmesh_get_derived_cage_and_final(depsgraph, scene, em->ob, em, CD_MASK_BAREMESH, &final);
+ cage = editbmesh_get_eval_cage_and_final(depsgraph, scene, em->ob, em, CD_MASK_BAREMESH, &final);
cos_cage = MEM_callocN(sizeof(*cos_cage) * em->bm->totvert, "bmbvh cos_cage");
/* when initializing cage verts, we only want the first cage coordinate for each vertex,
@@ -1525,7 +545,7 @@ float (*BKE_editmesh_vertexCos_get(struct Depsgraph *depsgraph, BMEditMesh *em,
data.cos_cage = cos_cage;
data.visit_bitmap = visit_bitmap;
- cage->foreachMappedVert(cage, cage_mapped_verts_callback, &data, DM_FOREACH_NOP);
+ BKE_mesh_foreach_mapped_vert(cage, cage_mapped_verts_callback, &data, MESH_FOREACH_NOP);
MEM_freeN(visit_bitmap);
diff --git a/source/blender/blenkernel/intern/editmesh.c b/source/blender/blenkernel/intern/editmesh.c
index 6e555ac1f96..11f3594da04 100644
--- a/source/blender/blenkernel/intern/editmesh.c
+++ b/source/blender/blenkernel/intern/editmesh.c
@@ -39,6 +39,7 @@
#include "BKE_editmesh.h"
#include "BKE_cdderivedmesh.h"
+#include "BKE_library.h"
BMEditMesh *BKE_editmesh_create(BMesh *bm, const bool do_tessellate)
@@ -58,7 +59,7 @@ BMEditMesh *BKE_editmesh_copy(BMEditMesh *em)
BMEditMesh *em_copy = MEM_callocN(sizeof(BMEditMesh), __func__);
*em_copy = *em;
- em_copy->derivedCage = em_copy->derivedFinal = NULL;
+ em_copy->mesh_eval_cage = em_copy->mesh_eval_final = NULL;
em_copy->derivedVertColor = NULL;
em_copy->derivedVertColorLen = 0;
@@ -114,18 +115,6 @@ static void editmesh_tessface_calc_intern(BMEditMesh *em)
BMLoop *(*looptris)[3];
-#if 0
- /* note, we could be clever and re-use this array but would need to ensure
- * its realloced at some point, for now just free it */
- if (em->looptris) MEM_freeN(em->looptris);
-
- /* Use em->tottri when set, this means no reallocs while transforming,
- * (unless scanfill fails), otherwise... */
- /* allocate the length of totfaces, avoid many small reallocs,
- * if all faces are tri's it will be correct, quads == 2x allocs */
- BLI_array_reserve(looptris, (em->tottri && em->tottri < bm->totface * 3) ? em->tottri : bm->totface);
-#else
-
/* this means no reallocs for quad dominant models, for */
if ((em->looptris != NULL) &&
/* (*em->tottri >= looptris_tot)) */
@@ -139,8 +128,6 @@ static void editmesh_tessface_calc_intern(BMEditMesh *em)
looptris = MEM_mallocN(sizeof(*looptris) * looptris_tot, __func__);
}
-#endif
-
em->looptris = looptris;
/* after allocating the em->looptris, we're ready to tessellate */
@@ -154,31 +141,25 @@ void BKE_editmesh_tessface_calc(BMEditMesh *em)
/* commented because editbmesh_build_data() ensures we get tessfaces */
#if 0
- if (em->derivedFinal && em->derivedFinal == em->derivedCage) {
- if (em->derivedFinal->recalcTessellation)
- em->derivedFinal->recalcTessellation(em->derivedFinal);
+ if (em->mesh_eval_final && em->mesh_eval_final == em->mesh_eval_cage) {
+ BKE_mesh_runtime_looptri_ensure(em->mesh_eval_final);
}
- else if (em->derivedFinal) {
- if (em->derivedCage->recalcTessellation)
- em->derivedCage->recalcTessellation(em->derivedCage);
- if (em->derivedFinal->recalcTessellation)
- em->derivedFinal->recalcTessellation(em->derivedFinal);
+ else if (em->mesh_eval_final) {
+ BKE_mesh_runtime_looptri_ensure(em->mesh_eval_final);
+ BKE_mesh_runtime_looptri_ensure(em->mesh_eval_cage);
}
#endif
}
void BKE_editmesh_free_derivedmesh(BMEditMesh *em)
{
- if (em->derivedCage) {
- em->derivedCage->needsFree = 1;
- em->derivedCage->release(em->derivedCage);
+ if (em->mesh_eval_cage) {
+ BKE_id_free(NULL, em->mesh_eval_cage);
}
- if (em->derivedFinal && em->derivedFinal != em->derivedCage) {
- em->derivedFinal->needsFree = 1;
- em->derivedFinal->release(em->derivedFinal);
+ if (em->mesh_eval_final && em->mesh_eval_final != em->mesh_eval_cage) {
+ BKE_id_free(NULL, em->mesh_eval_final);
}
-
- em->derivedCage = em->derivedFinal = NULL;
+ em->mesh_eval_cage = em->mesh_eval_final = NULL;
}
/*does not free the BMEditMesh struct itself*/
@@ -262,8 +243,6 @@ void BKE_editmesh_lnorspace_update(BMEditMesh *em)
Mesh *me = em->ob->data;
if (me->flag & ME_AUTOSMOOTH) {
BM_edges_sharp_from_angle_set(bm, me->smoothresh);
-
- me->drawflag |= ME_DRAWSHARP;
}
}
diff --git a/source/blender/blenkernel/intern/editmesh_cache.c b/source/blender/blenkernel/intern/editmesh_cache.c
new file mode 100644
index 00000000000..f0af0ede9b1
--- /dev/null
+++ b/source/blender/blenkernel/intern/editmesh_cache.c
@@ -0,0 +1,120 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenkernel/intern/editmesh_cache.c
+ * \ingroup bke
+ *
+ * Manage edit mesh cache: #EditMeshData
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_mesh_types.h"
+
+#include "BLI_math.h"
+
+#include "BKE_editmesh.h"
+#include "BKE_editmesh_cache.h" /* own include */
+
+void BKE_editmesh_cache_ensure_poly_normals(BMEditMesh *em, EditMeshData *emd)
+{
+ if (!(emd->vertexCos && (emd->polyNos == NULL))) {
+ return;
+ }
+
+ BMesh *bm = em->bm;
+ const float (*vertexCos)[3];
+ float (*polyNos)[3];
+
+ BMFace *efa;
+ BMIter fiter;
+ int i;
+
+ BM_mesh_elem_index_ensure(bm, BM_VERT);
+
+ polyNos = MEM_mallocN(sizeof(*polyNos) * bm->totface, __func__);
+
+ vertexCos = emd->vertexCos;
+
+ BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
+ BM_elem_index_set(efa, i); /* set_inline */
+ BM_face_calc_normal_vcos(bm, efa, polyNos[i], vertexCos);
+ }
+ bm->elem_index_dirty &= ~BM_FACE;
+
+ emd->polyNos = (const float (*)[3])polyNos;
+}
+
+void BKE_editmesh_cache_ensure_vert_normals(BMEditMesh *em, EditMeshData *emd)
+{
+ if (!(emd->vertexCos && (emd->vertexNos == NULL))) {
+ return;
+ }
+
+ BMesh *bm = em->bm;
+ const float (*vertexCos)[3], (*polyNos)[3];
+ float (*vertexNos)[3];
+
+ /* calculate vertex normals from poly normals */
+ BKE_editmesh_cache_ensure_poly_normals(em, emd);
+
+ BM_mesh_elem_index_ensure(bm, BM_FACE);
+
+ polyNos = emd->polyNos;
+ vertexCos = emd->vertexCos;
+ vertexNos = MEM_callocN(sizeof(*vertexNos) * bm->totvert, __func__);
+
+ BM_verts_calc_normal_vcos(bm, polyNos, vertexCos, vertexNos);
+
+ emd->vertexNos = (const float (*)[3])vertexNos;
+}
+
+void BKE_editmesh_cache_ensure_poly_centers(BMEditMesh *em, EditMeshData *emd)
+{
+ if (emd->polyCos != NULL) {
+ return;
+ }
+ BMesh *bm = em->bm;
+ float (*polyCos)[3];
+
+ BMFace *efa;
+ BMIter fiter;
+ int i;
+
+ polyCos = MEM_mallocN(sizeof(*polyCos) * bm->totface, __func__);
+
+ if (emd->vertexCos) {
+ const float (*vertexCos)[3];
+ vertexCos = emd->vertexCos;
+
+ BM_mesh_elem_index_ensure(bm, BM_VERT);
+
+ BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
+ BM_face_calc_center_mean_vcos(bm, efa, polyCos[i], vertexCos);
+ }
+ }
+ else {
+ BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
+ BM_face_calc_center_mean(efa, polyCos[i]);
+ }
+ }
+
+ emd->polyCos = (const float (*)[3])polyCos;
+}
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index a123b12d385..7c86c0722dc 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -57,7 +57,7 @@
#include "PIL_time.h"
-#include "BKE_anim.h" /* needed for where_on_path */
+#include "BKE_anim.h" /* needed for where_on_path */
#include "BKE_bvhutils.h"
#include "BKE_collection.h"
#include "BKE_collision.h"
@@ -92,8 +92,9 @@ EffectorWeights *BKE_add_effector_weights(Collection *collection)
EffectorWeights *weights = MEM_callocN(sizeof(EffectorWeights), "EffectorWeights");
int i;
- for (i=0; i<NUM_PFIELD_TYPES; i++)
+ for (i = 0; i < NUM_PFIELD_TYPES; i++) {
weights->weight[i] = 1.0f;
+ }
weights->global_gravity = 1.0f;
@@ -105,13 +106,14 @@ PartDeflect *object_add_collision_fields(int type)
{
PartDeflect *pd;
- pd= MEM_callocN(sizeof(PartDeflect), "PartDeflect");
+ pd = MEM_callocN(sizeof(PartDeflect), "PartDeflect");
pd->forcefield = type;
pd->pdef_sbdamp = 0.1f;
pd->pdef_sbift = 0.2f;
pd->pdef_sboft = 0.02f;
- pd->seed = ((unsigned int)(ceil(PIL_check_seconds_timer()))+1) % 128;
+ pd->pdef_cfrict = 5.0f;
+ pd->seed = ((uint)(ceil(PIL_check_seconds_timer())) + 1) % 128;
pd->f_strength = 1.0f;
pd->f_damp = 1.0f;
@@ -131,7 +133,7 @@ PartDeflect *object_add_collision_fields(int type)
pd->f_flow = 1.0f;
break;
}
- pd->flag = PFIELD_DO_LOCATION|PFIELD_DO_ROTATION;
+ pd->flag = PFIELD_DO_LOCATION | PFIELD_DO_ROTATION | PFIELD_CLOTH_USE_CULLING;
return pd;
}
@@ -140,12 +142,12 @@ PartDeflect *object_add_collision_fields(int type)
void free_partdeflect(PartDeflect *pd)
{
- if (!pd)
+ if (!pd) {
return;
-
- if (pd->rng)
+ }
+ if (pd->rng) {
BLI_rng_free(pd->rng);
-
+ }
MEM_freeN(pd);
}
@@ -154,16 +156,18 @@ void free_partdeflect(PartDeflect *pd)
static void precalculate_effector(struct Depsgraph *depsgraph, EffectorCache *eff)
{
float ctime = DEG_get_ctime(depsgraph);
- unsigned int cfra = (unsigned int)(ctime >= 0 ? ctime : -ctime);
- if (!eff->pd->rng)
+ uint cfra = (uint)(ctime >= 0 ? ctime : -ctime);
+ if (!eff->pd->rng) {
eff->pd->rng = BLI_rng_new(eff->pd->seed + cfra);
- else
+ }
+ else {
BLI_rng_srandom(eff->pd->rng, eff->pd->seed + cfra);
+ }
- if (eff->pd->forcefield == PFIELD_GUIDE && eff->ob->type==OB_CURVE) {
- Curve *cu= eff->ob->data;
+ if (eff->pd->forcefield == PFIELD_GUIDE && eff->ob->type == OB_CURVE) {
+ Curve *cu = eff->ob->data;
if (cu->flag & CU_PATH) {
- if (eff->ob->runtime.curve_cache == NULL || eff->ob->runtime.curve_cache->path==NULL || eff->ob->runtime.curve_cache->path->data==NULL)
+ if (eff->ob->runtime.curve_cache == NULL || eff->ob->runtime.curve_cache->path == NULL || eff->ob->runtime.curve_cache->path->data == NULL)
BKE_displist_make_curveTypes(depsgraph, eff->scene, eff->ob, 0);
if (eff->ob->runtime.curve_cache->path && eff->ob->runtime.curve_cache->path->data) {
@@ -174,7 +178,7 @@ static void precalculate_effector(struct Depsgraph *depsgraph, EffectorCache *ef
}
}
else if (eff->pd->shape == PFIELD_SHAPE_SURFACE) {
- eff->surmd = (SurfaceModifierData *)modifiers_findByType( eff->ob, eModifierType_Surface );
+ eff->surmd = (SurfaceModifierData *)modifiers_findByType(eff->ob, eModifierType_Surface);
if (eff->ob->type == OB_CURVE)
eff->flag |= PE_USE_NORMAL_DATA;
}
@@ -224,9 +228,9 @@ static void add_effector_evaluation(ListBase **effectors, Depsgraph *depsgraph,
* This is used by the depsgraph to build relations, as well as faster
* lookup of effectors during evaluation. */
ListBase *BKE_effector_relations_create(
- Depsgraph *depsgraph,
- ViewLayer *view_layer,
- Collection *collection)
+ Depsgraph *depsgraph,
+ ViewLayer *view_layer,
+ Collection *collection)
{
Base *base = BKE_collection_or_layer_objects(view_layer, collection);
const bool for_render = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
@@ -272,10 +276,10 @@ void BKE_effector_relations_free(ListBase *lb)
/* Create effective list of effectors from relations built beforehand. */
ListBase *BKE_effectors_create(
- Depsgraph *depsgraph,
- Object *ob_src,
- ParticleSystem *psys_src,
- EffectorWeights *weights)
+ Depsgraph *depsgraph,
+ Object *ob_src,
+ ParticleSystem *psys_src,
+ EffectorWeights *weights)
{
Scene *scene = DEG_get_evaluated_scene(depsgraph);
ListBase *relations = DEG_get_effector_relations(depsgraph, weights->group);
@@ -287,12 +291,12 @@ ListBase *BKE_effectors_create(
for (EffectorRelation *relation = relations->first; relation; relation = relation->next) {
/* Get evaluated object. */
- Object *ob = (Object*)DEG_get_evaluated_id(depsgraph, &relation->ob->id);
+ Object *ob = (Object *)DEG_get_evaluated_id(depsgraph, &relation->ob->id);
if (relation->psys) {
/* Get evaluated particle system. */
ParticleSystem *psys = BLI_findstring(&ob->particlesystem,
- relation->psys->name, offsetof(ParticleSystem, name));
+ relation->psys->name, offsetof(ParticleSystem, name));
ParticleSettings *part = psys->part;
if (psys == psys_src && (part->flag & PART_SELF_EFFECT) == 0) {
@@ -422,14 +426,15 @@ static float eff_calc_visibility(ListBase *colliders, EffectorCache *eff, Effect
float norm[3], len = 0.0;
float visibility = 1.0, absorption = 0.0;
- if (!(eff->pd->flag & PFIELD_VISIBILITY))
+ if (!(eff->pd->flag & PFIELD_VISIBILITY)) {
return visibility;
-
- if (!colls)
+ }
+ if (!colls) {
colls = BKE_collider_cache_create(eff->depsgraph, eff->ob, NULL);
-
- if (!colls)
+ }
+ if (!colls) {
return visibility;
+ }
negate_v3_v3(norm, efd->vec_to_point);
len = normalize_v3(norm);
@@ -438,9 +443,9 @@ static float eff_calc_visibility(ListBase *colliders, EffectorCache *eff, Effect
for (col = colls->first; col; col = col->next) {
CollisionModifierData *collmd = col->collmd;
- if (col->ob == eff->ob)
+ if (col->ob == eff->ob) {
continue;
-
+ }
if (collmd->bvhtree) {
BVHTreeRayHit hit;
@@ -452,13 +457,14 @@ static float eff_calc_visibility(ListBase *colliders, EffectorCache *eff, Effect
collmd->bvhtree, point->loc, norm, 0.0f, &hit,
eff_tri_ray_hit, NULL, raycast_flag) != -1)
{
- absorption= col->ob->pd->absorption;
+ absorption = col->ob->pd->absorption;
/* visibility is only between 0 and 1, calculated from 1-absorption */
- visibility *= CLAMPIS(1.0f-absorption, 0.0f, 1.0f);
+ visibility *= CLAMPIS(1.0f - absorption, 0.0f, 1.0f);
- if (visibility <= 0.0f)
+ if (visibility <= 0.0f) {
break;
+ }
}
}
}
@@ -472,14 +478,15 @@ static float eff_calc_visibility(ListBase *colliders, EffectorCache *eff, Effect
// noise function for wind e.g.
static float wind_func(struct RNG *rng, float strength)
{
- int random = (BLI_rng_get_int(rng)+1) % 128; // max 2357
+ int random = (BLI_rng_get_int(rng) + 1) % 128; /* max 2357 */
float force = BLI_rng_get_float(rng) + 1.0f;
float ret;
float sign = 0;
- sign = ((float)random > 64.0f) ? 1.0f: -1.0f; // dividing by 2 is not giving equal sign distribution
+ /* Dividing by 2 is not giving equal sign distribution. */
+ sign = ((float)random > 64.0f) ? 1.0f : -1.0f;
- ret = sign*((float)random / force)*strength/128.0f;
+ ret = sign * ((float)random / force) * strength / 128.0f;
return ret;
}
@@ -499,17 +506,17 @@ static float falloff_func(float fac, int usemin, float mindist, int usemax, floa
if (!usemin)
mindist = 0.0;
- return pow((double)(1.0f+fac-mindist), (double)(-power));
+ return pow((double)(1.0f + fac - mindist), (double)(-power));
}
static float falloff_func_dist(PartDeflect *pd, float fac)
{
- return falloff_func(fac, pd->flag&PFIELD_USEMIN, pd->mindist, pd->flag&PFIELD_USEMAX, pd->maxdist, pd->f_power);
+ return falloff_func(fac, pd->flag & PFIELD_USEMIN, pd->mindist, pd->flag & PFIELD_USEMAX, pd->maxdist, pd->f_power);
}
static float falloff_func_rad(PartDeflect *pd, float fac)
{
- return falloff_func(fac, pd->flag&PFIELD_USEMINR, pd->minrad, pd->flag&PFIELD_USEMAXR, pd->maxrad, pd->f_power_r);
+ return falloff_func(fac, pd->flag & PFIELD_USEMINR, pd->minrad, pd->flag & PFIELD_USEMAXR, pd->maxrad, pd->f_power_r);
}
float effector_falloff(EffectorCache *eff, EffectorData *efd, EffectedPoint *UNUSED(point), EffectorWeights *weights)
@@ -521,31 +528,31 @@ float effector_falloff(EffectorCache *eff, EffectorData *efd, EffectedPoint *UNU
fac = dot_v3v3(efd->nor, efd->vec_to_point2);
if (eff->pd->zdir == PFIELD_Z_POS && fac < 0.0f)
- falloff=0.0f;
+ falloff = 0.0f;
else if (eff->pd->zdir == PFIELD_Z_NEG && fac > 0.0f)
- falloff=0.0f;
+ falloff = 0.0f;
else {
switch (eff->pd->falloff) {
case PFIELD_FALL_SPHERE:
- falloff*= falloff_func_dist(eff->pd, efd->distance);
+ falloff *= falloff_func_dist(eff->pd, efd->distance);
break;
case PFIELD_FALL_TUBE:
- falloff*= falloff_func_dist(eff->pd, ABS(fac));
+ falloff *= falloff_func_dist(eff->pd, ABS(fac));
if (falloff == 0.0f)
break;
madd_v3_v3v3fl(temp, efd->vec_to_point2, efd->nor, -fac);
- r_fac= len_v3(temp);
- falloff*= falloff_func_rad(eff->pd, r_fac);
+ r_fac = len_v3(temp);
+ falloff *= falloff_func_rad(eff->pd, r_fac);
break;
case PFIELD_FALL_CONE:
- falloff*= falloff_func_dist(eff->pd, ABS(fac));
+ falloff *= falloff_func_dist(eff->pd, ABS(fac));
if (falloff == 0.0f)
break;
- r_fac= RAD2DEGF(saacos(fac/len_v3(efd->vec_to_point)));
- falloff*= falloff_func_rad(eff->pd, r_fac);
+ r_fac = RAD2DEGF(saacos(fac / len_v3(efd->vec_to_point2)));
+ falloff *= falloff_func_rad(eff->pd, r_fac);
break;
}
@@ -592,7 +599,7 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
/* In case surface object is in Edit mode when loading the .blend, surface modifier is never executed
* and bvhtree never built, see T48415. */
- if (eff->pd && eff->pd->shape==PFIELD_SHAPE_SURFACE && eff->surmd && eff->surmd->bvhtree) {
+ if (eff->pd && eff->pd->shape == PFIELD_SHAPE_SURFACE && eff->surmd && eff->surmd->bvhtree) {
/* closest point in the object surface is an effector */
float vec[3];
@@ -605,7 +612,7 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
efd->size = 0.0f;
}
- else if (eff->pd && eff->pd->shape==PFIELD_SHAPE_POINTS) {
+ else if (eff->pd && eff->pd->shape == PFIELD_SHAPE_POINTS) {
Mesh *me_eval = eff->ob->runtime.mesh_eval;
if (me_eval != NULL) {
copy_v3_v3(efd->loc, me_eval->mvert[*efd->index].co);
@@ -631,11 +638,11 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
/* pass */
}
else {
- ParticleSimulationData sim= {NULL};
+ ParticleSimulationData sim = {NULL};
sim.depsgraph = eff->depsgraph;
- sim.scene= eff->scene;
- sim.ob= eff->ob;
- sim.psys= eff->psys;
+ sim.scene = eff->scene;
+ sim.ob = eff->ob;
+ sim.psys = eff->psys;
/* TODO: time from actual previous calculated frame (step might not be 1) */
state.time = cfra - 1.0f;
@@ -654,9 +661,9 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
efd->nor[1] = efd->nor[2] = 0.f;
mul_qt_v3(state.rot, efd->nor);
- if (real_velocity)
+ if (real_velocity) {
copy_v3_v3(efd->vel, state.vel);
-
+ }
efd->size = pa->size;
}
}
@@ -667,24 +674,26 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
/* use z-axis as normal*/
normalize_v3_v3(efd->nor, ob->obmat[2]);
- if (eff->pd && eff->pd->shape == PFIELD_SHAPE_PLANE) {
+ if (eff->pd && ELEM(eff->pd->shape, PFIELD_SHAPE_PLANE, PFIELD_SHAPE_LINE)) {
float temp[3], translate[3];
sub_v3_v3v3(temp, point->loc, ob->obmat[3]);
project_v3_v3v3(translate, temp, efd->nor);
/* for vortex the shape chooses between old / new force */
- if (eff->pd->forcefield == PFIELD_VORTEX)
+ if (eff->pd->forcefield == PFIELD_VORTEX || eff->pd->shape == PFIELD_SHAPE_LINE) {
add_v3_v3v3(efd->loc, ob->obmat[3], translate);
- else /* normally efd->loc is closest point on effector xy-plane */
+ }
+ else { /* normally efd->loc is closest point on effector xy-plane */
sub_v3_v3v3(efd->loc, point->loc, translate);
+ }
}
else {
copy_v3_v3(efd->loc, ob->obmat[3]);
}
- if (real_velocity)
+ if (real_velocity) {
copy_v3_v3(efd->vel, eff->velocity);
-
+ }
efd->size = 0.0f;
ret = 1;
@@ -696,7 +705,7 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
/* rest length for harmonic effector, will have to see later if this could be extended to other effectors */
if (eff->pd && eff->pd->forcefield == PFIELD_HARMONIC && eff->pd->f_size)
- mul_v3_fl(efd->vec_to_point, (efd->distance-eff->pd->f_size)/efd->distance);
+ mul_v3_fl(efd->vec_to_point, (efd->distance - eff->pd->f_size) / efd->distance);
if (eff->flag & PE_USE_NORMAL_DATA) {
copy_v3_v3(efd->vec_to_point2, efd->vec_to_point);
@@ -722,7 +731,7 @@ static void get_effector_tot(EffectorCache *eff, EffectorData *efd, EffectedPoin
if (*tot && eff->pd->forcefield == PFIELD_HARMONIC && point->index >= 0) {
*p = point->index % *tot;
- *tot = *p+1;
+ *tot = *p + 1;
}
}
else if (eff->psys) {
@@ -737,17 +746,17 @@ static void get_effector_tot(EffectorCache *eff, EffectorData *efd, EffectedPoin
*/
efd->charge = eff->pd->f_strength;
}
- else if (eff->pd->forcefield == PFIELD_HARMONIC && (eff->pd->flag & PFIELD_MULTIPLE_SPRINGS)==0) {
+ else if (eff->pd->forcefield == PFIELD_HARMONIC && (eff->pd->flag & PFIELD_MULTIPLE_SPRINGS) == 0) {
/* every particle is mapped to only one harmonic effector particle */
- *p= point->index % eff->psys->totpart;
- *tot= *p + 1;
+ *p = point->index % eff->psys->totpart;
+ *tot = *p + 1;
}
if (eff->psys->part->effector_amount) {
int totpart = eff->psys->totpart;
int amount = eff->psys->part->effector_amount;
- *step = (totpart > amount) ? totpart/amount : 1;
+ *step = (totpart > amount) ? totpart / amount : 1;
}
}
else {
@@ -768,7 +777,7 @@ static void do_texture_effector(EffectorCache *eff, EffectorData *efd, EffectedP
result[0].nor = result[1].nor = result[2].nor = result[3].nor = NULL;
- strength= eff->pd->f_strength * efd->falloff;
+ strength = eff->pd->f_strength * efd->falloff;
copy_v3_v3(tex_co, point->loc);
@@ -779,7 +788,7 @@ static void do_texture_effector(EffectorCache *eff, EffectorData *efd, EffectedP
tex_co[2] = 0.0f;
}
else if (eff->pd->flag & PFIELD_TEX_2D) {
- float fac=-dot_v3v3(tex_co, efd->nor);
+ float fac = -dot_v3v3(tex_co, efd->nor);
madd_v3_v3fl(tex_co, efd->nor, fac);
}
@@ -787,31 +796,31 @@ static void do_texture_effector(EffectorCache *eff, EffectorData *efd, EffectedP
hasrgb = multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result, 0, NULL, scene_color_manage, false);
- if (hasrgb && mode==PFIELD_TEX_RGB) {
+ if (hasrgb && mode == PFIELD_TEX_RGB) {
force[0] = (0.5f - result->tr) * strength;
force[1] = (0.5f - result->tg) * strength;
force[2] = (0.5f - result->tb) * strength;
}
else if (nabla != 0) {
- strength/=nabla;
+ strength /= nabla;
tex_co[0] += nabla;
- multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+1, 0, NULL, scene_color_manage, false);
+ multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result + 1, 0, NULL, scene_color_manage, false);
tex_co[0] -= nabla;
tex_co[1] += nabla;
- multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+2, 0, NULL, scene_color_manage, false);
+ multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result + 2, 0, NULL, scene_color_manage, false);
tex_co[1] -= nabla;
tex_co[2] += nabla;
- multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+3, 0, NULL, scene_color_manage, false);
+ multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result + 3, 0, NULL, scene_color_manage, false);
if (mode == PFIELD_TEX_GRAD || !hasrgb) { /* if we don't have rgb fall back to grad */
/* generate intensity if texture only has rgb value */
if (hasrgb & TEX_RGB) {
- int i;
- for (i=0; i<4; i++)
+ for (int i = 0; i < 4; i++) {
result[i].tin = (1.0f / 3.0f) * (result[i].tr + result[i].tg + result[i].tb);
+ }
}
force[0] = (result[0].tin - result[1].tin) * strength;
force[1] = (result[0].tin - result[2].tin) * strength;
@@ -857,8 +866,9 @@ static void do_physical_effector(EffectorCache *eff, EffectorData *efd, Effected
if (noise_factor > 0.0f) {
strength += wind_func(rng, noise_factor);
- if (ELEM(pd->forcefield, PFIELD_HARMONIC, PFIELD_DRAG))
+ if (ELEM(pd->forcefield, PFIELD_HARMONIC, PFIELD_DRAG)) {
damp += wind_func(rng, noise_factor);
+ }
}
copy_v3_v3(force, efd->vec_to_point);
@@ -870,8 +880,8 @@ static void do_physical_effector(EffectorCache *eff, EffectorData *efd, Effected
break;
case PFIELD_FORCE:
normalize_v3(force);
- if (pd->flag & PFIELD_GRAVITATION){ /* Option: Multiply by 1/distance^2 */
- if (efd->distance < FLT_EPSILON){
+ if (pd->flag & PFIELD_GRAVITATION) { /* Option: Multiply by 1/distance^2 */
+ if (efd->distance < FLT_EPSILON) {
strength = 0.0f;
}
else {
@@ -900,7 +910,7 @@ static void do_physical_effector(EffectorCache *eff, EffectorData *efd, Effected
}
break;
case PFIELD_MAGNET:
- if (eff->pd->shape == PFIELD_SHAPE_POINT)
+ if (ELEM(eff->pd->shape, PFIELD_SHAPE_POINT, PFIELD_SHAPE_LINE))
/* magnetic field of a moving charge */
cross_v3_v3v3(temp, efd->nor, efd->vec_to_point);
else
@@ -923,10 +933,10 @@ static void do_physical_effector(EffectorCache *eff, EffectorData *efd, Effected
case PFIELD_LENNARDJ:
fac = pow((efd->size + point->size) / efd->distance, 6.0);
- fac = - fac * (1.0f - fac) / efd->distance;
+ fac = -fac * (1.0f - fac) / efd->distance;
/* limit the repulsive term drastically to avoid huge forces */
- fac = ((fac>2.0f) ? 2.0f : fac);
+ fac = ((fac > 2.0f) ? 2.0f : fac);
mul_v3_fl(force, strength * fac);
break;
@@ -960,8 +970,9 @@ static void do_physical_effector(EffectorCache *eff, EffectorData *efd, Effected
float density;
if ((density = smoke_get_velocity_at(pd->f_source, point->loc, force)) >= 0.0f) {
float influence = strength * efd->falloff;
- if (pd->flag & PFIELD_SMOKE_DENSITY)
+ if (pd->flag & PFIELD_SMOKE_DENSITY) {
influence *= density;
+ }
mul_v3_fl(force, influence);
/* apply flow */
madd_v3_v3fl(total_force, point->vel, -pd->f_flow * influence);
@@ -972,15 +983,16 @@ static void do_physical_effector(EffectorCache *eff, EffectorData *efd, Effected
}
if (pd->flag & PFIELD_DO_LOCATION) {
- madd_v3_v3fl(total_force, force, 1.0f/point->vel_to_sec);
+ madd_v3_v3fl(total_force, force, 1.0f / point->vel_to_sec);
- if (ELEM(pd->forcefield, PFIELD_HARMONIC, PFIELD_DRAG, PFIELD_SMOKEFLOW)==0 && pd->f_flow != 0.0f) {
+ if (ELEM(pd->forcefield, PFIELD_HARMONIC, PFIELD_DRAG, PFIELD_SMOKEFLOW) == 0 && pd->f_flow != 0.0f) {
madd_v3_v3fl(total_force, point->vel, -pd->f_flow * efd->falloff);
}
}
- if (point->ave)
+ if (point->ave) {
zero_v3(point->ave);
+ }
if (pd->flag & PFIELD_DO_ROTATION && point->ave && point->rot) {
float xvec[3] = {1.0f, 0.0f, 0.0f};
float dave[3];
@@ -1023,45 +1035,47 @@ void BKE_effectors_apply(ListBase *effectors, ListBase *colliders, EffectorWeigh
*/
EffectorCache *eff;
EffectorData efd;
- int p=0, tot = 1, step = 1;
+ int p = 0, tot = 1, step = 1;
/* Cycle through collected objects, get total of (1/(gravity_strength * dist^gravity_power)) */
/* Check for min distance here? (yes would be cool to add that, ton) */
- if (effectors) for (eff = effectors->first; eff; eff=eff->next) {
- /* object effectors were fully checked to be OK to evaluate! */
+ if (effectors) {
+ for (eff = effectors->first; eff; eff = eff->next) {
+ /* object effectors were fully checked to be OK to evaluate! */
- get_effector_tot(eff, &efd, point, &tot, &p, &step);
+ get_effector_tot(eff, &efd, point, &tot, &p, &step);
- for (; p<tot; p+=step) {
- if (get_effector_data(eff, &efd, point, 0)) {
- efd.falloff= effector_falloff(eff, &efd, point, weights);
+ for (; p < tot; p += step) {
+ if (get_effector_data(eff, &efd, point, 0)) {
+ efd.falloff = effector_falloff(eff, &efd, point, weights);
- if (efd.falloff > 0.0f)
- efd.falloff *= eff_calc_visibility(colliders, eff, &efd, point);
-
- if (efd.falloff <= 0.0f) {
- /* don't do anything */
- }
- else if (eff->pd->forcefield == PFIELD_TEXTURE) {
- do_texture_effector(eff, &efd, point, force);
- }
- else {
- float temp1[3] = {0, 0, 0}, temp2[3];
- copy_v3_v3(temp1, force);
+ if (efd.falloff > 0.0f) {
+ efd.falloff *= eff_calc_visibility(colliders, eff, &efd, point);
+ }
+ if (efd.falloff <= 0.0f) {
+ /* don't do anything */
+ }
+ else if (eff->pd->forcefield == PFIELD_TEXTURE) {
+ do_texture_effector(eff, &efd, point, force);
+ }
+ else {
+ float temp1[3] = {0, 0, 0}, temp2[3];
+ copy_v3_v3(temp1, force);
- do_physical_effector(eff, &efd, point, force);
+ do_physical_effector(eff, &efd, point, force);
- /* for softbody backward compatibility */
- if (point->flag & PE_WIND_AS_SPEED && impulse) {
- sub_v3_v3v3(temp2, force, temp1);
- sub_v3_v3v3(impulse, impulse, temp2);
+ /* for softbody backward compatibility */
+ if (point->flag & PE_WIND_AS_SPEED && impulse) {
+ sub_v3_v3v3(temp2, force, temp1);
+ sub_v3_v3v3(impulse, impulse, temp2);
+ }
}
}
- }
- else if (eff->flag & PE_VELOCITY_TO_IMPULSE && impulse) {
- /* special case for harmonic effector */
- add_v3_v3v3(impulse, impulse, efd.vel);
+ else if (eff->flag & PE_VELOCITY_TO_IMPULSE && impulse) {
+ /* special case for harmonic effector */
+ add_v3_v3v3(impulse, impulse, efd.vel);
+ }
}
}
}
@@ -1071,35 +1085,35 @@ void BKE_effectors_apply(ListBase *effectors, ListBase *colliders, EffectorWeigh
SimDebugData *_sim_debug_data = NULL;
-unsigned int BKE_sim_debug_data_hash(int i)
+uint BKE_sim_debug_data_hash(int i)
{
- return BLI_ghashutil_uinthash((unsigned int)i);
+ return BLI_ghashutil_uinthash((uint)i);
}
-unsigned int BKE_sim_debug_data_hash_combine(unsigned int kx, unsigned int ky)
+uint BKE_sim_debug_data_hash_combine(uint kx, uint ky)
{
-#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
+#define rot(x, k) (((x) << (k)) | ((x) >> (32 - (k))))
- unsigned int a, b, c;
+ uint a, b, c;
a = b = c = 0xdeadbeef + (2 << 2) + 13;
a += kx;
b += ky;
- c ^= b; c -= rot(b,14);
- a ^= c; a -= rot(c,11);
- b ^= a; b -= rot(a,25);
- c ^= b; c -= rot(b,16);
- a ^= c; a -= rot(c,4);
- b ^= a; b -= rot(a,14);
- c ^= b; c -= rot(b,24);
+ c ^= b; c -= rot(b, 14);
+ a ^= c; a -= rot(c, 11);
+ b ^= a; b -= rot(a, 25);
+ c ^= b; c -= rot(b, 16);
+ a ^= c; a -= rot(c, 4);
+ b ^= a; b -= rot(a, 14);
+ c ^= b; c -= rot(b, 24);
return c;
#undef rot
}
-static unsigned int debug_element_hash(const void *key)
+static uint debug_element_hash(const void *key)
{
const SimDebugElement *elem = key;
return elem->hash;
@@ -1143,8 +1157,9 @@ bool BKE_sim_debug_data_get_enabled(void)
void BKE_sim_debug_data_free(void)
{
if (_sim_debug_data) {
- if (_sim_debug_data->gh)
+ if (_sim_debug_data->gh) {
BLI_ghash_free(_sim_debug_data->gh, NULL, debug_element_free);
+ }
MEM_freeN(_sim_debug_data);
}
}
@@ -1156,20 +1171,23 @@ static void debug_data_insert(SimDebugData *debug_data, SimDebugElement *elem)
*old_elem = *elem;
MEM_freeN(elem);
}
- else
+ else {
BLI_ghash_insert(debug_data->gh, elem, elem);
+ }
}
-void BKE_sim_debug_data_add_element(int type, const float v1[3], const float v2[3], const char *str, float r, float g, float b, const char *category, unsigned int hash)
+void BKE_sim_debug_data_add_element(int type, const float v1[3], const float v2[3], const char *str, float r, float g, float b, const char *category, uint hash)
{
- unsigned int category_hash = BLI_ghashutil_strhash_p(category);
+ uint category_hash = BLI_ghashutil_strhash_p(category);
SimDebugElement *elem;
if (!_sim_debug_data) {
- if (G.debug & G_DEBUG_SIMDATA)
+ if (G.debug & G_DEBUG_SIMDATA) {
BKE_sim_debug_data_set_enabled(true);
- else
+ }
+ else {
return;
+ }
}
elem = MEM_callocN(sizeof(SimDebugElement), "sim debug data element");
@@ -1179,47 +1197,55 @@ void BKE_sim_debug_data_add_element(int type, const float v1[3], const float v2[
elem->color[0] = r;
elem->color[1] = g;
elem->color[2] = b;
- if (v1)
+ if (v1) {
copy_v3_v3(elem->v1, v1);
- else
+ }
+ else {
zero_v3(elem->v1);
- if (v2)
+ }
+ if (v2) {
copy_v3_v3(elem->v2, v2);
- else
+ }
+ else {
zero_v3(elem->v2);
- if (str)
+ }
+ if (str) {
BLI_strncpy(elem->str, str, sizeof(elem->str));
- else
+ }
+ else {
elem->str[0] = '\0';
+ }
debug_data_insert(_sim_debug_data, elem);
}
-void BKE_sim_debug_data_remove_element(unsigned int hash)
+void BKE_sim_debug_data_remove_element(uint hash)
{
SimDebugElement dummy;
- if (!_sim_debug_data)
+ if (!_sim_debug_data) {
return;
-
+ }
dummy.hash = hash;
BLI_ghash_remove(_sim_debug_data->gh, &dummy, NULL, debug_element_free);
}
void BKE_sim_debug_data_clear(void)
{
- if (!_sim_debug_data)
+ if (!_sim_debug_data) {
return;
-
- if (_sim_debug_data->gh)
+ }
+ if (_sim_debug_data->gh) {
BLI_ghash_clear(_sim_debug_data->gh, NULL, debug_element_free);
+ }
}
void BKE_sim_debug_data_clear_category(const char *category)
{
int category_hash = (int)BLI_ghashutil_strhash_p(category);
- if (!_sim_debug_data)
+ if (!_sim_debug_data) {
return;
+ }
if (_sim_debug_data->gh) {
GHashIterator iter;
@@ -1228,8 +1254,9 @@ void BKE_sim_debug_data_clear_category(const char *category)
const SimDebugElement *elem = BLI_ghashIterator_getValue(&iter);
BLI_ghashIterator_step(&iter); /* removing invalidates the current iterator, so step before removing */
- if (elem->category_hash == category_hash)
+ if (elem->category_hash == category_hash) {
BLI_ghash_remove(_sim_debug_data->gh, elem, NULL, debug_element_free);
+ }
}
}
}
diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c
index 1e4c868a3db..6deb7128b20 100644
--- a/source/blender/blenkernel/intern/fcurve.c
+++ b/source/blender/blenkernel/intern/fcurve.c
@@ -49,6 +49,8 @@
#include "BLI_threads.h"
#include "BLI_string_utils.h"
#include "BLI_utildefines.h"
+#include "BLI_expr_pylike_eval.h"
+#include "BLI_alloca.h"
#include "BLT_translation.h"
@@ -65,6 +67,8 @@
#include "RNA_access.h"
+#include "atomic_ops.h"
+
#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -882,25 +886,44 @@ void fcurve_store_samples(FCurve *fcu, void *data, int start, int end, FcuSample
* that the handles are correctly
*/
-/* Checks if the F-Curve has a Cycles modifier with simple settings that warrant transition smoothing */
-bool BKE_fcurve_is_cyclic(FCurve *fcu)
+/* Checks if the F-Curve has a Cycles modifier, and returns the type of the cycle behavior. */
+eFCU_Cycle_Type BKE_fcurve_get_cycle_type(FCurve *fcu)
{
FModifier *fcm = fcu->modifiers.first;
- if (!fcm || fcm->type != FMODIFIER_TYPE_CYCLES)
- return false;
+ if (!fcm || fcm->type != FMODIFIER_TYPE_CYCLES) {
+ return FCU_CYCLE_NONE;
+ }
- if (fcm->flag & (FMODIFIER_FLAG_DISABLED | FMODIFIER_FLAG_MUTED))
- return false;
+ if (fcm->flag & (FMODIFIER_FLAG_DISABLED | FMODIFIER_FLAG_MUTED)) {
+ return FCU_CYCLE_NONE;
+ }
- if (fcm->flag & (FMODIFIER_FLAG_RANGERESTRICT | FMODIFIER_FLAG_USEINFLUENCE))
- return false;
+ if (fcm->flag & (FMODIFIER_FLAG_RANGERESTRICT | FMODIFIER_FLAG_USEINFLUENCE)) {
+ return FCU_CYCLE_NONE;
+ }
FMod_Cycles *data = (FMod_Cycles *)fcm->data;
- return data && data->after_cycles == 0 && data->before_cycles == 0 &&
- ELEM(data->before_mode, FCM_EXTRAPOLATE_CYCLIC, FCM_EXTRAPOLATE_CYCLIC_OFFSET) &&
- ELEM(data->after_mode, FCM_EXTRAPOLATE_CYCLIC, FCM_EXTRAPOLATE_CYCLIC_OFFSET);
+ if (data && data->after_cycles == 0 && data->before_cycles == 0) {
+ if (data->before_mode == FCM_EXTRAPOLATE_CYCLIC && data->after_mode == FCM_EXTRAPOLATE_CYCLIC) {
+ return FCU_CYCLE_PERFECT;
+ }
+
+ if (ELEM(data->before_mode, FCM_EXTRAPOLATE_CYCLIC, FCM_EXTRAPOLATE_CYCLIC_OFFSET) &&
+ ELEM(data->after_mode, FCM_EXTRAPOLATE_CYCLIC, FCM_EXTRAPOLATE_CYCLIC_OFFSET))
+ {
+ return FCU_CYCLE_OFFSET;
+ }
+ }
+
+ return FCU_CYCLE_NONE;
+}
+
+/* Checks if the F-Curve has a Cycles modifier with simple settings that warrant transition smoothing */
+bool BKE_fcurve_is_cyclic(FCurve *fcu)
+{
+ return BKE_fcurve_get_cycle_type(fcu) != FCU_CYCLE_NONE;
}
/* Shifts 'in' by the difference in coordinates between 'to' and 'from', using 'out' as the output buffer.
@@ -1288,31 +1311,6 @@ bool driver_get_variable_property(
return true;
}
-#if 0
-/* Helper function to obtain a pointer to a Pose Channel (for evaluating drivers) */
-static bPoseChannel *dtar_get_pchan_ptr(ChannelDriver *driver, DriverTarget *dtar)
-{
- ID *id;
- /* sanity check */
- if (ELEM(NULL, driver, dtar))
- return NULL;
-
- id = dtar_id_ensure_proxy_from(dtar->id);
-
- /* check if the ID here is a valid object */
- if (id && GS(id->name)) {
- Object *ob = (Object *)id;
-
- /* get pose, and subsequently, posechannel */
- return BKE_pose_channel_find_name(ob->pose, dtar->pchan_name);
- }
- else {
- /* cannot find a posechannel this way */
- return NULL;
- }
-}
-#endif
-
static short driver_check_valid_targets(ChannelDriver *driver, DriverVar *dvar)
{
short valid_targets = 0;
@@ -1694,11 +1692,8 @@ void driver_free_variable_ex(ChannelDriver *driver, DriverVar *dvar)
/* remove and free the driver variable */
driver_free_variable(&driver->variables, dvar);
-#ifdef WITH_PYTHON
/* since driver variables are cached, the expression needs re-compiling too */
- if (driver->type == DRIVER_TYPE_PYTHON)
- driver->flag |= DRIVER_FLAG_RENAMEVAR;
-#endif
+ BKE_driver_invalidate_expression(driver, false, true);
}
/* Copy driver variables from src_vars list to dst_vars list */
@@ -1835,11 +1830,8 @@ DriverVar *driver_add_new_variable(ChannelDriver *driver)
/* set the default type to 'single prop' */
driver_change_variable_type(dvar, DVAR_TYPE_SINGLE_PROP);
-#ifdef WITH_PYTHON
/* since driver variables are cached, the expression needs re-compiling too */
- if (driver->type == DRIVER_TYPE_PYTHON)
- driver->flag |= DRIVER_FLAG_RENAMEVAR;
-#endif
+ BKE_driver_invalidate_expression(driver, false, true);
/* return the target */
return dvar;
@@ -1868,6 +1860,8 @@ void fcurve_free_driver(FCurve *fcu)
BPY_DECREF(driver->expr_comp);
#endif
+ BLI_expr_pylike_free(driver->expr_simple);
+
/* free driver itself, then set F-Curve's point to this to NULL (as the curve may still be used) */
MEM_freeN(driver);
fcu->driver = NULL;
@@ -1885,6 +1879,7 @@ ChannelDriver *fcurve_copy_driver(const ChannelDriver *driver)
/* copy all data */
ndriver = MEM_dupallocN(driver);
ndriver->expr_comp = NULL;
+ ndriver->expr_simple = NULL;
/* copy variables */
BLI_listbase_clear(&ndriver->variables); /* to get rid of refs to non-copied data (that's still used on original) */
@@ -1894,6 +1889,124 @@ ChannelDriver *fcurve_copy_driver(const ChannelDriver *driver)
return ndriver;
}
+/* Driver Expression Evaluation --------------- */
+
+static ExprPyLike_Parsed *driver_compile_simple_expr_impl(ChannelDriver *driver)
+{
+ /* Prepare parameter names. */
+ int names_len = BLI_listbase_count(&driver->variables);
+ const char **names = BLI_array_alloca(names, names_len + 1);
+ int i = 0;
+
+ names[i++] = "frame";
+
+ for (DriverVar *dvar = driver->variables.first; dvar; dvar = dvar->next) {
+ names[i++] = dvar->name;
+ }
+
+ return BLI_expr_pylike_parse(driver->expression, names, names_len + 1);
+}
+
+static bool driver_evaluate_simple_expr(ChannelDriver *driver, ExprPyLike_Parsed *expr, float *result, float time)
+{
+ /* Prepare parameter values. */
+ int vars_len = BLI_listbase_count(&driver->variables);
+ double *vars = BLI_array_alloca(vars, vars_len + 1);
+ int i = 0;
+
+ vars[i++] = time;
+
+ for (DriverVar *dvar = driver->variables.first; dvar; dvar = dvar->next) {
+ vars[i++] = driver_get_variable_value(driver, dvar);
+ }
+
+ /* Evaluate expression. */
+ double result_val;
+ eExprPyLike_EvalStatus status = BLI_expr_pylike_eval(expr, vars, vars_len + 1, &result_val);
+ const char *message;
+
+ switch (status) {
+ case EXPR_PYLIKE_SUCCESS:
+ if (isfinite(result_val)) {
+ *result = (float)result_val;
+ }
+ return true;
+
+ case EXPR_PYLIKE_DIV_BY_ZERO:
+ case EXPR_PYLIKE_MATH_ERROR:
+ message = (status == EXPR_PYLIKE_DIV_BY_ZERO) ? "Division by Zero" : "Math Domain Error";
+ fprintf(stderr, "\n%s in Driver: '%s'\n", message, driver->expression);
+
+ driver->flag |= DRIVER_FLAG_INVALID;
+ return true;
+
+ default:
+ /* arriving here means a bug, not user error */
+ printf("Error: simple driver expression evaluation failed: '%s'\n", driver->expression);
+ return false;
+ }
+}
+
+/* Compile and cache the driver expression if necessary, with thread safety. */
+static bool driver_compile_simple_expr(ChannelDriver *driver)
+{
+ if (driver->expr_simple != NULL) {
+ return true;
+ }
+
+ if (driver->type != DRIVER_TYPE_PYTHON) {
+ return false;
+ }
+
+ /* It's safe to parse in multiple threads; at worst it'll
+ * waste some effort, but in return avoids mutex contention. */
+ ExprPyLike_Parsed *expr = driver_compile_simple_expr_impl(driver);
+
+ /* Store the result if the field is still NULL, or discard
+ * it if another thread got here first. */
+ if (atomic_cas_ptr((void **)&driver->expr_simple, NULL, expr) != NULL) {
+ BLI_expr_pylike_free(expr);
+ }
+
+ return true;
+}
+
+/* Try using the simple expression evaluator to compute the result of the driver.
+ * On success, stores the result and returns true; on failure result is set to 0. */
+static bool driver_try_evaluate_simple_expr(ChannelDriver *driver, ChannelDriver *driver_orig, float *result, float time)
+{
+ *result = 0.0f;
+
+ return driver_compile_simple_expr(driver_orig) &&
+ BLI_expr_pylike_is_valid(driver_orig->expr_simple) &&
+ driver_evaluate_simple_expr(driver, driver_orig->expr_simple, result, time);
+}
+
+/* Check if the expression in the driver conforms to the simple subset. */
+bool BKE_driver_has_simple_expression(ChannelDriver *driver)
+{
+ return driver_compile_simple_expr(driver) && BLI_expr_pylike_is_valid(driver->expr_simple);
+}
+
+/* Reset cached compiled expression data */
+void BKE_driver_invalidate_expression(ChannelDriver *driver, bool expr_changed, bool varname_changed)
+{
+ if (expr_changed || varname_changed) {
+ BLI_expr_pylike_free(driver->expr_simple);
+ driver->expr_simple = NULL;
+ }
+
+#ifdef WITH_PYTHON
+ if (expr_changed) {
+ driver->flag |= DRIVER_FLAG_RECOMPILE;
+ }
+
+ if (varname_changed) {
+ driver->flag |= DRIVER_FLAG_RENAMEVAR;
+ }
+#endif
+}
+
/* Driver Evaluation -------------------------- */
/* Evaluate a Driver Variable to get a value that contributes to the final */
@@ -1997,14 +2110,14 @@ float evaluate_driver(PathResolvedRNA *anim_rna, ChannelDriver *driver, ChannelD
}
case DRIVER_TYPE_PYTHON: /* expression */
{
-#ifdef WITH_PYTHON
/* check for empty or invalid expression */
if ( (driver_orig->expression[0] == '\0') ||
(driver_orig->flag & DRIVER_FLAG_INVALID) )
{
driver->curval = 0.0f;
}
- else {
+ else if (!driver_try_evaluate_simple_expr(driver, driver_orig, &driver->curval, evaltime)) {
+#ifdef WITH_PYTHON
/* this evaluates the expression using Python, and returns its result:
* - on errors it reports, then returns 0.0f
*/
@@ -2013,17 +2126,17 @@ float evaluate_driver(PathResolvedRNA *anim_rna, ChannelDriver *driver, ChannelD
driver->curval = BPY_driver_exec(anim_rna, driver, driver_orig, evaltime);
BLI_mutex_unlock(&python_driver_lock);
- }
#else /* WITH_PYTHON*/
- UNUSED_VARS(anim_rna, evaltime);
+ UNUSED_VARS(anim_rna, evaltime);
#endif /* WITH_PYTHON*/
+ }
break;
}
default:
{
/* special 'hack' - just use stored value
- * This is currently used as the mechanism which allows animated settings to be able
- * to be changed via the UI.
+ * This is currently used as the mechanism which allows animated settings to be able
+ * to be changed via the UI.
*/
break;
}
@@ -2188,24 +2301,6 @@ static void berekeny(float f1, float f2, float f3, float f4, float *o, int b)
}
}
-#if 0
-static void berekenx(float *f, float *o, int b)
-{
- float t, c0, c1, c2, c3;
- int a;
-
- c0 = f[0];
- c1 = 3.0f * (f[3] - f[0]);
- c2 = 3.0f * (f[0] - 2.0f * f[3] + f[6]);
- c3 = f[9] - f[0] + 3.0f * (f[3] - f[6]);
-
- for (a = 0; a < b; a++) {
- t = o[a];
- o[a] = c0 + t * c1 + t * t * c2 + t * t * t * c3;
- }
-}
-#endif
-
/* -------------------------- */
diff --git a/source/blender/blenkernel/intern/fmodifier.c b/source/blender/blenkernel/intern/fmodifier.c
index b69bce088d2..4fede89e9ca 100644
--- a/source/blender/blenkernel/intern/fmodifier.c
+++ b/source/blender/blenkernel/intern/fmodifier.c
@@ -273,7 +273,7 @@ static void fcm_fn_generator_new_data(void *mdata)
}
/* Unary 'normalized sine' function
- * y = sin(PI + x) / (PI * x),
+ * y = sin(PI + x) / (PI * x),
* except for x = 0 when y = 1.
*/
static double sinc(double x)
@@ -835,27 +835,6 @@ static FModifierTypeInfo FMI_NOISE = {
NULL /* evaluate with storage */
};
-/* Filter F-Curve Modifier --------------------------- */
-
-#if 0 // XXX not yet implemented
-static FModifierTypeInfo FMI_FILTER = {
- FMODIFIER_TYPE_FILTER, /* type */
- sizeof(FMod_Filter), /* size */
- FMI_TYPE_REPLACE_VALUES, /* action type */
- 0, /* requirements */
- N_("Filter"), /* name */
- "FMod_Filter", /* struct name */
- NULL, /* free data */
- NULL, /* copy data */
- NULL, /* new data */
- NULL /*fcm_filter_verify*/, /* verify */
- NULL, /* evaluate time */
- fcm_filter_evaluate, /* evaluate */
- NULL, /* evaluate time with storage */
- NULL /* evaluate with storage */
-};
-#endif // XXX not yet implemented
-
/* Python F-Curve Modifier --------------------------- */
@@ -1284,7 +1263,7 @@ bool list_has_suitable_fmodifier(ListBase *modifiers, int mtype, short acttype)
const FModifierTypeInfo *fmi = fmodifier_get_typeinfo(fcm);
short mOk = 1, aOk = 1; /* by default 1, so that when only one test, won't fail */
- /* check if applicable ones are fullfilled */
+ /* check if applicable ones are fulfilled */
if (mtype)
mOk = (fcm->type == mtype);
if (acttype > -1)
diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c
index b5fba6d30e8..f6e1fabc6c0 100644
--- a/source/blender/blenkernel/intern/font.c
+++ b/source/blender/blenkernel/intern/font.c
@@ -360,7 +360,7 @@ VFont *BKE_vfont_builtin_get(void)
static VChar *find_vfont_char(VFontData *vfd, unsigned int character)
{
- return BLI_ghash_lookup(vfd->characters, SET_UINT_IN_POINTER(character));
+ return BLI_ghash_lookup(vfd->characters, POINTER_FROM_UINT(character));
}
static void build_underline(Curve *cu, ListBase *nubase, const rctf *rect,
@@ -605,7 +605,7 @@ void BKE_vfont_select_clamp(Object *ob)
static float char_width(Curve *cu, VChar *che, CharInfo *info)
{
- /* The character wasn't found, propably ascii = 0, then the width shall be 0 as well */
+ /* The character wasn't found, probably ascii = 0, then the width shall be 0 as well */
if (che == NULL) {
return 0.0f;
}
@@ -635,6 +635,22 @@ struct TempLineInfo {
int wspace_nr; /* number of whitespaces of line */
};
+/**
+ * Font metric values explained:
+ *
+ * Baseline: Line where the text "rests", used as the origin vertical position for the glyphs.
+ * Em height: Space most glyphs should fit within.
+ * Ascent: the recommended distance above the baseline to fit most characters.
+ * Descent: the recommended distance below the baseline to fit most characters.
+ *
+ * We obtain ascent and descent from the font itself (FT_Face->ascender / face->height).
+ * And in some cases it is even the same value as FT_Face->bbox.yMax/yMin (font top and bottom respectively).
+ *
+ * The em_height here is relative to FT_Face->bbox.
+*/
+#define ASCENT(vfd) ((vfd)->ascender * (vfd)->em_height)
+#define DESCENT(vfd) ((vfd)->em_height - ASCENT(vfd))
+
bool BKE_vfont_to_curve_ex(Object *ob, Curve *cu, int mode, ListBase *r_nubase,
const wchar_t **r_text, int *r_text_len, bool *r_text_free,
struct CharTrans **r_chartransdata)
@@ -648,8 +664,6 @@ bool BKE_vfont_to_curve_ex(Object *ob, Curve *cu, int mode, ListBase *r_nubase,
bool use_textbox;
VChar *che;
struct CharTrans *chartransdata = NULL, *ct;
- /* Text at the beginning of the last used text-box (use for y-axis alignment). */
- int i_textbox = 0;
struct TempLineInfo *lineinfo;
float *f, xof, yof, xtrax, linedist;
float twidth, maxlen = 0;
@@ -663,6 +677,10 @@ bool BKE_vfont_to_curve_ex(Object *ob, Curve *cu, int mode, ListBase *r_nubase,
const float xof_scale = cu->xof / cu->fsize;
const float yof_scale = cu->yof / cu->fsize;
+ /* Text at the beginning of the last used text-box (use for y-axis alignment).
+ * We overallocate by one to simplify logic of getting last char. */
+ int *i_textbox_array = MEM_callocN(sizeof(*i_textbox_array) * (cu->totbox + 1), "TextBox initial char index");
+
#define MARGIN_X_MIN (xof_scale + tb_scale.x)
#define MARGIN_Y_MIN (yof_scale + tb_scale.y)
@@ -862,9 +880,9 @@ makebreak:
(cu->totbox > (curbox + 1)) &&
((-(yof - tb_scale.y)) > (tb_scale.h - linedist) - yof_scale))
{
- i_textbox = i + 1;
maxlen = 0;
curbox++;
+ i_textbox_array[curbox] = i + 1;
textbox_scale(&tb_scale, &cu->tb[curbox], 1.0f / cu->fsize);
@@ -1019,50 +1037,73 @@ makebreak:
/* top-baseline is default, in this case, do nothing */
if (cu->align_y != CU_ALIGN_Y_TOP_BASELINE) {
if (tb_scale.h != 0.0f) {
- /* top and top-baseline are the same when text-boxes are used */
- if (cu->align_y != CU_ALIGN_Y_TOP && i_textbox < slen) {
- /* all previous textboxes are 'full', only align the last used text-box */
- float yoff = 0.0f;
+ /* We need to loop all the text-boxes even the "full" ones.
+ * This way they all get the same vertical padding. */
+ for (int tb_index = 0; tb_index < cu->totbox; tb_index++) {
+ struct CharTrans *ct_first, *ct_last;
+ const int i_textbox = i_textbox_array[tb_index];
+ const int i_textbox_next = i_textbox_array[tb_index + 1];
+ const bool is_last_filled_textbox = ELEM(i_textbox_next, 0, slen + 1);
int lines;
- struct CharTrans *ct_last, *ct_textbox;
- ct_last = chartransdata + slen - 1;
- ct_textbox = chartransdata + i_textbox;
+ ct_first = chartransdata + i_textbox;
+ ct_last = chartransdata + (is_last_filled_textbox ? slen: i_textbox_next - 1);
+ lines = ct_last->linenr - ct_first->linenr + 1;
- lines = ct_last->linenr - ct_textbox->linenr + 1;
- if (mem[slen - 1] == '\n') {
- lines++;
- }
+ textbox_scale(&tb_scale, &cu->tb[tb_index], 1.0f / cu->fsize);
+ /* The initial Y origin of the textbox is hardcoded to 1.0f * text scale. */
+ const float textbox_y_origin = 1.0f;
+ float yoff = 0.0f;
- if (cu->align_y == CU_ALIGN_Y_BOTTOM) {
- yoff = (lines * linedist) - tb_scale.h;
- }
- else if (cu->align_y == CU_ALIGN_Y_CENTER) {
- yoff = 0.5f * ((lines * linedist) - tb_scale.h);
+ switch (cu->align_y) {
+ case CU_ALIGN_Y_TOP_BASELINE:
+ break;
+ case CU_ALIGN_Y_TOP:
+ yoff = textbox_y_origin - ASCENT(vfd);
+ break;
+ case CU_ALIGN_Y_CENTER:
+ yoff = ((((vfd->em_height + (lines - 1) * linedist) * 0.5f) - ASCENT(vfd)) -
+ (tb_scale.h * 0.5f) + textbox_y_origin);
+ break;
+ case CU_ALIGN_Y_BOTTOM_BASELINE:
+ yoff = textbox_y_origin + ((lines - 1) * linedist) - tb_scale.h;
+ break;
+ case CU_ALIGN_Y_BOTTOM:
+ yoff = textbox_y_origin + ((lines - 1) * linedist) - tb_scale.h + DESCENT(vfd);
+ break;
}
- ct = ct_textbox;
- for (i = i_textbox - 1; i < slen; i++) {
+ for (ct = ct_first; ct <= ct_last; ct++) {
ct->yof += yoff;
- ct++;
+ }
+
+ if (is_last_filled_textbox) {
+ break;
}
}
}
else {
- /* non text-box case handled separately */
- ct = chartransdata;
+ /* Non text-box case handled separately. */
float yoff = 0.0f;
- if (cu->align_y == CU_ALIGN_Y_TOP) {
- yoff = -linedist;
- }
- else if (cu->align_y == CU_ALIGN_Y_BOTTOM) {
- yoff = (lnr - 1.0f) * linedist;
- }
- else if (cu->align_y == CU_ALIGN_Y_CENTER) {
- yoff = (lnr - 2.0f) * linedist * 0.5f;
+ switch (cu->align_y) {
+ case CU_ALIGN_Y_TOP_BASELINE:
+ break;
+ case CU_ALIGN_Y_TOP:
+ yoff = -ASCENT(vfd);
+ break;
+ case CU_ALIGN_Y_CENTER:
+ yoff = ((vfd->em_height + (lnr - 1) * linedist) * 0.5f) - ASCENT(vfd);
+ break;
+ case CU_ALIGN_Y_BOTTOM_BASELINE:
+ yoff = (lnr - 1) * linedist;
+ break;
+ case CU_ALIGN_Y_BOTTOM:
+ yoff = (lnr - 1) * linedist + DESCENT(vfd);
+ break;
}
+ ct = chartransdata;
for (i = 0; i <= slen; i++) {
ct->yof += yoff;
ct++;
@@ -1071,12 +1112,13 @@ makebreak:
}
MEM_freeN(lineinfo);
+ MEM_freeN(i_textbox_array);
/* TEXT ON CURVE */
/* Note: Only OB_CURVE objects could have a path */
if (cu->textoncurve && cu->textoncurve->type == OB_CURVE) {
BLI_assert(cu->textoncurve->runtime.curve_cache != NULL);
- if (cu->textoncurve->runtime.curve_cache->path) {
+ if (cu->textoncurve->runtime.curve_cache != NULL && cu->textoncurve->runtime.curve_cache->path != NULL) {
float distfac, imat[4][4], imat3[3][3], cmat[3][3];
float minx, maxx, miny, maxy;
float timeofs, sizefac;
@@ -1190,13 +1232,13 @@ makebreak:
}
}
- if (mode == FO_CURSUP || mode == FO_CURSDOWN || mode == FO_PAGEUP || mode == FO_PAGEDOWN) {
+ if (ELEM(mode, FO_CURSUP, FO_CURSDOWN, FO_PAGEUP, FO_PAGEDOWN)) {
ct = &chartransdata[ef->pos];
- if ((mode == FO_CURSUP || mode == FO_PAGEUP) && ct->linenr == 0) {
+ if (ELEM(mode, FO_CURSUP, FO_PAGEUP) && ct->linenr == 0) {
/* pass */
}
- else if ((mode == FO_CURSDOWN || mode == FO_PAGEDOWN) && ct->linenr == lnr) {
+ else if (ELEM(mode, FO_CURSDOWN, FO_PAGEDOWN) && ct->linenr == lnr) {
/* pass */
}
else {
@@ -1339,6 +1381,8 @@ finally:
#undef MARGIN_Y_MIN
}
+#undef DESCENT
+#undef ASCENT
bool BKE_vfont_to_curve_nubase(Object *ob, int mode, ListBase *r_nubase)
{
@@ -1348,6 +1392,7 @@ bool BKE_vfont_to_curve_nubase(Object *ob, int mode, ListBase *r_nubase)
NULL, NULL, NULL, NULL);
}
+/** Warning: expects to have access to evaluated data (i.e. passed object should be evaluated one...). */
bool BKE_vfont_to_curve(Object *ob, int mode)
{
Curve *cu = ob->data;
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 63e224fddd2..36d4c1e5958 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -1236,6 +1236,7 @@ static void do_marking(FractureModifierData *fmd, Mesh *result)
void BKE_fracture_copy_customdata(CustomData* src, CustomData* dst,CustomDataMask mask, int src_ofs, int dst_ofs,
int copyelem, int totelem)
{
+ //CustomData_copy_data(src, dst, src_ofs, dst_ofs, copyelem);
CustomDataLayer *layer;
int i;
for (i = 0; i < src->totlayer; i++)
@@ -1395,7 +1396,7 @@ Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, Scene *
mul_m4_v3(imat, mv->co);
}
- BLI_ghash_insert(fmd->shared->vert_index_map, SET_INT_IN_POINTER(vertstart + v), SET_INT_IN_POINTER(mi->id));
+ BLI_ghash_insert(fmd->shared->vert_index_map, POINTER_FROM_INT(vertstart + v), POINTER_FROM_INT(mi->id));
}
memcpy(mesh->mpoly + polystart, mi->mesh->mpoly, mi->mesh->totpoly * sizeof(MPoly));
@@ -1405,7 +1406,7 @@ Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, Scene *
mp->loopstart += loopstart;
/* material index lookup and correction, avoid having the same material in different slots */
- //index = GET_INT_FROM_POINTER(BLI_ghash_lookup(mat_index_map, SET_INT_IN_POINTER(mp->mat_nr + fmd->shared->matstart)));
+ //index = POINTER_AS_INT(BLI_ghash_lookup(mat_index_map, POINTER_FROM_INT(mp->mat_nr + fmd->shared->matstart)));
//mp->mat_nr = index-1;
}
@@ -1513,7 +1514,7 @@ void BKE_update_velocity_layer(FractureModifierData *fmd, Mesh *dm)
for (i = 0; i < totvert; i++)
{
- mi = BLI_ghash_lookup(fmd->shared->vertex_island_map, SET_INT_IN_POINTER(i));
+ mi = BLI_ghash_lookup(fmd->shared->vertex_island_map, POINTER_FROM_INT(i));
if (!mi)
continue;
@@ -2699,8 +2700,8 @@ static short do_vert_index_map(FractureModifierData *fmd, MeshIsland *mi, MeshIs
{
CollectionObject* go = NULL;
/* autocreate clusters out of former objects, if we dont override */
- mi->particle_index = GET_INT_FROM_POINTER(BLI_ghash_lookup(fmd->shared->vert_index_map,
- SET_INT_IN_POINTER(mi->vertex_indices[0])));
+ mi->particle_index = POINTER_AS_INT(BLI_ghash_lookup(fmd->shared->vert_index_map,
+ POINTER_FROM_INT(mi->vertex_indices[0])));
/*look up whether original object is active or passive */
go = BLI_findlink(&fmd->dm_group->gobject, mi->particle_index);
@@ -3194,9 +3195,9 @@ static void do_island_index_map(FractureModifierData *fmd, Object* obj)
for (mi = fmdi->shared->mesh_islands.first; mi; mi = mi->next){
for (i = 0; i < mi->mesh->totvert; i++)
{
- if (!BLI_ghash_haskey(fmd->shared->vertex_island_map, SET_INT_IN_POINTER(i + j)))
+ if (!BLI_ghash_haskey(fmd->shared->vertex_island_map, POINTER_FROM_INT(i + j)))
{
- BLI_ghash_insert(fmd->shared->vertex_island_map, SET_INT_IN_POINTER(i + j), mi);
+ BLI_ghash_insert(fmd->shared->vertex_island_map, POINTER_FROM_INT(i + j), mi);
}
}
j += mi->mesh->totvert;
@@ -3211,9 +3212,9 @@ static void do_island_index_map(FractureModifierData *fmd, Object* obj)
for (mi = fmd->shared->mesh_islands.first; mi; mi = mi->next){
for (i = 0; i < mi->mesh->totvert; i++)
{
- if (!BLI_ghash_haskey(fmd->shared->vertex_island_map, SET_INT_IN_POINTER(i+j)))
+ if (!BLI_ghash_haskey(fmd->shared->vertex_island_map, POINTER_FROM_INT(i+j)))
{
- BLI_ghash_insert(fmd->shared->vertex_island_map, SET_INT_IN_POINTER(i+j), mi);
+ BLI_ghash_insert(fmd->shared->vertex_island_map, POINTER_FROM_INT(i+j), mi);
}
}
j += mi->mesh->totvert;
diff --git a/source/blender/blenkernel/intern/fracture_automerge.c b/source/blender/blenkernel/intern/fracture_automerge.c
index 3604bfa918d..a2b0b2c63c4 100644
--- a/source/blender/blenkernel/intern/fracture_automerge.c
+++ b/source/blender/blenkernel/intern/fracture_automerge.c
@@ -136,8 +136,8 @@ void BKE_fracture_face_pairs(FractureModifierData *fmd, Mesh *dm, Object *ob)
//printf("I, INDEX %d %d %f\n", i, index, n[j].dist);
v1 = mloop[mp->loopstart].v;
v2 = mloop[(mpoly+index)->loopstart].v;
- mi1 = BLI_ghash_lookup(fmd->shared->vertex_island_map, SET_INT_IN_POINTER(v1));
- mi2 = BLI_ghash_lookup(fmd->shared->vertex_island_map, SET_INT_IN_POINTER(v2));
+ mi1 = BLI_ghash_lookup(fmd->shared->vertex_island_map, POINTER_FROM_INT(v1));
+ mi2 = BLI_ghash_lookup(fmd->shared->vertex_island_map, POINTER_FROM_INT(v2));
if (mi1 != mi2) {
/*dont delete faces on own meshisland if they are closer than faces on adjacent island
@@ -148,9 +148,9 @@ void BKE_fracture_face_pairs(FractureModifierData *fmd, Mesh *dm, Object *ob)
j++;
}
- val = GET_INT_FROM_POINTER(BLI_ghash_lookup(fmd->shared->face_pairs, SET_INT_IN_POINTER(index)));
+ val = POINTER_AS_INT(BLI_ghash_lookup(fmd->shared->face_pairs, POINTER_FROM_INT(index)));
if (val != i && index != i) {
- BLI_ghash_insert(fmd->shared->face_pairs, SET_INT_IN_POINTER(index), SET_INT_IN_POINTER(i));
+ BLI_ghash_insert(fmd->shared->face_pairs, POINTER_FROM_INT(index), POINTER_FROM_INT(i));
pairs++;
/*match normals...*/
if (fmd->fix_normals) {
@@ -177,7 +177,7 @@ static void find_other_face(FractureModifierData *fmd, int i, BMesh* bm, Object*
{
float f_centr[3], f_centr_other[3];
BMFace *f1, *f2;
- int other = GET_INT_FROM_POINTER(BLI_ghash_lookup(fmd->shared->face_pairs, SET_INT_IN_POINTER(i)));
+ int other = POINTER_AS_INT(BLI_ghash_lookup(fmd->shared->face_pairs, POINTER_FROM_INT(i)));
int inner_index = BKE_object_material_slot_find_index(ob, fmd->inner_material) - 1;
if ((other == i))
@@ -734,9 +734,9 @@ void BKE_fracture_shared_vert_groups(FractureModifierData* fmd, Mesh* dm, ListBa
for (j = 0; j < r; j++)
{
index = n[j].index;
- if (!BLI_ghash_haskey(visit, SET_INT_IN_POINTER(index)))
+ if (!BLI_ghash_haskey(visit, POINTER_FROM_INT(index)))
{
- BLI_ghash_insert(visit, SET_INT_IN_POINTER(index), SET_INT_IN_POINTER(index));
+ BLI_ghash_insert(visit, POINTER_FROM_INT(index), POINTER_FROM_INT(index));
if (i != index)
{
diff --git a/source/blender/blenkernel/intern/fracture_constraints.c b/source/blender/blenkernel/intern/fracture_constraints.c
index 18545e328a7..f66e3be0c2d 100644
--- a/source/blender/blenkernel/intern/fracture_constraints.c
+++ b/source/blender/blenkernel/intern/fracture_constraints.c
@@ -223,7 +223,7 @@ static void create_constraints(FractureModifierData *rmd, Object *ob, Scene *sce
}
else if (rmd->constraint_target == MOD_FRACTURE_VERTEX) {
MeshIsland *mii = NULL;
- mii = BLI_ghash_lookup(rmd->shared->vertex_island_map, SET_INT_IN_POINTER(i));
+ mii = BLI_ghash_lookup(rmd->shared->vertex_island_map, POINTER_FROM_INT(i));
search_tree_based(rmd, mii, mesh_islands, &coord_tree, mvert[i].co, ob, scene);
}
}
@@ -286,7 +286,7 @@ static void search_tree_based(FractureModifierData *rmd, MeshIsland *mi, MeshIsl
}
else if(rmd->constraint_target == MOD_FRACTURE_VERTEX) {
int index = (n3 + i)->index;
- mi2 = BLI_ghash_lookup(rmd->shared->vertex_island_map, SET_INT_IN_POINTER(index));
+ mi2 = BLI_ghash_lookup(rmd->shared->vertex_island_map, POINTER_FROM_INT(index));
}
if ((mi != mi2) && (mi2 != NULL)) {
float thresh = rmd->breaking_threshold;
diff --git a/source/blender/blenkernel/intern/fracture_external.c b/source/blender/blenkernel/intern/fracture_external.c
index ad7a6859c39..37b0242c59d 100644
--- a/source/blender/blenkernel/intern/fracture_external.c
+++ b/source/blender/blenkernel/intern/fracture_external.c
@@ -74,8 +74,8 @@ int fracture_collect_defgrp(Object* o, Object* ob, int defstart, GHash** def_ind
index = BLI_listbase_count(&ob->defbase)-1;
}
- if (!BLI_ghash_haskey(*def_index_map, SET_INT_IN_POINTER(key)))
- BLI_ghash_insert(*def_index_map, SET_INT_IN_POINTER(key), SET_INT_IN_POINTER(index));
+ if (!BLI_ghash_haskey(*def_index_map, POINTER_FROM_INT(key)))
+ BLI_ghash_insert(*def_index_map, POINTER_FROM_INT(key), POINTER_FROM_INT(index));
k++;
}
@@ -106,9 +106,9 @@ short BKE_fracture_collect_materials(Main* bmain, Object* o, Object* ob, int mat
assign_material(bmain, ob, (*matarar)[j], index, BKE_MAT_ASSIGN_USERPREF);
}
- key = SET_INT_IN_POINTER(matstart+j);
+ key = POINTER_FROM_INT(matstart+j);
if (!BLI_ghash_haskey(*mat_index_map, key))
- BLI_ghash_insert(*mat_index_map, key, SET_INT_IN_POINTER(index));
+ BLI_ghash_insert(*mat_index_map, key, POINTER_FROM_INT(index));
}
return (*totcolp);
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 6d771148723..e6d5514a0f1 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -169,8 +169,6 @@ bool BKE_gpencil_free_frame_runtime_data(bGPDframe *derived_gpf)
}
BLI_listbase_clear(&derived_gpf->strokes);
- MEM_SAFE_FREE(derived_gpf);
-
return true;
}
@@ -216,18 +214,17 @@ void BKE_gpencil_free_layers(ListBase *list)
/* clear all runtime derived data */
static void BKE_gpencil_clear_derived(bGPDlayer *gpl)
{
- GHashIterator gh_iter;
-
- if (gpl->runtime.derived_data == NULL) {
+ if (gpl->runtime.derived_array == NULL) {
return;
}
- GHASH_ITER(gh_iter, gpl->runtime.derived_data) {
- bGPDframe *gpf = (bGPDframe *)BLI_ghashIterator_getValue(&gh_iter);
- if (gpf) {
- BKE_gpencil_free_frame_runtime_data(gpf);
- }
+ for (int i = 0; i < gpl->runtime.len_derived; i++) {
+ bGPDframe *derived_gpf = &gpl->runtime.derived_array[i];
+ BKE_gpencil_free_frame_runtime_data(derived_gpf);
+ derived_gpf = NULL;
}
+ gpl->runtime.len_derived = 0;
+ MEM_SAFE_FREE(gpl->runtime.derived_array);
}
/* Free all of the gp-layers temp data*/
@@ -241,11 +238,6 @@ static void BKE_gpencil_free_layers_temp_data(ListBase *list)
for (bGPDlayer *gpl = list->first; gpl; gpl = gpl_next) {
gpl_next = gpl->next;
BKE_gpencil_clear_derived(gpl);
-
- if (gpl->runtime.derived_data) {
- BLI_ghash_free(gpl->runtime.derived_data, NULL, NULL);
- gpl->runtime.derived_data = NULL;
- }
}
}
@@ -256,11 +248,6 @@ void BKE_gpencil_free_derived_frames(bGPdata *gpd)
if (gpd == NULL) return;
for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
BKE_gpencil_clear_derived(gpl);
-
- if (gpl->runtime.derived_data) {
- BLI_ghash_free(gpl->runtime.derived_data, NULL, NULL);
- gpl->runtime.derived_data = NULL;
- }
}
}
@@ -399,7 +386,8 @@ bGPDframe *BKE_gpencil_frame_addcopy(bGPDlayer *gpl, int cframe)
/* add a new gp-layer and make it the active layer */
bGPDlayer *BKE_gpencil_layer_addnew(bGPdata *gpd, const char *name, bool setactive)
{
- bGPDlayer *gpl;
+ bGPDlayer *gpl = NULL;
+ bGPDlayer *gpl_active = NULL;
/* check that list is ok */
if (gpd == NULL)
@@ -408,8 +396,16 @@ bGPDlayer *BKE_gpencil_layer_addnew(bGPdata *gpd, const char *name, bool setacti
/* allocate memory for frame and add to end of list */
gpl = MEM_callocN(sizeof(bGPDlayer), "bGPDlayer");
+ gpl_active = BKE_gpencil_layer_getactive(gpd);
+
/* add to datablock */
- BLI_addtail(&gpd->layers, gpl);
+ if (gpl_active == NULL) {
+ BLI_addtail(&gpd->layers, gpl);
+ }
+ else {
+ /* if active layer, add after that layer */
+ BLI_insertlinkafter(&gpd->layers, gpl_active, gpl);
+ }
/* annotation vs GP Object behaviour is slightly different */
if (gpd->flag & GP_DATA_ANNOTATIONS) {
@@ -458,14 +454,19 @@ bGPdata *BKE_gpencil_data_addnew(Main *bmain, const char name[])
/* general flags */
gpd->flag |= GP_DATA_VIEWALIGN;
+ gpd->flag |= GP_DATA_STROKE_FORCE_RECALC;
/* GP object specific settings */
ARRAY_SET_ITEMS(gpd->line_color, 0.6f, 0.6f, 0.6f, 0.5f);
gpd->xray_mode = GP_XRAY_3DSPACE;
- gpd->runtime.batch_cache_data = NULL;
gpd->pixfactor = GP_DEFAULT_PIX_FACTOR;
+ /* grid settings */
+ ARRAY_SET_ITEMS(gpd->grid.color, 0.5f, 0.5f, 0.5f); // Color
+ ARRAY_SET_ITEMS(gpd->grid.scale, 1.0f, 1.0f); // Scale
+ gpd->grid.lines = GP_DEFAULT_GRID_LINES; // Number of lines
+
/* onion-skinning settings (datablock level) */
gpd->onion_flag |= (GP_ONION_GHOST_PREVCOL | GP_ONION_GHOST_NEXTCOL);
gpd->onion_flag |= GP_ONION_FADE;
@@ -638,7 +639,8 @@ bGPDlayer *BKE_gpencil_layer_duplicate(const bGPDlayer *gpl_src)
/* make a copy of source layer */
gpl_dst = MEM_dupallocN(gpl_src);
gpl_dst->prev = gpl_dst->next = NULL;
- gpl_dst->runtime.derived_data = NULL;
+ gpl_dst->runtime.derived_array = NULL;
+ gpl_dst->runtime.len_derived = 0;
/* copy frames */
BLI_listbase_clear(&gpl_dst->frames);
@@ -666,9 +668,6 @@ bGPDlayer *BKE_gpencil_layer_duplicate(const bGPDlayer *gpl_src)
*/
void BKE_gpencil_copy_data(bGPdata *gpd_dst, const bGPdata *gpd_src, const int UNUSED(flag))
{
- /* cache data is not duplicated */
- gpd_dst->runtime.batch_cache_data = NULL;
-
/* duplicate material array */
if (gpd_src->mat) {
gpd_dst->mat = MEM_dupallocN(gpd_src->mat);
@@ -714,7 +713,6 @@ bGPdata *BKE_gpencil_data_duplicate(Main *bmain, const bGPdata *gpd_src, bool in
else {
BLI_assert(bmain != NULL);
BKE_id_copy_ex(bmain, &gpd_src->id, (ID **)&gpd_dst, 0, false);
- gpd_dst->runtime.batch_cache_data = NULL;
}
/* Copy internal data (layers, etc.) */
@@ -782,7 +780,7 @@ void BKE_gpencil_frame_delete_laststroke(bGPDlayer *gpl, bGPDframe *gpf)
/* if frame has no strokes after this, delete it */
if (BLI_listbase_is_empty(&gpf->strokes)) {
BKE_gpencil_layer_delframe(gpl, gpf);
- BKE_gpencil_layer_getframe(gpl, cfra, 0);
+ BKE_gpencil_layer_getframe(gpl, cfra, GP_GETFRAME_USE_PREV);
}
}
@@ -1006,11 +1004,18 @@ void BKE_gpencil_layer_setactive(bGPdata *gpd, bGPDlayer *active)
return;
/* loop over layers deactivating all */
- for (gpl = gpd->layers.first; gpl; gpl = gpl->next)
+ for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
gpl->flag &= ~GP_LAYER_ACTIVE;
+ if (gpd->flag & GP_DATA_AUTOLOCK_LAYERS) {
+ gpl->flag |= GP_LAYER_LOCKED;
+ }
+ }
/* set as active one */
active->flag |= GP_LAYER_ACTIVE;
+ if (gpd->flag & GP_DATA_AUTOLOCK_LAYERS) {
+ active->flag &= ~GP_LAYER_LOCKED;
+ }
}
/* delete the active gp-layer */
@@ -1028,10 +1033,6 @@ void BKE_gpencil_layer_delete(bGPdata *gpd, bGPDlayer *gpl)
/* free derived data */
BKE_gpencil_clear_derived(gpl);
- if (gpl->runtime.derived_data) {
- BLI_ghash_free(gpl->runtime.derived_data, NULL, NULL);
- gpl->runtime.derived_data = NULL;
- }
BLI_freelinkN(&gpd->layers, gpl);
}
@@ -1101,22 +1102,35 @@ bool BKE_gpencil_stroke_minmax(
}
/* get min/max bounds of all strokes in GP datablock */
-static void gpencil_minmax(bGPdata *gpd, float r_min[3], float r_max[3])
+bool BKE_gpencil_data_minmax(Object *ob, const bGPdata *gpd, float r_min[3], float r_max[3])
{
+ float bmat[3][3];
+ bool changed = false;
+
INIT_MINMAX(r_min, r_max);
if (gpd == NULL)
- return;
+ return changed;
for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
bGPDframe *gpf = gpl->actframe;
if (gpf != NULL) {
for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
- BKE_gpencil_stroke_minmax(gps, false, r_min, r_max);
+ changed = BKE_gpencil_stroke_minmax(gps, false, r_min, r_max);
}
}
}
+
+ if ((changed) && (ob)) {
+ copy_m3_m4(bmat, ob->obmat);
+ mul_m3_v3(bmat, r_min);
+ add_v3_v3(r_min, ob->obmat[3]);
+ mul_m3_v3(bmat, r_max);
+ add_v3_v3(r_max, ob->obmat[3]);
+ }
+
+ return changed;
}
/* compute center of bounding box */
@@ -1124,7 +1138,7 @@ void BKE_gpencil_centroid_3D(bGPdata *gpd, float r_centroid[3])
{
float min[3], max[3], tot[3];
- gpencil_minmax(gpd, min, max);
+ BKE_gpencil_data_minmax(NULL, gpd, min, max);
add_v3_v3v3(tot, min, max);
mul_v3_v3fl(r_centroid, tot, 0.5f);
@@ -1145,7 +1159,7 @@ static void boundbox_gpencil(Object *ob)
bb = ob->bb;
gpd = ob->data;
- gpencil_minmax(gpd, min, max);
+ BKE_gpencil_data_minmax(NULL, gpd, min, max);
BKE_boundbox_init_from_minmax(bb, min, max);
bb->flag &= ~BOUNDBOX_DIRTY;
@@ -1221,11 +1235,13 @@ void BKE_gpencil_vgroup_remove(Object *ob, bDeformGroup *defgroup)
for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
- for (int i = 0; i < gps->totpoints; i++) {
- dvert = &gps->dvert[i];
- MDeformWeight *dw = defvert_find_index(dvert, def_nr);
- if (dw != NULL) {
- defvert_remove_group(dvert, dw);
+ if (gps->dvert != NULL) {
+ for (int i = 0; i < gps->totpoints; i++) {
+ dvert = &gps->dvert[i];
+ MDeformWeight *dw = defvert_find_index(dvert, def_nr);
+ if (dw != NULL) {
+ defvert_remove_group(dvert, dw);
+ }
}
}
}
@@ -1235,6 +1251,7 @@ void BKE_gpencil_vgroup_remove(Object *ob, bDeformGroup *defgroup)
/* Remove the group */
BLI_freelinkN(&ob->defbase, defgroup);
+ DEG_id_tag_update(&gpd->id, OB_RECALC_OB | OB_RECALC_DATA);
}
@@ -1265,8 +1282,8 @@ bool BKE_gpencil_smooth_stroke(bGPDstroke *gps, int i, float inf)
}
/* Only affect endpoints by a fraction of the normal strength,
- * to prevent the stroke from shrinking too much
- */
+ * to prevent the stroke from shrinking too much
+ */
if ((i == 0) || (i == gps->totpoints - 1)) {
inf *= 0.1f;
}
@@ -1332,9 +1349,13 @@ bool BKE_gpencil_smooth_stroke_strength(bGPDstroke *gps, int point_index, float
ptc = &gps->points[after];
/* the optimal value is the corresponding to the interpolation of the strength
- * at the distance of point b
- */
- const float fac = line_point_factor_v3(&ptb->x, &pta->x, &ptc->x);
+ * at the distance of point b
+ */
+ float fac = line_point_factor_v3(&ptb->x, &pta->x, &ptc->x);
+ /* sometimes the factor can be wrong due stroke geometry, so use middle point */
+ if ((fac < 0.0f) || (fac > 1.0f)) {
+ fac = 0.5f;
+ }
const float optimal = (1.0f - fac) * pta->strength + fac * ptc->strength;
/* Based on influence factor, blend between original and optimal */
@@ -1350,7 +1371,7 @@ bool BKE_gpencil_smooth_stroke_thickness(bGPDstroke *gps, int point_index, float
bGPDspoint *ptb = &gps->points[point_index];
/* Do nothing if not enough points */
- if (gps->totpoints <= 2) {
+ if ((gps->totpoints <= 2) || (point_index < 1)) {
return false;
}
@@ -1366,9 +1387,13 @@ bool BKE_gpencil_smooth_stroke_thickness(bGPDstroke *gps, int point_index, float
ptc = &gps->points[after];
/* the optimal value is the corresponding to the interpolation of the pressure
- * at the distance of point b
- */
+ * at the distance of point b
+ */
float fac = line_point_factor_v3(&ptb->x, &pta->x, &ptc->x);
+ /* sometimes the factor can be wrong due stroke geometry, so use middle point */
+ if ((fac < 0.0f) || (fac > 1.0f)) {
+ fac = 0.5f;
+ }
float optimal = interpf(ptc->pressure, pta->pressure, fac);
/* Based on influence factor, blend between original and optimal */
@@ -1400,9 +1425,13 @@ bool BKE_gpencil_smooth_stroke_uv(bGPDstroke *gps, int point_index, float influe
ptc = &gps->points[after];
/* the optimal value is the corresponding to the interpolation of the pressure
- * at the distance of point b
- */
+ * at the distance of point b
+ */
float fac = line_point_factor_v3(&ptb->x, &pta->x, &ptc->x);
+ /* sometimes the factor can be wrong due stroke geometry, so use middle point */
+ if ((fac < 0.0f) || (fac > 1.0f)) {
+ fac = 0.5f;
+ }
float optimal = interpf(ptc->uv_rot, pta->uv_rot, fac);
/* Based on influence factor, blend between original and optimal */
@@ -1450,6 +1479,11 @@ float BKE_gpencil_multiframe_falloff_calc(bGPDframe *gpf, int actnum, int f_init
float fnum = 0.5f; /* default mid curve */
float value;
+ /* check curve is available */
+ if (cur_falloff == NULL) {
+ return 1.0f;
+ }
+
/* frames to the right of the active frame */
if (gpf->framenum < actnum) {
fnum = (float)(gpf->framenum - f_init) / (actnum - f_init);
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index af82d8fa200..68691cd3d05 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -402,6 +402,20 @@ bool BKE_gpencil_has_geometry_modifiers(Object *ob)
return false;
}
+/* check if exist time modifiers */
+bool BKE_gpencil_has_time_modifiers(Object *ob)
+{
+ GpencilModifierData *md;
+ for (md = ob->greasepencil_modifiers.first; md; md = md->next) {
+ const GpencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md->type);
+
+ if (mti && mti->remapTime) {
+ return true;
+ }
+ }
+ return false;
+}
+
/* apply stroke modifiers */
void BKE_gpencil_stroke_modifiers(Depsgraph *depsgraph, Object *ob, bGPDlayer *gpl, bGPDframe *UNUSED(gpf), bGPDstroke *gps, bool is_render)
{
@@ -423,10 +437,10 @@ void BKE_gpencil_stroke_modifiers(Depsgraph *depsgraph, Object *ob, bGPDlayer *g
/* some modifiers could require a recalc of fill triangulation data */
if (gpd->flag & GP_DATA_STROKE_FORCE_RECALC) {
if (ELEM(md->type,
- eGpencilModifierType_Armature,
- eGpencilModifierType_Hook,
- eGpencilModifierType_Lattice,
- eGpencilModifierType_Offset))
+ eGpencilModifierType_Armature,
+ eGpencilModifierType_Hook,
+ eGpencilModifierType_Lattice,
+ eGpencilModifierType_Offset))
{
gps->flag |= GP_STROKE_RECALC_CACHES;
@@ -459,6 +473,36 @@ void BKE_gpencil_geometry_modifiers(Depsgraph *depsgraph, Object *ob, bGPDlayer
}
}
+/* apply time modifiers */
+int BKE_gpencil_time_modifier(Depsgraph *depsgraph, Scene *scene, Object *ob,
+ bGPDlayer *gpl, int cfra, bool is_render)
+{
+ GpencilModifierData *md;
+ bGPdata *gpd = ob->data;
+ const bool is_edit = GPENCIL_ANY_EDIT_MODE(gpd);
+ int nfra = cfra;
+
+ for (md = ob->greasepencil_modifiers.first; md; md = md->next) {
+ if (GPENCIL_MODIFIER_ACTIVE(md, is_render)) {
+ const GpencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md->type);
+
+ if (GPENCIL_MODIFIER_EDIT(md, is_edit)) {
+ continue;
+ }
+
+ if (mti->remapTime) {
+ nfra = mti->remapTime(md, depsgraph, scene, ob, gpl, cfra);
+ /* if the frame number changed, don't evaluate more and return */
+ if (nfra != cfra) {
+ return nfra;
+ }
+ }
+ }
+ }
+
+ /* if no time modifier, return original frame number */
+ return nfra;
+}
/* *************************************************** */
void BKE_gpencil_eval_geometry(Depsgraph *depsgraph,
@@ -583,8 +627,8 @@ void BKE_gpencil_modifier_copyData_generic(const GpencilModifierData *md_src, Gp
{
const GpencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md_src->type);
- /* md_dst may have alredy be fully initialized with some extra allocated data,
- * we need to free it now to avoid memleak. */
+ /* md_dst may have already be fully initialized with some extra allocated data,
+ * we need to free it now to avoid memleak. */
if (mti->freeData) {
mti->freeData(md_dst);
}
@@ -648,7 +692,9 @@ void BKE_gpencil_modifiers_foreachIDLink(Object *ob, GreasePencilIDWalkFunc walk
for (; md; md = md->next) {
const GpencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md->type);
- if (mti->foreachIDLink) mti->foreachIDLink(md, ob, walk, userData);
+ if (mti->foreachIDLink) {
+ mti->foreachIDLink(md, ob, walk, userData);
+ }
else if (mti->foreachObjectLink) {
/* each Object can masquerade as an ID, so this should be OK */
GreasePencilObjectWalkFunc fp = (GreasePencilObjectWalkFunc)walk;
@@ -674,47 +720,6 @@ GpencilModifierData *BKE_gpencil_modifiers_findByName(Object *ob, const char *na
return BLI_findstring(&(ob->greasepencil_modifiers), name, offsetof(GpencilModifierData, name));
}
-/* helper function for per-instance positioning */
-void BKE_gpencil_instance_modifier_instance_tfm(InstanceGpencilModifierData *mmd, const int elem_idx[3], float r_mat[4][4])
-{
- float offset[3], rot[3], scale[3];
- int ri = mmd->rnd[0];
- float factor;
-
- offset[0] = mmd->offset[0] * elem_idx[0];
- offset[1] = mmd->offset[1] * elem_idx[1];
- offset[2] = mmd->offset[2] * elem_idx[2];
-
- /* rotation */
- if (mmd->flag & GP_INSTANCE_RANDOM_ROT) {
- factor = mmd->rnd_rot * mmd->rnd[ri];
- mul_v3_v3fl(rot, mmd->rot, factor);
- add_v3_v3(rot, mmd->rot);
- }
- else {
- copy_v3_v3(rot, mmd->rot);
- }
-
- /* scale */
- if (mmd->flag & GP_INSTANCE_RANDOM_SIZE) {
- factor = mmd->rnd_size * mmd->rnd[ri];
- mul_v3_v3fl(scale, mmd->scale, factor);
- add_v3_v3(scale, mmd->scale);
- }
- else {
- copy_v3_v3(scale, mmd->scale);
- }
-
- /* advance random index */
- mmd->rnd[0]++;
- if (mmd->rnd[0] > 19) {
- mmd->rnd[0] = 1;
- }
-
- /* calculate matrix */
- loc_eul_size_to_mat4(r_mat, offset, rot, scale);
-}
-
void BKE_gpencil_subdivide(bGPDstroke *gps, int level, int flag)
{
bGPDspoint *temp_points;
@@ -731,7 +736,7 @@ void BKE_gpencil_subdivide(bGPDstroke *gps, int level, int flag)
temp_points = MEM_dupallocN(gps->points);
oldtotpoints = gps->totpoints;
- /* resize the points arrys */
+ /* resize the points arrays */
gps->totpoints += totnewpoints;
gps->points = MEM_recallocN(gps->points, sizeof(*gps->points) * gps->totpoints);
if (gps->dvert != NULL) {
diff --git a/source/blender/blenkernel/intern/icons.c b/source/blender/blenkernel/intern/icons.c
index 23cb6c71696..2a348751365 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -157,7 +157,7 @@ static int get_next_free_id(void)
return gNextIconId++;
/* now we try to find the smallest icon id not stored in the gIcons hash */
- while (BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(startId)) && startId >= gFirstIconId)
+ while (BLI_ghash_lookup(gIcons, POINTER_FROM_INT(startId)) && startId >= gFirstIconId)
startId++;
/* if we found a suitable one that isn't used yet, return it */
@@ -211,7 +211,7 @@ void BKE_icons_deferred_free(void)
node != NULL;
node = node->next)
{
- BLI_ghash_remove(gIcons, SET_INT_IN_POINTER(node->icon_id), NULL, icon_free);
+ BLI_ghash_remove(gIcons, POINTER_FROM_INT(node->icon_id), NULL, icon_free);
}
BLI_linklist_lockfree_clear(&g_icon_delete_queue, MEM_freeN);
}
@@ -522,7 +522,7 @@ void BKE_icon_changed(const int icon_id)
if (!icon_id || G.background) return;
- icon = BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(icon_id));
+ icon = BLI_ghash_lookup(gIcons, POINTER_FROM_INT(icon_id));
if (icon) {
/* We *only* expect ID-tied icons here, not non-ID icon/preview! */
@@ -557,7 +557,7 @@ static Icon *icon_create(int icon_id, int obj_type, void *obj)
new_icon->drawinfo = NULL;
new_icon->drawinfo_free = NULL;
- BLI_ghash_insert(gIcons, SET_INT_IN_POINTER(icon_id), new_icon);
+ BLI_ghash_insert(gIcons, POINTER_FROM_INT(icon_id), new_icon);
return new_icon;
}
@@ -687,7 +687,7 @@ Icon *BKE_icon_get(const int icon_id)
Icon *icon = NULL;
- icon = BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(icon_id));
+ icon = BLI_ghash_lookup(gIcons, POINTER_FROM_INT(icon_id));
if (!icon) {
printf("%s: Internal error, no icon for icon ID: %d\n", __func__, icon_id);
@@ -703,7 +703,7 @@ void BKE_icon_set(const int icon_id, struct Icon *icon)
void **val_p;
- if (BLI_ghash_ensure_p(gIcons, SET_INT_IN_POINTER(icon_id), &val_p)) {
+ if (BLI_ghash_ensure_p(gIcons, POINTER_FROM_INT(icon_id), &val_p)) {
printf("%s: Internal error, icon already set: %d\n", __func__, icon_id);
return;
}
@@ -732,7 +732,7 @@ void BKE_icon_id_delete(struct ID *id)
}
BKE_icons_deferred_free();
- BLI_ghash_remove(gIcons, SET_INT_IN_POINTER(icon_id), NULL, icon_free);
+ BLI_ghash_remove(gIcons, POINTER_FROM_INT(icon_id), NULL, icon_free);
}
/**
@@ -745,7 +745,7 @@ bool BKE_icon_delete(const int icon_id)
return false;
}
- Icon *icon = BLI_ghash_popkey(gIcons, SET_INT_IN_POINTER(icon_id), NULL);
+ Icon *icon = BLI_ghash_popkey(gIcons, POINTER_FROM_INT(icon_id), NULL);
if (icon) {
icon_free_data(icon_id, icon);
icon_free(icon);
@@ -763,10 +763,10 @@ bool BKE_icon_delete_unmanaged(const int icon_id)
return false;
}
- Icon *icon = BLI_ghash_popkey(gIcons, SET_INT_IN_POINTER(icon_id), NULL);
+ Icon *icon = BLI_ghash_popkey(gIcons, POINTER_FROM_INT(icon_id), NULL);
if (icon) {
if (UNLIKELY(icon->flag & ICON_FLAG_MANAGED)) {
- BLI_ghash_insert(gIcons, SET_INT_IN_POINTER(icon_id), icon);
+ BLI_ghash_insert(gIcons, POINTER_FROM_INT(icon_id), icon);
return false;
}
else {
diff --git a/source/blender/blenkernel/intern/idcode.c b/source/blender/blenkernel/intern/idcode.c
index 8328d71128a..d97c00f8229 100644
--- a/source/blender/blenkernel/intern/idcode.c
+++ b/source/blender/blenkernel/intern/idcode.c
@@ -39,7 +39,7 @@
#include "BLT_translation.h"
-#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_idcode.h"
typedef struct {
@@ -56,46 +56,46 @@ typedef struct {
/* WARNING! Keep it in sync with i18n contexts in BLT_translation.h */
static IDType idtypes[] = {
/** ID's directly below must all be in #Main, and be kept in sync with #MAX_LIBARRAY (membership, not order) */
- { ID_AC, "Action", "actions", BLT_I18NCONTEXT_ID_ACTION, IDTYPE_FLAGS_ISLINKABLE },
- { ID_AR, "Armature", "armatures", BLT_I18NCONTEXT_ID_ARMATURE, IDTYPE_FLAGS_ISLINKABLE },
- { ID_BR, "Brush", "brushes", BLT_I18NCONTEXT_ID_BRUSH, IDTYPE_FLAGS_ISLINKABLE },
- { ID_CA, "Camera", "cameras", BLT_I18NCONTEXT_ID_CAMERA, IDTYPE_FLAGS_ISLINKABLE },
- { ID_CF, "CacheFile", "cache_files", BLT_I18NCONTEXT_ID_CACHEFILE, IDTYPE_FLAGS_ISLINKABLE },
- { ID_GR, "Collection", "collections", BLT_I18NCONTEXT_ID_COLLECTION, IDTYPE_FLAGS_ISLINKABLE },
- { ID_CU, "Curve", "curves", BLT_I18NCONTEXT_ID_CURVE, IDTYPE_FLAGS_ISLINKABLE },
- { ID_GD, "GPencil", "grease_pencil", BLT_I18NCONTEXT_ID_GPENCIL, IDTYPE_FLAGS_ISLINKABLE }, /* rename gpencil */
- { ID_IM, "Image", "images", BLT_I18NCONTEXT_ID_IMAGE, IDTYPE_FLAGS_ISLINKABLE },
- { ID_IP, "Ipo", "ipos", "", IDTYPE_FLAGS_ISLINKABLE }, /* deprecated */
- { ID_KE, "Key", "shape_keys", BLT_I18NCONTEXT_ID_SHAPEKEY, 0 },
- { ID_LA, "Light", "lights", BLT_I18NCONTEXT_ID_LAMP, IDTYPE_FLAGS_ISLINKABLE },
- { ID_LI, "Library", "libraries", BLT_I18NCONTEXT_ID_LIBRARY, 0 },
- { ID_LS, "FreestyleLineStyle", "linestyles", BLT_I18NCONTEXT_ID_FREESTYLELINESTYLE, IDTYPE_FLAGS_ISLINKABLE },
- { ID_LT, "Lattice", "lattices", BLT_I18NCONTEXT_ID_LATTICE, IDTYPE_FLAGS_ISLINKABLE },
- { ID_MA, "Material", "materials", BLT_I18NCONTEXT_ID_MATERIAL, IDTYPE_FLAGS_ISLINKABLE },
- { ID_MB, "Metaball", "metaballs", BLT_I18NCONTEXT_ID_METABALL, IDTYPE_FLAGS_ISLINKABLE },
- { ID_MC, "MovieClip", "movieclips", BLT_I18NCONTEXT_ID_MOVIECLIP, IDTYPE_FLAGS_ISLINKABLE },
- { ID_ME, "Mesh", "meshes", BLT_I18NCONTEXT_ID_MESH, IDTYPE_FLAGS_ISLINKABLE },
- { ID_MSK, "Mask", "masks", BLT_I18NCONTEXT_ID_MASK, IDTYPE_FLAGS_ISLINKABLE },
- { ID_NT, "NodeTree", "node_groups", BLT_I18NCONTEXT_ID_NODETREE, IDTYPE_FLAGS_ISLINKABLE },
- { ID_OB, "Object", "objects", BLT_I18NCONTEXT_ID_OBJECT, IDTYPE_FLAGS_ISLINKABLE },
- { ID_PA, "ParticleSettings", "particles", BLT_I18NCONTEXT_ID_PARTICLESETTINGS, IDTYPE_FLAGS_ISLINKABLE },
- { ID_PAL, "Palettes", "palettes", BLT_I18NCONTEXT_ID_PALETTE, IDTYPE_FLAGS_ISLINKABLE },
- { ID_PC, "PaintCurve", "paint_curves", BLT_I18NCONTEXT_ID_PAINTCURVE, IDTYPE_FLAGS_ISLINKABLE },
- { ID_LP, "LightProbe", "light_probes", BLT_I18NCONTEXT_ID_LIGHTPROBE, IDTYPE_FLAGS_ISLINKABLE },
- { ID_SCE, "Scene", "scenes", BLT_I18NCONTEXT_ID_SCENE, IDTYPE_FLAGS_ISLINKABLE },
- { ID_SCR, "Screen", "screens", BLT_I18NCONTEXT_ID_SCREEN, IDTYPE_FLAGS_ISLINKABLE },
- { ID_SEQ, "Sequence", "sequences", BLT_I18NCONTEXT_ID_SEQUENCE, 0 }, /* not actually ID data */
- { ID_SPK, "Speaker", "speakers", BLT_I18NCONTEXT_ID_SPEAKER, IDTYPE_FLAGS_ISLINKABLE },
- { ID_SO, "Sound", "sounds", BLT_I18NCONTEXT_ID_SOUND, IDTYPE_FLAGS_ISLINKABLE },
- { ID_TE, "Texture", "textures", BLT_I18NCONTEXT_ID_TEXTURE, IDTYPE_FLAGS_ISLINKABLE },
- { ID_TXT, "Text", "texts", BLT_I18NCONTEXT_ID_TEXT, IDTYPE_FLAGS_ISLINKABLE },
- { ID_VF, "VFont", "fonts", BLT_I18NCONTEXT_ID_VFONT, IDTYPE_FLAGS_ISLINKABLE },
- { ID_WO, "World", "worlds", BLT_I18NCONTEXT_ID_WORLD, IDTYPE_FLAGS_ISLINKABLE },
- { ID_WM, "WindowManager", "window_managers", BLT_I18NCONTEXT_ID_WINDOWMANAGER, 0 },
- { ID_WS, "WorkSpace", "workspaces", BLT_I18NCONTEXT_ID_WORKSPACE, IDTYPE_FLAGS_ISLINKABLE },
+ {ID_AC, "Action", "actions", BLT_I18NCONTEXT_ID_ACTION, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_AR, "Armature", "armatures", BLT_I18NCONTEXT_ID_ARMATURE, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_BR, "Brush", "brushes", BLT_I18NCONTEXT_ID_BRUSH, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_CA, "Camera", "cameras", BLT_I18NCONTEXT_ID_CAMERA, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_CF, "CacheFile", "cache_files", BLT_I18NCONTEXT_ID_CACHEFILE, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_GR, "Collection", "collections", BLT_I18NCONTEXT_ID_COLLECTION, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_CU, "Curve", "curves", BLT_I18NCONTEXT_ID_CURVE, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_GD, "GPencil", "grease_pencil", BLT_I18NCONTEXT_ID_GPENCIL, IDTYPE_FLAGS_ISLINKABLE}, /* rename gpencil */
+ {ID_IM, "Image", "images", BLT_I18NCONTEXT_ID_IMAGE, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_IP, "Ipo", "ipos", "", IDTYPE_FLAGS_ISLINKABLE}, /* deprecated */
+ {ID_KE, "Key", "shape_keys", BLT_I18NCONTEXT_ID_SHAPEKEY, 0 },
+ {ID_LA, "Light", "lights", BLT_I18NCONTEXT_ID_LAMP, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_LI, "Library", "libraries", BLT_I18NCONTEXT_ID_LIBRARY, 0 },
+ {ID_LS, "FreestyleLineStyle", "linestyles", BLT_I18NCONTEXT_ID_FREESTYLELINESTYLE, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_LT, "Lattice", "lattices", BLT_I18NCONTEXT_ID_LATTICE, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_MA, "Material", "materials", BLT_I18NCONTEXT_ID_MATERIAL, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_MB, "Metaball", "metaballs", BLT_I18NCONTEXT_ID_METABALL, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_MC, "MovieClip", "movieclips", BLT_I18NCONTEXT_ID_MOVIECLIP, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_ME, "Mesh", "meshes", BLT_I18NCONTEXT_ID_MESH, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_MSK, "Mask", "masks", BLT_I18NCONTEXT_ID_MASK, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_NT, "NodeTree", "node_groups", BLT_I18NCONTEXT_ID_NODETREE, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_OB, "Object", "objects", BLT_I18NCONTEXT_ID_OBJECT, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_PA, "ParticleSettings", "particles", BLT_I18NCONTEXT_ID_PARTICLESETTINGS, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_PAL, "Palettes", "palettes", BLT_I18NCONTEXT_ID_PALETTE, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_PC, "PaintCurve", "paint_curves", BLT_I18NCONTEXT_ID_PAINTCURVE, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_LP, "LightProbe", "light_probes", BLT_I18NCONTEXT_ID_LIGHTPROBE, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_SCE, "Scene", "scenes", BLT_I18NCONTEXT_ID_SCENE, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_SCR, "Screen", "screens", BLT_I18NCONTEXT_ID_SCREEN, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_SEQ, "Sequence", "sequences", BLT_I18NCONTEXT_ID_SEQUENCE, 0 }, /* not actually ID data */
+ {ID_SPK, "Speaker", "speakers", BLT_I18NCONTEXT_ID_SPEAKER, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_SO, "Sound", "sounds", BLT_I18NCONTEXT_ID_SOUND, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_TE, "Texture", "textures", BLT_I18NCONTEXT_ID_TEXTURE, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_TXT, "Text", "texts", BLT_I18NCONTEXT_ID_TEXT, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_VF, "VFont", "fonts", BLT_I18NCONTEXT_ID_VFONT, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_WO, "World", "worlds", BLT_I18NCONTEXT_ID_WORLD, IDTYPE_FLAGS_ISLINKABLE},
+ {ID_WM, "WindowManager", "window_managers", BLT_I18NCONTEXT_ID_WINDOWMANAGER, 0 },
+ {ID_WS, "WorkSpace", "workspaces", BLT_I18NCONTEXT_ID_WORKSPACE, IDTYPE_FLAGS_ISLINKABLE},
/** Keep last, not an ID exactly, only include for completeness */
- { ID_ID, "ID", "ids", BLT_I18NCONTEXT_ID_ID, 0 }, /* plural is fake */
+ {ID_ID, "ID", "ids", BLT_I18NCONTEXT_ID_ID, 0 }, /* plural is fake */
};
/* -1 for ID_ID */
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index aedbd0673c2..f1a921650f0 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -68,7 +68,6 @@
#include "BLI_timecode.h" /* for stamp timecode format */
#include "BLI_utildefines.h"
-#include "BKE_bmfont.h"
#include "BKE_colortools.h"
#include "BKE_global.h"
#include "BKE_icons.h"
@@ -1527,7 +1526,7 @@ typedef struct StampDataCustomField {
struct StampDataCustomField *next, *prev;
/* TODO(sergey): Think of better size here, maybe dynamically allocated even. */
char key[512];
- char value[512];
+ char *value;
/* TODO(sergey): Support non-string values. */
} StampDataCustomField;
@@ -2092,12 +2091,9 @@ void BKE_stamp_info_callback(void *data, struct StampData *stamp_data, StampCall
CALL(rendertime, "RenderTime");
CALL(memory, "Memory");
- for (StampDataCustomField *custom_field = stamp_data->custom_fields.first;
- custom_field != NULL;
- custom_field = custom_field->next)
- {
+ LISTBASE_FOREACH(StampDataCustomField *, custom_field, &stamp_data->custom_fields) {
if (noskip || custom_field->value[0]) {
- callback(data, custom_field->key, custom_field->value, sizeof(custom_field->value));
+ callback(data, custom_field->key, custom_field->value, strlen(custom_field->value) + 1);
}
}
@@ -2114,7 +2110,7 @@ void BKE_render_result_stamp_data(RenderResult *rr, const char *key, const char
StampDataCustomField *field = MEM_mallocN(sizeof(StampDataCustomField),
"StampData Custom Field");
STRNCPY(field->key, key);
- STRNCPY(field->value, value);
+ field->value = BLI_strdup(value);
BLI_addtail(&stamp_data->custom_fields, field);
}
@@ -2123,6 +2119,9 @@ void BKE_stamp_data_free(struct StampData *stamp_data)
if (stamp_data == NULL) {
return;
}
+ LISTBASE_FOREACH(StampDataCustomField *, custom_field, &stamp_data->custom_fields) {
+ MEM_freeN(custom_field->value);
+ }
BLI_freelistN(&stamp_data->custom_fields);
MEM_freeN(stamp_data);
}
@@ -2671,11 +2670,6 @@ void BKE_image_signal(Main *bmain, Image *ima, ImageUser *iuser, int signal)
ima->name[0] = '\0';
}
-#if 0
- /* force reload on first use, but not for multilayer, that makes nodes and buttons in ui drawing fail */
- if (ima->type != IMA_TYPE_MULTILAYER)
- BKE_image_free_buffers(ima);
-#else
/* image buffers for non-sequence multilayer will share buffers with RenderResult,
* however sequence multilayer will own buffers. Such logic makes switching from
* single multilayer file to sequence completely unstable
@@ -2684,7 +2678,6 @@ void BKE_image_signal(Main *bmain, Image *ima, ImageUser *iuser, int signal)
* sequences behave stable
*/
BKE_image_free_buffers(ima);
-#endif
ima->ok = 1;
if (iuser)
@@ -2813,7 +2806,7 @@ static RenderPass *image_render_pass_get(RenderLayer *rl, const int pass, const
}
/* if layer or pass changes, we need an index for the imbufs list */
-/* note it is called for rendered results, but it doesnt use the index! */
+/* note it is called for rendered results, but it doesn't use the index! */
/* and because rendered results use fake layer/passes, don't correct for wrong indices here */
RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser)
{
@@ -2865,7 +2858,7 @@ void BKE_image_multiview_index(Image *ima, ImageUser *iuser)
}
/* if layer or pass changes, we need an index for the imbufs list */
-/* note it is called for rendered results, but it doesnt use the index! */
+/* note it is called for rendered results, but it doesn't use the index! */
/* and because rendered results use fake layer/passes, don't correct for wrong indices here */
bool BKE_image_is_multilayer(Image *ima)
{
@@ -3417,7 +3410,7 @@ static ImBuf *load_image_single(
flag |= imbuf_alpha_flags_for_image(ima);
/* get the correct filepath */
- BKE_image_user_frame_calc(iuser, cfra, 0);
+ BKE_image_user_frame_calc(iuser, cfra);
if (iuser)
iuser_t = *iuser;
@@ -3450,9 +3443,6 @@ static ImBuf *load_image_single(
image_initialize_after_load(ima, ibuf);
*r_assign = true;
- /* check if the image is a font image... */
- detectBitmapFont(ibuf);
-
/* make packed file for autopack */
if ((has_packed == false) && (G.fileflags & G_AUTOPACK)) {
ImagePackedFile *imapf = MEM_mallocN(sizeof(ImagePackedFile), "Image Packefile");
@@ -3707,7 +3697,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_loc
*
* This is mainly to make it so color management treats byte buffer
* from render result with Save Buffers enabled as final display buffer
- * and doesnt' apply any color management on it.
+ * and doesn't apply any color management on it.
*
* For other cases we need to be sure it stays to default byte buffer space.
*/
@@ -4172,7 +4162,7 @@ void BKE_image_pool_release_ibuf(Image *ima, ImBuf *ibuf, ImagePool *pool)
}
}
-int BKE_image_user_frame_get(const ImageUser *iuser, int cfra, int fieldnr, bool *r_is_in_range)
+int BKE_image_user_frame_get(const ImageUser *iuser, int cfra, bool *r_is_in_range)
{
const int len = iuser->frames;
@@ -4210,10 +4200,6 @@ int BKE_image_user_frame_get(const ImageUser *iuser, int cfra, int fieldnr, bool
}
}
- /* convert current frame to current field */
- cfra = 2 * (cfra);
- if (fieldnr) cfra++;
-
/* transform to images space */
framenr = cfra;
if (framenr > iuser->frames) framenr = iuser->frames;
@@ -4231,11 +4217,11 @@ int BKE_image_user_frame_get(const ImageUser *iuser, int cfra, int fieldnr, bool
}
}
-void BKE_image_user_frame_calc(ImageUser *iuser, int cfra, int fieldnr)
+void BKE_image_user_frame_calc(ImageUser *iuser, int cfra)
{
if (iuser) {
bool is_in_range;
- const int framenr = BKE_image_user_frame_get(iuser, cfra, fieldnr, &is_in_range);
+ const int framenr = BKE_image_user_frame_get(iuser, cfra, &is_in_range);
if (is_in_range) {
iuser->flag |= IMA_USER_FRAME_IN_RANGE;
@@ -4254,10 +4240,10 @@ void BKE_image_user_frame_calc(ImageUser *iuser, int cfra, int fieldnr)
}
}
-void BKE_image_user_check_frame_calc(ImageUser *iuser, int cfra, int fieldnr)
+void BKE_image_user_check_frame_calc(ImageUser *iuser, int cfra)
{
if ((iuser->flag & IMA_ANIM_ALWAYS) || (iuser->flag & IMA_NEED_FRAME_RECALC)) {
- BKE_image_user_frame_calc(iuser, cfra, fieldnr);
+ BKE_image_user_frame_calc(iuser, cfra);
iuser->flag &= ~IMA_NEED_FRAME_RECALC;
}
@@ -4268,7 +4254,7 @@ static void image_update_frame(struct Image *UNUSED(ima), struct ImageUser *iuse
{
int cfra = *(int *)customdata;
- BKE_image_user_check_frame_calc(iuser, cfra, 0);
+ BKE_image_user_check_frame_calc(iuser, cfra);
}
void BKE_image_update_frame(const Main *bmain, int cfra)
@@ -4476,15 +4462,6 @@ bool BKE_image_is_dirty(Image *image)
void BKE_image_file_format_set(Image *image, int ftype, const ImbFormatOptions *options)
{
-#if 0
- ImBuf *ibuf = BKE_image_acquire_ibuf(image, NULL, NULL);
- if (ibuf) {
- ibuf->ftype = ftype;
- ibuf->foptions = options;
- }
- BKE_image_release_ibuf(image, ibuf, NULL);
-#endif
-
BLI_spin_lock(&image_spin);
if (image->cache != NULL) {
struct MovieCacheIter *iter = IMB_moviecacheIter_new(image->cache);
diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c
index 3be40b414a6..c30a47b5435 100644
--- a/source/blender/blenkernel/intern/ipo.c
+++ b/source/blender/blenkernel/intern/ipo.c
@@ -488,7 +488,7 @@ static const char *texture_adrcodes_to_paths(int adrcode, int *array_index)
case TE_BRIGHT:
return "brightness";
case TE_CONTRA:
- return "constrast";
+ return "contrast";
}
return NULL;
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index 0d8e281fa06..a01d78f5c36 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -76,6 +76,12 @@
#define IPO_BEZTRIPLE 100
#define IPO_BPOINT 101
+/* Internal use only. */
+typedef struct WeightsArrayCache {
+ int num_defgroup_weights;
+ float **defgroup_weights;
+} WeightsArrayCache;
+
/** Free (or release) any data used by this shapekey (does not free the key itself). */
void BKE_key_free(Key *key)
@@ -119,31 +125,31 @@ Key *BKE_key_add(Main *bmain, ID *id) /* common function */
case ID_ME:
el = key->elemstr;
- el[0] = 3;
+ el[0] = KEYELEM_FLOAT_LEN_COORD;
el[1] = IPO_FLOAT;
el[2] = 0;
- key->elemsize = 12;
+ key->elemsize = sizeof(float[KEYELEM_FLOAT_LEN_COORD]);
break;
case ID_LT:
el = key->elemstr;
- el[0] = 3;
+ el[0] = KEYELEM_FLOAT_LEN_COORD;
el[1] = IPO_FLOAT;
el[2] = 0;
- key->elemsize = 12;
+ key->elemsize = sizeof(float[KEYELEM_FLOAT_LEN_COORD]);
break;
case ID_CU:
el = key->elemstr;
- el[0] = 4;
+ el[0] = KEYELEM_ELEM_SIZE_CURVE;
el[1] = IPO_BPOINT;
el[2] = 0;
- key->elemsize = 16;
+ key->elemsize = sizeof(float[KEYELEM_ELEM_SIZE_CURVE]);
break;
@@ -540,31 +546,33 @@ static char *key_block_get_data(Key *key, KeyBlock *actkb, KeyBlock *kb, char **
/* currently only the first value of 'ofs' may be set. */
-static bool key_pointer_size(const Key *key, const int mode, int *poinsize, int *ofs)
+static bool key_pointer_size(const Key *key, const int mode, int *poinsize, int *ofs, int *step)
{
if (key->from == NULL) {
return false;
}
+ *step = 1;
+
switch (GS(key->from->name)) {
case ID_ME:
- *ofs = sizeof(float) * 3;
+ *ofs = sizeof(float[KEYELEM_FLOAT_LEN_COORD]);
*poinsize = *ofs;
break;
case ID_LT:
- *ofs = sizeof(float) * 3;
+ *ofs = sizeof(float[KEYELEM_FLOAT_LEN_COORD]);
*poinsize = *ofs;
break;
case ID_CU:
if (mode == KEY_MODE_BPOINT) {
- *ofs = sizeof(float) * 4;
- *poinsize = *ofs;
+ *ofs = sizeof(float[KEYELEM_FLOAT_LEN_BPOINT]);
+ *step = KEYELEM_ELEM_LEN_BPOINT;
}
else {
- ofs[0] = sizeof(float) * 12;
- *poinsize = (*ofs) / 3;
+ *ofs = sizeof(float[KEYELEM_FLOAT_LEN_BEZTRIPLE]);
+ *step = KEYELEM_ELEM_LEN_BEZTRIPLE;
}
-
+ *poinsize = sizeof(float[KEYELEM_ELEM_SIZE_CURVE]);
break;
default:
BLI_assert(!"invalid 'key->from' ID type");
@@ -577,14 +585,14 @@ static bool key_pointer_size(const Key *key, const int mode, int *poinsize, int
static void cp_key(const int start, int end, const int tot, char *poin, Key *key, KeyBlock *actkb, KeyBlock *kb, float *weights, const int mode)
{
float ktot = 0.0, kd = 0.0;
- int elemsize, poinsize = 0, a, *ofsp, ofs[32], flagflo = 0;
+ int elemsize, poinsize = 0, a, step, *ofsp, ofs[32], flagflo = 0;
char *k1, *kref, *freek1, *freekref;
char *cp, elemstr[8];
/* currently always 0, in future key_pointer_size may assign */
ofs[1] = 0;
- if (!key_pointer_size(key, mode, &poinsize, &ofs[0]))
+ if (!key_pointer_size(key, mode, &poinsize, &ofs[0], &step))
return;
if (end > tot) end = tot;
@@ -628,10 +636,9 @@ static void cp_key(const int start, int end, const int tot, char *poin, Key *key
}
/* just do it here, not above! */
- elemsize = key->elemsize;
- if (mode == KEY_MODE_BEZTRIPLE) elemsize *= 3;
+ elemsize = key->elemsize * step;
- for (a = start; a < end; a++) {
+ for (a = start; a < end; a += step) {
cp = key->elemstr;
if (mode == KEY_MODE_BEZTRIPLE) cp = elemstr;
@@ -642,20 +649,20 @@ static void cp_key(const int start, int end, const int tot, char *poin, Key *key
switch (cp[1]) {
case IPO_FLOAT:
if (weights) {
- memcpy(poin, kref, sizeof(float) * 3);
+ memcpy(poin, kref, sizeof(float[KEYELEM_FLOAT_LEN_COORD]));
if (*weights != 0.0f)
- rel_flerp(cp[0], (float *)poin, (float *)kref, (float *)k1, *weights);
+ rel_flerp(KEYELEM_FLOAT_LEN_COORD, (float *)poin, (float *)kref, (float *)k1, *weights);
weights++;
}
else {
- memcpy(poin, k1, sizeof(float) * 3);
+ memcpy(poin, k1, sizeof(float[KEYELEM_FLOAT_LEN_COORD]));
}
break;
case IPO_BPOINT:
- memcpy(poin, k1, sizeof(float) * 4);
+ memcpy(poin, k1, sizeof(float[KEYELEM_FLOAT_LEN_BPOINT]));
break;
case IPO_BEZTRIPLE:
- memcpy(poin, k1, sizeof(float) * 12);
+ memcpy(poin, k1, sizeof(float[KEYELEM_FLOAT_LEN_BEZTRIPLE]));
break;
default:
/* should never happen */
@@ -682,10 +689,6 @@ static void cp_key(const int start, int end, const int tot, char *poin, Key *key
k1 += elemsize;
kref += elemsize;
}
-
- if (mode == KEY_MODE_BEZTRIPLE) {
- a += 2;
- }
}
if (freek1) MEM_freeN(freek1);
@@ -699,7 +702,7 @@ static void cp_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock *kb, const
for (a = 0, nu = cu->nurb.first; nu; nu = nu->next, a += step) {
if (nu->bp) {
- step = nu->pntsu * nu->pntsv;
+ step = KEYELEM_ELEM_LEN_BPOINT * nu->pntsu * nu->pntsv;
a1 = max_ii(a, start);
a2 = min_ii(a + step, end);
@@ -707,7 +710,7 @@ static void cp_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock *kb, const
if (a1 < a2) cp_key(a1, a2, tot, out, key, actkb, kb, NULL, KEY_MODE_BPOINT);
}
else if (nu->bezt) {
- step = 3 * nu->pntsu;
+ step = KEYELEM_ELEM_LEN_BEZTRIPLE * nu->pntsu;
/* exception because keys prefer to work with complete blocks */
a1 = max_ii(a, start);
@@ -721,18 +724,19 @@ static void cp_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock *kb, const
}
}
-void BKE_key_evaluate_relative(const int start, int end, const int tot, char *basispoin, Key *key, KeyBlock *actkb,
- float **per_keyblock_weights, const int mode)
+static void key_evaluate_relative(
+ const int start, int end, const int tot, char *basispoin, Key *key, KeyBlock *actkb,
+ float **per_keyblock_weights, const int mode)
{
KeyBlock *kb;
- int *ofsp, ofs[3], elemsize, b;
+ int *ofsp, ofs[3], elemsize, b, step;
char *cp, *poin, *reffrom, *from, elemstr[8];
int poinsize, keyblock_index;
/* currently always 0, in future key_pointer_size may assign */
ofs[1] = 0;
- if (!key_pointer_size(key, mode, &poinsize, &ofs[0]))
+ if (!key_pointer_size(key, mode, &poinsize, &ofs[0], &step))
return;
if (end > tot) end = tot;
@@ -743,8 +747,7 @@ void BKE_key_evaluate_relative(const int start, int end, const int tot, char *ba
elemstr[2] = 0;
/* just here, not above! */
- elemsize = key->elemsize;
- if (mode == KEY_MODE_BEZTRIPLE) elemsize *= 3;
+ elemsize = key->elemsize * step;
/* step 1 init */
cp_key(start, end, tot, basispoin, key, actkb, key->refkey, NULL, mode);
@@ -773,7 +776,7 @@ void BKE_key_evaluate_relative(const int start, int end, const int tot, char *ba
reffrom += key->elemsize * start; // key elemsize yes!
from += key->elemsize * start;
- for (b = start; b < end; b++) {
+ for (b = start; b < end; b += step) {
weight = weights ? (*weights * icuval) : icuval;
@@ -786,13 +789,13 @@ void BKE_key_evaluate_relative(const int start, int end, const int tot, char *ba
switch (cp[1]) {
case IPO_FLOAT:
- rel_flerp(3, (float *)poin, (float *)reffrom, (float *)from, weight);
+ rel_flerp(KEYELEM_FLOAT_LEN_COORD, (float *)poin, (float *)reffrom, (float *)from, weight);
break;
case IPO_BPOINT:
- rel_flerp(4, (float *)poin, (float *)reffrom, (float *)from, weight);
+ rel_flerp(KEYELEM_FLOAT_LEN_BPOINT, (float *)poin, (float *)reffrom, (float *)from, weight);
break;
case IPO_BEZTRIPLE:
- rel_flerp(12, (float *)poin, (float *)reffrom, (float *)from, weight);
+ rel_flerp(KEYELEM_FLOAT_LEN_BEZTRIPLE, (float *)poin, (float *)reffrom, (float *)from, weight);
break;
default:
/* should never happen */
@@ -811,7 +814,6 @@ void BKE_key_evaluate_relative(const int start, int end, const int tot, char *ba
reffrom += elemsize;
from += elemsize;
- if (mode == KEY_MODE_BEZTRIPLE) b += 2;
if (weights) weights++;
}
@@ -827,7 +829,7 @@ static void do_key(const int start, int end, const int tot, char *poin, Key *key
{
float k1tot = 0.0, k2tot = 0.0, k3tot = 0.0, k4tot = 0.0;
float k1d = 0.0, k2d = 0.0, k3d = 0.0, k4d = 0.0;
- int a, ofs[32], *ofsp;
+ int a, step, ofs[32], *ofsp;
int flagdo = 15, flagflo = 0, elemsize, poinsize = 0;
char *k1, *k2, *k3, *k4, *freek1, *freek2, *freek3, *freek4;
char *cp, elemstr[8];
@@ -835,7 +837,7 @@ static void do_key(const int start, int end, const int tot, char *poin, Key *key
/* currently always 0, in future key_pointer_size may assign */
ofs[1] = 0;
- if (!key_pointer_size(key, mode, &poinsize, &ofs[0]))
+ if (!key_pointer_size(key, mode, &poinsize, &ofs[0], &step))
return;
if (end > tot) end = tot;
@@ -953,11 +955,9 @@ static void do_key(const int start, int end, const int tot, char *poin, Key *key
elemstr[2] = 0;
/* only here, not above! */
- elemsize = key->elemsize;
- if (mode == KEY_MODE_BEZTRIPLE) elemsize *= 3;
-
- for (a = start; a < end; a++) {
+ elemsize = key->elemsize * step;
+ for (a = start; a < end; a += step) {
cp = key->elemstr;
if (mode == KEY_MODE_BEZTRIPLE) cp = elemstr;
@@ -967,13 +967,13 @@ static void do_key(const int start, int end, const int tot, char *poin, Key *key
switch (cp[1]) {
case IPO_FLOAT:
- flerp(3, (float *)poin, (float *)k1, (float *)k2, (float *)k3, (float *)k4, t);
+ flerp(KEYELEM_FLOAT_LEN_COORD, (float *)poin, (float *)k1, (float *)k2, (float *)k3, (float *)k4, t);
break;
case IPO_BPOINT:
- flerp(4, (float *)poin, (float *)k1, (float *)k2, (float *)k3, (float *)k4, t);
+ flerp(KEYELEM_FLOAT_LEN_BPOINT, (float *)poin, (float *)k1, (float *)k2, (float *)k3, (float *)k4, t);
break;
case IPO_BEZTRIPLE:
- flerp(12, (void *)poin, (void *)k1, (void *)k2, (void *)k3, (void *)k4, t);
+ flerp(KEYELEM_FLOAT_LEN_BEZTRIPLE, (void *)poin, (void *)k1, (void *)k2, (void *)k3, (void *)k4, t);
break;
default:
/* should never happen */
@@ -1038,8 +1038,6 @@ static void do_key(const int start, int end, const int tot, char *poin, Key *key
k4 += elemsize;
}
}
-
- if (mode == KEY_MODE_BEZTRIPLE) a += 2;
}
if (freek1) MEM_freeN(freek1);
@@ -1120,7 +1118,7 @@ static float *get_weights_array(Object *ob, char *vgroup, WeightsArrayCache *cac
return NULL;
}
-float **BKE_keyblock_get_per_block_weights(Object *ob, Key *key, WeightsArrayCache *cache)
+static float **keyblock_get_per_block_weights(Object *ob, Key *key, WeightsArrayCache *cache)
{
KeyBlock *keyblock;
float **per_keyblock_weights;
@@ -1140,7 +1138,7 @@ float **BKE_keyblock_get_per_block_weights(Object *ob, Key *key, WeightsArrayCac
return per_keyblock_weights;
}
-void BKE_keyblock_free_per_block_weights(Key *key, float **per_keyblock_weights, WeightsArrayCache *cache)
+static void keyblock_free_per_block_weights(Key *key, float **per_keyblock_weights, WeightsArrayCache *cache)
{
int a;
@@ -1175,9 +1173,9 @@ static void do_mesh_key(Object *ob, Key *key, char *out, const int tot)
if (key->type == KEY_RELATIVE) {
WeightsArrayCache cache = {0, NULL};
float **per_keyblock_weights;
- per_keyblock_weights = BKE_keyblock_get_per_block_weights(ob, key, &cache);
- BKE_key_evaluate_relative(0, tot, tot, (char *)out, key, actkb, per_keyblock_weights, KEY_MODE_DUMMY);
- BKE_keyblock_free_per_block_weights(key, per_keyblock_weights, &cache);
+ per_keyblock_weights = keyblock_get_per_block_weights(ob, key, &cache);
+ key_evaluate_relative(0, tot, tot, (char *)out, key, actkb, per_keyblock_weights, KEY_MODE_DUMMY);
+ keyblock_free_per_block_weights(key, per_keyblock_weights, &cache);
}
else {
const float ctime_scaled = key->ctime / 100.0f;
@@ -1200,11 +1198,11 @@ static void do_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock **k, float
for (a = 0, nu = cu->nurb.first; nu; nu = nu->next, a += step) {
if (nu->bp) {
- step = nu->pntsu * nu->pntsv;
+ step = KEYELEM_ELEM_LEN_BPOINT * nu->pntsu * nu->pntsv;
do_key(a, a + step, tot, out, key, actkb, k, t, KEY_MODE_BPOINT);
}
else if (nu->bezt) {
- step = 3 * nu->pntsu;
+ step = KEYELEM_ELEM_LEN_BEZTRIPLE * nu->pntsu;
do_key(a, a + step, tot, out, key, actkb, k, t, KEY_MODE_BEZTRIPLE);
}
else {
@@ -1220,12 +1218,12 @@ static void do_rel_cu_key(Curve *cu, Key *key, KeyBlock *actkb, char *out, const
for (a = 0, nu = cu->nurb.first; nu; nu = nu->next, a += step) {
if (nu->bp) {
- step = nu->pntsu * nu->pntsv;
- BKE_key_evaluate_relative(a, a + step, tot, out, key, actkb, NULL, KEY_MODE_BPOINT);
+ step = KEYELEM_ELEM_LEN_BPOINT * nu->pntsu * nu->pntsv;
+ key_evaluate_relative(a, a + step, tot, out, key, actkb, NULL, KEY_MODE_BPOINT);
}
else if (nu->bezt) {
- step = 3 * nu->pntsu;
- BKE_key_evaluate_relative(a, a + step, tot, out, key, actkb, NULL, KEY_MODE_BEZTRIPLE);
+ step = KEYELEM_ELEM_LEN_BEZTRIPLE * nu->pntsu;
+ key_evaluate_relative(a, a + step, tot, out, key, actkb, NULL, KEY_MODE_BEZTRIPLE);
}
else {
step = 0;
@@ -1266,9 +1264,9 @@ static void do_latt_key(Object *ob, Key *key, char *out, const int tot)
if (key->type == KEY_RELATIVE) {
float **per_keyblock_weights;
- per_keyblock_weights = BKE_keyblock_get_per_block_weights(ob, key, NULL);
- BKE_key_evaluate_relative(0, tot, tot, (char *)out, key, actkb, per_keyblock_weights, KEY_MODE_DUMMY);
- BKE_keyblock_free_per_block_weights(key, per_keyblock_weights, NULL);
+ per_keyblock_weights = keyblock_get_per_block_weights(ob, key, NULL);
+ key_evaluate_relative(0, tot, tot, (char *)out, key, actkb, per_keyblock_weights, KEY_MODE_DUMMY);
+ keyblock_free_per_block_weights(key, per_keyblock_weights, NULL);
}
else {
const float ctime_scaled = key->ctime / 100.0f;
@@ -1304,28 +1302,19 @@ float *BKE_key_evaluate_object_ex(
Mesh *me = ob->data;
tot = me->totvert;
- size = tot * 3 * sizeof(float);
+ size = tot * sizeof(float[KEYELEM_FLOAT_LEN_COORD]);
}
else if (ob->type == OB_LATTICE) {
Lattice *lt = ob->data;
tot = lt->pntsu * lt->pntsv * lt->pntsw;
- size = tot * 3 * sizeof(float);
+ size = tot * sizeof(float[KEYELEM_FLOAT_LEN_COORD]);
}
else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
Curve *cu = ob->data;
- Nurb *nu;
- for (nu = cu->nurb.first; nu; nu = nu->next) {
- if (nu->bezt) {
- tot += 3 * nu->pntsu;
- size += nu->pntsu * 12 * sizeof(float);
- }
- else if (nu->bp) {
- tot += nu->pntsu * nu->pntsv;
- size += nu->pntsu * nu->pntsv * 12 * sizeof(float);
- }
- }
+ tot = BKE_keyblock_curve_element_count(&cu->nurb);
+ size = tot * sizeof(float[KEYELEM_ELEM_SIZE_CURVE]);
}
/* if nothing to interpolate, cancel */
@@ -1661,6 +1650,24 @@ void BKE_keyblock_convert_to_lattice(KeyBlock *kb, Lattice *lt)
}
/************************* Curve ************************/
+
+int BKE_keyblock_curve_element_count(ListBase *nurb)
+{
+ Nurb *nu;
+ int tot = 0;
+
+ nu = nurb->first;
+ while (nu) {
+ if (nu->bezt)
+ tot += KEYELEM_ELEM_LEN_BEZTRIPLE * nu->pntsu;
+ else if (nu->bp)
+ tot += KEYELEM_ELEM_LEN_BPOINT * nu->pntsu * nu->pntsv;
+
+ nu = nu->next;
+ }
+ return tot;
+}
+
void BKE_keyblock_update_from_curve(Curve *UNUSED(cu), KeyBlock *kb, ListBase *nurb)
{
Nurb *nu;
@@ -1670,7 +1677,7 @@ void BKE_keyblock_update_from_curve(Curve *UNUSED(cu), KeyBlock *kb, ListBase *n
int a, tot;
/* count */
- BLI_assert(BKE_nurbList_verts_count(nurb) == kb->totelem);
+ BLI_assert(BKE_keyblock_curve_element_count(nurb) == kb->totelem);
tot = kb->totelem;
if (tot == 0) return;
@@ -1679,21 +1686,20 @@ void BKE_keyblock_update_from_curve(Curve *UNUSED(cu), KeyBlock *kb, ListBase *n
for (nu = nurb->first; nu; nu = nu->next) {
if (nu->bezt) {
for (a = nu->pntsu, bezt = nu->bezt; a; a--, bezt++) {
- int i;
-
- for (i = 0; i < 3; i++, fp += 3) {
- copy_v3_v3(fp, bezt->vec[i]);
+ for (int i = 0; i < 3; i++) {
+ copy_v3_v3(&fp[i * 3], bezt->vec[i]);
}
- fp[0] = bezt->alfa;
- fp += 3; /* alphas */
+ fp[9] = bezt->alfa;
+ fp[10] = bezt->radius;
+ fp += KEYELEM_FLOAT_LEN_BEZTRIPLE;
}
}
else {
-
- ;
- for (a = nu->pntsu * nu->pntsv, bp = nu->bp; a; a--, fp += 4, bp++) {
+ for (a = nu->pntsu * nu->pntsv, bp = nu->bp; a; a--, bp++) {
copy_v3_v3(fp, bp->vec);
fp[3] = bp->alfa;
+ fp[4] = bp->radius;
+ fp += KEYELEM_FLOAT_LEN_BPOINT;
}
}
}
@@ -1704,7 +1710,7 @@ void BKE_keyblock_convert_from_curve(Curve *cu, KeyBlock *kb, ListBase *nurb)
int tot;
/* count */
- tot = BKE_nurbList_verts_count(nurb);
+ tot = BKE_keyblock_curve_element_count(nurb);
if (tot == 0) return;
MEM_SAFE_FREE(kb->data);
@@ -1723,26 +1729,27 @@ void BKE_keyblock_convert_to_curve(KeyBlock *kb, Curve *UNUSED(cu), ListBase *nu
const float *fp;
int a, tot;
- tot = BKE_nurbList_verts_count(nurb);
+ tot = BKE_keyblock_curve_element_count(nurb);
tot = min_ii(kb->totelem, tot);
fp = kb->data;
for (nu = nurb->first; nu && tot > 0; nu = nu->next) {
if (nu->bezt) {
- for (a = nu->pntsu, bezt = nu->bezt; a && tot > 0; a--, tot -= 3, bezt++) {
- int i;
-
- for (i = 0; i < 3; i++, fp += 3) {
- copy_v3_v3(bezt->vec[i], fp);
+ for (a = nu->pntsu, bezt = nu->bezt; a && (tot -= KEYELEM_ELEM_LEN_BEZTRIPLE) >= 0; a--, bezt++) {
+ for (int i = 0; i < 3; i++) {
+ copy_v3_v3(bezt->vec[i], &fp[i * 3]);
}
- bezt->alfa = fp[0];
- fp += 3; /* alphas */
+ bezt->alfa = fp[9];
+ bezt->radius = fp[10];
+ fp += KEYELEM_FLOAT_LEN_BEZTRIPLE;
}
}
else {
- for (a = nu->pntsu * nu->pntsv, bp = nu->bp; a && tot; a--, tot--, fp += 4, bp++) {
+ for (a = nu->pntsu * nu->pntsv, bp = nu->bp; a && (tot -= KEYELEM_ELEM_LEN_BPOINT) >= 0; a--, bp++) {
copy_v3_v3(bp->vec, fp);
bp->alfa = fp[3];
+ bp->radius = fp[4];
+ fp += KEYELEM_FLOAT_LEN_BPOINT;
}
}
}
@@ -1871,7 +1878,7 @@ void BKE_keyblock_update_from_vertcos(Object *ob, KeyBlock *kb, float (*vertCos)
}
else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
Curve *cu = ob->data;
- BLI_assert(BKE_nurbList_verts_count(&cu->nurb) == kb->totelem);
+ BLI_assert(BKE_keyblock_curve_element_count(&cu->nurb) == kb->totelem);
}
else if (ob->type == OB_MESH) {
Mesh *me = ob->data;
@@ -1900,17 +1907,16 @@ void BKE_keyblock_update_from_vertcos(Object *ob, KeyBlock *kb, float (*vertCos)
for (nu = cu->nurb.first; nu; nu = nu->next) {
if (nu->bezt) {
for (a = nu->pntsu, bezt = nu->bezt; a; a--, bezt++) {
- int i;
-
- for (i = 0; i < 3; i++, fp += 3, co++) {
- copy_v3_v3(fp, *co);
+ for (int i = 0; i < 3; i++, co++) {
+ copy_v3_v3(&fp[i * 3], *co);
}
- fp += 3; /* skip alphas */
+ fp += KEYELEM_FLOAT_LEN_BEZTRIPLE;
}
}
else {
- for (a = nu->pntsu * nu->pntsv, bp = nu->bp; a; a--, bp++, fp += 4, co++) {
+ for (a = nu->pntsu * nu->pntsv, bp = nu->bp; a; a--, bp++, co++) {
copy_v3_v3(fp, *co);
+ fp += KEYELEM_FLOAT_LEN_BPOINT;
}
}
}
@@ -1937,7 +1943,7 @@ void BKE_keyblock_convert_from_vertcos(Object *ob, KeyBlock *kb, float (*vertCos
else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
Curve *cu = (Curve *)ob->data;
elemsize = cu->key->elemsize;
- tot = BKE_nurbList_verts_count(&cu->nurb);
+ tot = BKE_keyblock_curve_element_count(&cu->nurb);
}
if (tot == 0) return;
@@ -1987,17 +1993,16 @@ float (*BKE_keyblock_convert_to_vertcos(Object *ob, KeyBlock *kb))[3]
for (nu = cu->nurb.first; nu; nu = nu->next) {
if (nu->bezt) {
for (a = nu->pntsu, bezt = nu->bezt; a; a--, bezt++) {
- int i;
-
- for (i = 0; i < 3; i++, fp += 3, co++) {
- copy_v3_v3(*co, fp);
+ for (int i = 0; i < 3; i++, co++) {
+ copy_v3_v3(*co, &fp[i * 3]);
}
- fp += 3; /* skip alphas */
+ fp += KEYELEM_FLOAT_LEN_BEZTRIPLE;
}
}
else {
- for (a = nu->pntsu * nu->pntsv, bp = nu->bp; a; a--, bp++, fp += 4, co++) {
+ for (a = nu->pntsu * nu->pntsv, bp = nu->bp; a; a--, bp++, co++) {
copy_v3_v3(*co, fp);
+ fp += KEYELEM_FLOAT_LEN_BPOINT;
}
}
}
@@ -2026,17 +2031,16 @@ void BKE_keyblock_update_from_offset(Object *ob, KeyBlock *kb, float (*ofs)[3])
for (nu = cu->nurb.first; nu; nu = nu->next) {
if (nu->bezt) {
for (a = nu->pntsu, bezt = nu->bezt; a; a--, bezt++) {
- int i;
-
- for (i = 0; i < 3; i++, fp += 3, ofs++) {
- add_v3_v3(fp, *ofs);
+ for (int i = 0; i < 3; i++, ofs++) {
+ add_v3_v3(&fp[i * 3], *ofs);
}
- fp += 3; /* skip alphas */
+ fp += KEYELEM_FLOAT_LEN_BEZTRIPLE;
}
}
else {
- for (a = nu->pntsu * nu->pntsv, bp = nu->bp; a; a--, bp++, fp += 4, ofs++) {
+ for (a = nu->pntsu * nu->pntsv, bp = nu->bp; a; a--, bp++, ofs++) {
add_v3_v3(fp, *ofs);
+ fp += KEYELEM_FLOAT_LEN_BPOINT;
}
}
}
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 05502ad9e9e..a04f32adece 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -1052,7 +1052,7 @@ void BKE_lattice_modifiers_calc(struct Depsgraph *depsgraph, Scene *scene, Objec
if (mti->type != eModifierTypeType_OnlyDeform) continue;
if (!vertexCos) vertexCos = BKE_lattice_vertexcos_get(ob_orig, &numVerts);
- modifier_deformVerts(md, &mectx, NULL, vertexCos, numVerts);
+ mti->deformVerts(md, &mectx, NULL, vertexCos, numVerts);
}
if (ob->id.tag & LIB_TAG_COPIED_ON_WRITE) {
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 4df1b72d02a..fbfa47c8939 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -80,7 +80,7 @@ static LayerCollection *layer_collection_add(ListBase *lb_parent, Collection *co
static void layer_collection_free(ViewLayer *view_layer, LayerCollection *lc)
{
if (lc == view_layer->active_collection) {
- view_layer->active_collection = view_layer->layer_collections.first;
+ view_layer->active_collection = NULL;
}
for (LayerCollection *nlc = lc->layer_collections.first; nlc; nlc = nlc->next) {
@@ -305,13 +305,17 @@ static void view_layer_bases_hash_create(ViewLayer *view_layer)
{
static ThreadMutex hash_lock = BLI_MUTEX_INITIALIZER;
- if (!view_layer->object_bases_hash) {
+ if (view_layer->object_bases_hash == NULL) {
BLI_mutex_lock(&hash_lock);
- view_layer->object_bases_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, __func__);
+ if (view_layer->object_bases_hash == NULL) {
+ view_layer->object_bases_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, __func__);
- for (Base *base = view_layer->object_bases.first; base; base = base->next) {
- BLI_ghash_insert(view_layer->object_bases_hash, base->object, base);
+ for (Base *base = view_layer->object_bases.first; base; base = base->next) {
+ if (base->object) {
+ BLI_ghash_insert(view_layer->object_bases_hash, base->object, base);
+ }
+ }
}
BLI_mutex_unlock(&hash_lock);
@@ -336,14 +340,19 @@ void BKE_view_layer_base_deselect_all(ViewLayer *view_layer)
}
}
-void BKE_view_layer_base_select(struct ViewLayer *view_layer, Base *selbase)
+void BKE_view_layer_base_select(Base *selbase)
{
- view_layer->basact = selbase;
if ((selbase->flag & BASE_SELECTABLE) != 0) {
selbase->flag |= BASE_SELECTED;
}
}
+void BKE_view_layer_base_select_and_set_active(struct ViewLayer *view_layer, Base *selbase)
+{
+ view_layer->basact = selbase;
+ BKE_view_layer_base_select(selbase);
+}
+
/**************************** Copy View Layer and Layer Collections ***********************/
static void layer_collections_copy_data(
@@ -436,13 +445,16 @@ void BKE_view_layer_rename(Main *bmain, Scene *scene, ViewLayer *view_layer, con
}
}
- /* fix all the animation data and windows which may link to this */
+ /* Fix all the animation data and windows which may link to this. */
BKE_animdata_fix_paths_rename_all(NULL, "view_layers", oldname, view_layer->name);
+ /* WM can be missing on startup. */
wmWindowManager *wm = bmain->wm.first;
- for (wmWindow *win = wm->windows.first; win; win = win->next) {
- if (win->scene == scene && STREQ(win->view_layer_name, oldname)) {
- STRNCPY(win->view_layer_name, view_layer->name);
+ if (wm) {
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ if (win->scene == scene && STREQ(win->view_layer_name, oldname)) {
+ STRNCPY(win->view_layer_name, view_layer->name);
+ }
}
}
@@ -595,10 +607,10 @@ int BKE_layer_collection_findindex(ViewLayer *view_layer, const LayerCollection
* in at least one layer collection. That list is also synchronized here, and
* stores state like selection. */
-static int layer_collection_sync(
+static short layer_collection_sync(
ViewLayer *view_layer, const ListBase *lb_scene,
ListBase *lb_layer, ListBase *new_object_bases,
- int parent_exclude, int parent_restrict)
+ short parent_exclude, short parent_restrict)
{
/* TODO: support recovery after removal of intermediate collections, reordering, ..
* For local edits we can make editing operating do the appropriate thing, but for
@@ -626,7 +638,7 @@ static int layer_collection_sync(
/* Add layer collections for any new scene collections, and ensure order is the same. */
ListBase new_lb_layer = {NULL, NULL};
- int runtime_flag = 0;
+ short runtime_flag = 0;
for (const CollectionChild *child = lb_scene->first; child; child = child->next) {
Collection *collection = child->collection;
@@ -642,13 +654,13 @@ static int layer_collection_sync(
}
/* Collection restrict is inherited. */
- int child_restrict = parent_restrict;
+ short child_restrict = parent_restrict;
if (!(collection->flag & COLLECTION_IS_MASTER)) {
child_restrict |= collection->flag;
}
/* Sync child collections. */
- int child_runtime_flag = layer_collection_sync(
+ short child_runtime_flag = layer_collection_sync(
view_layer, &collection->children,
&lc->layer_collections, new_object_bases,
lc->flag, child_restrict);
@@ -664,6 +676,10 @@ static int layer_collection_sync(
/* Sync objects, except if collection was excluded. */
for (CollectionObject *cob = collection->gobject.first; cob; cob = cob->next) {
+ if (cob->ob == NULL) {
+ continue;
+ }
+
Base *base = BLI_ghash_lookup(view_layer->object_bases_hash, cob->ob);
if (base) {
@@ -774,7 +790,7 @@ void BKE_layer_collection_sync(const Scene *scene, ViewLayer *view_layer)
const ListBase collections = {&child, &child};
ListBase new_object_bases = {NULL, NULL};
- const int parent_exclude = 0, parent_restrict = 0;
+ const short parent_exclude = 0, parent_restrict = 0;
layer_collection_sync(
view_layer, &collections,
&view_layer->layer_collections, &new_object_bases,
@@ -786,7 +802,9 @@ void BKE_layer_collection_sync(const Scene *scene, ViewLayer *view_layer)
view_layer->basact = NULL;
}
- BLI_ghash_remove(view_layer->object_bases_hash, base->object, NULL, NULL);
+ if (base->object) {
+ BLI_ghash_remove(view_layer->object_bases_hash, base->object, NULL, NULL);
+ }
}
BLI_freelistN(&view_layer->object_bases);
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 04ebaaf80b7..aa6cbcc343e 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -289,7 +289,7 @@ static int id_expand_local_callback(
return IDWALK_RET_NOP;
}
- /* Can hapen that we get unlinkable ID here, e.g. with shapekey referring to itself (through drivers)...
+ /* Can happen that we get unlinkable ID here, e.g. with shapekey referring to itself (through drivers)...
* Just skip it, shape key can only be either indirectly linked, or fully local, period.
* And let's curse one more time that stupid useless shapekey ID type! */
if (*id_pointer && *id_pointer != id_self && BKE_idcode_is_linkable(GS((*id_pointer)->name))) {
@@ -776,9 +776,9 @@ bool id_single_user(bContext *C, ID *id, PointerRNA *ptr, PropertyRNA *prop)
if (id_copy(bmain, id, &newid, false) && newid) {
/* copy animation actions too */
BKE_animdata_copy_id_action(bmain, id, false);
- /* us is 1 by convention, but RNA_property_pointer_set
- * will also increment it, so set it to zero */
- newid->us = 0;
+ /* us is 1 by convention with new IDs, but RNA_property_pointer_set
+ * will also increment it, decrement it here. */
+ id_us_min(newid);
/* assign copy */
RNA_id_pointer_create(newid, &idptr);
@@ -898,85 +898,6 @@ void BKE_libblock_management_usercounts_clear(Main *bmain, void *idv)
id->tag |= LIB_TAG_NO_USER_REFCOUNT;
}
-ListBase *which_libbase(Main *mainlib, short type)
-{
- switch ((ID_Type)type) {
- case ID_SCE:
- return &(mainlib->scene);
- case ID_LI:
- return &(mainlib->library);
- case ID_OB:
- return &(mainlib->object);
- case ID_ME:
- return &(mainlib->mesh);
- case ID_CU:
- return &(mainlib->curve);
- case ID_MB:
- return &(mainlib->mball);
- case ID_MA:
- return &(mainlib->mat);
- case ID_TE:
- return &(mainlib->tex);
- case ID_IM:
- return &(mainlib->image);
- case ID_LT:
- return &(mainlib->latt);
- case ID_LA:
- return &(mainlib->lamp);
- case ID_CA:
- return &(mainlib->camera);
- case ID_IP:
- return &(mainlib->ipo);
- case ID_KE:
- return &(mainlib->key);
- case ID_WO:
- return &(mainlib->world);
- case ID_SCR:
- return &(mainlib->screen);
- case ID_VF:
- return &(mainlib->vfont);
- case ID_TXT:
- return &(mainlib->text);
- case ID_SPK:
- return &(mainlib->speaker);
- case ID_LP:
- return &(mainlib->lightprobe);
- case ID_SO:
- return &(mainlib->sound);
- case ID_GR:
- return &(mainlib->collection);
- case ID_AR:
- return &(mainlib->armature);
- case ID_AC:
- return &(mainlib->action);
- case ID_NT:
- return &(mainlib->nodetree);
- case ID_BR:
- return &(mainlib->brush);
- case ID_PA:
- return &(mainlib->particle);
- case ID_WM:
- return &(mainlib->wm);
- case ID_GD:
- return &(mainlib->gpencil);
- case ID_MC:
- return &(mainlib->movieclip);
- case ID_MSK:
- return &(mainlib->mask);
- case ID_LS:
- return &(mainlib->linestyle);
- case ID_PAL:
- return &(mainlib->palettes);
- case ID_PC:
- return &(mainlib->paintcurves);
- case ID_CF:
- return &(mainlib->cachefiles);
- case ID_WS:
- return &(mainlib->workspaces);
- }
- return NULL;
-}
-
/**
* Clear or set given tags for all ids in listbase (runtime tags).
*/
@@ -1065,70 +986,6 @@ void BKE_main_lib_objects_recalc_all(Main *bmain)
DEG_id_type_tag(bmain, ID_OB);
}
-/**
- * puts into array *lb pointers to all the ListBase structs in main,
- * and returns the number of them as the function result. This is useful for
- * generic traversal of all the blocks in a Main (by traversing all the
- * lists in turn), without worrying about block types.
- *
- * \note MAX_LIBARRAY define should match this code */
-int set_listbasepointers(Main *main, ListBase **lb)
-{
- /* BACKWARDS! also watch order of free-ing! (mesh<->mat), first items freed last.
- * This is important because freeing data decreases usercounts of other datablocks,
- * if this data is its self freed it can crash. */
- lb[INDEX_ID_LI] = &(main->library); /* Libraries may be accessed from pretty much any other ID... */
- lb[INDEX_ID_IP] = &(main->ipo);
- lb[INDEX_ID_AC] = &(main->action); /* moved here to avoid problems when freeing with animato (aligorith) */
- lb[INDEX_ID_KE] = &(main->key);
- lb[INDEX_ID_PAL] = &(main->palettes); /* referenced by gpencil, so needs to be before that to avoid crashes */
- lb[INDEX_ID_GD] = &(main->gpencil); /* referenced by nodes, objects, view, scene etc, before to free after. */
- lb[INDEX_ID_NT] = &(main->nodetree);
- lb[INDEX_ID_IM] = &(main->image);
- lb[INDEX_ID_TE] = &(main->tex);
- lb[INDEX_ID_MA] = &(main->mat);
- lb[INDEX_ID_VF] = &(main->vfont);
-
- /* Important!: When adding a new object type,
- * the specific data should be inserted here
- */
-
- lb[INDEX_ID_AR] = &(main->armature);
-
- lb[INDEX_ID_CF] = &(main->cachefiles);
- lb[INDEX_ID_ME] = &(main->mesh);
- lb[INDEX_ID_CU] = &(main->curve);
- lb[INDEX_ID_MB] = &(main->mball);
-
- lb[INDEX_ID_LT] = &(main->latt);
- lb[INDEX_ID_LA] = &(main->lamp);
- lb[INDEX_ID_CA] = &(main->camera);
-
- lb[INDEX_ID_TXT] = &(main->text);
- lb[INDEX_ID_SO] = &(main->sound);
- lb[INDEX_ID_GR] = &(main->collection);
- lb[INDEX_ID_PAL] = &(main->palettes);
- lb[INDEX_ID_PC] = &(main->paintcurves);
- lb[INDEX_ID_BR] = &(main->brush);
- lb[INDEX_ID_PA] = &(main->particle);
- lb[INDEX_ID_SPK] = &(main->speaker);
- lb[INDEX_ID_LP] = &(main->lightprobe);
-
- lb[INDEX_ID_WO] = &(main->world);
- lb[INDEX_ID_MC] = &(main->movieclip);
- lb[INDEX_ID_SCR] = &(main->screen);
- lb[INDEX_ID_OB] = &(main->object);
- lb[INDEX_ID_LS] = &(main->linestyle); /* referenced by scenes */
- lb[INDEX_ID_SCE] = &(main->scene);
- lb[INDEX_ID_WS] = &(main->workspaces); /* before wm, so it's freed after it! */
- lb[INDEX_ID_WM] = &(main->wm);
- lb[INDEX_ID_MSK] = &(main->mask);
-
- lb[INDEX_ID_NULL] = NULL;
-
- return (MAX_LIBARRAY - 1);
-}
-
/* *********** ALLOC AND FREE *****************
*
* BKE_libblock_free(ListBase *lb, ID *id )
@@ -1373,6 +1230,9 @@ void BKE_libblock_init_empty(ID *id)
/* Should not be needed - animation from lib pre-2.5 is broken anyway. */
BLI_assert(0);
break;
+ case ID_PAL:
+ BKE_palette_init((Palette *)id);
+ break;
default:
BLI_assert(0); /* Should never reach this point... */
}
@@ -1413,18 +1273,6 @@ void *BKE_id_new_nomain(const short type, const char *name)
return id;
}
-/* by spec, animdata is first item after ID */
-/* and, trust that BKE_animdata_from_id() will only find AnimData for valid ID-types */
-static void id_copy_animdata(Main *bmain, ID *id, const bool do_action, const bool do_id_user)
-{
- AnimData *adt = BKE_animdata_from_id(id);
-
- if (adt) {
- IdAdtTemplate *iat = (IdAdtTemplate *)id;
- iat->adt = BKE_animdata_copy(bmain, iat->adt, do_action, do_id_user);
- }
-}
-
void BKE_libblock_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int flag)
{
ID *new_id = *r_newid;
@@ -1437,7 +1285,7 @@ void BKE_libblock_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int fla
BLI_assert((flag & LIB_ID_CREATE_NO_MAIN) != 0 || bmain != NULL);
BLI_assert((flag & LIB_ID_CREATE_NO_MAIN) != 0 || (flag & LIB_ID_CREATE_NO_ALLOCATE) == 0);
BLI_assert((flag & LIB_ID_CREATE_NO_MAIN) == 0 || (flag & LIB_ID_CREATE_NO_USER_REFCOUNT) != 0);
- /* Never implicitely copy shapekeys when generating temp data outside of Main database. */
+ /* Never implicitly copy shapekeys when generating temp data outside of Main database. */
BLI_assert((flag & LIB_ID_CREATE_NO_MAIN) == 0 || (flag & LIB_ID_COPY_SHAPEKEY) == 0);
if ((flag & LIB_ID_CREATE_NO_ALLOCATE) != 0) {
@@ -1475,16 +1323,17 @@ void BKE_libblock_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int fla
}
#endif
- /* the duplicate should get a copy of the animdata */
- if ((flag & LIB_ID_COPY_NO_ANIMDATA) == 0) {
- BLI_assert((flag & LIB_ID_COPY_ACTIONS) == 0 || (flag & LIB_ID_CREATE_NO_MAIN) == 0);
- id_copy_animdata(bmain, new_id,
- (flag & LIB_ID_COPY_ACTIONS) != 0 && (flag & LIB_ID_CREATE_NO_MAIN) == 0,
- (flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0);
- }
- else if (id_can_have_animdata(new_id)) {
+ if (id_can_have_animdata(new_id)) {
IdAdtTemplate *iat = (IdAdtTemplate *)new_id;
- iat->adt = NULL;
+
+ /* the duplicate should get a copy of the animdata */
+ if ((flag & LIB_ID_COPY_NO_ANIMDATA) == 0) {
+ BLI_assert((flag & LIB_ID_COPY_ACTIONS) == 0 || (flag & LIB_ID_CREATE_NO_MAIN) == 0);
+ iat->adt = BKE_animdata_copy(bmain, iat->adt, flag);
+ }
+ else {
+ iat->adt = NULL;
+ }
}
if ((flag & LIB_ID_CREATE_NO_DEG_TAG) == 0 && (flag & LIB_ID_CREATE_NO_MAIN) == 0) {
@@ -1519,254 +1368,6 @@ void BKE_library_free(Library *lib)
freePackedFile(lib->packedfile);
}
-Main *BKE_main_new(void)
-{
- Main *bmain = MEM_callocN(sizeof(Main), "new main");
- bmain->lock = MEM_mallocN(sizeof(SpinLock), "main lock");
- BLI_spin_init((SpinLock *)bmain->lock);
- return bmain;
-}
-
-void BKE_main_free(Main *mainvar)
-{
- /* also call when reading a file, erase all, etc */
- ListBase *lbarray[MAX_LIBARRAY];
- int a;
-
- MEM_SAFE_FREE(mainvar->blen_thumb);
-
- a = set_listbasepointers(mainvar, lbarray);
- while (a--) {
- ListBase *lb = lbarray[a];
- ID *id;
-
- while ( (id = lb->first) ) {
-#if 1
- BKE_libblock_free_ex(mainvar, id, false, false);
-#else
- /* errors freeing ID's can be hard to track down,
- * enable this so valgrind will give the line number in its error log */
- switch (a) {
- case 0: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 1: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 2: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 3: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 4: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 5: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 6: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 7: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 8: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 9: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 10: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 11: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 12: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 13: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 14: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 15: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 16: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 17: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 18: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 19: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 20: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 21: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 22: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 23: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 24: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 25: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 26: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 27: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 28: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 29: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 30: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 31: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 32: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 33: BKE_libblock_free_ex(mainvar, id, false, false); break;
- case 34: BKE_libblock_free_ex(mainvar, id, false, false); break;
- default:
- BLI_assert(0);
- break;
- }
-#endif
- }
- }
-
- if (mainvar->relations) {
- BKE_main_relations_free(mainvar);
- }
-
- BLI_spin_end((SpinLock *)mainvar->lock);
- MEM_freeN(mainvar->lock);
- MEM_freeN(mainvar);
-}
-
-void BKE_main_lock(struct Main *bmain)
-{
- BLI_spin_lock((SpinLock *) bmain->lock);
-}
-
-void BKE_main_unlock(struct Main *bmain)
-{
- BLI_spin_unlock((SpinLock *) bmain->lock);
-}
-
-
-static int main_relations_create_cb(void *user_data, ID *id_self, ID **id_pointer, int cb_flag)
-{
- MainIDRelations *rel = user_data;
-
- 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;
- }
- 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;
- }
- entry->id_pointer = (ID **)id_self;
- entry->usage_flag = cb_flag;
- *entry_p = entry;
- }
-
- return IDWALK_RET_NOP;
-}
-
-/** Generate the mappings between used IDs and their users, and vice-versa. */
-void BKE_main_relations_create(Main *bmain)
-{
- ListBase *lbarray[MAX_LIBARRAY];
- ID *id;
- int a;
-
- if (bmain->relations != NULL) {
- BKE_main_relations_free(bmain);
- }
-
- bmain->relations = MEM_mallocN(sizeof(*bmain->relations), __func__);
- bmain->relations->id_used_to_user = 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);
-
- for (a = set_listbasepointers(bmain, lbarray); a--; ) {
- for (id = lbarray[a]->first; id; id = id->next) {
- BKE_library_foreach_ID_link(NULL, id, main_relations_create_cb, bmain->relations, IDWALK_READONLY);
- }
- }
-}
-
-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);
- }
- BLI_mempool_destroy(bmain->relations->entry_pool);
- MEM_freeN(bmain->relations);
- bmain->relations = NULL;
- }
-}
-
-/**
- * Generates a raw .blend file thumbnail data from given image.
- *
- * \param bmain If not NULL, also store generated data in this Main.
- * \param img ImBuf image to generate thumbnail data from.
- * \return The generated .blend file raw thumbnail data.
- */
-BlendThumbnail *BKE_main_thumbnail_from_imbuf(Main *bmain, ImBuf *img)
-{
- BlendThumbnail *data = NULL;
-
- if (bmain) {
- MEM_SAFE_FREE(bmain->blen_thumb);
- }
-
- if (img) {
- const size_t sz = BLEN_THUMB_MEMSIZE(img->x, img->y);
- data = MEM_mallocN(sz, __func__);
-
- IMB_rect_from_float(img); /* Just in case... */
- data->width = img->x;
- data->height = img->y;
- memcpy(data->rect, img->rect, sz - sizeof(*data));
- }
-
- if (bmain) {
- bmain->blen_thumb = data;
- }
- return data;
-}
-
-/**
- * Generates an image from raw .blend file thumbnail \a data.
- *
- * \param bmain Use this bmain->blen_thumb data if given \a data is NULL.
- * \param data Raw .blend file thumbnail data.
- * \return An ImBuf from given data, or NULL if invalid.
- */
-ImBuf *BKE_main_thumbnail_to_imbuf(Main *bmain, BlendThumbnail *data)
-{
- ImBuf *img = NULL;
-
- if (!data && bmain) {
- data = bmain->blen_thumb;
- }
-
- if (data) {
- /* Note: we cannot use IMB_allocFromBuffer(), since it tries to dupalloc passed buffer, which will fail
- * here (we do not want to pass the first two ints!). */
- img = IMB_allocImBuf((unsigned int)data->width, (unsigned int)data->height, 32, IB_rect | IB_metadata);
- memcpy(img->rect, data->rect, BLEN_THUMB_MEMSIZE(data->width, data->height) - sizeof(*data));
- }
-
- return img;
-}
-
-/**
- * Generates an empty (black) thumbnail for given Main.
- */
-void BKE_main_thumbnail_create(struct Main *bmain)
-{
- MEM_SAFE_FREE(bmain->blen_thumb);
-
- bmain->blen_thumb = MEM_callocN(BLEN_THUMB_MEMSIZE(BLEN_THUMB_SIZE, BLEN_THUMB_SIZE), __func__);
- bmain->blen_thumb->width = BLEN_THUMB_SIZE;
- bmain->blen_thumb->height = BLEN_THUMB_SIZE;
-}
-
-/**
- * Return filepath of given \a main.
- */
-const char *BKE_main_blendfile_path(const Main *bmain)
-{
- return bmain->name;
-}
-
-/**
- * Return filepath of global main (G_MAIN).
- *
- * \warning Usage is not recommended, you should always try to get a valid Main pointer from context...
- */
-const char *BKE_main_blendfile_path_from_global(void)
-{
- return BKE_main_blendfile_path(G_MAIN);
-}
-
/* ***************** ID ************************ */
ID *BKE_libblock_find_name(struct Main *bmain, const short type, const char *name)
{
@@ -2523,35 +2124,58 @@ void BKE_libblock_rename(Main *bmain, ID *id, const char *name)
}
/**
- * Returns in name the name of the block, with a 3-character prefix prepended
- * indicating whether it comes from a library, has a fake user, or no users.
+ * Generate full name of the data-block (without ID code, but with library is any)
+ *
+ * \note Result is unique to a given ID type in a given Main database.
+ *
+ * \param name An allocated string of minimal length MAX_ID_FULL_NAME, will be filled with generated string.
+ */
+void BKE_id_full_name_get(char name[MAX_ID_FULL_NAME], const ID *id)
+{
+ strcpy(name, id->name + 2);
+
+ if (id->lib != NULL) {
+ const size_t idname_len = strlen(id->name + 2);
+ const size_t libname_len = strlen(id->lib->id.name + 2);
+
+ name[idname_len] = ' ';
+ name[idname_len + 1] = '[';
+ strcpy(name + idname_len + 2, id->lib->id.name + 2);
+ name[idname_len + 2 + libname_len] = ']';
+ name[idname_len + 2 + libname_len + 1] = '\0';
+ }
+}
+
+/**
+ * Generate full name of the data-block (without ID code, but with library is any), with a 3-character prefix prepended
+ * indicating whether it comes from a library, is overriding, has a fake or no user, etc.
+ *
+ * \note Result is unique to a given ID type in a given Main database.
+ *
+ * \param name An allocated string of minimal length MAX_ID_FULL_NAME_UI, will be filled with generated string.
*/
-void BKE_id_ui_prefix(char name[MAX_ID_NAME + 1], const ID *id)
+void BKE_id_full_name_ui_prefix_get(char name[MAX_ID_FULL_NAME_UI], const ID *id)
{
- name[0] = id->lib ? (ID_MISSING(id) ? 'M' : 'L') : ' ';
+ name[0] = id->lib ? (ID_MISSING(id) ? 'M' : 'L') : ID_IS_STATIC_OVERRIDE(id) ? 'O' : ' ';
name[1] = (id->flag & LIB_FAKEUSER) ? 'F' : ((id->us == 0) ? '0' : ' ');
name[2] = ' ';
- strcpy(name + 3, id->name + 2);
+ BKE_id_full_name_get(name + 3, id);
}
/**
- * Returns an allocated string concatenating ID name (including two-chars type code) and its lib name if any,
- * which is expected to be unique in a given Main database..
+ * Generate a concatenation of ID name (including two-chars type code) and its lib name, if any.
+ *
+ * \return A unique allocated string key for any ID in the whole Main database.
*/
char *BKE_id_to_unique_string_key(const struct ID *id)
{
- const size_t key_len_base = strlen(id->name) + 1;
- const size_t key_len_ext = ((id->lib != NULL) ? strlen(id->lib->name) : 0) + 1;
- const size_t key_len = key_len_base + key_len_ext - 1;
- char *key = MEM_mallocN(key_len, __func__);
-
- BLI_strncpy(key, id->name, key_len_base);
- if (id->lib != NULL) {
- BLI_strncpy(key + key_len_base - 1, id->lib->name, key_len_ext);
- }
+ char name[MAX_ID_FULL_NAME + 2];
+ name[0] = id->name[0];
+ name[1] = id->name[1];
+ BKE_id_full_name_get(name + 2, id);
- return key;
+ return BLI_strdup(name);
}
void BKE_library_filepath_set(Main *bmain, Library *lib, const char *filepath)
@@ -2591,8 +2215,103 @@ void BKE_id_tag_clear_atomic(ID *id, int tag)
/** Check that given ID pointer actually is in G_MAIN.
* Main intended use is for debug asserts in places we cannot easily get rid of G_Main... */
-bool BKE_id_is_in_gobal_main(ID *id)
+bool BKE_id_is_in_global_main(ID *id)
{
/* We do not want to fail when id is NULL here, even though this is a bit strange behavior... */
return (id == NULL || BLI_findindex(which_libbase(G_MAIN, GS(id->name)), id) != -1);
}
+
+/************************* Datablock order in UI **************************/
+
+static int *id_order_get(ID *id)
+{
+ /* Only for workspace tabs currently. */
+ switch (GS(id->name)) {
+ case ID_WS:
+ return &((WorkSpace *)id)->order;
+ default:
+ return NULL;
+ }
+}
+
+static int id_order_compare(const void *a, const void *b)
+{
+ ID *id_a = ((LinkData *)a)->data;
+ ID *id_b = ((LinkData *)b)->data;
+
+ int *order_a = id_order_get(id_a);
+ int *order_b = id_order_get(id_b);
+
+ if (order_a && order_b) {
+ if (*order_a < *order_b) {
+ return -1;
+ }
+ else if (*order_a > *order_b) {
+ return 1;
+ }
+ }
+
+ return strcmp(id_a->name, id_b->name);
+}
+
+/**
+ * Returns ordered list of datablocks for display in the UI.
+ * Result is list of LinkData of IDs that must be freed.
+ */
+void BKE_id_ordered_list(ListBase *ordered_lb, const ListBase *lb)
+{
+ BLI_listbase_clear(ordered_lb);
+
+ for (ID *id = lb->first; id; id = id->next) {
+ BLI_addtail(ordered_lb, BLI_genericNodeN(id));
+ }
+
+ BLI_listbase_sort(ordered_lb, id_order_compare);
+
+ int num = 0;
+ for (LinkData *link = ordered_lb->first; link; link = link->next) {
+ int *order = id_order_get(link->data);
+ if (order) {
+ *order = num++;
+ }
+ }
+}
+
+/**
+ * Reorder ID in the list, before or after the "relative" ID.
+ */
+void BKE_id_reorder(const ListBase *lb, ID *id, ID *relative, bool after)
+{
+ int *id_order = id_order_get(id);
+ int relative_order;
+
+ if (relative) {
+ relative_order = *id_order_get(relative);
+ }
+ else {
+ relative_order = (after) ? BLI_listbase_count(lb) : 0;
+ }
+
+ if (after) {
+ /* Insert after. */
+ for (ID *other = lb->first; other; other = other->next) {
+ int *order = id_order_get(other);
+ if (*order > relative_order) {
+ (*order)++;
+ }
+ }
+
+ *id_order = relative_order + 1;
+ }
+ else {
+ /* Insert before. */
+ for (ID *other = lb->first; other; other = other->next) {
+ int *order = id_order_get(other);
+ if (*order < relative_order) {
+ (*order)--;
+ }
+ }
+
+ *id_order = relative_order - 1;
+ }
+}
diff --git a/source/blender/blenkernel/intern/library_idmap.c b/source/blender/blenkernel/intern/library_idmap.c
index daf097b9f0b..1cc13b39a97 100644
--- a/source/blender/blenkernel/intern/library_idmap.c
+++ b/source/blender/blenkernel/intern/library_idmap.c
@@ -32,6 +32,7 @@
#include "BKE_idcode.h"
#include "BKE_library.h"
#include "BKE_library_idmap.h" /* own include */
+#include "BKE_main.h"
/** \file blender/blenkernel/intern/library_idmap.c
* \ingroup bke
diff --git a/source/blender/blenkernel/intern/library_override.c b/source/blender/blenkernel/intern/library_override.c
index 150092392b4..714730b2f52 100644
--- a/source/blender/blenkernel/intern/library_override.c
+++ b/source/blender/blenkernel/intern/library_override.c
@@ -59,6 +59,19 @@ static void bke_override_property_operation_copy(IDOverrideStaticPropertyOperati
static void bke_override_property_clear(IDOverrideStaticProperty *op);
static void bke_override_property_operation_clear(IDOverrideStaticPropertyOperation *opop);
+/* Temp, for until static override is ready and tested enough to go 'public', we hide it by default in UI and such. */
+static bool _override_static_enabled = false;
+
+void BKE_override_static_enable(const bool do_enable)
+{
+ _override_static_enabled = do_enable;
+}
+
+bool BKE_override_static_is_enabled()
+{
+ return _override_static_enabled;
+}
+
/** Initialize empty overriding of \a reference_id by \a local_id. */
IDOverrideStatic *BKE_override_static_init(ID *local_id, ID *reference_id)
{
@@ -169,7 +182,7 @@ static ID *override_static_create_from(Main *bmain, ID *reference_id)
}
-/** Create an overriden local copy of linked reference. */
+/** Create an overridden local copy of linked reference. */
ID *BKE_override_static_create_from_id(Main *bmain, ID *reference_id)
{
BLI_assert(reference_id != NULL);
@@ -177,13 +190,13 @@ ID *BKE_override_static_create_from_id(Main *bmain, ID *reference_id)
ID *local_id = override_static_create_from(bmain, reference_id);
- /* Remapping, we obviously only want to affect local data (and not our own reference pointer to overriden ID). */
+ /* Remapping, we obviously only want to affect local data (and not our own reference pointer to overridden ID). */
BKE_libblock_remap(bmain, reference_id, local_id, ID_REMAP_SKIP_INDIRECT_USAGE | ID_REMAP_SKIP_STATIC_OVERRIDE);
return local_id;
}
-/** Create overriden local copies of all tagged data-blocks in given Main.
+/** Create overridden local copies of all tagged data-blocks in given Main.
*
* \note Set id->newid of overridden libs with newly created overrides, caller is responsible to clean those pointers
* before/after usage as needed.
@@ -207,7 +220,7 @@ bool BKE_override_static_create_from_tag(Main *bmain)
}
}
- /* Remapping, we obviously only want to affect local data (and not our own reference pointer to overriden ID). */
+ /* Remapping, we obviously only want to affect local data (and not our own reference pointer to overridden ID). */
a = num_types;
while (a--) {
for (ID *reference_id = lbarray[a]->first; reference_id != NULL; reference_id = reference_id->next) {
@@ -236,7 +249,7 @@ IDOverrideStaticProperty *BKE_override_static_property_find(IDOverrideStatic *ov
*/
IDOverrideStaticProperty *BKE_override_static_property_get(IDOverrideStatic *override, const char *rna_path, bool *r_created)
{
- /* XXX TODO we'll most likely want a runtime ghash to store taht mapping at some point. */
+ /* XXX TODO we'll most likely want a runtime ghash to store that mapping at some point. */
IDOverrideStaticProperty *op = BKE_override_static_property_find(override, rna_path);
if (op == NULL) {
@@ -587,7 +600,7 @@ void BKE_main_override_static_operations_create(Main *bmain, const bool force_au
}
}
-/** Update given override from its reference (re-applying overriden properties). */
+/** Update given override from its reference (re-applying overridden properties). */
void BKE_override_static_update(Main *bmain, ID *local)
{
if (local->override_static == NULL || local->override_static->reference == NULL) {
@@ -681,7 +694,7 @@ void BKE_main_override_static_update(Main *bmain)
* II) We store the differential value into a second 'ghost' data-block, which is an empty ID of same type as local one,
* where we only define values that need differential data.
*
- * This avoids us having to modify 'real' data-block at write time (and retoring it afterwards), which is inneficient,
+ * This avoids us having to modify 'real' data-block at write time (and restoring it afterwards), which is inneficient,
* and potentially dangerous (in case of concurrent access...), while not using much extra memory in typical cases.
* It also ensures stored data-block always contains exact same data as "desired" ones (kind of "baked" data-blocks).
*/
diff --git a/source/blender/blenkernel/intern/library_query.c b/source/blender/blenkernel/intern/library_query.c
index c569f43e7f4..ea1b35e4c1e 100644
--- a/source/blender/blenkernel/intern/library_query.c
+++ b/source/blender/blenkernel/intern/library_query.c
@@ -72,6 +72,7 @@
#include "BKE_collection.h"
#include "BKE_constraint.h"
#include "BKE_fcurve.h"
+#include "BKE_gpencil_modifier.h"
#include "BKE_idprop.h"
#include "BKE_library.h"
#include "BKE_library_query.h"
@@ -195,6 +196,15 @@ static void library_foreach_modifiersForeachIDLink(
FOREACH_FINALIZE_VOID;
}
+static void library_foreach_gpencil_modifiersForeachIDLink(
+ void *user_data, Object *UNUSED(object), ID **id_pointer, int cb_flag)
+{
+ LibraryForeachIDData *data = (LibraryForeachIDData *) user_data;
+ FOREACH_CALLBACK_INVOKE_ID_PP(data, id_pointer, cb_flag);
+
+ FOREACH_FINALIZE_VOID;
+}
+
static void library_foreach_constraintObjectLooper(bConstraint *UNUSED(con), ID **id_pointer,
bool is_reference, void *user_data)
{
@@ -270,6 +280,9 @@ static void library_foreach_mtex(LibraryForeachIDData *data, MTex *mtex)
static void library_foreach_paint(LibraryForeachIDData *data, Paint *paint)
{
FOREACH_CALLBACK_INVOKE(data, paint->brush, IDWALK_CB_USER);
+ for (int i = 0; i < paint->tool_slots_len; i++) {
+ FOREACH_CALLBACK_INVOKE(data, paint->tool_slots[i].brush, IDWALK_CB_USER);
+ }
FOREACH_CALLBACK_INVOKE(data, paint->palette, IDWALK_CB_USER);
FOREACH_FINALIZE_VOID;
@@ -570,6 +583,7 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
}
modifiers_foreachIDLink(object, library_foreach_modifiersForeachIDLink, &data);
+ BKE_gpencil_modifiers_foreachIDLink(object, library_foreach_gpencil_modifiersForeachIDLink, &data);
BKE_constraints_id_loop(&object->constraints, library_foreach_constraintObjectLooper, &data);
for (psys = object->particlesystem.first; psys; psys = psys->next) {
@@ -949,8 +963,8 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
bScreen *screen = BKE_workspace_layout_screen_get(layout);
/* CALLBACK_INVOKE expects an actual pointer, not a variable holding the pointer.
- * However we can't acess layout->screen here since we are outside the workspace project. */
- CALLBACK_INVOKE(screen, IDWALK_CB_NOP);
+ * However we can't access layout->screen here since we are outside the workspace project. */
+ CALLBACK_INVOKE(screen, IDWALK_CB_USER);
/* allow callback to set a different screen */
BKE_workspace_layout_screen_set(layout, screen);
}
@@ -1053,14 +1067,8 @@ bool BKE_library_id_can_use_idtype(ID *id_owner, const short id_type_used)
return (ELEM(id_type_used, ID_OB, ID_WO, ID_SCE, ID_MC, ID_MA, ID_GR, ID_TXT,
ID_LS, ID_MSK, ID_SO, ID_GD, ID_BR, ID_PAL, ID_IM, ID_NT));
case ID_OB:
- /* Could be the following, but simpler to just always say 'yes' here. */
-#if 0
- return ELEM(id_type_used, ID_ME, ID_CU, ID_MB, ID_LT, ID_SPK, ID_AR, ID_LA, ID_CA, /* obdata */
- ID_OB, ID_MA, ID_GD, ID_GR, ID_TE, ID_PA, ID_TXT, ID_SO, ID_MC, ID_IM, ID_AC
- /* + constraints and modifiers ... */);
-#else
+ /* Could be more specific, but simpler to just always say 'yes' here. */
return true;
-#endif
case ID_ME:
return ELEM(id_type_used, ID_ME, ID_KE, ID_MA, ID_IM);
case ID_CU:
@@ -1088,12 +1096,8 @@ bool BKE_library_id_can_use_idtype(ID *id_owner, const short id_type_used)
case ID_GR:
return ELEM(id_type_used, ID_OB, ID_GR);
case ID_NT:
- /* Could be the following, but node.id has no type restriction... */
-#if 0
- return ELEM(id_type_used, ID_GD /* + node.id types... */);
-#else
+ /* Could be more specific, but node.id has no type restriction... */
return true;
-#endif
case ID_BR:
return ELEM(id_type_used, ID_BR, ID_IM, ID_PC, ID_TE, ID_MA);
case ID_PA:
diff --git a/source/blender/blenkernel/intern/library_remap.c b/source/blender/blenkernel/intern/library_remap.c
index cf4b6117599..02ea8cc8227 100644
--- a/source/blender/blenkernel/intern/library_remap.c
+++ b/source/blender/blenkernel/intern/library_remap.c
@@ -263,81 +263,9 @@ static int foreach_libblock_remap_callback(void *user_data, ID *id_self, ID **id
return IDWALK_RET_NOP;
}
-/* Some remapping unfortunately require extra and/or specific handling, tackle those here. */
-static void libblock_remap_data_preprocess_scene_object_unlink(
- IDRemap *r_id_remap_data, Scene *sce, Object *ob, const bool skip_indirect, const bool is_indirect)
-{
- if (skip_indirect && is_indirect) {
- r_id_remap_data->skipped_indirect++;
- r_id_remap_data->skipped_refcounted++;
- }
- else {
- /* Remove object from all collections in the scene. free_use is false
- * to avoid recursively calling object free again. */
- BKE_scene_collections_object_remove(r_id_remap_data->bmain, sce, ob, false);
- if (!is_indirect) {
- r_id_remap_data->status |= ID_REMAP_IS_LINKED_DIRECT;
- }
- }
-}
-
-static void libblock_remap_data_preprocess_collection_unlink(
- IDRemap *r_id_remap_data, Object *ob, const bool skip_indirect, const bool is_indirect)
-{
- Main *bmain = r_id_remap_data->bmain;
- for (Collection *collection = bmain->collection.first; collection; collection = collection->id.next) {
- if (!BKE_collection_is_in_scene(collection) && BKE_collection_has_object(collection, ob)) {
- if (skip_indirect && is_indirect) {
- r_id_remap_data->skipped_indirect++;
- r_id_remap_data->skipped_refcounted++;
- }
- else {
- BKE_collection_object_remove(bmain, collection, ob, false);
- if (!is_indirect) {
- r_id_remap_data->status |= ID_REMAP_IS_LINKED_DIRECT;
- }
- }
- }
- }
-}
-
static void libblock_remap_data_preprocess(IDRemap *r_id_remap_data)
{
switch (GS(r_id_remap_data->id->name)) {
- case ID_SCE:
- {
- Scene *sce = (Scene *)r_id_remap_data->id;
-
- if (!r_id_remap_data->new_id) {
- const bool is_indirect = (sce->id.lib != NULL);
- const bool skip_indirect = (r_id_remap_data->flag & ID_REMAP_SKIP_INDIRECT_USAGE) != 0;
-
- /* In case we are unlinking... */
- if (!r_id_remap_data->old_id) {
- /* TODO: how is it valid to iterator over a scene while
- * removing objects from it? can't this crash? */
- /* ... everything from scene. */
- FOREACH_SCENE_OBJECT_BEGIN(sce, ob_iter)
- {
- libblock_remap_data_preprocess_scene_object_unlink(
- r_id_remap_data, sce, ob_iter, skip_indirect, is_indirect);
- libblock_remap_data_preprocess_collection_unlink(
- r_id_remap_data, ob_iter, skip_indirect, is_indirect);
- }
- FOREACH_SCENE_OBJECT_END;
- }
- else if (GS(r_id_remap_data->old_id->name) == ID_OB) {
- /* ... a specific object from scene. */
- Object *old_ob = (Object *)r_id_remap_data->old_id;
- libblock_remap_data_preprocess_scene_object_unlink(
- r_id_remap_data, sce, old_ob, skip_indirect, is_indirect);
- libblock_remap_data_preprocess_collection_unlink(
- r_id_remap_data, old_ob, skip_indirect, is_indirect);
- }
-
- }
- break;
- }
case ID_OB:
{
ID *old_id = r_id_remap_data->old_id;
@@ -363,38 +291,49 @@ static void libblock_remap_data_preprocess(IDRemap *r_id_remap_data)
}
}
+/* Can be called with both old_ob and new_ob being NULL, this means we have to check whole Main database then. */
static void libblock_remap_data_postprocess_object_update(Main *bmain, Object *old_ob, Object *new_ob)
{
if (new_ob == NULL) {
- /* In case we unlinked old_ob (new_ob is NULL), the object has already
- * been removed from the scenes and their collections. We still have
- * to remove the NULL children from collections not used in any scene. */
+ /* In case we unlinked old_ob (new_ob is NULL), the object has already
+ * been removed from the scenes and their collections. We still have
+ * to remove the NULL children from collections not used in any scene. */
BKE_collections_object_remove_nulls(bmain);
}
- else {
- BKE_main_collection_sync_remap(bmain);
- }
- if (old_ob->type == OB_MBALL) {
- for (Object *ob = bmain->object.first; ob; ob = ob->id.next) {
+ BKE_main_collection_sync_remap(bmain);
+
+ if (old_ob == NULL) {
+ for (Object *ob = bmain->object.first; ob != NULL; ob = ob->id.next) {
+ if (ob->type == OB_MBALL && BKE_mball_is_basis(ob)) {
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ }
+ }
+ }
+ else {
+ for (Object *ob = bmain->object.first; ob != NULL; ob = ob->id.next) {
if (ob->type == OB_MBALL && BKE_mball_is_basis_for(ob, old_ob)) {
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ break; /* There is only one basis... */
}
}
}
}
-static void libblock_remap_data_postprocess_collection_update(Main *bmain, Collection *old_collection, Collection *new_collection)
+/* Can be called with both old_collection and new_collection being NULL,
+ * this means we have to check whole Main database then. */
+static void libblock_remap_data_postprocess_collection_update(
+ Main *bmain, Collection *UNUSED(old_collection), Collection *new_collection)
{
if (new_collection == NULL) {
- /* In case we unlinked old_collection (new_collection is NULL), we need
- * to remove any collection children that have been set to NULL in the
- * because of pointer replacement. */
- BKE_collections_child_remove_nulls(bmain, old_collection);
- }
- else {
- BKE_main_collection_sync_remap(bmain);
+ /* XXX Complex cases can lead to NULL pointers in other collections than old_collection,
+ * and BKE_main_collection_sync_remap() does not tolerate any of those, so for now always check whole
+ * existing collections for NULL pointers.
+ * I'd consider optimizing that whole collection remapping process a TODO for later. */
+ BKE_collections_child_remove_nulls(bmain, NULL /*old_collection*/);
}
+
+ BKE_main_collection_sync_remap(bmain);
}
static void libblock_remap_data_postprocess_obdata_relink(Main *bmain, Object *ob, ID *new_id)
@@ -510,7 +449,7 @@ ATTR_NONNULL(1) static void libblock_remap_data(
}
#ifdef DEBUG_PRINT
- printf("%s: %d occurences skipped (%d direct and %d indirect ones)\n", __func__,
+ printf("%s: %d occurrences skipped (%d direct and %d indirect ones)\n", __func__,
r_id_remap_data->skipped_direct + r_id_remap_data->skipped_indirect,
r_id_remap_data->skipped_direct, r_id_remap_data->skipped_indirect);
#endif
@@ -678,10 +617,8 @@ void BKE_libblock_relink_ex(
if (old_id) {
switch (GS(old_id->name)) {
case ID_OB:
- {
libblock_remap_data_postprocess_object_update(bmain, (Object *)old_id, (Object *)new_id);
break;
- }
case ID_GR:
libblock_remap_data_postprocess_collection_update(bmain, (Collection *)old_id, (Collection *)new_id);
break;
@@ -691,12 +628,8 @@ void BKE_libblock_relink_ex(
}
else {
/* No choice but to check whole objects/collections. */
- for (Object *ob = bmain->object.first; ob; ob = ob->id.next) {
- libblock_remap_data_postprocess_object_update(bmain, ob, NULL);
- }
- for (Collection *collection = bmain->collection.first; collection; collection = collection->id.next) {
- libblock_remap_data_postprocess_collection_update(bmain, collection, NULL);
- }
+ libblock_remap_data_postprocess_collection_update(bmain, NULL, NULL);
+ libblock_remap_data_postprocess_object_update(bmain, NULL, NULL);
}
break;
}
diff --git a/source/blender/blenkernel/intern/lightprobe.c b/source/blender/blenkernel/intern/lightprobe.c
index baf0cdbe62f..4cb2b450afe 100644
--- a/source/blender/blenkernel/intern/lightprobe.c
+++ b/source/blender/blenkernel/intern/lightprobe.c
@@ -37,8 +37,9 @@
#include "BKE_animsys.h"
#include "BKE_global.h"
-#include "BKE_main.h"
+#include "BKE_library.h"
#include "BKE_lightprobe.h"
+#include "BKE_main.h"
void BKE_lightprobe_init(LightProbe *probe)
{
diff --git a/source/blender/blenkernel/intern/main.c b/source/blender/blenkernel/intern/main.c
new file mode 100644
index 00000000000..6291e35e968
--- /dev/null
+++ b/source/blender/blenkernel/intern/main.c
@@ -0,0 +1,446 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenkernel/intern/main.c
+ * \ingroup bke
+ *
+ * Contains management of Main database itself.
+ */
+
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_ghash.h"
+#include "BLI_mempool.h"
+#include "BLI_threads.h"
+
+#include "DNA_ID.h"
+
+#include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_library_query.h"
+#include "BKE_main.h"
+
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
+
+Main *BKE_main_new(void)
+{
+ Main *bmain = MEM_callocN(sizeof(Main), "new main");
+ bmain->lock = MEM_mallocN(sizeof(SpinLock), "main lock");
+ BLI_spin_init((SpinLock *)bmain->lock);
+ return bmain;
+}
+
+void BKE_main_free(Main *mainvar)
+{
+ /* also call when reading a file, erase all, etc */
+ ListBase *lbarray[MAX_LIBARRAY];
+ int a;
+
+ MEM_SAFE_FREE(mainvar->blen_thumb);
+
+ a = set_listbasepointers(mainvar, lbarray);
+ while (a--) {
+ ListBase *lb = lbarray[a];
+ ID *id;
+
+ while ( (id = lb->first) ) {
+#if 1
+ BKE_libblock_free_ex(mainvar, id, false, false);
+#else
+ /* errors freeing ID's can be hard to track down,
+ * enable this so valgrind will give the line number in its error log */
+ switch (a) {
+ case 0: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 1: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 2: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 3: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 4: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 5: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 6: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 7: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 8: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 9: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 10: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 11: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 12: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 13: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 14: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 15: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 16: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 17: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 18: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 19: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 20: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 21: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 22: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 23: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 24: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 25: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 26: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 27: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 28: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 29: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 30: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 31: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 32: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 33: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ case 34: BKE_libblock_free_ex(mainvar, id, false, false); break;
+ default:
+ BLI_assert(0);
+ break;
+ }
+#endif
+ }
+ }
+
+ if (mainvar->relations) {
+ BKE_main_relations_free(mainvar);
+ }
+
+ BLI_spin_end((SpinLock *)mainvar->lock);
+ MEM_freeN(mainvar->lock);
+ MEM_freeN(mainvar);
+}
+
+void BKE_main_lock(struct Main *bmain)
+{
+ BLI_spin_lock((SpinLock *) bmain->lock);
+}
+
+void BKE_main_unlock(struct Main *bmain)
+{
+ BLI_spin_unlock((SpinLock *) bmain->lock);
+}
+
+
+static int main_relations_create_cb(void *user_data, ID *id_self, ID **id_pointer, int cb_flag)
+{
+ MainIDRelations *rel = user_data;
+
+ 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;
+ }
+ 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;
+ }
+ entry->id_pointer = (ID **)id_self;
+ entry->usage_flag = cb_flag;
+ *entry_p = entry;
+ }
+
+ return IDWALK_RET_NOP;
+}
+
+/** Generate the mappings between used IDs and their users, and vice-versa. */
+void BKE_main_relations_create(Main *bmain)
+{
+ ListBase *lbarray[MAX_LIBARRAY];
+ ID *id;
+ int a;
+
+ if (bmain->relations != NULL) {
+ BKE_main_relations_free(bmain);
+ }
+
+ bmain->relations = MEM_mallocN(sizeof(*bmain->relations), __func__);
+ bmain->relations->id_used_to_user = 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);
+
+ for (a = set_listbasepointers(bmain, lbarray); a--; ) {
+ for (id = lbarray[a]->first; id; id = id->next) {
+ BKE_library_foreach_ID_link(NULL, id, main_relations_create_cb, bmain->relations, IDWALK_READONLY);
+ }
+ }
+}
+
+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);
+ }
+ BLI_mempool_destroy(bmain->relations->entry_pool);
+ MEM_freeN(bmain->relations);
+ bmain->relations = NULL;
+ }
+}
+
+/**
+ * Generates a raw .blend file thumbnail data from given image.
+ *
+ * \param bmain If not NULL, also store generated data in this Main.
+ * \param img ImBuf image to generate thumbnail data from.
+ * \return The generated .blend file raw thumbnail data.
+ */
+BlendThumbnail *BKE_main_thumbnail_from_imbuf(Main *bmain, ImBuf *img)
+{
+ BlendThumbnail *data = NULL;
+
+ if (bmain) {
+ MEM_SAFE_FREE(bmain->blen_thumb);
+ }
+
+ if (img) {
+ const size_t sz = BLEN_THUMB_MEMSIZE(img->x, img->y);
+ data = MEM_mallocN(sz, __func__);
+
+ IMB_rect_from_float(img); /* Just in case... */
+ data->width = img->x;
+ data->height = img->y;
+ memcpy(data->rect, img->rect, sz - sizeof(*data));
+ }
+
+ if (bmain) {
+ bmain->blen_thumb = data;
+ }
+ return data;
+}
+
+/**
+ * Generates an image from raw .blend file thumbnail \a data.
+ *
+ * \param bmain Use this bmain->blen_thumb data if given \a data is NULL.
+ * \param data Raw .blend file thumbnail data.
+ * \return An ImBuf from given data, or NULL if invalid.
+ */
+ImBuf *BKE_main_thumbnail_to_imbuf(Main *bmain, BlendThumbnail *data)
+{
+ ImBuf *img = NULL;
+
+ if (!data && bmain) {
+ data = bmain->blen_thumb;
+ }
+
+ if (data) {
+ /* Note: we cannot use IMB_allocFromBuffer(), since it tries to dupalloc passed buffer, which will fail
+ * here (we do not want to pass the first two ints!). */
+ img = IMB_allocImBuf((unsigned int)data->width, (unsigned int)data->height, 32, IB_rect | IB_metadata);
+ memcpy(img->rect, data->rect, BLEN_THUMB_MEMSIZE(data->width, data->height) - sizeof(*data));
+ }
+
+ return img;
+}
+
+/**
+ * Generates an empty (black) thumbnail for given Main.
+ */
+void BKE_main_thumbnail_create(struct Main *bmain)
+{
+ MEM_SAFE_FREE(bmain->blen_thumb);
+
+ bmain->blen_thumb = MEM_callocN(BLEN_THUMB_MEMSIZE(BLEN_THUMB_SIZE, BLEN_THUMB_SIZE), __func__);
+ bmain->blen_thumb->width = BLEN_THUMB_SIZE;
+ bmain->blen_thumb->height = BLEN_THUMB_SIZE;
+}
+
+/**
+ * Return filepath of given \a main.
+ */
+const char *BKE_main_blendfile_path(const Main *bmain)
+{
+ return bmain->name;
+}
+
+/**
+ * Return filepath of global main (G_MAIN).
+ *
+ * \warning Usage is not recommended, you should always try to get a valid Main pointer from context...
+ */
+const char *BKE_main_blendfile_path_from_global(void)
+{
+ return BKE_main_blendfile_path(G_MAIN);
+}
+
+/**
+ * \return A pointer to the \a ListBase of given \a bmain for requested \a type ID type.
+ */
+ListBase *which_libbase(Main *bmain, short type)
+{
+ switch ((ID_Type)type) {
+ case ID_SCE:
+ return &(bmain->scene);
+ case ID_LI:
+ return &(bmain->library);
+ case ID_OB:
+ return &(bmain->object);
+ case ID_ME:
+ return &(bmain->mesh);
+ case ID_CU:
+ return &(bmain->curve);
+ case ID_MB:
+ return &(bmain->mball);
+ case ID_MA:
+ return &(bmain->mat);
+ case ID_TE:
+ return &(bmain->tex);
+ case ID_IM:
+ return &(bmain->image);
+ case ID_LT:
+ return &(bmain->latt);
+ case ID_LA:
+ return &(bmain->lamp);
+ case ID_CA:
+ return &(bmain->camera);
+ case ID_IP:
+ return &(bmain->ipo);
+ case ID_KE:
+ return &(bmain->key);
+ case ID_WO:
+ return &(bmain->world);
+ case ID_SCR:
+ return &(bmain->screen);
+ case ID_VF:
+ return &(bmain->vfont);
+ case ID_TXT:
+ return &(bmain->text);
+ case ID_SPK:
+ return &(bmain->speaker);
+ case ID_LP:
+ return &(bmain->lightprobe);
+ case ID_SO:
+ return &(bmain->sound);
+ case ID_GR:
+ return &(bmain->collection);
+ case ID_AR:
+ return &(bmain->armature);
+ case ID_AC:
+ return &(bmain->action);
+ case ID_NT:
+ return &(bmain->nodetree);
+ case ID_BR:
+ return &(bmain->brush);
+ case ID_PA:
+ return &(bmain->particle);
+ case ID_WM:
+ return &(bmain->wm);
+ case ID_GD:
+ return &(bmain->gpencil);
+ case ID_MC:
+ return &(bmain->movieclip);
+ case ID_MSK:
+ return &(bmain->mask);
+ case ID_LS:
+ return &(bmain->linestyle);
+ case ID_PAL:
+ return &(bmain->palettes);
+ case ID_PC:
+ return &(bmain->paintcurves);
+ case ID_CF:
+ return &(bmain->cachefiles);
+ case ID_WS:
+ return &(bmain->workspaces);
+ }
+ return NULL;
+}
+
+/**
+ * puts into array *lb pointers to all the ListBase structs in main,
+ * and returns the number of them as the function result. This is useful for
+ * generic traversal of all the blocks in a Main (by traversing all the
+ * lists in turn), without worrying about block types.
+ *
+ * \note MAX_LIBARRAY define should match this code */
+int set_listbasepointers(Main *bmain, ListBase **lb)
+{
+ /* BACKWARDS! also watch order of free-ing! (mesh<->mat), first items freed last.
+ * This is important because freeing data decreases usercounts of other datablocks,
+ * if this data is its self freed it can crash. */
+ lb[INDEX_ID_LI] = &(bmain->library); /* Libraries may be accessed from pretty much any other ID... */
+ lb[INDEX_ID_IP] = &(bmain->ipo);
+ lb[INDEX_ID_AC] = &(bmain->action); /* moved here to avoid problems when freeing with animato (aligorith) */
+ lb[INDEX_ID_KE] = &(bmain->key);
+ lb[INDEX_ID_PAL] = &(bmain->palettes); /* referenced by gpencil, so needs to be before that to avoid crashes */
+ lb[INDEX_ID_GD] = &(bmain->gpencil); /* referenced by nodes, objects, view, scene etc, before to free after. */
+ lb[INDEX_ID_NT] = &(bmain->nodetree);
+ lb[INDEX_ID_IM] = &(bmain->image);
+ lb[INDEX_ID_TE] = &(bmain->tex);
+ lb[INDEX_ID_MA] = &(bmain->mat);
+ lb[INDEX_ID_VF] = &(bmain->vfont);
+
+ /* Important!: When adding a new object type,
+ * the specific data should be inserted here
+ */
+
+ lb[INDEX_ID_AR] = &(bmain->armature);
+
+ lb[INDEX_ID_CF] = &(bmain->cachefiles);
+ lb[INDEX_ID_ME] = &(bmain->mesh);
+ lb[INDEX_ID_CU] = &(bmain->curve);
+ lb[INDEX_ID_MB] = &(bmain->mball);
+
+ lb[INDEX_ID_LT] = &(bmain->latt);
+ lb[INDEX_ID_LA] = &(bmain->lamp);
+ lb[INDEX_ID_CA] = &(bmain->camera);
+
+ lb[INDEX_ID_TXT] = &(bmain->text);
+ lb[INDEX_ID_SO] = &(bmain->sound);
+ lb[INDEX_ID_GR] = &(bmain->collection);
+ lb[INDEX_ID_PAL] = &(bmain->palettes);
+ lb[INDEX_ID_PC] = &(bmain->paintcurves);
+ lb[INDEX_ID_BR] = &(bmain->brush);
+ lb[INDEX_ID_PA] = &(bmain->particle);
+ lb[INDEX_ID_SPK] = &(bmain->speaker);
+ lb[INDEX_ID_LP] = &(bmain->lightprobe);
+
+ lb[INDEX_ID_WO] = &(bmain->world);
+ lb[INDEX_ID_MC] = &(bmain->movieclip);
+ lb[INDEX_ID_SCR] = &(bmain->screen);
+ lb[INDEX_ID_OB] = &(bmain->object);
+ lb[INDEX_ID_LS] = &(bmain->linestyle); /* referenced by scenes */
+ lb[INDEX_ID_SCE] = &(bmain->scene);
+ lb[INDEX_ID_WS] = &(bmain->workspaces); /* before wm, so it's freed after it! */
+ lb[INDEX_ID_WM] = &(bmain->wm);
+ lb[INDEX_ID_MSK] = &(bmain->mask);
+
+ lb[INDEX_ID_NULL] = NULL;
+
+ return (MAX_LIBARRAY - 1);
+}
+
diff --git a/source/blender/blenkernel/intern/mask.c b/source/blender/blenkernel/intern/mask.c
index ba5a6a25048..97058467fd9 100644
--- a/source/blender/blenkernel/intern/mask.c
+++ b/source/blender/blenkernel/intern/mask.c
@@ -1419,34 +1419,6 @@ void BKE_mask_evaluate(Mask *mask, const float ctime, const bool do_newframe)
* for now re-evaluate all. eventually this might work differently */
void BKE_mask_update_display(Mask *mask, float ctime)
{
-#if 0
- MaskLayer *masklay;
-
- for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
- MaskSpline *spline;
-
- for (spline = masklay->splines.first; spline; spline = spline->next) {
- if (spline->points_deform) {
- int i = 0;
-
- for (i = 0; i < spline->tot_point; i++) {
- MaskSplinePoint *point;
-
- if (spline->points_deform) {
- point = &spline->points_deform[i];
- BKE_mask_point_free(point);
- }
- }
- if (spline->points_deform) {
- MEM_freeN(spline->points_deform);
- }
-
- spline->points_deform = NULL;
- }
- }
- }
-#endif
-
BKE_mask_evaluate(mask, ctime, false);
}
@@ -1657,19 +1629,6 @@ MaskLayerShape *BKE_mask_layer_shape_verify_frame(MaskLayer *masklay, const int
BKE_mask_layer_shape_sort(masklay);
}
-#if 0
- {
- MaskLayerShape *masklay_shape;
- int i = 0;
- for (masklay_shape = masklay->splines_shapes.first;
- masklay_shape;
- masklay_shape = masklay_shape->next)
- {
- printf("mask %d, %d\n", i++, masklay_shape->frame);
- }
- }
-#endif
-
return masklay_shape;
}
diff --git a/source/blender/blenkernel/intern/mask_rasterize.c b/source/blender/blenkernel/intern/mask_rasterize.c
index 76d16334630..ecdd30edc36 100644
--- a/source/blender/blenkernel/intern/mask_rasterize.c
+++ b/source/blender/blenkernel/intern/mask_rasterize.c
@@ -35,7 +35,7 @@
* - free the handle.
*
* This file is admittedly a bit confusticated, in quite few areas speed was chosen over readability,
- * though it is commented - so shouldn't be so hard to see whats going on.
+ * though it is commented - so shouldn't be so hard to see what's going on.
*
*
* Implementation:
@@ -486,7 +486,7 @@ static void layer_bucket_init(MaskRasterLayer *layer, const float pixel_size)
unsigned int xi_max = (unsigned int) ((xmax - layer->bounds.xmin) * layer->buckets_xy_scalar[0]);
unsigned int yi_min = (unsigned int) ((ymin - layer->bounds.ymin) * layer->buckets_xy_scalar[1]);
unsigned int yi_max = (unsigned int) ((ymax - layer->bounds.ymin) * layer->buckets_xy_scalar[1]);
- void *face_index_void = SET_UINT_IN_POINTER(face_index);
+ void *face_index_void = POINTER_FROM_UINT(face_index);
unsigned int xi, yi;
@@ -538,7 +538,7 @@ static void layer_bucket_init(MaskRasterLayer *layer, const float pixel_size)
buckets_face[bucket_index] = bucket;
for (bucket_node = bucketstore[bucket_index]; bucket_node; bucket_node = bucket_node->next) {
- *bucket = GET_UINT_FROM_POINTER(bucket_node->link);
+ *bucket = POINTER_AS_UINT(bucket_node->link);
bucket++;
}
*bucket = TRI_TERMINATOR_ID;
@@ -749,12 +749,6 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas
for (j = 0; j < tot_diff_feather_points; j++) {
copy_v2_v2(co_feather, diff_feather_points[j]);
sf_vert = BLI_scanfill_vert_add(&sf_ctx, co_feather);
-
- /* no need for these attrs */
-#if 0
- sf_vert->tmp.u = sf_vert_tot;
- sf_vert->keyindex = sf_vert_tot + tot_diff_point; /* absolute index of feather vert */
-#endif
sf_vert->keyindex = SF_KEYINDEX_TEMP_ID;
sf_vert_tot++;
}
@@ -1217,7 +1211,6 @@ static float maskrasterize_layer_z_depth_tri(const float pt[2],
}
#endif
-#if 1
static float maskrasterize_layer_z_depth_quad(const float pt[2],
const float v1[3], const float v2[3], const float v3[3], const float v4[3])
{
@@ -1226,7 +1219,6 @@ static float maskrasterize_layer_z_depth_quad(const float pt[2],
//return (v1[2] * w[0]) + (v2[2] * w[1]) + (v3[2] * w[2]) + (v4[2] * w[3]);
return w[2] + w[3]; /* we can make this assumption for small speedup */
}
-#endif
static float maskrasterize_layer_isect(unsigned int *face, float (*cos)[3], const float dist_orig, const float xy[2])
{
@@ -1247,10 +1239,8 @@ static float maskrasterize_layer_isect(unsigned int *face, float (*cos)[3], cons
}
#else
/* we know all tris are close for now */
- if (1) {
- if (isect_point_tri_v2_cw(xy, cos[face[0]], cos[face[1]], cos[face[2]])) {
- return 0.0f;
- }
+ if (isect_point_tri_v2_cw(xy, cos[face[0]], cos[face[1]], cos[face[2]])) {
+ return 0.0f;
}
#endif
}
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index ccd88cffda6..94bf5eab9d2 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -58,6 +58,7 @@
#include "BLI_array_utils.h"
#include "BKE_animsys.h"
+#include "BKE_brush.h"
#include "BKE_displist.h"
#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
@@ -129,6 +130,9 @@ void BKE_material_init_gpencil_settings(Material *ma)
ARRAY_SET_ITEMS(gp_style->texture_scale, 1.0f, 1.0f);
gp_style->texture_opacity = 1.0f;
gp_style->texture_pixsize = 100.0f;
+
+ gp_style->flag |= GP_STYLE_STROKE_SHOW;
+ gp_style->flag |= GP_STYLE_FILL_SHOW;
}
}
@@ -170,8 +174,10 @@ Material *BKE_material_add_gpencil(Main *bmain, const char *name)
ma = BKE_material_add(bmain, name);
/* grease pencil settings */
- BKE_material_init_gpencil_settings(ma);
-
+ if (ma != NULL) {
+ BKE_material_init_gpencil_settings(ma);
+ BKE_brush_update_material(bmain, ma, NULL);
+ }
return ma;
}
@@ -656,14 +662,6 @@ void assign_material_id(Main *bmain, ID *id, Material *ma, short act)
if (act > MAXMAT) return;
if (act < 1) act = 1;
- /* this is needed for Python overrides,
- * we just have to take care that the UI can't do this */
-#if 0
- /* prevent crashing when using accidentally */
- BLI_assert(id->lib == NULL);
- if (id->lib) return;
-#endif
-
/* test arraylens */
totcolp = give_totcolp_id(id);
@@ -803,7 +801,7 @@ void BKE_material_remap_object(Object *ob, const unsigned int *remap)
else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
BKE_curve_material_remap(ob->data, remap, ob->totcol);
}
- if (ob->type == OB_GPENCIL) {
+ else if (ob->type == OB_GPENCIL) {
BKE_gpencil_material_remap(ob->data, remap, ob->totcol);
}
else {
@@ -830,7 +828,7 @@ void BKE_material_remap_object_calc(
for (int i = 0; i < ob_dst->totcol; i++) {
Material *ma_src = give_current_material(ob_dst, i + 1);
- BLI_ghash_reinsert(gh_mat_map, ma_src, SET_INT_IN_POINTER(i), NULL, NULL);
+ BLI_ghash_reinsert(gh_mat_map, ma_src, POINTER_FROM_INT(i), NULL, NULL);
}
/* setup default mapping (when materials don't match) */
@@ -860,7 +858,7 @@ void BKE_material_remap_object_calc(
else {
void **index_src_p = BLI_ghash_lookup_p(gh_mat_map, ma_src);
if (index_src_p) {
- remap_src_to_dst[i] = GET_INT_FROM_POINTER(*index_src_p);
+ remap_src_to_dst[i] = POINTER_AS_INT(*index_src_p);
}
}
}
@@ -1033,10 +1031,58 @@ static bNode *nodetree_uv_node_recursive(bNode *node)
return NULL;
}
+static int count_texture_nodes_recursive(bNodeTree *nodetree)
+{
+ int tex_nodes = 0;
+
+ for (bNode *node = nodetree->nodes.first; node; node = node->next) {
+ if (node->typeinfo->nclass == NODE_CLASS_TEXTURE && node->typeinfo->type == SH_NODE_TEX_IMAGE && node->id) {
+ tex_nodes++;
+ }
+ else if (node->type == NODE_GROUP) {
+ /* recurse into the node group and see if it contains any textures */
+ tex_nodes += count_texture_nodes_recursive((bNodeTree *)node->id);
+ }
+ }
+
+ return tex_nodes;
+}
+
+static void fill_texpaint_slots_recursive(bNodeTree *nodetree, bNode *active_node, Material *ma, int *index)
+{
+ for (bNode *node = nodetree->nodes.first; node; node = node->next) {
+ if (node->typeinfo->nclass == NODE_CLASS_TEXTURE && node->typeinfo->type == SH_NODE_TEX_IMAGE && node->id) {
+ if (active_node == node) {
+ ma->paint_active_slot = *index;
+ }
+ ma->texpaintslot[*index].ima = (Image *)node->id;
+
+ /* for new renderer, we need to traverse the treeback in search of a UV node */
+ bNode *uvnode = nodetree_uv_node_recursive(node);
+
+ if (uvnode) {
+ NodeShaderUVMap *storage = (NodeShaderUVMap *)uvnode->storage;
+ ma->texpaintslot[*index].uvname = storage->uv_map;
+ /* set a value to index so UI knows that we have a valid pointer for the mesh */
+ ma->texpaintslot[*index].valid = true;
+ }
+ else {
+ /* just invalidate the index here so UV map does not get displayed on the UI */
+ ma->texpaintslot[*index].valid = false;
+ }
+ (*index)++;
+ }
+ else if (node->type == NODE_GROUP) {
+ /* recurse into the node group and see if it contains any textures */
+ fill_texpaint_slots_recursive((bNodeTree *)node->id, active_node, ma, index);
+ }
+ }
+}
+
void BKE_texpaint_slot_refresh_cache(Scene *scene, Material *ma)
{
- short count = 0;
- short index = 0;
+ int count = 0;
+ int index = 0;
if (!ma)
return;
@@ -1053,50 +1099,25 @@ void BKE_texpaint_slot_refresh_cache(Scene *scene, Material *ma)
return;
}
- bNode *node, *active_node;
-
if (!(ma->nodetree)) {
ma->paint_active_slot = 0;
ma->paint_clone_slot = 0;
return;
}
- for (node = ma->nodetree->nodes.first; node; node = node->next) {
- if (node->typeinfo->nclass == NODE_CLASS_TEXTURE && node->typeinfo->type == SH_NODE_TEX_IMAGE && node->id)
- count++;
- }
+ count = count_texture_nodes_recursive(ma->nodetree);
if (count == 0) {
ma->paint_active_slot = 0;
ma->paint_clone_slot = 0;
return;
}
- ma->texpaintslot = MEM_callocN(sizeof(*ma->texpaintslot) * count, "texpaint_slots");
-
- active_node = nodeGetActiveTexture(ma->nodetree);
- for (node = ma->nodetree->nodes.first; node; node = node->next) {
- if (node->typeinfo->nclass == NODE_CLASS_TEXTURE && node->typeinfo->type == SH_NODE_TEX_IMAGE && node->id) {
- if (active_node == node)
- ma->paint_active_slot = index;
- ma->texpaintslot[index].ima = (Image *)node->id;
+ ma->texpaintslot = MEM_callocN(sizeof(*ma->texpaintslot) * count, "texpaint_slots");
- /* for new renderer, we need to traverse the treeback in search of a UV node */
- bNode *uvnode = nodetree_uv_node_recursive(node);
+ bNode *active_node = nodeGetActiveTexture(ma->nodetree);
- if (uvnode) {
- NodeShaderUVMap *storage = (NodeShaderUVMap *)uvnode->storage;
- ma->texpaintslot[index].uvname = storage->uv_map;
- /* set a value to index so UI knows that we have a valid pointer for the mesh */
- ma->texpaintslot[index].valid = true;
- }
- else {
- /* just invalidate the index here so UV map does not get displayed on the UI */
- ma->texpaintslot[index].valid = false;
- }
- index++;
- }
- }
+ fill_texpaint_slots_recursive(ma->nodetree, active_node, ma, &index);
ma->tot_slots = count;
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index 5e4f5614370..63adcfc3cae 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -66,8 +66,6 @@
#include "BKE_object.h"
#include "BKE_material.h"
-//#include "DEG_depsgraph.h"
-
/* Functions */
/** Free (or release) any data used by this mball (does not free the mball itself). */
@@ -224,15 +222,7 @@ void BKE_mball_texspace_calc(Object *ob)
min[0] = min[1] = min[2] = -1.0f;
max[0] = max[1] = max[2] = 1.0f;
}
-#if 0
- loc[0] = (min[0] + max[0]) / 2.0f;
- loc[1] = (min[1] + max[1]) / 2.0f;
- loc[2] = (min[2] + max[2]) / 2.0f;
-
- size[0] = (max[0] - min[0]) / 2.0f;
- size[1] = (max[1] - min[1]) / 2.0f;
- size[2] = (max[2] - min[2]) / 2.0f;
-#endif
+
BKE_boundbox_init_from_minmax(bb, min, max);
bb->flag &= ~BOUNDBOX_DIRTY;
@@ -320,6 +310,11 @@ bool BKE_mball_is_basis_for(Object *ob1, Object *ob2)
int basis1nr, basis2nr;
char basis1name[MAX_ID_NAME], basis2name[MAX_ID_NAME];
+ if (ob1->id.name[2] != ob2->id.name[2]) {
+ /* Quick return in case first char of both ID's names is not the same... */
+ return false;
+ }
+
BLI_split_name_num(basis1name, &basis1nr, ob1->id.name + 2, '.');
BLI_split_name_num(basis2name, &basis2nr, ob2->id.name + 2, '.');
@@ -341,6 +336,19 @@ bool BKE_mball_is_any_selected(const MetaBall *mb)
return false;
}
+
+bool BKE_mball_is_any_selected_multi(Object **objects, int objects_len)
+{
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ MetaBall *mb = (MetaBall *)obedit->data;
+ if (BKE_mball_is_any_selected(mb)) {
+ return true;
+ }
+ }
+ return false;
+}
+
bool BKE_mball_is_any_unselected(const MetaBall *mb)
{
for (const MetaElem *ml = mb->editelems->first; ml != NULL; ml = ml->next) {
@@ -414,7 +422,7 @@ Object *BKE_mball_basis_find(Scene *scene, Object *basis)
for (ViewLayer *view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) {
for (Base *base = view_layer->object_bases.first; base; base = base->next) {
Object *ob = base->object;
- if ((ob->type == OB_MBALL) && !(base->flag & OB_FROMDUPLI)) {
+ if ((ob->type == OB_MBALL) && !(base->flag & BASE_FROMDUPLI)) {
if (ob != bob) {
BLI_split_name_num(obname, &obnr, ob->id.name + 2, '.');
@@ -433,17 +441,17 @@ Object *BKE_mball_basis_find(Scene *scene, Object *basis)
return basis;
}
-bool BKE_mball_minmax_ex(MetaBall *mb, float min[3], float max[3],
- float obmat[4][4], const short flag)
+bool BKE_mball_minmax_ex(
+ const MetaBall *mb, float min[3], float max[3],
+ const float obmat[4][4], const short flag)
{
const float scale = obmat ? mat4_to_scale(obmat) : 1.0f;
- MetaElem *ml;
bool changed = false;
float centroid[3], vec[3];
INIT_MINMAX(min, max);
- for (ml = mb->elems.first; ml; ml = ml->next) {
+ for (const MetaElem *ml = mb->elems.first; ml; ml = ml->next) {
if ((ml->flag & flag) == flag) {
const float scale_mb = (ml->rad * 0.5f) * scale;
int i;
@@ -470,27 +478,24 @@ bool BKE_mball_minmax_ex(MetaBall *mb, float min[3], float max[3],
/* basic vertex data functions */
-bool BKE_mball_minmax(MetaBall *mb, float min[3], float max[3])
+bool BKE_mball_minmax(const MetaBall *mb, float min[3], float max[3])
{
- MetaElem *ml;
-
INIT_MINMAX(min, max);
- for (ml = mb->elems.first; ml; ml = ml->next) {
+ for (const MetaElem *ml = mb->elems.first; ml; ml = ml->next) {
minmax_v3v3_v3(min, max, &ml->x);
}
return (BLI_listbase_is_empty(&mb->elems) == false);
}
-bool BKE_mball_center_median(MetaBall *mb, float r_cent[3])
+bool BKE_mball_center_median(const MetaBall *mb, float r_cent[3])
{
- MetaElem *ml;
int total = 0;
zero_v3(r_cent);
- for (ml = mb->elems.first; ml; ml = ml->next) {
+ for (const MetaElem *ml = mb->elems.first; ml; ml = ml->next) {
add_v3_v3(r_cent, &ml->x);
total++;
}
@@ -502,7 +507,7 @@ bool BKE_mball_center_median(MetaBall *mb, float r_cent[3])
return (total != 0);
}
-bool BKE_mball_center_bounds(MetaBall *mb, float r_cent[3])
+bool BKE_mball_center_bounds(const MetaBall *mb, float r_cent[3])
{
float min[3], max[3];
@@ -516,26 +521,25 @@ bool BKE_mball_center_bounds(MetaBall *mb, float r_cent[3])
void BKE_mball_transform(MetaBall *mb, float mat[4][4], const bool do_props)
{
- MetaElem *me;
float quat[4];
const float scale = mat4_to_scale(mat);
const float scale_sqrt = sqrtf(scale);
mat4_to_quat(quat, mat);
- for (me = mb->elems.first; me; me = me->next) {
- mul_m4_v3(mat, &me->x);
- mul_qt_qtqt(me->quat, quat, me->quat);
+ for (MetaElem *ml = mb->elems.first; ml; ml = ml->next) {
+ mul_m4_v3(mat, &ml->x);
+ mul_qt_qtqt(ml->quat, quat, ml->quat);
if (do_props) {
- me->rad *= scale;
+ ml->rad *= scale;
/* hrmf, probably elems shouldn't be
* treating scale differently - campbell */
- if (!MB_TYPE_SIZE_SQUARED(me->type)) {
- mul_v3_fl(&me->expx, scale);
+ if (!MB_TYPE_SIZE_SQUARED(ml->type)) {
+ mul_v3_fl(&ml->expx, scale);
}
else {
- mul_v3_fl(&me->expx, scale_sqrt);
+ mul_v3_fl(&ml->expx, scale_sqrt);
}
}
}
@@ -543,41 +547,83 @@ void BKE_mball_transform(MetaBall *mb, float mat[4][4], const bool do_props)
void BKE_mball_translate(MetaBall *mb, const float offset[3])
{
- MetaElem *ml;
-
- for (ml = mb->elems.first; ml; ml = ml->next) {
+ for (MetaElem *ml = mb->elems.first; ml; ml = ml->next) {
add_v3_v3(&ml->x, offset);
}
}
/* *** select funcs *** */
-void BKE_mball_select_all(struct MetaBall *mb)
+int BKE_mball_select_count(const MetaBall *mb)
{
- MetaElem *ml;
+ int sel = 0;
+ for (const MetaElem *ml = mb->editelems->first; ml; ml = ml->next) {
+ if (ml->flag & SELECT) {
+ sel++;
+ }
+ }
+ return sel;
+}
- for (ml = mb->editelems->first; ml; ml = ml->next) {
+int BKE_mball_select_count_multi(Object **objects, int objects_len)
+{
+ int sel = 0;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ const Object *obedit = objects[ob_index];
+ const MetaBall *mb = (MetaBall *)obedit->data;
+ sel += BKE_mball_select_count(mb);
+ }
+ return sel;
+}
+
+void BKE_mball_select_all(MetaBall *mb)
+{
+ for (MetaElem *ml = mb->editelems->first; ml; ml = ml->next) {
ml->flag |= SELECT;
}
}
-void BKE_mball_deselect_all(MetaBall *mb)
+void BKE_mball_select_all_multi(Object **objects, int objects_len)
{
- MetaElem *ml;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ MetaBall *mb = obedit->data;
+ BKE_mball_select_all(mb);
+ }
+}
- for (ml = mb->editelems->first; ml; ml = ml->next) {
+void BKE_mball_deselect_all(MetaBall *mb)
+{
+ for (MetaElem *ml = mb->editelems->first; ml; ml = ml->next) {
ml->flag &= ~SELECT;
}
}
-void BKE_mball_select_swap(struct MetaBall *mb)
+void BKE_mball_deselect_all_multi(Object **objects, int objects_len)
{
- MetaElem *ml;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ MetaBall *mb = obedit->data;
- for (ml = mb->editelems->first; ml; ml = ml->next) {
+ BKE_mball_deselect_all(mb);
+ }
+}
+
+void BKE_mball_select_swap(MetaBall *mb)
+{
+ for (MetaElem *ml = mb->editelems->first; ml; ml = ml->next) {
ml->flag ^= SELECT;
}
}
+void BKE_mball_select_swap_multi(Object **objects, int objects_len)
+{
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ MetaBall *mb = (MetaBall *)obedit->data;
+ BKE_mball_select_swap(mb);
+ }
+}
+
/* **** Depsgraph evaluation **** */
/* Draw Engine */
diff --git a/source/blender/blenkernel/intern/mball_tessellate.c b/source/blender/blenkernel/intern/mball_tessellate.c
index 4b35fd00cf7..95359a14f3a 100644
--- a/source/blender/blenkernel/intern/mball_tessellate.c
+++ b/source/blender/blenkernel/intern/mball_tessellate.c
@@ -848,27 +848,6 @@ static void vnormal(PROCESS *process, const float point[3], float r_no[3])
r_no[0] = metaball(process, point[0] + delta, point[1], point[2]) - f;
r_no[1] = metaball(process, point[0], point[1] + delta, point[2]) - f;
r_no[2] = metaball(process, point[0], point[1], point[2] + delta) - f;
-
-#if 0
- f = normalize_v3(r_no);
-
- if (0) {
- float tvec[3];
-
- delta *= 2.0f;
-
- f = process->function(process, point[0], point[1], point[2]);
-
- tvec[0] = process->function(process, point[0] + delta, point[1], point[2]) - f;
- tvec[1] = process->function(process, point[0], point[1] + delta, point[2]) - f;
- tvec[2] = process->function(process, point[0], point[1], point[2] + delta) - f;
-
- if (normalize_v3(tvec) != 0.0f) {
- add_v3_v3(r_no, tvec);
- normalize_v3(r_no);
- }
- }
-#endif
}
#endif /* USE_ACCUM_NORMAL */
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 3e1412e0f5a..6a00aaf576b 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -154,7 +154,7 @@ static int customdata_compare(CustomData *c1, CustomData *c2, Mesh *m1, Mesh *m2
for (j = 0; j < vtot; j++, v1++, v2++) {
if (len_squared_v3v3(v1->co, v2->co) > thresh_sq)
return MESHCMP_VERTCOMISMATCH;
- /* I don't care about normals, let's just do coodinates */
+ /* I don't care about normals, let's just do coordinates */
}
}
@@ -326,7 +326,7 @@ static void mesh_ensure_tessellation_customdata(Mesh *me)
/* note: this warning may be un-called for if we are initializing the mesh for the
* first time from bmesh, rather then giving a warning about this we could be smarter
* and check if there was any data to begin with, for now just print the warning with
- * some info to help troubleshoot whats going on - campbell */
+ * some info to help troubleshoot what's going on - campbell */
printf("%s: warning! Tessellation uvs or vcol data got out of sync, "
"had to reset!\n CD_MTFACE: %d != CD_MLOOPUV: %d || CD_MCOL: %d != CD_MLOOPCOL: %d\n",
__func__, tottex_tessface, tottex_original, totcol_tessface, totcol_original);
@@ -503,12 +503,7 @@ void BKE_mesh_init(Mesh *me)
me->size[0] = me->size[1] = me->size[2] = 1.0;
me->smoothresh = DEG2RADF(30);
me->texflag = ME_AUTOSPACE;
-
- /* disable because its slow on many GPU's, see [#37518] */
-#if 0
- me->flag = ME_TWOSIDED;
-#endif
- me->drawflag = ME_DRAWEDGES | ME_DRAWFACES | ME_DRAWCREASES;
+ me->drawflag = 0;
CustomData_reset(&me->vdata);
CustomData_reset(&me->edata);
@@ -568,6 +563,7 @@ void BKE_mesh_copy_data(Main *bmain, Mesh *me_dst, const Mesh *me_src, const int
me_dst->runtime.batch_cache = NULL;
me_dst->runtime.looptris.array = NULL;
me_dst->runtime.bvh_cache = NULL;
+ me_dst->runtime.shrinkwrap_data = NULL;
if (me_src->id.tag & LIB_TAG_NO_MAIN) {
me_dst->runtime.deformed_only = me_src->runtime.deformed_only;
@@ -576,6 +572,7 @@ void BKE_mesh_copy_data(Main *bmain, Mesh *me_dst, const Mesh *me_src, const int
/* This is a direct copy of a main mesh, so for now it has the same topology. */
me_dst->runtime.deformed_only = 1;
}
+ me_dst->runtime.is_original = false;
me_dst->mselect = MEM_dupallocN(me_dst->mselect);
me_dst->bb = MEM_dupallocN(me_dst->bb);
@@ -650,7 +647,9 @@ static Mesh *mesh_new_nomain_from_template_ex(
int loops_len, int polys_len,
CustomDataMask mask)
{
- const bool do_tessface = ((me_src->totface != 0) && (me_src->totpoly == 0)); /* only do tessface if we have no polys */
+ /* Only do tessface if we are creating tessfaces or copying from mesh with only tessfaces. */
+ const bool do_tessface = (tessface_len ||
+ ((me_src->totface != 0) && (me_src->totpoly == 0)));
Mesh *me_dst = BKE_id_new_nomain(ID_ME, NULL);
@@ -683,7 +682,7 @@ static Mesh *mesh_new_nomain_from_template_ex(
return me_dst;
}
-Mesh * BKE_mesh_new_nomain_from_template(
+Mesh *BKE_mesh_new_nomain_from_template(
const Mesh *me_src,
int verts_len, int edges_len, int tessface_len,
int loops_len, int polys_len)
@@ -695,16 +694,19 @@ Mesh * BKE_mesh_new_nomain_from_template(
CD_MASK_EVERYTHING);
}
-Mesh *BKE_mesh_copy_for_eval(struct Mesh *source)
+Mesh *BKE_mesh_copy_for_eval(struct Mesh *source, bool reference)
{
+ int flags = (LIB_ID_CREATE_NO_MAIN |
+ LIB_ID_CREATE_NO_USER_REFCOUNT |
+ LIB_ID_CREATE_NO_DEG_TAG |
+ LIB_ID_COPY_NO_PREVIEW);
+
+ if (reference) {
+ flags |= LIB_ID_COPY_CD_REFERENCE;
+ }
+
Mesh *result;
- BKE_id_copy_ex(
- NULL, &source->id, (ID **)&result,
- (LIB_ID_CREATE_NO_MAIN |
- LIB_ID_CREATE_NO_USER_REFCOUNT |
- LIB_ID_CREATE_NO_DEG_TAG |
- LIB_ID_COPY_CD_REFERENCE),
- false);
+ BKE_id_copy_ex(NULL, &source->id, (ID **)&result, flags, false);
return result;
}
@@ -743,7 +745,7 @@ BMesh *BKE_mesh_to_bmesh(
});
}
-Mesh *BKE_bmesh_to_mesh_nomain(BMesh *bm, const struct BMeshToMeshParams *params)
+Mesh *BKE_mesh_from_bmesh_nomain(BMesh *bm, const struct BMeshToMeshParams *params)
{
BLI_assert(params->calc_object_remap == false);
Mesh *mesh = BKE_id_new_nomain(ID_ME, NULL);
@@ -751,6 +753,31 @@ Mesh *BKE_bmesh_to_mesh_nomain(BMesh *bm, const struct BMeshToMeshParams *params
return mesh;
}
+Mesh *BKE_mesh_from_bmesh_for_eval_nomain(BMesh *bm, const int64_t cd_mask_extra)
+{
+ Mesh *mesh = BKE_id_new_nomain(ID_ME, NULL);
+ BM_mesh_bm_to_me_for_eval(bm, mesh, cd_mask_extra);
+ return mesh;
+}
+
+/**
+ * TODO(campbell): support mesh with only an edit-mesh which is lazy initialized.
+ */
+Mesh *BKE_mesh_from_editmesh_with_coords_thin_wrap(
+ BMEditMesh *em, CustomDataMask data_mask, float (*vertexCos)[3])
+{
+ Mesh *me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, data_mask);
+ /* Use editmesh directly where possible. */
+ me->runtime.is_original = true;
+ if (vertexCos) {
+ /* We will own this array in the future. */
+ BKE_mesh_apply_vert_coords(me, vertexCos);
+ MEM_freeN(vertexCos);
+ me->runtime.is_original = false;
+ }
+ return me;
+}
+
void BKE_mesh_make_local(Main *bmain, Mesh *me, const bool lib_local)
{
BKE_id_make_local_generic(bmain, &me->id, true, lib_local);
@@ -1222,10 +1249,6 @@ int poly_get_adj_loops_from_vert(
vert);
if (corner != -1) {
-#if 0 /* unused - this loop */
- const MLoop *ml = &mloop[poly->loopstart + corner];
-#endif
-
/* vertex was found */
r_adj[0] = ME_POLY_LOOP_PREV(mloop, poly, corner)->v;
r_adj[1] = ME_POLY_LOOP_NEXT(mloop, poly, corner)->v;
@@ -1248,6 +1271,21 @@ int BKE_mesh_edge_other_vert(const MEdge *e, int v)
return -1;
}
+/**
+ * Sets each output array element to the edge index if it is a real edge, or -1.
+ */
+void BKE_mesh_looptri_get_real_edges(const Mesh *mesh, const MLoopTri *looptri, int r_edges[3])
+{
+ for (int i = 2, i_next = 0; i_next < 3; i = i_next++) {
+ const MLoop *l1 = &mesh->mloop[looptri->tri[i]], *l2 = &mesh->mloop[looptri->tri[i_next]];
+ const MEdge *e = &mesh->medge[l1->e];
+
+ bool is_real = (l1->v == e->v1 && l2->v == e->v2) || (l1->v == e->v2 && l2->v == e->v1);
+
+ r_edges[i] = is_real ? l1->e : -1;
+ }
+}
+
/* basic vertex data functions */
bool BKE_mesh_minmax(const Mesh *me, float r_min[3], float r_max[3])
{
@@ -1654,7 +1692,7 @@ static int split_faces_prepare_new_verts(
if ((*lnor_space)->flags & MLNOR_SPACE_IS_SINGLE) {
/* Single loop in this fan... */
- BLI_assert(GET_INT_FROM_POINTER((*lnor_space)->loops) == loop_idx);
+ BLI_assert(POINTER_AS_INT((*lnor_space)->loops) == loop_idx);
BLI_BITMAP_ENABLE(done_loops, loop_idx);
if (vert_used) {
ml->v = new_vert_idx;
@@ -1662,7 +1700,7 @@ static int split_faces_prepare_new_verts(
}
else {
for (LinkNode *lnode = (*lnor_space)->loops; lnode; lnode = lnode->next) {
- const int ml_fan_idx = GET_INT_FROM_POINTER(lnode->link);
+ const int ml_fan_idx = POINTER_AS_INT(lnode->link);
BLI_BITMAP_ENABLE(done_loops, ml_fan_idx);
if (vert_used) {
mloop[ml_fan_idx].v = new_vert_idx;
@@ -1723,7 +1761,7 @@ static int split_faces_prepare_new_edges(
if (BLI_BITMAP_TEST(edges_used, edge_idx)) {
/* Original edge has already been used, we need to define a new one. */
const int new_edge_idx = num_edges++;
- *eval = SET_INT_IN_POINTER(new_edge_idx);
+ *eval = POINTER_FROM_INT(new_edge_idx);
ml_prev->e = new_edge_idx;
SplitFaceNewEdge *new_edge = BLI_memarena_alloc(memarena, sizeof(*new_edge));
@@ -1738,13 +1776,13 @@ static int split_faces_prepare_new_edges(
/* We can re-use original edge. */
medge[edge_idx].v1 = ml_prev->v;
medge[edge_idx].v2 = ml->v;
- *eval = SET_INT_IN_POINTER(edge_idx);
+ *eval = POINTER_FROM_INT(edge_idx);
BLI_BITMAP_ENABLE(edges_used, edge_idx);
}
}
else {
/* Edge already known, just update loop's edge index. */
- ml_prev->e = GET_INT_FROM_POINTER(*eval);
+ ml_prev->e = POINTER_AS_INT(*eval);
}
ml_prev = ml;
diff --git a/source/blender/blenkernel/intern/mesh_convert.c b/source/blender/blenkernel/intern/mesh_convert.c
index 2e2afa6834b..eed02dae824 100644
--- a/source/blender/blenkernel/intern/mesh_convert.c
+++ b/source/blender/blenkernel/intern/mesh_convert.c
@@ -156,7 +156,7 @@ static void make_edges_mdata_extend(
totedge_new = BLI_edgehash_len(eh);
#ifdef DEBUG
- /* ensure that theres no overlap! */
+ /* ensure that there's no overlap! */
if (totedge_new) {
MEdge *medge = *r_alledge;
for (i = 0; i < totedge; i++, medge++) {
@@ -182,7 +182,7 @@ static void make_edges_mdata_extend(
BLI_edgehashIterator_step(ehi), ++medge, e_index++)
{
BLI_edgehashIterator_getKey(ehi, &medge->v1, &medge->v2);
- BLI_edgehashIterator_setValue(ehi, SET_UINT_IN_POINTER(e_index));
+ BLI_edgehashIterator_setValue(ehi, POINTER_FROM_UINT(e_index));
medge->crease = medge->bweight = 0;
medge->flag = ME_EDGEDRAW | ME_EDGERENDER;
@@ -198,7 +198,7 @@ static void make_edges_mdata_extend(
int j;
for (j = 0; j < mp->totloop; j++, l++) {
/* lookup hashed edge index */
- l_prev->e = GET_UINT_FROM_POINTER(BLI_edgehash_lookup(eh, l_prev->v, l->v));
+ l_prev->e = POINTER_AS_UINT(BLI_edgehash_lookup(eh, l_prev->v, l->v));
l_prev = l;
}
}
@@ -549,7 +549,7 @@ void BKE_mesh_from_nurbs_displist(
Main *bmain, Object *ob, ListBase *dispbase, const bool use_orco_uv, const char *obdata_name, bool temporary)
{
Object *ob1;
- DerivedMesh *dm = ob->derivedFinal;
+ Mesh *me_eval = ob->runtime.mesh_eval;
Mesh *me;
Curve *cu;
MVert *allvert = NULL;
@@ -561,7 +561,7 @@ void BKE_mesh_from_nurbs_displist(
cu = ob->data;
- if (dm == NULL) {
+ if (me_eval == NULL) {
if (BKE_mesh_nurbs_displist_to_mdata(
ob, dispbase, &allvert, &totvert,
&alledge, &totedge, &allloop,
@@ -593,7 +593,8 @@ void BKE_mesh_from_nurbs_displist(
}
else {
me = BKE_mesh_add(bmain, obdata_name);
- DM_to_mesh(dm, me, ob, CD_MASK_MESH, false);
+ ob->runtime.mesh_eval = NULL;
+ BKE_mesh_nomain_to_mesh(me_eval, me, ob, CD_MASK_MESH, false);
}
me->totcol = cu->totcol;
@@ -840,7 +841,7 @@ void BKE_mesh_to_curve(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *
/* settings: 1 - preview, 2 - render */
Mesh *BKE_mesh_new_from_object(
Depsgraph *depsgraph, Main *bmain, Scene *sce, Object *ob,
- const bool apply_modifiers, const bool calc_tessface, const bool calc_undeformed)
+ const bool apply_modifiers, const bool calc_undeformed)
{
Mesh *tmpmesh;
Curve *tmpcu = NULL, *copycu;
@@ -856,7 +857,7 @@ Mesh *BKE_mesh_new_from_object(
case OB_SURF:
{
ListBase dispbase = {NULL, NULL};
- DerivedMesh *derivedFinal = NULL;
+ Mesh *me_eval_final = NULL;
int uv_from_orco;
/* copies object and modifiers (but not the data) */
@@ -898,12 +899,12 @@ Mesh *BKE_mesh_new_from_object(
copycu->editnurb = tmpcu->editnurb;
/* get updated display list, and convert to a mesh */
- BKE_displist_make_curveTypes_forRender(depsgraph, sce, tmpobj, &dispbase, &derivedFinal, false, render);
+ BKE_displist_make_curveTypes_forRender(depsgraph, sce, tmpobj, &dispbase, &me_eval_final, false, render);
copycu->editfont = NULL;
copycu->editnurb = NULL;
- tmpobj->derivedFinal = derivedFinal;
+ tmpobj->runtime.mesh_eval = me_eval_final;
/* convert object type to mesh */
uv_from_orco = (tmpcu->flag & CU_UV_ORCO) != 0;
@@ -976,7 +977,7 @@ Mesh *BKE_mesh_new_from_object(
/* if not getting the original caged mesh, get final derived mesh */
else {
/* Make a dummy mesh, saves copying */
- DerivedMesh *dm;
+ Mesh *me_eval;
/* CustomDataMask mask = CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL; */
CustomDataMask mask = CD_MASK_MESH; /* this seems more suitable, exporter,
* for example, needs CD_MASK_MDEFORMVERT */
@@ -984,14 +985,15 @@ Mesh *BKE_mesh_new_from_object(
if (calc_undeformed)
mask |= CD_MASK_ORCO;
- /* Write the display mesh into the dummy mesh */
- if (render)
- dm = mesh_create_derived_render(depsgraph, sce, ob, mask);
- else
- dm = mesh_create_derived_view(depsgraph, sce, ob, mask);
+ if (render) {
+ me_eval = mesh_create_eval_final_render(depsgraph, sce, ob, mask);
+ }
+ else {
+ me_eval = mesh_create_eval_final_view(depsgraph, sce, ob, mask);
+ }
tmpmesh = BKE_mesh_add(bmain, ((ID *)ob->data)->name + 2);
- DM_to_mesh(dm, tmpmesh, ob, mask, true);
+ BKE_mesh_nomain_to_mesh(me_eval, tmpmesh, ob, mask, true);
/* Copy autosmooth settings from original mesh. */
Mesh *me = (Mesh *)ob->data;
@@ -1069,11 +1071,6 @@ Mesh *BKE_mesh_new_from_object(
break;
} /* end copy materials */
- if (calc_tessface) {
- /* cycles and exporters rely on this still */
- BKE_mesh_tessface_ensure(tmpmesh);
- }
-
return tmpmesh;
}
@@ -1144,7 +1141,7 @@ Mesh *BKE_mesh_create_derived_for_modifier(
int numVerts;
float (*deformedVerts)[3] = BKE_mesh_vertexCos_get(me, &numVerts);
- modifier_deformVerts(md, &mectx, NULL, deformedVerts, numVerts);
+ mti->deformVerts(md, &mectx, NULL, deformedVerts, numVerts);
BKE_id_copy_ex(
NULL, &me->id, (ID **)&result,
LIB_ID_CREATE_NO_MAIN |
@@ -1172,7 +1169,7 @@ Mesh *BKE_mesh_create_derived_for_modifier(
if (build_shapekey_layers)
add_shapekey_layers(mesh_temp, me);
- result = modifier_applyModifier(md, &mectx, mesh_temp);
+ result = mti->applyModifier(md, &mectx, mesh_temp);
ASSERT_IS_VALID_MESH(result);
if (mesh_temp != result) {
@@ -1330,7 +1327,7 @@ void BKE_mesh_nomain_to_mesh(Mesh *mesh_src, Mesh *mesh_dst, Object *ob, CustomD
totedge);
}
if (!CustomData_has_layer(&tmp.pdata, CD_MPOLY)) {
- /* TODO(Sybren): assigment to tmp.mxxx is probably not necessary due to the
+ /* TODO(Sybren): assignment to tmp.mxxx is probably not necessary due to the
* BKE_mesh_update_customdata_pointers() call below. */
tmp.mloop = (alloctype == CD_ASSIGN) ? mesh_src->mloop : MEM_dupallocN(mesh_src->mloop);
tmp.mpoly = (alloctype == CD_ASSIGN) ? mesh_src->mpoly : MEM_dupallocN(mesh_src->mpoly);
diff --git a/source/blender/blenkernel/intern/mesh_evaluate.c b/source/blender/blenkernel/intern/mesh_evaluate.c
index 10f2e13940a..bf63594f8af 100644
--- a/source/blender/blenkernel/intern/mesh_evaluate.c
+++ b/source/blender/blenkernel/intern/mesh_evaluate.c
@@ -355,6 +355,35 @@ void BKE_mesh_ensure_normals(Mesh *mesh)
BLI_assert((mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) == 0);
}
+/**
+ * Called after calculating all modifiers.
+ */
+void BKE_mesh_ensure_normals_for_display(Mesh *mesh)
+{
+ /* Note: mesh *may* have a poly CD_NORMAL layer (generated by a modifier needing poly normals e.g.).
+ * We do not use it here, though. And it should be tagged as temp!
+ */
+ /* BLI_assert((CustomData_has_layer(&mesh->pdata, CD_NORMAL) == false)); */
+
+ if (mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL || !CustomData_has_layer(&mesh->pdata, CD_NORMAL)) {
+ float (*poly_nors)[3] = NULL;
+ poly_nors = MEM_malloc_arrayN((size_t)mesh->totpoly, sizeof(*poly_nors), __func__);
+
+ /* if normals are dirty we want to calculate vertex normals too */
+ bool only_face_normals = !(mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL);
+
+ /* calculate face normals */
+ BKE_mesh_calc_normals_poly(
+ mesh->mvert, NULL, mesh->totvert, mesh->mloop, mesh->mpoly,
+ mesh->totloop, mesh->totpoly, poly_nors,
+ only_face_normals);
+
+ CustomData_add_layer(&mesh->pdata, CD_NORMAL, CD_ASSIGN, poly_nors, mesh->totpoly);
+
+ mesh->runtime.cd_dirty_vert &= ~CD_MASK_NORMAL;
+ }
+}
+
/* Note that this does not update the CD_NORMAL layer, but does update the normals in the CD_MVERT layer. */
void BKE_mesh_calc_normals(Mesh *mesh)
{
@@ -599,7 +628,7 @@ void BKE_lnor_space_add_loop(
lnors_spacearr->lspacearr[ml_index] = lnor_space;
if (bm_loop == NULL) {
- bm_loop = SET_INT_IN_POINTER(ml_index);
+ bm_loop = POINTER_FROM_INT(ml_index);
}
if (is_single) {
BLI_assert(lnor_space->loops == NULL);
@@ -1688,7 +1717,7 @@ static void mesh_normals_loop_custom_set(
const float *org_nor = NULL;
while (loops) {
- const int lidx = GET_INT_FROM_POINTER(loops->link);
+ const int lidx = POINTER_AS_INT(loops->link);
MLoop *ml = &mloops[lidx];
const int nidx = lidx;
float *nor = r_custom_loopnors[nidx];
@@ -1719,7 +1748,7 @@ static void mesh_normals_loop_custom_set(
* See T45984. */
loops = lnors_spacearr.lspacearr[i]->loops;
if (loops && org_nor) {
- const int lidx = GET_INT_FROM_POINTER(loops->link);
+ const int lidx = POINTER_AS_INT(loops->link);
MLoop *ml = &mloops[lidx];
const int nidx = lidx;
float *nor = r_custom_loopnors[nidx];
@@ -1761,7 +1790,7 @@ static void mesh_normals_loop_custom_set(
*/
LinkNode *loops = lnors_spacearr.lspacearr[i]->loops;
if (lnors_spacearr.lspacearr[i]->flags & MLNOR_SPACE_IS_SINGLE) {
- BLI_assert(GET_INT_FROM_POINTER(loops) == i);
+ BLI_assert(POINTER_AS_INT(loops) == i);
const int nidx = use_vertices ? (int)mloops[i].v : i;
float *nor = r_custom_loopnors[nidx];
@@ -1775,7 +1804,7 @@ static void mesh_normals_loop_custom_set(
zero_v3(avg_nor);
while (loops) {
- const int lidx = GET_INT_FROM_POINTER(loops->link);
+ const int lidx = POINTER_AS_INT(loops->link);
const int nidx = use_vertices ? (int)mloops[lidx].v : lidx;
float *nor = r_custom_loopnors[nidx];
@@ -2137,30 +2166,6 @@ static float mesh_calc_poly_area_centroid(
return total_area;
}
-#if 0 /* slow version of the function below */
-void BKE_mesh_calc_poly_angles(
- MPoly *mpoly, MLoop *loopstart,
- MVert *mvarray, float angles[])
-{
- MLoop *ml;
- MLoop *mloop = &loopstart[-mpoly->loopstart];
-
- int j;
- for (j = 0, ml = loopstart; j < mpoly->totloop; j++, ml++) {
- MLoop *ml_prev = ME_POLY_LOOP_PREV(mloop, mpoly, j);
- MLoop *ml_next = ME_POLY_LOOP_NEXT(mloop, mpoly, j);
-
- float e1[3], e2[3];
-
- sub_v3_v3v3(e1, mvarray[ml_next->v].co, mvarray[ml->v].co);
- sub_v3_v3v3(e2, mvarray[ml_prev->v].co, mvarray[ml->v].co);
-
- angles[j] = (float)M_PI - angle_v3v3(e1, e2);
- }
-}
-
-#else /* equivalent the function above but avoid multiple subtractions + normalize */
-
void BKE_mesh_calc_poly_angles(
const MPoly *mpoly, const MLoop *loopstart,
const MVert *mvarray, float angles[])
@@ -2185,7 +2190,6 @@ void BKE_mesh_calc_poly_angles(
i_next++;
}
}
-#endif
void BKE_mesh_poly_edgehash_insert(EdgeHash *ehash, const MPoly *mp, const MLoop *mloop)
{
@@ -2305,7 +2309,7 @@ bool BKE_mesh_center_of_volume(const Mesh *me, float r_cent[3])
}
/* otherwise we get NAN for 0 polys */
if (total_volume != 0.0f) {
- /* multipy by 0.25 to get the correct centroid */
+ /* multiply by 0.25 to get the correct centroid */
/* no need to divide volume by 6 as the centroid is weighted by 6x the volume, so it all cancels out */
mul_v3_fl(r_cent, 0.25f / total_volume);
}
@@ -3226,7 +3230,7 @@ void BKE_mesh_convert_mfaces_to_mpolys_ex(
/* build edge hash */
me = medge;
for (i = 0; i < totedge_i; i++, me++) {
- BLI_edgehash_insert(eh, me->v1, me->v2, SET_UINT_IN_POINTER(i));
+ BLI_edgehash_insert(eh, me->v1, me->v2, POINTER_FROM_UINT(i));
/* unrelated but avoid having the FGON flag enabled, so we can reuse it later for something else */
me->flag &= ~ME_FGON;
@@ -3248,7 +3252,7 @@ void BKE_mesh_convert_mfaces_to_mpolys_ex(
# define ML(v1, v2) { \
ml->v = mf->v1; \
- ml->e = GET_UINT_FROM_POINTER(BLI_edgehash_lookup(eh, mf->v1, mf->v2)); \
+ ml->e = POINTER_AS_UINT(BLI_edgehash_lookup(eh, mf->v1, mf->v2)); \
ml++; j++; \
} (void)0
diff --git a/source/blender/blenkernel/intern/mesh_iterators.c b/source/blender/blenkernel/intern/mesh_iterators.c
index f96a91c6e4d..73dcd912f48 100644
--- a/source/blender/blenkernel/intern/mesh_iterators.c
+++ b/source/blender/blenkernel/intern/mesh_iterators.c
@@ -45,20 +45,21 @@ void BKE_mesh_foreach_mapped_vert(
void *userData,
MeshForeachFlag flag)
{
- MVert *mv = mesh->mvert;
+ const MVert *mv = mesh->mvert;
const int *index = CustomData_get_layer(&mesh->vdata, CD_ORIGINDEX);
- int i;
if (index) {
- for (i = 0; i < mesh->totvert; i++, mv++) {
+ for (int i = 0; i < mesh->totvert; i++, mv++) {
const short *no = (flag & MESH_FOREACH_USE_NORMAL) ? mv->no : NULL;
const int orig = *index++;
- if (orig == ORIGINDEX_NONE) continue;
+ if (orig == ORIGINDEX_NONE) {
+ continue;
+ }
func(userData, orig, mv->co, NULL, no);
}
}
else {
- for (i = 0; i < mesh->totvert; i++, mv++) {
+ for (int i = 0; i < mesh->totvert; i++, mv++) {
const short *no = (flag & MESH_FOREACH_USE_NORMAL) ? mv->no : NULL;
func(userData, i, mv->co, NULL, no);
}
@@ -71,18 +72,23 @@ void BKE_mesh_foreach_mapped_edge(
void (*func)(void *userData, int index, const float v0co[3], const float v1co[3]),
void *userData)
{
- MVert *mv = mesh->mvert;
- MEdge *med = mesh->medge;
- int i, orig, *index = CustomData_get_layer(&mesh->edata, CD_ORIGINDEX);
-
- for (i = 0; i < mesh->totedge; i++, med++) {
- if (index) {
- orig = *index++;
- if (orig == ORIGINDEX_NONE) continue;
+ const MVert *mv = mesh->mvert;
+ const MEdge *med = mesh->medge;
+ const int *index = CustomData_get_layer(&mesh->edata, CD_ORIGINDEX);
+
+ if (index) {
+ for (int i = 0; i < mesh->totedge; i++, med++) {
+ const int orig = *index++;
+ if (orig == ORIGINDEX_NONE) {
+ continue;
+ }
func(userData, orig, mv[med->v1].co, mv[med->v2].co);
}
- else
+ }
+ else {
+ for (int i = 0; i < mesh->totedge; i++, med++) {
func(userData, i, mv[med->v1].co, mv[med->v2].co);
+ }
}
}
@@ -104,12 +110,25 @@ void BKE_mesh_foreach_mapped_loop(
const int *f_index = CustomData_get_layer(&mesh->pdata, CD_ORIGINDEX);
int p_idx, i;
- for (p_idx = 0; p_idx < mesh->totpoly; ++p_idx, ++mp) {
- for (i = 0; i < mp->totloop; ++i, ++ml) {
- const int v_idx = v_index ? v_index[ml->v] : ml->v;
- const int f_idx = f_index ? f_index[p_idx] : p_idx;
- const float *no = lnors ? *lnors++ : NULL;
- if (!ELEM(ORIGINDEX_NONE, v_idx, f_idx)) {
+ if (v_index || f_index) {
+ for (p_idx = 0; p_idx < mesh->totpoly; p_idx++, mp++) {
+ for (i = 0; i < mp->totloop; i++, ml++) {
+ const int v_idx = v_index ? v_index[ml->v] : ml->v;
+ const int f_idx = f_index ? f_index[p_idx] : p_idx;
+ const float *no = lnors ? *lnors++ : NULL;
+ if (ELEM(ORIGINDEX_NONE, v_idx, f_idx)) {
+ continue;
+ }
+ func(userData, v_idx, f_idx, mv[ml->v].co, no);
+ }
+ }
+ }
+ else {
+ for (p_idx = 0; p_idx < mesh->totpoly; p_idx++, mp++) {
+ for (i = 0; i < mp->totloop; i++, ml++) {
+ const int v_idx = ml->v;
+ const int f_idx = p_idx;
+ const float *no = lnors ? *lnors++ : NULL;
func(userData, v_idx, f_idx, mv[ml->v].co, no);
}
}
@@ -123,38 +142,39 @@ void BKE_mesh_foreach_mapped_face_center(
void *userData,
MeshForeachFlag flag)
{
- MVert *mvert = mesh->mvert;
- MPoly *mp;
- MLoop *ml;
- int i, orig, *index;
-
- index = CustomData_get_layer(&mesh->pdata, CD_ORIGINDEX);
- mp = mesh->mpoly;
- for (i = 0; i < mesh->totpoly; i++, mp++) {
- float cent[3];
- float *no, _no[3];
-
- if (index) {
- orig = *index++;
- if (orig == ORIGINDEX_NONE) continue;
- }
- else {
- orig = i;
- }
-
- ml = &mesh->mloop[mp->loopstart];
- BKE_mesh_calc_poly_center(mp, ml, mvert, cent);
+ const MVert *mvert = mesh->mvert;
+ const MPoly *mp = mesh->mpoly;
+ const MLoop *ml;
+ float _no_buf[3];
+ float *no = (flag & MESH_FOREACH_USE_NORMAL) ? _no_buf : NULL;
+ const int *index = CustomData_get_layer(&mesh->pdata, CD_ORIGINDEX);
- if (flag & MESH_FOREACH_USE_NORMAL) {
- BKE_mesh_calc_poly_normal(mp, ml, mvert, (no = _no));
+ if (index) {
+ for (int i = 0; i < mesh->totpoly; i++, mp++) {
+ const int orig = *index++;
+ if (orig == ORIGINDEX_NONE) {
+ continue;
+ }
+ float cent[3];
+ ml = &mesh->mloop[mp->loopstart];
+ BKE_mesh_calc_poly_center(mp, ml, mvert, cent);
+ if (flag & MESH_FOREACH_USE_NORMAL) {
+ BKE_mesh_calc_poly_normal(mp, ml, mvert, no);
+ }
+ func(userData, orig, cent, no);
}
- else {
- no = NULL;
+ }
+ else {
+ for (int i = 0; i < mesh->totpoly; i++, mp++) {
+ float cent[3];
+ ml = &mesh->mloop[mp->loopstart];
+ BKE_mesh_calc_poly_center(mp, ml, mvert, cent);
+ if (flag & MESH_FOREACH_USE_NORMAL) {
+ BKE_mesh_calc_poly_normal(mp, ml, mvert, no);
+ }
+ func(userData, i, cent, no);
}
-
- func(userData, orig, cent, no);
}
-
}
diff --git a/source/blender/blenkernel/intern/mesh_mapping.c b/source/blender/blenkernel/intern/mesh_mapping.c
index 5c9849f6b74..2d82a5102b0 100644
--- a/source/blender/blenkernel/intern/mesh_mapping.c
+++ b/source/blender/blenkernel/intern/mesh_mapping.c
@@ -1109,7 +1109,7 @@ bool BKE_mesh_calc_islands_loop_poly_edgeseam(
*
* \note If no MLoopUV layer is passed, we only consider edges tagged as seams as UV boundaries.
* This has the advantages of simplicity, and being valid/common to all UV maps.
- * However, it means actual UV islands whithout matching UV seams will not be handled correctly...
+ * However, it means actual UV islands without matching UV seams will not be handled correctly...
* If a valid UV layer is passed as \a luvs parameter, UV coordinates are also used to detect islands boundaries.
*
* \note All this could be optimized...
diff --git a/source/blender/blenkernel/intern/mesh_merge.c b/source/blender/blenkernel/intern/mesh_merge.c
index d49ca507e02..5324c397ebf 100644
--- a/source/blender/blenkernel/intern/mesh_merge.c
+++ b/source/blender/blenkernel/intern/mesh_merge.c
@@ -342,13 +342,13 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh, const int *vtargetmap, const int tot_vtar
void **val_p;
if (BLI_edgehash_ensure_p(ehash, v1, v2, &val_p)) {
- newe[i] = GET_INT_FROM_POINTER(*val_p);
+ newe[i] = POINTER_AS_INT(*val_p);
}
else {
STACK_PUSH(olde, i);
STACK_PUSH(medge, *med);
newe[i] = c;
- *val_p = SET_INT_IN_POINTER(c);
+ *val_p = POINTER_FROM_INT(c);
c++;
}
}
@@ -507,7 +507,7 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh, const int *vtargetmap, const int tot_vtar
uint v2 = mlv;
BLI_assert(v1 != v2);
if (BLI_edgehash_ensure_p(ehash, v1, v2, &val_p)) {
- last_valid_ml->e = GET_INT_FROM_POINTER(*val_p);
+ last_valid_ml->e = POINTER_AS_INT(*val_p);
}
else {
const int new_eidx = STACK_SIZE(medge);
@@ -516,7 +516,7 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh, const int *vtargetmap, const int tot_vtar
medge[new_eidx].v1 = last_valid_ml->v;
medge[new_eidx].v2 = ml->v;
/* DO NOT change newe mapping, could break actual values due to some deleted original edges. */
- *val_p = SET_INT_IN_POINTER(new_eidx);
+ *val_p = POINTER_FROM_INT(new_eidx);
created_edges++;
last_valid_ml->e = new_eidx;
@@ -559,7 +559,7 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh, const int *vtargetmap, const int tot_vtar
uint v2 = (vtargetmap[first_valid_ml->v] != -1) ? vtargetmap[first_valid_ml->v] : first_valid_ml->v;
BLI_assert(v1 != v2);
if (BLI_edgehash_ensure_p(ehash, v1, v2, &val_p)) {
- last_valid_ml->e = GET_INT_FROM_POINTER(*val_p);
+ last_valid_ml->e = POINTER_AS_INT(*val_p);
}
else {
const int new_eidx = STACK_SIZE(medge);
@@ -568,7 +568,7 @@ Mesh *BKE_mesh_merge_verts(Mesh *mesh, const int *vtargetmap, const int tot_vtar
medge[new_eidx].v1 = last_valid_ml->v;
medge[new_eidx].v2 = first_valid_ml->v;
/* DO NOT change newe mapping, could break actual values due to some deleted original edges. */
- *val_p = SET_INT_IN_POINTER(new_eidx);
+ *val_p = POINTER_FROM_INT(new_eidx);
created_edges++;
last_valid_ml->e = new_eidx;
diff --git a/source/blender/blenkernel/intern/mesh_remap.c b/source/blender/blenkernel/intern/mesh_remap.c
index bf98b8040e3..bdf5b3fddcc 100644
--- a/source/blender/blenkernel/intern/mesh_remap.c
+++ b/source/blender/blenkernel/intern/mesh_remap.c
@@ -281,7 +281,7 @@ void BKE_mesh_remap_find_best_match_from_mesh(
best_match = match;
copy_m4_m4(best_mat_dst, mat_dst);
- /* And now, we have to check the otehr sixth possible mirrored versions... */
+ /* And now, we have to check the other sixth possible mirrored versions... */
for (mirr = mirrors; (*mirr)[0]; mirr++) {
mul_v3_fl(mat_dst[0], (*mirr)[0]);
mul_v3_fl(mat_dst[1], (*mirr)[1]);
@@ -966,7 +966,7 @@ static void mesh_island_to_astar_graph_edge_process(
const int pidx = edge_to_poly_map[edge_idx].indices[i];
MPoly *mp = &polys[pidx];
const int pidx_isld = islands ? poly_island_index_map[pidx] : pidx;
- void *custom_data = is_edge_innercut ? SET_INT_IN_POINTER(edge_idx) : SET_INT_IN_POINTER(-1);
+ void *custom_data = is_edge_innercut ? POINTER_FROM_INT(edge_idx) : POINTER_FROM_INT(-1);
if (UNLIKELY(islands && (islands->items_to_islands[mp->loopstart] != island_index))) {
/* poly not in current island, happens with border edges... */
@@ -1082,12 +1082,12 @@ static float mesh_remap_calc_loops_astar_f_cost(
{
float *co_next, *co_dest;
- if (link && (GET_INT_FROM_POINTER(link->custom_data) != -1)) {
+ if (link && (POINTER_AS_INT(link->custom_data) != -1)) {
/* An innercut edge... We tag our solution as potentially crossing innercuts.
* Note it might not be the case in the end (AStar will explore around optimal path), but helps
* trimming off some processing later... */
- if (!GET_INT_FROM_POINTER(as_solution->custom_data)) {
- as_solution->custom_data = SET_INT_IN_POINTER(true);
+ if (!POINTER_AS_INT(as_solution->custom_data)) {
+ as_solution->custom_data = POINTER_FROM_INT(true);
}
}
@@ -1666,7 +1666,7 @@ void BKE_mesh_remap_calc_loops_from_mesh(
continue;
}
- as_solution.custom_data = SET_INT_IN_POINTER(false);
+ as_solution.custom_data = POINTER_FROM_INT(false);
isld_res = &islands_res[best_island_index][plidx_dst];
if (use_from_vert) {
@@ -1689,7 +1689,7 @@ void BKE_mesh_remap_calc_loops_from_mesh(
BLI_astar_graph_solve(
as_graph, pidx_isld_src_prev, pidx_isld_src,
mesh_remap_calc_loops_astar_f_cost, &as_solution, isld_steps_src);
- if (GET_INT_FROM_POINTER(as_solution.custom_data) && (as_solution.steps > 0)) {
+ if (POINTER_AS_INT(as_solution.custom_data) && (as_solution.steps > 0)) {
/* Find first 'cutting edge' on path, and bring back lidx_src on poly just
* before that edge.
* Note we could try to be much smarter (like e.g. storing a whole poly's indices,
@@ -1701,7 +1701,7 @@ void BKE_mesh_remap_calc_loops_from_mesh(
/* Note we go backward here, from dest to src poly. */
for (i = as_solution.steps - 1; i--;) {
BLI_AStarGNLink *as_link = as_solution.prev_links[pidx_isld_src];
- const int eidx = GET_INT_FROM_POINTER(as_link->custom_data);
+ const int eidx = POINTER_AS_INT(as_link->custom_data);
pidx_isld_src = as_solution.prev_nodes[pidx_isld_src];
BLI_assert(pidx_isld_src != -1);
if (eidx != -1) {
@@ -1774,7 +1774,7 @@ void BKE_mesh_remap_calc_loops_from_mesh(
BLI_astar_graph_solve(
as_graph, pidx_isld_src_prev, pidx_isld_src,
mesh_remap_calc_loops_astar_f_cost, &as_solution, isld_steps_src);
- if (GET_INT_FROM_POINTER(as_solution.custom_data) && (as_solution.steps > 0)) {
+ if (POINTER_AS_INT(as_solution.custom_data) && (as_solution.steps > 0)) {
/* Find first 'cutting edge' on path, and bring back lidx_src on poly just
* before that edge.
* Note we could try to be much smarter (like e.g. storing a whole poly's indices,
@@ -1786,7 +1786,7 @@ void BKE_mesh_remap_calc_loops_from_mesh(
/* Note we go backward here, from dest to src poly. */
for (i = as_solution.steps - 1; i--;) {
BLI_AStarGNLink *as_link = as_solution.prev_links[pidx_isld_src];
- int eidx = GET_INT_FROM_POINTER(as_link->custom_data);
+ int eidx = POINTER_AS_INT(as_link->custom_data);
pidx_isld_src = as_solution.prev_nodes[pidx_isld_src];
BLI_assert(pidx_isld_src != -1);
diff --git a/source/blender/blenkernel/intern/mesh_runtime.c b/source/blender/blenkernel/intern/mesh_runtime.c
index 60699589a77..0931318f17a 100644
--- a/source/blender/blenkernel/intern/mesh_runtime.c
+++ b/source/blender/blenkernel/intern/mesh_runtime.c
@@ -43,6 +43,8 @@
#include "BKE_bvhutils.h"
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
+#include "BKE_subdiv_ccg.h"
+#include "BKE_shrinkwrap.h"
/* -------------------------------------------------------------------- */
/** \name Mesh Runtime Struct Utils
@@ -196,6 +198,12 @@ void BKE_mesh_runtime_clear_geometry(Mesh *mesh)
{
bvhcache_free(&mesh->runtime.bvh_cache);
MEM_SAFE_FREE(mesh->runtime.looptris.array);
+ /* TODO(sergey): Does this really belong here? */
+ if (mesh->runtime.subdiv_ccg != NULL) {
+ BKE_subdiv_ccg_destroy(mesh->runtime.subdiv_ccg);
+ mesh->runtime.subdiv_ccg = NULL;
+ }
+ BKE_shrinkwrap_discard_boundary_data(mesh);
}
/** \} */
@@ -238,7 +246,7 @@ static void mesh_runtime_debug_info_layers(
for (type = 0; type < CD_NUMTYPES; type++) {
if (CustomData_has_layer(cd, type)) {
- /* note: doesnt account for multiple layers */
+ /* note: doesn't account for multiple layers */
const char *name = CustomData_layertype_name(type);
const int size = CustomData_sizeof(type);
const void *pt = CustomData_get_layer(cd, type);
@@ -265,7 +273,6 @@ char *BKE_mesh_runtime_debug_info(Mesh *me_eval)
const char *tstr;
switch (me_eval->type) {
case DM_TYPE_CDDM: tstr = "DM_TYPE_CDDM"; break;
- case DM_TYPE_EDITBMESH: tstr = "DM_TYPE_EDITMESH"; break;
case DM_TYPE_CCGDM: tstr = "DM_TYPE_CCGDM"; break;
default: tstr = "UNKNOWN"; break;
}
diff --git a/source/blender/blenkernel/intern/mesh_tangent.c b/source/blender/blenkernel/intern/mesh_tangent.c
index 9d6d0b90959..b8d260e6922 100644
--- a/source/blender/blenkernel/intern/mesh_tangent.c
+++ b/source/blender/blenkernel/intern/mesh_tangent.c
@@ -691,4 +691,26 @@ void BKE_mesh_calc_loop_tangent_ex(
}
}
+void BKE_mesh_calc_loop_tangents(
+ Mesh *me_eval, bool calc_active_tangent,
+ const char (*tangent_names)[MAX_NAME], int tangent_names_len)
+{
+ /* TODO(campbell): store in Mesh.runtime to avoid recalculation. */
+ short tangent_mask = 0;
+ BKE_mesh_calc_loop_tangent_ex(
+ me_eval->mvert,
+ me_eval->mpoly, (uint)me_eval->totpoly,
+ me_eval->mloop,
+ me_eval->runtime.looptris.array, (uint)me_eval->runtime.looptris.len,
+ &me_eval->ldata,
+ calc_active_tangent,
+ tangent_names, tangent_names_len,
+ CustomData_get_layer(&me_eval->pdata, CD_NORMAL),
+ CustomData_get_layer(&me_eval->ldata, CD_NORMAL),
+ CustomData_get_layer(&me_eval->vdata, CD_ORCO), /* may be NULL */
+ /* result */
+ &me_eval->ldata, (uint)me_eval->totloop,
+ &tangent_mask);
+}
+
/** \} */
diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c
index f974362e4be..af4d1265cfd 100644
--- a/source/blender/blenkernel/intern/mesh_validate.c
+++ b/source/blender/blenkernel/intern/mesh_validate.c
@@ -326,13 +326,13 @@ bool BKE_mesh_validate_arrays(
if ((me->v1 != me->v2) && BLI_edgehash_haskey(edge_hash, me->v1, me->v2)) {
PRINT_ERR("\tEdge %u: is a duplicate of %d\n", i,
- GET_INT_FROM_POINTER(BLI_edgehash_lookup(edge_hash, me->v1, me->v2)));
+ POINTER_AS_INT(BLI_edgehash_lookup(edge_hash, me->v1, me->v2)));
remove = do_fixes;
}
if (remove == false) {
if (me->v1 != me->v2) {
- BLI_edgehash_insert(edge_hash, me->v1, me->v2, SET_INT_IN_POINTER(i));
+ BLI_edgehash_insert(edge_hash, me->v1, me->v2, POINTER_FROM_INT(i));
}
}
else {
@@ -362,7 +362,7 @@ bool BKE_mesh_validate_arrays(
SortFace *sf_prev;
unsigned int totsortface = 0;
- PRINT_ERR("No Polys, only tesselated Faces\n");
+ PRINT_ERR("No Polys, only tessellated Faces\n");
for (i = 0, mf = mfaces, sf = sort_faces; i < totface; i++, mf++) {
bool remove = false;
@@ -566,7 +566,7 @@ bool BKE_mesh_validate_arrays(
* We already know from previous text that a valid edge exists, use it (if allowed)! */
if (do_fixes) {
int prev_e = ml->e;
- ml->e = GET_INT_FROM_POINTER(BLI_edgehash_lookup(edge_hash, v1, v2));
+ ml->e = POINTER_AS_INT(BLI_edgehash_lookup(edge_hash, v1, v2));
fix_flag.loops_edge = true;
PRINT_ERR("\tLoop %u has invalid edge reference (%d), fixed using edge %u\n",
sp->loopstart + j, prev_e, ml->e);
@@ -583,7 +583,7 @@ bool BKE_mesh_validate_arrays(
* and we already know from previous test that a valid one exists, use it (if allowed)! */
if (do_fixes) {
int prev_e = ml->e;
- ml->e = GET_INT_FROM_POINTER(BLI_edgehash_lookup(edge_hash, v1, v2));
+ ml->e = POINTER_AS_INT(BLI_edgehash_lookup(edge_hash, v1, v2));
fix_flag.loops_edge = true;
PRINT_ERR("\tPoly %u has invalid edge reference (%d, is_removed: %d), fixed using edge %u\n",
sp->index, prev_e, IS_REMOVED_EDGE(me), ml->e);
@@ -618,62 +618,6 @@ bool BKE_mesh_validate_arrays(
}
/* Test same polys. */
-#if 0
- {
- bool p1_sub = true, p2_sub = true;
-
- /* NOTE: This performs a sub-set test. */
- /* XXX This (and the sort of verts list) is better than systematic
- * search of all verts of one list into the other if lists have
- * a fair amount of elements.
- * Not sure however it's worth it in this case?
- * But as we also need sorted vert list to check verts multi-used
- * (in first pass of checks)... */
- /* XXX If we consider only "equal" polys (i.e. using exactly same set of verts)
- * as invalid, better to replace this by a simple memory cmp... */
- while ((p1_nv && p2_nv) && (p1_sub || p2_sub)) {
- if (*p1_v < *p2_v) {
- if (p1_sub)
- p1_sub = false;
- p1_nv--;
- p1_v++;
- }
- else if (*p2_v < *p1_v) {
- if (p2_sub)
- p2_sub = false;
- p2_nv--;
- p2_v++;
- }
- else {
- /* Equality, both next verts. */
- p1_nv--;
- p2_nv--;
- p1_v++;
- p2_v++;
- }
- }
- if (p1_nv && p1_sub)
- p1_sub = false;
- else if (p2_nv && p2_sub)
- p2_sub = false;
-
- if (p1_sub && p2_sub) {
- PRINT("\tPolys %u and %u use same vertices, considering poly %u as invalid.\n",
- prev_sp->index, sp->index, sp->index);
- sp->invalid = true;
- }
- /* XXX In fact, these might be valid? :/ */
- else if (p1_sub) {
- PRINT("\t%u is a sub-poly of %u, considering it as invalid.\n", sp->index, prev_sp->index);
- sp->invalid = true;
- }
- else if (p2_sub) {
- PRINT("\t%u is a sub-poly of %u, considering it as invalid.\n", prev_sp->index, sp->index);
- prev_sp->invalid = true;
- prev_sp = sp; /* sp is new reference poly. */
- }
- }
-#else
if ((p1_nv == p2_nv) && (memcmp(p1_v, p2_v, p1_nv * sizeof(*p1_v)) == 0)) {
if (do_verbose) {
PRINT_ERR("\tPolys %u and %u use same vertices (%d",
@@ -687,7 +631,6 @@ bool BKE_mesh_validate_arrays(
}
sp->invalid = true;
}
-#endif
else {
prev_sp = sp;
}
@@ -1351,7 +1294,7 @@ static void mesh_calc_edges_mdata(
/* set edge members of mloops */
hash = BLI_edgehash_new_ex(__func__, totedge_final);
for (edge_index = 0, med = medge; edge_index < totedge_final; edge_index++, med++) {
- BLI_edgehash_insert(hash, med->v1, med->v2, SET_UINT_IN_POINTER(edge_index));
+ BLI_edgehash_insert(hash, med->v1, med->v2, POINTER_FROM_UINT(edge_index));
}
mpoly = allpoly;
@@ -1363,7 +1306,7 @@ static void mesh_calc_edges_mdata(
ml = &ml_next[i - 1]; /* last loop */
while (i-- != 0) {
- ml->e = GET_UINT_FROM_POINTER(BLI_edgehash_lookup(hash, ml->v, ml_next->v));
+ ml->e = POINTER_AS_UINT(BLI_edgehash_lookup(hash, ml->v, ml_next->v));
ml = ml_next;
ml_next++;
}
@@ -1472,7 +1415,7 @@ void BKE_mesh_calc_edges(Mesh *mesh, bool update, const bool select)
}
/* store the new edge index in the hash value */
- BLI_edgehashIterator_setValue(ehi, SET_INT_IN_POINTER(i));
+ BLI_edgehashIterator_setValue(ehi, POINTER_FROM_INT(i));
}
BLI_edgehashIterator_free(ehi);
@@ -1485,7 +1428,7 @@ void BKE_mesh_calc_edges(Mesh *mesh, bool update, const bool select)
int j;
for (j = 0; j < mp->totloop; j++, l++) {
/* lookup hashed edge index */
- med_index = GET_INT_FROM_POINTER(BLI_edgehash_lookup(eh, l_prev->v, l->v));
+ med_index = POINTER_AS_INT(BLI_edgehash_lookup(eh, l_prev->v, l->v));
l_prev->e = med_index;
l_prev = l;
}
@@ -1501,4 +1444,78 @@ void BKE_mesh_calc_edges(Mesh *mesh, bool update, const bool select)
BLI_edgehash_free(eh, NULL);
}
+
+void BKE_mesh_calc_edges_loose(Mesh *mesh)
+{
+ MEdge *med = mesh->medge;
+ for (int i = 0; i < mesh->totedge; i++, med++) {
+ med->flag |= ME_LOOSEEDGE;
+ }
+ MLoop *ml = mesh->mloop;
+ for (int i = 0; i < mesh->totloop; i++, ml++) {
+ mesh->medge[ml->e].flag &= ~ME_LOOSEEDGE;
+ }
+}
+
+/**
+ * Calculate/create edges from tessface data
+ *
+ * \param mesh The mesh to add edges into
+ */
+
+void BKE_mesh_calc_edges_tessface(Mesh *mesh)
+{
+ CustomData edgeData;
+ EdgeSetIterator *ehi;
+ MFace *mf = mesh->mface;
+ MEdge *med;
+ EdgeSet *eh;
+ int i, *index, numEdges, numFaces = mesh->totface;
+
+ eh = BLI_edgeset_new_ex(__func__, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(numFaces));
+
+ for (i = 0; i < numFaces; i++, mf++) {
+ BLI_edgeset_add(eh, mf->v1, mf->v2);
+ BLI_edgeset_add(eh, mf->v2, mf->v3);
+
+ if (mf->v4) {
+ BLI_edgeset_add(eh, mf->v3, mf->v4);
+ BLI_edgeset_add(eh, mf->v4, mf->v1);
+ }
+ else {
+ BLI_edgeset_add(eh, mf->v3, mf->v1);
+ }
+ }
+
+ numEdges = BLI_edgeset_len(eh);
+
+ /* write new edges into a temporary CustomData */
+ CustomData_reset(&edgeData);
+ CustomData_add_layer(&edgeData, CD_MEDGE, CD_CALLOC, NULL, numEdges);
+ CustomData_add_layer(&edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, numEdges);
+
+ med = CustomData_get_layer(&edgeData, CD_MEDGE);
+ index = CustomData_get_layer(&edgeData, CD_ORIGINDEX);
+
+ for (ehi = BLI_edgesetIterator_new(eh), i = 0;
+ BLI_edgesetIterator_isDone(ehi) == false;
+ BLI_edgesetIterator_step(ehi), i++, med++, index++)
+ {
+ BLI_edgesetIterator_getKey(ehi, &med->v1, &med->v2);
+
+ med->flag = ME_EDGEDRAW | ME_EDGERENDER;
+ *index = ORIGINDEX_NONE;
+ }
+ BLI_edgesetIterator_free(ehi);
+
+ /* free old CustomData and assign new one */
+ CustomData_free(&mesh->edata, mesh->totedge);
+ mesh->edata = edgeData;
+ mesh->totedge = numEdges;
+
+ mesh->medge = CustomData_get_layer(&mesh->edata, CD_MEDGE);
+
+ BLI_edgeset_free(eh);
+}
+
/** \} */
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index f1cdc24cbcf..1ffeacbfd4e 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -306,7 +306,7 @@ void modifier_copyData_generic(const ModifierData *md_src, ModifierData *md_dst,
{
const ModifierTypeInfo *mti = modifierType_getInfo(md_src->type);
- /* md_dst may have alredy be fully initialized with some extra allocated data,
+ /* md_dst may have already be fully initialized with some extra allocated data,
* we need to free it now to avoid memleak. */
if (mti->freeData) {
mti->freeData(md_dst);
@@ -719,7 +719,7 @@ bool modifiers_usesArmature(Object *ob, bArmature *arm)
bool modifier_isCorrectableDeformed(ModifierData *md)
{
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- return (mti->deformMatricesEM != NULL) || (mti->deformMatricesEM_DM != NULL);
+ return mti->deformMatricesEM != NULL;
}
bool modifiers_isCorrectableDeformed(struct Scene *scene, Object *ob)
@@ -787,7 +787,7 @@ void test_object_modifiers(Object *ob)
}
}
-/* where should this go?, it doesnt fit well anywhere :S - campbell */
+/* where should this go?, it doesn't fit well anywhere :S - campbell */
/* elubie: changed this to default to the same dir as the render output
* to prevent saving to C:\ on Windows */
@@ -835,58 +835,46 @@ void modifier_path_init(char *path, int path_maxlen, const char *name)
/* wrapper around ModifierTypeInfo.applyModifier that ensures valid normals */
-struct DerivedMesh *modwrap_applyModifier(
+struct Mesh *modwrap_applyModifier(
ModifierData *md, const ModifierEvalContext *ctx,
- struct DerivedMesh *dm)
+ struct Mesh *me)
{
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- BLI_assert(CustomData_has_layer(&dm->polyData, CD_NORMAL) == false);
+ BLI_assert(CustomData_has_layer(&me->pdata, CD_NORMAL) == false);
if (mti->dependsOnNormals && mti->dependsOnNormals(md)) {
- DM_ensure_normals(dm);
+ BKE_mesh_calc_normals(me);
}
- return modifier_applyModifier_DM_deprecated(md, ctx, dm);
-}
-
-struct DerivedMesh *modwrap_applyModifierEM(
- ModifierData *md, const ModifierEvalContext *ctx,
- struct BMEditMesh *em, DerivedMesh *dm)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- BLI_assert(CustomData_has_layer(&dm->polyData, CD_NORMAL) == false);
-
- if (mti->dependsOnNormals && mti->dependsOnNormals(md)) {
- DM_ensure_normals(dm);
- }
- return modifier_applyModifierEM_DM_deprecated(md, ctx, em, dm);
+ return mti->applyModifier(md, ctx, me);
}
void modwrap_deformVerts(
ModifierData *md, const ModifierEvalContext *ctx,
- DerivedMesh *dm, float (*vertexCos)[3], int numVerts)
+ Mesh *me, float (*vertexCos)[3], int numVerts)
{
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- BLI_assert(!dm || CustomData_has_layer(&dm->polyData, CD_NORMAL) == false);
+ BLI_assert(!me || CustomData_has_layer(&me->pdata, CD_NORMAL) == false);
- if (dm && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
- DM_ensure_normals(dm);
+ if (me && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
+ BKE_mesh_calc_normals(me);
}
- modifier_deformVerts_DM_deprecated(md, ctx, dm, vertexCos, numVerts);
+ mti->deformVerts(md, ctx, me, vertexCos, numVerts);
}
void modwrap_deformVertsEM(
ModifierData *md, const ModifierEvalContext *ctx,
- struct BMEditMesh *em, DerivedMesh *dm,
+ struct BMEditMesh *em, Mesh *me,
float (*vertexCos)[3], int numVerts)
{
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- BLI_assert(!dm || CustomData_has_layer(&dm->polyData, CD_NORMAL) == false);
+ BLI_assert(!me || CustomData_has_layer(&me->pdata, CD_NORMAL) == false);
- if (dm && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
- DM_ensure_normals(dm);
+ if (me && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
+ BKE_mesh_calc_normals(me);
}
- modifier_deformVertsEM_DM_deprecated(md, ctx, em, dm, vertexCos, numVerts);
+ mti->deformVertsEM(md, ctx, em, me, vertexCos, numVerts);
}
+
/* end modifier callback wrappers */
@@ -894,336 +882,35 @@ void modwrap_deformVertsEM(
* depending on if the modifier has been ported to Mesh or is still using DerivedMesh
*/
-void modifier_deformVerts(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct Mesh *mesh,
- float (*vertexCos)[3], int numVerts)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- if (mti->deformVerts) {
- mti->deformVerts(md, ctx, mesh, vertexCos, numVerts);
- }
- else {
- DerivedMesh *dm = NULL;
- if (mesh) {
- dm = CDDM_from_mesh_ex(mesh, CD_REFERENCE, CD_MASK_EVERYTHING);
- }
-
- mti->deformVerts_DM(md, ctx, dm, vertexCos, numVerts);
-
- if (dm) {
- dm->release(dm);
- }
- }
-}
-
-void modifier_deformVerts_ensure_normals(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct Mesh *mesh,
- float (*vertexCos)[3], int numVerts)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- BLI_assert(!mesh || CustomData_has_layer(&mesh->pdata, CD_NORMAL) == false);
-
- if (mesh && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
- BKE_mesh_calc_normals(mesh);
- }
- modifier_deformVerts(md, ctx, mesh, vertexCos, numVerts);
-}
-
-void modifier_deformMatrices(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct Mesh *mesh,
- float (*vertexCos)[3], float (*defMats)[3][3], int numVerts)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- if (mti->deformMatrices) {
- mti->deformMatrices(md, ctx, mesh, vertexCos, defMats, numVerts);
- }
- else {
- DerivedMesh *dm = NULL;
- if (mesh) {
- dm = CDDM_from_mesh_ex(mesh, CD_REFERENCE, CD_MASK_EVERYTHING);
- }
-
- mti->deformMatrices_DM(md, ctx, dm, vertexCos, defMats, numVerts);
-
- if (dm) {
- dm->release(dm);
- }
- }
-}
-
-void modifier_deformVertsEM(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct BMEditMesh *editData, struct Mesh *mesh,
- float (*vertexCos)[3], int numVerts)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- if (mti->deformVertsEM) {
- mti->deformVertsEM(md, ctx, editData, mesh, vertexCos, numVerts);
- }
- else {
- DerivedMesh *dm = NULL;
- if (mesh) {
- dm = CDDM_from_mesh_ex(mesh, CD_REFERENCE, CD_MASK_EVERYTHING);
- }
-
- mti->deformVertsEM_DM(md, ctx, editData, dm, vertexCos, numVerts);
-
- if (dm) {
- dm->release(dm);
- }
- }
-}
-
-void modifier_deformMatricesEM(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct BMEditMesh *editData, struct Mesh *mesh,
- float (*vertexCos)[3], float (*defMats)[3][3], int numVerts)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- if (mti->deformMatricesEM) {
- mti->deformMatricesEM(md, ctx, editData, mesh, vertexCos, defMats, numVerts);
- }
- else {
- DerivedMesh *dm = NULL;
- if (mesh) {
- dm = CDDM_from_mesh_ex(mesh, CD_REFERENCE, CD_MASK_EVERYTHING);
- }
-
- mti->deformMatricesEM_DM(md, ctx, editData, dm, vertexCos, defMats, numVerts);
-
- if (dm) {
- dm->release(dm);
- }
- }
-}
-
-struct Mesh *modifier_applyModifier(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct Mesh *mesh)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- if (mti->applyModifier) {
- return mti->applyModifier(md, ctx, mesh);
- }
- else {
- DerivedMesh *dm = CDDM_from_mesh_ex(mesh, CD_REFERENCE, CD_MASK_EVERYTHING);
-
- DerivedMesh *ndm = mti->applyModifier_DM(md, ctx, dm);
-
- if (ndm != dm) {
- dm->release(dm);
- }
-
- DM_to_mesh(ndm, mesh, ctx->object, CD_MASK_EVERYTHING, true);
-
- return mesh;
- }
-}
-
-struct Mesh *modifier_applyModifier_ensure_normals(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct Mesh *mesh)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- BLI_assert(CustomData_has_layer(&mesh->pdata, CD_NORMAL) == false);
-
- if (mti->dependsOnNormals && mti->dependsOnNormals(md)) {
- BKE_mesh_calc_normals(mesh);
- }
- return modifier_applyModifier(md, ctx, mesh);
-}
-
-struct Mesh *modifier_applyModifierEM(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct BMEditMesh *editData,
- struct Mesh *mesh)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- if (mti->applyModifierEM) {
- return mti->applyModifierEM(md, ctx, editData, mesh);
- }
- else {
- DerivedMesh *dm = CDDM_from_mesh_ex(mesh, CD_REFERENCE, CD_MASK_EVERYTHING);
-
- DerivedMesh *ndm = mti->applyModifierEM_DM(md, ctx, editData, dm);
-
- if (ndm != dm) {
- dm->release(dm);
- }
-
- DM_to_mesh(ndm, mesh, ctx->object, CD_MASK_EVERYTHING, true);
-
- return mesh;
- }
-}
-
-/* depricated variants of above that accept DerivedMesh */
-
-void modifier_deformVerts_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct DerivedMesh *dm,
- float (*vertexCos)[3], int numVerts)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- if (mti->deformVerts_DM) {
- mti->deformVerts_DM(md, ctx, dm, vertexCos, numVerts);
- }
- else {
- /* TODO(sybren): deduplicate all the copies of this code in this file. */
- Mesh *mesh = NULL;
- if (dm != NULL) {
- mesh = BKE_id_new_nomain(ID_ME, NULL);
- DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false);
- }
-
- mti->deformVerts(md, ctx, mesh, vertexCos, numVerts);
-
- if (mesh != NULL) {
- BKE_id_free(NULL, mesh);
- }
- }
-}
-
-void modifier_deformMatrices_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct DerivedMesh *dm,
- float (*vertexCos)[3], float (*defMats)[3][3], int numVerts)
-{
-
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- if (mti->deformMatrices_DM) {
- mti->deformMatrices_DM(md, ctx, dm, vertexCos, defMats, numVerts);
- }
- else {
- /* TODO(sybren): deduplicate all the copies of this code in this file. */
- Mesh *mesh = NULL;
- if (dm != NULL) {
- mesh = BKE_id_new_nomain(ID_ME, NULL);
- DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false);
- }
-
- mti->deformMatrices(md, ctx, mesh, vertexCos, defMats, numVerts);
-
- if (mesh != NULL) {
- BKE_id_free(NULL, mesh);
- }
- }
-}
-
-void modifier_deformVertsEM_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct BMEditMesh *editData, struct DerivedMesh *dm,
- float (*vertexCos)[3], int numVerts)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- if (mti->deformVertsEM_DM) {
- mti->deformVertsEM_DM(md, ctx, editData, dm, vertexCos, numVerts);
- }
- else {
- /* TODO(sybren): deduplicate all the copies of this code in this file. */
- Mesh *mesh = NULL;
- if (dm != NULL) {
- mesh = BKE_id_new_nomain(ID_ME, NULL);
- DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false);
- }
-
- mti->deformVertsEM(md, ctx, editData, mesh, vertexCos, numVerts);
-
- if (mesh != NULL) {
- BKE_id_free(NULL, mesh);
- }
- }
-}
+/* deprecated variants of above that accept DerivedMesh */
-void modifier_deformMatricesEM_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct BMEditMesh *editData, struct DerivedMesh *dm,
- float (*vertexCos)[3], float (*defMats)[3][3], int numVerts)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- if (mti->deformMatricesEM_DM) {
- mti->deformMatricesEM_DM(md, ctx, editData, dm, vertexCos, defMats, numVerts);
- }
- else {
- /* TODO(sybren): deduplicate all the copies of this code in this file. */
- Mesh *mesh = NULL;
- if (dm != NULL) {
- mesh = BKE_id_new_nomain(ID_ME, NULL);
- DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false);
- }
-
- mti->deformMatricesEM(md, ctx, editData, mesh, vertexCos, defMats, numVerts);
-
- if (mesh != NULL) {
- BKE_id_free(NULL, mesh);
- }
- }
-}
-
-struct DerivedMesh *modifier_applyModifier_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct DerivedMesh *dm)
+struct DerivedMesh *modifier_applyModifier_DM_deprecated(
+ struct ModifierData *md, const ModifierEvalContext *ctx,
+ struct DerivedMesh *dm)
{
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- if (mti->applyModifier_DM) {
- return mti->applyModifier_DM(md, ctx, dm);
+ /* TODO(sybren): deduplicate all the copies of this code in this file. */
+ Mesh *mesh = NULL;
+ if (dm != NULL) {
+ mesh = BKE_id_new_nomain(ID_ME, NULL);
+ DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false);
}
- else {
- /* TODO(sybren): deduplicate all the copies of this code in this file. */
- Mesh *mesh = NULL;
- if (dm != NULL) {
- mesh = BKE_id_new_nomain(ID_ME, NULL);
- DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false);
- }
- struct Mesh *new_mesh = mti->applyModifier(md, ctx, mesh);
+ struct Mesh *new_mesh = mti->applyModifier(md, ctx, mesh);
- /* Make a DM that doesn't reference new_mesh so we can free the latter. */
- DerivedMesh *ndm = CDDM_from_mesh_ex(new_mesh, CD_DUPLICATE, CD_MASK_EVERYTHING);
+ /* Make a DM that doesn't reference new_mesh so we can free the latter. */
+ DerivedMesh *ndm = CDDM_from_mesh_ex(new_mesh, CD_DUPLICATE, CD_MASK_EVERYTHING);
- if (new_mesh != mesh) {
- BKE_id_free(NULL, new_mesh);
- }
- if (mesh != NULL) {
- BKE_id_free(NULL, mesh);
- }
-
- return ndm;
+ if (new_mesh != mesh) {
+ BKE_id_free(NULL, new_mesh);
}
-}
-
-struct DerivedMesh *modifier_applyModifierEM_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct BMEditMesh *editData,
- struct DerivedMesh *dm)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- if (mti->applyModifierEM_DM) {
- return mti->applyModifierEM_DM(md, ctx, editData, dm);
+ if (mesh != NULL) {
+ BKE_id_free(NULL, mesh);
}
- else {
- /* TODO(sybren): deduplicate all the copies of this code in this file. */
- Mesh *mesh = NULL;
- if (dm != NULL) {
- mesh = BKE_id_new_nomain(ID_ME, NULL);
- DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false);
- }
- struct Mesh *new_mesh = mti->applyModifierEM(md, ctx, editData, mesh);
+ return ndm;
- /* Make a DM that doesn't reference new_mesh so we can free the latter. */
- DerivedMesh *ndm = CDDM_from_mesh_ex(new_mesh, CD_DUPLICATE, CD_MASK_EVERYTHING);
-
- if (new_mesh != mesh) {
- BKE_id_free(NULL, new_mesh);
- }
- if (mesh != NULL) {
- BKE_id_free(NULL, mesh);
- }
-
- return ndm;
- }
}
/**
@@ -1239,7 +926,7 @@ Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval, boo
/* Note: currently we have no equivalent to derived cagemesh or even final dm in BMEditMesh...
* This is TODO in core depsgraph/modifier stack code still. */
BMEditMesh *em = BKE_editmesh_from_object(ob_eval);
- me = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0});
+ me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0);
*r_free_mesh = true;
}
else {
diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c
index d63ac7df3ce..0117b36a16e 100644
--- a/source/blender/blenkernel/intern/movieclip.c
+++ b/source/blender/blenkernel/intern/movieclip.c
@@ -1162,6 +1162,7 @@ void BKE_movieclip_get_size(MovieClip *clip, MovieClipUser *user, int *width, in
* cache lookups and even unwanted non-proxied files loading when doing mask parenting,
* so let's disable this for now and assume image sequence consists of images with
* equal sizes (sergey)
+ * TODO(sergey): Support reading sequences of different resolution.
*/
if (user->framenr == clip->lastframe) {
#endif
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index f44f1265904..8f02b51fd5f 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -57,6 +57,7 @@
#include "BKE_multires.h"
#include "BKE_paint.h"
#include "BKE_scene.h"
+#include "BKE_subdiv_ccg.h"
#include "BKE_subsurf.h"
#include "BKE_editmesh.h"
@@ -296,7 +297,7 @@ DerivedMesh *get_multires_dm(struct Depsgraph *depsgraph, Scene *scene, Multires
return dm;
}
-Mesh *get_multires_mesh(
+Mesh *BKE_multires_create_mesh(
struct Depsgraph *depsgraph,
Scene *scene,
MultiresModifierData *mmd,
@@ -308,9 +309,12 @@ Mesh *get_multires_mesh(
.depsgraph = depsgraph,
.object = ob_eval,
.flag = MOD_APPLY_USECACHE | MOD_APPLY_IGNORE_SIMPLIFY};
- Mesh *result = modifier_applyModifier(&mmd->modifier, &modifier_ctx, deformed_mesh);
+
+ const ModifierTypeInfo *mti = modifierType_getInfo(mmd->modifier.type);
+ Mesh *result = mti->applyModifier(&mmd->modifier, &modifier_ctx, deformed_mesh);
+
if (result == deformed_mesh) {
- result = BKE_mesh_copy_for_eval(deformed_mesh);
+ result = BKE_mesh_copy_for_eval(deformed_mesh, true);
}
return result;
}
@@ -389,21 +393,49 @@ static void multires_dm_mark_as_modified(DerivedMesh *dm, MultiresModifiedFlags
ccgdm->multires.modified_flags |= flags;
}
+static void multires_ccg_mark_as_modified(SubdivCCG *subdiv_ccg,
+ MultiresModifiedFlags flags)
+{
+ if (flags & MULTIRES_COORDS_MODIFIED) {
+ subdiv_ccg->dirty.coords = true;
+ }
+ if (flags & MULTIRES_HIDDEN_MODIFIED) {
+ subdiv_ccg->dirty.hidden = true;
+ }
+}
+
void multires_mark_as_modified(Object *ob, MultiresModifiedFlags flags)
{
- if (ob && ob->derivedFinal)
- multires_dm_mark_as_modified(ob->derivedFinal, flags);
+ if (ob == NULL) {
+ return;
+ }
+ Mesh *mesh = ob->data;
+ SubdivCCG *subdiv_ccg = mesh->runtime.subdiv_ccg;
+ if (subdiv_ccg == NULL) {
+ return;
+ }
+ multires_ccg_mark_as_modified(subdiv_ccg, flags);
}
void multires_force_update(Object *ob)
{
- if (ob) {
- BKE_object_free_derived_caches(ob);
-
- if (ob->sculpt && ob->sculpt->pbvh) {
- BKE_pbvh_free(ob->sculpt->pbvh);
- ob->sculpt->pbvh = NULL;
+ if (ob == NULL) {
+ return;
+ }
+ SculptSession *sculpt_session = ob->sculpt;
+ if (sculpt_session != NULL && sculpt_session->pbvh != NULL) {
+ PBVH *pbvh = sculpt_session->pbvh;
+ if (BKE_pbvh_type(pbvh) == PBVH_GRIDS) {
+ Mesh *mesh = ob->data;
+ multiresModifier_reshapeFromCCG(
+ sculpt_session->multires->totlvl, mesh, sculpt_session->subdiv_ccg);
+ }
+ else {
+ /* NOTE: Disabled for until OpenSubdiv is enabled by default. */
+ // BLI_assert(!"multires_force_update is used on non-grids PBVH");
}
+ BKE_pbvh_free(pbvh);
+ ob->sculpt->pbvh = NULL;
}
}
@@ -539,7 +571,7 @@ static void multires_copy_dm_grid(CCGElem *gridA, CCGElem *gridB, CCGKey *keyA,
for (x = 0; x < keyB->grid_size; x++, j++)
memcpy(CCG_elem_offset_co(keyA, gridA, y * skip * keyA->grid_size + x * skip),
CCG_elem_offset_co(keyB, gridB, j),
- sizeof(float) * keyA->num_layers);
+ keyA->elem_size);
}
else {
skip = (keyB->grid_size - 1) / (keyA->grid_size - 1);
@@ -548,7 +580,7 @@ static void multires_copy_dm_grid(CCGElem *gridA, CCGElem *gridB, CCGKey *keyA,
for (x = 0; x < keyA->grid_size; x++, j++)
memcpy(CCG_elem_offset_co(keyA, gridA, j),
CCG_elem_offset_co(keyB, gridB, y * skip * keyB->grid_size + x * skip),
- sizeof(float) * keyA->num_layers);
+ keyA->elem_size);
}
}
@@ -1312,20 +1344,28 @@ void multires_modifier_update_hidden(DerivedMesh *dm)
void multires_stitch_grids(Object *ob)
{
- /* utility for smooth brush */
- if (ob && ob->derivedFinal) {
- CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)ob->derivedFinal;
- CCGFace **faces;
- int totface;
-
- if (ccgdm->pbvh) {
- BKE_pbvh_get_grid_updates(ccgdm->pbvh, false, (void ***)&faces, &totface);
-
- if (totface) {
- ccgSubSurf_stitchFaces(ccgdm->ss, 0, faces, totface);
- MEM_freeN(faces);
- }
- }
+ if (ob == NULL) {
+ return;
+ }
+ SculptSession *sculpt_session = ob->sculpt;
+ if (sculpt_session == NULL) {
+ return;
+ }
+ PBVH *pbvh = sculpt_session->pbvh;
+ SubdivCCG *subdiv_ccg = sculpt_session->subdiv_ccg;
+ if (pbvh == NULL || subdiv_ccg == NULL) {
+ return;
+ }
+ BLI_assert(BKE_pbvh_type(pbvh) == PBVH_GRIDS);
+ /* NOTE: Currently CCG does not keep track of faces, making it impossible
+ * to use BKE_pbvh_get_grid_updates().
+ */
+ CCGFace **faces;
+ int num_faces;
+ BKE_pbvh_get_grid_updates(pbvh, false, (void ***)&faces, &num_faces);
+ if (num_faces) {
+ BKE_subdiv_ccg_average_stitch_faces(subdiv_ccg, faces, num_faces);
+ MEM_freeN(faces);
}
}
@@ -2085,130 +2125,46 @@ static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst)
}
}
-static void multires_apply_smat_cb(
- void *__restrict userdata,
- const int pidx,
- const ParallelRangeTLS *__restrict UNUSED(tls))
+static void multires_apply_uniform_scale(Object *object, const float scale)
{
- MultiresThreadedData *tdata = userdata;
-
- CCGElem **gridData = tdata->gridData;
- CCGElem **subGridData = tdata->subGridData;
- CCGKey *dm_key = tdata->key;
- CCGKey *subdm_key = tdata->sub_key;
- MPoly *mpoly = tdata->mpoly;
- MDisps *mdisps = tdata->mdisps;
- int *gridOffset = tdata->gridOffset;
- int gridSize = tdata->gridSize;
- int dGridSize = tdata->dGridSize;
- int dSkip = tdata->dSkip;
- float (*smat)[3] = tdata->smat;
-
- const int numVerts = mpoly[pidx].totloop;
- MDisps *mdisp = &mdisps[mpoly[pidx].loopstart];
- int S, x, y, gIndex = gridOffset[pidx];
-
- for (S = 0; S < numVerts; ++S, ++gIndex, mdisp++) {
- CCGElem *grid = gridData[gIndex];
- CCGElem *subgrid = subGridData[gIndex];
- float (*dispgrid)[3] = mdisp->disps;
-
- for (y = 0; y < gridSize; y++) {
- for (x = 0; x < gridSize; x++) {
- float *co = CCG_grid_elem_co(dm_key, grid, x, y);
- float *sco = CCG_grid_elem_co(subdm_key, subgrid, x, y);
- float *data = dispgrid[dGridSize * y * dSkip + x * dSkip];
- float mat[3][3], disp[3];
-
- /* construct tangent space matrix */
- grid_tangent_matrix(mat, dm_key, x, y, grid);
-
- /* scale subgrid coord and calculate displacement */
- mul_m3_v3(smat, sco);
- sub_v3_v3v3(disp, sco, co);
-
- /* convert difference to tangent space */
- invert_m3(mat);
- mul_v3_m3v3(data, mat, disp);
- }
+ Mesh *mesh = (Mesh *)object->data;
+ MDisps *mdisps = CustomData_get_layer(&mesh->ldata, CD_MDISPS);
+ for (int i = 0; i < mesh->totloop; ++i) {
+ MDisps *grid = &mdisps[i];
+ for (int j = 0; j < grid->totdisp; ++j) {
+ mul_v3_fl(grid->disps[j], scale);
}
}
}
-static void multires_apply_smat(struct Depsgraph *depsgraph, Scene *scene, Object *ob, float smat[3][3])
+static void multires_apply_smat(
+ struct Depsgraph *UNUSED(depsgraph),
+ Scene *scene,
+ Object *object,
+ float smat[3][3])
{
- DerivedMesh *dm = NULL, *cddm = NULL, *subdm = NULL;
- CCGElem **gridData, **subGridData;
- CCGKey dm_key, subdm_key;
- Mesh *me = (Mesh *)ob->data;
- MPoly *mpoly = me->mpoly;
- /* MLoop *mloop = me->mloop; */ /* UNUSED */
- MDisps *mdisps;
- int *gridOffset;
- int i, /*numGrids, */ gridSize, dGridSize, dSkip, totvert;
- float (*vertCos)[3] = NULL;
- MultiresModifierData *mmd = get_multires_modifier(scene, ob, 1);
- MultiresModifierData high_mmd;
-
- CustomData_external_read(&me->ldata, &me->id, CD_MASK_MDISPS, me->totloop);
- mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS);
-
- if (!mdisps || !mmd || !mmd->totlvl) return;
-
- /* we need derived mesh created from highest resolution */
- high_mmd = *mmd;
- high_mmd.lvl = high_mmd.totlvl;
-
- /* unscaled multires with applied displacement */
- subdm = get_multires_dm(depsgraph, scene, &high_mmd, ob);
-
- /* prepare scaled CDDM to create ccgDN */
- cddm = mesh_get_derived_deform(depsgraph, scene, ob, CD_MASK_BAREMESH);
-
- totvert = cddm->getNumVerts(cddm);
- vertCos = MEM_malloc_arrayN(totvert, sizeof(*vertCos), "multiresScale vertCos");
- cddm->getVertCos(cddm, vertCos);
- for (i = 0; i < totvert; i++)
- mul_m3_v3(smat, vertCos[i]);
- CDDM_apply_vert_coords(cddm, vertCos);
- MEM_freeN(vertCos);
-
- /* scaled ccgDM for tangent space of object with applied scale */
- dm = subsurf_dm_create_local(scene, ob, cddm, high_mmd.totlvl, high_mmd.simple, 0, mmd->uv_smooth == SUBSURF_UV_SMOOTH_NONE, 0, false);
- cddm->release(cddm);
-
- gridSize = dm->getGridSize(dm);
- gridData = dm->getGridData(dm);
- gridOffset = dm->getGridOffset(dm);
- dm->getGridKey(dm, &dm_key);
- subGridData = subdm->getGridData(subdm);
- subdm->getGridKey(subdm, &subdm_key);
-
- dGridSize = multires_side_tot[high_mmd.totlvl];
- dSkip = (dGridSize - 1) / (gridSize - 1);
-
- ParallelRangeSettings settings;
- BLI_parallel_range_settings_defaults(&settings);
- settings.min_iter_per_thread = CCG_TASK_LIMIT;
-
- MultiresThreadedData data = {
- .gridData = gridData,
- .subGridData = subGridData,
- .key = &dm_key,
- .sub_key = &subdm_key,
- .mpoly = mpoly,
- .mdisps = mdisps,
- .gridOffset = gridOffset,
- .gridSize = gridSize,
- .dGridSize = dGridSize,
- .dSkip = dSkip,
- .smat = smat
- };
-
- BLI_task_parallel_range(0, me->totpoly, &data, multires_apply_smat_cb, &settings);
-
- dm->release(dm);
- subdm->release(subdm);
+ const MultiresModifierData *mmd = get_multires_modifier(scene, object, true);
+ if (mmd == NULL || mmd->totlvl == 0) {
+ return;
+ }
+ /* Make sure layer present. */
+ Mesh *mesh = (Mesh *)object->data;
+ CustomData_external_read(
+ &mesh->ldata, &mesh->id, CD_MASK_MDISPS, mesh->totloop);
+ if (!CustomData_get_layer(&mesh->ldata, CD_MDISPS)) {
+ return;
+ }
+ if (is_uniform_scaled_m3(smat)) {
+ const float scale = mat3_to_scale(smat);
+ multires_apply_uniform_scale(object, scale);
+ }
+ else {
+ /* TODO(sergey): This branch of code actually requires more work to
+ * preserve all the details.
+ */
+ const float scale = mat3_to_scale(smat);
+ multires_apply_uniform_scale(object, scale);
+ }
}
int multires_mdisp_corners(MDisps *s)
diff --git a/source/blender/blenkernel/intern/multires_inline.h b/source/blender/blenkernel/intern/multires_inline.h
new file mode 100644
index 00000000000..99b4695fe46
--- /dev/null
+++ b/source/blender/blenkernel/intern/multires_inline.h
@@ -0,0 +1,68 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2018 by Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Sergey Sharybin.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenkernel/intern/multires_inline.h
+ * \ingroup bke
+ */
+
+#ifndef __MULTIRES_INLINE_H__
+#define __MULTIRES_INLINE_H__
+
+#include "BKE_multires.h"
+#include "BLI_math_vector.h"
+
+BLI_INLINE void BKE_multires_construct_tangent_matrix(
+ float tangent_matrix[3][3],
+ const float dPdu[3],
+ const float dPdv[3],
+ const int corner)
+{
+ if (corner == 0) {
+ copy_v3_v3(tangent_matrix[0], dPdv);
+ copy_v3_v3(tangent_matrix[1], dPdu);
+ mul_v3_fl(tangent_matrix[0], -1.0f);
+ mul_v3_fl(tangent_matrix[1], -1.0f);
+ }
+ else if (corner == 1) {
+ copy_v3_v3(tangent_matrix[0], dPdu);
+ copy_v3_v3(tangent_matrix[1], dPdv);
+ mul_v3_fl(tangent_matrix[1], -1.0f);
+ }
+ else if (corner == 2) {
+ copy_v3_v3(tangent_matrix[0], dPdv);
+ copy_v3_v3(tangent_matrix[1], dPdu);
+ }
+ else if (corner == 3) {
+ copy_v3_v3(tangent_matrix[0], dPdu);
+ copy_v3_v3(tangent_matrix[1], dPdv);
+ mul_v3_fl(tangent_matrix[0], -1.0f);
+ }
+ cross_v3_v3v3(tangent_matrix[2], dPdu, dPdv);
+ normalize_v3(tangent_matrix[0]);
+ normalize_v3(tangent_matrix[1]);
+ normalize_v3(tangent_matrix[2]);
+}
+
+#endif /* __MULTIRES_INLINE_H__ */
diff --git a/source/blender/blenkernel/intern/multires_reshape.c b/source/blender/blenkernel/intern/multires_reshape.c
index 3fdd5de94f1..fe4bc5ca3e0 100644
--- a/source/blender/blenkernel/intern/multires_reshape.c
+++ b/source/blender/blenkernel/intern/multires_reshape.c
@@ -35,120 +35,112 @@
#include "BLI_utildefines.h"
#include "BLI_math_vector.h"
+#include "BLI_task.h"
+#include "BKE_ccg.h"
#include "BKE_library.h"
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
#include "BKE_modifier.h"
#include "BKE_multires.h"
#include "BKE_subdiv.h"
+#include "BKE_subdiv_ccg.h"
+#include "BKE_subdiv_eval.h"
+#include "BKE_subdiv_foreach.h"
+#include "BKE_subdiv_mesh.h"
#include "DEG_depsgraph_query.h"
-/* TODO(sergey): De-duplicate with subdiv_displacement_multires.c. */
-
-/* Coordinates within grid has different convention from PTex coordinates.
- * This function converts the latter ones to former.
- */
-BLI_INLINE void ptex_uv_to_grid_uv(const float ptex_u, const float ptex_v,
- float *r_grid_u, float *r_grid_v)
+static void multires_reshape_init_mmd(
+ MultiresModifierData *reshape_mmd,
+ const MultiresModifierData *mmd)
{
- *r_grid_u = 1.0f - ptex_v;
- *r_grid_v = 1.0f - ptex_u;
-}
-
-/* Simplified version of mdisp_rot_face_to_crn, only handles quad and
- * works in normalized coordinates.
- *
- * NOTE: Output coordinates are in ptex coordinates.
- */
-BLI_INLINE int rotate_quad_to_corner(const float u, const float v,
- float *r_u, float *r_v)
-{
- int corner;
- if (u <= 0.5f && v <= 0.5f) {
- corner = 0;
- *r_u = 2.0f * u;
- *r_v = 2.0f * v;
- }
- else if (u > 0.5f && v <= 0.5f) {
- corner = 1;
- *r_u = 2.0f * v;
- *r_v = 2.0f * (1.0f - u);
- }
- else if (u > 0.5f && v > 0.5f) {
- corner = 2;
- *r_u = 2.0f * (1.0f - u);
- *r_v = 2.0f * (1.0f - v);
- }
- else if (u <= 0.5f && v >= 0.5f) {
- corner = 3;
- *r_u = 2.0f * (1.0f - v);
- *r_v = 2.0f * u;
- }
- else {
- BLI_assert(!"Unexpected corner configuration");
- }
- return corner;
+ *reshape_mmd = *mmd;
}
-BLI_INLINE void construct_tangent_matrix(float tangent_matrix[3][3],
- const float dPdu[3],
- const float dPdv[3],
- const int corner)
+static void multires_reshape_init_mmd_top_level(
+ MultiresModifierData *reshape_mmd,
+ const MultiresModifierData *mmd)
{
- if (corner == 0) {
- copy_v3_v3(tangent_matrix[0], dPdv);
- copy_v3_v3(tangent_matrix[1], dPdu);
- mul_v3_fl(tangent_matrix[0], -1.0f);
- mul_v3_fl(tangent_matrix[1], -1.0f);
- }
- else if (corner == 1) {
- copy_v3_v3(tangent_matrix[0], dPdu);
- copy_v3_v3(tangent_matrix[1], dPdv);
- mul_v3_fl(tangent_matrix[1], -1.0f);
- }
- else if (corner == 2) {
- copy_v3_v3(tangent_matrix[0], dPdv);
- copy_v3_v3(tangent_matrix[1], dPdu);
- }
- else if (corner == 3) {
- copy_v3_v3(tangent_matrix[0], dPdu);
- copy_v3_v3(tangent_matrix[1], dPdv);
- mul_v3_fl(tangent_matrix[0], -1.0f);
- }
- cross_v3_v3v3(tangent_matrix[2], dPdu, dPdv);
- normalize_v3(tangent_matrix[0]);
- normalize_v3(tangent_matrix[1]);
- normalize_v3(tangent_matrix[2]);
+ *reshape_mmd = *mmd;
+ reshape_mmd->lvl = reshape_mmd->totlvl;
}
/* =============================================================================
- * Reshape internal functionality..
+ * General reshape implementation, reused by all particular cases.
*/
typedef struct MultiresReshapeContext {
Subdiv *subdiv;
- Object *object;
const Mesh *coarse_mesh;
MDisps *mdisps;
- const float (*deformed_verts)[3];
- int num_deformed_verts;
- int grid_size;
+ GridPaintMask *grid_paint_mask;
+ int top_grid_size;
+ int top_level;
} MultiresReshapeContext;
-static bool multires_reshape_topology_info(
- const SubdivForeachContext *foreach_context,
- const int num_vertices,
- const int UNUSED(num_edges),
- const int UNUSED(num_loops),
- const int UNUSED(num_polygons))
+static void multires_reshape_allocate_displacement_grid(
+ MDisps *displacement_grid, const int level)
{
- MultiresReshapeContext *ctx = foreach_context->user_data;
- if (num_vertices != ctx->num_deformed_verts) {
- return false;
+ const int grid_size = BKE_subdiv_grid_size_from_level(level);
+ const int grid_area = grid_size * grid_size;
+ float (*disps)[3] = MEM_calloc_arrayN(
+ grid_area, 3 * sizeof(float), "multires disps");
+ displacement_grid->disps = disps;
+ displacement_grid->totdisp = grid_area;
+ displacement_grid->level = level;
+}
+
+static void multires_reshape_ensure_displacement_grid(
+ MDisps *displacement_grid, const int level)
+{
+ if (displacement_grid->disps != NULL) {
+ return;
}
- return true;
+ multires_reshape_allocate_displacement_grid(
+ displacement_grid, level);
+}
+
+static void multires_reshape_ensure_displacement_grids(
+ Mesh *mesh,
+ const int grid_level)
+{
+ const int num_grids = mesh->totloop;
+ MDisps *mdisps = CustomData_get_layer(&mesh->ldata, CD_MDISPS);
+ for (int grid_index = 0; grid_index < num_grids; grid_index++) {
+ multires_reshape_ensure_displacement_grid(
+ &mdisps[grid_index], grid_level);
+ }
+}
+
+static void multires_reshape_ensure_mask_grids(Mesh *mesh, const int grid_level)
+{
+ GridPaintMask *grid_paint_masks =
+ CustomData_get_layer(&mesh->ldata, CD_GRID_PAINT_MASK);
+ if (grid_paint_masks == NULL) {
+ return;
+ }
+ const int num_grids = mesh->totloop;
+ const int grid_size = BKE_subdiv_grid_size_from_level(grid_level);
+ const int grid_area = grid_size * grid_size;
+ for (int grid_index = 0; grid_index < num_grids; grid_index++) {
+ GridPaintMask *grid_paint_mask = &grid_paint_masks[grid_index];
+ if (grid_paint_mask->level == grid_level) {
+ continue;
+ }
+ grid_paint_mask->level = grid_level;
+ if (grid_paint_mask->data) {
+ MEM_freeN(grid_paint_mask->data);
+ }
+ grid_paint_mask->data = MEM_calloc_arrayN(
+ grid_area, sizeof(float), "gpm.data");
+ }
+}
+
+static void multires_reshape_ensure_grids(Mesh *mesh, const int grid_level)
+{
+ multires_reshape_ensure_displacement_grids(mesh, grid_level);
+ multires_reshape_ensure_mask_grids(mesh, grid_level);
}
static void multires_reshape_vertex_copy_to_next(
@@ -156,21 +148,30 @@ static void multires_reshape_vertex_copy_to_next(
const MPoly *coarse_poly,
const int current_corner,
const MDisps *current_displacement_grid,
+ const GridPaintMask *current_mask_grid,
const int current_grid_x, const int current_grid_y)
{
- const int grid_size = ctx->grid_size;
+ const int grid_size = ctx->top_grid_size;
const int next_current_corner = (current_corner + 1) % coarse_poly->totloop;
- MDisps *next_displacement_grid = &ctx->mdisps[
- coarse_poly->loopstart + next_current_corner];
const int next_grid_x = 0;
const int next_grid_y = current_grid_x;
const int current_index = current_grid_y * grid_size + current_grid_x;
const int next_index = next_grid_y * grid_size + next_grid_x;
+ /* Copy displacement. */
+ MDisps *next_displacement_grid = &ctx->mdisps[
+ coarse_poly->loopstart + next_current_corner];
float *next_displacement = next_displacement_grid->disps[next_index];
copy_v3_v3(next_displacement,
current_displacement_grid->disps[current_index]);
SWAP(float, next_displacement[0], next_displacement[1]);
next_displacement[0] = -next_displacement[0];
+ /* Copy mask, if exists. */
+ if (current_mask_grid != NULL) {
+ GridPaintMask *next_mask_grid = &ctx->grid_paint_mask[
+ coarse_poly->loopstart + next_current_corner];
+ next_mask_grid->data[next_index] =
+ current_mask_grid->data[current_index];
+ }
}
static void multires_reshape_vertex_copy_to_prev(
@@ -178,22 +179,31 @@ static void multires_reshape_vertex_copy_to_prev(
const MPoly *coarse_poly,
const int current_corner,
const MDisps *current_displacement_grid,
+ const GridPaintMask *current_mask_grid,
const int current_grid_x, const int current_grid_y)
{
- const int grid_size = ctx->grid_size;
+ const int grid_size = ctx->top_grid_size;
const int prev_current_corner =
(current_corner - 1 + coarse_poly->totloop) % coarse_poly->totloop;
- MDisps *prev_displacement_grid = &ctx->mdisps[
- coarse_poly->loopstart + prev_current_corner];
const int prev_grid_x = current_grid_y;
const int prev_grid_y = 0;
const int current_index = current_grid_y * grid_size + current_grid_x;
const int prev_index = prev_grid_y * grid_size + prev_grid_x;
+ /* Copy displacement. */
+ MDisps *prev_displacement_grid = &ctx->mdisps[
+ coarse_poly->loopstart + prev_current_corner];
float *prev_displacement = prev_displacement_grid->disps[prev_index];
copy_v3_v3(prev_displacement,
current_displacement_grid->disps[current_index]);
SWAP(float, prev_displacement[0], prev_displacement[1]);
prev_displacement[1] = -prev_displacement[1];
+ /* Copy mask, if exists. */
+ if (current_mask_grid != NULL) {
+ GridPaintMask *prev_mask_grid = &ctx->grid_paint_mask[
+ coarse_poly->loopstart + prev_current_corner];
+ prev_mask_grid->data[prev_index] =
+ current_mask_grid->data[current_index];
+ }
}
static void copy_boundary_displacement(
@@ -201,19 +211,24 @@ static void copy_boundary_displacement(
const MPoly *coarse_poly,
const int corner,
const int grid_x, const int grid_y,
- const MDisps *displacement_grid)
+ const MDisps *displacement_grid,
+ const GridPaintMask *mask_grid)
{
if (grid_x == 0 && grid_y == 0) {
for (int i = 0; i < coarse_poly->totloop; i++) {
const int current_face_corner =
(corner + i) % coarse_poly->totloop;
- MDisps *current_displacement_grid = &ctx->mdisps[
- coarse_poly->loopstart + current_face_corner];
+ const int grid_index = coarse_poly->loopstart + current_face_corner;
+ MDisps *current_displacement_grid = &ctx->mdisps[grid_index];
+ GridPaintMask *current_mask_grid =
+ mask_grid != NULL ? &ctx->grid_paint_mask[grid_index]
+ : NULL;
multires_reshape_vertex_copy_to_next(
ctx,
coarse_poly,
current_face_corner,
current_displacement_grid,
+ current_mask_grid,
0, 0);
}
}
@@ -223,6 +238,7 @@ static void copy_boundary_displacement(
coarse_poly,
corner,
displacement_grid,
+ mask_grid,
grid_x, grid_y);
}
else if (grid_y == 0) {
@@ -231,20 +247,21 @@ static void copy_boundary_displacement(
coarse_poly,
corner,
displacement_grid,
+ mask_grid,
grid_x, grid_y);
}
}
-static void multires_reshape_vertex(
+static void multires_reshape_vertex_from_final_data(
MultiresReshapeContext *ctx,
const int ptex_face_index,
const float u, const float v,
const int coarse_poly_index,
const int coarse_corner,
- const int subdiv_vertex_index)
+ const float final_P[3], const float final_mask)
{
Subdiv *subdiv = ctx->subdiv;
- const int grid_size = ctx->grid_size;
+ const int grid_size = ctx->top_grid_size;
const Mesh *coarse_mesh = ctx->coarse_mesh;
const MPoly *coarse_mpoly = coarse_mesh->mpoly;
const MPoly *coarse_poly = &coarse_mpoly[coarse_poly_index];
@@ -253,28 +270,37 @@ static void multires_reshape_vertex(
float P[3], dPdu[3], dPdv[3];
BKE_subdiv_eval_limit_point_and_derivatives(
subdiv, ptex_face_index, u, v, P, dPdu, dPdv);
- /* Get coordinate and corner configuration.. */
+ /* Get coordinate and corner configuration. */
float grid_u, grid_v;
MDisps *displacement_grid;
+ GridPaintMask *grid_paint_mask = NULL;
int face_corner = coarse_corner;
int grid_corner = 0;
+ int grid_index;
if (coarse_poly->totloop == 4) {
float corner_u, corner_v;
- face_corner = rotate_quad_to_corner(u, v, &corner_u, &corner_v);
+ face_corner = BKE_subdiv_rotate_quad_to_corner(
+ u, v, &corner_u, &corner_v);
grid_corner = face_corner;
- displacement_grid = &ctx->mdisps[loop_index + face_corner];
- ptex_uv_to_grid_uv(corner_u, corner_v, &grid_u, &grid_v);
+ grid_index = loop_index + face_corner;
+ BKE_subdiv_ptex_face_uv_to_grid_uv(
+ corner_u, corner_v, &grid_u, &grid_v);
}
else {
- displacement_grid = &ctx->mdisps[loop_index];
- ptex_uv_to_grid_uv(u, v, &grid_u, &grid_v);
+ grid_index = loop_index;
+ BKE_subdiv_ptex_face_uv_to_grid_uv(u, v, &grid_u, &grid_v);
+ }
+ displacement_grid = &ctx->mdisps[grid_index];
+ if (ctx->grid_paint_mask != NULL) {
+ grid_paint_mask = &ctx->grid_paint_mask[grid_index];
+ BLI_assert(grid_paint_mask->level == displacement_grid->level);
}
/* Convert object coordinate to a tangent space of displacement grid. */
- const float *final_P = ctx->deformed_verts[subdiv_vertex_index];
float D[3];
sub_v3_v3v3(D, final_P, P);
float tangent_matrix[3][3];
- construct_tangent_matrix(tangent_matrix, dPdu, dPdv, grid_corner);
+ BKE_multires_construct_tangent_matrix(
+ tangent_matrix, dPdu, dPdv, grid_corner);
float inv_tangent_matrix[3][3];
invert_m3_m3(inv_tangent_matrix, tangent_matrix);
float tangent_D[3];
@@ -284,9 +310,483 @@ static void multires_reshape_vertex(
const int grid_y = (grid_v * (grid_size - 1) + 0.5f);
const int index = grid_y * grid_size + grid_x;
copy_v3_v3(displacement_grid->disps[index], tangent_D);
+ /* Write mask grid. */
+ if (grid_paint_mask != NULL) {
+ grid_paint_mask->data[index] = final_mask;
+ }
/* Copy boundary to the next/previous grids */
copy_boundary_displacement(
- ctx, coarse_poly, face_corner, grid_x, grid_y, displacement_grid);
+ ctx, coarse_poly, face_corner, grid_x, grid_y,
+ displacement_grid, grid_paint_mask);
+}
+
+/* =============================================================================
+ * Helpers to propagate displacement to higher levels.
+ */
+
+typedef struct MultiresPropagateData {
+ /* Number of displacement grids. */
+ int num_grids;
+ /* Resolution level up to which displacement is known. */
+ int reshape_level;
+ /* Resolution up to which propagation is happening, affecting all the
+ * levels in [reshape_level + 1, top_level].
+ */
+ int top_level;
+ /* Grid sizes at the corresponding levels. */
+ int reshape_grid_size;
+ int top_grid_size;
+ /* Keys to access CCG at different levels. */
+ CCGKey reshape_level_key;
+ CCGKey top_level_key;
+ /* Original grid data, before any updates for reshape.
+ * Contains data at the reshape_level resolution level.
+ */
+ CCGElem **orig_grids_data;
+ /* Custom data layers from a coarse mesh. */
+ MDisps *mdisps;
+ GridPaintMask *grid_paint_mask;
+} MultiresPropagateData;
+
+static CCGElem **allocate_grids(CCGKey *key, int num_grids)
+{
+ CCGElem **grids = MEM_calloc_arrayN(
+ num_grids, sizeof(CCGElem *), "reshape grids*");
+ for (int grid_index = 0; grid_index < num_grids; grid_index++) {
+ grids[grid_index] = MEM_calloc_arrayN(
+ key->elem_size,
+ key->grid_area,
+ "reshape orig_grids_data elems");
+ }
+ return grids;
+}
+
+static void free_grids(CCGElem **grids, int num_grids)
+{
+ if (grids == NULL) {
+ return;
+ }
+ for (int grid_index = 0; grid_index < num_grids; grid_index++) {
+ MEM_freeN(grids[grid_index]);
+ }
+ MEM_freeN(grids);
+}
+
+/* Initialize element sizes and offsets. */
+static void multires_reshape_init_key_layers(
+ CCGKey *key,
+ const MultiresPropagateData *data)
+{
+ key->elem_size = 3 * sizeof(float);
+ if (data->grid_paint_mask != NULL) {
+ key->mask_offset = 3 * sizeof(float);
+ key->elem_size += sizeof(float);
+ key->has_mask = true;
+ }
+ else {
+ key->mask_offset = -1;
+ key->has_mask = false;
+ }
+ /* We never have normals in original grids. */
+ key->normal_offset = -1;
+ key->has_normals = false;
+}
+
+/* Initialize key used to access reshape grids at given level. */
+static void multires_reshape_init_level_key(
+ CCGKey *key,
+ const MultiresPropagateData *data,
+ const int level)
+{
+ key->level = level;
+ /* Init layers. */
+ multires_reshape_init_key_layers(key, data);
+ /* By default, only 3 floats for coordinate, */
+ key->grid_size = BKE_subdiv_grid_size_from_level(key->level);
+ key->grid_area = key->grid_size * key->grid_size;
+ key->grid_bytes = key->elem_size * key->grid_area;
+}
+
+static void multires_reshape_store_original_grids(
+ MultiresPropagateData *data)
+{
+ const int num_grids = data->num_grids;
+ /* Original data to be backed up. */
+ const MDisps *mdisps = data->mdisps;
+ const GridPaintMask *grid_paint_mask = data->grid_paint_mask;
+ /* Allocate grids for backup. */
+ CCGKey *orig_key = &data->reshape_level_key;
+ CCGElem **orig_grids_data = allocate_grids(orig_key, num_grids);
+ /* Fill in grids. */
+ const int orig_grid_size = data->reshape_grid_size;
+ const int top_grid_size = data->top_grid_size;
+ const int skip = (top_grid_size - 1) / (orig_grid_size - 1);
+ for (int grid_index = 0; grid_index < num_grids; grid_index++) {
+ CCGElem *orig_grid = orig_grids_data[grid_index];
+ for (int y = 0; y < orig_grid_size; y++) {
+ const int top_y = y * skip;
+ for (int x = 0; x < orig_grid_size; x++) {
+ const int top_x = x * skip;
+ const int top_index = top_y * top_grid_size + top_x;
+ memcpy(CCG_grid_elem_co(orig_key, orig_grid, x, y),
+ mdisps[grid_index].disps[top_index],
+ sizeof(float) * 3);
+ if (orig_key->has_mask) {
+ *CCG_grid_elem_mask(orig_key, orig_grid, x, y) =
+ grid_paint_mask[grid_index].data[top_index];
+ }
+ }
+ }
+ }
+ /* Store in the context. */
+ data->orig_grids_data = orig_grids_data;
+}
+
+static void multires_reshape_propagate_prepare(
+ MultiresPropagateData *data,
+ Mesh *coarse_mesh,
+ const int reshape_level,
+ const int top_level)
+{
+ BLI_assert(reshape_level <= top_level);
+ memset(data, 0, sizeof(*data));
+ data->num_grids = coarse_mesh->totloop;
+ data->reshape_level = reshape_level;
+ data->top_level = top_level;
+ if (reshape_level == top_level) {
+ /* Nothing to do, reshape will happen on the whole grid content. */
+ return;
+ }
+ data->mdisps = CustomData_get_layer(&coarse_mesh->ldata, CD_MDISPS);
+ data->grid_paint_mask =
+ CustomData_get_layer(&coarse_mesh->ldata, CD_GRID_PAINT_MASK);
+ data->top_grid_size = BKE_subdiv_grid_size_from_level(top_level);
+ data->reshape_grid_size = BKE_subdiv_grid_size_from_level(reshape_level);
+ /* Initialize keys to access CCG at different levels. */
+ multires_reshape_init_level_key(
+ &data->reshape_level_key, data, data->reshape_level);
+ multires_reshape_init_level_key(
+ &data->top_level_key, data, data->top_level);
+ /* Make a copy of grids before reshaping, so we can calculate deltas
+ * later on.
+ */
+ multires_reshape_store_original_grids(data);
+}
+
+static void multires_reshape_propagate_prepare_from_mmd(
+ MultiresPropagateData *data,
+ struct Depsgraph *depsgraph,
+ Object *object,
+ const MultiresModifierData *mmd,
+ const int top_level,
+ const bool use_render_params)
+{
+ /* TODO(sergey): Find mode reliable way of getting current level. */
+ Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
+ Mesh *mesh = object->data;
+ const int level = multires_get_level(
+ scene_eval, object, mmd, use_render_params, true);
+ multires_reshape_propagate_prepare(data, mesh, level, top_level);
+}
+
+/* Calculate delta of changed reshape level data layers. Delta goes to a
+ * grids at top level (meaning, the result grids are only partially filled
+ * in).
+ */
+static void multires_reshape_calculate_delta(
+ MultiresPropagateData *data,
+ CCGElem **delta_grids_data)
+{
+ const int num_grids = data->num_grids;
+ /* At this point those custom data layers has updated data for the
+ * level we are propagating from.
+ */
+ const MDisps *mdisps = data->mdisps;
+ const GridPaintMask *grid_paint_mask = data->grid_paint_mask;
+ CCGKey *reshape_key = &data->reshape_level_key;
+ CCGKey *delta_level_key = &data->top_level_key;
+ /* Calculate delta. */
+ const int top_grid_size = data->top_grid_size;
+ const int reshape_grid_size = data->reshape_grid_size;
+ const int delta_grid_size = data->top_grid_size;
+ const int skip = (top_grid_size - 1) / (reshape_grid_size - 1);
+ for (int grid_index = 0; grid_index < num_grids; grid_index++) {
+ /*const*/ CCGElem *orig_grid = data->orig_grids_data[grid_index];
+ CCGElem *delta_grid = delta_grids_data[grid_index];
+ for (int y = 0; y < reshape_grid_size; y++) {
+ const int top_y = y * skip;
+ for (int x = 0; x < reshape_grid_size; x++) {
+ const int top_x = x * skip;
+ const int top_index = top_y * delta_grid_size + top_x;
+ sub_v3_v3v3(
+ CCG_grid_elem_co(
+ delta_level_key, delta_grid, top_x, top_y),
+ mdisps[grid_index].disps[top_index],
+ CCG_grid_elem_co(reshape_key, orig_grid, x, y));
+ if (delta_level_key->has_mask) {
+ const float old_mask_value = *CCG_grid_elem_mask(
+ reshape_key, orig_grid, x, y);
+ const float new_mask_value =
+ grid_paint_mask[grid_index].data[top_index];
+ *CCG_grid_elem_mask(
+ delta_level_key, delta_grid, top_x, top_y) =
+ new_mask_value - old_mask_value;
+ }
+ }
+ }
+ }
+}
+
+/* Makes it so delta is propagated onto all the higher levels, but is also
+ * that this delta is smoothed in a way that it does not cause artifacts on
+ * boundaries.
+ */
+
+typedef struct MultiresPropagateCornerData {
+ float coord_delta[3];
+ float mask_delta;
+} MultiresPropagateCornerData;
+
+BLI_INLINE void multires_reshape_propagate_init_patch_corners(
+ MultiresPropagateData *data,
+ CCGElem *delta_grid,
+ const int patch_x, const int patch_y,
+ MultiresPropagateCornerData r_corners[4])
+{
+ CCGKey *delta_level_key = &data->top_level_key;
+ const int orig_grid_size = data->reshape_grid_size;
+ const int top_grid_size = data->top_grid_size;
+ const int skip = (top_grid_size - 1) / (orig_grid_size - 1);
+ const int x = patch_x * skip;
+ const int y = patch_y * skip;
+ /* Store coordinate deltas. */
+ copy_v3_v3(r_corners[0].coord_delta,
+ CCG_grid_elem_co(delta_level_key, delta_grid, x, y));
+ copy_v3_v3(r_corners[1].coord_delta,
+ CCG_grid_elem_co(delta_level_key, delta_grid, x + skip, y));
+ copy_v3_v3(r_corners[2].coord_delta,
+ CCG_grid_elem_co(delta_level_key, delta_grid, x, y + skip));
+ copy_v3_v3(r_corners[3].coord_delta,
+ CCG_grid_elem_co(delta_level_key, delta_grid,
+ x + skip, y + skip));
+ if (delta_level_key->has_mask) {
+ r_corners[0].mask_delta =
+ *CCG_grid_elem_mask(delta_level_key, delta_grid, x, y);
+ r_corners[1].mask_delta =
+ *CCG_grid_elem_mask(delta_level_key, delta_grid,
+ x + skip, y);
+ r_corners[2].mask_delta =
+ *CCG_grid_elem_mask(delta_level_key, delta_grid,
+ x, y + skip);
+ r_corners[3].mask_delta =
+ *CCG_grid_elem_mask(delta_level_key, delta_grid,
+ x + skip, y + skip);
+ }
+}
+
+BLI_INLINE void multires_reshape_propagate_interpolate_coord(
+ float delta[3],
+ const MultiresPropagateCornerData corners[4],
+ const float weights[4])
+{
+ interp_v3_v3v3v3v3(
+ delta,
+ corners[0].coord_delta, corners[1].coord_delta,
+ corners[2].coord_delta, corners[3].coord_delta,
+ weights);
+}
+
+BLI_INLINE float multires_reshape_propagate_interpolate_mask(
+ const MultiresPropagateCornerData corners[4],
+ const float weights[4])
+{
+ return corners[0].mask_delta * weights[0] +
+ corners[1].mask_delta * weights[1] +
+ corners[2].mask_delta * weights[2] +
+ corners[3].mask_delta * weights[3];
+}
+
+BLI_INLINE void multires_reshape_propagate_and_smooth_delta_grid_patch(
+ MultiresPropagateData *data,
+ CCGElem *delta_grid,
+ const int patch_x, const int patch_y)
+{
+ CCGKey *delta_level_key = &data->top_level_key;
+ const int orig_grid_size = data->reshape_grid_size;
+ const int top_grid_size = data->top_grid_size;
+ const int skip = (top_grid_size - 1) / (orig_grid_size - 1);
+ const float skip_inv = 1.0f / (float)skip;
+ MultiresPropagateCornerData corners[4];
+ multires_reshape_propagate_init_patch_corners(
+ data, delta_grid, patch_x, patch_y, corners);
+ const int start_x = patch_x * skip;
+ const int start_y = patch_y * skip;
+ for (int y = 0; y <= skip; y++) {
+ const float v = (float)y * skip_inv;
+ const int final_y = start_y + y;
+ for (int x = 0; x <= skip; x++) {
+ const float u = (float)x * skip_inv;
+ const int final_x = start_x + x;
+ const float linear_weights[4] = {(1.0f - u) * (1.0f - v),
+ u * (1.0f - v),
+ (1.0f - u) * v,
+ u * v};
+ multires_reshape_propagate_interpolate_coord(
+ CCG_grid_elem_co(delta_level_key, delta_grid,
+ final_x, final_y),
+ corners,
+ linear_weights);
+ if (delta_level_key->has_mask) {
+ float *mask = CCG_grid_elem_mask(delta_level_key, delta_grid,
+ final_x, final_y);
+ *mask = multires_reshape_propagate_interpolate_mask(
+ corners, linear_weights);
+ }
+ }
+ }
+}
+
+BLI_INLINE void multires_reshape_propagate_and_smooth_delta_grid(
+ MultiresPropagateData *data,
+ CCGElem *delta_grid)
+{
+ const int orig_grid_size = data->reshape_grid_size;
+ for (int patch_y = 0; patch_y < orig_grid_size - 1; patch_y++) {
+ for (int patch_x = 0; patch_x < orig_grid_size - 1; patch_x++) {
+ multires_reshape_propagate_and_smooth_delta_grid_patch(
+ data, delta_grid, patch_x, patch_y);
+ }
+ }
+}
+
+/* Entry point to propagate+smooth. */
+static void multires_reshape_propagate_and_smooth_delta(
+ MultiresPropagateData *data,
+ CCGElem **delta_grids_data)
+{
+ const int num_grids = data->num_grids;
+ for (int grid_index = 0; grid_index < num_grids; grid_index++) {
+ CCGElem *delta_grid = delta_grids_data[grid_index];
+ multires_reshape_propagate_and_smooth_delta_grid(data, delta_grid);
+ }
+}
+
+/* Apply smoothed deltas on the actual data layers. */
+static void multires_reshape_propagate_apply_delta(
+ MultiresPropagateData *data,
+ CCGElem **delta_grids_data)
+{
+ const int num_grids = data->num_grids;
+ /* At this point those custom data layers has updated data for the
+ * level we are propagating from.
+ */
+ MDisps *mdisps = data->mdisps;
+ GridPaintMask *grid_paint_mask = data->grid_paint_mask;
+ CCGKey *orig_key = &data->reshape_level_key;
+ CCGKey *delta_level_key = &data->top_level_key;
+ CCGElem **orig_grids_data = data->orig_grids_data;
+ const int orig_grid_size = data->reshape_grid_size;
+ const int top_grid_size = data->top_grid_size;
+ const int skip = (top_grid_size - 1) / (orig_grid_size - 1);
+ /* Restore grid values at the reshape level. Those values are to be changed
+ * to the accommodate for the smooth delta.
+ */
+ for (int grid_index = 0; grid_index < num_grids; grid_index++) {
+ CCGElem *orig_grid = orig_grids_data[grid_index];
+ for (int y = 0; y < orig_grid_size; y++) {
+ const int top_y = y * skip;
+ for (int x = 0; x < orig_grid_size; x++) {
+ const int top_x = x * skip;
+ const int top_index = top_y * top_grid_size + top_x;
+ copy_v3_v3(mdisps[grid_index].disps[top_index],
+ CCG_grid_elem_co(orig_key, orig_grid, x, y));
+ if (grid_paint_mask != NULL) {
+ grid_paint_mask[grid_index].data[top_index] =
+ *CCG_grid_elem_mask(orig_key, orig_grid, x, y);
+ }
+ }
+ }
+ }
+ /* Add smoothed delta to all the levels. */
+ for (int grid_index = 0; grid_index < num_grids; grid_index++) {
+ CCGElem *delta_grid = delta_grids_data[grid_index];
+ for (int y = 0; y < top_grid_size; y++) {
+ for (int x = 0; x < top_grid_size; x++) {
+ const int top_index = y * top_grid_size + x;
+ add_v3_v3(mdisps[grid_index].disps[top_index],
+ CCG_grid_elem_co(delta_level_key, delta_grid, x, y));
+ if (delta_level_key->has_mask) {
+ grid_paint_mask[grid_index].data[top_index] +=
+ *CCG_grid_elem_mask(
+ delta_level_key, delta_grid, x, y);
+ }
+ }
+ }
+ }
+}
+
+static void multires_reshape_propagate(MultiresPropagateData *data)
+{
+ if (data->reshape_level == data->top_level) {
+ return;
+ }
+ const int num_grids = data->num_grids;
+ /* Calculate delta made at the reshape level. */
+ CCGKey *delta_level_key = &data->top_level_key;
+ CCGElem **delta_grids_data = allocate_grids(delta_level_key, num_grids);
+ multires_reshape_calculate_delta(data, delta_grids_data);
+ /* Propagate deltas to the higher levels. */
+ multires_reshape_propagate_and_smooth_delta(data, delta_grids_data);
+ /* Finally, apply smoothed deltas. */
+ multires_reshape_propagate_apply_delta(data, delta_grids_data);
+ /* Cleanup. */
+ free_grids(delta_grids_data, num_grids);
+}
+
+static void multires_reshape_propagate_free(MultiresPropagateData *data)
+{
+ free_grids(data->orig_grids_data, data->num_grids);
+}
+
+/* =============================================================================
+ * Reshape from deformed vertex coordinates.
+ */
+
+typedef struct MultiresReshapeFromDeformedVertsContext {
+ MultiresReshapeContext reshape_ctx;
+ const float (*deformed_verts)[3];
+ int num_deformed_verts;
+} MultiresReshapeFromDeformedVertsContext;
+
+static bool multires_reshape_topology_info(
+ const SubdivForeachContext *foreach_context,
+ const int num_vertices,
+ const int UNUSED(num_edges),
+ const int UNUSED(num_loops),
+ const int UNUSED(num_polygons))
+{
+ MultiresReshapeFromDeformedVertsContext *ctx = foreach_context->user_data;
+ if (num_vertices != ctx->num_deformed_verts) {
+ return false;
+ }
+ return true;
+}
+
+static void multires_reshape_vertex(
+ MultiresReshapeFromDeformedVertsContext *ctx,
+ const int ptex_face_index,
+ const float u, const float v,
+ const int coarse_poly_index,
+ const int coarse_corner,
+ const int subdiv_vertex_index)
+{
+ const float *final_P = ctx->deformed_verts[subdiv_vertex_index];
+ multires_reshape_vertex_from_final_data(
+ &ctx->reshape_ctx,
+ ptex_face_index, u, v,
+ coarse_poly_index,
+ coarse_corner,
+ final_P, 0.0f);
}
static void multires_reshape_vertex_inner(
@@ -298,7 +798,7 @@ static void multires_reshape_vertex_inner(
const int coarse_corner,
const int subdiv_vertex_index)
{
- MultiresReshapeContext *ctx = foreach_context->user_data;
+ MultiresReshapeFromDeformedVertsContext *ctx = foreach_context->user_data;
multires_reshape_vertex(
ctx,
ptex_face_index, u, v,
@@ -317,7 +817,7 @@ static void multires_reshape_vertex_every_corner(
const int coarse_corner,
const int subdiv_vertex_index)
{
- MultiresReshapeContext *ctx = foreach_context->user_data;
+ MultiresReshapeFromDeformedVertsContext *ctx = foreach_context->user_data;
multires_reshape_vertex(
ctx,
ptex_face_index, u, v,
@@ -336,7 +836,7 @@ static void multires_reshape_vertex_every_edge(
const int coarse_corner,
const int subdiv_vertex_index)
{
- MultiresReshapeContext *ctx = foreach_context->user_data;
+ MultiresReshapeFromDeformedVertsContext *ctx = foreach_context->user_data;
multires_reshape_vertex(
ctx,
ptex_face_index, u, v,
@@ -345,9 +845,10 @@ static void multires_reshape_vertex_every_edge(
subdiv_vertex_index);
}
-static Subdiv *multires_subdiv_for_reshape(struct Depsgraph *depsgraph,
- /*const*/ Object *object,
- const MultiresModifierData *mmd)
+static Subdiv *multires_create_subdiv_for_reshape(
+ struct Depsgraph *depsgraph,
+ /*const*/ Object *object,
+ const MultiresModifierData *mmd)
{
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
Object *object_eval = DEG_get_evaluated_object(depsgraph, object);
@@ -373,58 +874,65 @@ static bool multires_reshape_from_vertcos(
{
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
Mesh *coarse_mesh = object->data;
- MultiresReshapeContext ctx = {
- .object = object,
- .coarse_mesh = coarse_mesh,
+ MDisps *mdisps = CustomData_get_layer(&coarse_mesh->ldata, CD_MDISPS);
+ /* Make sure displacement grids are ready. */
+ multires_reshape_ensure_grids(coarse_mesh, mmd->totlvl);
+ /* Pick maximum between multires level and dispalcement level.
+ * This is because mesh can be used by objects with multires at different
+ * levels.
+ *
+ * TODO(sergey): At this point it should be possible to always use
+ * mdisps->level.
+ */
+ const int top_level = max_ii(mmd->totlvl, mdisps->level);
+ /* Construct context. */
+ MultiresReshapeFromDeformedVertsContext reshape_deformed_verts_ctx = {
+ .reshape_ctx = {
+ .coarse_mesh = coarse_mesh,
+ .mdisps = mdisps,
+ .grid_paint_mask = NULL,
+ .top_grid_size = BKE_subdiv_grid_size_from_level(top_level),
+ .top_level = top_level,
+ },
.deformed_verts = deformed_verts,
- .mdisps = CustomData_get_layer(&coarse_mesh->ldata, CD_MDISPS),
.num_deformed_verts = num_deformed_verts,
- .grid_size = (1 << (mmd->totlvl - 1)) + 1,
};
SubdivForeachContext foreach_context = {
.topology_info = multires_reshape_topology_info,
.vertex_inner = multires_reshape_vertex_inner,
.vertex_every_edge = multires_reshape_vertex_every_edge,
.vertex_every_corner = multires_reshape_vertex_every_corner,
- .user_data = &ctx,
+ .user_data = &reshape_deformed_verts_ctx,
};
/* Initialize subdivision surface. */
- ctx.subdiv = multires_subdiv_for_reshape(depsgraph, object, mmd);
- if (ctx.subdiv == NULL) {
+ Subdiv *subdiv = multires_create_subdiv_for_reshape(depsgraph, object, mmd);
+ if (subdiv == NULL) {
return false;
}
+ reshape_deformed_verts_ctx.reshape_ctx.subdiv = subdiv;
/* Initialize mesh rasterization settings. */
SubdivToMeshSettings mesh_settings;
BKE_multires_subdiv_mesh_settings_init(
&mesh_settings, scene_eval, object, mmd, use_render_params, true);
+ /* Initialize propagation to higher levels. */
+ MultiresPropagateData propagate_data;
+ multires_reshape_propagate_prepare_from_mmd(
+ &propagate_data, depsgraph, object, mmd, top_level, use_render_params);
/* Run all the callbacks. */
BKE_subdiv_foreach_subdiv_geometry(
- ctx.subdiv,
+ subdiv,
&foreach_context,
&mesh_settings,
coarse_mesh);
- BKE_subdiv_free(ctx.subdiv);
+ BKE_subdiv_free(subdiv);
+ /* Update higher levels if needed. */
+ multires_reshape_propagate(&propagate_data);
+ multires_reshape_propagate_free(&propagate_data);
return true;
}
-static void multires_reshape_init_mmd(MultiresModifierData *reshape_mmd,
- const MultiresModifierData *mmd)
-{
- /* It is possible that the current subdivision level of multires is lower
- * that it's maximum possible one (i.e., viewport is set to a lower level
- * for the performance purposes). But even then, we want all the multires
- * levels to be reshaped. Most accurate way to do so is to ignore all
- * simplifications and calculate deformation modifier for the highest
- * possible multires level.
- * Alternative would be propagate displacement from current level to a
- * higher ones, but that is likely to cause artifacts.
- */
- *reshape_mmd = *mmd;
- reshape_mmd->lvl = reshape_mmd->totlvl;
-}
-
/* =============================================================================
- * Public entry points..
+ * Reshape from object.
*/
/* Returns truth on success, false otherwise.
@@ -432,7 +940,7 @@ static void multires_reshape_init_mmd(MultiresModifierData *reshape_mmd,
* This function might fail in cases like source and destination not having
* matched amount of vertices.
*/
-bool multiresModifier_reshape(
+bool multiresModifier_reshapeFromObject(
struct Depsgraph *depsgraph,
MultiresModifierData *mmd,
Object *dst,
@@ -445,8 +953,8 @@ bool multiresModifier_reshape(
if (src->type != OB_MESH) {
return false;
}
- MultiresModifierData highest_mmd;
- multires_reshape_init_mmd(&highest_mmd, mmd);
+ MultiresModifierData reshape_mmd;
+ multires_reshape_init_mmd(&reshape_mmd, mmd);
/* Get evaluated vertices locations to reshape to. */
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
Object *src_eval = DEG_get_evaluated_object(depsgraph, src);
@@ -458,7 +966,7 @@ bool multiresModifier_reshape(
bool result = multires_reshape_from_vertcos(
depsgraph,
dst,
- &highest_mmd,
+ &reshape_mmd,
deformed_verts,
num_deformed_verts,
false);
@@ -466,6 +974,10 @@ bool multiresModifier_reshape(
return result;
}
+/* =============================================================================
+ * Reshape from modifier.
+ */
+
bool multiresModifier_reshapeFromDeformModifier(
struct Depsgraph *depsgraph,
MultiresModifierData *mmd,
@@ -473,7 +985,16 @@ bool multiresModifier_reshapeFromDeformModifier(
ModifierData *md)
{
MultiresModifierData highest_mmd;
- multires_reshape_init_mmd(&highest_mmd, mmd);
+ /* It is possible that the current subdivision level of multires is lower
+ * that it's maximum possible one (i.e., viewport is set to a lower level
+ * for the performance purposes). But even then, we want all the multires
+ * levels to be reshaped. Most accurate way to do so is to ignore all
+ * simplifications and calculate deformation modifier for the highest
+ * possible multires level.
+ * Alternative would be propagate displacement from current level to a
+ * higher ones, but that is likely to cause artifacts.
+ */
+ multires_reshape_init_mmd_top_level(&highest_mmd, mmd);
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
/* Perform sanity checks and early output. */
if (multires_get_level(
@@ -484,7 +1005,7 @@ bool multiresModifier_reshapeFromDeformModifier(
/* Create mesh for the multires, ignoring any further modifiers (leading
* deformation modifiers will be applied though).
*/
- Mesh *multires_mesh = get_multires_mesh(
+ Mesh *multires_mesh = BKE_multires_create_mesh(
depsgraph, scene_eval, &highest_mmd, object);
int num_deformed_verts;
float (*deformed_verts)[3] = BKE_mesh_vertexCos_get(
@@ -494,7 +1015,7 @@ bool multiresModifier_reshapeFromDeformModifier(
.depsgraph = depsgraph,
.object = object,
.flag = MOD_APPLY_USECACHE | MOD_APPLY_IGNORE_SIMPLIFY};
- modifier_deformVerts_ensure_normals(
+ modwrap_deformVerts(
md, &modifier_ctx, multires_mesh, deformed_verts,
multires_mesh->totvert);
BKE_id_free(NULL, multires_mesh);
@@ -510,3 +1031,176 @@ bool multiresModifier_reshapeFromDeformModifier(
MEM_freeN(deformed_verts);
return result;
}
+
+/* =============================================================================
+ * Reshape from grids.
+ */
+
+typedef struct ReshapeFromCCGTaskData {
+ MultiresReshapeContext reshape_ctx;
+ int *face_ptex_offset;
+ const CCGKey *key;
+ /*const*/ CCGElem **grids;
+} ReshapeFromCCGTaskData;
+
+static void reshape_from_ccg_regular_face(ReshapeFromCCGTaskData *data,
+ const MPoly *coarse_poly)
+{
+ const CCGKey *key = data->key;
+ /*const*/ CCGElem **grids = data->grids;
+ const Mesh *coarse_mesh = data->reshape_ctx.coarse_mesh;
+ const MPoly *coarse_mpoly = coarse_mesh->mpoly;
+ const int key_grid_size = key->grid_size;
+ const int key_grid_size_1 = key_grid_size - 1;
+ const int resolution = 2 * key_grid_size - 1;
+ const float resolution_1_inv = 1.0f / (float)(resolution - 1);
+ const int coarse_poly_index = coarse_poly - coarse_mpoly;
+ const int ptex_face_index = data->face_ptex_offset[coarse_poly_index];
+ for (int y = 0; y < resolution; y++) {
+ const float v = y * resolution_1_inv;
+ for (int x = 0; x < resolution; x++) {
+ const float u = x * resolution_1_inv;
+ float corner_u, corner_v;
+ float grid_u, grid_v;
+ const int face_corner = BKE_subdiv_rotate_quad_to_corner(
+ u, v, &corner_u, &corner_v);
+ BKE_subdiv_ptex_face_uv_to_grid_uv(
+ corner_u, corner_v, &grid_u, &grid_v);
+ /*const*/ CCGElem *grid =
+ grids[coarse_poly->loopstart + face_corner];
+ /*const*/ CCGElem *grid_element = CCG_grid_elem(
+ key,
+ grid,
+ key_grid_size_1 * grid_u,
+ key_grid_size_1 * grid_v);
+ const float *final_P = CCG_elem_co(key, grid_element);
+ float final_mask = 0.0f;
+ if (key->has_mask) {
+ final_mask = *CCG_elem_mask(key, grid_element);
+ }
+ multires_reshape_vertex_from_final_data(
+ &data->reshape_ctx,
+ ptex_face_index,
+ u, v,
+ coarse_poly_index,
+ 0,
+ final_P, final_mask);
+ }
+ }
+}
+
+static void reshape_from_ccg_special_face(ReshapeFromCCGTaskData *data,
+ const MPoly *coarse_poly)
+{
+ const CCGKey *key = data->key;
+ /*const*/ CCGElem **grids = data->grids;
+ const Mesh *coarse_mesh = data->reshape_ctx.coarse_mesh;
+ const MPoly *coarse_mpoly = coarse_mesh->mpoly;
+ const int key_grid_size = key->grid_size;
+ const int key_grid_size_1 = key_grid_size - 1;
+ const int resolution = key_grid_size;
+ const float resolution_1_inv = 1.0f / (float)(resolution - 1);
+ const int coarse_poly_index = coarse_poly - coarse_mpoly;
+ const int ptex_face_index = data->face_ptex_offset[coarse_poly_index];
+ for (int corner = 0; corner < coarse_poly->totloop; corner++) {
+ for (int y = 0; y < resolution; y++) {
+ const float v = y * resolution_1_inv;
+ for (int x = 0; x < resolution; x++) {
+ const float u = x * resolution_1_inv;
+ float grid_u, grid_v;
+ BKE_subdiv_ptex_face_uv_to_grid_uv(u, v, &grid_u, &grid_v);
+ /*const*/ CCGElem *grid =
+ grids[coarse_poly->loopstart + corner];
+ /*const*/ CCGElem *grid_element = CCG_grid_elem(
+ key,
+ grid,
+ key_grid_size_1 * grid_u,
+ key_grid_size_1 * grid_v);
+ const float *final_P = CCG_elem_co(key, grid_element);
+ float final_mask = 0.0f;
+ if (key->has_mask) {
+ final_mask = *CCG_elem_mask(key, grid_element);
+ }
+ multires_reshape_vertex_from_final_data(
+ &data->reshape_ctx,
+ ptex_face_index + corner,
+ u, v,
+ coarse_poly_index,
+ corner,
+ final_P, final_mask);
+ }
+ }
+ }
+}
+
+static void reshape_from_ccg_task(
+ void *__restrict userdata,
+ const int coarse_poly_index,
+ const ParallelRangeTLS *__restrict UNUSED(tls))
+{
+ ReshapeFromCCGTaskData *data = userdata;
+ const Mesh *coarse_mesh = data->reshape_ctx.coarse_mesh;
+ const MPoly *coarse_mpoly = coarse_mesh->mpoly;
+ const MPoly *coarse_poly = &coarse_mpoly[coarse_poly_index];
+ if (coarse_poly->totloop == 4) {
+ reshape_from_ccg_regular_face(data, coarse_poly);
+ }
+ else {
+ reshape_from_ccg_special_face(data, coarse_poly);
+ }
+}
+
+bool multiresModifier_reshapeFromCCG(
+ const int tot_level,
+ Mesh *coarse_mesh,
+ SubdivCCG *subdiv_ccg)
+{
+ CCGKey key;
+ BKE_subdiv_ccg_key_top_level(&key, subdiv_ccg);
+ /* Sanity checks. */
+ if (coarse_mesh->totloop != subdiv_ccg->num_grids) {
+ /* Grids are supposed to eb created for each face-cornder (aka loop). */
+ return false;
+ }
+ MDisps *mdisps = CustomData_get_layer(&coarse_mesh->ldata, CD_MDISPS);
+ GridPaintMask *grid_paint_mask =
+ CustomData_get_layer(&coarse_mesh->ldata, CD_GRID_PAINT_MASK);
+ Subdiv *subdiv = subdiv_ccg->subdiv;
+ /* Make sure displacement grids are ready. */
+ multires_reshape_ensure_grids(coarse_mesh, tot_level);
+ /* Pick maximum between multires level and dispalcement level.
+ * This is because mesh can be used by objects with multires at different
+ * levels.
+ *
+ * TODO(sergey): At this point it should be possible to always use
+ * mdisps->level.
+ */
+ const int top_level = max_ii(tot_level, mdisps->level);
+ /* Construct context. */
+ ReshapeFromCCGTaskData data = {
+ .reshape_ctx = {
+ .subdiv = subdiv,
+ .coarse_mesh = coarse_mesh,
+ .mdisps = mdisps,
+ .grid_paint_mask = grid_paint_mask,
+ .top_grid_size = BKE_subdiv_grid_size_from_level(top_level),
+ .top_level = top_level},
+ .face_ptex_offset = BKE_subdiv_face_ptex_offset_get(subdiv),
+ .key = &key,
+ .grids = subdiv_ccg->grids};
+ /* Initialize propagation to higher levels. */
+ MultiresPropagateData propagate_data;
+ multires_reshape_propagate_prepare(
+ &propagate_data, coarse_mesh, key.level, top_level);
+ /* Threaded grids iteration. */
+ ParallelRangeSettings parallel_range_settings;
+ BLI_parallel_range_settings_defaults(&parallel_range_settings);
+ BLI_task_parallel_range(0, coarse_mesh->totpoly,
+ &data,
+ reshape_from_ccg_task,
+ &parallel_range_settings);
+ /* Update higher levels if needed. */
+ multires_reshape_propagate(&propagate_data);
+ multires_reshape_propagate_free(&propagate_data);
+ return true;
+}
diff --git a/source/blender/blenkernel/intern/multires_subdiv.c b/source/blender/blenkernel/intern/multires_subdiv.c
index 2df931328c2..e0b316d49de 100644
--- a/source/blender/blenkernel/intern/multires_subdiv.c
+++ b/source/blender/blenkernel/intern/multires_subdiv.c
@@ -39,6 +39,7 @@
#include "BKE_modifier.h"
#include "BKE_multires.h"
#include "BKE_subdiv.h"
+#include "BKE_subdiv_mesh.h"
void BKE_multires_subdiv_settings_init(
SubdivSettings *settings,
@@ -47,6 +48,7 @@ void BKE_multires_subdiv_settings_init(
settings->is_simple = (mmd->simple != 0);
settings->is_adaptive = !settings->is_simple;
settings->level = mmd->quality;
+ settings->vtx_boundary_interpolation = SUBDIV_VTX_BOUNDARY_EDGE_ONLY;
settings->fvar_linear_interpolation =
BKE_subdiv_fvar_interpolation_from_uv_smooth(mmd->uv_smooth);
}
diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c
index 91340997532..192e6b5e56e 100644
--- a/source/blender/blenkernel/intern/nla.c
+++ b/source/blender/blenkernel/intern/nla.c
@@ -76,7 +76,7 @@
/* Remove the given NLA strip from the NLA track it occupies, free the strip's data,
* and the strip itself.
*/
-void BKE_nlastrip_free(ListBase *strips, NlaStrip *strip)
+void BKE_nlastrip_free(ListBase *strips, NlaStrip *strip, bool do_id_user)
{
NlaStrip *cs, *csn;
@@ -87,12 +87,13 @@ void BKE_nlastrip_free(ListBase *strips, NlaStrip *strip)
/* free child-strips */
for (cs = strip->strips.first; cs; cs = csn) {
csn = cs->next;
- BKE_nlastrip_free(&strip->strips, cs);
+ BKE_nlastrip_free(&strip->strips, cs, do_id_user);
}
/* remove reference to action */
- if (strip->act)
+ if (strip->act != NULL && do_id_user) {
id_us_min(&strip->act->id);
+ }
/* free remapping info */
//if (strip->remap)
@@ -114,7 +115,7 @@ void BKE_nlastrip_free(ListBase *strips, NlaStrip *strip)
/* Remove the given NLA track from the set of NLA tracks, free the track's data,
* and the track itself.
*/
-void BKE_nlatrack_free(ListBase *tracks, NlaTrack *nlt)
+void BKE_nlatrack_free(ListBase *tracks, NlaTrack *nlt, bool do_id_user)
{
NlaStrip *strip, *stripn;
@@ -125,7 +126,7 @@ void BKE_nlatrack_free(ListBase *tracks, NlaTrack *nlt)
/* free strips */
for (strip = nlt->strips.first; strip; strip = stripn) {
stripn = strip->next;
- BKE_nlastrip_free(&nlt->strips, strip);
+ BKE_nlastrip_free(&nlt->strips, strip, do_id_user);
}
/* free NLA track itself now */
@@ -138,7 +139,7 @@ void BKE_nlatrack_free(ListBase *tracks, NlaTrack *nlt)
/* Free the elements of type NLA Tracks provided in the given list, but do not free
* the list itself since that is not free-standing
*/
-void BKE_nla_tracks_free(ListBase *tracks)
+void BKE_nla_tracks_free(ListBase *tracks, bool do_id_user)
{
NlaTrack *nlt, *nltn;
@@ -149,7 +150,7 @@ void BKE_nla_tracks_free(ListBase *tracks)
/* free tracks one by one */
for (nlt = tracks->first; nlt; nlt = nltn) {
nltn = nlt->next;
- BKE_nlatrack_free(tracks, nlt);
+ BKE_nlatrack_free(tracks, nlt, do_id_user);
}
/* clear the list's pointers to be safe */
@@ -162,12 +163,15 @@ void BKE_nla_tracks_free(ListBase *tracks)
* Copy NLA strip
*
* \param use_same_action When true, the existing action is used (instead of being duplicated)
+ * \param flag Control ID pointers management, see LIB_ID_CREATE_.../LIB_ID_COPY_... flags in BKE_library.h
*/
-NlaStrip *BKE_nlastrip_copy(Main *bmain, NlaStrip *strip, const bool use_same_action)
+NlaStrip *BKE_nlastrip_copy(Main *bmain, NlaStrip *strip, const bool use_same_action, const int flag)
{
NlaStrip *strip_d;
NlaStrip *cs, *cs_d;
+ const bool do_id_user = (flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0;
+
/* sanity check */
if (strip == NULL)
return NULL;
@@ -179,12 +183,14 @@ NlaStrip *BKE_nlastrip_copy(Main *bmain, NlaStrip *strip, const bool use_same_ac
/* handle action */
if (strip_d->act) {
if (use_same_action) {
- /* increase user-count of action */
- id_us_plus(&strip_d->act->id);
+ if (do_id_user) {
+ /* increase user-count of action */
+ id_us_plus(&strip_d->act->id);
+ }
}
else {
/* use a copy of the action instead (user count shouldn't have changed yet) */
- strip_d->act = BKE_action_copy(bmain, strip_d->act);
+ BKE_id_copy_ex(bmain, &strip_d->act->id, (ID **)&strip_d->act, flag, false);
}
}
@@ -196,7 +202,7 @@ NlaStrip *BKE_nlastrip_copy(Main *bmain, NlaStrip *strip, const bool use_same_ac
BLI_listbase_clear(&strip_d->strips);
for (cs = strip->strips.first; cs; cs = cs->next) {
- cs_d = BKE_nlastrip_copy(bmain, cs, use_same_action);
+ cs_d = BKE_nlastrip_copy(bmain, cs, use_same_action, flag);
BLI_addtail(&strip_d->strips, cs_d);
}
@@ -204,8 +210,11 @@ NlaStrip *BKE_nlastrip_copy(Main *bmain, NlaStrip *strip, const bool use_same_ac
return strip_d;
}
-/* Copy NLA Track */
-NlaTrack *BKE_nlatrack_copy(Main *bmain, NlaTrack *nlt, const bool use_same_actions)
+/**
+ * Copy a single NLA Track.
+ * \param flag Control ID pointers management, see LIB_ID_CREATE_.../LIB_ID_COPY_... flags in BKE_library.h
+ */
+NlaTrack *BKE_nlatrack_copy(Main *bmain, NlaTrack *nlt, const bool use_same_actions, const int flag)
{
NlaStrip *strip, *strip_d;
NlaTrack *nlt_d;
@@ -222,7 +231,7 @@ NlaTrack *BKE_nlatrack_copy(Main *bmain, NlaTrack *nlt, const bool use_same_acti
BLI_listbase_clear(&nlt_d->strips);
for (strip = nlt->strips.first; strip; strip = strip->next) {
- strip_d = BKE_nlastrip_copy(bmain, strip, use_same_actions);
+ strip_d = BKE_nlastrip_copy(bmain, strip, use_same_actions, flag);
BLI_addtail(&nlt_d->strips, strip_d);
}
@@ -230,8 +239,11 @@ NlaTrack *BKE_nlatrack_copy(Main *bmain, NlaTrack *nlt, const bool use_same_acti
return nlt_d;
}
-/* Copy all NLA data */
-void BKE_nla_tracks_copy(Main *bmain, ListBase *dst, ListBase *src)
+/**
+ * Copy all NLA data.
+ * \param flag Control ID pointers management, see LIB_ID_CREATE_.../LIB_ID_COPY_... flags in BKE_library.h
+ */
+void BKE_nla_tracks_copy(Main *bmain, ListBase *dst, ListBase *src, const int flag)
{
NlaTrack *nlt, *nlt_d;
@@ -246,7 +258,7 @@ void BKE_nla_tracks_copy(Main *bmain, ListBase *dst, ListBase *src)
for (nlt = src->first; nlt; nlt = nlt->next) {
/* make a copy, and add the copy to the destination list */
// XXX: we need to fix this sometime
- nlt_d = BKE_nlatrack_copy(bmain, nlt, true);
+ nlt_d = BKE_nlatrack_copy(bmain, nlt, true, flag);
BLI_addtail(dst, nlt_d);
}
}
@@ -752,7 +764,7 @@ void BKE_nlastrips_clear_metastrip(ListBase *strips, NlaStrip *strip)
}
/* free the meta-strip now */
- BKE_nlastrip_free(strips, strip);
+ BKE_nlastrip_free(strips, strip, true);
}
/* Remove meta-strips (i.e. flatten the list of strips) from the top-level of the list of strips
@@ -1008,7 +1020,7 @@ void BKE_nlatrack_set_active(ListBase *tracks, NlaTrack *nlt_a)
if (ELEM(NULL, tracks, tracks->first))
return;
- /* deactive all the rest */
+ /* deactivate all the rest */
for (nlt = tracks->first; nlt; nlt = nlt->next)
nlt->flag &= ~NLATRACK_ACTIVE;
@@ -1180,7 +1192,7 @@ static void nlastrip_fix_resize_overlaps(NlaStrip *strip)
float offset = 0.0f;
if (nls->type == NLASTRIP_TYPE_TRANSITION) {
- /* transition strips should grow/shrink to accomodate the resized strip,
+ /* transition strips should grow/shrink to accommodate the resized strip,
* but if the strip's bounds now exceed the transition, we're forced to
* offset everything to maintain the balance
*/
@@ -1227,7 +1239,7 @@ static void nlastrip_fix_resize_overlaps(NlaStrip *strip)
float offset = 0.0f;
if (nls->type == NLASTRIP_TYPE_TRANSITION) {
- /* transition strips should grow/shrink to accomodate the resized strip,
+ /* transition strips should grow/shrink to accommodate the resized strip,
* but if the strip's bounds now exceed the transition, we're forced to
* offset everything to maintain the balance
*/
@@ -1297,7 +1309,7 @@ void BKE_nlastrip_recalculate_bounds(NlaStrip *strip)
}
/* Is the given NLA-strip the first one to occur for the given AnimData block */
-// TODO: make this an api method if necesary, but need to add prefix first
+// TODO: make this an api method if necessary, but need to add prefix first
static bool nlastrip_is_first(AnimData *adt, NlaStrip *strip)
{
NlaTrack *nlt;
@@ -1809,7 +1821,7 @@ void BKE_nla_action_pushdown(AnimData *adt)
* NOTE: An alternative way would have been to instead hack the influence
* to not get always get reset to full strength if NLASTRIP_FLAG_USR_INFLUENCE
* is disabled but auto-blending isn't being used. However, that approach
- * is a bit hacky/hard to discover, and may cause backwards compatability issues,
+ * is a bit hacky/hard to discover, and may cause backwards compatibility issues,
* so it's better to just do it this way.
*/
strip->flag |= NLASTRIP_FLAG_USR_INFLUENCE;
@@ -2013,30 +2025,3 @@ void BKE_nla_tweakmode_exit(AnimData *adt)
adt->actstrip = NULL;
adt->flag &= ~ADT_NLA_EDIT_ON;
}
-
-/* Baking Tools ------------------------------------------- */
-
-static void UNUSED_FUNCTION(BKE_nla_bake) (Scene *scene, ID *UNUSED(id), AnimData *adt, int UNUSED(flag))
-{
-
- /* verify that data is valid
- * 1) Scene and AnimData must be provided
- * 2) there must be tracks to merge...
- */
- if (ELEM(NULL, scene, adt, adt->nla_tracks.first))
- return;
-
- /* if animdata currently has an action, 'push down' this onto the stack first */
- if (adt->action)
- BKE_nla_action_pushdown(adt);
-
- /* get range of motion to bake, and the channels involved... */
-
- /* temporarily mute the action, and start keying to it */
-
- /* start keying... */
-
- /* unmute the action */
-}
-
-/* *************************************************** */
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index c81f5f425d8..869e2849be5 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -1213,6 +1213,56 @@ void nodeDetachNode(struct bNode *node)
}
}
+void nodePositionRelative(bNode *from_node, bNode *to_node, bNodeSocket *from_sock, bNodeSocket *to_sock)
+{
+ float offset_x;
+ int tot_sock_idx;
+
+ /* Socket to plug into. */
+ if (SOCK_IN == to_sock->in_out) {
+ offset_x = - (from_node->typeinfo->width + 50);
+ tot_sock_idx = BLI_listbase_count(&to_node->outputs);
+ tot_sock_idx += BLI_findindex(&to_node->inputs, to_sock);
+ }
+ else {
+ offset_x = to_node->typeinfo->width + 50;
+ tot_sock_idx = BLI_findindex(&to_node->outputs, to_sock);
+ }
+
+ BLI_assert(tot_sock_idx != -1);
+
+ float offset_y = U.widget_unit * tot_sock_idx;
+
+ /* Output socket. */
+ if (from_sock) {
+ if (SOCK_IN == from_sock->in_out) {
+ tot_sock_idx = BLI_listbase_count(&from_node->outputs);
+ tot_sock_idx += BLI_findindex(&from_node->inputs, from_sock);
+ }
+ else {
+ tot_sock_idx = BLI_findindex(&from_node->outputs, from_sock);
+ }
+ }
+
+ BLI_assert(tot_sock_idx != -1);
+
+ offset_y -= U.widget_unit * tot_sock_idx;
+
+ from_node->locx = to_node->locx + offset_x;
+ from_node->locy = to_node->locy - offset_y;
+}
+
+void nodePositionPropagate(bNode *node)
+{
+ for (bNodeSocket *nsock = node->inputs.first; nsock; nsock = nsock->next) {
+ if (nsock->link != NULL) {
+ bNodeLink *link = nsock->link;
+ nodePositionRelative(link->fromnode, link->tonode, link->fromsock, link->tosock);
+ nodePositionPropagate(link->fromnode);
+ }
+ }
+}
+
void ntreeInitDefault(bNodeTree *ntree)
{
ntree_set_typeinfo(ntree, NULL);
@@ -1594,54 +1644,6 @@ void BKE_node_preview_set_pixel(bNodePreview *preview, const float col[4], int x
}
}
-#if 0
-static void nodeClearPreview(bNode *node)
-{
- if (node->preview && node->preview->rect)
- memset(node->preview->rect, 0, MEM_allocN_len(node->preview->rect));
-}
-
-/* use it to enforce clear */
-void ntreeClearPreview(bNodeTree *ntree)
-{
- bNode *node;
-
- if (ntree == NULL)
- return;
-
- for (node = ntree->nodes.first; node; node = node->next) {
- if (node->typeinfo->flag & NODE_PREVIEW)
- nodeClearPreview(node);
- if (node->type == NODE_GROUP)
- ntreeClearPreview((bNodeTree *)node->id);
- }
-}
-
-/* hack warning! this function is only used for shader previews, and
- * since it gets called multiple times per pixel for Ztransp we only
- * add the color once. Preview gets cleared before it starts render though */
-void nodeAddToPreview(bNode *node, const float col[4], int x, int y, int do_manage)
-{
- bNodePreview *preview = node->preview;
- if (preview) {
- if (x >= 0 && y >= 0) {
- if (x < preview->xsize && y < preview->ysize) {
- unsigned char *tar = preview->rect + 4 * ((preview->xsize * y) + x);
-
- if (do_manage) {
- linearrgb_to_srgb_uchar4(tar, col);
- }
- else {
- rgba_float_to_uchar(tar, col);
- }
- }
- //else printf("prv out bound x y %d %d\n", x, y);
- }
- //else printf("prv out bound x y %d %d\n", x, y);
- }
-}
-#endif
-
/* ************** Free stuff ********** */
/* goes over entire tree */
@@ -2047,7 +2049,7 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
/* sync local composite with real tree */
/* local tree is supposed to be running, be careful moving previews! */
-/* is called by jobs manager, outside threads, so it doesnt happen during draw */
+/* is called by jobs manager, outside threads, so it doesn't happen during draw */
void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree)
{
if (localtree && ntree) {
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index f0dcb333be0..a8a98974d21 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -117,6 +117,7 @@
#include "BKE_speaker.h"
#include "BKE_softbody.h"
#include "BKE_subsurf.h"
+#include "BKE_subdiv_ccg.h"
#include "BKE_material.h"
#include "BKE_camera.h"
#include "BKE_image.h"
@@ -339,6 +340,93 @@ void BKE_object_link_modifiers(Scene *scene, struct Object *ob_dst, const struct
/* TODO: smoke?, cloth? */
}
+/* Copy CCG related data. Used to sync copy of mesh with reshaped original
+ * mesh.
+ */
+static void copy_ccg_data(Mesh *mesh_destination,
+ Mesh *mesh_source,
+ int layer_type)
+{
+ BLI_assert(mesh_destination->totloop == mesh_source->totloop);
+ CustomData *data_destination = &mesh_destination->ldata;
+ CustomData *data_source = &mesh_source->ldata;
+ const int num_elements = mesh_source->totloop;
+ if (!CustomData_has_layer(data_source, layer_type)) {
+ return;
+ }
+ const int layer_index = CustomData_get_layer_index(
+ data_destination, layer_type);
+ CustomData_free_layer(
+ data_destination, layer_type, num_elements, layer_index);
+ BLI_assert(!CustomData_has_layer(data_destination, layer_type));
+ CustomData_add_layer(
+ data_destination, layer_type, CD_CALLOC, NULL, num_elements);
+ BLI_assert(CustomData_has_layer(data_destination, layer_type));
+ CustomData_copy_layer_type_data(data_source, data_destination,
+ layer_type, 0, 0, num_elements);
+}
+
+static void object_update_from_subsurf_ccg(Object *object)
+{
+ /* Currently CCG is only created for Mesh objects. */
+ if (object->type != OB_MESH) {
+ return;
+ }
+ /* Object was never evaluated, so can not have CCG subdivision surface. */
+ Mesh *mesh_eval = object->runtime.mesh_eval;
+ if (mesh_eval == NULL) {
+ return;
+ }
+ SubdivCCG *subdiv_ccg = mesh_eval->runtime.subdiv_ccg;
+ if (subdiv_ccg == NULL) {
+ return;
+ }
+ /* Check whether there is anything to be reshaped. */
+ if (!subdiv_ccg->dirty.coords && !subdiv_ccg->dirty.hidden) {
+ return;
+ }
+ const int tot_level = mesh_eval->runtime.subdiv_ccg_tot_level;
+ Object *object_orig = DEG_get_original_object(object);
+ Mesh *mesh_orig = (Mesh *)object_orig->data;
+ multiresModifier_reshapeFromCCG(tot_level, mesh_orig, subdiv_ccg);
+ /* NOTE: we need to reshape into an original mesh from main database,
+ * allowing:
+ *
+ * - Update copies of that mesh at any moment.
+ * - Save the file without doing extra reshape.
+ * - All the users of the mesh have updated displacement.
+ *
+ * However, the tricky part here is that we only know about sculpted
+ * state of a mesh on an object level, and object is being updated after
+ * mesh datablock is updated. This forces us to:
+ *
+ * - Update mesh datablock from object evaluation, which is technically
+ * forbidden, but there is no other place for this yet.
+ * - Reshape to the original mesh from main database, and then copy updated
+ * layer to copy of that mesh (since copy of the mesh has decoupled
+ * custom data layers).
+ *
+ * All this is defeating all the designs we need to follow to allow safe
+ * threaded evaluation, but this is as good as we can make it within the
+ * current sculpt//evaluated mesh design. This is also how we've survived
+ * with old DerivedMesh based solutions. So, while this is all wrong and
+ * needs reconsideration, doesn't seem to be a big stopper for real
+ * production artists.
+ */
+ /* TODO(sergey): Solve this somehow, to be fully stable for threaded
+ * evaluation environment.
+ */
+ /* NOTE: runtime.mesh_orig is what was before assigning mesh_eval,
+ * it is orig as in what was in object_eval->data before evaluating
+ * modifier stack.
+ *
+ * mesh_cow is a copy-on-written version od object_orig->data.
+ */
+ Mesh *mesh_cow = object->runtime.mesh_orig;
+ copy_ccg_data(mesh_cow, mesh_orig, CD_MDISPS);
+ copy_ccg_data(mesh_cow, mesh_orig, CD_GRID_PAINT_MASK);
+}
+
/* free data derived from mesh, called when mesh changes or is freed */
void BKE_object_free_derived_caches(Object *ob)
{
@@ -368,6 +456,7 @@ void BKE_object_free_derived_caches(Object *ob)
ob->bb = NULL;
}
+ object_update_from_subsurf_ccg(ob);
BKE_object_free_derived_mesh_caches(ob);
if (ob->runtime.mesh_eval != NULL) {
@@ -392,6 +481,9 @@ void BKE_object_free_derived_caches(Object *ob)
}
BKE_object_free_curve_cache(ob);
+
+ /* clear grease pencil data */
+ DRW_gpencil_freecache(ob);
}
void BKE_object_free_derived_mesh_caches(struct Object *ob)
@@ -516,45 +608,27 @@ void BKE_object_free(Object *ob, const int flag)
/* actual check for internal data, not context or flags */
bool BKE_object_is_in_editmode(const Object *ob)
{
- if (ob->data == NULL)
+ if (ob->data == NULL) {
return false;
-
- if (ob->type == OB_MESH) {
- Mesh *me = ob->data;
- if (me->edit_btmesh)
- return true;
- }
- else if (ob->type == OB_ARMATURE) {
- bArmature *arm = ob->data;
-
- if (arm->edbo)
- return true;
- }
- else if (ob->type == OB_FONT) {
- Curve *cu = ob->data;
-
- if (cu->editfont)
- return true;
- }
- else if (ob->type == OB_MBALL) {
- MetaBall *mb = ob->data;
-
- if (mb->editelems)
- return true;
- }
- else if (ob->type == OB_LATTICE) {
- Lattice *lt = ob->data;
-
- if (lt->editlatt)
- return true;
}
- else if (ob->type == OB_SURF || ob->type == OB_CURVE) {
- Curve *cu = ob->data;
- if (cu->editnurb)
- return true;
+ switch (ob->type) {
+ case OB_MESH:
+ return ((Mesh *)ob->data)->edit_btmesh != NULL;
+ case OB_ARMATURE:
+ return ((bArmature *)ob->data)->edbo != NULL;
+ case OB_FONT:
+ return ((Curve *)ob->data)->editfont != NULL;
+ case OB_MBALL:
+ return ((MetaBall *)ob->data)->editelems != NULL;
+ case OB_LATTICE:
+ return ((Lattice *)ob->data)->editlatt != NULL;
+ case OB_SURF:
+ case OB_CURVE:
+ return ((Curve *)ob->data)->editnurb != NULL;
+ default:
+ return false;
}
- return false;
}
bool BKE_object_is_in_editmode_vgroup(const Object *ob)
@@ -638,7 +712,7 @@ bool BKE_object_is_mode_compat(const struct Object *ob, eObjectMode object_mode)
/**
* Return if the object is visible, as evaluated by depsgraph
*/
-bool BKE_object_is_visible(Object *ob, const eObjectVisibilityCheck mode)
+bool BKE_object_is_visible(const Object *ob, const eObjectVisibilityCheck mode)
{
if ((ob->base_flag & BASE_VISIBLE) == 0) {
return false;
@@ -758,6 +832,10 @@ void BKE_object_init(Object *ob)
ob->dt = OB_TEXTURE;
ob->empty_drawtype = OB_PLAINAXES;
ob->empty_drawsize = 1.0;
+ ob->empty_image_depth = OB_EMPTY_IMAGE_DEPTH_DEFAULT;
+ ob->empty_image_visibility_flag = (
+ OB_EMPTY_IMAGE_VISIBLE_PERSPECTIVE |
+ OB_EMPTY_IMAGE_VISIBLE_ORTHOGRAPHIC);
if (ob->type == OB_EMPTY) {
copy_v2_fl(ob->ima_ofs, -0.5f);
}
@@ -846,7 +924,7 @@ Object *BKE_object_add(
BKE_collection_object_add(bmain, layer_collection->collection, ob);
base = BKE_view_layer_base_find(view_layer, ob);
- BKE_view_layer_base_select(view_layer, base);
+ BKE_view_layer_base_select_and_set_active(view_layer, base);
return ob;
}
@@ -867,7 +945,7 @@ Object *BKE_object_add_from(
BKE_collection_object_add_from(bmain, scene, ob_src, ob);
base = BKE_view_layer_base_find(view_layer, ob);
- BKE_view_layer_base_select(view_layer, base);
+ BKE_view_layer_base_select_and_set_active(view_layer, base);
return ob;
}
@@ -901,7 +979,7 @@ Object *BKE_object_add_for_data(
BKE_collection_object_add(bmain, layer_collection->collection, ob);
base = BKE_view_layer_base_find(view_layer, ob);
- BKE_view_layer_base_select(view_layer, base);
+ BKE_view_layer_base_select_and_set_active(view_layer, base);
return ob;
}
@@ -1296,7 +1374,7 @@ void BKE_object_copy_data(Main *bmain, Object *ob_dst, const Object *ob_src, con
BKE_object_facemap_copy_list(&ob_dst->fmaps, &ob_src->fmaps);
BKE_constraints_copy_ex(&ob_dst->constraints, &ob_src->constraints, flag_subdata, true);
- ob_dst->mode = OB_MODE_OBJECT;
+ ob_dst->mode = ob_dst->type != OB_GPENCIL ? OB_MODE_OBJECT : ob_dst->mode;
ob_dst->sculpt = NULL;
if (ob_src->pd) {
@@ -1317,10 +1395,6 @@ void BKE_object_copy_data(Main *bmain, Object *ob_dst, const Object *ob_src, con
BLI_listbase_clear((ListBase *)&ob_dst->drawdata);
BLI_listbase_clear(&ob_dst->pc_ids);
- /* grease pencil: clean derived data */
- if (ob_dst->type == OB_GPENCIL)
- BKE_gpencil_free_derived_frames(ob_dst->data);
-
ob_dst->avs = ob_src->avs;
ob_dst->mpath = animviz_copy_motionpath(ob_src->mpath);
@@ -1887,21 +1961,7 @@ static bool ob_parcurve(Depsgraph *depsgraph, Scene *UNUSED(scene), Object *ob,
if (where_on_path(par, ctime, vec, dir, (cu->flag & CU_FOLLOW) ? quat : NULL, &radius, NULL)) {
if (cu->flag & CU_FOLLOW) {
-#if 0
- float si, q[4];
- vec_to_quat(quat, dir, ob->trackflag, ob->upflag);
-
- /* the tilt */
- normalize_v3(dir);
- q[0] = cosf(0.5 * vec[3]);
- si = sinf(0.5 * vec[3]);
- q[1] = -si * dir[0];
- q[2] = -si * dir[1];
- q[3] = -si * dir[2];
- mul_qt_qtqt(quat, q, quat);
-#else
quat_apply_track(quat, ob->trackflag, ob->upflag);
-#endif
normalize_qt(quat);
quat_to_mat4(mat, quat);
}
@@ -1940,7 +2000,7 @@ static void ob_parbone(Object *ob, Object *par, float mat[4][4])
/* get bone transform */
if (pchan->bone->flag & BONE_RELATIVE_PARENTING) {
- /* the new option uses the root - expected bahaviour, but differs from old... */
+ /* the new option uses the root - expected behaviour, but differs from old... */
/* XXX check on version patching? */
copy_m4_m4(mat, pchan->chan_mat);
}
@@ -1961,18 +2021,23 @@ static void give_parvert(Object *par, int nr, float vec[3])
if (par->type == OB_MESH) {
Mesh *me = par->data;
BMEditMesh *em = me->edit_btmesh;
- DerivedMesh *dm;
+ DerivedMesh *dm = NULL;
+ Mesh *me_eval = (em) ? em->mesh_eval_final : par->runtime.mesh_eval;
- dm = (em) ? em->derivedFinal : par->derivedFinal;
+ /* Keep this until subsurf code ported away from derived mesh - campbell. */
+ dm = par->derivedFinal;
+ if (dm && dm->type != DM_TYPE_CCGDM) {
+ dm = NULL;
+ }
- if (dm) {
+ if (me_eval) {
int count = 0;
- int numVerts = dm->getNumVerts(dm);
+ const int numVerts = me_eval->totvert;
if (nr < numVerts) {
bool use_special_ss_case = false;
- if (dm->type == DM_TYPE_CCGDM) {
+ if (dm && dm->type == DM_TYPE_CCGDM) {
ModifierData *md;
VirtualModifierData virtualModifierData;
use_special_ss_case = true;
@@ -1991,7 +2056,7 @@ static void give_parvert(Object *par, int nr, float vec[3])
if (!use_special_ss_case) {
/* avoid dm->getVertDataArray() since it allocates arrays in the dm (not thread safe) */
- if (em && dm->type == DM_TYPE_EDITBMESH) {
+ if (em && me_eval->runtime.is_original) {
if (em->bm->elem_table_dirty & BM_VERT) {
#ifdef VPARENT_THREADING_HACK
BLI_mutex_lock(&vparent_lock);
@@ -2010,7 +2075,7 @@ static void give_parvert(Object *par, int nr, float vec[3])
if (use_special_ss_case) {
/* Special case if the last modifier is SS and no constructive modifier are in front of it. */
CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
- CCGVert *ccg_vert = ccgSubSurf_getVert(ccgdm->ss, SET_INT_IN_POINTER(nr));
+ CCGVert *ccg_vert = ccgSubSurf_getVert(ccgdm->ss, POINTER_FROM_INT(nr));
/* In case we deleted some verts, nr may refer to inexistent one now, see T42557. */
if (ccg_vert) {
float *co = ccgSubSurf_getVertData(ccgdm->ss, ccg_vert);
@@ -2018,27 +2083,21 @@ static void give_parvert(Object *par, int nr, float vec[3])
count++;
}
}
- else if (CustomData_has_layer(&dm->vertData, CD_ORIGINDEX) &&
- !(em && dm->type == DM_TYPE_EDITBMESH))
+ else if (CustomData_has_layer(&me_eval->vdata, CD_ORIGINDEX) &&
+ !(em && me_eval->runtime.is_original))
{
- int i;
-
+ const int *index = CustomData_get_layer(&me_eval->vdata, CD_ORIGINDEX);
/* Get the average of all verts with (original index == nr). */
- for (i = 0; i < numVerts; i++) {
- const int *index = dm->getVertData(dm, i, CD_ORIGINDEX);
- if (*index == nr) {
- float co[3];
- dm->getVertCo(dm, i, co);
- add_v3_v3(vec, co);
+ for (int i = 0; i < numVerts; i++) {
+ if (index[i] == nr) {
+ add_v3_v3(vec, me_eval->mvert[i].co);
count++;
}
}
}
else {
if (nr < numVerts) {
- float co[3];
- dm->getVertCo(dm, nr, co);
- add_v3_v3(vec, co);
+ add_v3_v3(vec, me_eval->mvert[nr].co);
count++;
}
}
@@ -2052,7 +2111,9 @@ static void give_parvert(Object *par, int nr, float vec[3])
}
else {
/* use first index if its out of range */
- dm->getVertCo(dm, 0, vec);
+ if (me_eval->totvert) {
+ copy_v3_v3(vec, me_eval->mvert[0].co);
+ }
}
}
else {
@@ -2313,8 +2374,8 @@ void BKE_object_where_is_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
*
* It assumes the object parent is already in the depsgraph.
* Otherwise, after changing ob->parent you need to call:
- * DEG_relations_tag_update(bmain);
- * BKE_scene_graph_update_tagged(depsgraph, bmain);
+ * - #DEG_relations_tag_update(bmain);
+ * - #BKE_scene_graph_update_tagged(depsgraph, bmain);
*/
void BKE_object_workob_calc_parent(Depsgraph *depsgraph, Scene *scene, Object *ob, Object *workob)
{
@@ -2440,20 +2501,29 @@ BoundBox *BKE_object_boundbox_get(Object *ob)
{
BoundBox *bb = NULL;
- if (ob->type == OB_MESH) {
- bb = BKE_mesh_boundbox_get(ob);
- }
- else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
- bb = BKE_curve_boundbox_get(ob);
- }
- else if (ob->type == OB_MBALL) {
- bb = BKE_mball_boundbox_get(ob);
- }
- else if (ob->type == OB_LATTICE) {
- bb = BKE_lattice_boundbox_get(ob);
- }
- else if (ob->type == OB_ARMATURE) {
- bb = BKE_armature_boundbox_get(ob);
+ switch (ob->type) {
+ case OB_MESH:
+ bb = BKE_mesh_boundbox_get(ob);
+ break;
+ case OB_CURVE:
+ case OB_SURF:
+ case OB_FONT:
+ bb = BKE_curve_boundbox_get(ob);
+ break;
+ case OB_MBALL:
+ bb = BKE_mball_boundbox_get(ob);
+ break;
+ case OB_LATTICE:
+ bb = BKE_lattice_boundbox_get(ob);
+ break;
+ case OB_ARMATURE:
+ bb = BKE_armature_boundbox_get(ob);
+ break;
+ case OB_GPENCIL:
+ bb = BKE_gpencil_boundbox_get(ob);
+ break;
+ default:
+ break;
}
return bb;
}
@@ -2468,6 +2538,23 @@ void BKE_object_boundbox_flag(Object *ob, int flag, const bool set)
}
}
+void BKE_object_boundbox_calc_from_mesh(struct Object *ob, struct Mesh *me_eval)
+{
+ float min[3], max[3];
+
+ INIT_MINMAX(min, max);
+
+ BKE_mesh_minmax(me_eval, min, max);
+
+ if (ob->bb == NULL) {
+ ob->bb = MEM_callocN(sizeof(BoundBox), "DM-BoundBox");
+ }
+
+ BKE_boundbox_init_from_minmax(ob->bb, min, max);
+
+ ob->bb->flag &= ~BOUNDBOX_DIRTY;
+}
+
void BKE_object_dimensions_get(Object *ob, float vec[3])
{
BoundBox *bb = NULL;
@@ -2849,7 +2936,7 @@ void BKE_object_handle_update_ex(Depsgraph *depsgraph,
/* WARNING: "scene" here may not be the scene object actually resides in.
* When dealing with background-sets, "scene" is actually the active scene.
* e.g. "scene" <-- set 1 <-- set 2 ("ob" lives here) <-- set 3 <-- ... <-- set n
- * rigid bodies depend on their world so use BKE_object_handle_update_ex() to also pass along the corrent rigid body world
+ * rigid bodies depend on their world so use BKE_object_handle_update_ex() to also pass along the current rigid body world
*/
void BKE_object_handle_update(Depsgraph *depsgraph, Scene *scene, Object *ob)
{
@@ -2993,7 +3080,7 @@ Mesh *BKE_object_get_original_mesh(Object *object)
static int pc_cmp(const void *a, const void *b)
{
const LinkData *ad = a, *bd = b;
- if (GET_INT_FROM_POINTER(ad->data) > GET_INT_FROM_POINTER(bd->data))
+ if (POINTER_AS_INT(ad->data) > POINTER_AS_INT(bd->data))
return 1;
else return 0;
}
@@ -3006,14 +3093,14 @@ int BKE_object_insert_ptcache(Object *ob)
BLI_listbase_sort(&ob->pc_ids, pc_cmp);
for (link = ob->pc_ids.first, i = 0; link; link = link->next, i++) {
- int index = GET_INT_FROM_POINTER(link->data);
+ int index = POINTER_AS_INT(link->data);
if (i < index)
break;
}
link = MEM_callocN(sizeof(LinkData), "PCLink");
- link->data = SET_INT_IN_POINTER(i);
+ link->data = POINTER_FROM_INT(i);
BLI_addtail(&ob->pc_ids, link);
return i;
@@ -3028,7 +3115,7 @@ static int pc_findindex(ListBase *listbase, int index)
link = listbase->first;
while (link) {
- if (GET_INT_FROM_POINTER(link->data) == index)
+ if (POINTER_AS_INT(link->data) == index)
return number;
number++;
@@ -3312,7 +3399,7 @@ int BKE_object_is_modified(Scene *scene, Object *ob)
* This makes it possible to give some degree of false-positives here,
* but it's currently an acceptable tradeoff between complexity and check
* speed. In combination with checks of modifier stack and real life usage
- * percentage of false-positives shouldn't be that hight.
+ * percentage of false-positives shouldn't be that height.
*/
static bool object_moves_in_time(Object *object)
{
@@ -3661,12 +3748,12 @@ KDTree *BKE_object_as_kdtree(Object *ob, int *r_tot)
Mesh *me = ob->data;
unsigned int i;
- DerivedMesh *dm = ob->derivedDeform ? ob->derivedDeform : ob->derivedFinal;
+ Mesh *me_eval = ob->runtime.mesh_deform_eval ? ob->runtime.mesh_deform_eval : ob->runtime.mesh_deform_eval;
const int *index;
- if (dm && (index = CustomData_get_layer(&dm->vertData, CD_ORIGINDEX))) {
- MVert *mvert = dm->getVertArray(dm);
- unsigned int totvert = dm->getNumVerts(dm);
+ if (me_eval && (index = CustomData_get_layer(&me_eval->vdata, CD_ORIGINDEX))) {
+ MVert *mvert = me_eval->mvert;
+ uint totvert = me_eval->totvert;
/* tree over-allocs in case where some verts have ORIGINDEX_NONE */
tot = 0;
@@ -3935,7 +4022,7 @@ bool BKE_object_modifier_update_subframe(
if (ob->track) no_update |= BKE_object_modifier_update_subframe(depsgraph, scene, ob->track, 0, recursion, frame, type);
/* skip subframe if object is parented
- * to vertex of a dynamic paint canvas */
+ * to vertex of a dynamic paint canvas */
if (no_update && (ob->partype == PARVERT1 || ob->partype == PARVERT3))
return false;
@@ -3964,7 +4051,7 @@ bool BKE_object_modifier_update_subframe(
BKE_animsys_evaluate_animdata(depsgraph, scene, &ob->id, ob->adt, frame, ADT_RECALC_ANIM);
if (update_mesh) {
/* ignore cache clear during subframe updates
- * to not mess up cache validity */
+ * to not mess up cache validity */
object_cacheIgnoreClear(ob, 1);
BKE_object_handle_update(depsgraph, scene, ob);
object_cacheIgnoreClear(ob, 0);
diff --git a/source/blender/blenkernel/intern/object_deform.c b/source/blender/blenkernel/intern/object_deform.c
index b8273703a94..70569bfd51b 100644
--- a/source/blender/blenkernel/intern/object_deform.c
+++ b/source/blender/blenkernel/intern/object_deform.c
@@ -403,7 +403,7 @@ static void object_defgroup_remove_edit_mode(Object *ob, bDeformGroup *dg)
*/
void BKE_object_defgroup_remove(Object *ob, bDeformGroup *defgroup)
{
- if ((ob) && (ob->type == OB_GPENCIL)) {
+ if (ob->type == OB_GPENCIL) {
BKE_gpencil_vgroup_remove(ob, defgroup);
}
else {
@@ -412,7 +412,7 @@ void BKE_object_defgroup_remove(Object *ob, bDeformGroup *defgroup)
else
object_defgroup_remove_object_mode(ob, defgroup);
- BKE_mesh_batch_cache_dirty_tag(ob->data, BKE_MESH_BATCH_DIRTY_ALL);
+ BKE_object_batch_cache_dirty_tag(ob);
}
}
@@ -633,7 +633,7 @@ bool *BKE_object_defgroup_validmap_get(Object *ob, const int defbase_tot)
val_p = BLI_ghash_lookup_p(gh, chan->name);
if (val_p) {
- *val_p = SET_INT_IN_POINTER(1);
+ *val_p = POINTER_FROM_INT(1);
}
}
}
diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c
index 9f6cdcd5179..d9aa6407474 100644
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@ -44,18 +44,19 @@
#include "DNA_anim_types.h"
#include "DNA_collection_types.h"
#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
#include "DNA_scene_types.h"
#include "DNA_vfont_types.h"
#include "BKE_animsys.h"
#include "BKE_collection.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_font.h"
#include "BKE_global.h"
#include "BKE_idprop.h"
#include "BKE_lattice.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
+#include "BKE_mesh_iterators.h"
#include "BKE_mesh_runtime.h"
#include "BKE_object.h"
#include "BKE_particle.h"
@@ -242,7 +243,7 @@ static void make_child_duplis(const DupliContext *ctx, void *userdata, MakeChild
/* mballs have a different dupli handling */
if (ob->type != OB_MBALL) {
- ob->flag |= OB_DONE; /* doesnt render */
+ ob->flag |= OB_DONE; /* doesn't render */
}
make_child_duplis_cb(&pctx, userdata, ob);
}
@@ -260,7 +261,7 @@ static void make_child_duplis(const DupliContext *ctx, void *userdata, MakeChild
/* mballs have a different dupli handling */
if (ob->type != OB_MBALL)
- ob->flag |= OB_DONE; /* doesnt render */
+ ob->flag |= OB_DONE; /* doesn't render */
make_child_duplis_cb(&pctx, userdata, ob);
}
@@ -389,7 +390,7 @@ static const DupliGenerator gen_dupli_frames = {
/* OB_DUPLIVERTS */
typedef struct VertexDupliData {
- DerivedMesh *dm;
+ Mesh *me_eval;
BMEditMesh *edit_btmesh;
int totvert;
float (*orco)[3];
@@ -459,37 +460,15 @@ static void vertex_dupli__mapFunc(void *userData, int index, const float co[3],
static void make_child_duplis_verts(const DupliContext *ctx, void *userdata, Object *child)
{
VertexDupliData *vdd = userdata;
- DerivedMesh *dm = vdd->dm;
+ Mesh *me_eval = vdd->me_eval;
vdd->inst_ob = child;
invert_m4_m4(child->imat, child->obmat);
/* relative transform from parent to child space */
mul_m4_m4m4(vdd->child_imat, child->imat, ctx->object->obmat);
- if (vdd->edit_btmesh) {
- dm->foreachMappedVert(dm, vertex_dupli__mapFunc, vdd,
- vdd->use_rotation ? DM_FOREACH_USE_NORMAL : 0);
- }
- else {
- int a, totvert = vdd->totvert;
- float vec[3], no[3];
-
- if (vdd->use_rotation) {
- for (a = 0; a < totvert; a++) {
- dm->getVertCo(dm, a, vec);
- dm->getVertNo(dm, a, no);
-
- vertex_dupli__mapFunc(vdd, a, vec, no, NULL);
- }
- }
- else {
- for (a = 0; a < totvert; a++) {
- dm->getVertCo(dm, a, vec);
-
- vertex_dupli__mapFunc(vdd, a, vec, NULL, NULL);
- }
- }
- }
+ BKE_mesh_foreach_mapped_vert(me_eval, vertex_dupli__mapFunc, vdd,
+ vdd->use_rotation ? MESH_FOREACH_USE_NORMAL : 0);
}
static void make_duplis_verts(const DupliContext *ctx)
@@ -504,32 +483,31 @@ static void make_duplis_verts(const DupliContext *ctx)
/* gather mesh info */
{
- Mesh *me = parent->data;
- BMEditMesh *em = BKE_editmesh_from_object(parent);
CustomDataMask dm_mask = (use_texcoords ? CD_MASK_BAREMESH | CD_MASK_ORCO : CD_MASK_BAREMESH);
+ vdd.edit_btmesh = BKE_editmesh_from_object(parent);
- if (DEG_get_mode(ctx->depsgraph) == DAG_EVAL_RENDER) {
- vdd.dm = mesh_create_derived_render(ctx->depsgraph, scene, parent, dm_mask);
- }
- else if (em) {
- vdd.dm = editbmesh_get_derived_cage(ctx->depsgraph, scene, parent, em, dm_mask);
+ /* We do not need any render-smecific handling anymore, depsgraph takes care of that. */
+ if (vdd.edit_btmesh != NULL) {
+ /* XXX TODO replace with equivalent of editbmesh_get_eval_cage when available. */
+ vdd.me_eval = mesh_get_eval_deform(ctx->depsgraph, scene, parent, dm_mask);
}
else {
- vdd.dm = mesh_get_derived_final(ctx->depsgraph, scene, parent, dm_mask);
+ vdd.me_eval = mesh_get_eval_final(ctx->depsgraph, scene, parent, dm_mask);
}
- vdd.edit_btmesh = me->edit_btmesh;
- if (use_texcoords)
- vdd.orco = vdd.dm->getVertDataArray(vdd.dm, CD_ORCO);
- else
+ if (use_texcoords) {
+ vdd.orco = CustomData_get_layer(&vdd.me_eval->vdata, CD_ORCO);
+ }
+ else {
vdd.orco = NULL;
+ }
- vdd.totvert = vdd.dm->getNumVerts(vdd.dm);
+ vdd.totvert = vdd.me_eval->totvert;
}
make_child_duplis(ctx, &vdd, make_child_duplis_verts);
- vdd.dm->release(vdd.dm);
+ vdd.me_eval = NULL;
}
static const DupliGenerator gen_dupli_verts = {
@@ -542,7 +520,7 @@ static Object *find_family_object(Main *bmain, const char *family, size_t family
{
Object **ob_pt;
Object *ob;
- void *ch_key = SET_UINT_IN_POINTER(ch);
+ void *ch_key = POINTER_FROM_UINT(ch);
if ((ob_pt = (Object **)BLI_ghash_lookup_p(family_gh, ch_key))) {
ob = *ob_pt;
@@ -654,7 +632,7 @@ static const DupliGenerator gen_dupli_verts_font = {
/* OB_DUPLIFACES */
typedef struct FaceDupliData {
- DerivedMesh *dm;
+ Mesh *me_eval;
int totface;
MPoly *mpoly;
MLoop *mloop;
@@ -778,36 +756,34 @@ static void make_duplis_faces(const DupliContext *ctx)
BMEditMesh *em = BKE_editmesh_from_object(parent);
CustomDataMask dm_mask = (use_texcoords ? CD_MASK_BAREMESH | CD_MASK_ORCO | CD_MASK_MLOOPUV : CD_MASK_BAREMESH);
- if (DEG_get_mode(ctx->depsgraph) == DAG_EVAL_RENDER) {
- fdd.dm = mesh_create_derived_render(ctx->depsgraph, scene, parent, dm_mask);
- }
- else if (em) {
- fdd.dm = editbmesh_get_derived_cage(ctx->depsgraph, scene, parent, em, dm_mask);
+ /* We do not need any render-smecific handling anymore, depsgraph takes care of that. */
+ if (em != NULL) {
+ /* XXX TODO replace with equivalent of editbmesh_get_eval_cage when available. */
+ fdd.me_eval = mesh_get_eval_deform(ctx->depsgraph, scene, parent, dm_mask);
}
else {
- fdd.dm = mesh_get_derived_final(ctx->depsgraph, scene, parent, dm_mask);
+ fdd.me_eval = mesh_get_eval_final(ctx->depsgraph, scene, parent, dm_mask);
}
if (use_texcoords) {
- CustomData *ml_data = fdd.dm->getLoopDataLayout(fdd.dm);
- const int uv_idx = CustomData_get_render_layer(ml_data, CD_MLOOPUV);
- fdd.orco = fdd.dm->getVertDataArray(fdd.dm, CD_ORCO);
- fdd.mloopuv = CustomData_get_layer_n(ml_data, CD_MLOOPUV, uv_idx);
+ fdd.orco = CustomData_get_layer(&fdd.me_eval->vdata, CD_ORCO);
+ const int uv_idx = CustomData_get_render_layer(&fdd.me_eval->ldata, CD_MLOOPUV);
+ fdd.mloopuv = CustomData_get_layer_n(&fdd.me_eval->ldata, CD_MLOOPUV, uv_idx);
}
else {
fdd.orco = NULL;
fdd.mloopuv = NULL;
}
- fdd.totface = fdd.dm->getNumPolys(fdd.dm);
- fdd.mpoly = fdd.dm->getPolyArray(fdd.dm);
- fdd.mloop = fdd.dm->getLoopArray(fdd.dm);
- fdd.mvert = fdd.dm->getVertArray(fdd.dm);
+ fdd.totface = fdd.me_eval->totpoly;
+ fdd.mpoly = fdd.me_eval->mpoly;
+ fdd.mloop = fdd.me_eval->mloop;
+ fdd.mvert = fdd.me_eval->mvert;
}
make_child_duplis(ctx, &fdd, make_child_duplis_faces);
- fdd.dm->release(fdd.dm);
+ fdd.me_eval = NULL;
}
static const DupliGenerator gen_dupli_faces = {
@@ -1259,59 +1235,3 @@ int count_duplilist(Object *ob)
}
return 1;
}
-
-DupliApplyData *duplilist_apply(Depsgraph *depsgraph, Object *ob, Scene *scene, ListBase *duplilist)
-{
- DupliApplyData *apply_data = NULL;
- int num_objects = BLI_listbase_count(duplilist);
-
- if (num_objects > 0) {
- DupliObject *dob;
- int i;
- apply_data = MEM_mallocN(sizeof(DupliApplyData), "DupliObject apply data");
- apply_data->num_objects = num_objects;
- apply_data->extra = MEM_mallocN(sizeof(DupliExtraData) * (size_t) num_objects,
- "DupliObject apply extra data");
-
- for (dob = duplilist->first, i = 0; dob; dob = dob->next, ++i) {
- /* make sure derivedmesh is calculated once, before drawing */
- if (scene && !(dob->ob->transflag & OB_DUPLICALCDERIVED) && dob->ob->type == OB_MESH) {
- mesh_get_derived_final(depsgraph, scene, dob->ob, scene->customdata_mask);
- dob->ob->transflag |= OB_DUPLICALCDERIVED;
- }
- }
-
- for (dob = duplilist->first, i = 0; dob; dob = dob->next, ++i) {
- /* copy obmat from duplis */
- copy_m4_m4(apply_data->extra[i].obmat, dob->ob->obmat);
- copy_m4_m4(dob->ob->obmat, dob->mat);
-
- /* copy layers from the main duplicator object */
- apply_data->extra[i].lay = dob->ob->lay;
- dob->ob->lay = ob->lay;
- }
- }
- return apply_data;
-}
-
-void duplilist_restore(ListBase *duplilist, DupliApplyData *apply_data)
-{
- DupliObject *dob;
- int i;
- /* Restore object matrices.
- * NOTE: this has to happen in reverse order, since nested
- * dupli objects can repeatedly override the obmat.
- */
- for (dob = duplilist->last, i = apply_data->num_objects - 1; dob; dob = dob->prev, --i) {
- copy_m4_m4(dob->ob->obmat, apply_data->extra[i].obmat);
- dob->ob->transflag &= ~OB_DUPLICALCDERIVED;
-
- dob->ob->lay = apply_data->extra[i].lay;
- }
-}
-
-void duplilist_free_apply_data(DupliApplyData *apply_data)
-{
- MEM_freeN(apply_data->extra);
- MEM_freeN(apply_data);
-}
diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenkernel/intern/object_update.c
index 8b82053868a..902237d7ac8 100644
--- a/source/blender/blenkernel/intern/object_update.c
+++ b/source/blender/blenkernel/intern/object_update.c
@@ -146,8 +146,17 @@ void BKE_object_eval_done(Depsgraph *depsgraph, Object *ob)
if (DEG_is_active(depsgraph)) {
Object *ob_orig = DEG_get_original_object(ob);
copy_m4_m4(ob_orig->obmat, ob->obmat);
+ copy_m4_m4(ob_orig->constinv, ob->constinv);
ob_orig->transflag = ob->transflag;
ob_orig->flag = ob->flag;
+
+ BoundBox *bb = BKE_object_boundbox_get(ob);
+ if (bb != NULL) {
+ if (ob_orig->bb == NULL) {
+ ob_orig->bb = MEM_mallocN(sizeof(*ob_orig->bb), __func__);
+ }
+ *ob_orig->bb = *bb;
+ }
}
}
@@ -161,8 +170,7 @@ void BKE_object_handle_data_update(
Key *key;
float ctime = BKE_scene_frame_get(scene);
- if (G.debug & G_DEBUG_DEPSGRAPH_EVAL)
- printf("recalcdata %s\n", ob->id.name + 2);
+ DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
/* TODO(sergey): Only used by legacy depsgraph. */
if (adt) {
@@ -235,7 +243,7 @@ void BKE_object_handle_data_update(
case OB_EMPTY:
if (ob->empty_drawtype == OB_EMPTY_IMAGE && ob->data)
if (BKE_image_is_animated(ob->data))
- BKE_image_user_check_frame_calc(ob->iuser, (int)ctime, 0);
+ BKE_image_user_check_frame_calc(ob->iuser, (int)ctime);
break;
}
@@ -372,16 +380,19 @@ void BKE_object_data_select_update(Depsgraph *depsgraph, ID *object_data)
DEG_debug_print_eval(depsgraph, __func__, object_data->name, object_data);
switch (GS(object_data->name)) {
case ID_ME:
- BKE_mesh_batch_cache_dirty_tag((Mesh *)object_data,
- BKE_CURVE_BATCH_DIRTY_SELECT);
+ BKE_mesh_batch_cache_dirty_tag(
+ (Mesh *)object_data,
+ BKE_MESH_BATCH_DIRTY_SELECT);
break;
case ID_CU:
- BKE_curve_batch_cache_dirty_tag((Curve *)object_data,
- BKE_CURVE_BATCH_DIRTY_SELECT);
+ BKE_curve_batch_cache_dirty_tag(
+ (Curve *)object_data,
+ BKE_CURVE_BATCH_DIRTY_SELECT);
break;
case ID_LT:
- BKE_lattice_batch_cache_dirty_tag((struct Lattice *)object_data,
- BKE_CURVE_BATCH_DIRTY_SELECT);
+ BKE_lattice_batch_cache_dirty_tag(
+ (struct Lattice *)object_data,
+ BKE_LATTICE_BATCH_DIRTY_SELECT);
break;
default:
break;
diff --git a/source/blender/blenkernel/intern/ocean.c b/source/blender/blenkernel/intern/ocean.c
index ab0130019b8..adbe1a7f889 100644
--- a/source/blender/blenkernel/intern/ocean.c
+++ b/source/blender/blenkernel/intern/ocean.c
@@ -242,14 +242,6 @@ static void init_complex(fftw_complex cmpl, float real, float image)
cmpl[1] = image;
}
-#if 0 /* unused */
-static void add_complex_f(fftw_complex res, fftw_complex cmpl, float f)
-{
- res[0] = cmpl[0] + f;
- res[1] = cmpl[1];
-}
-#endif
-
static void add_comlex_c(fftw_complex res, fftw_complex cmpl1, fftw_complex cmpl2)
{
res[0] = cmpl1[0] + cmpl2[0];
@@ -775,15 +767,6 @@ void BKE_ocean_simulate(struct Ocean *o, float t, float scale, float chop_amount
if (o->_do_normals) {
BLI_task_pool_push(pool, ocean_compute_normal_x, NULL, false, TASK_PRIORITY_HIGH);
BLI_task_pool_push(pool, ocean_compute_normal_z, NULL, false, TASK_PRIORITY_HIGH);
-
-#if 0
- for (i = 0; i < o->_M; ++i) {
- for (j = 0; j < o->_N; ++j) {
- o->_N_y[i * o->_N + j] = 1.0f / scale;
- }
- }
- (MEM01)
-#endif
o->_N_y = 1.0f / scale;
}
@@ -1257,30 +1240,12 @@ void BKE_ocean_simulate_cache(struct OceanCache *och, int frame)
cache_filename(string, och->bakepath, och->relbase, frame, CACHE_TYPE_DISPLACE);
och->ibufs_disp[f] = IMB_loadiffname(string, 0, NULL);
-#if 0
- if (och->ibufs_disp[f] == NULL)
- printf("error loading %s\n", string);
- else
- printf("loaded cache %s\n", string);
-#endif
cache_filename(string, och->bakepath, och->relbase, frame, CACHE_TYPE_FOAM);
och->ibufs_foam[f] = IMB_loadiffname(string, 0, NULL);
-#if 0
- if (och->ibufs_foam[f] == NULL)
- printf("error loading %s\n", string);
- else
- printf("loaded cache %s\n", string);
-#endif
cache_filename(string, och->bakepath, och->relbase, frame, CACHE_TYPE_NORMAL);
och->ibufs_norm[f] = IMB_loadiffname(string, 0, NULL);
-#if 0
- if (och->ibufs_norm[f] == NULL)
- printf("error loading %s\n", string);
- else
- printf("loaded cache %s\n", string);
-#endif
}
@@ -1355,13 +1320,6 @@ void BKE_ocean_bake(struct Ocean *o, struct OceanCache *och, void (*update_cb)(v
* break up the foam where height (Y) is low (wave valley), and X and Z displacement is greatest
*/
-#if 0
- vec[0] = ocr.disp[0];
- vec[1] = ocr.disp[2];
- hor_stretch = len_v2(vec);
- CLAMP(hor_stretch, 0.0, 1.0);
-#endif
-
neg_disp = ocr.disp[1] < 0.0f ? 1.0f + ocr.disp[1] : 1.0f;
neg_disp = neg_disp < 0.0f ? 0.0f : neg_disp;
@@ -1369,15 +1327,6 @@ void BKE_ocean_bake(struct Ocean *o, struct OceanCache *och, void (*update_cb)(v
neg_eplus = ocr.Eplus[2] < 0.0f ? 1.0f + ocr.Eplus[2] : 1.0f;
neg_eplus = neg_eplus < 0.0f ? 0.0f : neg_eplus;
-#if 0
- if (ocr.disp[1] < 0.0 || r > och->foam_fade)
- pr *= och->foam_fade;
-
-
- pr = pr * (1.0 - hor_stretch) * ocr.disp[1];
- pr = pr * neg_disp * neg_eplus;
-#endif
-
if (pr < 1.0f)
pr *= pr;
diff --git a/source/blender/blenkernel/intern/packedFile.c b/source/blender/blenkernel/intern/packedFile.c
index da455faaa86..0446b697c68 100644
--- a/source/blender/blenkernel/intern/packedFile.c
+++ b/source/blender/blenkernel/intern/packedFile.c
@@ -54,6 +54,7 @@
#include "BKE_font.h"
#include "BKE_global.h"
#include "BKE_image.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_packedFile.h"
#include "BKE_report.h"
@@ -264,33 +265,6 @@ void packAll(Main *bmain, ReportList *reports, bool verbose)
BKE_report(reports, RPT_INFO, "No new files have been packed");
}
-
-#if 0
-
-// attempt to create a function that generates an unique filename
-// this will work when all funtions in fileops.c understand relative filenames...
-
-static char *find_new_name(char *name)
-{
- char tempname[FILE_MAX];
- char *newname;
- size_t len;
-
- if (fop_exists(name)) {
- for (number = 1; number <= 999; number++) {
- BLI_snprintf(tempname, sizeof(tempname), "%s.%03d", name, number);
- if (!fop_exists(tempname)) {
- break;
- }
- }
- }
- len = strlen(tempname) + 1;
- newname = MEM_mallocN(len, "find_new_name");
- memcpy(newname, tempname, len * sizeof(char));
- return newname;
-}
-#endif
-
int writePackedFile(
ReportList *reports, const char *ref_file_name, const char *filename, PackedFile *pf, const bool guimode)
{
@@ -362,7 +336,7 @@ int writePackedFile(
*
* - PF_EQUAL: the packed file and original file are identical
* - PF_DIFFERENT: the packed file and original file differ
- * - PF_NOFILE: the original file doens't exist
+ * - PF_NOFILE: the original file doesn't exist
*/
int checkPackedFile(const char *ref_file_name, const char *filename, PackedFile *pf)
{
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index 6ccf4c1b761..e31021d7d48 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -55,6 +55,7 @@
#include "BKE_animsys.h"
#include "BKE_brush.h"
+#include "BKE_ccg.h"
#include "BKE_colortools.h"
#include "BKE_deform.h"
#include "BKE_main.h"
@@ -72,11 +73,14 @@
#include "BKE_object.h"
#include "BKE_paint.h"
#include "BKE_pbvh.h"
+#include "BKE_subdiv_ccg.h"
#include "BKE_subsurf.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
+#include "RNA_enum_types.h"
+
#include "bmesh.h"
const char PAINT_CURSOR_SCULPT[3] = {255, 100, 100};
@@ -154,7 +158,7 @@ Paint *BKE_paint_get_active_from_paintmode(Scene *sce, ePaintMode mode)
case ePaintWeight:
return &ts->wpaint->paint;
case ePaintTexture2D:
- case ePaintTextureProjective:
+ case ePaintTexture3D:
return &ts->imapaint.paint;
case ePaintSculptUV:
return &ts->uvsculpt->paint;
@@ -170,6 +174,43 @@ Paint *BKE_paint_get_active_from_paintmode(Scene *sce, ePaintMode mode)
return NULL;
}
+const EnumPropertyItem *BKE_paint_get_tool_enum_from_paintmode(ePaintMode mode)
+{
+ switch (mode) {
+ case ePaintSculpt:
+ return rna_enum_brush_sculpt_tool_items;
+ case ePaintVertex:
+ return rna_enum_brush_vertex_tool_items;
+ case ePaintWeight:
+ return rna_enum_brush_weight_tool_items;
+ case ePaintTexture2D:
+ case ePaintTexture3D:
+ return rna_enum_brush_image_tool_items;
+ case ePaintSculptUV:
+ return NULL;
+ case ePaintGpencil:
+ return rna_enum_brush_gpencil_types_items;
+ case ePaintInvalid:
+ break;
+ }
+ return NULL;
+}
+
+const char *BKE_paint_get_tool_prop_id_from_paintmode(ePaintMode mode)
+{
+ switch (mode) {
+ case ePaintSculpt: return "sculpt_tool";
+ case ePaintVertex: return "vertex_tool";
+ case ePaintWeight: return "weight_tool";
+ case ePaintTexture2D:
+ case ePaintTexture3D: return "image_tool";
+ case ePaintGpencil: return "gpencil_tool";
+ default:
+ /* invalid paint mode */
+ return NULL;
+ }
+}
+
Paint *BKE_paint_get_active(Scene *sce, ViewLayer *view_layer)
{
if (sce && view_layer) {
@@ -268,7 +309,7 @@ ePaintMode BKE_paintmode_get_active_from_context(const bContext *C)
case OB_MODE_WEIGHT_PAINT:
return ePaintWeight;
case OB_MODE_TEXTURE_PAINT:
- return ePaintTextureProjective;
+ return ePaintTexture3D;
case OB_MODE_EDIT:
if (ts->use_uv_sculpt)
return ePaintSculptUV;
@@ -286,6 +327,32 @@ ePaintMode BKE_paintmode_get_active_from_context(const bContext *C)
return ePaintInvalid;
}
+ePaintMode BKE_paintmode_get_from_tool(const struct bToolRef *tref)
+{
+ if (tref->space_type == SPACE_VIEW3D) {
+ switch (tref->mode) {
+ case CTX_MODE_SCULPT:
+ return ePaintSculpt;
+ case CTX_MODE_PAINT_VERTEX:
+ return ePaintVertex;
+ case CTX_MODE_PAINT_WEIGHT:
+ return ePaintWeight;
+ case CTX_MODE_GPENCIL_PAINT:
+ return ePaintGpencil;
+ case CTX_MODE_PAINT_TEXTURE:
+ return ePaintTexture3D;
+ }
+ }
+ else if (tref->space_type == SPACE_IMAGE) {
+ switch (tref->mode) {
+ case SI_MODE_PAINT:
+ return ePaintTexture2D;
+ }
+ }
+
+ return ePaintInvalid;
+}
+
Brush *BKE_paint_brush(Paint *p)
{
return p ? p->brush : NULL;
@@ -297,9 +364,64 @@ void BKE_paint_brush_set(Paint *p, Brush *br)
id_us_min((ID *)p->brush);
id_us_plus((ID *)br);
p->brush = br;
+
+ BKE_paint_toolslots_brush_update(p);
}
}
+void BKE_paint_runtime_init(const ToolSettings *ts, Paint *paint)
+{
+ if (paint == &ts->imapaint.paint) {
+ paint->runtime.tool_offset = offsetof(Brush, imagepaint_tool);
+ paint->runtime.ob_mode = OB_MODE_TEXTURE_PAINT;
+ }
+ else if (paint == &ts->sculpt->paint) {
+ paint->runtime.tool_offset = offsetof(Brush, sculpt_tool);
+ paint->runtime.ob_mode = OB_MODE_SCULPT;
+ }
+ else if (paint == &ts->vpaint->paint) {
+ paint->runtime.tool_offset = offsetof(Brush, vertexpaint_tool);
+ paint->runtime.ob_mode = OB_MODE_VERTEX_PAINT;
+ }
+ else if (paint == &ts->wpaint->paint) {
+ paint->runtime.tool_offset = offsetof(Brush, weightpaint_tool);
+ paint->runtime.ob_mode = OB_MODE_WEIGHT_PAINT;
+ }
+ else if (paint == &ts->gp_paint->paint) {
+ paint->runtime.tool_offset = offsetof(Brush, gpencil_tool);
+ paint->runtime.ob_mode = OB_MODE_GPENCIL_PAINT;
+ }
+ else if (paint == &ts->uvsculpt->paint) {
+ /* We don't use these yet. */
+ paint->runtime.tool_offset = 0;
+ paint->runtime.ob_mode = 0;
+ }
+ else {
+ BLI_assert(0);
+ }
+}
+
+uint BKE_paint_get_brush_tool_offset_from_paintmode(const ePaintMode mode)
+{
+ switch (mode) {
+ case ePaintTexture2D:
+ case ePaintTexture3D:
+ return offsetof(Brush, imagepaint_tool);
+ case ePaintSculpt:
+ return offsetof(Brush, sculpt_tool);
+ case ePaintVertex:
+ return offsetof(Brush, vertexpaint_tool);
+ case ePaintWeight:
+ return offsetof(Brush, weightpaint_tool);
+ case ePaintGpencil:
+ return offsetof(Brush, gpencil_tool);
+ case ePaintSculptUV:
+ case ePaintInvalid:
+ break; /* We don't use these yet. */
+ }
+ return 0;
+}
+
/** Free (or release) any data used by this paint curve (does not free the pcurve itself). */
void BKE_paint_curve_free(PaintCurve *pc)
{
@@ -396,10 +518,6 @@ void BKE_palette_clear(Palette *palette)
Palette *BKE_palette_add(Main *bmain, const char *name)
{
Palette *palette = BKE_id_new(bmain, ID_PAL, name);
-
- /* enable fake user by default */
- id_fake_user_set(&palette->id);
-
return palette;
}
@@ -428,6 +546,12 @@ void BKE_palette_make_local(Main *bmain, Palette *palette, const bool lib_local)
BKE_id_make_local_generic(bmain, &palette->id, true, lib_local);
}
+void BKE_palette_init(Palette *palette)
+{
+ /* Enable fake user by default. */
+ id_fake_user_set(&palette->id);
+}
+
/** Free (or release) any data used by this palette (does not free the palette itself). */
void BKE_palette_free(Palette *palette)
{
@@ -446,7 +570,7 @@ bool BKE_palette_is_empty(const struct Palette *palette)
return BLI_listbase_is_empty(&palette->colors);
}
-/* are we in vertex paint or weight pain face select mode? */
+/* are we in vertex paint or weight paint face select mode? */
bool BKE_paint_select_face_test(Object *ob)
{
return ( (ob != NULL) &&
@@ -493,7 +617,7 @@ void BKE_paint_cavity_curve_preset(Paint *p, int preset)
curvemapping_changed(p->cavity_curve, false);
}
-eObjectMode BKE_paint_object_mode_from_paint_mode(ePaintMode mode)
+eObjectMode BKE_paint_object_mode_from_paintmode(ePaintMode mode)
{
switch (mode) {
case ePaintSculpt:
@@ -502,9 +626,8 @@ eObjectMode BKE_paint_object_mode_from_paint_mode(ePaintMode mode)
return OB_MODE_VERTEX_PAINT;
case ePaintWeight:
return OB_MODE_WEIGHT_PAINT;
- case ePaintTextureProjective:
- return OB_MODE_TEXTURE_PAINT;
case ePaintTexture2D:
+ case ePaintTexture3D:
return OB_MODE_TEXTURE_PAINT;
case ePaintSculptUV:
return OB_MODE_EDIT;
@@ -514,6 +637,64 @@ eObjectMode BKE_paint_object_mode_from_paint_mode(ePaintMode mode)
}
}
+/**
+ * Call when entering each respective paint mode.
+ */
+bool BKE_paint_ensure(const ToolSettings *ts, struct Paint **r_paint)
+{
+ Paint *paint = NULL;
+ if (*r_paint) {
+ /* Note: 'ts->imapaint' is ignored, it's not allocated. */
+ BLI_assert(
+ ELEM(*r_paint,
+ &ts->gp_paint->paint,
+ &ts->sculpt->paint,
+ &ts->vpaint->paint,
+ &ts->wpaint->paint,
+ &ts->uvsculpt->paint));
+
+#ifdef DEBUG
+ struct Paint paint_test = **r_paint;
+ BKE_paint_runtime_init(ts, *r_paint);
+ /* Swap so debug doesn't hide errors when release fails. */
+ SWAP(Paint, **r_paint, paint_test);
+ BLI_assert(paint_test.runtime.ob_mode == (*r_paint)->runtime.ob_mode);
+ BLI_assert(paint_test.runtime.tool_offset == (*r_paint)->runtime.tool_offset);
+#endif
+ return true;
+ }
+
+ if (ELEM(*r_paint, &ts->vpaint->paint, &ts->wpaint->paint)) {
+ VPaint *data = MEM_callocN(sizeof(*data), __func__);
+ paint = &data->paint;
+ }
+ else if (*r_paint == &ts->sculpt->paint) {
+ Sculpt *data = MEM_callocN(sizeof(*data), __func__);
+ paint = &data->paint;
+
+ /* Turn on X plane mirror symmetry by default */
+ paint->symmetry_flags |= PAINT_SYMM_X;
+
+ /* Make sure at least dyntopo subdivision is enabled */
+ data->flags |= SCULPT_DYNTOPO_SUBDIVIDE | SCULPT_DYNTOPO_COLLAPSE;
+ }
+ else if (*r_paint == &ts->gp_paint->paint) {
+ GpPaint *data = MEM_callocN(sizeof(*data), __func__);
+ paint = &data->paint;
+ }
+ else if (*r_paint == &ts->uvsculpt->paint) {
+ UvSculpt *data = MEM_callocN(sizeof(*data), __func__);
+ paint = &data->paint;
+ }
+
+ paint->flags |= PAINT_SHOW_BRUSH;
+
+ BKE_paint_runtime_init(ts, paint);
+
+ *r_paint = paint;
+ return false;
+}
+
void BKE_paint_init(Main *bmain, Scene *sce, ePaintMode mode, const char col[3])
{
UnifiedPaintSettings *ups = &sce->toolsettings->unified_paint_settings;
@@ -523,7 +704,7 @@ void BKE_paint_init(Main *bmain, Scene *sce, ePaintMode mode, const char col[3])
/* If there's no brush, create one */
brush = BKE_paint_brush(paint);
if (brush == NULL) {
- eObjectMode ob_mode = BKE_paint_object_mode_from_paint_mode(mode);
+ eObjectMode ob_mode = BKE_paint_object_mode_from_paintmode(mode);
brush = BKE_brush_first_search(bmain, ob_mode);
if (!brush) {
@@ -545,6 +726,7 @@ void BKE_paint_init(Main *bmain, Scene *sce, ePaintMode mode, const char col[3])
void BKE_paint_free(Paint *paint)
{
curvemapping_free(paint->cavity_curve);
+ MEM_SAFE_FREE(paint->tool_slots);
}
/* called when copying scene settings, so even if 'src' and 'tar' are the same
@@ -555,10 +737,16 @@ void BKE_paint_copy(Paint *src, Paint *tar, const int flag)
{
tar->brush = src->brush;
tar->cavity_curve = curvemapping_copy(src->cavity_curve);
+ tar->tool_slots = MEM_dupallocN(src->tool_slots);
if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
id_us_plus((ID *)tar->brush);
id_us_plus((ID *)tar->palette);
+ if (src->tool_slots != NULL) {
+ for (int i = 0; i < tar->tool_slots_len; i++) {
+ id_us_plus((ID *)tar->tool_slots[i].brush);
+ }
+ }
}
}
@@ -873,6 +1061,17 @@ void BKE_sculpt_update_mesh_elements(
Depsgraph *depsgraph, Scene *scene, Sculpt *sd, Object *ob,
bool need_pmap, bool need_mask)
{
+ /* TODO(sergey): Make sure ob points to an original object. This is what it
+ * is supposed to be pointing to. The issue is, currently draw code takes
+ * care of PBVH creation, even though this is something up to dependency
+ * graph.
+ * Probably, we need to being back logic which was checking for sculpt mode
+ * and (re)create PBVH if needed in that case, similar to how DerivedMesh
+ * was handling this.
+ */
+ ob = DEG_get_original_object(ob);
+ Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
+
SculptSession *ss = ob->sculpt;
Mesh *me = BKE_object_get_original_mesh(ob);
MultiresModifierData *mmd = BKE_sculpt_multires_active(scene, ob);
@@ -909,8 +1108,7 @@ void BKE_sculpt_update_mesh_elements(
ss->kb = (mmd == NULL) ? BKE_keyblock_from_object(ob) : NULL;
- Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_BAREMESH);
- Mesh *me_eval_deform = mesh_get_eval_deform(depsgraph, scene, ob, CD_MASK_BAREMESH);
+ Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob_eval, CD_MASK_BAREMESH);
/* VWPaint require mesh info for loop lookup, so require sculpt mode here */
if (mmd && ob->mode & OB_MODE_SCULPT) {
@@ -931,7 +1129,9 @@ void BKE_sculpt_update_mesh_elements(
ss->vmask = CustomData_get_layer(&me->vdata, CD_PAINT_MASK);
}
- PBVH *pbvh = BKE_sculpt_object_pbvh_ensure(ob, me_eval_deform);
+ ss->subdiv_ccg = me_eval->runtime.subdiv_ccg;
+
+ PBVH *pbvh = BKE_sculpt_object_pbvh_ensure(depsgraph, ob);
BLI_assert(pbvh == ss->pbvh);
UNUSED_VARS_NDEBUG(pbvh);
MEM_SAFE_FREE(ss->pmap);
@@ -1069,18 +1269,9 @@ int BKE_sculpt_mask_layers_ensure(Object *ob, MultiresModifierData *mmd)
void BKE_sculpt_toolsettings_data_ensure(struct Scene *scene)
{
- Sculpt *sd = scene->toolsettings->sculpt;
- if (sd == NULL) {
- sd = scene->toolsettings->sculpt = MEM_callocN(sizeof(Sculpt), __func__);
-
- /* Turn on X plane mirror symmetry by default */
- sd->paint.symmetry_flags |= PAINT_SYMM_X;
- sd->paint.flags |= PAINT_SHOW_BRUSH;
-
- /* Make sure at least dyntopo subdivision is enabled */
- sd->flags |= SCULPT_DYNTOPO_SUBDIVIDE | SCULPT_DYNTOPO_COLLAPSE;
- }
+ BKE_paint_ensure(scene->toolsettings, (Paint **)&scene->toolsettings->sculpt);
+ Sculpt *sd = scene->toolsettings->sculpt;
if (!sd->detail_size) {
sd->detail_size = 12;
}
@@ -1127,68 +1318,95 @@ static bool check_sculpt_object_deformed(Object *object, const bool for_construc
return deformed;
}
-PBVH *BKE_sculpt_object_pbvh_ensure(Object *ob, Mesh *me_eval_deform)
+static PBVH *build_pbvh_for_dynamic_topology(Object *ob)
{
- if (!ob) {
- return NULL;
- }
+ PBVH *pbvh = BKE_pbvh_new();
+ BKE_pbvh_build_bmesh(pbvh, ob->sculpt->bm,
+ ob->sculpt->bm_smooth_shading,
+ ob->sculpt->bm_log, ob->sculpt->cd_vert_node_offset,
+ ob->sculpt->cd_face_node_offset);
+ pbvh_show_diffuse_color_set(pbvh, ob->sculpt->show_diffuse_color);
+ pbvh_show_mask_set(pbvh, ob->sculpt->show_mask);
+ return pbvh;
+}
- if (!ob->sculpt) {
- return NULL;
+static PBVH *build_pbvh_from_regular_mesh(Object *ob, Mesh *me_eval_deform)
+{
+ Mesh *me = BKE_object_get_original_mesh(ob);
+ const int looptris_num = poly_to_tri_count(me->totpoly, me->totloop);
+ PBVH *pbvh = BKE_pbvh_new();
+
+ MLoopTri *looptri = MEM_malloc_arrayN(
+ looptris_num, sizeof(*looptri), __func__);
+
+ BKE_mesh_recalc_looptri(
+ me->mloop, me->mpoly,
+ me->mvert,
+ me->totloop, me->totpoly,
+ looptri);
+
+ BKE_pbvh_build_mesh(
+ pbvh,
+ me->mpoly, me->mloop,
+ me->mvert, me->totvert, &me->vdata,
+ looptri, looptris_num);
+
+ pbvh_show_diffuse_color_set(pbvh, ob->sculpt->show_diffuse_color);
+ pbvh_show_mask_set(pbvh, ob->sculpt->show_mask);
+
+ const bool is_deformed = check_sculpt_object_deformed(ob, true);
+ if (is_deformed && me_eval_deform != NULL) {
+ int totvert;
+ float (*v_cos)[3] = BKE_mesh_vertexCos_get(me_eval_deform, &totvert);
+ BKE_pbvh_apply_vertCos(pbvh, v_cos, totvert);
+ MEM_freeN(v_cos);
}
- PBVH *pbvh = ob->sculpt->pbvh;
-
- /* Sculpting on a BMesh (dynamic-topology) gets a special PBVH */
- if (!pbvh && ob->sculpt->bm) {
- pbvh = BKE_pbvh_new();
+ return pbvh;
+}
- BKE_pbvh_build_bmesh(pbvh, ob->sculpt->bm,
- ob->sculpt->bm_smooth_shading,
- ob->sculpt->bm_log, ob->sculpt->cd_vert_node_offset,
- ob->sculpt->cd_face_node_offset);
+static PBVH *build_pbvh_from_ccg(Object *ob, SubdivCCG *subdiv_ccg)
+{
+ CCGKey key;
+ BKE_subdiv_ccg_key_top_level(&key, subdiv_ccg);
+ PBVH *pbvh = BKE_pbvh_new();
+ BKE_pbvh_build_grids(
+ pbvh,
+ subdiv_ccg->grids, subdiv_ccg->num_grids,
+ &key,
+ (void **)subdiv_ccg->grid_faces,
+ subdiv_ccg->grid_flag_mats,
+ subdiv_ccg->grid_hidden);
+ pbvh_show_diffuse_color_set(pbvh, ob->sculpt->show_diffuse_color);
+ pbvh_show_mask_set(pbvh, ob->sculpt->show_mask);
+ return pbvh;
+}
- pbvh_show_diffuse_color_set(pbvh, ob->sculpt->show_diffuse_color);
- pbvh_show_mask_set(pbvh, ob->sculpt->show_mask);
+PBVH *BKE_sculpt_object_pbvh_ensure(Depsgraph *depsgraph, Object *ob)
+{
+ if (ob == NULL || ob->sculpt == NULL) {
+ return NULL;
+ }
+ PBVH *pbvh = ob->sculpt->pbvh;
+ if (pbvh != NULL) {
+ /* Nothing to do, PBVH is already up to date. */
+ return pbvh;
}
- /* always build pbvh from original mesh, and only use it for drawing if
- * this evaluated mesh is just original mesh. it's the multires subsurf dm
- * that this is actually for, to support a pbvh on a modified mesh */
- if (!pbvh && ob->type == OB_MESH) {
- Mesh *me = BKE_object_get_original_mesh(ob);
- const int looptris_num = poly_to_tri_count(me->totpoly, me->totloop);
- MLoopTri *looptri;
- bool deformed;
-
- pbvh = BKE_pbvh_new();
-
- looptri = MEM_malloc_arrayN(looptris_num, sizeof(*looptri), __func__);
-
- BKE_mesh_recalc_looptri(
- me->mloop, me->mpoly,
- me->mvert,
- me->totloop, me->totpoly,
- looptri);
-
- BKE_pbvh_build_mesh(
- pbvh,
- me->mpoly, me->mloop,
- me->mvert, me->totvert, &me->vdata,
- looptri, looptris_num);
-
- pbvh_show_diffuse_color_set(pbvh, ob->sculpt->show_diffuse_color);
- pbvh_show_mask_set(pbvh, ob->sculpt->show_mask);
-
- deformed = check_sculpt_object_deformed(ob, true);
-
- if (deformed && me_eval_deform) {
- int totvert;
- float (*v_cos)[3];
-
- v_cos = BKE_mesh_vertexCos_get(me_eval_deform, &totvert);
- BKE_pbvh_apply_vertCos(pbvh, v_cos, totvert);
- MEM_freeN(v_cos);
+ if (ob->sculpt->bm != NULL) {
+ /* Sculpting on a BMesh (dynamic-topology) gets a special PBVH. */
+ pbvh = build_pbvh_for_dynamic_topology(ob);
+ }
+ else {
+ Object *object_eval = DEG_get_evaluated_object(depsgraph, ob);
+ Mesh *mesh_eval = object_eval->data;
+ if (mesh_eval->runtime.subdiv_ccg != NULL) {
+ pbvh = build_pbvh_from_ccg(ob, mesh_eval->runtime.subdiv_ccg);
+ }
+ else if (ob->type == OB_MESH) {
+ Mesh *me_eval_deform = mesh_get_eval_deform(
+ depsgraph, DEG_get_evaluated_scene(depsgraph), ob, CD_MASK_BAREMESH);
+ pbvh = build_pbvh_from_regular_mesh(ob, me_eval_deform);
}
}
diff --git a/source/blender/blenkernel/intern/paint_toolslots.c b/source/blender/blenkernel/intern/paint_toolslots.c
new file mode 100644
index 00000000000..92e42a0a468
--- /dev/null
+++ b/source/blender/blenkernel/intern/paint_toolslots.c
@@ -0,0 +1,140 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenkernel/intern/paint_toolslots.c
+ * \ingroup bke
+ */
+
+#include <limits.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_modifier_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_brush_types.h"
+
+#include "BLI_utildefines.h"
+
+#include "BKE_main.h"
+#include "BKE_library.h"
+#include "BKE_brush.h"
+#include "BKE_paint.h"
+
+void BKE_paint_toolslots_len_ensure(Paint *paint, int len)
+{
+ /* Tool slots are 'uchar'. */
+ BLI_assert(len <= UCHAR_MAX);
+ if (paint->tool_slots_len < len) {
+ paint->tool_slots = MEM_recallocN(paint->tool_slots, sizeof(*paint->tool_slots) * len);
+ paint->tool_slots_len = len;
+ }
+}
+
+static void paint_toolslots_init(Main *bmain, Paint *paint)
+{
+ if (paint == NULL) {
+ return;
+ }
+ const eObjectMode ob_mode = paint->runtime.ob_mode;
+ BLI_assert(paint->runtime.tool_offset && ob_mode);
+ for (Brush *brush = bmain->brush.first; brush; brush = brush->id.next) {
+ if (brush->ob_mode & ob_mode) {
+ const int slot_index = BKE_brush_tool_get(brush, paint);
+ BKE_paint_toolslots_len_ensure(paint, slot_index + 1);
+ if (paint->tool_slots[slot_index].brush == NULL) {
+ paint->tool_slots[slot_index].brush = brush;
+ id_us_plus(&brush->id);
+ }
+ }
+ }
+}
+
+void BKE_paint_toolslots_init_from_main(struct Main *bmain)
+{
+ for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) {
+ ToolSettings *ts = scene->toolsettings;
+ paint_toolslots_init(bmain, &ts->imapaint.paint);
+ paint_toolslots_init(bmain, &ts->sculpt->paint);
+ paint_toolslots_init(bmain, &ts->vpaint->paint);
+ paint_toolslots_init(bmain, &ts->wpaint->paint);
+ paint_toolslots_init(bmain, &ts->gp_paint->paint);
+ }
+}
+
+
+void BKE_paint_toolslots_brush_update_ex(Paint *paint, Brush *brush)
+{
+ const uint tool_offset = paint->runtime.tool_offset;
+ UNUSED_VARS_NDEBUG(tool_offset);
+ BLI_assert(tool_offset != 0);
+ const int slot_index = BKE_brush_tool_get(brush, paint);
+ BKE_paint_toolslots_len_ensure(paint, slot_index + 1);
+ PaintToolSlot *tslot = &paint->tool_slots[slot_index];
+ id_us_plus(&brush->id);
+ id_us_min(&tslot->brush->id);
+ tslot->brush = brush;
+}
+
+void BKE_paint_toolslots_brush_update(Paint *paint)
+{
+ if (paint->brush == NULL) {
+ return;
+ }
+ BKE_paint_toolslots_brush_update_ex(paint, paint->brush);
+}
+
+/**
+ * Run this to ensure brush types are set for each slot on entering modes
+ * (for new scenes for example).
+ */
+void BKE_paint_toolslots_brush_validate(Main *bmain, Paint *paint)
+{
+ /* Clear slots with invalid slots or mode (unlikely but possible). */
+ const uint tool_offset = paint->runtime.tool_offset;
+ UNUSED_VARS_NDEBUG(tool_offset);
+ const eObjectMode ob_mode = paint->runtime.ob_mode;
+ BLI_assert(tool_offset && ob_mode);
+ for (int i = 0; i < paint->tool_slots_len; i++) {
+ PaintToolSlot *tslot = &paint->tool_slots[i];
+ if (tslot->brush) {
+ if ((i != BKE_brush_tool_get(tslot->brush, paint)) ||
+ (tslot->brush->ob_mode & ob_mode) == 0)
+ {
+ id_us_min(&tslot->brush->id);
+ tslot->brush = NULL;
+ }
+ }
+ }
+
+ /* Unlikely but possible the active brush is not currently using a slot. */
+ BKE_paint_toolslots_brush_update(paint);
+
+ /* Fill slots from brushes. */
+ paint_toolslots_init(bmain, paint);
+}
+
+Brush *BKE_paint_toolslots_brush_get(Paint *paint, int slot_index)
+{
+ if (slot_index < paint->tool_slots_len) {
+ PaintToolSlot *tslot = &paint->tool_slots[slot_index];
+ return tslot->brush;
+ }
+ return NULL;
+}
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index da5efe3eeb8..cec27b8f187 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -232,23 +232,6 @@ void psys_set_current_num(Object *ob, int index)
}
}
-#if 0 /* UNUSED */
-Object *psys_find_object(Scene *scene, ParticleSystem *psys)
-{
- Base *base;
- ParticleSystem *tpsys;
-
- for (base = scene->base.first; base; base = base->next) {
- for (tpsys = base->object->particlesystem.first; psys; psys = psys->next) {
- if (tpsys == psys)
- return base->object;
- }
- }
-
- return NULL;
-}
-#endif
-
struct LatticeDeformData *psys_create_lattice_deform_data(ParticleSimulationData *sim)
{
struct LatticeDeformData *lattice_deform_data = NULL;
@@ -307,7 +290,7 @@ static PTCacheEdit *psys_orig_edit_get(ParticleSystem *psys)
return psys->orig_psys->edit;
}
-bool psys_in_edit_mode(Depsgraph *depsgraph, ParticleSystem *psys)
+bool psys_in_edit_mode(Depsgraph *depsgraph, const ParticleSystem *psys)
{
const ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph);
if (view_layer->basact == NULL) {
@@ -319,7 +302,7 @@ bool psys_in_edit_mode(Depsgraph *depsgraph, ParticleSystem *psys)
if (object->mode != OB_MODE_PARTICLE_EDIT) {
return false;
}
- ParticleSystem *psys_orig = psys_orig_get(psys);
+ const ParticleSystem *psys_orig = psys_orig_get((ParticleSystem *)psys);
return (psys_orig->edit || psys->pointcache->edit) &&
(use_render_params == false);
}
@@ -1399,7 +1382,7 @@ int psys_particle_dm_face_lookup(
LinkNode *tessface_node = poly_nodes[pindex_orig];
for (; tessface_node; tessface_node = tessface_node->next) {
- int findex_dst = GET_INT_FROM_POINTER(tessface_node->link);
+ int findex_dst = POINTER_AS_INT(tessface_node->link);
faceuv = osface_final[findex_dst].uv;
/* check that this intersects - Its possible this misses :/ -
@@ -2193,12 +2176,12 @@ static void psys_thread_create_path(ParticleTask *task, struct ChildParticle *cp
/*
* NOTE: Should in theory be the same as:
- cpa_num = psys_particle_dm_face_lookup(
- ctx->sim.psmd->dm_final,
- ctx->sim.psmd->dm_deformed,
- pa->num, pa->fuv,
- NULL);
- */
+ * cpa_num = psys_particle_dm_face_lookup(
+ * ctx->sim.psmd->dm_final,
+ * ctx->sim.psmd->dm_deformed,
+ * pa->num, pa->fuv,
+ * NULL);
+ */
cpa_num = (ELEM(pa->num_dmcache, DMCACHE_ISCHILD, DMCACHE_NOTFOUND))
? pa->num
: pa->num_dmcache;
@@ -2927,22 +2910,6 @@ void psys_get_from_key(ParticleKey *key, float loc[3], float vel[3], float rot[4
if (rot) copy_qt_qt(rot, key->rot);
if (time) *time = key->time;
}
-/*-------changing particle keys from space to another-------*/
-#if 0
-static void key_from_object(Object *ob, ParticleKey *key)
-{
- float q[4];
-
- add_v3_v3(key->vel, key->co);
-
- mul_m4_v3(ob->obmat, key->co);
- mul_m4_v3(ob->obmat, key->vel);
- mat4_to_quat(q, ob->obmat);
-
- sub_v3_v3v3(key->vel, key->vel, key->co);
- mul_qt_qtqt(key->rot, q, key->rot);
-}
-#endif
static void triatomat(float *v1, float *v2, float *v3, float (*uv)[2], float mat[4][4])
{
@@ -3850,14 +3817,6 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
}
}
- /* correct child ipo timing */
-#if 0 // XXX old animation system
- if ((part->flag & PART_ABS_TIME) == 0 && part->ipo) {
- calc_ipo(part->ipo, 100.0f * t);
- execute_ipo((ID *)part, part->ipo);
- }
-#endif // XXX old animation system
-
/* get different child parameters from textures & vgroups */
memset(&ctx, 0, sizeof(ParticleThreadContext));
ctx.sim = *sim;
diff --git a/source/blender/blenkernel/intern/particle_child.c b/source/blender/blenkernel/intern/particle_child.c
index f21b3a74fea..0cba5f5a2fc 100644
--- a/source/blender/blenkernel/intern/particle_child.c
+++ b/source/blender/blenkernel/intern/particle_child.c
@@ -299,11 +299,8 @@ void psys_apply_child_modifiers(ParticleThreadContext *ctx, struct ListBase *mod
int totkeys, k;
float max_length;
-#if 0 /* TODO for the future: use true particle modifiers that work on the whole curve */
- for (mod = modifiers->first; mod; mod = mod->next) {
- mod->apply(keys, totkeys, parent_keys);
- }
-#else
+ /* TODO for the future: use true particle modifiers that work on the whole curve */
+
(void)modifiers;
(void)mod;
@@ -379,7 +376,6 @@ void psys_apply_child_modifiers(ParticleThreadContext *ctx, struct ListBase *mod
}
}
}
-#endif
}
/* ------------------------------------------------------------------------- */
diff --git a/source/blender/blenkernel/intern/particle_distribute.c b/source/blender/blenkernel/intern/particle_distribute.c
index 2e056aa7a3f..6c5a9085e71 100644
--- a/source/blender/blenkernel/intern/particle_distribute.c
+++ b/source/blender/blenkernel/intern/particle_distribute.c
@@ -478,7 +478,7 @@ static void distribute_from_verts_exec(ParticleTask *thread, ParticleData *pa, i
int w, maxw;
psys_particle_on_dm(ctx->mesh,from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co1,0,0,0,orco1,0);
- BKE_mesh_orco_verts_transform((Mesh*)ob->data, &orco1, 1, 1);
+ BKE_mesh_orco_verts_transform(ob->data, &orco1, 1, 1);
maxw = BLI_kdtree_find_nearest_n(ctx->tree,orco1,ptn,3);
for (w=0; w<maxw; w++) {
@@ -671,7 +671,7 @@ static void distribute_children_exec(ParticleTask *thread, ChildParticle *cpa, i
float pweight[10];
psys_particle_on_dm(mesh,cfrom,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co1,nor1,NULL,NULL,orco1);
- BKE_mesh_orco_verts_transform((Mesh*)ob->data, &orco1, 1, 1);
+ BKE_mesh_orco_verts_transform(ob->data, &orco1, 1, 1);
maxw = BLI_kdtree_find_nearest_n(ctx->tree,orco1,ptn,3);
maxd=ptn[maxw-1].dist;
@@ -903,7 +903,7 @@ static int psys_thread_context_init_distribute(ParticleThreadContext *ctx, Parti
for (p=0,pa=psys->particles; p<totpart; p++,pa++) {
psys_particle_on_dm(mesh,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,nor,0,0,orco);
- BKE_mesh_orco_verts_transform((Mesh*)ob->data, &orco, 1, 1);
+ BKE_mesh_orco_verts_transform(ob->data, &orco, 1, 1);
BLI_kdtree_insert(tree, p, orco);
}
@@ -944,7 +944,7 @@ static int psys_thread_context_init_distribute(ParticleThreadContext *ctx, Parti
for (p=0; p<totvert; p++) {
if (orcodata) {
copy_v3_v3(co,orcodata[p]);
- BKE_mesh_orco_verts_transform((Mesh*)ob->data, &co, 1, 1);
+ BKE_mesh_orco_verts_transform(ob->data, &co, 1, 1);
}
else
copy_v3_v3(co,mv[p].co);
@@ -977,7 +977,7 @@ static int psys_thread_context_init_distribute(ParticleThreadContext *ctx, Parti
jitter_offset = MEM_callocN(sizeof(float) * totelem, "particle_distribution_jitoff");
/* Calculate weights from face areas */
- if ((part->flag&PART_EDISTR || children) && from != PART_FROM_VERT) {
+ if ((part->flag & PART_EDISTR || children) && from != PART_FROM_VERT) {
MVert *v1, *v2, *v3, *v4;
float totarea=0.f, co1[3], co2[3], co3[3], co4[3];
float (*orcodata)[3];
@@ -991,12 +991,12 @@ static int psys_thread_context_init_distribute(ParticleThreadContext *ctx, Parti
copy_v3_v3(co1, orcodata[mf->v1]);
copy_v3_v3(co2, orcodata[mf->v2]);
copy_v3_v3(co3, orcodata[mf->v3]);
- BKE_mesh_orco_verts_transform((Mesh*)ob->data, &co1, 1, 1);
- BKE_mesh_orco_verts_transform((Mesh*)ob->data, &co2, 1, 1);
- BKE_mesh_orco_verts_transform((Mesh*)ob->data, &co3, 1, 1);
+ BKE_mesh_orco_verts_transform(ob->data, &co1, 1, 1);
+ BKE_mesh_orco_verts_transform(ob->data, &co2, 1, 1);
+ BKE_mesh_orco_verts_transform(ob->data, &co3, 1, 1);
if (mf->v4) {
copy_v3_v3(co4, orcodata[mf->v4]);
- BKE_mesh_orco_verts_transform((Mesh*)ob->data, &co4, 1, 1);
+ BKE_mesh_orco_verts_transform(ob->data, &co4, 1, 1);
}
}
else {
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index de4d25a95d9..c363d9f29c2 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -369,7 +369,7 @@ void psys_calc_dmcache(Object *ob, Mesh *mesh_final, Mesh *mesh_original, Partic
for (i=0, node=nodedmelem; i<totdmelem; i++, node++) {
int origindex_final;
- node->link = SET_INT_IN_POINTER(i);
+ node->link = POINTER_FROM_INT(i);
/* may be vertex or face origindex */
if (use_modifier_stack) {
@@ -412,7 +412,7 @@ void psys_calc_dmcache(Object *ob, Mesh *mesh_final, Mesh *mesh_original, Partic
else {
if (psys->part->from == PART_FROM_VERT) {
if (pa->num < totelem && nodearray[pa->num])
- pa->num_dmcache= GET_INT_FROM_POINTER(nodearray[pa->num]->link);
+ pa->num_dmcache= POINTER_AS_INT(nodearray[pa->num]->link);
else
pa->num_dmcache = DMCACHE_NOTFOUND;
}
@@ -1550,7 +1550,7 @@ static EdgeHash *sph_springhash_build(ParticleSystem *psys)
springhash = BLI_edgehash_new_ex(__func__, psys->tot_fluidsprings);
for (i=0, spring=psys->fluid_springs; i<psys->tot_fluidsprings; i++, spring++)
- BLI_edgehash_insert(springhash, spring->particle_index[0], spring->particle_index[1], SET_INT_IN_POINTER(i+1));
+ BLI_edgehash_insert(springhash, spring->particle_index[0], spring->particle_index[1], POINTER_FROM_INT(i+1));
return springhash;
}
@@ -1614,7 +1614,7 @@ static void sph_density_accum_cb(void *userdata, int index, const float co[3], f
/* Ugh! One particle has too many neighbors! If some aren't taken into
* account, the forces will be biased by the tree search order. This
- * effectively adds enery to the system, and results in a churning motion.
+ * effectively adds energy to the system, and results in a churning motion.
* But, we have to stop somewhere, and it's not the end of the world.
* - jahka and z0r
*/
@@ -1752,7 +1752,7 @@ static void sph_force_cb(void *sphdata_v, ParticleKey *state, float *force, floa
/* Viscoelastic spring force */
if (pfn->psys == psys[0] && fluid->flag & SPH_VISCOELASTIC_SPRINGS && springhash) {
/* BLI_edgehash_lookup appears to be thread-safe. - z0r */
- spring_index = GET_INT_FROM_POINTER(BLI_edgehash_lookup(springhash, index, pfn->index));
+ spring_index = POINTER_AS_INT(BLI_edgehash_lookup(springhash, index, pfn->index));
if (spring_index) {
spring = psys[0]->fluid_springs + spring_index - 1;
@@ -3170,8 +3170,7 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
if (!psys->clmd) {
psys->clmd = (ClothModifierData*)modifier_new(eModifierType_Cloth);
psys->clmd->sim_parms->goalspring = 0.0f;
- psys->clmd->sim_parms->vel_damping = 1.0f;
- psys->clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_GOAL|CLOTH_SIMSETTINGS_FLAG_NO_SPRING_COMPRESS;
+ psys->clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESIST_SPRING_COMPRESS;
psys->clmd->coll_parms->flags &= ~CLOTH_COLLSETTINGS_FLAG_SELF;
}
@@ -4069,9 +4068,7 @@ static void system_step(ParticleSimulationData *sim, float cfra, const bool use_
sim->courant_num = 0.0f;
dynamics_step(sim, cfra+dframe+t_frac - 1.f);
psys->cfra = cfra+dframe+t_frac - 1.f;
-#if 0
- printf("%f,%f,%f,%f\n", cfra+dframe+t_frac - 1.f, t_frac, dt_frac, sim->courant_num);
-#endif
+
if (part->time_flag & PART_TIME_AUTOSF)
update_timestep(psys, sim);
/* Even without AUTOSF dt_frac may not add up to 1.0 due to float precision. */
@@ -4349,7 +4346,7 @@ void particle_system_update(struct Depsgraph *depsgraph, Scene *scene, Object *o
pa->flag &= ~PARS_NO_DISP;
}
- /* free unexisting after reseting particles */
+ /* free unexisting after resetting particles */
if (free_unexisting)
free_unexisting_particles(&sim);
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index 00d6fa96856..413f0407c86 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -247,7 +247,7 @@ static int map_insert_vert(PBVH *bvh, GHash *map,
{
void *key, **value_p;
- key = SET_INT_IN_POINTER(vertex);
+ key = POINTER_FROM_INT(vertex);
if (!BLI_ghash_ensure_p(map, key, &value_p)) {
int value_i;
if (BLI_BITMAP_TEST(bvh->vert_bitmap, vertex) == 0) {
@@ -259,11 +259,11 @@ static int map_insert_vert(PBVH *bvh, GHash *map,
value_i = ~(*face_verts);
(*face_verts)++;
}
- *value_p = SET_INT_IN_POINTER(value_i);
+ *value_p = POINTER_FROM_INT(value_i);
return value_i;
}
else {
- return GET_INT_FROM_POINTER(*value_p);
+ return POINTER_AS_INT(*value_p);
}
}
@@ -304,13 +304,13 @@ static void build_mesh_leaf_node(PBVH *bvh, PBVHNode *node)
GHashIterator gh_iter;
GHASH_ITER (gh_iter, map) {
void *value = BLI_ghashIterator_getValue(&gh_iter);
- int ndx = GET_INT_FROM_POINTER(value);
+ int ndx = POINTER_AS_INT(value);
if (ndx < 0)
ndx = -ndx + node->uniq_verts - 1;
vert_indices[ndx] =
- GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(&gh_iter));
+ POINTER_AS_INT(BLI_ghashIterator_getKey(&gh_iter));
}
for (int i = 0; i < totface; ++i) {
@@ -608,11 +608,6 @@ void BKE_pbvh_build_grids(PBVH *bvh, CCGElem **grids,
MEM_freeN(prim_bbc);
}
-void BKE_pbvh_set_ccgdm(PBVH *bvh, CCGDerivedMesh *ccgdm)
-{
- bvh->ccgdm = ccgdm;
-}
-
PBVH *BKE_pbvh_new(void)
{
PBVH *bvh = MEM_callocN(sizeof(PBVH), "pbvh");
@@ -642,7 +637,6 @@ void BKE_pbvh_free(PBVH *bvh)
BLI_gset_free(node->bm_other_verts, NULL);
}
}
- GPU_pbvh_multires_buffers_free(&bvh->grid_common_gpu_buffer);
if (bvh->deformed) {
if (bvh->verts) {
@@ -921,7 +915,7 @@ static void BKE_pbvh_search_callback_occluded(PBVH *bvh,
static bool update_search_cb(PBVHNode *node, void *data_v)
{
- int flag = GET_INT_FROM_POINTER(data_v);
+ int flag = POINTER_AS_INT(data_v);
if (node->flag & PBVH_Leaf)
return (node->flag & flag) != 0;
@@ -1122,19 +1116,21 @@ static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode **nodes, int totnode)
switch (bvh->type) {
case PBVH_GRIDS:
node->draw_buffers =
- GPU_pbvh_grid_buffers_build(node->prim_indices,
- node->totprim,
- bvh->grid_hidden,
- bvh->gridkey.grid_size,
- &bvh->gridkey, &bvh->grid_common_gpu_buffer);
+ GPU_pbvh_grid_buffers_build(
+ node->prim_indices,
+ node->totprim,
+ bvh->grid_hidden,
+ bvh->gridkey.grid_size,
+ &bvh->gridkey);
break;
case PBVH_FACES:
node->draw_buffers =
- GPU_pbvh_mesh_buffers_build(node->face_vert_indices,
- bvh->mpoly, bvh->mloop, bvh->looptri,
- bvh->verts,
- node->prim_indices,
- node->totprim);
+ GPU_pbvh_mesh_buffers_build(
+ node->face_vert_indices,
+ bvh->mpoly, bvh->mloop, bvh->looptri,
+ bvh->verts,
+ node->prim_indices,
+ node->totprim);
break;
case PBVH_BMESH:
node->draw_buffers =
@@ -1224,7 +1220,7 @@ void BKE_pbvh_update(PBVH *bvh, int flag, float (*fnors)[3])
PBVHNode **nodes;
int totnode;
- BKE_pbvh_search_gather(bvh, update_search_cb, SET_INT_IN_POINTER(flag),
+ BKE_pbvh_search_gather(bvh, update_search_cb, POINTER_FROM_INT(flag),
&nodes, &totnode);
if (flag & PBVH_UpdateNormals)
@@ -1345,12 +1341,13 @@ void BKE_pbvh_get_grid_key(const PBVH *bvh, CCGKey *key)
*key = bvh->gridkey;
}
-CCGDerivedMesh *BKE_pbvh_get_ccgdm(const PBVH *bvh)
+struct CCGElem **BKE_pbvh_get_grids(const PBVH *bvh, int *num_grids)
{
- return bvh->ccgdm;
+ BLI_assert(bvh->type == PBVH_GRIDS);
+ *num_grids = bvh->totgrid;
+ return bvh->grids;
}
-
BMesh *BKE_pbvh_get_bmesh(PBVH *bvh)
{
BLI_assert(bvh->type == PBVH_BMESH);
@@ -2090,7 +2087,7 @@ void BKE_pbvh_draw_cb(
PBVHNode **nodes;
int totnode;
- BKE_pbvh_search_gather(bvh, update_search_cb, SET_INT_IN_POINTER(PBVH_UpdateNormals | PBVH_UpdateDrawBuffers),
+ BKE_pbvh_search_gather(bvh, update_search_cb, POINTER_FROM_INT(PBVH_UpdateNormals | PBVH_UpdateDrawBuffers),
&nodes, &totnode);
pbvh_update_normals(bvh, nodes, totnode, fnors);
diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index e32a5d0681e..3369b05ea60 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -27,7 +27,7 @@
#include "BLI_utildefines.h"
#include "BLI_buffer.h"
#include "BLI_ghash.h"
-#include "BLI_heap.h"
+#include "BLI_heap_simple.h"
#include "BLI_math.h"
#include "BLI_memarena.h"
@@ -721,7 +721,7 @@ static void pbvh_bmesh_node_drop_orig(PBVHNode *node)
struct EdgeQueue;
typedef struct EdgeQueue {
- Heap *heap;
+ HeapSimple *heap;
const float *center;
float center_proj[3]; /* for when we use projected coords. */
float radius_squared;
@@ -840,7 +840,7 @@ static void edge_queue_insert(
BMVert **pair = BLI_mempool_alloc(eq_ctx->pool);
pair[0] = e->v1;
pair[1] = e->v2;
- BLI_heap_insert(eq_ctx->q->heap, priority, pair);
+ BLI_heapsimple_insert(eq_ctx->q->heap, priority, pair);
#ifdef USE_EDGEQUEUE_TAG
BLI_assert(EDGE_QUEUE_TEST(e) == false);
EDGE_QUEUE_ENABLE(e);
@@ -1008,7 +1008,7 @@ static void long_edge_queue_create(
PBVH *bvh, const float center[3], const float view_normal[3],
float radius, const bool use_frontface, const bool use_projected)
{
- eq_ctx->q->heap = BLI_heap_new();
+ eq_ctx->q->heap = BLI_heapsimple_new();
eq_ctx->q->center = center;
eq_ctx->q->radius_squared = radius * radius;
eq_ctx->q->limit_len_squared = bvh->bm_max_edge_len * bvh->bm_max_edge_len;
@@ -1070,7 +1070,7 @@ static void short_edge_queue_create(
PBVH *bvh, const float center[3], const float view_normal[3],
float radius, const bool use_frontface, const bool use_projected)
{
- eq_ctx->q->heap = BLI_heap_new();
+ eq_ctx->q->heap = BLI_heapsimple_new();
eq_ctx->q->center = center;
eq_ctx->q->radius_squared = radius * radius;
eq_ctx->q->limit_len_squared = bvh->bm_min_edge_len * bvh->bm_min_edge_len;
@@ -1237,8 +1237,8 @@ static bool pbvh_bmesh_subdivide_long_edges(
{
bool any_subdivided = false;
- while (!BLI_heap_is_empty(eq_ctx->q->heap)) {
- BMVert **pair = BLI_heap_pop_min(eq_ctx->q->heap);
+ while (!BLI_heapsimple_is_empty(eq_ctx->q->heap)) {
+ BMVert **pair = BLI_heapsimple_pop_min(eq_ctx->q->heap);
BMVert *v1 = pair[0], *v2 = pair[1];
BMEdge *e;
@@ -1454,8 +1454,8 @@ static bool pbvh_bmesh_collapse_short_edges(
/* deleted verts point to vertices they were merged into, or NULL when removed. */
GHash *deleted_verts = BLI_ghash_ptr_new("deleted_verts");
- while (!BLI_heap_is_empty(eq_ctx->q->heap)) {
- BMVert **pair = BLI_heap_pop_min(eq_ctx->q->heap);
+ while (!BLI_heapsimple_is_empty(eq_ctx->q->heap)) {
+ BMVert **pair = BLI_heapsimple_pop_min(eq_ctx->q->heap);
BMVert *v1 = pair[0], *v2 = pair[1];
BLI_mempool_free(eq_ctx->pool, pair);
pair = NULL;
@@ -1961,7 +1961,7 @@ bool BKE_pbvh_bmesh_update_topology(
short_edge_queue_create(&eq_ctx, bvh, center, view_normal, radius, use_frontface, use_projected);
modified |= pbvh_bmesh_collapse_short_edges(
&eq_ctx, bvh, &deleted_faces);
- BLI_heap_free(q.heap, NULL);
+ BLI_heapsimple_free(q.heap, NULL);
BLI_mempool_destroy(queue_pool);
}
@@ -1976,7 +1976,7 @@ bool BKE_pbvh_bmesh_update_topology(
long_edge_queue_create(&eq_ctx, bvh, center, view_normal, radius, use_frontface, use_projected);
modified |= pbvh_bmesh_subdivide_long_edges(
&eq_ctx, bvh, &edge_loops);
- BLI_heap_free(q.heap, NULL);
+ BLI_heapsimple_free(q.heap, NULL);
BLI_mempool_destroy(queue_pool);
}
diff --git a/source/blender/blenkernel/intern/pbvh_intern.h b/source/blender/blenkernel/intern/pbvh_intern.h
index afd539b2273..ea8bd1933cd 100644
--- a/source/blender/blenkernel/intern/pbvh_intern.h
+++ b/source/blender/blenkernel/intern/pbvh_intern.h
@@ -144,13 +144,6 @@ struct PBVH {
const DMFlagMat *grid_flag_mats;
int totgrid;
BLI_bitmap **grid_hidden;
- /* index_buf of GPU_PBVH_Buffers can be the same for all 'fully drawn' nodes (same size).
- * Previously was stored in a static var in gpu_buffer.c, but this breaks in case we handle several different
- * objects in sculpt mode with different sizes at the same time, so now storing that common gpu buffer
- * in an opaque pointer per pbvh. See T47637. */
- struct GridCommonGPUBuffer *grid_common_gpu_buffer;
- /* The ccgdm is required for CD_ORIGINDEX lookup in vertex paint + multires */
- struct CCGDerivedMesh *ccgdm;
/* Only used during BVH build and update,
* don't need to remain valid after */
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index e346fc1f33f..b590c05cf26 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -64,6 +64,7 @@
#include "BKE_collection.h"
#include "BKE_dynamicpaint.h"
#include "BKE_global.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
@@ -144,7 +145,7 @@ static int ptcache_extra_datasize[] = {
sizeof(ParticleSpring)
};
-/* forward declerations */
+/* forward declarations */
static int ptcache_file_compressed_read(PTCacheFile *pf, unsigned char *result, unsigned int len);
static int ptcache_file_compressed_write(PTCacheFile *pf, unsigned char *in, unsigned int in_len, unsigned char *out, int mode);
static int ptcache_file_write(PTCacheFile *pf, const void *f, unsigned int tot, unsigned int size);
@@ -3337,19 +3338,6 @@ void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startfra
if (startframe && endframe) {
*startframe= cache->startframe;
*endframe= cache->endframe;
-
- /* TODO: time handling with object offsets and simulated vs. cached
- * particles isn't particularly easy, so for now what you see is what
- * you get. In the future point cache could handle the whole particle
- * system timing. */
-#if 0
- if ((ob->partype & PARSLOW)==0) {
- offset= ob->sf;
-
- *startframe += (int)(offset+0.5f);
- *endframe += (int)(offset+0.5f);
- }
-#endif
}
/* verify cached_frames array is up to date */
@@ -3455,12 +3443,6 @@ int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode)
sbFreeSimulation(pid->calldata);
else if (pid->type == PTCACHE_TYPE_PARTICLES)
psys_reset(pid->calldata, PSYS_RESET_DEPSGRAPH);
-#if 0
- else if (pid->type == PTCACHE_TYPE_SMOKE_DOMAIN)
- smokeModifier_reset(pid->calldata);
- else if (pid->type == PTCACHE_TYPE_SMOKE_HIGHRES)
- smokeModifier_reset_turbulence(pid->calldata);
-#endif
else if (pid->type == PTCACHE_TYPE_DYNAMICPAINT)
dynamicPaint_clearSurface(scene, (DynamicPaintSurface*)pid->calldata);
}
diff --git a/source/blender/blenkernel/intern/report.c b/source/blender/blenkernel/intern/report.c
index a9b36a85602..9204bc69ee9 100644
--- a/source/blender/blenkernel/intern/report.c
+++ b/source/blender/blenkernel/intern/report.c
@@ -140,7 +140,7 @@ void BKE_reportf(ReportList *reports, ReportType type, const char *_format, ...)
va_start(args, _format);
vprintf(format, args);
va_end(args);
- fprintf(stdout, "\n"); /* otherise each report needs to include a \n */
+ fprintf(stdout, "\n"); /* otherwise each report needs to include a \n */
fflush(stdout); /* this ensures the message is printed before a crash */
}
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 7d845b4b69c..6efe7c3873d 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -583,12 +583,6 @@ void BKE_rigidbody_calc_volume(Object *ob, float *r_vol)
}
break;
}
-
-#if 0 // XXX: not defined yet
- case RB_SHAPE_COMPOUND:
- volume = 0.0f;
- break;
-#endif
}
/* return the volume calculated */
@@ -656,12 +650,6 @@ void BKE_rigidbody_calc_center_of_mass(Object *ob, float r_center[3])
}
break;
}
-
-#if 0 // XXX: not defined yet
- case RB_SHAPE_COMPOUND:
- volume = 0.0f;
- break;
-#endif
}
}
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 5f72036c3a8..af27103b07e 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -403,6 +403,7 @@ Scene *BKE_scene_copy(Main *bmain, Scene *sce, int type)
for (ViewLayer *view_layer_dst = sce_copy->view_layers.first; view_layer_dst; view_layer_dst = view_layer_dst->next) {
for (FreestyleLineSet *lineset = view_layer_dst->freestyle_config.linesets.first; lineset; lineset = lineset->next) {
if (lineset->linestyle) {
+ id_us_min(&lineset->linestyle->id);
/* XXX Not copying anim/actions here? */
BKE_id_copy_ex(bmain, (ID *)lineset->linestyle, (ID **)&lineset->linestyle, 0, false);
}
@@ -411,6 +412,7 @@ Scene *BKE_scene_copy(Main *bmain, Scene *sce, int type)
/* Full copy of world (included animations) */
if (sce_copy->world) {
+ id_us_min(&sce_copy->world->id);
BKE_id_copy_ex(bmain, (ID *)sce_copy->world, (ID **)&sce_copy->world, LIB_ID_COPY_ACTIONS, false);
}
@@ -420,6 +422,7 @@ Scene *BKE_scene_copy(Main *bmain, Scene *sce, int type)
/* Full copy of GreasePencil. */
/* XXX Not copying anim/actions here? */
if (sce_copy->gpd) {
+ id_us_min(&sce_copy->gpd->id);
BKE_id_copy_ex(bmain, (ID *)sce_copy->gpd, (ID **)&sce_copy->gpd, 0, false);
}
}
@@ -433,7 +436,8 @@ Scene *BKE_scene_copy(Main *bmain, Scene *sce, int type)
/* NOTE: part of SCE_COPY_LINK_DATA and SCE_COPY_FULL operations
* are done outside of blenkernel with ED_object_single_users! */
- /* camera */
+ /* camera */
+ /* XXX This is most certainly useless? Object have not yet been duplicated... */
if (ELEM(type, SCE_COPY_LINK_DATA, SCE_COPY_FULL)) {
ID_NEW_REMAP(sce_copy->camera);
}
@@ -546,8 +550,6 @@ void BKE_scene_init(Scene *sce)
BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(sce, id));
- sce->lay = sce->layact = 1;
-
sce->r.mode = R_OSA;
sce->r.cfra = 1;
sce->r.sfra = 1;
@@ -651,7 +653,7 @@ void BKE_scene_init(Scene *sce)
sce->toolsettings->uvcalc_flag = UVCALC_TRANSFORM_CORRECT;
sce->toolsettings->unwrapper = 1;
sce->toolsettings->select_thresh = 0.01f;
- sce->toolsettings->gizmo_flag = SCE_MANIP_TRANSLATE | SCE_MANIP_ROTATE | SCE_MANIP_SCALE;
+ sce->toolsettings->gizmo_flag = SCE_GIZMO_SHOW_TRANSLATE | SCE_GIZMO_SHOW_ROTATE | SCE_GIZMO_SHOW_SCALE;
sce->toolsettings->selectmode = SCE_SELECT_VERTEX;
sce->toolsettings->uv_selectmode = UV_SELECT_VERTEX;
@@ -686,13 +688,9 @@ void BKE_scene_init(Scene *sce)
sce->toolsettings->imapaint.normal_angle = 80;
sce->toolsettings->imapaint.seam_bleed = 2;
- /* alloc grease pencil drawing brushes */
- sce->toolsettings->gp_paint = MEM_callocN(sizeof(GpPaint), "GpPaint");
-
/* grease pencil multiframe falloff curve */
sce->toolsettings->gp_sculpt.cur_falloff = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
CurveMapping *gp_falloff_curve = sce->toolsettings->gp_sculpt.cur_falloff;
- curvemapping_set_defaults(gp_falloff_curve, 1, 0.0f, 0.0f, 1.0f, 1.0f);
curvemapping_initialize(gp_falloff_curve);
curvemap_reset(gp_falloff_curve->cm,
&gp_falloff_curve->clipr,
@@ -706,6 +704,9 @@ void BKE_scene_init(Scene *sce)
sce->unit.system = USER_UNIT_METRIC;
sce->unit.scale_length = 1.0f;
+ sce->unit.length_unit = bUnit_GetBaseUnitOfType(USER_UNIT_METRIC, B_UNIT_LENGTH);
+ sce->unit.mass_unit = bUnit_GetBaseUnitOfType(USER_UNIT_METRIC, B_UNIT_MASS);
+ sce->unit.time_unit = bUnit_GetBaseUnitOfType(USER_UNIT_METRIC, B_UNIT_TIME);
pset = &sce->toolsettings->particle;
pset->flag = PE_KEEP_LENGTHS | PE_LOCK_FIRST | PE_DEFLECT_EMITTER | PE_AUTO_VELOCITY;
@@ -915,6 +916,8 @@ void BKE_scene_init(Scene *sce)
sce->eevee.light_cache = NULL;
+ sce->eevee.overscan = 3.0f;
+
sce->eevee.flag =
SCE_EEVEE_VOLUMETRIC_LIGHTS |
SCE_EEVEE_GTAO_BENT_NORMALS |
@@ -937,7 +940,7 @@ Scene *BKE_scene_add(Main *bmain, const char *name)
}
/**
- * Check if there is any intance of the object in the scene
+ * Check if there is any instance of the object in the scene
*/
bool BKE_scene_object_find(Scene *scene, Object *ob)
{
@@ -1126,12 +1129,6 @@ int BKE_scene_base_iter_next(Depsgraph *depsgraph, SceneBaseIter *iter,
}
}
-#if 0
- if (ob && *ob) {
- printf("Scene: '%s', '%s'\n", (*scene)->id.name + 2, (*ob)->id.name + 2);
- }
-#endif
-
return iter->phase;
}
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 58a47dc2822..84962e9b03f 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -475,26 +475,6 @@ void BKE_screen_free(bScreen *sc)
MEM_SAFE_FREE(sc->tool_tip);
}
-/* for depsgraph */
-unsigned int BKE_screen_visible_layers(bScreen *screen, Scene *scene)
-{
- ScrArea *sa;
- unsigned int layer = 0;
-
- if (screen) {
- /* get all used view3d layers */
- for (sa = screen->areabase.first; sa; sa = sa->next)
- if (sa->spacetype == SPACE_VIEW3D)
- layer |= ((View3D *)sa->spacedata.first)->lay;
- }
-
- if (!layer)
- return scene->lay;
-
- return layer;
-}
-
-
/* ***************** Screen edges & verts ***************** */
ScrEdge *BKE_screen_find_edge(bScreen *sc, ScrVert *v1, ScrVert *v2)
@@ -767,56 +747,9 @@ ScrArea *BKE_screen_find_area_xy(bScreen *sc, const int spacetype, int x, int y)
return BKE_screen_area_map_find_area_xy(AREAMAP_FROM_SCREEN(sc), spacetype, x, y);
}
-
-/**
- * Utility function to get the active layer to use when adding new objects.
- */
-unsigned int BKE_screen_view3d_layer_active_ex(const View3D *v3d, const Scene *scene, bool use_localvd)
-{
- unsigned int lay;
- if ((v3d == NULL) || (v3d->scenelock && !v3d->localvd)) {
- lay = scene->layact;
- }
- else {
- lay = v3d->layact;
- }
-
- if (use_localvd) {
- if (v3d && v3d->localvd) {
- lay |= v3d->lay;
- }
- }
-
- return lay;
-}
-unsigned int BKE_screen_view3d_layer_active(const struct View3D *v3d, const struct Scene *scene)
-{
- return BKE_screen_view3d_layer_active_ex(v3d, scene, true);
-}
-
-/**
- * Accumulate all visible layers on this screen.
- */
-unsigned int BKE_screen_view3d_layer_all(const bScreen *sc)
-{
- const ScrArea *sa;
- unsigned int lay = 0;
- for (sa = sc->areabase.first; sa; sa = sa->next) {
- if (sa->spacetype == SPACE_VIEW3D) {
- View3D *v3d = sa->spacedata.first;
- lay |= v3d->lay;
- }
- }
-
- return lay;
-}
-
void BKE_screen_view3d_sync(View3D *v3d, struct Scene *scene)
{
- int bit;
-
if (v3d->scenelock && v3d->localvd == NULL) {
- v3d->lay = scene->lay;
v3d->camera = scene->camera;
if (v3d->camera == NULL) {
@@ -830,15 +763,6 @@ void BKE_screen_view3d_sync(View3D *v3d, struct Scene *scene)
}
}
}
-
- if ((v3d->lay & v3d->layact) == 0) {
- for (bit = 0; bit < 32; bit++) {
- if (v3d->lay & (1u << bit)) {
- v3d->layact = (1u << bit);
- break;
- }
- }
- }
}
}
@@ -863,10 +787,11 @@ void BKE_screen_view3d_shading_init(View3DShading *shading)
shading->type = OB_SOLID;
shading->prev_type = OB_SOLID;
- shading->flag = V3D_SHADING_SPECULAR_HIGHLIGHT;
+ shading->flag = V3D_SHADING_SPECULAR_HIGHLIGHT | V3D_SHADING_XRAY_WIREFRAME;
shading->light = V3D_LIGHTING_STUDIO;
shading->shadow_intensity = 0.5f;
shading->xray_alpha = 0.5f;
+ shading->xray_alpha_wire = 0.5f;
shading->cavity_valley_factor = 1.0f;
shading->cavity_ridge_factor = 1.0f;
copy_v3_fl(shading->single_color, 0.8f);
diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c
index 65d023fb6f2..ba2d2ef0d46 100644
--- a/source/blender/blenkernel/intern/seqeffects.c
+++ b/source/blender/blenkernel/intern/seqeffects.c
@@ -1727,10 +1727,10 @@ static float check_zone(WipeZone *wipezone, int x, int y, Sequence *seq, float f
break;
case DO_CLOCK_WIPE:
/*
- * temp1: angle of effect center in rads
- * temp2: angle of line through (halfx, halfy) and (x, y) in rads
- * temp3: angle of low side of blur
- * temp4: angle of high side of blur
+ * temp1: angle of effect center in rads
+ * temp2: angle of line through (halfx, halfy) and (x, y) in rads
+ * temp3: angle of low side of blur
+ * temp4: angle of high side of blur
*/
output = 1.0f - facf0;
widthf = wipe->edgeWidth * 2.0f * (float)M_PI;
@@ -1767,76 +1767,6 @@ static float check_zone(WipeZone *wipezone, int x, int y, Sequence *seq, float f
if (output != output) output = 1;
if (wipe->forward) output = 1 - output;
break;
- /* BOX WIPE IS NOT WORKING YET */
- /* case DO_CROSS_WIPE: */
- /* BOX WIPE IS NOT WORKING YET */
-#if 0
- case DO_BOX_WIPE:
- if (!wipe->forward) {
- facf0 = 1.0f - facf0; /* Go the other direction */
- }
-
- width = (int)(wipe->edgeWidth * ((xo + yo) / 2.0));
- hwidth = (float)width / 2.0;
- if (angle == 0) angle = 0.000001;
- b1 = posy / 2 - (-angle) * posx / 2;
- b3 = (yo - posy / 2) - (-angle) * (xo - posx / 2);
- b2 = y - (-angle) * x;
-
- hyp = abs(angle * x + y + (-posy / 2 - angle * posx / 2)) * wipezone->pythangle;
- hyp2 = abs(angle * x + y + (-(yo - posy / 2) - angle * (xo - posx / 2))) * wipezone->pythangle;
-
- temp1 = xo * (1 - facf0 / 2) - xo * facf0 / 2;
- temp2 = yo * (1 - facf0 / 2) - yo * facf0 / 2;
- pointdist = hypot(temp1, temp2);
-
- if (b2 < b1 && b2 < b3) {
- if (hwidth < pointdist)
- output = in_band(hwidth, hyp, 0, 1);
- }
- else if (b2 > b1 && b2 > b3) {
- if (hwidth < pointdist)
- output = in_band(hwidth, hyp2, 0, 1);
- }
- else {
- if (hyp < hwidth && hyp2 > hwidth)
- output = in_band(hwidth, hyp, 1, 1);
- else if (hyp > hwidth && hyp2 < hwidth)
- output = in_band(hwidth, hyp2, 1, 1);
- else
- output = in_band(hwidth, hyp2, 1, 1) * in_band(hwidth, hyp, 1, 1);
- }
-
- if (!wipe->forward) {
- facf0 = 1.0f - facf0; /* Go the other direction */
- }
- angle = -1 / angle;
- b1 = posy / 2 - (-angle) * posx / 2;
- b3 = (yo - posy / 2) - (-angle) * (xo - posx / 2);
- b2 = y - (-angle) * x;
-
- hyp = abs(angle * x + y + (-posy / 2 - angle * posx / 2)) * wipezone->pythangle;
- hyp2 = abs(angle * x + y + (-(yo - posy / 2) - angle * (xo - posx / 2))) * wipezone->pythangle;
-
- if (b2 < b1 && b2 < b3) {
- if (hwidth < pointdist)
- output *= in_band(hwidth, hyp, 0, 1);
- }
- else if (b2 > b1 && b2 > b3) {
- if (hwidth < pointdist)
- output *= in_band(hwidth, hyp2, 0, 1);
- }
- else {
- if (hyp < hwidth && hyp2 > hwidth)
- output *= in_band(hwidth, hyp, 1, 1);
- else if (hyp > hwidth && hyp2 < hwidth)
- output *= in_band(hwidth, hyp2, 1, 1);
- else
- output *= in_band(hwidth, hyp2, 1, 1) * in_band(hwidth, hyp, 1, 1);
- }
-
- break;
-#endif
case DO_IRIS_WIPE:
if (xo > yo) yo = xo;
else xo = yo;
@@ -2175,7 +2105,7 @@ static ImBuf *do_transform_effect(
static void RVBlurBitmap2_float(float *map, int width, int height, float blur, int quality)
/* MUUUCCH better than the previous blur. */
/* We do the blurring in two passes which is a whole lot faster. */
-/* I changed the math arount to implement an actual Gaussian */
+/* I changed the math around to implement an actual Gaussian */
/* distribution. */
/* */
/* Watch out though, it tends to misbehaven with large blur values on */
@@ -3021,7 +2951,7 @@ static void do_gaussian_blur_effect_byte_x(
const int size_x = (int) (data->size_x + 0.5f);
int i, j;
- /* Make gaussian weight tabke. */
+ /* Make gaussian weight table. */
float *gausstab_x;
gausstab_x = make_gaussian_blur_kernel(data->size_x, size_x);
@@ -3074,7 +3004,7 @@ static void do_gaussian_blur_effect_byte_y(
const int size_y = (int) (data->size_y + 0.5f);
int i, j;
- /* Make gaussian weight tabke. */
+ /* Make gaussian weight table. */
float *gausstab_y;
gausstab_y = make_gaussian_blur_kernel(data->size_y, size_y);
@@ -3127,7 +3057,7 @@ static void do_gaussian_blur_effect_float_x(
const int size_x = (int) (data->size_x + 0.5f);
int i, j;
- /* Make gaussian weight tabke. */
+ /* Make gaussian weight table. */
float *gausstab_x;
gausstab_x = make_gaussian_blur_kernel(data->size_x, size_x);
@@ -3171,7 +3101,7 @@ static void do_gaussian_blur_effect_float_y(
const int size_y = (int) (data->size_y + 0.5f);
int i, j;
- /* Make gaussian weight tabke. */
+ /* Make gaussian weight table. */
float *gausstab_y;
gausstab_y = make_gaussian_blur_kernel(data->size_y, size_y);
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index b5b4ec5cd41..0d506effae6 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -418,7 +418,7 @@ void BKE_sequence_clipboard_pointers_restore(Sequence *seq, Main *bmain)
seqclipboard_ptr_restore(bmain, (ID **)&seq->sound);
}
-/* recursive versions of funcions above */
+/* recursive versions of functions above */
void BKE_sequencer_base_clipboard_pointers_free(ListBase *seqbase)
{
Sequence *seq;
@@ -1065,7 +1065,7 @@ void BKE_sequencer_sort(Scene *scene)
*(ed->seqbasep) = seqbase;
}
-/** Comparision function suitable to be used with BLI_listbase_sort()... */
+/** Comparison function suitable to be used with BLI_listbase_sort()... */
int BKE_sequencer_cmp_time_startdisp(const void *a, const void *b)
{
const Sequence *seq_a = a;
@@ -1596,12 +1596,8 @@ static void seq_open_anim_file(Scene *scene, Sequence *seq, bool openfile)
}
if (sanim->anim) {
-#if 0
- seq_anim_add_suffix(scene, sanim->anim, i);
-#else
/* we already have the suffix */
IMB_suffix_anim(sanim->anim, suffix);
-#endif
}
else {
if (openfile) {
@@ -2420,21 +2416,21 @@ void BKE_sequencer_color_balance_apply(StripColorBalance *cb, ImBuf *ibuf, float
}
/*
- * input preprocessing for SEQ_TYPE_IMAGE, SEQ_TYPE_MOVIE, SEQ_TYPE_MOVIECLIP and SEQ_TYPE_SCENE
+ * input preprocessing for SEQ_TYPE_IMAGE, SEQ_TYPE_MOVIE, SEQ_TYPE_MOVIECLIP and SEQ_TYPE_SCENE
*
- * Do all the things you can't really do afterwards using sequence effects
- * (read: before rescaling to render resolution has been done)
+ * Do all the things you can't really do afterwards using sequence effects
+ * (read: before rescaling to render resolution has been done)
*
- * Order is important!
+ * Order is important!
*
- * - Deinterlace
- * - Crop and transform in image source coordinate space
- * - Flip X + Flip Y (could be done afterwards, backward compatibility)
- * - Promote image to float data (affects pipeline operations afterwards)
- * - Color balance (is most efficient in the byte -> float
- * (future: half -> float should also work fine!)
- * case, if done on load, since we can use lookup tables)
- * - Premultiply
+ * - Deinterlace
+ * - Crop and transform in image source coordinate space
+ * - Flip X + Flip Y (could be done afterwards, backward compatibility)
+ * - Promote image to float data (affects pipeline operations afterwards)
+ * - Color balance (is most efficient in the byte -> float
+ * (future: half -> float should also work fine!)
+ * case, if done on load, since we can use lookup tables)
+ * - Premultiply
*/
bool BKE_sequencer_input_have_to_preprocess(const SeqRenderData *context, Sequence *seq, float UNUSED(cfra))
@@ -3367,7 +3363,7 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq
if (re == NULL)
re = RE_NewSceneRender(scene);
- RE_BlenderFrame(re, context->bmain, scene, view_layer, camera, scene->lay, frame, false);
+ RE_BlenderFrame(re, context->bmain, scene, view_layer, camera, frame, false);
/* restore previous state after it was toggled on & off by RE_BlenderFrame */
G.is_rendering = is_rendering;
@@ -4520,7 +4516,7 @@ Sequence *BKE_sequencer_foreground_frame_get(Scene *scene, int frame)
return best_seq;
}
-/* return 0 if there werent enough space */
+/* return 0 if there weren't enough space */
bool BKE_sequence_base_shuffle_ex(ListBase *seqbasep, Sequence *test, Scene *evil_scene, int channel_delta)
{
const int orig_machine = test->machine;
@@ -5253,11 +5249,6 @@ Sequence *BKE_sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoad
if (sound->playback_handle == NULL) {
BKE_libblock_free(bmain, sound);
-#if 0
- if (op)
- BKE_report(op->reports, RPT_ERROR, "Unsupported audio format");
-#endif
-
return NULL;
}
@@ -5265,10 +5256,6 @@ Sequence *BKE_sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoad
if (info.specs.channels == AUD_CHANNELS_INVALID) {
BKE_libblock_free(bmain, sound);
-#if 0
- if (op)
- BKE_report(op->reports, RPT_ERROR, "Unsupported audio format");
-#endif
return NULL;
}
diff --git a/source/blender/blenkernel/intern/shader_fx.c b/source/blender/blenkernel/intern/shader_fx.c
index c028c2184fd..f19b450dece 100644
--- a/source/blender/blenkernel/intern/shader_fx.c
+++ b/source/blender/blenkernel/intern/shader_fx.c
@@ -165,8 +165,8 @@ void BKE_shaderfx_copyData_generic(const ShaderFxData *fx_src, ShaderFxData *fx_
{
const ShaderFxTypeInfo *fxi = BKE_shaderfxType_getInfo(fx_src->type);
- /* fx_dst may have alredy be fully initialized with some extra allocated data,
- * we need to free it now to avoid memleak. */
+ /* fx_dst may have already be fully initialized with some extra allocated data,
+ * we need to free it now to avoid memleak. */
if (fxi->freeData) {
fxi->freeData(fx_dst);
}
diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c
index 9fa104dc04d..4ba43b1a26f 100644
--- a/source/blender/blenkernel/intern/shrinkwrap.c
+++ b/source/blender/blenkernel/intern/shrinkwrap.c
@@ -45,6 +45,7 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
#include "BLI_task.h"
+#include "BLI_math_solvers.h"
#include "BKE_shrinkwrap.h"
#include "BKE_cdderivedmesh.h"
@@ -57,6 +58,9 @@
#include "BKE_editmesh.h"
#include "BKE_mesh.h" /* for OMP limits. */
#include "BKE_subsurf.h"
+#include "BKE_mesh_runtime.h"
+
+#include "MEM_guardedalloc.h"
#include "BLI_strict_flags.h"
@@ -70,20 +74,262 @@
/* Util macros */
#define OUT_OF_MEMORY() ((void)printf("Shrinkwrap: Out of memory\n"))
+typedef struct ShrinkwrapCalcData {
+ ShrinkwrapModifierData *smd; //shrinkwrap modifier data
+
+ struct Object *ob; //object we are applying shrinkwrap to
+
+ struct MVert *vert; //Array of verts being projected (to fetch normals or other data)
+ float(*vertexCos)[3]; //vertexs being shrinkwraped
+ int numVerts;
+
+ struct MDeformVert *dvert; //Pointer to mdeform array
+ int vgroup; //Vertex group num
+ bool invert_vgroup; /* invert vertex group influence */
+
+ struct Mesh *target; //mesh we are shrinking to
+ struct SpaceTransform local2target; //transform to move between local and target space
+ struct ShrinkwrapTreeData *tree; // mesh BVH tree data
+
+ float keepDist; //Distance to keep above target surface (units are in local space)
+
+} ShrinkwrapCalcData;
+
typedef struct ShrinkwrapCalcCBData {
ShrinkwrapCalcData *calc;
- void *treeData;
- void *auxData;
- BVHTree *targ_tree;
- BVHTree *aux_tree;
- void *targ_callback;
- void *aux_callback;
+ ShrinkwrapTreeData *tree;
+ ShrinkwrapTreeData *aux_tree;
float *proj_axis;
SpaceTransform *local2aux;
} ShrinkwrapCalcCBData;
+
+/* Checks if the modifier needs target normals with these settings. */
+bool BKE_shrinkwrap_needs_normals(int shrinkType, int shrinkMode)
+{
+ return (shrinkType == MOD_SHRINKWRAP_TARGET_PROJECT) ||
+ (shrinkType != MOD_SHRINKWRAP_NEAREST_VERTEX && shrinkMode == MOD_SHRINKWRAP_ABOVE_SURFACE);
+}
+
+/* Initializes the mesh data structure from the given mesh and settings. */
+bool BKE_shrinkwrap_init_tree(ShrinkwrapTreeData *data, Mesh *mesh, int shrinkType, int shrinkMode, bool force_normals)
+{
+ memset(data, 0, sizeof(*data));
+
+ if (!mesh || mesh->totvert <= 0) {
+ return false;
+ }
+
+ data->mesh = mesh;
+
+ if (shrinkType == MOD_SHRINKWRAP_NEAREST_VERTEX) {
+ data->bvh = BKE_bvhtree_from_mesh_get(&data->treeData, mesh, BVHTREE_FROM_VERTS, 2);
+
+ return data->bvh != NULL;
+ }
+ else {
+ if (mesh->totpoly <= 0) {
+ return false;
+ }
+
+ data->bvh = BKE_bvhtree_from_mesh_get(&data->treeData, mesh, BVHTREE_FROM_LOOPTRI, 4);
+
+ if (data->bvh == NULL) {
+ return false;
+ }
+
+ if (force_normals || BKE_shrinkwrap_needs_normals(shrinkType, shrinkMode)) {
+ if ((mesh->flag & ME_AUTOSMOOTH) != 0) {
+ data->clnors = CustomData_get_layer(&mesh->ldata, CD_NORMAL);
+ }
+ }
+
+ if (shrinkType == MOD_SHRINKWRAP_TARGET_PROJECT) {
+ data->boundary = mesh->runtime.shrinkwrap_data;
+ }
+
+ return true;
+ }
+}
+
+/* Frees the tree data if necessary. */
+void BKE_shrinkwrap_free_tree(ShrinkwrapTreeData *data)
+{
+ free_bvhtree_from_mesh(&data->treeData);
+}
+
+/* Free boundary data for target project */
+void BKE_shrinkwrap_discard_boundary_data(struct Mesh *mesh)
+{
+ struct ShrinkwrapBoundaryData *data = mesh->runtime.shrinkwrap_data;
+
+ if (data != NULL) {
+ MEM_freeN((void *)data->edge_is_boundary);
+ MEM_freeN((void *)data->looptri_has_boundary);
+ MEM_freeN((void *)data->vert_boundary_id);
+ MEM_freeN((void *)data->boundary_verts);
+
+ MEM_freeN(data);
+ }
+
+ mesh->runtime.shrinkwrap_data = NULL;
+}
+
+/* Accumulate edge for average boundary edge direction. */
+static void merge_vert_dir(ShrinkwrapBoundaryVertData *vdata, signed char *status, int index, const float edge_dir[3], signed char side)
+{
+ BLI_assert(index >= 0);
+ float *direction = vdata[index].direction;
+
+ /* Invert the direction vector if either:
+ * - This is the second edge and both edges have the vertex as start or end.
+ * - For third and above, if it points in the wrong direction.
+ */
+ if (status[index] >= 0 ? status[index] == side : dot_v3v3(direction, edge_dir) < 0) {
+ sub_v3_v3(direction, edge_dir);
+ }
+ else {
+ add_v3_v3(direction, edge_dir);
+ }
+
+ status[index] = (status[index] == 0) ? side : -1;
+}
+
+static ShrinkwrapBoundaryData *shrinkwrap_build_boundary_data(struct Mesh *mesh)
+{
+ const MLoop *mloop = mesh->mloop;
+ const MEdge *medge = mesh->medge;
+ const MVert *mvert = mesh->mvert;
+
+ /* Count faces per edge (up to 2). */
+ char *edge_mode = MEM_calloc_arrayN((size_t)mesh->totedge, sizeof(char), __func__);
+
+ for (int i = 0; i < mesh->totloop; i++) {
+ unsigned int eidx = mloop[i].e;
+
+ if (edge_mode[eidx] < 2) {
+ edge_mode[eidx]++;
+ }
+ }
+
+ /* Build the boundary edge bitmask. */
+ BLI_bitmap *edge_is_boundary = BLI_BITMAP_NEW(mesh->totedge, "ShrinkwrapBoundaryData::edge_is_boundary");
+ unsigned int num_boundary_edges = 0;
+
+ for (int i = 0; i < mesh->totedge; i++) {
+ edge_mode[i] = (edge_mode[i] == 1);
+
+ if (edge_mode[i]) {
+ BLI_BITMAP_ENABLE(edge_is_boundary, i);
+ num_boundary_edges++;
+ }
+ }
+
+ /* If no boundary, return NULL. */
+ if (num_boundary_edges == 0) {
+ MEM_freeN(edge_is_boundary);
+ MEM_freeN(edge_mode);
+ return NULL;
+ }
+
+ /* Allocate the data object. */
+ ShrinkwrapBoundaryData *data = MEM_callocN(sizeof(ShrinkwrapBoundaryData), "ShrinkwrapBoundaryData");
+
+ data->edge_is_boundary = edge_is_boundary;
+
+ /* Build the boundary looptri bitmask. */
+ const MLoopTri *mlooptri = BKE_mesh_runtime_looptri_ensure(mesh);
+ int totlooptri = BKE_mesh_runtime_looptri_len(mesh);
+
+ BLI_bitmap *looptri_has_boundary = BLI_BITMAP_NEW(totlooptri, "ShrinkwrapBoundaryData::looptri_is_boundary");
+
+ for (int i = 0; i < totlooptri; i++) {
+ int edges[3];
+ BKE_mesh_looptri_get_real_edges(mesh, &mlooptri[i], edges);
+
+ for (int j = 0; j < 3; j++) {
+ if (edges[j] >= 0 && edge_mode[edges[j]]) {
+ BLI_BITMAP_ENABLE(looptri_has_boundary, i);
+ break;
+ }
+ }
+ }
+
+ data->looptri_has_boundary = looptri_has_boundary;
+
+ /* Find boundary vertices and build a mapping table for compact storage of data. */
+ int *vert_boundary_id = MEM_calloc_arrayN((size_t)mesh->totvert, sizeof(int), "ShrinkwrapBoundaryData::vert_boundary_id");
+
+ for (int i = 0; i < mesh->totedge; i++) {
+ if (edge_mode[i]) {
+ const MEdge *edge = &medge[i];
+
+ vert_boundary_id[edge->v1] = 1;
+ vert_boundary_id[edge->v2] = 1;
+ }
+ }
+
+ unsigned int num_boundary_verts = 0;
+
+ for (int i = 0; i < mesh->totvert; i++) {
+ vert_boundary_id[i] = (vert_boundary_id[i] != 0) ? (int)num_boundary_verts++ : -1;
+ }
+
+ data->vert_boundary_id = vert_boundary_id;
+ data->num_boundary_verts = num_boundary_verts;
+
+ /* Compute average directions. */
+ ShrinkwrapBoundaryVertData *boundary_verts = MEM_calloc_arrayN(num_boundary_verts, sizeof(*boundary_verts), "ShrinkwrapBoundaryData::boundary_verts");
+
+ signed char *vert_status = MEM_calloc_arrayN(num_boundary_verts, sizeof(char), __func__);
+
+ for (int i = 0; i < mesh->totedge; i++) {
+ if (edge_mode[i]) {
+ const MEdge *edge = &medge[i];
+
+ float dir[3];
+ sub_v3_v3v3(dir, mvert[edge->v2].co, mvert[edge->v1].co);
+ normalize_v3(dir);
+
+ merge_vert_dir(boundary_verts, vert_status, vert_boundary_id[edge->v1], dir, 1);
+ merge_vert_dir(boundary_verts, vert_status, vert_boundary_id[edge->v2], dir, 2);
+ }
+ }
+
+ MEM_freeN(vert_status);
+
+ /* Finalize average direction and compute normal. */
+ for (int i = 0; i < mesh->totvert; i++) {
+ int bidx = vert_boundary_id[i];
+
+ if (bidx >= 0) {
+ ShrinkwrapBoundaryVertData *vdata = &boundary_verts[bidx];
+ float no[3], tmp[3];
+
+ normalize_v3(vdata->direction);
+
+ normal_short_to_float_v3(no, mesh->mvert[i].no);
+ cross_v3_v3v3(tmp, no, vdata->direction);
+ cross_v3_v3v3(vdata->normal_plane, tmp, no);
+ normalize_v3(vdata->normal_plane);
+ }
+ }
+
+ data->boundary_verts = boundary_verts;
+
+ MEM_freeN(edge_mode);
+ return data;
+}
+
+void BKE_shrinkwrap_compute_boundary_data(struct Mesh *mesh)
+{
+ BKE_shrinkwrap_discard_boundary_data(mesh);
+
+ mesh->runtime.shrinkwrap_data = shrinkwrap_build_boundary_data(mesh);
+}
+
/*
* Shrinkwrap to the nearest vertex
*
@@ -98,7 +344,7 @@ static void shrinkwrap_calc_nearest_vertex_cb_ex(
ShrinkwrapCalcCBData *data = userdata;
ShrinkwrapCalcData *calc = data->calc;
- BVHTreeFromMesh *treeData = data->treeData;
+ BVHTreeFromMesh *treeData = &data->tree->treeData;
BVHTreeNearest *nearest = tls->userdata_chunk;
float *co = calc->vertexCos[i];
@@ -154,24 +400,13 @@ static void shrinkwrap_calc_nearest_vertex_cb_ex(
static void shrinkwrap_calc_nearest_vertex(ShrinkwrapCalcData *calc)
{
- BVHTreeFromMesh treeData = NULL_BVHTreeFromMesh;
BVHTreeNearest nearest = NULL_BVHTreeNearest;
- if (calc->target != NULL && calc->target->totvert == 0) {
- return;
- }
-
- TIMEIT_BENCH(BKE_bvhtree_from_mesh_get(&treeData, calc->target, BVHTREE_FROM_VERTS, 2), bvhtree_verts);
- if (treeData.tree == NULL) {
- OUT_OF_MEMORY();
- return;
- }
-
/* Setup nearest */
nearest.index = -1;
nearest.dist_sq = FLT_MAX;
- ShrinkwrapCalcCBData data = {.calc = calc, .treeData = &treeData};
+ ShrinkwrapCalcCBData data = {.calc = calc, .tree = calc->tree};
ParallelRangeSettings settings;
BLI_parallel_range_settings_defaults(&settings);
settings.use_threading = (calc->numVerts > BKE_MESH_OMP_LIMIT);
@@ -180,8 +415,6 @@ static void shrinkwrap_calc_nearest_vertex(ShrinkwrapCalcData *calc)
BLI_task_parallel_range(0, calc->numVerts,
&data, shrinkwrap_calc_nearest_vertex_cb_ex,
&settings);
-
- free_bvhtree_from_mesh(&treeData);
}
@@ -196,8 +429,7 @@ static void shrinkwrap_calc_nearest_vertex(ShrinkwrapCalcData *calc)
bool BKE_shrinkwrap_project_normal(
char options, const float vert[3], const float dir[3],
const float ray_radius, const SpaceTransform *transf,
- BVHTree *tree, BVHTreeRayHit *hit,
- BVHTree_RayCastCallback callback, void *userdata)
+ ShrinkwrapTreeData *tree, BVHTreeRayHit *hit)
{
/* don't use this because this dist value could be incompatible
* this value used by the callback for comparing prev/new dist values.
@@ -232,7 +464,7 @@ bool BKE_shrinkwrap_project_normal(
hit_tmp.index = -1;
- BLI_bvhtree_ray_cast(tree, co, no, ray_radius, &hit_tmp, callback, userdata);
+ BLI_bvhtree_ray_cast(tree->bvh, co, no, ray_radius, &hit_tmp, tree->treeData.raycast_callback, &tree->treeData);
if (hit_tmp.index != -1) {
/* invert the normal first so face culling works on rotated objects */
@@ -240,7 +472,7 @@ bool BKE_shrinkwrap_project_normal(
BLI_space_transform_invert_normal(transf, hit_tmp.no);
}
- if (options & (MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE | MOD_SHRINKWRAP_CULL_TARGET_BACKFACE)) {
+ if (options & MOD_SHRINKWRAP_CULL_TARGET_MASK) {
/* apply backface */
const float dot = dot_v3v3(dir, hit_tmp.no);
if (((options & MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE) && dot <= 0.0f) ||
@@ -274,12 +506,8 @@ static void shrinkwrap_calc_normal_projection_cb_ex(
ShrinkwrapCalcCBData *data = userdata;
ShrinkwrapCalcData *calc = data->calc;
- void *treeData = data->treeData;
- void *auxData = data->auxData;
- BVHTree *targ_tree = data->targ_tree;
- BVHTree *aux_tree = data->aux_tree;
- void *targ_callback = data->targ_callback;
- void *aux_callback = data->aux_callback;
+ ShrinkwrapTreeData *tree = data->tree;
+ ShrinkwrapTreeData *aux_tree = data->aux_tree;
float *proj_axis = data->proj_axis;
SpaceTransform *local2aux = data->local2aux;
@@ -321,19 +549,25 @@ static void shrinkwrap_calc_normal_projection_cb_ex(
hit->index = -1;
hit->dist = BVH_RAYCAST_DIST_MAX; /* TODO: we should use FLT_MAX here, but sweepsphere code isn't prepared for that */
+ bool is_aux = false;
+
/* Project over positive direction of axis */
if (calc->smd->shrinkOpts & MOD_SHRINKWRAP_PROJECT_ALLOW_POS_DIR) {
if (aux_tree) {
- BKE_shrinkwrap_project_normal(
- 0, tmp_co, tmp_no, 0.0,
- local2aux, aux_tree, hit,
- aux_callback, auxData);
+ if (BKE_shrinkwrap_project_normal(
+ 0, tmp_co, tmp_no, 0.0,
+ local2aux, aux_tree, hit))
+ {
+ is_aux = true;
+ }
}
- BKE_shrinkwrap_project_normal(
- calc->smd->shrinkOpts, tmp_co, tmp_no, 0.0,
- &calc->local2target, targ_tree, hit,
- targ_callback, treeData);
+ if (BKE_shrinkwrap_project_normal(
+ calc->smd->shrinkOpts, tmp_co, tmp_no, 0.0,
+ &calc->local2target, tree, hit))
+ {
+ is_aux = false;
+ }
}
/* Project over negative direction of axis */
@@ -341,17 +575,27 @@ static void shrinkwrap_calc_normal_projection_cb_ex(
float inv_no[3];
negate_v3_v3(inv_no, tmp_no);
+ char options = calc->smd->shrinkOpts;
+
+ if ((options & MOD_SHRINKWRAP_INVERT_CULL_TARGET) && (options & MOD_SHRINKWRAP_CULL_TARGET_MASK)) {
+ options ^= MOD_SHRINKWRAP_CULL_TARGET_MASK;
+ }
+
if (aux_tree) {
- BKE_shrinkwrap_project_normal(
- 0, tmp_co, inv_no, 0.0,
- local2aux, aux_tree, hit,
- aux_callback, auxData);
+ if (BKE_shrinkwrap_project_normal(
+ 0, tmp_co, inv_no, 0.0,
+ local2aux, aux_tree, hit))
+ {
+ is_aux = true;
+ }
}
- BKE_shrinkwrap_project_normal(
- calc->smd->shrinkOpts, tmp_co, inv_no, 0.0,
- &calc->local2target, targ_tree, hit,
- targ_callback, treeData);
+ if (BKE_shrinkwrap_project_normal(
+ options, tmp_co, inv_no, 0.0,
+ &calc->local2target, tree, hit))
+ {
+ is_aux = false;
+ }
}
/* don't set the initial dist (which is more efficient),
@@ -363,7 +607,17 @@ static void shrinkwrap_calc_normal_projection_cb_ex(
}
if (hit->index != -1) {
- madd_v3_v3v3fl(hit->co, hit->co, tmp_no, calc->keepDist);
+ if (is_aux) {
+ BKE_shrinkwrap_snap_point_to_surface(
+ aux_tree, local2aux, calc->smd->shrinkMode,
+ hit->index, hit->co, hit->no, calc->keepDist, tmp_co, hit->co);
+ }
+ else {
+ BKE_shrinkwrap_snap_point_to_surface(
+ tree, &calc->local2target, calc->smd->shrinkMode,
+ hit->index, hit->co, hit->no, calc->keepDist, tmp_co, hit->co);
+ }
+
interp_v3_v3v3(co, co, hit->co, weight);
}
}
@@ -379,23 +633,19 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc)
* for finding the best hit, to get the real dist,
* measure the len_v3v3() from the input coord to hit.co */
BVHTreeRayHit hit;
- void *treeData = NULL;
/* auxiliary target */
Mesh *auxMesh = NULL;
bool auxMesh_free;
- void *auxData = NULL;
+ ShrinkwrapTreeData *aux_tree = NULL;
+ ShrinkwrapTreeData aux_tree_stack;
SpaceTransform local2aux;
/* If the user doesn't allows to project in any direction of projection axis
- * then theres nothing todo. */
+ * then there's nothing todo. */
if ((calc->smd->shrinkOpts & (MOD_SHRINKWRAP_PROJECT_ALLOW_POS_DIR | MOD_SHRINKWRAP_PROJECT_ALLOW_NEG_DIR)) == 0)
return;
- if (calc->target != NULL && calc->target->totpoly == 0) {
- return;
- }
-
/* Prepare data to retrieve the direction in which we should project each vertex */
if (calc->smd->projAxis == MOD_SHRINKWRAP_PROJECT_OVER_NORMAL) {
if (calc->vert == NULL) return;
@@ -422,70 +672,375 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc)
BLI_SPACE_TRANSFORM_SETUP(&local2aux, calc->ob, calc->smd->auxTarget);
}
- /* use editmesh to avoid array allocation */
- BMEditMesh *emtarget = NULL, *emaux = NULL;
- union {
- BVHTreeFromEditMesh emtreedata;
- BVHTreeFromMesh dmtreedata;
- } treedata_stack, auxdata_stack;
-
- BVHTree *targ_tree;
- void *targ_callback;
- if ((targ_tree = BKE_bvhtree_from_mesh_get(
- &treedata_stack.dmtreedata, calc->target, BVHTREE_FROM_LOOPTRI, 4)))
- {
- targ_callback = treedata_stack.dmtreedata.raycast_callback;
- treeData = &treedata_stack.dmtreedata;
-
- BVHTree *aux_tree = NULL;
- void *aux_callback = NULL;
- if (auxMesh != NULL && auxMesh->totpoly != 0) {
- /* use editmesh to avoid array allocation */
- if ((aux_tree = BKE_bvhtree_from_mesh_get(
- &auxdata_stack.dmtreedata, auxMesh, BVHTREE_FROM_LOOPTRI, 4)) != NULL)
- {
- aux_callback = auxdata_stack.dmtreedata.raycast_callback;
- auxData = &auxdata_stack.dmtreedata;
+ if (BKE_shrinkwrap_init_tree(&aux_tree_stack, auxMesh, calc->smd->shrinkType, calc->smd->shrinkMode, false)) {
+ aux_tree = &aux_tree_stack;
+ }
+
+ /* After successfully build the trees, start projection vertices. */
+ ShrinkwrapCalcCBData data = {
+ .calc = calc, .tree = calc->tree, .aux_tree = aux_tree,
+ .proj_axis = proj_axis, .local2aux = &local2aux
+ };
+ ParallelRangeSettings settings;
+ BLI_parallel_range_settings_defaults(&settings);
+ settings.use_threading = (calc->numVerts > BKE_MESH_OMP_LIMIT);
+ settings.userdata_chunk = &hit;
+ settings.userdata_chunk_size = sizeof(hit);
+ BLI_task_parallel_range(0, calc->numVerts,
+ &data,
+ shrinkwrap_calc_normal_projection_cb_ex,
+ &settings);
+
+ /* free data structures */
+ if (aux_tree) {
+ BKE_shrinkwrap_free_tree(aux_tree);
+ }
+ if (auxMesh != NULL && auxMesh_free) {
+ BKE_id_free(NULL, auxMesh);
+ }
+}
+
+/*
+ * Shrinkwrap Target Surface Project mode
+ *
+ * It uses Newton's method to find a surface location with its
+ * smooth normal pointing at the original point.
+ *
+ * The equation system on barycentric weights and normal multiplier:
+ *
+ * (w0*V0 + w1*V1 + w2*V2) + l * (w0*N0 + w1*N1 + w2*N2) - CO = 0
+ * w0 + w1 + w2 = 1
+ *
+ * The actual solution vector is [ w0, w1, l ], with w2 eliminated.
+ */
+
+//#define TRACE_TARGET_PROJECT
+
+typedef struct TargetProjectTriData {
+ const float **vtri_co;
+ const float (*vtri_no)[3];
+ const float *point_co;
+
+ float n0_minus_n2[3], n1_minus_n2[3];
+ float c0_minus_c2[3], c1_minus_c2[3];
+
+ /* Current interpolated position and normal. */
+ float co_interp[3], no_interp[3];
+} TargetProjectTriData;
+
+/* Computes the deviation of the equation system from goal. */
+static void target_project_tri_deviation(void *userdata, const float x[3], float r_delta[3])
+{
+ TargetProjectTriData *data = userdata;
+
+ float w[3] = { x[0], x[1], 1.0f - x[0] - x[1] };
+ interp_v3_v3v3v3(data->co_interp, data->vtri_co[0], data->vtri_co[1], data->vtri_co[2], w);
+ interp_v3_v3v3v3(data->no_interp, data->vtri_no[0], data->vtri_no[1], data->vtri_no[2], w);
+
+ madd_v3_v3v3fl(r_delta, data->co_interp, data->no_interp, x[2]);
+ sub_v3_v3(r_delta, data->point_co);
+}
+
+/* Computes the Jacobian matrix of the equation system. */
+static void target_project_tri_jacobian(void *userdata, const float x[3], float r_jacobian[3][3])
+{
+ TargetProjectTriData *data = userdata;
+
+ madd_v3_v3v3fl(r_jacobian[0], data->c0_minus_c2, data->n0_minus_n2, x[2]);
+ madd_v3_v3v3fl(r_jacobian[1], data->c1_minus_c2, data->n1_minus_n2, x[2]);
+
+ copy_v3_v3(r_jacobian[2], data->vtri_no[2]);
+ madd_v3_v3fl(r_jacobian[2], data->n0_minus_n2, x[0]);
+ madd_v3_v3fl(r_jacobian[2], data->n1_minus_n2, x[1]);
+}
+
+/* Clamp barycentric weights to the triangle. */
+static void target_project_tri_clamp(float x[3])
+{
+ if (x[0] < 0.0f) {
+ x[0] = 0.0f;
+ }
+ if (x[1] < 0.0f) {
+ x[1] = 0.0f;
+ }
+ if (x[0] + x[1] > 1.0f) {
+ x[0] = x[0] / (x[0] + x[1]);
+ x[1] = 1.0f - x[0];
+ }
+}
+
+/* Correct the Newton's method step to keep the coordinates within the triangle. */
+static bool target_project_tri_correct(void *UNUSED(userdata), const float x[3], float step[3], float x_next[3])
+{
+ /* Insignificant correction threshold */
+ const float epsilon = 1e-6f;
+ const float dir_epsilon = 0.05f;
+ bool fixed = false, locked = false;
+
+ /* Weight 0 and 1 boundary check. */
+ for (int i = 0; i < 2; i++) {
+ if (step[i] > x[i]) {
+ if (step[i] > dir_epsilon * fabsf(step[1 - i])) {
+ /* Abort if the solution is clearly outside the domain. */
+ if (x[i] < epsilon) {
+ return false;
+ }
+
+ /* Scale a significant step down to arrive at the boundary. */
+ mul_v3_fl(step, x[i] / step[i]);
+ fixed = true;
+ }
+ else {
+ /* Reset precision errors to stay at the boundary. */
+ step[i] = x[i];
+ fixed = locked = true;
}
}
- /* After successfully build the trees, start projection vertices. */
- ShrinkwrapCalcCBData data = {
- .calc = calc,
- .treeData = treeData, .targ_tree = targ_tree, .targ_callback = targ_callback,
- .auxData = auxData, .aux_tree = aux_tree, .aux_callback = aux_callback,
- .proj_axis = proj_axis, .local2aux = &local2aux,
- };
- ParallelRangeSettings settings;
- BLI_parallel_range_settings_defaults(&settings);
- settings.use_threading = (calc->numVerts > BKE_MESH_OMP_LIMIT);
- settings.userdata_chunk = &hit;
- settings.userdata_chunk_size = sizeof(hit);
- BLI_task_parallel_range(0, calc->numVerts,
- &data,
- shrinkwrap_calc_normal_projection_cb_ex,
- &settings);
}
- /* free data structures */
- if (treeData) {
- if (emtarget) {
- free_bvhtree_from_editmesh(treeData);
+ /* Weight 2 boundary check. */
+ float sum = x[0] + x[1];
+ float sstep = step[0] + step[1];
+
+ if (sum - sstep > 1.0f) {
+ if (sstep < -dir_epsilon * (fabsf(step[0]) + fabsf(step[1]))) {
+ /* Abort if the solution is clearly outside the domain. */
+ if (sum > 1.0f - epsilon) {
+ return false;
+ }
+
+ /* Scale a significant step down to arrive at the boundary. */
+ mul_v3_fl(step, (1.0f - sum) / -sstep);
+ fixed = true;
}
else {
- free_bvhtree_from_mesh(treeData);
+ /* Reset precision errors to stay at the boundary. */
+ if (locked) {
+ step[0] = step[1] = 0.0f;
+ }
+ else {
+ step[0] -= 0.5f * sstep;
+ step[1] = -step[0];
+ fixed = true;
+ }
}
}
- if (auxData) {
- if (emaux) {
- free_bvhtree_from_editmesh(auxData);
+ /* Recompute and clamp the new coordinates after step correction. */
+ if (fixed) {
+ sub_v3_v3v3(x_next, x, step);
+ target_project_tri_clamp(x_next);
+ }
+
+ return true;
+}
+
+static bool target_project_solve_point_tri(
+ const float *vtri_co[3], const float vtri_no[3][3], const float point_co[3],
+ const float hit_co[3], float hit_dist_sq,
+ float r_hit_co[3], float r_hit_no[3])
+{
+ float x[3], tmp[3];
+ float dist = sqrtf(hit_dist_sq);
+ float epsilon = dist * 1.0e-5f;
+
+ CLAMP_MIN(epsilon, 1.0e-5f);
+
+ /* Initial solution vector: barycentric weights plus distance along normal. */
+ interp_weights_tri_v3(x, UNPACK3(vtri_co), hit_co);
+
+ interp_v3_v3v3v3(r_hit_no, UNPACK3(vtri_no), x);
+ sub_v3_v3v3(tmp, point_co, hit_co);
+
+ x[2] = (dot_v3v3(tmp, r_hit_no) < 0) ? -dist : dist;
+
+ /* Solve the equations iteratively. */
+ TargetProjectTriData tri_data = { .vtri_co = vtri_co, .vtri_no = vtri_no, .point_co = point_co };
+
+ sub_v3_v3v3(tri_data.n0_minus_n2, vtri_no[0], vtri_no[2]);
+ sub_v3_v3v3(tri_data.n1_minus_n2, vtri_no[1], vtri_no[2]);
+ sub_v3_v3v3(tri_data.c0_minus_c2, vtri_co[0], vtri_co[2]);
+ sub_v3_v3v3(tri_data.c1_minus_c2, vtri_co[1], vtri_co[2]);
+
+ target_project_tri_clamp(x);
+
+#ifdef TRACE_TARGET_PROJECT
+ const bool trace = true;
+#else
+ const bool trace = false;
+#endif
+
+ bool ok = BLI_newton3d_solve(target_project_tri_deviation, target_project_tri_jacobian, target_project_tri_correct, &tri_data, epsilon, 20, trace, x, x);
+
+ if (ok) {
+ copy_v3_v3(r_hit_co, tri_data.co_interp);
+ copy_v3_v3(r_hit_no, tri_data.no_interp);
+
+ return true;
+ }
+
+ return false;
+}
+
+static bool update_hit(BVHTreeNearest *nearest, int index, const float co[3], const float hit_co[3], const float hit_no[3])
+{
+ float dist_sq = len_squared_v3v3(hit_co, co);
+
+ if (dist_sq < nearest->dist_sq) {
+#ifdef TRACE_TARGET_PROJECT
+ printf("===> %d (%.3f,%.3f,%.3f) %g < %g\n", index, UNPACK3(hit_co), dist_sq, nearest->dist_sq);
+#endif
+ nearest->index = index;
+ nearest->dist_sq = dist_sq;
+ copy_v3_v3(nearest->co, hit_co);
+ normalize_v3_v3(nearest->no, hit_no);
+ return true;
+ }
+
+ return false;
+}
+
+/* Target projection on a non-manifold boundary edge - treats it like an infinitely thin cylinder. */
+static void target_project_edge(const ShrinkwrapTreeData *tree, int index, const float co[3], BVHTreeNearest *nearest, int eidx)
+{
+ const BVHTreeFromMesh *data = &tree->treeData;
+ const MEdge *edge = &tree->mesh->medge[eidx];
+ const float *vedge_co[2] = { data->vert[edge->v1].co, data->vert[edge->v2].co };
+
+#ifdef TRACE_TARGET_PROJECT
+ printf("EDGE %d (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n", eidx, UNPACK3(vedge_co[0]), UNPACK3(vedge_co[1]));
+#endif
+
+ /* Retrieve boundary vertex IDs */
+ const int *vert_boundary_id = tree->boundary->vert_boundary_id;
+ int bid1 = vert_boundary_id[edge->v1], bid2 = vert_boundary_id[edge->v2];
+
+ if (bid1 < 0 || bid2 < 0) {
+ return;
+ }
+
+ /* Retrieve boundary vertex normals and align them to direction. */
+ const ShrinkwrapBoundaryVertData *boundary_verts = tree->boundary->boundary_verts;
+ float vedge_dir[2][3], dir[3];
+
+ copy_v3_v3(vedge_dir[0], boundary_verts[bid1].normal_plane);
+ copy_v3_v3(vedge_dir[1], boundary_verts[bid2].normal_plane);
+
+ sub_v3_v3v3(dir, vedge_co[1], vedge_co[0]);
+
+ if (dot_v3v3(boundary_verts[bid1].direction, dir) < 0) {
+ negate_v3(vedge_dir[0]);
+ }
+ if (dot_v3v3(boundary_verts[bid2].direction, dir) < 0) {
+ negate_v3(vedge_dir[1]);
+ }
+
+ /* Solve a quadratic equation: lerp(d0,d1,x) * (co - lerp(v0,v1,x)) = 0 */
+ float d0v0 = dot_v3v3(vedge_dir[0], vedge_co[0]), d0v1 = dot_v3v3(vedge_dir[0], vedge_co[1]);
+ float d1v0 = dot_v3v3(vedge_dir[1], vedge_co[0]), d1v1 = dot_v3v3(vedge_dir[1], vedge_co[1]);
+ float d0co = dot_v3v3(vedge_dir[0], co);
+
+ float a = d0v1 - d0v0 + d1v0 - d1v1;
+ float b = 2 * d0v0 - d0v1 - d0co - d1v0 + dot_v3v3(vedge_dir[1], co);
+ float c = d0co - d0v0;
+ float det = b * b - 4 * a * c;
+
+ if (det >= 0) {
+ const float epsilon = 1e-6f;
+ float sdet = sqrtf(det);
+ float hit_co[3], hit_no[3];
+
+ for (int i = (det > 0 ? 2 : 0); i >= 0; i -= 2) {
+ float x = (- b + ((float)i - 1) * sdet) / (2 * a);
+
+ if (x >= -epsilon && x <= 1.0f + epsilon) {
+ CLAMP(x, 0, 1);
+
+ float vedge_no[2][3];
+ normal_short_to_float_v3(vedge_no[0], data->vert[edge->v1].no);
+ normal_short_to_float_v3(vedge_no[1], data->vert[edge->v2].no);
+
+ interp_v3_v3v3(hit_co, vedge_co[0], vedge_co[1], x);
+ interp_v3_v3v3(hit_no, vedge_no[0], vedge_no[1], x);
+
+ update_hit(nearest, index, co, hit_co, hit_no);
+ }
}
- else {
- free_bvhtree_from_mesh(auxData);
+ }
+}
+
+/* Target normal projection BVH callback - based on mesh_looptri_nearest_point. */
+static void mesh_looptri_target_project(void *userdata, int index, const float co[3], BVHTreeNearest *nearest)
+{
+ const ShrinkwrapTreeData *tree = (ShrinkwrapTreeData *)userdata;
+ const BVHTreeFromMesh *data = &tree->treeData;
+ const MLoopTri *lt = &data->looptri[index];
+ const MLoop *loop[3] = { &data->loop[lt->tri[0]], &data->loop[lt->tri[1]], &data->loop[lt->tri[2]] };
+ const MVert *vtri[3] = { &data->vert[loop[0]->v], &data->vert[loop[1]->v], &data->vert[loop[2]->v] };
+ const float *vtri_co[3] = { vtri[0]->co, vtri[1]->co, vtri[2]->co };
+ float raw_hit_co[3], hit_co[3], hit_no[3], dist_sq, vtri_no[3][3];
+
+ /* First find the closest point and bail out if it's worse than the current solution. */
+ closest_on_tri_to_point_v3(raw_hit_co, co, UNPACK3(vtri_co));
+ dist_sq = len_squared_v3v3(co, raw_hit_co);
+
+#ifdef TRACE_TARGET_PROJECT
+ printf("TRIANGLE %d (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f) %g %g\n",
+ index, UNPACK3(vtri_co[0]), UNPACK3(vtri_co[1]), UNPACK3(vtri_co[2]), dist_sq, nearest->dist_sq);
+#endif
+
+ if (dist_sq >= nearest->dist_sq)
+ return;
+
+ /* Decode normals */
+ normal_short_to_float_v3(vtri_no[0], vtri[0]->no);
+ normal_short_to_float_v3(vtri_no[1], vtri[1]->no);
+ normal_short_to_float_v3(vtri_no[2], vtri[2]->no);
+
+ /* Solve the equations for the triangle */
+ if (target_project_solve_point_tri(vtri_co, vtri_no, co, raw_hit_co, dist_sq, hit_co, hit_no)) {
+ update_hit(nearest, index, co, hit_co, hit_no);
+ }
+ /* Boundary edges */
+ else if (tree->boundary && BLI_BITMAP_TEST(tree->boundary->looptri_has_boundary, index)) {
+ const BLI_bitmap *is_boundary = tree->boundary->edge_is_boundary;
+ int edges[3];
+
+ BKE_mesh_looptri_get_real_edges(tree->mesh, lt, edges);
+
+ for (int i = 0; i < 3; i++) {
+ if (edges[i] >= 0 && BLI_BITMAP_TEST(is_boundary, edges[i])) {
+ target_project_edge(tree, index, co, nearest, edges[i]);
+ }
}
}
- if (auxMesh != NULL && auxMesh_free) {
- BKE_id_free(NULL, auxMesh);
+}
+
+/*
+ * Maps the point to the nearest surface, either by simple nearest, or by target normal projection.
+ */
+void BKE_shrinkwrap_find_nearest_surface(struct ShrinkwrapTreeData *tree, BVHTreeNearest *nearest, float co[3], int type)
+{
+ BVHTreeFromMesh *treeData = &tree->treeData;
+
+ if (type == MOD_SHRINKWRAP_TARGET_PROJECT) {
+#ifdef TRACE_TARGET_PROJECT
+ printf("====== TARGET PROJECT START ======\n");
+#endif
+
+ BLI_bvhtree_find_nearest_ex(tree->bvh, co, nearest, mesh_looptri_target_project, tree, BVH_NEAREST_OPTIMAL_ORDER);
+
+#ifdef TRACE_TARGET_PROJECT
+ printf("====== TARGET PROJECT END: %d %g ======\n", nearest->index, nearest->dist_sq);
+#endif
+
+ if (nearest->index < 0) {
+ /* fallback to simple nearest */
+ BLI_bvhtree_find_nearest(tree->bvh, co, nearest, treeData->nearest_callback, treeData);
+ }
+ }
+ else {
+ BLI_bvhtree_find_nearest(tree->bvh, co, nearest, treeData->nearest_callback, treeData);
}
}
@@ -503,7 +1058,6 @@ static void shrinkwrap_calc_nearest_surface_point_cb_ex(
ShrinkwrapCalcCBData *data = userdata;
ShrinkwrapCalcData *calc = data->calc;
- BVHTreeFromMesh *treeData = data->treeData;
BVHTreeNearest *nearest = tls->userdata_chunk;
float *co = calc->vertexCos[i];
@@ -532,31 +1086,26 @@ static void shrinkwrap_calc_nearest_surface_point_cb_ex(
* If we already had an hit before.. we assume this vertex is going to have a close hit to that other vertex
* so we can initiate the "nearest.dist" with the expected value to that last hit.
* This will lead in pruning of the search tree. */
- if (nearest->index != -1)
- nearest->dist_sq = len_squared_v3v3(tmp_co, nearest->co);
+ if (nearest->index != -1) {
+ if (calc->smd->shrinkType == MOD_SHRINKWRAP_TARGET_PROJECT) {
+ /* Heuristic doesn't work because of additional restrictions. */
+ nearest->index = -1;
+ nearest->dist_sq = FLT_MAX;
+ }
+ else {
+ nearest->dist_sq = len_squared_v3v3(tmp_co, nearest->co);
+ }
+ }
else
nearest->dist_sq = FLT_MAX;
- BLI_bvhtree_find_nearest(treeData->tree, tmp_co, nearest, treeData->nearest_callback, treeData);
+ BKE_shrinkwrap_find_nearest_surface(data->tree, nearest, tmp_co, calc->smd->shrinkType);
/* Found the nearest vertex */
if (nearest->index != -1) {
- if (calc->smd->shrinkOpts & MOD_SHRINKWRAP_KEEP_ABOVE_SURFACE) {
- /* Make the vertex stay on the front side of the face */
- madd_v3_v3v3fl(tmp_co, nearest->co, nearest->no, calc->keepDist);
- }
- else {
- /* Adjusting the vertex weight,
- * so that after interpolating it keeps a certain distance from the nearest position */
- const float dist = sasqrt(nearest->dist_sq);
- if (dist > FLT_EPSILON) {
- /* linear interpolation */
- interp_v3_v3v3(tmp_co, tmp_co, nearest->co, (dist - calc->keepDist) / dist);
- }
- else {
- copy_v3_v3(tmp_co, nearest->co);
- }
- }
+ BKE_shrinkwrap_snap_point_to_surface(
+ data->tree, NULL, calc->smd->shrinkMode,
+ nearest->index, nearest->co, nearest->no, calc->keepDist, tmp_co, tmp_co);
/* Convert the coordinates back to mesh coordinates */
BLI_space_transform_invert(&calc->local2target, tmp_co);
@@ -564,28 +1113,161 @@ static void shrinkwrap_calc_nearest_surface_point_cb_ex(
}
}
-static void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *calc)
+/**
+ * Compute a smooth normal of the target (if applicable) at the hit location.
+ *
+ * \param tree: information about the mesh
+ * \param transform: transform from the hit coordinate space to the object space; may be null
+ * \param r_no: output in hit coordinate space; may be shared with inputs
+ */
+void BKE_shrinkwrap_compute_smooth_normal(
+ const struct ShrinkwrapTreeData *tree, const struct SpaceTransform *transform,
+ int looptri_idx, const float hit_co[3], const float hit_no[3], float r_no[3])
{
- BVHTreeFromMesh treeData = NULL_BVHTreeFromMesh;
- BVHTreeNearest nearest = NULL_BVHTreeNearest;
+ const BVHTreeFromMesh *treeData = &tree->treeData;
+ const MLoopTri *tri = &treeData->looptri[looptri_idx];
+
+ /* Interpolate smooth normals if enabled. */
+ if ((tree->mesh->mpoly[tri->poly].flag & ME_SMOOTH) != 0) {
+ const MVert *verts[] = {
+ &treeData->vert[treeData->loop[tri->tri[0]].v],
+ &treeData->vert[treeData->loop[tri->tri[1]].v],
+ &treeData->vert[treeData->loop[tri->tri[2]].v],
+ };
+ float w[3], no[3][3], tmp_co[3];
- if (calc->target->totpoly == 0) {
- return;
+ /* Custom and auto smooth split normals. */
+ if (tree->clnors) {
+ copy_v3_v3(no[0], tree->clnors[tri->tri[0]]);
+ copy_v3_v3(no[1], tree->clnors[tri->tri[1]]);
+ copy_v3_v3(no[2], tree->clnors[tri->tri[2]]);
+ }
+ /* Ordinary vertex normals. */
+ else {
+ normal_short_to_float_v3(no[0], verts[0]->no);
+ normal_short_to_float_v3(no[1], verts[1]->no);
+ normal_short_to_float_v3(no[2], verts[2]->no);
+ }
+
+ /* Barycentric weights from hit point. */
+ copy_v3_v3(tmp_co, hit_co);
+
+ if (transform) {
+ BLI_space_transform_apply(transform, tmp_co);
+ }
+
+ interp_weights_tri_v3(w, verts[0]->co, verts[1]->co, verts[2]->co, tmp_co);
+
+ /* Interpolate using weights. */
+ interp_v3_v3v3v3(r_no, no[0], no[1], no[2], w);
+
+ if (transform) {
+ BLI_space_transform_invert_normal(transform, r_no);
+ }
+ else {
+ normalize_v3(r_no);
+ }
+ }
+ /* Use the looptri normal if flat. */
+ else {
+ copy_v3_v3(r_no, hit_no);
}
+}
- /* Create a bvh-tree of the given target */
- BKE_bvhtree_from_mesh_get(&treeData, calc->target, BVHTREE_FROM_LOOPTRI, 2);
- if (treeData.tree == NULL) {
- OUT_OF_MEMORY();
- return;
+/* Helper for MOD_SHRINKWRAP_INSIDE, MOD_SHRINKWRAP_OUTSIDE and MOD_SHRINKWRAP_OUTSIDE_SURFACE. */
+static void shrinkwrap_snap_with_side(float r_point_co[3], const float point_co[3], const float hit_co[3], const float hit_no[3], float goal_dist, float forcesign, bool forcesnap)
+{
+ float dist = len_v3v3(point_co, hit_co);
+
+ /* If exactly on the surface, push out along normal */
+ if (dist < FLT_EPSILON) {
+ madd_v3_v3v3fl(r_point_co, hit_co, hit_no, goal_dist * forcesign);
+ }
+ /* Move to the correct side if needed */
+ else {
+ float delta[3];
+ sub_v3_v3v3(delta, point_co, hit_co);
+ float dsign = signf(dot_v3v3(delta, hit_no));
+
+ /* If on the wrong side or too close, move to correct */
+ if (forcesnap || dsign * forcesign < 0 || dist < goal_dist) {
+ interp_v3_v3v3(r_point_co, point_co, hit_co, (dist - goal_dist * dsign * forcesign) / dist);
+ }
+ else {
+ copy_v3_v3(r_point_co, point_co);
+ }
}
+}
+
+/**
+ * Apply the shrink to surface modes to the given original coordinates and nearest point.
+ *
+ * \param tree: mesh data for smooth normals
+ * \param transform: transform from the hit coordinate space to the object space; may be null
+ * \param r_point_co: may be the same memory location as point_co, hit_co, or hit_no.
+ */
+void BKE_shrinkwrap_snap_point_to_surface(
+ const struct ShrinkwrapTreeData *tree, const struct SpaceTransform *transform,
+ int mode, int hit_idx, const float hit_co[3], const float hit_no[3], float goal_dist,
+ const float point_co[3], float r_point_co[3])
+{
+ float dist, tmp[3];
+
+ switch (mode) {
+ /* Offsets along the line between point_co and hit_co. */
+ case MOD_SHRINKWRAP_ON_SURFACE:
+ if (goal_dist > 0 && (dist = len_v3v3(point_co, hit_co)) > FLT_EPSILON) {
+ interp_v3_v3v3(r_point_co, point_co, hit_co, (dist - goal_dist) / dist);
+ }
+ else {
+ copy_v3_v3(r_point_co, hit_co);
+ }
+ break;
+
+ case MOD_SHRINKWRAP_INSIDE:
+ shrinkwrap_snap_with_side(r_point_co, point_co, hit_co, hit_no, goal_dist, -1, false);
+ break;
+
+ case MOD_SHRINKWRAP_OUTSIDE:
+ shrinkwrap_snap_with_side(r_point_co, point_co, hit_co, hit_no, goal_dist, +1, false);
+ break;
+
+ case MOD_SHRINKWRAP_OUTSIDE_SURFACE:
+ if (goal_dist > 0) {
+ shrinkwrap_snap_with_side(r_point_co, point_co, hit_co, hit_no, goal_dist, +1, true);
+ }
+ else {
+ copy_v3_v3(r_point_co, hit_co);
+ }
+ break;
+
+ /* Offsets along the normal */
+ case MOD_SHRINKWRAP_ABOVE_SURFACE:
+ if (goal_dist > 0) {
+ BKE_shrinkwrap_compute_smooth_normal(tree, transform, hit_idx, hit_co, hit_no, tmp);
+ madd_v3_v3v3fl(r_point_co, hit_co, tmp, goal_dist);
+ }
+ else {
+ copy_v3_v3(r_point_co, hit_co);
+ }
+ break;
+
+ default:
+ printf("Unknown Shrinkwrap surface snap mode: %d\n", mode);
+ copy_v3_v3(r_point_co, hit_co);
+ }
+}
+
+static void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *calc)
+{
+ BVHTreeNearest nearest = NULL_BVHTreeNearest;
/* Setup nearest */
nearest.index = -1;
nearest.dist_sq = FLT_MAX;
/* Find the nearest vertex */
- ShrinkwrapCalcCBData data = {.calc = calc, .treeData = &treeData};
+ ShrinkwrapCalcCBData data = {.calc = calc, .tree = calc->tree};
ParallelRangeSettings settings;
BLI_parallel_range_settings_defaults(&settings);
settings.use_threading = (calc->numVerts > BKE_MESH_OMP_LIMIT);
@@ -595,8 +1277,6 @@ static void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *calc)
&data,
shrinkwrap_calc_nearest_surface_point_cb_ex,
&settings);
-
- free_bvhtree_from_mesh(&treeData);
}
/* Main shrinkwrap function */
@@ -606,7 +1286,7 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, struct Scene *scene,
DerivedMesh *ss_mesh = NULL;
ShrinkwrapCalcData calc = NULL_ShrinkwrapCalcData;
- bool target_free;
+ bool target_free = false;
/* remove loop dependencies on derived meshes (TODO should this be done elsewhere?) */
if (smd->target == ob) smd->target = NULL;
@@ -680,9 +1360,14 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, struct Scene *scene,
}
/* Projecting target defined - lets work! */
- if (calc.target) {
+ ShrinkwrapTreeData tree;
+
+ if (BKE_shrinkwrap_init_tree(&tree, calc.target, smd->shrinkType, smd->shrinkMode, false)) {
+ calc.tree = &tree;
+
switch (smd->shrinkType) {
case MOD_SHRINKWRAP_NEAREST_SURFACE:
+ case MOD_SHRINKWRAP_TARGET_PROJECT:
TIMEIT_BENCH(shrinkwrap_calc_nearest_surface_point(&calc), deform_surface);
break;
@@ -694,6 +1379,8 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, struct Scene *scene,
TIMEIT_BENCH(shrinkwrap_calc_nearest_vertex(&calc), deform_vertex);
break;
}
+
+ BKE_shrinkwrap_free_tree(&tree);
}
/* free memory */
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index c9b10e36ed1..4a403d337b3 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -54,6 +54,7 @@
#include "DNA_constraint_types.h"
#include "DNA_customdata_types.h"
#include "DNA_lamp_types.h"
+#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
@@ -65,16 +66,17 @@
#include "BKE_animsys.h"
#include "BKE_armature.h"
#include "BKE_bvhutils.h"
-#include "BKE_cdderivedmesh.h"
#include "BKE_collision.h"
#include "BKE_colortools.h"
#include "BKE_constraint.h"
#include "BKE_customdata.h"
#include "BKE_deform.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_effect.h"
#include "BKE_global.h"
+#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_mesh.h"
+#include "BKE_mesh_runtime.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
#include "BKE_particle.h"
@@ -105,9 +107,9 @@
static ThreadMutex object_update_lock = BLI_MUTEX_INITIALIZER;
+struct Mesh;
struct Object;
struct Scene;
-struct DerivedMesh;
struct SmokeModifierData;
// timestep default value for nice appearance 0.1f
@@ -129,7 +131,7 @@ void smoke_initWaveletBlenderRNA(struct WTURBULENCE *UNUSED(wt), float *UNUSED(s
void smoke_initBlenderRNA(struct FLUID_3D *UNUSED(fluid), float *UNUSED(alpha), float *UNUSED(beta), float *UNUSED(dt_factor), float *UNUSED(vorticity),
int *UNUSED(border_colli), float *UNUSED(burning_rate), float *UNUSED(flame_smoke), float *UNUSED(flame_smoke_color),
float *UNUSED(flame_vorticity), float *UNUSED(flame_ignition_temp), float *UNUSED(flame_max_temp)) {}
-struct DerivedMesh *smokeModifier_do(SmokeModifierData *UNUSED(smd), struct Depsgraph *UNUSED(depsgraph), Scene *UNUSED(scene), Object *UNUSED(ob), DerivedMesh *UNUSED(dm)) { return NULL; }
+struct Mesh *smokeModifier_do(SmokeModifierData *UNUSED(smd), Depsgraph *UNUSED(depsgraph), Scene *UNUSED(scene), Object *UNUSED(ob), Mesh *UNUSED(me)) { return NULL; }
float smoke_get_velocity_at(struct Object *UNUSED(ob), float UNUSED(position[3]), float UNUSED(velocity[3])) { return 0.0f; }
#endif /* WITH_SMOKE */
@@ -194,20 +196,20 @@ static void smoke_pos_to_cell(SmokeDomainSettings *sds, float pos[3])
pos[2] *= 1.0f / sds->cell_size[2];
}
-/* set domain transformations and base resolution from object derivedmesh */
-static void smoke_set_domain_from_derivedmesh(SmokeDomainSettings *sds, Object *ob, DerivedMesh *dm, bool init_resolution)
+/* set domain transformations and base resolution from object mesh */
+static void smoke_set_domain_from_mesh(SmokeDomainSettings *sds, Object *ob, Mesh *me, bool init_resolution)
{
size_t i;
float min[3] = {FLT_MAX, FLT_MAX, FLT_MAX}, max[3] = {-FLT_MAX, -FLT_MAX, -FLT_MAX};
float size[3];
- MVert *verts = dm->getVertArray(dm);
+ MVert *verts = me->mvert;
float scale = 0.0;
int res;
res = sds->maxres;
// get BB of domain
- for (i = 0; i < dm->getNumVerts(dm); i++)
+ for (i = 0; i < me->totvert; i++)
{
// min BB
min[0] = MIN2(min[0], verts[i].co[0]);
@@ -273,14 +275,14 @@ static void smoke_set_domain_from_derivedmesh(SmokeDomainSettings *sds, Object *
sds->cell_size[2] /= (float)sds->base_res[2];
}
-static int smokeModifier_init(SmokeModifierData *smd, Object *ob, Scene *scene, DerivedMesh *dm)
+static int smokeModifier_init(SmokeModifierData *smd, Object *ob, int scene_framenr, Mesh *me)
{
if ((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain && !smd->domain->fluid)
{
SmokeDomainSettings *sds = smd->domain;
int res[3];
- /* set domain dimensions from derivedmesh */
- smoke_set_domain_from_derivedmesh(sds, ob, dm, true);
+ /* set domain dimensions from mesh */
+ smoke_set_domain_from_mesh(sds, ob, me, true);
/* reset domain values */
zero_v3_int(sds->shift);
zero_v3(sds->shift_f);
@@ -304,7 +306,7 @@ static int smokeModifier_init(SmokeModifierData *smd, Object *ob, Scene *scene,
/* allocate fluid */
smoke_reallocate_fluid(sds, sds->dx, sds->res, 0);
- smd->time = scene->r.cfra;
+ smd->time = scene_framenr;
/* allocate highres fluid */
if (sds->flags & MOD_SMOKE_HIGHRES) {
@@ -318,7 +320,7 @@ static int smokeModifier_init(SmokeModifierData *smd, Object *ob, Scene *scene,
}
else if ((smd->type & MOD_SMOKE_TYPE_FLOW) && smd->flow)
{
- smd->time = scene->r.cfra;
+ smd->time = scene_framenr;
return 1;
}
@@ -329,7 +331,7 @@ static int smokeModifier_init(SmokeModifierData *smd, Object *ob, Scene *scene,
smokeModifier_createType(smd);
}
- smd->time = scene->r.cfra;
+ smd->time = scene_framenr;
return 1;
}
@@ -360,8 +362,10 @@ static void smokeModifier_freeDomain(SmokeModifierData *smd)
MEM_freeN(smd->domain->effector_weights);
smd->domain->effector_weights = NULL;
- BKE_ptcache_free_list(&(smd->domain->ptcaches[0]));
- smd->domain->point_cache[0] = NULL;
+ if (!(smd->modifier.flag & eModifierFlag_SharedCaches)) {
+ BKE_ptcache_free_list(&(smd->domain->ptcaches[0]));
+ smd->domain->point_cache[0] = NULL;
+ }
if (smd->domain->coba) {
MEM_freeN(smd->domain->coba);
@@ -376,7 +380,7 @@ static void smokeModifier_freeFlow(SmokeModifierData *smd)
{
if (smd->flow)
{
- if (smd->flow->dm) smd->flow->dm->release(smd->flow->dm);
+ if (smd->flow->mesh) BKE_id_free(NULL, smd->flow->mesh);
if (smd->flow->verts_old) MEM_freeN(smd->flow->verts_old);
MEM_freeN(smd->flow);
smd->flow = NULL;
@@ -398,9 +402,9 @@ static void smokeModifier_freeCollision(SmokeModifierData *smd)
}
}
- if (smd->coll->dm)
- smd->coll->dm->release(smd->coll->dm);
- smd->coll->dm = NULL;
+ if (smd->coll->mesh)
+ BKE_id_free(NULL, smd->coll->mesh);
+ smd->coll->mesh = NULL;
MEM_freeN(smd->coll);
smd->coll = NULL;
@@ -583,7 +587,7 @@ void smokeModifier_createType(struct SmokeModifierData *smd)
smd->flow->color[1] = 0.7f;
smd->flow->color[2] = 0.7f;
- smd->flow->dm = NULL;
+ smd->flow->mesh = NULL;
smd->flow->psys = NULL;
}
@@ -598,16 +602,12 @@ void smokeModifier_createType(struct SmokeModifierData *smd)
smd->coll->verts_old = NULL;
smd->coll->numverts = 0;
smd->coll->type = 0; // static obstacle
- smd->coll->dm = NULL;
-
-#ifdef USE_SMOKE_COLLISION_DM
- smd->coll->dm = NULL;
-#endif
+ smd->coll->mesh = NULL;
}
}
}
-void smokeModifier_copy(const struct SmokeModifierData *smd, struct SmokeModifierData *tsmd)
+void smokeModifier_copy(const struct SmokeModifierData *smd, struct SmokeModifierData *tsmd, const int flag)
{
tsmd->type = smd->type;
tsmd->time = smd->time;
@@ -615,80 +615,102 @@ void smokeModifier_copy(const struct SmokeModifierData *smd, struct SmokeModifie
smokeModifier_createType(tsmd);
if (tsmd->domain) {
- tsmd->domain->fluid_group = smd->domain->fluid_group;
- tsmd->domain->coll_group = smd->domain->coll_group;
-
- tsmd->domain->adapt_margin = smd->domain->adapt_margin;
- tsmd->domain->adapt_res = smd->domain->adapt_res;
- tsmd->domain->adapt_threshold = smd->domain->adapt_threshold;
-
- tsmd->domain->alpha = smd->domain->alpha;
- tsmd->domain->beta = smd->domain->beta;
- tsmd->domain->amplify = smd->domain->amplify;
- tsmd->domain->maxres = smd->domain->maxres;
- tsmd->domain->flags = smd->domain->flags;
- tsmd->domain->highres_sampling = smd->domain->highres_sampling;
- tsmd->domain->viewsettings = smd->domain->viewsettings;
- tsmd->domain->noise = smd->domain->noise;
- tsmd->domain->diss_speed = smd->domain->diss_speed;
- tsmd->domain->strength = smd->domain->strength;
-
- tsmd->domain->border_collisions = smd->domain->border_collisions;
- tsmd->domain->vorticity = smd->domain->vorticity;
- tsmd->domain->time_scale = smd->domain->time_scale;
-
- tsmd->domain->burning_rate = smd->domain->burning_rate;
- tsmd->domain->flame_smoke = smd->domain->flame_smoke;
- tsmd->domain->flame_vorticity = smd->domain->flame_vorticity;
- tsmd->domain->flame_ignition = smd->domain->flame_ignition;
- tsmd->domain->flame_max_temp = smd->domain->flame_max_temp;
- copy_v3_v3(tsmd->domain->flame_smoke_color, smd->domain->flame_smoke_color);
-
- MEM_freeN(tsmd->domain->effector_weights);
- tsmd->domain->effector_weights = MEM_dupallocN(smd->domain->effector_weights);
- tsmd->domain->openvdb_comp = smd->domain->openvdb_comp;
- tsmd->domain->data_depth = smd->domain->data_depth;
- tsmd->domain->cache_file_format = smd->domain->cache_file_format;
-
- tsmd->domain->slice_method = smd->domain->slice_method;
- tsmd->domain->axis_slice_method = smd->domain->axis_slice_method;
- tsmd->domain->slice_per_voxel = smd->domain->slice_per_voxel;
- tsmd->domain->slice_depth = smd->domain->slice_depth;
- tsmd->domain->slice_axis = smd->domain->slice_axis;
- tsmd->domain->draw_velocity = smd->domain->draw_velocity;
- tsmd->domain->vector_draw_type = smd->domain->vector_draw_type;
- tsmd->domain->vector_scale = smd->domain->vector_scale;
+ SmokeDomainSettings *tsds = tsmd->domain;
+ SmokeDomainSettings *sds = smd->domain;
- if (smd->domain->coba) {
- tsmd->domain->coba = MEM_dupallocN(smd->domain->coba);
+ BKE_ptcache_free_list(&(tsds->ptcaches[0]));
+
+ if (flag & LIB_ID_CREATE_NO_MAIN) {
+ /* Share the cache with the original object's modifier. */
+ tsmd->modifier.flag |= eModifierFlag_SharedCaches;
+ tsds->point_cache[0] = sds->point_cache[0];
+ tsds->ptcaches[0] = sds->ptcaches[0];
+ }
+ else {
+ tsds->point_cache[0] = BKE_ptcache_copy_list(&(tsds->ptcaches[0]), &(sds->ptcaches[0]), flag);
+ }
+
+ tsds->fluid_group = sds->fluid_group;
+ tsds->coll_group = sds->coll_group;
+
+ tsds->adapt_margin = sds->adapt_margin;
+ tsds->adapt_res = sds->adapt_res;
+ tsds->adapt_threshold = sds->adapt_threshold;
+
+ tsds->alpha = sds->alpha;
+ tsds->beta = sds->beta;
+ tsds->amplify = sds->amplify;
+ tsds->maxres = sds->maxres;
+ tsds->flags = sds->flags;
+ tsds->highres_sampling = sds->highres_sampling;
+ tsds->viewsettings = sds->viewsettings;
+ tsds->noise = sds->noise;
+ tsds->diss_speed = sds->diss_speed;
+ tsds->strength = sds->strength;
+
+ tsds->border_collisions = sds->border_collisions;
+ tsds->vorticity = sds->vorticity;
+ tsds->time_scale = sds->time_scale;
+
+ tsds->burning_rate = sds->burning_rate;
+ tsds->flame_smoke = sds->flame_smoke;
+ tsds->flame_vorticity = sds->flame_vorticity;
+ tsds->flame_ignition = sds->flame_ignition;
+ tsds->flame_max_temp = sds->flame_max_temp;
+ copy_v3_v3(tsds->flame_smoke_color, sds->flame_smoke_color);
+
+ MEM_freeN(tsds->effector_weights);
+ tsds->effector_weights = MEM_dupallocN(sds->effector_weights);
+ tsds->openvdb_comp = sds->openvdb_comp;
+ tsds->data_depth = sds->data_depth;
+ tsds->cache_file_format = sds->cache_file_format;
+
+ tsds->display_thickness = sds->display_thickness;
+ tsds->slice_method = sds->slice_method;
+ tsds->axis_slice_method = sds->axis_slice_method;
+ tsds->slice_per_voxel = sds->slice_per_voxel;
+ tsds->slice_depth = sds->slice_depth;
+ tsds->slice_axis = sds->slice_axis;
+ tsds->interp_method = sds->interp_method;
+ tsds->draw_velocity = sds->draw_velocity;
+ tsds->vector_draw_type = sds->vector_draw_type;
+ tsds->vector_scale = sds->vector_scale;
+
+ tsds->use_coba = sds->use_coba;
+ tsds->coba_field = sds->coba_field;
+ if (sds->coba) {
+ tsds->coba = MEM_dupallocN(sds->coba);
}
}
else if (tsmd->flow) {
- tsmd->flow->psys = smd->flow->psys;
- tsmd->flow->noise_texture = smd->flow->noise_texture;
-
- tsmd->flow->vel_multi = smd->flow->vel_multi;
- tsmd->flow->vel_normal = smd->flow->vel_normal;
- tsmd->flow->vel_random = smd->flow->vel_random;
-
- tsmd->flow->density = smd->flow->density;
- copy_v3_v3(tsmd->flow->color, smd->flow->color);
- tsmd->flow->fuel_amount = smd->flow->fuel_amount;
- tsmd->flow->temp = smd->flow->temp;
- tsmd->flow->volume_density = smd->flow->volume_density;
- tsmd->flow->surface_distance = smd->flow->surface_distance;
- tsmd->flow->particle_size = smd->flow->particle_size;
- tsmd->flow->subframes = smd->flow->subframes;
-
- tsmd->flow->texture_size = smd->flow->texture_size;
- tsmd->flow->texture_offset = smd->flow->texture_offset;
- BLI_strncpy(tsmd->flow->uvlayer_name, smd->flow->uvlayer_name, sizeof(tsmd->flow->uvlayer_name));
- tsmd->flow->vgroup_density = smd->flow->vgroup_density;
-
- tsmd->flow->type = smd->flow->type;
- tsmd->flow->source = smd->flow->source;
- tsmd->flow->texture_type = smd->flow->texture_type;
- tsmd->flow->flags = smd->flow->flags;
+ SmokeFlowSettings *tsfs = tsmd->flow;
+ SmokeFlowSettings *sfs = smd->flow;
+
+ tsfs->psys = sfs->psys;
+ tsfs->noise_texture = sfs->noise_texture;
+
+ tsfs->vel_multi = sfs->vel_multi;
+ tsfs->vel_normal = sfs->vel_normal;
+ tsfs->vel_random = sfs->vel_random;
+
+ tsfs->density = sfs->density;
+ copy_v3_v3(tsfs->color, sfs->color);
+ tsfs->fuel_amount = sfs->fuel_amount;
+ tsfs->temp = sfs->temp;
+ tsfs->volume_density = sfs->volume_density;
+ tsfs->surface_distance = sfs->surface_distance;
+ tsfs->particle_size = sfs->particle_size;
+ tsfs->subframes = sfs->subframes;
+
+ tsfs->texture_size = sfs->texture_size;
+ tsfs->texture_offset = sfs->texture_offset;
+ BLI_strncpy(tsfs->uvlayer_name, sfs->uvlayer_name, sizeof(tsfs->uvlayer_name));
+ tsfs->vgroup_density = sfs->vgroup_density;
+
+ tsfs->type = sfs->type;
+ tsfs->source = sfs->source;
+ tsfs->texture_type = sfs->texture_type;
+ tsfs->flags = sfs->flags;
}
else if (tsmd->coll) {
/* leave it as initialized, collision settings is mostly caches */
@@ -697,7 +719,7 @@ void smokeModifier_copy(const struct SmokeModifierData *smd, struct SmokeModifie
#ifdef WITH_SMOKE
-// forward decleration
+// forward declaration
static void smoke_calc_transparency(SmokeDomainSettings *sds, ViewLayer *view_layer);
static float calc_voxel_transp(float *result, float *input, int res[3], int *pixel, float *tRay, float correct);
@@ -743,7 +765,7 @@ typedef struct ObstaclesFromDMData {
int *num_obstacles;
} ObstaclesFromDMData;
-static void obstacles_from_derivedmesh_task_cb(
+static void obstacles_from_mesh_task_cb(
void *__restrict userdata,
const int z,
const ParallelRangeTLS *__restrict UNUSED(tls))
@@ -800,13 +822,13 @@ static void obstacles_from_derivedmesh_task_cb(
}
}
-static void obstacles_from_derivedmesh(
+static void obstacles_from_mesh(
Object *coll_ob, SmokeDomainSettings *sds, SmokeCollSettings *scs,
unsigned char *obstacle_map, float *velocityX, float *velocityY, float *velocityZ, int *num_obstacles, float dt)
{
- if (!scs->dm) return;
+ if (!scs->mesh) return;
{
- DerivedMesh *dm = NULL;
+ Mesh *me = NULL;
MVert *mvert = NULL;
const MLoopTri *looptri;
const MLoop *mloop;
@@ -816,12 +838,12 @@ static void obstacles_from_derivedmesh(
float *vert_vel = NULL;
bool has_velocity = false;
- dm = CDDM_copy(scs->dm);
- CDDM_calc_normals(dm);
- mvert = dm->getVertArray(dm);
- mloop = dm->getLoopArray(dm);
- looptri = dm->getLoopTriArray(dm);
- numverts = dm->getNumVerts(dm);
+ me = BKE_mesh_copy_for_eval(scs->mesh, true);
+ BKE_mesh_ensure_normals(me);
+ mvert = me->mvert;
+ mloop = me->mloop;
+ looptri = BKE_mesh_runtime_looptri_ensure(me);
+ numverts = me->totvert;
// DG TODO
// if (scs->type > SM_COLL_STATIC)
@@ -868,7 +890,7 @@ static void obstacles_from_derivedmesh(
copy_v3_v3(&scs->verts_old[i * 3], co);
}
- if (bvhtree_from_mesh_get(&treeData, dm, BVHTREE_FROM_LOOPTRI, 4)) {
+ if (BKE_bvhtree_from_mesh_get(&treeData, me, BVHTREE_FROM_LOOPTRI, 4)) {
ObstaclesFromDMData data = {
.sds = sds, .mvert = mvert, .mloop = mloop, .looptri = looptri,
.tree = &treeData, .obstacle_map = obstacle_map,
@@ -881,12 +903,12 @@ static void obstacles_from_derivedmesh(
settings.scheduling_mode = TASK_SCHEDULING_DYNAMIC;
BLI_task_parallel_range(sds->res_min[2], sds->res_max[2],
&data,
- obstacles_from_derivedmesh_task_cb,
+ obstacles_from_mesh_task_cb,
&settings);
}
/* free bvh tree */
free_bvhtree_from_mesh(&treeData);
- dm->release(dm);
+ BKE_id_free(NULL, me);
if (vert_vel) MEM_freeN(vert_vel);
}
@@ -946,7 +968,7 @@ static void update_obstacles(Depsgraph *depsgraph, Object *ob, SmokeDomainSettin
if ((smd2->type & MOD_SMOKE_TYPE_COLL) && smd2->coll)
{
SmokeCollSettings *scs = smd2->coll;
- obstacles_from_derivedmesh(collob, sds, scs, obstacles, velx, vely, velz, num_obstacles, dt);
+ obstacles_from_mesh(collob, sds, scs, obstacles, velx, vely, velz, num_obstacles, dt);
}
}
@@ -1265,7 +1287,7 @@ static void emit_from_particles_task_cb(
}
static void emit_from_particles(
- Object *flow_ob, SmokeDomainSettings *sds, SmokeFlowSettings *sfs, EmissionMap *em, Scene *scene, float dt)
+ Object *flow_ob, SmokeDomainSettings *sds, SmokeFlowSettings *sfs, EmissionMap *em, Depsgraph *depsgraph, Scene *scene, float dt)
{
if (sfs && sfs->psys && sfs->psys->part && ELEM(sfs->psys->part->type, PART_EMITTER, PART_FLUID)) // is particle system selected
{
@@ -1284,6 +1306,7 @@ static void emit_from_particles(
int hires_multiplier = 1;
KDTree *tree = NULL;
+ sim.depsgraph = depsgraph;
sim.scene = scene;
sim.ob = flow_ob;
sim.psys = psys;
@@ -1336,7 +1359,7 @@ static void emit_from_particles(
continue;
}
- state.time = BKE_scene_frame_get(scene); /* use scene time */
+ state.time = DEG_get_ctime(depsgraph); /* use depsgraph time */
if (psys_get_particle_state(&sim, p, &state, 0) == 0)
continue;
@@ -1437,7 +1460,7 @@ static void emit_from_particles(
}
}
-static void sample_derivedmesh(
+static void sample_mesh(
SmokeFlowSettings *sfs,
const MVert *mvert, const MLoop *mloop, const MLoopTri *mlooptri, const MLoopUV *mloopuv,
float *influence_map, float *velocity_map, int index, const int base_res[3], float flow_center[3],
@@ -1509,12 +1532,12 @@ static void sample_derivedmesh(
interp_v3_v3v3v3(hit_normal, n1, n2, n3, weights);
normalize_v3(hit_normal);
/* apply normal directional and random velocity
- * - TODO: random disabled for now since it doesnt really work well as pressure calc smoothens it out... */
+ * - TODO: random disabled for now since it doesn't really work well as pressure calc smoothens it out... */
velocity_map[index * 3] += hit_normal[0] * sfs->vel_normal * 0.25f;
velocity_map[index * 3 + 1] += hit_normal[1] * sfs->vel_normal * 0.25f;
velocity_map[index * 3 + 2] += hit_normal[2] * sfs->vel_normal * 0.25f;
/* TODO: for fire emitted from mesh surface we can use
- * Vf = Vs + (Ps/Pf - 1)*S to model gaseous expansion from solid to fuel */
+ * Vf = Vs + (Ps/Pf - 1)*S to model gaseous expansion from solid to fuel */
}
/* apply object velocity */
if (has_velocity && sfs->vel_multi) {
@@ -1594,7 +1617,7 @@ typedef struct EmitFromDMData {
int *min, *max, *res;
} EmitFromDMData;
-static void emit_from_derivedmesh_task_cb(
+static void emit_from_mesh_task_cb(
void *__restrict userdata,
const int z,
const ParallelRangeTLS *__restrict UNUSED(tls))
@@ -1616,7 +1639,7 @@ static void emit_from_derivedmesh_task_cb(
lx - em->min[0], em->res[0], ly - em->min[1], em->res[1], lz - em->min[2]);
const float ray_start[3] = {((float)lx) + 0.5f, ((float)ly) + 0.5f, ((float)lz) + 0.5f};
- sample_derivedmesh(
+ sample_mesh(
data->sfs, data->mvert, data->mloop, data->mlooptri, data->mloopuv,
em->influence, em->velocity, index, data->sds->base_res, data->flow_center,
data->tree, ray_start, data->vert_vel, data->has_velocity, data->defgrp_index, data->dvert,
@@ -1634,7 +1657,7 @@ static void emit_from_derivedmesh_task_cb(
x - data->min[0], data->res[0], y - data->min[1], data->res[1], z - data->min[2]);
const float ray_start[3] = {lx + 0.5f * data->hr, ly + 0.5f * data->hr, lz + 0.5f * data->hr};
- sample_derivedmesh(
+ sample_mesh(
data->sfs, data->mvert, data->mloop, data->mlooptri, data->mloopuv,
em->influence_high, NULL, index, data->sds->base_res, data->flow_center,
data->tree, ray_start, data->vert_vel, data->has_velocity, data->defgrp_index, data->dvert,
@@ -1645,14 +1668,13 @@ static void emit_from_derivedmesh_task_cb(
}
}
-static void emit_from_derivedmesh(Object *flow_ob, SmokeDomainSettings *sds, SmokeFlowSettings *sfs, EmissionMap *em, float dt)
+static void emit_from_mesh(Object *flow_ob, SmokeDomainSettings *sds, SmokeFlowSettings *sfs, EmissionMap *em, float dt)
{
- if (sfs->dm) {
- DerivedMesh *dm;
+ if (sfs->mesh) {
+ Mesh *me;
int defgrp_index = sfs->vgroup_density - 1;
MDeformVert *dvert = NULL;
MVert *mvert = NULL;
- MVert *mvert_orig = NULL;
const MLoopTri *mlooptri = NULL;
const MLoopUV *mloopuv = NULL;
const MLoop *mloop = NULL;
@@ -1665,19 +1687,24 @@ static void emit_from_derivedmesh(Object *flow_ob, SmokeDomainSettings *sds, Smo
int min[3], max[3], res[3];
int hires_multiplier = 1;
- /* copy derivedmesh for thread safety because we modify it,
+ /* copy mesh for thread safety because we modify it,
* main issue is its VertArray being modified, then replaced and freed
*/
- dm = CDDM_copy(sfs->dm);
+ me = BKE_mesh_copy_for_eval(sfs->mesh, true);
- CDDM_calc_normals(dm);
- mvert = dm->getVertArray(dm);
- mvert_orig = dm->dupVertArray(dm); /* copy original mvert and restore when done */
- numOfVerts = dm->getNumVerts(dm);
- dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
- mloopuv = CustomData_get_layer_named(&dm->loopData, CD_MLOOPUV, sfs->uvlayer_name);
- mloop = dm->getLoopArray(dm);
- mlooptri = dm->getLoopTriArray(dm);
+ /* Duplicate vertices to modify. */
+ if (me->mvert) {
+ me->mvert = MEM_dupallocN(me->mvert);
+ CustomData_set_layer(&me->vdata, CD_MVERT, me->mvert);
+ }
+
+ BKE_mesh_ensure_normals(me);
+ mvert = me->mvert;
+ numOfVerts = me->totvert;
+ dvert = CustomData_get_layer(&me->vdata, CD_MDEFORMVERT);
+ mloopuv = CustomData_get_layer_named(&me->ldata, CD_MLOOPUV, sfs->uvlayer_name);
+ mloop = me->mloop;
+ mlooptri = BKE_mesh_runtime_looptri_ensure(me);
if (sfs->flags & MOD_SMOKE_FLOW_INITVELOCITY) {
vert_vel = MEM_callocN(sizeof(float) * numOfVerts * 3, "smoke_flow_velocity");
@@ -1692,7 +1719,7 @@ static void emit_from_derivedmesh(Object *flow_ob, SmokeDomainSettings *sds, Smo
}
}
- /* Transform dm vertices to
+ /* Transform mesh vertices to
* domain grid space for fast lookups */
for (i = 0; i < numOfVerts; i++) {
float n[3];
@@ -1738,7 +1765,7 @@ static void emit_from_derivedmesh(Object *flow_ob, SmokeDomainSettings *sds, Smo
res[i] = em->res[i] * hires_multiplier;
}
- if (bvhtree_from_mesh_get(&treeData, dm, BVHTREE_FROM_LOOPTRI, 4)) {
+ if (BKE_bvhtree_from_mesh_get(&treeData, me, BVHTREE_FROM_LOOPTRI, 4)) {
const float hr = 1.0f / ((float)hires_multiplier);
EmitFromDMData data = {
@@ -1755,23 +1782,20 @@ static void emit_from_derivedmesh(Object *flow_ob, SmokeDomainSettings *sds, Smo
settings.scheduling_mode = TASK_SCHEDULING_DYNAMIC;
BLI_task_parallel_range(min[2], max[2],
&data,
- emit_from_derivedmesh_task_cb,
+ emit_from_mesh_task_cb,
&settings);
}
/* free bvh tree */
free_bvhtree_from_mesh(&treeData);
- /* restore original mverts */
- CustomData_set_layer(&dm->vertData, CD_MVERT, mvert_orig);
- if (mvert) {
- MEM_freeN(mvert);
- }
if (vert_vel) {
MEM_freeN(vert_vel);
}
- dm->needsFree = 1;
- dm->release(dm);
+ if (me->mvert) {
+ MEM_freeN(me->mvert);
+ }
+ BKE_id_free(NULL, me);
}
}
@@ -2108,7 +2132,7 @@ BLI_INLINE void apply_inflow_fields(SmokeFlowSettings *sfs, float emission_value
}
static void update_flowsfluids(
- struct Depsgraph *depsgraph, Scene *scene, Object *ob, SmokeDomainSettings *sds, float dt)
+ Depsgraph *depsgraph, Scene *scene, Object *ob, SmokeDomainSettings *sds, float dt)
{
Object **flowobjs = NULL;
EmissionMap *emaps = NULL;
@@ -2141,7 +2165,7 @@ static void update_flowsfluids(
VECSUB(new_shift, total_shift, sds->shift);
copy_v3_v3_int(sds->shift, total_shift);
- /* calculate new domain boundary points so that smoke doesnt slide on sub-cell movement */
+ /* calculate new domain boundary points so that smoke doesn't slide on sub-cell movement */
sds->p0[0] = sds->dp0[0] - sds->cell_size[0] * (sds->shift_f[0] - total_shift[0] - 0.5f);
sds->p0[1] = sds->dp0[1] - sds->cell_size[1] * (sds->shift_f[1] - total_shift[1] - 0.5f);
sds->p0[2] = sds->dp0[2] - sds->cell_size[2] * (sds->shift_f[2] - total_shift[2] - 0.5f);
@@ -2172,21 +2196,25 @@ static void update_flowsfluids(
/* just sample flow directly to emission map if no subframes */
if (!subframes) {
if (sfs->source == MOD_SMOKE_FLOW_SOURCE_PARTICLES) {
- emit_from_particles(collob, sds, sfs, em, scene, dt);
+ emit_from_particles(collob, sds, sfs, em, depsgraph, scene, dt);
}
else {
- emit_from_derivedmesh(collob, sds, sfs, em, dt);
+ emit_from_mesh(collob, sds, sfs, em, dt);
}
}
/* sample subframes */
else {
- int scene_frame = scene->r.cfra;
+#if 0
+ int scene_frame = (int)DEG_get_ctime(depsgraph);
+#endif
// float scene_subframe = scene->r.subframe; // UNUSED
int subframe;
for (subframe = 0; subframe <= subframes; subframe++) {
EmissionMap em_temp = {NULL};
float sample_size = 1.0f / (float)(subframes+1);
+#if 0
float prev_frame_pos = sample_size * (float)(subframe+1);
+#endif
float sdt = dt * sample_size;
int hires_multiplier = 1;
@@ -2194,6 +2222,8 @@ static void update_flowsfluids(
hires_multiplier = sds->amplify + 1;
}
+ /* TODO: setting the scene frame no longer works with the new depsgraph. */
+#if 0
/* set scene frame to match previous frame + subframe
* or use current frame for last sample */
if (subframe < subframes) {
@@ -2204,10 +2234,11 @@ static void update_flowsfluids(
scene->r.cfra = scene_frame;
scene->r.subframe = 0.0f;
}
+#endif
if (sfs->source == MOD_SMOKE_FLOW_SOURCE_PARTICLES) {
/* emit_from_particles() updates timestep internally */
- emit_from_particles(collob, sds, sfs, &em_temp, scene, sdt);
+ emit_from_particles(collob, sds, sfs, &em_temp, depsgraph, scene, sdt);
if (!(sfs->flags & MOD_SMOKE_FLOW_USE_PART_SIZE)) {
hires_multiplier = 1;
}
@@ -2215,11 +2246,11 @@ static void update_flowsfluids(
else { /* MOD_SMOKE_FLOW_SOURCE_MESH */
/* update flow object frame */
BLI_mutex_lock(&object_update_lock);
- BKE_object_modifier_update_subframe(depsgraph, scene, collob, true, 5, BKE_scene_frame_get(scene), eModifierType_Smoke);
+ BKE_object_modifier_update_subframe(depsgraph, scene, collob, true, 5, DEG_get_ctime(depsgraph), eModifierType_Smoke);
BLI_mutex_unlock(&object_update_lock);
/* apply flow */
- emit_from_derivedmesh(collob, sds, sfs, &em_temp, sdt);
+ emit_from_mesh(collob, sds, sfs, &em_temp, sdt);
}
/* combine emission maps */
@@ -2526,7 +2557,7 @@ static void update_effectors_task_cb(
}
}
-static void update_effectors(struct Depsgraph *depsgraph, Scene *scene, Object *ob, SmokeDomainSettings *sds, float UNUSED(dt))
+static void update_effectors(Depsgraph *depsgraph, Scene *scene, Object *ob, SmokeDomainSettings *sds, float UNUSED(dt))
{
ListBase *effectors;
/* make sure smoke flow influence is 0.0f */
@@ -2563,7 +2594,7 @@ static void update_effectors(struct Depsgraph *depsgraph, Scene *scene, Object *
static void step(
Depsgraph *depsgraph,
- Scene *scene, Object *ob, SmokeModifierData *smd, DerivedMesh *domain_dm, float fps)
+ Scene *scene, Object *ob, SmokeModifierData *smd, Mesh *domain_me, float fps)
{
SmokeDomainSettings *sds = smd->domain;
/* stability values copied from wturbulence.cpp */
@@ -2579,19 +2610,10 @@ static void step(
float gravity[3] = {0.0f, 0.0f, -1.0f};
float gravity_mag;
-#if 0 /* UNUSED */
- /* get max velocity and lower the dt value if it is too high */
- size_t size = sds->res[0] * sds->res[1] * sds->res[2];
- float *velX = smoke_get_velocity_x(sds->fluid);
- float *velY = smoke_get_velocity_y(sds->fluid);
- float *velZ = smoke_get_velocity_z(sds->fluid);
- size_t i;
-#endif
-
/* update object state */
invert_m4_m4(sds->imat, ob->obmat);
copy_m4_m4(sds->obmat, ob->obmat);
- smoke_set_domain_from_derivedmesh(sds, ob, domain_dm, (sds->flags & MOD_SMOKE_ADAPTIVE_DOMAIN) != 0);
+ smoke_set_domain_from_mesh(sds, ob, domain_me, (sds->flags & MOD_SMOKE_ADAPTIVE_DOMAIN) != 0);
/* use global gravity if enabled */
if (scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY) {
@@ -2610,14 +2632,6 @@ static void step(
// maximum timestep/"CFL" constraint: dt < 5.0 *dx / maxVel
maxVel = (sds->dx * 5.0f);
-#if 0
- for (i = 0; i < size; i++) {
- float vtemp = (velX[i] * velX[i] + velY[i] * velY[i] + velZ[i] * velZ[i]);
- if (vtemp > maxVelMag)
- maxVelMag = vtemp;
- }
-#endif
-
maxVelMag = sqrtf(maxVelMag) * dt * sds->time_scale;
totalSubsteps = (int)((maxVelMag / maxVel) + 1.0f); /* always round up */
totalSubsteps = (totalSubsteps < 1) ? 1 : totalSubsteps;
@@ -2643,9 +2657,9 @@ static void step(
}
}
-static DerivedMesh *createDomainGeometry(SmokeDomainSettings *sds, Object *ob)
+static Mesh *createDomainGeometry(SmokeDomainSettings *sds, Object *ob)
{
- DerivedMesh *result;
+ Mesh *result;
MVert *mverts;
MPoly *mpolys;
MLoop *mloops;
@@ -2667,11 +2681,10 @@ static DerivedMesh *createDomainGeometry(SmokeDomainSettings *sds, Object *ob)
num_faces = 0;
}
- result = CDDM_new(num_verts, 0, 0, num_faces * 4, num_faces);
- mverts = CDDM_get_verts(result);
- mpolys = CDDM_get_polys(result);
- mloops = CDDM_get_loops(result);
-
+ result = BKE_mesh_new_nomain(num_verts, 0, 0, num_faces * 4, num_faces);
+ mverts = result->mvert;
+ mpolys = result->mpoly;
+ mloops = result->mloop;
if (num_verts) {
/* volume bounds */
@@ -2711,7 +2724,7 @@ static DerivedMesh *createDomainGeometry(SmokeDomainSettings *sds, Object *ob)
ml[0].v = 1; ml[1].v = 0; ml[2].v = 4; ml[3].v = 5;
/* calculate required shift to match domain's global position
- * it was originally simulated at (if object moves without smoke step) */
+ * it was originally simulated at (if object moves without smoke step) */
invert_m4_m4(ob->imat, ob->obmat);
mul_m4_v3(ob->obmat, ob_loc);
mul_m4_v3(sds->obmat, ob_cache_loc);
@@ -2724,48 +2737,49 @@ static DerivedMesh *createDomainGeometry(SmokeDomainSettings *sds, Object *ob)
}
}
-
- CDDM_calc_edges(result);
- result->dirty |= DM_DIRTY_NORMALS;
+ BKE_mesh_calc_edges(result, false, false);
+ result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
return result;
}
static void smokeModifier_process(
- SmokeModifierData *smd, struct Depsgraph *depsgraph, Scene *scene, Object *ob, DerivedMesh *dm)
+ SmokeModifierData *smd, Depsgraph *depsgraph, Scene *scene, Object *ob, Mesh *me)
{
+ const int scene_framenr = (int)DEG_get_ctime(depsgraph);
+
if ((smd->type & MOD_SMOKE_TYPE_FLOW))
{
- if (scene->r.cfra >= smd->time)
- smokeModifier_init(smd, ob, scene, dm);
+ if (scene_framenr >= smd->time)
+ smokeModifier_init(smd, ob, scene_framenr, me);
- if (smd->flow->dm) smd->flow->dm->release(smd->flow->dm);
- smd->flow->dm = CDDM_copy(dm);
+ if (smd->flow->mesh) BKE_id_free(NULL, smd->flow->mesh);
+ smd->flow->mesh = BKE_mesh_copy_for_eval(me, false);
- if (scene->r.cfra > smd->time)
+ if (scene_framenr > smd->time)
{
- smd->time = scene->r.cfra;
+ smd->time = scene_framenr;
}
- else if (scene->r.cfra < smd->time)
+ else if (scene_framenr < smd->time)
{
- smd->time = scene->r.cfra;
+ smd->time = scene_framenr;
smokeModifier_reset_ex(smd, false);
}
}
else if (smd->type & MOD_SMOKE_TYPE_COLL)
{
- if (scene->r.cfra >= smd->time)
- smokeModifier_init(smd, ob, scene, dm);
+ if (scene_framenr >= smd->time)
+ smokeModifier_init(smd, ob, scene_framenr, me);
if (smd->coll)
{
- if (smd->coll->dm)
- smd->coll->dm->release(smd->coll->dm);
+ if (smd->coll->mesh)
+ BKE_id_free(NULL, smd->coll->mesh);
- smd->coll->dm = CDDM_copy(dm);
+ smd->coll->mesh = BKE_mesh_copy_for_eval(me, false);
}
- smd->time = scene->r.cfra;
- if (scene->r.cfra < smd->time)
+ smd->time = scene_framenr;
+ if (scene_framenr < smd->time)
{
smokeModifier_reset_ex(smd, false);
}
@@ -2778,9 +2792,7 @@ static void smokeModifier_process(
int startframe, endframe, framenr;
float timescale;
- framenr = scene->r.cfra;
-
- //printf("time: %d\n", scene->r.cfra);
+ framenr = scene_framenr;
cache = sds->point_cache[0];
BKE_ptcache_id_from_smoke(&pid, ob, smd);
@@ -2801,10 +2813,10 @@ static void smokeModifier_process(
CLAMP(framenr, startframe, endframe);
/* If already viewing a pre/after frame, no need to reload */
- if ((smd->time == framenr) && (framenr != scene->r.cfra))
+ if ((smd->time == framenr) && (framenr != scene_framenr))
return;
- if (smokeModifier_init(smd, ob, scene, dm) == 0)
+ if (smokeModifier_init(smd, ob, scene_framenr, me) == 0)
{
printf("bad smokeModifier_init\n");
return;
@@ -2812,7 +2824,7 @@ static void smokeModifier_process(
/* only calculate something when we advanced a single frame */
/* don't simulate if viewing start frame, but scene frame is not real start frame */
- bool can_simulate = (framenr == (int)smd->time + 1) && (framenr == scene->r.cfra);
+ bool can_simulate = (framenr == (int)smd->time + 1) && (framenr == scene_framenr);
/* try to read from cache */
if (BKE_ptcache_read(&pid, (float)framenr, can_simulate) == PTCACHE_READ_EXACT) {
@@ -2834,7 +2846,7 @@ static void smokeModifier_process(
}
// set new time
- smd->time = scene->r.cfra;
+ smd->time = scene_framenr;
/* do simulation */
@@ -2852,7 +2864,7 @@ static void smokeModifier_process(
}
- step(depsgraph, scene, ob, smd, dm, scene->r.frs_sec / scene->r.frs_sec_base);
+ step(depsgraph, scene, ob, smd, me, scene->r.frs_sec / scene->r.frs_sec_base);
}
// create shadows before writing cache so they get stored
@@ -2873,14 +2885,14 @@ static void smokeModifier_process(
}
}
-struct DerivedMesh *smokeModifier_do(
- SmokeModifierData *smd, struct Depsgraph *depsgraph, Scene *scene, Object *ob, DerivedMesh *dm)
+struct Mesh *smokeModifier_do(
+ SmokeModifierData *smd, Depsgraph *depsgraph, Scene *scene, Object *ob, Mesh *me)
{
/* lock so preview render does not read smoke data while it gets modified */
if ((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain)
BLI_rw_mutex_lock(smd->domain->fluid_mutex, THREAD_LOCK_WRITE);
- smokeModifier_process(smd, depsgraph, scene, ob, dm);
+ smokeModifier_process(smd, depsgraph, scene, ob, me);
if ((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain)
BLI_rw_mutex_unlock(smd->domain->fluid_mutex);
@@ -2893,7 +2905,7 @@ struct DerivedMesh *smokeModifier_do(
return createDomainGeometry(smd->domain, ob);
}
else {
- return CDDM_copy(dm);
+ return BKE_mesh_copy_for_eval(me, false);
}
}
@@ -3067,7 +3079,7 @@ static void smoke_calc_transparency(SmokeDomainSettings *sds, ViewLayer *view_la
}
/* get smoke velocity and density at given coordinates
- * returns fluid density or -1.0f if outside domain*/
+ * returns fluid density or -1.0f if outside domain. */
float smoke_get_velocity_at(struct Object *ob, float position[3], float velocity[3])
{
SmokeModifierData *smd = (SmokeModifierData *)modifiers_findByType(ob, eModifierType_Smoke);
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index 3ab55b3705a..e3bd6f9860f 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -30,24 +30,22 @@
*/
-/*
-******
-variables on the UI for now
-
- float mediafrict; friction to env
- float nodemass; softbody mass of *vertex*
- float grav; softbody amount of gravitaion to apply
-
- float goalspring; softbody goal springs
- float goalfrict; softbody goal springs friction
- float mingoal; quick limits for goal
- float maxgoal;
-
- float inspring; softbody inner springs
- float infrict; softbody inner springs friction
-
-*****
-*/
+/**
+ * variables on the UI for now
+ * <pre>
+ * float mediafrict; friction to env
+ * float nodemass; softbody mass of *vertex*
+ * float grav; softbody amount of gravitaion to apply
+ *
+ * float goalspring; softbody goal springs
+ * float goalfrict; softbody goal springs friction
+ * float mingoal; quick limits for goal
+ * float maxgoal;
+ *
+ * float inspring; softbody inner springs
+ * float infrict; softbody inner springs friction
+ * </pre>
+ */
#include <math.h>
@@ -118,7 +116,7 @@ typedef struct ReferenceVert {
typedef struct ReferenceState {
float com[3]; /* center of mass*/
- ReferenceVert *ivert; /* list of intial values */
+ ReferenceVert *ivert; /* list of initial values */
} ReferenceState;
@@ -219,7 +217,7 @@ static float sb_time_scale(Object *ob)
* will cause unwanted responses of the softbody system (which does inter frame calculations )
* so first 'cure' would be: interpolate linear in time ..
* Q: why do i write this?
- * A: because it happend once, that some eger coder 'streamlined' code to fail.
+ * A: because it happened once, that some eger coder 'streamlined' code to fail.
* We DO linear interpolation for goals .. and i think we should do on animated properties as well
*/
@@ -256,16 +254,16 @@ static float _final_mass(Object *ob, BodyPoint *bp)
/*+++ collider caching and dicing +++*/
-/********************
-for each target object/face the axis aligned bounding box (AABB) is stored
-faces parallel to global axes
-so only simple "value" in [min, max] ckecks are used
-float operations still
-*/
+/*
+ * for each target object/face the axis aligned bounding box (AABB) is stored
+ * faces parallel to global axes
+ * so only simple "value" in [min, max] ckecks are used
+ * float operations still
+ */
/* just an ID here to reduce the prob for killing objects
-** ob->sumohandle points to we should not kill :)
-*/
+ * ob->sumohandle points to we should not kill :)
+ */
static const int CCD_SAVETY = 190561;
typedef struct ccdf_minmax {
@@ -732,8 +730,8 @@ static void add_bp_springlist(BodyPoint *bp, int springID)
}
/* do this once when sb is build
-it is O(N^2) so scanning for springs every iteration is too expensive
-*/
+ * it is O(N^2) so scanning for springs every iteration is too expensive
+ */
static void build_bps_springlist(Object *ob)
{
SoftBody *sb= ob->soft; /* is supposed to be there */
@@ -925,29 +923,29 @@ static void free_softbody_intern(SoftBody *sb)
/* ************ dynamics ********** */
/* the most general (micro physics correct) way to do collision
-** (only needs the current particle position)
-**
-** it actually checks if the particle intrudes a short range force field generated
-** by the faces of the target object and returns a force to drive the particel out
-** the strenght of the field grows exponetially if the particle is on the 'wrong' side of the face
-** 'wrong' side : projection to the face normal is negative (all referred to a vertex in the face)
-**
-** flaw of this: 'fast' particles as well as 'fast' colliding faces
-** give a 'tunnel' effect such that the particle passes through the force field
-** without ever 'seeing' it
-** this is fully compliant to heisenberg: h >= fuzzy(location) * fuzzy(time)
-** besides our h is way larger than in QM because forces propagate way slower here
-** we have to deal with fuzzy(time) in the range of 1/25 seconds (typical frame rate)
-** yup collision targets are not known here any better
-** and 1/25 second is looong compared to real collision events
-** Q: why not use 'simple' collision here like bouncing back a particle
-** --> reverting is velocity on the face normal
-** A: because our particles are not alone here
-** and need to tell their neighbors exactly what happens via spring forces
-** unless sbObjectStep( .. ) is called on sub frame timing level
-** BTW that also questions the use of a 'implicit' solvers on softbodies
-** since that would only valid for 'slow' moving collision targets and dito particles
-*/
+ * (only needs the current particle position)
+ *
+ * it actually checks if the particle intrudes a short range force field generated
+ * by the faces of the target object and returns a force to drive the particel out
+ * the strength of the field grows exponetially if the particle is on the 'wrong' side of the face
+ * 'wrong' side : projection to the face normal is negative (all referred to a vertex in the face)
+ *
+ * flaw of this: 'fast' particles as well as 'fast' colliding faces
+ * give a 'tunnel' effect such that the particle passes through the force field
+ * without ever 'seeing' it
+ * this is fully compliant to heisenberg: h >= fuzzy(location) * fuzzy(time)
+ * besides our h is way larger than in QM because forces propagate way slower here
+ * we have to deal with fuzzy(time) in the range of 1/25 seconds (typical frame rate)
+ * yup collision targets are not known here any better
+ * and 1/25 second is looong compared to real collision events
+ * Q: why not use 'simple' collision here like bouncing back a particle
+ * --> reverting is velocity on the face normal
+ * A: because our particles are not alone here
+ * and need to tell their neighbors exactly what happens via spring forces
+ * unless sbObjectStep( .. ) is called on sub frame timing level
+ * BTW that also questions the use of a 'implicit' solvers on softbodies
+ * since that would only valid for 'slow' moving collision targets and dito particles
+ */
/* +++ dependency information functions*/
@@ -966,7 +964,7 @@ static int query_external_colliders(Depsgraph *depsgraph, Collection *collection
/* +++ the aabb "force" section*/
-static int sb_detect_aabb_collisionCached(float UNUSED(force[3]), unsigned int UNUSED(par_layer), struct Object *vertexowner, float UNUSED(time))
+static int sb_detect_aabb_collisionCached(float UNUSED(force[3]), struct Object *vertexowner, float UNUSED(time))
{
Object *ob;
SoftBody *sb=vertexowner->soft;
@@ -1027,7 +1025,7 @@ static int sb_detect_aabb_collisionCached(float UNUSED(force[3]), unsigned int U
/* +++ the face external section*/
static int sb_detect_face_pointCached(float face_v1[3], float face_v2[3], float face_v3[3], float *damp,
- float force[3], unsigned int UNUSED(par_layer), struct Object *vertexowner, float time)
+ float force[3], struct Object *vertexowner, float time)
{
Object *ob;
GHash *hash;
@@ -1128,7 +1126,7 @@ static int sb_detect_face_pointCached(float face_v1[3], float face_v2[3], float
static int sb_detect_face_collisionCached(float face_v1[3], float face_v2[3], float face_v3[3], float *damp,
- float force[3], unsigned int UNUSED(par_layer), struct Object *vertexowner, float time)
+ float force[3], struct Object *vertexowner, float time)
{
Object *ob;
GHash *hash;
@@ -1265,7 +1263,7 @@ static void scan_for_ext_face_forces(Object *ob, float timenow)
zero_v3(feedback);
if (sb_detect_face_collisionCached(
sb->bpoint[bf->v1].pos, sb->bpoint[bf->v2].pos, sb->bpoint[bf->v3].pos,
- &damp, feedback, ob->lay, ob, timenow))
+ &damp, feedback, ob, timenow))
{
madd_v3_v3fl(sb->bpoint[bf->v1].force, feedback, tune);
madd_v3_v3fl(sb->bpoint[bf->v2].force, feedback, tune);
@@ -1283,7 +1281,7 @@ static void scan_for_ext_face_forces(Object *ob, float timenow)
zero_v3(feedback);
if (sb_detect_face_pointCached(
sb->bpoint[bf->v1].pos, sb->bpoint[bf->v2].pos, sb->bpoint[bf->v3].pos,
- &damp, feedback, ob->lay, ob, timenow))
+ &damp, feedback, ob, timenow))
{
madd_v3_v3fl(sb->bpoint[bf->v1].force, feedback, tune);
madd_v3_v3fl(sb->bpoint[bf->v2].force, feedback, tune);
@@ -1312,7 +1310,7 @@ static void scan_for_ext_face_forces(Object *ob, float timenow)
/* +++ the spring external section*/
static int sb_detect_edge_collisionCached(float edge_v1[3], float edge_v2[3], float *damp,
- float force[3], unsigned int UNUSED(par_layer), struct Object *vertexowner, float time)
+ float force[3], struct Object *vertexowner, float time)
{
Object *ob;
GHash *hash;
@@ -1449,7 +1447,7 @@ static void _scan_for_ext_spring_forces(Scene *scene, Object *ob, float timenow,
/* +++ springs colliding */
if (ob->softflag & OB_SB_EDGECOLL) {
if ( sb_detect_edge_collisionCached (sb->bpoint[bs->v1].pos, sb->bpoint[bs->v2].pos,
- &damp, feedback, ob->lay, ob, timenow)) {
+ &damp, feedback, ob, timenow)) {
add_v3_v3(bs->ext_force, feedback);
bs->flag |= BSF_INTERSECT;
//bs->cf=damp;
@@ -1608,7 +1606,7 @@ static int choose_winner(float*w, float* pos, float*a, float*b, float*c, float*c
static int sb_detect_vertex_collisionCached(
float opco[3], float facenormal[3], float *damp,
- float force[3], unsigned int UNUSED(par_layer), struct Object *vertexowner,
+ float force[3], struct Object *vertexowner,
float time, float vel[3], float *intrusion)
{
Object *ob= NULL;
@@ -1704,11 +1702,11 @@ static int sb_detect_vertex_collisionCached(
if (mprevvert) {
/* grab the average speed of the collider vertices
- before we spoil nvX
- humm could be done once a SB steps but then we' need to store that too
- since the AABB reduced propabitlty to get here drasticallly
- it might be a nice tradeof CPU <--> memory
- */
+ * before we spoil nvX
+ * humm could be done once a SB steps but then we' need to store that too
+ * since the AABB reduced propabitlty to get here drasticallly
+ * it might be a nice tradeof CPU <--> memory
+ */
sub_v3_v3v3(vv1, nv1, mprevvert[vt->tri[0]].co);
sub_v3_v3v3(vv2, nv2, mprevvert[vt->tri[1]].co);
sub_v3_v3v3(vv3, nv3, mprevvert[vt->tri[2]].co);
@@ -1804,12 +1802,13 @@ static int sb_deflect_face(Object *ob, float *actpos, float *facenormal, float *
float s_actpos[3];
int deflected;
copy_v3_v3(s_actpos, actpos);
- deflected= sb_detect_vertex_collisionCached(s_actpos, facenormal, cf, force, ob->lay, ob, time, vel, intrusion);
- //deflected= sb_detect_vertex_collisionCachedEx(s_actpos, facenormal, cf, force, ob->lay, ob, time, vel, intrusion);
+ deflected= sb_detect_vertex_collisionCached(s_actpos, facenormal, cf, force, ob, time, vel, intrusion);
+ //deflected= sb_detect_vertex_collisionCachedEx(s_actpos, facenormal, cf, force, ob, time, vel, intrusion);
return(deflected);
}
-/* hiding this for now .. but the jacobian may pop up on other tasks .. so i'd like to keep it
+/* hiding this for now .. but the jacobian may pop up on other tasks .. so i'd like to keep it */
+#if 0
static void dfdx_spring(int ia, int ic, int op, float dir[3], float L, float len, float factor)
{
float m, delta_ij;
@@ -1845,7 +1844,8 @@ static void dfdv_goal(int ia, int ic, float factor)
int i;
for (i=0;i<3;i++) EIG_linear_solver_matrix_add(ia+i, ic+i, factor);
}
-*/
+#endif /* if 0 */
+
static void sb_spring_force(Object *ob, int bpi, BodySpring *bs, float iks, float UNUSED(forcetime))
{
SoftBody *sb= ob->soft; /* is supposed to be there */
@@ -1934,7 +1934,7 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo
SoftBody *sb= ob->soft; /* is supposed to be there */
BodyPoint *bp;
- /* intitialize */
+ /* initialize */
if (sb) {
/* check conditions for various options */
/* +++ could be done on object level to squeeze out the last bits of it */
@@ -1976,7 +1976,7 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo
for (c=sb->totpoint, obp= sb->bpoint; c>0; c--, obp++) {
compare = (obp->colball + bp->colball);
sub_v3_v3v3(def, bp->pos, obp->pos);
- /* rather check the AABBoxes before ever calulating the real distance */
+ /* rather check the AABBoxes before ever calculating the real distance */
/* mathematically it is completely nuts, but performance is pretty much (3) times faster */
if ((ABS(def[0]) > compare) || (ABS(def[1]) > compare) || (ABS(def[2]) > compare)) continue;
distance = normalize_v3(def);
@@ -2018,7 +2018,7 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo
bp->force[1]+= -ks*(auxvect[1]);
bp->force[2]+= -ks*(auxvect[2]);
- /* calulate damping forces generated by goals*/
+ /* calculate damping forces generated by goals*/
sub_v3_v3v3(velgoal, bp->origS, bp->origE);
kd = sb->goalfrict * sb_fric_force_scale(ob);
add_v3_v3v3(auxvect, velgoal, bp->vec);
@@ -2217,7 +2217,7 @@ static void softbody_calc_forcesEx(struct Depsgraph *depsgraph, Scene *scene, Ob
if (do_deflector) {
float defforce[3];
- do_deflector = sb_detect_aabb_collisionCached(defforce, ob->lay, ob, timenow);
+ do_deflector = sb_detect_aabb_collisionCached(defforce, ob, timenow);
}
sb_cf_threads_run(scene, ob, forcetime, timenow, sb->totpoint, NULL, effectors, do_deflector, fieldfactor, windfactor);
@@ -2248,7 +2248,7 @@ static void softbody_calc_forces(struct Depsgraph *depsgraph, Scene *scene, Obje
/* rule we never alter free variables :bp->vec bp->pos in here !
* this will ruin adaptive stepsize AKA heun! (BM)
- */
+ */
SoftBody *sb= ob->soft; /* is supposed to be there */
BodyPoint *bp;
/* BodyPoint *bproot; */ /* UNUSED */
@@ -2278,7 +2278,7 @@ static void softbody_calc_forces(struct Depsgraph *depsgraph, Scene *scene, Obje
if (do_deflector) {
float defforce[3];
- do_deflector = sb_detect_aabb_collisionCached(defforce, ob->lay, ob, timenow);
+ do_deflector = sb_detect_aabb_collisionCached(defforce, ob, timenow);
}
bp = sb->bpoint;
@@ -2303,7 +2303,7 @@ static void softbody_calc_forces(struct Depsgraph *depsgraph, Scene *scene, Obje
compare = (obp->colball + bp->colball);
sub_v3_v3v3(def, bp->pos, obp->pos);
- /* rather check the AABBoxes before ever calulating the real distance */
+ /* rather check the AABBoxes before ever calculating the real distance */
/* mathematically it is completely nuts, but performance is pretty much (3) times faster */
if ((ABS(def[0]) > compare) || (ABS(def[1]) > compare) || (ABS(def[2]) > compare)) continue;
@@ -2352,7 +2352,7 @@ static void softbody_calc_forces(struct Depsgraph *depsgraph, Scene *scene, Obje
bp->force[1]+= -ks*(auxvect[1]);
bp->force[2]+= -ks*(auxvect[2]);
- /* calulate damping forces generated by goals*/
+ /* calculate damping forces generated by goals*/
sub_v3_v3v3(velgoal, bp->origS, bp->origE);
kd = sb->goalfrict * sb_fric_force_scale(ob);
add_v3_v3v3(auxvect, velgoal, bp->vec);
@@ -2417,16 +2417,16 @@ static void softbody_calc_forces(struct Depsgraph *depsgraph, Scene *scene, Obje
if (sb_deflect_face(ob, bp->pos, facenormal, defforce, &cf, timenow, vel, &intrusion)) {
if (intrusion < 0.0f) {
if (G.debug_value & 0x01) { // 17 we did check for bit 0x10 before
- /*fixing bug [17428] this forces adaptive step size to tiny steps
- in some situations .. keeping G.debug_value==17 option for old files 'needing' the bug
- */
- /*bjornmose: uugh.. what an evil hack
- violation of the 'don't touch bp->pos in here' rule
- but works nice, like this-->
- we predict the solution being out of the collider
- in heun step No1 and leave the heun step No2 adapt to it
- so we kind of introduced a implicit solver for this case
- */
+ /* fixing bug [17428] this forces adaptive step size to tiny steps
+ * in some situations .. keeping G.debug_value==17 option for old files 'needing' the bug
+ */
+ /* bjornmose: uugh.. what an evil hack
+ * violation of the 'don't touch bp->pos in here' rule
+ * but works nice, like this-->
+ * we predict the solution being out of the collider
+ * in heun step No1 and leave the heun step No2 adapt to it
+ * so we kind of introduced a implicit solver for this case
+ */
madd_v3_v3fl(bp->pos, facenormal, -intrusion);
}
else {
@@ -2498,10 +2498,10 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *
/* old one with homogeneous masses */
/* claim a minimum mass for vertex */
- /*
- if (sb->nodemass > 0.009999f) timeovermass = forcetime/sb->nodemass;
- else timeovermass = forcetime/0.009999f;
- */
+#if 0
+ if (sb->nodemass > 0.009999f) timeovermass = forcetime / sb->nodemass;
+ else timeovermass = forcetime / 0.009999f;
+#endif
for (a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
/* now we have individual masses */
@@ -2697,11 +2697,11 @@ static void softbody_swap_state(Object *ob, float *ppos, float *pvel)
/* care for bodypoints taken out of the 'ordinary' solver step
-** because they are screwed to goal by bolts
-** they just need to move along with the goal in time
-** we need to adjust them on sub frame timing in solver
-** so now when frame is done .. put 'em to the position at the end of frame
-*/
+ * because they are screwed to goal by bolts
+ * they just need to move along with the goal in time
+ * we need to adjust them on sub frame timing in solver
+ * so now when frame is done .. put 'em to the position at the end of frame
+ */
static void softbody_apply_goalsnap(Object *ob)
{
SoftBody *sb= ob->soft; /* is supposed to be there */
@@ -2766,9 +2766,9 @@ static void interpolate_exciter(Object *ob, int timescale, int time)
/* ************ convertors ********** */
-/* for each object type we need;
- - xxxx_to_softbody(Object *ob) : a full (new) copy, creates SB geometry
-*/
+/* for each object type we need;
+ * - xxxx_to_softbody(Object *ob) : a full (new) copy, creates SB geometry
+ */
/* Resetting a Mesh SB object's springs */
/* Spring length are caculted from'raw' mesh vertices that are NOT altered by modifier stack. */
@@ -2782,7 +2782,7 @@ static void springs_from_mesh(Object *ob)
sb= ob->soft;
if (me && sb) {
- /* using bp->origS as a container for spring calcualtions here
+ /* using bp->origS as a container for spring calculations here
* will be overwritten sbObjectStep() to receive
* actual modifier stack positions
*/
@@ -3370,7 +3370,7 @@ static void softbody_update_positions(Object *ob, SoftBody *sb, float (*vertexCo
* that is:
* a precise position vector denoting the motion of the center of mass
* give a rotation/scale matrix using averaging method, that's why estimate and not calculate
- * see: this is kind of reverse engineering: having to states of a point cloud and recover what happend
+ * see: this is kind of reverse engineering: having to states of a point cloud and recover what happened
* our advantage here we know the identity of the vertex
* there are others methods giving other results.
* lloc, lrot, lscale are allowed to be NULL, just in case you don't need it.
diff --git a/source/blender/blenkernel/intern/subdiv.c b/source/blender/blenkernel/intern/subdiv.c
index f847d62018a..b2736ed8f37 100644
--- a/source/blender/blenkernel/intern/subdiv.c
+++ b/source/blender/blenkernel/intern/subdiv.c
@@ -61,7 +61,7 @@ BKE_subdiv_fvar_interpolation_from_uv_smooth(int uv_smooth)
return SUBDIV_FVAR_LINEAR_INTERPOLATION_NONE;
}
BLI_assert(!"Unknown uv smooth flag");
- return SUBSURF_UV_SMOOTH_NONE;
+ return SUBDIV_FVAR_LINEAR_INTERPOLATION_ALL;
}
Subdiv *BKE_subdiv_new_from_converter(const SubdivSettings *settings,
@@ -118,5 +118,32 @@ void BKE_subdiv_free(Subdiv *subdiv)
openSubdiv_deleteTopologyRefiner(subdiv->topology_refiner);
}
BKE_subdiv_displacement_detach(subdiv);
+ if (subdiv->cache_.face_ptex_offset != NULL) {
+ MEM_freeN(subdiv->cache_.face_ptex_offset);
+ }
MEM_freeN(subdiv);
}
+
+int *BKE_subdiv_face_ptex_offset_get(Subdiv *subdiv)
+{
+ if (subdiv->cache_.face_ptex_offset != NULL) {
+ return subdiv->cache_.face_ptex_offset;
+ }
+ OpenSubdiv_TopologyRefiner *topology_refiner = subdiv->topology_refiner;
+ if (topology_refiner == NULL) {
+ return NULL;
+ }
+ const int num_coarse_faces =
+ topology_refiner->getNumFaces(topology_refiner);
+ subdiv->cache_.face_ptex_offset = MEM_malloc_arrayN(
+ num_coarse_faces, sizeof(int), "subdiv face_ptex_offset");
+ int ptex_offset = 0;
+ for (int face_index = 0; face_index < num_coarse_faces; face_index++) {
+ const int num_ptex_faces =
+ topology_refiner->getNumFacePtexFaces(
+ topology_refiner, face_index);
+ subdiv->cache_.face_ptex_offset[face_index] = ptex_offset;
+ ptex_offset += num_ptex_faces;
+ }
+ return subdiv->cache_.face_ptex_offset;
+}
diff --git a/source/blender/blenkernel/intern/subdiv_ccg.c b/source/blender/blenkernel/intern/subdiv_ccg.c
new file mode 100644
index 00000000000..e488b1129fc
--- /dev/null
+++ b/source/blender/blenkernel/intern/subdiv_ccg.c
@@ -0,0 +1,1188 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2018 by Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Sergey Sharybin.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenkernel/intern/subdiv_ccg.c
+ * \ingroup bke
+ */
+
+#include "BKE_subdiv_ccg.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_math_bits.h"
+#include "BLI_math_vector.h"
+#include "BLI_task.h"
+
+#include "BKE_DerivedMesh.h"
+#include "BKE_ccg.h"
+#include "BKE_mesh.h"
+#include "BKE_subdiv.h"
+#include "BKE_subdiv_eval.h"
+
+#include "opensubdiv_topology_refiner_capi.h"
+
+/* =============================================================================
+ * Generally useful internal helpers.
+ */
+
+/* Number of floats in per-vertex elements. */
+static int num_element_float_get(const SubdivCCG *subdiv_ccg)
+{
+ /* We always have 3 floats for coordinate. */
+ int num_floats = 3;
+ if (subdiv_ccg->has_normal) {
+ num_floats += 3;
+ }
+ if (subdiv_ccg->has_mask) {
+ num_floats += 1;
+ }
+ return num_floats;
+}
+
+/* Per-vertex element size in bytes. */
+static int element_size_bytes_get(const SubdivCCG *subdiv_ccg)
+{
+ return sizeof(float) * num_element_float_get(subdiv_ccg);
+}
+
+/* =============================================================================
+ * Internal helpers for CCG creation.
+ */
+
+static void subdiv_ccg_init_layers(SubdivCCG *subdiv_ccg,
+ const SubdivToCCGSettings *settings)
+{
+ /* CCG always contains coordinates. Rest of layers are coming after them. */
+ int layer_offset = sizeof(float) * 3;
+ /* Mask. */
+ if (settings->need_mask) {
+ subdiv_ccg->has_mask = true;
+ subdiv_ccg->mask_offset = layer_offset;
+ layer_offset += sizeof(float);
+ }
+ else {
+ subdiv_ccg->has_mask = false;
+ subdiv_ccg->mask_offset = -1;
+ }
+ /* Normals.
+ *
+ * NOTE: Keep them at the end, matching old CCGDM. Doesn't really matter
+ * here, but some other area might in theory depend memory layout.
+ */
+ if (settings->need_normal) {
+ subdiv_ccg->has_normal = true;
+ subdiv_ccg->normal_offset = layer_offset;
+ layer_offset += sizeof(float) * 3;
+ }
+ else {
+ subdiv_ccg->has_normal = false;
+ subdiv_ccg->normal_offset = -1;
+ }
+}
+
+/* TODO(sergey): Make it more accessible function. */
+static int topology_refiner_count_face_corners(
+ OpenSubdiv_TopologyRefiner *topology_refiner)
+{
+ const int num_faces = topology_refiner->getNumFaces(topology_refiner);
+ int num_corners = 0;
+ for (int face_index = 0; face_index < num_faces; face_index++) {
+ num_corners += topology_refiner->getNumFaceVertices(
+ topology_refiner, face_index);
+ }
+ return num_corners;
+}
+
+/* NOTE: Grid size and layer flags are to be filled in before calling this
+ * function.
+ */
+static void subdiv_ccg_alloc_elements(SubdivCCG *subdiv_ccg, Subdiv *subdiv)
+{
+ OpenSubdiv_TopologyRefiner *topology_refiner = subdiv->topology_refiner;
+ const int element_size = element_size_bytes_get(subdiv_ccg);
+ /* Allocate memory for surface grids. */
+ const int num_faces = topology_refiner->getNumFaces(topology_refiner);
+ const int num_grids = topology_refiner_count_face_corners(topology_refiner);
+ const int grid_size = BKE_subdiv_grid_size_from_level(subdiv_ccg->level);
+ const int grid_area = grid_size * grid_size;
+ subdiv_ccg->num_grids = num_grids;
+ subdiv_ccg->grids =
+ MEM_calloc_arrayN(num_grids, sizeof(CCGElem *), "subdiv ccg grids");
+ subdiv_ccg->grids_storage = MEM_calloc_arrayN(
+ num_grids, ((size_t)grid_area) * element_size,
+ "subdiv ccg grids storage");
+ const size_t grid_size_in_bytes = (size_t)grid_area * element_size;
+ for (int grid_index = 0; grid_index < num_grids; grid_index++) {
+ const size_t grid_offset = grid_size_in_bytes * grid_index;
+ subdiv_ccg->grids[grid_index] =
+ (CCGElem *)&subdiv_ccg->grids_storage[grid_offset];
+ }
+ /* Grid material flags. */
+ subdiv_ccg->grid_flag_mats = MEM_calloc_arrayN(
+ num_grids, sizeof(DMFlagMat), "ccg grid material flags");
+ /* Grid hidden flags. */
+ subdiv_ccg->grid_hidden = MEM_calloc_arrayN(
+ num_grids, sizeof(BLI_bitmap *), "ccg grid material flags");
+ for (int grid_index = 0; grid_index < num_grids; grid_index++) {
+ subdiv_ccg->grid_hidden[grid_index] =
+ BLI_BITMAP_NEW(grid_area, "ccg grid hidden");
+ }
+ /* TODO(sergey): Allocate memory for loose elements. */
+ /* Allocate memory for faces. */
+ subdiv_ccg->num_faces = num_faces;
+ if (num_faces) {
+ subdiv_ccg->faces = MEM_calloc_arrayN(
+ num_faces, sizeof(SubdivCCGFace), "Subdiv CCG faces");
+ subdiv_ccg->grid_faces = MEM_calloc_arrayN(
+ num_grids, sizeof(SubdivCCGFace *), "Subdiv CCG grid faces");
+ }
+}
+
+/* =============================================================================
+ * Grids evaluation.
+ */
+
+typedef struct CCGEvalGridsData {
+ SubdivCCG *subdiv_ccg;
+ Subdiv *subdiv;
+ int *face_ptex_offset;
+ SubdivCCGMask *mask_evaluator;
+} CCGEvalGridsData;
+
+static void subdiv_ccg_eval_grid_element(
+ CCGEvalGridsData *data,
+ const int ptex_face_index,
+ const float u, const float v,
+ unsigned char *element)
+{
+ Subdiv *subdiv = data->subdiv;
+ SubdivCCG *subdiv_ccg = data->subdiv_ccg;
+ if (subdiv->displacement_evaluator != NULL) {
+ BKE_subdiv_eval_final_point(
+ subdiv, ptex_face_index, u, v, (float *)element);
+ }
+ else if (subdiv_ccg->has_normal) {
+ BKE_subdiv_eval_limit_point_and_normal(
+ subdiv, ptex_face_index, u, v,
+ (float *)element,
+ (float *)(element + subdiv_ccg->normal_offset));
+ }
+ else {
+ BKE_subdiv_eval_limit_point(
+ subdiv, ptex_face_index, u, v, (float *)element);
+ }
+ if (subdiv_ccg->has_mask) {
+ float *mask_value_ptr = (float *)(element + subdiv_ccg->mask_offset);
+ if (data->mask_evaluator != NULL) {
+ *mask_value_ptr = data->mask_evaluator->eval_mask(
+ data->mask_evaluator, ptex_face_index, u, v);
+ }
+ else {
+ *mask_value_ptr = 0.0f;
+ }
+ }
+}
+
+BLI_INLINE void rotate_corner_to_quad(
+ const int corner,
+ const float u, const float v,
+ float *r_u, float *r_v)
+{
+ if (corner == 0) {
+ *r_u = 0.5f - v * 0.5f;
+ *r_v = 0.5f - u * 0.5f;
+ }
+ else if (corner == 1) {
+ *r_u = 0.5f + u * 0.5f;
+ *r_v = 0.5f - v * 0.5f;
+ }
+ else if (corner == 2) {
+ *r_u = 0.5f + v * 0.5f;
+ *r_v = 0.5f + u * 0.5f;
+ }
+ else {
+ BLI_assert(corner == 3);
+ *r_u = 0.5f - u * 0.5f;
+ *r_v = 0.5f + v * 0.5f;
+ }
+}
+
+static void subdiv_ccg_eval_regular_grid(CCGEvalGridsData *data,
+ const int face_index)
+{
+ SubdivCCG *subdiv_ccg = data->subdiv_ccg;
+ const int ptex_face_index = data->face_ptex_offset[face_index];
+ const int grid_size = subdiv_ccg->grid_size;
+ const float grid_size_1_inv = 1.0f / (float)(grid_size - 1);
+ const int element_size = element_size_bytes_get(subdiv_ccg);
+ SubdivCCGFace *faces = subdiv_ccg->faces;
+ SubdivCCGFace **grid_faces = subdiv_ccg->grid_faces;
+ const SubdivCCGFace *face = &faces[face_index];
+ for (int corner = 0; corner < face->num_grids; corner++) {
+ const int grid_index = face->start_grid_index + corner;
+ unsigned char *grid = (unsigned char *)subdiv_ccg->grids[grid_index];
+ for (int y = 0; y < grid_size; y++) {
+ const float grid_v = (float)y * grid_size_1_inv;
+ for (int x = 0; x < grid_size; x++) {
+ const float grid_u = (float)x * grid_size_1_inv;
+ float u, v;
+ rotate_corner_to_quad(corner, grid_u, grid_v, &u, &v);
+ const size_t grid_element_index = (size_t)y * grid_size + x;
+ const size_t grid_element_offset =
+ grid_element_index * element_size;
+ subdiv_ccg_eval_grid_element(
+ data,
+ ptex_face_index, u, v,
+ &grid[grid_element_offset]);
+ }
+ }
+ /* Assign grid's face. */
+ grid_faces[grid_index] = &faces[face_index];
+ }
+}
+
+static void subdiv_ccg_eval_special_grid(CCGEvalGridsData *data,
+ const int face_index)
+{
+ SubdivCCG *subdiv_ccg = data->subdiv_ccg;
+ const int grid_size = subdiv_ccg->grid_size;
+ const float grid_size_1_inv = 1.0f / (float)(grid_size - 1);
+ const int element_size = element_size_bytes_get(subdiv_ccg);
+ SubdivCCGFace *faces = subdiv_ccg->faces;
+ SubdivCCGFace **grid_faces = subdiv_ccg->grid_faces;
+ const SubdivCCGFace *face = &faces[face_index];
+ for (int corner = 0; corner < face->num_grids; corner++) {
+ const int grid_index = face->start_grid_index + corner;
+ unsigned char *grid = (unsigned char *)subdiv_ccg->grids[grid_index];
+ for (int y = 0; y < grid_size; y++) {
+ const float u = 1.0f - ((float)y * grid_size_1_inv);
+ for (int x = 0; x < grid_size; x++) {
+ const float v = 1.0f - ((float)x * grid_size_1_inv);
+ const int ptex_face_index =
+ data->face_ptex_offset[face_index] + corner;
+ const size_t grid_element_index = (size_t)y * grid_size + x;
+ const size_t grid_element_offset =
+ grid_element_index * element_size;
+ subdiv_ccg_eval_grid_element(
+ data,
+ ptex_face_index, u, v,
+ &grid[grid_element_offset]);
+ }
+ }
+ /* Assign grid's face. */
+ grid_faces[grid_index] = &faces[face_index];
+ }
+}
+
+static void subdiv_ccg_eval_grids_task(
+ void *__restrict userdata_v,
+ const int face_index,
+ const ParallelRangeTLS *__restrict UNUSED(tls))
+{
+ CCGEvalGridsData *data = userdata_v;
+ SubdivCCG *subdiv_ccg = data->subdiv_ccg;
+ SubdivCCGFace *face = &subdiv_ccg->faces[face_index];
+ if (face->num_grids == 4) {
+ subdiv_ccg_eval_regular_grid(data, face_index);
+ }
+ else {
+ subdiv_ccg_eval_special_grid(data, face_index);
+ }
+}
+
+static bool subdiv_ccg_evaluate_grids(
+ SubdivCCG *subdiv_ccg,
+ Subdiv *subdiv,
+ SubdivCCGMask *mask_evaluator)
+{
+ OpenSubdiv_TopologyRefiner *topology_refiner = subdiv->topology_refiner;
+ const int num_faces = topology_refiner->getNumFaces(topology_refiner);
+ /* Initialize data passed to all the tasks. */
+ CCGEvalGridsData data;
+ data.subdiv_ccg = subdiv_ccg;
+ data.subdiv = subdiv;
+ data.face_ptex_offset = BKE_subdiv_face_ptex_offset_get(subdiv);
+ data.mask_evaluator = mask_evaluator;
+ /* Threaded grids evaluation. */
+ ParallelRangeSettings parallel_range_settings;
+ BLI_parallel_range_settings_defaults(&parallel_range_settings);
+ BLI_task_parallel_range(0, num_faces,
+ &data,
+ subdiv_ccg_eval_grids_task,
+ &parallel_range_settings);
+ /* If displacement is used, need to calculate normals after all final
+ * coordinates are known.
+ */
+ if (subdiv->displacement_evaluator != NULL) {
+ BKE_subdiv_ccg_recalc_normals(subdiv_ccg);
+ }
+ return true;
+}
+
+/* Initialize face descriptors, assuming memory for them was already
+ * allocated.
+ */
+static void subdiv_ccg_init_faces(SubdivCCG *subdiv_ccg)
+{
+ Subdiv *subdiv = subdiv_ccg->subdiv;
+ OpenSubdiv_TopologyRefiner *topology_refiner = subdiv->topology_refiner;
+ const int num_faces = subdiv_ccg->num_faces;
+ int corner_index = 0;
+ for (int face_index = 0; face_index < num_faces; face_index++) {
+ const int num_corners = topology_refiner->getNumFaceVertices(
+ topology_refiner, face_index);
+ subdiv_ccg->faces[face_index].num_grids = num_corners;
+ subdiv_ccg->faces[face_index].start_grid_index = corner_index;
+ corner_index += num_corners;
+ }
+}
+
+/* TODO(sergey): Consider making it generic enough to be fit into BLI. */
+typedef struct StaticOrHeapIntStorage {
+ int static_storage[64];
+ int static_storage_size;
+ int *heap_storage;
+ int heap_storage_size;
+} StaticOrHeapIntStorage;
+
+static void static_or_heap_storage_init(StaticOrHeapIntStorage *storage)
+{
+ storage->static_storage_size =
+ sizeof(storage->static_storage) / sizeof(*storage->static_storage);
+ storage->heap_storage = NULL;
+ storage->heap_storage_size = 0;
+}
+
+static int *static_or_heap_storage_get(StaticOrHeapIntStorage *storage,
+ int size)
+{
+ /* Requested size small enough to be fit into stack allocated memory. */
+ if (size <= storage->static_storage_size) {
+ return storage->static_storage;
+ }
+ /* Make sure heap ius big enough. */
+ if (size > storage->heap_storage_size) {
+ MEM_SAFE_FREE(storage->heap_storage);
+ storage->heap_storage = MEM_malloc_arrayN(
+ size, sizeof(int), "int storage");
+ storage->heap_storage_size = size;
+ }
+ return storage->heap_storage;
+}
+
+static void static_or_heap_storage_free(StaticOrHeapIntStorage *storage)
+{
+ MEM_SAFE_FREE(storage->heap_storage);
+}
+
+static void subdiv_ccg_allocate_adjacent_edges(SubdivCCG *subdiv_ccg,
+ const int num_edges)
+{
+ subdiv_ccg->num_adjacent_edges = num_edges;
+ subdiv_ccg->adjacent_edges = MEM_calloc_arrayN(
+ subdiv_ccg->num_adjacent_edges,
+ sizeof(*subdiv_ccg->adjacent_edges),
+ "ccg adjacent edges");
+}
+
+/* Returns storage where boundary elements are to be stored. */
+static CCGElem **subdiv_ccg_adjacent_edge_add_face(
+ SubdivCCG *subdiv_ccg,
+ SubdivCCGAdjacentEdge *adjacent_edge,
+ SubdivCCGFace *face)
+{
+ const int grid_size = subdiv_ccg->grid_size * 2;
+ const int adjacent_face_index = adjacent_edge->num_adjacent_faces;
+ ++adjacent_edge->num_adjacent_faces;
+ /* Store new adjacent face. */
+ adjacent_edge->faces = MEM_reallocN(
+ adjacent_edge->faces,
+ adjacent_edge->num_adjacent_faces * sizeof(*adjacent_edge->faces));
+ adjacent_edge->faces[adjacent_face_index] = face;
+ /* Allocate memory for the boundary elements. */
+ adjacent_edge->boundary_elements = MEM_reallocN(
+ adjacent_edge->boundary_elements,
+ adjacent_edge->num_adjacent_faces *
+ sizeof(*adjacent_edge->boundary_elements));
+ adjacent_edge->boundary_elements[adjacent_face_index] =
+ MEM_malloc_arrayN(
+ grid_size * 2, sizeof(CCGElem *), "ccg adjacent boundary");
+ return adjacent_edge->boundary_elements[adjacent_face_index];
+}
+
+static void subdiv_ccg_init_faces_edge_neighborhood(SubdivCCG *subdiv_ccg)
+{
+ Subdiv *subdiv = subdiv_ccg->subdiv;
+ SubdivCCGFace *faces = subdiv_ccg->faces;
+ OpenSubdiv_TopologyRefiner *topology_refiner = subdiv->topology_refiner;
+ const int num_edges = topology_refiner->getNumEdges(topology_refiner);
+ const int grid_size = subdiv_ccg->grid_size;
+ if (num_edges == 0) {
+ /* Early output, nothing to do in this case. */
+ return;
+ }
+ subdiv_ccg_allocate_adjacent_edges(subdiv_ccg, num_edges);
+ /* Initialize storage. */
+ StaticOrHeapIntStorage face_vertices_storage;
+ StaticOrHeapIntStorage face_edges_storage;
+ static_or_heap_storage_init(&face_vertices_storage);
+ static_or_heap_storage_init(&face_edges_storage);
+ /* Key to access elements. */
+ CCGKey key;
+ BKE_subdiv_ccg_key_top_level(&key, subdiv_ccg);
+ /* Store adjacency for all faces. */
+ const int num_faces = subdiv_ccg->num_faces;
+ for (int face_index = 0; face_index < num_faces; face_index++) {
+ SubdivCCGFace *face = &faces[face_index];
+ const int num_face_grids = face->num_grids;
+ const int num_face_edges = num_face_grids;
+ int *face_vertices = static_or_heap_storage_get(
+ &face_vertices_storage, num_face_edges);
+ topology_refiner->getFaceVertices(
+ topology_refiner, face_index, face_vertices);
+ /* Note that order of edges is same as order of MLoops, which also
+ * means it's the same as order of grids.
+ */
+ int *face_edges = static_or_heap_storage_get(
+ &face_edges_storage, num_face_edges);
+ topology_refiner->getFaceEdges(
+ topology_refiner, face_index, face_edges);
+ /* Store grids adjacency for this edge. */
+ for (int corner = 0; corner < num_face_edges; corner++) {
+ const int vertex_index = face_vertices[corner];
+ const int edge_index = face_edges[corner];
+ int edge_vertices[2];
+ topology_refiner->getEdgeVertices(
+ topology_refiner, edge_index, edge_vertices);
+ const bool is_edge_flipped = (edge_vertices[0] != vertex_index);
+ /* Grid which is adjacent to the current corner. */
+ const int current_grid_index = face->start_grid_index + corner;
+ CCGElem *current_grid = subdiv_ccg->grids[current_grid_index];
+ /* Grid which is adjacent to the next corner. */
+ const int next_grid_index =
+ face->start_grid_index + (corner + 1) % num_face_grids;
+ CCGElem *next_grid = subdiv_ccg->grids[next_grid_index];
+ /* Add new face to the adjacent edge. */
+ SubdivCCGAdjacentEdge *adjacent_edge =
+ &subdiv_ccg->adjacent_edges[edge_index];
+ CCGElem **boundary_elements = subdiv_ccg_adjacent_edge_add_face(
+ subdiv_ccg, adjacent_edge, face);
+ /* Fill CCG elements along the edge. */
+ int boundary_element_index = 0;
+ if (is_edge_flipped) {
+ for (int i = 0; i < grid_size; i++) {
+ boundary_elements[boundary_element_index++] =
+ CCG_grid_elem(&key,
+ next_grid,
+ grid_size - i - 1,
+ grid_size - 1);
+ }
+ for (int i = 0; i < grid_size; i++) {
+ boundary_elements[boundary_element_index++] =
+ CCG_grid_elem(&key,
+ current_grid,
+ grid_size - 1,
+ i);
+ }
+ }
+ else {
+ for (int i = 0; i < grid_size; i++) {
+ boundary_elements[boundary_element_index++] =
+ CCG_grid_elem(&key,
+ current_grid,
+ grid_size - 1,
+ grid_size - i - 1);
+ }
+ for (int i = 0; i < grid_size; i++) {
+ boundary_elements[boundary_element_index++] =
+ CCG_grid_elem(&key,
+ next_grid,
+ i,
+ grid_size - 1);
+ }
+ }
+ }
+ }
+ /* Free possibly heap-allocated storage. */
+ static_or_heap_storage_free(&face_vertices_storage);
+ static_or_heap_storage_free(&face_edges_storage);
+}
+
+static void subdiv_ccg_allocate_adjacent_vertices(SubdivCCG *subdiv_ccg,
+ const int num_vertices)
+{
+ subdiv_ccg->num_adjacent_vertices = num_vertices;
+ subdiv_ccg->adjacent_vertices = MEM_calloc_arrayN(
+ subdiv_ccg->num_adjacent_vertices,
+ sizeof(*subdiv_ccg->adjacent_vertices),
+ "ccg adjacent vertices");
+}
+
+/* Returns storage where corner elements are to be stored. This is a pointer
+ * to the actual storage.
+ */
+static CCGElem **subdiv_ccg_adjacent_vertex_add_face(
+ SubdivCCGAdjacentVertex *adjacent_vertex,
+ SubdivCCGFace *face)
+{
+ const int adjacent_face_index = adjacent_vertex->num_adjacent_faces;
+ ++adjacent_vertex->num_adjacent_faces;
+ /* Store new adjacent face. */
+ adjacent_vertex->faces = MEM_reallocN(
+ adjacent_vertex->faces,
+ adjacent_vertex->num_adjacent_faces *
+ sizeof(*adjacent_vertex->faces));
+ adjacent_vertex->faces[adjacent_face_index] = face;
+ /* Allocate memory for the boundary elements. */
+ adjacent_vertex->corner_elements = MEM_reallocN(
+ adjacent_vertex->corner_elements,
+ adjacent_vertex->num_adjacent_faces *
+ sizeof(*adjacent_vertex->corner_elements));
+ return &adjacent_vertex->corner_elements[adjacent_face_index];
+}
+
+static void subdiv_ccg_init_faces_vertex_neighborhood(SubdivCCG *subdiv_ccg)
+{
+ Subdiv *subdiv = subdiv_ccg->subdiv;
+ SubdivCCGFace *faces = subdiv_ccg->faces;
+ OpenSubdiv_TopologyRefiner *topology_refiner = subdiv->topology_refiner;
+ const int num_vertices =
+ topology_refiner->getNumVertices(topology_refiner);
+ const int grid_size = subdiv_ccg->grid_size;
+ if (num_vertices == 0) {
+ /* Early output, nothing to do in this case. */
+ return;
+ }
+ subdiv_ccg_allocate_adjacent_vertices(subdiv_ccg, num_vertices);
+ /* Initialize storage. */
+ StaticOrHeapIntStorage face_vertices_storage;
+ static_or_heap_storage_init(&face_vertices_storage);
+ /* Key to access elements. */
+ CCGKey key;
+ BKE_subdiv_ccg_key_top_level(&key, subdiv_ccg);
+ /* Store adjacency for all faces. */
+ const int num_faces = subdiv_ccg->num_faces;
+ for (int face_index = 0; face_index < num_faces; face_index++) {
+ SubdivCCGFace *face = &faces[face_index];
+ const int num_face_grids = face->num_grids;
+ const int num_face_edges = num_face_grids;
+ int *face_vertices = static_or_heap_storage_get(
+ &face_vertices_storage, num_face_edges);
+ topology_refiner->getFaceVertices(
+ topology_refiner, face_index, face_vertices);
+ for (int corner = 0; corner < num_face_edges; corner++) {
+ const int vertex_index = face_vertices[corner];
+ /* Grid which is adjacent to the current corner. */
+ const int grid_index = face->start_grid_index + corner;
+ CCGElem *grid = subdiv_ccg->grids[grid_index];
+ /* Add new face to the adjacent edge. */
+ SubdivCCGAdjacentVertex *adjacent_vertex =
+ &subdiv_ccg->adjacent_vertices[vertex_index];
+ CCGElem **corner_element = subdiv_ccg_adjacent_vertex_add_face(
+ adjacent_vertex, face);
+ *corner_element = CCG_grid_elem(
+ &key, grid, grid_size - 1, grid_size - 1);
+ }
+ }
+ /* Free possibly heap-allocated storage. */
+ static_or_heap_storage_free(&face_vertices_storage);
+}
+
+static void subdiv_ccg_init_faces_neighborhood(SubdivCCG *subdiv_ccg)
+{
+ subdiv_ccg_init_faces_edge_neighborhood(subdiv_ccg);
+ subdiv_ccg_init_faces_vertex_neighborhood(subdiv_ccg);
+}
+
+/* =============================================================================
+ * Creation / evaluation.
+ */
+
+SubdivCCG *BKE_subdiv_to_ccg(
+ Subdiv *subdiv,
+ const SubdivToCCGSettings *settings,
+ SubdivCCGMask *mask_evaluator)
+{
+ BKE_subdiv_stats_begin(&subdiv->stats, SUBDIV_STATS_SUBDIV_TO_CCG);
+ SubdivCCG *subdiv_ccg = MEM_callocN(sizeof(SubdivCCG), "subdiv ccg");
+ subdiv_ccg->subdiv = subdiv;
+ subdiv_ccg->level = bitscan_forward_i(settings->resolution - 1);
+ subdiv_ccg->grid_size = BKE_subdiv_grid_size_from_level(subdiv_ccg->level);
+ subdiv_ccg_init_layers(subdiv_ccg, settings);
+ subdiv_ccg_alloc_elements(subdiv_ccg, subdiv);
+ subdiv_ccg_init_faces(subdiv_ccg);
+ subdiv_ccg_init_faces_neighborhood(subdiv_ccg);
+ if (!subdiv_ccg_evaluate_grids(subdiv_ccg, subdiv, mask_evaluator)) {
+ BKE_subdiv_ccg_destroy(subdiv_ccg);
+ BKE_subdiv_stats_end(&subdiv->stats, SUBDIV_STATS_SUBDIV_TO_CCG);
+ return NULL;
+ }
+ BKE_subdiv_stats_end(&subdiv->stats, SUBDIV_STATS_SUBDIV_TO_CCG);
+ return subdiv_ccg;
+}
+
+Mesh *BKE_subdiv_to_ccg_mesh(
+ Subdiv *subdiv,
+ const SubdivToCCGSettings *settings,
+ const Mesh *coarse_mesh)
+{
+ /* Make sure evaluator is ready. */
+ BKE_subdiv_stats_begin(&subdiv->stats, SUBDIV_STATS_SUBDIV_TO_CCG);
+ if (!BKE_subdiv_eval_update_from_mesh(subdiv, coarse_mesh)) {
+ if (coarse_mesh->totpoly) {
+ return false;
+ }
+ }
+ BKE_subdiv_stats_end(&subdiv->stats, SUBDIV_STATS_SUBDIV_TO_CCG);
+ SubdivCCGMask mask_evaluator;
+ bool has_mask = BKE_subdiv_ccg_mask_init_from_paint(
+ &mask_evaluator, coarse_mesh);
+ SubdivCCG *subdiv_ccg = BKE_subdiv_to_ccg(
+ subdiv, settings, has_mask ? &mask_evaluator : NULL);
+ if (has_mask) {
+ mask_evaluator.free(&mask_evaluator);
+ }
+ if (subdiv_ccg == NULL) {
+ return NULL;
+ }
+ Mesh *result = BKE_mesh_new_nomain_from_template(
+ coarse_mesh, 0, 0, 0, 0, 0);
+ result->runtime.subdiv_ccg = subdiv_ccg;
+ return result;
+}
+
+void BKE_subdiv_ccg_destroy(SubdivCCG *subdiv_ccg)
+{
+ const int num_grids = subdiv_ccg->num_grids;
+ MEM_SAFE_FREE(subdiv_ccg->grids);
+ MEM_SAFE_FREE(subdiv_ccg->grids_storage);
+ MEM_SAFE_FREE(subdiv_ccg->edges);
+ MEM_SAFE_FREE(subdiv_ccg->vertices);
+ MEM_SAFE_FREE(subdiv_ccg->grid_flag_mats);
+ if (subdiv_ccg->grid_hidden != NULL) {
+ for (int grid_index = 0; grid_index < num_grids; grid_index++) {
+ MEM_freeN(subdiv_ccg->grid_hidden[grid_index]);
+ }
+ MEM_freeN(subdiv_ccg->grid_hidden);
+ }
+ if (subdiv_ccg->subdiv != NULL) {
+ BKE_subdiv_free(subdiv_ccg->subdiv);
+ }
+ MEM_SAFE_FREE(subdiv_ccg->faces);
+ MEM_SAFE_FREE(subdiv_ccg->grid_faces);
+ /* Free map of adjacent edges. */
+ for (int i = 0; i < subdiv_ccg->num_adjacent_edges; i++) {
+ SubdivCCGAdjacentEdge *adjacent_edge = &subdiv_ccg->adjacent_edges[i];
+ for (int face_index = 0;
+ face_index < adjacent_edge->num_adjacent_faces;
+ face_index++)
+ {
+ MEM_SAFE_FREE(adjacent_edge->boundary_elements[face_index]);
+ }
+ MEM_SAFE_FREE(adjacent_edge->faces);
+ MEM_SAFE_FREE(adjacent_edge->boundary_elements);
+ }
+ MEM_SAFE_FREE(subdiv_ccg->adjacent_edges);
+ /* Free map of adjacent vertices. */
+ for (int i = 0; i < subdiv_ccg->num_adjacent_vertices; i++) {
+ SubdivCCGAdjacentVertex *adjacent_vertex =
+ &subdiv_ccg->adjacent_vertices[i];
+ MEM_SAFE_FREE(adjacent_vertex->faces);
+ MEM_SAFE_FREE(adjacent_vertex->corner_elements);
+ }
+ MEM_SAFE_FREE(subdiv_ccg->adjacent_vertices);
+ MEM_freeN(subdiv_ccg);
+}
+
+void BKE_subdiv_ccg_key(CCGKey *key, const SubdivCCG *subdiv_ccg, int level)
+{
+ key->level = level;
+ key->elem_size = element_size_bytes_get(subdiv_ccg);
+ key->grid_size = BKE_subdiv_grid_size_from_level(level);
+ key->grid_area = key->grid_size * key->grid_size;
+ key->grid_bytes = key->elem_size * key->grid_area;
+
+ key->normal_offset = subdiv_ccg->normal_offset;
+ key->mask_offset = subdiv_ccg->mask_offset;
+
+ key->has_normals = subdiv_ccg->has_normal;
+ key->has_mask = subdiv_ccg->has_mask;
+}
+
+void BKE_subdiv_ccg_key_top_level(CCGKey *key, const SubdivCCG *subdiv_ccg)
+{
+ BKE_subdiv_ccg_key(key, subdiv_ccg, subdiv_ccg->level);
+}
+
+/* =============================================================================
+ * Normals.
+ */
+
+typedef struct RecalcInnerNormalsData {
+ SubdivCCG *subdiv_ccg;
+ CCGKey *key;
+} RecalcInnerNormalsData;
+
+typedef struct RecalcInnerNormalsTLSData {
+ float (*face_normals)[3];
+} RecalcInnerNormalsTLSData;
+
+/* Evaluate high-res face normals, for faces which corresponds to grid elements
+ *
+ * {(x, y), {x + 1, y}, {x + 1, y + 1}, {x, y + 1}}
+ *
+ * The result is stored in normals storage from TLS.
+ */
+static void subdiv_ccg_recalc_inner_face_normals(
+ RecalcInnerNormalsData *data,
+ RecalcInnerNormalsTLSData *tls,
+ const int grid_index)
+{
+ SubdivCCG *subdiv_ccg = data->subdiv_ccg;
+ CCGKey *key = data->key;
+ const int grid_size = subdiv_ccg->grid_size;
+ const int grid_size_1 = grid_size - 1;
+ CCGElem *grid = subdiv_ccg->grids[grid_index];
+ if (tls->face_normals == NULL) {
+ tls->face_normals = MEM_malloc_arrayN(
+ grid_size_1 * grid_size_1,
+ 3 * sizeof(float),
+ "CCG TLS normals");
+ }
+ for (int y = 0; y < grid_size -1; y++) {
+ for (int x = 0; x < grid_size - 1; x++) {
+ CCGElem *grid_elements[4] = {
+ CCG_grid_elem(key, grid, x, y + 1),
+ CCG_grid_elem(key, grid, x + 1, y + 1),
+ CCG_grid_elem(key, grid, x + 1, y),
+ CCG_grid_elem(key, grid, x, y)
+ };
+ float *co[4] = {
+ CCG_elem_co(key, grid_elements[0]),
+ CCG_elem_co(key, grid_elements[1]),
+ CCG_elem_co(key, grid_elements[2]),
+ CCG_elem_co(key, grid_elements[3])
+ };
+ const int face_index = y * grid_size_1 + x;
+ float *face_normal = tls->face_normals[face_index];
+ normal_quad_v3(face_normal, co[0], co[1], co[2], co[3]);
+ }
+ }
+}
+
+/* Average normals at every grid element, using adjacent faces normals. */
+static void subdiv_ccg_average_inner_face_normals(
+ RecalcInnerNormalsData *data,
+ RecalcInnerNormalsTLSData *tls,
+ const int grid_index)
+{
+ SubdivCCG *subdiv_ccg = data->subdiv_ccg;
+ CCGKey *key = data->key;
+ const int grid_size = subdiv_ccg->grid_size;
+ const int grid_size_1 = grid_size - 1;
+ CCGElem *grid = subdiv_ccg->grids[grid_index];
+ const float (*face_normals)[3] = tls->face_normals;
+ for (int y = 0; y < grid_size; y++) {
+ for (int x = 0; x < grid_size; x++) {
+ float normal_acc[3] = {0.0f, 0.0f, 0.0f};
+ int counter = 0;
+ /* Accumulate normals of all adjacent faces. */
+ if (x < grid_size_1 && y < grid_size_1) {
+ add_v3_v3(normal_acc, face_normals[y * grid_size_1 + x]);
+ counter++;
+ }
+ if (x >= 1) {
+ if (y < grid_size_1) {
+ add_v3_v3(normal_acc,
+ face_normals[y * grid_size_1 + (x - 1)]);
+ counter++;
+ }
+ if (y >= 1) {
+ add_v3_v3(normal_acc,
+ face_normals[(y - 1) * grid_size_1 + (x - 1)]);
+ counter++;
+ }
+ }
+ if (y >= 1 && x < grid_size_1) {
+ add_v3_v3(normal_acc, face_normals[(y - 1) * grid_size_1 + x]);
+ counter++;
+ }
+ /* Normalize and store. */
+ mul_v3_v3fl(CCG_grid_elem_no(key, grid, x, y),
+ normal_acc,
+ 1.0f / (float)counter);
+ }
+ }
+}
+
+static void subdiv_ccg_recalc_inner_normal_task(
+ void *__restrict userdata_v,
+ const int grid_index,
+ const ParallelRangeTLS *__restrict tls_v)
+{
+ RecalcInnerNormalsData *data = userdata_v;
+ RecalcInnerNormalsTLSData *tls = tls_v->userdata_chunk;
+ subdiv_ccg_recalc_inner_face_normals(data, tls, grid_index);
+ subdiv_ccg_average_inner_face_normals(data, tls, grid_index);
+}
+
+static void subdiv_ccg_recalc_inner_normal_finalize(
+ void *__restrict UNUSED(userdata),
+ void *__restrict tls_v)
+{
+ RecalcInnerNormalsTLSData *tls = tls_v;
+ MEM_SAFE_FREE(tls->face_normals);
+}
+
+/* Recalculate normals which corresponds to non-boundaries elements of grids. */
+static void subdiv_ccg_recalc_inner_grid_normals(SubdivCCG *subdiv_ccg)
+{
+ CCGKey key;
+ BKE_subdiv_ccg_key_top_level(&key, subdiv_ccg);
+ RecalcInnerNormalsData data = {
+ .subdiv_ccg = subdiv_ccg,
+ .key = &key
+ };
+ RecalcInnerNormalsTLSData tls_data = {NULL};
+ ParallelRangeSettings parallel_range_settings;
+ BLI_parallel_range_settings_defaults(&parallel_range_settings);
+ parallel_range_settings.userdata_chunk = &tls_data;
+ parallel_range_settings.userdata_chunk_size = sizeof(tls_data);
+ parallel_range_settings.func_finalize =
+ subdiv_ccg_recalc_inner_normal_finalize;
+ BLI_task_parallel_range(0, subdiv_ccg->num_grids,
+ &data,
+ subdiv_ccg_recalc_inner_normal_task,
+ &parallel_range_settings);
+}
+
+void BKE_subdiv_ccg_recalc_normals(SubdivCCG *subdiv_ccg)
+{
+ if (!subdiv_ccg->has_normal) {
+ /* Grids don't have normals, can do early output. */
+ return;
+ }
+ subdiv_ccg_recalc_inner_grid_normals(subdiv_ccg);
+ BKE_subdiv_ccg_average_grids(subdiv_ccg);
+}
+
+/* =============================================================================
+ * Boundary averaging/stitching.
+ */
+
+typedef struct AverageInnerGridsData {
+ SubdivCCG *subdiv_ccg;
+ CCGKey *key;
+} AverageInnerGridsData;
+
+static void average_grid_element_value_v3(float a[3], float b[3])
+{
+ add_v3_v3(a, b);
+ mul_v3_fl(a, 0.5f);
+ copy_v3_v3(b, a);
+}
+
+static void average_grid_element(SubdivCCG *subdiv_ccg,
+ CCGKey *key,
+ CCGElem *grid_element_a,
+ CCGElem *grid_element_b)
+{
+ average_grid_element_value_v3(CCG_elem_co(key, grid_element_a),
+ CCG_elem_co(key, grid_element_b));
+ if (subdiv_ccg->has_normal) {
+ average_grid_element_value_v3(CCG_elem_no(key, grid_element_a),
+ CCG_elem_no(key, grid_element_b));
+ }
+ if (subdiv_ccg->has_mask) {
+ float mask =
+ (*CCG_elem_mask(key, grid_element_a) +
+ *CCG_elem_mask(key, grid_element_b)) * 0.5f;
+ *CCG_elem_mask(key, grid_element_a) = mask;
+ *CCG_elem_mask(key, grid_element_b) = mask;
+ }
+}
+
+static void copy_grid_element(SubdivCCG *subdiv_ccg,
+ CCGKey *key,
+ CCGElem *destination,
+ CCGElem *source)
+{
+ copy_v3_v3(CCG_elem_co(key, destination), CCG_elem_co(key, source));
+ if (subdiv_ccg->has_normal) {
+ copy_v3_v3(CCG_elem_no(key, destination), CCG_elem_no(key, source));
+ }
+ if (subdiv_ccg->has_mask) {
+ *CCG_elem_mask(key, destination) = *CCG_elem_mask(key, source);
+ }
+}
+
+static void subdiv_ccg_average_inner_face_grids(
+ SubdivCCG *subdiv_ccg,
+ CCGKey *key,
+ SubdivCCGFace *face)
+{
+ CCGElem **grids = subdiv_ccg->grids;
+ const int num_face_grids = face->num_grids;
+ const int grid_size = subdiv_ccg->grid_size;
+ CCGElem *prev_grid = grids[face->start_grid_index + num_face_grids - 1];
+ for (int corner = 0; corner < num_face_grids; corner++) {
+ CCGElem *grid = grids[face->start_grid_index + corner];
+ for (int i = 0; i < grid_size; i++) {
+ CCGElem *prev_grid_element = CCG_grid_elem(key, prev_grid, i, 0);
+ CCGElem *grid_element = CCG_grid_elem(key, grid, 0, i);
+ average_grid_element(
+ subdiv_ccg, key, prev_grid_element, grid_element);
+ }
+ prev_grid = grid;
+ }
+
+}
+
+static void subdiv_ccg_average_inner_grids_task(
+ void *__restrict userdata_v,
+ const int face_index,
+ const ParallelRangeTLS *__restrict UNUSED(tls_v))
+{
+ AverageInnerGridsData *data = userdata_v;
+ SubdivCCG *subdiv_ccg = data->subdiv_ccg;
+ CCGKey *key = data->key;
+ SubdivCCGFace *faces = subdiv_ccg->faces;
+ SubdivCCGFace *face = &faces[face_index];
+ subdiv_ccg_average_inner_face_grids(subdiv_ccg, key, face);
+}
+
+typedef struct AverageGridsBoundariesData {
+ SubdivCCG *subdiv_ccg;
+ CCGKey *key;
+} AverageGridsBoundariesData;
+
+static void subdiv_ccg_average_grids_boundary(
+ SubdivCCG *subdiv_ccg,
+ CCGKey *key,
+ SubdivCCGAdjacentEdge *adjacent_edge)
+{
+ const int num_adjacent_faces = adjacent_edge->num_adjacent_faces;
+ const int grid_size2 = subdiv_ccg->grid_size * 2;
+ if (num_adjacent_faces == 1) {
+ /* Nothing to average with. */
+ return;
+ }
+ /* Incrementall average result to elements of a first adjacent face.
+ *
+ * Arguably, this is less precise than accumulating and then diving once,
+ * but on another hand this is more stable when coordinates are big.
+ */
+ for (int face_index = 1; face_index < num_adjacent_faces; face_index++) {
+ /* NOTE: We ignore very first and very last elements, they correspond
+ * to corner vertices, and they can belong to multiple edges.
+ * The fact, that they can belong to multiple edges means we can't
+ * safely average them.
+ * The fact, that they correspond to a corner elements, means they will
+ * be handled at the upcoming pass over corner elements.
+ */
+ for (int i = 1; i < grid_size2 - 1; i++) {
+ CCGElem *grid_element_0 =
+ adjacent_edge->boundary_elements[0][i];
+ CCGElem *grid_element_face_index =
+ adjacent_edge->boundary_elements[face_index][i];
+ average_grid_element(subdiv_ccg,
+ key,
+ grid_element_0,
+ grid_element_face_index);
+ }
+ }
+ /* Copy averaged value to all the other faces. */
+ for (int face_index = 1; face_index < num_adjacent_faces; face_index++) {
+ for (int i = 1; i < grid_size2 -1; i++) {
+ CCGElem *grid_element_0 =
+ adjacent_edge->boundary_elements[0][i];
+ CCGElem *grid_element_face_index =
+ adjacent_edge->boundary_elements[face_index][i];
+ copy_grid_element(subdiv_ccg,
+ key,
+ grid_element_face_index,
+ grid_element_0);
+ }
+ }
+}
+
+static void subdiv_ccg_average_grids_boundaries_task(
+ void *__restrict userdata_v,
+ const int adjacent_edge_index,
+ const ParallelRangeTLS *__restrict UNUSED(tls_v))
+{
+ AverageGridsBoundariesData *data = userdata_v;
+ SubdivCCG *subdiv_ccg = data->subdiv_ccg;
+ CCGKey *key = data->key;
+ SubdivCCGAdjacentEdge *adjacent_edge =
+ &subdiv_ccg->adjacent_edges[adjacent_edge_index];
+ subdiv_ccg_average_grids_boundary(subdiv_ccg, key, adjacent_edge);
+}
+
+typedef struct AverageGridsCornerData {
+ SubdivCCG *subdiv_ccg;
+ CCGKey *key;
+} AverageGridsCornerData;
+
+static void subdiv_ccg_average_grids_corners(
+ SubdivCCG *subdiv_ccg,
+ CCGKey *key,
+ SubdivCCGAdjacentVertex *adjacent_vertex)
+{
+ const int num_adjacent_faces = adjacent_vertex->num_adjacent_faces;
+ if (num_adjacent_faces == 1) {
+ /* Nothing to average with. */
+ return;
+ }
+ /* Incrementall average result to elements of a first adjacent face.
+ * See comment to the boundary averaging.
+ */
+ for (int face_index = 1; face_index < num_adjacent_faces; face_index++) {
+ CCGElem *grid_element_0 =
+ adjacent_vertex->corner_elements[0];
+ CCGElem *grid_element_face_index =
+ adjacent_vertex->corner_elements[face_index];
+ average_grid_element(subdiv_ccg,
+ key,
+ grid_element_0,
+ grid_element_face_index);
+ }
+ /* Copy averaged value to all the other faces. */
+ for (int face_index = 1; face_index < num_adjacent_faces; face_index++) {
+ CCGElem *grid_element_0 =
+ adjacent_vertex->corner_elements[0];
+ CCGElem *grid_element_face_index =
+ adjacent_vertex->corner_elements[face_index];
+ copy_grid_element(subdiv_ccg,
+ key,
+ grid_element_face_index,
+ grid_element_0);
+ }
+}
+
+static void subdiv_ccg_average_grids_corners_task(
+ void *__restrict userdata_v,
+ const int adjacent_vertex_index,
+ const ParallelRangeTLS *__restrict UNUSED(tls_v))
+{
+ AverageGridsCornerData *data = userdata_v;
+ SubdivCCG *subdiv_ccg = data->subdiv_ccg;
+ CCGKey *key = data->key;
+ SubdivCCGAdjacentVertex *adjacent_vertex =
+ &subdiv_ccg->adjacent_vertices[adjacent_vertex_index];
+ subdiv_ccg_average_grids_corners(subdiv_ccg, key, adjacent_vertex);
+}
+
+static void subdiv_ccg_average_all_boundaries_and_corners(
+ SubdivCCG *subdiv_ccg,
+ CCGKey *key)
+{
+ ParallelRangeSettings parallel_range_settings;
+ BLI_parallel_range_settings_defaults(&parallel_range_settings);
+ /* Average grids across coarse edges. */
+ AverageGridsBoundariesData boundaries_data = {
+ .subdiv_ccg = subdiv_ccg,
+ .key = key,
+ };
+ BLI_task_parallel_range(0, subdiv_ccg->num_adjacent_edges,
+ &boundaries_data,
+ subdiv_ccg_average_grids_boundaries_task,
+ &parallel_range_settings);
+ /* Average grids at coarse vertices. */
+ AverageGridsCornerData corner_data = {
+ .subdiv_ccg = subdiv_ccg,
+ .key = key,
+ };
+ BLI_task_parallel_range(0, subdiv_ccg->num_adjacent_vertices,
+ &corner_data,
+ subdiv_ccg_average_grids_corners_task,
+ &parallel_range_settings);
+}
+
+void BKE_subdiv_ccg_average_grids(SubdivCCG *subdiv_ccg)
+{
+ CCGKey key;
+ BKE_subdiv_ccg_key_top_level(&key, subdiv_ccg);
+ ParallelRangeSettings parallel_range_settings;
+ BLI_parallel_range_settings_defaults(&parallel_range_settings);
+ /* Average inner boundaries of grids (within one face), across faces
+ * from different face-corners.
+ */
+ AverageInnerGridsData inner_data = {
+ .subdiv_ccg = subdiv_ccg,
+ .key = &key,
+ };
+ BLI_task_parallel_range(0, subdiv_ccg->num_faces,
+ &inner_data,
+ subdiv_ccg_average_inner_grids_task,
+ &parallel_range_settings);
+ subdiv_ccg_average_all_boundaries_and_corners(subdiv_ccg, &key);
+}
+
+typedef struct StitchFacesInnerGridsData {
+ SubdivCCG *subdiv_ccg;
+ CCGKey *key;
+ struct CCGFace **effected_ccg_faces;
+} StitchFacesInnerGridsData;
+
+static void subdiv_ccg_stitch_face_inner_grids_task(
+ void *__restrict userdata_v,
+ const int face_index,
+ const ParallelRangeTLS *__restrict UNUSED(tls_v))
+{
+ StitchFacesInnerGridsData *data = userdata_v;
+ SubdivCCG *subdiv_ccg = data->subdiv_ccg;
+ CCGKey *key = data->key;
+ struct CCGFace **effected_ccg_faces = data->effected_ccg_faces;
+ struct CCGFace *effected_ccg_face = effected_ccg_faces[face_index];
+ SubdivCCGFace *face = (SubdivCCGFace *)effected_ccg_face;
+ subdiv_ccg_average_inner_face_grids(subdiv_ccg, key, face);
+}
+
+void BKE_subdiv_ccg_average_stitch_faces(SubdivCCG *subdiv_ccg,
+ struct CCGFace **effected_faces,
+ int num_effected_faces)
+{
+ CCGKey key;
+ BKE_subdiv_ccg_key_top_level(&key, subdiv_ccg);
+ StitchFacesInnerGridsData data = {
+ .subdiv_ccg = subdiv_ccg,
+ .key = &key,
+ .effected_ccg_faces = effected_faces,
+ };
+ ParallelRangeSettings parallel_range_settings;
+ BLI_parallel_range_settings_defaults(&parallel_range_settings);
+ BLI_task_parallel_range(0, num_effected_faces,
+ &data,
+ subdiv_ccg_stitch_face_inner_grids_task,
+ &parallel_range_settings);
+ /* TODO(sergey): Only average elements which are adjacent to modified
+ * faces.
+ */
+ subdiv_ccg_average_all_boundaries_and_corners(subdiv_ccg, &key);
+}
diff --git a/source/blender/blenkernel/intern/subdiv_ccg_mask.c b/source/blender/blenkernel/intern/subdiv_ccg_mask.c
new file mode 100644
index 00000000000..0da30fb1bf0
--- /dev/null
+++ b/source/blender/blenkernel/intern/subdiv_ccg_mask.c
@@ -0,0 +1,197 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2018 by Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Sergey Sharybin.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenkernel/intern/subdiv_ccg_mask.c
+ * \ingroup bke
+ */
+
+#include "BKE_subdiv_ccg.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_math_vector.h"
+
+#include "BKE_customdata.h"
+#include "BKE_subdiv.h"
+
+#include "MEM_guardedalloc.h"
+
+typedef struct PolyCornerIndex {
+ int poly_index;
+ int corner;
+} PolyCornerIndex;
+
+typedef struct GridPaintMaskData {
+ // int grid_size;
+ const MPoly *mpoly;
+ const GridPaintMask *grid_paint_mask;
+ /* Indexed by ptex face index, contains polygon/corner which corresponds
+ * to it.
+ *
+ * NOTE: For quad polygon this is an index of first corner only, since
+ * there we only have one ptex.
+ */
+ PolyCornerIndex *ptex_poly_corner;
+} GridPaintMaskData;
+
+static int mask_get_grid_and_coord(
+ SubdivCCGMask *mask_evaluator,
+ const int ptex_face_index, const float u, const float v,
+ const GridPaintMask **r_mask_grid,
+ float *grid_u, float *grid_v)
+{
+ GridPaintMaskData *data = mask_evaluator->user_data;
+ const PolyCornerIndex *poly_corner =
+ &data->ptex_poly_corner[ptex_face_index];
+ const MPoly *poly = &data->mpoly[poly_corner->poly_index];
+ const int start_grid_index = poly->loopstart + poly_corner->corner;
+ int corner = 0;
+ if (poly->totloop == 4) {
+ float corner_u, corner_v;
+ corner = BKE_subdiv_rotate_quad_to_corner(u, v, &corner_u, &corner_v);
+ *r_mask_grid =
+ &data->grid_paint_mask[start_grid_index + corner];
+ BKE_subdiv_ptex_face_uv_to_grid_uv(corner_u, corner_v, grid_u, grid_v);
+ }
+ else {
+ *r_mask_grid =
+ &data->grid_paint_mask[start_grid_index];
+ BKE_subdiv_ptex_face_uv_to_grid_uv(u, v, grid_u, grid_v);
+ }
+ return corner;
+}
+
+BLI_INLINE float read_mask_grid(const GridPaintMask *mask_grid,
+ const float grid_u, const float grid_v)
+{
+ if (mask_grid->data == NULL) {
+ return 0;
+ }
+ const int grid_size = BKE_subdiv_grid_size_from_level(mask_grid->level);
+ const int x = (grid_u * (grid_size - 1) + 0.5f);
+ const int y = (grid_v * (grid_size - 1) + 0.5f);
+ return mask_grid->data[y * grid_size + x];
+}
+
+static float eval_mask(SubdivCCGMask *mask_evaluator,
+ const int ptex_face_index,
+ const float u, const float v)
+{
+ const GridPaintMask *mask_grid;
+ float grid_u, grid_v;
+ mask_get_grid_and_coord(mask_evaluator,
+ ptex_face_index, u, v,
+ &mask_grid,
+ &grid_u, &grid_v);
+ return read_mask_grid(mask_grid, grid_u, grid_v);
+}
+
+static void free_mask_data(SubdivCCGMask *mask_evaluator)
+{
+ GridPaintMaskData *data = mask_evaluator->user_data;
+ MEM_freeN(data->ptex_poly_corner);
+ MEM_freeN(data);
+}
+
+/* TODO(sergey): This seems to be generally used information, which almost
+ * worth adding to a subdiv itself, with possible cache of the value.
+ */
+static int count_num_ptex_faces(const Mesh *mesh)
+{
+ int num_ptex_faces = 0;
+ const MPoly *mpoly = mesh->mpoly;
+ for (int poly_index = 0; poly_index < mesh->totpoly; poly_index++) {
+ const MPoly *poly = &mpoly[poly_index];
+ num_ptex_faces += (poly->totloop == 4) ? 1 : poly->totloop;
+ }
+ return num_ptex_faces;
+}
+
+static void displacement_data_init_mapping(SubdivCCGMask *mask_evaluator,
+ const Mesh *mesh)
+{
+ GridPaintMaskData *data = mask_evaluator->user_data;
+ const MPoly *mpoly = mesh->mpoly;
+ const int num_ptex_faces = count_num_ptex_faces(mesh);
+ /* Allocate memory. */
+ data->ptex_poly_corner = MEM_malloc_arrayN(num_ptex_faces,
+ sizeof(*data->ptex_poly_corner),
+ "ptex poly corner");
+ /* Fill in offsets. */
+ int ptex_face_index = 0;
+ PolyCornerIndex *ptex_poly_corner = data->ptex_poly_corner;
+ for (int poly_index = 0; poly_index < mesh->totpoly; poly_index++) {
+ const MPoly *poly = &mpoly[poly_index];
+ if (poly->totloop == 4) {
+ ptex_poly_corner[ptex_face_index].poly_index = poly_index;
+ ptex_poly_corner[ptex_face_index].corner = 0;
+ ptex_face_index++;
+ }
+ else {
+ for (int corner = 0; corner < poly->totloop; corner++) {
+ ptex_poly_corner[ptex_face_index].poly_index = poly_index;
+ ptex_poly_corner[ptex_face_index].corner = corner;
+ ptex_face_index++;
+ }
+ }
+ }
+}
+
+static void displacement_init_data(SubdivCCGMask *mask_evaluator,
+ const Mesh *mesh)
+{
+ GridPaintMaskData *data = mask_evaluator->user_data;
+ data->mpoly = mesh->mpoly;
+ data->grid_paint_mask =
+ CustomData_get_layer(&mesh->ldata, CD_GRID_PAINT_MASK);
+ displacement_data_init_mapping(mask_evaluator, mesh);
+}
+
+static void displacement_init_functions(SubdivCCGMask *mask_evaluator)
+{
+ mask_evaluator->eval_mask = eval_mask;
+ mask_evaluator->free = free_mask_data;
+}
+
+bool BKE_subdiv_ccg_mask_init_from_paint(
+ SubdivCCGMask *mask_evaluator,
+ const struct Mesh *mesh)
+{
+ GridPaintMask *grid_paint_mask =
+ CustomData_get_layer(&mesh->ldata, CD_GRID_PAINT_MASK);
+ if (grid_paint_mask == NULL) {
+ return false;
+ }
+ /* Allocate all required memory. */
+ mask_evaluator->user_data = MEM_callocN(sizeof(GridPaintMaskData),
+ "mask from grid data");
+ displacement_init_data(mask_evaluator, mesh);
+ displacement_init_functions(mask_evaluator);
+ return true;
+}
diff --git a/source/blender/blenkernel/intern/subdiv_converter.c b/source/blender/blenkernel/intern/subdiv_converter.c
index 47e87bfdd78..b3eab1565d7 100644
--- a/source/blender/blenkernel/intern/subdiv_converter.c
+++ b/source/blender/blenkernel/intern/subdiv_converter.c
@@ -40,6 +40,21 @@ void BKE_subdiv_converter_free(struct OpenSubdiv_Converter *converter)
}
}
+int BKE_subdiv_converter_vtx_boundary_interpolation_from_settings(
+ const SubdivSettings *settings)
+{
+ switch (settings->vtx_boundary_interpolation) {
+ case SUBDIV_VTX_BOUNDARY_NONE:
+ return OSD_VTX_BOUNDARY_NONE;
+ case SUBDIV_VTX_BOUNDARY_EDGE_ONLY:
+ return OSD_VTX_BOUNDARY_EDGE_ONLY;
+ case SUBDIV_VTX_BOUNDARY_EDGE_AND_CORNER:
+ return OSD_VTX_BOUNDARY_EDGE_AND_CORNER;
+ }
+ BLI_assert(!"Unknown vtx boundary interpolation");
+ return OSD_VTX_BOUNDARY_EDGE_ONLY;
+}
+
/*OpenSubdiv_FVarLinearInterpolation*/ int
BKE_subdiv_converter_fvar_linear_from_settings(const SubdivSettings *settings)
{
diff --git a/source/blender/blenkernel/intern/subdiv_converter.h b/source/blender/blenkernel/intern/subdiv_converter.h
index 0326c9e504c..17172bc29f7 100644
--- a/source/blender/blenkernel/intern/subdiv_converter.h
+++ b/source/blender/blenkernel/intern/subdiv_converter.h
@@ -52,6 +52,12 @@ void BKE_subdiv_converter_free(struct OpenSubdiv_Converter *converter);
/* ============================ INTERNAL HELPERS ============================ */
+/* TODO(sergey): Find a way to make it OpenSubdiv_VtxBoundaryInterpolation,
+ * without breaking compilation without OpenSubdiv.
+ */
+int BKE_subdiv_converter_vtx_boundary_interpolation_from_settings(
+ const SubdivSettings *settings);
+
/* TODO(sergey): Find a way to make it OpenSubdiv_FVarLinearInterpolation,
* without breaking compilation without OpenSubdiv.
*/
diff --git a/source/blender/blenkernel/intern/subdiv_converter_mesh.c b/source/blender/blenkernel/intern/subdiv_converter_mesh.c
index d17ee49ca0c..5941de682f4 100644
--- a/source/blender/blenkernel/intern/subdiv_converter_mesh.c
+++ b/source/blender/blenkernel/intern/subdiv_converter_mesh.c
@@ -87,6 +87,13 @@ static OpenSubdiv_SchemeType get_scheme_type(
}
}
+static OpenSubdiv_VtxBoundaryInterpolation get_vtx_boundary_interpolation(
+ const struct OpenSubdiv_Converter *converter) {
+ ConverterStorage *storage = converter->user_data;
+ return BKE_subdiv_converter_vtx_boundary_interpolation_from_settings(
+ &storage->settings);
+}
+
static OpenSubdiv_FVarLinearInterpolation get_fvar_linear_interpolation(
const OpenSubdiv_Converter *converter)
{
@@ -264,6 +271,7 @@ static void free_user_data(const OpenSubdiv_Converter *converter)
static void init_functions(OpenSubdiv_Converter *converter)
{
converter->getSchemeType = get_scheme_type;
+ converter->getVtxBoundaryInterpolation = get_vtx_boundary_interpolation;
converter->getFVarLinearInterpolation = get_fvar_linear_interpolation;
converter->specifiesFullTopology = specifies_full_topology;
diff --git a/source/blender/blenkernel/intern/subdiv_displacement_multires.c b/source/blender/blenkernel/intern/subdiv_displacement_multires.c
index 1e0e2ae5152..5744ac3ca0d 100644
--- a/source/blender/blenkernel/intern/subdiv_displacement_multires.c
+++ b/source/blender/blenkernel/intern/subdiv_displacement_multires.c
@@ -38,6 +38,7 @@
#include "BLI_math_vector.h"
#include "BKE_customdata.h"
+#include "BKE_multires.h"
#include "MEM_guardedalloc.h"
@@ -69,51 +70,6 @@ typedef enum eAverageWith {
AVERAGE_WITH_NEXT,
} eAverageWith;
-/* Coordinates within grid has different convention from PTex coordinates.
- * This function converts the latter ones to former.
- */
-BLI_INLINE void ptex_uv_to_grid_uv(const float ptex_u, const float ptex_v,
- float *r_grid_u, float *r_grid_v)
-{
- *r_grid_u = 1.0f - ptex_v;
- *r_grid_v = 1.0f - ptex_u;
-}
-
-/* Simplified version of mdisp_rot_face_to_crn, only handles quad and
- * works in normalized coordinates.
- *
- * NOTE: Output coordinates are in ptex coordinates.
- */
-BLI_INLINE int rotate_quad_to_corner(const float u, const float v,
- float *r_u, float *r_v)
-{
- int corner;
- if (u <= 0.5f && v <= 0.5f) {
- corner = 0;
- *r_u = 2.0f * u;
- *r_v = 2.0f * v;
- }
- else if (u > 0.5f && v <= 0.5f) {
- corner = 1;
- *r_u = 2.0f * v;
- *r_v = 2.0f * (1.0f - u);
- }
- else if (u > 0.5f && v > 0.5f) {
- corner = 2;
- *r_u = 2.0f * (1.0f - u);
- *r_v = 2.0f * (1.0f - v);
- }
- else if (u <= 0.5f && v >= 0.5f) {
- corner = 3;
- *r_u = 2.0f * (1.0f - v);
- *r_v = 2.0f * u;
- }
- else {
- BLI_assert(!"Unexpected corner configuration");
- }
- return corner;
-}
-
static int displacement_get_grid_and_coord(
SubdivDisplacement *displacement,
const int ptex_face_index, const float u, const float v,
@@ -128,13 +84,13 @@ static int displacement_get_grid_and_coord(
int corner = 0;
if (poly->totloop == 4) {
float corner_u, corner_v;
- corner = rotate_quad_to_corner(u, v, &corner_u, &corner_v);
+ corner = BKE_subdiv_rotate_quad_to_corner(u, v, &corner_u, &corner_v);
*r_displacement_grid = &data->mdisps[start_grid_index + corner];
- ptex_uv_to_grid_uv(corner_u, corner_v, grid_u, grid_v);
+ BKE_subdiv_ptex_face_uv_to_grid_uv(corner_u, corner_v, grid_u, grid_v);
}
else {
*r_displacement_grid = &data->mdisps[start_grid_index];
- ptex_uv_to_grid_uv(u, v, grid_u, grid_v);
+ BKE_subdiv_ptex_face_uv_to_grid_uv(u, v, grid_u, grid_v);
}
return corner;
}
@@ -168,38 +124,6 @@ static const MDisps *displacement_get_prev_grid(
return &data->mdisps[poly->loopstart + prev_corner];
}
-/* NOTE: Derivatives are in ptex face space. */
-BLI_INLINE void construct_tangent_matrix(float tangent_matrix[3][3],
- const float dPdu[3],
- const float dPdv[3],
- const int corner)
-{
- if (corner == 0) {
- copy_v3_v3(tangent_matrix[0], dPdv);
- copy_v3_v3(tangent_matrix[1], dPdu);
- mul_v3_fl(tangent_matrix[0], -1.0f);
- mul_v3_fl(tangent_matrix[1], -1.0f);
- }
- else if (corner == 1) {
- copy_v3_v3(tangent_matrix[0], dPdu);
- copy_v3_v3(tangent_matrix[1], dPdv);
- mul_v3_fl(tangent_matrix[1], -1.0f);
- }
- else if (corner == 2) {
- copy_v3_v3(tangent_matrix[0], dPdv);
- copy_v3_v3(tangent_matrix[1], dPdu);
- }
- else if (corner == 3) {
- copy_v3_v3(tangent_matrix[0], dPdu);
- copy_v3_v3(tangent_matrix[1], dPdv);
- mul_v3_fl(tangent_matrix[0], -1.0f);
- }
- cross_v3_v3v3(tangent_matrix[2], dPdu, dPdv);
- normalize_v3(tangent_matrix[0]);
- normalize_v3(tangent_matrix[1]);
- normalize_v3(tangent_matrix[2]);
-}
-
BLI_INLINE eAverageWith read_displacement_grid(
const MDisps *displacement_grid,
const int grid_size,
@@ -343,7 +267,7 @@ static void eval_displacement(SubdivDisplacement *displacement,
tangent_D);
/* Convert it to the object space. */
float tangent_matrix[3][3];
- construct_tangent_matrix(tangent_matrix, dPdu, dPdv, corner);
+ BKE_multires_construct_tangent_matrix(tangent_matrix, dPdu, dPdv, corner);
mul_v3_m3v3(r_D, tangent_matrix, tangent_D);
}
@@ -403,7 +327,7 @@ static void displacement_init_data(SubdivDisplacement *displacement,
const MultiresModifierData *mmd)
{
MultiresDisplacementData *data = displacement->user_data;
- data->grid_size = (1 << (mmd->totlvl - 1)) + 1;
+ data->grid_size = BKE_subdiv_grid_size_from_level(mmd->totlvl);
data->mpoly = mesh->mpoly;
data->mdisps = CustomData_get_layer(&mesh->ldata, CD_MDISPS);
displacement_data_init_mapping(displacement, mesh);
@@ -420,7 +344,7 @@ void BKE_subdiv_displacement_attach_from_multires(
const Mesh *mesh,
const MultiresModifierData *mmd)
{
- /* Make sure we dont' have previously assigned displacement. */
+ /* Make sure we don't have previously assigned displacement. */
BKE_subdiv_displacement_detach(subdiv);
/* Allocate all required memory. */
SubdivDisplacement *displacement = MEM_callocN(sizeof(SubdivDisplacement),
diff --git a/source/blender/blenkernel/intern/subdiv_eval.c b/source/blender/blenkernel/intern/subdiv_eval.c
index 7b234683102..f4a9e1a95fd 100644
--- a/source/blender/blenkernel/intern/subdiv_eval.c
+++ b/source/blender/blenkernel/intern/subdiv_eval.c
@@ -27,7 +27,7 @@
* \ingroup bke
*/
-#include "BKE_subdiv.h"
+#include "BKE_subdiv_eval.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ -37,6 +37,7 @@
#include "BLI_math_vector.h"
#include "BKE_customdata.h"
+#include "BKE_subdiv.h"
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenkernel/intern/subdiv_foreach.c b/source/blender/blenkernel/intern/subdiv_foreach.c
index d77bbe8a15d..511536c31b5 100644
--- a/source/blender/blenkernel/intern/subdiv_foreach.c
+++ b/source/blender/blenkernel/intern/subdiv_foreach.c
@@ -27,7 +27,7 @@
* \ingroup bke
*/
-#include "BKE_subdiv.h"
+#include "BKE_subdiv_foreach.h"
#include "atomic_ops.h"
@@ -42,6 +42,8 @@
#include "BKE_mesh.h"
#include "BKE_key.h"
+#include "BKE_subdiv.h"
+#include "BKE_subdiv_mesh.h"
#include "MEM_guardedalloc.h"
@@ -121,7 +123,7 @@ typedef struct SubdivForeachTaskContext {
*/
BLI_bitmap *coarse_vertices_used_map;
/* Bitmap indicating whether edge was used already or not. This includes:
- * - During context initialization it indicates whether subdivided verticies
+ * - During context initialization it indicates whether subdivided vertices
* for corresponding edge were already calculated or not.
* - During patch evaluation it indicates whether vertices along this edge
* were already evaluated.
@@ -165,7 +167,7 @@ static void subdiv_foreach_ctx_count(SubdivForeachTaskContext *ctx)
ctx->num_subdiv_vertices += num_subdiv_vertices_per_coarse_edge;
}
}
- /* Inner verticies of polygon. */
+ /* Inner vertices of polygon. */
if (num_ptex_faces_per_poly == 1) {
ctx->num_subdiv_vertices += num_inner_vertices_per_quad;
ctx->num_subdiv_edges +=
@@ -227,16 +229,13 @@ static void subdiv_foreach_ctx_init_offsets(SubdivForeachTaskContext *ctx)
int vertex_offset = 0;
int edge_offset = 0;
int polygon_offset = 0;
- int face_ptex_offset = 0;
for (int poly_index = 0; poly_index < coarse_mesh->totpoly; poly_index++) {
const MPoly *coarse_poly = &coarse_mpoly[poly_index];
const int num_ptex_faces_per_poly =
num_ptex_faces_per_poly_get(coarse_poly);
- ctx->face_ptex_offset[poly_index] = face_ptex_offset;
ctx->subdiv_vertex_offset[poly_index] = vertex_offset;
ctx->subdiv_edge_offset[poly_index] = edge_offset;
ctx->subdiv_polygon_offset[poly_index] = polygon_offset;
- face_ptex_offset += num_ptex_faces_per_poly;
if (num_ptex_faces_per_poly == 1) {
vertex_offset += resolution_2_squared;
edge_offset += num_edges_per_ptex_face_get(resolution - 2) +
@@ -263,7 +262,8 @@ static void subdiv_foreach_ctx_init_offsets(SubdivForeachTaskContext *ctx)
}
}
-static void subdiv_foreach_ctx_init(SubdivForeachTaskContext *ctx)
+static void subdiv_foreach_ctx_init(Subdiv *subdiv,
+ SubdivForeachTaskContext *ctx)
{
const Mesh *coarse_mesh = ctx->coarse_mesh;
/* Allocate maps and offsets. */
@@ -283,15 +283,13 @@ static void subdiv_foreach_ctx_init(SubdivForeachTaskContext *ctx)
coarse_mesh->totpoly,
sizeof(*ctx->subdiv_polygon_offset),
"subdiv_edge_offset");
- ctx->face_ptex_offset = MEM_malloc_arrayN(coarse_mesh->totpoly,
- sizeof(*ctx->face_ptex_offset),
- "face_ptex_offset");
/* Initialize all offsets. */
subdiv_foreach_ctx_init_offsets(ctx);
/* Calculate number of geometry in the result subdivision mesh. */
subdiv_foreach_ctx_count(ctx);
/* Re-set maps which were used at this step. */
BLI_BITMAP_SET_ALL(ctx->coarse_edges_used_map, false, coarse_mesh->totedge);
+ ctx->face_ptex_offset = BKE_subdiv_face_ptex_offset_get(subdiv);
}
static void subdiv_foreach_ctx_free(SubdivForeachTaskContext *ctx)
@@ -301,7 +299,6 @@ static void subdiv_foreach_ctx_free(SubdivForeachTaskContext *ctx)
MEM_freeN(ctx->subdiv_vertex_offset);
MEM_freeN(ctx->subdiv_edge_offset);
MEM_freeN(ctx->subdiv_polygon_offset);
- MEM_freeN(ctx->face_ptex_offset);
}
/* =============================================================================
@@ -1325,13 +1322,13 @@ static void subdiv_foreach_loops_regular(SubdivForeachTaskContext *ctx,
for (int x = 1; x < ptex_resolution - 2; x++, subdiv_loop_index += 4) {
const int inner_x = x - 1;
const float u = x * inv_ptex_resolution_1;
- /* Vertex indicies ordered counter-clockwise. */
+ /* Vertex indices ordered counter-clockwise. */
const int v0 = start_vertex_index +
(inner_y * ptex_inner_resolution + inner_x);
const int v1 = v0 + 1;
const int v2 = v0 + ptex_inner_resolution + 1;
const int v3 = v0 + ptex_inner_resolution;
- /* Edge indicies ordered counter-clockwise. */
+ /* Edge indices ordered counter-clockwise. */
const int e0 = start_edge_index +
(inner_y * (2 * ptex_inner_resolution - 1) + inner_x);
const int e1 = e0 + ptex_inner_resolution;
@@ -1520,14 +1517,14 @@ static void subdiv_foreach_loops_special(SubdivForeachTaskContext *ctx,
{
const int inner_x = x - 1;
const float u = x * inv_ptex_resolution_1;
- /* Vertex indicies ordered counter-clockwise. */
+ /* Vertex indices ordered counter-clockwise. */
const int v0 =
corner_vertex_index +
(inner_y * (ptex_face_inner_resolution + 1) + inner_x);
const int v1 = v0 + 1;
const int v2 = v0 + ptex_face_inner_resolution + 2;
const int v3 = v0 + ptex_face_inner_resolution + 1;
- /* Edge indicies ordered counter-clockwise. */
+ /* Edge indices ordered counter-clockwise. */
const int e0 = corner_edge_index +
(inner_y * (2 * ptex_face_inner_resolution + 1) + inner_x);
const int e1 = e0 + ptex_face_inner_resolution + 1;
@@ -1908,7 +1905,7 @@ static void subdiv_foreach_vertices_of_loose_edges_task(
const int num_subdiv_vertices_per_coarse_edge = resolution - 2;
const Mesh *coarse_mesh = ctx->coarse_mesh;
const MEdge *coarse_edge = &coarse_mesh->medge[coarse_edge_index];
- /* Subdivion verticies which corresponds to edge's v1 and v2. */
+ /* Subdivion vertices which corresponds to edge's v1 and v2. */
const int subdiv_v1_index =
ctx->vertices_corner_offset + coarse_edge->v1;
const int subdiv_v2_index =
@@ -1980,16 +1977,16 @@ static void subdiv_foreach_finalize(void *__restrict userdata,
}
bool BKE_subdiv_foreach_subdiv_geometry(
- struct Subdiv *UNUSED(subdiv),
+ Subdiv *subdiv,
const SubdivForeachContext *context,
const SubdivToMeshSettings *mesh_settings,
- const struct Mesh *coarse_mesh)
+ const Mesh *coarse_mesh)
{
SubdivForeachTaskContext ctx = {0};
ctx.coarse_mesh = coarse_mesh;
ctx.settings = mesh_settings;
ctx.foreach_context = context;
- subdiv_foreach_ctx_init(&ctx);
+ subdiv_foreach_ctx_init(subdiv, &ctx);
if (context->topology_info != NULL) {
if (!context->topology_info(context,
ctx.num_subdiv_vertices,
@@ -1997,6 +1994,7 @@ bool BKE_subdiv_foreach_subdiv_geometry(
ctx.num_subdiv_loops,
ctx.num_subdiv_polygons))
{
+ subdiv_foreach_ctx_free(&ctx);
return false;
}
}
diff --git a/source/blender/blenkernel/intern/subdiv_inline.h b/source/blender/blenkernel/intern/subdiv_inline.h
new file mode 100644
index 00000000000..7eebde48bdc
--- /dev/null
+++ b/source/blender/blenkernel/intern/subdiv_inline.h
@@ -0,0 +1,80 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2018 by Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Sergey Sharybin.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenkernel/intern/subdiv_inline.h
+ * \ingroup bke
+ */
+
+#ifndef __SUBDIV_INLINE_H__
+#define __SUBDIV_INLINE_H__
+
+#include "BLI_assert.h"
+#include "BLI_compiler_compat.h"
+
+#include "BKE_subdiv.h"
+
+BLI_INLINE void BKE_subdiv_ptex_face_uv_to_grid_uv(
+ const float ptex_u, const float ptex_v,
+ float *r_grid_u, float *r_grid_v)
+{
+ *r_grid_u = 1.0f - ptex_v;
+ *r_grid_v = 1.0f - ptex_u;
+}
+
+BLI_INLINE int BKE_subdiv_grid_size_from_level(const int level)
+{
+ return (1 << (level - 1)) + 1;
+}
+
+BLI_INLINE int BKE_subdiv_rotate_quad_to_corner(
+ const float u, const float v,
+ float *r_u, float *r_v)
+{
+ int corner;
+ if (u <= 0.5f && v <= 0.5f) {
+ corner = 0;
+ *r_u = 2.0f * u;
+ *r_v = 2.0f * v;
+ }
+ else if (u > 0.5f && v <= 0.5f) {
+ corner = 1;
+ *r_u = 2.0f * v;
+ *r_v = 2.0f * (1.0f - u);
+ }
+ else if (u > 0.5f && v > 0.5f) {
+ corner = 2;
+ *r_u = 2.0f * (1.0f - u);
+ *r_v = 2.0f * (1.0f - v);
+ }
+ else {
+ BLI_assert(u <= 0.5f && v >= 0.5f);
+ corner = 3;
+ *r_u = 2.0f * (1.0f - v);
+ *r_v = 2.0f * u;
+ }
+ return corner;
+}
+
+#endif /* __SUBDIV_INLINE_H__ */
diff --git a/source/blender/blenkernel/intern/subdiv_mesh.c b/source/blender/blenkernel/intern/subdiv_mesh.c
index 8f0b2bb8242..d8d4014b3cd 100644
--- a/source/blender/blenkernel/intern/subdiv_mesh.c
+++ b/source/blender/blenkernel/intern/subdiv_mesh.c
@@ -27,7 +27,7 @@
* \ingroup bke
*/
-#include "BKE_subdiv.h"
+#include "BKE_subdiv_mesh.h"
#include "atomic_ops.h"
@@ -42,6 +42,9 @@
#include "BKE_mesh.h"
#include "BKE_key.h"
+#include "BKE_subdiv.h"
+#include "BKE_subdiv_eval.h"
+#include "BKE_subdiv_foreach.h"
#include "MEM_guardedalloc.h"
@@ -116,7 +119,7 @@ static void loops_of_ptex_get(
/* Loop which look in the (opposite) V direction of the current
* ptex face.
*
- * TOOD(sergey): Get rid of using module on every iteration.
+ * TODO(sergey): Get rid of using module on every iteration.
*/
const int last_ptex_loop_index =
coarse_poly->loopstart +
@@ -559,7 +562,7 @@ static void evaluate_vertex_and_apply_displacement_copy(
MVert *subdiv_vert)
{
/* Displacement is accumulated in subdiv vertex position.
- * need to back it up before copying data fro original vertex.
+ * need to back it up before copying data from original vertex.
*/
float D[3];
copy_v3_v3(D, subdiv_vert->co);
@@ -581,7 +584,7 @@ static void evaluate_vertex_and_apply_displacement_interpolate(
MVert *subdiv_vert)
{
/* Displacement is accumulated in subdiv vertex position.
- * need to back it up before copying data fro original vertex.
+ * need to back it up before copying data from original vertex.
*/
float D[3];
copy_v3_v3(D, subdiv_vert->co);
@@ -1070,7 +1073,7 @@ static void setup_foreach_callbacks(SubdivForeachContext *foreach_context,
const Subdiv *subdiv)
{
memset(foreach_context, 0, sizeof(*foreach_context));
- /* General informaiton. */
+ /* General information. */
foreach_context->topology_info = subdiv_mesh_topology_info;
/* Every boundary geometry. Used for dispalcement averaging. */
if (subdiv->displacement_evaluator != NULL) {
diff --git a/source/blender/blenkernel/intern/subdiv_stats.c b/source/blender/blenkernel/intern/subdiv_stats.c
index f2219961ab7..a0cd1d909b7 100644
--- a/source/blender/blenkernel/intern/subdiv_stats.c
+++ b/source/blender/blenkernel/intern/subdiv_stats.c
@@ -40,6 +40,8 @@ void BKE_subdiv_stats_init(SubdivStats *stats)
stats->subdiv_to_mesh_geometry_time = 0.0;
stats->evaluator_creation_time = 0.0;
stats->evaluator_refine_time = 0.0;
+ stats->subdiv_to_ccg_time = 0.0;
+ stats->subdiv_to_ccg_elements_time = 0.0;
}
void BKE_subdiv_stats_begin(SubdivStats *stats, eSubdivStatsValue value)
@@ -79,6 +81,12 @@ void BKE_subdiv_stats_print(const SubdivStats *stats)
STATS_PRINT_TIME(stats,
evaluator_refine_time,
"Evaluator refine time");
+ STATS_PRINT_TIME(stats,
+ subdiv_to_ccg_time,
+ "Subdivision to CCG time");
+ STATS_PRINT_TIME(stats,
+ subdiv_to_ccg_elements_time,
+ " Elements time");
#undef STATS_PRINT_TIME
}
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index c75d5977ebe..4a864dd444e 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -86,7 +86,7 @@
# include "opensubdiv_capi.h"
#endif
-/* assumes MLoop's are layed out 4 for each poly, in order */
+/* assumes MLoop's are laid out 4 for each poly, in order */
#define USE_LOOP_LAYOUT_FAST
static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
@@ -286,7 +286,7 @@ static void get_face_uv_map_vert(UvVertMap *vmap, struct MPoly *mpoly, struct ML
break;
}
- fverts[j] = SET_UINT_IN_POINTER(mpoly[nv->poly_index].loopstart + nv->loop_of_poly_index);
+ fverts[j] = POINTER_FROM_UINT(mpoly[nv->poly_index].loopstart + nv->loop_of_poly_index);
}
}
@@ -333,7 +333,7 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm,
if (v->separate) {
CCGVert *ssv;
int loopid = mpoly[v->poly_index].loopstart + v->loop_of_poly_index;
- CCGVertHDL vhdl = SET_INT_IN_POINTER(loopid);
+ CCGVertHDL vhdl = POINTER_FROM_INT(loopid);
copy_v2_v2(uv, mloopuv[loopid].uv);
@@ -349,7 +349,7 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm,
MPoly *mp = &mpoly[i];
int nverts = mp->totloop;
int j, j_next;
- CCGFace *origf = ccgSubSurf_getFace(origss, SET_INT_IN_POINTER(i));
+ CCGFace *origf = ccgSubSurf_getFace(origss, POINTER_FROM_INT(i));
/* unsigned int *fv = &mp->v1; */
MLoop *ml = mloop + mp->loopstart;
@@ -363,12 +363,12 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm,
get_face_uv_map_vert(vmap, mpoly, ml, i, fverts);
for (j = 0, j_next = nverts - 1; j < nverts; j_next = j++) {
- unsigned int v0 = GET_UINT_FROM_POINTER(fverts[j_next]);
- unsigned int v1 = GET_UINT_FROM_POINTER(fverts[j]);
+ unsigned int v0 = POINTER_AS_UINT(fverts[j_next]);
+ unsigned int v1 = POINTER_AS_UINT(fverts[j]);
if (BLI_edgeset_add(eset, v0, v1)) {
CCGEdge *e, *orige = ccgSubSurf_getFaceEdge(origf, j_next);
- CCGEdgeHDL ehdl = SET_INT_IN_POINTER(mp->loopstart + j_next);
+ CCGEdgeHDL ehdl = POINTER_FROM_INT(mp->loopstart + j_next);
float crease = ccgSubSurf_getEdgeCrease(orige);
ccgSubSurf_syncEdge(ss, ehdl, fverts[j_next], fverts[j], crease, &e);
@@ -393,7 +393,7 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm,
#endif
get_face_uv_map_vert(vmap, mpoly, ml, i, fverts);
- ccgSubSurf_syncFace(ss, SET_INT_IN_POINTER(i), nverts, fverts, &f);
+ ccgSubSurf_syncFace(ss, POINTER_FROM_INT(i), nverts, fverts, &f);
}
#ifndef USE_DYNSIZE
@@ -438,7 +438,7 @@ static void UNUSED_FUNCTION(set_subsurf_osd_ccg_uv)(CCGSubSurf *ss,
faceMap = MEM_mallocN(totface * sizeof(*faceMap), "facemapuv");
for (ccgSubSurf_initFaceIterator(ss, &fi); !ccgFaceIterator_isStopped(&fi); ccgFaceIterator_next(&fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(&fi);
- faceMap[GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f))] = f;
+ faceMap[POINTER_AS_INT(ccgSubSurf_getFaceFaceHandle(f))] = f;
}
/* load coordinates from uvss into tface */
@@ -524,7 +524,7 @@ static void set_subsurf_legacy_uv(CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *
faceMap = MEM_mallocN(totface * sizeof(*faceMap), "facemapuv");
for (ccgSubSurf_initFaceIterator(uvss, &fi); !ccgFaceIterator_isStopped(&fi); ccgFaceIterator_next(&fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(&fi);
- faceMap[GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f))] = f;
+ faceMap[POINTER_AS_INT(ccgSubSurf_getFaceFaceHandle(f))] = f;
}
/* load coordinates from uvss into tface */
@@ -700,10 +700,10 @@ static void ss_sync_ccg_from_derivedmesh(CCGSubSurf *ss,
CCGVert *v;
if (vertexCos) {
- ccgSubSurf_syncVert(ss, SET_INT_IN_POINTER(i), vertexCos[i], 0, &v);
+ ccgSubSurf_syncVert(ss, POINTER_FROM_INT(i), vertexCos[i], 0, &v);
}
else {
- ccgSubSurf_syncVert(ss, SET_INT_IN_POINTER(i), mv->co, 0, &v);
+ ccgSubSurf_syncVert(ss, POINTER_FROM_INT(i), mv->co, 0, &v);
}
((int *)ccgSubSurf_getVertUserData(ss, v))[1] = (index) ? *index++ : i;
@@ -718,8 +718,8 @@ static void ss_sync_ccg_from_derivedmesh(CCGSubSurf *ss,
crease = useFlatSubdiv ? creaseFactor :
me->crease * creaseFactor / 255.0f;
- ccgSubSurf_syncEdge(ss, SET_INT_IN_POINTER(i), SET_UINT_IN_POINTER(me->v1),
- SET_UINT_IN_POINTER(me->v2), crease, &e);
+ ccgSubSurf_syncEdge(ss, POINTER_FROM_INT(i), POINTER_FROM_UINT(me->v1),
+ POINTER_FROM_UINT(me->v2), crease, &e);
((int *)ccgSubSurf_getEdgeUserData(ss, e))[1] = (index) ? *index++ : i;
}
@@ -738,14 +738,14 @@ static void ss_sync_ccg_from_derivedmesh(CCGSubSurf *ss,
ml = mloop + mp->loopstart;
for (j = 0; j < mp->totloop; j++, ml++) {
- fVerts[j] = SET_UINT_IN_POINTER(ml->v);
+ fVerts[j] = POINTER_FROM_UINT(ml->v);
}
/* this is very bad, means mesh is internally inconsistent.
* it is not really possible to continue without modifying
* other parts of code significantly to handle missing faces.
* since this really shouldn't even be possible we just bail.*/
- if (ccgSubSurf_syncFace(ss, SET_INT_IN_POINTER(i), mp->totloop,
+ if (ccgSubSurf_syncFace(ss, POINTER_FROM_INT(i), mp->totloop,
fVerts, &f) == eCCGError_InvalidValue)
{
static int hasGivenError = 0;
@@ -1047,43 +1047,6 @@ static void ccgDM_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med)
int gridSideEdges;
int gridInternalEdges;
- /* code added in bmesh but works correctly without, commenting - campbell */
-#if 0
- int lasti, previ;
- i = lastface;
- lasti = 0;
- while (1) {
- previ = i;
- if (ccgdm->faceMap[i].startEdge >= edgeNum) {
- i -= fabsf(i - lasti) / 2.0f;
- }
- else if (ccgdm->faceMap[i].startEdge < edgeNum) {
- i += fabsf(i - lasti) / 2.0f;
- }
- else {
- break;
- }
-
- if (i < 0) {
- i = 0;
- break;
- }
-
- if (i > lastface) {
- i = lastface;
- break;
-
- }
-
- if (i == lasti)
- break;
-
- lasti = previ;
- }
-
- i = i > 0 ? i - 1 : i;
-#endif
-
i = 0;
while (i < lastface && edgeNum >= ccgdm->faceMap[i + 1].startEdge) {
i++;
@@ -1273,7 +1236,7 @@ void subsurf_copy_grid_paint_mask(DerivedMesh *dm, const MPoly *mpoly,
}
}
-/* utility functon */
+/* utility function */
BLI_INLINE void ccgDM_to_MVert(MVert *mv, const CCGKey *key, CCGElem *elem)
{
copy_v3_v3(mv->co, CCG_elem_co(key, elem));
@@ -1346,7 +1309,7 @@ static void ccgDM_copyFinalVertArray(DerivedMesh *dm, MVert *mvert)
}
-/* utility functon */
+/* utility function */
BLI_INLINE void ccgDM_to_MEdge(MEdge *med, const int v1, const int v2, const short flag)
{
med->v1 = v1;
@@ -1400,7 +1363,7 @@ static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
CCGEdge *e = ccgdm->edgeMap[index].edge;
short ed_flag = 0;
int x;
- int edgeIdx = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e));
+ int edgeIdx = POINTER_AS_INT(ccgSubSurf_getEdgeEdgeHandle(e));
if (!ccgSubSurf_getEdgeNumFaces(e)) {
ed_flag |= ME_LOOSEEDGE;
@@ -1504,19 +1467,19 @@ static void copyFinalLoopArray_task_cb(
edge_size, grid_size);
ml->v = v1;
- ml->e = GET_UINT_FROM_POINTER(BLI_edgehash_lookup(ccgdm->ehash, v1, v2));
+ ml->e = POINTER_AS_UINT(BLI_edgehash_lookup(ccgdm->ehash, v1, v2));
ml++;
ml->v = v2;
- ml->e = GET_UINT_FROM_POINTER(BLI_edgehash_lookup(ccgdm->ehash, v2, v3));
+ ml->e = POINTER_AS_UINT(BLI_edgehash_lookup(ccgdm->ehash, v2, v3));
ml++;
ml->v = v3;
- ml->e = GET_UINT_FROM_POINTER(BLI_edgehash_lookup(ccgdm->ehash, v3, v4));
+ ml->e = POINTER_AS_UINT(BLI_edgehash_lookup(ccgdm->ehash, v3, v4));
ml++;
ml->v = v4;
- ml->e = GET_UINT_FROM_POINTER(BLI_edgehash_lookup(ccgdm->ehash, v4, v1));
+ ml->e = POINTER_AS_UINT(BLI_edgehash_lookup(ccgdm->ehash, v4, v1));
ml++;
}
}
@@ -1538,7 +1501,7 @@ static void ccgDM_copyFinalLoopArray(DerivedMesh *dm, MLoop *mloop)
medge = ccgdm->dm.getEdgeArray((DerivedMesh *)ccgdm);
for (int i = 0; i < ccgdm->dm.numEdgeData; i++) {
- BLI_edgehash_insert(ehash, medge[i].v1, medge[i].v2, SET_INT_IN_POINTER(i));
+ BLI_edgehash_insert(ehash, medge[i].v1, medge[i].v2, POINTER_FROM_INT(i));
}
atomic_cas_ptr((void **)&ccgdm->ehash, ccgdm->ehash, ehash);
@@ -1625,7 +1588,7 @@ static void ccgdm_getVertCos(DerivedMesh *dm, float (*cos)[3])
for (ccgSubSurf_initVertIterator(ss, &vi); !ccgVertIterator_isStopped(&vi); ccgVertIterator_next(&vi)) {
CCGVert *v = ccgVertIterator_getCurrent(&vi);
- vertMap2[GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v))] = v;
+ vertMap2[POINTER_AS_INT(ccgSubSurf_getVertVertHandle(v))] = v;
}
totedge = ccgSubSurf_getNumEdges(ss);
@@ -1633,7 +1596,7 @@ static void ccgdm_getVertCos(DerivedMesh *dm, float (*cos)[3])
for (ccgSubSurf_initEdgeIterator(ss, &ei), i = 0; !ccgEdgeIterator_isStopped(&ei); i++, ccgEdgeIterator_next(&ei)) {
CCGEdge *e = ccgEdgeIterator_getCurrent(&ei);
- edgeMap2[GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e))] = e;
+ edgeMap2[POINTER_AS_INT(ccgSubSurf_getEdgeEdgeHandle(e))] = e;
}
totface = ccgSubSurf_getNumFaces(ss);
@@ -1641,7 +1604,7 @@ static void ccgdm_getVertCos(DerivedMesh *dm, float (*cos)[3])
for (ccgSubSurf_initFaceIterator(ss, &fi); !ccgFaceIterator_isStopped(&fi); ccgFaceIterator_next(&fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(&fi);
- faceMap2[GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f))] = f;
+ faceMap2[POINTER_AS_INT(ccgSubSurf_getFaceFaceHandle(f))] = f;
}
i = 0;
@@ -2276,8 +2239,9 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
if (ob->sculpt->pbvh) {
/* Note that we have to clean up exisitng pbvh instead of updating it in case it does not match current
* grid_pbvh status. */
+ const PBVHType pbvh_type = BKE_pbvh_type(ob->sculpt->pbvh);
if (grid_pbvh) {
- if (BKE_pbvh_get_ccgdm(ob->sculpt->pbvh) != NULL) {
+ if (pbvh_type == PBVH_GRIDS) {
/* pbvh's grids, gridadj and gridfaces points to data inside ccgdm
* but this can be freed on ccgdm release, this updates the pointers
* when the ccgdm gets remade, the assumption is that the topology
@@ -2291,7 +2255,7 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
ob->sculpt->pbvh = NULL;
}
}
- else if (BKE_pbvh_get_ccgdm(ob->sculpt->pbvh) != NULL) {
+ else if (pbvh_type == PBVH_GRIDS) {
BKE_pbvh_free(ob->sculpt->pbvh);
ob->sculpt->pbvh = NULL;
}
@@ -2300,10 +2264,6 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
}
if (ccgdm->pbvh) {
- /* For grid pbvh, keep track of ccgdm */
- if (grid_pbvh) {
- BKE_pbvh_set_ccgdm(ccgdm->pbvh, ccgdm);
- }
return ccgdm->pbvh;
}
@@ -2355,10 +2315,6 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
pbvh_show_mask_set(ccgdm->pbvh, ob->sculpt->show_mask);
}
- /* For grid pbvh, keep track of ccgdm. */
- if (grid_pbvh && ccgdm->pbvh) {
- BKE_pbvh_set_ccgdm(ccgdm->pbvh, ccgdm);
- }
return ccgdm->pbvh;
}
@@ -2481,7 +2437,7 @@ static void create_ccgdm_maps(CCGDerivedMesh *ccgdm,
{
CCGVert *v = ccgVertIterator_getCurrent(&vi);
- ccgdm->vertMap[GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v))].vert = v;
+ ccgdm->vertMap[POINTER_AS_INT(ccgSubSurf_getVertVertHandle(v))].vert = v;
}
totedge = ccgSubSurf_getNumEdges(ss);
@@ -2492,7 +2448,7 @@ static void create_ccgdm_maps(CCGDerivedMesh *ccgdm,
{
CCGEdge *e = ccgEdgeIterator_getCurrent(&ei);
- ccgdm->edgeMap[GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e))].edge = e;
+ ccgdm->edgeMap[POINTER_AS_INT(ccgSubSurf_getEdgeEdgeHandle(e))].edge = e;
}
totface = ccgSubSurf_getNumFaces(ss);
@@ -2503,7 +2459,7 @@ static void create_ccgdm_maps(CCGDerivedMesh *ccgdm,
{
CCGFace *f = ccgFaceIterator_getCurrent(&fi);
- ccgdm->faceMap[GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f))].face = f;
+ ccgdm->faceMap[POINTER_AS_INT(ccgSubSurf_getFaceFaceHandle(f))].face = f;
}
}
@@ -2564,20 +2520,12 @@ static void set_ccgdm_all_geometry(CCGDerivedMesh *ccgdm,
has_edge_cd = ((ccgdm->dm.edgeData.totlayer - (edgeOrigIndex ? 1 : 0)) != 0);
-#if 0
- /* this is not in trunk, can gives problems because colors initialize
- * as black, just don't do it!, it works fine - campbell */
- if (!CustomData_has_layer(&ccgdm->dm.faceData, CD_MCOL))
- DM_add_tessface_layer(&ccgdm->dm, CD_MCOL, CD_CALLOC, NULL);
- mcol = DM_get_tessface_data_layer(&ccgdm->dm, CD_MCOL);
-#endif
-
loopindex = loopindex2 = 0; /* current loop index */
for (index = 0; index < totface; index++) {
CCGFace *f = ccgdm->faceMap[index].face;
int numVerts = ccgSubSurf_getFaceNumVerts(f);
int numFinalEdges = numVerts * (gridSideEdges + gridInternalEdges);
- int origIndex = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
+ int origIndex = POINTER_AS_INT(ccgSubSurf_getFaceFaceHandle(f));
int g2_wid = gridCuts + 2;
float *w, *w2;
int s, x, y;
@@ -2611,7 +2559,7 @@ static void set_ccgdm_all_geometry(CCGDerivedMesh *ccgdm,
#endif
for (s = 0; s < numVerts; s++) {
CCGVert *v = ccgSubSurf_getFaceVert(f, s);
- vertidx[s] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
+ vertidx[s] = POINTER_AS_INT(ccgSubSurf_getVertVertHandle(v));
}
/*I think this is for interpolating the center vert?*/
@@ -2724,13 +2672,13 @@ static void set_ccgdm_all_geometry(CCGDerivedMesh *ccgdm,
int mapIndex = ccgDM_getEdgeMapIndex(ss, e);
int x;
int vertIdx[2];
- int edgeIdx = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e));
+ int edgeIdx = POINTER_AS_INT(ccgSubSurf_getEdgeEdgeHandle(e));
CCGVert *v;
v = ccgSubSurf_getEdgeVert0(e);
- vertIdx[0] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
+ vertIdx[0] = POINTER_AS_INT(ccgSubSurf_getVertVertHandle(v));
v = ccgSubSurf_getEdgeVert1(e);
- vertIdx[1] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
+ vertIdx[1] = POINTER_AS_INT(ccgSubSurf_getVertVertHandle(v));
ccgdm->edgeMap[index].startVert = vertNum;
ccgdm->edgeMap[index].startEdge = edgeNum;
@@ -2784,7 +2732,7 @@ static void set_ccgdm_all_geometry(CCGDerivedMesh *ccgdm,
int mapIndex = ccgDM_getVertMapIndex(ccgdm->ss, v);
int vertIdx;
- vertIdx = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
+ vertIdx = POINTER_AS_INT(ccgSubSurf_getVertVertHandle(v));
ccgdm->vertMap[index].startVert = vertNum;
@@ -2908,7 +2856,7 @@ static bool subsurf_use_gpu_backend(SubsurfFlags flags)
{
#ifdef WITH_OPENSUBDIV
/* Use GPU backend if it's a last modifier in the stack
- * and user choosed to use any of the OSD compute devices,
+ * and user chose to use any of the OSD compute devices,
* but also check if GPU has all needed features.
*/
return
@@ -3008,7 +2956,7 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
if (smd->mCache && (flags & SUBSURF_IS_FINAL_CALC)) {
#ifdef WITH_OPENSUBDIV
- /* With OpenSubdiv enabled we always tries to re-use previos
+ /* With OpenSubdiv enabled we always tries to re-use previous
* subsurf structure in order to save computation time since
* re-creation is rather a complicated business.
*
@@ -3069,7 +3017,7 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*r_positions)[3])
for (ccgSubSurf_initVertIterator(ss, &vi); !ccgVertIterator_isStopped(&vi); ccgVertIterator_next(&vi)) {
CCGVert *v = ccgVertIterator_getCurrent(&vi);
- int idx = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
+ int idx = POINTER_AS_INT(ccgSubSurf_getVertVertHandle(v));
int N = ccgSubSurf_getVertNumEdges(v);
int numFaces = ccgSubSurf_getVertNumFaces(v);
float *co;
diff --git a/source/blender/blenkernel/intern/suggestions.c b/source/blender/blenkernel/intern/suggestions.c
index 043fc813b95..2e48599a113 100644
--- a/source/blender/blenkernel/intern/suggestions.c
+++ b/source/blender/blenkernel/intern/suggestions.c
@@ -246,12 +246,12 @@ void texttool_docs_show(const char *docs)
/* Ensure documentation ends with a '\n' */
if (docs[len - 1] != '\n') {
documentation = MEM_mallocN(len + 2, "Documentation");
- BLI_strncpy(documentation, docs, len);
+ memcpy(documentation, docs, len);
documentation[len++] = '\n';
}
else {
documentation = MEM_mallocN(len + 1, "Documentation");
- BLI_strncpy(documentation, docs, len);
+ memcpy(documentation, docs, len);
}
documentation[len] = '\0';
}
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c
index f876592c0a8..d512c4ac78e 100644
--- a/source/blender/blenkernel/intern/text.c
+++ b/source/blender/blenkernel/intern/text.c
@@ -352,7 +352,7 @@ static void text_from_buf(Text *text, const unsigned char *buffer, const int len
* - rest of line (if last line in file hasn't got \n terminator).
* in this case content of such line would be used to fill text line buffer
* - file is empty. in this case new line is needed to start editing from.
- * - last characted in buffer is \n. in this case new line is needed to
+ * - last character in buffer is \n. in this case new line is needed to
* deal with newline at end of file. (see [#28087]) (sergey) */
if (llen != 0 || text->nlines == 0 || buffer[len - 1] == '\n') {
TextLine *tmp;
@@ -1702,7 +1702,7 @@ static void txt_undo_add_blockop(Text *text, TextUndoBuf *utxt, int op, const ch
/* 4 bytes */
txt_undo_store_uint32(utxt->buf, &utxt->pos, length);
/* 'length' bytes */
- BLI_strncpy(utxt->buf + utxt->pos, buf, length);
+ memcpy(utxt->buf + utxt->pos, buf, length);
utxt->pos += length;
/* 4 bytes */
txt_undo_store_uint32(utxt->buf, &utxt->pos, length);
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c
index d8ee5e5fc7d..f19f27c85a7 100644
--- a/source/blender/blenkernel/intern/tracking.c
+++ b/source/blender/blenkernel/intern/tracking.c
@@ -1607,7 +1607,7 @@ MovieTrackingPlaneMarker *BKE_tracking_plane_marker_insert(MovieTrackingPlaneTra
int a = plane_track->markersnr;
/* Find position in array where to add new marker. */
- /* TODO(sergey): we coud use bisect to speed things up. */
+ /* TODO(sergey): we could use bisect to speed things up. */
while (a--) {
if (plane_track->markers[a].framenr < plane_marker->framenr) {
break;
@@ -1993,10 +1993,10 @@ void BKE_tracking_camera_to_blender(MovieTracking *tracking, Scene *scene, Camer
camera->sensor_fit = CAMERA_SENSOR_FIT_AUTO;
camera->lens = focal * camera->sensor_x / width;
- scene->r.xsch = width * tracking->camera.pixel_aspect;
+ scene->r.xsch = width;
scene->r.ysch = height;
- scene->r.xasp = 1.0f;
+ scene->r.xasp = tracking->camera.pixel_aspect;
scene->r.yasp = 1.0f;
BKE_tracking_camera_shift_get(tracking, width, height, &camera->shiftx, &camera->shifty);
diff --git a/source/blender/blenkernel/intern/tracking_region_tracker.c b/source/blender/blenkernel/intern/tracking_region_tracker.c
index 106dd125575..dcc61f409fc 100644
--- a/source/blender/blenkernel/intern/tracking_region_tracker.c
+++ b/source/blender/blenkernel/intern/tracking_region_tracker.c
@@ -149,7 +149,7 @@ static ImBuf *tracking_context_get_keyframed_ibuf(MovieClip *clip, MovieClipUser
return tracking_context_get_frame_ibuf(clip, user, clip_flag, keyed_framenr);
}
-/* Get image buffer which si used as referece for track. */
+/* Get image buffer which si used as reference for track. */
static ImBuf *tracking_context_get_reference_ibuf(MovieClip *clip, MovieClipUser *user, int clip_flag,
MovieTrackingTrack *track, int curfra, bool backwards,
MovieTrackingMarker **reference_marker)
diff --git a/source/blender/blenkernel/intern/tracking_stabilize.c b/source/blender/blenkernel/intern/tracking_stabilize.c
index 331db5b6ff0..aae9985bc24 100644
--- a/source/blender/blenkernel/intern/tracking_stabilize.c
+++ b/source/blender/blenkernel/intern/tracking_stabilize.c
@@ -982,7 +982,7 @@ static void initialize_track_for_stabilization(StabContext *ctx,
static void initialize_all_tracks(StabContext *ctx, float aspect)
{
- size_t i, track_cnt = 0;
+ size_t i, track_len = 0;
MovieClip *clip = ctx->clip;
MovieTracking *tracking = ctx->tracking;
MovieTrackingTrack *track;
@@ -1011,20 +1011,20 @@ static void initialize_all_tracks(StabContext *ctx, float aspect)
track);
local_data->is_init_for_stabilization = false;
- ++track_cnt;
+ ++track_len;
}
- if (!track_cnt) {
+ if (!track_len) {
return;
}
- order = MEM_mallocN(track_cnt * sizeof(TrackInitOrder),
+ order = MEM_mallocN(track_len * sizeof(TrackInitOrder),
"stabilization track order");
if (!order) {
return;
}
- track_cnt = establish_track_initialization_order(ctx, order);
- if (track_cnt == 0) {
+ track_len = establish_track_initialization_order(ctx, order);
+ if (track_len == 0) {
goto cleanup;
}
@@ -1032,7 +1032,7 @@ static void initialize_all_tracks(StabContext *ctx, float aspect)
average_marker_positions(ctx, reference_frame, average_pos);
setup_pivot(average_pos, pivot);
- for (i = 0; i < track_cnt; ++i) {
+ for (i = 0; i < track_len; ++i) {
track = order[i].data;
if (reference_frame != order[i].reference_frame) {
reference_frame = order[i].reference_frame;
diff --git a/source/blender/blenkernel/intern/undo_system.c b/source/blender/blenkernel/intern/undo_system.c
index 0eb209cabeb..abc53bf031a 100644
--- a/source/blender/blenkernel/intern/undo_system.c
+++ b/source/blender/blenkernel/intern/undo_system.c
@@ -39,6 +39,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_library.h"
#include "BKE_library_override.h"
#include "BKE_main.h"
#include "BKE_undo_system.h"
@@ -425,7 +426,9 @@ bool BKE_undosys_step_push_with_type(UndoStack *ustack, bContext *C, const char
/* Might not be final place for this to be called - probably only want to call it from some
* undo handlers, not all of them? */
- BKE_main_override_static_operations_create(G.main, false);
+ if (BKE_override_static_is_enabled()) {
+ BKE_main_override_static_operations_create(G.main, false);
+ }
/* Remove all undos after (also when 'ustack->step_active == NULL'). */
while (ustack->steps.last != ustack->step_active) {
diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c
index 8606da0743b..e2a0837b938 100644
--- a/source/blender/blenkernel/intern/unit.c
+++ b/source/blender/blenkernel/intern/unit.c
@@ -35,6 +35,8 @@
#include "BLI_string.h"
#include "BLI_string_utf8.h"
+#include "DNA_scene_types.h"
+
#include "BKE_unit.h" /* own include */
#ifdef WIN32
@@ -108,6 +110,8 @@ typedef struct bUnitCollection {
int length; /* to quickly find the last item */
} bUnitCollection;
+#define UNIT_COLLECTION_LENGTH(def) (sizeof(def) / sizeof(bUnitDef) - 1)
+
/* Dummy */
static struct bUnitDef buDummyDef[] = { {"", NULL, "", NULL, NULL, 1.0, 0.0}, {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}};
static struct bUnitCollection buDummyCollection = {buDummyDef, 0, 0, sizeof(buDummyDef)};
@@ -121,7 +125,7 @@ static const struct bUnitDef buMetricLenDef[] = {
{"decimeter", "decimeters", "dm", NULL, "10 Centimeters", UN_SC_DM, 0.0, B_UNIT_DEF_SUPPRESS},
{"centimeter", "centimeters", "cm", NULL, "Centimeters", UN_SC_CM, 0.0, B_UNIT_DEF_NONE},
{"millimeter", "millimeters", "mm", NULL, "Millimeters", UN_SC_MM, 0.0, B_UNIT_DEF_NONE | B_UNIT_DEF_TENTH},
- {"micrometer", "micrometers", "µm", "um", "Micrometers", UN_SC_UM, 0.0, B_UNIT_DEF_NONE},
+ {"micrometer", "micrometers", "µm", "um", "Micrometers", UN_SC_UM, 0.0, B_UNIT_DEF_NONE},
/* These get displayed because of float precision problems in the transform header,
* could work around, but for now probably people wont use these */
@@ -131,7 +135,7 @@ static const struct bUnitDef buMetricLenDef[] = {
#endif
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static const struct bUnitCollection buMetricLenCollection = {buMetricLenDef, 3, 0, sizeof(buMetricLenDef) / sizeof(bUnitDef)};
+static const struct bUnitCollection buMetricLenCollection = {buMetricLenDef, 3, 0, UNIT_COLLECTION_LENGTH(buMetricLenDef)};
static struct bUnitDef buImperialLenDef[] = {
{"mile", "miles", "mi", "m", "Miles", UN_SC_MI, 0.0, B_UNIT_DEF_NONE},
@@ -143,7 +147,7 @@ static struct bUnitDef buImperialLenDef[] = {
{"thou", "thou", "thou", "mil", "Thou", UN_SC_MIL, 0.0, B_UNIT_DEF_NONE}, /* plural for thou has no 's' */
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buImperialLenCollection = {buImperialLenDef, 4, 0, sizeof(buImperialLenDef) / sizeof(bUnitDef)};
+static struct bUnitCollection buImperialLenCollection = {buImperialLenDef, 4, 0, UNIT_COLLECTION_LENGTH(buImperialLenDef)};
/* Areas */
static struct bUnitDef buMetricAreaDef[] = {
@@ -157,7 +161,7 @@ static struct bUnitDef buMetricAreaDef[] = {
{"square micrometer", "square micrometers", "µm²", "um2", "Square Micrometers", UN_SC_UM * UN_SC_UM, 0.0, B_UNIT_DEF_NONE},
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buMetricAreaCollection = {buMetricAreaDef, 3, 0, sizeof(buMetricAreaDef) / sizeof(bUnitDef)};
+static struct bUnitCollection buMetricAreaCollection = {buMetricAreaDef, 3, 0, UNIT_COLLECTION_LENGTH(buMetricAreaDef)};
static struct bUnitDef buImperialAreaDef[] = {
{"square mile", "square miles", "sq mi", "sq m", "Square Miles", UN_SC_MI * UN_SC_MI, 0.0, B_UNIT_DEF_NONE},
@@ -169,7 +173,7 @@ static struct bUnitDef buImperialAreaDef[] = {
{"square thou", "square thous", "sq mil", NULL, "Square Thous", UN_SC_MIL * UN_SC_MIL, 0.0, B_UNIT_DEF_NONE},
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buImperialAreaCollection = {buImperialAreaDef, 4, 0, sizeof(buImperialAreaDef) / sizeof(bUnitDef)};
+static struct bUnitCollection buImperialAreaCollection = {buImperialAreaDef, 4, 0, UNIT_COLLECTION_LENGTH(buImperialAreaDef)};
/* Volumes */
static struct bUnitDef buMetricVolDef[] = {
@@ -183,7 +187,7 @@ static struct bUnitDef buMetricVolDef[] = {
{"cubic micrometer", "cubic micrometers", "µm³", "um3", "Cubic Micrometers", UN_SC_UM * UN_SC_UM * UN_SC_UM, 0.0, B_UNIT_DEF_NONE},
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buMetricVolCollection = {buMetricVolDef, 3, 0, sizeof(buMetricVolDef) / sizeof(bUnitDef)};
+static struct bUnitCollection buMetricVolCollection = {buMetricVolDef, 3, 0, UNIT_COLLECTION_LENGTH(buMetricVolDef)};
static struct bUnitDef buImperialVolDef[] = {
{"cubic mile", "cubic miles", "cu mi", "cu m", "Cubic Miles", UN_SC_MI * UN_SC_MI * UN_SC_MI, 0.0, B_UNIT_DEF_NONE},
@@ -195,11 +199,11 @@ static struct bUnitDef buImperialVolDef[] = {
{"cubic thou", "cubic thous", "cu mil", NULL, "Cubic Thous", UN_SC_MIL * UN_SC_MIL * UN_SC_MIL, 0.0, B_UNIT_DEF_NONE},
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buImperialVolCollection = {buImperialVolDef, 4, 0, sizeof(buImperialVolDef) / sizeof(bUnitDef)};
+static struct bUnitCollection buImperialVolCollection = {buImperialVolDef, 4, 0, UNIT_COLLECTION_LENGTH(buImperialVolDef)};
/* Mass */
static struct bUnitDef buMetricMassDef[] = {
- {"ton", "tonnes", "ton", "t", "1000 Kilograms", UN_SC_MTON, 0.0, B_UNIT_DEF_NONE},
+ {"ton", "tonnes", "ton", "t", "Tonnes", UN_SC_MTON, 0.0, B_UNIT_DEF_NONE},
{"quintal", "quintals", "ql", "q", "100 Kilograms", UN_SC_QL, 0.0, B_UNIT_DEF_SUPPRESS},
{"kilogram", "kilograms", "kg", NULL, "Kilograms", UN_SC_KG, 0.0, B_UNIT_DEF_NONE}, /* base unit */
{"hectogram", "hectograms", "hg", NULL, "Hectograms", UN_SC_HG, 0.0, B_UNIT_DEF_SUPPRESS},
@@ -208,7 +212,7 @@ static struct bUnitDef buMetricMassDef[] = {
{"milligram", "milligrams", "mg", NULL, "Milligrams", UN_SC_MG, 0.0, B_UNIT_DEF_NONE},
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buMetricMassCollection = {buMetricMassDef, 2, 0, sizeof(buMetricMassDef) / sizeof(bUnitDef)};
+static struct bUnitCollection buMetricMassCollection = {buMetricMassDef, 2, 0, UNIT_COLLECTION_LENGTH(buMetricMassDef)};
static struct bUnitDef buImperialMassDef[] = {
{"ton", "tonnes", "ton", "t", "Tonnes", UN_SC_ITON, 0.0, B_UNIT_DEF_NONE},
@@ -218,7 +222,7 @@ static struct bUnitDef buImperialMassDef[] = {
{"ounce", "ounces", "oz", NULL, "Ounces", UN_SC_OZ, 0.0, B_UNIT_DEF_NONE},
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buImperialMassCollection = {buImperialMassDef, 3, 0, sizeof(buImperialMassDef) / sizeof(bUnitDef)};
+static struct bUnitCollection buImperialMassCollection = {buImperialMassDef, 3, 0, UNIT_COLLECTION_LENGTH(buImperialMassDef)};
/* Even if user scales the system to a point where km^3 is used, velocity and
* acceleration aren't scaled: that's why we have so few units for them */
@@ -229,27 +233,27 @@ static struct bUnitDef buMetricVelDef[] = {
{"kilometer per hour", "kilometers per hour", "km/h", NULL, "Kilometers per hour", UN_SC_KM / 3600.0f, 0.0, B_UNIT_DEF_SUPPRESS},
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buMetricVelCollection = {buMetricVelDef, 0, 0, sizeof(buMetricVelDef) / sizeof(bUnitDef)};
+static struct bUnitCollection buMetricVelCollection = {buMetricVelDef, 0, 0, UNIT_COLLECTION_LENGTH(buMetricVelDef)};
static struct bUnitDef buImperialVelDef[] = {
{"foot per second", "feet per second", "ft/s", "fps", "Feet per second", UN_SC_FT, 0.0, B_UNIT_DEF_NONE}, /* base unit */
{"mile per hour", "miles per hour", "mph", NULL, "Miles per hour", UN_SC_MI / 3600.0f, 0.0, B_UNIT_DEF_SUPPRESS},
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buImperialVelCollection = {buImperialVelDef, 0, 0, sizeof(buImperialVelDef) / sizeof(bUnitDef)};
+static struct bUnitCollection buImperialVelCollection = {buImperialVelDef, 0, 0, UNIT_COLLECTION_LENGTH(buImperialVelDef)};
/* Acceleration */
static struct bUnitDef buMetricAclDef[] = {
{"meter per second squared", "meters per second squared", "m/s²", "m/s2", "Meters per second squared", UN_SC_M, 0.0, B_UNIT_DEF_NONE}, /* base unit */
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buMetricAclCollection = {buMetricAclDef, 0, 0, sizeof(buMetricAclDef) / sizeof(bUnitDef)};
+static struct bUnitCollection buMetricAclCollection = {buMetricAclDef, 0, 0, UNIT_COLLECTION_LENGTH(buMetricAclDef)};
static struct bUnitDef buImperialAclDef[] = {
{"foot per second squared", "feet per second squared", "ft/s²", "ft/s2", "Feet per second squared", UN_SC_FT, 0.0, B_UNIT_DEF_NONE}, /* base unit */
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buImperialAclCollection = {buImperialAclDef, 0, 0, sizeof(buImperialAclDef) / sizeof(bUnitDef)};
+static struct bUnitCollection buImperialAclCollection = {buImperialAclDef, 0, 0, UNIT_COLLECTION_LENGTH(buImperialAclDef)};
/* Time */
static struct bUnitDef buNaturalTimeDef[] = {
@@ -262,7 +266,7 @@ static struct bUnitDef buNaturalTimeDef[] = {
{"microsecond", "microseconds", "µs", "us", "Microseconds", 0.000001, 0.0, B_UNIT_DEF_NONE},
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buNaturalTimeCollection = {buNaturalTimeDef, 3, 0, sizeof(buNaturalTimeDef) / sizeof(bUnitDef)};
+static struct bUnitCollection buNaturalTimeCollection = {buNaturalTimeDef, 3, 0, UNIT_COLLECTION_LENGTH(buNaturalTimeDef)};
static struct bUnitDef buNaturalRotDef[] = {
@@ -274,7 +278,7 @@ static struct bUnitDef buNaturalRotDef[] = {
// {"turn", "turns", "t", NULL, "Turns", 1.0 / (M_PI * 2.0), 0.0, B_UNIT_DEF_NONE},
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buNaturalRotCollection = {buNaturalRotDef, 0, 0, sizeof(buNaturalRotDef) / sizeof(bUnitDef)};
+static struct bUnitCollection buNaturalRotCollection = {buNaturalRotDef, 0, 0, UNIT_COLLECTION_LENGTH(buNaturalRotDef)};
/* Camera Lengths */
static struct bUnitDef buCameraLenDef[] = {
@@ -285,7 +289,7 @@ static struct bUnitDef buCameraLenDef[] = {
{"micrometer", "micrometers", "µm", "um", "Micrometers", UN_SC_MM, 0.0, B_UNIT_DEF_SUPPRESS},
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buCameraLenCollection = {buCameraLenDef, 3, 0, sizeof(buCameraLenDef) / sizeof(bUnitDef)};
+static struct bUnitCollection buCameraLenCollection = {buCameraLenDef, 3, 0, UNIT_COLLECTION_LENGTH(buCameraLenDef)};
#define UNIT_SYSTEM_TOT (((sizeof(bUnitSystems) / B_UNIT_TYPE_TOT) / sizeof(void *)) - 1)
@@ -321,7 +325,7 @@ static const bUnitDef *unit_best_fit(
if (suppress && (unit->flag & B_UNIT_DEF_SUPPRESS))
continue;
- /* scale down scalar so 1cm doesnt convert to 10mm because of float error */
+ /* scale down scalar so 1cm doesn't convert to 10mm because of float error */
if (UNLIKELY(unit->flag & B_UNIT_DEF_TENTH)) {
if (value_abs >= unit->scalar * (0.1 - EPS)) {
return unit;
@@ -341,9 +345,12 @@ static const bUnitDef *unit_best_fit(
static void unit_dual_convert(
double value, const bUnitCollection *usys,
bUnitDef const **r_unit_a, bUnitDef const **r_unit_b,
- double *r_value_a, double *r_value_b)
+ double *r_value_a, double *r_value_b,
+ const bUnitDef *main_unit)
{
- const bUnitDef *unit = unit_best_fit(value, usys, NULL, 1);
+ const bUnitDef *unit;
+ if (main_unit) unit = main_unit;
+ else unit = unit_best_fit(value, usys, NULL, 1);
*r_value_a = (value < 0.0 ? ceil : floor)(value / unit->scalar) * unit->scalar;
*r_value_b = value - (*r_value_a);
@@ -405,20 +412,9 @@ static size_t unit_as_string(char *str, int len_max, double value, int prec, con
while (unit->name_short[j] && (i < len_max)) {
str[i++] = unit->name_short[j++];
}
-#if 0
- if (pad) {
- /* this loop only runs if so many zeros were removed that
- * the unit name only used padded chars,
- * In that case add padding for the name. */
-
- while (i <= len + j && (i < len_max)) {
- str[i++] = pad;
- }
- }
-#endif
}
- /* terminate no matter whats done with padding above */
+ /* terminate no matter what's done with padding above */
if (i >= len_max)
i = len_max - 1;
@@ -426,43 +422,135 @@ static size_t unit_as_string(char *str, int len_max, double value, int prec, con
return i;
}
-/* Used for drawing number buttons, try keep fast.
- * Return the length of the generated string.
- */
-size_t bUnit_AsString(char *str, int len_max, double value, int prec, int system, int type, bool split, bool pad)
+static bool unit_should_be_split(int type)
{
- const bUnitCollection *usys = unit_get_system(system, type);
+ return ELEM(type, B_UNIT_LENGTH, B_UNIT_MASS, B_UNIT_TIME, B_UNIT_CAMERA);
+}
- if (usys == NULL || usys->units[0].name == NULL)
- usys = &buDummyCollection;
+typedef struct {
+ int system;
+ int rotation;
+ /* USER_UNIT_ADAPTIVE means none, otherwise the value is the index in the collection */
+ int length;
+ int mass;
+ int time;
+} PreferredUnits;
- /* split output makes sense only for length, mass and time */
- if (split && (type == B_UNIT_LENGTH || type == B_UNIT_MASS || type == B_UNIT_TIME || type == B_UNIT_CAMERA)) {
- const bUnitDef *unit_a, *unit_b;
- double value_a, value_b;
+static PreferredUnits preferred_units_from_UnitSettings(const UnitSettings *settings)
+{
+ PreferredUnits units = { 0 };
+ units.system = settings->system;
+ units.rotation = settings->system_rotation;
+ units.length = settings->length_unit;
+ units.mass = settings->mass_unit;
+ units.time = settings->time_unit;
+ return units;
+}
- unit_dual_convert(value, usys, &unit_a, &unit_b, &value_a, &value_b);
+static size_t unit_as_string_splitted(
+ char *str, int len_max, double value, int prec,
+ const bUnitCollection *usys, const bUnitDef *main_unit)
+{
+ const bUnitDef *unit_a, *unit_b;
+ double value_a, value_b;
- /* check the 2 is a smaller unit */
- if (unit_b > unit_a) {
- size_t i;
- i = unit_as_string(str, len_max, value_a, prec, usys, unit_a, '\0');
+ unit_dual_convert(value, usys, &unit_a, &unit_b, &value_a, &value_b, main_unit);
- prec -= integer_digits_d(value_a / unit_b->scalar) - integer_digits_d(value_b / unit_b->scalar);
- prec = max_ii(prec, 0);
+ /* check the 2 is a smaller unit */
+ if (unit_b > unit_a) {
+ size_t i;
+ i = unit_as_string(str, len_max, value_a, prec, usys, unit_a, '\0');
- /* is there enough space for at least 1 char of the next unit? */
- if (i + 2 < len_max) {
- str[i++] = ' ';
+ prec -= integer_digits_d(value_a / unit_b->scalar) - integer_digits_d(value_b / unit_b->scalar);
+ prec = max_ii(prec, 0);
- /* use low precision since this is a smaller unit */
- i += unit_as_string(str + i, len_max - i, value_b, prec, usys, unit_b, '\0');
- }
- return i;
+ /* is there enough space for at least 1 char of the next unit? */
+ if (i + 2 < len_max) {
+ str[i++] = ' ';
+
+ /* use low precision since this is a smaller unit */
+ i += unit_as_string(str + i, len_max - i, value_b, prec, usys, unit_b, '\0');
}
+ return i;
+ }
+
+ return -1;
+}
+
+static bool is_valid_unit_collection(const bUnitCollection *usys)
+{
+ return usys != NULL && usys->units[0].name != NULL;
+}
+
+static const bUnitDef *get_preferred_unit_if_used(int type, PreferredUnits units)
+{
+ const bUnitCollection *usys = unit_get_system(units.system, type);
+ if (!is_valid_unit_collection(usys)) return NULL;
+
+ int max_offset = usys->length - 1;
+
+ switch (type) {
+ case B_UNIT_LENGTH:
+ case B_UNIT_AREA:
+ case B_UNIT_VOLUME:
+ if (units.length == USER_UNIT_ADAPTIVE) return NULL;
+ return usys->units + MIN2(units.length, max_offset);
+ case B_UNIT_MASS:
+ if (units.mass == USER_UNIT_ADAPTIVE) return NULL;
+ return usys->units + MIN2(units.mass, max_offset);
+ case B_UNIT_TIME:
+ if (units.time == USER_UNIT_ADAPTIVE) return NULL;
+ return usys->units + MIN2(units.time, max_offset);
+ case B_UNIT_ROTATION:
+ if (units.rotation == 0) return usys->units + 0;
+ else if (units.rotation == USER_UNIT_ROT_RADIANS) return usys->units + 3;
+ break;
+ default:
+ break;
+ }
+ return NULL;
+}
+
+/* Return the length of the generated string. */
+static size_t unit_as_string_main(
+ char *str, int len_max, double value, int prec,
+ int type, bool split, bool pad, PreferredUnits units)
+{
+ const bUnitCollection *usys = unit_get_system(units.system, type);
+ const bUnitDef *main_unit = NULL;
+
+ if (!is_valid_unit_collection(usys)) {
+ usys = &buDummyCollection;
+ }
+ else {
+ main_unit = get_preferred_unit_if_used(type, units);
}
- return unit_as_string(str, len_max, value, prec, usys, NULL, pad ? ' ' : '\0');
+ if (split && unit_should_be_split(type)) {
+ int length = unit_as_string_splitted(str, len_max, value, prec, usys, main_unit);
+ /* failed when length is negative, fallback to no split */
+ if (length >= 0) return length;
+ }
+
+ return unit_as_string(str, len_max, value, prec, usys, main_unit, pad ? ' ' : '\0');
+}
+
+size_t bUnit_AsString(char *str, int len_max, double value, int prec, int system, int type, bool split, bool pad)
+{
+ PreferredUnits units;
+ units.system = system;
+ units.rotation = 0;
+ units.length = USER_UNIT_ADAPTIVE;
+ units.mass = USER_UNIT_ADAPTIVE;
+ units.time = USER_UNIT_ADAPTIVE;
+ return unit_as_string_main(str, len_max, value, prec, type, split, pad, units);
+}
+
+size_t bUnit_AsString2(char *str, int len_max, double value, int prec, int type, const UnitSettings *settings, bool pad)
+{
+ bool do_split = (settings->flag & USER_UNIT_OPT_SPLIT) != 0;
+ PreferredUnits units = preferred_units_from_UnitSettings(settings);
+ return unit_as_string_main(str, len_max, value, prec, type, do_split, pad, units);
}
BLI_INLINE bool isalpha_or_utf8(const int ch)
@@ -631,6 +719,27 @@ static const bUnitDef *unit_detect_from_str(const bUnitCollection *usys, const c
return unit;
}
+bool bUnit_ContainsUnit(const char *str, int system, int type)
+{
+ const bUnitCollection *usys = unit_get_system(system, type);
+ if (!is_valid_unit_collection(usys)) return false;
+
+ for (int i = 0; i < usys->length; i++) {
+ if (unit_find(str, usys->units + i)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+double bUnit_PreferredUnitScalar(const struct UnitSettings *settings, int type)
+{
+ PreferredUnits units = preferred_units_from_UnitSettings(settings);
+ const bUnitDef *unit = get_preferred_unit_if_used(type, units);
+ if (unit == NULL) return 1.0;
+ else return unit->scalar;
+}
+
/* make a copy of the string that replaces the units with numbers
* this is used before parsing
* This is only used when evaluating user input and can afford to be a bit slower
@@ -649,16 +758,13 @@ static const bUnitDef *unit_detect_from_str(const bUnitCollection *usys, const c
bool bUnit_ReplaceString(char *str, int len_max, const char *str_prev, double scale_pref, int system, int type)
{
const bUnitCollection *usys = unit_get_system(system, type);
+ if (!is_valid_unit_collection(usys)) return false;
const bUnitDef *unit = NULL, *default_unit;
double scale_pref_base = scale_pref;
char str_tmp[TEMP_STR_SIZE];
bool changed = false;
- if (usys == NULL || usys->units[0].name == NULL) {
- return changed;
- }
-
/* make lowercase */
BLI_str_tolower_ascii(str, len_max);
@@ -824,6 +930,11 @@ int bUnit_GetBaseUnit(const void *usys_pt)
return ((bUnitCollection *)usys_pt)->base_unit;
}
+int bUnit_GetBaseUnitOfType(int system, int type)
+{
+ return unit_get_system(system, type)->base_unit;
+}
+
const char *bUnit_GetName(const void *usys_pt, int index)
{
return ((bUnitCollection *)usys_pt)->units[index].name;
@@ -837,3 +948,8 @@ double bUnit_GetScaler(const void *usys_pt, int index)
{
return ((bUnitCollection *)usys_pt)->units[index].scalar;
}
+
+bool bUnit_IsSuppressed(const void *usys_pt, int index)
+{
+ return (((bUnitCollection *)usys_pt)->units[index].flag & B_UNIT_DEF_SUPPRESS) != 0;
+}
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index a5e93c8d765..0b1f9d8bd24 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -161,17 +161,9 @@ void BKE_workspace_free(WorkSpace *workspace)
BLI_freelistN(&workspace->owner_ids);
BLI_freelistN(&workspace->layouts);
- for (bToolRef *tref = workspace->tools.first, *tref_next; tref; tref = tref_next) {
- tref_next = tref->next;
- if (tref->runtime) {
- MEM_freeN(tref->runtime);
- }
- if (tref->properties) {
- IDP_FreeProperty(tref->properties);
- MEM_freeN(tref->properties);
- }
+ while (!BLI_listbase_is_empty(&workspace->tools)) {
+ BKE_workspace_tool_remove(workspace, workspace->tools.first);
}
- BLI_freelistN(&workspace->tools);
if (workspace->status_text) {
MEM_freeN(workspace->status_text);
@@ -243,6 +235,7 @@ WorkSpaceLayout *BKE_workspace_layout_add(
UNUSED_VARS(bmain);
#endif
layout->screen = screen;
+ id_us_plus(&layout->screen->id);
workspace_layout_name_set(workspace, layout, name);
BLI_addtail(&workspace->layouts, layout);
@@ -253,7 +246,8 @@ void BKE_workspace_layout_remove(
Main *bmain,
WorkSpace *workspace, WorkSpaceLayout *layout)
{
- BKE_libblock_free(bmain, BKE_workspace_layout_screen_get(layout));
+ id_us_min(&layout->screen->id);
+ BKE_libblock_free(bmain, layout->screen);
BLI_freelinkN(&workspace->layouts, layout);
}
@@ -350,6 +344,19 @@ WorkSpaceLayout *BKE_workspace_layout_iter_circular(
return NULL;
}
+void BKE_workspace_tool_remove(
+ struct WorkSpace *workspace, struct bToolRef *tref)
+{
+ if (tref->runtime) {
+ MEM_freeN(tref->runtime);
+ }
+ if (tref->properties) {
+ IDP_FreeProperty(tref->properties);
+ MEM_freeN(tref->properties);
+ }
+ BLI_remlink(&workspace->tools, tref);
+ MEM_freeN(tref);
+}
/* -------------------------------------------------------------------- */
/* Getters/Setters */
diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c
index a5a38a6dc12..110b933e67c 100644
--- a/source/blender/blenkernel/intern/world.c
+++ b/source/blender/blenkernel/intern/world.c
@@ -168,3 +168,9 @@ void BKE_world_make_local(Main *bmain, World *wrld, const bool lib_local)
{
BKE_id_make_local_generic(bmain, &wrld->id, true, lib_local);
}
+
+void BKE_world_eval(struct Depsgraph *depsgraph, World *world)
+{
+ DEG_debug_print_eval(depsgraph, __func__, world->id.name, world);
+ GPU_material_free(&world->gpumaterial);
+}
diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c
index 1db239b3c6f..a1732b79ea3 100644
--- a/source/blender/blenkernel/intern/writeavi.c
+++ b/source/blender/blenkernel/intern/writeavi.c
@@ -43,6 +43,7 @@
#include "BLI_utildefines.h"
#include "BKE_global.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_report.h"
diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c
index fce11506b8c..d27b485bc28 100644
--- a/source/blender/blenkernel/intern/writeffmpeg.c
+++ b/source/blender/blenkernel/intern/writeffmpeg.c
@@ -54,6 +54,7 @@
#include "BKE_global.h"
#include "BKE_idprop.h"
#include "BKE_image.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_sound.h"
@@ -607,14 +608,6 @@ static AVStream *alloc_video_stream(FFMpegContext *context, RenderData *rd, int
}
}
-#if 0
- /* this options are not set in ffmpeg.c and leads to artifacts with MPEG-4
- * see #33586: Encoding to mpeg4 makes first frame(s) blocky
- */
- c->rc_initial_buffer_occupancy = rd->ffcodecdata.rc_buffer_size * 3 / 4;
- c->rc_buffer_aggressivity = 1.0;
-#endif
-
/* Deprecated and not doing anything since July 2015, deleted in recent ffmpeg */
//c->me_method = ME_EPZS;
@@ -670,14 +663,7 @@ static AVStream *alloc_video_stream(FFMpegContext *context, RenderData *rd, int
}
}
- if ((of->oformat->flags & AVFMT_GLOBALHEADER)
-#if 0
- || STREQ(of->oformat->name, "mp4")
- || STREQ(of->oformat->name, "mov")
- || STREQ(of->oformat->name, "3gp")
-#endif
- )
- {
+ if ((of->oformat->flags & AVFMT_GLOBALHEADER)) {
PRINT("Using global header\n");
c->flags |= CODEC_FLAG_GLOBAL_HEADER;
}
@@ -725,6 +711,26 @@ static AVStream *alloc_audio_stream(FFMpegContext *context, RenderData *rd, int
c->sample_fmt = AV_SAMPLE_FMT_S16;
c->channels = rd->ffcodecdata.audio_channels;
+#ifdef FFMPEG_HAVE_FRAME_CHANNEL_LAYOUT
+ switch (rd->ffcodecdata.audio_channels) {
+ case FFM_CHANNELS_MONO:
+ c->channel_layout = AV_CH_LAYOUT_MONO;
+ break;
+ case FFM_CHANNELS_STEREO:
+ c->channel_layout = AV_CH_LAYOUT_STEREO;
+ break;
+ case FFM_CHANNELS_SURROUND4:
+ c->channel_layout = AV_CH_LAYOUT_QUAD;
+ break;
+ case FFM_CHANNELS_SURROUND51:
+ c->channel_layout = AV_CH_LAYOUT_5POINT1_BACK;
+ break;
+ case FFM_CHANNELS_SURROUND71:
+ c->channel_layout = AV_CH_LAYOUT_7POINT1;
+ break;
+ }
+#endif
+
if (request_float_audio_buffer(codec_id)) {
/* mainly for AAC codec which is experimental */
c->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
@@ -1275,12 +1281,6 @@ static void end_ffmpeg_impl(FFMpegContext *context, int is_autosplit)
{
PRINT("Closing ffmpeg...\n");
-#if 0
- if (context->audio_stream) { /* SEE UPPER */
- write_audio_frames(context);
- }
-#endif
-
#ifdef WITH_AUDASPACE
if (is_autosplit == false) {
if (context->audio_mixdown_device) {
diff --git a/source/blender/blenkernel/nla_private.h b/source/blender/blenkernel/nla_private.h
index 87f4e37e86d..67728445f3a 100644
--- a/source/blender/blenkernel/nla_private.h
+++ b/source/blender/blenkernel/nla_private.h
@@ -35,6 +35,8 @@
struct Depsgraph;
+#include "RNA_types.h"
+
/* --------------- NLA Evaluation DataTypes ----------------------- */
/* used for list of strips to accumulate at current time */
@@ -68,9 +70,11 @@ enum eNlaEvalStrip_StripMode {
typedef struct NlaEvalChannel {
struct NlaEvalChannel *next, *prev;
- PointerRNA ptr; /* pointer to struct containing property to use */
- PropertyRNA *prop; /* RNA-property type to use (should be in the struct given) */
- int index; /* array index (where applicable) */
+ /* RNA reference to use with pointer and index */
+ PathResolvedRNA rna;
+
+ /* Original parameters used to look up the reference for write_orig_anim_rna */
+ const char *rna_path;
float value; /* value of this channel */
} NlaEvalChannel;
@@ -85,6 +89,6 @@ float nlastrip_get_frame(NlaStrip *strip, float cframe, short mode);
NlaEvalStrip *nlastrips_ctime_get_strip(struct Depsgraph *depsgraph, ListBase *list, ListBase *strips, short index, float ctime);
void nlastrip_evaluate(struct Depsgraph *depsgraph, PointerRNA *ptr, ListBase *channels, ListBase *modifiers, NlaEvalStrip *nes);
-void nladata_flush_channels(ListBase *channels);
+void nladata_flush_channels(struct Depsgraph *depsgraph, PointerRNA *ptr, ListBase *channels);
#endif /* __NLA_PRIVATE_H__ */
diff --git a/source/blender/blenlib/BLI_bitmap.h b/source/blender/blenlib/BLI_bitmap.h
index 03390a0dbcd..8e873c76dc9 100644
--- a/source/blender/blenlib/BLI_bitmap.h
+++ b/source/blender/blenlib/BLI_bitmap.h
@@ -49,8 +49,7 @@ typedef unsigned int BLI_bitmap;
#define BLI_BITMAP_SIZE(_tot) \
((size_t)(_BITMAP_NUM_BLOCKS(_tot)) * sizeof(BLI_bitmap))
-/* allocate memory for a bitmap with '_tot' bits; free
- * with MEM_freeN() */
+/* allocate memory for a bitmap with '_tot' bits; free with MEM_freeN() */
#define BLI_BITMAP_NEW(_tot, _alloc_string) \
((BLI_bitmap *)MEM_callocN(BLI_BITMAP_SIZE(_tot), \
_alloc_string))
diff --git a/source/blender/blenlib/BLI_expr_pylike_eval.h b/source/blender/blenlib/BLI_expr_pylike_eval.h
new file mode 100644
index 00000000000..578e4776038
--- /dev/null
+++ b/source/blender/blenlib/BLI_expr_pylike_eval.h
@@ -0,0 +1,66 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2018 Blender Foundation, Alexander Gavrilov
+ * All rights reserved.
+ *
+ * Contributor(s): Alexander Gavrilov
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __BLI_EXPR_PYLIKE_EVAL_H__
+#define __BLI_EXPR_PYLIKE_EVAL_H__
+
+/** \file BLI_expr_pylike_eval.h
+ * \ingroup bli
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Opaque structure containing pre-parsed data for evaluation. */
+typedef struct ExprPyLike_Parsed ExprPyLike_Parsed;
+
+/** Expression evaluation return code. */
+typedef enum eExprPyLike_EvalStatus {
+ EXPR_PYLIKE_SUCCESS = 0,
+ /* Computation errors; result is still set, but may be NaN */
+ EXPR_PYLIKE_DIV_BY_ZERO,
+ EXPR_PYLIKE_MATH_ERROR,
+ /* Expression dependent errors or bugs; result is 0 */
+ EXPR_PYLIKE_INVALID,
+ EXPR_PYLIKE_FATAL_ERROR,
+} eExprPyLike_EvalStatus;
+
+void BLI_expr_pylike_free(struct ExprPyLike_Parsed *expr);
+bool BLI_expr_pylike_is_valid(struct ExprPyLike_Parsed *expr);
+bool BLI_expr_pylike_is_constant(struct ExprPyLike_Parsed *expr);
+ExprPyLike_Parsed *BLI_expr_pylike_parse(
+ const char *expression,
+ const char **param_names, int param_names_len);
+eExprPyLike_EvalStatus BLI_expr_pylike_eval(
+ struct ExprPyLike_Parsed *expr,
+ const double *param_values, int param_values_len,
+ double *r_result);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __BLI_EXPR_PYLIKE_EVAL_H__ */
diff --git a/source/blender/blenlib/BLI_heap.h b/source/blender/blenlib/BLI_heap.h
index 5c803f82ebe..bcce5f85fa0 100644
--- a/source/blender/blenlib/BLI_heap.h
+++ b/source/blender/blenlib/BLI_heap.h
@@ -43,6 +43,7 @@ void BLI_heap_remove(Heap *heap, HeapNode *node) ATTR_NONNULL(1, 2);
bool BLI_heap_is_empty(const Heap *heap) ATTR_NONNULL(1);
unsigned int BLI_heap_len(const Heap *heap) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
HeapNode *BLI_heap_top(const Heap *heap) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
+float BLI_heap_top_value(const Heap *heap) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
void *BLI_heap_pop_min(Heap *heap) ATTR_NONNULL(1);
void BLI_heap_node_value_update(Heap *heap, HeapNode *node, float value) ATTR_NONNULL(1, 2);
void BLI_heap_node_value_update_ptr(Heap *heap, HeapNode *node, float value, void *ptr) ATTR_NONNULL(1, 2);
diff --git a/source/blender/blenlib/BLI_heap_simple.h b/source/blender/blenlib/BLI_heap_simple.h
new file mode 100644
index 00000000000..eed33558d84
--- /dev/null
+++ b/source/blender/blenlib/BLI_heap_simple.h
@@ -0,0 +1,44 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __BLI_HEAP_SIMPLE_H__
+#define __BLI_HEAP_SIMPLE_H__
+
+/** \file BLI_heap_simple.h
+ * \ingroup bli
+ * \brief A min-heap / priority queue ADT
+ */
+
+struct HeapSimple;
+typedef struct HeapSimple HeapSimple;
+
+typedef void (*HeapSimpleFreeFP)(void *ptr);
+
+HeapSimple *BLI_heapsimple_new_ex(unsigned int tot_reserve) ATTR_WARN_UNUSED_RESULT;
+HeapSimple *BLI_heapsimple_new(void) ATTR_WARN_UNUSED_RESULT;
+void BLI_heapsimple_clear(HeapSimple *heap, HeapSimpleFreeFP ptrfreefp) ATTR_NONNULL(1);
+void BLI_heapsimple_free(HeapSimple *heap, HeapSimpleFreeFP ptrfreefp) ATTR_NONNULL(1);
+void BLI_heapsimple_insert(HeapSimple *heap, float value, void *ptr) ATTR_NONNULL(1);
+bool BLI_heapsimple_is_empty(const HeapSimple *heap) ATTR_NONNULL(1);
+uint BLI_heapsimple_len(const HeapSimple *heap) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
+float BLI_heapsimple_top_value(const HeapSimple *heap) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
+void *BLI_heapsimple_pop_min(HeapSimple *heap) ATTR_NONNULL(1);
+
+#endif /* __BLI_HEAP_SIMPLE_H__ */
diff --git a/source/blender/blenlib/BLI_kdopbvh.h b/source/blender/blenlib/BLI_kdopbvh.h
index e7cbe05d713..e4203a01b17 100644
--- a/source/blender/blenlib/BLI_kdopbvh.h
+++ b/source/blender/blenlib/BLI_kdopbvh.h
@@ -85,6 +85,10 @@ typedef struct BVHTreeRayHit {
} BVHTreeRayHit;
enum {
+ /* Use a priority queue to process nodes in the optimal order (for slow callbacks) */
+ BVH_NEAREST_OPTIMAL_ORDER = (1 << 0),
+};
+enum {
/* calculate IsectRayPrecalc data */
BVH_RAYCAST_WATERTIGHT = (1 << 0),
};
@@ -144,6 +148,10 @@ float BLI_bvhtree_get_epsilon(const BVHTree *tree);
/* find nearest node to the given coordinates
* (if nearest is given it will only search nodes where square distance is smaller than nearest->dist) */
+int BLI_bvhtree_find_nearest_ex(
+ BVHTree *tree, const float co[3], BVHTreeNearest *nearest,
+ BVHTree_NearestPointCallback callback, void *userdata,
+ int flag);
int BLI_bvhtree_find_nearest(
BVHTree *tree, const float co[3], BVHTreeNearest *nearest,
BVHTree_NearestPointCallback callback, void *userdata);
diff --git a/source/blender/blenlib/BLI_link_utils.h b/source/blender/blenlib/BLI_link_utils.h
index 5322547ac08..7a1a13a6b31 100644
--- a/source/blender/blenlib/BLI_link_utils.h
+++ b/source/blender/blenlib/BLI_link_utils.h
@@ -47,6 +47,15 @@
(list)->last = link; \
} (void)0
+/* Use for inserting after a certain element. */
+#define BLI_LINKS_INSERT_AFTER(list, node, link) { \
+ if ((node)->next == NULL) { \
+ (list)->last = link; \
+ } \
+ (link)->next = (node)->next; \
+ (node)->next = link; \
+} (void)0
+
#define BLI_LINKS_FREE(list) { \
while (list) { \
void *next = list->next; \
diff --git a/source/blender/blenlib/BLI_listbase.h b/source/blender/blenlib/BLI_listbase.h
index c4ad5acfe4b..34e7a1fa212 100644
--- a/source/blender/blenlib/BLI_listbase.h
+++ b/source/blender/blenlib/BLI_listbase.h
@@ -82,6 +82,7 @@ void BLI_listbase_swaplinks(struct ListBase *listbase, void *vlinka, void *vlink
void BLI_listbases_swaplinks(struct ListBase *listbasea, struct ListBase *listbaseb, void *vlinka, void *vlinkb) ATTR_NONNULL(2, 3);
void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src) ATTR_NONNULL(1, 2);
+void BLI_movelisttolist_reverse(struct ListBase *dst, struct ListBase *src) ATTR_NONNULL(1, 2);
void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src) ATTR_NONNULL(1, 2);
void BLI_listbase_reverse(struct ListBase *lb) ATTR_NONNULL(1);
void BLI_listbase_rotate_first(struct ListBase *lb, void *vlink) ATTR_NONNULL(1, 2);
diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h
index a2df32360fe..cc3490fe5ef 100644
--- a/source/blender/blenlib/BLI_math_geom.h
+++ b/source/blender/blenlib/BLI_math_geom.h
@@ -208,6 +208,11 @@ void limit_dist_v3(float v1[3], float v2[3], const float dist);
#define ISECT_LINE_LINE_CROSS 2
int isect_seg_seg_v2(const float a1[2], const float a2[2], const float b1[2], const float b2[2]);
+void isect_seg_seg_v3(
+ const float a0[3], const float a1[3],
+ const float b0[3], const float b1[3],
+ float r_a[3], float r_b[3]);
+
int isect_seg_seg_v2_int(const int a1[2], const int a2[2], const int b1[2], const int b2[2]);
int isect_seg_seg_v2_point_ex(
const float v0[2], const float v1[2], const float v2[2], const float v3[2], const float endpoint_bias,
@@ -374,6 +379,8 @@ bool clip_segment_v3_plane_n(
const float p1[3], const float p2[3], const float plane_array[][4], const int plane_tot,
float r_p1[3], float r_p2[3]);
+bool point_in_slice_seg(float p[3], float l1[3], float l2[3]);
+
/****************************** Interpolation ********************************/
void interp_weights_tri_v3(float w[3], const float a[3], const float b[3], const float c[3], const float p[3]);
void interp_weights_quad_v3(float w[4], const float a[3], const float b[3], const float c[3], const float d[3], const float p[3]);
diff --git a/source/blender/blenlib/BLI_math_solvers.h b/source/blender/blenlib/BLI_math_solvers.h
index 3c1cb90937d..845d2100133 100644
--- a/source/blender/blenlib/BLI_math_solvers.h
+++ b/source/blender/blenlib/BLI_math_solvers.h
@@ -53,12 +53,14 @@ void BLI_svd_m3(const float m3[3][3], float r_U[3][3], float r_S[], float r_V[3]
bool BLI_tridiagonal_solve(const float *a, const float *b, const float *c, const float *d, float *r_x, const int count);
bool BLI_tridiagonal_solve_cyclic(const float *a, const float *b, const float *c, const float *d, float *r_x, const int count);
-/**************************** Inline Definitions ******************************/
-#if 0 /* None so far. */
-# if BLI_MATH_DO_INLINE
-# include "intern/math_geom_inline.c"
-# endif
-#endif
+/* Generic 3 variable Newton's method solver. */
+typedef void (*Newton3D_DeltaFunc)(void *userdata, const float x[3], float r_delta[3]);
+typedef void (*Newton3D_JacobianFunc)(void *userdata, const float x[3], float r_jacobian[3][3]);
+typedef bool (*Newton3D_CorrectionFunc)(void *userdata, const float x[3], float step[3], float x_next[3]);
+
+bool BLI_newton3d_solve(
+ Newton3D_DeltaFunc func_delta, Newton3D_JacobianFunc func_jacobian, Newton3D_CorrectionFunc func_correction, void *userdata,
+ float epsilon, int max_iterations, bool trace, const float x_init[3], float result[3]);
#ifdef BLI_MATH_GCC_WARN_PRAGMA
# pragma GCC diagnostic pop
diff --git a/source/blender/blenlib/BLI_math_statistics.h b/source/blender/blenlib/BLI_math_statistics.h
index 210d41bcf59..40641c05e08 100644
--- a/source/blender/blenlib/BLI_math_statistics.h
+++ b/source/blender/blenlib/BLI_math_statistics.h
@@ -51,12 +51,6 @@ void BLI_covariance_m3_v3n(
const float (*cos_v3)[3], const int nbr_cos_v3, const bool use_sample_correction,
float r_covmat[3][3], float r_center[3]);
-/**************************** Inline Definitions ******************************/
-#if 0 /* None so far. */
-# if BLI_MATH_DO_INLINE
-# include "intern/math_geom_inline.c"
-# endif
-#endif
#ifdef BLI_MATH_GCC_WARN_PRAGMA
# pragma GCC diagnostic pop
diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h
index 0a9258f47ac..9613847f28f 100644
--- a/source/blender/blenlib/BLI_math_vector.h
+++ b/source/blender/blenlib/BLI_math_vector.h
@@ -120,9 +120,11 @@ MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f);
MINLINE void mul_v3_fl(float r[3], float f);
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f);
MINLINE void mul_v2_v2(float r[2], const float a[2]);
+MINLINE void mul_v2_v2v2(float r[2], const float a[2], const float b[2]);
MINLINE void mul_v3_v3(float r[3], const float a[3]);
MINLINE void mul_v3_v3v3(float r[3], const float a[3], const float b[3]);
MINLINE void mul_v4_fl(float r[4], float f);
+MINLINE void mul_v4_v4(float r[4], const float a[4]);
MINLINE void mul_v4_v4fl(float r[3], const float a[3], float f);
MINLINE void mul_v2_v2_cw(float r[2], const float mat[2], const float vec[2]);
MINLINE void mul_v2_v2_ccw(float r[2], const float mat[2], const float vec[2]);
@@ -275,6 +277,7 @@ MINLINE bool compare_v4v4_relative(const float a[4], const float b[4], const flo
MINLINE bool compare_len_v3v3(const float a[3], const float b[3], const float limit) ATTR_WARN_UNUSED_RESULT;
MINLINE bool compare_len_squared_v3v3(const float a[3], const float b[3], const float limit) ATTR_WARN_UNUSED_RESULT;
+MINLINE bool compare_len_squared_v4v4(const float a[4], const float b[4], const float limit) ATTR_WARN_UNUSED_RESULT;
MINLINE float line_point_side_v2(const float l1[2], const float l2[2], const float pt[2]) ATTR_WARN_UNUSED_RESULT;
diff --git a/source/blender/blenlib/BLI_path_util.h b/source/blender/blenlib/BLI_path_util.h
index b4329bf81ac..dcfb2c9cbc9 100644
--- a/source/blender/blenlib/BLI_path_util.h
+++ b/source/blender/blenlib/BLI_path_util.h
@@ -41,6 +41,7 @@ struct ListBase;
void BLI_setenv(const char *env, const char *val) ATTR_NONNULL(1);
void BLI_setenv_if_new(const char *env, const char *val) ATTR_NONNULL(1);
+const char *BLI_getenv(const char *env) ATTR_NONNULL(1);
void BLI_make_file_string(const char *relabase, char *string, const char *dir, const char *file);
void BLI_make_exist(char *dir);
@@ -107,6 +108,8 @@ void BLI_path_rel(char *file, const char *relfile) ATTR_NONNULL();
bool BLI_path_is_rel(const char *path) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
bool BLI_path_is_unc(const char *path);
+void BLI_path_to_display_name(char *display_name, int maxlen, const char *name) ATTR_NONNULL();
+
#if defined(WIN32)
void BLI_cleanup_unc_16(wchar_t *path_16);
void BLI_cleanup_unc(char *path_16, int maxlen);
diff --git a/source/blender/blenlib/BLI_rect.h b/source/blender/blenlib/BLI_rect.h
index 471d875c9af..221d328dd9e 100644
--- a/source/blender/blenlib/BLI_rect.h
+++ b/source/blender/blenlib/BLI_rect.h
@@ -34,7 +34,8 @@
*/
#include "DNA_vec_types.h"
-#include "BLI_utildefines.h"
+#include "BLI_sys_types.h" /* bool */
+#include "BLI_compiler_compat.h"
struct rctf;
struct rcti;
@@ -92,8 +93,8 @@ bool BLI_rcti_isect_segment(const struct rcti *rect, const int s1[2], const int
bool BLI_rctf_isect_segment(const struct rctf *rect, const float s1[2], const float s2[2]);
bool BLI_rcti_isect_circle(const struct rcti *rect, const float xy[2], const float radius);
bool BLI_rctf_isect_circle(const struct rctf *rect, const float xy[2], const float radius);
-bool BLI_rcti_inside_rcti(rcti *rct_a, const rcti *rct_b);
-bool BLI_rctf_inside_rctf(rctf *rct_a, const rctf *rct_b);
+bool BLI_rcti_inside_rcti(const rcti *rct_a, const rcti *rct_b);
+bool BLI_rctf_inside_rctf(const rctf *rct_a, const rctf *rct_b);
void BLI_rcti_union(struct rcti *rcti1, const struct rcti *rcti2);
void BLI_rctf_union(struct rctf *rctf1, const struct rctf *rctf2);
void BLI_rcti_rctf_copy(struct rcti *dst, const struct rctf *src);
diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h
index 286e1cc6dd5..f81bfc2f853 100644
--- a/source/blender/blenlib/BLI_utildefines.h
+++ b/source/blender/blenlib/BLI_utildefines.h
@@ -512,11 +512,11 @@ extern bool BLI_memory_is_zero(const void *arr, const size_t arr_size);
/* Warning-free macros for storing ints in pointers. Use these _only_
* for storing an int in a pointer, not a pointer in an int (64bit)! */
-#define SET_INT_IN_POINTER(i) ((void *)(intptr_t)(i))
-#define GET_INT_FROM_POINTER(i) ((void)0, ((int)(intptr_t)(i)))
+#define POINTER_FROM_INT(i) ((void *)(intptr_t)(i))
+#define POINTER_AS_INT(i) ((void)0, ((int)(intptr_t)(i)))
-#define SET_UINT_IN_POINTER(i) ((void *)(uintptr_t)(i))
-#define GET_UINT_FROM_POINTER(i) ((void)0, ((unsigned int)(uintptr_t)(i)))
+#define POINTER_FROM_UINT(i) ((void *)(uintptr_t)(i))
+#define POINTER_AS_UINT(i) ((void)0, ((unsigned int)(uintptr_t)(i)))
/* Set flag from a single test */
#define SET_FLAG_FROM_TEST(value, test, flag) \
diff --git a/source/blender/blenlib/BLI_vfontdata.h b/source/blender/blenlib/BLI_vfontdata.h
index 1cc1ef17486..892d084f5ee 100644
--- a/source/blender/blenlib/BLI_vfontdata.h
+++ b/source/blender/blenlib/BLI_vfontdata.h
@@ -43,6 +43,9 @@ typedef struct VFontData {
struct GHash *characters;
char name[128];
float scale;
+ /* Calculated from the font. */
+ float em_height;
+ float ascender;
} VFontData;
typedef struct VChar {
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index 9621a759f3c..5e6764a5c0e 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -47,6 +47,7 @@ set(SRC
intern/BLI_ghash.c
intern/BLI_ghash_utils.c
intern/BLI_heap.c
+ intern/BLI_heap_simple.c
intern/BLI_kdopbvh.c
intern/BLI_kdtree.c
intern/BLI_linklist.c
@@ -68,6 +69,7 @@ set(SRC
intern/easing.c
intern/edgehash.c
intern/endian_switch.c
+ intern/expr_pylike_eval.c
intern/fileops.c
intern/fnmatch.c
intern/freetypefont.c
@@ -151,6 +153,7 @@ set(SRC
BLI_edgehash.h
BLI_endian_switch.h
BLI_endian_switch_inline.h
+ BLI_expr_pylike_eval.h
BLI_fileops.h
BLI_fileops_types.h
BLI_fnmatch.h
@@ -161,6 +164,7 @@ set(SRC
BLI_hash_mm2a.h
BLI_hash_mm3.h
BLI_heap.h
+ BLI_heap_simple.h
BLI_iterator.h
BLI_jitter_2d.h
BLI_kdopbvh.h
diff --git a/source/blender/blenlib/intern/BLI_array.c b/source/blender/blenlib/intern/BLI_array.c
index d16dd36763d..0380656a33a 100644
--- a/source/blender/blenlib/intern/BLI_array.c
+++ b/source/blender/blenlib/intern/BLI_array.c
@@ -90,9 +90,4 @@ void _bli_array_grow_func(
}
*arr_p = arr_tmp;
-
- /* caller must do */
-#if 0
- arr_len += num;
-#endif
}
diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c
index ec75c140159..071a7e2dc0e 100644
--- a/source/blender/blenlib/intern/BLI_ghash.c
+++ b/source/blender/blenlib/intern/BLI_ghash.c
@@ -1108,57 +1108,6 @@ void BLI_ghashIterator_free(GHashIterator *ghi)
MEM_freeN(ghi);
}
-/* inline functions now */
-#if 0
-/**
- * Retrieve the key from an iterator.
- *
- * \param ghi The iterator.
- * \return The key at the current index, or NULL if the
- * iterator is done.
- */
-void *BLI_ghashIterator_getKey(GHashIterator *ghi)
-{
- return ghi->curEntry->key;
-}
-
-/**
- * Retrieve the value from an iterator.
- *
- * \param ghi The iterator.
- * \return The value at the current index, or NULL if the
- * iterator is done.
- */
-void *BLI_ghashIterator_getValue(GHashIterator *ghi)
-{
- return ghi->curEntry->val;
-}
-
-/**
- * Retrieve the value from an iterator.
- *
- * \param ghi The iterator.
- * \return The value at the current index, or NULL if the
- * iterator is done.
- */
-void **BLI_ghashIterator_getValue_p(GHashIterator *ghi)
-{
- return &ghi->curEntry->val;
-}
-
-/**
- * Determine if an iterator is done (has reached the end of
- * the hash table).
- *
- * \param ghi The iterator.
- * \return True if done, False otherwise.
- */
-bool BLI_ghashIterator_done(GHashIterator *ghi)
-{
- return ghi->curEntry == NULL;
-}
-#endif
-
/** \} */
/* -------------------------------------------------------------------- */
diff --git a/source/blender/blenlib/intern/BLI_ghash_utils.c b/source/blender/blenlib/intern/BLI_ghash_utils.c
index 6554ee7c92f..a0d9fefe465 100644
--- a/source/blender/blenlib/intern/BLI_ghash_utils.c
+++ b/source/blender/blenlib/intern/BLI_ghash_utils.c
@@ -54,14 +54,16 @@ uint BLI_ghashutil_ptrhash(const void *key)
return (uint)(intptr_t)key;
}
#else
-/* based python3.3's pointer hashing function */
+/* Based Python3.7's pointer hashing function. */
uint BLI_ghashutil_ptrhash(const void *key)
{
size_t y = (size_t)key;
/* bottom 3 or 4 bits are likely to be 0; rotate y by 4 to avoid
* excessive hash collisions for dicts and sets */
- y = (y >> 4) | (y << (8 * sizeof(void *) - 4));
- return (uint)y;
+
+ /* Note: Unlike Python 'sizeof(uint)' is used instead of 'sizeof(void *)',
+ * Otherwise casting to 'uint' ignores the upper bits on 64bit platforms. */
+ return (uint)(y >> 4) | ((uint)y << (8 * sizeof(uint) - 4));
}
#endif
bool BLI_ghashutil_ptrcmp(const void *a, const void *b)
@@ -126,7 +128,7 @@ uint BLI_ghashutil_inthash_p_murmur(const void *ptr)
uint BLI_ghashutil_inthash_p_simple(const void *ptr)
{
- return GET_UINT_FROM_POINTER(ptr);
+ return POINTER_AS_UINT(ptr);
}
bool BLI_ghashutil_intcmp(const void *a, const void *b)
diff --git a/source/blender/blenlib/intern/BLI_heap.c b/source/blender/blenlib/intern/BLI_heap.c
index 5658c1fd103..c785c1ac012 100644
--- a/source/blender/blenlib/intern/BLI_heap.c
+++ b/source/blender/blenlib/intern/BLI_heap.c
@@ -38,9 +38,9 @@
/***/
struct HeapNode {
- void *ptr;
float value;
uint index;
+ void *ptr;
};
struct HeapNode_Chunk {
@@ -87,8 +87,14 @@ struct Heap {
BLI_INLINE void heap_swap(Heap *heap, const uint i, const uint j)
{
-
-#if 0
+#if 1
+ HeapNode **tree = heap->tree;
+ HeapNode *pi = tree[i], *pj = tree[j];
+ pi->index = j;
+ tree[j] = pi;
+ pj->index = i;
+ tree[i] = pj;
+#elif 0
SWAP(uint, heap->tree[i]->index, heap->tree[j]->index);
SWAP(HeapNode *, heap->tree[i], heap->tree[j]);
#else
@@ -105,6 +111,7 @@ BLI_INLINE void heap_swap(Heap *heap, const uint i, const uint j)
static void heap_down(Heap *heap, uint i)
{
/* size won't change in the loop */
+ HeapNode **const tree = heap->tree;
const uint size = heap->size;
while (1) {
@@ -112,14 +119,14 @@ static void heap_down(Heap *heap, uint i)
const uint r = HEAP_RIGHT(i);
uint smallest = i;
- if ((l < size) && HEAP_COMPARE(heap->tree[l], heap->tree[smallest])) {
+ if (LIKELY(l < size) && HEAP_COMPARE(tree[l], tree[smallest])) {
smallest = l;
}
- if ((r < size) && HEAP_COMPARE(heap->tree[r], heap->tree[smallest])) {
+ if (LIKELY(r < size) && HEAP_COMPARE(tree[r], tree[smallest])) {
smallest = r;
}
- if (smallest == i) {
+ if (UNLIKELY(smallest == i)) {
break;
}
@@ -130,10 +137,12 @@ static void heap_down(Heap *heap, uint i)
static void heap_up(Heap *heap, uint i)
{
- while (i > 0) {
+ HeapNode **const tree = heap->tree;
+
+ while (LIKELY(i > 0)) {
const uint p = HEAP_PARENT(i);
- if (HEAP_COMPARE(heap->tree[p], heap->tree[i])) {
+ if (HEAP_COMPARE(tree[p], tree[i])) {
break;
}
heap_swap(heap, p, i);
@@ -318,6 +327,17 @@ HeapNode *BLI_heap_top(const Heap *heap)
}
/**
+ * Return the value of top node of the heap.
+ * This is the node with the lowest value.
+ */
+float BLI_heap_top_value(const Heap *heap)
+{
+ BLI_assert(heap->size != 0);
+
+ return heap->tree[0]->value;
+}
+
+/**
* Pop the top node off the heap and return it's pointer.
*/
void *BLI_heap_pop_min(Heap *heap)
@@ -394,6 +414,9 @@ void *BLI_heap_node_ptr(const HeapNode *node)
static bool heap_is_minheap(const Heap *heap, uint root)
{
if (root < heap->size) {
+ if (heap->tree[root]->index != root) {
+ return false;
+ }
const uint l = HEAP_LEFT(root);
if (l < heap->size) {
if (HEAP_COMPARE(heap->tree[l], heap->tree[root]) || !heap_is_minheap(heap, l)) {
diff --git a/source/blender/blenlib/intern/BLI_heap_simple.c b/source/blender/blenlib/intern/BLI_heap_simple.c
new file mode 100644
index 00000000000..777b9c61b28
--- /dev/null
+++ b/source/blender/blenlib/intern/BLI_heap_simple.c
@@ -0,0 +1,247 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenlib/intern/BLI_heap_simple.c
+ * \ingroup bli
+ *
+ * A min-heap / priority queue ADT.
+ *
+ * Simplified version of the heap that only supports insertion and removal from top.
+ *
+ * See BLI_heap.c for a more full featured heap implementation.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_heap_simple.h"
+#include "BLI_strict_flags.h"
+
+#define HEAP_PARENT(i) (((i) - 1) >> 1)
+
+/* -------------------------------------------------------------------- */
+/** \name HeapSimple Internal Structs
+ * \{ */
+
+typedef struct HeapSimpleNode {
+ float value;
+ void *ptr;
+} HeapSimpleNode;
+
+struct HeapSimple {
+ uint size;
+ uint bufsize;
+ HeapSimpleNode *tree;
+};
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name HeapSimple Internal Functions
+ * \{ */
+
+static void heapsimple_down(HeapSimple *heap, uint start_i, const HeapSimpleNode *init)
+{
+#if 1
+ /* The compiler isn't smart enough to realize that all computations
+ * using index here can be modified to work with byte offset. */
+ uint8_t * const tree_buf = (uint8_t *)heap->tree;
+
+#define OFFSET(i) (i * (uint)sizeof(HeapSimpleNode))
+#define NODE(offset) (*(HeapSimpleNode*)(tree_buf + (offset)))
+#else
+ HeapSimpleNode *const tree = heap->tree;
+
+#define OFFSET(i) (i)
+#define NODE(i) tree[i]
+#endif
+
+#define HEAP_LEFT_OFFSET(i) (((i) << 1) + OFFSET(1))
+
+ const uint size = OFFSET(heap->size);
+
+ /* Pull the active node values into locals. This allows spilling
+ * the data from registers instead of literally swapping nodes. */
+ float active_val = init->value;
+ void *active_ptr = init->ptr;
+
+ /* Prepare the first iteration and spill value. */
+ uint i = OFFSET(start_i);
+
+ NODE(i).value = active_val;
+
+ for (;;) {
+ const uint l = HEAP_LEFT_OFFSET(i);
+ const uint r = l + OFFSET(1); /* right */
+
+ /* Find the child with the smallest value. */
+ uint smallest = i;
+
+ if (LIKELY(l < size) && NODE(l).value < active_val) {
+ smallest = l;
+ }
+ if (LIKELY(r < size) && NODE(r).value < NODE(smallest).value) {
+ smallest = r;
+ }
+
+ if (UNLIKELY(smallest == i)) {
+ break;
+ }
+
+ /* Move the smallest child into the current node.
+ * Skip padding: for some reason that makes it faster here. */
+ NODE(i).value = NODE(smallest).value;
+ NODE(i).ptr = NODE(smallest).ptr;
+
+ /* Proceed to next iteration and spill value. */
+ i = smallest;
+ NODE(i).value = active_val;
+ }
+
+ /* Spill the pointer into the final position of the node. */
+ NODE(i).ptr = active_ptr;
+
+#undef NODE
+#undef OFFSET
+#undef HEAP_LEFT_OFFSET
+}
+
+static void heapsimple_up(HeapSimple *heap, uint i, float active_val, void *active_ptr)
+{
+ HeapSimpleNode *const tree = heap->tree;
+
+ while (LIKELY(i > 0)) {
+ const uint p = HEAP_PARENT(i);
+
+ if (active_val >= tree[p].value) {
+ break;
+ }
+
+ tree[i] = tree[p];
+ i = p;
+ }
+
+ tree[i].value = active_val;
+ tree[i].ptr = active_ptr;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Public HeapSimple API
+ * \{ */
+
+/**
+ * Creates a new simple heap, which only supports insertion and removal from top.
+ *
+ * \note Use when the size of the heap is known in advance.
+ */
+HeapSimple *BLI_heapsimple_new_ex(uint tot_reserve)
+{
+ HeapSimple *heap = MEM_mallocN(sizeof(HeapSimple), __func__);
+ /* ensure we have at least one so we can keep doubling it */
+ heap->size = 0;
+ heap->bufsize = MAX2(1u, tot_reserve);
+ heap->tree = MEM_mallocN(heap->bufsize * sizeof(HeapSimpleNode), "BLIHeapSimpleTree");
+ return heap;
+}
+
+HeapSimple *BLI_heapsimple_new(void)
+{
+ return BLI_heapsimple_new_ex(1);
+}
+
+void BLI_heapsimple_free(HeapSimple *heap, HeapSimpleFreeFP ptrfreefp)
+{
+ if (ptrfreefp) {
+ for (uint i = 0; i < heap->size; i++) {
+ ptrfreefp(heap->tree[i].ptr);
+ }
+ }
+
+ MEM_freeN(heap->tree);
+ MEM_freeN(heap);
+}
+
+void BLI_heapsimple_clear(HeapSimple *heap, HeapSimpleFreeFP ptrfreefp)
+{
+ if (ptrfreefp) {
+ for (uint i = 0; i < heap->size; i++) {
+ ptrfreefp(heap->tree[i].ptr);
+ }
+ }
+
+ heap->size = 0;
+}
+
+/**
+ * Insert heap node with a value (often a 'cost') and pointer into the heap,
+ * duplicate values are allowed.
+ */
+void BLI_heapsimple_insert(HeapSimple *heap, float value, void *ptr)
+{
+ if (UNLIKELY(heap->size >= heap->bufsize)) {
+ heap->bufsize *= 2;
+ heap->tree = MEM_reallocN(heap->tree, heap->bufsize * sizeof(*heap->tree));
+ }
+
+ heapsimple_up(heap, heap->size++, value, ptr);
+}
+
+bool BLI_heapsimple_is_empty(const HeapSimple *heap)
+{
+ return (heap->size == 0);
+}
+
+uint BLI_heapsimple_len(const HeapSimple *heap)
+{
+ return heap->size;
+}
+
+/**
+ * Return the lowest value of the heap.
+ */
+float BLI_heapsimple_top_value(const HeapSimple *heap)
+{
+ BLI_assert(heap->size != 0);
+
+ return heap->tree[0].value;
+}
+
+/**
+ * Pop the top node off the heap and return it's pointer.
+ */
+void *BLI_heapsimple_pop_min(HeapSimple *heap)
+{
+ BLI_assert(heap->size != 0);
+
+ void *ptr = heap->tree[0].ptr;
+
+ if (--heap->size) {
+ heapsimple_down(heap, 0, &heap->tree[heap->size]);
+ }
+
+ return ptr;
+}
+
+/** \} */
diff --git a/source/blender/blenlib/intern/BLI_kdopbvh.c b/source/blender/blenlib/intern/BLI_kdopbvh.c
index ddfb75fc2ce..e9098be897f 100644
--- a/source/blender/blenlib/intern/BLI_kdopbvh.c
+++ b/source/blender/blenlib/intern/BLI_kdopbvh.c
@@ -56,6 +56,7 @@
#include "BLI_kdopbvh.h"
#include "BLI_math.h"
#include "BLI_task.h"
+#include "BLI_heap_simple.h"
#include "BLI_strict_flags.h"
@@ -213,74 +214,6 @@ MINLINE axis_t max_axis(axis_t a, axis_t b)
}
#endif
-#if 0
-
-/*
- * Generic push and pop heap
- */
-#define PUSH_HEAP_BODY(HEAP_TYPE, PRIORITY, heap, heap_size) \
- { \
- HEAP_TYPE element = heap[heap_size - 1]; \
- int child = heap_size - 1; \
- while (child != 0) { \
- int parent = (child - 1) / 2; \
- if (PRIORITY(element, heap[parent])) { \
- heap[child] = heap[parent]; \
- child = parent; \
- } \
- else { \
- break; \
- } \
- } \
- heap[child] = element; \
- } (void)0
-
-#define POP_HEAP_BODY(HEAP_TYPE, PRIORITY, heap, heap_size) \
- { \
- HEAP_TYPE element = heap[heap_size - 1]; \
- int parent = 0; \
- while (parent < (heap_size - 1) / 2) { \
- int child2 = (parent + 1) * 2; \
- if (PRIORITY(heap[child2 - 1], heap[child2])) { \
- child2--; \
- } \
- if (PRIORITY(element, heap[child2])) { \
- break; \
- } \
- heap[parent] = heap[child2]; \
- parent = child2; \
- } \
- heap[parent] = element; \
- } (void)0
-
-static bool ADJUST_MEMORY(void *local_memblock, void **memblock, int new_size, int *max_size, int size_per_item)
-{
- int new_max_size = *max_size * 2;
- void *new_memblock = NULL;
-
- if (new_size <= *max_size) {
- return true;
- }
-
- if (*memblock == local_memblock) {
- new_memblock = malloc(size_per_item * new_max_size);
- memcpy(new_memblock, *memblock, size_per_item * *max_size);
- }
- else {
- new_memblock = realloc(*memblock, size_per_item * new_max_size);
- }
-
- if (new_memblock) {
- *memblock = new_memblock;
- *max_size = new_max_size;
- return true;
- }
- else {
- return false;
- }
-}
-#endif
-
/**
* Introsort
* with permission deriven from the following Java code:
@@ -288,17 +221,7 @@ static bool ADJUST_MEMORY(void *local_memblock, void **memblock, int new_size, i
* and he derived it from the SUN STL
*/
-//static int size_threshold = 16;
-#if 0
-/**
- * Common methods for all algorithms
- */
-static int floor_lg(int a)
-{
- return (int)(floor(log(a) / log(2)));
-}
-#endif
static void node_minmax_init(const BVHTree *tree, BVHNode *node)
{
@@ -356,39 +279,6 @@ static int bvh_partition(BVHNode **a, int lo, int hi, BVHNode *x, int axis)
}
}
-#if 0
-/**
- * Heapsort algorithm
- */
-static void bvh_downheap(BVHNode **a, int i, int n, int lo, int axis)
-{
- BVHNode *d = a[lo + i - 1];
- int child;
- while (i <= n / 2) {
- child = 2 * i;
- if ((child < n) && ((a[lo + child - 1])->bv[axis] < (a[lo + child])->bv[axis])) {
- child++;
- }
- if (!(d->bv[axis] < (a[lo + child - 1])->bv[axis])) break;
- a[lo + i - 1] = a[lo + child - 1];
- i = child;
- }
- a[lo + i - 1] = d;
-}
-
-static void bvh_heapsort(BVHNode **a, int lo, int hi, int axis)
-{
- int n = hi - lo, i;
- for (i = n / 2; i >= 1; i = i - 1) {
- bvh_downheap(a, i, n, lo, axis);
- }
- for (i = n; i > 1; i = i - 1) {
- SWAP(BVHNode *, a[lo], a[lo + i - 1]);
- bvh_downheap(a, 1, i - 1, lo, axis);
- }
-}
-#endif
-
static BVHNode *bvh_medianof3(BVHNode **a, int lo, int mid, int hi, int axis) /* returns Sortable */
{
if ((a[mid])->bv[axis] < (a[lo])->bv[axis]) {
@@ -413,41 +303,6 @@ static BVHNode *bvh_medianof3(BVHNode **a, int lo, int mid, int hi, int axis) /
}
}
-#if 0
-/*
- * Quicksort algorithm modified for Introsort
- */
-static void bvh_introsort_loop(BVHNode **a, int lo, int hi, int depth_limit, int axis)
-{
- int p;
-
- while (hi - lo > size_threshold) {
- if (depth_limit == 0) {
- bvh_heapsort(a, lo, hi, axis);
- return;
- }
- depth_limit = depth_limit - 1;
- p = bvh_partition(a, lo, hi, bvh_medianof3(a, lo, lo + ((hi - lo) / 2) + 1, hi - 1, axis), axis);
- bvh_introsort_loop(a, p, hi, depth_limit, axis);
- hi = p;
- }
-}
-
-static void sort(BVHNode **a0, int begin, int end, int axis)
-{
- if (begin < end) {
- BVHNode **a = a0;
- bvh_introsort_loop(a, begin, end, 2 * floor_lg(end - begin), axis);
- bvh_insertionsort(a, begin, end, axis);
- }
-}
-
-static void sort_along_axis(BVHTree *tree, int start, int end, int axis)
-{
- sort(tree->nodes, start, end, axis);
-}
-#endif
-
/**
* \note after a call to this function you can expect one of:
* - every node to left of a[n] are smaller or equal to it
@@ -1412,35 +1267,18 @@ static float calc_nearest_point_squared(const float proj[3], BVHNode *node, floa
/* nearest on AABB hull */
for (i = 0; i != 3; i++, bv += 2) {
- if (bv[0] > proj[i])
- nearest[i] = bv[0];
- else if (bv[1] < proj[i])
- nearest[i] = bv[1];
- else
- nearest[i] = proj[i];
- }
-
-#if 0
- /* nearest on a general hull */
- copy_v3_v3(nearest, data->co);
- for (i = data->tree->start_axis; i != data->tree->stop_axis; i++, bv += 2) {
- float proj = dot_v3v3(nearest, bvhtree_kdop_axes[i]);
- float dl = bv[0] - proj;
- float du = bv[1] - proj;
-
- if (dl > 0) {
- madd_v3_v3fl(nearest, bvhtree_kdop_axes[i], dl);
- }
- else if (du < 0) {
- madd_v3_v3fl(nearest, bvhtree_kdop_axes[i], du);
- }
+ float val = proj[i];
+ if (bv[0] > val)
+ val = bv[0];
+ if (bv[1] < val)
+ val = bv[1];
+ nearest[i] = val;
}
-#endif
return len_squared_v3v3(proj, nearest);
}
-/* TODO: use a priority queue to reduce the number of nodes looked on */
+/* Depth first search method */
static void dfs_find_nearest_dfs(BVHNearestData *data, BVHNode *node)
{
if (node->totnode == 0) {
@@ -1484,104 +1322,53 @@ static void dfs_find_nearest_begin(BVHNearestData *data, BVHNode *node)
dfs_find_nearest_dfs(data, node);
}
-
-#if 0
-
-typedef struct NodeDistance {
- BVHNode *node;
- float dist;
-
-} NodeDistance;
-
-#define DEFAULT_FIND_NEAREST_HEAP_SIZE 1024
-
-#define NodeDistance_priority(a, b) ((a).dist < (b).dist)
-
-static void NodeDistance_push_heap(NodeDistance *heap, int heap_size)
-PUSH_HEAP_BODY(NodeDistance, NodeDistance_priority, heap, heap_size)
-
-static void NodeDistance_pop_heap(NodeDistance *heap, int heap_size)
-POP_HEAP_BODY(NodeDistance, NodeDistance_priority, heap, heap_size)
-
-/* NN function that uses an heap.. this functions leads to an optimal number of min-distance
- * but for normal tri-faces and BV 6-dop.. a simple dfs with local heuristics (as implemented
- * in source/blender/blenkernel/intern/shrinkwrap.c) works faster.
- *
- * It may make sense to use this function if the callback queries are very slow.. or if its impossible
- * to get a nice heuristic
- *
- * this function uses "malloc/free" instead of the MEM_* because it intends to be thread safe */
-static void bfs_find_nearest(BVHNearestData *data, BVHNode *node)
+/* Priority queue method */
+static void heap_find_nearest_inner(BVHNearestData *data, HeapSimple *heap, BVHNode *node)
{
- int i;
- NodeDistance default_heap[DEFAULT_FIND_NEAREST_HEAP_SIZE];
- NodeDistance *heap = default_heap, current;
- int heap_size = 0, max_heap_size = sizeof(default_heap) / sizeof(default_heap[0]);
- float nearest[3];
-
- int callbacks = 0, push_heaps = 0;
-
if (node->totnode == 0) {
- dfs_find_nearest_dfs(data, node);
- return;
+ if (data->callback)
+ data->callback(data->userdata, node->index, data->co, &data->nearest);
+ else {
+ data->nearest.index = node->index;
+ data->nearest.dist_sq = calc_nearest_point_squared(data->proj, node, data->nearest.co);
+ }
}
+ else {
+ float nearest[3];
- current.node = node;
- current.dist = calc_nearest_point(data->proj, node, nearest);
+ for (int i = 0; i != node->totnode; i++) {
+ float dist_sq = calc_nearest_point_squared(data->proj, node->children[i], nearest);
- while (current.dist < data->nearest.dist) {
-// printf("%f : %f\n", current.dist, data->nearest.dist);
- for (i = 0; i < current.node->totnode; i++) {
- BVHNode *child = current.node->children[i];
- if (child->totnode == 0) {
- callbacks++;
- dfs_find_nearest_dfs(data, child);
+ if (dist_sq < data->nearest.dist_sq) {
+ BLI_heapsimple_insert(heap, dist_sq, node->children[i]);
}
- else {
- /* adjust heap size */
- if ((heap_size >= max_heap_size) &&
- ADJUST_MEMORY(default_heap, (void **)&heap,
- heap_size + 1, &max_heap_size, sizeof(heap[0])) == false)
- {
- printf("WARNING: bvh_find_nearest got out of memory\n");
-
- if (heap != default_heap)
- free(heap);
+ }
+ }
+}
- return;
- }
+static void heap_find_nearest_begin(BVHNearestData *data, BVHNode *root)
+{
+ float nearest[3];
+ float dist_sq = calc_nearest_point_squared(data->proj, root, nearest);
- heap[heap_size].node = current.node->children[i];
- heap[heap_size].dist = calc_nearest_point(data->proj, current.node->children[i], nearest);
+ if (dist_sq < data->nearest.dist_sq) {
+ HeapSimple *heap = BLI_heapsimple_new_ex(32);
- if (heap[heap_size].dist >= data->nearest.dist) continue;
- heap_size++;
+ heap_find_nearest_inner(data, heap, root);
- NodeDistance_push_heap(heap, heap_size);
- // PUSH_HEAP_BODY(NodeDistance, NodeDistance_priority, heap, heap_size);
- push_heaps++;
- }
+ while (!BLI_heapsimple_is_empty(heap) && BLI_heapsimple_top_value(heap) < data->nearest.dist_sq) {
+ BVHNode *node = BLI_heapsimple_pop_min(heap);
+ heap_find_nearest_inner(data, heap, node);
}
- if (heap_size == 0) break;
-
- current = heap[0];
- NodeDistance_pop_heap(heap, heap_size);
-// POP_HEAP_BODY(NodeDistance, NodeDistance_priority, heap, heap_size);
- heap_size--;
+ BLI_heapsimple_free(heap, NULL);
}
-
-// printf("hsize=%d, callbacks=%d, pushs=%d\n", heap_size, callbacks, push_heaps);
-
- if (heap != default_heap)
- free(heap);
}
-#endif
-
-int BLI_bvhtree_find_nearest(
+int BLI_bvhtree_find_nearest_ex(
BVHTree *tree, const float co[3], BVHTreeNearest *nearest,
- BVHTree_NearestPointCallback callback, void *userdata)
+ BVHTree_NearestPointCallback callback, void *userdata,
+ int flag)
{
axis_t axis_iter;
@@ -1608,8 +1395,14 @@ int BLI_bvhtree_find_nearest(
}
/* dfs search */
- if (root)
- dfs_find_nearest_begin(&data, root);
+ if (root) {
+ if (flag & BVH_NEAREST_OPTIMAL_ORDER) {
+ heap_find_nearest_begin(&data, root);
+ }
+ else {
+ dfs_find_nearest_begin(&data, root);
+ }
+ }
/* copy back results */
if (nearest) {
@@ -1619,6 +1412,13 @@ int BLI_bvhtree_find_nearest(
return data.nearest.index;
}
+int BLI_bvhtree_find_nearest(
+ BVHTree *tree, const float co[3], BVHTreeNearest *nearest,
+ BVHTree_NearestPointCallback callback, void *userdata)
+{
+ return BLI_bvhtree_find_nearest_ex(tree, co, nearest, callback, userdata, 0);
+}
+
/** \} */
@@ -1768,35 +1568,6 @@ static void dfs_raycast_all(BVHRayCastData *data, BVHNode *node)
}
}
-#if 0
-static void iterative_raycast(BVHRayCastData *data, BVHNode *node)
-{
- while (node) {
- float dist = fast_ray_nearest_hit(data, node);
- if (dist >= data->hit.dist) {
- node = node->skip[1];
- continue;
- }
-
- if (node->totnode == 0) {
- if (data->callback) {
- data->callback(data->userdata, node->index, &data->ray, &data->hit);
- }
- else {
- data->hit.index = node->index;
- data->hit.dist = dist;
- madd_v3_v3v3fl(data->hit.co, data->ray.origin, data->ray.direction, dist);
- }
-
- node = node->skip[1];
- }
- else {
- node = node->children[0];
- }
- }
-}
-#endif
-
static void bvhtree_ray_cast_data_precalc(BVHRayCastData *data, int flag)
{
int i;
diff --git a/source/blender/blenlib/intern/DLRB_tree.c b/source/blender/blenlib/intern/DLRB_tree.c
index 6ef77890e95..eb3a79502ae 100644
--- a/source/blender/blenlib/intern/DLRB_tree.c
+++ b/source/blender/blenlib/intern/DLRB_tree.c
@@ -572,7 +572,7 @@ DLRBT_Node *BLI_dlrbTree_add(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb,
node->tree_col = DLRBT_RED;
/* perform BST balancing steps:
- * start from case 1, an trek through the tail-recursive insertion checks
+ * start from case 1, an trek through the tail-recursive insertion checks
*/
insert_check_1(tree, node);
}
diff --git a/source/blender/blenlib/intern/array_store.c b/source/blender/blenlib/intern/array_store.c
index df93dad4c32..153ba3ea0d0 100644
--- a/source/blender/blenlib/intern/array_store.c
+++ b/source/blender/blenlib/intern/array_store.c
@@ -1760,7 +1760,7 @@ bool BLI_array_store_is_valid(
}
GHASH_ITER (gh_iter, chunk_list_map) {
const struct BChunkList *chunk_list = BLI_ghashIterator_getKey(&gh_iter);
- const int users = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(&gh_iter));
+ const int users = POINTER_AS_INT(BLI_ghashIterator_getValue(&gh_iter));
if (!(chunk_list->users == users)) {
ok = false;
goto user_finally;
@@ -1790,7 +1790,7 @@ bool BLI_array_store_is_valid(
GHASH_ITER (gh_iter, chunk_map) {
const struct BChunk *chunk = BLI_ghashIterator_getKey(&gh_iter);
- const int users = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(&gh_iter));
+ const int users = POINTER_AS_INT(BLI_ghashIterator_getValue(&gh_iter));
if (!(chunk->users == users)) {
ok = false;
goto user_finally;
diff --git a/source/blender/blenlib/intern/array_store_utils.c b/source/blender/blenlib/intern/array_store_utils.c
index 83cd28ddf11..97e4207328b 100644
--- a/source/blender/blenlib/intern/array_store_utils.c
+++ b/source/blender/blenlib/intern/array_store_utils.c
@@ -43,9 +43,6 @@ BArrayStore *BLI_array_store_at_size_ensure(
BArrayStore **bs_p = &bs_stride->stride_table[stride - 1];
if ((*bs_p) == NULL) {
-#if 0
- unsigned int chunk_count = chunk_size;
-#else
/* calculate best chunk-count to fit a power of two */
unsigned int chunk_count = chunk_size;
{
@@ -54,7 +51,6 @@ BArrayStore *BLI_array_store_at_size_ensure(
size = MEM_SIZE_OPTIMAL(size);
chunk_count = size / stride;
}
-#endif
(*bs_p) = BLI_array_store_create(stride, chunk_count);
}
diff --git a/source/blender/blenlib/intern/astar.c b/source/blender/blenlib/intern/astar.c
index 1b57dc5a683..30ad6c7838c 100644
--- a/source/blender/blenlib/intern/astar.c
+++ b/source/blender/blenlib/intern/astar.c
@@ -52,7 +52,7 @@
#include "BLI_compiler_attrs.h"
#include "BLI_alloca.h"
-#include "BLI_heap.h"
+#include "BLI_heap_simple.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_memarena.h"
@@ -206,7 +206,7 @@ bool BLI_astar_graph_solve(
BLI_AStarGraph *as_graph, const int node_index_src, const int node_index_dst, astar_f_cost f_cost_cb,
BLI_AStarSolution *r_solution, const int max_steps)
{
- Heap *todo_nodes;
+ HeapSimple *todo_nodes;
BLI_bitmap *done_nodes = r_solution->done_nodes;
int *prev_nodes = r_solution->prev_nodes;
@@ -225,13 +225,14 @@ bool BLI_astar_graph_solve(
return true;
}
- todo_nodes = BLI_heap_new();
- BLI_heap_insert(todo_nodes,
- f_cost_cb(as_graph, r_solution, NULL, -1, node_index_src, node_index_dst),
- SET_INT_IN_POINTER(node_index_src));
+ todo_nodes = BLI_heapsimple_new();
+ BLI_heapsimple_insert(
+ todo_nodes,
+ f_cost_cb(as_graph, r_solution, NULL, -1, node_index_src, node_index_dst),
+ POINTER_FROM_INT(node_index_src));
- while (!BLI_heap_is_empty(todo_nodes)) {
- const int node_curr_idx = GET_INT_FROM_POINTER(BLI_heap_pop_min(todo_nodes));
+ while (!BLI_heapsimple_is_empty(todo_nodes)) {
+ const int node_curr_idx = POINTER_AS_INT(BLI_heapsimple_pop_min(todo_nodes));
BLI_AStarGNode *node_curr = &as_graph->nodes[node_curr_idx];
LinkData *ld;
@@ -249,7 +250,7 @@ bool BLI_astar_graph_solve(
/* Success! Path found... */
r_solution->steps = g_steps[node_curr_idx] + 1;
- BLI_heap_free(todo_nodes, NULL);
+ BLI_heapsimple_free(todo_nodes, NULL);
return true;
}
@@ -269,14 +270,15 @@ bool BLI_astar_graph_solve(
g_steps[node_next_idx] = g_steps[node_curr_idx] + 1;
/* We might have this node already in heap, but since this 'instance' will be evaluated first,
* no problem. */
- BLI_heap_insert(todo_nodes,
- f_cost_cb(as_graph, r_solution, link, node_curr_idx, node_next_idx, node_index_dst),
- SET_INT_IN_POINTER(node_next_idx));
+ BLI_heapsimple_insert(
+ todo_nodes,
+ f_cost_cb(as_graph, r_solution, link, node_curr_idx, node_next_idx, node_index_dst),
+ POINTER_FROM_INT(node_next_idx));
}
}
}
}
- BLI_heap_free(todo_nodes, NULL);
+ BLI_heapsimple_free(todo_nodes, NULL);
return false;
}
diff --git a/source/blender/blenlib/intern/edgehash.c b/source/blender/blenlib/intern/edgehash.c
index 7074a776aaf..1ba26b06c18 100644
--- a/source/blender/blenlib/intern/edgehash.c
+++ b/source/blender/blenlib/intern/edgehash.c
@@ -659,49 +659,6 @@ void BLI_edgehashIterator_free(EdgeHashIterator *ehi)
MEM_freeN(ehi);
}
-/* inline functions now */
-#if 0
-/**
- * Retrieve the key from an iterator.
- */
-void BLI_edgehashIterator_getKey(EdgeHashIterator *ehi, uint *r_v0, uint *r_v1)
-{
- *r_v0 = ehi->curEntry->v0;
- *r_v1 = ehi->curEntry->v1;
-}
-
-/**
- * Retrieve the value from an iterator.
- */
-void *BLI_edgehashIterator_getValue(EdgeHashIterator *ehi)
-{
- return ehi->curEntry->val;
-}
-
-/**
- * Retrieve the pointer to the value from an iterator.
- */
-void **BLI_edgehashIterator_getValue_p(EdgeHashIterator *ehi)
-{
- return &ehi->curEntry->val;
-}
-
-/**
- * Set the value for an iterator.
- */
-void BLI_edgehashIterator_setValue(EdgeHashIterator *ehi, void *val)
-{
- ehi->curEntry->val = val;
-}
-
-/**
- * Determine if an iterator is done.
- */
-bool BLI_edgehashIterator_isDone(EdgeHashIterator *ehi)
-{
- return (ehi->curEntry == NULL);
-}
-#endif
/** \} */
diff --git a/source/blender/blenlib/intern/expr_pylike_eval.c b/source/blender/blenlib/intern/expr_pylike_eval.c
new file mode 100644
index 00000000000..7bcf32dd880
--- /dev/null
+++ b/source/blender/blenlib/intern/expr_pylike_eval.c
@@ -0,0 +1,1003 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2018 Blender Foundation, Alexander Gavrilov
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Alexander Gavrilov
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenlib/intern/expr_pylike_eval.c
+ * \ingroup bli
+ * \author Alexander Gavrilov
+ * \since 2018
+ *
+ * Simple evaluator for a subset of Python expressions that can be
+ * computed using purely double precision floating point values.
+ *
+ * Supported subset:
+ *
+ * - Identifiers use only ASCII characters.
+ * - Literals:
+ * floating point and decimal integer.
+ * - Constants:
+ * pi, True, False
+ * - Operators:
+ * +, -, *, /, ==, !=, <, <=, >, >=, and, or, not, ternary if
+ * - Functions:
+ * min, max, radians, degrees,
+ * abs, fabs, floor, ceil, trunc, int,
+ * sin, cos, tan, asin, acos, atan, atan2,
+ * exp, log, sqrt, pow, fmod
+ *
+ * The implementation has no global state and can be used multithreaded.
+ */
+
+#include <math.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <string.h>
+#include <float.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <fenv.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_expr_pylike_eval.h"
+#include "BLI_utildefines.h"
+#include "BLI_math_base.h"
+#include "BLI_alloca.h"
+
+#ifdef _MSC_VER
+#pragma fenv_access (on)
+#endif
+
+/* -------------------------------------------------------------------- */
+/** \name Internal Types
+ * \{ */
+
+typedef enum eOpCode {
+ /* Double constant: (-> dval) */
+ OPCODE_CONST,
+ /* 1 argument function call: (a -> func1(a)) */
+ OPCODE_FUNC1,
+ /* 2 argument function call: (a b -> func2(a,b)) */
+ OPCODE_FUNC2,
+ /* Parameter access: (-> params[ival]) */
+ OPCODE_PARAMETER,
+ /* Minimum of multiple inputs: (a b c... -> min); ival = arg count */
+ OPCODE_MIN,
+ /* Maximum of multiple inputs: (a b c... -> max); ival = arg count */
+ OPCODE_MAX,
+ /* Jump (pc += jmp_offset) */
+ OPCODE_JMP,
+ /* Pop and jump if zero: (a -> ); JUMP IF NOT a */
+ OPCODE_JMP_ELSE,
+ /* Jump if nonzero, or pop: (a -> a JUMP) IF a ELSE (a -> ) */
+ OPCODE_JMP_OR,
+ /* Jump if zero, or pop: (a -> a JUMP) IF NOT a ELSE (a -> ) */
+ OPCODE_JMP_AND,
+ /* For comparison chaining: (a b -> 0 JUMP) IF NOT func2(a,b) ELSE (a b -> b) */
+ OPCODE_CMP_CHAIN,
+} eOpCode;
+
+typedef double (*UnaryOpFunc)(double);
+typedef double (*BinaryOpFunc)(double, double);
+
+typedef struct ExprOp {
+ eOpCode opcode;
+
+ int jmp_offset;
+
+ union {
+ int ival;
+ double dval;
+ void *ptr;
+ UnaryOpFunc func1;
+ BinaryOpFunc func2;
+ } arg;
+} ExprOp;
+
+struct ExprPyLike_Parsed {
+ int ops_count;
+ int max_stack;
+
+ ExprOp ops[];
+};
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Public API
+ * \{ */
+
+/** Free the parsed data; NULL argument is ok. */
+void BLI_expr_pylike_free(ExprPyLike_Parsed *expr)
+{
+ if (expr != NULL) {
+ MEM_freeN(expr);
+ }
+}
+
+/** Check if the parsing result is valid for evaluation. */
+bool BLI_expr_pylike_is_valid(ExprPyLike_Parsed *expr)
+{
+ return expr != NULL && expr->ops_count > 0;
+}
+
+/** Check if the parsed expression always evaluates to the same value. */
+bool BLI_expr_pylike_is_constant(ExprPyLike_Parsed *expr)
+{
+ return expr != NULL && expr->ops_count == 1 && expr->ops[0].opcode == OPCODE_CONST;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Stack Machine Evaluation
+ * \{ */
+
+/**
+ * Evaluate the expression with the given parameters.
+ * The order and number of parameters must match the names given to parse.
+ */
+eExprPyLike_EvalStatus BLI_expr_pylike_eval(
+ ExprPyLike_Parsed *expr,
+ const double *param_values, int param_values_len,
+ double *r_result)
+{
+ *r_result = 0.0;
+
+ if (!BLI_expr_pylike_is_valid(expr)) {
+ return EXPR_PYLIKE_INVALID;
+ }
+
+#define FAIL_IF(condition) if (condition) { return EXPR_PYLIKE_FATAL_ERROR; }
+
+ /* Check the stack requirement is at least remotely sane and allocate on the actual stack. */
+ FAIL_IF(expr->max_stack <= 0 || expr->max_stack > 1000);
+
+ double *stack = BLI_array_alloca(stack, expr->max_stack);
+
+ /* Evaluate expression. */
+ ExprOp *ops = expr->ops;
+ int sp = 0, pc;
+
+ feclearexcept(FE_ALL_EXCEPT);
+
+ for (pc = 0; pc >= 0 && pc < expr->ops_count; pc++) {
+ switch (ops[pc].opcode) {
+ /* Arithmetic */
+ case OPCODE_CONST:
+ FAIL_IF(sp >= expr->max_stack);
+ stack[sp++] = ops[pc].arg.dval;
+ break;
+ case OPCODE_PARAMETER:
+ FAIL_IF(sp >= expr->max_stack || ops[pc].arg.ival >= param_values_len);
+ stack[sp++] = param_values[ops[pc].arg.ival];
+ break;
+ case OPCODE_FUNC1:
+ FAIL_IF(sp < 1);
+ stack[sp - 1] = ops[pc].arg.func1(stack[sp - 1]);
+ break;
+ case OPCODE_FUNC2:
+ FAIL_IF(sp < 2);
+ stack[sp - 2] = ops[pc].arg.func2(stack[sp - 2], stack[sp - 1]);
+ sp--;
+ break;
+ case OPCODE_MIN:
+ FAIL_IF(sp < ops[pc].arg.ival);
+ for (int j = 1; j < ops[pc].arg.ival; j++, sp--) {
+ CLAMP_MAX(stack[sp - 2], stack[sp - 1]);
+ }
+ break;
+ case OPCODE_MAX:
+ FAIL_IF(sp < ops[pc].arg.ival);
+ for (int j = 1; j < ops[pc].arg.ival; j++, sp--) {
+ CLAMP_MIN(stack[sp - 2], stack[sp - 1]);
+ }
+ break;
+
+ /* Jumps */
+ case OPCODE_JMP:
+ pc += ops[pc].jmp_offset;
+ break;
+ case OPCODE_JMP_ELSE:
+ FAIL_IF(sp < 1);
+ if (!stack[--sp]) {
+ pc += ops[pc].jmp_offset;
+ }
+ break;
+ case OPCODE_JMP_OR:
+ case OPCODE_JMP_AND:
+ FAIL_IF(sp < 1);
+ if (!stack[sp - 1] == !(ops[pc].opcode == OPCODE_JMP_OR)) {
+ pc += ops[pc].jmp_offset;
+ }
+ else {
+ sp--;
+ }
+ break;
+
+ /* For chaining comparisons, i.e. "a < b < c" as "a < b and b < c" */
+ case OPCODE_CMP_CHAIN:
+ FAIL_IF(sp < 2);
+ /* If comparison fails, return 0 and jump to end. */
+ if (!ops[pc].arg.func2(stack[sp - 2], stack[sp - 1])) {
+ stack[sp - 2] = 0.0;
+ pc += ops[pc].jmp_offset;
+ }
+ /* Otherwise keep b on the stack and proceed. */
+ else {
+ stack[sp - 2] = stack[sp - 1];
+ }
+ sp--;
+ break;
+
+ default:
+ return EXPR_PYLIKE_FATAL_ERROR;
+ }
+ }
+
+ FAIL_IF(sp != 1 || pc != expr->ops_count);
+
+#undef FAIL_IF
+
+ *r_result = stack[0];
+
+ /* Detect floating point evaluation errors. */
+ int flags = fetestexcept(FE_DIVBYZERO | FE_INVALID);
+ if (flags) {
+ return (flags & FE_INVALID) ? EXPR_PYLIKE_MATH_ERROR : EXPR_PYLIKE_DIV_BY_ZERO;
+ }
+
+ return EXPR_PYLIKE_SUCCESS;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Built-In Operations
+ * \{ */
+
+static double op_negate(double arg)
+{
+ return -arg;
+}
+
+static double op_mul(double a, double b)
+{
+ return a * b;
+}
+
+static double op_div(double a, double b)
+{
+ return a / b;
+}
+
+static double op_add(double a, double b)
+{
+ return a + b;
+}
+
+static double op_sub(double a, double b)
+{
+ return a - b;
+}
+
+static double op_radians(double arg)
+{
+ return arg * M_PI / 180.0;
+}
+
+static double op_degrees(double arg)
+{
+ return arg * 180.0 / M_PI;
+}
+
+static double op_not(double a)
+{
+ return a ? 0.0 : 1.0;
+}
+
+static double op_eq(double a, double b)
+{
+ return a == b ? 1.0 : 0.0;
+}
+
+static double op_ne(double a, double b)
+{
+ return a != b ? 1.0 : 0.0;
+}
+
+static double op_lt(double a, double b)
+{
+ return a < b ? 1.0 : 0.0;
+}
+
+static double op_le(double a, double b)
+{
+ return a <= b ? 1.0 : 0.0;
+}
+
+static double op_gt(double a, double b)
+{
+ return a > b ? 1.0 : 0.0;
+}
+
+static double op_ge(double a, double b)
+{
+ return a >= b ? 1.0 : 0.0;
+}
+
+typedef struct BuiltinConstDef {
+ const char *name;
+ double value;
+} BuiltinConstDef;
+
+static BuiltinConstDef builtin_consts[] = {
+ { "pi", M_PI },
+ { "True", 1.0 },
+ { "False", 0.0 },
+ { NULL, 0.0 }
+};
+
+typedef struct BuiltinOpDef {
+ const char *name;
+ eOpCode op;
+ void *funcptr;
+} BuiltinOpDef;
+
+static BuiltinOpDef builtin_ops[] = {
+ { "radians", OPCODE_FUNC1, op_radians },
+ { "degrees", OPCODE_FUNC1, op_degrees },
+ { "abs", OPCODE_FUNC1, abs },
+ { "fabs", OPCODE_FUNC1, abs },
+ { "floor", OPCODE_FUNC1, floor },
+ { "ceil", OPCODE_FUNC1, ceil },
+ { "trunc", OPCODE_FUNC1, trunc },
+ { "int", OPCODE_FUNC1, trunc },
+ { "sin", OPCODE_FUNC1, sin },
+ { "cos", OPCODE_FUNC1, cos },
+ { "tan", OPCODE_FUNC1, tan },
+ { "asin", OPCODE_FUNC1, asin },
+ { "acos", OPCODE_FUNC1, acos },
+ { "atan", OPCODE_FUNC1, atan },
+ { "atan2", OPCODE_FUNC2, atan2 },
+ { "exp", OPCODE_FUNC1, exp },
+ { "log", OPCODE_FUNC1, log },
+ { "sqrt", OPCODE_FUNC1, sqrt },
+ { "pow", OPCODE_FUNC2, pow },
+ { "fmod", OPCODE_FUNC2, fmod },
+ { NULL, OPCODE_CONST, NULL }
+};
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Expression Parser State
+ * \{ */
+
+#define MAKE_CHAR2(a, b) (((a) << 8) | (b))
+
+#define CHECK_ERROR(condition) if (!(condition)) { return false; }
+
+/* For simplicity simple token types are represented by their own character;
+ * these are special identifiers for multi-character tokens. */
+#define TOKEN_ID MAKE_CHAR2('I', 'D')
+#define TOKEN_NUMBER MAKE_CHAR2('0', '0')
+#define TOKEN_GE MAKE_CHAR2('>', '=')
+#define TOKEN_LE MAKE_CHAR2('<', '=')
+#define TOKEN_NE MAKE_CHAR2('!', '=')
+#define TOKEN_EQ MAKE_CHAR2('=', '=')
+#define TOKEN_AND MAKE_CHAR2('A', 'N')
+#define TOKEN_OR MAKE_CHAR2('O', 'R')
+#define TOKEN_NOT MAKE_CHAR2('N', 'O')
+#define TOKEN_IF MAKE_CHAR2('I', 'F')
+#define TOKEN_ELSE MAKE_CHAR2('E', 'L')
+
+static const char *token_eq_characters = "!=><";
+static const char *token_characters = "~`!@#$%^&*+-=/\\?:;<>(){}[]|.,\"'";
+
+typedef struct KeywordTokenDef {
+ const char *name;
+ short token;
+} KeywordTokenDef;
+
+static KeywordTokenDef keyword_list[] = {
+ { "and", TOKEN_AND },
+ { "or", TOKEN_OR },
+ { "not", TOKEN_NOT },
+ { "if", TOKEN_IF },
+ { "else", TOKEN_ELSE },
+ { NULL, TOKEN_ID }
+};
+
+typedef struct ExprParseState {
+ int param_names_len;
+ const char **param_names;
+
+ /* Original expression */
+ const char *expr;
+ const char *cur;
+
+ /* Current token */
+ short token;
+ char *tokenbuf;
+ double tokenval;
+
+ /* Opcode buffer */
+ int ops_count, max_ops, last_jmp;
+ ExprOp *ops;
+
+ /* Stack space requirement tracking */
+ int stack_ptr, max_stack;
+} ExprParseState;
+
+/* Reserve space for the specified number of operations in the buffer. */
+static ExprOp *parse_alloc_ops(ExprParseState *state, int count)
+{
+ if (state->ops_count + count > state->max_ops) {
+ state->max_ops = power_of_2_max_i(state->ops_count + count);
+ state->ops = MEM_reallocN(state->ops, state->max_ops * sizeof(ExprOp));
+ }
+
+ ExprOp *op = &state->ops[state->ops_count];
+ state->ops_count += count;
+ return op;
+}
+
+/* Add one operation and track stack usage. */
+static ExprOp *parse_add_op(ExprParseState *state, eOpCode code, int stack_delta)
+{
+ /* track evaluation stack depth */
+ state->stack_ptr += stack_delta;
+ CLAMP_MIN(state->stack_ptr, 0);
+ CLAMP_MIN(state->max_stack, state->stack_ptr);
+
+ /* allocate the new instruction */
+ ExprOp *op = parse_alloc_ops(state, 1);
+ memset(op, 0, sizeof(ExprOp));
+ op->opcode = code;
+ return op;
+}
+
+/* Add one jump operation and return an index for parse_set_jump. */
+static int parse_add_jump(ExprParseState *state, eOpCode code)
+{
+ parse_add_op(state, code, -1);
+ return state->last_jmp = state->ops_count;
+}
+
+/* Set the jump offset in a previously added jump operation. */
+static void parse_set_jump(ExprParseState *state, int jump)
+{
+ state->last_jmp = state->ops_count;
+ state->ops[jump - 1].jmp_offset = state->ops_count - jump;
+}
+
+/* Add a function call operation, applying constant folding when possible. */
+static bool parse_add_func(ExprParseState *state, eOpCode code, int args, void *funcptr)
+{
+ ExprOp *prev_ops = &state->ops[state->ops_count];
+ int jmp_gap = state->ops_count - state->last_jmp;
+
+ feclearexcept(FE_ALL_EXCEPT);
+
+ switch (code) {
+ case OPCODE_FUNC1:
+ CHECK_ERROR(args == 1);
+
+ if (jmp_gap >= 1 && prev_ops[-1].opcode == OPCODE_CONST) {
+ UnaryOpFunc func = funcptr;
+
+ double result = func(prev_ops[-1].arg.dval);
+
+ if (fetestexcept(FE_DIVBYZERO | FE_INVALID) == 0) {
+ prev_ops[-1].arg.dval = result;
+ return true;
+ }
+ }
+ break;
+
+ case OPCODE_FUNC2:
+ CHECK_ERROR(args == 2);
+
+ if (jmp_gap >= 2 && prev_ops[-2].opcode == OPCODE_CONST && prev_ops[-1].opcode == OPCODE_CONST) {
+ BinaryOpFunc func = funcptr;
+
+ double result = func(prev_ops[-2].arg.dval, prev_ops[-1].arg.dval);
+
+ if (fetestexcept(FE_DIVBYZERO | FE_INVALID) == 0) {
+ prev_ops[-2].arg.dval = result;
+ state->ops_count--;
+ state->stack_ptr--;
+ return true;
+ }
+ }
+ break;
+
+ default:
+ BLI_assert(false);
+ return false;
+ }
+
+ parse_add_op(state, code, 1 - args)->arg.ptr = funcptr;
+ return true;
+}
+
+/* Extract the next token from raw characters. */
+static bool parse_next_token(ExprParseState *state)
+{
+ /* Skip whitespace. */
+ while (isspace(*state->cur)) {
+ state->cur++;
+ }
+
+ /* End of string. */
+ if (*state->cur == 0) {
+ state->token = 0;
+ return true;
+ }
+
+ /* Floating point numbers. */
+ if (isdigit(*state->cur) || (state->cur[0] == '.' && isdigit(state->cur[1]))) {
+ char *end, *out = state->tokenbuf;
+ bool is_float = false;
+
+ while (isdigit(*state->cur))
+ *out++ = *state->cur++;
+
+ if (*state->cur == '.') {
+ is_float = true;
+ *out++ = *state->cur++;
+
+ while (isdigit(*state->cur))
+ *out++ = *state->cur++;
+ }
+
+ if (ELEM(*state->cur, 'e', 'E')) {
+ is_float = true;
+ *out++ = *state->cur++;
+
+ if (ELEM(*state->cur, '+', '-'))
+ *out++ = *state->cur++;
+
+ CHECK_ERROR(isdigit(*state->cur));
+
+ while (isdigit(*state->cur))
+ *out++ = *state->cur++;
+ }
+
+ *out = 0;
+
+ /* Forbid C-style octal constants. */
+ if (!is_float && state->tokenbuf[0] == '0') {
+ for (char *p = state->tokenbuf + 1; *p; p++) {
+ if (*p != '0') {
+ return false;
+ }
+ }
+ }
+
+ state->token = TOKEN_NUMBER;
+ state->tokenval = strtod(state->tokenbuf, &end);
+ return (end == out);
+ }
+
+ /* ?= tokens */
+ if (state->cur[1] == '=' && strchr(token_eq_characters, state->cur[0])) {
+ state->token = MAKE_CHAR2(state->cur[0], state->cur[1]);
+ state->cur += 2;
+ return true;
+ }
+
+ /* Special characters (single character tokens) */
+ if (strchr(token_characters, *state->cur)) {
+ state->token = *state->cur++;
+ return true;
+ }
+
+ /* Identifiers */
+ if (isalpha(*state->cur) || ELEM(*state->cur, '_')) {
+ char *out = state->tokenbuf;
+
+ while (isalnum(*state->cur) || ELEM(*state->cur, '_'))
+ *out++ = *state->cur++;
+
+ *out = 0;
+
+ for (int i = 0; keyword_list[i].name; i++) {
+ if (STREQ(state->tokenbuf, keyword_list[i].name)) {
+ state->token = keyword_list[i].token;
+ return true;
+ }
+ }
+
+ state->token = TOKEN_ID;
+ return true;
+ }
+
+ return false;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Recursive Descent Parser
+ * \{ */
+
+static bool parse_expr(ExprParseState *state);
+
+static int parse_function_args(ExprParseState *state)
+{
+ if (!parse_next_token(state) || state->token != '(' || !parse_next_token(state)) {
+ return -1;
+ }
+
+ int arg_count = 0;
+
+ for (;;) {
+ if (!parse_expr(state)) {
+ return -1;
+ }
+
+ arg_count++;
+
+ switch (state->token) {
+ case ',':
+ if (!parse_next_token(state)) {
+ return -1;
+ }
+ break;
+
+ case ')':
+ if (!parse_next_token(state)) {
+ return -1;
+ }
+ return arg_count;
+
+ default:
+ return -1;
+ }
+ }
+}
+
+static bool parse_unary(ExprParseState *state)
+{
+ int i;
+
+ switch (state->token) {
+ case '+':
+ return parse_next_token(state) && parse_unary(state);
+
+ case '-':
+ CHECK_ERROR(parse_next_token(state) && parse_unary(state));
+ parse_add_func(state, OPCODE_FUNC1, 1, op_negate);
+ return true;
+
+ case '(':
+ return parse_next_token(state) &&
+ parse_expr(state) &&
+ state->token == ')' &&
+ parse_next_token(state);
+
+ case TOKEN_NUMBER:
+ parse_add_op(state, OPCODE_CONST, 1)->arg.dval = state->tokenval;
+ return parse_next_token(state);
+
+ case TOKEN_ID:
+ /* Parameters: search in reverse order in case of duplicate names - the last one should win. */
+ for (i = state->param_names_len - 1; i >= 0; i--) {
+ if (STREQ(state->tokenbuf, state->param_names[i])) {
+ parse_add_op(state, OPCODE_PARAMETER, 1)->arg.ival = i;
+ return parse_next_token(state);
+ }
+ }
+
+ /* Ordinary builtin constants. */
+ for (i = 0; builtin_consts[i].name; i++) {
+ if (STREQ(state->tokenbuf, builtin_consts[i].name)) {
+ parse_add_op(state, OPCODE_CONST, 1)->arg.dval = builtin_consts[i].value;
+ return parse_next_token(state);
+ }
+ }
+
+ /* Ordinary builtin functions. */
+ for (i = 0; builtin_ops[i].name; i++) {
+ if (STREQ(state->tokenbuf, builtin_ops[i].name)) {
+ int args = parse_function_args(state);
+
+ return parse_add_func(state, builtin_ops[i].op, args, builtin_ops[i].funcptr);
+ }
+ }
+
+ /* Specially supported functions. */
+ if (STREQ(state->tokenbuf, "min")) {
+ int cnt = parse_function_args(state);
+ CHECK_ERROR(cnt > 0);
+
+ parse_add_op(state, OPCODE_MIN, 1 - cnt)->arg.ival = cnt;
+ return true;
+ }
+
+ if (STREQ(state->tokenbuf, "max")) {
+ int cnt = parse_function_args(state);
+ CHECK_ERROR(cnt > 0);
+
+ parse_add_op(state, OPCODE_MAX, 1 - cnt)->arg.ival = cnt;
+ return true;
+ }
+
+ return false;
+
+ default:
+ return false;
+ }
+}
+
+static bool parse_mul(ExprParseState *state)
+{
+ CHECK_ERROR(parse_unary(state));
+
+ for (;;) {
+ switch (state->token) {
+ case '*':
+ CHECK_ERROR(parse_next_token(state) && parse_unary(state));
+ parse_add_func(state, OPCODE_FUNC2, 2, op_mul);
+ break;
+
+ case '/':
+ CHECK_ERROR(parse_next_token(state) && parse_unary(state));
+ parse_add_func(state, OPCODE_FUNC2, 2, op_div);
+ break;
+
+ default:
+ return true;
+ }
+ }
+}
+
+static bool parse_add(ExprParseState *state)
+{
+ CHECK_ERROR(parse_mul(state));
+
+ for (;;) {
+ switch (state->token) {
+ case '+':
+ CHECK_ERROR(parse_next_token(state) && parse_mul(state));
+ parse_add_func(state, OPCODE_FUNC2, 2, op_add);
+ break;
+
+ case '-':
+ CHECK_ERROR(parse_next_token(state) && parse_mul(state));
+ parse_add_func(state, OPCODE_FUNC2, 2, op_sub);
+ break;
+
+ default:
+ return true;
+ }
+ }
+}
+
+static BinaryOpFunc parse_get_cmp_func(short token)
+{
+ switch (token) {
+ case TOKEN_EQ:
+ return op_eq;
+ case TOKEN_NE:
+ return op_ne;
+ case '>':
+ return op_gt;
+ case TOKEN_GE:
+ return op_ge;
+ case '<':
+ return op_lt;
+ case TOKEN_LE:
+ return op_le;
+ default:
+ return NULL;
+ }
+}
+
+static bool parse_cmp_chain(ExprParseState *state, BinaryOpFunc cur_func)
+{
+ BinaryOpFunc next_func = parse_get_cmp_func(state->token);
+
+ if (next_func) {
+ parse_add_op(state, OPCODE_CMP_CHAIN, -1)->arg.func2 = cur_func;
+ int jump = state->last_jmp = state->ops_count;
+
+ CHECK_ERROR(parse_next_token(state) && parse_add(state));
+ CHECK_ERROR(parse_cmp_chain(state, next_func));
+
+ parse_set_jump(state, jump);
+ }
+ else {
+ parse_add_func(state, OPCODE_FUNC2, 2, cur_func);
+ }
+
+ return true;
+}
+
+static bool parse_cmp(ExprParseState *state)
+{
+ CHECK_ERROR(parse_add(state));
+
+ BinaryOpFunc func = parse_get_cmp_func(state->token);
+
+ if (func) {
+ CHECK_ERROR(parse_next_token(state) && parse_add(state));
+
+ return parse_cmp_chain(state, func);
+ }
+
+ return true;
+}
+
+static bool parse_not(ExprParseState *state)
+{
+ if (state->token == TOKEN_NOT) {
+ CHECK_ERROR(parse_next_token(state) && parse_not(state));
+ parse_add_func(state, OPCODE_FUNC1, 1, op_not);
+ return true;
+ }
+
+ return parse_cmp(state);
+}
+
+static bool parse_and(ExprParseState *state)
+{
+ CHECK_ERROR(parse_not(state));
+
+ if (state->token == TOKEN_AND) {
+ int jump = parse_add_jump(state, OPCODE_JMP_AND);
+
+ CHECK_ERROR(parse_next_token(state) && parse_and(state));
+
+ parse_set_jump(state, jump);
+ }
+
+ return true;
+}
+
+static bool parse_or(ExprParseState *state)
+{
+ CHECK_ERROR(parse_and(state));
+
+ if (state->token == TOKEN_OR) {
+ int jump = parse_add_jump(state, OPCODE_JMP_OR);
+
+ CHECK_ERROR(parse_next_token(state) && parse_or(state));
+
+ parse_set_jump(state, jump);
+ }
+
+ return true;
+}
+
+static bool parse_expr(ExprParseState *state)
+{
+ /* Temporarily set the constant expression evaluation barrier */
+ int prev_last_jmp = state->last_jmp;
+ int start = state->last_jmp = state->ops_count;
+
+ CHECK_ERROR(parse_or(state));
+
+ if (state->token == TOKEN_IF) {
+ /* Ternary IF expression in python requires swapping the
+ * main body with condition, so stash the body opcodes. */
+ int size = state->ops_count - start;
+ int bytes = size * sizeof(ExprOp);
+
+ ExprOp *body = MEM_mallocN(bytes, "driver if body");
+ memcpy(body, state->ops + start, bytes);
+
+ state->last_jmp = state->ops_count = start;
+ state->stack_ptr--;
+
+ /* Parse condition. */
+ if (!parse_next_token(state) || !parse_or(state) ||
+ state->token != TOKEN_ELSE || !parse_next_token(state))
+ {
+ MEM_freeN(body);
+ return false;
+ }
+
+ int jmp_else = parse_add_jump(state, OPCODE_JMP_ELSE);
+
+ /* Add body back. */
+ memcpy(parse_alloc_ops(state, size), body, bytes);
+ MEM_freeN(body);
+
+ state->stack_ptr++;
+
+ int jmp_end = parse_add_jump(state, OPCODE_JMP);
+
+ /* Parse the else block. */
+ parse_set_jump(state, jmp_else);
+
+ CHECK_ERROR(parse_expr(state));
+
+ parse_set_jump(state, jmp_end);
+ }
+ /* If no actual jumps happened, restore previous barrier */
+ else if (state->last_jmp == start) {
+ state->last_jmp = prev_last_jmp;
+ }
+
+ return true;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Main Parsing Function
+ * \{ */
+
+/**
+ * Compile the expression and return the result.
+ *
+ * Parse the expression for evaluation later.
+ * Returns non-NULL even on failure; use is_valid to check.
+ */
+ExprPyLike_Parsed *BLI_expr_pylike_parse(const char *expression, const char **param_names, int param_names_len)
+{
+ /* Prepare the parser state. */
+ ExprParseState state;
+ memset(&state, 0, sizeof(state));
+
+ state.cur = state.expr = expression;
+
+ state.param_names_len = param_names_len;
+ state.param_names = param_names;
+
+ state.tokenbuf = MEM_mallocN(strlen(expression) + 1, __func__);
+
+ state.max_ops = 16;
+ state.ops = MEM_mallocN(state.max_ops * sizeof(ExprOp), __func__);
+
+ /* Parse the expression. */
+ ExprPyLike_Parsed *expr;
+
+ if (parse_next_token(&state) && parse_expr(&state) && state.token == 0) {
+ BLI_assert(state.stack_ptr == 1);
+
+ int bytesize = sizeof(ExprPyLike_Parsed) + state.ops_count * sizeof(ExprOp);
+
+ expr = MEM_mallocN(bytesize, "ExprPyLike_Parsed");
+ expr->ops_count = state.ops_count;
+ expr->max_stack = state.max_stack;
+
+ memcpy(expr->ops, state.ops, state.ops_count * sizeof(ExprOp));
+ }
+ else {
+ /* Always return a non-NULL object so that parse failure can be cached. */
+ expr = MEM_callocN(sizeof(ExprPyLike_Parsed), "ExprPyLike_Parsed(empty)");
+ }
+
+ MEM_freeN(state.tokenbuf);
+ MEM_freeN(state.ops);
+ return expr;
+}
+
+/** \} */
diff --git a/source/blender/blenlib/intern/freetypefont.c b/source/blender/blenlib/intern/freetypefont.c
index c7604b3cd6d..0bed7d42e9f 100644
--- a/source/blender/blenlib/intern/freetypefont.c
+++ b/source/blender/blenlib/intern/freetypefont.c
@@ -99,7 +99,7 @@ static VChar *freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *
che->index = charcode;
che->width = glyph->advance.x * scale;
- BLI_ghash_insert(vfd->characters, SET_UINT_IN_POINTER(che->index), che);
+ BLI_ghash_insert(vfd->characters, POINTER_FROM_UINT(che->index), che);
/* Start converting the FT data */
onpoints = (int *)MEM_callocN((ftoutline.n_contours) * sizeof(int), "onpoints");
@@ -291,14 +291,6 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile *pf)
const char *fontname;
VFontData *vfd;
-#if 0
- FT_CharMap found = 0;
- FT_CharMap charmap;
- FT_UShort my_platform_id = TT_PLATFORM_MICROSOFT;
- FT_UShort my_encoding_id = TT_MS_ID_UNICODE_CS;
- int n;
-#endif
-
/* load the freetype font */
err = FT_New_Memory_Face(library,
pf->data,
@@ -308,25 +300,6 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile *pf)
if (err) return NULL;
-#if 0
- for (n = 0; n < face->num_charmaps; n++)
- {
- charmap = face->charmaps[n];
- if (charmap->platform_id == my_platform_id &&
- charmap->encoding_id == my_encoding_id)
- {
- found = charmap;
- break;
- }
- }
-
- if (!found) { return NULL; }
-
- /* now, select the charmap for the face object */
- err = FT_Set_Charmap(face, found);
- if (err) { return NULL; }
-#endif
-
/* allocate blender font */
vfd = MEM_callocN(sizeof(*vfd), "FTVFontData");
@@ -359,10 +332,27 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile *pf)
lcode = charcode = FT_Get_First_Char(face, &glyph_index);
}
+ /* Blender default BFont is not "complete". */
+ const bool complete_font = (face->ascender != 0) && (face->descender != 0) &&
+ (face->ascender != face->descender);
+
+ if (complete_font) {
+ /* We can get descender as well, but we simple store descender in relation to the ascender.
+ * Also note that descender is stored as a negative number. */
+ vfd->ascender = (float)face->ascender / (face->ascender - face->descender);
+ }
+ else {
+ vfd->ascender = 0.8f;
+ vfd->em_height = 1.0f;
+ }
/* Adjust font size */
if (face->bbox.yMax != face->bbox.yMin) {
vfd->scale = (float)(1.0 / (double)(face->bbox.yMax - face->bbox.yMin));
+
+ if (complete_font) {
+ vfd->em_height = (float)(face->ascender - face->descender) / (face->bbox.yMax - face->bbox.yMin);
+ }
}
else {
vfd->scale = 1.0f / 1000.0f;
@@ -393,13 +383,6 @@ static int check_freetypefont(PackedFile *pf)
FT_Face face;
FT_GlyphSlot glyph;
FT_UInt glyph_index;
-#if 0
- FT_CharMap charmap;
- FT_CharMap found;
- FT_UShort my_platform_id = TT_PLATFORM_MICROSOFT;
- FT_UShort my_encoding_id = TT_MS_ID_UNICODE_CS;
- int n;
-#endif
int success = 0;
err = FT_New_Memory_Face(library,
@@ -412,23 +395,6 @@ static int check_freetypefont(PackedFile *pf)
//XXX error("This is not a valid font");
}
else {
-
-#if 0
- for (n = 0; n < face->num_charmaps; n++) {
- charmap = face->charmaps[n];
- if (charmap->platform_id == my_platform_id && charmap->encoding_id == my_encoding_id) {
- found = charmap;
- break;
- }
- }
-
- if (!found) { return 0; }
-
- /* now, select the charmap for the face object */
- err = FT_Set_Charmap(face, found);
- if (err) { return 0; }
-#endif
-
glyph_index = FT_Get_Char_Index(face, 'A');
err = FT_Load_Glyph(face, glyph_index, FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP);
if (err) {
@@ -533,22 +499,6 @@ VChar *BLI_vfontchar_copy(const VChar *vchar_src, const int UNUSED(flag))
return vchar_dst;
}
-#if 0
-
-/* Freetype2 Outline struct */
-
-typedef struct FT_Outline_ {
- short n_contours; /* number of contours in glyph */
- short n_points; /* number of points in the glyph */
-
- FT_Vector *points; /* the outline's points */
- char *tags; /* the points flags */
- short *contours; /* the contour end points */
-
- int flags; /* outline masks */
-} FT_Outline;
-
-#endif
/*
* from: http://www.freetype.org/freetype2/docs/glyphs/glyphs-6.html#section-1
diff --git a/source/blender/blenlib/intern/listbase.c b/source/blender/blenlib/intern/listbase.c
index 80b8a8d041c..da187fbd19d 100644
--- a/source/blender/blenlib/intern/listbase.c
+++ b/source/blender/blenlib/intern/listbase.c
@@ -68,6 +68,26 @@ void BLI_movelisttolist(ListBase *dst, ListBase *src)
}
/**
+ * moves the entire contents of \a src at the begining of \a dst.
+ */
+void BLI_movelisttolist_reverse(ListBase *dst, ListBase *src)
+{
+ if (src->first == NULL) return;
+
+ if (dst->first == NULL) {
+ dst->first = src->first;
+ dst->last = src->last;
+ }
+ else {
+ ((Link *)src->last)->next = dst->first;
+ ((Link *)dst->first)->prev = src->last;
+ dst->first = src->first;
+ }
+
+ src->first = src->last = NULL;
+}
+
+/**
* Prepends \a vlink (assumed to begin with a Link) onto listbase.
*/
void BLI_addhead(ListBase *listbase, void *vlink)
diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c
index c04fd79f7aa..eae82ff2f4f 100644
--- a/source/blender/blenlib/intern/math_geom.c
+++ b/source/blender/blenlib/intern/math_geom.c
@@ -548,8 +548,6 @@ float dist_signed_squared_to_corner_v3v3v3(
dist_b = dist_signed_squared_to_plane3_v3(s_p_v2, plane_b);
#endif
-
-
if (flip) {
return min_ff(dist_a, dist_b);
}
@@ -1123,6 +1121,70 @@ int isect_seg_seg_v2(const float v1[2], const float v2[2], const float v3[2], co
return ISECT_LINE_LINE_NONE;
}
+/* Returns a point on each segment that is closest to the other. */
+void isect_seg_seg_v3(
+ const float a0[3], const float a1[3],
+ const float b0[3], const float b1[3],
+ float r_a[3], float r_b[3])
+{
+ float fac_a, fac_b;
+ float a_dir[3], b_dir[3], a0b0[3], crs_ab[3];
+ sub_v3_v3v3(a_dir, a1, a0);
+ sub_v3_v3v3(b_dir, b1, b0);
+ sub_v3_v3v3(a0b0, b0, a0);
+ cross_v3_v3v3(crs_ab, b_dir, a_dir);
+ const float nlen = len_squared_v3(crs_ab);
+
+ if (nlen == 0.0f) {
+ /* Parallel Lines */
+ /* In this case return any point that
+ * is between the closest segments. */
+ float a0b1[3], a1b0[3], len_a, len_b, fac1, fac2;
+ sub_v3_v3v3(a0b1, b1, a0);
+ sub_v3_v3v3(a1b0, b0, a1);
+ len_a = len_squared_v3(a_dir);
+ len_b = len_squared_v3(b_dir);
+
+ if (len_a) {
+ fac1 = dot_v3v3(a0b0, a_dir);
+ fac2 = dot_v3v3(a0b1, a_dir);
+ CLAMP(fac1, 0.0f, len_a);
+ CLAMP(fac2, 0.0f, len_a);
+ fac_a = (fac1 + fac2) / (2 * len_a);
+ }
+ else {
+ fac_a = 0.0f;
+ }
+
+ if (len_b) {
+ fac1 = -dot_v3v3(a0b0, b_dir);
+ fac2 = -dot_v3v3(a1b0, b_dir);
+ CLAMP(fac1, 0.0f, len_b);
+ CLAMP(fac2, 0.0f, len_b);
+ fac_b = (fac1 + fac2) / (2 * len_b);
+ }
+ else {
+ fac_b = 0.0f;
+ }
+ }
+ else {
+ float c[3], cray[3];
+ sub_v3_v3v3(c, crs_ab, a0b0);
+
+ cross_v3_v3v3(cray, c, b_dir);
+ fac_a = dot_v3v3(cray, crs_ab) / nlen;
+
+ cross_v3_v3v3(cray, c, a_dir);
+ fac_b = dot_v3v3(cray, crs_ab) / nlen;
+
+ CLAMP(fac_a, 0.0f, 1.0f);
+ CLAMP(fac_b, 0.0f, 1.0f);
+ }
+
+ madd_v3_v3v3fl(r_a, a0, a_dir, fac_a);
+ madd_v3_v3v3fl(r_b, b0, b_dir, fac_b);
+}
+
/**
* Get intersection point of two 2D segments.
*
@@ -1392,90 +1454,6 @@ int isect_line_sphere_v2(const float l1[2], const float l2[2],
}
/* point in polygon (keep float and int versions in sync) */
-#if 0
-bool isect_point_poly_v2(const float pt[2], const float verts[][2], const unsigned int nr,
- const bool use_holes)
-{
- /* we do the angle rule, define that all added angles should be about zero or (2 * PI) */
- float angletot = 0.0;
- float fp1[2], fp2[2];
- unsigned int i;
- const float *p1, *p2;
-
- p1 = verts[nr - 1];
-
- /* first vector */
- fp1[0] = (float)(p1[0] - pt[0]);
- fp1[1] = (float)(p1[1] - pt[1]);
-
- for (i = 0; i < nr; i++) {
- p2 = verts[i];
-
- /* second vector */
- fp2[0] = (float)(p2[0] - pt[0]);
- fp2[1] = (float)(p2[1] - pt[1]);
-
- /* dot and angle and cross */
- angletot += angle_signed_v2v2(fp1, fp2);
-
- /* circulate */
- copy_v2_v2(fp1, fp2);
- p1 = p2;
- }
-
- angletot = fabsf(angletot);
- if (use_holes) {
- const float nested = floorf((angletot / (float)(M_PI * 2.0)) + 0.00001f);
- angletot -= nested * (float)(M_PI * 2.0);
- return (angletot > 4.0f) != ((int)nested % 2);
- }
- else {
- return (angletot > 4.0f);
- }
-}
-bool isect_point_poly_v2_int(const int pt[2], const int verts[][2], const unsigned int nr,
- const bool use_holes)
-{
- /* we do the angle rule, define that all added angles should be about zero or (2 * PI) */
- float angletot = 0.0;
- float fp1[2], fp2[2];
- unsigned int i;
- const int *p1, *p2;
-
- p1 = verts[nr - 1];
-
- /* first vector */
- fp1[0] = (float)(p1[0] - pt[0]);
- fp1[1] = (float)(p1[1] - pt[1]);
-
- for (i = 0; i < nr; i++) {
- p2 = verts[i];
-
- /* second vector */
- fp2[0] = (float)(p2[0] - pt[0]);
- fp2[1] = (float)(p2[1] - pt[1]);
-
- /* dot and angle and cross */
- angletot += angle_signed_v2v2(fp1, fp2);
-
- /* circulate */
- copy_v2_v2(fp1, fp2);
- p1 = p2;
- }
-
- angletot = fabsf(angletot);
- if (use_holes) {
- const float nested = floorf((angletot / (float)(M_PI * 2.0)) + 0.00001f);
- angletot -= nested * (float)(M_PI * 2.0);
- return (angletot > 4.0f) != ((int)nested % 2);
- }
- else {
- return (angletot > 4.0f);
- }
-}
-
-#else
-
bool isect_point_poly_v2(const float pt[2], const float verts[][2], const unsigned int nr,
const bool UNUSED(use_holes))
{
@@ -1505,8 +1483,6 @@ bool isect_point_poly_v2_int(const int pt[2], const int verts[][2], const unsign
return isect;
}
-#endif
-
/* point in tri */
/* only single direction */
@@ -2528,18 +2504,6 @@ bool isect_axial_line_segment_tri_v3(
float u, v, f;
int a0 = axis, a1 = (axis + 1) % 3, a2 = (axis + 2) % 3;
-#if 0
- return isect_line_segment_tri_v3(p1, p2, v0, v1, v2, lambda);
-
- /* first a simple bounding box test */
- if (min_fff(v0[a1], v1[a1], v2[a1]) > p1[a1]) return false;
- if (min_fff(v0[a2], v1[a2], v2[a2]) > p1[a2]) return false;
- if (max_fff(v0[a1], v1[a1], v2[a1]) < p1[a1]) return false;
- if (max_fff(v0[a2], v1[a2], v2[a2]) < p1[a2]) return false;
-
- /* then a full intersection test */
-#endif
-
sub_v3_v3v3(e1, v1, v0);
sub_v3_v3v3(e2, v2, v0);
sub_v3_v3v3(p, v0, p1);
@@ -2856,13 +2820,10 @@ float line_point_factor_v3_ex(
float dot;
sub_v3_v3v3(u, l2, l1);
sub_v3_v3v3(h, p, l1);
-#if 0
- return (dot_v3v3(u, h) / dot_v3v3(u, u));
-#else
+
/* better check for zero */
dot = len_squared_v3(u);
return (dot > epsilon) ? (dot_v3v3(u, h) / dot) : fallback;
-#endif
}
float line_point_factor_v3(
const float p[3], const float l1[3], const float l2[3])
@@ -2878,13 +2839,9 @@ float line_point_factor_v2_ex(
float dot;
sub_v2_v2v2(u, l2, l1);
sub_v2_v2v2(h, p, l1);
-#if 0
- return (dot_v2v2(u, h) / dot_v2v2(u, u));
-#else
/* better check for zero */
dot = len_squared_v2(u);
return (dot > epsilon) ? (dot_v2v2(u, h) / dot) : fallback;
-#endif
}
float line_point_factor_v2(const float p[2], const float l1[2], const float l2[2])
@@ -2906,8 +2863,9 @@ float line_plane_factor_v3(const float plane_co[3], const float plane_no[3],
return (dot != 0.0f) ? -dot_v3v3(plane_no, h) / dot : 0.0f;
}
-/** Ensure the distance between these points is no greater than 'dist'.
- * If it is, scale then both into the center.
+/**
+ * Ensure the distance between these points is no greater than 'dist'.
+ * If it is, scale then both into the center.
*/
void limit_dist_v3(float v1[3], float v2[3], const float dist)
{
@@ -2978,29 +2936,25 @@ static bool point_in_slice(const float p[3], const float v1[3], const float l1[3
return (h >= 0.0f && h <= 1.0f);
}
-#if 0
-
/* adult sister defining the slice planes by the origin and the normal
* NOTE |normal| may not be 1 but defining the thickness of the slice */
-static int point_in_slice_as(float p[3], float origin[3], float normal[3])
+static bool point_in_slice_as(float p[3], float origin[3], float normal[3])
{
float h, rp[3];
sub_v3_v3v3(rp, p, origin);
h = dot_v3v3(normal, rp) / dot_v3v3(normal, normal);
- if (h < 0.0f || h > 1.0f) return 0;
- return 1;
+ if (h < 0.0f || h > 1.0f) return false;
+ return true;
}
-/*mama (knowing the squared length of the normal) */
-static int point_in_slice_m(float p[3], float origin[3], float normal[3], float lns)
+bool point_in_slice_seg(float p[3], float l1[3], float l2[3])
{
- float h, rp[3];
- sub_v3_v3v3(rp, p, origin);
- h = dot_v3v3(normal, rp) / lns;
- if (h < 0.0f || h > 1.0f) return 0;
- return 1;
+ float normal[3];
+
+ sub_v3_v3v3(normal, l2, l1);
+
+ return point_in_slice_as(p, l1, normal);
}
-#endif
bool isect_point_tri_prism_v3(const float p[3], const float v1[3], const float v2[3], const float v3[3])
{
@@ -3468,8 +3422,8 @@ void transform_point_by_tri_v3(
{
/* this works by moving the source triangle so its normal is pointing on the Z
* axis where its barycentric weights can be calculated in 2D and its Z offset can
- * be re-applied. The weights are applied directly to the targets 3D points and the
- * z-depth is used to scale the targets normal as an offset.
+ * be re-applied. The weights are applied directly to the targets 3D points and the
+ * z-depth is used to scale the targets normal as an offset.
* This saves transforming the target into its Z-Up orientation and back (which could also work) */
float no_tar[3], no_src[3];
float mat_src[3][3];
diff --git a/source/blender/blenlib/intern/math_interp.c b/source/blender/blenlib/intern/math_interp.c
index 8c361673715..b93a7f55821 100644
--- a/source/blender/blenlib/intern/math_interp.c
+++ b/source/blender/blenlib/intern/math_interp.c
@@ -44,7 +44,7 @@
***************************************************************************/
/* BICUBIC Interpolation functions
- * More info: http://wiki.blender.org/index.php/User:Damiles#Bicubic_pixel_interpolation
+ * More info: http://wiki.blender.org/index.php/User:Damiles#Bicubic_pixel_interpolation
* function assumes out to be zero'ed, only does RGBA */
static float P(float k)
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c
index 48bc1a2928b..df7548a9387 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -1011,6 +1011,11 @@ int compare_m4m4(const float mat1[4][4], const float mat2[4][4], float limit)
return 0;
}
+/**
+ * Make an orthonormal matrix around the selected axis of the given matrix.
+ *
+ * \param axis: Axis to build the orthonormal basis around.
+ */
void orthogonalize_m3(float mat[3][3], int axis)
{
float size[3];
@@ -1095,6 +1100,11 @@ void orthogonalize_m3(float mat[3][3], int axis)
mul_v3_fl(mat[2], size[2]);
}
+/**
+ * Make an orthonormal matrix around the selected axis of the given matrix.
+ *
+ * \param axis: Axis to build the orthonormal basis around.
+ */
void orthogonalize_m4(float mat[4][4], int axis)
{
float size[3];
diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c
index 29e7cf32ddc..17b395036a3 100644
--- a/source/blender/blenlib/intern/math_rotation.c
+++ b/source/blender/blenlib/intern/math_rotation.c
@@ -1872,19 +1872,24 @@ void dquat_to_mat4(float mat[4][4], const DualQuat *dq)
/* normalize */
len = sqrtf(dot_qtqt(q0, q0));
- if (len != 0.0f)
- mul_qt_fl(q0, 1.0f / len);
+ if (len != 0.0f) {
+ len = 1.0f / len;
+ }
+ mul_qt_fl(q0, len);
/* rotation */
quat_to_mat4(mat, q0);
/* translation */
t = dq->trans;
- mat[3][0] = 2.0f * (-t[0] * q0[1] + t[1] * q0[0] - t[2] * q0[3] + t[3] * q0[2]);
- mat[3][1] = 2.0f * (-t[0] * q0[2] + t[1] * q0[3] + t[2] * q0[0] - t[3] * q0[1]);
- mat[3][2] = 2.0f * (-t[0] * q0[3] - t[1] * q0[2] + t[2] * q0[1] + t[3] * q0[0]);
+ mat[3][0] = 2.0f * (-t[0] * q0[1] + t[1] * q0[0] - t[2] * q0[3] + t[3] * q0[2]) * len;
+ mat[3][1] = 2.0f * (-t[0] * q0[2] + t[1] * q0[3] + t[2] * q0[0] - t[3] * q0[1]) * len;
+ mat[3][2] = 2.0f * (-t[0] * q0[3] - t[1] * q0[2] + t[2] * q0[1] + t[3] * q0[0]) * len;
- /* note: this does not handle scaling */
+ /* scaling */
+ if (dq->scale_weight) {
+ mul_m4_m4m4(mat, mat, dq->scale);
+ }
}
void add_weighted_dq_dq(DualQuat *dqsum, const DualQuat *dq, float weight)
diff --git a/source/blender/blenlib/intern/math_solvers.c b/source/blender/blenlib/intern/math_solvers.c
index e3174d8340a..7b9727ead8e 100644
--- a/source/blender/blenlib/intern/math_solvers.c
+++ b/source/blender/blenlib/intern/math_solvers.c
@@ -179,3 +179,98 @@ bool BLI_tridiagonal_solve_cyclic(const float *a, const float *b, const float *c
return success;
}
+
+/**
+ * \brief Solve a generic f(x) = 0 equation using Newton's method.
+ *
+ * \param func_delta Callback computing the value of f(x).
+ * \param func_jacobian Callback computing the Jacobian matrix of the function at x.
+ * \param func_correction Callback for forcing the search into an arbitrary custom domain. May be NULL.
+ * \param userdata Data for the callbacks.
+ * \param epsilon Desired precision.
+ * \param max_iterations Limit on the iterations.
+ * \param max_corrections Limit on the number of times the correction callback can fire before giving up.
+ * \param trace Enables logging to console.
+ * \param x_init Initial solution vector.
+ * \param result Final result.
+ * \return true if success
+ */
+bool BLI_newton3d_solve(
+ Newton3D_DeltaFunc func_delta, Newton3D_JacobianFunc func_jacobian, Newton3D_CorrectionFunc func_correction, void *userdata,
+ float epsilon, int max_iterations, bool trace, const float x_init[3], float result[3])
+{
+ float fdelta[3], fdeltav, next_fdeltav;
+ float jacobian[3][3], step[3], x[3], x_next[3];
+
+ epsilon *= epsilon;
+
+ copy_v3_v3(x, x_init);
+
+ func_delta(userdata, x, fdelta);
+ fdeltav = len_squared_v3(fdelta);
+
+ if (trace) {
+ printf("START (%g, %g, %g) %g\n", x[0], x[1], x[2], fdeltav);
+ }
+
+ for (int i = 0; i < max_iterations && fdeltav > epsilon; i++) {
+ /* Newton's method step. */
+ func_jacobian(userdata, x, jacobian);
+
+ if (!invert_m3(jacobian)) {
+ return false;
+ }
+
+ mul_v3_m3v3(step, jacobian, fdelta);
+ sub_v3_v3v3(x_next, x, step);
+
+ /* Custom out-of-bounds value correction. */
+ if (func_correction) {
+ if (trace) {
+ printf("%3d * (%g, %g, %g)\n", i, x_next[0], x_next[1], x_next[2]);
+ }
+
+ if (!func_correction(userdata, x, step, x_next)) {
+ return false;
+ }
+ }
+
+ func_delta(userdata, x_next, fdelta);
+ next_fdeltav = len_squared_v3(fdelta);
+
+ if (trace) {
+ printf("%3d ? (%g, %g, %g) %g\n", i, x_next[0], x_next[1], x_next[2], next_fdeltav);
+ }
+
+ /* Line search correction. */
+ while (next_fdeltav > fdeltav) {
+ float g0 = sqrtf(fdeltav), g1 = sqrtf(next_fdeltav);
+ float g01 = -g0 / len_v3(step);
+ float det = 2.0f * (g1 - g0 - g01);
+ float l = (det == 0.0f) ? 0.1f : -g01 / det;
+ CLAMP_MIN(l, 0.1f);
+
+ mul_v3_fl(step, l);
+ sub_v3_v3v3(x_next, x, step);
+
+ func_delta(userdata, x_next, fdelta);
+ next_fdeltav = len_squared_v3(fdelta);
+
+ if (trace) {
+ printf("%3d . (%g, %g, %g) %g\n", i, x_next[0], x_next[1], x_next[2], next_fdeltav);
+ }
+ }
+
+ copy_v3_v3(x, x_next);
+ fdeltav = next_fdeltav;
+ }
+
+ bool success = (fdeltav <= epsilon);
+
+ if (trace) {
+ printf("%s (%g, %g, %g) %g\n", success ? "OK " : "FAIL", x[0], x[1], x[2], fdeltav);
+ }
+
+ copy_v3_v3(result, x);
+ return success;
+}
diff --git a/source/blender/blenlib/intern/math_vector_inline.c b/source/blender/blenlib/intern/math_vector_inline.c
index c4535eacefa..dbb2339461f 100644
--- a/source/blender/blenlib/intern/math_vector_inline.c
+++ b/source/blender/blenlib/intern/math_vector_inline.c
@@ -459,6 +459,14 @@ MINLINE void mul_v4_fl(float r[4], float f)
r[3] *= f;
}
+MINLINE void mul_v4_v4(float r[4], const float a[4])
+{
+ r[0] *= a[0];
+ r[1] *= a[1];
+ r[2] *= a[2];
+ r[3] *= a[3];
+}
+
MINLINE void mul_v4_v4fl(float r[4], const float a[4], float f)
{
r[0] = a[0] * f;
@@ -607,6 +615,12 @@ MINLINE void mul_v3_v3v3(float r[3], const float v1[3], const float v2[3])
r[2] = v1[2] * v2[2];
}
+MINLINE void mul_v2_v2v2(float r[2], const float a[2], const float b[2])
+{
+ r[0] = a[0] * b[0];
+ r[1] = a[1] * b[1];
+}
+
MINLINE void negate_v2(float r[2])
{
r[0] = -r[0];
@@ -1100,24 +1114,23 @@ MINLINE bool compare_v4v4_relative(const float v1[4], const float v2[4], const f
MINLINE bool compare_len_v3v3(const float v1[3], const float v2[3], const float limit)
{
- float x, y, z;
-
- x = v1[0] - v2[0];
- y = v1[1] - v2[1];
- z = v1[2] - v2[2];
-
- return ((x * x + y * y + z * z) <= (limit * limit));
+ float d[3];
+ sub_v3_v3v3(d, v1, v2);
+ return (dot_v3v3(d, d) <= (limit * limit));
}
MINLINE bool compare_len_squared_v3v3(const float v1[3], const float v2[3], const float limit_sq)
{
- float x, y, z;
-
- x = v1[0] - v2[0];
- y = v1[1] - v2[1];
- z = v1[2] - v2[2];
+ float d[3];
+ sub_v3_v3v3(d, v1, v2);
+ return (dot_v3v3(d, d) <= limit_sq);
+}
- return ((x * x + y * y + z * z) <= limit_sq);
+MINLINE bool compare_len_squared_v4v4(const float v1[4], const float v2[4], const float limit_sq)
+{
+ float d[4];
+ sub_v4_v4v4(d, v1, v2);
+ return (dot_v4v4(d, d) <= limit_sq);
}
/**
diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c
index 075ae2f5357..8ee99544ca5 100644
--- a/source/blender/blenlib/intern/noise.c
+++ b/source/blender/blenlib/intern/noise.c
@@ -1092,26 +1092,6 @@ static float noise3_perlin(float vec[3])
#undef SURVE
}
-#if 0
-static float turbulence_perlin(const float point[3], float lofreq, float hifreq)
-{
- float freq, t, p[3];
-
- p[0] = point[0] + 123.456;
- p[1] = point[1];
- p[2] = point[2];
-
- t = 0;
- for (freq = lofreq; freq < hifreq; freq *= 2.0) {
- t += fabsf(noise3_perlin(p)) / freq;
- p[0] *= 2.0f;
- p[1] *= 2.0f;
- p[2] *= 2.0f;
- }
- return t - 0.3; /* readjust to make mean value = 0.0 */
-}
-#endif
-
/* for use with BLI_gNoise/gTurbulence, returns signed noise */
static float orgPerlinNoise(float x, float y, float z)
{
@@ -1147,19 +1127,6 @@ float BLI_hnoisep(float noisesize, float x, float y, float z)
return noise3_perlin(vec);
}
-#if 0
-static float turbulencep(float noisesize, float x, float y, float z, int nr)
-{
- float vec[3];
-
- vec[0] = x / noisesize;
- vec[1] = y / noisesize;
- vec[2] = z / noisesize;
- nr++;
- return turbulence_perlin(vec, 1.0, (float)(1 << nr));
-}
-#endif
-
/******************/
/* VORONOI/WORLEY */
/******************/
diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c
index 6272f2109d2..a7118a583b5 100644
--- a/source/blender/blenlib/intern/path_util.c
+++ b/source/blender/blenlib/intern/path_util.c
@@ -928,6 +928,48 @@ bool BLI_path_frame_check_chars(const char *path)
}
/**
+ * Creates a display string from path to be used menus and the user interface.
+ * Like bpy.path.display_name().
+ */
+void BLI_path_to_display_name(char *display_name, int maxlen, const char *name)
+{
+ /* Strip leading underscores and spaces. */
+ int strip_offset = 0;
+ while (ELEM(name[strip_offset], '_', ' ')) {
+ strip_offset++;
+ }
+
+ BLI_strncpy(display_name, name + strip_offset, maxlen);
+
+ /* Replace underscores with spaces. */
+ BLI_str_replace_char(display_name, '_', ' ');
+
+ /* Strip extension. */
+ BLI_path_extension_replace(display_name, maxlen, "");
+
+ /* Test if string has any upper case characters. */
+ bool all_lower = true;
+ for (int i = 0; display_name[i]; i++) {
+ if (isupper(display_name[i])) {
+ all_lower = false;
+ break;
+ }
+ }
+
+ if (all_lower) {
+ /* For full lowercase string, use title case. */
+ bool prevspace = true;
+ for (int i = 0; display_name[i]; i++) {
+ if (prevspace) {
+ display_name[i] = toupper(display_name[i]);
+ }
+
+ prevspace = isspace(display_name[i]);
+ }
+ }
+}
+
+/**
* If path begins with "//", strips that and replaces it with basepath directory.
*
* \note Also converts drive-letter prefix to something more sensible
@@ -1095,7 +1137,7 @@ bool BLI_path_program_extensions_add_win32(char *name, const size_t maxlen)
if ((type == 0) || S_ISDIR(type)) {
/* typically 3-5, ".EXE", ".BAT"... etc */
const int ext_max = 12;
- const char *ext = getenv("PATHEXT");
+ const char *ext = BLI_getenv("PATHEXT");
if (ext) {
const int name_len = strlen(name);
char *filename = alloca(name_len + ext_max);
@@ -1152,7 +1194,7 @@ bool BLI_path_program_search(
const char separator = ':';
#endif
- path = getenv("PATH");
+ path = BLI_getenv("PATH");
if (path) {
char filename[FILE_MAX];
const char *temp;
@@ -1160,12 +1202,12 @@ bool BLI_path_program_search(
do {
temp = strchr(path, separator);
if (temp) {
- strncpy(filename, path, temp - path);
+ memcpy(filename, path, temp - path);
filename[temp - path] = 0;
path = temp + 1;
}
else {
- strncpy(filename, path, sizeof(filename));
+ BLI_strncpy(filename, path, sizeof(filename));
}
BLI_path_append(filename, maxlen, name);
@@ -1220,11 +1262,28 @@ void BLI_setenv(const char *env, const char *val)
*/
void BLI_setenv_if_new(const char *env, const char *val)
{
- if (getenv(env) == NULL)
+ if (BLI_getenv(env) == NULL)
BLI_setenv(env, val);
}
/**
+* get an env var, result has to be used immediately
+*/
+const char *BLI_getenv(const char *env)
+{
+#ifdef _MSC_VER
+ static char buffer[32767]; /* 32767 is the total size of the environment block on windows*/
+ if (GetEnvironmentVariableA(env, buffer, sizeof(buffer)))
+ return buffer;
+ else
+ return NULL;
+#else
+ return getenv(env);
+#endif
+}
+
+
+/**
* Strips off nonexistent (or non-accessible) subdirectories from the end of *dir, leaving the path of
* the lowest-level directory that does exist and we can read.
*/
@@ -1284,16 +1343,6 @@ void BLI_make_file_string(const char *relabase, char *string, const char *dir, c
return; /* string is NULL, probably shouldnt happen but return anyway */
}
-
- /* we first push all slashes into unix mode, just to make sure we don't get
- * any mess with slashes later on. -jesterKing */
- /* constant strings can be passed for those parameters - don't change them - elubie */
-#if 0
- BLI_str_replace_char(relabase, '\\', '/');
- BLI_str_replace_char(dir, '\\', '/');
- BLI_str_replace_char(file, '\\', '/');
-#endif
-
/* Resolve relative references */
if (relabase && dir[0] == '/' && dir[1] == '/') {
char *lslash;
diff --git a/source/blender/blenlib/intern/rand.c b/source/blender/blenlib/intern/rand.c
index 8613a0ea6dd..c85b471fb2d 100644
--- a/source/blender/blenlib/intern/rand.c
+++ b/source/blender/blenlib/intern/rand.c
@@ -42,7 +42,7 @@
#include "BLI_math.h"
/* defines BLI_INLINE */
-#include "BLI_utildefines.h"
+#include "BLI_compiler_compat.h"
#include "BLI_sys_types.h"
#include "BLI_strict_flags.h"
diff --git a/source/blender/blenlib/intern/rct.c b/source/blender/blenlib/intern/rct.c
index 764b12431d0..5b1e378a2da 100644
--- a/source/blender/blenlib/intern/rct.c
+++ b/source/blender/blenlib/intern/rct.c
@@ -39,8 +39,10 @@
#include <limits.h>
#include <float.h>
-#include "DNA_vec_types.h"
#include "BLI_rect.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_vec_types.h"
/* avoid including BLI_math */
static void unit_m4(float m[4][4]);
@@ -161,14 +163,14 @@ float BLI_rctf_length_y(const rctf *rect, const float y)
/**
* is \a rct_b inside \a rct_a
*/
-bool BLI_rctf_inside_rctf(rctf *rct_a, const rctf *rct_b)
+bool BLI_rctf_inside_rctf(const rctf *rct_a, const rctf *rct_b)
{
return ((rct_a->xmin <= rct_b->xmin) &&
(rct_a->xmax >= rct_b->xmax) &&
(rct_a->ymin <= rct_b->ymin) &&
(rct_a->ymax >= rct_b->ymax));
}
-bool BLI_rcti_inside_rcti(rcti *rct_a, const rcti *rct_b)
+bool BLI_rcti_inside_rcti(const rcti *rct_a, const rcti *rct_b)
{
return ((rct_a->xmin <= rct_b->xmin) &&
(rct_a->xmax >= rct_b->xmax) &&
diff --git a/source/blender/blenlib/intern/scanfill.c b/source/blender/blenlib/intern/scanfill.c
index f1564d132e3..427a3eb1edb 100644
--- a/source/blender/blenlib/intern/scanfill.c
+++ b/source/blender/blenlib/intern/scanfill.c
@@ -811,38 +811,6 @@ unsigned int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, const int flag, const
}
#endif
-#if 0
- if (flag & BLI_SCANFILL_CALC_QUADTRI_FASTPATH) {
- const int totverts = BLI_listbase_count(&sf_ctx->fillvertbase);
-
- if (totverts == 3) {
- eve = sf_ctx->fillvertbase.first;
-
- addfillface(sf_ctx, eve, eve->next, eve->next->next);
- return 1;
- }
- else if (totverts == 4) {
- float vec1[3], vec2[3];
-
- eve = sf_ctx->fillvertbase.first;
- /* no need to check 'eve->next->next->next' is valid, already counted */
- /* use shortest diagonal for quad */
- sub_v3_v3v3(vec1, eve->co, eve->next->next->co);
- sub_v3_v3v3(vec2, eve->next->co, eve->next->next->next->co);
-
- if (dot_v3v3(vec1, vec1) < dot_v3v3(vec2, vec2)) {
- addfillface(sf_ctx, eve, eve->next, eve->next->next);
- addfillface(sf_ctx, eve->next->next, eve->next->next->next, eve);
- }
- else {
- addfillface(sf_ctx, eve->next, eve->next->next, eve->next->next->next);
- addfillface(sf_ctx, eve->next->next->next, eve, eve->next);
- }
- return 2;
- }
- }
-#endif
-
/* first test vertices if they are in edges */
/* including resetting of flags */
for (eed = sf_ctx->filledgebase.first; eed; eed = eed->next) {
diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c
index f69b35ce5a9..cfcc2bc4390 100644
--- a/source/blender/blenlib/intern/storage.c
+++ b/source/blender/blenlib/intern/storage.c
@@ -85,7 +85,7 @@
*/
char *BLI_current_working_dir(char *dir, const size_t maxncpy)
{
- const char *pwd = getenv("PWD");
+ const char *pwd = BLI_getenv("PWD");
if (pwd) {
size_t srclen = BLI_strnlen(pwd, maxncpy);
if (srclen != maxncpy) {
diff --git a/source/blender/blenlib/intern/string_utils.c b/source/blender/blenlib/intern/string_utils.c
index de24fc4d1f5..296086ed652 100644
--- a/source/blender/blenlib/intern/string_utils.c
+++ b/source/blender/blenlib/intern/string_utils.c
@@ -326,15 +326,13 @@ bool BLI_uniquename_cb(
# define GIVE_STRADDR(data, offset) ( ((char *)data) + offset)
#endif
-/* Generic function to set a unique name. It is only designed to be used in situations
+/**
+ * Generic function to set a unique name. It is only designed to be used in situations
* where the name is part of the struct.
*
* For places where this is used, see constraint.c for example...
*
- * name_offs: should be calculated using offsetof(structname, membername) macro from stddef.h
- * len: maximum length of string (to prevent overflows, etc.)
- * defname: the name that should be used by default if none is specified already
- * delim: the character which acts as a delimiter between parts of the name
+ * \param name_offs: should be calculated using offsetof(structname, membername) macro from stddef.h
*/
static bool uniquename_find_dupe(ListBase *list, void *vlink, const char *name, int name_offs)
{
diff --git a/source/blender/blenlib/intern/task.c b/source/blender/blenlib/intern/task.c
index 5d3c6b35ac1..75242350c66 100644
--- a/source/blender/blenlib/intern/task.c
+++ b/source/blender/blenlib/intern/task.c
@@ -116,7 +116,7 @@ typedef struct Task {
* At this moment task queue owns the memory.
*
* - When task is done and task_free() is called the memory will be put to the
- * pool which corresponds to a thread which handled the task.
+ * pool which corresponds to a thread which handled the task.
*/
typedef struct TaskMemPool {
/* Number of pre-allocated tasks in the pool. */
@@ -816,7 +816,7 @@ static void task_pool_push(
return;
}
}
- /* Do push to a global execution ppol, slowest possible method,
+ /* Do push to a global execution pool, slowest possible method,
* causes quite reasonable amount of threading overhead.
*/
task_scheduler_push(pool->scheduler, task, priority);
diff --git a/source/blender/blenloader/BLO_readfile.h b/source/blender/blenloader/BLO_readfile.h
index 9758ec8b560..ef02e7d7034 100644
--- a/source/blender/blenloader/BLO_readfile.h
+++ b/source/blender/blenloader/BLO_readfile.h
@@ -156,7 +156,10 @@ void BLO_expand_main(void *fdhandle, struct Main *mainvar);
/* Update defaults in startup.blend & userprefs.blend, without having to save and embed it */
void BLO_update_defaults_userpref_blend(void);
-void BLO_update_defaults_startup_blend(struct Main *mainvar);
+void BLO_update_defaults_startup_blend(struct Main *mainvar, const char *app_template);
+
+/* Version patch user preferences. */
+void BLO_version_defaults_userpref_blend(struct Main *mainvar, struct UserDef *userdef);
struct BlendThumbnail *BLO_thumbnail_from_file(const char *filepath);
diff --git a/source/blender/blenloader/CMakeLists.txt b/source/blender/blenloader/CMakeLists.txt
index f2b7f35d353..e0453e71a05 100644
--- a/source/blender/blenloader/CMakeLists.txt
+++ b/source/blender/blenloader/CMakeLists.txt
@@ -59,6 +59,7 @@ set(SRC
intern/versioning_280.c
intern/versioning_defaults.c
intern/versioning_legacy.c
+ intern/versioning_userdef.c
intern/writefile.c
BLO_blend_defs.h
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 76afe05276f..7ccfa385e58 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -127,6 +127,7 @@
#include "BKE_cachefile.h"
#include "BKE_cloth.h"
#include "BKE_collection.h"
+#include "BKE_colortools.h"
#include "BKE_constraint.h"
#include "BKE_context.h"
#include "BKE_curve.h"
@@ -135,15 +136,15 @@
#include "BKE_global.h" // for G
#include "BKE_gpencil.h"
#include "BKE_gpencil_modifier.h"
+#include "BKE_idcode.h"
+#include "BKE_idprop.h"
#include "BKE_layer.h"
-#include "BKE_library.h" // for which_libbase
+#include "BKE_library.h"
#include "BKE_library_idmap.h"
#include "BKE_library_override.h"
#include "BKE_library_query.h"
-#include "BKE_idcode.h"
-#include "BKE_idprop.h"
-#include "BKE_material.h"
#include "BKE_main.h" // for Main
+#include "BKE_material.h"
#include "BKE_mesh.h" // for ME_ defines (patching)
#include "BKE_mesh_runtime.h"
#include "BKE_modifier.h"
@@ -151,6 +152,7 @@
#include "BKE_node.h" // for tree type defines
#include "BKE_object.h"
#include "BKE_ocean.h"
+#include "BKE_outliner_treehash.h"
#include "BKE_paint.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
@@ -159,9 +161,7 @@
#include "BKE_screen.h"
#include "BKE_sequencer.h"
#include "BKE_shader_fx.h"
-#include "BKE_outliner_treehash.h"
#include "BKE_sound.h"
-#include "BKE_colortools.h"
#include "BKE_workspace.h"
#include "DRW_engine.h"
@@ -341,12 +341,6 @@ static void oldnewmap_insert(OldNewMap *onm, const void *oldaddr, void *newaddr,
if (oldaddr==NULL || newaddr==NULL) return;
- for (int i = 0; i < onm->nentries; i++) {
- if (onm->entries[i].old == oldaddr && onm->entries[i].newp != newaddr) {
- abort();
- }
- }
-
if (UNLIKELY(onm->nentries == onm->entriessize)) {
onm->entriessize *= 2;
onm->entries = MEM_reallocN(onm->entries, sizeof(*onm->entries) * onm->entriessize);
@@ -681,7 +675,7 @@ static Main *blo_find_main(FileData *fd, const char *filepath, const char *relab
/* Add library datablock itself to 'main' Main, since libraries are **never** linked data.
* Fixes bug where you could end with all ID_LI datablocks having the same name... */
- lib = BKE_libblock_alloc(mainlist->first, ID_LI, "Lib", 0);
+ lib = BKE_libblock_alloc(mainlist->first, ID_LI, BLI_path_basename(filepath), 0);
lib->id.us = ID_FAKE_USERS(lib); /* Important, consistency with main ID reading code from read_libblock(). */
BLI_strncpy(lib->name, filepath, sizeof(lib->name));
BLI_strncpy(lib->filepath, name1, sizeof(lib->filepath));
@@ -2682,6 +2676,7 @@ static void direct_link_fcurves(FileData *fd, ListBase *list)
/* compiled expression data will need to be regenerated (old pointer may still be set here) */
driver->expr_comp = NULL;
+ driver->expr_simple = NULL;
/* give the driver a fresh chance - the operating environment may be different now
* (addons, etc. may be different) so the driver namespace may be sane now [#32155]
@@ -2956,15 +2951,13 @@ static void lib_link_workspaces(FileData *fd, Main *bmain)
id_us_ensure_real(id);
for (WorkSpaceLayout *layout = layouts->first, *layout_next; layout; layout = layout_next) {
- bScreen *screen = newlibadr(fd, id->lib, BKE_workspace_layout_screen_get(layout));
+ layout->screen = newlibadr_us(fd, id->lib, layout->screen);
layout_next = layout->next;
- if (screen) {
- BKE_workspace_layout_screen_set(layout, screen);
-
+ if (layout->screen) {
if (ID_IS_LINKED(id)) {
- screen->winid = 0;
- if (screen->temp) {
+ layout->screen->winid = 0;
+ if (layout->screen->temp) {
/* delete temp layouts when appending */
BKE_workspace_layout_remove(bmain, workspace, layout);
}
@@ -3509,6 +3502,14 @@ static void direct_link_constraints(FileData *fd, ListBase *lb)
IDP_DirectLinkGroup_OrFree(&data->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
break;
}
+ case CONSTRAINT_TYPE_ARMATURE:
+ {
+ bArmatureConstraint *data= con->data;
+
+ link_list(fd, &data->targets);
+
+ break;
+ }
case CONSTRAINT_TYPE_SPLINEIK:
{
bSplineIKConstraint *data= con->data;
@@ -3554,7 +3555,7 @@ static void lib_link_pose(FileData *fd, Main *bmain, Object *ob, bPose *pose)
bool rebuild = false;
if (fd->memfile == NULL) {
- if (ob->proxy || (ob->id.lib==NULL && arm->id.lib)) {
+ if (ob->proxy || ob->id.lib != arm->id.lib) {
rebuild = true;
}
}
@@ -3636,6 +3637,9 @@ static void direct_link_bones(FileData *fd, Bone *bone)
bone->prop = newdataadr(fd, bone->prop);
IDP_DirectLinkGroup_OrFree(&bone->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
+ bone->bbone_next = newdataadr(fd, bone->bbone_next);
+ bone->bbone_prev = newdataadr(fd, bone->bbone_prev);
+
bone->flag &= ~BONE_DRAW_ACTIVE;
link_list(fd, &bone->childbase);
@@ -5173,6 +5177,9 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
smd->domain->tex = NULL;
smd->domain->tex_shadow = NULL;
smd->domain->tex_flame = NULL;
+ smd->domain->tex_flame_coba = NULL;
+ smd->domain->tex_coba = NULL;
+ smd->domain->tex_field = NULL;
smd->domain->tex_velocity_x = NULL;
smd->domain->tex_velocity_y = NULL;
smd->domain->tex_velocity_z = NULL;
@@ -5206,7 +5213,7 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
smd->coll = NULL;
smd->flow = newdataadr(fd, smd->flow);
smd->flow->smd = smd;
- smd->flow->dm = NULL;
+ smd->flow->mesh = NULL;
smd->flow->verts_old = NULL;
smd->flow->numverts = 0;
smd->flow->psys = newdataadr(fd, smd->flow->psys);
@@ -5219,7 +5226,7 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
smd->coll->smd = smd;
smd->coll->verts_old = NULL;
smd->coll->numverts = 0;
- smd->coll->dm = NULL;
+ smd->coll->mesh = NULL;
}
else {
smd->type = 0;
@@ -5235,7 +5242,7 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
if (pmd->canvas) {
pmd->canvas = newdataadr(fd, pmd->canvas);
pmd->canvas->pmd = pmd;
- pmd->canvas->dm = NULL;
+ pmd->canvas->mesh = NULL;
pmd->canvas->flags &= ~MOD_DPAINT_BAKING; /* just in case */
if (pmd->canvas->surfaces.first) {
@@ -5258,7 +5265,7 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
pmd->brush->psys = newdataadr(fd, pmd->brush->psys);
pmd->brush->paint_ramp = newdataadr(fd, pmd->brush->paint_ramp);
pmd->brush->vel_ramp = newdataadr(fd, pmd->brush->vel_ramp);
- pmd->brush->dm = NULL;
+ pmd->brush->mesh = NULL;
}
}
else if (md->type == eModifierType_Collision) {
@@ -5696,7 +5703,13 @@ static void direct_link_object(FileData *fd, Object *ob)
CLAMP(ob->rotmode, ROT_MODE_MIN, ROT_MODE_MAX);
if (ob->sculpt) {
- ob->sculpt = MEM_callocN(sizeof(SculptSession), "reload sculpt session");
+ if (ob->mode & OB_MODE_ALL_SCULPT) {
+ ob->sculpt = MEM_callocN(sizeof(SculptSession), "reload sculpt session");
+ ob->sculpt->mode_type = ob->mode;
+ }
+ else {
+ ob->sculpt = NULL;
+ }
}
link_list(fd, &ob->lodlevels);
@@ -5787,6 +5800,9 @@ static void lib_link_view_layer(FileData *fd, Library *lib, ViewLayer *view_laye
if (base->object == NULL) {
/* Free in case linked object got lost. */
BLI_freelinkN(&view_layer->object_bases, base);
+ if (view_layer->basact == base) {
+ view_layer->basact = NULL;
+ }
}
}
@@ -5918,8 +5934,15 @@ static void link_paint(FileData *fd, Scene *sce, Paint *p)
{
if (p) {
p->brush = newlibadr_us(fd, sce->id.lib, p->brush);
+ for (int i = 0; i < p->tool_slots_len; i++) {
+ if (p->tool_slots[i].brush != NULL) {
+ p->tool_slots[i].brush = newlibadr_us(fd, sce->id.lib, p->tool_slots[i].brush);
+ }
+ }
p->palette = newlibadr_us(fd, sce->id.lib, p->palette);
p->paint_cursor = NULL;
+
+ BKE_paint_runtime_init(sce->toolsettings, p);
}
}
@@ -6203,7 +6226,7 @@ static void link_recurs_seq(FileData *fd, ListBase *lb)
}
}
-static void direct_link_paint(FileData *fd, Paint *p)
+static void direct_link_paint(FileData *fd, const Scene *scene, Paint *p)
{
if (p->num_input_samples < 1)
p->num_input_samples = 1;
@@ -6213,15 +6236,19 @@ static void direct_link_paint(FileData *fd, Paint *p)
direct_link_curvemapping(fd, p->cavity_curve);
else
BKE_paint_cavity_curve_preset(p, CURVE_PRESET_LINE);
+
+ p->tool_slots = newdataadr(fd, p->tool_slots);
+
+ BKE_paint_runtime_init(scene->toolsettings, p);
}
-static void direct_link_paint_helper(FileData *fd, Paint **paint)
+static void direct_link_paint_helper(FileData *fd, const Scene *scene, Paint **paint)
{
/* TODO. is this needed */
(*paint) = newdataadr(fd, (*paint));
if (*paint) {
- direct_link_paint(fd, *paint);
+ direct_link_paint(fd, scene, *paint);
}
}
@@ -6260,7 +6287,6 @@ static void direct_link_scene(FileData *fd, Scene *sce)
sce->depsgraph_hash = NULL;
sce->fps_info = NULL;
sce->customdata_mask_modal = 0;
- sce->lay_updated = 0;
BKE_sound_create_scene(sce);
@@ -6279,13 +6305,13 @@ static void direct_link_scene(FileData *fd, Scene *sce)
sce->toolsettings= newdataadr(fd, sce->toolsettings);
if (sce->toolsettings) {
- direct_link_paint_helper(fd, (Paint**)&sce->toolsettings->sculpt);
- direct_link_paint_helper(fd, (Paint**)&sce->toolsettings->vpaint);
- direct_link_paint_helper(fd, (Paint**)&sce->toolsettings->wpaint);
- direct_link_paint_helper(fd, (Paint**)&sce->toolsettings->uvsculpt);
- direct_link_paint_helper(fd, (Paint**)&sce->toolsettings->gp_paint);
+ direct_link_paint_helper(fd, sce, (Paint**)&sce->toolsettings->sculpt);
+ direct_link_paint_helper(fd, sce, (Paint**)&sce->toolsettings->vpaint);
+ direct_link_paint_helper(fd, sce, (Paint**)&sce->toolsettings->wpaint);
+ direct_link_paint_helper(fd, sce, (Paint**)&sce->toolsettings->uvsculpt);
+ direct_link_paint_helper(fd, sce, (Paint**)&sce->toolsettings->gp_paint);
- direct_link_paint(fd, &sce->toolsettings->imapaint.paint);
+ direct_link_paint(fd, sce, &sce->toolsettings->imapaint.paint);
sce->toolsettings->imapaint.paintcursor = NULL;
sce->toolsettings->particle.paintcursor = NULL;
@@ -6589,9 +6615,6 @@ static void direct_link_gpencil(FileData *fd, bGPdata *gpd)
}
}
- /* clear drawing cache */
- gpd->runtime.batch_cache_data = NULL;
-
/* materials */
gpd->mat = newdataadr(fd, gpd->mat);
test_pointer_array(fd, (void **)&gpd->mat);
@@ -6605,7 +6628,8 @@ static void direct_link_gpencil(FileData *fd, bGPdata *gpd)
gpl->actframe = newdataadr(fd, gpl->actframe);
- gpl->runtime.derived_data = NULL;
+ gpl->runtime.derived_array = NULL;
+ gpl->runtime.len_derived = 0;
gpl->runtime.icon_id = 0;
for (gpf = gpl->frames.first; gpf; gpf = gpf->next) {
@@ -7271,7 +7295,6 @@ static void lib_link_screen(FileData *fd, Main *main)
for (bScreen *sc = main->screen.first; sc; sc = sc->id.next) {
if (sc->id.tag & LIB_TAG_NEED_LINK) {
IDP_LibLinkProperty(sc->id.properties, fd);
- id_us_ensure_real(&sc->id);
/* deprecated, but needed for versioning (will be NULL'ed then) */
sc->scene = newlibadr(fd, sc->id.lib, sc->scene);
@@ -8960,6 +8983,9 @@ static BHead *read_userdef(BlendFileData *bfd, FileData *fd, BHead *bhead)
link_list(fd, &user->uistyles);
+ /* Don't read the active app template, use the default one. */
+ user->app_template[0] = '\0';
+
/* free fd->datamap again */
oldnewmap_free_unused(fd->datamap);
oldnewmap_clear(fd->datamap);
@@ -10239,6 +10265,7 @@ void BLO_expand_main(void *fdhandle, Main *mainvar)
break;
case ID_WS:
expand_workspace(fd, mainvar, (WorkSpace *)id);
+ break;
default:
break;
}
diff --git a/source/blender/blenloader/intern/undofile.c b/source/blender/blenloader/intern/undofile.c
index 614a3be559b..b38259f0f98 100644
--- a/source/blender/blenloader/intern/undofile.c
+++ b/source/blender/blenloader/intern/undofile.c
@@ -53,6 +53,7 @@
#include "BLO_undofile.h"
#include "BLO_readfile.h"
+#include "BKE_library.h"
#include "BKE_main.h"
/* keep last */
diff --git a/source/blender/blenloader/intern/versioning_250.c b/source/blender/blenloader/intern/versioning_250.c
index 4b628bf816a..ff56875e8fd 100644
--- a/source/blender/blenloader/intern/versioning_250.c
+++ b/source/blender/blenloader/intern/versioning_250.c
@@ -72,8 +72,8 @@
#include "BKE_armature.h"
#include "BKE_colortools.h"
#include "BKE_global.h" // for G
-#include "BKE_library.h" // for which_libbase
-#include "BKE_main.h" // for Main
+#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_mesh.h" // for ME_ defines (patching)
#include "BKE_modifier.h"
#include "BKE_multires.h"
@@ -637,7 +637,6 @@ void blo_do_versions_250(FileData *fd, Library *lib, Main *bmain)
Base *base;
Material *ma;
Camera *cam;
- Mesh *me;
Curve *cu;
Scene *sce;
Tex *tx;
@@ -729,10 +728,12 @@ void blo_do_versions_250(FileData *fd, Library *lib, Main *bmain)
}
}
+#if 0 /* ME_DRAWEDGES and others was moved to viewport. */
/* copy standard draw flag to meshes(used to be global, is not available here) */
for (me = bmain->mesh.first; me; me = me->id.next) {
- me->drawflag = ME_DRAWEDGES|ME_DRAWFACES|ME_DRAWCREASES;
+ me->drawflag = ME_DRAWEDGES | ME_DRAWFACES | ME_DRAWCREASES;
}
+#endif
/* particle draw and render types */
for (part = bmain->particle.first; part; part = part->id.next) {
diff --git a/source/blender/blenloader/intern/versioning_260.c b/source/blender/blenloader/intern/versioning_260.c
index f2f2e7d7881..9efaca83126 100644
--- a/source/blender/blenloader/intern/versioning_260.c
+++ b/source/blender/blenloader/intern/versioning_260.c
@@ -396,7 +396,7 @@ static void do_versions_nodetree_image_layer_2_64_5(bNodeTree *ntree)
NodeImageLayer *output = MEM_callocN(sizeof(NodeImageLayer), "node image layer");
/* take pass index both from current storage ptr (actually an int) */
- output->pass_index = GET_INT_FROM_POINTER(sock->storage);
+ output->pass_index = POINTER_AS_INT(sock->storage);
/* replace socket data pointer */
sock->storage = output;
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 987e4bb3cfa..a72304a6d92 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -40,6 +40,7 @@
#include "DNA_object_types.h"
#include "DNA_camera_types.h"
+#include "DNA_cloth_types.h"
#include "DNA_collection_types.h"
#include "DNA_constraint_types.h"
#include "DNA_gpu_types.h"
@@ -57,29 +58,42 @@
#include "DNA_genfile.h"
#include "DNA_gpencil_types.h"
#include "DNA_workspace_types.h"
+#include "DNA_key_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_armature_types.h"
+#include "BKE_action.h"
+#include "BKE_cloth.h"
#include "BKE_collection.h"
#include "BKE_constraint.h"
-#include "BKE_customdata.h"
#include "BKE_colortools.h"
+#include "BKE_customdata.h"
#include "BKE_freestyle.h"
+#include "BKE_gpencil.h"
#include "BKE_idprop.h"
#include "BKE_image.h"
+#include "BKE_key.h"
+#include "BKE_library.h"
#include "BKE_layer.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_node.h"
+#include "BKE_object.h"
+#include "BKE_paint.h"
#include "BKE_pointcache.h"
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
#include "BKE_sequencer.h"
#include "BKE_studiolight.h"
+#include "BKE_unit.h"
#include "BKE_workspace.h"
-#include "BKE_gpencil.h"
-#include "BKE_paint.h"
-#include "BKE_object.h"
+
+/* Only for IMB_BlendMode */
+#include "IMB_imbuf.h"
+
+#include "DEG_depsgraph.h"
#include "BLT_translation.h"
@@ -787,6 +801,127 @@ void do_versions_after_linking_280(Main *bmain)
}
#endif
+ /* Update Curve object Shape Key data layout to include the Radius property */
+ if (!MAIN_VERSION_ATLEAST(bmain, 280, 23)) {
+ for (Curve *cu = bmain->curve.first; cu; cu = cu->id.next) {
+ if (!cu->key || cu->key->elemsize != sizeof(float[4]))
+ continue;
+
+ cu->key->elemstr[0] = 3; /*KEYELEM_ELEM_SIZE_CURVE*/
+ cu->key->elemsize = sizeof(float[3]);
+
+ int new_count = BKE_keyblock_curve_element_count(&cu->nurb);
+
+ for (KeyBlock *block = cu->key->block.first; block; block = block->next) {
+ int old_count = block->totelem;
+ void *old_data = block->data;
+
+ if (!old_data || old_count <= 0)
+ continue;
+
+ block->totelem = new_count;
+ block->data = MEM_callocN(sizeof(float[3]) * new_count, __func__);
+
+ float *oldptr = old_data;
+ float (*newptr)[3] = block->data;
+
+ for (Nurb *nu = cu->nurb.first; nu; nu = nu->next) {
+ if (nu->bezt) {
+ BezTriple *bezt = nu->bezt;
+
+ for (int a = 0; a < nu->pntsu; a++, bezt++) {
+ if ((old_count -= 3) < 0) {
+ memcpy(newptr, bezt->vec, sizeof(float[3][3]));
+ newptr[3][0] = bezt->alfa;
+ }
+ else {
+ memcpy(newptr, oldptr, sizeof(float[3][4]));
+ }
+
+ newptr[3][1] = bezt->radius;
+
+ oldptr += 3 * 4;
+ newptr += 4; /*KEYELEM_ELEM_LEN_BEZTRIPLE*/
+ }
+ }
+ else if (nu->bp) {
+ BPoint *bp = nu->bp;
+
+ for (int a = 0; a < nu->pntsu * nu->pntsv; a++, bp++) {
+ if (--old_count < 0) {
+ copy_v3_v3(newptr[0], bp->vec);
+ newptr[1][0] = bp->alfa;
+ }
+ else {
+ memcpy(newptr, oldptr, sizeof(float[4]));
+ }
+
+ newptr[1][1] = bp->radius;
+
+ oldptr += 4;
+ newptr += 2; /*KEYELEM_ELEM_LEN_BPOINT*/
+ }
+ }
+ }
+
+ MEM_freeN(old_data);
+ }
+ }
+ }
+
+ /* Move B-Bone custom handle settings from bPoseChannel to Bone. */
+ if (!MAIN_VERSION_ATLEAST(bmain, 280, 25)) {
+ for (Object *ob = bmain->object.first; ob; ob = ob->id.next) {
+ bArmature *arm = ob->data;
+
+ /* If it is an armature from the same file. */
+ if (ob->pose && arm && arm->id.lib == ob->id.lib) {
+ bool rebuild = false;
+
+ for (bPoseChannel *pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
+ /* If the 2.7 flag is enabled, processing is needed. */
+ if (pchan->bone && (pchan->bboneflag & PCHAN_BBONE_CUSTOM_HANDLES)) {
+ /* If the settings in the Bone are not set, copy. */
+ if (pchan->bone->bbone_prev_type == BBONE_HANDLE_AUTO &&
+ pchan->bone->bbone_next_type == BBONE_HANDLE_AUTO &&
+ pchan->bone->bbone_prev == NULL && pchan->bone->bbone_next == NULL)
+ {
+ pchan->bone->bbone_prev_type = (pchan->bboneflag & PCHAN_BBONE_CUSTOM_START_REL) ? BBONE_HANDLE_RELATIVE : BBONE_HANDLE_ABSOLUTE;
+ pchan->bone->bbone_next_type = (pchan->bboneflag & PCHAN_BBONE_CUSTOM_END_REL) ? BBONE_HANDLE_RELATIVE : BBONE_HANDLE_ABSOLUTE;
+
+ if (pchan->bbone_prev) {
+ pchan->bone->bbone_prev = pchan->bbone_prev->bone;
+ }
+ if (pchan->bbone_next) {
+ pchan->bone->bbone_next = pchan->bbone_next->bone;
+ }
+ }
+
+ rebuild = true;
+ pchan->bboneflag = 0;
+ }
+ }
+
+ /* Tag pose rebuild for all objects that use this armature. */
+ if (rebuild) {
+ for (Object *ob2 = bmain->object.first; ob2; ob2 = ob2->id.next) {
+ if (ob2->pose && ob2->data == arm) {
+ ob2->pose->flag |= POSE_RECALC;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (!MAIN_VERSION_ATLEAST(bmain, 280, 30)) {
+ for (Brush *brush = bmain->brush.first; brush; brush = brush->id.next) {
+ if (brush->gpencil_settings != NULL) {
+ brush->gpencil_tool = brush->gpencil_settings->brush_type;
+ }
+ }
+ BKE_paint_toolslots_init_from_main(bmain);
+ }
}
/* NOTE: this version patch is intended for versions < 2.52.2, but was initially introduced in 2.27 already.
@@ -963,7 +1098,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
ToolSettings *ts = scene->toolsettings;
/* sculpt brushes */
GP_BrushEdit_Settings *gset = &ts->gp_sculpt;
- for (int i = 0; i < TOT_GP_EDITBRUSH_TYPES; ++i) {
+ for (int i = 0; i < GP_EDITBRUSH_TYPE_MAX; ++i) {
gp_brush = &gset->brush[i];
gp_brush->flag |= GP_EDITBRUSH_FLAG_ENABLE_CURSOR;
copy_v3_v3(gp_brush->curcolor_add, curcolor_add);
@@ -1029,10 +1164,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
for (SpaceLink *sl = area->spacedata.first; sl; sl = sl->next) {
if (sl->spacetype == SPACE_VIEW3D) {
View3D *v3d = (View3D *)sl;
- v3d->overlay.gpencil_grid_scale = 1.0f; // Scale
- v3d->overlay.gpencil_grid_lines = GP_DEFAULT_GRID_LINES; // NUmber of lines
v3d->overlay.gpencil_paper_opacity = 0.5f;
- v3d->overlay.gpencil_grid_axis = V3D_GP_GRID_AXIS_Y;
v3d->overlay.gpencil_grid_opacity = 0.9f;
}
}
@@ -1667,9 +1799,10 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
if (sl->spacetype == SPACE_VIEW3D) {
View3D *v3d = (View3D *)sl;
float alpha = v3d->flag2 & V3D_SHOW_MODE_SHADE_OVERRIDE ? 0.0f : 0.8f;
+ float alpha_full = v3d->flag2 & V3D_SHOW_MODE_SHADE_OVERRIDE ? 0.0f : 1.0f;
v3d->overlay.texture_paint_mode_opacity = alpha;
v3d->overlay.vertex_paint_mode_opacity = alpha;
- v3d->overlay.weight_paint_mode_opacity = alpha;
+ v3d->overlay.weight_paint_mode_opacity = alpha_full;
}
}
}
@@ -1698,7 +1831,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) {
if (scene->toolsettings->gizmo_flag == 0) {
- scene->toolsettings->gizmo_flag = SCE_MANIP_TRANSLATE | SCE_MANIP_ROTATE | SCE_MANIP_SCALE;
+ scene->toolsettings->gizmo_flag = SCE_GIZMO_SHOW_TRANSLATE | SCE_GIZMO_SHOW_ROTATE | SCE_GIZMO_SHOW_SCALE;
}
}
@@ -1803,18 +1936,6 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
}
- if (!DNA_struct_elem_find(fd->filesdna, "View3DOverlay", "float", "gpencil_grid_scale")) {
- for (bScreen *screen = bmain->screen.first; screen; screen = screen->id.next) {
- for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
- for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
- if (sl->spacetype == SPACE_VIEW3D) {
- View3D *v3d = (View3D *)sl;
- v3d->overlay.gpencil_grid_scale = 1.0f;
- }
- }
- }
- }
- }
if (!DNA_struct_elem_find(fd->filesdna, "View3DOverlay", "float", "gpencil_paper_opacity")) {
for (bScreen *screen = bmain->screen.first; screen; screen = screen->id.next) {
for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
@@ -1839,30 +1960,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
}
- if (!DNA_struct_elem_find(fd->filesdna, "View3DOverlay", "int", "gpencil_grid_axis")) {
- for (bScreen *screen = bmain->screen.first; screen; screen = screen->id.next) {
- for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
- for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
- if (sl->spacetype == SPACE_VIEW3D) {
- View3D *v3d = (View3D *)sl;
- v3d->overlay.gpencil_grid_axis = V3D_GP_GRID_AXIS_Y;
- }
- }
- }
- }
- }
- if (!DNA_struct_elem_find(fd->filesdna, "View3DOverlay", "int", "gpencil_grid_lines")) {
- for (bScreen *screen = bmain->screen.first; screen; screen = screen->id.next) {
- for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
- for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
- if (sl->spacetype == SPACE_VIEW3D) {
- View3D *v3d = (View3D *)sl;
- v3d->overlay.gpencil_grid_lines = GP_DEFAULT_GRID_LINES;
- }
- }
- }
- }
- }
+
/* default loc axis */
if (!DNA_struct_elem_find(fd->filesdna, "GP_BrushEdit_Settings", "int", "lock_axis")) {
for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) {
@@ -1873,9 +1971,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
}
- }
- {
/* Versioning code for Subsurf modifier. */
if (!DNA_struct_elem_find(fd->filesdna, "SubsurfModifier", "short", "uv_smooth")) {
for (Object *object = bmain->object.first; object != NULL; object = object->id.next) {
@@ -1898,7 +1994,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
for (ModifierData *md = object->modifiers.first; md; md = md->next) {
if (md->type == eModifierType_Subsurf) {
SubsurfModifierData *smd = (SubsurfModifierData *)md;
- smd->quality = 3;
+ smd->quality = min_ii(smd->renderLevels, 3);
}
}
}
@@ -1920,5 +2016,347 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
}
+
+ if (!DNA_struct_elem_find(fd->filesdna, "ClothSimSettings", "short", "bending_model")) {
+ for (Object *ob = bmain->object.first; ob; ob = ob->id.next) {
+ for (ModifierData *md = ob->modifiers.first; md; md = md->next) {
+ if (md->type == eModifierType_Cloth) {
+ ClothModifierData *clmd = (ClothModifierData *)md;
+
+ clmd->sim_parms->bending_model = CLOTH_BENDING_LINEAR;
+ clmd->sim_parms->tension = clmd->sim_parms->structural;
+ clmd->sim_parms->compression = clmd->sim_parms->structural;
+ clmd->sim_parms->shear = clmd->sim_parms->structural;
+ clmd->sim_parms->max_tension = clmd->sim_parms->max_struct;
+ clmd->sim_parms->max_compression = clmd->sim_parms->max_struct;
+ clmd->sim_parms->max_shear = clmd->sim_parms->max_struct;
+ clmd->sim_parms->vgroup_shear = clmd->sim_parms->vgroup_struct;
+ clmd->sim_parms->tension_damp = clmd->sim_parms->Cdis;
+ clmd->sim_parms->compression_damp = clmd->sim_parms->Cdis;
+ clmd->sim_parms->shear_damp = clmd->sim_parms->Cdis;
+ }
+ }
+ }
+ }
+
+ if (!DNA_struct_elem_find(fd->filesdna, "BrushGpencilSettings", "float", "era_strength_f")) {
+ for (Brush *brush = bmain->brush.first; brush; brush = brush->id.next) {
+ if (brush->gpencil_settings != NULL) {
+ BrushGpencilSettings *gp = brush->gpencil_settings;
+ if (gp->brush_type == GPAINT_TOOL_ERASE) {
+ gp->era_strength_f = 100.0f;
+ gp->era_thickness_f = 10.0f;
+ }
+ }
+ }
+ }
+
+ for (Object *ob = bmain->object.first; ob; ob = ob->id.next) {
+ for (ModifierData *md = ob->modifiers.first; md; md = md->next) {
+ if (md->type == eModifierType_Cloth) {
+ ClothModifierData *clmd = (ClothModifierData *)md;
+
+ if (!(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL)) {
+ clmd->sim_parms->vgroup_mass = 0;
+ }
+
+ if (!(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SCALING)) {
+ clmd->sim_parms->vgroup_struct = 0;
+ clmd->sim_parms->vgroup_shear = 0;
+ clmd->sim_parms->vgroup_bend = 0;
+ }
+
+ if (!(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SEW)) {
+ clmd->sim_parms->shrink_min = 0.0f;
+ clmd->sim_parms->vgroup_shrink = 0;
+ }
+
+ if (!(clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED)) {
+ clmd->coll_parms->flags &= ~CLOTH_COLLSETTINGS_FLAG_SELF;
+ }
+ }
+ }
+ }
}
+
+ if (!MAIN_VERSION_ATLEAST(bmain, 280, 24)) {
+ for (bScreen *screen = bmain->screen.first; screen; screen = screen->id.next) {
+ for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
+ if (sl->spacetype == SPACE_VIEW3D) {
+ View3D *v3d = (View3D *)sl;
+ v3d->overlay.edit_flag |= V3D_OVERLAY_EDIT_FACES |
+ V3D_OVERLAY_EDIT_SEAMS |
+ V3D_OVERLAY_EDIT_SHARP |
+ V3D_OVERLAY_EDIT_FREESTYLE_EDGE |
+ V3D_OVERLAY_EDIT_FREESTYLE_FACE |
+ V3D_OVERLAY_EDIT_EDGES |
+ V3D_OVERLAY_EDIT_CREASES |
+ V3D_OVERLAY_EDIT_BWEIGHTS |
+ V3D_OVERLAY_EDIT_CU_HANDLES |
+ V3D_OVERLAY_EDIT_CU_NORMALS;
+ }
+ }
+ }
+ }
+ }
+
+ {
+ if (!DNA_struct_elem_find(fd->filesdna, "ShrinkwrapModifierData", "char", "shrinkMode")) {
+ for (Object *ob = bmain->object.first; ob; ob = ob->id.next) {
+ for (ModifierData *md = ob->modifiers.first; md; md = md->next) {
+ if (md->type == eModifierType_Shrinkwrap) {
+ ShrinkwrapModifierData *smd = (ShrinkwrapModifierData *)md;
+ if (smd->shrinkOpts & MOD_SHRINKWRAP_KEEP_ABOVE_SURFACE) {
+ smd->shrinkMode = MOD_SHRINKWRAP_ABOVE_SURFACE;
+ smd->shrinkOpts &= ~MOD_SHRINKWRAP_KEEP_ABOVE_SURFACE;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (!MAIN_VERSION_ATLEAST(bmain, 280, 24)) {
+ if (!DNA_struct_elem_find(fd->filesdna, "PartDeflect", "float", "pdef_cfrict")) {
+ for (Object *ob = bmain->object.first; ob; ob = ob->id.next) {
+ if (ob->pd) {
+ ob->pd->pdef_cfrict = 5.0f;
+ }
+
+ for (ModifierData *md = ob->modifiers.first; md; md = md->next) {
+ if (md->type == eModifierType_Cloth) {
+ ClothModifierData *clmd = (ClothModifierData *)md;
+
+ clmd->coll_parms->selfepsilon = 0.015f;
+ }
+ }
+ }
+ }
+
+ if (!DNA_struct_elem_find(fd->filesdna, "View3DShading", "float", "xray_alpha_wire")) {
+ for (bScreen *screen = bmain->screen.first; screen; screen = screen->id.next) {
+ for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
+ if (sl->spacetype == SPACE_VIEW3D) {
+ View3D *v3d = (View3D *)sl;
+ v3d->shading.xray_alpha_wire = 0.5f;
+ }
+ }
+ }
+ }
+
+ for (bScreen *screen = bmain->screen.first; screen; screen = screen->id.next) {
+ for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
+ if (sl->spacetype == SPACE_VIEW3D) {
+ View3D *v3d = (View3D *)sl;
+ v3d->shading.flag |= V3D_SHADING_XRAY_WIREFRAME;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (!MAIN_VERSION_ATLEAST(bmain, 280, 25)) {
+ for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) {
+ UnitSettings *unit = &scene->unit;
+ if (unit->system != USER_UNIT_NONE) {
+ unit->length_unit = bUnit_GetBaseUnitOfType(scene->unit.system, B_UNIT_LENGTH);
+ unit->mass_unit = bUnit_GetBaseUnitOfType(scene->unit.system, B_UNIT_MASS);
+ }
+ unit->time_unit = bUnit_GetBaseUnitOfType(USER_UNIT_NONE, B_UNIT_TIME);
+ }
+
+ /* gpencil grid settings */
+ for (bGPdata *gpd = bmain->gpencil.first; gpd; gpd = gpd->id.next) {
+ ARRAY_SET_ITEMS(gpd->grid.color, 0.5f, 0.5f, 0.5f); // Color
+ ARRAY_SET_ITEMS(gpd->grid.scale, 1.0f, 1.0f); // Scale
+ gpd->grid.lines = GP_DEFAULT_GRID_LINES; // Number of lines
+ }
+ }
+
+ {
+ for (bScreen *screen = bmain->screen.first; screen; screen = screen->id.next) {
+ for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
+ if (sl->spacetype == SPACE_VIEW3D) {
+ View3D *v3d = (View3D *)sl;
+ if (v3d->flag2 & V3D_OCCLUDE_WIRE) {
+ v3d->overlay.edit_flag |= V3D_OVERLAY_EDIT_OCCLUDE_WIRE;
+ v3d->flag2 &= ~V3D_OCCLUDE_WIRE;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (!MAIN_VERSION_ATLEAST(bmain, 280, 29)) {
+ for (bScreen *screen = bmain->screen.first; screen; screen = screen->id.next) {
+ for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
+ if (sl->spacetype == SPACE_BUTS) {
+ ListBase *regionbase = (sl == sa->spacedata.first) ? &sa->regionbase : &sl->regionbase;
+ ARegion *ar = MEM_callocN(sizeof(ARegion), "navigation bar for properties");
+ ARegion *ar_header = NULL;
+
+ for (ar_header = regionbase->first; ar_header; ar_header = ar_header->next) {
+ if (ar_header->regiontype == RGN_TYPE_HEADER) {
+ break;
+ }
+ }
+ BLI_assert(ar_header);
+
+ BLI_insertlinkafter(regionbase, ar_header, ar);
+
+ ar->regiontype = RGN_TYPE_NAV_BAR;
+ ar->alignment = RGN_ALIGN_LEFT;
+ }
+ }
+ }
+ }
+
+ /* grease pencil fade layer opacity */
+ if (!DNA_struct_elem_find(fd->filesdna, "View3DOverlay", "float", "gpencil_fade_layer")) {
+ for (bScreen *screen = bmain->screen.first; screen; screen = screen->id.next) {
+ for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
+ if (sl->spacetype == SPACE_VIEW3D) {
+ View3D *v3d = (View3D *)sl;
+ v3d->overlay.gpencil_fade_layer = 0.5f;
+ }
+ }
+ }
+ }
+ }
+
+ for (Object *ob = bmain->object.first; ob; ob = ob->id.next) {
+ ob->empty_image_visibility_flag = (
+ OB_EMPTY_IMAGE_VISIBLE_PERSPECTIVE |
+ OB_EMPTY_IMAGE_VISIBLE_ORTHOGRAPHIC);
+ }
+
+
+ }
+
+ if (!MAIN_VERSION_ATLEAST(bmain, 280, 30)) {
+ /* grease pencil main material show switches */
+ for (Material *mat = bmain->mat.first; mat; mat = mat->id.next) {
+ if (mat->gp_style) {
+ mat->gp_style->flag |= GP_STYLE_STROKE_SHOW;
+ mat->gp_style->flag |= GP_STYLE_FILL_SHOW;
+ }
+ }
+ }
+
+ {
+ if (!DNA_struct_elem_find(fd->filesdna, "SceneEEVEE", "float", "overscan")) {
+ for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) {
+ scene->eevee.overscan = 3.0f;
+ }
+ }
+
+ if (!DNA_struct_elem_find(fd->filesdna, "Brush", "char", "weightpaint_tool")) {
+ /* Magic defines from old files (2.7x) */
+
+#define PAINT_BLEND_MIX 0
+#define PAINT_BLEND_ADD 1
+#define PAINT_BLEND_SUB 2
+#define PAINT_BLEND_MUL 3
+#define PAINT_BLEND_BLUR 4
+#define PAINT_BLEND_LIGHTEN 5
+#define PAINT_BLEND_DARKEN 6
+#define PAINT_BLEND_AVERAGE 7
+#define PAINT_BLEND_SMEAR 8
+#define PAINT_BLEND_COLORDODGE 9
+#define PAINT_BLEND_DIFFERENCE 10
+#define PAINT_BLEND_SCREEN 11
+#define PAINT_BLEND_HARDLIGHT 12
+#define PAINT_BLEND_OVERLAY 13
+#define PAINT_BLEND_SOFTLIGHT 14
+#define PAINT_BLEND_EXCLUSION 15
+#define PAINT_BLEND_LUMINOSITY 16
+#define PAINT_BLEND_SATURATION 17
+#define PAINT_BLEND_HUE 18
+#define PAINT_BLEND_ALPHA_SUB 19
+#define PAINT_BLEND_ALPHA_ADD 20
+
+ for (Brush *brush = bmain->brush.first; brush; brush = brush->id.next) {
+ if (brush->ob_mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT)) {
+ const char tool_init = brush->vertexpaint_tool;
+ bool is_blend = false;
+
+ {
+ char tool = tool_init;
+ switch (tool_init) {
+ case PAINT_BLEND_MIX: tool = VPAINT_TOOL_DRAW; break;
+ case PAINT_BLEND_BLUR: tool = VPAINT_TOOL_BLUR; break;
+ case PAINT_BLEND_AVERAGE: tool = VPAINT_TOOL_AVERAGE; break;
+ case PAINT_BLEND_SMEAR: tool = VPAINT_TOOL_SMEAR; break;
+ default:
+ tool = VPAINT_TOOL_DRAW;
+ is_blend = true;
+ break;
+ }
+ brush->vertexpaint_tool = tool;
+ }
+
+ if (is_blend == false) {
+ brush->blend = IMB_BLEND_MIX;
+ }
+ else {
+ short blend = IMB_BLEND_MIX;
+ switch (tool_init) {
+ case PAINT_BLEND_ADD: blend = IMB_BLEND_ADD; break;
+ case PAINT_BLEND_SUB: blend = IMB_BLEND_SUB; break;
+ case PAINT_BLEND_MUL: blend = IMB_BLEND_MUL; break;
+ case PAINT_BLEND_LIGHTEN: blend = IMB_BLEND_LIGHTEN; break;
+ case PAINT_BLEND_DARKEN: blend = IMB_BLEND_DARKEN; break;
+ case PAINT_BLEND_COLORDODGE: blend = IMB_BLEND_COLORDODGE; break;
+ case PAINT_BLEND_DIFFERENCE: blend = IMB_BLEND_DIFFERENCE; break;
+ case PAINT_BLEND_SCREEN: blend = IMB_BLEND_SCREEN; break;
+ case PAINT_BLEND_HARDLIGHT: blend = IMB_BLEND_HARDLIGHT; break;
+ case PAINT_BLEND_OVERLAY: blend = IMB_BLEND_OVERLAY; break;
+ case PAINT_BLEND_SOFTLIGHT: blend = IMB_BLEND_SOFTLIGHT; break;
+ case PAINT_BLEND_EXCLUSION: blend = IMB_BLEND_EXCLUSION; break;
+ case PAINT_BLEND_LUMINOSITY: blend = IMB_BLEND_LUMINOSITY; break;
+ case PAINT_BLEND_SATURATION: blend = IMB_BLEND_SATURATION; break;
+ case PAINT_BLEND_HUE: blend = IMB_BLEND_HUE; break;
+ case PAINT_BLEND_ALPHA_SUB: blend = IMB_BLEND_ERASE_ALPHA; break;
+ case PAINT_BLEND_ALPHA_ADD: blend = IMB_BLEND_ADD_ALPHA; break;
+ }
+ brush->blend = blend;
+ }
+ }
+ /* For now these match, in the future new items may not. */
+ brush->weightpaint_tool = brush->vertexpaint_tool;
+ }
+
+#undef PAINT_BLEND_MIX
+#undef PAINT_BLEND_ADD
+#undef PAINT_BLEND_SUB
+#undef PAINT_BLEND_MUL
+#undef PAINT_BLEND_BLUR
+#undef PAINT_BLEND_LIGHTEN
+#undef PAINT_BLEND_DARKEN
+#undef PAINT_BLEND_AVERAGE
+#undef PAINT_BLEND_SMEAR
+#undef PAINT_BLEND_COLORDODGE
+#undef PAINT_BLEND_DIFFERENCE
+#undef PAINT_BLEND_SCREEN
+#undef PAINT_BLEND_HARDLIGHT
+#undef PAINT_BLEND_OVERLAY
+#undef PAINT_BLEND_SOFTLIGHT
+#undef PAINT_BLEND_EXCLUSION
+#undef PAINT_BLEND_LUMINOSITY
+#undef PAINT_BLEND_SATURATION
+#undef PAINT_BLEND_HUE
+#undef PAINT_BLEND_ALPHA_SUB
+#undef PAINT_BLEND_ALPHA_ADD
+
+ }
+ }
+
}
diff --git a/source/blender/blenloader/intern/versioning_defaults.c b/source/blender/blenloader/intern/versioning_defaults.c
index 1fd82d01cf5..533623039fa 100644
--- a/source/blender/blenloader/intern/versioning_defaults.c
+++ b/source/blender/blenloader/intern/versioning_defaults.c
@@ -32,17 +32,21 @@
#include "BLI_math.h"
#include "BLI_string.h"
+#include "DNA_gpencil_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_userdef_types.h"
#include "DNA_object_types.h"
#include "DNA_workspace_types.h"
+#include "DNA_windowmanager_types.h"
+#include "BKE_colortools.h"
#include "BKE_layer.h"
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_screen.h"
+#include "BKE_workspace.h"
#include "BLO_readfile.h"
@@ -69,36 +73,20 @@ void BLO_update_defaults_userpref_blend(void)
bTheme *theme = U.themes.first;
memcpy(theme, &U_theme_default, sizeof(bTheme));
}
+
+ /* Leave temp directory empty, will then get appropriate value per OS. */
+ U.tempdir[0] = '\0';
}
/**
* Update defaults in startup.blend, without having to save and embed the file.
* This function can be emptied each time the startup.blend is updated. */
-void BLO_update_defaults_startup_blend(Main *bmain)
+void BLO_update_defaults_startup_blend(Main *bmain, const char *app_template)
{
- for (WorkSpace *workspace = bmain->workspaces.first; workspace; workspace = workspace->id.next) {
- const char *name = workspace->id.name + 2;
-
- if (STREQ(name, "2D Animation")) {
- workspace->object_mode = OB_MODE_GPENCIL_PAINT;
- }
- if (STREQ(name, "3D Animation")) {
- workspace->object_mode = OB_MODE_POSE;
- }
- else if (STREQ(name, "Texture Paint")) {
- workspace->object_mode = OB_MODE_TEXTURE_PAINT;
- }
- else if (STREQ(name, "Sculpting")) {
- workspace->object_mode = OB_MODE_SCULPT;
- }
- else if (STREQ(name, "UV Editing")) {
- workspace->object_mode = OB_MODE_EDIT;
- }
- }
-
+ /* For all startup.blend files. */
for (bScreen *screen = bmain->screen.first; screen; screen = screen->id.next) {
- for (ScrArea *area = screen->areabase.first; area; area = area->next) {
- for (ARegion *ar = area->regionbase.first; ar; ar = ar->next) {
+ for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) {
/* Remove all stored panels, we want to use defaults (order, open/closed) as defined by UI code here! */
BKE_area_region_panels_free(&ar->panels);
@@ -109,52 +97,132 @@ void BLO_update_defaults_startup_blend(Main *bmain)
}
}
- if (area->spacetype == SPACE_FILE) {
- SpaceFile *sfile = area->spacedata.first;
-
- if (sfile->params) {
- if (STREQ(screen->id.name, "SRDefault.003")) {
- /* Shading. */
- sfile->params->filter = FILE_TYPE_FOLDER |
- FILE_TYPE_IMAGE;
+ for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
+ switch (sl->spacetype) {
+ case SPACE_VIEW3D:
+ {
+ View3D *v3d = (View3D *)sl;
+ v3d->overlay.weight_paint_mode_opacity = 1.0f;
}
- else {
- /* Video Editing. */
- sfile->params->filter = FILE_TYPE_FOLDER |
- FILE_TYPE_IMAGE |
- FILE_TYPE_MOVIE |
- FILE_TYPE_SOUND;
+ }
+ }
+ }
+ }
+
+ if (app_template == NULL) {
+ /* Clear all tools to use default options instead, ignore the tool saved in the file. */
+ for (WorkSpace *workspace = bmain->workspaces.first; workspace; workspace = workspace->id.next) {
+ while (!BLI_listbase_is_empty(&workspace->tools)) {
+ BKE_workspace_tool_remove(workspace, workspace->tools.first);
+ }
+ }
+
+ /* Name all screens by their workspaces (avoids 'Default.###' names). */
+ {
+ /* Default only has one window. */
+ wmWindow *win = ((wmWindowManager *)bmain->wm.first)->windows.first;
+ for (WorkSpace *workspace = bmain->workspaces.first; workspace; workspace = workspace->id.next) {
+ WorkSpaceLayout *layout = BKE_workspace_hook_layout_for_workspace_get(win->workspace_hook, workspace);
+ bScreen *screen = layout->screen;
+ BLI_strncpy(screen->id.name + 2, workspace->id.name + 2, sizeof(screen->id.name) - 2);
+ }
+ }
+
+ {
+ /* 'UV Editing' should use UV mode. */
+ bScreen *screen = BLI_findstring(&bmain->screen, "UV Editing", offsetof(ID, name) + 2);
+ for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
+ if (sl->spacetype == SPACE_IMAGE) {
+ SpaceImage *sima = (SpaceImage *)sl;
+ if (sima->mode == SI_MODE_VIEW) {
+ sima->mode = SI_MODE_UV;
+ }
}
}
}
}
}
- for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) {
- BLI_strncpy(scene->r.engine, RE_engine_id_BLENDER_EEVEE, sizeof(scene->r.engine));
+ /* For 2D animation template. */
+ if (app_template && STREQ(app_template, "2D_Animation")) {
+ for (WorkSpace *workspace = bmain->workspaces.first; workspace; workspace = workspace->id.next) {
+ const char *name = workspace->id.name + 2;
- scene->r.cfra = 1.0f;
+ if (STREQ(name, "Drawing")) {
+ workspace->object_mode = OB_MODE_GPENCIL_PAINT;
+ }
+ }
+ /* set object in drawing mode */
+ for (Object *object = bmain->object.first; object; object = object->id.next) {
+ if (object->type == OB_GPENCIL) {
+ bGPdata *gpd = (bGPdata *)object->data;
+ object->mode = OB_MODE_GPENCIL_PAINT;
+ gpd->flag |= GP_DATA_STROKE_PAINTMODE;
+ break;
+ }
+ }
- /* Don't enable compositing nodes. */
- if (scene->nodetree) {
- ntreeFreeTree(scene->nodetree);
- MEM_freeN(scene->nodetree);
- scene->nodetree = NULL;
- scene->use_nodes = false;
+ /* Be sure curfalloff is initializated */
+ for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) {
+ ToolSettings *ts = scene->toolsettings;
+ if (ts->gp_sculpt.cur_falloff == NULL) {
+ ts->gp_sculpt.cur_falloff = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
+ CurveMapping *gp_falloff_curve = ts->gp_sculpt.cur_falloff;
+ curvemapping_initialize(gp_falloff_curve);
+ curvemap_reset(gp_falloff_curve->cm,
+ &gp_falloff_curve->clipr,
+ CURVE_PRESET_GAUSS,
+ CURVEMAP_SLOPE_POSITIVE);
+ }
}
+ }
- /* Select only cube by default. */
- for (ViewLayer *layer = scene->view_layers.first; layer; layer = layer->next) {
- for (Base *base = layer->object_bases.first; base; base = base->next) {
- if (STREQ(base->object->id.name + 2, "Cube")) {
- base->flag |= BASE_SELECTED;
- }
- else {
- base->flag &= ~BASE_SELECTED;
+ /* For all builtin templates shipped with Blender. */
+ bool builtin_template = !app_template ||
+ STREQ(app_template, "2D_Animation") ||
+ STREQ(app_template, "Sculpting") ||
+ STREQ(app_template, "VFX") ||
+ STREQ(app_template, "Video_Editing");
+
+ if (builtin_template) {
+ for (bScreen *screen = bmain->screen.first; screen; screen = screen->id.next) {
+ /* Hide channels in timelines. */
+ for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ SpaceAction *saction = (sa->spacetype == SPACE_ACTION) ? sa->spacedata.first : NULL;
+
+ if (saction && saction->mode == SACTCONT_TIMELINE) {
+ for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) {
+ if (ar->regiontype == RGN_TYPE_CHANNELS) {
+ ar->flag |= RGN_FLAG_HIDDEN;
+ }
+ }
}
}
+ }
+
+ for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) {
+ BLI_strncpy(scene->r.engine, RE_engine_id_BLENDER_EEVEE, sizeof(scene->r.engine));
+
+ scene->r.cfra = 1.0f;
+ scene->r.displaymode = R_OUTPUT_WINDOW;
+
+ /* AV Sync break physics sim caching, disable until that is fixed. */
+ if (!(app_template && STREQ(app_template, "Video_Editing"))) {
+ scene->audio.flag &= ~AUDIO_SYNC;
+ scene->flag &= ~SCE_FRAME_DROP;
+ }
+
+ /* Don't enable compositing nodes. */
+ if (scene->nodetree) {
+ ntreeFreeTree(scene->nodetree);
+ MEM_freeN(scene->nodetree);
+ scene->nodetree = NULL;
+ scene->use_nodes = false;
+ }
- BKE_layer_collection_sync(scene, layer);
+ /* Rename render layers. */
+ BKE_view_layer_rename(bmain, scene, scene->view_layers.first, "View Layer");
}
}
}
diff --git a/source/blender/blenloader/intern/versioning_userdef.c b/source/blender/blenloader/intern/versioning_userdef.c
new file mode 100644
index 00000000000..e3748d9a74b
--- /dev/null
+++ b/source/blender/blenloader/intern/versioning_userdef.c
@@ -0,0 +1,374 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/** \file blender/blenloader/intern/versioning_userdef.c
+ * \ingroup blenloader
+ *
+ * Version patch user preferences.
+ */
+
+#include <string.h>
+
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_userdef_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "BKE_addon.h"
+#include "BKE_colorband.h"
+#include "BKE_main.h"
+
+#include "BLO_readfile.h" /* Own include. */
+
+/* Disallow access to global userdef. */
+#define U (_error_)
+
+
+static void do_versions_theme(UserDef *userdef, bTheme *btheme)
+{
+
+#define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_ATLEAST(userdef, ver, subver)
+ if (!USER_VERSION_ATLEAST(280, 20)) {
+ memcpy(btheme, &U_theme_default, sizeof(*btheme));
+ }
+
+ if (!USER_VERSION_ATLEAST(280, 25)) {
+ copy_v4_v4_char(btheme->tact.anim_preview_range, btheme->tact.anim_active);
+ copy_v4_v4_char(btheme->tnla.anim_preview_range, btheme->tnla.anim_active);
+ copy_v4_v4_char(btheme->tipo.anim_preview_range, btheme->tact.anim_active);
+ }
+
+ if (!USER_VERSION_ATLEAST(280, 26)) {
+ copy_v4_v4_char(btheme->tui.icon_collection, U_theme_default.tui.icon_collection);
+ copy_v4_v4_char(btheme->tui.icon_object, U_theme_default.tui.icon_object);
+ copy_v4_v4_char(btheme->tui.icon_object_data, U_theme_default.tui.icon_object_data);
+ copy_v4_v4_char(btheme->tui.icon_modifier, U_theme_default.tui.icon_modifier);
+ copy_v4_v4_char(btheme->tui.icon_shading, U_theme_default.tui.icon_shading);
+ }
+
+ if (!USER_VERSION_ATLEAST(280, 27)) {
+ copy_v4_v4_char(btheme->tact.shade2, U_theme_default.tact.shade2);
+ copy_v4_v4_char(btheme->tact.hilite, U_theme_default.tact.hilite);
+ copy_v4_v4_char(btheme->tact.group, U_theme_default.tact.group);
+ copy_v4_v4_char(btheme->tact.group_active, U_theme_default.tact.group_active);
+ copy_v4_v4_char(btheme->tact.strip_select, U_theme_default.tact.strip_select);
+ copy_v4_v4_char(btheme->tact.ds_channel, U_theme_default.tact.ds_channel);
+ copy_v4_v4_char(btheme->tact.ds_subchannel, U_theme_default.tact.ds_subchannel);
+ copy_v4_v4_char(btheme->tact.keytype_movehold, U_theme_default.tact.keytype_movehold);
+ copy_v4_v4_char(btheme->tact.keytype_movehold_select, U_theme_default.tact.keytype_movehold_select);
+ }
+
+ if (!USER_VERSION_ATLEAST(280, 28)) {
+ copy_v4_v4_char(btheme->tact.ds_ipoline, U_theme_default.tact.ds_ipoline);
+ }
+
+ if (!USER_VERSION_ATLEAST(280, 29)) {
+ copy_v4_v4_char(btheme->tbuts.navigation_bar, U_theme_default.ttopbar.header);
+ }
+
+#undef USER_VERSION_ATLEAST
+}
+
+/* patching UserDef struct and Themes */
+void BLO_version_defaults_userpref_blend(Main *bmain, UserDef *userdef)
+{
+
+#define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_ATLEAST(bmain, ver, subver)
+
+ /* the UserDef struct is not corrected with do_versions() .... ugh! */
+ if (userdef->wheellinescroll == 0) userdef->wheellinescroll = 3;
+ if (userdef->menuthreshold1 == 0) {
+ userdef->menuthreshold1 = 5;
+ userdef->menuthreshold2 = 2;
+ }
+ if (userdef->tb_leftmouse == 0) {
+ userdef->tb_leftmouse = 5;
+ userdef->tb_rightmouse = 5;
+ }
+ if (userdef->mixbufsize == 0) userdef->mixbufsize = 2048;
+ if (userdef->autokey_mode == 0) {
+ /* 'add/replace' but not on */
+ userdef->autokey_mode = 2;
+ }
+ if (userdef->savetime <= 0) {
+ userdef->savetime = 1;
+// XXX error(STRINGIFY(BLENDER_STARTUP_FILE)" is buggy, please consider removing it.\n");
+ }
+ if (userdef->gizmo_size == 0) {
+ userdef->gizmo_size = 75;
+ userdef->gizmo_flag |= USER_GIZMO_DRAW;
+ }
+ if (userdef->pad_rot_angle == 0.0f)
+ userdef->pad_rot_angle = 15.0f;
+
+ /* graph editor - unselected F-Curve visibility */
+ if (userdef->fcu_inactive_alpha == 0) {
+ userdef->fcu_inactive_alpha = 0.25f;
+ }
+
+ if (!USER_VERSION_ATLEAST(192, 0)) {
+ strcpy(userdef->sounddir, "/");
+ }
+
+ /* patch to set Dupli Armature */
+ if (!USER_VERSION_ATLEAST(220, 0)) {
+ userdef->dupflag |= USER_DUP_ARM;
+ }
+
+ /* added seam, normal color, undo */
+ if (!USER_VERSION_ATLEAST(235, 0)) {
+ userdef->uiflag |= USER_GLOBALUNDO;
+ if (userdef->undosteps == 0) userdef->undosteps = 32;
+ }
+ if (!USER_VERSION_ATLEAST(236, 0)) {
+ /* illegal combo... */
+ if (userdef->flag & USER_LMOUSESELECT)
+ userdef->flag &= ~USER_TWOBUTTONMOUSE;
+ }
+ if (!USER_VERSION_ATLEAST(240, 0)) {
+ userdef->uiflag |= USER_PLAINMENUS;
+ if (userdef->obcenter_dia == 0) userdef->obcenter_dia = 6;
+ }
+ if (!USER_VERSION_ATLEAST(242, 0)) {
+ /* set defaults for 3D View rotating axis indicator */
+ /* since size can't be set to 0, this indicates it's not saved in startup.blend */
+ if (userdef->rvisize == 0) {
+ userdef->rvisize = 15;
+ userdef->rvibright = 8;
+ userdef->uiflag |= USER_SHOW_GIZMO_AXIS;
+ }
+
+ }
+ if (!USER_VERSION_ATLEAST(244, 0)) {
+ /* set default number of recently-used files (if not set) */
+ if (userdef->recent_files == 0) userdef->recent_files = 10;
+ }
+ if (!USER_VERSION_ATLEAST(245, 3)) {
+ if (userdef->coba_weight.tot == 0)
+ BKE_colorband_init(&userdef->coba_weight, true);
+ }
+ if (!USER_VERSION_ATLEAST(245, 3)) {
+ userdef->flag |= USER_ADD_VIEWALIGNED | USER_ADD_EDITMODE;
+ }
+ if (!USER_VERSION_ATLEAST(250, 0)) {
+ /* adjust grease-pencil distances */
+ userdef->gp_manhattendist = 1;
+ userdef->gp_euclideandist = 2;
+
+ /* adjust default interpolation for new IPO-curves */
+ userdef->ipo_new = BEZT_IPO_BEZ;
+ }
+
+ if (!USER_VERSION_ATLEAST(250, 3)) {
+ /* new audio system */
+ if (userdef->audiochannels == 0)
+ userdef->audiochannels = 2;
+ if (userdef->audioformat == 0)
+ userdef->audioformat = 0x24;
+ if (userdef->audiorate == 0)
+ userdef->audiorate = 48000;
+ }
+
+ if (!USER_VERSION_ATLEAST(250, 8)) {
+ wmKeyMap *km;
+
+ for (km = userdef->user_keymaps.first; km; km = km->next) {
+ if (STREQ(km->idname, "Armature_Sketch"))
+ strcpy(km->idname, "Armature Sketch");
+ else if (STREQ(km->idname, "View3D"))
+ strcpy(km->idname, "3D View");
+ else if (STREQ(km->idname, "View3D Generic"))
+ strcpy(km->idname, "3D View Generic");
+ else if (STREQ(km->idname, "EditMesh"))
+ strcpy(km->idname, "Mesh");
+ else if (STREQ(km->idname, "UVEdit"))
+ strcpy(km->idname, "UV Editor");
+ else if (STREQ(km->idname, "Animation_Channels"))
+ strcpy(km->idname, "Animation Channels");
+ else if (STREQ(km->idname, "GraphEdit Keys"))
+ strcpy(km->idname, "Graph Editor");
+ else if (STREQ(km->idname, "GraphEdit Generic"))
+ strcpy(km->idname, "Graph Editor Generic");
+ else if (STREQ(km->idname, "Action_Keys"))
+ strcpy(km->idname, "Dopesheet");
+ else if (STREQ(km->idname, "NLA Data"))
+ strcpy(km->idname, "NLA Editor");
+ else if (STREQ(km->idname, "Node Generic"))
+ strcpy(km->idname, "Node Editor");
+ else if (STREQ(km->idname, "Logic Generic"))
+ strcpy(km->idname, "Logic Editor");
+ else if (STREQ(km->idname, "File"))
+ strcpy(km->idname, "File Browser");
+ else if (STREQ(km->idname, "FileMain"))
+ strcpy(km->idname, "File Browser Main");
+ else if (STREQ(km->idname, "FileButtons"))
+ strcpy(km->idname, "File Browser Buttons");
+ else if (STREQ(km->idname, "Buttons Generic"))
+ strcpy(km->idname, "Property Editor");
+ }
+ }
+
+ if (!USER_VERSION_ATLEAST(252, 3)) {
+ if (userdef->flag & USER_LMOUSESELECT)
+ userdef->flag &= ~USER_TWOBUTTONMOUSE;
+ }
+ if (!USER_VERSION_ATLEAST(252, 4)) {
+ /* default new handle type is auto handles */
+ userdef->keyhandles_new = HD_AUTO;
+ }
+
+ if (!USER_VERSION_ATLEAST(257, 0)) {
+ /* clear "AUTOKEY_FLAG_ONLYKEYINGSET" flag from userprefs,
+ * so that it doesn't linger around from old configs like a ghost */
+ userdef->autokey_flag &= ~AUTOKEY_FLAG_ONLYKEYINGSET;
+ }
+
+ if (!USER_VERSION_ATLEAST(260, 3)) {
+ /* if new keyframes handle default is stuff "auto", make it "auto-clamped" instead
+ * was changed in 260 as part of GSoC11, but version patch was wrong
+ */
+ if (userdef->keyhandles_new == HD_AUTO)
+ userdef->keyhandles_new = HD_AUTO_ANIM;
+
+ /* enable (Cycles) addon by default */
+ BKE_addon_ensure(&userdef->addons, "cycles");
+ }
+
+ if (!USER_VERSION_ATLEAST(261, 4)) {
+ userdef->use_16bit_textures = true;
+ }
+
+ if (!USER_VERSION_ATLEAST(267, 0)) {
+
+ /* GL Texture Garbage Collection */
+ if (userdef->textimeout == 0) {
+ userdef->texcollectrate = 60;
+ userdef->textimeout = 120;
+ }
+ if (userdef->memcachelimit <= 0) {
+ userdef->memcachelimit = 32;
+ }
+ if (userdef->dbl_click_time == 0) {
+ userdef->dbl_click_time = 350;
+ }
+ if (userdef->v2d_min_gridsize == 0) {
+ userdef->v2d_min_gridsize = 35;
+ }
+ if (userdef->dragthreshold == 0)
+ userdef->dragthreshold = 5;
+ if (userdef->widget_unit == 0)
+ userdef->widget_unit = 20;
+ if (userdef->anisotropic_filter <= 0)
+ userdef->anisotropic_filter = 1;
+
+ if (userdef->ndof_sensitivity == 0.0f) {
+ userdef->ndof_sensitivity = 1.0f;
+ userdef->ndof_flag = (NDOF_LOCK_HORIZON | NDOF_SHOULD_PAN | NDOF_SHOULD_ZOOM | NDOF_SHOULD_ROTATE);
+ }
+
+ if (userdef->ndof_orbit_sensitivity == 0.0f) {
+ userdef->ndof_orbit_sensitivity = userdef->ndof_sensitivity;
+
+ if (!(userdef->flag & USER_TRACKBALL))
+ userdef->ndof_flag |= NDOF_TURNTABLE;
+ }
+ if (userdef->tweak_threshold == 0)
+ userdef->tweak_threshold = 10;
+ }
+
+ /* NOTE!! from now on use userdef->versionfile and userdef->subversionfile */
+#undef USER_VERSION_ATLEAST
+#define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_ATLEAST(userdef, ver, subver)
+
+ if (!USER_VERSION_ATLEAST(271, 5)) {
+ userdef->pie_menu_radius = 100;
+ userdef->pie_menu_threshold = 12;
+ userdef->pie_animation_timeout = 6;
+ }
+
+ if (!USER_VERSION_ATLEAST(275, 2)) {
+ userdef->ndof_deadzone = 0.1;
+ }
+
+ if (!USER_VERSION_ATLEAST(275, 4)) {
+ userdef->node_margin = 80;
+ }
+
+ if (!USER_VERSION_ATLEAST(278, 6)) {
+ /* Clear preference flags for re-use. */
+ userdef->flag &= ~(
+ USER_FLAG_NUMINPUT_ADVANCED | USER_FLAG_DEPRECATED_2 | USER_FLAG_DEPRECATED_3 |
+ USER_FLAG_DEPRECATED_6 | USER_FLAG_DEPRECATED_7 |
+ USER_FLAG_DEPRECATED_9 | USER_DEVELOPER_UI);
+ userdef->uiflag &= ~(
+ USER_UIFLAG_DEPRECATED_7);
+ userdef->transopts &= ~(
+ USER_TR_DEPRECATED_2 | USER_TR_DEPRECATED_3 | USER_TR_DEPRECATED_4 |
+ USER_TR_DEPRECATED_6 | USER_TR_DEPRECATED_7);
+
+ userdef->uiflag |= USER_LOCK_CURSOR_ADJUST;
+ }
+
+
+ if (!USER_VERSION_ATLEAST(280, 20)) {
+ userdef->gpu_viewport_quality = 0.6f;
+
+ /* Reset theme, old themes will not be compatible with minor version updates from now on. */
+ for (bTheme *btheme = userdef->themes.first; btheme; btheme = btheme->next) {
+ memcpy(btheme, &U_theme_default, sizeof(*btheme));
+ }
+
+ /* Annotations - new layer color
+ * Replace anything that used to be set if it looks like was left
+ * on the old default (i.e. black), which most users used
+ */
+ if ((userdef->gpencil_new_layer_col[3] < 0.1f) || (userdef->gpencil_new_layer_col[0] < 0.1f)) {
+ /* - New color matches the annotation pencil icon
+ * - Non-full alpha looks better!
+ */
+ ARRAY_SET_ITEMS(userdef->gpencil_new_layer_col, 0.38f, 0.61f, 0.78f, 0.9f);
+ }
+ }
+
+ /**
+ * Include next version bump.
+ */
+ {
+ /* (keep this block even if it becomes empty). */
+ }
+
+ if (userdef->pixelsize == 0.0f)
+ userdef->pixelsize = 1.0f;
+
+ if (userdef->image_draw_method == 0)
+ userdef->image_draw_method = IMAGE_DRAW_METHOD_2DTEXTURE;
+
+ // we default to the first audio device
+ userdef->audiodevice = 0;
+
+ for (bTheme *btheme = userdef->themes.first; btheme; btheme = btheme->next) {
+ do_versions_theme(userdef, btheme);
+ }
+#undef USER_VERSION_ATLEAST
+
+}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 165658717df..5bf64f49563 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -164,25 +164,24 @@
#include "BKE_action.h"
#include "BKE_blender_version.h"
#include "BKE_bpath.h"
-#include "BKE_curve.h"
#include "BKE_collection.h"
#include "BKE_constraint.h"
+#include "BKE_curve.h"
+#include "BKE_fcurve.h"
#include "BKE_global.h" // for G
#include "BKE_gpencil_modifier.h"
#include "BKE_idcode.h"
#include "BKE_layer.h"
-#include "BKE_library.h" // for set_listbasepointers
#include "BKE_library_override.h"
#include "BKE_main.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
#include "BKE_node.h"
+#include "BKE_pointcache.h"
#include "BKE_report.h"
#include "BKE_sequencer.h"
#include "BKE_shader_fx.h"
#include "BKE_subsurf.h"
-#include "BKE_modifier.h"
-#include "BKE_fcurve.h"
-#include "BKE_pointcache.h"
-#include "BKE_mesh.h"
#include "BKE_workspace.h"
#ifdef USE_NODE_COMPAT_CUSTOMNODES
@@ -1537,6 +1536,18 @@ static void write_constraints(WriteData *wd, ListBase *conlist)
break;
}
+ case CONSTRAINT_TYPE_ARMATURE:
+ {
+ bArmatureConstraint *data = con->data;
+ bConstraintTarget *ct;
+
+ /* write targets */
+ for (ct = data->targets.first; ct; ct = ct->next) {
+ writestruct(wd, DATA, bConstraintTarget, 1, ct);
+ }
+
+ break;
+ }
case CONSTRAINT_TYPE_SPLINEIK:
{
bSplineIKConstraint *data = con->data;
@@ -2435,6 +2446,7 @@ static void write_paint(WriteData *wd, Paint *p)
if (p->cavity_curve) {
write_curvemapping(wd, p->cavity_curve);
}
+ writedata(wd, DATA, sizeof(PaintToolSlot) * p->tool_slots_len, p->tool_slots);
}
static void write_layer_collections(WriteData *wd, ListBase *lb)
@@ -3006,15 +3018,18 @@ static void write_windowmanager(WriteData *wd, wmWindowManager *wm)
static void write_screen(WriteData *wd, bScreen *sc)
{
- /* write LibData */
- /* in 2.50+ files, the file identifier for screens is patched, forward compatibility */
- writestruct(wd, ID_SCRN, bScreen, 1, sc);
- write_iddata(wd, &sc->id);
+ /* Screens are reference counted, only saved if used by a workspace. */
+ if (sc->id.us > 0 || wd->use_memfile) {
+ /* write LibData */
+ /* in 2.50+ files, the file identifier for screens is patched, forward compatibility */
+ writestruct(wd, ID_SCRN, bScreen, 1, sc);
+ write_iddata(wd, &sc->id);
- write_previews(wd, sc->preview);
+ write_previews(wd, sc->preview);
- /* direct data */
- write_area_map(wd, AREAMAP_FROM_SCREEN(sc));
+ /* direct data */
+ write_area_map(wd, AREAMAP_FROM_SCREEN(sc));
+ }
}
static void write_bone(WriteData *wd, Bone *bone)
diff --git a/source/blender/blentranslation/intern/blt_lang.c b/source/blender/blentranslation/intern/blt_lang.c
index 916de3a5d20..f373ca24861 100644
--- a/source/blender/blentranslation/intern/blt_lang.c
+++ b/source/blender/blentranslation/intern/blt_lang.c
@@ -214,7 +214,7 @@ void BLT_lang_init(void)
*
* Would also be good to find nicer way to check if LANG is correct.
*/
- const char *lang = getenv("LANG");
+ const char *lang = BLI_getenv("LANG");
if (lang != NULL) {
char *old_locale = setlocale(LC_ALL, NULL);
/* Make a copy so subsequenct setlocale() doesn't interfere. */
diff --git a/source/blender/blentranslation/intern/blt_translation.c b/source/blender/blentranslation/intern/blt_translation.c
index 9175585f1b3..40d384dd0fe 100644
--- a/source/blender/blentranslation/intern/blt_translation.c
+++ b/source/blender/blentranslation/intern/blt_translation.c
@@ -41,6 +41,7 @@
#include "BLI_fileops.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
+#include "BLI_threads.h"
#include "DNA_userdef_types.h" /* For user settings. */
@@ -91,7 +92,7 @@ const char *BLT_pgettext(const char *msgctxt, const char *msgid)
bool BLT_translate(void)
{
#ifdef WITH_INTERNATIONAL
- return (U.transopts & USER_DOTRANSLATE) != 0;
+ return BLI_thread_is_main() && (U.transopts & USER_DOTRANSLATE);
#else
return false;
#endif
@@ -100,7 +101,7 @@ bool BLT_translate(void)
bool BLT_translate_iface(void)
{
#ifdef WITH_INTERNATIONAL
- return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_IFACE);
+ return BLT_translate() && (U.transopts & USER_TR_IFACE);
#else
return false;
#endif
@@ -109,7 +110,7 @@ bool BLT_translate_iface(void)
bool BLT_translate_tooltips(void)
{
#ifdef WITH_INTERNATIONAL
- return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_TOOLTIPS);
+ return BLT_translate() && (U.transopts & USER_TR_TOOLTIPS);
#else
return false;
#endif
@@ -118,7 +119,7 @@ bool BLT_translate_tooltips(void)
bool BLT_translate_new_dataname(void)
{
#ifdef WITH_INTERNATIONAL
- return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_NEWDATANAME);
+ return BLT_translate() && (U.transopts & USER_TR_NEWDATANAME);
#else
return false;
#endif
diff --git a/source/blender/bmesh/CMakeLists.txt b/source/blender/bmesh/CMakeLists.txt
index bd3eb4cc1ac..e6317762842 100644
--- a/source/blender/bmesh/CMakeLists.txt
+++ b/source/blender/bmesh/CMakeLists.txt
@@ -70,7 +70,6 @@ set(SRC
operators/bmo_primitive.c
operators/bmo_removedoubles.c
operators/bmo_rotate_edges.c
- operators/bmo_similar.c
operators/bmo_smooth_laplacian.c
operators/bmo_split_edges.c
operators/bmo_subdivide.c
diff --git a/source/blender/bmesh/intern/bmesh_callback_generic.c b/source/blender/bmesh/intern/bmesh_callback_generic.c
index e9304e8536f..90b2497aa80 100644
--- a/source/blender/bmesh/intern/bmesh_callback_generic.c
+++ b/source/blender/bmesh/intern/bmesh_callback_generic.c
@@ -32,7 +32,7 @@
bool BM_elem_cb_check_hflag_ex(BMElem *ele, void *user_data)
{
- const uint hflag_pair = GET_INT_FROM_POINTER(user_data);
+ const uint hflag_pair = POINTER_AS_INT(user_data);
const char hflag_p = (hflag_pair & 0xff);
const char hflag_n = (hflag_pair >> 8);
@@ -42,14 +42,14 @@ bool BM_elem_cb_check_hflag_ex(BMElem *ele, void *user_data)
bool BM_elem_cb_check_hflag_enabled(BMElem *ele, void *user_data)
{
- const char hflag = GET_INT_FROM_POINTER(user_data);
+ const char hflag = POINTER_AS_INT(user_data);
return (BM_elem_flag_test(ele, hflag) != 0);
}
bool BM_elem_cb_check_hflag_disabled(BMElem *ele, void *user_data)
{
- const char hflag = GET_INT_FROM_POINTER(user_data);
+ const char hflag = POINTER_AS_INT(user_data);
return (BM_elem_flag_test(ele, hflag) == 0);
}
diff --git a/source/blender/bmesh/intern/bmesh_callback_generic.h b/source/blender/bmesh/intern/bmesh_callback_generic.h
index 3cae01d417f..44495d54edd 100644
--- a/source/blender/bmesh/intern/bmesh_callback_generic.h
+++ b/source/blender/bmesh/intern/bmesh_callback_generic.h
@@ -32,14 +32,14 @@ bool BM_elem_cb_check_elem_not_equal(BMElem *ele, void *user_data);
#define BM_elem_cb_check_hflag_ex_simple(type, hflag_p, hflag_n) \
(bool (*)(type, void *))BM_elem_cb_check_hflag_ex, \
- SET_UINT_IN_POINTER(((hflag_p) | (hflag_n << 8)))
+ POINTER_FROM_UINT(((hflag_p) | (hflag_n << 8)))
#define BM_elem_cb_check_hflag_enabled_simple(type, hflag_p) \
(bool (*)(type, void *))BM_elem_cb_check_hflag_enabled, \
- SET_UINT_IN_POINTER((hflag_p))
+ POINTER_FROM_UINT((hflag_p))
#define BM_elem_cb_check_hflag_disabled_simple(type, hflag_n) \
(bool (*)(type, void *))BM_elem_cb_check_hflag_disabled, \
- SET_UINT_IN_POINTER(hflag_n)
+ POINTER_FROM_UINT(hflag_n)
#endif /* __BMESH_CALLBACK_GENERIC_H__ */
diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c
index 4959258c1fe..d1872255c55 100644
--- a/source/blender/bmesh/intern/bmesh_interp.c
+++ b/source/blender/bmesh/intern/bmesh_interp.c
@@ -583,18 +583,19 @@ void BM_face_multires_bounds_smooth(BMesh *bm, BMFace *f)
int sides;
int y;
- /*
- * mdisps is a grid of displacements, ordered thus:
- *
- * v4/next
- * |
- * | v1/cent-----mid2 ---> x
- * | | |
- * | | |
- * v2/prev---mid1-----v3/cur
- * |
- * V
- * y
+ /**
+ * mdisps is a grid of displacements, ordered thus:
+ * <pre>
+ * v4/next
+ * |
+ * | v1/cent-----mid2 ---> x
+ * | | |
+ * | | |
+ * v2/prev---mid1-----v3/cur
+ * |
+ * V
+ * y
+ * </pre>
*/
sides = (int)sqrt(mdp->totdisp);
@@ -613,18 +614,19 @@ void BM_face_multires_bounds_smooth(BMesh *bm, BMFace *f)
int sides;
int y;
- /*
- * mdisps is a grid of displacements, ordered thus:
- *
- * v4/next
- * |
- * | v1/cent-----mid2 ---> x
- * | | |
- * | | |
- * v2/prev---mid1-----v3/cur
- * |
- * V
- * y
+ /**
+ * mdisps is a grid of displacements, ordered thus:
+ * <pre>
+ * v4/next
+ * |
+ * | v1/cent-----mid2 ---> x
+ * | | |
+ * | | |
+ * v2/prev---mid1-----v3/cur
+ * |
+ * V
+ * y
+ * </pre>
*/
if (l->radial_next == l)
diff --git a/source/blender/bmesh/intern/bmesh_log.c b/source/blender/bmesh/intern/bmesh_log.c
index 30ab0dd9459..732647f83a7 100644
--- a/source/blender/bmesh/intern/bmesh_log.c
+++ b/source/blender/bmesh/intern/bmesh_log.c
@@ -134,13 +134,13 @@ typedef struct {
static uint bm_log_vert_id_get(BMLog *log, BMVert *v)
{
BLI_assert(BLI_ghash_haskey(log->elem_to_id, v));
- return GET_UINT_FROM_POINTER(BLI_ghash_lookup(log->elem_to_id, v));
+ return POINTER_AS_UINT(BLI_ghash_lookup(log->elem_to_id, v));
}
/* Set the vertex's unique ID in the log */
static void bm_log_vert_id_set(BMLog *log, BMVert *v, uint id)
{
- void *vid = SET_UINT_IN_POINTER(id);
+ void *vid = POINTER_FROM_UINT(id);
BLI_ghash_reinsert(log->id_to_elem, vid, v, NULL, NULL);
BLI_ghash_reinsert(log->elem_to_id, v, vid, NULL, NULL);
@@ -149,7 +149,7 @@ static void bm_log_vert_id_set(BMLog *log, BMVert *v, uint id)
/* Get a vertex from its unique ID */
static BMVert *bm_log_vert_from_id(BMLog *log, uint id)
{
- void *key = SET_UINT_IN_POINTER(id);
+ void *key = POINTER_FROM_UINT(id);
BLI_assert(BLI_ghash_haskey(log->id_to_elem, key));
return BLI_ghash_lookup(log->id_to_elem, key);
}
@@ -158,13 +158,13 @@ static BMVert *bm_log_vert_from_id(BMLog *log, uint id)
static uint bm_log_face_id_get(BMLog *log, BMFace *f)
{
BLI_assert(BLI_ghash_haskey(log->elem_to_id, f));
- return GET_UINT_FROM_POINTER(BLI_ghash_lookup(log->elem_to_id, f));
+ return POINTER_AS_UINT(BLI_ghash_lookup(log->elem_to_id, f));
}
/* Set the face's unique ID in the log */
static void bm_log_face_id_set(BMLog *log, BMFace *f, uint id)
{
- void *fid = SET_UINT_IN_POINTER(id);
+ void *fid = POINTER_FROM_UINT(id);
BLI_ghash_reinsert(log->id_to_elem, fid, f, NULL, NULL);
BLI_ghash_reinsert(log->elem_to_id, f, fid, NULL, NULL);
@@ -173,7 +173,7 @@ static void bm_log_face_id_set(BMLog *log, BMFace *f, uint id)
/* Get a face from its unique ID */
static BMFace *bm_log_face_from_id(BMLog *log, uint id)
{
- void *key = SET_UINT_IN_POINTER(id);
+ void *key = POINTER_FROM_UINT(id);
BLI_assert(BLI_ghash_haskey(log->id_to_elem, key));
return BLI_ghash_lookup(log->id_to_elem, key);
}
@@ -255,7 +255,7 @@ static void bm_log_verts_unmake(BMesh *bm, BMLog *log, GHash *verts)
GHASH_ITER (gh_iter, verts) {
void *key = BLI_ghashIterator_getKey(&gh_iter);
BMLogVert *lv = BLI_ghashIterator_getValue(&gh_iter);
- uint id = GET_UINT_FROM_POINTER(key);
+ uint id = POINTER_AS_UINT(key);
BMVert *v = bm_log_vert_from_id(log, id);
/* Ensure the log has the final values of the vertex before
@@ -271,7 +271,7 @@ static void bm_log_faces_unmake(BMesh *bm, BMLog *log, GHash *faces)
GHashIterator gh_iter;
GHASH_ITER (gh_iter, faces) {
void *key = BLI_ghashIterator_getKey(&gh_iter);
- uint id = GET_UINT_FROM_POINTER(key);
+ uint id = POINTER_AS_UINT(key);
BMFace *f = bm_log_face_from_id(log, id);
BMEdge *e_tri[3];
BMLoop *l_iter;
@@ -304,7 +304,7 @@ static void bm_log_verts_restore(BMesh *bm, BMLog *log, GHash *verts)
vert_mask_set(v, lv->mask, cd_vert_mask_offset);
v->head.hflag = lv->hflag;
normal_short_to_float_v3(v->no, lv->no);
- bm_log_vert_id_set(log, v, GET_UINT_FROM_POINTER(key));
+ bm_log_vert_id_set(log, v, POINTER_AS_UINT(key));
}
}
@@ -321,7 +321,7 @@ static void bm_log_faces_restore(BMesh *bm, BMLog *log, GHash *faces)
f = BM_face_create_verts(bm, v, 3, NULL, BM_CREATE_NOP, true);
f->head.hflag = lf->hflag;
- bm_log_face_id_set(log, f, GET_UINT_FROM_POINTER(key));
+ bm_log_face_id_set(log, f, POINTER_AS_UINT(key));
}
}
@@ -333,7 +333,7 @@ static void bm_log_vert_values_swap(BMesh *bm, BMLog *log, GHash *verts)
GHASH_ITER (gh_iter, verts) {
void *key = BLI_ghashIterator_getKey(&gh_iter);
BMLogVert *lv = BLI_ghashIterator_getValue(&gh_iter);
- uint id = GET_UINT_FROM_POINTER(key);
+ uint id = POINTER_AS_UINT(key);
BMVert *v = bm_log_vert_from_id(log, id);
float mask;
short normal[3];
@@ -355,7 +355,7 @@ static void bm_log_face_values_swap(BMLog *log, GHash *faces)
GHASH_ITER (gh_iter, faces) {
void *key = BLI_ghashIterator_getKey(&gh_iter);
BMLogFace *lf = BLI_ghashIterator_getValue(&gh_iter);
- uint id = GET_UINT_FROM_POINTER(key);
+ uint id = POINTER_AS_UINT(key);
BMFace *f = bm_log_face_from_id(log, id);
SWAP(char, f->head.hflag, lf->hflag);
@@ -425,7 +425,7 @@ static void bm_log_id_ghash_retake(RangeTreeUInt *unused_ids, GHash *id_ghash)
GHASH_ITER (gh_iter, id_ghash) {
void *key = BLI_ghashIterator_getKey(&gh_iter);
- uint id = GET_UINT_FROM_POINTER(key);
+ uint id = POINTER_AS_UINT(key);
range_tree_uint_retake(unused_ids, id);
}
@@ -454,8 +454,8 @@ static GHash *bm_log_compress_ids_to_indices(uint *ids, uint totid)
qsort(ids, totid, sizeof(*ids), uint_compare);
for (i = 0; i < totid; i++) {
- void *key = SET_UINT_IN_POINTER(ids[i]);
- void *val = SET_UINT_IN_POINTER(i);
+ void *key = POINTER_FROM_UINT(ids[i]);
+ void *val = POINTER_FROM_UINT(i);
BLI_ghash_insert(map, key, val);
}
@@ -469,7 +469,7 @@ static void bm_log_id_ghash_release(BMLog *log, GHash *id_ghash)
GHASH_ITER (gh_iter, id_ghash) {
void *key = BLI_ghashIterator_getKey(&gh_iter);
- uint id = GET_UINT_FROM_POINTER(key);
+ uint id = POINTER_AS_UINT(key);
range_tree_uint_release(log->unused_ids, id);
}
}
@@ -620,9 +620,9 @@ void BM_log_mesh_elems_reorder(BMesh *bm, BMLog *log)
id_to_idx = bm_log_compress_ids_to_indices(varr, (uint)bm->totvert);
BM_ITER_MESH_INDEX (v, &bm_iter, bm, BM_VERTS_OF_MESH, i) {
const unsigned id = bm_log_vert_id_get(log, v);
- const void *key = SET_UINT_IN_POINTER(id);
+ const void *key = POINTER_FROM_UINT(id);
const void *val = BLI_ghash_lookup(id_to_idx, key);
- varr[i] = GET_UINT_FROM_POINTER(val);
+ varr[i] = POINTER_AS_UINT(val);
}
BLI_ghash_free(id_to_idx, NULL, NULL);
@@ -630,9 +630,9 @@ void BM_log_mesh_elems_reorder(BMesh *bm, BMLog *log)
id_to_idx = bm_log_compress_ids_to_indices(farr, (uint)bm->totface);
BM_ITER_MESH_INDEX (f, &bm_iter, bm, BM_FACES_OF_MESH, i) {
const unsigned id = bm_log_face_id_get(log, f);
- const void *key = SET_UINT_IN_POINTER(id);
+ const void *key = POINTER_FROM_UINT(id);
const void *val = BLI_ghash_lookup(id_to_idx, key);
- farr[i] = GET_UINT_FROM_POINTER(val);
+ farr[i] = POINTER_AS_UINT(val);
}
BLI_ghash_free(id_to_idx, NULL, NULL);
@@ -840,7 +840,7 @@ void BM_log_vert_before_modified(BMLog *log, BMVert *v, const int cd_vert_mask_o
BMLogEntry *entry = log->current_entry;
BMLogVert *lv;
uint v_id = bm_log_vert_id_get(log, v);
- void *key = SET_UINT_IN_POINTER(v_id);
+ void *key = POINTER_FROM_UINT(v_id);
void **val_p;
/* Find or create the BMLogVert entry */
@@ -864,7 +864,7 @@ void BM_log_vert_added(BMLog *log, BMVert *v, const int cd_vert_mask_offset)
{
BMLogVert *lv;
uint v_id = range_tree_uint_take_any(log->unused_ids);
- void *key = SET_UINT_IN_POINTER(v_id);
+ void *key = POINTER_FROM_UINT(v_id);
bm_log_vert_id_set(log, v, v_id);
lv = bm_log_vert_alloc(log, v, cd_vert_mask_offset);
@@ -881,7 +881,7 @@ void BM_log_face_modified(BMLog *log, BMFace *f)
{
BMLogFace *lf;
uint f_id = bm_log_face_id_get(log, f);
- void *key = SET_UINT_IN_POINTER(f_id);
+ void *key = POINTER_FROM_UINT(f_id);
lf = bm_log_face_alloc(log, f);
BLI_ghash_insert(log->current_entry->modified_faces, key, lf);
@@ -897,7 +897,7 @@ void BM_log_face_added(BMLog *log, BMFace *f)
{
BMLogFace *lf;
uint f_id = range_tree_uint_take_any(log->unused_ids);
- void *key = SET_UINT_IN_POINTER(f_id);
+ void *key = POINTER_FROM_UINT(f_id);
/* Only triangles are supported for now */
BLI_assert(f->len == 3);
@@ -927,7 +927,7 @@ void BM_log_vert_removed(BMLog *log, BMVert *v, const int cd_vert_mask_offset)
{
BMLogEntry *entry = log->current_entry;
uint v_id = bm_log_vert_id_get(log, v);
- void *key = SET_UINT_IN_POINTER(v_id);
+ void *key = POINTER_FROM_UINT(v_id);
/* if it has a key, it shouldn't be NULL */
BLI_assert(!!BLI_ghash_lookup(entry->added_verts, key) ==
@@ -968,7 +968,7 @@ void BM_log_face_removed(BMLog *log, BMFace *f)
{
BMLogEntry *entry = log->current_entry;
uint f_id = bm_log_face_id_get(log, f);
- void *key = SET_UINT_IN_POINTER(f_id);
+ void *key = POINTER_FROM_UINT(f_id);
/* if it has a key, it shouldn't be NULL */
BLI_assert(!!BLI_ghash_lookup(entry->added_faces, key) ==
@@ -1040,7 +1040,7 @@ const float *BM_log_original_vert_co(BMLog *log, BMVert *v)
BMLogEntry *entry = log->current_entry;
const BMLogVert *lv;
unsigned v_id = bm_log_vert_id_get(log, v);
- void *key = SET_UINT_IN_POINTER(v_id);
+ void *key = POINTER_FROM_UINT(v_id);
BLI_assert(entry);
@@ -1058,7 +1058,7 @@ const short *BM_log_original_vert_no(BMLog *log, BMVert *v)
BMLogEntry *entry = log->current_entry;
const BMLogVert *lv;
unsigned v_id = bm_log_vert_id_get(log, v);
- void *key = SET_UINT_IN_POINTER(v_id);
+ void *key = POINTER_FROM_UINT(v_id);
BLI_assert(entry);
@@ -1076,7 +1076,7 @@ float BM_log_original_mask(BMLog *log, BMVert *v)
BMLogEntry *entry = log->current_entry;
const BMLogVert *lv;
unsigned v_id = bm_log_vert_id_get(log, v);
- void *key = SET_UINT_IN_POINTER(v_id);
+ void *key = POINTER_FROM_UINT(v_id);
BLI_assert(entry);
@@ -1093,7 +1093,7 @@ void BM_log_original_vert_data(
BMLogEntry *entry = log->current_entry;
const BMLogVert *lv;
unsigned v_id = bm_log_vert_id_get(log, v);
- void *key = SET_UINT_IN_POINTER(v_id);
+ void *key = POINTER_FROM_UINT(v_id);
BLI_assert(entry);
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index 0dcbc05b201..bb3c939f161 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -29,7 +29,6 @@
#include "MEM_guardedalloc.h"
#include "DNA_listBase.h"
-#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "BLI_linklist_stack.h"
@@ -1096,24 +1095,24 @@ void BM_lnorspace_invalidate(BMesh *bm, const bool do_invalidate_all)
BMLoop *l;
BMIter viter, liter;
/* Note: we could use temp tag of BMItem for that, but probably better not use it in such a low-level func?
- * --mont29 */
+ * --mont29 */
BLI_bitmap *done_verts = BLI_BITMAP_NEW(bm->totvert, __func__);
BM_mesh_elem_index_ensure(bm, BM_VERT);
/* When we affect a given vertex, we may affect following smooth fans:
- * - all smooth fans of said vertex;
- * - all smooth fans of all immediate loop-neighbors vertices;
- * This can be simplified as 'all loops of selected vertices and their immediate neighbors'
- * need to be tagged for update.
- */
+ * - all smooth fans of said vertex;
+ * - all smooth fans of all immediate loop-neighbors vertices;
+ * This can be simplified as 'all loops of selected vertices and their immediate neighbors'
+ * need to be tagged for update.
+ */
BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
BM_ITER_ELEM(l, &liter, v, BM_LOOPS_OF_VERT) {
BM_ELEM_API_FLAG_ENABLE(l, BM_LNORSPACE_UPDATE);
/* Note that we only handle unselected neighbor vertices here, main loop will take care of
- * selected ones. */
+ * selected ones. */
if ((!BM_elem_flag_test(l->prev->v, BM_ELEM_SELECT)) &&
!BLI_BITMAP_TEST(done_verts, BM_elem_index_get(l->prev->v)))
{
@@ -1265,10 +1264,10 @@ void BM_normals_loops_edges_tag(BMesh *bm, const bool do_edges)
}
/**
-* Auxillary function only used by rebuild to detect if any spaces were not marked as invalid.
-* Reports error if any of the lnor spaces change after rebuilding, meaning that all the possible
-* lnor spaces to be rebuilt were not correctly marked.
-*/
+ * Auxillary function only used by rebuild to detect if any spaces were not marked as invalid.
+ * Reports error if any of the lnor spaces change after rebuilding, meaning that all the possible
+ * lnor spaces to be rebuilt were not correctly marked.
+ */
#ifndef NDEBUG
void BM_lnorspace_err(BMesh *bm)
{
@@ -1877,28 +1876,6 @@ void BM_mesh_elem_table_free(BMesh *bm, const char htype)
}
}
-BMVert *BM_vert_at_index(BMesh *bm, const int index)
-{
- BLI_assert((index >= 0) && (index < bm->totvert));
- BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
- return bm->vtable[index];
-}
-
-BMEdge *BM_edge_at_index(BMesh *bm, const int index)
-{
- BLI_assert((index >= 0) && (index < bm->totedge));
- BLI_assert((bm->elem_table_dirty & BM_EDGE) == 0);
- return bm->etable[index];
-}
-
-BMFace *BM_face_at_index(BMesh *bm, const int index)
-{
- BLI_assert((index >= 0) && (index < bm->totface));
- BLI_assert((bm->elem_table_dirty & BM_FACE) == 0);
- return bm->ftable[index];
-}
-
-
BMVert *BM_vert_at_index_find(BMesh *bm, const int index)
{
return BLI_mempool_findelem(bm->vpool, index);
diff --git a/source/blender/bmesh/intern/bmesh_mesh.h b/source/blender/bmesh/intern/bmesh_mesh.h
index c7192590b79..dfd76c6b89f 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.h
+++ b/source/blender/bmesh/intern/bmesh_mesh.h
@@ -91,9 +91,24 @@ void BM_mesh_elem_table_ensure(BMesh *bm, const char htype);
void BM_mesh_elem_table_init(BMesh *bm, const char htype);
void BM_mesh_elem_table_free(BMesh *bm, const char htype);
-BMVert *BM_vert_at_index(BMesh *bm, const int index);
-BMEdge *BM_edge_at_index(BMesh *bm, const int index);
-BMFace *BM_face_at_index(BMesh *bm, const int index);
+BLI_INLINE BMVert *BM_vert_at_index(BMesh *bm, const int index)
+{
+ BLI_assert((index >= 0) && (index < bm->totvert));
+ BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
+ return bm->vtable[index];
+}
+BLI_INLINE BMEdge *BM_edge_at_index(BMesh *bm, const int index)
+{
+ BLI_assert((index >= 0) && (index < bm->totedge));
+ BLI_assert((bm->elem_table_dirty & BM_EDGE) == 0);
+ return bm->etable[index];
+}
+BLI_INLINE BMFace *BM_face_at_index(BMesh *bm, const int index)
+{
+ BLI_assert((index >= 0) && (index < bm->totface));
+ BLI_assert((bm->elem_table_dirty & BM_FACE) == 0);
+ return bm->ftable[index];
+}
BMVert *BM_vert_at_index_find(BMesh *bm, const int index);
BMEdge *BM_edge_at_index_find(BMesh *bm, const int index);
diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.c b/source/blender/bmesh/intern/bmesh_mesh_conv.c
index 7e1e1c53a8f..9f1b032ea0b 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_conv.c
+++ b/source/blender/bmesh/intern/bmesh_mesh_conv.c
@@ -209,13 +209,15 @@ void BM_mesh_bm_from_me(
BMFace *f, **ftable = NULL;
float (*keyco)[3] = NULL;
int totloops, i;
+ const int64_t mask = CD_MASK_BMESH | params->cd_mask_extra;
+ const int64_t mask_loop_only = mask & ~CD_MASK_ORIGINDEX;
if (!me || !me->totvert) {
if (me && is_new) { /*no verts? still copy customdata layout*/
- CustomData_copy(&me->vdata, &bm->vdata, CD_MASK_BMESH, CD_ASSIGN, 0);
- CustomData_copy(&me->edata, &bm->edata, CD_MASK_BMESH, CD_ASSIGN, 0);
- CustomData_copy(&me->ldata, &bm->ldata, CD_MASK_BMESH, CD_ASSIGN, 0);
- CustomData_copy(&me->pdata, &bm->pdata, CD_MASK_BMESH, CD_ASSIGN, 0);
+ CustomData_copy(&me->vdata, &bm->vdata, mask, CD_ASSIGN, 0);
+ CustomData_copy(&me->edata, &bm->edata, mask, CD_ASSIGN, 0);
+ CustomData_copy(&me->ldata, &bm->ldata, mask_loop_only, CD_ASSIGN, 0);
+ CustomData_copy(&me->pdata, &bm->pdata, mask, CD_ASSIGN, 0);
CustomData_bmesh_init_pool(&bm->vdata, me->totvert, BM_VERT);
CustomData_bmesh_init_pool(&bm->edata, me->totedge, BM_EDGE);
@@ -226,10 +228,10 @@ void BM_mesh_bm_from_me(
}
if (is_new) {
- CustomData_copy(&me->vdata, &bm->vdata, CD_MASK_BMESH, CD_CALLOC, 0);
- CustomData_copy(&me->edata, &bm->edata, CD_MASK_BMESH, CD_CALLOC, 0);
- CustomData_copy(&me->ldata, &bm->ldata, CD_MASK_BMESH, CD_CALLOC, 0);
- CustomData_copy(&me->pdata, &bm->pdata, CD_MASK_BMESH, CD_CALLOC, 0);
+ CustomData_copy(&me->vdata, &bm->vdata, mask, CD_CALLOC, 0);
+ CustomData_copy(&me->edata, &bm->edata, mask, CD_CALLOC, 0);
+ CustomData_copy(&me->ldata, &bm->ldata, mask_loop_only, CD_CALLOC, 0);
+ CustomData_copy(&me->pdata, &bm->pdata, mask, CD_CALLOC, 0);
}
/* -------------------------------------------------------------------- */
@@ -946,3 +948,152 @@ void BM_mesh_bm_to_me(
/* to be removed as soon as COW is enabled by default. */
BKE_mesh_runtime_clear_geometry(me);
}
+
+/**
+ * A version of #BM_mesh_bm_to_me intended for getting the mesh to pass to the modifier stack for evaluation,
+ * instad of mode switching (where we make sure all data is kept and do expensive lookups to maintain shape keys).
+ *
+ * Key differences:
+ *
+ * - Don't support merging with existing mesh.
+ * - Ignore shape-keys.
+ * - Ignore vertex-parents.
+ * - Ignore selection history.
+ * - Uses simpler method to calculate #ME_EDGEDRAW
+ * - Uses #CD_MASK_DERIVEDMESH instead of #CD_MASK_MESH.
+ *
+ * \note Was `cddm_from_bmesh_ex` in 2.7x, removed `MFace` support.
+ */
+void BM_mesh_bm_to_me_for_eval(BMesh *bm, Mesh *me, const int64_t cd_mask_extra)
+{
+ /* must be an empty mesh. */
+ BLI_assert(me->totvert == 0);
+ BLI_assert((cd_mask_extra & CD_MASK_SHAPEKEY) == 0);
+
+ me->totvert = bm->totvert;
+ me->totedge = bm->totedge;
+ me->totface = 0;
+ me->totloop = bm->totloop;
+ me->totpoly = bm->totface;
+
+ CustomData_add_layer(&me->vdata, CD_ORIGINDEX, CD_CALLOC, NULL, bm->totvert);
+ CustomData_add_layer(&me->edata, CD_ORIGINDEX, CD_CALLOC, NULL, bm->totedge);
+ CustomData_add_layer(&me->pdata, CD_ORIGINDEX, CD_CALLOC, NULL, bm->totface);
+
+ CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, bm->totvert);
+ CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, bm->totedge);
+ CustomData_add_layer(&me->ldata, CD_MLOOP, CD_CALLOC, NULL, bm->totloop);
+ CustomData_add_layer(&me->pdata, CD_MPOLY, CD_CALLOC, NULL, bm->totface);
+
+ /* don't process shapekeys, we only feed them through the modifier stack as needed,
+ * e.g. for applying modifiers or the like*/
+ const CustomDataMask mask = (CD_MASK_DERIVEDMESH | cd_mask_extra) & ~CD_MASK_SHAPEKEY;
+ CustomData_merge(&bm->vdata, &me->vdata, mask, CD_CALLOC, me->totvert);
+ CustomData_merge(&bm->edata, &me->edata, mask, CD_CALLOC, me->totedge);
+ CustomData_merge(&bm->ldata, &me->ldata, mask, CD_CALLOC, me->totloop);
+ CustomData_merge(&bm->pdata, &me->pdata, mask, CD_CALLOC, me->totpoly);
+
+ BKE_mesh_update_customdata_pointers(me, false);
+
+ BMIter iter;
+ BMVert *eve;
+ BMEdge *eed;
+ BMFace *efa;
+ MVert *mvert = me->mvert;
+ MEdge *medge = me->medge;
+ MLoop *mloop = me->mloop;
+ MPoly *mpoly = me->mpoly;
+ int *index, add_orig;
+ unsigned int i, j;
+
+ const int cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT);
+ const int cd_edge_bweight_offset = CustomData_get_offset(&bm->edata, CD_BWEIGHT);
+ const int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
+
+ me->runtime.deformed_only = true;
+
+ /* don't add origindex layer if one already exists */
+ add_orig = !CustomData_has_layer(&bm->pdata, CD_ORIGINDEX);
+
+ index = CustomData_get_layer(&me->vdata, CD_ORIGINDEX);
+
+ BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
+ MVert *mv = &mvert[i];
+
+ copy_v3_v3(mv->co, eve->co);
+
+ BM_elem_index_set(eve, i); /* set_inline */
+
+ normal_float_to_short_v3(mv->no, eve->no);
+
+ mv->flag = BM_vert_flag_to_mflag(eve);
+
+ if (cd_vert_bweight_offset != -1) mv->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset);
+
+ if (add_orig) *index++ = i;
+
+ CustomData_from_bmesh_block(&bm->vdata, &me->vdata, eve->head.data, i);
+ }
+ bm->elem_index_dirty &= ~BM_VERT;
+
+ index = CustomData_get_layer(&me->edata, CD_ORIGINDEX);
+ BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) {
+ MEdge *med = &medge[i];
+
+ BM_elem_index_set(eed, i); /* set_inline */
+
+ med->v1 = BM_elem_index_get(eed->v1);
+ med->v2 = BM_elem_index_get(eed->v2);
+
+ med->flag = BM_edge_flag_to_mflag(eed);
+
+ /* handle this differently to editmode switching,
+ * only enable draw for single user edges rather then calculating angle */
+ if ((med->flag & ME_EDGEDRAW) == 0) {
+ if (eed->l && eed->l == eed->l->radial_next) {
+ med->flag |= ME_EDGEDRAW;
+ }
+ }
+
+ if (cd_edge_crease_offset != -1) med->crease = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_crease_offset);
+ if (cd_edge_bweight_offset != -1) med->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_bweight_offset);
+
+ CustomData_from_bmesh_block(&bm->edata, &me->edata, eed->head.data, i);
+ if (add_orig) *index++ = i;
+ }
+ bm->elem_index_dirty &= ~BM_EDGE;
+
+ index = CustomData_get_layer(&me->pdata, CD_ORIGINDEX);
+ j = 0;
+ BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) {
+ BMLoop *l_iter;
+ BMLoop *l_first;
+ MPoly *mp = &mpoly[i];
+
+ BM_elem_index_set(efa, i); /* set_inline */
+
+ mp->totloop = efa->len;
+ mp->flag = BM_face_flag_to_mflag(efa);
+ mp->loopstart = j;
+ mp->mat_nr = efa->mat_nr;
+
+ l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
+ do {
+ mloop->v = BM_elem_index_get(l_iter->v);
+ mloop->e = BM_elem_index_get(l_iter->e);
+ CustomData_from_bmesh_block(&bm->ldata, &me->ldata, l_iter->head.data, j);
+
+ BM_elem_index_set(l_iter, j); /* set_inline */
+
+ j++;
+ mloop++;
+ } while ((l_iter = l_iter->next) != l_first);
+
+ CustomData_from_bmesh_block(&bm->pdata, &me->pdata, efa->head.data, i);
+
+ if (add_orig) *index++ = i;
+ }
+ bm->elem_index_dirty &= ~(BM_FACE | BM_LOOP);
+
+ me->cd_flag = BM_mesh_cd_flag_from_bmesh(bm);
+}
diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.h b/source/blender/bmesh/intern/bmesh_mesh_conv.h
index 008960e7f6e..0560155faa0 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_conv.h
+++ b/source/blender/bmesh/intern/bmesh_mesh_conv.h
@@ -49,6 +49,7 @@ struct BMeshFromMeshParams {
uint use_shapekey : 1;
/* define the active shape key (index + 1) */
int active_shapekey;
+ int64_t cd_mask_extra;
};
void BM_mesh_bm_from_me(
BMesh *bm, struct Mesh *me,
@@ -65,4 +66,9 @@ void BM_mesh_bm_to_me(
const struct BMeshToMeshParams *params)
ATTR_NONNULL(2, 3, 4);
+void BM_mesh_bm_to_me_for_eval(
+ BMesh *bm, struct Mesh *me, const int64_t cd_mask_extra)
+ATTR_NONNULL(1, 2);
+
+
#endif /* __BMESH_MESH_CONV_H__ */
diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c
index 46ea882c0a1..cc023be3004 100644
--- a/source/blender/bmesh/intern/bmesh_opdefines.c
+++ b/source/blender/bmesh/intern/bmesh_opdefines.c
@@ -116,13 +116,6 @@ static BMO_FlagSet bmo_enum_falloff_type[] = {
{0, NULL},
};
-static BMO_FlagSet bmo_enum_compare_types[] = {
- {SIM_CMP_EQ, "EQUAL"},
- {SIM_CMP_GT, "GREATER_THAN"},
- {SIM_CMP_LT, "LESS_THAN"},
- {0, NULL},
-};
-
/*
* Vertex Smooth.
*
@@ -931,6 +924,7 @@ static BMOpDefine bmo_extrude_discrete_faces_def = {
"extrude_discrete_faces",
/* slots_in */
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
+ {"use_normal_flip", BMO_OP_SLOT_BOOL}, /* Create faces with reversed direction. */
{"use_select_history", BMO_OP_SLOT_BOOL}, /* pass to duplicate */
{{'\0'}},
},
@@ -952,6 +946,7 @@ static BMOpDefine bmo_extrude_edge_only_def = {
"extrude_edge_only",
/* slots_in */
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input vertices */
+ {"use_normal_flip", BMO_OP_SLOT_BOOL}, /* Create faces with reversed direction. */
{"use_select_history", BMO_OP_SLOT_BOOL}, /* pass to duplicate */
{{'\0'}},
},
@@ -1087,6 +1082,7 @@ static BMOpDefine bmo_extrude_face_region_def = {
{{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* edges and faces */
{"edges_exclude", BMO_OP_SLOT_MAPPING, {(int)BMO_OP_SLOT_SUBTYPE_MAP_EMPTY}},
{"use_keep_orig", BMO_OP_SLOT_BOOL}, /* keep original geometry (requires ``geom`` to include edges). */
+ {"use_normal_flip", BMO_OP_SLOT_BOOL}, /* Create faces with reversed direction. */
{"use_select_history", BMO_OP_SLOT_BOOL}, /* pass to duplicate */
{{'\0'}},
},
@@ -1547,6 +1543,8 @@ static BMOpDefine bmo_spin_def = {
{"angle", BMO_OP_SLOT_FLT}, /* total rotation angle (radians) */
{"space", BMO_OP_SLOT_MAT}, /* matrix to define the space (typically object matrix) */
{"steps", BMO_OP_SLOT_INT}, /* number of steps */
+ {"use_merge", BMO_OP_SLOT_BOOL}, /* Merge first/last when the angle is a full revolution. */
+ {"use_normal_flip", BMO_OP_SLOT_BOOL}, /* Create faces with reversed direction. */
{"use_duplicate", BMO_OP_SLOT_BOOL}, /* duplicate or extrude? */
{{'\0'}},
},
@@ -1559,110 +1557,6 @@ static BMOpDefine bmo_spin_def = {
BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
-static BMO_FlagSet bmo_enum_similar_faces_types[] = {
- {SIMFACE_MATERIAL, "MATERIAL"},
- {SIMFACE_AREA, "AREA"},
- {SIMFACE_SIDES, "SIDES"},
- {SIMFACE_PERIMETER, "PERIMETER"},
- {SIMFACE_NORMAL, "NORMAL"},
- {SIMFACE_COPLANAR, "COPLANAR"},
- {SIMFACE_SMOOTH, "SMOOTH"},
- {SIMFACE_FACEMAP, "FACE_MAP"},
-#ifdef WITH_FREESTYLE
- {SIMFACE_FREESTYLE, "FREESTYLE"},
-#endif
- {0, NULL},
-};
-
-/*
- * Similar Faces Search.
- *
- * Find similar faces (area/material/perimeter, ...).
- */
-static BMOpDefine bmo_similar_faces_def = {
- "similar_faces",
- /* slots_in */
- {{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
- {"type", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM}, bmo_enum_similar_faces_types}, /* type of selection */
- {"thresh", BMO_OP_SLOT_FLT}, /* threshold of selection */
- {"compare", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM}, bmo_enum_compare_types}, /* comparison method */
- {{'\0'}},
- },
- /* slots_out */
- {{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* output faces */
- {{'\0'}},
- },
- bmo_similar_faces_exec,
- (BMO_OPTYPE_FLAG_SELECT_FLUSH),
-};
-
-static BMO_FlagSet bmo_enum_similar_edges_types[] = {
- {SIMEDGE_LENGTH, "LENGTH"},
- {SIMEDGE_DIR, "DIRECTION"},
- {SIMEDGE_FACE, "FACE"},
- {SIMEDGE_FACE_ANGLE, "FACE_ANGLE"},
- {SIMEDGE_CREASE, "CREASE"},
- {SIMEDGE_BEVEL, "BEVEL"},
- {SIMEDGE_SEAM, "SEAM"},
- {SIMEDGE_SHARP, "SHARP"},
-#ifdef WITH_FREESTYLE
- {SIMEDGE_FREESTYLE, "FREESTYLE"},
-#endif
- {0, NULL},
-};
-
-/*
- * Similar Edges Search.
- *
- * Find similar edges (length, direction, edge, seam, ...).
- */
-static BMOpDefine bmo_similar_edges_def = {
- "similar_edges",
- /* slots_in */
- {{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
- {"type", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM}, bmo_enum_similar_edges_types}, /* type of selection */
- {"thresh", BMO_OP_SLOT_FLT}, /* threshold of selection */
- {"compare", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM}, bmo_enum_compare_types}, /* comparison method */
- {{'\0'}},
- },
- /* slots_out */
- {{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* output edges */
- {{'\0'}},
- },
- bmo_similar_edges_exec,
- (BMO_OPTYPE_FLAG_SELECT_FLUSH),
-};
-
-static BMO_FlagSet bmo_enum_similar_verts_types[] = {
- {SIMVERT_NORMAL, "NORMAL"},
- {SIMVERT_FACE, "FACE"},
- {SIMVERT_VGROUP, "VERTEX_GROUP"},
- {SIMVERT_EDGE, "EDGE"},
- {0, NULL},
-};
-
-/*
- * Similar Verts Search.
- *
- * Find similar vertices (normal, face, vertex group, ...).
- */
-static BMOpDefine bmo_similar_verts_def = {
- "similar_verts",
- /* slots_in */
- {{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
- {"type", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM}, bmo_enum_similar_verts_types}, /* type of selection */
- {"thresh", BMO_OP_SLOT_FLT}, /* threshold of selection */
- {"compare", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM}, bmo_enum_compare_types}, /* comparison method */
- {{'\0'}},
- },
- /* slots_out */
- {{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* output vertices */
- {{'\0'}},
- },
- bmo_similar_verts_exec,
- (BMO_OPTYPE_FLAG_SELECT_FLUSH),
-};
-
/*
* UV Rotation.
*
@@ -2321,9 +2215,6 @@ const BMOpDefine *bmo_opdefines[] = {
&bmo_rotate_edges_def,
&bmo_rotate_uvs_def,
&bmo_scale_def,
- &bmo_similar_edges_def,
- &bmo_similar_faces_def,
- &bmo_similar_verts_def,
&bmo_smooth_vert_def,
&bmo_smooth_laplacian_vert_def,
&bmo_solidify_def,
diff --git a/source/blender/bmesh/intern/bmesh_operators.h b/source/blender/bmesh/intern/bmesh_operators.h
index 6d518545967..3e96d5ff44a 100644
--- a/source/blender/bmesh/intern/bmesh_operators.h
+++ b/source/blender/bmesh/intern/bmesh_operators.h
@@ -56,12 +56,6 @@ enum {
SUBDIV_SELECT_LOOPCUT
};
-enum {
- SIM_CMP_EQ = 0,
- SIM_CMP_GT,
- SIM_CMP_LT
-};
-
/* subdivide_edgering */
enum {
/* just subdiv */
@@ -84,9 +78,7 @@ enum {
SIMFACE_COPLANAR,
SIMFACE_SMOOTH,
SIMFACE_FACEMAP,
-#ifdef WITH_FREESTYLE
SIMFACE_FREESTYLE
-#endif
};
/* similar edge selection slot values */
@@ -99,9 +91,7 @@ enum {
SIMEDGE_BEVEL,
SIMEDGE_SEAM,
SIMEDGE_SHARP,
-#ifdef WITH_FREESTYLE
SIMEDGE_FREESTYLE
-#endif
};
/* similar vertex selection slot values */
diff --git a/source/blender/bmesh/intern/bmesh_operators_private.h b/source/blender/bmesh/intern/bmesh_operators_private.h
index 5548ee7c361..8e9edfac1f9 100644
--- a/source/blender/bmesh/intern/bmesh_operators_private.h
+++ b/source/blender/bmesh/intern/bmesh_operators_private.h
@@ -94,9 +94,6 @@ void bmo_rotate_edges_exec(BMesh *bm, BMOperator *op);
void bmo_rotate_exec(BMesh *bm, BMOperator *op);
void bmo_rotate_uvs_exec(BMesh *bm, BMOperator *op);
void bmo_scale_exec(BMesh *bm, BMOperator *op);
-void bmo_similar_edges_exec(BMesh *bm, BMOperator *op);
-void bmo_similar_faces_exec(BMesh *bm, BMOperator *op);
-void bmo_similar_verts_exec(BMesh *bm, BMOperator *op);
void bmo_smooth_vert_exec(BMesh *bm, BMOperator *op);
void bmo_smooth_laplacian_vert_exec(BMesh *bm, BMOperator *op);
void bmo_solidify_face_region_exec(BMesh *bm, BMOperator *op);
diff --git a/source/blender/bmesh/intern/bmesh_polygon.c b/source/blender/bmesh/intern/bmesh_polygon.c
index 421b2adc3a7..9baae8e8a93 100644
--- a/source/blender/bmesh/intern/bmesh_polygon.c
+++ b/source/blender/bmesh/intern/bmesh_polygon.c
@@ -240,6 +240,28 @@ float BM_face_calc_area(const BMFace *f)
}
/**
+ * Get the area of the face in world space.
+ */
+float BM_face_calc_area_with_mat3(const BMFace *f, const float mat3[3][3])
+{
+ /* inline 'area_poly_v3' logic, avoid creating a temp array */
+ const BMLoop *l_iter, *l_first;
+ float co[3];
+ float n[3];
+
+ zero_v3(n);
+ l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+ mul_v3_m3v3(co, mat3, l_iter->v->co);
+ do {
+ float co_next[3];
+ mul_v3_m3v3(co_next, mat3, l_iter->next->v->co);
+ add_newell_cross_v3_v3v3(n, co, co_next);
+ copy_v3_v3(co, co_next);
+ } while ((l_iter = l_iter->next) != l_first);
+ return len_v3(n) * 0.5f;
+}
+
+/**
* compute the perimeter of an ngon
*/
float BM_face_calc_perimeter(const BMFace *f)
@@ -256,6 +278,27 @@ float BM_face_calc_perimeter(const BMFace *f)
}
/**
+ * Calculate the perimeter of a ngon in world space.
+ */
+float BM_face_calc_perimeter_with_mat3(const BMFace *f, const float mat3[3][3])
+{
+ const BMLoop *l_iter, *l_first;
+ float co[3];
+ float perimeter = 0.0f;
+
+ l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+ mul_v3_m3v3(co, mat3, l_iter->v->co);
+ do {
+ float co_next[3];
+ mul_v3_m3v3(co_next, mat3, l_iter->next->v->co);
+ perimeter += len_v3v3(co, co_next);
+ copy_v3_v3(co, co_next);
+ } while ((l_iter = l_iter->next) != l_first);
+
+ return perimeter;
+}
+
+/**
* Utility function to calculate the edge which is most different from the other two.
*
* \return The first edge index, where the second vertex is ``(index + 1) % 3``.
@@ -869,7 +912,7 @@ void BM_face_normal_flip(BMesh *bm, BMFace *f)
}
/**
- * BM POINT IN FACE
+ * BM POINT IN FACE
*
* Projects co onto face f, and returns true if it is inside
* the face bounds.
@@ -1284,7 +1327,7 @@ void BM_face_splits_check_optimal(BMFace *f, BMLoop *(*loops)[2], int len)
* Small utility functions for fast access
*
* faster alternative to:
- * BM_iter_as_array(bm, BM_VERTS_OF_FACE, f, (void **)v, 3);
+ * BM_iter_as_array(bm, BM_VERTS_OF_FACE, f, (void **)v, 3);
*/
void BM_face_as_array_vert_tri(BMFace *f, BMVert *r_verts[3])
{
@@ -1299,7 +1342,7 @@ void BM_face_as_array_vert_tri(BMFace *f, BMVert *r_verts[3])
/**
* faster alternative to:
- * BM_iter_as_array(bm, BM_VERTS_OF_FACE, f, (void **)v, 4);
+ * BM_iter_as_array(bm, BM_VERTS_OF_FACE, f, (void **)v, 4);
*/
void BM_face_as_array_vert_quad(BMFace *f, BMVert *r_verts[4])
{
@@ -1318,7 +1361,7 @@ void BM_face_as_array_vert_quad(BMFace *f, BMVert *r_verts[4])
* Small utility functions for fast access
*
* faster alternative to:
- * BM_iter_as_array(bm, BM_LOOPS_OF_FACE, f, (void **)l, 3);
+ * BM_iter_as_array(bm, BM_LOOPS_OF_FACE, f, (void **)l, 3);
*/
void BM_face_as_array_loop_tri(BMFace *f, BMLoop *r_loops[3])
{
@@ -1333,7 +1376,7 @@ void BM_face_as_array_loop_tri(BMFace *f, BMLoop *r_loops[3])
/**
* faster alternative to:
- * BM_iter_as_array(bm, BM_LOOPS_OF_FACE, f, (void **)l, 4);
+ * BM_iter_as_array(bm, BM_LOOPS_OF_FACE, f, (void **)l, 4);
*/
void BM_face_as_array_loop_quad(BMFace *f, BMLoop *r_loops[4])
{
@@ -1352,7 +1395,7 @@ void BM_face_as_array_loop_quad(BMFace *f, BMLoop *r_loops[4])
* \brief BM_mesh_calc_tessellation get the looptris and its number from a certain bmesh
* \param looptris
*
- * \note \a looptris Must be pre-allocated to at least the size of given by: poly_to_tri_count
+ * \note \a looptris Must be pre-allocated to at least the size of given by: poly_to_tri_count
*/
void BM_mesh_calc_tessellation(BMesh *bm, BMLoop *(*looptris)[3], int *r_looptris_tot)
{
diff --git a/source/blender/bmesh/intern/bmesh_polygon.h b/source/blender/bmesh/intern/bmesh_polygon.h
index a40da2bfbfa..2edfdaa8c03 100644
--- a/source/blender/bmesh/intern/bmesh_polygon.h
+++ b/source/blender/bmesh/intern/bmesh_polygon.h
@@ -44,7 +44,9 @@ float BM_face_calc_normal_vcos(
float const (*vertexCos)[3]) ATTR_NONNULL();
float BM_face_calc_normal_subset(const BMLoop *l_first, const BMLoop *l_last, float r_no[3]) ATTR_NONNULL();
float BM_face_calc_area(const BMFace *f) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
+float BM_face_calc_area_with_mat3(const BMFace *f, const float mat3[3][3]) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
float BM_face_calc_perimeter(const BMFace *f) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
+float BM_face_calc_perimeter_with_mat3(const BMFace *f, const float mat3[3][3]) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
void BM_face_calc_tangent_edge(const BMFace *f, float r_plane[3]) ATTR_NONNULL();
void BM_face_calc_tangent_edge_pair(const BMFace *f, float r_plane[3]) ATTR_NONNULL();
void BM_face_calc_tangent_edge_diagonal(const BMFace *f, float r_plane[3]) ATTR_NONNULL();
diff --git a/source/blender/bmesh/intern/bmesh_private.h b/source/blender/bmesh/intern/bmesh_private.h
index daee22ffe76..61e47a6cbd4 100644
--- a/source/blender/bmesh/intern/bmesh_private.h
+++ b/source/blender/bmesh/intern/bmesh_private.h
@@ -31,9 +31,9 @@
/** \file blender/bmesh/intern/bmesh_private.h
* \ingroup bmesh
*
- * Private function prototypes for bmesh public API.
- * This file is a grab-bag of functions from various
- * parts of the bmesh internals.
+ * Private function prototypes for bmesh public API.
+ * This file is a grab-bag of functions from various
+ * parts of the bmesh internals.
*/
/* returns positive nonzero on error */
diff --git a/source/blender/bmesh/intern/bmesh_query.c b/source/blender/bmesh/intern/bmesh_query.c
index 33ad7836893..59711670334 100644
--- a/source/blender/bmesh/intern/bmesh_query.c
+++ b/source/blender/bmesh/intern/bmesh_query.c
@@ -1206,7 +1206,7 @@ bool BM_face_share_face_check(BMFace *f1, BMFace *f2)
}
/**
- * Counts the number of edges two faces share (if any)
+ * Counts the number of edges two faces share (if any)
*/
int BM_face_share_edge_count(BMFace *f_a, BMFace *f_b)
{
@@ -1225,7 +1225,7 @@ int BM_face_share_edge_count(BMFace *f_a, BMFace *f_b)
}
/**
- * Returns true if the faces share an edge
+ * Returns true if the faces share an edge
*/
bool BM_face_share_edge_check(BMFace *f1, BMFace *f2)
{
@@ -1243,7 +1243,7 @@ bool BM_face_share_edge_check(BMFace *f1, BMFace *f2)
}
/**
- * Counts the number of verts two faces share (if any).
+ * Counts the number of verts two faces share (if any).
*/
int BM_face_share_vert_count(BMFace *f_a, BMFace *f_b)
{
@@ -1262,7 +1262,7 @@ int BM_face_share_vert_count(BMFace *f_a, BMFace *f_b)
}
/**
- * Returns true if the faces share a vert.
+ * Returns true if the faces share a vert.
*/
bool BM_face_share_vert_check(BMFace *f_a, BMFace *f_b)
{
@@ -1656,8 +1656,8 @@ void BM_loop_calc_face_tangent(const BMLoop *l, float r_tangent[3])
/**
* \brief BMESH EDGE/FACE ANGLE
*
- * Calculates the angle between two faces.
- * Assumes the face normals are correct.
+ * Calculates the angle between two faces.
+ * Assumes the face normals are correct.
*
* \return angle in radians
*/
@@ -1678,10 +1678,44 @@ float BM_edge_calc_face_angle(const BMEdge *e)
}
/**
+* \brief BMESH EDGE/FACE ANGLE
+*
+* Calculates the angle between two faces in world space.
+* Assumes the face normals are correct.
+*
+* \return angle in radians
+*/
+float BM_edge_calc_face_angle_with_imat3_ex(const BMEdge *e, const float imat3[3][3], const float fallback)
+{
+ if (BM_edge_is_manifold(e)) {
+ const BMLoop *l1 = e->l;
+ const BMLoop *l2 = e->l->radial_next;
+ float no1[3], no2[3];
+ copy_v3_v3(no1, l1->f->no);
+ copy_v3_v3(no2, l2->f->no);
+
+ mul_transposed_m3_v3(imat3, no1);
+ mul_transposed_m3_v3(imat3, no2);
+
+ normalize_v3(no1);
+ normalize_v3(no2);
+
+ return angle_normalized_v3v3(no1, no2);
+ }
+ else {
+ return fallback;
+ }
+}
+float BM_edge_calc_face_angle_with_imat3(const BMEdge *e, const float imat3[3][3])
+{
+ return BM_edge_calc_face_angle_with_imat3_ex(e, imat3, DEG2RADF(90.0f));
+}
+
+/**
* \brief BMESH EDGE/FACE ANGLE
*
- * Calculates the angle between two faces.
- * Assumes the face normals are correct.
+ * Calculates the angle between two faces.
+ * Assumes the face normals are correct.
*
* \return angle in radians
*/
diff --git a/source/blender/bmesh/intern/bmesh_query.h b/source/blender/bmesh/intern/bmesh_query.h
index 51956761d8f..7c087a5150f 100644
--- a/source/blender/bmesh/intern/bmesh_query.h
+++ b/source/blender/bmesh/intern/bmesh_query.h
@@ -123,6 +123,8 @@ void BM_loop_calc_face_tangent(const BMLoop *l, float r_tangent[3]);
float BM_edge_calc_face_angle_ex(const BMEdge *e, const float fallback) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
float BM_edge_calc_face_angle(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
float BM_edge_calc_face_angle_signed_ex(const BMEdge *e, const float fallback) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
+float BM_edge_calc_face_angle_with_imat3_ex(const BMEdge *e, const float imat3[3][3], const float fallback) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
+float BM_edge_calc_face_angle_with_imat3(const BMEdge *e, const float imat3[3][3]) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
float BM_edge_calc_face_angle_signed(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
void BM_edge_calc_face_tangent(const BMEdge *e, const BMLoop *e_loop, float r_tangent[3]) ATTR_NONNULL();
diff --git a/source/blender/bmesh/operators/bmo_connect_pair.c b/source/blender/bmesh/operators/bmo_connect_pair.c
index b9e5cd927c3..caf40c71756 100644
--- a/source/blender/bmesh/operators/bmo_connect_pair.c
+++ b/source/blender/bmesh/operators/bmo_connect_pair.c
@@ -30,7 +30,7 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
-#include "BLI_heap.h"
+#include "BLI_heap_simple.h"
#include "bmesh.h"
@@ -94,7 +94,7 @@
// #define DEBUG_PRINT
typedef struct PathContext {
- Heap *states;
+ HeapSimple *states;
float matrix[3][3];
float axis_sep;
@@ -331,7 +331,7 @@ static PathLinkState *state_link_add_test(
/* after adding a link so we use the updated 'state->dist' */
if (is_new) {
- BLI_heap_insert(pc->states, state->dist, state);
+ BLI_heapsimple_insert(pc->states, state->dist, state);
}
return state;
@@ -640,7 +640,7 @@ void bmo_connect_vert_pair_exec(BMesh *bm, BMOperator *op)
/* setup context */
{
- pc.states = BLI_heap_new();
+ pc.states = BLI_heapsimple_new();
pc.link_pool = BLI_mempool_create(sizeof(PathLink), 0, 512, BLI_MEMPOOL_NOP);
}
@@ -655,18 +655,18 @@ void bmo_connect_vert_pair_exec(BMesh *bm, BMOperator *op)
PathLinkState *state;
state = MEM_callocN(sizeof(*state), __func__);
state_link_add(&pc, state, (BMElem *)pc.v_a, NULL);
- BLI_heap_insert(pc.states, state->dist, state);
+ BLI_heapsimple_insert(pc.states, state->dist, state);
}
- while (!BLI_heap_is_empty(pc.states)) {
+ while (!BLI_heapsimple_is_empty(pc.states)) {
#ifdef DEBUG_PRINT
- printf("\n%s: stepping %u\n", __func__, BLI_heap_len(pc.states));
+ printf("\n%s: stepping %u\n", __func__, BLI_heapsimple_len(pc.states));
#endif
- while (!BLI_heap_is_empty(pc.states)) {
- PathLinkState *state = BLI_heap_pop_min(pc.states);
+ while (!BLI_heapsimple_is_empty(pc.states)) {
+ PathLinkState *state = BLI_heapsimple_pop_min(pc.states);
/* either we insert this into 'pc.states' or its freed */
bool continue_search;
@@ -679,7 +679,7 @@ void bmo_connect_vert_pair_exec(BMesh *bm, BMOperator *op)
state_best = *state;
/* we're done, exit all loops */
- BLI_heap_clear(pc.states, MEM_freeN);
+ BLI_heapsimple_clear(pc.states, MEM_freeN);
continue_search = false;
}
else if (state_step(&pc, state)) {
@@ -696,7 +696,7 @@ void bmo_connect_vert_pair_exec(BMesh *bm, BMOperator *op)
}
if (continue_search) {
- BLI_heap_insert(pc.states, state->dist, state);
+ BLI_heapsimple_insert(pc.states, state->dist, state);
}
else {
MEM_freeN(state);
@@ -732,7 +732,7 @@ void bmo_connect_vert_pair_exec(BMesh *bm, BMOperator *op)
BLI_mempool_destroy(pc.link_pool);
- BLI_heap_free(pc.states, MEM_freeN);
+ BLI_heapsimple_free(pc.states, MEM_freeN);
#if 1
if (state_best.link_last) {
diff --git a/source/blender/bmesh/operators/bmo_dupe.c b/source/blender/bmesh/operators/bmo_dupe.c
index eed87ed20af..c50c7657deb 100644
--- a/source/blender/bmesh/operators/bmo_dupe.c
+++ b/source/blender/bmesh/operators/bmo_dupe.c
@@ -26,6 +26,8 @@
* Duplicate, Split, Split operators.
*/
+#include "MEM_guardedalloc.h"
+
#include "BLI_math.h"
#include "BLI_alloca.h"
@@ -486,9 +488,29 @@ void bmo_spin_exec(BMesh *bm, BMOperator *op)
steps = BMO_slot_int_get(op->slots_in, "steps");
phi = BMO_slot_float_get(op->slots_in, "angle") / steps;
do_dupli = BMO_slot_bool_get(op->slots_in, "use_duplicate");
+ const bool use_normal_flip = BMO_slot_bool_get(op->slots_in, "use_normal_flip");
+ /* Caller needs to perform other sanity checks (such as the spin being 360d). */
+ const bool use_merge = BMO_slot_bool_get(op->slots_in, "use_merge") && steps >= 3;
axis_angle_normalized_to_mat3(rmat, axis, phi);
+ BMVert **vtable = NULL;
+ if (use_merge) {
+ vtable = MEM_mallocN(sizeof(BMVert *) * bm->totvert, __func__);
+ int i = 0;
+ BMIter iter;
+ BMVert *v;
+ BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) {
+ vtable[i] = v;
+ /* Evil! store original index in normal,
+ * this is duplicated into every other vertex.
+ * So we can read the original from the final.
+ *
+ * The normals must be recalculated anyway. */
+ *((int *)&v->no[0]) = i;
+ }
+ }
+
BMO_slot_copy(op, slots_in, "geom",
op, slots_out, "geom_last.out");
for (a = 0; a < steps; a++) {
@@ -503,14 +525,47 @@ void bmo_spin_exec(BMesh *bm, BMOperator *op)
BMO_op_finish(bm, &dupop);
}
else {
- BMO_op_initf(bm, &extop, op->flag, "extrude_face_region geom=%S",
- op, "geom_last.out");
+ BMO_op_initf(bm, &extop, op->flag, "extrude_face_region geom=%S use_normal_flip=%b",
+ op, "geom_last.out", use_normal_flip && (a == 0));
BMO_op_exec(bm, &extop);
- BMO_op_callf(bm, op->flag,
- "rotate cent=%v matrix=%m3 space=%s verts=%S",
- cent, rmat, op, "space", &extop, "geom.out");
- BMO_slot_copy(&extop, slots_out, "geom.out",
- op, slots_out, "geom_last.out");
+ if ((use_merge && (a == steps - 1)) == false) {
+ BMO_op_callf(bm, op->flag,
+ "rotate cent=%v matrix=%m3 space=%s verts=%S",
+ cent, rmat, op, "space", &extop, "geom.out");
+ BMO_slot_copy(&extop, slots_out, "geom.out",
+ op, slots_out, "geom_last.out");
+ }
+ else {
+ /* Merge first/last vertices and edges (maintaining 'geom.out' state). */
+ BMOpSlot *slot_geom_out = BMO_slot_get(extop.slots_out, "geom.out");
+ BMElem **elem_array = (BMElem **)slot_geom_out->data.buf;
+ int elem_array_len = slot_geom_out->len;
+ for (int i = 0; i < elem_array_len; ) {
+ if (elem_array[i]->head.htype == BM_VERT) {
+ BMVert *v_src = (BMVert *)elem_array[i];
+ BMVert *v_dst = vtable[*((const int *)&v_src->no[0])];
+ BM_vert_splice(bm, v_dst, v_src);
+ elem_array_len--;
+ elem_array[i] = elem_array[elem_array_len];
+ }
+ else {
+ i++;
+ }
+ }
+ for (int i = 0; i < elem_array_len; ) {
+ if (elem_array[i]->head.htype == BM_EDGE) {
+ BMEdge *e_src = (BMEdge *)elem_array[i];
+ BMEdge *e_dst = BM_edge_find_double(e_src);
+ BM_edge_splice(bm, e_dst, e_src);
+ elem_array_len--;
+ elem_array[i] = elem_array[elem_array_len];
+ }
+ else {
+ i++;
+ }
+ }
+ slot_geom_out->len = elem_array_len;
+ }
BMO_op_finish(bm, &extop);
}
@@ -521,4 +576,8 @@ void bmo_spin_exec(BMesh *bm, BMOperator *op)
dvec, op, "space", op, "geom_last.out");
}
}
+
+ if (vtable) {
+ MEM_freeN(vtable);
+ }
}
diff --git a/source/blender/bmesh/operators/bmo_extrude.c b/source/blender/bmesh/operators/bmo_extrude.c
index 4f4f531eae1..35dccb71a6b 100644
--- a/source/blender/bmesh/operators/bmo_extrude.c
+++ b/source/blender/bmesh/operators/bmo_extrude.c
@@ -186,6 +186,7 @@ void bmo_extrude_edge_only_exec(BMesh *bm, BMOperator *op)
BMOperator dupeop;
BMFace *f;
BMEdge *e, *e_new;
+ const bool use_normal_flip = BMO_slot_bool_get(op->slots_in, "use_normal_flip");
BMO_ITER (e, &siter, op->slots_in, "edges", BM_EDGE) {
BMO_edge_flag_enable(bm, e, EXT_INPUT);
@@ -212,7 +213,9 @@ void bmo_extrude_edge_only_exec(BMesh *bm, BMOperator *op)
BMVert *f_verts[4];
e_new = BMO_iter_map_value_ptr(&siter);
- if (e->l && e->v1 != e->l->v) {
+
+ const bool edge_normal_flip = !(e->l && e->v1 != e->l->v);
+ if (edge_normal_flip == use_normal_flip) {
f_verts[0] = e->v1;
f_verts[1] = e->v2;
f_verts[2] = e_new->v2;
@@ -332,9 +335,10 @@ void bmo_extrude_face_region_exec(BMesh *bm, BMOperator *op)
BMEdge *e, *e_new;
BMVert *v;
BMFace *f;
- bool found, fwd, delorig = false;
+ bool found, delorig = false;
BMOpSlot *slot_facemap_out;
BMOpSlot *slot_edges_exclude;
+ const bool use_normal_flip = BMO_slot_bool_get(op->slots_in, "use_normal_flip");
/* initialize our sub-operators */
BMO_op_initf(
@@ -488,13 +492,11 @@ void bmo_extrude_face_region_exec(BMesh *bm, BMOperator *op)
/* orient loop to give same normal as a loop of newedge
* if it exists (will be an extruded face),
* else same normal as a loop of e, if it exists */
- if (!e_new->l)
- fwd = !e->l || !(e->l->v == e->v1);
- else
- fwd = (e_new->l->v == e_new->v1);
-
-
- if (fwd) {
+ const bool edge_normal_flip = !(
+ e_new->l ?
+ (e_new->l->v == e_new->v1) :
+ (!e->l || !(e->l->v == e->v1)));
+ if (edge_normal_flip == use_normal_flip) {
f_verts[0] = e->v1;
f_verts[1] = e->v2;
f_verts[2] = e_new->v2;
diff --git a/source/blender/bmesh/operators/bmo_similar.c b/source/blender/bmesh/operators/bmo_similar.c
deleted file mode 100644
index 0cd17258834..00000000000
--- a/source/blender/bmesh/operators/bmo_similar.c
+++ /dev/null
@@ -1,667 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * Contributor(s): Joseph Eagar, Campbell Barton
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/bmesh/operators/bmo_similar.c
- * \ingroup bmesh
- *
- * bmesh operators to select based on
- * comparisons with the existing selection.
- */
-
-#include "MEM_guardedalloc.h"
-
-#include "DNA_object_types.h"
-#include "DNA_meshdata_types.h"
-
-#include "BLI_math.h"
-
-#include "BKE_customdata.h"
-#include "BKE_deform.h"
-
-#include "bmesh.h"
-
-#include "intern/bmesh_operators_private.h" /* own include */
-
-/* in fact these could all be the same */
-
-/*
- * extra face data (computed data)
- */
-typedef struct SimSel_FaceExt {
- BMFace *f; /* the face */
- float c[3]; /* center */
- union {
- float area; /* area */
- float perim; /* perimeter */
- float d; /* 4th component of plane (the first three being the normal) */
- struct Image *t; /* image pointer */
- };
-} SimSel_FaceExt;
-
-static int bm_sel_similar_cmp_fl(const float delta, const float thresh, const int compare)
-{
- switch (compare) {
- case SIM_CMP_EQ:
- return (fabsf(delta) <= thresh);
- case SIM_CMP_GT:
- return ((delta + thresh) >= 0.0f);
- case SIM_CMP_LT:
- return ((delta - thresh) <= 0.0f);
- default:
- BLI_assert(0);
- return 0;
- }
-}
-
-static int bm_sel_similar_cmp_i(const int delta, const int compare)
-{
- switch (compare) {
- case SIM_CMP_EQ:
- return (delta == 0);
- case SIM_CMP_GT:
- return (delta > 0);
- case SIM_CMP_LT:
- return (delta < 0);
- default:
- BLI_assert(0);
- return 0;
- }
-}
-
-/*
- * Select similar faces, the choices are in the enum in source/blender/bmesh/bmesh_operators.h
- * We select either similar faces based on material, image, area, perimeter, normal, or the coplanar faces
- */
-void bmo_similar_faces_exec(BMesh *bm, BMOperator *op)
-{
-#define FACE_MARK 1
-
- BMIter fm_iter;
- BMFace *fs, *fm;
- BMOIter fs_iter;
- int num_sels = 0, num_total = 0, i = 0, idx = 0;
- float angle = 0.0f;
- SimSel_FaceExt *f_ext = NULL;
- int *indices = NULL;
- const int type = BMO_slot_int_get(op->slots_in, "type");
- const float thresh = BMO_slot_float_get(op->slots_in, "thresh");
- const float thresh_radians = thresh * (float)M_PI;
- const int compare = BMO_slot_int_get(op->slots_in, "compare");
- /* for comparison types that use custom-data */
- int cd_offset = -1;
-
- /* initial_elem - other_elem */
- float delta_fl;
- int delta_i;
-
- if (type == SIMFACE_FACEMAP) {
- cd_offset = CustomData_get_offset(&bm->pdata, CD_FACEMAP);
- if (cd_offset == -1) {
- return;
- }
- }
-#ifdef WITH_FREESTYLE
- else if (type == SIMFACE_FREESTYLE) {
- cd_offset = CustomData_get_offset(&bm->pdata, CD_FREESTYLE_FACE);
- if (cd_offset == -1) {
- return;
- }
- }
-#endif
-
- num_total = BM_mesh_elem_count(bm, BM_FACE);
-
- /*
- * The first thing to do is to iterate through all the selected items and mark them since
- * they will be in the selection anyway.
- * This will increase performance, (especially when the number of originally selected faces is high)
- * so the overall complexity will be less than $O(mn)$ where is the total number of selected faces,
- * and n is the total number of faces
- */
- BMO_ITER (fs, &fs_iter, op->slots_in, "faces", BM_FACE) {
- if (!BMO_face_flag_test(bm, fs, FACE_MARK)) { /* is this really needed ? */
- BMO_face_flag_enable(bm, fs, FACE_MARK);
- num_sels++;
- }
- }
-
- /* allocate memory for the selected faces indices and for all temporary faces */
- indices = (int *)MEM_callocN(sizeof(int) * num_sels, "face indices util.c");
- f_ext = (SimSel_FaceExt *)MEM_callocN(sizeof(SimSel_FaceExt) * num_total, "f_ext util.c");
-
- /* loop through all the faces and fill the faces/indices structure */
- BM_ITER_MESH (fm, &fm_iter, bm, BM_FACES_OF_MESH) {
- f_ext[i].f = fm;
- if (BMO_face_flag_test(bm, fm, FACE_MARK)) {
- indices[idx] = i;
- idx++;
- }
- i++;
- }
-
- /*
- * Save us some computation burden: In case of perimeter/area/coplanar selection we compute
- * only once.
- */
- if (type == SIMFACE_PERIMETER || type == SIMFACE_AREA || type == SIMFACE_COPLANAR) {
- for (i = 0; i < num_total; i++) {
- switch (type) {
- case SIMFACE_PERIMETER:
- /* set the perimeter */
- f_ext[i].perim = BM_face_calc_perimeter(f_ext[i].f);
- break;
-
- case SIMFACE_COPLANAR:
- /* compute the center of the polygon */
- BM_face_calc_center_mean(f_ext[i].f, f_ext[i].c);
-
- /* compute the plane distance */
- f_ext[i].d = dot_v3v3(f_ext[i].f->no, f_ext[i].c);
- break;
-
- case SIMFACE_AREA:
- f_ext[i].area = BM_face_calc_area(f_ext[i].f);
- break;
- }
- }
- }
-
- /* now select the rest (if any) */
- for (i = 0; i < num_total; i++) {
- fm = f_ext[i].f;
- if (!BMO_face_flag_test(bm, fm, FACE_MARK) && !BM_elem_flag_test(fm, BM_ELEM_HIDDEN)) {
- bool cont = true;
- for (idx = 0; idx < num_sels && cont == true; idx++) {
- fs = f_ext[indices[idx]].f;
- switch (type) {
- case SIMFACE_MATERIAL:
- if (fm->mat_nr == fs->mat_nr) {
- BMO_face_flag_enable(bm, fm, FACE_MARK);
- cont = false;
- }
- break;
- case SIMFACE_NORMAL:
- angle = angle_normalized_v3v3(fs->no, fm->no); /* if the angle between the normals -> 0 */
- if (angle <= thresh_radians) {
- BMO_face_flag_enable(bm, fm, FACE_MARK);
- cont = false;
- }
- break;
-
- case SIMFACE_COPLANAR:
- {
- float sign = 1.0f;
- angle = angle_normalized_v3v3(fs->no, fm->no); /* angle -> 0 */
- /* allow for normal pointing in either direction (just check the plane) */
- if (angle > (float)M_PI * 0.5f) {
- angle = (float)M_PI - angle;
- sign = -1.0f;
- }
- if (angle <= thresh_radians) { /* and dot product difference -> 0 */
- delta_fl = f_ext[i].d - (f_ext[indices[idx]].d * sign);
- if (bm_sel_similar_cmp_fl(delta_fl, thresh, compare)) {
- BMO_face_flag_enable(bm, fm, FACE_MARK);
- cont = false;
- }
- }
- break;
- }
- case SIMFACE_AREA:
- delta_fl = f_ext[i].area - f_ext[indices[idx]].area;
- if (bm_sel_similar_cmp_fl(delta_fl, thresh, compare)) {
- BMO_face_flag_enable(bm, fm, FACE_MARK);
- cont = false;
- }
- break;
-
- case SIMFACE_SIDES:
- delta_i = fm->len - fs->len;
- if (bm_sel_similar_cmp_i(delta_i, compare)) {
- BMO_face_flag_enable(bm, fm, FACE_MARK);
- cont = false;
- }
- break;
-
- case SIMFACE_PERIMETER:
- delta_fl = f_ext[i].perim - f_ext[indices[idx]].perim;
- if (bm_sel_similar_cmp_fl(delta_fl, thresh, compare)) {
- BMO_face_flag_enable(bm, fm, FACE_MARK);
- cont = false;
- }
- break;
-
- case SIMFACE_SMOOTH:
- if (BM_elem_flag_test(fm, BM_ELEM_SMOOTH) == BM_elem_flag_test(fs, BM_ELEM_SMOOTH)) {
- BMO_face_flag_enable(bm, fm, FACE_MARK);
- cont = false;
- }
- break;
- case SIMFACE_FACEMAP:
- {
- BLI_assert(cd_offset != -1);
- const int *fmap1 = BM_ELEM_CD_GET_VOID_P(fs, cd_offset);
- const int *fmap2 = BM_ELEM_CD_GET_VOID_P(fm, cd_offset);
- if (*fmap1 == *fmap2) {
- BMO_face_flag_enable(bm, fm, FACE_MARK);
- cont = false;
- }
- break;
- }
-#ifdef WITH_FREESTYLE
- case SIMFACE_FREESTYLE:
- {
- BLI_assert(cd_offset != -1);
- const FreestyleEdge *ffa1 = BM_ELEM_CD_GET_VOID_P(fs, cd_offset);
- const FreestyleEdge *ffa2 = BM_ELEM_CD_GET_VOID_P(fm, cd_offset);
- if ((ffa1->flag & FREESTYLE_FACE_MARK) == (ffa2->flag & FREESTYLE_FACE_MARK)) {
- BMO_face_flag_enable(bm, fm, FACE_MARK);
- cont = false;
- }
- break;
- }
-#endif
- default:
- BLI_assert(0);
- break;
- }
- }
- }
- }
-
- MEM_freeN(f_ext);
- MEM_freeN(indices);
-
- /* transfer all marked faces to the output slot */
- BMO_slot_buffer_from_enabled_flag(bm, op, op->slots_out, "faces.out", BM_FACE, FACE_MARK);
-#undef FACE_MARK
-}
-
-/**************************************************************************** *
- * Similar Edges
- **************************************************************************** */
-
-/*
- * extra edge information
- */
-typedef struct SimSel_EdgeExt {
- BMEdge *e;
- union {
- float dir[3];
- float angle; /* angle between the face */
- };
-
- union {
- float length; /* edge length */
- int faces; /* faces count */
- };
-} SimSel_EdgeExt;
-
-/*
- * select similar edges: the choices are in the enum in source/blender/bmesh/bmesh_operators.h
- * choices are length, direction, face, ...
- */
-void bmo_similar_edges_exec(BMesh *bm, BMOperator *op)
-{
-#define EDGE_MARK 1
-
- BMOIter es_iter; /* selected edges iterator */
- BMIter e_iter; /* mesh edges iterator */
- BMEdge *es; /* selected edge */
- BMEdge *e; /* mesh edge */
- int idx = 0, i = 0 /* , f = 0 */;
- int *indices = NULL;
- SimSel_EdgeExt *e_ext = NULL;
- // float *angles = NULL;
- float angle;
-
- int num_sels = 0, num_total = 0;
- const int type = BMO_slot_int_get(op->slots_in, "type");
- const float thresh = BMO_slot_float_get(op->slots_in, "thresh");
- const int compare = BMO_slot_int_get(op->slots_in, "compare");
-
- /* initial_elem - other_elem */
- float delta_fl;
- int delta_i;
-
- /* sanity checks that the data we need is available */
- switch (type) {
- case SIMEDGE_CREASE:
- if (!CustomData_has_layer(&bm->edata, CD_CREASE)) {
- return;
- }
- break;
- case SIMEDGE_BEVEL:
- if (!CustomData_has_layer(&bm->edata, CD_BWEIGHT)) {
- return;
- }
- break;
- }
-
- num_total = BM_mesh_elem_count(bm, BM_EDGE);
-
- /* iterate through all selected edges and mark them */
- BMO_ITER (es, &es_iter, op->slots_in, "edges", BM_EDGE) {
- BMO_edge_flag_enable(bm, es, EDGE_MARK);
- num_sels++;
- }
-
- /* allocate memory for the selected edges indices and for all temporary edges */
- indices = (int *)MEM_callocN(sizeof(int) * num_sels, __func__);
- e_ext = (SimSel_EdgeExt *)MEM_callocN(sizeof(SimSel_EdgeExt) * num_total, __func__);
-
- /* loop through all the edges and fill the edges/indices structure */
- BM_ITER_MESH (e, &e_iter, bm, BM_EDGES_OF_MESH) {
- e_ext[i].e = e;
- if (BMO_edge_flag_test(bm, e, EDGE_MARK)) {
- indices[idx] = i;
- idx++;
- }
- i++;
- }
-
- /* save us some computation time by doing heavy computation once */
- if (type == SIMEDGE_LENGTH || type == SIMEDGE_FACE || type == SIMEDGE_DIR || type == SIMEDGE_FACE_ANGLE) {
- for (i = 0; i < num_total; i++) {
- switch (type) {
- case SIMEDGE_LENGTH: /* compute the length of the edge */
- e_ext[i].length = len_v3v3(e_ext[i].e->v1->co, e_ext[i].e->v2->co);
- break;
-
- case SIMEDGE_DIR: /* compute the direction */
- sub_v3_v3v3(e_ext[i].dir, e_ext[i].e->v1->co, e_ext[i].e->v2->co);
- normalize_v3(e_ext[i].dir);
- break;
-
- case SIMEDGE_FACE: /* count the faces around the edge */
- e_ext[i].faces = BM_edge_face_count(e_ext[i].e);
- break;
-
- case SIMEDGE_FACE_ANGLE:
- e_ext[i].faces = BM_edge_face_count(e_ext[i].e);
- if (e_ext[i].faces == 2)
- e_ext[i].angle = BM_edge_calc_face_angle(e_ext[i].e);
- break;
- }
- }
- }
-
- /* select the edges if any */
- for (i = 0; i < num_total; i++) {
- e = e_ext[i].e;
- if (!BMO_edge_flag_test(bm, e, EDGE_MARK) &&
- !BM_elem_flag_test(e, BM_ELEM_HIDDEN))
- {
- bool cont = true;
- for (idx = 0; idx < num_sels && cont == true; idx++) {
- es = e_ext[indices[idx]].e;
- switch (type) {
- case SIMEDGE_LENGTH:
- delta_fl = e_ext[i].length - e_ext[indices[idx]].length;
- if (bm_sel_similar_cmp_fl(delta_fl, thresh, compare)) {
- BMO_edge_flag_enable(bm, e, EDGE_MARK);
- cont = false;
- }
- break;
-
- case SIMEDGE_DIR:
- /* compute the angle between the two edges */
- angle = angle_normalized_v3v3(e_ext[i].dir, e_ext[indices[idx]].dir);
-
- if (angle > (float)M_PI_2) /* use the smallest angle between the edges */
- angle = fabsf(angle - (float)M_PI);
-
- if (angle / (float)M_PI_2 <= thresh) {
- BMO_edge_flag_enable(bm, e, EDGE_MARK);
- cont = false;
- }
- break;
-
- case SIMEDGE_FACE:
- delta_i = e_ext[i].faces - e_ext[indices[idx]].faces;
- if (bm_sel_similar_cmp_i(delta_i, compare)) {
- BMO_edge_flag_enable(bm, e, EDGE_MARK);
- cont = false;
- }
- break;
-
- case SIMEDGE_FACE_ANGLE:
- if (e_ext[i].faces == 2) {
- if (e_ext[indices[idx]].faces == 2) {
- if (fabsf(e_ext[i].angle - e_ext[indices[idx]].angle) <= thresh) {
- BMO_edge_flag_enable(bm, e, EDGE_MARK);
- cont = false;
- }
- }
- }
- else {
- cont = false;
- }
- break;
-
- case SIMEDGE_CREASE:
- {
- const float *c1, *c2;
-
- c1 = CustomData_bmesh_get(&bm->edata, e->head.data, CD_CREASE);
- c2 = CustomData_bmesh_get(&bm->edata, es->head.data, CD_CREASE);
- delta_fl = *c1 - *c2;
-
- if (bm_sel_similar_cmp_fl(delta_fl, thresh, compare)) {
- BMO_edge_flag_enable(bm, e, EDGE_MARK);
- cont = false;
- }
- }
- break;
-
- case SIMEDGE_BEVEL:
- {
- const float *c1, *c2;
-
- c1 = CustomData_bmesh_get(&bm->edata, e->head.data, CD_BWEIGHT);
- c2 = CustomData_bmesh_get(&bm->edata, es->head.data, CD_BWEIGHT);
- delta_fl = *c1 - *c2;
-
- if (bm_sel_similar_cmp_fl(delta_fl, thresh, compare)) {
- BMO_edge_flag_enable(bm, e, EDGE_MARK);
- cont = false;
- }
- }
- break;
-
- case SIMEDGE_SEAM:
- if (BM_elem_flag_test(e, BM_ELEM_SEAM) == BM_elem_flag_test(es, BM_ELEM_SEAM)) {
- BMO_edge_flag_enable(bm, e, EDGE_MARK);
- cont = false;
- }
- break;
-
- case SIMEDGE_SHARP:
- if (BM_elem_flag_test(e, BM_ELEM_SMOOTH) == BM_elem_flag_test(es, BM_ELEM_SMOOTH)) {
- BMO_edge_flag_enable(bm, e, EDGE_MARK);
- cont = false;
- }
- break;
-#ifdef WITH_FREESTYLE
- case SIMEDGE_FREESTYLE:
- if (CustomData_has_layer(&bm->edata, CD_FREESTYLE_EDGE)) {
- FreestyleEdge *fed1, *fed2;
-
- fed1 = CustomData_bmesh_get(&bm->edata, e->head.data, CD_FREESTYLE_EDGE);
- fed2 = CustomData_bmesh_get(&bm->edata, es->head.data, CD_FREESTYLE_EDGE);
-
- if (fed1 && fed2 && (fed1->flag & FREESTYLE_EDGE_MARK) == (fed2->flag & FREESTYLE_EDGE_MARK)) {
- BMO_edge_flag_enable(bm, e, EDGE_MARK);
- cont = false;
- }
- }
- break;
-#endif
- default:
- BLI_assert(0);
- break;
- }
- }
- }
- }
-
- MEM_freeN(e_ext);
- MEM_freeN(indices);
-
- /* transfer all marked edges to the output slot */
- BMO_slot_buffer_from_enabled_flag(bm, op, op->slots_out, "edges.out", BM_EDGE, EDGE_MARK);
-
-#undef EDGE_MARK
-}
-
-/**************************************************************************** *
- * Similar Vertices
- **************************************************************************** */
-
-typedef struct SimSel_VertExt {
- BMVert *v;
- union {
- int num_faces; /* adjacent faces */
- int num_edges; /* adjacent edges */
- MDeformVert *dvert; /* deform vertex */
- };
-} SimSel_VertExt;
-
-/*
- * select similar vertices: the choices are in the enum in source/blender/bmesh/bmesh_operators.h
- * choices are normal, face, vertex group...
- */
-void bmo_similar_verts_exec(BMesh *bm, BMOperator *op)
-{
-#define VERT_MARK 1
-
- const int cd_dvert_offset = CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT);
- BMOIter vs_iter; /* selected verts iterator */
- BMIter v_iter; /* mesh verts iterator */
- BMVert *vs; /* selected vertex */
- BMVert *v; /* mesh vertex */
- SimSel_VertExt *v_ext = NULL;
- int *indices = NULL;
- int num_total = 0, num_sels = 0, i = 0, idx = 0;
- const int type = BMO_slot_int_get(op->slots_in, "type");
- const float thresh = BMO_slot_float_get(op->slots_in, "thresh");
- const float thresh_radians = thresh * (float)M_PI;
- const int compare = BMO_slot_int_get(op->slots_in, "compare");
-
- /* initial_elem - other_elem */
-// float delta_fl;
- int delta_i;
-
- num_total = BM_mesh_elem_count(bm, BM_VERT);
-
- /* iterate through all selected edges and mark them */
- BMO_ITER (vs, &vs_iter, op->slots_in, "verts", BM_VERT) {
- BMO_vert_flag_enable(bm, vs, VERT_MARK);
- num_sels++;
- }
-
- /* allocate memory for the selected vertices indices and for all temporary vertices */
- indices = (int *)MEM_mallocN(sizeof(int) * num_sels, "vertex indices");
- v_ext = (SimSel_VertExt *)MEM_mallocN(sizeof(SimSel_VertExt) * num_total, "vertex extra");
-
- /* loop through all the vertices and fill the vertices/indices structure */
- BM_ITER_MESH (v, &v_iter, bm, BM_VERTS_OF_MESH) {
- v_ext[i].v = v;
- if (BMO_vert_flag_test(bm, v, VERT_MARK)) {
- indices[idx] = i;
- idx++;
- }
-
- switch (type) {
- case SIMVERT_FACE:
- /* calling BM_vert_face_count every time is time consumming, so call it only once per vertex */
- v_ext[i].num_faces = BM_vert_face_count(v);
- break;
-
- case SIMVERT_VGROUP:
- v_ext[i].dvert = (cd_dvert_offset != -1) ? BM_ELEM_CD_GET_VOID_P(v_ext[i].v, cd_dvert_offset) : NULL;
- break;
-
- case SIMVERT_EDGE:
- v_ext[i].num_edges = BM_vert_edge_count(v);
- break;
- }
-
- i++;
- }
-
- /* select the vertices if any */
- for (i = 0; i < num_total; i++) {
- v = v_ext[i].v;
- if (!BMO_vert_flag_test(bm, v, VERT_MARK) &&
- !BM_elem_flag_test(v, BM_ELEM_HIDDEN))
- {
- bool cont = true;
- for (idx = 0; idx < num_sels && cont == true; idx++) {
- vs = v_ext[indices[idx]].v;
- switch (type) {
- case SIMVERT_NORMAL:
- /* compare the angle between the normals */
- if (angle_normalized_v3v3(v->no, vs->no) <= thresh_radians) {
- BMO_vert_flag_enable(bm, v, VERT_MARK);
- cont = false;
- }
- break;
- case SIMVERT_FACE:
- /* number of adjacent faces */
- delta_i = v_ext[i].num_faces - v_ext[indices[idx]].num_faces;
- if (bm_sel_similar_cmp_i(delta_i, compare)) {
- BMO_vert_flag_enable(bm, v, VERT_MARK);
- cont = false;
- }
- break;
-
- case SIMVERT_VGROUP:
- if (v_ext[i].dvert != NULL && v_ext[indices[idx]].dvert != NULL) {
- if (defvert_find_shared(v_ext[i].dvert, v_ext[indices[idx]].dvert) != -1) {
- BMO_vert_flag_enable(bm, v, VERT_MARK);
- cont = false;
- }
- }
- break;
- case SIMVERT_EDGE:
- /* number of adjacent edges */
- delta_i = v_ext[i].num_edges - v_ext[indices[idx]].num_edges;
- if (bm_sel_similar_cmp_i(delta_i, compare)) {
- BMO_vert_flag_enable(bm, v, VERT_MARK);
- cont = false;
- }
- break;
- default:
- BLI_assert(0);
- break;
- }
- }
- }
- }
-
- MEM_freeN(indices);
- MEM_freeN(v_ext);
-
- BMO_slot_buffer_from_enabled_flag(bm, op, op->slots_out, "verts.out", BM_VERT, VERT_MARK);
-
-#undef VERT_MARK
-}
diff --git a/source/blender/bmesh/operators/bmo_smooth_laplacian.c b/source/blender/bmesh/operators/bmo_smooth_laplacian.c
index 317045b303c..9f394aacc1c 100644
--- a/source/blender/bmesh/operators/bmo_smooth_laplacian.c
+++ b/source/blender/bmesh/operators/bmo_smooth_laplacian.c
@@ -153,9 +153,12 @@ static LaplacianSystem *init_laplacian_system(int a_numEdges, int a_numFaces, in
return sys;
}
-/* Compute weight between vertice v_i and all your neighbors
+/**
+ * Compute weight between vertice v_i and all your neighbors
* weight between v_i and v_neighbor
+ * <pre>
* Wij = cot(alpha) + cot(beta) / (4.0 * total area of all faces * sum all weight)
+ *
* v_i *
* / | \
* / | \
@@ -163,6 +166,7 @@ static LaplacianSystem *init_laplacian_system(int a_numEdges, int a_numFaces, in
* \ | /
* \ | /
* * v_neighbor
+ * </pre>
*/
static void init_laplacian_matrix(LaplacianSystem *sys)
diff --git a/source/blender/bmesh/operators/bmo_subdivide.c b/source/blender/bmesh/operators/bmo_subdivide.c
index c8ba2134a73..66730f8c837 100644
--- a/source/blender/bmesh/operators/bmo_subdivide.c
+++ b/source/blender/bmesh/operators/bmo_subdivide.c
@@ -182,15 +182,12 @@ static void interp_slerp_co_no_v3(
/* calculate sphere 'center' */
{
/* use point on plane to */
- float plane_a[4], plane_b[4], plane_c[4];
float no_mid[3], no_ortho[3];
/* pass this as an arg instead */
#if 0
float no_dir[3];
#endif
- float v_a_no_ortho[3], v_b_no_ortho[3];
-
add_v3_v3v3(no_mid, no_a, no_b);
normalize_v3(no_mid);
@@ -200,24 +197,28 @@ static void interp_slerp_co_no_v3(
#endif
/* axis of slerp */
+ bool center_ok = false;
cross_v3_v3v3(no_ortho, no_mid, no_dir);
- normalize_v3(no_ortho);
-
- /* create planes */
- cross_v3_v3v3(v_a_no_ortho, no_ortho, no_a);
- cross_v3_v3v3(v_b_no_ortho, no_ortho, no_b);
- project_v3_plane(v_a_no_ortho, no_ortho, v_a_no_ortho);
- project_v3_plane(v_b_no_ortho, no_ortho, v_b_no_ortho);
-
- plane_from_point_normal_v3(plane_a, co_a, v_a_no_ortho);
- plane_from_point_normal_v3(plane_b, co_b, v_b_no_ortho);
- plane_from_point_normal_v3(plane_c, co_b, no_ortho);
-
- /* find the sphere center from 3 planes */
- if (isect_plane_plane_plane_v3(plane_a, plane_b, plane_c, center)) {
- /* pass */
+ if (normalize_v3(no_ortho) != 0.0f) {
+ float plane_a[4], plane_b[4], plane_c[4];
+ float v_a_no_ortho[3], v_b_no_ortho[3];
+
+ /* create planes */
+ cross_v3_v3v3(v_a_no_ortho, no_ortho, no_a);
+ cross_v3_v3v3(v_b_no_ortho, no_ortho, no_b);
+ project_v3_plane(v_a_no_ortho, no_ortho, v_a_no_ortho);
+ project_v3_plane(v_b_no_ortho, no_ortho, v_b_no_ortho);
+
+ plane_from_point_normal_v3(plane_a, co_a, v_a_no_ortho);
+ plane_from_point_normal_v3(plane_b, co_b, v_b_no_ortho);
+ plane_from_point_normal_v3(plane_c, co_b, no_ortho);
+
+ /* find the sphere center from 3 planes */
+ if (isect_plane_plane_plane_v3(plane_a, plane_b, plane_c, center)) {
+ center_ok = true;
+ }
}
- else {
+ if (center_ok == false) {
mid_v3_v3v3(center, co_a, co_b);
}
}
diff --git a/source/blender/bmesh/operators/bmo_subdivide_edgering.c b/source/blender/bmesh/operators/bmo_subdivide_edgering.c
index e6881f6d8b1..251a79e8ff5 100644
--- a/source/blender/bmesh/operators/bmo_subdivide_edgering.c
+++ b/source/blender/bmesh/operators/bmo_subdivide_edgering.c
@@ -505,7 +505,7 @@ static LoopPairStore *bm_edgering_pair_store_create(
for (v_iter = lb->first, i = 0; v_iter; v_iter = v_iter->next, i++) {
BMVert *v = v_iter->data;
bm_vert_calc_surface_tangent(bm, v, nor[i]);
- BLI_ghash_insert(nors_gh_iter, v, SET_UINT_IN_POINTER(i));
+ BLI_ghash_insert(nors_gh_iter, v, POINTER_FROM_UINT(i));
}
}
@@ -768,8 +768,8 @@ static void bm_edgering_pair_interpolate(
bm_vert_calc_surface_tangent(bm, v_b, no_b);
#else
{
- const uint index_a = GET_UINT_FROM_POINTER(BLI_ghash_lookup(lpair->nors_gh_a, v_a));
- const uint index_b = GET_UINT_FROM_POINTER(BLI_ghash_lookup(lpair->nors_gh_b, v_b));
+ const uint index_a = POINTER_AS_UINT(BLI_ghash_lookup(lpair->nors_gh_a, v_a));
+ const uint index_b = POINTER_AS_UINT(BLI_ghash_lookup(lpair->nors_gh_b, v_b));
BLI_assert(BLI_ghash_haskey(lpair->nors_gh_a, v_a));
BLI_assert(BLI_ghash_haskey(lpair->nors_gh_b, v_b));
diff --git a/source/blender/bmesh/tools/bmesh_bevel.c b/source/blender/bmesh/tools/bmesh_bevel.c
index 90e4033d572..905131e3318 100644
--- a/source/blender/bmesh/tools/bmesh_bevel.c
+++ b/source/blender/bmesh/tools/bmesh_bevel.c
@@ -32,7 +32,6 @@
#include "MEM_guardedalloc.h"
-#include "DNA_object_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
@@ -1596,8 +1595,8 @@ static void bevel_extend_edge_data(BevVert *bv)
start = bcur; /* set start to first boundvert with seam_len > 0 */
/* Now for all the mesh_verts starting at current index and ending at idxlen
- * We go through outermost ring and through all its segments and add seams
- * for those edges */
+ * We go through outermost ring and through all its segments and add seams
+ * for those edges */
int idxlen = bcur->index + bcur->seam_len;
for (int i = bcur->index; i < idxlen; i++) {
BMVert *v1 = mesh_vert(vm, i % vm->count, 0, 0)->v, *v2;
@@ -1698,21 +1697,21 @@ static void bevel_harden_normals_mode(BevelParams *bp, BevVert *bv, BMOperator *
BMFace *f_a, *f_b;
BM_edge_face_pair(e, &f_a, &f_b);
- if (f_a && !BLI_ghash_haskey(tempfaceHash, SET_UINT_IN_POINTER(BM_elem_index_get(f_a)))) {
+ if (f_a && !BLI_ghash_haskey(tempfaceHash, POINTER_FROM_UINT(BM_elem_index_get(f_a)))) {
int f_area = BM_face_calc_area(f_a);
float f_no[3];
copy_v3_v3(f_no, f_a->no);
mul_v3_fl(f_no, f_area);
add_v3_v3(n_final, f_no);
- BLI_ghash_insert(tempfaceHash, SET_UINT_IN_POINTER(BM_elem_index_get(f_a)), NULL);
+ BLI_ghash_insert(tempfaceHash, POINTER_FROM_UINT(BM_elem_index_get(f_a)), NULL);
}
- if (f_b && !BLI_ghash_haskey(tempfaceHash, SET_UINT_IN_POINTER(BM_elem_index_get(f_b)))) {
+ if (f_b && !BLI_ghash_haskey(tempfaceHash, POINTER_FROM_UINT(BM_elem_index_get(f_b)))) {
int f_area = BM_face_calc_area(f_b);
float f_no[3];
copy_v3_v3(f_no, f_b->no);
mul_v3_fl(f_no, f_area);
add_v3_v3(n_final, f_no);
- BLI_ghash_insert(tempfaceHash, SET_UINT_IN_POINTER(BM_elem_index_get(f_b)), NULL);
+ BLI_ghash_insert(tempfaceHash, POINTER_FROM_UINT(BM_elem_index_get(f_b)), NULL);
}
}
}
@@ -2345,7 +2344,7 @@ static void adjust_the_cycle_or_chain(BoundVert *vstart, bool iscycle)
/* residue np + 2*i (if cycle) else np - 1 + 2*i:
* right offset for parm i matches its spec; weighted */
- row = iscycle ? np + 2 * i : np - 1 + 2 * i;
+ row = iscycle ? np + 2 * i : np - 1 + 2 * i;
EIG_linear_solver_matrix_add(solver, row, i, weight);
EIG_linear_solver_right_hand_side_add(solver, 0, row, weight * eright->offset_r);
#ifdef DEBUG_ADJUST
diff --git a/source/blender/bmesh/tools/bmesh_decimate_collapse.c b/source/blender/bmesh/tools/bmesh_decimate_collapse.c
index c1b2bc2625b..fa427b3b9eb 100644
--- a/source/blender/bmesh/tools/bmesh_decimate_collapse.c
+++ b/source/blender/bmesh/tools/bmesh_decimate_collapse.c
@@ -1354,7 +1354,7 @@ void BM_mesh_decimate_collapse(
/* simple non-mirror case */
while ((bm->totface > face_tot_target) &&
(BLI_heap_is_empty(eheap) == false) &&
- (BLI_heap_node_value(BLI_heap_top(eheap)) != COST_INVALID))
+ (BLI_heap_top_value(eheap) != COST_INVALID))
{
// const float value = BLI_heap_node_value(BLI_heap_top(eheap));
BMEdge *e = BLI_heap_pop_min(eheap);
@@ -1379,7 +1379,7 @@ void BM_mesh_decimate_collapse(
else {
while ((bm->totface > face_tot_target) &&
(BLI_heap_is_empty(eheap) == false) &&
- (BLI_heap_node_value(BLI_heap_top(eheap)) != COST_INVALID))
+ (BLI_heap_top_value(eheap) != COST_INVALID))
{
/**
* \note
diff --git a/source/blender/bmesh/tools/bmesh_intersect.c b/source/blender/bmesh/tools/bmesh_intersect.c
index a35bb81a1c2..1b37b7721b2 100644
--- a/source/blender/bmesh/tools/bmesh_intersect.c
+++ b/source/blender/bmesh/tools/bmesh_intersect.c
@@ -226,7 +226,7 @@ static void face_edges_add(
BMEdge *e,
const bool use_test)
{
- void *f_index_key = SET_INT_IN_POINTER(f_index);
+ void *f_index_key = POINTER_FROM_INT(f_index);
BLI_assert(e->head.htype == BM_EDGE);
BLI_assert(BM_edge_in_face(e, s->bm->ftable[f_index]) == false);
BLI_assert(BM_elem_index_get(s->bm->ftable[f_index]) == f_index);
@@ -1478,7 +1478,7 @@ bool BM_mesh_intersect(
faces = bm->ftable;
GHASH_ITER (gh_iter, s.face_edges) {
- const int f_index = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(&gh_iter));
+ const int f_index = POINTER_AS_INT(BLI_ghashIterator_getKey(&gh_iter));
BMFace *f;
struct LinkBase *e_ls_base = BLI_ghashIterator_getValue(&gh_iter);
diff --git a/source/blender/bmesh/tools/bmesh_path.c b/source/blender/bmesh/tools/bmesh_path.c
index cc5ac6dd8ce..07e3c2a2d78 100644
--- a/source/blender/bmesh/tools/bmesh_path.c
+++ b/source/blender/bmesh/tools/bmesh_path.c
@@ -29,7 +29,7 @@
#include "BLI_math.h"
#include "BLI_linklist.h"
-#include "BLI_heap.h"
+#include "BLI_heap_simple.h"
#include "bmesh.h"
#include "bmesh_path.h" /* own include */
@@ -72,7 +72,7 @@ static float step_cost_3_v3(
/* BM_mesh_calc_path_vert */
static void verttag_add_adjacent(
- Heap *heap, BMVert *v_a, BMVert **verts_prev, float *cost,
+ HeapSimple *heap, BMVert *v_a, BMVert **verts_prev, float *cost,
const struct BMCalcPathParams *params)
{
const int v_a_index = BM_elem_index_get(v_a);
@@ -93,7 +93,7 @@ static void verttag_add_adjacent(
if (cost[v_b_index] > cost_new) {
cost[v_b_index] = cost_new;
verts_prev[v_b_index] = v_a;
- BLI_heap_insert(heap, cost_new, v_b);
+ BLI_heapsimple_insert(heap, cost_new, v_b);
}
}
}
@@ -119,7 +119,7 @@ static void verttag_add_adjacent(
if (cost[v_b_index] > cost_new) {
cost[v_b_index] = cost_new;
verts_prev[v_b_index] = v_a;
- BLI_heap_insert(heap, cost_new, v_b);
+ BLI_heapsimple_insert(heap, cost_new, v_b);
}
}
} while ((l_iter = l_iter->next) != l->prev);
@@ -136,7 +136,7 @@ LinkNode *BM_mesh_calc_path_vert(
/* BM_ELEM_TAG flag is used to store visited edges */
BMVert *v;
BMIter viter;
- Heap *heap;
+ HeapSimple *heap;
float *cost;
BMVert **verts_prev;
int i, totvert;
@@ -169,12 +169,12 @@ LinkNode *BM_mesh_calc_path_vert(
*/
/* regular dijkstra shortest path, but over faces instead of vertices */
- heap = BLI_heap_new();
- BLI_heap_insert(heap, 0.0f, v_src);
+ heap = BLI_heapsimple_new();
+ BLI_heapsimple_insert(heap, 0.0f, v_src);
cost[BM_elem_index_get(v_src)] = 0.0f;
- while (!BLI_heap_is_empty(heap)) {
- v = BLI_heap_pop_min(heap);
+ while (!BLI_heapsimple_is_empty(heap)) {
+ v = BLI_heapsimple_pop_min(heap);
if (v == v_dst)
break;
@@ -193,7 +193,7 @@ LinkNode *BM_mesh_calc_path_vert(
MEM_freeN(verts_prev);
MEM_freeN(cost);
- BLI_heap_free(heap, NULL);
+ BLI_heapsimple_free(heap, NULL);
return path;
}
@@ -221,7 +221,7 @@ static float edgetag_cut_cost_face(BMEdge *e_a, BMEdge *e_b, BMFace *f)
}
static void edgetag_add_adjacent(
- Heap *heap, BMEdge *e_a, BMEdge **edges_prev, float *cost,
+ HeapSimple *heap, BMEdge *e_a, BMEdge **edges_prev, float *cost,
const struct BMCalcPathParams *params)
{
const int e_a_index = BM_elem_index_get(e_a);
@@ -255,7 +255,7 @@ static void edgetag_add_adjacent(
if (cost[e_b_index] > cost_new) {
cost[e_b_index] = cost_new;
edges_prev[e_b_index] = e_a;
- BLI_heap_insert(heap, cost_new, e_b);
+ BLI_heapsimple_insert(heap, cost_new, e_b);
}
}
}
@@ -291,7 +291,7 @@ static void edgetag_add_adjacent(
if (cost[e_b_index] > cost_new) {
cost[e_b_index] = cost_new;
edges_prev[e_b_index] = e_a;
- BLI_heap_insert(heap, cost_new, e_b);
+ BLI_heapsimple_insert(heap, cost_new, e_b);
}
}
} while ((l_cycle_iter = l_cycle_iter->next) != l_cycle_end);
@@ -308,7 +308,7 @@ LinkNode *BM_mesh_calc_path_edge(
/* BM_ELEM_TAG flag is used to store visited edges */
BMEdge *e;
BMIter eiter;
- Heap *heap;
+ HeapSimple *heap;
float *cost;
BMEdge **edges_prev;
int i, totedge;
@@ -341,12 +341,12 @@ LinkNode *BM_mesh_calc_path_edge(
*/
/* regular dijkstra shortest path, but over edges instead of vertices */
- heap = BLI_heap_new();
- BLI_heap_insert(heap, 0.0f, e_src);
+ heap = BLI_heapsimple_new();
+ BLI_heapsimple_insert(heap, 0.0f, e_src);
cost[BM_elem_index_get(e_src)] = 0.0f;
- while (!BLI_heap_is_empty(heap)) {
- e = BLI_heap_pop_min(heap);
+ while (!BLI_heapsimple_is_empty(heap)) {
+ e = BLI_heapsimple_pop_min(heap);
if (e == e_dst)
break;
@@ -365,7 +365,7 @@ LinkNode *BM_mesh_calc_path_edge(
MEM_freeN(edges_prev);
MEM_freeN(cost);
- BLI_heap_free(heap, NULL);
+ BLI_heapsimple_free(heap, NULL);
return path;
}
@@ -421,7 +421,7 @@ static float facetag_cut_cost_vert(BMFace *f_a, BMFace *f_b, BMVert *v, const vo
}
static void facetag_add_adjacent(
- Heap *heap, BMFace *f_a, BMFace **faces_prev, float *cost,
+ HeapSimple *heap, BMFace *f_a, BMFace **faces_prev, float *cost,
const void * const f_endpoints[2], const struct BMCalcPathParams *params)
{
const int f_a_index = BM_elem_index_get(f_a);
@@ -447,7 +447,7 @@ static void facetag_add_adjacent(
if (cost[f_b_index] > cost_new) {
cost[f_b_index] = cost_new;
faces_prev[f_b_index] = f_a;
- BLI_heap_insert(heap, cost_new, f_b);
+ BLI_heapsimple_insert(heap, cost_new, f_b);
}
}
} while ((l_iter = l_iter->radial_next) != l_first);
@@ -474,7 +474,7 @@ static void facetag_add_adjacent(
if (cost[f_b_index] > cost_new) {
cost[f_b_index] = cost_new;
faces_prev[f_b_index] = f_a;
- BLI_heap_insert(heap, cost_new, f_b);
+ BLI_heapsimple_insert(heap, cost_new, f_b);
}
}
}
@@ -491,7 +491,7 @@ LinkNode *BM_mesh_calc_path_face(
/* BM_ELEM_TAG flag is used to store visited edges */
BMFace *f;
BMIter fiter;
- Heap *heap;
+ HeapSimple *heap;
float *cost;
BMFace **faces_prev;
int i, totface;
@@ -527,12 +527,12 @@ LinkNode *BM_mesh_calc_path_face(
*/
/* regular dijkstra shortest path, but over faces instead of vertices */
- heap = BLI_heap_new();
- BLI_heap_insert(heap, 0.0f, f_src);
+ heap = BLI_heapsimple_new();
+ BLI_heapsimple_insert(heap, 0.0f, f_src);
cost[BM_elem_index_get(f_src)] = 0.0f;
- while (!BLI_heap_is_empty(heap)) {
- f = BLI_heap_pop_min(heap);
+ while (!BLI_heapsimple_is_empty(heap)) {
+ f = BLI_heapsimple_pop_min(heap);
if (f == f_dst)
break;
@@ -551,7 +551,7 @@ LinkNode *BM_mesh_calc_path_face(
MEM_freeN(faces_prev);
MEM_freeN(cost);
- BLI_heap_free(heap, NULL);
+ BLI_heapsimple_free(heap, NULL);
return path;
}
diff --git a/source/blender/bmesh/tools/bmesh_wireframe.c b/source/blender/bmesh/tools/bmesh_wireframe.c
index c45e617dd39..57e0e0b44ca 100644
--- a/source/blender/bmesh/tools/bmesh_wireframe.c
+++ b/source/blender/bmesh/tools/bmesh_wireframe.c
@@ -28,7 +28,6 @@
#include "MEM_guardedalloc.h"
-#include "DNA_object_types.h"
#include "DNA_meshdata_types.h"
#include "BLI_math.h"
diff --git a/source/blender/collada/AnimationExporter.cpp b/source/blender/collada/AnimationExporter.cpp
index 31d0dde567b..ef9611778c9 100644
--- a/source/blender/collada/AnimationExporter.cpp
+++ b/source/blender/collada/AnimationExporter.cpp
@@ -65,9 +65,9 @@ bool AnimationExporter::is_flat_line(std::vector<float> &values, int channel_cou
return true;
}
/*
- * This function creates a complete LINEAR Collada <Animation> Entry with all needed
- * <source>, <sampler>, and <channel> entries.
- * This is is used for creating sampled Transformation Animations for either:
+ * This function creates a complete LINEAR Collada <Animation> Entry with all needed
+ * <source>, <sampler>, and <channel> entries.
+ * This is is used for creating sampled Transformation Animations for either:
*
* 1-axis animation:
* times contains the time points in seconds from within the timeline
@@ -143,7 +143,7 @@ void AnimationExporter::create_sampled_animation(int channel_count,
* Export all animation FCurves of an Object.
*
* Note: This uses the keyframes as sample points,
- * and exports "baked keyframes" while keeping the tangent infromation
+ * and exports "baked keyframes" while keeping the tangent information
* of the FCurves intact. This works for simple cases, but breaks
* especially when negative scales are involved in the animation.
*
diff --git a/source/blender/collada/AnimationImporter.h b/source/blender/collada/AnimationImporter.h
index f63329158f0..ff49bc369cf 100644
--- a/source/blender/collada/AnimationImporter.h
+++ b/source/blender/collada/AnimationImporter.h
@@ -181,11 +181,12 @@ public:
// prerequisites:
// animlist_map - map animlist id -> animlist
// curve_map - map anim id -> curve(s)
- Object * translate_animation_OLD(Main *bmain, COLLADAFW::Node *node,
- std::map<COLLADAFW::UniqueId, Object*>& object_map,
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map,
- COLLADAFW::Transformation::TransformationType tm_type,
- Object *par_job = NULL);
+ Object *translate_animation_OLD(
+ Main *bmain, COLLADAFW::Node *node,
+ std::map<COLLADAFW::UniqueId, Object*>& object_map,
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map,
+ COLLADAFW::Transformation::TransformationType tm_type,
+ Object *par_job = NULL);
void find_frames( std::vector<float>* frames, std::vector<FCurve*>* curves );
void find_frames_old( std::vector<float>* frames, COLLADAFW::Node * node, COLLADAFW::Transformation::TransformationType tm_type );
diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp
index 85b9d3297ca..45628054ad2 100644
--- a/source/blender/collada/ArmatureExporter.cpp
+++ b/source/blender/collada/ArmatureExporter.cpp
@@ -39,10 +39,8 @@
#include "BKE_armature.h"
extern "C" {
-#include "BKE_main.h"
-#include "BKE_mesh.h"
#include "BKE_global.h"
-#include "BKE_library.h"
+#include "BKE_mesh.h"
}
#include "ED_armature.h"
@@ -69,7 +67,7 @@ void ArmatureExporter::add_armature_bones(bContext *C, Depsgraph *depsgraph, Obj
Main *bmain = CTX_data_main(C);
// write bone nodes
- bArmature * armature = (bArmature *)ob_arm->data;
+ bArmature *armature = (bArmature *)ob_arm->data;
bool is_edited = armature->edbo != NULL;
if (!is_edited)
diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp
index d3370172f60..32c7363a994 100644
--- a/source/blender/collada/ArmatureImporter.cpp
+++ b/source/blender/collada/ArmatureImporter.cpp
@@ -111,7 +111,7 @@ int ArmatureImporter::create_bone(SkinInfo *skin, COLLADAFW::Node *node, EditBon
/*
* We use the inv_bind_shape matrix to apply the armature bind pose as its rest pose.
- */
+ */
std::map<COLLADAFW::UniqueId, SkinInfo>::iterator skin_it;
bool bone_is_skinned = false;
@@ -463,11 +463,11 @@ void ArmatureImporter::create_armature_bones(Main *bmain, std::vector<Object *>
if (!ob_arm)
continue;
- bArmature * armature = (bArmature *)ob_arm->data;
+ bArmature *armature = (bArmature *)ob_arm->data;
if (!armature)
continue;
- char * bone_name = (char *)bc_get_joint_name(*ri);
+ char *bone_name = (char *)bc_get_joint_name(*ri);
Bone *bone = BKE_armature_find_bone_name(armature, bone_name);
if (bone) {
fprintf(stderr, "Reuse of child bone [%s] as root bone in same Armature is not supported.\n", bone_name);
@@ -519,32 +519,32 @@ Object *ArmatureImporter::create_armature_bones(Main *bmain, SkinInfo& skin)
* if so, use that skin's armature
*/
- /*
- Pseudocode:
-
- find_node_in_tree(node, root_joint)
-
- skin::find_root_joints(root_joints):
- std::vector root_joints;
- for each root in root_joints:
- for each joint in joints:
- if find_node_in_tree(joint, root):
- if (std::find(root_joints.begin(), root_joints.end(), root) == root_joints.end())
- root_joints.push_back(root);
-
- for (each skin B with armature) {
- find all root joints for skin B
-
- for each joint X in skin A:
- for each root joint R in skin B:
- if (find_node_in_tree(X, R)) {
- shared = 1;
- goto endloop;
- }
- }
-
- endloop:
- */
+ /**
+ * Pseudocode:
+ *
+ * find_node_in_tree(node, root_joint)
+ *
+ * skin::find_root_joints(root_joints):
+ * std::vector root_joints;
+ * for each root in root_joints:
+ * for each joint in joints:
+ * if find_node_in_tree(joint, root):
+ * if (std::find(root_joints.begin(), root_joints.end(), root) == root_joints.end())
+ * root_joints.push_back(root);
+ *
+ * for (each skin B with armature) {
+ * find all root joints for skin B
+ *
+ * for each joint X in skin A:
+ * for each root joint R in skin B:
+ * if (find_node_in_tree(X, R)) {
+ * shared = 1;
+ * goto endloop;
+ * }
+ * }
+ *
+ * endloop:
+ */
SkinInfo *a = &skin;
Object *shared = NULL;
@@ -592,7 +592,7 @@ Object *ArmatureImporter::create_armature_bones(Main *bmain, SkinInfo& skin)
}
// enter armature edit mode
- bArmature * armature = (bArmature *)ob_arm->data;
+ bArmature *armature = (bArmature *)ob_arm->data;
ED_armature_to_edit(armature);
totbone = 0;
diff --git a/source/blender/collada/ControllerExporter.cpp b/source/blender/collada/ControllerExporter.cpp
index 1a58bc9d1b8..862ce306409 100644
--- a/source/blender/collada/ControllerExporter.cpp
+++ b/source/blender/collada/ControllerExporter.cpp
@@ -38,11 +38,10 @@
#include "BKE_armature.h"
extern "C" {
-#include "BKE_main.h"
-#include "BKE_mesh.h"
#include "BKE_global.h"
-#include "BKE_library.h"
#include "BKE_idprop.h"
+#include "BKE_library.h"
+#include "BKE_mesh.h"
}
#include "ED_armature.h"
@@ -397,13 +396,13 @@ std::string ControllerExporter::add_morph_weights(Key *key, Object *ob)
return source_id;
}
-//Added to implemente support for animations.
+//Added to implement support for animations.
void ControllerExporter::add_weight_extras(Key *key)
{
// can also try the base element and param alternative
COLLADASW::BaseExtraTechnique extra;
- KeyBlock * kb = (KeyBlock *)key->block.first;
+ KeyBlock *kb = (KeyBlock *)key->block.first;
//skip the basis
kb = kb->next;
for (; kb; kb = kb->next) {
@@ -546,7 +545,7 @@ std::string ControllerExporter::add_inv_bind_mats_source(Object *ob_arm, ListBas
}
}
- // back from rest positon
+ // back from rest position
if (!(flag & ARM_RESTPOS)) {
arm->flag = flag;
BKE_pose_where_is(depsgraph, scene, ob_arm);
diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp
index ced6e967acf..50a9e351bc6 100644
--- a/source/blender/collada/DocumentImporter.cpp
+++ b/source/blender/collada/DocumentImporter.cpp
@@ -58,15 +58,14 @@ extern "C" {
#include "BKE_camera.h"
#include "BKE_collection.h"
-#include "BKE_main.h"
+#include "BKE_fcurve.h"
+#include "BKE_global.h"
+#include "BKE_image.h"
#include "BKE_layer.h"
#include "BKE_lamp.h"
#include "BKE_library.h"
-#include "BKE_fcurve.h"
-#include "BKE_scene.h"
-#include "BKE_global.h"
#include "BKE_material.h"
-#include "BKE_image.h"
+#include "BKE_scene.h"
#include "BLI_path_util.h"
@@ -695,8 +694,10 @@ finally:
return root_objects;
}
-/** When this method is called, the writer must write the entire visual scene.
- * Return The writer should return true, if writing succeeded, false otherwise. */
+/**
+ * When this method is called, the writer must write the entire visual scene.
+ * Return The writer should return true, if writing succeeded, false otherwise.
+ */
bool DocumentImporter::writeVisualScene(const COLLADAFW::VisualScene *visualScene)
{
if (mImportStage != General)
diff --git a/source/blender/collada/DocumentImporter.h b/source/blender/collada/DocumentImporter.h
index b31a086d710..d726cd55c1c 100644
--- a/source/blender/collada/DocumentImporter.h
+++ b/source/blender/collada/DocumentImporter.h
@@ -84,7 +84,7 @@ public:
/**
* This method will be called if an error in the loading process occurred and the loader cannot
* continue to load. The writer should undo all operations that have been performed.
- * \param errorMessage A message containing informations about the error that occurred.
+ * \param errorMessage A message containing information about the error that occurred.
*/
void cancel(const COLLADAFW::String& errorMessage);
diff --git a/source/blender/collada/ErrorHandler.cpp b/source/blender/collada/ErrorHandler.cpp
index 26674445d98..caa73900632 100644
--- a/source/blender/collada/ErrorHandler.cpp
+++ b/source/blender/collada/ErrorHandler.cpp
@@ -50,8 +50,8 @@ ErrorHandler::~ErrorHandler()
bool ErrorHandler::handleError(const COLLADASaxFWL::IError *error)
{
/* This method must return true when Collada should continue.
- See https://github.com/KhronosGroup/OpenCOLLADA/issues/442
- */
+ * See https://github.com/KhronosGroup/OpenCOLLADA/issues/442
+ */
bool isWarning = false;
if (error->getErrorClass() == COLLADASaxFWL::IError::ERROR_SAXPARSER) {
diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp
index 0beded56b3b..928509cbef9 100644
--- a/source/blender/collada/GeometryExporter.cpp
+++ b/source/blender/collada/GeometryExporter.cpp
@@ -40,10 +40,9 @@
extern "C" {
#include "BLI_utildefines.h"
- #include "BKE_main.h"
+ #include "BKE_customdata.h"
#include "BKE_global.h"
#include "BKE_library.h"
- #include "BKE_customdata.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
}
@@ -151,9 +150,9 @@ void GeometryExporter::operator()(Object *ob)
closeGeometry();
if (this->export_settings->include_shapekeys) {
- Key * key = BKE_key_from_object(ob);
+ Key *key = BKE_key_from_object(ob);
if (key) {
- KeyBlock * kb = (KeyBlock *)key->block.first;
+ KeyBlock *kb = (KeyBlock *)key->block.first;
//skip the basis
kb = kb->next;
for (; kb; kb = kb->next) {
diff --git a/source/blender/collada/GeometryExporter.h b/source/blender/collada/GeometryExporter.h
index 5d74124b07a..e47b3f4eee8 100644
--- a/source/blender/collada/GeometryExporter.h
+++ b/source/blender/collada/GeometryExporter.h
@@ -128,7 +128,7 @@ private:
const ExportSettings *export_settings;
- Mesh * get_mesh(Scene *sce, Object *ob, int apply_modifiers);
+ Mesh *get_mesh(Scene *sce, Object *ob, int apply_modifiers);
};
struct GeometryFunctor {
diff --git a/source/blender/collada/ImageExporter.cpp b/source/blender/collada/ImageExporter.cpp
index bb3cebf4cf0..c2666f591b5 100644
--- a/source/blender/collada/ImageExporter.cpp
+++ b/source/blender/collada/ImageExporter.cpp
@@ -39,9 +39,11 @@ extern "C" {
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
+
#include "BLI_fileops.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
+
#include "IMB_imbuf_types.h"
}
diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp
index 4a8fca6d3cd..5aac5a09118 100644
--- a/source/blender/collada/MeshImporter.cpp
+++ b/source/blender/collada/MeshImporter.cpp
@@ -43,7 +43,6 @@ extern "C" {
#include "BKE_displist.h"
#include "BKE_global.h"
#include "BKE_library.h"
- #include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
@@ -183,7 +182,7 @@ void VCOLDataWrapper::get_vcol(int v_index, MLoopCol *mloopcol)
case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
{
COLLADAFW::ArrayPrimitiveType<float> *values = mVData->getFloatValues();
- if (values->empty() || values->getCount() <= (v_index * stride + 2)) return; // xxx need to create an eror instead
+ if (values->empty() || values->getCount() <= (v_index * stride + 2)) return; // xxx need to create an error instead
mloopcol->r = unit_float_to_uchar_clamp((*values)[v_index * stride]);
mloopcol->g = unit_float_to_uchar_clamp((*values)[v_index * stride + 1]);
@@ -194,7 +193,7 @@ void VCOLDataWrapper::get_vcol(int v_index, MLoopCol *mloopcol)
case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
{
COLLADAFW::ArrayPrimitiveType<double> *values = mVData->getDoubleValues();
- if (values->empty() || values->getCount() <= (v_index * stride + 2)) return; // xxx need to create an eror instead
+ if (values->empty() || values->getCount() <= (v_index * stride + 2)) return; // xxx need to create an error instead
mloopcol->r = unit_float_to_uchar_clamp((*values)[v_index * stride]);
mloopcol->g = unit_float_to_uchar_clamp((*values)[v_index * stride + 1]);
@@ -545,7 +544,7 @@ unsigned int MeshImporter::get_loose_edge_count(COLLADAFW::Mesh *mesh) {
}
// =================================================================
-// This functin is copied from source/blender/editors/mesh/mesh_data.c
+// This function is copied from source/blender/editors/mesh/mesh_data.c
//
// TODO: (As discussed with sergey-) :
// Maybe move this function to blenderkernel/intern/mesh.c
@@ -584,7 +583,7 @@ void MeshImporter::mesh_add_edges(Mesh *mesh, int len)
// =================================================================
// Read all loose edges.
// Important: This function assumes that all edges from existing
-// faces have allready been generated and added to me->medge
+// faces have already been generated and added to me->medge
// So this function MUST be called after read_faces() (see below)
// =================================================================
void MeshImporter::read_lines(COLLADAFW::Mesh *mesh, Mesh *me)
@@ -678,7 +677,7 @@ void MeshImporter::read_polys(COLLADAFW::Mesh *collada_mesh, Mesh *me)
unsigned int vertex_count = mp->getGroupedVerticesVertexCount(group_index);
for (unsigned int vertex_index = 0; vertex_index < vertex_count - 2; vertex_index++) {
- // For each triangle store indeces of its 3 vertices
+ // For each triangle store indices of its 3 vertices
unsigned int triangle_vertex_indices[3] = {first_vertex, position_indices[1], position_indices[2]};
set_poly_indices(mpoly, mloop, loop_index, triangle_vertex_indices, 3);
@@ -901,7 +900,7 @@ static bool bc_has_same_material_configuration(Object *ob1, Object *ob2)
/**
*
- * Caution here: This code assumes tha all materials are assigned to Object
+ * Caution here: This code assumes that all materials are assigned to Object
* and no material is assigned to Data.
* That is true right after the objects have been imported.
*
@@ -1033,7 +1032,7 @@ void MeshImporter::assign_material_to_geom(
Material *ma = uid_material_map[ma_uid];
- // Attention! This temporaly assigns material to object on purpose!
+ // Attention! This temporarily assigns material to object on purpose!
// See note above.
ob->actcol=0;
assign_material(m_bmain, ob, ma, mat_index + 1, BKE_MAT_ASSIGN_OBJECT);
@@ -1065,7 +1064,7 @@ Object *MeshImporter::create_mesh_object(COLLADAFW::Node *node, COLLADAFW::Insta
{
const COLLADAFW::UniqueId *geom_uid = &geom->getInstanciatedObjectId();
- // check if node instanciates controller or geometry
+ // check if node instantiates controller or geometry
if (isController) {
geom_uid = armature_importer->get_geometry_uid(*geom_uid);
@@ -1092,7 +1091,7 @@ Object *MeshImporter::create_mesh_object(COLLADAFW::Node *node, COLLADAFW::Insta
// add object
Object *ob = bc_add_object(m_bmain, scene, view_layer, OB_MESH, name);
- bc_set_mark(ob); // used later for material assignement optimization
+ bc_set_mark(ob); // used later for material assignment optimization
// store object pointer for ArmatureImporter
@@ -1164,7 +1163,7 @@ bool MeshImporter::write_geometry(const COLLADAFW::Geometry *geom)
// BKE_mesh_calc_edges(me, false, false);
// read_lines() must be called after the face edges have been generated.
- // Oterwise the loose edges will be silently deleted again.
+ // Otherwise the loose edges will be silently deleted again.
read_lines(mesh, me);
return true;
diff --git a/source/blender/collada/SceneExporter.cpp b/source/blender/collada/SceneExporter.cpp
index 248c780102c..f21d82bd393 100644
--- a/source/blender/collada/SceneExporter.cpp
+++ b/source/blender/collada/SceneExporter.cpp
@@ -60,7 +60,7 @@ void SceneExporter::exportHierarchy(bContext *C, Depsgraph *depsgraph, Scene *sc
ob->id.tag |= LIB_TAG_DOIT;
}
- // Now find all exportable base ojects (highest in export hierarchy)
+ // Now find all exportable base objects (highest in export hierarchy)
for (node = this->export_settings->export_set; node; node = node->next) {
Object *ob = (Object *) node->link;
if (bc_is_base_node(this->export_settings->export_set, ob)) {
diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp
index 86824800378..5019916b06f 100644
--- a/source/blender/collada/collada_utils.cpp
+++ b/source/blender/collada/collada_utils.cpp
@@ -47,13 +47,13 @@ extern "C" {
#include "BKE_context.h"
#include "BKE_customdata.h"
-#include "BKE_object.h"
#include "BKE_global.h"
#include "BKE_layer.h"
+#include "BKE_library.h"
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
+#include "BKE_object.h"
#include "BKE_scene.h"
-#include "BKE_main.h"
#include "ED_armature.h"
@@ -154,7 +154,8 @@ Object *bc_add_object(Main *bmain, Scene *scene, ViewLayer *view_layer, int type
BKE_collection_object_add(bmain, layer_collection->collection, ob);
Base *base = BKE_view_layer_base_find(view_layer, ob);
- BKE_view_layer_base_select(view_layer, base);
+ /* TODO: is setting active needed? */
+ BKE_view_layer_base_select_and_set_active(view_layer, base);
return ob;
}
@@ -377,8 +378,8 @@ void bc_match_scale(std::vector<Object *> *objects_done,
}
/*
- Convenience function to get only the needed components of a matrix
-*/
+ * Convenience function to get only the needed components of a matrix
+ */
void bc_decompose(float mat[4][4], float *loc, float eul[3], float quat[4], float *size)
{
if (size) {
@@ -399,17 +400,17 @@ void bc_decompose(float mat[4][4], float *loc, float eul[3], float quat[4], floa
}
/*
-* Create rotation_quaternion from a delta rotation and a reference quat
-*
-* Input:
-* mat_from: The rotation matrix before rotation
-* mat_to : The rotation matrix after rotation
-* qref : the quat corresponding to mat_from
-*
-* Output:
-* rot : the calculated result (quaternion)
-*
-*/
+ * Create rotation_quaternion from a delta rotation and a reference quat
+ *
+ * Input:
+ * mat_from: The rotation matrix before rotation
+ * mat_to : The rotation matrix after rotation
+ * qref : the quat corresponding to mat_from
+ *
+ * Output:
+ * rot : the calculated result (quaternion)
+ *
+ */
void bc_rotate_from_reference_quat(float quat_to[4], float quat_from[4], float mat_to[4][4])
{
float qd[4];
@@ -488,11 +489,11 @@ int bc_set_layer(int bitfield, int layer, bool enable)
return bitfield;
}
-/*
- | This method creates a new extension map when needed.
- | Note: The ~BoneExtensionManager destructor takes care
- | to delete the created maps when the manager is removed.
-*/
+/**
+ * This method creates a new extension map when needed.
+ * \note The ~BoneExtensionManager destructor takes care
+ * to delete the created maps when the manager is removed.
+ */
BoneExtensionMap &BoneExtensionManager::getExtensionMap(bArmature *armature)
{
std::string key = armature->id.name;
@@ -610,7 +611,7 @@ inline bool isInteger(const std::string & s)
{
if (s.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) return false;
- char * p;
+ char *p;
strtol(s.c_str(), &p, 10);
return (*p == 0);
@@ -690,8 +691,8 @@ int BoneExtended::get_use_connect()
}
/**
-* Stores a 4*4 matrix as a custom bone property array of size 16
-*/
+ * Stores a 4*4 matrix as a custom bone property array of size 16
+ */
void bc_set_IDPropertyMatrix(EditBone *ebone, const char *key, float mat[4][4])
{
IDProperty *idgroup = (IDProperty *)ebone->prop;
@@ -717,10 +718,10 @@ void bc_set_IDPropertyMatrix(EditBone *ebone, const char *key, float mat[4][4])
#if 0
/**
-* Stores a Float value as a custom bone property
-*
-* Note: This function is currently not needed. Keep for future usage
-*/
+ * Stores a Float value as a custom bone property
+ *
+ * Note: This function is currently not needed. Keep for future usage
+ */
static void bc_set_IDProperty(EditBone *ebone, const char *key, float value)
{
if (ebone->prop == NULL)
@@ -738,19 +739,19 @@ static void bc_set_IDProperty(EditBone *ebone, const char *key, float value)
}
#endif
-/*
-* Get a custom property when it exists.
-* This function is also used to check if a property exists.
-*/
+/**
+ * Get a custom property when it exists.
+ * This function is also used to check if a property exists.
+ */
IDProperty *bc_get_IDProperty(Bone *bone, std::string key)
{
return (bone->prop == NULL) ? NULL : IDP_GetPropertyFromGroup(bone->prop, key.c_str());
}
/**
-* Read a custom bone property and convert to float
-* Return def if the property does not exist.
-*/
+ * Read a custom bone property and convert to float
+ * Return def if the property does not exist.
+ */
float bc_get_property(Bone *bone, std::string key, float def)
{
float result = def;
@@ -774,13 +775,13 @@ float bc_get_property(Bone *bone, std::string key, float def)
}
/**
-* Read a custom bone property and convert to matrix
-* Return true if conversion was succesfull
-*
-* Return false if:
-* - the property does not exist
-* - is not an array of size 16
-*/
+ * Read a custom bone property and convert to matrix
+ * Return true if conversion was successful
+ *
+ * Return false if:
+ * - the property does not exist
+ * - is not an array of size 16
+ */
bool bc_get_property_matrix(Bone *bone, std::string key, float mat[4][4])
{
IDProperty *property = bc_get_IDProperty(bone, key);
@@ -795,8 +796,8 @@ bool bc_get_property_matrix(Bone *bone, std::string key, float mat[4][4])
}
/**
-* get a vector that is stored in 3 custom properties (used in Blender <= 2.78)
-*/
+ * get a vector that is stored in 3 custom properties (used in Blender <= 2.78)
+ */
void bc_get_property_vector(Bone *bone, std::string key, float val[3], const float def[3])
{
val[0] = bc_get_property(bone, key + "_x", def[0]);
@@ -805,8 +806,8 @@ void bc_get_property_vector(Bone *bone, std::string key, float val[3], const flo
}
/**
-* Check if vector exist stored in 3 custom properties (used in Blender <= 2.78)
-*/
+ * Check if vector exist stored in 3 custom properties (used in Blender <= 2.78)
+ */
static bool has_custom_props(Bone *bone, bool enabled, std::string key)
{
if (!enabled)
@@ -819,11 +820,11 @@ static bool has_custom_props(Bone *bone, bool enabled, std::string key)
}
/**
-* Check if custom information about bind matrix exists and modify the from_mat
-* accordingly.
-*
-* Note: This is old style for Blender <= 2.78 only kept for compatibility
-*/
+ * Check if custom information about bind matrix exists and modify the from_mat
+ * accordingly.
+ *
+ * Note: This is old style for Blender <= 2.78 only kept for compatibility
+ */
void bc_create_restpose_mat(const ExportSettings *export_settings, Bone *bone, float to_mat[4][4], float from_mat[4][4], bool use_local_space)
{
float loc[3];
@@ -877,8 +878,8 @@ void bc_create_restpose_mat(const ExportSettings *export_settings, Bone *bone, f
}
/*
- Make 4*4 matrices better readable
-*/
+ * Make 4*4 matrices better readable
+ */
void bc_sanitize_mat(float mat[4][4], int precision)
{
for (int i = 0; i < 4; i++)
@@ -908,7 +909,7 @@ void bc_copy_farray_m4(float *r, float a[4][4])
}
-/*
+/**
* Returns name of Active UV Layer or empty String if no active UV Layer defined
*/
std::string bc_get_active_uvlayer_name(Mesh *me)
@@ -923,17 +924,17 @@ std::string bc_get_active_uvlayer_name(Mesh *me)
return "";
}
-/*
-* Returns name of Active UV Layer or empty String if no active UV Layer defined.
-* Assuming the Object is of type MESH
-*/
+/**
+ * Returns name of Active UV Layer or empty String if no active UV Layer defined.
+ * Assuming the Object is of type MESH
+ */
std::string bc_get_active_uvlayer_name(Object *ob)
{
Mesh *me = (Mesh *)ob->data;
return bc_get_active_uvlayer_name(me);
}
-/*
+/**
* Returns UV Layer name or empty string if layer index is out of range
*/
std::string bc_get_uvlayer_name(Mesh *me, int layer)
diff --git a/source/blender/collada/collada_utils.h b/source/blender/collada/collada_utils.h
index 89a5379d3c7..001a2f5fe1b 100644
--- a/source/blender/collada/collada_utils.h
+++ b/source/blender/collada/collada_utils.h
@@ -184,16 +184,16 @@ public:
};
/* a map to store bone extension maps
-| std:string : an armature name
-| BoneExtended * : a map that contains extra data for bones
-*/
+ * std:string : an armature name
+ * BoneExtended * : a map that contains extra data for bones
+ */
typedef std::map<std::string, BoneExtended *> BoneExtensionMap;
/*
-| A class to organise bone extendion data for multiple Armatures.
-| this is needed for the case where a Collada file contains 2 or more
-| separate armatures.
-*/
+ * A class to organise bone extendion data for multiple Armatures.
+ * this is needed for the case where a Collada file contains 2 or more
+ * separate armatures.
+ */
class BoneExtensionManager {
private:
std::map<std::string, BoneExtensionMap *> extended_bone_maps;
diff --git a/source/blender/compositor/COM_compositor.h b/source/blender/compositor/COM_compositor.h
index 10b62070978..f9fd0999acc 100644
--- a/source/blender/compositor/COM_compositor.h
+++ b/source/blender/compositor/COM_compositor.h
@@ -31,26 +31,26 @@ extern "C" {
#include "DNA_node_types.h"
/**
- * @defgroup Model The data model of the compositor
- * @defgroup Memory The memory management stuff
- * @defgroup Execution The execution logic
- * @defgroup Conversion Conversion logic
- * @defgroup Node All nodes of the compositor
- * @defgroup Operation All operations of the compositor
+ * \defgroup Model The data model of the compositor
+ * \defgroup Memory The memory management stuff
+ * \defgroup Execution The execution logic
+ * \defgroup Conversion Conversion logic
+ * \defgroup Node All nodes of the compositor
+ * \defgroup Operation All operations of the compositor
*
- * @page Introduction of the Blender Compositor
+ * \page Introduction of the Blender Compositor
*
- * @section bcomp Blender compositor
+ * \section bcomp Blender compositor
* This project redesigns the internals of Blender's compositor. The project has been executed in 2011 by At Mind.
* At Mind is a technology company located in Amsterdam, The Netherlands.
* The project has been crowd-funded. This code has been released under GPL2 to be used in Blender.
*
- * @section goals The goals of the project
+ * \section goals The goals of the project
* the new compositor has 2 goals.
* - Make a faster compositor (speed of calculation)
* - Make the compositor work faster for you (workflow)
*
- * @section speed Faster compositor
+ * \section speed Faster compositor
* The speedup has been done by making better use of the hardware Blenders is working on. The previous compositor only
* used a single threaded model to calculate a node. The only exception to this is the Defocus node.
* Only when it is possible to calculate two full nodes in parallel a second thread was used.
@@ -59,27 +59,27 @@ extern "C" {
* In the new compositor we want to use as much of threads as possible. Even new OpenCL capable GPU-hardware can be
* used for calculation.
*
- * @section workflow Work faster
+ * \section workflow Work faster
* The previous compositor only showed the final image. The compositor could wait a long time before seeing the result
* of his work. The new compositor will work in a way that it will focus on getting information back to the user.
* It will prioritize its work to get earlier user feedback.
*
- * @page memory Memory model
+ * \page memory Memory model
* The main issue is the type of memory model to use. Blender is used by consumers and professionals.
* Ranging from low-end machines to very high-end machines.
* The system should work on high-end machines and on low-end machines.
*
*
- * @page executing Executing
- * @section prepare Prepare execution
+ * \page executing Executing
+ * \section prepare Prepare execution
*
* during the preparation of the execution All ReadBufferOperation will receive an offset.
* This offset is used during execution as an optimization trick
- * Next all operations will be initialized for execution @see NodeOperation.initExecution
- * Next all ExecutionGroup's will be initialized for execution @see ExecutionGroup.initExecution
- * this all is controlled from @see ExecutionSystem.execute
+ * Next all operations will be initialized for execution \see NodeOperation.initExecution
+ * Next all ExecutionGroup's will be initialized for execution \see ExecutionGroup.initExecution
+ * this all is controlled from \see ExecutionSystem.execute
*
- * @section priority Render priority
+ * \section priority Render priority
* Render priority is an priority of an output node. A user has a different need of Render priorities of output nodes
* than during editing.
* for example. the Active ViewerNode has top priority during editing, but during rendering a CompositeNode has.
@@ -88,11 +88,11 @@ extern "C" {
* priority do match.
* When match the ExecutionGroup will be executed (this happens in serial)
*
- * @see ExecutionSystem.execute control of the Render priority
- * @see NodeOperation.getRenderPriority receive the render priority
- * @see ExecutionGroup.execute the main loop to execute a whole ExecutionGroup
+ * \see ExecutionSystem.execute control of the Render priority
+ * \see NodeOperation.getRenderPriority receive the render priority
+ * \see ExecutionGroup.execute the main loop to execute a whole ExecutionGroup
*
- * @section order Chunk order
+ * \section order Chunk order
*
* When a ExecutionGroup is executed, first the order of chunks are determined.
* The settings are stored in the ViewerNode inside the ExecutionGroup. ExecutionGroups that have no viewer-node,
@@ -109,11 +109,11 @@ extern "C" {
* - [@ref ChunkExecutionState.COM_ES_SCHEDULED]: All dependencies are met, chunk is scheduled, but not finished
* - [@ref ChunkExecutionState.COM_ES_EXECUTED]: Chunk is finished
*
- * @see ExecutionGroup.execute
- * @see ViewerOperation.getChunkOrder
- * @see OrderOfChunks
+ * \see ExecutionGroup.execute
+ * \see ViewerOperation.getChunkOrder
+ * \see OrderOfChunks
*
- * @section interest Area of interest
+ * \section interest Area of interest
* An ExecutionGroup can have dependencies to other ExecutionGroup's. Data passing from one ExecutionGroup to another
* one are stored in 'chunks'.
* If not all input chunks are available the chunk execution will not be scheduled.
@@ -206,40 +206,40 @@ extern "C" {
*
* </pre>
*
- * @see ExecutionGroup.execute Execute a complete ExecutionGroup. Halts until finished or breaked by user
- * @see ExecutionGroup.scheduleChunkWhenPossible Tries to schedule a single chunk,
+ * \see ExecutionGroup.execute Execute a complete ExecutionGroup. Halts until finished or breaked by user
+ * \see ExecutionGroup.scheduleChunkWhenPossible Tries to schedule a single chunk,
* checks if all input data is available. Can trigger dependent chunks to be calculated
- * @see ExecutionGroup.scheduleAreaWhenPossible Tries to schedule an area. This can be multiple chunks
+ * \see ExecutionGroup.scheduleAreaWhenPossible Tries to schedule an area. This can be multiple chunks
* (is called from [@ref ExecutionGroup.scheduleChunkWhenPossible])
- * @see ExecutionGroup.scheduleChunk Schedule a chunk on the WorkScheduler
- * @see NodeOperation.determineDependingAreaOfInterest Influence the area of interest of a chunk.
- * @see WriteBufferOperation Operation to write to a MemoryProxy/MemoryBuffer
- * @see ReadBufferOperation Operation to read from a MemoryProxy/MemoryBuffer
- * @see MemoryProxy proxy for information about memory image (a image consist out of multiple chunks)
- * @see MemoryBuffer Allocated memory for a single chunk
- *
- * @section workscheduler WorkScheduler
+ * \see ExecutionGroup.scheduleChunk Schedule a chunk on the WorkScheduler
+ * \see NodeOperation.determineDependingAreaOfInterest Influence the area of interest of a chunk.
+ * \see WriteBufferOperation Operation to write to a MemoryProxy/MemoryBuffer
+ * \see ReadBufferOperation Operation to read from a MemoryProxy/MemoryBuffer
+ * \see MemoryProxy proxy for information about memory image (a image consist out of multiple chunks)
+ * \see MemoryBuffer Allocated memory for a single chunk
+ *
+ * \section workscheduler WorkScheduler
* the WorkScheduler is implemented as a static class. the responsibility of the WorkScheduler is to balance
* WorkPackages to the available and free devices.
* the work-scheduler can work in 2 states. For witching these between the state you need to recompile blender
*
- * @subsection multithread Multi threaded
+ * \subsection multithread Multi threaded
* Default the work-scheduler will place all work as WorkPackage in a queue.
* For every CPUcore a working thread is created. These working threads will ask the WorkScheduler if there is work
* for a specific Device.
* the work-scheduler will find work for the device and the device will be asked to execute the WorkPackage
*
- * @subsection singlethread Single threaded
+ * \subsection singlethread Single threaded
* For debugging reasons the multi-threading can be disabled. This is done by changing the COM_CURRENT_THREADING_MODEL
* to COM_TM_NOTHREAD. When compiling the work-scheduler
* will be changes to support no threading and run everything on the CPU.
*
- * @section devices Devices
+ * \section devices Devices
* A Device within the compositor context is a Hardware component that can used to calculate chunks.
* This chunk is encapsulated in a WorkPackage.
* the WorkScheduler controls the devices and selects the device where a WorkPackage will be calculated.
*
- * @subsection WS_Devices Workscheduler
+ * \subsection WS_Devices Workscheduler
* The WorkScheduler controls all Devices. When initializing the compositor the WorkScheduler selects
* all devices that will be used during compositor.
* There are two types of Devices, CPUDevice and OpenCLDevice.
@@ -251,63 +251,63 @@ extern "C" {
*
* A thread will read the work-list and sends a workpackage to its device.
*
- * @see WorkScheduler.schedule method that is called to schedule a chunk
- * @see Device.execute method called to execute a chunk
+ * \see WorkScheduler.schedule method that is called to schedule a chunk
+ * \see Device.execute method called to execute a chunk
*
- * @subsection CPUDevice CPUDevice
+ * \subsection CPUDevice CPUDevice
* When a CPUDevice gets a WorkPackage the Device will get the inputbuffer that is needed to calculate the chunk.
* Allocation is already done by the ExecutionGroup.
* The outputbuffer of the chunk is being created.
* The OutputOperation of the ExecutionGroup is called to execute the area of the outputbuffer.
*
- * @see ExecutionGroup
- * @see NodeOperation.executeRegion executes a single chunk of a NodeOperation
- * @see CPUDevice.execute
+ * \see ExecutionGroup
+ * \see NodeOperation.executeRegion executes a single chunk of a NodeOperation
+ * \see CPUDevice.execute
*
- * @subsection GPUDevice OpenCLDevice
+ * \subsection GPUDevice OpenCLDevice
*
* To be completed!
- * @see NodeOperation.executeOpenCLRegion
- * @see OpenCLDevice.execute
+ * \see NodeOperation.executeOpenCLRegion
+ * \see OpenCLDevice.execute
*
- * @section executePixel executing a pixel
+ * \section executePixel executing a pixel
* Finally the last step, the node functionality :)
*
- * @page newnode Creating new nodes
+ * \page newnode Creating new nodes
*/
/**
- * @brief The main method that is used to execute the compositor tree.
+ * \brief The main method that is used to execute the compositor tree.
* It can be executed during editing (blenkernel/node.c) or rendering
* (renderer/pipeline.c)
*
- * @param rd [struct RenderData]
+ * \param rd [struct RenderData]
* Render data for this composite, this won't always belong to a scene.
*
- * @param editingtree [struct bNodeTree]
+ * \param editingtree [struct bNodeTree]
* reference to the compositor editing tree
*
- * @param rendering [true false]
+ * \param rendering [true false]
* This parameter determines whether the function is called from rendering (true) or editing (false).
* based on this setting the system will work differently:
* - during rendering only Composite & the File output node will be calculated
- * @see NodeOperation.isOutputProgram(int rendering) of the specific operations
+ * \see NodeOperation.isOutputProgram(int rendering) of the specific operations
*
* - during editing all output nodes will be calculated
- * @see NodeOperation.isOutputProgram(int rendering) of the specific operations
+ * \see NodeOperation.isOutputProgram(int rendering) of the specific operations
*
* - another quality setting can be used bNodeTree. The quality is determined by the bNodeTree fields.
* quality can be modified by the user from within the node panels.
- * @see bNodeTree.edit_quality
- * @see bNodeTree.render_quality
+ * \see bNodeTree.edit_quality
+ * \see bNodeTree.render_quality
*
* - output nodes can have different priorities in the WorkScheduler.
* This is implemented in the COM_execute function.
*
- * @param viewSettings
+ * \param viewSettings
* reference to view settings used for color management
*
- * @param displaySettings
+ * \param displaySettings
* reference to display settings used for color management
*
* OCIO_TODO: this options only used in rare cases, namely in output file node,
@@ -320,13 +320,13 @@ void COM_execute(RenderData *rd, Scene *scene, bNodeTree *editingtree, int rende
const char *viewName);
/**
- * @brief Deinitialize the compositor caches and allocated memory.
+ * \brief Deinitialize the compositor caches and allocated memory.
* Use COM_clearCaches to only free the caches.
*/
void COM_deinitialize(void);
/**
- * @brief Clear all compositor caches. (Compositor system will still remain available).
+ * \brief Clear all compositor caches. (Compositor system will still remain available).
* To deinitialize the compositor use the COM_deinitialize method.
*/
// void COM_clearCaches(void); // NOT YET WRITTEN
diff --git a/source/blender/compositor/COM_defines.h b/source/blender/compositor/COM_defines.h
index 67b7f9b592b..c8e924da6a2 100644
--- a/source/blender/compositor/COM_defines.h
+++ b/source/blender/compositor/COM_defines.h
@@ -24,42 +24,42 @@
#define __COM_DEFINES_H__
/**
- * @brief possible data types for sockets
- * @ingroup Model
+ * \brief possible data types for sockets
+ * \ingroup Model
*/
typedef enum DataType {
- /** @brief Value data type */
+ /** \brief Value data type */
COM_DT_VALUE = 1,
- /** @brief Vector data type */
+ /** \brief Vector data type */
COM_DT_VECTOR = 2,
- /** @brief Color data type */
+ /** \brief Color data type */
COM_DT_COLOR = 4
} DataType;
/**
- * @brief Possible quality settings
- * @see CompositorContext.quality
- * @ingroup Execution
+ * \brief Possible quality settings
+ * \see CompositorContext.quality
+ * \ingroup Execution
*/
typedef enum CompositorQuality {
- /** @brief High quality setting */
+ /** \brief High quality setting */
COM_QUALITY_HIGH = 0,
- /** @brief Medium quality setting */
+ /** \brief Medium quality setting */
COM_QUALITY_MEDIUM = 1,
- /** @brief Low quality setting */
+ /** \brief Low quality setting */
COM_QUALITY_LOW = 2
} CompositorQuality;
/**
- * @brief Possible priority settings
- * @ingroup Execution
+ * \brief Possible priority settings
+ * \ingroup Execution
*/
typedef enum CompositorPriority {
- /** @brief High quality setting */
+ /** \brief High quality setting */
COM_PRIORITY_HIGH = 2,
- /** @brief Medium quality setting */
+ /** \brief Medium quality setting */
COM_PRIORITY_MEDIUM = 1,
- /** @brief Low quality setting */
+ /** \brief Low quality setting */
COM_PRIORITY_LOW = 0
} CompositorPriority;
@@ -87,17 +87,17 @@ typedef enum CompositorPriority {
#define COM_CURRENT_THREADING_MODEL COM_TM_QUEUE
// chunk order
/**
- * @brief The order of chunks to be scheduled
- * @ingroup Execution
+ * \brief The order of chunks to be scheduled
+ * \ingroup Execution
*/
typedef enum OrderOfChunks {
- /** @brief order from a distance to centerX/centerY */
+ /** \brief order from a distance to centerX/centerY */
COM_TO_CENTER_OUT = 0,
- /** @brief order randomly */
+ /** \brief order randomly */
COM_TO_RANDOM = 1,
- /** @brief no ordering */
+ /** \brief no ordering */
COM_TO_TOP_DOWN = 2,
- /** @brief experimental ordering with 9 hotspots */
+ /** \brief experimental ordering with 9 hotspots */
COM_TO_RULE_OF_THIRDS = 3
} OrderOfChunks;
diff --git a/source/blender/compositor/intern/COM_CPUDevice.h b/source/blender/compositor/intern/COM_CPUDevice.h
index b938b5fc588..8d4d5f1c324 100644
--- a/source/blender/compositor/intern/COM_CPUDevice.h
+++ b/source/blender/compositor/intern/COM_CPUDevice.h
@@ -26,16 +26,16 @@
#include "COM_Device.h"
/**
- * @brief class representing a CPU device.
- * @note for every hardware thread in the system a CPUDevice instance will exist in the workscheduler
+ * \brief class representing a CPU device.
+ * \note for every hardware thread in the system a CPUDevice instance will exist in the workscheduler
*/
class CPUDevice : public Device {
public:
CPUDevice(int thread_id);
/**
- * @brief execute a WorkPackage
- * @param work the WorkPackage to execute
+ * \brief execute a WorkPackage
+ * \param work the WorkPackage to execute
*/
void execute(WorkPackage *work);
diff --git a/source/blender/compositor/intern/COM_CompositorContext.cpp b/source/blender/compositor/intern/COM_CompositorContext.cpp
index 5d6497f147f..8574a9ee6f0 100644
--- a/source/blender/compositor/intern/COM_CompositorContext.cpp
+++ b/source/blender/compositor/intern/COM_CompositorContext.cpp
@@ -35,7 +35,7 @@ CompositorContext::CompositorContext()
this->m_displaySettings = NULL;
}
-const int CompositorContext::getFramenumber() const
+int CompositorContext::getFramenumber() const
{
if (this->m_rd) {
return this->m_rd->cfra;
diff --git a/source/blender/compositor/intern/COM_CompositorContext.h b/source/blender/compositor/intern/COM_CompositorContext.h
index b43e163870c..6b153ff0161 100644
--- a/source/blender/compositor/intern/COM_CompositorContext.h
+++ b/source/blender/compositor/intern/COM_CompositorContext.h
@@ -32,98 +32,98 @@
#include "COM_defines.h"
/**
- * @brief Overall context of the compositor
+ * \brief Overall context of the compositor
*/
class CompositorContext {
private:
/**
- * @brief The rendering field describes if we are rendering (F12) or if we are editing (Node editor)
+ * \brief The rendering field describes if we are rendering (F12) or if we are editing (Node editor)
* This field is initialized in ExecutionSystem and must only be read from that point on.
- * @see ExecutionSystem
+ * \see ExecutionSystem
*/
bool m_rendering;
/**
- * @brief The quality of the composite.
+ * \brief The quality of the composite.
* This field is initialized in ExecutionSystem and must only be read from that point on.
- * @see ExecutionSystem
+ * \see ExecutionSystem
*/
CompositorQuality m_quality;
Scene *m_scene;
/**
- * @brief Reference to the render data that is being composited.
+ * \brief Reference to the render data that is being composited.
* This field is initialized in ExecutionSystem and must only be read from that point on.
- * @see ExecutionSystem
+ * \see ExecutionSystem
*/
RenderData *m_rd;
/**
- * @brief reference to the bNodeTree
+ * \brief reference to the bNodeTree
* This field is initialized in ExecutionSystem and must only be read from that point on.
- * @see ExecutionSystem
+ * \see ExecutionSystem
*/
bNodeTree *m_bnodetree;
/**
- * @brief Preview image hash table
+ * \brief Preview image hash table
* This field is initialized in ExecutionSystem and must only be read from that point on.
*/
bNodeInstanceHash *m_previews;
/**
- * @brief does this system have active opencl devices?
+ * \brief does this system have active opencl devices?
*/
bool m_hasActiveOpenCLDevices;
/**
- * @brief Skip slow nodes
+ * \brief Skip slow nodes
*/
bool m_fastCalculation;
- /* @brief color management settings */
+ /* \brief color management settings */
const ColorManagedViewSettings *m_viewSettings;
const ColorManagedDisplaySettings *m_displaySettings;
/**
- * @brief active rendering view name
+ * \brief active rendering view name
*/
const char *m_viewName;
public:
/**
- * @brief constructor initializes the context with default values.
+ * \brief constructor initializes the context with default values.
*/
CompositorContext();
/**
- * @brief set the rendering field of the context
+ * \brief set the rendering field of the context
*/
void setRendering(bool rendering) { this->m_rendering = rendering; }
/**
- * @brief get the rendering field of the context
+ * \brief get the rendering field of the context
*/
bool isRendering() const { return this->m_rendering; }
/**
- * @brief set the scene of the context
+ * \brief set the scene of the context
*/
void setRenderData(RenderData *rd) { this->m_rd = rd; }
/**
- * @brief set the bnodetree of the context
+ * \brief set the bnodetree of the context
*/
void setbNodeTree(bNodeTree *bnodetree) { this->m_bnodetree = bnodetree; }
/**
- * @brief get the bnodetree of the context
+ * \brief get the bnodetree of the context
*/
const bNodeTree *getbNodeTree() const { return this->m_bnodetree; }
/**
- * @brief get the scene of the context
+ * \brief get the scene of the context
*/
const RenderData *getRenderData() const { return this->m_rd; }
@@ -131,67 +131,67 @@ public:
Scene *getScene() const { return m_scene; }
/**
- * @brief set the preview image hash table
+ * \brief set the preview image hash table
*/
void setPreviewHash(bNodeInstanceHash *previews) { this->m_previews = previews; }
/**
- * @brief get the preview image hash table
+ * \brief get the preview image hash table
*/
bNodeInstanceHash *getPreviewHash() const { return this->m_previews; }
/**
- * @brief set view settings of color color management
+ * \brief set view settings of color color management
*/
void setViewSettings(const ColorManagedViewSettings *viewSettings) { this->m_viewSettings = viewSettings; }
/**
- * @brief get view settings of color color management
+ * \brief get view settings of color color management
*/
const ColorManagedViewSettings *getViewSettings() const { return this->m_viewSettings; }
/**
- * @brief set display settings of color color management
+ * \brief set display settings of color color management
*/
void setDisplaySettings(const ColorManagedDisplaySettings *displaySettings) { this->m_displaySettings = displaySettings; }
/**
- * @brief get display settings of color color management
+ * \brief get display settings of color color management
*/
const ColorManagedDisplaySettings *getDisplaySettings() const { return this->m_displaySettings; }
/**
- * @brief set the quality
+ * \brief set the quality
*/
void setQuality(CompositorQuality quality) { this->m_quality = quality; }
/**
- * @brief get the quality
+ * \brief get the quality
*/
- const CompositorQuality getQuality() const { return this->m_quality; }
+ CompositorQuality getQuality() const { return this->m_quality; }
/**
- * @brief get the current framenumber of the scene in this context
+ * \brief get the current framenumber of the scene in this context
*/
- const int getFramenumber() const;
+ int getFramenumber() const;
/**
- * @brief has this system active openclDevices?
+ * \brief has this system active openclDevices?
*/
- const bool getHasActiveOpenCLDevices() const { return this->m_hasActiveOpenCLDevices; }
+ bool getHasActiveOpenCLDevices() const { return this->m_hasActiveOpenCLDevices; }
/**
- * @brief set has this system active openclDevices?
+ * \brief set has this system active openclDevices?
*/
void setHasActiveOpenCLDevices(bool hasAvtiveOpenCLDevices) { this->m_hasActiveOpenCLDevices = hasAvtiveOpenCLDevices; }
/**
- * @brief get the active rendering view
+ * \brief get the active rendering view
*/
const char *getViewName() const { return this->m_viewName; }
/**
- * @brief set the active rendering view
+ * \brief set the active rendering view
*/
void setViewName(const char *viewName) { this->m_viewName = viewName; }
diff --git a/source/blender/compositor/intern/COM_Converter.cpp b/source/blender/compositor/intern/COM_Converter.cpp
index c9181905908..bc41be24e71 100644
--- a/source/blender/compositor/intern/COM_Converter.cpp
+++ b/source/blender/compositor/intern/COM_Converter.cpp
@@ -394,7 +394,7 @@ Node *Converter::convert(bNode *b_node)
case CMP_NODE_TRACKPOS:
node = new TrackPositionNode(b_node);
break;
- /* not inplemented yet */
+ /* not implemented yet */
case CMP_NODE_PIXELATE:
node = new PixelateNode(b_node);
break;
diff --git a/source/blender/compositor/intern/COM_Converter.h b/source/blender/compositor/intern/COM_Converter.h
index d0b888e24a0..05d23eb3e7e 100644
--- a/source/blender/compositor/intern/COM_Converter.h
+++ b/source/blender/compositor/intern/COM_Converter.h
@@ -36,48 +36,48 @@ class NodeOperationOutput;
class NodeOperationBuilder;
/**
- * @brief Conversion methods for the compositor
+ * \brief Conversion methods for the compositor
*/
class Converter {
public:
/**
- * @brief Convert/wraps a bNode in its Node instance.
+ * \brief Convert/wraps a bNode in its Node instance.
*
* For all nodetypes a wrapper class is created.
*
- * @note When adding a new node to blender, this method needs to be changed to return the correct Node instance.
+ * \note When adding a new node to blender, this method needs to be changed to return the correct Node instance.
*
- * @see Node
+ * \see Node
*/
static Node *convert(bNode *b_node);
/**
- * @brief True if the node is considered 'fast'.
+ * \brief True if the node is considered 'fast'.
*
* Slow nodes will be skipped if fast execution is required.
*/
static bool is_fast_node(bNode *b_node);
/**
- * @brief This method will add a datetype conversion rule when the to-socket does not support the from-socket actual data type.
+ * \brief This method will add a datetype conversion rule when the to-socket does not support the from-socket actual data type.
*
- * @note this method is called when conversion is needed.
+ * \note this method is called when conversion is needed.
*
- * @param link the NodeLink what needs conversion
- * @param system the ExecutionSystem to add the conversion to.
- * @see NodeLink - a link between two sockets
+ * \param link the NodeLink what needs conversion
+ * \param system the ExecutionSystem to add the conversion to.
+ * \see NodeLink - a link between two sockets
*/
static NodeOperation *convertDataType(NodeOperationOutput *from, NodeOperationInput *to);
/**
- * @brief This method will add a resolution rule based on the settings of the NodeInput.
+ * \brief This method will add a resolution rule based on the settings of the NodeInput.
*
- * @note Conversion logic is implemented in this method
- * @see InputSocketResizeMode for the possible conversions.
+ * \note Conversion logic is implemented in this method
+ * \see InputSocketResizeMode for the possible conversions.
*
- * @param link the NodeLink what needs conversion
- * @param system the ExecutionSystem to add the conversion to.
- * @see NodeLink - a link between two sockets
+ * \param link the NodeLink what needs conversion
+ * \param system the ExecutionSystem to add the conversion to.
+ * \see NodeLink - a link between two sockets
*/
static void convertResolution(NodeOperationBuilder &builder, NodeOperationOutput *fromSocket, NodeOperationInput *toSocket);
diff --git a/source/blender/compositor/intern/COM_Device.h b/source/blender/compositor/intern/COM_Device.h
index 202ca1d0b4f..8cb1cbebf7f 100644
--- a/source/blender/compositor/intern/COM_Device.h
+++ b/source/blender/compositor/intern/COM_Device.h
@@ -26,7 +26,7 @@
#include "COM_WorkPackage.h"
/**
- * @brief Abstract class for device implementations to be used by the Compositor.
+ * \brief Abstract class for device implementations to be used by the Compositor.
* devices are queried, initialized and used by the WorkScheduler.
* work are packaged as a WorkPackage instance.
*/
@@ -34,24 +34,24 @@ class Device {
public:
/**
- * @brief Declaration of the virtual destructor
- * @note resolve warning gcc 4.7
+ * \brief Declaration of the virtual destructor
+ * \note resolve warning gcc 4.7
*/
virtual ~Device() {}
/**
- * @brief initialize the device
+ * \brief initialize the device
*/
virtual bool initialize() { return true; }
/**
- * @brief deinitialize the device
+ * \brief deinitialize the device
*/
virtual void deinitialize() {}
/**
- * @brief execute a WorkPackage
- * @param work the WorkPackage to execute
+ * \brief execute a WorkPackage
+ * \param work the WorkPackage to execute
*/
virtual void execute(WorkPackage *work) = 0;
diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.cpp b/source/blender/compositor/intern/COM_ExecutionGroup.cpp
index 5a651f07868..603254baba2 100644
--- a/source/blender/compositor/intern/COM_ExecutionGroup.cpp
+++ b/source/blender/compositor/intern/COM_ExecutionGroup.cpp
@@ -185,9 +185,9 @@ void ExecutionGroup::execute(ExecutionSystem *graph)
{
const CompositorContext &context = graph->getContext();
const bNodeTree *bTree = context.getbNodeTree();
- if (this->m_width == 0 || this->m_height == 0) {return; } /// @note: break out... no pixels to calculate.
- if (bTree->test_break && bTree->test_break(bTree->tbh)) {return; } /// @note: early break out for blur and preview nodes
- if (this->m_numberOfChunks == 0) {return; } /// @note: early break out
+ if (this->m_width == 0 || this->m_height == 0) {return; } /// \note: break out... no pixels to calculate.
+ if (bTree->test_break && bTree->test_break(bTree->tbh)) {return; } /// \note: early break out for blur and preview nodes
+ if (this->m_numberOfChunks == 0) {return; } /// \note: early break out
unsigned int chunkNumber;
this->m_executionStartTime = PIL_check_seconds_timer();
@@ -437,7 +437,7 @@ void ExecutionGroup::determineChunkRect(rcti *rect, const unsigned int chunkNumb
MemoryBuffer *ExecutionGroup::allocateOutputBuffer(int /*chunkNumber*/,
rcti *rect)
{
- // we asume that this method is only called from complex execution groups.
+ // we assume that this method is only called from complex execution groups.
NodeOperation *operation = this->getOutputOperation();
if (operation->isWriteBufferOperation()) {
WriteBufferOperation *writeOperation = (WriteBufferOperation *)operation;
diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.h b/source/blender/compositor/intern/COM_ExecutionGroup.h
index 88c702b8477..2c79b2ba0a4 100644
--- a/source/blender/compositor/intern/COM_ExecutionGroup.h
+++ b/source/blender/compositor/intern/COM_ExecutionGroup.h
@@ -39,28 +39,28 @@ class ReadBufferOperation;
class Device;
/**
- * @brief the execution state of a chunk in an ExecutionGroup
- * @ingroup Execution
+ * \brief the execution state of a chunk in an ExecutionGroup
+ * \ingroup Execution
*/
typedef enum ChunkExecutionState {
/**
- * @brief chunk is not yet scheduled
+ * \brief chunk is not yet scheduled
*/
COM_ES_NOT_SCHEDULED = 0,
/**
- * @brief chunk is scheduled, but not yet executed
+ * \brief chunk is scheduled, but not yet executed
*/
COM_ES_SCHEDULED = 1,
/**
- * @brief chunk is executed.
+ * \brief chunk is executed.
*/
COM_ES_EXECUTED = 2
} ChunkExecutionState;
/**
- * @brief Class ExecutionGroup is a group of Operations that are executed as one.
+ * \brief Class ExecutionGroup is a group of Operations that are executed as one.
* This grouping is used to combine Operations that can be executed as one whole when multi-processing.
- * @ingroup Execution
+ * \ingroup Execution
*/
class ExecutionGroup {
public:
@@ -70,86 +70,86 @@ private:
// fields
/**
- * @brief list of operations in this ExecutionGroup
+ * \brief list of operations in this ExecutionGroup
*/
Operations m_operations;
/**
- * @brief is this ExecutionGroup an input ExecutionGroup
+ * \brief is this ExecutionGroup an input ExecutionGroup
* an input execution group is a group that is at the end of the calculation (the output is important for the user)
*/
int m_isOutput;
/**
- * @brief Width of the output
+ * \brief Width of the output
*/
unsigned int m_width;
/**
- * @brief Height of the output
+ * \brief Height of the output
*/
unsigned int m_height;
/**
- * @brief size of a single chunk, being Width or of height
+ * \brief size of a single chunk, being Width or of height
* a chunk is always a square, except at the edges of the MemoryBuffer
*/
unsigned int m_chunkSize;
/**
- * @brief number of chunks in the x-axis
+ * \brief number of chunks in the x-axis
*/
unsigned int m_numberOfXChunks;
/**
- * @brief number of chunks in the y-axis
+ * \brief number of chunks in the y-axis
*/
unsigned int m_numberOfYChunks;
/**
- * @brief total number of chunks
+ * \brief total number of chunks
*/
unsigned int m_numberOfChunks;
/**
- * @brief contains this ExecutionGroup a complex NodeOperation.
+ * \brief contains this ExecutionGroup a complex NodeOperation.
*/
bool m_complex;
/**
- * @brief can this ExecutionGroup be scheduled on an OpenCLDevice
+ * \brief can this ExecutionGroup be scheduled on an OpenCLDevice
*/
bool m_openCL;
/**
- * @brief Is this Execution group SingleThreaded
+ * \brief Is this Execution group SingleThreaded
*/
bool m_singleThreaded;
/**
- * @brief what is the maximum number field of all ReadBufferOperation in this ExecutionGroup.
- * @note this is used to construct the MemoryBuffers that will be passed during execution.
+ * \brief what is the maximum number field of all ReadBufferOperation in this ExecutionGroup.
+ * \note this is used to construct the MemoryBuffers that will be passed during execution.
*/
unsigned int m_cachedMaxReadBufferOffset;
/**
- * @brief a cached vector of all read operations in the execution group.
+ * \brief a cached vector of all read operations in the execution group.
*/
Operations m_cachedReadOperations;
/**
- * @brief reference to the original bNodeTree, this field is only set for the 'top' execution group.
- * @note can only be used to call the callbacks for progress, status and break
+ * \brief reference to the original bNodeTree, this field is only set for the 'top' execution group.
+ * \note can only be used to call the callbacks for progress, status and break
*/
const bNodeTree *m_bTree;
/**
- * @brief total number of chunks that have been calculated for this ExecutionGroup
+ * \brief total number of chunks that have been calculated for this ExecutionGroup
*/
unsigned int m_chunksFinished;
/**
- * @brief the chunkExecutionStates holds per chunk the execution state. this state can be
+ * \brief the chunkExecutionStates holds per chunk the execution state. this state can be
* - COM_ES_NOT_SCHEDULED: not scheduled
* - COM_ES_SCHEDULED: scheduled
* - COM_ES_EXECUTED: executed
@@ -157,92 +157,92 @@ private:
ChunkExecutionState *m_chunkExecutionStates;
/**
- * @brief indicator when this ExecutionGroup has valid Operations in its vector for Execution
- * @note When building the ExecutionGroup Operations are added via recursion. First a WriteBufferOperations is added, then the
- * @note Operation containing the settings that is important for the ExecutiongGroup is added,
- * @note When this occurs, these settings are copied over from the node to the ExecutionGroup
- * @note and the Initialized flag is set to true.
- * @see complex
- * @see openCL
+ * \brief indicator when this ExecutionGroup has valid Operations in its vector for Execution
+ * \note When building the ExecutionGroup Operations are added via recursion. First a WriteBufferOperations is added, then the
+ * \note Operation containing the settings that is important for the ExecutiongGroup is added,
+ * \note When this occurs, these settings are copied over from the node to the ExecutionGroup
+ * \note and the Initialized flag is set to true.
+ * \see complex
+ * \see openCL
*/
bool m_initialized;
/**
- * @brief denotes boundary for border compositing
- * @note measured in pixel space
+ * \brief denotes boundary for border compositing
+ * \note measured in pixel space
*/
rcti m_viewerBorder;
/**
- * @brief start time of execution
+ * \brief start time of execution
*/
double m_executionStartTime;
// methods
/**
- * @brief check whether parameter operation can be added to the execution group
- * @param operation the operation to be added
+ * \brief check whether parameter operation can be added to the execution group
+ * \param operation the operation to be added
*/
bool canContainOperation(NodeOperation *operation);
/**
- * @brief calculate the actual chunk size of this execution group.
- * @note A chunk size is an unsigned int that is both the height and width of a chunk.
- * @note The chunk size will not be stored in the chunkSize field. This needs to be done
- * @note by the calling method.
+ * \brief calculate the actual chunk size of this execution group.
+ * \note A chunk size is an unsigned int that is both the height and width of a chunk.
+ * \note The chunk size will not be stored in the chunkSize field. This needs to be done
+ * \note by the calling method.
*/
unsigned int determineChunkSize();
/**
- * @brief Determine the rect (minx, maxx, miny, maxy) of a chunk at a position.
- * @note Only gives useful results ater the determination of the chunksize
- * @see determineChunkSize()
+ * \brief Determine the rect (minx, maxx, miny, maxy) of a chunk at a position.
+ * \note Only gives useful results ater the determination of the chunksize
+ * \see determineChunkSize()
*/
void determineChunkRect(rcti *rect, const unsigned int xChunk, const unsigned int yChunk) const;
/**
- * @brief determine the number of chunks, based on the chunkSize, width and height.
- * @note The result are stored in the fields numberOfChunks, numberOfXChunks, numberOfYChunks
+ * \brief determine the number of chunks, based on the chunkSize, width and height.
+ * \note The result are stored in the fields numberOfChunks, numberOfXChunks, numberOfYChunks
*/
void determineNumberOfChunks();
/**
- * @brief try to schedule a specific chunk.
- * @note scheduling succeeds when all input requirements are met and the chunks hasn't been scheduled yet.
- * @param graph
- * @param xChunk
- * @param yChunk
- * @return [true:false]
+ * \brief try to schedule a specific chunk.
+ * \note scheduling succeeds when all input requirements are met and the chunks hasn't been scheduled yet.
+ * \param graph
+ * \param xChunk
+ * \param yChunk
+ * \return [true:false]
* true: package(s) are scheduled
* false: scheduling is deferred (depending workpackages are scheduled)
*/
bool scheduleChunkWhenPossible(ExecutionSystem *graph, int xChunk, int yChunk);
/**
- * @brief try to schedule a specific area.
- * @note Check if a certain area is available, when not available this are will be checked.
- * @note This method is called from other ExecutionGroup's.
- * @param graph
- * @param rect
- * @return [true:false]
+ * \brief try to schedule a specific area.
+ * \note Check if a certain area is available, when not available this are will be checked.
+ * \note This method is called from other ExecutionGroup's.
+ * \param graph
+ * \param rect
+ * \return [true:false]
* true: package(s) are scheduled
* false: scheduling is deferred (depending workpackages are scheduled)
*/
bool scheduleAreaWhenPossible(ExecutionSystem *graph, rcti *rect);
/**
- * @brief add a chunk to the WorkScheduler.
- * @param chunknumber
+ * \brief add a chunk to the WorkScheduler.
+ * \param chunknumber
*/
bool scheduleChunk(unsigned int chunkNumber);
/**
- * @brief determine the area of interest of a certain input area
- * @note This method only evaluates a single ReadBufferOperation
- * @param input the input area
- * @param readOperation The ReadBufferOperation where the area needs to be evaluated
- * @param output the area needed of the ReadBufferOperation. Result
+ * \brief determine the area of interest of a certain input area
+ * \note This method only evaluates a single ReadBufferOperation
+ * \param input the input area
+ * \param readOperation The ReadBufferOperation where the area needs to be evaluated
+ * \param output the area needed of the ReadBufferOperation. Result
*/
void determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output);
@@ -253,116 +253,116 @@ public:
// methods
/**
- * @brief add an operation to this ExecutionGroup
- * @note this method will add input of the operations recursively
- * @note this method can create multiple ExecutionGroup's
- * @param system
- * @param operation
- * @return True if the operation was successfully added
+ * \brief add an operation to this ExecutionGroup
+ * \note this method will add input of the operations recursively
+ * \note this method can create multiple ExecutionGroup's
+ * \param system
+ * \param operation
+ * \return True if the operation was successfully added
*/
bool addOperation(NodeOperation *operation);
/**
- * @brief is this ExecutionGroup an output ExecutionGroup
- * @note An OutputExecution group are groups containing a
- * @note ViewerOperation, CompositeOperation, PreviewOperation.
- * @see NodeOperation.isOutputOperation
+ * \brief is this ExecutionGroup an output ExecutionGroup
+ * \note An OutputExecution group are groups containing a
+ * \note ViewerOperation, CompositeOperation, PreviewOperation.
+ * \see NodeOperation.isOutputOperation
*/
- const int isOutputExecutionGroup() const { return this->m_isOutput; }
+ int isOutputExecutionGroup() const { return this->m_isOutput; }
/**
- * @brief set whether this ExecutionGroup is an output
- * @param isOutput
+ * \brief set whether this ExecutionGroup is an output
+ * \param isOutput
*/
void setOutputExecutionGroup(int isOutput) { this->m_isOutput = isOutput; }
/**
- * @brief determine the resolution of this ExecutionGroup
- * @param resolution
+ * \brief determine the resolution of this ExecutionGroup
+ * \param resolution
*/
void determineResolution(unsigned int resolution[2]);
/**
- * @brief set the resolution of this executiongroup
- * @param resolution
+ * \brief set the resolution of this executiongroup
+ * \param resolution
*/
void setResolution(unsigned int resolution[2]) { this->m_width = resolution[0]; this->m_height = resolution[1]; }
/**
- * @brief get the width of this execution group
+ * \brief get the width of this execution group
*/
unsigned int getWidth() const { return m_width; }
/**
- * @brief get the height of this execution group
+ * \brief get the height of this execution group
*/
unsigned int getHeight() const { return m_height; }
/**
- * @brief does this ExecutionGroup contains a complex NodeOperation
+ * \brief does this ExecutionGroup contains a complex NodeOperation
*/
bool isComplex() const { return m_complex; }
/**
- * @brief get the output operation of this ExecutionGroup
- * @return NodeOperation *output operation
+ * \brief get the output operation of this ExecutionGroup
+ * \return NodeOperation *output operation
*/
NodeOperation *getOutputOperation() const;
/**
- * @brief compose multiple chunks into a single chunk
- * @return Memorybuffer *consolidated chunk
+ * \brief compose multiple chunks into a single chunk
+ * \return Memorybuffer *consolidated chunk
*/
MemoryBuffer *constructConsolidatedMemoryBuffer(MemoryProxy *memoryProxy, rcti *output);
/**
- * @brief initExecution is called just before the execution of the whole graph will be done.
- * @note The implementation will calculate the chunkSize of this execution group.
+ * \brief initExecution is called just before the execution of the whole graph will be done.
+ * \note The implementation will calculate the chunkSize of this execution group.
*/
void initExecution();
/**
- * @brief get all inputbuffers needed to calculate an chunk
- * @note all inputbuffers must be executed
- * @param chunkNumber the chunk to be calculated
- * @return (MemoryBuffer **) the inputbuffers
+ * \brief get all inputbuffers needed to calculate an chunk
+ * \note all inputbuffers must be executed
+ * \param chunkNumber the chunk to be calculated
+ * \return (MemoryBuffer **) the inputbuffers
*/
MemoryBuffer **getInputBuffersCPU();
/**
- * @brief get all inputbuffers needed to calculate an chunk
- * @note all inputbuffers must be executed
- * @param chunkNumber the chunk to be calculated
- * @return (MemoryBuffer **) the inputbuffers
+ * \brief get all inputbuffers needed to calculate an chunk
+ * \note all inputbuffers must be executed
+ * \param chunkNumber the chunk to be calculated
+ * \return (MemoryBuffer **) the inputbuffers
*/
MemoryBuffer **getInputBuffersOpenCL(int chunkNumber);
/**
- * @brief allocate the outputbuffer of a chunk
- * @param chunkNumber the number of the chunk in the ExecutionGroup
- * @param rect the rect of that chunk
- * @see determineChunkRect
+ * \brief allocate the outputbuffer of a chunk
+ * \param chunkNumber the number of the chunk in the ExecutionGroup
+ * \param rect the rect of that chunk
+ * \see determineChunkRect
*/
MemoryBuffer *allocateOutputBuffer(int chunkNumber, rcti *rect);
/**
- * @brief after a chunk is executed the needed resources can be freed or unlocked.
- * @param chunknumber
- * @param memorybuffers
+ * \brief after a chunk is executed the needed resources can be freed or unlocked.
+ * \param chunknumber
+ * \param memorybuffers
*/
void finalizeChunkExecution(int chunkNumber, MemoryBuffer **memoryBuffers);
/**
- * @brief deinitExecution is called just after execution the whole graph.
- * @note It will release all needed resources
+ * \brief deinitExecution is called just after execution the whole graph.
+ * \note It will release all needed resources
*/
void deinitExecution();
/**
- * @brief schedule an ExecutionGroup
- * @note this method will return when all chunks have been calculated, or the execution has breaked (by user)
+ * \brief schedule an ExecutionGroup
+ * \note this method will return when all chunks have been calculated, or the execution has breaked (by user)
*
* first the order of the chunks will be determined. This is determined by finding the ViewerOperation and get the relevant information from it.
* - ChunkOrdering
@@ -371,43 +371,43 @@ public:
*
* After determining the order of the chunks the chunks will be scheduled
*
- * @see ViewerOperation
- * @param system
+ * \see ViewerOperation
+ * \param system
*/
void execute(ExecutionSystem *system);
/**
- * @brief this method determines the MemoryProxy's where this execution group depends on.
- * @note After this method determineDependingAreaOfInterest can be called to determine
- * @note the area of the MemoryProxy.creator that has to be executed.
- * @param memoryProxies result
+ * \brief this method determines the MemoryProxy's where this execution group depends on.
+ * \note After this method determineDependingAreaOfInterest can be called to determine
+ * \note the area of the MemoryProxy.creator that has to be executed.
+ * \param memoryProxies result
*/
void determineDependingMemoryProxies(vector<MemoryProxy *> *memoryProxies);
/**
- * @brief Determine the rect (minx, maxx, miny, maxy) of a chunk.
- * @note Only gives useful results ater the determination of the chunksize
- * @see determineChunkSize()
+ * \brief Determine the rect (minx, maxx, miny, maxy) of a chunk.
+ * \note Only gives useful results ater the determination of the chunksize
+ * \see determineChunkSize()
*/
void determineChunkRect(rcti *rect, const unsigned int chunkNumber) const;
/**
- * @brief can this ExecutionGroup be scheduled on an OpenCLDevice
- * @see WorkScheduler.schedule
+ * \brief can this ExecutionGroup be scheduled on an OpenCLDevice
+ * \see WorkScheduler.schedule
*/
bool isOpenCL();
void setChunksize(int chunksize) { this->m_chunkSize = chunksize; }
/**
- * @brief get the Render priority of this ExecutionGroup
- * @see ExecutionSystem.execute
+ * \brief get the Render priority of this ExecutionGroup
+ * \see ExecutionSystem.execute
*/
CompositorPriority getRenderPriotrity();
/**
- * @brief set border for viewer operation
- * @note all the coordinates are assumed to be in normalized space
+ * \brief set border for viewer operation
+ * \note all the coordinates are assumed to be in normalized space
*/
void setViewerBorder(float xmin, float xmax, float ymin, float ymax);
diff --git a/source/blender/compositor/intern/COM_ExecutionSystem.h b/source/blender/compositor/intern/COM_ExecutionSystem.h
index 0990df31c55..5b0d36ebacd 100644
--- a/source/blender/compositor/intern/COM_ExecutionSystem.h
+++ b/source/blender/compositor/intern/COM_ExecutionSystem.h
@@ -33,23 +33,23 @@ class ExecutionGroup;
#include "COM_NodeOperation.h"
/**
- * @page execution Execution model
+ * \page execution Execution model
* In order to get to an efficient model for execution, several steps are being done. these steps are explained below.
*
- * @section EM_Step1 Step 1: translating blender node system to the new compsitor system
+ * \section EM_Step1 Step 1: translating blender node system to the new compsitor system
* Blenders node structure is based on C structs (DNA). These structs are not efficient in the new architecture.
* We want to use classes in order to simplify the system.
* during this step the blender node_tree is evaluated and converted to a CPP node system.
*
- * @see ExecutionSystem
- * @see Converter.convert
- * @see Node
+ * \see ExecutionSystem
+ * \see Converter.convert
+ * \see Node
*
- * @section EM_Step2 Step2: translating nodes to operations
+ * \section EM_Step2 Step2: translating nodes to operations
* Ungrouping the GroupNodes. Group nodes are node_tree's in node_tree's.
* The new system only supports a single level of node_tree. We will 'flatten' the system in a single level.
- * @see GroupNode
- * @see ExecutionSystemHelper.ungroup
+ * \see GroupNode
+ * \see ExecutionSystemHelper.ungroup
*
* Every node has the ability to convert itself to operations. The node itself is responsible to create a correct
* NodeOperation setup based on its internal settings.
@@ -59,11 +59,11 @@ class ExecutionGroup;
* based on the selected Mixtype a different operation will be used.
* for more information see the page about creating new Nodes. [@subpage newnode]
*
- * @see ExecutionSystem.convertToOperations
- * @see Node.convertToOperations
- * @see NodeOperation base class for all operations in the system
+ * \see ExecutionSystem.convertToOperations
+ * \see Node.convertToOperations
+ * \see NodeOperation base class for all operations in the system
*
- * @section EM_Step3 Step3: add additional conversions to the operation system
+ * \section EM_Step3 Step3: add additional conversions to the operation system
* - Data type conversions: the system has 3 data types COM_DT_VALUE, COM_DT_VECTOR, COM_DT_COLOR.
* The user can connect a Value socket to a color socket.
* As values are ordered differently than colors a conversion happens.
@@ -77,10 +77,10 @@ class ExecutionGroup;
* - [@ref InputSocketResizeMode.COM_SC_STRETCH]: The width and the height of both images are aligned
* - [@ref InputSocketResizeMode.COM_SC_NO_RESIZE]: bottom left of the images are aligned.
*
- * @see Converter.convertDataType Datatype conversions
- * @see Converter.convertResolution Image size conversions
+ * \see Converter.convertDataType Datatype conversions
+ * \see Converter.convertResolution Image size conversions
*
- * @section EM_Step4 Step4: group operations in executions groups
+ * \section EM_Step4 Step4: group operations in executions groups
* ExecutionGroup are groups of operations that are calculated as being one bigger operation.
* All operations will be part of an ExecutionGroup.
* Complex nodes will be added to separate groups. Between ExecutionGroup's the data will be stored in MemoryBuffers.
@@ -101,14 +101,14 @@ class ExecutionGroup;
* |cFAA | |cFAA | |cFAA | |cFAA |
* +------+ +------+ +-------+ +-------+
* </pre>
- * @see ExecutionSystem.groupOperations method doing this step
- * @see ExecutionSystem.addReadWriteBufferOperations
- * @see NodeOperation.isComplex
- * @see ExecutionGroup class representing the ExecutionGroup
+ * \see ExecutionSystem.groupOperations method doing this step
+ * \see ExecutionSystem.addReadWriteBufferOperations
+ * \see NodeOperation.isComplex
+ * \see ExecutionGroup class representing the ExecutionGroup
*/
/**
- * @brief the ExecutionSystem contains the whole compositor tree.
+ * \brief the ExecutionSystem contains the whole compositor tree.
*/
class ExecutionSystem {
public:
@@ -117,17 +117,17 @@ public:
private:
/**
- * @brief the context used during execution
+ * \brief the context used during execution
*/
CompositorContext m_context;
/**
- * @brief vector of operations
+ * \brief vector of operations
*/
Operations m_operations;
/**
- * @brief vector of groups
+ * \brief vector of groups
*/
Groups m_groups;
@@ -144,11 +144,11 @@ private: //methods
public:
/**
- * @brief Create a new ExecutionSystem and initialize it with the
+ * \brief Create a new ExecutionSystem and initialize it with the
* editingtree.
*
- * @param editingtree [bNodeTree *]
- * @param rendering [true false]
+ * \param editingtree [bNodeTree *]
+ * \param rendering [true false]
*/
ExecutionSystem(RenderData *rd, Scene *scene, bNodeTree *editingtree, bool rendering, bool fastcalculation,
const ColorManagedViewSettings *viewSettings, const ColorManagedDisplaySettings *displaySettings,
@@ -162,7 +162,7 @@ public:
void set_operations(const Operations &operations, const Groups &groups);
/**
- * @brief execute this system
+ * \brief execute this system
* - initialize the NodeOperation's and ExecutionGroup's
* - schedule the output ExecutionGroup's based on their priority
* - deinitialize the ExecutionGroup's and NodeOperation's
@@ -170,7 +170,7 @@ public:
void execute();
/**
- * @brief get the reference to the compositor context
+ * \brief get the reference to the compositor context
*/
const CompositorContext &getContext() const { return this->m_context; }
diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.h b/source/blender/compositor/intern/COM_MemoryBuffer.h
index 5f6485475d0..7492113da34 100644
--- a/source/blender/compositor/intern/COM_MemoryBuffer.h
+++ b/source/blender/compositor/intern/COM_MemoryBuffer.h
@@ -35,15 +35,15 @@ extern "C" {
}
/**
- * @brief state of a memory buffer
- * @ingroup Memory
+ * \brief state of a memory buffer
+ * \ingroup Memory
*/
typedef enum MemoryBufferState {
- /** @brief memory has been allocated on creator device and CPU machine, but kernel has not been executed */
+ /** \brief memory has been allocated on creator device and CPU machine, but kernel has not been executed */
COM_MB_ALLOCATED = 1,
- /** @brief memory is available for use, content has been created */
+ /** \brief memory is available for use, content has been created */
COM_MB_AVAILABLE = 2,
- /** @brief chunk is consolidated from other chunks. special state.*/
+ /** \brief chunk is consolidated from other chunks. special state.*/
COM_MB_TEMPORARILY = 6
} MemoryBufferState;
@@ -56,44 +56,44 @@ typedef enum MemoryBufferExtend {
class MemoryProxy;
/**
- * @brief a MemoryBuffer contains access to the data of a chunk
+ * \brief a MemoryBuffer contains access to the data of a chunk
*/
class MemoryBuffer {
private:
/**
- * @brief proxy of the memory (same for all chunks in the same buffer)
+ * \brief proxy of the memory (same for all chunks in the same buffer)
*/
MemoryProxy *m_memoryProxy;
/**
- * @brief the type of buffer COM_DT_VALUE, COM_DT_VECTOR, COM_DT_COLOR
+ * \brief the type of buffer COM_DT_VALUE, COM_DT_VECTOR, COM_DT_COLOR
*/
DataType m_datatype;
/**
- * @brief region of this buffer inside relative to the MemoryProxy
+ * \brief region of this buffer inside relative to the MemoryProxy
*/
rcti m_rect;
/**
* brief refers to the chunknumber within the executiongroup where related to the MemoryProxy
- * @see memoryProxy
+ * \see memoryProxy
*/
unsigned int m_chunkNumber;
/**
- * @brief state of the buffer
+ * \brief state of the buffer
*/
MemoryBufferState m_state;
/**
- * @brief the actual float buffer/data
+ * \brief the actual float buffer/data
*/
float *m_buffer;
/**
- * @brief the number of channels of a single value in the buffer.
+ * \brief the number of channels of a single value in the buffer.
* For value buffers this is 1, vector 3 and color 4
*/
unsigned int m_num_channels;
@@ -103,40 +103,40 @@ private:
public:
/**
- * @brief construct new MemoryBuffer for a chunk
+ * \brief construct new MemoryBuffer for a chunk
*/
MemoryBuffer(MemoryProxy *memoryProxy, unsigned int chunkNumber, rcti *rect);
/**
- * @brief construct new temporarily MemoryBuffer for an area
+ * \brief construct new temporarily MemoryBuffer for an area
*/
MemoryBuffer(MemoryProxy *memoryProxy, rcti *rect);
/**
- * @brief construct new temporarily MemoryBuffer for an area
+ * \brief construct new temporarily MemoryBuffer for an area
*/
MemoryBuffer(DataType datatype, rcti *rect);
/**
- * @brief destructor
+ * \brief destructor
*/
~MemoryBuffer();
/**
- * @brief read the ChunkNumber of this MemoryBuffer
+ * \brief read the ChunkNumber of this MemoryBuffer
*/
unsigned int getChunkNumber() { return this->m_chunkNumber; }
unsigned int get_num_channels() { return this->m_num_channels; }
/**
- * @brief get the data of this MemoryBuffer
- * @note buffer should already be available in memory
+ * \brief get the data of this MemoryBuffer
+ * \note buffer should already be available in memory
*/
float *getBuffer() { return this->m_buffer; }
/**
- * @brief after execution the state will be set to available by calling this method
+ * \brief after execution the state will be set to available by calling this method
*/
void setCreatedState()
{
@@ -273,36 +273,36 @@ public:
void readEWA(float *result, const float uv[2], const float derivatives[2][2]);
/**
- * @brief is this MemoryBuffer a temporarily buffer (based on an area, not on a chunk)
+ * \brief is this MemoryBuffer a temporarily buffer (based on an area, not on a chunk)
*/
- inline const bool isTemporarily() const { return this->m_state == COM_MB_TEMPORARILY; }
+ inline bool isTemporarily() const { return this->m_state == COM_MB_TEMPORARILY; }
/**
- * @brief add the content from otherBuffer to this MemoryBuffer
- * @param otherBuffer source buffer
+ * \brief add the content from otherBuffer to this MemoryBuffer
+ * \param otherBuffer source buffer
*
- * @note take care when running this on a new buffer since it wont fill in
+ * \note take care when running this on a new buffer since it wont fill in
* uninitialized values in areas where the buffers don't overlap.
*/
void copyContentFrom(MemoryBuffer *otherBuffer);
/**
- * @brief get the rect of this MemoryBuffer
+ * \brief get the rect of this MemoryBuffer
*/
rcti *getRect() { return &this->m_rect; }
/**
- * @brief get the width of this MemoryBuffer
+ * \brief get the width of this MemoryBuffer
*/
int getWidth() const;
/**
- * @brief get the height of this MemoryBuffer
+ * \brief get the height of this MemoryBuffer
*/
int getHeight() const;
/**
- * @brief clear the buffer. Make all pixels black transparent.
+ * \brief clear the buffer. Make all pixels black transparent.
*/
void clear();
diff --git a/source/blender/compositor/intern/COM_MemoryProxy.h b/source/blender/compositor/intern/COM_MemoryProxy.h
index a628c09fa1f..20368eebde0 100644
--- a/source/blender/compositor/intern/COM_MemoryProxy.h
+++ b/source/blender/compositor/intern/COM_MemoryProxy.h
@@ -31,40 +31,40 @@ class ExecutionGroup;
class WriteBufferOperation;
/**
- * @brief A MemoryProxy is a unique identifier for a memory buffer.
+ * \brief A MemoryProxy is a unique identifier for a memory buffer.
* A single MemoryProxy is used among all chunks of the same buffer,
* the MemoryBuffer only stores the data of a single chunk.
- * @ingroup Memory
+ * \ingroup Memory
*/
class MemoryProxy {
private:
/**
- * @brief reference to the ouput operation of the executiongroup
+ * \brief reference to the output operation of the executiongroup
*/
WriteBufferOperation *m_writeBufferOperation;
/**
- * @brief reference to the executor. the Execution group that can fill a chunk
+ * \brief reference to the executor. the Execution group that can fill a chunk
*/
ExecutionGroup *m_executor;
/**
- * @brief datatype of this MemoryProxy
+ * \brief datatype of this MemoryProxy
*/
/* DataType m_datatype; */ /* UNUSED */
/**
- * @brief channel information of this buffer
+ * \brief channel information of this buffer
*/
/* ChannelInfo m_channelInfo[COM_NUMBER_OF_CHANNELS]; */ /* UNUSED */
/**
- * @brief the allocated memory
+ * \brief the allocated memory
*/
MemoryBuffer *m_buffer;
/**
- * @brief datatype of this MemoryProxy
+ * \brief datatype of this MemoryProxy
*/
DataType m_datatype;
@@ -72,40 +72,40 @@ public:
MemoryProxy(DataType type);
/**
- * @brief set the ExecutionGroup that can be scheduled to calculate a certain chunk.
- * @param group the ExecutionGroup to set
+ * \brief set the ExecutionGroup that can be scheduled to calculate a certain chunk.
+ * \param group the ExecutionGroup to set
*/
void setExecutor(ExecutionGroup *executor) { this->m_executor = executor; }
/**
- * @brief get the ExecutionGroup that can be scheduled to calculate a certain chunk.
+ * \brief get the ExecutionGroup that can be scheduled to calculate a certain chunk.
*/
ExecutionGroup *getExecutor() { return this->m_executor; }
/**
- * @brief set the WriteBufferOperation that is responsible for writing to this MemoryProxy
- * @param operation
+ * \brief set the WriteBufferOperation that is responsible for writing to this MemoryProxy
+ * \param operation
*/
void setWriteBufferOperation(WriteBufferOperation *operation) { this->m_writeBufferOperation = operation; }
/**
- * @brief get the WriteBufferOperation that is responsible for writing to this MemoryProxy
- * @return WriteBufferOperation
+ * \brief get the WriteBufferOperation that is responsible for writing to this MemoryProxy
+ * \return WriteBufferOperation
*/
WriteBufferOperation *getWriteBufferOperation() { return this->m_writeBufferOperation; }
/**
- * @brief allocate memory of size width x height
+ * \brief allocate memory of size width x height
*/
void allocate(unsigned int width, unsigned int height);
/**
- * @brief free the allocated memory
+ * \brief free the allocated memory
*/
void free();
/**
- * @brief get the allocated memory
+ * \brief get the allocated memory
*/
inline MemoryBuffer *getBuffer() { return this->m_buffer; }
diff --git a/source/blender/compositor/intern/COM_Node.h b/source/blender/compositor/intern/COM_Node.h
index 1b78e7fec6d..891845517d5 100644
--- a/source/blender/compositor/intern/COM_Node.h
+++ b/source/blender/compositor/intern/COM_Node.h
@@ -48,43 +48,43 @@ public:
private:
/**
- * @brief stores the reference to the SDNA bNode struct
+ * \brief stores the reference to the SDNA bNode struct
*/
bNodeTree *m_editorNodeTree;
/**
- * @brief stores the reference to the SDNA bNode struct
+ * \brief stores the reference to the SDNA bNode struct
*/
bNode *m_editorNode;
/**
- * @brief the list of actual inputsockets @see NodeInput
+ * \brief the list of actual inputsockets \see NodeInput
*/
Inputs m_inputsockets;
/**
- * @brief the list of actual outputsockets @see NodeOutput
+ * \brief the list of actual outputsockets \see NodeOutput
*/
Outputs m_outputsockets;
/**
- * @brief Is this node part of the active group
+ * \brief Is this node part of the active group
*/
bool m_inActiveGroup;
/**
- * @brief Instance key to identify the node in an instance hash table
+ * \brief Instance key to identify the node in an instance hash table
*/
bNodeInstanceKey m_instanceKey;
protected:
/**
- * @brief get access to the vector of input sockets
+ * \brief get access to the vector of input sockets
*/
const Inputs &getInputSockets() const { return this->m_inputsockets; }
/**
- * @brief get access to the vector of input sockets
+ * \brief get access to the vector of input sockets
*/
const Outputs &getOutputSockets() const { return this->m_outputsockets; }
@@ -93,55 +93,55 @@ public:
virtual ~Node();
/**
- * @brief get the reference to the SDNA bNode struct
+ * \brief get the reference to the SDNA bNode struct
*/
bNode *getbNode() const {return m_editorNode;}
/**
- * @brief get the reference to the SDNA bNodeTree struct
+ * \brief get the reference to the SDNA bNodeTree struct
*/
bNodeTree *getbNodeTree() const {return m_editorNodeTree;}
/**
- * @brief set the reference to the bNode
- * @note used in Node instances to receive the storage/settings and complex node for highlight during execution
- * @param bNode
+ * \brief set the reference to the bNode
+ * \note used in Node instances to receive the storage/settings and complex node for highlight during execution
+ * \param bNode
*/
void setbNode(bNode *node) {this->m_editorNode = node;}
/**
- * @brief set the reference to the bNodeTree
- * @param bNodeTree
+ * \brief set the reference to the bNodeTree
+ * \param bNodeTree
*/
void setbNodeTree(bNodeTree *nodetree) {this->m_editorNodeTree = nodetree;}
/**
- * @brief Return the number of input sockets of this node.
+ * \brief Return the number of input sockets of this node.
*/
- const unsigned int getNumberOfInputSockets() const { return this->m_inputsockets.size(); }
+ unsigned int getNumberOfInputSockets() const { return this->m_inputsockets.size(); }
/**
- * @brief Return the number of output sockets of this node.
+ * \brief Return the number of output sockets of this node.
*/
- const unsigned int getNumberOfOutputSockets() const { return this->m_outputsockets.size(); }
+ unsigned int getNumberOfOutputSockets() const { return this->m_outputsockets.size(); }
/**
* get the reference to a certain outputsocket
- * @param index
+ * \param index
* the index of the needed outputsocket
*/
NodeOutput *getOutputSocket(const unsigned int index) const;
/**
* get the reference to the first outputsocket
- * @param index
+ * \param index
* the index of the needed outputsocket
*/
inline NodeOutput *getOutputSocket() const { return getOutputSocket(0); }
/**
* get the reference to a certain inputsocket
- * @param index
+ * \param index
* the index of the needed inputsocket
*/
NodeInput *getInputSocket(const unsigned int index) const;
@@ -152,26 +152,26 @@ public:
bool isInputNode() const { return m_inputsockets.empty(); }
/**
- * @brief Is this node in the active group (the group that is being edited)
- * @param isInActiveGroup
+ * \brief Is this node in the active group (the group that is being edited)
+ * \param isInActiveGroup
*/
void setIsInActiveGroup(bool value) { this->m_inActiveGroup = value; }
/**
- * @brief Is this node part of the active group
+ * \brief Is this node part of the active group
* the active group is the group that is currently being edited. When no group is edited,
* the active group will be the main tree (all nodes that are not part of a group will be active)
- * @return bool [false:true]
+ * \return bool [false:true]
*/
inline bool isInActiveGroup() const { return this->m_inActiveGroup; }
/**
- * @brief convert node to operation
+ * \brief convert node to operation
*
- * @todo this must be described further
+ * \todo this must be described further
*
- * @param system the ExecutionSystem where the operations need to be added
- * @param context reference to the CompositorContext
+ * \param system the ExecutionSystem where the operations need to be added
+ * \param context reference to the CompositorContext
*/
virtual void convertToOperations(NodeConverter &converter, const CompositorContext &context) const = 0;
@@ -191,17 +191,17 @@ public:
protected:
/**
- * @brief add an NodeInput to the collection of inputsockets
- * @note may only be called in an constructor
- * @param socket the NodeInput to add
+ * \brief add an NodeInput to the collection of inputsockets
+ * \note may only be called in an constructor
+ * \param socket the NodeInput to add
*/
void addInputSocket(DataType datatype);
void addInputSocket(DataType datatype, bNodeSocket *socket);
/**
- * @brief add an NodeOutput to the collection of outputsockets
- * @note may only be called in an constructor
- * @param socket the NodeOutput to add
+ * \brief add an NodeOutput to the collection of outputsockets
+ * \note may only be called in an constructor
+ * \param socket the NodeOutput to add
*/
void addOutputSocket(DataType datatype);
void addOutputSocket(DataType datatype, bNodeSocket *socket);
@@ -212,8 +212,8 @@ protected:
/**
- * @brief NodeInput are sockets that can receive data/input
- * @ingroup Model
+ * \brief NodeInput are sockets that can receive data/input
+ * \ingroup Model
*/
class NodeInput {
private:
@@ -223,7 +223,7 @@ private:
DataType m_datatype;
/**
- * @brief link connected to this NodeInput.
+ * \brief link connected to this NodeInput.
* An input socket can only have a single link
*/
NodeOutput *m_link;
@@ -246,8 +246,8 @@ public:
/**
- * @brief NodeOutput are sockets that can send data/input
- * @ingroup Model
+ * \brief NodeOutput are sockets that can send data/input
+ * \ingroup Model
*/
class NodeOutput {
private:
diff --git a/source/blender/compositor/intern/COM_NodeConverter.h b/source/blender/compositor/intern/COM_NodeConverter.h
index 4fb6b70ad1b..320646be50d 100644
--- a/source/blender/compositor/intern/COM_NodeConverter.h
+++ b/source/blender/compositor/intern/COM_NodeConverter.h
@@ -36,44 +36,50 @@ class NodeOperationBuilder;
class ViewerOperation;
-/** Interface type for converting a \a Node into \a NodeOperation.
- * This is passed to \a Node::convertToOperation methods and allows them
- * to register any number of operations, create links between them,
- * and map original node sockets to their inputs or outputs.
+/**
+ * Interface type for converting a \a Node into \a NodeOperation.
+ * This is passed to \a Node::convertToOperation methods and allows them
+ * to register any number of operations, create links between them,
+ * and map original node sockets to their inputs or outputs.
*/
class NodeConverter {
public:
NodeConverter(NodeOperationBuilder *builder);
- /** Insert a new operation into the operations graph.
- * The operation must be created by the node.
+ /**
+ * Insert a new operation into the operations graph.
+ * The operation must be created by the node.
*/
void addOperation(NodeOperation *operation);
- /** Map input socket of the node to an operation socket.
- * Links between nodes will then generate equivalent links between
- * the mapped operation sockets.
+ /**
+ * Map input socket of the node to an operation socket.
+ * Links between nodes will then generate equivalent links between
+ * the mapped operation sockets.
*
- * \note A \a Node input can be mapped to multiple \a NodeOperation inputs.
+ * \note A \a Node input can be mapped to multiple \a NodeOperation inputs.
*/
void mapInputSocket(NodeInput *node_socket, NodeOperationInput *operation_socket);
- /** Map output socket of the node to an operation socket.
- * Links between nodes will then generate equivalent links between
- * the mapped operation sockets.
+ /**
+ * Map output socket of the node to an operation socket.
+ * Links between nodes will then generate equivalent links between
+ * the mapped operation sockets.
*
* \note A \a Node output can only be mapped to one \a NodeOperation output.
* Any existing operation output mapping will be replaced.
*/
void mapOutputSocket(NodeOutput *node_socket, NodeOperationOutput *operation_socket);
- /** Create a proxy operation for a node input.
- * This operation will be removed later and replaced
- * by direct links between the connected operations.
+ /**
+ * Create a proxy operation for a node input.
+ * This operation will be removed later and replaced
+ * by direct links between the connected operations.
*/
NodeOperationOutput *addInputProxy(NodeInput *input, bool use_conversion);
- /** Create a proxy operation for a node output.
- * This operation will be removed later and replaced
- * by direct links between the connected operations.
+ /**
+ * Create a proxy operation for a node output.
+ * This operation will be removed later and replaced
+ * by direct links between the connected operations.
*/
NodeOperationInput *addOutputProxy(NodeOutput *output, bool use_conversion);
@@ -99,8 +105,9 @@ public:
/** Add a preview operation for a node input. */
void addNodeInputPreview(NodeInput *input);
- /** When a node has no valid data
- * @note missing image / group pointer, or missing renderlayer from EXR
+ /**
+ * When a node has no valid data
+ * \note missing image / group pointer, or missing renderlayer from EXR
*/
NodeOperation *setInvalidOutput(NodeOutput *output);
diff --git a/source/blender/compositor/intern/COM_NodeGraph.cpp b/source/blender/compositor/intern/COM_NodeGraph.cpp
index d78450074ed..94af8543eb0 100644
--- a/source/blender/compositor/intern/COM_NodeGraph.cpp
+++ b/source/blender/compositor/intern/COM_NodeGraph.cpp
@@ -176,7 +176,7 @@ NodeOutput *NodeGraph::find_output(const NodeRange &node_range, bNodeSocket *b_s
void NodeGraph::add_bNodeLink(const NodeRange &node_range, bNodeLink *b_nodelink)
{
- /// @note: ignore invalid links
+ /// \note: ignore invalid links
if (!(b_nodelink->flag & NODE_LINK_VALID))
return;
if ((b_nodelink->fromsock->flag & SOCK_UNAVAIL) || (b_nodelink->tosock->flag & SOCK_UNAVAIL))
diff --git a/source/blender/compositor/intern/COM_NodeOperation.cpp b/source/blender/compositor/intern/COM_NodeOperation.cpp
index 1063386aa58..09b05313898 100644
--- a/source/blender/compositor/intern/COM_NodeOperation.cpp
+++ b/source/blender/compositor/intern/COM_NodeOperation.cpp
@@ -171,7 +171,7 @@ bool NodeOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOper
rcti tempOutput;
bool first = true;
for (int i = 0; i < getNumberOfInputSockets(); i ++) {
- NodeOperation * inputOperation = this->getInputOperation(i);
+ NodeOperation *inputOperation = this->getInputOperation(i);
if (inputOperation && inputOperation->determineDependingAreaOfInterest(input, readOperation, &tempOutput)) {
if (first) {
output->xmin = tempOutput.xmin;
diff --git a/source/blender/compositor/intern/COM_NodeOperation.h b/source/blender/compositor/intern/COM_NodeOperation.h
index 9ab9156e7e4..95164d727e8 100644
--- a/source/blender/compositor/intern/COM_NodeOperation.h
+++ b/source/blender/compositor/intern/COM_NodeOperation.h
@@ -52,30 +52,30 @@ class NodeOperationInput;
class NodeOperationOutput;
/**
- * @brief Resize modes of inputsockets
+ * \brief Resize modes of inputsockets
* How are the input and working resolutions matched
- * @ingroup Model
+ * \ingroup Model
*/
typedef enum InputResizeMode {
- /** @brief Center the input image to the center of the working area of the node, no resizing occurs */
+ /** \brief Center the input image to the center of the working area of the node, no resizing occurs */
COM_SC_CENTER = NS_CR_CENTER,
- /** @brief The bottom left of the input image is the bottom left of the working area of the node, no resizing occurs */
+ /** \brief The bottom left of the input image is the bottom left of the working area of the node, no resizing occurs */
COM_SC_NO_RESIZE = NS_CR_NONE,
- /** @brief Fit the width of the input image to the width of the working area of the node */
+ /** \brief Fit the width of the input image to the width of the working area of the node */
COM_SC_FIT_WIDTH = NS_CR_FIT_WIDTH,
- /** @brief Fit the height of the input image to the height of the working area of the node */
+ /** \brief Fit the height of the input image to the height of the working area of the node */
COM_SC_FIT_HEIGHT = NS_CR_FIT_HEIGHT,
- /** @brief Fit the width or the height of the input image to the width or height of the working area of the node, image will be larger than the working area */
+ /** \brief Fit the width or the height of the input image to the width or height of the working area of the node, image will be larger than the working area */
COM_SC_FIT = NS_CR_FIT,
- /** @brief Fit the width and the height of the input image to the width and height of the working area of the node, image will be equally larger than the working area */
+ /** \brief Fit the width and the height of the input image to the width and height of the working area of the node, image will be equally larger than the working area */
COM_SC_STRETCH = NS_CR_STRETCH
} InputResizeMode;
/**
- * @brief NodeOperation contains calculation logic
+ * \brief NodeOperation contains calculation logic
*
* Subclasses needs to implement the execution method (defined in SocketReader) to implement logic.
- * @ingroup Model
+ * \ingroup Model
*/
class NodeOperation : public SocketReader {
public:
@@ -87,12 +87,12 @@ private:
Outputs m_outputs;
/**
- * @brief the index of the input socket that will be used to determine the resolution
+ * \brief the index of the input socket that will be used to determine the resolution
*/
unsigned int m_resolutionInputSocketIndex;
/**
- * @brief is this operation a complex one.
+ * \brief is this operation a complex one.
*
* Complex operations are typically doing many reads to calculate the output of a single pixel.
* Mostly Filter types (Blurs, Convolution, Defocus etc) need this to be set to true.
@@ -100,29 +100,29 @@ private:
bool m_complex;
/**
- * @brief can this operation be scheduled on an OpenCL device.
- * @note Only applicable if complex is True
+ * \brief can this operation be scheduled on an OpenCL device.
+ * \note Only applicable if complex is True
*/
bool m_openCL;
/**
- * @brief mutex reference for very special node initializations
- * @note only use when you really know what you are doing.
+ * \brief mutex reference for very special node initializations
+ * \note only use when you really know what you are doing.
* this mutex is used to share data among chunks in the same operation
- * @see TonemapOperation for an example of usage
- * @see NodeOperation.initMutex initializes this mutex
- * @see NodeOperation.deinitMutex deinitializes this mutex
- * @see NodeOperation.getMutex retrieve a pointer to this mutex.
+ * \see TonemapOperation for an example of usage
+ * \see NodeOperation.initMutex initializes this mutex
+ * \see NodeOperation.deinitMutex deinitializes this mutex
+ * \see NodeOperation.getMutex retrieve a pointer to this mutex.
*/
ThreadMutex m_mutex;
/**
- * @brief reference to the editing bNodeTree, used for break and update callback
+ * \brief reference to the editing bNodeTree, used for break and update callback
*/
const bNodeTree *m_btree;
/**
- * @brief set to truth when resolution for this operation is set
+ * \brief set to truth when resolution for this operation is set
*/
bool m_isResolutionSet;
@@ -141,25 +141,25 @@ public:
bool isInputOperation() const { return m_inputs.empty(); }
/**
- * @brief determine the resolution of this node
- * @note this method will not set the resolution, this is the responsibility of the caller
- * @param resolution the result of this operation
- * @param preferredResolution the preferable resolution as no resolution could be determined
+ * \brief determine the resolution of this node
+ * \note this method will not set the resolution, this is the responsibility of the caller
+ * \param resolution the result of this operation
+ * \param preferredResolution the preferable resolution as no resolution could be determined
*/
virtual void determineResolution(unsigned int resolution[2], unsigned int preferredResolution[2]);
/**
- * @brief isOutputOperation determines whether this operation is an output of the ExecutionSystem during rendering or editing.
+ * \brief isOutputOperation determines whether this operation is an output of the ExecutionSystem during rendering or editing.
*
* Default behaviour if not overridden, this operation will not be evaluated as being an output of the ExecutionSystem.
*
- * @see ExecutionSystem
- * @group check
- * @param rendering [true false]
+ * \see ExecutionSystem
+ * \group check
+ * \param rendering [true false]
* true: rendering
* false: editing
*
- * @return bool the result of this method
+ * \return bool the result of this method
*/
virtual bool isOutputOperation(bool /*rendering*/) const { return false; }
@@ -169,26 +169,26 @@ public:
virtual void initExecution();
/**
- * @brief when a chunk is executed by a CPUDevice, this method is called
- * @ingroup execution
- * @param rect the rectangle of the chunk (location and size)
- * @param chunkNumber the chunkNumber to be calculated
- * @param memoryBuffers all input MemoryBuffer's needed
+ * \brief when a chunk is executed by a CPUDevice, this method is called
+ * \ingroup execution
+ * \param rect the rectangle of the chunk (location and size)
+ * \param chunkNumber the chunkNumber to be calculated
+ * \param memoryBuffers all input MemoryBuffer's needed
*/
virtual void executeRegion(rcti * /*rect*/,
unsigned int /*chunkNumber*/) {}
/**
- * @brief when a chunk is executed by an OpenCLDevice, this method is called
- * @ingroup execution
- * @note this method is only implemented in WriteBufferOperation
- * @param context the OpenCL context
- * @param program the OpenCL program containing all compositor kernels
- * @param queue the OpenCL command queue of the device the chunk is executed on
- * @param rect the rectangle of the chunk (location and size)
- * @param chunkNumber the chunkNumber to be calculated
- * @param memoryBuffers all input MemoryBuffer's needed
- * @param outputBuffer the outputbuffer to write to
+ * \brief when a chunk is executed by an OpenCLDevice, this method is called
+ * \ingroup execution
+ * \note this method is only implemented in WriteBufferOperation
+ * \param context the OpenCL context
+ * \param program the OpenCL program containing all compositor kernels
+ * \param queue the OpenCL command queue of the device the chunk is executed on
+ * \param rect the rectangle of the chunk (location and size)
+ * \param chunkNumber the chunkNumber to be calculated
+ * \param memoryBuffers all input MemoryBuffer's needed
+ * \param outputBuffer the outputbuffer to write to
*/
virtual void executeOpenCLRegion(OpenCLDevice * /*device*/,
rcti * /*rect*/,
@@ -197,16 +197,16 @@ public:
MemoryBuffer * /*outputBuffer*/) {}
/**
- * @brief custom handle to add new tasks to the OpenCL command queue in order to execute a chunk on an GPUDevice
- * @ingroup execution
- * @param context the OpenCL context
- * @param program the OpenCL program containing all compositor kernels
- * @param queue the OpenCL command queue of the device the chunk is executed on
- * @param outputMemoryBuffer the allocated memory buffer in main CPU memory
- * @param clOutputBuffer the allocated memory buffer in OpenCLDevice memory
- * @param inputMemoryBuffers all input MemoryBuffer's needed
- * @param clMemToCleanUp all created cl_mem references must be added to this list. Framework will clean this after execution
- * @param clKernelsToCleanUp all created cl_kernel references must be added to this list. Framework will clean this after execution
+ * \brief custom handle to add new tasks to the OpenCL command queue in order to execute a chunk on an GPUDevice
+ * \ingroup execution
+ * \param context the OpenCL context
+ * \param program the OpenCL program containing all compositor kernels
+ * \param queue the OpenCL command queue of the device the chunk is executed on
+ * \param outputMemoryBuffer the allocated memory buffer in main CPU memory
+ * \param clOutputBuffer the allocated memory buffer in OpenCLDevice memory
+ * \param inputMemoryBuffers all input MemoryBuffer's needed
+ * \param clMemToCleanUp all created cl_mem references must be added to this list. Framework will clean this after execution
+ * \param clKernelsToCleanUp all created cl_kernel references must be added to this list. Framework will clean this after execution
*/
virtual void executeOpenCL(OpenCLDevice * /*device*/,
MemoryBuffer * /*outputMemoryBuffer*/,
@@ -221,8 +221,8 @@ public:
}
/**
- * @brief set the resolution
- * @param resolution the resolution to set
+ * \brief set the resolution
+ * \param resolution the resolution to set
*/
void setResolution(unsigned int resolution[2]) {
if (!isResolutionSet()) {
@@ -236,56 +236,56 @@ public:
void getConnectedInputSockets(Inputs *sockets);
/**
- * @brief is this operation complex
+ * \brief is this operation complex
*
* Complex operations are typically doing many reads to calculate the output of a single pixel.
* Mostly Filter types (Blurs, Convolution, Defocus etc) need this to be set to true.
*/
- const bool isComplex() const { return this->m_complex; }
+ bool isComplex() const { return this->m_complex; }
virtual bool isSetOperation() const { return false; }
/**
- * @brief is this operation of type ReadBufferOperation
- * @return [true:false]
- * @see ReadBufferOperation
+ * \brief is this operation of type ReadBufferOperation
+ * \return [true:false]
+ * \see ReadBufferOperation
*/
- virtual const bool isReadBufferOperation() const { return false; }
+ virtual bool isReadBufferOperation() const { return false; }
/**
- * @brief is this operation of type WriteBufferOperation
- * @return [true:false]
- * @see WriteBufferOperation
+ * \brief is this operation of type WriteBufferOperation
+ * \return [true:false]
+ * \see WriteBufferOperation
*/
- virtual const bool isWriteBufferOperation() const { return false; }
+ virtual bool isWriteBufferOperation() const { return false; }
/**
- * @brief is this operation the active viewer output
+ * \brief is this operation the active viewer output
* user can select an ViewerNode to be active (the result of this node will be drawn on the backdrop)
- * @return [true:false]
- * @see BaseViewerOperation
+ * \return [true:false]
+ * \see BaseViewerOperation
*/
- virtual const bool isActiveViewerOutput() const { return false; }
+ virtual bool isActiveViewerOutput() const { return false; }
virtual bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output);
/**
- * @brief set the index of the input socket that will determine the resolution of this operation
- * @param index the index to set
+ * \brief set the index of the input socket that will determine the resolution of this operation
+ * \param index the index to set
*/
void setResolutionInputSocketIndex(unsigned int index);
/**
- * @brief get the render priority of this node.
- * @note only applicable for output operations like ViewerOperation
- * @return CompositorPriority
+ * \brief get the render priority of this node.
+ * \note only applicable for output operations like ViewerOperation
+ * \return CompositorPriority
*/
- virtual const CompositorPriority getRenderPriority() const { return COM_PRIORITY_LOW; }
+ virtual CompositorPriority getRenderPriority() const { return COM_PRIORITY_LOW; }
/**
- * @brief can this NodeOperation be scheduled on an OpenCLDevice
- * @see WorkScheduler.schedule
- * @see ExecutionGroup.addOperation
+ * \brief can this NodeOperation be scheduled on an OpenCLDevice
+ * \see WorkScheduler.schedule
+ * \see ExecutionGroup.addOperation
*/
bool isOpenCL() const { return this->m_openCL; }
@@ -321,7 +321,7 @@ protected:
void unlockMutex();
/**
- * @brief set whether this operation is complex
+ * \brief set whether this operation is complex
*
* Complex operations are typically doing many reads to calculate the output of a single pixel.
* Mostly Filter types (Blurs, Convolution, Defocus etc) need this to be set to true.
@@ -329,7 +329,7 @@ protected:
void setComplex(bool complex) { this->m_complex = complex; }
/**
- * @brief set if this NodeOperation can be scheduled on a OpenCLDevice
+ * \brief set if this NodeOperation can be scheduled on a OpenCLDevice
*/
void setOpenCL(bool openCL) { this->m_openCL = openCL; }
@@ -347,7 +347,7 @@ private:
NodeOperation *m_operation;
/** Datatype of this socket. Is used for automatically data transformation.
- * @section data-conversion
+ * \section data-conversion
*/
DataType m_datatype;
@@ -385,7 +385,7 @@ private:
NodeOperation *m_operation;
/** Datatype of this socket. Is used for automatically data transformation.
- * @section data-conversion
+ * \section data-conversion
*/
DataType m_datatype;
@@ -396,9 +396,9 @@ public:
DataType getDataType() const { return m_datatype; }
/**
- * @brief determine the resolution of this data going through this socket
- * @param resolution the result of this operation
- * @param preferredResolution the preferable resolution as no resolution could be determined
+ * \brief determine the resolution of this data going through this socket
+ * \param resolution the result of this operation
+ * \param preferredResolution the preferable resolution as no resolution could be determined
*/
void determineResolution(unsigned int resolution[2], unsigned int preferredResolution[2]);
diff --git a/source/blender/compositor/intern/COM_OpenCLDevice.h b/source/blender/compositor/intern/COM_OpenCLDevice.h
index a3a5cd36902..f8dd3750d42 100644
--- a/source/blender/compositor/intern/COM_OpenCLDevice.h
+++ b/source/blender/compositor/intern/COM_OpenCLDevice.h
@@ -33,70 +33,70 @@ class OpenCLDevice;
using std::list;
/**
- * @brief device representing an GPU OpenCL device.
+ * \brief device representing an GPU OpenCL device.
* an instance of this class represents a single cl_device
*/
class OpenCLDevice : public Device {
private:
/**
- * @brief opencl context
+ * \brief opencl context
*/
cl_context m_context;
/**
- * @brief opencl device
+ * \brief opencl device
*/
cl_device_id m_device;
/**
- * @brief opencl program
+ * \brief opencl program
*/
cl_program m_program;
/**
- * @brief opencl command queue
+ * \brief opencl command queue
*/
cl_command_queue m_queue;
/**
- * @brief opencl vendor ID
+ * \brief opencl vendor ID
*/
cl_int m_vendorID;
public:
/**
- * @brief constructor with opencl device
- * @param context
- * @param device
- * @param program
- * @param vendorID
+ * \brief constructor with opencl device
+ * \param context
+ * \param device
+ * \param program
+ * \param vendorID
*/
OpenCLDevice(cl_context context, cl_device_id device, cl_program program, cl_int vendorId);
/**
- * @brief initialize the device
+ * \brief initialize the device
* During initialization the OpenCL cl_command_queue is created
* the command queue is stored in the field queue.
- * @see queue
+ * \see queue
*/
bool initialize();
/**
- * @brief deinitialize the device
+ * \brief deinitialize the device
* During deintiialization the command queue is cleared
*/
void deinitialize();
/**
- * @brief execute a WorkPackage
- * @param work the WorkPackage to execute
+ * \brief execute a WorkPackage
+ * \param work the WorkPackage to execute
*/
void execute(WorkPackage *work);
/**
- * @brief determine an image format
- * @param memorybuffer
+ * \brief determine an image format
+ * \param memorybuffer
*/
static const cl_image_format *determineImageFormat(MemoryBuffer *memoryBuffer);
diff --git a/source/blender/compositor/intern/COM_SocketReader.h b/source/blender/compositor/intern/COM_SocketReader.h
index af6b891e7ab..c8a8e1d3252 100644
--- a/source/blender/compositor/intern/COM_SocketReader.h
+++ b/source/blender/compositor/intern/COM_SocketReader.h
@@ -37,31 +37,31 @@ typedef enum PixelSampler {
class MemoryBuffer;
/**
- * @brief Helper class for reading socket data.
+ * \brief Helper class for reading socket data.
* Only use this class for dispatching (un-ary and n-ary) executions.
- * @ingroup Execution
+ * \ingroup Execution
*/
class SocketReader {
private:
protected:
/**
- * @brief Holds the width of the output of this operation.
+ * \brief Holds the width of the output of this operation.
*/
unsigned int m_width;
/**
- * @brief Holds the height of the output of this operation.
+ * \brief Holds the height of the output of this operation.
*/
unsigned int m_height;
/**
- * @brief calculate a single pixel
- * @note this method is called for non-complex
- * @param result is a float[4] array to store the result
- * @param x the x-coordinate of the pixel to calculate in image space
- * @param y the y-coordinate of the pixel to calculate in image space
- * @param inputBuffers chunks that can be read by their ReadBufferOperation.
+ * \brief calculate a single pixel
+ * \note this method is called for non-complex
+ * \param result is a float[4] array to store the result
+ * \param x the x-coordinate of the pixel to calculate in image space
+ * \param y the y-coordinate of the pixel to calculate in image space
+ * \param inputBuffers chunks that can be read by their ReadBufferOperation.
*/
virtual void executePixelSampled(float /*output*/[4],
float /*x*/,
@@ -69,27 +69,27 @@ protected:
PixelSampler /*sampler*/) { }
/**
- * @brief calculate a single pixel
- * @note this method is called for complex
- * @param result is a float[4] array to store the result
- * @param x the x-coordinate of the pixel to calculate in image space
- * @param y the y-coordinate of the pixel to calculate in image space
- * @param inputBuffers chunks that can be read by their ReadBufferOperation.
- * @param chunkData chunk specific data a during execution time.
+ * \brief calculate a single pixel
+ * \note this method is called for complex
+ * \param result is a float[4] array to store the result
+ * \param x the x-coordinate of the pixel to calculate in image space
+ * \param y the y-coordinate of the pixel to calculate in image space
+ * \param inputBuffers chunks that can be read by their ReadBufferOperation.
+ * \param chunkData chunk specific data a during execution time.
*/
virtual void executePixel(float output[4], int x, int y, void * /*chunkData*/) {
executePixelSampled(output, x, y, COM_PS_NEAREST);
}
/**
- * @brief calculate a single pixel using an EWA filter
- * @note this method is called for complex
- * @param result is a float[4] array to store the result
- * @param x the x-coordinate of the pixel to calculate in image space
- * @param y the y-coordinate of the pixel to calculate in image space
- * @param dx
- * @param dy
- * @param inputBuffers chunks that can be read by their ReadBufferOperation.
+ * \brief calculate a single pixel using an EWA filter
+ * \note this method is called for complex
+ * \param result is a float[4] array to store the result
+ * \param x the x-coordinate of the pixel to calculate in image space
+ * \param y the y-coordinate of the pixel to calculate in image space
+ * \param dx
+ * \param dy
+ * \param inputBuffers chunks that can be read by their ReadBufferOperation.
*/
virtual void executePixelFiltered(float /*output*/[4],
float /*x*/, float /*y*/,
@@ -113,8 +113,8 @@ public:
virtual MemoryBuffer *getInputMemoryBuffer(MemoryBuffer ** /*memoryBuffers*/) { return 0; }
- inline const unsigned int getWidth() const { return this->m_width; }
- inline const unsigned int getHeight() const { return this->m_height; }
+ inline unsigned int getWidth() const { return this->m_width; }
+ inline unsigned int getHeight() const { return this->m_height; }
#ifdef WITH_CXX_GUARDEDALLOC
MEM_CXX_CLASS_ALLOC_FUNCS("COM:SocketReader")
diff --git a/source/blender/compositor/intern/COM_WorkPackage.h b/source/blender/compositor/intern/COM_WorkPackage.h
index b0a74a1b0ee..72677c4e112 100644
--- a/source/blender/compositor/intern/COM_WorkPackage.h
+++ b/source/blender/compositor/intern/COM_WorkPackage.h
@@ -28,35 +28,35 @@ class ExecutionGroup;
#include "COM_ExecutionGroup.h"
/**
- * @brief contains data about work that can be scheduled
- * @see WorkScheduler
+ * \brief contains data about work that can be scheduled
+ * \see WorkScheduler
*/
class WorkPackage {
private:
/**
- * @brief executionGroup with the operations-setup to be evaluated
+ * \brief executionGroup with the operations-setup to be evaluated
*/
ExecutionGroup *m_executionGroup;
/**
- * @brief number of the chunk to be executed
+ * \brief number of the chunk to be executed
*/
unsigned int m_chunkNumber;
public:
/**
* constructor
- * @param group the ExecutionGroup
- * @param chunkNumber the number of the chunk
+ * \param group the ExecutionGroup
+ * \param chunkNumber the number of the chunk
*/
WorkPackage(ExecutionGroup *group, unsigned int chunkNumber);
/**
- * @brief get the ExecutionGroup
+ * \brief get the ExecutionGroup
*/
ExecutionGroup *getExecutionGroup() const { return this->m_executionGroup; }
/**
- * @brief get the number of the chunk
+ * \brief get the number of the chunk
*/
unsigned int getChunkNumber() const { return this->m_chunkNumber; }
diff --git a/source/blender/compositor/intern/COM_WorkScheduler.cpp b/source/blender/compositor/intern/COM_WorkScheduler.cpp
index 4136983e13c..5be76d84e33 100644
--- a/source/blender/compositor/intern/COM_WorkScheduler.cpp
+++ b/source/blender/compositor/intern/COM_WorkScheduler.cpp
@@ -49,25 +49,25 @@
#endif
-/// @brief list of all CPUDevices. for every hardware thread an instance of CPUDevice is created
+/// \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;
#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
-/// @brief list of all thread for every CPUDevice in cpudevices a thread exists
+/// \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
+/// \brief all scheduled work for the cpu
static ThreadQueue *g_cpuqueue;
static ThreadQueue *g_gpuqueue;
#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
+/// \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
+/// \brief list of all thread for every GPUDevice in cpudevices a thread exists
static ListBase g_gputhreads;
-/// @brief all scheduled work for the gpu
+/// \brief all scheduled work for the gpu
#ifdef COM_OPENCL_ENABLED
static bool g_openclActive = false;
static bool g_openclInitialized = false;
diff --git a/source/blender/compositor/intern/COM_WorkScheduler.h b/source/blender/compositor/intern/COM_WorkScheduler.h
index a08b3856a8b..a6de517983e 100644
--- a/source/blender/compositor/intern/COM_WorkScheduler.h
+++ b/source/blender/compositor/intern/COM_WorkScheduler.h
@@ -31,43 +31,43 @@ extern "C" {
#include "COM_defines.h"
#include "COM_Device.h"
-/** @brief the workscheduler
- * @ingroup execution
+/** \brief the workscheduler
+ * \ingroup execution
*/
class WorkScheduler {
#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
/**
- * @brief are we being stopped.
+ * \brief are we being stopped.
*/
static bool isStopping();
/**
- * @brief main thread loop for cpudevices
+ * \brief main thread loop for cpudevices
* inside this loop new work is queried and being executed
*/
static void *thread_execute_cpu(void *data);
/**
- * @brief main thread loop for gpudevices
+ * \brief main thread loop for gpudevices
* inside this loop new work is queried and being executed
*/
static void *thread_execute_gpu(void *data);
#endif
public:
/**
- * @brief schedule a chunk of a group to be calculated.
+ * \brief schedule a chunk of a group to be calculated.
* An execution group schedules a chunk in the WorkScheduler
* when ExecutionGroup.isOpenCL is set the work will be handled by a OpenCLDevice
* otherwise the work is scheduled for an CPUDevice
- * @see ExecutionGroup.execute
- * @param group the execution group
- * @param chunkNumber the number of the chunk in the group to be executed
+ * \see ExecutionGroup.execute
+ * \param group the execution group
+ * \param chunkNumber the number of the chunk in the group to be executed
*/
static void schedule(ExecutionGroup *group, int chunkNumber);
/**
- * @brief initialize the WorkScheduler
+ * \brief initialize the WorkScheduler
*
* during initialization the mutexes are initialized.
* there are two mutexes (for every device type one)
@@ -80,36 +80,36 @@ public:
static void initialize(bool use_opencl, int num_cpu_threads);
/**
- * @brief deinitialize the WorkScheduler
+ * \brief deinitialize the WorkScheduler
* free all allocated resources
*/
static void deinitialize();
/**
- * @brief Start the execution
+ * \brief Start the execution
* this methods will start the WorkScheduler. Inside this method all threads are initialized.
* for every device a thread is created.
- * @see initialize Initialization and query of the number of devices
+ * \see initialize Initialization and query of the number of devices
*/
static void start(CompositorContext &context);
/**
- * @brief stop the execution
+ * \brief stop the execution
* All created thread by the start method are destroyed.
- * @see start
+ * \see start
*/
static void stop();
/**
- * @brief wait for all work to be completed.
+ * \brief wait for all work to be completed.
*/
static void finish();
/**
- * @brief Are there OpenCL capable GPU devices initialized?
+ * \brief Are there OpenCL capable GPU devices initialized?
* the result of this method is stored in the CompositorContext
* A node can generate a different operation tree when OpenCLDevices exists.
- * @see CompositorContext.getHasActiveOpenCLDevices
+ * \see CompositorContext.getHasActiveOpenCLDevices
*/
static bool hasGPUDevices();
diff --git a/source/blender/compositor/nodes/COM_AlphaOverNode.h b/source/blender/compositor/nodes/COM_AlphaOverNode.h
index 0af2ea3310d..04155a9bad7 100644
--- a/source/blender/compositor/nodes/COM_AlphaOverNode.h
+++ b/source/blender/compositor/nodes/COM_AlphaOverNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief AlphaOverNode
- * @ingroup Node
+ * \brief AlphaOverNode
+ * \ingroup Node
*/
class AlphaOverNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_BilateralBlurNode.h b/source/blender/compositor/nodes/COM_BilateralBlurNode.h
index babb558e0d1..928aff65f36 100644
--- a/source/blender/compositor/nodes/COM_BilateralBlurNode.h
+++ b/source/blender/compositor/nodes/COM_BilateralBlurNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief BilateralBlurNode
- * @ingroup Node
+ * \brief BilateralBlurNode
+ * \ingroup Node
*/
class BilateralBlurNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_BlurNode.h b/source/blender/compositor/nodes/COM_BlurNode.h
index 9a5f5ea1efd..703e85c9bcc 100644
--- a/source/blender/compositor/nodes/COM_BlurNode.h
+++ b/source/blender/compositor/nodes/COM_BlurNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief BlurNode
- * @ingroup Node
+ * \brief BlurNode
+ * \ingroup Node
*/
class BlurNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_BokehBlurNode.h b/source/blender/compositor/nodes/COM_BokehBlurNode.h
index 48cd661a7bf..299fe742dd2 100644
--- a/source/blender/compositor/nodes/COM_BokehBlurNode.h
+++ b/source/blender/compositor/nodes/COM_BokehBlurNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief BokehBlurNode
- * @ingroup Node
+ * \brief BokehBlurNode
+ * \ingroup Node
*/
class BokehBlurNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_BokehImageNode.h b/source/blender/compositor/nodes/COM_BokehImageNode.h
index 70f363b8cf6..810602ed5fb 100644
--- a/source/blender/compositor/nodes/COM_BokehImageNode.h
+++ b/source/blender/compositor/nodes/COM_BokehImageNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief BokehImageNode
- * @ingroup Node
+ * \brief BokehImageNode
+ * \ingroup Node
*/
class BokehImageNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_BoxMaskNode.h b/source/blender/compositor/nodes/COM_BoxMaskNode.h
index 01557229be9..f7ce0eed464 100644
--- a/source/blender/compositor/nodes/COM_BoxMaskNode.h
+++ b/source/blender/compositor/nodes/COM_BoxMaskNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief BoxMaskNode
- * @ingroup Node
+ * \brief BoxMaskNode
+ * \ingroup Node
*/
class BoxMaskNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_BrightnessNode.h b/source/blender/compositor/nodes/COM_BrightnessNode.h
index 27155e27774..2625334800e 100644
--- a/source/blender/compositor/nodes/COM_BrightnessNode.h
+++ b/source/blender/compositor/nodes/COM_BrightnessNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief BrightnessNode
- * @ingroup Node
+ * \brief BrightnessNode
+ * \ingroup Node
*/
class BrightnessNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ChannelMatteNode.h b/source/blender/compositor/nodes/COM_ChannelMatteNode.h
index c5f062cb215..84f01c25ef3 100644
--- a/source/blender/compositor/nodes/COM_ChannelMatteNode.h
+++ b/source/blender/compositor/nodes/COM_ChannelMatteNode.h
@@ -25,8 +25,8 @@
#include "COM_Node.h"
/**
- * @brief ChannelMatteNode
- * @ingroup Node
+ * \brief ChannelMatteNode
+ * \ingroup Node
*/
class ChannelMatteNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ChromaMatteNode.h b/source/blender/compositor/nodes/COM_ChromaMatteNode.h
index 7d0b34ecf5d..48488a9be47 100644
--- a/source/blender/compositor/nodes/COM_ChromaMatteNode.h
+++ b/source/blender/compositor/nodes/COM_ChromaMatteNode.h
@@ -25,8 +25,8 @@
#include "COM_Node.h"
/**
- * @brief ChromaMatteNode
- * @ingroup Node
+ * \brief ChromaMatteNode
+ * \ingroup Node
*/
class ChromaMatteNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ColorBalanceNode.h b/source/blender/compositor/nodes/COM_ColorBalanceNode.h
index d203fef20f4..120e745473e 100644
--- a/source/blender/compositor/nodes/COM_ColorBalanceNode.h
+++ b/source/blender/compositor/nodes/COM_ColorBalanceNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief ColorBalanceNode
- * @ingroup Node
+ * \brief ColorBalanceNode
+ * \ingroup Node
*/
class ColorBalanceNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ColorCorrectionNode.h b/source/blender/compositor/nodes/COM_ColorCorrectionNode.h
index fcbd7631cb4..2599983e76c 100644
--- a/source/blender/compositor/nodes/COM_ColorCorrectionNode.h
+++ b/source/blender/compositor/nodes/COM_ColorCorrectionNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief ColorCorrectionNode
- * @ingroup Node
+ * \brief ColorCorrectionNode
+ * \ingroup Node
*/
class ColorCorrectionNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ColorCurveNode.h b/source/blender/compositor/nodes/COM_ColorCurveNode.h
index ad51611d1cf..eb8ff1ae787 100644
--- a/source/blender/compositor/nodes/COM_ColorCurveNode.h
+++ b/source/blender/compositor/nodes/COM_ColorCurveNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief ColorCurveNode
- * @ingroup Node
+ * \brief ColorCurveNode
+ * \ingroup Node
*/
class ColorCurveNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ColorMatteNode.h b/source/blender/compositor/nodes/COM_ColorMatteNode.h
index f2c3c08beea..d2979ab022d 100644
--- a/source/blender/compositor/nodes/COM_ColorMatteNode.h
+++ b/source/blender/compositor/nodes/COM_ColorMatteNode.h
@@ -25,8 +25,8 @@
#include "COM_Node.h"
/**
- * @brief ColorMatteNode
- * @ingroup Node
+ * \brief ColorMatteNode
+ * \ingroup Node
*/
class ColorMatteNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ColorNode.h b/source/blender/compositor/nodes/COM_ColorNode.h
index 205f4d07135..139f50e3848 100644
--- a/source/blender/compositor/nodes/COM_ColorNode.h
+++ b/source/blender/compositor/nodes/COM_ColorNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief ColorNode
- * @ingroup Node
+ * \brief ColorNode
+ * \ingroup Node
*/
class ColorNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ColorRampNode.h b/source/blender/compositor/nodes/COM_ColorRampNode.h
index 4332d831e31..6457828753a 100644
--- a/source/blender/compositor/nodes/COM_ColorRampNode.h
+++ b/source/blender/compositor/nodes/COM_ColorRampNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief ColorRampNode
- * @ingroup Node
+ * \brief ColorRampNode
+ * \ingroup Node
*/
class ColorRampNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ColorSpillNode.h b/source/blender/compositor/nodes/COM_ColorSpillNode.h
index cb2cd8a2ea3..a476163224b 100644
--- a/source/blender/compositor/nodes/COM_ColorSpillNode.h
+++ b/source/blender/compositor/nodes/COM_ColorSpillNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief ColorSpillNode
- * @ingroup Node
+ * \brief ColorSpillNode
+ * \ingroup Node
*/
class ColorSpillNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ColorToBWNode.h b/source/blender/compositor/nodes/COM_ColorToBWNode.h
index 05f937eb555..b4e8493d69b 100644
--- a/source/blender/compositor/nodes/COM_ColorToBWNode.h
+++ b/source/blender/compositor/nodes/COM_ColorToBWNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
#include "DNA_node_types.h"
/**
- * @brief ColorToBWNode
- * @ingroup Node
+ * \brief ColorToBWNode
+ * \ingroup Node
*/
class ColorToBWNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_CompositorNode.h b/source/blender/compositor/nodes/COM_CompositorNode.h
index a21013f2ce2..54c19973134 100644
--- a/source/blender/compositor/nodes/COM_CompositorNode.h
+++ b/source/blender/compositor/nodes/COM_CompositorNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
#include "DNA_node_types.h"
/**
- * @brief CompositorNode
- * @ingroup Node
+ * \brief CompositorNode
+ * \ingroup Node
*/
class CompositorNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ConvertAlphaNode.h b/source/blender/compositor/nodes/COM_ConvertAlphaNode.h
index 37482d66269..3da009aec02 100644
--- a/source/blender/compositor/nodes/COM_ConvertAlphaNode.h
+++ b/source/blender/compositor/nodes/COM_ConvertAlphaNode.h
@@ -25,8 +25,8 @@
#include "COM_Node.h"
/**
- * @brief ConvertAlphaNode
- * @ingroup Node
+ * \brief ConvertAlphaNode
+ * \ingroup Node
*/
class ConvertAlphaNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_CornerPinNode.h b/source/blender/compositor/nodes/COM_CornerPinNode.h
index 63428fa653b..ab89107fe8a 100644
--- a/source/blender/compositor/nodes/COM_CornerPinNode.h
+++ b/source/blender/compositor/nodes/COM_CornerPinNode.h
@@ -29,8 +29,8 @@ extern "C" {
}
/**
- * @brief CornerPinNode
- * @ingroup Node
+ * \brief CornerPinNode
+ * \ingroup Node
*/
class CornerPinNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_CropNode.h b/source/blender/compositor/nodes/COM_CropNode.h
index a7d529c426f..f30acac9fd2 100644
--- a/source/blender/compositor/nodes/COM_CropNode.h
+++ b/source/blender/compositor/nodes/COM_CropNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief CropNode
- * @ingroup Node
+ * \brief CropNode
+ * \ingroup Node
*/
class CropNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_CryptomatteNode.h b/source/blender/compositor/nodes/COM_CryptomatteNode.h
index 2e1784dedb9..f1e446dee20 100644
--- a/source/blender/compositor/nodes/COM_CryptomatteNode.h
+++ b/source/blender/compositor/nodes/COM_CryptomatteNode.h
@@ -25,8 +25,8 @@
#include "COM_Node.h"
/**
- * @brief CryptomatteNode
- * @ingroup Node
+ * \brief CryptomatteNode
+ * \ingroup Node
*/
class CryptomatteNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_DefocusNode.h b/source/blender/compositor/nodes/COM_DefocusNode.h
index 99efdd15b37..d80384ac01f 100644
--- a/source/blender/compositor/nodes/COM_DefocusNode.h
+++ b/source/blender/compositor/nodes/COM_DefocusNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief DefocusNode
- * @ingroup Node
+ * \brief DefocusNode
+ * \ingroup Node
*/
class DefocusNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_DespeckleNode.h b/source/blender/compositor/nodes/COM_DespeckleNode.h
index e8097be35dd..7c91ef2d384 100644
--- a/source/blender/compositor/nodes/COM_DespeckleNode.h
+++ b/source/blender/compositor/nodes/COM_DespeckleNode.h
@@ -24,8 +24,8 @@
#include "COM_Node.h"
/**
- * @brief DespeckleNode
- * @ingroup Node
+ * \brief DespeckleNode
+ * \ingroup Node
*/
class DespeckleNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_DifferenceMatteNode.h b/source/blender/compositor/nodes/COM_DifferenceMatteNode.h
index ea3da8d2fca..d2235c8148d 100644
--- a/source/blender/compositor/nodes/COM_DifferenceMatteNode.h
+++ b/source/blender/compositor/nodes/COM_DifferenceMatteNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief DifferenceMatteNode
- * @ingroup Node
+ * \brief DifferenceMatteNode
+ * \ingroup Node
*/
class DifferenceMatteNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_DilateErodeNode.h b/source/blender/compositor/nodes/COM_DilateErodeNode.h
index aff3ecbb4b0..0033fa558fe 100644
--- a/source/blender/compositor/nodes/COM_DilateErodeNode.h
+++ b/source/blender/compositor/nodes/COM_DilateErodeNode.h
@@ -26,11 +26,11 @@
#include "COM_Node.h"
/**
- * @brief DilateErodeNode
- * @ingroup Node
+ * \brief DilateErodeNode
+ * \ingroup Node
*/
class DilateErodeNode : public Node {
- NodeBlurData m_alpha_blur; /* only used for blurring alpha, since the dilate/erode node doesnt have this */
+ NodeBlurData m_alpha_blur; /* only used for blurring alpha, since the dilate/erode node doesn't have this */
public:
DilateErodeNode(bNode *editorNode);
void convertToOperations(NodeConverter &converter, const CompositorContext &context) const;
diff --git a/source/blender/compositor/nodes/COM_DirectionalBlurNode.h b/source/blender/compositor/nodes/COM_DirectionalBlurNode.h
index eef51e140bc..26e5573e586 100644
--- a/source/blender/compositor/nodes/COM_DirectionalBlurNode.h
+++ b/source/blender/compositor/nodes/COM_DirectionalBlurNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief DirectionalBlurNode
- * @ingroup Node
+ * \brief DirectionalBlurNode
+ * \ingroup Node
*/
class DirectionalBlurNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_DisplaceNode.h b/source/blender/compositor/nodes/COM_DisplaceNode.h
index 28105fd5963..58a77527f5b 100644
--- a/source/blender/compositor/nodes/COM_DisplaceNode.h
+++ b/source/blender/compositor/nodes/COM_DisplaceNode.h
@@ -25,8 +25,8 @@
#include "COM_Node.h"
/**
- * @brief DisplaceNode
- * @ingroup Node
+ * \brief DisplaceNode
+ * \ingroup Node
*/
class DisplaceNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_DistanceMatteNode.h b/source/blender/compositor/nodes/COM_DistanceMatteNode.h
index e7bd3c57dfa..e5976455371 100644
--- a/source/blender/compositor/nodes/COM_DistanceMatteNode.h
+++ b/source/blender/compositor/nodes/COM_DistanceMatteNode.h
@@ -25,8 +25,8 @@
#include "COM_Node.h"
/**
- * @brief DistanceMatteNode
- * @ingroup Node
+ * \brief DistanceMatteNode
+ * \ingroup Node
*/
class DistanceMatteNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.h b/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.h
index 91a23005128..c01772ea533 100644
--- a/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.h
+++ b/source/blender/compositor/nodes/COM_DoubleEdgeMaskNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief DoubleEdgeMaskNode
- * @ingroup Node
+ * \brief DoubleEdgeMaskNode
+ * \ingroup Node
*/
class DoubleEdgeMaskNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_EllipseMaskNode.h b/source/blender/compositor/nodes/COM_EllipseMaskNode.h
index e5e9861b2d9..64f0a319195 100644
--- a/source/blender/compositor/nodes/COM_EllipseMaskNode.h
+++ b/source/blender/compositor/nodes/COM_EllipseMaskNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief EllipseMaskNode
- * @ingroup Node
+ * \brief EllipseMaskNode
+ * \ingroup Node
*/
class EllipseMaskNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_FilterNode.h b/source/blender/compositor/nodes/COM_FilterNode.h
index 0991b256ebb..6b2e0281627 100644
--- a/source/blender/compositor/nodes/COM_FilterNode.h
+++ b/source/blender/compositor/nodes/COM_FilterNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief FilterNode
- * @ingroup Node
+ * \brief FilterNode
+ * \ingroup Node
*/
class FilterNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_FlipNode.cpp b/source/blender/compositor/nodes/COM_FlipNode.cpp
index 2d1b60b784e..98703a22012 100644
--- a/source/blender/compositor/nodes/COM_FlipNode.cpp
+++ b/source/blender/compositor/nodes/COM_FlipNode.cpp
@@ -36,7 +36,7 @@ void FlipNode::convertToOperations(NodeConverter &converter, const CompositorCon
NodeOutput *outputSocket = this->getOutputSocket(0);
FlipOperation *operation = new FlipOperation();
switch (this->getbNode()->custom1) {
- case 0: /// @TODO: I didn't find any constants in the old implementation, should I introduce them.
+ case 0: /// \TODO: I didn't find any constants in the old implementation, should I introduce them.
operation->setFlipX(true);
operation->setFlipY(false);
break;
diff --git a/source/blender/compositor/nodes/COM_FlipNode.h b/source/blender/compositor/nodes/COM_FlipNode.h
index 8c9a78df85d..f13abe3df53 100644
--- a/source/blender/compositor/nodes/COM_FlipNode.h
+++ b/source/blender/compositor/nodes/COM_FlipNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief FlipNode
- * @ingroup Node
+ * \brief FlipNode
+ * \ingroup Node
*/
class FlipNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_GammaNode.h b/source/blender/compositor/nodes/COM_GammaNode.h
index 8b6434b9c6a..97bdeffcaa3 100644
--- a/source/blender/compositor/nodes/COM_GammaNode.h
+++ b/source/blender/compositor/nodes/COM_GammaNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief GammaNode
- * @ingroup Node
+ * \brief GammaNode
+ * \ingroup Node
*/
class GammaNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_GlareNode.h b/source/blender/compositor/nodes/COM_GlareNode.h
index 93f92313835..723e13b7836 100644
--- a/source/blender/compositor/nodes/COM_GlareNode.h
+++ b/source/blender/compositor/nodes/COM_GlareNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief GlareNode
- * @ingroup Node
+ * \brief GlareNode
+ * \ingroup Node
*/
class GlareNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.h b/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.h
index f940a20e0da..d5ff55b6d1f 100644
--- a/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.h
+++ b/source/blender/compositor/nodes/COM_HueSaturationValueCorrectNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief HueSaturationValueCorrectNode
- * @ingroup Node
+ * \brief HueSaturationValueCorrectNode
+ * \ingroup Node
*/
class HueSaturationValueCorrectNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_HueSaturationValueNode.h b/source/blender/compositor/nodes/COM_HueSaturationValueNode.h
index f09164de34f..2d1a3346cc3 100644
--- a/source/blender/compositor/nodes/COM_HueSaturationValueNode.h
+++ b/source/blender/compositor/nodes/COM_HueSaturationValueNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief HueSaturationValueNode
- * @ingroup Node
+ * \brief HueSaturationValueNode
+ * \ingroup Node
*/
class HueSaturationValueNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_IDMaskNode.h b/source/blender/compositor/nodes/COM_IDMaskNode.h
index 8a6e55a946e..7fbcbce204f 100644
--- a/source/blender/compositor/nodes/COM_IDMaskNode.h
+++ b/source/blender/compositor/nodes/COM_IDMaskNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief IDMaskNode
- * @ingroup Node
+ * \brief IDMaskNode
+ * \ingroup Node
*/
class IDMaskNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ImageNode.cpp b/source/blender/compositor/nodes/COM_ImageNode.cpp
index b82de5962e9..251b303b76d 100644
--- a/source/blender/compositor/nodes/COM_ImageNode.cpp
+++ b/source/blender/compositor/nodes/COM_ImageNode.cpp
@@ -78,7 +78,7 @@ void ImageNode::convertToOperations(NodeConverter &converter, const CompositorCo
int framenumber = context.getFramenumber();
int numberOfOutputs = this->getNumberOfOutputSockets();
bool outputStraightAlpha = (editorNode->custom1 & CMP_NODE_IMAGE_USE_STRAIGHT_OUTPUT) != 0;
- BKE_image_user_frame_calc(imageuser, context.getFramenumber(), 0);
+ BKE_image_user_frame_calc(imageuser, context.getFramenumber());
/* force a load, we assume iuser index will be set OK anyway */
if (image && image->type == IMA_TYPE_MULTILAYER) {
bool is_multilayer_ok = false;
diff --git a/source/blender/compositor/nodes/COM_ImageNode.h b/source/blender/compositor/nodes/COM_ImageNode.h
index d8bf3ea3122..11857ed98bf 100644
--- a/source/blender/compositor/nodes/COM_ImageNode.h
+++ b/source/blender/compositor/nodes/COM_ImageNode.h
@@ -30,8 +30,8 @@ extern "C" {
}
/**
- * @brief ImageNode
- * @ingroup Node
+ * \brief ImageNode
+ * \ingroup Node
*/
class ImageNode : public Node {
private:
diff --git a/source/blender/compositor/nodes/COM_InpaintNode.h b/source/blender/compositor/nodes/COM_InpaintNode.h
index dcc563234be..2a57d4f4b50 100644
--- a/source/blender/compositor/nodes/COM_InpaintNode.h
+++ b/source/blender/compositor/nodes/COM_InpaintNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief InpaintNode
- * @ingroup Node
+ * \brief InpaintNode
+ * \ingroup Node
*/
class InpaintNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_InvertNode.h b/source/blender/compositor/nodes/COM_InvertNode.h
index 9ca774e7600..27719dd39db 100644
--- a/source/blender/compositor/nodes/COM_InvertNode.h
+++ b/source/blender/compositor/nodes/COM_InvertNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief InvertNode
- * @ingroup Node
+ * \brief InvertNode
+ * \ingroup Node
*/
class InvertNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_KeyingNode.h b/source/blender/compositor/nodes/COM_KeyingNode.h
index f4a6c02aa56..d712eeb0a8b 100644
--- a/source/blender/compositor/nodes/COM_KeyingNode.h
+++ b/source/blender/compositor/nodes/COM_KeyingNode.h
@@ -24,8 +24,8 @@
#include "COM_Node.h"
/**
- * @brief KeyingNode
- * @ingroup Node
+ * \brief KeyingNode
+ * \ingroup Node
*/
class KeyingNode : public Node {
protected:
diff --git a/source/blender/compositor/nodes/COM_KeyingScreenNode.h b/source/blender/compositor/nodes/COM_KeyingScreenNode.h
index be29b939690..29619a67097 100644
--- a/source/blender/compositor/nodes/COM_KeyingScreenNode.h
+++ b/source/blender/compositor/nodes/COM_KeyingScreenNode.h
@@ -25,8 +25,8 @@
#include "DNA_node_types.h"
/**
- * @brief KeyingScreenNode
- * @ingroup Node
+ * \brief KeyingScreenNode
+ * \ingroup Node
*/
class KeyingScreenNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_LensDistortionNode.h b/source/blender/compositor/nodes/COM_LensDistortionNode.h
index ee0f9f1bc06..40752d3fc9e 100644
--- a/source/blender/compositor/nodes/COM_LensDistortionNode.h
+++ b/source/blender/compositor/nodes/COM_LensDistortionNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief LensDistortionNode
- * @ingroup Node
+ * \brief LensDistortionNode
+ * \ingroup Node
*/
class LensDistortionNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_LuminanceMatteNode.h b/source/blender/compositor/nodes/COM_LuminanceMatteNode.h
index a36e6f2e732..cc57f4a39f1 100644
--- a/source/blender/compositor/nodes/COM_LuminanceMatteNode.h
+++ b/source/blender/compositor/nodes/COM_LuminanceMatteNode.h
@@ -25,8 +25,8 @@
#include "COM_Node.h"
/**
- * @brief LuminanceMatteNode
- * @ingroup Node
+ * \brief LuminanceMatteNode
+ * \ingroup Node
*/
class LuminanceMatteNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_MapRangeNode.h b/source/blender/compositor/nodes/COM_MapRangeNode.h
index 8c2b8d1f807..74bb1e006b3 100644
--- a/source/blender/compositor/nodes/COM_MapRangeNode.h
+++ b/source/blender/compositor/nodes/COM_MapRangeNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
#include "DNA_node_types.h"
/**
- * @brief MapRangeNode
- * @ingroup Node
+ * \brief MapRangeNode
+ * \ingroup Node
*/
class MapRangeNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_MapUVNode.h b/source/blender/compositor/nodes/COM_MapUVNode.h
index 245a31ce83c..04036df6a24 100644
--- a/source/blender/compositor/nodes/COM_MapUVNode.h
+++ b/source/blender/compositor/nodes/COM_MapUVNode.h
@@ -25,8 +25,8 @@
#include "COM_Node.h"
/**
- * @brief MapUVNode
- * @ingroup Node
+ * \brief MapUVNode
+ * \ingroup Node
*/
class MapUVNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_MapValueNode.h b/source/blender/compositor/nodes/COM_MapValueNode.h
index dca1657ce0b..230e8134f24 100644
--- a/source/blender/compositor/nodes/COM_MapValueNode.h
+++ b/source/blender/compositor/nodes/COM_MapValueNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
#include "DNA_node_types.h"
/**
- * @brief MapValueNode
- * @ingroup Node
+ * \brief MapValueNode
+ * \ingroup Node
*/
class MapValueNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_MaskNode.cpp b/source/blender/compositor/nodes/COM_MaskNode.cpp
index be05840f601..7e29674f9aa 100644
--- a/source/blender/compositor/nodes/COM_MaskNode.cpp
+++ b/source/blender/compositor/nodes/COM_MaskNode.cpp
@@ -62,7 +62,6 @@ void MaskNode::convertToOperations(NodeConverter &converter, const CompositorCon
operation->setMask(mask);
operation->setFramenumber(context.getFramenumber());
- operation->setSmooth((bool)(editorNode->custom1 & CMP_NODEFLAG_MASK_AA) != 0);
operation->setFeather((bool)(editorNode->custom1 & CMP_NODEFLAG_MASK_NO_FEATHER) == 0);
if ((editorNode->custom1 & CMP_NODEFLAG_MASK_MOTION_BLUR) &&
diff --git a/source/blender/compositor/nodes/COM_MaskNode.h b/source/blender/compositor/nodes/COM_MaskNode.h
index 834c421ac08..55c47c7a7d2 100644
--- a/source/blender/compositor/nodes/COM_MaskNode.h
+++ b/source/blender/compositor/nodes/COM_MaskNode.h
@@ -28,8 +28,8 @@
#include "DNA_node_types.h"
/**
- * @brief MaskNode
- * @ingroup Node
+ * \brief MaskNode
+ * \ingroup Node
*/
class MaskNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_MathNode.h b/source/blender/compositor/nodes/COM_MathNode.h
index cf92765f6da..86bb1a3f683 100644
--- a/source/blender/compositor/nodes/COM_MathNode.h
+++ b/source/blender/compositor/nodes/COM_MathNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief MathNode
- * @ingroup Node
+ * \brief MathNode
+ * \ingroup Node
*/
class MathNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_MixNode.h b/source/blender/compositor/nodes/COM_MixNode.h
index 10954080a51..d9edc9e570a 100644
--- a/source/blender/compositor/nodes/COM_MixNode.h
+++ b/source/blender/compositor/nodes/COM_MixNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
#include "DNA_node_types.h"
/**
- * @brief MixNode
- * @ingroup Node
+ * \brief MixNode
+ * \ingroup Node
*/
class MixNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_MovieClipNode.h b/source/blender/compositor/nodes/COM_MovieClipNode.h
index 78fcf24de35..addee1a4ff8 100644
--- a/source/blender/compositor/nodes/COM_MovieClipNode.h
+++ b/source/blender/compositor/nodes/COM_MovieClipNode.h
@@ -27,8 +27,8 @@
#include "DNA_node_types.h"
/**
- * @brief MovieClipNode
- * @ingroup Node
+ * \brief MovieClipNode
+ * \ingroup Node
*/
class MovieClipNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_MovieDistortionNode.h b/source/blender/compositor/nodes/COM_MovieDistortionNode.h
index 97cfaec57c8..59a8980beda 100644
--- a/source/blender/compositor/nodes/COM_MovieDistortionNode.h
+++ b/source/blender/compositor/nodes/COM_MovieDistortionNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief MovieDistortionNode
- * @ingroup Node
+ * \brief MovieDistortionNode
+ * \ingroup Node
*/
class MovieDistortionNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_NormalNode.h b/source/blender/compositor/nodes/COM_NormalNode.h
index 4e1dbe55360..74422007e0e 100644
--- a/source/blender/compositor/nodes/COM_NormalNode.h
+++ b/source/blender/compositor/nodes/COM_NormalNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief NormalNode
- * @ingroup Node
+ * \brief NormalNode
+ * \ingroup Node
*/
class NormalNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_NormalizeNode.h b/source/blender/compositor/nodes/COM_NormalizeNode.h
index 02f413c6ae4..540fbfcfb7b 100644
--- a/source/blender/compositor/nodes/COM_NormalizeNode.h
+++ b/source/blender/compositor/nodes/COM_NormalizeNode.h
@@ -25,8 +25,8 @@
#include "COM_Node.h"
/**
- * @brief NormalizeNode
- * @ingroup Node
+ * \brief NormalizeNode
+ * \ingroup Node
*/
class NormalizeNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_OutputFileNode.h b/source/blender/compositor/nodes/COM_OutputFileNode.h
index b246dd2a541..562e8ca5b9f 100644
--- a/source/blender/compositor/nodes/COM_OutputFileNode.h
+++ b/source/blender/compositor/nodes/COM_OutputFileNode.h
@@ -28,8 +28,8 @@
#include "DNA_node_types.h"
/**
- * @brief OutputFileNode
- * @ingroup Node
+ * \brief OutputFileNode
+ * \ingroup Node
*/
class OutputFileNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_PixelateNode.h b/source/blender/compositor/nodes/COM_PixelateNode.h
index b43c15b01da..c31a09a0cbe 100644
--- a/source/blender/compositor/nodes/COM_PixelateNode.h
+++ b/source/blender/compositor/nodes/COM_PixelateNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief PixelateNode
- * @ingroup Node
+ * \brief PixelateNode
+ * \ingroup Node
*/
class PixelateNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_PlaneTrackDeformNode.h b/source/blender/compositor/nodes/COM_PlaneTrackDeformNode.h
index 653100ce6a4..4e3445b1581 100644
--- a/source/blender/compositor/nodes/COM_PlaneTrackDeformNode.h
+++ b/source/blender/compositor/nodes/COM_PlaneTrackDeformNode.h
@@ -27,8 +27,8 @@ extern "C" {
}
/**
- * @brief PlaneTrackDeformNode
- * @ingroup Node
+ * \brief PlaneTrackDeformNode
+ * \ingroup Node
*/
class PlaneTrackDeformNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_RenderLayersNode.h b/source/blender/compositor/nodes/COM_RenderLayersNode.h
index edbc91fff70..0ecf4c60c43 100644
--- a/source/blender/compositor/nodes/COM_RenderLayersNode.h
+++ b/source/blender/compositor/nodes/COM_RenderLayersNode.h
@@ -27,8 +27,8 @@
struct Render;
/**
- * @brief RenderLayersNode
- * @ingroup Node
+ * \brief RenderLayersNode
+ * \ingroup Node
*/
class RenderLayersNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_RotateNode.h b/source/blender/compositor/nodes/COM_RotateNode.h
index e3c9710891b..77d3879e530 100644
--- a/source/blender/compositor/nodes/COM_RotateNode.h
+++ b/source/blender/compositor/nodes/COM_RotateNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief RotateNode
- * @ingroup Node
+ * \brief RotateNode
+ * \ingroup Node
*/
class RotateNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ScaleNode.h b/source/blender/compositor/nodes/COM_ScaleNode.h
index b1695aab966..2ae07e5ab9b 100644
--- a/source/blender/compositor/nodes/COM_ScaleNode.h
+++ b/source/blender/compositor/nodes/COM_ScaleNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief ScaleNode
- * @ingroup Node
+ * \brief ScaleNode
+ * \ingroup Node
*/
class ScaleNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_SetAlphaNode.h b/source/blender/compositor/nodes/COM_SetAlphaNode.h
index f71d743c1d4..f5482c91f13 100644
--- a/source/blender/compositor/nodes/COM_SetAlphaNode.h
+++ b/source/blender/compositor/nodes/COM_SetAlphaNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief SetAlphaNode
- * @ingroup Node
+ * \brief SetAlphaNode
+ * \ingroup Node
*/
class SetAlphaNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_SocketProxyNode.h b/source/blender/compositor/nodes/COM_SocketProxyNode.h
index ce19a9abd7d..2cf4c4afac5 100644
--- a/source/blender/compositor/nodes/COM_SocketProxyNode.h
+++ b/source/blender/compositor/nodes/COM_SocketProxyNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief SocketProxyNode
- * @ingroup Node
+ * \brief SocketProxyNode
+ * \ingroup Node
*/
class SocketProxyNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_SplitViewerNode.h b/source/blender/compositor/nodes/COM_SplitViewerNode.h
index c073713f21f..695313e5d9c 100644
--- a/source/blender/compositor/nodes/COM_SplitViewerNode.h
+++ b/source/blender/compositor/nodes/COM_SplitViewerNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
#include "DNA_node_types.h"
/**
- * @brief SplitViewerNode
- * @ingroup Node
+ * \brief SplitViewerNode
+ * \ingroup Node
*/
class SplitViewerNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_Stabilize2dNode.h b/source/blender/compositor/nodes/COM_Stabilize2dNode.h
index 2859432fac7..4c45b2f6db0 100644
--- a/source/blender/compositor/nodes/COM_Stabilize2dNode.h
+++ b/source/blender/compositor/nodes/COM_Stabilize2dNode.h
@@ -27,8 +27,8 @@
#include "DNA_node_types.h"
/**
- * @brief Stabilize2dNode
- * @ingroup Node
+ * \brief Stabilize2dNode
+ * \ingroup Node
*/
class Stabilize2dNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_SunBeamsNode.h b/source/blender/compositor/nodes/COM_SunBeamsNode.h
index 425b97061ca..bb8c2e5defc 100644
--- a/source/blender/compositor/nodes/COM_SunBeamsNode.h
+++ b/source/blender/compositor/nodes/COM_SunBeamsNode.h
@@ -25,8 +25,8 @@
#include "COM_Node.h"
/**
- * @brief SunBeamsNode
- * @ingroup Node
+ * \brief SunBeamsNode
+ * \ingroup Node
*/
class SunBeamsNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_SwitchNode.h b/source/blender/compositor/nodes/COM_SwitchNode.h
index 5967bbd5dd0..96abef60f21 100644
--- a/source/blender/compositor/nodes/COM_SwitchNode.h
+++ b/source/blender/compositor/nodes/COM_SwitchNode.h
@@ -27,8 +27,8 @@
#include "COM_NodeOperation.h"
#include "DNA_node_types.h"
/**
- * @brief SwitchNode
- * @ingroup Node
+ * \brief SwitchNode
+ * \ingroup Node
*/
class SwitchNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_SwitchViewNode.h b/source/blender/compositor/nodes/COM_SwitchViewNode.h
index f4171940880..9a89103a11e 100644
--- a/source/blender/compositor/nodes/COM_SwitchViewNode.h
+++ b/source/blender/compositor/nodes/COM_SwitchViewNode.h
@@ -26,8 +26,8 @@
#include "COM_NodeOperation.h"
#include "DNA_node_types.h"
/**
- * @brief SwitchViewNode
- * @ingroup Node
+ * \brief SwitchViewNode
+ * \ingroup Node
*/
class SwitchViewNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_TextureNode.h b/source/blender/compositor/nodes/COM_TextureNode.h
index 4809f8a781e..206b1ab102b 100644
--- a/source/blender/compositor/nodes/COM_TextureNode.h
+++ b/source/blender/compositor/nodes/COM_TextureNode.h
@@ -24,8 +24,8 @@
#include "DNA_node_types.h"
/**
- * @brief TextureNode
- * @ingroup Node
+ * \brief TextureNode
+ * \ingroup Node
*/
class TextureNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_TimeNode.h b/source/blender/compositor/nodes/COM_TimeNode.h
index 7ebc6f2cc67..7d5eef7434e 100644
--- a/source/blender/compositor/nodes/COM_TimeNode.h
+++ b/source/blender/compositor/nodes/COM_TimeNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief TimeNode
- * @ingroup Node
+ * \brief TimeNode
+ * \ingroup Node
*/
class TimeNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_TonemapNode.h b/source/blender/compositor/nodes/COM_TonemapNode.h
index 13e51acf3fe..309cd56e580 100644
--- a/source/blender/compositor/nodes/COM_TonemapNode.h
+++ b/source/blender/compositor/nodes/COM_TonemapNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief TonemapNode
- * @ingroup Node
+ * \brief TonemapNode
+ * \ingroup Node
*/
class TonemapNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_TrackPositionNode.h b/source/blender/compositor/nodes/COM_TrackPositionNode.h
index 375e28b6f8f..04c3814605a 100644
--- a/source/blender/compositor/nodes/COM_TrackPositionNode.h
+++ b/source/blender/compositor/nodes/COM_TrackPositionNode.h
@@ -25,8 +25,8 @@
#include "DNA_node_types.h"
/**
- * @brief TrackPositionNode
- * @ingroup Node
+ * \brief TrackPositionNode
+ * \ingroup Node
*/
class TrackPositionNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_TransformNode.h b/source/blender/compositor/nodes/COM_TransformNode.h
index 9a7c415cc5d..ad1935dcf23 100644
--- a/source/blender/compositor/nodes/COM_TransformNode.h
+++ b/source/blender/compositor/nodes/COM_TransformNode.h
@@ -27,8 +27,8 @@
#include "DNA_node_types.h"
/**
- * @brief TransformNode
- * @ingroup Node
+ * \brief TransformNode
+ * \ingroup Node
*/
class TransformNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_TranslateNode.h b/source/blender/compositor/nodes/COM_TranslateNode.h
index 51d969dbb04..535bd11c3b7 100644
--- a/source/blender/compositor/nodes/COM_TranslateNode.h
+++ b/source/blender/compositor/nodes/COM_TranslateNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief TranslateNode
- * @ingroup Node
+ * \brief TranslateNode
+ * \ingroup Node
*/
class TranslateNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ValueNode.h b/source/blender/compositor/nodes/COM_ValueNode.h
index e1b13c2d8aa..b7d80bcf393 100644
--- a/source/blender/compositor/nodes/COM_ValueNode.h
+++ b/source/blender/compositor/nodes/COM_ValueNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief ValueNode
- * @ingroup Node
+ * \brief ValueNode
+ * \ingroup Node
*/
class ValueNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_VectorBlurNode.h b/source/blender/compositor/nodes/COM_VectorBlurNode.h
index 5f741ff0852..93249a327fa 100644
--- a/source/blender/compositor/nodes/COM_VectorBlurNode.h
+++ b/source/blender/compositor/nodes/COM_VectorBlurNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief VectorBlurNode
- * @ingroup Node
+ * \brief VectorBlurNode
+ * \ingroup Node
*/
class VectorBlurNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_VectorCurveNode.h b/source/blender/compositor/nodes/COM_VectorCurveNode.h
index d8a2121a7c6..a95d505fa6d 100644
--- a/source/blender/compositor/nodes/COM_VectorCurveNode.h
+++ b/source/blender/compositor/nodes/COM_VectorCurveNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief VectorCurveNode
- * @ingroup Node
+ * \brief VectorCurveNode
+ * \ingroup Node
*/
class VectorCurveNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ViewLevelsNode.h b/source/blender/compositor/nodes/COM_ViewLevelsNode.h
index 7fca060389a..b5b8a386051 100644
--- a/source/blender/compositor/nodes/COM_ViewLevelsNode.h
+++ b/source/blender/compositor/nodes/COM_ViewLevelsNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief ViewLevelsNode
- * @ingroup Node
+ * \brief ViewLevelsNode
+ * \ingroup Node
*/
class ViewLevelsNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ViewerNode.h b/source/blender/compositor/nodes/COM_ViewerNode.h
index 67d6387a17c..666bb55b6a5 100644
--- a/source/blender/compositor/nodes/COM_ViewerNode.h
+++ b/source/blender/compositor/nodes/COM_ViewerNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
#include "DNA_node_types.h"
/**
- * @brief ViewerNode
- * @ingroup Node
+ * \brief ViewerNode
+ * \ingroup Node
*/
class ViewerNode : public Node {
public:
diff --git a/source/blender/compositor/nodes/COM_ZCombineNode.h b/source/blender/compositor/nodes/COM_ZCombineNode.h
index 8e166ddf168..ee3558cd58f 100644
--- a/source/blender/compositor/nodes/COM_ZCombineNode.h
+++ b/source/blender/compositor/nodes/COM_ZCombineNode.h
@@ -26,8 +26,8 @@
#include "COM_Node.h"
/**
- * @brief ZCombineNode
- * @ingroup Node
+ * \brief ZCombineNode
+ * \ingroup Node
*/
class ZCombineNode : public Node {
public:
diff --git a/source/blender/compositor/operations/COM_AntiAliasOperation.h b/source/blender/compositor/operations/COM_AntiAliasOperation.h
index 34243cd34b6..25781196b1f 100644
--- a/source/blender/compositor/operations/COM_AntiAliasOperation.h
+++ b/source/blender/compositor/operations/COM_AntiAliasOperation.h
@@ -26,14 +26,14 @@
#include "DNA_node_types.h"
/**
- * @brief AntiAlias operations
+ * \brief AntiAlias operations
* it only supports anti aliasing on BW buffers.
- * @ingroup operation
+ * \ingroup operation
*/
class AntiAliasOperation : public NodeOperation {
protected:
/**
- * @brief Cached reference to the reader
+ * \brief Cached reference to the reader
*/
SocketReader *m_valueReader;
public:
diff --git a/source/blender/compositor/operations/COM_BokehImageOperation.h b/source/blender/compositor/operations/COM_BokehImageOperation.h
index c6ca7054352..d26f3f7066c 100644
--- a/source/blender/compositor/operations/COM_BokehImageOperation.h
+++ b/source/blender/compositor/operations/COM_BokehImageOperation.h
@@ -25,7 +25,7 @@
#include "COM_NodeOperation.h"
/**
- * @brief The BokehImageOperation class is an operation that creates an image useful to mimic the internals
+ * \brief The BokehImageOperation class is an operation that creates an image useful to mimic the internals
*of a camera.
*
* features:
@@ -53,91 +53,91 @@
class BokehImageOperation : public NodeOperation {
private:
/**
- * @brief Settings of the bokeh image
+ * \brief Settings of the bokeh image
*/
NodeBokehImage *m_data;
/**
- * @brief precalced center of the image
+ * \brief precalced center of the image
*/
float m_center[2];
/**
- * @brief 1.0-rounding
+ * \brief 1.0-rounding
*/
float m_inverseRounding;
/**
- * @brief distance of a full circle lens
+ * \brief distance of a full circle lens
*/
float m_circularDistance;
/**
- * @brief radius when the first flap starts
+ * \brief radius when the first flap starts
*/
float m_flapRad;
/**
- * @brief radians of a single flap
+ * \brief radians of a single flap
*/
float m_flapRadAdd;
/**
- * @brief should the m_data field by deleted when this operation is finished
+ * \brief should the m_data field by deleted when this operation is finished
*/
bool m_deleteData;
/**
- * @brief determine the coordinate of a flap cornder
+ * \brief determine the coordinate of a flap cornder
*
- * @param r result in bokehimage space are stored [x,y]
- * @param flapNumber the flap number to calculate
- * @param distance the lens distance is used to simulate lens shifts
+ * \param r result in bokehimage space are stored [x,y]
+ * \param flapNumber the flap number to calculate
+ * \param distance the lens distance is used to simulate lens shifts
*/
void detemineStartPointOfFlap(float r[2], int flapNumber, float distance);
/**
- * @brief Determine if a coordinate is inside the bokeh image
+ * \brief Determine if a coordinate is inside the bokeh image
*
- * @param distance the distance that will be used. This parameter is modified a bit to mimic lens shifts
- * @param x the x coordinate of the pixel to evaluate
- * @param y the y coordinate of the pixel to evaluate
- * @return float range 0..1 0 is completely outside
+ * \param distance the distance that will be used. This parameter is modified a bit to mimic lens shifts
+ * \param x the x coordinate of the pixel to evaluate
+ * \param y the y coordinate of the pixel to evaluate
+ * \return float range 0..1 0 is completely outside
*/
float isInsideBokeh(float distance, float x, float y);
public:
BokehImageOperation();
/**
- * @brief the inner loop of this program
+ * \brief the inner loop of this program
*/
void executePixelSampled(float output[4], float x, float y, PixelSampler sampler);
/**
- * @brief Initialize the execution
+ * \brief Initialize the execution
*/
void initExecution();
/**
- * @brief Deinitialize the execution
+ * \brief Deinitialize the execution
*/
void deinitExecution();
/**
- * @brief determine the resolution of this operation. currently fixed at [COM_BLUR_BOKEH_PIXELS, COM_BLUR_BOKEH_PIXELS]
- * @param resolution
- * @param preferredResolution
+ * \brief determine the resolution of this operation. currently fixed at [COM_BLUR_BOKEH_PIXELS, COM_BLUR_BOKEH_PIXELS]
+ * \param resolution
+ * \param preferredResolution
*/
void determineResolution(unsigned int resolution[2], unsigned int preferredResolution[2]);
/**
- * @brief set the node data
- * @param data
+ * \brief set the node data
+ * \param data
*/
void setData(NodeBokehImage *data) { this->m_data = data; }
/**
- * @brief deleteDataOnFinish
+ * \brief deleteDataOnFinish
*
* There are cases that the compositor uses this operation on its own (see defocus node)
* the deleteDataOnFinish must only be called when the data has been created by the compositor.
diff --git a/source/blender/compositor/operations/COM_CalculateMeanOperation.h b/source/blender/compositor/operations/COM_CalculateMeanOperation.h
index 1872cb738b2..265057b6536 100644
--- a/source/blender/compositor/operations/COM_CalculateMeanOperation.h
+++ b/source/blender/compositor/operations/COM_CalculateMeanOperation.h
@@ -26,13 +26,13 @@
#include "DNA_node_types.h"
/**
- * @brief base class of CalculateMean, implementing the simple CalculateMean
- * @ingroup operation
+ * \brief base class of CalculateMean, implementing the simple CalculateMean
+ * \ingroup operation
*/
class CalculateMeanOperation : public NodeOperation {
protected:
/**
- * @brief Cached reference to the reader
+ * \brief Cached reference to the reader
*/
SocketReader *m_imageReader;
diff --git a/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h
index 7089e40b210..2d357f30f7b 100644
--- a/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h
+++ b/source/blender/compositor/operations/COM_CalculateStandardDeviationOperation.h
@@ -26,8 +26,8 @@
#include "DNA_node_types.h"
#include "COM_CalculateMeanOperation.h"
/**
- * @brief base class of CalculateStandardDeviation, implementing the simple CalculateStandardDeviation
- * @ingroup operation
+ * \brief base class of CalculateStandardDeviation, implementing the simple CalculateStandardDeviation
+ * \ingroup operation
*/
class CalculateStandardDeviationOperation : public CalculateMeanOperation {
protected:
diff --git a/source/blender/compositor/operations/COM_CompositorOperation.cpp b/source/blender/compositor/operations/COM_CompositorOperation.cpp
index 16e33c908d6..24846f738dd 100644
--- a/source/blender/compositor/operations/COM_CompositorOperation.cpp
+++ b/source/blender/compositor/operations/COM_CompositorOperation.cpp
@@ -94,6 +94,7 @@ void CompositorOperation::deinitExecution()
MEM_freeN(rv->rectz);
}
rv->rectz = this->m_depthBuffer;
+ rr->have_combined = true;
}
else {
if (this->m_outputBuffer) {
diff --git a/source/blender/compositor/operations/COM_CompositorOperation.h b/source/blender/compositor/operations/COM_CompositorOperation.h
index 19ed3180ace..1a3553d14b4 100644
--- a/source/blender/compositor/operations/COM_CompositorOperation.h
+++ b/source/blender/compositor/operations/COM_CompositorOperation.h
@@ -29,63 +29,63 @@
struct Scene;
/**
- * @brief Compositor output operation
+ * \brief Compositor output operation
*/
class CompositorOperation : public NodeOperation {
private:
const struct Scene *m_scene;
/**
- * @brief Scene name, used for getting the render output, includes 'SC' prefix.
+ * \brief Scene name, used for getting the render output, includes 'SC' prefix.
*/
char m_sceneName[MAX_ID_NAME];
/**
- * @brief local reference to the scene
+ * \brief local reference to the scene
*/
const RenderData *m_rd;
/**
- * @brief reference to the output float buffer
+ * \brief reference to the output float buffer
*/
float *m_outputBuffer;
/**
- * @brief reference to the output depth float buffer
+ * \brief reference to the output depth float buffer
*/
float *m_depthBuffer;
/**
- * @brief local reference to the input image operation
+ * \brief local reference to the input image operation
*/
SocketReader *m_imageInput;
/**
- * @brief local reference to the input alpha operation
+ * \brief local reference to the input alpha operation
*/
SocketReader *m_alphaInput;
/**
- * @brief local reference to the depth operation
+ * \brief local reference to the depth operation
*/
SocketReader *m_depthInput;
/**
- * @brief Ignore any alpha input
+ * \brief Ignore any alpha input
*/
bool m_useAlphaInput;
/**
- * @brief operation is active for calculating final compo result
+ * \brief operation is active for calculating final compo result
*/
bool m_active;
/**
- * @brief View name, used for multiview
+ * \brief View name, used for multiview
*/
const char *m_viewName;
public:
CompositorOperation();
- const bool isActiveCompositorOutput() const { return this->m_active; }
+ bool isActiveCompositorOutput() const { return this->m_active; }
void executeRegion(rcti *rect, unsigned int tileNumber);
void setScene(const struct Scene *scene) { m_scene = scene; }
void setSceneName(const char *sceneName) { BLI_strncpy(this->m_sceneName, sceneName, sizeof(this->m_sceneName)); }
@@ -94,7 +94,7 @@ public:
bool isOutputOperation(bool /*rendering*/) const { return this->isActiveCompositorOutput(); }
void initExecution();
void deinitExecution();
- const CompositorPriority getRenderPriority() const { return COM_PRIORITY_MEDIUM; }
+ CompositorPriority getRenderPriority() const { return COM_PRIORITY_MEDIUM; }
void determineResolution(unsigned int resolution[2], unsigned int preferredResolution[2]);
void setUseAlphaInput(bool value) { this->m_useAlphaInput = value; }
void setActive(bool active) { this->m_active = active; }
diff --git a/source/blender/compositor/operations/COM_ConvertColorProfileOperation.h b/source/blender/compositor/operations/COM_ConvertColorProfileOperation.h
index 3dc7b67df8d..3b7272e86f6 100644
--- a/source/blender/compositor/operations/COM_ConvertColorProfileOperation.h
+++ b/source/blender/compositor/operations/COM_ConvertColorProfileOperation.h
@@ -37,17 +37,17 @@ private:
SocketReader *m_inputOperation;
/**
- * @brief color profile where to convert from
+ * \brief color profile where to convert from
*/
int m_fromProfile;
/**
- * @brief color profile where to convert to
+ * \brief color profile where to convert to
*/
int m_toProfile;
/**
- * @brief is color predivided
+ * \brief is color predivided
*/
bool m_predivided;
public:
diff --git a/source/blender/compositor/operations/COM_DotproductOperation.cpp b/source/blender/compositor/operations/COM_DotproductOperation.cpp
index e2e54ee4aa7..a0cde948d25 100644
--- a/source/blender/compositor/operations/COM_DotproductOperation.cpp
+++ b/source/blender/compositor/operations/COM_DotproductOperation.cpp
@@ -43,7 +43,7 @@ void DotproductOperation::deinitExecution()
this->m_input2Operation = NULL;
}
-/** @todo: current implementation is the inverse of a dotproduct. not 'logically' correct
+/** \todo: current implementation is the inverse of a dotproduct. not 'logically' correct
*/
void DotproductOperation::executePixelSampled(float output[4], float x, float y, PixelSampler sampler)
{
diff --git a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp
index d570424cb69..c3fc632c05d 100644
--- a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp
+++ b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp
@@ -128,7 +128,7 @@ void FastGaussianBlurOperation::IIR_gauss(MemoryBuffer *src, float sigma, unsign
if ((xy < 1) || (xy > 3)) xy = 3;
// XXX The YVV macro defined below explicitly expects sources of at least 3x3 pixels,
- // so just skiping blur along faulty direction if src's def is below that limit!
+ // so just skipping blur along faulty direction if src's def is below that limit!
if (src_width < 3) xy &= ~1;
if (src_height < 3) xy &= ~2;
if (xy < 1) return;
diff --git a/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.h b/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.h
index 985f56e3ef6..50b3d68426c 100644
--- a/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.h
+++ b/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.h
@@ -38,17 +38,17 @@ public:
GaussianAlphaXBlurOperation();
/**
- * @brief the inner loop of this program
+ * \brief the inner loop of this program
*/
void executePixel(float output[4], int x, int y, void *data);
/**
- * @brief initialize the execution
+ * \brief initialize the execution
*/
void initExecution();
/**
- * @brief Deinitialize the execution
+ * \brief Deinitialize the execution
*/
void deinitExecution();
diff --git a/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.h b/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.h
index 3935dcd6568..30672ad5ab2 100644
--- a/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.h
+++ b/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.h
@@ -43,7 +43,7 @@ public:
void executePixel(float output[4], int x, int y, void *data);
/**
- * @brief initialize the execution
+ * \brief initialize the execution
*/
void initExecution();
diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.h b/source/blender/compositor/operations/COM_GaussianXBlurOperation.h
index 88d8ed44de6..6e7c9adbd9b 100644
--- a/source/blender/compositor/operations/COM_GaussianXBlurOperation.h
+++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.h
@@ -37,7 +37,7 @@ public:
GaussianXBlurOperation();
/**
- * @brief the inner loop of this program
+ * \brief the inner loop of this program
*/
void executePixel(float output[4], int x, int y, void *data);
@@ -47,12 +47,12 @@ public:
list<cl_kernel> *clKernelsToCleanUp);
/**
- * @brief initialize the execution
+ * \brief initialize the execution
*/
void initExecution();
/**
- * @brief Deinitialize the execution
+ * \brief Deinitialize the execution
*/
void deinitExecution();
diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.h b/source/blender/compositor/operations/COM_GaussianYBlurOperation.h
index 5df77eb28ce..00f9ebcd21f 100644
--- a/source/blender/compositor/operations/COM_GaussianYBlurOperation.h
+++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.h
@@ -47,7 +47,7 @@ public:
list<cl_kernel> *clKernelsToCleanUp);
/**
- * @brief initialize the execution
+ * \brief initialize the execution
*/
void initExecution();
diff --git a/source/blender/compositor/operations/COM_GlareBaseOperation.h b/source/blender/compositor/operations/COM_GlareBaseOperation.h
index 3fa676f4d31..413d495f670 100644
--- a/source/blender/compositor/operations/COM_GlareBaseOperation.h
+++ b/source/blender/compositor/operations/COM_GlareBaseOperation.h
@@ -39,12 +39,12 @@ typedef float fRGB[4];
class GlareBaseOperation : public SingleThreadedOperation {
private:
/**
- * @brief Cached reference to the inputProgram
+ * \brief Cached reference to the inputProgram
*/
SocketReader *m_inputProgram;
/**
- * @brief settings of the glare node.
+ * \brief settings of the glare node.
*/
NodeGlare *m_settings;
public:
diff --git a/source/blender/compositor/operations/COM_GlareThresholdOperation.h b/source/blender/compositor/operations/COM_GlareThresholdOperation.h
index 9a922a5889c..7934dd20524 100644
--- a/source/blender/compositor/operations/COM_GlareThresholdOperation.h
+++ b/source/blender/compositor/operations/COM_GlareThresholdOperation.h
@@ -28,12 +28,12 @@
class GlareThresholdOperation : public NodeOperation {
private:
/**
- * @brief Cached reference to the inputProgram
+ * \brief Cached reference to the inputProgram
*/
SocketReader *m_inputProgram;
/**
- * @brief settings of the glare node.
+ * \brief settings of the glare node.
*/
NodeGlare *m_settings;
public:
diff --git a/source/blender/compositor/operations/COM_ImageOperation.h b/source/blender/compositor/operations/COM_ImageOperation.h
index 60172eb6413..40928484dbb 100644
--- a/source/blender/compositor/operations/COM_ImageOperation.h
+++ b/source/blender/compositor/operations/COM_ImageOperation.h
@@ -35,7 +35,7 @@ extern "C" {
}
/**
- * @brief Base class for all image operations
+ * \brief Base class for all image operations
*/
class BaseImageOperation : public NodeOperation {
protected:
diff --git a/source/blender/compositor/operations/COM_MapValueOperation.h b/source/blender/compositor/operations/COM_MapValueOperation.h
index 33513c6f39c..c057ffe606a 100644
--- a/source/blender/compositor/operations/COM_MapValueOperation.h
+++ b/source/blender/compositor/operations/COM_MapValueOperation.h
@@ -58,7 +58,7 @@ public:
void deinitExecution();
/**
- * @brief set the TexMapping settings
+ * \brief set the TexMapping settings
*/
void setSettings(TexMapping *settings) { this->m_settings = settings; }
diff --git a/source/blender/compositor/operations/COM_MaskOperation.cpp b/source/blender/compositor/operations/COM_MaskOperation.cpp
index caafdfe8f0c..efc9f6edd5b 100644
--- a/source/blender/compositor/operations/COM_MaskOperation.cpp
+++ b/source/blender/compositor/operations/COM_MaskOperation.cpp
@@ -54,7 +54,7 @@ void MaskOperation::initExecution()
BKE_maskrasterize_handle_init(this->m_rasterMaskHandles[0], this->m_mask,
this->m_maskWidth, this->m_maskHeight,
- true, this->m_do_smooth, this->m_do_feather);
+ true, true, this->m_do_feather);
}
else {
/* make a throw away copy of the mask */
@@ -88,7 +88,7 @@ void MaskOperation::initExecution()
BKE_maskrasterize_handle_init(this->m_rasterMaskHandles[i], mask_temp,
this->m_maskWidth, this->m_maskHeight,
- true, this->m_do_smooth, this->m_do_feather);
+ true, true, this->m_do_feather);
frame_iter += frame_step;
}
diff --git a/source/blender/compositor/operations/COM_MaskOperation.h b/source/blender/compositor/operations/COM_MaskOperation.h
index a586a91682e..02c0e61c31e 100644
--- a/source/blender/compositor/operations/COM_MaskOperation.h
+++ b/source/blender/compositor/operations/COM_MaskOperation.h
@@ -48,7 +48,6 @@ protected:
float m_frame_shutter;
int m_frame_number;
- bool m_do_smooth;
bool m_do_feather;
struct MaskRasterHandle *m_rasterMaskHandles[CMP_NODE_MASK_MBLUR_SAMPLES_MAX];
@@ -80,7 +79,6 @@ public:
this->m_mask_px_ofs[1] = this->m_maskHeightInv * 0.5f;
}
void setFramenumber(int frame_number) { this->m_frame_number = frame_number; }
- void setSmooth(bool smooth) { this->m_do_smooth = smooth; }
void setFeather(bool feather) { this->m_do_feather = feather; }
void setMotionBlurSamples(int samples) { this->m_rasterMaskHandleTot = min(max(1, samples), CMP_NODE_MASK_MBLUR_SAMPLES_MAX); }
diff --git a/source/blender/compositor/operations/COM_NormalizeOperation.h b/source/blender/compositor/operations/COM_NormalizeOperation.h
index de1a23926f4..cebfad5dd17 100644
--- a/source/blender/compositor/operations/COM_NormalizeOperation.h
+++ b/source/blender/compositor/operations/COM_NormalizeOperation.h
@@ -25,18 +25,18 @@
#include "DNA_node_types.h"
/**
- * @brief base class of normalize, implementing the simple normalize
- * @ingroup operation
+ * \brief base class of normalize, implementing the simple normalize
+ * \ingroup operation
*/
class NormalizeOperation : public NodeOperation {
protected:
/**
- * @brief Cached reference to the reader
+ * \brief Cached reference to the reader
*/
SocketReader *m_imageReader;
/**
- * @brief temporarily cache of the execution storage
+ * \brief temporarily cache of the execution storage
* it stores x->min and y->mult
*/
NodeTwoFloats *m_cachedInstance;
diff --git a/source/blender/compositor/operations/COM_OutputFileMultiViewOperation.cpp b/source/blender/compositor/operations/COM_OutputFileMultiViewOperation.cpp
index f7fcf63fabb..c50326e85e2 100644
--- a/source/blender/compositor/operations/COM_OutputFileMultiViewOperation.cpp
+++ b/source/blender/compositor/operations/COM_OutputFileMultiViewOperation.cpp
@@ -26,12 +26,13 @@
#include "COM_OutputFileMultiViewOperation.h"
#include <string.h>
+
#include "BLI_listbase.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
-#include "BKE_image.h"
+
#include "BKE_global.h"
-#include "BKE_library.h"
+#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_scene.h"
diff --git a/source/blender/compositor/operations/COM_OutputFileOperation.cpp b/source/blender/compositor/operations/COM_OutputFileOperation.cpp
index de1a807f137..e2819347808 100644
--- a/source/blender/compositor/operations/COM_OutputFileOperation.cpp
+++ b/source/blender/compositor/operations/COM_OutputFileOperation.cpp
@@ -22,13 +22,15 @@
*/
#include "COM_OutputFileOperation.h"
+
#include <string.h>
+
#include "BLI_listbase.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
-#include "BKE_image.h"
+
#include "BKE_global.h"
-#include "BKE_library.h"
+#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_scene.h"
diff --git a/source/blender/compositor/operations/COM_OutputFileOperation.h b/source/blender/compositor/operations/COM_OutputFileOperation.h
index cc800ca222a..d230eefdd78 100644
--- a/source/blender/compositor/operations/COM_OutputFileOperation.h
+++ b/source/blender/compositor/operations/COM_OutputFileOperation.h
@@ -57,7 +57,7 @@ public:
bool isOutputOperation(bool /*rendering*/) const { return true; }
void initExecution();
void deinitExecution();
- const CompositorPriority getRenderPriority() const { return COM_PRIORITY_LOW; }
+ CompositorPriority getRenderPriority() const { return COM_PRIORITY_LOW; }
bool isFileOutputOperation() const { return true; }
};
@@ -99,7 +99,7 @@ public:
bool isOutputOperation(bool /*rendering*/) const { return true; }
void initExecution();
void deinitExecution();
- const CompositorPriority getRenderPriority() const { return COM_PRIORITY_LOW; }
+ CompositorPriority getRenderPriority() const { return COM_PRIORITY_LOW; }
bool isFileOutputOperation() const { return true; }
};
diff --git a/source/blender/compositor/operations/COM_PixelateOperation.h b/source/blender/compositor/operations/COM_PixelateOperation.h
index 5b08cb429f4..59337f11b54 100644
--- a/source/blender/compositor/operations/COM_PixelateOperation.h
+++ b/source/blender/compositor/operations/COM_PixelateOperation.h
@@ -26,7 +26,7 @@
#include "COM_NodeOperation.h"
/**
- * @brief Pixelate operation
+ * \brief Pixelate operation
*
* The Tile compositor is by default sub-pixel accurate.
* For some setups you don want this.
@@ -35,32 +35,32 @@
class PixelateOperation : public NodeOperation {
private:
/**
- * @brief cached reference to the input operation
+ * \brief cached reference to the input operation
*/
SocketReader *m_inputOperation;
public:
/**
- * @brief PixelateOperation
- * @param dataType the datatype to create this operator for (saves datatype conversions)
+ * \brief PixelateOperation
+ * \param dataType the datatype to create this operator for (saves datatype conversions)
*/
PixelateOperation(DataType dataType);
/**
- * @brief initialization of the execution
+ * \brief initialization of the execution
*/
void initExecution();
/**
- * @brief de-initialization of the execution
+ * \brief de-initialization of the execution
*/
void deinitExecution();
/**
- * @brief executePixel
- * @param output result
- * @param x x-coordinate
- * @param y y-coordinate
- * @param sampler sampler
+ * \brief executePixel
+ * \param output result
+ * \param x x-coordinate
+ * \param y y-coordinate
+ * \param sampler sampler
*/
void executePixelSampled(float output[4], float x, float y, PixelSampler sampler);
};
diff --git a/source/blender/compositor/operations/COM_PreviewOperation.cpp b/source/blender/compositor/operations/COM_PreviewOperation.cpp
index 90e1bba3cd9..91f3dc4e643 100644
--- a/source/blender/compositor/operations/COM_PreviewOperation.cpp
+++ b/source/blender/compositor/operations/COM_PreviewOperation.cpp
@@ -142,7 +142,7 @@ void PreviewOperation::determineResolution(unsigned int resolution[2], unsigned
resolution[1] = height;
}
-const CompositorPriority PreviewOperation::getRenderPriority() const
+CompositorPriority PreviewOperation::getRenderPriority() const
{
return COM_PRIORITY_LOW;
}
diff --git a/source/blender/compositor/operations/COM_PreviewOperation.h b/source/blender/compositor/operations/COM_PreviewOperation.h
index 75317748897..350ecd5e314 100644
--- a/source/blender/compositor/operations/COM_PreviewOperation.h
+++ b/source/blender/compositor/operations/COM_PreviewOperation.h
@@ -33,7 +33,7 @@ protected:
unsigned char *m_outputBuffer;
/**
- * @brief holds reference to the SDNA bNode, where this nodes will render the preview image for
+ * \brief holds reference to the SDNA bNode, where this nodes will render the preview image for
*/
bNodePreview *m_preview;
SocketReader *m_input;
@@ -48,7 +48,7 @@ public:
bool isOutputOperation(bool /*rendering*/) const { return !G.background; }
void initExecution();
void deinitExecution();
- const CompositorPriority getRenderPriority() const;
+ CompositorPriority getRenderPriority() const;
void executeRegion(rcti *rect, unsigned int tileNumber);
void determineResolution(unsigned int resolution[2], unsigned int preferredResolution[2]);
diff --git a/source/blender/compositor/operations/COM_ReadBufferOperation.cpp b/source/blender/compositor/operations/COM_ReadBufferOperation.cpp
index 6e7a32ba5a9..277b3606ff9 100644
--- a/source/blender/compositor/operations/COM_ReadBufferOperation.cpp
+++ b/source/blender/compositor/operations/COM_ReadBufferOperation.cpp
@@ -44,7 +44,7 @@ void ReadBufferOperation::determineResolution(unsigned int resolution[2], unsign
operation->determineResolution(resolution, preferredResolution);
operation->setResolution(resolution);
- /// @todo: may not occur!, but does with blur node
+ /// \todo: may not occur!, but does with blur node
if (this->m_memoryProxy->getExecutor()) {
this->m_memoryProxy->getExecutor()->setResolution(resolution);
}
diff --git a/source/blender/compositor/operations/COM_ReadBufferOperation.h b/source/blender/compositor/operations/COM_ReadBufferOperation.h
index c73acbaf300..4aa6eb7d492 100644
--- a/source/blender/compositor/operations/COM_ReadBufferOperation.h
+++ b/source/blender/compositor/operations/COM_ReadBufferOperation.h
@@ -44,7 +44,7 @@ public:
void executePixelExtend(float output[4], float x, float y, PixelSampler sampler,
MemoryBufferExtend extend_x, MemoryBufferExtend extend_y);
void executePixelFiltered(float output[4], float x, float y, float dx[2], float dy[2]);
- const bool isReadBufferOperation() const { return true; }
+ bool isReadBufferOperation() const { return true; }
void setOffset(unsigned int offset) { this->m_offset = offset; }
unsigned int getOffset() const { return this->m_offset; }
bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output);
diff --git a/source/blender/compositor/operations/COM_RenderLayersProg.h b/source/blender/compositor/operations/COM_RenderLayersProg.h
index 2a0f7efc9f8..b5946d44f74 100644
--- a/source/blender/compositor/operations/COM_RenderLayersProg.h
+++ b/source/blender/compositor/operations/COM_RenderLayersProg.h
@@ -36,7 +36,7 @@ extern "C" {
/**
* Base class for all renderlayeroperations
*
- * @todo: rename to operation.
+ * \todo: rename to operation.
*/
class RenderLayersProg : public NodeOperation {
protected:
@@ -68,7 +68,7 @@ protected:
int m_elementsize;
/**
- * @brief render data used for active rendering
+ * \brief render data used for active rendering
*/
const RenderData *m_rd;
@@ -90,7 +90,7 @@ public:
RenderLayersProg(const char *passName, DataType type, int elementsize);
/**
* setter for the scene field. Will be called from
- * @see RenderLayerNode to set the actual scene where
+ * \see RenderLayerNode to set the actual scene where
* the data will be retrieved from.
*/
void setScene(Scene *scene) { this->m_scene = scene; }
diff --git a/source/blender/compositor/operations/COM_ScaleOperation.cpp b/source/blender/compositor/operations/COM_ScaleOperation.cpp
index b498b359144..ff6b2438e9b 100644
--- a/source/blender/compositor/operations/COM_ScaleOperation.cpp
+++ b/source/blender/compositor/operations/COM_ScaleOperation.cpp
@@ -201,7 +201,7 @@ bool ScaleAbsoluteOperation::determineDependingAreaOfInterest(rcti *input, ReadB
}
-// Absolute fixed siez
+// Absolute fixed size
ScaleFixedSizeOperation::ScaleFixedSizeOperation() : BaseScaleOperation()
{
this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE);
diff --git a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp
index f7b8d285cc2..35290d66444 100644
--- a/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp
+++ b/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp
@@ -62,7 +62,7 @@ void ScreenLensDistortionOperation::initExecution()
this->initMutex();
uint rng_seed = (uint)(PIL_check_seconds_timer_i() & UINT_MAX);
- rng_seed ^= (uint)GET_INT_FROM_POINTER(m_inputProgram);
+ rng_seed ^= (uint)POINTER_AS_INT(m_inputProgram);
this->m_rng = BLI_rng_new(rng_seed);
this->m_cx = 0.5f * (float)getWidth();
diff --git a/source/blender/compositor/operations/COM_SetColorOperation.h b/source/blender/compositor/operations/COM_SetColorOperation.h
index 9a509f6fb0c..a3bd2e30749 100644
--- a/source/blender/compositor/operations/COM_SetColorOperation.h
+++ b/source/blender/compositor/operations/COM_SetColorOperation.h
@@ -39,13 +39,13 @@ public:
*/
SetColorOperation();
- const float getChannel1() { return this->m_color[0]; }
+ float getChannel1() { return this->m_color[0]; }
void setChannel1(float value) { this->m_color[0] = value; }
- const float getChannel2() { return this->m_color[1]; }
+ float getChannel2() { return this->m_color[1]; }
void setChannel2(float value) { this->m_color[1] = value; }
- const float getChannel3() { return this->m_color[2]; }
+ float getChannel3() { return this->m_color[2]; }
void setChannel3(float value) { this->m_color[2] = value; }
- const float getChannel4() { return this->m_color[3]; }
+ float getChannel4() { return this->m_color[3]; }
void setChannel4(const float value) { this->m_color[3] = value; }
void setChannels(const float value[4])
{
diff --git a/source/blender/compositor/operations/COM_SetValueOperation.h b/source/blender/compositor/operations/COM_SetValueOperation.h
index 4e274816f27..0dc7a4cd139 100644
--- a/source/blender/compositor/operations/COM_SetValueOperation.h
+++ b/source/blender/compositor/operations/COM_SetValueOperation.h
@@ -39,7 +39,7 @@ public:
*/
SetValueOperation();
- const float getValue() { return this->m_value; }
+ float getValue() { return this->m_value; }
void setValue(float value) { this->m_value = value; }
diff --git a/source/blender/compositor/operations/COM_SetVectorOperation.h b/source/blender/compositor/operations/COM_SetVectorOperation.h
index ca35784ff9a..98f5d918ec2 100644
--- a/source/blender/compositor/operations/COM_SetVectorOperation.h
+++ b/source/blender/compositor/operations/COM_SetVectorOperation.h
@@ -42,13 +42,13 @@ public:
*/
SetVectorOperation();
- const float getX() { return this->m_x; }
+ float getX() { return this->m_x; }
void setX(float value) { this->m_x = value; }
- const float getY() { return this->m_y; }
+ float getY() { return this->m_y; }
void setY(float value) { this->m_y = value; }
- const float getZ() { return this->m_z; }
+ float getZ() { return this->m_z; }
void setZ(float value) { this->m_z = value; }
- const float getW() { return this->m_w; }
+ float getW() { return this->m_w; }
void setW(float value) { this->m_w = value; }
/**
diff --git a/source/blender/compositor/operations/COM_SunBeamsOperation.cpp b/source/blender/compositor/operations/COM_SunBeamsOperation.cpp
index 40f2ee226ae..fc3dc6acca0 100644
--- a/source/blender/compositor/operations/COM_SunBeamsOperation.cpp
+++ b/source/blender/compositor/operations/COM_SunBeamsOperation.cpp
@@ -141,7 +141,7 @@ struct BufferLineAccumulator {
/**
* Perform the actual accumulation along a ray segment from source to pt.
- * Only pixels withing dist_min..dist_max contribute.
+ * Only pixels within dist_min..dist_max contribute.
*
* The loop runs backwards(!) over the primary sector space axis u, i.e. increasing distance to pt.
* After each step it decrements v by dv < 1, adding a buffer shift when necessary.
diff --git a/source/blender/compositor/operations/COM_TextureOperation.h b/source/blender/compositor/operations/COM_TextureOperation.h
index 9f0f539800d..434f590a65d 100644
--- a/source/blender/compositor/operations/COM_TextureOperation.h
+++ b/source/blender/compositor/operations/COM_TextureOperation.h
@@ -37,7 +37,7 @@ extern "C" {
/**
* Base class for all renderlayeroperations
*
- * @todo: rename to operation.
+ * \todo: rename to operation.
*/
class TextureBaseOperation : public NodeOperation {
private:
diff --git a/source/blender/compositor/operations/COM_TonemapOperation.h b/source/blender/compositor/operations/COM_TonemapOperation.h
index 2b07ded7305..c205785b023 100644
--- a/source/blender/compositor/operations/COM_TonemapOperation.h
+++ b/source/blender/compositor/operations/COM_TonemapOperation.h
@@ -26,8 +26,8 @@
#include "DNA_node_types.h"
/**
- * @brief temporarily storage during execution of Tonemap
- * @ingroup operation
+ * \brief temporarily storage during execution of Tonemap
+ * \ingroup operation
*/
typedef struct AvgLogLum {
float al;
@@ -38,23 +38,23 @@ typedef struct AvgLogLum {
} AvgLogLum;
/**
- * @brief base class of tonemap, implementing the simple tonemap
- * @ingroup operation
+ * \brief base class of tonemap, implementing the simple tonemap
+ * \ingroup operation
*/
class TonemapOperation : public NodeOperation {
protected:
/**
- * @brief Cached reference to the reader
+ * \brief Cached reference to the reader
*/
SocketReader *m_imageReader;
/**
- * @brief settings of the Tonemap
+ * \brief settings of the Tonemap
*/
NodeTonemap *m_data;
/**
- * @brief temporarily cache of the execution storage
+ * \brief temporarily cache of the execution storage
*/
AvgLogLum *m_cachedInstance;
@@ -85,9 +85,9 @@ public:
};
/**
- * @brief class of tonemap, implementing the photoreceptor tonemap
+ * \brief class of tonemap, implementing the photoreceptor tonemap
* most parts have already been done in TonemapOperation
- * @ingroup operation
+ * \ingroup operation
*/
class PhotoreceptorTonemapOperation : public TonemapOperation {
diff --git a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp
index a252af053cc..b40051440af 100644
--- a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp
+++ b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp
@@ -288,7 +288,7 @@ void InverseSearchRadiusOperation::initExecution()
void *InverseSearchRadiusOperation::initializeTileData(rcti *rect)
{
- MemoryBuffer * data = new MemoryBuffer(COM_DT_COLOR, rect);
+ MemoryBuffer *data = new MemoryBuffer(COM_DT_COLOR, rect);
float *buffer = data->getBuffer();
int x, y;
int width = this->m_inputRadius->getWidth();
diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.cpp b/source/blender/compositor/operations/COM_VectorBlurOperation.cpp
index d14d745d049..76550bf4119 100644
--- a/source/blender/compositor/operations/COM_VectorBlurOperation.cpp
+++ b/source/blender/compositor/operations/COM_VectorBlurOperation.cpp
@@ -761,7 +761,7 @@ void zbuf_accumulate_vecblur(
}
/* blend with a falloff. this fixes the ugly effect you get with
- * a fast moving object. then it looks like a solid object overlayed
+ * a fast moving object. then it looks like a solid object overlaid
* over a very transparent moving version of itself. in reality, the
* whole object should become transparent if it is moving fast, be
* we don't know what is behind it so we don't do that. this hack
diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.h b/source/blender/compositor/operations/COM_VectorBlurOperation.h
index a33761166c6..fe8e9f20edb 100644
--- a/source/blender/compositor/operations/COM_VectorBlurOperation.h
+++ b/source/blender/compositor/operations/COM_VectorBlurOperation.h
@@ -29,14 +29,14 @@
class VectorBlurOperation : public NodeOperation, public QualityStepHelper {
private:
/**
- * @brief Cached reference to the inputProgram
+ * \brief Cached reference to the inputProgram
*/
SocketReader *m_inputImageProgram;
SocketReader *m_inputSpeedProgram;
SocketReader *m_inputZProgram;
/**
- * @brief settings of the glare node.
+ * \brief settings of the glare node.
*/
NodeBlurData *m_settings;
diff --git a/source/blender/compositor/operations/COM_ViewerOperation.cpp b/source/blender/compositor/operations/COM_ViewerOperation.cpp
index 51fd5d4dc76..25167eeab9f 100644
--- a/source/blender/compositor/operations/COM_ViewerOperation.cpp
+++ b/source/blender/compositor/operations/COM_ViewerOperation.cpp
@@ -188,7 +188,7 @@ void ViewerOperation::updateImage(rcti *rect)
this->updateDraw();
}
-const CompositorPriority ViewerOperation::getRenderPriority() const
+CompositorPriority ViewerOperation::getRenderPriority() const
{
if (this->isActiveViewerOutput()) {
return COM_PRIORITY_HIGH;
diff --git a/source/blender/compositor/operations/COM_ViewerOperation.h b/source/blender/compositor/operations/COM_ViewerOperation.h
index 43e305fb291..1eb3a1ad602 100644
--- a/source/blender/compositor/operations/COM_ViewerOperation.h
+++ b/source/blender/compositor/operations/COM_ViewerOperation.h
@@ -58,7 +58,7 @@ public:
bool isOutputOperation(bool /*rendering*/) const { if (G.background) return false; return isActiveViewerOutput(); }
void setImage(Image *image) { this->m_image = image; }
void setImageUser(ImageUser *imageUser) { this->m_imageUser = imageUser; }
- const bool isActiveViewerOutput() const { return this->m_active; }
+ bool isActiveViewerOutput() const { return this->m_active; }
void setActive(bool active) { this->m_active = active; }
void setCenterX(float centerX) { this->m_centerX = centerX;}
void setCenterY(float centerY) { this->m_centerY = centerY;}
@@ -66,7 +66,7 @@ public:
float getCenterX() const { return this->m_centerX; }
float getCenterY() const { return this->m_centerY; }
OrderOfChunks getChunkOrder() const { return this->m_chunkOrder; }
- const CompositorPriority getRenderPriority() const;
+ CompositorPriority getRenderPriority() const;
bool isViewerOperation() const { return true; }
void setUseAlphaInput(bool value) { this->m_useAlphaInput = value; }
void setRenderData(const RenderData *rd) { this->m_rd = rd; }
diff --git a/source/blender/compositor/operations/COM_WriteBufferOperation.h b/source/blender/compositor/operations/COM_WriteBufferOperation.h
index 583d58e7b99..79e228c63fb 100644
--- a/source/blender/compositor/operations/COM_WriteBufferOperation.h
+++ b/source/blender/compositor/operations/COM_WriteBufferOperation.h
@@ -27,8 +27,8 @@
#include "COM_MemoryProxy.h"
#include "COM_SocketReader.h"
/**
- * @brief NodeOperation to write to a tile
- * @ingroup Operation
+ * \brief NodeOperation to write to a tile
+ * \ingroup Operation
*/
class WriteBufferOperation : public NodeOperation {
MemoryProxy *m_memoryProxy;
@@ -39,7 +39,7 @@ public:
~WriteBufferOperation();
MemoryProxy *getMemoryProxy() { return this->m_memoryProxy; }
void executePixelSampled(float output[4], float x, float y, PixelSampler sampler);
- const bool isWriteBufferOperation() const { return true; }
+ bool isWriteBufferOperation() const { return true; }
bool isSingleValue() const { return m_single_value; }
void executeRegion(rcti *rect, unsigned int tileNumber);
diff --git a/source/blender/datatoc/datatoc_icon_split.py b/source/blender/datatoc/datatoc_icon_split.py
index e7cc3a71446..44fedca4398 100755
--- a/source/blender/datatoc/datatoc_icon_split.py
+++ b/source/blender/datatoc/datatoc_icon_split.py
@@ -128,21 +128,27 @@ def dice_icon_name(
# Init on demand
if not _dice_icon_name_cache:
import re
+ count = 0
# Search for eg: DEF_ICON(BRUSH_NUDGE) --> BRUSH_NUDGE
- re_icon = re.compile('^\s*DEF_ICON\(\s*([A-Za-z0-9_]+)\s*\).*$')
+ re_icon = re.compile(r'^\s*DEF_ICON.*\(\s*([A-Za-z0-9_]+)\s*\).*$')
ui_icons_h = os.path.join(SOURCE_DIR, "source", "blender", "editors", "include", "UI_icons.h")
with open(ui_icons_h, 'r', encoding="utf-8") as f:
for l in f:
match = re_icon.search(l)
if match:
- icon_name = match.group(1).lower()
- # print(l.rstrip())
- _dice_icon_name_cache[len(_dice_icon_name_cache)] = icon_name
+ if l.find('DEF_ICON_BLANK') == -1:
+ icon_name = match.group(1).lower()
+ print(icon_name)
+ _dice_icon_name_cache[count] = icon_name
+ count += 1
# ---- Done with icon cache
index = (y * parts_x) + x
+ if index not in _dice_icon_name_cache:
+ return None
+
icon_name = _dice_icon_name_cache[index]
# for debugging its handy to sort by number
@@ -209,6 +215,9 @@ def dice(
parts_x, parts_y,
name_style=name_style, prefix=output_prefix
)
+ if not id_str:
+ continue
+
filepath = os.path.join(output, id_str)
if VERBOSE:
print(" writing:", filepath)
diff --git a/source/blender/depsgraph/DEG_depsgraph.h b/source/blender/depsgraph/DEG_depsgraph.h
index 343cd4901b3..247587f5b37 100644
--- a/source/blender/depsgraph/DEG_depsgraph.h
+++ b/source/blender/depsgraph/DEG_depsgraph.h
@@ -80,7 +80,11 @@ enum {
* to meet dependencies with such a things as curve modifier and other guys
* who're using curve deform, where_on_path and so.
*/
- DAG_EVAL_NEED_CURVE_PATH = 1,
+ DAG_EVAL_NEED_CURVE_PATH = (1 << 0),
+ /* A shrinkwrap modifier or constraint targeting this mesh needs information
+ * about non-manifold boundary edges for the Target Normal Project mode.
+ */
+ DAG_EVAL_NEED_SHRINKWRAP_BOUNDARY = (1 << 1),
};
#ifdef __cplusplus
diff --git a/source/blender/depsgraph/DEG_depsgraph_build.h b/source/blender/depsgraph/DEG_depsgraph_build.h
index 30fefb7d4e4..c09c811121b 100644
--- a/source/blender/depsgraph/DEG_depsgraph_build.h
+++ b/source/blender/depsgraph/DEG_depsgraph_build.h
@@ -53,6 +53,8 @@ struct ViewLayer;
extern "C" {
#endif
+#include "BLI_sys_types.h"
+
/* Graph Building -------------------------------- */
/* Build depsgraph for the given scene, and dump results in given
@@ -113,7 +115,7 @@ typedef enum eDepsObjectComponentType {
DEG_OB_COMP_ANIMATION,
/* Transform Component (Parenting/Constraints) */
DEG_OB_COMP_TRANSFORM,
- /* Geometry Component (DerivedMesh/Displist) */
+ /* Geometry Component (Mesh/Displist) */
DEG_OB_COMP_GEOMETRY,
/* Evaluation-Related Outer Types (with Subdata) */
@@ -139,6 +141,11 @@ void DEG_add_object_relation(struct DepsNodeHandle *node,
struct Object *object,
eDepsObjectComponentType component,
const char *description);
+void DEG_add_object_relation_with_customdata(struct DepsNodeHandle *node,
+ struct Object *object,
+ eDepsObjectComponentType component,
+ uint64_t customdata_mask,
+ const char *description);
void DEG_add_bone_relation(struct DepsNodeHandle *handle,
struct Object *object,
const char *bone_name,
@@ -149,9 +156,9 @@ void DEG_add_object_cache_relation(struct DepsNodeHandle *handle,
eDepsObjectComponentType component,
const char *description);
+void DEG_add_special_eval_flag(struct DepsNodeHandle *handle, struct ID *id, uint32_t flag);
struct Depsgraph *DEG_get_graph_from_handle(struct DepsNodeHandle *handle);
-void DEG_add_special_eval_flag(struct Depsgraph *graph, struct ID *id, short flag);
/* ************************************************ */
diff --git a/source/blender/depsgraph/DEG_depsgraph_query.h b/source/blender/depsgraph/DEG_depsgraph_query.h
index 888a29dc77e..82d492ac110 100644
--- a/source/blender/depsgraph/DEG_depsgraph_query.h
+++ b/source/blender/depsgraph/DEG_depsgraph_query.h
@@ -71,7 +71,7 @@ bool DEG_id_type_updated(const struct Depsgraph *depsgraph, short id_type);
bool DEG_id_type_any_updated(const struct Depsgraph *depsgraph);
/* Get additional evaluation flags for the given ID. */
-short DEG_get_eval_flags_for_id(const struct Depsgraph *graph, struct ID *id);
+uint32_t DEG_get_eval_flags_for_id(const struct Depsgraph *graph, struct ID *id);
/* Get scene the despgraph is created for. */
struct Scene *DEG_get_evaluated_scene(const struct Depsgraph *graph);
@@ -133,7 +133,7 @@ typedef struct DEGObjectIterData {
*/
struct Object temp_dupli_object;
- /* **** Iteration ober ID nodes **** */
+ /* **** Iteration over ID nodes **** */
size_t id_node_index;
size_t num_id_nodes;
} DEGObjectIterData;
diff --git a/source/blender/depsgraph/intern/builder/deg_builder.cc b/source/blender/depsgraph/intern/builder/deg_builder.cc
index cd087889845..f7b2b482b1f 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder.cc
@@ -34,6 +34,8 @@
#include "DNA_object_types.h"
#include "DNA_ID.h"
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
#include "BLI_stack.h"
extern "C" {
@@ -56,12 +58,23 @@ namespace DEG {
namespace {
-void deg_graph_build_flush_layers(Depsgraph *graph)
+void deg_graph_build_flush_visibility(Depsgraph *graph)
{
+ enum {
+ DEG_NODE_VISITED = (1 << 0),
+ };
+
BLI_Stack *stack = BLI_stack_new(sizeof(OperationDepsNode *),
"DEG flush layers stack");
+ foreach (IDDepsNode *id_node, graph->id_nodes) {
+ GHASH_FOREACH_BEGIN(ComponentDepsNode *, comp_node, id_node->components)
+ {
+ comp_node->affects_directly_visible |= id_node->is_directly_visible;
+ }
+ GHASH_FOREACH_END();
+ }
foreach (OperationDepsNode *op_node, graph->operations) {
- op_node->done = 0;
+ op_node->custom_flags = 0;
op_node->num_links_pending = 0;
foreach (DepsRelation *rel, op_node->outlinks) {
if ((rel->from->type == DEG_NODE_TYPE_OPERATION) &&
@@ -72,7 +85,7 @@ void deg_graph_build_flush_layers(Depsgraph *graph)
}
if (op_node->num_links_pending == 0) {
BLI_stack_push(stack, &op_node);
- op_node->done = 1;
+ op_node->custom_flags |= DEG_NODE_VISITED;
}
}
while (!BLI_stack_is_empty(stack)) {
@@ -82,8 +95,8 @@ void deg_graph_build_flush_layers(Depsgraph *graph)
foreach (DepsRelation *rel, op_node->inlinks) {
if (rel->from->type == DEG_NODE_TYPE_OPERATION) {
OperationDepsNode *op_from = (OperationDepsNode *)rel->from;
- op_from->owner->owner->is_visible |=
- op_node->owner->owner->is_visible;
+ op_from->owner->affects_directly_visible |=
+ op_node->owner->affects_directly_visible;
}
}
/* Schedule parent nodes. */
@@ -94,9 +107,11 @@ void deg_graph_build_flush_layers(Depsgraph *graph)
BLI_assert(op_from->num_links_pending > 0);
--op_from->num_links_pending;
}
- if (op_from->num_links_pending == 0 && op_from->done == 0) {
+ if ((op_from->num_links_pending == 0) &&
+ (op_from->custom_flags & DEG_NODE_VISITED) == 0)
+ {
BLI_stack_push(stack, &op_from);
- op_from->done = 1;
+ op_from->custom_flags |= DEG_NODE_VISITED;
}
}
}
@@ -108,7 +123,8 @@ void deg_graph_build_flush_layers(Depsgraph *graph)
void deg_graph_build_finalize(Main *bmain, Depsgraph *graph)
{
- deg_graph_build_flush_layers(graph);
+ /* Make sure dependencies of visible ID datablocks are visible. */
+ deg_graph_build_flush_visibility(graph);
/* Re-tag IDs for update if it was tagged before the relations
* update tag.
*/
@@ -122,6 +138,10 @@ void deg_graph_build_finalize(Main *bmain, Depsgraph *graph)
flag |= DEG_TAG_TIME;
}
}
+ /* Tag rebuild if special evaluation flags changed. */
+ if (id_node->eval_flags != id_node->previous_eval_flags) {
+ flag |= DEG_TAG_TRANSFORM | DEG_TAG_GEOMETRY;
+ }
if (!deg_copy_on_write_is_expanded(id_node->id_cow)) {
flag |= DEG_TAG_COPY_ON_WRITE;
/* This means ID is being added to the dependency graph first
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_cycle.cc b/source/blender/depsgraph/intern/builder/deg_builder_cycle.cc
index feaba1a4aa8..0d28344ef95 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_cycle.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_cycle.cc
@@ -86,22 +86,22 @@ struct CyclesSolverState {
BLI_INLINE void set_node_visited_state(DepsNode *node,
eCyclicCheckVisitedState state)
{
- node->done = (node->done & ~0x3) | (int)state;
+ node->custom_flags = (node->custom_flags & ~0x3) | (int)state;
}
BLI_INLINE eCyclicCheckVisitedState get_node_visited_state(DepsNode *node)
{
- return (eCyclicCheckVisitedState)(node->done & 0x3);
+ return (eCyclicCheckVisitedState)(node->custom_flags & 0x3);
}
BLI_INLINE void set_node_num_visited_children(DepsNode *node, int num_children)
{
- node->done = (node->done & 0x3) | (num_children << 2);
+ node->custom_flags = (node->custom_flags & 0x3) | (num_children << 2);
}
BLI_INLINE int get_node_num_visited_children(DepsNode *node)
{
- return node->done >> 2;
+ return node->custom_flags >> 2;
}
void schedule_node_to_stack(CyclesSolverState *state, OperationDepsNode *node)
@@ -124,7 +124,7 @@ void schedule_leaf_nodes(CyclesSolverState *state)
has_inlinks = true;
}
}
- node->done = 0;
+ node->custom_flags = 0;
if (has_inlinks == false) {
schedule_node_to_stack(state, node);
}
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_map.cc b/source/blender/depsgraph/intern/builder/deg_builder_map.cc
index cde7b9721b7..2d9719b3ad4 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_map.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_map.cc
@@ -42,7 +42,6 @@ BuilderMap::BuilderMap()
set = BLI_gset_ptr_new("deg builder gset");
}
-
BuilderMap::~BuilderMap()
{
BLI_gset_free(set, NULL);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 95f07603592..e8e3e241ebf 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -82,8 +82,6 @@ extern "C" {
#include "BKE_idcode.h"
#include "BKE_key.h"
#include "BKE_lattice.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
#include "BKE_mask.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
@@ -122,11 +120,15 @@ namespace DEG {
namespace {
-void free_copy_on_write_datablock(void *id_v)
+void free_copy_on_write_datablock(void *id_info_v)
{
- ID *id = (ID *)id_v;
- deg_free_copy_on_write_datablock(id);
- MEM_freeN(id);
+ DepsgraphNodeBuilder::IDInfo *id_info =
+ (DepsgraphNodeBuilder::IDInfo *)id_info_v;
+ if (id_info->id_cow != NULL) {
+ deg_free_copy_on_write_datablock(id_info->id_cow);
+ MEM_freeN(id_info->id_cow);
+ }
+ MEM_freeN(id_info);
}
} /* namespace */
@@ -144,28 +146,36 @@ DepsgraphNodeBuilder::DepsgraphNodeBuilder(Main *bmain, Depsgraph *graph)
view_layer_index_(-1),
collection_(NULL),
is_parent_collection_visible_(true),
- cow_id_hash_(NULL)
+ id_info_hash_(NULL)
{
}
DepsgraphNodeBuilder::~DepsgraphNodeBuilder()
{
- if (cow_id_hash_ != NULL) {
- BLI_ghash_free(cow_id_hash_, NULL, free_copy_on_write_datablock);
+ if (id_info_hash_ != NULL) {
+ BLI_ghash_free(id_info_hash_, NULL, free_copy_on_write_datablock);
}
}
IDDepsNode *DepsgraphNodeBuilder::add_id_node(ID *id)
{
IDDepsNode *id_node = NULL;
- ID *id_cow = (ID *)BLI_ghash_lookup(cow_id_hash_, id);
- if (id_cow != NULL) {
- /* TODO(sergey): Is it possible to lookup and pop element from GHash
- * at the same time?
- */
- BLI_ghash_remove(cow_id_hash_, id, NULL, NULL);
+ ID *id_cow = NULL;
+ IDComponentsMask previously_visible_components_mask = 0;
+ uint32_t previous_eval_flags = 0;
+ IDInfo *id_info = (IDInfo *)BLI_ghash_lookup(id_info_hash_, id);
+ if (id_info != NULL) {
+ id_cow = id_info->id_cow;
+ previously_visible_components_mask =
+ id_info->previously_visible_components_mask;
+ previous_eval_flags = id_info->previous_eval_flags;
+ /* Tag ID info to not free the CoW ID pointer. */
+ id_info->id_cow = NULL;
}
id_node = graph_->add_id_node(id, id_cow);
+ id_node->previously_visible_components_mask =
+ previously_visible_components_mask;
+ id_node->previous_eval_flags = previous_eval_flags;
/* Currently all ID nodes are supposed to have copy-on-write logic.
*
* NOTE: Zero number of components indicates that ID node was just created.
@@ -333,17 +343,23 @@ void DepsgraphNodeBuilder::begin_build()
/* Store existing copy-on-write versions of datablock, so we can re-use
* them for new ID nodes.
*/
- cow_id_hash_ = BLI_ghash_ptr_new("Depsgraph id hash");
+ id_info_hash_ = BLI_ghash_ptr_new("Depsgraph id hash");
foreach (IDDepsNode *id_node, graph_->id_nodes) {
- if (deg_copy_on_write_is_expanded(id_node->id_cow)) {
- if (id_node->id_orig == id_node->id_cow) {
- continue;
- }
- BLI_ghash_insert(cow_id_hash_,
- id_node->id_orig,
- id_node->id_cow);
- id_node->id_cow = NULL;
+ IDInfo *id_info = (IDInfo *)MEM_mallocN(
+ sizeof(IDInfo), "depsgraph id info");
+ if (deg_copy_on_write_is_expanded(id_node->id_cow) &&
+ id_node->id_orig != id_node->id_cow)
+ {
+ id_info->id_cow = id_node->id_cow;
+ }
+ else {
+ id_info->id_cow = NULL;
}
+ id_info->previously_visible_components_mask =
+ id_node->visible_components_mask;
+ id_info->previous_eval_flags = id_node->eval_flags;
+ BLI_ghash_insert(id_info_hash_, id_node->id_orig, id_info);
+ id_node->id_cow = NULL;
}
GSET_FOREACH_BEGIN(OperationDepsNode *, op_node, graph_->entry_tags)
@@ -352,9 +368,11 @@ void DepsgraphNodeBuilder::begin_build()
IDDepsNode *id_node = comp_node->owner;
SavedEntryTag entry_tag;
- entry_tag.id = id_node->id_orig;
+ entry_tag.id_orig = id_node->id_orig;
entry_tag.component_type = comp_node->type;
entry_tag.opcode = op_node->opcode;
+ entry_tag.name = op_node->name;
+ entry_tag.name_tag = op_node->name_tag;
saved_entry_tags_.push_back(entry_tag);
};
GSET_FOREACH_END();
@@ -368,7 +386,7 @@ void DepsgraphNodeBuilder::begin_build()
void DepsgraphNodeBuilder::end_build()
{
foreach (const SavedEntryTag& entry_tag, saved_entry_tags_) {
- IDDepsNode *id_node = find_id_node(entry_tag.id);
+ IDDepsNode *id_node = find_id_node(entry_tag.id_orig);
if (id_node == NULL) {
continue;
}
@@ -377,7 +395,7 @@ void DepsgraphNodeBuilder::end_build()
if (comp_node == NULL) {
continue;
}
- OperationDepsNode *op_node = comp_node->find_operation(entry_tag.opcode);
+ OperationDepsNode *op_node = comp_node->find_operation(entry_tag.opcode, entry_tag.name, entry_tag.name_tag);
if (op_node == NULL) {
continue;
}
@@ -401,7 +419,18 @@ void DepsgraphNodeBuilder::build_id(ID *id)
build_collection((Collection *)id);
break;
case ID_OB:
- build_object(-1, (Object *)id, DEG_ID_LINKED_INDIRECTLY);
+ /* TODO(sergey): Get visibility from a "parent" somehow.
+ *
+ * NOTE: Using `false` visibility here should be fine, since if this
+ * driver affects on something invisible we don't really care if the
+ * driver gets evaluated (and even don't want this to force object
+ * to become visible).
+ *
+ * If this happened to be affecting visible object, then it is up to
+ * deg_graph_build_flush_visibility() to ensure visibility of the
+ * object is true.
+ */
+ build_object(-1, (Object *)id, DEG_ID_LINKED_INDIRECTLY, false);
break;
case ID_KE:
build_shapekeys((Key *)id);
@@ -437,11 +466,19 @@ void DepsgraphNodeBuilder::build_id(ID *id)
case ID_CU:
case ID_MB:
case ID_LT:
- build_object_data_geometry_datablock(id);
+ /* TODO(sergey): Get visibility from a "parent" somehow.
+ *
+ * NOTE: Similarly to above, we don't want false-positives on
+ * visibility.
+ */
+ build_object_data_geometry_datablock(id, false);
break;
case ID_SPK:
build_speaker((Speaker *)id);
break;
+ case ID_TXT:
+ /* Not a part of dependency graph. */
+ break;
default:
fprintf(stderr, "Unhandled ID %s\n", id->name);
BLI_assert(!"Should never happen");
@@ -451,15 +488,28 @@ void DepsgraphNodeBuilder::build_id(ID *id)
void DepsgraphNodeBuilder::build_collection(Collection *collection)
{
+ const int restrict_flag = (graph_->mode == DAG_EVAL_VIEWPORT)
+ ? COLLECTION_RESTRICT_VIEW
+ : COLLECTION_RESTRICT_RENDER;
+ const bool is_collection_restricted = (collection->flag & restrict_flag);
+ const bool is_collection_visible =
+ !is_collection_restricted && is_parent_collection_visible_;
if (built_map_.checkIsBuiltAndTag(collection)) {
- /* NOTE: Currently collections restrict flags only depend on collection
- * itself and do not depend on a "context" (like, particle system
- * visibility).
- *
- * If we ever change this, we need to update restrict flag here for an
- * already built collection.
- */
- return;
+ IDDepsNode *id_node = find_id_node(&collection->id);
+ if (is_collection_visible && !id_node->is_directly_visible) {
+ /* Collection became visible, make sure nested collections and
+ * objects are poked with the new visibility flag, since they
+ * might become visible too.
+ */
+ }
+ else {
+ return;
+ }
+ }
+ else {
+ /* Collection itself. */
+ IDDepsNode *id_node = add_id_node(&collection->id);
+ id_node->is_directly_visible = is_collection_visible;
}
/* Backup state. */
Collection *current_state_collection = collection_;
@@ -467,16 +517,7 @@ void DepsgraphNodeBuilder::build_collection(Collection *collection)
is_parent_collection_visible_;
/* Modify state as we've entered new collection/ */
collection_ = collection;
- const int restrict_flag = (graph_->mode == DAG_EVAL_VIEWPORT)
- ? COLLECTION_RESTRICT_VIEW
- : COLLECTION_RESTRICT_RENDER;
- const bool is_collection_restricted = (collection->flag & restrict_flag);
- const bool is_collection_visible =
- !is_collection_restricted && is_parent_collection_visible_;
is_parent_collection_visible_ = is_collection_visible;
- /* Collection itself. */
- IDDepsNode *id_node = add_id_node(&collection->id);
- id_node->is_visible = is_collection_visible;
/* Build collection objects. */
LISTBASE_FOREACH (CollectionObject *, cob, &collection->gobject) {
build_object(
@@ -507,13 +548,20 @@ void DepsgraphNodeBuilder::build_object(int base_index,
build_object_flags(base_index, object, linked_state);
}
id_node->linked_state = max(id_node->linked_state, linked_state);
- id_node->is_visible |= is_visible;
+ if (id_node->linked_state == DEG_ID_LINKED_DIRECTLY) {
+ id_node->is_directly_visible |= is_visible;
+ }
return;
}
/* Create ID node for object and begin init. */
IDDepsNode *id_node = add_id_node(&object->id);
id_node->linked_state = linked_state;
- id_node->is_visible = is_visible;
+ if (object == scene_->camera) {
+ id_node->is_directly_visible = true;
+ }
+ else {
+ id_node->is_directly_visible = is_visible;
+ }
object->customdata_mask = 0;
/* Various flags, flushing from bases/collections. */
build_object_flags(base_index, object, linked_state);
@@ -521,34 +569,39 @@ void DepsgraphNodeBuilder::build_object(int base_index,
build_object_transform(object);
/* Parent. */
if (object->parent != NULL) {
- build_object(-1, object->parent, DEG_ID_LINKED_INDIRECTLY);
+ build_object(
+ -1, object->parent, DEG_ID_LINKED_INDIRECTLY, is_visible);
}
/* Modifiers. */
if (object->modifiers.first != NULL) {
BuilderWalkUserData data;
data.builder = this;
+ data.is_parent_visible = is_visible;
modifiers_foreachIDLink(object, modifier_walk, &data);
}
/* Grease Pencil Modifiers. */
if (object->greasepencil_modifiers.first != NULL) {
BuilderWalkUserData data;
data.builder = this;
+ data.is_parent_visible = is_visible;
BKE_gpencil_modifiers_foreachIDLink(object, modifier_walk, &data);
}
- /* Shadr FX. */
+ /* Shader FX. */
if (object->shader_fx.first != NULL) {
BuilderWalkUserData data;
data.builder = this;
+ data.is_parent_visible = is_visible;
BKE_shaderfx_foreachIDLink(object, modifier_walk, &data);
}
/* Constraints. */
if (object->constraints.first != NULL) {
BuilderWalkUserData data;
data.builder = this;
+ data.is_parent_visible = is_visible;
BKE_constraints_id_loop(&object->constraints, constraint_walk, &data);
}
/* Object data. */
- build_object_data(object);
+ build_object_data(object, is_visible);
/* Build animation data,
*
* Do it now because it's possible object data will affect
@@ -563,14 +616,16 @@ void DepsgraphNodeBuilder::build_object(int base_index,
build_animdata(&object->id);
/* Particle systems. */
if (object->particlesystem.first != NULL) {
- build_particles(object);
+ build_particles(object, is_visible);
}
/* Proxy object to copy from. */
if (object->proxy_from != NULL) {
- build_object(-1, object->proxy_from, DEG_ID_LINKED_INDIRECTLY);
+ build_object(
+ -1, object->proxy_from, DEG_ID_LINKED_INDIRECTLY, is_visible);
}
if (object->proxy_group != NULL) {
- build_object(-1, object->proxy_group, DEG_ID_LINKED_INDIRECTLY);
+ build_object(
+ -1, object->proxy_group, DEG_ID_LINKED_INDIRECTLY, is_visible);
}
/* Object dupligroup. */
if (object->dup_group != NULL) {
@@ -579,6 +634,11 @@ void DepsgraphNodeBuilder::build_object(int base_index,
is_parent_collection_visible_ = is_visible;
build_collection(object->dup_group);
is_parent_collection_visible_ = is_current_parent_collection_visible;
+ add_operation_node(&object->id,
+ DEG_NODE_TYPE_DUPLI,
+ NULL,
+ DEG_OPCODE_PLACEHOLDER,
+ "Dupli");
}
}
@@ -605,12 +665,12 @@ void DepsgraphNodeBuilder::build_object_flags(
DEG_OPCODE_OBJECT_BASE_FLAGS);
}
-void DepsgraphNodeBuilder::build_object_data(Object *object)
+void DepsgraphNodeBuilder::build_object_data(
+ Object *object, bool is_object_visible)
{
if (object->data == NULL) {
return;
}
- IDDepsNode *id_node = graph_->find_id_node(&object->id);
/* type-specific data. */
switch (object->type) {
case OB_MESH:
@@ -620,23 +680,14 @@ void DepsgraphNodeBuilder::build_object_data(Object *object)
case OB_MBALL:
case OB_LATTICE:
case OB_GPENCIL:
- build_object_data_geometry(object);
- /* TODO(sergey): Only for until we support granular
- * update of curves.
- */
- if (object->type == OB_FONT) {
- Curve *curve = (Curve *)object->data;
- if (curve->textoncurve) {
- id_node->eval_flags |= DAG_EVAL_NEED_CURVE_PATH;
- }
- }
+ build_object_data_geometry(object, is_object_visible);
break;
case OB_ARMATURE:
if (ID_IS_LINKED(object) && object->proxy_from != NULL) {
build_proxy_rig(object);
}
else {
- build_rig(object);
+ build_rig(object, is_object_visible);
}
break;
case OB_LAMP:
@@ -806,6 +857,11 @@ void DepsgraphNodeBuilder::build_animdata(ID *id)
*/
}
+ /* NLA strips contain actions */
+ LISTBASE_FOREACH (NlaTrack *, nlt, &adt->nla_tracks) {
+ build_animdata_nlastrip_targets(&nlt->strips);
+ }
+
/* drivers */
int driver_index = 0;
LISTBASE_FOREACH (FCurve *, fcu, &adt->drivers) {
@@ -815,6 +871,18 @@ void DepsgraphNodeBuilder::build_animdata(ID *id)
}
}
+void DepsgraphNodeBuilder::build_animdata_nlastrip_targets(ListBase *strips)
+{
+ LISTBASE_FOREACH (NlaStrip *, strip, strips) {
+ if (strip->act != NULL) {
+ build_action(strip->act);
+ }
+ else if (strip->strips.first != NULL) {
+ build_animdata_nlastrip_targets(&strip->strips);
+ }
+ }
+}
+
void DepsgraphNodeBuilder::build_action(bAction *action)
{
if (built_map_.checkIsBuiltAndTag(action)) {
@@ -907,17 +975,20 @@ void DepsgraphNodeBuilder::build_world(World *world)
if (built_map_.checkIsBuiltAndTag(world)) {
return;
}
- /* Animation. */
- build_animdata(&world->id);
- /* world itself */
+ /* World itself. */
+ add_id_node(&world->id);
+ World *world_cow = get_cow_datablock(world);
+ /* Shading update. */
add_operation_node(&world->id,
DEG_NODE_TYPE_SHADING,
- NULL,
+ function_bind(BKE_world_eval,
+ _1,
+ world_cow),
DEG_OPCODE_WORLD_UPDATE);
- /* world's nodetree */
- if (world->nodetree != NULL) {
- build_nodetree(world->nodetree);
- }
+ /* Animation. */
+ build_animdata(&world->id);
+ /* World's nodetree. */
+ build_nodetree(world->nodetree);
}
/* Rigidbody Simulation - Scene Level */
@@ -991,7 +1062,8 @@ void DepsgraphNodeBuilder::build_rigidbody(Scene *scene)
}
}
-void DepsgraphNodeBuilder::build_particles(Object *object)
+void DepsgraphNodeBuilder::build_particles(Object *object,
+ bool is_object_visible)
{
/**
* Particle Systems Nodes
@@ -1040,7 +1112,8 @@ void DepsgraphNodeBuilder::build_particles(Object *object)
if (part->dup_ob != NULL) {
build_object(-1,
part->dup_ob,
- DEG_ID_LINKED_INDIRECTLY);
+ DEG_ID_LINKED_INDIRECTLY,
+ is_object_visible);
}
break;
case PART_DRAW_GR:
@@ -1102,7 +1175,9 @@ void DepsgraphNodeBuilder::build_shapekeys(Key *key)
/* ObData Geometry Evaluation */
// XXX: what happens if the datablock is shared!
-void DepsgraphNodeBuilder::build_object_data_geometry(Object *object)
+void DepsgraphNodeBuilder::build_object_data_geometry(
+ Object *object,
+ bool is_object_visible)
{
OperationDepsNode *op_node;
Scene *scene_cow = get_cow_datablock(scene_);
@@ -1158,10 +1233,12 @@ void DepsgraphNodeBuilder::build_object_data_geometry(Object *object)
if (ELEM(object->type, OB_MESH, OB_CURVE, OB_LATTICE)) {
// add geometry collider relations
}
- build_object_data_geometry_datablock((ID *)object->data);
+ build_object_data_geometry_datablock((ID *)object->data, is_object_visible);
}
-void DepsgraphNodeBuilder::build_object_data_geometry_datablock(ID *obdata)
+void DepsgraphNodeBuilder::build_object_data_geometry_datablock(
+ ID *obdata,
+ bool is_object_visible)
{
if (built_map_.checkIsBuiltAndTag(obdata)) {
return;
@@ -1219,13 +1296,22 @@ void DepsgraphNodeBuilder::build_object_data_geometry_datablock(ID *obdata)
*/
Curve *cu = (Curve *)obdata;
if (cu->bevobj != NULL) {
- build_object(-1, cu->bevobj, DEG_ID_LINKED_INDIRECTLY);
+ build_object(-1,
+ cu->bevobj,
+ DEG_ID_LINKED_INDIRECTLY,
+ is_object_visible);
}
if (cu->taperobj != NULL) {
- build_object(-1, cu->taperobj, DEG_ID_LINKED_INDIRECTLY);
+ build_object(-1,
+ cu->taperobj,
+ DEG_ID_LINKED_INDIRECTLY,
+ is_object_visible);
}
if (cu->textoncurve != NULL) {
- build_object(-1, cu->textoncurve, DEG_ID_LINKED_INDIRECTLY);
+ build_object(-1,
+ cu->textoncurve,
+ DEG_ID_LINKED_INDIRECTLY,
+ is_object_visible);
}
break;
}
@@ -1365,7 +1451,8 @@ void DepsgraphNodeBuilder::build_nodetree(bNodeTree *ntree)
build_image((Image *)id);
}
else if (id_type == ID_OB) {
- build_object(-1, (Object *)id, DEG_ID_LINKED_INDIRECTLY);
+ /* TODO(sergey): Use visibility of owner of the node tree. */
+ build_object(-1, (Object *)id, DEG_ID_LINKED_INDIRECTLY, true);
}
else if (id_type == ID_SCE) {
/* Scenes are used by compositor trees, and handled by render
@@ -1375,6 +1462,9 @@ void DepsgraphNodeBuilder::build_nodetree(bNodeTree *ntree)
else if (id_type == ID_TXT) {
/* Ignore script nodes. */
}
+ else if (id_type == ID_MSK) {
+ build_mask((Mask *)id);
+ }
else if (id_type == ID_MC) {
build_movieclip((MovieClip *)id);
}
@@ -1574,9 +1664,11 @@ void DepsgraphNodeBuilder::modifier_walk(void *user_data,
}
switch (GS(id->name)) {
case ID_OB:
+ /* TODO(sergey): Use visibility of owner of modifier stack. */
data->builder->build_object(-1,
(Object *)id,
- DEG_ID_LINKED_INDIRECTLY);
+ DEG_ID_LINKED_INDIRECTLY,
+ data->is_parent_visible);
break;
case ID_TE:
data->builder->build_texture((Tex *)id);
@@ -1599,9 +1691,11 @@ void DepsgraphNodeBuilder::constraint_walk(bConstraint * /*con*/,
}
switch (GS(id->name)) {
case ID_OB:
+ /* TODO(sergey): Use visibility of owner of modifier stack. */
data->builder->build_object(-1,
(Object *)id,
- DEG_ID_LINKED_INDIRECTLY);
+ DEG_ID_LINKED_INDIRECTLY,
+ data->is_parent_visible);
break;
default:
/* pass */
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index e4b253f6d76..b826a2979cc 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -35,6 +35,8 @@
#include "DEG_depsgraph.h"
+#include "intern/nodes/deg_node_id.h"
+
struct Base;
struct bArmature;
struct bAction;
@@ -167,25 +169,30 @@ struct DepsgraphNodeBuilder {
void build_object(int base_index,
Object *object,
eDepsNode_LinkedState_Type linked_state,
- bool is_visible = true);
+ bool is_visible);
void build_object_flags(int base_index,
Object *object,
eDepsNode_LinkedState_Type linked_state);
- void build_object_data(Object *object);
+ void build_object_data(Object *object, bool is_object_visible);
void build_object_data_camera(Object *object);
- void build_object_data_geometry(Object *object);
- void build_object_data_geometry_datablock(ID *obdata);
+ void build_object_data_geometry(Object *object, bool is_object_visible);
+ void build_object_data_geometry_datablock(ID *obdata,
+ bool is_object_visible);
void build_object_data_lamp(Object *object);
void build_object_data_lightprobe(Object *object);
void build_object_data_speaker(Object *object);
void build_object_transform(Object *object);
void build_object_constraints(Object *object);
- void build_pose_constraints(Object *object, bPoseChannel *pchan, int pchan_index);
+ void build_pose_constraints(Object *object,
+ bPoseChannel *pchan,
+ int pchan_index,
+ bool is_object_visible);
void build_rigidbody(Scene *scene);
- void build_particles(Object *object);
+ void build_particles(Object *object, bool is_object_visible);
void build_particle_settings(ParticleSettings *part);
void build_cloth(Object *object);
void build_animdata(ID *id);
+ void build_animdata_nlastrip_targets(ListBase *strips);
void build_action(bAction *action);
void build_driver(ID *id, FCurve *fcurve, int driver_index);
void build_driver_variables(ID *id, FCurve *fcurve);
@@ -196,7 +203,7 @@ struct DepsgraphNodeBuilder {
void build_splineik_pose(Object *object,
bPoseChannel *pchan,
bConstraint *con);
- void build_rig(Object *object);
+ void build_rig(Object *object, bool is_object_visible);
void build_proxy_rig(Object *object);
void build_armature(bArmature *armature);
void build_shapekeys(Key *key);
@@ -215,23 +222,43 @@ struct DepsgraphNodeBuilder {
void build_lightprobe(LightProbe *probe);
void build_speaker(Speaker *speaker);
+ /* Per-ID information about what was already in the dependency graph.
+ * Allows to re-use certain values, to speed up following evaluation.
+ */
+ struct IDInfo {
+ /* Copy-on-written pointer of the corresponding ID. */
+ ID *id_cow;
+ /* Mask of visible components from previous state of the
+ * dependency graph.
+ */
+ IDComponentsMask previously_visible_components_mask;
+ /* Special evaluation flag mask from the previous depsgraph. */
+ uint32_t previous_eval_flags;
+ };
+
protected:
+ /* Allows to identify an operation which was tagged for update at the time
+ * relations are being updated. We can not reuse operation node pointer
+ * since it will change during dependency graph construction.
+ */
struct SavedEntryTag {
- ID *id;
+ ID *id_orig;
eDepsNode_Type component_type;
eDepsOperation_Code opcode;
+ const char *name;
+ int name_tag;
};
vector<SavedEntryTag> saved_entry_tags_;
struct BuilderWalkUserData {
DepsgraphNodeBuilder *builder;
+ /* Denotes whether object the walk is invoked from is visible. */
+ bool is_parent_visible;
};
-
static void modifier_walk(void *user_data,
struct Object *object,
struct ID **idpoin,
int cb_flag);
-
static void constraint_walk(bConstraint *constraint,
ID **idpoin,
bool is_reference,
@@ -255,7 +282,12 @@ protected:
*/
bool is_parent_collection_visible_;
- GHash *cow_id_hash_;
+ /* Indexed by original ID, values are IDInfo. */
+ GHash *id_info_hash_;
+
+ /* Set of IDs which were already build. Makes it easier to keep track of
+ * what was already built and what was not.
+ */
BuilderMap built_map_;
};
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 b1486e82af5..88e5ca9346c 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
@@ -67,13 +67,16 @@ extern "C" {
namespace DEG {
-void DepsgraphNodeBuilder::build_pose_constraints(Object *object,
- bPoseChannel *pchan,
- int pchan_index)
+void DepsgraphNodeBuilder::build_pose_constraints(
+ Object *object,
+ bPoseChannel *pchan,
+ int pchan_index,
+ bool is_object_visible)
{
/* Pull indirect dependencies via constraints. */
BuilderWalkUserData data;
data.builder = this;
+ data.is_parent_visible = is_object_visible;
BKE_constraints_id_loop(&pchan->constraints, constraint_walk, &data);
/* Create node for constraint stack. */
add_operation_node(&object->id, DEG_NODE_TYPE_BONE, pchan->name,
@@ -142,7 +145,7 @@ void DepsgraphNodeBuilder::build_splineik_pose(Object *object,
}
/* Pose/Armature Bones Graph */
-void DepsgraphNodeBuilder::build_rig(Object *object)
+void DepsgraphNodeBuilder::build_rig(Object *object, bool is_object_visible)
{
bArmature *armature = (bArmature *)object->data;
Scene *scene_cow = get_cow_datablock(scene_);
@@ -217,12 +220,17 @@ void DepsgraphNodeBuilder::build_rig(Object *object)
object_cow),
DEG_OPCODE_POSE_INIT_IK);
+ add_operation_node(&object->id,
+ DEG_NODE_TYPE_EVAL_POSE,
+ function_bind(BKE_pose_eval_cleanup,
+ _1,
+ scene_cow,
+ object_cow),
+ DEG_OPCODE_POSE_CLEANUP);
+
op_node = add_operation_node(&object->id,
DEG_NODE_TYPE_EVAL_POSE,
- function_bind(BKE_pose_eval_flush,
- _1,
- scene_cow,
- object_cow),
+ NULL,
DEG_OPCODE_POSE_DONE);
op_node->set_as_exit();
/* Bones. */
@@ -262,7 +270,8 @@ void DepsgraphNodeBuilder::build_rig(Object *object)
}
/* Build constraints. */
if (pchan->constraints.first != NULL) {
- build_pose_constraints(object, pchan, pchan_index);
+ build_pose_constraints(
+ object, pchan, pchan_index, is_object_visible);
}
/**
* IK Solvers.
@@ -292,7 +301,12 @@ void DepsgraphNodeBuilder::build_rig(Object *object)
}
/* Custom shape. */
if (pchan->custom != NULL) {
- build_object(-1, pchan->custom, DEG_ID_LINKED_INDIRECTLY);
+ /* TODO(sergey): Use own visibility. */
+ build_object(
+ -1,
+ pchan->custom,
+ DEG_ID_LINKED_INDIRECTLY,
+ is_object_visible);
}
pchan_index++;
}
@@ -314,7 +328,7 @@ void DepsgraphNodeBuilder::build_proxy_rig(Object *object)
}
op_node = add_operation_node(&object->id,
DEG_NODE_TYPE_EVAL_POSE,
- function_bind(BKE_pose_eval_proxy_pose_init,
+ function_bind(BKE_pose_eval_proxy_init,
_1,
object_cow),
DEG_OPCODE_POSE_INIT);
@@ -337,13 +351,13 @@ void DepsgraphNodeBuilder::build_proxy_rig(Object *object)
/* Bone is fully evaluated. */
op_node = add_operation_node(
&object->id,
- DEG_NODE_TYPE_BONE,
- pchan->name,
+ DEG_NODE_TYPE_BONE,
+ pchan->name,
function_bind(BKE_pose_eval_proxy_copy_bone,
_1,
object_cow,
pchan_index),
- DEG_OPCODE_BONE_DONE);
+ DEG_OPCODE_BONE_DONE);
op_node->set_as_exit();
/* Custom properties. */
@@ -359,9 +373,13 @@ void DepsgraphNodeBuilder::build_proxy_rig(Object *object)
}
op_node = add_operation_node(&object->id,
DEG_NODE_TYPE_EVAL_POSE,
- function_bind(BKE_pose_eval_proxy_pose_done,
+ function_bind(BKE_pose_eval_proxy_cleanup,
_1,
object_cow),
+ DEG_OPCODE_POSE_CLEANUP);
+ op_node = add_operation_node(&object->id,
+ DEG_NODE_TYPE_EVAL_POSE,
+ NULL,
DEG_OPCODE_POSE_DONE);
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 409df45de27..5efa427fcdb 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
@@ -115,7 +115,7 @@ void DepsgraphNodeBuilder::build_view_layer(
}
build_layer_collections(&view_layer->layer_collections);
if (scene->camera != NULL) {
- build_object(-1, scene->camera, DEG_ID_LINKED_INDIRECTLY);
+ build_object(-1, scene->camera, DEG_ID_LINKED_INDIRECTLY, true);
}
/* Rigidbody. */
if (scene->rigidbody_world != NULL) {
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index af251849572..108909298a9 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -80,8 +80,6 @@ extern "C" {
#include "BKE_collision.h"
#include "BKE_fcurve.h"
#include "BKE_key.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_mball.h"
#include "BKE_modifier.h"
@@ -91,6 +89,7 @@ extern "C" {
#include "BKE_particle.h"
#include "BKE_rigidbody.h"
#include "BKE_shader_fx.h"
+#include "BKE_shrinkwrap.h"
#include "BKE_sound.h"
#include "BKE_tracking.h"
#include "BKE_world.h"
@@ -274,6 +273,28 @@ bool DepsgraphRelationBuilder::has_node(const OperationKey &key) const
return find_node(key) != NULL;
}
+void DepsgraphRelationBuilder::add_customdata_mask(const ComponentKey &key, uint64_t mask)
+{
+ if (mask != 0) {
+ OperationDepsNode *node = find_operation_node(key);
+
+ if (node != NULL) {
+ node->customdata_mask |= mask;
+ }
+ }
+}
+
+void DepsgraphRelationBuilder::add_special_eval_flag(ID *id, uint32_t flag)
+{
+ DEG::IDDepsNode *id_node = graph_->find_id_node(id);
+ if (id_node == NULL) {
+ BLI_assert(!"ID should always be valid");
+ }
+ else {
+ id_node->eval_flags |= flag;
+ }
+}
+
DepsRelation *DepsgraphRelationBuilder::add_time_relation(
TimeSourceDepsNode *timesrc,
DepsNode *node_to,
@@ -450,6 +471,9 @@ void DepsgraphRelationBuilder::build_id(ID *id)
case ID_SPK:
build_speaker((Speaker *)id);
break;
+ case ID_TXT:
+ /* Not a part of dependency graph. */
+ break;
default:
fprintf(stderr, "Unhandled ID %s\n", id->name);
BLI_assert(!"Should never happen");
@@ -465,6 +489,8 @@ void DepsgraphRelationBuilder::build_collection(
OperationKey object_transform_final_key(object != NULL ? &object->id : NULL,
DEG_NODE_TYPE_TRANSFORM,
DEG_OPCODE_TRANSFORM_FINAL);
+ ComponentKey duplicator_key(object != NULL ? &object->id : NULL,
+ DEG_NODE_TYPE_DUPLI);
if (!group_done) {
LISTBASE_FOREACH (CollectionObject *, cob, &collection->gobject) {
build_object(NULL, cob->ob);
@@ -477,7 +503,22 @@ void DepsgraphRelationBuilder::build_collection(
FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_BEGIN(collection, ob, graph_->mode)
{
ComponentKey dupli_transform_key(&ob->id, DEG_NODE_TYPE_TRANSFORM);
- add_relation(dupli_transform_key, object_transform_final_key, "Dupligroup");
+ add_relation(dupli_transform_key,
+ object_transform_final_key,
+ "Dupligroup");
+ /* Hook to special component, to ensure proper visibility/evaluation
+ * optimizations.
+ */
+ add_relation(dupli_transform_key, duplicator_key, "Dupligroup");
+ const eDepsNode_Type dupli_geometry_component_type =
+ deg_geometry_tag_to_component(&ob->id);
+ if (dupli_geometry_component_type != DEG_NODE_TYPE_UNDEFINED) {
+ ComponentKey dupli_geometry_component_key(
+ &ob->id, dupli_geometry_component_type);
+ add_relation(dupli_geometry_component_key,
+ duplicator_key,
+ "Dupligroup");
+ }
}
FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_END;
}
@@ -638,6 +679,15 @@ void DepsgraphRelationBuilder::build_object_data(Object *object)
case OB_GPENCIL:
{
build_object_data_geometry(object);
+ /* TODO(sergey): Only for until we support granular
+ * update of curves.
+ */
+ if (object->type == OB_FONT) {
+ Curve *curve = (Curve *)object->data;
+ if (curve->textoncurve) {
+ add_special_eval_flag(&curve->textoncurve->id, DAG_EVAL_NEED_CURVE_PATH);
+ }
+ }
break;
}
case OB_ARMATURE:
@@ -740,10 +790,7 @@ void DepsgraphRelationBuilder::build_object_parent(Object *object)
add_relation(parent_key, ob_key, "Vertex Parent");
/* XXX not sure what this is for or how you could be done properly - lukas */
- OperationDepsNode *parent_node = find_operation_node(parent_key);
- if (parent_node != NULL) {
- parent_node->customdata_mask |= CD_MASK_ORIGINDEX;
- }
+ add_customdata_mask(parent_key, CD_MASK_ORIGINDEX);
ComponentKey transform_key(&object->parent->id, DEG_NODE_TYPE_TRANSFORM);
add_relation(transform_key, ob_key, "Vertex Parent TFM");
@@ -916,7 +963,7 @@ void DepsgraphRelationBuilder::build_constraints(ID *id,
opcode);
add_relation(target_key, constraint_op_key, cti->name);
/* if needs bbone shape, also reference handles */
- if (con->flag & CONSTRAINT_BBONE_SHAPE) {
+ if (BKE_constraint_target_uses_bbone(con, ct)) {
bPoseChannel *pchan = BKE_pose_channel_find_name(ct->tar->pose, ct->subtarget);
/* actually a bbone */
if (pchan && pchan->bone && pchan->bone->segments > 1) {
@@ -954,16 +1001,27 @@ void DepsgraphRelationBuilder::build_constraints(ID *id,
ComponentKey target_key(&ct->tar->id, DEG_NODE_TYPE_GEOMETRY);
add_relation(target_key, constraint_op_key, cti->name);
if (ct->tar->type == OB_MESH) {
- OperationDepsNode *node2 = find_operation_node(target_key);
- if (node2 != NULL) {
- node2->customdata_mask |= CD_MASK_MDEFORMVERT;
- }
+ add_customdata_mask(target_key, CD_MASK_MDEFORMVERT);
}
}
else if (con->type == CONSTRAINT_TYPE_SHRINKWRAP) {
+ bShrinkwrapConstraint *scon = (bShrinkwrapConstraint *) con->data;
+
/* Constraints which requires the target object surface. */
ComponentKey target_key(&ct->tar->id, DEG_NODE_TYPE_GEOMETRY);
add_relation(target_key, constraint_op_key, cti->name);
+
+ /* Add dependency on normal layers if necessary. */
+ if (ct->tar->type == OB_MESH && scon->shrinkType != MOD_SHRINKWRAP_NEAREST_VERTEX) {
+ bool track = (scon->flag & CON_SHRINKWRAP_TRACK_NORMAL) != 0;
+ if (track || BKE_shrinkwrap_needs_normals(scon->shrinkType, scon->shrinkMode)) {
+ add_customdata_mask(target_key, CD_MASK_NORMAL | CD_MASK_CUSTOMLOOPNORMAL);
+ }
+ if (scon->shrinkType == MOD_SHRINKWRAP_TARGET_PROJECT) {
+ add_special_eval_flag(&ct->tar->id, DAG_EVAL_NEED_SHRINKWRAP_BOUNDARY);
+ }
+ }
+
/* NOTE: obdata eval now doesn't necessarily depend on the
* object's transform.
*/
@@ -975,11 +1033,11 @@ void DepsgraphRelationBuilder::build_constraints(ID *id,
/* Standard object relation. */
// TODO: loc vs rot vs scale?
if (&ct->tar->id == id) {
- /* Constraint targetting own object:
+ /* Constraint targeting own object:
* - This case is fine IFF 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 targetting case, just
+ * - If however it is a real self targeting case, just
* make it depend on the previous constraint (or the
* pre-constraint state).
*/
@@ -1132,6 +1190,11 @@ void DepsgraphRelationBuilder::build_animdata_nlastrip_targets(
{
LISTBASE_FOREACH(NlaStrip *, strip, strips) {
if (strip->act != NULL) {
+ build_action(strip->act);
+
+ ComponentKey action_key(&strip->act->id, DEG_NODE_TYPE_ANIMATION);
+ add_relation(action_key, adt_key, "Action -> Animation");
+
build_animdata_curves_targets(id, adt_key,
operation_from,
&strip->act->curves);
@@ -1447,14 +1510,18 @@ void DepsgraphRelationBuilder::build_world(World *world)
if (built_map_.checkIsBuiltAndTag(world)) {
return;
}
+ /* animation */
build_animdata(&world->id);
- /* TODO: other settings? */
/* world's nodetree */
if (world->nodetree != NULL) {
build_nodetree(world->nodetree);
- ComponentKey ntree_key(&world->nodetree->id, DEG_NODE_TYPE_SHADING);
- ComponentKey world_key(&world->id, DEG_NODE_TYPE_SHADING);
- add_relation(ntree_key, world_key, "NTree->World Shading Update");
+ OperationKey ntree_key(&world->nodetree->id,
+ DEG_NODE_TYPE_SHADING,
+ DEG_OPCODE_MATERIAL_UPDATE);
+ OperationKey world_key(&world->id,
+ DEG_NODE_TYPE_SHADING,
+ DEG_OPCODE_WORLD_UPDATE);
+ add_relation(ntree_key, world_key, "World's NTree");
build_nested_nodetree(&world->id, world->nodetree);
}
}
@@ -1761,7 +1828,7 @@ void DepsgraphRelationBuilder::build_shapekeys(Key *key)
* ==========================
*
* The evaluation of geometry on objects is as follows:
- * - The actual evaluated of the derived geometry (e.g. DerivedMesh, DispList)
+ * - The actual evaluated of the derived geometry (e.g. Mesh, DispList)
* occurs in the Geometry component of the object which references this.
* This includes modifiers, and the temporary "ubereval" for geometry.
* Therefore, each user of a piece of shared geometry data ends up evaluating
@@ -1895,6 +1962,13 @@ void DepsgraphRelationBuilder::build_object_data_geometry(Object *object)
add_relation(geom_init_key,
obdata_ubereval_key,
"Object Geometry UberEval");
+ if (object->totcol != 0 && object->type == OB_MESH) {
+ ComponentKey object_shading_key(&object->id, DEG_NODE_TYPE_SHADING);
+ DepsRelation *rel = add_relation(obdata_ubereval_key,
+ object_shading_key,
+ "Object Geometry batch Update");
+ rel->flag |= DEPSREL_FLAG_NO_FLUSH;
+ }
}
if (object->type == OB_MBALL) {
Object *mom = BKE_mball_basis_find(scene_, object);
@@ -2013,10 +2087,10 @@ void DepsgraphRelationBuilder::build_object_data_geometry_datablock(ID *obdata)
bGPdata *gpd = (bGPdata *)obdata;
/* Geometry cache needs to be recalculated on frame change
- * (e.g. to fix crashes after scrubbing the timeline when
- * onion skinning is enabled, since the ghosts need to be
- * re-added to the cache once scrubbing ends)
- */
+ * (e.g. to fix crashes after scrubbing the timeline when
+ * onion skinning is enabled, since the ghosts need to be
+ * re-added to the cache once scrubbing ends)
+ */
TimeSourceKey time_key;
ComponentKey geometry_key(obdata, DEG_NODE_TYPE_GEOMETRY);
add_relation(time_key,
@@ -2119,6 +2193,9 @@ void DepsgraphRelationBuilder::build_nodetree(bNodeTree *ntree)
else if (id_type == ID_TXT) {
/* Ignore script nodes. */
}
+ else if (id_type == ID_MSK) {
+ build_mask((Mask *)id);
+ }
else if (id_type == ID_MC) {
build_movieclip((MovieClip *)id);
}
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
index 20b425c81e3..e5854fa8d20 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
@@ -200,6 +200,9 @@ struct DepsgraphRelationBuilder
const char *description,
bool check_unique = false);
+ void add_customdata_mask(const ComponentKey &key, uint64_t mask);
+ void add_special_eval_flag(ID *object, uint32_t flag);
+
void build_id(ID *id);
void build_layer_collections(ListBase *lb);
void build_view_layer(Scene *scene, ViewLayer *view_layer);
@@ -313,7 +316,7 @@ protected:
/* TODO(sergey): All those is_same* functions are to be generalized. */
- /* Check whether two keys correponds to the same bone from same armature.
+ /* Check whether two keys corresponds to the same bone from same armature.
*
* This is used by drivers relations builder to avoid possible fake
* dependency cycle when one bone property drives another property of the
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc
index 811986ea0e8..331b476be2c 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc
@@ -129,10 +129,7 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *object,
add_relation(target_key, solver_key, con->name);
if (data->tar->type == OB_MESH) {
- OperationDepsNode *node2 = find_operation_node(target_key);
- if (node2 != NULL) {
- node2->customdata_mask |= CD_MASK_MDEFORMVERT;
- }
+ add_customdata_mask(target_key, CD_MASK_MDEFORMVERT);
}
}
else {
@@ -164,10 +161,7 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *object,
add_relation(target_key, solver_key, con->name);
if (data->poletar->type == OB_MESH) {
- OperationDepsNode *node2 = find_operation_node(target_key);
- if (node2 != NULL) {
- node2->customdata_mask |= CD_MASK_MDEFORMVERT;
- }
+ add_customdata_mask(target_key, CD_MASK_MDEFORMVERT);
}
}
else {
@@ -227,8 +221,8 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *object,
parchan = parchan->parent;
}
- OperationKey flush_key(&object->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
- add_relation(solver_key, flush_key, "PoseEval Result-Bone Link");
+ OperationKey done_key(&object->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
+ add_relation(solver_key, done_key, "PoseEval Result-Bone Link");
}
/* Spline IK Eval Steps */
@@ -240,8 +234,12 @@ void DepsgraphRelationBuilder::build_splineik_pose(Object *object,
bSplineIKConstraint *data = (bSplineIKConstraint *)con->data;
bPoseChannel *rootchan = BKE_armature_splineik_solver_find_root(pchan, data);
OperationKey transforms_key(&object->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_READY);
+ OperationKey init_ik_key(&object->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_INIT_IK);
OperationKey solver_key(&object->id, DEG_NODE_TYPE_EVAL_POSE, rootchan->name, DEG_OPCODE_POSE_SPLINE_IK_SOLVER);
+ /* Solver depends on initialization. */
+ add_relation(init_ik_key, solver_key, "Init IK -> IK Solver");
+
/* attach owner to IK Solver too
* - assume that owner is always part of chain
* - see notes on direction of rel below...
@@ -296,8 +294,8 @@ void DepsgraphRelationBuilder::build_splineik_pose(Object *object,
if ((segcount == data->chainlen) || (segcount > 255)) break; /* 255 is weak */
}
- OperationKey flush_key(&object->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
- add_relation(solver_key, flush_key, "PoseEval Result-Bone Link");
+ OperationKey done_key(&object->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
+ add_relation(solver_key, done_key, "PoseEval Result-Bone Link");
}
/* Pose/Armature Bones Graph */
@@ -308,20 +306,28 @@ void DepsgraphRelationBuilder::build_rig(Object *object)
// TODO: selection status?
/* Attach links between pose operations. */
ComponentKey local_transform(&object->id, DEG_NODE_TYPE_TRANSFORM);
- OperationKey init_key(&object->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_INIT);
- OperationKey init_ik_key(&object->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_INIT_IK);
- OperationKey flush_key(&object->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
- add_relation(local_transform, init_key, "Local Transform -> Pose Init");
- add_relation(init_key, init_ik_key, "Pose Init -> Pose Init IK");
- add_relation(init_ik_key, flush_key, "Pose Init IK -> Pose Cleanup");
+ OperationKey pose_init_key(
+ &object->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_INIT);
+ OperationKey pose_init_ik_key(
+ &object->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_INIT_IK);
+ OperationKey pose_cleanup_key(
+ &object->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_CLEANUP);
+ OperationKey pose_done_key(
+ &object->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
+ add_relation(
+ local_transform, pose_init_key, "Local Transform -> Pose Init");
+ add_relation(pose_init_key, pose_init_ik_key, "Pose Init -> Pose Init IK");
+ add_relation(
+ pose_init_ik_key, pose_done_key, "Pose Init IK -> Pose Cleanup");
/* Make sure pose is up-to-date with armature updates. */
build_armature(armature);
OperationKey armature_key(&armature->id,
DEG_NODE_TYPE_PARAMETERS,
DEG_OPCODE_PLACEHOLDER,
"Armature Eval");
- add_relation(armature_key, init_key, "Data dependency");
- /* IK Solvers...
+ add_relation(armature_key, pose_init_key, "Data dependency");
+ /* IK Solvers.
+ *
* - These require separate processing steps are pose-level
* to be executed between chains of bones (i.e. once the
* base transforms of a bunch of bones is done)
@@ -379,15 +385,27 @@ void DepsgraphRelationBuilder::build_rig(Object *object)
}
/* Links between operations for each bone. */
LISTBASE_FOREACH (bPoseChannel *, pchan, &object->pose->chanbase) {
- OperationKey bone_local_key(&object->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_LOCAL);
- OperationKey bone_pose_key(&object->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_POSE_PARENT);
- OperationKey bone_ready_key(&object->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_READY);
- OperationKey bone_done_key(&object->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_DONE);
+ OperationKey bone_local_key(&object->id,
+ DEG_NODE_TYPE_BONE,
+ pchan->name,
+ DEG_OPCODE_BONE_LOCAL);
+ OperationKey bone_pose_key(&object->id,
+ DEG_NODE_TYPE_BONE,
+ pchan->name,
+ DEG_OPCODE_BONE_POSE_PARENT);
+ OperationKey bone_ready_key(&object->id,
+ DEG_NODE_TYPE_BONE,
+ pchan->name,
+ DEG_OPCODE_BONE_READY);
+ OperationKey bone_done_key(&object->id,
+ DEG_NODE_TYPE_BONE,
+ pchan->name,
+ DEG_OPCODE_BONE_DONE);
pchan->flag &= ~POSE_DONE;
/* Pose init to bone local. */
- add_relation(init_key, bone_local_key, "PoseEval Source-Bone Link");
+ add_relation(pose_init_key, bone_local_key, "Pose Init - Bone Local");
/* Local to pose parenting operation. */
- add_relation(bone_local_key, bone_pose_key, "Bone Local - PoseSpace Link");
+ add_relation(bone_local_key, bone_pose_key, "Bone Local - Bone Pose");
/* Parent relation. */
if (pchan->parent != NULL) {
eDepsOperation_Code parent_key_opcode;
@@ -402,43 +420,52 @@ void DepsgraphRelationBuilder::build_rig(Object *object)
parent_key_opcode = DEG_OPCODE_BONE_DONE;
}
- OperationKey parent_key(&object->id, DEG_NODE_TYPE_BONE, pchan->parent->name, parent_key_opcode);
+ OperationKey parent_key(&object->id,
+ DEG_NODE_TYPE_BONE,
+ pchan->parent->name,
+ parent_key_opcode);
add_relation(parent_key, bone_pose_key, "Parent Bone -> Child Bone");
}
- /* Buil constraints. */
+ /* Build constraints. */
if (pchan->constraints.first != NULL) {
/* Build relations for indirectly linked objects. */
BuilderWalkUserData data;
data.builder = this;
BKE_constraints_id_loop(&pchan->constraints, constraint_walk, &data);
-
- /* constraints stack and constraint dependencies */
- build_constraints(&object->id, DEG_NODE_TYPE_BONE, pchan->name, &pchan->constraints, &root_map);
-
- /* pose -> constraints */
- OperationKey constraints_key(&object->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_CONSTRAINTS);
+ /* Constraints stack and constraint dependencies. */
+ build_constraints(&object->id,
+ DEG_NODE_TYPE_BONE,
+ pchan->name,
+ &pchan->constraints,
+ &root_map);
+ /* Pose -> constraints. */
+ OperationKey constraints_key(&object->id,
+ DEG_NODE_TYPE_BONE,
+ pchan->name,
+ DEG_OPCODE_BONE_CONSTRAINTS);
add_relation(bone_pose_key, constraints_key, "Constraints Stack");
-
- /* constraints -> ready */
- // TODO: when constraint stack is exploded, this step should occur before the first IK solver
- add_relation(constraints_key, bone_ready_key, "Constraints -> Ready");
+ /* Constraints -> ready/ */
+ /* TODO(sergey): When constraint stack is exploded, this step should
+ * occur before the first IK solver.
+ */
+ add_relation(
+ constraints_key, bone_ready_key, "Constraints -> Ready");
}
else {
- /* pose -> ready */
+ /* Pose -> Ready */
add_relation(bone_pose_key, bone_ready_key, "Pose -> Ready");
}
-
- /* bone ready -> done
+ /* Bone ready -> Bone done.
* NOTE: For bones without IK, this is all that's needed.
* For IK chains however, an additional rel is created from IK
* to done, with transitive reduction removing this one..
*/
add_relation(bone_ready_key, bone_done_key, "Ready -> Done");
-
/* assume that all bones must be done for the pose to be ready
* (for deformers)
*/
- add_relation(bone_done_key, flush_key, "PoseEval Result-Bone Link");
+ add_relation(bone_done_key, pose_done_key, "PoseEval Result-Bone Link");
+ add_relation(bone_done_key, pose_cleanup_key, "Cleanup dependency");
/* Custom shape. */
if (pchan->custom != NULL) {
build_object(NULL, pchan->custom);
@@ -457,6 +484,9 @@ void DepsgraphRelationBuilder::build_proxy_rig(Object *object)
OperationKey pose_done_key(&object->id,
DEG_NODE_TYPE_EVAL_POSE,
DEG_OPCODE_POSE_DONE);
+ OperationKey pose_cleanup_key(&object->id,
+ DEG_NODE_TYPE_EVAL_POSE,
+ DEG_OPCODE_POSE_CLEANUP);
LISTBASE_FOREACH (bPoseChannel *, pchan, &object->pose->chanbase) {
OperationKey bone_local_key(&object->id,
DEG_NODE_TYPE_BONE, pchan->name,
@@ -476,6 +506,8 @@ void DepsgraphRelationBuilder::build_proxy_rig(Object *object)
add_relation(pose_init_key, bone_local_key, "Pose Init -> Bone Local");
add_relation(bone_local_key, bone_ready_key, "Local -> Ready");
add_relation(bone_ready_key, bone_done_key, "Ready -> Done");
+ add_relation(
+ bone_done_key, pose_cleanup_key, "Bone Done -> Pose Cleanup");
add_relation(bone_done_key, pose_done_key, "Bone Done -> Pose Done");
/* Make sure bone in the proxy is not done before it's FROM is done. */
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_transitive.cc b/source/blender/depsgraph/intern/builder/deg_builder_transitive.cc
index 17e64c5f685..a39b18f2f0a 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_transitive.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_transitive.cc
@@ -65,16 +65,16 @@ enum {
static void deg_graph_tag_paths_recursive(DepsNode *node)
{
- if (node->done & OP_VISITED) {
+ if (node->custom_flags & OP_VISITED) {
return;
}
- node->done |= OP_VISITED;
+ node->custom_flags |= OP_VISITED;
foreach (DepsRelation *rel, node->inlinks) {
deg_graph_tag_paths_recursive(rel->from);
/* Do this only in inlinks loop, so the target node does not get
* flagged.
*/
- rel->from->done |= OP_REACHABLE;
+ rel->from->custom_flags |= OP_REACHABLE;
}
}
@@ -84,13 +84,13 @@ void deg_graph_transitive_reduction(Depsgraph *graph)
foreach (OperationDepsNode *target, graph->operations) {
/* Clear tags. */
foreach (OperationDepsNode *node, graph->operations) {
- node->done = 0;
+ node->custom_flags = 0;
}
/* Mark nodes from which we can reach the target
* start with children, so the target node and direct children are not
* flagged.
*/
- target->done |= OP_VISITED;
+ target->custom_flags |= OP_VISITED;
foreach (DepsRelation *rel, target->inlinks) {
deg_graph_tag_paths_recursive(rel->from);
}
@@ -101,13 +101,14 @@ void deg_graph_transitive_reduction(Depsgraph *graph)
{
DepsRelation *rel = *it_rel;
if (rel->from->type == DEG_NODE_TYPE_TIMESOURCE) {
- /* HACK: time source nodes don't get "done" flag set/cleared. */
+ /* HACK: time source nodes don't get "custom_flags" flag
+ * set/cleared. */
/* TODO: there will be other types in future, so iterators above
* need modifying.
*/
++it_rel;
}
- else if (rel->from->done & OP_REACHABLE) {
+ else if (rel->from->custom_flags & OP_REACHABLE) {
rel->unlink();
OBJECT_GUARDED_DELETE(rel, DepsRelation);
++num_removed_relations;
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 df6e72f490f..47cb3ebcd91 100644
--- a/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc
+++ b/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc
@@ -408,6 +408,7 @@ static void deg_debug_graphviz_node(const DebugContext &ctx,
case DEG_NODE_TYPE_COPY_ON_WRITE:
case DEG_NODE_TYPE_OBJECT_FROM_LAYER:
case DEG_NODE_TYPE_BATCH_CACHE:
+ case DEG_NODE_TYPE_DUPLI:
{
ComponentDepsNode *comp_node = (ComponentDepsNode *)node;
if (!comp_node->operations.empty()) {
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 47b4895942e..0ea9f564fb1 100644
--- a/source/blender/depsgraph/intern/debug/deg_debug_stats_gnuplot.cc
+++ b/source/blender/depsgraph/intern/debug/deg_debug_stats_gnuplot.cc
@@ -84,7 +84,7 @@ BLI_INLINE double get_node_time(const DebugContext& /*ctx*/,
bool stat_entry_comparator(const StatsEntry& a, const StatsEntry& b)
{
- return a.time < b.time;
+ return a.time > b.time;
}
string gnuplotify_id_code(const string& name)
@@ -125,6 +125,7 @@ void write_stats_data(const DebugContext& ctx)
std::sort(stats.begin(), stats.end(), stat_entry_comparator);
// We limit number of entries, otherwise things become unreadable.
stats.resize(min_ii(stats.size(), 32));
+ std::reverse(stats.begin(), stats.end());
// Print data to the file stream.
deg_debug_fprintf(ctx, "$data << EOD" NL);
foreach (const StatsEntry& entry, stats) {
diff --git a/source/blender/depsgraph/intern/depsgraph.cc b/source/blender/depsgraph/intern/depsgraph.cc
index 3652cfe61fe..59322808100 100644
--- a/source/blender/depsgraph/intern/depsgraph.cc
+++ b/source/blender/depsgraph/intern/depsgraph.cc
@@ -154,7 +154,7 @@ static bool pointer_to_component_node_criteria(
else if (ptr->type == &RNA_Bone) {
Bone *bone = (Bone *)ptr->data;
/* armature-level bone, but it ends up going to bone component anyway */
- // NOTE: the ID in thise case will end up being bArmature.
+ // NOTE: the ID in this case will end up being bArmature.
*type = DEG_NODE_TYPE_BONE;
*subdata = bone->name;
return true;
diff --git a/source/blender/depsgraph/intern/depsgraph.h b/source/blender/depsgraph/intern/depsgraph.h
index 804fd1b36c2..3e7d34414ea 100644
--- a/source/blender/depsgraph/intern/depsgraph.h
+++ b/source/blender/depsgraph/intern/depsgraph.h
@@ -40,7 +40,7 @@
#include "DNA_ID.h" /* for ID_Type */
-#include "BKE_library.h" /* for MAX_LIBARRAY */
+#include "BKE_main.h" /* for MAX_LIBARRAY */
#include "BLI_threads.h" /* for SpinLock */
diff --git a/source/blender/depsgraph/intern/depsgraph_build.cc b/source/blender/depsgraph/intern/depsgraph_build.cc
index fccb5808711..eb125229c6a 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.cc
+++ b/source/blender/depsgraph/intern/depsgraph_build.cc
@@ -131,6 +131,23 @@ void DEG_add_object_relation(DepsNodeHandle *handle,
description);
}
+void DEG_add_object_relation_with_customdata(DepsNodeHandle *handle,
+ Object *object,
+ eDepsObjectComponentType component,
+ uint64_t customdata_mask,
+ const char *description)
+{
+ DEG::eDepsNode_Type type = deg_build_object_component_type(component);
+ DEG::ComponentKey comp_key(&object->id, type);
+ DEG::DepsNodeHandle *deg_handle = get_handle(handle);
+ deg_handle->builder->add_node_handle_relation(comp_key,
+ deg_handle,
+ description);
+ if (object->type == OB_MESH) {
+ deg_handle->builder->add_customdata_mask(comp_key, customdata_mask);
+ }
+}
+
void DEG_add_object_cache_relation(DepsNodeHandle *handle,
CacheFile *cache_file,
eDepsObjectComponentType component,
@@ -161,26 +178,17 @@ void DEG_add_bone_relation(DepsNodeHandle *handle,
description);
}
-struct Depsgraph *DEG_get_graph_from_handle(struct DepsNodeHandle *handle)
+void DEG_add_special_eval_flag(struct DepsNodeHandle *handle, ID *id, uint32_t flag)
{
DEG::DepsNodeHandle *deg_handle = get_handle(handle);
- DEG::DepsgraphRelationBuilder *relation_builder = deg_handle->builder;
- return reinterpret_cast<Depsgraph *>(relation_builder->getGraph());
+ deg_handle->builder->add_special_eval_flag(id, flag);
}
-void DEG_add_special_eval_flag(Depsgraph *graph, ID *id, short flag)
+struct Depsgraph *DEG_get_graph_from_handle(struct DepsNodeHandle *handle)
{
- DEG::Depsgraph *deg_graph = reinterpret_cast<DEG::Depsgraph *>(graph);
- if (graph == NULL) {
- BLI_assert(!"Graph should always be valid");
- return;
- }
- DEG::IDDepsNode *id_node = deg_graph->find_id_node(id);
- if (id_node == NULL) {
- BLI_assert(!"ID should always be valid");
- return;
- }
- id_node->eval_flags |= flag;
+ DEG::DepsNodeHandle *deg_handle = get_handle(handle);
+ DEG::DepsgraphRelationBuilder *relation_builder = deg_handle->builder;
+ return reinterpret_cast<Depsgraph *>(relation_builder->getGraph());
}
/* ******************** */
@@ -198,69 +206,49 @@ void DEG_graph_build_from_view_layer(Depsgraph *graph,
if (G.debug & G_DEBUG_DEPSGRAPH_BUILD) {
start_time = PIL_check_seconds_timer();
}
-
DEG::Depsgraph *deg_graph = reinterpret_cast<DEG::Depsgraph *>(graph);
+ /* Perform sanity checks. */
BLI_assert(BLI_findindex(&scene->view_layers, view_layer) != -1);
-
BLI_assert(deg_graph->scene == scene);
BLI_assert(deg_graph->view_layer == view_layer);
-
- /* TODO(sergey): This is a bit tricky, but ensures that all the data
- * is evaluated properly when depsgraph is becoming "visible".
- *
- * This now could happen for both visible scene is changed and extra
- * dependency graph was created for render engine.
- */
- const bool need_on_visible_update = (deg_graph->id_nodes.size() == 0);
-
- /* 1) Generate all the nodes in the graph first */
+ /* Generate all the nodes in the graph first */
DEG::DepsgraphNodeBuilder node_builder(bmain, deg_graph);
node_builder.begin_build();
node_builder.build_view_layer(scene,
view_layer,
DEG::DEG_ID_LINKED_DIRECTLY);
node_builder.end_build();
-
- /* 2) Hook up relationships between operations - to determine evaluation
- * order.
+ /* Hook up relationships between operations - to determine evaluation
+ * order.
*/
DEG::DepsgraphRelationBuilder relation_builder(bmain, deg_graph);
relation_builder.begin_build();
relation_builder.build_view_layer(scene, view_layer);
relation_builder.build_copy_on_write_relations();
-
/* Detect and solve cycles. */
DEG::deg_graph_detect_cycles(deg_graph);
-
- /* 3) Simplify the graph by removing redundant relations (to optimize
- * traversal later). */
+ /* Simplify the graph by removing redundant relations (to optimize
+ * traversal later). */
/* TODO: it would be useful to have an option to disable this in cases where
* it is causing trouble.
*/
if (G.debug_value == 799) {
DEG::deg_graph_transitive_reduction(deg_graph);
}
-
- /* 4) Flush visibility layer and re-schedule nodes for update. */
+ /* Store pointers to commonly used valuated datablocks. */
+ deg_graph->scene_cow = (Scene *)deg_graph->get_cow_id(&deg_graph->scene->id);
+ /* Flush visibility layer and re-schedule nodes for update. */
DEG::deg_graph_build_finalize(bmain, deg_graph);
-
+ DEG_graph_on_visible_update(bmain, graph);
#if 0
if (!DEG_debug_consistency_check(deg_graph)) {
printf("Consistency validation failed, ABORTING!\n");
abort();
}
#endif
-
/* Relations are up to date. */
deg_graph->need_update = false;
-
- /* Store pointers to commonly used valuated datablocks. */
- deg_graph->scene_cow = (Scene *)deg_graph->get_cow_id(&deg_graph->scene->id);
-
- if (need_on_visible_update) {
- DEG_graph_on_visible_update(bmain, graph);
- }
-
+ /* Finish statistics. */
if (G.debug & G_DEBUG_DEPSGRAPH_BUILD) {
printf("Depsgraph built in %f seconds.\n",
PIL_check_seconds_timer() - start_time);
diff --git a/source/blender/depsgraph/intern/depsgraph_debug.cc b/source/blender/depsgraph/intern/depsgraph_debug.cc
index f7adaafe5b3..91db054b006 100644
--- a/source/blender/depsgraph/intern/depsgraph_debug.cc
+++ b/source/blender/depsgraph/intern/depsgraph_debug.cc
@@ -171,11 +171,11 @@ bool DEG_debug_consistency_check(Depsgraph *graph)
/* Validate node valency calculated in both directions. */
foreach (DEG::OperationDepsNode *node, deg_graph->operations) {
node->num_links_pending = 0;
- node->done = 0;
+ node->custom_flags = 0;
}
foreach (DEG::OperationDepsNode *node, deg_graph->operations) {
- if (node->done) {
+ if (node->custom_flags) {
printf("Node %s is twice in the operations!\n",
node->identifier().c_str());
return false;
@@ -187,7 +187,7 @@ bool DEG_debug_consistency_check(Depsgraph *graph)
++to->num_links_pending;
}
}
- node->done = 1;
+ node->custom_flags = 1;
}
foreach (DEG::OperationDepsNode *node, deg_graph->operations) {
diff --git a/source/blender/depsgraph/intern/depsgraph_eval.cc b/source/blender/depsgraph/intern/depsgraph_eval.cc
index edb6600f3e0..5b6516509b0 100644
--- a/source/blender/depsgraph/intern/depsgraph_eval.cc
+++ b/source/blender/depsgraph/intern/depsgraph_eval.cc
@@ -63,6 +63,10 @@ void DEG_evaluate_on_refresh(Depsgraph *graph)
/* Update time on primary timesource. */
DEG::TimeSourceDepsNode *tsrc = deg_graph->find_time_source();
tsrc->cfra = deg_graph->ctime;
+ /* Update time in scene. */
+ if (deg_graph->scene_cow) {
+ BKE_scene_frame_set(deg_graph->scene_cow, deg_graph->ctime);
+ }
DEG::deg_evaluate_on_refresh(deg_graph);
}
@@ -78,6 +82,10 @@ void DEG_evaluate_on_framechange(Main *bmain,
tsrc->cfra = ctime;
tsrc->tag_update(deg_graph);
DEG::deg_graph_flush_updates(bmain, deg_graph);
+ /* Update time in scene. */
+ if (deg_graph->scene_cow) {
+ BKE_scene_frame_set(deg_graph->scene_cow, deg_graph->ctime);
+ }
/* Perform recalculation updates. */
DEG::deg_evaluate_on_refresh(deg_graph);
}
diff --git a/source/blender/depsgraph/intern/depsgraph_intern.h b/source/blender/depsgraph/intern/depsgraph_intern.h
index aa67226c47e..069407e855e 100644
--- a/source/blender/depsgraph/intern/depsgraph_intern.h
+++ b/source/blender/depsgraph/intern/depsgraph_intern.h
@@ -146,4 +146,8 @@ struct ListBase *deg_build_effector_relations(Depsgraph *graph, struct Collectio
struct ListBase *deg_build_collision_relations(Depsgraph *graph, struct Collection *collection, unsigned int modifier_type);
void deg_clear_physics_relations(Depsgraph *graph);
+/* Tagging Utilities -------------------------------------------------------- */
+
+eDepsNode_Type deg_geometry_tag_to_component(const ID *id);
+
} // namespace DEG
diff --git a/source/blender/depsgraph/intern/depsgraph_query.cc b/source/blender/depsgraph/intern/depsgraph_query.cc
index 631669babb2..946917afb26 100644
--- a/source/blender/depsgraph/intern/depsgraph_query.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query.cc
@@ -100,7 +100,7 @@ bool DEG_id_type_any_updated(const Depsgraph *graph)
return false;
}
-short DEG_get_eval_flags_for_id(const Depsgraph *graph, ID *id)
+uint32_t DEG_get_eval_flags_for_id(const Depsgraph *graph, ID *id)
{
if (graph == NULL) {
/* Happens when converting objects to mesh from a python script
@@ -113,7 +113,7 @@ short DEG_get_eval_flags_for_id(const Depsgraph *graph, ID *id)
}
const DEG::Depsgraph *deg_graph = reinterpret_cast<const DEG::Depsgraph *>(graph);
- const DEG::IDDepsNode *id_node = deg_graph->find_id_node(id);
+ const DEG::IDDepsNode *id_node = deg_graph->find_id_node(DEG_get_original_id(id));
if (id_node == NULL) {
/* TODO(sergey): Does it mean we need to check set scene? */
return 0;
diff --git a/source/blender/depsgraph/intern/depsgraph_query_filter.cc b/source/blender/depsgraph/intern/depsgraph_query_filter.cc
index 300f2a300d1..83963e7e5b2 100644
--- a/source/blender/depsgraph/intern/depsgraph_query_filter.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query_filter.cc
@@ -66,6 +66,7 @@ extern "C" {
#include "intern/nodes/deg_node_id.h"
#include "intern/nodes/deg_node_operation.h"
+
/* *************************************************** */
/* Graph Filtering Internals */
@@ -119,12 +120,12 @@ static void deg_unlink_opnode(Depsgraph *graph, OperationDepsNode *op_node)
static void deg_filter_remove_unwanted_ids(Depsgraph *graph, GSet *retained_ids)
{
/* 1) First pass over ID nodes + their operations
- * - Identify and tag ID's (via "done = 1") to be removed
+ * - Identify and tag ID's (via "custom_flags = 1") to be removed
* - Remove all links to/from operations that will be removed
*/
foreach (IDDepsNode *id_node, graph->id_nodes) {
- id_node->done = !BLI_gset_haskey(retained_ids, (void *)id_node->id_orig);
- if (id_node->done) {
+ id_node->custom_flags = !BLI_gset_haskey(retained_ids, (void *)id_node->id_orig);
+ if (id_node->custom_flags) {
GHASH_FOREACH_BEGIN(ComponentDepsNode *, comp_node, id_node->components)
{
foreach (OperationDepsNode *op_node, comp_node->operations) {
@@ -136,14 +137,13 @@ static void deg_filter_remove_unwanted_ids(Depsgraph *graph, GSet *retained_ids)
}
/* 2) Remove unwanted operations from graph->operations */
- /* changed from const_iterator to iterator because it errors out on erase on older GCC like 4.8 */
for (Depsgraph::OperationNodes::iterator it_opnode = graph->operations.begin();
it_opnode != graph->operations.end();
)
{
OperationDepsNode *op_node = *it_opnode;
IDDepsNode *id_node = op_node->owner->owner;
- if (id_node->done) {
+ if (id_node->custom_flags) {
it_opnode = graph->operations.erase(it_opnode);
}
else {
@@ -157,7 +157,6 @@ static void deg_filter_remove_unwanted_ids(Depsgraph *graph, GSet *retained_ids)
* However, we don't worry about the conditional freeing for physics
* stuff, since it's rarely needed currently.
*/
- /* changed from const_iterator to iterator because it errors out on erase on older GCC like 4.8 */
for (Depsgraph::IDDepsNodes::iterator it_id = graph->id_nodes.begin();
it_id != graph->id_nodes.end();
)
@@ -165,12 +164,11 @@ static void deg_filter_remove_unwanted_ids(Depsgraph *graph, GSet *retained_ids)
IDDepsNode *id_node = *it_id;
ID *id = id_node->id_orig;
- if (id_node->done) {
+ if (id_node->custom_flags) {
/* Destroy node data, then remove from collections, and free */
id_node->destroy();
BLI_ghash_remove(graph->id_hash, id, NULL, NULL);
-
it_id = graph->id_nodes.erase(it_id);
OBJECT_GUARDED_DELETE(id_node, IDDepsNode);
diff --git a/source/blender/depsgraph/intern/depsgraph_query_foreach.cc b/source/blender/depsgraph/intern/depsgraph_query_foreach.cc
index c8aaf353874..b6138e4e81c 100644
--- a/source/blender/depsgraph/intern/depsgraph_query_foreach.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query_foreach.cc
@@ -60,6 +60,9 @@ extern "C" {
namespace DEG {
typedef std::deque<OperationDepsNode *> TraversalQueue;
+enum {
+ DEG_NODE_VISITED = (1 << 0),
+};
static void deg_foreach_clear_flags(const Depsgraph *graph)
{
@@ -67,7 +70,7 @@ static void deg_foreach_clear_flags(const Depsgraph *graph)
op_node->scheduled = false;
}
foreach (IDDepsNode *id_node, graph->id_nodes) {
- id_node->done = false;
+ id_node->custom_flags = 0;
}
}
@@ -96,7 +99,7 @@ static void deg_foreach_dependent_ID(const Depsgraph *graph,
}
}
GHASH_FOREACH_END();
- target_id_node->done = true;
+ target_id_node->custom_flags |= DEG_NODE_VISITED;
/* Process the queue. */
while (!queue.empty()) {
/* get next operation node to process. */
@@ -106,10 +109,10 @@ static void deg_foreach_dependent_ID(const Depsgraph *graph,
/* Check whether we need to inform callee about corresponding ID node. */
ComponentDepsNode *comp_node = op_node->owner;
IDDepsNode *id_node = comp_node->owner;
- if (!id_node->done) {
+ if ((id_node->custom_flags & DEG_NODE_VISITED) == 0) {
/* TODO(sergey): Is it orig or CoW? */
callback(id_node->id_orig, user_data);
- id_node->done = true;
+ id_node->custom_flags |= DEG_NODE_VISITED;
}
/* Schedule outgoing operation nodes. */
if (op_node->outlinks.size() == 1) {
@@ -161,7 +164,7 @@ static void deg_foreach_ancestor_ID(const Depsgraph *graph,
}
}
GHASH_FOREACH_END();
- target_id_node->done = true;
+ target_id_node->custom_flags |= DEG_NODE_VISITED;
/* Process the queue. */
while (!queue.empty()) {
/* get next operation node to process. */
@@ -171,10 +174,10 @@ static void deg_foreach_ancestor_ID(const Depsgraph *graph,
/* Check whether we need to inform callee about corresponding ID node. */
ComponentDepsNode *comp_node = op_node->owner;
IDDepsNode *id_node = comp_node->owner;
- if (!id_node->done) {
+ if ((id_node->custom_flags & DEG_NODE_VISITED) == 0) {
/* TODO(sergey): Is it orig or CoW? */
callback(id_node->id_orig, user_data);
- id_node->done = true;
+ id_node->custom_flags |= DEG_NODE_VISITED;
}
/* Schedule incoming operation nodes. */
if (op_node->inlinks.size() == 1) {
diff --git a/source/blender/depsgraph/intern/depsgraph_query_iter.cc b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
index 2524dbef367..738bd107b01 100644
--- a/source/blender/depsgraph/intern/depsgraph_query_iter.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
@@ -93,7 +93,7 @@ void verify_id_properties_freed(DEGObjectIterData *data)
const Object *dupli_object = data->dupli_object_current->ob;
Object *temp_dupli_object = &data->temp_dupli_object;
if (temp_dupli_object->id.properties == NULL) {
- // No ID proeprties in temp datablock -- no leak is possible.
+ // No ID properties in temp datablock -- no leak is possible.
return;
}
if (temp_dupli_object->id.properties == dupli_object->id.properties) {
@@ -163,7 +163,7 @@ void deg_iterator_objects_step(BLI_Iterator *iter, DEG::IDDepsNode *id_node)
/* Set it early in case we need to exit and we are running from within a loop. */
iter->skip = true;
- if (!id_node->is_visible) {
+ if (!id_node->is_directly_visible) {
return;
}
@@ -302,7 +302,7 @@ static void DEG_iterator_ids_step(BLI_Iterator *iter, DEG::IDDepsNode *id_node,
{
ID *id_cow = id_node->id_cow;
- if (!id_node->is_visible) {
+ if (!id_node->is_directly_visible) {
iter->skip = true;
return;
}
diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cc b/source/blender/depsgraph/intern/depsgraph_tag.cc
index e2c28f0d1e1..e2a87f16408 100644
--- a/source/blender/depsgraph/intern/depsgraph_tag.cc
+++ b/source/blender/depsgraph/intern/depsgraph_tag.cc
@@ -52,8 +52,6 @@ extern "C" {
#include "BKE_animsys.h"
#include "BKE_idcode.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_scene.h"
#include "BKE_workspace.h"
@@ -67,6 +65,7 @@ extern "C" {
#include "DEG_depsgraph_query.h"
#include "intern/builder/deg_builder.h"
+#include "intern/eval/deg_eval_copy_on_write.h"
#include "intern/eval/deg_eval_flush.h"
#include "intern/nodes/deg_node.h"
#include "intern/nodes/deg_node_component.h"
@@ -88,44 +87,9 @@ void deg_graph_id_tag_update(Main *bmain, Depsgraph *graph, ID *id, int flag);
void depsgraph_geometry_tag_to_component(const ID *id,
eDepsNode_Type *component_type)
{
- const ID_Type id_type = GS(id->name);
- switch (id_type) {
- case ID_OB:
- {
- const Object *object = (Object *)id;
- switch (object->type) {
- case OB_MESH:
- case OB_CURVE:
- case OB_SURF:
- case OB_FONT:
- case OB_LATTICE:
- case OB_MBALL:
- case OB_GPENCIL:
- *component_type = DEG_NODE_TYPE_GEOMETRY;
- break;
- case OB_ARMATURE:
- *component_type = DEG_NODE_TYPE_EVAL_POSE;
- break;
- /* TODO(sergey): More cases here? */
- }
- break;
- }
- case ID_ME:
- *component_type = DEG_NODE_TYPE_GEOMETRY;
- break;
- case ID_PA: /* Particles */
- return;
- case ID_LP:
- *component_type = DEG_NODE_TYPE_PARAMETERS;
- break;
- case ID_GD:
- *component_type = DEG_NODE_TYPE_GEOMETRY;
- break;
- case ID_PAL: /* Palettes */
- *component_type = DEG_NODE_TYPE_PARAMETERS;
- break;
- default:
- break;
+ const eDepsNode_Type result = deg_geometry_tag_to_component(id);
+ if (result != DEG_NODE_TYPE_UNDEFINED) {
+ *component_type = result;
}
}
@@ -519,38 +483,95 @@ void deg_id_tag_update(Main *bmain, ID *id, int flag)
void deg_graph_on_visible_update(Main *bmain, Depsgraph *graph)
{
- /* Make sure objects are up to date. */
foreach (DEG::IDDepsNode *id_node, graph->id_nodes) {
- const ID_Type id_type = GS(id_node->id_orig->name);
- int flag = DEG_TAG_COPY_ON_WRITE;
+ if (!id_node->visible_components_mask) {
+ /* ID has no components which affects anything visible. no meed
+ * bother with it to tag or anything.
+ */
+ continue;
+ }
+ if (id_node->visible_components_mask ==
+ id_node->previously_visible_components_mask)
+ {
+ /* The ID was already visible and evaluated, all the subsequent
+ * updates and tags are to be done explicitly.
+ */
+ continue;
+ }
+ int flag = 0;
+ if (!DEG::deg_copy_on_write_is_expanded(id_node->id_cow)) {
+ flag |= DEG_TAG_COPY_ON_WRITE;
+ }
/* We only tag components which needs an update. Tagging everything is
* not a good idea because that might reset particles cache (or any
* other type of cache).
*
* TODO(sergey): Need to generalize this somehow.
*/
+ const ID_Type id_type = GS(id_node->id_orig->name);
if (id_type == ID_OB) {
flag |= OB_RECALC_OB | OB_RECALC_DATA;
}
deg_graph_id_tag_update(bmain, graph, id_node->id_orig, flag);
- }
- /* Make sure collection properties are up to date. */
- for (Scene *scene_iter = graph->scene;
- scene_iter != NULL;
- scene_iter = scene_iter->set)
- {
- IDDepsNode *scene_id_node = graph->find_id_node(&scene_iter->id);
- if (scene_id_node != NULL) {
- scene_id_node->tag_update(graph);
- }
- else {
- BLI_assert(graph->need_update);
+ if (id_type == ID_SCE) {
+ /* Make sure collection properties are up to date. */
+ id_node->tag_update(graph);
}
+ /* Now when ID is updated to the new visibility state, prevent it from
+ * being re-tagged again. Simplest way to do so is to pretend that it
+ * was already updated by the "previous" dependency graph.
+ *
+ * NOTE: Even if the on_visible_update() is called from the state when
+ * dependency graph is tagged for relations update, it will be fine:
+ * since dependency graph builder re-schedules entry tags, all the
+ * tags we request from here will be applied in the updated state of
+ * dependency graph.
+ */
+ id_node->previously_visible_components_mask =
+ id_node->visible_components_mask;
}
}
} /* namespace */
+eDepsNode_Type deg_geometry_tag_to_component(const ID *id)
+{
+ const ID_Type id_type = GS(id->name);
+ switch (id_type) {
+ case ID_OB:
+ {
+ const Object *object = (Object *)id;
+ switch (object->type) {
+ case OB_MESH:
+ case OB_CURVE:
+ case OB_SURF:
+ case OB_FONT:
+ case OB_LATTICE:
+ case OB_MBALL:
+ case OB_GPENCIL:
+ return DEG_NODE_TYPE_GEOMETRY;
+ case OB_ARMATURE:
+ return DEG_NODE_TYPE_EVAL_POSE;
+ /* TODO(sergey): More cases here? */
+ }
+ break;
+ }
+ case ID_ME:
+ return DEG_NODE_TYPE_GEOMETRY;
+ case ID_PA: /* Particles */
+ return DEG_NODE_TYPE_UNDEFINED;
+ case ID_LP:
+ return DEG_NODE_TYPE_PARAMETERS;
+ case ID_GD:
+ return DEG_NODE_TYPE_GEOMETRY;
+ case ID_PAL: /* Palettes */
+ return DEG_NODE_TYPE_PARAMETERS;
+ default:
+ break;
+ }
+ return DEG_NODE_TYPE_UNDEFINED;
+}
+
} // namespace DEG
const char *DEG_update_tag_as_string(eDepsgraph_Tag flag)
diff --git a/source/blender/depsgraph/intern/depsgraph_type_defines.cc b/source/blender/depsgraph/intern/depsgraph_type_defines.cc
index 7abde2e865c..ae1f8db51eb 100644
--- a/source/blender/depsgraph/intern/depsgraph_type_defines.cc
+++ b/source/blender/depsgraph/intern/depsgraph_type_defines.cc
@@ -101,6 +101,8 @@ const char *nodeTypeAsString(eDepsNode_Type type)
STRINGIFY_TYPE(SHADING_PARAMETERS);
STRINGIFY_TYPE(CACHE);
STRINGIFY_TYPE(BATCH_CACHE);
+ /* Duplication. */
+ STRINGIFY_TYPE(DUPLI);
/* Total number of meaningful node types. */
case NUM_DEG_NODE_TYPES: return "SpecialCase";
@@ -145,6 +147,7 @@ const char *operationCodeAsString(eDepsOperation_Code opcode)
/* Pose. */
STRINGIFY_OPCODE(POSE_INIT);
STRINGIFY_OPCODE(POSE_INIT_IK);
+ STRINGIFY_OPCODE(POSE_CLEANUP);
STRINGIFY_OPCODE(POSE_DONE);
STRINGIFY_OPCODE(POSE_IK_SOLVER);
STRINGIFY_OPCODE(POSE_SPLINE_IK_SOLVER);
diff --git a/source/blender/depsgraph/intern/depsgraph_types.h b/source/blender/depsgraph/intern/depsgraph_types.h
index 534376653e9..ef64fe8c5fe 100644
--- a/source/blender/depsgraph/intern/depsgraph_types.h
+++ b/source/blender/depsgraph/intern/depsgraph_types.h
@@ -122,7 +122,7 @@ typedef enum eDepsNode_Type {
DEG_NODE_TYPE_ANIMATION,
/* Transform Component (Parenting/Constraints) */
DEG_NODE_TYPE_TRANSFORM,
- /* Geometry Component (DerivedMesh/Displist) */
+ /* Geometry Component (Mesh/Displist) */
DEG_NODE_TYPE_GEOMETRY,
/* Sequencer Component (Scene Only) */
DEG_NODE_TYPE_SEQUENCER,
@@ -155,6 +155,11 @@ typedef enum eDepsNode_Type {
/* Batch Cache Component - TODO (dfelinto/sergey) rename to make it more generic. */
DEG_NODE_TYPE_BATCH_CACHE,
+ /* Duplication system. Used to force duplicated objects visible when
+ * when duplicator is visible.
+ */
+ DEG_NODE_TYPE_DUPLI,
+
/* Total number of meaningful node types. */
NUM_DEG_NODE_TYPES,
} eDepsNode_Type;
@@ -218,7 +223,9 @@ typedef enum eDepsOperation_Code {
DEG_OPCODE_POSE_INIT,
/* Initialize IK solver related pose stuff. */
DEG_OPCODE_POSE_INIT_IK,
- /* Free IK Trees + Compute Deform Matrices */
+ /* Pose is evaluated, and runtime data can be freed. */
+ DEG_OPCODE_POSE_CLEANUP,
+ /* Pose has been fully evaluated and ready to be used by others. */
DEG_OPCODE_POSE_DONE,
/* IK/Spline Solvers */
DEG_OPCODE_POSE_IK_SOLVER,
@@ -236,7 +243,7 @@ typedef enum eDepsOperation_Code {
* - "READY" This (internal, noop is used to signal that all pre-IK
* operations are done. Its role is to help mediate situations
* where cyclic relations may otherwise form (i.e. one bone in
- * chain targetting another in same chain,
+ * chain targeting another in same chain,
*
* - "DONE" This noop is used to signal that the bone's final pose
* transform can be read by others
diff --git a/source/blender/depsgraph/intern/eval/deg_eval.cc b/source/blender/depsgraph/intern/eval/deg_eval.cc
index fb8b8e73ef6..0097fc95948 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval.cc
@@ -99,9 +99,9 @@ static void deg_task_run_func(TaskPool *pool,
BLI_task_pool_delayed_push_end(pool, thread_id);
}
-typedef struct CalculatePengindData {
+typedef struct CalculatePendingData {
Depsgraph *graph;
-} CalculatePengindData;
+} CalculatePendingData;
static bool check_operation_node_visible(OperationDepsNode *op_node)
{
@@ -112,8 +112,7 @@ static bool check_operation_node_visible(OperationDepsNode *op_node)
if (comp_node->type == DEG_NODE_TYPE_COPY_ON_WRITE) {
return true;
}
- const IDDepsNode *id_node = comp_node->owner;
- return id_node->is_visible;
+ return comp_node->affects_directly_visible;
}
static void calculate_pending_func(
@@ -121,7 +120,7 @@ static void calculate_pending_func(
const int i,
const ParallelRangeTLS *__restrict /*tls*/)
{
- CalculatePengindData *data = (CalculatePengindData *)data_v;
+ CalculatePendingData *data = (CalculatePendingData *)data_v;
Depsgraph *graph = data->graph;
OperationDepsNode *node = graph->operations[i];
/* Update counters, applies for both visible and invisible IDs. */
@@ -160,7 +159,7 @@ static void calculate_pending_func(
static void calculate_pending_parents(Depsgraph *graph)
{
const int num_operations = graph->operations.size();
- CalculatePengindData data;
+ CalculatePendingData data;
data.graph = graph;
ParallelRangeSettings settings;
BLI_parallel_range_settings_defaults(&settings);
@@ -178,7 +177,6 @@ static void initialize_execution(DepsgraphEvalState *state, Depsgraph *graph)
calculate_pending_parents(graph);
/* Clear tags and other things which needs to be clear. */
foreach (OperationDepsNode *node, graph->operations) {
- node->done = 0;
if (do_stats) {
node->stats.reset_current();
}
@@ -205,7 +203,7 @@ static void schedule_node(TaskPool *pool, Depsgraph *graph,
}
/* TODO(sergey): This is not strictly speaking safe to read
* num_links_pending.
- */
+ */
if (dec_parents) {
BLI_assert(node->num_links_pending > 0);
atomic_sub_and_fetch_uint32(&node->num_links_pending, 1);
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
index 3d57c85583c..f731ae51b0c 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
@@ -54,7 +54,6 @@
#include "BKE_idprop.h"
#include "BKE_layer.h"
#include "BKE_library.h"
-#include "BKE_main.h"
#include "BKE_scene.h"
#include "DEG_depsgraph.h"
@@ -466,8 +465,8 @@ void update_mesh_edit_mode_pointers(const Depsgraph *depsgraph,
mesh_cow->edit_btmesh = (BMEditMesh *)MEM_dupallocN(mesh_orig->edit_btmesh);
mesh_cow->edit_btmesh->ob =
(Object *)depsgraph->get_cow_id(&mesh_orig->edit_btmesh->ob->id);
- mesh_cow->edit_btmesh->derivedFinal = NULL;
- mesh_cow->edit_btmesh->derivedCage = NULL;
+ mesh_cow->edit_btmesh->mesh_eval_cage = NULL;
+ mesh_cow->edit_btmesh->mesh_eval_final = NULL;
}
/* Edit data is stored and owned by original datablocks, copied ones
@@ -712,7 +711,7 @@ static void deg_update_copy_on_write_animation(const Depsgraph *depsgraph,
__func__,
id_node->id_orig->name,
id_node->id_cow);
- BKE_animdata_copy_id(NULL, id_node->id_cow, id_node->id_orig, false, false);
+ BKE_animdata_copy_id(NULL, id_node->id_cow, id_node->id_orig, LIB_ID_CREATE_NO_USER_REFCOUNT);
RemapCallbackUserData user_data = {NULL};
user_data.depsgraph = depsgraph;
BKE_library_foreach_ID_link(NULL,
@@ -725,6 +724,7 @@ static void deg_update_copy_on_write_animation(const Depsgraph *depsgraph,
typedef struct ObjectRuntimeBackup {
Object_Runtime runtime;
short base_flag;
+ CustomDataMask lastDataMask;
} ObjectRuntimeBackup;
/* Make a backup of object's evaluation runtime data, additionally
@@ -748,6 +748,7 @@ static void deg_backup_object_runtime(
}
/* Make a backup of base flags. */
object_runtime_backup->base_flag = object->base_flag;
+ object_runtime_backup->lastDataMask = object->lastDataMask;
}
static void deg_restore_object_runtime(
@@ -777,11 +778,12 @@ static void deg_restore_object_runtime(
/* Evaluated mesh simply copied edit_btmesh pointer from
* original mesh during update, need to make sure no dead
* pointers are left behind.
- */
+ */
mesh_eval->edit_btmesh = mesh_orig->edit_btmesh;
}
}
object->base_flag = object_runtime_backup->base_flag;
+ object->lastDataMask = object_runtime_backup->lastDataMask;
}
ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
@@ -812,7 +814,7 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
ListBase *gpumaterial_ptr = NULL;
DrawDataList drawdata_backup;
DrawDataList *drawdata_ptr = NULL;
- ObjectRuntimeBackup object_runtime_backup = {NULL};
+ ObjectRuntimeBackup object_runtime_backup = {{NULL}};
if (check_datablock_expanded(id_cow)) {
switch (id_type) {
case ID_MA:
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h
index 40b1f94c7bc..e9f5bc1e918 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h
+++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h
@@ -83,7 +83,7 @@ void deg_free_copy_on_write_datablock(struct ID *id_cow);
void deg_evaluate_copy_on_write(struct ::Depsgraph *depsgraph,
const struct IDDepsNode *id_node);
-/* Check that given ID is propely expanded and does not have any shallow
+/* Check that given ID is properly expanded and does not have any shallow
* copies inside.
*/
bool deg_validate_copy_on_write_datablock(ID *id_cow);
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
index 16cb1b394f6..975723ef8a3 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
@@ -106,9 +106,9 @@ void flush_init_id_node_func(
{
Depsgraph *graph = (Depsgraph *)data_v;
IDDepsNode *id_node = graph->id_nodes[i];
- id_node->done = ID_STATE_NONE;
+ id_node->custom_flags = ID_STATE_NONE;
GHASH_FOREACH_BEGIN(ComponentDepsNode *, comp_node, id_node->components)
- comp_node->done = COMPONENT_STATE_NONE;
+ comp_node->custom_flags = COMPONENT_STATE_NONE;
GHASH_FOREACH_END();
}
@@ -151,7 +151,7 @@ BLI_INLINE void flush_schedule_entrypoints(Depsgraph *graph, FlushQueue *queue)
BLI_INLINE void flush_handle_id_node(IDDepsNode *id_node)
{
- id_node->done = ID_STATE_MODIFIED;
+ id_node->custom_flags = ID_STATE_MODIFIED;
}
/* TODO(sergey): We can reduce number of arguments here. */
@@ -160,10 +160,10 @@ BLI_INLINE void flush_handle_component_node(IDDepsNode *id_node,
FlushQueue *queue)
{
/* We only handle component once. */
- if (comp_node->done == COMPONENT_STATE_DONE) {
+ if (comp_node->custom_flags == COMPONENT_STATE_DONE) {
return;
}
- comp_node->done = COMPONENT_STATE_DONE;
+ comp_node->custom_flags = COMPONENT_STATE_DONE;
/* Tag all required operations in component for update. */
foreach (OperationDepsNode *op, comp_node->operations) {
/* We don't want to flush tags in "upstream" direction for
@@ -183,9 +183,9 @@ BLI_INLINE void flush_handle_component_node(IDDepsNode *id_node,
ComponentDepsNode *pose_comp =
id_node->find_component(DEG_NODE_TYPE_EVAL_POSE);
BLI_assert(pose_comp != NULL);
- if (pose_comp->done == COMPONENT_STATE_NONE) {
+ if (pose_comp->custom_flags == COMPONENT_STATE_NONE) {
queue->push_front(pose_comp->get_entry_operation());
- pose_comp->done = COMPONENT_STATE_SCHEDULED;
+ pose_comp->custom_flags = COMPONENT_STATE_SCHEDULED;
}
}
}
@@ -221,12 +221,12 @@ BLI_INLINE OperationDepsNode *flush_schedule_children(
void flush_engine_data_update(ID *id)
{
- DrawDataList *drawdata = DRW_drawdatalist_from_id(id);
- if (drawdata == NULL) {
+ DrawDataList *draw_data_list = DRW_drawdatalist_from_id(id);
+ if (draw_data_list == NULL) {
return;
}
- LISTBASE_FOREACH(DrawData *, dd, drawdata) {
- dd->recalc |= id->recalc;
+ LISTBASE_FOREACH(DrawData *, draw_data, draw_data_list) {
+ draw_data->recalc |= id->recalc;
}
}
@@ -236,7 +236,7 @@ void flush_editors_id_update(Main *bmain,
const DEGEditorUpdateContext *update_ctx)
{
foreach (IDDepsNode *id_node, graph->id_nodes) {
- if (id_node->done != ID_STATE_MODIFIED) {
+ if (id_node->custom_flags != ID_STATE_MODIFIED) {
continue;
}
DEG_id_type_tag(bmain, GS(id_node->id_orig->name));
@@ -251,7 +251,7 @@ void flush_editors_id_update(Main *bmain,
/* Gather recalc flags from all changed components. */
GHASH_FOREACH_BEGIN(ComponentDepsNode *, comp_node, id_node->components)
{
- if (comp_node->done != COMPONENT_STATE_DONE) {
+ if (comp_node->custom_flags != COMPONENT_STATE_DONE) {
continue;
}
DepsNodeFactory *factory = deg_type_get_factory(comp_node->type);
@@ -262,9 +262,17 @@ void flush_editors_id_update(Main *bmain,
DEG_DEBUG_PRINTF((::Depsgraph *)graph,
EVAL, "Accumulated recalc bits for %s: %u\n",
id_orig->name, (unsigned int)id_cow->recalc);
- /* Inform editors. */
+
+ /* Inform editors. Only if the datablock is being evaluated a second
+ * time, to distinguish between user edits and initial evaluation when
+ * the datablock becomes visible.
+ *
+ * TODO: image datablocks do not use COW, so might not be detected
+ * correctly. */
if (deg_copy_on_write_is_expanded(id_cow)) {
- deg_editors_id_update(update_ctx, id_cow);
+ if (graph->is_active) {
+ deg_editors_id_update(update_ctx, id_orig);
+ }
/* ID may need to get its auto-override operations refreshed. */
if (ID_IS_STATIC_OVERRIDE_AUTO(id_orig)) {
id_orig->tag |= LIB_TAG_OVERRIDESTATIC_AUTOREFRESH;
@@ -311,7 +319,7 @@ void invalidate_tagged_evaluated_data(Depsgraph *graph)
{
#ifdef INVALIDATE_ON_FLUSH
foreach (IDDepsNode *id_node, graph->id_nodes) {
- if (id_node->done != ID_STATE_MODIFIED) {
+ if (id_node->custom_flags != ID_STATE_MODIFIED) {
continue;
}
ID *id_cow = id_node->id_cow;
@@ -320,7 +328,7 @@ void invalidate_tagged_evaluated_data(Depsgraph *graph)
}
GHASH_FOREACH_BEGIN(ComponentDepsNode *, comp_node, id_node->components)
{
- if (comp_node->done != COMPONENT_STATE_DONE) {
+ if (comp_node->custom_flags != COMPONENT_STATE_DONE) {
continue;
}
switch (comp_node->type) {
diff --git a/source/blender/depsgraph/intern/nodes/deg_node.h b/source/blender/depsgraph/intern/nodes/deg_node.h
index 603a6be7ceb..ef2a73258fd 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node.h
+++ b/source/blender/depsgraph/intern/nodes/deg_node.h
@@ -80,9 +80,15 @@ struct DepsNode {
eDepsNode_Type type; /* Structural type of node. */
Relations inlinks; /* Nodes which this one depends on. */
Relations outlinks; /* Nodes which depend on this one. */
- int done; /* Generic tags for traversal algorithms. */
Stats stats; /* Evaluation statistics. */
+ /* Generic tags for traversal algorithms and such.
+ *
+ * Actual meaning of values depends on a specific area. Every area is to
+ * clean this before use.
+ */
+ int custom_flags;
+
/* Methods. */
DepsNode();
virtual ~DepsNode();
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_component.cc b/source/blender/depsgraph/intern/nodes/deg_node_component.cc
index 9600eadb126..d6c3eb6157d 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_component.cc
+++ b/source/blender/depsgraph/intern/nodes/deg_node_component.cc
@@ -124,7 +124,8 @@ static void comp_node_hash_value_free(void *value_v)
ComponentDepsNode::ComponentDepsNode() :
entry_operation(NULL),
- exit_operation(NULL)
+ exit_operation(NULL),
+ affects_directly_visible(false)
{
operations_map = BLI_ghash_new(comp_node_hash_key,
comp_node_hash_key_cmp,
@@ -157,7 +158,11 @@ string ComponentDepsNode::identifier() const
char typebuf[16];
sprintf(typebuf, "(%d)", type);
- return string(typebuf) + name + " : " + idname;
+ return string(typebuf) + name + " : " + idname +
+ "( affects_directly_visible: " +
+ (affects_directly_visible ? "true"
+ : "false") + ")";
+;
}
OperationDepsNode *ComponentDepsNode::find_operation(OperationIDKey key) const
@@ -167,9 +172,9 @@ OperationDepsNode *ComponentDepsNode::find_operation(OperationIDKey key) const
node = (OperationDepsNode *)BLI_ghash_lookup(operations_map, &key);
}
else {
- BLI_assert(key.name_tag == -1);
foreach (OperationDepsNode *op_node, operations) {
if (op_node->opcode == key.opcode &&
+ op_node->name_tag == key.name_tag &&
STREQ(op_node->name, key.name))
{
node = op_node;
@@ -248,6 +253,7 @@ OperationDepsNode *ComponentDepsNode::add_operation(const DepsEvalOperationCb& o
op_node->evaluate = op;
op_node->opcode = opcode;
op_node->name = name;
+ op_node->name_tag = name_tag;
return op_node;
}
@@ -393,6 +399,7 @@ DEG_COMPONENT_NODE_DEFINE(Shading, SHADING, ID_RECALC_DRAW)
DEG_COMPONENT_NODE_DEFINE(ShadingParameters, SHADING_PARAMETERS, ID_RECALC_DRAW);
DEG_COMPONENT_NODE_DEFINE(Transform, TRANSFORM, ID_RECALC_TRANSFORM);
DEG_COMPONENT_NODE_DEFINE(ObjectFromLayer, OBJECT_FROM_LAYER, ID_RECALC);
+DEG_COMPONENT_NODE_DEFINE(Dupli, DUPLI, 0);
/* Node Types Register =================================== */
@@ -414,6 +421,7 @@ void deg_register_component_depsnodes()
deg_register_node_typeinfo(&DNTI_SHADING_PARAMETERS);
deg_register_node_typeinfo(&DNTI_TRANSFORM);
deg_register_node_typeinfo(&DNTI_OBJECT_FROM_LAYER);
+ deg_register_node_typeinfo(&DNTI_DUPLI);
}
} // namespace DEG
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_component.h b/source/blender/depsgraph/intern/nodes/deg_node_component.h
index e4a77f2e72b..244884554fa 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_component.h
+++ b/source/blender/depsgraph/intern/nodes/deg_node_component.h
@@ -71,7 +71,7 @@ struct ComponentDepsNode : public DepsNode {
void init(const ID *id, const char *subdata);
- string identifier() const;
+ virtual string identifier() const;
/* Find an existing operation, if requested operation does not exist
* NULL will be returned.
@@ -150,6 +150,11 @@ struct ComponentDepsNode : public DepsNode {
* is tagged for update.
*/
virtual bool need_tag_cow_before_update() { return true; }
+
+ /* Denotes whether this component affects (possibly indirectly) on a
+ * directly visible object.
+ */
+ bool affects_directly_visible;
};
/* ---------------------------------------- */
@@ -193,6 +198,7 @@ DEG_COMPONENT_NODE_DECLARE_NO_COW_TAG_ON_UPDATE(Shading);
DEG_COMPONENT_NODE_DECLARE_GENERIC(ShadingParameters);
DEG_COMPONENT_NODE_DECLARE_GENERIC(Transform);
DEG_COMPONENT_NODE_DECLARE_NO_COW_TAG_ON_UPDATE(ObjectFromLayer);
+DEG_COMPONENT_NODE_DECLARE_GENERIC(Dupli);
/* Bone Component */
struct BoneComponentDepsNode : public ComponentDepsNode {
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_id.cc b/source/blender/depsgraph/intern/nodes/deg_node_id.cc
index f2464cf98bd..d8890547f16 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_id.cc
+++ b/source/blender/depsgraph/intern/nodes/deg_node_id.cc
@@ -103,8 +103,12 @@ void IDDepsNode::init(const ID *id, const char *UNUSED(subdata))
/* Store ID-pointer. */
id_orig = (ID *)id;
eval_flags = 0;
+ previous_eval_flags = 0;
linked_state = DEG_ID_LINKED_INDIRECTLY;
- is_visible = true;
+ is_directly_visible = true;
+
+ visible_components_mask = 0;
+ previously_visible_components_mask = 0;
components = BLI_ghash_new(id_deps_node_hash_key,
id_deps_node_hash_key_cmp,
@@ -173,7 +177,8 @@ string IDDepsNode::identifier() const
BLI_snprintf(cow_ptr, sizeof(cow_ptr), "%p", id_cow);
return string(nodeTypeAsString(type)) + " : " + name +
" (orig: " + orig_ptr + ", eval: " + cow_ptr +
- ", is_visible " + (is_visible ? "true" : "false") + ")";
+ ", is_directly_visible " + (is_directly_visible ? "true"
+ : "false") + ")";
}
ComponentDepsNode *IDDepsNode::find_component(eDepsNode_Type type,
@@ -216,6 +221,21 @@ void IDDepsNode::finalize_build(Depsgraph *graph)
comp_node->finalize_build(graph);
}
GHASH_FOREACH_END();
+ visible_components_mask = get_visible_components_mask();
+}
+
+IDComponentsMask IDDepsNode::get_visible_components_mask() const {
+ IDComponentsMask result = 0;
+ GHASH_FOREACH_BEGIN(ComponentDepsNode *, comp_node, components)
+ {
+ if (comp_node->affects_directly_visible) {
+ const int component_type = comp_node->type;
+ BLI_assert(component_type < 64);
+ result |= (1ULL << component_type);
+ }
+ }
+ GHASH_FOREACH_END();
+ return result;
}
} // namespace DEG
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_id.h b/source/blender/depsgraph/intern/nodes/deg_node_id.h
index 8af7b80973b..44b4c91de4e 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_id.h
+++ b/source/blender/depsgraph/intern/nodes/deg_node_id.h
@@ -31,11 +31,14 @@
#pragma once
#include "intern/nodes/deg_node.h"
+#include "BLI_sys_types.h"
namespace DEG {
struct ComponentDepsNode;
+typedef uint64_t IDComponentsMask;
+
/* ID-Block Reference */
struct IDDepsNode : public DepsNode {
struct ComponentIDKey {
@@ -62,6 +65,8 @@ struct IDDepsNode : public DepsNode {
void finalize_build(Depsgraph *graph);
+ IDComponentsMask get_visible_components_mask() const;
+
/* ID Block referenced. */
ID *id_orig;
ID *id_cow;
@@ -73,14 +78,16 @@ struct IDDepsNode : public DepsNode {
* TODO(sergey): Only needed for until really granular updates
* of all the entities.
*/
- int eval_flags;
+ uint32_t eval_flags;
+ uint32_t previous_eval_flags;
eDepsNode_LinkedState_Type linked_state;
- /* Indicates the datablock is visible, meaning, it is to be evaluated by
- * the dependency graph.
- */
- bool is_visible;
+ /* Indicates the datablock is visible in the evaluated scene. */
+ bool is_directly_visible;
+
+ IDComponentsMask visible_components_mask;
+ IDComponentsMask previously_visible_components_mask;
DEG_DEPSNODE_DECLARE;
};
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_operation.cc b/source/blender/depsgraph/intern/nodes/deg_node_operation.cc
index e82bbbc0e8a..d9af3cbf2a4 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_operation.cc
+++ b/source/blender/depsgraph/intern/nodes/deg_node_operation.cc
@@ -45,6 +45,7 @@ namespace DEG {
/* Inner Nodes */
OperationDepsNode::OperationDepsNode() :
+ name_tag(-1),
flag(0),
customdata_mask(0)
{
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_operation.h b/source/blender/depsgraph/intern/nodes/deg_node_operation.h
index c172f73be5f..7eeb99d984a 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_operation.h
+++ b/source/blender/depsgraph/intern/nodes/deg_node_operation.h
@@ -80,6 +80,7 @@ struct OperationDepsNode : public DepsNode {
/* Identifier for the operation being performed. */
eDepsOperation_Code opcode;
+ int name_tag;
/* (eDepsOperation_Flag) extra settings affecting evaluation. */
int flag;
diff --git a/source/blender/depsgraph/util/deg_util_function.h b/source/blender/depsgraph/util/deg_util_function.h
index 8863d92eb74..0ec41412d7b 100644
--- a/source/blender/depsgraph/util/deg_util_function.h
+++ b/source/blender/depsgraph/util/deg_util_function.h
@@ -32,6 +32,10 @@
#include <functional>
+namespace DEG {
+
using std::function;
using namespace std::placeholders;
#define function_bind std::bind
+
+} // namespace
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index bac3a2f02fb..be742868cd6 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -80,7 +80,6 @@ set(SRC
modes/edit_mesh_mode.c
modes/edit_mesh_mode_text.c
modes/edit_metaball_mode.c
- modes/edit_surface_mode.c
modes/edit_text_mode.c
modes/object_mode.c
modes/overlay_mode.c
@@ -151,6 +150,8 @@ set(SRC
engines/eevee/eevee_lut.h
engines/eevee/eevee_private.h
engines/external/external_engine.h
+ engines/workbench/workbench_engine.h
+ engines/workbench/workbench_private.h
)
data_to_c_simple(engines/eevee/shaders/ambient_occlusion_lib.glsl SRC)
@@ -262,19 +263,20 @@ data_to_c_simple(modes/shaders/armature_shape_outline_vert.glsl SRC)
data_to_c_simple(modes/shaders/armature_shape_outline_geom.glsl SRC)
data_to_c_simple(modes/shaders/armature_stick_vert.glsl SRC)
data_to_c_simple(modes/shaders/armature_stick_frag.glsl SRC)
+data_to_c_simple(modes/shaders/armature_dof_vert.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_common_lib.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_frag.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_vert.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_geom_tri.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_geom_edge.glsl SRC)
-data_to_c_simple(modes/shaders/edit_mesh_overlay_loosevert_vert.glsl SRC)
+data_to_c_simple(modes/shaders/edit_mesh_overlay_points_vert.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_facedot_frag.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_facedot_vert.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_ghost_clear_vert.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_mix_frag.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_facefill_vert.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_facefill_frag.glsl SRC)
-data_to_c_simple(modes/shaders/edit_curve_overlay_frag.glsl SRC)
+data_to_c_simple(modes/shaders/edit_curve_overlay_handle_vert.glsl SRC)
data_to_c_simple(modes/shaders/edit_curve_overlay_handle_geom.glsl SRC)
data_to_c_simple(modes/shaders/edit_curve_overlay_loosevert_vert.glsl SRC)
data_to_c_simple(modes/shaders/edit_lattice_overlay_frag.glsl SRC)
@@ -306,6 +308,8 @@ data_to_c_simple(modes/shaders/paint_texture_frag.glsl SRC)
data_to_c_simple(modes/shaders/paint_texture_vert.glsl SRC)
data_to_c_simple(modes/shaders/paint_vertex_frag.glsl SRC)
data_to_c_simple(modes/shaders/paint_vertex_vert.glsl SRC)
+data_to_c_simple(modes/shaders/paint_weight_frag.glsl SRC)
+data_to_c_simple(modes/shaders/paint_weight_vert.glsl SRC)
data_to_c_simple(modes/shaders/paint_wire_frag.glsl SRC)
data_to_c_simple(modes/shaders/paint_wire_vert.glsl SRC)
data_to_c_simple(modes/shaders/paint_vert_frag.glsl SRC)
@@ -333,10 +337,14 @@ data_to_c_simple(engines/gpencil/shaders/gpencil_edit_point_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_colorize_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_flip_frag.glsl SRC)
+data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl SRC)
+data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_light_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_pixel_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_rim_prepare_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_rim_resolve_frag.glsl SRC)
+data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_shadow_prepare_frag.glsl SRC)
+data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_shadow_resolve_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_swirl_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl SRC)
@@ -344,4 +352,8 @@ data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl SRC)
list(APPEND INC
)
+if(WITH_FREESTYLE)
+ add_definitions(-DWITH_FREESTYLE)
+endif()
+
blender_add_lib(bf_draw "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 6d8e8a69e29..d790cee48bb 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -98,6 +98,7 @@ typedef bool (*DRW_ObjectFilterFn)(
struct Object *ob, void *user_data);
void DRW_draw_view(const struct bContext *C);
+void DRW_draw_region_engine_info(int xoffset, int yoffset);
void DRW_draw_render_loop_ex(
struct Depsgraph *depsgraph,
@@ -119,7 +120,7 @@ void DRW_draw_render_loop_offscreen(
void DRW_draw_select_loop(
struct Depsgraph *depsgraph,
struct ARegion *ar, struct View3D *v3d,
- bool use_obedit_skip, bool use_nearest, const struct rcti *rect,
+ bool use_obedit_skip, bool draw_surface, bool use_nearest, const struct rcti *rect,
DRW_SelectPassFn select_pass_fn, void *select_pass_user_data,
DRW_ObjectFilterFn object_filter_fn, void *object_filter_user_data);
void DRW_draw_depth_loop(
@@ -127,7 +128,9 @@ void DRW_draw_depth_loop(
struct ARegion *ar, struct View3D *v3d);
/* grease pencil render */
+bool DRW_render_check_grease_pencil(struct Depsgraph *depsgraph);
void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph);
+void DRW_gpencil_freecache(struct Object *ob);
/* This is here because GPUViewport needs it */
void DRW_pass_free(struct DRWPass *pass);
diff --git a/source/blender/draw/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c
index 57553d98d5d..9dc8c8f2f34 100644
--- a/source/blender/draw/engines/basic/basic_engine.c
+++ b/source/blender/draw/engines/basic/basic_engine.c
@@ -112,7 +112,9 @@ static void basic_cache_populate(void *vedata, Object *ob)
{
BASIC_StorageList *stl = ((BASIC_Data *)vedata)->stl;
- if (!DRW_object_is_renderable(ob)) {
+ /* TODO(fclem) fix selection of smoke domains. */
+
+ if (!DRW_object_is_renderable(ob) || (ob->dt < OB_SOLID)) {
return;
}
@@ -125,7 +127,7 @@ static void basic_cache_populate(void *vedata, Object *ob)
if (!psys_check_enabled(ob, psys, false)) {
continue;
}
- if (!DRW_check_psys_visible_within_active_context(ob, psys)) {
+ if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) {
continue;
}
ParticleSettings *part = psys->part;
@@ -137,6 +139,24 @@ static void basic_cache_populate(void *vedata, Object *ob)
}
}
+ /* Make flat object selectable in ortho view if wireframe is enabled. */
+ if ((draw_ctx->v3d->overlay.flag & V3D_OVERLAY_WIREFRAMES) ||
+ (ob->dtx & OB_DRAWWIRE) ||
+ (ob->dt == OB_WIRE))
+ {
+ int flat_axis = 0;
+ bool is_flat_object_viewed_from_side = (draw_ctx->rv3d->persp == RV3D_ORTHO) &&
+ DRW_object_is_flat(ob, &flat_axis) &&
+ DRW_object_axis_orthogonal_to_view(ob, flat_axis);
+
+ if (is_flat_object_viewed_from_side) {
+ /* Avoid losing flat objects when in ortho views (see T56549) */
+ struct GPUBatch *geom = DRW_cache_object_wire_outline_get(ob);
+ DRW_shgroup_call_object_add(stl->g_data->depth_shgrp, geom, ob);
+ return;
+ }
+ }
+
struct GPUBatch *geom = DRW_cache_object_surface_get(ob);
if (geom) {
const bool do_cull = (draw_ctx->v3d && (draw_ctx->v3d->flag2 & V3D_BACKFACE_CULLING));
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 cb54ad3a164..602654068ff 100644
--- a/source/blender/draw/engines/eevee/eevee_depth_of_field.c
+++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.c
@@ -56,23 +56,32 @@
static struct {
/* Depth Of Field */
- struct GPUShader *dof_downsample_sh;
- struct GPUShader *dof_scatter_sh;
- struct GPUShader *dof_resolve_sh;
-} e_data = {NULL}; /* Engine data */
+ struct GPUShader *dof_downsample_sh[2];
+ struct GPUShader *dof_scatter_sh[2];
+ struct GPUShader *dof_resolve_sh[2];
+} e_data = {{NULL}}; /* Engine data */
extern char datatoc_effect_dof_vert_glsl[];
extern char datatoc_effect_dof_frag_glsl[];
-static void eevee_create_shader_depth_of_field(void)
+static void eevee_create_shader_depth_of_field(const bool use_alpha)
{
- e_data.dof_downsample_sh = DRW_shader_create_fullscreen(
- datatoc_effect_dof_frag_glsl, "#define STEP_DOWNSAMPLE\n");
- e_data.dof_scatter_sh = DRW_shader_create(
+ e_data.dof_downsample_sh[use_alpha] = DRW_shader_create_fullscreen(
+ datatoc_effect_dof_frag_glsl, use_alpha ?
+ "#define USE_ALPHA_DOF\n"
+ "#define STEP_DOWNSAMPLE\n" :
+ "#define STEP_DOWNSAMPLE\n");
+ e_data.dof_scatter_sh[use_alpha] = DRW_shader_create(
datatoc_effect_dof_vert_glsl, NULL,
- datatoc_effect_dof_frag_glsl, "#define STEP_SCATTER\n");
- e_data.dof_resolve_sh = DRW_shader_create_fullscreen(
- datatoc_effect_dof_frag_glsl, "#define STEP_RESOLVE\n");
+ datatoc_effect_dof_frag_glsl, use_alpha ?
+ "#define USE_ALPHA_DOF\n"
+ "#define STEP_SCATTER\n" :
+ "#define STEP_SCATTER\n");
+ e_data.dof_resolve_sh[use_alpha] = DRW_shader_create_fullscreen(
+ datatoc_effect_dof_frag_glsl, use_alpha ?
+ "#define USE_ALPHA_DOF\n"
+ "#define STEP_RESOLVE\n" :
+ "#define STEP_RESOLVE\n");
}
int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata, Object *camera)
@@ -86,24 +95,27 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v
if (scene_eval->eevee.flag & SCE_EEVEE_DOF_ENABLED) {
RegionView3D *rv3d = draw_ctx->rv3d;
+ const bool use_alpha = !DRW_state_draw_background();
- if (!e_data.dof_downsample_sh) {
- eevee_create_shader_depth_of_field();
+ if (!e_data.dof_downsample_sh[use_alpha]) {
+ eevee_create_shader_depth_of_field(use_alpha);
}
if (camera) {
const float *viewport_size = DRW_viewport_size_get();
Camera *cam = (Camera *)camera->data;
- /* Retreive Near and Far distance */
+ /* Retrieve Near and Far distance */
effects->dof_near_far[0] = -cam->clipsta;
effects->dof_near_far[1] = -cam->clipend;
int buffer_size[2] = {(int)viewport_size[0] / 2, (int)viewport_size[1] / 2};
- effects->dof_down_near = DRW_texture_pool_query_2D(buffer_size[0], buffer_size[1], GPU_R11F_G11F_B10F,
+ GPUTextureFormat 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], GPU_R11F_G11F_B10F,
+ 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);
@@ -120,11 +132,18 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v
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);
+ }
+
/* Parameters */
/* TODO UI Options */
float fstop = cam->gpu_dof.fstop;
@@ -193,10 +212,11 @@ void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_
**/
DRWShadingGroup *grp;
struct GPUBatch *quad = DRW_cache_fullscreen_quad_get();
+ const bool use_alpha = !DRW_state_draw_background();
psl->dof_down = DRW_pass_create("DoF Downsample", DRW_STATE_WRITE_COLOR);
- grp = DRW_shgroup_create(e_data.dof_downsample_sh, psl->dof_down);
+ grp = DRW_shgroup_create(e_data.dof_downsample_sh[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);
@@ -209,8 +229,7 @@ void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_
* 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_empty_tri_batch_create(e_data.dof_scatter_sh, psl->dof_scatter, sprite_len);
-
+ grp = DRW_shgroup_empty_tri_batch_create(e_data.dof_scatter_sh[use_alpha], psl->dof_scatter, sprite_len);
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);
@@ -218,13 +237,17 @@ void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_
psl->dof_resolve = DRW_pass_create("DoF Resolve", DRW_STATE_WRITE_COLOR);
- grp = DRW_shgroup_create(e_data.dof_resolve_sh, psl->dof_resolve);
+ grp = DRW_shgroup_create(e_data.dof_resolve_sh[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_vec3(grp, "dofParams", effects->dof_params, 1);
DRW_shgroup_call_add(grp, quad, NULL);
+
+ if (use_alpha) {
+ DRW_shgroup_uniform_texture_ref(grp, "scatterAlphaBuffer", &effects->dof_blur_alpha);
+ }
}
}
@@ -258,7 +281,9 @@ void EEVEE_depth_of_field_draw(EEVEE_Data *vedata)
void EEVEE_depth_of_field_free(void)
{
- DRW_SHADER_FREE_SAFE(e_data.dof_downsample_sh);
- DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh);
- DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh);
+ for (int i = 0; i < 2; ++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]);
+ }
}
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index 28658d5126c..687d5035ea2 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -34,6 +34,7 @@
#include "eevee_private.h"
#include "GPU_texture.h"
#include "GPU_extensions.h"
+#include "GPU_state.h"
static struct {
/* Downsample Depth */
@@ -43,6 +44,7 @@ static struct {
struct GPUShader *maxz_downdepth_sh;
struct GPUShader *minz_downdepth_layer_sh;
struct GPUShader *maxz_downdepth_layer_sh;
+ struct GPUShader *maxz_copydepth_layer_sh;
struct GPUShader *minz_copydepth_sh;
struct GPUShader *maxz_copydepth_sh;
@@ -109,6 +111,11 @@ static void eevee_create_shader_downsample(void)
datatoc_effect_minmaxz_frag_glsl,
"#define MAX_PASS\n"
"#define LAYERED\n");
+ e_data.maxz_copydepth_layer_sh = DRW_shader_create_fullscreen(
+ datatoc_effect_minmaxz_frag_glsl,
+ "#define MAX_PASS\n"
+ "#define COPY_DEPTH\n"
+ "#define LAYERED\n");
e_data.minz_copydepth_sh = DRW_shader_create_fullscreen(
datatoc_effect_minmaxz_frag_glsl,
"#define MIN_PASS\n"
@@ -119,7 +126,27 @@ static void eevee_create_shader_downsample(void)
"#define COPY_DEPTH\n");
}
-void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera)
+#define SETUP_BUFFER(tex, fb, fb_color) { \
+ GPUTextureFormat format = (DRW_state_is_scene_render()) ? GPU_RGBA32F : GPU_RGBA16F; \
+ DRW_texture_ensure_fullscreen_2D(&tex, format, DRW_TEX_FILTER | DRW_TEX_MIPMAP); \
+ GPU_framebuffer_ensure_config(&fb, { \
+ GPU_ATTACHMENT_TEXTURE(dtxl->depth), \
+ GPU_ATTACHMENT_TEXTURE(tex), \
+ }); \
+ GPU_framebuffer_ensure_config(&fb_color, { \
+ GPU_ATTACHMENT_NONE, \
+ GPU_ATTACHMENT_TEXTURE(tex), \
+ }); \
+}
+
+#define CLEANUP_BUFFER(tex, fb, fb_color) { \
+ /* Cleanup to release memory */ \
+ DRW_TEXTURE_FREE_SAFE(tex); \
+ GPU_FRAMEBUFFER_FREE_SAFE(fb); \
+ GPU_FRAMEBUFFER_FREE_SAFE(fb_color); \
+}
+
+void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera, const bool minimal)
{
EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
EEVEE_StorageList *stl = vedata->stl;
@@ -156,7 +183,7 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object
effects->enabled_effects |= EEVEE_volumes_init(sldata, vedata);
/* Force normal buffer creation. */
- if (DRW_state_is_image_render() &&
+ if (DRW_state_is_image_render() && !minimal &&
(view_layer->passflag & SCE_PASS_NORMAL) != 0)
{
effects->enabled_effects |= EFFECT_NORMAL_BUFFER;
@@ -166,30 +193,21 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object
* Ping Pong buffer
*/
if ((effects->enabled_effects & EFFECT_POST_BUFFER) != 0) {
- DRW_texture_ensure_fullscreen_2D(&txl->color_post, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_MIPMAP);
-
- GPU_framebuffer_ensure_config(&fbl->effect_fb, {
- GPU_ATTACHMENT_TEXTURE(dtxl->depth),
- GPU_ATTACHMENT_TEXTURE(txl->color_post),
- });
-
- GPU_framebuffer_ensure_config(&fbl->effect_color_fb, {
- GPU_ATTACHMENT_NONE,
- GPU_ATTACHMENT_TEXTURE(txl->color_post),
- });
+ SETUP_BUFFER(txl->color_post, fbl->effect_fb, fbl->effect_color_fb);
}
else {
- /* Cleanup to release memory */
- DRW_TEXTURE_FREE_SAFE(txl->color_post);
- GPU_FRAMEBUFFER_FREE_SAFE(fbl->effect_fb);
+ CLEANUP_BUFFER(txl->color_post, fbl->effect_fb, fbl->effect_color_fb);
}
/**
* MinMax Pyramid
*/
- int size[2];
- size[0] = max_ii(size_fs[0] / 2, 1);
- size[1] = max_ii(size_fs[1] / 2, 1);
+ const bool half_res_hiz = true;
+ int size[2], div;
+ common_data->hiz_mip_offset = (half_res_hiz) ? 1 : 0;
+ div = (half_res_hiz) ? 2 : 1;
+ size[0] = max_ii(size_fs[0] / div, 1);
+ size[1] = max_ii(size_fs[1] / div, 1);
if (GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_ANY, GPU_DRIVER_ANY)) {
/* Intel gpu seems to have problem rendering to only depth format */
@@ -204,19 +222,15 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object
}
/**
- * Compute Mipmap texel alignement.
+ * Compute Mipmap texel alignment.
*/
for (int i = 0; i < 10; ++i) {
- float mip_size[2] = {viewport_size[0], viewport_size[1]};
- for (int j = 0; j < i; ++j) {
- mip_size[0] = floorf(fmaxf(1.0f, mip_size[0] / 2.0f));
- mip_size[1] = floorf(fmaxf(1.0f, mip_size[1] / 2.0f));
- }
- common_data->mip_ratio[i][0] = viewport_size[0] / (mip_size[0] * powf(2.0f, floorf(log2f(floorf(viewport_size[0] / mip_size[0])))));
- common_data->mip_ratio[i][1] = viewport_size[1] / (mip_size[1] * powf(2.0f, floorf(log2f(floorf(viewport_size[1] / mip_size[1])))));
+ int mip_size[2];
+ GPU_texture_get_mipmap_size(txl->color, i, mip_size);
+ common_data->mip_ratio[i][0] = viewport_size[0] / (mip_size[0] * powf(2.0f, i));
+ common_data->mip_ratio[i][1] = viewport_size[1] / (mip_size[1] * powf(2.0f, i));
}
-
/**
* Normal buffer for deferred passes.
*/
@@ -269,22 +283,17 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object
* Setup double buffer so we can access last frame as it was before post processes.
*/
if ((effects->enabled_effects & EFFECT_DOUBLE_BUFFER) != 0) {
- DRW_texture_ensure_fullscreen_2D(&txl->color_double_buffer, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_MIPMAP);
-
- GPU_framebuffer_ensure_config(&fbl->double_buffer_fb, {
- GPU_ATTACHMENT_TEXTURE(dtxl->depth),
- GPU_ATTACHMENT_TEXTURE(txl->color_double_buffer)
- });
+ SETUP_BUFFER(txl->color_double_buffer, fbl->double_buffer_fb, fbl->double_buffer_color_fb);
+ }
+ else {
+ CLEANUP_BUFFER(txl->color_double_buffer, fbl->double_buffer_fb, fbl->double_buffer_color_fb);
+ }
- GPU_framebuffer_ensure_config(&fbl->double_buffer_color_fb, {
- GPU_ATTACHMENT_NONE,
- GPU_ATTACHMENT_TEXTURE(txl->color_double_buffer)
- });
+ if ((effects->enabled_effects & (EFFECT_TAA | EFFECT_TAA_REPROJECT)) != 0) {
+ SETUP_BUFFER(txl->taa_history, fbl->taa_history_fb, fbl->taa_history_color_fb);
}
else {
- /* Cleanup to release memory */
- DRW_TEXTURE_FREE_SAFE(txl->color_double_buffer);
- GPU_FRAMEBUFFER_FREE_SAFE(fbl->double_buffer_fb);
+ CLEANUP_BUFFER(txl->taa_history, fbl->taa_history_fb, fbl->taa_history_color_fb);
}
}
@@ -355,6 +364,13 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
grp = DRW_shgroup_create(e_data.maxz_copydepth_sh, psl->maxz_copydepth_ps);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &e_data.depth_src);
DRW_shgroup_call_add(grp, quad, NULL);
+
+ psl->maxz_copydepth_layer_ps = DRW_pass_create(
+ "HiZ Max Copy DepthLayer Halfres", downsample_write | DRW_STATE_DEPTH_ALWAYS);
+ grp = DRW_shgroup_create(e_data.maxz_copydepth_layer_sh, psl->maxz_copydepth_layer_ps);
+ DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &e_data.depth_src);
+ DRW_shgroup_uniform_int(grp, "depthLayer", &e_data.depth_src_layer, 1);
+ DRW_shgroup_call_add(grp, quad, NULL);
}
if ((effects->enabled_effects & EFFECT_VELOCITY_BUFFER) != 0) {
@@ -423,16 +439,30 @@ void EEVEE_create_minmax_buffer(EEVEE_Data *vedata, GPUTexture *depth_src, int l
GPU_framebuffer_recursive_downsample(fbl->downsample_fb, stl->g_data->minzbuffer, 8, &min_downsample_cb, vedata);
DRW_stats_group_end();
#endif
+ int minmax_size[3], depth_size[3];
+ GPU_texture_get_mipmap_size(depth_src, 0, depth_size);
+ GPU_texture_get_mipmap_size(txl->maxzbuffer, 0, minmax_size);
+ bool is_full_res_minmaxz = (minmax_size[0] == depth_size[0] && minmax_size[1] == depth_size[1]);
DRW_stats_group_start("Max buffer");
/* Copy depth buffer to max texture top level */
GPU_framebuffer_texture_attach(fbl->downsample_fb, txl->maxzbuffer, 0, 0);
GPU_framebuffer_bind(fbl->downsample_fb);
if (layer >= 0) {
- DRW_draw_pass(psl->maxz_downdepth_layer_ps);
+ if (is_full_res_minmaxz) {
+ DRW_draw_pass(psl->maxz_copydepth_layer_ps);
+ }
+ else {
+ DRW_draw_pass(psl->maxz_downdepth_layer_ps);
+ }
}
else {
- DRW_draw_pass(psl->maxz_downdepth_ps);
+ if (is_full_res_minmaxz) {
+ DRW_draw_pass(psl->maxz_copydepth_ps);
+ }
+ else {
+ DRW_draw_pass(psl->maxz_downdepth_ps);
+ }
}
/* Create lower levels */
@@ -442,6 +472,13 @@ void EEVEE_create_minmax_buffer(EEVEE_Data *vedata, GPUTexture *depth_src, int l
/* Restore */
GPU_framebuffer_bind(fbl->main_fb);
+
+ if (GPU_mip_render_workaround()) {
+ /* Fix dot corruption on intel HD5XX/HD6XX series.
+ * It seems affected drivers are the same that needs
+ * GPU_mip_render_workaround. */
+ GPU_flush();
+ }
}
/**
@@ -500,26 +537,19 @@ void EEVEE_draw_effects(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
effects->source_buffer = txl->color; /* latest updated texture */
effects->target_buffer = fbl->effect_color_fb; /* next target to render to */
- /* Temporal Anti-Aliasing MUST come first */
- EEVEE_temporal_sampling_draw(vedata);
-
/* Post process stack (order matters) */
EEVEE_motion_blur_draw(vedata);
EEVEE_depth_of_field_draw(vedata);
+ EEVEE_temporal_sampling_draw(vedata);
EEVEE_bloom_draw(vedata);
/* Save the final texture and framebuffer for final transformation or read. */
effects->final_tx = effects->source_buffer;
effects->final_fb = (effects->target_buffer != fbl->main_color_fb) ? fbl->main_fb : fbl->effect_fb;
if ((effects->enabled_effects & EFFECT_TAA) &&
- (effects->enabled_effects & (EFFECT_BLOOM | EFFECT_DOF | EFFECT_MOTION_BLUR)) == 0)
+ (effects->source_buffer == txl->taa_history))
{
- if (!effects->swap_double_buffer) {
- effects->final_fb = fbl->double_buffer_fb;
- }
- else {
- effects->final_fb = fbl->main_fb;
- }
+ effects->final_fb = fbl->taa_history_fb;
}
/* If no post processes is enabled, buffers are still not swapped, do it now. */
@@ -540,6 +570,7 @@ void EEVEE_draw_effects(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
/* Update double buffer status if render mode. */
if (DRW_state_is_image_render()) {
stl->g_data->valid_double_buffer = (txl->color_double_buffer != NULL);
+ stl->g_data->valid_taa_history = (txl->taa_history != NULL);
}
}
@@ -556,6 +587,7 @@ void EEVEE_effects_free(void)
DRW_SHADER_FREE_SAFE(e_data.maxz_downdepth_sh);
DRW_SHADER_FREE_SAFE(e_data.minz_downdepth_layer_sh);
DRW_SHADER_FREE_SAFE(e_data.maxz_downdepth_layer_sh);
+ DRW_SHADER_FREE_SAFE(e_data.maxz_copydepth_layer_sh);
DRW_SHADER_FREE_SAFE(e_data.minz_copydepth_sh);
DRW_SHADER_FREE_SAFE(e_data.maxz_copydepth_sh);
}
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index c1e66033592..e9d67b73a0d 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -69,6 +69,7 @@ static void eevee_engine_init(void *ved)
stl->g_data->use_color_view_settings = USE_SCENE_LIGHT(v3d) || !LOOK_DEV_STUDIO_LIGHT_ENABLED(v3d);
stl->g_data->background_alpha = DRW_state_draw_background() ? 1.0f : 0.0f;
stl->g_data->valid_double_buffer = (txl->color_double_buffer != NULL);
+ stl->g_data->valid_taa_history = (txl->taa_history != NULL);
/* Main Buffer */
DRW_texture_ensure_fullscreen_2D(&txl->color, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_MIPMAP);
@@ -95,7 +96,7 @@ static void eevee_engine_init(void *ved)
}
/* EEVEE_effects_init needs to go first for TAA */
- EEVEE_effects_init(sldata, vedata, camera);
+ EEVEE_effects_init(sldata, vedata, camera, false);
EEVEE_materials_init(sldata, stl, fbl);
EEVEE_lights_init(sldata);
EEVEE_lightprobes_init(sldata, vedata);
@@ -135,7 +136,9 @@ void EEVEE_cache_populate(void *vedata, Object *ob)
EEVEE_hair_cache_populate(vedata, sldata, ob, &cast_shadow);
}
- if (DRW_check_object_visible_within_active_context(ob)) {
+ if (DRW_object_is_renderable(ob) &&
+ DRW_object_is_visible_in_active_context(ob))
+ {
if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) {
EEVEE_materials_cache_populate(vedata, sldata, ob, &cast_shadow);
}
@@ -165,7 +168,7 @@ static void eevee_cache_finish(void *vedata)
EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
EEVEE_materials_cache_finish(vedata);
- EEVEE_lights_cache_finish(sldata);
+ EEVEE_lights_cache_finish(sldata, vedata);
EEVEE_lightprobes_cache_finish(sldata, vedata);
}
@@ -241,14 +244,16 @@ static void eevee_draw_background(void *vedata)
EEVEE_lightprobes_refresh_planar(sldata, vedata);
DRW_stats_group_end();
- /* Update common buffer after probe rendering. */
- DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
-
/* Refresh shadows */
DRW_stats_group_start("Shadows");
- EEVEE_draw_shadows(sldata, psl);
+ EEVEE_draw_shadows(sldata, vedata);
DRW_stats_group_end();
+ /* Set ray type. */
+ sldata->common_data.ray_type = EEVEE_RAY_CAMERA;
+ sldata->common_data.ray_depth = 0.0f;
+ DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
+
GPU_framebuffer_bind(fbl->main_fb);
GPUFrameBufferBits clear_bits = GPU_DEPTH_BIT;
clear_bits |= (DRW_state_draw_background()) ? 0 : GPU_COLOR_BIT;
@@ -322,7 +327,7 @@ static void eevee_draw_background(void *vedata)
GPU_framebuffer_bind(dfbl->default_fb);
DRW_transform_to_display(stl->effects->final_tx, use_view_settings);
- /* Debug : Ouput buffer to view. */
+ /* Debug : Output buffer to view. */
switch (G.debug_value) {
case 1:
if (txl->maxzbuffer) DRW_transform_to_display(txl->maxzbuffer, use_view_settings);
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c
index ee962898a79..36425e80094 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -146,6 +146,8 @@ typedef struct EEVEE_LightBake {
int delay; /* ms. delay the start of the baking to not slowdown interactions (TODO remove) */
void *gl_context, *gpu_context; /* If running in parallel (in a separate thread), use this context. */
+
+ ThreadMutex *mutex;
} EEVEE_LightBake;
/* -------------------------------------------------------------------- */
@@ -185,6 +187,11 @@ void EEVEE_lightcache_info_update(SceneEEVEE *eevee)
LightCache *lcache = eevee->light_cache;
if (lcache != NULL) {
+ if (lcache->flag & LIGHTCACHE_BAKING) {
+ BLI_strncpy(eevee->light_cache_info, IFACE_("Baking light cache."), sizeof(eevee->light_cache_info));
+ return;
+ }
+
char formatted_mem[15];
BLI_str_format_byte_unit(formatted_mem, eevee_lightcache_memsize_get(lcache), true);
@@ -224,7 +231,7 @@ static bool EEVEE_lightcache_validate(
if ((irr_size[0] == light_cache->grid_tx.tex_size[0]) &&
(irr_size[1] == light_cache->grid_tx.tex_size[1]) &&
(irr_size[2] == light_cache->grid_tx.tex_size[2]) &&
- (grid_len != light_cache->grid_len))
+ (grid_len == light_cache->grid_len))
{
int mip_len = (int)(floorf(log2f(cube_res)) - MIN_CUBE_LOD_LEVEL);
if ((cube_res == light_cache->cube_tx.tex_size[0]) &&
@@ -469,19 +476,20 @@ static void eevee_lightbake_create_resources(EEVEE_LightBake *lbake)
* by the DRW mutex. */
lbake->lcache = eevee->light_cache;
- /* TODO validate irradiance and reflection cache independantly... */
- if (lbake->lcache != NULL &&
- !EEVEE_lightcache_validate(lbake->lcache, lbake->cube_len, lbake->ref_cube_res, lbake->grid_len, lbake->irr_size))
+ /* TODO validate irradiance and reflection cache independently... */
+ if (!EEVEE_lightcache_validate(
+ lbake->lcache, lbake->cube_len, lbake->ref_cube_res, lbake->grid_len, lbake->irr_size))
{
eevee->light_cache = lbake->lcache = NULL;
}
if (lbake->lcache == NULL) {
- lbake->lcache = EEVEE_lightcache_create(lbake->grid_len,
- lbake->cube_len,
- lbake->ref_cube_res,
- lbake->vis_res,
- lbake->irr_size);
+ lbake->lcache = EEVEE_lightcache_create(
+ lbake->grid_len,
+ lbake->cube_len,
+ lbake->ref_cube_res,
+ lbake->vis_res,
+ lbake->irr_size);
lbake->lcache->flag = LIGHTCACHE_UPDATE_WORLD | LIGHTCACHE_UPDATE_CUBE | LIGHTCACHE_UPDATE_GRID;
lbake->lcache->vis_res = lbake->vis_res;
lbake->own_light_cache = true;
@@ -518,6 +526,11 @@ wmJob *EEVEE_lightbake_job_create(
/* lbake->depsgraph = old_lbake->depsgraph; */
lbake->depsgraph = DEG_graph_new(scene, view_layer, DAG_EVAL_RENDER);
+ lbake->mutex = BLI_mutex_alloc();
+
+ BLI_mutex_lock(old_lbake->mutex);
+ old_lbake->own_resources = false;
+
lbake->scene = scene;
lbake->bmain = bmain;
lbake->view_layer_input = view_layer;
@@ -525,11 +538,15 @@ wmJob *EEVEE_lightbake_job_create(
lbake->own_resources = true;
lbake->delay = delay;
- old_lbake->own_resources = false;
+ if (lbake->gl_context == NULL) {
+ lbake->gl_context = WM_opengl_context_create();
+ wm_window_reset_drawable();
+ }
if (old_lbake->stop != NULL) {
*old_lbake->stop = 1;
}
+ BLI_mutex_unlock(old_lbake->mutex);
}
else {
lbake = EEVEE_lightbake_job_data_alloc(bmain, view_layer, scene, true);
@@ -559,6 +576,7 @@ void *EEVEE_lightbake_job_data_alloc(
lbake->view_layer_input = view_layer;
lbake->own_resources = true;
lbake->own_light_cache = false;
+ lbake->mutex = BLI_mutex_alloc();
if (run_as_job) {
lbake->gl_context = WM_opengl_context_create();
@@ -572,6 +590,8 @@ void EEVEE_lightbake_job_data_free(void *custom_data)
{
EEVEE_LightBake *lbake = (EEVEE_LightBake *)custom_data;
+
+
/* TODO reuse depsgraph. */
/* if (lbake->own_resources) { */
DEG_graph_free(lbake->depsgraph);
@@ -580,11 +600,17 @@ void EEVEE_lightbake_job_data_free(void *custom_data)
MEM_SAFE_FREE(lbake->cube_prb);
MEM_SAFE_FREE(lbake->grid_prb);
+ BLI_mutex_free(lbake->mutex);
+
MEM_freeN(lbake);
}
static void eevee_lightbake_delete_resources(EEVEE_LightBake *lbake)
{
+ if (!lbake->resource_only) {
+ BLI_mutex_lock(lbake->mutex);
+ }
+
if (lbake->gl_context) {
DRW_opengl_render_context_enable(lbake->gl_context);
DRW_gawain_render_context_enable(lbake->gpu_context);
@@ -593,11 +619,6 @@ static void eevee_lightbake_delete_resources(EEVEE_LightBake *lbake)
DRW_opengl_context_enable();
}
- if (lbake->own_light_cache) {
- EEVEE_lightcache_free(lbake->lcache);
- lbake->lcache = NULL;
- }
-
/* XXX Free the resources contained in the viewlayer data
* to be able to free the context before deleting the depsgraph. */
if (lbake->sldata) {
@@ -631,11 +652,16 @@ static void eevee_lightbake_delete_resources(EEVEE_LightBake *lbake)
else if (!lbake->resource_only) {
DRW_opengl_context_disable();
}
+
+ if (!lbake->resource_only) {
+ BLI_mutex_unlock(lbake->mutex);
+ }
}
/* Cache as in draw cache not light cache. */
static void eevee_lightbake_cache_create(EEVEE_Data *vedata, EEVEE_LightBake *lbake)
{
+ EEVEE_TextureList *txl = vedata->txl;
EEVEE_StorageList *stl = vedata->stl;
EEVEE_FramebufferList *fbl = vedata->fbl;
EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
@@ -660,7 +686,15 @@ static void eevee_lightbake_cache_create(EEVEE_Data *vedata, EEVEE_LightBake *lb
sldata->clip_ubo = DRW_uniformbuffer_create(sizeof(sldata->clip_data), &sldata->clip_data);
}
- EEVEE_effects_init(sldata, vedata, NULL);
+ /* HACK: set txl->color but unset it before Draw Manager frees it. */
+ txl->color = lbake->rt_color;
+ int viewport_size[2] = {
+ GPU_texture_width(txl->color),
+ GPU_texture_height(txl->color)
+ };
+ DRW_render_viewport_size_set(viewport_size);
+
+ EEVEE_effects_init(sldata, vedata, NULL, true);
EEVEE_materials_init(sldata, stl, fbl);
EEVEE_lights_init(sldata);
EEVEE_lightprobes_init(sldata, vedata);
@@ -682,9 +716,11 @@ static void eevee_lightbake_cache_create(EEVEE_Data *vedata, EEVEE_LightBake *lb
DRW_render_object_iter(vedata, NULL, lbake->depsgraph, EEVEE_render_cache);
EEVEE_materials_cache_finish(vedata);
- EEVEE_lights_cache_finish(sldata);
+ EEVEE_lights_cache_finish(sldata, vedata);
EEVEE_lightprobes_cache_finish(sldata, vedata);
+ txl->color = NULL;
+
DRW_render_instance_buffer_finish();
DRW_hair_update();
}
@@ -709,7 +745,7 @@ static void eevee_lightbake_render_world_sample(void *ved, void *user_data)
Scene *scene_eval = DEG_get_evaluated_scene(lbake->depsgraph);
LightCache *lcache = scene_eval->eevee.light_cache;
- /* TODO do this once for the whole bake when we have independant DRWManagers. */
+ /* TODO do this once for the whole bake when we have independent DRWManagers. */
eevee_lightbake_cache_create(vedata, lbake);
EEVEE_lightbake_render_world(sldata, vedata, lbake->rt_fb);
@@ -815,7 +851,7 @@ static void eevee_lightbake_render_grid_sample(void *ved, void *user_data)
/* Use the previous bounce for rendering this bounce. */
SWAP(GPUTexture *, lbake->grid_prev, lcache->grid_tx.tex);
- /* TODO do this once for the whole bake when we have independant DRWManagers.
+ /* TODO do this once for the whole bake when we have independent DRWManagers.
* Warning: Some of the things above require this. */
eevee_lightbake_cache_create(vedata, lbake);
@@ -829,6 +865,8 @@ static void eevee_lightbake_render_grid_sample(void *ved, void *user_data)
common_data->spec_toggle = false;
common_data->prb_num_planar = 0;
common_data->prb_num_render_cube = 0;
+ common_data->ray_type = EEVEE_RAY_DIFFUSE;
+ common_data->ray_depth = lbake->bounce_curr + 1;
if (lbake->bounce_curr == 0) {
common_data->prb_num_render_grid = 0;
}
@@ -881,13 +919,15 @@ static void eevee_lightbake_render_probe_sample(void *ved, void *user_data)
EEVEE_LightProbe *eprobe = lbake->cube;
LightProbe *prb = *lbake->probe;
- /* TODO do this once for the whole bake when we have independant DRWManagers. */
+ /* TODO do this once for the whole bake when we have independent DRWManagers. */
eevee_lightbake_cache_create(vedata, lbake);
/* Disable specular lighting when rendering probes to avoid feedback loops (looks bad). */
common_data->spec_toggle = false;
common_data->prb_num_planar = 0;
common_data->prb_num_render_cube = 0;
+ common_data->ray_type = EEVEE_RAY_GLOSSY;
+ common_data->ray_depth = 1;
DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
EEVEE_lightbake_render_scene(sldata, vedata, lbake->rt_fb, eprobe->position, prb->clipsta, prb->clipend);
@@ -1136,8 +1176,16 @@ void EEVEE_lightbake_update_world_quick(EEVEE_ViewLayerData *sldata, EEVEE_Data
EEVEE_lightbake_cache_init(sldata, vedata, lbake.rt_color, lbake.rt_depth);
+ sldata->common_data.ray_type = EEVEE_RAY_GLOSSY;
+ sldata->common_data.ray_depth = 1;
+ DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
EEVEE_lightbake_render_world(sldata, vedata, lbake.rt_fb);
EEVEE_lightbake_filter_glossy(sldata, vedata, lbake.rt_color, lbake.store_fb, 0, 1.0f, lcache->mips_len);
+
+ sldata->common_data.ray_type = EEVEE_RAY_DIFFUSE;
+ sldata->common_data.ray_depth = 1;
+ DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
+ EEVEE_lightbake_render_world(sldata, vedata, lbake.rt_fb);
EEVEE_lightbake_filter_diffuse(sldata, vedata, lbake.rt_color, lbake.store_fb, 0, 1.0f);
/* Don't hide grids if they are already rendered. */
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 50f4e694d2a..256425221f4 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -312,9 +312,14 @@ void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
lightprobe_shaders_init();
}
- if ((scene_eval->eevee.light_cache == NULL) &&
- (sldata->fallback_lightcache == NULL))
- {
+ /* Use fallback if we don't have gpu texture allocated an we cannot restore them. */
+ bool use_fallback_lightcache = (scene_eval->eevee.light_cache == NULL) ||
+ ((scene_eval->eevee.light_cache->grid_tx.tex == NULL) &&
+ (scene_eval->eevee.light_cache->grid_tx.data == NULL)) ||
+ ((scene_eval->eevee.light_cache->cube_tx.tex == NULL) &&
+ (scene_eval->eevee.light_cache->cube_tx.data == NULL));
+
+ if (use_fallback_lightcache && (sldata->fallback_lightcache == NULL)) {
#if defined(IRRADIANCE_SH_L2)
int grid_res = 4;
#elif defined(IRRADIANCE_CUBEMAP)
@@ -324,11 +329,10 @@ void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
#endif
int cube_res = OCTAHEDRAL_SIZE_FROM_CUBESIZE(scene_eval->eevee.gi_cubemap_resolution);
int vis_res = scene_eval->eevee.gi_visibility_resolution;
-
sldata->fallback_lightcache = EEVEE_lightcache_create(1, 1, cube_res, vis_res, (int[3]){grid_res, grid_res, 1});
}
- stl->g_data->light_cache = (scene_eval->eevee.light_cache) ? scene_eval->eevee.light_cache : sldata->fallback_lightcache;
+ stl->g_data->light_cache = (use_fallback_lightcache) ? sldata->fallback_lightcache : scene_eval->eevee.light_cache;
EEVEE_lightcache_load(stl->g_data->light_cache);
@@ -353,7 +357,7 @@ void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
}
}
-/* Only init the passes usefull for rendering the light cache. */
+/* Only init the passes useful for rendering the light cache. */
void EEVEE_lightbake_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, GPUTexture *rt_color, GPUTexture *rt_depth)
{
EEVEE_PassList *psl = vedata->psl;
@@ -476,7 +480,7 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedat
case GPU_MAT_SUCCESS:
grp = DRW_shgroup_material_create(gpumat, psl->probe_background);
DRW_shgroup_uniform_float(grp, "backgroundAlpha", &stl->g_data->background_alpha, 1);
- /* TODO (fclem): remove thoses (need to clean the GLSL files). */
+ /* TODO (fclem): remove those (need to clean the GLSL files). */
DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo);
DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo);
@@ -515,7 +519,7 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedat
DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
DRW_shgroup_uniform_vec3(grp, "screen_vecs[0]", DRW_viewport_screenvecs_get(), 2);
DRW_shgroup_uniform_float_copy(grp, "sphere_size", scene_eval->eevee.gi_cubemap_draw_size * 0.5f);
- /* TODO (fclem) get rid of thoses UBO. */
+ /* TODO (fclem) get rid of those UBO. */
DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo);
DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo);
}
@@ -534,7 +538,7 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedat
DRW_shgroup_uniform_vec3(shgrp, "screen_vecs[0]", DRW_viewport_screenvecs_get(), 2);
DRW_shgroup_uniform_texture_ref(shgrp, "irradianceGrid", &lcache->grid_tx.tex);
DRW_shgroup_uniform_float_copy(shgrp, "sphere_size", scene_eval->eevee.gi_irradiance_draw_size * 0.5f);
- /* TODO (fclem) get rid of thoses UBO. */
+ /* TODO (fclem) get rid of those UBO. */
DRW_shgroup_uniform_block(shgrp, "probe_block", sldata->probe_ubo);
DRW_shgroup_uniform_block(shgrp, "planar_block", sldata->planar_ubo);
DRW_shgroup_uniform_block(shgrp, "grid_block", sldata->grid_ubo);
@@ -903,7 +907,7 @@ static void render_cubemap(
/* 1 - Render to each cubeface individually.
* We do this instead of using geometry shader because a) it's faster,
- * b) it's easier than fixing the nodetree shaders (for view dependant effects). */
+ * b) it's easier than fixing the nodetree shaders (for view dependent effects). */
for (int i = 0; i < 6; ++i) {
/* Setup custom matrices */
mul_m4_m4m4(matstate.viewmat, cubefacemat[i], posmat);
@@ -968,7 +972,7 @@ static void lightbake_render_scene_face(int face, EEVEE_BakeRenderData *user_dat
struct GPUFrameBuffer **face_fb = user_data->face_fb;
/* Be sure that cascaded shadow maps are updated. */
- EEVEE_draw_shadows(sldata, psl);
+ EEVEE_draw_shadows(sldata, user_data->vedata);
GPU_framebuffer_bind(face_fb[face]);
GPU_framebuffer_clear_depth(face_fb[face], 1.0f);
@@ -1024,7 +1028,7 @@ static void lightbake_render_scene_reflected(int layer, EEVEE_BakeRenderData *us
DRW_stats_group_start("Planar Reflection");
/* Be sure that cascaded shadow maps are updated. */
- EEVEE_draw_shadows(sldata, psl);
+ EEVEE_draw_shadows(sldata, vedata);
/* Since we are rendering with an inverted view matrix, we need
* to invert the facing for backface culling to be the same. */
DRW_state_invert_facing();
@@ -1123,7 +1127,7 @@ void EEVEE_lightbake_filter_glossy(
for (int i = 0; i < maxlevel + 1; i++) {
float bias = (i == 0) ? -1.0f : 1.0f;
pinfo->texel_size = 1.0f / (float)mipsize;
- pinfo->padding_size = (float)(1 << (maxlevel - i - 1));
+ pinfo->padding_size = (i == maxlevel) ? 0 : (float)(1 << (maxlevel - i - 1));
pinfo->padding_size *= pinfo->texel_size;
pinfo->layer = probe_idx;
pinfo->roughness = i / (float)maxlevel;
@@ -1312,6 +1316,8 @@ void EEVEE_lightprobes_refresh_planar(EEVEE_ViewLayerData *sldata, EEVEE_Data *v
common_data->ssr_toggle = false;
common_data->sss_toggle = false;
+ common_data->ray_type = EEVEE_RAY_GLOSSY;
+ common_data->ray_depth = 1.0f;
DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
/* Rendering happens here! */
diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c
index 2c970fa5285..02667bf7087 100644
--- a/source/blender/draw/engines/eevee/eevee_lights.c
+++ b/source/blender/draw/engines/eevee/eevee_lights.c
@@ -26,6 +26,7 @@
#include "DRW_render.h"
#include "BLI_dynstr.h"
+#include "BLI_rand.h"
#include "BLI_rect.h"
#include "BKE_object.h"
@@ -38,6 +39,7 @@
#define SHADOW_CASTER_ALLOC_CHUNK 16
// #define DEBUG_CSM
+// #define DEBUG_SHADOW_DISTRIBUTION
static struct {
struct GPUShader *shadow_sh;
@@ -138,6 +140,7 @@ void EEVEE_lights_init(EEVEE_ViewLayerData *sldata)
int sh_cube_size = scene_eval->eevee.shadow_cube_size;
int sh_cascade_size = scene_eval->eevee.shadow_cascade_size;
const bool sh_high_bitdepth = (scene_eval->eevee.flag & SCE_EEVEE_SHADOW_HIGH_BITDEPTH) != 0;
+ sldata->lamps->soft_shadows = (scene_eval->eevee.flag & SCE_EEVEE_SHADOW_SOFT) != 0;
EEVEE_LampsInfo *linfo = sldata->lamps;
if ((linfo->shadow_cube_size != sh_cube_size) ||
@@ -360,10 +363,9 @@ void EEVEE_lights_cache_add(EEVEE_ViewLayerData *sldata, Object *ob)
if (la->mode & LA_SHADOW) {
if (la->type == LA_SUN) {
- int sh_nbr = 1; /* TODO : MSM */
int cascade_nbr = la->cascade_count;
- if ((linfo->gpu_cascade_len + sh_nbr) <= MAX_SHADOW_CASCADE) {
+ if ((linfo->gpu_cascade_len + 1) <= MAX_SHADOW_CASCADE) {
/* Save Light object. */
linfo->shadow_cascade_ref[linfo->cpu_cascade_len] = ob;
@@ -375,16 +377,14 @@ void EEVEE_lights_cache_add(EEVEE_ViewLayerData *sldata, Object *ob)
/* Increment indices. */
linfo->gpu_shadow_len += 1;
- linfo->gpu_cascade_len += sh_nbr;
- linfo->num_cascade_layer += sh_nbr * cascade_nbr;
+ linfo->gpu_cascade_len += 1;
+ linfo->num_cascade_layer += cascade_nbr;
linfo->cpu_cascade_len += 1;
}
}
else if (la->type == LA_SPOT || la->type == LA_LOCAL || la->type == LA_AREA) {
- int sh_nbr = 1; /* TODO : MSM */
-
- if ((linfo->gpu_cube_len + sh_nbr) <= MAX_SHADOW_CUBE) {
+ if ((linfo->gpu_cube_len + 1) <= MAX_SHADOW_CUBE) {
/* Save Light object. */
linfo->shadow_cube_ref[linfo->cpu_cube_len] = ob;
@@ -409,8 +409,8 @@ void EEVEE_lights_cache_add(EEVEE_ViewLayerData *sldata, Object *ob)
/* Increment indices. */
linfo->gpu_shadow_len += 1;
- linfo->gpu_cube_len += sh_nbr;
- linfo->num_cube_layer += sh_nbr;
+ linfo->gpu_cube_len += 1;
+ linfo->num_cube_layer += 1;
linfo->cpu_cube_len += 1;
}
@@ -433,7 +433,7 @@ void EEVEE_lights_cache_shcaster_add(
}
void EEVEE_lights_cache_shcaster_material_add(
- EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_PassList *psl, struct GPUMaterial *gpumat,
+ EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl, struct GPUMaterial *gpumat,
struct GPUBatch *geom, struct Object *ob, float *alpha_threshold)
{
/* TODO / PERF : reuse the same shading group for objects with the same material */
@@ -441,6 +441,15 @@ void EEVEE_lights_cache_shcaster_material_add(
if (grp == NULL) return;
+ /* Grrr needed for correctness but not 99% of the time not needed.
+ * TODO detect when needed? */
+ DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo);
+ DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo);
+ DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo);
+ 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, "common_block", sldata->common_ubo);
+
if (alpha_threshold != NULL)
DRW_shgroup_uniform_float(grp, "alphaThreshold", alpha_threshold, 1);
@@ -509,7 +518,7 @@ void EEVEE_lights_cache_shcaster_object_add(EEVEE_ViewLayerData *sldata, Object
oedata->need_update = false;
}
-void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata)
+void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
{
EEVEE_LampsInfo *linfo = sldata->lamps;
GPUTextureFormat shadow_pool_format = GPU_R32F;
@@ -578,7 +587,7 @@ void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata)
});
/* Update Lamps UBOs. */
- EEVEE_lights_update(sldata);
+ EEVEE_lights_update(sldata, vedata);
}
/* Update buffer with lamp data */
@@ -619,12 +628,12 @@ static void eevee_light_setup(Object *ob, EEVEE_Light *evli)
evli->radius = max_ff(0.001f, la->area_size);
}
else if (la->type == LA_AREA) {
- evli->sizex = max_ff(0.0001f, la->area_size * scale[0] * 0.5f);
+ evli->sizex = max_ff(0.003f, la->area_size * scale[0] * 0.5f);
if (ELEM(la->area_shape, LA_AREA_RECT, LA_AREA_ELLIPSE)) {
- evli->sizey = max_ff(0.0001f, la->area_sizey * scale[1] * 0.5f);
+ evli->sizey = max_ff(0.003f, la->area_sizey * scale[1] * 0.5f);
}
else {
- evli->sizey = max_ff(0.0001f, la->area_size * scale[1] * 0.5f);
+ evli->sizey = max_ff(0.003f, la->area_size * scale[1] * 0.5f);
}
}
else {
@@ -640,7 +649,7 @@ static void eevee_light_setup(Object *ob, EEVEE_Light *evli)
80.0f; /* XXX : Empirical, Fit cycles power */
if (ELEM(la->area_shape, LA_AREA_DISK, LA_AREA_ELLIPSE)) {
evli->lamptype = LAMPTYPE_AREA_ELLIPSE;
- /* Scale power to account for the lower area of the ellipse compared to the surrouding rectangle. */
+ /* Scale power to account for the lower area of the ellipse compared to the surrounding rectangle. */
power *= 4.0f / M_PI;
}
}
@@ -661,7 +670,108 @@ static void eevee_light_setup(Object *ob, EEVEE_Light *evli)
evli->shadowid = -1.0f;
}
-static void eevee_shadow_cube_setup(Object *ob, EEVEE_LampsInfo *linfo, EEVEE_LampEngineData *led)
+/**
+ * Special ball distribution:
+ * Point are distributed in a way that when they are orthogonaly
+ * projected into any plane, the resulting distribution is (close to)
+ * a uniform disc distribution.
+ **/
+static void sample_ball(int sample_ofs, float radius, float rsample[3])
+{
+ double ht_point[3];
+ double ht_offset[3] = {0.0, 0.0, 0.0};
+ uint ht_primes[3] = {2, 3, 7};
+
+ BLI_halton_3D(ht_primes, ht_offset, sample_ofs, ht_point);
+
+ float omega = ht_point[1] * 2.0f * M_PI;
+
+ rsample[2] = ht_point[0] * 2.0f - 1.0f; /* cos theta */
+
+ float r = sqrtf(fmaxf(0.0f, 1.0f - rsample[2] * rsample[2])); /* sin theta */
+
+ rsample[0] = r * cosf(omega);
+ rsample[1] = r * sinf(omega);
+
+ radius *= sqrt(sqrt(ht_point[2]));
+ mul_v3_fl(rsample, radius);
+}
+
+static void sample_rectangle(
+ int sample_ofs, float x_axis[3], float y_axis[3], float size_x, float size_y,
+ float rsample[3])
+{
+ double ht_point[2];
+ double ht_offset[2] = {0.0, 0.0};
+ uint ht_primes[2] = {2, 3};
+
+ BLI_halton_2D(ht_primes, ht_offset, sample_ofs, ht_point);
+
+ /* Change ditribution 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];
+
+ zero_v3(rsample);
+ madd_v3_v3fl(rsample, x_axis, (ht_point[0] * 2.0f) * size_x);
+ madd_v3_v3fl(rsample, y_axis, (ht_point[1] * 2.0f) * size_y);
+}
+
+static void sample_ellipse(
+ int sample_ofs, float x_axis[3], float y_axis[3], float size_x, float size_y,
+ float rsample[3])
+{
+ double ht_point[2];
+ double ht_offset[2] = {0.0, 0.0};
+ uint ht_primes[2] = {2, 3};
+
+ BLI_halton_2D(ht_primes, ht_offset, sample_ofs, ht_point);
+
+ /* Uniform disc sampling. */
+ float omega = ht_point[1] * 2.0f * M_PI;
+ float r = sqrtf(ht_point[0]);
+ ht_point[0] = r * cosf(omega) * size_x;
+ ht_point[1] = r * sinf(omega) * size_y;
+
+ zero_v3(rsample);
+ madd_v3_v3fl(rsample, x_axis, ht_point[0]);
+ madd_v3_v3fl(rsample, y_axis, ht_point[1]);
+}
+
+
+static void shadow_cube_random_position_set(
+ EEVEE_Light *evli, Lamp *la,
+ int sample_ofs,
+ float ws_sample_pos[3])
+{
+ float jitter[3];
+
+#ifndef DEBUG_SHADOW_DISTRIBUTION
+ int i = sample_ofs;
+#else
+ for (int i = 0; i <= sample_ofs; ++i) {
+#endif
+ switch (la->type) {
+ case LA_AREA:
+ if (ELEM(la->area_shape, LA_AREA_RECT, LA_AREA_SQUARE)) {
+ sample_rectangle(i, evli->rightvec, evli->upvec, evli->sizex, evli->sizey, jitter);
+ }
+ else {
+ sample_ellipse(i, evli->rightvec, evli->upvec, evli->sizex, evli->sizey, jitter);
+ }
+ break;
+ default:
+ sample_ball(i, evli->radius, jitter);
+ }
+#ifdef DEBUG_SHADOW_DISTRIBUTION
+ float p[3];
+ add_v3_v3v3(p, jitter, ws_sample_pos);
+ DRW_debug_sphere(p, 0.01f, (float[4]){1.0f, (sample_ofs == i) ? 1.0f : 0.0f, 0.0f, 1.0f});
+ }
+#endif
+ add_v3_v3(ws_sample_pos, jitter);
+}
+
+static void eevee_shadow_cube_setup(Object *ob, EEVEE_LampsInfo *linfo, EEVEE_LampEngineData *led, int sample_ofs)
{
EEVEE_ShadowCubeData *sh_data = &led->data.scd;
EEVEE_Light *evli = linfo->light_data + sh_data->light_id;
@@ -669,11 +779,10 @@ static void eevee_shadow_cube_setup(Object *ob, EEVEE_LampsInfo *linfo, EEVEE_La
EEVEE_ShadowCube *cube_data = linfo->shadow_cube_data + sh_data->cube_id;
Lamp *la = (Lamp *)ob->data;
- int sh_nbr = 1; /* TODO: MSM */
+ copy_v3_v3(cube_data->position, ob->obmat[3]);
- for (int i = 0; i < sh_nbr; ++i) {
- /* TODO : choose MSM sample point here. */
- copy_v3_v3(cube_data->position, ob->obmat[3]);
+ if (linfo->soft_shadows) {
+ shadow_cube_random_position_set(evli, la, sample_ofs, cube_data->position);
}
ubo_data->bias = 0.05f * la->bias;
@@ -684,7 +793,6 @@ static void eevee_shadow_cube_setup(Object *ob, EEVEE_LampsInfo *linfo, EEVEE_La
evli->shadowid = (float)(sh_data->shadow_id);
ubo_data->shadow_start = (float)(sh_data->layer_id);
ubo_data->data_start = (float)(sh_data->cube_id);
- ubo_data->multi_shadow_count = (float)(sh_nbr);
ubo_data->shadow_blur = la->soft * 0.02f; /* Used by translucence shadowmap blur */
ubo_data->contact_dist = (la->mode & LA_SHAD_CONTACT) ? la->contact_dist : 0.0f;
@@ -693,6 +801,27 @@ static void eevee_shadow_cube_setup(Object *ob, EEVEE_LampsInfo *linfo, EEVEE_La
ubo_data->contact_thickness = la->contact_thickness;
}
+static void shadow_cascade_random_matrix_set(float mat[4][4], float radius, int sample_ofs)
+{
+ float jitter[3];
+
+#ifndef DEBUG_SHADOW_DISTRIBUTION
+ int i = sample_ofs;
+#else
+ for (int i = 0; i <= sample_ofs; ++i) {
+#endif
+ sample_ellipse(i, mat[0], mat[1], radius, radius, jitter);
+#ifdef DEBUG_SHADOW_DISTRIBUTION
+ float p[3];
+ add_v3_v3v3(p, jitter, mat[2]);
+ DRW_debug_sphere(p, 0.01f, (float[4]){1.0f, (sample_ofs == i) ? 1.0f : 0.0f, 0.0f, 1.0f});
+ }
+#endif
+
+ add_v3_v3(mat[2], jitter);
+ orthogonalize_m4(mat, 2);
+}
+
#define LERP(t, a, b) ((a) + (t) * ((b) - (a)))
static double round_to_digits(double value, int digits)
@@ -743,7 +872,7 @@ static void frustum_min_bounding_sphere(const float corners[8][3], float r_cente
static void eevee_shadow_cascade_setup(
Object *ob, EEVEE_LampsInfo *linfo, EEVEE_LampEngineData *led,
- DRWMatrixState *saved_mats, float view_near, float view_far)
+ DRWMatrixState *saved_mats, float view_near, float view_far, int sample_ofs)
{
Lamp *la = (Lamp *)ob->data;
@@ -753,7 +882,6 @@ static void eevee_shadow_cascade_setup(
bool is_persp = DRW_viewport_is_persp_get();
/* Lamps Matrices */
- int sh_nbr = 1; /* TODO : MSM */
int cascade_nbr = la->cascade_count;
EEVEE_ShadowCascadeData *sh_data = &led->data.scad;
@@ -767,8 +895,13 @@ static void eevee_shadow_cascade_setup(
#if 0 /* done at culling time */
normalize_m4_m4(viewmat, ob->obmat);
#endif
+
+ if (linfo->soft_shadows) {
+ shadow_cascade_random_matrix_set(viewmat, evli->radius, sample_ofs);
+ }
+
+ copy_m4_m4(sh_data->viewinv, viewmat);
invert_m4(viewmat);
- invert_m4_m4(sh_data->viewinv, viewmat);
/* The technique consists into splitting
* the view frustum into several sub-frustum
@@ -944,7 +1077,6 @@ static void eevee_shadow_cascade_setup(
evli->shadowid = (float)(sh_data->shadow_id);
ubo_data->shadow_start = (float)(sh_data->layer_id);
ubo_data->data_start = (float)(sh_data->cascade_id);
- ubo_data->multi_shadow_count = (float)(sh_nbr);
ubo_data->shadow_blur = la->soft * 0.02f; /* Used by translucence shadowmap blur */
ubo_data->contact_dist = (la->mode & LA_SHAD_CONTACT) ? la->contact_dist : 0.0f;
@@ -965,8 +1097,10 @@ static bool sphere_bbox_intersect(const EEVEE_BoundSphere *bs, const EEVEE_Bound
return x && y && z;
}
-void EEVEE_lights_update(EEVEE_ViewLayerData *sldata)
+void EEVEE_lights_update(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
{
+ EEVEE_StorageList *stl = vedata->stl;
+ EEVEE_EffectsInfo *effects = stl->effects;
EEVEE_LampsInfo *linfo = sldata->lamps;
Object *ob;
int i;
@@ -1022,8 +1156,8 @@ void EEVEE_lights_update(EEVEE_ViewLayerData *sldata)
for (i = 0; (i < MAX_SHADOW_CUBE) && (ob = linfo->shadow_cube_ref[i]); i++) {
EEVEE_LampEngineData *led = EEVEE_lamp_data_ensure(ob);
- eevee_shadow_cube_setup(ob, linfo, led);
- if (lightbits_get(&update_bits, i) != 0) {
+ eevee_shadow_cube_setup(ob, linfo, led, effects->taa_current_sample - 1);
+ if (lightbits_get(&update_bits, i) != 0 || linfo->soft_shadows) {
led->need_update = true;
}
}
@@ -1038,13 +1172,21 @@ void EEVEE_lights_update(EEVEE_ViewLayerData *sldata)
}
/* this refresh lamps shadow buffers */
-void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl)
+void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
{
+ EEVEE_PassList *psl = vedata->psl;
+ EEVEE_StorageList *stl = vedata->stl;
+ EEVEE_EffectsInfo *effects = stl->effects;
EEVEE_LampsInfo *linfo = sldata->lamps;
Object *ob;
int i;
DRWMatrixState saved_mats;
+ int saved_ray_type = sldata->common_data.ray_type;
+
+ /* TODO: make it optionnal if we don't draw shadows. */
+ sldata->common_data.ray_type = EEVEE_RAY_SHADOW;
+ DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
/* Precompute all shadow/view test before rendering and trashing the culling cache. */
bool cube_visible[MAX_SHADOW_CUBE];
@@ -1052,7 +1194,7 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl)
Lamp *la = (Lamp *)ob->data;
BoundSphere bsphere = {
.center = {ob->obmat[3][0], ob->obmat[3][1], ob->obmat[3][2]},
- .radius = la->dist
+ .radius = la->clipend
};
cube_visible[i] = DRW_culling_sphere_test(&bsphere);
}
@@ -1062,6 +1204,7 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl)
EEVEE_ShadowCascadeData *sh_data = &led->data.scad;
float plane[4];
normalize_m4_m4(sh_data->viewmat, ob->obmat);
+
plane_from_point_normal_v3(plane, sh_data->viewmat[3], sh_data->viewmat[2]);
/* TODO: check against near/far instead of "local Z = 0" plane.
* Or even the cascades AABB. */
@@ -1089,21 +1232,23 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl)
EEVEE_ShadowRender *srd = &linfo->shadow_render_data;
EEVEE_ShadowCubeData *evscd = &led->data.scd;
+ EEVEE_ShadowCube *cube_data = linfo->shadow_cube_data + evscd->cube_id;
perspective_m4(winmat, -la->clipsta, la->clipsta, -la->clipsta, la->clipsta, la->clipsta, la->clipend);
srd->clip_near = la->clipsta;
srd->clip_far = la->clipend;
- copy_v3_v3(srd->position, ob->obmat[3]);
+ copy_v3_v3(srd->position, cube_data->position);
srd->stored_texel_size = 1.0 / (float)linfo->shadow_cube_store_size;
+ srd->exponent = la->bleedexp;
DRW_uniformbuffer_update(sldata->shadow_render_ubo, srd);
/* Render shadow cube */
/* Render 6 faces separately: seems to be faster for the general case.
* The only time it's more beneficial is when the CPU culling overhead
- * outweight the instancing overhead. which is rarelly the case. */
+ * outweigh the instancing overhead. which is rarely the case. */
for (int j = 0; j < 6; j++) {
/* TODO optimize */
float tmp[4][4];
@@ -1169,7 +1314,9 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl)
DRWPass *store_pass = eevee_lights_cube_store_pass_get(psl, sldata, linfo->shadow_method, srd->shadow_samples_len);
DRW_draw_pass(store_pass);
- led->need_update = false;
+ if (linfo->soft_shadows == false) {
+ led->need_update = false;
+ }
}
linfo->update_flag &= ~LIGHT_UPDATE_SHADOW_CUBE;
DRW_stats_group_end();
@@ -1196,7 +1343,7 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl)
float (*viewmat)[4] = render_mats.mat[DRW_MAT_VIEW];
float (*persmat)[4] = render_mats.mat[DRW_MAT_PERS];
- eevee_shadow_cascade_setup(ob, linfo, led, &saved_mats, near, far);
+ eevee_shadow_cascade_setup(ob, linfo, led, &saved_mats, near, far, effects->taa_current_sample - 1);
srd->clip_near = la->clipsta;
srd->clip_far = la->clipend;
@@ -1210,7 +1357,7 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl)
/* Render shadow cascades */
/* Render cascade separately: seems to be faster for the general case.
* The only time it's more beneficial is when the CPU culling overhead
- * outweight the instancing overhead. which is rarelly the case. */
+ * outweigh the instancing overhead. which is rarely the case. */
for (int j = 0; j < la->cascade_count; j++) {
copy_m4_m4(winmat, evscd->projmat[j]);
copy_m4_m4(persmat, evscd->viewprojmat[j]);
@@ -1279,6 +1426,9 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl)
DRW_uniformbuffer_update(sldata->light_ubo, &linfo->light_data);
DRW_uniformbuffer_update(sldata->shadow_ubo, &linfo->shadow_data); /* Update all data at once */
+
+ sldata->common_data.ray_type = saved_ray_type;
+ DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
}
void EEVEE_lights_free(void)
diff --git a/source/blender/draw/engines/eevee/eevee_lookdev.c b/source/blender/draw/engines/eevee/eevee_lookdev.c
index deb724c9ae6..49cf468711e 100644
--- a/source/blender/draw/engines/eevee/eevee_lookdev.c
+++ b/source/blender/draw/engines/eevee/eevee_lookdev.c
@@ -34,9 +34,13 @@
#include "ED_screen.h"
+#include "UI_resources.h"
+
#include "eevee_private.h"
#include "eevee_lightcache.h"
+#include "draw_common.h"
+
static void eevee_lookdev_lightcache_delete(EEVEE_Data *vedata)
{
EEVEE_StorageList *stl = vedata->stl;
@@ -51,7 +55,7 @@ static void eevee_lookdev_lightcache_delete(EEVEE_Data *vedata)
void EEVEE_lookdev_cache_init(
EEVEE_Data *vedata, DRWShadingGroup **grp, GPUShader *shader, DRWPass *pass,
- World *world, EEVEE_LightProbesInfo *pinfo)
+ World *UNUSED(world), EEVEE_LightProbesInfo *pinfo)
{
EEVEE_StorageList *stl = vedata->stl;
EEVEE_TextureList *txl = vedata->txl;
@@ -86,6 +90,9 @@ void EEVEE_lookdev_cache_init(
stl->lookdev_lightcache = EEVEE_lightcache_create(1, 1, cube_res, vis_res, (int[3]){grid_res, grid_res, 1});
+ /* XXX: Fix memleak. TODO find out why. */
+ MEM_SAFE_FREE(stl->lookdev_cube_mips);
+
/* We do this to use a special light cache for lookdev.
* This lightcache needs to be per viewport. But we need to
* have correct freeing when the viewport is closed. So we
@@ -100,14 +107,17 @@ void EEVEE_lookdev_cache_init(
stl->g_data->light_cache = stl->lookdev_lightcache;
+ static float background_color[4];
+ UI_GetThemeColor4fv(TH_HIGH_GRAD, background_color);
+ /* XXX: Really quick conversion to avoid washed out background.
+ * Needs to be addressed properly (color managed using ocio). */
+ srgb_to_linearrgb_v4(background_color, background_color);
+
*grp = DRW_shgroup_create(shader, pass);
axis_angle_to_mat3_single(stl->g_data->studiolight_matrix, 'Z', v3d->shading.studiolight_rot_z);
DRW_shgroup_uniform_mat3(*grp, "StudioLightMatrix", stl->g_data->studiolight_matrix);
-
- if (world) {
- DRW_shgroup_uniform_vec3(*grp, "color", &world->horr, 1);
- }
DRW_shgroup_uniform_float(*grp, "backgroundAlpha", &stl->g_data->background_alpha, 1);
+ DRW_shgroup_uniform_vec3(*grp, "color", background_color, 1);
DRW_shgroup_call_add(*grp, geom, NULL);
if (!pinfo) {
/* Do not fadeout when doing probe rendering, only when drawing the background */
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 9ef64477aca..78d5231a793 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -66,9 +66,12 @@ static struct {
struct GPUTexture *util_tex;
struct GPUTexture *noise_tex;
+ struct GPUUniformBuffer *dummy_sss_profile;
+
uint sss_count;
float alpha_hash_offset;
+ float alpha_hash_scale;
float noise_offsets[3];
} e_data = {NULL}; /* Engine data */
@@ -385,7 +388,7 @@ static void add_standard_uniforms(
DRW_shgroup_uniform_texture_ref(shgrp, "shadowCascadeTexture", &sldata->shadow_cascade_pool);
DRW_shgroup_uniform_texture_ref(shgrp, "maxzBuffer", &vedata->txl->maxzbuffer);
}
- if ((use_diffuse || use_glossy) && !use_refract) {
+ if ((use_diffuse || use_glossy) && !use_ssrefraction) {
if ((vedata->stl->effects->enabled_effects & EFFECT_GTAO) != 0) {
DRW_shgroup_uniform_texture_ref(shgrp, "horizonBuffer", &vedata->stl->effects->gtao_horizons);
}
@@ -404,10 +407,11 @@ static void add_standard_uniforms(
DRW_shgroup_uniform_texture_ref(shgrp, "probePlanars", &vedata->txl->planar_pool);
DRW_shgroup_uniform_int(shgrp, "outputSsrId", ssr_id, 1);
}
- if (use_refract || use_ssrefraction) {
- BLI_assert(refract_depth != NULL);
- DRW_shgroup_uniform_float(shgrp, "refractionDepth", refract_depth, 1);
- DRW_shgroup_uniform_texture_ref(shgrp, "colorBuffer", &vedata->txl->refract_color);
+ if (use_refract) {
+ DRW_shgroup_uniform_float_copy(shgrp, "refractionDepth", (refract_depth) ? *refract_depth : 0.0 );
+ if (use_ssrefraction) {
+ DRW_shgroup_uniform_texture_ref(shgrp, "colorBuffer", &vedata->txl->refract_color);
+ }
}
if ((vedata->stl->effects->enabled_effects & EFFECT_VOLUMETRIC) != 0 &&
@@ -433,6 +437,11 @@ static void create_default_shader(int options)
MEM_freeN(frag_str);
}
+static void eevee_init_dummys(void)
+{
+ e_data.dummy_sss_profile = GPU_material_create_sss_profile_ubo();
+}
+
static void eevee_init_noise_texture(void)
{
e_data.noise_tex = DRW_texture_create_2D(64, 64, GPU_RGBA16F, 0, (float *)blue_noise);
@@ -621,17 +630,20 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata, EEVEE_StorageList *stl, E
eevee_init_util_texture();
eevee_init_noise_texture();
+ eevee_init_dummys();
}
if (!DRW_state_is_image_render() &&
((stl->effects->enabled_effects & EFFECT_TAA) == 0))
{
e_data.alpha_hash_offset = 0.0f;
+ e_data.alpha_hash_scale = 1.0f;
}
else {
double r;
BLI_halton_1D(5, 0.0, stl->effects->taa_current_sample - 1, &r);
e_data.alpha_hash_offset = (float)r;
+ e_data.alpha_hash_scale = 0.01f;
}
{
@@ -972,7 +984,7 @@ void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
case GPU_MAT_SUCCESS:
grp = DRW_shgroup_material_create(gpumat, psl->background_pass);
DRW_shgroup_uniform_float(grp, "backgroundAlpha", &stl->g_data->background_alpha, 1);
- /* TODO (fclem): remove thoses (need to clean the GLSL files). */
+ /* TODO (fclem): remove those (need to clean the GLSL files). */
DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo);
DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo);
@@ -1080,23 +1092,23 @@ void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
}
}
-#define ADD_SHGROUP_CALL(shgrp, ob, geom, oedata) do { \
+#define ADD_SHGROUP_CALL(shgrp, ob, ma, geom, oedata) do { \
if (is_sculpt_mode_draw) { \
DRW_shgroup_call_sculpt_add(shgrp, ob, ob->obmat); \
} \
else { \
if (oedata) { \
- DRW_shgroup_call_object_add_with_callback(shgrp, geom, ob, EEVEE_lightprobes_obj_visibility_cb, oedata); \
+ DRW_shgroup_call_object_add_with_callback(shgrp, geom, ob, ma, EEVEE_lightprobes_obj_visibility_cb, oedata); \
} \
else { \
- DRW_shgroup_call_object_add(shgrp, geom, ob); \
+ DRW_shgroup_call_object_add_ex(shgrp, geom, ob, ma, false); \
} \
} \
} while (0)
-#define ADD_SHGROUP_CALL_SAFE(shgrp, ob, geom, oedata) do { \
+#define ADD_SHGROUP_CALL_SAFE(shgrp, ob, ma, geom, oedata) do { \
if (shgrp) { \
- ADD_SHGROUP_CALL(shgrp, ob, geom, oedata); \
+ ADD_SHGROUP_CALL(shgrp, ob, ma, geom, oedata); \
} \
} while (0)
@@ -1198,6 +1210,8 @@ static void material_opaque(
else if (ma->blend_method == MA_BM_HASHED) {
DRW_shgroup_uniform_float(*shgrp_depth, "hashAlphaOffset", &e_data.alpha_hash_offset, 1);
DRW_shgroup_uniform_float(*shgrp_depth_clip, "hashAlphaOffset", &e_data.alpha_hash_offset, 1);
+ DRW_shgroup_uniform_float_copy(*shgrp_depth, "hashAlphaScale", e_data.alpha_hash_scale);
+ DRW_shgroup_uniform_float_copy(*shgrp_depth_clip, "hashAlphaScale", e_data.alpha_hash_scale);
}
}
}
@@ -1245,6 +1259,19 @@ static void material_opaque(
printf("Error: Too many different Subsurface shader in the scene.\n");
}
}
+ else {
+ if (use_translucency) {
+ /* NOTE: This is a nasty workaround, because the sss profile might not have been generated
+ * but the UBO is still declared in this case even if not used. But rendering without a
+ * bound UBO might result in crashes on certain platform. */
+ DRW_shgroup_uniform_block(*shgrp, "sssProfile", e_data.dummy_sss_profile);
+ }
+ }
+ }
+ else {
+ if (use_translucency) {
+ DRW_shgroup_uniform_block(*shgrp, "sssProfile", e_data.dummy_sss_profile);
+ }
}
break;
}
@@ -1498,95 +1525,97 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sld
*/
bool use_volume_material = (gpumat_array[0] && GPU_material_use_domain_volume(gpumat_array[0]));
- /* Get per-material split surface */
- char *auto_layer_names;
- int *auto_layer_is_srgb;
- int auto_layer_count;
- struct GPUBatch **mat_geom = DRW_cache_object_surface_material_get(
- ob, gpumat_array, materials_len,
- &auto_layer_names,
- &auto_layer_is_srgb,
- &auto_layer_count);
- if (mat_geom) {
- for (int i = 0; i < materials_len; ++i) {
- if (mat_geom[i] == NULL) {
- continue;
- }
- EEVEE_ObjectEngineData *oedata = NULL;
- Material *ma = give_current_material(ob, i + 1);
-
- if (ma == NULL)
- ma = &defmaterial;
-
- /* Do not render surface if we are rendering a volume object
- * and do not have a surface closure. */
- if (use_volume_material &&
- (gpumat_array[i] && !GPU_material_use_domain_surface(gpumat_array[i])))
- {
- continue;
- }
+ if (ob->dt >= OB_SOLID) {
+ /* Get per-material split surface */
+ char *auto_layer_names;
+ int *auto_layer_is_srgb;
+ int auto_layer_count;
+ struct GPUBatch **mat_geom = DRW_cache_object_surface_material_get(
+ ob, gpumat_array, materials_len,
+ &auto_layer_names,
+ &auto_layer_is_srgb,
+ &auto_layer_count);
+ if (mat_geom) {
+ for (int i = 0; i < materials_len; ++i) {
+ if (mat_geom[i] == NULL) {
+ continue;
+ }
+ EEVEE_ObjectEngineData *oedata = NULL;
+ Material *ma = give_current_material(ob, i + 1);
+
+ if (ma == NULL)
+ ma = &defmaterial;
+
+ /* Do not render surface if we are rendering a volume object
+ * and do not have a surface closure. */
+ if (use_volume_material &&
+ (gpumat_array[i] && !GPU_material_use_domain_surface(gpumat_array[i])))
+ {
+ continue;
+ }
- /* XXX TODO rewrite this to include the dupli objects.
- * This means we cannot exclude dupli objects from reflections!!! */
- if ((ob->base_flag & BASE_FROMDUPLI) == 0) {
- oedata = EEVEE_object_data_ensure(ob);
- oedata->ob = ob;
- oedata->test_data = &sldata->probes->vis_data;
- }
+ /* XXX TODO rewrite this to include the dupli objects.
+ * This means we cannot exclude dupli objects from reflections!!! */
+ if ((ob->base_flag & BASE_FROMDUPLI) == 0) {
+ oedata = EEVEE_object_data_ensure(ob);
+ oedata->ob = ob;
+ oedata->test_data = &sldata->probes->vis_data;
+ }
- /* Shading pass */
- ADD_SHGROUP_CALL(shgrp_array[i], ob, mat_geom[i], oedata);
+ /* Shading pass */
+ ADD_SHGROUP_CALL(shgrp_array[i], ob, ma, mat_geom[i], oedata);
- /* Depth Prepass */
- ADD_SHGROUP_CALL_SAFE(shgrp_depth_array[i], ob, mat_geom[i], oedata);
- ADD_SHGROUP_CALL_SAFE(shgrp_depth_clip_array[i], ob, mat_geom[i], oedata);
+ /* Depth Prepass */
+ ADD_SHGROUP_CALL_SAFE(shgrp_depth_array[i], ob, ma, mat_geom[i], oedata);
+ ADD_SHGROUP_CALL_SAFE(shgrp_depth_clip_array[i], ob, ma, mat_geom[i], oedata);
- char *name = auto_layer_names;
- for (int j = 0; j < auto_layer_count; ++j) {
- /* TODO don't add these uniform when not needed (default pass shaders). */
- if (shgrp_array[i]) {
- DRW_shgroup_uniform_bool(shgrp_array[i], name, &auto_layer_is_srgb[j], 1);
- }
- if (shgrp_depth_array[i]) {
- DRW_shgroup_uniform_bool(shgrp_depth_array[i], name, &auto_layer_is_srgb[j], 1);
- }
- if (shgrp_depth_clip_array[i]) {
- DRW_shgroup_uniform_bool(shgrp_depth_clip_array[i], name, &auto_layer_is_srgb[j], 1);
+ char *name = auto_layer_names;
+ for (int j = 0; j < auto_layer_count; ++j) {
+ /* TODO don't add these uniform when not needed (default pass shaders). */
+ if (shgrp_array[i]) {
+ DRW_shgroup_uniform_bool(shgrp_array[i], name, &auto_layer_is_srgb[j], 1);
+ }
+ if (shgrp_depth_array[i]) {
+ DRW_shgroup_uniform_bool(shgrp_depth_array[i], name, &auto_layer_is_srgb[j], 1);
+ }
+ if (shgrp_depth_clip_array[i]) {
+ DRW_shgroup_uniform_bool(shgrp_depth_clip_array[i], name, &auto_layer_is_srgb[j], 1);
+ }
+ /* Go to next layer name. */
+ while (*name != '\0') { name++; }
+ name += 1;
}
- /* Go to next layer name. */
- while (*name != '\0') { name++; }
- name += 1;
- }
- /* Shadow Pass */
- if (ma->use_nodes && ma->nodetree && (ma->blend_method != MA_BM_SOLID)) {
- struct GPUMaterial *gpumat;
- switch (ma->blend_shadow) {
- case MA_BS_SOLID:
- EEVEE_lights_cache_shcaster_add(
- sldata, stl, mat_geom[i], ob);
- *cast_shadow = true;
- break;
- case MA_BS_CLIP:
- gpumat = EEVEE_material_mesh_depth_get(scene, ma, false, true);
- EEVEE_lights_cache_shcaster_material_add(
- sldata, psl, gpumat, mat_geom[i], ob, &ma->alpha_threshold);
- *cast_shadow = true;
- break;
- case MA_BS_HASHED:
- gpumat = EEVEE_material_mesh_depth_get(scene, ma, true, true);
- EEVEE_lights_cache_shcaster_material_add(
- sldata, psl, gpumat, mat_geom[i], ob, NULL);
- *cast_shadow = true;
- break;
- case MA_BS_NONE:
- default:
- break;
+ /* Shadow Pass */
+ if (ma->use_nodes && ma->nodetree && (ma->blend_method != MA_BM_SOLID)) {
+ struct GPUMaterial *gpumat;
+ switch (ma->blend_shadow) {
+ case MA_BS_SOLID:
+ EEVEE_lights_cache_shcaster_add(
+ sldata, stl, mat_geom[i], ob);
+ *cast_shadow = true;
+ break;
+ case MA_BS_CLIP:
+ gpumat = EEVEE_material_mesh_depth_get(scene, ma, false, true);
+ EEVEE_lights_cache_shcaster_material_add(
+ sldata, psl, gpumat, mat_geom[i], ob, &ma->alpha_threshold);
+ *cast_shadow = true;
+ break;
+ case MA_BS_HASHED:
+ gpumat = EEVEE_material_mesh_depth_get(scene, ma, true, true);
+ EEVEE_lights_cache_shcaster_material_add(
+ sldata, psl, gpumat, mat_geom[i], ob, NULL);
+ *cast_shadow = true;
+ break;
+ case MA_BS_NONE:
+ default:
+ break;
+ }
+ }
+ else {
+ EEVEE_lights_cache_shcaster_add(sldata, stl, mat_geom[i], ob);
+ *cast_shadow = true;
}
- }
- else {
- EEVEE_lights_cache_shcaster_add(sldata, stl, mat_geom[i], ob);
- *cast_shadow = true;
}
}
}
@@ -1617,7 +1646,7 @@ void EEVEE_hair_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata,
if (!psys_check_enabled(ob, psys, false)) {
continue;
}
- if (!DRW_check_psys_visible_within_active_context(ob, psys)) {
+ if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) {
continue;
}
ParticleSettings *part = psys->part;
@@ -1774,6 +1803,7 @@ void EEVEE_materials_free(void)
DRW_SHADER_FREE_SAFE(e_data.update_noise_sh);
DRW_TEXTURE_FREE_SAFE(e_data.util_tex);
DRW_TEXTURE_FREE_SAFE(e_data.noise_tex);
+ DRW_UBO_FREE_SAFE(e_data.dummy_sss_profile);
}
void EEVEE_draw_default_passes(EEVEE_PassList *psl)
diff --git a/source/blender/draw/engines/eevee/eevee_motion_blur.c b/source/blender/draw/engines/eevee/eevee_motion_blur.c
index 08745850bd4..d2309d20abb 100644
--- a/source/blender/draw/engines/eevee/eevee_motion_blur.c
+++ b/source/blender/draw/engines/eevee/eevee_motion_blur.c
@@ -71,7 +71,7 @@ static void eevee_motion_blur_camera_get_matrix_at_time(
/* Past matrix */
/* FIXME : This is a temporal solution that does not take care of parent animations */
- /* Recalc Anim manualy */
+ /* Recalc Anim manually */
BKE_animsys_evaluate_animdata(draw_ctx->depsgraph, scene, &cam_cpy.id, cam_cpy.adt, time, ADT_RECALC_ALL);
BKE_animsys_evaluate_animdata(draw_ctx->depsgraph, scene, &camdata_cpy.id, camdata_cpy.adt, time, ADT_RECALC_ALL);
BKE_object_where_is_calc_time(draw_ctx->depsgraph, scene, &cam_cpy, time);
diff --git a/source/blender/draw/engines/eevee/eevee_occlusion.c b/source/blender/draw/engines/eevee/eevee_occlusion.c
index 8ede22cda5a..03aee102136 100644
--- a/source/blender/draw/engines/eevee/eevee_occlusion.c
+++ b/source/blender/draw/engines/eevee/eevee_occlusion.c
@@ -37,6 +37,9 @@
#include "eevee_private.h"
+#include "GPU_extensions.h"
+#include "GPU_state.h"
+
static struct {
/* Ground Truth Ambient Occlusion */
struct GPUShader *gtao_sh;
@@ -250,6 +253,13 @@ void EEVEE_occlusion_compute(
DRW_draw_pass(psl->ao_horizon_search);
}
+ if (GPU_mip_render_workaround()) {
+ /* Fix dot corruption on intel HD5XX/HD6XX series.
+ * It seems affected drivers are the same that needs
+ * GPU_mip_render_workaround. */
+ GPU_flush();
+ }
+
/* Restore */
GPU_framebuffer_bind(fbl->main_fb);
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index bd1323dab3b..a07f6f05f45 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -95,6 +95,23 @@ extern struct DrawEngineType draw_engine_eevee_type;
} \
} ((void)0)
+#define SWAP_BUFFERS_TAA() { \
+ if (effects->target_buffer == fbl->effect_color_fb) { \
+ SWAP(struct GPUFrameBuffer *, fbl->effect_fb, fbl->taa_history_fb); \
+ SWAP(struct GPUFrameBuffer *, fbl->effect_color_fb, fbl->taa_history_color_fb); \
+ SWAP(GPUTexture *, txl->color_post, txl->taa_history); \
+ effects->source_buffer = txl->taa_history; \
+ effects->target_buffer = fbl->effect_color_fb; \
+ } \
+ else { \
+ SWAP(struct GPUFrameBuffer *, fbl->main_fb, fbl->taa_history_fb); \
+ SWAP(struct GPUFrameBuffer *, fbl->main_color_fb, fbl->taa_history_color_fb); \
+ SWAP(GPUTexture *, txl->color, txl->taa_history); \
+ effects->source_buffer = txl->taa_history; \
+ effects->target_buffer = fbl->main_color_fb; \
+ } \
+} ((void)0)
+
#define OVERLAY_ENABLED(v3d) ((v3d) && (v3d->flag2 & V3D_RENDER_OVERRIDE) == 0)
#define LOOK_DEV_MODE_ENABLED(v3d) ((v3d) && (v3d->shading.type == OB_MATERIAL))
#define LOOK_DEV_OVERLAY_ENABLED(v3d) (LOOK_DEV_MODE_ENABLED(v3d) && OVERLAY_ENABLED(v3d) && (v3d->overlay.flag & V3D_OVERLAY_LOOK_DEV))
@@ -226,6 +243,7 @@ typedef struct EEVEE_PassList {
struct DRWPass *maxz_downdepth_layer_ps;
struct DRWPass *minz_copydepth_ps;
struct DRWPass *maxz_copydepth_ps;
+ struct DRWPass *maxz_copydepth_layer_ps;
struct DRWPass *depth_pass;
struct DRWPass *depth_pass_cull;
@@ -254,6 +272,7 @@ typedef struct EEVEE_FramebufferList {
struct GPUFrameBuffer *bloom_down_fb[MAX_BLOOM_STEP];
struct GPUFrameBuffer *bloom_accum_fb[MAX_BLOOM_STEP - 1];
struct GPUFrameBuffer *sss_blur_fb;
+ struct GPUFrameBuffer *sss_blit_fb;
struct GPUFrameBuffer *sss_resolve_fb;
struct GPUFrameBuffer *sss_clear_fb;
struct GPUFrameBuffer *sss_accum_fb;
@@ -280,6 +299,8 @@ typedef struct EEVEE_FramebufferList {
struct GPUFrameBuffer *double_buffer_fb;
struct GPUFrameBuffer *double_buffer_color_fb;
struct GPUFrameBuffer *double_buffer_depth_fb;
+ struct GPUFrameBuffer *taa_history_fb;
+ struct GPUFrameBuffer *taa_history_color_fb;
} EEVEE_FramebufferList;
typedef struct EEVEE_TextureList {
@@ -290,6 +311,7 @@ typedef struct EEVEE_TextureList {
struct GPUTexture *sss_dir_accum;
struct GPUTexture *sss_col_accum;
struct GPUTexture *refract_color;
+ struct GPUTexture *taa_history;
struct GPUTexture *volume_prop_scattering;
struct GPUTexture *volume_prop_extinction;
@@ -362,6 +384,7 @@ typedef struct EEVEE_ShadowRender {
float clip_far;
int shadow_samples_len;
float shadow_samples_len_inv;
+ float exponent;
} EEVEE_ShadowRender;
/* This is just a really long bitflag with special function to access it. */
@@ -391,7 +414,7 @@ typedef struct EEVEE_LampsInfo {
int cpu_cube_len, cpu_cascade_len;
int update_flag;
int shadow_cube_size, shadow_cascade_size, shadow_method;
- bool shadow_high_bitdepth;
+ bool shadow_high_bitdepth, soft_shadows;
int shadow_cube_store_size;
int current_shadow_cascade;
int current_shadow_face;
@@ -410,7 +433,7 @@ typedef struct EEVEE_LampsInfo {
struct EEVEE_ShadowCascade shadow_cascade_data[MAX_SHADOW_CASCADE];
/* Lights tracking */
int new_shadow_id[MAX_LIGHT]; /* To be able to convert old bitfield to new bitfield */
- struct EEVEE_BoundSphere shadow_bounds[MAX_LIGHT]; /* Tighly packed light bounds */
+ struct EEVEE_BoundSphere shadow_bounds[MAX_LIGHT]; /* Tightly packed light bounds */
/* Pointers only. */
struct EEVEE_ShadowCasterBuffer *shcaster_frontbuffer;
struct EEVEE_ShadowCasterBuffer *shcaster_backbuffer;
@@ -557,6 +580,7 @@ typedef struct EEVEE_EffectsInfo {
struct GPUTexture *dof_down_far;
struct GPUTexture *dof_coc;
struct GPUTexture *dof_blur;
+ struct GPUTexture *dof_blur_alpha;
/* Other */
float prev_persmat[4][4];
/* Bloom */
@@ -631,8 +655,18 @@ typedef struct EEVEE_CommonUniformBuffer {
int prb_irradiance_vis_size; /* int */
float prb_lod_cube_max; /* float */
float prb_lod_planar_max; /* float */
+ /* Misc */
+ int hiz_mip_offset; /* int */
+ int ray_type; /* int */
+ float ray_depth; /* float */
} EEVEE_CommonUniformBuffer;
+/* ray_type (keep in sync with rayType) */
+#define EEVEE_RAY_CAMERA 0
+#define EEVEE_RAY_SHADOW 1
+#define EEVEE_RAY_DIFFUSE 2
+#define EEVEE_RAY_GLOSSY 3
+
/* ***************** CLIP PLANES DATA **************** */
typedef struct EEVEE_ClipPlanesUniformBuffer {
@@ -766,11 +800,14 @@ typedef struct EEVEE_PrivateData {
/* For double buffering */
bool view_updated;
bool valid_double_buffer;
+ bool valid_taa_history;
/* Render Matrices */
float persmat[4][4], persinv[4][4];
float viewmat[4][4], viewinv[4][4];
float winmat[4][4], wininv[4][4];
float studiolight_matrix[3][3];
+ float overscan, overscan_pixels;
+ float size_orig[2];
/* Mist Settings */
float mist_start, mist_inv_dist, mist_falloff;
@@ -826,9 +863,9 @@ void EEVEE_lights_cache_shcaster_material_add(
struct GPUMaterial *gpumat, struct GPUBatch *geom, struct Object *ob,
float *alpha_threshold);
void EEVEE_lights_cache_shcaster_object_add(EEVEE_ViewLayerData *sldata, struct Object *ob);
-void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata);
-void EEVEE_lights_update(EEVEE_ViewLayerData *sldata);
-void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl);
+void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
+void EEVEE_lights_update(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
+void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
void EEVEE_lights_free(void);
@@ -909,7 +946,7 @@ void EEVEE_motion_blur_free(void);
/* eevee_mist.c */
void EEVEE_mist_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
-void EEVEE_mist_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);;
+void EEVEE_mist_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
void EEVEE_mist_free(void);
/* eevee_temporal_sampling.c */
@@ -932,7 +969,7 @@ void EEVEE_volumes_free_smoke_textures(void);
void EEVEE_volumes_free(void);
/* eevee_effects.c */
-void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera);
+void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera, const bool minimal);
void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
void EEVEE_create_minmax_buffer(EEVEE_Data *vedata, struct GPUTexture *depth_src, int layer);
void EEVEE_downsample_buffer(EEVEE_Data *vedata, struct GPUTexture *texture_src, int level);
diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c
index 80d8c066a44..8d196ee07eb 100644
--- a/source/blender/draw/engines/eevee/eevee_render.c
+++ b/source/blender/draw/engines/eevee/eevee_render.c
@@ -33,6 +33,8 @@
#include "DNA_node_types.h"
#include "DNA_object_types.h"
+#include "BKE_camera.h"
+
#include "BLI_rand.h"
#include "BLI_rect.h"
@@ -40,6 +42,7 @@
#include "GPU_framebuffer.h"
#include "GPU_glew.h"
+#include "GPU_state.h"
#include "RE_pipeline.h"
@@ -53,6 +56,7 @@ void EEVEE_render_init(EEVEE_Data *ved, RenderEngine *engine, struct Depsgraph *
EEVEE_FramebufferList *fbl = vedata->fbl;
EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
Scene *scene = DEG_get_evaluated_scene(depsgraph);
+ const float *size_orig = DRW_viewport_size_get();
/* Init default FB and render targets:
* In render mode the default framebuffer is not generated
@@ -61,6 +65,28 @@ void EEVEE_render_init(EEVEE_Data *ved, RenderEngine *engine, struct Depsgraph *
DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+ /* Alloc transient data. */
+ if (!stl->g_data) {
+ stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__);
+ }
+ EEVEE_PrivateData *g_data = stl->g_data;
+ g_data->background_alpha = DRW_state_draw_background() ? 1.0f : 0.0f;
+ g_data->valid_double_buffer = 0;
+ copy_v2_v2(g_data->size_orig, size_orig);
+
+ if (scene->eevee.flag & SCE_EEVEE_OVERSCAN) {
+ g_data->overscan = scene->eevee.overscan / 100.0f;
+ g_data->overscan_pixels = roundf(max_ff(size_orig[0], size_orig[1]) * g_data->overscan);
+ }
+ else {
+ g_data->overscan = 0.0f;
+ g_data->overscan_pixels = 0.0f;
+ }
+
+ /* XXX overiding viewport size. Simplify things but is not really 100% safe. */
+ DRW_render_viewport_size_set((int[2]){size_orig[0] + g_data->overscan_pixels * 2.0f,
+ size_orig[1] + g_data->overscan_pixels * 2.0f});
+
/* TODO 32 bit depth */
DRW_texture_ensure_fullscreen_2D(&dtxl->depth, GPU_DEPTH24_STENCIL8, 0);
DRW_texture_ensure_fullscreen_2D(&txl->color, GPU_RGBA32F, DRW_TEX_FILTER | DRW_TEX_MIPMAP);
@@ -78,14 +104,6 @@ void EEVEE_render_init(EEVEE_Data *ved, RenderEngine *engine, struct Depsgraph *
GPU_ATTACHMENT_TEXTURE(txl->color)
});
- /* Alloc transient data. */
- if (!stl->g_data) {
- stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__);
- }
- EEVEE_PrivateData *g_data = stl->g_data;
- g_data->background_alpha = DRW_state_draw_background() ? 1.0f : 0.0f;
- g_data->valid_double_buffer = 0;
-
/* Alloc common ubo data. */
if (sldata->common_ubo == NULL) {
sldata->common_ubo = DRW_uniformbuffer_create(sizeof(sldata->common_data), &sldata->common_data);
@@ -101,6 +119,8 @@ void EEVEE_render_init(EEVEE_Data *ved, RenderEngine *engine, struct Depsgraph *
RE_GetCameraWindow(engine->re, ob_camera_eval, frame, g_data->winmat);
RE_GetCameraModelMatrix(engine->re, ob_camera_eval, g_data->viewinv);
+ RE_GetCameraWindowWithOverscan(engine->re, g_data->winmat, g_data->overscan);
+
invert_m4_m4(g_data->viewmat, g_data->viewinv);
mul_m4_m4m4(g_data->persmat, g_data->winmat, g_data->viewmat);
invert_m4_m4(g_data->persinv, g_data->persmat);
@@ -114,7 +134,7 @@ void EEVEE_render_init(EEVEE_Data *ved, RenderEngine *engine, struct Depsgraph *
DRW_viewport_matrix_override_set(g_data->viewinv, DRW_MAT_VIEWINV);
/* EEVEE_effects_init needs to go first for TAA */
- EEVEE_effects_init(sldata, vedata, ob_camera_eval);
+ EEVEE_effects_init(sldata, vedata, ob_camera_eval, false);
EEVEE_materials_init(sldata, stl, fbl);
EEVEE_lights_init(sldata);
EEVEE_lightprobes_init(sldata, vedata);
@@ -163,7 +183,7 @@ void EEVEE_render_cache(
EEVEE_hair_cache_populate(vedata, sldata, ob, &cast_shadow);
}
- if (DRW_check_object_visible_within_active_context(ob)) {
+ if (DRW_object_is_visible_in_active_context(ob)) {
if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) {
EEVEE_materials_cache_populate(vedata, sldata, ob, &cast_shadow);
}
@@ -188,9 +208,16 @@ static void eevee_render_result_combined(
GPU_framebuffer_bind(vedata->stl->effects->final_fb);
GPU_framebuffer_read_color(vedata->stl->effects->final_fb,
- rect->xmin, rect->ymin,
+ vedata->stl->g_data->overscan_pixels + rect->xmin,
+ vedata->stl->g_data->overscan_pixels + rect->ymin,
BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
4, 0, rp->rect);
+
+ /* Premult alpha */
+ int pixels_len = BLI_rcti_size_x(rect) * BLI_rcti_size_y(rect);
+ for (int i = 0; i < pixels_len * 4; i += 4) {
+ mul_v3_fl(rp->rect + i, rp->rect[i + 3]);
+ }
}
static void eevee_render_result_subsurface(
@@ -210,7 +237,8 @@ static void eevee_render_result_subsurface(
GPU_framebuffer_bind(vedata->fbl->sss_accum_fb);
GPU_framebuffer_read_color(vedata->fbl->sss_accum_fb,
- rect->xmin, rect->ymin,
+ vedata->stl->g_data->overscan_pixels + rect->xmin,
+ vedata->stl->g_data->overscan_pixels + rect->ymin,
BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
3, 1, rp->rect);
@@ -225,7 +253,8 @@ static void eevee_render_result_subsurface(
GPU_framebuffer_bind(vedata->fbl->sss_accum_fb);
GPU_framebuffer_read_color(vedata->fbl->sss_accum_fb,
- rect->xmin, rect->ymin,
+ vedata->stl->g_data->overscan_pixels + rect->xmin,
+ vedata->stl->g_data->overscan_pixels + rect->ymin,
BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
3, 0, rp->rect);
@@ -259,7 +288,8 @@ static void eevee_render_result_normal(
GPU_framebuffer_bind(vedata->fbl->main_fb);
GPU_framebuffer_read_color(vedata->fbl->main_fb,
- rect->xmin, rect->ymin,
+ g_data->overscan_pixels + rect->xmin,
+ g_data->overscan_pixels + rect->ymin,
BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
3, 1, rp->rect);
@@ -305,7 +335,8 @@ static void eevee_render_result_z(
GPU_framebuffer_bind(vedata->fbl->main_fb);
GPU_framebuffer_read_depth(vedata->fbl->main_fb,
- rect->xmin, rect->ymin,
+ g_data->overscan_pixels + rect->xmin,
+ g_data->overscan_pixels + rect->ymin,
BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
rp->rect);
@@ -341,7 +372,8 @@ static void eevee_render_result_mist(
GPU_framebuffer_bind(vedata->fbl->mist_accum_fb);
GPU_framebuffer_read_color(vedata->fbl->mist_accum_fb,
- rect->xmin, rect->ymin,
+ vedata->stl->g_data->overscan_pixels + rect->xmin,
+ vedata->stl->g_data->overscan_pixels + rect->ymin,
BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
1, 0, rp->rect);
@@ -369,7 +401,8 @@ static void eevee_render_result_occlusion(
GPU_framebuffer_bind(vedata->fbl->ao_accum_fb);
GPU_framebuffer_read_color(vedata->fbl->ao_accum_fb,
- rect->xmin, rect->ymin,
+ vedata->stl->g_data->overscan_pixels + rect->xmin,
+ vedata->stl->g_data->overscan_pixels + rect->ymin,
BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
3, 0, rp->rect);
@@ -427,7 +460,7 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl
/* FINISH CACHE */
EEVEE_materials_cache_finish(vedata);
- EEVEE_lights_cache_finish(sldata);
+ EEVEE_lights_cache_finish(sldata, vedata);
EEVEE_lightprobes_cache_finish(sldata, vedata);
/* Sort transparents before the loop. */
@@ -494,14 +527,19 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl
RE_engine_update_stats(engine, NULL, "Updating Probes");
EEVEE_lightprobes_refresh(sldata, vedata);
EEVEE_lightprobes_refresh_planar(sldata, vedata);
- DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
char info[42];
BLI_snprintf(info, sizeof(info), "Rendering %u / %u samples", render_samples + 1, tot_sample);
RE_engine_update_stats(engine, NULL, info);
/* Refresh Shadows */
- EEVEE_draw_shadows(sldata, psl);
+ EEVEE_lights_update(sldata, vedata);
+ EEVEE_draw_shadows(sldata, vedata);
+
+ /* Set ray type. */
+ sldata->common_data.ray_type = EEVEE_RAY_CAMERA;
+ sldata->common_data.ray_depth = 0.0f;
+ DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
GPU_framebuffer_bind(fbl->main_fb);
GPU_framebuffer_clear_color_depth_stencil(fbl->main_fb, clear_col, clear_depth, clear_stencil);
@@ -543,6 +581,9 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl
/* Post Process */
EEVEE_draw_effects(sldata, vedata);
+ /* XXX Seems to fix TDR issue with NVidia drivers on linux. */
+ GPU_finish();
+
RE_engine_update_progress(engine, (float)(render_samples++) / (float)tot_sample);
}
@@ -550,6 +591,9 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl
eevee_render_result_subsurface(rl, viewname, rect, vedata, sldata, render_samples);
eevee_render_result_mist(rl, viewname, rect, vedata, sldata, render_samples);
eevee_render_result_occlusion(rl, viewname, rect, vedata, sldata, render_samples);
+
+ /* Restore original viewport size. */
+ DRW_render_viewport_size_set((int[2]){g_data->size_orig[0], g_data->size_orig[1]});
}
void EEVEE_render_update_passes(RenderEngine *engine, Scene *scene, ViewLayer *view_layer)
diff --git a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
index 46229c2dc9b..13bedc34e05 100644
--- a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
+++ b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
@@ -210,12 +210,12 @@ void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *v
*
* Following Frostbite stochastic SSR.
*
- * - First pass Trace rays accross the depth buffer. The hit position and pdf are
+ * - First pass Trace rays across the depth buffer. The hit position and pdf are
* recorded in a RGBA16F render target for each ray (sample).
*
* - We downsample the previous frame color buffer.
*
- * - For each final pixel, we gather neighboors rays and choose a color buffer
+ * - For each final pixel, we gather neighbors rays and choose a color buffer
* mipmap for each ray using its pdf. (filtered importance sampling)
* We then evaluate the lighting from the probes and mix the results together.
*/
diff --git a/source/blender/draw/engines/eevee/eevee_subsurface.c b/source/blender/draw/engines/eevee/eevee_subsurface.c
index 9667f2ac9d7..9ecc1fb1b2b 100644
--- a/source/blender/draw/engines/eevee/eevee_subsurface.c
+++ b/source/blender/draw/engines/eevee/eevee_subsurface.c
@@ -33,6 +33,7 @@
#include "eevee_private.h"
#include "GPU_texture.h"
+#include "GPU_extensions.h"
static struct {
struct GPUShader *sss_sh[4];
@@ -67,6 +68,7 @@ int EEVEE_subsurface_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
EEVEE_EffectsInfo *effects = stl->effects;
EEVEE_FramebufferList *fbl = vedata->fbl;
EEVEE_TextureList *txl = vedata->txl;
+ DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
const float *viewport_size = DRW_viewport_size_get();
const int fs_size[2] = {(int)viewport_size[0], (int)viewport_size[1]};
@@ -99,13 +101,27 @@ int EEVEE_subsurface_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
effects->sss_data = DRW_texture_pool_query_2D(fs_size[0], fs_size[1], GPU_RGBA16F,
&draw_engine_eevee_type);
+ GPUTexture *stencil_tex = effects->sss_stencil;
+
+ if (GPU_depth_blitting_workaround()) {
+ /* Blitting stencil buffer does not work on macOS + Radeon Pro.
+ * Blit depth instead and use sss_stencil's depth as depth texture,
+ * and dtxl->depth as stencil mask. */
+ GPU_framebuffer_ensure_config(&fbl->sss_blit_fb, {
+ GPU_ATTACHMENT_TEXTURE(effects->sss_stencil),
+ GPU_ATTACHMENT_NONE
+ });
+
+ stencil_tex = dtxl->depth;
+ }
+
GPU_framebuffer_ensure_config(&fbl->sss_blur_fb, {
- GPU_ATTACHMENT_TEXTURE(effects->sss_stencil),
+ GPU_ATTACHMENT_TEXTURE(stencil_tex),
GPU_ATTACHMENT_TEXTURE(effects->sss_blur)
});
GPU_framebuffer_ensure_config(&fbl->sss_resolve_fb, {
- GPU_ATTACHMENT_TEXTURE(effects->sss_stencil),
+ GPU_ATTACHMENT_TEXTURE(stencil_tex),
GPU_ATTACHMENT_TEXTURE(txl->color)
});
@@ -147,6 +163,7 @@ void EEVEE_subsurface_output_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Dat
EEVEE_StorageList *stl = vedata->stl;
EEVEE_EffectsInfo *effects = stl->effects;
+ DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
const DRWContextState *draw_ctx = DRW_context_state_get();
const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph);
@@ -154,8 +171,17 @@ void EEVEE_subsurface_output_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Dat
DRW_texture_ensure_fullscreen_2D(&txl->sss_dir_accum, GPU_RGBA16F, 0);
DRW_texture_ensure_fullscreen_2D(&txl->sss_col_accum, GPU_RGBA16F, 0);
+ GPUTexture *stencil_tex = effects->sss_stencil;
+
+ if (GPU_depth_blitting_workaround()) {
+ /* Blitting stencil buffer does not work on macOS + Radeon Pro.
+ * Blit depth instead and use sss_stencil's depth as depth texture,
+ * and dtxl->depth as stencil mask. */
+ stencil_tex = dtxl->depth;
+ }
+
GPU_framebuffer_ensure_config(&fbl->sss_accum_fb, {
- GPU_ATTACHMENT_TEXTURE(effects->sss_stencil),
+ GPU_ATTACHMENT_TEXTURE(stencil_tex),
GPU_ATTACHMENT_TEXTURE(txl->sss_dir_accum),
GPU_ATTACHMENT_TEXTURE(txl->sss_col_accum)
});
@@ -205,10 +231,11 @@ void EEVEE_subsurface_add_pass(
EEVEE_StorageList *stl = vedata->stl;
EEVEE_EffectsInfo *effects = stl->effects;
struct GPUBatch *quad = DRW_cache_fullscreen_quad_get();
+ GPUTexture **depth_src = GPU_depth_blitting_workaround() ? &effects->sss_stencil : &dtxl->depth;
DRWShadingGroup *grp = DRW_shgroup_create(e_data.sss_sh[0], psl->sss_blur_ps);
DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
- DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
+ DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", depth_src);
DRW_shgroup_uniform_texture_ref(grp, "sssData", &effects->sss_data);
DRW_shgroup_uniform_block(grp, "sssProfile", sss_profile);
DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
@@ -218,7 +245,7 @@ void EEVEE_subsurface_add_pass(
struct GPUShader *sh = (effects->sss_separate_albedo) ? e_data.sss_sh[2] : e_data.sss_sh[1];
grp = DRW_shgroup_create(sh, psl->sss_resolve_ps);
DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
- DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
+ DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", depth_src);
DRW_shgroup_uniform_texture_ref(grp, "sssData", &effects->sss_blur);
DRW_shgroup_uniform_block(grp, "sssProfile", sss_profile);
DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
@@ -232,7 +259,7 @@ void EEVEE_subsurface_add_pass(
if (DRW_state_is_image_render()) {
grp = DRW_shgroup_create(e_data.sss_sh[3], psl->sss_accum_ps);
DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
- DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
+ DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", depth_src);
DRW_shgroup_uniform_texture_ref(grp, "sssData", &effects->sss_blur);
DRW_shgroup_uniform_texture_ref(grp, "sssAlbedo", &effects->sss_albedo);
DRW_shgroup_uniform_block(grp, "sssProfile", sss_profile);
@@ -292,8 +319,14 @@ void EEVEE_subsurface_compute(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v
DRW_stats_group_start("SSS");
- /* Copy stencil channel, could be avoided (see EEVEE_subsurface_init) */
- GPU_framebuffer_blit(fbl->main_fb, 0, fbl->sss_blur_fb, 0, GPU_STENCIL_BIT);
+ if (GPU_depth_blitting_workaround()) {
+ /* Copy depth channel */
+ GPU_framebuffer_blit(fbl->main_fb, 0, fbl->sss_blit_fb, 0, GPU_DEPTH_BIT);
+ }
+ else {
+ /* Copy stencil channel, could be avoided (see EEVEE_subsurface_init) */
+ GPU_framebuffer_blit(fbl->main_fb, 0, fbl->sss_blur_fb, 0, GPU_STENCIL_BIT);
+ }
/* 1. horizontal pass */
GPU_framebuffer_bind(fbl->sss_blur_fb);
diff --git a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c
index 6cb2d1d3b53..6216b28329b 100644
--- a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c
+++ b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c
@@ -297,8 +297,8 @@ void EEVEE_temporal_sampling_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data
psl->taa_resolve = DRW_pass_create("Temporal AA Resolve", DRW_STATE_WRITE_COLOR);
DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->taa_resolve);
- DRW_shgroup_uniform_texture_ref(grp, "colorHistoryBuffer", &txl->color_double_buffer);
- DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &txl->color);
+ DRW_shgroup_uniform_texture_ref(grp, "colorHistoryBuffer", &txl->taa_history);
+ DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &effects->source_buffer);
DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
if (effects->enabled_effects & EFFECT_TAA_REPROJECT) {
@@ -312,16 +312,6 @@ void EEVEE_temporal_sampling_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data
}
}
-/* Special Swap */
-#define SWAP_BUFFER_TAA() do { \
- SWAP(struct GPUFrameBuffer *, fbl->effect_fb, fbl->double_buffer_fb); \
- SWAP(struct GPUFrameBuffer *, fbl->effect_color_fb, fbl->double_buffer_color_fb); \
- SWAP(GPUTexture *, txl->color_post, txl->color_double_buffer); \
- effects->swap_double_buffer = false; \
- effects->source_buffer = txl->color_double_buffer; \
- effects->target_buffer = fbl->main_color_fb; \
-} while (0);
-
void EEVEE_temporal_sampling_draw(EEVEE_Data *vedata)
{
EEVEE_PassList *psl = vedata->psl;
@@ -340,7 +330,7 @@ void EEVEE_temporal_sampling_draw(EEVEE_Data *vedata)
effects->taa_alpha = 1.0f / (float)(effects->taa_current_sample);
}
- GPU_framebuffer_bind(fbl->effect_color_fb);
+ GPU_framebuffer_bind(effects->target_buffer);
DRW_draw_pass(psl->taa_resolve);
/* Restore the depth from sample 1. */
@@ -348,26 +338,30 @@ void EEVEE_temporal_sampling_draw(EEVEE_Data *vedata)
GPU_framebuffer_blit(fbl->double_buffer_depth_fb, 0, fbl->main_fb, 0, GPU_DEPTH_BIT);
}
- SWAP_BUFFER_TAA();
+ SWAP_BUFFERS_TAA();
}
else {
if (!DRW_state_is_image_render()) {
- /* Do reprojection for noise reduction */
- /* TODO : do AA jitter if in only render view. */
- if ((effects->enabled_effects & EFFECT_TAA_REPROJECT) != 0 &&
- stl->g_data->valid_double_buffer)
- {
- GPU_framebuffer_bind(fbl->effect_color_fb);
- DRW_draw_pass(psl->taa_resolve);
-
- SWAP_BUFFER_TAA();
- }
-
/* Save the depth buffer for the next frame.
* This saves us from doing anything special
* in the other mode engines. */
GPU_framebuffer_blit(fbl->main_fb, 0, fbl->double_buffer_depth_fb, 0, GPU_DEPTH_BIT);
}
+
+ /* Do reprojection for noise reduction */
+ /* TODO : do AA jitter if in only render view. */
+ if (!DRW_state_is_image_render() &&
+ (effects->enabled_effects & EFFECT_TAA_REPROJECT) != 0 &&
+ stl->g_data->valid_taa_history)
+ {
+ GPU_framebuffer_bind(effects->target_buffer);
+ DRW_draw_pass(psl->taa_resolve);
+ SWAP_BUFFERS_TAA();
+ }
+ else {
+ struct GPUFrameBuffer *source_fb = (effects->target_buffer == fbl->main_color_fb) ? fbl->effect_color_fb : fbl->main_color_fb;
+ GPU_framebuffer_blit(source_fb, 0, fbl->taa_history_color_fb, 0, GPU_COLOR_BIT);
+ }
}
/* Make each loop count when doing a render. */
diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c
index b729c53628f..4fffa3f285c 100644
--- a/source/blender/draw/engines/eevee/eevee_volumes.c
+++ b/source/blender/draw/engines/eevee/eevee_volumes.c
@@ -46,6 +46,7 @@
#include "eevee_private.h"
#include "GPU_draw.h"
#include "GPU_texture.h"
+#include "GPU_material.h"
static struct {
char *volumetric_common_lib;
@@ -370,16 +371,16 @@ void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
*
* - Light Scattering : the volume properties then are sampled
* and light scattering is evaluated for each cell of the
- * volume texture. Temporal supersampling (if enabled) occurs here.
+ * volume texture. Temporal super-sampling (if enabled) occurs here.
*
* - Volume Integration : the scattered light and extinction is
- * integrated (accumulated) along the viewrays. The result is stored
+ * integrated (accumulated) along the view-rays. The result is stored
* for every cell in another texture.
*
- * - Fullscreen Resolve : From the previous stage, we get two
- * 3D textures that contains integrated scatered light and extinction
+ * - Full-screen Resolve : From the previous stage, we get two
+ * 3D textures that contains integrated scattered light and extinction
* for "every" positions in the frustum. We only need to sample
- * them and blend the scene color with thoses factors. This also
+ * them and blend the scene color with those factors. This also
* work for alpha blended materials.
**/
@@ -397,7 +398,7 @@ void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
if (grp) {
DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
- /* TODO (fclem): remove thoses (need to clean the GLSL files). */
+ /* TODO (fclem): remove those (need to clean the GLSL files). */
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);
@@ -471,19 +472,19 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata, EEVEE_Data *ved
struct GPUMaterial *mat = EEVEE_material_mesh_volume_get(scene, ma);
- DRWShadingGroup *grp = DRW_shgroup_material_empty_tri_batch_create(mat, vedata->psl->volumetric_objects_ps, sldata->common_data.vol_tex_size[2]);
-
/* If shader failed to compile or is currently compiling. */
- if (grp == NULL) {
+ if (GPU_material_status(mat) != GPU_MAT_SUCCESS) {
return;
}
+ DRWShadingGroup *grp = DRW_shgroup_material_empty_tri_batch_create(mat, vedata->psl->volumetric_objects_ps, sldata->common_data.vol_tex_size[2]);
+
/* Making sure it's updated. */
invert_m4_m4(ob->imat, ob->obmat);
BKE_mesh_texspace_get_reference((struct Mesh *)ob->data, NULL, &texcoloc, NULL, &texcosize);
- /* TODO(fclem) remove thoses "unecessary" UBOs */
+ /* TODO(fclem) remove those "unnecessary" UBOs */
DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo);
DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo);
DRW_shgroup_uniform_block(grp, "shadow_block", sldata->shadow_ubo);
@@ -502,6 +503,11 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata, EEVEE_Data *ved
{
SmokeModifierData *smd = (SmokeModifierData *)md;
SmokeDomainSettings *sds = smd->domain;
+
+ if (sds == NULL) {
+ return;
+ }
+
/* Don't show smoke before simulation starts, this could be made an option in the future. */
const bool show_smoke = ((int)DEG_get_ctime(draw_ctx->depsgraph) >= sds->point_cache[0]->startframe);
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 fae310be90b..bda3c648bb6 100644
--- a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
@@ -60,8 +60,9 @@ vec2 get_ao_dir(float jitter)
void get_max_horizon_grouped(vec4 co1, vec4 co2, vec3 x, float lod, inout float h)
{
- co1 *= mipRatio[int(lod + 1.0)].xyxy; /* +1 because we are using half res top level */
- co2 *= mipRatio[int(lod + 1.0)].xyxy; /* +1 because we are using half res top level */
+ 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;
diff --git a/source/blender/draw/engines/eevee/shaders/background_vert.glsl b/source/blender/draw/engines/eevee/shaders/background_vert.glsl
index b81aae9bcda..c849a577316 100644
--- a/source/blender/draw/engines/eevee/shaders/background_vert.glsl
+++ b/source/blender/draw/engines/eevee/shaders/background_vert.glsl
@@ -17,4 +17,14 @@ void main()
gl_Position = vec4(pos, 1.0, 1.0);
varposition = viewPosition = vec3(pos, -1.0);
varnormal = normalize(-varposition);
+
+#ifndef VOLUMETRICS
+ /* Not used in practice but needed to avoid compilation errors. */
+ worldPosition = viewPosition;
+ worldNormal = viewNormal = varnormal;
+#endif
+
+#ifdef ATTRIB
+ pass_attrib(viewPosition);
+#endif
}
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 286f00783d9..eb03df67f6b 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
@@ -598,7 +598,7 @@ float G1_Smith_GGX(float NX, float a2)
/* Using Brian Karis approach and refactoring by NX/NX
* this way the (2*NL)*(2*NV) in G = G1(V) * G1(L) gets canceled by the brdf denominator 4*NL*NV
* Rcp is done on the whole G later
- * Note that this is not convenient for the transmition formula */
+ * Note that this is not convenient for the transmission formula */
return NX + sqrt(NX * (NX - NX * a2) + a2);
/* return 2 / (1 + sqrt(1 + a2 * (1 - NX*NX) / (NX*NX) ) ); /* Reference function */
}
@@ -626,7 +626,7 @@ void accumulate_light(vec3 light, float fac, inout vec4 accum)
accum += vec4(light, 1.0) * min(fac, (1.0 - accum.a));
}
-/* ----------- Cone Apperture Approximation --------- */
+/* ----------- Cone Aperture Approximation --------- */
/* Return a fitted cone angle given the input roughness */
float cone_cosine(float r)
@@ -719,7 +719,6 @@ Closure closure_mix(Closure cl1, Closure cl2, float fac)
Closure cl;
if (cl1.ssr_id == TRANSPARENT_CLOSURE_FLAG) {
- cl1.radiance = cl2.radiance;
cl1.ssr_normal = cl2.ssr_normal;
cl1.ssr_data = cl2.ssr_data;
cl1.ssr_id = cl2.ssr_id;
@@ -731,7 +730,6 @@ Closure closure_mix(Closure cl1, Closure cl2, float fac)
# endif
}
if (cl2.ssr_id == TRANSPARENT_CLOSURE_FLAG) {
- cl2.radiance = cl1.radiance;
cl2.ssr_normal = cl1.ssr_normal;
cl2.ssr_data = cl1.ssr_data;
cl2.ssr_id = cl1.ssr_id;
@@ -752,8 +750,9 @@ Closure closure_mix(Closure cl1, Closure cl2, float fac)
cl.ssr_normal = cl2.ssr_normal;
cl.ssr_id = cl2.ssr_id;
}
- cl.radiance = mix(cl1.radiance, cl2.radiance, fac);
cl.opacity = mix(cl1.opacity, cl2.opacity, fac);
+ cl.radiance = mix(cl1.radiance * cl1.opacity, cl2.radiance * cl2.opacity, fac);
+ cl.radiance /= max(1e-8, cl.opacity);
# ifdef USE_SSS
cl.sss_data.rgb = mix(cl1.sss_data.rgb, cl2.sss_data.rgb, fac);
diff --git a/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl b/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl
index d6abb7dc175..d26013ce132 100644
--- a/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl
@@ -36,8 +36,18 @@ layout(std140) uniform common_block {
int prbIrradianceVisSize;
float prbLodCubeMax;
float prbLodPlanarMax;
+ /* Misc*/
+ int hizMipOffset;
+ int rayType;
+ float rayDepth;
};
+/* rayType (keep in sync with ray_type) */
+#define EEVEE_RAY_CAMERA 0
+#define EEVEE_RAY_SHADOW 1
+#define EEVEE_RAY_DIFFUSE 2
+#define EEVEE_RAY_GLOSSY 3
+
/* aoParameters */
#define aoDistance aoParameters[0].x
#define aoSamples aoParameters[0].y /* UNUSED */
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl
index 34d92fab2c2..27517ebd86e 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl
@@ -31,11 +31,11 @@ uniform vec2 nearFar; /* Near & far view depths values */
? (nearFar.x * nearFar.y) / (z * (nearFar.x - nearFar.y) + nearFar.y) \
: (z * 2.0 - 1.0) * nearFar.y)
-#define weighted_sum(a, b, c, d, e) (a * e.x + b * e.y + c * e.z + d * e.w)
+#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)));
float max_v4(vec4 v) { return max(max(v.x, v.y), max(v.z, v.w)); }
-#define THRESHOLD 0.0
+#define THRESHOLD 1.0
#ifdef STEP_DOWNSAMPLE
@@ -69,33 +69,40 @@ void main(void)
vec4 coc_near = calculate_coc(zdepth);
vec4 coc_far = -coc_near;
- /* now we need to write the near-far fields premultiplied by the coc */
- vec4 near_weights = step(THRESHOLD, coc_near);
- vec4 far_weights = step(THRESHOLD, coc_far);
+ 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);
-
- /* Normalize the color (don't divide by 0.0) */
- nearColor /= max(1e-6, dot(near_weights, near_weights));
- farColor /= max(1e-6, dot(far_weights, far_weights));
-
- float max_near_coc = max(max_v4(coc_near), 0.0);
- float max_far_coc = max(max_v4(coc_far), 0.0);
-
- cocData = vec2(max_near_coc, max_far_coc);
}
#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;
-out vec4 fragColor;
+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)
@@ -135,9 +142,14 @@ void main(void)
/* Smooth the edges a bit. This effectively reduce the bokeh shape
* but does fade out the undersampling artifacts. */
- if (smoothFac < 1.0) {
- fragColor *= smoothstep(1.0, smoothFac, dist);
- }
+ 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)
@@ -145,6 +157,7 @@ void main(void)
#define MERGE_THRESHOLD 4.0
uniform sampler2D scatterBuffer;
+uniform sampler2D scatterAlphaBuffer;
in vec4 uvcoordsvar;
out vec4 fragColor;
@@ -197,26 +210,32 @@ void main(void)
float coc_far = max(-coc_signed, 0.0);
float coc_near = max(coc_signed, 0.0);
- vec2 texelSize = vec2(0.5, 1.0) / vec2(textureSize(scatterBuffer, 0));
- vec4 srccolor = textureLod(colorBuffer, uv, 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 farcolor = upsample_filter(scatterBuffer, far_uv, texelSize);
- vec4 nearcolor = upsample_filter(scatterBuffer, near_uv, texelSize);
+ 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);
- float farweight = farcolor.a;
- float nearweight = nearcolor.a;
+ focus_col *= focus_w; /* Premul */
- if (farcolor.a > 0.0) farcolor /= farcolor.a;
- if (nearcolor.a > 0.0) nearcolor /= nearcolor.a;
+# 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
- float mixfac = smoothstep(1.0, MERGE_THRESHOLD, abs(coc_signed));
+ fragColor = (far_col + near_col + focus_col) * inv_weight_sum;
- float totalweight = nearweight + farweight;
- farcolor = mix(srccolor, farcolor, mixfac);
- nearcolor = mix(srccolor, nearcolor, mixfac);
- fragColor = mix(farcolor, nearcolor, nearweight / max(1e-6, totalweight));
+# ifdef USE_ALPHA_DOF
+ /* Unpremult */
+ fragColor.rgb /= (fragColor.a > 0.0) ? fragColor.a : 1.0;
+# endif
}
#endif
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl
index 6e43115d799..92fd36f684a 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl
@@ -10,6 +10,7 @@ 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;
@@ -47,8 +48,10 @@ void main()
color = texelFetch(farBuffer, texelco, 0);
}
/* find the area the pixel will cover and divide the color by it */
- color.a = 1.0 / (coc * coc * M_PI);
- color.rgb *= color.a;
+ /* 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;
@@ -92,7 +95,9 @@ void main()
gl_Position.xy += (0.5 + vec2(texelco) * 2.0) * texel_size;
/* Push far plane to left side. */
- gl_Position.x += (!is_near) ? 1.0 : 0.0;
+ if (!is_near) {
+ gl_Position.x += 2.0 / 2.0;
+ }
/* don't do smoothing for small sprites */
if (coc > 3.0) {
@@ -101,6 +106,4 @@ void main()
else {
smoothFac = 1.0;
}
-
- int tex_width = textureSize(cocBuffer, 0).x;
}
diff --git a/source/blender/draw/engines/eevee/shaders/effect_minmaxz_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_minmaxz_frag.glsl
index f834b698ef9..edfd0f307e9 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_minmaxz_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_minmaxz_frag.glsl
@@ -29,7 +29,7 @@ uniform sampler2D depthBuffer;
#define minmax4(a, b, c, d) max(max(max(a, b), c), d)
#endif
-/* On some AMD card / driver conbination, it is needed otherwise,
+/* On some AMD card / driver combination, it is needed otherwise,
* the shader does not write anything. */
#if defined(GPU_INTEL) || defined(GPU_ATI)
out vec4 fragColor;
@@ -49,7 +49,8 @@ void main()
#else
vec4 samp;
# ifdef GPU_ARB_texture_gather
- samp = gatherLowerMip(vec2(texelPos) / vec2(mipsize));
+ /* + 1.0 to gather at the center of target 4 texels. */
+ samp = gatherLowerMip((vec2(texelPos) + 1.0) / vec2(mipsize));
# else
samp.x = sampleLowerMip(texelPos);
samp.y = sampleLowerMip(texelPos + ivec2(1, 0));
@@ -67,7 +68,7 @@ void main()
val = minmax2(val, samp.x);
}
# ifdef GPU_ARB_texture_gather
- samp = gatherLowerMip((vec2(texelPos) + vec2(1.0, 0.0)) / vec2(mipsize));
+ samp = gatherLowerMip((vec2(texelPos) + vec2(2.0, 1.0)) / vec2(mipsize));
# else
samp.y = sampleLowerMip(texelPos + ivec2(2, 0));
samp.z = sampleLowerMip(texelPos + ivec2(2, 1));
@@ -77,7 +78,7 @@ void main()
/* if we are reducing an odd-height texture then fetch the edge texels */
if (((mipsize.y & 1) != 0) && (texelPos.y == mipsize.y - 3)) {
# ifdef GPU_ARB_texture_gather
- samp = gatherLowerMip((vec2(texelPos) + vec2(0.0, 1.0)) / vec2(mipsize));
+ samp = gatherLowerMip((vec2(texelPos) + vec2(1.0, 2.0)) / vec2(mipsize));
# else
samp.x = sampleLowerMip(texelPos + ivec2(0, 2));
samp.y = sampleLowerMip(texelPos + ivec2(1, 2));
diff --git a/source/blender/draw/engines/eevee/shaders/lamps_lib.glsl b/source/blender/draw/engines/eevee/shaders/lamps_lib.glsl
index 7281eb4cf2d..a2a26c0fbf0 100644
--- a/source/blender/draw/engines/eevee/shaders/lamps_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lamps_lib.glsl
@@ -122,10 +122,14 @@ float evaluate_cascade(ShadowData sd, mat4 shadowmat, vec3 W, float range, float
}
}
-float shadow_cascade(ShadowData sd, ShadowCascadeData scd, float texid, vec3 W)
+float shadow_cascade(ShadowData sd, int scd_id, float texid, vec3 W)
{
vec4 view_z = vec4(dot(W - cameraPos, cameraForward));
- vec4 weights = smoothstep(scd.split_end_distances, scd.split_start_distances.yzwx, view_z);
+ vec4 weights = smoothstep(
+ shadows_cascade_data[scd_id].split_end_distances,
+ shadows_cascade_data[scd_id].split_start_distances.yzwx,
+ view_z);
+
weights.yzw -= weights.xyz;
vec4 vis = vec4(1.0);
@@ -133,10 +137,10 @@ float shadow_cascade(ShadowData sd, ShadowCascadeData scd, float texid, vec3 W)
/* Branching using (weights > 0.0) is reaally slooow on intel so avoid it for now. */
/* TODO OPTI: Only do 2 samples and blend. */
- vis.x = evaluate_cascade(sd, scd.shadowmat[0], W, range, texid + 0);
- vis.y = evaluate_cascade(sd, scd.shadowmat[1], W, range, texid + 1);
- vis.z = evaluate_cascade(sd, scd.shadowmat[2], W, range, texid + 2);
- vis.w = evaluate_cascade(sd, scd.shadowmat[3], W, range, texid + 3);
+ vis.x = evaluate_cascade(sd, shadows_cascade_data[scd_id].shadowmat[0], W, range, texid + 0);
+ vis.y = evaluate_cascade(sd, shadows_cascade_data[scd_id].shadowmat[1], W, range, texid + 1);
+ vis.z = evaluate_cascade(sd, shadows_cascade_data[scd_id].shadowmat[2], W, range, texid + 2);
+ vis.w = evaluate_cascade(sd, shadows_cascade_data[scd_id].shadowmat[3], W, range, texid + 3);
float weight_sum = dot(vec4(1.0), weights);
if (weight_sum > 0.9999) {
@@ -186,20 +190,14 @@ float light_visibility(LightData ld, vec3 W,
ShadowData data = shadows_data[int(ld.l_shadowid)];
if (ld.l_type == SUN) {
- /* TODO : MSM */
- // for (int i = 0; i < MAX_MULTI_SHADOW; ++i) {
- vis *= shadow_cascade(
- data, shadows_cascade_data[int(data.sh_data_start)],
- data.sh_tex_start, W);
- // }
+ vis *= shadow_cascade(
+ data, int(data.sh_data_start),
+ data.sh_tex_start, W);
}
else {
- /* TODO : MSM */
- // for (int i = 0; i < MAX_MULTI_SHADOW; ++i) {
- vis *= shadow_cubemap(
- data, shadows_cube_data[int(data.sh_data_start)],
- data.sh_tex_start, W);
- // }
+ vis *= shadow_cubemap(
+ data, shadows_cube_data[int(data.sh_data_start)],
+ data.sh_tex_start, W);
}
#ifndef VOLUMETRICS
@@ -222,8 +220,12 @@ float light_visibility(LightData ld, vec3 W,
vec3 ray_ori = viewPosition;
+ if (dot(viewNormal, ray_dir) <= 0.0) {
+ return vis;
+ }
+
float bias = 0.5; /* Constant Bias */
- bias += 1.0 - abs(dot(viewNormal, ray_dir)); /* Angle dependant bias */
+ bias += 1.0 - abs(dot(viewNormal, ray_dir)); /* Angle dependent bias */
bias *= gl_FrontFacing ? data.sh_contact_offset : -data.sh_contact_offset;
vec3 nor_bias = viewNormal * bias;
@@ -359,10 +361,10 @@ vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, float scale)
W = W + T * rand.z + B * rand.w;
if (ld.l_type == SUN) {
- ShadowCascadeData scd = shadows_cascade_data[int(data.sh_data_start)];
+ int scd_id = int(data.sh_data_start);
vec4 view_z = vec4(dot(W - cameraPos, cameraForward));
- vec4 weights = step(scd.split_end_distances, view_z);
+ vec4 weights = step(shadows_cascade_data[scd_id].split_end_distances, view_z);
float id = abs(4.0 - dot(weights, weights));
if (id > 3.0) {
@@ -371,7 +373,7 @@ vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, float scale)
float range = abs(data.sh_far - data.sh_near); /* Same factor as in get_cascade_world_distance(). */
- vec4 shpos = scd.shadowmat[int(id)] * vec4(W, 1.0);
+ vec4 shpos = shadows_cascade_data[scd_id].shadowmat[int(id)] * vec4(W, 1.0);
float dist = shpos.z * range;
if (shpos.z > 1.0 || shpos.z < 0.0) {
diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
index 6ae13e0102d..a176f82b79b 100644
--- a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
@@ -93,17 +93,18 @@ layout(std140) uniform planar_block {
/* ----------- Functions --------- */
-float probe_attenuation_cube(CubeData pd, vec3 W)
+float probe_attenuation_cube(int pd_id, vec3 W)
{
- vec3 localpos = transform_point(pd.influencemat, W);
+ vec3 localpos = transform_point(probes_data[pd_id].influencemat, W);
+ float probe_atten_fac = probes_data[pd_id].p_atten_fac;
float fac;
- if (pd.p_atten_type == PROBE_ATTENUATION_BOX) {
- vec3 axes_fac = saturate(pd.p_atten_fac - pd.p_atten_fac * abs(localpos));
+ if (probes_data[pd_id].p_atten_type == PROBE_ATTENUATION_BOX) {
+ vec3 axes_fac = saturate(probe_atten_fac - probe_atten_fac * abs(localpos));
fac = min_v3(axes_fac);
}
else {
- fac = saturate(pd.p_atten_fac - pd.p_atten_fac * length(localpos));
+ fac = saturate(probe_atten_fac - probe_atten_fac * length(localpos));
}
return fac;
@@ -130,22 +131,22 @@ float probe_attenuation_planar(PlanarData pd, vec3 W, vec3 N, float roughness)
return fac;
}
-float probe_attenuation_grid(GridData gd, vec3 W, out vec3 localpos)
+float probe_attenuation_grid(GridData gd, mat4 localmat, vec3 W, out vec3 localpos)
{
- localpos = transform_point(gd.localmat, W);
+ localpos = transform_point(localmat, W);
float fade = min(1.0, min_v3(1.0 - abs(localpos)));
return saturate(fade * gd.g_atten_scale + gd.g_atten_bias);
}
-vec3 probe_evaluate_cube(float id, CubeData cd, vec3 W, vec3 R, float roughness)
+vec3 probe_evaluate_cube(int pd_id, vec3 W, vec3 R, float roughness)
{
/* Correct reflection ray using parallax volume intersection. */
- vec3 localpos = transform_point(cd.parallaxmat, W);
- vec3 localray = transform_direction(cd.parallaxmat, R);
+ vec3 localpos = transform_point(probes_data[pd_id].parallaxmat, W);
+ vec3 localray = transform_direction(probes_data[pd_id].parallaxmat, R);
float dist;
- if (cd.p_parallax_type == PROBE_PARALLAX_BOX) {
+ if (probes_data[pd_id].p_parallax_type == PROBE_PARALLAX_BOX) {
dist = line_unit_box_intersect_dist(localpos, localray);
}
else {
@@ -153,7 +154,7 @@ vec3 probe_evaluate_cube(float id, CubeData cd, vec3 W, vec3 R, float roughness)
}
/* Use Distance in WS directly to recover intersection */
- vec3 intersection = W + R * dist - cd.p_position;
+ vec3 intersection = W + R * dist - probes_data[pd_id].p_position;
/* From Frostbite PBR Course
* Distance based roughness
@@ -167,7 +168,7 @@ vec3 probe_evaluate_cube(float id, CubeData cd, vec3 W, vec3 R, float roughness)
float fac = saturate(original_roughness * 2.0 - 1.0);
R = mix(intersection, R, fac * fac);
- return textureLod_octahedron(probeCubes, vec4(R, id), roughness * prbLodCubeMax, prbLodCubeMax).rgb;
+ return textureLod_octahedron(probeCubes, vec4(R, float(pd_id)), roughness * prbLodCubeMax, prbLodCubeMax).rgb;
}
vec3 probe_evaluate_world_spec(vec3 R, float roughness)
@@ -221,12 +222,10 @@ void fallback_cubemap(
/* Starts at 1 because 0 is world probe */
for (int i = 1; i < MAX_PROBE && i < prbNumRenderCube && spec_accum.a < 0.999; ++i) {
- CubeData cd = probes_data[i];
-
- float fade = probe_attenuation_cube(cd, W);
+ float fade = probe_attenuation_cube(i, W);
if (fade > 0.0) {
- vec3 spec = final_ao * probe_evaluate_cube(float(i), cd, W, spec_dir, roughness);
+ vec3 spec = final_ao * probe_evaluate_cube(i, W, spec_dir, roughness);
accumulate_light(spec, fade, spec_accum);
}
}
@@ -281,7 +280,7 @@ vec3 probe_evaluate_grid(GridData gd, vec3 W, vec3 N, vec3 localpos)
weight *= load_visibility_cell(cell, ws_light, ws_dist_point_to_cell, gd.g_vis_bias, gd.g_vis_bleed, gd.g_vis_range);
/* Smooth backface test */
- weight *= sqrt(max(0.002, dot(ws_light, N)));
+ weight *= dot(ws_light, N);
/* Avoid zero weight */
weight = max(0.00001, weight);
diff --git a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
index c31fa166634..091709ebdd1 100644
--- a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
@@ -249,7 +249,7 @@ void CLOSURE_NAME(
/* ---------------- SPECULAR ENVIRONMENT LIGHTING ----------------- */
/* ---------------------------------------------------------------- */
- /* Accumulate incomming light from all sources until accumulator is full. Then apply Occlusion and BRDF. */
+ /* 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
@@ -330,39 +330,55 @@ void CLOSURE_NAME(
/* ---------------------------- */
#if defined(CLOSURE_GLOSSY) || defined(CLOSURE_REFRACTION)
- #ifdef CLOSURE_REFRACTION
- #define ACCUM refr_accum
+ #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 ACCUM spec_accum
+ #define GLASS_ACCUM 0
+ #define ACCUM spec_accum.a
#endif
/* Starts at 1 because 0 is world probe */
- for (int i = 1; ACCUM.a < 0.999 && i < prbNumRenderCube && i < MAX_PROBE; ++i) {
- CubeData cd = probes_data[i];
-
- float fade = probe_attenuation_cube(cd, worldPosition);
+ for (int i = 1; ACCUM < 0.999 && i < prbNumRenderCube && i < MAX_PROBE; ++i) {
+ float fade = probe_attenuation_cube(i, worldPosition);
if (fade > 0.0) {
- #ifdef CLOSURE_GLOSSY
- if (!(ssrToggle && ssr_id == outputSsrId)) {
- vec3 spec = probe_evaluate_cube(float(i), cd, worldPosition, spec_dir, roughness);
- accumulate_light(spec, fade, spec_accum);
- }
+ #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(float(i), cd, worldPosition, C_spec_dir, C_roughness);
- accumulate_light(C_spec, fade, C_spec_accum);
+ #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
- #ifdef CLOSURE_REFRACTION
- vec3 trans = probe_evaluate_cube(float(i), cd, refr_pos, refr_dir, roughnessSquared);
- accumulate_light(trans, fade, refr_accum);
+ #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
/* ---------------------------- */
@@ -409,7 +425,7 @@ void CLOSURE_NAME(
vec2 uv = lut_coords(NV, roughness);
vec2 brdf_lut = texture(utilTex, vec3(uv, 1.0)).rg;
- /* This factor is outputed to be used by SSR in order
+ /* This factor is outputted to be used by SSR in order
* to match the intensity of the regular reflections. */
ssr_spec = F_ibl(f0, brdf_lut);
float spec_occlu = specular_occlusion(NV, final_ao, roughness);
@@ -458,7 +474,7 @@ void CLOSURE_NAME(
GridData gd = grids_data[i];
vec3 localpos;
- float fade = probe_attenuation_grid(gd, worldPosition, 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);
diff --git a/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl b/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
index 58bcea7d605..142afa5705b 100644
--- a/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl
@@ -1,9 +1,9 @@
uniform mat4 ModelViewProjectionMatrix;
-uniform mat4 ModelMatrix;
uniform mat4 ModelViewMatrix;
uniform mat3 WorldNormalMatrix;
#ifndef ATTRIB
+uniform mat4 ModelMatrix;
uniform mat3 NormalMatrix;
uniform mat4 ModelMatrixInverse;
#endif
@@ -40,6 +40,13 @@ flat out int hairStrandID;
void main()
{
+#ifdef GPU_INTEL
+ /* Due to some shader compiler bug, we somewhat
+ * need to access gl_VertexID to make it work. even
+ * if it's actually dead code. */
+ gl_Position.x = float(gl_VertexID);
+#endif
+
#ifdef HAIR_SHADER
hairStrandID = hair_get_strand_id();
vec3 pos, binor;
diff --git a/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl b/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl
index 1c0e65f0613..6b6ab0c0bcc 100644
--- a/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl
@@ -11,14 +11,13 @@ float hash3d(vec3 a) {
}
uniform float hashAlphaOffset;
+uniform float hashAlphaScale = 1.0; /* Roughly in pixel */
float hashed_alpha_threshold(vec3 co)
{
- const float hash_scale = 1.0; /* Roughly in pixel */
-
/* Find the discretized derivatives of our coordinates. */
float max_deriv = max(length(dFdx(co)), length(dFdy(co)));
- float pix_scale = 1.0 / (hash_scale * max_deriv);
+ float pix_scale = 1.0 / (hashAlphaScale * max_deriv);
/* Find two nearest log-discretized noise scales. */
float pix_scale_log = log2(pix_scale);
diff --git a/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl b/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl
index d035a4329b1..c9f2d64f30b 100644
--- a/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl
@@ -9,10 +9,7 @@ float sample_depth(vec2 uv, int index, float lod)
else {
#endif
/* Correct UVs for mipmaping mis-alignment */
- /* + 1.0 because we are using half res maxzBuffer
- * and mipRatio starts at on mip 0. */
- int mip = int(lod + 1.0);
- uv *= mipRatio[mip];
+ uv *= mipRatio[int(lod) + hizMipOffset];
return textureLod(maxzBuffer, uv, lod).r;
#ifdef PLANAR_PROBE_RAYTRACE
}
@@ -122,7 +119,7 @@ void prepare_raycast(
#define prev_delta times_and_deltas.w
// #define GROUPED_FETCHES /* is still slower, need to see where is the bottleneck. */
-/* Return the hit position, and negate the z component (making it positive) if not hit occured. */
+/* Return the hit position, and negate the z component (making it positive) if not hit occurred. */
/* __ray_dir__ is the ray direction premultiplied by it's maximum length */
vec3 raycast(
int index, vec3 ray_origin, vec3 ray_dir, float thickness, float ray_jitter,
diff --git a/source/blender/draw/engines/eevee/shaders/shadow_copy_frag.glsl b/source/blender/draw/engines/eevee/shaders/shadow_copy_frag.glsl
index 4ae22b480f1..3ac214bfde2 100644
--- a/source/blender/draw/engines/eevee/shaders/shadow_copy_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/shadow_copy_frag.glsl
@@ -9,6 +9,7 @@ layout(std140) uniform shadow_render_block {
float farClip;
int shadowSampleCount;
float shadowInvSampleCount;
+ float exponent;
};
#ifdef CSM
@@ -22,40 +23,28 @@ uniform float shadowFilterSize;
out vec4 FragColor;
-float linear_depth(float z)
-{
- return (nearClip * farClip) / (z * (nearClip - farClip) + farClip);
-}
+#define linear_depth(z) ((nearClip * farClip) / (clamp(z, 0.0, 0.999999) * (nearClip - farClip) + farClip))
-vec4 linear_depth(vec4 z)
-{
- return (nearClip * farClip) / (z * (nearClip - farClip) + farClip);
-}
+/* add bias so background filtering does not bleed into shadow map */
+#define BACKGROUND_BIAS 0.05
#ifdef CSM
vec4 get_world_distance(vec4 depths, vec3 cos[4])
{
- /* Background case */
- vec4 is_background = step(vec4(0.99999), depths);
- depths *= abs(farClip - nearClip); /* Same factor as in shadow_cascade(). */
- depths += 1e1 * is_background;
- return depths;
+ depths += step(vec4(0.9999), depths) * BACKGROUND_BIAS;
+ return clamp(depths * abs(farClip - nearClip), 0.0, 1e10); /* Same factor as in shadow_cascade(). */
}
float get_world_distance(float depth, vec3 cos)
{
- /* Background case */
- float is_background = step(0.9999, depth);
- depth *= abs(farClip - nearClip); /* Same factor as in shadow_cascade(). */
- depth += 1e1 * is_background;
- return depth;
+ depth += step(0.9999, depth) * BACKGROUND_BIAS;
+ return clamp(depth * abs(farClip - nearClip), 0.0, 1e10); /* Same factor as in shadow_cascade(). */
}
+
#else /* CUBEMAP */
vec4 get_world_distance(vec4 depths, vec3 cos[4])
{
- vec4 is_background = step(vec4(1.0), depths);
depths = linear_depth(depths);
- depths += vec4(1e1) * is_background;
cos[0] = normalize(abs(cos[0]));
cos[1] = normalize(abs(cos[1]));
cos[2] = normalize(abs(cos[2]));
@@ -70,9 +59,7 @@ vec4 get_world_distance(vec4 depths, vec3 cos[4])
float get_world_distance(float depth, vec3 cos)
{
- float is_background = step(1.0, depth);
depth = linear_depth(depth);
- depth += 1e1 * is_background;
cos = normalize(abs(cos));
float cos_vec = max(cos.x, max(cos.y, cos.z));
return depth / cos_vec;
@@ -80,23 +67,18 @@ float get_world_distance(float depth, vec3 cos)
#endif
/* Marco Salvi's GDC 2008 presentation about shadow maps pre-filtering techniques slide 24 */
-float ln_space_prefilter(float w0, float x, float w1, float y)
-{
- return x + log(w0 + w1 * exp(y - x));
-}
+#define ln_space_prefilter_step(ref, sample) exp(sample - ref)
+#define ln_space_prefilter_finalize(ref, sum) (ref + log(SAMPLE_WEIGHT * sum))
#define SAMPLE_WEIGHT 0.11111
#ifdef ESM
-void prefilter(vec4 depths, inout float accum)
+void prefilter(vec4 depths, float ref, inout float accum)
{
- accum = ln_space_prefilter(1.0, accum, SAMPLE_WEIGHT, depths.x);
- accum = ln_space_prefilter(1.0, accum, SAMPLE_WEIGHT, depths.y);
- accum = ln_space_prefilter(1.0, accum, SAMPLE_WEIGHT, depths.z);
- accum = ln_space_prefilter(1.0, accum, SAMPLE_WEIGHT, depths.w);
+ accum += dot(ln_space_prefilter_step(ref, depths), vec4(1.0));
}
#else /* VSM */
-void prefilter(vec4 depths, inout vec2 accum)
+void prefilter(vec4 depths, float ref, inout vec2 accum)
{
vec4 depths_sqr = depths * depths;
accum += vec2(dot(vec4(1.0), depths), dot(vec4(1.0), depths_sqr)) * SAMPLE_WEIGHT;
@@ -168,8 +150,10 @@ void main() {
}
#ifdef ESM
- float accum = ln_space_prefilter(0.0, 0.0, SAMPLE_WEIGHT, depth);
+ float accum = 1.0;
+ float ref = depth;
#else /* VSM */
+ float ref = 0.0; /* UNUSED */
vec2 accum = vec2(depth, depth * depth) * SAMPLE_WEIGHT;
#endif
@@ -191,7 +175,7 @@ void main() {
depths.z = texture(shadowTexture, cos[2]).r;
depths.w = texture(shadowTexture, cos[3]).r;
depths = get_world_distance(depths, cos);
- prefilter(depths, accum);
+ prefilter(depths, ref, accum);
cos[0] = get_texco(uvs, ofs.xy);
cos[1] = get_texco(uvs, ofs.zx);
@@ -202,7 +186,11 @@ void main() {
depths.z = texture(shadowTexture, cos[2]).r;
depths.w = texture(shadowTexture, cos[3]).r;
depths = get_world_distance(depths, cos);
- prefilter(depths, accum);
+ prefilter(depths, ref, accum);
+
+#ifdef ESM
+ accum = ln_space_prefilter_finalize(ref, accum);
+#endif
FragColor = vec2(accum).xyxy;
}
diff --git a/source/blender/draw/engines/eevee/shaders/shadow_store_frag.glsl b/source/blender/draw/engines/eevee/shaders/shadow_store_frag.glsl
index d5ac821c3fa..cb7b2b0312a 100644
--- a/source/blender/draw/engines/eevee/shaders/shadow_store_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/shadow_store_frag.glsl
@@ -7,6 +7,7 @@ layout(std140) uniform shadow_render_block {
float farClip;
int shadowSampleCount;
float shadowInvSampleCount;
+ float exponent;
};
#ifdef CSM
@@ -34,15 +35,9 @@ vec3 octahedral_to_cubemap_proj(vec2 co)
}
/* Marco Salvi's GDC 2008 presentation about shadow maps pre-filtering techniques slide 24 */
-float ln_space_prefilter(float w0, float x, float w1, float y)
-{
- return x + log(w0 + w1 * exp(y - x));
-}
-
-vec4 ln_space_prefilter(float w0, vec4 x, float w1, vec4 y)
-{
- return x + log(w0 + w1 * exp(y - x));
-}
+/* http://advances.realtimerendering.com/s2009/SIGGRAPH%202009%20-%20Lighting%20Research%20at%20Bungie.pdf Slide 55*/
+#define ln_space_prefilter_step(ref, sample) exp(sample - ref)
+#define ln_space_prefilter_finalize(ref, sum) (ref + log(shadowInvSampleCount * sum))
#ifdef CSM
vec3 get_texco(vec3 cos, const vec2 ofs)
@@ -73,6 +68,7 @@ vec3 get_texco(vec3 cos, const vec2 ofs)
void grouped_samples_accum(
vec3 cos,
const vec2 co1, const vec2 co2, const vec2 co3, const vec2 co4,
+ float ref,
inout vec4 accum)
{
vec4 depths;
@@ -81,12 +77,13 @@ void grouped_samples_accum(
depths.z = texture(shadowTexture, get_texco(cos, co3)).r;
depths.w = texture(shadowTexture, get_texco(cos, co4)).r;
- accum = ln_space_prefilter(1.0, accum, shadowInvSampleCount, depths);
+ accum += ln_space_prefilter_step(ref, depths);
}
#else /* VSM */
void grouped_samples_accum(
vec3 cos,
const vec2 co1, const vec2 co2, const vec2 co3, const vec2 co4,
+ float ref,
inout vec2 accum)
{
vec4 depths1, depths2;
@@ -134,17 +131,18 @@ void main() {
#ifdef ESM
/* disc blur in log space. */
- vec4 accum = vec4(0.0);
vec4 depths;
depths.x = texture(shadowTexture, get_texco(cos, concentric[0])).r;
depths.y = texture(shadowTexture, get_texco(cos, concentric[1])).r;
depths.z = texture(shadowTexture, get_texco(cos, concentric[2])).r;
depths.w = texture(shadowTexture, get_texco(cos, concentric[3])).r;
- accum = ln_space_prefilter(0.0, accum, shadowInvSampleCount, depths);
+ float ref = depths.x;
+ vec4 accum = ln_space_prefilter_step(ref, depths);
#else /* VSM */
+ float ref = 0.0; /* UNUSED */
vec2 accum = vec2(0.0);
- grouped_samples_accum(cos, concentric[0], concentric[1], concentric[2], concentric[3], accum);
+ grouped_samples_accum(cos, concentric[0], concentric[1], concentric[2], concentric[3], ref, accum);
#endif
/**
@@ -154,89 +152,88 @@ void main() {
* The solution is to use constant indices to access the array.
*/
if (shadowSampleCount > 4) {
- grouped_samples_accum(cos, concentric[4], concentric[5], concentric[6], concentric[7], accum);
- grouped_samples_accum(cos, concentric[8], concentric[9], concentric[10], concentric[11], accum);
- grouped_samples_accum(cos, concentric[12], concentric[13], concentric[14], concentric[15], accum);
+ grouped_samples_accum(cos, concentric[4], concentric[5], concentric[6], concentric[7], ref, accum);
+ grouped_samples_accum(cos, concentric[8], concentric[9], concentric[10], concentric[11], ref, accum);
+ grouped_samples_accum(cos, concentric[12], concentric[13], concentric[14], concentric[15], ref, accum);
}
if (shadowSampleCount > 16) {
- grouped_samples_accum(cos, concentric[16], concentric[17], concentric[18], concentric[19], accum);
- grouped_samples_accum(cos, concentric[20], concentric[21], concentric[22], concentric[23], accum);
- grouped_samples_accum(cos, concentric[24], concentric[25], concentric[26], concentric[27], accum);
- grouped_samples_accum(cos, concentric[28], concentric[29], concentric[30], concentric[31], accum);
- grouped_samples_accum(cos, concentric[32], concentric[33], concentric[34], concentric[35], accum);
+ grouped_samples_accum(cos, concentric[16], concentric[17], concentric[18], concentric[19], ref, accum);
+ grouped_samples_accum(cos, concentric[20], concentric[21], concentric[22], concentric[23], ref, accum);
+ grouped_samples_accum(cos, concentric[24], concentric[25], concentric[26], concentric[27], ref, accum);
+ grouped_samples_accum(cos, concentric[28], concentric[29], concentric[30], concentric[31], ref, accum);
+ grouped_samples_accum(cos, concentric[32], concentric[33], concentric[34], concentric[35], ref, accum);
}
#ifdef HIGH_BLUR
if (shadowSampleCount > 36) {
- grouped_samples_accum(cos, concentric[36], concentric[37], concentric[38], concentric[39], accum);
- grouped_samples_accum(cos, concentric[40], concentric[41], concentric[42], concentric[43], accum);
- grouped_samples_accum(cos, concentric[44], concentric[45], concentric[46], concentric[47], accum);
- grouped_samples_accum(cos, concentric[48], concentric[49], concentric[50], concentric[51], accum);
- grouped_samples_accum(cos, concentric[52], concentric[53], concentric[54], concentric[55], accum);
- grouped_samples_accum(cos, concentric[56], concentric[57], concentric[58], concentric[59], accum);
- grouped_samples_accum(cos, concentric[60], concentric[61], concentric[62], concentric[63], accum);
+ grouped_samples_accum(cos, concentric[36], concentric[37], concentric[38], concentric[39], ref, accum);
+ grouped_samples_accum(cos, concentric[40], concentric[41], concentric[42], concentric[43], ref, accum);
+ grouped_samples_accum(cos, concentric[44], concentric[45], concentric[46], concentric[47], ref, accum);
+ grouped_samples_accum(cos, concentric[48], concentric[49], concentric[50], concentric[51], ref, accum);
+ grouped_samples_accum(cos, concentric[52], concentric[53], concentric[54], concentric[55], ref, accum);
+ grouped_samples_accum(cos, concentric[56], concentric[57], concentric[58], concentric[59], ref, accum);
+ grouped_samples_accum(cos, concentric[60], concentric[61], concentric[62], concentric[63], ref, accum);
}
if (shadowSampleCount > 64) {
- grouped_samples_accum(cos, concentric[64], concentric[65], concentric[66], concentric[67], accum);
- grouped_samples_accum(cos, concentric[68], concentric[69], concentric[70], concentric[71], accum);
- grouped_samples_accum(cos, concentric[72], concentric[73], concentric[74], concentric[75], accum);
- grouped_samples_accum(cos, concentric[76], concentric[77], concentric[78], concentric[79], accum);
- grouped_samples_accum(cos, concentric[80], concentric[81], concentric[82], concentric[83], accum);
- grouped_samples_accum(cos, concentric[84], concentric[85], concentric[86], concentric[87], accum);
- grouped_samples_accum(cos, concentric[88], concentric[89], concentric[90], concentric[91], accum);
- grouped_samples_accum(cos, concentric[92], concentric[93], concentric[94], concentric[95], accum);
- grouped_samples_accum(cos, concentric[96], concentric[97], concentric[98], concentric[99], accum);
+ grouped_samples_accum(cos, concentric[64], concentric[65], concentric[66], concentric[67], ref, accum);
+ grouped_samples_accum(cos, concentric[68], concentric[69], concentric[70], concentric[71], ref, accum);
+ grouped_samples_accum(cos, concentric[72], concentric[73], concentric[74], concentric[75], ref, accum);
+ grouped_samples_accum(cos, concentric[76], concentric[77], concentric[78], concentric[79], ref, accum);
+ grouped_samples_accum(cos, concentric[80], concentric[81], concentric[82], concentric[83], ref, accum);
+ grouped_samples_accum(cos, concentric[84], concentric[85], concentric[86], concentric[87], ref, accum);
+ grouped_samples_accum(cos, concentric[88], concentric[89], concentric[90], concentric[91], ref, accum);
+ grouped_samples_accum(cos, concentric[92], concentric[93], concentric[94], concentric[95], ref, accum);
+ grouped_samples_accum(cos, concentric[96], concentric[97], concentric[98], concentric[99], ref, accum);
}
if (shadowSampleCount > 100) {
- grouped_samples_accum(cos, concentric[100], concentric[101], concentric[102], concentric[103], accum);
- grouped_samples_accum(cos, concentric[104], concentric[105], concentric[106], concentric[107], accum);
- grouped_samples_accum(cos, concentric[108], concentric[109], concentric[110], concentric[111], accum);
- grouped_samples_accum(cos, concentric[112], concentric[113], concentric[114], concentric[115], accum);
- grouped_samples_accum(cos, concentric[116], concentric[117], concentric[118], concentric[119], accum);
- grouped_samples_accum(cos, concentric[120], concentric[121], concentric[122], concentric[123], accum);
- grouped_samples_accum(cos, concentric[124], concentric[125], concentric[126], concentric[127], accum);
- grouped_samples_accum(cos, concentric[128], concentric[129], concentric[130], concentric[131], accum);
- grouped_samples_accum(cos, concentric[132], concentric[133], concentric[134], concentric[135], accum);
- grouped_samples_accum(cos, concentric[136], concentric[137], concentric[138], concentric[139], accum);
- grouped_samples_accum(cos, concentric[140], concentric[141], concentric[142], concentric[143], accum);
+ grouped_samples_accum(cos, concentric[100], concentric[101], concentric[102], concentric[103], ref, accum);
+ grouped_samples_accum(cos, concentric[104], concentric[105], concentric[106], concentric[107], ref, accum);
+ grouped_samples_accum(cos, concentric[108], concentric[109], concentric[110], concentric[111], ref, accum);
+ grouped_samples_accum(cos, concentric[112], concentric[113], concentric[114], concentric[115], ref, accum);
+ grouped_samples_accum(cos, concentric[116], concentric[117], concentric[118], concentric[119], ref, accum);
+ grouped_samples_accum(cos, concentric[120], concentric[121], concentric[122], concentric[123], ref, accum);
+ grouped_samples_accum(cos, concentric[124], concentric[125], concentric[126], concentric[127], ref, accum);
+ grouped_samples_accum(cos, concentric[128], concentric[129], concentric[130], concentric[131], ref, accum);
+ grouped_samples_accum(cos, concentric[132], concentric[133], concentric[134], concentric[135], ref, accum);
+ grouped_samples_accum(cos, concentric[136], concentric[137], concentric[138], concentric[139], ref, accum);
+ grouped_samples_accum(cos, concentric[140], concentric[141], concentric[142], concentric[143], ref, accum);
}
if (shadowSampleCount > 144) {
- grouped_samples_accum(cos, concentric[144], concentric[145], concentric[146], concentric[147], accum);
- grouped_samples_accum(cos, concentric[148], concentric[149], concentric[150], concentric[151], accum);
- grouped_samples_accum(cos, concentric[152], concentric[153], concentric[154], concentric[155], accum);
- grouped_samples_accum(cos, concentric[156], concentric[157], concentric[158], concentric[159], accum);
- grouped_samples_accum(cos, concentric[160], concentric[161], concentric[162], concentric[163], accum);
- grouped_samples_accum(cos, concentric[164], concentric[165], concentric[166], concentric[167], accum);
- grouped_samples_accum(cos, concentric[168], concentric[169], concentric[170], concentric[171], accum);
- grouped_samples_accum(cos, concentric[172], concentric[173], concentric[174], concentric[175], accum);
- grouped_samples_accum(cos, concentric[176], concentric[177], concentric[178], concentric[179], accum);
- grouped_samples_accum(cos, concentric[180], concentric[181], concentric[182], concentric[183], accum);
- grouped_samples_accum(cos, concentric[184], concentric[185], concentric[186], concentric[187], accum);
- grouped_samples_accum(cos, concentric[188], concentric[189], concentric[190], concentric[191], accum);
- grouped_samples_accum(cos, concentric[192], concentric[193], concentric[194], concentric[195], accum);
+ grouped_samples_accum(cos, concentric[144], concentric[145], concentric[146], concentric[147], ref, accum);
+ grouped_samples_accum(cos, concentric[148], concentric[149], concentric[150], concentric[151], ref, accum);
+ grouped_samples_accum(cos, concentric[152], concentric[153], concentric[154], concentric[155], ref, accum);
+ grouped_samples_accum(cos, concentric[156], concentric[157], concentric[158], concentric[159], ref, accum);
+ grouped_samples_accum(cos, concentric[160], concentric[161], concentric[162], concentric[163], ref, accum);
+ grouped_samples_accum(cos, concentric[164], concentric[165], concentric[166], concentric[167], ref, accum);
+ grouped_samples_accum(cos, concentric[168], concentric[169], concentric[170], concentric[171], ref, accum);
+ grouped_samples_accum(cos, concentric[172], concentric[173], concentric[174], concentric[175], ref, accum);
+ grouped_samples_accum(cos, concentric[176], concentric[177], concentric[178], concentric[179], ref, accum);
+ grouped_samples_accum(cos, concentric[180], concentric[181], concentric[182], concentric[183], ref, accum);
+ grouped_samples_accum(cos, concentric[184], concentric[185], concentric[186], concentric[187], ref, accum);
+ grouped_samples_accum(cos, concentric[188], concentric[189], concentric[190], concentric[191], ref, accum);
+ grouped_samples_accum(cos, concentric[192], concentric[193], concentric[194], concentric[195], ref, accum);
}
if (shadowSampleCount > 196) {
- grouped_samples_accum(cos, concentric[196], concentric[197], concentric[198], concentric[199], accum);
- grouped_samples_accum(cos, concentric[200], concentric[201], concentric[202], concentric[203], accum);
- grouped_samples_accum(cos, concentric[204], concentric[205], concentric[206], concentric[207], accum);
- grouped_samples_accum(cos, concentric[208], concentric[209], concentric[210], concentric[211], accum);
- grouped_samples_accum(cos, concentric[212], concentric[213], concentric[114], concentric[215], accum);
- grouped_samples_accum(cos, concentric[216], concentric[217], concentric[218], concentric[219], accum);
- grouped_samples_accum(cos, concentric[220], concentric[221], concentric[222], concentric[223], accum);
- grouped_samples_accum(cos, concentric[224], concentric[225], concentric[226], concentric[227], accum);
- grouped_samples_accum(cos, concentric[228], concentric[229], concentric[230], concentric[231], accum);
- grouped_samples_accum(cos, concentric[232], concentric[233], concentric[234], concentric[235], accum);
- grouped_samples_accum(cos, concentric[236], concentric[237], concentric[238], concentric[239], accum);
- grouped_samples_accum(cos, concentric[240], concentric[241], concentric[242], concentric[243], accum);
- grouped_samples_accum(cos, concentric[244], concentric[245], concentric[246], concentric[247], accum);
- grouped_samples_accum(cos, concentric[248], concentric[249], concentric[250], concentric[251], accum);
- grouped_samples_accum(cos, concentric[252], concentric[253], concentric[254], concentric[255], accum);
+ grouped_samples_accum(cos, concentric[196], concentric[197], concentric[198], concentric[199], ref, accum);
+ grouped_samples_accum(cos, concentric[200], concentric[201], concentric[202], concentric[203], ref, accum);
+ grouped_samples_accum(cos, concentric[204], concentric[205], concentric[206], concentric[207], ref, accum);
+ grouped_samples_accum(cos, concentric[208], concentric[209], concentric[210], concentric[211], ref, accum);
+ grouped_samples_accum(cos, concentric[212], concentric[213], concentric[114], concentric[215], ref, accum);
+ grouped_samples_accum(cos, concentric[216], concentric[217], concentric[218], concentric[219], ref, accum);
+ grouped_samples_accum(cos, concentric[220], concentric[221], concentric[222], concentric[223], ref, accum);
+ grouped_samples_accum(cos, concentric[224], concentric[225], concentric[226], concentric[227], ref, accum);
+ grouped_samples_accum(cos, concentric[228], concentric[229], concentric[230], concentric[231], ref, accum);
+ grouped_samples_accum(cos, concentric[232], concentric[233], concentric[234], concentric[235], ref, accum);
+ grouped_samples_accum(cos, concentric[236], concentric[237], concentric[238], concentric[239], ref, accum);
+ grouped_samples_accum(cos, concentric[240], concentric[241], concentric[242], concentric[243], ref, accum);
+ grouped_samples_accum(cos, concentric[244], concentric[245], concentric[246], concentric[247], ref, accum);
+ grouped_samples_accum(cos, concentric[248], concentric[249], concentric[250], concentric[251], ref, accum);
+ grouped_samples_accum(cos, concentric[252], concentric[253], concentric[254], concentric[255], ref, accum);
}
#endif
#ifdef ESM
- accum.x = ln_space_prefilter(1.0, accum.x, 1.0, accum.y);
- accum.x = ln_space_prefilter(1.0, accum.x, 1.0, accum.z);
- accum.x = ln_space_prefilter(1.0, accum.x, 1.0, accum.w);
+ accum.x = dot(vec4(1.0), accum);
+ accum.x = ln_space_prefilter_finalize(ref, accum.x);
FragColor = accum.xxxx;
#else /* VSM */
diff --git a/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl b/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl
index 6b6479089f6..cfd24ae8d65 100644
--- a/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl
+++ b/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl
@@ -1,10 +1,10 @@
uniform mat4 ModelViewProjectionMatrix;
#ifdef MESH_SHADER
-uniform mat4 ModelMatrix;
uniform mat4 ModelViewMatrix;
uniform mat3 WorldNormalMatrix;
# ifndef ATTRIB
+uniform mat4 ModelMatrix;
uniform mat3 NormalMatrix;
# endif
#endif
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_geom.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_geom.glsl
index 208e8165689..d435bda4f60 100644
--- a/source/blender/draw/engines/eevee/shaders/volumetric_geom.glsl
+++ b/source/blender/draw/engines/eevee/shaders/volumetric_geom.glsl
@@ -17,12 +17,21 @@ flat out int slice;
void main() {
gl_Layer = slice = int(vPos[0].z);
+#ifdef ATTRIB
+ pass_attrib(0);
+#endif
gl_Position = vPos[0].xyww;
EmitVertex();
+#ifdef ATTRIB
+ pass_attrib(1);
+#endif
gl_Position = vPos[1].xyww;
EmitVertex();
+#ifdef ATTRIB
+ pass_attrib(2);
+#endif
gl_Position = vPos[2].xyww;
EmitVertex();
@@ -37,12 +46,21 @@ void main() {
void main() {
gl_Layer = slice = int(vPos[0].z);
+#ifdef ATTRIB
+ pass_attrib(0);
+#endif
gl_Position = vPos[0].xyww;
EmitVertex();
+#ifdef ATTRIB
+ pass_attrib(1);
+#endif
gl_Position = vPos[1].xyww;
EmitVertex();
+#ifdef ATTRIB
+ pass_attrib(2);
+#endif
gl_Position = vPos[2].xyww;
EmitVertex();
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_integration_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_integration_frag.glsl
index c5c97b97734..827d774b290 100644
--- a/source/blender/draw/engines/eevee/shaders/volumetric_integration_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/volumetric_integration_frag.glsl
@@ -3,7 +3,7 @@
* https://www.ea.com/frostbite/news/physically-based-unified-volumetric-rendering-in-frostbite */
/* Step 3 : Integrate for each froxel the final amount of light
- * scattered back to the viewer and the amout of transmittance. */
+ * scattered back to the viewer and the amount of transmittance. */
uniform sampler3D volumeScattering; /* Result of the scatter step */
uniform sampler3D volumeExtinction;
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl
index 5f641c5d490..36c4562e137 100644
--- a/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl
@@ -75,10 +75,11 @@ vec3 light_volume(LightData ld, vec4 l_vector)
}
else if (ld.l_type == SUN) {
power = (4.0f * ld.l_radius * ld.l_radius * M_2PI) * (1.0 / 12.5); /* Removing area light power*/
- power *= M_2PI * 0.78; /* Matching cycles with point light. */
+ power *= M_PI * 0.5; /* Matching cycles. */
}
else {
power = (4.0 * ld.l_radius * ld.l_radius) * (1.0 /10.0);
+ power *= M_2PI; /* Matching cycles with point light. */
}
/* OPTI: find a better way than calculating this on the fly */
diff --git a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
index fdf4f121d53..30887e3fb19 100644
--- a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
@@ -23,6 +23,7 @@
* \ingroup draw
*/
+#include "DRW_engine.h"
#include "DRW_render.h"
#include "BKE_global.h"
@@ -37,17 +38,20 @@
#include "draw_cache_impl.h"
-static bool gpencil_check_ob_duplicated(tGPencilObjectCache *cache_array, int gp_cache_used, Object *ob)
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
+
+static bool gpencil_check_ob_duplicated(tGPencilObjectCache *cache_array,
+ int gp_cache_used, Object *ob, int *r_index)
{
if (gp_cache_used == 0) {
return false;
}
- for (int i = 0; i < gp_cache_used + 1; i++) {
+ for (int i = 0; i < gp_cache_used; i++) {
tGPencilObjectCache *cache_elem = &cache_array[i];
- if (STREQ(cache_elem->ob_name, ob->id.name) &&
- (cache_elem->is_dup_ob == false))
- {
+ if (cache_elem->ob == ob) {
+ *r_index = cache_elem->data_idx;
return true;
}
}
@@ -62,9 +66,9 @@ static bool gpencil_check_datablock_duplicated(
return false;
}
- for (int i = 0; i < gp_cache_used + 1; i++) {
+ for (int i = 0; i < gp_cache_used; i++) {
tGPencilObjectCache *cache_elem = &cache_array[i];
- if (!STREQ(cache_elem->ob_name, ob->id.name) &&
+ if ((cache_elem->ob != ob) &&
(cache_elem->gpd == gpd))
{
return true;
@@ -73,6 +77,27 @@ static bool gpencil_check_datablock_duplicated(
return false;
}
+static int gpencil_len_datablock_duplicated(
+ tGPencilObjectCache *cache_array, int gp_cache_used,
+ Object *ob, bGPdata *gpd)
+{
+ int tot = 0;
+ if (gp_cache_used == 0) {
+ return 0;
+ }
+
+ for (int i = 0; i < gp_cache_used; i++) {
+ tGPencilObjectCache *cache_elem = &cache_array[i];
+ if ((cache_elem->ob != ob) &&
+ (cache_elem->gpd == gpd) &&
+ (!cache_elem->is_dup_ob))
+ {
+ tot++;
+ }
+ }
+ return tot;
+}
+
/* add a gpencil object to cache to defer drawing */
tGPencilObjectCache *gpencil_object_cache_add(
tGPencilObjectCache *cache_array, Object *ob,
@@ -101,22 +126,42 @@ tGPencilObjectCache *gpencil_object_cache_add(
cache_elem = &cache_array[*gp_cache_used];
memset(cache_elem, 0, sizeof(*cache_elem));
- cache_elem->is_dup_ob = gpencil_check_ob_duplicated(cache_array, *gp_cache_used, ob);
-
- STRNCPY(cache_elem->ob_name, ob->id.name);
- cache_elem->gpd = (bGPdata *)ob->data;
-
+ Object *ob_orig = (Object *)DEG_get_original_id(&ob->id);
+ cache_elem->ob = ob_orig;
+ cache_elem->gpd = (bGPdata *)ob_orig->data;
copy_v3_v3(cache_elem->loc, ob->loc);
copy_m4_m4(cache_elem->obmat, ob->obmat);
cache_elem->idx = *gp_cache_used;
- cache_elem->is_dup_onion = gpencil_check_datablock_duplicated(
- cache_array, *gp_cache_used,
- ob, cache_elem->gpd);
+ /* check if object is duplicated */
+ cache_elem->is_dup_ob = gpencil_check_ob_duplicated(
+ cache_array,
+ *gp_cache_used, ob_orig,
+ &cache_elem->data_idx);
+
+ if (!cache_elem->is_dup_ob) {
+ /* check if object reuse datablock */
+ cache_elem->is_dup_data = gpencil_check_datablock_duplicated(
+ cache_array, *gp_cache_used,
+ ob_orig, cache_elem->gpd);
+ if (cache_elem->is_dup_data) {
+ cache_elem->data_idx = gpencil_len_datablock_duplicated(
+ cache_array, *gp_cache_used,
+ ob_orig, cache_elem->gpd);
+
+ cache_elem->gpd->flag |= GP_DATA_CACHE_IS_DIRTY;
+ }
+ else {
+ cache_elem->data_idx = 0;
+ }
+ }
+ else {
+ cache_elem->is_dup_data = false;
+ }
/* save FXs */
cache_elem->pixfactor = cache_elem->gpd->pixfactor;
- cache_elem->shader_fx = ob->shader_fx;
+ cache_elem->shader_fx = ob_orig->shader_fx;
cache_elem->init_grp = 0;
cache_elem->end_grp = -1;
@@ -156,20 +201,13 @@ tGPencilObjectCache *gpencil_object_cache_add(
/* get current cache data */
static GpencilBatchCache *gpencil_batch_get_element(Object *ob)
{
- bGPdata *gpd = ob->data;
- if (gpd->runtime.batch_cache_data == NULL) {
- gpd->runtime.batch_cache_data = BLI_ghash_str_new("GP batch cache data");
- return NULL;
- }
-
- return (GpencilBatchCache *) BLI_ghash_lookup(gpd->runtime.batch_cache_data, ob->id.name);
+ Object *ob_orig = (Object *)DEG_get_original_id(&ob->id);
+ return ob_orig->runtime.gpencil_cache;
}
/* verify if cache is valid */
-static bool gpencil_batch_cache_valid(Object *ob, bGPdata *gpd, int cfra)
+static bool gpencil_batch_cache_valid(GpencilBatchCache *cache, bGPdata *gpd, int cfra)
{
- GpencilBatchCache *cache = gpencil_batch_get_element(ob);
-
if (cache == NULL) {
return false;
}
@@ -218,10 +256,12 @@ void gpencil_batch_cache_check_free_slots(Object *ob)
}
/* cache init */
-static void gpencil_batch_cache_init(Object *ob, int cfra)
+static GpencilBatchCache *gpencil_batch_cache_init(Object *ob, int cfra)
{
+ Object *ob_orig = (Object *)DEG_get_original_id(&ob->id);
+ bGPdata *gpd = (bGPdata *)ob_orig->data;
+
GpencilBatchCache *cache = gpencil_batch_get_element(ob);
- bGPdata *gpd = ob->data;
if (G.debug_value >= 664) {
printf("gpencil_batch_cache_init: %s\n", ob->id.name);
@@ -229,7 +269,7 @@ static void gpencil_batch_cache_init(Object *ob, int cfra)
if (!cache) {
cache = MEM_callocN(sizeof(*cache), __func__);
- BLI_ghash_insert(gpd->runtime.batch_cache_data, ob->id.name, cache);
+ ob_orig->runtime.gpencil_cache = cache;
}
else {
memset(cache, 0, sizeof(*cache));
@@ -247,6 +287,8 @@ static void gpencil_batch_cache_init(Object *ob, int cfra)
cache->cache_idx = 0;
cache->is_dirty = true;
cache->cache_frame = cfra;
+
+ return cache;
}
/* clear cache */
@@ -273,68 +315,53 @@ static void gpencil_batch_cache_clear(GpencilBatchCache *cache)
MEM_SAFE_FREE(cache->batch_edlin);
}
- MEM_SAFE_FREE(cache);
+ cache->cache_size = 0;
}
/* get cache */
GpencilBatchCache *gpencil_batch_cache_get(Object *ob, int cfra)
{
- bGPdata *gpd = ob->data;
+ Object *ob_orig = (Object *)DEG_get_original_id(&ob->id);
+ bGPdata *gpd = (bGPdata *)ob_orig->data;
- if (!gpencil_batch_cache_valid(ob, gpd, cfra)) {
+ GpencilBatchCache *cache = gpencil_batch_get_element(ob);
+ if (!gpencil_batch_cache_valid(cache, gpd, cfra)) {
if (G.debug_value >= 664) {
printf("gpencil_batch_cache: %s\n", gpd->id.name);
}
- GpencilBatchCache *cache = gpencil_batch_get_element(ob);
if (cache) {
gpencil_batch_cache_clear(cache);
- BLI_ghash_remove(gpd->runtime.batch_cache_data, ob->id.name, NULL, NULL);
}
- gpencil_batch_cache_init(ob, cfra);
+ return gpencil_batch_cache_init(ob, cfra);
+ }
+ else {
+ return cache;
}
-
- return gpencil_batch_get_element(ob);
}
/* set cache as dirty */
void DRW_gpencil_batch_cache_dirty_tag(bGPdata *gpd)
{
- if (gpd->runtime.batch_cache_data == NULL) {
- return;
- }
-
- GHashIterator *ihash = BLI_ghashIterator_new(gpd->runtime.batch_cache_data);
- while (!BLI_ghashIterator_done(ihash)) {
- GpencilBatchCache *cache = (GpencilBatchCache *)BLI_ghashIterator_getValue(ihash);
- if (cache) {
- cache->is_dirty = true;
- }
- BLI_ghashIterator_step(ihash);
- }
- BLI_ghashIterator_free(ihash);
+ bGPdata *gpd_orig = (bGPdata *)DEG_get_original_id(&gpd->id);
+ gpd_orig->flag |= GP_DATA_CACHE_IS_DIRTY;
}
/* free batch cache */
-void DRW_gpencil_batch_cache_free(bGPdata *gpd)
+void DRW_gpencil_batch_cache_free(bGPdata *UNUSED(gpd))
{
- if (gpd->runtime.batch_cache_data == NULL) {
- return;
- }
+ return;
+}
- GHashIterator *ihash = BLI_ghashIterator_new(gpd->runtime.batch_cache_data);
- while (!BLI_ghashIterator_done(ihash)) {
- GpencilBatchCache *cache = (GpencilBatchCache *)BLI_ghashIterator_getValue(ihash);
- if (cache) {
- gpencil_batch_cache_clear(cache);
+/* wrapper to clear cache */
+void DRW_gpencil_freecache(struct Object *ob)
+{
+ if ((ob) && (ob->type == OB_GPENCIL)) {
+ gpencil_batch_cache_clear(ob->runtime.gpencil_cache);
+ MEM_SAFE_FREE(ob->runtime.gpencil_cache);
+ bGPdata *gpd = (bGPdata *)ob->data;
+ if (gpd) {
+ gpd->flag |= GP_DATA_CACHE_IS_DIRTY;
}
- BLI_ghashIterator_step(ihash);
- }
- BLI_ghashIterator_free(ihash);
-
- /* free hash */
- if (gpd->runtime.batch_cache_data) {
- BLI_ghash_free(gpd->runtime.batch_cache_data, NULL, NULL);
- gpd->runtime.batch_cache_data = NULL;
}
}
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index edb8f4433c9..f255892de44 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -358,9 +358,9 @@ GPUBatch *DRW_gpencil_get_buffer_fill_geom(bGPdata *gpd)
float (*points2d)[2] = MEM_mallocN(sizeof(*points2d) * totpoints, __func__);
/* Convert points to array and triangulate
- * Here a cache is not used because while drawing the information changes all the time, so the cache
- * would be recalculated constantly, so it is better to do direct calculation for each function call
- */
+ * Here a cache is not used because while drawing the information changes all the time, so the cache
+ * would be recalculated constantly, so it is better to do direct calculation for each function call
+ */
for (int i = 0; i < totpoints; i++) {
const tGPspoint *pt = &points[i];
points2d[i][0] = pt->x;
@@ -414,7 +414,7 @@ GPUBatch *DRW_gpencil_get_fill_geom(Object *ob, bGPDstroke *gps, const float col
/* Calculate triangles cache for filling area (must be done only after changes) */
if ((gps->flag & GP_STROKE_RECALC_CACHES) || (gps->tot_triangles == 0) || (gps->triangles == NULL)) {
- DRW_gpencil_triangulate_stroke_fill(gps);
+ DRW_gpencil_triangulate_stroke_fill(ob, gps);
ED_gpencil_calc_stroke_uv(ob, gps);
}
@@ -460,10 +460,10 @@ GPUBatch *DRW_gpencil_get_edit_geom(bGPDstroke *gps, float alpha, short dflag)
}
/* Get size of verts:
- * - The selected state needs to be larger than the unselected state so that
- * they stand out more.
- * - We use the theme setting for size of the unselected verts
- */
+ * - The selected state needs to be larger than the unselected state so that
+ * they stand out more.
+ * - We use the theme setting for size of the unselected verts
+ */
float bsize = UI_GetThemeValuef(TH_GP_VERTEX_SIZE);
float vsize;
if ((int)bsize > 8) {
@@ -479,6 +479,10 @@ GPUBatch *DRW_gpencil_get_edit_geom(bGPDstroke *gps, float alpha, short dflag)
UI_GetThemeColor3fv(TH_GP_VERTEX_SELECT, selectColor);
selectColor[3] = alpha;
+ float unselectColor[4];
+ UI_GetThemeColor3fv(TH_GP_VERTEX, unselectColor);
+ unselectColor[3] = alpha;
+
static GPUVertFormat format = { 0 };
static uint pos_id, color_id, size_id;
if (format.attr_len == 0) {
@@ -503,7 +507,7 @@ GPUBatch *DRW_gpencil_get_edit_geom(bGPDstroke *gps, float alpha, short dflag)
for (int i = 0; i < gps->totpoints; i++, pt++) {
/* weight paint */
if (is_weight_paint) {
- float weight = gps->dvert ? defvert_find_weight(dvert, vgindex) : 0.0f;
+ float weight = (dvert && dvert->dw) ? defvert_find_weight(dvert, vgindex) : 0.0f;
float hue = 2.0f * (1.0f - weight) / 3.0f;
hsv_to_rgb(hue, 1.0f, 1.0f, &selectColor[0], &selectColor[1], &selectColor[2]);
selectColor[3] = 1.0f;
@@ -526,7 +530,7 @@ GPUBatch *DRW_gpencil_get_edit_geom(bGPDstroke *gps, float alpha, short dflag)
fsize = vsize;
}
else {
- copy_v4_v4(fcolor, gps->runtime.tmp_stroke_rgba);
+ copy_v4_v4(fcolor, unselectColor);
fsize = bsize;
}
}
@@ -581,7 +585,7 @@ GPUBatch *DRW_gpencil_get_edlin_geom(bGPDstroke *gps, float alpha, short UNUSED(
for (int i = 0; i < gps->totpoints; i++, pt++) {
/* weight paint */
if (is_weight_paint) {
- float weight = gps->dvert ? defvert_find_weight(dvert, vgindex) : 0.0f;
+ float weight = (dvert && dvert->dw) ? defvert_find_weight(dvert, vgindex) : 0.0f;
float hue = 2.0f * (1.0f - weight) / 3.0f;
hsv_to_rgb(hue, 1.0f, 1.0f, &selectColor[0], &selectColor[1], &selectColor[2]);
selectColor[3] = 1.0f;
@@ -611,91 +615,71 @@ GPUBatch *DRW_gpencil_get_edlin_geom(bGPDstroke *gps, float alpha, short UNUSED(
static void set_grid_point(
GPUVertBuf *vbo, int idx, float col_grid[4],
uint pos_id, uint color_id,
- float v1, float v2, int axis)
+ float v1, float v2, const int axis)
{
GPU_vertbuf_attr_set(vbo, color_id, idx, col_grid);
float pos[3];
- /* Set the grid in the selected axis (default is always Y axis) */
- if (axis & V3D_GP_GRID_AXIS_X) {
- pos[0] = 0.0f;
- pos[1] = v1;
- pos[2] = v2;
- }
- else if (axis & V3D_GP_GRID_AXIS_Z) {
- pos[0] = v1;
- pos[1] = v2;
- pos[2] = 0.0f;
- }
- else {
- pos[0] = v1;
- pos[1] = 0.0f;
- pos[2] = v2;
+ /* Set the grid in the selected axis */
+ switch (axis) {
+ case GP_LOCKAXIS_X:
+ {
+ ARRAY_SET_ITEMS(pos, 0.0f, v1, v2);
+ break;
+ }
+ case GP_LOCKAXIS_Y:
+ {
+ ARRAY_SET_ITEMS(pos, v1, 0.0f, v2);
+ break;
+ }
+ case GP_LOCKAXIS_Z:
+ default: /* view aligned */
+ {
+ ARRAY_SET_ITEMS(pos, v1, v2, 0.0f);
+ break;
+ }
}
-
-
GPU_vertbuf_attr_set(vbo, pos_id, idx, pos);
}
/* Draw grid lines */
-GPUBatch *DRW_gpencil_get_grid(void)
+GPUBatch *DRW_gpencil_get_grid(Object *ob)
{
const DRWContextState *draw_ctx = DRW_context_state_get();
Scene *scene = draw_ctx->scene;
ToolSettings *ts = scene->toolsettings;
View3D *v3d = draw_ctx->v3d;
+ bGPdata *gpd = (bGPdata *)ob->data;
+ const bool do_center = (gpd->grid.lines <= 0) ? false : true;
float col_grid[4];
/* verify we have something to draw and valid values */
- if (v3d->overlay.gpencil_grid_lines < 1) {
- v3d->overlay.gpencil_grid_lines = GP_DEFAULT_GRID_LINES;
+ if (gpd->grid.scale[0] == 0.0f) {
+ gpd->grid.scale[0] = 1.0f;
}
-
- if (v3d->overlay.gpencil_grid_scale == 0.0f) {
- v3d->overlay.gpencil_grid_scale = 1.0f;
+ if (gpd->grid.scale[1] == 0.0f) {
+ gpd->grid.scale[1] = 1.0f;
}
if (v3d->overlay.gpencil_grid_opacity < 0.1f) {
v3d->overlay.gpencil_grid_opacity = 0.1f;
}
- UI_GetThemeColor3fv(TH_GRID, col_grid);
+ /* set color */
+ copy_v3_v3(col_grid, gpd->grid.color);
col_grid[3] = v3d->overlay.gpencil_grid_opacity;
- /* if use locked axis, copy value */
- int axis = v3d->overlay.gpencil_grid_axis;
- if ((v3d->overlay.gpencil_grid_axis & V3D_GP_GRID_AXIS_LOCK) == 0) {
-
- axis = v3d->overlay.gpencil_grid_axis;
- }
- else {
- switch (ts->gp_sculpt.lock_axis) {
- case GP_LOCKAXIS_X:
- {
- axis = V3D_GP_GRID_AXIS_X;
- break;
- }
- case GP_LOCKAXIS_NONE:
- case GP_LOCKAXIS_Y:
- {
- axis = V3D_GP_GRID_AXIS_Y;
- break;
- }
- case GP_LOCKAXIS_Z:
- {
- axis = V3D_GP_GRID_AXIS_Z;
- break;
- }
- }
- }
+ const int axis = ts->gp_sculpt.lock_axis;
const char *grid_unit = NULL;
- const int gridlines = v3d->overlay.gpencil_grid_lines;
- const float grid_scale = v3d->overlay.gpencil_grid_scale * ED_scene_grid_scale(scene, &grid_unit);
- const float grid = grid_scale;
- const float space = (grid_scale / gridlines);
+ const int gridlines = (gpd->grid.lines <= 0) ? 1 : gpd->grid.lines;
+ const float grid_w = gpd->grid.scale[0] * ED_scene_grid_scale(scene, &grid_unit);
+ const float grid_h = gpd->grid.scale[1] * ED_scene_grid_scale(scene, &grid_unit);
+ const float space_w = (grid_w / gridlines);
+ const float space_h = (grid_h / gridlines);
+ const float offset[2] = { gpd->grid.offset[0], gpd->grid.offset[1] };
const uint vertex_len = 2 * (gridlines * 4 + 2);
@@ -712,36 +696,38 @@ GPUBatch *DRW_gpencil_get_grid(void)
int idx = 0;
for (int a = 1; a <= gridlines; a++) {
- const float line = a * space;
+ const float line_w = a * space_w;
+ const float line_h = a * space_h;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid, -line, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid_w + offset[0], -line_h + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid, -line, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid_w + offset[0], -line_h + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid, +line, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid_w + offset[0], +line_h + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid, +line, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid_w + offset[0], +line_h + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, -line, -grid, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, -line_w + offset[0], -grid_h + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, -line, +grid, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, -line_w + offset[0], +grid_h + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, +line, -grid, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, +line_w + offset[0], -grid_h + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, +line, +grid, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, +line_w + offset[0], +grid_h + offset[1], axis);
idx++;
}
/* center lines */
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid, 0.0f, axis);
- idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid, 0.0f, axis);
- idx++;
-
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, 0.0f, -grid, axis);
- idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, 0.0f, +grid, axis);
- idx++;
+ if (do_center) {
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid_w + offset[0], 0.0f + offset[1], axis);
+ idx++;
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid_w + offset[0], 0.0f + offset[1], axis);
+ idx++;
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, 0.0f + offset[0], -grid_h + offset[1], axis);
+ idx++;
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, 0.0f + offset[0], +grid_h + offset[1], axis);
+ idx++;
+ }
return GPU_batch_create_ex(GPU_PRIM_LINES, vbo, NULL, GPU_BATCH_OWNS_VBO);
}
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
index 2dce51fc0ad..ae62e61c5c1 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
@@ -33,6 +33,7 @@
#include "BKE_gpencil_modifier.h"
#include "BKE_image.h"
#include "BKE_material.h"
+#include "BKE_paint.h"
#include "ED_gpencil.h"
#include "ED_view3d.h"
@@ -62,6 +63,8 @@
#define TEXTURE 4
#define PATTERN 5
+#define GP_SET_SRC_GPS(src_gps) if (src_gps) src_gps = src_gps->next
+
/* Helper for doing all the checks on whether a stroke can be drawn */
static bool gpencil_can_draw_stroke(
struct MaterialGPencilStyle *gp_style, const bGPDstroke *gps,
@@ -90,7 +93,7 @@ static bool gpencil_can_draw_stroke(
/* calc bounding box in 2d using flat projection data */
static void gpencil_calc_2d_bounding_box(
- const float(*points2d)[2], int totpoints, float minv[2], float maxv[2], bool expand)
+ const float(*points2d)[2], int totpoints, float minv[2], float maxv[2])
{
minv[0] = points2d[0][0];
minv[1] = points2d[0][1];
@@ -113,14 +116,12 @@ static void gpencil_calc_2d_bounding_box(
maxv[1] = points2d[i][1];
}
}
- /* If not expanded, use a perfect square */
- if (expand == false) {
- if (maxv[0] > maxv[1]) {
- maxv[1] = maxv[0];
- }
- else {
- maxv[0] = maxv[1];
- }
+ /* use a perfect square */
+ if (maxv[0] > maxv[1]) {
+ maxv[1] = maxv[0];
+ }
+ else {
+ maxv[0] = maxv[1];
}
}
@@ -182,10 +183,12 @@ static void gpencil_stroke_2d_flat(const bGPDspoint *points, int totpoints, floa
}
/* Triangulate stroke for high quality fill (this is done only if cache is null or stroke was modified) */
-void DRW_gpencil_triangulate_stroke_fill(bGPDstroke *gps)
+void DRW_gpencil_triangulate_stroke_fill(Object *ob, bGPDstroke *gps)
{
BLI_assert(gps->totpoints >= 3);
+ bGPdata *gpd = (bGPdata *)ob->data;
+
/* allocate memory for temporary areas */
gps->tot_triangles = gps->totpoints - 2;
uint(*tmp_triangles)[3] = MEM_mallocN(sizeof(*tmp_triangles) * gps->tot_triangles, "GP Stroke temp triangulation");
@@ -202,7 +205,14 @@ void DRW_gpencil_triangulate_stroke_fill(bGPDstroke *gps)
float minv[2];
float maxv[2];
/* first needs bounding box data */
- gpencil_calc_2d_bounding_box(points2d, gps->totpoints, minv, maxv, false);
+ if (gpd->flag & GP_DATA_UV_ADAPTATIVE) {
+ gpencil_calc_2d_bounding_box(points2d, gps->totpoints, minv, maxv);
+ }
+ else {
+ ARRAY_SET_ITEMS(minv, -1.0f, -1.0f);
+ ARRAY_SET_ITEMS(maxv, 1.0f, 1.0f);
+ }
+
/* calc uv data */
gpencil_calc_stroke_fill_uv(points2d, gps->totpoints, minv, maxv, uv);
@@ -254,7 +264,7 @@ static void DRW_gpencil_recalc_geometry_caches(Object *ob, MaterialGPencilStyle
if ((gps->totpoints > 2) &&
((gp_style->fill_rgba[3] > GPENCIL_ALPHA_OPACITY_THRESH) || (gp_style->fill_style > 0)))
{
- DRW_gpencil_triangulate_stroke_fill(gps);
+ DRW_gpencil_triangulate_stroke_fill(ob, gps);
}
}
@@ -378,7 +388,6 @@ DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(
DRW_shgroup_uniform_vec2(grp, "Viewport", viewport_size, 1);
DRW_shgroup_uniform_float(grp, "pixsize", stl->storage->pixsize, 1);
- DRW_shgroup_uniform_float(grp, "pixelsize", &U.pixelsize, 1);
/* avoid wrong values */
if ((gpd) && (gpd->pixfactor == 0)) {
@@ -387,7 +396,7 @@ DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(
/* object scale and depth */
if ((ob) && (id > -1)) {
- stl->shgroups[id].obj_scale = (ob->size[0] + ob->size[1] + ob->size[2]) / 3.0f;
+ stl->shgroups[id].obj_scale = mat4_to_scale(ob->obmat);
DRW_shgroup_uniform_float(grp, "objscale", &stl->shgroups[id].obj_scale, 1);
stl->shgroups[id].keep_size = (int)((gpd) && (gpd->flag & GP_DATA_STROKE_KEEPTHICKNESS));
DRW_shgroup_uniform_int(grp, "keep_size", &stl->shgroups[id].keep_size, 1);
@@ -468,7 +477,6 @@ static DRWShadingGroup *DRW_gpencil_shgroup_point_create(
DRW_shgroup_uniform_vec2(grp, "Viewport", viewport_size, 1);
DRW_shgroup_uniform_float(grp, "pixsize", stl->storage->pixsize, 1);
- DRW_shgroup_uniform_float(grp, "pixelsize", &U.pixelsize, 1);
/* avoid wrong values */
if ((gpd) && (gpd->pixfactor == 0)) {
@@ -477,7 +485,7 @@ static DRWShadingGroup *DRW_gpencil_shgroup_point_create(
/* object scale and depth */
if ((ob) && (id > -1)) {
- stl->shgroups[id].obj_scale = (ob->size[0] + ob->size[1] + ob->size[2]) / 3.0f;
+ stl->shgroups[id].obj_scale = mat4_to_scale(ob->obmat);
DRW_shgroup_uniform_float(grp, "objscale", &stl->shgroups[id].obj_scale, 1);
stl->shgroups[id].keep_size = (int)((gpd) && (gpd->flag & GP_DATA_STROKE_KEEPTHICKNESS));
DRW_shgroup_uniform_int(grp, "keep_size", &stl->shgroups[id].keep_size, 1);
@@ -552,7 +560,7 @@ static DRWShadingGroup *DRW_gpencil_shgroup_point_create(
/* add fill shading group to pass */
static void gpencil_add_fill_shgroup(
GpencilBatchCache *cache, DRWShadingGroup *fillgrp,
- Object *ob, bGPDlayer *UNUSED(gpl), bGPDframe *gpf, bGPDstroke *gps,
+ Object *ob, bGPDframe *gpf, bGPDstroke *gps,
float opacity, const float tintcolor[4], const bool onion, const bool custonion)
{
MaterialGPencilStyle *gp_style = BKE_material_gpencil_settings_get(ob, gps->mat_nr + 1);
@@ -562,23 +570,24 @@ static void gpencil_add_fill_shgroup(
interp_v3_v3v3(tfill, gps->runtime.tmp_fill_rgba, tintcolor, tintcolor[3]);
tfill[3] = gps->runtime.tmp_fill_rgba[3] * opacity;
if ((tfill[3] > GPENCIL_ALPHA_OPACITY_THRESH) || (gp_style->fill_style > 0)) {
- const float *color;
- if (!onion) {
- color = tfill;
- }
- else {
- if (custonion) {
- color = tintcolor;
+ if (cache->is_dirty) {
+ const float *color;
+ if (!onion) {
+ color = tfill;
}
else {
- ARRAY_SET_ITEMS(tfill, UNPACK3(gps->runtime.tmp_fill_rgba), tintcolor[3]);
- color = tfill;
+ if (custonion) {
+ color = tintcolor;
+ }
+ else {
+ ARRAY_SET_ITEMS(tfill, UNPACK3(gps->runtime.tmp_fill_rgba), tintcolor[3]);
+ color = tfill;
+ }
}
- }
- if (cache->is_dirty) {
gpencil_batch_cache_check_free_slots(ob);
cache->batch_fill[cache->cache_idx] = DRW_gpencil_get_fill_geom(ob, gps, color);
}
+
DRW_shgroup_call_add(fillgrp, cache->batch_fill[cache->cache_idx], gpf->runtime.viewmatrix);
}
}
@@ -596,31 +605,31 @@ static void gpencil_add_stroke_shgroup(GpencilBatchCache *cache, DRWShadingGroup
MaterialGPencilStyle *gp_style = BKE_material_gpencil_settings_get(ob, gps->mat_nr + 1);
/* set color using base color, tint color and opacity */
- if (!onion) {
- /* if special stroke, use fill color as stroke color */
- if (gps->flag & GP_STROKE_NOFILL) {
- interp_v3_v3v3(tcolor, gps->runtime.tmp_fill_rgba, tintcolor, tintcolor[3]);
- tcolor[3] = gps->runtime.tmp_fill_rgba[3] * opacity;
- }
- else {
- interp_v3_v3v3(tcolor, gps->runtime.tmp_stroke_rgba, tintcolor, tintcolor[3]);
- tcolor[3] = gps->runtime.tmp_stroke_rgba[3] * opacity;
- }
- copy_v4_v4(ink, tcolor);
- }
- else {
- if (custonion) {
- copy_v4_v4(ink, tintcolor);
+ if (cache->is_dirty) {
+ if (!onion) {
+ /* if special stroke, use fill color as stroke color */
+ if (gps->flag & GP_STROKE_NOFILL) {
+ interp_v3_v3v3(tcolor, gps->runtime.tmp_fill_rgba, tintcolor, tintcolor[3]);
+ tcolor[3] = gps->runtime.tmp_fill_rgba[3] * opacity;
+ }
+ else {
+ interp_v3_v3v3(tcolor, gps->runtime.tmp_stroke_rgba, tintcolor, tintcolor[3]);
+ tcolor[3] = gps->runtime.tmp_stroke_rgba[3] * opacity;
+ }
+ copy_v4_v4(ink, tcolor);
}
else {
- ARRAY_SET_ITEMS(tcolor, UNPACK3(gps->runtime.tmp_stroke_rgba), opacity);
- copy_v4_v4(ink, tcolor);
+ if (custonion) {
+ copy_v4_v4(ink, tintcolor);
+ }
+ else {
+ ARRAY_SET_ITEMS(tcolor, UNPACK3(gps->runtime.tmp_stroke_rgba), opacity);
+ copy_v4_v4(ink, tcolor);
+ }
}
- }
- sthickness = gps->thickness + gpl->line_change;
- CLAMP_MIN(sthickness, 1);
- if (cache->is_dirty) {
+ sthickness = gps->thickness + gpl->line_change;
+ CLAMP_MIN(sthickness, 1);
gpencil_batch_cache_check_free_slots(ob);
if ((gps->totpoints > 1) && (gp_style->mode == GP_STYLE_MODE_LINE)) {
cache->batch_stroke[cache->cache_idx] = DRW_gpencil_get_stroke_geom(gps, sthickness, ink);
@@ -796,10 +805,12 @@ static void gpencil_draw_strokes(
/* check if stroke can be drawn */
if (gpencil_can_draw_stroke(gp_style, gps, false, is_mat_preview) == false) {
+ GP_SET_SRC_GPS(src_gps);
continue;
}
/* limit the number of shading groups */
if (stl->storage->shgroup_id >= GPENCIL_MAX_SHGROUPS) {
+ GP_SET_SRC_GPS(src_gps);
continue;
}
@@ -814,6 +825,7 @@ static void gpencil_draw_strokes(
if ((gp_style->fill_rgba[3] > GPENCIL_ALPHA_OPACITY_THRESH) ||
(gp_style->fill_style > GP_STYLE_FILL_STYLE_SOLID))
{
+ GP_SET_SRC_GPS(src_gps);
continue;
}
}
@@ -825,7 +837,8 @@ static void gpencil_draw_strokes(
if (gps->totpoints > 0) {
if ((gps->totpoints > 2) && (!stl->storage->simplify_fill) &&
((gp_style->fill_rgba[3] > GPENCIL_ALPHA_OPACITY_THRESH) || (gp_style->fill_style > 0)) &&
- ((gps->flag & GP_STROKE_NOFILL) == 0))
+ ((gps->flag & GP_STROKE_NOFILL) == 0) &&
+ (gp_style->flag & GP_STYLE_FILL_SHOW))
{
stl->shgroups[id].shgrps_fill = DRW_gpencil_shgroup_fill_create(
e_data, vedata, psl->stroke_pass, e_data->gpencil_fill_sh, gpd, gp_style, id);
@@ -865,14 +878,15 @@ static void gpencil_draw_strokes(
/* fill */
if ((fillgrp) && (!stl->storage->simplify_fill)) {
gpencil_add_fill_shgroup(
- cache, fillgrp, ob, gpl, derived_gpf, gps,
- opacity, tintcolor, false, custonion);
+ cache, fillgrp, ob, derived_gpf, gps,
+ opacity, tintcolor, false, custonion);
}
/* stroke */
if (strokegrp) {
+ const float nop = ((gp_style->flag & GP_STYLE_STROKE_SHOW) == 0) || (gp_style->stroke_rgba[3] < GPENCIL_ALPHA_OPACITY_THRESH) ? 0.0f : opacity;
gpencil_add_stroke_shgroup(
cache, strokegrp, ob, gpl, derived_gpf, gps,
- opacity, tintcolor, false, custonion);
+ nop, tintcolor, false, custonion);
}
}
@@ -880,21 +894,24 @@ static void gpencil_draw_strokes(
if ((draw_ctx->obact == ob) && (src_gps) &&
(!playing) && (!is_render) && (!cache_ob->is_dup_ob))
{
- if (!stl->g_data->shgrps_edit_line) {
- stl->g_data->shgrps_edit_line = DRW_shgroup_create(e_data->gpencil_line_sh, psl->edit_pass);
+ if ((gpl->flag & GP_LAYER_LOCKED) == 0) {
+ if (!stl->g_data->shgrps_edit_line) {
+ stl->g_data->shgrps_edit_line = DRW_shgroup_create(e_data->gpencil_line_sh, psl->edit_pass);
+ }
+ if (!stl->g_data->shgrps_edit_point) {
+ stl->g_data->shgrps_edit_point = DRW_shgroup_create(e_data->gpencil_edit_point_sh, psl->edit_pass);
+ const float *viewport_size = DRW_viewport_size_get();
+ DRW_shgroup_uniform_vec2(stl->g_data->shgrps_edit_point, "Viewport", viewport_size, 1);
+ }
+
+ gpencil_add_editpoints_shgroup(stl, cache, ts, ob, gpd, gpl, derived_gpf, src_gps);
}
- if (!stl->g_data->shgrps_edit_point) {
- stl->g_data->shgrps_edit_point = DRW_shgroup_create(e_data->gpencil_edit_point_sh, psl->edit_pass);
- const float *viewport_size = DRW_viewport_size_get();
- DRW_shgroup_uniform_vec2(stl->g_data->shgrps_edit_point, "Viewport", viewport_size, 1);
+ else {
+ gpencil_batch_cache_check_free_slots(ob);
}
-
- gpencil_add_editpoints_shgroup(stl, cache, ts, ob, gpd, gpl, derived_gpf, src_gps);
}
- if (src_gps) {
- src_gps = src_gps->next;
- }
+ GP_SET_SRC_GPS(src_gps);
cache->cache_idx++;
}
@@ -905,11 +922,14 @@ void DRW_gpencil_populate_buffer_strokes(GPENCIL_e_data *e_data, void *vedata, T
{
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
- Brush *brush = BKE_brush_getactive_gpencil(ts);
- bGPdata *gpd = ob->data;
+ Brush *brush = BKE_paint_brush(&ts->gp_paint->paint);
+ bGPdata *gpd_eval = ob->data;
+ /* need the original to avoid cow overhead while drawing */
+ bGPdata *gpd = (bGPdata *)DEG_get_original_id(&gpd_eval->id);
+
MaterialGPencilStyle *gp_style = NULL;
- float obscale = (ob->size[0] + ob->size[1] + ob->size[2]) / 3.0f;
+ float obscale = mat4_to_scale(ob->obmat);
/* use the brush material */
Material *ma = BKE_gpencil_get_material_from_brush(brush);
@@ -928,8 +948,8 @@ void DRW_gpencil_populate_buffer_strokes(GPENCIL_e_data *e_data, void *vedata, T
if (ED_gpencil_session_active() && (gpd->runtime.sbuffer_size > 0)) {
if ((gpd->runtime.sbuffer_sflag & GP_STROKE_ERASER) == 0) {
/* It should also be noted that sbuffer contains temporary point types
- * i.e. tGPspoints NOT bGPDspoints
- */
+ * i.e. tGPspoints NOT bGPDspoints
+ */
short lthick = brush->size * obscale;
/* if only one point, don't need to draw buffer because the user has no time to see it */
if (gpd->runtime.sbuffer_size > 1) {
@@ -959,13 +979,18 @@ void DRW_gpencil_populate_buffer_strokes(GPENCIL_e_data *e_data, void *vedata, T
gpd, lthick);
}
- DRW_shgroup_call_add(
- stl->g_data->shgrps_drawing_stroke,
- e_data->batch_buffer_stroke,
- stl->storage->unit_matrix);
+ if (gp_style->flag & GP_STYLE_STROKE_SHOW) {
+ DRW_shgroup_call_add(
+ stl->g_data->shgrps_drawing_stroke,
+ e_data->batch_buffer_stroke,
+ stl->storage->unit_matrix);
+ }
- if ((gpd->runtime.sbuffer_size >= 3) && (gpd->runtime.sfill[3] > GPENCIL_ALPHA_OPACITY_THRESH) &&
- ((gpd->runtime.sbuffer_sflag & GP_STROKE_NOFILL) == 0))
+ if ((gpd->runtime.sbuffer_size >= 3) &&
+ (gpd->runtime.sfill[3] > GPENCIL_ALPHA_OPACITY_THRESH) &&
+ ((gpd->runtime.sbuffer_sflag & GP_STROKE_NOFILL) == 0) &&
+ ((brush->gpencil_settings->flag & GP_BRUSH_DISSABLE_LASSO) == 0) &&
+ (gp_style->flag & GP_STYLE_FILL_SHOW))
{
/* if not solid, fill is simulated with solid color */
if (gpd->runtime.bfill_style > 0) {
@@ -1190,7 +1215,7 @@ void DRW_gpencil_populate_multiedit(
}
}
else {
- gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, 0);
+ gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, GP_GETFRAME_USE_PREV);
if (gpf) {
gpencil_draw_strokes(
cache, e_data, vedata, ts, ob, gpd, gpl, gpf, gpf,
@@ -1203,6 +1228,24 @@ void DRW_gpencil_populate_multiedit(
cache->is_dirty = false;
}
+static void gpencil_copy_frame(bGPDframe *gpf, bGPDframe *derived_gpf)
+{
+ derived_gpf->prev = gpf->prev;
+ derived_gpf->next = gpf->next;
+ derived_gpf->framenum = gpf->framenum;
+ derived_gpf->flag = gpf->flag;
+ derived_gpf->key_type = gpf->key_type;
+ derived_gpf->runtime = gpf->runtime;
+
+ /* copy strokes */
+ BLI_listbase_clear(&derived_gpf->strokes);
+ for (bGPDstroke *gps_src = gpf->strokes.first; gps_src; gps_src = gps_src->next) {
+ /* make copy of source stroke */
+ bGPDstroke *gps_dst = BKE_gpencil_stroke_duplicate(gps_src);
+ BLI_addtail(&derived_gpf->strokes, gps_dst);
+ }
+}
+
/* helper for populate a complete grease pencil datablock */
void DRW_gpencil_populate_datablock(
GPENCIL_e_data *e_data, void *vedata,
@@ -1211,15 +1254,25 @@ void DRW_gpencil_populate_datablock(
{
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
const DRWContextState *draw_ctx = DRW_context_state_get();
- bGPdata *gpd = (bGPdata *)ob->data;
+ const ViewLayer *view_layer = DEG_get_evaluated_view_layer(draw_ctx->depsgraph);
+
+ bGPdata *gpd_eval = (bGPdata *)ob->data;
+ bGPdata *gpd = (bGPdata *)DEG_get_original_id(&gpd_eval->id);
+
View3D *v3d = draw_ctx->v3d;
int cfra_eval = (int)DEG_get_ctime(draw_ctx->depsgraph);
ToolSettings *ts = scene->toolsettings;
+
bGPDframe *derived_gpf = NULL;
const bool main_onion = v3d != NULL ? (v3d->gp_flag & V3D_GP_SHOW_ONION_SKIN) : true;
const bool do_onion = (bool)((gpd->flag & GP_DATA_STROKE_WEIGHTMODE) == 0) && main_onion;
const bool overlay = v3d != NULL ? (bool)((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) : true;
+ const bool time_remap = BKE_gpencil_has_time_modifiers(ob);
+
float opacity;
+ bGPDframe *p = NULL;
+ bGPDframe *gpf = NULL;
+ bGPDlayer *gpl_active = BKE_gpencil_layer_getactive(gpd);
/* check if playing animation */
bool playing = stl->storage->is_playing;
@@ -1239,67 +1292,78 @@ void DRW_gpencil_populate_datablock(
if (gpl->flag & GP_LAYER_HIDE)
continue;
- bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, 0);
+ /* filter view layer to gp layers in the same view layer (for compo) */
+ if ((stl->storage->is_render) && (gpl->viewlayername[0] != '\0')) {
+ if (!STREQ(view_layer->name, gpl->viewlayername)) {
+ continue;
+ }
+ }
+
+ if ((!time_remap) || (stl->storage->simplify_modif)) {
+ gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, GP_GETFRAME_USE_PREV);
+ }
+ else {
+ int remap_cfra = BKE_gpencil_time_modifier(
+ draw_ctx->depsgraph, scene, ob, gpl, cfra_eval,
+ stl->storage->is_render);
+
+ gpf = BKE_gpencil_layer_getframe(gpl, remap_cfra, GP_GETFRAME_USE_PREV);
+ }
if (gpf == NULL)
continue;
+ opacity = gpl->opacity;
/* if pose mode, maybe the overlay to fade geometry is enabled */
if ((draw_ctx->obact) && (draw_ctx->object_mode == OB_MODE_POSE) &&
- (v3d->overlay.flag & V3D_OVERLAY_BONE_SELECT))
+ (v3d->overlay.flag & V3D_OVERLAY_BONE_SELECT))
{
- opacity = gpl->opacity * v3d->overlay.bone_select_alpha;
+ opacity = opacity * v3d->overlay.bone_select_alpha;
}
- else {
- opacity = gpl->opacity;
- }
-
- /* create GHash if need */
- if (gpl->runtime.derived_data == NULL) {
- gpl->runtime.derived_data = (GHash *)BLI_ghash_str_new(gpl->info);
+ /* fade no active layers */
+ if ((overlay) && (draw_ctx->object_mode == OB_MODE_GPENCIL_PAINT) &&
+ (v3d->gp_flag & V3D_GP_FADE_NOACTIVE_LAYERS) &&
+ (draw_ctx->obact) && (draw_ctx->obact == ob) &&
+ (gpl != gpl_active))
+ {
+ opacity = opacity * v3d->overlay.gpencil_fade_layer;
}
- if (BLI_ghash_haskey(gpl->runtime.derived_data, ob->id.name)) {
- derived_gpf = BLI_ghash_lookup(gpl->runtime.derived_data, ob->id.name);
- }
- else {
- /* verify we have frame duplicated already */
- if (cache_ob->is_dup_ob) {
- continue;
+ /* create derived array data or expand */
+ if (cache_ob->data_idx + 1 > gpl->runtime.len_derived) {
+ if ((gpl->runtime.len_derived == 0) ||
+ (gpl->runtime.derived_array == NULL))
+ {
+ p = MEM_callocN(sizeof(struct bGPDframe), "bGPDframe array");
+ gpl->runtime.len_derived = 1;
}
- derived_gpf = NULL;
- }
+ else {
+ gpl->runtime.len_derived++;
+ p = MEM_recallocN(gpl->runtime.derived_array, sizeof(struct bGPDframe) * gpl->runtime.len_derived);
+ }
+ gpl->runtime.derived_array = p;
- if (derived_gpf == NULL) {
- cache->is_dirty = true;
+ derived_gpf = &gpl->runtime.derived_array[cache_ob->data_idx];
}
- if ((!cache_ob->is_dup_ob) && (cache->is_dirty)) {
+
+ derived_gpf = &gpl->runtime.derived_array[cache_ob->data_idx];
+
+ /* if no derived frame or dirty cache, create a new one */
+ if ((derived_gpf == NULL) || (cache->is_dirty)) {
if (derived_gpf != NULL) {
/* first clear temp data */
- if (BLI_ghash_haskey(gpl->runtime.derived_data, ob->id.name)) {
- BLI_ghash_remove(gpl->runtime.derived_data, ob->id.name, NULL, NULL);
- }
-
BKE_gpencil_free_frame_runtime_data(derived_gpf);
}
- /* create new data */
- derived_gpf = BKE_gpencil_frame_duplicate(gpf);
- if (!BLI_ghash_haskey(gpl->runtime.derived_data, ob->id.name)) {
- BLI_ghash_insert(gpl->runtime.derived_data, ob->id.name, derived_gpf);
- }
- else {
- BLI_ghash_reinsert(gpl->runtime.derived_data, ob->id.name, derived_gpf, NULL, NULL);
- }
+ /* create new data (do not assign new memory)*/
+ gpencil_copy_frame(gpf, derived_gpf);
}
+
/* draw onion skins */
if (!ID_IS_LINKED(&gpd->id)) {
- ID *orig_id = gpd->id.orig_id;
- /* GPXX: Now only a datablock with one use is allowed to be compatible
- * with instances
- */
- if ((!cache_ob->is_dup_onion) && (gpd->flag & GP_DATA_SHOW_ONIONSKINS) &&
+ if ((!cache_ob->is_dup_data) &&
+ (gpd->flag & GP_DATA_SHOW_ONIONSKINS) &&
(do_onion) && (gpl->onion_flag & GP_LAYER_ONIONSKIN) &&
((!playing) || (gpd->onion_flag & GP_ONION_GHOST_ALWAYS)) &&
- (!cache_ob->is_dup_ob) && (orig_id->us <= 1))
+ (!cache_ob->is_dup_ob) && (gpd->id.us <= 1))
{
if (((!stl->storage->is_render) && (overlay)) ||
((stl->storage->is_render) && (gpd->onion_flag & GP_ONION_GHOST_ALWAYS)))
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 2e237ac7fe8..1ec060e12f8 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -42,9 +42,13 @@
#include "gpencil_engine.h"
+#include "DEG_depsgraph_query.h"
+
#include "ED_screen.h"
#include "ED_gpencil.h"
+#include "WM_api.h"
+
extern char datatoc_gpencil_fill_vert_glsl[];
extern char datatoc_gpencil_fill_frag_glsl[];
extern char datatoc_gpencil_stroke_vert_glsl[];
@@ -137,17 +141,17 @@ static void GPENCIL_create_framebuffers(void *vedata)
GPU_ATTACHMENT_TEXTURE(e_data.temp_color_tx_b)
});
- /* used for rim FX effect */
- e_data.temp_depth_tx_rim = DRW_texture_pool_query_2D(
+ /* used for rim and shadow FX effects */
+ e_data.temp_depth_tx_fx = DRW_texture_pool_query_2D(
size[0], size[1], GPU_DEPTH24_STENCIL8,
&draw_engine_gpencil_type);
- e_data.temp_color_tx_rim = DRW_texture_pool_query_2D(
+ e_data.temp_color_tx_fx = DRW_texture_pool_query_2D(
size[0], size[1], fb_format,
&draw_engine_gpencil_type);
GPU_framebuffer_ensure_config(
- &fbl->temp_fb_rim, {
- GPU_ATTACHMENT_TEXTURE(e_data.temp_depth_tx_rim),
- GPU_ATTACHMENT_TEXTURE(e_data.temp_color_tx_rim),
+ &fbl->temp_fb_fx, {
+ GPU_ATTACHMENT_TEXTURE(e_data.temp_depth_tx_fx),
+ GPU_ATTACHMENT_TEXTURE(e_data.temp_color_tx_fx),
});
/* background framebuffer to speed up drawing process (always 16 bits) */
@@ -337,6 +341,7 @@ void GPENCIL_cache_init(void *vedata)
/* detect if playing animation */
if (draw_ctx->evil_C) {
+
bool playing = ED_screen_animation_playing(CTX_wm_manager(draw_ctx->evil_C)) != NULL;
if (playing != stl->storage->is_playing) {
stl->storage->reset_cache = true;
@@ -353,9 +358,9 @@ void GPENCIL_cache_init(void *vedata)
if (obact_gpd) {
/* for some reason, when press play there is a delay in the animation flag check
- * and this produces errors. To be sure, we set cache as dirty because the frame
- * is changing.
- */
+ * and this produces errors. To be sure, we set cache as dirty because the frame
+ * is changing.
+ */
if (stl->storage->is_playing == true) {
obact_gpd->flag |= GP_DATA_CACHE_IS_DIRTY;
}
@@ -381,9 +386,11 @@ void GPENCIL_cache_init(void *vedata)
(obact_gpd->flag & GP_DATA_STROKE_PAINTMODE) &&
(stl->storage->is_playing == false))
{
- if (((obact_gpd->runtime.sbuffer_sflag & GP_STROKE_ERASER) == 0) &&
- (obact_gpd->runtime.sbuffer_size > 0) &&
- ((obact_gpd->flag & GP_DATA_STROKE_POLYGON) == 0))
+ /* need the original to avoid cow overhead while drawing */
+ bGPdata *gpd_orig = (bGPdata *)DEG_get_original_id(&obact_gpd->id);
+ if (((gpd_orig->runtime.sbuffer_sflag & GP_STROKE_ERASER) == 0) &&
+ (gpd_orig->runtime.sbuffer_size > 0) &&
+ ((gpd_orig->flag & GP_DATA_STROKE_POLYGON) == 0))
{
stl->g_data->session_flag |= GP_DRW_PAINT_PAINTING;
}
@@ -411,7 +418,7 @@ void GPENCIL_cache_init(void *vedata)
stl->storage->color_type = GPENCIL_COLOR_SOLID;
}
- /* drawing buffer pass for drawing the stroke that is beeing drawing by the user. The data
+ /* drawing buffer pass for drawing the stroke that is being drawing by the user. The data
* is stored in sbuffer
*/
psl->drawing_pass = DRW_pass_create(
@@ -494,38 +501,25 @@ static void gpencil_add_draw_data(void *vedata, Object *ob)
const DRWContextState *draw_ctx = DRW_context_state_get();
Scene *scene = draw_ctx->scene;
bGPdata *gpd = (bGPdata *)ob->data;
- bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
int i = stl->g_data->gp_cache_used - 1;
tGPencilObjectCache *cache_ob = &stl->g_data->gp_object_cache[i];
- if (cache_ob->is_dup_ob == false) {
- /* save init shading group */
- cache_ob->init_grp = stl->storage->shgroup_id;
-
- /* fill shading groups */
- if (!is_multiedit) {
- DRW_gpencil_populate_datablock(&e_data, vedata, scene, ob, cache_ob);
- }
- else {
- DRW_gpencil_populate_multiedit(&e_data, vedata, scene, ob, cache_ob);
- }
+ /* save init shading group */
+ cache_ob->init_grp = stl->storage->shgroup_id;
- /* save end shading group */
- cache_ob->end_grp = stl->storage->shgroup_id - 1;
+ /* fill shading groups */
+ if ((!is_multiedit) || (cache_ob->is_dup_ob)) {
+ DRW_gpencil_populate_datablock(&e_data, vedata, scene, ob, cache_ob);
}
else {
- /* save init shading group */
- cache_ob->init_grp = stl->storage->shgroup_id;
-
- DRW_gpencil_populate_datablock(
- &e_data, vedata, scene, ob,
- cache_ob);
-
- /* save end shading group */
- cache_ob->end_grp = stl->storage->shgroup_id - 1;
+ DRW_gpencil_populate_multiedit(&e_data, vedata, scene, ob, cache_ob);
}
+ /* save end shading group */
+ cache_ob->end_grp = stl->storage->shgroup_id - 1;
+
/* FX passses */
cache_ob->has_fx = false;
if ((!stl->storage->simplify_fx) &&
@@ -542,7 +536,7 @@ static void gpencil_add_draw_data(void *vedata, Object *ob)
void GPENCIL_cache_populate(void *vedata, Object *ob)
{
/* object must be visible */
- if (!DRW_check_object_visible_within_active_context(ob)) {
+ if (!DRW_object_is_visible_in_active_context(ob)) {
return;
}
@@ -555,14 +549,22 @@ void GPENCIL_cache_populate(void *vedata, Object *ob)
if (ob->type == OB_GPENCIL && ob->data) {
bGPdata *gpd = (bGPdata *)ob->data;
+ /* if onion, set as dirty always
+ * This reduces performance, but avoid any crash in the multiple
+ * overlay and multiwindow options
+ */
+ if (gpd->flag & GP_DATA_SHOW_ONIONSKINS) {
+ gpd->flag |= GP_DATA_CACHE_IS_DIRTY;
+ }
+
/* when start/stop animation the cache must be set as dirty to reset all data */
if (stl->storage->reset_cache) {
gpd->flag |= GP_DATA_CACHE_IS_DIRTY;
stl->storage->reset_cache = false;
}
- /* is edit mode only current object, not instances */
- if ((draw_ctx->obact != ob) && GPENCIL_ANY_EDIT_MODE(gpd)) {
+ /* is edit mode only current object, not particle instances */
+ if ((ob->base_flag & BASE_FROMDUPLI) && GPENCIL_ANY_EDIT_MODE(gpd)) {
return;
}
@@ -577,8 +579,12 @@ void GPENCIL_cache_populate(void *vedata, Object *ob)
gpencil_add_draw_data(vedata, ob);
}
- /* draw current painting strokes */
- if (draw_ctx->obact == ob) {
+ /* draw current painting strokes
+ * (only if region is equal to originated paint region)
+ */
+ if ((draw_ctx->obact == ob) &&
+ ((gpd->runtime.ar == NULL) || (gpd->runtime.ar == draw_ctx->ar)))
+ {
DRW_gpencil_populate_buffer_strokes(&e_data, vedata, ts, ob);
}
@@ -591,11 +597,23 @@ void GPENCIL_cache_populate(void *vedata, Object *ob)
GPU_BATCH_DISCARD_SAFE(e_data.batch_grid);
MEM_SAFE_FREE(e_data.batch_grid);
- e_data.batch_grid = DRW_gpencil_get_grid();
+ e_data.batch_grid = DRW_gpencil_get_grid(ob);
+
+ /* define grid orientation */
+ if (ts->gp_sculpt.lock_axis != GP_LOCKAXIS_VIEW) {
+ copy_m4_m4(stl->storage->grid_matrix, ob->obmat);
+ }
+ else {
+ /* align always to view */
+ invert_m4_m4(stl->storage->grid_matrix, draw_ctx->rv3d->viewmat);
+ /* copy ob location */
+ copy_v3_v3(stl->storage->grid_matrix[3], ob->obmat[3]);
+ }
+
DRW_shgroup_call_add(
- stl->g_data->shgrps_grid,
- e_data.batch_grid,
- ob->obmat);
+ stl->g_data->shgrps_grid,
+ e_data.batch_grid,
+ stl->storage->grid_matrix);
}
}
}
@@ -664,7 +682,7 @@ void GPENCIL_draw_scene(void *ved)
const bool playing = stl->storage->is_playing;
const bool is_render = stl->storage->is_render;
- /* paper pass to display a confortable area to draw over complex scenes with geometry */
+ /* paper pass to display a comfortable area to draw over complex scenes with geometry */
if ((!is_render) && (obact) && (obact->type == OB_GPENCIL)) {
if (((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) &&
(v3d->gp_flag & V3D_GP_SHOW_PAPER))
@@ -730,7 +748,10 @@ void GPENCIL_draw_scene(void *ved)
* draw only a subset that usually start with a fill and end with stroke because the
* shading groups are created by pairs */
if (end_grp >= init_grp) {
- MULTISAMPLE_GP_SYNC_ENABLE(stl->storage->multisamples, fbl);
+ /* previews don't use AA */
+ if (!stl->storage->is_mat_preview) {
+ MULTISAMPLE_GP_SYNC_ENABLE(stl->storage->multisamples, fbl);
+ }
DRW_draw_pass_subset(
psl->stroke_pass,
@@ -738,7 +759,9 @@ void GPENCIL_draw_scene(void *ved)
stl->shgroups[init_grp].shgrps_fill : stl->shgroups[init_grp].shgrps_stroke,
stl->shgroups[end_grp].shgrps_stroke);
- MULTISAMPLE_GP_SYNC_DISABLE(stl->storage->multisamples, fbl, fbl->temp_fb_a, txl);
+ if (!stl->storage->is_mat_preview) {
+ MULTISAMPLE_GP_SYNC_DISABLE(stl->storage->multisamples, fbl, fbl->temp_fb_a, txl);
+ }
}
/* Current buffer drawing */
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index eeec16838ec..8e68fdef952 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -58,8 +58,8 @@ struct RenderLayer;
/* used to save gpencil object data for drawing */
typedef struct tGPencilObjectCache {
+ struct Object *ob;
struct bGPdata *gpd;
- char ob_name[64];
int init_grp, end_grp;
int idx; /*original index, can change after sort */
@@ -72,6 +72,8 @@ typedef struct tGPencilObjectCache {
DRWShadingGroup *fx_colorize_sh;
DRWShadingGroup *fx_pixel_sh;
DRWShadingGroup *fx_rim_sh;
+ DRWShadingGroup *fx_shadow_sh;
+ DRWShadingGroup *fx_glow_sh;
DRWShadingGroup *fx_swirl_sh;
DRWShadingGroup *fx_flip_sh;
DRWShadingGroup *fx_light_sh;
@@ -80,7 +82,8 @@ typedef struct tGPencilObjectCache {
float obmat[4][4];
float zdepth; /* z-depth value to sort gp object */
bool is_dup_ob; /* flag to tag duplicate objects */
- bool is_dup_onion; /* other object display onion already */
+ bool is_dup_data; /* other object uses datablock already */
+ int data_idx; /* derived data index */
} tGPencilObjectCache;
/* *********** LISTS *********** */
@@ -131,6 +134,8 @@ typedef struct GPENCIL_Storage {
float winmat[4][4], wininv[4][4];
float view_vecs[2][4]; /* vec4[2] */
+ float grid_matrix[4][4];
+
Object *camera; /* camera pointer for render mode */
} GPENCIL_Storage;
@@ -160,7 +165,7 @@ typedef struct GPENCIL_FramebufferList {
struct GPUFrameBuffer *main;
struct GPUFrameBuffer *temp_fb_a;
struct GPUFrameBuffer *temp_fb_b;
- struct GPUFrameBuffer *temp_fb_rim;
+ struct GPUFrameBuffer *temp_fb_fx;
struct GPUFrameBuffer *background_fb;
struct GPUFrameBuffer *multisample_fb;
@@ -230,10 +235,14 @@ typedef struct GPENCIL_e_data {
struct GPUShader *gpencil_fx_blur_sh;
struct GPUShader *gpencil_fx_colorize_sh;
struct GPUShader *gpencil_fx_flip_sh;
+ struct GPUShader *gpencil_fx_glow_prepare_sh;
+ struct GPUShader *gpencil_fx_glow_resolve_sh;
struct GPUShader *gpencil_fx_light_sh;
struct GPUShader *gpencil_fx_pixel_sh;
struct GPUShader *gpencil_fx_rim_prepare_sh;
struct GPUShader *gpencil_fx_rim_resolve_sh;
+ struct GPUShader *gpencil_fx_shadow_prepare_sh;
+ struct GPUShader *gpencil_fx_shadow_resolve_sh;
struct GPUShader *gpencil_fx_swirl_sh;
struct GPUShader *gpencil_fx_wave_sh;
@@ -254,8 +263,8 @@ typedef struct GPENCIL_e_data {
struct GPUTexture *temp_color_tx_b;
struct GPUTexture *temp_depth_tx_b;
- struct GPUTexture *temp_color_tx_rim;
- struct GPUTexture *temp_depth_tx_rim;
+ struct GPUTexture *temp_color_tx_fx;
+ struct GPUTexture *temp_depth_tx_fx;
/* for buffer only one batch is nedeed because the drawing is only of one stroke */
GPUBatch *batch_buffer_stroke;
@@ -270,7 +279,7 @@ typedef struct GPENCIL_e_data {
typedef struct GpencilBatchCache {
/* For normal strokes, a variable number of batch can be needed depending of number of strokes.
It could use the stroke number as total size, but when activate the onion skining, the number
- can change, so the size is changed dinamically.
+ can change, so the size is changed dynamically.
*/
GPUBatch **batch_stroke;
GPUBatch **batch_fill;
@@ -300,7 +309,7 @@ void DRW_gpencil_populate_buffer_strokes(
void DRW_gpencil_populate_multiedit(
struct GPENCIL_e_data *e_data, void *vedata,
struct Scene *scene, struct Object *ob, struct tGPencilObjectCache *cache_ob);
-void DRW_gpencil_triangulate_stroke_fill(struct bGPDstroke *gps);
+void DRW_gpencil_triangulate_stroke_fill(struct Object *ob, struct bGPDstroke *gps);
void DRW_gpencil_multisample_ensure(struct GPENCIL_Data *vedata, int rect_w, int rect_h);
@@ -313,7 +322,7 @@ struct GPUBatch *DRW_gpencil_get_edlin_geom(struct bGPDstroke *gps, float alpha,
struct GPUBatch *DRW_gpencil_get_buffer_stroke_geom(struct bGPdata *gpd, short thickness);
struct GPUBatch *DRW_gpencil_get_buffer_fill_geom(struct bGPdata *gpd);
struct GPUBatch *DRW_gpencil_get_buffer_point_geom(struct bGPdata *gpd, short thickness);
-struct GPUBatch *DRW_gpencil_get_grid(void);
+struct GPUBatch *DRW_gpencil_get_grid(Object *ob);
/* object cache functions */
struct tGPencilObjectCache *gpencil_object_cache_add(
diff --git a/source/blender/draw/engines/gpencil/gpencil_render.c b/source/blender/draw/engines/gpencil/gpencil_render.c
index 3aa94c346df..8dc15472a20 100644
--- a/source/blender/draw/engines/gpencil/gpencil_render.c
+++ b/source/blender/draw/engines/gpencil/gpencil_render.c
@@ -40,9 +40,9 @@
#include "gpencil_engine.h"
/* Get pixel size for render
-* This function uses the same calculation used for viewport, because if use
-* camera pixelsize, the result is not correct.
-*/
+ * This function uses the same calculation used for viewport, because if use
+ * camera pixelsize, the result is not correct.
+ */
static float get_render_pixelsize(float persmat[4][4], int winx, int winy)
{
float v1[3], v2[3];
@@ -74,9 +74,9 @@ void GPENCIL_render_init(GPENCIL_Data *ved, RenderEngine *engine, struct Depsgra
const int size[2] = { (int)viewport_size[0], (int)viewport_size[1] };
/* In render mode the default framebuffer is not generated
- * because there is no viewport. So we need to manually create one
- * NOTE : use 32 bit format for precision in render mode.
- */
+ * because there is no viewport. So we need to manually create one
+ * NOTE : use 32 bit format for precision in render mode.
+ */
/* create multiframe framebuffer for AA */
if (U.gpencil_multisamples > 0) {
int rect_w = (int)viewport_size[0];
@@ -130,7 +130,7 @@ static void GPENCIL_render_cache(
void *vedata, struct Object *ob,
struct RenderEngine *UNUSED(engine), struct Depsgraph *UNUSED(depsgraph))
{
- if ((ob == NULL) || (DRW_check_object_visible_within_active_context(ob) == false)) {
+ if ((ob == NULL) || (DRW_object_is_visible_in_active_context(ob) == false)) {
return;
}
@@ -156,7 +156,7 @@ static void GPENCIL_render_update_viewvecs(float invproj[4][4], float winmat[4][
for (int i = 0; i < 4; i++) {
mul_project_m4_v3(invproj, view_vecs[i]);
/* normalized trick see:
- * http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer */
+ * http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer */
if (is_persp) {
/* Divide XY by Z. */
mul_v2_fl(view_vecs[i], 1.0f / view_vecs[i][2]);
@@ -164,14 +164,14 @@ static void GPENCIL_render_update_viewvecs(float invproj[4][4], float winmat[4][
}
/**
- * If ortho : view_vecs[0] is the near-bottom-left corner of the frustum and
- * view_vecs[1] is the vector going from the near-bottom-left corner to
- * the far-top-right corner.
- * If Persp : view_vecs[0].xy and view_vecs[1].xy are respectively the bottom-left corner
- * when Z = 1, and top-left corner if Z = 1.
- * view_vecs[0].z the near clip distance and view_vecs[1].z is the (signed)
- * distance from the near plane to the far clip plane.
- **/
+ * If ortho : view_vecs[0] is the near-bottom-left corner of the frustum and
+ * view_vecs[1] is the vector going from the near-bottom-left corner to
+ * the far-top-right corner.
+ * If Persp : view_vecs[0].xy and view_vecs[1].xy are respectively the bottom-left corner
+ * when Z = 1, and top-left corner if Z = 1.
+ * view_vecs[0].z the near clip distance and view_vecs[1].z is the (signed)
+ * distance from the near plane to the far clip plane.
+ */
copy_v4_v4(r_viewvecs[0], view_vecs[0]);
/* we need to store the differences */
diff --git a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
index c3bf241baf5..fcadf296253 100644
--- a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
+++ b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
@@ -48,6 +48,10 @@ extern char datatoc_gpencil_fx_light_frag_glsl[];
extern char datatoc_gpencil_fx_pixel_frag_glsl[];
extern char datatoc_gpencil_fx_rim_prepare_frag_glsl[];
extern char datatoc_gpencil_fx_rim_resolve_frag_glsl[];
+extern char datatoc_gpencil_fx_shadow_prepare_frag_glsl[];
+extern char datatoc_gpencil_fx_shadow_resolve_frag_glsl[];
+extern char datatoc_gpencil_fx_glow_prepare_frag_glsl[];
+extern char datatoc_gpencil_fx_glow_resolve_frag_glsl[];
extern char datatoc_gpencil_fx_swirl_frag_glsl[];
extern char datatoc_gpencil_fx_wave_frag_glsl[];
@@ -76,11 +80,12 @@ static bool effect_is_active(bGPdata *gpd, ShaderFxData *fx, bool is_render)
return false;
}
-/* get normal of draw using one stroke of visible layer
-* /param gpd GP datablock
-* /param r_point Point on plane
-* /param r_normal Normal vector
-*/
+/**
+ * Get normal of draw using one stroke of visible layer
+ * \param gpd GP datablock
+ * \param r_point Point on plane
+ * \param r_normal Normal vector
+ */
static bool get_normal_vector(bGPdata *gpd, float r_point[3], float r_normal[3])
{
for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
@@ -123,9 +128,9 @@ static void GPENCIL_dof_nearfar(Object *camera, float coc, float nearfar[2])
float focal_len = cam->lens;
/* this is factor that converts to the scene scale. focal length and sensor are expressed in mm
- * unit.scale_length is how many meters per blender unit we have. We want to convert to blender units though
- * because the shader reads coordinates in world space, which is in blender units.
- * Note however that focus_distance is already in blender units and shall not be scaled here (see T48157). */
+ * unit.scale_length is how many meters per blender unit we have. We want to convert to blender units though
+ * because the shader reads coordinates in world space, which is in blender units.
+ * Note however that focus_distance is already in blender units and shall not be scaled here (see T48157). */
float scale = (scene->unit.system) ? scene->unit.scale_length : 1.0f;
float scale_camera = 0.001f / scale;
/* we want radius here for the aperture number */
@@ -205,7 +210,7 @@ static void DRW_gpencil_fx_blur(
}
}
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
fx_shgrp = DRW_shgroup_create(
e_data->gpencil_fx_blur_sh,
@@ -213,11 +218,11 @@ static void DRW_gpencil_fx_blur(
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_a);
+ DRW_shgroup_uniform_vec2(fx_shgrp, "Viewport", DRW_viewport_size_get(), 1);
DRW_shgroup_uniform_int(fx_shgrp, "blur", &fxd->blur[0], 2);
DRW_shgroup_uniform_vec3(fx_shgrp, "loc", &cache->loc[0], 1);
DRW_shgroup_uniform_float(fx_shgrp, "pixsize", stl->storage->pixsize, 1);
- DRW_shgroup_uniform_float(fx_shgrp, "pixelsize", &U.pixelsize, 1);
DRW_shgroup_uniform_float(fx_shgrp, "pixfactor", &cache->pixfactor, 1);
fxd->runtime.fx_sh = fx_shgrp;
@@ -234,7 +239,7 @@ static void DRW_gpencil_fx_colorize(
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
DRWShadingGroup *fx_shgrp;
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_colorize_sh, psl->fx_shader_pass);
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
@@ -267,7 +272,7 @@ static void DRW_gpencil_fx_flip(
fxd->flipmode += 1;
}
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_flip_sh, psl->fx_shader_pass);
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
@@ -296,7 +301,7 @@ static void DRW_gpencil_fx_light(
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
DRWShadingGroup *fx_shgrp;
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_light_sh, psl->fx_shader_pass);
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
@@ -308,8 +313,8 @@ static void DRW_gpencil_fx_light(
copy_v3_v3(fxd->loc, &fxd->object->loc[0]);
/* Calc distance to strokes plane
- * The w component of location is used to transfer the distance to drawing plane
- */
+ * The w component of location is used to transfer the distance to drawing plane
+ */
float r_point[3], r_normal[3];
float r_plane[4];
bGPdata *gpd = cache->gpd;
@@ -327,7 +332,6 @@ static void DRW_gpencil_fx_light(
DRW_shgroup_uniform_float(fx_shgrp, "ambient", &fxd->ambient, 1);
DRW_shgroup_uniform_float(fx_shgrp, "pixsize", stl->storage->pixsize, 1);
- DRW_shgroup_uniform_float(fx_shgrp, "pixelsize", &U.pixelsize, 1);
DRW_shgroup_uniform_float(fx_shgrp, "pixfactor", &cache->pixfactor, 1);
fxd->runtime.fx_sh = fx_shgrp;
@@ -350,7 +354,7 @@ static void DRW_gpencil_fx_pixel(
fxd->size[2] = (int)fxd->flag & FX_PIXEL_USE_LINES;
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_pixel_sh, psl->fx_shader_pass);
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
@@ -360,7 +364,6 @@ static void DRW_gpencil_fx_pixel(
DRW_shgroup_uniform_vec3(fx_shgrp, "loc", &cache->loc[0], 1);
DRW_shgroup_uniform_float(fx_shgrp, "pixsize", stl->storage->pixsize, 1);
- DRW_shgroup_uniform_float(fx_shgrp, "pixelsize", &U.pixelsize, 1);
DRW_shgroup_uniform_float(fx_shgrp, "pixfactor", &gpd->pixfactor, 1);
fxd->runtime.fx_sh = fx_shgrp;
@@ -380,7 +383,7 @@ static void DRW_gpencil_fx_rim(
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
DRWShadingGroup *fx_shgrp;
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
/* prepare pass */
fx_shgrp = DRW_shgroup_create(
e_data->gpencil_fx_rim_prepare_sh,
@@ -396,7 +399,6 @@ static void DRW_gpencil_fx_rim(
DRW_shgroup_uniform_vec3(fx_shgrp, "loc", &cache->loc[0], 1);
DRW_shgroup_uniform_float(fx_shgrp, "pixsize", stl->storage->pixsize, 1);
- DRW_shgroup_uniform_float(fx_shgrp, "pixelsize", &U.pixelsize, 1);
DRW_shgroup_uniform_float(fx_shgrp, "pixfactor", &cache->pixfactor, 1);
fxd->runtime.fx_sh = fx_shgrp;
@@ -406,13 +408,13 @@ static void DRW_gpencil_fx_rim(
e_data->gpencil_fx_blur_sh,
psl->fx_shader_pass_blend);
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
- DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_rim);
- DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_rim);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_fx);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_fx);
+ DRW_shgroup_uniform_vec2(fx_shgrp, "Viewport", DRW_viewport_size_get(), 1);
DRW_shgroup_uniform_int(fx_shgrp, "blur", &fxd->blur[0], 2);
DRW_shgroup_uniform_vec3(fx_shgrp, "loc", &cache->loc[0], 1);
DRW_shgroup_uniform_float(fx_shgrp, "pixsize", stl->storage->pixsize, 1);
- DRW_shgroup_uniform_float(fx_shgrp, "pixelsize", &U.pixelsize, 1);
DRW_shgroup_uniform_float(fx_shgrp, "pixfactor", &cache->pixfactor, 1);
fxd->runtime.fx_sh_b = fx_shgrp;
@@ -424,17 +426,163 @@ static void DRW_gpencil_fx_rim(
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_a);
- DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeRim", &e_data->temp_color_tx_rim);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeRim", &e_data->temp_color_tx_fx);
DRW_shgroup_uniform_vec3(fx_shgrp, "mask_color", &fxd->mask_rgb[0], 1);
DRW_shgroup_uniform_int(fx_shgrp, "mode", &fxd->mode, 1);
fxd->runtime.fx_sh_c = fx_shgrp;
}
+/* Shadow FX */
+static void DRW_gpencil_fx_shadow(
+ ShaderFxData *fx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata,
+ tGPencilObjectCache *cache)
+{
+ if (fx == NULL) {
+ return;
+ }
+ ShadowShaderFxData *fxd = (ShadowShaderFxData *)fx;
+ if ((!fxd->object) && (fxd->flag & FX_SHADOW_USE_OBJECT)) {
+ return;
+ }
+
+ GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+ GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
+ DRWShadingGroup *fx_shgrp;
+
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ /* prepare pass */
+ fx_shgrp = DRW_shgroup_create(
+ e_data->gpencil_fx_shadow_prepare_sh,
+ psl->fx_shader_pass_blend);
+ DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_a);
+ DRW_shgroup_uniform_vec2(fx_shgrp, "Viewport", DRW_viewport_size_get(), 1);
+
+ DRW_shgroup_uniform_int(fx_shgrp, "offset", &fxd->offset[0], 2);
+ DRW_shgroup_uniform_float(fx_shgrp, "scale", &fxd->scale[0], 2);
+ DRW_shgroup_uniform_float(fx_shgrp, "rotation", &fxd->rotation, 1);
+ DRW_shgroup_uniform_vec4(fx_shgrp, "shadow_color", &fxd->shadow_rgba[0], 1);
+
+ if ((fxd->object) && (fxd->flag & FX_SHADOW_USE_OBJECT)) {
+ DRW_shgroup_uniform_vec3(fx_shgrp, "loc", &fxd->object->loc[0], 1);
+ }
+ else {
+ DRW_shgroup_uniform_vec3(fx_shgrp, "loc", &cache->loc[0], 1);
+ }
+
+ const int nowave = -1;
+ if (fxd->flag & FX_SHADOW_USE_WAVE) {
+ DRW_shgroup_uniform_int(fx_shgrp, "orientation", &fxd->orientation, 1);
+ }
+ else {
+ DRW_shgroup_uniform_int(fx_shgrp, "orientation", &nowave, 1);
+ }
+ DRW_shgroup_uniform_float(fx_shgrp, "amplitude", &fxd->amplitude, 1);
+ DRW_shgroup_uniform_float(fx_shgrp, "period", &fxd->period, 1);
+ DRW_shgroup_uniform_float(fx_shgrp, "phase", &fxd->phase, 1);
+
+ DRW_shgroup_uniform_float(fx_shgrp, "pixsize", stl->storage->pixsize, 1);
+ DRW_shgroup_uniform_float(fx_shgrp, "pixfactor", &cache->pixfactor, 1);
+
+ fxd->runtime.fx_sh = fx_shgrp;
+
+ /* blur pass */
+ fx_shgrp = DRW_shgroup_create(
+ e_data->gpencil_fx_blur_sh,
+ psl->fx_shader_pass_blend);
+ DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_fx);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_fx);
+ DRW_shgroup_uniform_vec2(fx_shgrp, "Viewport", DRW_viewport_size_get(), 1);
+ DRW_shgroup_uniform_int(fx_shgrp, "blur", &fxd->blur[0], 2);
+
+ DRW_shgroup_uniform_vec3(fx_shgrp, "loc", &cache->loc[0], 1);
+ DRW_shgroup_uniform_float(fx_shgrp, "pixsize", stl->storage->pixsize, 1);
+ DRW_shgroup_uniform_float(fx_shgrp, "pixfactor", &cache->pixfactor, 1);
+
+ fxd->runtime.fx_sh_b = fx_shgrp;
+
+ /* resolve pass */
+ fx_shgrp = DRW_shgroup_create(
+ e_data->gpencil_fx_shadow_resolve_sh,
+ psl->fx_shader_pass_blend);
+ DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_a);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "shadowColor", &e_data->temp_color_tx_fx);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "shadowDepth", &e_data->temp_depth_tx_fx);
+
+ fxd->runtime.fx_sh_c = fx_shgrp;
+}
+
+/* Glow FX */
+static void DRW_gpencil_fx_glow(
+ ShaderFxData *fx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata,
+ tGPencilObjectCache *cache)
+{
+ if (fx == NULL) {
+ return;
+ }
+ GlowShaderFxData *fxd = (GlowShaderFxData *)fx;
+
+ GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+ GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
+ DRWShadingGroup *fx_shgrp;
+
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ /* prepare pass */
+ fx_shgrp = DRW_shgroup_create(
+ e_data->gpencil_fx_glow_prepare_sh,
+ psl->fx_shader_pass_blend);
+ DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_a);
+
+ DRW_shgroup_uniform_vec3(fx_shgrp, "glow_color", &fxd->glow_color[0], 1);
+ DRW_shgroup_uniform_vec3(fx_shgrp, "select_color", &fxd->select_color[0], 1);
+ DRW_shgroup_uniform_int(fx_shgrp, "mode", &fxd->mode, 1);
+ DRW_shgroup_uniform_float(fx_shgrp, "threshold", &fxd->threshold, 1);
+
+ fxd->runtime.fx_sh = fx_shgrp;
+
+ /* blur pass */
+ fx_shgrp = DRW_shgroup_create(
+ e_data->gpencil_fx_blur_sh,
+ psl->fx_shader_pass_blend);
+ DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_fx);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_fx);
+ DRW_shgroup_uniform_vec2(fx_shgrp, "Viewport", DRW_viewport_size_get(), 1);
+ DRW_shgroup_uniform_int(fx_shgrp, "blur", &fxd->blur[0], 2);
+
+ DRW_shgroup_uniform_vec3(fx_shgrp, "loc", &cache->loc[0], 1);
+ DRW_shgroup_uniform_float(fx_shgrp, "pixsize", stl->storage->pixsize, 1);
+ DRW_shgroup_uniform_float(fx_shgrp, "pixfactor", &cache->pixfactor, 1);
+
+ fxd->runtime.fx_sh_b = fx_shgrp;
+
+ /* resolve pass */
+ fx_shgrp = DRW_shgroup_create(
+ e_data->gpencil_fx_glow_resolve_sh,
+ psl->fx_shader_pass_blend);
+ DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_a);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "glowColor", &e_data->temp_color_tx_fx);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "glowDepth", &e_data->temp_depth_tx_fx);
+
+ /* reuse field */
+ DRW_shgroup_uniform_int(fx_shgrp, "alpha_mode", &fxd->blur[1], 1);
+
+ fxd->runtime.fx_sh_c = fx_shgrp;
+}
+
/* Swirl FX */
static void DRW_gpencil_fx_swirl(
ShaderFxData *fx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata,
- tGPencilObjectCache *cache)
+ tGPencilObjectCache *cache)
{
if (fx == NULL) {
return;
@@ -450,7 +598,7 @@ static void DRW_gpencil_fx_swirl(
fxd->transparent = (int)fxd->flag & FX_SWIRL_MAKE_TRANSPARENT;
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_swirl_sh, psl->fx_shader_pass);
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
@@ -465,7 +613,6 @@ static void DRW_gpencil_fx_swirl(
DRW_shgroup_uniform_int(fx_shgrp, "transparent", &fxd->transparent, 1);
DRW_shgroup_uniform_float(fx_shgrp, "pixsize", stl->storage->pixsize, 1);
- DRW_shgroup_uniform_float(fx_shgrp, "pixelsize", &U.pixelsize, 1);
DRW_shgroup_uniform_float(fx_shgrp, "pixfactor", &cache->pixfactor, 1);
fxd->runtime.fx_sh = fx_shgrp;
@@ -482,7 +629,7 @@ static void DRW_gpencil_fx_wave(
WaveShaderFxData *fxd = (WaveShaderFxData *)fx;
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
DRWShadingGroup *fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_wave_sh, psl->fx_shader_pass);
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
@@ -530,6 +677,20 @@ void GPENCIL_create_fx_shaders(GPENCIL_e_data *e_data)
e_data->gpencil_fx_rim_resolve_sh = DRW_shader_create_fullscreen(
datatoc_gpencil_fx_rim_resolve_frag_glsl, NULL);
}
+ if (!e_data->gpencil_fx_shadow_prepare_sh) {
+ e_data->gpencil_fx_shadow_prepare_sh = DRW_shader_create_fullscreen(
+ datatoc_gpencil_fx_shadow_prepare_frag_glsl, NULL);
+
+ e_data->gpencil_fx_shadow_resolve_sh = DRW_shader_create_fullscreen(
+ datatoc_gpencil_fx_shadow_resolve_frag_glsl, NULL);
+ }
+ if (!e_data->gpencil_fx_glow_prepare_sh) {
+ e_data->gpencil_fx_glow_prepare_sh = DRW_shader_create_fullscreen(
+ datatoc_gpencil_fx_glow_prepare_frag_glsl, NULL);
+
+ e_data->gpencil_fx_glow_resolve_sh = DRW_shader_create_fullscreen(
+ datatoc_gpencil_fx_glow_resolve_frag_glsl, NULL);
+ }
if (!e_data->gpencil_fx_swirl_sh) {
e_data->gpencil_fx_swirl_sh = DRW_shader_create_fullscreen(
datatoc_gpencil_fx_swirl_frag_glsl, NULL);
@@ -550,6 +711,10 @@ void GPENCIL_delete_fx_shaders(GPENCIL_e_data *e_data)
DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_pixel_sh);
DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_rim_prepare_sh);
DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_rim_resolve_sh);
+ DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_shadow_prepare_sh);
+ DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_shadow_resolve_sh);
+ DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_glow_prepare_sh);
+ DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_glow_resolve_sh);
DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_swirl_sh);
DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_wave_sh);
}
@@ -570,8 +735,8 @@ void GPENCIL_create_fx_passes(GPENCIL_PassList *psl)
/* prepare fx shading groups */
void DRW_gpencil_fx_prepare(
- struct GPENCIL_e_data *e_data, struct GPENCIL_Data *vedata,
- struct tGPencilObjectCache *cache)
+ GPENCIL_e_data *e_data, GPENCIL_Data *vedata,
+ tGPencilObjectCache *cache)
{
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
int ob_idx = cache->idx;
@@ -601,6 +766,12 @@ void DRW_gpencil_fx_prepare(
case eShaderFxType_Rim:
DRW_gpencil_fx_rim(fx, e_data, vedata, cache);
break;
+ case eShaderFxType_Shadow:
+ DRW_gpencil_fx_shadow(fx, e_data, vedata, cache);
+ break;
+ case eShaderFxType_Glow:
+ DRW_gpencil_fx_glow(fx, e_data, vedata, cache);
+ break;
case eShaderFxType_Swirl:
DRW_gpencil_fx_swirl(fx, e_data, vedata, cache);
break;
@@ -626,8 +797,7 @@ static void gpencil_draw_fx_pass(
return;
}
- static float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
-
+ const float clearcol[4] = {0.0f};
GPU_framebuffer_bind(fbl->temp_fb_b);
GPU_framebuffer_clear_color_depth(fbl->temp_fb_b, clearcol, 1.0f);
@@ -651,9 +821,9 @@ static void gpencil_draw_fx_pass(
/* helper to manage gaussian blur passes */
static void draw_gpencil_blur_passes(
- struct GPENCIL_e_data *e_data,
- struct GPENCIL_Data *vedata,
- struct BlurShaderFxData *fxd)
+ GPENCIL_e_data *e_data,
+ GPENCIL_Data *vedata,
+ BlurShaderFxData *fxd)
{
if (fxd->runtime.fx_sh == NULL) {
return;
@@ -690,31 +860,60 @@ static void draw_gpencil_blur_passes(
}
}
-static void draw_gpencil_rim_blur(
- struct GPENCIL_e_data *UNUSED(e_data),
- struct GPENCIL_Data *vedata,
- struct RimShaderFxData *fxd)
+/* blur intermediate pass */
+static void draw_gpencil_midpass_blur(
+ GPENCIL_Data *vedata,
+ ShaderFxData_Runtime *runtime)
{
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
- static float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
+ const float clearcol[4] = {0.0f};
GPU_framebuffer_bind(fbl->temp_fb_b);
GPU_framebuffer_clear_color_depth(fbl->temp_fb_b, clearcol, 1.0f);
DRW_draw_pass_subset(psl->fx_shader_pass_blend,
- fxd->runtime.fx_sh_b, fxd->runtime.fx_sh_b);
+ runtime->fx_sh_b, runtime->fx_sh_b);
/* copy pass from b for ping-pong frame buffers */
- GPU_framebuffer_bind(fbl->temp_fb_rim);
- GPU_framebuffer_clear_color_depth(fbl->temp_fb_rim, clearcol, 1.0f);
+ GPU_framebuffer_bind(fbl->temp_fb_fx);
+ GPU_framebuffer_clear_color_depth(fbl->temp_fb_fx, clearcol, 1.0f);
DRW_draw_pass(psl->mix_pass_noblend);
}
+/* do blur of mid passes */
+static void draw_gpencil_do_blur(
+ GPENCIL_e_data *e_data,
+ GPENCIL_Data *vedata,
+ ShaderFxData_Runtime *runtime,
+ int samples, int bx, int by, int blur[2])
+{
+ e_data->input_depth_tx = e_data->temp_depth_tx_b;
+ e_data->input_color_tx = e_data->temp_color_tx_b;
+
+ if ((samples > 0) && ((bx > 0) || (by > 0))) {
+ for (int x = 0; x < samples; x++) {
+
+ /* horizontal */
+ blur[0] = bx;
+ blur[1] = 0;
+ draw_gpencil_midpass_blur(vedata, runtime);
+
+ /* Vertical */
+ blur[0] = 0;
+ blur[1] = by;
+ draw_gpencil_midpass_blur(vedata, runtime);
+
+ blur[0] = bx;
+ blur[1] = by;
+ }
+ }
+}
+
/* helper to draw RIM passes */
static void draw_gpencil_rim_passes(
- struct GPENCIL_e_data *e_data,
- struct GPENCIL_Data *vedata,
- struct RimShaderFxData *fxd)
+ GPENCIL_e_data *e_data,
+ GPENCIL_Data *vedata,
+ RimShaderFxData *fxd)
{
if (fxd->runtime.fx_sh_b == NULL) {
return;
@@ -723,44 +922,121 @@ static void draw_gpencil_rim_passes(
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
- static float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- int bx = fxd->blur[0];
- int by = fxd->blur[1];
+ const float clearcol[4] = {0.0f};
/* prepare mask */
- GPU_framebuffer_bind(fbl->temp_fb_rim);
- GPU_framebuffer_clear_color_depth(fbl->temp_fb_rim, clearcol, 1.0f);
+ GPU_framebuffer_bind(fbl->temp_fb_fx);
+ GPU_framebuffer_clear_color_depth(fbl->temp_fb_fx, clearcol, 1.0f);
DRW_draw_pass_subset(
psl->fx_shader_pass_blend,
fxd->runtime.fx_sh, fxd->runtime.fx_sh);
/* blur rim */
+ draw_gpencil_do_blur(
+ e_data, vedata, &fxd->runtime,
+ fxd->samples,
+ fxd->blur[0], fxd->blur[1],
+ &fxd->blur[0]);
+
+ /* resolve */
+ GPU_framebuffer_bind(fbl->temp_fb_b);
+ GPU_framebuffer_clear_color_depth(fbl->temp_fb_b, clearcol, 1.0f);
+ DRW_draw_pass_subset(
+ psl->fx_shader_pass_blend,
+ fxd->runtime.fx_sh_c, fxd->runtime.fx_sh_c);
+
+ /* copy pass from b to a for ping-pong frame buffers */
e_data->input_depth_tx = e_data->temp_depth_tx_b;
e_data->input_color_tx = e_data->temp_color_tx_b;
- if ((fxd->samples > 0) && ((bx > 0) || (by > 0))) {
- for (int x = 0; x < fxd->samples; x++) {
+ GPU_framebuffer_bind(fbl->temp_fb_a);
+ GPU_framebuffer_clear_color_depth(fbl->temp_fb_a, clearcol, 1.0f);
+ DRW_draw_pass(psl->mix_pass_noblend);
+}
- /* horizontal */
- fxd->blur[0] = bx;
- fxd->blur[1] = 0;
- draw_gpencil_rim_blur(e_data, vedata, fxd);
+/* helper to draw SHADOW passes */
+static void draw_gpencil_shadow_passes(
+ GPENCIL_e_data *e_data,
+ GPENCIL_Data *vedata,
+ ShadowShaderFxData *fxd)
+{
+ if (fxd->runtime.fx_sh_b == NULL) {
+ return;
+ }
- /* Vertical */
- fxd->blur[0] = 0;
- fxd->blur[1] = by;
- draw_gpencil_rim_blur(e_data, vedata, fxd);
+ GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
+ GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
+ const float clearcol[4] = {0.0f};
- fxd->blur[0] = bx;
- fxd->blur[1] = by;
- }
+ /* prepare shadow */
+ GPU_framebuffer_bind(fbl->temp_fb_fx);
+ GPU_framebuffer_clear_color_depth(fbl->temp_fb_fx, clearcol, 1.0f);
+ DRW_draw_pass_subset(
+ psl->fx_shader_pass_blend,
+ fxd->runtime.fx_sh, fxd->runtime.fx_sh);
+
+ /* blur shadow */
+ draw_gpencil_do_blur(
+ e_data, vedata, &fxd->runtime,
+ fxd->samples,
+ fxd->blur[0], fxd->blur[1],
+ &fxd->blur[0]);
+
+ /* resolve */
+ GPU_framebuffer_bind(fbl->temp_fb_b);
+ GPU_framebuffer_clear_color_depth(fbl->temp_fb_b, clearcol, 1.0f);
+ DRW_draw_pass_subset(
+ psl->fx_shader_pass_blend,
+ fxd->runtime.fx_sh_c, fxd->runtime.fx_sh_c);
+
+ /* copy pass from b to a for ping-pong frame buffers */
+ e_data->input_depth_tx = e_data->temp_depth_tx_b;
+ e_data->input_color_tx = e_data->temp_color_tx_b;
+
+ GPU_framebuffer_bind(fbl->temp_fb_a);
+ GPU_framebuffer_clear_color_depth(fbl->temp_fb_a, clearcol, 1.0f);
+ DRW_draw_pass(psl->mix_pass_noblend);
+}
+
+/* helper to draw GLOW passes */
+static void draw_gpencil_glow_passes(
+ GPENCIL_e_data *e_data,
+ GPENCIL_Data *vedata,
+ GlowShaderFxData *fxd)
+{
+ if (fxd->runtime.fx_sh_b == NULL) {
+ return;
}
+
+ GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
+ GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
+
+ const float clearcol[4] = {0.0f};
+
+ /* prepare glow */
+ GPU_framebuffer_bind(fbl->temp_fb_fx);
+ GPU_framebuffer_clear_color_depth(fbl->temp_fb_fx, clearcol, 1.0f);
+ DRW_draw_pass_subset(
+ psl->fx_shader_pass_blend,
+ fxd->runtime.fx_sh, fxd->runtime.fx_sh);
+
+ /* blur glow */
+ draw_gpencil_do_blur(
+ e_data, vedata, &fxd->runtime,
+ fxd->samples,
+ fxd->blur[0], fxd->blur[0],
+ &fxd->blur[0]);
+
/* resolve */
GPU_framebuffer_bind(fbl->temp_fb_b);
GPU_framebuffer_clear_color_depth(fbl->temp_fb_b, clearcol, 1.0f);
+
+ /* reuses blur field to keep alpha mode */
+ fxd->blur[1] = (fxd->flag & FX_GLOW_USE_ALPHA) ? 1 : 0;
+
DRW_draw_pass_subset(
- psl->fx_shader_pass_blend,
- fxd->runtime.fx_sh_c, fxd->runtime.fx_sh_c);
+ psl->fx_shader_pass_blend,
+ fxd->runtime.fx_sh_c, fxd->runtime.fx_sh_c);
/* copy pass from b to a for ping-pong frame buffers */
e_data->input_depth_tx = e_data->temp_depth_tx_b;
@@ -773,8 +1049,8 @@ static void draw_gpencil_rim_passes(
/* apply all object fx effects */
void DRW_gpencil_fx_draw(
- struct GPENCIL_e_data *e_data,
- struct GPENCIL_Data *vedata, struct tGPencilObjectCache *cache)
+ GPENCIL_e_data *e_data,
+ GPENCIL_Data *vedata, tGPencilObjectCache *cache)
{
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
@@ -821,6 +1097,18 @@ void DRW_gpencil_fx_draw(
draw_gpencil_rim_passes(e_data, vedata, fxd);
break;
}
+ case eShaderFxType_Shadow:
+ {
+ ShadowShaderFxData *fxd = (ShadowShaderFxData *)fx;
+ draw_gpencil_shadow_passes(e_data, vedata, fxd);
+ break;
+ }
+ case eShaderFxType_Glow:
+ {
+ GlowShaderFxData *fxd = (GlowShaderFxData *)fx;
+ draw_gpencil_glow_passes(e_data, vedata, fxd);
+ break;
+ }
case eShaderFxType_Swirl:
{
SwirlShaderFxData *fxd = (SwirlShaderFxData *)fx;
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl
index 1bf1d025430..e59cbef3e5d 100644
--- a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl
@@ -3,19 +3,33 @@ uniform mat4 ViewMatrix;
uniform sampler2D strokeColor;
uniform sampler2D strokeDepth;
+uniform vec2 Viewport;
uniform int blur[2];
uniform vec3 loc;
uniform float pixsize; /* rv3d->pixsize */
-uniform float pixelsize; /* U.pixelsize */
uniform float pixfactor;
-float defaultpixsize = pixsize * pixelsize * (1000.0 / pixfactor);
+float defaultpixsize = pixsize * (1000.0 / pixfactor);
vec2 noffset = vec2(blur[0], blur[1]);
out vec4 FragColor;
+float get_zdepth(ivec2 poxy)
+{
+ /* if outside viewport set as infinite depth */
+ if ((poxy.x < 0) || (poxy.x > Viewport.x)) {
+ return 1.0f;
+ }
+ if ((poxy.y < 0) || (poxy.y > Viewport.y)) {
+ return 1.0f;
+ }
+
+ float zdepth = texelFetch(strokeDepth, poxy, 0).r;
+ return zdepth;
+}
+
void main()
{
ivec2 uv = ivec2(gl_FragCoord.xy);
@@ -25,22 +39,27 @@ void main()
float dx = (ProjectionMatrix[3][3] == 0.0) ? (noffset[0] / (nloc.z * defaultpixsize)) : (noffset[0] / defaultpixsize);
float dy = (ProjectionMatrix[3][3] == 0.0) ? (noffset[1] / (nloc.z * defaultpixsize)) : (noffset[1] / defaultpixsize);
+ /* round to avoid shift when add more samples */
+ dx = floor(dx) + 1.0;
+ dy = floor(dy) + 1.0;
+
/* apply blurring, using a 9-tap filter with predefined gaussian weights */
- /* depth */
- float outdepth = 0;
- outdepth += texelFetch(strokeDepth, ivec2(uv.x - 1.0 * dx, uv.y + 1.0 * dy), 0).r * 0.0947416;
- outdepth += texelFetch(strokeDepth, ivec2(uv.x - 0.0 * dx, uv.y + 1.0 * dy), 0).r * 0.118318;
- outdepth += texelFetch(strokeDepth, ivec2(uv.x + 1.0 * dx, uv.y + 1.0 * dy), 0).r * 0.0947416;
- outdepth += texelFetch(strokeDepth, ivec2(uv.x - 1.0 * dx, uv.y + 0.0 * dy), 0).r * 0.118318;
+ /* depth (get the value of the surrounding pixels) */
+ float outdepth = 0.0;
+
+ outdepth += get_zdepth(ivec2(uv.x - 1.0 * dx, uv.y + 1.0 * dy)) * 0.0947416;
+ outdepth += get_zdepth(ivec2(uv.x - 0.0 * dx, uv.y + 1.0 * dy)) * 0.118318;
+ outdepth += get_zdepth(ivec2(uv.x + 1.0 * dx, uv.y + 1.0 * dy)) * 0.0947416;
+ outdepth += get_zdepth(ivec2(uv.x - 1.0 * dx, uv.y + 0.0 * dy)) * 0.118318;
- outdepth += texelFetch(strokeDepth, ivec2(uv.x, uv.y), 0).r * 0.147761;
+ outdepth += get_zdepth(ivec2(uv.x, uv.y)) * 0.147761;
- outdepth += texelFetch(strokeDepth, ivec2(uv.x + 1.0 * dx, uv.y + 0.0 * dy), 0).r * 0.118318;
- outdepth += texelFetch(strokeDepth, ivec2(uv.x - 1.0 * dx, uv.y - 1.0 * dy), 0).r * 0.0947416;
- outdepth += texelFetch(strokeDepth, ivec2(uv.x + 0.0 * dx, uv.y - 1.0 * dy), 0).r * 0.118318;
- outdepth += texelFetch(strokeDepth, ivec2(uv.x + 1.0 * dx, uv.y - 1.0 * dy), 0).r * 0.0947416;
+ outdepth += get_zdepth(ivec2(uv.x + 1.0 * dx, uv.y + 0.0 * dy)) * 0.118318;
+ outdepth += get_zdepth(ivec2(uv.x - 1.0 * dx, uv.y - 1.0 * dy)) * 0.0947416;
+ outdepth += get_zdepth(ivec2(uv.x + 0.0 * dx, uv.y - 1.0 * dy)) * 0.118318;
+ outdepth += get_zdepth(ivec2(uv.x + 1.0 * dx, uv.y - 1.0 * dy)) * 0.0947416;
- gl_FragDepth = outdepth;
+ gl_FragDepth = outdepth;
/* color */
vec4 outcolor = vec4(0.0);
@@ -57,4 +76,12 @@ void main()
outcolor += texelFetch(strokeColor, ivec2(uv.x + 1.0 * dx, uv.y - 1.0 * dy), 0) * 0.0947416;
FragColor = clamp(outcolor, 0, 1.0);
+
+ /* discar extreme values */
+ if (outcolor.a < 0.02f) {
+ discard;
+ }
+ if ((outdepth <= 0.000001) || (outdepth >= 0.999999)){
+ discard;
+ }
}
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl
new file mode 100644
index 00000000000..9cdcad3e486
--- /dev/null
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl
@@ -0,0 +1,68 @@
+uniform mat4 ProjectionMatrix;
+uniform mat4 ViewMatrix;
+
+/* ******************************************************************* */
+/* create glow mask */
+/* ******************************************************************* */
+uniform sampler2D strokeColor;
+uniform sampler2D strokeDepth;
+
+uniform vec3 glow_color;
+uniform vec3 select_color;
+uniform float threshold;
+uniform int mode;
+
+out vec4 FragColor;
+
+#define MODE_LUMINANCE 0
+#define MODE_COLOR 1
+
+/* calc luminance */
+float luma( vec3 color ) {
+ /* the color is linear, so do not apply tonemapping */
+ return (color.r + color.g + color.b) / 3.0;
+}
+
+bool check_color(vec3 color_a, vec3 color_b)
+{
+ /* need round the number to avoid precision errors */
+ if ((floor(color_a.r * 100) == floor(color_b.r * 100)) &&
+ (floor(color_a.g * 100) == floor(color_b.g * 100)) &&
+ (floor(color_a.b * 100) == floor(color_b.b * 100)))
+ {
+ return true;
+ }
+
+ return false;
+}
+
+void main()
+{
+ vec2 uv = vec2(gl_FragCoord.xy);
+
+ float stroke_depth = texelFetch(strokeDepth, ivec2(uv.xy), 0).r;
+ vec4 src_pixel= texelFetch(strokeColor, ivec2(uv.xy), 0);
+ vec4 outcolor;
+
+ /* is transparent */
+ if (src_pixel.a == 0.0f) {
+ discard;
+ }
+
+ if (mode == MODE_LUMINANCE) {
+ if (luma(src_pixel.rgb) < threshold) {
+ discard;
+ }
+ }
+ else if (mode == MODE_COLOR) {
+ if (!check_color(src_pixel.rgb, select_color.rgb)) {
+ discard;
+ }
+ }
+ else {
+ discard;
+ }
+
+ gl_FragDepth = stroke_depth;
+ FragColor = vec4(glow_color.rgb, 1.0);
+}
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl
new file mode 100644
index 00000000000..5bff7a20523
--- /dev/null
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl
@@ -0,0 +1,46 @@
+/* ******************************************************************* */
+/* Resolve GLOW pass */
+/* ******************************************************************* */
+uniform sampler2D strokeColor;
+uniform sampler2D strokeDepth;
+uniform sampler2D glowColor;
+uniform sampler2D glowDepth;
+uniform int alpha_mode;
+
+out vec4 FragColor;
+
+void main()
+{
+ vec4 outcolor;
+ ivec2 uv = ivec2(gl_FragCoord.xy);
+
+ float stroke_depth = texelFetch(strokeDepth, uv.xy, 0).r;
+ vec4 src_pixel= texelFetch(strokeColor, uv.xy, 0);
+ vec4 glow_pixel= texelFetch(glowColor, uv.xy, 0);
+ float glow_depth = texelFetch(glowDepth, uv.xy, 0).r;
+
+ if (alpha_mode == 0) {
+ outcolor = src_pixel + glow_pixel;
+ }
+ else {
+ if ((src_pixel.a < 0.1) || (glow_pixel.a < 0.1)) {
+ outcolor = src_pixel + glow_pixel;
+ }
+ else {
+ outcolor = src_pixel;
+ }
+ }
+
+ if (src_pixel.a < glow_pixel.a) {
+ gl_FragDepth = glow_depth;
+ }
+ else {
+ gl_FragDepth = stroke_depth;
+ }
+
+ if (outcolor.a < 0.001) {
+ discard;
+ }
+
+ FragColor = outcolor;
+}
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_light_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_light_frag.glsl
index 6dcd0499baf..c12dd223ebe 100644
--- a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_light_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_light_frag.glsl
@@ -9,12 +9,11 @@ uniform float energy;
uniform float ambient;
uniform float pixsize; /* rv3d->pixsize */
-uniform float pixelsize; /* U.pixelsize */
uniform float pixfactor;
out vec4 FragColor;
-float defaultpixsize = pixsize * pixelsize * (1000.0 / pixfactor);
+float defaultpixsize = pixsize * (1000.0 / pixfactor);
#define height loc.w
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_pixel_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_pixel_frag.glsl
index 0b25dbbd012..eb5596c639a 100644
--- a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_pixel_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_pixel_frag.glsl
@@ -9,13 +9,12 @@ uniform vec4 color;
uniform vec3 loc;
uniform float pixsize; /* rv3d->pixsize */
-uniform float pixelsize; /* U.pixelsize */
uniform float pixfactor;
out vec4 FragColor;
int uselines = size[2];
-float defaultpixsize = pixsize * pixelsize * (1000.0 / pixfactor);
+float defaultpixsize = pixsize * (1000.0 / pixfactor);
vec2 nsize = max(vec2(size[0], size[1]), 3.0);
/* This pixelation shader is a modified version of original Geeks3d.com code */
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_rim_prepare_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_rim_prepare_frag.glsl
index 6ea4faf11fd..2321429fbf1 100644
--- a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_rim_prepare_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_rim_prepare_frag.glsl
@@ -14,10 +14,9 @@ uniform vec3 mask_color;
uniform vec3 loc;
uniform float pixsize; /* rv3d->pixsize */
-uniform float pixelsize; /* U.pixelsize */
uniform float pixfactor;
-float defaultpixsize = pixsize * pixelsize * (1000.0 / pixfactor);
+float defaultpixsize = pixsize * (1000.0 / pixfactor);
vec2 noffset = vec2(offset[0], offset[1]);
out vec4 FragColor;
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_shadow_prepare_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_shadow_prepare_frag.glsl
new file mode 100644
index 00000000000..8bb92f69723
--- /dev/null
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_shadow_prepare_frag.glsl
@@ -0,0 +1,97 @@
+uniform mat4 ProjectionMatrix;
+uniform mat4 ViewMatrix;
+
+/* ******************************************************************* */
+/* create shadow */
+/* ******************************************************************* */
+uniform sampler2D strokeColor;
+uniform sampler2D strokeDepth;
+uniform vec2 Viewport;
+
+uniform int offset[2];
+uniform float scale[2];
+uniform float rotation;
+uniform vec4 shadow_color;
+
+uniform float amplitude;
+uniform float period;
+uniform float phase;
+uniform int orientation;
+
+uniform vec3 loc;
+uniform float pixsize; /* rv3d->pixsize */
+uniform float pixfactor;
+
+#define M_PI 3.1415926535897932384626433832795
+
+#define HORIZONTAL 0
+#define VERTICAL 1
+
+float defaultpixsize = pixsize * (1000.0 / pixfactor);
+vec2 noffset = vec2(offset[0], offset[1]);
+float cosv = cos(rotation);
+float sinv = sin(rotation);
+
+out vec4 FragColor;
+
+/* project 3d point to 2d on screen space */
+vec2 toScreenSpace(vec4 vertex)
+{
+ /* need to calculate ndc because this is not done by vertex shader */
+ vec3 ndc = vec3(vertex).xyz / vertex.w;
+
+ vec2 sc;
+ sc.x = ((ndc.x + 1.0) / 2.0) * Viewport.x;
+ sc.y = ((ndc.y + 1.0) / 2.0) * Viewport.y;
+
+ return sc;
+}
+
+void main()
+{
+ vec2 uv = vec2(gl_FragCoord.xy);
+ vec4 nloc = ProjectionMatrix * ViewMatrix * vec4(loc.xyz, 1.0);
+ vec2 loc2d = toScreenSpace(nloc);
+
+ float dx = (ProjectionMatrix[3][3] == 0.0) ? (noffset[0] / (nloc.z * defaultpixsize)) : (noffset[0] / defaultpixsize);
+ float dy = (ProjectionMatrix[3][3] == 0.0) ? (noffset[1] / (nloc.z * defaultpixsize)) : (noffset[1] / defaultpixsize);
+
+
+ /* move point to new coords system */
+ vec2 tpos = vec2(uv.x, uv.y) - loc2d;
+
+ /* rotation */
+ if (rotation != 0) {
+ vec2 rotpoint = vec2((tpos.x * cosv) - (tpos.y * sinv), (tpos.x * sinv) + (tpos.y * cosv));
+ tpos = rotpoint;
+ }
+
+ /* apply offset */
+ tpos = vec2(tpos.x - dx, tpos.y - dy);
+
+ /* apply scale */
+ tpos.x *= 1.0 / scale[0];
+ tpos.y *= 1.0 / scale[1];
+
+ /* back to original coords system */
+ vec2 texpos = tpos + loc2d;
+
+ /* wave */
+ if (orientation == HORIZONTAL) {
+ float pval = (uv.x * M_PI) / Viewport[0];
+ texpos.y += amplitude * sin((period * pval) + phase);
+ }
+ else if (orientation == VERTICAL){
+ float pval = (uv.y * M_PI) / Viewport[1];
+ texpos.x += amplitude * sin((period * pval) + phase);
+ }
+
+ vec4 src_pixel = texelFetch(strokeColor, ivec2(texpos.x, texpos.y), 0);
+ /* is transparent */
+ if (src_pixel.a == 0.0f) {
+ discard;
+ }
+
+ gl_FragDepth = texelFetch(strokeDepth, ivec2(texpos.x, texpos.y), 0).r;
+ FragColor = shadow_color;
+}
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_shadow_resolve_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_shadow_resolve_frag.glsl
new file mode 100644
index 00000000000..0343d0d42fc
--- /dev/null
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_shadow_resolve_frag.glsl
@@ -0,0 +1,32 @@
+/* ******************************************************************* */
+/* Resolve Shadow pass */
+/* ******************************************************************* */
+uniform sampler2D strokeColor;
+uniform sampler2D strokeDepth;
+uniform sampler2D shadowColor;
+uniform sampler2D shadowDepth;
+
+out vec4 FragColor;
+
+void main()
+{
+ ivec2 uv = ivec2(gl_FragCoord.xy);
+
+ float stroke_depth = texelFetch(strokeDepth, uv.xy, 0).r;
+ float shadow_depth = texelFetch(shadowDepth, uv.xy, 0).r;
+ vec4 stroke_pixel= texelFetch(strokeColor, uv.xy, 0);
+ vec4 shadow_pixel= texelFetch(shadowColor, uv.xy, 0);
+
+ /* copy original pixel */
+ vec4 outcolor = stroke_pixel;
+ float outdepth = stroke_depth;
+
+ /* if stroke is not on top, copy shadow */
+ if ((stroke_pixel.a <= 0.2) && (shadow_pixel.a > 0.0)) {
+ outcolor = shadow_pixel;
+ outdepth = shadow_depth;
+ }
+
+ gl_FragDepth = outdepth;
+ FragColor = outcolor;
+}
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_swirl_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_swirl_frag.glsl
index 78aacafdcb7..92485987c93 100644
--- a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_swirl_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_swirl_frag.glsl
@@ -11,12 +11,11 @@ uniform float angle;
uniform int transparent;
uniform float pixsize; /* rv3d->pixsize */
-uniform float pixelsize; /* U.pixelsize */
uniform float pixfactor;
out vec4 FragColor;
-float defaultpixsize = pixsize * pixelsize * (1000.0 / pixfactor);
+float defaultpixsize = pixsize * (1000.0 / pixfactor);
/* project 3d point to 2d on screen space */
vec2 toScreenSpace(vec4 vertex)
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl
index 882b2cf59f1..3dbab0297c4 100644
--- a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl
@@ -37,4 +37,7 @@ void main()
FragColor = outcolor;
gl_FragDepth = stroke_depth;
+
+ if (outcolor.a < 0.02f)
+ discard;
}
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_point_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_point_frag.glsl
index 0d6d2b22a55..db973056110 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_point_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_point_frag.glsl
@@ -46,4 +46,6 @@ void main()
/* mult both alpha factor to use strength factor with color alpha limit */
fragColor.a = min(text_color.a * mColor.a, mColor.a);
}
+ if(fragColor.a < 0.0035)
+ discard;
}
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_point_vert.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_point_vert.glsl
index 5e89bf8e5ce..f870bfbb48d 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_point_vert.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_point_vert.glsl
@@ -2,7 +2,6 @@ uniform mat4 ModelViewProjectionMatrix;
uniform mat4 ProjectionMatrix;
uniform float pixsize; /* rv3d->pixsize */
-uniform float pixelsize; /* U.pixelsize */
uniform int keep_size;
uniform float objscale;
uniform float pixfactor;
@@ -18,7 +17,7 @@ out vec2 finaluvdata;
#define TRUE 1
-float defaultpixsize = pixsize * pixelsize * (1000.0 / pixfactor);
+float defaultpixsize = pixsize * (1000.0 / pixfactor);
void main()
{
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_frag.glsl
index d57921c1629..9a82e871f56 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_frag.glsl
@@ -43,4 +43,7 @@ void main()
/* mult both alpha factor to use strength factor with color alpha limit */
fragColor.a = min(text_color.a * tColor.a, tColor.a);
}
+
+ if(fragColor.a < 0.0035)
+ discard;
}
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_vert.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_vert.glsl
index 2f9a105e911..121e244ac8a 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_vert.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_stroke_vert.glsl
@@ -2,7 +2,6 @@ uniform mat4 ModelViewProjectionMatrix;
uniform mat4 ProjectionMatrix;
uniform float pixsize; /* rv3d->pixsize */
-uniform float pixelsize; /* U.pixelsize */
uniform int keep_size;
uniform float objscale;
uniform float pixfactor;
@@ -18,7 +17,7 @@ out vec2 finaluvdata;
#define TRUE 1
-float defaultpixsize = pixsize * pixelsize * (1000.0 / pixfactor);
+float defaultpixsize = pixsize * (1000.0 / pixfactor);
void main(void)
{
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_checkerboard_depth_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_checkerboard_depth_frag.glsl
index 7027543f5a9..94fa5d51229 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_checkerboard_depth_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_checkerboard_depth_frag.glsl
@@ -9,6 +9,7 @@ const vec4 dither_mat[4] = vec4[4](
);
uniform float threshold = 0.5;
+uniform float offset = 0.0;
/* Noise dithering pattern
* 0 - Bayer matrix
@@ -24,7 +25,7 @@ void main()
#elif NOISE == 1
/* Interlieved gradient noise by Jorge Jimenez
* http://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare */
- float noise = fract(52.9829189 * fract(0.06711056 * gl_FragCoord.x + 0.00583715 * gl_FragCoord.y));
+ float noise = fract(offset + 52.9829189 * fract(0.06711056 * gl_FragCoord.x + 0.00583715 * gl_FragCoord.y));
#else
#error
#endif
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
index bf856fbb212..508aeb1f0c1 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
@@ -44,7 +44,11 @@ void main()
fragColor = vec4(background, world_data.background_alpha);
}
else {
- fragColor = vec4(mix(world_data.object_outline_color.rgb, background, object_outline), clamp(world_data.background_alpha, 1.0, object_outline));
+ /* Do correct alpha blending. */
+ vec4 background_color = vec4(background, 1.0) * world_data.background_alpha;
+ vec4 outline_color = vec4(world_data.object_outline_color.rgb, 1.0);
+ fragColor = mix(outline_color, background_color, object_outline);
+ fragColor = vec4(fragColor.rgb / max(1e-8, fragColor.a), fragColor.a);
}
return;
}
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 1f14e506dcf..0bb6af40647 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
@@ -3,11 +3,18 @@ uniform mat4 ProjectionMatrix;
uniform mat4 ModelMatrixInverse;
uniform mat4 ModelViewMatrixInverse;
uniform mat4 ModelMatrix;
+uniform vec3 OrcoTexCoFactors[2];
uniform sampler2D depthBuffer;
+
uniform sampler3D densityTexture;
+uniform sampler3D shadowTexture;
+uniform sampler3D flameTexture;
+uniform sampler1D flameColorTexture;
+uniform sampler1D transferTexture;
uniform int samplesLen = 256;
+uniform float noiseOfs = 0.0f;
uniform float stepLength; /* Step length in local space. */
uniform float densityScale; /* Simple Opacity multiplicator. */
uniform vec4 viewvecs[3];
@@ -60,17 +67,92 @@ float line_unit_box_intersect_dist(vec3 lineorigin, vec3 linedirection)
return max_v3(furthestplane);
}
+#define sample_trilinear(ima, co) texture(ima, co)
+
+vec4 sample_tricubic(sampler3D ima, vec3 co)
+{
+ vec3 tex_size = vec3(textureSize(ima, 0).xyz);
+
+ co *= tex_size;
+ /* texel center */
+ vec3 tc = floor(co - 0.5) + 0.5;
+ vec3 f = co - tc;
+ vec3 f2 = f * f;
+ vec3 f3 = f2 * f;
+ /* Bspline coefs (optimized) */
+ vec3 w3 = f3 / 6.0;
+ vec3 w0 = -w3 + f2 * 0.5 - f * 0.5 + 1.0 / 6.0;
+ vec3 w1 = f3 * 0.5 - f2 + 2.0 / 3.0;
+ vec3 w2 = 1.0 - w0 - w1 - w3;
+
+ vec3 s0 = w0 + w1;
+ vec3 s1 = w2 + w3;
+
+ vec3 f0 = w1 / (w0 + w1);
+ vec3 f1 = w3 / (w2 + w3);
+
+ vec2 final_z;
+ vec4 final_co;
+ final_co.xy = tc.xy - 1.0 + f0.xy;
+ final_co.zw = tc.xy + 1.0 + f1.xy;
+ final_z = tc.zz + vec2(-1.0, 1.0) + vec2(f0.z, f1.z);
+
+ final_co /= tex_size.xyxy;
+ final_z /= tex_size.zz;
+
+ vec4 color;
+ color = texture(ima, vec3(final_co.xy, final_z.x)) * s0.x * s0.y * s0.z;
+ color += texture(ima, vec3(final_co.zy, final_z.x)) * s1.x * s0.y * s0.z;
+ color += texture(ima, vec3(final_co.xw, final_z.x)) * s0.x * s1.y * s0.z;
+ color += texture(ima, vec3(final_co.zw, final_z.x)) * s1.x * s1.y * s0.z;
+
+ color += texture(ima, vec3(final_co.xy, final_z.y)) * s0.x * s0.y * s1.z;
+ color += texture(ima, vec3(final_co.zy, final_z.y)) * s1.x * s0.y * s1.z;
+ color += texture(ima, vec3(final_co.xw, final_z.y)) * s0.x * s1.y * s1.z;
+ color += texture(ima, vec3(final_co.zw, final_z.y)) * s1.x * s1.y * s1.z;
+
+ return color;
+}
+
+#ifdef USE_TRICUBIC
+# define sample_volume_texture sample_tricubic
+#else
+# define sample_volume_texture sample_trilinear
+#endif
+
void volume_properties(vec3 ls_pos, out vec3 scattering, out float extinction)
{
- scattering = vec3(0.0);
- extinction = 1e-8;
+ vec3 co = ls_pos * 0.5 + 0.5;
+#ifdef USE_COBA
+ float val = sample_volume_texture(densityTexture, co).r;
+ vec4 tval = texture(transferTexture, val) * densityScale;
+ tval.rgb = pow(tval.rgb, vec3(2.2));
+ scattering = tval.rgb * 1500.0;
+ extinction = max(1e-4, tval.a * 50.0);
+#else
+ float flame = sample_volume_texture(flameTexture, co).r;
+ vec4 emission = texture(flameColorTexture, flame);
+ float shadows = sample_volume_texture(shadowTexture, co).r;
+ vec4 density = sample_volume_texture(densityTexture, co); /* rgb: color, a: density */
- vec4 density = texture(densityTexture, ls_pos * 0.5 + 0.5);
- density.rgb /= density.a;
- density *= densityScale;
+ scattering = density.rgb * (density.a * densityScale);
+ extinction = max(1e-4, dot(scattering, vec3(0.33333)));
- scattering = density.rgb;
- extinction = max(1e-8, density.a);
+ /* Scale shadows in log space and clamp them to avoid completely black shadows. */
+ scattering *= exp(clamp(log(shadows) * densityScale * 0.1, -2.5, 0.0)) * M_PI;
+
+ /* 800 is arbitrary and here to mimic old viewport. TODO make it a parameter */
+ scattering += pow(emission.rgb, vec3(2.2)) * emission.a * 800.0;
+#endif
+}
+
+void eval_volume_step(inout vec3 Lscat, float extinction, float step_len, out float Tr)
+{
+ Lscat *= phase_function_isotropic();
+ /* Evaluate Scattering */
+ Tr = exp(-extinction * step_len);
+ /* integrate along the current step segment */
+ Lscat = (Lscat - Lscat * Tr) / extinction;
}
#define P(x) ((x + 0.5) * (1.0 / 16.0))
@@ -89,25 +171,22 @@ vec4 volume_integration(
float final_transmittance = 1.0;
ivec2 tx = ivec2(gl_FragCoord.xy) % 4;
- float noise = dither_mat[tx.x][tx.y];
+ float noise = fract(dither_mat[tx.x][tx.y] + noiseOfs);
float ray_len = noise * ray_inc;
for (int i = 0; i < samplesLen && ray_len < ray_max; ++i, ray_len += ray_inc) {
vec3 ls_pos = ray_ori + ray_dir * ray_len;
vec3 Lscat;
- float s_extinction;
+ float s_extinction, Tr;
volume_properties(ls_pos, Lscat, s_extinction);
- /* Evaluate Scattering */
- float Tr = exp(-s_extinction * step_len);
- /* integrate along the current step segment */
- Lscat = (Lscat - Lscat * Tr) / s_extinction;
+ eval_volume_step(Lscat, s_extinction, step_len, Tr);
/* accumulate and also take into account the transmittance from previous steps */
final_scattering += final_transmittance * Lscat;
final_transmittance *= Tr;
}
- return vec4(final_scattering, 1.0 - final_transmittance);
+ return vec4(final_scattering, final_transmittance);
}
void main()
@@ -134,15 +213,11 @@ void main()
step_len = 1.0 / step_len;
vec3 Lscat;
- float s_extinction;
+ float s_extinction, Tr;
volume_properties(localPos, Lscat, s_extinction);
- /* Evaluate Scattering */
- float Tr = exp(-s_extinction * step_len);
- /* integrate along the current step segment */
- Lscat = (Lscat - Lscat * Tr) / s_extinction;
-
- fragColor = vec4(Lscat, 1.0 - Tr);
+ eval_volume_step(Lscat, s_extinction, step_len, Tr);
+ fragColor = vec4(Lscat, Tr);
#else
vec2 screen_uv = gl_FragCoord.xy / vec2(textureSize(depthBuffer, 0).xy);
bool is_persp = ProjectionMatrix[3][3] == 0.0;
@@ -156,10 +231,13 @@ void main()
vec3 vs_ray_dir = (is_persp) ? (vs_ray_end - vs_ray_ori) : vec3(0.0, 0.0, -1.0);
vs_ray_dir /= abs(vs_ray_dir.z);
- vec3 ls_ray_dir = mat3(ModelViewMatrixInverse) * vs_ray_dir;
+ vec3 ls_ray_dir = mat3(ModelViewMatrixInverse) * vs_ray_dir * OrcoTexCoFactors[1] * 2.0;
vec3 ls_ray_ori = (ModelViewMatrixInverse * vec4(vs_ray_ori, 1.0)).xyz;
vec3 ls_ray_end = (ModelViewMatrixInverse * vec4(vs_ray_end, 1.0)).xyz;
+ ls_ray_ori = (OrcoTexCoFactors[0] + ls_ray_ori * OrcoTexCoFactors[1]) * 2.0 - 1.0;
+ ls_ray_end = (OrcoTexCoFactors[0] + ls_ray_end * OrcoTexCoFactors[1]) * 2.0 - 1.0;
+
/* TODO: Align rays to volume center so that it mimics old behaviour of slicing the volume. */
float dist = line_unit_box_intersect_dist(ls_ray_ori, ls_ray_dir);
@@ -178,4 +256,7 @@ void main()
length(ls_vol_isect) / length(ls_ray_dir),
length(vs_ray_dir) * stepLength);
#endif
+
+ /* Convert transmitance to alpha so we can use premul blending. */
+ fragColor.a = 1.0 - fragColor.a;
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
index 90a22d9d02f..7ce21c3d5ca 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
@@ -1,5 +1,6 @@
uniform mat4 ModelViewProjectionMatrix;
+uniform vec3 OrcoTexCoFactors[2];
uniform float slicePosition;
uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */
@@ -23,9 +24,10 @@ void main()
else {
localPos = vec3(pos.xy, slicePosition * 2.0 - 1.0);
}
-
- gl_Position = ModelViewProjectionMatrix * vec4(localPos, 1.0);
+ vec3 final_pos = localPos;
#else
- gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ vec3 final_pos = pos;
#endif
+ final_pos = ((final_pos * 0.5 + 0.5) - OrcoTexCoFactors[0]) / OrcoTexCoFactors[1];
+ gl_Position = ModelViewProjectionMatrix * vec4(final_pos, 1.0);
}
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index 49cdab256f0..29a3249782d 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -53,7 +53,7 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
WORKBENCH_UBO_World *wd = &wpd->world_data;
wd->matcap_orientation = (wpd->shading.flag & V3D_SHADING_MATCAP_FLIP_X) != 0;
- wd->background_alpha = (v3d || scene->r.alphamode == R_ADDSKY) ? 1.0f : 0.0f;
+ wd->background_alpha = (DRW_state_is_image_render() && scene->r.alphamode == R_ALPHAPREMUL) ? 0.0f : 1.0f;
if (!v3d || ((v3d->shading.background_type & V3D_SHADING_BACKGROUND_WORLD) &&
(scene->world != NULL)))
@@ -70,7 +70,7 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
UI_GetThemeColor3fv(TH_HIGH_GRAD, wd->background_color_high);
/* XXX: Really quick conversion to avoid washed out background.
- * Needs to be adressed properly (color managed using ocio). */
+ * Needs to be addressed properly (color managed using ocio). */
srgb_to_linearrgb_v3_v3(wd->background_color_high, wd->background_color_high);
srgb_to_linearrgb_v3_v3(wd->background_color_low, wd->background_color_low);
}
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index c72e1d9fece..f7ab9bad5ec 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -106,6 +106,8 @@ extern char datatoc_workbench_data_lib_glsl[];
extern char datatoc_workbench_object_outline_lib_glsl[];
extern char datatoc_workbench_world_light_lib_glsl[];
+extern char datatoc_gpu_shader_depth_only_frag_glsl[];
+
static char *workbench_build_composite_frag(WORKBENCH_PrivateData *wpd)
{
char *str = NULL;
@@ -234,7 +236,7 @@ static float *create_disk_samples(int num_samples, int num_iterations)
float phi = (float)dphi * 2.0f * M_PI + it_add;
texels[i][0] = cosf(phi);
texels[i][1] = sinf(phi);
- /* This deliberatly distribute more samples
+ /* This deliberately distribute more samples
* at the center of the disk (and thus the shadow). */
texels[i][2] = r;
}
@@ -296,7 +298,7 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
#ifdef DEBUG_SHADOW_VOLUME
const char *shadow_frag = datatoc_workbench_shadow_debug_frag_glsl;
#else
- const char *shadow_frag = NULL;
+ const char *shadow_frag = datatoc_gpu_shader_depth_only_frag_glsl;
#endif
e_data.shadow_pass_sh = DRW_shader_create(
datatoc_workbench_shadow_vert_glsl,
@@ -616,7 +618,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
material_template.ima = ima;
uint hash = workbench_material_get_hash(&material_template, is_ghost);
- material = BLI_ghash_lookup(wpd->material_hash, SET_UINT_IN_POINTER(hash));
+ material = BLI_ghash_lookup(wpd->material_hash, POINTER_FROM_UINT(hash));
if (material == NULL) {
material = MEM_mallocN(sizeof(WORKBENCH_MaterialData), __func__);
material->shgrp = DRW_shgroup_create(
@@ -627,7 +629,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
DRW_shgroup_uniform_int(material->shgrp, "object_id", &material->object_id, 1);
workbench_material_shgroup_uniform(wpd, material->shgrp, material, ob);
- BLI_ghash_insert(wpd->material_hash, SET_UINT_IN_POINTER(hash), material);
+ BLI_ghash_insert(wpd->material_hash, POINTER_FROM_UINT(hash), material);
}
return material;
}
@@ -649,7 +651,7 @@ static void workbench_cache_populate_particles(WORKBENCH_Data *vedata, Object *o
if (!psys_check_enabled(ob, psys, false)) {
continue;
}
- if (!DRW_check_psys_visible_within_active_context(ob, psys)) {
+ if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) {
continue;
}
ParticleSettings *part = psys->part;
@@ -701,7 +703,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob)
return; /* Do not draw solid in this case. */
}
- if (!DRW_check_object_visible_within_active_context(ob)) {
+ if (!DRW_object_is_visible_in_active_context(ob) || (ob->dt < OB_SOLID)) {
return;
}
@@ -783,8 +785,8 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob)
if (geom_shadow) {
if (is_sculpt_mode) {
/* Currently unsupported in sculpt mode. We could revert to the slow
- * method in this case but i'm not sure if it's a good idea given that
- * sculped meshes are heavy to begin with. */
+ * method in this case but I'm not sure if it's a good idea given that
+ * sculpted meshes are heavy to begin with. */
// DRW_shgroup_call_sculpt_add(wpd->shadow_shgrp, ob, ob->obmat);
}
else {
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c
index 410c693689f..9991c30ea8e 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -155,7 +155,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
material_template.ima = ima;
uint hash = workbench_material_get_hash(&material_template, false);
- material = BLI_ghash_lookup(wpd->material_hash, SET_UINT_IN_POINTER(hash));
+ material = BLI_ghash_lookup(wpd->material_hash, POINTER_FROM_UINT(hash));
if (material == NULL) {
material = MEM_mallocN(sizeof(WORKBENCH_MaterialData), __func__);
@@ -192,7 +192,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
}
material->object_id = engine_object_data->object_id;
DRW_shgroup_uniform_int(material->shgrp_object_outline, "object_id", &material->object_id, 1);
- BLI_ghash_insert(wpd->material_hash, SET_UINT_IN_POINTER(hash), material);
+ BLI_ghash_insert(wpd->material_hash, POINTER_FROM_UINT(hash), material);
}
return material;
}
@@ -363,11 +363,29 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata)
/* Checker Depth */
{
+ static float noise_offset = 0.0f;
+ float blend_threshold = 0.0f;
+
+ if (DRW_state_is_image_render()) {
+ /* TODO: Should be based on the number of samples used for render. */
+ noise_offset = fmodf(noise_offset + 1.0f / 8.0f, 1.0f);
+ }
+
+ if (wpd->shading.flag & XRAY_FLAG(wpd)) {
+ blend_threshold = 1.0f - XRAY_ALPHA(wpd) * 0.9f;
+ }
+
+ if (wpd->shading.type == OB_WIRE) {
+ wpd->shading.xray_alpha = 0.0f;
+ wpd->shading.xray_alpha_wire = 0.0f;
+ }
+
int state = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_ALWAYS;
psl->checker_depth_pass = DRW_pass_create("Checker Depth", state);
grp = DRW_shgroup_create(e_data.checker_depth_sh, psl->checker_depth_pass);
DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL);
- DRW_shgroup_uniform_float_copy(grp, "threshold", 0.75f - wpd->shading.xray_alpha * 0.5f);
+ DRW_shgroup_uniform_float_copy(grp, "threshold", blend_threshold);
+ DRW_shgroup_uniform_float_copy(grp, "offset", noise_offset);
}
}
@@ -409,7 +427,7 @@ static void workbench_forward_cache_populate_particles(WORKBENCH_Data *vedata, O
if (!psys_check_enabled(ob, psys, false)) {
continue;
}
- if (!DRW_check_psys_visible_within_active_context(ob, psys)) {
+ if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) {
continue;
}
ParticleSettings *part = psys->part;
@@ -435,7 +453,7 @@ static void workbench_forward_cache_populate_particles(WORKBENCH_Data *vedata, O
DRW_shgroup_uniform_vec4(shgrp, "viewvecs[0]", (float *)wpd->viewvecs, 3);
/* Hairs have lots of layer and can rapidly become the most prominent surface.
* So lower their alpha artificially. */
- float hair_alpha = wpd->shading.xray_alpha * 0.33f;
+ float hair_alpha = XRAY_ALPHA(wpd) * 0.33f;
DRW_shgroup_uniform_float_copy(shgrp, "alpha", hair_alpha);
if (STUDIOLIGHT_ORIENTATION_VIEWNORMAL_ENABLED(wpd)) {
BKE_studiolight_ensure_flag(wpd->studio_light, STUDIOLIGHT_EQUIRECTANGULAR_RADIANCE_GPUTEXTURE);
@@ -458,6 +476,7 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
WORKBENCH_PrivateData *wpd = stl->g_data;
const DRWContextState *draw_ctx = DRW_context_state_get();
Scene *scene = draw_ctx->scene;
+ const bool is_wire = (ob->dt == OB_WIRE);
if (!DRW_object_is_renderable(ob))
return;
@@ -476,7 +495,7 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
return; /* Do not draw solid in this case. */
}
- if (!DRW_check_object_visible_within_active_context(ob)) {
+ if (!DRW_object_is_visible_in_active_context(ob) || (ob->dt < OB_WIRE)) {
return;
}
@@ -529,11 +548,15 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
material = get_or_create_material_data(vedata, ob, NULL, NULL, wpd->shading.color_type);
if (is_sculpt_mode) {
DRW_shgroup_call_sculpt_add(material->shgrp_object_outline, ob, ob->obmat);
- DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat);
+ if (!is_wire) {
+ DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat);
+ }
}
else {
DRW_shgroup_call_object_add(material->shgrp_object_outline, geom, ob);
- DRW_shgroup_call_object_add(material->shgrp, geom, ob);
+ if (!is_wire) {
+ DRW_shgroup_call_object_add(material->shgrp, geom, ob);
+ }
}
}
}
@@ -556,11 +579,15 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
material = get_or_create_material_data(vedata, ob, mat, NULL, V3D_SHADING_MATERIAL_COLOR);
if (is_sculpt_mode) {
DRW_shgroup_call_sculpt_add(material->shgrp_object_outline, ob, ob->obmat);
- DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat);
+ if (!is_wire) {
+ DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat);
+ }
}
else {
DRW_shgroup_call_object_add(material->shgrp_object_outline, mat_geom[i], ob);
- DRW_shgroup_call_object_add(material->shgrp, mat_geom[i], ob);
+ if (!is_wire) {
+ DRW_shgroup_call_object_add(material->shgrp, mat_geom[i], ob);
+ }
}
}
}
@@ -601,14 +628,14 @@ void workbench_forward_draw_scene(WORKBENCH_Data *vedata)
GPU_framebuffer_clear_color(fbl->object_outline_fb, clear_outline);
DRW_draw_pass(psl->object_outline_pass);
- if (wpd->shading.xray_alpha > 0.0) {
+ if (XRAY_ALPHA(wpd) > 0.0) {
const float clear_color[4] = {0.0f, 0.0f, 0.0f, 1.0f};
GPU_framebuffer_bind(fbl->transparent_accum_fb);
GPU_framebuffer_clear_color(fbl->transparent_accum_fb, clear_color);
DRW_draw_pass(psl->transparent_accum_pass);
}
else {
- /* TODO(fclem): this is unecessary and takes up perf.
+ /* TODO(fclem): this is unnecessary and takes up perf.
* Better change the composite frag shader to not use the tx. */
const float clear_color[4] = {0.0f, 0.0f, 0.0f, 1.0f};
GPU_framebuffer_bind(fbl->transparent_accum_fb);
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index bb013691602..35cd3cc140e 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -57,7 +57,7 @@
#define FXAA_ENABLED(wpd) ((!DRW_state_is_opengl_render()) && \
(IN_RANGE(wpd->user_preferences->gpu_viewport_quality, GPU_VIEWPORT_QUALITY_FXAA, GPU_VIEWPORT_QUALITY_TAA8) || \
((IS_NAVIGATING(wpd) || wpd->is_playback) && (wpd->user_preferences->gpu_viewport_quality >= GPU_VIEWPORT_QUALITY_TAA8))))
-#define TAA_ENABLED(wpd) (wpd->user_preferences->gpu_viewport_quality >= GPU_VIEWPORT_QUALITY_TAA8 && !IS_NAVIGATING(wpd) && !wpd->is_playback)
+#define TAA_ENABLED(wpd) (DRW_state_is_image_render() || (wpd->user_preferences->gpu_viewport_quality >= GPU_VIEWPORT_QUALITY_TAA8 && !IS_NAVIGATING(wpd) && !wpd->is_playback))
#define SPECULAR_HIGHLIGHT_ENABLED(wpd) ((wpd->shading.flag & V3D_SHADING_SPECULAR_HIGHLIGHT) && (!STUDIOLIGHT_ORIENTATION_VIEWNORMAL_ENABLED(wpd)))
#define OBJECT_ID_PASS_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_OBJECT_OUTLINE)
#define NORMAL_VIEWPORT_COMP_PASS_ENABLED(wpd) (MATCAP_ENABLED(wpd) || STUDIOLIGHT_ENABLED(wpd) || SHADOW_ENABLED(wpd) || SPECULAR_HIGHLIGHT_ENABLED(wpd))
diff --git a/source/blender/draw/engines/workbench/workbench_render.c b/source/blender/draw/engines/workbench/workbench_render.c
index bdbf473ec2d..e8d525585f4 100644
--- a/source/blender/draw/engines/workbench/workbench_render.c
+++ b/source/blender/draw/engines/workbench/workbench_render.c
@@ -137,7 +137,7 @@ void workbench_render(WORKBENCH_Data *data, RenderEngine *engine, RenderLayer *r
return;
}
- const bool deferred = (scene->display.shading.flag & V3D_SHADING_XRAY) == 0;
+ const bool deferred = (scene->display.shading.flag & XRAY_FLAG(&scene->display)) == 0;
if (deferred) {
/* Init engine. */
@@ -155,6 +155,8 @@ void workbench_render(WORKBENCH_Data *data, RenderEngine *engine, RenderLayer *r
if (RE_engine_test_break(engine)) {
break;
}
+ /* TODO: Save matrices instead of recomputing them for each samples. */
+ workbench_render_matrices_init(engine, depsgraph);
workbench_deferred_draw_background(data);
workbench_deferred_draw_scene(data);
diff --git a/source/blender/draw/engines/workbench/workbench_volume.c b/source/blender/draw/engines/workbench/workbench_volume.c
index ea4152486af..fa6f740be1a 100644
--- a/source/blender/draw/engines/workbench/workbench_volume.c
+++ b/source/blender/draw/engines/workbench/workbench_volume.c
@@ -26,6 +26,10 @@
#include "workbench_private.h"
#include "BKE_modifier.h"
+#include "BKE_object.h"
+
+#include "BLI_rand.h"
+#include "BLI_dynstr.h"
#include "DNA_modifier_types.h"
#include "DNA_object_force_types.h"
@@ -33,30 +37,76 @@
#include "GPU_draw.h"
+enum {
+ VOLUME_SH_SLICE = 0,
+ VOLUME_SH_COBA,
+ VOLUME_SH_CUBIC,
+};
+
+#define VOLUME_SH_MAX (1 << (VOLUME_SH_CUBIC + 1))
+
static struct {
- struct GPUShader *volume_sh;
+ struct GPUShader *volume_sh[VOLUME_SH_MAX];
+ struct GPUShader *volume_coba_sh;
struct GPUShader *volume_slice_sh;
+ struct GPUShader *volume_slice_coba_sh;
+ struct GPUTexture *dummy_tex;
+ struct GPUTexture *dummy_coba_tex;
} e_data = {NULL};
extern char datatoc_workbench_volume_vert_glsl[];
extern char datatoc_workbench_volume_frag_glsl[];
-void workbench_volume_engine_init(void)
+static GPUShader *volume_shader_get(bool slice, bool coba, bool cubic)
{
- if (!e_data.volume_sh) {
- e_data.volume_sh = DRW_shader_create(
+ int id = 0;
+ id += (slice) ? (1 << VOLUME_SH_SLICE) : 0;
+ id += (coba) ? (1 << VOLUME_SH_COBA) : 0;
+ id += (cubic) ? (1 << VOLUME_SH_CUBIC) : 0;
+
+ if (!e_data.volume_sh[id]) {
+ DynStr *ds = BLI_dynstr_new();
+
+ if (slice) {
+ BLI_dynstr_append(ds, "#define VOLUME_SLICE\n");
+ }
+ if (coba) {
+ BLI_dynstr_append(ds, "#define USE_COBA\n");
+ }
+ if (cubic) {
+ BLI_dynstr_append(ds, "#define USE_TRICUBIC\n");
+ }
+
+ char *defines = BLI_dynstr_get_cstring(ds);
+ BLI_dynstr_free(ds);
+
+ e_data.volume_sh[id] = DRW_shader_create(
datatoc_workbench_volume_vert_glsl, NULL,
- datatoc_workbench_volume_frag_glsl, NULL);
- e_data.volume_slice_sh = DRW_shader_create(
- datatoc_workbench_volume_vert_glsl, NULL,
- datatoc_workbench_volume_frag_glsl, "#define VOLUME_SLICE");
+ datatoc_workbench_volume_frag_glsl,
+ defines);
+
+ MEM_freeN(defines);
+ }
+
+ return e_data.volume_sh[id];
+}
+
+void workbench_volume_engine_init(void)
+{
+ if (!e_data.dummy_tex) {
+ float pixel[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+ e_data.dummy_tex = GPU_texture_create_3D(1, 1, 1, GPU_RGBA8, pixel, NULL);
+ e_data.dummy_coba_tex = GPU_texture_create_1D(1, GPU_RGBA8, pixel, NULL);
}
}
void workbench_volume_engine_free(void)
{
- DRW_SHADER_FREE_SAFE(e_data.volume_sh);
- DRW_SHADER_FREE_SAFE(e_data.volume_slice_sh);
+ for (int i = 0; i < VOLUME_SH_MAX; ++i) {
+ DRW_SHADER_FREE_SAFE(e_data.volume_sh[i]);
+ }
+ DRW_TEXTURE_FREE_SAFE(e_data.dummy_tex);
+ DRW_TEXTURE_FREE_SAFE(e_data.dummy_coba_tex);
}
void workbench_volume_cache_init(WORKBENCH_Data *vedata)
@@ -69,7 +119,9 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec
SmokeModifierData *smd = (SmokeModifierData *)md;
SmokeDomainSettings *sds = smd->domain;
WORKBENCH_PrivateData *wpd = vedata->stl->g_data;
+ WORKBENCH_EffectInfo *effect_info = vedata->stl->effects;
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+ DRWShadingGroup *grp = NULL;
/* Don't show smoke before simulation starts, this could be made an option in the future. */
if (!sds->fluid || CFRA < sds->point_cache[0]->startframe) {
@@ -77,21 +129,28 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec
}
wpd->volumes_do = true;
-
- if (!sds->wt || !(sds->viewsettings & MOD_SMOKE_VIEW_SHOWBIG)) {
+ if (sds->use_coba) {
+ GPU_create_smoke_coba_field(smd);
+ }
+ else if (!sds->wt || !(sds->viewsettings & MOD_SMOKE_VIEW_SHOWBIG)) {
GPU_create_smoke(smd, 0);
}
else if (sds->wt && (sds->viewsettings & MOD_SMOKE_VIEW_SHOWBIG)) {
GPU_create_smoke(smd, 1);
}
- if (sds->tex == NULL) {
+ if ((!sds->use_coba && sds->tex == NULL) ||
+ (sds->use_coba && sds->tex_field == NULL))
+ {
return;
}
- if (sds->slice_method == MOD_SMOKE_SLICE_AXIS_ALIGNED &&
- sds->axis_slice_method == AXIS_SLICE_SINGLE)
- {
+ const bool use_slice = (sds->slice_method == MOD_SMOKE_SLICE_AXIS_ALIGNED &&
+ sds->axis_slice_method == AXIS_SLICE_SINGLE);
+ const bool cubic_interp = (sds->interp_method == VOLUME_INTERP_CUBIC);
+ GPUShader *sh = volume_shader_get(use_slice, sds->use_coba, cubic_interp);
+
+ if (use_slice) {
float invviewmat[4][4];
DRW_viewport_matrix_get(invviewmat, DRW_MAT_VIEWINV);
@@ -99,41 +158,50 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec
? axis_dominant_v3_single(invviewmat[2])
: sds->slice_axis - 1;
- DRWShadingGroup *grp = DRW_shgroup_create(e_data.volume_slice_sh, vedata->psl->volume_pass);
- DRW_shgroup_uniform_texture(grp, "densityTexture", sds->tex);
- DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
- DRW_shgroup_uniform_float_copy(grp, "densityScale", 10.0f * sds->display_thickness);
+ grp = DRW_shgroup_create(sh, vedata->psl->volume_pass);
DRW_shgroup_uniform_float_copy(grp, "slicePosition", sds->slice_depth);
DRW_shgroup_uniform_int_copy(grp, "sliceAxis", axis);
- DRW_shgroup_state_disable(grp, DRW_STATE_CULL_FRONT);
- BLI_addtail(&wpd->smoke_domains, BLI_genericNodeN(smd));
-
- /* TODO Flame rendering */
- /* TODO COBA Rendering */
-
- DRW_shgroup_call_object_add(grp, DRW_cache_quad_get(), ob);
}
else {
- int max_slices = max_iii(sds->res[0], sds->res[1], sds->res[2]) * sds->slice_per_voxel;
-
- DRWShadingGroup *grp = DRW_shgroup_create(e_data.volume_sh, vedata->psl->volume_pass);
+ double noise_ofs;
+ BLI_halton_1D(3, 0.0, effect_info->jitter_index, &noise_ofs);
+ float dim[3], step_length, max_slice;
+ float slice_ct[3] = {sds->res[0], sds->res[1], sds->res[2]};
+ mul_v3_fl(slice_ct, sds->slice_per_voxel);
+ max_slice = max_fff(slice_ct[0], slice_ct[1], slice_ct[2]);
+ BKE_object_dimensions_get(ob, dim);
+ invert_v3(slice_ct);
+ mul_v3_v3(dim, slice_ct);
+ step_length = len_v3(dim);
+
+ grp = DRW_shgroup_create(sh, vedata->psl->volume_pass);
DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float *)wpd->viewvecs, 3);
- DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
+ DRW_shgroup_uniform_int_copy(grp, "samplesLen", max_slice);
+ DRW_shgroup_uniform_float_copy(grp, "stepLength", step_length);
+ DRW_shgroup_uniform_float_copy(grp, "noiseOfs", noise_ofs);
+ }
+
+ if (sds->use_coba) {
+ DRW_shgroup_uniform_texture(grp, "densityTexture", sds->tex_field);
+ DRW_shgroup_uniform_texture(grp, "transferTexture", sds->tex_coba);
+ }
+ else {
DRW_shgroup_uniform_texture(grp, "densityTexture", sds->tex);
- DRW_shgroup_uniform_float_copy(grp, "densityScale", 10.0f * sds->display_thickness);
- DRW_shgroup_uniform_int_copy(grp, "samplesLen", max_slices);
- /* TODO FIXME : This step size is in object space but the ray itself
- * is NOT unit length in object space so the required number of subdivisions
- * is tricky to get. */
- DRW_shgroup_uniform_float_copy(grp, "stepLength", 8.0f / max_slices);
- DRW_shgroup_state_enable(grp, DRW_STATE_CULL_FRONT);
- BLI_addtail(&wpd->smoke_domains, BLI_genericNodeN(smd));
-
- /* TODO Flame rendering */
- /* TODO COBA Rendering */
+ DRW_shgroup_uniform_texture(grp, "shadowTexture", sds->tex_shadow);
+ DRW_shgroup_uniform_texture(grp, "flameTexture", (sds->tex_flame) ? sds->tex_flame : e_data.dummy_tex);
+ DRW_shgroup_uniform_texture(grp, "flameColorTexture", (sds->tex_flame) ? sds->tex_flame_coba : e_data.dummy_coba_tex);
+ }
+ DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
+ DRW_shgroup_uniform_float_copy(grp, "densityScale", 10.0f * sds->display_thickness);
+ if (use_slice) {
+ DRW_shgroup_call_object_add(grp, DRW_cache_quad_get(), ob);
+ }
+ else {
DRW_shgroup_call_object_add(grp, DRW_cache_cube_get(), ob);
}
+
+ BLI_addtail(&wpd->smoke_domains, BLI_genericNodeN(smd));
}
void workbench_volume_smoke_textures_free(WORKBENCH_PrivateData *wpd)
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 7c3701266c7..9bf3ce15166 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -289,7 +289,7 @@ typedef enum {
DRW_STATE_BLEND = (1 << 15),
DRW_STATE_ADDITIVE = (1 << 16),
DRW_STATE_MULTIPLY = (1 << 17),
- DRW_STATE_TRANSMISSION = (1 << 18),
+ /* DRW_STATE_TRANSMISSION = (1 << 18), */ /* Not used */
DRW_STATE_CLIP_PLANES = (1 << 19),
DRW_STATE_ADDITIVE_FULL = (1 << 20), /* Same as DRW_STATE_ADDITIVE but let alpha accumulate without premult. */
DRW_STATE_BLEND_PREMUL = (1 << 21), /* Use that if color is already premult by alpha. */
@@ -325,6 +325,7 @@ struct GPUVertFormat *DRW_shgroup_instance_format_array(const DRWInstanceAttribF
} while (0)
DRWShadingGroup *DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass);
+DRWShadingGroup *DRW_shgroup_create_sub(DRWShadingGroup *shgroup);
DRWShadingGroup *DRW_shgroup_material_create(struct GPUMaterial *material, DRWPass *pass);
DRWShadingGroup *DRW_shgroup_material_instance_create(
struct GPUMaterial *material, DRWPass *pass, struct GPUBatch *geom, struct Object *ob,
@@ -363,11 +364,12 @@ void DRW_shgroup_call_procedural_points_add(DRWShadingGroup *shgroup, uint point
void DRW_shgroup_call_procedural_lines_add(DRWShadingGroup *shgroup, uint line_count, float (*obmat)[4]);
void DRW_shgroup_call_procedural_triangles_add(DRWShadingGroup *shgroup, uint tria_count, float (*obmat)[4]);
void DRW_shgroup_call_object_procedural_triangles_culled_add(DRWShadingGroup *shgroup, uint tria_count, struct Object *ob);
-void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, struct GPUBatch *geom, struct Object *ob, bool bypass_culling);
-#define DRW_shgroup_call_object_add(shgroup, geom, ob) DRW_shgroup_call_object_add_ex(shgroup, geom, ob, false)
-#define DRW_shgroup_call_object_add_no_cull(shgroup, geom, ob) DRW_shgroup_call_object_add_ex(shgroup, geom, ob, true)
+void DRW_shgroup_call_object_add_ex(
+ DRWShadingGroup *shgroup, struct GPUBatch *geom, struct Object *ob, struct Material *ma, bool bypass_culling);
+#define DRW_shgroup_call_object_add(shgroup, geom, ob) DRW_shgroup_call_object_add_ex(shgroup, geom, ob, NULL, false)
+#define DRW_shgroup_call_object_add_no_cull(shgroup, geom, ob) DRW_shgroup_call_object_add_ex(shgroup, geom, ob, NULL, true)
void DRW_shgroup_call_object_add_with_callback(
- DRWShadingGroup *shgroup, struct GPUBatch *geom, struct Object *ob,
+ DRWShadingGroup *shgroup, struct GPUBatch *geom, struct Object *ob, struct Material *ma,
DRWCallVisibilityFn *callback, void *user_data);
/* Used for drawing a batch with instancing without instance attribs. */
void DRW_shgroup_call_instances_add(
@@ -405,6 +407,7 @@ void DRW_shgroup_uniform_bool(DRWShadingGroup *shgroup, const char *name, const
void DRW_shgroup_uniform_int(DRWShadingGroup *shgroup, const char *name, const int *value, int arraysize);
void DRW_shgroup_uniform_ivec2(DRWShadingGroup *shgroup, const char *name, const int *value, int arraysize);
void DRW_shgroup_uniform_ivec3(DRWShadingGroup *shgroup, const char *name, const int *value, int arraysize);
+void DRW_shgroup_uniform_ivec4(DRWShadingGroup *shgroup, const char *name, const int *value, int arraysize);
void DRW_shgroup_uniform_mat3(DRWShadingGroup *shgroup, const char *name, const float (*value)[3]);
void DRW_shgroup_uniform_mat4(DRWShadingGroup *shgroup, const char *name, const float (*value)[4]);
/* Store value instead of referencing it. */
@@ -481,6 +484,7 @@ void DRW_render_object_iter(
void *vedata, struct RenderEngine *engine, struct Depsgraph *depsgraph,
void (*callback)(void *vedata, struct Object *ob, struct RenderEngine *engine, struct Depsgraph *depsgraph));
void DRW_render_instance_buffer_finish(void);
+void DRW_render_viewport_size_set(int size[2]);
void DRW_custom_pipeline(
DrawEngineType *draw_engine_type,
@@ -505,11 +509,11 @@ DrawData *DRW_drawdata_ensure(
DrawDataFreeCb free_cb);
/* Settings */
-bool DRW_object_is_renderable(struct Object *ob);
-bool DRW_check_object_visible_within_active_context(struct Object *ob);
+bool DRW_object_is_renderable(const struct Object *ob);
+bool DRW_object_is_visible_in_active_context(const struct Object *ob);
bool DRW_object_is_flat_normal(const struct Object *ob);
-bool DRW_check_psys_visible_within_active_context(struct Object *object, struct ParticleSystem *psys);
+bool DRW_object_is_visible_psys_in_active_context(const struct Object *object, const struct ParticleSystem *psys);
/* Draw commands */
void DRW_draw_pass(DRWPass *pass);
@@ -520,9 +524,6 @@ void DRW_draw_text_cache_queue(struct DRWTextStore *dt);
void DRW_draw_callbacks_pre_scene(void);
void DRW_draw_callbacks_post_scene(void);
-int DRW_draw_region_engine_info_offset(void);
-void DRW_draw_region_engine_info(void);
-
void DRW_state_reset_ex(DRWState state);
void DRW_state_reset(void);
void DRW_state_lock(DRWState state);
@@ -590,4 +591,8 @@ typedef struct DRWContextState {
const DRWContextState *DRW_context_state_get(void);
+#define XRAY_ALPHA(v3d) (((v3d)->shading.type == OB_WIRE) ? (v3d)->shading.xray_alpha_wire : (v3d)->shading.xray_alpha)
+#define XRAY_FLAG(v3d) (((v3d)->shading.type == OB_WIRE) ? V3D_SHADING_XRAY_WIREFRAME : V3D_SHADING_XRAY)
+#define XRAY_ENABLED(v3d) ((((v3d)->shading.flag & XRAY_FLAG(v3d)) != 0) && (XRAY_ALPHA(v3d) < 1.0f))
+
#endif /* __DRW_RENDER_H__ */
diff --git a/source/blender/draw/intern/draw_anim_viz.c b/source/blender/draw/intern/draw_anim_viz.c
index 20da5e384eb..4ec1f761d04 100644
--- a/source/blender/draw/intern/draw_anim_viz.c
+++ b/source/blender/draw/intern/draw_anim_viz.c
@@ -275,7 +275,7 @@ static void MPATH_cache_motion_path(MPATH_PassList *psl,
{
numstr_len = sprintf(numstr, " %d", frame);
mul_v3_m4v3(co, ob->imat, mpv->co);
- DRW_text_cache_add(dt, co, numstr, numstr_len, 0, txt_flag, (is_keyframe) ? col_kf : col);
+ DRW_text_cache_add(dt, co, numstr, numstr_len, 0, 0, txt_flag, (is_keyframe) ? col_kf : col);
}
else if (avs->path_viewflag & MOTIONPATH_VIEW_FNUMS) {
bMotionPathVert *mpvP = (mpv - stepsize);
@@ -284,7 +284,7 @@ static void MPATH_cache_motion_path(MPATH_PassList *psl,
if ((equals_v3v3(mpv->co, mpvP->co) == 0) || (equals_v3v3(mpv->co, mpvN->co) == 0)) {
numstr_len = sprintf(numstr, " %d", frame);
mul_v3_m4v3(co, ob->imat, mpv->co);
- DRW_text_cache_add(dt, co, numstr, numstr_len, 0, txt_flag, col);
+ DRW_text_cache_add(dt, co, numstr, numstr_len, 0, 0, txt_flag, col);
}
}
}
diff --git a/source/blender/draw/intern/draw_armature.c b/source/blender/draw/intern/draw_armature.c
index a84b3fdeb41..40581093b28 100644
--- a/source/blender/draw/intern/draw_armature.c
+++ b/source/blender/draw/intern/draw_armature.c
@@ -83,6 +83,8 @@ static struct {
DRWShadingGroup *bone_box_outline;
DRWShadingGroup *bone_wire;
DRWShadingGroup *bone_stick;
+ DRWShadingGroup *bone_dof_sphere;
+ DRWShadingGroup *bone_dof_lines;
DRWShadingGroup *bone_envelope_solid;
DRWShadingGroup *bone_envelope_distance;
DRWShadingGroup *bone_envelope_wire;
@@ -286,7 +288,7 @@ static void drw_shgroup_bone_envelope(
float fac_head = (len - head_sphere[3]) / len;
float fac_tail = (len - tail_sphere[3]) / len;
- /* Small epsilon to avoid problem with float precison in shader. */
+ /* Small epsilon to avoid problem with float precision in shader. */
if (len > (tail_sphere[3] + head_sphere[3]) + 1e-8f) {
copy_v4_v4(tmp_sphere, head_sphere);
@@ -433,8 +435,11 @@ static void drw_shgroup_bone_ik_no_target_lines(const float start[3], const floa
g_data.lines_ik_no_target = shgroup_dynlines_dashed_uniform_color(g_data.passes.relationship_lines, fcolor);
}
/* reverse order to have less stipple overlap */
- DRW_shgroup_call_dynamic_add(g_data.lines_ik_no_target, end);
- DRW_shgroup_call_dynamic_add(g_data.lines_ik_no_target, start);
+ float v[3];
+ mul_v3_m4v3(v, g_data.ob->obmat, end);
+ DRW_shgroup_call_dynamic_add(g_data.lines_ik_no_target, v);
+ mul_v3_m4v3(v, g_data.ob->obmat, start);
+ DRW_shgroup_call_dynamic_add(g_data.lines_ik_no_target, v);
}
static void drw_shgroup_bone_ik_spline_lines(const float start[3], const float end[3])
@@ -444,8 +449,11 @@ static void drw_shgroup_bone_ik_spline_lines(const float start[3], const float e
g_data.lines_ik_spline = shgroup_dynlines_dashed_uniform_color(g_data.passes.relationship_lines, fcolor);
}
/* reverse order to have less stipple overlap */
- DRW_shgroup_call_dynamic_add(g_data.lines_ik_spline, end);
- DRW_shgroup_call_dynamic_add(g_data.lines_ik_spline, start);
+ float v[3];
+ mul_v3_m4v3(v, g_data.ob->obmat, end);
+ DRW_shgroup_call_dynamic_add(g_data.lines_ik_spline, v);
+ mul_v3_m4v3(v, g_data.ob->obmat, start);
+ DRW_shgroup_call_dynamic_add(g_data.lines_ik_spline, v);
}
/** \} */
@@ -916,80 +924,126 @@ static void draw_bone_update_disp_matrix_default(EditBone *eBone, bPoseChannel *
translate_m4(disp_tail_mat, 0.0f, 1.0f, 0.0f);
}
-/* XXX Direct copy from drawarmature.c... This is ugly! */
-/* A partial copy of b_bone_spline_setup(), with just the parts for previewing editmode curve settings
- *
- * This assumes that prev/next bones don't have any impact (since they should all still be in the "straight"
- * position here anyway), and that we can simply apply the bbone settings to get the desired effect...
- */
-static void ebone_spline_preview(EditBone *ebone, float result_array[MAX_BBONE_SUBDIV][4][4])
+/* compute connected child pointer for B-Bone drawing */
+static void edbo_compute_bbone_child(bArmature *arm)
{
- float h1[3], h2[3], length, hlength1, hlength2, roll1 = 0.0f, roll2 = 0.0f;
- float mat3[3][3];
- float data[MAX_BBONE_SUBDIV + 1][4], *fp;
- int a;
+ EditBone *eBone;
- length = ebone->length;
+ for (eBone = arm->edbo->first; eBone; eBone = eBone->next) {
+ eBone->bbone_child = NULL;
+ }
- hlength1 = ebone->ease1 * length * 0.390464f; /* 0.5f * sqrt(2) * kappa, the handle length for near-perfect circles */
- hlength2 = ebone->ease2 * length * 0.390464f;
+ for (eBone = arm->edbo->first; eBone; eBone = eBone->next) {
+ if (eBone->parent && (eBone->flag & BONE_CONNECTED)) {
+ eBone->parent->bbone_child = eBone;
+ }
+ }
+}
- /* find the handle points, since this is inside bone space, the
- * first point = (0, 0, 0)
- * last point = (0, length, 0)
- *
- * we also just apply all the "extra effects", since they're the whole reason we're doing this...
- */
- h1[0] = ebone->curveInX;
- h1[1] = hlength1;
- h1[2] = ebone->curveInY;
- roll1 = ebone->roll1;
+/* A version of b_bone_spline_setup() for previewing editmode curve settings. */
+static void ebone_spline_preview(EditBone *ebone, float result_array[MAX_BBONE_SUBDIV][4][4])
+{
+ BBoneSplineParameters param;
+ EditBone *prev, *next;
+ float imat[4][4], bonemat[4][4];
+ float tmp[3];
- h2[0] = ebone->curveOutX;
- h2[1] = -hlength2;
- h2[2] = ebone->curveOutY;
- roll2 = ebone->roll2;
+ memset(&param, 0, sizeof(param));
- /* make curve */
- if (ebone->segments > MAX_BBONE_SUBDIV)
- ebone->segments = MAX_BBONE_SUBDIV;
+ param.segments = ebone->segments;
+ param.length = ebone->length;
- BKE_curve_forward_diff_bezier(0.0f, h1[0], h2[0], 0.0f, data[0], MAX_BBONE_SUBDIV, 4 * sizeof(float));
- BKE_curve_forward_diff_bezier(0.0f, h1[1], length + h2[1], length, data[0] + 1, MAX_BBONE_SUBDIV, 4 * sizeof(float));
- BKE_curve_forward_diff_bezier(0.0f, h1[2], h2[2], 0.0f, data[0] + 2, MAX_BBONE_SUBDIV, 4 * sizeof(float));
- BKE_curve_forward_diff_bezier(roll1, roll1 + 0.390464f * (roll2 - roll1), roll2 - 0.390464f * (roll2 - roll1), roll2, data[0] + 3, MAX_BBONE_SUBDIV, 4 * sizeof(float));
+ /* Get "next" and "prev" bones - these are used for handle calculations. */
+ if (ebone->bbone_prev_type == BBONE_HANDLE_AUTO) {
+ /* Use connected parent. */
+ if (ebone->flag & BONE_CONNECTED) {
+ prev = ebone->parent;
+ }
+ else {
+ prev = NULL;
+ }
+ }
+ else {
+ prev = ebone->bbone_prev;
+ }
- equalize_bbone_bezier(data[0], ebone->segments); /* note: does stride 4! */
+ if (ebone->bbone_next_type == BBONE_HANDLE_AUTO) {
+ /* Use connected child. */
+ next = ebone->bbone_child;
+ }
+ else {
+ next = ebone->bbone_next;
+ }
- /* make transformation matrices for the segments for drawing */
- for (a = 0, fp = data[0]; a < ebone->segments; a++, fp += 4) {
- sub_v3_v3v3(h1, fp + 4, fp);
- vec_roll_to_mat3(h1, fp[3], mat3); /* fp[3] is roll */
+ /* compute handles from connected bones */
+ if (prev || next) {
+ ED_armature_ebone_to_mat4(ebone, imat);
+ invert_m4(imat);
- copy_m4_m3(result_array[a], mat3);
- copy_v3_v3(result_array[a][3], fp);
+ if (prev) {
+ param.use_prev = true;
- /* "extra" scale facs... */
- {
- const int num_segments = ebone->segments;
+ if (ebone->bbone_prev_type == BBONE_HANDLE_RELATIVE) {
+ zero_v3(param.prev_h);
+ }
+ else if (ebone->bbone_prev_type == BBONE_HANDLE_TANGENT) {
+ sub_v3_v3v3(tmp, prev->tail, prev->head);
+ sub_v3_v3v3(tmp, ebone->head, tmp);
+ mul_v3_m4v3(param.prev_h, imat, tmp);
+ }
+ else {
+ param.prev_bbone = (prev->segments > 1);
+
+ mul_v3_m4v3(param.prev_h, imat, prev->head);
+ }
- const float scaleFactorIn = 1.0f + (ebone->scaleIn - 1.0f) * ((float)(num_segments - a) / (float)num_segments);
- const float scaleFactorOut = 1.0f + (ebone->scaleOut - 1.0f) * ((float)(a + 1) / (float)num_segments);
+ if (!param.prev_bbone) {
+ ED_armature_ebone_to_mat4(prev, bonemat);
+ mul_m4_m4m4(param.prev_mat, imat, bonemat);
+ }
+ }
- const float scalefac = scaleFactorIn * scaleFactorOut;
- float bscalemat[4][4], bscale[3];
+ if (next) {
+ param.use_next = true;
- bscale[0] = scalefac;
- bscale[1] = 1.0f;
- bscale[2] = scalefac;
+ if (ebone->bbone_next_type == BBONE_HANDLE_RELATIVE) {
+ copy_v3_fl3(param.next_h, 0.0f, param.length, 0.0);
+ }
+ else if (ebone->bbone_next_type == BBONE_HANDLE_TANGENT) {
+ sub_v3_v3v3(tmp, next->tail, next->head);
+ add_v3_v3v3(tmp, ebone->tail, tmp);
+ mul_v3_m4v3(param.next_h, imat, tmp);
+ }
+ else {
+ param.next_bbone = (next->segments > 1);
- size_to_mat4(bscalemat, bscale);
+ mul_v3_m4v3(param.next_h, imat, next->tail);
+ }
- /* Note: don't multiply by inverse scale mat here,
- * as it causes problems with scaling shearing and breaking segment chains */
- mul_m4_series(result_array[a], result_array[a], bscalemat);
+ ED_armature_ebone_to_mat4(next, bonemat);
+ mul_m4_m4m4(param.next_mat, imat, bonemat);
}
}
+
+ param.ease1 = ebone->ease1;
+ param.ease2 = ebone->ease2;
+ param.roll1 = ebone->roll1;
+ param.roll2 = ebone->roll2;
+
+ if (prev && (ebone->flag & BONE_ADD_PARENT_END_ROLL)) {
+ param.roll1 += prev->roll2;
+ }
+
+ param.scaleIn = ebone->scaleIn;
+ param.scaleOut = ebone->scaleOut;
+
+ param.curveInX = ebone->curveInX;
+ param.curveInY = ebone->curveInY;
+
+ param.curveOutX = ebone->curveOutX;
+ param.curveOutY = ebone->curveOutY;
+
+ ebone->segments = BKE_compute_b_bone_spline(&param, (Mat4 *)result_array);
}
static void draw_bone_update_disp_matrix_bbone(EditBone *eBone, bPoseChannel *pchan)
@@ -1028,7 +1082,7 @@ static void draw_bone_update_disp_matrix_bbone(EditBone *eBone, bPoseChannel *pc
if (pchan) {
Mat4 *bbones_mat = (Mat4 *)pchan->draw_data->bbone_matrix;
if (bbone_segments > 1) {
- b_bone_spline_setup(pchan, 0, bbones_mat);
+ b_bone_spline_setup(pchan, false, bbones_mat);
for (int i = bbone_segments; i--; bbones_mat++) {
mul_m4_m4m4(bbones_mat->mat, bbones_mat->mat, s);
@@ -1415,6 +1469,83 @@ static void draw_bone_octahedral(
/* -------------------------------------------------------------------- */
+/** \name Draw Degrees of Freedom
+ * \{ */
+
+static void draw_bone_dofs(bPoseChannel *pchan)
+{
+ float final_bonemat[4][4], posetrans[4][4], mat[4][4];
+ float amin[2], amax[2], xminmax[2], zminmax[2];
+ float col_sphere[4] = {0.25f, 0.25f, 0.25f, 0.25f};
+ float col_lines[4] = {0.0f, 0.0f, 0.0f, 1.0f};
+ float col_xaxis[4] = {1.0f, 0.0f, 0.0f, 1.0f};
+ float col_zaxis[4] = {0.0f, 0.0f, 1.0f, 1.0f};
+
+ if (g_data.passes.bone_envelope == NULL) {
+ return;
+ }
+
+ if (g_data.bone_dof_sphere == NULL) {
+ g_data.bone_dof_lines = shgroup_instance_bone_dof(g_data.passes.bone_wire, DRW_cache_bone_dof_lines_get());
+ g_data.bone_dof_sphere = shgroup_instance_bone_dof(g_data.passes.bone_envelope, DRW_cache_bone_dof_sphere_get());
+ DRW_shgroup_state_enable(g_data.bone_dof_sphere, DRW_STATE_BLEND);
+ DRW_shgroup_state_disable(g_data.bone_dof_sphere, DRW_STATE_CULL_FRONT);
+ }
+
+ /* *0.5f here comes from M_PI/360.0f when rotations were still in degrees */
+ xminmax[0] = sinf(pchan->limitmin[0] * 0.5f);
+ xminmax[1] = sinf(pchan->limitmax[0] * 0.5f);
+ zminmax[0] = sinf(pchan->limitmin[2] * 0.5f);
+ zminmax[1] = sinf(pchan->limitmax[2] * 0.5f);
+
+ 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... */
+ if (pchan->parent) {
+ copy_m4_m4(mat, pchan->parent->pose_mat);
+ mat[3][0] = mat[3][1] = mat[3][2] = 0.0f;
+ mul_m4_m4m4(posetrans, posetrans, mat);
+ }
+ /* ... but own restspace */
+ mul_m4_m4m3(posetrans, posetrans, pchan->bone->bone_mat);
+
+ float scale = pchan->bone->length * pchan->size[1];
+ scale_m4_fl(mat, scale);
+ mat[1][1] = -mat[1][1];
+ mul_m4_m4m4(posetrans, posetrans, mat);
+
+ /* into world space. */
+ mul_m4_m4m4(final_bonemat, g_data.ob->obmat, posetrans);
+
+ if ((pchan->ikflag & BONE_IK_XLIMIT) &&
+ (pchan->ikflag & BONE_IK_ZLIMIT))
+ {
+ amin[0] = xminmax[0];
+ amax[0] = xminmax[1];
+ amin[1] = zminmax[0];
+ amax[1] = zminmax[1];
+ DRW_shgroup_call_dynamic_add(g_data.bone_dof_sphere, final_bonemat, col_sphere, amin, amax);
+ DRW_shgroup_call_dynamic_add(g_data.bone_dof_lines, final_bonemat, col_lines, amin, amax);
+ }
+ if (pchan->ikflag & BONE_IK_XLIMIT) {
+ amin[0] = xminmax[0];
+ amax[0] = xminmax[1];
+ amin[1] = amax[1] = 0.0f;
+ DRW_shgroup_call_dynamic_add(g_data.bone_dof_lines, final_bonemat, col_xaxis, amin, amax);
+ }
+ if (pchan->ikflag & BONE_IK_ZLIMIT) {
+ amin[1] = zminmax[0];
+ amax[1] = zminmax[1];
+ amin[0] = amax[0] = 0.0f;
+ DRW_shgroup_call_dynamic_add(g_data.bone_dof_lines, final_bonemat, col_zaxis, amin, amax);
+ }
+}
+
+/** \} */
+
+
+/* -------------------------------------------------------------------- */
+
/** \name Draw Relationships
* \{ */
@@ -1545,6 +1676,7 @@ static void draw_armature_edit(Object *ob)
const bool is_select = DRW_state_is_select();
update_color(ob, NULL);
+ edbo_compute_bbone_child(arm);
const bool show_text = DRW_state_show_text();
const bool show_relations = ((draw_ctx->v3d->flag & V3D_HIDE_HELPLINES) == 0);
@@ -1602,7 +1734,7 @@ static void draw_armature_edit(Object *ob)
struct DRWTextStore *dt = DRW_text_cache_ensure();
DRW_text_cache_add(
dt, vec, eBone->name, strlen(eBone->name),
- 10, DRW_TEXT_CACHE_GLOBALSPACE | DRW_TEXT_CACHE_STRING_PTR, color);
+ 10, 0, DRW_TEXT_CACHE_GLOBALSPACE | DRW_TEXT_CACHE_STRING_PTR, color);
}
/* Draw additional axes */
@@ -1704,6 +1836,15 @@ static void draw_armature_pose(Object *ob, const float const_color[4])
draw_bone_octahedral(NULL, pchan, arm, boneflag, constflag, select_id);
}
+ if (!is_pose_select && show_relations &&
+ (arm->flag & ARM_POSEMODE) &&
+ (bone->flag & BONE_SELECTED) &&
+ ((ob->base_flag & BASE_FROMDUPLI) == 0) &&
+ (pchan->ikflag & (BONE_IK_XLIMIT | BONE_IK_ZLIMIT)))
+ {
+ draw_bone_dofs(pchan);
+ }
+
/* Draw names of bone */
if (show_text && (arm->flag & ARM_DRAWNAMES)) {
uchar color[4];
@@ -1716,7 +1857,7 @@ static void draw_armature_pose(Object *ob, const float const_color[4])
struct DRWTextStore *dt = DRW_text_cache_ensure();
DRW_text_cache_add(
dt, vec, pchan->name, strlen(pchan->name),
- 10, DRW_TEXT_CACHE_GLOBALSPACE | DRW_TEXT_CACHE_STRING_PTR, color);
+ 10, 0, DRW_TEXT_CACHE_GLOBALSPACE | DRW_TEXT_CACHE_STRING_PTR, color);
}
/* Draw additional axes */
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index c4214b436f1..f2f99953418 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -37,11 +37,16 @@
#include "BLI_utildefines.h"
#include "BLI_math.h"
+#include "BLI_listbase.h"
+
+#include "BKE_object_deform.h"
#include "GPU_batch.h"
#include "GPU_batch_presets.h"
#include "GPU_batch_utils.h"
+#include "MEM_guardedalloc.h"
+
#include "draw_cache.h"
#include "draw_cache_impl.h"
@@ -103,6 +108,8 @@ static struct DRWShapeCache {
GPUBatch *drw_bone_point_wire;
GPUBatch *drw_bone_stick;
GPUBatch *drw_bone_arrows;
+ GPUBatch *drw_bone_dof_sphere;
+ GPUBatch *drw_bone_dof_lines;
GPUBatch *drw_camera;
GPUBatch *drw_camera_frame;
GPUBatch *drw_camera_tria;
@@ -691,7 +698,7 @@ void DRW_cache_object_face_wireframe_get(
{
switch (ob->type) {
case OB_MESH:
- DRW_mesh_batch_cache_get_wireframes_face_texbuf((Mesh *)ob->data, r_vert_tx, r_faceid_tx, r_tri_count);
+ DRW_mesh_batch_cache_get_wireframes_face_texbuf(ob->data, r_vert_tx, r_faceid_tx, r_tri_count);
/* TODO, should match 'DRW_cache_object_surface_get' */
}
@@ -2693,6 +2700,100 @@ GPUBatch *DRW_cache_bone_arrows_get(void)
return SHC.drw_bone_arrows;
}
+const float staticSine[16] = {
+ 0.0f, 0.104528463268f, 0.207911690818f, 0.309016994375f,
+ 0.406736643076f, 0.5f, 0.587785252292f, 0.669130606359f,
+ 0.743144825477f, 0.809016994375f, 0.866025403784f,
+ 0.913545457643f, 0.951056516295f, 0.978147600734f,
+ 0.994521895368f, 1.0f
+};
+
+#define set_vert(a, b, quarter) \
+ copy_v2_fl2(pos, (quarter % 2 == 0) ? -(a) : (a), (quarter < 2) ? -(b) : (b)); \
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, v++, pos);
+
+GPUBatch *DRW_cache_bone_dof_sphere_get(void)
+{
+ if (!SHC.drw_bone_dof_sphere) {
+ int i, j, q, n = ARRAY_SIZE(staticSine);
+ float x, z, px, pz, pos[2];
+
+ /* Position Only 3D format */
+ static GPUVertFormat format = { 0 };
+ static struct { uint pos; } attr_id;
+ if (format.attr_len == 0) {
+ attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+ }
+
+ GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format);
+ GPU_vertbuf_data_alloc(vbo, n * n * 6 * 4);
+
+ uint v = 0;
+ for (q = 0; q < 4; ++q) {
+ pz = 0.0f;
+ for (i = 1; i < n; ++i) {
+ z = staticSine[i];
+ px = 0.0f;
+ for (j = 1; j <= (n - i); ++j) {
+ x = staticSine[j];
+ if (j == n - i) {
+ set_vert(px, z, q);
+ set_vert(px, pz, q);
+ set_vert(x, pz, q);
+ }
+ else {
+ set_vert(x, z, q);
+ set_vert(x, pz, q);
+ set_vert(px, z, q);
+
+ set_vert(x, pz, q);
+ set_vert(px, pz, q);
+ set_vert(px, z, q);
+ }
+ px = x;
+ }
+ pz = z;
+ }
+ }
+ /* TODO alloc right count from the begining. */
+ GPU_vertbuf_data_resize(vbo, v);
+
+ SHC.drw_bone_dof_sphere = GPU_batch_create_ex(GPU_PRIM_TRIS, vbo, NULL, GPU_BATCH_OWNS_VBO);
+ }
+ return SHC.drw_bone_dof_sphere;
+}
+
+GPUBatch *DRW_cache_bone_dof_lines_get(void)
+{
+ if (!SHC.drw_bone_dof_lines) {
+ int i, n = ARRAY_SIZE(staticSine);
+ float pos[2];
+
+ /* Position Only 3D format */
+ static GPUVertFormat format = { 0 };
+ static struct { uint pos; } attr_id;
+ if (format.attr_len == 0) {
+ attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+ }
+
+ GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format);
+ GPU_vertbuf_data_alloc(vbo, n * 4);
+
+ uint v = 0;
+ for (i = 0; i < n * 4; i++) {
+ float a = (1.0f - (i / (float)(n * 4))) * 2.0f * M_PI;
+ float x = cosf(a);
+ float y = sinf(a);
+ set_vert(x, y, 0);
+ }
+
+ SHC.drw_bone_dof_lines = GPU_batch_create_ex(GPU_PRIM_LINE_LOOP, vbo, NULL, GPU_BATCH_OWNS_VBO);
+ }
+ return SHC.drw_bone_dof_lines;
+}
+
+#undef set_vert
+
/** \} */
/* -------------------------------------------------------------------- */
@@ -2885,7 +2986,8 @@ GPUBatch *DRW_cache_mesh_surface_overlay_get(Object *ob)
void DRW_cache_mesh_wire_overlay_get(
Object *ob,
- GPUBatch **r_tris, GPUBatch **r_ledges, GPUBatch **r_lverts)
+ GPUBatch **r_tris, GPUBatch **r_ledges, GPUBatch **r_lverts,
+ struct GPUTexture **r_data_tex)
{
BLI_assert(ob->type == OB_MESH);
@@ -2894,17 +2996,19 @@ void DRW_cache_mesh_wire_overlay_get(
*r_tris = DRW_mesh_batch_cache_get_overlay_triangles(me);
*r_ledges = DRW_mesh_batch_cache_get_overlay_loose_edges(me);
*r_lverts = DRW_mesh_batch_cache_get_overlay_loose_verts(me);
+ *r_data_tex = DRW_mesh_batch_cache_get_overlay_data_tex(me);
}
void DRW_cache_mesh_normals_overlay_get(
Object *ob,
- GPUBatch **r_tris, GPUBatch **r_ledges, GPUBatch **r_lverts)
+ GPUBatch **r_tris, GPUBatch **r_tris_lnor, GPUBatch **r_ledges, GPUBatch **r_lverts)
{
BLI_assert(ob->type == OB_MESH);
Mesh *me = ob->data;
*r_tris = DRW_mesh_batch_cache_get_overlay_triangles_nor(me);
+ *r_tris_lnor = DRW_mesh_batch_cache_get_overlay_triangles_lnor(me);
*r_ledges = DRW_mesh_batch_cache_get_overlay_loose_edges_nor(me);
*r_lverts = DRW_mesh_batch_cache_get_overlay_loose_verts(me);
}
@@ -2950,12 +3054,47 @@ GPUBatch *DRW_cache_mesh_loose_edges_get(Object *ob)
return DRW_mesh_batch_cache_get_loose_edges_with_normals(me);
}
-GPUBatch *DRW_cache_mesh_surface_weights_get(Object *ob)
+GPUBatch *DRW_cache_mesh_surface_weights_get(Object *ob, ToolSettings *ts, bool paint_mode)
{
BLI_assert(ob->type == OB_MESH);
Mesh *me = ob->data;
- return DRW_mesh_batch_cache_get_triangles_with_normals_and_weights(me, ob->actdef - 1);
+
+ /* Extract complete vertex weight group selection state and mode flags. */
+ struct DRW_MeshWeightState wstate;
+ memset(&wstate, 0, sizeof(wstate));
+
+ wstate.defgroup_active = ob->actdef - 1;
+ wstate.defgroup_len = BLI_listbase_count(&ob->defbase);
+
+ wstate.alert_mode = ts->weightuser;
+
+ if (paint_mode && ts->multipaint) {
+ /* Multipaint needs to know all selected bones, not just the active group.
+ * This is actually a relatively expensive operation, but caching would be difficult. */
+ wstate.defgroup_sel = BKE_object_defgroup_selected_get(ob, wstate.defgroup_len, &wstate.defgroup_sel_count);
+
+ if (wstate.defgroup_sel_count > 1) {
+ wstate.flags |= DRW_MESH_WEIGHT_STATE_MULTIPAINT | (ts->auto_normalize ? DRW_MESH_WEIGHT_STATE_AUTO_NORMALIZE : 0);
+
+ if (me->editflag & ME_EDIT_MIRROR_X) {
+ BKE_object_defgroup_mirror_selection(
+ ob, wstate.defgroup_len, wstate.defgroup_sel, wstate.defgroup_sel, &wstate.defgroup_sel_count);
+ }
+ }
+ /* With only one selected bone Multipaint reverts to regular mode. */
+ else {
+ wstate.defgroup_sel_count = 0;
+ MEM_SAFE_FREE(wstate.defgroup_sel);
+ }
+ }
+
+ /* Generate the weight data using the selection. */
+ GPUBatch *batch = DRW_mesh_batch_cache_get_triangles_with_normals_and_weights(me, &wstate);
+
+ DRW_mesh_weight_state_clear(&wstate);
+
+ return batch;
}
GPUBatch *DRW_cache_mesh_surface_vert_colors_get(Object *ob)
@@ -3076,18 +3215,18 @@ GPUBatch *DRW_cache_curve_edge_normal_get(Object *ob, float normal_size)
GPUBatch *DRW_cache_curve_edge_overlay_get(Object *ob)
{
- BLI_assert(ob->type == OB_CURVE);
+ BLI_assert(ELEM(ob->type, OB_CURVE, OB_SURF));
struct Curve *cu = ob->data;
return DRW_curve_batch_cache_get_overlay_edges(cu);
}
-GPUBatch *DRW_cache_curve_vert_overlay_get(Object *ob)
+GPUBatch *DRW_cache_curve_vert_overlay_get(Object *ob, bool handles)
{
- BLI_assert(ob->type == OB_CURVE);
+ BLI_assert(ELEM(ob->type, OB_CURVE, OB_SURF));
struct Curve *cu = ob->data;
- return DRW_curve_batch_cache_get_overlay_verts(cu);
+ return DRW_curve_batch_cache_get_overlay_verts(cu, handles);
}
GPUBatch *DRW_cache_curve_surface_get(Object *ob)
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index 08c93010700..0656783ea29 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -121,21 +121,25 @@ struct GPUBatch *DRW_cache_bone_point_get(void);
struct GPUBatch *DRW_cache_bone_point_wire_outline_get(void);
struct GPUBatch *DRW_cache_bone_stick_get(void);
struct GPUBatch *DRW_cache_bone_arrows_get(void);
+struct GPUBatch *DRW_cache_bone_dof_sphere_get(void);
+struct GPUBatch *DRW_cache_bone_dof_lines_get(void);
/* Meshes */
struct GPUBatch *DRW_cache_mesh_surface_overlay_get(struct Object *ob);
void DRW_cache_mesh_wire_overlay_get(
struct Object *ob,
- struct GPUBatch **r_tris, struct GPUBatch **r_ledges, struct GPUBatch **r_lverts);
+ struct GPUBatch **r_tris, struct GPUBatch **r_ledges, struct GPUBatch **r_lverts,
+ struct GPUTexture **r_data_tex);
void DRW_cache_mesh_normals_overlay_get(
struct Object *ob,
- struct GPUBatch **r_tris, struct GPUBatch **r_ledges, struct GPUBatch **r_lverts);
+ struct GPUBatch **r_tris, struct GPUBatch **r_tris_lnor,
+ struct GPUBatch **r_ledges, struct GPUBatch **r_lverts);
struct GPUBatch *DRW_cache_face_centers_get(struct Object *ob);
struct GPUBatch *DRW_cache_mesh_wire_outline_get(struct Object *ob);
struct GPUBatch *DRW_cache_mesh_edge_detection_get(struct Object *ob, bool *r_is_manifold);
struct GPUBatch *DRW_cache_mesh_surface_get(struct Object *ob);
struct GPUBatch *DRW_cache_mesh_loose_edges_get(struct Object *ob);
-struct GPUBatch *DRW_cache_mesh_surface_weights_get(struct Object *ob);
+struct GPUBatch *DRW_cache_mesh_surface_weights_get(struct Object *ob, struct ToolSettings *ts, bool paint_mode);
struct GPUBatch *DRW_cache_mesh_surface_vert_colors_get(struct Object *ob);
struct GPUBatch *DRW_cache_mesh_surface_verts_get(struct Object *ob);
struct GPUBatch *DRW_cache_mesh_edges_get(struct Object *ob);
@@ -160,7 +164,7 @@ struct GPUBatch *DRW_cache_curve_edge_wire_get(struct Object *ob);
/* edit-mode */
struct GPUBatch *DRW_cache_curve_edge_normal_get(struct Object *ob, float normal_size);
struct GPUBatch *DRW_cache_curve_edge_overlay_get(struct Object *ob);
-struct GPUBatch *DRW_cache_curve_vert_overlay_get(struct Object *ob);
+struct GPUBatch *DRW_cache_curve_vert_overlay_get(struct Object *ob, bool handles);
/* Font */
struct GPUBatch *DRW_cache_text_edge_wire_get(struct Object *ob);
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index bae7e65f5e8..3805cccd9c0 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -36,6 +36,7 @@ struct ListBase;
struct ModifierData;
struct ParticleSystem;
struct PTCacheEdit;
+struct SpaceImage;
struct Curve;
struct Lattice;
@@ -67,7 +68,7 @@ struct GPUBatch *DRW_curve_batch_cache_get_wire_edge(struct Curve *cu, struct Cu
struct GPUBatch *DRW_curve_batch_cache_get_normal_edge(
struct Curve *cu, struct CurveCache *ob_curve_cache, float normal_size);
struct GPUBatch *DRW_curve_batch_cache_get_overlay_edges(struct Curve *cu);
-struct GPUBatch *DRW_curve_batch_cache_get_overlay_verts(struct Curve *cu);
+struct GPUBatch *DRW_curve_batch_cache_get_overlay_verts(struct Curve *cu, bool handles);
struct GPUBatch *DRW_curve_batch_cache_get_triangles_with_normals(
struct Curve *cu, struct CurveCache *ob_curve_cache);
@@ -96,8 +97,30 @@ struct GPUBatch *DRW_lattice_batch_cache_get_all_edges(struct Lattice *lt, bool
struct GPUBatch *DRW_lattice_batch_cache_get_all_verts(struct Lattice *lt);
struct GPUBatch *DRW_lattice_batch_cache_get_overlay_verts(struct Lattice *lt);
-/* Mesh */
+/* Vertex Group Selection and display options */
+struct DRW_MeshWeightState {
+ int defgroup_active;
+ int defgroup_len;
+
+ short flags;
+ char alert_mode;
+
+ /* Set of all selected bones for Multipaint. */
+ bool *defgroup_sel; /* [defgroup_len] */
+ int defgroup_sel_count;
+};
+
+/* DRW_MeshWeightState.flags */
+enum {
+ DRW_MESH_WEIGHT_STATE_MULTIPAINT = (1 << 0),
+ DRW_MESH_WEIGHT_STATE_AUTO_NORMALIZE = (1 << 1),
+};
+void DRW_mesh_weight_state_clear(struct DRW_MeshWeightState *wstate);
+void DRW_mesh_weight_state_copy(struct DRW_MeshWeightState *wstate_dst, const struct DRW_MeshWeightState *wstate_src);
+bool DRW_mesh_weight_state_compare(const struct DRW_MeshWeightState *a, const struct DRW_MeshWeightState *b);
+
+/* Mesh */
struct GPUBatch **DRW_mesh_batch_cache_get_surface_shaded(
struct Mesh *me, struct GPUMaterial **gpumat_array, uint gpumat_array_len,
char **auto_layer_names, int **auto_layer_is_srgb, int *auto_layer_count);
@@ -109,7 +132,7 @@ struct GPUBatch *DRW_mesh_batch_cache_get_weight_overlay_verts(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_all_edges(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_all_triangles(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_triangles_with_normals(struct Mesh *me);
-struct GPUBatch *DRW_mesh_batch_cache_get_triangles_with_normals_and_weights(struct Mesh *me, int defgroup);
+struct GPUBatch *DRW_mesh_batch_cache_get_triangles_with_normals_and_weights(struct Mesh *me, const struct DRW_MeshWeightState *wstate);
struct GPUBatch *DRW_mesh_batch_cache_get_triangles_with_normals_and_vert_colors(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_triangles_with_select_id(struct Mesh *me, bool use_hide, uint select_id_offset);
struct GPUBatch *DRW_mesh_batch_cache_get_triangles_with_select_mask(struct Mesh *me, bool use_hide);
@@ -120,10 +143,13 @@ struct GPUBatch *DRW_mesh_batch_cache_get_fancy_edges(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_edge_detection(struct Mesh *me, bool *r_is_manifold);
struct GPUBatch *DRW_mesh_batch_cache_get_overlay_triangles(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_overlay_triangles_nor(struct Mesh *me);
+struct GPUBatch *DRW_mesh_batch_cache_get_overlay_triangles_lnor(struct Mesh *me);
+struct GPUBatch *DRW_mesh_batch_cache_get_overlay_verts(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_overlay_loose_edges(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_overlay_loose_edges_nor(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_overlay_loose_verts(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_overlay_facedots(struct Mesh *me);
+struct GPUTexture *DRW_mesh_batch_cache_get_overlay_data_tex(struct Mesh *me);
/* edit-mesh selection (use generic function for faces) */
struct GPUBatch *DRW_mesh_batch_cache_get_facedots_with_select_id(struct Mesh *me, uint select_id_offset);
struct GPUBatch *DRW_mesh_batch_cache_get_edges_with_select_id(struct Mesh *me, uint select_id_offset);
@@ -134,6 +160,46 @@ void DRW_mesh_batch_cache_get_wireframes_face_texbuf(
void DRW_mesh_cache_sculpt_coords_ensure(struct Mesh *me);
+enum {
+ UVEDIT_EDGES = (1 << 0),
+ UVEDIT_DATA = (1 << 1),
+ UVEDIT_FACEDOTS = (1 << 2),
+ UVEDIT_FACES = (1 << 3),
+ UVEDIT_STRETCH_ANGLE = (1 << 4),
+ UVEDIT_STRETCH_AREA = (1 << 5),
+ UVEDIT_SYNC_SEL = (1 << 6),
+};
+
+/* For Image UV editor. */
+struct GPUBatch *DRW_mesh_batch_cache_get_texpaint_loop_wire(struct Mesh *me);
+void DRW_mesh_cache_uvedit(
+ struct Object *me, struct SpaceImage *sima, struct Scene *scene, uchar state,
+ struct GPUBatch **faces, struct GPUBatch **edges, struct GPUBatch **verts, struct GPUBatch **facedots);
+
+/* Edit mesh bitflags (is this the right place?) */
+
+enum {
+ VFLAG_VERTEX_ACTIVE = 1 << 0,
+ VFLAG_VERTEX_SELECTED = 1 << 1,
+ VFLAG_VERTEX_EXISTS = 1 << 2,
+ VFLAG_FACE_ACTIVE = 1 << 3,
+ VFLAG_FACE_SELECTED = 1 << 4,
+ VFLAG_FACE_FREESTYLE = 1 << 5,
+ /* Beware to not go over 1 << 7 (it's a byte flag)
+ * (see gpu_shader_edit_mesh_overlay_geom.glsl) */
+};
+
+enum {
+ VFLAG_EDGE_EXISTS = 1 << 0,
+ VFLAG_EDGE_ACTIVE = 1 << 1,
+ VFLAG_EDGE_SELECTED = 1 << 2,
+ VFLAG_EDGE_SEAM = 1 << 3,
+ VFLAG_EDGE_SHARP = 1 << 4,
+ VFLAG_EDGE_FREESTYLE = 1 << 5,
+ /* Beware to not go over 1 << 7 (it's a byte flag)
+ * (see gpu_shader_edit_mesh_overlay_geom.glsl) */
+};
+
/* Particles */
struct GPUBatch *DRW_particles_batch_cache_get_hair(
struct Object *object, struct ParticleSystem *psys, struct ModifierData *md);
diff --git a/source/blender/draw/intern/draw_cache_impl_curve.c b/source/blender/draw/intern/draw_cache_impl_curve.c
index 3fd8a970db9..4702319364c 100644
--- a/source/blender/draw/intern/draw_cache_impl_curve.c
+++ b/source/blender/draw/intern/draw_cache_impl_curve.c
@@ -45,14 +45,12 @@
#include "draw_cache_impl.h" /* own include */
#define SELECT 1
-#define ACTIVE_NURB 1 << 7 /* last char bite */
-#define HANDLE_SEL_OFFSET (TH_HANDLE_SEL_FREE - TH_HANDLE_FREE)
+#define ACTIVE_NURB 1 << 2
+#define EVEN_U_BIT 1 << 3 /* Alternate this bit for every U vert. */
/* Used as values of `color_id` in `edit_curve_overlay_handle_geom.glsl` */
enum {
- COLOR_NURB_ULINE_ID = TH_HANDLE_SEL_AUTOCLAMP - TH_HANDLE_FREE + 1,
- COLOR_NURB_SEL_ULINE_ID,
- COLOR_ACTIVE_SPLINE,
+ COLOR_NURB_ULINE_ID = TH_HANDLE_AUTOCLAMP - TH_HANDLE_FREE + 2,
TOT_HANDLE_COL,
};
@@ -70,22 +68,22 @@ static void curve_batch_cache_clear(Curve *cu);
/* Curve Interface, direct access to basic data. */
static void curve_render_overlay_verts_edges_len_get(
- ListBase *lb, bool hide_handles,
- int *r_vert_len, int *r_edge_len)
+ ListBase *lb, int *r_vert_len, int *r_edge_len)
{
BLI_assert(r_vert_len || r_edge_len);
int vert_len = 0;
int edge_len = 0;
for (Nurb *nu = lb->first; nu; nu = nu->next) {
if (nu->bezt) {
- vert_len += hide_handles ? nu->pntsu : (nu->pntsu * 3);
+ vert_len += nu->pntsu * 3;
/* 2x handles per point*/
edge_len += 2 * nu->pntsu;
}
else if (nu->bp) {
- vert_len += nu->pntsu;
+ vert_len += nu->pntsu * nu->pntsv;
/* segments between points */
- edge_len += nu->pntsu - 1;
+ edge_len += (nu->pntsu - 1) * nu->pntsv;
+ edge_len += (nu->pntsv - 1) * nu->pntsu;
}
}
if (r_vert_len) {
@@ -173,9 +171,6 @@ typedef struct CurveRenderData {
EditFont *edit_font;
} text;
- bool hide_handles;
- bool hide_normals;
-
/* borrow from 'Object' */
CurveCache *ob_curve_cache;
@@ -210,9 +205,6 @@ static CurveRenderData *curve_render_data_create(Curve *cu, CurveCache *ob_curve
rdata->types = types;
ListBase *nurbs;
- rdata->hide_handles = (cu->drawflag & CU_HIDE_HANDLES) != 0;
- rdata->hide_normals = (cu->drawflag & CU_HIDE_NORMALS) != 0;
-
rdata->actnu = cu->actnu;
rdata->actvert = cu->actvert;
@@ -230,9 +222,9 @@ static CurveRenderData *curve_render_data_create(Curve *cu, CurveCache *ob_curve
if (types & CU_DATATYPE_OVERLAY) {
curve_render_overlay_verts_edges_len_get(
- nurbs, rdata->hide_handles,
+ nurbs,
&rdata->overlay.vert_len,
- rdata->hide_handles ? NULL : &rdata->overlay.edge_len);
+ &rdata->overlay.edge_len);
rdata->actnu = cu->actnu;
rdata->actvert = cu->actvert;
@@ -292,10 +284,6 @@ static int curve_render_data_normal_len_get(const CurveRenderData *rdata)
return rdata->normal.len;
}
-enum {
- VFLAG_VERTEX_SELECTED = 1 << 0,
- VFLAG_VERTEX_ACTIVE = 1 << 1,
-};
/* ---------------------------------------------------------------------- */
/* Curve GPUBatch Cache */
@@ -321,6 +309,7 @@ typedef struct CurveBatchCache {
struct {
GPUBatch *edges;
GPUBatch *verts;
+ GPUBatch *verts_no_handles;
} overlay;
struct {
@@ -340,9 +329,6 @@ typedef struct CurveBatchCache {
/* settings to determine if cache is invalid */
bool is_dirty;
- bool hide_handles;
- bool hide_normals;
-
float normal_size;
bool is_editmode;
@@ -367,15 +353,7 @@ static bool curve_batch_cache_valid(Curve *cu)
}
if (cache->is_editmode) {
- if (cu->editnurb) {
- if ((cache->hide_handles != ((cu->drawflag & CU_HIDE_HANDLES) != 0))) {
- return false;
- }
- else if ((cache->hide_normals != ((cu->drawflag & CU_HIDE_NORMALS) != 0))) {
- return false;
- }
- }
- else if (cu->editfont) {
+ if (cu->editfont) {
/* TODO */
}
}
@@ -394,9 +372,6 @@ static void curve_batch_cache_init(Curve *cu)
memset(cache, 0, sizeof(*cache));
}
- cache->hide_handles = (cu->drawflag & CU_HIDE_HANDLES) != 0;
- cache->hide_normals = (cu->drawflag & CU_HIDE_NORMALS) != 0;
-
#if 0
ListBase *nurbs;
if (cu->editnurb) {
@@ -434,6 +409,7 @@ void DRW_curve_batch_cache_dirty_tag(Curve *cu, int mode)
break;
case BKE_CURVE_BATCH_DIRTY_SELECT:
/* editnurb */
+ GPU_BATCH_DISCARD_SAFE(cache->overlay.verts_no_handles);
GPU_BATCH_DISCARD_SAFE(cache->overlay.verts);
GPU_BATCH_DISCARD_SAFE(cache->overlay.edges);
@@ -453,6 +429,7 @@ static void curve_batch_cache_clear(Curve *cu)
return;
}
+ GPU_BATCH_DISCARD_SAFE(cache->overlay.verts_no_handles);
GPU_BATCH_DISCARD_SAFE(cache->overlay.verts);
GPU_BATCH_DISCARD_SAFE(cache->overlay.edges);
@@ -555,14 +532,6 @@ static GPUIndexBuf *curve_batch_cache_get_wire_edges(CurveRenderData *rdata, Cur
}
}
}
-
- if (rdata->hide_handles) {
- BLI_assert(edge_len_used <= edge_len);
- }
- else {
- BLI_assert(edge_len_used == edge_len);
- }
-
cache->wire.elem = GPU_indexbuf_build(&elb);
}
@@ -679,44 +648,46 @@ static void curve_batch_cache_create_overlay_batches(Curve *cu)
GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format);
const int vbo_len_capacity = curve_render_data_overlay_verts_len_get(rdata);
+ GPUIndexBufBuilder elb;
+ GPU_indexbuf_init(&elb, GPU_PRIM_POINTS, vbo_len_capacity, vbo_len_capacity);
int vbo_len_used = 0;
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- int i = 0;
- for (Nurb *nu = rdata->nurbs->first; nu; nu = nu->next) {
+ int i = 0, nu_id = 0;
+ for (Nurb *nu = rdata->nurbs->first; nu; nu = nu->next, nu_id++) {
+ const bool is_active_nurb = (nu_id == cu->actnu);
if (nu->bezt) {
int a = 0;
for (const BezTriple *bezt = nu->bezt; a < nu->pntsu; a++, bezt++) {
if (bezt->hide == false) {
const bool is_active = (i == rdata->actvert);
- char vflag;
-
- if (rdata->hide_handles) {
- vflag = (bezt->f2 & SELECT) ?
- (is_active ? VFLAG_VERTEX_ACTIVE : VFLAG_VERTEX_SELECTED) : 0;
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vbo_len_used, bezt->vec[1]);
+ GPU_indexbuf_add_point_vert(&elb, vbo_len_used + 1);
+ for (int j = 0; j < 3; j++) {
+ char vflag = ((&bezt->f1)[j] & SELECT) ? VFLAG_VERTEX_SELECTED : 0;
+ vflag |= (is_active) ? VFLAG_VERTEX_ACTIVE : 0;
+ vflag |= (is_active_nurb) ? ACTIVE_NURB : 0;
+ /* handle color id */
+ char col_id = (&bezt->h1)[j / 2];
+ vflag |= col_id << 4; /* << 4 because of EVEN_U_BIT */
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vbo_len_used, bezt->vec[j]);
GPU_vertbuf_attr_set(vbo, attr_id.data, vbo_len_used, &vflag);
vbo_len_used += 1;
}
- else {
- for (int j = 0; j < 3; j++) {
- vflag = ((&bezt->f1)[j] & SELECT) ?
- (is_active ? VFLAG_VERTEX_ACTIVE : VFLAG_VERTEX_SELECTED) : 0;
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vbo_len_used, bezt->vec[j]);
- GPU_vertbuf_attr_set(vbo, attr_id.data, vbo_len_used, &vflag);
- vbo_len_used += 1;
- }
- }
}
i += 1;
}
}
else if (nu->bp) {
int a = 0;
- for (const BPoint *bp = nu->bp; a < nu->pntsu; a++, bp++) {
+ int pt_len = nu->pntsu * nu->pntsv;
+ for (const BPoint *bp = nu->bp; a < pt_len; a++, bp++) {
if (bp->hide == false) {
const bool is_active = (i == rdata->actvert);
- char vflag;
- vflag = (bp->f1 & SELECT) ? (is_active ? VFLAG_VERTEX_ACTIVE : VFLAG_VERTEX_SELECTED) : 0;
+ char vflag = (bp->f1 & SELECT) ? VFLAG_VERTEX_SELECTED : 0;
+ vflag |= (is_active) ? VFLAG_VERTEX_ACTIVE : 0;
+ vflag |= (is_active_nurb) ? ACTIVE_NURB : 0;
+ vflag |= (((a % nu->pntsu) % 2) == 0) ? EVEN_U_BIT : 0;
+ vflag |= COLOR_NURB_ULINE_ID << 4; /* << 4 because of EVEN_U_BIT */
+ GPU_indexbuf_add_point_vert(&elb, vbo_len_used);
GPU_vertbuf_attr_set(vbo, attr_id.pos, vbo_len_used, bp->vec);
GPU_vertbuf_attr_set(vbo, attr_id.data, vbo_len_used, &vflag);
vbo_len_used += 1;
@@ -730,82 +701,66 @@ static void curve_batch_cache_create_overlay_batches(Curve *cu)
GPU_vertbuf_data_resize(vbo, vbo_len_used);
}
+ GPUIndexBuf *ibo = GPU_indexbuf_build(&elb);
+
cache->overlay.verts = GPU_batch_create_ex(GPU_PRIM_POINTS, vbo, NULL, GPU_BATCH_OWNS_VBO);
+ cache->overlay.verts_no_handles = GPU_batch_create_ex(GPU_PRIM_POINTS, vbo, ibo, GPU_BATCH_OWNS_INDEX);
}
+ if (cache->overlay.edges == NULL) {
+ GPUVertBuf *vbo = cache->overlay.verts->verts[0];
- if ((cache->overlay.edges == NULL) && (rdata->hide_handles == false)) {
- /* Note: we could reference indices to vertices (above) */
-
- static GPUVertFormat format = { 0 };
- static struct { uint pos, data; } attr_id;
- if (format.attr_len == 0) {
- /* initialize vertex format */
- attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
- attr_id.data = GPU_vertformat_attr_add(&format, "data", GPU_COMP_U8, 1, GPU_FETCH_INT);
- }
-
- GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format);
const int edge_len = curve_render_data_overlay_edges_len_get(rdata);
const int vbo_len_capacity = edge_len * 2;
- int vbo_len_used = 0;
- GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
+
+ GPUIndexBufBuilder elb;
+ GPU_indexbuf_init(&elb, GPU_PRIM_LINES, vbo_len_capacity, vbo->vertex_len);
+
+ int curr_index = 0;
int i = 0;
for (Nurb *nu = rdata->nurbs->first; nu; nu = nu->next, i++) {
- const bool is_active_nurb = (i == cu->actnu);
-
if (nu->bezt) {
int a = 0;
for (const BezTriple *bezt = nu->bezt; a < nu->pntsu; a++, bezt++) {
if (bezt->hide == false) {
- char col_id;
-
- for (int j = 0; j < 2; j += 1) {
- /* same vertex twice, only check different selection */
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vbo_len_used, bezt->vec[1]);
- vbo_len_used += 1;
-
- col_id = (&bezt->h1)[j];
- if ((&bezt->f1)[j * 2] & SELECT) {
- col_id += HANDLE_SEL_OFFSET;
- }
- if (is_active_nurb) {
- col_id |= ACTIVE_NURB;
- }
-
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vbo_len_used, bezt->vec[j * 2]);
- GPU_vertbuf_attr_set(vbo, attr_id.data, vbo_len_used, &col_id);
- vbo_len_used += 1;
- }
+ GPU_indexbuf_add_line_verts(&elb, curr_index + 1, curr_index + 0);
+ GPU_indexbuf_add_line_verts(&elb, curr_index + 1, curr_index + 2);
+ curr_index += 3;
}
}
}
else if (nu->bp) {
- int a = 1;
- for (const BPoint *bp_prev = nu->bp, *bp_curr = &nu->bp[1]; a < nu->pntsu; a++, bp_prev = bp_curr++) {
- if ((bp_prev->hide == false) && (bp_curr->hide == false)) {
- char col_id = ((bp_prev->f1 & SELECT) && (bp_curr->f1 & SELECT)) ? COLOR_NURB_SEL_ULINE_ID : COLOR_NURB_ULINE_ID;
+ int a = 0;
+ int next_v_index = curr_index;
+ for (const BPoint *bp = nu->bp; a < nu->pntsu; a++, bp++) {
+ if (bp->hide == false) {
+ next_v_index += 1;
+ }
+ }
- if (is_active_nurb) {
- col_id |= ACTIVE_NURB;
+ int pt_len = nu->pntsu * nu->pntsv;
+ for (a = 0; a < pt_len; a++) {
+ const BPoint *bp_curr = &nu->bp[a];
+ const BPoint *bp_next_u = ((a % nu->pntsu) < (nu->pntsu - 1)) ? &nu->bp[a + 1] : NULL;
+ const BPoint *bp_next_v = (a < (pt_len - nu->pntsu)) ? &nu->bp[a + nu->pntsu] : NULL;
+ if (bp_curr->hide == false) {
+ if (bp_next_u && (bp_next_u->hide == false)) {
+ GPU_indexbuf_add_line_verts(&elb, curr_index, curr_index + 1);
}
-
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vbo_len_used, bp_prev->vec);
- vbo_len_used += 1;
-
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vbo_len_used, bp_curr->vec);
- GPU_vertbuf_attr_set(vbo, attr_id.data, vbo_len_used, &col_id);
- vbo_len_used += 1;
-
+ if (bp_next_v && (bp_next_v->hide == false)) {
+ GPU_indexbuf_add_line_verts(&elb, curr_index, next_v_index);
+ }
+ curr_index += 1;
+ }
+ if (bp_next_v && (bp_next_v->hide == false)) {
+ next_v_index += 1;
}
}
}
}
- if (vbo_len_capacity != vbo_len_used) {
- GPU_vertbuf_data_resize(vbo, vbo_len_used);
- }
- cache->overlay.edges = GPU_batch_create_ex(GPU_PRIM_LINES, vbo, NULL, GPU_BATCH_OWNS_VBO);
+ GPUIndexBuf *ibo = GPU_indexbuf_build(&elb);
+ cache->overlay.edges = GPU_batch_create_ex(GPU_PRIM_LINES, vbo, ibo, GPU_BATCH_OWNS_INDEX);
}
curve_render_data_free(rdata);
@@ -999,15 +954,15 @@ GPUBatch *DRW_curve_batch_cache_get_overlay_edges(Curve *cu)
return cache->overlay.edges;
}
-GPUBatch *DRW_curve_batch_cache_get_overlay_verts(Curve *cu)
+GPUBatch *DRW_curve_batch_cache_get_overlay_verts(Curve *cu, bool handles)
{
CurveBatchCache *cache = curve_batch_cache_get(cu);
- if (cache->overlay.verts == NULL) {
+ if (cache->overlay.verts == NULL || cache->overlay.verts_no_handles == NULL) {
curve_batch_cache_create_overlay_batches(cu);
}
- return cache->overlay.verts;
+ return (handles) ? cache->overlay.verts : cache->overlay.verts_no_handles;
}
GPUBatch *DRW_curve_batch_cache_get_triangles_with_normals(
diff --git a/source/blender/draw/intern/draw_cache_impl_lattice.c b/source/blender/draw/intern/draw_cache_impl_lattice.c
index 4ffbe7b7546..b077162b41d 100644
--- a/source/blender/draw/intern/draw_cache_impl_lattice.c
+++ b/source/blender/draw/intern/draw_cache_impl_lattice.c
@@ -273,11 +273,6 @@ static void lattice_render_data_weight_col_get(const LatticeRenderData *rdata, c
}
}
-enum {
- VFLAG_VERTEX_SELECTED = 1 << 0,
- VFLAG_VERTEX_ACTIVE = 1 << 1,
-};
-
/* ---------------------------------------------------------------------- */
/* Lattice GPUBatch Cache */
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 8c3ecfadad9..8cd2da1a898 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -31,9 +31,11 @@
#include "MEM_guardedalloc.h"
+#include "BLI_buffer.h"
#include "BLI_utildefines.h"
#include "BLI_math_vector.h"
#include "BLI_math_bits.h"
+#include "BLI_math_color.h"
#include "BLI_string.h"
#include "BLI_alloca.h"
#include "BLI_edgehash.h"
@@ -41,24 +43,33 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_space_types.h"
#include "BKE_customdata.h"
#include "BKE_deform.h"
#include "BKE_editmesh.h"
+#include "BKE_editmesh_cache.h"
#include "BKE_editmesh_tangent.h"
#include "BKE_mesh.h"
#include "BKE_mesh_tangent.h"
+#include "BKE_mesh_runtime.h"
#include "BKE_colorband.h"
+#include "BKE_cdderivedmesh.h"
#include "bmesh.h"
#include "GPU_batch.h"
+#include "GPU_batch_presets.h"
#include "GPU_draw.h"
#include "GPU_material.h"
#include "GPU_texture.h"
#include "DRW_render.h"
+#include "ED_image.h"
+#include "ED_mesh.h"
+#include "ED_uvedit.h"
+
#include "draw_cache_impl.h" /* own include */
static void mesh_batch_cache_clear(Mesh *me);
@@ -134,13 +145,40 @@ typedef struct MeshRenderData {
int loose_vert_len;
int loose_edge_len;
+ /* Support for mapped mesh data. */
+ struct {
+ /* Must be set if we want to get mapped data. */
+ bool use;
+ bool supported;
+
+ Mesh *me_cage;
+
+ int vert_len;
+ int edge_len;
+ int tri_len;
+ int loop_len;
+ int poly_len;
+
+ int *loose_verts;
+ int loose_vert_len;
+
+ int *loose_edges;
+ int loose_edge_len;
+
+ /* origindex layers */
+ int *v_origindex;
+ int *e_origindex;
+ int *l_origindex;
+ int *p_origindex;
+ } mapped;
+
BMEditMesh *edit_bmesh;
struct EditMeshData *edit_data;
MVert *mvert;
- MEdge *medge;
- MLoop *mloop;
- MPoly *mpoly;
+ const MEdge *medge;
+ const MLoop *mloop;
+ const MPoly *mpoly;
float (*orco)[3]; /* vertex coordinates normalized to bounding box */
bool is_orco_allocated;
MDeformVert *dvert;
@@ -172,6 +210,10 @@ typedef struct MeshRenderData {
int bweight;
int *uv;
int *vcol;
+#ifdef WITH_FREESTYLE
+ int freestyle_edge;
+ int freestyle_face;
+#endif
} offset;
struct {
@@ -200,7 +242,7 @@ typedef struct MeshRenderData {
int *loose_verts;
float (*poly_normals)[3];
- float (*vert_weight_color)[3];
+ float (*vert_weight);
char (*vert_color)[3];
GPUPackedNormal *poly_normals_pack;
GPUPackedNormal *vert_normals_pack;
@@ -379,7 +421,7 @@ static void mesh_render_calc_normals_loop_and_poly(const Mesh *me, const float s
/**
* TODO(campbell): 'gpumat_array' may include materials linked to the object.
* While not default, object materials should be supported.
- * Although this only impacts the data thats generated, not the materials that display.
+ * Although this only impacts the data that's generated, not the materials that display.
*/
static MeshRenderData *mesh_render_data_create_ex(
Mesh *me, const int types,
@@ -401,6 +443,36 @@ static MeshRenderData *mesh_render_data_create_ex(
rdata->edit_bmesh = embm;
rdata->edit_data = me->runtime.edit_data;
+ if (embm->mesh_eval_cage && (embm->mesh_eval_cage->runtime.is_original == false)) {
+ Mesh *me_cage = embm->mesh_eval_cage;
+
+ rdata->mapped.me_cage = me_cage;
+ if (types & MR_DATATYPE_VERT) {
+ rdata->mapped.vert_len = me_cage->totvert;
+ }
+ if (types & MR_DATATYPE_EDGE) {
+ rdata->mapped.edge_len = me_cage->totedge;
+ }
+ if (types & MR_DATATYPE_LOOP) {
+ rdata->mapped.loop_len = me_cage->totloop;
+ }
+ if (types & MR_DATATYPE_POLY) {
+ rdata->mapped.poly_len = me_cage->totpoly;
+ }
+ if (types & MR_DATATYPE_LOOPTRI) {
+ rdata->mapped.tri_len = poly_to_tri_count(me_cage->totpoly, me_cage->totloop);
+ }
+
+ rdata->mapped.v_origindex = CustomData_get_layer(&me_cage->vdata, CD_ORIGINDEX);
+ rdata->mapped.e_origindex = CustomData_get_layer(&me_cage->edata, CD_ORIGINDEX);
+ rdata->mapped.l_origindex = CustomData_get_layer(&me_cage->ldata, CD_ORIGINDEX);
+ rdata->mapped.p_origindex = CustomData_get_layer(&me_cage->pdata, CD_ORIGINDEX);
+ rdata->mapped.supported = (
+ rdata->mapped.v_origindex &&
+ rdata->mapped.e_origindex &&
+ rdata->mapped.p_origindex);
+ }
+
int bm_ensure_types = 0;
if (types & MR_DATATYPE_VERT) {
rdata->vert_len = bm->totvert;
@@ -411,23 +483,13 @@ static MeshRenderData *mesh_render_data_create_ex(
bm_ensure_types |= BM_EDGE;
}
if (types & MR_DATATYPE_LOOPTRI) {
- BKE_editmesh_tessface_calc(embm);
- int tottri = embm->tottri;
- rdata->mlooptri = MEM_mallocN(sizeof(*rdata->mlooptri) * embm->tottri, __func__);
- for (int index = 0; index < tottri ; index ++ ) {
- BMLoop **bmtri = embm->looptris[index];
- MLoopTri *mtri = &rdata->mlooptri[index];
- mtri->tri[0] = BM_elem_index_get(bmtri[0]);
- mtri->tri[1] = BM_elem_index_get(bmtri[1]);
- mtri->tri[2] = BM_elem_index_get(bmtri[2]);
- }
- rdata->tri_len = tottri;
+ bm_ensure_types |= BM_LOOP;
}
if (types & MR_DATATYPE_LOOP) {
int totloop = bm->totloop;
if (is_auto_smooth) {
rdata->loop_normals = MEM_mallocN(sizeof(*rdata->loop_normals) * totloop, __func__);
- int cd_loop_clnors_offset = CustomData_get_layer_index(&bm->ldata, CD_CUSTOMLOOPNORMAL);
+ int cd_loop_clnors_offset = CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL);
BM_loops_calc_normal_vcos(
bm, NULL, NULL, NULL, true, split_angle, rdata->loop_normals, NULL, NULL,
cd_loop_clnors_offset, false);
@@ -445,6 +507,11 @@ static MeshRenderData *mesh_render_data_create_ex(
rdata->eve_act = BM_mesh_active_vert_get(bm);
rdata->cd.offset.crease = CustomData_get_offset(&bm->edata, CD_CREASE);
rdata->cd.offset.bweight = CustomData_get_offset(&bm->edata, CD_BWEIGHT);
+
+#ifdef WITH_FREESTYLE
+ rdata->cd.offset.freestyle_edge = CustomData_get_offset(&bm->edata, CD_FREESTYLE_EDGE);
+ rdata->cd.offset.freestyle_face = CustomData_get_offset(&bm->pdata, CD_FREESTYLE_FACE);
+#endif
}
if (types & (MR_DATATYPE_DVERT)) {
bm_ensure_types |= BM_VERT;
@@ -455,17 +522,31 @@ static MeshRenderData *mesh_render_data_create_ex(
BM_mesh_elem_index_ensure(bm, bm_ensure_types);
BM_mesh_elem_table_ensure(bm, bm_ensure_types & ~BM_LOOP);
+
+ if (types & MR_DATATYPE_LOOPTRI) {
+ /* Edit mode ensures this is valid, no need to calculate. */
+ BLI_assert((bm->totloop == 0) || (embm->looptris != NULL));
+ int tottri = embm->tottri;
+ MLoopTri *mlooptri = MEM_mallocN(sizeof(*rdata->mlooptri) * embm->tottri, __func__);
+ for (int index = 0; index < tottri ; index ++ ) {
+ BMLoop **bmtri = embm->looptris[index];
+ MLoopTri *mtri = &mlooptri[index];
+ mtri->tri[0] = BM_elem_index_get(bmtri[0]);
+ mtri->tri[1] = BM_elem_index_get(bmtri[1]);
+ mtri->tri[2] = BM_elem_index_get(bmtri[2]);
+ }
+ rdata->mlooptri = mlooptri;
+ rdata->tri_len = tottri;
+ }
+
if (types & MR_DATATYPE_OVERLAY) {
rdata->loose_vert_len = rdata->loose_edge_len = 0;
- int *lverts = rdata->loose_verts = MEM_mallocN(rdata->vert_len * sizeof(int), "Loose Vert");
- int *ledges = rdata->loose_edges = MEM_mallocN(rdata->edge_len * sizeof(int), "Loose Edges");
-
{
+ int *lverts = MEM_mallocN(rdata->vert_len * sizeof(int), __func__);
BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
- BMVert **vtable = bm->vtable;
for (int i = 0; i < bm->totvert; i++) {
- const BMVert *eve = vtable[i];
+ const BMVert *eve = BM_vert_at_index(bm, i);
if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
/* Loose vert */
if (eve->e == NULL || !bm_vert_has_visible_edge(eve)) {
@@ -473,13 +554,14 @@ static MeshRenderData *mesh_render_data_create_ex(
}
}
}
+ rdata->loose_verts = MEM_reallocN(lverts, rdata->loose_vert_len * sizeof(int));
}
{
+ int *ledges = MEM_mallocN(rdata->edge_len * sizeof(int), __func__);
BLI_assert((bm->elem_table_dirty & BM_EDGE) == 0);
- BMEdge **etable = bm->etable;
for (int i = 0; i < bm->totedge; i++) {
- const BMEdge *eed = etable[i];
+ const BMEdge *eed = BM_edge_at_index(bm, i);
if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
/* Loose edge */
if (eed->l == NULL || !bm_edge_has_visible_face(eed)) {
@@ -487,10 +569,49 @@ static MeshRenderData *mesh_render_data_create_ex(
}
}
}
+ rdata->loose_edges = MEM_reallocN(ledges, rdata->loose_edge_len * sizeof(int));
}
- rdata->loose_verts = MEM_reallocN(rdata->loose_verts, rdata->loose_vert_len * sizeof(int));
- rdata->loose_edges = MEM_reallocN(rdata->loose_edges, rdata->loose_edge_len * sizeof(int));
+ if (rdata->mapped.supported) {
+ Mesh *me_cage = embm->mesh_eval_cage;
+ rdata->mapped.loose_vert_len = rdata->mapped.loose_edge_len = 0;
+
+ if (rdata->loose_vert_len) {
+ int *lverts = MEM_mallocN(me_cage->totvert * sizeof(int), __func__);
+ const int *v_origindex = rdata->mapped.v_origindex;
+ for (int i = 0; i < me_cage->totvert; i++) {
+ const int v_orig = v_origindex[i];
+ if (v_orig != ORIGINDEX_NONE) {
+ BMVert *eve = BM_vert_at_index(bm, v_orig);
+ if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ /* Loose vert */
+ if (eve->e == NULL || !bm_vert_has_visible_edge(eve)) {
+ lverts[rdata->mapped.loose_vert_len++] = i;
+ }
+ }
+ }
+ }
+ rdata->mapped.loose_verts = MEM_reallocN(lverts, rdata->mapped.loose_vert_len * sizeof(int));
+ }
+
+ if (rdata->loose_edge_len) {
+ int *ledges = MEM_mallocN(me_cage->totedge * sizeof(int), __func__);
+ const int *e_origindex = rdata->mapped.e_origindex;
+ for (int i = 0; i < me_cage->totedge; i++) {
+ const int e_orig = e_origindex[i];
+ if (e_orig != ORIGINDEX_NONE) {
+ BMEdge *eed = BM_edge_at_index(bm, e_orig);
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+ /* Loose edge */
+ if (eed->l == NULL || !bm_edge_has_visible_face(eed)) {
+ ledges[rdata->mapped.loose_edge_len++] = i;
+ }
+ }
+ }
+ }
+ rdata->mapped.loose_edges = MEM_reallocN(ledges, rdata->mapped.loose_edge_len * sizeof(int));
+ }
+ }
}
}
else {
@@ -504,8 +625,9 @@ static MeshRenderData *mesh_render_data_create_ex(
}
if (types & MR_DATATYPE_LOOPTRI) {
const int tri_len = rdata->tri_len = poly_to_tri_count(me->totpoly, me->totloop);
- rdata->mlooptri = MEM_mallocN(sizeof(*rdata->mlooptri) * tri_len, __func__);
- BKE_mesh_recalc_looptri(me->mloop, me->mpoly, me->mvert, me->totloop, me->totpoly, rdata->mlooptri);
+ MLoopTri *mlooptri = MEM_mallocN(sizeof(*mlooptri) * tri_len, __func__);
+ BKE_mesh_recalc_looptri(me->mloop, me->mpoly, me->mvert, me->totloop, me->totpoly, mlooptri);
+ rdata->mlooptri = mlooptri;
}
if (types & MR_DATATYPE_LOOP) {
rdata->loop_len = me->totloop;
@@ -581,9 +703,8 @@ static MeshRenderData *mesh_render_data_create_ex(
BMesh *bm = me->edit_btmesh->bm;
rdata->orco = MEM_mallocN(sizeof(*rdata->orco) * rdata->vert_len, "orco mesh");
BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
- BMVert **vtable = bm->vtable;
for (int i = 0; i < bm->totvert; i++) {
- copy_v3_v3(rdata->orco[i], vtable[i]->co);
+ copy_v3_v3(rdata->orco[i], BM_vert_at_index(bm, i)->co);
}
BKE_mesh_orco_verts_transform(me, rdata->orco, rdata->vert_len, 0);
}
@@ -844,10 +965,13 @@ static void mesh_render_data_free(MeshRenderData *rdata)
MEM_SAFE_FREE(rdata->poly_normals);
MEM_SAFE_FREE(rdata->poly_normals_pack);
MEM_SAFE_FREE(rdata->vert_normals_pack);
- MEM_SAFE_FREE(rdata->vert_weight_color);
+ MEM_SAFE_FREE(rdata->vert_weight);
MEM_SAFE_FREE(rdata->edge_select_bool);
MEM_SAFE_FREE(rdata->vert_color);
+ MEM_SAFE_FREE(rdata->mapped.loose_verts);
+ MEM_SAFE_FREE(rdata->mapped.loose_edges);
+
CustomData_free(&rdata->cd.output.ldata, rdata->loop_len);
MEM_freeN(rdata);
@@ -901,30 +1025,55 @@ static int mesh_render_data_verts_len_get(const MeshRenderData *rdata)
BLI_assert(rdata->types & MR_DATATYPE_VERT);
return rdata->vert_len;
}
+static int mesh_render_data_verts_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+ BLI_assert(rdata->types & MR_DATATYPE_VERT);
+ return ((rdata->mapped.use == false) ? rdata->vert_len : rdata->mapped.vert_len);
+}
-static int mesh_render_data_loose_verts_len_get(const MeshRenderData *rdata)
+static int UNUSED_FUNCTION(mesh_render_data_loose_verts_len_get)(const MeshRenderData *rdata)
{
BLI_assert(rdata->types & MR_DATATYPE_OVERLAY);
return rdata->loose_vert_len;
}
+static int mesh_render_data_loose_verts_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+ BLI_assert(rdata->types & MR_DATATYPE_OVERLAY);
+ return ((rdata->mapped.use == false) ? rdata->loose_vert_len : rdata->mapped.loose_vert_len);
+}
static int mesh_render_data_edges_len_get(const MeshRenderData *rdata)
{
BLI_assert(rdata->types & MR_DATATYPE_EDGE);
return rdata->edge_len;
}
+static int mesh_render_data_edges_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+ BLI_assert(rdata->types & MR_DATATYPE_EDGE);
+ return ((rdata->mapped.use == false) ? rdata->edge_len : rdata->mapped.edge_len);
+}
-static int mesh_render_data_loose_edges_len_get(const MeshRenderData *rdata)
+static int UNUSED_FUNCTION(mesh_render_data_loose_edges_len_get)(const MeshRenderData *rdata)
{
BLI_assert(rdata->types & MR_DATATYPE_OVERLAY);
return rdata->loose_edge_len;
}
+static int mesh_render_data_loose_edges_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+ BLI_assert(rdata->types & MR_DATATYPE_OVERLAY);
+ return ((rdata->mapped.use == false) ? rdata->loose_edge_len : rdata->mapped.loose_edge_len);
+}
static int mesh_render_data_looptri_len_get(const MeshRenderData *rdata)
{
BLI_assert(rdata->types & MR_DATATYPE_LOOPTRI);
return rdata->tri_len;
}
+static int mesh_render_data_looptri_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+ BLI_assert(rdata->types & MR_DATATYPE_LOOPTRI);
+ return ((rdata->mapped.use == false) ? rdata->tri_len : rdata->mapped.tri_len);
+}
static int mesh_render_data_mat_len_get(const MeshRenderData *rdata)
{
@@ -932,7 +1081,7 @@ static int mesh_render_data_mat_len_get(const MeshRenderData *rdata)
return rdata->mat_len;
}
-static int UNUSED_FUNCTION(mesh_render_data_loops_len_get)(const MeshRenderData *rdata)
+static int mesh_render_data_loops_len_get(const MeshRenderData *rdata)
{
BLI_assert(rdata->types & MR_DATATYPE_LOOP);
return rdata->loop_len;
@@ -943,6 +1092,11 @@ static int mesh_render_data_polys_len_get(const MeshRenderData *rdata)
BLI_assert(rdata->types & MR_DATATYPE_POLY);
return rdata->poly_len;
}
+static int mesh_render_data_polys_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+ BLI_assert(rdata->types & MR_DATATYPE_POLY);
+ return ((rdata->mapped.use == false) ? rdata->poly_len : rdata->mapped.poly_len);
+}
/** \} */
@@ -964,8 +1118,17 @@ static void mesh_render_data_ensure_poly_normals_pack(MeshRenderData *rdata)
int i;
pnors_pack = rdata->poly_normals_pack = MEM_mallocN(sizeof(*pnors_pack) * rdata->poly_len, __func__);
- BM_ITER_MESH_INDEX(efa, &fiter, bm, BM_FACES_OF_MESH, i) {
- pnors_pack[i] = GPU_normal_convert_i10_v3(efa->no);
+ if (rdata->edit_data && rdata->edit_data->vertexCos != NULL) {
+ BKE_editmesh_cache_ensure_poly_normals(rdata->edit_bmesh, rdata->edit_data);
+ const float (*pnors)[3] = rdata->edit_data->polyNos;
+ for (i = 0; i < bm->totface; i++) {
+ pnors_pack[i] = GPU_normal_convert_i10_v3(pnors[i]);
+ }
+ }
+ else {
+ BM_ITER_MESH_INDEX(efa, &fiter, bm, BM_FACES_OF_MESH, i) {
+ pnors_pack[i] = GPU_normal_convert_i10_v3(efa->no);
+ }
}
}
else {
@@ -1067,47 +1230,54 @@ fallback:
}
}
-/* TODO, move into shader? */
-static void rgb_from_weight(float r_rgb[3], const float weight)
+static float evaluate_vertex_weight(const MDeformVert *dvert, const struct DRW_MeshWeightState *wstate)
{
- const float blend = ((weight / 2.0f) + 0.5f);
+ float input = 0.0f;
+ bool show_alert_color = false;
- if (weight <= 0.25f) { /* blue->cyan */
- r_rgb[0] = 0.0f;
- r_rgb[1] = blend * weight * 4.0f;
- r_rgb[2] = blend;
- }
- else if (weight <= 0.50f) { /* cyan->green */
- r_rgb[0] = 0.0f;
- r_rgb[1] = blend;
- r_rgb[2] = blend * (1.0f - ((weight - 0.25f) * 4.0f));
+ if (wstate->flags & DRW_MESH_WEIGHT_STATE_MULTIPAINT) {
+ /* Multi-Paint feature */
+ input = BKE_defvert_multipaint_collective_weight(
+ dvert, wstate->defgroup_len, wstate->defgroup_sel, wstate->defgroup_sel_count,
+ (wstate->flags & DRW_MESH_WEIGHT_STATE_AUTO_NORMALIZE) != 0);
+
+ /* make it black if the selected groups have no weight on a vertex */
+ if (input == 0.0f) {
+ show_alert_color = true;
+ }
}
- else if (weight <= 0.75f) { /* green->yellow */
- r_rgb[0] = blend * ((weight - 0.50f) * 4.0f);
- r_rgb[1] = blend;
- r_rgb[2] = 0.0f;
+ else {
+ /* default, non tricky behavior */
+ input = defvert_find_weight(dvert, wstate->defgroup_active);
+
+ if (input == 0.0f) {
+ switch (wstate->alert_mode) {
+ case OB_DRAW_GROUPUSER_ACTIVE:
+ show_alert_color = true;
+ break;
+
+ case OB_DRAW_GROUPUSER_ALL:
+ show_alert_color = defvert_is_weight_zero(dvert, wstate->defgroup_len);
+ break;
+ }
+ }
}
- else if (weight <= 1.0f) { /* yellow->red */
- r_rgb[0] = blend;
- r_rgb[1] = blend * (1.0f - ((weight - 0.75f) * 4.0f));
- r_rgb[2] = 0.0f;
+
+ if (show_alert_color) {
+ return -1.0f;
}
else {
- /* exceptional value, unclamped or nan,
- * avoid uninitialized memory use */
- r_rgb[0] = 1.0f;
- r_rgb[1] = 0.0f;
- r_rgb[2] = 1.0f;
+ CLAMP(input, 0.0f, 1.0f);
+ return input;
}
}
-
-/** Ensure #MeshRenderData.vert_weight_color */
-static void mesh_render_data_ensure_vert_weight_color(MeshRenderData *rdata, const int defgroup)
+/** Ensure #MeshRenderData.vert_weight */
+static void mesh_render_data_ensure_vert_weight(MeshRenderData *rdata, const struct DRW_MeshWeightState *wstate)
{
- float (*vweight)[3] = rdata->vert_weight_color;
+ float (*vweight) = rdata->vert_weight;
if (vweight == NULL) {
- if (defgroup == -1) {
+ if (wstate->defgroup_active == -1) {
goto fallback;
}
@@ -1122,16 +1292,10 @@ static void mesh_render_data_ensure_vert_weight_color(MeshRenderData *rdata, con
BMVert *eve;
int i;
- vweight = rdata->vert_weight_color = MEM_mallocN(sizeof(*vweight) * rdata->vert_len, __func__);
+ vweight = rdata->vert_weight = MEM_mallocN(sizeof(*vweight) * rdata->vert_len, __func__);
BM_ITER_MESH_INDEX(eve, &viter, bm, BM_VERT, i) {
const MDeformVert *dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
- float weight = defvert_find_weight(dvert, defgroup);
- if (U.flag & USER_CUSTOM_RANGE) {
- BKE_colorband_evaluate(&U.coba_weight, weight, vweight[i]);
- }
- else {
- rgb_from_weight(vweight[i], weight);
- }
+ vweight[i] = evaluate_vertex_weight(dvert, wstate);
}
}
else {
@@ -1139,28 +1303,26 @@ static void mesh_render_data_ensure_vert_weight_color(MeshRenderData *rdata, con
goto fallback;
}
- vweight = rdata->vert_weight_color = MEM_mallocN(sizeof(*vweight) * rdata->vert_len, __func__);
+ vweight = rdata->vert_weight = MEM_mallocN(sizeof(*vweight) * rdata->vert_len, __func__);
for (int i = 0; i < rdata->vert_len; i++) {
- float weight = defvert_find_weight(&rdata->dvert[i], defgroup);
- if (U.flag & USER_CUSTOM_RANGE) {
- BKE_colorband_evaluate(&U.coba_weight, weight, vweight[i]);
- }
- else {
- rgb_from_weight(vweight[i], weight);
- }
+ vweight[i] = evaluate_vertex_weight(&rdata->dvert[i], wstate);
}
}
}
return;
fallback:
- vweight = rdata->vert_weight_color = MEM_callocN(sizeof(*vweight) * rdata->vert_len, __func__);
+ vweight = rdata->vert_weight = MEM_callocN(sizeof(*vweight) * rdata->vert_len, __func__);
- for (int i = 0; i < rdata->vert_len; i++) {
- vweight[i][2] = 0.5f;
+ if ((wstate->defgroup_active < 0) && (wstate->defgroup_len > 0)) {
+ copy_vn_fl(vweight, rdata->vert_len, -2.0f);
+ }
+ else if (wstate->alert_mode != OB_DRAW_GROUPUSER_NONE) {
+ copy_vn_fl(vweight, rdata->vert_len, -1.0f);
}
}
+
/** Ensure #MeshRenderData.edge_select_bool */
static void mesh_render_data_ensure_edge_select_bool(MeshRenderData *rdata, bool use_wire)
{
@@ -1170,11 +1332,11 @@ static void mesh_render_data_ensure_edge_select_bool(MeshRenderData *rdata, bool
MEM_callocN(sizeof(*edge_select_bool) * rdata->edge_len, __func__);
for (int i = 0; i < rdata->poly_len; i++) {
- MPoly *poly = &rdata->mpoly[i];
+ const MPoly *poly = &rdata->mpoly[i];
if (poly->flag & ME_FACE_SEL) {
for (int j = 0; j < poly->totloop; j++) {
- MLoop *loop = &rdata->mloop[poly->loopstart + j];
+ const MLoop *loop = &rdata->mloop[poly->loopstart + j];
if (use_wire) {
edge_select_bool[loop->e] = true;
}
@@ -1206,8 +1368,14 @@ static bool mesh_render_data_pnors_pcenter_select_get(
if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
return false;
}
- BM_face_calc_center_mean(efa, r_center);
- copy_v3_v3(r_pnors, efa->no);
+ if (rdata->edit_data && rdata->edit_data->vertexCos) {
+ copy_v3_v3(r_center, rdata->edit_data->polyCos[poly]);
+ copy_v3_v3(r_pnors, rdata->edit_data->polyNos[poly]);
+ }
+ else {
+ BM_face_calc_center_mean(efa, r_center);
+ copy_v3_v3(r_pnors, efa->no);
+ }
*r_selected = (BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0) ? true : false;
}
else {
@@ -1223,6 +1391,40 @@ static bool mesh_render_data_pnors_pcenter_select_get(
return true;
}
+static bool mesh_render_data_pnors_pcenter_select_get_mapped(
+ MeshRenderData *rdata, const int poly,
+ float r_pnors[3], float r_center[3], bool *r_selected)
+{
+ BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOP | MR_DATATYPE_POLY));
+ const int *p_origindex = rdata->mapped.p_origindex;
+ const int p_orig = p_origindex[poly];
+ if (p_orig == ORIGINDEX_NONE) {
+ return false;
+ }
+ BMEditMesh *em = rdata->edit_bmesh;
+ const BMFace *efa = BM_face_at_index(rdata->edit_bmesh->bm, p_orig);
+ if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
+ return false;
+ }
+
+ Mesh *me_cage = em->mesh_eval_cage;
+ const MVert *mvert = me_cage->mvert;
+#if 0
+ const MEdge *medge = me_cage->medge;
+#endif
+ const MLoop *mloop = me_cage->mloop;
+ const MPoly *mpoly = me_cage->mpoly;
+
+ const MPoly *mp = mpoly + poly;
+ const MLoop *ml = mloop + mp->loopstart;
+
+ BKE_mesh_calc_poly_center(mp, ml, mvert, r_center);
+ BKE_mesh_calc_poly_normal(mp, ml, mvert, r_pnors);
+
+ *r_selected = (BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0) ? true : false;
+
+ return true;
+}
static bool mesh_render_data_edge_vcos_manifold_pnors(
MeshRenderData *rdata, const int edge_index,
@@ -1256,7 +1458,7 @@ static bool mesh_render_data_edge_vcos_manifold_pnors(
}
else {
MVert *mvert = rdata->mvert;
- MEdge *medge = rdata->medge;
+ const MEdge *medge = rdata->medge;
EdgeAdjacentPolys *eap = rdata->edges_adjacent_polys;
float (*pnors)[3] = rdata->poly_normals;
@@ -1331,27 +1533,6 @@ static bool mesh_render_data_edge_vcos_manifold_pnors(
return true;
}
-
-/* First 2 bytes are bit flags
- * 3rd is for sharp edges
- * 4rd is for creased edges */
-enum {
- VFLAG_VERTEX_ACTIVE = 1 << 0,
- VFLAG_VERTEX_SELECTED = 1 << 1,
- VFLAG_FACE_ACTIVE = 1 << 2,
- VFLAG_FACE_SELECTED = 1 << 3,
-};
-
-enum {
- VFLAG_EDGE_EXISTS = 1 << 0,
- VFLAG_EDGE_ACTIVE = 1 << 1,
- VFLAG_EDGE_SELECTED = 1 << 2,
- VFLAG_EDGE_SEAM = 1 << 3,
- VFLAG_EDGE_SHARP = 1 << 4,
- /* Beware to not go over 1 << 7
- * (see gpu_shader_edit_mesh_overlay_geom.glsl) */
-};
-
static uchar mesh_render_data_looptri_flag(MeshRenderData *rdata, const BMFace *efa)
{
uchar fflag = 0;
@@ -1362,6 +1543,15 @@ static uchar mesh_render_data_looptri_flag(MeshRenderData *rdata, const BMFace *
if (BM_elem_flag_test(efa, BM_ELEM_SELECT))
fflag |= VFLAG_FACE_SELECTED;
+#ifdef WITH_FREESTYLE
+ if (rdata->cd.offset.freestyle_face != -1) {
+ const FreestyleFace *ffa = BM_ELEM_CD_GET_VOID_P(efa, rdata->cd.offset.freestyle_face);
+ if (ffa->flag & FREESTYLE_FACE_MARK) {
+ fflag |= VFLAG_FACE_FREESTYLE;
+ }
+ }
+#endif
+
return fflag;
}
@@ -1387,7 +1577,7 @@ static void mesh_render_data_edge_flag(
if (rdata->cd.offset.crease != -1) {
float crease = BM_ELEM_CD_GET_FLOAT(eed, rdata->cd.offset.crease);
if (crease > 0) {
- eattr->crease = (char)(crease * 255.0f);
+ eattr->crease = (uchar)(crease * 255.0f);
}
}
@@ -1395,15 +1585,23 @@ static void mesh_render_data_edge_flag(
if (rdata->cd.offset.bweight != -1) {
float bweight = BM_ELEM_CD_GET_FLOAT(eed, rdata->cd.offset.bweight);
if (bweight > 0) {
- eattr->bweight = (char)(bweight * 255.0f);
+ eattr->bweight = (uchar)(bweight * 255.0f);
+ }
+ }
+
+#ifdef WITH_FREESTYLE
+ if (rdata->cd.offset.freestyle_edge != -1) {
+ const FreestyleEdge *fed = BM_ELEM_CD_GET_VOID_P(eed, rdata->cd.offset.freestyle_edge);
+ if (fed->flag & FREESTYLE_EDGE_MARK) {
+ eattr->e_flag |= VFLAG_EDGE_FREESTYLE;
}
}
+#endif
}
static uchar mesh_render_data_vertex_flag(MeshRenderData *rdata, const BMVert *eve)
{
-
- uchar vflag = 0;
+ uchar vflag = VFLAG_VERTEX_EXISTS;
/* Current vertex */
if (eve == rdata->eve_act)
@@ -1416,13 +1614,20 @@ static uchar mesh_render_data_vertex_flag(MeshRenderData *rdata, const BMVert *e
}
static void add_overlay_tri(
- MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data,
+ MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data, GPUIndexBufBuilder *elb,
const uint pos_id, const uint vnor_id, const uint lnor_id, const uint data_id,
const BMLoop **bm_looptri, const int base_vert_idx)
{
uchar fflag;
uchar vflag;
+ for (int i = 0; i < 3; ++i) {
+ if (!BM_elem_flag_test(bm_looptri[i]->v, BM_ELEM_TAG)) {
+ BM_elem_flag_enable(bm_looptri[i]->v, BM_ELEM_TAG);
+ GPU_indexbuf_add_generic_vert(elb, base_vert_idx + i);
+ }
+ }
+
if (vbo_pos) {
/* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
if (rdata->edit_data && rdata->edit_data->vertexCos) {
@@ -1452,18 +1657,109 @@ static void add_overlay_tri(
if (vbo_data) {
fflag = mesh_render_data_looptri_flag(rdata, bm_looptri[0]->f);
- uint i_prev = 1, i = 2;
- for (uint i_next = 0; i_next < 3; i_next++) {
+ for (uint i = 0; i < 3; i++) {
+ const int i_next = (i + 1) % 3;
+ const int i_prev = (i + 2) % 3;
vflag = mesh_render_data_vertex_flag(rdata, bm_looptri[i]->v);
+ /* Opposite edge to the vertex at 'i'. */
EdgeDrawAttr eattr = {0};
- if (bm_looptri[i_next] == bm_looptri[i_prev]->prev) {
+ const bool is_edge_real = (bm_looptri[i_next] == bm_looptri[i_prev]->prev);
+ if (is_edge_real) {
mesh_render_data_edge_flag(rdata, bm_looptri[i_next]->e, &eattr);
}
eattr.v_flag = fflag | vflag;
GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx + i, &eattr);
+ }
+ }
+}
+static void add_overlay_tri_mapped(
+ MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data, GPUIndexBufBuilder *elb,
+ const uint pos_id, const uint vnor_id, const uint lnor_id, const uint data_id,
+ BMFace *efa, const MLoopTri *mlt, const float poly_normal[3], const int base_vert_idx)
+{
+ BMEditMesh *embm = rdata->edit_bmesh;
+ BMesh *bm = embm->bm;
+ Mesh *me_cage = embm->mesh_eval_cage;
+
+ const MVert *mvert = me_cage->mvert;
+ const MEdge *medge = me_cage->medge;
+ const MLoop *mloop = me_cage->mloop;
+#if 0
+ const MPoly *mpoly = me_cage->mpoly;
+#endif
+
+ const int *v_origindex = rdata->mapped.v_origindex;
+ const int *e_origindex = rdata->mapped.e_origindex;
+#if 0
+ const int *l_origindex = rdata->mapped.l_origindex;
+ const int *p_origindex = rdata->mapped.p_origindex;
+#endif
+
+ uchar fflag;
+ uchar vflag;
- i_prev = i;
- i = i_next;
+ if (elb) {
+ for (int i = 0; i < 3; ++i) {
+ const int v_orig = v_origindex[mloop[mlt->tri[i]].v];
+ if (v_orig == ORIGINDEX_NONE) {
+ continue;
+ }
+ BMVert *v = BM_vert_at_index(bm, v_orig);
+ if (!BM_elem_flag_test(v, BM_ELEM_TAG)) {
+ BM_elem_flag_enable(v, BM_ELEM_TAG);
+ GPU_indexbuf_add_generic_vert(elb, base_vert_idx + i);
+ }
+ }
+ }
+
+ if (vbo_pos) {
+ for (uint i = 0; i < 3; i++) {
+ const float *pos = mvert[mloop[mlt->tri[i]].v].co;
+ GPU_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+ }
+ }
+
+ if (vbo_nor) {
+ /* TODO real loop normal */
+ GPUPackedNormal lnor = GPU_normal_convert_i10_v3(poly_normal);
+ for (uint i = 0; i < 3; i++) {
+ GPUPackedNormal vnor = GPU_normal_convert_i10_s3(mvert[mloop[mlt->tri[i]].v].no);
+ GPU_vertbuf_attr_set(vbo_nor, vnor_id, base_vert_idx + i, &vnor);
+ GPU_vertbuf_attr_set(vbo_nor, lnor_id, base_vert_idx + i, &lnor);
+ }
+ }
+
+ if (vbo_data) {
+ fflag = mesh_render_data_looptri_flag(rdata, efa);
+ for (uint i = 0; i < 3; i++) {
+ const int i_next = (i + 1) % 3;
+ const int i_prev = (i + 2) % 3;
+ const int v_orig = v_origindex[mloop[mlt->tri[i]].v];
+ if (v_orig != ORIGINDEX_NONE) {
+ BMVert *v = BM_vert_at_index(bm, v_orig);
+ vflag = mesh_render_data_vertex_flag(rdata, v);
+ }
+ else {
+ /* Importantly VFLAG_VERTEX_EXISTS is not set. */
+ vflag = 0;
+ }
+ /* Opposite edge to the vertex at 'i'. */
+ EdgeDrawAttr eattr = {0};
+ const int e_idx = mloop[mlt->tri[i_next]].e;
+ const int e_orig = e_origindex[e_idx];
+ if (e_orig != ORIGINDEX_NONE) {
+ const MEdge *ed = &medge[e_idx];
+ const uint tri_edge[2] = {mloop[mlt->tri[i_prev]].v, mloop[mlt->tri[i_next]].v};
+ const bool is_edge_real = (
+ ((ed->v1 == tri_edge[0]) && (ed->v2 == tri_edge[1])) ||
+ ((ed->v1 == tri_edge[1]) && (ed->v2 == tri_edge[0])));
+ if (is_edge_real) {
+ BMEdge *eed = BM_edge_at_index(bm, e_orig);
+ mesh_render_data_edge_flag(rdata, eed, &eattr);
+ }
+ }
+ eattr.v_flag = fflag | vflag;
+ GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx + i, &eattr);
}
}
}
@@ -1483,7 +1779,7 @@ static void add_overlay_loose_edge(
}
}
else {
- for (int i = 0; i < 2; ++i) {
+ for (int i = 0; i < 2; i++) {
const float *pos = (&eed->v1)[i]->co;
GPU_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
}
@@ -1491,7 +1787,7 @@ static void add_overlay_loose_edge(
}
if (vbo_nor) {
- for (int i = 0; i < 2; ++i) {
+ for (int i = 0; i < 2; i++) {
GPUPackedNormal vnor = GPU_normal_convert_i10_v3((&eed->v1)[i]->no);
GPU_vertbuf_attr_set(vbo_nor, vnor_id, base_vert_idx + i, &vnor);
}
@@ -1500,12 +1796,42 @@ static void add_overlay_loose_edge(
if (vbo_data) {
EdgeDrawAttr eattr = {0};
mesh_render_data_edge_flag(rdata, eed, &eattr);
- for (int i = 0; i < 2; ++i) {
+ for (int i = 0; i < 2; i++) {
eattr.v_flag = mesh_render_data_vertex_flag(rdata, (&eed->v1)[i]);
GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx + i, &eattr);
}
}
}
+static void add_overlay_loose_edge_mapped(
+ MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data,
+ const uint pos_id, const uint vnor_id, const uint data_id,
+ BMEdge *eed, const MVert *mvert, const MEdge *ed, const int base_vert_idx)
+{
+ if (vbo_pos) {
+ /* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
+ for (int i = 0; i < 2; i++) {
+ const float *pos = mvert[*(&ed->v1 + i)].co;
+ GPU_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+ }
+ }
+
+ if (vbo_nor) {
+ for (int i = 0; i < 2; i++) {
+ GPUPackedNormal vnor = GPU_normal_convert_i10_s3(mvert[*(&ed->v1 + i)].no);
+ GPU_vertbuf_attr_set(vbo_nor, vnor_id, base_vert_idx + i, &vnor);
+ }
+ }
+
+ if (vbo_data) {
+ EdgeDrawAttr eattr = {0};
+ mesh_render_data_edge_flag(rdata, eed, &eattr);
+ for (int i = 0; i < 2; i++) {
+ const int v_orig = rdata->mapped.v_origindex[*(&ed->v1 + i)];
+ eattr.v_flag = (v_orig != ORIGINDEX_NONE) ? mesh_render_data_vertex_flag(rdata, (&eed->v1)[i]) : 0;
+ GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx + i, &eattr);
+ }
+ }
+}
static void add_overlay_loose_vert(
MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data,
@@ -1536,9 +1862,71 @@ static void add_overlay_loose_vert(
GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx, vflag);
}
}
+static void add_overlay_loose_vert_mapped(
+ MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data,
+ const uint pos_id, const uint vnor_id, const uint data_id,
+ const BMVert *eve, const MVert *mv, const int base_vert_idx)
+{
+ if (vbo_pos) {
+ const float *pos = mv->co;
+ GPU_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx, pos);
+ }
+
+ if (vbo_nor) {
+ GPUPackedNormal vnor = GPU_normal_convert_i10_s3(mv->no);
+ GPU_vertbuf_attr_set(vbo_nor, vnor_id, base_vert_idx, &vnor);
+ }
+
+ if (vbo_data) {
+ uchar vflag[4] = {0, 0, 0, 0};
+ vflag[0] = mesh_render_data_vertex_flag(rdata, eve);
+ GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx, vflag);
+ }
+}
/** \} */
+/* ---------------------------------------------------------------------- */
+
+/** \name Vertex Group Selection
+ * \{ */
+
+/** Reset the selection structure, deallocating heap memory as appropriate. */
+void DRW_mesh_weight_state_clear(struct DRW_MeshWeightState *wstate)
+{
+ MEM_SAFE_FREE(wstate->defgroup_sel);
+
+ memset(wstate, 0, sizeof(*wstate));
+
+ wstate->defgroup_active = -1;
+}
+
+/** Copy selection data from one structure to another, including heap memory. */
+void DRW_mesh_weight_state_copy(struct DRW_MeshWeightState *wstate_dst, const struct DRW_MeshWeightState *wstate_src)
+{
+ MEM_SAFE_FREE(wstate_dst->defgroup_sel);
+
+ memcpy(wstate_dst, wstate_src, sizeof(*wstate_dst));
+
+ if (wstate_src->defgroup_sel) {
+ wstate_dst->defgroup_sel = MEM_dupallocN(wstate_src->defgroup_sel);
+ }
+}
+
+/** Compare two selection structures. */
+bool DRW_mesh_weight_state_compare(const struct DRW_MeshWeightState *a, const struct DRW_MeshWeightState *b)
+{
+ return a->defgroup_active == b->defgroup_active &&
+ a->defgroup_len == b->defgroup_len &&
+ a->flags == b->flags &&
+ a->alert_mode == b->alert_mode &&
+ a->defgroup_sel_count == b->defgroup_sel_count &&
+ ((!a->defgroup_sel && !b->defgroup_sel) ||
+ (a->defgroup_sel && b->defgroup_sel &&
+ memcmp(a->defgroup_sel, b->defgroup_sel, a->defgroup_len * sizeof(bool)) == 0));
+}
+
+/** \} */
/* ---------------------------------------------------------------------- */
@@ -1613,6 +2001,8 @@ typedef struct MeshBatchCache {
GPUVertBuf *ed_tri_pos;
GPUVertBuf *ed_tri_nor; /* LoopNor, VertNor */
GPUVertBuf *ed_tri_data;
+ GPUTexture *ed_tri_data_tx;
+ GPUIndexBuf *ed_tri_verts;
GPUVertBuf *ed_ledge_pos;
GPUVertBuf *ed_ledge_nor; /* VertNor */
@@ -1624,6 +2014,7 @@ typedef struct MeshBatchCache {
GPUBatch *overlay_triangles;
GPUBatch *overlay_triangles_nor; /* GPU_PRIM_POINTS */
+ GPUBatch *overlay_triangles_lnor; /* GPU_PRIM_POINTS */
GPUBatch *overlay_loose_edges;
GPUBatch *overlay_loose_edges_nor; /* GPU_PRIM_POINTS */
GPUBatch *overlay_loose_verts;
@@ -1633,6 +2024,26 @@ typedef struct MeshBatchCache {
GPUBatch *overlay_weight_verts;
GPUBatch *overlay_paint_edges;
+ /* 2D/UV edit */
+ GPUVertBuf *edituv_pos;
+ GPUVertBuf *edituv_area;
+ GPUVertBuf *edituv_angle;
+ GPUVertBuf *edituv_data;
+
+ GPUIndexBuf *edituv_visible_faces;
+ GPUIndexBuf *edituv_visible_edges;
+
+ GPUBatch *texpaint_uv_loops;
+
+ GPUBatch *edituv_faces_strech_area;
+ GPUBatch *edituv_faces_strech_angle;
+ GPUBatch *edituv_faces;
+ GPUBatch *edituv_edges;
+ GPUBatch *edituv_verts;
+ GPUBatch *edituv_facedots;
+
+ char edituv_state;
+
/* arrays of bool uniform names (and value) that will be use to
* set srgb conversion for auto attribs.*/
char *auto_layer_names;
@@ -1649,6 +2060,8 @@ typedef struct MeshBatchCache {
int mat_len;
bool is_editmode;
+ struct DRW_MeshWeightState weight_state;
+
/* XXX, only keep for as long as sculpt mode uses shaded drawing. */
bool is_sculpt_points_tag;
@@ -1723,6 +2136,8 @@ static void mesh_batch_cache_init(Mesh *me)
cache->is_maybe_dirty = false;
cache->is_dirty = false;
+
+ DRW_mesh_weight_state_clear(&cache->weight_state);
}
static MeshBatchCache *mesh_batch_cache_get(Mesh *me)
@@ -1734,6 +2149,85 @@ static MeshBatchCache *mesh_batch_cache_get(Mesh *me)
return me->runtime.batch_cache;
}
+static void mesh_batch_cache_check_vertex_group(MeshBatchCache *cache, const struct DRW_MeshWeightState *wstate)
+{
+ if (!DRW_mesh_weight_state_compare(&cache->weight_state, wstate)) {
+ GPU_BATCH_DISCARD_SAFE(cache->triangles_with_weights);
+
+ DRW_mesh_weight_state_clear(&cache->weight_state);
+ }
+}
+
+static void mesh_batch_cache_discard_shaded_tri(MeshBatchCache *cache)
+{
+ GPU_VERTBUF_DISCARD_SAFE(cache->shaded_triangles_data);
+ if (cache->shaded_triangles_in_order) {
+ for (int i = 0; i < cache->mat_len; i++) {
+ GPU_INDEXBUF_DISCARD_SAFE(cache->shaded_triangles_in_order[i]);
+ }
+ }
+ if (cache->shaded_triangles) {
+ for (int i = 0; i < cache->mat_len; i++) {
+ GPU_BATCH_DISCARD_SAFE(cache->shaded_triangles[i]);
+ }
+ }
+ if (cache->texpaint_triangles) {
+ for (int i = 0; i < cache->mat_len; i++) {
+ /* They use shaded_triangles_in_order */
+ GPU_BATCH_DISCARD_SAFE(cache->texpaint_triangles[i]);
+ }
+ }
+ MEM_SAFE_FREE(cache->shaded_triangles_in_order);
+ MEM_SAFE_FREE(cache->shaded_triangles);
+ MEM_SAFE_FREE(cache->texpaint_triangles);
+
+ MEM_SAFE_FREE(cache->auto_layer_names);
+ MEM_SAFE_FREE(cache->auto_layer_is_srgb);
+}
+
+static void mesh_batch_cache_discard_uvedit(MeshBatchCache *cache)
+{
+ GPU_VERTBUF_DISCARD_SAFE(cache->edituv_pos);
+ GPU_VERTBUF_DISCARD_SAFE(cache->edituv_area);
+ GPU_VERTBUF_DISCARD_SAFE(cache->edituv_angle);
+ GPU_VERTBUF_DISCARD_SAFE(cache->edituv_data);
+
+ GPU_INDEXBUF_DISCARD_SAFE(cache->edituv_visible_faces);
+ GPU_INDEXBUF_DISCARD_SAFE(cache->edituv_visible_edges);
+
+ if (cache->edituv_faces_strech_area) {
+ gpu_batch_presets_unregister(cache->edituv_faces_strech_area);
+ }
+ if (cache->edituv_faces_strech_angle) {
+ gpu_batch_presets_unregister(cache->edituv_faces_strech_angle);
+ }
+ if (cache->edituv_faces) {
+ gpu_batch_presets_unregister(cache->edituv_faces);
+ }
+ if (cache->edituv_edges) {
+ gpu_batch_presets_unregister(cache->edituv_edges);
+ }
+ if (cache->edituv_verts) {
+ gpu_batch_presets_unregister(cache->edituv_verts);
+ }
+ if (cache->edituv_facedots) {
+ gpu_batch_presets_unregister(cache->edituv_facedots);
+ }
+
+ GPU_BATCH_DISCARD_SAFE(cache->edituv_faces_strech_area);
+ GPU_BATCH_DISCARD_SAFE(cache->edituv_faces_strech_angle);
+ GPU_BATCH_DISCARD_SAFE(cache->edituv_faces);
+ GPU_BATCH_DISCARD_SAFE(cache->edituv_edges);
+ GPU_BATCH_DISCARD_SAFE(cache->edituv_verts);
+ GPU_BATCH_DISCARD_SAFE(cache->edituv_facedots);
+
+ gpu_batch_presets_unregister(cache->texpaint_uv_loops);
+
+ GPU_BATCH_DISCARD_SAFE(cache->texpaint_uv_loops);
+
+ cache->edituv_state = 0;
+}
+
void DRW_mesh_batch_cache_dirty_tag(Mesh *me, int mode)
{
MeshBatchCache *cache = me->runtime.batch_cache;
@@ -1751,27 +2245,40 @@ void DRW_mesh_batch_cache_dirty_tag(Mesh *me, int mode)
GPU_VERTBUF_DISCARD_SAFE(cache->ed_fcenter_pos_with_nor_and_sel); /* Contains select flag */
GPU_VERTBUF_DISCARD_SAFE(cache->ed_edge_pos);
GPU_VERTBUF_DISCARD_SAFE(cache->ed_vert_pos);
+ GPU_INDEXBUF_DISCARD_SAFE(cache->ed_tri_verts);
+ DRW_TEXTURE_FREE_SAFE(cache->ed_tri_data_tx);
GPU_BATCH_DISCARD_SAFE(cache->overlay_triangles);
GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_verts);
GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_edges);
GPU_BATCH_DISCARD_SAFE(cache->overlay_facedots);
+ GPU_BATCH_DISCARD_SAFE(cache->overlay_triangles_nor);
+ GPU_BATCH_DISCARD_SAFE(cache->overlay_triangles_lnor);
+ GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_edges_nor);
/* Edit mode selection. */
GPU_BATCH_DISCARD_SAFE(cache->facedot_with_select_id);
GPU_BATCH_DISCARD_SAFE(cache->edges_with_select_id);
GPU_BATCH_DISCARD_SAFE(cache->verts_with_select_id);
+ /* Because visible UVs depends on edit mode selection, discard everything. */
+ mesh_batch_cache_discard_uvedit(cache);
break;
case BKE_MESH_BATCH_DIRTY_ALL:
cache->is_dirty = true;
break;
case BKE_MESH_BATCH_DIRTY_SHADING:
- /* TODO: This should only update UV and tangent data,
- * and not free the entire cache. */
- cache->is_dirty = true;
+ mesh_batch_cache_discard_shaded_tri(cache);
+ mesh_batch_cache_discard_uvedit(cache);
break;
case BKE_MESH_BATCH_DIRTY_SCULPT_COORDS:
cache->is_sculpt_points_tag = true;
break;
+ case BKE_MESH_BATCH_DIRTY_UVEDIT_ALL:
+ mesh_batch_cache_discard_uvedit(cache);
+ break;
+ case BKE_MESH_BATCH_DIRTY_UVEDIT_SELECT:
+ /* For now same as above. */
+ mesh_batch_cache_discard_uvedit(cache);
+ break;
default:
BLI_assert(0);
}
@@ -1798,13 +2305,13 @@ static void mesh_batch_cache_clear_selective(Mesh *me, GPUVertBuf *vert)
GPU_BATCH_DISCARD_SAFE(cache->points_with_normals);
GPU_BATCH_DISCARD_SAFE(cache->ledges_with_normals);
if (cache->shaded_triangles) {
- for (int i = 0; i < cache->mat_len; ++i) {
+ for (int i = 0; i < cache->mat_len; i++) {
GPU_BATCH_DISCARD_SAFE(cache->shaded_triangles[i]);
}
}
MEM_SAFE_FREE(cache->shaded_triangles);
if (cache->texpaint_triangles) {
- for (int i = 0; i < cache->mat_len; ++i) {
+ for (int i = 0; i < cache->mat_len; i++) {
GPU_BATCH_DISCARD_SAFE(cache->texpaint_triangles[i]);
}
}
@@ -1844,11 +2351,14 @@ static void mesh_batch_cache_clear(Mesh *me)
GPU_VERTBUF_DISCARD_SAFE(cache->ed_lvert_pos);
GPU_VERTBUF_DISCARD_SAFE(cache->ed_lvert_nor);
GPU_VERTBUF_DISCARD_SAFE(cache->ed_lvert_data);
+ GPU_INDEXBUF_DISCARD_SAFE(cache->ed_tri_verts);
GPU_BATCH_DISCARD_SAFE(cache->overlay_triangles);
GPU_BATCH_DISCARD_SAFE(cache->overlay_triangles_nor);
+ GPU_BATCH_DISCARD_SAFE(cache->overlay_triangles_lnor);
GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_verts);
GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_edges);
GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_edges_nor);
+ DRW_TEXTURE_FREE_SAFE(cache->ed_tri_data_tx);
GPU_BATCH_DISCARD_SAFE(cache->overlay_weight_faces);
GPU_BATCH_DISCARD_SAFE(cache->overlay_weight_verts);
@@ -1879,26 +2389,12 @@ static void mesh_batch_cache_clear(Mesh *me)
GPU_VERTBUF_DISCARD_SAFE(cache->edges_face_overlay);
DRW_TEXTURE_FREE_SAFE(cache->edges_face_overlay_tx);
- GPU_VERTBUF_DISCARD_SAFE(cache->shaded_triangles_data);
- if (cache->shaded_triangles_in_order) {
- for (int i = 0; i < cache->mat_len; ++i) {
- GPU_INDEXBUF_DISCARD_SAFE(cache->shaded_triangles_in_order[i]);
- }
- }
- if (cache->shaded_triangles) {
- for (int i = 0; i < cache->mat_len; ++i) {
- GPU_BATCH_DISCARD_SAFE(cache->shaded_triangles[i]);
- }
- }
+ mesh_batch_cache_discard_shaded_tri(cache);
- MEM_SAFE_FREE(cache->shaded_triangles_in_order);
- MEM_SAFE_FREE(cache->shaded_triangles);
-
- MEM_SAFE_FREE(cache->auto_layer_names);
- MEM_SAFE_FREE(cache->auto_layer_is_srgb);
+ mesh_batch_cache_discard_uvedit(cache);
if (cache->texpaint_triangles) {
- for (int i = 0; i < cache->mat_len; ++i) {
+ for (int i = 0; i < cache->mat_len; i++) {
GPU_BATCH_DISCARD_SAFE(cache->texpaint_triangles[i]);
}
}
@@ -1906,6 +2402,7 @@ static void mesh_batch_cache_clear(Mesh *me)
GPU_BATCH_DISCARD_SAFE(cache->texpaint_triangles_single);
+ DRW_mesh_weight_state_clear(&cache->weight_state);
}
void DRW_mesh_batch_cache_free(Mesh *me)
@@ -1926,6 +2423,7 @@ static GPUVertBuf *mesh_batch_cache_get_tri_shading_data(MeshRenderData *rdata,
const uint tangent_len = rdata->cd.layers.tangent_len;
const uint vcol_len = rdata->cd.layers.vcol_len;
const uint layers_combined_len = uv_len + vcol_len + tangent_len;
+ cache->auto_layer_len = 0;
if (layers_combined_len == 0) {
return NULL;
@@ -1950,7 +2448,6 @@ static GPUVertBuf *mesh_batch_cache_get_tri_shading_data(MeshRenderData *rdata,
uint auto_names_len = 0;
uint auto_ofs = 0;
uint auto_id = 0;
- cache->auto_layer_len = 0;
for (uint i = 0; i < uv_len; i++) {
const char *attrib_name = mesh_render_data_uv_auto_layer_uuid_get(rdata, i);
auto_names_len += strlen(attrib_name) + 2; /* include null terminator and b prefix. */
@@ -2230,7 +2727,7 @@ static GPUVertBuf *mesh_batch_cache_get_tri_pos_and_normals_ex(
attr_id.nor = GPU_vertformat_attr_add(&format, "nor", GPU_COMP_I10, 3, GPU_FETCH_INT_TO_FLOAT_UNIT);
}
- const int tri_len = mesh_render_data_looptri_len_get(rdata);
+ const int tri_len = mesh_render_data_looptri_len_get_maybe_mapped(rdata);
GPUVertBuf *vbo = *r_vbo = GPU_vertbuf_create_with_format(&format);
@@ -2242,103 +2739,170 @@ static GPUVertBuf *mesh_batch_cache_get_tri_pos_and_normals_ex(
GPU_vertbuf_attr_get_raw_data(vbo, attr_id.pos, &pos_step);
GPU_vertbuf_attr_get_raw_data(vbo, attr_id.nor, &nor_step);
- float (*lnors)[3] = rdata->loop_normals;
-
- if (rdata->edit_bmesh) {
- GPUPackedNormal *pnors_pack, *vnors_pack;
+ if (rdata->mapped.use == false) {
+ float (*lnors)[3] = rdata->loop_normals;
+ if (rdata->edit_bmesh) {
+ GPUPackedNormal *pnors_pack, *vnors_pack;
- if (lnors == NULL) {
- mesh_render_data_ensure_poly_normals_pack(rdata);
- mesh_render_data_ensure_vert_normals_pack(rdata);
+ if (lnors == NULL) {
+ mesh_render_data_ensure_poly_normals_pack(rdata);
+ mesh_render_data_ensure_vert_normals_pack(rdata);
- pnors_pack = rdata->poly_normals_pack;
- vnors_pack = rdata->vert_normals_pack;
- }
+ pnors_pack = rdata->poly_normals_pack;
+ vnors_pack = rdata->vert_normals_pack;
+ }
- for (int i = 0; i < tri_len; i++) {
- const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
- const BMFace *bm_face = bm_looptri[0]->f;
+ for (int i = 0; i < tri_len; i++) {
+ const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
+ const BMFace *bm_face = bm_looptri[0]->f;
- /* use_hide always for edit-mode */
- if (BM_elem_flag_test(bm_face, BM_ELEM_HIDDEN)) {
- continue;
- }
+ /* use_hide always for edit-mode */
+ if (BM_elem_flag_test(bm_face, BM_ELEM_HIDDEN)) {
+ continue;
+ }
- if (lnors) {
- for (uint t = 0; t < 3; t++) {
- const float *nor = lnors[BM_elem_index_get(bm_looptri[t])];
- *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor);
+ if (lnors) {
+ for (uint t = 0; t < 3; t++) {
+ const float *nor = lnors[BM_elem_index_get(bm_looptri[t])];
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor);
+ }
}
- }
- else if (BM_elem_flag_test(bm_face, BM_ELEM_SMOOTH)) {
- for (uint t = 0; t < 3; t++) {
- *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = vnors_pack[BM_elem_index_get(bm_looptri[t]->v)];
+ else if (BM_elem_flag_test(bm_face, BM_ELEM_SMOOTH)) {
+ for (uint t = 0; t < 3; t++) {
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = vnors_pack[BM_elem_index_get(bm_looptri[t]->v)];
+ }
}
- }
- else {
- const GPUPackedNormal *snor_pack = &pnors_pack[BM_elem_index_get(bm_face)];
- for (uint t = 0; t < 3; t++) {
- *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *snor_pack;
+ else {
+ const GPUPackedNormal *snor_pack = &pnors_pack[BM_elem_index_get(bm_face)];
+ for (uint t = 0; t < 3; t++) {
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *snor_pack;
+ }
}
- }
- /* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
- if (rdata->edit_data && rdata->edit_data->vertexCos) {
- for (uint t = 0; t < 3; t++) {
- int vidx = BM_elem_index_get(bm_looptri[t]->v);
- const float *pos = rdata->edit_data->vertexCos[vidx];
- copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), pos);
+ /* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
+ if (rdata->edit_data && rdata->edit_data->vertexCos) {
+ for (uint t = 0; t < 3; t++) {
+ int vidx = BM_elem_index_get(bm_looptri[t]->v);
+ const float *pos = rdata->edit_data->vertexCos[vidx];
+ copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), pos);
+ }
}
- }
- else {
- for (uint t = 0; t < 3; t++) {
- copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), bm_looptri[t]->v->co);
+ else {
+ for (uint t = 0; t < 3; t++) {
+ copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), bm_looptri[t]->v->co);
+ }
}
}
}
- }
- else {
- if (lnors == NULL) {
- /* Use normals from vertex. */
- mesh_render_data_ensure_poly_normals_pack(rdata);
- }
+ else {
+ if (lnors == NULL) {
+ /* Use normals from vertex. */
+ mesh_render_data_ensure_poly_normals_pack(rdata);
+ }
- for (int i = 0; i < tri_len; i++) {
- const MLoopTri *mlt = &rdata->mlooptri[i];
- const MPoly *mp = &rdata->mpoly[mlt->poly];
+ for (int i = 0; i < tri_len; i++) {
+ const MLoopTri *mlt = &rdata->mlooptri[i];
+ const MPoly *mp = &rdata->mpoly[mlt->poly];
- if (use_hide && (mp->flag & ME_HIDE)) {
- continue;
- }
+ if (use_hide && (mp->flag & ME_HIDE)) {
+ continue;
+ }
- const uint vtri[3] = {
- rdata->mloop[mlt->tri[0]].v,
- rdata->mloop[mlt->tri[1]].v,
- rdata->mloop[mlt->tri[2]].v,
- };
+ const uint vtri[3] = {
+ rdata->mloop[mlt->tri[0]].v,
+ rdata->mloop[mlt->tri[1]].v,
+ rdata->mloop[mlt->tri[2]].v,
+ };
- if (lnors) {
- for (uint t = 0; t < 3; t++) {
- const float *nor = lnors[mlt->tri[t]];
- *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor);
+ if (lnors) {
+ for (uint t = 0; t < 3; t++) {
+ const float *nor = lnors[mlt->tri[t]];
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor);
+ }
}
- }
- else if (mp->flag & ME_SMOOTH) {
- for (uint t = 0; t < 3; t++) {
- const MVert *mv = &rdata->mvert[vtri[t]];
- *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_s3(mv->no);
+ else if (mp->flag & ME_SMOOTH) {
+ for (uint t = 0; t < 3; t++) {
+ const MVert *mv = &rdata->mvert[vtri[t]];
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_s3(mv->no);
+ }
}
- }
- else {
- const GPUPackedNormal *pnors_pack = &rdata->poly_normals_pack[mlt->poly];
+ else {
+ const GPUPackedNormal *pnors_pack = &rdata->poly_normals_pack[mlt->poly];
+ for (uint t = 0; t < 3; t++) {
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *pnors_pack;
+ }
+ }
+
for (uint t = 0; t < 3; t++) {
- *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *pnors_pack;
+ const MVert *mv = &rdata->mvert[vtri[t]];
+ copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mv->co);
}
}
+ }
+ }
+ else {
+ /* Note: mapped doesn't support lnors yet. */
+ BMesh *bm = rdata->edit_bmesh->bm;
+ Mesh *me_cage = rdata->mapped.me_cage;
+
+ /* TODO(campbell): unlike non-mapped modes we don't generate these on demand, just use if they exist.
+ * this seems like a low priority TODO since mapped meshes typically
+ * use the final mesh evaluated mesh for showing faces. */
+ const float (*lnors)[3] = CustomData_get_layer(&me_cage->ldata, CD_NORMAL);
+
+ /* TODO(campbell): this is quite an expensive operation for something
+ * that's not used unless 'normal' display option is enabled. */
+ if (!CustomData_has_layer(&me_cage->pdata, CD_NORMAL)) {
+ /* TODO(campbell): this is quite an expensive operation for something
+ * that's not used unless 'normal' display option is enabled. */
+ BKE_mesh_ensure_normals_for_display(me_cage);
+ }
+ const float (*polynors)[3] = CustomData_get_layer(&me_cage->pdata, CD_NORMAL);
- for (uint t = 0; t < 3; t++) {
- const MVert *mv = &rdata->mvert[vtri[t]];
- copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mv->co);
+ const MVert *mvert = rdata->mapped.me_cage->mvert;
+ const MLoop *mloop = rdata->mapped.me_cage->mloop;
+ const MPoly *mpoly = rdata->mapped.me_cage->mpoly;
+
+ const MLoopTri *mlooptri = BKE_mesh_runtime_looptri_ensure(me_cage);
+ for (int i = 0; i < tri_len; i++) {
+ const MLoopTri *mlt = &mlooptri[i];
+ const int p_orig = rdata->mapped.p_origindex[mlt->poly];
+ if (p_orig != ORIGINDEX_NONE) {
+ /* Assume 'use_hide' */
+ BMFace *efa = BM_face_at_index(bm, p_orig);
+ if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
+ const MPoly *mp = &mpoly[mlt->poly];
+ const uint vtri[3] = {
+ mloop[mlt->tri[0]].v,
+ mloop[mlt->tri[1]].v,
+ mloop[mlt->tri[2]].v,
+ };
+
+ if (lnors) {
+ for (uint t = 0; t < 3; t++) {
+ const float *nor = lnors[mlt->tri[t]];
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor);
+ }
+ }
+ else if (mp->flag & ME_SMOOTH) {
+ for (uint t = 0; t < 3; t++) {
+ const MVert *mv = &mvert[vtri[t]];
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_s3(mv->no);
+ }
+ }
+ else {
+ /* we don't have cached 'rdata->poly_normals_pack'. */
+ const GPUPackedNormal pnor = GPU_normal_convert_i10_v3(polynors[mlt->poly]);
+ for (uint t = 0; t < 3; t++) {
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = pnor;
+ }
+ }
+
+ for (uint t = 0; t < 3; t++) {
+ const MVert *mv = &mvert[vtri[t]];
+ copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mv->co);
+ }
+ }
}
}
}
@@ -2381,26 +2945,43 @@ static GPUVertBuf *mesh_batch_cache_get_facedot_pos_with_normals_and_flag(
attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
attr_id.data = GPU_vertformat_attr_add(&format, "norAndFlag", GPU_COMP_I10, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
}
-
- const int vbo_len_capacity = mesh_render_data_polys_len_get(rdata);
+ const int vbo_len_capacity = mesh_render_data_polys_len_get_maybe_mapped(rdata);
int vidx = 0;
GPUVertBuf *vbo = cache->ed_fcenter_pos_with_nor_and_sel = GPU_vertbuf_create_with_format(&format);
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- for (int i = 0; i < vbo_len_capacity; ++i) {
- float pcenter[3], pnor[3];
- bool selected = false;
-
- if (mesh_render_data_pnors_pcenter_select_get(rdata, i, pnor, pcenter, &selected)) {
- GPUPackedNormal nor = { .x = 0, .y = 0, .z = -511 };
- nor = GPU_normal_convert_i10_v3(pnor);
- nor.w = selected ? 1 : 0;
- GPU_vertbuf_attr_set(vbo, attr_id.data, vidx, &nor);
-
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, pcenter);
+ if (rdata->edit_bmesh) {
+ if (rdata->edit_data && rdata->edit_data->vertexCos != NULL) {
+ BKE_editmesh_cache_ensure_poly_normals(rdata->edit_bmesh, rdata->edit_data);
+ BKE_editmesh_cache_ensure_poly_centers(rdata->edit_bmesh, rdata->edit_data);
+ }
+ }
- vidx += 1;
+ if (rdata->mapped.use == false) {
+ for (int i = 0; i < vbo_len_capacity; i++) {
+ float pcenter[3], pnor[3];
+ bool selected = false;
+ if (mesh_render_data_pnors_pcenter_select_get(rdata, i, pnor, pcenter, &selected)) {
+ GPUPackedNormal nor = GPU_normal_convert_i10_v3(pnor);
+ nor.w = selected ? 1 : 0;
+ GPU_vertbuf_attr_set(vbo, attr_id.data, vidx, &nor);
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, pcenter);
+ vidx += 1;
+ }
+ }
+ }
+ else {
+ for (int i = 0; i < vbo_len_capacity; i++) {
+ float pcenter[3], pnor[3];
+ bool selected = false;
+ if (mesh_render_data_pnors_pcenter_select_get_mapped(rdata, i, pnor, pcenter, &selected)) {
+ GPUPackedNormal nor = GPU_normal_convert_i10_v3(pnor);
+ nor.w = selected ? 1 : 0;
+ GPU_vertbuf_attr_set(vbo, attr_id.data, vidx, &nor);
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, pcenter);
+ vidx += 1;
+ }
}
}
const int vbo_len_used = vidx;
@@ -2425,28 +3006,50 @@ static GPUVertBuf *mesh_batch_cache_get_edges_visible(
attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
}
- const int vbo_len_capacity = mesh_render_data_edges_len_get(rdata) * 2;
+ const int vbo_len_capacity = mesh_render_data_edges_len_get_maybe_mapped(rdata) * 2;
int vidx = 0;
GPUVertBuf *vbo = cache->ed_edge_pos = GPU_vertbuf_create_with_format(&format);
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- if (rdata->edit_bmesh) {
- BMesh *bm = rdata->edit_bmesh->bm;
- BMIter iter;
- BMEdge *eed;
- BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
- if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eed->v1->co);
- vidx += 1;
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eed->v2->co);
- vidx += 1;
+ if (rdata->mapped.use == false) {
+ if (rdata->edit_bmesh) {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ BMIter iter;
+ BMEdge *eed;
+
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eed->v1->co);
+ vidx += 1;
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eed->v2->co);
+ vidx += 1;
+ }
}
}
+ else {
+ /* not yet done! */
+ BLI_assert(0);
+ }
}
else {
- /* not yet done! */
- BLI_assert(0);
+ BMesh *bm = rdata->edit_bmesh->bm;
+ const MVert *mvert = rdata->mapped.me_cage->mvert;
+ const MEdge *medge = rdata->mapped.me_cage->medge;
+ const int *e_origindex = rdata->mapped.e_origindex;
+ for (int i = 0; i < rdata->mapped.edge_len; i++) {
+ const int e_orig = e_origindex[i];
+ if (e_orig != ORIGINDEX_NONE) {
+ BMEdge *eed = BM_edge_at_index(bm, e_orig);
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+ const MEdge *ed = &medge[i];
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, mvert[ed->v1].co);
+ vidx += 1;
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, mvert[ed->v2].co);
+ vidx += 1;
+ }
+ }
+ }
}
const int vbo_len_used = vidx;
if (vbo_len_used != vbo_len_capacity) {
@@ -2470,29 +3073,47 @@ static GPUVertBuf *mesh_batch_cache_get_verts_visible(
attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
}
- const int vbo_len_capacity = mesh_render_data_verts_len_get(rdata);
+ const int vbo_len_capacity = mesh_render_data_verts_len_get_maybe_mapped(rdata);
uint vidx = 0;
GPUVertBuf *vbo = cache->ed_vert_pos = GPU_vertbuf_create_with_format(&format);
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- if (rdata->edit_bmesh) {
- BMesh *bm = rdata->edit_bmesh->bm;
- BMIter iter;
- BMVert *eve;
+ if (rdata->mapped.use == false) {
+ if (rdata->edit_bmesh) {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ BMIter iter;
+ BMVert *eve;
- BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
- if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eve->co);
- vidx += 1;
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
+ if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eve->co);
+ vidx += 1;
+ }
+ }
+ }
+ else {
+ for (int i = 0; i < vbo_len_capacity; i++) {
+ const MVert *mv = &rdata->mvert[i];
+ if (!(mv->flag & ME_HIDE)) {
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, mv->co);
+ vidx += 1;
+ }
}
}
}
else {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ const MVert *mvert = rdata->mapped.me_cage->mvert;
+ const int *v_origindex = rdata->mapped.v_origindex;
for (int i = 0; i < vbo_len_capacity; i++) {
- const MVert *mv = &rdata->mvert[i];
- if (!(mv->flag & ME_HIDE)) {
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, mv->co);
- vidx += 1;
+ const int v_orig = v_origindex[i];
+ if (v_orig != ORIGINDEX_NONE) {
+ BMVert *eve = BM_vert_at_index(bm, v_orig);
+ if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ const MVert *mv = &mvert[i];
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, mv->co);
+ vidx += 1;
+ }
}
}
}
@@ -2568,33 +3189,54 @@ static GPUVertBuf *mesh_create_edges_select_id(
attr_id.col = GPU_vertformat_attr_add(&format, "color", GPU_COMP_I32, 1, GPU_FETCH_INT);
}
- const int vbo_len_capacity = mesh_render_data_edges_len_get(rdata) * 2;
+ const int vbo_len_capacity = mesh_render_data_edges_len_get_maybe_mapped(rdata) * 2;
int vidx = 0;
vbo = GPU_vertbuf_create_with_format(&format);
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- uint select_index = select_id_offset;
- if (rdata->edit_bmesh) {
- BMesh *bm = rdata->edit_bmesh->bm;
- BMIter iter;
- BMEdge *eed;
+ if (rdata->mapped.use == false) {
+ uint select_index = select_id_offset;
+ if (rdata->edit_bmesh) {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ BMIter iter;
+ BMEdge *eed;
- BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
- if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
- int select_id;
- GPU_select_index_get(select_index, &select_id);
- GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
- vidx += 1;
- GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
- vidx += 1;
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+ int select_id;
+ GPU_select_index_get(select_index, &select_id);
+ GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
+ vidx += 1;
+ GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
+ vidx += 1;
+ }
+ select_index += 1;
}
- select_index += 1;
+ }
+ else {
+ /* not yet done! */
+ BLI_assert(0);
}
}
else {
- /* not yet done! */
- BLI_assert(0);
+ BMesh *bm = rdata->edit_bmesh->bm;
+ const int *e_origindex = rdata->mapped.e_origindex;
+ for (int i = 0; i < rdata->mapped.edge_len; i++) {
+ const int e_orig = e_origindex[i];
+ if (e_orig != ORIGINDEX_NONE) {
+ BMEdge *eed = BM_edge_at_index(bm, e_orig);
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+ uint select_index = select_id_offset + e_orig;
+ int select_id;
+ GPU_select_index_get(select_index, &select_id);
+ GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
+ vidx += 1;
+ GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
+ vidx += 1;
+ }
+ }
+ }
}
const int vbo_len_used = vidx;
if (vbo_len_used != vbo_len_capacity) {
@@ -2618,38 +3260,57 @@ static GPUVertBuf *mesh_create_verts_select_id(
attr_id.col = GPU_vertformat_attr_add(&format, "color", GPU_COMP_I32, 1, GPU_FETCH_INT);
}
- const int vbo_len_capacity = mesh_render_data_verts_len_get(rdata);
+ const int vbo_len_capacity = mesh_render_data_verts_len_get_maybe_mapped(rdata);
int vidx = 0;
vbo = GPU_vertbuf_create_with_format(&format);
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- uint select_index = select_id_offset;
- if (rdata->edit_bmesh) {
- BMesh *bm = rdata->edit_bmesh->bm;
- BMIter iter;
- BMVert *eve;
+ if (rdata->mapped.use == false) {
+ uint select_index = select_id_offset;
+ if (rdata->edit_bmesh) {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ BMIter iter;
+ BMVert *eve;
- BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
- if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
- int select_id;
- GPU_select_index_get(select_index, &select_id);
- GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
- vidx += 1;
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
+ if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ int select_id;
+ GPU_select_index_get(select_index, &select_id);
+ GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
+ vidx += 1;
+ }
+ select_index += 1;
+ }
+ }
+ else {
+ for (int i = 0; i < vbo_len_capacity; i++) {
+ const MVert *mv = &rdata->mvert[i];
+ if (!(mv->flag & ME_HIDE)) {
+ int select_id;
+ GPU_select_index_get(select_index, &select_id);
+ GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
+ vidx += 1;
+ }
+ select_index += 1;
}
- select_index += 1;
}
}
else {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ const int *v_origindex = rdata->mapped.v_origindex;
for (int i = 0; i < vbo_len_capacity; i++) {
- const MVert *mv = &rdata->mvert[i];
- if (!(mv->flag & ME_HIDE)) {
- int select_id;
- GPU_select_index_get(select_index, &select_id);
- GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
- vidx += 1;
+ const int v_orig = v_origindex[i];
+ if (v_orig != ORIGINDEX_NONE) {
+ BMVert *eve = BM_vert_at_index(bm, v_orig);
+ if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ uint select_index = select_id_offset + v_orig;
+ int select_id;
+ GPU_select_index_get(select_index, &select_id);
+ GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
+ vidx += 1;
+ }
}
- select_index += 1;
}
}
const int vbo_len_used = vidx;
@@ -2662,7 +3323,7 @@ static GPUVertBuf *mesh_create_verts_select_id(
}
static GPUVertBuf *mesh_create_tri_weights(
- MeshRenderData *rdata, bool use_hide, int defgroup)
+ MeshRenderData *rdata, bool use_hide, const struct DRW_MeshWeightState *wstate)
{
BLI_assert(
rdata->types &
@@ -2673,9 +3334,9 @@ static GPUVertBuf *mesh_create_tri_weights(
uint cidx = 0;
static GPUVertFormat format = { 0 };
- static struct { uint col; } attr_id;
+ static struct { uint weight; } attr_id;
if (format.attr_len == 0) {
- attr_id.col = GPU_vertformat_attr_add(&format, "color", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+ attr_id.weight = GPU_vertformat_attr_add(&format, "weight", GPU_COMP_F32, 1, GPU_FETCH_FLOAT);
}
vbo = GPU_vertbuf_create_with_format(&format);
@@ -2685,8 +3346,8 @@ static GPUVertBuf *mesh_create_tri_weights(
int vbo_len_used = 0;
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- mesh_render_data_ensure_vert_weight_color(rdata, defgroup);
- const float (*vert_weight_color)[3] = rdata->vert_weight_color;
+ mesh_render_data_ensure_vert_weight(rdata, wstate);
+ const float (*vert_weight) = rdata->vert_weight;
if (rdata->edit_bmesh) {
for (int i = 0; i < tri_len; i++) {
@@ -2695,7 +3356,7 @@ static GPUVertBuf *mesh_create_tri_weights(
if (!BM_elem_flag_test(ltri[0]->f, BM_ELEM_HIDDEN)) {
for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
const int v_index = BM_elem_index_get(ltri[tri_corner]->v);
- GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, vert_weight_color[v_index]);
+ GPU_vertbuf_attr_set(vbo, attr_id.weight, cidx++, &vert_weight[v_index]);
}
}
}
@@ -2706,7 +3367,7 @@ static GPUVertBuf *mesh_create_tri_weights(
if (!(use_hide && (rdata->mpoly[mlt->poly].flag & ME_HIDE))) {
for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
const uint v_index = rdata->mloop[mlt->tri[tri_corner]].v;
- GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, vert_weight_color[v_index]);
+ GPU_vertbuf_attr_set(vbo, attr_id.weight, cidx++, &vert_weight[v_index]);
}
}
}
@@ -2798,7 +3459,7 @@ static GPUVertBuf *mesh_create_tri_select_id(
attr_id.col = GPU_vertformat_attr_add(&format, "color", GPU_COMP_I32, 1, GPU_FETCH_INT);
}
- const int tri_len = mesh_render_data_looptri_len_get(rdata);
+ const int tri_len = mesh_render_data_looptri_len_get_maybe_mapped(rdata);
vbo = GPU_vertbuf_create_with_format(&format);
@@ -2806,29 +3467,52 @@ static GPUVertBuf *mesh_create_tri_select_id(
int vbo_len_used = 0;
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- if (rdata->edit_bmesh) {
- for (int i = 0; i < tri_len; i++) {
- const BMLoop **ltri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
- /* Assume 'use_hide' */
- if (!BM_elem_flag_test(ltri[0]->f, BM_ELEM_HIDDEN)) {
- const int poly_index = BM_elem_index_get(ltri[0]->f);
- int select_id;
- GPU_select_index_get(poly_index + select_id_offset, &select_id);
- for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
- GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, &select_id);
+
+ if (rdata->mapped.use == false) {
+ if (rdata->edit_bmesh) {
+ for (int i = 0; i < tri_len; i++) {
+ const BMLoop **ltri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
+ /* Assume 'use_hide' */
+ if (!BM_elem_flag_test(ltri[0]->f, BM_ELEM_HIDDEN)) {
+ const int poly_index = BM_elem_index_get(ltri[0]->f);
+ int select_id;
+ GPU_select_index_get(poly_index + select_id_offset, &select_id);
+ for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
+ GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, &select_id);
+ }
+ }
+ }
+ }
+ else {
+ for (int i = 0; i < tri_len; i++) {
+ const MLoopTri *mlt = &rdata->mlooptri[i];
+ const int poly_index = mlt->poly;
+ if (!(use_hide && (rdata->mpoly[poly_index].flag & ME_HIDE))) {
+ int select_id;
+ GPU_select_index_get(poly_index + select_id_offset, &select_id);
+ for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
+ GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, &select_id);
+ }
}
}
}
}
else {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ Mesh *me_cage = rdata->mapped.me_cage;
+ const MLoopTri *mlooptri = BKE_mesh_runtime_looptri_ensure(me_cage);
for (int i = 0; i < tri_len; i++) {
- const MLoopTri *mlt = &rdata->mlooptri[i];
- const int poly_index = mlt->poly;
- if (!(use_hide && (rdata->mpoly[poly_index].flag & ME_HIDE))) {
- int select_id;
- GPU_select_index_get(poly_index + select_id_offset, &select_id);
- for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
- GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, &select_id);
+ const MLoopTri *mlt = &mlooptri[i];
+ const int p_orig = rdata->mapped.p_origindex[mlt->poly];
+ if (p_orig != ORIGINDEX_NONE) {
+ /* Assume 'use_hide' */
+ BMFace *efa = BM_face_at_index(bm, p_orig);
+ if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
+ int select_id;
+ GPU_select_index_get(select_id_offset + p_orig, &select_id);
+ for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
+ GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, &select_id);
+ }
}
}
}
@@ -2857,28 +3541,42 @@ static GPUVertBuf *mesh_batch_cache_get_vert_pos_and_nor_in_order(
}
GPUVertBuf *vbo = cache->pos_in_order = GPU_vertbuf_create_with_format(&format);
- const int vbo_len_capacity = mesh_render_data_verts_len_get(rdata);
+ const int vbo_len_capacity = mesh_render_data_verts_len_get_maybe_mapped(rdata);
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- if (rdata->edit_bmesh) {
- BMesh *bm = rdata->edit_bmesh->bm;
- BMIter iter;
- BMVert *eve;
- uint i;
+ if (rdata->mapped.use == false) {
+ if (rdata->edit_bmesh) {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ BMIter iter;
+ BMVert *eve;
+ uint i;
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- static short no_short[4];
- normal_float_to_short_v3(no_short, eve->no);
+ BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
+ static short no_short[4];
+ normal_float_to_short_v3(no_short, eve->no);
- GPU_vertbuf_attr_set(vbo, attr_id.pos, i, eve->co);
- GPU_vertbuf_attr_set(vbo, attr_id.nor, i, no_short);
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, i, eve->co);
+ GPU_vertbuf_attr_set(vbo, attr_id.nor, i, no_short);
+ }
+ BLI_assert(i == vbo_len_capacity);
+ }
+ else {
+ for (int i = 0; i < vbo_len_capacity; i++) {
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, i, rdata->mvert[i].co);
+ GPU_vertbuf_attr_set(vbo, attr_id.nor, i, rdata->mvert[i].no); /* XXX actually reading 4 shorts */
+ }
}
- BLI_assert(i == vbo_len_capacity);
}
else {
- for (int i = 0; i < vbo_len_capacity; ++i) {
- GPU_vertbuf_attr_set(vbo, attr_id.pos, i, rdata->mvert[i].co);
- GPU_vertbuf_attr_set(vbo, attr_id.nor, i, rdata->mvert[i].no); /* XXX actually reading 4 shorts */
+ const MVert *mvert = rdata->mapped.me_cage->mvert;
+ const int *v_origindex = rdata->mapped.v_origindex;
+ for (int i = 0; i < vbo_len_capacity; i++) {
+ const int v_orig = v_origindex[i];
+ if (v_orig != ORIGINDEX_NONE) {
+ const MVert *mv = &mvert[i];
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, i, mv->co);
+ GPU_vertbuf_attr_set(vbo, attr_id.nor, i, mv->no); /* XXX actually reading 4 shorts */
+ }
}
}
}
@@ -2933,11 +3631,14 @@ static void mesh_batch_cache_create_overlay_tri_buffers(
MeshRenderData *rdata, MeshBatchCache *cache)
{
BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI));
-
- const int tri_len = mesh_render_data_looptri_len_get(rdata);
+ BMesh *bm = rdata->edit_bmesh->bm;
+ BMIter iter;
+ BMVert *ev;
+ const int tri_len = mesh_render_data_looptri_len_get_maybe_mapped(rdata);
const int vbo_len_capacity = tri_len * 3;
int vbo_len_used = 0;
+ int points_len = bm->totvert;
/* Positions */
GPUVertBuf *vbo_pos = NULL;
@@ -2964,18 +3665,59 @@ static void mesh_batch_cache_create_overlay_tri_buffers(
GPU_vertbuf_data_alloc(vbo_data, vbo_len_capacity);
}
- for (int i = 0; i < tri_len; i++) {
- const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
- if (!BM_elem_flag_test(bm_looptri[0]->f, BM_ELEM_HIDDEN)) {
- add_overlay_tri(
- rdata, vbo_pos, vbo_nor, vbo_data,
- attr_id.pos, attr_id.vnor, attr_id.lnor, attr_id.data,
- bm_looptri, vbo_len_used);
+ /* Verts IBO */
+ GPUIndexBufBuilder elb, *elbp = NULL;
+ if (cache->ed_tri_verts == NULL) {
+ elbp = &elb;
+ GPU_indexbuf_init(elbp, GPU_PRIM_POINTS, points_len, vbo_len_capacity);
+ }
- vbo_len_used += 3;
+ /* Clear tag */
+ BM_ITER_MESH(ev, &iter, bm, BM_VERTS_OF_MESH) {
+ BM_elem_flag_disable(ev, BM_ELEM_TAG);
+ }
+
+ if (rdata->mapped.use == false) {
+ for (int i = 0; i < tri_len; i++) {
+ const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
+ if (!BM_elem_flag_test(bm_looptri[0]->f, BM_ELEM_HIDDEN)) {
+ add_overlay_tri(
+ rdata, vbo_pos, vbo_nor, vbo_data, elbp,
+ attr_id.pos, attr_id.vnor, attr_id.lnor, attr_id.data,
+ bm_looptri, vbo_len_used);
+ vbo_len_used += 3;
+ }
+ }
+ }
+ else {
+ Mesh *me_cage = rdata->mapped.me_cage;
+ const MLoopTri *mlooptri = BKE_mesh_runtime_looptri_ensure(me_cage);
+ if (!CustomData_has_layer(&me_cage->pdata, CD_NORMAL)) {
+ /* TODO(campbell): this is quite an expensive operation for something
+ * that's not used unless 'normal' display option is enabled. */
+ BKE_mesh_ensure_normals_for_display(me_cage);
+ }
+ const float (*polynors)[3] = CustomData_get_layer(&me_cage->pdata, CD_NORMAL);
+ for (int i = 0; i < tri_len; i++) {
+ const MLoopTri *mlt = &mlooptri[i];
+ const int p_orig = rdata->mapped.p_origindex[mlt->poly];
+ if (p_orig != ORIGINDEX_NONE) {
+ BMFace *efa = BM_face_at_index(bm, p_orig);
+ if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
+ add_overlay_tri_mapped(
+ rdata, vbo_pos, vbo_nor, vbo_data, elbp,
+ attr_id.pos, attr_id.vnor, attr_id.lnor, attr_id.data,
+ efa, mlt, polynors[mlt->poly], vbo_len_used);
+ vbo_len_used += 3;
+ }
+ }
}
}
+ if (elbp != NULL) {
+ cache->ed_tri_verts = GPU_indexbuf_build(elbp);
+ }
+
/* Finish */
if (vbo_len_used != vbo_len_capacity) {
if (vbo_pos != NULL) {
@@ -2988,6 +3730,10 @@ static void mesh_batch_cache_create_overlay_tri_buffers(
GPU_vertbuf_data_resize(vbo_data, vbo_len_used);
}
}
+
+ /* Upload data early because we need to create the texture for it. */
+ GPU_vertbuf_use(vbo_data);
+ cache->ed_tri_data_tx = GPU_texture_create_from_vertbuf(vbo_data);
}
static void mesh_batch_cache_create_overlay_ledge_buffers(
@@ -2995,7 +3741,7 @@ static void mesh_batch_cache_create_overlay_ledge_buffers(
{
BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI));
- const int ledge_len = mesh_render_data_loose_edges_len_get(rdata);
+ const int ledge_len = mesh_render_data_loose_edges_len_get_maybe_mapped(rdata);
const int vbo_len_capacity = ledge_len * 2;
int vbo_len_used = 0;
@@ -3025,11 +3771,11 @@ static void mesh_batch_cache_create_overlay_ledge_buffers(
GPU_vertbuf_data_alloc(vbo_data, vbo_len_capacity);
}
- if (rdata->edit_bmesh) {
- BMesh *bm = rdata->edit_bmesh->bm;
- for (uint i = 0; i < ledge_len; i++) {
- const BMEdge *eed = BM_edge_at_index(bm, rdata->loose_edges[i]);
- if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+ if (rdata->mapped.use == false) {
+ if (rdata->edit_bmesh) {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ for (uint i = 0; i < ledge_len; i++) {
+ const BMEdge *eed = BM_edge_at_index(bm, rdata->loose_edges[i]);
add_overlay_loose_edge(
rdata, vbo_pos, vbo_nor, vbo_data,
attr_id.pos, attr_id.vnor, attr_id.data,
@@ -3038,6 +3784,24 @@ static void mesh_batch_cache_create_overlay_ledge_buffers(
}
}
}
+ else {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ Mesh *me_cage = rdata->mapped.me_cage;
+ const MVert *mvert = me_cage->mvert;
+ const MEdge *medge = me_cage->medge;
+ const int *e_origindex = rdata->mapped.e_origindex;
+ for (uint i_iter = 0; i_iter < ledge_len; i_iter++) {
+ const int i = rdata->mapped.loose_edges[i_iter];
+ const int e_orig = e_origindex[i];
+ const MEdge *ed = &medge[i];
+ BMEdge *eed = BM_edge_at_index(bm, e_orig);
+ add_overlay_loose_edge_mapped(
+ rdata, vbo_pos, vbo_nor, vbo_data,
+ attr_id.pos, attr_id.vnor, attr_id.data,
+ eed, mvert, ed, vbo_len_used);
+ vbo_len_used += 2;
+ }
+ }
/* Finish */
if (vbo_len_used != vbo_len_capacity) {
@@ -3059,7 +3823,7 @@ static void mesh_batch_cache_create_overlay_lvert_buffers(
BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI));
BMesh *bm = rdata->edit_bmesh->bm;
- const int lvert_len = mesh_render_data_loose_verts_len_get(rdata);
+ const int lvert_len = mesh_render_data_loose_verts_len_get_maybe_mapped(rdata);
const int vbo_len_capacity = lvert_len;
int vbo_len_used = 0;
@@ -3090,13 +3854,31 @@ static void mesh_batch_cache_create_overlay_lvert_buffers(
GPU_vertbuf_data_alloc(vbo_data, vbo_len_capacity);
}
- for (uint i = 0; i < lvert_len; i++) {
- BMVert *eve = BM_vert_at_index(bm, rdata->loose_verts[i]);
- add_overlay_loose_vert(
- rdata, vbo_pos, vbo_nor, vbo_data,
- attr_id.pos, attr_id.vnor, attr_id.data,
- eve, vbo_len_used);
- vbo_len_used += 1;
+ if (rdata->mapped.use == false) {
+ for (uint i = 0; i < lvert_len; i++) {
+ BMVert *eve = BM_vert_at_index(bm, rdata->loose_verts[i]);
+ add_overlay_loose_vert(
+ rdata, vbo_pos, vbo_nor, vbo_data,
+ attr_id.pos, attr_id.vnor, attr_id.data,
+ eve, vbo_len_used);
+ vbo_len_used += 1;
+ }
+ }
+ else {
+ Mesh *me_cage = rdata->mapped.me_cage;
+ const MVert *mvert = me_cage->mvert;
+ const int *v_origindex = rdata->mapped.v_origindex;
+ for (uint i_iter = 0; i_iter < lvert_len; i_iter++) {
+ const int i = rdata->mapped.loose_verts[i_iter];
+ const int v_orig = v_origindex[i];
+ const MVert *mv = &mvert[i];
+ BMVert *eve = BM_vert_at_index(bm, v_orig);
+ add_overlay_loose_vert_mapped(
+ rdata, vbo_pos, vbo_nor, vbo_data,
+ attr_id.pos, attr_id.vnor, attr_id.data,
+ eve, mv, vbo_len_used);
+ vbo_len_used += 1;
+ }
}
/* Finish */
@@ -3132,6 +3914,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_ledge_pos(
BLI_assert(rdata->types & MR_DATATYPE_VERT);
if (cache->ed_ledge_pos == NULL) {
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
mesh_batch_cache_create_overlay_ledge_buffers(rdata, cache);
}
@@ -3144,12 +3929,28 @@ static GPUVertBuf *mesh_batch_cache_get_edit_lvert_pos(
BLI_assert(rdata->types & MR_DATATYPE_VERT);
if (cache->ed_lvert_pos == NULL) {
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
mesh_batch_cache_create_overlay_lvert_buffers(rdata, cache);
}
return cache->ed_lvert_pos;
}
+/* Indices */
+static GPUIndexBuf *mesh_batch_cache_get_edit_tri_indices(
+ MeshRenderData *rdata, MeshBatchCache *cache)
+{
+ BLI_assert(rdata->types & MR_DATATYPE_VERT);
+
+ if (cache->ed_tri_verts == NULL) {
+ mesh_batch_cache_create_overlay_tri_buffers(rdata, cache);
+ }
+
+ return cache->ed_tri_verts;
+}
+
/* Normal */
static GPUVertBuf *mesh_batch_cache_get_edit_tri_nor(
MeshRenderData *rdata, MeshBatchCache *cache)
@@ -3157,6 +3958,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_tri_nor(
BLI_assert(rdata->types & MR_DATATYPE_VERT);
if (cache->ed_tri_nor == NULL) {
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
mesh_batch_cache_create_overlay_tri_buffers(rdata, cache);
}
@@ -3169,6 +3973,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_ledge_nor(
BLI_assert(rdata->types & MR_DATATYPE_VERT);
if (cache->ed_ledge_nor == NULL) {
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
mesh_batch_cache_create_overlay_ledge_buffers(rdata, cache);
}
@@ -3181,6 +3988,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_lvert_nor(
BLI_assert(rdata->types & MR_DATATYPE_VERT);
if (cache->ed_lvert_nor == NULL) {
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
mesh_batch_cache_create_overlay_lvert_buffers(rdata, cache);
}
@@ -3206,6 +4016,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_ledge_data(
BLI_assert(rdata->types & MR_DATATYPE_VERT);
if (cache->ed_ledge_data == NULL) {
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
mesh_batch_cache_create_overlay_ledge_buffers(rdata, cache);
}
@@ -3218,6 +4031,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_lvert_data(
BLI_assert(rdata->types & MR_DATATYPE_VERT);
if (cache->ed_lvert_data == NULL) {
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
mesh_batch_cache_create_overlay_lvert_buffers(rdata, cache);
}
@@ -3277,7 +4093,7 @@ static GPUIndexBuf *mesh_batch_cache_get_edges_adjacency(MeshRenderData *rdata,
EdgeHash *eh = BLI_edgehash_new_ex(__func__, tri_len * 3);
/* Create edges for each pair of triangles sharing an edge. */
for (int i = 0; i < tri_len; i++) {
- for (int e = 0; e < 3; ++e) {
+ for (int e = 0; e < 3; e++) {
uint v0, v1, v2;
if (rdata->edit_bmesh) {
const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
@@ -3289,8 +4105,8 @@ static GPUIndexBuf *mesh_batch_cache_get_edges_adjacency(MeshRenderData *rdata,
v2 = BM_elem_index_get(bm_looptri[(e + 2) % 3]->v);
}
else {
- MLoop *mloop = rdata->mloop;
- MLoopTri *mlt = rdata->mlooptri + i;
+ const MLoop *mloop = rdata->mloop;
+ const MLoopTri *mlt = rdata->mlooptri + i;
v0 = mloop[mlt->tri[e]].v;
v1 = mloop[mlt->tri[(e + 1) % 3]].v;
v2 = mloop[mlt->tri[(e + 2) % 3]].v;
@@ -3298,16 +4114,16 @@ static GPUIndexBuf *mesh_batch_cache_get_edges_adjacency(MeshRenderData *rdata,
bool inv_indices = (v1 > v2);
void **pval;
bool value_is_init = BLI_edgehash_ensure_p(eh, v1, v2, &pval);
- int v_data = GET_INT_FROM_POINTER(*pval);
+ int v_data = POINTER_AS_INT(*pval);
if (!value_is_init || v_data == NO_EDGE) {
/* Save the winding order inside the sign bit. Because the
* edgehash sort the keys and we need to compare winding later. */
int value = (int)v0 + 1; /* Int 0 cannot be signed */
- *pval = SET_INT_IN_POINTER((inv_indices) ? -value : value);
+ *pval = POINTER_FROM_INT((inv_indices) ? -value : value);
}
else {
/* HACK Tag as not used. Prevent overhead of BLI_edgehash_remove. */
- *pval = SET_INT_IN_POINTER(NO_EDGE);
+ *pval = POINTER_FROM_INT(NO_EDGE);
bool inv_opposite = (v_data < 0);
uint v_opposite = (uint)abs(v_data) - 1;
@@ -3330,7 +4146,7 @@ static GPUIndexBuf *mesh_batch_cache_get_edges_adjacency(MeshRenderData *rdata,
BLI_edgehashIterator_step(ehi))
{
uint v1, v2;
- int v_data = GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
+ int v_data = POINTER_AS_INT(BLI_edgehashIterator_getValue(ehi));
if (v_data == NO_EDGE) {
continue;
}
@@ -3359,7 +4175,7 @@ static EdgeHash *create_looptri_edge_adjacency_hash(MeshRenderData *rdata)
EdgeHash *eh = BLI_edgehash_new_ex(__func__, tri_len * 3);
/* Create edges for each pair of triangles sharing an edge. */
for (int i = 0; i < tri_len; i++) {
- for (int e = 0; e < 3; ++e) {
+ for (int e = 0; e < 3; e++) {
uint v0, v1, v2;
if (rdata->edit_bmesh) {
const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
@@ -3371,8 +4187,8 @@ static EdgeHash *create_looptri_edge_adjacency_hash(MeshRenderData *rdata)
v2 = BM_elem_index_get(bm_looptri[(e + 2) % 3]->v);
}
else {
- MLoop *mloop = rdata->mloop;
- MLoopTri *mlt = rdata->mlooptri + i;
+ const MLoop *mloop = rdata->mloop;
+ const MLoopTri *mlt = rdata->mlooptri + i;
v0 = mloop[mlt->tri[e]].v;
v1 = mloop[mlt->tri[(e + 1) % 3]].v;
v2 = mloop[mlt->tri[(e + 2) % 3]].v;
@@ -3414,25 +4230,23 @@ static GPUVertBuf *mesh_batch_cache_create_edges_overlay_texture_buf(MeshRenderD
eh = create_looptri_edge_adjacency_hash(rdata);
for (int i = 0; i < tri_len; i++) {
- bool edge_is_real[3] = {false, false, false};
+ bool edge_is_real[3];
- MEdge *medge = rdata->medge;
- MLoop *mloop = rdata->mloop;
- MLoopTri *mlt = rdata->mlooptri + i;
+ const MEdge *medge = rdata->medge;
+ const MLoop *mloop = rdata->mloop;
+ const MLoopTri *mlt = rdata->mlooptri + i;
int j, j_next;
for (j = 2, j_next = 0; j_next < 3; j = j_next++) {
- MEdge *ed = &medge[mloop[mlt->tri[j]].e];
- uint tri_edge[2] = {mloop[mlt->tri[j]].v, mloop[mlt->tri[j_next]].v};
-
- if (((ed->v1 == tri_edge[0]) && (ed->v2 == tri_edge[1])) ||
- ((ed->v1 == tri_edge[1]) && (ed->v2 == tri_edge[0])))
- {
- edge_is_real[j] = true;
- }
+ const MEdge *ed = &medge[mloop[mlt->tri[j]].e];
+ const uint tri_edge[2] = {mloop[mlt->tri[j]].v, mloop[mlt->tri[j_next]].v};
+ const bool is_edge_real = (
+ ((ed->v1 == tri_edge[0]) && (ed->v2 == tri_edge[1])) ||
+ ((ed->v1 == tri_edge[1]) && (ed->v2 == tri_edge[0])));
+ edge_is_real[j] = is_edge_real;
}
- for (int e = 0; e < 3; ++e) {
+ for (int e = 0; e < 3; e++) {
int v0 = mloop[mlt->tri[e]].v;
int v1 = mloop[mlt->tri[(e + 1) % 3]].v;
EdgeAdjacentVerts *eav = BLI_edgehash_lookup(eh, v0, v1);
@@ -3443,7 +4257,7 @@ static GPUVertBuf *mesh_batch_cache_create_edges_overlay_texture_buf(MeshRenderD
}
/* Non-manifold edge */
if (eav->vert_index[1] == -1) {
- value |= (1 << 31);
+ value |= (1u << 31);
}
GPU_vertbuf_attr_set(vbo, index_id, vidx++, &value);
}
@@ -3505,7 +4319,7 @@ static GPUIndexBuf *mesh_batch_cache_get_triangles_in_order(MeshRenderData *rdat
GPU_indexbuf_init(&elb, GPU_PRIM_TRIS, tri_len, vert_len);
if (rdata->edit_bmesh) {
- for (int i = 0; i < tri_len; ++i) {
+ for (int i = 0; i < tri_len; i++) {
const BMLoop **ltri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
if (!BM_elem_flag_test(ltri[0]->f, BM_ELEM_HIDDEN)) {
for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
@@ -3515,7 +4329,7 @@ static GPUIndexBuf *mesh_batch_cache_get_triangles_in_order(MeshRenderData *rdat
}
}
else {
- for (int i = 0; i < tri_len; ++i) {
+ for (int i = 0; i < tri_len; i++) {
const MLoopTri *mlt = &rdata->mlooptri[i];
for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
GPU_indexbuf_add_generic_vert(&elb, mlt->tri[tri_corner]);
@@ -3534,31 +4348,44 @@ static GPUIndexBuf *mesh_batch_cache_get_loose_edges(MeshRenderData *rdata, Mesh
BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI));
if (cache->ledges_in_order == NULL) {
- const int vert_len = mesh_render_data_verts_len_get(rdata);
- const int edge_len = mesh_render_data_edges_len_get(rdata);
+ const int vert_len = mesh_render_data_verts_len_get_maybe_mapped(rdata);
+ const int edge_len = mesh_render_data_edges_len_get_maybe_mapped(rdata);
/* Alloc max (edge_len) and upload only needed range. */
GPUIndexBufBuilder elb;
GPU_indexbuf_init(&elb, GPU_PRIM_LINES, edge_len, vert_len);
- if (rdata->edit_bmesh) {
- /* No need to support since edit mesh already draw them.
- * But some engines may want them ... */
- BMesh *bm = rdata->edit_bmesh->bm;
- BMIter eiter;
- BMEdge *eed;
- BM_ITER_MESH(eed, &eiter, bm, BM_EDGES_OF_MESH) {
- if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN) && BM_edge_is_wire(eed)) {
- GPU_indexbuf_add_line_verts(&elb, BM_elem_index_get(eed->v1), BM_elem_index_get(eed->v2));
+ if (rdata->mapped.use == false) {
+ if (rdata->edit_bmesh) {
+ /* No need to support since edit mesh already draw them.
+ * But some engines may want them ... */
+ BMesh *bm = rdata->edit_bmesh->bm;
+ BMIter eiter;
+ BMEdge *eed;
+ BM_ITER_MESH(eed, &eiter, bm, BM_EDGES_OF_MESH) {
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN) &&
+ (eed->l == NULL || !bm_edge_has_visible_face(eed)))
+ {
+ GPU_indexbuf_add_line_verts(&elb, BM_elem_index_get(eed->v1), BM_elem_index_get(eed->v2));
+ }
+ }
+ }
+ else {
+ for (int i = 0; i < edge_len; i++) {
+ const MEdge *medge = &rdata->medge[i];
+ if (medge->flag & ME_LOOSEEDGE) {
+ GPU_indexbuf_add_line_verts(&elb, medge->v1, medge->v2);
+ }
}
}
}
else {
- for (int i = 0; i < edge_len; ++i) {
- const MEdge *medge = &rdata->medge[i];
- if (medge->flag & ME_LOOSEEDGE) {
- GPU_indexbuf_add_line_verts(&elb, medge->v1, medge->v2);
- }
+ /* Hidden checks are already done when creating the loose edge list. */
+ Mesh *me_cage = rdata->mapped.me_cage;
+ for (int i_iter = 0; i_iter < rdata->mapped.loose_edge_len; i_iter++) {
+ const int i = rdata->mapped.loose_edges[i_iter];
+ const MEdge *medge = &me_cage->medge[i];
+ GPU_indexbuf_add_line_verts(&elb, medge->v1, medge->v2);
}
}
cache->ledges_in_order = GPU_indexbuf_build(&elb);
@@ -3568,7 +4395,9 @@ static GPUIndexBuf *mesh_batch_cache_get_loose_edges(MeshRenderData *rdata, Mesh
}
static GPUIndexBuf **mesh_batch_cache_get_triangles_in_order_split_by_material(
- MeshRenderData *rdata, MeshBatchCache *cache)
+ MeshRenderData *rdata, MeshBatchCache *cache,
+ /* Special case when drawing final evaluated mesh in editmode, so hidden faces are ignored. */
+ BMesh *bm_mapped, const int *p_origindex_mapped)
{
BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_POLY));
@@ -3595,16 +4424,30 @@ static GPUIndexBuf **mesh_batch_cache_get_triangles_in_order_split_by_material(
}
}
}
- else {
+ else if (bm_mapped == NULL) {
for (uint i = 0; i < poly_len; i++) {
const MPoly *mp = &rdata->mpoly[i]; ;
const short ma_id = mp->mat_nr < mat_len ? mp->mat_nr : 0;
mat_tri_len[ma_id] += (mp->totloop - 2);
}
}
+ else {
+ BM_mesh_elem_table_ensure(bm_mapped, BM_FACE);
+ for (uint i = 0; i < poly_len; i++) {
+ const int p_orig = p_origindex_mapped[i];
+ if ((p_orig == ORIGINDEX_NONE) ||
+ !BM_elem_flag_test(BM_face_at_index(bm_mapped, p_orig), BM_ELEM_HIDDEN))
+ {
+ const MPoly *mp = &rdata->mpoly[i]; ;
+ const short ma_id = mp->mat_nr < mat_len ? mp->mat_nr : 0;
+ mat_tri_len[ma_id] += (mp->totloop - 2);
+ }
+ }
+
+ }
/* Init ELBs. */
- for (int i = 0; i < mat_len; ++i) {
+ for (int i = 0; i < mat_len; i++) {
GPU_indexbuf_init(&elb[i], GPU_PRIM_TRIS, mat_tri_len[i], tri_len * 3);
}
@@ -3625,7 +4468,7 @@ static GPUIndexBuf **mesh_batch_cache_get_triangles_in_order_split_by_material(
}
}
}
- else {
+ else if (bm_mapped == NULL) {
for (uint i = 0; i < poly_len; i++) {
const MPoly *mp = &rdata->mpoly[i]; ;
const short ma_id = mp->mat_nr < mat_len ? mp->mat_nr : 0;
@@ -3635,9 +4478,27 @@ static GPUIndexBuf **mesh_batch_cache_get_triangles_in_order_split_by_material(
}
}
}
+ else {
+ for (uint i = 0; i < poly_len; i++) {
+ const int p_orig = p_origindex_mapped[i];
+ const MPoly *mp = &rdata->mpoly[i];
+ if ((p_orig == ORIGINDEX_NONE) ||
+ !BM_elem_flag_test(BM_face_at_index(bm_mapped, p_orig), BM_ELEM_HIDDEN))
+ {
+ const short ma_id = mp->mat_nr < mat_len ? mp->mat_nr : 0;
+ for (int j = 2; j < mp->totloop; j++) {
+ GPU_indexbuf_add_tri_verts(&elb[ma_id], nidx + 0, nidx + 1, nidx + 2);
+ nidx += 3;
+ }
+ }
+ else {
+ nidx += (mp->totloop - 2) * 3;
+ }
+ }
+ }
/* Build ELBs. */
- for (int i = 0; i < mat_len; ++i) {
+ for (int i = 0; i < mat_len; i++) {
cache->shaded_triangles_in_order[i] = GPU_indexbuf_build(&elb[i]);
}
@@ -3720,7 +4581,7 @@ static GPUIndexBuf *mesh_create_tri_overlay_weight_faces(
GPUIndexBufBuilder elb;
GPU_indexbuf_init(&elb, GPU_PRIM_TRIS, tri_len, vert_len);
- for (int i = 0; i < tri_len; ++i) {
+ for (int i = 0; i < tri_len; i++) {
const MLoopTri *mlt = &rdata->mlooptri[i];
if (!(rdata->mpoly[mlt->poly].flag & (ME_FACE_SEL | ME_HIDE))) {
for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
@@ -3843,6 +4704,9 @@ GPUBatch *DRW_mesh_batch_cache_get_loose_edges_with_normals(Mesh *me)
if (cache->ledges_with_normals == NULL) {
const int datatype = MR_DATATYPE_VERT | MR_DATATYPE_EDGE | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY;
MeshRenderData *rdata = mesh_render_data_create(me, datatype);
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
cache->ledges_with_normals = GPU_batch_create(
GPU_PRIM_LINES, mesh_batch_cache_get_vert_pos_and_nor_in_order(rdata, cache),
@@ -3854,10 +4718,13 @@ GPUBatch *DRW_mesh_batch_cache_get_loose_edges_with_normals(Mesh *me)
return cache->ledges_with_normals;
}
-GPUBatch *DRW_mesh_batch_cache_get_triangles_with_normals_and_weights(Mesh *me, int defgroup)
+GPUBatch *DRW_mesh_batch_cache_get_triangles_with_normals_and_weights(
+ Mesh *me, const struct DRW_MeshWeightState *wstate)
{
MeshBatchCache *cache = mesh_batch_cache_get(me);
+ mesh_batch_cache_check_vertex_group(cache, wstate);
+
if (cache->triangles_with_weights == NULL) {
const bool use_hide = (me->editflag & (ME_EDIT_PAINT_VERT_SEL | ME_EDIT_PAINT_FACE_SEL)) != 0;
const int datatype =
@@ -3865,7 +4732,9 @@ GPUBatch *DRW_mesh_batch_cache_get_triangles_with_normals_and_weights(Mesh *me,
MeshRenderData *rdata = mesh_render_data_create(me, datatype);
cache->triangles_with_weights = GPU_batch_create_ex(
- GPU_PRIM_TRIS, mesh_create_tri_weights(rdata, use_hide, defgroup), NULL, GPU_BATCH_OWNS_VBO);
+ GPU_PRIM_TRIS, mesh_create_tri_weights(rdata, use_hide, wstate), NULL, GPU_BATCH_OWNS_VBO);
+
+ DRW_mesh_weight_state_copy(&cache->weight_state, wstate);
GPUVertBuf *vbo_tris = use_hide ?
mesh_create_tri_pos_and_normals_visible_only(rdata) :
@@ -3918,6 +4787,9 @@ struct GPUBatch *DRW_mesh_batch_cache_get_triangles_with_select_id(
const int datatype =
MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY;
MeshRenderData *rdata = mesh_render_data_create(me, datatype);
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
cache->triangles_with_select_id = GPU_batch_create_ex(
GPU_PRIM_TRIS, mesh_create_tri_select_id(rdata, use_hide, select_id_offset), NULL, GPU_BATCH_OWNS_VBO);
@@ -3944,6 +4816,9 @@ struct GPUBatch *DRW_mesh_batch_cache_get_triangles_with_select_mask(struct Mesh
const int datatype =
MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY;
MeshRenderData *rdata = mesh_render_data_create(me, datatype);
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
GPUVertBuf *vbo_tris = use_hide ?
mesh_create_tri_pos_and_normals_visible_only(rdata) :
@@ -4016,7 +4891,7 @@ GPUBatch *DRW_mesh_batch_cache_get_fancy_edges(Mesh *me)
const int vbo_len_capacity = edge_len * 2; /* these are PRIM_LINE verts, not mesh verts */
int vbo_len_used = 0;
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- for (int i = 0; i < edge_len; ++i) {
+ for (int i = 0; i < edge_len; i++) {
float *vcos1, *vcos2;
float *pnor1 = NULL, *pnor2 = NULL;
bool is_manifold;
@@ -4113,6 +4988,10 @@ static void mesh_batch_cache_create_overlay_batches(Mesh *me)
MeshBatchCache *cache = mesh_batch_cache_get(me);
MeshRenderData *rdata = mesh_render_data_create(me, options);
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
+
if (cache->overlay_triangles == NULL) {
cache->overlay_triangles = GPU_batch_create(
GPU_PRIM_TRIS, mesh_batch_cache_get_edit_tri_pos(rdata, cache), NULL);
@@ -4134,16 +5013,27 @@ static void mesh_batch_cache_create_overlay_batches(Mesh *me)
GPU_batch_vertbuf_add(cache->overlay_loose_verts, mesh_batch_cache_get_edit_lvert_data(rdata, cache));
}
+ /* Also used for vertices display */
if (cache->overlay_triangles_nor == NULL) {
cache->overlay_triangles_nor = GPU_batch_create(
- GPU_PRIM_POINTS, mesh_batch_cache_get_edit_tri_pos(rdata, cache), NULL);
+ GPU_PRIM_POINTS, mesh_batch_cache_get_edit_tri_pos(rdata, cache),
+ mesh_batch_cache_get_edit_tri_indices(rdata, cache));
GPU_batch_vertbuf_add(cache->overlay_triangles_nor, mesh_batch_cache_get_edit_tri_nor(rdata, cache));
+ GPU_batch_vertbuf_add(cache->overlay_triangles_nor, mesh_batch_cache_get_edit_tri_data(rdata, cache));
+ }
+
+ if (cache->overlay_triangles_lnor == NULL) {
+ cache->overlay_triangles_lnor = GPU_batch_create(
+ GPU_PRIM_POINTS, mesh_batch_cache_get_edit_tri_pos(rdata, cache), NULL);
+ GPU_batch_vertbuf_add(cache->overlay_triangles_lnor, mesh_batch_cache_get_edit_tri_nor(rdata, cache));
+ GPU_batch_vertbuf_add(cache->overlay_triangles_lnor, mesh_batch_cache_get_edit_tri_data(rdata, cache));
}
if (cache->overlay_loose_edges_nor == NULL) {
cache->overlay_loose_edges_nor = GPU_batch_create(
GPU_PRIM_POINTS, mesh_batch_cache_get_edit_ledge_pos(rdata, cache), NULL);
GPU_batch_vertbuf_add(cache->overlay_loose_edges_nor, mesh_batch_cache_get_edit_ledge_nor(rdata, cache));
+ GPU_batch_vertbuf_add(cache->overlay_loose_edges_nor, mesh_batch_cache_get_edit_ledge_data(rdata, cache));
}
mesh_render_data_free(rdata);
@@ -4160,6 +5050,17 @@ GPUBatch *DRW_mesh_batch_cache_get_overlay_triangles(Mesh *me)
return cache->overlay_triangles;
}
+GPUTexture *DRW_mesh_batch_cache_get_overlay_data_tex(Mesh *me)
+{
+ MeshBatchCache *cache = mesh_batch_cache_get(me);
+
+ if (cache->ed_tri_data_tx == NULL) {
+ mesh_batch_cache_create_overlay_batches(me);
+ }
+
+ return cache->ed_tri_data_tx;
+}
+
GPUBatch *DRW_mesh_batch_cache_get_overlay_loose_edges(Mesh *me)
{
MeshBatchCache *cache = mesh_batch_cache_get(me);
@@ -4193,6 +5094,17 @@ GPUBatch *DRW_mesh_batch_cache_get_overlay_triangles_nor(Mesh *me)
return cache->overlay_triangles_nor;
}
+GPUBatch *DRW_mesh_batch_cache_get_overlay_triangles_lnor(Mesh *me)
+{
+ MeshBatchCache *cache = mesh_batch_cache_get(me);
+
+ if (cache->overlay_triangles_lnor == NULL) {
+ mesh_batch_cache_create_overlay_batches(me);
+ }
+
+ return cache->overlay_triangles_lnor;
+}
+
GPUBatch *DRW_mesh_batch_cache_get_overlay_loose_edges_nor(Mesh *me)
{
MeshBatchCache *cache = mesh_batch_cache_get(me);
@@ -4258,6 +5170,9 @@ GPUBatch *DRW_mesh_batch_cache_get_edges_with_select_id(Mesh *me, uint select_id
if (cache->edges_with_select_id == NULL) {
MeshRenderData *rdata = mesh_render_data_create(me, MR_DATATYPE_VERT | MR_DATATYPE_EDGE);
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
cache->edges_with_select_id = GPU_batch_create(
GPU_PRIM_LINES, mesh_batch_cache_get_edges_visible(rdata, cache), NULL);
@@ -4283,6 +5198,9 @@ GPUBatch *DRW_mesh_batch_cache_get_verts_with_select_id(Mesh *me, uint select_id
if (cache->verts_with_select_id == NULL) {
MeshRenderData *rdata = mesh_render_data_create(me, MR_DATATYPE_VERT);
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
cache->verts_with_select_id = GPU_batch_create(
GPU_PRIM_POINTS, mesh_batch_cache_get_verts_visible(rdata, cache), NULL);
@@ -4304,6 +5222,29 @@ GPUBatch **DRW_mesh_batch_cache_get_surface_shaded(
MeshBatchCache *cache = mesh_batch_cache_get(me);
if (cache->shaded_triangles == NULL) {
+
+ /* Hack to show the final result. */
+ BMesh *bm_mapped = NULL;
+ const int *p_origindex = NULL;
+ const bool use_em_final = (
+ me->edit_btmesh &&
+ me->edit_btmesh->mesh_eval_final &&
+ (me->edit_btmesh->mesh_eval_final->runtime.is_original == false));
+ Mesh me_fake;
+ if (use_em_final) {
+ /* Pass in mapped args. */
+ bm_mapped = me->edit_btmesh->bm;
+ p_origindex = CustomData_get_layer(&me->edit_btmesh->mesh_eval_final->pdata, CD_ORIGINDEX);
+ if (p_origindex == NULL) {
+ bm_mapped = NULL;
+ }
+
+ me_fake = *me->edit_btmesh->mesh_eval_final;
+ me_fake.mat = me->mat;
+ me_fake.totcol = me->totcol;
+ me = &me_fake;
+ }
+
/* create batch from DM */
const int datatype =
MR_DATATYPE_VERT | MR_DATATYPE_LOOP | MR_DATATYPE_LOOPTRI |
@@ -4314,12 +5255,14 @@ GPUBatch **DRW_mesh_batch_cache_get_surface_shaded(
cache->shaded_triangles = MEM_callocN(sizeof(*cache->shaded_triangles) * mat_len, __func__);
- GPUIndexBuf **el = mesh_batch_cache_get_triangles_in_order_split_by_material(rdata, cache);
+ GPUIndexBuf **el = mesh_batch_cache_get_triangles_in_order_split_by_material(
+ rdata, cache,
+ bm_mapped, p_origindex);
GPUVertBuf *vbo = mesh_batch_cache_get_tri_pos_and_normals(rdata, cache);
GPUVertBuf *vbo_shading = mesh_batch_cache_get_tri_shading_data(rdata, cache);
- for (int i = 0; i < mat_len; ++i) {
+ for (int i = 0; i < mat_len; i++) {
cache->shaded_triangles[i] = GPU_batch_create(
GPU_PRIM_TRIS, vbo, el[i]);
if (vbo_shading) {
@@ -4353,10 +5296,10 @@ GPUBatch **DRW_mesh_batch_cache_get_surface_texpaint(Mesh *me)
cache->texpaint_triangles = MEM_callocN(sizeof(*cache->texpaint_triangles) * mat_len, __func__);
- GPUIndexBuf **el = mesh_batch_cache_get_triangles_in_order_split_by_material(rdata, cache);
+ GPUIndexBuf **el = mesh_batch_cache_get_triangles_in_order_split_by_material(rdata, cache, NULL, NULL);
GPUVertBuf *vbo = mesh_batch_cache_get_tri_pos_and_normals(rdata, cache);
- for (int i = 0; i < mat_len; ++i) {
+ for (int i = 0; i < mat_len; i++) {
cache->texpaint_triangles[i] = GPU_batch_create(
GPU_PRIM_TRIS, vbo, el[i]);
GPUVertBuf *vbo_uv = mesh_batch_cache_get_tri_uv_active(rdata, cache);
@@ -4393,6 +5336,57 @@ GPUBatch *DRW_mesh_batch_cache_get_surface_texpaint_single(Mesh *me)
return cache->texpaint_triangles_single;
}
+GPUBatch *DRW_mesh_batch_cache_get_texpaint_loop_wire(Mesh *me)
+{
+ MeshBatchCache *cache = mesh_batch_cache_get(me);
+
+ if (cache->texpaint_uv_loops == NULL) {
+ /* create batch from DM */
+ const int datatype = MR_DATATYPE_LOOP | MR_DATATYPE_POLY | MR_DATATYPE_LOOPUV;
+ MeshRenderData *rdata = mesh_render_data_create(me, datatype);
+
+ const MLoopUV *mloopuv_base = rdata->mloopuv;
+ if (mloopuv_base == NULL) {
+ return NULL;
+ }
+
+ uint vidx = 0;
+
+ static GPUVertFormat format = { 0 };
+ static struct { uint uv; } attr_id;
+ if (format.attr_len == 0) {
+ attr_id.uv = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+ }
+
+ const uint vert_len = mesh_render_data_loops_len_get(rdata);
+ const uint poly_len = mesh_render_data_polys_len_get(rdata);
+ const uint idx_len = vert_len + poly_len;
+
+ GPUIndexBufBuilder elb;
+ GPU_indexbuf_init_ex(&elb, GPU_PRIM_LINE_LOOP, idx_len, vert_len, true);
+
+ GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format);
+ GPU_vertbuf_data_alloc(vbo, vert_len);
+
+ const MPoly *mpoly = rdata->mpoly;
+ for (int a = 0; a < poly_len; a++, mpoly++) {
+ const MLoopUV *mloopuv = mloopuv_base + mpoly->loopstart;
+ for (int b = 0; b < mpoly->totloop; b++, mloopuv++) {
+ GPU_vertbuf_attr_set(vbo, attr_id.uv, vidx, mloopuv->uv);
+ GPU_indexbuf_add_generic_vert(&elb, vidx++);
+ }
+ GPU_indexbuf_add_primitive_restart(&elb);
+ }
+
+ cache->texpaint_uv_loops = GPU_batch_create_ex(GPU_PRIM_LINE_LOOP,
+ vbo, GPU_indexbuf_build(&elb),
+ GPU_BATCH_OWNS_VBO | GPU_BATCH_OWNS_INDEX);
+ gpu_batch_presets_register(cache->texpaint_uv_loops);
+ mesh_render_data_free(rdata);
+ }
+ return cache->texpaint_uv_loops;
+}
+
GPUBatch *DRW_mesh_batch_cache_get_weight_overlay_edges(Mesh *me, bool use_wire, bool use_sel)
{
MeshBatchCache *cache = mesh_batch_cache_get(me);
@@ -4467,6 +5461,422 @@ void DRW_mesh_cache_sculpt_coords_ensure(Mesh *me)
}
}
-/** \} */
+static uchar mesh_batch_cache_validate_edituvs(MeshBatchCache *cache, uchar state)
+{
+ if ((cache->edituv_state & UVEDIT_SYNC_SEL) != (state & UVEDIT_SYNC_SEL)) {
+ mesh_batch_cache_discard_uvedit(cache);
+ return state;
+ }
+ else {
+ return ((cache->edituv_state & state) ^ state);
+ }
+}
+
+/* Compute 3D & 2D areas and their sum. */
+BLI_INLINE void edit_uv_preprocess_stretch_area(
+ float (*tf_uv)[2], BMFace *efa, const float asp[2], const int cd_loop_uv_offset, uint fidx,
+ float *totarea, float *totuvarea, float (*faces_areas)[2])
+{
+ BMLoop *l;
+ BMIter liter;
+ int i;
+ BM_ITER_ELEM_INDEX(l, &liter, efa, BM_LOOPS_OF_FACE, i) {
+ MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ mul_v2_v2v2(tf_uv[i], luv->uv, asp);
+ }
+ faces_areas[fidx][0] = BM_face_calc_area(efa);
+ faces_areas[fidx][1] = area_poly_v2(tf_uv, efa->len);
+
+ *totarea += faces_areas[fidx][0];
+ *totuvarea += faces_areas[fidx][1];
+}
+
+BLI_INLINE float edit_uv_get_stretch_area(float area, float uvarea)
+{
+ if (area < FLT_EPSILON || uvarea < FLT_EPSILON) {
+ return 1.0f;
+ }
+ else if (area > uvarea) {
+ return 1.0f - (uvarea / area);
+ }
+ else {
+ return 1.0f - (area / uvarea);
+ }
+}
+
+/* Compute face's normalized contour vectors. */
+BLI_INLINE void edit_uv_preprocess_stretch_angle(
+ float (*auv)[2], float (*av)[3], const int cd_loop_uv_offset, BMFace *efa, float asp[2])
+{
+ BMLoop *l;
+ BMIter liter;
+ int i;
+ BM_ITER_ELEM_INDEX(l, &liter, efa, BM_LOOPS_OF_FACE, i) {
+ MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ MLoopUV *luv_prev = BM_ELEM_CD_GET_VOID_P(l->prev, cd_loop_uv_offset);
-#undef MESH_RENDER_FUNCTION
+ sub_v2_v2v2(auv[i], luv_prev->uv, luv->uv);
+ mul_v2_v2(auv[i], asp);
+ normalize_v2(auv[i]);
+
+ sub_v3_v3v3(av[i], l->prev->v->co, l->v->co);
+ normalize_v3(av[i]);
+ }
+}
+
+BLI_INLINE float edit_uv_get_loop_stretch_angle(
+ const float auv0[2], const float auv1[2], const float av0[3], const float av1[3])
+{
+ float uvang = angle_normalized_v2v2(auv0, auv1);
+ float ang = angle_normalized_v3v3(av0, av1);
+ float stretch = fabsf(uvang - ang) / (float)M_PI;
+ return 1.0f - pow2f(1.0f - stretch);
+}
+
+#define VERTEX_SELECT (1 << 0)
+#define VERTEX_PINNED (1 << 1)
+#define FACE_SELECT (1 << 2)
+#define FACE_ACTIVE (1 << 3)
+#define EDGE_SELECT (1 << 4)
+
+BLI_INLINE uchar edit_uv_get_face_flag(BMFace *efa, BMFace *efa_act, const int cd_loop_uv_offset, Scene *scene)
+{
+ uchar flag = 0;
+ flag |= uvedit_face_select_test(scene, efa, cd_loop_uv_offset) ? FACE_SELECT : 0;
+ flag |= (efa == efa_act) ? FACE_ACTIVE : 0;
+ return flag;
+}
+
+BLI_INLINE uchar edit_uv_get_loop_flag(BMLoop *l, const int cd_loop_uv_offset, Scene *scene)
+{
+ MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ uchar flag = 0;
+ flag |= uvedit_uv_select_test(scene, l, cd_loop_uv_offset) ? VERTEX_SELECT : 0;
+ flag |= uvedit_edge_select_test(scene, l, cd_loop_uv_offset) ? EDGE_SELECT : 0;
+ flag |= (luv->flag & MLOOPUV_PINNED) ? VERTEX_PINNED : 0;
+ return flag;
+}
+
+static struct EditUVFormatIndex {
+ uint uvs, area, angle, flag, fdots_uvs, fdots_flag;
+} uv_attr_id = {0};
+
+static void uvedit_fill_buffer_data(
+ Object *ob, struct SpaceImage *sima, Scene *scene, uchar state, MeshBatchCache *cache,
+ GPUIndexBufBuilder *elb_faces, GPUIndexBufBuilder *elb_edges, GPUVertBuf **facedots_vbo)
+{
+ Mesh *me = ob->data;
+ BMEditMesh *embm = me->edit_btmesh;
+ BMesh *bm = embm->bm;
+ BMIter iter, liter;
+ BMFace *efa;
+ BMLoop *l;
+ MLoopUV *luv;
+ uint vidx, fidx, i;
+ float (*faces_areas)[2] = NULL;
+ float asp[2];
+ float totarea = 0.0f, totuvarea = 0.0f;
+ const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
+ Image *ima = sima->image;
+ BMFace *efa_act = EDBM_uv_active_face_get(embm, false, false); /* will be set to NULL if hidden */
+
+ if (state & (UVEDIT_STRETCH_AREA | UVEDIT_STRETCH_ANGLE)) {
+ ED_space_image_get_uv_aspect(sima, &asp[0], &asp[1]);
+ }
+
+ BLI_buffer_declare_static(vec3f, vec3_buf, BLI_BUFFER_NOP, BM_DEFAULT_NGON_STACK_SIZE);
+ BLI_buffer_declare_static(vec2f, vec2_buf, BLI_BUFFER_NOP, BM_DEFAULT_NGON_STACK_SIZE);
+
+ if (state & UVEDIT_STRETCH_AREA) {
+ faces_areas = MEM_mallocN(sizeof(float) * 2 * bm->totface, "EDITUV faces areas");
+ }
+
+ /* Preprocess */
+ fidx = 0;
+ BM_ITER_MESH(efa, &iter, bm, BM_FACES_OF_MESH) {
+ /* Tag hidden faces */
+ BM_elem_flag_set(efa, BM_ELEM_TAG, uvedit_face_visible_test(scene, ob, ima, efa));
+
+ if ((state & UVEDIT_STRETCH_AREA) &&
+ BM_elem_flag_test(efa, BM_ELEM_TAG))
+ {
+ const int efa_len = efa->len;
+ float (*tf_uv)[2] = (float (*)[2])BLI_buffer_reinit_data(&vec2_buf, vec2f, efa_len);
+ edit_uv_preprocess_stretch_area(tf_uv, efa, asp, cd_loop_uv_offset, fidx++,
+ &totarea, &totuvarea, faces_areas);
+ }
+ }
+
+ vidx = 0;
+ fidx = 0;
+ BM_ITER_MESH(efa, &iter, bm, BM_FACES_OF_MESH) {
+ const int efa_len = efa->len;
+ float fdot[2] = {0.0f, 0.0f};
+ float (*av)[3], (*auv)[2];
+ ushort area_stretch;
+ /* Skip hidden faces. */
+ if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
+ continue;
+
+ uchar face_flag = edit_uv_get_face_flag(efa, efa_act, cd_loop_uv_offset, scene);
+ /* Face preprocess */
+ if (state & UVEDIT_STRETCH_AREA) {
+ area_stretch = edit_uv_get_stretch_area(faces_areas[fidx][0] / totarea,
+ faces_areas[fidx][1] / totuvarea) * 65534.0f;
+ }
+ if (state & UVEDIT_STRETCH_ANGLE) {
+ av = (float (*)[3])BLI_buffer_reinit_data(&vec3_buf, vec3f, efa_len);
+ auv = (float (*)[2])BLI_buffer_reinit_data(&vec2_buf, vec2f, efa_len);
+ edit_uv_preprocess_stretch_angle(auv, av, cd_loop_uv_offset, efa, asp);
+ }
+
+ BM_ITER_ELEM_INDEX(l, &liter, efa, BM_LOOPS_OF_FACE, i) {
+ luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ uchar flag = face_flag | edit_uv_get_loop_flag(l, cd_loop_uv_offset, scene);
+
+ if (state & UVEDIT_STRETCH_AREA) {
+ GPU_vertbuf_attr_set(cache->edituv_area, uv_attr_id.area, vidx, &area_stretch);
+ }
+ if (state & UVEDIT_STRETCH_ANGLE) {
+ ushort angle = 65534.0f * edit_uv_get_loop_stretch_angle(auv[i], auv[(i + 1) % efa_len],
+ av[i], av[(i + 1) % efa_len]);
+ GPU_vertbuf_attr_set(cache->edituv_angle, uv_attr_id.angle, vidx, &angle);
+ }
+ if (state & UVEDIT_EDGES) {
+ GPU_vertbuf_attr_set(cache->edituv_pos, uv_attr_id.uvs, vidx, luv->uv);
+ }
+ if (state & UVEDIT_DATA) {
+ GPU_vertbuf_attr_set(cache->edituv_data, uv_attr_id.flag, vidx, &flag);
+ }
+ if (state & UVEDIT_FACES) {
+ GPU_indexbuf_add_generic_vert(elb_faces, vidx);
+ }
+ if (state & UVEDIT_EDGES) {
+ GPU_indexbuf_add_generic_vert(elb_edges, vidx);
+ }
+
+ if (state & UVEDIT_FACEDOTS) {
+ add_v2_v2(fdot, luv->uv);
+ }
+ vidx++;
+ }
+
+ if (state & UVEDIT_FACES) {
+ GPU_indexbuf_add_primitive_restart(elb_faces);
+ }
+ if (state & UVEDIT_EDGES) {
+ GPU_indexbuf_add_primitive_restart(elb_edges);
+ }
+
+ if (state & UVEDIT_FACEDOTS) {
+ mul_v2_fl(fdot, 1.0f / (float)efa->len);
+ GPU_vertbuf_attr_set(*facedots_vbo, uv_attr_id.fdots_uvs, fidx, fdot);
+ GPU_vertbuf_attr_set(*facedots_vbo, uv_attr_id.fdots_flag, fidx, &face_flag);
+ }
+ fidx++;
+ }
+
+ if (faces_areas) {
+ MEM_freeN(faces_areas);
+ }
+
+ BLI_buffer_free(&vec3_buf);
+ BLI_buffer_free(&vec2_buf);
+
+ if (vidx == 0) {
+ GPU_VERTBUF_DISCARD_SAFE(cache->edituv_area);
+ GPU_VERTBUF_DISCARD_SAFE(cache->edituv_angle);
+ GPU_VERTBUF_DISCARD_SAFE(cache->edituv_pos);
+ GPU_VERTBUF_DISCARD_SAFE(cache->edituv_data);
+ GPU_VERTBUF_DISCARD_SAFE(*facedots_vbo);
+ }
+
+ if (vidx < bm->totloop) {
+ if (cache->edituv_area && (state & UVEDIT_STRETCH_AREA)) {
+ GPU_vertbuf_data_resize(cache->edituv_area, vidx);
+ }
+ if (cache->edituv_angle && (state & UVEDIT_STRETCH_ANGLE)) {
+ GPU_vertbuf_data_resize(cache->edituv_angle, vidx);
+ }
+ if (cache->edituv_pos && (state & UVEDIT_EDGES)) {
+ GPU_vertbuf_data_resize(cache->edituv_pos, vidx);
+ }
+ if (cache->edituv_data && (state & UVEDIT_DATA)) {
+ GPU_vertbuf_data_resize(cache->edituv_data, vidx);
+ }
+ }
+ if (fidx < bm->totface) {
+ if (*facedots_vbo) {
+ GPU_vertbuf_data_resize(*facedots_vbo, fidx);
+ }
+ }
+}
+
+static void mesh_batch_cache_create_uvedit_buffers(
+ Object *ob, struct SpaceImage *sima, Scene *scene, MeshBatchCache *cache, uchar state)
+{
+ GPUVertBuf *facedots_vbo = NULL;
+
+ if (state == 0) {
+ return;
+ }
+
+ Mesh *me = ob->data;
+ BMEditMesh *embm = me->edit_btmesh;
+ BMesh *bm = embm->bm;
+
+ static GPUVertFormat format_pos = { 0 };
+ static GPUVertFormat format_area = { 0 };
+ static GPUVertFormat format_angle = { 0 };
+ static GPUVertFormat format_flag = { 0 };
+ static GPUVertFormat format_facedots = { 0 };
+
+ if (format_pos.attr_len == 0) {
+ uv_attr_id.uvs = GPU_vertformat_attr_add(&format_pos, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+ uv_attr_id.area = GPU_vertformat_attr_add(&format_area, "stretch", GPU_COMP_U16, 1, GPU_FETCH_INT_TO_FLOAT_UNIT);
+ uv_attr_id.angle = GPU_vertformat_attr_add(&format_angle, "stretch", GPU_COMP_U16, 1, GPU_FETCH_INT_TO_FLOAT_UNIT);
+ uv_attr_id.flag = GPU_vertformat_attr_add(&format_flag, "flag", GPU_COMP_U8, 1, GPU_FETCH_INT);
+
+ uv_attr_id.fdots_uvs = GPU_vertformat_attr_add(&format_facedots, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+ uv_attr_id.fdots_flag = GPU_vertformat_attr_add(&format_facedots, "flag", GPU_COMP_U8, 1, GPU_FETCH_INT);
+ }
+
+ const uint vert_len = bm->totloop;
+ const uint idx_len = bm->totloop + bm->totface;
+ const uint face_len = bm->totface;
+
+ if (state & UVEDIT_EDGES) {
+ cache->edituv_pos = GPU_vertbuf_create_with_format(&format_pos);
+ GPU_vertbuf_data_alloc(cache->edituv_pos, vert_len);
+ }
+ if (state & UVEDIT_DATA) {
+ cache->edituv_data = GPU_vertbuf_create_with_format(&format_flag);
+ GPU_vertbuf_data_alloc(cache->edituv_data, vert_len);
+ }
+ if (state & UVEDIT_STRETCH_AREA) {
+ cache->edituv_area = GPU_vertbuf_create_with_format(&format_area);
+ GPU_vertbuf_data_alloc(cache->edituv_area, vert_len);
+ }
+ if (state & UVEDIT_STRETCH_ANGLE) {
+ cache->edituv_angle = GPU_vertbuf_create_with_format(&format_angle);
+ GPU_vertbuf_data_alloc(cache->edituv_angle, vert_len);
+ }
+ if (state & UVEDIT_FACEDOTS) {
+ facedots_vbo = GPU_vertbuf_create_with_format(&format_facedots);
+ GPU_vertbuf_data_alloc(facedots_vbo, face_len);
+ }
+
+ /* NOTE: we could use the same index buffer for both primitive type (it's the same indices)
+ * but since GPU_PRIM_LINE_LOOP does not exist in vulkan, make it future proof. */
+ GPUIndexBufBuilder elb_faces, elb_edges;
+ if (state & UVEDIT_EDGES) {
+ GPU_indexbuf_init_ex(&elb_edges, GPU_PRIM_LINE_LOOP, idx_len, vert_len, true);
+ }
+ if (state & UVEDIT_FACES) {
+ GPU_indexbuf_init_ex(&elb_faces, GPU_PRIM_TRI_FAN, idx_len, vert_len, true);
+ }
+
+ uvedit_fill_buffer_data(ob, sima, scene, state, cache, &elb_faces, &elb_edges, &facedots_vbo);
+
+ if (state & UVEDIT_EDGES) {
+ cache->edituv_visible_edges = GPU_indexbuf_build(&elb_edges);
+ }
+ if (state & UVEDIT_FACES) {
+ cache->edituv_visible_faces = GPU_indexbuf_build(&elb_faces);
+ }
+ if ((state & UVEDIT_FACEDOTS) && facedots_vbo) {
+ cache->edituv_facedots = GPU_batch_create_ex(GPU_PRIM_POINTS, facedots_vbo, NULL, GPU_BATCH_OWNS_VBO);
+ gpu_batch_presets_register(cache->edituv_facedots);
+ }
+
+ cache->edituv_state |= state;
+}
+
+void DRW_mesh_cache_uvedit(
+ Object *ob, struct SpaceImage *sima, Scene *scene, uchar state,
+ GPUBatch **faces, GPUBatch **edges, GPUBatch **verts, GPUBatch **facedots)
+{
+ Mesh *me = ob->data;
+ MeshBatchCache *cache = mesh_batch_cache_get(me);
+
+ uchar missing_state = mesh_batch_cache_validate_edituvs(cache, state);
+
+ mesh_batch_cache_create_uvedit_buffers(ob, sima, scene, cache, missing_state);
+
+ /* Bail out if there is nothing to draw. */
+ if (cache->edituv_data == NULL) {
+ *faces = *edges = *verts = *facedots = NULL;
+ return;
+ }
+
+ /* Faces */
+ if (state & UVEDIT_STRETCH_AREA) {
+ if (cache->edituv_faces_strech_area == NULL) {
+ cache->edituv_faces_strech_area = GPU_batch_create(GPU_PRIM_TRI_FAN,
+ cache->edituv_pos,
+ cache->edituv_visible_faces);
+ GPU_batch_vertbuf_add_ex(cache->edituv_faces_strech_area,
+ cache->edituv_area, false);
+ gpu_batch_presets_register(cache->edituv_faces_strech_area);
+ }
+ *faces = cache->edituv_faces_strech_area;
+ }
+ else if (state & UVEDIT_STRETCH_ANGLE) {
+ if (cache->edituv_faces_strech_angle == NULL) {
+ cache->edituv_faces_strech_angle = GPU_batch_create(GPU_PRIM_TRI_FAN,
+ cache->edituv_pos,
+ cache->edituv_visible_faces);
+ GPU_batch_vertbuf_add_ex(cache->edituv_faces_strech_angle,
+ cache->edituv_angle, false);
+ gpu_batch_presets_register(cache->edituv_faces_strech_angle);
+ }
+ *faces = cache->edituv_faces_strech_angle;
+ }
+ else if (state & UVEDIT_FACES) {
+ if (cache->edituv_faces == NULL) {
+ cache->edituv_faces = GPU_batch_create(GPU_PRIM_TRI_FAN,
+ cache->edituv_pos,
+ cache->edituv_visible_faces);
+ GPU_batch_vertbuf_add_ex(cache->edituv_faces,
+ cache->edituv_data, false);
+ gpu_batch_presets_register(cache->edituv_faces);
+ }
+ *faces = cache->edituv_faces;
+ }
+ else {
+ *faces = NULL;
+ }
+
+ {
+ if (cache->edituv_edges == NULL) {
+ cache->edituv_edges = GPU_batch_create(GPU_PRIM_LINE_LOOP,
+ cache->edituv_pos,
+ cache->edituv_visible_edges);
+ GPU_batch_vertbuf_add_ex(cache->edituv_edges,
+ cache->edituv_data, false);
+ gpu_batch_presets_register(cache->edituv_edges);
+ }
+ *edges = cache->edituv_edges;
+ }
+
+ {
+ if (cache->edituv_verts == NULL) {
+ cache->edituv_verts = GPU_batch_create(GPU_PRIM_POINTS,
+ cache->edituv_pos,
+ NULL);
+ GPU_batch_vertbuf_add_ex(cache->edituv_verts,
+ cache->edituv_data, false);
+ gpu_batch_presets_register(cache->edituv_verts);
+ }
+ *verts = cache->edituv_verts;
+ }
+
+ if (state & UVEDIT_FACEDOTS) {
+ *facedots = cache->edituv_facedots;
+ }
+ else {
+ *facedots = NULL;
+ }
+}
+
+/** \} */
diff --git a/source/blender/draw/intern/draw_cache_impl_particles.c b/source/blender/draw/intern/draw_cache_impl_particles.c
index b0da9d7082d..263aaa1ffdf 100644
--- a/source/blender/draw/intern/draw_cache_impl_particles.c
+++ b/source/blender/draw/intern/draw_cache_impl_particles.c
@@ -759,11 +759,11 @@ static void particle_batch_cache_ensure_procedural_final_points(
cache->final[subdiv].proc_buf = GPU_vertbuf_create_with_format(&format);
- /* Create a destination buffer for the tranform feedback. Sized appropriately */
- /* Thoses are points! not line segments. */
+ /* Create a destination buffer for the transform feedback. Sized appropriately */
+ /* Those are points! not line segments. */
GPU_vertbuf_data_alloc(cache->final[subdiv].proc_buf, cache->final[subdiv].strands_res * cache->strands_len);
- /* Create vbo immediatly to bind to texture buffer. */
+ /* Create vbo immediately to bind to texture buffer. */
GPU_vertbuf_use(cache->final[subdiv].proc_buf);
cache->final[subdiv].proc_tex = GPU_texture_create_from_vertbuf(cache->final[subdiv].proc_buf);
@@ -913,7 +913,7 @@ static void particle_batch_cache_ensure_procedural_strand_data(
MEM_freeN(parent_mcol);
}
- /* Create vbo immediatly to bind to texture buffer. */
+ /* Create vbo immediately to bind to texture buffer. */
GPU_vertbuf_use(cache->proc_strand_buf);
cache->strand_tex = GPU_texture_create_from_vertbuf(cache->proc_strand_buf);
@@ -1026,7 +1026,7 @@ static void particle_batch_cache_ensure_procedural_pos(
}
}
- /* Create vbo immediatly to bind to texture buffer. */
+ /* Create vbo immediately to bind to texture buffer. */
GPU_vertbuf_use(cache->proc_point_buf);
cache->point_tex = GPU_texture_create_from_vertbuf(cache->proc_point_buf);
diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c
index 691cd27051a..4d33e6ed802 100644
--- a/source/blender/draw/intern/draw_common.c
+++ b/source/blender/draw/intern/draw_common.c
@@ -30,6 +30,7 @@
#include "UI_resources.h"
+#include "BKE_object.h"
#include "BKE_global.h"
#include "BKE_colorband.h"
@@ -46,6 +47,12 @@
GlobalsUboStorage ts;
struct GPUUniformBuffer *globals_ubo = NULL;
struct GPUTexture *globals_ramp = NULL;
+struct GPUTexture *globals_weight_ramp = NULL;
+
+static bool weight_ramp_custom = false;
+static ColorBand weight_ramp_copy;
+
+static struct GPUTexture *DRW_create_weight_colorramp_texture(void);
void DRW_globals_update(void)
{
@@ -62,6 +69,8 @@ void DRW_globals_update(void)
UI_GetThemeColor4fv(TH_EMPTY, ts.colorEmpty);
UI_GetThemeColor4fv(TH_VERTEX, ts.colorVertex);
UI_GetThemeColor4fv(TH_VERTEX_SELECT, ts.colorVertexSelect);
+ UI_GetThemeColor4fv(TH_VERTEX_UNREFERENCED, ts.colorVertexUnreferenced);
+ UI_COLOR_RGBA_FROM_U8(0xB0, 0x00, 0xB0, 0xFF, ts.colorVertexMissingData);
UI_GetThemeColor4fv(TH_EDITMESH_ACTIVE, ts.colorEditMeshActive);
UI_GetThemeColor4fv(TH_EDGE_SELECT, ts.colorEdgeSelect);
@@ -78,6 +87,14 @@ void DRW_globals_update(void)
UI_GetThemeColor4fv(TH_FACE_DOT, ts.colorFaceDot);
UI_GetThemeColor4fv(TH_BACK, ts.colorBackground);
+#ifdef WITH_FREESTYLE
+ UI_GetThemeColor4fv(TH_FREESTYLE_EDGE_MARK, ts.colorEdgeFreestyle);
+ UI_GetThemeColor4fv(TH_FREESTYLE_FACE_MARK, ts.colorFaceFreestyle);
+#else
+ zero_v4(ts.colorEdgeFreestyle);
+ zero_v4(ts.colorFaceFreestyle);
+#endif
+
/* Curve */
UI_GetThemeColor4fv(TH_HANDLE_FREE, ts.colorHandleFree);
UI_GetThemeColor4fv(TH_HANDLE_AUTO, ts.colorHandleAuto);
@@ -90,7 +107,9 @@ void DRW_globals_update(void)
UI_GetThemeColor4fv(TH_HANDLE_SEL_ALIGN, ts.colorHandleSelAlign);
UI_GetThemeColor4fv(TH_HANDLE_SEL_AUTOCLAMP, ts.colorHandleSelAutoclamp);
UI_GetThemeColor4fv(TH_NURB_ULINE, ts.colorNurbUline);
+ UI_GetThemeColor4fv(TH_NURB_VLINE, ts.colorNurbVline);
UI_GetThemeColor4fv(TH_NURB_SEL_ULINE, ts.colorNurbSelUline);
+ UI_GetThemeColor4fv(TH_NURB_SEL_VLINE, ts.colorNurbSelVline);
UI_GetThemeColor4fv(TH_ACTIVE_SPLINE, ts.colorActiveSpline);
UI_GetThemeColor4fv(TH_BONE_POSE, ts.colorBonePose);
@@ -124,6 +143,16 @@ void DRW_globals_update(void)
ts.sizeEdge = U.pixelsize * (1.0f / 2.0f); /* TODO Theme */
ts.sizeEdgeFix = U.pixelsize * (0.5f + 2.0f * (2.0f * (MAX2(ts.sizeVertex, ts.sizeEdge)) * (float)M_SQRT1_2));
+ /* Color management. */
+ if (DRW_state_is_image_render()) {
+ float *color = ts.UBO_FIRST_COLOR;
+ do {
+ /* TODO more accurate transform. */
+ srgb_to_linearrgb_v4(color, color);
+ color += 4;
+ } while (color != ts.UBO_LAST_COLOR);
+ }
+
if (globals_ubo == NULL) {
globals_ubo = DRW_uniformbuffer_create(sizeof(GlobalsUboStorage), &ts);
}
@@ -153,6 +182,22 @@ void DRW_globals_update(void)
globals_ramp = GPU_texture_create_1D(col_size, GPU_RGBA8, colors, NULL);
MEM_freeN(colors);
+
+ /* Weight Painting color ramp texture */
+ bool user_weight_ramp = (U.flag & USER_CUSTOM_RANGE) != 0;
+
+ if (weight_ramp_custom != user_weight_ramp ||
+ (user_weight_ramp && memcmp(&weight_ramp_copy, &U.coba_weight, sizeof(ColorBand)) != 0))
+ {
+ DRW_TEXTURE_FREE_SAFE(globals_weight_ramp);
+ }
+
+ if (globals_weight_ramp == NULL) {
+ weight_ramp_custom = user_weight_ramp;
+ memcpy(&weight_ramp_copy, &U.coba_weight, sizeof(ColorBand));
+
+ globals_weight_ramp = DRW_create_weight_colorramp_texture();
+ }
}
/* ********************************* SHGROUP ************************************* */
@@ -177,6 +222,7 @@ extern char datatoc_armature_shape_outline_vert_glsl[];
extern char datatoc_armature_shape_outline_geom_glsl[];
extern char datatoc_armature_stick_vert_glsl[];
extern char datatoc_armature_stick_frag_glsl[];
+extern char datatoc_armature_dof_vert_glsl[];
extern char datatoc_common_globals_lib_glsl[];
@@ -197,6 +243,7 @@ static struct {
struct GPUShader *bone_sphere;
struct GPUShader *bone_sphere_outline;
struct GPUShader *bone_stick;
+ struct GPUShader *bone_dofs;
struct GPUShader *mpath_line_sh;
struct GPUShader *mpath_points_sh;
@@ -220,6 +267,7 @@ static struct {
struct GPUVertFormat *instance_distance_lines;
struct GPUVertFormat *instance_spot;
struct GPUVertFormat *instance_bone;
+ struct GPUVertFormat *instance_bone_dof;
struct GPUVertFormat *instance_bone_stick;
struct GPUVertFormat *instance_bone_outline;
struct GPUVertFormat *instance_bone_envelope;
@@ -735,6 +783,30 @@ DRWShadingGroup *shgroup_instance_bone_stick(DRWPass *pass)
pass, DRW_cache_bone_stick_get(),
g_formats.instance_bone_stick);
DRW_shgroup_uniform_vec2(grp, "viewportSize", DRW_viewport_size_get(), 1);
+ DRW_shgroup_uniform_float_copy(grp, "stickSize", 5.0f * U.pixelsize);
+
+ return grp;
+}
+
+struct DRWShadingGroup *shgroup_instance_bone_dof(struct DRWPass *pass, struct GPUBatch *geom)
+{
+ if (g_shaders.bone_dofs == NULL) {
+ g_shaders.bone_dofs = DRW_shader_create(
+ datatoc_armature_dof_vert_glsl, NULL,
+ datatoc_gpu_shader_flat_color_frag_glsl, NULL);
+ }
+
+ DRW_shgroup_instance_format(g_formats.instance_bone_dof, {
+ {"InstanceModelMatrix", DRW_ATTRIB_FLOAT, 16},
+ {"color", DRW_ATTRIB_FLOAT, 4},
+ {"amin", DRW_ATTRIB_FLOAT, 2},
+ {"amax", DRW_ATTRIB_FLOAT, 2},
+ });
+
+ DRWShadingGroup *grp = DRW_shgroup_instance_create(
+ g_shaders.bone_dofs,
+ pass, geom,
+ g_formats.instance_bone_dof);
return grp;
}
@@ -842,7 +914,7 @@ int DRW_object_wire_theme_get(Object *ob, ViewLayer *view_layer, float **r_color
return theme_id;
}
-/* XXX This is utter shit, better find something more general */
+/* XXX This is very stupid, better find something more general. */
float *DRW_color_background_blend_get(int theme_id)
{
static float colors[11][4];
@@ -864,3 +936,74 @@ float *DRW_color_background_blend_get(int theme_id)
return ret;
}
+
+
+bool DRW_object_is_flat(Object *ob, int *axis)
+{
+ float dim[3];
+
+ if (!ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) {
+ /* Non-meshes object cannot be considered as flat. */
+ return false;
+ }
+
+ BKE_object_dimensions_get(ob, dim);
+ if (dim[0] == 0.0f) {
+ *axis = 0;
+ return true;
+ }
+ else if (dim[1] == 0.0f) {
+ *axis = 1;
+ return true;
+ }
+ else if (dim[2] == 0.0f) {
+ *axis = 2;
+ return true;
+ }
+ return false;
+}
+
+bool DRW_object_axis_orthogonal_to_view(Object *ob, int axis)
+{
+ float ob_rot[3][3], invviewmat[4][4];
+ DRW_viewport_matrix_get(invviewmat, DRW_MAT_VIEWINV);
+ BKE_object_rot_to_mat3(ob, ob_rot, true);
+ float dot = dot_v3v3(ob_rot[axis], invviewmat[2]);
+ if (fabsf(dot) < 1e-3) {
+ return true;
+ }
+
+ return false;
+}
+
+static void DRW_evaluate_weight_to_color(const float weight, float result[4])
+{
+ if (U.flag & USER_CUSTOM_RANGE) {
+ BKE_colorband_evaluate(&U.coba_weight, weight, result);
+ }
+ else {
+ /* Use gamma correction to even out the color bands:
+ * increasing widens yellow/cyan vs red/green/blue.
+ * Gamma 1.0 produces the original 2.79 color ramp. */
+ const float gamma = 1.5f;
+ float hsv[3] = {(2.0f / 3.0f) * (1.0f - weight), 1.0f, pow(0.5f + 0.5f * weight, gamma)};
+
+ hsv_to_rgb_v(hsv, result);
+
+ for (int i = 0; i < 3; i++) {
+ result[i] = pow(result[i], 1.0f / gamma);
+ }
+ }
+}
+
+static GPUTexture *DRW_create_weight_colorramp_texture(void)
+{
+ char error[256];
+ float pixels[256][4];
+ for (int i = 0 ; i < 256 ; i ++) {
+ DRW_evaluate_weight_to_color(i / 255.0f, pixels[i]);
+ pixels[i][3] = 1.0f;
+ }
+
+ return GPU_texture_create_1D(256, GPU_RGBA8, pixels[0], error);
+}
diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h
index bab6c67a081..f9e9d2adba3 100644
--- a/source/blender/draw/intern/draw_common.h
+++ b/source/blender/draw/intern/draw_common.h
@@ -36,8 +36,12 @@ struct ModifierData;
struct ParticleSystem;
struct PTCacheEdit;
+#define UBO_FIRST_COLOR colorWire
+#define UBO_LAST_COLOR colorGridAxisZ
+
/* Used as ubo but colors can be directly referenced as well */
/* Keep in sync with: common_globals_lib.glsl (globalsBlock) */
+/* NOTE! Also keep all color as vec4 and between UBO_FIRST_COLOR and UBO_LAST_COLOR */
typedef struct GlobalsUboStorage {
/* UBOs data needs to be 16 byte aligned (size of vec4) */
float colorWire[4];
@@ -53,6 +57,8 @@ typedef struct GlobalsUboStorage {
float colorEmpty[4];
float colorVertex[4];
float colorVertexSelect[4];
+ float colorVertexUnreferenced[4];
+ float colorVertexMissingData[4];
float colorEditMeshActive[4];
float colorEdgeSelect[4];
float colorEdgeSeam[4];
@@ -60,8 +66,10 @@ typedef struct GlobalsUboStorage {
float colorEdgeCrease[4];
float colorEdgeBWeight[4];
float colorEdgeFaceSelect[4];
+ float colorEdgeFreestyle[4];
float colorFace[4];
float colorFaceSelect[4];
+ float colorFaceFreestyle[4];
float colorNormal[4];
float colorVNormal[4];
float colorLNormal[4];
@@ -84,7 +92,9 @@ typedef struct GlobalsUboStorage {
float colorHandleSelAlign[4];
float colorHandleSelAutoclamp[4];
float colorNurbUline[4];
+ float colorNurbVline[4];
float colorNurbSelUline[4];
+ float colorNurbSelVline[4];
float colorActiveSpline[4];
float colorBonePose[4];
@@ -97,12 +107,17 @@ typedef struct GlobalsUboStorage {
float colorGridAxisY[4];
float colorGridAxisZ[4];
- /* Pack individual float at the end of the buffer to avoid alignement errors */
+ /* NOTE! Put all color before UBO_LAST_COLOR */
+
+ /* Pack individual float at the end of the buffer to avoid alignment errors */
float sizeLampCenter, sizeLampCircle, sizeLampCircleShadow;
float sizeVertex, sizeEdge, sizeEdgeFix, sizeFaceDot;
float gridDistance, gridResolution, gridSubdivisions, gridScale;
+
+ float pad_globalsBlock;
} GlobalsUboStorage;
/* Keep in sync with globalsBlock in shaders */
+BLI_STATIC_ASSERT_ALIGN(GlobalsUboStorage, 16)
void DRW_globals_update(void);
void DRW_globals_free(void);
@@ -135,6 +150,7 @@ struct DRWShadingGroup *shgroup_instance_bone_shape_solid(struct DRWPass *pass,
struct DRWShadingGroup *shgroup_instance_bone_sphere_outline(struct DRWPass *pass);
struct DRWShadingGroup *shgroup_instance_bone_sphere_solid(struct DRWPass *pass, bool transp);
struct DRWShadingGroup *shgroup_instance_bone_stick(struct DRWPass *pass);
+struct DRWShadingGroup *shgroup_instance_bone_dof(struct DRWPass *pass, struct GPUBatch *geom);
struct GPUShader *mpath_line_shader_get(void);
struct GPUShader *mpath_points_shader_get(void);
@@ -145,6 +161,9 @@ int DRW_object_wire_theme_get(
struct Object *ob, struct ViewLayer *view_layer, float **r_color);
float *DRW_color_background_blend_get(int theme_id);
+bool DRW_object_is_flat(Object *ob, int *axis);
+bool DRW_object_axis_orthogonal_to_view(Object *ob, int axis);
+
/* draw_armature.c */
typedef struct DRWArmaturePasses {
struct DRWPass *bone_solid;
diff --git a/source/blender/draw/intern/draw_debug.c b/source/blender/draw/intern/draw_debug.c
index c748b8fb0d8..366da92cf50 100644
--- a/source/blender/draw/intern/draw_debug.c
+++ b/source/blender/draw/intern/draw_debug.c
@@ -111,14 +111,17 @@ void DRW_debug_m4_as_bbox(const float m[4][4], const float color[4], const bool
{
BoundBox bb;
const float min[3] = {-1.0f, -1.0f, -1.0f}, max[3] = {1.0f, 1.0f, 1.0f};
- float minv[4][4];
+ float project_matrix[4][4];
if (invert) {
- invert_m4_m4(minv, m);
+ invert_m4_m4(project_matrix, m);
+ }
+ else {
+ copy_m4_m4(project_matrix, m);
}
BKE_boundbox_init_from_minmax(&bb, min, max);
for (int i = 0; i < 8; ++i) {
- mul_project_m4_v3((invert) ? minv : m, bb.vec[i]);
+ mul_project_m4_v3(project_matrix, bb.vec[i]);
}
DRW_debug_bbox(&bb, color);
}
@@ -158,10 +161,10 @@ static void drw_debug_draw_lines(void)
while (DST.debug.lines) {
void *next = DST.debug.lines->next;
- immAttrib4fv(col, DST.debug.lines->color);
+ immAttr4fv(col, DST.debug.lines->color);
immVertex3fv(pos, DST.debug.lines->pos[0]);
- immAttrib4fv(col, DST.debug.lines->color);
+ immAttr4fv(col, DST.debug.lines->color);
immVertex3fv(pos, DST.debug.lines->pos[1]);
MEM_freeN(DST.debug.lines);
diff --git a/source/blender/draw/intern/draw_hair.c b/source/blender/draw/intern/draw_hair.c
index 6ede573199f..ebdb4c72d09 100644
--- a/source/blender/draw/intern/draw_hair.c
+++ b/source/blender/draw/intern/draw_hair.c
@@ -57,7 +57,7 @@ typedef enum ParticleRefineShader {
} ParticleRefineShader;
static GPUShader *g_refine_shaders[PART_REFINE_MAX_SHADER] = {NULL};
-static DRWPass *g_tf_pass; /* XXX can be a problem with mulitple DRWManager in the future */
+static DRWPass *g_tf_pass; /* XXX can be a problem with multiple DRWManager in the future */
extern char datatoc_common_hair_lib_glsl[];
extern char datatoc_common_hair_refine_vert_glsl[];
diff --git a/source/blender/draw/intern/draw_instance_data.c b/source/blender/draw/intern/draw_instance_data.c
index 89cffd6c19c..9695643d707 100644
--- a/source/blender/draw/intern/draw_instance_data.c
+++ b/source/blender/draw/intern/draw_instance_data.c
@@ -26,7 +26,7 @@
/**
* DRW Instance Data Manager
* This is a special memory manager that keeps memory blocks ready to send as vbo data in one continuous allocation.
- * This way we avoid feeding gawain each instance data one by one and unecessary memcpy.
+ * This way we avoid feeding gawain each instance data one by one and unnecessary memcpy.
* Since we loose which memory block was used each DRWShadingGroup we need to redistribute them in the same order/size
* to avoid to realloc each frame.
* This is why DRWInstanceDatas are sorted in a list for each different data size.
@@ -406,7 +406,7 @@ void DRW_instance_data_list_free_unused(DRWInstanceDataList *idatalist)
idatalist->idata_head[i] = next_idata;
}
else {
- /* idatalist->idata_tail[i] is garanteed not to be null in this case. */
+ /* idatalist->idata_tail[i] is guaranteed not to be null in this case. */
idatalist->idata_tail[i]->next = next_idata;
}
DRW_instance_data_free(idata);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index f5f98aef3e7..c84dd69125c 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -148,13 +148,10 @@ struct DRWTextStore *DRW_text_cache_ensure(void)
/** \name Settings
* \{ */
-bool DRW_object_is_renderable(Object *ob)
+bool DRW_object_is_renderable(const Object *ob)
{
BLI_assert(BKE_object_is_visible(ob, OB_VISIBILITY_CHECK_UNKNOWN_RENDER_MODE));
- if (ob->dt < OB_SOLID)
- return false;
-
if (ob->type == OB_MESH) {
if ((ob == DST.draw_ctx.object_edit) || BKE_object_is_in_editmode(ob)) {
View3D *v3d = DST.draw_ctx.v3d;
@@ -173,7 +170,7 @@ bool DRW_object_is_renderable(Object *ob)
* Return whether this object is visible depending if
* we are rendering or drawing in the viewport.
*/
-bool DRW_check_object_visible_within_active_context(Object *ob)
+bool DRW_object_is_visible_in_active_context(const Object *ob)
{
const eObjectVisibilityCheck mode = DRW_state_is_scene_render() ?
OB_VISIBILITY_CHECK_FOR_RENDER :
@@ -192,9 +189,9 @@ bool DRW_object_is_flat_normal(const Object *ob)
return true;
}
-bool DRW_check_psys_visible_within_active_context(
- Object *object,
- struct ParticleSystem *psys)
+bool DRW_object_is_visible_psys_in_active_context(
+ const Object *object,
+ const ParticleSystem *psys)
{
const DRWContextState *draw_ctx = DRW_context_state_get();
const Scene *scene = draw_ctx->scene;
@@ -270,13 +267,13 @@ void DRW_transform_to_display(GPUTexture *tex, bool use_view_settings)
/* Full screen triangle */
immBegin(GPU_PRIM_TRIS, 3);
- immAttrib2f(texco, 0.0f, 0.0f);
+ immAttr2f(texco, 0.0f, 0.0f);
immVertex2f(pos, -1.0f, -1.0f);
- immAttrib2f(texco, 2.0f, 0.0f);
+ immAttr2f(texco, 2.0f, 0.0f);
immVertex2f(pos, 3.0f, -1.0f);
- immAttrib2f(texco, 0.0f, 2.0f);
+ immAttr2f(texco, 0.0f, 2.0f);
immVertex2f(pos, -1.0f, 3.0f);
immEnd();
@@ -423,6 +420,13 @@ void DRW_engine_viewport_data_size_get(
}
}
+/* WARNING: only use for custom pipeline. 99% of the time, you don't want to use this. */
+void DRW_render_viewport_size_set(int size[2])
+{
+ DST.size[0] = size[0];
+ DST.size[1] = size[1];
+}
+
const float *DRW_viewport_size_get(void)
{
return DST.size;
@@ -958,7 +962,7 @@ static void drw_engines_cache_populate(Object *ob)
DST.ob_state = NULL;
/* HACK: DrawData is copied by COW from the duplicated object.
- * This is valid for IDs that cannot be instanciated but this
+ * This is valid for IDs that cannot be instantiated but this
* is not what we want in this case so we clear the pointer
* ourselves here. */
drw_drawdata_unlink_dupli((ID *)ob);
@@ -1053,49 +1057,9 @@ static void drw_engines_draw_text(void)
}
}
-#define MAX_INFO_LINES 10
-
-/**
- * Returns the offset required for the drawing of engines info.
- */
-int DRW_draw_region_engine_info_offset(void)
-{
- int lines = 0;
- for (LinkData *link = DST.enabled_engines.first; link; link = link->next) {
- DrawEngineType *engine = link->data;
- ViewportEngineData *data = drw_viewport_engine_data_ensure(engine);
-
- /* Count the number of lines. */
- if (data->info[0] != '\0') {
- lines++;
- char *c = data->info;
- while (*c++ != '\0') {
- if (*c == '\n') {
- lines++;
- }
- }
- }
- }
- return MIN2(MAX_INFO_LINES, lines) * UI_UNIT_Y;
-}
-
-/**
- * Actual drawing;
- */
-void DRW_draw_region_engine_info(void)
+/* Draw render engine info. */
+void DRW_draw_region_engine_info(int xoffset, int yoffset)
{
- const char *info_array_final[MAX_INFO_LINES + 1];
- /* This should be maxium number of engines running at the same time. */
- char info_array[MAX_INFO_LINES][GPU_INFO_SIZE];
- int i = 0;
-
- const DRWContextState *draw_ctx = DRW_context_state_get();
- ARegion *ar = draw_ctx->ar;
- float fill_color[4] = {0.0f, 0.0f, 0.0f, 0.25f};
-
- UI_GetThemeColor3fv(TH_HIGH_GRAD, fill_color);
- mul_v3_fl(fill_color, fill_color[3]);
-
for (LinkData *link = DST.enabled_engines.first; link; link = link->next) {
DrawEngineType *engine = link->data;
ViewportEngineData *data = drw_viewport_engine_data_ensure(engine);
@@ -1105,36 +1069,37 @@ void DRW_draw_region_engine_info(void)
char *chr_start = chr_current;
int line_len = 0;
+ const int font_id = BLF_default();
+ UI_FontThemeColor(font_id, TH_TEXT_HI);
+
+ BLF_enable(font_id, BLF_SHADOW);
+ BLF_shadow(font_id, 5, (const float[4]){0.0f, 0.0f, 0.0f, 1.0f});
+ BLF_shadow_offset(font_id, 1, -1);
+
while (*chr_current++ != '\0') {
line_len++;
if (*chr_current == '\n') {
- BLI_strncpy(info_array[i++], chr_start, line_len + 1);
+ char info[GPU_INFO_SIZE];
+ BLI_strncpy(info, chr_start, line_len + 1);
+ yoffset -= U.widget_unit;
+ BLF_draw_default(xoffset, yoffset, 0.0f, info, sizeof(info));
+
/* Re-start counting. */
chr_start = chr_current + 1;
line_len = -1;
}
}
- BLI_strncpy(info_array[i++], chr_start, line_len + 1);
+ char info[GPU_INFO_SIZE];
+ BLI_strncpy(info, chr_start, line_len + 1);
+ yoffset -= U.widget_unit;
+ BLF_draw_default(xoffset, yoffset, 0.0f, info, sizeof(info));
- if (i >= MAX_INFO_LINES) {
- break;
- }
+ BLF_disable(font_id, BLF_SHADOW);
}
}
-
- for (int j = 0; j < i; j++) {
- info_array_final[j] = info_array[j];
- }
- info_array_final[i] = NULL;
-
- if (info_array[0] != NULL) {
- ED_region_info_draw_multiline(ar, info_array_final, fill_color, true);
- }
}
-#undef MAX_INFO_LINES
-
static void use_drw_engine(DrawEngineType *engine)
{
LinkData *ld = MEM_callocN(sizeof(LinkData), "enabled engine link data");
@@ -1153,14 +1118,15 @@ static void drw_engines_enable_external(void)
/* TODO revisit this when proper layering is implemented */
/* Gather all draw engines needed and store them in DST.enabled_engines
* That also define the rendering order of engines */
-static void drw_engines_enable_from_engine(RenderEngineType *engine_type, int drawtype, int shading_flags)
+static void drw_engines_enable_from_engine(RenderEngineType *engine_type, int drawtype, bool use_xray)
{
switch (drawtype) {
case OB_WIRE:
+ use_drw_engine(&draw_engine_workbench_transparent);
break;
case OB_SOLID:
- if (shading_flags & V3D_SHADING_XRAY) {
+ if (use_xray) {
use_drw_engine(&draw_engine_workbench_transparent);
}
else {
@@ -1197,7 +1163,6 @@ static void drw_engines_enable_from_paint_mode(int mode)
use_drw_engine(&draw_engine_sculpt_type);
break;
case CTX_MODE_PAINT_WEIGHT:
- use_drw_engine(&draw_engine_pose_type);
use_drw_engine(&draw_engine_paint_weight_type);
break;
case CTX_MODE_PAINT_VERTEX:
@@ -1217,12 +1182,10 @@ static void drw_engines_enable_from_mode(int mode)
case CTX_MODE_EDIT_MESH:
use_drw_engine(&draw_engine_edit_mesh_type);
break;
+ case CTX_MODE_EDIT_SURFACE:
case CTX_MODE_EDIT_CURVE:
use_drw_engine(&draw_engine_edit_curve_type);
break;
- case CTX_MODE_EDIT_SURFACE:
- use_drw_engine(&draw_engine_edit_surface_type);
- break;
case CTX_MODE_EDIT_TEXT:
use_drw_engine(&draw_engine_edit_text_type);
break;
@@ -1235,20 +1198,21 @@ static void drw_engines_enable_from_mode(int mode)
case CTX_MODE_EDIT_LATTICE:
use_drw_engine(&draw_engine_edit_lattice_type);
break;
- case CTX_MODE_POSE:
- use_drw_engine(&draw_engine_pose_type);
- break;
case CTX_MODE_PARTICLE:
use_drw_engine(&draw_engine_particle_type);
break;
- case CTX_MODE_SCULPT:
+ case CTX_MODE_POSE:
case CTX_MODE_PAINT_WEIGHT:
+ /* The pose engine clears the depth of the default framebuffer
+ * to draw an object with `OB_DRAWXRAY`.
+ * (different of workbench that has its own framebuffer).
+ * So make sure you call its `draw_scene` after all the other engines. */
+ use_drw_engine(&draw_engine_pose_type);
+ break;
+ case CTX_MODE_SCULPT:
case CTX_MODE_PAINT_VERTEX:
case CTX_MODE_PAINT_TEXTURE:
- /* Should have already been enabled */
- break;
case CTX_MODE_OBJECT:
- break;
case CTX_MODE_GPENCIL_PAINT:
case CTX_MODE_GPENCIL_EDIT:
case CTX_MODE_GPENCIL_SCULPT:
@@ -1278,10 +1242,11 @@ static void drw_engines_enable(ViewLayer *view_layer, RenderEngineType *engine_t
{
Object *obact = OBACT(view_layer);
const int mode = CTX_data_mode_enum_ex(DST.draw_ctx.object_edit, obact, DST.draw_ctx.object_mode);
- View3D * v3d = DST.draw_ctx.v3d;
+ View3D *v3d = DST.draw_ctx.v3d;
const int drawtype = v3d->shading.type;
+ const bool use_xray = XRAY_ENABLED(v3d);
- drw_engines_enable_from_engine(engine_type, drawtype, v3d->shading.flag);
+ drw_engines_enable_from_engine(engine_type, drawtype, use_xray);
if (DRW_state_draw_support()) {
/* Draw paint modes first so that they are drawn below the wireframes. */
@@ -1291,6 +1256,10 @@ static void drw_engines_enable(ViewLayer *view_layer, RenderEngineType *engine_t
drw_engines_enable_from_mode(mode);
}
else {
+ /* Force enable overlays engine for wireframe mode */
+ if (v3d->shading.type == OB_WIRE) {
+ drw_engines_enable_from_overlays(v3d->overlay.flag);
+ }
/* if gpencil must draw the strokes, but not the object */
drw_engines_enable_from_mode(mode);
}
@@ -1511,9 +1480,7 @@ void DRW_draw_render_loop_ex(
/* annotations - temporary drawing buffer (3d space) */
/* XXX: Or should we use a proper draw/overlay engine for this case? */
- if (((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) &&
- (do_annotations))
- {
+ if (do_annotations) {
glDisable(GL_DEPTH_TEST);
/* XXX: as scene->gpd is not copied for COW yet */
ED_gpencil_draw_view3d_annotations(DEG_get_input_scene(depsgraph), depsgraph, v3d, ar, true);
@@ -1558,6 +1525,7 @@ void DRW_draw_render_loop_ex(
if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) {
/* Draw 2D after region info so we can draw on top of the camera passepartout overlay.
* 'DRW_draw_region_info' sets the projection in pixel-space. */
+ glDisable(GL_DEPTH_TEST);
DRW_draw_gizmo_2d();
glEnable(GL_DEPTH_TEST);
}
@@ -1569,9 +1537,9 @@ void DRW_draw_render_loop_ex(
ED_view3d_draw_bgpic_test(scene, depsgraph, ar, v3d, true, true);
}
- if (G.debug_value > 20) {
+ if (G.debug_value > 20 && G.debug_value < 30) {
glDisable(GL_DEPTH_TEST);
- rcti rect; /* local coordinate visible rect inside region, to accomodate overlapping ui */
+ rcti rect; /* local coordinate visible rect inside region, to accommodate overlapping ui */
ED_region_visible_rect(DST.draw_ctx.ar, &rect);
DRW_stats_draw(&rect);
glEnable(GL_DEPTH_TEST);
@@ -1643,12 +1611,12 @@ void DRW_draw_render_loop_offscreen(
GPU_offscreen_bind(ofs, false);
}
-/* helper to check if exit object type to render */
-static bool DRW_render_check_grease_pencil(Depsgraph *depsgraph)
+/* Helper to check if exit object type to render. */
+bool DRW_render_check_grease_pencil(Depsgraph *depsgraph)
{
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(depsgraph, ob)
{
- if ((ob->type == OB_GPENCIL) && (DRW_check_object_visible_within_active_context(ob))) {
+ if ((ob->type == OB_GPENCIL) && (DRW_object_is_visible_in_active_context(ob))) {
return true;
}
}
@@ -1670,7 +1638,7 @@ void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph
/* This function is only valid for Cycles
* Eevee done all work in the Eevee render directly.
* Maybe it can be done equal for both engines?
- */
+ */
if (STREQ(engine->type->name, "Eevee")) {
return;
}
@@ -1891,7 +1859,7 @@ void DRW_render_object_iter(
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END
}
-/* Assume a valid gl context is bound (and that the gl_context_mutex has been aquired).
+/* Assume a valid gl context is bound (and that the gl_context_mutex has been acquired).
* This function only setup DST and execute the given function.
* Warning: similar to DRW_render_to_image you cannot use default lists (dfbl & dtxl). */
void DRW_custom_pipeline(
@@ -1987,7 +1955,7 @@ void DRW_render_instance_buffer_finish(void)
void DRW_draw_select_loop(
struct Depsgraph *depsgraph,
ARegion *ar, View3D *v3d,
- bool UNUSED(use_obedit_skip), bool UNUSED(use_nearest), const rcti *rect,
+ bool UNUSED(use_obedit_skip), bool draw_surface, bool UNUSED(use_nearest), const rcti *rect,
DRW_SelectPassFn select_pass_fn, void *select_pass_user_data,
DRW_ObjectFilterFn object_filter_fn, void *object_filter_user_data)
{
@@ -2037,8 +2005,13 @@ void DRW_draw_select_loop(
drw_engines_enable_from_paint_mode(obedit_mode);
drw_engines_enable_from_mode(obedit_mode);
}
+ else if (!draw_surface) {
+ drw_engines_enable_from_overlays(v3d->overlay.flag);
+ drw_engines_enable_from_object_mode();
+ }
else {
drw_engines_enable_basic();
+ drw_engines_enable_from_overlays(v3d->overlay.flag);
drw_engines_enable_from_object_mode();
}
@@ -2184,16 +2157,16 @@ static void draw_depth_texture_to_screen(GPUTexture *texture)
immBegin(GPU_PRIM_TRI_STRIP, 4);
- immAttrib2f(texcoord, 0.0f, 0.0f);
+ immAttr2f(texcoord, 0.0f, 0.0f);
immVertex2f(pos, 0.0f, 0.0f);
- immAttrib2f(texcoord, 1.0f, 0.0f);
+ immAttr2f(texcoord, 1.0f, 0.0f);
immVertex2f(pos, w, 0.0f);
- immAttrib2f(texcoord, 0.0f, 1.0f);
+ immAttr2f(texcoord, 0.0f, 1.0f);
immVertex2f(pos, 0.0f, h);
- immAttrib2f(texcoord, 1.0f, 1.0f);
+ immAttr2f(texcoord, 1.0f, 1.0f);
immVertex2f(pos, w, h);
immEnd();
@@ -2371,8 +2344,8 @@ bool DRW_state_is_scene_render(void)
}
/**
-* Whether we are rendering simple opengl render
-*/
+ * Whether we are rendering simple opengl render
+ */
bool DRW_state_is_opengl_render(void)
{
return DST.options.is_image_render && !DST.options.is_scene_render;
@@ -2457,7 +2430,6 @@ void DRW_engines_register(void)
DRW_engine_register(&draw_engine_edit_lattice_type);
DRW_engine_register(&draw_engine_edit_mesh_type);
DRW_engine_register(&draw_engine_edit_metaball_type);
- DRW_engine_register(&draw_engine_edit_surface_type);
DRW_engine_register(&draw_engine_edit_text_type);
DRW_engine_register(&draw_engine_motion_path_type);
DRW_engine_register(&draw_engine_overlay_type);
@@ -2513,6 +2485,7 @@ void DRW_engines_register(void)
extern struct GPUVertFormat *g_pos_format; /* draw_shgroup.c */
extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */
extern struct GPUTexture *globals_ramp; /* draw_common.c */
+extern struct GPUTexture *globals_weight_ramp; /* draw_common.c */
void DRW_engines_free(void)
{
DRW_opengl_context_enable();
@@ -2538,6 +2511,7 @@ void DRW_engines_free(void)
DRW_UBO_FREE_SAFE(globals_ubo);
DRW_UBO_FREE_SAFE(view_ubo);
DRW_TEXTURE_FREE_SAFE(globals_ramp);
+ DRW_TEXTURE_FREE_SAFE(globals_weight_ramp);
MEM_SAFE_FREE(g_pos_format);
MEM_SAFE_FREE(DST.RST.bound_texs);
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index 902ecb9ee9b..c8a7816c402 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -101,6 +101,7 @@ enum {
DRW_CALL_NORMALWORLD = (1 << 5),
DRW_CALL_ORCOTEXFAC = (1 << 6),
DRW_CALL_EYEVEC = (1 << 7),
+ DRW_CALL_OBJECTINFO = (1 << 8),
};
typedef struct DRWCallState {
@@ -120,8 +121,9 @@ typedef struct DRWCallState {
float modelviewinverse[4][4];
float modelviewprojection[4][4];
float normalview[3][3];
- float normalworld[3][3]; /* Not view dependant */
- float orcotexfac[2][3]; /* Not view dependant */
+ float normalworld[3][3]; /* Not view dependent */
+ float orcotexfac[2][3]; /* Not view dependent */
+ float objectinfo[2];
float eyevec[3];
} DRWCallState;
@@ -140,6 +142,7 @@ typedef struct DRWCall {
union {
struct { /* type == DRW_CALL_SINGLE */
GPUBatch *geometry;
+ short ma_index;
} single;
struct { /* type == DRW_CALL_RANGE */
GPUBatch *geometry;
@@ -257,14 +260,13 @@ struct DRWShadingGroup {
int orcotexfac;
int eye;
int callid;
+ int objectinfo;
uint16_t matflag; /* Matrices needed, same as DRWCall.flag */
+ DRWPass *pass_parent; /* backlink to pass we're in */
#ifndef NDEBUG
char attribs_count;
#endif
-#if !defined(NDEBUG) || defined(USE_GPU_SELECT)
- DRWPass *pass_parent; /* backlink to pass we're in */
-#endif
#ifdef USE_GPU_SELECT
GPUVertBuf *inst_selectid;
int override_selectid; /* Override for single object instances. */
@@ -355,9 +357,9 @@ typedef struct DRWManager {
bool buffer_finish_called; /* Avoid bad usage of DRW_render_instance_buffer_finish */
- /* View dependant uniforms. */
+ /* View dependent uniforms. */
DRWMatrixState original_mat; /* Original rv3d matrices. */
- int override_mat; /* Bitflag of which matrices are overriden. */
+ int override_mat; /* Bitflag of which matrices are overridden. */
int num_clip_planes; /* Number of active clipplanes. */
bool dirty_mat;
@@ -381,7 +383,7 @@ typedef struct DRWManager {
* the top portion of the struct so DO NOT MOVE IT! */
void *gl_context; /* Unique ghost context used by the draw manager. */
GPUContext *gpu_context;
- TicketMutex *gl_context_mutex; /* Mutex to lock the drw manager and avoid concurent context usage. */
+ TicketMutex *gl_context_mutex; /* Mutex to lock the drw manager and avoid concurrent context usage. */
/** GPU Resource State: Memory storage between drawing. */
struct {
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 96e862d2439..e9d874bd1ee 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -36,6 +36,7 @@
#include "DNA_mesh_types.h"
#include "DNA_meta_types.h"
+#include "BLI_hash.h"
#include "BLI_link_utils.h"
#include "BLI_mempool.h"
@@ -145,7 +146,7 @@ void DRW_shgroup_uniform_texture(DRWShadingGroup *shgroup, const char *name, con
drw_shgroup_uniform(shgroup, name, DRW_UNIFORM_TEXTURE, tex, 0, 1);
}
-/* Same as DRW_shgroup_uniform_texture but is garanteed to be bound if shader does not change between shgrp. */
+/* Same as DRW_shgroup_uniform_texture but is guaranteed to be bound if shader does not change between shgrp. */
void DRW_shgroup_uniform_texture_persistent(DRWShadingGroup *shgroup, const char *name, const GPUTexture *tex)
{
BLI_assert(tex != NULL);
@@ -158,7 +159,7 @@ void DRW_shgroup_uniform_block(DRWShadingGroup *shgroup, const char *name, const
drw_shgroup_uniform(shgroup, name, DRW_UNIFORM_BLOCK, ubo, 0, 1);
}
-/* Same as DRW_shgroup_uniform_block but is garanteed to be bound if shader does not change between shgrp. */
+/* Same as DRW_shgroup_uniform_block but is guaranteed to be bound if shader does not change between shgrp. */
void DRW_shgroup_uniform_block_persistent(DRWShadingGroup *shgroup, const char *name, const GPUUniformBuffer *ubo)
{
BLI_assert(ubo != NULL);
@@ -220,6 +221,11 @@ void DRW_shgroup_uniform_ivec3(DRWShadingGroup *shgroup, const char *name, const
drw_shgroup_uniform(shgroup, name, DRW_UNIFORM_INT, value, 3, arraysize);
}
+void DRW_shgroup_uniform_ivec4(DRWShadingGroup *shgroup, const char *name, const int *value, int arraysize)
+{
+ drw_shgroup_uniform(shgroup, name, DRW_UNIFORM_INT, value, 4, arraysize);
+}
+
void DRW_shgroup_uniform_mat3(DRWShadingGroup *shgroup, const char *name, const float (*value)[3])
{
drw_shgroup_uniform(shgroup, name, DRW_UNIFORM_FLOAT, (float *)value, 9, 1);
@@ -339,6 +345,22 @@ static DRWCallState *drw_call_state_create(DRWShadingGroup *shgroup, float (*obm
state->matflag &= ~DRW_CALL_ORCOTEXFAC;
}
+ if ((state->matflag & DRW_CALL_OBJECTINFO) != 0) {
+ state->objectinfo[0] = ob ? ob->index : 0;
+ unsigned int random;
+#if 0 /* TODO(fclem) handle dupli objects */
+ if (GMS.dob) {
+ random = GMS.dob->random_id;
+ }
+ else
+#endif
+ {
+ random = BLI_hash_int_2d(BLI_hash_string(ob->id.name + 2), 0);
+ }
+ state->objectinfo[1] = random * (1.0f / (float)0xFFFFFFFF);
+ state->matflag &= ~DRW_CALL_OBJECTINFO;
+ }
+
return state;
}
@@ -435,7 +457,7 @@ void DRW_shgroup_call_object_procedural_triangles_culled_add(DRWShadingGroup *sh
}
/* These calls can be culled and are optimized for redraw */
-void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, GPUBatch *geom, Object *ob, bool bypass_culling)
+void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, GPUBatch *geom, Object *ob, Material *ma, bool bypass_culling)
{
BLI_assert(geom != NULL);
BLI_assert(ELEM(shgroup->type, DRW_SHG_NORMAL, DRW_SHG_FEEDBACK_TRANSFORM));
@@ -444,6 +466,7 @@ void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, GPUBatch *geom, Ob
call->state = drw_call_state_object(shgroup, ob->obmat, ob);
call->type = DRW_CALL_SINGLE;
call->single.geometry = geom;
+ call->single.ma_index = ma ? ma->index : 0;
#ifdef USE_GPU_SELECT
call->select_id = DST.select_id;
#endif
@@ -455,7 +478,7 @@ void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, GPUBatch *geom, Ob
}
void DRW_shgroup_call_object_add_with_callback(
- DRWShadingGroup *shgroup, GPUBatch *geom, Object *ob,
+ DRWShadingGroup *shgroup, GPUBatch *geom, Object *ob, Material *ma,
DRWCallVisibilityFn *callback, void *user_data)
{
BLI_assert(geom != NULL);
@@ -467,6 +490,7 @@ void DRW_shgroup_call_object_add_with_callback(
call->state->user_data = user_data;
call->type = DRW_CALL_SINGLE;
call->single.geometry = geom;
+ call->single.ma_index = ma ? ma->index : 0;
#ifdef USE_GPU_SELECT
call->select_id = DST.select_id;
#endif
@@ -535,11 +559,23 @@ static void sculpt_draw_cb(
void *user_data)
{
Object *ob = user_data;
- PBVH *pbvh = ob->sculpt->pbvh;
+
+ /* XXX should be ensured before but sometime it's not... go figure (see T57040). */
+ PBVH *pbvh = BKE_sculpt_object_pbvh_ensure(DST.draw_ctx.depsgraph, ob);
+
+ const DRWContextState *drwctx = DRW_context_state_get();
+ int fast_mode = 0;
+
+ if (drwctx->evil_C != NULL) {
+ Paint *p = BKE_paint_get_active_from_context(drwctx->evil_C);
+ if (p && (p->flags & PAINT_FAST_NAVIGATE)) {
+ fast_mode = drwctx->rv3d->rflag & RV3D_NAVIGATING;
+ }
+ }
if (pbvh) {
BKE_pbvh_draw_cb(
- pbvh, NULL, NULL, false, false,
+ pbvh, NULL, NULL, fast_mode, false,
(void (*)(void *, GPUBatch *))draw_fn, shgroup);
}
}
@@ -618,6 +654,7 @@ static void drw_shgroup_init(DRWShadingGroup *shgroup, GPUShader *shader)
shgroup->normalview = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_NORMAL);
shgroup->normalworld = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_WORLDNORMAL);
shgroup->orcotexfac = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_ORCO);
+ shgroup->objectinfo = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_OBJECT_INFO);
shgroup->eye = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_EYE);
shgroup->callid = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_CALLID);
@@ -636,6 +673,8 @@ static void drw_shgroup_init(DRWShadingGroup *shgroup, GPUShader *shader)
shgroup->matflag |= DRW_CALL_NORMALWORLD;
if (shgroup->orcotexfac > -1)
shgroup->matflag |= DRW_CALL_ORCOTEXFAC;
+ if (shgroup->objectinfo > -1)
+ shgroup->matflag |= DRW_CALL_OBJECTINFO;
if (shgroup->eye > -1)
shgroup->matflag |= DRW_CALL_EYEVEC;
}
@@ -729,10 +768,7 @@ static DRWShadingGroup *drw_shgroup_create_ex(struct GPUShader *shader, DRWPass
shgroup->instance_geom = NULL;
shgroup->instance_vbo = NULL;
#endif
-
-#if !defined(NDEBUG) || defined(USE_GPU_SELECT)
shgroup->pass_parent = pass;
-#endif
return shgroup;
}
@@ -945,7 +981,7 @@ void DRW_shgroup_instance_batch(DRWShadingGroup *shgroup, struct GPUBatch *batch
drw_call_calc_orco(NULL, shgroup->instance_orcofac);
/* PERF : This destroys the vaos cache so better check if it's necessary. */
/* Note: This WILL break if batch->verts[0] is destroyed and reallocated
- * at the same adress. Bindings/VAOs would remain obsolete. */
+ * at the same address. Bindings/VAOs would remain obsolete. */
//if (shgroup->instancing_geom->inst != batch->verts[0])
GPU_batch_instbuf_set(shgroup->instance_geom, batch->verts[0], false);
@@ -996,6 +1032,23 @@ bool DRW_shgroup_is_empty(DRWShadingGroup *shgroup)
return true;
}
+DRWShadingGroup *DRW_shgroup_create_sub(DRWShadingGroup *shgroup)
+{
+ /* Remove this assertion if needed but implement the other cases first! */
+ BLI_assert(shgroup->type == DRW_SHG_NORMAL);
+
+ DRWShadingGroup *shgroup_new = BLI_mempool_alloc(DST.vmempool->shgroups);
+
+ *shgroup_new = *shgroup;
+ shgroup_new->uniforms = NULL; /* Not sure about that.. Should we copy them instead? */
+ shgroup_new->calls.first = NULL;
+ shgroup_new->calls.last = NULL;
+
+ BLI_LINKS_INSERT_AFTER(&shgroup->pass_parent->shgroups, shgroup, shgroup_new);
+
+ return shgroup_new;
+}
+
/** \} */
/* -------------------------------------------------------------------- */
@@ -1007,7 +1060,9 @@ DRWPass *DRW_pass_create(const char *name, DRWState state)
{
DRWPass *pass = BLI_mempool_alloc(DST.vmempool->passes);
pass->state = state;
- if ((G.debug_value > 20) || (G.debug & G_DEBUG)) {
+ if (((G.debug_value > 20) && (G.debug_value < 30)) ||
+ (G.debug & G_DEBUG))
+ {
BLI_strncpy(pass->name, name, MAX_PASS_NAME);
}
@@ -1106,7 +1161,7 @@ static int pass_shgroup_dist_sort(void *thunk, const void *a, const void *b)
/**
* Sort Shading groups by decreasing Z of their first draw call.
- * This is usefull for order dependant effect such as transparency.
+ * This is useful for order dependent effect such as transparency.
**/
void DRW_pass_sort_shgroup_z(DRWPass *pass)
{
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 3180cf5c459..2d56c7e0cfe 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -193,14 +193,14 @@ void drw_state_set(DRWState state)
{
if (CHANGED_ANY(DRW_STATE_WIRE | DRW_STATE_WIRE_SMOOTH)) {
if ((state & DRW_STATE_WIRE_SMOOTH) != 0) {
- glLineWidth(2.0f);
- glEnable(GL_LINE_SMOOTH);
+ GPU_line_width(2.0f);
+ GPU_line_smooth(true);
}
else if ((state & DRW_STATE_WIRE) != 0) {
- glLineWidth(1.0f);
+ GPU_line_width(1.0f);
}
else {
- glDisable(GL_LINE_SMOOTH);
+ GPU_line_smooth(false);
}
}
}
@@ -224,7 +224,7 @@ void drw_state_set(DRWState state)
int test;
if (CHANGED_ANY_STORE_VAR(
DRW_STATE_BLEND | DRW_STATE_BLEND_PREMUL | DRW_STATE_ADDITIVE |
- DRW_STATE_MULTIPLY | DRW_STATE_TRANSMISSION | DRW_STATE_ADDITIVE_FULL |
+ DRW_STATE_MULTIPLY | DRW_STATE_ADDITIVE_FULL |
DRW_STATE_BLEND_OIT,
test))
{
@@ -241,9 +241,6 @@ void drw_state_set(DRWState state)
else if ((state & DRW_STATE_MULTIPLY) != 0) {
glBlendFunc(GL_DST_COLOR, GL_ZERO);
}
- else if ((state & DRW_STATE_TRANSMISSION) != 0) {
- glBlendFunc(GL_ONE, GL_SRC_ALPHA);
- }
else if ((state & DRW_STATE_BLEND_OIT) != 0) {
glBlendFuncSeparate(GL_ONE, GL_ONE, /* RGB */
GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); /* Alpha */
@@ -788,7 +785,7 @@ static void draw_matrices_model_prepare(DRWCallState *st)
/* set eye vector, transformed to object coords */
mul_m3_v3(tmp, st->eyevec);
}
- /* Non view dependant */
+ /* Non view dependent */
if (st->matflag & DRW_CALL_MODELINVERSE) {
invert_m4_m4(st->modelinverse, st->model);
st->matflag &= ~DRW_CALL_MODELINVERSE;
@@ -801,10 +798,16 @@ static void draw_matrices_model_prepare(DRWCallState *st)
}
}
-static void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCallState *state)
+static void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCall *call)
{
/* step 1 : bind object dependent matrices */
- if (state != NULL) {
+ if (call != NULL) {
+ DRWCallState *state = call->state;
+ float objectinfo[3];
+ objectinfo[0] = state->objectinfo[0];
+ objectinfo[1] = call->single.ma_index; /* WATCH this is only valid for single drawcalls. */
+ objectinfo[2] = state->objectinfo[1];
+
GPU_shader_uniform_vector(shgroup->shader, shgroup->model, 16, 1, (float *)state->model);
GPU_shader_uniform_vector(shgroup->shader, shgroup->modelinverse, 16, 1, (float *)state->modelinverse);
GPU_shader_uniform_vector(shgroup->shader, shgroup->modelview, 16, 1, (float *)state->modelview);
@@ -812,6 +815,7 @@ static void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCallState *state)
GPU_shader_uniform_vector(shgroup->shader, shgroup->modelviewprojection, 16, 1, (float *)state->modelviewprojection);
GPU_shader_uniform_vector(shgroup->shader, shgroup->normalview, 9, 1, (float *)state->normalview);
GPU_shader_uniform_vector(shgroup->shader, shgroup->normalworld, 9, 1, (float *)state->normalworld);
+ GPU_shader_uniform_vector(shgroup->shader, shgroup->objectinfo, 3, 1, (float *)objectinfo);
GPU_shader_uniform_vector(shgroup->shader, shgroup->orcotexfac, 3, 2, (float *)state->orcotexfac);
GPU_shader_uniform_vector(shgroup->shader, shgroup->eye, 3, 1, (float *)state->eyevec);
}
@@ -825,6 +829,7 @@ static void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCallState *state)
GPU_shader_uniform_vector(shgroup->shader, shgroup->modelview, 16, 1, (float *)DST.view_data.matstate.mat[DRW_MAT_VIEW]);
GPU_shader_uniform_vector(shgroup->shader, shgroup->modelviewinverse, 16, 1, (float *)DST.view_data.matstate.mat[DRW_MAT_VIEWINV]);
GPU_shader_uniform_vector(shgroup->shader, shgroup->modelviewprojection, 16, 1, (float *)DST.view_data.matstate.mat[DRW_MAT_PERS]);
+ GPU_shader_uniform_vector(shgroup->shader, shgroup->objectinfo, 3, 1, (float *)unitmat);
GPU_shader_uniform_vector(shgroup->shader, shgroup->orcotexfac, 3, 2, (float *)shgroup->instance_orcofac);
}
}
@@ -908,7 +913,7 @@ static void bind_ubo(GPUUniformBuffer *ubo, char bind_type)
/* printf so user can report bad behaviour */
printf("Not enough ubo slots! This should not happen!\n");
/* This is not depending on user input.
- * It is our responsability to make sure there is enough slots. */
+ * It is our responsibility to make sure there is enough slots. */
BLI_assert(0);
}
slot_flags[bind_num] = bind_type;
@@ -1205,7 +1210,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
}
GPU_SELECT_LOAD_IF_PICKSEL_CALL(call);
- draw_geometry_prepare(shgroup, call->state);
+ draw_geometry_prepare(shgroup, call);
switch (call->type) {
case DRW_CALL_SINGLE:
diff --git a/source/blender/draw/intern/draw_manager_profiling.c b/source/blender/draw/intern/draw_manager_profiling.c
index edeb6c07733..3900117327e 100644
--- a/source/blender/draw/intern/draw_manager_profiling.c
+++ b/source/blender/draw/intern/draw_manager_profiling.c
@@ -81,7 +81,7 @@ void DRW_stats_free(void)
void DRW_stats_begin(void)
{
- if (G.debug_value > 20) {
+ if (G.debug_value > 20 && G.debug_value < 30) {
DTP.is_recording = true;
}
diff --git a/source/blender/draw/intern/draw_manager_shader.c b/source/blender/draw/intern/draw_manager_shader.c
index 0c44acb3f9c..bb580695865 100644
--- a/source/blender/draw/intern/draw_manager_shader.c
+++ b/source/blender/draw/intern/draw_manager_shader.c
@@ -134,7 +134,10 @@ static void drw_deferred_shader_compilation_exec(void *custom_data, short *stop,
glFlush();
BLI_mutex_unlock(&comp->compilation_lock);
+ BLI_spin_lock(&comp->list_lock);
drw_deferred_shader_free(comp->mat_compiling);
+ comp->mat_compiling = NULL;
+ BLI_spin_unlock(&comp->list_lock);
}
WM_opengl_context_release(gl_context);
@@ -239,12 +242,11 @@ void DRW_deferred_shader_remove(GPUMaterial *mat)
}
/* Wait for compilation to finish */
- if (comp->mat_compiling != NULL) {
- if (comp->mat_compiling->mat == mat) {
- BLI_mutex_lock(&comp->compilation_lock);
- BLI_mutex_unlock(&comp->compilation_lock);
- }
+ if ((comp->mat_compiling != NULL) && (comp->mat_compiling->mat == mat)) {
+ BLI_mutex_lock(&comp->compilation_lock);
+ BLI_mutex_unlock(&comp->compilation_lock);
}
+
BLI_spin_unlock(&comp->list_lock);
if (dsh) {
@@ -293,7 +295,7 @@ GPUShader *DRW_shader_create_with_transform_feedback(
const char *vert, const char *geom, const char *defines,
const GPUShaderTFBType prim_type, const char **varying_names, const int varying_count)
{
- return GPU_shader_create_ex(vert, NULL, geom, NULL, defines, GPU_SHADER_FLAGS_NONE,
+ return GPU_shader_create_ex(vert, NULL, geom, NULL, defines,
prim_type, varying_names, varying_count, __func__);
}
diff --git a/source/blender/draw/intern/draw_manager_text.c b/source/blender/draw/intern/draw_manager_text.c
index b32853959c8..1a183e14d60 100644
--- a/source/blender/draw/intern/draw_manager_text.c
+++ b/source/blender/draw/intern/draw_manager_text.c
@@ -50,7 +50,7 @@ typedef struct ViewCachedString {
int pack;
} col;
short sco[2];
- short xoffs;
+ short xoffs, yoffs;
short flag;
int str_len;
@@ -78,7 +78,7 @@ void DRW_text_cache_add(
DRWTextStore *dt,
const float co[3],
const char *str, const int str_len,
- short xoffs, short flag,
+ short xoffs, short yoffs, short flag,
const uchar col[4])
{
int alloc_len;
@@ -99,6 +99,7 @@ void DRW_text_cache_add(
copy_v3_v3(vos->vec, co);
copy_v4_v4_uchar(vos->col.ub, col);
vos->xoffs = xoffs;
+ vos->yoffs = yoffs;
vos->flag = flag;
vos->str_len = str_len;
@@ -162,7 +163,7 @@ void DRW_text_cache_draw(DRWTextStore *dt, ARegion *ar)
BLF_position(
font_id,
- (float)(vos->sco[0] + vos->xoffs), (float)(vos->sco[1]), 2.0f);
+ (float)(vos->sco[0] + vos->xoffs), (float)(vos->sco[1] + vos->yoffs), 2.0f);
((vos->flag & DRW_TEXT_CACHE_ASCII) ?
BLF_draw_ascii :
diff --git a/source/blender/draw/intern/draw_manager_text.h b/source/blender/draw/intern/draw_manager_text.h
index 14c33be4cf8..6798f36e7f4 100644
--- a/source/blender/draw/intern/draw_manager_text.h
+++ b/source/blender/draw/intern/draw_manager_text.h
@@ -33,7 +33,7 @@ void DRW_text_cache_add(
struct DRWTextStore *dt,
const float co[3],
const char *str, const int str_len,
- short xoffs, short flag,
+ short xoffs, short yoffs, short flag,
const uchar col[4]);
void DRW_text_cache_draw(struct DRWTextStore *dt, struct ARegion *ar);
diff --git a/source/blender/draw/intern/draw_view.c b/source/blender/draw/intern/draw_view.c
index 31a79bcda94..70049a5c345 100644
--- a/source/blender/draw/intern/draw_view.c
+++ b/source/blender/draw/intern/draw_view.c
@@ -62,19 +62,10 @@ void DRW_draw_region_info(void)
{
const DRWContextState *draw_ctx = DRW_context_state_get();
ARegion *ar = draw_ctx->ar;
- int offset = 0;
DRW_draw_cursor();
- if ((draw_ctx->v3d->overlay.flag & V3D_OVERLAY_HIDE_TEXT) == 0) {
- offset = DRW_draw_region_engine_info_offset();
- }
-
- view3d_draw_region_info(draw_ctx->evil_C, ar, offset);
-
- if (offset > 0) {
- DRW_draw_region_engine_info();
- }
+ view3d_draw_region_info(draw_ctx->evil_C, ar);
}
/* ************************* Background ************************** */
@@ -108,11 +99,11 @@ void DRW_draw_background(void)
UI_GetThemeColor3ubv(TH_HIGH_GRAD, col_hi);
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib3ubv(color, col_lo);
+ immAttr3ubv(color, col_lo);
immVertex2f(pos, -1.0f, -1.0f);
immVertex2f(pos, 1.0f, -1.0f);
- immAttrib3ubv(color, col_hi);
+ immAttr3ubv(color, col_hi);
immVertex2f(pos, 1.0f, 1.0f);
immVertex2f(pos, -1.0f, 1.0f);
immEnd();
@@ -136,17 +127,16 @@ void DRW_draw_background(void)
static bool is_cursor_visible(const DRWContextState *draw_ctx, Scene *scene, ViewLayer *view_layer)
{
- Object *ob = OBACT(view_layer);
View3D *v3d = draw_ctx->v3d;
if ((v3d->flag2 & V3D_RENDER_OVERRIDE) || (v3d->overlay.flag & V3D_OVERLAY_HIDE_CURSOR)) {
return false;
}
/* don't draw cursor in paint modes, but with a few exceptions */
- if (ob && draw_ctx->object_mode & OB_MODE_ALL_PAINT) {
+ if (draw_ctx->object_mode & OB_MODE_ALL_PAINT) {
/* exception: object is in weight paint and has deforming armature in pose mode */
if (draw_ctx->object_mode & OB_MODE_WEIGHT_PAINT) {
- if (BKE_object_pose_armature_get(ob) != NULL) {
+ if (BKE_object_pose_armature_get(draw_ctx->obact) != NULL) {
return true;
}
}
@@ -164,6 +154,10 @@ static bool is_cursor_visible(const DRWContextState *draw_ctx, Scene *scene, Vie
/* no exception met? then don't draw cursor! */
return false;
}
+ else if (draw_ctx->object_mode & OB_MODE_GPENCIL_WEIGHT) {
+ /* grease pencil hide always in some modes */
+ return false;
+ }
return true;
}
diff --git a/source/blender/draw/modes/draw_mode_engines.h b/source/blender/draw/modes/draw_mode_engines.h
index 8e8ddfef5a4..059724384ea 100644
--- a/source/blender/draw/modes/draw_mode_engines.h
+++ b/source/blender/draw/modes/draw_mode_engines.h
@@ -32,7 +32,6 @@ extern DrawEngineType draw_engine_edit_curve_type;
extern DrawEngineType draw_engine_edit_lattice_type;
extern DrawEngineType draw_engine_edit_mesh_type;
extern DrawEngineType draw_engine_edit_metaball_type;
-extern DrawEngineType draw_engine_edit_surface_type;
extern DrawEngineType draw_engine_edit_text_type;
extern DrawEngineType draw_engine_motion_path_type;
extern DrawEngineType draw_engine_paint_texture_type;
diff --git a/source/blender/draw/modes/edit_curve_mode.c b/source/blender/draw/modes/edit_curve_mode.c
index 568cf77677d..e5fd199b69a 100644
--- a/source/blender/draw/modes/edit_curve_mode.c
+++ b/source/blender/draw/modes/edit_curve_mode.c
@@ -47,13 +47,11 @@ extern struct GlobalsUboStorage ts; /* draw_common.c */
extern char datatoc_common_globals_lib_glsl[];
extern char datatoc_edit_curve_overlay_loosevert_vert_glsl[];
-extern char datatoc_edit_curve_overlay_frag_glsl[];
+extern char datatoc_edit_curve_overlay_handle_vert_glsl[];
extern char datatoc_edit_curve_overlay_handle_geom_glsl[];
-extern char datatoc_gpu_shader_3D_vert_glsl[];
-extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
-extern char datatoc_gpu_shader_point_uniform_color_frag_glsl[];
-extern char datatoc_gpu_shader_flat_color_frag_glsl[];
+extern char datatoc_gpu_shader_point_varying_color_frag_glsl[];
+extern char datatoc_gpu_shader_3D_smooth_color_frag_glsl[];
/* *********** LISTS *********** */
/* All lists are per viewport specific datas.
@@ -63,43 +61,20 @@ extern char datatoc_gpu_shader_flat_color_frag_glsl[];
* for EDIT_CURVE_PassList */
typedef struct EDIT_CURVE_PassList {
- /* Declare all passes here and init them in
- * EDIT_CURVE_cache_init().
- * Only contains (DRWPass *) */
struct DRWPass *wire_pass;
struct DRWPass *overlay_edge_pass;
struct DRWPass *overlay_vert_pass;
} EDIT_CURVE_PassList;
-typedef struct EDIT_CURVE_FramebufferList {
- /* Contains all framebuffer objects needed by this engine.
- * Only contains (GPUFrameBuffer *) */
- struct GPUFrameBuffer *fb;
-} EDIT_CURVE_FramebufferList;
-
-typedef struct EDIT_CURVE_TextureList {
- /* Contains all framebuffer textures / utility textures
- * needed by this engine. Only viewport specific textures
- * (not per object). Only contains (GPUTexture *) */
- struct GPUTexture *texture;
-} EDIT_CURVE_TextureList;
-
typedef struct EDIT_CURVE_StorageList {
- /* Contains any other memory block that the engine needs.
- * Only directly MEM_(m/c)allocN'ed blocks because they are
- * free with MEM_freeN() when viewport is freed.
- * (not per object) */
struct CustomStruct *block;
struct EDIT_CURVE_PrivateData *g_data;
} EDIT_CURVE_StorageList;
typedef struct EDIT_CURVE_Data {
- /* Struct returned by DRW_viewport_engine_data_ensure.
- * If you don't use one of these, just make it a (void *) */
- // void *fbl;
void *engine_type; /* Required */
- EDIT_CURVE_FramebufferList *fbl;
- EDIT_CURVE_TextureList *txl;
+ DRWViewportEmptyList *fbl;
+ DRWViewportEmptyList *txl;
EDIT_CURVE_PassList *psl;
EDIT_CURVE_StorageList *stl;
} EDIT_CURVE_Data;
@@ -107,27 +82,19 @@ typedef struct EDIT_CURVE_Data {
/* *********** STATIC *********** */
static struct {
- /* Custom shaders :
- * Add sources to source/blender/draw/modes/shaders
- * init in EDIT_CURVE_engine_init();
- * free in EDIT_CURVE_engine_free(); */
-
GPUShader *wire_sh;
-
GPUShader *overlay_edge_sh; /* handles and nurbs control cage */
GPUShader *overlay_vert_sh;
-
} e_data = {NULL}; /* Engine data */
typedef struct EDIT_CURVE_PrivateData {
- /* This keeps the references of the shading groups for
- * easy access in EDIT_CURVE_cache_populate() */
-
/* resulting curve as 'wire' for curves (and optionally normals) */
DRWShadingGroup *wire_shgrp;
DRWShadingGroup *overlay_edge_shgrp;
DRWShadingGroup *overlay_vert_shgrp;
+
+ int show_handles;
} EDIT_CURVE_PrivateData; /* Transient data */
/* *********** FUNCTIONS *********** */
@@ -135,45 +102,24 @@ typedef struct EDIT_CURVE_PrivateData {
/* Init Textures, Framebuffers, Storage and Shaders.
* It is called for every frames.
* (Optional) */
-static void EDIT_CURVE_engine_init(void *vedata)
+static void EDIT_CURVE_engine_init(void *UNUSED(vedata))
{
- EDIT_CURVE_TextureList *txl = ((EDIT_CURVE_Data *)vedata)->txl;
- EDIT_CURVE_FramebufferList *fbl = ((EDIT_CURVE_Data *)vedata)->fbl;
- EDIT_CURVE_StorageList *stl = ((EDIT_CURVE_Data *)vedata)->stl;
-
- UNUSED_VARS(txl, fbl, stl);
-
- /* Init Framebuffers like this: order is attachment order (for color texs) */
- /*
- * DRWFboTexture tex[2] = {{&txl->depth, GPU_DEPTH_COMPONENT24, 0},
- * {&txl->color, GPU_RGBA8, DRW_TEX_FILTER}};
- */
-
- /* DRW_framebuffer_init takes care of checking if
- * the framebuffer is valid and has the right size*/
- /*
- * float *viewport_size = DRW_viewport_size_get();
- * DRW_framebuffer_init(&fbl->occlude_wire_fb,
- * (int)viewport_size[0], (int)viewport_size[1],
- * tex, 2);
- */
-
if (!e_data.wire_sh) {
e_data.wire_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR);
}
if (!e_data.overlay_edge_sh) {
e_data.overlay_edge_sh = DRW_shader_create_with_lib(
- datatoc_edit_curve_overlay_loosevert_vert_glsl,
+ datatoc_edit_curve_overlay_handle_vert_glsl,
datatoc_edit_curve_overlay_handle_geom_glsl,
- datatoc_gpu_shader_flat_color_frag_glsl,
+ datatoc_gpu_shader_3D_smooth_color_frag_glsl,
datatoc_common_globals_lib_glsl, NULL);
}
if (!e_data.overlay_vert_sh) {
e_data.overlay_vert_sh = DRW_shader_create_with_lib(
datatoc_edit_curve_overlay_loosevert_vert_glsl, NULL,
- datatoc_edit_curve_overlay_frag_glsl,
+ datatoc_gpu_shader_point_varying_color_frag_glsl,
datatoc_common_globals_lib_glsl, NULL);
}
}
@@ -184,12 +130,16 @@ static void EDIT_CURVE_cache_init(void *vedata)
{
EDIT_CURVE_PassList *psl = ((EDIT_CURVE_Data *)vedata)->psl;
EDIT_CURVE_StorageList *stl = ((EDIT_CURVE_Data *)vedata)->stl;
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ View3D *v3d = draw_ctx->v3d;
if (!stl->g_data) {
/* Alloc transient pointers */
- stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__);
+ stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__);
}
+ stl->g_data->show_handles = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) != 0;
+
{
DRWShadingGroup *grp;
@@ -202,46 +152,37 @@ static void EDIT_CURVE_cache_init(void *vedata)
DRW_shgroup_uniform_vec4(grp, "color", ts.colorWireEdit, 1);
stl->g_data->wire_shgrp = grp;
-
psl->overlay_edge_pass = DRW_pass_create(
"Curve Handle Overlay",
- DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_WIRE);
+ DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND);
grp = DRW_shgroup_create(e_data.overlay_edge_sh, psl->overlay_edge_pass);
DRW_shgroup_uniform_block(grp, "globalsBlock", globals_ubo);
DRW_shgroup_uniform_vec2(grp, "viewportSize", DRW_viewport_size_get(), 1);
+ DRW_shgroup_uniform_bool(grp, "showCurveHandles", &stl->g_data->show_handles, 1);
stl->g_data->overlay_edge_shgrp = grp;
psl->overlay_vert_pass = DRW_pass_create(
"Curve Vert Overlay",
- DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_POINT);
+ DRW_STATE_WRITE_COLOR | DRW_STATE_POINT);
grp = DRW_shgroup_create(e_data.overlay_vert_sh, psl->overlay_vert_pass);
DRW_shgroup_uniform_block(grp, "globalsBlock", globals_ubo);
DRW_shgroup_uniform_vec2(grp, "viewportSize", DRW_viewport_size_get(), 1);
stl->g_data->overlay_vert_shgrp = grp;
}
-
}
/* Add geometry to shadingGroups. Execute for each objects */
static void EDIT_CURVE_cache_populate(void *vedata, Object *ob)
{
- EDIT_CURVE_PassList *psl = ((EDIT_CURVE_Data *)vedata)->psl;
EDIT_CURVE_StorageList *stl = ((EDIT_CURVE_Data *)vedata)->stl;
const DRWContextState *draw_ctx = DRW_context_state_get();
View3D *v3d = draw_ctx->v3d;
- UNUSED_VARS(psl, stl);
-
if (ob->type == OB_CURVE) {
-#if 0
- if (ob == draw_ctx->object_edit)
-#else
- if ((ob == draw_ctx->object_edit) || BKE_object_is_in_editmode(ob))
-#endif
- {
+ if (BKE_object_is_in_editmode(ob)) {
Curve *cu = ob->data;
/* Get geometry cache */
struct GPUBatch *geom;
@@ -249,65 +190,52 @@ static void EDIT_CURVE_cache_populate(void *vedata, Object *ob)
geom = DRW_cache_curve_edge_wire_get(ob);
DRW_shgroup_call_add(stl->g_data->wire_shgrp, geom, ob->obmat);
- if ((cu->flag & CU_3D) && (cu->drawflag & CU_HIDE_NORMALS) == 0) {
+ if ((cu->flag & CU_3D) && (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_NORMALS) != 0) {
geom = DRW_cache_curve_edge_normal_get(ob, v3d->overlay.normals_length);
DRW_shgroup_call_add(stl->g_data->wire_shgrp, geom, ob->obmat);
}
- /* Add geom to a shading group */
geom = DRW_cache_curve_edge_overlay_get(ob);
if (geom) {
DRW_shgroup_call_add(stl->g_data->overlay_edge_shgrp, geom, ob->obmat);
}
- geom = DRW_cache_curve_vert_overlay_get(ob);
+ geom = DRW_cache_curve_vert_overlay_get(ob, stl->g_data->show_handles);
DRW_shgroup_call_add(stl->g_data->overlay_vert_shgrp, geom, ob->obmat);
}
}
-}
-/* Optional: Post-cache_populate callback */
-static void EDIT_CURVE_cache_finish(void *vedata)
-{
- EDIT_CURVE_PassList *psl = ((EDIT_CURVE_Data *)vedata)->psl;
- EDIT_CURVE_StorageList *stl = ((EDIT_CURVE_Data *)vedata)->stl;
+ if (ob->type == OB_SURF) {
+ if (BKE_object_is_in_editmode(ob)) {
+ struct GPUBatch *geom = DRW_cache_curve_edge_overlay_get(ob);
+ DRW_shgroup_call_add(stl->g_data->overlay_edge_shgrp, geom, ob->obmat);
- /* Do something here! dependant on the objects gathered */
- UNUSED_VARS(psl, stl);
+ geom = DRW_cache_curve_vert_overlay_get(ob, false);
+ DRW_shgroup_call_add(stl->g_data->overlay_vert_shgrp, geom, ob->obmat);
+ }
+ }
}
/* Draw time ! Control rendering pipeline from here */
static void EDIT_CURVE_draw_scene(void *vedata)
{
EDIT_CURVE_PassList *psl = ((EDIT_CURVE_Data *)vedata)->psl;
- EDIT_CURVE_FramebufferList *fbl = ((EDIT_CURVE_Data *)vedata)->fbl;
/* Default framebuffer and texture */
DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
- UNUSED_VARS(fbl);
+ if (!DRW_pass_is_empty(psl->wire_pass)) {
+ MULTISAMPLE_SYNC_ENABLE(dfbl, dtxl);
- MULTISAMPLE_SYNC_ENABLE(dfbl, dtxl);
+ DRW_draw_pass(psl->wire_pass);
- /* Show / hide entire passes, swap framebuffers ... whatever you fancy */
- /*
- * DRW_framebuffer_texture_detach(dtxl->depth);
- * DRW_framebuffer_bind(fbl->custom_fb);
- * DRW_draw_pass(psl->pass);
- * DRW_framebuffer_texture_attach(dfbl->default_fb, dtxl->depth, 0, 0);
- * DRW_framebuffer_bind(dfbl->default_fb);
- */
+ MULTISAMPLE_SYNC_DISABLE(dfbl, dtxl)
+ }
- /* ... or just render passes on default framebuffer. */
- DRW_draw_pass(psl->wire_pass);
+ /* Thoses passes don't write to depth and are AA'ed using other tricks. */
DRW_draw_pass(psl->overlay_edge_pass);
DRW_draw_pass(psl->overlay_vert_pass);
-
- MULTISAMPLE_SYNC_DISABLE(dfbl, dtxl)
-
- /* If you changed framebuffer, double check you rebind
- * the default one with its textures attached before finishing */
}
/* Cleanup when destroying the engine.
@@ -329,7 +257,7 @@ DrawEngineType draw_engine_edit_curve_type = {
&EDIT_CURVE_engine_free,
&EDIT_CURVE_cache_init,
&EDIT_CURVE_cache_populate,
- &EDIT_CURVE_cache_finish,
+ NULL,
NULL, /* draw_background but not needed by mode engines */
&EDIT_CURVE_draw_scene,
NULL,
diff --git a/source/blender/draw/modes/edit_lattice_mode.c b/source/blender/draw/modes/edit_lattice_mode.c
index 1347eb90473..1d4d4cd8362 100644
--- a/source/blender/draw/modes/edit_lattice_mode.c
+++ b/source/blender/draw/modes/edit_lattice_mode.c
@@ -213,7 +213,7 @@ static void EDIT_LATTICE_cache_finish(void *vedata)
EDIT_LATTICE_PassList *psl = ((EDIT_LATTICE_Data *)vedata)->psl;
EDIT_LATTICE_StorageList *stl = ((EDIT_LATTICE_Data *)vedata)->stl;
- /* Do something here! dependant on the objects gathered */
+ /* Do something here! dependent on the objects gathered */
UNUSED_VARS(psl, stl);
}
diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c
index a79c0e2dc31..4ab3c1f992a 100644
--- a/source/blender/draw/modes/edit_mesh_mode.c
+++ b/source/blender/draw/modes/edit_mesh_mode.c
@@ -33,6 +33,7 @@
#include "draw_common.h"
+#include "draw_cache_impl.h"
#include "draw_mode_engines.h"
#include "edit_mesh_mode_intern.h" /* own include */
@@ -45,12 +46,17 @@
extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */
extern struct GlobalsUboStorage ts; /* draw_common.c */
+extern struct GPUTexture *globals_weight_ramp; /* draw_common.c */
+
+extern char datatoc_paint_weight_vert_glsl[];
+extern char datatoc_paint_weight_frag_glsl[];
+
extern char datatoc_edit_mesh_overlay_common_lib_glsl[];
extern char datatoc_edit_mesh_overlay_frag_glsl[];
extern char datatoc_edit_mesh_overlay_vert_glsl[];
extern char datatoc_edit_mesh_overlay_geom_tri_glsl[];
extern char datatoc_edit_mesh_overlay_geom_edge_glsl[];
-extern char datatoc_edit_mesh_overlay_loosevert_vert_glsl[];
+extern char datatoc_edit_mesh_overlay_points_vert_glsl[];
extern char datatoc_edit_mesh_overlay_facedot_frag_glsl[];
extern char datatoc_edit_mesh_overlay_facedot_vert_glsl[];
extern char datatoc_edit_mesh_overlay_ghost_clear_vert_glsl[];
@@ -62,10 +68,12 @@ extern char datatoc_edit_normals_geom_glsl[];
extern char datatoc_common_globals_lib_glsl[];
extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
+extern char datatoc_gpu_shader_flat_color_frag_glsl[];
+extern char datatoc_gpu_shader_point_varying_color_frag_glsl[];
/* *********** LISTS *********** */
typedef struct EDIT_MESH_PassList {
- struct DRWPass *vcolor_faces;
+ struct DRWPass *weight_faces;
struct DRWPass *depth_hidden_wire;
struct DRWPass *ghost_clear_depth;
struct DRWPass *edit_face_overlay;
@@ -96,14 +104,15 @@ typedef struct EDIT_MESH_Data {
#define MAX_SHADERS 16
static struct {
- /* weight/vert-color */
- GPUShader *vcolor_face_shader;
+ /* weight */
+ GPUShader *weight_face_shader;
/* Geometry */
GPUShader *overlay_tri_sh_cache[MAX_SHADERS];
GPUShader *overlay_loose_edge_sh_cache[MAX_SHADERS];
GPUShader *overlay_vert_sh;
+ GPUShader *overlay_lvert_sh;
GPUShader *overlay_facedot_sh;
GPUShader *overlay_mix_sh;
GPUShader *overlay_facefill_sh;
@@ -118,8 +127,8 @@ static struct {
} e_data = {NULL}; /* Engine data */
typedef struct EDIT_MESH_PrivateData {
- /* weight/vert-color */
- DRWShadingGroup *fvcolor_shgrp;
+ /* weight */
+ DRWShadingGroup *fweights_shgrp;
DRWShadingGroup *depth_shgrp_hidden_wire;
DRWShadingGroup *fnormals_shgrp;
@@ -127,19 +136,25 @@ typedef struct EDIT_MESH_PrivateData {
DRWShadingGroup *lnormals_shgrp;
DRWShadingGroup *face_overlay_shgrp;
+ DRWShadingGroup *verts_overlay_shgrp;
DRWShadingGroup *ledges_overlay_shgrp;
DRWShadingGroup *lverts_overlay_shgrp;
DRWShadingGroup *facedot_overlay_shgrp;
DRWShadingGroup *face_occluded_shgrp;
+ DRWShadingGroup *verts_occluded_shgrp;
DRWShadingGroup *ledges_occluded_shgrp;
DRWShadingGroup *lverts_occluded_shgrp;
DRWShadingGroup *facedot_occluded_shgrp;
DRWShadingGroup *facefill_occluded_shgrp;
+ int data_mask[4];
int ghost_ob;
int edit_ob;
bool do_zbufclip;
+ bool do_faces;
+ bool do_edges;
+ float edge_width_scale;
} EDIT_MESH_PrivateData; /* Transient data */
/* *********** FUNCTIONS *********** */
@@ -172,7 +187,7 @@ static char *EDIT_MESH_sh_defines(ToolSettings *tsettings, RegionView3D *rv3d, b
BLI_dynstr_append(ds, "#define FACE_SELECTION\n");
}
- if (!fast_mode) {
+ if (!fast_mode || looseedge) {
BLI_dynstr_append(ds, "#define EDGE_FIX\n");
}
@@ -201,9 +216,11 @@ static char *EDIT_MESH_sh_lib(void)
return str;
}
-static GPUShader *EDIT_MESH_ensure_shader(ToolSettings *tsettings, RegionView3D *rv3d, bool fast_mode, bool looseedge)
+static GPUShader *EDIT_MESH_ensure_shader(
+ ToolSettings *tsettings, RegionView3D *rv3d, bool supports_fast_mode, bool looseedge)
{
- const int index = EDIT_MESH_sh_index(tsettings, rv3d, fast_mode);
+ const int index = EDIT_MESH_sh_index(tsettings, rv3d, supports_fast_mode);
+ const int fast_mode = rv3d->rflag & RV3D_NAVIGATING;
if (looseedge) {
if (!e_data.overlay_loose_edge_sh_cache[index]) {
char *defines = EDIT_MESH_sh_defines(tsettings, rv3d, true, true);
@@ -225,7 +242,7 @@ static GPUShader *EDIT_MESH_ensure_shader(ToolSettings *tsettings, RegionView3D
char *lib = EDIT_MESH_sh_lib();
e_data.overlay_tri_sh_cache[index] = DRW_shader_create_with_lib(
datatoc_edit_mesh_overlay_vert_glsl,
- datatoc_edit_mesh_overlay_geom_tri_glsl,
+ fast_mode ? NULL : datatoc_edit_mesh_overlay_geom_tri_glsl,
datatoc_edit_mesh_overlay_frag_glsl,
lib,
defines);
@@ -253,17 +270,23 @@ static void EDIT_MESH_engine_init(void *vedata)
GPU_ATTACHMENT_TEXTURE(e_data.occlude_wire_color_tx)
});
- if (!e_data.vcolor_face_shader) {
- e_data.vcolor_face_shader = GPU_shader_get_builtin_shader(GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR_ALPHA);
+ if (!e_data.weight_face_shader) {
+ e_data.weight_face_shader = DRW_shader_create_with_lib(
+ datatoc_paint_weight_vert_glsl, NULL,
+ datatoc_paint_weight_frag_glsl,
+ datatoc_common_globals_lib_glsl, NULL);
}
if (!e_data.overlay_vert_sh) {
char *lib = EDIT_MESH_sh_lib();
e_data.overlay_vert_sh = DRW_shader_create_with_lib(
- datatoc_edit_mesh_overlay_loosevert_vert_glsl, NULL,
- datatoc_edit_mesh_overlay_frag_glsl,
- lib,
- "#define VERTEX_SELECTION\n");
+ datatoc_edit_mesh_overlay_points_vert_glsl, NULL,
+ datatoc_gpu_shader_point_varying_color_frag_glsl, lib,
+ "#define VERTEX_FACING\n");
+ e_data.overlay_lvert_sh = DRW_shader_create_with_lib(
+ datatoc_edit_mesh_overlay_points_vert_glsl, NULL,
+ datatoc_gpu_shader_point_varying_color_frag_glsl, lib,
+ NULL);
MEM_freeN(lib);
}
if (!e_data.overlay_facedot_sh) {
@@ -309,20 +332,21 @@ static void EDIT_MESH_engine_init(void *vedata)
e_data.ghost_clear_depth_sh = DRW_shader_create(datatoc_edit_mesh_overlay_ghost_clear_vert_glsl,
NULL, NULL, NULL);
}
+
}
static DRWPass *edit_mesh_create_overlay_pass(
- float *faceAlpha, DRWState statemod,
- DRWShadingGroup **r_face_shgrp, DRWShadingGroup **r_ledges_shgrp,
+ float *face_alpha, float *edge_width_scale, int *data_mask, bool do_edges, bool xray,
+ DRWState statemod,
+ DRWShadingGroup **r_face_shgrp, DRWShadingGroup **r_verts_shgrp, DRWShadingGroup **r_ledges_shgrp,
DRWShadingGroup **r_lverts_shgrp, DRWShadingGroup **r_facedot_shgrp)
{
- static float edge_width_scale;
-
GPUShader *tri_sh, *ledge_sh;
const DRWContextState *draw_ctx = DRW_context_state_get();
RegionView3D *rv3d = draw_ctx->rv3d;
Scene *scene = draw_ctx->scene;
ToolSettings *tsettings = scene->toolsettings;
+ const int fast_mode = rv3d->rflag & RV3D_NAVIGATING;
ledge_sh = EDIT_MESH_ensure_shader(tsettings, rv3d, false, true);
tri_sh = EDIT_MESH_ensure_shader(tsettings, rv3d, true, false);
@@ -331,32 +355,40 @@ static DRWPass *edit_mesh_create_overlay_pass(
"Edit Mesh Face Overlay Pass",
DRW_STATE_WRITE_COLOR | DRW_STATE_POINT | statemod);
-
- /* Applies on top of the theme edge width, so edge-mode can have thick edges. */
- edge_width_scale = (tsettings->selectmode & (SCE_SELECT_EDGE)) ? 1.75f : 1.0f;
-
*r_face_shgrp = DRW_shgroup_create(tri_sh, pass);
DRW_shgroup_uniform_block(*r_face_shgrp, "globalsBlock", globals_ubo);
DRW_shgroup_uniform_vec2(*r_face_shgrp, "viewportSize", DRW_viewport_size_get(), 1);
- DRW_shgroup_uniform_float(*r_face_shgrp, "faceAlphaMod", faceAlpha, 1);
- DRW_shgroup_uniform_float(*r_face_shgrp, "edgeScale", &edge_width_scale, 1);
+ DRW_shgroup_uniform_float(*r_face_shgrp, "faceAlphaMod", face_alpha, 1);
+ DRW_shgroup_uniform_float(*r_face_shgrp, "edgeScale", edge_width_scale, 1);
+ DRW_shgroup_uniform_ivec4(*r_face_shgrp, "dataMask", data_mask, 1);
+ DRW_shgroup_uniform_bool_copy(*r_face_shgrp, "doEdges", do_edges);
+ if (!fast_mode) {
+ DRW_shgroup_uniform_bool_copy(*r_face_shgrp, "isXray", xray);
+ }
*r_ledges_shgrp = DRW_shgroup_create(ledge_sh, pass);
DRW_shgroup_uniform_block(*r_ledges_shgrp, "globalsBlock", globals_ubo);
DRW_shgroup_uniform_vec2(*r_ledges_shgrp, "viewportSize", DRW_viewport_size_get(), 1);
- DRW_shgroup_uniform_float(*r_ledges_shgrp, "edgeScale", &edge_width_scale, 1);
+ DRW_shgroup_uniform_float(*r_ledges_shgrp, "edgeScale", edge_width_scale, 1);
+ DRW_shgroup_uniform_ivec4(*r_ledges_shgrp, "dataMask", data_mask, 1);
+ DRW_shgroup_uniform_bool_copy(*r_ledges_shgrp, "doEdges", do_edges);
- if ((tsettings->selectmode & (SCE_SELECT_VERTEX)) != 0) {
- *r_lverts_shgrp = DRW_shgroup_create(e_data.overlay_vert_sh, pass);
+ if ((tsettings->selectmode & SCE_SELECT_VERTEX) != 0) {
+ *r_lverts_shgrp = DRW_shgroup_create(e_data.overlay_lvert_sh, pass);
DRW_shgroup_uniform_block(*r_lverts_shgrp, "globalsBlock", globals_ubo);
DRW_shgroup_uniform_vec2(*r_lverts_shgrp, "viewportSize", DRW_viewport_size_get(), 1);
- DRW_shgroup_uniform_float(*r_lverts_shgrp, "edgeScale", &edge_width_scale, 1);
+ DRW_shgroup_uniform_float(*r_lverts_shgrp, "edgeScale", edge_width_scale, 1);
+
+ *r_verts_shgrp = DRW_shgroup_create(e_data.overlay_vert_sh, pass);
+ DRW_shgroup_uniform_block(*r_verts_shgrp, "globalsBlock", globals_ubo);
+ DRW_shgroup_uniform_vec2(*r_verts_shgrp, "viewportSize", DRW_viewport_size_get(), 1);
+ DRW_shgroup_uniform_float(*r_verts_shgrp, "edgeScale", edge_width_scale, 1);
}
- if ((tsettings->selectmode & (SCE_SELECT_FACE)) != 0) {
+ if ((tsettings->selectmode & SCE_SELECT_FACE) != 0) {
*r_facedot_shgrp = DRW_shgroup_create(e_data.overlay_facedot_sh, pass);
DRW_shgroup_uniform_block(*r_facedot_shgrp, "globalsBlock", globals_ubo);
- DRW_shgroup_uniform_float(*r_facedot_shgrp, "edgeScale", &edge_width_scale, 1);
+ DRW_shgroup_uniform_float(*r_facedot_shgrp, "edgeScale", edge_width_scale, 1);
}
return pass;
@@ -374,6 +406,8 @@ static void EDIT_MESH_cache_init(void *vedata)
const DRWContextState *draw_ctx = DRW_context_state_get();
View3D *v3d = draw_ctx->v3d;
+ Scene *scene = draw_ctx->scene;
+ ToolSettings *tsettings = scene->toolsettings;
static float zero = 0.0f;
@@ -383,24 +417,63 @@ static void EDIT_MESH_cache_init(void *vedata)
}
stl->g_data->ghost_ob = 0;
stl->g_data->edit_ob = 0;
+ stl->g_data->do_faces = true;
+ stl->g_data->do_edges = true;
+
+ stl->g_data->do_zbufclip = ((v3d)->shading.flag & XRAY_FLAG(v3d)) != 0;
- const bool xray_enabled = ((draw_ctx->v3d->shading.flag & V3D_SHADING_XRAY) != 0) &&
- (draw_ctx->v3d->shading.type < OB_MATERIAL);
- stl->g_data->do_zbufclip = ((v3d->flag & V3D_ZBUF_SELECT) == 0) || xray_enabled;
+ /* Applies on top of the theme edge width, so edge-mode can have thick edges. */
+ stl->g_data->edge_width_scale = (tsettings->selectmode & (SCE_SELECT_EDGE)) ? 1.75f : 1.0f;
+
+ stl->g_data->data_mask[0] = 0xFF; /* Face Flag */
+ stl->g_data->data_mask[1] = 0xFF; /* Edge Flag */
+ stl->g_data->data_mask[2] = 0xFF; /* Crease */
+ stl->g_data->data_mask[3] = 0xFF; /* BWeight */
+
+ if (draw_ctx->object_edit->type == OB_MESH) {
+ if (BKE_object_is_in_editmode(draw_ctx->object_edit)) {
+ if ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_FREESTYLE_FACE) == 0) {
+ stl->g_data->data_mask[0] &= ~VFLAG_FACE_FREESTYLE;
+ }
+ if ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_FACES) == 0) {
+ stl->g_data->data_mask[0] &= ~(VFLAG_FACE_SELECTED & VFLAG_FACE_FREESTYLE);
+ stl->g_data->do_faces = false;
+ }
+ if ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_SEAMS) == 0) {
+ stl->g_data->data_mask[1] &= ~VFLAG_EDGE_SEAM;
+ }
+ if ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_SHARP) == 0) {
+ stl->g_data->data_mask[1] &= ~VFLAG_EDGE_SHARP;
+ }
+ if ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_FREESTYLE_EDGE) == 0) {
+ stl->g_data->data_mask[1] &= ~VFLAG_EDGE_FREESTYLE;
+ }
+ if ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_EDGES) == 0) {
+ if ((tsettings->selectmode & SCE_SELECT_EDGE) == 0) {
+ stl->g_data->data_mask[1] &= ~(VFLAG_EDGE_ACTIVE & VFLAG_EDGE_SELECTED);
+ stl->g_data->do_edges = false;
+ }
+ }
+ if ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CREASES) == 0) {
+ stl->g_data->data_mask[2] = 0x0;
+ }
+ if ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_BWEIGHTS) == 0) {
+ stl->g_data->data_mask[3] = 0x0;
+ }
+ }
+ }
{
- psl->vcolor_faces = DRW_pass_create(
- "Vert Color Pass",
+ psl->weight_faces = DRW_pass_create(
+ "Weight Pass",
DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL);
- stl->g_data->fvcolor_shgrp = DRW_shgroup_create(e_data.vcolor_face_shader, psl->vcolor_faces);
+ stl->g_data->fweights_shgrp = DRW_shgroup_create(e_data.weight_face_shader, psl->weight_faces);
- static float light[3] = {-0.3f, 0.5f, 1.0f};
static float alpha = 1.0f;
- static float world_light = 1.0f; /* XXX, see: paint_vertex_mode.c */
- DRW_shgroup_uniform_vec3(stl->g_data->fvcolor_shgrp, "light", light, 1);
- DRW_shgroup_uniform_float(stl->g_data->fvcolor_shgrp, "alpha", &alpha, 1);
- DRW_shgroup_uniform_float(stl->g_data->fvcolor_shgrp, "global", &world_light, 1);
+ DRW_shgroup_uniform_float(stl->g_data->fweights_shgrp, "opacity", &alpha, 1);
+ DRW_shgroup_uniform_texture(stl->g_data->fweights_shgrp, "colorramp", globals_weight_ramp);
+ DRW_shgroup_uniform_block(stl->g_data->fweights_shgrp, "globalsBlock", globals_ubo);
}
{
@@ -443,16 +516,24 @@ static void EDIT_MESH_cache_init(void *vedata)
if (!stl->g_data->do_zbufclip) {
psl->edit_face_overlay = edit_mesh_create_overlay_pass(
- &face_mod, DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND,
- &stl->g_data->face_overlay_shgrp, &stl->g_data->ledges_overlay_shgrp,
- &stl->g_data->lverts_overlay_shgrp, &stl->g_data->facedot_overlay_shgrp);
+ &face_mod, &stl->g_data->edge_width_scale, stl->g_data->data_mask, stl->g_data->do_edges, false,
+ DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND,
+ &stl->g_data->face_overlay_shgrp,
+ &stl->g_data->verts_overlay_shgrp,
+ &stl->g_data->ledges_overlay_shgrp,
+ &stl->g_data->lverts_overlay_shgrp,
+ &stl->g_data->facedot_overlay_shgrp);
}
else {
/* We render all wires with depth and opaque to a new fbo and blend the result based on depth values */
psl->edit_face_occluded = edit_mesh_create_overlay_pass(
- &zero, DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_WRITE_DEPTH,
- &stl->g_data->face_occluded_shgrp, &stl->g_data->ledges_occluded_shgrp,
- &stl->g_data->lverts_occluded_shgrp, &stl->g_data->facedot_occluded_shgrp);
+ &zero, &stl->g_data->edge_width_scale, stl->g_data->data_mask, stl->g_data->do_edges, true,
+ DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_WRITE_DEPTH,
+ &stl->g_data->face_occluded_shgrp,
+ &stl->g_data->verts_occluded_shgrp,
+ &stl->g_data->ledges_occluded_shgrp,
+ &stl->g_data->lverts_occluded_shgrp,
+ &stl->g_data->facedot_occluded_shgrp);
/* however we loose the front faces value (because we need the depth of occluded wires and
* faces are alpha blended ) so we recover them in a new pass. */
@@ -461,6 +542,7 @@ static void EDIT_MESH_cache_init(void *vedata)
DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND);
stl->g_data->facefill_occluded_shgrp = DRW_shgroup_create(e_data.overlay_facefill_sh, psl->facefill_occlude);
DRW_shgroup_uniform_block(stl->g_data->facefill_occluded_shgrp, "globalsBlock", globals_ubo);
+ DRW_shgroup_uniform_ivec4(stl->g_data->facefill_occluded_shgrp, "dataMask", stl->g_data->data_mask, 1);
/* we need a full screen pass to combine the result */
struct GPUBatch *quad = DRW_cache_fullscreen_quad_get();
@@ -478,14 +560,24 @@ static void EDIT_MESH_cache_init(void *vedata)
}
static void edit_mesh_add_ob_to_pass(
- Scene *scene, Object *ob, DRWShadingGroup *face_shgrp, DRWShadingGroup *ledges_shgrp,
- DRWShadingGroup *lverts_shgrp, DRWShadingGroup *facedot_shgrp, DRWShadingGroup *facefill_shgrp)
+ Scene *scene, Object *ob,
+ DRWShadingGroup *face_shgrp,
+ DRWShadingGroup *verts_shgrp,
+ DRWShadingGroup *ledges_shgrp,
+ DRWShadingGroup *lverts_shgrp,
+ DRWShadingGroup *facedot_shgrp,
+ DRWShadingGroup *facefill_shgrp)
{
- struct GPUBatch *geo_ovl_tris, *geo_ovl_ledges, *geo_ovl_lverts, *geo_ovl_fcenter;
+ struct GPUBatch *geo_ovl_tris, *geo_ovl_verts, *geo_ovl_lnor, *geo_ovl_ledges, *geo_ovl_lverts, *geo_ovl_fcenter;
+ struct GPUTexture *data_texture;
ToolSettings *tsettings = scene->toolsettings;
- DRW_cache_mesh_wire_overlay_get(ob, &geo_ovl_tris, &geo_ovl_ledges, &geo_ovl_lverts);
+ DRW_cache_mesh_wire_overlay_get(ob, &geo_ovl_tris, &geo_ovl_ledges, &geo_ovl_lverts, &data_texture);
+
+ face_shgrp = DRW_shgroup_create_sub(face_shgrp);
+ DRW_shgroup_uniform_texture(face_shgrp, "dataBuffer", data_texture);
DRW_shgroup_call_add(face_shgrp, geo_ovl_tris, ob->obmat);
+
DRW_shgroup_call_add(ledges_shgrp, geo_ovl_ledges, ob->obmat);
if (facefill_shgrp) {
@@ -493,6 +585,10 @@ static void edit_mesh_add_ob_to_pass(
}
if ((tsettings->selectmode & SCE_SELECT_VERTEX) != 0) {
+ /* Thoses are point batches. */
+ DRW_cache_mesh_normals_overlay_get(ob, &geo_ovl_verts, &geo_ovl_lnor, &geo_ovl_ledges, &geo_ovl_lverts);
+ DRW_shgroup_call_add(verts_shgrp, geo_ovl_verts, ob->obmat);
+ DRW_shgroup_call_add(lverts_shgrp, geo_ovl_ledges, ob->obmat);
DRW_shgroup_call_add(lverts_shgrp, geo_ovl_lverts, ob->obmat);
}
@@ -508,28 +604,41 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
const DRWContextState *draw_ctx = DRW_context_state_get();
View3D *v3d = draw_ctx->v3d;
Scene *scene = draw_ctx->scene;
+ ToolSettings *tsettings = scene->toolsettings;
struct GPUBatch *geom;
if (ob->type == OB_MESH) {
if ((ob == draw_ctx->object_edit) || BKE_object_is_in_editmode(ob)) {
- const Mesh *me = ob->data;
bool do_occlude_wire = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_OCCLUDE_WIRE) != 0;
bool do_show_weight = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_WEIGHT) != 0;
-
- /* Updating uniform */
- backwire_opacity = v3d->overlay.backwire_opacity;
-
bool fnormals_do = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_FACE_NORMALS) != 0;
bool vnormals_do = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_VERT_NORMALS) != 0;
bool lnormals_do = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_LOOP_NORMALS) != 0;
+
+ bool show_face_dots = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_FACE_DOT) != 0;
+
+ if (stl->g_data->do_faces == false &&
+ stl->g_data->do_edges == false &&
+ (tsettings->selectmode & SCE_SELECT_FACE))
+ {
+ /* Force display of face centers in this case because that's
+ * the only way to see if a face is selected. */
+ show_face_dots = true;
+ }
+
/* Updating uniform */
+ backwire_opacity = v3d->overlay.backwire_opacity;
size_normal = v3d->overlay.normals_length;
face_mod = (do_occlude_wire) ? 0.0f : 1.0f;
+ if (!stl->g_data->do_faces) {
+ face_mod = 0.0f;
+ }
+
if (do_show_weight) {
- geom = DRW_cache_mesh_surface_weights_get(ob);
- DRW_shgroup_call_add(stl->g_data->fvcolor_shgrp, geom, ob->obmat);
+ geom = DRW_cache_mesh_surface_weights_get(ob, tsettings, false);
+ DRW_shgroup_call_add(stl->g_data->fweights_shgrp, geom, ob->obmat);
}
if (do_occlude_wire) {
@@ -543,8 +652,8 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
}
if (vnormals_do || lnormals_do) {
- struct GPUBatch *geo_ovl_tris, *geo_ovl_ledges, *geo_ovl_lverts;
- DRW_cache_mesh_normals_overlay_get(ob, &geo_ovl_tris, &geo_ovl_ledges, &geo_ovl_lverts);
+ struct GPUBatch *geo_ovl_tris, *geo_ovl_lnor, *geo_ovl_ledges, *geo_ovl_lverts;
+ DRW_cache_mesh_normals_overlay_get(ob, &geo_ovl_tris, &geo_ovl_lnor, &geo_ovl_ledges, &geo_ovl_lverts);
if (vnormals_do) {
DRW_shgroup_call_add(stl->g_data->vnormals_shgrp, geo_ovl_tris, ob->obmat);
@@ -553,7 +662,7 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
}
if (lnormals_do) {
- DRW_shgroup_call_add(stl->g_data->lnormals_shgrp, geo_ovl_tris, ob->obmat);
+ DRW_shgroup_call_add(stl->g_data->lnormals_shgrp, geo_ovl_lnor, ob->obmat);
}
}
@@ -561,18 +670,20 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
edit_mesh_add_ob_to_pass(
scene, ob,
stl->g_data->face_occluded_shgrp,
+ stl->g_data->verts_occluded_shgrp,
stl->g_data->ledges_occluded_shgrp,
stl->g_data->lverts_occluded_shgrp,
stl->g_data->facedot_occluded_shgrp,
- stl->g_data->facefill_occluded_shgrp);
+ (stl->g_data->do_faces) ? stl->g_data->facefill_occluded_shgrp : NULL);
}
else {
edit_mesh_add_ob_to_pass(
scene, ob,
stl->g_data->face_overlay_shgrp,
+ stl->g_data->verts_overlay_shgrp,
stl->g_data->ledges_overlay_shgrp,
stl->g_data->lverts_overlay_shgrp,
- (me->drawflag & ME_DRAW_FACE_DOT) ? stl->g_data->facedot_overlay_shgrp : NULL,
+ (show_face_dots) ? stl->g_data->facedot_overlay_shgrp : NULL,
NULL);
}
@@ -580,11 +691,11 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
stl->g_data->edit_ob += 1;
/* 3D text overlay */
- if (me->drawflag & (ME_DRAWEXTRA_EDGELEN |
- ME_DRAWEXTRA_FACEAREA |
- ME_DRAWEXTRA_FACEANG |
- ME_DRAWEXTRA_EDGEANG |
- ME_DRAWEXTRA_INDICES))
+ if (v3d->overlay.edit_flag & (V3D_OVERLAY_EDIT_EDGE_LEN |
+ V3D_OVERLAY_EDIT_FACE_AREA |
+ V3D_OVERLAY_EDIT_FACE_ANG |
+ V3D_OVERLAY_EDIT_EDGE_ANG |
+ V3D_OVERLAY_EDIT_INDICES))
{
if (DRW_state_show_text()) {
DRW_edit_mesh_mode_text_measure_stats(
@@ -603,7 +714,7 @@ static void EDIT_MESH_draw_scene(void *vedata)
DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
- DRW_draw_pass(psl->vcolor_faces);
+ DRW_draw_pass(psl->weight_faces);
DRW_draw_pass(psl->depth_hidden_wire);
@@ -628,7 +739,7 @@ static void EDIT_MESH_draw_scene(void *vedata)
const DRWContextState *draw_ctx = DRW_context_state_get();
View3D *v3d = draw_ctx->v3d;
- if (v3d->shading.type == OB_SOLID && (v3d->shading.flag & V3D_SHADING_XRAY) == 0) {
+ if (v3d->shading.type == OB_SOLID && (v3d->shading.flag & XRAY_FLAG(v3d)) == 0) {
if (stl->g_data->ghost_ob == 1 && stl->g_data->edit_ob == 1) {
/* In the case of single ghost object edit (common case for retopology):
* we duplicate the depht+stencil buffer and clear all depth to 1.0f where
@@ -654,7 +765,10 @@ static void EDIT_MESH_draw_scene(void *vedata)
static void EDIT_MESH_engine_free(void)
{
+ DRW_SHADER_FREE_SAFE(e_data.weight_face_shader);
+
DRW_SHADER_FREE_SAFE(e_data.overlay_vert_sh);
+ DRW_SHADER_FREE_SAFE(e_data.overlay_lvert_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_facedot_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_mix_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_facefill_sh);
diff --git a/source/blender/draw/modes/edit_mesh_mode_text.c b/source/blender/draw/modes/edit_mesh_mode_text.c
index 56a015d0e6b..d2bfc75a2bf 100644
--- a/source/blender/draw/modes/edit_mesh_mode_text.c
+++ b/source/blender/draw/modes/edit_mesh_mode_text.c
@@ -56,7 +56,7 @@ void DRW_edit_mesh_mode_text_measure_stats(
* See bug #36090.
*/
struct DRWTextStore *dt = DRW_text_cache_ensure();
- const short txt_flag = DRW_TEXT_CACHE_LOCALCLIP | (unit->system ? 0 : DRW_TEXT_CACHE_ASCII);
+ const short txt_flag = DRW_TEXT_CACHE_GLOBALSPACE | (unit->system ? 0 : DRW_TEXT_CACHE_ASCII);
Mesh *me = ob->data;
BMEditMesh *em = me->edit_btmesh;
float v1[3], v2[3], v3[3], vmid[3], fvec[3];
@@ -66,12 +66,11 @@ void DRW_edit_mesh_mode_text_measure_stats(
uchar col[4] = {0, 0, 0, 255}; /* color of the text to draw */
float area; /* area of the face */
float grid = unit->system ? unit->scale_length : v3d->grid;
- const bool do_split = (unit->flag & USER_UNIT_OPT_SPLIT) != 0;
const bool do_global = (v3d->flag & V3D_GLOBAL_STATS) != 0;
const bool do_moving = (G.moving & G_TRANSFORM_EDIT) != 0;
/* when 2 edge-info options are enabled, space apart */
- const bool do_edge_textpair = (me->drawflag & ME_DRAWEXTRA_EDGELEN) && (me->drawflag & ME_DRAWEXTRA_EDGEANG);
- const float edge_texpair_sep = 0.4f;
+ const bool do_edge_textpair = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_EDGE_LEN) && (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_EDGE_ANG);
+ const short edge_texpair_sep = (short)(5.0f * U.ui_scale);
float clip_planes[4][4];
/* allow for displaying shape keys and deform mods */
BMIter iter;
@@ -84,14 +83,14 @@ void DRW_edit_mesh_mode_text_measure_stats(
else if (grid <= 10.0f) conv_float = "%.3g";
else conv_float = "%.2g";
- if (me->drawflag & (ME_DRAWEXTRA_EDGELEN | ME_DRAWEXTRA_EDGEANG | ME_DRAWEXTRA_INDICES)) {
+ if (v3d->overlay.edit_flag & (V3D_OVERLAY_EDIT_EDGE_LEN | V3D_OVERLAY_EDIT_EDGE_ANG | V3D_OVERLAY_EDIT_INDICES)) {
BoundBox bb;
const rcti rect = {0, ar->winx, 0, ar->winy};
ED_view3d_clipping_calc(&bb, clip_planes, ar, em->ob, &rect);
}
- if (me->drawflag & ME_DRAWEXTRA_EDGELEN) {
+ if (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_EDGE_LEN) {
BMEdge *eed;
UI_GetThemeColor3ubv(TH_DRAWEXTRA_EDGELEN, col);
@@ -109,12 +108,8 @@ void DRW_edit_mesh_mode_text_measure_stats(
if (clip_segment_v3_plane_n(v1, v2, clip_planes, 4, v1_clip, v2_clip)) {
- if (do_edge_textpair) {
- interp_v3_v3v3(vmid, v1, v2, edge_texpair_sep);
- }
- else {
- mid_v3_v3v3(vmid, v1_clip, v2_clip);
- }
+ mid_v3_v3v3(vmid, v1_clip, v2_clip);
+ mul_m4_v3(ob->obmat, vmid);
if (do_global) {
mul_mat3_m4_v3(ob->obmat, v1);
@@ -122,21 +117,23 @@ void DRW_edit_mesh_mode_text_measure_stats(
}
if (unit->system) {
- numstr_len = bUnit_AsString(
- numstr, sizeof(numstr), len_v3v3(v1, v2) * unit->scale_length, 3,
- unit->system, B_UNIT_LENGTH, do_split, false);
+ numstr_len = bUnit_AsString2(
+ numstr, sizeof(numstr), len_v3v3(v1, v2) * unit->scale_length, 3,
+ B_UNIT_LENGTH, unit, false);
}
else {
numstr_len = BLI_snprintf_rlen(numstr, sizeof(numstr), conv_float, len_v3v3(v1, v2));
}
- DRW_text_cache_add(dt, vmid, numstr, numstr_len, 0, txt_flag, col);
+ DRW_text_cache_add(dt, vmid, numstr, numstr_len, 0,
+ (do_edge_textpair) ? edge_texpair_sep : 0,
+ txt_flag, col);
}
}
}
}
- if (me->drawflag & ME_DRAWEXTRA_EDGEANG) {
+ if (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_EDGE_ANG) {
const bool is_rad = (unit->system_rotation == USER_UNIT_ROT_RADIANS);
BMEdge *eed;
@@ -167,12 +164,8 @@ void DRW_edit_mesh_mode_text_measure_stats(
float no_a[3], no_b[3];
float angle;
- if (do_edge_textpair) {
- interp_v3_v3v3(vmid, v2_clip, v1_clip, edge_texpair_sep);
- }
- else {
- mid_v3_v3v3(vmid, v1_clip, v2_clip);
- }
+ mid_v3_v3v3(vmid, v1_clip, v2_clip);
+ mul_m4_v3(ob->obmat, vmid);
copy_v3_v3(no_a, l_a->f->no);
copy_v3_v3(no_b, l_b->f->no);
@@ -187,16 +180,19 @@ void DRW_edit_mesh_mode_text_measure_stats(
angle = angle_normalized_v3v3(no_a, no_b);
numstr_len = BLI_snprintf_rlen(
- numstr, sizeof(numstr), "%.3f", is_rad ? angle : RAD2DEGF(angle));
+ numstr, sizeof(numstr), "%.3f%s", (is_rad) ? angle : RAD2DEGF(angle),
+ (is_rad) ? "r" : "°");
- DRW_text_cache_add(dt, vmid, numstr, numstr_len, 0, txt_flag, col);
+ DRW_text_cache_add(dt, vmid, numstr, numstr_len, 0,
+ (do_edge_textpair) ? -edge_texpair_sep : 0,
+ txt_flag, col);
}
}
}
}
}
- if (me->drawflag & ME_DRAWEXTRA_FACEAREA) {
+ if (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_FACE_AREA) {
/* would be nice to use BM_face_calc_area, but that is for 2d faces
* so instead add up tessellation triangle areas */
@@ -231,23 +227,24 @@ void DRW_edit_mesh_mode_text_measure_stats(
}
mul_v3_fl(vmid, 1.0f / (float)n);
+ mul_m4_v3(ob->obmat, vmid);
if (unit->system) {
- numstr_len = bUnit_AsString(
+ numstr_len = bUnit_AsString2(
numstr, sizeof(numstr),
(double)(area * unit->scale_length * unit->scale_length),
- 3, unit->system, B_UNIT_AREA, do_split, false);
+ 3, B_UNIT_AREA, unit, false);
}
else {
numstr_len = BLI_snprintf_rlen(numstr, sizeof(numstr), conv_float, area);
}
- DRW_text_cache_add(dt, vmid, numstr, numstr_len, 0, txt_flag, col);
+ DRW_text_cache_add(dt, vmid, numstr, numstr_len, 0, 0, txt_flag, col);
}
}
}
- if (me->drawflag & ME_DRAWEXTRA_FACEANG) {
+ if (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_FACE_ANG) {
BMFace *efa;
const bool is_rad = (unit->system_rotation == USER_UNIT_ROT_RADIANS);
@@ -290,9 +287,11 @@ void DRW_edit_mesh_mode_text_measure_stats(
float angle = angle_v3v3v3(v1, v2, v3);
numstr_len = BLI_snprintf_rlen(
- numstr, sizeof(numstr), "%.3f", is_rad ? angle : RAD2DEGF(angle));
+ numstr, sizeof(numstr), "%.3f%s", (is_rad) ? angle : RAD2DEGF(angle),
+ (is_rad) ? "r" : "°");
interp_v3_v3v3(fvec, vmid, v2_local, 0.8f);
- DRW_text_cache_add(dt, fvec, numstr, numstr_len, 0, txt_flag, col);
+ mul_m4_v3(ob->obmat, fvec);
+ DRW_text_cache_add(dt, fvec, numstr, numstr_len, 0, 0, txt_flag, col);
}
}
}
@@ -300,7 +299,7 @@ void DRW_edit_mesh_mode_text_measure_stats(
}
/* This option is for mesh ops and addons debugging; only available in UI if Blender starts with --debug */
- if (me->drawflag & ME_DRAWEXTRA_INDICES) {
+ if (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_INDICES) {
int i;
/* For now, reuse an appropriate theme color */
@@ -311,8 +310,11 @@ void DRW_edit_mesh_mode_text_measure_stats(
BM_ITER_MESH_INDEX(v, &iter, em->bm, BM_VERTS_OF_MESH, i) {
if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+ float vec[3];
+ mul_v3_m4v3(vec, ob->obmat, v->co);
+
numstr_len = BLI_snprintf_rlen(numstr, sizeof(numstr), "%d", i);
- DRW_text_cache_add(dt, v->co, numstr, numstr_len, 0, txt_flag, col);
+ DRW_text_cache_add(dt, vec, numstr, numstr_len, 0, 0, txt_flag, col);
}
}
}
@@ -329,8 +331,10 @@ void DRW_edit_mesh_mode_text_measure_stats(
if (clip_segment_v3_plane_n(v1, v2, clip_planes, 4, v1_clip, v2_clip)) {
mid_v3_v3v3(vmid, v1_clip, v2_clip);
+ mul_m4_v3(ob->obmat, vmid);
+
numstr_len = BLI_snprintf_rlen(numstr, sizeof(numstr), "%d", i);
- DRW_text_cache_add(dt, vmid, numstr, numstr_len, 0, txt_flag, col);
+ DRW_text_cache_add(dt, vmid, numstr, numstr_len, 0, 0, txt_flag, col);
}
}
}
@@ -342,9 +346,10 @@ void DRW_edit_mesh_mode_text_measure_stats(
BM_ITER_MESH_INDEX(f, &iter, em->bm, BM_FACES_OF_MESH, i) {
if (BM_elem_flag_test(f, BM_ELEM_SELECT)) {
BM_face_calc_center_mean(f, v1);
+ mul_m4_v3(ob->obmat, v1);
numstr_len = BLI_snprintf_rlen(numstr, sizeof(numstr), "%d", i);
- DRW_text_cache_add(dt, v1, numstr, numstr_len, 0, txt_flag, col);
+ DRW_text_cache_add(dt, v1, numstr, numstr_len, 0, 0, txt_flag, col);
}
}
}
diff --git a/source/blender/draw/modes/edit_metaball_mode.c b/source/blender/draw/modes/edit_metaball_mode.c
index 20539295fd2..912c30c1482 100644
--- a/source/blender/draw/modes/edit_metaball_mode.c
+++ b/source/blender/draw/modes/edit_metaball_mode.c
@@ -31,6 +31,8 @@
#include "BKE_object.h"
#include "BKE_mball.h"
+#include "ED_mball.h"
+
/* If builtin shaders are needed */
#include "GPU_shader.h"
#include "GPU_select.h"
@@ -147,14 +149,12 @@ static void EDIT_METABALL_cache_populate(void *vedata, Object *ob)
const bool is_select = DRW_state_is_select();
- int selection_id = 0;
-
float draw_scale_xform[3][4]; /* Matrix of Scale and Translation */
{
float scamat[3][3];
copy_m3_m4(scamat, ob->obmat);
/* Get the normalized inverse matrix to extract only
- * the scale of Scamat */
+ * the scale of Scamat */
float iscamat[3][3];
invert_m3_m3(iscamat, scamat);
normalize_m3(iscamat);
@@ -165,7 +165,8 @@ static void EDIT_METABALL_cache_populate(void *vedata, Object *ob)
copy_v3_v3(draw_scale_xform[2], scamat[2]);
}
- for (MetaElem *ml = mb->editelems->first; ml != NULL; ml = ml->next) {
+ int selection_id = ob->select_color;
+ for (MetaElem *ml = mb->editelems->first; ml != NULL; ml = ml->next, selection_id += 0x10000) {
float world_pos[3];
mul_v3_m4v3(world_pos, ob->obmat, &ml->x);
draw_scale_xform[0][3] = world_pos[0];
@@ -178,8 +179,7 @@ static void EDIT_METABALL_cache_populate(void *vedata, Object *ob)
else color = col_radius;
if (is_select) {
- ml->selcol1 = ++selection_id;
- DRW_select_load_id(selection_id);
+ DRW_select_load_id(selection_id | MBALLSEL_RADIUS);
}
DRW_shgroup_call_dynamic_add(group, draw_scale_xform, &ml->rad, color);
@@ -188,8 +188,7 @@ static void EDIT_METABALL_cache_populate(void *vedata, Object *ob)
else color = col_stiffness;
if (is_select) {
- ml->selcol2 = ++selection_id;
- DRW_select_load_id(selection_id);
+ DRW_select_load_id(selection_id | MBALLSEL_STIFF);
}
DRW_shgroup_call_dynamic_add(group, draw_scale_xform, &draw_stiffness_radius, color);
diff --git a/source/blender/draw/modes/edit_surface_mode.c b/source/blender/draw/modes/edit_surface_mode.c
deleted file mode 100644
index 3c5d0dbf5a1..00000000000
--- a/source/blender/draw/modes/edit_surface_mode.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright 2016, Blender Foundation.
- *
- * 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.
- *
- * Contributor(s): Blender Institute
- *
- */
-
-/** \file blender/draw/modes/edit_surface_mode.c
- * \ingroup draw
- */
-
-#include "DRW_engine.h"
-#include "DRW_render.h"
-
-/* If builtin shaders are needed */
-#include "GPU_shader.h"
-
-#include "draw_common.h"
-
-#include "draw_mode_engines.h"
-
-/* If needed, contains all global/Theme colors
- * Add needed theme colors / values to DRW_globals_update() and update UBO
- * Not needed for constant color. */
-extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */
-extern struct GlobalsUboStorage ts; /* draw_common.c */
-
-/* *********** LISTS *********** */
-/* All lists are per viewport specific datas.
- * They are all free when viewport changes engines
- * or is free itself. Use EDIT_SURFACE_engine_init() to
- * initialize most of them and EDIT_SURFACE_cache_init()
- * for EDIT_SURFACE_PassList */
-
-typedef struct EDIT_SURFACE_PassList {
- /* Declare all passes here and init them in
- * EDIT_SURFACE_cache_init().
- * Only contains (DRWPass *) */
- struct DRWPass *pass;
-} EDIT_SURFACE_PassList;
-
-typedef struct EDIT_SURFACE_FramebufferList {
- /* Contains all framebuffer objects needed by this engine.
- * Only contains (GPUFrameBuffer *) */
- struct GPUFrameBuffer *fb;
-} EDIT_SURFACE_FramebufferList;
-
-typedef struct EDIT_SURFACE_TextureList {
- /* Contains all framebuffer textures / utility textures
- * needed by this engine. Only viewport specific textures
- * (not per object). Only contains (GPUTexture *) */
- struct GPUTexture *texture;
-} EDIT_SURFACE_TextureList;
-
-typedef struct EDIT_SURFACE_StorageList {
- /* Contains any other memory block that the engine needs.
- * Only directly MEM_(m/c)allocN'ed blocks because they are
- * free with MEM_freeN() when viewport is freed.
- * (not per object) */
- struct CustomStruct *block;
- struct EDIT_SURFACE_PrivateData *g_data;
-} EDIT_SURFACE_StorageList;
-
-typedef struct EDIT_SURFACE_Data {
- /* Struct returned by DRW_viewport_engine_data_ensure.
- * If you don't use one of these, just make it a (void *) */
- // void *fbl;
- void *engine_type; /* Required */
- EDIT_SURFACE_FramebufferList *fbl;
- EDIT_SURFACE_TextureList *txl;
- EDIT_SURFACE_PassList *psl;
- EDIT_SURFACE_StorageList *stl;
-} EDIT_SURFACE_Data;
-
-/* *********** STATIC *********** */
-
-static struct {
- /* Custom shaders :
- * Add sources to source/blender/draw/modes/shaders
- * init in EDIT_SURFACE_engine_init();
- * free in EDIT_SURFACE_engine_free(); */
- struct GPUShader *custom_shader;
-} e_data = {NULL}; /* Engine data */
-
-typedef struct EDIT_SURFACE_PrivateData {
- /* This keeps the references of the shading groups for
- * easy access in EDIT_SURFACE_cache_populate() */
- DRWShadingGroup *group;
-} EDIT_SURFACE_PrivateData; /* Transient data */
-
-/* *********** FUNCTIONS *********** */
-
-/* Init Textures, Framebuffers, Storage and Shaders.
- * It is called for every frames.
- * (Optional) */
-static void EDIT_SURFACE_engine_init(void *vedata)
-{
- EDIT_SURFACE_TextureList *txl = ((EDIT_SURFACE_Data *)vedata)->txl;
- EDIT_SURFACE_FramebufferList *fbl = ((EDIT_SURFACE_Data *)vedata)->fbl;
- EDIT_SURFACE_StorageList *stl = ((EDIT_SURFACE_Data *)vedata)->stl;
-
- UNUSED_VARS(txl, fbl, stl);
-
- /* Init Framebuffers like this: order is attachment order (for color texs) */
- /*
- * DRWFboTexture tex[2] = {{&txl->depth, GPU_DEPTH_COMPONENT24, 0},
- * {&txl->color, GPU_RGBA8, DRW_TEX_FILTER}};
- */
-
- /* DRW_framebuffer_init takes care of checking if
- * the framebuffer is valid and has the right size*/
- /*
- * float *viewport_size = DRW_viewport_size_get();
- * DRW_framebuffer_init(&fbl->occlude_wire_fb,
- * (int)viewport_size[0], (int)viewport_size[1],
- * tex, 2);
- */
-
- if (!e_data.custom_shader) {
- e_data.custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR);
- }
-}
-
-/* Here init all passes and shading groups
- * Assume that all Passes are NULL */
-static void EDIT_SURFACE_cache_init(void *vedata)
-{
- EDIT_SURFACE_PassList *psl = ((EDIT_SURFACE_Data *)vedata)->psl;
- EDIT_SURFACE_StorageList *stl = ((EDIT_SURFACE_Data *)vedata)->stl;
-
- if (!stl->g_data) {
- /* Alloc transient pointers */
- stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__);
- }
-
- {
- /* Create a pass */
- DRWState state = (
- DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL |
- DRW_STATE_BLEND | DRW_STATE_WIRE);
- psl->pass = DRW_pass_create("My Pass", state);
-
- /* Create a shadingGroup using a function in draw_common.c or custom one */
- /*
- * stl->g_data->group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire);
- * -- or --
- * stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass);
- */
- stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass);
-
- /* Uniforms need a pointer to it's value so be sure it's accessible at
- * any given time (i.e. use static vars) */
- static float color[4] = {0.0f, 0.0f, 1.0f, 1.0};
- DRW_shgroup_uniform_vec4(stl->g_data->group, "color", color, 1);
- }
-
-}
-
-/* Add geometry to shadingGroups. Execute for each objects */
-static void EDIT_SURFACE_cache_populate(void *vedata, Object *ob)
-{
- EDIT_SURFACE_PassList *psl = ((EDIT_SURFACE_Data *)vedata)->psl;
- EDIT_SURFACE_StorageList *stl = ((EDIT_SURFACE_Data *)vedata)->stl;
-
- UNUSED_VARS(psl, stl);
-
- if (ob->type == OB_MESH) {
- /* Get geometry cache */
- struct GPUBatch *geom = DRW_cache_mesh_surface_get(ob);
-
- /* Add geom to a shading group */
- DRW_shgroup_call_add(stl->g_data->group, geom, ob->obmat);
- }
-}
-
-/* Optional: Post-cache_populate callback */
-static void EDIT_SURFACE_cache_finish(void *vedata)
-{
- EDIT_SURFACE_PassList *psl = ((EDIT_SURFACE_Data *)vedata)->psl;
- EDIT_SURFACE_StorageList *stl = ((EDIT_SURFACE_Data *)vedata)->stl;
-
- /* Do something here! dependant on the objects gathered */
- UNUSED_VARS(psl, stl);
-}
-
-/* Draw time ! Control rendering pipeline from here */
-static void EDIT_SURFACE_draw_scene(void *vedata)
-{
- EDIT_SURFACE_PassList *psl = ((EDIT_SURFACE_Data *)vedata)->psl;
- EDIT_SURFACE_FramebufferList *fbl = ((EDIT_SURFACE_Data *)vedata)->fbl;
-
- /* Default framebuffer and texture */
- DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
- DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
-
- UNUSED_VARS(fbl, dfbl, dtxl);
-
- /* Show / hide entire passes, swap framebuffers ... whatever you fancy */
- /*
- * DRW_framebuffer_texture_detach(dtxl->depth);
- * DRW_framebuffer_bind(fbl->custom_fb);
- * DRW_draw_pass(psl->pass);
- * DRW_framebuffer_texture_attach(dfbl->default_fb, dtxl->depth, 0, 0);
- * DRW_framebuffer_bind(dfbl->default_fb);
- */
-
- /* ... or just render passes on default framebuffer. */
- DRW_draw_pass(psl->pass);
-
- /* If you changed framebuffer, double check you rebind
- * the default one with its textures attached before finishing */
-}
-
-/* Cleanup when destroying the engine.
- * This is not per viewport ! only when quitting blender.
- * Mostly used for freeing shaders */
-static void EDIT_SURFACE_engine_free(void)
-{
- // DRW_SHADER_FREE_SAFE(custom_shader);
-}
-
-static const DrawEngineDataSize EDIT_SURFACE_data_size = DRW_VIEWPORT_DATA_SIZE(EDIT_SURFACE_Data);
-
-DrawEngineType draw_engine_edit_surface_type = {
- NULL, NULL,
- N_("EditSurfaceMode"),
- &EDIT_SURFACE_data_size,
- &EDIT_SURFACE_engine_init,
- &EDIT_SURFACE_engine_free,
- &EDIT_SURFACE_cache_init,
- &EDIT_SURFACE_cache_populate,
- &EDIT_SURFACE_cache_finish,
- NULL, /* draw_background but not needed by mode engines */
- &EDIT_SURFACE_draw_scene,
- NULL,
- NULL,
-};
diff --git a/source/blender/draw/modes/edit_text_mode.c b/source/blender/draw/modes/edit_text_mode.c
index f21715ef399..d186ee967e5 100644
--- a/source/blender/draw/modes/edit_text_mode.c
+++ b/source/blender/draw/modes/edit_text_mode.c
@@ -58,6 +58,7 @@ typedef struct EDIT_TEXT_PassList {
struct DRWPass *wire_pass;
struct DRWPass *overlay_select_pass;
struct DRWPass *overlay_cursor_pass;
+ struct DRWPass *text_box_pass;
} EDIT_TEXT_PassList;
typedef struct EDIT_TEXT_FramebufferList {
@@ -110,6 +111,8 @@ typedef struct EDIT_TEXT_PrivateData {
DRWShadingGroup *wire_shgrp;
DRWShadingGroup *overlay_select_shgrp;
DRWShadingGroup *overlay_cursor_shgrp;
+ DRWShadingGroup *box_shgrp;
+ DRWShadingGroup *box_active_shgrp;
} EDIT_TEXT_PrivateData; /* Transient data */
/* *********** FUNCTIONS *********** */
@@ -181,6 +184,67 @@ static void EDIT_TEXT_cache_init(void *vedata)
"Font Cursor",
DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH);
stl->g_data->overlay_cursor_shgrp = DRW_shgroup_create(e_data.overlay_cursor_sh, psl->overlay_cursor_pass);
+
+ psl->text_box_pass = DRW_pass_create(
+ "Font Text Boxes",
+ DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH);
+ stl->g_data->box_shgrp = shgroup_dynlines_dashed_uniform_color(psl->text_box_pass, ts.colorWire);
+ stl->g_data->box_active_shgrp = shgroup_dynlines_dashed_uniform_color(psl->text_box_pass, ts.colorActive);
+ }
+}
+
+static void edit_text_cache_populate_boxes(void *vedata, Object *ob)
+{
+ EDIT_TEXT_StorageList *stl = ((EDIT_TEXT_Data *)vedata)->stl;
+ const Curve *cu = ob->data;
+
+ DRWShadingGroup *shading_groups[] = {
+ stl->g_data->box_active_shgrp,
+ stl->g_data->box_shgrp,
+ };
+
+ float vec[3], vec1[3], vec2[3];
+ for (int i = 0; i < cu->totbox; i++) {
+ TextBox *tb = &cu->tb[i];
+
+ if ((tb->w == 0.0f) && (tb->h == 0.0f)) {
+ continue;
+ }
+
+ const bool is_active = i == (cu->actbox - 1);
+ DRWShadingGroup *shading_group = shading_groups[is_active ? 0 : 1];
+
+ vec[0] = cu->xof + tb->x;
+ vec[1] = cu->yof + tb->y + cu->fsize;
+ vec[2] = 0.001;
+
+ mul_v3_m4v3(vec1, ob->obmat, vec);
+ vec[0] += tb->w;
+ mul_v3_m4v3(vec2, ob->obmat, vec);
+
+ DRW_shgroup_call_dynamic_add(shading_group, vec1);
+ DRW_shgroup_call_dynamic_add(shading_group, vec2);
+
+ vec[1] -= tb->h;
+ copy_v3_v3(vec1, vec2);
+ mul_v3_m4v3(vec2, ob->obmat, vec);
+
+ DRW_shgroup_call_dynamic_add(shading_group, vec1);
+ DRW_shgroup_call_dynamic_add(shading_group, vec2);
+
+ vec[0] -= tb->w;
+ copy_v3_v3(vec1, vec2);
+ mul_v3_m4v3(vec2, ob->obmat, vec);
+
+ DRW_shgroup_call_dynamic_add(shading_group, vec1);
+ DRW_shgroup_call_dynamic_add(shading_group, vec2);
+
+ vec[1] += tb->h;
+ copy_v3_v3(vec1, vec2);
+ mul_v3_m4v3(vec2, ob->obmat, vec);
+
+ DRW_shgroup_call_dynamic_add(shading_group, vec1);
+ DRW_shgroup_call_dynamic_add(shading_group, vec2);
}
}
@@ -218,6 +282,8 @@ static void EDIT_TEXT_cache_populate(void *vedata, Object *ob)
if (geom) {
DRW_shgroup_call_add(stl->g_data->overlay_cursor_shgrp, geom, ob->obmat);
}
+
+ edit_text_cache_populate_boxes(vedata, ob);
}
}
}
@@ -228,7 +294,7 @@ static void EDIT_TEXT_cache_finish(void *vedata)
EDIT_TEXT_PassList *psl = ((EDIT_TEXT_Data *)vedata)->psl;
EDIT_TEXT_StorageList *stl = ((EDIT_TEXT_Data *)vedata)->stl;
- /* Do something here! dependant on the objects gathered */
+ /* Do something here! dependent on the objects gathered */
UNUSED_VARS(psl, stl);
}
@@ -255,6 +321,10 @@ static void EDIT_TEXT_draw_scene(void *vedata)
DRW_draw_pass(psl->wire_pass);
+ if (!DRW_pass_is_empty(psl->text_box_pass)) {
+ DRW_draw_pass(psl->text_box_pass);
+ }
+
set_inverted_drawing(1);
DRW_draw_pass(psl->overlay_select_pass);
DRW_draw_pass(psl->overlay_cursor_pass);
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index e00e6dbdd0a..53f128463fe 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -279,6 +279,8 @@ typedef struct OBJECT_PrivateData {
int id_ofs_prb_active;
int id_ofs_prb_select;
int id_ofs_prb_transform;
+
+ bool xray_enabled;
} OBJECT_PrivateData; /* Transient data */
static struct {
@@ -417,14 +419,23 @@ static void OBJECT_engine_init(void *vedata)
e_data.outline_fade_sh = DRW_shader_create_fullscreen(datatoc_object_outline_expand_frag_glsl, NULL);
/* Empty images */
+# define EMPTY_IMAGE_SHADER_DEFINES \
+ "#define DEPTH_UNCHANGED " STRINGIFY(OB_EMPTY_IMAGE_DEPTH_DEFAULT) "\n" \
+ "#define DEPTH_FRONT " STRINGIFY(OB_EMPTY_IMAGE_DEPTH_FRONT) "\n" \
+ "#define DEPTH_BACK " STRINGIFY(OB_EMPTY_IMAGE_DEPTH_BACK) "\n"
+
e_data.object_empty_image_sh = DRW_shader_create(
- datatoc_object_empty_image_vert_glsl, NULL,
- datatoc_object_empty_image_frag_glsl, NULL);
+ datatoc_object_empty_image_vert_glsl, NULL,
+ datatoc_object_empty_image_frag_glsl,
+ EMPTY_IMAGE_SHADER_DEFINES);
e_data.object_empty_image_wire_sh = DRW_shader_create(
- datatoc_object_empty_image_vert_glsl, NULL,
- datatoc_object_empty_image_frag_glsl,
- "#define USE_WIRE\n");
+ datatoc_object_empty_image_vert_glsl, NULL,
+ datatoc_object_empty_image_frag_glsl,
+ EMPTY_IMAGE_SHADER_DEFINES
+ "#define USE_WIRE\n");
+
+# undef EMPTY_IMAGE_SHADER_DEFINES
/* Grid */
e_data.grid_sh = DRW_shader_create_with_lib(
@@ -500,6 +511,11 @@ static void OBJECT_engine_init(void *vedata)
}
else {
+ if (rv3d->view != RV3D_VIEW_USER) {
+ /* Allow 3 more subdivisions. */
+ grid_scale /= powf(v3d->gridsubdiv, 3);
+ }
+
float viewdist = 1.0f / max_ff(fabsf(winmat[0][0]), fabsf(winmat[1][1]));
grid_res = viewdist / grid_scale;
@@ -508,7 +524,7 @@ static void OBJECT_engine_init(void *vedata)
if (show_axis_y) {
e_data.grid_flag |= SHOW_AXIS_Y;
}
- if (show_axis_z) {
+ {
e_data.grid_flag |= SHOW_AXIS_Z;
}
if (show_floor) {
@@ -534,7 +550,7 @@ static void OBJECT_engine_init(void *vedata)
if (show_axis_x) {
e_data.grid_flag |= SHOW_AXIS_X;
}
- if (show_axis_z) {
+ {
e_data.grid_flag |= SHOW_AXIS_Z;
}
if (show_floor) {
@@ -632,7 +648,7 @@ static void OBJECT_engine_init(void *vedata)
}
float dist;
- if (rv3d->persp == RV3D_CAMOB && v3d->camera) {
+ if (rv3d->persp == RV3D_CAMOB && v3d->camera && v3d->camera->type == OB_CAMERA) {
Object *camera_object = DEG_get_evaluated_object(draw_ctx->depsgraph, v3d->camera);
dist = ((Camera *)(camera_object->data))->clipend;
}
@@ -840,6 +856,17 @@ static void image_calc_aspect(Image *ima, ImageUser *iuser, float r_image_aspect
}
}
+static bool is_image_empty_visible(Object *ob, RegionView3D *rv3d)
+{
+ int visibility_flag = ob->empty_image_visibility_flag;
+ if (rv3d->is_persp) {
+ return visibility_flag & OB_EMPTY_IMAGE_VISIBLE_PERSPECTIVE;
+ }
+ else {
+ return visibility_flag & OB_EMPTY_IMAGE_VISIBLE_ORTHOGRAPHIC;
+ }
+}
+
/* per-image shading groups for image-type empty objects */
struct EmptyImageShadingGroupData {
DRWShadingGroup *shgrp_image;
@@ -848,10 +875,12 @@ struct EmptyImageShadingGroupData {
};
static void DRW_shgroup_empty_image(
- OBJECT_ShadingGroupList *sgl, Object *ob, const float color[3])
+ OBJECT_ShadingGroupList *sgl, Object *ob, const float color[3], RegionView3D *rv3d)
{
/* TODO: 'StereoViews', see draw_empty_image. */
+ if (!is_image_empty_visible(ob, rv3d)) return;
+
if (sgl->image_plane_map == NULL) {
sgl->image_plane_map = BLI_ghash_ptr_new(__func__);
}
@@ -884,6 +913,7 @@ static void DRW_shgroup_empty_image(
e_data.object_empty_image_sh, sgl->non_meshes, geom, e_data.empty_image_format);
DRW_shgroup_uniform_texture(grp, "image", tex);
DRW_shgroup_uniform_vec2(grp, "aspect", empty_image_data->image_aspect, 1);
+ DRW_shgroup_uniform_int_copy(grp, "depthMode", ob->empty_image_depth);
empty_image_data->shgrp_image = grp;
}
@@ -903,6 +933,7 @@ static void DRW_shgroup_empty_image(
DRWShadingGroup *grp = DRW_shgroup_instance_create(
e_data.object_empty_image_wire_sh, sgl->non_meshes, geom, e_data.empty_image_wire_format);
DRW_shgroup_uniform_vec2(grp, "aspect", empty_image_data->image_aspect, 1);
+ DRW_shgroup_uniform_int_copy(grp, "depthMode", ob->empty_image_depth);
empty_image_data->shgrp_wire = grp;
}
@@ -934,8 +965,6 @@ static void OBJECT_cache_init(void *vedata)
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
OBJECT_PrivateData *g_data;
const DRWContextState *draw_ctx = DRW_context_state_get();
- const bool xray_enabled = ((draw_ctx->v3d->shading.flag & V3D_SHADING_XRAY) != 0) &&
- (draw_ctx->v3d->shading.type < OB_MATERIAL);
/* TODO : use dpi setting for enabling the second pass */
const bool do_outline_expand = false;
@@ -945,6 +974,7 @@ static void OBJECT_cache_init(void *vedata)
}
g_data = stl->g_data;
+ g_data->xray_enabled = XRAY_ENABLED(draw_ctx->v3d) && (draw_ctx->v3d->shading.type < OB_MATERIAL);
{
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_WIRE;
@@ -952,7 +982,7 @@ static void OBJECT_cache_init(void *vedata)
GPUShader *sh = e_data.outline_prepass_sh;
- if (xray_enabled) {
+ if (g_data->xray_enabled) {
sh = e_data.outline_prepass_wire_sh;
}
@@ -990,14 +1020,14 @@ static void OBJECT_cache_init(void *vedata)
DRWState state = DRW_STATE_WRITE_COLOR;
struct GPUBatch *quad = DRW_cache_fullscreen_quad_get();
/* Don't occlude the "outline" detection pass if in xray mode (too much flickering). */
- float alphaOcclu = (xray_enabled) ? 1.0f : 0.35f;
+ float alphaOcclu = (g_data->xray_enabled) ? 1.0f : 0.35f;
/* Reminder : bool uniforms need to be 4 bytes. */
static const int bTrue = true;
static const int bFalse = false;
psl->outlines_search = DRW_pass_create("Outlines Detect Pass", state);
- GPUShader *sh = (xray_enabled) ? e_data.outline_detect_wire_sh : e_data.outline_detect_sh;
+ GPUShader *sh = (g_data->xray_enabled) ? e_data.outline_detect_wire_sh : e_data.outline_detect_sh;
DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->outlines_search);
DRW_shgroup_uniform_texture_ref(grp, "outlineId", &e_data.outlines_id_tx);
DRW_shgroup_uniform_texture_ref(grp, "outlineDepth", &e_data.outlines_depth_tx);
@@ -1043,6 +1073,7 @@ static void OBJECT_cache_init(void *vedata)
psl->grid = DRW_pass_create("Infinite Grid Pass", state);
struct GPUBatch *geom = DRW_cache_grid_get();
+ float grid_line_size = max_ff(0.0f, U.pixelsize - 1.0f) * 0.5f;
static float mat[4][4];
unit_m4(mat);
@@ -1054,6 +1085,7 @@ static void OBJECT_cache_init(void *vedata)
DRW_shgroup_uniform_vec3(grp, "cameraPos", e_data.camera_pos, 1);
DRW_shgroup_uniform_vec4(grp, "screenvecs[0]", e_data.screenvecs[0], 3);
DRW_shgroup_uniform_vec4(grp, "gridSettings", e_data.grid_settings, 1);
+ DRW_shgroup_uniform_float_copy(grp, "lineKernel", grid_line_size);
DRW_shgroup_uniform_float(grp, "gridOneOverLogSubdiv", &e_data.grid_settings[4], 1);
DRW_shgroup_uniform_block(grp, "globalsBlock", globals_ubo);
DRW_shgroup_uniform_vec2(grp, "viewportSize", DRW_viewport_size_get(), 1);
@@ -1384,7 +1416,7 @@ static void DRW_shgroup_mball_handles(OBJECT_ShadingGroupList *sgl, Object *ob,
float scamat[3][3];
copy_m3_m4(scamat, ob->obmat);
/* Get the normalized inverse matrix to extract only
- * the scale of Scamat */
+ * the scale of Scamat */
float iscamat[3][3];
invert_m3_m3(iscamat, scamat);
normalize_m3(iscamat);
@@ -1679,7 +1711,7 @@ static void DRW_shgroup_camera(OBJECT_ShadingGroupList *sgl, Object *ob, ViewLay
const bool is_select = DRW_state_is_select();
const bool is_solid_bundle = (v3d->bundle_drawtype == OB_EMPTY_SPHERE) &&
((v3d->shading.type != OB_SOLID) ||
- ((v3d->shading.flag & V3D_SHADING_XRAY) == 0));
+ ((v3d->shading.flag & XRAY_FLAG(v3d)) == 0));
MovieTracking *tracking = &clip->tracking;
/* Index must start in 1, to mimic BKE_tracking_track_get_indexed. */
@@ -1788,7 +1820,7 @@ static void DRW_shgroup_camera(OBJECT_ShadingGroupList *sgl, Object *ob, ViewLay
bundle_mat[3],
track->name,
strlen(track->name),
- 10,
+ 10, 0,
DRW_TEXT_CACHE_GLOBALSPACE | DRW_TEXT_CACHE_STRING_PTR,
is_selected ? text_color_selected : text_color_unselected);
}
@@ -1845,7 +1877,7 @@ static void DRW_shgroup_empty_ex(
}
}
-static void DRW_shgroup_empty(OBJECT_ShadingGroupList *sgl, Object *ob, ViewLayer *view_layer)
+static void DRW_shgroup_empty(OBJECT_ShadingGroupList *sgl, Object *ob, ViewLayer *view_layer, RegionView3D *rv3d)
{
float *color;
DRW_object_wire_theme_get(ob, view_layer, &color);
@@ -1861,7 +1893,7 @@ static void DRW_shgroup_empty(OBJECT_ShadingGroupList *sgl, Object *ob, ViewLaye
DRW_shgroup_empty_ex(sgl, ob->obmat, &ob->empty_drawsize, ob->empty_drawtype, color);
break;
case OB_EMPTY_IMAGE:
- DRW_shgroup_empty_image(sgl, ob, color);
+ DRW_shgroup_empty_image(sgl, ob, color, rv3d);
break;
}
}
@@ -2039,7 +2071,7 @@ static void volumes_free_smoke_textures(void)
* all viewport in a redraw at least. */
for (LinkData *link = e_data.smoke_domains.first; link; link = link->next) {
SmokeModifierData *smd = (SmokeModifierData *)link->data;
- GPU_free_smoke(smd);
+ GPU_free_smoke_velocity(smd);
}
BLI_freelistN(&e_data.smoke_domains);
}
@@ -2064,14 +2096,10 @@ static void DRW_shgroup_speaker(OBJECT_ShadingGroupList *sgl, Object *ob, ViewLa
typedef struct OBJECT_LightProbeEngineData {
DrawData dd;
- float prb_mats[6][4][4];
- float probe_cube_mat[4][4];
- float draw_size;
float increment_x[3];
float increment_y[3];
float increment_z[3];
float corner[3];
- uint cell_count;
} OBJECT_LightProbeEngineData;
static void DRW_shgroup_lightprobe(OBJECT_StorageList *stl, OBJECT_PassList *psl, Object *ob, ViewLayer *view_layer)
@@ -2128,7 +2156,7 @@ static void DRW_shgroup_lightprobe(OBJECT_StorageList *stl, OBJECT_PassList *psl
mul_m4_v3(ob->obmat, prb_data->increment_z);
sub_v3_v3(prb_data->increment_z, prb_data->corner);
- prb_data->cell_count = prb->grid_resolution_x * prb->grid_resolution_y * prb->grid_resolution_z;
+ uint cell_count = prb->grid_resolution_x * prb->grid_resolution_y * prb->grid_resolution_z;
DRWShadingGroup *grp = DRW_shgroup_create(e_data.lightprobe_grid_sh, psl->lightprobes);
DRW_shgroup_uniform_int_copy(grp, "call_id", *call_id);
DRW_shgroup_uniform_int(grp, "baseId", call_id, 1); /* that's correct */
@@ -2137,9 +2165,11 @@ static void DRW_shgroup_lightprobe(OBJECT_StorageList *stl, OBJECT_PassList *psl
DRW_shgroup_uniform_vec3(grp, "increment_y", prb_data->increment_y, 1);
DRW_shgroup_uniform_vec3(grp, "increment_z", prb_data->increment_z, 1);
DRW_shgroup_uniform_ivec3(grp, "grid_resolution", &prb->grid_resolution_x, 1);
- DRW_shgroup_call_procedural_points_add(grp, prb_data->cell_count, NULL);
+ DRW_shgroup_call_procedural_points_add(grp, cell_count, NULL);
}
else if (prb->type == LIGHTPROBE_TYPE_CUBE) {
+ float draw_size = 1.0f;
+ float probe_cube_mat[4][4];
// prb_data->draw_size = prb->data_draw_size * 0.1f;
// unit_m4(prb_data->probe_cube_mat);
// copy_v3_v3(prb_data->probe_cube_mat[3], ob->obmat[3]);
@@ -2147,14 +2177,13 @@ static void DRW_shgroup_lightprobe(OBJECT_StorageList *stl, OBJECT_PassList *psl
DRWShadingGroup *grp = shgroup_theme_id_to_probe_cube_outline_shgrp(stl, theme_id);
/* TODO remove or change the drawing of the cube probes. Theses line draws nothing on purpose
* to keep the call ids correct. */
- zero_m4(prb_data->probe_cube_mat);
- DRW_shgroup_call_dynamic_add(grp, call_id, &prb_data->draw_size, prb_data->probe_cube_mat);
+ zero_m4(probe_cube_mat);
+ DRW_shgroup_call_dynamic_add(grp, call_id, &draw_size, probe_cube_mat);
}
else {
- prb_data->draw_size = 1.0f;
-
+ float draw_size = 1.0f;
DRWShadingGroup *grp = shgroup_theme_id_to_probe_planar_outline_shgrp(stl, theme_id);
- DRW_shgroup_call_dynamic_add(grp, call_id, &prb_data->draw_size, ob->obmat);
+ DRW_shgroup_call_dynamic_add(grp, call_id, &draw_size, ob->obmat);
}
*call_id += 1;
@@ -2176,15 +2205,13 @@ static void DRW_shgroup_lightprobe(OBJECT_StorageList *stl, OBJECT_PassList *psl
if (prb->type == LIGHTPROBE_TYPE_PLANAR) {
- float (*mat)[4];
- mat = (float (*)[4])(prb_data->prb_mats[0]);
+ float mat[4][4];
copy_m4_m4(mat, ob->obmat);
normalize_m4(mat);
DRW_shgroup_call_dynamic_add(sgl->single_arrow, color, &ob->empty_drawsize, mat);
DRW_shgroup_call_dynamic_add(sgl->single_arrow_line, color, &ob->empty_drawsize, mat);
- mat = (float (*)[4])(prb_data->prb_mats[1]);
copy_m4_m4(mat, ob->obmat);
zero_v3(mat[2]);
@@ -2208,15 +2235,13 @@ static void DRW_shgroup_lightprobe(OBJECT_StorageList *stl, OBJECT_PassList *psl
DRW_shgroup_call_dynamic_add(sgl->cube, color, &prb->distfalloff, ob->obmat);
}
else if (prb->type == LIGHTPROBE_TYPE_PLANAR) {
- float (*rangemat)[4];
- rangemat = (float (*)[4])(prb_data->prb_mats[2]);
+ float rangemat[4][4];
copy_m4_m4(rangemat, ob->obmat);
normalize_v3(rangemat[2]);
mul_v3_fl(rangemat[2], prb->distinf);
DRW_shgroup_call_dynamic_add(sgl->cube, color, &one, rangemat);
- rangemat = (float (*)[4])(prb_data->prb_mats[3]);
copy_m4_m4(rangemat, ob->obmat);
normalize_v3(rangemat[2]);
mul_v3_fl(rangemat[2], prb->distfalloff);
@@ -2264,9 +2289,7 @@ static void DRW_shgroup_lightprobe(OBJECT_StorageList *stl, OBJECT_PassList *psl
};
for (int i = 0; i < 6; ++i) {
- float (*clipmat)[4];
- clipmat = (float (*)[4])(prb_data->prb_mats[i]);
-
+ float clipmat[4][4];
normalize_m4_m4(clipmat, ob->obmat);
mul_m4_m4m4(clipmat, clipmat, cubefacemat[i]);
@@ -2289,7 +2312,7 @@ static void DRW_shgroup_relationship_lines(
Scene *scene,
Object *ob)
{
- if (ob->parent && DRW_check_object_visible_within_active_context(ob->parent)) {
+ if (ob->parent && DRW_object_is_visible_in_active_context(ob->parent)) {
DRW_shgroup_call_dynamic_add(sgl->relationship_lines, ob->parent->obmat[3]);
DRW_shgroup_call_dynamic_add(sgl->relationship_lines, ob->obmat[3]);
}
@@ -2297,11 +2320,11 @@ static void DRW_shgroup_relationship_lines(
if (ob->rigidbody_constraint) {
Object *rbc_ob1 = ob->rigidbody_constraint->ob1;
Object *rbc_ob2 = ob->rigidbody_constraint->ob2;
- if (rbc_ob1 && DRW_check_object_visible_within_active_context(rbc_ob1)) {
+ if (rbc_ob1 && DRW_object_is_visible_in_active_context(rbc_ob1)) {
DRW_shgroup_call_dynamic_add(sgl->relationship_lines, rbc_ob1->obmat[3]);
DRW_shgroup_call_dynamic_add(sgl->relationship_lines, ob->obmat[3]);
}
- if (rbc_ob2 && DRW_check_object_visible_within_active_context(rbc_ob2)) {
+ if (rbc_ob2 && DRW_object_is_visible_in_active_context(rbc_ob2)) {
DRW_shgroup_call_dynamic_add(sgl->relationship_lines, rbc_ob2->obmat[3]);
DRW_shgroup_call_dynamic_add(sgl->relationship_lines, ob->obmat[3]);
}
@@ -2381,7 +2404,6 @@ static void DRW_shgroup_object_center(OBJECT_StorageList *stl, Object *ob, ViewL
if (v3d->overlay.flag & V3D_OVERLAY_HIDE_OBJECT_ORIGINS) {
return;
}
-
const bool is_library = ob->id.us > 1 || ID_IS_LINKED(ob);
DRWShadingGroup *shgroup;
@@ -2547,7 +2569,7 @@ static void OBJECT_cache_populate_particles(Object *ob,
if (!psys_check_enabled(ob, psys, false)) {
continue;
}
- if (!DRW_check_psys_visible_within_active_context(ob, psys)) {
+ if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) {
continue;
}
@@ -2624,6 +2646,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
ViewLayer *view_layer = draw_ctx->view_layer;
Scene *scene = draw_ctx->scene;
View3D *v3d = draw_ctx->v3d;
+ RegionView3D *rv3d = draw_ctx->rv3d;
ModifierData *md = NULL;
int theme_id = TH_UNDEFINED;
@@ -2632,26 +2655,32 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
OBJECT_cache_populate_particles(ob, psl);
}
- if (DRW_check_object_visible_within_active_context(ob) == false) {
+ if (DRW_object_is_visible_in_active_context(ob) == false) {
return;
}
const bool do_outlines = (draw_ctx->v3d->flag & V3D_SELECT_OUTLINE) && ((ob->base_flag & BASE_SELECTED) != 0) &&
- (DRW_object_is_renderable(ob) || (ob->dt == OB_WIRE));
+ ((DRW_object_is_renderable(ob) && (ob->dt > OB_WIRE)) || (ob->dt == OB_WIRE));
const bool show_relations = ((draw_ctx->v3d->flag & V3D_HIDE_HELPLINES) == 0);
const bool hide_object_extra = (v3d->overlay.flag & V3D_OVERLAY_HIDE_OBJECT_XTRAS) != 0;
if (do_outlines) {
if (!BKE_object_is_in_editmode(ob) && !((ob == draw_ctx->obact) && (draw_ctx->object_mode & OB_MODE_ALL_PAINT))) {
struct GPUBatch *geom;
- const bool xray_enabled = ((v3d->shading.flag & V3D_SHADING_XRAY) != 0) &&
- (v3d->shading.type < OB_MATERIAL);
- if (xray_enabled) {
+
+ /* This fixes only the biggest case which is a plane in ortho view. */
+ int flat_axis = 0;
+ bool is_flat_object_viewed_from_side = (rv3d->persp == RV3D_ORTHO) &&
+ DRW_object_is_flat(ob, &flat_axis) &&
+ DRW_object_axis_orthogonal_to_view(ob, flat_axis);
+
+ if (stl->g_data->xray_enabled || is_flat_object_viewed_from_side) {
geom = DRW_cache_object_edge_detection_get(ob, NULL);
}
else {
geom = DRW_cache_object_surface_get(ob);
}
+
if (geom) {
theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL);
DRWShadingGroup *shgroup = shgroup_theme_id_to_outline_or(stl, theme_id, NULL);
@@ -2699,7 +2728,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
break;
case OB_LATTICE:
{
- if (ob != draw_ctx->object_edit) {
+ if (ob != draw_ctx->object_edit && !BKE_object_is_in_editmode(ob)) {
if (hide_object_extra) {
break;
}
@@ -2751,12 +2780,16 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
if (hide_object_extra) {
break;
}
- DRW_shgroup_empty(sgl, ob, view_layer);
+ DRW_shgroup_empty(sgl, ob, view_layer, rv3d);
break;
case OB_GPENCIL:
if (hide_object_extra) {
break;
}
+ /* in all modes except object mode hide always */
+ if (draw_ctx->object_mode != OB_MODE_OBJECT) {
+ break;
+ }
DRW_shgroup_gpencil(sgl, ob, view_layer);
break;
case OB_SPEAKER:
@@ -2800,9 +2833,16 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
DRW_shgroup_forcefield(sgl, ob, view_layer);
}
+ if (ob->dt == OB_BOUNDBOX) {
+ if (theme_id == TH_UNDEFINED) {
+ theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL);
+ }
+ DRW_shgroup_bounds(sgl, ob, theme_id);
+ }
+
/* don't show object extras in set's */
if ((ob->base_flag & (BASE_FROM_SET | BASE_FROMDUPLI)) == 0) {
- if ((draw_ctx->object_mode & OB_MODE_ALL_PAINT) == 0) {
+ if ((draw_ctx->object_mode & (OB_MODE_ALL_PAINT | OB_MODE_ALL_PAINT_GPENCIL)) == 0) {
DRW_shgroup_object_center(stl, ob, view_layer, v3d);
}
@@ -2810,7 +2850,8 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
DRW_shgroup_relationship_lines(sgl, draw_ctx->depsgraph, scene, ob);
}
- if ((ob->dtx != 0) && theme_id == TH_UNDEFINED) {
+ const bool draw_extra = (ob->dtx != 0);
+ if (draw_extra && (theme_id == TH_UNDEFINED)) {
theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL);
}
@@ -2823,14 +2864,15 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
DRW_text_cache_add(
dt, ob->obmat[3],
ob->id.name + 2, strlen(ob->id.name + 2),
- 10, DRW_TEXT_CACHE_GLOBALSPACE | DRW_TEXT_CACHE_STRING_PTR, color);
+ 10, 0, DRW_TEXT_CACHE_GLOBALSPACE | DRW_TEXT_CACHE_STRING_PTR, color);
}
if ((ob->dtx & OB_TEXSPACE) && ELEM(ob->type, OB_MESH, OB_CURVE, OB_MBALL)) {
DRW_shgroup_texture_space(sgl, ob, theme_id);
}
- if (ob->dtx & OB_DRAWBOUNDOX || ob->dt == OB_BOUNDBOX) {
+ /* Don't draw bounding box again if draw type is bound box. */
+ if (ob->dtx & OB_DRAWBOUNDOX && ob->dt != OB_BOUNDBOX) {
DRW_shgroup_bounds(sgl, ob, theme_id);
}
@@ -2926,8 +2968,6 @@ static void OBJECT_draw_scene(void *vedata)
DRW_draw_pass(psl->lightprobes);
}
- DRW_draw_pass(psl->ob_center);
-
if (DRW_state_is_fbo()) {
if (e_data.draw_grid) {
GPU_framebuffer_bind(dfbl->color_only_fb);
@@ -2969,6 +3009,13 @@ static void OBJECT_draw_scene(void *vedata)
GPU_framebuffer_bind(fbl->ghost_fb);
GPU_framebuffer_clear_depth(fbl->ghost_fb, 1.0f);
}
+ else if (DRW_state_is_select()) {
+ /* XXX `GPU_depth_range` is not a perfect solution
+ * since very distant geometries can still be occluded.
+ * Also the depth test precision of these geometries is impaired.
+ * However solves the selection for the vast majority of cases. */
+ GPU_depth_range(0.0f, 0.01f);
+ }
DRW_draw_pass(stl->g_data->sgl_ghost.spot_shapes);
DRW_draw_pass(stl->g_data->sgl_ghost.bone_solid);
@@ -2976,6 +3023,10 @@ static void OBJECT_draw_scene(void *vedata)
DRW_draw_pass(stl->g_data->sgl_ghost.bone_outline);
DRW_draw_pass(stl->g_data->sgl_ghost.non_meshes);
DRW_draw_pass(stl->g_data->sgl_ghost.bone_axes);
+
+ if (DRW_state_is_select()) {
+ GPU_depth_range(0.0f, 1.0f);
+ }
}
batch_camera_path_free(&stl->g_data->sgl_ghost.camera_path);
@@ -2984,6 +3035,8 @@ static void OBJECT_draw_scene(void *vedata)
BLI_ghash_free(stl->g_data->sgl_ghost.image_plane_map, NULL, MEM_freeN);
stl->g_data->sgl_ghost.image_plane_map = NULL;
}
+
+ DRW_draw_pass(psl->ob_center);
}
static const DrawEngineDataSize OBJECT_data_size = DRW_VIEWPORT_DATA_SIZE(OBJECT_Data);
diff --git a/source/blender/draw/modes/overlay_mode.c b/source/blender/draw/modes/overlay_mode.c
index 2e16ba5e847..a5c20033287 100644
--- a/source/blender/draw/modes/overlay_mode.c
+++ b/source/blender/draw/modes/overlay_mode.c
@@ -40,6 +40,7 @@ typedef struct OVERLAY_StorageList {
typedef struct OVERLAY_PassList {
struct DRWPass *face_orientation_pass;
+ struct DRWPass *flat_wireframe_pass;
struct DRWPass *face_wireframe_pass;
struct DRWPass *face_wireframe_full_pass;
} OVERLAY_PassList;
@@ -67,6 +68,7 @@ static struct {
/* Face orientation shader */
struct GPUShader *face_orientation_sh;
/* Wireframe shader */
+ struct GPUShader *select_wireframe_sh;
struct GPUShader *face_wireframe_sh;
struct GPUShader *face_wireframe_pretty_sh;
struct GPUShader *face_wireframe_sculpt_sh;
@@ -86,7 +88,7 @@ extern struct GlobalsUboStorage ts; /* draw_common.c */
/* Functions */
static void overlay_engine_init(void *vedata)
{
- OVERLAY_Data * data = (OVERLAY_Data *)vedata;
+ OVERLAY_Data *data = vedata;
OVERLAY_StorageList *stl = data->stl;
if (!stl->g_data) {
@@ -105,6 +107,14 @@ static void overlay_engine_init(void *vedata)
if (!e_data.face_wireframe_sh) {
bool use_geom = GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_ANY, GPU_DRIVER_ANY);
+ e_data.select_wireframe_sh = DRW_shader_create(
+ datatoc_overlay_face_wireframe_vert_glsl,
+ datatoc_overlay_face_wireframe_geom_glsl,
+ datatoc_overlay_face_wireframe_frag_glsl,
+ "#define SELECT_EDGES\n"
+ "#define LIGHT_EDGES\n"
+ "#define USE_GEOM_SHADER\n");
+
e_data.face_wireframe_sh = DRW_shader_create(
datatoc_overlay_face_wireframe_vert_glsl,
use_geom ? datatoc_overlay_face_wireframe_geom_glsl : NULL,
@@ -139,7 +149,7 @@ static void overlay_engine_init(void *vedata)
static void overlay_cache_init(void *vedata)
{
- OVERLAY_Data * data = (OVERLAY_Data *)vedata;
+ OVERLAY_Data *data = vedata;
OVERLAY_PassList *psl = data->psl;
OVERLAY_StorageList *stl = data->stl;
@@ -155,6 +165,15 @@ static void overlay_cache_init(void *vedata)
stl->g_data->show_overlays = false;
}
+ if (stl->g_data->show_overlays == false) {
+ stl->g_data->overlay.flag = 0;
+ }
+
+ if (v3d->shading.type == OB_WIRE) {
+ stl->g_data->overlay.flag |= V3D_OVERLAY_WIREFRAMES;
+ stl->g_data->show_overlays = true;
+ }
+
{
/* Face Orientation Pass */
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_BLEND;
@@ -166,24 +185,27 @@ static void overlay_cache_init(void *vedata)
{
/* Wireframe */
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND;
+ float wire_size = max_ff(0.0f, U.pixelsize - 1.0f) * 0.5f;
+
+ psl->flat_wireframe_pass = DRW_pass_create("Flat Object Wires", state | DRW_STATE_WRITE_DEPTH);
psl->face_wireframe_full_pass = DRW_pass_create("All Face Wires", state);
stl->g_data->sculpt_wires_full = DRW_shgroup_create(e_data.face_wireframe_sculpt_sh, psl->face_wireframe_full_pass);
- DRW_shgroup_uniform_vec2(stl->g_data->sculpt_wires_full, "viewportSize", DRW_viewport_size_get(), 1);
+ DRW_shgroup_uniform_float_copy(stl->g_data->sculpt_wires_full, "wireSize", wire_size);
DRWShadingGroup *shgrp = DRW_shgroup_create(e_data.face_wireframe_sh, psl->face_wireframe_full_pass);
- DRW_shgroup_uniform_vec2(shgrp, "viewportSize", DRW_viewport_size_get(), 1);
+ DRW_shgroup_uniform_float_copy(shgrp, "wireSize", wire_size);
psl->face_wireframe_pass = DRW_pass_create("Face Wires", state);
stl->g_data->sculpt_wires = DRW_shgroup_create(e_data.face_wireframe_sculpt_pretty_sh, psl->face_wireframe_pass);
- DRW_shgroup_uniform_vec2(stl->g_data->sculpt_wires, "viewportSize", DRW_viewport_size_get(), 1);
DRW_shgroup_uniform_vec2(stl->g_data->sculpt_wires, "wireStepParam", stl->g_data->wire_step_param, 1);
+ DRW_shgroup_uniform_float_copy(stl->g_data->sculpt_wires, "wireSize", wire_size);
shgrp = DRW_shgroup_create(e_data.face_wireframe_pretty_sh, psl->face_wireframe_pass);
- DRW_shgroup_uniform_vec2(shgrp, "viewportSize", DRW_viewport_size_get(), 1);
DRW_shgroup_uniform_vec2(shgrp, "wireStepParam", stl->g_data->wire_step_param, 1);
+ DRW_shgroup_uniform_float_copy(shgrp, "wireSize", wire_size);
/**
* The wireframe threshold ranges from 0.0 to 1.0
@@ -202,11 +224,13 @@ static void overlay_cache_init(void *vedata)
static void overlay_cache_populate(void *vedata, Object *ob)
{
- OVERLAY_Data * data = (OVERLAY_Data *)vedata;
+ OVERLAY_Data *data = vedata;
OVERLAY_StorageList *stl = data->stl;
OVERLAY_PrivateData *pd = stl->g_data;
OVERLAY_PassList *psl = data->psl;
const DRWContextState *draw_ctx = DRW_context_state_get();
+ RegionView3D *rv3d = draw_ctx->rv3d;
+ View3D *v3d = draw_ctx->v3d;
if (!stl->g_data->show_overlays)
return;
@@ -222,6 +246,7 @@ static void overlay_cache_populate(void *vedata, Object *ob)
}
if ((stl->g_data->overlay.flag & V3D_OVERLAY_WIREFRAMES) ||
+ (v3d->shading.type == OB_WIRE) ||
(ob->dtx & OB_DRAWWIRE) ||
(ob->dt == OB_WIRE))
{
@@ -231,13 +256,34 @@ static void overlay_cache_populate(void *vedata, Object *ob)
const bool is_sculpt_mode = is_active && (draw_ctx->object_mode & OB_MODE_SCULPT) != 0;
const bool all_wires = (stl->g_data->overlay.wireframe_threshold == 1.0f) ||
(ob->dtx & OB_DRAW_ALL_EDGES);
+ const bool is_wire = (ob->dt < OB_SOLID);
+ const int stencil_mask = (ob->dtx & OB_DRAWXRAY) ? 0x00 : 0xFF;
+ DRWShadingGroup *shgrp = NULL;
+
+ /* This fixes only the biggest case which is a plane in ortho view. */
+ int flat_axis = 0;
+ bool is_flat_object_viewed_from_side = (rv3d->persp == RV3D_ORTHO) &&
+ DRW_object_is_flat(ob, &flat_axis) &&
+ DRW_object_axis_orthogonal_to_view(ob, flat_axis);
if (is_sculpt_mode) {
- DRWShadingGroup *shgrp = (all_wires || DRW_object_is_flat_normal(ob))
+ shgrp = (all_wires || DRW_object_is_flat_normal(ob))
? stl->g_data->sculpt_wires_full
: stl->g_data->sculpt_wires;
+ if (is_wire) {
+ shgrp = DRW_shgroup_create_sub(shgrp);
+ }
DRW_shgroup_call_sculpt_add(shgrp, ob, ob->obmat);
}
+ else if (is_flat_object_viewed_from_side) {
+ /* Avoid losing flat objects when in ortho views (see T56549) */
+ struct GPUBatch *geom = DRW_cache_object_wire_outline_get(ob);
+ GPUShader *sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR);
+ shgrp = DRW_shgroup_create(sh, psl->flat_wireframe_pass);
+ DRW_shgroup_stencil_mask(shgrp, stencil_mask);
+ DRW_shgroup_uniform_vec4(shgrp, "color", ts.colorWire, 1);
+ DRW_shgroup_call_object_add(shgrp, geom, ob);
+ }
else {
int tri_count;
GPUTexture *verts = NULL, *faceids;
@@ -250,26 +296,48 @@ static void overlay_cache_populate(void *vedata, Object *ob)
DRWPass *pass = (all_wires) ? psl->face_wireframe_full_pass : psl->face_wireframe_pass;
GPUShader *sh = (all_wires) ? e_data.face_wireframe_sh : e_data.face_wireframe_pretty_sh;
- DRWShadingGroup *shgrp = DRW_shgroup_create(sh, pass);
- DRW_shgroup_stencil_mask(shgrp, (ob->dtx & OB_DRAWXRAY) ? 0x00 : 0xFF);
- DRW_shgroup_uniform_texture(shgrp, "vertData", verts);
- DRW_shgroup_uniform_texture(shgrp, "faceIds", faceids);
- DRW_shgroup_uniform_vec3(shgrp, "wireColor", ts.colorWire, 1);
- DRW_shgroup_uniform_vec3(shgrp, "rimColor", rim_col, 1);
- DRW_shgroup_call_object_procedural_triangles_culled_add(shgrp, tri_count, ob);
+ if ((DRW_state_is_select() || DRW_state_is_depth())) {
+ static float params[2] = {1.2f, 1.0f}; /* Parameters for all wires */
+
+ sh = e_data.select_wireframe_sh;
+ shgrp = DRW_shgroup_create(sh, pass);
+ DRW_shgroup_uniform_vec2(shgrp, "wireStepParam", (all_wires)
+ ? params
+ : stl->g_data->wire_step_param, 1);
+ DRW_shgroup_uniform_texture(shgrp, "vertData", verts);
+ DRW_shgroup_uniform_texture(shgrp, "faceIds", faceids);
+ DRW_shgroup_call_object_procedural_triangles_culled_add(shgrp, tri_count, ob);
+ }
+ else {
+ shgrp = DRW_shgroup_create(sh, pass);
+ DRW_shgroup_stencil_mask(shgrp, stencil_mask);
+ DRW_shgroup_uniform_texture(shgrp, "vertData", verts);
+ DRW_shgroup_uniform_texture(shgrp, "faceIds", faceids);
+ DRW_shgroup_uniform_vec3(shgrp, "wireColor", ts.colorWire, 1);
+ DRW_shgroup_uniform_vec3(shgrp, "rimColor", rim_col, 1);
+ DRW_shgroup_call_object_procedural_triangles_culled_add(shgrp, tri_count, ob);
+ }
}
}
- }
- }
- if (ob->dtx & OB_DRAWXRAY) {
- stl->g_data->ghost_stencil_test = true;
+ if (is_wire && shgrp != NULL) {
+ /* If object is wireframe, don't try to use stencil test. */
+ DRW_shgroup_state_disable(shgrp, DRW_STATE_STENCIL_EQUAL);
+
+ if (ob->dtx & OB_DRAWXRAY) {
+ DRW_shgroup_state_disable(shgrp, DRW_STATE_DEPTH_LESS_EQUAL);
+ }
+ }
+ else if ((ob->dtx & OB_DRAWXRAY) && shgrp != NULL) {
+ stl->g_data->ghost_stencil_test = true;
+ }
+ }
}
}
static void overlay_cache_finish(void *vedata)
{
- OVERLAY_Data * data = (OVERLAY_Data *)vedata;
+ OVERLAY_Data *data = vedata;
OVERLAY_PassList *psl = data->psl;
OVERLAY_StorageList *stl = data->stl;
@@ -277,7 +345,7 @@ static void overlay_cache_finish(void *vedata)
View3D *v3d = ctx->v3d;
/* only in solid mode */
- if (v3d->shading.type == OB_SOLID && (v3d->shading.flag & V3D_SHADING_XRAY) == 0) {
+ if (v3d->shading.type == OB_SOLID && (v3d->shading.flag & XRAY_FLAG(v3d)) == 0) {
if (stl->g_data->ghost_stencil_test) {
DRW_pass_state_add(psl->face_wireframe_pass, DRW_STATE_STENCIL_EQUAL);
DRW_pass_state_add(psl->face_wireframe_full_pass, DRW_STATE_STENCIL_EQUAL);
@@ -287,12 +355,15 @@ static void overlay_cache_finish(void *vedata)
static void overlay_draw_scene(void *vedata)
{
- OVERLAY_Data * data = (OVERLAY_Data *)vedata;
+ OVERLAY_Data *data = vedata;
OVERLAY_PassList *psl = data->psl;
DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
- GPU_framebuffer_bind(dfbl->default_fb);
+ if (DRW_state_is_fbo()) {
+ GPU_framebuffer_bind(dfbl->default_fb);
+ }
DRW_draw_pass(psl->face_orientation_pass);
+ DRW_draw_pass(psl->flat_wireframe_pass);
DRW_draw_pass(psl->face_wireframe_pass);
DRW_draw_pass(psl->face_wireframe_full_pass);
}
@@ -300,6 +371,7 @@ static void overlay_draw_scene(void *vedata)
static void overlay_engine_free(void)
{
DRW_SHADER_FREE_SAFE(e_data.face_orientation_sh);
+ DRW_SHADER_FREE_SAFE(e_data.select_wireframe_sh);
DRW_SHADER_FREE_SAFE(e_data.face_wireframe_sh);
DRW_SHADER_FREE_SAFE(e_data.face_wireframe_pretty_sh);
DRW_SHADER_FREE_SAFE(e_data.face_wireframe_sculpt_sh);
diff --git a/source/blender/draw/modes/paint_texture_mode.c b/source/blender/draw/modes/paint_texture_mode.c
index cf8e520323e..2792c59b805 100644
--- a/source/blender/draw/modes/paint_texture_mode.c
+++ b/source/blender/draw/modes/paint_texture_mode.c
@@ -244,6 +244,7 @@ static void PAINT_TEXTURE_cache_init(void *vedata)
DRWShadingGroup *grp = DRW_shgroup_create(e_data.image_sh, psl->image_faces);
DRW_shgroup_uniform_texture(grp, "image", tex);
DRW_shgroup_uniform_float(grp, "alpha", &draw_ctx->v3d->overlay.texture_paint_mode_opacity, 1);
+ DRW_shgroup_uniform_block(grp, "globalsBlock", globals_ubo);
stl->g_data->shgroup_image_array[0] = grp;
}
else {
@@ -349,7 +350,7 @@ static void PAINT_TEXTURE_cache_finish(void *vedata)
PAINT_TEXTURE_PassList *psl = ((PAINT_TEXTURE_Data *)vedata)->psl;
PAINT_TEXTURE_StorageList *stl = ((PAINT_TEXTURE_Data *)vedata)->stl;
- /* Do something here! dependant on the objects gathered */
+ /* Do something here! dependent on the objects gathered */
UNUSED_VARS(psl);
MEM_SAFE_FREE(stl->g_data->shgroup_image_array);
diff --git a/source/blender/draw/modes/paint_vertex_mode.c b/source/blender/draw/modes/paint_vertex_mode.c
index 236f76367d4..d026e7a7924 100644
--- a/source/blender/draw/modes/paint_vertex_mode.c
+++ b/source/blender/draw/modes/paint_vertex_mode.c
@@ -115,10 +115,10 @@ static void PAINT_VERTEX_cache_init(void *vedata)
/* Create a pass */
psl->vcolor_faces = DRW_pass_create(
"Vert Color Pass",
- DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_BLEND);
+ DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_MULTIPLY);
stl->g_data->fvcolor_shgrp = DRW_shgroup_create(e_data.vcolor_face_shader, psl->vcolor_faces);
- DRW_shgroup_uniform_float(stl->g_data->fvcolor_shgrp, "alpha", &v3d->overlay.vertex_paint_mode_opacity, 1);
+ DRW_shgroup_uniform_float_copy(stl->g_data->fvcolor_shgrp, "white_factor", 1.0f - v3d->overlay.vertex_paint_mode_opacity);
}
{
diff --git a/source/blender/draw/modes/paint_weight_mode.c b/source/blender/draw/modes/paint_weight_mode.c
index 5284f5552a9..9060a97f412 100644
--- a/source/blender/draw/modes/paint_weight_mode.c
+++ b/source/blender/draw/modes/paint_weight_mode.c
@@ -43,6 +43,10 @@
extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */
extern struct GlobalsUboStorage ts; /* draw_common.c */
+extern struct GPUTexture *globals_weight_ramp; /* draw_common.c */
+
+extern char datatoc_paint_weight_vert_glsl[];
+extern char datatoc_paint_weight_frag_glsl[];
extern char datatoc_paint_wire_vert_glsl[];
extern char datatoc_paint_wire_frag_glsl[];
extern char datatoc_paint_vert_frag_glsl[];
@@ -90,16 +94,11 @@ typedef struct PAINT_WEIGHT_PrivateData {
static void PAINT_WEIGHT_engine_init(void *UNUSED(vedata))
{
- const DRWContextState *draw_ctx = DRW_context_state_get();
-
- if (e_data.actdef != draw_ctx->obact->actdef) {
- e_data.actdef = draw_ctx->obact->actdef;
-
- BKE_mesh_batch_cache_dirty_tag(draw_ctx->obact->data, BKE_MESH_BATCH_DIRTY_ALL);
- }
-
if (!e_data.weight_face_shader) {
- e_data.weight_face_shader = GPU_shader_get_builtin_shader(GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR_ALPHA);
+ e_data.weight_face_shader = DRW_shader_create_with_lib(
+ datatoc_paint_weight_vert_glsl, NULL,
+ datatoc_paint_weight_frag_glsl,
+ datatoc_common_globals_lib_glsl, NULL);
}
if (!e_data.wire_overlay_shader) {
@@ -137,15 +136,15 @@ static void PAINT_WEIGHT_cache_init(void *vedata)
/* Create a pass */
psl->weight_faces = DRW_pass_create(
"Weight Pass",
- DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_BLEND);
+ DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_MULTIPLY);
stl->g_data->fweights_shgrp = DRW_shgroup_create(e_data.weight_face_shader, psl->weight_faces);
- static float light[3] = {-0.3f, 0.5f, 1.0f};
- static float world_light = 1.0f;
- DRW_shgroup_uniform_vec3(stl->g_data->fweights_shgrp, "light", light, 1);
- DRW_shgroup_uniform_float(stl->g_data->fweights_shgrp, "alpha", &v3d->overlay.weight_paint_mode_opacity, 1);
- DRW_shgroup_uniform_float(stl->g_data->fweights_shgrp, "global", &world_light, 1);
+ DRW_shgroup_uniform_bool_copy(stl->g_data->fweights_shgrp, "drawContours", (v3d->overlay.wpaint_flag & V3D_OVERLAY_WPAINT_CONTOURS) != 0);
+
+ DRW_shgroup_uniform_float(stl->g_data->fweights_shgrp, "opacity", &v3d->overlay.weight_paint_mode_opacity, 1);
+ DRW_shgroup_uniform_texture(stl->g_data->fweights_shgrp, "colorramp", globals_weight_ramp);
+ DRW_shgroup_uniform_block(stl->g_data->fweights_shgrp, "globalsBlock", globals_ubo);
}
{
@@ -185,8 +184,6 @@ static void PAINT_WEIGHT_cache_populate(void *vedata, Object *ob)
const View3D *v3d = draw_ctx->v3d;
if ((ob->type == OB_MESH) && (ob == draw_ctx->obact)) {
- /* We're always painting on original, display original data. */
- ob = DEG_get_original_object(ob);
const Mesh *me = ob->data;
const bool use_wire = (v3d->overlay.paint_flag & V3D_OVERLAY_PAINT_WIRE) != 0;
const bool use_surface = v3d->overlay.weight_paint_mode_opacity != 0.0f;
@@ -195,7 +192,7 @@ static void PAINT_WEIGHT_cache_populate(void *vedata, Object *ob)
struct GPUBatch *geom;
if (use_surface) {
- geom = DRW_cache_mesh_surface_weights_get(ob);
+ geom = DRW_cache_mesh_surface_weights_get(ob, draw_ctx->scene->toolsettings, true);
DRW_shgroup_call_add(stl->g_data->fweights_shgrp, geom, ob->obmat);
}
@@ -228,6 +225,7 @@ static void PAINT_WEIGHT_draw_scene(void *vedata)
static void PAINT_WEIGHT_engine_free(void)
{
+ DRW_SHADER_FREE_SAFE(e_data.weight_face_shader);
DRW_SHADER_FREE_SAFE(e_data.wire_overlay_shader);
DRW_SHADER_FREE_SAFE(e_data.vert_overlay_shader);
}
diff --git a/source/blender/draw/modes/sculpt_mode.c b/source/blender/draw/modes/sculpt_mode.c
index c80fd40cf27..5bc5506cbb7 100644
--- a/source/blender/draw/modes/sculpt_mode.c
+++ b/source/blender/draw/modes/sculpt_mode.c
@@ -229,7 +229,7 @@ static void SCULPT_cache_finish(void *vedata)
SCULPT_PassList *psl = ((SCULPT_Data *)vedata)->psl;
SCULPT_StorageList *stl = ((SCULPT_Data *)vedata)->stl;
- /* Do something here! dependant on the objects gathered */
+ /* Do something here! dependent on the objects gathered */
UNUSED_VARS(psl, stl);
}
diff --git a/source/blender/draw/modes/shaders/armature_axes_vert.glsl b/source/blender/draw/modes/shaders/armature_axes_vert.glsl
index e46dab458e0..53b2a3d3b3b 100644
--- a/source/blender/draw/modes/shaders/armature_axes_vert.glsl
+++ b/source/blender/draw/modes/shaders/armature_axes_vert.glsl
@@ -2,7 +2,7 @@
uniform mat4 ViewProjectionMatrix;
uniform vec3 screenVecs[3];
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in float axis; /* position on the axis. [0.0-1.0] is X axis, [1.0-2.0] is Y, etc... */
in vec2 screenPos;
in vec3 colorAxis;
diff --git a/source/blender/draw/modes/shaders/armature_dof_vert.glsl b/source/blender/draw/modes/shaders/armature_dof_vert.glsl
new file mode 100644
index 00000000000..5c89cf644d6
--- /dev/null
+++ b/source/blender/draw/modes/shaders/armature_dof_vert.glsl
@@ -0,0 +1,30 @@
+
+uniform mat4 ViewProjectionMatrix;
+
+/* ---- Instantiated Attribs ---- */
+in vec2 pos;
+
+/* ---- Per instance Attribs ---- */
+/* Assumed to be in world coordinate already. */
+in mat4 InstanceModelMatrix;
+in vec4 color;
+in vec2 amin;
+in vec2 amax;
+
+flat out vec4 finalColor;
+
+vec3 sphere_project(float ax, float az)
+{
+ float sine = 1.0 - ax * ax - az * az;
+ float q3 = sqrt(max(0.0, sine));
+
+ return vec3(-az * q3, 0.5 - sine, ax * q3) * 2.0;
+}
+
+void main()
+{
+ vec3 final_pos = sphere_project(pos.x * abs((pos.x > 0.0) ? amax.x : amin.x),
+ pos.y * abs((pos.y > 0.0) ? amax.y : amin.y));
+ gl_Position = ViewProjectionMatrix * (InstanceModelMatrix * vec4(final_pos, 1.0));
+ finalColor = color;
+}
diff --git a/source/blender/draw/modes/shaders/armature_envelope_outline_vert.glsl b/source/blender/draw/modes/shaders/armature_envelope_outline_vert.glsl
index a836d7fa9e1..307c7276184 100644
--- a/source/blender/draw/modes/shaders/armature_envelope_outline_vert.glsl
+++ b/source/blender/draw/modes/shaders/armature_envelope_outline_vert.glsl
@@ -7,7 +7,7 @@ uniform mat4 ProjectionMatrix;
uniform vec2 viewportSize;
uniform float lineThickness = 2.0;
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec2 pos0;
in vec2 pos1;
in vec2 pos2;
diff --git a/source/blender/draw/modes/shaders/armature_envelope_solid_vert.glsl b/source/blender/draw/modes/shaders/armature_envelope_solid_vert.glsl
index 83ae720e70a..11935e9001f 100644
--- a/source/blender/draw/modes/shaders/armature_envelope_solid_vert.glsl
+++ b/source/blender/draw/modes/shaders/armature_envelope_solid_vert.glsl
@@ -3,7 +3,7 @@ uniform mat4 ViewMatrix;
uniform mat4 ViewMatrixInverse;
uniform mat4 ViewProjectionMatrix;
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec3 pos;
/* ---- Per instance Attribs ---- */
diff --git a/source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl b/source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl
index 117bd6f6bbb..7619d8018f9 100644
--- a/source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl
+++ b/source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl
@@ -5,7 +5,7 @@ uniform mat4 ViewMatrix;
uniform mat4 ProjectionMatrix;
uniform vec2 viewportSize;
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec3 pos;
in vec3 snor;
diff --git a/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl b/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl
index 2ccfd88892c..7abbf7f3d25 100644
--- a/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl
+++ b/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl
@@ -6,7 +6,7 @@ uniform mat4 ViewProjectionMatrix;
uniform mat4 ViewMatrix;
uniform mat4 ProjectionMatrix;
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec3 pos;
in vec3 nor;
diff --git a/source/blender/draw/modes/shaders/armature_sphere_outline_vert.glsl b/source/blender/draw/modes/shaders/armature_sphere_outline_vert.glsl
index a169facd45a..0c1fefbf814 100644
--- a/source/blender/draw/modes/shaders/armature_sphere_outline_vert.glsl
+++ b/source/blender/draw/modes/shaders/armature_sphere_outline_vert.glsl
@@ -4,7 +4,7 @@ uniform mat4 ProjectionMatrix;
uniform vec2 viewportSize;
uniform float lineThickness = 2.0;
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec2 pos0;
in vec2 pos1;
diff --git a/source/blender/draw/modes/shaders/armature_sphere_solid_vert.glsl b/source/blender/draw/modes/shaders/armature_sphere_solid_vert.glsl
index 1e06047054e..7cbc0c5bc3a 100644
--- a/source/blender/draw/modes/shaders/armature_sphere_solid_vert.glsl
+++ b/source/blender/draw/modes/shaders/armature_sphere_solid_vert.glsl
@@ -2,7 +2,7 @@
uniform mat4 ViewMatrix;
uniform mat4 ProjectionMatrix;
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec2 pos;
/* ---- Per instance Attribs ---- */
diff --git a/source/blender/draw/modes/shaders/armature_stick_vert.glsl b/source/blender/draw/modes/shaders/armature_stick_vert.glsl
index 1dbc8e161c2..58fc48e608e 100644
--- a/source/blender/draw/modes/shaders/armature_stick_vert.glsl
+++ b/source/blender/draw/modes/shaders/armature_stick_vert.glsl
@@ -4,18 +4,18 @@ uniform mat4 ViewProjectionMatrix;
uniform mat4 ViewMatrix;
uniform vec2 viewportSize;
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec2 pos; /* bone aligned screen space */
in uint flag;
-#define COL_WIRE (1u << 0u)
-#define COL_HEAD (1u << 1u)
-#define COL_TAIL (1u << 2u)
-#define COL_BONE (1u << 3u)
+#define COL_WIRE 1u /* (1 << 0) */
+#define COL_HEAD 2u /* (1 << 1) */
+#define COL_TAIL 4u /* (1 << 2) */
+#define COL_BONE 8u /* (1 << 3) */
-#define POS_HEAD (1u << 4u)
-#define POS_TAIL (1u << 5u) /* UNUSED */
-#define POS_BONE (1u << 6u)
+#define POS_HEAD 16u /* (1 << 4) */
+#define POS_TAIL 32u /* (1 << 5) */ /* UNUSED */
+#define POS_BONE 64u /* (1 << 6) */
/* ---- Per instance Attribs ---- */
in vec3 boneStart;
@@ -26,14 +26,14 @@ in vec4 headColor; /* alpha encode if we do head. If 0.0 we dont. */
in vec4 tailColor; /* alpha encode if we do tail. If 0.0 we dont. */
#define do_wire (wireColor.a > 0.0)
-#define is_head ((flag & POS_HEAD) != 0u)
-#define is_bone ((flag & POS_BONE) != 0u)
+#define is_head bool(flag & POS_HEAD)
+#define is_bone bool(flag & POS_BONE)
noperspective out float colorFac;
flat out vec4 finalWireColor;
flat out vec4 finalInnerColor;
-uniform float stickSize = 5.0; /* might be dependant on DPI setting in the future. */
+uniform float stickSize = 5.0; /* might be dependent on DPI setting in the future. */
/* project to screen space */
vec2 proj(vec4 pos)
diff --git a/source/blender/draw/modes/shaders/common_globals_lib.glsl b/source/blender/draw/modes/shaders/common_globals_lib.glsl
index c55457bb6d2..69ba304ca24 100644
--- a/source/blender/draw/modes/shaders/common_globals_lib.glsl
+++ b/source/blender/draw/modes/shaders/common_globals_lib.glsl
@@ -14,6 +14,8 @@ layout(std140) uniform globalsBlock {
vec4 colorEmpty;
vec4 colorVertex;
vec4 colorVertexSelect;
+ vec4 colorVertexUnreferenced;
+ vec4 colorVertexMissingData;
vec4 colorEditMeshActive;
vec4 colorEdgeSelect;
vec4 colorEdgeSeam;
@@ -21,13 +23,14 @@ layout(std140) uniform globalsBlock {
vec4 colorEdgeCrease;
vec4 colorEdgeBWeight;
vec4 colorEdgeFaceSelect;
+ vec4 colorEdgeFreestyle;
vec4 colorFace;
vec4 colorFaceSelect;
+ vec4 colorFaceFreestyle;
vec4 colorNormal;
vec4 colorVNormal;
vec4 colorLNormal;
vec4 colorFaceDot;
-
vec4 colorDeselect;
vec4 colorOutline;
vec4 colorLampNoAlpha;
@@ -45,7 +48,9 @@ layout(std140) uniform globalsBlock {
vec4 colorHandleSelAlign;
vec4 colorHandleSelAutoclamp;
vec4 colorNurbUline;
+ vec4 colorNurbVline;
vec4 colorNurbSelUline;
+ vec4 colorNurbSelVline;
vec4 colorActiveSpline;
vec4 colorBonePose;
@@ -70,4 +75,6 @@ layout(std140) uniform globalsBlock {
float gridResolution;
float gridSubdivisions;
float gridScale;
+
+ float pad_globalsBlock;
};
diff --git a/source/blender/draw/modes/shaders/common_hair_lib.glsl b/source/blender/draw/modes/shaders/common_hair_lib.glsl
index 552690ba972..e272db02318 100644
--- a/source/blender/draw/modes/shaders/common_hair_lib.glsl
+++ b/source/blender/draw/modes/shaders/common_hair_lib.glsl
@@ -14,7 +14,7 @@ uniform int hairStrandsRes = 8;
/**
* hairThicknessRes : Subdiv around the hair.
- * 1 - Wire Hair: Only one pixel thick, independant of view distance.
+ * 1 - Wire Hair: Only one pixel thick, independent of view distance.
* 2 - Polystrip Hair: Correct width, flat if camera is parallel.
* 3+ - Cylinder Hair: Massive calculation but potentially perfect. Still need proper support.
**/
diff --git a/source/blender/draw/modes/shaders/edit_curve_overlay_frag.glsl b/source/blender/draw/modes/shaders/edit_curve_overlay_frag.glsl
deleted file mode 100644
index e78462b6915..00000000000
--- a/source/blender/draw/modes/shaders/edit_curve_overlay_frag.glsl
+++ /dev/null
@@ -1,22 +0,0 @@
-
-flat in int vertFlag;
-
-#define VERTEX_SELECTED (1 << 0)
-#define VERTEX_ACTIVE (1 << 1)
-
-out vec4 FragColor;
-
-void main()
-{
- /* TODO: vertex size */
-
- if ((vertFlag & VERTEX_SELECTED) != 0) {
- FragColor = colorVertexSelect;
- }
- else if ((vertFlag & VERTEX_ACTIVE) != 0) {
- FragColor = colorEditMeshActive;
- }
- else {
- FragColor = colorVertex;
- }
-}
diff --git a/source/blender/draw/modes/shaders/edit_curve_overlay_handle_geom.glsl b/source/blender/draw/modes/shaders/edit_curve_overlay_handle_geom.glsl
index 9da8d9b50d7..7bc9b381bad 100644
--- a/source/blender/draw/modes/shaders/edit_curve_overlay_handle_geom.glsl
+++ b/source/blender/draw/modes/shaders/edit_curve_overlay_handle_geom.glsl
@@ -1,79 +1,96 @@
-#define ACTIVE_NURB 1 << 7 /* Keep the same value of `ACTIVE_NURB` in `draw_cache_imp_curve.c` */
+#define VERTEX_ACTIVE 1 << 0
+#define VERTEX_SELECTED 1 << 1
+#define ACTIVE_NURB 1 << 2 /* Keep the same value of `ACTIVE_NURB` in `draw_cache_imp_curve.c` */
+#define EVEN_U_BIT 1 << 3
layout(lines) in;
-layout(line_strip, max_vertices = 6) out;
+layout(triangle_strip, max_vertices = 10) out;
uniform vec2 viewportSize;
+uniform bool showCurveHandles;
flat in int vertFlag[];
-flat out vec4 finalColor;
+out vec4 finalColor;
-void main()
+void output_line(vec2 offset, vec4 color)
{
- /* TODO: vertex size */
+ finalColor = color;
- vec4 v1 = gl_in[0].gl_Position;
- vec4 v2 = gl_in[1].gl_Position;
+ gl_Position = gl_in[0].gl_Position;
+ gl_Position.xy += offset * gl_in[0].gl_Position.w;
+ EmitVertex();
- int is_active_nurb = vertFlag[1] & ACTIVE_NURB;
- int color_id = vertFlag[1] ^ is_active_nurb;
+ gl_Position = gl_in[1].gl_Position;
+ gl_Position.xy += offset * gl_in[1].gl_Position.w;
+ EmitVertex();
+}
- if (is_active_nurb != 0) {
- /* draw the outline. */
- vec2 v1_2 = (v2.xy/v2.w - v1.xy/v1.w);
- vec2 offset;
+void main()
+{
+ vec4 v1 = gl_in[0].gl_Position;
+ vec4 v2 = gl_in[1].gl_Position;
- if (abs(v1_2.x * viewportSize.x) < abs(v1_2.y * viewportSize.y)) {
- offset = vec2(2.0 / viewportSize.x, 0.0);
+ int is_active_nurb = (vertFlag[1] & ACTIVE_NURB);
+ int color_id = (vertFlag[1] >> 4);
+
+ /* Don't output any edges if we don't show handles */
+ if (!showCurveHandles && (color_id < 5))
+ return;
+
+ bool edge_selected = (((vertFlag[1] | vertFlag[0]) & VERTEX_SELECTED) != 0);
+
+ vec4 inner_color;
+ if (color_id == 0) inner_color = (edge_selected) ? colorHandleSelFree : colorHandleFree;
+ else if (color_id == 1) inner_color = (edge_selected) ? colorHandleSelAuto : colorHandleAuto;
+ else if (color_id == 2) inner_color = (edge_selected) ? colorHandleSelVect : colorHandleVect;
+ else if (color_id == 3) inner_color = (edge_selected) ? colorHandleSelAlign : colorHandleAlign;
+ else if (color_id == 4) inner_color = (edge_selected) ? colorHandleSelAutoclamp : colorHandleAutoclamp;
+ else {
+ bool is_selected = (((vertFlag[1] & vertFlag[0]) & VERTEX_SELECTED) != 0);
+ bool is_u_segment = (((vertFlag[1] ^ vertFlag[0]) & EVEN_U_BIT) != 0);
+ if (is_u_segment) {
+ inner_color = (is_selected) ? colorNurbSelUline : colorNurbUline;
}
else {
- offset = vec2(0.0, 2.0 / viewportSize.y);
+ inner_color = (is_selected) ? colorNurbSelVline : colorNurbVline;
}
+ }
- finalColor = colorActiveSpline;
+ vec4 outer_color = (is_active_nurb != 0)
+ ? mix(colorActiveSpline, inner_color, 0.25) /* Minimize active color bleeding on inner_color. */
+ : vec4(inner_color.rgb, 0.0);
- gl_Position = v1;
- gl_Position.xy += offset * v1.w;
- EmitVertex();
+ vec2 v1_2 = (v2.xy/v2.w - v1.xy/v1.w);
+ vec2 offset = sizeEdge * 4.0 / viewportSize; /* 4.0 is eyeballed */
- gl_Position = v2;
- gl_Position.xy += offset * v2.w;
- EmitVertex();
+ if (abs(v1_2.x * viewportSize.x) < abs(v1_2.y * viewportSize.y)) {
+ offset.y = 0.0;
+ }
+ else {
+ offset.x = 0.0;
+ }
- EndPrimitive();
+ /* draw the transparent border (AA). */
+ if (is_active_nurb != 0) {
+ offset *= 0.75; /* Don't make the active "halo" appear very thick. */
+ output_line(offset * 2.0, vec4(colorActiveSpline.rgb, 0.0));
+ }
- gl_Position = v1;
- gl_Position.xy -= offset * v1.w;
- EmitVertex();
+ /* draw the outline. */
+ output_line(offset, outer_color);
- gl_Position = v2;
- gl_Position.xy -= offset * v2.w;
- EmitVertex();
+ /* draw the core of the line. */
+ output_line(vec2(0.0), inner_color);
- EndPrimitive();
- }
+ /* draw the outline. */
+ output_line(-offset, outer_color);
- if (color_id == 0) finalColor = colorHandleFree;
- else if (color_id == 1) finalColor = colorHandleAuto;
- else if (color_id == 2) finalColor = colorHandleVect;
- else if (color_id == 3) finalColor = colorHandleAlign;
- else if (color_id == 4) finalColor = colorHandleAutoclamp;
- else if (color_id == 5) finalColor = colorHandleSelFree;
- else if (color_id == 6) finalColor = colorHandleSelAuto;
- else if (color_id == 7) finalColor = colorHandleSelVect;
- else if (color_id == 8) finalColor = colorHandleSelAlign;
- else if (color_id == 9) finalColor = colorHandleSelAutoclamp;
- else if (color_id == 10) finalColor = colorNurbUline;
- else if (color_id == 11) finalColor = colorNurbSelUline;
- else finalColor = colorVertexSelect;
-
- gl_Position = v1;
- EmitVertex();
-
- gl_Position = v2;
- EmitVertex();
+ /* draw the transparent border (AA). */
+ if (is_active_nurb != 0) {
+ output_line(offset * -2.0, vec4(colorActiveSpline.rgb, 0.0));
+ }
EndPrimitive();
}
diff --git a/source/blender/draw/modes/shaders/edit_curve_overlay_handle_vert.glsl b/source/blender/draw/modes/shaders/edit_curve_overlay_handle_vert.glsl
new file mode 100644
index 00000000000..d3f9deedf0c
--- /dev/null
+++ b/source/blender/draw/modes/shaders/edit_curve_overlay_handle_vert.glsl
@@ -0,0 +1,15 @@
+
+/* Draw Curve Handles */
+
+uniform mat4 ModelViewProjectionMatrix;
+
+in vec3 pos;
+in int data;
+
+flat out int vertFlag;
+
+void main()
+{
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ vertFlag = data;
+}
diff --git a/source/blender/draw/modes/shaders/edit_curve_overlay_loosevert_vert.glsl b/source/blender/draw/modes/shaders/edit_curve_overlay_loosevert_vert.glsl
index 9150ef8cd63..85e38ba3b43 100644
--- a/source/blender/draw/modes/shaders/edit_curve_overlay_loosevert_vert.glsl
+++ b/source/blender/draw/modes/shaders/edit_curve_overlay_loosevert_vert.glsl
@@ -7,33 +7,25 @@ uniform vec2 viewportSize;
in vec3 pos;
in int data;
-/* these are the same for all vertices
- * and does not need interpolation */
-flat out int vertFlag;
-flat out int clipCase;
+out vec4 finalColor;
-/* See fragment shader */
-noperspective out vec4 eData1;
-flat out vec4 eData2;
-
-/* project to screen space */
-vec2 proj(vec4 pos)
-{
- return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize;
-}
+#define VERTEX_ACTIVE (1 << 0)
+#define VERTEX_SELECTED (1 << 1)
void main()
{
- clipCase = 0;
-
- vec4 pPos = ModelViewProjectionMatrix * vec4(pos, 1.0);
-
- /* only vertex position 0 is used */
- eData1 = eData2 = vec4(1e10);
- eData2.zw = proj(pPos);
-
- vertFlag = data;
-
- gl_Position = pPos;
- gl_PointSize = sizeVertex;
+ if ((data & VERTEX_SELECTED) != 0) {
+ if ((data & VERTEX_ACTIVE) != 0) {
+ finalColor = colorEditMeshActive;
+ }
+ else {
+ finalColor = colorVertexSelect;
+ }
+ }
+ else {
+ finalColor = colorVertex;
+ }
+
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ gl_PointSize = sizeVertex * 2.0;
}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl
index dabbb4a321a..b37862f2037 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl
@@ -3,23 +3,31 @@
#define EDGE_SELECTED (1 << 2)
#define EDGE_SEAM (1 << 3)
#define EDGE_SHARP (1 << 4)
+#define EDGE_FREESTYLE (1 << 5)
#define EDGE_VERTEX_ACTIVE (1 << (0 + 8))
#define EDGE_VERTEX_SELECTED (1 << (1 + 8))
+#define EDGE_VERTEX_EXISTS (1 << (2 + 8))
#define VERTEX_ACTIVE (1 << 0)
#define VERTEX_SELECTED (1 << 1)
+#define VERTEX_EXISTS (1 << 2)
+#define FACE_ACTIVE (1 << 3)
+#define FACE_SELECTED (1 << 4)
+#define FACE_FREESTYLE (1 << 5)
+
+uniform bool doEdges = true;
vec4 EDIT_MESH_edge_color_outer(int edge_flag, bool face_active, float crease, float bweight)
{
vec4 color = vec4(0.0);
+ color = ((edge_flag & EDGE_FREESTYLE) != 0) ? colorEdgeFreestyle : color;
color = ((edge_flag & EDGE_SHARP) != 0) ? colorEdgeSharp : color;
color = (crease > 0.0) ? vec4(colorEdgeCrease.rgb, crease) : color;
color = (bweight > 0.0) ? vec4(colorEdgeBWeight.rgb, bweight) : color;
color = ((edge_flag & EDGE_SEAM) != 0) ? colorEdgeSeam : color;
- if (face_active)
- {
+ if (face_active) {
color = colorEditMeshActive;
}
return color;
@@ -27,25 +35,19 @@ vec4 EDIT_MESH_edge_color_outer(int edge_flag, bool face_active, float crease, f
vec4 EDIT_MESH_edge_color_inner(int edge_flag, bool face_active)
{
-#ifdef EDGE_SELECTION
vec4 color = colorWireEdit;
+#ifdef EDGE_SELECTION
color = ((edge_flag & EDGE_SELECTED) != 0) ? colorEdgeSelect : color;
color = ((edge_flag & EDGE_ACTIVE) != 0) ? colorEditMeshActive : color;
-
#else
- vec4 color = colorWireEdit;
- color = ((edge_flag & EDGE_SELECTED) != 0) ? colorEdgeSelect : color;
+ color = (doEdges && (edge_flag & EDGE_SELECTED) != 0) ? colorEdgeSelect : color;
#endif
return color;
}
vec4 EDIT_MESH_vertex_color(int vertex_flag)
{
- if ((vertex_flag & (VERTEX_ACTIVE | VERTEX_SELECTED)) != 0)
- {
- return colorEdgeSelect;
- }
- else {
- return colorWireEdit;
- }
+ vec4 color = colorWireEdit;
+ color = (doEdges && (vertex_flag & (VERTEX_ACTIVE | VERTEX_SELECTED)) != 0) ? colorEdgeSelect : color;
+ return color;
}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_vert.glsl
index fa3934c4b77..50f6f3e2cf8 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_vert.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_vert.glsl
@@ -18,7 +18,7 @@ void main()
{
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
/* Bias Facedot Z position in clipspace. */
- gl_Position.z -= 0.0002;
+ gl_Position.z -= 0.00035;
gl_PointSize = sizeFaceDot;
isSelected = int(norAndFlag.w);
#ifdef VERTEX_FACING
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl
index c9de6d29524..eb68eb9b0dc 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl
@@ -1,15 +1,28 @@
uniform mat4 ModelViewProjectionMatrix;
+uniform ivec4 dataMask = ivec4(0xFF);
in vec3 pos;
in ivec4 data;
flat out vec4 faceColor;
-#define FACE_SELECTED (1 << 3)
+#define FACE_ACTIVE (1 << 3)
+#define FACE_SELECTED (1 << 4)
+#define FACE_FREESTYLE (1 << 5)
void main()
{
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
- faceColor = ((data.x & FACE_SELECTED) != 0)? colorFaceSelect: colorFace;
+
+ ivec4 data_m = data & dataMask;
+
+ if ((data_m.x & FACE_ACTIVE) != 0)
+ faceColor = colorFaceSelect;
+ else if ((data_m.x & FACE_SELECTED) != 0)
+ faceColor = colorFaceSelect;
+ else if ((data_m.x & FACE_FREESTYLE) != 0)
+ faceColor = colorFaceFreestyle;
+ else
+ faceColor = colorFace;
}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl
index 6551fa81c21..7fa822bc697 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl
@@ -2,15 +2,9 @@
/* Solid Wirefram implementation
* Mike Erwin, Clément Foucault */
-/* This shader follows the principles of
- * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
-
-/* This is not perfect. Only a subset of intel gpus are affected.
- * This fix have some performance impact.
- * TODO Refine the range to only affect GPUs. */
-
uniform float faceAlphaMod;
uniform float edgeScale;
+uniform bool isXray = false;
flat in vec3 edgesCrease;
flat in vec3 edgesBweight;
@@ -19,28 +13,62 @@ flat in ivec3 flag;
#ifdef VERTEX_SELECTION
in vec3 vertexColor;
#endif
+
+#ifdef EDGE_FIX
+flat in vec2 ssPos[3];
+#else
+in vec3 barycentric;
+#endif
+
#ifdef VERTEX_FACING
in float facing;
#endif
-flat in vec2 ssPos[3];
-
out vec4 FragColor;
/* Vertex flag is shifted and combined with the edge flag */
-#define FACE_ACTIVE (1 << (2 + 8))
+#define FACE_ACTIVE_ (FACE_ACTIVE << 8)
-#define LARGE_EDGE_SIZE 3.0
+#define LARGE_EDGE_SIZE 2.15
-/* Style Parameters in pixel */
+/* Enough to visually fill gaps and not enough to mess the AA gradient too much. */
+#define EDGE_FIX_ALPHA 0.67
-void distToEdgeAndPoint(vec2 dir, vec2 ori, out float edge, out float point)
+void distToEdgesAndPoints(out vec3 edges, out vec3 points)
{
- dir = normalize(dir.xy);
- dir = vec2(-dir.y, dir.x);
- vec2 of = gl_FragCoord.xy - ori;
- point = sqrt(dot(of, of));
- edge = abs(dot(dir, of));
+#ifdef EDGE_FIX
+ vec2 e0 = normalize(ssPos[1] - ssPos[0] + 1e-8);
+ vec2 e1 = normalize(ssPos[2] - ssPos[1] + 1e-8);
+ vec2 e2 = normalize(ssPos[0] - ssPos[2] + 1e-8);
+ e0 = vec2(-e0.y, e0.x);
+ e1 = vec2(-e1.y, e1.x);
+ e2 = vec2(-e2.y, e2.x);
+ vec2 p0 = gl_FragCoord.xy - ssPos[0];
+ vec2 p1 = gl_FragCoord.xy - ssPos[1];
+ vec2 p2 = gl_FragCoord.xy - ssPos[2];
+ edges.z = abs(dot(e0, p0));
+ edges.x = abs(dot(e1, p1));
+ edges.y = abs(dot(e2, p2));
+#else
+ vec3 dx = dFdx(barycentric);
+ vec3 dy = dFdy(barycentric);
+ /* per component derivative */
+ vec2 d0 = vec2(dx.x, dy.x);
+ vec2 d1 = vec2(dx.y, dy.y);
+ vec2 d2 = vec2(dx.z, dy.z);
+ vec3 d = vec3(length(d0), length(d1), length(d2));
+
+ edges = abs(vec3(barycentric / d));
+#endif
+
+#if defined(VERTEX_SELECTION) && defined(EDGE_FIX)
+ points.x = dot(p0, p0);
+ points.y = dot(p1, p1);
+ points.z = dot(p2, p2);
+ points = sqrt(points);
+#else
+ points = vec3(1e10);
+#endif
}
void colorDist(vec4 color, float dist)
@@ -62,13 +90,7 @@ void colorDistEdge(vec4 color, float dist)
void main()
{
vec3 e, p;
-
- /* Step 1 : Computing Distances */
- distToEdgeAndPoint((ssPos[1] - ssPos[0]) + 1e-8, ssPos[0], e.z, p.x);
- distToEdgeAndPoint((ssPos[2] - ssPos[1]) + 1e-8, ssPos[1], e.x, p.y);
- distToEdgeAndPoint((ssPos[0] - ssPos[2]) + 1e-8, ssPos[2], e.y, p.z);
-
- /* Step 2 : coloring (order dependant) */
+ distToEdgesAndPoints(e, p);
/* Face */
FragColor = faceColor;
@@ -82,8 +104,10 @@ void main()
/* Outer large edge */
float largeEdge = e[v] - sizeEdgeFinal * LARGE_EDGE_SIZE;
- vec4 large_edge_color = EDIT_MESH_edge_color_outer(flag[v], (flag[0]& FACE_ACTIVE) != 0, edgesCrease[v], edgesBweight[v]);
-
+ vec4 large_edge_color = EDIT_MESH_edge_color_outer(flag[v], (flag[0] & FACE_ACTIVE_) != 0, edgesCrease[v], edgesBweight[v]);
+#ifdef EDGE_FIX
+ large_edge_color *= isXray ? 1.0 : EDGE_FIX_ALPHA;
+#endif
if (large_edge_color.a != 0.0) {
colorDistEdge(large_edge_color, largeEdge);
}
@@ -95,24 +119,38 @@ void main()
#endif
#ifdef VERTEX_SELECTION
+ vec4 inner_edge_color = vec4(vertexColor, 1.0);
+# ifdef EDGE_FIX
+ inner_edge_color *= isXray ? 1.0 : EDGE_FIX_ALPHA;
+# endif
colorDistEdge(vec4(vertexColor, 1.0), innerEdge);
#else
- vec4 inner_edge_color = EDIT_MESH_edge_color_inner(flag[v], (flag[0]& FACE_ACTIVE) != 0);
+ vec4 inner_edge_color = EDIT_MESH_edge_color_inner(flag[v], (flag[0] & FACE_ACTIVE_) != 0);
+# ifdef EDGE_FIX
+ inner_edge_color *= isXray ? 1.0 : EDGE_FIX_ALPHA;
+# endif
colorDistEdge(inner_edge_color, innerEdge);
#endif
}
}
+#if defined(VERTEX_SELECTION) && defined(EDGE_FIX)
/* Points */
-#ifdef VERTEX_SELECTION
for (int v = 0; v < 3; ++v) {
- float size = p[v] - sizeVertex;
-
- vec4 point_color = colorVertex;
- point_color = ((flag[v] & EDGE_VERTEX_SELECTED) != 0) ? colorVertexSelect : point_color;
- point_color = ((flag[v] & EDGE_VERTEX_ACTIVE) != 0) ? vec4(colorEditMeshActive.xyz, 1.0) : point_color;
-
- colorDist(point_color, size);
+ if ((flag[v] & EDGE_VERTEX_EXISTS) == 0) {
+ /* Leave as-is, no vertex. */
+ }
+ else {
+ float size = p[v] - sizeVertex;
+
+ vec4 point_color = colorVertex;
+ point_color = ((flag[v] & EDGE_VERTEX_SELECTED) != 0) ? colorVertexSelect : point_color;
+ point_color = ((flag[v] & EDGE_VERTEX_ACTIVE) != 0) ? vec4(colorEditMeshActive.xyz, 1.0) : point_color;
+# ifdef EDGE_FIX
+ point_color *= isXray ? 1.0 : EDGE_FIX_ALPHA;
+# endif
+ colorDist(point_color, size);
+ }
}
#endif
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
index 88cb6c07a94..1a44e4a9e4f 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
@@ -2,16 +2,12 @@
/* Solid Wirefram implementation
* Mike Erwin, Clément Foucault */
-/* This shader follows the principles of
- * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
-
layout(lines) in;
-layout(triangle_strip, max_vertices=6) out;
+layout(triangle_strip, max_vertices=4) out;
uniform mat4 ProjectionMatrix;
uniform vec2 viewportSize;
-in vec4 vPos[];
in vec4 pPos[];
in ivec4 vData[];
#ifdef VERTEX_FACING
@@ -34,8 +30,14 @@ out float facing;
/* See fragment shader */
flat out vec2 ssPos[3];
-#define FACE_ACTIVE (1 << 2)
-#define FACE_SELECTED (1 << 3)
+/* Some bugged AMD drivers need these global variables. See T55961 */
+#ifdef VERTEX_SELECTION
+vec3 vertex_color[3];
+#endif
+
+#ifdef VERTEX_FACING
+float v_facing[3];
+#endif
/* project to screen space */
vec2 proj(vec4 pos)
@@ -46,11 +48,11 @@ vec2 proj(vec4 pos)
void doVertex(int v, vec4 pos)
{
#ifdef VERTEX_SELECTION
- vertexColor = EDIT_MESH_vertex_color(vData[v].x).rgb;
+ vertexColor = vertex_color[v];
#endif
#ifdef VERTEX_FACING
- facing = vFacing[v];
+ facing = v_facing[v];
#endif
gl_Position = pos;
@@ -83,19 +85,26 @@ void main()
/* Perspective */
if (ProjectionMatrix[3][3] == 0.0) {
- /* vPos[i].z is negative and we don't want
- * our fixvec to be flipped */
- dirs1 *= -vPos[0].z;
- dirs2 *= -vPos[1].z;
+ dirs1 *= pPos[0].w;
+ dirs2 *= pPos[1].w;
}
+#ifdef VERTEX_SELECTION
+ vertex_color[0] = EDIT_MESH_vertex_color(vData[0].x).rgb;
+ vertex_color[1] = EDIT_MESH_vertex_color(vData[1].x).rgb;
+#endif
+
+#ifdef VERTEX_FACING
+ /* Weird but some buggy AMD drivers need this. */
+ v_facing[0] = vFacing[0];
+ v_facing[1] = vFacing[1];
+#endif
+
/* Edge / Vert data */
ssPos[0] = ssPos[2] = pos[0];
ssPos[1] = pos[1];
flag[0] = flag[2] = (vData[0].x << 8);
flag[1] = (vData[1].x << 8);
-
- doVertex(0, pPos[0] + vec4(-dirs1.xy, 0.0, 0.0));
doVertex(0, pPos[0] + vec4( dirs1.zw, 0.0, 0.0));
doVertex(0, pPos[0] + vec4(-dirs1.zw, 0.0, 0.0));
@@ -106,8 +115,5 @@ void main()
doVertex(1, pPos[1] + vec4( dirs2.zw, 0.0, 0.0));
doVertex(1, pPos[1] + vec4(-dirs2.zw, 0.0, 0.0));
- flag[2] = 0;
- doVertex(1, pPos[1] + vec4( dirs2.xy, 0.0, 0.0));
-
EndPrimitive();
}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
index f19c203a70d..e9adc38ea27 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
@@ -2,35 +2,19 @@
/* Solid Wirefram implementation
* Mike Erwin, Clément Foucault */
-/* This shader follows the principles of
- * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
-
layout(triangles) in;
-/* This is not perfect. Only a subset of intel gpus are affected.
- * This fix have some performance impact.
- * TODO Refine the range to only affect GPUs. */
-
-#ifdef EDGE_FIX
/* To fix the edge artifacts, we render
* an outline strip around the screenspace
* triangle. Order is important.
* TODO diagram
*/
-
-#ifdef VERTEX_SELECTION
-layout(triangle_strip, max_vertices=23) out;
-#else
-layout(triangle_strip, max_vertices=17) out;
-#endif
-#else
-layout(triangle_strip, max_vertices=3) out;
-#endif
+layout(triangle_strip, max_vertices=12) out;
uniform mat4 ProjectionMatrix;
uniform vec2 viewportSize;
+uniform bool isXray = false;
-in vec4 vPos[];
in vec4 pPos[];
in ivec4 vData[];
#ifdef VERTEX_FACING
@@ -43,7 +27,8 @@ flat out vec3 edgesCrease;
flat out vec3 edgesBweight;
flat out vec4 faceColor;
flat out ivec3 flag;
-flat out int clipCase;
+
+flat out vec2 ssPos[3];
#ifdef VERTEX_SELECTION
out vec3 vertexColor;
#endif
@@ -51,11 +36,20 @@ out vec3 vertexColor;
out float facing;
#endif
-/* See fragment shader */
-flat out vec2 ssPos[3];
+#ifdef ANTI_ALIASING
+#define Z_OFFSET -0.0013
+#else
+#define Z_OFFSET 0.0
+#endif
+
+/* Some bugged AMD drivers need these global variables. See T55961 */
+#ifdef VERTEX_SELECTION
+vec3 vertex_color[3];
+#endif
-#define FACE_ACTIVE (1 << 2)
-#define FACE_SELECTED (1 << 3)
+#ifdef VERTEX_FACING
+float v_facing[3];
+#endif
/* project to screen space */
vec2 proj(vec4 pos)
@@ -66,142 +60,151 @@ vec2 proj(vec4 pos)
void doVertex(int v)
{
#ifdef VERTEX_SELECTION
- vertexColor = EDIT_MESH_vertex_color(vData[v].x).rgb;
+ vertexColor = vertex_color[v];
#endif
#ifdef VERTEX_FACING
- facing = vFacing[v];
+ facing = v_facing[v];
#endif
-
gl_Position = pPos[v];
EmitVertex();
}
-void doLoopStrip(int v, vec3 offset)
+void doVertexOfs(int v, vec2 fixvec)
{
- doVertex(v);
+#ifdef VERTEX_SELECTION
+ vertexColor = vertex_color[v];
+#endif
- gl_Position.xyz += offset;
+#ifdef VERTEX_FACING
+ facing = v_facing[v];
+#endif
+ gl_Position = pPos[v] + vec4(fixvec * pPos[v].w, Z_OFFSET, 0.0);
EmitVertex();
}
-#ifdef ANTI_ALIASING
-#define Z_OFFSET 0.008
-#else
-#define Z_OFFSET 0.0
-#endif
+void mask_edge_flag(int v, ivec3 eflag)
+{
+ int vaf = (v + 1) % 3;
+
+ /* Only shade the edge that we are currently drawing.
+ * (fix corner bleeding) */
+ flag = eflag;
+ flag[vaf] &= ~EDGE_EXISTS;
+ flag[v] &= ~EDGE_EXISTS;
+}
+
+vec2 compute_fixvec(int i)
+{
+ int i1 = (i + 1) % 3;
+ int i2 = (i + 2) % 3;
+ /* This fix the case when 2 vertices are perfectly aligned
+ * and corner vectors have nowhere to go.
+ * ie: length(cornervec[i]) == 0 */
+ const float epsilon = 1e-2; /* in pixel so not that much */
+ const vec2 bias[3] = vec2[3](
+ vec2( epsilon, epsilon),
+ vec2(-epsilon, epsilon),
+ vec2( 0.0, -epsilon)
+ );
+ vec2 v1 = ssPos[i] + bias[i];
+ vec2 v2 = ssPos[i1] + bias[i1];
+ vec2 v3 = ssPos[i2] + bias[i2];
+ /* Edge normalized vector */
+ vec2 dir = normalize(v2 - v1);
+ vec2 dir2 = normalize(v3 - v1);
+ /* perpendicular to dir */
+ vec2 perp = vec2(-dir.y, dir.x);
+ /* Backface case */
+ if (dot(perp, dir2) > 0.0) {
+ perp = -perp;
+ }
+ /* Make it view independent */
+ return perp * sizeEdgeFix / viewportSize;;
+}
void main()
{
/* Edge */
ivec3 eflag;
for (int v = 0; v < 3; ++v) {
- flag[v] = eflag[v] = vData[v].y | (vData[v].x << 8);
+ eflag[v] = vData[v].y | (vData[v].x << 8);
edgesCrease[v] = vData[v].z / 255.0;
edgesBweight[v] = vData[v].w / 255.0;
}
/* Face */
+ vec4 fcol;
if ((vData[0].x & FACE_ACTIVE) != 0)
- faceColor = colorFaceSelect;
+ fcol = colorFaceSelect;
else if ((vData[0].x & FACE_SELECTED) != 0)
- faceColor = colorFaceSelect;
+ fcol = colorFaceSelect;
+ else if ((vData[0].x & FACE_FREESTYLE) != 0)
+ fcol = colorFaceFreestyle;
else
- faceColor = colorFace;
+ fcol = colorFace;
/* Vertex */
ssPos[0] = proj(pPos[0]);
ssPos[1] = proj(pPos[1]);
ssPos[2] = proj(pPos[2]);
- doVertex(0);
- doVertex(1);
- doVertex(2);
+#ifdef VERTEX_SELECTION
+ vertex_color[0] = EDIT_MESH_vertex_color(vData[0].x).rgb;
+ vertex_color[1] = EDIT_MESH_vertex_color(vData[1].x).rgb;
+ vertex_color[2] = EDIT_MESH_vertex_color(vData[2].x).rgb;
+#endif
-#ifdef EDGE_FIX
- vec2 fixvec[6];
- vec2 fixvecaf[6];
- vec2 cornervec[3];
+#ifdef VERTEX_FACING
+ /* Weird but some buggy AMD drivers need this. */
+ v_facing[0] = vFacing[0];
+ v_facing[1] = vFacing[1];
+ v_facing[2] = vFacing[2];
+#endif
- /* This fix the case when 2 vertices are perfectly aligned
- * and corner vectors have nowhere to go.
- * ie: length(cornervec[i]) == 0 */
- const float epsilon = 1e-2; /* in pixel so not that much */
- const vec2 bias[3] = vec2[3](
- vec2( epsilon, epsilon),
- vec2(-epsilon, epsilon),
- vec2( 0.0, -epsilon)
- );
+ /* Remember that we are assuming the last vertex
+ * of a triangle is the provoking vertex (decide what flat attribs are). */
- for (int i = 0; i < 3; ++i) {
- int i1 = (i + 1) % 3;
- int i2 = (i + 2) % 3;
-
- vec2 v1 = ssPos[i] + bias[i];
- vec2 v2 = ssPos[i1] + bias[i1];
- vec2 v3 = ssPos[i2] + bias[i2];
-
- /* Edge normalized vector */
- vec2 dir = normalize(v2 - v1);
- vec2 dir2 = normalize(v3 - v1);
-
- cornervec[i] = -normalize(dir + dir2);
-
- /* perpendicular to dir */
- vec2 perp = vec2(-dir.y, dir.x);
-
- /* Backface case */
- if (dot(perp, dir2) > 0) {
- perp = -perp;
- }
-
- /* Make it view independent */
- perp *= sizeEdgeFix / viewportSize;
- cornervec[i] *= sizeEdgeFix / viewportSize;
- fixvec[i] = fixvecaf[i] = perp;
-
- /* Perspective */
- if (ProjectionMatrix[3][3] == 0.0) {
- /* vPos[i].z is negative and we don't want
- * our fixvec to be flipped */
- fixvec[i] *= -vPos[i].z;
- fixvecaf[i] *= -vPos[i1].z;
- cornervec[i] *= -vPos[i].z;
- }
- }
+ if ((eflag[2] & EDGE_EXISTS) != 0) {
+ /* Do 0 -> 1 edge strip */
+ faceColor = vec4(fcol.rgb, 0.0);
+ mask_edge_flag(0, eflag);
- /* to not let face color bleed */
- faceColor.a = 0.0;
+ vec2 fixvec = compute_fixvec(0);
+ doVertexOfs(0, fixvec);
+ doVertexOfs(1, fixvec);
+ }
- /* Start with the same last vertex to create a
- * degenerate triangle in order to "create"
- * a new triangle strip */
- for (int i = 2; i < 5; ++i) {
- int vbe = (i - 1) % 3;
- int vaf = (i + 1) % 3;
- int v = i % 3;
+ doVertex(0);
+ doVertex(1);
- doLoopStrip(v, vec3(fixvec[v], Z_OFFSET));
+ /* Do face triangle */
+ faceColor = fcol;
+ flag = (isXray) ? ivec3(0) : eflag;
+ doVertex(2);
+ faceColor.a = 0.0; /* to not let face color bleed */
- /* Only shade the edge that we are currently drawing.
- * (fix corner bleeding) */
- flag[vbe] |= (EDGE_EXISTS & eflag[vbe]);
- flag[vaf] &= ~EDGE_EXISTS;
- flag[v] &= ~EDGE_EXISTS;
- doLoopStrip(vaf, vec3(fixvecaf[v], Z_OFFSET));
+ if ((eflag[0] & EDGE_EXISTS) != 0) {
+ /* Do 1 -> 2 edge strip */
+ mask_edge_flag(1, eflag);
- /* corner vertices should not draw edges but draw point only */
- flag[vbe] &= ~EDGE_EXISTS;
-#ifdef VERTEX_SELECTION
- doLoopStrip(vaf, vec3(cornervec[vaf], Z_OFFSET));
-#endif
+ vec2 fixvec = compute_fixvec(1);
+ doVertexOfs(1, fixvec);
+ doVertexOfs(2, fixvec);
}
+ EndPrimitive();
- /* finish the loop strip */
- doLoopStrip(2, vec3(fixvec[2], Z_OFFSET));
-#endif
+ if ((eflag[1] & EDGE_EXISTS) != 0) {
+ /* Do 2 -> 0 edge strip */
+ mask_edge_flag(2, eflag);
+ doVertex(2);
+ doVertex(0);
- EndPrimitive();
+ vec2 fixvec = compute_fixvec(2);
+ doVertexOfs(2, fixvec);
+ doVertexOfs(0, fixvec);
+ EndPrimitive();
+ }
}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl
deleted file mode 100644
index 13d824c2410..00000000000
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl
+++ /dev/null
@@ -1,52 +0,0 @@
-
-/* Solid Wirefram implementation
- * Mike Erwin, Clément Foucault */
-
-/* This shader follows the principles of
- * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
-
-uniform mat4 ModelViewProjectionMatrix;
-uniform vec2 viewportSize;
-
-in vec3 pos;
-in ivec4 data;
-
-/* these are the same for all vertices
- * and does not need interpolation */
-flat out vec3 edgesCrease;
-flat out vec3 edgesBweight;
-flat out vec4 faceColor;
-flat out ivec3 flag;
-#ifdef VERTEX_SELECTION
-out vec3 vertexColor;
-#endif
-
-/* See fragment shader */
-flat out vec2 ssPos[3];
-
-/* project to screen space */
-vec2 proj(vec4 pos)
-{
- return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize;
-}
-
-void main()
-{
- edgesCrease = vec3(0.0);
- edgesBweight = vec3(0.0);
-
- vec4 pPos = ModelViewProjectionMatrix * vec4(pos, 1.0);
-
- /* there is no face */
- faceColor = vec4(0.0);
-
-#ifdef VERTEX_SELECTION
- vertexColor = vec3(0.0);
-#endif
-
- ssPos[0] = ssPos[1] = ssPos[2] = proj(pPos);
- flag[0] = flag[1] = flag[2] = (data.x << 8);
-
- gl_PointSize = sizeEdgeFix;
- gl_Position = pPos;
-}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl
new file mode 100644
index 00000000000..722411571e4
--- /dev/null
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl
@@ -0,0 +1,41 @@
+
+uniform mat3 NormalMatrix;
+uniform mat4 ProjectionMatrix;
+uniform mat4 ModelViewMatrix;
+uniform mat4 ModelViewProjectionMatrix;
+uniform float ofs = 1e-4;
+
+in vec3 pos;
+in ivec4 data;
+#ifdef VERTEX_FACING
+in vec3 vnor;
+#endif
+
+out vec4 finalColor;
+
+void main()
+{
+ finalColor = colorVertex;
+ finalColor = ((data.x & VERTEX_SELECTED) != 0) ? colorVertexSelect : finalColor;
+ finalColor = ((data.x & VERTEX_ACTIVE) != 0) ? vec4(colorEditMeshActive.xyz, 1.0) : finalColor;
+
+ gl_PointSize = sizeVertex * 2.0;
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ gl_Position.z -= ofs;
+
+#ifdef VERTEX_FACING
+ vec4 vPos = ModelViewMatrix * vec4(pos, 1.0);
+ vec3 view_normal = normalize(NormalMatrix * vnor);
+ vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
+ ? normalize(vPos.xyz)
+ : vec3(0.0, 0.0, 1.0);
+ float facing = dot(view_vec, view_normal);
+
+ finalColor.a *= 1.0 - abs(facing) * 0.4;
+#endif
+
+ if ((data.x & VERTEX_EXISTS) == 0) {
+ gl_Position = vec4(0.0);
+ gl_PointSize = 0.0;
+ }
+}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
index 8ebfa4376f0..f1ebb419d60 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
@@ -2,37 +2,101 @@
/* Solid Wirefram implementation
* Mike Erwin, Clément Foucault */
-/* This shader follows the principles of
- * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
-
+uniform mat3 NormalMatrix;
+uniform mat4 ProjectionMatrix;
uniform mat4 ModelViewMatrix;
uniform mat4 ModelViewProjectionMatrix;
+uniform ivec4 dataMask = ivec4(0xFF);
+
+uniform float ofs = 1e-5;
+
+uniform isamplerBuffer dataBuffer;
in vec3 pos;
+#ifdef VERTEX_FACING
+in vec3 vnor;
+#endif
+
+#ifdef EDGE_FIX
in ivec4 data;
-out vec4 vPos;
out vec4 pPos;
out ivec4 vData;
-
-#ifdef VERTEX_FACING
-uniform mat4 ProjectionMatrix;
-uniform mat3 NormalMatrix;
-
-in vec3 vnor;
+# ifdef VERTEX_FACING
out float vFacing;
-#endif
+# endif
void main()
{
- vPos = ModelViewMatrix * vec4(pos, 1.0);
pPos = ModelViewProjectionMatrix * vec4(pos, 1.0);
- vData = data;
-#ifdef VERTEX_FACING
+ pPos.z -= ofs;
+ vData = data & dataMask;
+# ifdef VERTEX_FACING
+ vec4 vpos = ModelViewMatrix * vec4(pos, 1.0);
vec3 view_normal = normalize(NormalMatrix * vnor);
vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
- ? normalize(vPos.xyz)
+ ? normalize(vpos.xyz)
: vec3(0.0, 0.0, 1.0);
vFacing = dot(view_vec, view_normal);
-#endif
+# endif
+}
+
+#else /* EDGE_FIX */
+
+flat out vec3 edgesCrease;
+flat out vec3 edgesBweight;
+flat out vec4 faceColor;
+flat out ivec3 flag;
+# ifdef VERTEX_SELECTION
+out vec3 vertexColor;
+# endif
+# ifdef VERTEX_FACING
+out float facing;
+# endif
+
+out vec3 barycentric;
+
+void main()
+{
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ gl_Position.z -= ofs;
+
+ int v_0 = (gl_VertexID / 3) * 3;
+ int vidx = gl_VertexID % 3;
+ barycentric = vec3(equal(ivec3(0, 1, 2), ivec3(vidx)));
+
+ /* Edge */
+ ivec4 vData[3], data = ivec4(0);
+ ivec3 eflag;
+ for (int v = 0; v < 3; ++v) {
+ data = texelFetch(dataBuffer, v_0 + v);
+ vData[v] = data & dataMask;
+ flag[v] = eflag[v] = vData[v].y | (vData[v].x << 8);
+ edgesCrease[v] = vData[v].z / 255.0;
+ edgesBweight[v] = vData[v].w / 255.0;
+ }
+
+ /* Face */
+ if ((vData[0].x & FACE_ACTIVE) != 0)
+ faceColor = colorFaceSelect;
+ else if ((vData[0].x & FACE_SELECTED) != 0)
+ faceColor = colorFaceSelect;
+ else if ((vData[0].x & FACE_FREESTYLE) != 0)
+ faceColor = colorFaceFreestyle;
+ else
+ faceColor = colorFace;
+
+# ifdef VERTEX_SELECTION
+ vertexColor = EDIT_MESH_vertex_color(vData[vidx].x).rgb;
+# endif
+# ifdef VERTEX_FACING
+ vec4 vPos = ModelViewMatrix * vec4(pos, 1.0);
+ vec3 view_normal = normalize(NormalMatrix * vnor);
+ vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
+ ? normalize(vPos.xyz)
+ : vec3(0.0, 0.0, 1.0);
+ facing = dot(view_vec, view_normal);
+# endif
}
+
+#endif
diff --git a/source/blender/draw/modes/shaders/object_empty_axes_vert.glsl b/source/blender/draw/modes/shaders/object_empty_axes_vert.glsl
index 8f9c074be23..10e8805ef55 100644
--- a/source/blender/draw/modes/shaders/object_empty_axes_vert.glsl
+++ b/source/blender/draw/modes/shaders/object_empty_axes_vert.glsl
@@ -2,7 +2,7 @@
uniform mat4 ViewProjectionMatrix;
uniform vec3 screenVecs[3];
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in float axis; /* position on the axis. [0.0-1.0] is X axis, [1.0-2.0] is Y, etc... */
in vec2 screenPos;
diff --git a/source/blender/draw/modes/shaders/object_empty_image_frag.glsl b/source/blender/draw/modes/shaders/object_empty_image_frag.glsl
index eab107354d1..e47b28d80c6 100644
--- a/source/blender/draw/modes/shaders/object_empty_image_frag.glsl
+++ b/source/blender/draw/modes/shaders/object_empty_image_frag.glsl
@@ -11,6 +11,8 @@ out vec4 fragColor;
uniform sampler2D image;
#endif
+uniform int depthMode;
+
void main()
{
#ifdef USE_WIRE
@@ -18,4 +20,14 @@ void main()
#else
fragColor = finalColor * texture(image, texCoord_interp);
#endif
+
+ if (depthMode == DEPTH_BACK) {
+ gl_FragDepth = 0.999999;
+ }
+ else if (depthMode == DEPTH_FRONT) {
+ gl_FragDepth = 0.000001;
+ }
+ else if (depthMode == DEPTH_UNCHANGED) {
+ gl_FragDepth = gl_FragCoord.z;
+ }
}
diff --git a/source/blender/draw/modes/shaders/object_empty_image_vert.glsl b/source/blender/draw/modes/shaders/object_empty_image_vert.glsl
index c629fdcb7ef..c1a957f0640 100644
--- a/source/blender/draw/modes/shaders/object_empty_image_vert.glsl
+++ b/source/blender/draw/modes/shaders/object_empty_image_vert.glsl
@@ -2,7 +2,7 @@
uniform mat4 ViewProjectionMatrix;
uniform vec2 aspect;
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec2 texCoord;
in vec2 pos;
/* ---- Per instance Attribs ---- */
diff --git a/source/blender/draw/modes/shaders/object_grid_frag.glsl b/source/blender/draw/modes/shaders/object_grid_frag.glsl
index aa2b45b5b50..35a95e809df 100644
--- a/source/blender/draw/modes/shaders/object_grid_frag.glsl
+++ b/source/blender/draw/modes/shaders/object_grid_frag.glsl
@@ -12,6 +12,7 @@ uniform vec3 eye;
uniform vec4 gridSettings;
uniform vec2 viewportSize;
uniform vec4 screenvecs[3];
+uniform float lineKernel = 0.0;
uniform float gridOneOverLogSubdiv;
uniform sampler2D depthBuffer;
@@ -31,7 +32,18 @@ uniform int gridFlag;
#define PLANE_YZ (1 << 6)
#define GRID_BACK (1 << 9) /* grid is behind objects */
-#define GRID_LINE_SMOOTH 1.15
+#define M_1_SQRTPI 0.5641895835477563 /* 1/sqrt(pi) */
+
+/**
+ * We want to know how much a pixel is covered by a line.
+ * We replace the square pixel with acircle of the same area and try to find the intersection area.
+ * The area we search is the circular segment. https://en.wikipedia.org/wiki/Circular_segment
+ * The formula for the area uses inverse trig function and is quite complexe.
+ * Instead, we approximate it by using the smoothstep function and a 1.05 factor to the disc radius.
+ **/
+#define DISC_RADIUS (M_1_SQRTPI * 1.05)
+#define GRID_LINE_SMOOTH_START (0.5 - DISC_RADIUS)
+#define GRID_LINE_SMOOTH_END (0.5 + DISC_RADIUS)
float get_grid(vec2 co, vec2 fwidthCos, float grid_size)
{
@@ -42,10 +54,10 @@ float get_grid(vec2 co, vec2 fwidthCos, float grid_size)
* (make lines have the same width under perspective) */
grid_domain /= fwidthCos;
- /* collapse waves and normalize */
- grid_domain.x = min(grid_domain.x, grid_domain.y) / half_size;
+ /* collapse waves */
+ float line_dist = min(grid_domain.x, grid_domain.y);
- return 1.0 - smoothstep(0.0, GRID_LINE_SMOOTH / grid_size, grid_domain.x * 0.5);
+ return 1.0 - smoothstep(GRID_LINE_SMOOTH_START, GRID_LINE_SMOOTH_END, line_dist - lineKernel);
}
vec3 get_axes(vec3 co, vec3 fwidthCos, float line_size)
@@ -55,7 +67,7 @@ vec3 get_axes(vec3 co, vec3 fwidthCos, float line_size)
* (make line have the same width under perspective) */
axes_domain /= fwidthCos;
- return 1.0 - smoothstep(0.0, GRID_LINE_SMOOTH, axes_domain - line_size);
+ return 1.0 - smoothstep(GRID_LINE_SMOOTH_START, GRID_LINE_SMOOTH_END, axes_domain - (line_size + lineKernel));
}
vec3 get_floor_pos(vec2 uv, out vec3 wPos)
@@ -97,7 +109,7 @@ void main()
vec2 sPos = gl_FragCoord.xy / viewportSize; /* Screen [0,1] position */
/* To reduce artifacts, use a local version of the positions
- * to compute derivatives since they are not position dependant.
+ * to compute derivatives since they are not position dependent.
* This gets rid of the blocky artifacts. Unfortunately we still
* need the world position for the grid to scale properly from the origin. */
vec3 gPos, wPos; /* Grid pos., World pos. */
@@ -170,9 +182,10 @@ void main()
float gridB = get_grid(grid_pos, grid_fwidth, scaleB);
float gridC = get_grid(grid_pos, grid_fwidth, scaleC);
- FragColor = vec4(colorGrid.rgb, gridA * blend);
- FragColor = mix(FragColor, vec4(mix(colorGrid.rgb, colorGridEmphasise.rgb, blend), 1.0), gridB);
- FragColor = mix(FragColor, vec4(colorGridEmphasise.rgb, 1.0), gridC);
+ FragColor = colorGrid;
+ FragColor.a *= gridA * blend;
+ FragColor = mix(FragColor, mix(colorGrid, colorGridEmphasise, blend), gridB);
+ FragColor = mix(FragColor, colorGridEmphasise, gridC);
}
else {
FragColor = vec4(colorGrid.rgb, 0.0);
@@ -222,7 +235,7 @@ void main()
else {
/* Manual, non hard, depth test:
* Progressively fade the grid below occluders
- * (avoids poping visuals due to depth buffer precision) */
+ * (avoids popping visuals due to depth buffer precision) */
/* Harder settings tend to flicker more,
* but have less "see through" appearance. */
const float test_hardness = 1e7;
diff --git a/source/blender/draw/modes/shaders/object_mball_handles_vert.glsl b/source/blender/draw/modes/shaders/object_mball_handles_vert.glsl
index baa3ecb804c..b1c10feb62c 100644
--- a/source/blender/draw/modes/shaders/object_mball_handles_vert.glsl
+++ b/source/blender/draw/modes/shaders/object_mball_handles_vert.glsl
@@ -7,7 +7,7 @@
uniform mat4 ViewProjectionMatrix;
uniform vec3 screen_vecs[2];
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec2 pos;
/* ---- Per instance Attribs ---- */
diff --git a/source/blender/draw/modes/shaders/object_outline_prepass_geom.glsl b/source/blender/draw/modes/shaders/object_outline_prepass_geom.glsl
index c90195e11fd..1fa0a9137c0 100644
--- a/source/blender/draw/modes/shaders/object_outline_prepass_geom.glsl
+++ b/source/blender/draw/modes/shaders/object_outline_prepass_geom.glsl
@@ -29,7 +29,7 @@ void main()
return;
/* Don't outline if concave edge. */
- /* That would hide a lot of non usefull edge but it flickers badly.
+ /* That would hide a lot of non useful edge but it flickers badly.
* TODO revisit later... */
// if (dot(n0, v13) > 0.01)
// return;
diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
index 5dfbb4352e4..69af4858a48 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
@@ -1,22 +1,22 @@
+#ifndef SELECT_EDGES
uniform vec3 wireColor;
uniform vec3 rimColor;
-flat in vec3 ssVec0;
-flat in vec3 ssVec1;
-flat in vec3 ssVec2;
in float facing;
+in vec3 barycentric;
-#ifdef LIGHT_EDGES
+# ifdef LIGHT_EDGES
flat in vec3 edgeSharpness;
-#endif
+# endif
out vec4 fragColor;
+#endif
float min_v3(vec3 v) { return min(v.x, min(v.y, v.z)); }
float max_v3(vec3 v) { return max(v.x, max(v.y, v.z)); }
/* In pixels */
-const float wire_size = 0.0; /* Expands the core of the wire (part that is 100% wire color) */
+uniform float wireSize = 0.0; /* Expands the core of the wire (part that is 100% wire color) */
const float wire_smooth = 1.2; /* Smoothing distance after the 100% core. */
/* Alpha constants could be exposed in the future. */
@@ -25,29 +25,33 @@ const float rim_alpha = 0.75;
void main()
{
- vec3 ss_pos = vec3(gl_FragCoord.xy, 1.0);
- vec3 dist_to_edge = vec3(
- dot(ss_pos, ssVec0),
- dot(ss_pos, ssVec1),
- dot(ss_pos, ssVec2)
+#ifndef SELECT_EDGES
+ vec3 dx = dFdx(barycentric);
+ vec3 dy = dFdy(barycentric);
+ vec3 d = vec3(
+ length(vec2(dx.x, dy.x)),
+ length(vec2(dx.y, dy.y)),
+ length(vec2(dx.z, dy.z))
);
+ vec3 dist_to_edge = barycentric / d;
-#ifdef LIGHT_EDGES
+# ifdef LIGHT_EDGES
vec3 fac = abs(dist_to_edge);
-#else
+# else
float fac = min_v3(abs(dist_to_edge));
-#endif
+# endif
- fac = smoothstep(wire_size + wire_smooth, wire_size, fac);
+ fac = smoothstep(wireSize + wire_smooth, wireSize, fac);
float facing_clamped = clamp((gl_FrontFacing) ? facing : -facing, 0.0, 1.0);
vec3 final_front_col = mix(rimColor, wireColor, 0.05);
fragColor = mix(vec4(rimColor, rim_alpha), vec4(final_front_col, front_alpha), facing_clamped);
-#ifdef LIGHT_EDGES
+# ifdef LIGHT_EDGES
fragColor.a *= max_v3(fac * edgeSharpness);
-#else
+# else
fragColor.a *= fac;
+# endif
#endif
}
diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl
index eb69af92435..8abb6ecc737 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl
@@ -3,36 +3,34 @@
* than doing everything thrice in the vertex shader. */
layout(triangles) in;
+#ifdef SELECT_EDGES
+layout(line_strip, max_vertices = 6) out;
+#else
layout(triangle_strip, max_vertices = 3) out;
+#endif
uniform vec2 wireStepParam;
in vec2 ssPos[];
in float facingOut[];
-flat out vec3 ssVec0;
-flat out vec3 ssVec1;
-flat out vec3 ssVec2;
+#ifndef SELECT_EDGES
+out vec3 barycentric;
out float facing;
+#endif
#ifdef LIGHT_EDGES
in vec3 obPos[];
in vec3 vNor[];
in float forceEdge[];
+# ifndef SELECT_EDGES
flat out vec3 edgeSharpness;
+# endif
#endif
#define NO_EDGE vec3(10000.0);
-/* TODO(fclem) remove code duplication. */
-vec3 compute_vec(vec2 v0, vec2 v1)
-{
- vec2 v = normalize(v1 - v0);
- v = vec2(-v.y, v.x);
- return vec3(v, -dot(v, v0));
-}
-
vec3 get_edge_normal(vec3 n1, vec3 n2, vec3 edge)
{
edge = normalize(edge);
@@ -47,15 +45,27 @@ float get_edge_sharpness(vec3 fnor, vec3 vnor)
return smoothstep(wireStepParam.x, wireStepParam.y, sharpness);
}
+vec3 get_barycentric(bvec3 do_edge, const int v)
+{
+ int v_n = v;
+ int v_n1 = (v + 1) % 3;
+ int v_n2 = (v + 2) % 3;
+ vec3 bary;
+ bary[v_n] = do_edge[v_n] ? 0.0 : 1.0;
+ bary[v_n1] = 1.0;
+ bary[v_n2] = do_edge[v_n2] ? 0.0 : 1.0;
+ return bary;
+}
+
void main(void)
{
vec3 facings = vec3(facingOut[0], facingOut[1], facingOut[2]);
bvec3 do_edge = greaterThan(abs(facings), vec3(1.0));
facings = fract(facings) - clamp(-sign(facings), 0.0, 1.0);
- ssVec0 = do_edge.x ? compute_vec(ssPos[0], ssPos[1]) : NO_EDGE;
- ssVec1 = do_edge.y ? compute_vec(ssPos[1], ssPos[2]) : NO_EDGE;
- ssVec2 = do_edge.z ? compute_vec(ssPos[2], ssPos[0]) : NO_EDGE;
+#ifdef SELECT_EDGES
+ vec3 edgeSharpness;
+#endif
#ifdef LIGHT_EDGES
vec3 edges[3];
@@ -71,16 +81,47 @@ void main(void)
edgeSharpness.y = (forceEdge[1] == 1.0) ? 1.0 : edgeSharpness.y;
edgeSharpness.z = (forceEdge[2] == 1.0) ? 1.0 : edgeSharpness.z;
#endif
+
+#ifdef SELECT_EDGES
+ const float edge_select_threshold = 0.3;
+ if (edgeSharpness.x > edge_select_threshold) {
+ gl_Position = gl_in[0].gl_Position;
+ EmitVertex();
+ gl_Position = gl_in[1].gl_Position;
+ EmitVertex();
+ EndPrimitive();
+ }
+
+ if (edgeSharpness.y > edge_select_threshold) {
+ gl_Position = gl_in[1].gl_Position;
+ EmitVertex();
+ gl_Position = gl_in[2].gl_Position;
+ EmitVertex();
+ EndPrimitive();
+ }
+
+ if (edgeSharpness.z > edge_select_threshold) {
+ gl_Position = gl_in[2].gl_Position;
+ EmitVertex();
+ gl_Position = gl_in[0].gl_Position;
+ EmitVertex();
+ EndPrimitive();
+ }
+#else
+ barycentric = get_barycentric(do_edge, 0);
gl_Position = gl_in[0].gl_Position;
facing = facings.x;
EmitVertex();
+ barycentric = get_barycentric(do_edge, 1);
gl_Position = gl_in[1].gl_Position;
facing = facings.y;
EmitVertex();
+ barycentric = get_barycentric(do_edge, 2);
gl_Position = gl_in[2].gl_Position;
facing = facings.z;
EmitVertex();
EndPrimitive();
+#endif
}
diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
index 9a34fc740db..828bc551cad 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
@@ -5,7 +5,6 @@ uniform mat4 ProjectionMatrix;
uniform mat3 NormalMatrix;
uniform vec2 wireStepParam;
-uniform vec2 viewportSize;
uniform float nearDist;
uniform samplerBuffer vertData;
@@ -16,39 +15,6 @@ in vec3 pos;
in vec3 nor;
#endif
-#ifdef USE_GEOM_SHADER
-out vec2 ssPos;
-out float facingOut; /* abs(facing) > 1.0 if we do edge */
-#else
-flat out vec3 ssVec0;
-flat out vec3 ssVec1;
-flat out vec3 ssVec2;
-out float facing;
-#endif
-
-#ifdef LIGHT_EDGES
-#ifdef USE_GEOM_SHADER
-out vec3 obPos;
-out vec3 vNor;
-out float forceEdge;
-#else
-flat out vec3 edgeSharpness;
-#endif
-#endif
-
-/* project to screen space */
-vec2 proj(vec4 pos)
-{
- return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize;
-}
-
-vec3 compute_vec(vec2 v0, vec2 v1)
-{
- vec2 v = normalize(v1 - v0);
- v = vec2(-v.y, v.x);
- return vec3(v, -dot(v, v0));
-}
-
float short_to_unit_float(uint s)
{
int value = int(s) & 0x7FFF;
@@ -99,12 +65,18 @@ float get_edge_sharpness(vec3 fnor, vec3 vnor)
return smoothstep(wireStepParam.x, wireStepParam.y, sharpness);
}
-#define NO_EDGE vec3(10000.0);
+#ifdef USE_GEOM_SHADER
+
+# ifdef LIGHT_EDGES
+out vec3 obPos;
+out vec3 vNor;
+out float forceEdge;
+# endif
+out float facingOut; /* abs(facing) > 1.0 if we do edge */
void main()
{
-#ifdef USE_GEOM_SHADER
-#ifndef USE_SCULPT
+# ifndef USE_SCULPT
uint v_id = texelFetch(faceIds, gl_VertexID).r;
bool do_edge = (v_id & (1u << 30u)) != 0u;
@@ -113,26 +85,37 @@ void main()
vec3 pos = get_vertex_pos(v_id);
vec3 nor = get_vertex_nor(v_id);
-#else
+# else
const bool do_edge = true;
const bool force_edge = false;
-#endif
+# endif
facingOut = normalize(NormalMatrix * nor).z;
facingOut += (do_edge) ? ((facingOut > 0.0) ? 2.0 : -2.0) : 0.0;
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
- ssPos = proj(gl_Position);
# ifdef LIGHT_EDGES
obPos = pos;
vNor = nor;
forceEdge = float(force_edge); /* meh, could try to also encode it in facingOut */
# endif
+}
+
+#else /* USE_GEOM_SHADER */
-#else
+# ifdef LIGHT_EDGES
+flat out vec3 edgeSharpness;
+# endif
+out float facing;
+out vec3 barycentric;
+
+void main()
+{
int v_0 = (gl_VertexID / 3) * 3;
int v_n = gl_VertexID % 3;
+ int v_n1 = (gl_VertexID + 1) % 3;
+ int v_n2 = (gl_VertexID + 2) % 3;
/* Getting the same positions for each of the 3 verts. */
uvec3 v_id;
@@ -150,30 +133,24 @@ void main()
v_id = (v_id << 2u) >> 2u;
vec3 pos[3];
- pos[0] = get_vertex_pos(v_id.x);
- pos[1] = get_vertex_pos(v_id.y);
- pos[2] = get_vertex_pos(v_id.z);
-
vec4 p_pos[3];
- p_pos[0] = ModelViewProjectionMatrix * vec4(pos[0], 1.0);
- p_pos[1] = ModelViewProjectionMatrix * vec4(pos[1], 1.0);
- p_pos[2] = ModelViewProjectionMatrix * vec4(pos[2], 1.0);
-
- vec2 ss_pos[3];
- ss_pos[0] = proj(p_pos[0]);
- ss_pos[1] = proj(p_pos[1]);
- ss_pos[2] = proj(p_pos[2]);
- /* Compute the edges screen vectors */
- ssVec0 = do_edge.x ? compute_vec(ss_pos[0], ss_pos[1]) : NO_EDGE;
- ssVec1 = do_edge.y ? compute_vec(ss_pos[1], ss_pos[2]) : NO_EDGE;
- ssVec2 = do_edge.z ? compute_vec(ss_pos[2], ss_pos[0]) : NO_EDGE;
+ pos[v_n] = get_vertex_pos(v_id[v_n]);
+ gl_Position = p_pos[v_n] = ModelViewProjectionMatrix * vec4(pos[v_n], 1.0);
- gl_Position = p_pos[v_n];
+ bvec3 bary = equal(ivec3(0, 1, 2), ivec3(v_n1));
+ /* This is equivalent to component wise : (do_edge ? bary : 1.0) */
+ barycentric = vec3(lessThanEqual(ivec3(do_edge), ivec3(bary)));
# ifndef LIGHT_EDGES
vec3 nor = get_vertex_nor(v_id[v_n]);
# else
+ p_pos[v_n1] = ModelViewProjectionMatrix * vec4(pos[v_n1], 1.0);
+ p_pos[v_n2] = ModelViewProjectionMatrix * vec4(pos[v_n2], 1.0);
+
+ pos[v_n1] = get_vertex_pos(v_id[v_n1]);
+ pos[v_n2] = get_vertex_pos(v_id[v_n2]);
+
vec3 edges[3];
edges[0] = pos[1] - pos[0];
edges[1] = pos[2] - pos[1];
@@ -195,6 +172,6 @@ void main()
# endif
facing = normalize(NormalMatrix * nor).z;
-
-#endif
}
+
+#endif /* USE_GEOM_SHADER */
diff --git a/source/blender/draw/modes/shaders/paint_vertex_frag.glsl b/source/blender/draw/modes/shaders/paint_vertex_frag.glsl
index 2c968dafa69..3ff264a5e22 100644
--- a/source/blender/draw/modes/shaders/paint_vertex_frag.glsl
+++ b/source/blender/draw/modes/shaders/paint_vertex_frag.glsl
@@ -2,7 +2,8 @@
in vec3 finalColor;
out vec4 fragColor;
-uniform float alpha = 1.0;
+uniform float white_factor = 1.0;
+
vec3 linear_to_srgb_attrib(vec3 c) {
c = max(c, vec3(0.0));
vec3 c1 = c * 12.92;
@@ -12,6 +13,6 @@ vec3 linear_to_srgb_attrib(vec3 c) {
void main()
{
- fragColor.rgb = linear_to_srgb_attrib(finalColor);
- fragColor.a = alpha;
+ fragColor.rgb = mix(linear_to_srgb_attrib(finalColor), vec3(1.0), white_factor);
+ fragColor.a = 1.0;
}
diff --git a/source/blender/draw/modes/shaders/paint_weight_frag.glsl b/source/blender/draw/modes/shaders/paint_weight_frag.glsl
new file mode 100644
index 00000000000..faa36f5535e
--- /dev/null
+++ b/source/blender/draw/modes/shaders/paint_weight_frag.glsl
@@ -0,0 +1,97 @@
+
+in vec2 weight_interp; /* (weight, alert) */
+
+out vec4 fragColor;
+
+uniform float opacity = 1.0;
+uniform sampler1D colorramp;
+
+uniform bool drawContours = false;
+
+float contours(float value, float steps, float width_px, float max_rel_width, float gradient)
+{
+ /* Minimum visible and minimum full strength line width in screen space for fade out. */
+ const float min_width_px = 1.3, fade_width_px = 2.3;
+ /* Line is thinner towards the increase in the weight gradient by this factor. */
+ const float hi_bias = 2.0;
+
+ /* Don't draw lines at 0 or 1. */
+ float rel_value = value * steps;
+
+ if (rel_value < 0.5 || rel_value > steps - 0.5)
+ return 0.0;
+
+ /* Check if completely invisible due to fade out. */
+ float rel_gradient = gradient * steps;
+ float rel_min_width = min_width_px * rel_gradient;
+
+ if (max_rel_width <= rel_min_width)
+ return 0.0;
+
+ /* Main shape of the line, accounting for width bias and maximum weight space width. */
+ float rel_width = width_px * rel_gradient;
+
+ float offset = fract(rel_value + 0.5) - 0.5;
+
+ float base_alpha = 1.0 - max(offset * hi_bias, -offset) / min(max_rel_width, rel_width);
+
+ /* Line fadeout when too thin in screen space. */
+ float rel_fade_width = fade_width_px * rel_gradient;
+
+ float fade_alpha = (max_rel_width - rel_min_width) / (rel_fade_width - rel_min_width);
+
+ return clamp(base_alpha, 0.0, 1.0) * clamp(fade_alpha, 0.0, 1.0);
+}
+
+vec4 contour_grid(float weight, float weight_gradient)
+{
+ /* Fade away when the gradient is too low to avoid big fills and noise. */
+ float flt_eps = max(1e-8, 1e-6 * weight);
+
+ if (weight_gradient <= flt_eps)
+ return vec4(0.0);
+
+ /* Three levels of grid lines */
+ float grid10 = contours(weight, 10.0, 5.0, 0.3, weight_gradient);
+ float grid100 = contours(weight, 100.0, 3.5, 0.35, weight_gradient) * 0.6;
+ float grid1000 = contours(weight, 1000.0, 2.5, 0.4, weight_gradient) * 0.25;
+
+ /* White lines for 0.1 and 0.01, and black for 0.001 */
+ vec4 grid = vec4(1.0) * max(grid10, grid100);
+
+ grid.a = max(grid.a, grid1000);
+
+ return grid * clamp((weight_gradient - flt_eps) / flt_eps, 0.0, 1.0);
+}
+
+void main()
+{
+ float alert = weight_interp.y;
+ vec4 color;
+
+ /* Missing vertex group alert color. Uniform in practice. */
+ if (alert > 1.1) {
+ color = colorVertexMissingData;
+ }
+ /* Weights are available */
+ else {
+ float weight = weight_interp.x;
+ vec4 weight_color = texture(colorramp, weight, 0);
+
+ /* Contour display */
+ if (drawContours) {
+ /* This must be executed uniformly for all fragments */
+ float weight_gradient = length(vec2(dFdx(weight), dFdy(weight)));
+
+ vec4 grid = contour_grid(weight, weight_gradient);
+
+ weight_color = grid + weight_color * (1 - grid.a);
+ }
+
+ /* Zero weight alert color. Nonlinear blend to reduce impact. */
+ color = mix(weight_color, colorVertexUnreferenced, alert * alert);
+ }
+
+ /* mix with 1.0 -> is like opacity when using multiply blend mode */
+ fragColor = vec4(mix(vec3(1.0), color.rgb, opacity), 1.0);
+}
diff --git a/source/blender/draw/modes/shaders/paint_weight_vert.glsl b/source/blender/draw/modes/shaders/paint_weight_vert.glsl
new file mode 100644
index 00000000000..78a3695c82c
--- /dev/null
+++ b/source/blender/draw/modes/shaders/paint_weight_vert.glsl
@@ -0,0 +1,15 @@
+
+uniform mat4 ModelViewProjectionMatrix;
+
+in float weight;
+in vec3 pos;
+
+out vec2 weight_interp; /* (weight, alert) */
+
+void main()
+{
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+
+ /* Separate actual weight and alerts for independent interpolation */
+ weight_interp = max(vec2(weight, -weight), 0.0);
+}
diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c
index 79b7c7988fd..d6f52114708 100644
--- a/source/blender/editors/animation/anim_channels_defines.c
+++ b/source/blender/editors/animation/anim_channels_defines.c
@@ -223,8 +223,8 @@ static void acf_generic_channel_color(bAnimContext *ac, bAnimListElem *ale, floa
}
else {
// FIXME: what happens when the indention is 1 greater than what it should be (due to grouping)?
- int colOfs = 20 - 20 * indent;
- UI_GetThemeColorShade3fv(TH_DOPESHEET_CHANNELSUBOB, colOfs, r_color);
+ int colOfs = 10 - 10 * indent;
+ UI_GetThemeColorShade3fv(TH_SHADE2, colOfs, r_color);
}
}
@@ -817,9 +817,9 @@ static void acf_group_color(bAnimContext *ac, bAnimListElem *ale, float r_color[
else {
/* highlight only for active */
if (ale->flag & AGRP_ACTIVE)
- UI_GetThemeColorShade3fv(TH_GROUP_ACTIVE, 10, r_color);
+ UI_GetThemeColor3fv(TH_GROUP_ACTIVE, r_color);
else
- UI_GetThemeColorShade3fv(TH_GROUP, 20, r_color);
+ UI_GetThemeColor3fv(TH_GROUP, r_color);
}
}
@@ -1111,7 +1111,7 @@ static bool acf_nla_controls_setting_valid(bAnimContext *UNUSED(ac), bAnimListEl
case ACHANNEL_SETTING_EXPAND:
return true;
- // TOOD: selected?
+ // TODO: selected?
default: /* unsupported */
return false;
@@ -3035,7 +3035,7 @@ static int acf_gpl_setting_flag(bAnimContext *UNUSED(ac), eAnimChannel_Settings
case ACHANNEL_SETTING_MUTE: /* animation muting - similar to frame lock... */
return GP_LAYER_FRAMELOCK;
- case ACHANNEL_SETTING_VISIBLE: /* visiblity of the layers (NOT muting) */
+ case ACHANNEL_SETTING_VISIBLE: /* visibility of the layers (NOT muting) */
*neg = true;
return GP_LAYER_HIDE;
@@ -4040,7 +4040,7 @@ static void achannel_setting_flush_widget_cb(bContext *C, void *ale_npoin, void
bAnimContext ac;
ListBase anim_data = {NULL, NULL};
int filter;
- int setting = GET_INT_FROM_POINTER(setting_wrap);
+ int setting = POINTER_AS_INT(setting_wrap);
short on = 0;
/* send notifiers before doing anything else... */
@@ -4186,7 +4186,7 @@ static void achannel_setting_slider_shapekey_cb(bContext *C, void *key_poin, voi
/* find or create new F-Curve */
// XXX is the group name for this ok?
bAction *act = verify_adt_action(bmain, (ID *)key, 1);
- FCurve *fcu = verify_fcurve(act, NULL, &ptr, rna_path, 0, 1);
+ FCurve *fcu = verify_fcurve(bmain, act, NULL, &ptr, rna_path, 0, 1);
/* set the special 'replace' flag if on a keyframe */
if (fcurve_frame_has_keyframe(fcu, cfra, 0))
@@ -4255,11 +4255,12 @@ static void draw_setting_widget(bAnimContext *ac, bAnimListElem *ale, const bAni
void *ptr;
const char *tooltip;
uiBut *but = NULL;
+ bool enabled;
/* get the flag and the pointer to that flag */
flag = acf->setting_flag(ac, setting, &negflag);
ptr = acf->setting_ptr(ale, setting, &ptrsize);
- /* enabled = ANIM_channel_setting_get(ac, ale, setting); */ /* UNUSED */
+ enabled = ANIM_channel_setting_get(ac, ale, setting);
/* get the base icon for the setting */
switch (setting) {
@@ -4281,8 +4282,7 @@ static void draw_setting_widget(bAnimContext *ac, bAnimListElem *ale, const bAni
break;
case ACHANNEL_SETTING_MOD_OFF: /* modifiers disabled */
- icon = ICON_MODIFIER;
- usetoggle = false;
+ icon = ICON_MODIFIER_OFF;
tooltip = TIP_("F-Curve modifiers are disabled");
break;
@@ -4312,8 +4312,8 @@ static void draw_setting_widget(bAnimContext *ac, bAnimListElem *ale, const bAni
break;
case ACHANNEL_SETTING_MUTE: /* muted speaker */
- //icon = ((enabled) ? ICON_MUTE_IPO_ON : ICON_MUTE_IPO_OFF);
- icon = ICON_MUTE_IPO_OFF;
+ icon = ((enabled) ? ICON_CHECKBOX_DEHLT : ICON_CHECKBOX_HLT);
+ usetoggle = false;
if (ELEM(ale->type, ANIMTYPE_FCURVE, ANIMTYPE_NLACURVE)) {
tooltip = TIP_("Does F-Curve contribute to result");
@@ -4390,7 +4390,7 @@ static void draw_setting_widget(bAnimContext *ac, bAnimListElem *ale, const bAni
case ACHANNEL_SETTING_PINNED: /* NLA Actions - 'map/nomap' */
case ACHANNEL_SETTING_MOD_OFF:
case ACHANNEL_SETTING_ALWAYS_VISIBLE:
- UI_but_funcN_set(but, achannel_setting_flush_widget_cb, MEM_dupallocN(ale), SET_INT_IN_POINTER(setting));
+ UI_but_funcN_set(but, achannel_setting_flush_widget_cb, MEM_dupallocN(ale), POINTER_FROM_INT(setting));
break;
/* settings needing special attention */
diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c
index 6032b21ab88..959dff28c18 100644
--- a/source/blender/editors/animation/anim_channels_edit.c
+++ b/source/blender/editors/animation/anim_channels_edit.c
@@ -2382,9 +2382,9 @@ static void ANIM_OT_channels_select_all(wmOperatorType *ot)
WM_operator_properties_select_all(ot);
}
-/* ******************** Borderselect Operator *********************** */
+/* ******************** Box Select Operator *********************** */
-static void borderselect_anim_channels(bAnimContext *ac, rcti *rect, short selectmode)
+static void box_select_anim_channels(bAnimContext *ac, rcti *rect, short selectmode)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
@@ -2413,7 +2413,7 @@ static void borderselect_anim_channels(bAnimContext *ac, rcti *rect, short selec
filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS);
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
- /* loop over data, doing border select */
+ /* loop over data, doing box select */
for (ale = anim_data.first; ale; ale = ale->next) {
if (ac->datatype == ANIMCONT_NLA)
ymin = ymax - NLACHANNEL_STEP(snla);
@@ -2458,7 +2458,7 @@ static void borderselect_anim_channels(bAnimContext *ac, rcti *rect, short selec
/* ------------------- */
-static int animchannels_borderselect_exec(bContext *C, wmOperator *op)
+static int animchannels_box_select_exec(bContext *C, wmOperator *op)
{
bAnimContext ac;
rcti rect;
@@ -2484,8 +2484,8 @@ static int animchannels_borderselect_exec(bContext *C, wmOperator *op)
selectmode = ACHANNEL_SETFLAG_CLEAR;
}
- /* apply borderselect animation channels */
- borderselect_anim_channels(&ac, &rect, selectmode);
+ /* apply box_select animation channels */
+ box_select_anim_channels(&ac, &rect, selectmode);
/* send notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_ANIMCHAN | NA_SELECTED, NULL);
@@ -2493,18 +2493,18 @@ static int animchannels_borderselect_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static void ANIM_OT_channels_select_border(wmOperatorType *ot)
+static void ANIM_OT_channels_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
- ot->idname = "ANIM_OT_channels_select_border";
+ ot->name = "Box Select";
+ ot->idname = "ANIM_OT_channels_select_box";
ot->description = "Select all animation channels within the specified region";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
- ot->exec = animchannels_borderselect_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = animchannels_box_select_exec;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = animedit_poll_channels_nla_tweakmode_off;
@@ -2512,7 +2512,7 @@ static void ANIM_OT_channels_select_border(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* rna */
- WM_operator_properties_gesture_border_select(ot);
+ WM_operator_properties_gesture_box_select(ot);
}
/* ******************* Rename Operator ***************************** */
@@ -2818,7 +2818,7 @@ static int mouse_anim_channels(bContext *C, bAnimContext *ac, int channel_index,
agrp->flag ^= AGRP_SELECTED;
}
else if (selectmode == -1) {
- /* select all in group (and deselect everthing else) */
+ /* select all in group (and deselect everything else) */
FCurve *fcu;
/* deselect all other channels */
@@ -2919,6 +2919,7 @@ static int mouse_anim_channels(bContext *C, bAnimContext *ac, int channel_index,
}
case ANIMTYPE_GPLAYER:
{
+ bGPdata *gpd = (bGPdata *)ale->id;
bGPDlayer *gpl = (bGPDlayer *)ale->data;
/* select/deselect */
@@ -2935,10 +2936,12 @@ static int mouse_anim_channels(bContext *C, bAnimContext *ac, int channel_index,
/* change active layer, if this is selected (since we must always have an active layer) */
if (gpl->flag & GP_LAYER_SELECT) {
ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, gpl, ANIMTYPE_GPLAYER);
+ /* update other layer status */
+ BKE_gpencil_layer_setactive(gpd, gpl);
}
- WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, NULL); /* Grease Pencil updates */
- notifierFlags |= (ND_ANIMCHAN | NA_EDITED); /* Animation Ediotrs updates */
+ WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED | ND_SPACE_PROPERTIES, NULL); /* Grease Pencil updates */
+ notifierFlags |= (ND_ANIMCHAN | NA_EDITED); /* Animation Editors updates */
break;
}
case ANIMTYPE_MASKDATABLOCK:
@@ -3161,7 +3164,7 @@ static void ANIM_OT_channel_select_keys(wmOperatorType *ot)
void ED_operatortypes_animchannels(void)
{
WM_operatortype_append(ANIM_OT_channels_select_all);
- WM_operatortype_append(ANIM_OT_channels_select_border);
+ WM_operatortype_append(ANIM_OT_channels_select_box);
WM_operatortype_append(ANIM_OT_channels_click);
WM_operatortype_append(ANIM_OT_channel_select_keys);
@@ -3194,66 +3197,7 @@ void ED_operatortypes_animchannels(void)
// TODO: check on a poll callback for this, to get hotkeys into menus
void ED_keymap_animchannels(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Animation Channels", 0, 0);
- wmKeyMapItem *kmi;
-
- /* click-select */
- /* XXX for now, only leftmouse.... */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", true);
- RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_CTRL | KM_SHIFT, 0)->ptr, "children_only", true);
-
- /* rename */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_rename", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_channels_rename", LEFTMOUSE, KM_DBL_CLICK, 0, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_channel_select_keys", LEFTMOUSE, KM_DBL_CLICK, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channel_select_keys", LEFTMOUSE, KM_DBL_CLICK, KM_SHIFT, 0)->ptr, "extend", true);
-
- /* find (i.e. a shortcut for setting the name filter) */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_find", FKEY, KM_PRESS, KM_CTRL, 0);
-
- /* deselect all */
- kmi = WM_keymap_add_item(keymap, "ANIM_OT_channels_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "ANIM_OT_channels_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "ANIM_OT_channels_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- /* borderselect */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_select_border", BKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_channels_select_border", EVT_TWEAK_L, KM_ANY, 0, 0);
-
- /* delete */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_channels_delete", DELKEY, KM_PRESS, 0, 0);
-
- /* settings */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_setting_toggle", WKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_channels_setting_enable", WKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_channels_setting_disable", WKEY, KM_PRESS, KM_ALT, 0);
-
- /* settings - specialized hotkeys */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_editable_toggle", TABKEY, KM_PRESS, 0, 0);
-
- /* expand/collapse */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_expand", PADPLUSKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_channels_collapse", PADMINUS, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "ANIM_OT_channels_expand", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "all", false);
- kmi = WM_keymap_add_item(keymap, "ANIM_OT_channels_collapse", PADMINUS, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "all", false);
-
- /* rearranging */
- RNA_enum_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_move", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "direction", REARRANGE_ANIMCHAN_UP);
- RNA_enum_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_move", PAGEDOWNKEY, KM_PRESS, 0, 0)->ptr, "direction", REARRANGE_ANIMCHAN_DOWN);
- RNA_enum_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_move", PAGEUPKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "direction", REARRANGE_ANIMCHAN_TOP);
- RNA_enum_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_move", PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "direction", REARRANGE_ANIMCHAN_BOTTOM);
-
- /* grouping */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_group", GKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_channels_ungroup", GKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
+ WM_keymap_ensure(keyconf, "Animation Channels", 0, 0);
}
/* ************************************************************************** */
diff --git a/source/blender/editors/animation/anim_deps.c b/source/blender/editors/animation/anim_deps.c
index 898c8b6464a..2ed5d35b613 100644
--- a/source/blender/editors/animation/anim_deps.c
+++ b/source/blender/editors/animation/anim_deps.c
@@ -84,6 +84,12 @@ void ANIM_list_elem_update(Main *bmain, Scene *scene, bAnimListElem *ale)
}
}
+ /* Tag copy on the main object if updating anything directly inside AnimData */
+ if (ELEM(ale->type, ANIMTYPE_ANIMDATA, ANIMTYPE_NLAACTION, ANIMTYPE_NLATRACK, ANIMTYPE_NLACURVE)) {
+ DEG_id_tag_update(id, DEG_TAG_TIME | DEG_TAG_COPY_ON_WRITE);
+ return;
+ }
+
/* update data */
fcu = (ale->datatype == ALE_FCURVE) ? ale->key_data : NULL;
@@ -108,7 +114,7 @@ void ANIM_list_elem_update(Main *bmain, Scene *scene, bAnimListElem *ale)
/* tags the given ID block for refreshes (if applicable) due to
* Animation Editor editing */
-void ANIM_id_update(Scene *UNUSED(scene), ID *id)
+void ANIM_id_update(Main *bmain, ID *id)
{
if (id) {
AnimData *adt = BKE_animdata_from_id(id);
@@ -118,7 +124,7 @@ void ANIM_id_update(Scene *UNUSED(scene), ID *id)
adt->recalc |= ADT_RECALC_ANIM;
/* set recalc flags */
- DEG_id_tag_update(id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME); // XXX or do we want something more restrictive?
+ DEG_id_tag_update_ex(bmain, id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME); // XXX or do we want something more restrictive?
}
}
@@ -408,6 +414,10 @@ void ANIM_animdata_update(bAnimContext *ac, ListBase *anim_data)
ale->update &= ~ANIM_UPDATE_DEPS;
ANIM_list_elem_update(ac->bmain, ac->scene, ale);
}
+ /* disable handles to avoid crash */
+ if (ale->update & ANIM_UPDATE_HANDLES) {
+ ale->update &= ~ANIM_UPDATE_HANDLES;
+ }
}
else if (ale->datatype == ALE_FCURVE) {
FCurve *fcu = ale->key_data;
@@ -429,7 +439,7 @@ void ANIM_animdata_update(bAnimContext *ac, ListBase *anim_data)
ANIM_list_elem_update(ac->bmain, ac->scene, ale);
}
}
- else if (ale->datatype == ALE_NLASTRIP) {
+ else if (ELEM(ale->type, ANIMTYPE_ANIMDATA, ANIMTYPE_NLAACTION, ANIMTYPE_NLATRACK, ANIMTYPE_NLACURVE)) {
if (ale->update & ANIM_UPDATE_DEPS) {
ale->update &= ~ANIM_UPDATE_DEPS;
ANIM_list_elem_update(ac->bmain, ac->scene, ale);
diff --git a/source/blender/editors/animation/anim_draw.c b/source/blender/editors/animation/anim_draw.c
index 05ea3fd6314..a2046985a36 100644
--- a/source/blender/editors/animation/anim_draw.c
+++ b/source/blender/editors/animation/anim_draw.c
@@ -174,7 +174,7 @@ void ANIM_draw_previewrange(const bContext *C, View2D *v2d, int end_frame_width)
uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
- immUniformThemeColorShadeAlpha(TH_ANIM_ACTIVE, -25, -30);
+ immUniformThemeColorShadeAlpha(TH_ANIM_PREVIEW_RANGE, -25, -30);
//immUniformColor4f(0.8f, 0.44f, 0.1f, 0.2f); /* XXX: Fix this hardcoded color (anim_active) */
/* only draw two separate 'curtains' if there's no overlap between them */
@@ -551,11 +551,11 @@ static bool find_prev_next_keyframes(struct bContext *C, int *nextfra, int *prev
}
/* populate tree with keyframe nodes */
- scene_to_keylist(&ads, scene, &keys, NULL);
+ scene_to_keylist(&ads, scene, &keys, 0);
gpencil_to_keylist(&ads, scene->gpd, &keys, false);
if (ob) {
- ob_to_keylist(&ads, ob, &keys, NULL);
+ ob_to_keylist(&ads, ob, &keys, 0);
gpencil_to_keylist(&ads, ob->data, &keys, false);
}
@@ -564,9 +564,6 @@ static bool find_prev_next_keyframes(struct bContext *C, int *nextfra, int *prev
mask_to_keylist(&ads, masklay, &keys);
}
- /* build linked-list for searching */
- BLI_dlrbTree_linkedlist_sync(&keys);
-
/* find matching keyframe in the right direction */
do {
aknext = (ActKeyColumn *)BLI_dlrbTree_search_next(&keys, compare_ak_cfraPtr, &cfranext);
diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c
index 54590c5f66c..e59f563c261 100644
--- a/source/blender/editors/animation/anim_filter.c
+++ b/source/blender/editors/animation/anim_filter.c
@@ -1529,7 +1529,7 @@ static size_t animfilter_nla_controls(ListBase *anim_data, bDopeSheet *ads, Anim
items += tmp_items;
}
- /* return the numebr of items added to the list */
+ /* return the number of items added to the list */
return items;
}
@@ -1625,8 +1625,8 @@ static size_t animdata_filter_gpencil_layers_data(ListBase *anim_data, bDopeShee
bGPDlayer *gpl;
size_t items = 0;
- /* loop over layers as the conditions are acceptable */
- for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+ /* loop over layers as the conditions are acceptable (top-Down order) */
+ for (gpl = gpd->layers.last; gpl; gpl = gpl->prev) {
/* only if selected */
if (ANIMCHANNEL_SELOK(SEL_GPL(gpl)) ) {
/* only if editable */
diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c
index 2085ad869be..4d21ed8b5b4 100644
--- a/source/blender/editors/animation/anim_markers.c
+++ b/source/blender/editors/animation/anim_markers.c
@@ -436,7 +436,7 @@ static void draw_marker(
#ifdef DURIAN_CAMERA_SWITCH
else if (marker->camera) {
icon_id = (marker->flag & SELECT) ? ICON_OUTLINER_OB_CAMERA :
- ICON_OUTLINER_DATA_CAMERA;
+ ICON_CAMERA_DATA;
}
#endif
else {
@@ -635,7 +635,7 @@ static int ed_markers_opwrap_invoke(bContext *C, wmOperator *op, const wmEvent *
/* ************************** add markers *************************** */
-/* add TimeMarker at curent frame */
+/* add TimeMarker at current frame */
static int ed_marker_add_exec(bContext *C, wmOperator *UNUSED(op))
{
ListBase *markers = ED_context_get_markers(C);
@@ -862,7 +862,7 @@ static int ed_marker_move_invoke_wrapper(bContext *C, wmOperator *op, const wmEv
return ed_markers_opwrap_invoke_custom(C, op, event, ed_marker_move_invoke);
}
-/* note, init has to be called succesfully */
+/* note, init has to be called successfully */
static void ed_marker_move_apply(bContext *C, wmOperator *op)
{
#ifdef DURIAN_CAMERA_SWITCH
@@ -1253,7 +1253,7 @@ static void MARKER_OT_select(wmOperatorType *ot)
#endif
}
-/* *************************** border select markers **************** */
+/* *************************** box select markers **************** */
/* operator state vars used: (added by default WM callbacks)
* xmin, ymin
@@ -1274,7 +1274,7 @@ static void MARKER_OT_select(wmOperatorType *ot)
* poll() has to be filled in by user for context
*/
-static int ed_marker_border_select_exec(bContext *C, wmOperator *op)
+static int ed_marker_box_select_exec(bContext *C, wmOperator *op)
{
View2D *v2d = UI_view2d_fromcontext(C);
ListBase *markers = ED_context_get_markers(C);
@@ -1310,23 +1310,23 @@ static int ed_marker_border_select_exec(bContext *C, wmOperator *op)
return 1;
}
-static int ed_marker_select_border_invoke_wrapper(bContext *C, wmOperator *op, const wmEvent *event)
+static int ed_marker_select_box_invoke_wrapper(bContext *C, wmOperator *op, const wmEvent *event)
{
- return ed_markers_opwrap_invoke_custom(C, op, event, WM_gesture_border_invoke);
+ return ed_markers_opwrap_invoke_custom(C, op, event, WM_gesture_box_invoke);
}
-static void MARKER_OT_select_border(wmOperatorType *ot)
+static void MARKER_OT_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Marker Border Select";
- ot->description = "Select all time markers using border selection";
- ot->idname = "MARKER_OT_select_border";
+ ot->name = "Marker Box Select";
+ ot->description = "Select all time markers using box selection";
+ ot->idname = "MARKER_OT_select_box";
/* api callbacks */
- ot->exec = ed_marker_border_select_exec;
- ot->invoke = ed_marker_select_border_invoke_wrapper;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->exec = ed_marker_box_select_exec;
+ ot->invoke = ed_marker_select_box_invoke_wrapper;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = ed_markers_poll_markers_exist;
@@ -1334,7 +1334,7 @@ static void MARKER_OT_select_border(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* rna */
- WM_operator_properties_gesture_border_select(ot);
+ WM_operator_properties_gesture_box_select(ot);
}
/* *********************** (de)select all ***************** */
@@ -1635,7 +1635,7 @@ void ED_operatortypes_marker(void)
WM_operatortype_append(MARKER_OT_move);
WM_operatortype_append(MARKER_OT_duplicate);
WM_operatortype_append(MARKER_OT_select);
- WM_operatortype_append(MARKER_OT_select_border);
+ WM_operatortype_append(MARKER_OT_select_box);
WM_operatortype_append(MARKER_OT_select_all);
WM_operatortype_append(MARKER_OT_delete);
WM_operatortype_append(MARKER_OT_rename);
@@ -1648,53 +1648,5 @@ void ED_operatortypes_marker(void)
/* called in screen_ops.c:ED_keymap_screen() */
void ED_keymap_marker(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Markers", 0, 0);
- wmKeyMapItem *kmi;
-
- WM_keymap_verify_item(keymap, "MARKER_OT_add", MKEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "MARKER_OT_move", EVT_TWEAK_S, KM_ANY, 0, 0);
- WM_keymap_verify_item(keymap, "MARKER_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_verify_item(keymap, "MARKER_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
- kmi = WM_keymap_add_item(keymap, "MARKER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
-
-#ifdef DURIAN_CAMERA_SWITCH
- kmi = WM_keymap_add_item(keymap, "MARKER_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "camera", true);
-
- kmi = WM_keymap_add_item(keymap, "MARKER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "camera", true);
-#else
- (void)kmi;
-#endif
-
- WM_keymap_verify_item(keymap, "MARKER_OT_select_border", BKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_verify_item(keymap, "MARKER_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_verify_item(keymap, "MARKER_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
-
- WM_keymap_add_item(keymap, "MARKER_OT_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "MARKER_OT_delete", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_verify_item(keymap, "MARKER_OT_rename", MKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "MARKER_OT_move", GKEY, KM_PRESS, 0, 0);
-#ifdef DURIAN_CAMERA_SWITCH
- WM_keymap_add_item(keymap, "MARKER_OT_camera_bind", BKEY, KM_PRESS, KM_CTRL, 0);
-#endif
-}
-
-/* to be called from animation editor keymaps, see note below */
-void ED_marker_keymap_animedit_conflictfree(wmKeyMap *keymap)
-{
- /* duplicate of some marker-hotkeys but without the bounds checking
- * since these are handy to be able to do unrestricted and won't conflict
- * with primary function hotkeys (Usability tweak [#27469])
- */
- WM_keymap_add_item(keymap, "MARKER_OT_add", MKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "MARKER_OT_rename", MKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_ensure(keyconf, "Markers", 0, 0);
}
diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c
index 5ec38025ade..6fa1150eb0e 100644
--- a/source/blender/editors/animation/anim_ops.c
+++ b/source/blender/editors/animation/anim_ops.c
@@ -401,7 +401,7 @@ static int previewrange_define_exec(bContext *C, wmOperator *op)
float sfra, efra;
rcti rect;
- /* get min/max values from border select rect (already in region coordinates, not screen) */
+ /* get min/max values from box select rect (already in region coordinates, not screen) */
WM_operator_properties_border_to_rcti(op, &rect);
/* convert min/max values to frames (i.e. region to 'tot' rect) */
@@ -434,10 +434,10 @@ static void ANIM_OT_previewrange_set(wmOperatorType *ot)
ot->description = "Interactively define frame range used for playback";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
+ ot->invoke = WM_gesture_box_invoke;
ot->exec = previewrange_define_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = ED_operator_animview_active;
@@ -448,7 +448,7 @@ static void ANIM_OT_previewrange_set(wmOperatorType *ot)
/* used to define frame range.
*
* note: border Y values are not used,
- * but are needed by borderselect gesture operator stuff */
+ * but are needed by box_select gesture operator stuff */
WM_operator_properties_border(ot);
}
@@ -536,17 +536,5 @@ void ED_operatortypes_anim(void)
void ED_keymap_anim(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Animation", 0, 0);
- wmKeyMapItem *kmi;
-
- /* frame management */
- /* NOTE: 'ACTIONMOUSE' not 'LEFTMOUSE', as user may have swapped mouse-buttons */
- WM_keymap_add_item(keymap, "ANIM_OT_change_frame", ACTIONMOUSE, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TKEY, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.show_seconds");
-
- /* preview range */
- WM_keymap_verify_item(keymap, "ANIM_OT_previewrange_set", PKEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "ANIM_OT_previewrange_clear", PKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_ensure(keyconf, "Animation", 0, 0);
}
diff --git a/source/blender/editors/animation/drivers.c b/source/blender/editors/animation/drivers.c
index fe57909be75..723da10e002 100644
--- a/source/blender/editors/animation/drivers.c
+++ b/source/blender/editors/animation/drivers.c
@@ -287,8 +287,8 @@ static int add_driver_with_target(
}
/* Main Driver Management API calls:
- * Add a new driver for the specified property on the given ID block,
- * and make it be driven by the specified target.
+ * Add a new driver for the specified property on the given ID block,
+ * and make it be driven by the specified target.
*
* This is intended to be used in conjunction with a modal "eyedropper"
* for picking the variable that is going to be used to drive this one.
@@ -370,7 +370,7 @@ int ANIM_add_driver_with_target(
/* --------------------------------- */
/* Main Driver Management API calls:
- * Add a new driver for the specified property on the given ID block
+ * Add a new driver for the specified property on the given ID block
*/
int ANIM_add_driver(ReportList *reports, ID *id, const char rna_path[], int array_index, short flag, int type)
{
@@ -477,7 +477,7 @@ int ANIM_add_driver(ReportList *reports, ID *id, const char rna_path[], int arra
}
/* Main Driver Management API calls:
- * Remove the driver for the specified property on the given ID block (if available)
+ * Remove the driver for the specified property on the given ID block (if available)
*/
bool ANIM_remove_driver(ReportList *UNUSED(reports), ID *id, const char rna_path[], int array_index, short UNUSED(flag))
{
@@ -745,11 +745,8 @@ bool ANIM_driver_vars_paste(ReportList *reports, FCurve *fcu, bool replace)
driver->variables.last = tmp_list.last;
}
-#ifdef WITH_PYTHON
/* since driver variables are cached, the expression needs re-compiling too */
- if (driver->type == DRIVER_TYPE_PYTHON)
- driver->flag |= DRIVER_FLAG_RENAMEVAR;
-#endif
+ BKE_driver_invalidate_expression(driver, false, true);
return true;
}
@@ -763,7 +760,7 @@ bool ANIM_driver_vars_paste(ReportList *reports, FCurve *fcu, bool replace)
/* NOTE: Used by ANIM_OT_driver_button_add and UI_OT_eyedropper_driver */
// XXX: These names need reviewing
EnumPropertyItem prop_driver_create_mapping_types[] = {
- {CREATEDRIVER_MAPPING_1_N, "SINGLE_MANY", ICON_UI, "All from Target",
+ {CREATEDRIVER_MAPPING_1_N, "SINGLE_MANY", 0, "All from Target",
"Drive all components of this property using the target picked"},
{CREATEDRIVER_MAPPING_1_1, "DIRECT", 0, "Single from Target",
"Drive this component of this property using the target picked"},
@@ -947,6 +944,7 @@ static int add_driver_button_invoke(bContext *C, wmOperator *op, const wmEvent *
if (success) {
/* send updates */
UI_context_update_anim_flag(C);
+ DEG_id_tag_update(ptr.id.data, DEG_TAG_COPY_ON_WRITE);
DEG_relations_tag_update(CTX_data_main(C));
WM_event_add_notifier(C, NC_ANIMATION | ND_FCURVES_ORDER, NULL);
}
diff --git a/source/blender/editors/animation/fmodifier_ui.c b/source/blender/editors/animation/fmodifier_ui.c
index 951dcc2dddf..f1d8f9a1ebf 100644
--- a/source/blender/editors/animation/fmodifier_ui.c
+++ b/source/blender/editors/animation/fmodifier_ui.c
@@ -387,7 +387,7 @@ static void fmod_envelope_deletepoint_cb(bContext *UNUSED(C), void *fcm_dv, void
{
FMod_Envelope *env = (FMod_Envelope *)fcm_dv;
FCM_EnvelopeData *fedn;
- int index = GET_INT_FROM_POINTER(ind_v);
+ int index = POINTER_AS_INT(ind_v);
/* check that no data exists for the current frame... */
if (env->totvert > 1) {
@@ -465,7 +465,7 @@ static void draw_modifier__envelope(uiLayout *layout, ID *id, FModifier *fcm, sh
but = uiDefIconBut(block, UI_BTYPE_BUT, B_FMODIFIER_REDRAW, ICON_X, 0, 0, 0.9 * UI_UNIT_X, UI_UNIT_Y,
NULL, 0.0, 0.0, 0.0, 0.0, TIP_("Delete envelope control point"));
- UI_but_func_set(but, fmod_envelope_deletepoint_cb, env, SET_INT_IN_POINTER(i));
+ UI_but_func_set(but, fmod_envelope_deletepoint_cb, env, POINTER_FROM_INT(i));
UI_block_align_begin(block);
}
}
diff --git a/source/blender/editors/animation/keyframes_draw.c b/source/blender/editors/animation/keyframes_draw.c
index a8b63e01ac1..5ad10b3cf84 100644
--- a/source/blender/editors/animation/keyframes_draw.c
+++ b/source/blender/editors/animation/keyframes_draw.c
@@ -42,6 +42,7 @@
#include "BLI_dlrbTree.h"
#include "BLI_math.h"
#include "BLI_utildefines.h"
+#include "BLI_rect.h"
#include "DNA_anim_types.h"
#include "DNA_cachefile_types.h"
@@ -67,6 +68,16 @@
/* ActKeyColumns (Keyframe Columns) ------------------------------------------ */
+BLI_INLINE bool is_cfra_eq(float a, float b)
+{
+ return IS_EQT(a, b, BEZT_BINARYSEARCH_THRESH);
+}
+
+BLI_INLINE bool is_cfra_lt(float a, float b)
+{
+ return (b - a) > BEZT_BINARYSEARCH_THRESH;
+}
+
/* Comparator callback used for ActKeyColumns and cframe float-value pointer */
/* NOTE: this is exported to other modules that use the ActKeyColumns for finding keyframes */
short compare_ak_cfraPtr(void *node, void *data)
@@ -75,63 +86,158 @@ short compare_ak_cfraPtr(void *node, void *data)
const float *cframe = data;
float val = *cframe;
- if (IS_EQT(val, ak->cfra, BEZT_BINARYSEARCH_THRESH))
+ if (is_cfra_eq(val, ak->cfra))
return 0;
if (val < ak->cfra)
return -1;
- else if (val > ak->cfra)
- return 1;
else
- return 0;
+ return 1;
}
/* --------------- */
-/* Comparator callback used for ActKeyColumns and BezTriple */
+/* Set of references to three logically adjacent keys. */
+typedef struct BezTripleChain {
+ /* Current keyframe. */
+ BezTriple *cur;
+
+ /* Logical neighbors. May be NULL. */
+ BezTriple *prev, *next;
+} BezTripleChain;
+
+/* Categorize the interpolation & handle type of the keyframe. */
+static eKeyframeHandleDrawOpts bezt_handle_type(BezTriple *bezt)
+{
+ if (bezt->h1 == HD_AUTO_ANIM && bezt->h2 == HD_AUTO_ANIM) {
+ return KEYFRAME_HANDLE_AUTO_CLAMP;
+ }
+ else if (ELEM(bezt->h1, HD_AUTO_ANIM, HD_AUTO) && ELEM(bezt->h2, HD_AUTO_ANIM, HD_AUTO)) {
+ return KEYFRAME_HANDLE_AUTO;
+ }
+ else if (bezt->h1 == HD_VECT && bezt->h2 == HD_VECT) {
+ return KEYFRAME_HANDLE_VECTOR;
+ }
+ else if (ELEM(HD_FREE, bezt->h1, bezt->h2)) {
+ return KEYFRAME_HANDLE_FREE;
+ }
+ else {
+ return KEYFRAME_HANDLE_ALIGNED;
+ }
+}
+
+/* Determine if the keyframe is an extreme by comparing with neighbors.
+ * Ends of fixed-value sections and of the whole curve are also marked.
+ */
+static eKeyframeExtremeDrawOpts bezt_extreme_type(BezTripleChain *chain)
+{
+ if (chain->prev == NULL && chain->next == NULL) {
+ return KEYFRAME_EXTREME_NONE;
+ }
+
+ /* Keyframe values for the current one and neighbors. */
+ float cur_y = chain->cur->vec[1][1];
+ float prev_y = cur_y, next_y = cur_y;
+
+ if (chain->prev && !IS_EQF(cur_y, chain->prev->vec[1][1])) {
+ prev_y = chain->prev->vec[1][1];
+ }
+ if (chain->next && !IS_EQF(cur_y, chain->next->vec[1][1])) {
+ next_y = chain->next->vec[1][1];
+ }
+
+ /* Static hold. */
+ if (prev_y == cur_y && next_y == cur_y) {
+ return KEYFRAME_EXTREME_FLAT;
+ }
+
+ /* Middle of an incline. */
+ if ((prev_y < cur_y && next_y > cur_y) || (prev_y > cur_y && next_y < cur_y)) {
+ return KEYFRAME_EXTREME_NONE;
+ }
+
+ /* Bezier handle values for the overshoot check. */
+ bool l_bezier = chain->prev && chain->prev->ipo == BEZT_IPO_BEZ;
+ bool r_bezier = chain->next && chain->cur->ipo == BEZT_IPO_BEZ;
+ float handle_l = l_bezier ? chain->cur->vec[0][1] : cur_y;
+ float handle_r = r_bezier ? chain->cur->vec[2][1] : cur_y;
+
+ /* Detect extremes. One of the neighbors is allowed to be equal to current. */
+ if (prev_y < cur_y || next_y < cur_y) {
+ bool is_overshoot = (handle_l > cur_y || handle_r > cur_y);
+
+ return KEYFRAME_EXTREME_MAX | (is_overshoot ? KEYFRAME_EXTREME_MIXED : 0);
+ }
+
+ if (prev_y > cur_y || next_y > cur_y) {
+ bool is_overshoot = (handle_l < cur_y || handle_r < cur_y);
+
+ return KEYFRAME_EXTREME_MIN | (is_overshoot ? KEYFRAME_EXTREME_MIXED : 0);
+ }
+
+ return KEYFRAME_EXTREME_NONE;
+}
+
+/* Comparator callback used for ActKeyColumns and BezTripleChain */
static short compare_ak_bezt(void *node, void *data)
{
- ActKeyColumn *ak = (ActKeyColumn *)node;
- BezTriple *bezt = (BezTriple *)data;
+ BezTripleChain *chain = data;
- if (bezt->vec[1][0] < ak->cfra)
- return -1;
- else if (bezt->vec[1][0] > ak->cfra)
- return 1;
- else
- return 0;
+ return compare_ak_cfraPtr(node, &chain->cur->vec[1][0]);
}
-/* New node callback used for building ActKeyColumns from BezTriples */
+/* New node callback used for building ActKeyColumns from BezTripleChain */
static DLRBT_Node *nalloc_ak_bezt(void *data)
{
ActKeyColumn *ak = MEM_callocN(sizeof(ActKeyColumn), "ActKeyColumn");
- BezTriple *bezt = (BezTriple *)data;
+ BezTripleChain *chain = data;
+ BezTriple *bezt = chain->cur;
/* store settings based on state of BezTriple */
ak->cfra = bezt->vec[1][0];
ak->sel = BEZT_ISSEL_ANY(bezt) ? SELECT : 0;
ak->key_type = BEZKEYTYPE(bezt);
+ ak->handle_type = bezt_handle_type(bezt);
+ ak->extreme_type = bezt_extreme_type(chain);
- /* set 'modified', since this is used to identify long keyframes */
- ak->modified = 1;
+ /* count keyframes in this column */
+ ak->totkey = 1;
return (DLRBT_Node *)ak;
}
-/* Node updater callback used for building ActKeyColumns from BezTriples */
+/* Node updater callback used for building ActKeyColumns from BezTripleChain */
static void nupdate_ak_bezt(void *node, void *data)
{
- ActKeyColumn *ak = (ActKeyColumn *)node;
- BezTriple *bezt = (BezTriple *)data;
+ ActKeyColumn *ak = node;
+ BezTripleChain *chain = data;
+ BezTriple *bezt = chain->cur;
/* set selection status and 'touched' status */
if (BEZT_ISSEL_ANY(bezt)) ak->sel = SELECT;
- ak->modified += 1;
+
+ /* count keyframes in this column */
+ ak->totkey++;
/* for keyframe type, 'proper' keyframes have priority over breakdowns (and other types for now) */
if (BEZKEYTYPE(bezt) == BEZT_KEYTYPE_KEYFRAME)
ak->key_type = BEZT_KEYTYPE_KEYFRAME;
+
+ /* For interpolation type, select the highest value (enum is sorted). */
+ ak->handle_type = MAX2(ak->handle_type, bezt_handle_type(bezt));
+
+ /* For extremes, detect when combining different states. */
+ char new_extreme = bezt_extreme_type(chain);
+
+ if (new_extreme != ak->extreme_type) {
+ /* Replace the flat status without adding mixed. */
+ if (ak->extreme_type == KEYFRAME_EXTREME_FLAT) {
+ ak->extreme_type = new_extreme;
+ }
+ else if (new_extreme != KEYFRAME_EXTREME_FLAT) {
+ ak->extreme_type |= (new_extreme | KEYFRAME_EXTREME_MIXED);
+ }
+ }
}
/* ......... */
@@ -139,15 +245,10 @@ static void nupdate_ak_bezt(void *node, void *data)
/* Comparator callback used for ActKeyColumns and GPencil frame */
static short compare_ak_gpframe(void *node, void *data)
{
- ActKeyColumn *ak = (ActKeyColumn *)node;
bGPDframe *gpf = (bGPDframe *)data;
- if (gpf->framenum < ak->cfra)
- return -1;
- else if (gpf->framenum > ak->cfra)
- return 1;
- else
- return 0;
+ float frame = gpf->framenum;
+ return compare_ak_cfraPtr(node, &frame);
}
/* New node callback used for building ActKeyColumns from GPencil frames */
@@ -161,8 +262,8 @@ static DLRBT_Node *nalloc_ak_gpframe(void *data)
ak->sel = (gpf->flag & GP_FRAME_SELECT) ? SELECT : 0;
ak->key_type = gpf->key_type;
- /* set 'modified', since this is used to identify long keyframes */
- ak->modified = 1;
+ /* count keyframes in this column */
+ ak->totkey = 1;
return (DLRBT_Node *)ak;
}
@@ -175,7 +276,9 @@ static void nupdate_ak_gpframe(void *node, void *data)
/* set selection status and 'touched' status */
if (gpf->flag & GP_FRAME_SELECT) ak->sel = SELECT;
- ak->modified += 1;
+
+ /* count keyframes in this column */
+ ak->totkey++;
/* for keyframe type, 'proper' keyframes have priority over breakdowns (and other types for now) */
if (gpf->key_type == BEZT_KEYTYPE_KEYFRAME)
@@ -187,15 +290,10 @@ static void nupdate_ak_gpframe(void *node, void *data)
/* Comparator callback used for ActKeyColumns and GPencil frame */
static short compare_ak_masklayshape(void *node, void *data)
{
- ActKeyColumn *ak = (ActKeyColumn *)node;
MaskLayerShape *masklay_shape = (MaskLayerShape *)data;
- if (masklay_shape->frame < ak->cfra)
- return -1;
- else if (masklay_shape->frame > ak->cfra)
- return 1;
- else
- return 0;
+ float frame = masklay_shape->frame;
+ return compare_ak_cfraPtr(node, &frame);
}
/* New node callback used for building ActKeyColumns from GPencil frames */
@@ -208,8 +306,8 @@ static DLRBT_Node *nalloc_ak_masklayshape(void *data)
ak->cfra = masklay_shape->frame;
ak->sel = (masklay_shape->flag & MASK_SHAPE_SELECT) ? SELECT : 0;
- /* set 'modified', since this is used to identify long keyframes */
- ak->modified = 1;
+ /* count keyframes in this column */
+ ak->totkey = 1;
return (DLRBT_Node *)ak;
}
@@ -222,14 +320,16 @@ static void nupdate_ak_masklayshape(void *node, void *data)
/* set selection status and 'touched' status */
if (masklay_shape->flag & MASK_SHAPE_SELECT) ak->sel = SELECT;
- ak->modified += 1;
+
+ /* count keyframes in this column */
+ ak->totkey++;
}
/* --------------- */
/* Add the given BezTriple to the given 'list' of Keyframes */
-static void add_bezt_to_keycolumns_list(DLRBT_Tree *keys, BezTriple *bezt)
+static void add_bezt_to_keycolumns_list(DLRBT_Tree *keys, BezTripleChain *bezt)
{
if (ELEM(NULL, keys, bezt))
return;
@@ -257,217 +357,189 @@ static void add_masklay_to_keycolumns_list(DLRBT_Tree *keys, MaskLayerShape *mas
/* ActKeyBlocks (Long Keyframes) ------------------------------------------ */
-/* Comparator callback used for ActKeyBlock and cframe float-value pointer */
-/* NOTE: this is exported to other modules that use the ActKeyBlocks for finding long-keyframes */
-short compare_ab_cfraPtr(void *node, void *data)
-{
- ActKeyBlock *ab = (ActKeyBlock *)node;
- const float *cframe = data;
- float val = *cframe;
+static const ActKeyBlockInfo dummy_keyblock = { 0 };
- if (val < ab->start)
- return -1;
- else if (val > ab->start)
- return 1;
- else
- return 0;
-}
+static void compute_keyblock_data(ActKeyBlockInfo *info, BezTriple *prev, BezTriple *beztn)
+{
+ memset(info, 0, sizeof(ActKeyBlockInfo));
-/* --------------- */
+ if (BEZKEYTYPE(beztn) == BEZT_KEYTYPE_MOVEHOLD) {
+ /* Animator tagged a "moving hold"
+ * - Previous key must also be tagged as a moving hold, otherwise
+ * we're just dealing with the first of a pair, and we don't
+ * want to be creating any phantom holds...
+ */
+ if (BEZKEYTYPE(prev) == BEZT_KEYTYPE_MOVEHOLD) {
+ info->flag |= ACTKEYBLOCK_FLAG_MOVING_HOLD | ACTKEYBLOCK_FLAG_ANY_HOLD;
+ }
+ }
-/* Create a ActKeyColumn for a pair of BezTriples */
-static ActKeyBlock *bezts_to_new_actkeyblock(BezTriple *prev, BezTriple *beztn)
-{
- ActKeyBlock *ab = MEM_callocN(sizeof(ActKeyBlock), "ActKeyBlock");
+ /* Check for same values...
+ * - Handles must have same central value as each other
+ * - Handles which control that section of the curve must be constant
+ */
+ if (IS_EQF(beztn->vec[1][1], prev->vec[1][1])) {
+ bool hold;
- ab->start = prev->vec[1][0];
- ab->end = beztn->vec[1][0];
- ab->val = beztn->vec[1][1];
+ /* Only check handles in case of actual bezier interpolation. */
+ if (prev->ipo == BEZT_IPO_BEZ) {
+ hold = IS_EQF(beztn->vec[1][1], beztn->vec[0][1]) && IS_EQF(prev->vec[1][1], prev->vec[2][1]);
+ }
+ /* This interpolation type induces movement even between identical keys. */
+ else {
+ hold = !ELEM(prev->ipo, BEZT_IPO_ELASTIC);
+ }
- ab->sel = (BEZT_ISSEL_ANY(prev) || BEZT_ISSEL_ANY(beztn)) ? SELECT : 0;
- ab->modified = 1;
+ if (hold) {
+ info->flag |= ACTKEYBLOCK_FLAG_STATIC_HOLD | ACTKEYBLOCK_FLAG_ANY_HOLD;
+ }
+ }
- if (BEZKEYTYPE(beztn) == BEZT_KEYTYPE_MOVEHOLD)
- ab->flag |= ACTKEYBLOCK_FLAG_MOVING_HOLD;
+ /* Remember non-bezier interpolation info. */
+ if (prev->ipo != BEZT_IPO_BEZ) {
+ info->flag |= ACTKEYBLOCK_FLAG_NON_BEZIER;
+ }
- return ab;
+ info->sel = BEZT_ISSEL_ANY(prev) || BEZT_ISSEL_ANY(beztn);
}
-static void add_bezt_to_keyblocks_list(DLRBT_Tree *blocks, BezTriple *first_bezt, BezTriple *beztn)
+static void add_keyblock_info(ActKeyColumn *col, const ActKeyBlockInfo *block)
{
- ActKeyBlock *new_ab = NULL;
- BezTriple *prev = NULL;
-
- /* get the BezTriple immediately before the given one which has the same value */
- if (beztn != first_bezt) {
- /* XXX: Unless I'm overlooking some details from the past, this should be sufficient?
- * The old code did some elaborate stuff trying to find keyframe columns for
- * the given BezTriple, then step backwards to the column before that, and find
- * an appropriate BezTriple with matching values there. Maybe that was warranted
- * in the past, but now, that list is only ever filled with keyframes from the
- * current FCurve.
- *
- * -- Aligorith (20140415)
- */
- prev = beztn - 1;
+ /* New curve and block. */
+ if (col->totcurve <= 1 && col->totblock == 0) {
+ memcpy(&col->block, block, sizeof(ActKeyBlockInfo));
+ }
+ /* Existing curve. */
+ else {
+ col->block.conflict |= (col->block.flag ^ block->flag);
+ col->block.flag |= block->flag;
+ col->block.sel |= block->sel;
}
+ if (block->flag) {
+ col->totblock++;
+ }
+}
- /* check if block needed */
- if (prev == NULL) return;
+static void add_bezt_to_keyblocks_list(DLRBT_Tree *keys, BezTriple *bezt, int bezt_len)
+{
+ ActKeyColumn *col = keys->first;
- if (BEZKEYTYPE(beztn) == BEZT_KEYTYPE_MOVEHOLD) {
- /* Animator tagged a "moving hold"
- * - Previous key must also be tagged as a moving hold, otherwise
- * we're just dealing with the first of a pair, and we don't
- * want to be creating any phantom holds...
- */
- if (BEZKEYTYPE(prev) != BEZT_KEYTYPE_MOVEHOLD)
- return;
- }
- else {
- /* Check for same values...
- * - Handles must have same central value as each other
- * - Handles which control that section of the curve must be constant
- */
- if (IS_EQF(beztn->vec[1][1], prev->vec[1][1]) == 0) return;
+ if (bezt && bezt_len >= 2) {
+ ActKeyBlockInfo block;
- if (IS_EQF(beztn->vec[1][1], beztn->vec[0][1]) == 0) return;
- if (IS_EQF(prev->vec[1][1], prev->vec[2][1]) == 0) return;
- }
+ /* Find the first key column while inserting dummy blocks. */
+ for (; col != NULL && is_cfra_lt(col->cfra, bezt[0].vec[1][0]); col = col->next) {
+ add_keyblock_info(col, &dummy_keyblock);
+ }
- /* if there are no blocks already, just add as root */
- if (blocks->root == NULL) {
- /* just add this as the root, then call the tree-balancing functions to validate */
- new_ab = bezts_to_new_actkeyblock(prev, beztn);
- blocks->root = (DLRBT_Node *)new_ab;
- }
- else {
- ActKeyBlock *ab, *abn = NULL;
+ BLI_assert(col != NULL);
- /* try to find a keyblock that starts on the previous beztriple, and add a new one if none start there
- * Note: we perform a tree traversal here NOT a standard linked-list traversal...
- * Note: we can't search from end to try to optimize this as it causes errors there's
- * an A ___ B |---| B situation
- */
- // FIXME: here there is a bug where we are trying to get the summary for the following channels
- // A|--------------|A ______________ B|--------------|B
- // A|------------------------------------------------|A
- // A|----|A|---|A|-----------------------------------|A
- for (ab = blocks->root; ab; ab = abn) {
- /* check if this is a match, or whether we go left or right
- * NOTE: we now use a float threshold to prevent precision errors causing problems with summaries
- */
- if (IS_EQT(ab->start, prev->vec[1][0], BEZT_BINARYSEARCH_THRESH)) {
- /* set selection status and 'touched' status */
- if (BEZT_ISSEL_ANY(beztn))
- ab->sel = SELECT;
+ /* Insert real blocks. */
+ for (int v = 1; col != NULL && v < bezt_len; v++, bezt++) {
+ /* Wrong order of bezier keys: resync position. */
+ if (is_cfra_lt(bezt[1].vec[1][0], bezt[0].vec[1][0])) {
+ /* Backtrack to find the right location. */
+ if (is_cfra_lt(bezt[1].vec[1][0], col->cfra)) {
+ ActKeyColumn *newcol = (ActKeyColumn *)BLI_dlrbTree_search_exact(
+ keys, compare_ak_cfraPtr, &bezt[1].vec[1][0]);
- /* XXX: only when the first one was a moving hold? */
- if (BEZKEYTYPE(beztn) == BEZT_KEYTYPE_MOVEHOLD)
- ab->flag |= ACTKEYBLOCK_FLAG_MOVING_HOLD;
+ if (newcol != NULL) {
+ col = newcol;
- ab->modified++;
+ /* The previous keyblock is garbage too. */
+ if (col->prev != NULL) {
+ add_keyblock_info(col->prev, &dummy_keyblock);
+ }
+ }
+ else {
+ BLI_assert(false);
+ }
+ }
- /* done... no need to insert */
- return;
+ continue;
}
- else {
- ActKeyBlock **abnp = NULL; /* branch to go down - used to hook new blocks to parents */
-
- /* check if go left or right, but if not available, add new node */
- if (ab->start < prev->vec[1][0])
- abnp = &ab->right;
- else
- abnp = &ab->left;
-
- /* if this does not exist, add a new node, otherwise continue... */
- if (*abnp == NULL) {
- /* add a new node representing this, and attach it to the relevant place */
- new_ab = bezts_to_new_actkeyblock(prev, beztn);
- new_ab->parent = ab;
- *abnp = new_ab;
- break;
- }
- else
- abn = *abnp;
+
+ /* Normal sequence */
+ BLI_assert(is_cfra_eq(col->cfra, bezt[0].vec[1][0]));
+
+ compute_keyblock_data(&block, bezt, bezt + 1);
+
+ for (; col != NULL && is_cfra_lt(col->cfra, bezt[1].vec[1][0]); col = col->next) {
+ add_keyblock_info(col, &block);
}
+
+ BLI_assert(col != NULL);
}
}
- /* now, balance the tree taking into account this newly added node */
- BLI_dlrbTree_insert(blocks, (DLRBT_Node *)new_ab);
+ /* Insert dummy blocks at the end. */
+ for (; col != NULL; col = col->next) {
+ add_keyblock_info(col, &dummy_keyblock);
+ }
}
-/* --------- */
-
-/* Handle the 'touched' status of ActKeyColumn tree nodes */
-static void set_touched_actkeycolumn(ActKeyColumn *ak)
+/* Walk through columns and propagate blocks and totcurve.
+ *
+ * This must be called even by animation sources that don't generate
+ * keyblocks to keep the data structure consistent after adding columns.
+ */
+static void update_keyblocks(DLRBT_Tree *keys, BezTriple *bezt, int bezt_len)
{
- /* sanity check */
- if (ak == NULL)
- return;
+ /* Recompute the prev/next linked list. */
+ BLI_dlrbTree_linkedlist_sync(keys);
+
+ /* Find the curve count */
+ int max_curve = 0;
- /* deal with self first */
- if (ak->modified) {
- ak->modified = 0;
- ak->totcurve++;
+ for (ActKeyColumn *col = keys->first; col; col = col->next) {
+ max_curve = MAX2(max_curve, col->totcurve);
}
- /* children */
- set_touched_actkeycolumn(ak->left);
- set_touched_actkeycolumn(ak->right);
-}
+ /* Propagate blocks to inserted keys */
+ ActKeyColumn *prev_ready = NULL;
-/* Handle the 'touched' status of ActKeyBlock tree nodes */
-static void set_touched_actkeyblock(ActKeyBlock *ab)
-{
- /* sanity check */
- if (ab == NULL)
- return;
+ for (ActKeyColumn *col = keys->first; col; col = col->next) {
+ /* Pre-existing column. */
+ if (col->totcurve > 0) {
+ prev_ready = col;
+ }
+ /* Newly inserted column, so copy block data from previous. */
+ else if (prev_ready != NULL) {
+ col->totblock = prev_ready->totblock;
+ memcpy(&col->block, &prev_ready->block, sizeof(ActKeyBlockInfo));
+ }
- /* deal with self first */
- if (ab->modified) {
- ab->modified = 0;
- ab->totcurve++;
+ col->totcurve = max_curve + 1;
}
- /* children */
- set_touched_actkeyblock(ab->left);
- set_touched_actkeyblock(ab->right);
+ /* Add blocks on top */
+ add_bezt_to_keyblocks_list(keys, bezt, bezt_len);
}
/* --------- */
-/* Checks if ActKeyBlock should exist... */
-bool actkeyblock_is_valid(ActKeyBlock *ab, DLRBT_Tree *keys)
+bool actkeyblock_is_valid(ActKeyColumn *ac)
{
- ActKeyColumn *ak;
- short startCurves, endCurves, totCurves;
+ return ac != NULL && ac->next != NULL && ac->totblock > 0;
+}
+/* Checks if ActKeyBlock should exist... */
+int actkeyblock_get_valid_hold(ActKeyColumn *ac)
+{
/* check that block is valid */
- if (ab == NULL)
+ if (!actkeyblock_is_valid(ac))
return 0;
- /* find out how many curves occur at each keyframe */
- ak = (ActKeyColumn *)BLI_dlrbTree_search_exact(keys, compare_ak_cfraPtr, &ab->start);
- startCurves = (ak) ? ak->totcurve : 0;
-
- ak = (ActKeyColumn *)BLI_dlrbTree_search_exact(keys, compare_ak_cfraPtr, &ab->end);
- endCurves = (ak) ? ak->totcurve : 0;
-
- /* only draw keyblock if it appears in at all of the keyframes at lowest end */
- if (!startCurves && !endCurves)
- return 0;
-
- totCurves = (startCurves > endCurves) ? endCurves : startCurves;
- return (ab->totcurve >= totCurves);
+ const int hold_mask = (ACTKEYBLOCK_FLAG_ANY_HOLD | ACTKEYBLOCK_FLAG_STATIC_HOLD | ACTKEYBLOCK_FLAG_ANY_HOLD);
+ return (ac->block.flag & ~ac->block.conflict) & hold_mask;
}
/* *************************** Keyframe Drawing *************************** */
void draw_keyframe_shape(float x, float y, float size, bool sel, short key_type, short mode, float alpha,
- unsigned int pos_id, unsigned int size_id, unsigned int color_id, unsigned int outline_color_id)
+ unsigned int pos_id, unsigned int size_id, unsigned int color_id, unsigned int outline_color_id,
+ unsigned int flags_id, short handle_type, short extreme_type)
{
bool draw_fill = ELEM(mode, KEYFRAME_SHAPE_INSIDE, KEYFRAME_SHAPE_BOTH);
bool draw_outline = ELEM(mode, KEYFRAME_SHAPE_FRAME, KEYFRAME_SHAPE_BOTH);
@@ -499,6 +571,7 @@ void draw_keyframe_shape(float x, float y, float size, bool sel, short key_type,
unsigned char fill_col[4];
unsigned char outline_col[4];
+ unsigned int flags = 0;
/* draw! */
if (draw_fill) {
@@ -514,10 +587,7 @@ void draw_keyframe_shape(float x, float y, float size, bool sel, short key_type,
UI_GetThemeColor4ubv(sel ? TH_KEYTYPE_JITTER_SELECT : TH_KEYTYPE_JITTER, fill_col);
break;
case BEZT_KEYTYPE_MOVEHOLD: /* similar to traditional keyframes, but different... */
- /* XXX: Should these get their own theme options instead? */
- if (sel) UI_GetThemeColorShade3ubv(TH_STRIP_SELECT, 35, fill_col);
- else UI_GetThemeColorShade3ubv(TH_STRIP, 50, fill_col);
- fill_col[3] = 255; /* full opacity, to avoid problems with visual glitches */
+ UI_GetThemeColor4ubv(sel ? TH_KEYTYPE_MOVEHOLD_SELECT : TH_KEYTYPE_MOVEHOLD, fill_col);
break;
case BEZT_KEYTYPE_KEYFRAME: /* traditional yellowish frames (default theme) */
default:
@@ -550,18 +620,44 @@ void draw_keyframe_shape(float x, float y, float size, bool sel, short key_type,
fill_col[2] = outline_col[2];
fill_col[3] = 0;
}
+
+ /* Handle type to outline shape. */
+ switch (handle_type) {
+ case KEYFRAME_HANDLE_AUTO_CLAMP: flags = 0x2; break; /* circle */
+ case KEYFRAME_HANDLE_AUTO: flags = 0x12; break; /* circle with dot */
+ case KEYFRAME_HANDLE_VECTOR: flags = 0xC; break; /* square */
+ case KEYFRAME_HANDLE_ALIGNED: flags = 0x5; break; /* clipped diamond */
+
+ case KEYFRAME_HANDLE_FREE:
+ default:
+ flags = 1; /* diamond */
+ }
+
+ /* Extreme type to arrow-like shading. */
+ if (extreme_type & KEYFRAME_EXTREME_MAX) {
+ flags |= 0x100;
+ }
+ if (extreme_type & KEYFRAME_EXTREME_MIN) {
+ flags |= 0x200;
+ }
+ if (extreme_type & KEYFRAME_EXTREME_MIXED) {
+ flags |= 0x400;
+ }
}
- immAttrib1f(size_id, size);
- immAttrib4ubv(color_id, fill_col);
- immAttrib4ubv(outline_color_id, outline_col);
+ immAttr1f(size_id, size);
+ immAttr4ubv(color_id, fill_col);
+ immAttr4ubv(outline_color_id, outline_col);
+ immAttr1u(flags_id, flags);
immVertex2f(pos_id, x, y);
}
-static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, float ypos, float yscale_fac, bool channelLocked)
+static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, float ypos, float yscale_fac, bool channelLocked, int saction_flag)
{
const float icon_sz = U.widget_unit * 0.5f * yscale_fac;
const float half_icon_sz = 0.5f * icon_sz;
+ const float smaller_sz = 0.35f * icon_sz;
+ const float ipo_sz = 0.1f * icon_sz;
GPU_blend(true);
@@ -569,26 +665,37 @@ static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, floa
/* TODO: allow this opacity factor to be themed? */
float alpha = channelLocked ? 0.25f : 1.0f;
+ /* Show interpolation and handle type? */
+ bool show_ipo = (saction_flag & SACTION_SHOW_INTERPOLATION) != 0;
+
/* draw keyblocks */
- if (blocks) {
+ if (keys) {
float sel_color[4], unsel_color[4];
float sel_mhcol[4], unsel_mhcol[4];
+ float ipo_color[4], ipo_color_mix[4];
/* cache colours first */
UI_GetThemeColor4fv(TH_STRIP_SELECT, sel_color);
UI_GetThemeColor4fv(TH_STRIP, unsel_color);
+ UI_GetThemeColor4fv(TH_DOPESHEET_IPOLINE, ipo_color);
sel_color[3] *= alpha;
unsel_color[3] *= alpha;
+ ipo_color[3] *= alpha;
copy_v4_v4(sel_mhcol, sel_color);
sel_mhcol[3] *= 0.8f;
copy_v4_v4(unsel_mhcol, unsel_color);
unsel_mhcol[3] *= 0.8f;
+ copy_v4_v4(ipo_color_mix, ipo_color);
+ ipo_color_mix[3] *= 0.5f;
uint block_len = 0;
- for (ActKeyBlock *ab = blocks->first; ab; ab = ab->next) {
- if (actkeyblock_is_valid(ab, keys)) {
+ for (ActKeyColumn *ab = keys->first; ab; ab = ab->next) {
+ if (actkeyblock_get_valid_hold(ab)) {
+ block_len++;
+ }
+ if (show_ipo && actkeyblock_is_valid(ab) && (ab->block.flag & ACTKEYBLOCK_FLAG_NON_BEZIER)) {
block_len++;
}
}
@@ -600,21 +707,28 @@ static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, floa
immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
immBegin(GPU_PRIM_TRIS, 6 * block_len);
- for (ActKeyBlock *ab = blocks->first; ab; ab = ab->next) {
- if (actkeyblock_is_valid(ab, keys)) {
- if (ab->flag & ACTKEYBLOCK_FLAG_MOVING_HOLD) {
+ for (ActKeyColumn *ab = keys->first; ab; ab = ab->next) {
+ 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->start, ypos - half_icon_sz, ab->end, ypos + half_icon_sz,
- (ab->sel) ? sel_mhcol : unsel_mhcol);
+ 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->start, ypos - half_icon_sz, ab->end, ypos + half_icon_sz,
- (ab->sel) ? sel_color : unsel_color);
+ 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);
+ }
}
immEnd();
immUnbindProgram();
@@ -639,14 +753,25 @@ static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, floa
uint size_id = GPU_vertformat_attr_add(format, "size", GPU_COMP_F32, 1, GPU_FETCH_FLOAT);
uint color_id = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
uint outline_color_id = GPU_vertformat_attr_add(format, "outlineColor", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
+ uint flags_id = GPU_vertformat_attr_add(format, "flags", GPU_COMP_U32, 1, GPU_FETCH_INT);
immBindBuiltinProgram(GPU_SHADER_KEYFRAME_DIAMOND);
GPU_enable_program_point_size();
+ immUniform2f("ViewportSize", BLI_rcti_size_x(&v2d->mask) + 1, BLI_rcti_size_y(&v2d->mask) + 1);
immBegin(GPU_PRIM_POINTS, key_len);
+ short handle_type = KEYFRAME_HANDLE_NONE, extreme_type = KEYFRAME_EXTREME_NONE;
+
for (ActKeyColumn *ak = keys->first; ak; ak = ak->next) {
if (IN_RANGE_INCL(ak->cfra, v2d->cur.xmin, v2d->cur.xmax)) {
+ if (show_ipo) {
+ handle_type = ak->handle_type;
+ }
+ if (saction_flag & SACTION_SHOW_EXTREMES) {
+ extreme_type = ak->extreme_type;
+ }
+
draw_keyframe_shape(ak->cfra, ypos, icon_sz, (ak->sel & SELECT), ak->key_type, KEYFRAME_SHAPE_BOTH, alpha,
- pos_id, size_id, color_id, outline_color_id);
+ pos_id, size_id, color_id, outline_color_id, flags_id, handle_type, extreme_type);
}
}
@@ -661,139 +786,117 @@ static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, floa
/* *************************** Channel Drawing Funcs *************************** */
-void draw_summary_channel(View2D *v2d, bAnimContext *ac, float ypos, float yscale_fac)
+void draw_summary_channel(View2D *v2d, bAnimContext *ac, float ypos, float yscale_fac, int saction_flag)
{
- DLRBT_Tree keys, blocks;
+ DLRBT_Tree keys;
- BLI_dlrbTree_init(&keys);
- BLI_dlrbTree_init(&blocks);
+ saction_flag &= ~SACTION_SHOW_EXTREMES;
- summary_to_keylist(ac, &keys, &blocks);
+ BLI_dlrbTree_init(&keys);
- BLI_dlrbTree_linkedlist_sync(&keys);
- BLI_dlrbTree_linkedlist_sync(&blocks);
+ summary_to_keylist(ac, &keys, saction_flag);
- draw_keylist(v2d, &keys, &blocks, ypos, yscale_fac, false);
+ draw_keylist(v2d, &keys, ypos, yscale_fac, false, saction_flag);
BLI_dlrbTree_free(&keys);
- BLI_dlrbTree_free(&blocks);
}
-void draw_scene_channel(View2D *v2d, bDopeSheet *ads, Scene *sce, float ypos, float yscale_fac)
+void draw_scene_channel(View2D *v2d, bDopeSheet *ads, Scene *sce, float ypos, float yscale_fac, int saction_flag)
{
- DLRBT_Tree keys, blocks;
+ DLRBT_Tree keys;
- BLI_dlrbTree_init(&keys);
- BLI_dlrbTree_init(&blocks);
+ saction_flag &= ~SACTION_SHOW_EXTREMES;
- scene_to_keylist(ads, sce, &keys, &blocks);
+ BLI_dlrbTree_init(&keys);
- BLI_dlrbTree_linkedlist_sync(&keys);
- BLI_dlrbTree_linkedlist_sync(&blocks);
+ scene_to_keylist(ads, sce, &keys, saction_flag);
- draw_keylist(v2d, &keys, &blocks, ypos, yscale_fac, false);
+ draw_keylist(v2d, &keys, ypos, yscale_fac, false, saction_flag);
BLI_dlrbTree_free(&keys);
- BLI_dlrbTree_free(&blocks);
}
-void draw_object_channel(View2D *v2d, bDopeSheet *ads, Object *ob, float ypos, float yscale_fac)
+void draw_object_channel(View2D *v2d, bDopeSheet *ads, Object *ob, float ypos, float yscale_fac, int saction_flag)
{
- DLRBT_Tree keys, blocks;
+ DLRBT_Tree keys;
- BLI_dlrbTree_init(&keys);
- BLI_dlrbTree_init(&blocks);
+ saction_flag &= ~SACTION_SHOW_EXTREMES;
- ob_to_keylist(ads, ob, &keys, &blocks);
+ BLI_dlrbTree_init(&keys);
- BLI_dlrbTree_linkedlist_sync(&keys);
- BLI_dlrbTree_linkedlist_sync(&blocks);
+ ob_to_keylist(ads, ob, &keys, saction_flag);
- draw_keylist(v2d, &keys, &blocks, ypos, yscale_fac, false);
+ draw_keylist(v2d, &keys, ypos, yscale_fac, false, saction_flag);
BLI_dlrbTree_free(&keys);
- BLI_dlrbTree_free(&blocks);
}
-void draw_fcurve_channel(View2D *v2d, AnimData *adt, FCurve *fcu, float ypos, float yscale_fac)
+void draw_fcurve_channel(View2D *v2d, AnimData *adt, FCurve *fcu, float ypos, float yscale_fac, int saction_flag)
{
- DLRBT_Tree keys, blocks;
+ DLRBT_Tree keys;
bool locked = (fcu->flag & FCURVE_PROTECTED) ||
((fcu->grp) && (fcu->grp->flag & AGRP_PROTECTED)) ||
((adt && adt->action) && ID_IS_LINKED(adt->action));
BLI_dlrbTree_init(&keys);
- BLI_dlrbTree_init(&blocks);
-
- fcurve_to_keylist(adt, fcu, &keys, &blocks);
- BLI_dlrbTree_linkedlist_sync(&keys);
- BLI_dlrbTree_linkedlist_sync(&blocks);
+ fcurve_to_keylist(adt, fcu, &keys, saction_flag);
- draw_keylist(v2d, &keys, &blocks, ypos, yscale_fac, locked);
+ draw_keylist(v2d, &keys, ypos, yscale_fac, locked, saction_flag);
BLI_dlrbTree_free(&keys);
- BLI_dlrbTree_free(&blocks);
}
-void draw_agroup_channel(View2D *v2d, AnimData *adt, bActionGroup *agrp, float ypos, float yscale_fac)
+void draw_agroup_channel(View2D *v2d, AnimData *adt, bActionGroup *agrp, float ypos, float yscale_fac, int saction_flag)
{
- DLRBT_Tree keys, blocks;
+ DLRBT_Tree keys;
bool locked = (agrp->flag & AGRP_PROTECTED) ||
((adt && adt->action) && ID_IS_LINKED(adt->action));
BLI_dlrbTree_init(&keys);
- BLI_dlrbTree_init(&blocks);
-
- agroup_to_keylist(adt, agrp, &keys, &blocks);
- BLI_dlrbTree_linkedlist_sync(&keys);
- BLI_dlrbTree_linkedlist_sync(&blocks);
+ agroup_to_keylist(adt, agrp, &keys, saction_flag);
- draw_keylist(v2d, &keys, &blocks, ypos, yscale_fac, locked);
+ draw_keylist(v2d, &keys, ypos, yscale_fac, locked, saction_flag);
BLI_dlrbTree_free(&keys);
- BLI_dlrbTree_free(&blocks);
}
-void draw_action_channel(View2D *v2d, AnimData *adt, bAction *act, float ypos, float yscale_fac)
+void draw_action_channel(View2D *v2d, AnimData *adt, bAction *act, float ypos, float yscale_fac, int saction_flag)
{
- DLRBT_Tree keys, blocks;
+ DLRBT_Tree keys;
bool locked = (act && ID_IS_LINKED(act));
- BLI_dlrbTree_init(&keys);
- BLI_dlrbTree_init(&blocks);
+ saction_flag &= ~SACTION_SHOW_EXTREMES;
- action_to_keylist(adt, act, &keys, &blocks);
+ BLI_dlrbTree_init(&keys);
- BLI_dlrbTree_linkedlist_sync(&keys);
- BLI_dlrbTree_linkedlist_sync(&blocks);
+ action_to_keylist(adt, act, &keys, saction_flag);
- draw_keylist(v2d, &keys, &blocks, ypos, yscale_fac, locked);
+ draw_keylist(v2d, &keys, ypos, yscale_fac, locked, saction_flag);
BLI_dlrbTree_free(&keys);
- BLI_dlrbTree_free(&blocks);
}
-void draw_gpencil_channel(View2D *v2d, bDopeSheet *ads, bGPdata *gpd, float ypos, float yscale_fac)
+void draw_gpencil_channel(View2D *v2d, bDopeSheet *ads, bGPdata *gpd, float ypos, float yscale_fac, int saction_flag)
{
DLRBT_Tree keys;
+ saction_flag &= ~SACTION_SHOW_EXTREMES;
+
BLI_dlrbTree_init(&keys);
gpencil_to_keylist(ads, gpd, &keys, false);
- BLI_dlrbTree_linkedlist_sync(&keys);
-
- draw_keylist(v2d, &keys, NULL, ypos, yscale_fac, false);
+ draw_keylist(v2d, &keys, ypos, yscale_fac, false, saction_flag);
BLI_dlrbTree_free(&keys);
}
-void draw_gpl_channel(View2D *v2d, bDopeSheet *ads, bGPDlayer *gpl, float ypos, float yscale_fac)
+void draw_gpl_channel(View2D *v2d, bDopeSheet *ads, bGPDlayer *gpl, float ypos, float yscale_fac, int saction_flag)
{
DLRBT_Tree keys;
@@ -803,14 +906,12 @@ void draw_gpl_channel(View2D *v2d, bDopeSheet *ads, bGPDlayer *gpl, float ypos,
gpl_to_keylist(ads, gpl, &keys);
- BLI_dlrbTree_linkedlist_sync(&keys);
-
- draw_keylist(v2d, &keys, NULL, ypos, yscale_fac, locked);
+ draw_keylist(v2d, &keys, ypos, yscale_fac, locked, saction_flag);
BLI_dlrbTree_free(&keys);
}
-void draw_masklay_channel(View2D *v2d, bDopeSheet *ads, MaskLayer *masklay, float ypos, float yscale_fac)
+void draw_masklay_channel(View2D *v2d, bDopeSheet *ads, MaskLayer *masklay, float ypos, float yscale_fac, int saction_flag)
{
DLRBT_Tree keys;
@@ -820,16 +921,14 @@ void draw_masklay_channel(View2D *v2d, bDopeSheet *ads, MaskLayer *masklay, floa
mask_to_keylist(ads, masklay, &keys);
- BLI_dlrbTree_linkedlist_sync(&keys);
-
- draw_keylist(v2d, &keys, NULL, ypos, yscale_fac, locked);
+ draw_keylist(v2d, &keys, ypos, yscale_fac, locked, saction_flag);
BLI_dlrbTree_free(&keys);
}
/* *************************** Keyframe List Conversions *************************** */
-void summary_to_keylist(bAnimContext *ac, DLRBT_Tree *keys, DLRBT_Tree *blocks)
+void summary_to_keylist(bAnimContext *ac, DLRBT_Tree *keys, int saction_flag)
{
if (ac) {
ListBase anim_data = {NULL, NULL};
@@ -849,7 +948,7 @@ void summary_to_keylist(bAnimContext *ac, DLRBT_Tree *keys, DLRBT_Tree *blocks)
switch (ale->datatype) {
case ALE_FCURVE:
- fcurve_to_keylist(ale->adt, ale->data, keys, blocks);
+ fcurve_to_keylist(ale->adt, ale->data, keys, saction_flag);
break;
case ALE_MASKLAY:
mask_to_keylist(ac->ads, ale->data, keys);
@@ -867,7 +966,7 @@ void summary_to_keylist(bAnimContext *ac, DLRBT_Tree *keys, DLRBT_Tree *blocks)
}
}
-void scene_to_keylist(bDopeSheet *ads, Scene *sce, DLRBT_Tree *keys, DLRBT_Tree *blocks)
+void scene_to_keylist(bDopeSheet *ads, Scene *sce, DLRBT_Tree *keys, int saction_flag)
{
bAnimContext ac = {NULL};
ListBase anim_data = {NULL, NULL};
@@ -895,12 +994,12 @@ void scene_to_keylist(bDopeSheet *ads, Scene *sce, DLRBT_Tree *keys, DLRBT_Tree
/* loop through each F-Curve, grabbing the keyframes */
for (ale = anim_data.first; ale; ale = ale->next)
- fcurve_to_keylist(ale->adt, ale->data, keys, blocks);
+ fcurve_to_keylist(ale->adt, ale->data, keys, saction_flag);
ANIM_animdata_freelist(&anim_data);
}
-void ob_to_keylist(bDopeSheet *ads, Object *ob, DLRBT_Tree *keys, DLRBT_Tree *blocks)
+void ob_to_keylist(bDopeSheet *ads, Object *ob, DLRBT_Tree *keys, int saction_flag)
{
bAnimContext ac = {NULL};
ListBase anim_data = {NULL, NULL};
@@ -931,12 +1030,12 @@ void ob_to_keylist(bDopeSheet *ads, Object *ob, DLRBT_Tree *keys, DLRBT_Tree *bl
/* loop through each F-Curve, grabbing the keyframes */
for (ale = anim_data.first; ale; ale = ale->next)
- fcurve_to_keylist(ale->adt, ale->data, keys, blocks);
+ fcurve_to_keylist(ale->adt, ale->data, keys, saction_flag);
ANIM_animdata_freelist(&anim_data);
}
-void cachefile_to_keylist(bDopeSheet *ads, CacheFile *cache_file, DLRBT_Tree *keys, DLRBT_Tree *blocks)
+void cachefile_to_keylist(bDopeSheet *ads, CacheFile *cache_file, DLRBT_Tree *keys, int saction_flag)
{
if (cache_file == NULL) {
return;
@@ -961,33 +1060,40 @@ void cachefile_to_keylist(bDopeSheet *ads, CacheFile *cache_file, DLRBT_Tree *ke
/* loop through each F-Curve, grabbing the keyframes */
for (bAnimListElem *ale = anim_data.first; ale; ale = ale->next) {
- fcurve_to_keylist(ale->adt, ale->data, keys, blocks);
+ fcurve_to_keylist(ale->adt, ale->data, keys, saction_flag);
}
ANIM_animdata_freelist(&anim_data);
}
-void fcurve_to_keylist(AnimData *adt, FCurve *fcu, DLRBT_Tree *keys, DLRBT_Tree *blocks)
+void fcurve_to_keylist(AnimData *adt, FCurve *fcu, DLRBT_Tree *keys, int saction_flag)
{
- BezTriple *bezt;
- unsigned int v;
-
if (fcu && fcu->totvert && fcu->bezt) {
/* apply NLA-mapping (if applicable) */
if (adt)
ANIM_nla_mapping_apply_fcurve(adt, fcu, 0, 0);
- /* loop through beztriples, making ActKeysColumns and ActKeyBlocks */
- for (v = 0, bezt = fcu->bezt; v < fcu->totvert; v++, bezt++) {
- add_bezt_to_keycolumns_list(keys, bezt);
- if (blocks) add_bezt_to_keyblocks_list(blocks, fcu->bezt, bezt);
+ /* Check if the curve is cyclic. */
+ bool is_cyclic = BKE_fcurve_is_cyclic(fcu) && (fcu->totvert >= 2);
+ bool do_extremes = (saction_flag & SACTION_SHOW_EXTREMES) != 0;
+
+ /* loop through beztriples, making ActKeysColumns */
+ BezTripleChain chain = { 0 };
+
+ for (int v = 0; v < fcu->totvert; v++) {
+ chain.cur = &fcu->bezt[v];
+
+ /* Neighbor keys, accounting for being cyclic. */
+ if (do_extremes) {
+ chain.prev = (v > 0) ? &fcu->bezt[v - 1] : is_cyclic ? &fcu->bezt[fcu->totvert - 2] : NULL;
+ chain.next = (v + 1 < fcu->totvert) ? &fcu->bezt[v + 1] : is_cyclic ? &fcu->bezt[1] : NULL;
+ }
+
+ add_bezt_to_keycolumns_list(keys, &chain);
}
- /* update the number of curves that elements have appeared in */
- if (keys)
- set_touched_actkeycolumn(keys->root);
- if (blocks)
- set_touched_actkeyblock(blocks->root);
+ /* Update keyblocks. */
+ update_keyblocks(keys, fcu->bezt, fcu->totvert);
/* unapply NLA-mapping if applicable */
if (adt)
@@ -995,26 +1101,26 @@ void fcurve_to_keylist(AnimData *adt, FCurve *fcu, DLRBT_Tree *keys, DLRBT_Tree
}
}
-void agroup_to_keylist(AnimData *adt, bActionGroup *agrp, DLRBT_Tree *keys, DLRBT_Tree *blocks)
+void agroup_to_keylist(AnimData *adt, bActionGroup *agrp, DLRBT_Tree *keys, int saction_flag)
{
FCurve *fcu;
if (agrp) {
/* loop through F-Curves */
for (fcu = agrp->channels.first; fcu && fcu->grp == agrp; fcu = fcu->next) {
- fcurve_to_keylist(adt, fcu, keys, blocks);
+ fcurve_to_keylist(adt, fcu, keys, saction_flag);
}
}
}
-void action_to_keylist(AnimData *adt, bAction *act, DLRBT_Tree *keys, DLRBT_Tree *blocks)
+void action_to_keylist(AnimData *adt, bAction *act, DLRBT_Tree *keys, int saction_flag)
{
FCurve *fcu;
if (act) {
/* loop through F-Curves */
for (fcu = act->curves.first; fcu; fcu = fcu->next) {
- fcurve_to_keylist(adt, fcu, keys, blocks);
+ fcurve_to_keylist(adt, fcu, keys, saction_flag);
}
}
}
@@ -1026,7 +1132,7 @@ void gpencil_to_keylist(bDopeSheet *ads, bGPdata *gpd, DLRBT_Tree *keys, const b
if (gpd && keys) {
/* for now, just aggregate out all the frames, but only for visible layers */
- for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+ for (gpl = gpd->layers.last; gpl; gpl = gpl->prev) {
if ((gpl->flag & GP_LAYER_HIDE) == 0) {
if ((!active) || ((active) && (gpl->flag & GP_LAYER_SELECT))) {
gpl_to_keylist(ads, gpl, keys);
@@ -1044,6 +1150,8 @@ void gpl_to_keylist(bDopeSheet *UNUSED(ads), bGPDlayer *gpl, DLRBT_Tree *keys)
/* although the frames should already be in an ordered list, they are not suitable for displaying yet */
for (gpf = gpl->frames.first; gpf; gpf = gpf->next)
add_gpframe_to_keycolumns_list(keys, gpf);
+
+ update_keyblocks(keys, NULL, 0);
}
}
@@ -1058,5 +1166,7 @@ void mask_to_keylist(bDopeSheet *UNUSED(ads), MaskLayer *masklay, DLRBT_Tree *ke
{
add_masklay_to_keycolumns_list(keys, masklay_shape);
}
+
+ update_keyblocks(keys, NULL, 0);
}
}
diff --git a/source/blender/editors/animation/keyframes_edit.c b/source/blender/editors/animation/keyframes_edit.c
index 1bbfa6cc979..541a282f389 100644
--- a/source/blender/editors/animation/keyframes_edit.c
+++ b/source/blender/editors/animation/keyframes_edit.c
@@ -107,7 +107,7 @@ short ANIM_fcurve_keyframes_loop(KeyframeEditData *ked, FCurve *fcu, KeyframeEdi
ked->curflags = 0;
}
- /* Only operate on this BezTriple if it fullfills the criteria of the validation func */
+ /* Only operate on this BezTriple if it fulfills the criteria of the validation func */
if ((ok = key_ok(ked, bezt))) {
if (ked) ked->curflags = ok;
@@ -416,16 +416,14 @@ void ANIM_editkeyframes_refresh(bAnimContext *ac)
filter = ANIMFILTER_DATA_VISIBLE;
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
- /* loop over F-Curves that are likely to have been edited, and check them */
+ /* Loop over F-Curves that are likely to have been edited, and tag them to
+ * ensure the keyframes are in order and handles are in a valid position. */
for (ale = anim_data.first; ale; ale = ale->next) {
- FCurve *fcu = ale->key_data;
-
- /* make sure keyframes in F-Curve are all in order, and handles are in valid positions */
- sort_time_fcurve(fcu);
- calchandles_fcurve(fcu);
+ ale->update |= ANIM_UPDATE_DEPS | ANIM_UPDATE_HANDLES | ANIM_UPDATE_ORDER;
}
/* free temp data */
+ ANIM_animdata_update(ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
}
@@ -761,7 +759,7 @@ static short snap_bezier_nearest(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
return 0;
}
-/* snaps the keyframe to the neares second */
+/* snaps the keyframe to the nearest second */
static short snap_bezier_nearestsec(KeyframeEditData *ked, BezTriple *bezt)
{
const Scene *scene = ked->scene;
@@ -882,7 +880,7 @@ static short mirror_bezier_cframe(KeyframeEditData *ked, BezTriple *bezt)
static short mirror_bezier_yaxis(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT) {
- /* Yes, names are inverted, we are mirroring accross y axis, hence along x axis... */
+ /* Yes, names are inverted, we are mirroring across y axis, hence along x axis... */
mirror_bezier_xaxis_ex(bezt, 0.0f);
}
@@ -892,7 +890,7 @@ static short mirror_bezier_yaxis(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
static short mirror_bezier_xaxis(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT) {
- /* Yes, names are inverted, we are mirroring accross x axis, hence along y axis... */
+ /* Yes, names are inverted, we are mirroring across x axis, hence along y axis... */
mirror_bezier_yaxis_ex(bezt, 0.0f);
}
@@ -911,7 +909,7 @@ static short mirror_bezier_marker(KeyframeEditData *ked, BezTriple *bezt)
static short mirror_bezier_time(KeyframeEditData *ked, BezTriple *bezt)
{
- /* value to mirror over is strored in f1 */
+ /* value to mirror over is stored in f1 */
if (bezt->f2 & SELECT) {
mirror_bezier_xaxis_ex(bezt, ked->f1);
}
diff --git a/source/blender/editors/animation/keyframes_general.c b/source/blender/editors/animation/keyframes_general.c
index 7f54903f66c..7887fe244f1 100644
--- a/source/blender/editors/animation/keyframes_general.c
+++ b/source/blender/editors/animation/keyframes_general.c
@@ -47,7 +47,6 @@
#include "BKE_action.h"
#include "BKE_fcurve.h"
#include "BKE_report.h"
-#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_global.h"
#include "BKE_deform.h"
@@ -973,18 +972,18 @@ short paste_animedit_keys(bAnimContext *ac, ListBase *anim_data,
}
else {
/* from selected channels
- * This "passes" system aims to try to find "matching" channels to paste keyframes
- * into with increasingly loose matching heuristics. The process finishes when at least
- * one F-Curve has been pasted into.
+ * This "passes" system aims to try to find "matching" channels to paste keyframes
+ * into with increasingly loose matching heuristics. The process finishes when at least
+ * one F-Curve has been pasted into.
*/
for (pass = 0; pass < 3; pass++) {
unsigned int totmatch = 0;
for (ale = anim_data->first; ale; ale = ale->next) {
/* find buffer item to paste from
- * - if names don't matter (i.e. only 1 channel in buffer), don't check id/group
- * - if names do matter, only check if id-type is ok for now (group check is not that important)
- * - most importantly, rna-paths should match (array indices are unimportant for now)
+ * - if names don't matter (i.e. only 1 channel in buffer), don't check id/group
+ * - if names do matter, only check if id-type is ok for now (group check is not that important)
+ * - most importantly, rna-paths should match (array indices are unimportant for now)
*/
AnimData *adt = ANIM_nla_mapping_get(ac, ale);
FCurve *fcu = (FCurve *)ale->data; /* destination F-Curve */
diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c
index 7f045fa477f..863dd4efa82 100644
--- a/source/blender/editors/animation/keyframing.c
+++ b/source/blender/editors/animation/keyframing.c
@@ -116,6 +116,10 @@ short ANIM_get_keyframing_flags(Scene *scene, short incl_mode)
/* keyframing mode - only replace existing keyframes */
if (IS_AUTOKEY_MODE(scene, EDITKEYS))
flag |= INSERTKEY_REPLACE;
+
+ /* cycle-aware keyframe insertion - preserve cycle period and flow */
+ if (IS_AUTOKEY_FLAG(scene, CYCLEAWARE))
+ flag |= INSERTKEY_CYCLE_AWARE;
}
return flag;
@@ -157,8 +161,7 @@ bAction *verify_adt_action(Main *bmain, ID *id, short add)
*/
adt->action->idroot = GS(id->name);
- /* tag depsgraph to be rebuilt to include time dependency */
- /* XXX: we probably should have bmain passed down, but that involves altering too many API's */
+ /* Tag depsgraph to be rebuilt to include time dependency. */
DEG_relations_tag_update(bmain);
}
@@ -171,7 +174,7 @@ bAction *verify_adt_action(Main *bmain, ID *id, short add)
/* Get (or add relevant data to be able to do so) F-Curve from the Active Action,
* for the given Animation Data block. This assumes that all the destinations are valid.
*/
-FCurve *verify_fcurve(bAction *act, const char group[], PointerRNA *ptr,
+FCurve *verify_fcurve(Main *bmain, bAction *act, const char group[], PointerRNA *ptr,
const char rna_path[], const int array_index, short add)
{
bActionGroup *agrp;
@@ -232,6 +235,11 @@ FCurve *verify_fcurve(bAction *act, const char group[], PointerRNA *ptr,
/* just add F-Curve to end of Action's list */
BLI_addtail(&act->curves, fcu);
}
+
+ /* New f-curve was added, meaning it's possible that it affects
+ * dependency graph component which wasn't previously animated.
+ */
+ DEG_relations_tag_update(bmain);
}
/* return the F-Curve */
@@ -299,8 +307,67 @@ void update_autoflags_fcurve(FCurve *fcu, bContext *C, ReportList *reports, Poin
/* ************************************************** */
/* KEYFRAME INSERTION */
+/* Move the point where a key is about to be inserted to be inside the main cycle range.
+ * Returns the type of the cycle if it is enabled and valid.
+ */
+static eFCU_Cycle_Type remap_cyclic_keyframe_location(FCurve *fcu, float *px, float *py)
+{
+ if (fcu->totvert < 2 || !fcu->bezt) {
+ return FCU_CYCLE_NONE;
+ }
+
+ eFCU_Cycle_Type type = BKE_fcurve_get_cycle_type(fcu);
+
+ if (type == FCU_CYCLE_NONE) {
+ return FCU_CYCLE_NONE;
+ }
+
+ BezTriple *first = &fcu->bezt[0], *last = &fcu->bezt[fcu->totvert - 1];
+ float start = first->vec[1][0], end = last->vec[1][0];
+
+ if (start >= end) {
+ return FCU_CYCLE_NONE;
+ }
+
+ if (*px < start || *px > end) {
+ float period = end - start;
+ float step = floorf((*px - start) / period);
+ *px -= step * period;
+
+ if (type == FCU_CYCLE_OFFSET) {
+ /* Nasty check to handle the case when the modes are different better. */
+ FMod_Cycles *data = ((FModifier *)fcu->modifiers.first)->data;
+ short mode = (step >= 0) ? data->after_mode : data->before_mode;
+
+ if (mode == FCM_EXTRAPOLATE_CYCLIC_OFFSET) {
+ *py -= step * (last->vec[1][1] - first->vec[1][1]);
+ }
+ }
+ }
+
+ return type;
+}
+
/* -------------- BezTriple Insertion -------------------- */
+/* Change the Y position of a keyframe to match the input, adjusting handles. */
+static void replace_bezt_keyframe_ypos(BezTriple *dst, const BezTriple *bezt)
+{
+ /* just change the values when replacing, so as to not overwrite handles */
+ float dy = bezt->vec[1][1] - dst->vec[1][1];
+
+ /* just apply delta value change to the handle values */
+ dst->vec[0][1] += dy;
+ dst->vec[1][1] += dy;
+ dst->vec[2][1] += dy;
+
+ dst->f1 = bezt->f1;
+ dst->f2 = bezt->f2;
+ dst->f3 = bezt->f3;
+
+ /* TODO: perform some other operations? */
+}
+
/* This function adds a given BezTriple to an F-Curve. It will allocate
* memory for the array if needed, and will insert the BezTriple into a
* suitable place in chronological order.
@@ -325,20 +392,14 @@ int insert_bezt_fcurve(FCurve *fcu, const BezTriple *bezt, eInsertKeyFlags flag)
fcu->bezt[i] = *bezt;
}
else {
- /* just change the values when replacing, so as to not overwrite handles */
- BezTriple *dst = (fcu->bezt + i);
- float dy = bezt->vec[1][1] - dst->vec[1][1];
-
- /* just apply delta value change to the handle values */
- dst->vec[0][1] += dy;
- dst->vec[1][1] += dy;
- dst->vec[2][1] += dy;
-
- dst->f1 = bezt->f1;
- dst->f2 = bezt->f2;
- dst->f3 = bezt->f3;
+ replace_bezt_keyframe_ypos(&fcu->bezt[i], bezt);
+ }
- /* TODO: perform some other operations? */
+ if (flag & INSERTKEY_CYCLE_AWARE) {
+ /* If replacing an end point of a cyclic curve without offset, modify the other end too. */
+ if ((i == 0 || i == fcu->totvert - 1) && BKE_fcurve_get_cycle_type(fcu) == FCU_CYCLE_PERFECT) {
+ replace_bezt_keyframe_ypos(&fcu->bezt[i == 0 ? fcu->totvert - 1 : 0], bezt);
+ }
}
}
}
@@ -749,6 +810,7 @@ static bool visualkey_can_use(PointerRNA *ptr, PropertyRNA *prop)
switch (con->type) {
/* multi-transform constraints */
case CONSTRAINT_TYPE_CHILDOF:
+ case CONSTRAINT_TYPE_ARMATURE:
return true;
case CONSTRAINT_TYPE_TRANSFORM:
case CONSTRAINT_TYPE_TRANSLIKE:
@@ -758,7 +820,7 @@ static bool visualkey_can_use(PointerRNA *ptr, PropertyRNA *prop)
case CONSTRAINT_TYPE_KINEMATIC:
return true;
- /* single-transform constraits */
+ /* single-transform constraints */
case CONSTRAINT_TYPE_TRACKTO:
if (searchtype == VISUALKEY_ROT) return true;
break;
@@ -976,6 +1038,14 @@ bool insert_keyframe_direct(Depsgraph *depsgraph, ReportList *reports, PointerRN
curval = setting_get_rna_value(depsgraph, &ptr, prop, fcu->array_index, false);
}
+ /* adjust coordinates for cycle aware insertion */
+ if (flag & INSERTKEY_CYCLE_AWARE) {
+ if (remap_cyclic_keyframe_location(fcu, &cfra, &curval) != FCU_CYCLE_PERFECT) {
+ /* inhibit action from insert_vert_fcurve unless it's a perfect cycle */
+ flag &= ~INSERTKEY_CYCLE_AWARE;
+ }
+ }
+
/* only insert keyframes where they are needed */
if (flag & INSERTKEY_NEEDED) {
short insert_mode;
@@ -1083,7 +1153,7 @@ short insert_keyframe(
* - if we're replacing keyframes only, DO NOT create new F-Curves if they do not exist yet
* but still try to get the F-Curve if it exists...
*/
- fcu = verify_fcurve(act, group, &ptr, rna_path, array_index, (flag & INSERTKEY_REPLACE) == 0);
+ fcu = verify_fcurve(bmain, act, group, &ptr, rna_path, array_index, (flag & INSERTKEY_REPLACE) == 0);
/* we may not have a F-Curve when we're replacing only... */
if (fcu) {
@@ -1156,7 +1226,9 @@ static bool delete_keyframe_fcurve(AnimData *adt, FCurve *fcu, float cfra)
return false;
}
-short delete_keyframe(ReportList *reports, ID *id, bAction *act, const char group[], const char rna_path[], int array_index, float cfra, eInsertKeyFlags UNUSED(flag))
+short delete_keyframe(Main *bmain, ReportList *reports, ID *id, bAction *act,
+ const char group[], const char rna_path[], int array_index, float cfra,
+ eInsertKeyFlags UNUSED(flag))
{
AnimData *adt = BKE_animdata_from_id(id);
PointerRNA id_ptr, ptr;
@@ -1214,7 +1286,7 @@ short delete_keyframe(ReportList *reports, ID *id, bAction *act, const char grou
/* will only loop once unless the array index was -1 */
for (; array_index < array_index_max; array_index++) {
- FCurve *fcu = verify_fcurve(act, group, &ptr, rna_path, array_index, 0);
+ FCurve *fcu = verify_fcurve(bmain, act, group, &ptr, rna_path, array_index, 0);
/* check if F-Curve exists and/or whether it can be edited */
if (fcu == NULL)
@@ -1245,7 +1317,9 @@ short delete_keyframe(ReportList *reports, ID *id, bAction *act, const char grou
* The flag argument is used for special settings that alter the behavior of
* the keyframe deletion. These include the quick refresh options.
*/
-static short clear_keyframe(ReportList *reports, ID *id, bAction *act, const char group[], const char rna_path[], int array_index, eInsertKeyFlags UNUSED(flag))
+static short clear_keyframe(Main *bmain, ReportList *reports, ID *id, bAction *act,
+ const char group[], const char rna_path[], int array_index,
+ eInsertKeyFlags UNUSED(flag))
{
AnimData *adt = BKE_animdata_from_id(id);
PointerRNA id_ptr, ptr;
@@ -1300,7 +1374,7 @@ static short clear_keyframe(ReportList *reports, ID *id, bAction *act, const cha
/* will only loop once unless the array index was -1 */
for (; array_index < array_index_max; array_index++) {
- FCurve *fcu = verify_fcurve(act, group, &ptr, rna_path, array_index, 0);
+ FCurve *fcu = verify_fcurve(bmain, act, group, &ptr, rna_path, array_index, 0);
/* check if F-Curve exists and/or whether it can be edited */
if (fcu == NULL)
@@ -1710,7 +1784,7 @@ static int delete_key_v3d_exec(bContext *C, wmOperator *op)
}
/* special exception for bones, as this makes this operator more convenient to use
- * NOTE: This is only done in pose mode. In object mode, we're dealign with the entire object.
+ * NOTE: This is only done in pose mode. In object mode, we're dealing with the entire object.
*/
if ((ob->mode & OB_MODE_POSE) && strstr(fcu->rna_path, "pose.bones[\"")) {
bPoseChannel *pchan;
@@ -1929,6 +2003,7 @@ static int delete_key_button_exec(bContext *C, wmOperator *op)
Scene *scene = CTX_data_scene(C);
PointerRNA ptr = {{NULL}};
PropertyRNA *prop = NULL;
+ Main *bmain = CTX_data_main(C);
char *path;
float cfra = (float)CFRA; // XXX for now, don't bother about all the yucky offset crap
short success = 0;
@@ -1985,7 +2060,7 @@ static int delete_key_button_exec(bContext *C, wmOperator *op)
index = -1;
}
- success = delete_keyframe(op->reports, ptr.id.data, NULL, NULL, path, index, cfra, 0);
+ success = delete_keyframe(bmain, op->reports, ptr.id.data, NULL, NULL, path, index, cfra, 0);
MEM_freeN(path);
}
else if (G.debug & G_DEBUG)
@@ -2033,6 +2108,7 @@ static int clear_key_button_exec(bContext *C, wmOperator *op)
{
PointerRNA ptr = {{NULL}};
PropertyRNA *prop = NULL;
+ Main *bmain = CTX_data_main(C);
char *path;
short success = 0;
int index;
@@ -2053,7 +2129,7 @@ static int clear_key_button_exec(bContext *C, wmOperator *op)
index = -1;
}
- success += clear_keyframe(op->reports, ptr.id.data, NULL, NULL, path, index, 0);
+ success += clear_keyframe(bmain, op->reports, ptr.id.data, NULL, NULL, path, index, 0);
MEM_freeN(path);
}
else if (G.debug & G_DEBUG)
diff --git a/source/blender/editors/animation/keyingsets.c b/source/blender/editors/animation/keyingsets.c
index b5a998f60da..e97f88afffd 100644
--- a/source/blender/editors/animation/keyingsets.c
+++ b/source/blender/editors/animation/keyingsets.c
@@ -710,7 +710,7 @@ int ANIM_scene_get_keyingset_index(Scene *scene, KeyingSet *ks)
}
/* Get Keying Set to use for Auto-Keyframing some transforms */
-KeyingSet *ANIM_get_keyingset_for_autokeying(Scene *scene, const char *tranformKSName)
+KeyingSet *ANIM_get_keyingset_for_autokeying(Scene *scene, const char *transformKSName)
{
/* get KeyingSet to use
* - use the active KeyingSet if defined (and user wants to use it for all autokeying),
@@ -721,7 +721,7 @@ KeyingSet *ANIM_get_keyingset_for_autokeying(Scene *scene, const char *tranformK
else if (IS_AUTOKEY_FLAG(scene, INSERTAVAIL))
return ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_AVAILABLE_ID);
else
- return ANIM_builtin_keyingset_get_named(NULL, tranformKSName);
+ return ANIM_builtin_keyingset_get_named(NULL, transformKSName);
}
/* Menu of All Keying Sets ----------------------------- */
@@ -924,7 +924,8 @@ short ANIM_validate_keyingset(bContext *C, ListBase *dsources, KeyingSet *ks)
/* Determine which keying flags apply based on the override flags */
static short keyingset_apply_keying_flags(const short base_flags, const short overrides, const short own_flags)
{
- short result = 0;
+ /* Pass through all flags by default (i.e. even not explicitly listed ones). */
+ short result = base_flags;
/* The logic for whether a keying flag applies is as follows:
* - If the flag in question is set in "overrides", that means that the
@@ -934,10 +935,8 @@ static short keyingset_apply_keying_flags(const short base_flags, const short ov
*/
#define APPLY_KEYINGFLAG_OVERRIDE(kflag) \
if (overrides & kflag) { \
+ result &= ~kflag; \
result |= (own_flags & kflag); \
- } \
- else { \
- result |= (base_flags & kflag); \
}
/* Apply the flags one by one...
@@ -1042,7 +1041,7 @@ int ANIM_apply_keyingset(bContext *C, ListBase *dsources, bAction *act, KeyingSe
if (mode == MODIFYKEY_MODE_INSERT)
success += insert_keyframe(bmain, depsgraph, reports, ksp->id, act, groupname, ksp->rna_path, i, cfra, keytype, kflag2);
else if (mode == MODIFYKEY_MODE_DELETE)
- success += delete_keyframe(reports, ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag2);
+ success += delete_keyframe(bmain, reports, ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag2);
}
/* set recalc-flags */
diff --git a/source/blender/editors/armature/armature_add.c b/source/blender/editors/armature/armature_add.c
index c1fb1dcf82f..5ed3fb67ec2 100644
--- a/source/blender/editors/armature/armature_add.c
+++ b/source/blender/editors/armature/armature_add.c
@@ -46,6 +46,7 @@
#include "BKE_context.h"
#include "BKE_idprop.h"
#include "BKE_deform.h"
+#include "BKE_layer.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -120,6 +121,14 @@ EditBone *ED_armature_ebone_add_primitive(Object *obedit_arm, float length, bool
/* 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,
+ * it makes sense to stick to the active object here.
+ *
+ * If we want the support to be expanded we should something like the
+ * offset we do for mesh click extrude.
+ */
static int armature_click_extrude_exec(bContext *C, wmOperator *UNUSED(op))
{
View3D *v3d;
@@ -473,118 +482,129 @@ EditBone *duplicateEditBone(EditBone *curBone, const char *name, ListBase *editb
static int armature_duplicate_selected_exec(bContext *C, wmOperator *op)
{
- bArmature *arm;
- EditBone *ebone_iter;
- EditBone *ebone_first_dupe = NULL; /* The beginning of the duplicated bones in the edbo list */
-
- Object *obedit = CTX_data_edit_object(C);
- arm = obedit->data;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ const bool do_flip_names = RNA_boolean_get(op->ptr, "do_flip_names");
/* cancel if nothing selected */
if (CTX_DATA_COUNT(C, selected_bones) == 0)
return OPERATOR_CANCELLED;
- const bool do_flip_names = RNA_boolean_get(op->ptr, "do_flip_names");
-
- ED_armature_edit_sync_selection(arm->edbo); // XXX why is this needed?
-
- preEditBoneDuplicate(arm->edbo);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ EditBone *ebone_iter;
+ EditBone *ebone_first_dupe = NULL; /* The beginning of the duplicated bones in the edbo list */
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
+
+ ED_armature_edit_sync_selection(arm->edbo); // XXX why is this needed?
+
+ preEditBoneDuplicate(arm->edbo);
+
+ /* Select mirrored bones */
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
+ if (EBONE_VISIBLE(arm, ebone_iter) &&
+ (ebone_iter->flag & BONE_SELECTED))
+ {
+ EditBone *ebone;
+
+ ebone = ED_armature_ebone_get_mirrored(arm->edbo, ebone_iter);
+ if (ebone) {
+ ebone->flag |= BONE_SELECTED;
+ }
+ }
+ }
+ }
- /* Select mirrored bones */
- if (arm->flag & ARM_MIRROR_EDIT) {
- for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
+ /* Find the selected bones and duplicate them as needed */
+ for (ebone_iter = arm->edbo->first; ebone_iter && ebone_iter != ebone_first_dupe; ebone_iter = ebone_iter->next) {
if (EBONE_VISIBLE(arm, ebone_iter) &&
(ebone_iter->flag & BONE_SELECTED))
{
EditBone *ebone;
+ char new_bone_name_buff[MAXBONENAME];
+ char *new_bone_name = ebone_iter->name;
- ebone = ED_armature_ebone_get_mirrored(arm->edbo, ebone_iter);
- if (ebone) {
- ebone->flag |= BONE_SELECTED;
- }
- }
- }
- }
+ if (do_flip_names) {
+ BLI_string_flip_side_name(new_bone_name_buff, ebone_iter->name, false, sizeof(new_bone_name_buff));
+ /* Only use flipped name if not yet in use. Otherwise we'd get again inconsistent namings
+ * (different numbers), better keep default behavior in this case. */
+ if (ED_armature_ebone_find_name(arm->edbo, new_bone_name_buff) == NULL) {
+ new_bone_name = new_bone_name_buff;
+ }
+ }
- /* Find the selected bones and duplicate them as needed */
- for (ebone_iter = arm->edbo->first; ebone_iter && ebone_iter != ebone_first_dupe; ebone_iter = ebone_iter->next) {
- if (EBONE_VISIBLE(arm, ebone_iter) &&
- (ebone_iter->flag & BONE_SELECTED))
- {
- EditBone *ebone;
- char new_bone_name_buff[MAXBONENAME];
- char *new_bone_name = ebone_iter->name;
-
- if (do_flip_names) {
- BLI_string_flip_side_name(new_bone_name_buff, ebone_iter->name, false, sizeof(new_bone_name_buff));
+ ebone = duplicateEditBone(ebone_iter, new_bone_name, arm->edbo, ob);
- /* Only use flipped name if not yet in use. Otherwise we'd get again inconsistent namings
- * (different numbers), better keep default behavior in this case. */
- if (ED_armature_ebone_find_name(arm->edbo, new_bone_name_buff) == NULL) {
- new_bone_name = new_bone_name_buff;
+ if (!ebone_first_dupe) {
+ ebone_first_dupe = ebone;
}
}
+ }
- ebone = duplicateEditBone(ebone_iter, new_bone_name, arm->edbo, obedit);
+ /* Run though the list and fix the pointers */
+ for (ebone_iter = arm->edbo->first; ebone_iter && ebone_iter != ebone_first_dupe; ebone_iter = ebone_iter->next) {
+ if (EBONE_VISIBLE(arm, ebone_iter) &&
+ (ebone_iter->flag & BONE_SELECTED))
+ {
+ EditBone *ebone = ebone_iter->temp.ebone;
- if (!ebone_first_dupe) {
- ebone_first_dupe = ebone;
- }
- }
- }
+ if (!ebone_iter->parent) {
+ /* If this bone has no parent,
+ * Set the duplicate->parent to NULL
+ */
+ ebone->parent = NULL;
+ }
+ else if (ebone_iter->parent->temp.ebone) {
+ /* If this bone has a parent that was duplicated,
+ * Set the duplicate->parent to the curBone->parent->temp
+ */
+ ebone->parent = ebone_iter->parent->temp.ebone;
+ }
+ else {
+ /* If this bone has a parent that IS not selected,
+ * Set the duplicate->parent to the curBone->parent
+ */
+ ebone->parent = (EditBone *) ebone_iter->parent;
+ ebone->flag &= ~BONE_CONNECTED;
+ }
- /* Run though the list and fix the pointers */
- for (ebone_iter = arm->edbo->first; ebone_iter && ebone_iter != ebone_first_dupe; ebone_iter = ebone_iter->next) {
- if (EBONE_VISIBLE(arm, ebone_iter) &&
- (ebone_iter->flag & BONE_SELECTED))
- {
- EditBone *ebone = ebone_iter->temp.ebone;
+ /* Update custom handle links. */
+ if (ebone_iter->bbone_prev && ebone_iter->bbone_prev->temp.ebone) {
+ ebone_iter->bbone_prev = ebone_iter->bbone_prev->temp.ebone;
+ }
+ if (ebone_iter->bbone_next && ebone_iter->bbone_next->temp.ebone) {
+ ebone_iter->bbone_next = ebone_iter->bbone_next->temp.ebone;
+ }
- if (!ebone_iter->parent) {
- /* If this bone has no parent,
- * Set the duplicate->parent to NULL
- */
- ebone->parent = NULL;
- }
- else if (ebone_iter->parent->temp.ebone) {
- /* If this bone has a parent that was duplicated,
- * Set the duplicate->parent to the curBone->parent->temp
- */
- ebone->parent = ebone_iter->parent->temp.ebone;
- }
- else {
- /* If this bone has a parent that IS not selected,
- * Set the duplicate->parent to the curBone->parent
+ /* Lets try to fix any constraint subtargets that might
+ * have been duplicated
*/
- ebone->parent = (EditBone *) ebone_iter->parent;
- ebone->flag &= ~BONE_CONNECTED;
+ updateDuplicateSubtarget(ebone, arm->edbo, ob);
}
-
- /* Lets try to fix any constraint subtargets that might
- * have been duplicated
- */
- updateDuplicateSubtarget(ebone, arm->edbo, obedit);
}
- }
- /* correct the active bone */
- if (arm->act_edbone && arm->act_edbone->temp.ebone) {
- arm->act_edbone = arm->act_edbone->temp.ebone;
- }
+ /* correct the active bone */
+ if (arm->act_edbone && arm->act_edbone->temp.ebone) {
+ arm->act_edbone = arm->act_edbone->temp.ebone;
+ }
- /* Deselect the old bones and select the new ones */
- for (ebone_iter = arm->edbo->first; ebone_iter && ebone_iter != ebone_first_dupe; ebone_iter = ebone_iter->next) {
- if (EBONE_VISIBLE(arm, ebone_iter)) {
- ebone_iter->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ /* Deselect the old bones and select the new ones */
+ for (ebone_iter = arm->edbo->first; ebone_iter && ebone_iter != ebone_first_dupe; ebone_iter = ebone_iter->next) {
+ if (EBONE_VISIBLE(arm, ebone_iter)) {
+ ebone_iter->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ }
}
- }
- postEditBoneDuplicate(arm->edbo, obedit);
+ postEditBoneDuplicate(arm->edbo, ob);
- ED_armature_edit_validate_active(arm);
+ ED_armature_edit_validate_active(arm);
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -615,179 +635,200 @@ void ARMATURE_OT_duplicate(wmOperatorType *ot)
*/
static int armature_symmetrize_exec(bContext *C, wmOperator *op)
{
- bArmature *arm;
- EditBone *ebone_iter;
- EditBone *ebone_first_dupe = NULL; /* The beginning of the duplicated mirrored bones in the edbo list */
-
- Object *obedit = CTX_data_edit_object(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
const int direction = RNA_enum_get(op->ptr, "direction");
const int axis = 0;
- arm = obedit->data;
-
/* cancel if nothing selected */
- if (CTX_DATA_COUNT(C, selected_bones) == 0)
+ if (CTX_DATA_COUNT(C, selected_bones) == 0) {
return OPERATOR_CANCELLED;
+ }
- ED_armature_edit_sync_selection(arm->edbo); // XXX why is this needed?
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ bArmature *arm = obedit->data;
- preEditBoneDuplicate(arm->edbo);
+ EditBone *ebone_iter;
+ EditBone *ebone_first_dupe = NULL; /* The beginning of the duplicated mirrored bones in the edbo list */
- /* Select mirrored bones */
- for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
- if (EBONE_VISIBLE(arm, ebone_iter) &&
- (ebone_iter->flag & BONE_SELECTED))
- {
- char name_flip[MAXBONENAME];
+ ED_armature_edit_sync_selection(arm->edbo); // XXX why is this needed?
- BLI_string_flip_side_name(name_flip, ebone_iter->name, false, sizeof(name_flip));
+ preEditBoneDuplicate(arm->edbo);
- if (STREQ(name_flip, ebone_iter->name)) {
- /* if the name matches, we don't have the potential to be mirrored, just skip */
- ebone_iter->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- }
- else {
- EditBone *ebone = ED_armature_ebone_find_name(arm->edbo, name_flip);
+ /* Select mirrored bones */
+ for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
+ if (EBONE_VISIBLE(arm, ebone_iter) &&
+ (ebone_iter->flag & BONE_SELECTED))
+ {
+ char name_flip[MAXBONENAME];
- if (ebone) {
- if ((ebone->flag & BONE_SELECTED) == 0) {
- /* simple case, we're selected, the other bone isn't! */
- ebone_iter->temp.ebone = ebone;
- }
- else {
- /* complicated - choose which direction to copy */
- float axis_delta;
+ BLI_string_flip_side_name(name_flip, ebone_iter->name, false, sizeof(name_flip));
- axis_delta = ebone->head[axis] - ebone_iter->head[axis];
- if (axis_delta == 0.0f) {
- axis_delta = ebone->tail[axis] - ebone_iter->tail[axis];
- }
+ if (STREQ(name_flip, ebone_iter->name)) {
+ /* if the name matches, we don't have the potential to be mirrored, just skip */
+ ebone_iter->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ }
+ else {
+ EditBone *ebone = ED_armature_ebone_find_name(arm->edbo, name_flip);
- if (axis_delta == 0.0f) {
- /* both mirrored bones exist and point to eachother and overlap exactly.
- *
- * in this case theres no well defined solution, so de-select both and skip.
- */
- ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- ebone_iter->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ if (ebone) {
+ if ((ebone->flag & BONE_SELECTED) == 0) {
+ /* simple case, we're selected, the other bone isn't! */
+ ebone_iter->temp.ebone = ebone;
}
else {
- EditBone *ebone_src, *ebone_dst;
- if (((axis_delta < 0.0f) ? -1 : 1) == direction) {
- ebone_src = ebone;
- ebone_dst = ebone_iter;
+ /* complicated - choose which direction to copy */
+ float axis_delta;
+
+ axis_delta = ebone->head[axis] - ebone_iter->head[axis];
+ if (axis_delta == 0.0f) {
+ axis_delta = ebone->tail[axis] - ebone_iter->tail[axis];
}
- else {
- ebone_src = ebone_iter;
- ebone_dst = ebone;
+
+ if (axis_delta == 0.0f) {
+ /* both mirrored bones exist and point to eachother and overlap exactly.
+ *
+ * in this case there's no well defined solution, so de-select both and skip.
+ */
+ ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ ebone_iter->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
}
+ else {
+ EditBone *ebone_src, *ebone_dst;
+ if (((axis_delta < 0.0f) ? -1 : 1) == direction) {
+ ebone_src = ebone;
+ ebone_dst = ebone_iter;
+ }
+ else {
+ ebone_src = ebone_iter;
+ ebone_dst = ebone;
+ }
- ebone_src->temp.ebone = ebone_dst;
- ebone_dst->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ ebone_src->temp.ebone = ebone_dst;
+ ebone_dst->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ }
}
}
}
}
}
- }
- /* Find the selected bones and duplicate them as needed, with mirrored name */
- for (ebone_iter = arm->edbo->first; ebone_iter && ebone_iter != ebone_first_dupe; ebone_iter = ebone_iter->next) {
- if (EBONE_VISIBLE(arm, ebone_iter) &&
- (ebone_iter->flag & BONE_SELECTED) &&
- /* will be set if the mirror bone already exists (no need to make a new one) */
- (ebone_iter->temp.ebone == NULL))
- {
- char name_flip[MAXBONENAME];
+ /* Find the selected bones and duplicate them as needed, with mirrored name */
+ for (ebone_iter = arm->edbo->first; ebone_iter && ebone_iter != ebone_first_dupe; ebone_iter = ebone_iter->next) {
+ if (EBONE_VISIBLE(arm, ebone_iter) &&
+ (ebone_iter->flag & BONE_SELECTED) &&
+ /* will be set if the mirror bone already exists (no need to make a new one) */
+ (ebone_iter->temp.ebone == NULL))
+ {
+ char name_flip[MAXBONENAME];
- BLI_string_flip_side_name(name_flip, ebone_iter->name, false, sizeof(name_flip));
+ BLI_string_flip_side_name(name_flip, ebone_iter->name, false, sizeof(name_flip));
- /* bones must have a side-suffix */
- if (!STREQ(name_flip, ebone_iter->name)) {
- EditBone *ebone;
+ /* bones must have a side-suffix */
+ if (!STREQ(name_flip, ebone_iter->name)) {
+ EditBone *ebone;
- ebone = duplicateEditBone(ebone_iter, name_flip, arm->edbo, obedit);
+ ebone = duplicateEditBone(ebone_iter, name_flip, arm->edbo, obedit);
- if (!ebone_first_dupe) {
- ebone_first_dupe = ebone;
+ if (!ebone_first_dupe) {
+ ebone_first_dupe = ebone;
+ }
}
}
}
- }
- /* Run through the list and fix the pointers */
- for (ebone_iter = arm->edbo->first; ebone_iter && ebone_iter != ebone_first_dupe; ebone_iter = ebone_iter->next) {
- if (ebone_iter->temp.ebone) {
- /* copy all flags except for ... */
- const int flag_copy = ((int)~0) & ~(BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL);
+ /* Run through the list and fix the pointers */
+ for (ebone_iter = arm->edbo->first; ebone_iter && ebone_iter != ebone_first_dupe; ebone_iter = ebone_iter->next) {
+ if (ebone_iter->temp.ebone) {
+ /* copy all flags except for ... */
+ const int flag_copy = ((int)~0) & ~(BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL);
- EditBone *ebone = ebone_iter->temp.ebone;
+ EditBone *ebone = ebone_iter->temp.ebone;
- /* copy flags incase bone is pre-existing data */
- ebone->flag = (ebone->flag & ~flag_copy) | (ebone_iter->flag & flag_copy);
+ /* copy flags incase bone is pre-existing data */
+ ebone->flag = (ebone->flag & ~flag_copy) | (ebone_iter->flag & flag_copy);
- if (ebone_iter->parent == NULL) {
- /* If this bone has no parent,
- * Set the duplicate->parent to NULL
- */
- ebone->parent = NULL;
- ebone->flag &= ~BONE_CONNECTED;
- }
- else {
- /* the parent may have been duplicated, if not lookup the mirror parent */
- EditBone *ebone_parent =
- (ebone_iter->parent->temp.ebone ?
- ebone_iter->parent->temp.ebone : ED_armature_ebone_get_mirrored(arm->edbo, ebone_iter->parent));
-
- if (ebone_parent == NULL) {
- /* If the mirror lookup failed, (but the current bone has a parent)
- * then we can assume the parent has no L/R but is a center bone.
- * So just use the same parent for both.
+ if (ebone_iter->parent == NULL) {
+ /* If this bone has no parent,
+ * Set the duplicate->parent to NULL
*/
- ebone_parent = ebone_iter->parent;
+ ebone->parent = NULL;
ebone->flag &= ~BONE_CONNECTED;
}
+ else {
+ /* the parent may have been duplicated, if not lookup the mirror parent */
+ EditBone *ebone_parent = (
+ ebone_iter->parent->temp.ebone ?
+ ebone_iter->parent->temp.ebone :
+ ED_armature_ebone_get_mirrored(arm->edbo, ebone_iter->parent));
+
+ if (ebone_parent == NULL) {
+ /* If the mirror lookup failed, (but the current bone has a parent)
+ * then we can assume the parent has no L/R but is a center bone.
+ * So just use the same parent for both.
+ */
+ ebone_parent = ebone_iter->parent;
+ ebone->flag &= ~BONE_CONNECTED;
+ }
- ebone->parent = ebone_parent;
- }
+ ebone->parent = ebone_parent;
+ }
- /* Lets try to fix any constraint subtargets that might
- * have been duplicated
- */
- updateDuplicateSubtarget(ebone, arm->edbo, obedit);
+ /* Update custom handle links. */
+ if (ebone_iter->bbone_prev && ebone_iter->bbone_prev->temp.ebone) {
+ ebone_iter->bbone_prev = ebone_iter->bbone_prev->temp.ebone;
+ }
+ if (ebone_iter->bbone_next && ebone_iter->bbone_next->temp.ebone) {
+ ebone_iter->bbone_next = ebone_iter->bbone_next->temp.ebone;
+ }
+
+ /* Lets try to fix any constraint subtargets that might
+ * have been duplicated
+ */
+ updateDuplicateSubtarget(ebone, arm->edbo, obedit);
+ }
}
- }
- ED_armature_edit_transform_mirror_update(obedit);
+ ED_armature_edit_transform_mirror_update(obedit);
- /* Selected bones now have their 'temp' pointer set,
- * so we don't need this anymore */
+ /* Selected bones now have their 'temp' pointer set,
+ * so we don't need this anymore */
- /* Deselect the old bones and select the new ones */
- for (ebone_iter = arm->edbo->first; ebone_iter && ebone_iter != ebone_first_dupe; ebone_iter = ebone_iter->next) {
- if (EBONE_VISIBLE(arm, ebone_iter)) {
- ebone_iter->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ /* Deselect the old bones and select the new ones */
+ for (ebone_iter = arm->edbo->first;
+ ebone_iter && ebone_iter != ebone_first_dupe;
+ ebone_iter = ebone_iter->next)
+ {
+ if (EBONE_VISIBLE(arm, ebone_iter)) {
+ ebone_iter->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ }
}
- }
- /* New bones will be selected, but some of the bones may already exist */
- for (ebone_iter = arm->edbo->first; ebone_iter && ebone_iter != ebone_first_dupe; ebone_iter = ebone_iter->next) {
- EditBone *ebone = ebone_iter->temp.ebone;
- if (ebone && EBONE_SELECTABLE(arm, ebone)) {
- ED_armature_ebone_select_set(ebone, true);
+ /* New bones will be selected, but some of the bones may already exist */
+ for (ebone_iter = arm->edbo->first;
+ ebone_iter && ebone_iter != ebone_first_dupe;
+ ebone_iter = ebone_iter->next)
+ {
+ EditBone *ebone = ebone_iter->temp.ebone;
+ if (ebone && EBONE_SELECTABLE(arm, ebone)) {
+ ED_armature_ebone_select_set(ebone, true);
+ }
}
- }
- /* correct the active bone */
- if (arm->act_edbone && arm->act_edbone->temp.ebone) {
- arm->act_edbone = arm->act_edbone->temp.ebone;
- }
+ /* correct the active bone */
+ if (arm->act_edbone && arm->act_edbone->temp.ebone) {
+ arm->act_edbone = arm->act_edbone->temp.ebone;
+ }
- postEditBoneDuplicate(arm->edbo, obedit);
+ postEditBoneDuplicate(arm->edbo, obedit);
- ED_armature_edit_validate_active(arm);
+ ED_armature_edit_validate_active(arm);
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -826,158 +867,168 @@ void ARMATURE_OT_symmetrize(wmOperatorType *ot)
/* if forked && mirror-edit: makes two bones with flipped names */
static int armature_extrude_exec(bContext *C, wmOperator *op)
{
- Object *obedit;
- bArmature *arm;
- EditBone *newbone = NULL, *ebone, *flipbone, *first = NULL;
- int a, totbone = 0, do_extrude;
- bool forked = RNA_boolean_get(op->ptr, "forked");
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ const bool forked = RNA_boolean_get(op->ptr, "forked");
+ bool changed_multi = false;
- obedit = CTX_data_edit_object(C);
- arm = obedit->data;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
+ bool forked_iter = forked;
- /* since we allow root extrude too, we have to make sure selection is OK */
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (EBONE_VISIBLE(arm, ebone)) {
- if (ebone->flag & BONE_ROOTSEL) {
- if (ebone->parent && (ebone->flag & BONE_CONNECTED)) {
- if (ebone->parent->flag & BONE_TIPSEL)
- ebone->flag &= ~BONE_ROOTSEL;
+ EditBone *newbone = NULL, *ebone, *flipbone, *first = NULL;
+ int a, totbone = 0, do_extrude;
+
+ /* since we allow root extrude too, we have to make sure selection is OK */
+ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (EBONE_VISIBLE(arm, ebone)) {
+ if (ebone->flag & BONE_ROOTSEL) {
+ if (ebone->parent && (ebone->flag & BONE_CONNECTED)) {
+ if (ebone->parent->flag & BONE_TIPSEL)
+ ebone->flag &= ~BONE_ROOTSEL;
+ }
}
}
}
- }
- /* Duplicate the necessary bones */
- for (ebone = arm->edbo->first; ((ebone) && (ebone != first)); ebone = ebone->next) {
- if (EBONE_VISIBLE(arm, ebone)) {
- /* we extrude per definition the tip */
- do_extrude = false;
- if (ebone->flag & (BONE_TIPSEL | BONE_SELECTED)) {
- do_extrude = true;
- }
- else if (ebone->flag & BONE_ROOTSEL) {
- /* but, a bone with parent deselected we do the root... */
- if (ebone->parent && (ebone->parent->flag & BONE_TIPSEL)) {
- /* pass */
- }
- else {
- do_extrude = 2;
+ /* Duplicate the necessary bones */
+ for (ebone = arm->edbo->first; ((ebone) && (ebone != first)); ebone = ebone->next) {
+ if (EBONE_VISIBLE(arm, ebone)) {
+ /* we extrude per definition the tip */
+ do_extrude = false;
+ if (ebone->flag & (BONE_TIPSEL | BONE_SELECTED)) {
+ do_extrude = true;
}
- }
-
- if (do_extrude) {
- /* we re-use code for mirror editing... */
- flipbone = NULL;
- if (arm->flag & ARM_MIRROR_EDIT) {
- flipbone = ED_armature_ebone_get_mirrored(arm->edbo, ebone);
- if (flipbone) {
- forked = 0; // we extrude 2 different bones
- if (flipbone->flag & (BONE_TIPSEL | BONE_ROOTSEL | BONE_SELECTED))
- /* don't want this bone to be selected... */
- flipbone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
+ else if (ebone->flag & BONE_ROOTSEL) {
+ /* but, a bone with parent deselected we do the root... */
+ if (ebone->parent && (ebone->parent->flag & BONE_TIPSEL)) {
+ /* pass */
+ }
+ else {
+ do_extrude = 2;
}
- if ((flipbone == NULL) && (forked))
- flipbone = ebone;
}
- for (a = 0; a < 2; a++) {
- if (a == 1) {
- if (flipbone == NULL)
- break;
- else {
- SWAP(EditBone *, flipbone, ebone);
+ if (do_extrude) {
+ /* we re-use code for mirror editing... */
+ flipbone = NULL;
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ flipbone = ED_armature_ebone_get_mirrored(arm->edbo, ebone);
+ if (flipbone) {
+ forked_iter = 0; // we extrude 2 different bones
+ if (flipbone->flag & (BONE_TIPSEL | BONE_ROOTSEL | BONE_SELECTED))
+ /* don't want this bone to be selected... */
+ flipbone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
}
+ if ((flipbone == NULL) && (forked_iter))
+ flipbone = ebone;
}
- totbone++;
- newbone = MEM_callocN(sizeof(EditBone), "extrudebone");
+ for (a = 0; a < 2; a++) {
+ if (a == 1) {
+ if (flipbone == NULL)
+ break;
+ else {
+ SWAP(EditBone *, flipbone, ebone);
+ }
+ }
- if (do_extrude == true) {
- copy_v3_v3(newbone->head, ebone->tail);
- copy_v3_v3(newbone->tail, newbone->head);
- newbone->parent = ebone;
+ totbone++;
+ newbone = MEM_callocN(sizeof(EditBone), "extrudebone");
- newbone->flag = ebone->flag & (BONE_TIPSEL | BONE_RELATIVE_PARENTING); // copies it, in case mirrored bone
+ if (do_extrude == true) {
+ copy_v3_v3(newbone->head, ebone->tail);
+ copy_v3_v3(newbone->tail, newbone->head);
+ newbone->parent = ebone;
- if (newbone->parent) newbone->flag |= BONE_CONNECTED;
- }
- else {
- copy_v3_v3(newbone->head, ebone->head);
- copy_v3_v3(newbone->tail, ebone->head);
- newbone->parent = ebone->parent;
+ /* copies it, in case mirrored bone */
+ newbone->flag = ebone->flag & (BONE_TIPSEL | BONE_RELATIVE_PARENTING);
+
+ if (newbone->parent) newbone->flag |= BONE_CONNECTED;
+ }
+ else {
+ copy_v3_v3(newbone->head, ebone->head);
+ copy_v3_v3(newbone->tail, ebone->head);
+ newbone->parent = ebone->parent;
- newbone->flag = BONE_TIPSEL;
+ newbone->flag = BONE_TIPSEL;
- if (newbone->parent && (ebone->flag & BONE_CONNECTED)) {
- newbone->flag |= BONE_CONNECTED;
+ if (newbone->parent && (ebone->flag & BONE_CONNECTED)) {
+ newbone->flag |= BONE_CONNECTED;
+ }
}
- }
- newbone->weight = ebone->weight;
- newbone->dist = ebone->dist;
- newbone->xwidth = ebone->xwidth;
- newbone->zwidth = ebone->zwidth;
- newbone->rad_head = ebone->rad_tail; // don't copy entire bone...
- newbone->rad_tail = ebone->rad_tail;
- newbone->segments = 1;
- newbone->layer = ebone->layer;
-
- /* Bendy-Bone parameters */
- newbone->roll1 = ebone->roll1;
- newbone->roll2 = ebone->roll2;
- newbone->curveInX = ebone->curveInX;
- newbone->curveInY = ebone->curveInY;
- newbone->curveOutX = ebone->curveOutX;
- newbone->curveOutY = ebone->curveOutY;
- newbone->ease1 = ebone->ease1;
- newbone->ease2 = ebone->ease2;
- newbone->scaleIn = ebone->scaleIn;
- newbone->scaleOut = ebone->scaleOut;
-
-
- BLI_strncpy(newbone->name, ebone->name, sizeof(newbone->name));
-
- if (flipbone && forked) { // only set if mirror edit
- if (strlen(newbone->name) < (MAXBONENAME - 2)) {
- if (a == 0) strcat(newbone->name, "_L");
- else strcat(newbone->name, "_R");
+ newbone->weight = ebone->weight;
+ newbone->dist = ebone->dist;
+ newbone->xwidth = ebone->xwidth;
+ newbone->zwidth = ebone->zwidth;
+ newbone->rad_head = ebone->rad_tail; // don't copy entire bone...
+ newbone->rad_tail = ebone->rad_tail;
+ newbone->segments = 1;
+ newbone->layer = ebone->layer;
+
+ /* Bendy-Bone parameters */
+ newbone->roll1 = ebone->roll1;
+ newbone->roll2 = ebone->roll2;
+ newbone->curveInX = ebone->curveInX;
+ newbone->curveInY = ebone->curveInY;
+ newbone->curveOutX = ebone->curveOutX;
+ newbone->curveOutY = ebone->curveOutY;
+ newbone->ease1 = ebone->ease1;
+ newbone->ease2 = ebone->ease2;
+ newbone->scaleIn = ebone->scaleIn;
+ newbone->scaleOut = ebone->scaleOut;
+
+
+ BLI_strncpy(newbone->name, ebone->name, sizeof(newbone->name));
+
+ if (flipbone && forked_iter) { // only set if mirror edit
+ if (strlen(newbone->name) < (MAXBONENAME - 2)) {
+ if (a == 0) strcat(newbone->name, "_L");
+ else strcat(newbone->name, "_R");
+ }
}
- }
- ED_armature_ebone_unique_name(arm->edbo, newbone->name, NULL);
+ ED_armature_ebone_unique_name(arm->edbo, newbone->name, NULL);
- /* Add the new bone to the list */
- BLI_addtail(arm->edbo, newbone);
- if (!first)
- first = newbone;
+ /* Add the new bone to the list */
+ BLI_addtail(arm->edbo, newbone);
+ if (!first)
+ first = newbone;
- /* restore ebone if we were flipping */
- if (a == 1 && flipbone)
- SWAP(EditBone *, flipbone, ebone);
+ /* restore ebone if we were flipping */
+ if (a == 1 && flipbone)
+ SWAP(EditBone *, flipbone, ebone);
+ }
}
+
+ /* Deselect the old bone */
+ ebone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
}
+ }
+ /* if only one bone, make this one active */
+ if (totbone == 1 && first) {
+ arm->act_edbone = first;
+ }
+ else {
+ arm->act_edbone = newbone;
+ }
- /* Deselect the old bone */
- ebone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
+ if (totbone == 0) {
+ continue;
}
- }
- /* if only one bone, make this one active */
- if (totbone == 1 && first) {
- arm->act_edbone = first;
- }
- else {
- arm->act_edbone = newbone;
- }
- if (totbone == 0) {
- return OPERATOR_CANCELLED;
- }
+ changed_multi = true;
- /* Transform the endpoints */
- ED_armature_edit_sync_selection(arm->edbo);
+ /* Transform the endpoints */
+ ED_armature_edit_sync_selection(arm->edbo);
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ }
+ MEM_freeN(objects);
- return OPERATOR_FINISHED;
+ return changed_multi ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
void ARMATURE_OT_extrude(wmOperatorType *ot)
diff --git a/source/blender/editors/armature/armature_edit.c b/source/blender/editors/armature/armature_edit.c
index ccc1eefd9dc..d3aa451fa6e 100644
--- a/source/blender/editors/armature/armature_edit.c
+++ b/source/blender/editors/armature/armature_edit.c
@@ -243,7 +243,7 @@ float ED_armature_ebone_roll_to_vector(const EditBone *bone, const float align_a
return roll;
}
-/* note, ranges arithmatic is used below */
+/* note, ranges arithmetic is used below */
typedef enum eCalcRollTypes {
/* pos */
CALC_ROLL_POS_X = 0,
@@ -295,153 +295,172 @@ static const EnumPropertyItem prop_calc_roll_types[] = {
static int armature_calc_roll_exec(bContext *C, wmOperator *op)
{
- Object *ob = CTX_data_edit_object(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ Object *ob_active = CTX_data_edit_object(C);
+ int ret = OPERATOR_FINISHED;
+
eCalcRollTypes type = RNA_enum_get(op->ptr, "type");
const bool axis_only = RNA_boolean_get(op->ptr, "axis_only");
/* axis_flip when matching the active bone never makes sense */
bool axis_flip = ((type >= CALC_ROLL_ACTIVE) ? RNA_boolean_get(op->ptr, "axis_flip") :
(type >= CALC_ROLL_TAN_NEG_X) ? true : false);
- float imat[3][3];
-
- bArmature *arm = ob->data;
- EditBone *ebone;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
+ bool changed = false;
- if ((type >= CALC_ROLL_NEG_X) && (type <= CALC_ROLL_TAN_NEG_Z)) {
- type -= (CALC_ROLL_ACTIVE - CALC_ROLL_NEG_X);
- axis_flip = true;
- }
+ float imat[3][3];
+ EditBone *ebone;
- copy_m3_m4(imat, ob->obmat);
- invert_m3(imat);
+ if ((type >= CALC_ROLL_NEG_X) && (type <= CALC_ROLL_TAN_NEG_Z)) {
+ type -= (CALC_ROLL_ACTIVE - CALC_ROLL_NEG_X);
+ axis_flip = true;
+ }
- if (type == CALC_ROLL_CURSOR) { /* Cursor */
- Scene *scene = CTX_data_scene(C);
- View3D *v3d = CTX_wm_view3d(C); /* can be NULL */
- float cursor_local[3];
- const View3DCursor *cursor = ED_view3d_cursor3d_get(scene, v3d);
+ copy_m3_m4(imat, ob->obmat);
+ invert_m3(imat);
- invert_m4_m4(ob->imat, ob->obmat);
- copy_v3_v3(cursor_local, cursor->location);
- mul_m4_v3(ob->imat, cursor_local);
+ if (type == CALC_ROLL_CURSOR) { /* Cursor */
+ Scene *scene = CTX_data_scene(C);
+ View3D *v3d = CTX_wm_view3d(C); /* can be NULL */
+ float cursor_local[3];
+ const View3DCursor *cursor = ED_view3d_cursor3d_get(scene, v3d);
+ invert_m4_m4(ob->imat, ob->obmat);
+ copy_v3_v3(cursor_local, cursor->location);
+ mul_m4_v3(ob->imat, cursor_local);
- /* cursor */
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) {
- float cursor_rel[3];
- sub_v3_v3v3(cursor_rel, cursor_local, ebone->head);
- if (axis_flip) negate_v3(cursor_rel);
- if (normalize_v3(cursor_rel) != 0.0f) {
- ebone->roll = ED_armature_ebone_roll_to_vector(ebone, cursor_rel, axis_only);
+ /* cursor */
+ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) {
+ float cursor_rel[3];
+ sub_v3_v3v3(cursor_rel, cursor_local, ebone->head);
+ if (axis_flip) negate_v3(cursor_rel);
+ if (normalize_v3(cursor_rel) != 0.0f) {
+ ebone->roll = ED_armature_ebone_roll_to_vector(ebone, cursor_rel, axis_only);
+ changed = true;
+ }
}
}
}
- }
- else if (ELEM(type, CALC_ROLL_TAN_POS_X, CALC_ROLL_TAN_POS_Z)) {
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (ebone->parent) {
- bool is_edit = (EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone));
- bool is_edit_parent = (EBONE_VISIBLE(arm, ebone->parent) && EBONE_EDITABLE(ebone->parent));
-
- if (is_edit || is_edit_parent) {
- EditBone *ebone_other = ebone->parent;
- float dir_a[3];
- float dir_b[3];
- float vec[3];
- bool is_vec_zero;
-
- sub_v3_v3v3(dir_a, ebone->tail, ebone->head);
- normalize_v3(dir_a);
-
- /* find the first bone in the chane with a different direction */
- do {
- sub_v3_v3v3(dir_b, ebone_other->head, ebone_other->tail);
- normalize_v3(dir_b);
-
- if (type == CALC_ROLL_TAN_POS_Z) {
- cross_v3_v3v3(vec, dir_a, dir_b);
- }
- else {
- add_v3_v3v3(vec, dir_a, dir_b);
- }
- } while ((is_vec_zero = (normalize_v3(vec) < 0.00001f)) &&
- (ebone_other = ebone_other->parent));
+ else if (ELEM(type, CALC_ROLL_TAN_POS_X, CALC_ROLL_TAN_POS_Z)) {
+ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (ebone->parent) {
+ bool is_edit = (EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone));
+ bool is_edit_parent = (EBONE_VISIBLE(arm, ebone->parent) && EBONE_EDITABLE(ebone->parent));
+
+ if (is_edit || is_edit_parent) {
+ EditBone *ebone_other = ebone->parent;
+ float dir_a[3];
+ float dir_b[3];
+ float vec[3];
+ bool is_vec_zero;
+
+ sub_v3_v3v3(dir_a, ebone->tail, ebone->head);
+ normalize_v3(dir_a);
+
+ /* find the first bone in the chane with a different direction */
+ do {
+ sub_v3_v3v3(dir_b, ebone_other->head, ebone_other->tail);
+ normalize_v3(dir_b);
+
+ if (type == CALC_ROLL_TAN_POS_Z) {
+ cross_v3_v3v3(vec, dir_a, dir_b);
+ }
+ else {
+ add_v3_v3v3(vec, dir_a, dir_b);
+ }
+ } while ((is_vec_zero = (normalize_v3(vec) < 0.00001f)) &&
+ (ebone_other = ebone_other->parent));
- if (!is_vec_zero) {
- if (axis_flip) negate_v3(vec);
+ if (!is_vec_zero) {
+ if (axis_flip) negate_v3(vec);
- if (is_edit) {
- ebone->roll = ED_armature_ebone_roll_to_vector(ebone, vec, axis_only);
- }
+ if (is_edit) {
+ ebone->roll = ED_armature_ebone_roll_to_vector(ebone, vec, axis_only);
+ changed = true;
+ }
- /* parentless bones use cross product with child */
- if (is_edit_parent) {
- if (ebone->parent->parent == NULL) {
- ebone->parent->roll = ED_armature_ebone_roll_to_vector(ebone->parent, vec, axis_only);
+ /* parentless bones use cross product with child */
+ if (is_edit_parent) {
+ if (ebone->parent->parent == NULL) {
+ ebone->parent->roll = ED_armature_ebone_roll_to_vector(ebone->parent, vec, axis_only);
+ changed = true;
+ }
}
}
}
}
}
}
- }
- else {
- float vec[3] = {0.0f, 0.0f, 0.0f};
- if (type == CALC_ROLL_VIEW) { /* View */
- RegionView3D *rv3d = CTX_wm_region_view3d(C);
- if (rv3d == NULL) {
- BKE_report(op->reports, RPT_ERROR, "No region view3d available");
- return OPERATOR_CANCELLED;
- }
+ else {
+ float vec[3] = {0.0f, 0.0f, 0.0f};
+ if (type == CALC_ROLL_VIEW) { /* View */
+ RegionView3D *rv3d = CTX_wm_region_view3d(C);
+ if (rv3d == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No region view3d available");
+ ret = OPERATOR_CANCELLED;
+ goto cleanup;
+ }
- copy_v3_v3(vec, rv3d->viewinv[2]);
- mul_m3_v3(imat, vec);
- }
- else if (type == CALC_ROLL_ACTIVE) {
- float mat[3][3];
- ebone = (EditBone *)arm->act_edbone;
- if (ebone == NULL) {
- BKE_report(op->reports, RPT_ERROR, "No active bone set");
- return OPERATOR_CANCELLED;
+ copy_v3_v3(vec, rv3d->viewinv[2]);
+ mul_m3_v3(imat, vec);
}
+ else if (type == CALC_ROLL_ACTIVE) {
+ float mat[3][3];
+ bArmature *arm_active = ob_active->data;
+ ebone = (EditBone *)arm_active->act_edbone;
+ if (ebone == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No active bone set");
+ ret = OPERATOR_CANCELLED;
+ goto cleanup;
+ }
- ED_armature_ebone_to_mat3(ebone, mat);
- copy_v3_v3(vec, mat[2]);
- }
- else { /* Axis */
- assert(type <= 5);
- if (type < 3) vec[type] = 1.0f;
- else vec[type - 2] = -1.0f;
- mul_m3_v3(imat, vec);
- normalize_v3(vec);
- }
+ ED_armature_ebone_to_mat3(ebone, mat);
+ copy_v3_v3(vec, mat[2]);
+ }
+ else { /* Axis */
+ assert(type <= 5);
+ if (type < 3) vec[type] = 1.0f;
+ else vec[type - 2] = -1.0f;
+ mul_m3_v3(imat, vec);
+ normalize_v3(vec);
+ }
- if (axis_flip) negate_v3(vec);
+ if (axis_flip) negate_v3(vec);
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) {
- /* roll func is a callback which assumes that all is well */
- ebone->roll = ED_armature_ebone_roll_to_vector(ebone, vec, axis_only);
+ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) {
+ /* roll func is a callback which assumes that all is well */
+ ebone->roll = ED_armature_ebone_roll_to_vector(ebone, vec, axis_only);
+ changed = true;
+ }
}
}
- }
- if (arm->flag & ARM_MIRROR_EDIT) {
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if ((EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) == 0) {
- EditBone *ebone_mirr = ED_armature_ebone_get_mirrored(arm->edbo, ebone);
- if (ebone_mirr && (EBONE_VISIBLE(arm, ebone_mirr) && EBONE_EDITABLE(ebone_mirr))) {
- ebone->roll = -ebone_mirr->roll;
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if ((EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) == 0) {
+ EditBone *ebone_mirr = ED_armature_ebone_get_mirrored(arm->edbo, ebone);
+ if (ebone_mirr && (EBONE_VISIBLE(arm, ebone_mirr) && EBONE_EDITABLE(ebone_mirr))) {
+ ebone->roll = -ebone_mirr->roll;
+ }
}
}
}
- }
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ if (changed) {
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ }
+ }
- return OPERATOR_FINISHED;
+cleanup:
+ MEM_freeN(objects);
+ return ret;
}
void ARMATURE_OT_calculate_roll(wmOperatorType *ot)
@@ -467,33 +486,42 @@ void ARMATURE_OT_calculate_roll(wmOperatorType *ot)
static int armature_roll_clear_exec(bContext *C, wmOperator *op)
{
- Object *ob = CTX_data_edit_object(C);
-
- bArmature *arm = ob->data;
- EditBone *ebone;
-
+ ViewLayer *view_layer = CTX_data_view_layer(C);
const float roll = RNA_float_get(op->ptr, "roll");
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) {
- /* roll func is a callback which assumes that all is well */
- ebone->roll = roll;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
+ bool changed = false;
+
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) {
+ /* Roll func is a callback which assumes that all is well. */
+ ebone->roll = roll;
+ changed = true;
+ }
}
- }
- if (arm->flag & ARM_MIRROR_EDIT) {
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if ((EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) == 0) {
- EditBone *ebone_mirr = ED_armature_ebone_get_mirrored(arm->edbo, ebone);
- if (ebone_mirr && (EBONE_VISIBLE(arm, ebone_mirr) && EBONE_EDITABLE(ebone_mirr))) {
- ebone->roll = -ebone_mirr->roll;
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if ((EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) == 0) {
+ EditBone *ebone_mirr = ED_armature_ebone_get_mirrored(arm->edbo, ebone);
+ if (ebone_mirr && (EBONE_VISIBLE(arm, ebone_mirr) && EBONE_EDITABLE(ebone_mirr))) {
+ ebone->roll = -ebone_mirr->roll;
+ changed = true;
+ }
}
}
}
- }
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ if (changed) {
+ /* Note, notifier might evolve. */
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ }
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -632,7 +660,6 @@ static void fill_add_joint(EditBone *ebo, short eb_tail, ListBase *points)
/* bone adding between selected joints */
static int armature_fill_bones_exec(bContext *C, wmOperator *op)
{
- Object *obedit_active = CTX_data_edit_object(C);
Scene *scene = CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
ListBase points = {NULL, NULL};
@@ -640,11 +667,6 @@ static int armature_fill_bones_exec(bContext *C, wmOperator *op)
int count;
bool mixed_object_error = false;
- /* sanity checks */
- if (ELEM(NULL, obedit_active, obedit_active->data)) {
- return OPERATOR_CANCELLED;
- }
-
/* loop over all bones, and only consider if visible */
bArmature *arm = NULL;
CTX_DATA_BEGIN_WITH_ID(C, EditBone *, ebone, visible_bones, bArmature *, arm_iter)
@@ -798,7 +820,6 @@ static int armature_fill_bones_exec(bContext *C, wmOperator *op)
}
}
else {
- /* FIXME.. figure out a method for multiple bones */
BKE_reportf(op->reports, RPT_ERROR, "Too many points selected: %d", count);
BLI_freelistN(&points);
return OPERATOR_CANCELLED;
@@ -923,78 +944,84 @@ static void bones_merge(Object *obedit, EditBone *start, EditBone *end, EditBone
static int armature_merge_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- bArmature *arm = (obedit) ? obedit->data : NULL;
- short type = RNA_enum_get(op->ptr, "type");
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ const short type = RNA_enum_get(op->ptr, "type");
- /* sanity checks */
- if (ELEM(NULL, obedit, arm))
- return OPERATOR_CANCELLED;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
- /* for now, there's only really one type of merging that's performed... */
- if (type == 1) {
- /* go down chains, merging bones */
- ListBase chains = {NULL, NULL};
- LinkData *chain, *nchain;
- EditBone *ebo;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ bArmature *arm = obedit->data;
- armature_tag_select_mirrored(arm);
+ /* for now, there's only really one type of merging that's performed... */
+ if (type == 1) {
+ /* go down chains, merging bones */
+ ListBase chains = {NULL, NULL};
+ LinkData *chain, *nchain;
+ EditBone *ebo;
- /* get chains (ends on chains) */
- chains_find_tips(arm->edbo, &chains);
- if (BLI_listbase_is_empty(&chains)) return OPERATOR_CANCELLED;
-
- /* each 'chain' is the last bone in the chain (with no children) */
- for (chain = chains.first; chain; chain = nchain) {
- EditBone *bstart = NULL, *bend = NULL;
- EditBone *bchild = NULL, *child = NULL;
-
- /* temporarily remove chain from list of chains */
- nchain = chain->next;
- BLI_remlink(&chains, chain);
-
- /* only consider bones that are visible and selected */
- for (ebo = chain->data; ebo; child = ebo, ebo = ebo->parent) {
- /* check if visible + selected */
- if (EBONE_VISIBLE(arm, ebo) &&
- ((ebo->flag & BONE_CONNECTED) || (ebo->parent == NULL)) &&
- (ebo->flag & BONE_SELECTED) )
- {
- /* set either end or start (end gets priority, unless it is already set) */
- if (bend == NULL) {
- bend = ebo;
- bchild = child;
+ armature_tag_select_mirrored(arm);
+
+ /* get chains (ends on chains) */
+ chains_find_tips(arm->edbo, &chains);
+ if (BLI_listbase_is_empty(&chains)) {
+ continue;
+ }
+
+ /* each 'chain' is the last bone in the chain (with no children) */
+ for (chain = chains.first; chain; chain = nchain) {
+ EditBone *bstart = NULL, *bend = NULL;
+ EditBone *bchild = NULL, *child = NULL;
+
+ /* temporarily remove chain from list of chains */
+ nchain = chain->next;
+ BLI_remlink(&chains, chain);
+
+ /* only consider bones that are visible and selected */
+ for (ebo = chain->data; ebo; child = ebo, ebo = ebo->parent) {
+ /* check if visible + selected */
+ if (EBONE_VISIBLE(arm, ebo) &&
+ ((ebo->flag & BONE_CONNECTED) || (ebo->parent == NULL)) &&
+ (ebo->flag & BONE_SELECTED) )
+ {
+ /* set either end or start (end gets priority, unless it is already set) */
+ if (bend == NULL) {
+ bend = ebo;
+ bchild = child;
+ }
+ else
+ bstart = ebo;
+ }
+ else {
+ /* chain is broken... merge any continuous segments then clear */
+ if (bstart && bend)
+ bones_merge(obedit, bstart, bend, bchild, &chains);
+
+ bstart = NULL;
+ bend = NULL;
+ bchild = NULL;
}
- else
- bstart = ebo;
}
- else {
- /* chain is broken... merge any continous segments then clear */
- if (bstart && bend)
- bones_merge(obedit, bstart, bend, bchild, &chains);
- bstart = NULL;
- bend = NULL;
- bchild = NULL;
- }
+ /* merge from bstart to bend if something not merged */
+ if (bstart && bend)
+ bones_merge(obedit, bstart, bend, bchild, &chains);
+
+ /* put back link */
+ BLI_insertlinkbefore(&chains, nchain, chain);
}
- /* merge from bstart to bend if something not merged */
- if (bstart && bend)
- bones_merge(obedit, bstart, bend, bchild, &chains);
+ armature_tag_unselect(arm);
- /* put back link */
- BLI_insertlinkbefore(&chains, nchain, chain);
+ BLI_freelistN(&chains);
}
- armature_tag_unselect(arm);
-
- BLI_freelistN(&chains);
+ /* updates */
+ ED_armature_edit_sync_selection(arm->edbo);
+ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, obedit);
}
-
- /* updates */
- ED_armature_edit_sync_selection(arm->edbo);
- WM_event_add_notifier(C, NC_OBJECT | ND_POSE, obedit);
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -1043,89 +1070,99 @@ static void armature_clear_swap_done_flags(bArmature *arm)
static int armature_switch_direction_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob = CTX_data_edit_object(C);
- bArmature *arm = (bArmature *)ob->data;
- ListBase chains = {NULL, NULL};
- LinkData *chain;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
- /* get chains of bones (ends on chains) */
- chains_find_tips(arm->edbo, &chains);
- if (BLI_listbase_is_empty(&chains)) return OPERATOR_CANCELLED;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
- /* ensure that mirror bones will also be operated on */
- armature_tag_select_mirrored(arm);
+ ListBase chains = {NULL, NULL};
+ LinkData *chain;
- /* clear BONE_TRANSFORM flags
- * - used to prevent duplicate/canceling operations from occurring [#34123]
- * - BONE_DONE cannot be used here as that's already used for mirroring
- */
- armature_clear_swap_done_flags(arm);
+ /* get chains of bones (ends on chains) */
+ chains_find_tips(arm->edbo, &chains);
+ if (BLI_listbase_is_empty(&chains)) {
+ continue;
+ }
- /* loop over chains, only considering selected and visible bones */
- for (chain = chains.first; chain; chain = chain->next) {
- EditBone *ebo, *child = NULL, *parent = NULL;
+ /* ensure that mirror bones will also be operated on */
+ armature_tag_select_mirrored(arm);
- /* loop over bones in chain */
- for (ebo = chain->data; ebo; ebo = parent) {
- /* parent is this bone's original parent
- * - we store this, as the next bone that is checked is this one
- * but the value of ebo->parent may change here...
- */
- parent = ebo->parent;
-
- /* skip bone if already handled... [#34123] */
- if ((ebo->flag & BONE_TRANSFORM) == 0) {
- /* only if selected and editable */
- if (EBONE_VISIBLE(arm, ebo) && EBONE_EDITABLE(ebo)) {
- /* swap head and tail coordinates */
- swap_v3_v3(ebo->head, ebo->tail);
-
- /* do parent swapping:
- * - use 'child' as new parent
- * - connected flag is only set if points are coincidental
- */
- ebo->parent = child;
- if ((child) && equals_v3v3(ebo->head, child->tail))
- ebo->flag |= BONE_CONNECTED;
- else
- ebo->flag &= ~BONE_CONNECTED;
-
- /* get next bones
- * - child will become the new parent of next bone
- */
- child = ebo;
- }
- else {
- /* not swapping this bone, however, if its 'parent' got swapped, unparent us from it
- * as it will be facing in opposite direction
- */
- if ((parent) && (EBONE_VISIBLE(arm, parent) && EBONE_EDITABLE(parent))) {
- ebo->parent = NULL;
- ebo->flag &= ~BONE_CONNECTED;
+ /* clear BONE_TRANSFORM flags
+ * - used to prevent duplicate/canceling operations from occurring [#34123]
+ * - BONE_DONE cannot be used here as that's already used for mirroring
+ */
+ armature_clear_swap_done_flags(arm);
+
+ /* loop over chains, only considering selected and visible bones */
+ for (chain = chains.first; chain; chain = chain->next) {
+ EditBone *ebo, *child = NULL, *parent = NULL;
+
+ /* loop over bones in chain */
+ for (ebo = chain->data; ebo; ebo = parent) {
+ /* parent is this bone's original parent
+ * - we store this, as the next bone that is checked is this one
+ * but the value of ebo->parent may change here...
+ */
+ parent = ebo->parent;
+
+ /* skip bone if already handled... [#34123] */
+ if ((ebo->flag & BONE_TRANSFORM) == 0) {
+ /* only if selected and editable */
+ if (EBONE_VISIBLE(arm, ebo) && EBONE_EDITABLE(ebo)) {
+ /* swap head and tail coordinates */
+ swap_v3_v3(ebo->head, ebo->tail);
+
+ /* do parent swapping:
+ * - use 'child' as new parent
+ * - connected flag is only set if points are coincidental
+ */
+ ebo->parent = child;
+ if ((child) && equals_v3v3(ebo->head, child->tail))
+ ebo->flag |= BONE_CONNECTED;
+ else
+ ebo->flag &= ~BONE_CONNECTED;
+
+ /* get next bones
+ * - child will become the new parent of next bone
+ */
+ child = ebo;
}
+ else {
+ /* not swapping this bone, however, if its 'parent' got swapped, unparent us from it
+ * as it will be facing in opposite direction
+ */
+ if ((parent) && (EBONE_VISIBLE(arm, parent) && EBONE_EDITABLE(parent))) {
+ ebo->parent = NULL;
+ ebo->flag &= ~BONE_CONNECTED;
+ }
- /* get next bones
- * - child will become new parent of next bone (not swapping occurred,
- * so set to NULL to prevent infinite-loop)
- */
- child = NULL;
- }
+ /* get next bones
+ * - child will become new parent of next bone (not swapping occurred,
+ * so set to NULL to prevent infinite-loop)
+ */
+ child = NULL;
+ }
- /* tag as done (to prevent double-swaps) */
- ebo->flag |= BONE_TRANSFORM;
+ /* tag as done (to prevent double-swaps) */
+ ebo->flag |= BONE_TRANSFORM;
+ }
}
}
- }
- /* free chains */
- BLI_freelistN(&chains);
+ /* free chains */
+ BLI_freelistN(&chains);
- /* clear temp flags */
- armature_clear_swap_done_flags(arm);
- armature_tag_unselect(arm);
+ /* clear temp flags */
+ armature_clear_swap_done_flags(arm);
+ armature_tag_unselect(arm);
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -1286,22 +1323,28 @@ void ARMATURE_OT_align(wmOperatorType *ot)
static int armature_split_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob = CTX_data_edit_object(C);
- bArmature *arm = (bArmature *)ob->data;
- EditBone *bone;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
- for (bone = arm->edbo->first; bone; bone = bone->next) {
- if (bone->parent && (bone->flag & BONE_SELECTED) != (bone->parent->flag & BONE_SELECTED)) {
- bone->parent = NULL;
- bone->flag &= ~BONE_CONNECTED;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
+
+ for (EditBone *bone = arm->edbo->first; bone; bone = bone->next) {
+ if (bone->parent && (bone->flag & BONE_SELECTED) != (bone->parent->flag & BONE_SELECTED)) {
+ bone->parent = NULL;
+ bone->flag &= ~BONE_CONNECTED;
+ }
+ }
+ for (EditBone *bone = arm->edbo->first; bone; bone = bone->next) {
+ ED_armature_ebone_select_set(bone, (bone->flag & BONE_SELECTED) != 0);
}
- }
- for (bone = arm->edbo->first; bone; bone = bone->next) {
- ED_armature_ebone_select_set(bone, (bone->flag & BONE_SELECTED) != 0);
- }
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -1410,139 +1453,147 @@ static bool armature_dissolve_ebone_cb(const char *bone_name, void *arm_p)
static int armature_dissolve_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
- bArmature *arm;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
EditBone *ebone, *ebone_next;
- Object *obedit = CTX_data_edit_object(C);
- bool changed = false;
-
- /* store for mirror */
- GHash *ebone_flag_orig = NULL;
- int ebone_num = 0;
-
- arm = obedit->data;
+ bool changed_multi = false;
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- ebone->temp.p = NULL;
- ebone->flag &= ~BONE_DONE;
- ebone_num++;
- }
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ bArmature *arm = obedit->data;
+ bool changed = false;
- if (arm->flag & ARM_MIRROR_EDIT) {
- GHashIterator gh_iter;
+ /* store for mirror */
+ GHash *ebone_flag_orig = NULL;
+ int ebone_num = 0;
- ebone_flag_orig = BLI_ghash_ptr_new_ex(__func__, ebone_num);
for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- union { int flag; void *p; } val = {0};
- val.flag = ebone->flag;
- BLI_ghash_insert(ebone_flag_orig, ebone, val.p);
+ ebone->temp.p = NULL;
+ ebone->flag &= ~BONE_DONE;
+ ebone_num++;
}
- armature_select_mirrored_ex(arm, BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL);
-
- GHASH_ITER (gh_iter, ebone_flag_orig) {
- union { int flag; void *p; } *val_p = (void *)BLI_ghashIterator_getValue_p(&gh_iter);
- ebone = BLI_ghashIterator_getKey(&gh_iter);
- val_p->flag = ebone->flag & ~val_p->flag;
- }
- }
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ GHashIterator gh_iter;
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (ebone->parent && ebone->flag & BONE_CONNECTED) {
- if (ebone->parent->temp.ebone == ebone->parent) {
- /* ignore */
- }
- else if (ebone->parent->temp.ebone) {
- /* set ignored */
- ebone->parent->temp.ebone = ebone->parent;
+ ebone_flag_orig = BLI_ghash_ptr_new_ex(__func__, ebone_num);
+ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ union { int flag; void *p; } val = {0};
+ val.flag = ebone->flag;
+ BLI_ghash_insert(ebone_flag_orig, ebone, val.p);
}
- else {
- /* set child */
- ebone->parent->temp.ebone = ebone;
+
+ armature_select_mirrored_ex(arm, BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL);
+
+ GHASH_ITER (gh_iter, ebone_flag_orig) {
+ union { int flag; void *p; } *val_p = (void *)BLI_ghashIterator_getValue_p(&gh_iter);
+ ebone = BLI_ghashIterator_getKey(&gh_iter);
+ val_p->flag = ebone->flag & ~val_p->flag;
}
}
- }
- /* cleanup multiple used bones */
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (ebone->temp.ebone == ebone) {
- ebone->temp.ebone = NULL;
+ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (ebone->parent && ebone->flag & BONE_CONNECTED) {
+ if (ebone->parent->temp.ebone == ebone->parent) {
+ /* ignore */
+ }
+ else if (ebone->parent->temp.ebone) {
+ /* set ignored */
+ ebone->parent->temp.ebone = ebone->parent;
+ }
+ else {
+ /* set child */
+ ebone->parent->temp.ebone = ebone;
+ }
+ }
}
- }
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- /* break connections for unseen bones */
- if (((arm->layer & ebone->layer) &&
- ((ED_armature_ebone_selectflag_get(ebone) & (BONE_TIPSEL | BONE_SELECTED)))) == 0)
- {
- ebone->temp.ebone = NULL;
+ /* cleanup multiple used bones */
+ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (ebone->temp.ebone == ebone) {
+ ebone->temp.ebone = NULL;
+ }
}
- if (((arm->layer & ebone->layer) &&
- ((ED_armature_ebone_selectflag_get(ebone) & (BONE_ROOTSEL | BONE_SELECTED)))) == 0)
- {
- if (ebone->parent && (ebone->flag & BONE_CONNECTED)) {
- ebone->parent->temp.ebone = NULL;
+ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ /* break connections for unseen bones */
+ if (((arm->layer & ebone->layer) &&
+ ((ED_armature_ebone_selectflag_get(ebone) & (BONE_TIPSEL | BONE_SELECTED)))) == 0)
+ {
+ ebone->temp.ebone = NULL;
}
+ if (((arm->layer & ebone->layer) &&
+ ((ED_armature_ebone_selectflag_get(ebone) & (BONE_ROOTSEL | BONE_SELECTED)))) == 0)
+ {
+ if (ebone->parent && (ebone->flag & BONE_CONNECTED)) {
+ ebone->parent->temp.ebone = NULL;
+ }
+
+ }
}
- }
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (ebone->parent &&
- (ebone->parent->temp.ebone == ebone))
- {
- ebone->flag |= BONE_DONE;
+ if (ebone->parent &&
+ (ebone->parent->temp.ebone == ebone))
+ {
+ ebone->flag |= BONE_DONE;
+ }
}
- }
- BKE_pose_channels_remove(obedit, armature_dissolve_ebone_cb, arm);
+ BKE_pose_channels_remove(obedit, armature_dissolve_ebone_cb, arm);
- for (ebone = arm->edbo->first; ebone; ebone = ebone_next) {
- ebone_next = ebone->next;
+ for (ebone = arm->edbo->first; ebone; ebone = ebone_next) {
+ ebone_next = ebone->next;
- if (ebone->flag & BONE_DONE) {
- copy_v3_v3(ebone->parent->tail, ebone->tail);
- ebone->parent->rad_tail = ebone->rad_tail;
- SET_FLAG_FROM_TEST(ebone->parent->flag, ebone->flag & BONE_TIPSEL, BONE_TIPSEL);
+ if (ebone->flag & BONE_DONE) {
+ copy_v3_v3(ebone->parent->tail, ebone->tail);
+ ebone->parent->rad_tail = ebone->rad_tail;
+ SET_FLAG_FROM_TEST(ebone->parent->flag, ebone->flag & BONE_TIPSEL, BONE_TIPSEL);
- ED_armature_ebone_remove_ex(arm, ebone, false);
- changed = true;
- }
- }
-
- if (changed) {
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (ebone->parent &&
- ebone->parent->temp.ebone &&
- (ebone->flag & BONE_CONNECTED))
- {
- ebone->rad_head = ebone->parent->rad_tail;
+ ED_armature_ebone_remove_ex(arm, ebone, false);
+ changed = true;
}
}
- if (arm->flag & ARM_MIRROR_EDIT) {
+ if (changed) {
for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- union { int flag; void *p; } *val_p = (void *)BLI_ghash_lookup_p(ebone_flag_orig, ebone);
- if (val_p && val_p->flag) {
- ebone->flag &= ~val_p->flag;
+ if (ebone->parent &&
+ ebone->parent->temp.ebone &&
+ (ebone->flag & BONE_CONNECTED))
+ {
+ ebone->rad_head = ebone->parent->rad_tail;
+ }
+ }
+
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ union { int flag; void *p; } *val_p = (void *)BLI_ghash_lookup_p(ebone_flag_orig, ebone);
+ if (val_p && val_p->flag) {
+ ebone->flag &= ~val_p->flag;
+ }
}
}
}
- }
- if (arm->flag & ARM_MIRROR_EDIT) {
- BLI_ghash_free(ebone_flag_orig, NULL, NULL);
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ BLI_ghash_free(ebone_flag_orig, NULL, NULL);
+ }
+
+ if (changed) {
+ changed_multi = true;
+ ED_armature_edit_sync_selection(arm->edbo);
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
+ }
}
+ MEM_freeN(objects);
- if (!changed) {
+ if (!changed_multi) {
return OPERATOR_CANCELLED;
}
- ED_armature_edit_sync_selection(arm->edbo);
-
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
-
return OPERATOR_FINISHED;
}
@@ -1567,28 +1618,39 @@ void ARMATURE_OT_dissolve(wmOperatorType *ot)
static int armature_hide_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- bArmature *arm = obedit->data;
- EditBone *ebone;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
const int invert = RNA_boolean_get(op->ptr, "unselected") ? BONE_SELECTED : 0;
/* cancel if nothing selected */
if (CTX_DATA_COUNT(C, selected_bones) == 0)
return OPERATOR_CANCELLED;
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (EBONE_VISIBLE(arm, ebone)) {
- if ((ebone->flag & BONE_SELECTED) != invert) {
- ebone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
- ebone->flag |= BONE_HIDDEN_A;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ bArmature *arm = obedit->data;
+ bool changed = false;
+
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (EBONE_VISIBLE(arm, ebone)) {
+ if ((ebone->flag & BONE_SELECTED) != invert) {
+ ebone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
+ ebone->flag |= BONE_HIDDEN_A;
+ changed = true;
+ }
}
}
- }
- ED_armature_edit_validate_active(arm);
- ED_armature_edit_sync_selection(arm->edbo);
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
+ if (!changed) {
+ continue;
+ }
+ ED_armature_edit_validate_active(arm);
+ ED_armature_edit_sync_selection(arm->edbo);
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -1612,26 +1674,35 @@ void ARMATURE_OT_hide(wmOperatorType *ot)
static int armature_reveal_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- bArmature *arm = obedit->data;
- EditBone *ebone;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
const bool select = RNA_boolean_get(op->ptr, "select");
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ bArmature *arm = obedit->data;
+ bool changed = false;
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (arm->layer & ebone->layer) {
- if (ebone->flag & BONE_HIDDEN_A) {
- if (!(ebone->flag & BONE_UNSELECTABLE)) {
- SET_FLAG_FROM_TEST(ebone->flag, select, (BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL));
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (arm->layer & ebone->layer) {
+ if (ebone->flag & BONE_HIDDEN_A) {
+ if (!(ebone->flag & BONE_UNSELECTABLE)) {
+ SET_FLAG_FROM_TEST(ebone->flag, select, (BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL));
+ }
+ ebone->flag &= ~BONE_HIDDEN_A;
+ changed = true;
}
- ebone->flag &= ~BONE_HIDDEN_A;
}
}
- }
- ED_armature_edit_validate_active(arm);
- ED_armature_edit_sync_selection(arm->edbo);
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
+ if (changed) {
+ ED_armature_edit_validate_active(arm);
+ ED_armature_edit_sync_selection(arm->edbo);
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
+ }
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h
index e28e9877eba..da24787fc18 100644
--- a/source/blender/editors/armature/armature_intern.h
+++ b/source/blender/editors/armature/armature_intern.h
@@ -147,6 +147,8 @@ void POSE_OT_bone_layers(struct wmOperatorType *ot);
typedef struct tPChanFCurveLink {
struct tPChanFCurveLink *next, *prev;
+ struct Object *ob; /* Object this Pose Channel belongs to. */
+
ListBase fcurves; /* F-Curves for this PoseChannel (wrapped with LinkData) */
struct bPoseChannel *pchan; /* Pose Channel which data is attached to */
@@ -170,12 +172,13 @@ typedef struct tPChanFCurveLink {
/* ----------- */
-void poseAnim_mapping_get(struct bContext *C, ListBase *pfLinks, struct Object *ob, struct bAction *act);
+struct Object *poseAnim_object_get(struct Object *ob_);
+void poseAnim_mapping_get(struct bContext *C, ListBase *pfLinks);
void poseAnim_mapping_free(ListBase *pfLinks);
void poseAnim_mapping_refresh(struct bContext *C, struct Scene *scene, struct Object *ob);
void poseAnim_mapping_reset(ListBase *pfLinks);
-void poseAnim_mapping_autoKeyframe(struct bContext *C, struct Scene *scene, struct Object *ob, ListBase *pfLinks, float cframe);
+void poseAnim_mapping_autoKeyframe(struct bContext *C, struct Scene *scene, ListBase *pfLinks, float cframe);
LinkData *poseAnim_mapping_getNextFCurve(ListBase *fcuLinks, LinkData *prev, const char *path);
@@ -213,7 +216,7 @@ void POSE_OT_propagate(struct wmOperatorType *ot);
* within each file, but some tools still have a bit of overlap which makes things messy -- Feb 2013
*/
-EditBone *make_boneList(struct ListBase *edbo, struct ListBase *bones, struct EditBone *parent, struct Bone *actBone);
+EditBone *make_boneList(struct ListBase *edbo, struct ListBase *bones, struct Bone *actBone);
/* duplicate method */
void preEditBoneDuplicate(struct ListBase *editbones);
diff --git a/source/blender/editors/armature/armature_naming.c b/source/blender/editors/armature/armature_naming.c
index 20fccfda6b9..3d5ed47655c 100644
--- a/source/blender/editors/armature/armature_naming.c
+++ b/source/blender/editors/armature/armature_naming.c
@@ -31,6 +31,8 @@
#include <string.h>
+#include "MEM_guardedalloc.h"
+
#include "DNA_armature_types.h"
#include "DNA_constraint_types.h"
#include "DNA_object_types.h"
@@ -51,6 +53,7 @@
#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_global.h"
+#include "BKE_layer.h"
#include "BKE_main.h"
#include "BKE_modifier.h"
#include "BKE_gpencil_modifier.h"
@@ -139,7 +142,7 @@ static void constraint_bone_name_fix(Object *ob, ListBase *conlist, const char *
/* called by UI for renaming a bone */
/* warning: make sure the original bone was not renamed yet! */
-/* seems messy, but thats what you get with not using pointers but channel names :) */
+/* seems messy, but that's what you get with not using pointers but channel names :) */
void ED_armature_bone_rename(Main *bmain, bArmature *arm, const char *oldnamep, const char *newnamep)
{
Object *ob;
@@ -178,6 +181,9 @@ void ED_armature_bone_rename(Main *bmain, bArmature *arm, const char *oldnamep,
}
}
+ /* force copy on write to update database */
+ DEG_id_tag_update(&arm->id, DEG_TAG_COPY_ON_WRITE);
+
/* do entire dbase - objects */
for (ob = bmain->object.first; ob; ob = ob->id.next) {
ModifierData *md;
@@ -399,38 +405,59 @@ void ED_armature_bones_flip_names(Main *bmain, bArmature *arm, ListBase *bones_n
static int armature_flip_names_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
- Object *ob = CTX_data_edit_object(C);
- bArmature *arm;
-
- /* paranoia checks */
- if (ELEM(NULL, ob, ob->pose))
- return OPERATOR_CANCELLED;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ Object *ob_active = CTX_data_edit_object(C);
const bool do_strip_numbers = RNA_boolean_get(op->ptr, "do_strip_numbers");
- arm = ob->data;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
+
+ /* Paranoia check. */
+ if (ob_active->pose == NULL) {
+ continue;
+ }
- ListBase bones_names = {NULL};
+ ListBase bones_names = {NULL};
- CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones)
- {
- BLI_addtail(&bones_names, BLI_genericNodeN(ebone->name));
- }
- CTX_DATA_END;
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (EBONE_VISIBLE(arm, ebone)) {
+ if (ebone->flag & BONE_SELECTED) {
+ BLI_addtail(&bones_names, BLI_genericNodeN(ebone->name));
+
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ EditBone *flipbone = ED_armature_ebone_get_mirrored(arm->edbo, ebone);
+ if ((flipbone) && !(flipbone->flag & BONE_SELECTED)) {
+ BLI_addtail(&bones_names, BLI_genericNodeN(flipbone->name));
+ }
+ }
+ }
+ }
+ }
- ED_armature_bones_flip_names(bmain, arm, &bones_names, do_strip_numbers);
+ if (BLI_listbase_is_empty(&bones_names)) {
+ continue;
+ }
+
+ ED_armature_bones_flip_names(bmain, arm, &bones_names, do_strip_numbers);
- BLI_freelistN(&bones_names);
+ BLI_freelistN(&bones_names);
- /* since we renamed stuff... */
- DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ /* since we renamed stuff... */
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
- /* copied from #rna_Bone_update_renamed */
- /* redraw view */
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
+ /* copied from #rna_Bone_update_renamed */
+ /* redraw view */
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
- /* update animation channels */
- WM_event_add_notifier(C, NC_ANIMATION | ND_ANIMCHAN, ob->data);
+ /* update animation channels */
+ WM_event_add_notifier(C, NC_ANIMATION | ND_ANIMCHAN, ob->data);
+
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -454,36 +481,64 @@ void ARMATURE_OT_flip_names(wmOperatorType *ot)
"(WARNING: may result in incoherent naming in some cases)");
}
-
static int armature_autoside_names_exec(bContext *C, wmOperator *op)
{
+ ViewLayer *view_layer = CTX_data_view_layer(C);
Main *bmain = CTX_data_main(C);
- Object *ob = CTX_data_edit_object(C);
- bArmature *arm;
char newname[MAXBONENAME];
- short axis = RNA_enum_get(op->ptr, "type");
-
- /* paranoia checks */
- if (ELEM(NULL, ob, ob->pose))
- return OPERATOR_CANCELLED;
- arm = ob->data;
-
- /* loop through selected bones, auto-naming them */
- CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones)
- {
- BLI_strncpy(newname, ebone->name, sizeof(newname));
- if (bone_autoside_name(newname, 1, axis, ebone->head[axis], ebone->tail[axis]))
- ED_armature_bone_rename(bmain, arm, ebone->name, newname);
- }
- CTX_DATA_END;
+ const short axis = RNA_enum_get(op->ptr, "type");
+ bool changed_multi = false;
+
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
+ bool changed = false;
+
+ /* Paranoia checks. */
+ if (ELEM(NULL, ob, ob->pose)) {
+ continue;
+ }
- /* since we renamed stuff... */
- DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (EBONE_EDITABLE(ebone)) {
+
+ /* We first need to do the flipped bone, then the original one.
+ * Otherwise we can't find the flipped one because of the bone name change. */
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ EditBone *flipbone = ED_armature_ebone_get_mirrored(arm->edbo, ebone);
+ if ((flipbone) && !(flipbone->flag & BONE_SELECTED)) {
+ BLI_strncpy(newname, flipbone->name, sizeof(newname));
+ if (bone_autoside_name(newname, 1, axis, flipbone->head[axis], flipbone->tail[axis])) {
+ ED_armature_bone_rename(bmain, arm, flipbone->name, newname);
+ changed = true;
+ }
+ }
+ }
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
+ BLI_strncpy(newname, ebone->name, sizeof(newname));
+ if (bone_autoside_name(newname, 1, axis, ebone->head[axis], ebone->tail[axis])) {
+ ED_armature_bone_rename(bmain, arm, ebone->name, newname);
+ changed = true;
+ }
+ }
+ }
- return OPERATOR_FINISHED;
+ if (!changed) {
+ continue;
+ }
+
+ changed_multi = true;
+
+ /* Since we renamed stuff... */
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+
+ /* Note, notifier might evolve. */
+ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
+ }
+ MEM_freeN(objects);
+ return changed_multi ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
void ARMATURE_OT_autoside_names(wmOperatorType *ot)
diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c
index 323fa36832b..b4c872c044d 100644
--- a/source/blender/editors/armature/armature_ops.c
+++ b/source/blender/editors/armature/armature_ops.c
@@ -190,222 +190,15 @@ void ED_operatormacros_armature(void)
void ED_keymap_armature(wmKeyConfig *keyconf)
{
wmKeyMap *keymap;
- wmKeyMapItem *kmi;
/* Armature ------------------------ */
+ /* only set in editmode armature, by space_view3d listener */
keymap = WM_keymap_ensure(keyconf, "Armature", 0, 0);
keymap->poll = ED_operator_editarmature;
- /* only set in editmode armature, by space_view3d listener */
- kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_hide", HKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
- kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
-
- WM_keymap_add_item(keymap, "ARMATURE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "ARMATURE_OT_align", AKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "ARMATURE_OT_calculate_roll", NKEY, KM_PRESS, KM_CTRL, 0);
-#else
- WM_keymap_add_item(keymap, "ARMATURE_OT_calculate_roll", NKEY, KM_PRESS, KM_SHIFT, 0);
-#endif
- WM_keymap_add_item(keymap, "ARMATURE_OT_roll_clear", RKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "ARMATURE_OT_switch_direction", FKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "ARMATURE_OT_bone_primitive_add", AKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "ARMATURE_OT_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "ARMATURE_OT_parent_clear", PKEY, KM_PRESS, KM_ALT, 0);
-
- kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_select_mirror", MKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
-
- kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_PARENT);
- RNA_boolean_set(kmi->ptr, "extend", false);
- kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_PARENT);
- RNA_boolean_set(kmi->ptr, "extend", true);
-
- kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_CHILD);
- RNA_boolean_set(kmi->ptr, "extend", false);
- kmi = WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_CHILD);
- RNA_boolean_set(kmi->ptr, "extend", true);
-
- WM_keymap_add_item(keymap, "ARMATURE_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "ARMATURE_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "ARMATURE_OT_select_similar", GKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "ARMATURE_OT_select_linked", LKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "ARMATURE_OT_shortest_path_pick", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_armature_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_armature_delete", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "ARMATURE_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "ARMATURE_OT_dissolve", XKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "ARMATURE_OT_dissolve", DELKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "ARMATURE_OT_extrude_move", EKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ARMATURE_OT_extrude_forked", EKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "ARMATURE_OT_click_extrude", ACTIONMOUSE, KM_CLICK, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "ARMATURE_OT_fill", FKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ARMATURE_OT_merge", MKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "ARMATURE_OT_split", YKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "ARMATURE_OT_separate", PKEY, KM_PRESS, 0, 0);
-
- /* set flags */
- WM_keymap_add_menu(keymap, "VIEW3D_MT_bone_options_toggle", WKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_bone_options_enable", WKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_bone_options_disable", WKEY, KM_PRESS, KM_ALT, 0);
-
- /* armature/bone layers */
- WM_keymap_add_item(keymap, "ARMATURE_OT_layers_show_all", ACCENTGRAVEKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "ARMATURE_OT_armature_layers", MKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "ARMATURE_OT_bone_layers", MKEY, KM_PRESS, 0, 0);
-
- /* special transforms: */
- /* 1) envelope/b-bone size */
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_BONESIZE);
- /* 2) envelope radius */
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_BONE_ENVELOPE);
- /* 3) set roll */
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", RKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_BONE_ROLL);
-
- /* menus */
- WM_keymap_add_menu(keymap, "VIEW3D_MT_armature_specials", WKEY, KM_PRESS, 0, 0);
-
/* Pose ------------------------ */
/* only set in posemode, by space_view3d listener */
keymap = WM_keymap_ensure(keyconf, "Pose", 0, 0);
keymap->poll = ED_operator_posemode;
- /* set parent and add object are object-based operators, but we make them
- * available here because it's useful to do in pose mode too */
- WM_keymap_add_item(keymap, "OBJECT_OT_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0);
-
- kmi = WM_keymap_add_item(keymap, "POSE_OT_hide", HKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
- kmi = WM_keymap_add_item(keymap, "POSE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
-
- WM_keymap_add_item(keymap, "POSE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_pose_apply", AKEY, KM_PRESS, KM_CTRL, 0);
-
- /* TODO: clear pose */
- WM_keymap_add_item(keymap, "POSE_OT_rot_clear", RKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "POSE_OT_loc_clear", GKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "POSE_OT_scale_clear", SKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "POSE_OT_quaternions_flip", FKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "POSE_OT_rotation_mode_set", RKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "POSE_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
- kmi = WM_keymap_add_item(keymap, "POSE_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "flipped", false);
- kmi = WM_keymap_add_item(keymap, "POSE_OT_paste", VKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "flipped", true);
-
-#ifdef __APPLE__
- WM_keymap_add_item(keymap, "POSE_OT_copy", CKEY, KM_PRESS, KM_OSKEY, 0);
- kmi = WM_keymap_add_item(keymap, "POSE_OT_paste", VKEY, KM_PRESS, KM_OSKEY, 0);
- RNA_boolean_set(kmi->ptr, "flipped", false);
- kmi = WM_keymap_add_item(keymap, "POSE_OT_paste", VKEY, KM_PRESS, KM_OSKEY | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "flipped", true);
-#endif
-
- kmi = WM_keymap_add_item(keymap, "POSE_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "POSE_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "POSE_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- WM_keymap_add_item(keymap, "POSE_OT_select_parent", PKEY, KM_PRESS, KM_SHIFT, 0);
-
- kmi = WM_keymap_add_item(keymap, "POSE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_PARENT);
- RNA_boolean_set(kmi->ptr, "extend", false);
- kmi = WM_keymap_add_item(keymap, "POSE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_PARENT);
- RNA_boolean_set(kmi->ptr, "extend", true);
-
- kmi = WM_keymap_add_item(keymap, "POSE_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_CHILD);
- RNA_boolean_set(kmi->ptr, "extend", false);
- kmi = WM_keymap_add_item(keymap, "POSE_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_CHILD);
- RNA_boolean_set(kmi->ptr, "extend", true);
-
- WM_keymap_add_item(keymap, "POSE_OT_select_linked", LKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "POSE_OT_select_grouped", GKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "POSE_OT_select_mirror", MKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "POSE_OT_constraint_add_with_targets", CKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "POSE_OT_constraints_clear", CKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- WM_keymap_add_item(keymap, "POSE_OT_ik_add", IKEY, KM_PRESS, /*KM_CTRL|*/ KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "POSE_OT_ik_clear", IKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_pose_group", GKEY, KM_PRESS, KM_CTRL, 0);
-
- /* set flags */
- WM_keymap_add_menu(keymap, "VIEW3D_MT_bone_options_toggle", WKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_bone_options_enable", WKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_bone_options_disable", WKEY, KM_PRESS, KM_ALT, 0);
-
- /* armature/bone layers */
- WM_keymap_add_item(keymap, "ARMATURE_OT_layers_show_all", ACCENTGRAVEKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "ARMATURE_OT_armature_layers", MKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "POSE_OT_bone_layers", MKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", ZKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.overlay.show_bone_select");
-
- /* special transforms: */
- /* 1) envelope/b-bone size */
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_BONESIZE);
-
- /* keyframes management */
- WM_keymap_verify_item(keymap, "ANIM_OT_keyframe_insert_menu", IKEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "ANIM_OT_keyframe_delete_v3d", IKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_verify_item(keymap, "ANIM_OT_keying_set_active_set", IKEY, KM_PRESS, KM_CTRL | KM_SHIFT | KM_ALT, 0);
-
- /* Pose -> PoseLib ------------- */
- /* only set in posemode, by space_view3d listener */
- WM_keymap_add_item(keymap, "POSELIB_OT_browse_interactive", LKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "POSELIB_OT_pose_add", LKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "POSELIB_OT_pose_remove", LKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "POSELIB_OT_pose_rename", LKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
-
- /* Pose -> Pose Sliding ------------- */
- /* only set in posemode, by space_view3d listener */
- WM_keymap_add_item(keymap, "POSE_OT_push", EKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "POSE_OT_relax", EKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "POSE_OT_breakdown", EKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* menus */
- WM_keymap_add_menu(keymap, "VIEW3D_MT_pose_specials", WKEY, KM_PRESS, 0, 0);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_pose_propagate", PKEY, KM_PRESS, KM_ALT, 0);
}
diff --git a/source/blender/editors/armature/armature_relations.c b/source/blender/editors/armature/armature_relations.c
index e0155a8c435..80dc2559bdb 100644
--- a/source/blender/editors/armature/armature_relations.c
+++ b/source/blender/editors/armature/armature_relations.c
@@ -247,8 +247,8 @@ int join_armature_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
- Object *ob = CTX_data_active_object(C);
- bArmature *arm = (ob) ? ob->data : NULL;
+ Object *ob_active = CTX_data_active_object(C);
+ bArmature *arm = (ob_active) ? ob_active->data : NULL;
bPose *pose, *opose;
bPoseChannel *pchan, *pchann;
EditBone *curbone;
@@ -256,14 +256,14 @@ int join_armature_exec(bContext *C, wmOperator *op)
bool ok = false;
/* Ensure we're not in editmode and that the active object is an armature*/
- if (!ob || ob->type != OB_ARMATURE)
+ if (!ob_active || ob_active->type != OB_ARMATURE)
return OPERATOR_CANCELLED;
if (!arm || arm->edbo)
return OPERATOR_CANCELLED;
- CTX_DATA_BEGIN(C, Base *, base, selected_editable_bases)
+ CTX_DATA_BEGIN(C, Object *, ob_iter, selected_editable_objects)
{
- if (base->object == ob) {
+ if (ob_iter == ob_active) {
ok = true;
break;
}
@@ -280,34 +280,34 @@ int join_armature_exec(bContext *C, wmOperator *op)
ED_armature_to_edit(arm);
/* get pose of active object and move it out of posemode */
- pose = ob->pose;
- ob->mode &= ~OB_MODE_POSE;
+ pose = ob_active->pose;
+ ob_active->mode &= ~OB_MODE_POSE;
- CTX_DATA_BEGIN(C, Base *, base, selected_editable_bases)
+ CTX_DATA_BEGIN(C, Object *, ob_iter, selected_editable_objects)
{
- if ((base->object->type == OB_ARMATURE) && (base->object != ob)) {
+ if ((ob_iter->type == OB_ARMATURE) && (ob_iter != ob_active)) {
tJoinArmature_AdtFixData afd = {NULL};
- bArmature *curarm = base->object->data;
+ bArmature *curarm = ob_iter->data;
/* we assume that each armature datablock is only used in a single place */
- BLI_assert(ob->data != base->object->data);
+ BLI_assert(ob_active->data != ob_iter->data);
/* init callback data for fixing up AnimData links later */
- afd.srcArm = base->object;
- afd.tarArm = ob;
+ afd.srcArm = ob_iter;
+ afd.tarArm = ob_active;
afd.names_map = BLI_ghash_str_new("join_armature_adt_fix");
/* Make a list of editbones in current armature */
- ED_armature_to_edit(base->object->data);
+ ED_armature_to_edit(ob_iter->data);
/* Get Pose of current armature */
- opose = base->object->pose;
- base->object->mode &= ~OB_MODE_POSE;
+ opose = ob_iter->pose;
+ ob_iter->mode &= ~OB_MODE_POSE;
//BASACT->flag &= ~OB_MODE_POSE;
/* Find the difference matrix */
- invert_m4_m4(oimat, ob->obmat);
- mul_m4_m4m4(mat, oimat, base->object->obmat);
+ invert_m4_m4(oimat, ob_active->obmat);
+ mul_m4_m4m4(mat, oimat, ob_iter->obmat);
/* Copy bones and posechannels from the object to the edit armature */
for (pchan = opose->chanbase.first; pchan; pchan = pchann) {
@@ -347,7 +347,7 @@ int join_armature_exec(bContext *C, wmOperator *op)
}
/* Fix Constraints and Other Links to this Bone and Armature */
- joined_armature_fix_links(bmain, ob, base->object, pchan, curbone);
+ joined_armature_fix_links(bmain, ob_active, ob_iter, pchan, curbone);
/* Rename pchan */
BLI_strncpy(pchan->name, curbone->name, sizeof(pchan->name));
@@ -370,21 +370,21 @@ int join_armature_exec(bContext *C, wmOperator *op)
* so that we don't have to worry about ambiguities re which armature
* a bone came from!
*/
- if (base->object->adt) {
- if (ob->adt == NULL) {
+ if (ob_iter->adt) {
+ if (ob_active->adt == NULL) {
/* no animdata, so just use a copy of the whole thing */
- ob->adt = BKE_animdata_copy(bmain, base->object->adt, false, true);
+ ob_active->adt = BKE_animdata_copy(bmain, ob_iter->adt, 0);
}
else {
/* merge in data - we'll fix the drivers manually */
- BKE_animdata_merge_copy(bmain, &ob->id, &base->object->id, ADT_MERGECOPY_KEEP_DST, false);
+ BKE_animdata_merge_copy(bmain, &ob_active->id, &ob_iter->id, ADT_MERGECOPY_KEEP_DST, false);
}
}
if (curarm->adt) {
if (arm->adt == NULL) {
/* no animdata, so just use a copy of the whole thing */
- arm->adt = BKE_animdata_copy(bmain, curarm->adt, false, true);
+ arm->adt = BKE_animdata_copy(bmain, curarm->adt, 0);
}
else {
/* merge in data - we'll fix the drivers manually */
@@ -393,7 +393,7 @@ int join_armature_exec(bContext *C, wmOperator *op)
}
/* Free the old object data */
- ED_object_base_free_and_unlink(bmain, scene, base->object);
+ ED_object_base_free_and_unlink(bmain, scene, ob_iter);
}
}
CTX_DATA_END;
@@ -574,83 +574,89 @@ static int separate_armature_exec(bContext *C, wmOperator *op)
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
- Object *obedit = CTX_data_edit_object(C);
- Object *oldob, *newob;
- Base *oldbase, *newbase;
-
- /* sanity checks */
- if (obedit == NULL)
- return OPERATOR_CANCELLED;
+ bool ok = false;
/* set wait cursor in case this takes a while */
WM_cursor_wait(1);
- /* we are going to do this as follows (unlike every other instance of separate):
- * 1. exit editmode +posemode for active armature/base. Take note of what this is.
- * 2. duplicate base - BASACT is the new one now
- * 3. for each of the two armatures, enter editmode -> remove appropriate bones -> exit editmode + recalc
- * 4. fix constraint links
- * 5. make original armature active and enter editmode
- */
+ uint bases_len = 0;
+ Base **bases = BKE_view_layer_array_from_bases_in_edit_mode_unique_data(view_layer, &bases_len);
- /* 1) only edit-base selected */
- /* TODO: use context iterators for this? */
CTX_DATA_BEGIN(C, Base *, base, visible_bases)
{
- if (base->object == obedit) {
- ED_object_base_select(base, BA_SELECT);
- }
- else {
- ED_object_base_select(base, BA_DESELECT);
- }
+ ED_object_base_select(base, BA_DESELECT);
}
CTX_DATA_END;
- /* 1) store starting settings and exit editmode */
- oldob = obedit;
- oldbase = view_layer->basact;
- oldob->mode &= ~OB_MODE_POSE;
- //oldbase->flag &= ~OB_POSEMODE;
+ for (uint base_index = 0; base_index < bases_len; base_index++) {
+ Base *base_iter = bases[base_index];
+ Object *obedit = base_iter->object;
+
+ Object *oldob, *newob;
+ Base *oldbase, *newbase;
- ED_armature_from_edit(bmain, obedit->data);
- ED_armature_edit_free(obedit->data);
+ /* we are going to do this as follows (unlike every other instance of separate):
+ * 1. exit editmode +posemode for active armature/base. Take note of what this is.
+ * 2. duplicate base - BASACT is the new one now
+ * 3. for each of the two armatures, enter editmode -> remove appropriate bones -> exit editmode + recalc
+ * 4. fix constraint links
+ * 5. make original armature active and enter editmode
+ */
- /* 2) duplicate base */
- newbase = ED_object_add_duplicate(bmain, scene, view_layer, oldbase, USER_DUP_ARM); /* only duplicate linked armature */
- DEG_relations_tag_update(bmain);
+ /* 1) only edit-base selected */
+ ED_object_base_select(base_iter, BA_SELECT);
- newob = newbase->object;
- newbase->flag &= ~BASE_SELECTED;
+ /* 1) store starting settings and exit editmode */
+ oldob = obedit;
+ oldbase = base_iter;
+ oldob->mode &= ~OB_MODE_POSE;
+ //oldbase->flag &= ~OB_POSEMODE;
+ ED_armature_from_edit(bmain, obedit->data);
+ ED_armature_edit_free(obedit->data);
- /* 3) remove bones that shouldn't still be around on both armatures */
- separate_armature_bones(bmain, oldob, 1);
- separate_armature_bones(bmain, newob, 0);
+ /* 2) duplicate base */
+ newbase = ED_object_add_duplicate(bmain, scene, view_layer, oldbase, USER_DUP_ARM); /* only duplicate linked armature */
+ DEG_relations_tag_update(bmain);
+ newob = newbase->object;
+ newbase->flag &= ~BASE_SELECTED;
- /* 4) fix links before depsgraph flushes */ // err... or after?
- separated_armature_fix_links(bmain, oldob, newob);
- DEG_id_tag_update(&oldob->id, OB_RECALC_DATA); /* this is the original one */
- DEG_id_tag_update(&newob->id, OB_RECALC_DATA); /* this is the separated one */
+ /* 3) remove bones that shouldn't still be around on both armatures */
+ separate_armature_bones(bmain, oldob, 1);
+ separate_armature_bones(bmain, newob, 0);
- /* 5) restore original conditions */
- obedit = oldob;
+ /* 4) fix links before depsgraph flushes */ // err... or after?
+ separated_armature_fix_links(bmain, oldob, newob);
- ED_armature_to_edit(obedit->data);
+ DEG_id_tag_update(&oldob->id, OB_RECALC_DATA); /* this is the original one */
+ DEG_id_tag_update(&newob->id, OB_RECALC_DATA); /* this is the separated one */
- /* parents tips remain selected when connected children are removed. */
- ED_armature_edit_deselect_all(obedit);
- BKE_report(op->reports, RPT_INFO, "Separated bones");
+ /* 5) restore original conditions */
+ obedit = oldob;
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT | ND_POSE, obedit);
+ ED_armature_to_edit(obedit->data);
+
+ /* parents tips remain selected when connected children are removed. */
+ ED_armature_edit_deselect_all(obedit);
+
+ ok = true;
+
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, obedit);
+ }
+ MEM_freeN(bases);
/* recalc/redraw + cleanup */
WM_cursor_wait(0);
+ if (ok) {
+ BKE_report(op->reports, RPT_INFO, "Separated bones");
+ }
+
return OPERATOR_FINISHED;
}
@@ -785,8 +791,8 @@ static int armature_parent_set_exec(bContext *C, wmOperator *op)
* - the context iterator contains both selected bones and their mirrored copies,
* so we assume that unselected bones are mirrored copies of some selected bone
* - since the active one (and/or its mirror) will also be selected, we also need
- * to check that we are not trying to operate on them, since such an operation
- * would cause errors
+ * to check that we are not trying to operate on them, since such an operation
+ * would cause errors
*/
/* parent selected bones to the active one */
@@ -874,9 +880,8 @@ static void editbone_clear_parent(EditBone *ebone, int mode)
static int armature_parent_clear_exec(bContext *C, wmOperator *op)
{
- Object *ob = CTX_data_edit_object(C);
- bArmature *arm = (bArmature *)ob->data;
- int val = RNA_enum_get(op->ptr, "type");
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ const int val = RNA_enum_get(op->ptr, "type");
CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones)
{
@@ -884,10 +889,30 @@ static int armature_parent_clear_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- ED_armature_edit_sync_selection(arm->edbo);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
+ bool changed = false;
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (EBONE_EDITABLE(ebone)) {
+ changed = true;
+ break;
+ }
+ }
+
+ if (!changed) {
+ continue;
+ }
+
+ ED_armature_edit_sync_selection(arm->edbo);
+
+ /* Note, notifier might evolve. */
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/armature/armature_select.c b/source/blender/editors/armature/armature_select.c
index 365771a1430..216d068558d 100644
--- a/source/blender/editors/armature/armature_select.c
+++ b/source/blender/editors/armature/armature_select.c
@@ -54,6 +54,7 @@
#include "WM_types.h"
#include "ED_armature.h"
+#include "ED_object.h"
#include "ED_screen.h"
#include "ED_select_utils.h"
#include "ED_view3d.h"
@@ -128,7 +129,7 @@ Base *ED_armature_base_and_bone_from_select_buffer(
if (base != NULL) {
if (base->object->pose != NULL) {
const uint hit_bone = (hit & ~BONESEL_ANY) >> 16;
- bPoseChannel *pchan = BLI_findlink(&base->object->pose->chanbase, hit_bone);;
+ bPoseChannel *pchan = BLI_findlink(&base->object->pose->chanbase, hit_bone);
bone = pchan ? pchan->bone : NULL;
}
}
@@ -287,16 +288,15 @@ void *get_nearest_bone(
/* called in space.c */
/* previously "selectconnected_armature" */
-static int armature_select_linked_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+static int armature_select_linked_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
{
bArmature *arm;
EditBone *bone, *curBone, *next;
- const bool extend = RNA_boolean_get(op->ptr, "extend");
view3d_operator_needs_opengl(C);
Base *base = NULL;
- bone = get_nearest_bone(C, event->mval, !extend, &base);
+ bone = get_nearest_bone(C, event->mval, true, &base);
if (!bone)
return OPERATOR_CANCELLED;
@@ -306,12 +306,7 @@ static int armature_select_linked_invoke(bContext *C, wmOperator *op, const wmEv
/* Select parents */
for (curBone = bone; curBone; curBone = next) {
if ((curBone->flag & BONE_UNSELECTABLE) == 0) {
- if (extend) {
- curBone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- }
- else {
- curBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- }
+ curBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
}
if (curBone->flag & BONE_CONNECTED)
@@ -326,10 +321,7 @@ static int armature_select_linked_invoke(bContext *C, wmOperator *op, const wmEv
next = curBone->next;
if ((curBone->parent == bone) && (curBone->flag & BONE_UNSELECTABLE) == 0) {
if (curBone->flag & BONE_CONNECTED) {
- if (extend)
- curBone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- else
- curBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ curBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
bone = curBone;
break;
}
@@ -369,9 +361,6 @@ void ARMATURE_OT_select_linked(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* properties */
- RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend selection instead of deselecting everything first");
}
/* utility function for get_nearest_editbonepoint */
@@ -716,17 +705,13 @@ bool ED_armature_edit_select_pick(bContext *C, const int mval[2], bool extend, b
ED_armature_edit_sync_selection(arm->edbo);
- if (nearBone) {
- /* then now check for active status */
- if (ebone_select_flag(nearBone)) {
- arm->act_edbone = nearBone;
- }
+ /* then now check for active status */
+ if (ebone_select_flag(nearBone)) {
+ arm->act_edbone = nearBone;
+ }
- if (vc.view_layer->basact != basact) {
- vc.view_layer->basact = basact;
- DEG_id_tag_update(&vc.scene->id, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, vc.scene);
- }
+ if (vc.view_layer->basact != basact) {
+ ED_object_base_activate(C, basact);
}
WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, basact->object);
@@ -899,10 +884,15 @@ static void armature_select_more_less(Object *ob, bool more)
static int armature_de_select_more_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *obedit = CTX_data_edit_object(C);
- armature_select_more_less(obedit, true);
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
-
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ armature_select_more_less(ob, true);
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -923,10 +913,15 @@ void ARMATURE_OT_select_more(wmOperatorType *ot)
static int armature_de_select_less_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *obedit = CTX_data_edit_object(C);
- armature_select_more_less(obedit, false);
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
-
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ armature_select_more_less(ob, false);
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -972,84 +967,171 @@ static const EnumPropertyItem prop_similar_types[] = {
{0, NULL, 0, NULL, NULL}
};
+static float bone_length_squared_worldspace_get(Object *ob, EditBone *ebone)
+{
+ float v1[3], v2[3];
+ mul_v3_mat3_m4v3(v1, ob->obmat, ebone->head);
+ mul_v3_mat3_m4v3(v2, ob->obmat, ebone->tail);
+ return len_squared_v3v3(v1, v2);
+}
-static void select_similar_length(bArmature *arm, EditBone *ebone_act, const float thresh)
+static void select_similar_length(bContext *C, const float thresh)
{
- EditBone *ebone;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ Object *ob_act = CTX_data_edit_object(C);
+ EditBone *ebone_act = CTX_data_active_bone(C);
- /* thresh is always relative to current length */
- const float len_min = ebone_act->length / (1.0f + thresh);
- const float len_max = ebone_act->length * (1.0f + thresh);
+ /* Thresh is always relative to current length. */
+ const float len = bone_length_squared_worldspace_get(ob_act, ebone_act);
+ const float len_min = len / (1.0f + (thresh - FLT_EPSILON));
+ const float len_max = len * (1.0f + (thresh + FLT_EPSILON));
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (EBONE_SELECTABLE(arm, ebone)) {
- if ((ebone->length >= len_min) &&
- (ebone->length <= len_max))
- {
- ED_armature_ebone_select_set(ebone, true);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
+ bool changed = false;
+
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (EBONE_SELECTABLE(arm, ebone)) {
+ const float len_iter = bone_length_squared_worldspace_get(ob, ebone);
+ if ((len_iter > len_min) &&
+ (len_iter < len_max))
+ {
+ ED_armature_ebone_select_set(ebone, true);
+ changed = true;
+ }
}
}
+
+ if (changed) {
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ }
}
+ MEM_freeN(objects);
}
-static void select_similar_direction(bArmature *arm, EditBone *ebone_act, const float thresh)
+static void bone_direction_worldspace_get(Object *ob, EditBone *ebone, float *r_dir)
{
- EditBone *ebone;
+ float v1[3], v2[3];
+ copy_v3_v3(v1, ebone->head);
+ copy_v3_v3(v2, ebone->tail);
+
+ mul_m4_v3(ob->obmat, v1);
+ mul_m4_v3(ob->obmat, v2);
+
+ sub_v3_v3v3(r_dir, v1, v2);
+ normalize_v3(r_dir);
+}
+
+static void select_similar_direction(bContext *C, const float thresh)
+{
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ Object *ob_act = CTX_data_edit_object(C);
+ EditBone *ebone_act = CTX_data_active_bone(C);
+
float dir_act[3];
- sub_v3_v3v3(dir_act, ebone_act->head, ebone_act->tail);
+ bone_direction_worldspace_get(ob_act, ebone_act, dir_act);
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (EBONE_SELECTABLE(arm, ebone)) {
- float dir[3];
- sub_v3_v3v3(dir, ebone->head, ebone->tail);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
+ bool changed = false;
- if (angle_v3v3(dir_act, dir) / (float)M_PI < thresh) {
- ED_armature_ebone_select_set(ebone, true);
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (EBONE_SELECTABLE(arm, ebone)) {
+ float dir[3];
+ bone_direction_worldspace_get(ob, ebone, dir);
+
+ if (angle_v3v3(dir_act, dir) / (float)M_PI < (thresh + FLT_EPSILON)) {
+ ED_armature_ebone_select_set(ebone, true);
+ changed = true;
+ }
}
}
+
+ if (changed) {
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ }
}
+ MEM_freeN(objects);
}
-static void select_similar_layer(bArmature *arm, EditBone *ebone_act)
+static void select_similar_layer(bContext *C)
{
- EditBone *ebone;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ EditBone *ebone_act = CTX_data_active_bone(C);
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (EBONE_SELECTABLE(arm, ebone)) {
- if (ebone->layer & ebone_act->layer) {
- ED_armature_ebone_select_set(ebone, true);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
+ bool changed = false;
+
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (EBONE_SELECTABLE(arm, ebone)) {
+ if (ebone->layer & ebone_act->layer) {
+ ED_armature_ebone_select_set(ebone, true);
+ changed = true;
+ }
}
}
+
+ if (changed) {
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ }
}
+ MEM_freeN(objects);
}
-static void select_similar_prefix(bArmature *arm, EditBone *ebone_act)
+static void select_similar_prefix(bContext *C)
{
- EditBone *ebone;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ EditBone *ebone_act = CTX_data_active_bone(C);
char body_tmp[MAXBONENAME];
char prefix_act[MAXBONENAME];
BLI_string_split_prefix(ebone_act->name, prefix_act, body_tmp, sizeof(ebone_act->name));
- if (prefix_act[0] == '\0')
+ if (prefix_act[0] == '\0') {
return;
+ }
- /* Find matches */
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (EBONE_SELECTABLE(arm, ebone)) {
- char prefix_other[MAXBONENAME];
- BLI_string_split_prefix(ebone->name, prefix_other, body_tmp, sizeof(ebone->name));
- if (STREQ(prefix_act, prefix_other)) {
- ED_armature_ebone_select_set(ebone, true);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
+ bool changed = false;
+
+ /* Find matches */
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (EBONE_SELECTABLE(arm, ebone)) {
+ char prefix_other[MAXBONENAME];
+ BLI_string_split_prefix(ebone->name, prefix_other, body_tmp, sizeof(ebone->name));
+ if (STREQ(prefix_act, prefix_other)) {
+ ED_armature_ebone_select_set(ebone, true);
+ changed = true;
+ }
}
}
+
+ if (changed) {
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ }
}
+ MEM_freeN(objects);
}
-static void select_similar_suffix(bArmature *arm, EditBone *ebone_act)
+static void select_similar_suffix(bContext *C)
{
- EditBone *ebone;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ EditBone *ebone_act = CTX_data_active_bone(C);
char body_tmp[MAXBONENAME];
char suffix_act[MAXBONENAME];
@@ -1059,28 +1141,46 @@ static void select_similar_suffix(bArmature *arm, EditBone *ebone_act)
if (suffix_act[0] == '\0')
return;
- /* Find matches */
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (EBONE_SELECTABLE(arm, ebone)) {
- char suffix_other[MAXBONENAME];
- BLI_string_split_suffix(ebone->name, body_tmp, suffix_other, sizeof(ebone->name));
- if (STREQ(suffix_act, suffix_other)) {
- ED_armature_ebone_select_set(ebone, true);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
+ bool changed = false;
+
+ /* Find matches */
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (EBONE_SELECTABLE(arm, ebone)) {
+ char suffix_other[MAXBONENAME];
+ BLI_string_split_suffix(ebone->name, body_tmp, suffix_other, sizeof(ebone->name));
+ if (STREQ(suffix_act, suffix_other)) {
+ ED_armature_ebone_select_set(ebone, true);
+ changed = true;
+ }
}
}
+
+ if (changed) {
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ }
}
+ MEM_freeN(objects);
}
/** Use for matching any pose channel data. */
static void select_similar_data_pchan(
- bArmature *arm, Object *obj, EditBone *ebone_active,
+ bContext *C,
const size_t bytes_size, const int offset)
{
- const bPoseChannel *pchan_active = BKE_pose_channel_find_name(obj->pose, ebone_active->name);
+ Object *obedit = CTX_data_edit_object(C);
+ bArmature *arm = obedit->data;
+ EditBone *ebone_act = CTX_data_active_bone(C);
+
+ const bPoseChannel *pchan_active = BKE_pose_channel_find_name(obedit->pose, ebone_act->name);
const char *data_active = (const char *)POINTER_OFFSET(pchan_active, offset);
for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
if (EBONE_SELECTABLE(arm, ebone)) {
- const bPoseChannel *pchan = BKE_pose_channel_find_name(obj->pose, ebone->name);
+ const bPoseChannel *pchan = BKE_pose_channel_find_name(obedit->pose, ebone->name);
if (pchan) {
const char *data_test = (const char *)POINTER_OFFSET(pchan, offset);
if (memcmp(data_active, data_test, bytes_size) == 0) {
@@ -1089,6 +1189,8 @@ static void select_similar_data_pchan(
}
}
}
+
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
}
static void is_ancestor(EditBone *bone, EditBone *ancestor)
@@ -1102,58 +1204,68 @@ static void is_ancestor(EditBone *bone, EditBone *ancestor)
bone->temp.ebone = bone->temp.ebone->temp.ebone;
}
-static void select_similar_children(bArmature *arm, EditBone *ebone_act)
+static void select_similar_children(bContext *C)
{
- EditBone *ebone_iter;
+ Object *obedit = CTX_data_edit_object(C);
+ bArmature *arm = obedit->data;
+ EditBone *ebone_act = CTX_data_active_bone(C);
- for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
+ for (EditBone *ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
ebone_iter->temp.ebone = ebone_iter->parent;
}
- for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
+ for (EditBone *ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
is_ancestor(ebone_iter, ebone_act);
if (ebone_iter->temp.ebone == ebone_act && EBONE_SELECTABLE(arm, ebone_iter))
ED_armature_ebone_select_set(ebone_iter, true);
}
+
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
}
-static void select_similar_children_immediate(bArmature *arm, EditBone *ebone_act)
+static void select_similar_children_immediate(bContext *C)
{
- EditBone *ebone_iter;
- for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
+ Object *obedit = CTX_data_edit_object(C);
+ bArmature *arm = obedit->data;
+ EditBone *ebone_act = CTX_data_active_bone(C);
+
+ for (EditBone *ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
if (ebone_iter->parent == ebone_act && EBONE_SELECTABLE(arm, ebone_iter)) {
ED_armature_ebone_select_set(ebone_iter, true);
}
}
+
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
}
-static void select_similar_siblings(bArmature *arm, EditBone *ebone_act)
+static void select_similar_siblings(bContext *C)
{
- EditBone *ebone_iter;
+ Object *obedit = CTX_data_edit_object(C);
+ bArmature *arm = obedit->data;
+ EditBone *ebone_act = CTX_data_active_bone(C);
- if (ebone_act->parent == NULL)
+ if (ebone_act->parent == NULL) {
return;
+ }
- for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
+ for (EditBone *ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
if (ebone_iter->parent == ebone_act->parent && EBONE_SELECTABLE(arm, ebone_iter)) {
ED_armature_ebone_select_set(ebone_iter, true);
}
}
+
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
}
static int armature_select_similar_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- bArmature *arm = obedit->data;
- EditBone *ebone_act = CTX_data_active_bone(C);
-
/* Get props */
int type = RNA_enum_get(op->ptr, "type");
float thresh = RNA_float_get(op->ptr, "threshold");
/* Check for active bone */
- if (ebone_act == NULL) {
+ if (CTX_data_active_bone(C) == NULL) {
BKE_report(op->reports, RPT_ERROR, "Operation requires an active bone");
return OPERATOR_CANCELLED;
}
@@ -1163,45 +1275,43 @@ static int armature_select_similar_exec(bContext *C, wmOperator *op)
switch (type) {
case SIMEDBONE_CHILDREN:
- select_similar_children(arm, ebone_act);
+ select_similar_children(C);
break;
case SIMEDBONE_CHILDREN_IMMEDIATE:
- select_similar_children_immediate(arm, ebone_act);
+ select_similar_children_immediate(C);
break;
case SIMEDBONE_SIBLINGS:
- select_similar_siblings(arm, ebone_act);
+ select_similar_siblings(C);
break;
case SIMEDBONE_LENGTH:
- select_similar_length(arm, ebone_act, thresh);
+ select_similar_length(C, thresh);
break;
case SIMEDBONE_DIRECTION:
- select_similar_direction(arm, ebone_act, thresh);
+ select_similar_direction(C, thresh);
break;
case SIMEDBONE_PREFIX:
- select_similar_prefix(arm, ebone_act);
+ select_similar_prefix(C);
break;
case SIMEDBONE_SUFFIX:
- select_similar_suffix(arm, ebone_act);
+ select_similar_suffix(C);
break;
case SIMEDBONE_LAYER:
- select_similar_layer(arm, ebone_act);
+ select_similar_layer(C);
break;
case SIMEDBONE_GROUP:
select_similar_data_pchan(
- arm, obedit, ebone_act,
+ C,
STRUCT_SIZE_AND_OFFSET(bPoseChannel, agrp_index));
break;
case SIMEDBONE_SHAPE:
select_similar_data_pchan(
- arm, obedit, ebone_act,
+ C,
STRUCT_SIZE_AND_OFFSET(bPoseChannel, custom));
break;
}
#undef STRUCT_SIZE_AND_OFFSET
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
-
return OPERATOR_FINISHED;
}
@@ -1227,18 +1337,16 @@ void ARMATURE_OT_select_similar(wmOperatorType *ot)
/* ********************* select hierarchy operator ************** */
+/* No need to convert to multi-objects. Just like we keep the non-active bones
+ * selected we then keep the non-active objects untouched (selected/unselected). */
static int armature_select_hierarchy_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- Object *ob;
- bArmature *arm;
+ Object *ob = CTX_data_edit_object(C);
EditBone *ebone_active;
int direction = RNA_enum_get(op->ptr, "direction");
const bool add_to_sel = RNA_boolean_get(op->ptr, "extend");
bool changed = false;
-
- ob = obedit;
- arm = (bArmature *)ob->data;
+ bArmature *arm = (bArmature *)ob->data;
ebone_active = arm->act_edbone;
if (ebone_active == NULL) {
@@ -1339,49 +1447,57 @@ void ARMATURE_OT_select_hierarchy(wmOperatorType *ot)
*/
static int armature_select_mirror_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- bArmature *arm = obedit->data;
- EditBone *ebone, *ebone_mirror_act = NULL;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
const bool active_only = RNA_boolean_get(op->ptr, "only_active");
const bool extend = RNA_boolean_get(op->ptr, "extend");
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- const int flag = ED_armature_ebone_selectflag_get(ebone);
- EBONE_PREV_FLAG_SET(ebone, flag);
- }
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (EBONE_SELECTABLE(arm, ebone)) {
- EditBone *ebone_mirror;
- int flag_new = extend ? EBONE_PREV_FLAG_GET(ebone) : 0;
+ EditBone *ebone, *ebone_mirror_act = NULL;
- if ((ebone_mirror = ED_armature_ebone_get_mirrored(arm->edbo, ebone)) &&
- (EBONE_VISIBLE(arm, ebone_mirror)))
- {
- const int flag_mirror = EBONE_PREV_FLAG_GET(ebone_mirror);
- flag_new |= flag_mirror;
+ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ const int flag = ED_armature_ebone_selectflag_get(ebone);
+ EBONE_PREV_FLAG_SET(ebone, flag);
+ }
- if (ebone == arm->act_edbone) {
- ebone_mirror_act = ebone_mirror;
- }
+ for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (EBONE_SELECTABLE(arm, ebone)) {
+ EditBone *ebone_mirror;
+ int flag_new = extend ? EBONE_PREV_FLAG_GET(ebone) : 0;
- /* skip all but the active or its mirror */
- if (active_only && !ELEM(arm->act_edbone, ebone, ebone_mirror)) {
- continue;
+ if ((ebone_mirror = ED_armature_ebone_get_mirrored(arm->edbo, ebone)) &&
+ (EBONE_VISIBLE(arm, ebone_mirror)))
+ {
+ const int flag_mirror = EBONE_PREV_FLAG_GET(ebone_mirror);
+ flag_new |= flag_mirror;
+
+ if (ebone == arm->act_edbone) {
+ ebone_mirror_act = ebone_mirror;
+ }
+
+ /* skip all but the active or its mirror */
+ if (active_only && !ELEM(arm->act_edbone, ebone, ebone_mirror)) {
+ continue;
+ }
}
- }
- ED_armature_ebone_selectflag_set(ebone, flag_new);
+ ED_armature_ebone_selectflag_set(ebone, flag_new);
+ }
}
- }
- if (ebone_mirror_act) {
- arm->act_edbone = ebone_mirror_act;
- }
+ if (ebone_mirror_act) {
+ arm->act_edbone = ebone_mirror_act;
+ }
- ED_armature_edit_sync_selection(arm->edbo);
+ ED_armature_edit_sync_selection(arm->edbo);
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/armature/armature_skinning.c b/source/blender/editors/armature/armature_skinning.c
index 63068e61ba3..c68c2720b0b 100644
--- a/source/blender/editors/armature/armature_skinning.c
+++ b/source/blender/editors/armature/armature_skinning.c
@@ -104,7 +104,7 @@ static int bone_skinnable_cb(Object *UNUSED(ob), Bone *bone, void *datap)
for (a = 0; a < segments; a++) {
**hbone = bone;
- ++*hbone;
+ (*hbone)++;
}
}
return segments;
@@ -180,7 +180,7 @@ static int dgroup_skinnable_cb(Object *ob, Bone *bone, void *datap)
for (a = 0; a < segments; a++) {
**hgroup = defgroup;
- ++*hgroup;
+ (*hgroup)++;
}
}
return segments;
@@ -325,7 +325,7 @@ static void add_verts_to_dgroups(
if ((par->pose) && (pchan = BKE_pose_channel_find_name(par->pose, bone->name))) {
if (bone->segments > 1) {
segments = bone->segments;
- b_bone_spline_setup(pchan, 1, bbone_array);
+ b_bone_spline_setup(pchan, true, bbone_array);
bbone = bbone_array;
}
}
diff --git a/source/blender/editors/armature/armature_utils.c b/source/blender/editors/armature/armature_utils.c
index 2b28b76bcf6..339f0306779 100644
--- a/source/blender/editors/armature/armature_utils.c
+++ b/source/blender/editors/armature/armature_utils.c
@@ -131,6 +131,16 @@ void bone_free(bArmature *arm, EditBone *bone)
MEM_freeN(bone->prop);
}
+ /* Clear references from other edit bones. */
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (ebone->bbone_next == bone) {
+ ebone->bbone_next = NULL;
+ }
+ if (ebone->bbone_prev == bone) {
+ ebone->bbone_prev = NULL;
+ }
+ }
+
BLI_freelinkN(arm->edbo, bone);
}
@@ -426,7 +436,7 @@ void ED_armature_edit_transform_mirror_update(Object *obedit)
/* Armature EditMode Conversions */
/* converts Bones to EditBone list, used for tools as well */
-EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone *actBone)
+static EditBone *make_boneList_rec(ListBase *edbo, ListBase *bones, EditBone *parent, Bone *actBone)
{
EditBone *eBone;
EditBone *eBoneAct = NULL;
@@ -435,6 +445,7 @@ EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone
for (curBone = bones->first; curBone; curBone = curBone->next) {
eBone = MEM_callocN(sizeof(EditBone), "make_editbone");
+ eBone->temp.bone = curBone;
/* Copy relevant data from bone to eBone
* Keep selection logic in sync with ED_armature_edit_sync_selection.
@@ -490,6 +501,9 @@ EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone
eBone->scaleIn = curBone->scaleIn;
eBone->scaleOut = curBone->scaleOut;
+ eBone->bbone_prev_type = curBone->bbone_prev_type;
+ eBone->bbone_next_type = curBone->bbone_next_type;
+
if (curBone->prop)
eBone->prop = IDP_CopyProperty(curBone->prop);
@@ -497,7 +511,7 @@ EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone
/* Add children if necessary */
if (curBone->childbase.first) {
- eBoneTest = make_boneList(edbo, &curBone->childbase, eBone, actBone);
+ eBoneTest = make_boneList_rec(edbo, &curBone->childbase, eBone, actBone);
if (eBoneTest)
eBoneAct = eBoneTest;
}
@@ -509,6 +523,36 @@ EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone
return eBoneAct;
}
+static EditBone *find_ebone_link(ListBase *edbo, Bone *link)
+{
+ if (link != NULL) {
+ for (EditBone *ebone = edbo->first; ebone; ebone = ebone->next) {
+ if (ebone->temp.bone == link) {
+ return ebone;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+EditBone *make_boneList(ListBase *edbo, ListBase *bones, struct Bone *actBone)
+{
+ BLI_assert(!edbo->first && !edbo->last);
+
+ EditBone *active = make_boneList_rec(edbo, bones, NULL, actBone);
+
+ for (EditBone *ebone = edbo->first; ebone; ebone = ebone->next) {
+ Bone *bone = ebone->temp.bone;
+
+ /* Convert custom B-Bone handle links. */
+ ebone->bbone_prev = find_ebone_link(edbo, bone->bbone_prev);
+ ebone->bbone_next = find_ebone_link(edbo, bone->bbone_next);
+ }
+
+ return active;
+}
+
/* This function:
* - sets local head/tail rest locations using parent bone's arm_mat.
* - calls BKE_armature_where_is_bone() which uses parent's transform (arm_mat) to define this bone's transform.
@@ -655,6 +699,8 @@ void ED_armature_from_edit(Main *bmain, bArmature *arm)
newBone->scaleIn = eBone->scaleIn;
newBone->scaleOut = eBone->scaleOut;
+ newBone->bbone_prev_type = eBone->bbone_prev_type;
+ newBone->bbone_next_type = eBone->bbone_next_type;
if (eBone->prop)
newBone->prop = IDP_CopyProperty(eBone->prop);
@@ -673,6 +719,14 @@ void ED_armature_from_edit(Main *bmain, bArmature *arm)
else {
BLI_addtail(&arm->bonebase, newBone);
}
+
+ /* Also transfer B-Bone custom handles. */
+ if (eBone->bbone_prev) {
+ newBone->bbone_prev = eBone->bbone_prev->temp.bone;
+ }
+ if (eBone->bbone_next) {
+ newBone->bbone_next = eBone->bbone_next->temp.bone;
+ }
}
/* Finalize definition of restpose data (roll, bone_mat, arm_mat, head/tail...). */
@@ -715,7 +769,7 @@ void ED_armature_to_edit(bArmature *arm)
{
ED_armature_edit_free(arm);
arm->edbo = MEM_callocN(sizeof(ListBase), "edbo armature");
- arm->act_edbone = make_boneList(arm->edbo, &arm->bonebase, NULL, arm->act_bone);
+ arm->act_edbone = make_boneList(arm->edbo, &arm->bonebase, arm->act_bone);
}
/* *************************************************************** */
diff --git a/source/blender/editors/armature/editarmature_retarget.c b/source/blender/editors/armature/editarmature_retarget.c
index b74b515b37f..0c770bcbcc4 100644
--- a/source/blender/editors/armature/editarmature_retarget.c
+++ b/source/blender/editors/armature/editarmature_retarget.c
@@ -665,7 +665,7 @@ static int RIG_parentControl(RigControl *ctrl, EditBone *link)
}
/* if there's already a link
- * overwrite only if new link is higher in the chain */
+ * overwrite only if new link is higher in the chain */
if (ctrl->link && flag == ctrl->flag) {
EditBone *bone = NULL;
@@ -1348,7 +1348,7 @@ RigGraph *RIG_graphFromArmature(const bContext *C, Object *ob, bArmature *arm)
}
else {
rg->editbones = MEM_callocN(sizeof(ListBase), "EditBones");
- make_boneList(rg->editbones, &arm->bonebase, NULL, NULL);
+ make_boneList(rg->editbones, &arm->bonebase, NULL);
rg->flag |= RIG_FREE_BONELIST;
}
@@ -1396,7 +1396,7 @@ static RigGraph *armatureSelectedToGraph(bContext *C, Object *ob, bArmature *arm
}
else {
rg->editbones = MEM_callocN(sizeof(ListBase), "EditBones");
- make_boneList(rg->editbones, &arm->bonebase, NULL, NULL);
+ make_boneList(rg->editbones, &arm->bonebase, NULL);
rg->flag |= RIG_FREE_BONELIST;
}
diff --git a/source/blender/editors/armature/pose_edit.c b/source/blender/editors/armature/pose_edit.c
index 62f0f107360..b10afa3a6de 100644
--- a/source/blender/editors/armature/pose_edit.c
+++ b/source/blender/editors/armature/pose_edit.c
@@ -193,31 +193,48 @@ static bool pose_has_protected_selected(Object *ob, short warn)
*
* To be called from various tools that do incremental updates
*/
-void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob)
+void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob, bool current_frame_only)
{
- struct Main *bmain = CTX_data_main(C);
+ /* Transform doesn't always have context available to do update. */
+ if (C == NULL) {
+ return;
+ }
+
+ Main *bmain = CTX_data_main(C);
Depsgraph *depsgraph = CTX_data_depsgraph(C);
ListBase targets = {NULL, NULL};
bool free_depsgraph = false;
/* Override depsgraph with a filtered, simpler copy */
- if (G.debug_value != -1) {
- TIMEIT_START(filter_pose_depsgraph);
- DEG_FilterQuery query = {0};
+ if (!current_frame_only && G.debug_value != -1) {
+ DEG_FilterQuery query = {{0}};
DEG_FilterTarget *dft_ob = MEM_callocN(sizeof(DEG_FilterTarget), "DEG_FilterTarget");
dft_ob->id = &ob->id;
BLI_addtail(&query.targets, dft_ob);
+#ifdef DEBUG_TIME
+ TIMEIT_START(filter_pose_depsgraph);
+#endif
+
depsgraph = DEG_graph_filter(depsgraph, bmain, &query);
- free_depsgraph = true;
- MEM_freeN(dft_ob);
+#ifdef DEBUG_TIME
TIMEIT_END(filter_pose_depsgraph);
+#endif
+
+ free_depsgraph = true;
+ MEM_freeN(dft_ob);
+#ifdef DEBUG_TIME
TIMEIT_START(filter_pose_update);
+#endif
+
BKE_scene_graph_update_tagged(depsgraph, bmain);
+
+#ifdef DEBUG_TIME
TIMEIT_END(filter_pose_update);
+#endif
}
/* set flag to force recalc, then grab the relevant bones to target */
@@ -225,14 +242,23 @@ void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob)
animviz_get_object_motionpaths(ob, &targets);
/* recalculate paths, then free */
+#ifdef DEBUG_TIME
TIMEIT_START(pose_path_calc);
- animviz_calc_motionpaths(depsgraph, bmain, scene, &targets);
+#endif
+
+ animviz_calc_motionpaths(depsgraph, bmain, scene, &targets, !free_depsgraph, current_frame_only);
+
+#ifdef DEBUG_TIME
TIMEIT_END(pose_path_calc);
+#endif
BLI_freelistN(&targets);
- /* tag armature object for copy on write - so paths will draw/redraw */
- DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE);
+ if (!current_frame_only) {
+ /* Tag armature object for copy on write - so paths will draw/redraw.
+ * For currently frame only we update evaluated object directly. */
+ DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE);
+ }
/* Free temporary depsgraph instance */
if (free_depsgraph) {
@@ -263,7 +289,7 @@ static int pose_calculate_paths_invoke(bContext *C, wmOperator *op, const wmEven
/* show popup dialog to allow editing of range... */
// FIXME: hardcoded dimensions here are just arbitrary
- return WM_operator_props_dialog_popup(C, op, 10 * UI_UNIT_X, 10 * UI_UNIT_Y);
+ return WM_operator_props_dialog_popup(C, op, 200, 200);
}
/* For the object with pose/action: create path curves for selected bones
@@ -290,7 +316,7 @@ static int pose_calculate_paths_exec(bContext *C, wmOperator *op)
}
/* set up path data for bones being calculated */
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones)
+ CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones_from_active_object)
{
/* verify makes sure that the selected bone has a bone with the appropriate settings */
animviz_verify_motionpaths(op->reports, scene, ob, pchan);
@@ -303,7 +329,7 @@ static int pose_calculate_paths_exec(bContext *C, wmOperator *op)
/* calculate the bones that now have motionpaths... */
/* TODO: only make for the selected bones? */
- ED_pose_recalculate_paths(C, scene, ob);
+ ED_pose_recalculate_paths(C, scene, ob, false);
#ifdef DEBUG_TIME
TIMEIT_END(recalc_pose_paths);
@@ -364,7 +390,7 @@ static int pose_update_paths_exec(bContext *C, wmOperator *UNUSED(op))
/* calculate the bones that now have motionpaths... */
/* TODO: only make for the selected bones? */
- ED_pose_recalculate_paths(C, scene, ob);
+ ED_pose_recalculate_paths(C, scene, ob, false);
/* notifiers for updates */
WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
@@ -767,30 +793,29 @@ void POSE_OT_flip_names(wmOperatorType *ot)
static int pose_autoside_names_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
- Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C));
- bArmature *arm;
char newname[MAXBONENAME];
short axis = RNA_enum_get(op->ptr, "axis");
-
- /* paranoia checks */
- if (ELEM(NULL, ob, ob->pose))
- return OPERATOR_CANCELLED;
- arm = ob->data;
+ Object *ob_prev = NULL;
/* loop through selected bones, auto-naming them */
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones)
+ CTX_DATA_BEGIN_WITH_ID(C, bPoseChannel *, pchan, selected_pose_bones, Object *, ob)
{
+ bArmature *arm = ob->data;
BLI_strncpy(newname, pchan->name, sizeof(newname));
- if (bone_autoside_name(newname, 1, axis, pchan->bone->head[axis], pchan->bone->tail[axis]))
+ if (bone_autoside_name(newname, 1, axis, pchan->bone->head[axis], pchan->bone->tail[axis])) {
ED_armature_bone_rename(bmain, arm, pchan->name, newname);
- }
- CTX_DATA_END;
+ }
- /* since we renamed stuff... */
- DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ if (ob_prev != ob) {
+ /* since we renamed stuff... */
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
+ ob_prev = ob;
+ }
+ }
+ CTX_DATA_END;
return OPERATOR_FINISHED;
}
@@ -825,20 +850,24 @@ void POSE_OT_autoside_names(wmOperatorType *ot)
static int pose_bone_rotmode_exec(bContext *C, wmOperator *op)
{
- Object *ob = CTX_data_active_object(C);
- int mode = RNA_enum_get(op->ptr, "type");
+ const int mode = RNA_enum_get(op->ptr, "type");
+ Object *prev_ob = NULL;
/* set rotation mode of selected bones */
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones)
+ CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, selected_pose_bones, Object *, ob)
{
pchan->rotmode = mode;
+
+ if (prev_ob != ob) {
+ /* Notifiers and updates. */
+ DEG_id_tag_update((ID *)ob, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, ob);
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ prev_ob = ob;
+ }
}
CTX_DATA_END;
- /* notifiers and updates */
- DEG_id_tag_update((ID *)ob, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, ob);
-
return OPERATOR_FINISHED;
}
@@ -904,8 +933,8 @@ static int pose_armature_layers_showall_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
/* use RNA to set the layers
- * although it would be faster to just set directly using bitflags, we still
- * need to setup a RNA pointer so that we get the "update" callbacks for free...
+ * although it would be faster to just set directly using bitflags, we still
+ * need to setup a RNA pointer so that we get the "update" callbacks for free...
*/
RNA_id_pointer_create(&arm->id, &ptr);
@@ -1037,30 +1066,29 @@ static int pose_bone_layers_invoke(bContext *C, wmOperator *op, const wmEvent *e
/* Set the visible layers for the active armature (edit and pose modes) */
static int pose_bone_layers_exec(bContext *C, wmOperator *op)
{
- Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C));
PointerRNA ptr;
bool layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
- if (ob == NULL || ob->data == NULL) {
- return OPERATOR_CANCELLED;
- }
-
/* get the values set in the operator properties */
RNA_boolean_get_array(op->ptr, "layers", layers);
+ Object *prev_ob = NULL;
+
/* set layers of pchans based on the values set in the operator props */
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones)
+ CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, selected_pose_bones, Object *, ob)
{
/* get pointer for pchan, and write flags this way */
RNA_pointer_create((ID *)ob->data, &RNA_Bone, pchan->bone, &ptr);
RNA_boolean_set_array(&ptr, "layers", layers);
+
+ if (prev_ob != ob) {
+ /* Note, notifier might evolve. */
+ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
+ DEG_id_tag_update((ID *)ob->data, DEG_TAG_COPY_ON_WRITE);
+ prev_ob = ob;
+ }
}
CTX_DATA_END;
-
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
- DEG_id_tag_update((ID *)ob->data, DEG_TAG_COPY_ON_WRITE);
-
return OPERATOR_FINISHED;
}
@@ -1161,7 +1189,7 @@ void ARMATURE_OT_bone_layers(wmOperatorType *ot)
static int hide_pose_bone_fn(Object *ob, Bone *bone, void *ptr)
{
bArmature *arm = ob->data;
- const bool hide_select = (bool)GET_INT_FROM_POINTER(ptr);
+ const bool hide_select = (bool)POINTER_AS_INT(ptr);
int count = 0;
if (arm->layer & bone->layer) {
if (((bone->flag & BONE_SELECTED) != 0) == hide_select) {
@@ -1186,7 +1214,7 @@ static int pose_hide_exec(bContext *C, wmOperator *op)
bool changed_multi = false;
const int hide_select = !RNA_boolean_get(op->ptr, "unselected");
- void *hide_select_p = SET_INT_IN_POINTER(hide_select);
+ void *hide_select_p = POINTER_FROM_INT(hide_select);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
Object *ob_iter = objects[ob_index];
@@ -1228,7 +1256,7 @@ void POSE_OT_hide(wmOperatorType *ot)
static int show_pose_bone_cb(Object *ob, Bone *bone, void *data)
{
- const bool select = GET_INT_FROM_POINTER(data);
+ const bool select = POINTER_AS_INT(data);
bArmature *arm = ob->data;
int count = 0;
@@ -1253,7 +1281,7 @@ static int pose_reveal_exec(bContext *C, wmOperator *op)
Object **objects = BKE_object_pose_array_get_unique(view_layer, &objects_len);
bool changed_multi = false;
const bool select = RNA_boolean_get(op->ptr, "select");
- void *select_p = SET_INT_IN_POINTER(select);
+ void *select_p = POINTER_FROM_INT(select);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
Object *ob_iter = objects[ob_index];
diff --git a/source/blender/editors/armature/pose_lib.c b/source/blender/editors/armature/pose_lib.c
index 2227bf33908..eeefcf39799 100644
--- a/source/blender/editors/armature/pose_lib.c
+++ b/source/blender/editors/armature/pose_lib.c
@@ -43,13 +43,13 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "BKE_animsys.h"
#include "BKE_action.h"
+#include "BKE_animsys.h"
#include "BKE_armature.h"
#include "BKE_global.h"
#include "BKE_idprop.h"
-#include "BKE_main.h"
#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_object.h"
#include "BKE_context.h"
@@ -312,8 +312,7 @@ static int poselib_sanitize_exec(bContext *C, wmOperator *op)
/* determine which frames have keys */
BLI_dlrbTree_init(&keys);
- action_to_keylist(NULL, act, &keys, NULL);
- BLI_dlrbTree_linkedlist_sync(&keys);
+ action_to_keylist(NULL, act, &keys, 0);
/* for each key, make sure there is a corresponding pose */
for (ak = keys.first; ak; ak = ak->next) {
@@ -1027,7 +1026,7 @@ static void poselib_apply_pose(tPoseLib_PreviewData *pld)
}
if (ok)
- animsys_evaluate_action_group(ptr, act, agrp, NULL, (float)frame);
+ animsys_evaluate_action_group(ptr, act, agrp, (float)frame);
}
}
}
diff --git a/source/blender/editors/armature/pose_select.c b/source/blender/editors/armature/pose_select.c
index eb178d422ae..0c7de754482 100644
--- a/source/blender/editors/armature/pose_select.c
+++ b/source/blender/editors/armature/pose_select.c
@@ -66,8 +66,8 @@
#include "armature_intern.h"
/* utility macros for storing a temp int in the bone (selection flag) */
-#define PBONE_PREV_FLAG_GET(pchan) ((void)0, (GET_INT_FROM_POINTER((pchan)->temp)))
-#define PBONE_PREV_FLAG_SET(pchan, val) ((pchan)->temp = SET_INT_IN_POINTER(val))
+#define PBONE_PREV_FLAG_GET(pchan) ((void)0, (POINTER_AS_INT((pchan)->temp)))
+#define PBONE_PREV_FLAG_SET(pchan, val) ((pchan)->temp = POINTER_FROM_INT(val))
/* ***************** Pose Select Utilities ********************* */
@@ -459,34 +459,27 @@ void POSE_OT_select_all(wmOperatorType *ot)
static int pose_select_parent_exec(bContext *C, wmOperator *UNUSED(op))
{
- /* only clear relevant transforms for selected bones */
- ViewLayer *view_layer = CTX_data_view_layer(C);
- FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, OB_MODE_POSE, ob_iter)
- {
- Object *ob = ob_iter;
- bArmature *arm = (bArmature *)ob->data;
-
- FOREACH_PCHAN_SELECTED_IN_OBJECT_BEGIN (ob_iter, pchan)
- {
- if (pchan) {
- bPoseChannel *parent = pchan->parent;
- if ((parent) && !(parent->bone->flag & (BONE_HIDDEN_P | BONE_UNSELECTABLE))) {
- parent->bone->flag |= BONE_SELECTED;
- arm->act_bone = parent->bone;
- }
- else {
- continue;
- }
- }
- else {
- continue;
- }
- ED_pose_bone_select_tag_update(ob);
+ Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C));
+ bArmature *arm = (bArmature *)ob->data;
+ bPoseChannel *pchan, *parent;
+
+ /* Determine if there is an active bone */
+ pchan = CTX_data_active_pose_bone(C);
+ if (pchan) {
+ parent = pchan->parent;
+ if ((parent) && !(parent->bone->flag & (BONE_HIDDEN_P | BONE_UNSELECTABLE))) {
+ parent->bone->flag |= BONE_SELECTED;
+ arm->act_bone = parent->bone;
}
- FOREACH_PCHAN_SELECTED_IN_OBJECT_END;
+ else {
+ return OPERATOR_CANCELLED;
+ }
+ }
+ else {
+ return OPERATOR_CANCELLED;
}
- FOREACH_OBJECT_IN_MODE_END;
+ ED_pose_bone_select_tag_update(ob);
return OPERATOR_FINISHED;
}
@@ -511,9 +504,8 @@ static int pose_select_constraint_target_exec(bContext *C, wmOperator *UNUSED(op
{
bConstraint *con;
int found = 0;
- Object *ob_prev = NULL;
- CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, visible_pose_bones, Object *, ob)
+ CTX_DATA_BEGIN (C, bPoseChannel *, pchan, visible_pose_bones)
{
if (pchan->bone->flag & BONE_SELECTED) {
for (con = pchan->constraints.first; con; con = con->next) {
@@ -525,16 +517,19 @@ static int pose_select_constraint_target_exec(bContext *C, wmOperator *UNUSED(op
cti->get_constraint_targets(con, &targets);
for (ct = targets.first; ct; ct = ct->next) {
- if ((ct->tar == ob) && (ct->subtarget[0])) {
+ Object *ob = ct->tar;
+
+ /* Any armature that is also in pose mode should be selected. */
+ if ((ct->subtarget[0] != '\0') &&
+ (ob != NULL) &&
+ (ob->type == OB_ARMATURE) &&
+ (ob->mode == OB_MODE_POSE))
+ {
bPoseChannel *pchanc = BKE_pose_channel_find_name(ob->pose, ct->subtarget);
if ((pchanc) && !(pchanc->bone->flag & BONE_UNSELECTABLE)) {
pchanc->bone->flag |= BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL;
+ ED_pose_bone_select_tag_update(ob);
found = 1;
-
- if (ob != ob_prev) {
- ED_pose_bone_select_tag_update(ob);
- ob_prev = ob;
- }
}
}
}
@@ -570,6 +565,8 @@ void POSE_OT_select_constraint_target(wmOperatorType *ot)
/* -------------------------------------- */
+/* No need to convert to multi-objects. Just like we keep the non-active bones
+ * selected we then keep the non-active objects untouched (selected/unselected). */
static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
{
Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C));
@@ -675,113 +672,200 @@ typedef enum ePose_SelectSame_Mode {
POSE_SEL_SAME_KEYINGSET = 2,
} ePose_SelectSame_Mode;
-static bool pose_select_same_group(bContext *C, Object *ob, bool extend)
+static bool pose_select_same_group(bContext *C, bool extend)
{
- bArmature *arm = (ob) ? ob->data : NULL;
- bPose *pose = (ob) ? ob->pose : NULL;
- char *group_flags;
- int numGroups = 0;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ bool *group_flags_array;
+ bool *group_flags = NULL;
+ int groups_len = 0;
bool changed = false, tagged = false;
+ Object *ob_prev = NULL;
+ uint ob_index;
+
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, &objects_len, OB_MODE_POSE);
+ for (ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = BKE_object_pose_armature_get(objects[ob_index]);
+ bArmature *arm = (ob) ? ob->data : NULL;
+ bPose *pose = (ob) ? ob->pose : NULL;
+
+ /* Sanity checks. */
+ if (ELEM(NULL, ob, pose, arm)) {
+ continue;
+ }
- /* sanity checks */
- if (ELEM(NULL, ob, pose, arm))
- return 0;
+ ob->id.tag &= ~LIB_TAG_DOIT;
+ groups_len = MAX2(groups_len, BLI_listbase_count(&pose->agroups));
+ }
- /* count the number of groups */
- numGroups = BLI_listbase_count(&pose->agroups);
- if (numGroups == 0)
- return 0;
+ /* Nothing to do here. */
+ if (groups_len == 0) {
+ MEM_freeN(objects);
+ return false;
+ }
/* alloc a small array to keep track of the groups to use
* - each cell stores on/off state for whether group should be used
- * - size is (numGroups + 1), since (index = 0) is used for no-group
+ * - size is (groups_len + 1), since (index = 0) is used for no-group
*/
- group_flags = MEM_callocN(numGroups + 1, "pose_select_same_group");
+ groups_len++;
+ group_flags_array = MEM_callocN(objects_len * groups_len * sizeof(bool), "pose_select_same_group");
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, visible_pose_bones)
+ group_flags = NULL;
+ ob_index = -1;
+ ob_prev = NULL;
+ CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, visible_pose_bones, Object, *ob)
{
+ if (ob != ob_prev) {
+ ob_index++;
+ group_flags = group_flags_array + (ob_index * groups_len);
+ ob_prev = ob;
+ }
+
/* keep track of group as group to use later? */
if (pchan->bone->flag & BONE_SELECTED) {
- group_flags[pchan->agrp_index] = 1;
+ group_flags[pchan->agrp_index] = true;
tagged = true;
}
/* deselect all bones before selecting new ones? */
- if ((extend == false) && (pchan->bone->flag & BONE_UNSELECTABLE) == 0)
+ if ((extend == false) && (pchan->bone->flag & BONE_UNSELECTABLE) == 0) {
pchan->bone->flag &= ~BONE_SELECTED;
+ }
}
CTX_DATA_END;
/* small optimization: only loop through bones a second time if there are any groups tagged */
if (tagged) {
+ group_flags = NULL;
+ ob_index = -1;
+ ob_prev = NULL;
/* only if group matches (and is not selected or current bone) */
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, visible_pose_bones)
+ CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, visible_pose_bones, Object *, ob)
{
+ if (ob != ob_prev) {
+ ob_index++;
+ group_flags = group_flags_array + (ob_index * groups_len);
+ ob_prev = ob;
+ }
+
if ((pchan->bone->flag & BONE_UNSELECTABLE) == 0) {
/* check if the group used by this bone is counted */
if (group_flags[pchan->agrp_index]) {
pchan->bone->flag |= BONE_SELECTED;
- changed = true;
+ ob->id.tag |= LIB_TAG_DOIT;
}
}
}
CTX_DATA_END;
}
- /* free temp info */
- MEM_freeN(group_flags);
+ for (ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ if (ob->id.tag & LIB_TAG_DOIT) {
+ ED_pose_bone_select_tag_update(ob);
+ changed = true;
+ }
+ }
+
+ /* Cleanup. */
+ MEM_freeN(group_flags_array);
+ MEM_freeN(objects);
return changed;
}
-static bool pose_select_same_layer(bContext *C, Object *ob, bool extend)
+static bool pose_select_same_layer(bContext *C, bool extend)
{
- bPose *pose = (ob) ? ob->pose : NULL;
- bArmature *arm = (ob) ? ob->data : NULL;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ int *layers_array, *layers = NULL;
+ Object *ob_prev = NULL;
+ uint ob_index;
bool changed = false;
- int layers = 0;
- if (ELEM(NULL, ob, pose, arm))
- return 0;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, &objects_len, OB_MODE_POSE);
+ for (ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ ob->id.tag &= ~LIB_TAG_DOIT;
+ }
- /* figure out what bones are selected */
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, visible_pose_bones)
+ layers_array = MEM_callocN(objects_len * sizeof(*layers_array), "pose_select_same_layer");
+
+ /* Figure out what bones are selected. */
+ layers = NULL;
+ ob_prev = NULL;
+ ob_index = -1;
+ CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, visible_pose_bones, Object *, ob)
{
- /* keep track of layers to use later? */
+ if (ob != ob_prev) {
+ layers = &layers_array[++ob_index];
+ ob_prev = ob;
+ }
+
+ /* Keep track of layers to use later? */
if (pchan->bone->flag & BONE_SELECTED)
- layers |= pchan->bone->layer;
+ *layers |= pchan->bone->layer;
- /* deselect all bones before selecting new ones? */
+ /* Deselect all bones before selecting new ones? */
if ((extend == false) && (pchan->bone->flag & BONE_UNSELECTABLE) == 0)
pchan->bone->flag &= ~BONE_SELECTED;
}
CTX_DATA_END;
- if (layers == 0)
- return 0;
- /* select bones that are on same layers as layers flag */
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, visible_pose_bones)
+ bool any_layer = false;
+ for (ob_index = 0; ob_index < objects_len; ob_index++) {
+ if (layers_array[ob_index]) {
+ any_layer = true;
+ break;
+ }
+ }
+
+ if (!any_layer) {
+ goto cleanup;
+ }
+
+ /* Select bones that are on same layers as layers flag. */
+ ob_prev = NULL;
+ ob_index = -1;
+ CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, visible_pose_bones, Object *, ob)
{
+ if (ob != ob_prev) {
+ layers = &layers_array[++ob_index];
+ ob_prev = ob;
+ }
+
/* if bone is on a suitable layer, and the bone can have its selection changed, select it */
- if ((layers & pchan->bone->layer) && (pchan->bone->flag & BONE_UNSELECTABLE) == 0) {
+ if ((*layers & pchan->bone->layer) && (pchan->bone->flag & BONE_UNSELECTABLE) == 0) {
pchan->bone->flag |= BONE_SELECTED;
- changed = true;
+ ob->id.tag |= LIB_TAG_DOIT;
}
}
CTX_DATA_END;
+ for (ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ if (ob->id.tag & LIB_TAG_DOIT) {
+ ED_pose_bone_select_tag_update(ob);
+ changed = true;
+ }
+ }
+
+cleanup:
+ /* Cleanup. */
+ MEM_freeN(layers_array);
+ MEM_freeN(objects);
+
return changed;
}
-static bool pose_select_same_keyingset(bContext *C, ReportList *reports, Object *ob, bool extend)
+static bool pose_select_same_keyingset(bContext *C, ReportList *reports, bool extend)
{
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ bool changed_multi = false;
KeyingSet *ks = ANIM_scene_get_active_keyingset(CTX_data_scene(C));
KS_Path *ksp;
- bArmature *arm = (ob) ? ob->data : NULL;
- bPose *pose = (ob) ? ob->pose : NULL;
- bool changed = false;
-
/* sanity checks: validate Keying Set and object */
if (ks == NULL) {
BKE_report(reports, RPT_ERROR, "No active Keying Set to use");
@@ -801,9 +885,6 @@ static bool pose_select_same_keyingset(bContext *C, ReportList *reports, Object
return false;
}
- if (ELEM(NULL, ob, pose, arm))
- return false;
-
/* if not extending selection, deselect all selected first */
if (extend == false) {
CTX_DATA_BEGIN (C, bPoseChannel *, pchan, visible_pose_bones)
@@ -814,34 +895,54 @@ static bool pose_select_same_keyingset(bContext *C, ReportList *reports, Object
CTX_DATA_END;
}
- /* iterate over elements in the Keying Set, setting selection depending on whether
- * that bone is visible or not...
- */
- for (ksp = ks->paths.first; ksp; ksp = ksp->next) {
- /* only items related to this object will be relevant */
- if ((ksp->id == &ob->id) && (ksp->rna_path != NULL)) {
- if (strstr(ksp->rna_path, "bones")) {
- char *boneName = BLI_str_quoted_substrN(ksp->rna_path, "bones[");
-
- if (boneName) {
- bPoseChannel *pchan = BKE_pose_channel_find_name(pose, boneName);
-
- if (pchan) {
- /* select if bone is visible and can be affected */
- if (PBONE_SELECTABLE(arm, pchan->bone)) {
- pchan->bone->flag |= BONE_SELECTED;
- changed = true;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, &objects_len, OB_MODE_POSE);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = BKE_object_pose_armature_get(objects[ob_index]);
+ bArmature *arm = (ob) ? ob->data : NULL;
+ bPose *pose = (ob) ? ob->pose : NULL;
+ bool changed = false;
+
+ /* Sanity checks. */
+ if (ELEM(NULL, ob, pose, arm)) {
+ continue;
+ }
+
+ /* iterate over elements in the Keying Set, setting selection depending on whether
+ * that bone is visible or not...
+ */
+ for (ksp = ks->paths.first; ksp; ksp = ksp->next) {
+ /* only items related to this object will be relevant */
+ if ((ksp->id == &ob->id) && (ksp->rna_path != NULL)) {
+ if (strstr(ksp->rna_path, "bones")) {
+ char *boneName = BLI_str_quoted_substrN(ksp->rna_path, "bones[");
+
+ if (boneName) {
+ bPoseChannel *pchan = BKE_pose_channel_find_name(pose, boneName);
+
+ if (pchan) {
+ /* select if bone is visible and can be affected */
+ if (PBONE_SELECTABLE(arm, pchan->bone)) {
+ pchan->bone->flag |= BONE_SELECTED;
+ changed = true;
+ }
}
- }
- /* free temp memory */
- MEM_freeN(boneName);
+ /* free temp memory */
+ MEM_freeN(boneName);
+ }
}
}
}
+
+ if (changed || !extend) {
+ ED_pose_bone_select_tag_update(ob);
+ changed_multi = true;
+ }
}
+ MEM_freeN(objects);
- return changed;
+ return changed_multi;
}
static int pose_select_grouped_exec(bContext *C, wmOperator *op)
@@ -858,15 +959,15 @@ static int pose_select_grouped_exec(bContext *C, wmOperator *op)
/* selection types */
switch (type) {
case POSE_SEL_SAME_LAYER: /* layer */
- changed = pose_select_same_layer(C, ob, extend);
+ changed = pose_select_same_layer(C, extend);
break;
case POSE_SEL_SAME_GROUP: /* group */
- changed = pose_select_same_group(C, ob, extend);
+ changed = pose_select_same_group(C, extend);
break;
case POSE_SEL_SAME_KEYINGSET: /* Keying Set */
- changed = pose_select_same_keyingset(C, op->reports, ob, extend);
+ changed = pose_select_same_keyingset(C, op->reports, extend);
break;
default:
@@ -874,11 +975,6 @@ static int pose_select_grouped_exec(bContext *C, wmOperator *op)
break;
}
- /* notifiers for updates */
- if (changed) {
- ED_pose_bone_select_tag_update(ob);
- }
-
/* report done status */
if (changed)
return OPERATOR_FINISHED;
@@ -920,17 +1016,19 @@ void POSE_OT_select_grouped(wmOperatorType *ot)
*/
static int pose_select_mirror_exec(bContext *C, wmOperator *op)
{
- Object *ob_act = CTX_data_active_object(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
+ Object *ob_active = CTX_data_active_object(C);
- FOREACH_OBJECT_IN_MODE_BEGIN(view_layer, OB_MODE_POSE, ob)
- {
- bArmature *arm;
- bPoseChannel *pchan, *pchan_mirror_act = NULL;
- const bool active_only = RNA_boolean_get(op->ptr, "only_active");
- const bool extend = RNA_boolean_get(op->ptr, "extend");
+ const bool is_weight_paint = (ob_active->mode & OB_MODE_WEIGHT_PAINT) != 0;
+ const bool active_only = RNA_boolean_get(op->ptr, "only_active");
+ const bool extend = RNA_boolean_get(op->ptr, "extend");
- arm = ob->data;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, &objects_len, OB_MODE_POSE);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
+ bPoseChannel *pchan, *pchan_mirror_act = NULL;
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
const int flag = (pchan->bone->flag & BONE_SELECTED);
@@ -952,7 +1050,7 @@ static int pose_select_mirror_exec(bContext *C, wmOperator *op)
pchan_mirror_act = pchan_mirror;
}
- /* skip all but the active or its mirror */
+ /* Skip all but the active or its mirror. */
if (active_only && !ELEM(arm->act_bone, pchan->bone, pchan_mirror->bone)) {
continue;
}
@@ -965,19 +1063,19 @@ static int pose_select_mirror_exec(bContext *C, wmOperator *op)
if (pchan_mirror_act) {
arm->act_bone = pchan_mirror_act->bone;
- /* in weightpaint we select the associated vertex group too */
- if (ob_act->mode & OB_MODE_WEIGHT_PAINT) {
- ED_vgroup_select_by_name(ob_act, pchan_mirror_act->name);
- DEG_id_tag_update(&ob_act->id, OB_RECALC_DATA);
+ /* In weightpaint we select the associated vertex group too. */
+ if (is_weight_paint) {
+ ED_vgroup_select_by_name(ob, pchan_mirror_act->name);
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
}
WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
- /* need to tag armature for cow updates, or else selection doesn't update */
+ /* Need to tag armature for cow updates, or else selection doesn't update. */
DEG_id_tag_update(&arm->id, DEG_TAG_COPY_ON_WRITE);
}
- FOREACH_OBJECT_IN_MODE_END;
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/armature/pose_slide.c b/source/blender/editors/armature/pose_slide.c
index 0a07af4ab43..be3914b2054 100644
--- a/source/blender/editors/armature/pose_slide.c
+++ b/source/blender/editors/armature/pose_slide.c
@@ -42,6 +42,7 @@
#include "BKE_nla.h"
#include "BKE_context.h"
+#include "BKE_layer.h"
#include "BKE_object.h"
#include "BKE_report.h"
#include "BKE_unit.h"
@@ -89,10 +90,9 @@ typedef struct tPoseSlideOp {
Scene *scene; /* current scene */
ScrArea *sa; /* area that we're operating in (needed for modal()) */
ARegion *ar; /* region that we're operating in (needed for modal()) */
- Object *ob; /* active object that Pose Info comes from */
- bArmature *arm; /* armature for pose */
+ uint objects_len; /* len of the PoseSlideObject array. */
- ListBase pfLinks; /* links between posechannels and f-curves */
+ ListBase pfLinks; /* links between posechannels and f-curves for all the pose objects. */
DLRBT_Tree keys; /* binary tree for quicker searching for keyframes (when applicable) */
int cframe; /* current frame number - global time */
@@ -100,9 +100,6 @@ typedef struct tPoseSlideOp {
int prevFrame; /* frame before current frame (blend-from) - global time */
int nextFrame; /* frame after current frame (blend-to) - global time */
- float prevFrameF; /* prevFrame, but in local action time (for F-Curve lookups to work) */
- float nextFrameF; /* nextFrame, but in local action time (for F-Curve lookups to work) */
-
short mode; /* sliding mode (ePoseSlide_Modes) */
short flag; /* unused for now, but can later get used for storing runtime settings.... */
@@ -112,8 +109,17 @@ typedef struct tPoseSlideOp {
float percentage; /* 0-1 value for determining the influence of whatever is relevant */
NumInput num; /* numeric input */
+
+ struct tPoseSlideObject *ob_data_array;
} tPoseSlideOp;
+typedef struct tPoseSlideObject {
+ Object *ob; /* active object that Pose Info comes from */
+ float prevFrameF; /* prevFrame, but in local action time (for F-Curve lookups to work) */
+ float nextFrameF; /* nextFrame, but in local action time (for F-Curve lookups to work) */
+ bool valid;
+} tPoseSlideObject;
+
/* Pose Sliding Modes */
typedef enum ePoseSlide_Modes {
POSESLIDE_PUSH = 0, /* exaggerate the pose... */
@@ -167,18 +173,15 @@ static const EnumPropertyItem prop_axis_lock_types[] = {
/* ------------------------------------ */
/* operator init */
-static int pose_slide_init(bContext *C, wmOperator *op, short mode)
+static int pose_slide_init(bContext *C, wmOperator *op, ePoseSlide_Modes mode)
{
tPoseSlideOp *pso;
- bAction *act = NULL;
/* init slide-op data */
pso = op->customdata = MEM_callocN(sizeof(tPoseSlideOp), "tPoseSlideOp");
/* get info from context */
pso->scene = CTX_data_scene(C);
- pso->ob = BKE_object_pose_armature_get(CTX_data_active_object(C));
- pso->arm = (pso->ob) ? pso->ob->data : NULL;
pso->sa = CTX_wm_area(C); /* only really needed when doing modal() */
pso->ar = CTX_wm_region(C); /* only really needed when doing modal() */
@@ -194,25 +197,38 @@ static int pose_slide_init(bContext *C, wmOperator *op, short mode)
pso->channels = RNA_enum_get(op->ptr, "channels");
pso->axislock = RNA_enum_get(op->ptr, "axis_lock");
- /* ensure validity of the settings from the context */
- if (ELEM(NULL, pso->ob, pso->arm, pso->ob->adt, pso->ob->adt->action))
- return 0;
+ /* for each Pose-Channel which gets affected, get the F-Curves for that channel
+ * and set the relevant transform flags...
+ */
+ poseAnim_mapping_get(C, &pso->pfLinks);
- act = pso->ob->adt->action;
+ Object **objects = BKE_view_layer_array_from_objects_in_mode_unique_data(CTX_data_view_layer(C),
+ &pso->objects_len,
+ OB_MODE_POSE);
+ pso->ob_data_array = MEM_callocN(pso->objects_len * sizeof(tPoseSlideObject), "pose slide objects data");
- /* apply NLA mapping corrections so the frame lookups work */
- pso->prevFrameF = BKE_nla_tweakedit_remap(pso->ob->adt, pso->prevFrame, NLATIME_CONVERT_UNMAP);
- pso->nextFrameF = BKE_nla_tweakedit_remap(pso->ob->adt, pso->nextFrame, NLATIME_CONVERT_UNMAP);
+ for (uint ob_index = 0; ob_index < pso->objects_len; ob_index++) {
+ tPoseSlideObject *ob_data = &pso->ob_data_array[ob_index];
+ Object *ob_iter = poseAnim_object_get(objects[ob_index]);
- /* for each Pose-Channel which gets affected, get the F-Curves for that channel
- * and set the relevant transform flags...
- */
- poseAnim_mapping_get(C, &pso->pfLinks, pso->ob, act);
+ /* Ensure validity of the settings from the context. */
+ if (ob_iter == NULL) {
+ continue;
+ }
+
+ ob_data->ob = ob_iter;
+ ob_data->valid = true;
+
+ /* apply NLA mapping corrections so the frame lookups work */
+ ob_data->prevFrameF = BKE_nla_tweakedit_remap(ob_data->ob->adt, pso->prevFrame, NLATIME_CONVERT_UNMAP);
+ ob_data->nextFrameF = BKE_nla_tweakedit_remap(ob_data->ob->adt, pso->nextFrame, NLATIME_CONVERT_UNMAP);
- /* set depsgraph flags */
- /* make sure the lock is set OK, unlock can be accidentally saved? */
- pso->ob->pose->flag |= POSE_LOCKED;
- pso->ob->pose->flag &= ~POSE_DO_UNLOCK;
+ /* set depsgraph flags */
+ /* make sure the lock is set OK, unlock can be accidentally saved? */
+ ob_data->ob->pose->flag |= POSE_LOCKED;
+ ob_data->ob->pose->flag &= ~POSE_DO_UNLOCK;
+ }
+ MEM_freeN(objects);
/* do basic initialize of RB-BST used for finding keyframes, but leave the filling of it up
* to the caller of this (usually only invoke() will do it, to make things more efficient).
@@ -242,6 +258,10 @@ static void pose_slide_exit(wmOperator *op)
/* free RB-BST for keyframes (if it contained data) */
BLI_dlrbTree_free(&pso->keys);
+ if (pso->ob_data_array != NULL) {
+ MEM_freeN(pso->ob_data_array);
+ }
+
/* free data itself */
MEM_freeN(pso);
}
@@ -256,21 +276,51 @@ static void pose_slide_exit(wmOperator *op)
static void pose_slide_refresh(bContext *C, tPoseSlideOp *pso)
{
/* wrapper around the generic version, allowing us to add some custom stuff later still */
- poseAnim_mapping_refresh(C, pso->scene, pso->ob);
+ for (uint ob_index = 0; ob_index < pso->objects_len; ob_index++) {
+ tPoseSlideObject *ob_data = &pso->ob_data_array[ob_index];
+ if (ob_data->valid) {
+ poseAnim_mapping_refresh(C, pso->scene, ob_data->ob);
+ }
+ }
+}
+
+/** Although this lookup is not ideal, we won't be dealing with a lot of objects at a given time.
+ * But if it comes to that we can instead store prev/next frme in the tPChanFCurveLink. */
+static bool pose_frame_range_from_object_get(tPoseSlideOp *pso, Object *ob, float *prevFrameF, float *nextFrameF)
+{
+ for (uint ob_index = 0; ob_index < pso->objects_len; ob_index++) {
+ tPoseSlideObject *ob_data = &pso->ob_data_array[ob_index];
+ Object *ob_iter = ob_data->ob;
+
+ if (ob_iter == ob) {
+ *prevFrameF = ob_data->prevFrameF;
+ *nextFrameF = ob_data->nextFrameF;
+ return true;
+ }
+ }
+ *prevFrameF = *nextFrameF = 0.0f;
+ return false;
}
/* helper for apply() - perform sliding for some value */
-static void pose_slide_apply_val(tPoseSlideOp *pso, FCurve *fcu, float *val)
+static void pose_slide_apply_val(
+ tPoseSlideOp *pso,
+ FCurve *fcu,
+ Object *ob,
+ float *val)
{
+ float prevFrameF, nextFrameF;
float cframe = (float)pso->cframe;
float sVal, eVal;
float w1, w2;
+ pose_frame_range_from_object_get(pso, ob, &prevFrameF, &nextFrameF);
+
/* get keyframe values for endpoint poses to blend with */
/* previous/start */
- sVal = evaluate_fcurve(fcu, pso->prevFrameF);
+ sVal = evaluate_fcurve(fcu, prevFrameF);
/* next/end */
- eVal = evaluate_fcurve(fcu, pso->nextFrameF);
+ eVal = evaluate_fcurve(fcu, nextFrameF);
/* if both values are equal, don't do anything */
if (IS_EQF(sVal, eVal)) {
@@ -364,7 +414,7 @@ static void pose_slide_apply_vec3(tPoseSlideOp *pso, tPChanFCurveLink *pfl, floa
((lock & PS_LOCK_Z) && (idx == 2)))
{
/* just work on these channels one by one... there's no interaction between values */
- pose_slide_apply_val(pso, fcu, &vec[fcu->array_index]);
+ pose_slide_apply_val(pso, fcu, pfl->ob, &vec[fcu->array_index]);
}
}
@@ -413,14 +463,14 @@ static void pose_slide_apply_props(tPoseSlideOp *pso, tPChanFCurveLink *pfl, con
case PROP_FLOAT:
{
float tval = RNA_property_float_get(&ptr, prop);
- pose_slide_apply_val(pso, fcu, &tval);
+ pose_slide_apply_val(pso, fcu, pfl->ob, &tval);
RNA_property_float_set(&ptr, prop, tval);
break;
}
case PROP_INT:
{
float tval = (float)RNA_property_int_get(&ptr, prop);
- pose_slide_apply_val(pso, fcu, &tval);
+ pose_slide_apply_val(pso, fcu, pfl->ob, &tval);
RNA_property_int_set(&ptr, prop, (int)tval);
break;
}
@@ -429,7 +479,7 @@ static void pose_slide_apply_props(tPoseSlideOp *pso, tPChanFCurveLink *pfl, con
case PROP_BOOLEAN:
{
float tval = (float)RNA_property_boolean_get(&ptr, prop);
- pose_slide_apply_val(pso, fcu, &tval);
+ pose_slide_apply_val(pso, fcu, pfl->ob, &tval);
RNA_property_boolean_set(&ptr, prop, (int)tval); // XXX: do we need threshold clamping here?
break;
}
@@ -459,6 +509,12 @@ static void pose_slide_apply_quat(tPoseSlideOp *pso, tPChanFCurveLink *pfl)
LinkData *ld = NULL;
char *path = NULL;
float cframe;
+ float prevFrameF, nextFrameF;
+
+ if (!pose_frame_range_from_object_get(pso, pfl->ob, &prevFrameF, &nextFrameF)) {
+ BLI_assert(!"Invalid pfl data");
+ return;
+ }
/* get the path to use - this should be quaternion rotations only (needs care) */
path = BLI_sprintfN("%s.%s", pfl->pchan_path, "rotation_quaternion");
@@ -492,15 +548,15 @@ static void pose_slide_apply_quat(tPoseSlideOp *pso, tPChanFCurveLink *pfl)
float quat_prev[4], quat_next[4];
/* get 2 quats */
- quat_prev[0] = evaluate_fcurve(fcu_w, pso->prevFrameF);
- quat_prev[1] = evaluate_fcurve(fcu_x, pso->prevFrameF);
- quat_prev[2] = evaluate_fcurve(fcu_y, pso->prevFrameF);
- quat_prev[3] = evaluate_fcurve(fcu_z, pso->prevFrameF);
+ quat_prev[0] = evaluate_fcurve(fcu_w, prevFrameF);
+ quat_prev[1] = evaluate_fcurve(fcu_x, prevFrameF);
+ quat_prev[2] = evaluate_fcurve(fcu_y, prevFrameF);
+ quat_prev[3] = evaluate_fcurve(fcu_z, prevFrameF);
- quat_next[0] = evaluate_fcurve(fcu_w, pso->nextFrameF);
- quat_next[1] = evaluate_fcurve(fcu_x, pso->nextFrameF);
- quat_next[2] = evaluate_fcurve(fcu_y, pso->nextFrameF);
- quat_next[3] = evaluate_fcurve(fcu_z, pso->nextFrameF);
+ quat_next[0] = evaluate_fcurve(fcu_w, nextFrameF);
+ quat_next[1] = evaluate_fcurve(fcu_x, nextFrameF);
+ quat_next[2] = evaluate_fcurve(fcu_y, nextFrameF);
+ quat_next[3] = evaluate_fcurve(fcu_z, nextFrameF);
/* perform blending */
if (pso->mode == POSESLIDE_BREAKDOWN) {
@@ -553,9 +609,21 @@ static void pose_slide_apply(bContext *C, tPoseSlideOp *pso)
pso->prevFrame--;
pso->nextFrame++;
- /* apply NLA mapping corrections so the frame lookups work */
- pso->prevFrameF = BKE_nla_tweakedit_remap(pso->ob->adt, pso->prevFrame, NLATIME_CONVERT_UNMAP);
- pso->nextFrameF = BKE_nla_tweakedit_remap(pso->ob->adt, pso->nextFrame, NLATIME_CONVERT_UNMAP);
+ for (uint ob_index = 0; ob_index < pso->objects_len; ob_index++) {
+ tPoseSlideObject *ob_data = &pso->ob_data_array[ob_index];
+
+ if (!ob_data->valid) {
+ continue;
+ }
+
+ /* apply NLA mapping corrections so the frame lookups work */
+ ob_data->prevFrameF = BKE_nla_tweakedit_remap(ob_data->ob->adt,
+ pso->prevFrame,
+ NLATIME_CONVERT_UNMAP);
+ ob_data->nextFrameF = BKE_nla_tweakedit_remap(ob_data->ob->adt,
+ pso->nextFrame,
+ NLATIME_CONVERT_UNMAP);
+ }
}
/* for each link, handle each set of transforms */
@@ -613,7 +681,7 @@ static void pose_slide_apply(bContext *C, tPoseSlideOp *pso)
static void pose_slide_autoKeyframe(bContext *C, tPoseSlideOp *pso)
{
/* wrapper around the generic call */
- poseAnim_mapping_autoKeyframe(C, pso->scene, pso->ob, &pso->pfLinks, (float)pso->cframe);
+ poseAnim_mapping_autoKeyframe(C, pso->scene, &pso->pfLinks, (float)pso->cframe);
}
/* reset changes made to current pose */
@@ -712,7 +780,6 @@ static void pose_slide_draw_status(tPoseSlideOp *pso)
static int pose_slide_invoke_common(bContext *C, wmOperator *op, tPoseSlideOp *pso)
{
tPChanFCurveLink *pfl;
- AnimData *adt = pso->ob->adt;
wmWindow *win = CTX_wm_window(C);
/* for each link, add all its keyframes to the search tree */
@@ -722,13 +789,10 @@ static int pose_slide_invoke_common(bContext *C, wmOperator *op, tPoseSlideOp *p
/* do this for each F-Curve */
for (ld = pfl->fcurves.first; ld; ld = ld->next) {
FCurve *fcu = (FCurve *)ld->data;
- fcurve_to_keylist(adt, fcu, &pso->keys, NULL);
+ fcurve_to_keylist(pfl->ob->adt, fcu, &pso->keys, 0);
}
}
- /* consolidate these keyframes, and figure out the nearest ones */
- BLI_dlrbTree_linkedlist_sync(&pso->keys);
-
/* cancel if no keyframes found... */
if (pso->keys.root) {
ActKeyColumn *ak;
@@ -761,8 +825,17 @@ static int pose_slide_invoke_common(bContext *C, wmOperator *op, tPoseSlideOp *p
}
/* apply NLA mapping corrections so the frame lookups work */
- pso->prevFrameF = BKE_nla_tweakedit_remap(pso->ob->adt, pso->prevFrame, NLATIME_CONVERT_UNMAP);
- pso->nextFrameF = BKE_nla_tweakedit_remap(pso->ob->adt, pso->nextFrame, NLATIME_CONVERT_UNMAP);
+ for (uint ob_index = 0; ob_index < pso->objects_len; ob_index++) {
+ tPoseSlideObject *ob_data = &pso->ob_data_array[ob_index];
+ if (ob_data->valid) {
+ ob_data->prevFrameF = BKE_nla_tweakedit_remap(ob_data->ob->adt,
+ pso->prevFrame,
+ NLATIME_CONVERT_UNMAP);
+ ob_data->nextFrameF = BKE_nla_tweakedit_remap(ob_data->ob->adt,
+ pso->nextFrame,
+ NLATIME_CONVERT_UNMAP);
+ }
+ }
}
else {
BKE_report(op->reports, RPT_ERROR, "No keyframes to slide between");
@@ -1263,95 +1336,78 @@ typedef union tPosePropagate_ModeData {
* if this happens to be a major issue, scrap this, and just make this happen
* independently per F-Curve
*/
-static float pose_propagate_get_boneHoldEndFrame(Object *ob, tPChanFCurveLink *pfl, float startFrame)
+static float pose_propagate_get_boneHoldEndFrame(tPChanFCurveLink *pfl, float startFrame)
{
- DLRBT_Tree keys, blocks;
- ActKeyBlock *ab;
+ DLRBT_Tree keys;
+ Object *ob = pfl->ob;
AnimData *adt = ob->adt;
LinkData *ld;
float endFrame = startFrame;
/* set up optimized data-structures for searching for relevant keyframes + holds */
BLI_dlrbTree_init(&keys);
- BLI_dlrbTree_init(&blocks);
for (ld = pfl->fcurves.first; ld; ld = ld->next) {
FCurve *fcu = (FCurve *)ld->data;
- fcurve_to_keylist(adt, fcu, &keys, &blocks);
+ fcurve_to_keylist(adt, fcu, &keys, 0);
}
- BLI_dlrbTree_linkedlist_sync(&keys);
- BLI_dlrbTree_linkedlist_sync(&blocks);
-
/* find the long keyframe (i.e. hold), and hence obtain the endFrame value
* - the best case would be one that starts on the frame itself
*/
- ab = (ActKeyBlock *)BLI_dlrbTree_search_exact(&blocks, compare_ab_cfraPtr, &startFrame);
-
- if (actkeyblock_is_valid(ab, &keys) == 0) {
- /* There are only two cases for no-exact match:
- * 1) the current frame is just before another key but not on a key itself
- * 2) the current frame is on a key, but that key doesn't link to the next
- *
- * If we've got the first case, then we can search for another block,
- * otherwise forget it, as we'd be overwriting some valid data.
- */
- if (BLI_dlrbTree_search_exact(&keys, compare_ak_cfraPtr, &startFrame) == NULL) {
- /* we've got case 1, so try the one after */
- ab = (ActKeyBlock *)BLI_dlrbTree_search_next(&blocks, compare_ab_cfraPtr, &startFrame);
-
- if (actkeyblock_is_valid(ab, &keys) == 0) {
- /* try the block before this frame then as last resort */
- ab = (ActKeyBlock *)BLI_dlrbTree_search_prev(&blocks, compare_ab_cfraPtr, &startFrame);
-
- /* whatever happens, stop searching now... */
- if (actkeyblock_is_valid(ab, &keys) == 0) {
- /* restrict range to just the frame itself
- * i.e. everything is in motion, so no holds to safely overwrite
- */
- ab = NULL;
- }
- }
- }
- else {
- /* we've got case 2 - set ab to NULL just in case, since we shouldn't do anything in this case */
- ab = NULL;
+ ActKeyColumn *ab = (ActKeyColumn *)BLI_dlrbTree_search_exact(&keys, compare_ak_cfraPtr, &startFrame);
+
+ /* There are only two cases for no-exact match:
+ * 1) the current frame is just before another key but not on a key itself
+ * 2) the current frame is on a key, but that key doesn't link to the next
+ *
+ * If we've got the first case, then we can search for another block,
+ * otherwise forget it, as we'd be overwriting some valid data.
+ */
+ if (ab == NULL) {
+ /* we've got case 1, so try the one after */
+ ab = (ActKeyColumn *)BLI_dlrbTree_search_next(&keys, compare_ak_cfraPtr, &startFrame);
+
+ if ((actkeyblock_get_valid_hold(ab) & ACTKEYBLOCK_FLAG_STATIC_HOLD) == 0) {
+ /* try the block before this frame then as last resort */
+ ab = (ActKeyColumn *)BLI_dlrbTree_search_prev(&keys, compare_ak_cfraPtr, &startFrame);
}
}
+ /* whatever happens, stop searching now... */
+ if ((actkeyblock_get_valid_hold(ab) & ACTKEYBLOCK_FLAG_STATIC_HOLD) == 0) {
+ /* restrict range to just the frame itself
+ * i.e. everything is in motion, so no holds to safely overwrite
+ */
+ ab = NULL;
+ }
+
/* check if we can go any further than we've already gone */
if (ab) {
/* go to next if it is also valid and meets "extension" criteria */
while (ab->next) {
- ActKeyBlock *abn = (ActKeyBlock *)ab->next;
+ ActKeyColumn *abn = ab->next;
/* must be valid */
- if (actkeyblock_is_valid(abn, &keys) == 0)
- break;
- /* should start on the same frame that the last ended on */
- if (ab->end != abn->start)
+ if ((actkeyblock_get_valid_hold(abn) & ACTKEYBLOCK_FLAG_STATIC_HOLD) == 0) {
break;
+ }
/* should have the same number of curves */
- if (ab->totcurve != abn->totcurve)
- break;
- /* should have the same value
- * XXX: this may be a bit fuzzy on larger data sets, so be careful
- */
- if (ab->val != abn->val)
+ if (ab->totblock != abn->totblock) {
break;
+ }
/* we can extend the bounds to the end of this "next" block now */
ab = abn;
}
/* end frame can now take the value of the end of the block */
- endFrame = ab->end;
+ endFrame = ab->next->cfra;
}
/* free temp memory */
BLI_dlrbTree_free(&keys);
- BLI_dlrbTree_free(&blocks);
/* return the end frame we've found */
return endFrame;
@@ -1510,8 +1566,7 @@ static void pose_propagate_fcurve(wmOperator *op, Object *ob, FCurve *fcu,
static int pose_propagate_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
- Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C));
- bAction *act = (ob && ob->adt) ? ob->adt->action : NULL;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
ListBase pflinks = {NULL, NULL};
tPChanFCurveLink *pfl;
@@ -1519,19 +1574,16 @@ static int pose_propagate_exec(bContext *C, wmOperator *op)
tPosePropagate_ModeData modeData;
const int mode = RNA_enum_get(op->ptr, "mode");
- /* sanity checks */
- if (ob == NULL) {
- BKE_report(op->reports, RPT_ERROR, "No object to propagate poses for");
- return OPERATOR_CANCELLED;
- }
- if (act == NULL) {
+ /* isolate F-Curves related to the selected bones */
+ poseAnim_mapping_get(C, &pflinks);
+
+ if (BLI_listbase_is_empty(&pflinks)) {
+ /* There is a change the reason the list is empty is that there is no valid object to propagate poses for.
+ * This is very unlikely though, so we focus on the most likely issue. */
BKE_report(op->reports, RPT_ERROR, "No keyframed poses to propagate to");
return OPERATOR_CANCELLED;
}
- /* isolate F-Curves related to the selected bones */
- poseAnim_mapping_get(C, &pflinks, ob, act);
-
/* mode-specific data preprocessing (requiring no access to curves) */
if (mode == POSE_PROPAGATE_SELECTED_MARKERS) {
/* get a list of selected markers */
@@ -1551,12 +1603,13 @@ static int pose_propagate_exec(bContext *C, wmOperator *op)
/* we store in endFrame the end frame of the "long keyframe" (i.e. a held value) starting
* from the keyframe that occurs after the current frame
*/
- modeData.end_frame = pose_propagate_get_boneHoldEndFrame(ob, pfl, (float)CFRA);
+ modeData.end_frame = pose_propagate_get_boneHoldEndFrame(pfl, (float)CFRA);
}
/* go through propagating pose to keyframes, curve by curve */
- for (ld = pfl->fcurves.first; ld; ld = ld->next)
- pose_propagate_fcurve(op, ob, (FCurve *)ld->data, (float)CFRA, modeData);
+ for (ld = pfl->fcurves.first; ld; ld = ld->next) {
+ pose_propagate_fcurve(op, pfl->ob, (FCurve *)ld->data, (float)CFRA, modeData);
+ }
}
/* free temp data */
@@ -1566,7 +1619,9 @@ static int pose_propagate_exec(bContext *C, wmOperator *op)
BLI_freelistN(&modeData.sel_markers);
/* updates + notifiers */
- poseAnim_mapping_refresh(C, scene, ob);
+ FOREACH_OBJECT_IN_MODE_BEGIN(view_layer, OB_MODE_POSE, ob) {
+ poseAnim_mapping_refresh(C, scene, ob);
+ } FOREACH_OBJECT_IN_MODE_END;
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/armature/pose_transform.c b/source/blender/editors/armature/pose_transform.c
index 22c710dcda5..5a6757294dc 100644
--- a/source/blender/editors/armature/pose_transform.c
+++ b/source/blender/editors/armature/pose_transform.c
@@ -38,8 +38,8 @@
#include "BLI_math.h"
#include "BLI_string_utils.h"
-#include "BKE_animsys.h"
#include "BKE_action.h"
+#include "BKE_animsys.h"
#include "BKE_appdir.h"
#include "BKE_armature.h"
#include "BKE_blender_copybuffer.h"
@@ -47,9 +47,9 @@
#include "BKE_deform.h"
#include "BKE_global.h"
#include "BKE_idprop.h"
+#include "BKE_layer.h"
#include "BKE_main.h"
#include "BKE_object.h"
-#include "BKE_layer.h"
#include "BKE_report.h"
#include "DEG_depsgraph.h"
@@ -584,7 +584,7 @@ static int pose_paste_exec(bContext *C, wmOperator *op)
/* Recalculate paths if any of the bones have paths... */
if ((ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS)) {
- ED_pose_recalculate_paths(C, scene, ob);
+ ED_pose_recalculate_paths(C, scene, ob, false);
}
/* Notifiers for updates, */
@@ -827,7 +827,7 @@ static int pose_clear_transform_generic_exec(bContext *C, wmOperator *op,
/* now recalculate paths */
if ((ob_iter->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS)) {
- ED_pose_recalculate_paths(C, scene, ob_iter);
+ ED_pose_recalculate_paths(C, scene, ob_iter, false);
}
BLI_freelistN(&dsources);
diff --git a/source/blender/editors/armature/pose_utils.c b/source/blender/editors/armature/pose_utils.c
index e280284a9ce..a67ee8453bc 100644
--- a/source/blender/editors/armature/pose_utils.c
+++ b/source/blender/editors/armature/pose_utils.c
@@ -40,7 +40,9 @@
#include "BKE_action.h"
#include "BKE_armature.h"
#include "BKE_idprop.h"
+#include "BKE_layer.h"
#include "BKE_main.h"
+#include "BKE_object.h"
#include "BKE_context.h"
@@ -81,6 +83,7 @@ static void fcurves_to_pchan_links_get(ListBase *pfLinks, Object *ob, bAction *a
tPChanFCurveLink *pfl = MEM_callocN(sizeof(tPChanFCurveLink), "tPChanFCurveLink");
PointerRNA ptr;
+ pfl->ob = ob;
pfl->fcurves = curves;
pfl->pchan = pchan;
@@ -127,16 +130,48 @@ static void fcurves_to_pchan_links_get(ListBase *pfLinks, Object *ob, bAction *a
}
}
+/**
+ * Returns a valid pose armature for this object, else returns NULL.
+ **/
+Object *poseAnim_object_get(Object *ob_)
+{
+ Object *ob = BKE_object_pose_armature_get(ob_);
+ if (!ELEM(NULL,
+ ob,
+ ob->data,
+ ob->adt,
+ ob->adt->action))
+ {
+ return ob;
+ }
+ return NULL;
+}
/* get sets of F-Curves providing transforms for the bones in the Pose */
-void poseAnim_mapping_get(bContext *C, ListBase *pfLinks, Object *ob, bAction *act)
+void poseAnim_mapping_get(bContext *C, ListBase *pfLinks)
{
/* for each Pose-Channel which gets affected, get the F-Curves for that channel
* and set the relevant transform flags...
*/
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones)
+ Object *prev_ob, *ob_pose_armature;
+
+ prev_ob = NULL;
+ ob_pose_armature = NULL;
+ CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, selected_pose_bones, Object *, ob)
{
- fcurves_to_pchan_links_get(pfLinks, ob, act, pchan);
+ if (ob != prev_ob) {
+ prev_ob = ob;
+ ob_pose_armature = poseAnim_object_get(ob);
+ }
+
+ if (ob_pose_armature == NULL) {
+ continue;
+ }
+
+ fcurves_to_pchan_links_get(pfLinks,
+ ob_pose_armature,
+ ob_pose_armature->adt->action,
+ pchan);
}
CTX_DATA_END;
@@ -144,12 +179,25 @@ void poseAnim_mapping_get(bContext *C, ListBase *pfLinks, Object *ob, bAction *a
* i.e. if nothing selected, do whole pose
*/
if (BLI_listbase_is_empty(pfLinks)) {
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, visible_pose_bones)
+ prev_ob = NULL;
+ ob_pose_armature = NULL;
+ CTX_DATA_BEGIN_WITH_ID(C, bPoseChannel *, pchan, visible_pose_bones, Object *, ob)
{
- fcurves_to_pchan_links_get(pfLinks, ob, act, pchan);
+ if (ob != prev_ob) {
+ prev_ob = ob;
+ ob_pose_armature = poseAnim_object_get(ob);
+ }
+
+ if (ob_pose_armature == NULL) {
+ continue;
+ }
+
+ fcurves_to_pchan_links_get(pfLinks,
+ ob_pose_armature,
+ ob_pose_armature->adt->action,
+ pchan);
}
CTX_DATA_END;
-
}
}
@@ -236,42 +284,71 @@ void poseAnim_mapping_reset(ListBase *pfLinks)
}
/* perform autokeyframing after changes were made + confirmed */
-void poseAnim_mapping_autoKeyframe(bContext *C, Scene *scene, Object *ob, ListBase *pfLinks, float cframe)
+void poseAnim_mapping_autoKeyframe(bContext *C, Scene *scene, ListBase *pfLinks, float cframe)
{
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ bool skip = true;
+
+ FOREACH_OBJECT_IN_MODE_BEGIN(view_layer, OB_MODE_POSE, ob) {
+ ob->id.tag &= ~LIB_TAG_DOIT;
+ ob = poseAnim_object_get(ob);
+
+ /* Ensure validity of the settings from the context. */
+ if (ob == NULL) {
+ continue;
+ }
+
+ if (autokeyframe_cfra_can_key(scene, &ob->id)) {
+ ob->id.tag |= LIB_TAG_DOIT;
+ skip = false;
+ }
+ } FOREACH_OBJECT_IN_MODE_END;
+
+ if (skip) {
+ return;
+ }
+
/* insert keyframes as necessary if autokeyframing */
- if (autokeyframe_cfra_can_key(scene, &ob->id)) {
- KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_WHOLE_CHARACTER_ID);
- ListBase dsources = {NULL, NULL};
- tPChanFCurveLink *pfl;
-
- /* iterate over each pose-channel affected, tagging bones to be keyed */
- /* XXX: here we already have the information about what transforms exist, though
- * it might be easier to just overwrite all using normal mechanisms
- */
- for (pfl = pfLinks->first; pfl; pfl = pfl->next) {
- bPoseChannel *pchan = pfl->pchan;
-
- /* add datasource override for the PoseChannel, to be used later */
- ANIM_relative_keyingset_add_source(&dsources, &ob->id, &RNA_PoseBone, pchan);
-
- /* clear any unkeyed tags */
- if (pchan->bone)
- pchan->bone->flag &= ~BONE_UNKEYED;
+ KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_WHOLE_CHARACTER_ID);
+ ListBase dsources = {NULL, NULL};
+ tPChanFCurveLink *pfl;
+
+ /* iterate over each pose-channel affected, tagging bones to be keyed */
+ /* XXX: here we already have the information about what transforms exist, though
+ * it might be easier to just overwrite all using normal mechanisms
+ */
+ for (pfl = pfLinks->first; pfl; pfl = pfl->next) {
+ bPoseChannel *pchan = pfl->pchan;
+
+ if ((pfl->ob->id.tag & LIB_TAG_DOIT) == 0) {
+ continue;
}
- /* insert keyframes for all relevant bones in one go */
- ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cframe);
- BLI_freelistN(&dsources);
-
- /* do the bone paths
- * - only do this if keyframes should have been added
- * - do not calculate unless there are paths already to update...
- */
- if (ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS) {
- //ED_pose_clear_paths(C, ob); // XXX for now, don't need to clear
- ED_pose_recalculate_paths(C, scene, ob);
+ /* add datasource override for the PoseChannel, to be used later */
+ ANIM_relative_keyingset_add_source(&dsources, &pfl->ob->id, &RNA_PoseBone, pchan);
+
+ /* clear any unkeyed tags */
+ if (pchan->bone) {
+ pchan->bone->flag &= ~BONE_UNKEYED;
}
}
+
+ /* insert keyframes for all relevant bones in one go */
+ ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cframe);
+ BLI_freelistN(&dsources);
+
+ /* do the bone paths
+ * - only do this if keyframes should have been added
+ * - do not calculate unless there are paths already to update...
+ */
+ FOREACH_OBJECT_IN_MODE_BEGIN(view_layer, OB_MODE_POSE, ob) {
+ if (ob->id.tag & LIB_TAG_DOIT) {
+ if (ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS) {
+ //ED_pose_clear_paths(C, ob); // XXX for now, don't need to clear
+ ED_pose_recalculate_paths(C, scene, ob, false);
+ }
+ }
+ } FOREACH_OBJECT_IN_MODE_END;
}
/* ------------------------- */
diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h
index 01047d4badd..cd7a344fcb0 100644
--- a/source/blender/editors/curve/curve_intern.h
+++ b/source/blender/editors/curve/curve_intern.h
@@ -135,13 +135,14 @@ struct GHash *ED_curve_keyindex_hash_duplicate(struct GHash *keyindex);
void ED_curve_keyindex_update_nurb(struct EditNurb *editnurb, struct Nurb *nu, struct Nurb *newnu);
bool ED_curve_pick_vert(
- struct ViewContext *vc, short sel, const int mval[2],
- struct Nurb **r_nurb, struct BezTriple **r_bezt, struct BPoint **r_bp, short *r_handle);
+ struct ViewContext *vc, short sel,
+ struct Nurb **r_nurb, struct BezTriple **r_bezt, struct BPoint **r_bp, short *r_handle,
+ struct Base **r_base);
/* helper functions */
void ed_editnurb_translate_flag(struct ListBase *editnurb, short flag, const float vec[3]);
bool ed_editnurb_extrude_flag(struct EditNurb *editnurb, const short flag);
-bool ed_editnurb_spin(float viewmat[4][4], struct Object *obedit, const float axis[3], const float cent[3]);
+bool ed_editnurb_spin(float viewmat[4][4], struct View3D *v3d, struct Object *obedit, const float axis[3], const float cent[3]);
/* editcurve_select.c */
void CURVE_OT_de_select_first(struct wmOperatorType *ot);
diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c
index ae07196860b..bd1c2248660 100644
--- a/source/blender/editors/curve/curve_ops.c
+++ b/source/blender/editors/curve/curve_ops.c
@@ -167,141 +167,11 @@ void ED_operatormacros_curve(void)
void ED_keymap_curve(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap;
- wmKeyMapItem *kmi;
-
- keymap = WM_keymap_ensure(keyconf, "Font", 0, 0);
- keymap->poll = ED_operator_editfont;
-
/* only set in editmode font, by space_view3d listener */
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_style_toggle", BKEY, KM_PRESS, KM_CTRL, 0)->ptr, "style", CU_CHINFO_BOLD);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_style_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "style", CU_CHINFO_ITALIC);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_style_toggle", UKEY, KM_PRESS, KM_CTRL, 0)->ptr, "style", CU_CHINFO_UNDERLINE);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_style_toggle", PKEY, KM_PRESS, KM_CTRL, 0)->ptr, "style", CU_CHINFO_SMALLCAPS);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", DELKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_NEXT_SEL);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", DELKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_NEXT_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_PREV_SEL);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", DEL_PREV_SEL); /* same as above [#26623] */
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_PREV_WORD);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move", HOMEKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_BEGIN);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move", ENDKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_END);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move", LEFTARROWKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_CHAR);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move", RIGHTARROWKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_CHAR);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move", LEFTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", PREV_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move", RIGHTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", NEXT_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move", UPARROWKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_LINE);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_LINE);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_PAGE);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move", PAGEDOWNKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_PAGE);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move_select", HOMEKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", LINE_BEGIN);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move_select", ENDKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", LINE_END);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move_select", LEFTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", PREV_CHAR);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", NEXT_CHAR);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move_select", LEFTARROWKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0)->ptr, "type", PREV_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0)->ptr, "type", NEXT_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move_select", UPARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", PREV_LINE);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move_select", DOWNARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", NEXT_LINE);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move_select", PAGEUPKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", PREV_PAGE);
- RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move_select", PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", NEXT_PAGE);
-
- RNA_int_set(WM_keymap_add_item(keymap, "FONT_OT_change_spacing", LEFTARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "delta", -1);
- RNA_int_set(WM_keymap_add_item(keymap, "FONT_OT_change_spacing", RIGHTARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "delta", 1);
- RNA_int_set(WM_keymap_add_item(keymap, "FONT_OT_change_character", UPARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "delta", 1);
- RNA_int_set(WM_keymap_add_item(keymap, "FONT_OT_change_character", DOWNARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "delta", -1);
-
- WM_keymap_add_item(keymap, "FONT_OT_select_all", AKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "FONT_OT_text_copy", CKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "FONT_OT_text_cut", XKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "FONT_OT_text_paste", VKEY, KM_PRESS, KM_CTRL, 0);
-#ifdef __APPLE__
- WM_keymap_add_item(keymap, "FONT_OT_select_all", AKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "FONT_OT_text_copy", CKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "FONT_OT_text_cut", XKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "FONT_OT_text_paste", VKEY, KM_PRESS, KM_OSKEY, 0);
-#endif
-
- WM_keymap_add_item(keymap, "FONT_OT_line_break", RETKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "FONT_OT_text_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last!
- kmi = WM_keymap_add_item(keymap, "FONT_OT_text_insert", BACKSPACEKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "accent", true); /* accented characters */
+ wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Font", 0, 0);
+ keymap->poll = ED_operator_editfont;
/* only set in editmode curve, by space_view3d listener */
keymap = WM_keymap_ensure(keyconf, "Curve", 0, 0);
keymap->poll = ED_operator_editsurfcurve;
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_curve_add", AKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "CURVE_OT_handle_type_set", VKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "CURVE_OT_vertex_add", ACTIONMOUSE, KM_CLICK, KM_CTRL, 0);
-
- kmi = WM_keymap_add_item(keymap, "CURVE_OT_draw", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- kmi = WM_keymap_add_item(keymap, "CURVE_OT_draw", TABLET_STYLUS, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- kmi = WM_keymap_add_item(keymap, "CURVE_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "CURVE_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "CURVE_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- WM_keymap_add_item(keymap, "CURVE_OT_select_row", RKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_select_similar", GKEY, KM_PRESS, KM_SHIFT, 0);
-
- kmi = WM_keymap_add_item(keymap, "CURVE_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- kmi = WM_keymap_add_item(keymap, "CURVE_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", true);
-
- WM_keymap_add_item(keymap, "CURVE_OT_shortest_path_pick", SELECTMOUSE, KM_CLICK, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "CURVE_OT_separate", PKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_split", YKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_extrude_move", EKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_make_segment", FKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_cyclic_toggle", CKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_curve_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_curve_delete", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "CURVE_OT_dissolve_verts", XKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_dissolve_verts", DELKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "CURVE_OT_tilt_clear", TKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "TRANSFORM_OT_tilt", TKEY, KM_PRESS, KM_CTRL, 0);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0)->ptr, "mode", TFM_CURVE_SHRINKFATTEN);
-
- WM_keymap_add_item(keymap, "CURVE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
- kmi = WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
- kmi = WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "CURVE_OT_normals_make_consistent", NKEY, KM_PRESS, KM_CTRL, 0);
-#else
- WM_keymap_add_item(keymap, "CURVE_OT_normals_make_consistent", NKEY, KM_PRESS, KM_SHIFT, 0);
-#endif
-
- WM_keymap_add_item(keymap, "OBJECT_OT_vertex_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_curve_specials", WKEY, KM_PRESS, 0, 0);
-
- /* menus */
- WM_keymap_add_menu(keymap, "VIEW3D_MT_hook", HKEY, KM_PRESS, KM_CTRL, 0);
-
- ED_keymap_proportional_cycle(keyconf, keymap);
- ED_keymap_proportional_editmode(keyconf, keymap, true);
}
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 6b3c2643ad7..dce28a1ec5a 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -43,6 +43,8 @@
#include "BLT_translation.h"
+#include "BKE_action.h"
+#include "BKE_animsys.h"
#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_displist.h"
@@ -52,10 +54,8 @@
#include "BKE_layer.h"
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_report.h"
-#include "BKE_animsys.h"
-#include "BKE_action.h"
#include "BKE_modifier.h"
+#include "BKE_report.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
@@ -85,8 +85,9 @@
#include "RNA_enum_types.h"
void selectend_nurb(Object *obedit, enum eEndPoint_Types selfirst, bool doswap, bool selstatus);
-static void adduplicateflagNurb(Object *obedit, ListBase *newnurb, const short flag, const bool split);
-static int curve_delete_segments(Object *obedit, const bool split);
+static void adduplicateflagNurb(Object *obedit, View3D *v3d, ListBase *newnurb, const short flag, const bool split);
+static bool curve_delete_segments(Object *obedit, View3D *v3d, const bool split);
+static bool curve_delete_vertices(Object *obedit, View3D *v3d);
ListBase *object_editcurve_get(Object *ob)
{
@@ -165,7 +166,7 @@ static void init_editNurb_keyIndex(EditNurb *editnurb, ListBase *origBase)
*origbezt_cpy = *origbezt;
keyIndex = init_cvKeyIndex(origbezt_cpy, key_index, nu_index, pt_index, vertex_index);
BLI_ghash_insert(gh, bezt, keyIndex);
- key_index += 12;
+ key_index += KEYELEM_FLOAT_LEN_BEZTRIPLE;
vertex_index += 3;
bezt++;
origbezt++;
@@ -185,7 +186,7 @@ static void init_editNurb_keyIndex(EditNurb *editnurb, ListBase *origBase)
*origbp_cpy = *origbp;
keyIndex = init_cvKeyIndex(origbp_cpy, key_index, nu_index, pt_index, vertex_index);
BLI_ghash_insert(gh, bp, keyIndex);
- key_index += 4;
+ key_index += KEYELEM_FLOAT_LEN_BPOINT;
bp++;
origbp++;
pt_index++;
@@ -468,13 +469,13 @@ static void switch_keys_direction(Curve *cu, Nurb *actnu)
if (getKeyIndexOrig_bezt(editnurb, bezt)) {
swap_v3_v3(fp, fp + 6);
*(fp + 9) = -*(fp + 9);
- fp += 12;
+ fp += KEYELEM_FLOAT_LEN_BEZTRIPLE;
}
bezt++;
}
}
else {
- fp += a * 12;
+ fp += a * KEYELEM_FLOAT_LEN_BEZTRIPLE;
}
}
else {
@@ -484,13 +485,13 @@ static void switch_keys_direction(Curve *cu, Nurb *actnu)
while (a--) {
if (getKeyIndexOrig_bp(editnurb, bp)) {
*(fp + 3) = -*(fp + 3);
- fp += 4;
+ fp += KEYELEM_FLOAT_LEN_BPOINT;
}
bp++;
}
}
else {
- fp += a * 4;
+ fp += a * KEYELEM_FLOAT_LEN_BPOINT;
}
}
@@ -541,12 +542,14 @@ static void key_to_bezt(float *key, BezTriple *basebezt, BezTriple *bezt)
memcpy(bezt, basebezt, sizeof(BezTriple));
memcpy(bezt->vec, key, sizeof(float) * 9);
bezt->alfa = key[9];
+ bezt->radius = key[10];
}
static void bezt_to_key(BezTriple *bezt, float *key)
{
memcpy(key, bezt->vec, sizeof(float) * 9);
key[9] = bezt->alfa;
+ key[10] = bezt->radius;
}
static void calc_keyHandles(ListBase *nurb, float *key)
@@ -569,7 +572,7 @@ static void calc_keyHandles(ListBase *nurb, float *key)
if (nu->flagu & CU_NURB_CYCLIC) {
prevp = bezt + (a - 1);
- prevfp = fp + (12 * (a - 1));
+ prevfp = fp + (KEYELEM_FLOAT_LEN_BEZTRIPLE * (a - 1));
}
else {
prevp = NULL;
@@ -577,7 +580,7 @@ static void calc_keyHandles(ListBase *nurb, float *key)
}
nextp = bezt + 1;
- nextfp = fp + 12;
+ nextfp = fp + KEYELEM_FLOAT_LEN_BEZTRIPLE;
while (a--) {
key_to_bezt(fp, bezt, &cur);
@@ -602,16 +605,16 @@ static void calc_keyHandles(ListBase *nurb, float *key)
}
else {
nextp++;
- nextfp += 12;
+ nextfp += KEYELEM_FLOAT_LEN_BEZTRIPLE;
}
bezt++;
- fp += 12;
+ fp += KEYELEM_FLOAT_LEN_BEZTRIPLE;
}
}
else {
a = nu->pntsu * nu->pntsv;
- fp += a * 4;
+ fp += a * KEYELEM_FLOAT_LEN_BPOINT;
}
nu = nu->next;
@@ -631,7 +634,7 @@ static void calc_shapeKeys(Object *obedit, ListBase *newnurbs)
BezTriple *bezt, *oldbezt;
BPoint *bp, *oldbp;
Nurb *nu, *newnu;
- int totvert = BKE_nurbList_verts_count(&editnurb->nurbs);
+ int totvert = BKE_keyblock_curve_element_count(&editnurb->nurbs);
float (*ofs)[3] = NULL;
float *oldkey, *newkey, *ofp;
@@ -671,7 +674,9 @@ static void calc_shapeKeys(Object *obedit, ListBase *newnurbs)
sub_v3_v3v3(ofs[i], bezt->vec[j], oldbezt->vec[j]);
i++;
}
- ofs[i++][0] = bezt->alfa - oldbezt->alfa;
+ ofs[i][0] = bezt->alfa - oldbezt->alfa;
+ ofs[i][1] = bezt->radius - oldbezt->radius;
+ i++;
}
else {
i += 4;
@@ -687,6 +692,7 @@ static void calc_shapeKeys(Object *obedit, ListBase *newnurbs)
if (oldbp) {
sub_v3_v3v3(ofs[i], bp->vec, oldbp->vec);
ofs[i + 1][0] = bp->alfa - oldbp->alfa;
+ ofs[i + 1][1] = bp->radius - oldbp->radius;
}
i += 2;
bp++;
@@ -723,22 +729,23 @@ static void calc_shapeKeys(Object *obedit, ListBase *newnurbs)
int j;
oldbezt = getKeyIndexOrig_bezt(editnurb, bezt);
- for (j = 0; j < 3; ++j, ++i) {
- copy_v3_v3(fp, bezt->vec[j]);
+ for (j = 0; j < 3; j++, i++) {
+ copy_v3_v3(&fp[j * 3], bezt->vec[j]);
if (restore && oldbezt) {
copy_v3_v3(newbezt->vec[j], oldbezt->vec[j]);
}
-
- fp += 3;
}
- fp[0] = bezt->alfa;
+ fp[9] = bezt->alfa;
+ fp[10] = bezt->radius;
if (restore && oldbezt) {
newbezt->alfa = oldbezt->alfa;
+ newbezt->radius = oldbezt->radius;
}
- fp += 3; ++i; /* alphas */
+ fp += KEYELEM_FLOAT_LEN_BEZTRIPLE;
+ i++;
bezt++;
newbezt++;
}
@@ -753,13 +760,15 @@ static void calc_shapeKeys(Object *obedit, ListBase *newnurbs)
copy_v3_v3(fp, bp->vec);
fp[3] = bp->alfa;
+ fp[4] = bp->radius;
if (restore && oldbp) {
copy_v3_v3(newbp->vec, oldbp->vec);
newbp->alfa = oldbp->alfa;
+ newbp->radius = oldbp->radius;
}
- fp += 4;
+ fp += KEYELEM_FLOAT_LEN_BPOINT;
bp++;
newbp++;
i += 2;
@@ -781,34 +790,33 @@ static void calc_shapeKeys(Object *obedit, ListBase *newnurbs)
int j;
curofp = ofp + index;
- for (j = 0; j < 3; ++j, ++i) {
- copy_v3_v3(fp, curofp);
+ for (j = 0; j < 3; j++, i++) {
+ copy_v3_v3(&fp[j * 3], &curofp[j * 3]);
if (apply_offset) {
- add_v3_v3(fp, ofs[i]);
+ add_v3_v3(&fp[j * 3], ofs[i]);
}
-
- fp += 3; curofp += 3;
}
- fp[0] = curofp[0];
+ fp[9] = curofp[9];
+ fp[10] = curofp[10];
if (apply_offset) {
/* apply alfa offsets */
- add_v3_v3(fp, ofs[i]);
+ add_v3_v3(fp + 9, ofs[i]);
i++;
}
- fp += 3; /* alphas */
+ fp += KEYELEM_FLOAT_LEN_BEZTRIPLE;
}
else {
int j;
- for (j = 0; j < 3; ++j, ++i) {
- copy_v3_v3(fp, bezt->vec[j]);
- fp += 3;
+ for (j = 0; j < 3; j++, i++) {
+ copy_v3_v3(&fp[j * 3], bezt->vec[j]);
}
- fp[0] = bezt->alfa;
+ fp[9] = bezt->alfa;
+ fp[10] = bezt->radius;
- fp += 3; /* alphas */
+ fp += KEYELEM_FLOAT_LEN_BEZTRIPLE;
}
bezt++;
}
@@ -823,18 +831,20 @@ static void calc_shapeKeys(Object *obedit, ListBase *newnurbs)
curofp = ofp + index;
copy_v3_v3(fp, curofp);
fp[3] = curofp[3];
+ fp[4] = curofp[4];
if (apply_offset) {
add_v3_v3(fp, ofs[i]);
- fp[3] += ofs[i + 1][0];
+ add_v3_v3(&fp[3], ofs[i + 1]);
}
}
else {
copy_v3_v3(fp, bp->vec);
fp[3] = bp->alfa;
+ fp[4] = bp->radius;
}
- fp += 4;
+ fp += KEYELEM_FLOAT_LEN_BPOINT;
bp++;
i += 2;
}
@@ -1283,61 +1293,116 @@ static int separate_exec(bContext *C, wmOperator *op)
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
- Object *oldob, *newob;
- Base *oldbase, *newbase;
- Curve *oldcu, *newcu;
- EditNurb *newedit;
- ListBase newnurb = {NULL, NULL};
-
- oldbase = CTX_data_active_base(C);
- oldob = oldbase->object;
- oldcu = oldob->data;
-
- if (oldcu->key) {
- BKE_report(op->reports, RPT_ERROR, "Cannot separate a curve with vertex keys");
- return OPERATOR_CANCELLED;
- }
+ View3D *v3d = CTX_wm_view3d(C);
+
+ struct {
+ int changed;
+ int unselected;
+ int error_vertex_keys;
+ int error_generic;
+ } status = {0};
WM_cursor_wait(1);
- /* 1. duplicate geometry and check for valid selection for separate */
- adduplicateflagNurb(oldob, &newnurb, SELECT, true);
+ uint bases_len = 0;
+ Base **bases = BKE_view_layer_array_from_bases_in_edit_mode_unique_data(view_layer, &bases_len);
+ for (uint b_index = 0; b_index < bases_len; b_index++) {
+ Base *oldbase = bases[b_index];
+ Base *newbase;
+ Object *oldob, *newob;
+ Curve *oldcu, *newcu;
+ EditNurb *newedit;
+ ListBase newnurb = {NULL, NULL};
+
+ oldob = oldbase->object;
+ oldcu = oldob->data;
+
+ if (oldcu->key) {
+ status.error_vertex_keys++;
+ continue;
+ }
- if (BLI_listbase_is_empty(&newnurb)) {
- WM_cursor_wait(0);
- BKE_report(op->reports, RPT_ERROR, "Cannot separate current selection");
- return OPERATOR_CANCELLED;
- }
+ if (!ED_curve_select_check(v3d, oldcu->editnurb)) {
+ status.unselected++;
+ continue;
+ }
- /* 2. duplicate the object and data */
- newbase = ED_object_add_duplicate(bmain, scene, view_layer, oldbase, 0); /* 0 = fully linked */
- DEG_relations_tag_update(bmain);
+ /* 1. Duplicate geometry and check for valid selection for separate. */
+ adduplicateflagNurb(oldob, v3d, &newnurb, SELECT, true);
- newob = newbase->object;
- newcu = newob->data = BKE_curve_copy(bmain, oldcu);
- newcu->editnurb = NULL;
- id_us_min(&oldcu->id); /* because new curve is a copy: reduce user count */
+ if (BLI_listbase_is_empty(&newnurb)) {
+ status.error_generic++;
+ continue;
+ }
- /* 3. put new object in editmode, clear it and set separated nurbs */
- ED_curve_editnurb_make(newob);
- newedit = newcu->editnurb;
- BKE_nurbList_free(&newedit->nurbs);
- BKE_curve_editNurb_keyIndex_free(&newedit->keyindex);
- BLI_movelisttolist(&newedit->nurbs, &newnurb);
+ /* 2. Duplicate the object and data. */
+ newbase = ED_object_add_duplicate(bmain, scene, view_layer, oldbase, 0); /* 0 = fully linked. */
+ DEG_relations_tag_update(bmain);
- /* 4. put old object out of editmode and delete separated geometry */
- ED_curve_editnurb_load(bmain, newob);
- ED_curve_editnurb_free(newob);
- curve_delete_segments(oldob, true);
+ newob = newbase->object;
+ newcu = newob->data = BKE_curve_copy(bmain, oldcu);
+ newcu->editnurb = NULL;
+ id_us_min(&oldcu->id); /* Because new curve is a copy: reduce user count. */
- DEG_id_tag_update(&oldob->id, OB_RECALC_DATA); /* this is the original one */
- DEG_id_tag_update(&newob->id, OB_RECALC_DATA); /* this is the separated one */
+ /* 3. Put new object in editmode, clear it and set separated nurbs. */
+ ED_curve_editnurb_make(newob);
+ newedit = newcu->editnurb;
+ BKE_nurbList_free(&newedit->nurbs);
+ BKE_curve_editNurb_keyIndex_free(&newedit->keyindex);
+ BLI_movelisttolist(&newedit->nurbs, &newnurb);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, oldob->data);
- WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, newob);
+ /* 4. Put old object out of editmode and delete separated geometry. */
+ ED_curve_editnurb_load(bmain, newob);
+ ED_curve_editnurb_free(newob);
+ curve_delete_segments(oldob, v3d, true);
+ DEG_id_tag_update(&oldob->id, OB_RECALC_DATA); /* This is the original one. */
+ DEG_id_tag_update(&newob->id, OB_RECALC_DATA); /* This is the separated one. */
+
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, oldob->data);
+ WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, newob);
+ status.changed++;
+ }
+ MEM_freeN(bases);
WM_cursor_wait(0);
+ if (status.unselected == bases_len) {
+ BKE_report(op->reports, RPT_ERROR, "No point was selected");
+ return OPERATOR_CANCELLED;
+ }
+
+ const int tot_errors = status.error_vertex_keys + status.error_generic;
+ if (tot_errors > 0) {
+
+ /* Some curves changed, but some curves failed: don't explain why it failed. */
+ if (status.changed) {
+ BKE_reportf(op->reports,
+ RPT_INFO,
+ tot_errors == 1 ? "%d curve could not be separated" :
+ "%d curves could not be separated",
+ tot_errors);
+ return OPERATOR_FINISHED;
+ }
+
+ /* All curves failed: If there is more than one error give a generic error report. */
+ if (((status.error_vertex_keys ? 1 : 0) + (status.error_generic ? 1 : 0)) > 1) {
+ BKE_report(op->reports,
+ RPT_ERROR,
+ tot_errors == 1 ? "Could not separate selected curves" :
+ "Could not separate selected curve");
+ }
+
+ /* All curves failed due to the same error. */
+ if (status.error_vertex_keys) {
+ BKE_report(op->reports, RPT_ERROR, "Cannot separate curves with vertex keys");
+ }
+ else {
+ BLI_assert(status.error_generic);
+ BKE_report(op->reports, RPT_ERROR, "Cannot separate current selection");
+ }
+ return OPERATOR_CANCELLED;
+ }
+
return OPERATOR_FINISHED;
}
@@ -1361,31 +1426,50 @@ void CURVE_OT_separate(wmOperatorType *ot)
static int curve_split_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- ListBase *editnurb = object_editcurve_get(obedit);
- ListBase newnurb = {NULL, NULL};
-
- adduplicateflagNurb(obedit, &newnurb, SELECT, true);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ View3D *v3d = CTX_wm_view3d(C);
+ int ok = -1;
- if (BLI_listbase_is_empty(&newnurb) == false) {
+ uint objects_len;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
Curve *cu = obedit->data;
+
+ if (!ED_curve_select_check(v3d, cu->editnurb)) {
+ continue;
+ }
+
+ ListBase newnurb = {NULL, NULL};
+
+ adduplicateflagNurb(obedit, v3d, &newnurb, SELECT, true);
+
+ if (BLI_listbase_is_empty(&newnurb)) {
+ ok = MAX2(ok, 0);
+ continue;
+ }
+
+ ListBase *editnurb = object_editcurve_get(obedit);
const int len_orig = BLI_listbase_count(editnurb);
- curve_delete_segments(obedit, true);
+ curve_delete_segments(obedit, v3d, true);
cu->actnu -= len_orig - BLI_listbase_count(editnurb);
BLI_movelisttolist(editnurb, &newnurb);
- if (ED_curve_updateAnimPaths(obedit->data))
+ if (ED_curve_updateAnimPaths(obedit->data)) {
WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
+ }
+ ok = 1;
WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
DEG_id_tag_update(obedit->data, 0);
}
- else {
+ MEM_freeN(objects);
+
+ if (ok == 0) {
BKE_report(op->reports, RPT_ERROR, "Cannot split current selection");
return OPERATOR_CANCELLED;
}
-
return OPERATOR_FINISHED;
}
@@ -1681,7 +1765,7 @@ static void ed_surf_delete_selected(Object *obedit)
}
}
-static void ed_curve_delete_selected(Object *obedit)
+static void ed_curve_delete_selected(Object *obedit, View3D *v3d)
{
Curve *cu = obedit->data;
EditNurb *editnurb = cu->editnurb;
@@ -1700,7 +1784,7 @@ static void ed_curve_delete_selected(Object *obedit)
a = nu->pntsu;
if (a) {
while (a) {
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt)) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) {
/* pass */
}
else {
@@ -1762,7 +1846,7 @@ static void ed_curve_delete_selected(Object *obedit)
if (nu->type == CU_BEZIER) {
bezt = nu->bezt;
for (a = 0; a < nu->pntsu; a++) {
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt)) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) {
memmove(bezt, bezt + 1, (nu->pntsu - a - 1) * sizeof(BezTriple));
keyIndex_delBezt(editnurb, bezt);
keyIndex_updateBezt(editnurb, bezt + 1, bezt, nu->pntsu - a - 1);
@@ -1953,7 +2037,7 @@ static bool calc_duplicate_actvert(
return false;
}
-static void adduplicateflagNurb(Object *obedit, ListBase *newnurb,
+static void adduplicateflagNurb(Object *obedit, View3D *v3d, ListBase *newnurb,
const short flag, const bool split)
{
ListBase *editnurb = object_editcurve_get(obedit);
@@ -2099,7 +2183,7 @@ static void adduplicateflagNurb(Object *obedit, ListBase *newnurb,
}
}
else {
- if (ED_curve_nurb_select_check(cu, nu)) {
+ if (ED_curve_nurb_select_check(v3d, nu)) {
/* a rectangular area in nurb has to be selected and if splitting must be in U or V direction */
usel = MEM_callocN(nu->pntsu, "adduplicateN3");
bp = nu->bp;
@@ -2306,28 +2390,41 @@ static void adduplicateflagNurb(Object *obedit, ListBase *newnurb,
static int switch_direction_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *obedit = CTX_data_edit_object(C);
- Curve *cu = (Curve *)obedit->data;
- EditNurb *editnurb = cu->editnurb;
- Nurb *nu;
- int i;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ View3D *v3d = CTX_wm_view3d(C);
- for (nu = editnurb->nurbs.first, i = 0; nu; nu = nu->next, i++) {
- if (ED_curve_nurb_select_check(cu, nu)) {
- BKE_nurb_direction_switch(nu);
- keyData_switchDirectionNurb(cu, nu);
- if ((i == cu->actnu) && (cu->actvert != CU_ACT_NONE)) {
- cu->actvert = (nu->pntsu - 1) - cu->actvert;
- }
+ uint objects_len;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = obedit->data;
+
+ if (!ED_curve_select_check(v3d, cu->editnurb)) {
+ continue;
}
- }
- if (ED_curve_updateAnimPaths(obedit->data))
- WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
+ EditNurb *editnurb = cu->editnurb;
+ Nurb *nu;
+ int i;
- DEG_id_tag_update(obedit->data, 0);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ for (nu = editnurb->nurbs.first, i = 0; nu; nu = nu->next, i++) {
+ if (ED_curve_nurb_select_check(v3d, nu)) {
+ BKE_nurb_direction_switch(nu);
+ keyData_switchDirectionNurb(cu, nu);
+ if ((i == cu->actnu) && (cu->actvert != CU_ACT_NONE)) {
+ cu->actvert = (nu->pntsu - 1) - cu->actvert;
+ }
+ }
+ }
+ if (ED_curve_updateAnimPaths(obedit->data)) {
+ WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
+ }
+
+ DEG_id_tag_update(obedit->data, 0);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -2849,58 +2946,71 @@ void CURVE_OT_smooth_tilt(wmOperatorType *ot)
static int hide_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- Curve *cu = obedit->data;
- ListBase *editnurb = object_editcurve_get(obedit);
- Nurb *nu;
- BPoint *bp;
- BezTriple *bezt;
- int a, sel;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ View3D *v3d = CTX_wm_view3d(C);
+
const bool invert = RNA_boolean_get(op->ptr, "unselected");
- for (nu = editnurb->first; nu; nu = nu->next) {
- if (nu->type == CU_BEZIER) {
- bezt = nu->bezt;
- a = nu->pntsu;
- sel = 0;
- while (a--) {
- if (invert == 0 && BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt)) {
- select_beztriple(bezt, DESELECT, SELECT, HIDDEN);
- bezt->hide = 1;
- }
- else if (invert && !BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt)) {
- select_beztriple(bezt, DESELECT, SELECT, HIDDEN);
- bezt->hide = 1;
- }
- if (bezt->hide) sel++;
- bezt++;
- }
- if (sel == nu->pntsu) nu->hide = 1;
+ uint objects_len;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = obedit->data;
+
+ if (!(invert || ED_curve_select_check(v3d, cu->editnurb))) {
+ continue;
}
- else {
- bp = nu->bp;
- a = nu->pntsu * nu->pntsv;
- sel = 0;
- while (a--) {
- if (invert == 0 && (bp->f1 & SELECT)) {
- select_bpoint(bp, DESELECT, SELECT, HIDDEN);
- bp->hide = 1;
+
+ ListBase *editnurb = object_editcurve_get(obedit);
+ Nurb *nu;
+ BPoint *bp;
+ BezTriple *bezt;
+ int a, sel;
+
+ for (nu = editnurb->first; nu; nu = nu->next) {
+ if (nu->type == CU_BEZIER) {
+ bezt = nu->bezt;
+ a = nu->pntsu;
+ sel = 0;
+ while (a--) {
+ if (invert == 0 && BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) {
+ select_beztriple(bezt, DESELECT, SELECT, HIDDEN);
+ bezt->hide = 1;
+ }
+ else if (invert && !BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) {
+ select_beztriple(bezt, DESELECT, SELECT, HIDDEN);
+ bezt->hide = 1;
+ }
+ if (bezt->hide) sel++;
+ bezt++;
}
- else if (invert && (bp->f1 & SELECT) == 0) {
- select_bpoint(bp, DESELECT, SELECT, HIDDEN);
- bp->hide = 1;
+ if (sel == nu->pntsu) nu->hide = 1;
+ }
+ else {
+ bp = nu->bp;
+ a = nu->pntsu * nu->pntsv;
+ sel = 0;
+ while (a--) {
+ if (invert == 0 && (bp->f1 & SELECT)) {
+ select_bpoint(bp, DESELECT, SELECT, HIDDEN);
+ bp->hide = 1;
+ }
+ else if (invert && (bp->f1 & SELECT) == 0) {
+ select_bpoint(bp, DESELECT, SELECT, HIDDEN);
+ bp->hide = 1;
+ }
+ if (bp->hide) sel++;
+ bp++;
}
- if (bp->hide) sel++;
- bp++;
+ if (sel == nu->pntsu * nu->pntsv) nu->hide = 1;
}
- if (sel == nu->pntsu * nu->pntsv) nu->hide = 1;
}
- }
-
- DEG_id_tag_update(obedit->data, DEG_TAG_COPY_ON_WRITE | DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
- BKE_curve_nurb_vert_active_validate(obedit->data);
+ DEG_id_tag_update(obedit->data, DEG_TAG_COPY_ON_WRITE | DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ BKE_curve_nurb_vert_active_validate(obedit->data);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -2926,44 +3036,57 @@ void CURVE_OT_hide(wmOperatorType *ot)
static int reveal_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- ListBase *editnurb = object_editcurve_get(obedit);
- Nurb *nu;
- BPoint *bp;
- BezTriple *bezt;
- int a;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
const bool select = RNA_boolean_get(op->ptr, "select");
+ bool changed_multi = false;
- for (nu = editnurb->first; nu; nu = nu->next) {
- nu->hide = 0;
- if (nu->type == CU_BEZIER) {
- bezt = nu->bezt;
- a = nu->pntsu;
- while (a--) {
- if (bezt->hide) {
- select_beztriple(bezt, select, SELECT, HIDDEN);
- bezt->hide = 0;
+ uint objects_len;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ ListBase *editnurb = object_editcurve_get(obedit);
+ Nurb *nu;
+ BPoint *bp;
+ BezTriple *bezt;
+ int a;
+ bool changed = false;
+
+ for (nu = editnurb->first; nu; nu = nu->next) {
+ nu->hide = 0;
+ if (nu->type == CU_BEZIER) {
+ bezt = nu->bezt;
+ a = nu->pntsu;
+ while (a--) {
+ if (bezt->hide) {
+ select_beztriple(bezt, select, SELECT, HIDDEN);
+ bezt->hide = 0;
+ changed = true;
+ }
+ bezt++;
}
- bezt++;
}
- }
- else {
- bp = nu->bp;
- a = nu->pntsu * nu->pntsv;
- while (a--) {
- if (bp->hide) {
- select_bpoint(bp, select, SELECT, HIDDEN);
- bp->hide = 0;
+ else {
+ bp = nu->bp;
+ a = nu->pntsu * nu->pntsv;
+ while (a--) {
+ if (bp->hide) {
+ select_bpoint(bp, select, SELECT, HIDDEN);
+ bp->hide = 0;
+ changed = true;
+ }
+ bp++;
}
- bp++;
}
}
- }
-
- DEG_id_tag_update(obedit->data, DEG_TAG_COPY_ON_WRITE | DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
- return OPERATOR_FINISHED;
+ if (changed) {
+ DEG_id_tag_update(obedit->data, DEG_TAG_COPY_ON_WRITE | DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ changed_multi = true;
+ }
+ }
+ MEM_freeN(objects);
+ return changed_multi ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
void CURVE_OT_reveal(wmOperatorType *ot)
@@ -2989,7 +3112,7 @@ void CURVE_OT_reveal(wmOperatorType *ot)
* curve nodes (Bezier or NURB). If there are no valid segment
* selections within the current selection, nothing happens.
*/
-static void subdividenurb(Object *obedit, int number_cuts)
+static void subdividenurb(Object *obedit, View3D *v3d, int number_cuts)
{
Curve *cu = obedit->data;
EditNurb *editnurb = cu->editnurb;
@@ -3021,7 +3144,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
break;
}
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt) && BEZT_ISSEL_ANY_HIDDENHANDLES(cu, nextbezt)) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt) && BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, nextbezt)) {
amount += number_cuts;
}
bezt++;
@@ -3043,7 +3166,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
break;
}
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt) && BEZT_ISSEL_ANY_HIDDENHANDLES(cu, nextbezt)) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt) && BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, nextbezt)) {
float prevvec[3][3];
memcpy(prevvec, bezt->vec, sizeof(float) * 9);
@@ -3375,6 +3498,7 @@ static int subdivide_exec(bContext *C, wmOperator *op)
const int number_cuts = RNA_int_get(op->ptr, "number_cuts");
ViewLayer *view_layer = CTX_data_view_layer(C);
+ View3D *v3d = CTX_wm_view3d(C);
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
@@ -3382,11 +3506,11 @@ static int subdivide_exec(bContext *C, wmOperator *op)
Object *obedit = objects[ob_index];
Curve *cu = obedit->data;
- if (!ED_curve_select_check(cu, cu->editnurb)) {
+ if (!ED_curve_select_check(v3d, cu->editnurb)) {
continue;
}
- subdividenurb(obedit, number_cuts);
+ subdividenurb(obedit, v3d, number_cuts);
if (ED_curve_updateAnimPaths(cu))
WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
@@ -3424,7 +3548,7 @@ void CURVE_OT_subdivide(wmOperatorType *ot)
static void ED_curve_pick_vert__doClosest(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, const float screen_co[2])
{
- struct { BPoint *bp; BezTriple *bezt; Nurb *nurb; float dist; int hpoint, select; float mval_fl[2]; } *data = userData;
+ struct { BPoint *bp; BezTriple *bezt; Nurb *nurb; float dist; int hpoint, select; float mval_fl[2]; bool is_changed; } *data = userData;
short flag;
float dist_test;
@@ -3455,26 +3579,41 @@ static void ED_curve_pick_vert__doClosest(void *userData, Nurb *nu, BPoint *bp,
data->bezt = bezt;
data->nurb = nu;
data->hpoint = bezt ? beztindex : 0;
+ data->is_changed = true;
}
}
bool ED_curve_pick_vert(
- ViewContext *vc, short sel, const int mval[2],
- Nurb **r_nurb, BezTriple **r_bezt, BPoint **r_bp, short *r_handle)
+ ViewContext *vc, short sel,
+ Nurb **r_nurb, BezTriple **r_bezt, BPoint **r_bp, short *r_handle,
+ Base **r_base)
{
/* (sel == 1): selected gets a disadvantage */
/* in nurb and bezt or bp the nearest is written */
/* return 0 1 2: handlepunt */
- struct { BPoint *bp; BezTriple *bezt; Nurb *nurb; float dist; int hpoint, select; float mval_fl[2]; } data = {NULL};
+ struct { BPoint *bp; BezTriple *bezt; Nurb *nurb; float dist; int hpoint, select; float mval_fl[2]; bool is_changed; } data = {NULL};
data.dist = ED_view3d_select_dist_px();
data.hpoint = 0;
data.select = sel;
- data.mval_fl[0] = mval[0];
- data.mval_fl[1] = mval[1];
+ data.mval_fl[0] = vc->mval[0];
+ data.mval_fl[1] = vc->mval[1];
- ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
- nurbs_foreachScreenVert(vc, ED_curve_pick_vert__doClosest, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
+ uint bases_len;
+ Base **bases = BKE_view_layer_array_from_bases_in_edit_mode_unique_data(vc->view_layer, &bases_len);
+ for (uint base_index = 0; base_index < bases_len; base_index++) {
+ Base *base = bases[base_index];
+ data.is_changed = false;
+
+ ED_view3d_viewcontext_init_object(vc, base->object);
+ ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
+ nurbs_foreachScreenVert(vc, ED_curve_pick_vert__doClosest, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
+
+ if (r_base && data.is_changed) {
+ *r_base = base;
+ }
+ }
+ MEM_freeN(bases);
*r_nurb = data.nurb;
*r_bezt = data.bezt;
@@ -3488,7 +3627,7 @@ bool ED_curve_pick_vert(
}
static void findselectedNurbvert(
- Curve *cu,
+ Curve *cu, View3D *v3d,
Nurb **r_nu, BezTriple **r_bezt, BPoint **r_bp)
{
/* in nu and (bezt or bp) selected are written if there's 1 sel. */
@@ -3508,7 +3647,7 @@ static void findselectedNurbvert(
bezt1 = nu1->bezt;
a = nu1->pntsu;
while (a--) {
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt1)) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt1)) {
if (*r_nu != NULL && *r_nu != nu1) {
*r_nu = NULL;
*r_bp = NULL;
@@ -3558,6 +3697,7 @@ static void findselectedNurbvert(
static int set_spline_type_exec(bContext *C, wmOperator *op)
{
Object *obedit = CTX_data_edit_object(C);
+ View3D *v3d = CTX_wm_view3d(C);
ListBase *editnurb = object_editcurve_get(obedit);
Nurb *nu;
bool changed = false;
@@ -3571,7 +3711,7 @@ static int set_spline_type_exec(bContext *C, wmOperator *op)
}
for (nu = editnurb->first; nu; nu = nu->next) {
- if (ED_curve_nurb_select_check(obedit->data, nu)) {
+ if (ED_curve_nurb_select_check(v3d, nu)) {
const int pntsu_prev = nu->pntsu;
if (BKE_nurb_type_convert(nu, type, use_handles)) {
changed = true;
@@ -3637,14 +3777,27 @@ void CURVE_OT_spline_type_set(wmOperatorType *ot)
static int set_handle_type_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- ListBase *editnurb = object_editcurve_get(obedit);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ View3D *v3d = CTX_wm_view3d(C);
+ const int handle_type = RNA_enum_get(op->ptr, "type");
- BKE_nurbList_handles_set(editnurb, RNA_enum_get(op->ptr, "type"));
+ uint objects_len;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = obedit->data;
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
- DEG_id_tag_update(obedit->data, 0);
+ if (!ED_curve_select_check(v3d, cu->editnurb)) {
+ continue;
+ }
+ ListBase *editnurb = object_editcurve_get(obedit);
+ BKE_nurbList_handles_set(editnurb, handle_type);
+
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ DEG_id_tag_update(obedit->data, 0);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -3681,15 +3834,28 @@ void CURVE_OT_handle_type_set(wmOperatorType *ot)
static int curve_normals_make_consistent_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- ListBase *editnurb = object_editcurve_get(obedit);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ View3D *v3d = CTX_wm_view3d(C);
+
const bool calc_length = RNA_boolean_get(op->ptr, "calc_length");
- BKE_nurbList_handles_recalculate(editnurb, calc_length, SELECT);
+ uint objects_len;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = obedit->data;
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
- DEG_id_tag_update(obedit->data, 0);
+ if (!ED_curve_select_check(v3d, cu->editnurb)) {
+ continue;
+ }
+
+ ListBase *editnurb = object_editcurve_get(obedit);
+ BKE_nurbList_handles_recalculate(editnurb, calc_length, SELECT);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ DEG_id_tag_update(obedit->data, 0);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -3808,7 +3974,7 @@ typedef struct NurbSort {
static ListBase nsortbase = {NULL, NULL};
/* static NurbSort *nusmain; */ /* this var seems to go unused... at least in this file */
-static void make_selection_list_nurb(Curve *cu, ListBase *editnurb)
+static void make_selection_list_nurb(View3D *v3d, ListBase *editnurb)
{
ListBase nbase = {NULL, NULL};
NurbSort *nus, *nustest, *headdo, *taildo;
@@ -3818,7 +3984,7 @@ static void make_selection_list_nurb(Curve *cu, ListBase *editnurb)
int a;
for (nu = editnurb->first; nu; nu = nu->next) {
- if (ED_curve_nurb_select_check(cu, nu)) {
+ if (ED_curve_nurb_select_check(v3d, nu)) {
nus = (NurbSort *)MEM_callocN(sizeof(NurbSort), "sort");
BLI_addhead(&nbase, nus);
@@ -3875,7 +4041,14 @@ static void make_selection_list_nurb(Curve *cu, ListBase *editnurb)
}
}
-static void merge_2_nurb(wmOperator *op, Curve *cu, ListBase *editnurb, Nurb *nu1, Nurb *nu2)
+enum {
+ CURVE_MERGE_OK = 0,
+ CURVE_MERGE_ERR_FEW_SELECTION,
+ CURVE_MERGE_ERR_RESOLUTION_ALL,
+ CURVE_MERGE_ERR_RESOLUTION_SOME,
+};
+
+static bool merge_2_nurb(Curve *cu, ListBase *editnurb, Nurb *nu1, Nurb *nu2)
{
BPoint *bp, *bp1, *bp2, *temp;
float len1, len2;
@@ -3911,7 +4084,7 @@ static void merge_2_nurb(wmOperator *op, Curve *cu, ListBase *editnurb, Nurb *nu
else {
/* rotate again, now its OK! */
if (nu1->pntsv != 1) rotate_direction_nurb(nu1);
- return;
+ return true;
}
}
}
@@ -3941,15 +4114,14 @@ static void merge_2_nurb(wmOperator *op, Curve *cu, ListBase *editnurb, Nurb *nu
/* rotate again, now its OK! */
if (nu1->pntsu == 1) rotate_direction_nurb(nu1);
if (nu2->pntsv != 1) rotate_direction_nurb(nu2);
- return;
+ return true;
}
}
}
}
if (nu1->pntsv != nu2->pntsv) {
- BKE_report(op->reports, RPT_ERROR, "Resolution does not match");
- return;
+ return false;
}
/* ok, now nu1 has the rightmost column and nu2 the leftmost column selected */
@@ -4012,22 +4184,21 @@ static void merge_2_nurb(wmOperator *op, Curve *cu, ListBase *editnurb, Nurb *nu
MEM_freeN(temp);
BLI_remlink(editnurb, nu2);
BKE_nurb_free(nu2);
+ return true;
}
-static int merge_nurb(bContext *C, wmOperator *op)
+static int merge_nurb(View3D *v3d, Object *obedit)
{
- Object *obedit = CTX_data_edit_object(C);
Curve *cu = obedit->data;
ListBase *editnurb = object_editcurve_get(obedit);
NurbSort *nus1, *nus2;
bool ok = true;
- make_selection_list_nurb(cu, editnurb);
+ make_selection_list_nurb(v3d, editnurb);
if (nsortbase.first == nsortbase.last) {
BLI_freelistN(&nsortbase);
- BKE_report(op->reports, RPT_ERROR, "Too few selections to merge");
- return OPERATOR_CANCELLED;
+ return CURVE_MERGE_ERR_FEW_SELECTION;
}
nus1 = nsortbase.first;
@@ -4039,7 +4210,7 @@ static int merge_nurb(bContext *C, wmOperator *op)
/* pass */
}
else {
- ok = 0;
+ ok = false;
}
}
else if (nus2->nu->pntsv == 1) {
@@ -4047,7 +4218,7 @@ static int merge_nurb(bContext *C, wmOperator *op)
/* pass */
}
else {
- ok = 0;
+ ok = false;
}
}
else if (nus1->nu->pntsu == nus2->nu->pntsu || nus1->nu->pntsv == nus2->nu->pntsv) {
@@ -4057,233 +4228,309 @@ static int merge_nurb(bContext *C, wmOperator *op)
/* pass */
}
else {
- ok = 0;
+ ok = false;
}
- if (ok == 0) {
- BKE_report(op->reports, RPT_ERROR, "Resolution does not match");
+ if (ok == false) {
BLI_freelistN(&nsortbase);
- return OPERATOR_CANCELLED;
+ return CURVE_MERGE_ERR_RESOLUTION_ALL;
}
while (nus2) {
- merge_2_nurb(op, cu, editnurb, nus1->nu, nus2->nu);
+ /* There is a change a few curves merged properly, but not all.
+ * In this case we still update the curve, yet report the error. */
+ ok &= merge_2_nurb(cu, editnurb, nus1->nu, nus2->nu);
nus2 = nus2->next;
}
BLI_freelistN(&nsortbase);
-
BKE_curve_nurb_active_set(obedit->data, NULL);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
- DEG_id_tag_update(obedit->data, 0);
-
- return OPERATOR_FINISHED;
+ return ok ? CURVE_MERGE_OK : CURVE_MERGE_ERR_RESOLUTION_SOME;
}
static int make_segment_exec(bContext *C, wmOperator *op)
{
- /* joins 2 curves */
- Object *obedit = CTX_data_edit_object(C);
- Curve *cu = obedit->data;
- ListBase *nubase = object_editcurve_get(obedit);
- Nurb *nu, *nu1 = NULL, *nu2 = NULL;
- BPoint *bp;
- bool ok = false;
- /* int a; */ /* UNUSED */
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ View3D *v3d = CTX_wm_view3d(C);
- /* first decide if this is a surface merge! */
- if (obedit->type == OB_SURF) nu = nubase->first;
- else nu = NULL;
+ struct {
+ int changed;
+ int unselected;
+ int error_selected_few;
+ int error_resolution;
+ int error_generic;
+ } status = {0};
- while (nu) {
- const int nu_select_num = ED_curve_nurb_select_count(cu, nu);
- if (nu_select_num) {
+ uint objects_len;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = obedit->data;
- if (nu->pntsu > 1 && nu->pntsv > 1) {
- break;
- }
+ if (!ED_curve_select_check(v3d, cu->editnurb)) {
+ status.unselected++;
+ continue;
+ }
- if (nu_select_num > 1) {
- break;
- }
- else {
- /* only 1 selected, not first or last, a little complex, but intuitive */
- if (nu->pntsv == 1) {
- if ((nu->bp->f1 & SELECT) || (nu->bp[nu->pntsu - 1].f1 & SELECT)) {
- /* pass */
- }
- else {
- break;
+ ListBase *nubase = object_editcurve_get(obedit);
+ Nurb *nu, *nu1 = NULL, *nu2 = NULL;
+ BPoint *bp;
+ bool ok = false;
+
+ /* first decide if this is a surface merge! */
+ if (obedit->type == OB_SURF) nu = nubase->first;
+ else nu = NULL;
+
+ while (nu) {
+ const int nu_select_num = ED_curve_nurb_select_count(v3d, nu);
+ if (nu_select_num) {
+
+ if (nu->pntsu > 1 && nu->pntsv > 1) {
+ break;
+ }
+
+ if (nu_select_num > 1) {
+ break;
+ }
+ else {
+ /* only 1 selected, not first or last, a little complex, but intuitive */
+ if (nu->pntsv == 1) {
+ if ((nu->bp->f1 & SELECT) || (nu->bp[nu->pntsu - 1].f1 & SELECT)) {
+ /* pass */
+ }
+ else {
+ break;
+ }
}
}
}
+ nu = nu->next;
}
- nu = nu->next;
- }
- if (nu)
- return merge_nurb(C, op);
+ if (nu) {
+ int merge_result = merge_nurb(v3d, obedit);
+ switch (merge_result) {
+ case CURVE_MERGE_OK:
+ status.changed++;
+ goto curve_merge_tag_object;
+ case CURVE_MERGE_ERR_RESOLUTION_SOME:
+ status.error_resolution++;
+ goto curve_merge_tag_object;
+ case CURVE_MERGE_ERR_FEW_SELECTION:
+ status.error_selected_few++;
+ break;
+ case CURVE_MERGE_ERR_RESOLUTION_ALL:
+ status.error_resolution++;
+ break;
+ }
+ continue;
+ }
- /* find both nurbs and points, nu1 will be put behind nu2 */
- for (nu = nubase->first; nu; nu = nu->next) {
- if (nu->pntsu == 1)
- nu->flagu &= ~CU_NURB_CYCLIC;
+ /* find both nurbs and points, nu1 will be put behind nu2 */
+ for (nu = nubase->first; nu; nu = nu->next) {
+ if (nu->pntsu == 1)
+ nu->flagu &= ~CU_NURB_CYCLIC;
- if ((nu->flagu & CU_NURB_CYCLIC) == 0) { /* not cyclic */
- if (nu->type == CU_BEZIER) {
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, &(nu->bezt[nu->pntsu - 1]))) {
- /* Last point is selected, preferred for nu2 */
- if (nu2 == NULL) {
- nu2 = nu;
- }
- else if (nu1 == NULL) {
- nu1 = nu;
-
- /* Just in case both of first/last CV are selected check
- * whether we really need to switch the direction.
- */
- if (!BEZT_ISSEL_ANY_HIDDENHANDLES(cu, nu1->bezt)) {
- BKE_nurb_direction_switch(nu1);
- keyData_switchDirectionNurb(cu, nu1);
+ if ((nu->flagu & CU_NURB_CYCLIC) == 0) { /* not cyclic */
+ if (nu->type == CU_BEZIER) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, &(nu->bezt[nu->pntsu - 1]))) {
+ /* Last point is selected, preferred for nu2 */
+ if (nu2 == NULL) {
+ nu2 = nu;
+ }
+ else if (nu1 == NULL) {
+ nu1 = nu;
+
+ /* Just in case both of first/last CV are selected check
+ * whether we really need to switch the direction.
+ */
+ if (!BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, nu1->bezt)) {
+ BKE_nurb_direction_switch(nu1);
+ keyData_switchDirectionNurb(cu, nu1);
+ }
}
}
- }
- else if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, nu->bezt)) {
- /* First point is selected, preferred for nu1 */
- if (nu1 == NULL) {
- nu1 = nu;
- }
- else if (nu2 == NULL) {
- nu2 = nu;
-
- /* Just in case both of first/last CV are selected check
- * whether we really need to switch the direction.
- */
- if (!BEZT_ISSEL_ANY_HIDDENHANDLES(cu, &(nu->bezt[nu2->pntsu - 1]))) {
- BKE_nurb_direction_switch(nu2);
- keyData_switchDirectionNurb(cu, nu2);
+ else if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, nu->bezt)) {
+ /* First point is selected, preferred for nu1 */
+ if (nu1 == NULL) {
+ nu1 = nu;
+ }
+ else if (nu2 == NULL) {
+ nu2 = nu;
+
+ /* Just in case both of first/last CV are selected check
+ * whether we really need to switch the direction.
+ */
+ if (!BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, &(nu->bezt[nu2->pntsu - 1]))) {
+ BKE_nurb_direction_switch(nu2);
+ keyData_switchDirectionNurb(cu, nu2);
+ }
}
}
}
- }
- else if (nu->pntsv == 1) {
- /* Same logic as above: if first point is selected spline is
- * preferred for nu1, if last point is selected spline is
- * preferred for u2u.
- */
+ else if (nu->pntsv == 1) {
+ /* Same logic as above: if first point is selected spline is
+ * preferred for nu1, if last point is selected spline is
+ * preferred for u2u.
+ */
- bp = nu->bp;
- if (bp[nu->pntsu - 1].f1 & SELECT) {
- if (nu2 == NULL) {
- nu2 = nu;
- }
- else if (nu1 == NULL) {
- nu1 = nu;
+ bp = nu->bp;
+ if (bp[nu->pntsu - 1].f1 & SELECT) {
+ if (nu2 == NULL) {
+ nu2 = nu;
+ }
+ else if (nu1 == NULL) {
+ nu1 = nu;
- if ((bp->f1 & SELECT) == 0) {
- BKE_nurb_direction_switch(nu);
- keyData_switchDirectionNurb(cu, nu);
+ if ((bp->f1 & SELECT) == 0) {
+ BKE_nurb_direction_switch(nu);
+ keyData_switchDirectionNurb(cu, nu);
+ }
}
}
- }
- else if (bp->f1 & SELECT) {
- if (nu1 == NULL) {
- nu1 = nu;
- }
- else if (nu2 == NULL) {
- nu2 = nu;
+ else if (bp->f1 & SELECT) {
+ if (nu1 == NULL) {
+ nu1 = nu;
+ }
+ else if (nu2 == NULL) {
+ nu2 = nu;
- if ((bp[nu->pntsu - 1].f1 & SELECT) == 0) {
- BKE_nurb_direction_switch(nu);
- keyData_switchDirectionNurb(cu, nu);
+ if ((bp[nu->pntsu - 1].f1 & SELECT) == 0) {
+ BKE_nurb_direction_switch(nu);
+ keyData_switchDirectionNurb(cu, nu);
+ }
}
}
}
}
- }
- if (nu1 && nu2) {
- /* Got second spline, no need to loop over rest of the splines. */
- break;
+ if (nu1 && nu2) {
+ /* Got second spline, no need to loop over rest of the splines. */
+ break;
+ }
}
- }
- if ((nu1 && nu2) && (nu1 != nu2)) {
- if (nu1->type == nu2->type) {
- if (nu1->type == CU_BEZIER) {
- BezTriple *bezt = (BezTriple *)MEM_mallocN((nu1->pntsu + nu2->pntsu) * sizeof(BezTriple), "addsegmentN");
- ED_curve_beztcpy(cu->editnurb, bezt, nu2->bezt, nu2->pntsu);
- ED_curve_beztcpy(cu->editnurb, bezt + nu2->pntsu, nu1->bezt, nu1->pntsu);
+ if ((nu1 && nu2) && (nu1 != nu2)) {
+ if (nu1->type == nu2->type) {
+ if (nu1->type == CU_BEZIER) {
+ BezTriple *bezt = (BezTriple *)MEM_mallocN((nu1->pntsu + nu2->pntsu) * sizeof(BezTriple), "addsegmentN");
+ ED_curve_beztcpy(cu->editnurb, bezt, nu2->bezt, nu2->pntsu);
+ ED_curve_beztcpy(cu->editnurb, bezt + nu2->pntsu, nu1->bezt, nu1->pntsu);
- MEM_freeN(nu1->bezt);
- nu1->bezt = bezt;
- nu1->pntsu += nu2->pntsu;
- BLI_remlink(nubase, nu2);
- keyIndex_delNurb(cu->editnurb, nu2);
- BKE_nurb_free(nu2); nu2 = NULL;
- BKE_nurb_handles_calc(nu1);
- }
- else {
- bp = (BPoint *)MEM_mallocN((nu1->pntsu + nu2->pntsu) * sizeof(BPoint), "addsegmentN2");
- ED_curve_bpcpy(cu->editnurb, bp, nu2->bp, nu2->pntsu);
- ED_curve_bpcpy(cu->editnurb, bp + nu2->pntsu, nu1->bp, nu1->pntsu);
- MEM_freeN(nu1->bp);
- nu1->bp = bp;
-
- /* a = nu1->pntsu + nu1->orderu; */ /* UNUSED */
-
- nu1->pntsu += nu2->pntsu;
- BLI_remlink(nubase, nu2);
-
- /* now join the knots */
- if (nu1->type == CU_NURBS) {
- if (nu1->knotsu != NULL) {
- MEM_freeN(nu1->knotsu);
- nu1->knotsu = NULL;
+ MEM_freeN(nu1->bezt);
+ nu1->bezt = bezt;
+ nu1->pntsu += nu2->pntsu;
+ BLI_remlink(nubase, nu2);
+ keyIndex_delNurb(cu->editnurb, nu2);
+ BKE_nurb_free(nu2); nu2 = NULL;
+ BKE_nurb_handles_calc(nu1);
+ }
+ else {
+ bp = (BPoint *)MEM_mallocN((nu1->pntsu + nu2->pntsu) * sizeof(BPoint), "addsegmentN2");
+ ED_curve_bpcpy(cu->editnurb, bp, nu2->bp, nu2->pntsu);
+ ED_curve_bpcpy(cu->editnurb, bp + nu2->pntsu, nu1->bp, nu1->pntsu);
+ MEM_freeN(nu1->bp);
+ nu1->bp = bp;
+
+ /* a = nu1->pntsu + nu1->orderu; */ /* UNUSED */
+
+ nu1->pntsu += nu2->pntsu;
+ BLI_remlink(nubase, nu2);
+
+ /* now join the knots */
+ if (nu1->type == CU_NURBS) {
+ if (nu1->knotsu != NULL) {
+ MEM_freeN(nu1->knotsu);
+ nu1->knotsu = NULL;
+ }
+
+ BKE_nurb_knot_calc_u(nu1);
}
+ keyIndex_delNurb(cu->editnurb, nu2);
+ BKE_nurb_free(nu2); nu2 = NULL;
+ }
+ BKE_curve_nurb_active_set(cu, nu1); /* for selected */
+ ok = true;
+ }
+ }
+ else if ((nu1 && !nu2) || (!nu1 && nu2)) {
+ if (nu2) {
+ SWAP(Nurb *, nu1, nu2);
+ }
+
+ if (!(nu1->flagu & CU_NURB_CYCLIC) && nu1->pntsu > 1) {
+ if (nu1->type == CU_BEZIER && BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, nu1->bezt) &&
+ BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, &nu1->bezt[nu1->pntsu - 1]))
+ {
+ nu1->flagu |= CU_NURB_CYCLIC;
+ BKE_nurb_handles_calc(nu1);
+ ok = true;
+ }
+ else if (nu1->type == CU_NURBS && nu1->bp->f1 & SELECT && (nu1->bp[nu1->pntsu - 1].f1 & SELECT)) {
+ nu1->flagu |= CU_NURB_CYCLIC;
BKE_nurb_knot_calc_u(nu1);
+ ok = true;
}
- keyIndex_delNurb(cu->editnurb, nu2);
- BKE_nurb_free(nu2); nu2 = NULL;
}
-
- BKE_curve_nurb_active_set(cu, nu1); /* for selected */
- ok = 1;
}
- }
- else if ((nu1 && !nu2) || (!nu1 && nu2)) {
- if (nu2) {
- SWAP(Nurb *, nu1, nu2);
+
+ if (!ok) {
+ status.error_generic++;
+ continue;
}
- if (!(nu1->flagu & CU_NURB_CYCLIC) && nu1->pntsu > 1) {
- if (nu1->type == CU_BEZIER && BEZT_ISSEL_ANY_HIDDENHANDLES(cu, nu1->bezt) &&
- BEZT_ISSEL_ANY_HIDDENHANDLES(cu, &nu1->bezt[nu1->pntsu - 1]))
- {
- nu1->flagu |= CU_NURB_CYCLIC;
- BKE_nurb_handles_calc(nu1);
- ok = 1;
- }
- else if (nu1->type == CU_NURBS && nu1->bp->f1 & SELECT && (nu1->bp[nu1->pntsu - 1].f1 & SELECT)) {
- nu1->flagu |= CU_NURB_CYCLIC;
- BKE_nurb_knot_calc_u(nu1);
- ok = 1;
- }
+ if (ED_curve_updateAnimPaths(obedit->data)) {
+ WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
}
+
+ status.changed++;
+
+curve_merge_tag_object:
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ DEG_id_tag_update(obedit->data, 0);
}
+ MEM_freeN(objects);
- if (!ok) {
- BKE_report(op->reports, RPT_ERROR, "Cannot make segment");
+ if (status.unselected == objects_len) {
+ BKE_report(op->reports, RPT_ERROR, "No points were selected");
return OPERATOR_CANCELLED;
}
- if (ED_curve_updateAnimPaths(obedit->data))
- WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
+ const int tot_errors = status.error_selected_few + status.error_resolution + status.error_generic;
+ if (tot_errors > 0) {
+ /* Some curves changed, but some curves failed: don't explain why it failed. */
+ if (status.changed) {
+ BKE_reportf(op->reports,
+ RPT_INFO,
+ tot_errors == 1 ? "%d curve could not make segments" :
+ "%d curves could not make segments",
+ tot_errors);
+ return OPERATOR_FINISHED;
+ }
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
- DEG_id_tag_update(obedit->data, 0);
+ /* All curves failed: If there is more than one error give a generic error report. */
+ if (((status.error_selected_few ? 1 : 0) +
+ (status.error_resolution ? 1 : 0) +
+ (status.error_generic ? 1 : 0)) > 1)
+ {
+ BKE_report(op->reports, RPT_ERROR, "Could not make new segments");
+ }
+
+ /* All curves failed due to the same error. */
+ if (status.error_selected_few) {
+ BKE_report(op->reports, RPT_ERROR, "Too few selections to merge");
+ }
+ else if (status.error_resolution) {
+ BKE_report(op->reports, RPT_ERROR, "Resolution does not match");
+ }
+ else {
+ BLI_assert(status.error_generic);
+ BKE_report(op->reports, RPT_ERROR, "Cannot make segment");
+ }
+ return OPERATOR_CANCELLED;
+ }
return OPERATOR_FINISHED;
}
@@ -4307,24 +4554,37 @@ void CURVE_OT_make_segment(wmOperatorType *ot)
bool ED_curve_editnurb_select_pick(bContext *C, const int mval[2], bool extend, bool deselect, bool toggle)
{
- Object *obedit = CTX_data_edit_object(C);
- Curve *cu = obedit->data;
- ListBase *editnurb = object_editcurve_get(obedit);
ViewContext vc;
Nurb *nu;
BezTriple *bezt = NULL;
BPoint *bp = NULL;
- const void *vert = BKE_curve_vert_active_get(cu);
- int location[2];
+ Base *basact = NULL;
short hand;
view3d_operator_needs_opengl(C);
ED_view3d_viewcontext_init(C, &vc);
+ copy_v2_v2_int(vc.mval, mval);
+
+ if (ED_curve_pick_vert(&vc, 1, &nu, &bezt, &bp, &hand, &basact)) {
+ Object *obedit = basact->object;
+ Curve *cu = obedit->data;
+ ListBase *editnurb = object_editcurve_get(obedit);
+ const void *vert = BKE_curve_vert_active_get(cu);
+
+ if (!extend && !deselect && !toggle) {
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(vc.view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob_iter = objects[ob_index];
- location[0] = mval[0];
- location[1] = mval[1];
+ ED_curve_deselect_all(((Curve *)ob_iter->data)->editnurb);
+
+ DEG_id_tag_update(ob_iter->data, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob_iter->data);
+ }
+ MEM_freeN(objects);
+ }
- if (ED_curve_pick_vert(&vc, 1, location, &nu, &bezt, &bp, &hand)) {
if (extend) {
if (bezt) {
if (hand == 1) {
@@ -4414,6 +4674,10 @@ bool ED_curve_editnurb_select_pick(bContext *C, const int mval[2], bool extend,
BKE_curve_nurb_active_set(cu, nu);
}
+ if (vc.view_layer->basact != basact) {
+ ED_object_base_activate(C, basact);
+ }
+
DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
@@ -4427,7 +4691,7 @@ bool ED_curve_editnurb_select_pick(bContext *C, const int mval[2], bool extend,
/* 'cent' is in object space and 'dvec' in worldspace.
*/
-bool ed_editnurb_spin(float viewmat[4][4], Object *obedit, const float axis[3], const float cent[3])
+bool ed_editnurb_spin(float viewmat[4][4], View3D *v3d, Object *obedit, const float axis[3], const float cent[3])
{
Curve *cu = (Curve *)obedit->data;
ListBase *editnurb = object_editcurve_get(obedit);
@@ -4491,7 +4755,7 @@ bool ed_editnurb_spin(float viewmat[4][4], Object *obedit, const float axis[3],
if (ok) {
for (nu = editnurb->first; nu; nu = nu->next) {
- if (ED_curve_nurb_select_check(cu, nu)) {
+ if (ED_curve_nurb_select_check(v3d, nu)) {
nu->orderv = 4;
nu->flagv |= CU_NURB_CYCLIC;
BKE_nurb_knot_calc_v(nu);
@@ -4504,32 +4768,51 @@ bool ed_editnurb_spin(float viewmat[4][4], Object *obedit, const float axis[3],
static int spin_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d = ED_view3d_context_rv3d(C);
float cent[3], axis[3], viewmat[4][4];
+ int ok = -1;
RNA_float_get_array(op->ptr, "center", cent);
RNA_float_get_array(op->ptr, "axis", axis);
- invert_m4_m4(obedit->imat, obedit->obmat);
- mul_m4_v3(obedit->imat, cent);
-
if (rv3d)
copy_m4_m4(viewmat, rv3d->viewmat);
else
unit_m4(viewmat);
- if (!ed_editnurb_spin(viewmat, obedit, axis, cent)) {
- BKE_report(op->reports, RPT_ERROR, "Cannot spin");
- return OPERATOR_CANCELLED;
- }
+ uint objects_len;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = (Curve *)obedit->data;
- if (ED_curve_updateAnimPaths(obedit->data))
- WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
+ if (!ED_curve_select_check(v3d, cu->editnurb)) {
+ continue;
+ }
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
- DEG_id_tag_update(obedit->data, 0);
+ invert_m4_m4(obedit->imat, obedit->obmat);
+ mul_m4_v3(obedit->imat, cent);
+
+ if (!ed_editnurb_spin(viewmat, v3d, obedit, axis, cent)) {
+ ok = MAX2(ok, 0);
+ continue;
+ }
+
+ ok = 1;
+ if (ED_curve_updateAnimPaths(cu)) {
+ WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
+ }
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ DEG_id_tag_update(obedit->data, 0);
+ }
+ MEM_freeN(objects);
+
+ if (ok == 0) {
+ BKE_report(op->reports, RPT_ERROR, "Cannot spin");
+ }
return OPERATOR_FINISHED;
}
@@ -4571,7 +4854,7 @@ void CURVE_OT_spin(wmOperatorType *ot)
/***************** extrude vertex operator **********************/
-static bool ed_editcurve_extrude(Curve *cu, EditNurb *editnurb)
+static bool ed_editcurve_extrude(Curve *cu, EditNurb *editnurb, View3D *v3d)
{
Nurb *nu = NULL;
Nurb *nu_last = NULL;
@@ -4606,7 +4889,7 @@ static bool ed_editcurve_extrude(Curve *cu, EditNurb *editnurb)
BezTriple *nu_bezt_old = nu->bezt;
BezTriple *bezt = nu->bezt;
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt)) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) {
BezTriple *bezt_new;
BEZT_DESEL_ALL(bezt);
@@ -4636,7 +4919,7 @@ static bool ed_editcurve_extrude(Curve *cu, EditNurb *editnurb)
BezTriple *nu_bezt_old = nu->bezt;
BezTriple *bezt = &nu->bezt[nu->pntsu - 1];
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt)) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) {
BezTriple *bezt_new;
BEZT_DESEL_ALL(bezt);
@@ -4747,7 +5030,7 @@ static bool ed_editcurve_extrude(Curve *cu, EditNurb *editnurb)
BezTriple *bezt;
for (bezt = &nu->bezt[i]; i < i_end; i++, bezt++) {
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt)) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) {
Nurb *nurb_new;
BezTriple *bezt_new;
@@ -4802,7 +5085,7 @@ static bool ed_editcurve_extrude(Curve *cu, EditNurb *editnurb)
/***************** add vertex operator **********************/
-static int ed_editcurve_addvert(Curve *cu, EditNurb *editnurb, const float location_init[3])
+static int ed_editcurve_addvert(Curve *cu, EditNurb *editnurb, View3D *v3d, const float location_init[3])
{
Nurb *nu;
@@ -4820,7 +5103,7 @@ static int ed_editcurve_addvert(Curve *cu, EditNurb *editnurb, const float locat
BezTriple *bezt;
for (i = 0, bezt = nu->bezt; i < nu->pntsu; i++, bezt++) {
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt)) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) {
add_v3_v3(center, bezt->vec[1]);
verts_len += 1;
}
@@ -4838,7 +5121,7 @@ static int ed_editcurve_addvert(Curve *cu, EditNurb *editnurb, const float locat
}
}
- if (verts_len && ed_editcurve_extrude(cu, editnurb)) {
+ if (verts_len && ed_editcurve_extrude(cu, editnurb, v3d)) {
float ofs[3];
int i;
@@ -4853,7 +5136,7 @@ static int ed_editcurve_addvert(Curve *cu, EditNurb *editnurb, const float locat
if (nu->type == CU_BEZIER) {
BezTriple *bezt;
for (i = 0, bezt = nu->bezt; i < nu->pntsu; i++, bezt++) {
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt)) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) {
add_v3_v3(bezt->vec[0], ofs);
add_v3_v3(bezt->vec[1], ofs);
add_v3_v3(bezt->vec[2], ofs);
@@ -4967,6 +5250,7 @@ static int ed_editcurve_addvert(Curve *cu, EditNurb *editnurb, const float locat
static int add_vertex_exec(bContext *C, wmOperator *op)
{
Object *obedit = CTX_data_edit_object(C);
+ View3D *v3d = CTX_wm_view3d(C);
Curve *cu = obedit->data;
EditNurb *editnurb = cu->editnurb;
float location[3];
@@ -4977,7 +5261,7 @@ static int add_vertex_exec(bContext *C, wmOperator *op)
invert_m4_m4(imat, obedit->obmat);
mul_m4_v3(imat, location);
- if (ed_editcurve_addvert(cu, editnurb, location)) {
+ if (ed_editcurve_addvert(cu, editnurb, v3d, location)) {
if (ED_curve_updateAnimPaths(obedit->data)) {
WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
}
@@ -5010,7 +5294,7 @@ static int add_vertex_invoke(bContext *C, wmOperator *op, const wmEvent *event)
cu = vc.obedit->data;
- findselectedNurbvert(cu, &nu, &bezt, &bp);
+ findselectedNurbvert(cu, vc.v3d, &nu, &bezt, &bp);
if (bezt) {
mul_v3_m4v3(location, vc.obedit->obmat, bezt->vec[1]);
@@ -5105,41 +5389,52 @@ void CURVE_OT_vertex_add(wmOperatorType *ot)
static int curve_extrude_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *obedit = CTX_data_edit_object(C);
- Curve *cu = obedit->data;
- EditNurb *editnurb = cu->editnurb;
- bool changed = false;
- bool as_curve = false;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ View3D *v3d = CTX_wm_view3d(C);
- /* first test: curve? */
- if (obedit->type != OB_CURVE) {
- Nurb *nu;
- for (nu = editnurb->nurbs.first; nu; nu = nu->next) {
- if ((nu->pntsv == 1) &&
- (ED_curve_nurb_select_count(cu, nu) == 1))
- {
- as_curve = true;
- break;
- }
+ uint objects_len;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = obedit->data;
+ EditNurb *editnurb = cu->editnurb;
+ bool changed = false;
+ bool as_curve = false;
+
+ if (!ED_curve_select_check(v3d, cu->editnurb)) {
+ continue;
}
- }
- if (obedit->type == OB_CURVE || as_curve) {
- changed = ed_editcurve_extrude(cu, editnurb);
- }
- else {
- changed = ed_editnurb_extrude_flag(editnurb, SELECT);
- }
+ /* First test: curve? */
+ if (obedit->type != OB_CURVE) {
+ Nurb *nu;
+ for (nu = editnurb->nurbs.first; nu; nu = nu->next) {
+ if ((nu->pntsv == 1) &&
+ (ED_curve_nurb_select_count(v3d, nu) == 1))
+ {
+ as_curve = true;
+ break;
+ }
+ }
+ }
- if (changed) {
- if (ED_curve_updateAnimPaths(obedit->data)) {
- WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
+ if (obedit->type == OB_CURVE || as_curve) {
+ changed = ed_editcurve_extrude(cu, editnurb, v3d);
+ }
+ else {
+ changed = ed_editnurb_extrude_flag(editnurb, SELECT);
}
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
- DEG_id_tag_update(obedit->data, 0);
- }
+ if (changed) {
+ if (ED_curve_updateAnimPaths(obedit->data)) {
+ WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
+ }
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ DEG_id_tag_update(obedit->data, 0);
+ }
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -5163,15 +5458,13 @@ void CURVE_OT_extrude(wmOperatorType *ot)
/***************** make cyclic operator **********************/
-static int toggle_cyclic_exec(bContext *C, wmOperator *op)
+static bool curve_toggle_cyclic(View3D *v3d, ListBase *editnurb, int direction)
{
- Object *obedit = CTX_data_edit_object(C);
- Curve *cu = obedit->data;
- ListBase *editnurb = object_editcurve_get(obedit);
Nurb *nu;
BezTriple *bezt;
BPoint *bp;
- int a, direction = RNA_enum_get(op->ptr, "direction");
+ int a;
+ bool changed = false;
for (nu = editnurb->first; nu; nu = nu->next) {
if (nu->pntsu > 1 || nu->pntsv > 1) {
@@ -5181,6 +5474,7 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
while (a--) {
if (bp->f1 & SELECT) {
nu->flagu ^= CU_NURB_CYCLIC;
+ changed = true;
break;
}
bp++;
@@ -5190,8 +5484,9 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
a = nu->pntsu;
bezt = nu->bezt;
while (a--) {
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt)) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) {
nu->flagu ^= CU_NURB_CYCLIC;
+ changed = true;
break;
}
bezt++;
@@ -5206,6 +5501,7 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
if (bp->f1 & SELECT) {
nu->flagu ^= CU_NURB_CYCLIC;
BKE_nurb_knot_calc_u(nu); /* 1==u type is ignored for cyclic curves */
+ changed = true;
break;
}
bp++;
@@ -5221,24 +5517,50 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
if (direction == 0 && nu->pntsu > 1) {
nu->flagu ^= CU_NURB_CYCLIC;
BKE_nurb_knot_calc_u(nu); /* 1==u type is ignored for cyclic curves */
+ changed = true;
}
if (direction == 1 && nu->pntsv > 1) {
nu->flagv ^= CU_NURB_CYCLIC;
BKE_nurb_knot_calc_v(nu); /* 2==v type is ignored for cyclic curves */
+ changed = true;
}
break;
}
bp++;
}
-
}
}
}
+ return changed;
+}
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
- DEG_id_tag_update(obedit->data, 0);
+static int toggle_cyclic_exec(bContext *C, wmOperator *op)
+{
+ const int direction = RNA_enum_get(op->ptr, "direction");
+ View3D *v3d = CTX_wm_view3d(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ bool changed_multi = false;
- return OPERATOR_FINISHED;
+ uint objects_len;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = obedit->data;
+
+ if (!ED_curve_select_check(v3d, cu->editnurb)) {
+ continue;
+ }
+
+ ListBase *editnurb = object_editcurve_get(obedit);
+ if (curve_toggle_cyclic(v3d, editnurb, direction)) {
+ changed_multi = true;
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ DEG_id_tag_update(obedit->data, 0);
+ }
+ }
+ MEM_freeN(objects);
+
+ return changed_multi ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
static int toggle_cyclic_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
@@ -5295,21 +5617,39 @@ void CURVE_OT_cyclic_toggle(wmOperatorType *ot)
static int duplicate_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- ListBase newnurb = {NULL, NULL};
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ View3D *v3d = CTX_wm_view3d(C);
+ int ok = -1;
- adduplicateflagNurb(obedit, &newnurb, SELECT, false);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = obedit->data;
- if (BLI_listbase_is_empty(&newnurb) == false) {
+ if (!ED_curve_select_check(v3d, cu->editnurb)) {
+ continue;
+ }
+
+ ListBase newnurb = {NULL, NULL};
+ adduplicateflagNurb(obedit, v3d, &newnurb, SELECT, false);
+
+ if (BLI_listbase_is_empty(&newnurb)) {
+ ok = MAX2(ok, 0);
+ continue;
+ }
+
+ ok = 1;
BLI_movelisttolist(object_editcurve_get(obedit), &newnurb);
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ DEG_id_tag_update(&cu->id, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, &cu->id);
}
- else {
+ MEM_freeN(objects);
+
+ if (ok == 0) {
BKE_report(op->reports, RPT_ERROR, "Cannot duplicate current selection");
return OPERATOR_CANCELLED;
}
-
return OPERATOR_FINISHED;
}
@@ -5330,19 +5670,19 @@ void CURVE_OT_duplicate(wmOperatorType *ot)
/********************** delete operator *********************/
-static int curve_delete_vertices(Object *obedit)
+static bool curve_delete_vertices(Object *obedit, View3D *v3d)
{
if (obedit->type == OB_SURF) {
ed_surf_delete_selected(obedit);
}
else {
- ed_curve_delete_selected(obedit);
+ ed_curve_delete_selected(obedit, v3d);
}
- return OPERATOR_FINISHED;
+ return true;
}
-static int curve_delete_segments(Object *obedit, const bool split)
+static bool curve_delete_segments(Object *obedit, View3D *v3d, const bool split)
{
Curve *cu = obedit->data;
EditNurb *editnurb = cu->editnurb;
@@ -5359,12 +5699,12 @@ static int curve_delete_segments(Object *obedit, const bool split)
if (nu->type == CU_BEZIER) {
for (a = 0, bezt = nu->bezt; a < nu->pntsu; a++, bezt++) {
- if (!BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt)) {
+ if (!BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) {
enda = a;
if (starta == -1) starta = a;
if (a < nu->pntsu - 1) continue;
}
- else if (a < nu->pntsu - 1 && !BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt + 1)) {
+ else if (a < nu->pntsu - 1 && !BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt + 1)) {
/* if just single selected point then continue */
continue;
}
@@ -5388,8 +5728,8 @@ static int curve_delete_segments(Object *obedit, const bool split)
bezt2 = &nu->bezt[nu->pntsu - 2];
if ((nu->flagu & CU_NURB_CYCLIC) &&
- BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt1) &&
- BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt2))
+ BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt1) &&
+ BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt2))
{
/* check if need to join start of spline to end */
nu1 = BKE_nurb_copy(nu, cut + 1, 1);
@@ -5410,8 +5750,8 @@ static int curve_delete_segments(Object *obedit, const bool split)
bezt2 = &nu->bezt[1];
if ((nu->flagu & CU_NURB_CYCLIC) &&
- BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt1) &&
- BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt2))
+ BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt1) &&
+ BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt2))
{
/* check if need to join start of spline to end */
nu1 = BKE_nurb_copy(nu, cut + 1, 1);
@@ -5451,8 +5791,8 @@ static int curve_delete_segments(Object *obedit, const bool split)
bezt1 = nu->bezt;
bezt2 = &nu->bezt[1];
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt1) &&
- BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt2))
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt1) &&
+ BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt2))
{
nu1 = BKE_nurb_copy(nu, 1, 1);
ED_curve_beztcpy(editnurb, nu1->bezt, bezt1, 1);
@@ -5462,8 +5802,8 @@ static int curve_delete_segments(Object *obedit, const bool split)
bezt1 = &nu->bezt[nu->pntsu - 1];
bezt2 = &nu->bezt[nu->pntsu - 2];
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt1) &&
- BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt2))
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt1) &&
+ BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt2))
{
nu1 = BKE_nurb_copy(nu, 1, 1);
ED_curve_beztcpy(editnurb, nu1->bezt, bezt1, 1);
@@ -5735,32 +6075,57 @@ static int curve_delete_segments(Object *obedit, const bool split)
BKE_nurbList_free(nubase);
BLI_movelisttolist(nubase, &newnurb);
- return OPERATOR_FINISHED;
+ return true;
}
static int curve_delete_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- Curve *cu = (Curve *)obedit->data;
+ View3D *v3d = CTX_wm_view3d(C);
eCurveElem_Types type = RNA_enum_get(op->ptr, "type");
- int retval = OPERATOR_CANCELLED;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ bool changed_multi = false;
- if (type == CURVE_VERTEX) retval = curve_delete_vertices(obedit);
- else if (type == CURVE_SEGMENT) retval = curve_delete_segments(obedit, false);
- else BLI_assert(0);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = (Curve *)obedit->data;
+ bool changed = false;
- if (retval == OPERATOR_FINISHED) {
- cu->actnu = cu->actvert = CU_ACT_NONE;
+ if (!ED_curve_select_check(v3d, cu->editnurb)) {
+ continue;
+ }
- if (ED_curve_updateAnimPaths(obedit->data)) WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
+ if (type == CURVE_VERTEX) {
+ changed = curve_delete_vertices(obedit, v3d);
+ }
+ else if (type == CURVE_SEGMENT) {
+ changed = curve_delete_segments(obedit, v3d, false);
+ }
+ else {
+ BLI_assert(0);
+ }
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
- DEG_id_tag_update(obedit->data, 0);
+ if (changed) {
+ changed_multi = true;
+ cu->actnu = cu->actvert = CU_ACT_NONE;
+
+ if (ED_curve_updateAnimPaths(obedit->data)) {
+ WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
+ }
- return retval;
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ DEG_id_tag_update(obedit->data, 0);
+ }
}
+ MEM_freeN(objects);
- return retval;
+ if (changed_multi) {
+ return OPERATOR_FINISHED;
+ }
+ else {
+ return OPERATOR_CANCELLED;
+ }
}
static const EnumPropertyItem curve_delete_type_items[] = {
@@ -5812,17 +6177,26 @@ void CURVE_OT_delete(wmOperatorType *ot)
static bool test_bezt_is_sel_any(const void *bezt_v, void *user_data)
{
- Curve *cu = user_data;
+ View3D *v3d = user_data;
const BezTriple *bezt = bezt_v;
- return BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt);
+ return BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt);
}
static int curve_dissolve_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *obedit = CTX_data_edit_object(C);
- Curve *cu = (Curve *)obedit->data;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ View3D *v3d = CTX_wm_view3d(C);
+
+ uint objects_len;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = (Curve *)obedit->data;
+
+ if (!ED_curve_select_check(v3d, cu->editnurb)) {
+ continue;
+ }
- {
ListBase *editnurb = object_editcurve_get(obedit);
Nurb *nu;
@@ -5834,7 +6208,7 @@ static int curve_dissolve_exec(bContext *C, wmOperator *UNUSED(op))
while (BLI_array_iter_span(
nu->bezt, nu->pntsu,
(nu->flagu & CU_NURB_CYCLIC) != 0, false,
- test_bezt_is_sel_any, cu,
+ test_bezt_is_sel_any, v3d,
span_step, &span_len))
{
BezTriple *bezt_prev = &nu->bezt[mod_i(span_step[0] - 1, nu->pntsu)];
@@ -5889,11 +6263,9 @@ static int curve_dissolve_exec(bContext *C, wmOperator *UNUSED(op))
}
}
}
- }
- ed_curve_delete_selected(obedit);
+ ed_curve_delete_selected(obedit, v3d);
- {
cu->actnu = cu->actvert = CU_ACT_NONE;
if (ED_curve_updateAnimPaths(obedit->data)) WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
@@ -5901,7 +6273,7 @@ static int curve_dissolve_exec(bContext *C, wmOperator *UNUSED(op))
WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
DEG_id_tag_update(obedit->data, 0);
}
-
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -5936,47 +6308,59 @@ static bool nurb_bezt_flag_any(const Nurb *nu, const char flag_test)
static int curve_decimate_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- Curve *cu = (Curve *)obedit->data;
- bool all_supported = true;
- bool changed = false;
-
- {
- const float error_sq_max = FLT_MAX;
- float ratio = RNA_float_get(op->ptr, "ratio");
+ const float error_sq_max = FLT_MAX;
+ float ratio = RNA_float_get(op->ptr, "ratio");
+ bool all_supported_multi = true;
- ListBase *editnurb = object_editcurve_get(obedit);
- Nurb *nu;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = (Curve *)obedit->data;
+ bool all_supported = true;
+ bool changed = false;
- for (nu = editnurb->first; nu; nu = nu->next) {
- if (nu->type == CU_BEZIER) {
- if ((nu->pntsu > 2) && nurb_bezt_flag_any(nu, SELECT)) {
- const int error_target_len = max_ii(2, nu->pntsu * ratio);
- if (error_target_len != nu->pntsu) {
- BKE_curve_decimate_nurb(nu, cu->resolu, error_sq_max, error_target_len);
- changed = true;
+ {
+ ListBase *editnurb = object_editcurve_get(obedit);
+ Nurb *nu;
+
+ for (nu = editnurb->first; nu; nu = nu->next) {
+ if (nu->type == CU_BEZIER) {
+ if ((nu->pntsu > 2) && nurb_bezt_flag_any(nu, SELECT)) {
+ const int error_target_len = max_ii(2, nu->pntsu * ratio);
+ if (error_target_len != nu->pntsu) {
+ BKE_curve_decimate_nurb(nu, cu->resolu, error_sq_max, error_target_len);
+ changed = true;
+ }
}
}
+ else {
+ all_supported = false;
+ }
}
- else {
- all_supported = false;
+ }
+
+ if (all_supported == false) {
+ all_supported_multi = false;
+ }
+
+ if (changed) {
+ cu->actnu = cu->actvert = CU_ACT_NONE;
+ if (ED_curve_updateAnimPaths(obedit->data)) {
+ WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
}
+
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ DEG_id_tag_update(obedit->data, 0);
}
}
- if (all_supported == false) {
+ if (all_supported_multi == false) {
BKE_report(op->reports, RPT_WARNING, "Only bezier curves are supported");
}
- if (changed) {
- cu->actnu = cu->actvert = CU_ACT_NONE;
- if (ED_curve_updateAnimPaths(obedit->data)) {
- WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
- }
-
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
- DEG_id_tag_update(obedit->data, 0);
- }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -6005,6 +6389,7 @@ void CURVE_OT_decimate(wmOperatorType *ot)
static int shade_smooth_exec(bContext *C, wmOperator *op)
{
Object *obedit = CTX_data_edit_object(C);
+ View3D *v3d = CTX_wm_view3d(C);
ListBase *editnurb = object_editcurve_get(obedit);
Nurb *nu;
int clear = (STREQ(op->idname, "CURVE_OT_shade_flat"));
@@ -6013,7 +6398,7 @@ static int shade_smooth_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
for (nu = editnurb->first; nu; nu = nu->next) {
- if (ED_curve_nurb_select_check(obedit->data, nu)) {
+ if (ED_curve_nurb_select_check(v3d, nu)) {
if (!clear) nu->flag |= CU_SMOOTH;
else nu->flag &= ~CU_SMOOTH;
}
@@ -6061,7 +6446,7 @@ int join_curve_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
- Object *ob = CTX_data_active_object(C);
+ Object *ob_active = CTX_data_active_object(C);
Curve *cu;
Nurb *nu, *newnu;
BezTriple *bezt;
@@ -6071,9 +6456,9 @@ int join_curve_exec(bContext *C, wmOperator *op)
int a;
bool ok = false;
- CTX_DATA_BEGIN(C, Base *, base, selected_editable_bases)
+ CTX_DATA_BEGIN(C, Object *, ob_iter, selected_editable_objects)
{
- if (base->object == ob) {
+ if (ob_iter == ob_active) {
ok = true;
break;
}
@@ -6089,24 +6474,24 @@ int join_curve_exec(bContext *C, wmOperator *op)
BLI_listbase_clear(&tempbase);
/* trasnform all selected curves inverse in obact */
- invert_m4_m4(imat, ob->obmat);
+ invert_m4_m4(imat, ob_active->obmat);
- CTX_DATA_BEGIN(C, Base *, base, selected_editable_bases)
+ CTX_DATA_BEGIN(C, Object *, ob_iter, selected_editable_objects)
{
- if (base->object->type == ob->type) {
- if (base->object != ob) {
+ if (ob_iter->type == ob_active->type) {
+ if (ob_iter != ob_active) {
- cu = base->object->data;
+ cu = ob_iter->data;
if (cu->nurb.first) {
/* watch it: switch order here really goes wrong */
- mul_m4_m4m4(cmat, imat, base->object->obmat);
+ mul_m4_m4m4(cmat, imat, ob_iter->obmat);
nu = cu->nurb.first;
while (nu) {
newnu = BKE_nurb_duplicate(nu);
- if (ob->totcol) { /* TODO, merge material lists */
- CLAMP(newnu->mat_nr, 0, ob->totcol - 1);
+ if (ob_active->totcol) { /* TODO, merge material lists */
+ CLAMP(newnu->mat_nr, 0, ob_active->totcol - 1);
}
else {
newnu->mat_nr = 0;
@@ -6134,23 +6519,23 @@ int join_curve_exec(bContext *C, wmOperator *op)
}
}
- ED_object_base_free_and_unlink(bmain, scene, base->object);
+ ED_object_base_free_and_unlink(bmain, scene, ob_iter);
}
}
}
CTX_DATA_END;
- cu = ob->data;
+ cu = ob_active->data;
BLI_movelisttolist(&cu->nurb, &tempbase);
- if (ob->type == OB_CURVE) {
+ if (ob_active->type == OB_CURVE) {
/* Account for mixed 2D/3D curves when joining */
BKE_curve_curve_dimension_update(cu);
}
DEG_relations_tag_update(bmain); // because we removed object(s), call before editmode!
- DEG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA);
+ DEG_id_tag_update(&ob_active->id, OB_RECALC_OB | OB_RECALC_DATA);
DEG_id_tag_update(&scene->id, DEG_TAG_SELECT_UPDATE);
WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene);
@@ -6163,36 +6548,48 @@ int join_curve_exec(bContext *C, wmOperator *op)
static int clear_tilt_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *obedit = CTX_data_edit_object(C);
- Curve *cu = obedit->data;
- ListBase *editnurb = object_editcurve_get(obedit);
- Nurb *nu;
- BezTriple *bezt;
- BPoint *bp;
- int a;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ View3D *v3d = CTX_wm_view3d(C);
- for (nu = editnurb->first; nu; nu = nu->next) {
- if (nu->bezt) {
- bezt = nu->bezt;
- a = nu->pntsu;
- while (a--) {
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt)) bezt->alfa = 0.0;
- bezt++;
- }
+ uint objects_len;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = obedit->data;
+
+ if (!ED_curve_select_check(v3d, cu->editnurb)) {
+ continue;
}
- else if (nu->bp) {
- bp = nu->bp;
- a = nu->pntsu * nu->pntsv;
- while (a--) {
- if (bp->f1 & SELECT) bp->alfa = 0.0f;
- bp++;
+
+ ListBase *editnurb = object_editcurve_get(obedit);
+ Nurb *nu;
+ BezTriple *bezt;
+ BPoint *bp;
+ int a;
+
+ for (nu = editnurb->first; nu; nu = nu->next) {
+ if (nu->bezt) {
+ bezt = nu->bezt;
+ a = nu->pntsu;
+ while (a--) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) bezt->alfa = 0.0;
+ bezt++;
+ }
+ }
+ else if (nu->bp) {
+ bp = nu->bp;
+ a = nu->pntsu * nu->pntsv;
+ while (a--) {
+ if (bp->f1 & SELECT) bp->alfa = 0.0f;
+ bp++;
+ }
}
}
- }
-
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
- DEG_id_tag_update(obedit->data, 0);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ DEG_id_tag_update(obedit->data, 0);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/curve/editcurve_add.c b/source/blender/editors/curve/editcurve_add.c
index 7f788b447f6..23ce7bac338 100644
--- a/source/blender/editors/curve/editcurve_add.c
+++ b/source/blender/editors/curve/editcurve_add.c
@@ -42,7 +42,6 @@
#include "BKE_context.h"
#include "BKE_curve.h"
-#include "BKE_library.h"
#include "DEG_depsgraph.h"
@@ -398,11 +397,11 @@ Nurb *ED_curve_add_nurbs_primitive(bContext *C, Object *obedit, float mat[4][4],
BLI_addtail(editnurb, nu); /* temporal for spin */
if (newob && (U.flag & USER_ADD_VIEWALIGNED) == 0)
- ed_editnurb_spin(umat, obedit, tmp_vec, tmp_cent);
+ ed_editnurb_spin(umat, NULL, obedit, tmp_vec, tmp_cent);
else if ((U.flag & USER_ADD_VIEWALIGNED))
- ed_editnurb_spin(viewmat, obedit, zvec, mat[3]);
+ ed_editnurb_spin(viewmat, NULL, obedit, zvec, mat[3]);
else
- ed_editnurb_spin(umat, obedit, tmp_vec, mat[3]);
+ ed_editnurb_spin(umat, NULL, obedit, tmp_vec, mat[3]);
BKE_nurb_knot_calc_v(nu);
@@ -430,11 +429,11 @@ Nurb *ED_curve_add_nurbs_primitive(bContext *C, Object *obedit, float mat[4][4],
/* same as above */
if (newob && (U.flag & USER_ADD_VIEWALIGNED) == 0)
- ed_editnurb_spin(umat, obedit, tmp_vec, tmp_cent);
+ ed_editnurb_spin(umat, NULL, obedit, tmp_vec, tmp_cent);
else if ((U.flag & USER_ADD_VIEWALIGNED))
- ed_editnurb_spin(viewmat, obedit, zvec, mat[3]);
+ ed_editnurb_spin(viewmat, NULL, obedit, zvec, mat[3]);
else
- ed_editnurb_spin(umat, obedit, tmp_vec, mat[3]);
+ ed_editnurb_spin(umat, NULL, obedit, tmp_vec, mat[3]);
BLI_remlink(editnurb, nu);
@@ -478,14 +477,13 @@ static int curvesurf_prim_add(bContext *C, wmOperator *op, int type, int isSurf)
Nurb *nu;
bool newob = false;
bool enter_editmode;
- unsigned int layer;
float dia;
float loc[3], rot[3];
float mat[4][4];
WM_operator_view3d_unit_defaults(C, op);
- if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL))
+ if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL))
return OPERATOR_CANCELLED;
if (!isSurf) { /* adding curve */
@@ -493,7 +491,7 @@ static int curvesurf_prim_add(bContext *C, wmOperator *op, int type, int isSurf)
const char *name = get_curve_defname(type);
Curve *cu;
- obedit = ED_object_add_type(C, OB_CURVE, name, loc, rot, true, layer);
+ obedit = ED_object_add_type(C, OB_CURVE, name, loc, rot, true);
newob = true;
cu = (Curve *)obedit->data;
@@ -509,7 +507,7 @@ static int curvesurf_prim_add(bContext *C, wmOperator *op, int type, int isSurf)
else { /* adding surface */
if (obedit == NULL || obedit->type != OB_SURF) {
const char *name = get_surf_defname(type);
- obedit = ED_object_add_type(C, OB_SURF, name, loc, rot, true, layer);
+ obedit = ED_object_add_type(C, OB_SURF, name, loc, rot, true);
newob = true;
}
else {
diff --git a/source/blender/editors/curve/editcurve_paint.c b/source/blender/editors/curve/editcurve_paint.c
index dd0430f4f65..7f8091d66a7 100644
--- a/source/blender/editors/curve/editcurve_paint.c
+++ b/source/blender/editors/curve/editcurve_paint.c
@@ -36,6 +36,7 @@
#include "BKE_fcurve.h"
#include "BKE_main.h"
#include "BKE_report.h"
+#include "BKE_layer.h"
#include "DEG_depsgraph.h"
@@ -107,7 +108,7 @@ struct CurveDrawData {
bool use_plane;
float plane[4];
- /* use 'rv3d->depths', note that this will become 'damaged' while drawing, but thats OK. */
+ /* use 'rv3d->depths', note that this will become 'damaged' while drawing, but that's OK. */
bool use_depth;
/* offset projection by this value */
@@ -194,7 +195,6 @@ static bool stroke_elem_project(
float surface_offset, const float radius,
float r_location_world[3], float r_normal_world[3])
{
- View3D *v3d = cdd->vc.v3d;
ARegion *ar = cdd->vc.ar;
RegionView3D *rv3d = cdd->vc.rv3d;
@@ -203,12 +203,7 @@ static bool stroke_elem_project(
/* project to 'location_world' */
if (cdd->project.use_plane) {
/* get the view vector to 'location' */
- float ray_origin[3], ray_direction[3];
- ED_view3d_win_to_ray(cdd->depsgraph, cdd->vc.ar, v3d, mval_fl, ray_origin, ray_direction, false);
-
- float lambda;
- if (isect_ray_plane_v3(ray_origin, ray_direction, cdd->project.plane, &lambda, true)) {
- madd_v3_v3v3fl(r_location_world, ray_origin, ray_direction, lambda);
+ if (ED_view3d_win_to_3d_on_plane(ar, cdd->project.plane, mval_fl, true, r_location_world)) {
if (r_normal_world) {
zero_v3(r_normal_world);
}
@@ -797,7 +792,14 @@ static int curve_draw_exec(bContext *C, wmOperator *op)
stroke_len = BLI_mempool_len(cdd->stroke_elem_pool);
}
- ED_curve_deselect_all(cu->editnurb);
+ /* Deselect all existing curves. */
+ {
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ ED_curve_deselect_all_multi(objects, objects_len);
+ MEM_freeN(objects);
+ }
const float radius_min = cps->radius_min;
const float radius_max = cps->radius_max;
diff --git a/source/blender/editors/curve/editcurve_select.c b/source/blender/editors/curve/editcurve_select.c
index 7fcf7e073dc..8bd19d42193 100644
--- a/source/blender/editors/curve/editcurve_select.c
+++ b/source/blender/editors/curve/editcurve_select.c
@@ -38,16 +38,20 @@
#include "BLI_math.h"
#include "BLI_rand.h"
#include "BLI_heap.h"
+#include "BLI_heap_simple.h"
+#include "BLI_kdtree.h"
#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_fcurve.h"
#include "BKE_layer.h"
#include "BKE_report.h"
+#include "BKE_object.h"
#include "WM_api.h"
#include "WM_types.h"
+#include "ED_object.h"
#include "ED_screen.h"
#include "ED_select_utils.h"
#include "ED_types.h"
@@ -115,14 +119,14 @@ static bool swap_selection_bpoint(BPoint *bp)
return select_bpoint(bp, SELECT, SELECT, VISIBLE);
}
-bool ED_curve_nurb_select_check(Curve *cu, Nurb *nu)
+bool ED_curve_nurb_select_check(View3D *v3d, Nurb *nu)
{
if (nu->type == CU_BEZIER) {
BezTriple *bezt;
int i;
for (i = nu->pntsu, bezt = nu->bezt; i--; bezt++) {
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt)) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) {
return true;
}
}
@@ -140,7 +144,7 @@ bool ED_curve_nurb_select_check(Curve *cu, Nurb *nu)
return false;
}
-int ED_curve_nurb_select_count(Curve *cu, Nurb *nu)
+int ED_curve_nurb_select_count(View3D *v3d, Nurb *nu)
{
int sel = 0;
@@ -149,7 +153,7 @@ int ED_curve_nurb_select_count(Curve *cu, Nurb *nu)
int i;
for (i = nu->pntsu, bezt = nu->bezt; i--; bezt++) {
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt)) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) {
sel++;
}
}
@@ -216,12 +220,24 @@ void ED_curve_nurb_deselect_all(Nurb *nu)
}
}
-bool ED_curve_select_check(Curve *cu, struct EditNurb *editnurb)
+int ED_curve_select_count(View3D *v3d, struct EditNurb *editnurb)
{
+ int sel = 0;
Nurb *nu;
for (nu = editnurb->nurbs.first; nu; nu = nu->next) {
- if (ED_curve_nurb_select_check(cu, nu)) {
+ sel += ED_curve_nurb_select_count(v3d, nu);
+ }
+
+ return sel;
+}
+
+bool ED_curve_select_check(View3D *v3d, struct EditNurb *editnurb)
+{
+ Nurb *nu;
+
+ for (nu = editnurb->nurbs.first; nu; nu = nu->next) {
+ if (ED_curve_nurb_select_check(v3d, nu)) {
return true;
}
}
@@ -238,6 +254,15 @@ void ED_curve_deselect_all(EditNurb *editnurb)
}
}
+void ED_curve_deselect_all_multi(Object **objects, int objects_len)
+{
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = obedit->data;
+ ED_curve_deselect_all(cu->editnurb);
+ }
+}
+
void ED_curve_select_swap(EditNurb *editnurb, bool hide_handles)
{
Nurb *nu;
@@ -402,13 +427,18 @@ static void selectend_nurb(Object *obedit, eEndPoint_Types selfirst, bool doswap
static int de_select_first_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *obedit = CTX_data_edit_object(C);
-
- selectend_nurb(obedit, FIRST, true, DESELECT);
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
- BKE_curve_nurb_vert_active_validate(obedit->data);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ selectend_nurb(obedit, FIRST, true, DESELECT);
+ DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ BKE_curve_nurb_vert_active_validate(obedit->data);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -429,13 +459,19 @@ void CURVE_OT_de_select_first(wmOperatorType *ot)
static int de_select_last_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *obedit = CTX_data_edit_object(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
- selectend_nurb(obedit, LAST, true, DESELECT);
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
- BKE_curve_nurb_vert_active_validate(obedit->data);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ selectend_nurb(obedit, LAST, true, DESELECT);
+ DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ BKE_curve_nurb_vert_active_validate(obedit->data);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -459,6 +495,7 @@ static int de_select_all_exec(bContext *C, wmOperator *op)
int action = RNA_enum_get(op->ptr, "action");
ViewLayer *view_layer = CTX_data_view_layer(C);
+ View3D *v3d = CTX_wm_view3d(C);
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
@@ -468,7 +505,7 @@ static int de_select_all_exec(bContext *C, wmOperator *op)
Object *obedit = objects[ob_index];
Curve *cu = obedit->data;
- if (ED_curve_select_check(cu, cu->editnurb)) {
+ if (ED_curve_select_check(v3d, cu->editnurb)) {
action = SEL_DESELECT;
break;
}
@@ -487,7 +524,7 @@ static int de_select_all_exec(bContext *C, wmOperator *op)
ED_curve_deselect_all(cu->editnurb);
break;
case SEL_INVERT:
- ED_curve_select_swap(cu->editnurb, (cu->drawflag & CU_HIDE_HANDLES) != 0);
+ ED_curve_select_swap(cu->editnurb, (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0);
break;
}
@@ -525,6 +562,7 @@ void CURVE_OT_select_all(wmOperatorType *ot)
static int select_linked_exec(bContext *C, wmOperator *UNUSED(op))
{
ViewLayer *view_layer = CTX_data_view_layer(C);
+ View3D *v3d = CTX_wm_view3d(C);
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
@@ -537,7 +575,7 @@ static int select_linked_exec(bContext *C, wmOperator *UNUSED(op))
bool changed = false;
for (nu = nurbs->first; nu; nu = nu->next) {
- if (ED_curve_nurb_select_check(cu, nu)) {
+ if (ED_curve_nurb_select_check(v3d, nu)) {
ED_curve_nurb_select_all(nu);
changed = true;
}
@@ -581,18 +619,19 @@ void CURVE_OT_select_linked(wmOperatorType *ot)
static int select_linked_pick_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
- Object *obedit = CTX_data_edit_object(C);
ViewContext vc;
Nurb *nu;
BezTriple *bezt;
BPoint *bp;
int a;
const bool select = !RNA_boolean_get(op->ptr, "deselect");
+ Base *basact = NULL;
view3d_operator_needs_opengl(C);
ED_view3d_viewcontext_init(C, &vc);
+ copy_v2_v2_int(vc.mval, event->mval);
- if (!ED_curve_pick_vert(&vc, 1, event->mval, &nu, &bezt, &bp, NULL)) {
+ if (!ED_curve_pick_vert(&vc, 1, &nu, &bezt, &bp, NULL, &basact)) {
return OPERATOR_CANCELLED;
}
@@ -613,8 +652,11 @@ static int select_linked_pick_invoke(bContext *C, wmOperator *op, const wmEvent
}
}
+ Object *obedit = basact->object;
+
DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+
if (!select) {
BKE_curve_nurb_vert_active_validate(obedit->data);
}
@@ -701,13 +743,18 @@ void CURVE_OT_select_row(wmOperatorType *ot)
static int select_next_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *obedit = CTX_data_edit_object(C);
- ListBase *editnurb = object_editcurve_get(obedit);
-
- select_adjacent_cp(editnurb, 1, 0, SELECT);
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ ListBase *editnurb = object_editcurve_get(obedit);
+ select_adjacent_cp(editnurb, 1, 0, SELECT);
+ DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -730,13 +777,18 @@ void CURVE_OT_select_next(wmOperatorType *ot)
static int select_previous_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *obedit = CTX_data_edit_object(C);
- ListBase *editnurb = object_editcurve_get(obedit);
-
- select_adjacent_cp(editnurb, -1, 0, SELECT);
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ ListBase *editnurb = object_editcurve_get(obedit);
+ select_adjacent_cp(editnurb, -1, 0, SELECT);
+ DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -757,9 +809,8 @@ void CURVE_OT_select_previous(wmOperatorType *ot)
/***************** select more operator **********************/
-static int select_more_exec(bContext *C, wmOperator *UNUSED(op))
+static void curve_select_more(Object *obedit)
{
- Object *obedit = CTX_data_edit_object(C);
ListBase *editnurb = object_editcurve_get(obedit);
Nurb *nu;
BPoint *bp, *tempbp;
@@ -822,10 +873,20 @@ static int select_more_exec(bContext *C, wmOperator *UNUSED(op))
select_adjacent_cp(editnurb, 1, 0, SELECT);
select_adjacent_cp(editnurb, -1, 0, SELECT);
}
+}
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
-
+static int curve_select_more_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ curve_select_more(obedit);
+ DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -837,7 +898,7 @@ void CURVE_OT_select_more(wmOperatorType *ot)
ot->description = "Select control points directly linked to already selected ones";
/* api callbacks */
- ot->exec = select_more_exec;
+ ot->exec = curve_select_more_exec;
ot->poll = ED_operator_editsurfcurve;
/* flags */
@@ -847,9 +908,8 @@ void CURVE_OT_select_more(wmOperatorType *ot)
/******************** select less operator *****************/
/* basic method: deselect if control point doesn't have all neighbors selected */
-static int select_less_exec(bContext *C, wmOperator *UNUSED(op))
+static void curve_select_less(Object *obedit)
{
- Object *obedit = CTX_data_edit_object(C);
ListBase *editnurb = object_editcurve_get(obedit);
Nurb *nu;
BPoint *bp;
@@ -1010,11 +1070,20 @@ static int select_less_exec(bContext *C, wmOperator *UNUSED(op))
}
}
}
+}
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
- BKE_curve_nurb_vert_active_validate(obedit->data);
-
+static int curve_select_less_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ curve_select_less(obedit);
+ DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -1026,7 +1095,7 @@ void CURVE_OT_select_less(wmOperatorType *ot)
ot->description = "Reduce current selection by deselecting boundary elements";
/* api callbacks */
- ot->exec = select_less_exec;
+ ot->exec = curve_select_less_exec;
ot->poll = ED_operator_editsurfcurve;
/* flags */
@@ -1193,25 +1262,47 @@ static bool ed_curve_select_nth(Curve *cu, const struct CheckerIntervalParams *p
static int select_nth_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- struct CheckerIntervalParams op_params;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ Object *obact = CTX_data_edit_object(C);
+ View3D *v3d = CTX_wm_view3d(C);
+ bool changed = false;
+ struct CheckerIntervalParams op_params;
WM_operator_properties_checker_interval_from_op(op, &op_params);
- if (!ed_curve_select_nth(obedit->data, &op_params)) {
- if (obedit->type == OB_SURF) {
- BKE_report(op->reports, RPT_ERROR, "Surface has not got active point");
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = obedit->data;
+
+ if (!ED_curve_select_check(v3d, cu->editnurb)) {
+ continue;
}
- else {
- BKE_report(op->reports, RPT_ERROR, "Curve has not got active point");
+
+ if (ed_curve_select_nth(obedit->data, &op_params) == true) {
+ changed = true;
+ DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
}
+ }
+ MEM_freeN(objects);
+ if (!changed) {
+ if (obact->type == OB_SURF) {
+ BKE_report(op->reports, RPT_ERROR,
+ (objects_len == 1 ?
+ "Surface has no active point" :
+ "Surfaces have no active point"));
+ }
+ else {
+ BKE_report(op->reports, RPT_ERROR,
+ (objects_len == 1 ?
+ "Curve has no active point" :
+ "Curves have no active point"));
+ }
return OPERATOR_CANCELLED;
}
-
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
-
return OPERATOR_FINISHED;
}
@@ -1239,12 +1330,6 @@ void CURVE_OT_select_nth(wmOperatorType *ot)
/** \name Select Similar
* \{ */
-enum {
- SIM_CMP_EQ = 0,
- SIM_CMP_GT,
- SIM_CMP_LT,
-};
-
static const EnumPropertyItem curve_prop_similar_compare_types[] = {
{SIM_CMP_EQ, "EQUAL", 0, "Equal", ""},
{SIM_CMP_GT, "GREATER", 0, "Greater", ""},
@@ -1268,261 +1353,301 @@ static const EnumPropertyItem curve_prop_similar_types[] = {
{0, NULL, 0, NULL, NULL}
};
-static int curve_select_similar_cmp_fl(const float delta, const float thresh, const int compare)
+static void nurb_bezt_direction_worldspace_get(Object *ob, Nurb *nu, BezTriple *bezt, float r_dir[3])
{
- switch (compare) {
- case SIM_CMP_EQ:
- return (fabsf(delta) <= thresh);
- case SIM_CMP_GT:
- return ((delta + thresh) >= 0.0f);
- case SIM_CMP_LT:
- return ((delta - thresh) <= 0.0f);
- default:
- BLI_assert(0);
- return 0;
- }
+ float rsmat[3][3];
+ BKE_nurb_bezt_calc_normal(nu, bezt, r_dir);
+ copy_m3_m4(rsmat, ob->obmat);
+ mul_m3_v3(rsmat, r_dir);
+ normalize_v3(r_dir);
}
-
-static void curve_select_similar_direction__bezt(Nurb *nu, const float dir_ref[3], float angle_cos)
+static void nurb_bpoint_direction_worldspace_get(Object *ob, Nurb *nu, BPoint *bp, float r_dir[3])
{
- BezTriple *bezt;
- int i;
-
- for (i = nu->pntsu, bezt = nu->bezt; i--; bezt++) {
- if (!bezt->hide) {
- float dir[3];
- BKE_nurb_bezt_calc_normal(nu, bezt, dir);
- if (fabsf(dot_v3v3(dir_ref, dir)) >= angle_cos) {
- select_beztriple(bezt, SELECT, SELECT, VISIBLE);
- }
- }
- }
+ float rsmat[3][3];
+ BKE_nurb_bpoint_calc_normal(nu, bp, r_dir);
+ copy_m3_m4(rsmat, ob->obmat);
+ mul_m3_v3(rsmat, r_dir);
+ normalize_v3(r_dir);
}
-static void curve_select_similar_direction__bp(Nurb *nu, const float dir_ref[3], float angle_cos)
+static void curve_nurb_selected_type_get(Object *ob, Nurb *nu, const int type, KDTree *r_tree)
{
- BPoint *bp;
- int i;
+ float tree_entry[3] = {0.0f, 0.0f, 0.0f};
+
+ if (nu->type == CU_BEZIER) {
+ BezTriple *bezt;
+ int i;
+ int tree_index = 0;
- for (i = nu->pntsu * nu->pntsv, bp = nu->bp; i--; bp++) {
- if (!bp->hide) {
- float dir[3];
- BKE_nurb_bpoint_calc_normal(nu, bp, dir);
- if (fabsf(dot_v3v3(dir_ref, dir)) >= angle_cos) {
- select_bpoint(bp, SELECT, SELECT, VISIBLE);
+ for (i = nu->pntsu, bezt = nu->bezt; i--; bezt++) {
+ if ((!bezt->hide) && (bezt->f1 & SELECT)) {
+
+ switch (type) {
+ case SIMCURHAND_RADIUS:
+ {
+ float radius_ref = bezt->radius;
+ tree_entry[0] = radius_ref;
+ break;
+ }
+ case SIMCURHAND_WEIGHT:
+ {
+ float weight_ref = bezt->weight;
+ tree_entry[0] = weight_ref;
+ break;
+ }
+ case SIMCURHAND_DIRECTION:
+ {
+ nurb_bezt_direction_worldspace_get(ob, nu, bezt, tree_entry);
+ break;
+ }
+ }
+ BLI_kdtree_insert(r_tree, tree_index++, tree_entry);
}
}
}
-}
-
-static bool curve_select_similar_direction(ListBase *editnurb, Curve *cu, float thresh)
-{
- Nurb *nu, *act_nu;
- void *act_vert;
- float dir[3];
- float angle_cos;
-
- if (!BKE_curve_nurb_vert_active_get(cu, &act_nu, &act_vert)) {
- return false;
- }
-
- if (act_nu->type == CU_BEZIER) {
- BKE_nurb_bezt_calc_normal(act_nu, act_vert, dir);
- }
else {
- BKE_nurb_bpoint_calc_normal(act_nu, act_vert, dir);
- }
-
- /* map 0-1 to radians, 'cos' for comparison */
- angle_cos = cosf(thresh * (float)M_PI_2);
+ BPoint *bp;
+ int i;
+ int tree_index = 0;
- for (nu = editnurb->first; nu; nu = nu->next) {
- if (nu->type == CU_BEZIER) {
- curve_select_similar_direction__bezt(nu, dir, angle_cos);
- }
- else {
- curve_select_similar_direction__bp(nu, dir, angle_cos);
+ for (i = nu->pntsu * nu->pntsv, bp = nu->bp; i--; bp++) {
+ if (!bp->hide && bp->f1 & SELECT) {
+ switch (type) {
+ case SIMCURHAND_RADIUS:
+ {
+ float radius_ref = bp->radius;
+ tree_entry[0] = radius_ref;
+ break;
+ }
+ case SIMCURHAND_WEIGHT:
+ {
+ float weight_ref = bp->weight;
+ tree_entry[0] = weight_ref;
+ break;
+ }
+ case SIMCURHAND_DIRECTION:
+ {
+ nurb_bpoint_direction_worldspace_get(ob, nu, bp, tree_entry);
+ break;
+ }
+ }
+ BLI_kdtree_insert(r_tree, tree_index++, tree_entry);
+ }
}
}
-
- return true;
}
-static void curve_select_similar_radius__bezt(Nurb *nu, float radius_ref, int compare, float thresh)
+static bool curve_nurb_select_similar_type(
+ Object *ob, Nurb *nu, const int type,
+ const KDTree *tree, const float thresh, const int compare)
{
- BezTriple *bezt;
- int i;
+ const float thresh_cos = cosf(thresh * (float)M_PI_2);
+ bool changed = false;
+
+ if (nu->type == CU_BEZIER) {
+ BezTriple *bezt;
+ int i;
+
+ for (i = nu->pntsu, bezt = nu->bezt; i--; bezt++) {
+ if (!bezt->hide) {
+ bool select = false;
+
+ switch (type) {
+ case SIMCURHAND_RADIUS:
+ {
+ float radius_ref = bezt->radius;
+ if (ED_select_similar_compare_float_tree(tree, radius_ref, thresh, compare)) {
+ select = true;
+ }
+ break;
+ }
+ case SIMCURHAND_WEIGHT:
+ {
+ float weight_ref = bezt->weight;
+ if (ED_select_similar_compare_float_tree(tree, weight_ref, thresh, compare)) {
+ select = true;
+ }
+ break;
+ }
+ case SIMCURHAND_DIRECTION:
+ {
+ float dir[3];
+ nurb_bezt_direction_worldspace_get(ob, nu, bezt, dir);
+ KDTreeNearest nearest;
+ if (BLI_kdtree_find_nearest(tree, dir, &nearest) != -1) {
+ float orient = angle_normalized_v3v3(dir, nearest.co);
+ float delta = thresh_cos - fabsf(cosf(orient));
+ if (ED_select_similar_compare_float(delta, thresh, compare)) {
+ select = true;
+ }
+ }
+ break;
+ }
+ }
- for (i = nu->pntsu, bezt = nu->bezt; i--; bezt++) {
- if (!bezt->hide) {
- if (curve_select_similar_cmp_fl(bezt->radius - radius_ref, thresh, compare)) {
- select_beztriple(bezt, SELECT, SELECT, VISIBLE);
+ if (select) {
+ select_beztriple(bezt, SELECT, SELECT, VISIBLE);
+ changed = true;
+ }
}
}
}
-}
+ else {
+ BPoint *bp;
+ int i;
-static void curve_select_similar_radius__bp(Nurb *nu, float radius_ref, int compare, float thresh)
-{
- BPoint *bp;
- int i;
+ for (i = nu->pntsu * nu->pntsv, bp = nu->bp; i--; bp++) {
+ if (!bp->hide) {
+ bool select = false;
+
+ switch (type) {
+ case SIMCURHAND_RADIUS:
+ {
+ float radius_ref = bp->radius;
+ if (ED_select_similar_compare_float_tree(tree, radius_ref, thresh, compare)) {
+ select = true;
+ }
+ break;
+ }
+ case SIMCURHAND_WEIGHT:
+ {
+ float weight_ref = bp->weight;
+ if (ED_select_similar_compare_float_tree(tree, weight_ref, thresh, compare)) {
+ select = true;
+ }
+ break;
+ }
+ case SIMCURHAND_DIRECTION:
+ {
+ float dir[3];
+ nurb_bpoint_direction_worldspace_get(ob, nu, bp, dir);
+ KDTreeNearest nearest;
+ if (BLI_kdtree_find_nearest(tree, dir, &nearest) != -1) {
+ float orient = angle_normalized_v3v3(dir, nearest.co);
+ float delta = fabsf(cosf(orient)) - thresh_cos;
+ if (ED_select_similar_compare_float(delta, thresh, compare)) {
+ select = true;
+ }
+ }
+ break;
+ }
+ }
- for (i = nu->pntsu * nu->pntsv, bp = nu->bp; i--; bp++) {
- if (!bp->hide) {
- if (curve_select_similar_cmp_fl(bp->radius - radius_ref, thresh, compare)) {
- select_bpoint(bp, SELECT, SELECT, VISIBLE);
+ if (select) {
+ select_bpoint(bp, SELECT, SELECT, VISIBLE);
+ changed = true;
+ }
}
}
}
+ return changed;
}
-static bool curve_select_similar_radius(ListBase *editnurb, Curve *cu, float compare, float thresh)
+static int curve_select_similar_exec(bContext *C, wmOperator *op)
{
- Nurb *nu, *act_nu;
- void *act_vert;
- float radius_ref;
+ /* Get props. */
+ const int optype = RNA_enum_get(op->ptr, "type");
+ const float thresh = RNA_float_get(op->ptr, "threshold");
+ const int compare = RNA_enum_get(op->ptr, "compare");
- if (!BKE_curve_nurb_vert_active_get(cu, &act_nu, &act_vert)) {
- return false;
- }
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ View3D *v3d = CTX_wm_view3d(C);
+ int tot_nurbs_selected_all = 0;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
- if (act_nu->type == CU_BEZIER) {
- radius_ref = ((BezTriple *)act_vert)->radius;
- }
- else {
- radius_ref = ((BPoint *)act_vert)->radius;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = obedit->data;
+ tot_nurbs_selected_all += ED_curve_select_count(v3d, cu->editnurb);
}
- /* make relative */
- thresh *= radius_ref;
-
- for (nu = editnurb->first; nu; nu = nu->next) {
- if (nu->type == CU_BEZIER) {
- curve_select_similar_radius__bezt(nu, radius_ref, compare, thresh);
- }
- else {
- curve_select_similar_radius__bp(nu, radius_ref, compare, thresh);
- }
+ if (tot_nurbs_selected_all == 0) {
+ BKE_report(op->reports, RPT_ERROR, "No control point selected");
+ MEM_freeN(objects);
+ return OPERATOR_CANCELLED;
}
- return true;
-}
+ KDTree *tree = NULL;
+ short type_ref = 0;
-static void curve_select_similar_weight__bezt(Nurb *nu, float weight_ref, int compare, float thresh)
-{
- BezTriple *bezt;
- int i;
-
- for (i = nu->pntsu, bezt = nu->bezt; i--; bezt++) {
- if (!bezt->hide) {
- if (curve_select_similar_cmp_fl(bezt->weight - weight_ref, thresh, compare)) {
- select_beztriple(bezt, SELECT, SELECT, VISIBLE);
- }
- }
+ switch (optype) {
+ case SIMCURHAND_RADIUS:
+ case SIMCURHAND_WEIGHT:
+ case SIMCURHAND_DIRECTION:
+ tree = BLI_kdtree_new(tot_nurbs_selected_all);
+ break;
}
-}
-static void curve_select_similar_weight__bp(Nurb *nu, float weight_ref, int compare, float thresh)
-{
- BPoint *bp;
- int i;
+ /* Get type of selected control points. */
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = obedit->data;
+ EditNurb *editnurb = cu->editnurb;
- for (i = nu->pntsu * nu->pntsv, bp = nu->bp; i--; bp++) {
- if (!bp->hide) {
- if (curve_select_similar_cmp_fl(bp->weight - weight_ref, thresh, compare)) {
- select_bpoint(bp, SELECT, SELECT, VISIBLE);
+ Nurb *nu;
+ for (nu = editnurb->nurbs.first; nu; nu = nu->next) {
+ if (!ED_curve_nurb_select_check(v3d, nu)) {
+ continue;
+ }
+ switch (optype) {
+ case SIMCURHAND_TYPE:
+ {
+ type_ref |= nu->type;
+ break;
+ }
+ case SIMCURHAND_RADIUS:
+ case SIMCURHAND_WEIGHT:
+ case SIMCURHAND_DIRECTION:
+ curve_nurb_selected_type_get(obedit, nu, optype, tree);
+ break;
}
}
}
-}
-
-static bool curve_select_similar_weight(ListBase *editnurb, Curve *cu, float compare, float thresh)
-{
- Nurb *nu, *act_nu;
- void *act_vert;
- float weight_ref;
- if (!BKE_curve_nurb_vert_active_get(cu, &act_nu, &act_vert))
- return false;
-
- if (act_nu->type == CU_BEZIER) {
- weight_ref = ((BezTriple *)act_vert)->weight;
+ if (tree != NULL) {
+ BLI_kdtree_balance(tree);
}
- else {
- weight_ref = ((BPoint *)act_vert)->weight;
- }
-
- for (nu = editnurb->first; nu; nu = nu->next) {
- if (nu->type == CU_BEZIER) {
- curve_select_similar_weight__bezt(nu, weight_ref, compare, thresh);
- }
- else {
- curve_select_similar_weight__bp(nu, weight_ref, compare, thresh);
- }
- }
-
- return true;
-}
-
-static bool curve_select_similar_type(ListBase *editnurb, Curve *cu)
-{
- Nurb *nu, *act_nu;
- int type_ref;
-
- /* Get active nurb type */
- act_nu = BKE_curve_nurb_active_get(cu);
- if (!act_nu)
- return false;
+ /* Select control points with desired type. */
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Curve *cu = obedit->data;
+ EditNurb *editnurb = cu->editnurb;
+ bool changed = false;
+ Nurb *nu;
- /* Get the active nurb type */
- type_ref = act_nu->type;
+ for (nu = editnurb->nurbs.first; nu; nu = nu->next) {
+ switch (optype) {
+ case SIMCURHAND_TYPE:
+ {
+ if (nu->type & type_ref) {
+ ED_curve_nurb_select_all(nu);
+ changed = true;
+ }
+ break;
+ }
+ case SIMCURHAND_RADIUS:
+ case SIMCURHAND_WEIGHT:
+ case SIMCURHAND_DIRECTION:
+ changed = curve_nurb_select_similar_type(obedit, nu, optype, tree, thresh, compare);
+ break;
+ }
+ }
- for (nu = editnurb->first; nu; nu = nu->next) {
- if (nu->type == type_ref) {
- ED_curve_nurb_select_all(nu);
+ if (changed) {
+ DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
}
}
- return true;
-}
-
-static int curve_select_similar_exec(bContext *C, wmOperator *op)
-{
- Object *obedit = CTX_data_edit_object(C);
- Curve *cu = obedit->data;
- ListBase *editnurb = object_editcurve_get(obedit);
- bool changed = false;
-
- /* Get props */
- const int type = RNA_enum_get(op->ptr, "type");
- const float thresh = RNA_float_get(op->ptr, "threshold");
- const int compare = RNA_enum_get(op->ptr, "compare");
-
- switch (type) {
- case SIMCURHAND_TYPE:
- changed = curve_select_similar_type(editnurb, cu);
- break;
- case SIMCURHAND_RADIUS:
- changed = curve_select_similar_radius(editnurb, cu, compare, thresh);
- break;
- case SIMCURHAND_WEIGHT:
- changed = curve_select_similar_weight(editnurb, cu, compare, thresh);
- break;
- case SIMCURHAND_DIRECTION:
- changed = curve_select_similar_direction(editnurb, cu, thresh);
- break;
+ MEM_freeN(objects);
+ if (tree != NULL) {
+ BLI_kdtree_free(tree);
}
+ return OPERATOR_FINISHED;
- if (changed) {
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
- return OPERATOR_FINISHED;
- }
- else {
- return OPERATOR_CANCELLED;
- }
}
void CURVE_OT_select_similar(wmOperatorType *ot)
@@ -1628,7 +1753,7 @@ static void curve_select_shortest_path_curve(Nurb *nu, int vert_src, int vert_ds
static void curve_select_shortest_path_surf(Nurb *nu, int vert_src, int vert_dst)
{
- Heap *heap;
+ HeapSimple *heap;
int i, vert_curr;
@@ -1651,18 +1776,18 @@ static void curve_select_shortest_path_surf(Nurb *nu, int vert_src, int vert_dst
}
/* init heap */
- heap = BLI_heap_new();
+ heap = BLI_heapsimple_new();
vert_curr = data[vert_src].vert;
- BLI_heap_insert(heap, 0.0f, &data[vert_src].vert);
+ BLI_heapsimple_insert(heap, 0.0f, &data[vert_src].vert);
data[vert_src].cost = 0.0f;
data[vert_src].vert_prev = vert_src; /* nop */
- while (!BLI_heap_is_empty(heap)) {
+ while (!BLI_heapsimple_is_empty(heap)) {
int axis, sign;
int u, v;
- vert_curr = *((int *)BLI_heap_pop_min(heap));
+ vert_curr = *((int *)BLI_heapsimple_pop_min(heap));
if (vert_curr == vert_dst) {
break;
}
@@ -1684,7 +1809,7 @@ static void curve_select_shortest_path_surf(Nurb *nu, int vert_src, int vert_dst
if (data[vert_other].cost > dist) {
data[vert_other].cost = dist;
if (data[vert_other].vert_prev == -1) {
- BLI_heap_insert(heap, data[vert_other].cost, &data[vert_other].vert);
+ BLI_heapsimple_insert(heap, data[vert_other].cost, &data[vert_other].vert);
}
data[vert_other].vert_prev = vert_curr;
}
@@ -1695,7 +1820,7 @@ static void curve_select_shortest_path_surf(Nurb *nu, int vert_src, int vert_dst
}
- BLI_heap_free(heap, NULL);
+ BLI_heapsimple_free(heap, NULL);
if (vert_curr == vert_dst) {
i = 0;
@@ -1715,26 +1840,29 @@ static void curve_select_shortest_path_surf(Nurb *nu, int vert_src, int vert_dst
static int edcu_shortest_path_pick_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
- Object *obedit = CTX_data_edit_object(C);
- Curve *cu = obedit->data;
- Nurb *nu_src = BKE_curve_nurb_active_get(cu);
- int vert_src = cu->actvert;
-
ViewContext vc;
Nurb *nu_dst;
BezTriple *bezt_dst;
BPoint *bp_dst;
int vert_dst;
void *vert_dst_p;
+ Base *basact = NULL;
- if (vert_src == CU_ACT_NONE) {
+ view3d_operator_needs_opengl(C);
+ ED_view3d_viewcontext_init(C, &vc);
+ copy_v2_v2_int(vc.mval, event->mval);
+
+ if (!ED_curve_pick_vert(&vc, 1, &nu_dst, &bezt_dst, &bp_dst, NULL, &basact)) {
return OPERATOR_PASS_THROUGH;
}
- view3d_operator_needs_opengl(C);
- ED_view3d_viewcontext_init(C, &vc);
+ ED_view3d_viewcontext_init_object(&vc, basact->object);
+ Object *obedit = basact->object;
+ Curve *cu = obedit->data;
+ Nurb *nu_src = BKE_curve_nurb_active_get(cu);
+ int vert_src = cu->actvert;
- if (!ED_curve_pick_vert(&vc, 1, event->mval, &nu_dst, &bezt_dst, &bp_dst, NULL)) {
+ if (vert_src == CU_ACT_NONE) {
return OPERATOR_PASS_THROUGH;
}
@@ -1758,6 +1886,10 @@ static int edcu_shortest_path_pick_invoke(bContext *C, wmOperator *op, const wmE
BKE_curve_nurb_vert_active_set(cu, nu_dst, vert_dst_p);
+ if (vc.view_layer->basact != basact) {
+ ED_object_base_activate(C, basact);
+ }
+
DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/curve/editcurve_undo.c b/source/blender/editors/curve/editcurve_undo.c
index ad17331853b..ebf24446afc 100644
--- a/source/blender/editors/curve/editcurve_undo.c
+++ b/source/blender/editors/curve/editcurve_undo.c
@@ -34,12 +34,11 @@
#include "BLI_ghash.h"
#include "BLI_array_utils.h"
+#include "BKE_animsys.h"
#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_fcurve.h"
#include "BKE_layer.h"
-#include "BKE_library.h"
-#include "BKE_animsys.h"
#include "BKE_undo_system.h"
#include "DEG_depsgraph.h"
diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c
index 6725817e35d..b87584dc8b7 100644
--- a/source/blender/editors/curve/editfont.c
+++ b/source/blender/editors/curve/editfont.c
@@ -56,6 +56,7 @@
#include "BKE_report.h"
#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -246,6 +247,7 @@ static int insert_into_textbuf(Object *obedit, uintptr_t c)
static void text_update_edited(bContext *C, Object *obedit, int mode)
{
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
Curve *cu = obedit->data;
EditFont *ef = cu->editfont;
@@ -258,7 +260,8 @@ static void text_update_edited(bContext *C, Object *obedit, int mode)
}
else {
/* depsgraph runs above, but since we're not tagging for update, call direct */
- BKE_vfont_to_curve(obedit, mode);
+ /* We need evaluated data here. */
+ BKE_vfont_to_curve(DEG_get_evaluated_object(depsgraph, obedit), mode);
}
cu->curinfo = ef->textbufinfo[ef->pos ? ef->pos - 1 : 0];
@@ -895,6 +898,7 @@ static const EnumPropertyItem move_type_items[] = {
static int move_cursor(bContext *C, int type, const bool select)
{
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
Object *obedit = CTX_data_edit_object(C);
Curve *cu = obedit->data;
EditFont *ef = cu->editfont;
@@ -977,17 +981,17 @@ static int move_cursor(bContext *C, int type, const bool select)
else if (ef->pos >= MAXTEXT) ef->pos = MAXTEXT;
else if (ef->pos < 0) ef->pos = 0;
- /* apply virtical cursor motion to position immediately
+ /* apply vertical cursor motion to position immediately
* otherwise the selection will lag behind */
if (FO_CURS_IS_MOTION(cursmove)) {
- BKE_vfont_to_curve(obedit, cursmove);
+ BKE_vfont_to_curve(DEG_get_evaluated_object(depsgraph, obedit), cursmove);
cursmove = FO_CURS;
}
if (select == 0) {
if (ef->selstart) {
ef->selstart = ef->selend = 0;
- BKE_vfont_to_curve(obedit, FO_SELCHANGE);
+ BKE_vfont_to_curve(DEG_get_evaluated_object(depsgraph, obedit), FO_SELCHANGE);
}
}
@@ -1431,7 +1435,7 @@ void FONT_OT_text_insert(wmOperatorType *ot)
ot->poll = ED_operator_editfont;
/* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ ot->flag = OPTYPE_UNDO;
/* properties */
RNA_def_string(ot->srna, "text", NULL, 0, "Text", "Text to insert at the cursor position");
@@ -1453,6 +1457,7 @@ static int textbox_add_exec(bContext *C, wmOperator *UNUSED(op))
cu->totbox++;
}
+ DEG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1495,6 +1500,7 @@ static int textbox_remove_exec(bContext *C, wmOperator *op)
cu->actbox--;
}
+ DEG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/datafiles/CMakeLists.txt b/source/blender/editors/datafiles/CMakeLists.txt
index 4c735634b3f..452c194d7db 100644
--- a/source/blender/editors/datafiles/CMakeLists.txt
+++ b/source/blender/editors/datafiles/CMakeLists.txt
@@ -42,8 +42,8 @@ set(ICON_NAMES
tria_up
arrow_leftright
plus
- disclosure_tri_down
disclosure_tri_right
+ disclosure_tri_down
radiobut_off
radiobut_on
menu_panel
@@ -58,12 +58,12 @@ set(ICON_NAMES
node
node_sel
fullscreen
- splitscreen
+ workspace
rightarrow_thin
bordermove
viewzoom
- zoomin
- zoomout
+ add
+ remove
panel_close
copy_id
eyedropper
@@ -100,14 +100,16 @@ set(ICON_NAMES
freeze
stylus_pressure
ghost_disabled
- new
+ file_new
file_tick
quit
url
recover_last
+ 30
fullscreen_enter
fullscreen_exit
- lamp
+ #onionskin
+ light
material
texture
anim
@@ -121,27 +123,31 @@ set(ICON_NAMES
physics
speaker
texture_shaded
+ tool_settings
+ shaderfx
+ #blank1
view3d
- ipo
- oops
- buts
- filesel
- image_col
+ graph
+ outliner
+ properties
+ filebrowser
+ image
info
sequence
text
- imasel
sound
action
nla
- scriptwin
+ preferences
time
nodetree
logic
console
- preferences
clip
asset_manager
+ node_compositing
+ node_texture
+ node_material
object_datamode
editmode_hlt
facesel_hlt
@@ -153,6 +159,15 @@ set(ICON_NAMES
particlemode
lightpaint
greasepencil_stroke_paint
+ tracking
+ tracking_backwards
+ tracking_forwards
+ tracking_backwards_single
+ tracking_forwards_single
+ tracking_clear_backwards
+ tracking_clear_forwards
+ tracking_refine_backwards
+ tracking_refine_forwards
scene_data
renderlayers
world_data
@@ -161,7 +176,7 @@ set(ICON_NAMES
curve_data
meta_data
lattice_data
- lamp_data
+ light_data
material_data
texture_data
anim_data
@@ -186,7 +201,6 @@ set(ICON_NAMES
render_result
surface_data
empty_data
- settings
render_animation
render_still
library_data_broken
@@ -200,18 +214,36 @@ set(ICON_NAMES
group_vertex
group_vcol
group_uvs
+ face_maps
rna
rna_add
mouse_lmb
mouse_mmb
mouse_rmb
- mouse_drag
+ mouse_move
+ mouse_lmb_drag
+ mouse_mmb_drag
+ mouse_rmb_drag
+ preset
+ decorate
+ decorate_keyframe
+ decorate_animate
+ decorate_driver
+ decorate_linked
+ decorate_override
+ decorate_unlocked
+ decorate_locked
+ fake_user
+ orphan_data
+ user
+ system
+ settings
outliner_ob_empty
outliner_ob_mesh
outliner_ob_curve
outliner_ob_lattice
outliner_ob_meta
- outliner_ob_lamp
+ outliner_ob_light
outliner_ob_camera
outliner_ob_armature
outliner_ob_font
@@ -220,6 +252,8 @@ set(ICON_NAMES
outliner_ob_force_field
outliner_ob_group_instance
outliner_ob_greasepencil
+ outliner_ob_lightprobe
+ outliner_ob_image
restrict_color_off
restrict_color_on
restrict_view_off
@@ -228,12 +262,11 @@ set(ICON_NAMES
restrict_select_on
restrict_render_off
restrict_render_on
- outliner_data_empty
outliner_data_mesh
outliner_data_curve
outliner_data_lattice
outliner_data_meta
- outliner_data_lamp
+ outliner_data_light
outliner_data_camera
outliner_data_armature
outliner_data_font
@@ -241,6 +274,10 @@ set(ICON_NAMES
outliner_data_speaker
outliner_data_pose
outliner_data_greasepencil
+ onionskin_off
+ onionskin_on
+ hide_off
+ hide_on
mesh_plane
mesh_cube
mesh_circle
@@ -252,11 +289,11 @@ set(ICON_NAMES
mesh_torus
mesh_cone
mesh_capsule
- lamp_point
- lamp_sun
- lamp_spot
- lamp_hemi
- lamp_area
+ light_point
+ light_sun
+ light_spot
+ light_hemi
+ light_area
meta_empty
meta_plane
meta_cube
@@ -274,6 +311,9 @@ set(ICON_NAMES
curve_ncurve
curve_ncircle
curve_path
+ lightprobe_cubemap
+ lightprobe_planar
+ lightprobe_grid
color_red
color_green
color_blue
@@ -294,8 +334,25 @@ set(ICON_NAMES
force_turbulence
force_drag
force_smokeflow
+ temperature
+ gear
node_insert_on
node_insert_off
+ node_top
+ node_side
+ node_corner
+ align_left
+ align_center
+ align_right
+ align_justify
+ align_flush
+ align_top
+ align_middle
+ align_bottom
+ bold
+ italic
+ underline
+ small_caps
modifier
mod_wave
mod_build
@@ -346,7 +403,6 @@ set(ICON_NAMES
pause
prev_keyframe
next_keyframe
- play_audio
play_reverse
preview_range
action_tweak
@@ -355,8 +411,8 @@ set(ICON_NAMES
pmarker
marker_hlt
marker
- space2
- space3
+ keyframe_hlt
+ keyframe
keyingset
key_dehlt
key_hlt
@@ -390,13 +446,12 @@ set(ICON_NAMES
vertexsel
edgesel
facesel
- loopsel
- rotate
- cursor
- rotatecollection
- rotatecenter
- rotactive
- align
+ pivot_boundbox
+ pivot_cursor
+ pivot_individual
+ pivot_median
+ pivot_active
+ center_only
smoothcurve
spherecurve
rootcurve
@@ -407,6 +462,7 @@ set(ICON_NAMES
prop_off
prop_on
prop_con
+ sculpt_dyntopo
particle_point
particle_tip
particle_path
@@ -431,15 +487,19 @@ set(ICON_NAMES
snap_peel_object
grid
object_origin
+ orientation_global
+ orientation_gimbal
+ orientation_local
+ orientation_normal
+ orientation_view
pastedown
copydown
pasteflipup
pasteflipdown
vis_sel_11
vis_sel_10
- vis_sel_10
+ vis_sel_01
vis_sel_00
- snap_surface
automerge_on
automerge_off
retopo
@@ -448,12 +508,16 @@ set(ICON_NAMES
uv_facesel
uv_islandsel
uv_sync_select
- bbox
- wire
- solid
- smooth
- potato
- ortho
+ normals_vertex
+ normals_vertex_face
+ normals_face
+ shading_bbox
+ shading_wire
+ shading_solid
+ shading_rendered
+ shading_texture
+ overlay
+ xray
lockview_off
lockview_on
axis_side
@@ -473,8 +537,6 @@ set(ICON_NAMES
shortdisplay
ghost
imgdisplay
- save_as
- save_copy
bookmarks
fontpreview
filter
@@ -483,6 +545,7 @@ set(ICON_NAMES
file_parent
file_refresh
file_folder
+ file_blank
file_blend
file_image
file_movie
@@ -490,18 +553,19 @@ set(ICON_NAMES
file_sound
file_font
file_text
- recover_auto
- save_prefs
+ sort_desc
+ sort_asc
link_blend
append_blend
import
export
external_data
- load_factory
loop_back
loop_forwards
back
forward
+ alembic
+ volume
file_hidden
file_backup
disk_drive
@@ -531,39 +595,38 @@ set(ICON_NAMES
image_alpha
image_zdepth
imagefile
+ view_perspective
+ view_ortho
+ view_camera
+ view_pan
+ view_zoom
)
# This section is maintained by the updating script, keep BEGIN/END comments.
set_property(GLOBAL PROPERTY ICON_GEOM_NAMES
# BEGIN ICON_GEOM_NAMES
- brush.gpencil.draw.eraser_hard
- brush.gpencil.draw.eraser_soft
- brush.gpencil.draw.eraser_stroke
- brush.gpencil.draw_block
- brush.gpencil.draw_fill
- brush.gpencil.draw_ink
- brush.gpencil.draw_marker
- brush.gpencil.draw_noise
- brush.gpencil.draw_pen
- brush.gpencil.draw_pencil
+ brush.gpencil_draw.draw
+ brush.gpencil_draw.erase
+ brush.gpencil_draw.fill
brush.paint_texture.airbrush
brush.paint_texture.clone
brush.paint_texture.draw
brush.paint_texture.fill
brush.paint_texture.mask
+ brush.paint_texture.masklort
brush.paint_texture.multiply
brush.paint_texture.smear
brush.paint_texture.soften
brush.paint_vertex.alpha
+ brush.paint_vertex.average
brush.paint_vertex.blur
- brush.paint_vertex.mix
+ brush.paint_vertex.draw
brush.paint_vertex.smear
+ brush.paint_weight.average
brush.paint_weight.blur
- brush.paint_weight.darken
brush.paint_weight.draw
- brush.paint_weight.lighten
brush.paint_weight.mix
- brush.paint_weight.multiply
+ brush.paint_weight.smear
brush.particle.add
brush.particle.comb
brush.particle.cut
@@ -586,20 +649,19 @@ set_property(GLOBAL PROPERTY ICON_GEOM_NAMES
brush.sculpt.pinch
brush.sculpt.rotate
brush.sculpt.scrape
+ brush.sculpt.simplify
brush.sculpt.smooth
brush.sculpt.snake_hook
brush.sculpt.thumb
- brush.vertex.average
- brush.weight.add
- brush.weight.subtract
none
ops.armature.bone.roll
- ops.armature.extrude.cursor
- ops.armature.extrude
+ ops.armature.extrude_cursor
+ ops.armature.extrude_move
ops.curve.draw
- ops.curve.dupli_extrude_cursor
+ ops.curve.extrude_cursor
+ ops.curve.extrude_move
ops.generic.cursor
- ops.generic.select_border
+ ops.generic.select_box
ops.generic.select_circle
ops.generic.select_lasso
ops.gpencil.draw
@@ -610,6 +672,9 @@ set_property(GLOBAL PROPERTY ICON_GEOM_NAMES
ops.gpencil.edit_mirror
ops.gpencil.edit_shear
ops.gpencil.edit_to_sphere
+ ops.gpencil.primitive_box
+ ops.gpencil.primitive_circle
+ ops.gpencil.primitive_line
ops.gpencil.sculpt_clone
ops.gpencil.sculpt_grab
ops.gpencil.sculpt_pinch
@@ -645,8 +710,15 @@ set_property(GLOBAL PROPERTY ICON_GEOM_NAMES
ops.paint.vertex_color_fill
ops.paint.weight_fill
ops.paint.weight_gradient
+ ops.paint.weight_sample
+ ops.paint.weight_sample_group
+ ops.pose.breakdowner
+ ops.pose.push
+ ops.pose.relax
ops.sculpt.border_hide
ops.sculpt.border_mask
+ ops.transform.bone_envelope
+ ops.transform.bone_size
ops.transform.edge_slide
ops.transform.push_pull
ops.transform.resize.cage
@@ -674,7 +746,6 @@ if(WITH_BLENDER)
# blender UI only
# blends
- data_to_c_simple(../../../../release/datafiles/preview.blend SRC)
data_to_c_simple(../../../../release/datafiles/preview_cycles.blend SRC)
data_to_c_simple(../../../../release/datafiles/preview_grease_pencil.blend SRC)
@@ -699,24 +770,20 @@ if(WITH_BLENDER)
data_to_c_simple(../../../../release/datafiles/prvicons.png SRC)
# brushes
- data_to_c_simple(../../../../release/datafiles/brushicons/add.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/blob.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/blur.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/clay.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/claystrips.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/clone.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/crease.png SRC)
- data_to_c_simple(../../../../release/datafiles/brushicons/darken.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/draw.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/fill.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/flatten.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/grab.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/inflate.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/layer.png SRC)
- data_to_c_simple(../../../../release/datafiles/brushicons/lighten.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/mask.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/mix.png SRC)
- data_to_c_simple(../../../../release/datafiles/brushicons/multiply.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/nudge.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/pinch.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/scrape.png SRC)
@@ -724,13 +791,11 @@ if(WITH_BLENDER)
data_to_c_simple(../../../../release/datafiles/brushicons/smooth.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/snake_hook.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/soften.png SRC)
- data_to_c_simple(../../../../release/datafiles/brushicons/subtract.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/texdraw.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/texfill.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/texmask.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/thumb.png SRC)
data_to_c_simple(../../../../release/datafiles/brushicons/twist.png SRC)
- data_to_c_simple(../../../../release/datafiles/brushicons/vertexdraw.png SRC)
# grease pencil sculpt
data_to_c_simple(../../../../release/datafiles/brushicons/gp_brush_smooth.png SRC)
diff --git a/source/blender/editors/gizmo_library/CMakeLists.txt b/source/blender/editors/gizmo_library/CMakeLists.txt
index e1ea5c22ce5..0e7b2a8be0f 100644
--- a/source/blender/editors/gizmo_library/CMakeLists.txt
+++ b/source/blender/editors/gizmo_library/CMakeLists.txt
@@ -45,6 +45,7 @@ set(SRC
geometry/geom_arrow_gizmo.c
geometry/geom_cube_gizmo.c
geometry/geom_dial_gizmo.c
+ gizmo_group_types/value2d_gizmo_group.c
gizmo_types/arrow2d_gizmo.c
gizmo_types/arrow3d_gizmo.c
gizmo_types/blank3d_gizmo.c
@@ -52,8 +53,9 @@ set(SRC
gizmo_types/cage2d_gizmo.c
gizmo_types/cage3d_gizmo.c
gizmo_types/dial3d_gizmo.c
- gizmo_types/grab3d_gizmo.c
+ gizmo_types/move3d_gizmo.c
gizmo_types/primitive3d_gizmo.c
+ gizmo_types/value2d_gizmo.c
)
add_definitions(${GL_DEFINITIONS})
diff --git a/source/blender/editors/gizmo_library/geometry/geom_arrow_gizmo.c b/source/blender/editors/gizmo_library/geometry/geom_arrow_gizmo.c
index 11708f5b5ce..55b33b0d8ad 100644
--- a/source/blender/editors/gizmo_library/geometry/geom_arrow_gizmo.c
+++ b/source/blender/editors/gizmo_library/geometry/geom_arrow_gizmo.c
@@ -22,7 +22,7 @@
*/
/** \file geom_arrow_gizmo.c
- * \ingroup wm
+ * \ingroup edgizmolib
*/
#include "../gizmo_geometry.h"
diff --git a/source/blender/editors/gizmo_library/geometry/geom_cube_gizmo.c b/source/blender/editors/gizmo_library/geometry/geom_cube_gizmo.c
index 28eb772c082..410e2a5ad6e 100644
--- a/source/blender/editors/gizmo_library/geometry/geom_cube_gizmo.c
+++ b/source/blender/editors/gizmo_library/geometry/geom_cube_gizmo.c
@@ -24,7 +24,7 @@
*/
/** \file geom_cube_gizmo.c
- * \ingroup wm
+ * \ingroup edgizmolib
*/
#include "../gizmo_geometry.h"
diff --git a/source/blender/editors/gizmo_library/geometry/geom_dial_gizmo.c b/source/blender/editors/gizmo_library/geometry/geom_dial_gizmo.c
index 0225a662ff3..22cf0785c64 100644
--- a/source/blender/editors/gizmo_library/geometry/geom_dial_gizmo.c
+++ b/source/blender/editors/gizmo_library/geometry/geom_dial_gizmo.c
@@ -22,7 +22,7 @@
*/
/** \file geom_dial_gizmo.c
- * \ingroup wm
+ * \ingroup edgizmolib
*/
#include "../gizmo_geometry.h"
diff --git a/source/blender/editors/gizmo_library/gizmo_draw_utils.c b/source/blender/editors/gizmo_library/gizmo_draw_utils.c
index 5ccb1fa1f6d..9ef53d8f696 100644
--- a/source/blender/editors/gizmo_library/gizmo_draw_utils.c
+++ b/source/blender/editors/gizmo_library/gizmo_draw_utils.c
@@ -24,7 +24,7 @@
*/
/** \file gizmo_draw_utils.c
- * \ingroup wm
+ * \ingroup edgizmolib
*/
#include "BLI_listbase.h"
diff --git a/source/blender/editors/gizmo_library/gizmo_geometry.h b/source/blender/editors/gizmo_library/gizmo_geometry.h
index 254fb6b0957..53541b0aa01 100644
--- a/source/blender/editors/gizmo_library/gizmo_geometry.h
+++ b/source/blender/editors/gizmo_library/gizmo_geometry.h
@@ -22,7 +22,7 @@
*/
/** \file gizmo_geometry.h
- * \ingroup wm
+ * \ingroup edgizmolib
*
* \name Gizmo Geometry
*
diff --git a/source/blender/editors/gizmo_library/gizmo_group_types/value2d_gizmo_group.c b/source/blender/editors/gizmo_library/gizmo_group_types/value2d_gizmo_group.c
new file mode 100644
index 00000000000..274d35269d1
--- /dev/null
+++ b/source/blender/editors/gizmo_library/gizmo_group_types/value2d_gizmo_group.c
@@ -0,0 +1,176 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file value2d_gizmo_group.c
+ * \ingroup edgizmolib
+ *
+ * \name 2D Value Gizmo
+ *
+ * \brief Gizmo that edits a value for operator redo.
+ */
+
+#include "BLI_utildefines.h"
+
+#include "BKE_context.h"
+
+#include "ED_undo.h"
+#include "ED_screen.h"
+#include "ED_gizmo_library.h"
+
+#include "UI_resources.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "RNA_access.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+/* -------------------------------------------------------------------- */
+/** \name Value Gizmo
+ * \{ */
+
+struct ValueOpRedoGroup {
+ wmGizmo *gizmo;
+ struct {
+ const bContext *context; /* needed for redo. */
+ wmOperator *op;
+ } state;
+};
+
+static void gizmo_op_redo_exec(struct ValueOpRedoGroup *igzgroup)
+{
+ wmOperator *op = igzgroup->state.op;
+ if (op == WM_operator_last_redo((bContext *)igzgroup->state.context)) {
+ ED_undo_operator_repeat((bContext *)igzgroup->state.context, op);
+ }
+}
+
+/* translate callbacks */
+static void gizmo_value_operator_redo_value_get(
+ const wmGizmo *gz, wmGizmoProperty *gz_prop,
+ void *value_p)
+{
+ float *value = value_p;
+ BLI_assert(gz_prop->type->array_length == 1);
+ UNUSED_VARS_NDEBUG(gz_prop);
+
+ struct ValueOpRedoGroup *igzgroup = gz->parent_gzgroup->customdata;
+ wmOperator *op = igzgroup->state.op;
+ *value = RNA_property_float_get(op->ptr, op->type->prop);
+}
+
+static void gizmo_value_operator_redo_value_set(
+ const wmGizmo *gz, wmGizmoProperty *gz_prop,
+ const void *value_p)
+{
+ const float *value = value_p;
+ BLI_assert(gz_prop->type->array_length == 1);
+ UNUSED_VARS_NDEBUG(gz_prop);
+
+ struct ValueOpRedoGroup *igzgroup = gz->parent_gzgroup->customdata;
+ wmOperator *op = igzgroup->state.op;
+ RNA_property_float_set(op->ptr, op->type->prop, *value);
+ gizmo_op_redo_exec(igzgroup);
+}
+
+static void WIDGETGROUP_value_operator_redo_modal_from_setup(
+ const bContext *C, wmGizmoGroup *gzgroup)
+{
+ /* Start off dragging. */
+ wmWindow *win = CTX_wm_window(C);
+ wmGizmo *gz = gzgroup->gizmos.first;
+ wmGizmoMap *gzmap = gzgroup->parent_gzmap;
+ WM_gizmo_modal_set_from_setup(
+ gzmap, (bContext *)C, gz, 0, win->eventstate);
+}
+
+static void WIDGETGROUP_value_operator_redo_setup(const bContext *C, wmGizmoGroup *gzgroup)
+{
+ struct ValueOpRedoGroup *igzgroup = MEM_mallocN(sizeof(struct ValueOpRedoGroup), __func__);
+
+ igzgroup->gizmo = WM_gizmo_new("GIZMO_GT_value_2d", gzgroup, NULL);
+ wmGizmo *gz = igzgroup->gizmo;
+
+ igzgroup->state.context = C;
+ igzgroup->state.op = WM_operator_last_redo(C);
+
+ gzgroup->customdata = igzgroup;
+
+ UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, gz->color);
+ UI_GetThemeColor3fv(TH_GIZMO_HI, gz->color_hi);
+
+ WM_gizmo_target_property_def_func(
+ gz, "offset",
+ &(const struct wmGizmoPropertyFnParams) {
+ .value_get_fn = gizmo_value_operator_redo_value_get,
+ .value_set_fn = gizmo_value_operator_redo_value_set,
+ .range_get_fn = NULL,
+ .user_data = igzgroup,
+ });
+
+ /* Become modal as soon as it's started. */
+ WIDGETGROUP_value_operator_redo_modal_from_setup(C, gzgroup);
+}
+
+static void WIDGETGROUP_value_operator_redo_refresh(const bContext *UNUSED(C), wmGizmoGroup *gzgroup)
+{
+ struct ValueOpRedoGroup *igzgroup = gzgroup->customdata;
+ wmGizmo *gz = igzgroup->gizmo;
+ wmOperator *op = WM_operator_last_redo((bContext *)igzgroup->state.context);
+ wmGizmoMap *gzmap = gzgroup->parent_gzmap;
+
+ /* FIXME */
+ extern struct wmGizmo *wm_gizmomap_modal_get(struct wmGizmoMap *gzmap);
+ if ((op != igzgroup->state.op) ||
+ (wm_gizmomap_modal_get(gzmap) != gz))
+ {
+ WM_gizmo_group_type_unlink_delayed_ptr(gzgroup->type);
+ }
+}
+
+static void WM_GGT_value_operator_redo(wmGizmoGroupType *gzgt)
+{
+ gzgt->name = "Value Operator Redo";
+ gzgt->idname = "WM_GGT_value_operator_redo";
+
+ /* FIXME, allow multiple. */
+ gzgt->flag = WM_GIZMOGROUPTYPE_3D | WM_GIZMOGROUPTYPE_TOOL_INIT;
+
+ gzgt->gzmap_params.spaceid = SPACE_VIEW3D;
+ gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
+
+
+ gzgt->setup = WIDGETGROUP_value_operator_redo_setup;
+ gzgt->refresh = WIDGETGROUP_value_operator_redo_refresh;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Public API
+ * \{ */
+
+void ED_gizmogrouptypes_value_2d(void)
+{
+ WM_gizmogrouptype_append(WM_GGT_value_operator_redo);
+}
+
+/** \} */
diff --git a/source/blender/editors/gizmo_library/gizmo_library_intern.h b/source/blender/editors/gizmo_library/gizmo_library_intern.h
index f5584d86847..db88a52f087 100644
--- a/source/blender/editors/gizmo_library/gizmo_library_intern.h
+++ b/source/blender/editors/gizmo_library/gizmo_library_intern.h
@@ -24,7 +24,7 @@
*/
/** \file gizmo_library_intern.h
- * \ingroup wm
+ * \ingroup edgizmolib
*/
#ifndef __GIZMO_LIBRARY_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 ab92905192b..4eeddb92664 100644
--- a/source/blender/editors/gizmo_library/gizmo_library_presets.c
+++ b/source/blender/editors/gizmo_library/gizmo_library_presets.c
@@ -19,7 +19,7 @@
*/
/** \file blender/editors/gizmo_library/gizmo_library_presets.c
- * \ingroup wm
+ * \ingroup edgizmolib
*
* \name Gizmo Lib Presets
*
@@ -127,7 +127,7 @@ void ED_gizmo_draw_preset_circle(
}
void ED_gizmo_draw_preset_facemap(
- const bContext *C, const struct wmGizmo *gz, struct Scene *scene, Object *ob, const int facemap, int select_id)
+ const bContext *C, const struct wmGizmo *gz, Object *ob, const int facemap, int select_id)
{
const bool is_select = (select_id != -1);
const bool is_highlight = is_select && (gz->state & WM_GIZMO_STATE_HIGHLIGHT) != 0;
@@ -141,7 +141,7 @@ void ED_gizmo_draw_preset_facemap(
GPU_matrix_push();
GPU_matrix_mul(ob->obmat);
- ED_draw_object_facemap(CTX_data_depsgraph(C), scene, ob, color, facemap);
+ ED_draw_object_facemap(CTX_data_depsgraph(C), ob, color, facemap);
GPU_matrix_pop();
if (is_select) {
diff --git a/source/blender/editors/gizmo_library/gizmo_library_utils.c b/source/blender/editors/gizmo_library/gizmo_library_utils.c
index d20aa91d432..25364652785 100644
--- a/source/blender/editors/gizmo_library/gizmo_library_utils.c
+++ b/source/blender/editors/gizmo_library/gizmo_library_utils.c
@@ -24,7 +24,7 @@
*/
/** \file gizmo_library_utils.c
- * \ingroup wm
+ * \ingroup edgizmolib
*
* \name Gizmo Library Utilities
*
@@ -126,7 +126,7 @@ void gizmo_property_data_update(
if (constrained) {
if ((data->flag & GIZMO_CUSTOM_RANGE_SET) == 0) {
float range[2];
- if (WM_gizmo_target_property_range_get(gz, gz_prop, range)) {
+ if (WM_gizmo_target_property_float_range_get(gz, gz_prop, range)) {
data->range = range[1] - range[0];
data->min = range[0];
}
@@ -186,27 +186,18 @@ bool gizmo_window_project_2d(
/* rotate mouse in relation to the center and relocate it */
if (gz->parent_gzgroup->type->flag & WM_GIZMOGROUPTYPE_3D) {
/* For 3d views, transform 2D mouse pos onto plane. */
- View3D *v3d = CTX_wm_view3d(C);
ARegion *ar = CTX_wm_region(C);
- float plane[4];
-
+ float plane[4], co[3];
plane_from_point_normal_v3(plane, mat[3], mat[2]);
-
- float ray_origin[3], ray_direction[3];
-
- if (ED_view3d_win_to_ray(CTX_data_depsgraph(C), ar, v3d, mval, ray_origin, ray_direction, false)) {
- float lambda;
- if (isect_ray_plane_v3(ray_origin, ray_direction, plane, &lambda, true)) {
- float co[3];
- madd_v3_v3v3fl(co, ray_origin, ray_direction, lambda);
- float imat[4][4];
- invert_m4_m4(imat, mat);
- mul_m4_v3(imat, co);
- r_co[0] = co[(axis + 1) % 3];
- r_co[1] = co[(axis + 2) % 3];
- return true;
- }
+ bool clip_ray = ((RegionView3D *)ar->regiondata)->is_persp;
+ if (ED_view3d_win_to_3d_on_plane(ar, plane, mval, clip_ray, co)) {
+ float imat[4][4];
+ invert_m4_m4(imat, mat);
+ mul_m4_v3(imat, co);
+ r_co[0] = co[(axis + 1) % 3];
+ r_co[1] = co[(axis + 2) % 3];
+ return true;
}
return false;
}
diff --git a/source/blender/editors/gizmo_library/gizmo_types/arrow2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/arrow2d_gizmo.c
index 953e763a33c..fb3583b7b27 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/arrow2d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/arrow2d_gizmo.c
@@ -24,7 +24,7 @@
*/
/** \file arrow2d_gizmo.c
- * \ingroup wm
+ * \ingroup edgizmolib
*
* \name 2D Arrow Gizmo
*
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 d72dbe0f54d..4e41f95a063 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c
@@ -24,7 +24,7 @@
*/
/** \file arrow3d_gizmo.c
- * \ingroup wm
+ * \ingroup edgizmolib
*
* \name Arrow Gizmo
*
@@ -234,9 +234,11 @@ static int gizmo_arrow_modal(
bContext *C, wmGizmo *gz, const wmEvent *event,
eWM_GizmoFlagTweak tweak_flag)
{
+ if (event->type != MOUSEMOVE) {
+ return OPERATOR_RUNNING_MODAL;
+ }
ArrowGizmo3D *arrow = (ArrowGizmo3D *)gz;
GizmoInteraction *inter = gz->interaction_data;
- View3D *v3d = CTX_wm_view3d(C);
ARegion *ar = CTX_wm_region(C);
RegionView3D *rv3d = ar->regiondata;
@@ -261,31 +263,28 @@ static int gizmo_arrow_modal(
int ok = 0;
for (int j = 0; j < 2; j++) {
- if (ED_view3d_win_to_ray(
- CTX_data_depsgraph(C),
- ar, v3d, proj[j].mval,
- proj[j].ray_origin, proj[j].ray_direction, false))
- {
- /* Force Y axis if we're view aligned */
- if (j == 0) {
- if (RAD2DEGF(acosf(dot_v3v3(proj[j].ray_direction, arrow->gizmo.matrix_basis[2]))) < 5.0f) {
- normalize_v3_v3(arrow_no, rv3d->viewinv[1]);
- }
+ ED_view3d_win_to_ray(
+ ar, proj[j].mval,
+ proj[j].ray_origin, proj[j].ray_direction);
+ /* Force Y axis if we're view aligned */
+ if (j == 0) {
+ if (RAD2DEGF(acosf(dot_v3v3(proj[j].ray_direction, arrow->gizmo.matrix_basis[2]))) < 5.0f) {
+ normalize_v3_v3(arrow_no, rv3d->viewinv[1]);
}
+ }
- float arrow_no_proj[3];
- project_plane_v3_v3v3(arrow_no_proj, arrow_no, proj[j].ray_direction);
+ float arrow_no_proj[3];
+ project_plane_v3_v3v3(arrow_no_proj, arrow_no, proj[j].ray_direction);
- normalize_v3(arrow_no_proj);
+ normalize_v3(arrow_no_proj);
- float plane[4];
- plane_from_point_normal_v3(plane, proj[j].ray_origin, arrow_no_proj);
+ float plane[4];
+ plane_from_point_normal_v3(plane, proj[j].ray_origin, arrow_no_proj);
- float lambda;
- if (isect_ray_plane_v3(arrow_co, arrow_no, plane, &lambda, false)) {
- madd_v3_v3v3fl(proj[j].location, arrow_co, arrow_no, lambda);
- ok++;
- }
+ float lambda;
+ if (isect_ray_plane_v3(arrow_co, arrow_no, plane, &lambda, false)) {
+ madd_v3_v3v3fl(proj[j].location, arrow_co, arrow_no, lambda);
+ ok++;
}
}
diff --git a/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c
index 0c67e8c606d..6bff72d75cd 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/blank3d_gizmo.c
@@ -24,7 +24,7 @@
*/
/** \file blank3d_gizmo.c
- * \ingroup wm
+ * \ingroup edgizmolib
*
* \name Blank Gizmo
*
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 dfc0dcd791c..7b625364905 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c
@@ -19,7 +19,7 @@
*/
/** \file button2d_gizmo.c
- * \ingroup wm
+ * \ingroup edgizmolib
*
* \name Button Gizmo
*
@@ -133,8 +133,9 @@ static void button2d_draw_intern(
bool is_3d = (gz->parent_gzgroup->type->flag & WM_GIZMOGROUPTYPE_3D) != 0;
-
- if (draw_options & ED_GIZMO_BUTTON_SHOW_HELPLINE) {
+ if ((select == false) &&
+ (draw_options & ED_GIZMO_BUTTON_SHOW_HELPLINE))
+ {
float matrix_final_no_offset[4][4];
WM_gizmo_calc_matrix_final_no_offset(gz, matrix_final_no_offset);
uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
@@ -191,22 +192,29 @@ static void button2d_draw_intern(
GPU_polygon_smooth(true);
}
else if (button->icon != ICON_NONE) {
- button2d_geom_draw_backdrop(gz, color, select);
- float size[2];
+ if (draw_options & ED_GIZMO_BUTTON_SHOW_BACKDROP) {
+ button2d_geom_draw_backdrop(gz, color, select);
+ }
+
+ float pos[2];
if (is_3d) {
const float fac = 2.0f;
GPU_matrix_translate_2f(-(fac / 2), -(fac / 2));
- GPU_matrix_scale_2f(fac / (ICON_DEFAULT_WIDTH * UI_DPI_FAC), fac / (ICON_DEFAULT_HEIGHT * UI_DPI_FAC));
- size[0] = 1.0f;
- size[1] = 1.0f;
+ GPU_matrix_scale_2f(fac / (ICON_DEFAULT_WIDTH * UI_DPI_FAC), fac / (ICON_DEFAULT_HEIGHT * UI_DPI_FAC));
+ pos[0] = 1.0f;
+ pos[1] = 1.0f;
}
else {
- size[0] = gz->matrix_basis[3][0] - (ICON_DEFAULT_WIDTH / 2.0) * UI_DPI_FAC;
- size[1] = gz->matrix_basis[3][1] - (ICON_DEFAULT_HEIGHT / 2.0) * UI_DPI_FAC;
+ pos[0] = gz->matrix_basis[3][0] - (ICON_DEFAULT_WIDTH / 2.0) * UI_DPI_FAC;
+ pos[1] = gz->matrix_basis[3][1] - (ICON_DEFAULT_HEIGHT / 2.0) * UI_DPI_FAC;
GPU_matrix_pop();
need_to_pop = false;
}
- UI_icon_draw(size[0], size[1], button->icon);
+
+ float alpha = (highlight) ? 1.0f : 0.8f;
+ GPU_polygon_smooth(false);
+ UI_icon_draw_alpha(pos[0], pos[1], button->icon, alpha);
+ GPU_polygon_smooth(true);
}
GPU_blend(false);
}
@@ -298,6 +306,7 @@ static void GIZMO_GT_button_2d(wmGizmoType *gzt)
/* rna */
static EnumPropertyItem rna_enum_draw_options[] = {
{ED_GIZMO_BUTTON_SHOW_OUTLINE, "OUTLINE", 0, "Outline", ""},
+ {ED_GIZMO_BUTTON_SHOW_BACKDROP, "BACKDROP", 0, "Backdrop", ""},
{ED_GIZMO_BUTTON_SHOW_HELPLINE, "HELPLINE", 0, "Help Line", ""},
{0, NULL, 0, NULL, NULL}
};
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 da84c8217e7..04015ee9f1e 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c
@@ -24,7 +24,7 @@
*/
/** \file cage2d_gizmo.c
- * \ingroup wm
+ * \ingroup edgizmolib
*
* \name Cage Gizmo
*
@@ -413,7 +413,7 @@ static void cage2d_draw_box_interaction(
if (is_solid) {
BLI_assert(ELEM(prim_type, GPU_PRIM_TRI_FAN));
immBegin(prim_type, verts_len);
- immAttrib3f(attr_id.col, 0.0f, 0.0f, 0.0f);
+ immAttr3f(attr_id.col, 0.0f, 0.0f, 0.0f);
for (uint i = 0; i < verts_len; i++) {
immVertex2fv(attr_id.pos, verts[i]);
}
@@ -424,7 +424,7 @@ static void cage2d_draw_box_interaction(
GPU_line_width(line_width + 3.0f);
immBegin(prim_type, verts_len);
- immAttrib3f(attr_id.col, 0.0f, 0.0f, 0.0f);
+ immAttr3f(attr_id.col, 0.0f, 0.0f, 0.0f);
for (uint i = 0; i < verts_len; i++) {
immVertex2fv(attr_id.pos, verts[i]);
}
@@ -433,7 +433,7 @@ static void cage2d_draw_box_interaction(
GPU_line_width(line_width);
immBegin(prim_type, verts_len);
- immAttrib3fv(attr_id.col, color);
+ immAttr3fv(attr_id.col, color);
for (uint i = 0; i < verts_len; i++) {
immVertex2fv(attr_id.pos, verts[i]);
}
@@ -849,7 +849,10 @@ static int gizmo_cage2d_modal(
bContext *C, wmGizmo *gz, const wmEvent *event,
eWM_GizmoFlagTweak UNUSED(tweak_flag))
{
- /* For transform logic to be managable we operate in -0.5..0.5 2D space,
+ if (event->type != MOUSEMOVE) {
+ return OPERATOR_RUNNING_MODAL;
+ }
+ /* For transform logic to be manageable we operate in -0.5..0.5 2D space,
* no matter the size of the rectangle, mouse coorts are scaled to unit space.
* The mouse coords have been projected into the matrix so we don't need to worry about axis alignment.
*
@@ -1071,7 +1074,7 @@ static void GIZMO_GT_cage_2d(wmGizmoType *gzt)
{0, NULL, 0, NULL, NULL}
};
static EnumPropertyItem rna_enum_transform[] = {
- {ED_GIZMO_CAGE2D_XFORM_FLAG_TRANSLATE, "TRANSLATE", 0, "Translate", ""},
+ {ED_GIZMO_CAGE2D_XFORM_FLAG_TRANSLATE, "TRANSLATE", 0, "Move", ""},
{ED_GIZMO_CAGE2D_XFORM_FLAG_ROTATE, "ROTATE", 0, "Rotate", ""},
{ED_GIZMO_CAGE2D_XFORM_FLAG_SCALE, "SCALE", 0, "Scale", ""},
{ED_GIZMO_CAGE2D_XFORM_FLAG_SCALE_UNIFORM, "SCALE_UNIFORM", 0, "Scale Uniform", ""},
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 79339b63777..3bbe13362d0 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/cage3d_gizmo.c
@@ -24,7 +24,7 @@
*/
/** \file cage3d_gizmo.c
- * \ingroup wm
+ * \ingroup edgizmolib
*
* \name Cage Gizmo
*
@@ -477,7 +477,10 @@ static int gizmo_cage3d_modal(
bContext *C, wmGizmo *gz, const wmEvent *event,
eWM_GizmoFlagTweak UNUSED(tweak_flag))
{
- /* For transform logic to be managable we operate in -0.5..0.5 2D space,
+ if (event->type != MOUSEMOVE) {
+ return OPERATOR_RUNNING_MODAL;
+ }
+ /* For transform logic to be manageable we operate in -0.5..0.5 2D space,
* no matter the size of the rectangle, mouse coorts are scaled to unit space.
* The mouse coords have been projected into the matrix so we don't need to worry about axis alignment.
*
@@ -664,7 +667,7 @@ static void GIZMO_GT_cage_3d(wmGizmoType *gzt)
{0, NULL, 0, NULL, NULL}
};
static EnumPropertyItem rna_enum_transform[] = {
- {ED_GIZMO_CAGE2D_XFORM_FLAG_TRANSLATE, "TRANSLATE", 0, "Translate", ""},
+ {ED_GIZMO_CAGE2D_XFORM_FLAG_TRANSLATE, "TRANSLATE", 0, "Move", ""},
{ED_GIZMO_CAGE2D_XFORM_FLAG_SCALE, "SCALE", 0, "Scale", ""},
{ED_GIZMO_CAGE2D_XFORM_FLAG_SCALE_UNIFORM, "SCALE_UNIFORM", 0, "Scale Uniform", ""},
{0, NULL, 0, NULL, NULL}
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 7a3dc2d5710..c391ec812c7 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c
@@ -24,7 +24,7 @@
*/
/** \file dial3d_gizmo.c
- * \ingroup wm
+ * \ingroup edgizmolib
*
* \name Dial Gizmo
*
@@ -61,31 +61,34 @@
#include "ED_screen.h"
#include "ED_view3d.h"
+#include "ED_transform.h"
#include "ED_gizmo_library.h"
/* own includes */
#include "../gizmo_geometry.h"
#include "../gizmo_library_intern.h"
-/* to use custom dials exported to geom_dial_gizmo.c */
+/* To use custom dials exported to geom_dial_gizmo.c */
// #define USE_GIZMO_CUSTOM_DIAL
-static int gizmo_dial_modal(
- bContext *C, wmGizmo *gz, const wmEvent *event,
- eWM_GizmoFlagTweak tweak_flag);
-
typedef struct DialInteraction {
- float init_mval[2];
-
- /* only for when using properties */
- float init_prop_angle;
+ struct {
+ float mval[2];
+ /* Only for when using properties. */
+ float prop_angle;
+ } init;
+ struct {
+ /* Cache the last angle to detect rotations bigger than -/+ PI. */
+ eWM_GizmoFlagTweak tweak_flag;
+ float angle;
+ } prev;
- /* cache the last angle to detect rotations bigger than -/+ PI */
- float last_angle;
- /* number of full rotations */
+ /* Number of full rotations. */
int rotations;
+ bool has_drag;
+ float angle_increment;
- /* final output values, used for drawing */
+ /* Final output values, used for drawing. */
struct {
float angle_ofs;
float angle_delta;
@@ -98,42 +101,31 @@ typedef struct DialInteraction {
/* Could make option, negative to clip more (don't show when view aligned). */
#define DIAL_CLIP_BIAS 0.02
-/**
- * We can't use this for the #wmGizmoType.matrix_basis_get callback, it conflicts with depth picking.
- */
-static void dial_calc_matrix(const wmGizmo *gz, float mat[4][4])
-{
- float rot[3][3];
- const float up[3] = {0.0f, 0.0f, 1.0f};
-
- rotation_between_vecs_to_mat3(rot, up, gz->matrix_basis[2]);
- copy_m4_m3(mat, rot);
- copy_v3_v3(mat[3], gz->matrix_basis[3]);
-}
-
/* -------------------------------------------------------------------- */
static void dial_geom_draw(
- const wmGizmo *gz, const float color[4], const bool select,
- float axis_modal_mat[4][4], float clip_plane[4])
+ const float color[4], const float line_width,
+ const bool select,
+ const float axis_modal_mat[4][4], const float clip_plane[4],
+ const float arc_partial_angle, const float arc_inner_factor,
+ const int draw_options)
{
#ifdef USE_GIZMO_CUSTOM_DIAL
- UNUSED_VARS(dial, col, axis_modal_mat, clip_plane);
- wm_gizmo_geometryinfo_draw(&wm_gizmo_geom_data_dial, select);
+ UNUSED_VARS(gz, axis_modal_mat, clip_plane);
+ wm_gizmo_geometryinfo_draw(&wm_gizmo_geom_data_dial, select, color);
#else
- const int draw_options = RNA_enum_get(gz->ptr, "draw_options");
const bool filled = (draw_options & ED_GIZMO_DIAL_DRAW_FLAG_FILL) != 0;
- GPU_line_width(gz->line_width);
+ GPU_line_width(line_width);
GPUVertFormat *format = immVertexFormat();
uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
if (clip_plane) {
immBindBuiltinProgram(GPU_SHADER_3D_CLIPPED_UNIFORM_COLOR);
- float clip_plane_f[4] = {clip_plane[0], clip_plane[1], clip_plane[2], clip_plane[3]};
- immUniform4fv("ClipPlane", clip_plane_f);
+ immUniform4fv("ClipPlane", clip_plane);
immUniformMatrix4fv("ModelMatrix", axis_modal_mat);
+ glEnable(GL_CLIP_DISTANCE0);
}
else {
immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
@@ -145,11 +137,31 @@ static void dial_geom_draw(
imm_draw_circle_fill_2d(pos, 0, 0, 1.0, DIAL_RESOLUTION);
}
else {
- imm_draw_circle_wire_2d(pos, 0, 0, 1.0, DIAL_RESOLUTION);
+ if (arc_partial_angle == 0.0f) {
+ imm_draw_circle_wire_2d(pos, 0, 0, 1.0, DIAL_RESOLUTION);
+ if (arc_inner_factor != 0.0f) {
+ imm_draw_circle_wire_2d(pos, 0, 0, arc_inner_factor, DIAL_RESOLUTION);
+ }
+ }
+ else {
+ float arc_partial_deg = RAD2DEGF((M_PI * 2) - arc_partial_angle);
+ imm_draw_circle_partial_wire_2d(
+ pos, 0, 0, 1.0, DIAL_RESOLUTION,
+ -arc_partial_deg / 2, arc_partial_deg);
+#if 0
+ if (arc_inner_factor != 0.0f) {
+ BLI_assert(0);
+ }
+#endif
+ }
}
immUnbindProgram();
+ if (clip_plane) {
+ glDisable(GL_CLIP_DISTANCE0);
+ }
+
UNUSED_VARS(select);
#endif
}
@@ -157,10 +169,9 @@ static void dial_geom_draw(
/**
* Draws a line from (0, 0, 0) to \a co_outer, at \a angle.
*/
-static void dial_ghostarc_draw_helpline(const float angle, const float co_outer[3], const float color[4])
+static void dial_ghostarc_draw_helpline(
+ const float angle, const float co_outer[3], const float color[4])
{
- GPU_line_width(1.0f);
-
GPU_matrix_push();
GPU_matrix_rotate_3f(RAD2DEGF(angle), 0.0f, 0.0f, -1.0f);
@@ -171,7 +182,7 @@ static void dial_ghostarc_draw_helpline(const float angle, const float co_outer[
immUniformColor4fv(color);
immBegin(GPU_PRIM_LINE_STRIP, 2);
- immVertex3f(pos, 0.0f, 0.0f, 0.0f);
+ immVertex3f(pos, 0.0f, 0, 0.0f);
immVertex3fv(pos, co_outer);
immEnd();
@@ -180,25 +191,63 @@ static void dial_ghostarc_draw_helpline(const float angle, const float co_outer[
GPU_matrix_pop();
}
-static void dial_ghostarc_draw(
- const wmGizmo *gz, const float angle_ofs, const float angle_delta, const float color[4])
+/**
+ * Draws segments to indicate the position of each increment.
+ */
+static void dial_ghostarc_draw_incremental_angle(
+ const float incremental_angle, const float offset)
{
- const float width_inner = DIAL_WIDTH - gz->line_width * 0.5f / U.gizmo_size;
+ const int tot_incr = (2 * M_PI) / incremental_angle;
+ GPU_line_width(1.0f);
+
+ uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+ immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
+ immUniformColor3f(1.0f, 1.0f, 1.0f);
+ immBegin(GPU_PRIM_LINES, tot_incr * 2);
+
+ float v[3] = { 0 };
+ for (int i = 0; i < tot_incr; i++) {
+ v[0] = sinf(offset + incremental_angle * i);
+ v[1] = cosf(offset + incremental_angle * i);
+
+ mul_v2_fl(v, DIAL_WIDTH * 1.1f);
+ immVertex3fv(pos, v);
+
+ mul_v2_fl(v, 1.1f);
+ immVertex3fv(pos, v);
+ }
+ immEnd();
+ immUnbindProgram();
+}
+
+static void dial_ghostarc_draw(
+ const float angle_ofs, const float angle_delta,
+ const float arc_inner_factor, const float color[4])
+{
+ const float width_inner = DIAL_WIDTH;
GPUVertFormat *format = immVertexFormat();
uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
+
+ if (arc_inner_factor != 0.0) {
+ float color_dark[4] = {0};
+ color_dark[3] = color[3] / 2;
+ immUniformColor4fv(color_dark);
+ imm_draw_disk_partial_fill_2d(
+ pos, 0, 0, arc_inner_factor, width_inner, DIAL_RESOLUTION, RAD2DEGF(angle_ofs), RAD2DEGF(M_PI * 2));
+ }
+
immUniformColor4fv(color);
imm_draw_disk_partial_fill_2d(
- pos, 0, 0, 0.0, width_inner, DIAL_RESOLUTION, RAD2DEGF(angle_ofs), RAD2DEGF(angle_delta));
+ pos, 0, 0, arc_inner_factor, width_inner, DIAL_RESOLUTION, RAD2DEGF(angle_ofs), RAD2DEGF(angle_delta));
immUnbindProgram();
}
static void dial_ghostarc_get_angles(
- struct Depsgraph *depsgraph,
const wmGizmo *gz,
const wmEvent *event,
- const ARegion *ar, const View3D *v3d,
+ const ARegion *ar,
float mat[4][4], const float co_outer[3],
float *r_start, float *r_delta)
{
@@ -206,7 +255,7 @@ static void dial_ghostarc_get_angles(
const RegionView3D *rv3d = ar->regiondata;
const float mval[2] = {event->x - ar->winrct.xmin, event->y - ar->winrct.ymin};
- /* we might need to invert the direction of the angles */
+ /* We might need to invert the direction of the angles. */
float view_vec[3], axis_vec[3];
ED_view3d_global_to_vector(rv3d, gz->matrix_basis[3], view_vec);
normalize_v3_v3(axis_vec, gz->matrix_basis[2]);
@@ -218,53 +267,49 @@ static void dial_ghostarc_get_angles(
float proj_mval_new_rel[3];
float proj_mval_init_rel[3];
float dial_plane[4];
- float ray_co[3], ray_no[3];
- float ray_lambda;
plane_from_point_normal_v3(dial_plane, gz->matrix_basis[3], axis_vec);
- if (!ED_view3d_win_to_ray(depsgraph, ar, v3d, inter->init_mval, ray_co, ray_no, false) ||
- !isect_ray_plane_v3(ray_co, ray_no, dial_plane, &ray_lambda, false))
- {
+ if (!ED_view3d_win_to_3d_on_plane(ar, dial_plane, inter->init.mval, false, proj_mval_init_rel)) {
goto fail;
}
- madd_v3_v3v3fl(proj_mval_init_rel, ray_co, ray_no, ray_lambda);
sub_v3_v3(proj_mval_init_rel, gz->matrix_basis[3]);
- if (!ED_view3d_win_to_ray(depsgraph, ar, v3d, mval, ray_co, ray_no, false) ||
- !isect_ray_plane_v3(ray_co, ray_no, dial_plane, &ray_lambda, false))
- {
+ if (!ED_view3d_win_to_3d_on_plane(ar, dial_plane, mval, false, proj_mval_new_rel)) {
goto fail;
}
- madd_v3_v3v3fl(proj_mval_new_rel, ray_co, ray_no, ray_lambda);
sub_v3_v3(proj_mval_new_rel, gz->matrix_basis[3]);
const int draw_options = RNA_enum_get(gz->ptr, "draw_options");
- /* Start direction from mouse or set by user */
+ /* Start direction from mouse or set by user. */
const float *proj_init_rel =
(draw_options & ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_START_Y) ?
gz->matrix_basis[1] : proj_mval_init_rel;
- /* return angles */
+ /* Return angles. */
const float start = angle_wrap_rad(angle_signed_on_axis_v3v3_v3(proj_outer_rel, proj_init_rel, axis_vec));
const float delta = angle_wrap_rad(angle_signed_on_axis_v3v3_v3(proj_mval_init_rel, proj_mval_new_rel, axis_vec));
/* Change of sign, we passed the 180 degree threshold. This means we need to add a turn
* to distinguish between transition from 0 to -1 and -PI to +PI, use comparison with PI/2.
- * Logic taken from BLI_dial_angle */
- if ((delta * inter->last_angle < 0.0f) &&
- (fabsf(inter->last_angle) > (float)M_PI_2))
+ * Logic taken from #BLI_dial_angle */
+ if ((delta * inter->prev.angle < 0.0f) &&
+ (fabsf(inter->prev.angle) > (float)M_PI_2))
{
- if (inter->last_angle < 0.0f)
+ if (inter->prev.angle < 0.0f) {
inter->rotations--;
- else
+ }
+ else {
inter->rotations++;
+ }
}
- inter->last_angle = delta;
+ inter->prev.angle = delta;
+ const bool wrap_angle = RNA_boolean_get(gz->ptr, "wrap_angle");
+ const double delta_final = (double)delta + ((2 * M_PI) * (double)inter->rotations);
*r_start = start;
- *r_delta = fmod(delta + 2.0f * (float)M_PI * inter->rotations, 2 * (float)M_PI);
+ *r_delta = (float)(wrap_angle ? fmod(delta_final, 2 * M_PI) : delta_final);
return;
/* If we can't project (unlikely). */
@@ -273,69 +318,74 @@ fail:
*r_delta = 0.0;
}
+static void dial_ghostarc_draw_with_helplines(
+ const float angle_ofs, const float angle_delta,
+ const float arc_inner_factor, const float color_helpline[4], const int draw_options)
+{
+ /* Coordinate at which the arc drawing will be started. */
+ const float co_outer[4] = {0.0f, DIAL_WIDTH, 0.0f};
+ dial_ghostarc_draw(angle_ofs, angle_delta, arc_inner_factor, (const float[4]){0.8f, 0.8f, 0.8f, 0.4f});
+ GPU_line_width(1.0f);
+ dial_ghostarc_draw_helpline(angle_ofs, co_outer, color_helpline);
+ if (draw_options & ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_VALUE) {
+ GPU_line_width(3.0f);
+ }
+ dial_ghostarc_draw_helpline(angle_ofs + angle_delta, co_outer, color_helpline);
+}
+
static void dial_draw_intern(
const bContext *C, wmGizmo *gz,
const bool select, const bool highlight, float clip_plane[4])
{
- float matrix_basis_adjust[4][4];
float matrix_final[4][4];
float color[4];
+ (void)C;
BLI_assert(CTX_wm_area(C)->spacetype == SPACE_VIEW3D);
gizmo_color_get(gz, highlight, color);
- dial_calc_matrix(gz, matrix_basis_adjust);
+ WM_gizmo_calc_matrix_final(gz, matrix_final);
- WM_gizmo_calc_matrix_final_params(
- gz, &((struct WM_GizmoMatrixParams) {
- .matrix_basis = (void *)matrix_basis_adjust,
- }), matrix_final);
+ const float arc_partial_angle = RNA_float_get(gz->ptr, "arc_partial_angle");
+ const float arc_inner_factor = RNA_float_get(gz->ptr, "arc_inner_factor");
+ int draw_options = RNA_enum_get(gz->ptr, "draw_options");
+ float angle_ofs = 0.0f;
+ float angle_delta = 0.0f;
+ float angle_increment = 0.0f;
- GPU_matrix_push();
- GPU_matrix_mul(matrix_final);
+ if (select) {
+ draw_options &= ~ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_VALUE;
+ }
- /* draw rotation indicator arc first */
- if ((gz->flag & WM_GIZMO_DRAW_VALUE) &&
- (gz->state & WM_GIZMO_STATE_MODAL))
+ if (draw_options & ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_VALUE &&
+ (gz->flag & WM_GIZMO_DRAW_VALUE))
{
- const float co_outer[4] = {0.0f, DIAL_WIDTH, 0.0f}; /* coordinate at which the arc drawing will be started */
-
DialInteraction *inter = gz->interaction_data;
-
- /* XXX, View3D rotation gizmo doesn't call modal. */
- if (!WM_gizmo_target_property_is_valid_any(gz)) {
- wmWindow *win = CTX_wm_window(C);
- gizmo_dial_modal((bContext *)C, gz, win->eventstate, 0);
+ if (inter) {
+ angle_ofs = inter->output.angle_ofs;
+ angle_delta = inter->output.angle_delta;
+ angle_increment = inter->angle_increment;
}
-
- float angle_ofs = inter->output.angle_ofs;
- float angle_delta = inter->output.angle_delta;
-
- /* draw! */
- for (int i = 0; i < 2; i++) {
- GPU_polygon_smooth(false);
- dial_ghostarc_draw(gz, angle_ofs, angle_delta, (const float[4]){0.8f, 0.8f, 0.8f, 0.4f});
- GPU_polygon_smooth(true);
-
- dial_ghostarc_draw_helpline(angle_ofs, co_outer, color); /* starting position */
- dial_ghostarc_draw_helpline(angle_ofs + angle_delta, co_outer, color); /* starting position + current value */
-
- if (i == 0) {
- const int draw_options = RNA_enum_get(gz->ptr, "draw_options");
- if ((draw_options & ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_MIRROR) == 0) {
- break;
- }
+ else {
+ wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
+ if (WM_gizmo_target_property_is_valid(gz_prop)) {
+ angle_delta = WM_gizmo_target_property_float_get(gz, gz_prop);
}
-
- angle_ofs += (float)M_PI;
}
}
- /* draw actual dial gizmo */
- dial_geom_draw(gz, color, select, matrix_basis_adjust, clip_plane);
-
- GPU_matrix_pop();
+ ED_gizmotypes_dial_3d_draw_util(
+ gz->matrix_basis, matrix_final, gz->line_width, color,
+ &(struct Dial3dParams){
+ .draw_options = draw_options,
+ .angle_ofs = angle_ofs,
+ .angle_delta = angle_delta,
+ .angle_increment = angle_increment,
+ .arc_partial_angle = arc_partial_angle,
+ .arc_inner_factor = arc_inner_factor,
+ .clip_plane = clip_plane,
+ });
}
static void gizmo_dial_draw_select(const bContext *C, wmGizmo *gz, int select_id)
@@ -344,15 +394,13 @@ static void gizmo_dial_draw_select(const bContext *C, wmGizmo *gz, int select_id
const int draw_options = RNA_enum_get(gz->ptr, "draw_options");
float *clip_plane = (draw_options & ED_GIZMO_DIAL_DRAW_FLAG_CLIP) ? clip_plane_buf : NULL;
- /* enable clipping if needed */
if (clip_plane) {
ARegion *ar = CTX_wm_region(C);
RegionView3D *rv3d = ar->regiondata;
copy_v3_v3(clip_plane, rv3d->viewinv[2]);
clip_plane[3] = -dot_v3v3(rv3d->viewinv[2], gz->matrix_basis[3]);
- clip_plane[3] += DIAL_CLIP_BIAS * gz->scale_final;
- glEnable(GL_CLIP_DISTANCE0);
+ clip_plane[3] += DIAL_CLIP_BIAS;
}
GPU_select_load_id(select_id);
@@ -371,55 +419,94 @@ static void gizmo_dial_draw(const bContext *C, wmGizmo *gz)
const int draw_options = RNA_enum_get(gz->ptr, "draw_options");
float *clip_plane = (!is_modal && (draw_options & ED_GIZMO_DIAL_DRAW_FLAG_CLIP)) ? clip_plane_buf : NULL;
- /* enable clipping if needed */
if (clip_plane) {
ARegion *ar = CTX_wm_region(C);
RegionView3D *rv3d = ar->regiondata;
copy_v3_v3(clip_plane, rv3d->viewinv[2]);
clip_plane[3] = -dot_v3v3(rv3d->viewinv[2], gz->matrix_basis[3]);
- clip_plane[3] += DIAL_CLIP_BIAS * gz->scale_final;
-
- glEnable(GL_CLIP_DISTANCE0);
+ clip_plane[3] += DIAL_CLIP_BIAS;
}
GPU_blend(true);
dial_draw_intern(C, gz, false, is_highlight, clip_plane);
GPU_blend(false);
-
- if (clip_plane) {
- glDisable(GL_CLIP_DISTANCE0);
- }
}
static int gizmo_dial_modal(
bContext *C, wmGizmo *gz, const wmEvent *event,
- eWM_GizmoFlagTweak UNUSED(tweak_flag))
+ eWM_GizmoFlagTweak tweak_flag)
{
- const float co_outer[4] = {0.0f, DIAL_WIDTH, 0.0f}; /* coordinate at which the arc drawing will be started */
- float angle_ofs, angle_delta;
-
- float matrix[4][4];
-
- dial_calc_matrix(gz, matrix);
+ DialInteraction *inter = gz->interaction_data;
+ if ((event->type != MOUSEMOVE) && (inter->prev.tweak_flag == tweak_flag)) {
+ return OPERATOR_RUNNING_MODAL;
+ }
+ /* Coordinate at which the arc drawing will be started. */
+ const float co_outer[4] = {0.0f, DIAL_WIDTH, 0.0f};
+ float angle_ofs, angle_delta, angle_increment = 0.0f;
dial_ghostarc_get_angles(
- CTX_data_depsgraph(C),
- gz, event, CTX_wm_region(C), CTX_wm_view3d(C), matrix, co_outer, &angle_ofs, &angle_delta);
+ gz, event, CTX_wm_region(C), gz->matrix_basis, co_outer, &angle_ofs, &angle_delta);
- DialInteraction *inter = gz->interaction_data;
+ if (tweak_flag & WM_GIZMO_TWEAK_SNAP) {
+ angle_increment = RNA_float_get(gz->ptr, "incremental_angle");
+ angle_delta = (float)roundf((double)angle_delta / angle_increment) * angle_increment;
+ }
+ if (tweak_flag & WM_GIZMO_TWEAK_PRECISE) {
+ angle_increment *= 0.2f;
+ angle_delta *= 0.2f;
+ }
+ if (angle_delta != 0.0f) {
+ inter->has_drag = true;
+ }
+ inter->angle_increment = angle_increment;
inter->output.angle_delta = angle_delta;
inter->output.angle_ofs = angle_ofs;
- /* set the property for the operator and call its modal function */
+ /* Set the property for the operator and call its modal function. */
wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
if (WM_gizmo_target_property_is_valid(gz_prop)) {
- WM_gizmo_target_property_float_set(C, gz, gz_prop, inter->init_prop_angle + angle_delta);
+ WM_gizmo_target_property_float_set(C, gz, gz_prop, inter->init.prop_angle + angle_delta);
}
+
+ inter->prev.tweak_flag = tweak_flag;
+
return OPERATOR_RUNNING_MODAL;
}
+static void gizmo_dial_exit(bContext *C, wmGizmo *gz, const bool cancel)
+{
+ DialInteraction *inter = gz->interaction_data;
+ bool use_reset_value = false;
+ float reset_value = 0.0f;
+ if (cancel) {
+ /* Set the property for the operator and call its modal function. */
+ wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
+ if (WM_gizmo_target_property_is_valid(gz_prop)) {
+ use_reset_value = true;
+ reset_value = inter->init.prop_angle;
+ }
+ }
+ else {
+ if (inter->has_drag == false) {
+ PropertyRNA *prop = RNA_struct_find_property(gz->ptr, "click_value");
+ if (RNA_property_is_set(gz->ptr, prop)) {
+ use_reset_value = true;
+ reset_value = RNA_property_float_get(gz->ptr, prop);
+ }
+ }
+ }
+
+ if (use_reset_value) {
+ wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
+ if (WM_gizmo_target_property_is_valid(gz_prop)) {
+ WM_gizmo_target_property_float_set(C, gz, gz_prop, reset_value);
+ }
+ }
+
+}
+
static void gizmo_dial_setup(wmGizmo *gz)
{
@@ -434,12 +521,12 @@ static int gizmo_dial_invoke(
{
DialInteraction *inter = MEM_callocN(sizeof(DialInteraction), __func__);
- inter->init_mval[0] = event->mval[0];
- inter->init_mval[1] = event->mval[1];
+ inter->init.mval[0] = event->mval[0];
+ inter->init.mval[1] = event->mval[1];
wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
if (WM_gizmo_target_property_is_valid(gz_prop)) {
- inter->init_prop_angle = WM_gizmo_target_property_float_get(gz, gz_prop);
+ inter->init.prop_angle = WM_gizmo_target_property_float_get(gz, gz_prop);
}
gz->interaction_data = inter;
@@ -452,6 +539,43 @@ static int gizmo_dial_invoke(
*
* \{ */
+void ED_gizmotypes_dial_3d_draw_util(
+ const float matrix_basis[4][4],
+ const float matrix_final[4][4],
+ const float line_width,
+ const float color[4],
+ struct Dial3dParams *params)
+{
+ GPU_matrix_push();
+ GPU_matrix_mul(matrix_final);
+
+ GPU_polygon_smooth(false);
+
+ if ((params->draw_options & ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_VALUE) != 0) {
+ /* Draw rotation indicator arc first. */
+ dial_ghostarc_draw_with_helplines(
+ params->angle_ofs, params->angle_delta,
+ params->arc_inner_factor, color, params->draw_options);
+
+ if ((params->draw_options & ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_MIRROR) != 0) {
+ dial_ghostarc_draw_with_helplines(
+ params->angle_ofs + M_PI, params->angle_delta,
+ params->arc_inner_factor, color, params->draw_options);
+ }
+ }
+
+ if (params->angle_increment) {
+ dial_ghostarc_draw_incremental_angle(params->angle_increment, params->angle_ofs);
+ }
+
+ /* Draw actual dial gizmo. */
+ dial_geom_draw(
+ color, line_width, false, matrix_basis, params->clip_plane,
+ params->arc_partial_angle, params->arc_inner_factor, params->draw_options);
+
+ GPU_matrix_pop();
+}
+
static void GIZMO_GT_dial_3d(wmGizmoType *gzt)
{
/* identifiers */
@@ -463,6 +587,7 @@ static void GIZMO_GT_dial_3d(wmGizmoType *gzt)
gzt->setup = gizmo_dial_setup;
gzt->invoke = gizmo_dial_invoke;
gzt->modal = gizmo_dial_modal;
+ gzt->exit = gizmo_dial_exit;
gzt->struct_size = sizeof(wmGizmo);
@@ -472,9 +597,20 @@ static void GIZMO_GT_dial_3d(wmGizmoType *gzt)
{ED_GIZMO_DIAL_DRAW_FLAG_FILL, "FILL", 0, "Filled", ""},
{ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_MIRROR, "ANGLE_MIRROR", 0, "Angle Mirror", ""},
{ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_START_Y, "ANGLE_START_Y", 0, "Angle Start Y", ""},
+ {ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_VALUE, "ANGLE_VALUE", 0, "Show Angle Value", ""},
{0, NULL, 0, NULL, NULL}
};
RNA_def_enum_flag(gzt->srna, "draw_options", rna_enum_draw_options, 0, "Draw Options", "");
+ RNA_def_boolean(gzt->srna, "wrap_angle", true, "Wrap Angle", "");
+ RNA_def_float_factor(gzt->srna, "arc_inner_factor", 0.0f, 0.0f, 1.0f, "Arc Inner Factor", "", 0.0f, 1.0f);
+ RNA_def_float_factor(gzt->srna, "arc_partial_angle", 0.0f, 0.0f, M_PI * 2, "Show Partial Dial", "", 0.0f, M_PI * 2);
+ RNA_def_float_factor(
+ gzt->srna, "incremental_angle", SNAP_INCREMENTAL_ANGLE, 0.0f,
+ M_PI * 2, "Incremental Angle", "Angle to snap in steps", 0.0f, M_PI * 2);
+ RNA_def_float(
+ gzt->srna, "click_value", 0.0f, -FLT_MAX, FLT_MAX,
+ "Click Value", "Value to use for a single click action",
+ -FLT_MAX, FLT_MAX);
WM_gizmotype_target_property_def(gzt, "offset", PROP_FLOAT, 1);
}
diff --git a/source/blender/editors/gizmo_library/gizmo_types/grab3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c
index ad81bae6157..b91a193e9a0 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/grab3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c
@@ -18,14 +18,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file grab3d_gizmo.c
- * \ingroup wm
+/** \file move3d_gizmo.c
+ * \ingroup edgizmolib
*
- * \name Grab Gizmo
+ * \name Move Gizmo
*
* 3D Gizmo, also works in 2D views.
*
- * \brief Simple gizmo to grab and translate.
+ * \brief Simple gizmo to move and translate.
*
* - `matrix[0]` is derived from Y and Z.
* - `matrix[1]` currently not used.
@@ -57,51 +57,61 @@
#include "ED_screen.h"
#include "ED_view3d.h"
#include "ED_gizmo_library.h"
+#include "ED_transform_snap_object_context.h"
/* own includes */
#include "../gizmo_geometry.h"
#include "../gizmo_library_intern.h"
-typedef struct GrabGizmo3D {
+#define MVAL_MAX_PX_DIST 12.0f
+
+typedef struct MoveGizmo3D {
wmGizmo gizmo;
/* Added to 'matrix_basis' when calculating the matrix. */
float prop_co[3];
-} GrabGizmo3D;
+} MoveGizmo3D;
-static void gizmo_grab_matrix_basis_get(const wmGizmo *gz, float r_matrix[4][4])
+static void gizmo_move_matrix_basis_get(const wmGizmo *gz, float r_matrix[4][4])
{
- GrabGizmo3D *grab = (GrabGizmo3D *)gz;
+ MoveGizmo3D *move = (MoveGizmo3D *)gz;
- copy_m4_m4(r_matrix, grab->gizmo.matrix_basis);
- add_v3_v3(r_matrix[3], grab->prop_co);
+ copy_m4_m4(r_matrix, move->gizmo.matrix_basis);
+ add_v3_v3(r_matrix[3], move->prop_co);
}
-static int gizmo_grab_modal(
+static int gizmo_move_modal(
bContext *C, wmGizmo *gz, const wmEvent *event,
eWM_GizmoFlagTweak tweak_flag);
-typedef struct GrabInteraction {
- float init_mval[2];
+typedef struct MoveInteraction {
+ struct {
+ float mval[2];
+ /* Only for when using properties. */
+ float prop_co[3];
+ float matrix_final[4][4];
+ } init;
+ struct {
+ eWM_GizmoFlagTweak tweak_flag;
+ } prev;
- /* only for when using properties */
- float init_prop_co[3];
+ /* We could have other snap contexts, for now only support 3D view. */
+ struct SnapObjectContext *snap_context_v3d;
- float init_matrix_final[4][4];
-} GrabInteraction;
+} MoveInteraction;
#define DIAL_RESOLUTION 32
/* -------------------------------------------------------------------- */
-static void grab_geom_draw(
+static void move_geom_draw(
const wmGizmo *gz, const float color[4], const bool select, const int draw_options)
{
#ifdef USE_GIZMO_CUSTOM_DIAL
- UNUSED_VARS(grab3d, col, axis_modal_mat);
- wm_gizmo_geometryinfo_draw(&wm_gizmo_geom_data_grab3d, select);
+ UNUSED_VARS(move3d, col, axis_modal_mat);
+ wm_gizmo_geometryinfo_draw(&wm_gizmo_geom_data_move3d, select);
#else
const int draw_style = RNA_enum_get(gz->ptr, "draw_style");
- const bool filled = (draw_options & ED_GIZMO_GRAB_DRAW_FLAG_FILL) != 0;
+ const bool filled = (draw_options & ED_GIZMO_MOVE_DRAW_FLAG_FILL) != 0;
GPU_line_width(gz->line_width);
@@ -112,7 +122,7 @@ static void grab_geom_draw(
immUniformColor4fv(color);
- if (draw_style == ED_GIZMO_GRAB_STYLE_RING_2D) {
+ if (draw_style == ED_GIZMO_MOVE_STYLE_RING_2D) {
if (filled) {
imm_draw_circle_fill_2d(pos, 0, 0, 1.0f, DIAL_RESOLUTION);
}
@@ -120,7 +130,7 @@ static void grab_geom_draw(
imm_draw_circle_wire_2d(pos, 0, 0, 1.0f, DIAL_RESOLUTION);
}
}
- else if (draw_style == ED_GIZMO_GRAB_STYLE_CROSS_2D) {
+ else if (draw_style == ED_GIZMO_MOVE_STYLE_CROSS_2D) {
immBegin(GPU_PRIM_LINES, 4);
immVertex2f(pos, 1.0f, 1.0f);
immVertex2f(pos, -1.0f, -1.0f);
@@ -139,19 +149,19 @@ static void grab_geom_draw(
#endif
}
-static void grab3d_get_translate(
+static void move3d_get_translate(
const wmGizmo *gz, const wmEvent *event, const ARegion *ar,
float co_delta[3])
{
- GrabInteraction *inter = gz->interaction_data;
+ MoveInteraction *inter = gz->interaction_data;
const float mval_delta[2] = {
- event->mval[0] - inter->init_mval[0],
- event->mval[1] - inter->init_mval[1],
+ event->mval[0] - inter->init.mval[0],
+ event->mval[1] - inter->init.mval[1],
};
RegionView3D *rv3d = ar->regiondata;
float co_ref[3];
- mul_v3_mat3_m4v3(co_ref, gz->matrix_space, inter->init_prop_co);
+ mul_v3_mat3_m4v3(co_ref, gz->matrix_space, inter->init.prop_co);
const float zfac = ED_view3d_calc_zfac(rv3d, co_ref, NULL);
ED_view3d_win_to_delta(ar, mval_delta, co_delta, zfac);
@@ -162,13 +172,13 @@ static void grab3d_get_translate(
mul_m3_v3(matrix_space_inv, co_delta);
}
-static void grab3d_draw_intern(
+static void move3d_draw_intern(
const bContext *C, wmGizmo *gz,
const bool select, const bool highlight)
{
- GrabInteraction *inter = gz->interaction_data;
+ MoveInteraction *inter = gz->interaction_data;
const int draw_options = RNA_enum_get(gz->ptr, "draw_options");
- const bool align_view = (draw_options & ED_GIZMO_GRAB_DRAW_FLAG_ALIGN_VIEW) != 0;
+ const bool align_view = (draw_options & ED_GIZMO_MOVE_DRAW_FLAG_ALIGN_VIEW) != 0;
float color[4];
float matrix_final[4][4];
float matrix_align[4][4];
@@ -190,32 +200,32 @@ static void grab3d_draw_intern(
}
GPU_blend(true);
- grab_geom_draw(gz, color, select, draw_options);
+ move_geom_draw(gz, color, select, draw_options);
GPU_blend(false);
GPU_matrix_pop();
if (gz->interaction_data) {
GPU_matrix_push();
- GPU_matrix_mul(inter->init_matrix_final);
+ GPU_matrix_mul(inter->init.matrix_final);
if (align_view) {
GPU_matrix_mul(matrix_align);
}
GPU_blend(true);
- grab_geom_draw(gz, (const float[4]){0.5f, 0.5f, 0.5f, 0.5f}, select, draw_options);
+ move_geom_draw(gz, (const float[4]){0.5f, 0.5f, 0.5f, 0.5f}, select, draw_options);
GPU_blend(false);
GPU_matrix_pop();
}
}
-static void gizmo_grab_draw_select(const bContext *C, wmGizmo *gz, int select_id)
+static void gizmo_move_draw_select(const bContext *C, wmGizmo *gz, int select_id)
{
GPU_select_load_id(select_id);
- grab3d_draw_intern(C, gz, true, false);
+ move3d_draw_intern(C, gz, true, false);
}
-static void gizmo_grab_draw(const bContext *C, wmGizmo *gz)
+static void gizmo_move_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;
@@ -223,26 +233,29 @@ static void gizmo_grab_draw(const bContext *C, wmGizmo *gz)
(void)is_modal;
GPU_blend(true);
- grab3d_draw_intern(C, gz, false, is_highlight);
+ move3d_draw_intern(C, gz, false, is_highlight);
GPU_blend(false);
}
-static int gizmo_grab_modal(
+static int gizmo_move_modal(
bContext *C, wmGizmo *gz, const wmEvent *event,
- eWM_GizmoFlagTweak UNUSED(tweak_flag))
+ eWM_GizmoFlagTweak tweak_flag)
{
- GrabGizmo3D *grab = (GrabGizmo3D *)gz;
- GrabInteraction *inter = gz->interaction_data;
+ MoveInteraction *inter = gz->interaction_data;
+ if ((event->type != MOUSEMOVE) && (inter->prev.tweak_flag == tweak_flag)) {
+ return OPERATOR_RUNNING_MODAL;
+ }
+ MoveGizmo3D *move = (MoveGizmo3D *)gz;
ARegion *ar = CTX_wm_region(C);
float prop_delta[3];
if (CTX_wm_area(C)->spacetype == SPACE_VIEW3D) {
- grab3d_get_translate(gz, event, ar, prop_delta);
+ move3d_get_translate(gz, event, ar, prop_delta);
}
else {
float mval_proj_init[2], mval_proj_curr[2];
if ((gizmo_window_project_2d(
- C, gz, inter->init_mval, 2, false, mval_proj_init) == false) ||
+ C, gz, inter->init.mval, 2, false, mval_proj_init) == false) ||
(gizmo_window_project_2d(
C, gz, (const float[2]){UNPACK2(event->mval)}, 2, false, mval_proj_curr) == false))
{
@@ -251,40 +264,116 @@ static int gizmo_grab_modal(
sub_v2_v2v2(prop_delta, mval_proj_curr, mval_proj_init);
prop_delta[2] = 0.0f;
}
- add_v3_v3v3(grab->prop_co, inter->init_prop_co, prop_delta);
+
+ if (tweak_flag & WM_GIZMO_TWEAK_PRECISE) {
+ mul_v3_fl(prop_delta, 0.1f);
+ }
+
+ add_v3_v3v3(move->prop_co, inter->init.prop_co, prop_delta);
+
+ if (tweak_flag & WM_GIZMO_TWEAK_SNAP) {
+ if (inter->snap_context_v3d) {
+ float dist_px = MVAL_MAX_PX_DIST * U.pixelsize;
+ const float mval_fl[2] = {UNPACK2(event->mval)};
+ float co[3];
+ if (ED_transform_snap_object_project_view3d(
+ inter->snap_context_v3d,
+ (SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE | SCE_SNAP_MODE_FACE),
+ &(const struct SnapObjectParams){
+ .snap_select = SNAP_ALL,
+ .use_object_edit_cage = true,
+ .use_occlusion_test = true,
+ },
+ mval_fl, &dist_px,
+ co, NULL))
+ {
+ float matrix_space_inv[4][4];
+ invert_m4_m4(matrix_space_inv, gz->matrix_space);
+ mul_v3_m4v3(move->prop_co, matrix_space_inv, co);
+ }
+ }
+ }
/* set the property for the operator and call its modal function */
wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
if (WM_gizmo_target_property_is_valid(gz_prop)) {
- WM_gizmo_target_property_float_set_array(C, gz, gz_prop, grab->prop_co);
+ WM_gizmo_target_property_float_set_array(C, gz, gz_prop, move->prop_co);
}
else {
- zero_v3(grab->prop_co);
+ zero_v3(move->prop_co);
}
ED_region_tag_redraw(ar);
+ inter->prev.tweak_flag = tweak_flag;
+
return OPERATOR_RUNNING_MODAL;
}
-static int gizmo_grab_invoke(
- bContext *UNUSED(C), wmGizmo *gz, const wmEvent *event)
+static void gizmo_move_exit(bContext *C, wmGizmo *gz, const bool cancel)
{
- GrabInteraction *inter = MEM_callocN(sizeof(GrabInteraction), __func__);
+ MoveInteraction *inter = gz->interaction_data;
+ bool use_reset_value = false;
+ const float *reset_value = NULL;
+ if (cancel) {
+ /* Set the property for the operator and call its modal function. */
+ wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
+ if (WM_gizmo_target_property_is_valid(gz_prop)) {
+ use_reset_value = true;
+ reset_value = inter->init.prop_co;
+ }
+ }
- inter->init_mval[0] = event->mval[0];
- inter->init_mval[1] = event->mval[1];
+ if (use_reset_value) {
+ wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
+ if (WM_gizmo_target_property_is_valid(gz_prop)) {
+ WM_gizmo_target_property_float_set_array(C, gz, gz_prop, reset_value);
+ }
+ }
+
+ if (inter->snap_context_v3d) {
+ ED_transform_snap_object_context_destroy(inter->snap_context_v3d);
+ inter->snap_context_v3d = NULL;
+ }
+}
+
+static int gizmo_move_invoke(
+ bContext *C, wmGizmo *gz, const wmEvent *event)
+{
+ const bool use_snap = RNA_boolean_get(gz->ptr, "use_snap");
+
+ MoveInteraction *inter = MEM_callocN(sizeof(MoveInteraction), __func__);
+ inter->init.mval[0] = event->mval[0];
+ inter->init.mval[1] = event->mval[1];
#if 0
- copy_v3_v3(inter->init_prop_co, grab->prop_co);
+ copy_v3_v3(inter->init.prop_co, move->prop_co);
#else
wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
if (WM_gizmo_target_property_is_valid(gz_prop)) {
- WM_gizmo_target_property_float_get_array(gz, gz_prop, inter->init_prop_co);
+ WM_gizmo_target_property_float_get_array(gz, gz_prop, inter->init.prop_co);
}
#endif
- WM_gizmo_calc_matrix_final(gz, inter->init_matrix_final);
+ WM_gizmo_calc_matrix_final(gz, inter->init.matrix_final);
+
+ if (use_snap) {
+ ScrArea *sa = CTX_wm_area(C);
+ if (sa) {
+ switch (sa->spacetype) {
+ case SPACE_VIEW3D:
+ {
+ inter->snap_context_v3d = ED_transform_snap_object_context_create_view3d(
+ CTX_data_main(C), CTX_data_scene(C), CTX_data_depsgraph(C), 0,
+ CTX_wm_region(C), CTX_wm_view3d(C));
+ break;
+ }
+ default:
+ /* Not yet supported. */
+ BLI_assert(0);
+ }
+ }
+ }
gz->interaction_data = inter;
@@ -292,7 +381,7 @@ static int gizmo_grab_invoke(
}
-static int gizmo_grab_test_select(
+static int gizmo_move_test_select(
bContext *C, wmGizmo *gz, const int mval[2])
{
float point_local[2];
@@ -311,65 +400,67 @@ static int gizmo_grab_test_select(
return -1;
}
-static void gizmo_grab_property_update(wmGizmo *gz, wmGizmoProperty *gz_prop)
+static void gizmo_move_property_update(wmGizmo *gz, wmGizmoProperty *gz_prop)
{
- GrabGizmo3D *grab = (GrabGizmo3D *)gz;
+ MoveGizmo3D *move = (MoveGizmo3D *)gz;
if (WM_gizmo_target_property_is_valid(gz_prop)) {
- WM_gizmo_target_property_float_get_array(gz, gz_prop, grab->prop_co);
+ WM_gizmo_target_property_float_get_array(gz, gz_prop, move->prop_co);
}
else {
- zero_v3(grab->prop_co);
+ zero_v3(move->prop_co);
}
}
-static int gizmo_grab_cursor_get(wmGizmo *UNUSED(gz))
+static int gizmo_move_cursor_get(wmGizmo *UNUSED(gz))
{
return BC_NSEW_SCROLLCURSOR;
}
/* -------------------------------------------------------------------- */
-/** \name Grab Gizmo API
+/** \name Move Gizmo API
*
* \{ */
-static void GIZMO_GT_grab_3d(wmGizmoType *gzt)
+static void GIZMO_GT_move_3d(wmGizmoType *gzt)
{
/* identifiers */
- gzt->idname = "GIZMO_GT_grab_3d";
+ gzt->idname = "GIZMO_GT_move_3d";
/* api callbacks */
- gzt->draw = gizmo_grab_draw;
- gzt->draw_select = gizmo_grab_draw_select;
- gzt->test_select = gizmo_grab_test_select;
- gzt->matrix_basis_get = gizmo_grab_matrix_basis_get;
- gzt->invoke = gizmo_grab_invoke;
- gzt->property_update = gizmo_grab_property_update;
- gzt->modal = gizmo_grab_modal;
- gzt->cursor_get = gizmo_grab_cursor_get;
-
- gzt->struct_size = sizeof(GrabGizmo3D);
+ gzt->draw = gizmo_move_draw;
+ gzt->draw_select = gizmo_move_draw_select;
+ gzt->test_select = gizmo_move_test_select;
+ gzt->matrix_basis_get = gizmo_move_matrix_basis_get;
+ gzt->invoke = gizmo_move_invoke;
+ gzt->property_update = gizmo_move_property_update;
+ gzt->modal = gizmo_move_modal;
+ gzt->exit = gizmo_move_exit;
+ gzt->cursor_get = gizmo_move_cursor_get;
+
+ gzt->struct_size = sizeof(MoveGizmo3D);
/* rna */
static EnumPropertyItem rna_enum_draw_style[] = {
- {ED_GIZMO_GRAB_STYLE_RING_2D, "RING_2D", 0, "Ring", ""},
- {ED_GIZMO_GRAB_STYLE_CROSS_2D, "CROSS_2D", 0, "Ring", ""},
+ {ED_GIZMO_MOVE_STYLE_RING_2D, "RING_2D", 0, "Ring", ""},
+ {ED_GIZMO_MOVE_STYLE_CROSS_2D, "CROSS_2D", 0, "Ring", ""},
{0, NULL, 0, NULL, NULL}
};
static EnumPropertyItem rna_enum_draw_options[] = {
- {ED_GIZMO_GRAB_DRAW_FLAG_FILL, "FILL", 0, "Filled", ""},
- {ED_GIZMO_GRAB_DRAW_FLAG_ALIGN_VIEW, "ALIGN_VIEW", 0, "Align View", ""},
+ {ED_GIZMO_MOVE_DRAW_FLAG_FILL, "FILL", 0, "Filled", ""},
+ {ED_GIZMO_MOVE_DRAW_FLAG_ALIGN_VIEW, "ALIGN_VIEW", 0, "Align View", ""},
{0, NULL, 0, NULL, NULL}
};
- RNA_def_enum(gzt->srna, "draw_style", rna_enum_draw_style, ED_GIZMO_GRAB_STYLE_RING_2D, "Draw Style", "");
+ RNA_def_enum(gzt->srna, "draw_style", rna_enum_draw_style, ED_GIZMO_MOVE_STYLE_RING_2D, "Draw Style", "");
RNA_def_enum_flag(gzt->srna, "draw_options", rna_enum_draw_options, 0, "Draw Options", "");
+ RNA_def_boolean(gzt->srna, "use_snap", false, "Use Snap", "");
WM_gizmotype_target_property_def(gzt, "offset", PROP_FLOAT, 3);
}
-void ED_gizmotypes_grab_3d(void)
+void ED_gizmotypes_move_3d(void)
{
- WM_gizmotype_append(GIZMO_GT_grab_3d);
+ WM_gizmotype_append(GIZMO_GT_move_3d);
}
-/** \} */ // Grab Gizmo API
+/** \} */ // Move Gizmo API
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 6443a6bf038..d5f1c23971c 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/primitive3d_gizmo.c
@@ -19,7 +19,7 @@
*/
/** \file primitive3d_gizmo.c
- * \ingroup wm
+ * \ingroup edgizmolib
*
* \name Primitive Gizmo
*
diff --git a/source/blender/editors/gizmo_library/gizmo_types/value2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/value2d_gizmo.c
new file mode 100644
index 00000000000..46a6b8f3a5f
--- /dev/null
+++ b/source/blender/editors/gizmo_library/gizmo_types/value2d_gizmo.c
@@ -0,0 +1,198 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file value2d_gizmo.c
+ * \ingroup edgizmolib
+ *
+ * \name Value Gizmo
+ *
+ * \brief Gizmo that can be used to click and drag a value.
+ *
+ * Use this in cases where it may be useful to have a tool,
+ * but the tool doesn't relate to an on-screen handle.
+ * eg: smooth or randomize.
+ *
+ * Exactly how this maps X/Y axis, and draws - may change.
+ * The purpose here is to avoid having to write custom modal handlers for each operator.
+ *
+ * So we can use a single gizmo to make redoing an operator seem modal.
+ */
+
+#include <float.h>
+#include <math.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BKE_context.h"
+#include "BLI_string.h"
+
+#include "ED_screen.h"
+#include "ED_gizmo_library.h"
+
+#include "WM_types.h"
+#include "WM_api.h"
+
+/* own includes */
+#include "../gizmo_geometry.h"
+#include "../gizmo_library_intern.h"
+
+/* -------------------------------------------------------------------- */
+/** \name Value Gizmo
+ *
+ * \{ */
+
+typedef struct ValueInteraction {
+ struct {
+ float mval[2];
+ float prop_value;
+ } init;
+ struct {
+ float prop_value;
+ eWM_GizmoFlagTweak tweak_flag;
+ } prev;
+ float range[2];
+} ValueInteraction;
+
+static void gizmo_value_draw(const bContext *UNUSED(C), wmGizmo *UNUSED(gz))
+{
+ /* pass */
+}
+
+static int gizmo_value_modal(
+ bContext *C, wmGizmo *gz, const wmEvent *event,
+ eWM_GizmoFlagTweak tweak_flag)
+{
+ ValueInteraction *inter = gz->interaction_data;
+ if ((event->type != MOUSEMOVE) && (inter->prev.tweak_flag == tweak_flag)) {
+ return OPERATOR_RUNNING_MODAL;
+ }
+ ARegion *ar = CTX_wm_region(C);
+ const float value_scale = 4.0f; /* Could be option. */
+ const float value_range = inter->range[1] - inter->range[0];
+ float value_delta = (
+ inter->init.prop_value +
+ (((event->mval[0] - inter->init.mval[0]) / ar->winx) * value_range)) * value_scale;
+
+
+ if (tweak_flag & WM_GIZMO_TWEAK_SNAP) {
+ const double snap = 0.1;
+ value_delta = (float)roundf((double)value_delta / snap) * snap;
+
+ }
+ if (tweak_flag & WM_GIZMO_TWEAK_PRECISE) {
+ value_delta *= 0.1f;
+ }
+ const float value_final = inter->init.prop_value + value_delta;
+
+ if (value_final != inter->prev.prop_value) {
+ /* set the property for the operator and call its modal function */
+ wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
+ if (WM_gizmo_target_property_is_valid(gz_prop)) {
+ WM_gizmo_target_property_float_set(C, gz, gz_prop, value_final);
+ }
+
+ {
+ ScrArea *sa = CTX_wm_area(C);
+ char str[64];
+ SNPRINTF(str, "%.4f", value_final);
+ ED_area_status_text(sa, str);
+ }
+ }
+
+ inter->prev.prop_value = value_final;
+ inter->prev.tweak_flag = tweak_flag;
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+
+static int gizmo_value_invoke(
+ bContext *UNUSED(C), wmGizmo *gz, const wmEvent *event)
+{
+ ValueInteraction *inter = MEM_callocN(sizeof(ValueInteraction), __func__);
+
+ inter->init.mval[0] = event->mval[0];
+ inter->init.mval[1] = event->mval[1];
+ inter->prev.prop_value = -FLT_MAX;
+
+ wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
+ if (WM_gizmo_target_property_is_valid(gz_prop)) {
+ inter->init.prop_value = WM_gizmo_target_property_float_get(gz, gz_prop);
+ if (!WM_gizmo_target_property_float_range_get(gz, gz_prop, inter->range)) {
+ inter->range[0] = 0.0f;
+ inter->range[1] = 1.0f;
+ }
+ }
+
+ gz->interaction_data = inter;
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static void gizmo_value_exit(bContext *C, wmGizmo *gz, const bool cancel)
+{
+ ScrArea *sa = CTX_wm_area(C);
+ ED_area_status_text(sa, NULL);
+ if (cancel) {
+ ValueInteraction *inter = gz->interaction_data;
+ wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "offset");
+ if (WM_gizmo_target_property_is_valid(gz_prop)) {
+ WM_gizmo_target_property_float_set(C, gz, gz_prop, inter->init.prop_value);
+ }
+ }
+}
+
+static int gizmo_value_test_select(
+ bContext *UNUSED(C), wmGizmo *UNUSED(gz), const int UNUSED(mval[2]))
+{
+ return 0;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Value Gizmo API
+ *
+ * \{ */
+
+static void GIZMO_GT_value_2d(wmGizmoType *gzt)
+{
+ /* identifiers */
+ gzt->idname = "GIZMO_GT_value_2d";
+
+ /* api callbacks */
+ gzt->draw = gizmo_value_draw;
+ gzt->invoke = gizmo_value_invoke;
+ gzt->exit = gizmo_value_exit;
+ gzt->modal = gizmo_value_modal;
+ gzt->test_select = gizmo_value_test_select;
+
+ gzt->struct_size = sizeof(wmGizmo);
+
+ WM_gizmotype_target_property_def(gzt, "offset", PROP_FLOAT, 1);
+ /* Options: relative / absolute */
+}
+
+void ED_gizmotypes_value_2d(void)
+{
+ WM_gizmotype_append(GIZMO_GT_value_2d);
+}
+
+/** \} */
diff --git a/source/blender/editors/gpencil/annotate_draw.c b/source/blender/editors/gpencil/annotate_draw.c
index 4f6e2004197..1a2d6d67cbe 100644
--- a/source/blender/editors/gpencil/annotate_draw.c
+++ b/source/blender/editors/gpencil/annotate_draw.c
@@ -93,8 +93,9 @@ typedef enum eDrawStrokeFlags {
/* ----- Tool Buffer Drawing ------ */
/* draw stroke defined in buffer (simple ogl lines/points for now, as dotted lines) */
-static void gp_draw_stroke_buffer(const tGPspoint *points, int totpoints, short thickness,
- short dflag, short sflag, float ink[4])
+static void gp_draw_stroke_buffer(
+ const tGPspoint *points, int totpoints, short thickness,
+ short dflag, short sflag, float ink[4])
{
int draw_points = 0;
@@ -241,8 +242,9 @@ static void gp_draw_stroke_point(
}
/* draw a given stroke in 3d (i.e. in 3d-space), using simple ogl lines */
-static void gp_draw_stroke_3d(const bGPDspoint *points, int totpoints, short thickness, bool UNUSED(debug),
- short UNUSED(sflag), const float ink[4], bool cyclic)
+static void gp_draw_stroke_3d(
+ const bGPDspoint *points, int totpoints, short thickness, bool UNUSED(debug),
+ short UNUSED(sflag), const float ink[4], bool cyclic)
{
float curpressure = points[0].pressure;
float cyclic_fpt[3];
@@ -322,8 +324,9 @@ static void gp_draw_stroke_3d(const bGPDspoint *points, int totpoints, short thi
/* ----- Fancy 2D-Stroke Drawing ------ */
/* draw a given stroke in 2d */
-static void gp_draw_stroke_2d(const bGPDspoint *points, int totpoints, short thickness_s, short dflag, short sflag,
- bool UNUSED(debug), int offsx, int offsy, int winx, int winy, const float ink[4])
+static void gp_draw_stroke_2d(
+ const bGPDspoint *points, int totpoints, short thickness_s, short dflag, short sflag,
+ bool UNUSED(debug), int offsx, int offsy, int winx, int winy, const float ink[4])
{
/* otherwise thickness is twice that of the 3D view */
float thickness = (float)thickness_s * 0.5f;
@@ -553,8 +556,9 @@ static void gp_draw_strokes(
gp_draw_stroke_point(gps->points, lthick, dflag, gps->flag, offsx, offsy, winx, winy, color);
}
else {
- gp_draw_stroke_3d(gps->points, gps->totpoints, lthick, debug, gps->flag,
- color, gps->flag & GP_STROKE_CYCLIC);
+ gp_draw_stroke_3d(
+ gps->points, gps->totpoints, lthick, debug, gps->flag,
+ color, gps->flag & GP_STROKE_CYCLIC);
}
if (no_xray) {
@@ -570,8 +574,9 @@ static void gp_draw_strokes(
gp_draw_stroke_point(gps->points, lthick, dflag, gps->flag, offsx, offsy, winx, winy, color);
}
else {
- gp_draw_stroke_2d(gps->points, gps->totpoints, lthick, dflag, gps->flag, debug,
- offsx, offsy, winx, winy, color);
+ gp_draw_stroke_2d(
+ gps->points, gps->totpoints, lthick, dflag, gps->flag, debug,
+ offsx, offsy, winx, winy, color);
}
}
}
@@ -664,21 +669,21 @@ static void gp_draw_strokes_edit(
/* size and color first */
if (show_direction_hint && i == 0) {
/* start point in green bigger */
- immAttrib3f(color, 0.0f, 1.0f, 0.0f);
- immAttrib1f(size, vsize + 4);
+ immAttr3f(color, 0.0f, 1.0f, 0.0f);
+ immAttr1f(size, vsize + 4);
}
else if (show_direction_hint && (i == gps->totpoints - 1)) {
/* end point in red smaller */
- immAttrib3f(color, 1.0f, 0.0f, 0.0f);
- immAttrib1f(size, vsize + 1);
+ immAttr3f(color, 1.0f, 0.0f, 0.0f);
+ immAttr1f(size, vsize + 1);
}
else if (pt->flag & GP_SPOINT_SELECT) {
- immAttrib3fv(color, selectColor);
- immAttrib1f(size, vsize);
+ immAttr3fv(color, selectColor);
+ immAttr1f(size, vsize);
}
else {
- immAttrib3fv(color, gpl->color);
- immAttrib1f(size, bsize);
+ immAttr3fv(color, gpl->color);
+ immAttr1f(size, bsize);
}
/* then position */
@@ -735,7 +740,7 @@ static void gp_draw_data_layers(
continue;
/* get frame to draw */
- bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra, 0);
+ bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra, GP_GETFRAME_USE_PREV);
if (gpf == NULL)
continue;
@@ -746,23 +751,16 @@ static void gp_draw_data_layers(
* NOTE: If the setting doesn't apply, it *must* be cleared,
* as dflag's carry over from the previous layer
*/
-#define GP_DRAWFLAG_APPLY(condition, draw_flag_value) { \
- if (condition) dflag |= (draw_flag_value); \
- else dflag &= ~(draw_flag_value); \
- } (void)0
/* xray... */
- GP_DRAWFLAG_APPLY((gpl->flag & GP_LAYER_NO_XRAY), GP_DRAWDATA_NO_XRAY);
-
-#undef GP_DRAWFLAG_APPLY
-
+ SET_FLAG_FROM_TEST(dflag, gpl->flag & GP_LAYER_NO_XRAY, GP_DRAWDATA_NO_XRAY);
/* draw the strokes already in active frame */
gp_draw_strokes(gpd, gpl, gpf, offsx, offsy, winx, winy, dflag, debug, lthick, ink);
/* Draw verts of selected strokes
* - when doing OpenGL renders, we don't want to be showing these, as that ends up flickering
- * - locked layers can't be edited, so there's no point showing these verts
+ * - locked layers can't be edited, so there's no point showing these verts
* as they will have no bearings on what gets edited
* - only show when in editmode, since operators shouldn't work otherwise
* (NOTE: doing it this way means that the toggling editmode shows visible change immediately)
@@ -1052,15 +1050,4 @@ void ED_gpencil_draw_view3d_annotations(
gp_draw_data_all(scene, gpd, offsx, offsy, winx, winy, CFRA, dflag, v3d->spacetype);
}
-#if 0 // XXX: Reinstate, after renaming the functions
-
-void ED_gpencil_draw_ex(Scene *scene, bGPdata *gpd, int winx, int winy, const int cfra, const char spacetype)
-{
- int dflag = GP_DRAWDATA_NOSTATUS | GP_DRAWDATA_ONLYV2D;
-
- gp_draw_data_all(scene, gpd, 0, 0, winx, winy, cfra, dflag, spacetype);
-}
-
-#endif
-
/* ************************************************** */
diff --git a/source/blender/editors/gpencil/annotate_paint.c b/source/blender/editors/gpencil/annotate_paint.c
index 4f25dc421e4..57be09d807c 100644
--- a/source/blender/editors/gpencil/annotate_paint.c
+++ b/source/blender/editors/gpencil/annotate_paint.c
@@ -269,40 +269,7 @@ static bool gp_stroke_filtermval(tGPsdata *p, const int mval[2], int pmval[2])
return false;
}
-/* reproject the points of the stroke to a plane locked to axis to avoid stroke offset */
-static void UNUSED_FUNCTION(gp_project_points_to_plane)(
- RegionView3D *rv3d, bGPDstroke *gps, const float origin[3], const int axis)
-{
- float plane_normal[3];
- float vn[3];
-
- float ray[3];
- float rpoint[3];
-
- /* normal vector for a plane locked to axis */
- zero_v3(plane_normal);
- plane_normal[axis] = 1.0f;
-
- /* Reproject the points in the plane */
- for (int i = 0; i < gps->totpoints; i++) {
- bGPDspoint *pt = &gps->points[i];
-
- /* get a vector from the point with the current view direction of the viewport */
- ED_view3d_global_to_vector(rv3d, &pt->x, vn);
-
- /* calculate line extrem point to create a ray that cross the plane */
- mul_v3_fl(vn, -50.0f);
- add_v3_v3v3(ray, &pt->x, vn);
-
- /* if the line never intersect, the point is not changed */
- if (isect_line_plane_v3(rpoint, &pt->x, ray, origin, plane_normal)) {
- copy_v3_v3(&pt->x, rpoint);
- }
- }
-}
-
/* convert screen-coordinates to buffer-coordinates */
-/* XXX this method needs a total overhaul! */
static void gp_stroke_convertcoords(tGPsdata *p, const int mval[2], float out[3], float *depth)
{
bGPdata *gpd = p->gpd;
@@ -560,8 +527,9 @@ static void gp_stroke_simplify(tGPsdata *p)
j += 2;
}
}
- gp_stroke_addpoint(p, &old_points[num_points - 1].x, old_points[num_points - 1].pressure,
- p->inittime + (double)old_points[num_points - 1].time);
+ gp_stroke_addpoint(
+ p, &old_points[num_points - 1].x, old_points[num_points - 1].pressure,
+ p->inittime + (double)old_points[num_points - 1].time);
/* free old buffer */
MEM_freeN(old_points);
@@ -761,7 +729,7 @@ static void gp_stroke_newfrombuffer(tGPsdata *p)
/* helper to free a stroke
* NOTE: gps->dvert and gps->triangles should be NULL, but check anyway for good measure
*/
-static void gp_free_stroke(bGPdata *UNUSED(gpd), bGPDframe *gpf, bGPDstroke *gps)
+static void gp_free_stroke(bGPDframe *gpf, bGPDstroke *gps)
{
if (gps->points) {
MEM_freeN(gps->points);
@@ -815,10 +783,11 @@ static bool gp_stroke_eraser_is_occluded(tGPsdata *p, const bGPDspoint *pt, cons
/* eraser tool - evaluation per stroke */
/* TODO: this could really do with some optimization (KD-Tree/BVH?) */
-static void gp_stroke_eraser_dostroke(tGPsdata *p,
- bGPDframe *gpf, bGPDstroke *gps,
- const int mval[2], const int mvalo[2],
- const int radius, const rcti *rect)
+static void gp_stroke_eraser_dostroke(
+ tGPsdata *p,
+ bGPDframe *gpf, bGPDstroke *gps,
+ const int mval[2], const int mvalo[2],
+ const int radius, const rcti *rect)
{
bGPDspoint *pt1, *pt2;
int pc1[2] = {0};
@@ -827,7 +796,7 @@ static void gp_stroke_eraser_dostroke(tGPsdata *p,
if (gps->totpoints == 0) {
/* just free stroke */
- gp_free_stroke(p->gpd, gpf, gps);
+ gp_free_stroke(gpf, gps);
}
else if (gps->totpoints == 1) {
/* only process if it hasn't been masked out... */
@@ -839,7 +808,7 @@ static void gp_stroke_eraser_dostroke(tGPsdata *p,
/* only check if point is inside */
if (len_v2v2_int(mval, pc1) <= radius) {
/* free stroke */
- gp_free_stroke(p->gpd, gpf, gps);
+ gp_free_stroke(gpf, gps);
}
}
}
@@ -1464,10 +1433,11 @@ static void gpencil_draw_eraser(bContext *UNUSED(C), int x, int y, void *p_ptr)
immUniform1f("dash_width", 12.0f);
immUniform1f("dash_factor", 0.5f);
- imm_draw_circle_wire_2d(shdr_pos, x, y, p->radius,
- /* XXX Dashed shader gives bad results with sets of small segments currently,
- * temp hack around the issue. :( */
- max_ii(8, p->radius / 2)); /* was fixed 40 */
+ imm_draw_circle_wire_2d(
+ shdr_pos, x, y, p->radius,
+ /* XXX Dashed shader gives bad results with sets of small segments currently,
+ * temp hack around the issue. :( */
+ max_ii(8, p->radius / 2)); /* was fixed 40 */
immUnbindProgram();
@@ -1486,9 +1456,11 @@ static void gpencil_draw_toggle_eraser_cursor(bContext *C, tGPsdata *p, short en
}
else if (enable && !p->erasercursor) {
/* enable cursor */
- p->erasercursor = WM_paint_cursor_activate(CTX_wm_manager(C),
- NULL, /* XXX */
- gpencil_draw_eraser, p);
+ p->erasercursor = WM_paint_cursor_activate(
+ CTX_wm_manager(C),
+ SPACE_TYPE_ANY, RGN_TYPE_ANY,
+ NULL, /* XXX */
+ gpencil_draw_eraser, p);
}
}
@@ -1750,10 +1722,10 @@ static void gpencil_draw_apply_event(wmOperator *op, const wmEvent *event, Depsg
p->pressure = wmtab->Pressure;
/* Hack for pressure sensitive eraser on D+RMB when using a tablet:
- * The pen has to float over the tablet surface, resulting in
- * zero pressure (T47101). Ignore pressure values if floating
- * (i.e. "effectively zero" pressure), and only when the "active"
- * end is the stylus (i.e. the default when not eraser)
+ * The pen has to float over the tablet surface, resulting in
+ * zero pressure (T47101). Ignore pressure values if floating
+ * (i.e. "effectively zero" pressure), and only when the "active"
+ * end is the stylus (i.e. the default when not eraser)
*/
if (p->paintmode == GP_PAINTMODE_ERASER) {
if ((wmtab->Active != EVT_TABLET_ERASER) && (p->pressure < 0.001f)) {
@@ -1778,7 +1750,7 @@ static void gpencil_draw_apply_event(wmOperator *op, const wmEvent *event, Depsg
p->straight[1] = 0;
/* special exception here for too high pressure values on first touch in
- * windows for some tablets, then we just skip first touch...
+ * windows for some tablets, then we just skip first touch...
*/
if (tablet && (p->pressure >= 0.99f))
return;
@@ -1895,14 +1867,16 @@ static int gpencil_draw_exec(bContext *C, wmOperator *op)
static int gpencil_draw_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
Object *ob = CTX_data_active_object(C);
+ ScrArea *sa = CTX_wm_area(C);
tGPsdata *p = NULL;
/* GPXX Need a better solution */
- if ((ob != NULL) && (ob->type == OB_GPENCIL)) {
- BKE_report(op->reports, RPT_ERROR, "Cannot draw annotation with a Grease Pencil object active");
- return OPERATOR_CANCELLED;
+ if (sa && sa->spacetype == SPACE_VIEW3D) {
+ if ((ob != NULL) && (ob->type == OB_GPENCIL)) {
+ BKE_report(op->reports, RPT_ERROR, "Cannot draw annotation with a Grease Pencil object active");
+ return OPERATOR_CANCELLED;
+ }
}
-
if (G.debug & G_DEBUG)
printf("GPencil - Starting Drawing\n");
diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index 180fb65e743..03589bb69ae 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -114,11 +114,11 @@ typedef enum eDrawStrokeFlags {
/* ----- Tool Buffer Drawing ------ */
/* helper functions to set color of buffer point */
-static void gp_set_tpoint_varying_color(const tGPspoint *pt, const float ink[4], uint attrib_id)
+static void gp_set_tpoint_varying_color(const tGPspoint *pt, const float ink[4], uint attr_id)
{
float alpha = ink[3] * pt->strength;
CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f);
- immAttrib4ub(attrib_id, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(alpha));
+ immAttr4ub(attr_id, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(alpha));
}
static void gp_set_point_uniform_color(const bGPDspoint *pt, const float ink[4])
@@ -128,11 +128,11 @@ static void gp_set_point_uniform_color(const bGPDspoint *pt, const float ink[4])
immUniformColor3fvAlpha(ink, alpha);
}
-static void gp_set_point_varying_color(const bGPDspoint *pt, const float ink[4], uint attrib_id)
+static void gp_set_point_varying_color(const bGPDspoint *pt, const float ink[4], uint attr_id)
{
float alpha = ink[3] * pt->strength;
CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f);
- immAttrib4ub(attrib_id, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(alpha));
+ immAttr4ub(attr_id, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(alpha));
}
/* draw fills for buffer stroke */
@@ -199,8 +199,9 @@ static void gp_draw_stroke_buffer_fill(const tGPspoint *points, int totpoints, f
}
/* draw stroke defined in buffer (simple ogl lines/points for now, as dotted lines) */
-static void gp_draw_stroke_buffer(const tGPspoint *points, int totpoints, short thickness,
- short dflag, short sflag, float ink[4], float fill_ink[4])
+static void gp_draw_stroke_buffer(
+ const tGPspoint *points, int totpoints, short thickness,
+ short dflag, short sflag, float ink[4], float fill_ink[4])
{
int draw_points = 0;
@@ -317,8 +318,9 @@ static void gp_calc_2d_stroke_fxy(const float pt[3], short sflag, int offsx, int
/* draw a 2D buffer stroke in "volumetric" style
* NOTE: the stroke buffer doesn't have any coordinate offsets/transforms
*/
-static void gp_draw_stroke_volumetric_buffer(const tGPspoint *points, int totpoints, short thickness,
- short dflag, const float ink[4])
+static void gp_draw_stroke_volumetric_buffer(
+ const tGPspoint *points, int totpoints, short thickness,
+ short dflag, const float ink[4])
{
/* error checking */
if ((points == NULL) || (totpoints <= 0))
@@ -340,7 +342,7 @@ static void gp_draw_stroke_volumetric_buffer(const tGPspoint *points, int totpoi
const tGPspoint *pt = points;
for (int i = 0; i < totpoints; i++, pt++) {
gp_set_tpoint_varying_color(pt, ink, color);
- immAttrib1f(size, pt->pressure * thickness); /* TODO: scale based on view transform (zoom level) */
+ immAttr1f(size, pt->pressure * thickness); /* TODO: scale based on view transform (zoom level) */
immVertex2f(pos, pt->x, pt->y);
}
@@ -350,10 +352,11 @@ static void gp_draw_stroke_volumetric_buffer(const tGPspoint *points, int totpoi
}
/* draw a 2D strokes in "volumetric" style */
-static void gp_draw_stroke_volumetric_2d(const bGPDspoint *points, int totpoints, short thickness,
- short UNUSED(dflag), short sflag,
- int offsx, int offsy, int winx, int winy,
- const float diff_mat[4][4], const float ink[4])
+static void gp_draw_stroke_volumetric_2d(
+ const bGPDspoint *points, int totpoints, short thickness,
+ short UNUSED(dflag), short sflag,
+ int offsx, int offsy, int winx, int winy,
+ const float diff_mat[4][4], const float ink[4])
{
GPUVertFormat *format = immVertexFormat();
uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
@@ -374,7 +377,7 @@ static void gp_draw_stroke_volumetric_2d(const bGPDspoint *points, int totpoints
gp_calc_2d_stroke_fxy(fpt, sflag, offsx, offsy, winx, winy, co);
gp_set_point_varying_color(pt, ink, color);
- immAttrib1f(size, pt->pressure * thickness); /* TODO: scale based on view transform */
+ immAttr1f(size, pt->pressure * thickness); /* TODO: scale based on view transform */
immVertex2f(pos, co[0], co[1]);
}
@@ -400,7 +403,7 @@ static void gp_draw_stroke_volumetric_3d(
const bGPDspoint *pt = points;
for (int i = 0; i < totpoints && pt; i++, pt++) {
gp_set_point_varying_color(pt, ink, color);
- immAttrib1f(size, pt->pressure * thickness); /* TODO: scale based on view transform */
+ immAttr1f(size, pt->pressure * thickness); /* TODO: scale based on view transform */
immVertex3fv(pos, &pt->x); /* we can adjust size in vertex shader based on view/projection! */
}
@@ -580,7 +583,7 @@ static void gp_add_filldata_tobuffer(
fpt[2] = 0.0f; /* 2d always is z=0.0f */
}
- immAttrib2f(texcoord, uv[0], uv[1]); /* texture coordinates */
+ immAttr2f(texcoord, uv[0], uv[1]); /* texture coordinates */
immVertex3fv(pos, fpt); /* position */
}
@@ -736,15 +739,18 @@ static void gp_draw_stroke_3d(tGPDdraw *tgpw, short thickness, const float ink[4
int cyclic_add = (cyclic) ? 1 : 0;
GPUVertFormat *format = immVertexFormat();
- uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
- uint color = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
- uint thickattrib = GPU_vertformat_attr_add(format, "thickness", GPU_COMP_F32, 1, GPU_FETCH_FLOAT);
+ const struct {
+ uint pos, color, thickness;
+ } attr_id = {
+ .pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT),
+ .color = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT),
+ .thickness = GPU_vertformat_attr_add(format, "thickness", GPU_COMP_F32, 1, GPU_FETCH_FLOAT),
+ };
immBindBuiltinProgram(GPU_SHADER_GPENCIL_STROKE);
immUniform2fv("Viewport", viewport);
immUniform1f("pixsize", tgpw->rv3d->pixsize);
- immUniform1f("pixelsize", U.pixelsize);
- float obj_scale = (tgpw->ob->size[0] + tgpw->ob->size[1] + tgpw->ob->size[2]) / 3.0f;
+ float obj_scale = tgpw->ob ? (tgpw->ob->size[0] + tgpw->ob->size[1] + tgpw->ob->size[2]) / 3.0f : 1.0f;
immUniform1f("objscale", obj_scale);
int keep_size = (int)((tgpw->gpd) && (tgpw->gpd->flag & GP_DATA_STROKE_KEEPTHICKNESS));
@@ -760,8 +766,8 @@ static void gp_draw_stroke_3d(tGPDdraw *tgpw, short thickness, const float ink[4
for (int i = 0; i < totpoints; i++, pt++) {
/* first point for adjacency (not drawn) */
if (i == 0) {
- gp_set_point_varying_color(points, ink, color);
- immAttrib1f(thickattrib, max_ff(curpressure * thickness, 1.0f));
+ gp_set_point_varying_color(points, ink, attr_id.color);
+ immAttr1f(attr_id.thickness, max_ff(curpressure * thickness, 1.0f));
if ((cyclic) && (totpoints > 2)) {
mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + totpoints - 1)->x);
}
@@ -769,35 +775,35 @@ static void gp_draw_stroke_3d(tGPDdraw *tgpw, short thickness, const float ink[4
mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + 1)->x);
}
mul_v3_fl(fpt, -1.0f);
- immVertex3fv(pos, fpt);
+ immVertex3fv(attr_id.pos, fpt);
}
/* set point */
- gp_set_point_varying_color(pt, ink, color);
- immAttrib1f(thickattrib, max_ff(curpressure * thickness, 1.0f));
+ gp_set_point_varying_color(pt, ink, attr_id.color);
+ immAttr1f(attr_id.thickness, max_ff(curpressure * thickness, 1.0f));
mul_v3_m4v3(fpt, tgpw->diff_mat, &pt->x);
- immVertex3fv(pos, fpt);
+ immVertex3fv(attr_id.pos, fpt);
curpressure = pt->pressure;
}
if (cyclic && totpoints > 2) {
/* draw line to first point to complete the cycle */
- immAttrib1f(thickattrib, max_ff(points->pressure * thickness, 1.0f));
+ immAttr1f(attr_id.thickness, max_ff(points->pressure * thickness, 1.0f));
mul_v3_m4v3(fpt, tgpw->diff_mat, &points->x);
- immVertex3fv(pos, fpt);
+ immVertex3fv(attr_id.pos, fpt);
/* now add adjacency point (not drawn) */
- immAttrib1f(thickattrib, max_ff((points + 1)->pressure * thickness, 1.0f));
+ immAttr1f(attr_id.thickness, max_ff((points + 1)->pressure * thickness, 1.0f));
mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + 1)->x);
- immVertex3fv(pos, fpt);
+ immVertex3fv(attr_id.pos, fpt);
}
/* last adjacency point (not drawn) */
else {
- gp_set_point_varying_color(points + totpoints - 1, ink, color);
- immAttrib1f(thickattrib, max_ff(curpressure * thickness, 1.0f));
+ gp_set_point_varying_color(points + totpoints - 1, ink, attr_id.color);
+ immAttr1f(attr_id.thickness, max_ff(curpressure * thickness, 1.0f));
mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + totpoints - 2)->x);
mul_v3_fl(fpt, -1.0f);
- immVertex3fv(pos, fpt);
+ immVertex3fv(attr_id.pos, fpt);
}
immEnd();
@@ -833,8 +839,12 @@ static void gp_draw_stroke_2d(
float fpt[3];
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_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
+ const struct {
+ uint pos, color;
+ } attr_id = {
+ .pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT),
+ .color = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT),
+ };
immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
immBegin(GPU_PRIM_TRI_STRIP, totpoints * 2 + 4);
@@ -864,7 +874,7 @@ static void gp_draw_stroke_2d(
pthick = (pt1->pressure * thickness * scalefac);
/* color of point */
- gp_set_point_varying_color(pt1, ink, color);
+ gp_set_point_varying_color(pt1, ink, attr_id.color);
/* if the first segment, start of segment is segment's normal */
if (i == 0) {
@@ -882,8 +892,8 @@ static void gp_draw_stroke_2d(
t1[1] = sc[1] + mt[1];
/* First two points of cap. */
- immVertex2fv(pos, t0);
- immVertex2fv(pos, t1);
+ immVertex2fv(attr_id.pos, t0);
+ immVertex2fv(attr_id.pos, t1);
/* calculate points for start of segment */
mt[0] = m2[0] * pthick;
@@ -895,8 +905,8 @@ static void gp_draw_stroke_2d(
t1[1] = s0[1] + mt[1];
/* Last two points of start cap (and first two points of first segment). */
- immVertex2fv(pos, t0);
- immVertex2fv(pos, t1);
+ immVertex2fv(attr_id.pos, t0);
+ immVertex2fv(attr_id.pos, t1);
}
/* if not the first segment, use bisector of angle between segments */
else {
@@ -929,8 +939,8 @@ static void gp_draw_stroke_2d(
t1[1] = s0[1] + mt[1];
/* Last two points of previous segment, and first two points of current segment. */
- immVertex2fv(pos, t0);
- immVertex2fv(pos, t1);
+ immVertex2fv(attr_id.pos, t0);
+ immVertex2fv(attr_id.pos, t1);
}
/* if last segment, also draw end of segment (defined as segment's normal) */
@@ -939,7 +949,7 @@ static void gp_draw_stroke_2d(
pthick = (pt2->pressure * thickness * scalefac);
/* color of point */
- gp_set_point_varying_color(pt2, ink, color);
+ gp_set_point_varying_color(pt2, ink, attr_id.color);
/* calculate points for end of segment */
mt[0] = m2[0] * pthick;
@@ -951,8 +961,8 @@ static void gp_draw_stroke_2d(
t1[1] = s1[1] + mt[1];
/* Last two points of last segment (and first two points of end cap). */
- immVertex2fv(pos, t0);
- immVertex2fv(pos, t1);
+ immVertex2fv(attr_id.pos, t0);
+ immVertex2fv(attr_id.pos, t1);
/* draw end cap as last step
* - make points slightly closer to center (about halfway across)
@@ -968,8 +978,8 @@ static void gp_draw_stroke_2d(
t1[1] = sc[1] + mt[1];
/* Last two points of end cap. */
- immVertex2fv(pos, t0);
- immVertex2fv(pos, t1);
+ immVertex2fv(attr_id.pos, t0);
+ immVertex2fv(attr_id.pos, t1);
}
/* store computed point2 coordinates as point1 ones of next segment. */
@@ -1314,21 +1324,21 @@ static void gp_draw_strokes_edit(
/* size and color first */
if (show_direction_hint && i == 0) {
/* start point in green bigger */
- immAttrib3f(color, 0.0f, 1.0f, 0.0f);
- immAttrib1f(size, vsize + 4);
+ immAttr3f(color, 0.0f, 1.0f, 0.0f);
+ immAttr1f(size, vsize + 4);
}
else if (show_direction_hint && (i == gps->totpoints - 1)) {
/* end point in red smaller */
- immAttrib3f(color, 1.0f, 0.0f, 0.0f);
- immAttrib1f(size, vsize + 1);
+ immAttr3f(color, 1.0f, 0.0f, 0.0f);
+ immAttr1f(size, vsize + 1);
}
else if (pt->flag & GP_SPOINT_SELECT) {
- immAttrib3fv(color, selectColor);
- immAttrib1f(size, vsize);
+ immAttr3fv(color, selectColor);
+ immAttr1f(size, vsize);
}
else {
- immAttrib3fv(color, gp_style->stroke_rgba);
- immAttrib1f(size, bsize);
+ immAttr3fv(color, gp_style->stroke_rgba);
+ immAttr1f(size, bsize);
}
/* then position */
@@ -1433,7 +1443,7 @@ void ED_gp_draw_primitives(const bContext *C, tGPDprimitive *tgpi, const int typ
}
Object *obact = CTX_data_active_object(C);
- Depsgraph *depsgraph = CTX_data_depsgraph(C); \
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
float color[4];
UI_GetThemeColor3fv(TH_GP_VERTEX_SELECT, color);
@@ -1515,7 +1525,7 @@ static void gp_draw_data_layers(RegionView3D *rv3d,
continue;
/* get frame to draw */
- bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra, 0);
+ bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra, GP_GETFRAME_USE_PREV);
if (gpf == NULL)
continue;
@@ -1526,18 +1536,12 @@ static void gp_draw_data_layers(RegionView3D *rv3d,
* NOTE: If the setting doesn't apply, it *must* be cleared,
* as dflag's carry over from the previous layer
*/
-#define GP_DRAWFLAG_APPLY(condition, draw_flag_value) { \
- if (condition) dflag |= (draw_flag_value); \
- else dflag &= ~(draw_flag_value); \
- } (void)0
/* xray... */
- GP_DRAWFLAG_APPLY((gpl->flag & GP_LAYER_NO_XRAY), GP_DRAWDATA_NO_XRAY);
+ SET_FLAG_FROM_TEST(dflag, gpl->flag & GP_LAYER_NO_XRAY, GP_DRAWDATA_NO_XRAY);
/* volumetric strokes... */
- GP_DRAWFLAG_APPLY((gpl->flag & GP_LAYER_VOLUMETRIC), GP_DRAWDATA_VOLUMETRIC);
-
-#undef GP_DRAWFLAG_APPLY
+ SET_FLAG_FROM_TEST(dflag, gpl->flag & GP_LAYER_VOLUMETRIC, GP_DRAWDATA_VOLUMETRIC);
tgpw.gpl = gpl;
tgpw.gpf = gpf;
@@ -1670,20 +1674,21 @@ static void gp_draw_data(RegionView3D *rv3d,
/* if we have strokes for scenes (3d view)/clips (movie clip editor)
* and objects/tracks, multiple data blocks have to be drawn */
static void gp_draw_data_all(
- RegionView3D *rv3d, Scene *scene, bGPdata *gpd, int offsx, int offsy, int winx, int winy,
+ ViewLayer *view_layer, RegionView3D *rv3d, Scene *scene, bGPdata *gpd,
+ int offsx, int offsy, int winx, int winy,
int cfra, int dflag, const char UNUSED(spacetype))
{
bGPdata *gpd_source = NULL;
- ToolSettings *ts = NULL;
Brush *brush = NULL;
+ Object *ob = OBACT(view_layer);
if (scene) {
- ts = scene->toolsettings;
- brush = BKE_brush_getactive_gpencil(ts);
+ ToolSettings *ts = scene->toolsettings;
+ brush = BKE_paint_brush(&ts->gp_paint->paint);
if (gpd_source) {
if (brush != NULL) {
gp_draw_data(
- rv3d, brush, 1.0f, NULL, gpd_source,
+ rv3d, brush, 1.0f, ob, gpd_source,
offsx, offsy, winx, winy, cfra, dflag);
}
}
@@ -1694,7 +1699,7 @@ static void gp_draw_data_all(
if (gpd_source == NULL || (gpd_source && gpd_source != gpd)) {
if (brush != NULL) {
gp_draw_data(
- rv3d, brush, 1.0f, NULL, gpd,
+ rv3d, brush, 1.0f, ob, gpd,
offsx, offsy, winx, winy, cfra, dflag);
}
}
@@ -1757,14 +1762,14 @@ void ED_gpencil_draw_view3d(
}
if ((wm == NULL) || ED_screen_animation_playing(wm)) {
- /* don't show onionskins during animation playback/scrub (i.e. it obscures the poses)
+ /* don't show onion-skins during animation playback/scrub (i.e. it obscures the poses)
* OpenGL Renders (i.e. final output), or depth buffer (i.e. not real strokes)
*/
dflag |= GP_DRAWDATA_NO_ONIONS;
}
/* draw it! */
- gp_draw_data_all(rv3d, scene, gpd, offsx, offsy, winx, winy, CFRA, dflag, v3d->spacetype);
+ gp_draw_data_all(view_layer, rv3d, scene, gpd, offsx, offsy, winx, winy, CFRA, dflag, v3d->spacetype);
}
/* draw grease-pencil sketches to specified 3d-view for gp object
@@ -1781,7 +1786,7 @@ void ED_gpencil_draw_view3d_object(wmWindowManager *wm, Scene *scene, Depsgraph
if (gpd == NULL) return;
/* when rendering to the offscreen buffer we don't want to
- * deal with the camera border, otherwise map the coords to the camera border. */
+ * deal with the camera border, otherwise map the coords to the camera border. */
if ((rv3d->persp == RV3D_CAMOB) && !(G.f & G_RENDER_OGL)) {
rctf rectf;
ED_view3d_calc_camera_border(scene, depsgraph, ar, v3d, rv3d, &rectf, true); /* no shift */
@@ -1801,9 +1806,9 @@ void ED_gpencil_draw_view3d_object(wmWindowManager *wm, Scene *scene, Depsgraph
/* set flags */
if (only3d) {
/* 3D strokes/3D space:
- * - only 3D space points
- * - don't status text either (as it's the wrong space)
- */
+ * - only 3D space points
+ * - don't status text either (as it's the wrong space)
+ */
dflag |= (GP_DRAWDATA_ONLY3D | GP_DRAWDATA_NOSTATUS);
}
@@ -1814,23 +1819,25 @@ void ED_gpencil_draw_view3d_object(wmWindowManager *wm, Scene *scene, Depsgraph
if ((wm == NULL) || ED_screen_animation_playing(wm)) {
/* don't show onionskins during animation playback/scrub (i.e. it obscures the poses)
- * OpenGL Renders (i.e. final output), or depth buffer (i.e. not real strokes)
- */
+ * OpenGL Renders (i.e. final output), or depth buffer (i.e. not real strokes)
+ */
dflag |= GP_DRAWDATA_NO_ONIONS;
}
/* draw it! */
ToolSettings *ts = scene->toolsettings;
- Brush *brush = BKE_brush_getactive_gpencil(ts);
+ Brush *brush = BKE_paint_brush(&ts->gp_paint->paint);
if (brush != NULL) {
gp_draw_data(rv3d, brush, 1.0f, ob, gpd,
offsx, offsy, winx, winy, CFRA, dflag);
}
}
-void ED_gpencil_draw_ex(RegionView3D *rv3d, Scene *scene, bGPdata *gpd, int winx, int winy, const int cfra, const char spacetype)
+void ED_gpencil_draw_ex(
+ ViewLayer *view_layer, RegionView3D *rv3d, Scene *scene,
+ bGPdata *gpd, int winx, int winy, const int cfra, const char spacetype)
{
int dflag = GP_DRAWDATA_NOSTATUS | GP_DRAWDATA_ONLYV2D;
- gp_draw_data_all(rv3d, scene, gpd, 0, 0, winx, winy, cfra, dflag, spacetype);
+ gp_draw_data_all(view_layer, rv3d, scene, gpd, 0, 0, winx, winy, cfra, dflag, spacetype);
}
diff --git a/source/blender/editors/gpencil/editaction_gpencil.c b/source/blender/editors/gpencil/editaction_gpencil.c
index 2c3159692bf..08680ba1e88 100644
--- a/source/blender/editors/gpencil/editaction_gpencil.c
+++ b/source/blender/editors/gpencil/editaction_gpencil.c
@@ -55,9 +55,9 @@
/* ***************************************** */
/* NOTE ABOUT THIS FILE:
- * This file contains code for editing Grease Pencil data in the Action Editor
- * as a 'keyframes', so that a user can adjust the timing of Grease Pencil drawings.
- * Therefore, this file mostly contains functions for selecting Grease-Pencil frames.
+ * This file contains code for editing Grease Pencil data in the Action Editor
+ * as a 'keyframes', so that a user can adjust the timing of Grease Pencil drawings.
+ * Therefore, this file mostly contains functions for selecting Grease-Pencil frames.
*/
/* ***************************************** */
/* Generics - Loopers */
@@ -191,7 +191,7 @@ void ED_gpencil_select_frame(bGPDlayer *gpl, int selx, short select_mode)
}
/* select the frames in this layer that occur within the bounds specified */
-void ED_gplayer_frames_select_border(bGPDlayer *gpl, float min, float max, short select_mode)
+void ED_gplayer_frames_select_box(bGPDlayer *gpl, float min, float max, short select_mode)
{
bGPDframe *gpf;
@@ -477,7 +477,7 @@ bool ED_gpencil_anim_copybuf_paste(bAnimContext *ac, const short offset_mode)
gpfs->framenum += offset;
/* get frame to copy data into (if no frame returned, then just ignore) */
- gpf = BKE_gpencil_layer_getframe(gpld, gpfs->framenum, 1);
+ gpf = BKE_gpencil_layer_getframe(gpld, gpfs->framenum, GP_GETFRAME_ADD_NEW);
if (gpf) {
bGPDstroke *gps, *gpsn;
diff --git a/source/blender/editors/gpencil/gpencil_add_monkey.c b/source/blender/editors/gpencil/gpencil_add_monkey.c
index 78286e3f672..048e933db9a 100644
--- a/source/blender/editors/gpencil/gpencil_add_monkey.c
+++ b/source/blender/editors/gpencil/gpencil_add_monkey.c
@@ -1438,13 +1438,16 @@ void ED_gpencil_create_monkey(bContext *C, float mat[4][4])
int color_Eyes = gpencil_monkey_color(bmain, ob, &gp_monkey_pct_eyes);
int color_Pupils = gpencil_monkey_color(bmain, ob, &gp_monkey_pct_pupils);
+ /* set first color as active */
+ ob->actcol = color_Black + 1;
+
/* layers */
/* NOTE: For now, we just add new layers, to make it easier to separate out old/new instances */
bGPDlayer *Colors = BKE_gpencil_layer_addnew(gpd, "Colors", false);
bGPDlayer *Lines = BKE_gpencil_layer_addnew(gpd, "Lines", true);
/* frames */
- /* NOTE: No need to check for existing, as this will tkae care of it for us */
+ /* NOTE: No need to check for existing, as this will take care of it for us */
bGPDframe *frameColor = BKE_gpencil_frame_addnew(Colors, cfra_eval);
bGPDframe *frameLines = BKE_gpencil_frame_addnew(Lines, cfra_eval);
diff --git a/source/blender/editors/gpencil/gpencil_add_stroke.c b/source/blender/editors/gpencil/gpencil_add_stroke.c
index 310abbe60f1..6c3107c602b 100644
--- a/source/blender/editors/gpencil/gpencil_add_stroke.c
+++ b/source/blender/editors/gpencil/gpencil_add_stroke.c
@@ -229,6 +229,9 @@ void ED_gpencil_create_stroke(bContext *C, float mat[4][4])
gp_stroke_material(bmain, ob, &gp_stroke_material_blue);
gp_stroke_material(bmain, ob, &gp_stroke_material_grey);
+ /* set first color as active */
+ ob->actcol = color_black + 1;
+
/* layers */
bGPDlayer *colors = BKE_gpencil_layer_addnew(gpd, "Colors", false);
bGPDlayer *lines = BKE_gpencil_layer_addnew(gpd, "Lines", true);
diff --git a/source/blender/editors/gpencil/gpencil_armature.c b/source/blender/editors/gpencil/gpencil_armature.c
index b55239deadc..d69f64f3eaf 100644
--- a/source/blender/editors/gpencil/gpencil_armature.c
+++ b/source/blender/editors/gpencil/gpencil_armature.c
@@ -144,7 +144,7 @@ static int gpencil_bone_skinnable_cb(Object *UNUSED(ob), Bone *bone, void *datap
if (!(bone->flag & BONE_HIDDEN_P)) {
if (!(bone->flag & BONE_NO_DEFORM)) {
if (data->heat && data->armob->pose &&
- BKE_pose_channel_find_name(data->armob->pose, bone->name))
+ BKE_pose_channel_find_name(data->armob->pose, bone->name))
{
segments = bone->segments;
}
@@ -157,7 +157,7 @@ static int gpencil_bone_skinnable_cb(Object *UNUSED(ob), Bone *bone, void *datap
for (a = 0; a < segments; a++) {
**hbone = bone;
- ++*hbone;
+ (*hbone)++;
}
}
return segments;
@@ -214,7 +214,7 @@ static int dgroup_skinnable_cb(Object *ob, Bone *bone, void *datap)
if (!(bone->flag & BONE_HIDDEN_P)) {
if (!(bone->flag & BONE_NO_DEFORM)) {
if (data->heat && data->armob->pose &&
- BKE_pose_channel_find_name(data->armob->pose, bone->name))
+ BKE_pose_channel_find_name(data->armob->pose, bone->name))
{
segments = bone->segments;
}
@@ -237,7 +237,7 @@ static int dgroup_skinnable_cb(Object *ob, Bone *bone, void *datap)
for (a = 0; a < segments; a++) {
**hgroup = defgroup;
- ++*hgroup;
+ (*hgroup)++;
}
}
return segments;
@@ -269,7 +269,7 @@ static void gpencil_add_verts_to_dgroups(
bDeformGroup **dgrouplist;
bPoseChannel *pchan;
bGPdata *gpd = (bGPdata *)ob->data;
- bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
Mat4 bbone_array[MAX_BBONE_SUBDIV], *bbone = NULL;
float(*root)[3], (*tip)[3], (*verts)[3];
@@ -319,11 +319,11 @@ static void gpencil_add_verts_to_dgroups(
bbone = NULL;
if ((ob_arm->pose) &&
- (pchan = BKE_pose_channel_find_name(ob_arm->pose, bone->name)))
+ (pchan = BKE_pose_channel_find_name(ob_arm->pose, bone->name)))
{
if (bone->segments > 1) {
segments = bone->segments;
- b_bone_spline_setup(pchan, 1, bbone_array);
+ b_bone_spline_setup(pchan, true, bbone_array);
bbone = bbone_array;
}
}
@@ -366,7 +366,7 @@ static void gpencil_add_verts_to_dgroups(
for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) {
if ((gpf == gpl->actframe) ||
- ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit)))
+ ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit)))
{
if (gpf == NULL)
@@ -461,14 +461,15 @@ static void gpencil_object_vgroup_calc_from_armature(
const int defbase_tot = BLI_listbase_count(&ob->defbase);
int defbase_add;
/* Traverse the bone list, trying to create empty vertex
- * groups corresponding to the bone.
- */
- defbase_add = gpencil_bone_looper(ob, arm->bonebase.first, NULL,
- vgroup_add_unique_bone_cb);
+ * groups corresponding to the bone.
+ */
+ defbase_add = gpencil_bone_looper(
+ ob, arm->bonebase.first, NULL,
+ vgroup_add_unique_bone_cb);
if (defbase_add) {
/* its possible there are DWeight's outside the range of the current
- * objects deform groups, in this case the new groups wont be empty */
+ * objects deform groups, in this case the new groups wont be empty */
ED_vgroup_data_clamp_range(ob->data, defbase_tot);
}
@@ -493,11 +494,12 @@ bool ED_gpencil_add_armature_weights(
/* if no armature modifier, add a new one */
GpencilModifierData *md = BKE_gpencil_modifiers_findByType(ob, eGpencilModifierType_Armature);
if (md == NULL) {
- md = ED_object_gpencil_modifier_add(reports, bmain, scene,
- ob, "Armature", eGpencilModifierType_Armature);
+ md = ED_object_gpencil_modifier_add(
+ reports, bmain, scene,
+ ob, "Armature", eGpencilModifierType_Armature);
if (md == NULL) {
BKE_report(reports, RPT_ERROR,
- "Unable to add a new Armature modifier to object");
+ "Unable to add a new Armature modifier to object");
return false;
}
DEG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA);
@@ -511,7 +513,7 @@ bool ED_gpencil_add_armature_weights(
else {
if (ob_arm != mmd->object) {
BKE_report(reports, RPT_ERROR,
- "The existing Armature modifier is already using a different Armature object");
+ "The existing Armature modifier is already using a different Armature object");
return false;
}
}
@@ -525,6 +527,11 @@ bool ED_gpencil_add_armature_weights(
static bool gpencil_generate_weights_poll(bContext *C)
{
Object *ob = CTX_data_active_object(C);
+
+ if (ob->type != OB_GPENCIL) {
+ return false;
+ }
+
ViewLayer *view_layer = CTX_data_view_layer(C);
bGPdata *gpd = (bGPdata *)ob->data;
@@ -586,7 +593,7 @@ static int gpencil_generate_weights_exec(bContext *C, wmOperator *op)
if (ob_arm == NULL) {
BKE_report(op->reports, RPT_ERROR,
- "No Armature object in the view layer");
+ "No Armature object in the view layer");
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/gpencil/gpencil_brush.c b/source/blender/editors/gpencil/gpencil_brush.c
index 6eff4d3687f..8e2cc8fd143 100644
--- a/source/blender/editors/gpencil/gpencil_brush.c
+++ b/source/blender/editors/gpencil/gpencil_brush.c
@@ -56,15 +56,14 @@
#include "DNA_gpencil_types.h"
#include "DNA_object_types.h"
+#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_gpencil.h"
-#include "BKE_library.h"
+#include "BKE_material.h"
+#include "BKE_object_deform.h"
#include "BKE_report.h"
#include "BKE_screen.h"
-#include "BKE_object_deform.h"
-#include "BKE_colortools.h"
-#include "BKE_material.h"
#include "UI_interface.h"
@@ -109,7 +108,7 @@ typedef struct tGP_BrushEditData {
/* Brush Settings */
GP_BrushEdit_Settings *settings;
- GP_EditBrush_Data *brush;
+ GP_EditBrush_Data *gp_brush;
eGP_EditBrush_Types brush_type;
eGP_EditBrush_Flag flag;
@@ -168,8 +167,9 @@ typedef struct tGP_BrushEditData {
/* Callback for performing some brush operation on a single point */
-typedef bool (*GP_BrushApplyCb)(tGP_BrushEditData *gso, bGPDstroke *gps, int pt_index,
- const int radius, const int co[2]);
+typedef bool (*GP_BrushApplyCb)(
+ tGP_BrushEditData *gso, bGPDstroke *gps, int pt_index,
+ const int radius, const int co[2]);
/* ************************************************ */
/* Utility Functions */
@@ -208,15 +208,15 @@ static GP_BrushEdit_Settings *gpsculpt_get_settings(Scene *scene)
static GP_EditBrush_Data *gpsculpt_get_brush(Scene *scene, bool is_weight_mode)
{
GP_BrushEdit_Settings *gset = &scene->toolsettings->gp_sculpt;
- GP_EditBrush_Data *brush = NULL;
+ GP_EditBrush_Data *gp_brush = NULL;
if (is_weight_mode) {
- brush = &gset->brush[gset->weighttype];
+ gp_brush = &gset->brush[gset->weighttype];
}
else {
- brush = &gset->brush[gset->brushtype];
+ gp_brush = &gset->brush[gset->brushtype];
}
- return brush;
+ return gp_brush;
}
/* Brush Operations ------------------------------- */
@@ -225,7 +225,7 @@ static GP_EditBrush_Data *gpsculpt_get_brush(Scene *scene, bool is_weight_mode)
static bool gp_brush_invert_check(tGP_BrushEditData *gso)
{
/* The basic setting is the brush's setting (from the panel) */
- bool invert = ((gso->brush->flag & GP_EDITBRUSH_FLAG_INVERT) != 0);
+ bool invert = ((gso->gp_brush->flag & GP_EDITBRUSH_FLAG_INVERT) != 0);
/* During runtime, the user can hold down the Ctrl key to invert the basic behaviour */
if (gso->flag & GP_EDITBRUSH_FLAG_INVERT) {
@@ -234,10 +234,10 @@ static bool gp_brush_invert_check(tGP_BrushEditData *gso)
/* set temporary status */
if (invert) {
- gso->brush->flag |= GP_EDITBRUSH_FLAG_TMP_INVERT;
+ gso->gp_brush->flag |= GP_EDITBRUSH_FLAG_TMP_INVERT;
}
else {
- gso->brush->flag &= ~GP_EDITBRUSH_FLAG_TMP_INVERT;
+ gso->gp_brush->flag &= ~GP_EDITBRUSH_FLAG_TMP_INVERT;
}
return invert;
@@ -246,18 +246,18 @@ static bool gp_brush_invert_check(tGP_BrushEditData *gso)
/* Compute strength of effect */
static float gp_brush_influence_calc(tGP_BrushEditData *gso, const int radius, const int co[2])
{
- GP_EditBrush_Data *brush = gso->brush;
+ GP_EditBrush_Data *gp_brush = gso->gp_brush;
/* basic strength factor from brush settings */
- float influence = brush->strength;
+ float influence = gp_brush->strength;
/* use pressure? */
- if (brush->flag & GP_EDITBRUSH_FLAG_USE_PRESSURE) {
+ if (gp_brush->flag & GP_EDITBRUSH_FLAG_USE_PRESSURE) {
influence *= gso->pressure;
}
/* distance fading */
- if (brush->flag & GP_EDITBRUSH_FLAG_USE_FALLOFF) {
+ if (gp_brush->flag & GP_EDITBRUSH_FLAG_USE_FALLOFF) {
float distance = (float)len_v2v2_int(gso->mval, co);
float fac;
@@ -288,7 +288,7 @@ static bool gp_brush_smooth_apply(
tGP_BrushEditData *gso, bGPDstroke *gps, int pt_index,
const int radius, const int co[2])
{
- // GP_EditBrush_Data *brush = gso->brush;
+ // GP_EditBrush_Data *gp_brush = gso->brush;
float inf = gp_brush_influence_calc(gso, radius, co);
/* need one flag enabled by default */
if ((gso->settings->flag &
@@ -885,9 +885,9 @@ static bool gp_brush_weight_apply(
float inf;
/* Compute strength of effect
- * - We divide the strength by 10, so that users can set "sane" values.
- * Otherwise, good default values are in the range of 0.093
- */
+ * - We divide the strength by 10, so that users can set "sane" values.
+ * Otherwise, good default values are in the range of 0.093
+ */
inf = gp_brush_influence_calc(gso, radius, co) / 10.0f;
/* need a vertex group */
@@ -1032,7 +1032,7 @@ static void gp_brush_clone_add(bContext *C, tGP_BrushEditData *gso)
Depsgraph *depsgraph = CTX_data_depsgraph(C);
int cfra_eval = (int)DEG_get_ctime(depsgraph);
- bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, true);
+ bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, GP_GETFRAME_ADD_NEW);
bGPDstroke *gps;
float delta[3];
@@ -1108,7 +1108,7 @@ static void gp_brush_clone_adjust(tGP_BrushEditData *gso)
int i;
for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
- if (gso->brush->flag & GP_EDITBRUSH_FLAG_USE_FALLOFF) {
+ if (gso->gp_brush->flag & GP_EDITBRUSH_FLAG_USE_FALLOFF) {
/* "Smudge" Effect when falloff is enabled */
float delta[3] = {0.0f};
int sco[2] = {0};
@@ -1116,7 +1116,7 @@ static void gp_brush_clone_adjust(tGP_BrushEditData *gso)
/* compute influence on point */
gp_point_to_xy(&gso->gsc, gps, pt, &sco[0], &sco[1]);
- influence = gp_brush_influence_calc(gso, gso->brush->size, sco);
+ influence = gp_brush_influence_calc(gso, gso->gp_brush->size, sco);
/* adjust the amount of displacement to apply */
mul_v3_v3fl(delta, gso->dvec, influence);
@@ -1141,7 +1141,7 @@ static bool gpsculpt_brush_apply_clone(bContext *C, tGP_BrushEditData *gso)
gp_brush_clone_add(C, gso);
}
else {
- /* Stamp or Continous Mode */
+ /* Stamp or Continuous Mode */
if (1 /*gso->brush->mode == GP_EDITBRUSH_CLONE_MODE_STAMP*/) {
/* Stamp - Proceed to translate the newly added strokes */
gp_brush_clone_adjust(gso);
@@ -1209,7 +1209,7 @@ static bool gpsculpt_brush_init(bContext *C, wmOperator *op)
gso->depsgraph = CTX_data_depsgraph(C);
/* store state */
gso->settings = gpsculpt_get_settings(scene);
- gso->brush = gpsculpt_get_brush(scene, is_weight_mode);
+ gso->gp_brush = gpsculpt_get_brush(scene, is_weight_mode);
if (is_weight_mode) {
gso->brush_type = gso->settings->weighttype;
@@ -1220,7 +1220,7 @@ static bool gpsculpt_brush_init(bContext *C, wmOperator *op)
/* Random generator, only init once. */
uint rng_seed = (uint)(PIL_check_seconds_timer_i() & UINT_MAX);
- rng_seed ^= GET_UINT_FROM_POINTER(gso);
+ rng_seed ^= POINTER_AS_UINT(gso);
gso->rng = BLI_rng_new(rng_seed);
gso->is_painting = false;
@@ -1229,6 +1229,11 @@ static bool gpsculpt_brush_init(bContext *C, wmOperator *op)
gso->gpd = ED_gpencil_data_get_active(C);
gso->cfra = INT_MAX; /* NOTE: So that first stroke will get handled in init_stroke() */
+ /* some brushes cannot use pressure for radius */
+ if (ELEM(gso->brush_type, GP_EDITBRUSH_TYPE_GRAB, GP_EDITBRUSH_TYPE_CLONE)) {
+ gso->gp_brush->flag &= ~GP_EDITBRUSH_FLAG_PRESSURE_RADIUS;
+ }
+
gso->scene = scene;
gso->object = ob;
if (ob) {
@@ -1358,7 +1363,7 @@ static void gpsculpt_brush_exit(bContext *C, wmOperator *op)
}
/* disable temp invert flag */
- gso->brush->flag &= ~GP_EDITBRUSH_FLAG_TMP_INVERT;
+ gso->gp_brush->flag &= ~GP_EDITBRUSH_FLAG_TMP_INVERT;
/* free operator data */
MEM_freeN(gso);
@@ -1415,7 +1420,8 @@ static bool gpsculpt_brush_do_stroke(
{
GP_SpaceConversion *gsc = &gso->gsc;
rcti *rect = &gso->brush_rect;
- const int radius = gso->brush->size;
+ GP_EditBrush_Data *gp_brush = gso->gp_brush;
+ const int radius = (gp_brush->flag & GP_EDITBRUSH_FLAG_PRESSURE_RADIUS) ? gso->gp_brush->size * gso->pressure : gso->gp_brush->size;
bGPDspoint *pt1, *pt2;
int pc1[2] = {0};
@@ -1614,7 +1620,7 @@ static bool gpsculpt_brush_do_frame(
static bool gpsculpt_brush_apply_standard(bContext *C, tGP_BrushEditData *gso)
{
ToolSettings *ts = CTX_data_tool_settings(C);
- Depsgraph *depsgraph = CTX_data_depsgraph(C); \
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
Object *obact = gso->object;
bGPdata *gpd = gso->gpd;
bool changed = false;
@@ -1678,9 +1684,9 @@ static bool gpsculpt_brush_apply_standard(bContext *C, tGP_BrushEditData *gso)
if (gso->use_multiframe_falloff) {
/* Faloff depends on distance to active frame (relative to the overall frame range) */
gso->mf_falloff = BKE_gpencil_multiframe_falloff_calc(
- gpf, gpl->actframe->framenum,
- f_init, f_end,
- ts->gp_sculpt.cur_falloff);
+ gpf, gpl->actframe->framenum,
+ f_init, f_end,
+ ts->gp_sculpt.cur_falloff);
}
else {
/* No falloff */
@@ -1707,7 +1713,10 @@ static bool gpsculpt_brush_apply_standard(bContext *C, tGP_BrushEditData *gso)
static void gpsculpt_brush_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
{
tGP_BrushEditData *gso = op->customdata;
- const int radius = gso->brush->size;
+ GP_EditBrush_Data *gp_brush = gso->gp_brush;
+ const int radius = (
+ (gp_brush->flag & GP_EDITBRUSH_FLAG_PRESSURE_RADIUS) ?
+ gso->gp_brush->size * gso->pressure : gso->gp_brush->size);
float mousef[2];
int mouse[2];
bool changed = false;
@@ -1935,13 +1944,13 @@ static int gpsculpt_brush_modal(bContext *C, wmOperator *op, const wmEvent *even
case PADPLUSKEY:
if (event->shift) {
/* increase strength */
- gso->brush->strength += 0.05f;
- CLAMP_MAX(gso->brush->strength, 1.0f);
+ gso->gp_brush->strength += 0.05f;
+ CLAMP_MAX(gso->gp_brush->strength, 1.0f);
}
else {
/* increase brush size */
- gso->brush->size += 3;
- CLAMP_MAX(gso->brush->size, 300);
+ gso->gp_brush->size += 3;
+ CLAMP_MAX(gso->gp_brush->size, 300);
}
redraw_region = true;
@@ -1952,13 +1961,13 @@ static int gpsculpt_brush_modal(bContext *C, wmOperator *op, const wmEvent *even
case PADMINUS:
if (event->shift) {
/* decrease strength */
- gso->brush->strength -= 0.05f;
- CLAMP_MIN(gso->brush->strength, 0.0f);
+ gso->gp_brush->strength -= 0.05f;
+ CLAMP_MIN(gso->gp_brush->strength, 0.0f);
}
else {
/* decrease brush size */
- gso->brush->size -= 3;
- CLAMP_MIN(gso->brush->size, 1);
+ gso->gp_brush->size -= 3;
+ CLAMP_MIN(gso->gp_brush->size, 1);
}
redraw_region = true;
@@ -2026,13 +2035,13 @@ static int gpsculpt_brush_modal(bContext *C, wmOperator *op, const wmEvent *even
case PADPLUSKEY:
if (event->shift) {
/* increase strength */
- gso->brush->strength += 0.05f;
- CLAMP_MAX(gso->brush->strength, 1.0f);
+ gso->gp_brush->strength += 0.05f;
+ CLAMP_MAX(gso->gp_brush->strength, 1.0f);
}
else {
/* increase brush size */
- gso->brush->size += 3;
- CLAMP_MAX(gso->brush->size, 300);
+ gso->gp_brush->size += 3;
+ CLAMP_MAX(gso->gp_brush->size, 300);
}
redraw_region = true;
@@ -2043,13 +2052,13 @@ static int gpsculpt_brush_modal(bContext *C, wmOperator *op, const wmEvent *even
case PADMINUS:
if (event->shift) {
/* decrease strength */
- gso->brush->strength -= 0.05f;
- CLAMP_MIN(gso->brush->strength, 0.0f);
+ gso->gp_brush->strength -= 0.05f;
+ CLAMP_MIN(gso->gp_brush->strength, 0.0f);
}
else {
/* decrease brush size */
- gso->brush->size -= 3;
- CLAMP_MIN(gso->brush->size, 1);
+ gso->gp_brush->size -= 3;
+ CLAMP_MIN(gso->gp_brush->size, 1);
}
redraw_region = true;
diff --git a/source/blender/editors/gpencil/gpencil_convert.c b/source/blender/editors/gpencil/gpencil_convert.c
index afce0fb7a43..9ec2915b60c 100644
--- a/source/blender/editors/gpencil/gpencil_convert.c
+++ b/source/blender/editors/gpencil/gpencil_convert.c
@@ -64,7 +64,6 @@
#include "BKE_global.h"
#include "BKE_gpencil.h"
#include "BKE_layer.h"
-#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_object.h"
#include "BKE_report.h"
@@ -134,8 +133,9 @@ static const EnumPropertyItem prop_gpencil_convert_timingmodes[] = {
{0, NULL, 0, NULL, NULL},
};
-static const EnumPropertyItem *rna_GPConvert_mode_items(bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop),
- bool *UNUSED(r_free))
+static const EnumPropertyItem *rna_GPConvert_mode_items(
+ bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop),
+ bool *UNUSED(r_free))
{
if (RNA_boolean_get(ptr, "use_timing_data")) {
return prop_gpencil_convert_timingmodes;
@@ -155,7 +155,7 @@ static void gp_strokepoint_convertcoords(
Scene *scene = CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
ARegion *ar = CTX_wm_region(C);
- Depsgraph *depsgraph = CTX_data_depsgraph(C); \
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
Object *obact = CTX_data_active_object(C);
bGPDspoint mypt, *pt;
@@ -254,8 +254,9 @@ static void gp_timing_data_set_nbr(tGpTimingData *gtd, const int nbr)
}
/* add stroke point to timing buffers */
-static void gp_timing_data_add_point(tGpTimingData *gtd, const double stroke_inittime, const float time,
- const float delta_dist)
+static void gp_timing_data_add_point(
+ tGpTimingData *gtd, const double stroke_inittime, const float time,
+ const float delta_dist)
{
float delta_time = 0.0f;
const int cur_point = gtd->cur_point;
@@ -290,9 +291,10 @@ static void gp_timing_data_add_point(tGpTimingData *gtd, const double stroke_ini
#define MIN_TIME_DELTA 0.02f
/* Loop over next points to find the end of the stroke, and compute */
-static int gp_find_end_of_stroke_idx(tGpTimingData *gtd, RNG *rng, const int idx, const int nbr_gaps,
- int *nbr_done_gaps, const float tot_gaps_time, const float delta_time,
- float *next_delta_time)
+static int gp_find_end_of_stroke_idx(
+ tGpTimingData *gtd, RNG *rng, const int idx, const int nbr_gaps,
+ int *nbr_done_gaps, const float tot_gaps_time, const float delta_time,
+ float *next_delta_time)
{
int j;
@@ -370,9 +372,10 @@ static void gp_stroke_path_animation_preprocess_gaps(tGpTimingData *gtd, RNG *rn
}
}
-static void gp_stroke_path_animation_add_keyframes(Depsgraph *depsgraph, ReportList *reports, PointerRNA ptr, PropertyRNA *prop, FCurve *fcu,
- Curve *cu, tGpTimingData *gtd, RNG *rng, const float time_range,
- const int nbr_gaps, const float tot_gaps_time)
+static void gp_stroke_path_animation_add_keyframes(
+ Depsgraph *depsgraph, ReportList *reports, PointerRNA ptr, PropertyRNA *prop, FCurve *fcu,
+ Curve *cu, tGpTimingData *gtd, RNG *rng, const float time_range,
+ const int nbr_gaps, const float tot_gaps_time)
{
/* Use actual recorded timing! */
const float time_start = (float)gtd->start_frame;
@@ -398,8 +401,9 @@ static void gp_stroke_path_animation_add_keyframes(Depsgraph *depsgraph, ReportL
start_stroke_idx = i;
delta_time = next_delta_time;
/* find end of that new stroke */
- end_stroke_idx = gp_find_end_of_stroke_idx(gtd, rng, i, nbr_gaps, &nbr_done_gaps,
- tot_gaps_time, delta_time, &next_delta_time);
+ end_stroke_idx = gp_find_end_of_stroke_idx(
+ gtd, rng, i, nbr_gaps, &nbr_done_gaps,
+ tot_gaps_time, delta_time, &next_delta_time);
/* This one should *never* be negative! */
end_stroke_time = time_start + ((gtd->times[end_stroke_idx] + delta_time) / gtd->tot_time * time_range);
}
@@ -478,7 +482,7 @@ static void gp_stroke_path_animation(bContext *C, ReportList *reports, Curve *cu
/* Ensure we have an F-Curve to add keyframes to */
act = verify_adt_action(bmain, (ID *)cu, true);
- fcu = verify_fcurve(act, NULL, &ptr, "eval_time", 0, true);
+ fcu = verify_fcurve(bmain, act, NULL, &ptr, "eval_time", 0, true);
if (G.debug & G_DEBUG) {
printf("%s: tot len: %f\t\ttot time: %f\n", __func__, gtd->tot_dist, gtd->tot_time);
@@ -530,8 +534,9 @@ static void gp_stroke_path_animation(bContext *C, ReportList *reports, Curve *cu
printf("GP Stroke Path Conversion: Starting keying!\n");
}
- gp_stroke_path_animation_add_keyframes(depsgraph, reports, ptr, prop, fcu, cu, gtd, rng, time_range,
- nbr_gaps, tot_gaps_time);
+ gp_stroke_path_animation_add_keyframes(
+ depsgraph, reports, ptr, prop, fcu, cu, gtd, rng, time_range,
+ nbr_gaps, tot_gaps_time);
BLI_rng_free(rng);
}
@@ -562,9 +567,10 @@ static void gp_stroke_path_animation(bContext *C, ReportList *reports, Curve *cu
/* convert stroke to 3d path */
/* helper */
-static void gp_stroke_to_path_add_point(tGpTimingData *gtd, BPoint *bp, const float p[3], const float prev_p[3],
- const bool do_gtd, const double inittime, const float time,
- const float width, const float rad_fac, float minmax_weights[2])
+static void gp_stroke_to_path_add_point(
+ tGpTimingData *gtd, BPoint *bp, const float p[3], const float prev_p[3],
+ const bool do_gtd, const double inittime, const float time,
+ const float width, const float rad_fac, float minmax_weights[2])
{
copy_v3_v3(bp->vec, p);
bp->vec[3] = 1.0f;
@@ -587,9 +593,10 @@ static void gp_stroke_to_path_add_point(tGpTimingData *gtd, BPoint *bp, const fl
}
}
-static void gp_stroke_to_path(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstroke *gps, Curve *cu, rctf *subrect, Nurb **curnu,
- float minmax_weights[2], const float rad_fac, bool stitch, const bool add_start_point,
- const bool add_end_point, tGpTimingData *gtd)
+static void gp_stroke_to_path(
+ bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstroke *gps, Curve *cu, rctf *subrect, Nurb **curnu,
+ float minmax_weights[2], const float rad_fac, bool stitch, const bool add_start_point,
+ const bool add_end_point, tGpTimingData *gtd)
{
bGPDspoint *pt;
Nurb *nu = (curnu) ? *curnu : NULL;
@@ -666,8 +673,9 @@ static void gp_stroke_to_path(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstr
}
}
bp++;
- gp_stroke_to_path_add_point(gtd, bp, p1, (bp - 1)->vec, do_gtd, gps->prev->inittime, dt1,
- 0.0f, rad_fac, minmax_weights);
+ gp_stroke_to_path_add_point(
+ gtd, bp, p1, (bp - 1)->vec, do_gtd, gps->prev->inittime, dt1,
+ 0.0f, rad_fac, minmax_weights);
/* Second point */
/* Note dt2 is always negative, which marks the gap. */
@@ -729,8 +737,9 @@ static void gp_stroke_to_path(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstr
/* get coordinates to add at */
gp_strokepoint_convertcoords(C, gpd, gpl, gps, pt, p, subrect);
- gp_stroke_to_path_add_point(gtd, bp, p, (prev_bp) ? prev_bp->vec : p, do_gtd, gps->inittime, pt->time,
- width, rad_fac, minmax_weights);
+ gp_stroke_to_path_add_point(
+ gtd, bp, p, (prev_bp) ? prev_bp->vec : p, do_gtd, gps->inittime, pt->time,
+ width, rad_fac, minmax_weights);
prev_bp = bp;
}
@@ -769,10 +778,11 @@ static void gp_stroke_to_path(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstr
/* convert stroke to 3d bezier */
/* helper */
-static void gp_stroke_to_bezier_add_point(tGpTimingData *gtd, BezTriple *bezt,
- const float p[3], const float h1[3], const float h2[3], const float prev_p[3],
- const bool do_gtd, const double inittime, const float time,
- const float width, const float rad_fac, float minmax_weights[2])
+static void gp_stroke_to_bezier_add_point(
+ tGpTimingData *gtd, BezTriple *bezt,
+ const float p[3], const float h1[3], const float h2[3], const float prev_p[3],
+ const bool do_gtd, const double inittime, const float time,
+ const float width, const float rad_fac, float minmax_weights[2])
{
copy_v3_v3(bezt->vec[0], h1);
copy_v3_v3(bezt->vec[1], p);
@@ -797,9 +807,10 @@ static void gp_stroke_to_bezier_add_point(tGpTimingData *gtd, BezTriple *bezt,
}
}
-static void gp_stroke_to_bezier(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstroke *gps, Curve *cu, rctf *subrect, Nurb **curnu,
- float minmax_weights[2], const float rad_fac, bool stitch, const bool add_start_point,
- const bool add_end_point, tGpTimingData *gtd)
+static void gp_stroke_to_bezier(
+ bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstroke *gps, Curve *cu, rctf *subrect, Nurb **curnu,
+ float minmax_weights[2], const float rad_fac, bool stitch, const bool add_start_point,
+ const bool add_end_point, tGpTimingData *gtd)
{
bGPDspoint *pt;
Nurb *nu = (curnu) ? *curnu : NULL;
@@ -918,15 +929,17 @@ static void gp_stroke_to_bezier(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDs
interp_v3_v3v3(h1, p1, bezt->vec[1], BEZT_HANDLE_FAC);
interp_v3_v3v3(h2, p1, p2, BEZT_HANDLE_FAC);
bezt++;
- gp_stroke_to_bezier_add_point(gtd, bezt, p1, h1, h2, (bezt - 1)->vec[1], do_gtd, gps->prev->inittime, dt1,
- 0.0f, rad_fac, minmax_weights);
+ gp_stroke_to_bezier_add_point(
+ gtd, bezt, p1, h1, h2, (bezt - 1)->vec[1], do_gtd, gps->prev->inittime, dt1,
+ 0.0f, rad_fac, minmax_weights);
/* Second point */
interp_v3_v3v3(h1, p2, p1, BEZT_HANDLE_FAC);
interp_v3_v3v3(h2, p2, p3d_cur, BEZT_HANDLE_FAC);
bezt++;
- gp_stroke_to_bezier_add_point(gtd, bezt, p2, h1, h2, p1, do_gtd, gps->inittime, dt2,
- 0.0f, rad_fac, minmax_weights);
+ gp_stroke_to_bezier_add_point(
+ gtd, bezt, p2, h1, h2, p1, do_gtd, gps->inittime, dt2,
+ 0.0f, rad_fac, minmax_weights);
old_nbezt += 2;
copy_v3_v3(p3d_prev, p2);
@@ -950,8 +963,9 @@ static void gp_stroke_to_bezier(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDs
interp_v3_v3v3(h1, p, p3d_cur, -BEZT_HANDLE_FAC);
interp_v3_v3v3(h2, p, p3d_cur, BEZT_HANDLE_FAC);
bezt = &nu->bezt[old_nbezt];
- gp_stroke_to_bezier_add_point(gtd, bezt, p, h1, h2, p, do_gtd, gps->inittime, dt,
- 0.0f, rad_fac, minmax_weights);
+ gp_stroke_to_bezier_add_point(
+ gtd, bezt, p, h1, h2, p, do_gtd, gps->inittime, dt,
+ 0.0f, rad_fac, minmax_weights);
old_nbezt++;
copy_v3_v3(p3d_prev, p);
@@ -979,8 +993,9 @@ static void gp_stroke_to_bezier(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDs
interp_v3_v3v3(h2, p3d_cur, p3d_prev, -BEZT_HANDLE_FAC);
}
- gp_stroke_to_bezier_add_point(gtd, bezt, p3d_cur, h1, h2, prev_bezt ? prev_bezt->vec[1] : p3d_cur,
- do_gtd, gps->inittime, pt->time, width, rad_fac, minmax_weights);
+ gp_stroke_to_bezier_add_point(
+ gtd, bezt, p3d_cur, h1, h2, prev_bezt ? prev_bezt->vec[1] : p3d_cur,
+ do_gtd, gps->inittime, pt->time, width, rad_fac, minmax_weights);
/* shift coord vects */
copy_v3_v3(p3d_prev, p3d_cur);
@@ -1018,8 +1033,9 @@ static void gp_stroke_to_bezier(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDs
interp_v3_v3v3(h1, p, prev_bezt->vec[1], BEZT_HANDLE_FAC);
interp_v3_v3v3(h2, p, prev_bezt->vec[1], -BEZT_HANDLE_FAC);
/* Note bezt has already been incremented in main loop above, so it points to the right place. */
- gp_stroke_to_bezier_add_point(gtd, bezt, p, h1, h2, prev_bezt->vec[1], do_gtd, gps->inittime, dt,
- 0.0f, rad_fac, minmax_weights);
+ gp_stroke_to_bezier_add_point(
+ gtd, bezt, p, h1, h2, prev_bezt->vec[1], do_gtd, gps->inittime, dt,
+ 0.0f, rad_fac, minmax_weights);
}
/* must calculate handles or else we crash */
@@ -1122,8 +1138,9 @@ static int gp_camera_view_subrect(bContext *C, rctf *subrect)
}
/* convert a given grease-pencil layer to a 3d-curve representation (using current view if appropriate) */
-static void gp_layer_to_curve(bContext *C, ReportList *reports, bGPdata *gpd, bGPDlayer *gpl, const int mode,
- const bool norm_weights, const float rad_fac, const bool link_strokes, tGpTimingData *gtd)
+static void gp_layer_to_curve(
+ bContext *C, ReportList *reports, bGPdata *gpd, bGPDlayer *gpl, const int mode,
+ const bool norm_weights, const float rad_fac, const bool link_strokes, tGpTimingData *gtd)
{
struct Main *bmain = CTX_data_main(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
@@ -1131,7 +1148,7 @@ static void gp_layer_to_curve(bContext *C, ReportList *reports, bGPdata *gpd, bG
Depsgraph *depsgraph = CTX_data_depsgraph(C);
int cfra_eval = (int)DEG_get_ctime(depsgraph);
- bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, 0);
+ bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, GP_GETFRAME_USE_PREV);
bGPDstroke *gps, *prev_gps = NULL;
Object *ob;
Curve *cu;
@@ -1190,13 +1207,15 @@ static void gp_layer_to_curve(bContext *C, ReportList *reports, bGPdata *gpd, bG
switch (mode) {
case GP_STROKECONVERT_PATH:
- gp_stroke_to_path(C, gpd, gpl, gps, cu, subrect_ptr, &nu, minmax_weights, rad_fac, stitch,
- add_start_point, add_end_point, gtd);
+ gp_stroke_to_path(
+ C, gpd, gpl, gps, cu, subrect_ptr, &nu, minmax_weights, rad_fac, stitch,
+ add_start_point, add_end_point, gtd);
break;
case GP_STROKECONVERT_CURVE:
case GP_STROKECONVERT_POLY: /* convert after */
- gp_stroke_to_bezier(C, gpd, gpl, gps, cu, subrect_ptr, &nu, minmax_weights, rad_fac, stitch,
- add_start_point, add_end_point, gtd);
+ gp_stroke_to_bezier(
+ C, gpd, gpl, gps, cu, subrect_ptr, &nu, minmax_weights, rad_fac, stitch,
+ add_start_point, add_end_point, gtd);
break;
default:
BLI_assert(!"invalid mode");
@@ -1246,7 +1265,7 @@ static bool gp_convert_check_has_valid_timing(bContext *C, bGPDlayer *gpl, wmOpe
int i;
bool valid = true;
- if (!gpl || !(gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, 0)) || !(gps = gpf->strokes.first))
+ if (!gpl || !(gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, GP_GETFRAME_USE_PREV)) || !(gps = gpf->strokes.first))
return false;
do {
@@ -1307,7 +1326,7 @@ static bool gp_convert_poll(bContext *C)
*/
return ((sa && sa->spacetype == SPACE_VIEW3D) &&
(gpl = BKE_gpencil_layer_getactive(gpd)) &&
- (gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, 0)) &&
+ (gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, GP_GETFRAME_USE_PREV)) &&
(gpf->strokes.first) &&
(OBEDIT_FROM_VIEW_LAYER(view_layer) == NULL));
}
diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c
index 818a694a899..20100354070 100644
--- a/source/blender/editors/gpencil/gpencil_data.c
+++ b/source/blender/editors/gpencil/gpencil_data.c
@@ -57,9 +57,8 @@
#include "DNA_space_types.h"
#include "DNA_view3d_types.h"
-#include "BKE_main.h"
-#include "BKE_brush.h"
#include "BKE_animsys.h"
+#include "BKE_brush.h"
#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_fcurve.h"
@@ -67,9 +66,10 @@
#include "BKE_gpencil.h"
#include "BKE_gpencil_modifier.h"
#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_material.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
-#include "BKE_material.h"
#include "BKE_paint.h"
#include "BKE_report.h"
#include "BKE_scene.h"
@@ -338,7 +338,7 @@ static int gp_layer_move_exec(bContext *C, wmOperator *op)
bGPdata *gpd = ED_gpencil_data_get_active(C);
bGPDlayer *gpl = BKE_gpencil_layer_getactive(gpd);
- int direction = RNA_enum_get(op->ptr, "type");
+ const int direction = RNA_enum_get(op->ptr, "type") * -1;
/* sanity checks */
if (ELEM(NULL, gpd, gpl))
@@ -479,7 +479,8 @@ static int gp_layer_duplicate_object_exec(bContext *C, wmOperator *op)
/* make copy of layer */
bGPDlayer *gpl_dst = MEM_dupallocN(gpl_src);
gpl_dst->prev = gpl_dst->next = NULL;
- gpl_dst->runtime.derived_data = NULL;
+ gpl_dst->runtime.derived_array = NULL;
+ gpl_dst->runtime.len_derived = 0;
BLI_addtail(&gpd_dst->layers, gpl_dst);
BLI_uniquename(&gpd_dst->layers, gpl_dst, DATA_("GP_Layer"), '.', offsetof(bGPDlayer, info), sizeof(gpl_dst->info));
@@ -596,9 +597,9 @@ static int gp_frame_duplicate_exec(bContext *C, wmOperator *op)
void GPENCIL_OT_frame_duplicate(wmOperatorType *ot)
{
static const EnumPropertyItem duplicate_mode[] = {
- { GP_FRAME_DUP_ACTIVE, "ACTIVE", 0, "Active", "Duplicate frame in active layer only" },
- { GP_FRAME_DUP_ALL, "ALL", 0, "All", "Duplicate active frames in all layers" },
- { 0, NULL, 0, NULL, NULL }
+ {GP_FRAME_DUP_ACTIVE, "ACTIVE", 0, "Active", "Duplicate frame in active layer only"},
+ {GP_FRAME_DUP_ALL, "ALL", 0, "All", "Duplicate active frames in all layers"},
+ {0, NULL, 0, NULL, NULL}
};
/* identifiers */
@@ -709,7 +710,7 @@ static int gp_frame_clean_loose_exec(bContext *C, wmOperator *op)
bool changed = false;
bGPdata *gpd = ED_gpencil_data_get_active(C);
int limit = RNA_int_get(op->ptr, "limit");
- bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
CTX_DATA_BEGIN(C, bGPDlayer *, gpl, editable_gpencil_layers)
{
@@ -1083,8 +1084,8 @@ void GPENCIL_OT_layer_isolate(wmOperatorType *ot)
static int gp_merge_layer_exec(bContext *C, wmOperator *op)
{
bGPdata *gpd = ED_gpencil_data_get_active(C);
- bGPDlayer *gpl_current = BKE_gpencil_layer_getactive(gpd);
- bGPDlayer *gpl_next = gpl_current->next;
+ bGPDlayer *gpl_next = BKE_gpencil_layer_getactive(gpd);
+ bGPDlayer *gpl_current = gpl_next->prev;
if (ELEM(NULL, gpd, gpl_current, gpl_next)) {
BKE_report(op->reports, RPT_ERROR, "No layers to merge");
@@ -1094,13 +1095,13 @@ static int gp_merge_layer_exec(bContext *C, wmOperator *op)
/* Collect frames of gpl_current in hash table to avoid O(n^2) lookups */
GHash *gh_frames_cur = BLI_ghash_int_new_ex(__func__, 64);
for (bGPDframe *gpf = gpl_current->frames.first; gpf; gpf = gpf->next) {
- BLI_ghash_insert(gh_frames_cur, SET_INT_IN_POINTER(gpf->framenum), gpf);
+ BLI_ghash_insert(gh_frames_cur, POINTER_FROM_INT(gpf->framenum), gpf);
}
/* read all frames from next layer and add any missing in current layer */
for (bGPDframe *gpf = gpl_next->frames.first; gpf; gpf = gpf->next) {
/* try to find frame in current layer */
- bGPDframe *frame = BLI_ghash_lookup(gh_frames_cur, SET_INT_IN_POINTER(gpf->framenum));
+ bGPDframe *frame = BLI_ghash_lookup(gh_frames_cur, POINTER_FROM_INT(gpf->framenum));
if (!frame) {
bGPDframe *actframe = BKE_gpencil_layer_getframe(gpl_current, gpf->framenum, GP_GETFRAME_USE_PREV);
frame = BKE_gpencil_frame_addnew(gpl_current, gpf->framenum);
@@ -1371,7 +1372,7 @@ static int gp_stroke_change_color_exec(bContext *C, wmOperator *op)
}
/* try to find slot */
int idx = BKE_gpencil_get_material_index(ob, ma) - 1;
- if (idx <= 0) {
+ if (idx < 0) {
return OPERATOR_CANCELLED;
}
@@ -1380,7 +1381,7 @@ static int gp_stroke_change_color_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
if (ELEM(NULL, ma)) {
return OPERATOR_CANCELLED;
}
@@ -1408,11 +1409,16 @@ static int gp_stroke_change_color_exec(bContext *C, wmOperator *op)
if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false)
continue;
- /* asign new color */
+ /* assign new color */
gps->mat_nr = idx;
}
}
}
+ /* if not multiedit, exit loop*/
+ if (!is_multiedit) {
+ break;
+ }
+
}
}
CTX_DATA_END;
@@ -1460,6 +1466,7 @@ static int gp_stroke_lock_color_exec(bContext *C, wmOperator *UNUSED(op))
for (short i = 0; i < *totcol; i++) {
Material *tmp_ma = give_current_material(ob, i + 1);
tmp_ma->gp_style->flag |= GP_STYLE_COLOR_LOCKED;
+ DEG_id_tag_update(&tmp_ma->id, DEG_TAG_COPY_ON_WRITE);
}
/* loop all selected strokes and unlock any color */
@@ -1477,10 +1484,17 @@ static int gp_stroke_lock_color_exec(bContext *C, wmOperator *UNUSED(op))
Material *tmp_ma = give_current_material(ob, gps->mat_nr + 1);
tmp_ma->gp_style->flag &= ~GP_STYLE_COLOR_LOCKED;
+ DEG_id_tag_update(&tmp_ma->id, DEG_TAG_COPY_ON_WRITE);
}
}
}
}
+ /* updates */
+ DEG_id_tag_update(&gpd->id, OB_RECALC_DATA);
+
+ /* copy on write tag is needed, or else no refresh happens */
+ DEG_id_tag_update(&gpd->id, DEG_TAG_COPY_ON_WRITE);
+
/* notifiers */
DEG_id_tag_update(&gpd->id, OB_RECALC_OB | OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
@@ -1532,103 +1546,6 @@ void GPENCIL_OT_brush_presets_create(wmOperatorType *ot)
}
-/* ***************** Select Brush ************************ */
-
-static int gp_brush_select_exec(bContext *C, wmOperator *op)
-{
- ToolSettings *ts = CTX_data_tool_settings(C);
- Main *bmain = CTX_data_main(C);
-
- /* if there's no existing container */
- if (ts == NULL) {
- BKE_report(op->reports, RPT_ERROR, "Nowhere to go");
- return OPERATOR_CANCELLED;
- }
-
- const int index = RNA_int_get(op->ptr, "index");
-
- Paint *paint = BKE_brush_get_gpencil_paint(ts);
- int i = 0;
- for (Brush *brush = bmain->brush.first; brush; brush = brush->id.next) {
- if (brush->ob_mode == OB_MODE_GPENCIL_PAINT) {
- if (i == index) {
- BKE_paint_brush_set(paint, brush);
-
- /* notifiers */
- WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
- return OPERATOR_FINISHED;
- }
- i++;
- }
- }
-
- return OPERATOR_CANCELLED;
-}
-
-void GPENCIL_OT_brush_select(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name = "Select Brush";
- ot->idname = "GPENCIL_OT_brush_select";
- ot->description = "Select a Grease Pencil drawing brush";
-
- /* callbacks */
- ot->exec = gp_brush_select_exec;
- ot->poll = gp_active_brush_poll;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* properties */
- RNA_def_int(ot->srna, "index", 0, 0, INT_MAX, "Index", "Index of Drawing Brush", 0, INT_MAX);
-}
-
-/* ***************** Select Sculpt Brush ************************ */
-
-static int gp_sculpt_select_exec(bContext *C, wmOperator *op)
-{
- ToolSettings *ts = CTX_data_tool_settings(C);
-
- /* if there's no existing container */
- if (ts == NULL) {
- BKE_report(op->reports, RPT_ERROR, "Nowhere to go");
- return OPERATOR_CANCELLED;
- }
-
- const int index = RNA_int_get(op->ptr, "index");
- GP_BrushEdit_Settings *gp_sculpt = &ts->gp_sculpt;
- /* sanity checks */
- if (ELEM(NULL, gp_sculpt)) {
- return OPERATOR_CANCELLED;
- }
-
- if (index < TOT_GP_EDITBRUSH_TYPES - 1) {
- gp_sculpt->brushtype = index;
- }
- /* notifiers */
- WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
-
- return OPERATOR_FINISHED;
-}
-
-void GPENCIL_OT_sculpt_select(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name = "Select Sculpt Brush";
- ot->idname = "GPENCIL_OT_sculpt_select";
- ot->description = "Select a Grease Pencil sculpt brush";
-
- /* callbacks */
- ot->exec = gp_sculpt_select_exec;
- ot->poll = gp_add_poll;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* properties */
- RNA_def_int(ot->srna, "index", 0, 0, INT_MAX, "Index", "Index of Sculpt Brush", 0, INT_MAX);
-}
-
/*********************** Vertex Groups ***********************************/
static bool gpencil_vertex_group_poll(bContext *C)
@@ -1903,8 +1820,8 @@ static int gpencil_vertex_group_smooth_exec(bContext *C, wmOperator *op)
float wb = defvert_find_weight(dvertb, def_nr);
/* the optimal value is the corresponding to the interpolation of the weight
- * at the distance of point b
- */
+ * at the distance of point b
+ */
const float opfac = line_point_factor_v3(&ptb->x, &pta->x, &ptc->x);
const float optimal = interpf(wa, wb, opfac);
/* Based on influence factor, blend between original and optimal */
@@ -1970,8 +1887,9 @@ static void joined_gpencil_fix_animdata_cb(ID *id, FCurve *fcu, void *user_data)
/* only remap if changed; this still means there will be some waste if there aren't many drivers/keys */
if (!STREQ(old_name, new_name) && strstr(fcu->rna_path, old_name)) {
- fcu->rna_path = BKE_animsys_fix_rna_path_rename(id, fcu->rna_path, "layers",
- old_name, new_name, 0, 0, false);
+ fcu->rna_path = BKE_animsys_fix_rna_path_rename(
+ id, fcu->rna_path, "layers",
+ old_name, new_name, 0, 0, false);
/* we don't want to apply a second remapping on this F-Curve now,
* so stop trying to fix names names
@@ -2005,8 +1923,9 @@ static void joined_gpencil_fix_animdata_cb(ID *id, FCurve *fcu, void *user_data)
if (!STREQ(old_name, new_name)) {
if ((dtar->rna_path) && strstr(dtar->rna_path, old_name)) {
/* Fix up path */
- dtar->rna_path = BKE_animsys_fix_rna_path_rename(id, dtar->rna_path, "layers",
- old_name, new_name, 0, 0, false);
+ dtar->rna_path = BKE_animsys_fix_rna_path_rename(
+ id, dtar->rna_path, "layers",
+ old_name, new_name, 0, 0, false);
break; /* no need to try any more names for layer path */
}
}
@@ -2025,27 +1944,27 @@ int ED_gpencil_join_objects_exec(bContext *C, wmOperator *op)
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
Depsgraph *depsgraph = CTX_data_depsgraph(C);
- Object *obact = CTX_data_active_object(C);
+ Object *ob_active = CTX_data_active_object(C);
bGPdata *gpd_dst = NULL;
bool ok = false;
/* Ensure we're in right mode and that the active object is correct */
- if (!obact || obact->type != OB_GPENCIL)
+ if (!ob_active || ob_active->type != OB_GPENCIL)
return OPERATOR_CANCELLED;
- bGPdata *gpd = (bGPdata *)obact->data;
+ bGPdata *gpd = (bGPdata *)ob_active->data;
if ((!gpd) || GPENCIL_ANY_MODE(gpd)) {
return OPERATOR_CANCELLED;
}
/* Ensure all rotations are applied before */
// XXX: Why don't we apply them here instead of warning?
- CTX_DATA_BEGIN(C, Base *, base, selected_editable_bases)
+ CTX_DATA_BEGIN(C, Object *, ob_iter, selected_editable_objects)
{
- if (base->object->type == OB_GPENCIL) {
- if ((base->object->rot[0] != 0) ||
- (base->object->rot[1] != 0) ||
- (base->object->rot[2] != 0))
+ if (ob_iter->type == OB_GPENCIL) {
+ if ((ob_iter->rot[0] != 0) ||
+ (ob_iter->rot[1] != 0) ||
+ (ob_iter->rot[2] != 0))
{
BKE_report(op->reports, RPT_ERROR, "Apply all rotations before join objects");
return OPERATOR_CANCELLED;
@@ -2054,9 +1973,9 @@ int ED_gpencil_join_objects_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- CTX_DATA_BEGIN(C, Base *, base, selected_editable_bases)
+ CTX_DATA_BEGIN(C, Object *, ob_iter, selected_editable_objects)
{
- if (base->object == obact) {
+ if (ob_iter == ob_active) {
ok = true;
break;
}
@@ -2069,33 +1988,33 @@ int ED_gpencil_join_objects_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- gpd_dst = obact->data;
- Object *ob_dst = obact;
+ gpd_dst = ob_active->data;
+ Object *ob_dst = ob_active;
/* loop and join all data */
- CTX_DATA_BEGIN(C, Base *, base, selected_editable_bases)
+ CTX_DATA_BEGIN(C, Object *, ob_iter, selected_editable_objects)
{
- if ((base->object->type == OB_GPENCIL) && (base->object != obact)) {
+ if ((ob_iter->type == OB_GPENCIL) && (ob_iter != ob_active)) {
/* we assume that each datablock is not already used in active object */
- if (obact->data != base->object->data) {
- Object *ob_src = base->object;
- bGPdata *gpd_src = base->object->data;
+ if (ob_active->data != ob_iter->data) {
+ Object *ob_src = ob_iter;
+ bGPdata *gpd_src = ob_iter->data;
/* Apply all GP modifiers before */
- for (GpencilModifierData *md = base->object->greasepencil_modifiers.first; md; md = md->next) {
+ for (GpencilModifierData *md = ob_iter->greasepencil_modifiers.first; md; md = md->next) {
const GpencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md->type);
if (mti->bakeModifier) {
- mti->bakeModifier(bmain, depsgraph, md, base->object);
+ mti->bakeModifier(bmain, depsgraph, md, ob_iter);
}
}
/* copy vertex groups to the base one's */
int old_idx = 0;
- for (bDeformGroup *dg = base->object->defbase.first; dg; dg = dg->next) {
+ for (bDeformGroup *dg = ob_iter->defbase.first; dg; dg = dg->next) {
bDeformGroup *vgroup = MEM_dupallocN(dg);
- int idx = BLI_listbase_count(&obact->defbase);
- defgroup_unique_name(vgroup, obact);
- BLI_addtail(&obact->defbase, vgroup);
+ int idx = BLI_listbase_count(&ob_active->defbase);
+ defgroup_unique_name(vgroup, ob_active);
+ BLI_addtail(&ob_active->defbase, vgroup);
/* update vertex groups in strokes in original data */
for (bGPDlayer *gpl_src = gpd->layers.first; gpl_src; gpl_src = gpl_src->next) {
for (bGPDframe *gpf = gpl_src->frames.first; gpf; gpf = gpf->next) {
@@ -2112,8 +2031,9 @@ int ED_gpencil_join_objects_exec(bContext *C, wmOperator *op)
}
old_idx++;
}
- if (obact->defbase.first && obact->actdef == 0)
- obact->actdef = 1;
+ if (ob_active->defbase.first && ob_active->actdef == 0) {
+ ob_active->actdef = 1;
+ }
/* add missing materials reading source materials and checking in destination object */
short *totcol = give_totcolp(ob_src);
@@ -2136,8 +2056,8 @@ int ED_gpencil_join_objects_exec(bContext *C, wmOperator *op)
float offset_global[3];
float offset_local[3];
- sub_v3_v3v3(offset_global, obact->loc, base->object->obmat[3]);
- copy_m3_m4(bmat, obact->obmat);
+ sub_v3_v3v3(offset_global, ob_active->loc, ob_iter->obmat[3]);
+ copy_m3_m4(bmat, ob_active->obmat);
invert_m3_m3(imat, bmat);
mul_m3_v3(imat, offset_global);
mul_v3_m3v3(offset_local, imat, offset_global);
@@ -2149,7 +2069,7 @@ int ED_gpencil_join_objects_exec(bContext *C, wmOperator *op)
float inverse_diff_mat[4][4];
/* recalculate all stroke points */
- ED_gpencil_parent_location(depsgraph, base->object, gpd_src, gpl_src, diff_mat);
+ ED_gpencil_parent_location(depsgraph, ob_iter, gpd_src, gpl_src, diff_mat);
invert_m4_m4(inverse_diff_mat, diff_mat);
Material *ma_src = NULL;
@@ -2199,21 +2119,21 @@ int ED_gpencil_join_objects_exec(bContext *C, wmOperator *op)
* so that we don't have to worry about ambiguities re which datablock
* a layer came from!
*/
- if (base->object->adt) {
- if (obact->adt == NULL) {
+ if (ob_iter->adt) {
+ if (ob_active->adt == NULL) {
/* no animdata, so just use a copy of the whole thing */
- obact->adt = BKE_animdata_copy(bmain, base->object->adt, false, true);
+ ob_active->adt = BKE_animdata_copy(bmain, ob_iter->adt, 0);
}
else {
/* merge in data - we'll fix the drivers manually */
- BKE_animdata_merge_copy(bmain, &obact->id, &base->object->id, ADT_MERGECOPY_KEEP_DST, false);
+ BKE_animdata_merge_copy(bmain, &ob_active->id, &ob_iter->id, ADT_MERGECOPY_KEEP_DST, false);
}
}
if (gpd_src->adt) {
if (gpd_dst->adt == NULL) {
/* no animdata, so just use a copy of the whole thing */
- gpd_dst->adt = BKE_animdata_copy(bmain, gpd_src->adt, false, true);
+ gpd_dst->adt = BKE_animdata_copy(bmain, gpd_src->adt, 0);
}
else {
/* merge in data - we'll fix the drivers manually */
@@ -2223,7 +2143,7 @@ int ED_gpencil_join_objects_exec(bContext *C, wmOperator *op)
}
/* Free the old object */
- ED_object_base_free_and_unlink(bmain, scene, base->object);
+ ED_object_base_free_and_unlink(bmain, scene, ob_iter);
}
}
CTX_DATA_END;
@@ -2269,6 +2189,7 @@ static int gpencil_lock_layer_exec(bContext *C, wmOperator *UNUSED(op))
gp_style = ma->gp_style;
gp_style->flag |= GP_STYLE_COLOR_LOCKED;
gp_style->flag |= GP_STYLE_COLOR_HIDE;
+ DEG_id_tag_update(&ma->id, DEG_TAG_COPY_ON_WRITE);
}
/* loop all selected strokes and unlock any color used in active layer */
@@ -2280,7 +2201,10 @@ static int gpencil_lock_layer_exec(bContext *C, wmOperator *UNUSED(op))
if (ED_gpencil_stroke_can_use(C, gps) == false)
continue;
- gp_style = BKE_material_gpencil_settings_get(ob, gps->mat_nr + 1);
+ ma = give_current_material(ob, gps->mat_nr + 1);
+ DEG_id_tag_update(&ma->id, DEG_TAG_COPY_ON_WRITE);
+
+ gp_style = ma->gp_style;
/* unlock/unhide color if not unlocked before */
if (gp_style != NULL) {
gp_style->flag &= ~GP_STYLE_COLOR_LOCKED;
@@ -2289,6 +2213,12 @@ static int gpencil_lock_layer_exec(bContext *C, wmOperator *UNUSED(op))
}
}
}
+ /* updates */
+ DEG_id_tag_update(&gpd->id, OB_RECALC_DATA);
+
+ /* copy on write tag is needed, or else no refresh happens */
+ DEG_id_tag_update(&gpd->id, DEG_TAG_COPY_ON_WRITE);
+
/* notifiers */
DEG_id_tag_update(&gpd->id, OB_RECALC_OB | OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
@@ -2339,8 +2269,8 @@ static int gpencil_color_isolate_exec(bContext *C, wmOperator *op)
continue;
/* If the flags aren't set, that means that the color is
- * not alone, so we have some colors to isolate still
- */
+ * not alone, so we have some colors to isolate still
+ */
gp_style = ma->gp_style;
if ((gp_style->flag & flags) == 0) {
isolate = true;
@@ -2358,6 +2288,7 @@ static int gpencil_color_isolate_exec(bContext *C, wmOperator *op)
continue;
else
gp_style->flag |= flags;
+ DEG_id_tag_update(&ma->id, DEG_TAG_COPY_ON_WRITE);
}
}
else {
@@ -2366,11 +2297,16 @@ static int gpencil_color_isolate_exec(bContext *C, wmOperator *op)
ma = give_current_material(ob, i + 1);
gp_style = ma->gp_style;
gp_style->flag &= ~flags;
+ DEG_id_tag_update(&ma->id, DEG_TAG_COPY_ON_WRITE);
}
}
/* notifiers */
DEG_id_tag_update(&gpd->id, OB_RECALC_DATA);
+
+ /* copy on write tag is needed, or else no refresh happens */
+ DEG_id_tag_update(&gpd->id, DEG_TAG_COPY_ON_WRITE);
+
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
return OPERATOR_FINISHED;
@@ -2400,6 +2336,7 @@ void GPENCIL_OT_color_isolate(wmOperatorType *ot)
static int gpencil_color_hide_exec(bContext *C, wmOperator *op)
{
Object *ob = CTX_data_active_object(C);
+ bGPdata *gpd = (bGPdata *)ob->data;
MaterialGPencilStyle *active_color = BKE_material_gpencil_settings_get(ob, ob->actcol);
bool unselected = RNA_boolean_get(op->ptr, "unselected");
@@ -2417,6 +2354,7 @@ static int gpencil_color_hide_exec(bContext *C, wmOperator *op)
color = ma->gp_style;
if (active_color != color) {
color->flag |= GP_STYLE_COLOR_HIDE;
+ DEG_id_tag_update(&ma->id, DEG_TAG_COPY_ON_WRITE);
}
}
}
@@ -2425,6 +2363,12 @@ static int gpencil_color_hide_exec(bContext *C, wmOperator *op)
active_color->flag |= GP_STYLE_COLOR_HIDE;
}
+ /* updates */
+ DEG_id_tag_update(&gpd->id, OB_RECALC_OB | OB_RECALC_DATA);
+
+ /* copy on write tag is needed, or else no refresh happens */
+ DEG_id_tag_update(&gpd->id, DEG_TAG_COPY_ON_WRITE);
+
/* notifiers */
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
@@ -2454,6 +2398,7 @@ void GPENCIL_OT_color_hide(wmOperatorType *ot)
static int gpencil_color_reveal_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob = CTX_data_active_object(C);
+ bGPdata *gpd = (bGPdata *)ob->data;
Material *ma = NULL;
short *totcol = give_totcolp(ob);
@@ -2467,8 +2412,15 @@ static int gpencil_color_reveal_exec(bContext *C, wmOperator *UNUSED(op))
ma = give_current_material(ob, i + 1);
gp_style = ma->gp_style;
gp_style->flag &= ~GP_STYLE_COLOR_HIDE;
+ DEG_id_tag_update(&ma->id, DEG_TAG_COPY_ON_WRITE);
}
+ /* updates */
+ DEG_id_tag_update(&gpd->id, OB_RECALC_DATA);
+
+ /* copy on write tag is needed, or else no refresh happens */
+ DEG_id_tag_update(&gpd->id, DEG_TAG_COPY_ON_WRITE);
+
/* notifiers */
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
@@ -2496,6 +2448,7 @@ static int gpencil_color_lock_all_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob = CTX_data_active_object(C);
+ bGPdata *gpd = (bGPdata *)ob->data;
Material *ma = NULL;
short *totcol = give_totcolp(ob);
@@ -2509,8 +2462,15 @@ static int gpencil_color_lock_all_exec(bContext *C, wmOperator *UNUSED(op))
ma = give_current_material(ob, i + 1);
gp_style = ma->gp_style;
gp_style->flag |= GP_STYLE_COLOR_LOCKED;
+ DEG_id_tag_update(&ma->id, DEG_TAG_COPY_ON_WRITE);
}
+ /* updates */
+ DEG_id_tag_update(&gpd->id, OB_RECALC_DATA);
+
+ /* copy on write tag is needed, or else no refresh happens */
+ DEG_id_tag_update(&gpd->id, DEG_TAG_COPY_ON_WRITE);
+
/* notifiers */
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
@@ -2537,6 +2497,7 @@ void GPENCIL_OT_color_lock_all(wmOperatorType *ot)
static int gpencil_color_unlock_all_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob = CTX_data_active_object(C);
+ bGPdata *gpd = (bGPdata *)ob->data;
Material *ma = NULL;
short *totcol = give_totcolp(ob);
@@ -2550,8 +2511,15 @@ static int gpencil_color_unlock_all_exec(bContext *C, wmOperator *UNUSED(op))
ma = give_current_material(ob, i + 1);
gp_style = ma->gp_style;
gp_style->flag &= ~GP_STYLE_COLOR_LOCKED;
+ DEG_id_tag_update(&ma->id, DEG_TAG_COPY_ON_WRITE);
}
+ /* updates */
+ DEG_id_tag_update(&gpd->id, OB_RECALC_DATA);
+
+ /* copy on write tag is needed, or else no refresh happens */
+ DEG_id_tag_update(&gpd->id, DEG_TAG_COPY_ON_WRITE);
+
/* notifiers */
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
@@ -2576,42 +2544,71 @@ void GPENCIL_OT_color_unlock_all(wmOperatorType *ot)
/* ***************** Select all strokes using color ************************ */
-static int gpencil_color_select_exec(bContext *C, wmOperator *UNUSED(op))
+static int gpencil_color_select_exec(bContext *C, wmOperator *op)
{
bGPdata *gpd = ED_gpencil_data_get_active(C);
Object *ob = CTX_data_active_object(C);
MaterialGPencilStyle *gp_style = BKE_material_gpencil_settings_get(ob, ob->actcol);
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+ const bool deselected = RNA_boolean_get(op->ptr, "deselect");
/* sanity checks */
if (ELEM(NULL, gpd, gp_style))
return OPERATOR_CANCELLED;
/* read all strokes and select*/
- for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
- /* only editable and visible layers are considered */
- if (gpencil_layer_is_editable(gpl) && (gpl->actframe != NULL)) {
- /* verify something to do */
- for (bGPDstroke *gps = gpl->actframe->strokes.first; gps; gps = gps->next) {
- /* skip strokes that are invalid for current view */
- if (ED_gpencil_stroke_can_use(C, gps) == false)
- continue;
- /* check if the color is editable */
- if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false)
- continue;
+ CTX_DATA_BEGIN(C, bGPDlayer *, gpl, editable_gpencil_layers)
+ {
+ bGPDframe *init_gpf = gpl->actframe;
+ if (is_multiedit) {
+ init_gpf = gpl->frames.first;
+ }
+ for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) {
+ if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) {
+
+ /* verify something to do */
+ for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
+ /* skip strokes that are invalid for current view */
+ if (ED_gpencil_stroke_can_use(C, gps) == false)
+ continue;
+ /* check if the color is editable */
+ if (ED_gpencil_stroke_color_use(ob, gpl, gps) == false)
+ continue;
- /* select */
- if (ob->actcol == gps->mat_nr) {
- bGPDspoint *pt;
- int i;
+ /* select */
+ if (ob->actcol == gps->mat_nr + 1) {
+ bGPDspoint *pt;
+ int i;
- gps->flag |= GP_STROKE_SELECT;
- for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
- pt->flag |= GP_SPOINT_SELECT;
+ if (!deselected) {
+ gps->flag |= GP_STROKE_SELECT;
+ }
+ else {
+ gps->flag &= ~GP_STROKE_SELECT;
+ }
+ for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
+ if (!deselected) {
+ pt->flag |= GP_SPOINT_SELECT;
+ }
+ else {
+ pt->flag &= ~GP_SPOINT_SELECT;
+ }
+ }
}
}
}
+ /* if not multiedit, exit loop*/
+ if (!is_multiedit) {
+ break;
+ }
+
}
}
+ CTX_DATA_END;
+
+ /* copy on write tag is needed, or else no refresh happens */
+ DEG_id_tag_update(&gpd->id, DEG_TAG_COPY_ON_WRITE);
+
/* notifiers */
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
@@ -2631,4 +2628,8 @@ void GPENCIL_OT_color_select(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* props */
+ ot->prop = RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "Unselect strokes");
+ RNA_def_property_flag(ot->prop, PROP_HIDDEN | PROP_SKIP_SAVE);
}
diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index 171c52470c0..cb735b69ec2 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -55,15 +55,15 @@
#include "DNA_view3d_types.h"
#include "DNA_gpencil_types.h"
-#include "BKE_main.h"
+#include "BKE_brush.h"
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_brush.h"
#include "BKE_gpencil.h"
-#include "BKE_paint.h"
#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_object.h"
+#include "BKE_paint.h"
#include "BKE_report.h"
#include "BKE_screen.h"
#include "BKE_workspace.h"
@@ -73,6 +73,8 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "WM_message.h"
+#include "WM_toolsystem.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -94,21 +96,60 @@
/* ************************************************ */
/* Stroke Edit Mode Management */
+
+/* poll callback for all stroke editing operators */
+static bool gp_stroke_edit_poll(bContext *C)
+{
+ /* edit only supported with grease pencil objects */
+ Object *ob = CTX_data_active_object(C);
+ if ((ob == NULL) || (ob->type != OB_GPENCIL)) {
+ return false;
+ }
+
+ /* NOTE: this is a bit slower, but is the most accurate... */
+ return CTX_DATA_COUNT(C, editable_gpencil_strokes) != 0;
+}
+
+/* poll callback to verify edit mode in 3D view only */
+static bool gp_strokes_edit3d_poll(bContext *C)
+{
+ /* edit only supported with grease pencil objects */
+ Object *ob = CTX_data_active_object(C);
+ if ((ob == NULL) || (ob->type != OB_GPENCIL)) {
+ return false;
+ }
+
+
+ /* 2 Requirements:
+ * - 1) Editable GP data
+ * - 2) 3D View only
+ */
+ return (gp_stroke_edit_poll(C) && ED_operator_view3d_active(C));
+}
+
static bool gpencil_editmode_toggle_poll(bContext *C)
{
- /* if using gpencil object, use this gpd */
+ /* edit only supported with grease pencil objects */
Object *ob = CTX_data_active_object(C);
- if ((ob) && (ob->type == OB_GPENCIL)) {
+ if ((ob == NULL) || (ob->type != OB_GPENCIL)) {
+ return false;
+ }
+
+ /* if using gpencil object, use this gpd */
+ if (ob->type == OB_GPENCIL) {
return ob->data != NULL;
}
+
return ED_gpencil_data_get_active(C) != NULL;
}
static int gpencil_editmode_toggle_exec(bContext *C, wmOperator *op)
{
const int back = RNA_boolean_get(op->ptr, "back");
- Depsgraph *depsgraph = CTX_data_depsgraph(C); \
- bGPdata *gpd = ED_gpencil_data_get_active(C);
+
+ struct wmMsgBus *mbus = CTX_wm_message_bus(C);
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
+ bGPdata *gpd = ED_gpencil_data_get_active(C);
bool is_object = false;
short mode;
/* if using a gpencil object, use this datablock */
@@ -155,6 +196,13 @@ static int gpencil_editmode_toggle_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_GPENCIL | ND_GPENCIL_EDITMODE, NULL);
WM_event_add_notifier(C, NC_SCENE | ND_MODE, NULL);
+ if (is_object) {
+ WM_msg_publish_rna_prop(mbus, &ob->id, ob, Object, mode);
+ }
+ if (G.background == false) {
+ WM_toolsystem_update_from_context_view3d(C);
+ }
+
return OPERATOR_FINISHED;
}
@@ -179,6 +227,43 @@ void GPENCIL_OT_editmode_toggle(wmOperatorType *ot)
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
}
+/* set select mode */
+static int gpencil_selectmode_toggle_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene = CTX_data_scene(C);
+ ToolSettings *ts = CTX_data_tool_settings(C);
+ const int mode = RNA_int_get(op->ptr, "mode");
+
+ /* Just set mode */
+ ts->gpencil_selectmode = mode;
+
+ WM_main_add_notifier(NC_SCENE | ND_TOOLSETTINGS, NULL);
+ DEG_id_tag_update(&scene->id, DEG_TAG_COPY_ON_WRITE);
+
+ return OPERATOR_FINISHED;
+}
+
+void GPENCIL_OT_selectmode_toggle(wmOperatorType *ot)
+{
+ PropertyRNA *prop;
+
+ /* identifiers */
+ ot->name = "Select Mode Toggle";
+ ot->idname = "GPENCIL_OT_selectmode_toggle";
+ ot->description = "Set selection mode for Grease Pencil strokes";
+
+ /* callbacks */
+ ot->exec = gpencil_selectmode_toggle_exec;
+ ot->poll = gp_strokes_edit3d_poll;
+
+ /* flags */
+ ot->flag = OPTYPE_UNDO | OPTYPE_REGISTER;
+
+ /* properties */
+ prop = RNA_def_int(ot->srna, "mode", 0, 0, 1, "Select mode", "Select mode", 0, 1);
+ RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
+}
+
/* Stroke Paint Mode Management */
static bool gpencil_paintmode_toggle_poll(bContext *C)
@@ -195,6 +280,8 @@ static int gpencil_paintmode_toggle_exec(bContext *C, wmOperator *op)
{
const bool back = RNA_boolean_get(op->ptr, "back");
+ struct wmMsgBus *mbus = CTX_wm_message_bus(C);
+ Main *bmain = CTX_data_main(C);
bGPdata *gpd = ED_gpencil_data_get_active(C);
ToolSettings *ts = CTX_data_tool_settings(C);
@@ -229,11 +316,15 @@ static int gpencil_paintmode_toggle_exec(bContext *C, wmOperator *op)
ob->mode = mode;
}
- /* be sure we have brushes */
- Paint *paint = BKE_brush_get_gpencil_paint(ts);
- /* if not exist, create a new one */
- if (paint->brush == NULL) {
- BKE_brush_gpencil_presets(C);
+ if (mode == OB_MODE_GPENCIL_PAINT) {
+ /* be sure we have brushes */
+ BKE_paint_ensure(ts, (Paint **)&ts->gp_paint);
+ Paint *paint = &ts->gp_paint->paint;
+ /* if not exist, create a new one */
+ if (paint->brush == NULL) {
+ BKE_brush_gpencil_presets(C);
+ }
+ BKE_paint_toolslots_brush_validate(bmain, &ts->gp_paint->paint);
}
/* setup other modes */
@@ -244,6 +335,13 @@ static int gpencil_paintmode_toggle_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, NULL);
WM_event_add_notifier(C, NC_SCENE | ND_MODE, NULL);
+ if (is_object) {
+ WM_msg_publish_rna_prop(mbus, &ob->id, ob, Object, mode);
+ }
+ if (G.background == false) {
+ WM_toolsystem_update_from_context_view3d(C);
+ }
+
return OPERATOR_FINISHED;
}
@@ -284,6 +382,7 @@ static int gpencil_sculptmode_toggle_exec(bContext *C, wmOperator *op)
{
const bool back = RNA_boolean_get(op->ptr, "back");
+ struct wmMsgBus *mbus = CTX_wm_message_bus(C);
bGPdata *gpd = ED_gpencil_data_get_active(C);
bool is_object = false;
short mode;
@@ -324,6 +423,13 @@ static int gpencil_sculptmode_toggle_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, NULL);
WM_event_add_notifier(C, NC_SCENE | ND_MODE, NULL);
+ if (is_object) {
+ WM_msg_publish_rna_prop(mbus, &ob->id, ob, Object, mode);
+ }
+ if (G.background == false) {
+ WM_toolsystem_update_from_context_view3d(C);
+ }
+
return OPERATOR_FINISHED;
}
@@ -364,6 +470,7 @@ static int gpencil_weightmode_toggle_exec(bContext *C, wmOperator *op)
{
const bool back = RNA_boolean_get(op->ptr, "back");
+ struct wmMsgBus *mbus = CTX_wm_message_bus(C);
bGPdata *gpd = ED_gpencil_data_get_active(C);
bool is_object = false;
short mode;
@@ -404,6 +511,13 @@ static int gpencil_weightmode_toggle_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, NULL);
WM_event_add_notifier(C, NC_SCENE | ND_MODE, NULL);
+ if (is_object) {
+ WM_msg_publish_rna_prop(mbus, &ob->id, ob, Object, mode);
+ }
+ if (G.background == false) {
+ WM_toolsystem_update_from_context_view3d(C);
+ }
+
return OPERATOR_FINISHED;
}
@@ -431,23 +545,6 @@ void GPENCIL_OT_weightmode_toggle(wmOperatorType *ot)
/* ************************************************ */
/* Stroke Editing Operators */
-/* poll callback for all stroke editing operators */
-static bool gp_stroke_edit_poll(bContext *C)
-{
- /* NOTE: this is a bit slower, but is the most accurate... */
- return CTX_DATA_COUNT(C, editable_gpencil_strokes) != 0;
-}
-
-/* poll callback to verify edit mode in 3D view only */
-static bool gp_strokes_edit3d_poll(bContext *C)
-{
- /* 2 Requirements:
- * - 1) Editable GP data
- * - 2) 3D View only
- */
- return (gp_stroke_edit_poll(C) && ED_operator_view3d_active(C));
-}
-
/* ************ Stroke Hide selection Toggle ************** */
static int gpencil_hideselect_toggle_exec(bContext *C, wmOperator *UNUSED(op))
@@ -1003,7 +1100,7 @@ static int gp_strokes_paste_exec(bContext *C, wmOperator *op)
* we are obliged to add a new frame if one
* doesn't exist already
*/
- gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, true);
+ gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, GP_GETFRAME_ADD_NEW);
if (gpf) {
/* Create new stroke */
bGPDstroke *new_stroke = MEM_dupallocN(gps);
@@ -1146,7 +1243,7 @@ static int gp_move_to_layer_exec(bContext *C, wmOperator *op)
/* Paste them all in one go */
if (strokes.first) {
- bGPDframe *gpf = BKE_gpencil_layer_getframe(target_layer, cfra_eval, true);
+ bGPDframe *gpf = BKE_gpencil_layer_getframe(target_layer, cfra_eval, GP_GETFRAME_ADD_NEW);
BLI_movelisttolist(&gpf->strokes, &strokes);
BLI_assert((strokes.first == strokes.last) && (strokes.first == NULL));
@@ -1283,7 +1380,7 @@ static int gp_actframe_delete_exec(bContext *C, wmOperator *op)
Depsgraph *depsgraph = CTX_data_depsgraph(C);
int cfra_eval = (int)DEG_get_ctime(depsgraph);
- bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, 0);
+ bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, GP_GETFRAME_USE_PREV);
/* if there's no existing Grease-Pencil data there, add some */
if (gpd == NULL) {
@@ -1342,7 +1439,7 @@ static int gp_actframe_delete_all_exec(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, bGPDlayer *, gpl, editable_gpencil_layers)
{
/* try to get the "active" frame - but only if it actually occurs on this frame */
- bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, 0);
+ bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, GP_GETFRAME_USE_PREV);
if (gpf == NULL)
continue;
@@ -1408,7 +1505,7 @@ static int gp_delete_selected_strokes(bContext *C)
{
bool changed = false;
bGPdata *gpd = ED_gpencil_data_get_active(C);
- bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
CTX_DATA_BEGIN(C, bGPDlayer *, gpl, editable_gpencil_layers)
{
@@ -1470,7 +1567,7 @@ static int gp_dissolve_selected_points(bContext *C, eGP_DissolveMode mode)
{
Object *ob = CTX_data_active_object(C);
bGPdata *gpd = ED_gpencil_data_get_active(C);
- bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
bool changed = false;
int first = 0;
int last = 0;
@@ -1862,7 +1959,7 @@ static int gp_delete_selected_points(bContext *C)
{
Object *ob = CTX_data_active_object(C);
bGPdata *gpd = ED_gpencil_data_get_active(C);
- bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
bool changed = false;
CTX_DATA_BEGIN(C, bGPDlayer *, gpl, editable_gpencil_layers)
@@ -1982,10 +2079,10 @@ static int gp_dissolve_exec(bContext *C, wmOperator *op)
void GPENCIL_OT_dissolve(wmOperatorType *ot)
{
static EnumPropertyItem prop_gpencil_dissolve_types[] = {
- { GP_DISSOLVE_POINTS, "POINTS", 0, "Dissolve", "Dissolve selected points" },
- { GP_DISSOLVE_BETWEEN, "BETWEEN", 0, "Dissolve Between", "Dissolve points between selected points" },
- { GP_DISSOLVE_UNSELECT, "UNSELECT", 0, "Dissolve Unselect", "Dissolve all unselected points" },
- { 0, NULL, 0, NULL, NULL }
+ {GP_DISSOLVE_POINTS, "POINTS", 0, "Dissolve", "Dissolve selected points"},
+ {GP_DISSOLVE_BETWEEN, "BETWEEN", 0, "Dissolve Between", "Dissolve points between selected points"},
+ {GP_DISSOLVE_UNSELECT, "UNSELECT", 0, "Dissolve Unselect", "Dissolve all unselected points"},
+ {0, NULL, 0, NULL, NULL}
};
/* identifiers */
@@ -2100,10 +2197,10 @@ static int gp_snap_to_cursor(bContext *C, wmOperator *op)
Scene *scene = CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
- Depsgraph *depsgraph = CTX_data_depsgraph(C); \
- Object *obact = CTX_data_active_object(C); \
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
+ Object *obact = CTX_data_active_object(C);
- const bool use_offset = RNA_boolean_get(op->ptr, "use_offset");
+ const bool use_offset = RNA_boolean_get(op->ptr, "use_offset");
const float *cursor_global = ED_view3d_cursor3d_get(scene, v3d)->location;
for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
@@ -2188,10 +2285,10 @@ static int gp_snap_cursor_to_sel(bContext *C, wmOperator *UNUSED(op))
Scene *scene = CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
- Depsgraph *depsgraph = CTX_data_depsgraph(C); \
- Object *obact = CTX_data_active_object(C); \
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
+ Object *obact = CTX_data_active_object(C);
- float *cursor = ED_view3d_cursor3d_get(scene, v3d)->location;
+ float *cursor = ED_view3d_cursor3d_get(scene, v3d)->location;
float centroid[3] = {0.0f};
float min[3], max[3];
size_t count = 0;
@@ -2769,7 +2866,7 @@ static int gp_strokes_reproject_exec(bContext *C, wmOperator *op)
int lock_axis = ts->gp_sculpt.lock_axis;
float origin[3];
- if ((mode == GP_REPROJECT_AXIS) && (lock_axis == GP_LOCKAXIS_NONE)) {
+ if ((mode == GP_REPROJECT_AXIS) && (lock_axis == GP_LOCKAXIS_VIEW)) {
BKE_report(op->reports, RPT_ERROR, "To reproject by axis, a lock axis must be set before");
return OPERATOR_CANCELLED;
}
@@ -2812,7 +2909,7 @@ static int gp_strokes_reproject_exec(bContext *C, wmOperator *op)
/* Project stroke in the axis locked */
if (mode == GP_REPROJECT_AXIS) {
- if (lock_axis > GP_LOCKAXIS_NONE) {
+ if (lock_axis > GP_LOCKAXIS_VIEW) {
ED_gp_get_drawing_reference(v3d, scene, ob, gpl,
ts->gpencil_v3d_align, origin);
ED_gp_project_point_to_plane(ob, rv3d, origin,
@@ -2866,9 +2963,9 @@ static int gp_strokes_reproject_exec(bContext *C, wmOperator *op)
void GPENCIL_OT_reproject(wmOperatorType *ot)
{
static const EnumPropertyItem reproject_type[] = {
- { GP_REPROJECT_AXIS, "AXIS", 0, "Axis",
+ {GP_REPROJECT_AXIS, "AXIS", 0, "Axis",
"Reproject the strokes using the current lock axis configuration. This is the same projection using while"
- "drawing new strokes" },
+ "drawing new strokes"},
{GP_REPROJECT_PLANAR, "PLANAR", 0, "Planar",
"Reproject the strokes to end up on the same plane, as if drawn from the current viewpoint "
"using 'Cursor' Stroke Placement"},
@@ -2952,7 +3049,7 @@ static int gp_stroke_subdivide_exec(bContext *C, wmOperator *op)
temp_dverts = MEM_dupallocN(gps->dvert);
}
- /* resize the points arrys */
+ /* resize the points arrays */
gps->totpoints += totnewpoints;
gps->points = MEM_recallocN(gps->points, sizeof(*gps->points) * gps->totpoints);
if (gps->dvert != NULL) {
@@ -3110,7 +3207,7 @@ void GPENCIL_OT_stroke_simplify(wmOperatorType *ot)
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
-/* ** simplify stroke using fixed algorith *** */
+/* ** simplify stroke using fixed algorithm *** */
static int gp_stroke_simplify_fixed_exec(bContext *C, wmOperator *op)
{
bGPdata *gpd = ED_gpencil_data_get_active(C);
@@ -3196,15 +3293,15 @@ static int gp_stroke_separate_exec(bContext *C, wmOperator *op)
if (ELEM(NULL, gpd_src)) {
return OPERATOR_CANCELLED;
}
- bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd_src);
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd_src);
/* create a new object */
base_new = ED_object_add_duplicate(bmain, scene, view_layer, base_old, 0);
ob_dst = base_new->object;
-
+ ob_dst->mode = OB_MODE_OBJECT;
/* create new grease pencil datablock */
// XXX: check usercounts
- gpd_dst = BKE_gpencil_data_addnew(bmain, "GPencil");
+ gpd_dst = BKE_gpencil_data_addnew(bmain, gpd_src->id.name + 2);
ob_dst->data = (bGPdata *)gpd_dst;
int totslots = ob_dst->totcol;
@@ -3381,7 +3478,7 @@ static int gp_stroke_split_exec(bContext *C, wmOperator *UNUSED(op))
if (ELEM(NULL, gpd)) {
return OPERATOR_CANCELLED;
}
- bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
/* loop strokes and split parts */
CTX_DATA_BEGIN(C, bGPDlayer *, gpl, editable_gpencil_layers)
diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c
index 2ff7e45d7a2..99a6710ea4d 100644
--- a/source/blender/editors/gpencil/gpencil_fill.c
+++ b/source/blender/editors/gpencil/gpencil_fill.c
@@ -127,8 +127,8 @@ typedef struct tGPDfill {
/* draw a given stroke using same thickness and color for all points */
static void gp_draw_basic_stroke(
- tGPDfill *tgpf, bGPDstroke *gps, const float diff_mat[4][4],
- bool cyclic, float ink[4], int flag, float thershold)
+ tGPDfill *tgpf, bGPDstroke *gps, const float diff_mat[4][4],
+ const bool cyclic, const float ink[4], const int flag, const float thershold)
{
bGPDspoint *points = gps->points;
@@ -166,14 +166,14 @@ static void gp_draw_basic_stroke(
col[3] = 1.0f;
}
/* set point */
- immAttrib4fv(color, col);
+ immAttr4fv(color, col);
mul_v3_m4v3(fpt, diff_mat, &pt->x);
immVertex3fv(pos, fpt);
}
if (cyclic && totpoints > 2) {
/* draw line to first point to complete the cycle */
- immAttrib4fv(color, col);
+ immAttr4fv(color, col);
mul_v3_m4v3(fpt, diff_mat, &points->x);
immVertex3fv(pos, fpt);
}
@@ -183,7 +183,7 @@ static void gp_draw_basic_stroke(
}
/* loop all layers */
-static void gp_draw_datablock(tGPDfill *tgpf, float ink[4])
+static void gp_draw_datablock(tGPDfill *tgpf, const float ink[4])
{
/* duplicated: etempFlags */
enum {
@@ -219,7 +219,7 @@ static void gp_draw_datablock(tGPDfill *tgpf, float ink[4])
continue;
/* get frame to draw */
- bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, 0);
+ bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, GP_GETFRAME_USE_PREV);
if (gpf == NULL)
continue;
@@ -248,7 +248,7 @@ static void gp_draw_datablock(tGPDfill *tgpf, float ink[4])
/* normal strokes */
if ((tgpf->fill_draw_mode == GP_FILL_DMODE_STROKE) ||
- (tgpf->fill_draw_mode == GP_FILL_DMODE_BOTH))
+ (tgpf->fill_draw_mode == GP_FILL_DMODE_BOTH))
{
ED_gp_draw_fill(&tgpw);
@@ -256,10 +256,11 @@ static void gp_draw_datablock(tGPDfill *tgpf, float ink[4])
/* 3D Lines with basic shapes and invisible lines */
if ((tgpf->fill_draw_mode == GP_FILL_DMODE_CONTROL) ||
- (tgpf->fill_draw_mode == GP_FILL_DMODE_BOTH))
+ (tgpf->fill_draw_mode == GP_FILL_DMODE_BOTH))
{
- gp_draw_basic_stroke(tgpf, gps, tgpw.diff_mat, gps->flag & GP_STROKE_CYCLIC, ink,
- tgpf->flag, tgpf->fill_threshold);
+ gp_draw_basic_stroke(
+ tgpf, gps, tgpw.diff_mat, gps->flag & GP_STROKE_CYCLIC, ink,
+ tgpf->flag, tgpf->fill_threshold);
}
}
}
@@ -322,7 +323,7 @@ static void gp_render_offscreen(tGPDfill *tgpf)
GPU_matrix_set(tgpf->rv3d->viewmat);
/* draw strokes */
- float ink[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
+ float ink[4] = {1.0f, 0.0f, 0.0f, 1.0f};
gp_draw_datablock(tgpf, ink);
/* restore size */
@@ -355,10 +356,10 @@ static void gp_render_offscreen(tGPDfill *tgpf)
}
/* return pixel data (rgba) at index */
-static void get_pixel(ImBuf *ibuf, int idx, float r_col[4])
+static void get_pixel(const ImBuf *ibuf, const int idx, float r_col[4])
{
if (ibuf->rect_float) {
- float *frgba = &ibuf->rect_float[idx * 4];
+ const float *frgba = &ibuf->rect_float[idx * 4];
copy_v4_v4(r_col, frgba);
}
else {
@@ -394,7 +395,7 @@ static void set_pixel(ImBuf *ibuf, int idx, const float col[4])
*
* \param ibuf Image pixel data
* \param maxpixel Maximum index
- * \param limit Limit of pixels to analize
+ * \param limit Limit of pixels to analyze
* \param index Index of current pixel
* \param type 0-Horizontal 1-Vertical
*/
@@ -448,8 +449,7 @@ static bool is_leak_narrow(ImBuf *ibuf, const int maxpixel, int limit, int index
/* Vertical leak (check horizontal pixels)
*
- * XXXxB7XX
- *
+ * XXXxB7XX
*/
if (type == LEAK_VERT) {
/* get pixel range of the row */
@@ -515,17 +515,17 @@ static void gpencil_boundaryfill_area(tGPDfill *tgpf)
}
/* 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 |
- * -----------
- */
+ * 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 |
+ * -----------
+ */
while (!BLI_stack_is_empty(stack)) {
int v;
BLI_stack_pop(stack, &v);
@@ -637,15 +637,15 @@ static void gpencil_get_outline_points(tGPDfill *tgpf)
bool start_found = false;
const int NEIGHBOR_COUNT = 8;
- int offset[8][2] = {
- { -1, -1 },
- { 0, -1 },
- { 1, -1 },
- { 1, 0 },
- { 1, 1 },
- { 0, 1 },
- { -1, 1 },
- { -1, 0 }
+ const int offset[8][2] = {
+ {-1, -1},
+ {0, -1},
+ {1, -1},
+ {1, 0},
+ {1, 1},
+ {0, 1},
+ {-1, 1},
+ {-1, 0}
};
tgpf->stack = BLI_stack_new(sizeof(int[2]), __func__);
@@ -654,7 +654,7 @@ static void gpencil_get_outline_points(tGPDfill *tgpf)
int imagesize = ibuf->x * ibuf->y;
/* find the initial point to start outline analysis */
- for (int idx = imagesize; idx >= 0; idx--) {
+ for (int idx = imagesize - 1; idx != 0; idx--) {
get_pixel(ibuf, idx, rgba);
if (rgba[1] == 1.0f) {
boundary_co[0] = idx % ibuf->x;
@@ -676,7 +676,7 @@ static void gpencil_get_outline_points(tGPDfill *tgpf)
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])
+ backtracked_offset[0][1] == offset[i][1])
{
/* Finding the bracktracked pixel offset index */
cur_back_offset = i;
@@ -710,7 +710,7 @@ static void gpencil_get_outline_points(tGPDfill *tgpf)
}
/* current pixel is equal to starting pixel */
if (boundary_co[0] == start_co[0] &&
- boundary_co[1] == start_co[1])
+ boundary_co[1] == start_co[1])
{
BLI_stack_pop(tgpf->stack, &v);
// boundary_found = true;
@@ -737,8 +737,8 @@ static void gpencil_get_depth_array(tGPDfill *tgpf)
}
/* for surface sketching, need to set the right OpenGL context stuff so that
- * the conversions will project the values correctly...
- */
+ * the conversions will project the values correctly...
+ */
if (ts->gpencil_v3d_align & GP_PROJECT_DEPTH_VIEW) {
/* need to restore the original projection settings before packing up */
view3d_region_operator_needs_opengl(tgpf->win, tgpf->ar);
@@ -758,9 +758,9 @@ static void gpencil_get_depth_array(tGPDfill *tgpf)
copy_v2_v2_int(mval, &ptc->x);
if ((ED_view3d_autodist_depth(
- tgpf->ar, mval, depth_margin, tgpf->depth_arr + i) == 0) &&
- (i && (ED_view3d_autodist_depth_seg(
- tgpf->ar, mval, mval_prev, depth_margin + 1, tgpf->depth_arr + i) == 0)))
+ tgpf->ar, mval, depth_margin, tgpf->depth_arr + i) == 0) &&
+ (i && (ED_view3d_autodist_depth_seg(
+ tgpf->ar, mval, mval_prev, depth_margin + 1, tgpf->depth_arr + i) == 0)))
{
interp_depth = true;
}
@@ -813,11 +813,10 @@ static void gpencil_points_from_stack(tGPDfill *tgpf)
/* create a grease pencil stroke using points in buffer */
static void gpencil_stroke_from_buffer(tGPDfill *tgpf)
{
- ToolSettings *ts = tgpf->scene->toolsettings;
- int cfra_eval = (int)DEG_get_ctime(tgpf->depsgraph);
+ const int cfra_eval = (int)DEG_get_ctime(tgpf->depsgraph);
- Brush *brush;
- brush = BKE_brush_getactive_gpencil(ts);
+ ToolSettings *ts = tgpf->scene->toolsettings;
+ Brush *brush = BKE_paint_brush(&ts->gp_paint->paint);
if (brush == NULL) {
return;
}
@@ -918,12 +917,14 @@ static void gpencil_stroke_from_buffer(tGPDfill *tgpf)
}
/* if axis locked, reproject to plane locked */
- if ((tgpf->lock_axis > GP_LOCKAXIS_NONE) && ((ts->gpencil_v3d_align & GP_PROJECT_DEPTH_VIEW) == 0)) {
+ if ((tgpf->lock_axis > GP_LOCKAXIS_VIEW) && ((ts->gpencil_v3d_align & GP_PROJECT_DEPTH_VIEW) == 0)) {
float origin[3];
- ED_gp_get_drawing_reference(tgpf->v3d, tgpf->scene, tgpf->ob, tgpf->gpl,
- ts->gpencil_v3d_align, origin);
- ED_gp_project_stroke_to_plane(tgpf->ob, tgpf->rv3d, gps, origin,
- tgpf->lock_axis - 1);
+ ED_gp_get_drawing_reference(
+ tgpf->v3d, tgpf->scene, tgpf->ob, tgpf->gpl,
+ ts->gpencil_v3d_align, origin);
+ ED_gp_project_stroke_to_plane(
+ tgpf->ob, tgpf->rv3d, gps, origin,
+ tgpf->lock_axis - 1);
}
/* if parented change position relative to parent object */
@@ -953,7 +954,7 @@ static void gpencil_draw_boundary_lines(const bContext *UNUSED(C), tGPDfill *tgp
if (!tgpf->gpd) {
return;
}
- float ink[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
+ const float ink[4] = {1.0f, 0.0f, 0.0f, 1.0f};
gp_draw_datablock(tgpf, ink);
}
@@ -1024,7 +1025,7 @@ static tGPDfill *gp_session_init_fill(bContext *C, wmOperator *UNUSED(op))
tgpf->depth_arr = NULL;
/* save filling parameters */
- Brush *brush = BKE_brush_getactive_gpencil(ts);
+ Brush *brush = BKE_paint_brush(&ts->gp_paint->paint);
tgpf->flag = brush->gpencil_settings->flag;
tgpf->fill_leak = brush->gpencil_settings->fill_leak;
tgpf->fill_threshold = brush->gpencil_settings->fill_threshold;
diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h
index 975b09ed5c8..4656c6fc20c 100644
--- a/source/blender/editors/gpencil/gpencil_intern.h
+++ b/source/blender/editors/gpencil/gpencil_intern.h
@@ -192,16 +192,19 @@ typedef struct GP_SpaceConversion {
float mat[4][4]; /* transform matrix on the strokes (introduced in [b770964]) */
} GP_SpaceConversion;
-bool gp_stroke_inside_circle(const int mval[2], const int UNUSED(mvalo[2]),
- int rad, int x0, int y0, int x1, int y1);
+bool gp_stroke_inside_circle(
+ const int mval[2], const int UNUSED(mvalo[2]),
+ int rad, int x0, int y0, int x1, int y1);
void gp_point_conversion_init(struct bContext *C, GP_SpaceConversion *r_gsc);
-void gp_point_to_xy(GP_SpaceConversion *settings, struct bGPDstroke *gps, struct bGPDspoint *pt,
- int *r_x, int *r_y);
+void gp_point_to_xy(
+ GP_SpaceConversion *settings, struct bGPDstroke *gps, struct bGPDspoint *pt,
+ int *r_x, int *r_y);
-void gp_point_to_xy_fl(GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
- float *r_x, float *r_y);
+void gp_point_to_xy_fl(
+ GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
+ float *r_x, float *r_y);
void gp_point_to_parent_space(bGPDspoint *pt, float diff_mat[4][4], bGPDspoint *r_pt);
/**
@@ -287,6 +290,7 @@ typedef enum eGPencil_PaintModes {
/* stroke editing ----- */
void GPENCIL_OT_editmode_toggle(struct wmOperatorType *ot);
+void GPENCIL_OT_selectmode_toggle(struct wmOperatorType *ot);
void GPENCIL_OT_paintmode_toggle(struct wmOperatorType *ot);
void GPENCIL_OT_sculptmode_toggle(struct wmOperatorType *ot);
void GPENCIL_OT_weightmode_toggle(struct wmOperatorType *ot);
@@ -295,7 +299,7 @@ void GPENCIL_OT_selection_opacity_toggle(struct wmOperatorType *ot);
void GPENCIL_OT_select(struct wmOperatorType *ot);
void GPENCIL_OT_select_all(struct wmOperatorType *ot);
void GPENCIL_OT_select_circle(struct wmOperatorType *ot);
-void GPENCIL_OT_select_border(struct wmOperatorType *ot);
+void GPENCIL_OT_select_box(struct wmOperatorType *ot);
void GPENCIL_OT_select_lasso(struct wmOperatorType *ot);
void GPENCIL_OT_select_linked(struct wmOperatorType *ot);
@@ -382,9 +386,6 @@ void GPENCIL_OT_stroke_separate(struct wmOperatorType *ot);
void GPENCIL_OT_stroke_split(struct wmOperatorType *ot);
void GPENCIL_OT_brush_presets_create(struct wmOperatorType *ot);
-void GPENCIL_OT_brush_select(struct wmOperatorType *ot);
-
-void GPENCIL_OT_sculpt_select(struct wmOperatorType *ot);
/* undo stack ---------- */
@@ -474,21 +475,21 @@ typedef enum ACTCONT_TYPES {
/* Stroke Iteration Utilities */
/**
-* Iterate over all editable strokes in the current context,
-* stopping on each usable layer + stroke pair (i.e. gpl and gps)
-* to perform some operations on the stroke.
-*
-* \param gpl The identifier to use for the layer of the stroke being processed.
-* Choose a suitable value to avoid name clashes.
-* \param gps The identifier to use for current stroke being processed.
-* Choose a suitable value to avoid name clashes.
-*/
+ * Iterate over all editable strokes in the current context,
+ * stopping on each usable layer + stroke pair (i.e. gpl and gps)
+ * to perform some operations on the stroke.
+ *
+ * \param gpl The identifier to use for the layer of the stroke being processed.
+ * Choose a suitable value to avoid name clashes.
+ * \param gps The identifier to use for current stroke being processed.
+ * Choose a suitable value to avoid name clashes.
+ */
#define GP_EDITABLE_STROKES_BEGIN(C, gpl, gps) \
{ \
Depsgraph *depsgraph_ = CTX_data_depsgraph(C); \
Object *obact_ = CTX_data_active_object(C); \
bGPdata *gpd_ = CTX_data_gpencil_data(C); \
- bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd_); \
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd_); \
CTX_DATA_BEGIN(C, bGPDlayer*, gpl, editable_gpencil_layers) \
{ \
bGPDframe *init_gpf = gpl->actframe; \
diff --git a/source/blender/editors/gpencil/gpencil_interpolate.c b/source/blender/editors/gpencil/gpencil_interpolate.c
index 1b7acbd4132..ae1d1454eae 100644
--- a/source/blender/editors/gpencil/gpencil_interpolate.c
+++ b/source/blender/editors/gpencil/gpencil_interpolate.c
@@ -56,12 +56,11 @@
#include "BKE_colortools.h"
#include "BKE_context.h"
+#include "BKE_deform.h"
#include "BKE_global.h"
#include "BKE_gpencil.h"
-#include "BKE_library.h"
#include "BKE_report.h"
#include "BKE_screen.h"
-#include "BKE_deform.h"
#include "UI_interface.h"
#include "UI_resources.h"
diff --git a/source/blender/editors/gpencil/gpencil_old.c b/source/blender/editors/gpencil/gpencil_old.c
index 5c01de55885..a2012be223d 100644
--- a/source/blender/editors/gpencil/gpencil_old.c
+++ b/source/blender/editors/gpencil/gpencil_old.c
@@ -105,7 +105,6 @@ static int gpencil_convert_old_files_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
- ToolSettings *ts = CTX_data_tool_settings(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
/* Convert grease pencil scene datablock to GP object */
@@ -114,13 +113,6 @@ static int gpencil_convert_old_files_exec(bContext *C, wmOperator *UNUSED(op))
ob = BKE_object_add_for_data(bmain, view_layer, OB_GPENCIL, "GP_Scene", &scene->gpd->id, false);
zero_v3(ob->loc);
- Paint *paint = BKE_brush_get_gpencil_paint(ts);
- /* if not exist, create a new one */
- if (paint->brush == NULL) {
- /* create new brushes */
- BKE_brush_gpencil_presets(C);
- }
-
/* convert grease pencil palettes (version >= 2.78) to materials and weights */
bGPdata *gpd = scene->gpd;
for (const bGPDpalette *palette = gpd->palettes.first; palette; palette = palette->next) {
@@ -178,18 +170,18 @@ static int gpencil_convert_old_files_exec(bContext *C, wmOperator *UNUSED(op))
}
else if (ob->type == OB_EMPTY) {
/* Empty with GP data - This should be able to be converted
- * to a GP object with little data loss
- */
+ * to a GP object with little data loss
+ */
ob->data = ob->gpd;
ob->gpd = NULL;
ob->type = OB_GPENCIL;
}
else {
/* FIXME: What to do in this case?
- *
- * We cannot create new objects for these, as we don't have a scene & scene layer
- * to put them into from here...
- */
+ *
+ * We cannot create new objects for these, as we don't have a scene & scene layer
+ * to put them into from here...
+ */
printf("WARNING: Old Grease Pencil data ('%s') still exists on Object '%s'\n",
ob->gpd->id.name + 2, ob->id.name + 2);
}
diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c
index b14f18714a5..a199f943a8d 100644
--- a/source/blender/editors/gpencil/gpencil_ops.c
+++ b/source/blender/editors/gpencil/gpencil_ops.c
@@ -37,6 +37,7 @@
#include "BKE_context.h"
#include "BKE_brush.h"
#include "BKE_gpencil.h"
+#include "BKE_paint.h"
#include "DNA_brush_types.h"
#include "DNA_gpencil_types.h"
@@ -46,6 +47,7 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "WM_toolsystem.h"
#include "RNA_access.h"
@@ -62,47 +64,7 @@
/* Generic Drawing Keymap - Annotations */
static void ed_keymap_gpencil_general(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Grease Pencil", 0, 0);
- wmKeyMapItem *kmi;
-
- /* Draw --------------------------------------- */
- /* draw */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_annotate", LEFTMOUSE, KM_PRESS, 0, DKEY);
- RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- /* draw - straight lines */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_annotate", LEFTMOUSE, KM_PRESS, KM_ALT, DKEY);
- RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW_STRAIGHT);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- /* draw - poly lines */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_annotate", LEFTMOUSE, KM_PRESS, KM_SHIFT | KM_ALT, DKEY);
- RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW_POLY);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- /* erase */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_annotate", RIGHTMOUSE, KM_PRESS, 0, DKEY);
- RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_ERASER);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- /* Viewport Tools ------------------------------- */
-
- /* Enter EditMode */
- WM_keymap_add_item(keymap, "GPENCIL_OT_editmode_toggle", TABKEY, KM_PRESS, 0, DKEY);
-
- /* Pie Menu - For standard tools */
- WM_keymap_add_menu_pie(keymap, "GPENCIL_MT_pie_tool_palette", QKEY, KM_PRESS, 0, DKEY);
- WM_keymap_add_menu_pie(keymap, "GPENCIL_MT_pie_settings_palette", WKEY, KM_PRESS, 0, DKEY);
-
- /* Add Blank Frame */
- /* XXX: BKEY or NKEY? BKEY is easier to reach from DKEY, so we'll use that for now */
- WM_keymap_add_item(keymap, "GPENCIL_OT_blank_frame_add", BKEY, KM_PRESS, 0, DKEY);
-
- /* Delete Active Frame - For easier video tutorials/review sessions */
- /* NOTE: This works even when not in EditMode */
- WM_keymap_add_item(keymap, "GPENCIL_OT_active_frames_delete_all", XKEY, KM_PRESS, 0, DKEY);
- WM_keymap_add_item(keymap, "GPENCIL_OT_active_frames_delete_all", DELKEY, KM_PRESS, 0, DKEY);
+ WM_keymap_ensure(keyconf, "Grease Pencil", 0, 0);
}
/* ==================== */
@@ -122,40 +84,34 @@ static bool gp_stroke_paintmode_poll(bContext *C)
return (gpd && (gpd->flag & GP_DATA_STROKE_PAINTMODE));
}
-/* Poll callback for stroke painting (draw brush) */
-static bool gp_stroke_paintmode_draw_poll(bContext *C)
+static bool gp_stroke_paintmode_poll_with_tool(bContext *C, const char gpencil_tool)
{
/* TODO: limit this to mode, but review 2D editors */
bGPdata *gpd = CTX_data_gpencil_data(C);
ToolSettings *ts = CTX_data_tool_settings(C);
- Brush *brush = BKE_brush_getactive_gpencil(ts);
+ Brush *brush = BKE_paint_brush(&ts->gp_paint->paint);
return ((gpd) && (gpd->flag & GP_DATA_STROKE_PAINTMODE) &&
(brush && brush->gpencil_settings) &&
- (brush->gpencil_settings->brush_type == GP_BRUSH_TYPE_DRAW));
+ WM_toolsystem_active_tool_is_brush(C) &&
+ (brush->gpencil_tool == gpencil_tool));
+}
+
+/* Poll callback for stroke painting (draw brush) */
+static bool gp_stroke_paintmode_draw_poll(bContext *C)
+{
+ return gp_stroke_paintmode_poll_with_tool(C, GPAINT_TOOL_DRAW);
}
/* Poll callback for stroke painting (erase brush) */
static bool gp_stroke_paintmode_erase_poll(bContext *C)
{
- /* TODO: limit this to mode, but review 2D editors */
- bGPdata *gpd = CTX_data_gpencil_data(C);
- ToolSettings *ts = CTX_data_tool_settings(C);
- Brush *brush = BKE_brush_getactive_gpencil(ts);
- return ((gpd) && (gpd->flag & GP_DATA_STROKE_PAINTMODE) &&
- (brush && brush->gpencil_settings) &&
- (brush->gpencil_settings->brush_type == GP_BRUSH_TYPE_ERASE));
+ return gp_stroke_paintmode_poll_with_tool(C, GPAINT_TOOL_ERASE);
}
/* Poll callback for stroke painting (fill) */
static bool gp_stroke_paintmode_fill_poll(bContext *C)
{
- /* TODO: limit this to mode, but review 2D editors */
- bGPdata *gpd = CTX_data_gpencil_data(C);
- ToolSettings *ts = CTX_data_tool_settings(C);
- Brush *brush = BKE_brush_getactive_gpencil(ts);
- return ((gpd) && (gpd->flag & GP_DATA_STROKE_PAINTMODE) &&
- (brush && brush->gpencil_settings) &&
- (brush->gpencil_settings->brush_type == GP_BRUSH_TYPE_FILL));
+ return gp_stroke_paintmode_poll_with_tool(C, GPAINT_TOOL_FILL);
}
/* Poll callback for stroke sculpting mode */
@@ -192,456 +148,58 @@ static bool gp_stroke_weightmode_poll(bContext *C)
return 0;
}
-static void ed_keymap_gpencil_selection(wmKeyMap *keymap)
-{
- wmKeyMapItem *kmi;
-
- /* select all */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- /* circle select */
- WM_keymap_add_item(keymap, "GPENCIL_OT_select_circle", CKEY, KM_PRESS, 0, 0);
-
- /* border select */
- WM_keymap_add_item(keymap, "GPENCIL_OT_select_border", BKEY, KM_PRESS, 0, 0);
-
- /* lasso select */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_SHIFT | KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "deselect", true);
-
- /* In the Node Editor, lasso select needs ALT modifier too (as somehow CTRL+LMB drag gets taken for "cut" quite early)
- * There probably isn't too much harm adding this for other editors too as part of standard GP editing keymap. This hotkey
- * combo doesn't seem to see much use under standard scenarios?
- */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_SHIFT | KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", true);
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "toggle", true);
-
- /* whole stroke select */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "entire_strokes", true);
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_select", SELECTMOUSE, KM_PRESS, KM_ALT | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "entire_strokes", true);
- RNA_boolean_set(kmi->ptr, "extend", true);
-
- /* select linked */
- /* NOTE: While LKEY is redundant, not having it breaks the mode illusion too much */
- WM_keymap_add_item(keymap, "GPENCIL_OT_select_linked", LKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "GPENCIL_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0);
-
- /* select alternate */
- WM_keymap_add_item(keymap, "GPENCIL_OT_select_alternate", LKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* select grouped */
- WM_keymap_add_item(keymap, "GPENCIL_OT_select_grouped", GKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* select more/less */
- WM_keymap_add_item(keymap, "GPENCIL_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "GPENCIL_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
-}
-
-static void ed_keymap_gpencil_display(wmKeyMap *keymap)
-{
- wmKeyMapItem *kmi;
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", QKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.overlay.use_gpencil_edit_lines");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", QKEY, KM_PRESS, KM_SHIFT | KM_ALT, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.overlay.use_gpencil_multiedit_line_only");
-}
-
-static void ed_keymap_gpencil_sculpt(wmKeyMap *keymap)
-{
- wmKeyMapItem *kmi;
-
- /* Pie Menu - For settings/tools easy access */
- WM_keymap_add_menu_pie(keymap, "GPENCIL_PIE_sculpt", EKEY, KM_PRESS, 0, DKEY);
-
- /* Sculpting ------------------------------------- */
-
- /* Brush-Based Editing:
- * EKEY + LMB = Single stroke, draw immediately
- * + Other Modifiers (Ctrl/Shift) = Invert, Smooth, etc.
- *
- * For the modal version, use D+E -> Sculpt
- */
- /* GPXX: disabled to make toolsystem works */
- //kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_brush_paint", LEFTMOUSE, KM_PRESS, 0, 0);
- //RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_brush_paint", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
- RNA_boolean_set(kmi->ptr, "keep_brush", true);
- /*RNA_boolean_set(kmi->ptr, "use_invert", true);*/
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_brush_paint", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
- RNA_boolean_set(kmi->ptr, "keep_brush", true);
- /*RNA_boolean_set(kmi->ptr, "use_smooth", true);*/
-
- /* Shift-FKEY = Sculpt Strength */
- kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path_primary", "tool_settings.gpencil_sculpt.brush.strength");
-
- /* FKEY = Sculpt Brush Size */
- kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path_primary", "tool_settings.gpencil_sculpt.brush.size");
-
- /* menu sculpt specials */
- WM_keymap_add_menu(keymap, "VIEW3D_MT_gpencil_sculpt_specials", WKEY, KM_PRESS, 0, 0);
-}
-
-static void ed_keymap_gpencil_weight(wmKeyMap *keymap)
-{
- wmKeyMapItem *kmi;
-
-
- /* Brush-Based Editing:
- * EKEY + LMB = Single stroke, draw immediately
- * + Other Modifiers (Ctrl/Shift) = Invert, Smooth, etc.
- *
- * For the modal version, use D+E -> Sculpt
- */
- /* GPXX: disabled to make toolsystem works */
- //kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_brush_paint", LEFTMOUSE, KM_PRESS, 0, 0);
- //RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_brush_paint", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
- RNA_boolean_set(kmi->ptr, "keep_brush", true);
- /*RNA_boolean_set(kmi->ptr, "use_invert", true);*/
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_brush_paint", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
- RNA_boolean_set(kmi->ptr, "keep_brush", true);
- /*RNA_boolean_set(kmi->ptr, "use_smooth", true);*/
-}
-
/* Stroke Editing Keymap - Only when editmode is enabled */
static void ed_keymap_gpencil_editing(wmKeyConfig *keyconf)
{
wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Grease Pencil Stroke Edit Mode", 0, 0);
- wmKeyMapItem *kmi;
/* set poll callback - so that this keymap only gets enabled when stroke editmode is enabled */
keymap->poll = gp_stroke_editmode_poll;
-
- /* ----------------------------------------------- */
-
- /* Brush Settings */
- /* NOTE: We cannot expose these in the standard keymap, as they will interfere with regular hotkeys
- * in other modes. However, when we are dealing with Stroke Edit Mode, we know for certain
- * that the only data being edited is that of the Grease Pencil strokes
- */
-
- /* Interpolation */
- WM_keymap_add_item(keymap, "GPENCIL_OT_interpolate", EKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- WM_keymap_add_item(keymap, "GPENCIL_OT_interpolate_sequence", EKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
-
- /* normal select */
- WM_keymap_add_item(keymap, "GPENCIL_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
-
- /* Selection */
- ed_keymap_gpencil_selection(keymap);
-
- /* Editing ----------------------------------------- */
-
- /* duplicate and move selected points */
- WM_keymap_add_item(keymap, "GPENCIL_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* delete */
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_gpencil_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_gpencil_delete", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "GPENCIL_OT_dissolve", XKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "GPENCIL_OT_dissolve", DELKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "GPENCIL_OT_active_frames_delete_all", XKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "GPENCIL_OT_active_frames_delete_all", DELKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* menu edit specials */
- WM_keymap_add_menu(keymap, "VIEW3D_MT_gpencil_edit_specials", WKEY, KM_PRESS, 0, 0);
-
- /* menu separate */
- WM_keymap_add_menu(keymap, "GPENCIL_MT_separate", PKEY, KM_PRESS, 0, 0);
-
- /* split strokes */
- WM_keymap_add_item(keymap, "GPENCIL_OT_stroke_split", VKEY, KM_PRESS, 0, 0);
-
- /* join strokes */
- WM_keymap_add_item(keymap, "GPENCIL_OT_stroke_join", JKEY, KM_PRESS, KM_CTRL, 0);
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_stroke_join", JKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "type", GP_STROKE_JOINCOPY);
-
- /* copy + paste */
- WM_keymap_add_item(keymap, "GPENCIL_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "GPENCIL_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0);
-
-#ifdef __APPLE__
- WM_keymap_add_item(keymap, "GPENCIL_OT_copy", CKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "GPENCIL_OT_paste", VKEY, KM_PRESS, KM_OSKEY, 0);
-#endif
-
- /* snap */
- WM_keymap_add_menu(keymap, "GPENCIL_MT_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* convert to geometry */
- WM_keymap_add_item(keymap, "GPENCIL_OT_convert", CKEY, KM_PRESS, KM_ALT, 0);
-
-
- /* Show/Hide */
- /* NOTE: These are available only in EditMode now, since they clash with general-purpose hotkeys */
- WM_keymap_add_item(keymap, "GPENCIL_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_hide", HKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
-
- WM_keymap_add_item(keymap, "GPENCIL_OT_selection_opacity_toggle", HKEY, KM_PRESS, KM_CTRL, 0);
-
- /* Display. */
- ed_keymap_gpencil_display(keymap);
-
- /* Isolate Layer */
- WM_keymap_add_item(keymap, "GPENCIL_OT_layer_isolate", PADASTERKEY, KM_PRESS, 0, 0);
-
- /* Move to Layer */
- WM_keymap_add_item(keymap, "GPENCIL_OT_move_to_layer", MKEY, KM_PRESS, 0, 0);
-
- /* Transform Tools */
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_translate", GKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_translate", EVT_TWEAK_S, KM_ANY, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_rotate", RKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_resize", SKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_mirror", MKEY, KM_PRESS, KM_CTRL, 0);
-
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_bend", WKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "TRANSFORM_OT_tosphere", SKEY, KM_PRESS, KM_ALT | KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "TRANSFORM_OT_shear", SKEY, KM_PRESS, KM_ALT | KM_CTRL | KM_SHIFT, 0);
-
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_GPENCIL_SHRINKFATTEN);
-
- /* Proportional Editing */
- ED_keymap_proportional_cycle(keyconf, keymap);
- ED_keymap_proportional_editmode(keyconf, keymap, true);
-
- /* menu - add GP object (3d view only) */
- WM_keymap_add_item(keymap, "OBJECT_OT_gpencil_add", AKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* menu vertex group */
- WM_keymap_add_menu(keymap, "GPENCIL_MT_gpencil_vertex_group", GKEY, KM_PRESS, KM_CTRL, 0);
-
- /* toggle edit mode */
- WM_keymap_add_item(keymap, "GPENCIL_OT_editmode_toggle", TABKEY, KM_PRESS, 0, 0);
}
/* keys for draw with a drawing brush (no fill) */
static void ed_keymap_gpencil_painting_draw(wmKeyConfig *keyconf)
{
wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Grease Pencil Stroke Paint (Draw brush)", 0, 0);
- wmKeyMapItem *kmi;
-
- /* set poll callback */
keymap->poll = gp_stroke_paintmode_draw_poll;
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_draw", LEFTMOUSE, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_draw", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- /* draw - straight lines */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_draw", LEFTMOUSE, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW_STRAIGHT);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- /* draw - poly lines */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_draw", LEFTMOUSE, KM_PRESS, KM_SHIFT | KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW_POLY);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- /* erase */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_draw", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_ERASER);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- /* Tablet Mappings for Drawing ------------------ */
- /* For now, only support direct drawing using the eraser, as most users using a tablet
- * may still want to use that as their primary pointing device!
- */
-#if 0
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_draw", TABLET_STYLUS, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-#endif
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_draw", TABLET_ERASER, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_ERASER);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- /* Selection (used by eraser) */
- /* border select */
- WM_keymap_add_item(keymap, "GPENCIL_OT_select_border", BKEY, KM_PRESS, 0, 0);
-
- /* lasso select */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", false);
}
/* keys for draw with a eraser brush (erase) */
static void ed_keymap_gpencil_painting_erase(wmKeyConfig *keyconf)
{
wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Grease Pencil Stroke Paint (Erase)", 0, 0);
- wmKeyMapItem *kmi;
-
- /* set poll callback */
keymap->poll = gp_stroke_paintmode_erase_poll;
-
- /* erase */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_draw", LEFTMOUSE, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_ERASER);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_draw", TABLET_ERASER, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_ERASER);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
-
- /* Selection (used by eraser) */
- /* border select */
- WM_keymap_add_item(keymap, "GPENCIL_OT_select_border", BKEY, KM_PRESS, 0, 0);
-
- /* lasso select */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", false);
}
/* keys for draw with a fill brush */
static void ed_keymap_gpencil_painting_fill(wmKeyConfig *keyconf)
{
wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Grease Pencil Stroke Paint (Fill)", 0, 0);
- wmKeyMapItem *kmi;
-
- /* set poll callback */
keymap->poll = gp_stroke_paintmode_fill_poll;
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_fill", LEFTMOUSE, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "on_back", false);
-
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_fill", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "on_back", true);
-
- /* if press alternative key, the brush now it's for drawing areas */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_draw", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
- /* disable straight lines */
- RNA_boolean_set(kmi->ptr, "disable_straight", true);
-
- /* if press alternative key, the brush now it's for drawing lines */
- kmi = WM_keymap_add_item(keymap, "GPENCIL_OT_draw", LEFTMOUSE, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW);
- RNA_boolean_set(kmi->ptr, "wait_for_input", false);
- /* disable straight lines */
- RNA_boolean_set(kmi->ptr, "disable_straight", true);
- /* enable special stroke with no fill flag */
- RNA_boolean_set(kmi->ptr, "disable_fill", true);
}
/* Stroke Painting Keymap - Only when paintmode is enabled */
static void ed_keymap_gpencil_painting(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Grease Pencil Stroke Paint Mode", 0, 0);
- wmKeyMapItem *kmi;
-
/* set poll callback - so that this keymap only gets enabled when stroke paintmode is enabled */
+ wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Grease Pencil Stroke Paint Mode", 0, 0);
keymap->poll = gp_stroke_paintmode_poll;
-
- /* FKEY = Brush Size */
- kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path_primary", "tool_settings.gpencil_paint.brush.size");
-
- /* CTRL + FKEY = Eraser Radius */
- kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path_primary", "user_preferences.edit.grease_pencil_eraser_radius");
-
- /* menu draw specials */
- WM_keymap_add_menu(keymap, "GPENCIL_MT_gpencil_draw_specials", WKEY, KM_PRESS, 0, 0);
-
- /* menu draw delete */
- WM_keymap_add_menu(keymap, "GPENCIL_MT_gpencil_draw_delete", XKEY, KM_PRESS, 0, 0);
-
}
/* Stroke Sculpting Keymap - Only when sculptmode is enabled */
static void ed_keymap_gpencil_sculpting(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Grease Pencil Stroke Sculpt Mode", 0, 0);
-
/* set poll callback - so that this keymap only gets enabled when stroke sculptmode is enabled */
+ wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Grease Pencil Stroke Sculpt Mode", 0, 0);
keymap->poll = gp_stroke_sculptmode_poll;
-
- /* Selection */
- ed_keymap_gpencil_selection(keymap);
-
- /* sculpt */
- ed_keymap_gpencil_sculpt(keymap);
-
- /* Display. */
- ed_keymap_gpencil_display(keymap);
}
/* Stroke Weight Paint Keymap - Only when weight is enabled */
static void ed_keymap_gpencil_weightpainting(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Grease Pencil Stroke Weight Mode", 0, 0);
- wmKeyMapItem *kmi;
-
/* set poll callback - so that this keymap only gets enabled when stroke sculptmode is enabled */
+ wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Grease Pencil Stroke Weight Mode", 0, 0);
keymap->poll = gp_stroke_weightmode_poll;
-
- /* Selection */
- ed_keymap_gpencil_selection(keymap);
-
- /* sculpt */
- ed_keymap_gpencil_weight(keymap);
-
- /* Shift-FKEY = Sculpt Strength */
- kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path_primary", "tool_settings.gpencil_sculpt.weight_brush.strength");
-
- /* FKEY = Sculpt Brush Size */
- kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path_primary", "tool_settings.gpencil_sculpt.weight_brush.size");
-
- /* Display. */
- ed_keymap_gpencil_display(keymap);
}
/* ==================== */
@@ -673,6 +231,7 @@ void ED_operatortypes_gpencil(void)
/* Editing (Strokes) ------------ */
WM_operatortype_append(GPENCIL_OT_editmode_toggle);
+ WM_operatortype_append(GPENCIL_OT_selectmode_toggle);
WM_operatortype_append(GPENCIL_OT_paintmode_toggle);
WM_operatortype_append(GPENCIL_OT_sculptmode_toggle);
WM_operatortype_append(GPENCIL_OT_weightmode_toggle);
@@ -681,7 +240,7 @@ void ED_operatortypes_gpencil(void)
WM_operatortype_append(GPENCIL_OT_select);
WM_operatortype_append(GPENCIL_OT_select_all);
WM_operatortype_append(GPENCIL_OT_select_circle);
- WM_operatortype_append(GPENCIL_OT_select_border);
+ WM_operatortype_append(GPENCIL_OT_select_box);
WM_operatortype_append(GPENCIL_OT_select_lasso);
WM_operatortype_append(GPENCIL_OT_select_linked);
@@ -751,9 +310,6 @@ void ED_operatortypes_gpencil(void)
WM_operatortype_append(GPENCIL_OT_stroke_split);
WM_operatortype_append(GPENCIL_OT_brush_presets_create);
- WM_operatortype_append(GPENCIL_OT_brush_select);
-
- WM_operatortype_append(GPENCIL_OT_sculpt_select);
/* vertex groups */
WM_operatortype_append(GPENCIL_OT_vertex_group_assign);
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index f000eac5f94..f95122b2282 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -314,20 +314,20 @@ static bool gp_stroke_filtermval(tGPsdata *p, const int mval[2], int pmval[2])
}
else {
/* If the mouse is moving within the radius of the last move,
- * don't update the mouse position. This allows sharp turns. */
+ * don't update the mouse position. This allows sharp turns. */
copy_v2_v2_int(p->mval, p->mvalo);
return false;
}
}
/* check if mouse moved at least certain distance on both axes (best case)
- * - aims to eliminate some jitter-noise from input when trying to draw straight lines freehand
+ * - aims to eliminate some jitter-noise from input when trying to draw straight lines freehand
*/
else if ((dx > MIN_MANHATTEN_PX) && (dy > MIN_MANHATTEN_PX))
return true;
/* check if the distance since the last point is significant enough
- * - prevents points being added too densely
- * - distance here doesn't use sqrt to prevent slowness... we should still be safe from overflows though
+ * - prevents points being added too densely
+ * - distance here doesn't use sqrt to prevent slowness... we should still be safe from overflows though
*/
else if ((dx * dx + dy * dy) > MIN_EUCLIDEAN_PX * MIN_EUCLIDEAN_PX)
return true;
@@ -371,12 +371,9 @@ static void gp_stroke_convertcoords(tGPsdata *p, const int mval[2], float out[3]
/* in 3d-space - pt->x/y/z are 3 side-by-side floats */
if (gpd->runtime.sbuffer_sflag & GP_STROKE_3DSPACE) {
- /* add small offset to keep stroke over the surface.
- * This could be a UI parameter, but the value is too sensitive for
- * the user to use it and don't improve the result.
- */
- if (depth) {
- *depth *= 0.99998f;
+ /* add small offset to keep stroke over the surface */
+ if ((depth) && (gpd->zdepth_offset > 0.0f)) {
+ *depth *= (1.0f - gpd->zdepth_offset);
}
if (gpencil_project_check(p) && (ED_view3d_autodist_simple(p->ar, mval, out, 0, depth))) {
@@ -386,7 +383,7 @@ static void gp_stroke_convertcoords(tGPsdata *p, const int mval[2], float out[3]
/* verify valid zdepth, if it's wrong, the default darwing mode is used
* and the function doesn't return now */
- if (*depth <= 1.0f) {
+ if ((depth == NULL) || (*depth <= 1.0f)) {
return;
}
}
@@ -421,10 +418,11 @@ static void gp_stroke_convertcoords(tGPsdata *p, const int mval[2], float out[3]
}
/* apply jitter to stroke */
-static void gp_brush_jitter(bGPdata *gpd, Brush *brush, tGPspoint *pt, const int mval[2], int r_mval[2], RNG *rng)
+static void gp_brush_jitter(
+ bGPdata *gpd, Brush *brush, tGPspoint *pt, const int mval[2],
+ const float pressure, int r_mval[2], RNG *rng)
{
- float pressure = pt->pressure;
- float tmp_pressure = pt->pressure;
+ float tmp_pressure = pressure;
if (brush->gpencil_settings->draw_jitter > 0.0f) {
float curvef = curvemapping_evaluateF(brush->gpencil_settings->curve_jitter, 0, pressure);
tmp_pressure = curvef * brush->gpencil_settings->draw_sensitivity;
@@ -500,14 +498,14 @@ static void gp_brush_angle(bGPdata *gpd, Brush *brush, tGPspoint *pt, const int
}
/* Apply smooth to buffer while drawing
-* to smooth point C, use 2 before (A, B) and current point (D):
-*
-* A----B-----C------D
-*
-* \param p Temp data
-* \param inf Influence factor
-* \param idx Index of the last point (need minimum 3 points in the array)
-*/
+ * to smooth point C, use 2 before (A, B) and current point (D):
+ *
+ * A----B-----C------D
+ *
+ * \param p Temp data
+ * \param inf Influence factor
+ * \param idx Index of the last point (need minimum 3 points in the array)
+ */
static void gp_smooth_buffer(tGPsdata *p, float inf, int idx)
{
bGPdata *gpd = p->gpd;
@@ -565,8 +563,8 @@ static short gp_stroke_addpoint(
tGPspoint *pt;
ToolSettings *ts = p->scene->toolsettings;
Object *obact = (Object *)p->ownerPtr.data;
- Depsgraph *depsgraph = p->depsgraph; \
- RegionView3D *rv3d = p->ar->regiondata;
+ Depsgraph *depsgraph = p->depsgraph;
+ RegionView3D *rv3d = p->ar->regiondata;
View3D *v3d = p->sa->spacedata.first;
MaterialGPencilStyle *gp_style = p->material->gp_style;
const int def_nr = obact->actdef - 1;
@@ -604,9 +602,6 @@ static short gp_stroke_addpoint(
gpd->runtime.sbuffer_size = 2;
}
- /* tag depsgraph to update object */
- DEG_id_tag_update(&gpd->id, OB_RECALC_DATA);
-
/* can keep carrying on this way :) */
return GP_STROKEADD_NORMAL;
}
@@ -629,9 +624,12 @@ static short gp_stroke_addpoint(
}
/* Apply jitter to position */
- if ((brush->gpencil_settings->flag & GP_BRUSH_GROUP_RANDOM) && (brush->gpencil_settings->draw_jitter > 0.0f)) {
+ if ((brush->gpencil_settings->flag & GP_BRUSH_GROUP_RANDOM) &&
+ (brush->gpencil_settings->draw_jitter > 0.0f))
+ {
int r_mval[2];
- gp_brush_jitter(gpd, brush, pt, mval, r_mval, p->rng);
+ const float jitpress = (brush->gpencil_settings->flag & GP_BRUSH_USE_JITTER_PRESSURE) ? pressure : 1.0f;
+ gp_brush_jitter(gpd, brush, pt, mval, jitpress, r_mval, p->rng);
copy_v2_v2_int(&pt->x, r_mval);
}
else {
@@ -639,7 +637,7 @@ static short gp_stroke_addpoint(
}
/* apply randomness to pressure */
if ((brush->gpencil_settings->flag & GP_BRUSH_GROUP_RANDOM) &&
- (brush->gpencil_settings->draw_random_press > 0.0f))
+ (brush->gpencil_settings->draw_random_press > 0.0f))
{
float curvef = curvemapping_evaluateF(brush->gpencil_settings->curve_sensitivity, 0, pressure);
float tmp_pressure = curvef * brush->gpencil_settings->draw_sensitivity;
@@ -667,9 +665,7 @@ static short gp_stroke_addpoint(
}
/* apply angle of stroke to brush size */
- if ((brush->gpencil_settings->flag & GP_BRUSH_GROUP_RANDOM) &&
- (brush->gpencil_settings->draw_angle_factor > 0.0f))
- {
+ if (brush->gpencil_settings->draw_angle_factor != 0.0f) {
gp_brush_angle(gpd, brush, pt, mval);
}
@@ -687,7 +683,7 @@ static short gp_stroke_addpoint(
/* apply randomness to color strength */
if ((brush->gpencil_settings->flag & GP_BRUSH_GROUP_RANDOM) &&
- (brush->gpencil_settings->draw_random_strength > 0.0f))
+ (brush->gpencil_settings->draw_random_strength > 0.0f))
{
if (BLI_rng_get_float(p->rng) > 0.5f) {
pt->strength -= pt->strength * brush->gpencil_settings->draw_random_strength * BLI_rng_get_float(p->rng);
@@ -712,12 +708,11 @@ static short gp_stroke_addpoint(
gp_get_3d_reference(p, origin);
/* reproject current */
ED_gpencil_tpoint_to_point(p->ar, origin, pt, &spt);
- ED_gp_project_point_to_plane(obact, rv3d, origin, ts->gp_sculpt.lock_axis - 1, &spt);
+ ED_gp_project_point_to_plane(obact, rv3d, origin, p->lock_axis - 1, &spt);
/* reproject previous */
ED_gpencil_tpoint_to_point(p->ar, origin, ptb, &spt2);
- ED_gp_project_point_to_plane(obact, rv3d, origin, ts->gp_sculpt.lock_axis - 1, &spt2);
-
+ ED_gp_project_point_to_plane(obact, rv3d, origin, p->lock_axis - 1, &spt2);
p->totpixlen += len_v3v3(&spt.x, &spt2.x) / pixsize;
pt->uv_fac = p->totpixlen;
if ((gp_style) && (gp_style->sima)) {
@@ -739,9 +734,6 @@ static short gp_stroke_addpoint(
}
}
- /* tag depsgraph to update object */
- DEG_id_tag_update(&gpd->id, OB_RECALC_DATA);
-
/* check if another operation can still occur */
if (gpd->runtime.sbuffer_size == GP_STROKE_BUFFER_MAX)
return GP_STROKEADD_FULL;
@@ -833,9 +825,6 @@ static short gp_stroke_addpoint(
if (gpd->runtime.sbuffer_size == 0)
gpd->runtime.sbuffer_size++;
- /* tag depsgraph to update object */
- DEG_id_tag_update(&gpd->id, OB_RECALC_DATA);
-
return GP_STROKEADD_NORMAL;
}
@@ -843,81 +832,6 @@ static short gp_stroke_addpoint(
return GP_STROKEADD_INVALID;
}
-/* simplify a stroke (in buffer) before storing it
- * - applies a reverse Chaikin filter
- * - code adapted from etch-a-ton branch
- */
-static void gp_stroke_simplify(tGPsdata *p)
-{
- bGPdata *gpd = p->gpd;
- tGPspoint *old_points = (tGPspoint *)gpd->runtime.sbuffer;
- short num_points = gpd->runtime.sbuffer_size;
- short flag = gpd->runtime.sbuffer_sflag;
- short i, j;
-
- /* only simplify if simplification is enabled, and we're not doing a straight line */
- if (!(U.gp_settings & GP_PAINT_DOSIMPLIFY) || (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT))
- return;
-
- /* don't simplify if less than 4 points in buffer */
- if ((num_points <= 4) || (old_points == NULL))
- return;
-
- /* clear buffer (but don't free mem yet) so that we can write to it
- * - firstly set sbuffer to NULL, so a new one is allocated
- * - secondly, reset flag after, as it gets cleared auto
- */
- gpd->runtime.sbuffer = NULL;
- gp_session_validatebuffer(p);
- gpd->runtime.sbuffer_sflag = flag;
-
- /* macro used in loop to get position of new point
- * - used due to the mixture of datatypes in use here
- */
-#define GP_SIMPLIFY_AVPOINT(offs, sfac) \
- { \
- co[0] += (float)(old_points[offs].x * sfac); \
- co[1] += (float)(old_points[offs].y * sfac); \
- pressure += old_points[offs].pressure * sfac; \
- time += old_points[offs].time * sfac; \
- } (void)0
-
- /* XXX Here too, do not lose start and end points! */
- gp_stroke_addpoint(p, &old_points->x, old_points->pressure, p->inittime + (double)old_points->time);
- for (i = 0, j = 0; i < num_points; i++) {
- if (i - j == 3) {
- float co[2], pressure, time;
- int mco[2];
-
- /* initialize values */
- co[0] = 0.0f;
- co[1] = 0.0f;
- pressure = 0.0f;
- time = 0.0f;
-
- /* using macro, calculate new point */
- GP_SIMPLIFY_AVPOINT(j, -0.25f);
- GP_SIMPLIFY_AVPOINT(j + 1, 0.75f);
- GP_SIMPLIFY_AVPOINT(j + 2, 0.75f);
- GP_SIMPLIFY_AVPOINT(j + 3, -0.25f);
-
- /* set values for adding */
- mco[0] = (int)co[0];
- mco[1] = (int)co[1];
-
- /* ignore return values on this... assume to be ok for now */
- gp_stroke_addpoint(p, mco, pressure, p->inittime + (double)time);
-
- j += 2;
- }
- }
- gp_stroke_addpoint(p, &old_points[num_points - 1].x, old_points[num_points - 1].pressure,
- p->inittime + (double)old_points[num_points - 1].time);
-
- /* free old buffer */
- MEM_freeN(old_points);
-}
-
/* make a new stroke from the buffer data */
static void gp_stroke_newfrombuffer(tGPsdata *p)
{
@@ -1109,7 +1023,7 @@ static void gp_stroke_newfrombuffer(tGPsdata *p)
copy_v2_v2_int(mval, &ptc->x);
if ((ED_view3d_autodist_depth(p->ar, mval, depth_margin, depth_arr + i) == 0) &&
- (i && (ED_view3d_autodist_depth_seg(p->ar, mval, mval_prev, depth_margin + 1, depth_arr + i) == 0)))
+ (i && (ED_view3d_autodist_depth_seg(p->ar, mval, mval_prev, depth_margin + 1, depth_arr + i) == 0)))
{
interp_depth = true;
}
@@ -1126,27 +1040,37 @@ static void gp_stroke_newfrombuffer(tGPsdata *p)
depth_arr[i] = 0.9999f;
}
else {
- if (ts->gpencil_v3d_align & GP_PROJECT_DEPTH_STROKE_ENDPOINTS) {
- /* remove all info between the valid endpoints */
+ if ((ts->gpencil_v3d_align & GP_PROJECT_DEPTH_STROKE_ENDPOINTS) ||
+ (ts->gpencil_v3d_align & GP_PROJECT_DEPTH_STROKE_FIRST))
+ {
int first_valid = 0;
int last_valid = 0;
+ /* find first valid contact point */
for (i = 0; i < gpd->runtime.sbuffer_size; i++) {
if (depth_arr[i] != FLT_MAX)
break;
}
first_valid = i;
- for (i = gpd->runtime.sbuffer_size - 1; i >= 0; i--) {
- if (depth_arr[i] != FLT_MAX)
- break;
+ /* find last valid contact point */
+ if (ts->gpencil_v3d_align & GP_PROJECT_DEPTH_STROKE_FIRST) {
+ last_valid = first_valid;
+ }
+ else {
+ for (i = gpd->runtime.sbuffer_size - 1; i >= 0; i--) {
+ if (depth_arr[i] != FLT_MAX)
+ break;
+ }
+ last_valid = i;
+ }
+ /* invalidate any point other point, to interpolate between
+ * first and last contact in an imaginary line between them */
+ for (i = 0; i < gpd->runtime.sbuffer_size; i++) {
+ if ((i != first_valid) && (i != last_valid)) {
+ depth_arr[i] = FLT_MAX;
+ }
}
- last_valid = i;
-
- /* invalidate non-endpoints, so only blend between first and last */
- for (i = first_valid + 1; i < last_valid; i++)
- depth_arr[i] = FLT_MAX;
-
interp_depth = true;
}
@@ -1185,7 +1109,7 @@ static void gp_stroke_newfrombuffer(tGPsdata *p)
}
/* apply randomness to stroke */
if ((brush->gpencil_settings->flag & GP_BRUSH_GROUP_RANDOM) &&
- (brush->gpencil_settings->draw_random_sub > 0.0f))
+ (brush->gpencil_settings->draw_random_sub > 0.0f))
{
gp_randomize_stroke(gps, brush, p->rng);
}
@@ -1195,11 +1119,11 @@ static void gp_stroke_newfrombuffer(tGPsdata *p)
* the original stroke
*/
if ((brush->gpencil_settings->flag & GP_BRUSH_GROUP_SETTINGS) &&
- (brush->gpencil_settings->draw_smoothfac > 0.0f))
+ (brush->gpencil_settings->draw_smoothfac > 0.0f))
{
float reduce = 0.0f;
for (int r = 0; r < brush->gpencil_settings->draw_smoothlvl; r++) {
- for (i = 0; i < gps->totpoints; i++) {
+ for (i = 0; i < gps->totpoints - 1; i++) {
BKE_gpencil_smooth_stroke(gps, i, brush->gpencil_settings->draw_smoothfac - reduce);
BKE_gpencil_smooth_stroke_strength(gps, i, brush->gpencil_settings->draw_smoothfac);
}
@@ -1208,10 +1132,10 @@ static void gp_stroke_newfrombuffer(tGPsdata *p)
}
/* smooth thickness */
if ((brush->gpencil_settings->flag & GP_BRUSH_GROUP_SETTINGS) &&
- (brush->gpencil_settings->thick_smoothfac > 0.0f))
+ (brush->gpencil_settings->thick_smoothfac > 0.0f))
{
for (int r = 0; r < brush->gpencil_settings->thick_smoothlvl * 2; r++) {
- for (i = 0; i < gps->totpoints; i++) {
+ for (i = 0; i < gps->totpoints - 1; i++) {
BKE_gpencil_smooth_stroke_thickness(gps, i, brush->gpencil_settings->thick_smoothfac);
}
}
@@ -1276,7 +1200,7 @@ static bool gp_stroke_eraser_is_occluded(tGPsdata *p, const bGPDspoint *pt, cons
Object *obact = (Object *)p->ownerPtr.data;
if ((p->sa->spacetype == SPACE_VIEW3D) &&
- (p->flags & GP_PAINTFLAG_V3D_ERASER_DEPTH))
+ (p->flags & GP_PAINTFLAG_V3D_ERASER_DEPTH))
{
RegionView3D *rv3d = p->ar->regiondata;
bGPDlayer *gpl = p->gpl;
@@ -1306,6 +1230,7 @@ static bool gp_stroke_eraser_is_occluded(tGPsdata *p, const bGPDspoint *pt, cons
/* apply a falloff effect to brush strength, based on distance */
static float gp_stroke_eraser_calc_influence(tGPsdata *p, const int mval[2], const int radius, const int co[2])
{
+ Brush *brush = p->brush;
/* Linear Falloff... */
float distance = (float)len_v2v2_int(mval, co);
float fac;
@@ -1313,9 +1238,13 @@ static float gp_stroke_eraser_calc_influence(tGPsdata *p, const int mval[2], con
CLAMP(distance, 0.0f, (float)radius);
fac = 1.0f - (distance / (float)radius);
- /* Control this further using pen pressure */
- fac *= p->pressure;
+ /* apply strength factor */
+ fac *= brush->gpencil_settings->draw_strength;
+ /* Control this further using pen pressure */
+ if (brush->gpencil_settings->flag & GP_BRUSH_USE_PRESSURE) {
+ fac *= p->pressure;
+ }
/* Return influence factor computed here */
return fac;
}
@@ -1338,6 +1267,61 @@ static void gp_free_stroke(bGPdata *gpd, bGPDframe *gpf, bGPDstroke *gps)
gp_update_cache(gpd);
}
+/* analyze points to be removed when soft eraser is used
+ * to avoid that segments gets the end points rounded. This
+ * round cpas breaks the artistic effect.
+ */
+static void gp_stroke_soft_refine(bGPDstroke *gps, const float cull_thresh)
+{
+ bGPDspoint *pt = NULL;
+ bGPDspoint *pt_before = NULL;
+ bGPDspoint *pt_after = NULL;
+ int i;
+
+ /* check if enough points*/
+ if (gps->totpoints < 3) {
+ return;
+ }
+
+ /* loop all points from second to last minus one
+ * to untag any point that is not surrounded by tagged points
+ */
+ pt = gps->points;
+ for (i = 1; i < gps->totpoints - 1; i++, pt++) {
+ if (pt->flag & GP_SPOINT_TAG) {
+ pt_before = &gps->points[i - 1];
+ pt_after = &gps->points[i + 1];
+
+ /* if any of the side points are not tagged, mark to keep */
+ if (((pt_before->flag & GP_SPOINT_TAG) == 0) ||
+ ((pt_after->flag & GP_SPOINT_TAG) == 0))
+ {
+ if (pt->pressure > cull_thresh) {
+ pt->flag |= GP_SPOINT_TEMP_TAG;
+ }
+ }
+ else {
+ /* reduce opacity of extreme points */
+ if ((pt_before->flag & GP_SPOINT_TAG) == 0) {
+ pt_before->strength *= 0.5f;
+ }
+ if ((pt_after->flag & GP_SPOINT_TAG) == 0) {
+ pt_after->strength *= 0.5f;
+ }
+ }
+ }
+ }
+
+ /* now untag temp tagged */
+ pt = gps->points;
+ for (i = 1; i < gps->totpoints - 1; i++, pt++) {
+ if (pt->flag & GP_SPOINT_TEMP_TAG) {
+ pt->flag &= ~GP_SPOINT_TAG;
+ pt->flag &= ~GP_SPOINT_TEMP_TAG;
+ }
+ }
+}
+
/* eraser tool - evaluation per stroke */
/* TODO: this could really do with some optimization (KD-Tree/BVH?) */
static void gp_stroke_eraser_dostroke(tGPsdata *p,
@@ -1348,7 +1332,8 @@ static void gp_stroke_eraser_dostroke(tGPsdata *p,
Depsgraph *depsgraph = p->depsgraph;
Object *obact = (Object *)p->ownerPtr.data;
Brush *eraser = p->eraser;
- bGPDspoint *pt1, *pt2;
+ bGPDspoint *pt0, *pt1, *pt2;
+ int pc0[2] = {0};
int pc1[2] = {0};
int pc2[2] = {0};
int i;
@@ -1432,6 +1417,7 @@ static void gp_stroke_eraser_dostroke(tGPsdata *p,
*/
for (i = 0; (i + 1) < gps->totpoints; i++) {
/* get points to work with */
+ pt0 = i > 0 ? gps->points + i - 1 : NULL;
pt1 = gps->points + i;
pt2 = gps->points + i + 1;
@@ -1440,6 +1426,15 @@ static void gp_stroke_eraser_dostroke(tGPsdata *p,
continue;
bGPDspoint npt;
+ if (pt0) {
+ gp_point_to_parent_space(pt0, diff_mat, &npt);
+ gp_point_to_xy(&p->gsc, gps, &npt, &pc0[0], &pc0[1]);
+ }
+ else {
+ /* avoid null values */
+ copy_v2_v2_int(pc0, pc1);
+ }
+
gp_point_to_parent_space(pt1, diff_mat, &npt);
gp_point_to_xy(&p->gsc, gps, &npt, &pc1[0], &pc1[1]);
@@ -1447,34 +1442,75 @@ static void gp_stroke_eraser_dostroke(tGPsdata *p,
gp_point_to_xy(&p->gsc, gps, &npt, &pc2[0], &pc2[1]);
/* Check that point segment of the boundbox of the eraser stroke */
- if (((!ELEM(V2D_IS_CLIPPED, pc1[0], pc1[1])) && BLI_rcti_isect_pt(rect, pc1[0], pc1[1])) ||
- ((!ELEM(V2D_IS_CLIPPED, pc2[0], pc2[1])) && BLI_rcti_isect_pt(rect, pc2[0], pc2[1])))
+ if (((!ELEM(V2D_IS_CLIPPED, pc0[0], pc0[1])) && BLI_rcti_isect_pt(rect, pc0[0], pc0[1])) ||
+ ((!ELEM(V2D_IS_CLIPPED, pc1[0], pc1[1])) && BLI_rcti_isect_pt(rect, pc1[0], pc1[1])) ||
+ ((!ELEM(V2D_IS_CLIPPED, pc2[0], pc2[1])) && BLI_rcti_isect_pt(rect, pc2[0], pc2[1])))
{
/* Check if point segment of stroke had anything to do with
* eraser region (either within stroke painted, or on its lines)
* - this assumes that linewidth is irrelevant
*/
- if (gp_stroke_inside_circle(mval, mvalo, radius, pc1[0], pc1[1], pc2[0], pc2[1])) {
- if ((gp_stroke_eraser_is_occluded(p, pt1, pc1[0], pc1[1]) == false) ||
- (gp_stroke_eraser_is_occluded(p, pt2, pc2[0], pc2[1]) == false))
+ if (gp_stroke_inside_circle(mval, mvalo, radius, pc0[0], pc0[1], pc2[0], pc2[1])) {
+ if ((gp_stroke_eraser_is_occluded(p, pt0, pc0[0], pc0[1]) == false) ||
+ (gp_stroke_eraser_is_occluded(p, pt1, pc1[0], pc1[1]) == false) ||
+ (gp_stroke_eraser_is_occluded(p, pt2, pc2[0], pc2[1]) == false))
{
/* Point is affected: */
- /* 1) Adjust thickness
+ /* Adjust thickness
* - Influence of eraser falls off with distance from the middle of the eraser
* - Second point gets less influence, as it might get hit again in the next segment
*/
- pt1->pressure -= gp_stroke_eraser_calc_influence(p, mval, radius, pc1) * strength;
- pt2->pressure -= gp_stroke_eraser_calc_influence(p, mval, radius, pc2) * strength / 2.0f;
+
+ /* Adjust strength if the eraser is soft */
+ if (eraser->gpencil_settings->eraser_mode == GP_BRUSH_ERASER_SOFT) {
+ float f_strength = eraser->gpencil_settings->era_strength_f / 100.0f;
+ float f_thickness = eraser->gpencil_settings->era_thickness_f / 100.0f;
+
+ if (pt0) {
+ pt0->strength -= gp_stroke_eraser_calc_influence(p, mval, radius, pc0) * strength * f_strength * 0.5f;
+ CLAMP_MIN(pt0->strength, 0.0f);
+ pt0->pressure -= gp_stroke_eraser_calc_influence(p, mval, radius, pc0) * strength * f_thickness * 0.5f;
+ }
+
+ pt1->strength -= gp_stroke_eraser_calc_influence(p, mval, radius, pc1) * strength * f_strength;
+ CLAMP_MIN(pt1->strength, 0.0f);
+ pt1->pressure -= gp_stroke_eraser_calc_influence(p, mval, radius, pc1) * strength * f_thickness;
+
+ pt2->strength -= gp_stroke_eraser_calc_influence(p, mval, radius, pc2) * strength * f_strength * 0.5f;
+ CLAMP_MIN(pt2->strength, 0.0f);
+ pt2->pressure -= gp_stroke_eraser_calc_influence(p, mval, radius, pc2) * strength * f_thickness * 0.5f;
+
+ /* if invisible, delete point */
+ if ((pt0) &&
+ ((pt0->strength <= GPENCIL_ALPHA_OPACITY_THRESH) ||
+ (pt0->pressure < cull_thresh)))
+ {
+ pt0->flag |= GP_SPOINT_TAG;
+ do_cull = true;
+ }
+ if ((pt1->strength <= GPENCIL_ALPHA_OPACITY_THRESH) || (pt1->pressure < cull_thresh)) {
+ pt1->flag |= GP_SPOINT_TAG;
+ do_cull = true;
+ }
+ if ((pt2->strength <= GPENCIL_ALPHA_OPACITY_THRESH) || (pt2->pressure < cull_thresh)) {
+ pt2->flag |= GP_SPOINT_TAG;
+ do_cull = true;
+ }
+ }
+ else {
+ pt1->pressure -= gp_stroke_eraser_calc_influence(p, mval, radius, pc1) * strength;
+ pt2->pressure -= gp_stroke_eraser_calc_influence(p, mval, radius, pc2) * strength * 0.5f;
+ }
/* 2) Tag any point with overly low influence for removal in the next pass */
if ((pt1->pressure < cull_thresh) || (p->flags & GP_PAINTFLAG_HARD_ERASER) ||
- (eraser->gpencil_settings->eraser_mode == GP_BRUSH_ERASER_HARD))
+ (eraser->gpencil_settings->eraser_mode == GP_BRUSH_ERASER_HARD))
{
pt1->flag |= GP_SPOINT_TAG;
do_cull = true;
}
if ((pt2->pressure < cull_thresh) || (p->flags & GP_PAINTFLAG_HARD_ERASER) ||
- (eraser->gpencil_settings->eraser_mode == GP_BRUSH_ERASER_HARD))
+ (eraser->gpencil_settings->eraser_mode == GP_BRUSH_ERASER_HARD))
{
pt2->flag |= GP_SPOINT_TAG;
do_cull = true;
@@ -1486,6 +1522,12 @@ static void gp_stroke_eraser_dostroke(tGPsdata *p,
/* Second Pass: Remove any points that are tagged */
if (do_cull) {
+ /* if soft eraser, must analyze points to be sure the stroke ends
+ * don't get rounded */
+ if (eraser->gpencil_settings->eraser_mode == GP_BRUSH_ERASER_SOFT) {
+ gp_stroke_soft_refine(gps, cull_thresh);
+ }
+
gp_stroke_delete_tagged_points(gpf, gps, gps->next, GP_SPOINT_TAG, false);
}
gp_update_cache(p->gpd);
@@ -1498,12 +1540,28 @@ static void gp_stroke_doeraser(tGPsdata *p)
bGPDlayer *gpl;
bGPDstroke *gps, *gpn;
rcti rect;
+ Brush *brush = p->brush;
+ Brush *eraser = p->eraser;
+ bool use_pressure = false;
+ float press = 1.0f;
+ /* detect if use pressure in eraser */
+ if (brush->gpencil_tool == GPAINT_TOOL_ERASE) {
+ use_pressure = (bool)(brush->gpencil_settings->flag & GP_BRUSH_USE_PRESSURE);
+ }
+ else if ((eraser != NULL) & (eraser->gpencil_tool == GPAINT_TOOL_ERASE)) {
+ use_pressure = (bool)(eraser->gpencil_settings->flag & GP_BRUSH_USE_PRESSURE);
+ }
+ if (use_pressure) {
+ press = p->pressure;
+ CLAMP(press, 0.01f, 1.0f);
+ }
/* rect is rectangle of eraser */
- rect.xmin = p->mval[0] - p->radius;
- rect.ymin = p->mval[1] - p->radius;
- rect.xmax = p->mval[0] + p->radius;
- rect.ymax = p->mval[1] + p->radius;
+ const int calc_radius = (int)p->radius * press;
+ rect.xmin = p->mval[0] - calc_radius;
+ rect.ymin = p->mval[1] - calc_radius;
+ rect.xmax = p->mval[0] + calc_radius;
+ rect.ymax = p->mval[1] + calc_radius;
if (p->sa->spacetype == SPACE_VIEW3D) {
if (p->flags & GP_PAINTFLAG_V3D_ERASER_DEPTH) {
@@ -1539,7 +1597,7 @@ static void gp_stroke_doeraser(tGPsdata *p)
* (e.g. 2D space strokes in the 3D view, if the same datablock is shared)
*/
if (ED_gpencil_stroke_can_use_direct(p->sa, gps)) {
- gp_stroke_eraser_dostroke(p, gpl, gpf, gps, p->mval, p->mvalo, p->radius, &rect);
+ gp_stroke_eraser_dostroke(p, gpl, gpf, gps, p->mval, p->mvalo, calc_radius, &rect);
}
}
}
@@ -1583,11 +1641,11 @@ static void gp_session_validatebuffer(tGPsdata *p)
static Brush *gp_get_default_eraser(Main *bmain, ToolSettings *ts)
{
Brush *brush_dft = NULL;
- Paint *paint = BKE_brush_get_gpencil_paint(ts);
+ Paint *paint = &ts->gp_paint->paint;
Brush *brush_old = paint->brush;
for (Brush *brush = bmain->brush.first; brush; brush = brush->id.next) {
if ((brush->ob_mode == OB_MODE_GPENCIL_PAINT) &&
- (brush->gpencil_settings->brush_type == GP_BRUSH_TYPE_ERASE))
+ (brush->gpencil_tool == GPAINT_TOOL_ERASE))
{
/* save first eraser to use later if no default */
if (brush_dft == NULL) {
@@ -1610,7 +1668,7 @@ static Brush *gp_get_default_eraser(Main *bmain, ToolSettings *ts)
brush_dft->size = 30.0f;
brush_dft->gpencil_settings->flag |= (GP_BRUSH_ENABLE_CURSOR | GP_BRUSH_DEFAULT_ERASER);
brush_dft->gpencil_settings->icon_id = GP_BRUSH_ICON_ERASE_SOFT;
- brush_dft->gpencil_settings->brush_type = GP_BRUSH_TYPE_ERASE;
+ brush_dft->gpencil_tool = GPAINT_TOOL_ERASE;
brush_dft->gpencil_settings->eraser_mode = GP_BRUSH_ERASER_SOFT;
/* reset current brush */
@@ -1623,43 +1681,36 @@ static Brush *gp_get_default_eraser(Main *bmain, ToolSettings *ts)
/* initialize a drawing brush */
static void gp_init_drawing_brush(bContext *C, tGPsdata *p)
{
- Brush *brush;
Scene *scene = CTX_data_scene(C);
ToolSettings *ts = CTX_data_tool_settings(C);
- Paint *paint = BKE_brush_get_gpencil_paint(ts);
+ Paint *paint = &ts->gp_paint->paint;
/* if not exist, create a new one */
if (paint->brush == NULL) {
/* create new brushes */
BKE_brush_gpencil_presets(C);
- brush = BKE_brush_getactive_gpencil(ts);
- }
- else {
- /* Use the current */
- brush = BKE_brush_getactive_gpencil(ts);
}
/* be sure curves are initializated */
- curvemapping_initialize(brush->gpencil_settings->curve_sensitivity);
- curvemapping_initialize(brush->gpencil_settings->curve_strength);
- curvemapping_initialize(brush->gpencil_settings->curve_jitter);
+ curvemapping_initialize(paint->brush->gpencil_settings->curve_sensitivity);
+ curvemapping_initialize(paint->brush->gpencil_settings->curve_strength);
+ curvemapping_initialize(paint->brush->gpencil_settings->curve_jitter);
- /* asign to temp tGPsdata */
- p->brush = brush;
- if (brush->gpencil_settings->brush_type != GP_BRUSH_TYPE_ERASE) {
+ /* assign to temp tGPsdata */
+ p->brush = paint->brush;
+ if (paint->brush->gpencil_tool != GPAINT_TOOL_ERASE) {
p->eraser = gp_get_default_eraser(p->bmain, ts);
}
else {
- p->eraser = brush;
+ p->eraser = paint->brush;
}
/* use radius of eraser */
p->radius = (short)p->eraser->size;
/* GPXX: Need this update to synchronize brush with draw manager.
- * Maybe this update can be removed when the new tool system
- * will be in place, but while, we need this to keep drawing working.
- *
- */
+ * Maybe this update can be removed when the new tool system
+ * will be in place, but while, we need this to keep drawing working.
+ */
DEG_id_tag_update(&scene->id, DEG_TAG_COPY_ON_WRITE);
}
@@ -1824,8 +1875,18 @@ static bool gp_session_initdata(bContext *C, wmOperator *op, tGPsdata *p)
gp_init_colors(p);
}
- /* lock axis */
- p->lock_axis = ts->gp_sculpt.lock_axis;
+ /* lock axis (in some modes, disable) */
+ if (((*p->align_flag & GP_PROJECT_DEPTH_VIEW) == 0) &&
+ ((*p->align_flag & GP_PROJECT_DEPTH_STROKE) == 0))
+ {
+ p->lock_axis = ts->gp_sculpt.lock_axis;
+ }
+ else {
+ p->lock_axis = 0;
+ }
+
+ /* region where paint was originated */
+ p->gpd->runtime.ar = CTX_wm_region(C);
return 1;
}
@@ -1852,7 +1913,7 @@ static tGPsdata *gp_session_initpaint(bContext *C, wmOperator *op)
/* Random generator, only init once. */
uint rng_seed = (uint)(PIL_check_seconds_timer_i() & UINT_MAX);
- rng_seed ^= GET_UINT_FROM_POINTER(p);
+ rng_seed ^= POINTER_AS_UINT(p);
p->rng = BLI_rng_new(rng_seed);
/* return context data for running paint operator */
@@ -2078,9 +2139,6 @@ static void gp_paint_strokeend(tGPsdata *p)
/* check if doing eraser or not */
if ((p->gpd->runtime.sbuffer_sflag & GP_STROKE_ERASER) == 0) {
- /* simplify stroke before transferring? */
- gp_stroke_simplify(p);
-
/* transfer stroke to frame */
gp_stroke_newfrombuffer(p);
}
@@ -2161,9 +2219,10 @@ static void gpencil_draw_toggle_eraser_cursor(bContext *C, tGPsdata *p, short en
ED_gpencil_toggle_brush_cursor(p->C, false, NULL);
/* enable cursor */
p->erasercursor = WM_paint_cursor_activate(
- CTX_wm_manager(C),
- NULL, /* XXX */
- gpencil_draw_eraser, p);
+ CTX_wm_manager(C),
+ SPACE_TYPE_ANY, RGN_TYPE_ANY,
+ NULL, /* XXX */
+ gpencil_draw_eraser, p);
}
}
@@ -2248,11 +2307,11 @@ static int gpencil_draw_init(bContext *C, wmOperator *op, const wmEvent *event)
tGPsdata *p;
eGPencil_PaintModes paintmode = RNA_enum_get(op->ptr, "mode");
ToolSettings *ts = CTX_data_tool_settings(C);
- Brush *brush = BKE_brush_getactive_gpencil(ts);
+ Brush *brush = BKE_paint_brush(&ts->gp_paint->paint);
/* if mode is draw and the brush is eraser, cancel */
if (paintmode != GP_PAINTMODE_ERASER) {
- if ((brush) && (brush->gpencil_settings->brush_type == GP_BRUSH_TYPE_ERASE)) {
+ if ((brush) && (brush->gpencil_tool == GPAINT_TOOL_ERASE)) {
return 0;
}
}
@@ -2293,12 +2352,13 @@ static void gpencil_draw_cursor_set(tGPsdata *p)
{
Brush *brush = p->brush;
if ((p->paintmode == GP_PAINTMODE_ERASER) ||
- (brush->gpencil_settings->brush_type == GP_BRUSH_TYPE_ERASE))
+ (brush->gpencil_tool == GPAINT_TOOL_ERASE))
{
WM_cursor_modal_set(p->win, BC_CROSSCURSOR); /* XXX need a better cursor */
}
else {
- WM_cursor_modal_set(p->win, CURSOR_STD);
+ WM_cursor_modal_set(p->win, CURSOR_NONE);
+
}
}
@@ -2436,7 +2496,7 @@ static void gpencil_draw_apply(bContext *C, wmOperator *op, tGPsdata *p, Depsgra
}
}
else if ((p->brush->gpencil_settings->flag & GP_BRUSH_STABILIZE_MOUSE_TEMP) &&
- (gpd->runtime.sbuffer_size > 0))
+ (gpd->runtime.sbuffer_size > 0))
{
pt = (tGPspoint *)gpd->runtime.sbuffer + gpd->runtime.sbuffer_size - 1;
if (p->paintmode != GP_PAINTMODE_ERASER) {
@@ -2495,10 +2555,10 @@ static void gpencil_draw_apply_event(bContext *C, wmOperator *op, const wmEvent
p->pressure = wmtab->Pressure;
/* Hack for pressure sensitive eraser on D+RMB when using a tablet:
- * The pen has to float over the tablet surface, resulting in
- * zero pressure (T47101). Ignore pressure values if floating
- * (i.e. "effectively zero" pressure), and only when the "active"
- * end is the stylus (i.e. the default when not eraser)
+ * The pen has to float over the tablet surface, resulting in
+ * zero pressure (T47101). Ignore pressure values if floating
+ * (i.e. "effectively zero" pressure), and only when the "active"
+ * end is the stylus (i.e. the default when not eraser)
*/
if (p->paintmode == GP_PAINTMODE_ERASER) {
if ((wmtab->Active != EVT_TABLET_ERASER) && (p->pressure < 0.001f)) {
@@ -2539,7 +2599,7 @@ static void gpencil_draw_apply_event(bContext *C, wmOperator *op, const wmEvent
p->straight[1] = 0;
/* special exception here for too high pressure values on first touch in
- * windows for some tablets, then we just skip first touch...
+ * windows for some tablets, then we just skip first touch...
*/
if (tablet && (p->pressure >= 0.99f))
return;
@@ -2714,6 +2774,7 @@ static int gpencil_draw_invoke(bContext *C, wmOperator *op, const wmEvent *event
if (p->sa->spacetype == SPACE_VIEW3D) {
Object *ob = CTX_data_active_object(C);
if (ob && (ob->type == OB_GPENCIL) && ((p->gpd->flag & GP_DATA_STROKE_PAINTMODE) == 0)) {
+ /* FIXME: use the mode switching operator, this misses notifiers, messages. */
/* Just set paintmode flag... */
p->gpd->flag |= GP_DATA_STROKE_PAINTMODE;
/* disable other GP modes */
@@ -2942,7 +3003,7 @@ static int gpencil_draw_modal(bContext *C, wmOperator *op, const wmEvent *event)
*/
/* if polyline and release shift must cancel */
if ((ELEM(event->type, RETKEY, PADENTER, ESCKEY, SPACEKEY, EKEY)) ||
- ((p->paintmode == GP_PAINTMODE_DRAW_POLY) && (event->shift == 0)))
+ ((p->paintmode == GP_PAINTMODE_DRAW_POLY) && (event->shift == 0)))
{
/* exit() ends the current stroke before cleaning up */
/* printf("\t\tGP - end of paint op + end of stroke\n"); */
@@ -3140,7 +3201,7 @@ static int gpencil_draw_modal(bContext *C, wmOperator *op, const wmEvent *event)
}
/* eraser size */
else if ((p->paintmode == GP_PAINTMODE_ERASER) &&
- ELEM(event->type, WHEELUPMOUSE, WHEELDOWNMOUSE, PADPLUSKEY, PADMINUS))
+ ELEM(event->type, WHEELUPMOUSE, WHEELDOWNMOUSE, PADPLUSKEY, PADMINUS))
{
/* just resize the brush (local version)
* TODO: fix the hardcoded size jumps (set to make a visible difference) and hardcoded keys
diff --git a/source/blender/editors/gpencil/gpencil_primitive.c b/source/blender/editors/gpencil/gpencil_primitive.c
index 570825d0106..cc93e0433f1 100644
--- a/source/blender/editors/gpencil/gpencil_primitive.c
+++ b/source/blender/editors/gpencil/gpencil_primitive.c
@@ -53,13 +53,12 @@
#include "DNA_space_types.h"
#include "DNA_view3d_types.h"
-#include "BKE_main.h"
#include "BKE_brush.h"
#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_global.h"
#include "BKE_gpencil.h"
-#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_paint.h"
#include "BKE_report.h"
@@ -141,21 +140,15 @@ static void gp_primitive_set_initdata(bContext *C, tGPDprimitive *tgpi)
int cfra_eval = (int)DEG_get_ctime(depsgraph);
bGPDlayer *gpl = CTX_data_active_gpencil_layer(C);
- Brush *brush;
/* if brush doesn't exist, create a new one */
- Paint *paint = BKE_brush_get_gpencil_paint(ts);
+ Paint *paint = &ts->gp_paint->paint;
/* if not exist, create a new one */
if (paint->brush == NULL) {
/* create new brushes */
BKE_brush_gpencil_presets(C);
- brush = BKE_brush_getactive_gpencil(ts);
}
- else {
- /* Use the current */
- brush = BKE_brush_getactive_gpencil(ts);
- }
- tgpi->brush = brush;
+ tgpi->brush = paint->brush;
/* if layer doesn't exist, create a new one */
if (gpl == NULL) {
@@ -175,7 +168,12 @@ static void gp_primitive_set_initdata(bContext *C, tGPDprimitive *tgpi)
/* enable recalculation flag by default */
gps->flag |= GP_STROKE_RECALC_CACHES;
/* the polygon must be closed, so enabled cyclic */
- gps->flag |= GP_STROKE_CYCLIC;
+ if (tgpi->type != GP_STROKE_LINE) {
+ gps->flag |= GP_STROKE_CYCLIC;
+ }
+ else {
+ gps->flag &= ~GP_STROKE_CYCLIC;
+ }
gps->flag |= GP_STROKE_3DSPACE;
gps->mat_nr = BKE_gpencil_get_material_index(tgpi->ob, tgpi->mat) - 1;
@@ -364,7 +362,7 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
}
/* if axis locked, reproject to plane locked */
- if (tgpi->lock_axis > GP_LOCKAXIS_NONE) {
+ if (tgpi->lock_axis > GP_LOCKAXIS_VIEW) {
bGPDspoint *tpt = gps->points;
float origin[3];
ED_gp_get_drawing_reference(tgpi->v3d, tgpi->scene, tgpi->ob, tgpi->gpl,
@@ -407,6 +405,15 @@ static void gpencil_primitive_update(bContext *C, wmOperator *op, tGPDprimitive
/* ----------------------- */
+static void gpencil_primitive_interaction_begin(tGPDprimitive *tgpi, const wmEvent *event)
+{
+ tgpi->top[0] = event->mval[0];
+ tgpi->top[1] = event->mval[1];
+
+ tgpi->bottom[0] = event->mval[0];
+ tgpi->bottom[1] = event->mval[1];
+}
+
/* Exit and free memory */
static void gpencil_primitive_exit(bContext *C, wmOperator *op)
{
@@ -494,7 +501,7 @@ static void gpencil_primitive_init(bContext *C, wmOperator *op)
/* ----------------------- */
/* Invoke handler: Initialize the operator */
-static int gpencil_primitive_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
+static int gpencil_primitive_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
wmWindow *win = CTX_wm_window(C);
bGPdata *gpd = CTX_data_gpencil_data(C);
@@ -504,6 +511,12 @@ static int gpencil_primitive_invoke(bContext *C, wmOperator *op, const wmEvent *
gpencil_primitive_init(C, op);
tgpi = op->customdata;
+ const bool is_modal = RNA_boolean_get(op->ptr, "wait_for_input");
+ if (!is_modal) {
+ tgpi->flag = IN_PROGRESS;
+ gpencil_primitive_interaction_begin(tgpi, event);
+ }
+
/* if in tools region, wait till we get to the main (3d-space)
* region before allowing drawing to take place.
*/
@@ -527,7 +540,7 @@ static int gpencil_primitive_invoke(bContext *C, wmOperator *op, const wmEvent *
}
/* Helper to complete a primitive */
-static void gpencil_primitive_done(bContext *C, wmOperator *op, wmWindow *win, tGPDprimitive *tgpi)
+static void gpencil_primitive_interaction_end(bContext *C, wmOperator *op, wmWindow *win, tGPDprimitive *tgpi)
{
bGPDframe *gpf;
bGPDstroke *gps;
@@ -544,7 +557,7 @@ static void gpencil_primitive_done(bContext *C, wmOperator *op, wmWindow *win, t
/* insert keyframes as required... */
gpf = BKE_gpencil_layer_getframe(tgpi->gpl, tgpi->cframe, GP_GETFRAME_ADD_NEW);
- /* prepare stroke to get transfered */
+ /* prepare stroke to get transferred */
gps = tgpi->gpf->strokes.first;
if (gps) {
gps->thickness = tgpi->brush->size;
@@ -585,17 +598,12 @@ static int gpencil_primitive_modal(bContext *C, wmOperator *op, const wmEvent *e
/* start drawing primitive */
/* TODO: Ignore if not in main region yet */
tgpi->flag = IN_PROGRESS;
-
- tgpi->top[0] = event->mval[0];
- tgpi->top[1] = event->mval[1];
-
- tgpi->bottom[0] = event->mval[0];
- tgpi->bottom[1] = event->mval[1];
+ gpencil_primitive_interaction_begin(tgpi, event);
}
else if ((event->val == KM_RELEASE) && (tgpi->flag == IN_PROGRESS)) {
/* stop drawing primitive */
tgpi->flag = IDLE;
- gpencil_primitive_done(C, op, win, tgpi);
+ gpencil_primitive_interaction_end(C, op, win, tgpi);
/* done! */
return OPERATOR_FINISHED;
}
@@ -608,7 +616,7 @@ static int gpencil_primitive_modal(bContext *C, wmOperator *op, const wmEvent *e
case RETKEY: /* confirm */
{
tgpi->flag = IDLE;
- gpencil_primitive_done(C, op, win, tgpi);
+ gpencil_primitive_interaction_end(C, op, win, tgpi);
/* done! */
return OPERATOR_FINISHED;
}
@@ -710,10 +718,10 @@ static void gpencil_primitive_cancel(bContext *C, wmOperator *op)
void GPENCIL_OT_primitive(wmOperatorType *ot)
{
static EnumPropertyItem primitive_type[] = {
- { GP_STROKE_BOX, "BOX", 0, "Box", "" },
- { GP_STROKE_LINE, "LINE", 0, "Line", "" },
- { GP_STROKE_CIRCLE, "CIRCLE", 0, "Circle", "" },
- { 0, NULL, 0, NULL, NULL }
+ {GP_STROKE_BOX, "BOX", 0, "Box", ""},
+ {GP_STROKE_LINE, "LINE", 0, "Line", ""},
+ {GP_STROKE_CIRCLE, "CIRCLE", 0, "Circle", ""},
+ {0, NULL, 0, NULL, NULL}
};
/* identifiers */
@@ -731,8 +739,13 @@ void GPENCIL_OT_primitive(wmOperatorType *ot)
ot->flag = OPTYPE_UNDO | OPTYPE_BLOCKING;
/* properties */
+ PropertyRNA *prop;
+
RNA_def_int(ot->srna, "edges", 4, MIN_EDGES, MAX_EDGES, "Edges", "Number of polygon edges", MIN_EDGES, MAX_EDGES);
RNA_def_enum(ot->srna, "type", primitive_type, GP_STROKE_BOX, "Type", "Type of shape");
+
+ prop = RNA_def_boolean(ot->srna, "wait_for_input", true, "Wait for Input", "");
+ RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
}
/* *************************************************************** */
diff --git a/source/blender/editors/gpencil/gpencil_select.c b/source/blender/editors/gpencil/gpencil_select.c
index 401a4e2a550..cb3c0575f81 100644
--- a/source/blender/editors/gpencil/gpencil_select.c
+++ b/source/blender/editors/gpencil/gpencil_select.c
@@ -360,7 +360,7 @@ typedef enum eGP_SelectGrouped {
GP_SEL_SAME_LAYER = 0,
/* Select strokes with the same color */
- GP_SEL_SAME_COLOR = 1,
+ GP_SEL_SAME_MATERIAL = 1,
/* TODO: All with same prefix - Useful for isolating all layers for a particular character for instance */
/* TODO: All with same appearance - colour/opacity/volumetric/fills ? */
@@ -376,7 +376,7 @@ static void gp_select_same_layer(bContext *C)
CTX_DATA_BEGIN(C, bGPDlayer *, gpl, editable_gpencil_layers)
{
- bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, 0);
+ bGPDframe *gpf = BKE_gpencil_layer_getframe(gpl, cfra_eval, GP_GETFRAME_USE_PREV);
bGPDstroke *gps;
bool found = false;
@@ -413,7 +413,7 @@ static void gp_select_same_layer(bContext *C)
}
/* Select all strokes with same colors as selected ones */
-static void gp_select_same_color(bContext *C)
+static void gp_select_same_material(bContext *C)
{
/* First, build set containing all the colors of selected strokes */
GSet *selected_colors = BLI_gset_str_new("GP Selected Colors");
@@ -468,8 +468,8 @@ static int gpencil_select_grouped_exec(bContext *C, wmOperator *op)
case GP_SEL_SAME_LAYER:
gp_select_same_layer(C);
break;
- case GP_SEL_SAME_COLOR:
- gp_select_same_color(C);
+ case GP_SEL_SAME_MATERIAL:
+ gp_select_same_material(C);
break;
default:
@@ -491,7 +491,7 @@ void GPENCIL_OT_select_grouped(wmOperatorType *ot)
{
static const EnumPropertyItem prop_select_grouped_types[] = {
{GP_SEL_SAME_LAYER, "LAYER", 0, "Layer", "Shared layers"},
- {GP_SEL_SAME_COLOR, "COLOR", 0, "Color", "Shared colors"},
+ {GP_SEL_SAME_MATERIAL, "MATERIAL", 0, "Material", "Shared materials"},
{0, NULL, 0, NULL, NULL}
};
@@ -827,7 +827,7 @@ void GPENCIL_OT_select_less(wmOperatorType *ot)
static bool gp_stroke_do_circle_sel(
bGPDstroke *gps, GP_SpaceConversion *gsc,
const int mx, const int my, const int radius,
- const bool select, rcti *rect, float diff_mat[4][4])
+ const bool select, rcti *rect, float diff_mat[4][4], const int selectmode)
{
bGPDspoint *pt1, *pt2;
int x0 = 0, y0 = 0, x1 = 0, y1 = 0;
@@ -861,6 +861,7 @@ static bool gp_stroke_do_circle_sel(
/* Loop over the points in the stroke, checking for intersections
* - an intersection means that we touched the stroke
*/
+ bool hit = false;
for (i = 0; (i + 1) < gps->totpoints; i++) {
/* get points to work with */
pt1 = gps->points + i;
@@ -886,8 +887,9 @@ static bool gp_stroke_do_circle_sel(
if (gp_stroke_inside_circle(mval, mvalo, radius, x0, y0, x1, y1)) {
/* change selection of stroke, and then of both points
* (as the last point otherwise wouldn't get selected
- * as we only do n-1 loops through)
+ * as we only do n-1 loops through).
*/
+ hit = true;
if (select) {
pt1->flag |= GP_SPOINT_SELECT;
pt2->flag |= GP_SPOINT_SELECT;
@@ -902,6 +904,22 @@ static bool gp_stroke_do_circle_sel(
}
}
}
+ /* if stroke mode, don't check more points */
+ if ((hit) && (selectmode == GP_SELECTMODE_STROKE)) {
+ break;
+ }
+ }
+
+ /* if stroke mode expand selection */
+ if ((hit) && (selectmode == GP_SELECTMODE_STROKE)) {
+ for (i = 0, pt1 = gps->points; i < gps->totpoints; i++, pt1++) {
+ if (select) {
+ pt1->flag |= GP_SPOINT_SELECT;
+ }
+ else {
+ pt1->flag &= ~GP_SPOINT_SELECT;
+ }
+ }
}
/* Ensure that stroke selection is in sync with its points */
@@ -915,6 +933,9 @@ static bool gp_stroke_do_circle_sel(
static int gpencil_circle_select_exec(bContext *C, wmOperator *op)
{
bGPdata *gpd = ED_gpencil_data_get_active(C);
+ ToolSettings *ts = CTX_data_tool_settings(C);
+ const int selectmode = ts->gpencil_selectmode;
+
/* if not edit/sculpt mode, the event is catched but not processed */
if (GPENCIL_NONE_EDIT_MODE(gpd)) {
return OPERATOR_CANCELLED;
@@ -955,7 +976,7 @@ static int gpencil_circle_select_exec(bContext *C, wmOperator *op)
GP_EDITABLE_STROKES_BEGIN(C, gpl, gps)
{
changed |= gp_stroke_do_circle_sel(
- gps, &gsc, mx, my, radius, select, &rect, diff_mat);
+ gps, &gsc, mx, my, radius, select, &rect, diff_mat, selectmode);
}
GP_EDITABLE_STROKES_END;
@@ -996,30 +1017,34 @@ void GPENCIL_OT_select_circle(wmOperatorType *ot)
/* ********************************************** */
/* Box Selection */
-static int gpencil_border_select_exec(bContext *C, wmOperator *op)
+static int gpencil_box_select_exec(bContext *C, wmOperator *op)
{
bGPdata *gpd = ED_gpencil_data_get_active(C);
+ ToolSettings *ts = CTX_data_tool_settings(C);
ScrArea *sa = CTX_wm_area(C);
const bool select = !RNA_boolean_get(op->ptr, "deselect");
- const bool extend = RNA_boolean_get(op->ptr, "extend") && ((gpd->flag & GP_DATA_STROKE_PAINTMODE) == 0);
+ bool extend = RNA_boolean_get(op->ptr, "extend") && ((gpd->flag & GP_DATA_STROKE_PAINTMODE) == 0);
+ const bool strokemode = (ts->gpencil_selectmode == GP_SELECTMODE_STROKE) && ((gpd->flag & GP_DATA_STROKE_PAINTMODE) == 0);
GP_SpaceConversion gsc = {NULL};
rcti rect = {0};
bool changed = false;
-
/* sanity checks */
if (sa == NULL) {
BKE_report(op->reports, RPT_ERROR, "No active area");
return OPERATOR_CANCELLED;
}
+ if (strokemode) {
+ extend = false;
+ }
+
/* init space conversion stuff */
gp_point_conversion_init(C, &gsc);
-
/* deselect all strokes first? */
if (select && !extend) {
CTX_DATA_BEGIN(C, bGPDstroke *, gps, editable_gpencil_strokes)
@@ -1045,7 +1070,7 @@ static int gpencil_border_select_exec(bContext *C, wmOperator *op)
bGPDspoint *pt;
int i;
-
+ bool hit = false;
for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
int x0, y0;
@@ -1056,6 +1081,7 @@ static int gpencil_border_select_exec(bContext *C, wmOperator *op)
/* test if in selection rect */
if ((!ELEM(V2D_IS_CLIPPED, x0, y0)) && BLI_rcti_isect_pt(&rect, x0, y0)) {
+ hit = true;
if (select) {
pt->flag |= GP_SPOINT_SELECT;
}
@@ -1064,6 +1090,22 @@ static int gpencil_border_select_exec(bContext *C, wmOperator *op)
}
changed = true;
+
+ /* if stroke mode, don't check more points */
+ if ((hit) && (strokemode)) {
+ break;
+ }
+ }
+ }
+ /* if stroke mode expand selection */
+ if ((hit) && (strokemode)) {
+ for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
+ if (select) {
+ pt->flag |= GP_SPOINT_SELECT;
+ }
+ else {
+ pt->flag &= ~GP_SPOINT_SELECT;
+ }
}
}
@@ -1092,18 +1134,18 @@ static int gpencil_border_select_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void GPENCIL_OT_select_border(wmOperatorType *ot)
+void GPENCIL_OT_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
+ ot->name = "Box Select";
ot->description = "Select Grease Pencil strokes within a rectangular region";
- ot->idname = "GPENCIL_OT_select_border";
+ ot->idname = "GPENCIL_OT_select_box";
/* callbacks */
- ot->invoke = WM_gesture_border_invoke;
- ot->exec = gpencil_border_select_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = gpencil_box_select_exec;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = gpencil_select_poll;
@@ -1111,7 +1153,7 @@ void GPENCIL_OT_select_border(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_USE_EVAL_DATA;
/* rna */
- WM_operator_properties_gesture_border_select(ot);
+ WM_operator_properties_gesture_box_select(ot);
}
/* ********************************************** */
@@ -1120,12 +1162,13 @@ void GPENCIL_OT_select_border(wmOperatorType *ot)
static int gpencil_lasso_select_exec(bContext *C, wmOperator *op)
{
bGPdata *gpd = ED_gpencil_data_get_active(C);
+ ToolSettings *ts = CTX_data_tool_settings(C);
GP_SpaceConversion gsc = {NULL};
rcti rect = {0};
- const bool extend = RNA_boolean_get(op->ptr, "extend") && ((gpd->flag & GP_DATA_STROKE_PAINTMODE) == 0);
+ bool extend = RNA_boolean_get(op->ptr, "extend") && ((gpd->flag & GP_DATA_STROKE_PAINTMODE) == 0);
const bool select = !RNA_boolean_get(op->ptr, "deselect");
-
+ const bool strokemode = (ts->gpencil_selectmode == GP_SELECTMODE_STROKE) && ((gpd->flag & GP_DATA_STROKE_PAINTMODE) == 0);
int mcords_tot;
const int (*mcords)[2] = WM_gesture_lasso_path_to_array(C, op, &mcords_tot);
@@ -1135,6 +1178,10 @@ static int gpencil_lasso_select_exec(bContext *C, wmOperator *op)
if (mcords == NULL)
return OPERATOR_PASS_THROUGH;
+ if (strokemode) {
+ extend = false;
+ }
+
/* compute boundbox of lasso (for faster testing later) */
BLI_lasso_boundbox(&rect, mcords, mcords_tot);
@@ -1162,7 +1209,7 @@ static int gpencil_lasso_select_exec(bContext *C, wmOperator *op)
{
bGPDspoint *pt;
int i;
-
+ bool hit = false;
for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
int x0, y0;
@@ -1174,6 +1221,7 @@ static int gpencil_lasso_select_exec(bContext *C, wmOperator *op)
if ((!ELEM(V2D_IS_CLIPPED, x0, y0)) && BLI_rcti_isect_pt(&rect, x0, y0) &&
BLI_lasso_is_point_inside(mcords, mcords_tot, x0, y0, INT_MAX))
{
+ hit = true;
if (select) {
pt->flag |= GP_SPOINT_SELECT;
}
@@ -1182,6 +1230,23 @@ static int gpencil_lasso_select_exec(bContext *C, wmOperator *op)
}
changed = true;
+
+ /* if stroke mode, don't check more points */
+ if ((hit) && (strokemode)) {
+ break;
+ }
+ }
+ }
+
+ /* if stroke mode expand selection */
+ if ((hit) && (strokemode)) {
+ for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
+ if (select) {
+ pt->flag |= GP_SPOINT_SELECT;
+ }
+ else {
+ pt->flag &= ~GP_SPOINT_SELECT;
+ }
}
}
@@ -1239,6 +1304,7 @@ static int gpencil_select_exec(bContext *C, wmOperator *op)
{
ScrArea *sa = CTX_wm_area(C);
bGPdata *gpd = ED_gpencil_data_get_active(C);
+ ToolSettings *ts = CTX_data_tool_settings(C);
/* "radius" is simply a threshold (screen space) to make it easier to test with a tolerance */
const float radius = 0.75f * U.widget_unit;
@@ -1263,6 +1329,11 @@ static int gpencil_select_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
+ /* if select mode is stroke, use whole stroke */
+ if (ts->gpencil_selectmode == GP_SELECTMODE_STROKE) {
+ whole = true;
+ }
+
/* init space conversion stuff */
gp_point_conversion_init(C, &gsc);
@@ -1402,7 +1473,7 @@ void GPENCIL_OT_select(wmOperatorType *ot)
ot->poll = gpencil_select_poll;
/* flag */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_USE_EVAL_DATA;
+ ot->flag = OPTYPE_UNDO | OPTYPE_USE_EVAL_DATA;
/* properties */
WM_operator_properties_mouse_select(ot);
diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c
index 06747798ec7..f58df5e2710 100644
--- a/source/blender/editors/gpencil/gpencil_utils.c
+++ b/source/blender/editors/gpencil/gpencil_utils.c
@@ -50,6 +50,7 @@
#include "DNA_view3d_types.h"
#include "BKE_action.h"
+#include "BKE_colortools.h"
#include "BKE_deform.h"
#include "BKE_main.h"
#include "BKE_brush.h"
@@ -392,18 +393,18 @@ const EnumPropertyItem *ED_gpencil_layers_with_new_enum_itemf(
item_tmp.identifier = "__CREATE__";
item_tmp.name = "New Layer";
item_tmp.value = -1;
- item_tmp.icon = ICON_ZOOMIN;
+ item_tmp.icon = ICON_ADD;
RNA_enum_item_add(&item, &totitem, &item_tmp);
/* separator */
RNA_enum_item_add_separator(&item, &totitem);
}
-
+ const int tot = BLI_listbase_count(&gpd->layers);
/* Existing layers */
- for (gpl = gpd->layers.first, i = 0; gpl; gpl = gpl->next, i++) {
+ for (gpl = gpd->layers.last, i = 0; gpl; gpl = gpl->prev, i++) {
item_tmp.identifier = gpl->info;
item_tmp.name = gpl->info;
- item_tmp.value = i;
+ item_tmp.value = tot - i - 1;
if (gpl->flag & GP_LAYER_ACTIVE)
item_tmp.icon = ICON_GREASEPENCIL;
@@ -433,8 +434,9 @@ const EnumPropertyItem *ED_gpencil_layers_with_new_enum_itemf(
* \param x0, y0 The screen-space x and y coordinates of the start of the stroke segment
* \param x1, y1 The screen-space x and y coordinates of the end of the stroke segment
*/
-bool gp_stroke_inside_circle(const int mval[2], const int UNUSED(mvalo[2]),
- int rad, int x0, int y0, int x1, int y1)
+bool gp_stroke_inside_circle(
+ const int mval[2], const int UNUSED(mvalo[2]),
+ int rad, int x0, int y0, int x1, int y1)
{
/* simple within-radius check for now */
const float mval_fl[2] = {mval[0], mval[1]};
@@ -549,9 +551,9 @@ void gp_point_conversion_init(bContext *C, GP_SpaceConversion *r_gsc)
/**
* Convert point to parent space
*
- * \param pt Original point
- * \param diff_mat Matrix with the difference between original parent matrix
- * \param[out] r_pt Pointer to new point after apply matrix
+ * \param pt: Original point
+ * \param diff_mat: Matrix with the difference between original parent matrix
+ * \param[out] r_pt: Pointer to new point after apply matrix
*/
void gp_point_to_parent_space(bGPDspoint *pt, float diff_mat[4][4], bGPDspoint *r_pt)
{
@@ -609,8 +611,9 @@ void gp_apply_parent_point(Depsgraph *depsgraph, Object *obact, bGPdata *gpd, bG
*
* \warning This assumes that the caller has already checked whether the stroke in question can be drawn.
*/
-void gp_point_to_xy(GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
- int *r_x, int *r_y)
+void gp_point_to_xy(
+ GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
+ int *r_x, int *r_y)
{
ARegion *ar = gsc->ar;
View2D *v2d = gsc->v2d;
@@ -662,8 +665,9 @@ void gp_point_to_xy(GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
*
* \warning This assumes that the caller has already checked whether the stroke in question can be drawn
*/
-void gp_point_to_xy_fl(GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
- float *r_x, float *r_y)
+void gp_point_to_xy_fl(
+ GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
+ float *r_x, float *r_y)
{
ARegion *ar = gsc->ar;
View2D *v2d = gsc->v2d;
@@ -777,8 +781,8 @@ void gp_stroke_convertcoords_tpoint(
if ((depth != NULL) && (ED_view3d_autodist_simple(ar, mval, r_out, 0, depth))) {
/* projecting onto 3D-Geometry
- * - nothing more needs to be done here, since view_autodist_simple() has already done it
- */
+ * - nothing more needs to be done here, since view_autodist_simple() has already done it
+ */
}
else {
float mval_f[2] = {(float)point2D->x, (float)point2D->y};
@@ -849,8 +853,8 @@ void ED_gp_project_stroke_to_plane(Object *ob, RegionView3D *rv3d, bGPDstroke *g
zero_v3(plane_normal);
if (axis < 0) {
/* if the axis is not locked, need a vector to the view direction
- * in order to get the right size of the stroke.
- */
+ * in order to get the right size of the stroke.
+ */
ED_view3d_global_to_vector(rv3d, origin, plane_normal);
}
else {
@@ -928,8 +932,8 @@ void ED_gp_project_point_to_plane(Object *ob, RegionView3D *rv3d, const float or
/**
* Subdivide a stroke once, by adding a point half way between each pair of existing points
- * \param gps Stroke data
- * \param subdivide Number of times to subdivide
+ * \param gps: Stroke data
+ * \param subdivide: Number of times to subdivide
*/
void gp_subdivide_stroke(bGPDstroke *gps, const int subdivide)
{
@@ -944,7 +948,7 @@ void gp_subdivide_stroke(bGPDstroke *gps, const int subdivide)
temp_points = MEM_dupallocN(gps->points);
oldtotpoints = gps->totpoints;
- /* resize the points arrys */
+ /* resize the points arrays */
gps->totpoints += totnewpoints;
gps->points = MEM_recallocN(gps->points, sizeof(*gps->points) * gps->totpoints);
if (gps->dvert != NULL) {
@@ -1023,8 +1027,8 @@ void gp_subdivide_stroke(bGPDstroke *gps, const int subdivide)
/**
* Add randomness to stroke
- * \param gps Stroke data
- * \param brush Brush data
+ * \param gps: Stroke data
+ * \param brush: Brush data
*/
void gp_randomize_stroke(bGPDstroke *gps, Brush *brush, RNG *rng)
{
@@ -1165,11 +1169,11 @@ void ED_gpencil_reset_layers_parent(Depsgraph *depsgraph, Object *obact, bGPdata
/* GP Object Stuff */
/* Helper function to create new OB_GPENCIL Object */
-Object *ED_add_gpencil_object(bContext *C, Scene *scene, const float loc[3])
+Object *ED_add_gpencil_object(bContext *C, Scene *UNUSED(scene), const float loc[3])
{
float rot[3] = {0.0f};
- Object *ob = ED_object_add_type(C, OB_GPENCIL, NULL, loc, rot, false, scene->lay);
+ Object *ob = ED_object_add_type(C, OB_GPENCIL, NULL, loc, rot, false);
/* define size */
BKE_object_obdata_size_init(ob, GP_OBGPENCIL_DEFAULT_SIZE);
@@ -1197,13 +1201,24 @@ void ED_gpencil_add_defaults(bContext *C)
/* ensure color exist */
BKE_gpencil_material_ensure(bmain, ob);
- Paint *paint = BKE_brush_get_gpencil_paint(ts);
+ BKE_paint_ensure(ts, (Paint **)&ts->gp_paint);
+ Paint *paint = &ts->gp_paint->paint;
/* if not exist, create a new one */
if (paint->brush == NULL) {
/* create new brushes */
BKE_brush_gpencil_presets(C);
}
+ /* ensure multiframe falloff curve */
+ if (ts->gp_sculpt.cur_falloff == NULL) {
+ ts->gp_sculpt.cur_falloff = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
+ CurveMapping *gp_falloff_curve = ts->gp_sculpt.cur_falloff;
+ curvemapping_initialize(gp_falloff_curve);
+ curvemap_reset(gp_falloff_curve->cm,
+ &gp_falloff_curve->clipr,
+ CURVE_PRESET_GAUSS,
+ CURVEMAP_SLOPE_POSITIVE);
+ }
}
/* ******************************************************** */
@@ -1212,26 +1227,53 @@ void ED_gpencil_add_defaults(bContext *C)
/* assign points to vertex group */
void ED_gpencil_vgroup_assign(bContext *C, Object *ob, float weight)
{
+ bGPdata *gpd = (bGPdata *)ob->data;
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
const int def_nr = ob->actdef - 1;
if (!BLI_findlink(&ob->defbase, def_nr))
return;
- CTX_DATA_BEGIN(C, bGPDstroke *, gps, editable_gpencil_strokes)
+ CTX_DATA_BEGIN(C, bGPDlayer *, gpl, editable_gpencil_layers)
{
- if (gps->flag & GP_STROKE_SELECT) {
- /* verify the weight array is created */
- BKE_gpencil_dvert_ensure(gps);
+ bGPDframe *init_gpf = gpl->actframe;
+ bGPDstroke *gps = NULL;
+ if (is_multiedit) {
+ init_gpf = gpl->frames.first;
+ }
- for (int i = 0; i < gps->totpoints; i++) {
- bGPDspoint *pt = &gps->points[i];
- MDeformVert *dvert = &gps->dvert[i];
- if (pt->flag & GP_SPOINT_SELECT) {
- MDeformWeight *dw = defvert_verify_index(dvert, def_nr);
- if (dw) {
- dw->weight = weight;
+ for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) {
+ if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) {
+ if (gpf == NULL)
+ continue;
+
+ for (gps = gpf->strokes.first; gps; gps = gps->next) {
+
+ /* skip strokes that are invalid for current view */
+ if (ED_gpencil_stroke_can_use(C, gps) == false)
+ continue;
+
+ if (gps->flag & GP_STROKE_SELECT) {
+ /* verify the weight array is created */
+ BKE_gpencil_dvert_ensure(gps);
+
+ for (int i = 0; i < gps->totpoints; i++) {
+ bGPDspoint *pt = &gps->points[i];
+ MDeformVert *dvert = &gps->dvert[i];
+ if (pt->flag & GP_SPOINT_SELECT) {
+ MDeformWeight *dw = defvert_verify_index(dvert, def_nr);
+ if (dw) {
+ dw->weight = weight;
+ }
+ }
+ }
}
}
}
+
+ /* if not multiedit, exit loop*/
+ if (!is_multiedit) {
+ break;
+ }
}
}
CTX_DATA_END;
@@ -1240,25 +1282,52 @@ void ED_gpencil_vgroup_assign(bContext *C, Object *ob, float weight)
/* remove points from vertex group */
void ED_gpencil_vgroup_remove(bContext *C, Object *ob)
{
+ bGPdata *gpd = (bGPdata *)ob->data;
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
const int def_nr = ob->actdef - 1;
if (!BLI_findlink(&ob->defbase, def_nr))
return;
- CTX_DATA_BEGIN(C, bGPDstroke *, gps, editable_gpencil_strokes)
+ CTX_DATA_BEGIN(C, bGPDlayer *, gpl, editable_gpencil_layers)
{
- for (int i = 0; i < gps->totpoints; i++) {
- bGPDspoint *pt = &gps->points[i];
- if (gps->dvert == NULL) {
- continue;
- }
- MDeformVert *dvert = &gps->dvert[i];
+ bGPDframe *init_gpf = gpl->actframe;
+ bGPDstroke *gps = NULL;
+ if (is_multiedit) {
+ init_gpf = gpl->frames.first;
+ }
- if ((pt->flag & GP_SPOINT_SELECT) && (dvert->totweight > 0)) {
- MDeformWeight *dw = defvert_find_index(dvert, def_nr);
- if (dw != NULL) {
- defvert_remove_group(dvert, dw);
+ for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) {
+ if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) {
+ if (gpf == NULL)
+ continue;
+
+ for (gps = gpf->strokes.first; gps; gps = gps->next) {
+
+ /* skip strokes that are invalid for current view */
+ if (ED_gpencil_stroke_can_use(C, gps) == false)
+ continue;
+
+ for (int i = 0; i < gps->totpoints; i++) {
+ bGPDspoint *pt = &gps->points[i];
+ if (gps->dvert == NULL) {
+ continue;
+ }
+ MDeformVert *dvert = &gps->dvert[i];
+
+ if ((pt->flag & GP_SPOINT_SELECT) && (dvert->totweight > 0)) {
+ MDeformWeight *dw = defvert_find_index(dvert, def_nr);
+ if (dw != NULL) {
+ defvert_remove_group(dvert, dw);
+ }
+ }
+ }
}
}
+
+ /* if not multiedit, exit loop*/
+ if (!is_multiedit) {
+ break;
+ }
}
}
CTX_DATA_END;
@@ -1267,22 +1336,49 @@ void ED_gpencil_vgroup_remove(bContext *C, Object *ob)
/* select points of vertex group */
void ED_gpencil_vgroup_select(bContext *C, Object *ob)
{
+ bGPdata *gpd = (bGPdata *)ob->data;
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
const int def_nr = ob->actdef - 1;
if (!BLI_findlink(&ob->defbase, def_nr))
return;
- CTX_DATA_BEGIN(C, bGPDstroke *, gps, editable_gpencil_strokes)
+ CTX_DATA_BEGIN(C, bGPDlayer *, gpl, editable_gpencil_layers)
{
- for (int i = 0; i < gps->totpoints; i++) {
- bGPDspoint *pt = &gps->points[i];
- if (gps->dvert == NULL) {
- continue;
+ bGPDframe *init_gpf = gpl->actframe;
+ bGPDstroke *gps = NULL;
+ if (is_multiedit) {
+ init_gpf = gpl->frames.first;
+ }
+
+ for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) {
+ if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) {
+ if (gpf == NULL)
+ continue;
+
+ for (gps = gpf->strokes.first; gps; gps = gps->next) {
+
+ /* skip strokes that are invalid for current view */
+ if (ED_gpencil_stroke_can_use(C, gps) == false)
+ continue;
+
+ for (int i = 0; i < gps->totpoints; i++) {
+ bGPDspoint *pt = &gps->points[i];
+ if (gps->dvert == NULL) {
+ continue;
+ }
+ MDeformVert *dvert = &gps->dvert[i];
+
+ if (defvert_find_index(dvert, def_nr) != NULL) {
+ pt->flag |= GP_SPOINT_SELECT;
+ gps->flag |= GP_STROKE_SELECT;
+ }
+ }
+ }
}
- MDeformVert *dvert = &gps->dvert[i];
- if (defvert_find_index(dvert, def_nr) != NULL) {
- pt->flag |= GP_SPOINT_SELECT;
- gps->flag |= GP_STROKE_SELECT;
+ /* if not multiedit, exit loop*/
+ if (!is_multiedit) {
+ break;
}
}
}
@@ -1292,22 +1388,48 @@ void ED_gpencil_vgroup_select(bContext *C, Object *ob)
/* unselect points of vertex group */
void ED_gpencil_vgroup_deselect(bContext *C, Object *ob)
{
+ bGPdata *gpd = (bGPdata *)ob->data;
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
const int def_nr = ob->actdef - 1;
if (!BLI_findlink(&ob->defbase, def_nr))
return;
- CTX_DATA_BEGIN(C, bGPDstroke *, gps, editable_gpencil_strokes)
+ CTX_DATA_BEGIN(C, bGPDlayer *, gpl, editable_gpencil_layers)
{
- for (int i = 0; i < gps->totpoints; i++) {
- bGPDspoint *pt = &gps->points[i];
- if (gps->dvert == NULL) {
- continue;
+ bGPDframe *init_gpf = gpl->actframe;
+ bGPDstroke *gps = NULL;
+ if (is_multiedit) {
+ init_gpf = gpl->frames.first;
+ }
+
+ for (bGPDframe *gpf = init_gpf; gpf; gpf = gpf->next) {
+ if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) {
+ if (gpf == NULL)
+ continue;
+
+ for (gps = gpf->strokes.first; gps; gps = gps->next) {
+
+ /* skip strokes that are invalid for current view */
+ if (ED_gpencil_stroke_can_use(C, gps) == false)
+ continue;
+
+ for (int i = 0; i < gps->totpoints; i++) {
+ bGPDspoint *pt = &gps->points[i];
+ if (gps->dvert == NULL) {
+ continue;
+ }
+ MDeformVert *dvert = &gps->dvert[i];
+
+ if (defvert_find_index(dvert, def_nr) != NULL) {
+ pt->flag &= ~GP_SPOINT_SELECT;
+ }
+ }
+ }
}
- MDeformVert *dvert = &gps->dvert[i];
- if (defvert_find_index(dvert, def_nr) != NULL) {
- pt->flag &= ~GP_SPOINT_SELECT;
- gps->flag |= GP_STROKE_SELECT;
+ /* if not multiedit, exit loop*/
+ if (!is_multiedit) {
+ break;
}
}
}
@@ -1322,6 +1444,14 @@ static bool gp_check_cursor_region(bContext *C, int mval[2])
{
ARegion *ar = CTX_wm_region(C);
ScrArea *sa = CTX_wm_area(C);
+ Object *ob = CTX_data_active_object(C);
+
+ if ((ob == NULL) ||
+ (!ELEM(ob->mode, OB_MODE_GPENCIL_PAINT, OB_MODE_GPENCIL_SCULPT, OB_MODE_GPENCIL_WEIGHT)))
+ {
+ return false;
+ }
+
/* TODO: add more spacetypes */
if (!ELEM(sa->spacetype, SPACE_VIEW3D)) {
return false;
@@ -1330,11 +1460,7 @@ static bool gp_check_cursor_region(bContext *C, int mval[2])
return false;
}
else if (ar) {
- rcti region_rect;
-
- /* Perform bounds check using */
- ED_region_visible_rect(ar, &region_rect);
- return BLI_rcti_isect_pt_v(&region_rect, mval);
+ return BLI_rcti_isect_pt_v(&ar->winrct, mval);
}
else {
return false;
@@ -1370,10 +1496,11 @@ void ED_gpencil_brush_draw_eraser(Brush *brush, int x, int y)
immUniform1f("dash_width", 12.0f);
immUniform1f("dash_factor", 0.5f);
- imm_draw_circle_wire_2d(shdr_pos, x, y, radius,
- /* XXX Dashed shader gives bad results with sets of small segments currently,
- * temp hack around the issue. :( */
- max_ii(8, radius / 2)); /* was fixed 40 */
+ imm_draw_circle_wire_2d(
+ shdr_pos, x, y, radius,
+ /* XXX Dashed shader gives bad results with sets of small segments currently,
+ * temp hack around the issue. :( */
+ max_ii(8, radius / 2)); /* was fixed 40 */
immUnbindProgram();
@@ -1391,17 +1518,17 @@ static void gp_brush_drawcursor(bContext *C, int x, int y, void *customdata)
GP_BrushEdit_Settings *gset = &scene->toolsettings->gp_sculpt;
bGPdata *gpd = ED_gpencil_data_get_active(C);
- GP_EditBrush_Data *brush = NULL;
- Brush *paintbrush = NULL;
+ GP_EditBrush_Data *gp_brush = NULL;
+ Brush *brush = NULL;
Material *ma = NULL;
MaterialGPencilStyle *gp_style = NULL;
int *last_mouse_position = customdata;
if ((gpd) && (gpd->flag & GP_DATA_STROKE_WEIGHTMODE)) {
- brush = &gset->brush[gset->weighttype];
+ gp_brush = &gset->brush[gset->weighttype];
}
else {
- brush = &gset->brush[gset->brushtype];
+ gp_brush = &gset->brush[gset->brushtype];
}
/* default radius and color */
@@ -1417,51 +1544,51 @@ static void gp_brush_drawcursor(bContext *C, int x, int y, void *customdata)
/* for paint use paint brush size and color */
if (gpd->flag & GP_DATA_STROKE_PAINTMODE) {
- paintbrush = BKE_brush_getactive_gpencil(scene->toolsettings);
+ brush = scene->toolsettings->gp_paint->paint.brush;
/* while drawing hide */
if ((gpd->runtime.sbuffer_size > 0) &&
- (paintbrush) && ((paintbrush->gpencil_settings->flag & GP_BRUSH_STABILIZE_MOUSE) == 0) &&
- ((paintbrush->gpencil_settings->flag & GP_BRUSH_STABILIZE_MOUSE_TEMP) == 0))
+ (brush) && ((brush->gpencil_settings->flag & GP_BRUSH_STABILIZE_MOUSE) == 0) &&
+ ((brush->gpencil_settings->flag & GP_BRUSH_STABILIZE_MOUSE_TEMP) == 0))
{
return;
}
- if (paintbrush) {
- if ((paintbrush->gpencil_settings->flag & GP_BRUSH_ENABLE_CURSOR) == 0) {
+ if (brush) {
+ if ((brush->gpencil_settings->flag & GP_BRUSH_ENABLE_CURSOR) == 0) {
return;
}
/* eraser has special shape and use a different shader program */
- if (paintbrush->gpencil_settings->brush_type == GP_BRUSH_TYPE_ERASE) {
- ED_gpencil_brush_draw_eraser(paintbrush, x, y);
+ if (brush->gpencil_tool == GPAINT_TOOL_ERASE) {
+ ED_gpencil_brush_draw_eraser(brush, x, y);
return;
}
/* get current drawing color */
- ma = BKE_gpencil_get_material_from_brush(paintbrush);
+ ma = BKE_gpencil_get_material_from_brush(brush);
if (ma == NULL) {
BKE_gpencil_material_ensure(bmain, ob);
/* assign the first material to the brush */
ma = give_current_material(ob, 1);
- paintbrush->gpencil_settings->material = ma;
+ brush->gpencil_settings->material = ma;
}
gp_style = ma->gp_style;
/* after some testing, display the size of the brush is not practical because
* is too disruptive and the size of cursor does not change with zoom factor.
- * The decision was to use a fix size, instead of paintbrush->thickness value.
+ * The decision was to use a fix size, instead of brush->thickness value.
*/
if ((gp_style) && (GPENCIL_PAINT_MODE(gpd)) &&
- ((paintbrush->gpencil_settings->flag & GP_BRUSH_STABILIZE_MOUSE) == 0) &&
- ((paintbrush->gpencil_settings->flag & GP_BRUSH_STABILIZE_MOUSE_TEMP) == 0) &&
- (paintbrush->gpencil_settings->brush_type == GP_BRUSH_TYPE_DRAW))
+ ((brush->gpencil_settings->flag & GP_BRUSH_STABILIZE_MOUSE) == 0) &&
+ ((brush->gpencil_settings->flag & GP_BRUSH_STABILIZE_MOUSE_TEMP) == 0) &&
+ (brush->gpencil_tool == GPAINT_TOOL_DRAW))
{
radius = 2.0f;
copy_v3_v3(color, gp_style->stroke_rgba);
}
else {
radius = 5.0f;
- copy_v3_v3(color, paintbrush->add_col);
+ copy_v3_v3(color, brush->add_col);
}
}
else {
@@ -1471,17 +1598,17 @@ static void gp_brush_drawcursor(bContext *C, int x, int y, void *customdata)
/* for sculpt use sculpt brush size */
if (GPENCIL_SCULPT_OR_WEIGHT_MODE(gpd)) {
- if (brush) {
- if ((brush->flag & GP_EDITBRUSH_FLAG_ENABLE_CURSOR) == 0) {
+ if (gp_brush) {
+ if ((gp_brush->flag & GP_EDITBRUSH_FLAG_ENABLE_CURSOR) == 0) {
return;
}
- radius = brush->size;
- if (brush->flag & (GP_EDITBRUSH_FLAG_INVERT | GP_EDITBRUSH_FLAG_TMP_INVERT)) {
- copy_v3_v3(color, brush->curcolor_sub);
+ radius = gp_brush->size;
+ if (gp_brush->flag & (GP_EDITBRUSH_FLAG_INVERT | GP_EDITBRUSH_FLAG_TMP_INVERT)) {
+ copy_v3_v3(color, gp_brush->curcolor_sub);
}
else {
- copy_v3_v3(color, brush->curcolor_add);
+ copy_v3_v3(color, gp_brush->curcolor_add);
}
}
}
@@ -1497,9 +1624,9 @@ static void gp_brush_drawcursor(bContext *C, int x, int y, void *customdata)
/* Inner Ring: Color from UI panel */
immUniformColor4f(color[0], color[1], color[2], 0.8f);
if ((gp_style) && (GPENCIL_PAINT_MODE(gpd)) &&
- ((paintbrush->gpencil_settings->flag & GP_BRUSH_STABILIZE_MOUSE) == 0) &&
- ((paintbrush->gpencil_settings->flag & GP_BRUSH_STABILIZE_MOUSE_TEMP) == 0) &&
- (paintbrush->gpencil_settings->brush_type == GP_BRUSH_TYPE_DRAW))
+ ((brush->gpencil_settings->flag & GP_BRUSH_STABILIZE_MOUSE) == 0) &&
+ ((brush->gpencil_settings->flag & GP_BRUSH_STABILIZE_MOUSE_TEMP) == 0) &&
+ (brush->gpencil_tool == GPAINT_TOOL_DRAW))
{
imm_draw_circle_fill_2d(pos, x, y, radius, 40);
}
@@ -1517,12 +1644,12 @@ static void gp_brush_drawcursor(bContext *C, int x, int y, void *customdata)
/* Draw line for lazy mouse */
if ((last_mouse_position) &&
- (paintbrush->gpencil_settings->flag & GP_BRUSH_STABILIZE_MOUSE_TEMP))
+ (brush->gpencil_settings->flag & GP_BRUSH_STABILIZE_MOUSE_TEMP))
{
glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
- copy_v3_v3(color, paintbrush->add_col);
+ copy_v3_v3(color, brush->add_col);
immUniformColor4f(color[0], color[1], color[2], 0.8f);
immBegin(GPU_PRIM_LINES, 2);
@@ -1560,10 +1687,12 @@ void ED_gpencil_toggle_brush_cursor(bContext *C, bool enable, void *customdata)
gset->paintcursor = NULL;
}
/* enable cursor */
- gset->paintcursor = WM_paint_cursor_activate(CTX_wm_manager(C),
- NULL,
- gp_brush_drawcursor,
- (lastpost) ? customdata : NULL);
+ gset->paintcursor = WM_paint_cursor_activate(
+ CTX_wm_manager(C),
+ SPACE_TYPE_ANY, RGN_TYPE_ANY,
+ NULL,
+ gp_brush_drawcursor,
+ (lastpost) ? customdata : NULL);
}
}
@@ -1582,7 +1711,7 @@ static void gpencil_verify_brush_type(bContext *C, int newmode)
break;
case OB_MODE_GPENCIL_WEIGHT:
gset->flag |= GP_BRUSHEDIT_FLAG_WEIGHT_MODE;
- if ((gset->weighttype < GP_EDITBRUSH_TYPE_WEIGHT) || (gset->weighttype >= TOT_GP_EDITBRUSH_TYPES)) {
+ if ((gset->weighttype < GP_EDITBRUSH_TYPE_WEIGHT) || (gset->weighttype >= GP_EDITBRUSH_TYPE_MAX)) {
gset->weighttype = GP_EDITBRUSH_TYPE_WEIGHT;
}
break;
@@ -1688,14 +1817,14 @@ void ED_gpencil_calc_stroke_uv(Object *ob, bGPDstroke *gps)
}
else {
/* use this value by default */
- pixsize = 0.000100f;
+ pixsize = 0.0001f;
}
pixsize = MAX2(pixsize, 0.0000001f);
bGPDspoint *pt = NULL;
bGPDspoint *ptb = NULL;
int i;
- float totlen = 0;
+ float totlen = 0.0f;
/* first read all points and calc distance */
for (i = 0; i < gps->totpoints; i++) {
@@ -1710,15 +1839,21 @@ void ED_gpencil_calc_stroke_uv(Object *ob, bGPDstroke *gps)
totlen += len_v3v3(&pt->x, &ptb->x) / pixsize;
pt->uv_fac = totlen;
}
+
/* normalize the distance using a factor */
float factor;
+
/* if image, use texture width */
if ((gp_style) && (gp_style->sima)) {
factor = gp_style->sima->gen_x;
}
+ else if (totlen == 0) {
+ return;
+ }
else {
factor = totlen;
}
+
for (i = 0; i < gps->totpoints; i++) {
pt = &gps->points[i];
pt->uv_fac /= factor;
diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h
index 0e95cb687b5..b43629c9a9b 100644
--- a/source/blender/editors/include/ED_anim_api.h
+++ b/source/blender/editors/include/ED_anim_api.h
@@ -688,7 +688,7 @@ float ANIM_unit_mapping_get_factor(struct Scene *scene, struct ID *id, struct FC
/* --------- anim_deps.c, animation updates -------- */
-void ANIM_id_update(struct Scene *scene, struct ID *id);
+void ANIM_id_update(struct Main *bmain, struct ID *id);
void ANIM_list_elem_update(struct Main *bmain, struct Scene *scene, bAnimListElem *ale);
/* data -> channels syncing */
diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h
index 5c193392052..7bade53cdf4 100644
--- a/source/blender/editors/include/ED_armature.h
+++ b/source/blender/editors/include/ED_armature.h
@@ -90,12 +90,19 @@ typedef struct EditBone {
short segments;
+ char bbone_prev_type; /* Type of next/prev bone handles */
+ char bbone_next_type;
+ struct EditBone *bbone_prev; /* Next/prev bones to use as handle references when calculating bbones (optional) */
+ struct EditBone *bbone_next;
+
/* Used for display */
float disp_mat[4][4]; /* in Armature space, rest pos matrix */
float disp_tail_mat[4][4]; /* in Armature space, rest pos matrix */
/* 32 == MAX_BBONE_SUBDIV */
float disp_bbone_mat[32][4][4]; /* in Armature space, rest pos matrix */
+ struct EditBone *bbone_child; /* connected child temporary during drawing */
+
/* Used to store temporary data */
union {
struct EditBone *ebone;
@@ -225,7 +232,7 @@ bool ED_pose_deselect_all(struct Object *ob, int select_mode, const bool ignore_
void ED_pose_deselect_all_multi(struct Object **objects, uint objects_len, int select_mode, const bool ignore_visibility);
void ED_pose_bone_select_tag_update(struct Object *ob);
void ED_pose_bone_select(struct Object *ob, struct bPoseChannel *pchan, bool select);
-void ED_pose_recalculate_paths(struct bContext *C, struct Scene *scene, struct Object *ob);
+void ED_pose_recalculate_paths(struct bContext *C, struct Scene *scene, struct Object *ob, bool current_frame_only);
struct Object *ED_pose_object_from_context(struct bContext *C);
/* meshlaplacian.c */
diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h
index 8fcfb4743d5..e4eea9921db 100644
--- a/source/blender/editors/include/ED_curve.h
+++ b/source/blender/editors/include/ED_curve.h
@@ -43,6 +43,7 @@ struct Text;
struct wmOperator;
struct wmKeyConfig;
struct UndoType;
+struct View3D;
/* curve_ops.c */
void ED_operatortypes_curve(void);
@@ -60,18 +61,20 @@ bool ED_curve_editnurb_select_pick(struct bContext *C, const int mval[2], boo
struct Nurb *ED_curve_add_nurbs_primitive(struct bContext *C, struct Object *obedit, float mat[4][4], int type, int newob);
-bool ED_curve_nurb_select_check(struct Curve *cu, struct Nurb *nu);
-int ED_curve_nurb_select_count(struct Curve *cu, struct Nurb *nu);
+bool ED_curve_nurb_select_check(struct View3D *v3d, struct Nurb *nu);
+int ED_curve_nurb_select_count(struct View3D *v3d, struct Nurb *nu);
void ED_curve_nurb_select_all(struct Nurb *nu);
void ED_curve_nurb_deselect_all(struct Nurb *nu);
int join_curve_exec(struct bContext *C, struct wmOperator *op);
/* editcurve_select.c */
-bool ED_curve_select_check(struct Curve *cu, struct EditNurb *editnurb);
+bool ED_curve_select_check(struct View3D *v3d, struct EditNurb *editnurb);
void ED_curve_deselect_all(struct EditNurb *editnurb);
+void ED_curve_deselect_all_multi(struct Object **objects, int objects_len);
void ED_curve_select_all(struct EditNurb *editnurb);
void ED_curve_select_swap(struct EditNurb *editnurb, bool hide_handles);
+int ED_curve_select_count(struct View3D *v3d, struct EditNurb *editnurb);
/* editcurve_undo.c */
void ED_curve_undosys_type(struct UndoType *ut);
diff --git a/source/blender/editors/include/ED_datafiles.h b/source/blender/editors/include/ED_datafiles.h
index 333e3d72615..c21ef288aeb 100644
--- a/source/blender/editors/include/ED_datafiles.h
+++ b/source/blender/editors/include/ED_datafiles.h
@@ -36,9 +36,6 @@
extern int datatoc_startup_blend_size;
extern char datatoc_startup_blend[];
-extern int datatoc_preview_blend_size;
-extern char datatoc_preview_blend[];
-
extern int datatoc_preview_cycles_blend_size;
extern char datatoc_preview_cycles_blend[];
diff --git a/source/blender/editors/include/ED_gizmo_library.h b/source/blender/editors/include/ED_gizmo_library.h
index adc6f859111..be772a6af98 100644
--- a/source/blender/editors/include/ED_gizmo_library.h
+++ b/source/blender/editors/include/ED_gizmo_library.h
@@ -37,11 +37,15 @@ void ED_gizmotypes_button_2d(void);
void ED_gizmotypes_cage_2d(void);
void ED_gizmotypes_cage_3d(void);
void ED_gizmotypes_dial_3d(void);
-void ED_gizmotypes_grab_3d(void);
+void ED_gizmotypes_move_3d(void);
void ED_gizmotypes_facemap_3d(void);
void ED_gizmotypes_preselect_3d(void);
void ED_gizmotypes_primitive_3d(void);
void ED_gizmotypes_blank_3d(void);
+void ED_gizmotypes_value_2d(void);
+
+/* gizmo group types */
+void ED_gizmogrouptypes_value_2d(void);
struct bContext;
struct Object;
@@ -64,7 +68,7 @@ void ED_gizmo_draw_preset_arrow(
void ED_gizmo_draw_preset_circle(
const struct wmGizmo *gz, float mat[4][4], int axis, int select_id);
void ED_gizmo_draw_preset_facemap(
- const struct bContext *C, const struct wmGizmo *gz, struct Scene *scene,
+ const struct bContext *C, const struct wmGizmo *gz,
struct Object *ob, const int facemap, int select_id);
@@ -186,22 +190,24 @@ enum {
ED_GIZMO_DIAL_DRAW_FLAG_FILL = (1 << 1),
ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_MIRROR = (1 << 2),
ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_START_Y = (1 << 3),
+ /* Always show the angle value as an arc in the dial. */
+ ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_VALUE = (1 << 4),
};
/* -------------------------------------------------------------------- */
-/* Grab Gizmo */
+/* Move Gizmo */
/* draw_options */
enum {
- ED_GIZMO_GRAB_DRAW_FLAG_NOP = 0,
+ ED_GIZMO_MOVE_DRAW_FLAG_NOP = 0,
/* only for solid shapes */
- ED_GIZMO_GRAB_DRAW_FLAG_FILL = (1 << 0),
- ED_GIZMO_GRAB_DRAW_FLAG_ALIGN_VIEW = (1 << 1),
+ ED_GIZMO_MOVE_DRAW_FLAG_FILL = (1 << 0),
+ ED_GIZMO_MOVE_DRAW_FLAG_ALIGN_VIEW = (1 << 1),
};
enum {
- ED_GIZMO_GRAB_STYLE_RING_2D = 0,
- ED_GIZMO_GRAB_STYLE_CROSS_2D = 1,
+ ED_GIZMO_MOVE_STYLE_RING_2D = 0,
+ ED_GIZMO_MOVE_STYLE_CROSS_2D = 1,
};
/* -------------------------------------------------------------------- */
@@ -209,11 +215,12 @@ enum {
enum {
ED_GIZMO_BUTTON_SHOW_OUTLINE = (1 << 0),
+ ED_GIZMO_BUTTON_SHOW_BACKDROP = (1 << 1),
/**
* Draw a line from the origin to the offset (similar to an arrow)
* sometimes needed to show what the button edits.
*/
- ED_GIZMO_BUTTON_SHOW_HELPLINE = (1 << 1),
+ ED_GIZMO_BUTTON_SHOW_HELPLINE = (1 << 2),
};
@@ -224,4 +231,24 @@ enum {
ED_GIZMO_PRIMITIVE_STYLE_PLANE = 0,
};
+
+/* -------------------------------------------------------------------- */
+/* Gizmo Drawing Functions */
+
+struct Dial3dParams {
+ int draw_options;
+ float angle_ofs;
+ float angle_delta;
+ float angle_increment;
+ float arc_partial_angle;
+ float arc_inner_factor;
+ float *clip_plane;
+};
+void ED_gizmotypes_dial_3d_draw_util(
+ const float matrix_basis[4][4],
+ const float matrix_final[4][4],
+ const float line_width,
+ const float color[4],
+ struct Dial3dParams *params);
+
#endif /* __ED_GIZMO_LIBRARY_H__ */
diff --git a/source/blender/editors/include/ED_gizmo_utils.h b/source/blender/editors/include/ED_gizmo_utils.h
new file mode 100644
index 00000000000..77956b9ca0d
--- /dev/null
+++ b/source/blender/editors/include/ED_gizmo_utils.h
@@ -0,0 +1,46 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file ED_gizmo_utils.h
+ * \ingroup editors
+ *
+ * \name Generic Gizmo Utilities.
+ */
+
+#ifndef __ED_GIZMO_UTILS_H__
+#define __ED_GIZMO_UTILS_H__
+
+struct bContext;
+struct wmGizmoGroupType;
+
+/** Wrapper function (operator name can't be guessed). */
+bool ED_gizmo_poll_or_unlink_delayed_from_operator(
+ const struct bContext *C, struct wmGizmoGroupType *gzgt,
+ const char *idname);
+
+bool ED_gizmo_poll_or_unlink_delayed_from_tool_ex(
+ const struct bContext *C, struct wmGizmoGroupType *gzgt,
+ const char *gzgt_idname);
+
+/** Use this as poll function directly for: #wmGizmoGroupType.poll */
+bool ED_gizmo_poll_or_unlink_delayed_from_tool(
+ const struct bContext *C, struct wmGizmoGroupType *gzgt);
+
+#endif /* __ED_GIZMO_UTILS_H__ */
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index 25dc6743a33..5d93c2e3065 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -162,7 +162,8 @@ void ED_gpencil_draw_view3d_object(
struct ARegion *ar,
bool only3d);
void ED_gpencil_draw_ex(
- struct RegionView3D *rv3d, struct Scene *scene, struct bGPdata *gpd, int winx, int winy,
+ struct ViewLayer *view_layer, struct RegionView3D *rv3d, struct Scene *scene,
+ struct bGPdata *gpd, int winx, int winy,
const int cfra, const char spacetype);
/* ----------- Grease-Pencil AnimEdit API ------------------ */
@@ -172,7 +173,7 @@ void ED_gplayer_make_cfra_list(struct bGPDlayer *gpl, ListBase *elems, bool only
bool ED_gplayer_frame_select_check(struct bGPDlayer *gpl);
void ED_gplayer_frame_select_set(struct bGPDlayer *gpl, short mode);
-void ED_gplayer_frames_select_border(struct bGPDlayer *gpl, float min, float max, short select_mode);
+void ED_gplayer_frames_select_box(struct bGPDlayer *gpl, float min, float max, short select_mode);
void ED_gplayer_frames_select_region(struct KeyframeEditData *ked, struct bGPDlayer *gpl, short tool, short select_mode);
void ED_gpencil_select_frames(struct bGPDlayer *gpl, short select_mode);
void ED_gpencil_select_frame(struct bGPDlayer *gpl, int selx, short select_mode);
@@ -195,8 +196,9 @@ int ED_gpencil_session_active(void);
int ED_undo_gpencil_step(struct bContext *C, int step, const char *name);
/* ------------ Grease-Pencil Armature weights ------------------ */
-bool ED_gpencil_add_armature_weights(const struct bContext *C, struct ReportList *reports,
- struct Object *ob, struct Object *ob_arm, int mode);
+bool ED_gpencil_add_armature_weights(
+ const struct bContext *C, struct ReportList *reports,
+ struct Object *ob, struct Object *ob_arm, int mode);
/* keep this aligned with gpencil_armature enum */
#define GP_PAR_ARMATURE_NAME 0
diff --git a/source/blender/editors/include/ED_keyframes_draw.h b/source/blender/editors/include/ED_keyframes_draw.h
index 45a0680e0c1..6421c5817b0 100644
--- a/source/blender/editors/include/ED_keyframes_draw.h
+++ b/source/blender/editors/include/ED_keyframes_draw.h
@@ -50,6 +50,17 @@ struct DLRBT_Tree;
/* ****************************** Base Structs ****************************** */
+/* Information about the stretch of time from current to the next column */
+typedef struct ActKeyBlockInfo {
+ /* Combination of flags from all curves. */
+ short flag;
+ /* Mask of flags that differ between curves. */
+ short conflict;
+
+ /* Selection flag. */
+ char sel;
+} ActKeyBlockInfo;
+
/* Keyframe Column Struct */
typedef struct ActKeyColumn {
/* ListBase linkage */
@@ -62,39 +73,28 @@ typedef struct ActKeyColumn {
/* keyframe info */
char key_type; /* eBezTripe_KeyframeType */
+ char handle_type; /* eKeyframeHandleDrawOpts */
+ char extreme_type; /* eKeyframeExtremeDrawOpts */
short sel;
float cfra;
- /* only while drawing - used to determine if long-keyframe needs to be drawn */
- short modified;
- short totcurve;
-} ActKeyColumn;
-
-/* 'Long Keyframe' Struct */
-typedef struct ActKeyBlock {
- /* ListBase linkage */
- struct ActKeyBlock *next, *prev;
-
- /* sorting-tree linkage */
- struct ActKeyBlock *left, *right; /* 'children' of this node, less than and greater than it (respectively) */
- struct ActKeyBlock *parent; /* parent of this node in the tree */
- char tree_col; /* DLRB_BLACK or DLRB_RED */
-
/* key-block info */
- char sel;
- short flag;
- float val;
- float start, end;
+ ActKeyBlockInfo block;
- /* only while drawing - used to determine if block needs to be drawn */
- short modified;
- short totcurve;
-} ActKeyBlock;
+ /* number of curves and keys in this column */
+ short totcurve, totkey, totblock;
+} ActKeyColumn;
-/* ActKeyBlock - Flag */
-typedef enum eActKeyBlock_Flag {
+/* ActKeyBlockInfo - Flag */
+typedef enum eActKeyBlock_Hold {
/* Key block represents a moving hold */
ACTKEYBLOCK_FLAG_MOVING_HOLD = (1 << 0),
+ /* Key block represents a static hold */
+ ACTKEYBLOCK_FLAG_STATIC_HOLD = (1 << 1),
+ /* Key block represents any kind of hold */
+ ACTKEYBLOCK_FLAG_ANY_HOLD = (1 << 2),
+ /* The curve segment uses non-bezier interpolation */
+ ACTKEYBLOCK_FLAG_NON_BEZIER = (1 << 3),
} eActKeyBlock_Flag;
/* *********************** Keyframe Drawing ****************************** */
@@ -109,54 +109,79 @@ typedef enum eKeyframeShapeDrawOpts {
KEYFRAME_SHAPE_BOTH
} eKeyframeShapeDrawOpts;
+/* Handle type. */
+typedef enum eKeyframeHandleDrawOpts {
+ /* Don't draw */
+ KEYFRAME_HANDLE_NONE = 0,
+ /* Various marks in order of increasing display priority. */
+ KEYFRAME_HANDLE_AUTO_CLAMP,
+ KEYFRAME_HANDLE_AUTO,
+ KEYFRAME_HANDLE_VECTOR,
+ KEYFRAME_HANDLE_ALIGNED,
+ KEYFRAME_HANDLE_FREE,
+} eKeyframeHandleDrawOpts;
+
+/* Extreme type. */
+typedef enum eKeyframeExtremeDrawOpts {
+ KEYFRAME_EXTREME_NONE = 0,
+ /* Minimum/maximum present. */
+ KEYFRAME_EXTREME_MIN = (1 << 0),
+ KEYFRAME_EXTREME_MAX = (1 << 1),
+ /* Grouped keys have different states. */
+ KEYFRAME_EXTREME_MIXED = (1 << 2),
+ /* Both neigbors are equal to this key. */
+ KEYFRAME_EXTREME_FLAT = (1 << 3),
+} eKeyframeExtremeDrawOpts;
+
/* draw simple diamond-shape keyframe */
/* caller should set up vertex format, bind GPU_SHADER_KEYFRAME_DIAMOND, immBegin(GPU_PRIM_POINTS, n), then call this n times */
void draw_keyframe_shape(float x, float y, float size, bool sel, short key_type, short mode, float alpha,
- unsigned int pos_id, unsigned int size_id, unsigned int color_id, unsigned int outline_color_id);
+ unsigned int pos_id, unsigned int size_id, unsigned int color_id, unsigned int outline_color_id,
+ unsigned int linemask_id, short ipo_type, short extreme_type);
/* ******************************* Methods ****************************** */
/* Channel Drawing ------------------ */
/* F-Curve */
-void draw_fcurve_channel(struct View2D *v2d, struct AnimData *adt, struct FCurve *fcu, float ypos, float yscale_fac);
+void draw_fcurve_channel(struct View2D *v2d, struct AnimData *adt, struct FCurve *fcu, float ypos, float yscale_fac, int saction_flag);
/* Action Group Summary */
-void draw_agroup_channel(struct View2D *v2d, struct AnimData *adt, struct bActionGroup *agrp, float ypos, float yscale_fac);
+void draw_agroup_channel(struct View2D *v2d, struct AnimData *adt, struct bActionGroup *agrp, float ypos, float yscale_fac, int saction_flag);
/* Action Summary */
-void draw_action_channel(struct View2D *v2d, struct AnimData *adt, struct bAction *act, float ypos, float yscale_fac);
+void draw_action_channel(struct View2D *v2d, struct AnimData *adt, struct bAction *act, float ypos, float yscale_fac, int saction_flag);
/* Object Summary */
-void draw_object_channel(struct View2D *v2d, struct bDopeSheet *ads, struct Object *ob, float ypos, float yscale_fac);
+void draw_object_channel(struct View2D *v2d, struct bDopeSheet *ads, struct Object *ob, float ypos, float yscale_fac, int saction_flag);
/* Scene Summary */
-void draw_scene_channel(struct View2D *v2d, struct bDopeSheet *ads, struct Scene *sce, float ypos, float yscale_fac);
+void draw_scene_channel(struct View2D *v2d, struct bDopeSheet *ads, struct Scene *sce, float ypos, float yscale_fac, int saction_flag);
/* DopeSheet Summary */
-void draw_summary_channel(struct View2D *v2d, struct bAnimContext *ac, float ypos, float yscale_fac);
+void draw_summary_channel(struct View2D *v2d, struct bAnimContext *ac, float ypos, float yscale_fac, int saction_flag);
/* Grease Pencil datablock summary */
-void draw_gpencil_channel(struct View2D *v2d, struct bDopeSheet *ads, struct bGPdata *gpd, float ypos, float yscale_fac);
+void draw_gpencil_channel(struct View2D *v2d, struct bDopeSheet *ads, struct bGPdata *gpd, float ypos, float yscale_fac, int saction_flag);
/* Grease Pencil Layer */
-void draw_gpl_channel(struct View2D *v2d, struct bDopeSheet *ads, struct bGPDlayer *gpl, float ypos, float yscale_fac);
+void draw_gpl_channel(struct View2D *v2d, struct bDopeSheet *ads, struct bGPDlayer *gpl, float ypos, float yscale_fac, int saction_flag);
/* Mask Layer */
-void draw_masklay_channel(struct View2D *v2d, struct bDopeSheet *ads, struct MaskLayer *masklay, float ypos, float yscale_fac);
+void draw_masklay_channel(struct View2D *v2d, struct bDopeSheet *ads, struct MaskLayer *masklay, float ypos, float yscale_fac, int saction_flag);
/* Keydata Generation --------------- */
/* F-Curve */
-void fcurve_to_keylist(struct AnimData *adt, struct FCurve *fcu, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+void fcurve_to_keylist(struct AnimData *adt, struct FCurve *fcu, struct DLRBT_Tree *keys, int saction_flag);
/* Action Group */
-void agroup_to_keylist(struct AnimData *adt, struct bActionGroup *agrp, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+void agroup_to_keylist(struct AnimData *adt, struct bActionGroup *agrp, struct DLRBT_Tree *keys, int saction_flag);
/* Action */
-void action_to_keylist(struct AnimData *adt, struct bAction *act, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+void action_to_keylist(struct AnimData *adt, struct bAction *act, struct DLRBT_Tree *keys, int saction_flag);
/* Object */
-void ob_to_keylist(struct bDopeSheet *ads, struct Object *ob, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+void ob_to_keylist(struct bDopeSheet *ads, struct Object *ob, struct DLRBT_Tree *keys, int saction_flag);
/* Cache File */
-void cachefile_to_keylist(struct bDopeSheet *ads, struct CacheFile *cache_file, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+void cachefile_to_keylist(struct bDopeSheet *ads, struct CacheFile *cache_file, struct DLRBT_Tree *keys, int saction_flag);
/* Scene */
-void scene_to_keylist(struct bDopeSheet *ads, struct Scene *sce, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+void scene_to_keylist(struct bDopeSheet *ads, struct Scene *sce, struct DLRBT_Tree *keys, int saction_flag);
/* DopeSheet Summary */
-void summary_to_keylist(struct bAnimContext *ac, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+void summary_to_keylist(struct bAnimContext *ac, struct DLRBT_Tree *keys, int saction_flag);
/* Grease Pencil datablock summary */
void gpencil_to_keylist(struct bDopeSheet *ads, struct bGPdata *gpd, struct DLRBT_Tree *keys, const bool active);
/* Grease Pencil Layer */
void gpl_to_keylist(struct bDopeSheet *ads, struct bGPDlayer *gpl, struct DLRBT_Tree *keys);
/* Palette */
-void palette_to_keylist(struct bDopeSheet *ads, struct Palette *palette, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+void palette_to_keylist(struct bDopeSheet *ads, struct Palette *palette, struct DLRBT_Tree *keys);
/* Mask */
void mask_to_keylist(struct bDopeSheet *UNUSED(ads), struct MaskLayer *masklay, struct DLRBT_Tree *keys);
@@ -164,10 +189,10 @@ void mask_to_keylist(struct bDopeSheet *UNUSED(ads), struct MaskLayer *masklay,
/* Comparator callback used for ActKeyColumns and cframe float-value pointer */
short compare_ak_cfraPtr(void *node, void *data);
-/* Comparator callback used for ActKeyBlocks and cframe float-value pointer */
-short compare_ab_cfraPtr(void *node, void *data);
+/* Checks if ActKeyColumn has any block data */
+bool actkeyblock_is_valid(ActKeyColumn *ab);
-/* Checks if ActKeyBlock can be used (i.e. drawn/used to detect "holds") */
-bool actkeyblock_is_valid(ActKeyBlock *ab, struct DLRBT_Tree *keys);
+/* Checks if ActKeyColumn can be used as a block (i.e. drawn/used to detect "holds") */
+int actkeyblock_get_valid_hold(ActKeyColumn *ab);
#endif /* __ED_KEYFRAMES_DRAW_H__ */
diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h
index b0807c8e5ae..22e82d6b9ef 100644
--- a/source/blender/editors/include/ED_keyframing.h
+++ b/source/blender/editors/include/ED_keyframing.h
@@ -76,7 +76,7 @@ struct bAction *verify_adt_action(struct Main *bmain, struct ID *id, short add);
/* Get (or add relevant data to be able to do so) F-Curve from the given Action.
* This assumes that all the destinations are valid.
*/
-struct FCurve *verify_fcurve(struct bAction *act, const char group[], struct PointerRNA *ptr,
+struct FCurve *verify_fcurve(struct Main *bmain, struct bAction *act, const char group[], struct PointerRNA *ptr,
const char rna_path[], const int array_index, short add);
/* -------- */
@@ -124,7 +124,9 @@ short insert_keyframe(
/* Main Keyframing API call:
* Use this to delete keyframe on current frame for relevant channel. Will perform checks just in case.
*/
-short delete_keyframe(struct ReportList *reports, struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, eInsertKeyFlags flag);
+short delete_keyframe(
+ struct Main *bmain, struct ReportList *reports, struct ID *id, struct bAction *act,
+ const char group[], const char rna_path[], int array_index, float cfra, eInsertKeyFlags flag);
/* ************ Keying Sets ********************** */
@@ -329,11 +331,11 @@ bool ANIM_driver_vars_paste(struct ReportList *reports, struct FCurve *fcu, bool
/* ************ Auto-Keyframing ********************** */
/* Notes:
* - All the defines for this (User-Pref settings and Per-Scene settings)
- * are defined in DNA_userdef_types.h
+ * are defined in DNA_userdef_types.h
* - Scene settings take precedence over those for userprefs, with old files
- * inheriting userpref settings for the scene settings
+ * inheriting userpref settings for the scene settings
* - "On/Off + Mode" are stored per Scene, but "settings" are currently stored
- * as userprefs
+ * as userprefs
*/
/* Auto-Keying macros for use by various tools */
diff --git a/source/blender/editors/include/ED_keymap_templates.h b/source/blender/editors/include/ED_keymap_templates.h
new file mode 100644
index 00000000000..0a1882d005a
--- /dev/null
+++ b/source/blender/editors/include/ED_keymap_templates.h
@@ -0,0 +1,32 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file ED_keymap_templates.h
+ * \ingroup editors
+ */
+
+#ifndef __ED_KEYMAP_TEMPLATES_H__
+#define __ED_KEYMAP_TEMPLATES_H__
+
+struct wmKeyMap;
+
+void ED_keymap_template_select_all(struct wmKeyMap *keymap, const char *idname);
+
+#endif /* __ED_KEYMAP_TEMPLATES_H__ */
diff --git a/source/blender/editors/include/ED_markers.h b/source/blender/editors/include/ED_markers.h
index a95e283f218..fa907010870 100644
--- a/source/blender/editors/include/ED_markers.h
+++ b/source/blender/editors/include/ED_markers.h
@@ -72,9 +72,6 @@ void ED_operatortypes_marker(void);
/* called in screen_ops.c:ED_keymap_screen() */
void ED_keymap_marker(struct wmKeyConfig *keyconf);
-/* called in animation editors - keymap defines */
-void ED_marker_keymap_animedit_conflictfree(struct wmKeyMap *keymap);
-
/* debugging only */
void debug_markers_print_list(struct ListBase *markers);
diff --git a/source/blender/editors/include/ED_mask.h b/source/blender/editors/include/ED_mask.h
index 2ab788d5e2a..af9d87b8e0e 100644
--- a/source/blender/editors/include/ED_mask.h
+++ b/source/blender/editors/include/ED_mask.h
@@ -80,7 +80,7 @@ void ED_masklayer_make_cfra_list(struct MaskLayer *masklay, ListBase *elems, boo
bool ED_masklayer_frame_select_check(struct MaskLayer *masklay);
void ED_masklayer_frame_select_set(struct MaskLayer *masklay, short mode);
-void ED_masklayer_frames_select_border(struct MaskLayer *masklay, float min, float max, short select_mode);
+void ED_masklayer_frames_select_box(struct MaskLayer *masklay, float min, float max, short select_mode);
void ED_masklayer_frames_select_region(struct KeyframeEditData *ked, struct MaskLayer *masklay, short tool, short select_mode);
void ED_mask_select_frames(struct MaskLayer *masklay, short select_mode);
void ED_mask_select_frame(struct MaskLayer *masklay, int selx, short select_mode);
diff --git a/source/blender/editors/include/ED_mball.h b/source/blender/editors/include/ED_mball.h
index 46c34d36efc..47ea3929883 100644
--- a/source/blender/editors/include/ED_mball.h
+++ b/source/blender/editors/include/ED_mball.h
@@ -51,4 +51,11 @@ void ED_mball_editmball_load(struct Object *obedit);
/* editmball_undo.c */
void ED_mball_undosys_type(struct UndoType *ut);
+
+#define MBALLSEL_STIFF (1 << 29)
+#define MBALLSEL_RADIUS (1 << 30)
+#define MBALLSEL_ANY (MBALLSEL_STIFF | MBALLSEL_RADIUS)
+
+#define MBALL_NOSEL (1u << 31u)
+
#endif /* __ED_MBALL_H__ */
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index c084033bbb6..a6db1870106 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -52,6 +52,7 @@ struct Mesh;
struct UvVertMap;
struct UvMapVert;
struct BMEditMesh;
+struct BMElem;
struct BMesh;
struct BMVert;
struct BMLoop;
@@ -85,7 +86,6 @@ void EDBM_selectmode_to_scene(struct bContext *C);
void EDBM_mesh_make(struct Object *ob, const int select_mode, const bool add_key_index);
void EDBM_mesh_free(struct BMEditMesh *em);
void EDBM_mesh_load(struct Main *bmain, struct Object *ob);
-struct DerivedMesh *EDBM_mesh_deform_dm_get(struct BMEditMesh *em);
/* flushes based on the current select mode. if in vertex select mode,
* verts select/deselect edges and faces, if in edge select mode,
@@ -172,7 +172,19 @@ struct BMFace *EDBM_face_find_nearest(
bool EDBM_unified_findnearest(
struct ViewContext *vc,
- struct Base **r_base,
+ struct Base **bases,
+ const uint bases_len,
+ int *r_base_index,
+ struct BMVert **r_eve,
+ struct BMEdge **r_eed,
+ struct BMFace **r_efa);
+
+bool EDBM_unified_findnearest_from_raycast(
+ struct ViewContext *vc,
+ struct Base **bases,
+ const uint bases_len,
+ bool use_boundary,
+ int *r_base_index,
struct BMVert **r_eve,
struct BMEdge **r_eed,
struct BMFace **r_efa);
@@ -200,7 +212,7 @@ void em_setup_viewcontext(struct bContext *C, struct ViewContext *vc); /* renam
extern unsigned int bm_vertoffs, bm_solidoffs, bm_wireoffs;
-/* editmesh_preselect.c */
+/* editmesh_preselect_edgering.c */
struct EditMesh_PreSelEdgeRing;
struct EditMesh_PreSelEdgeRing *EDBM_preselect_edgering_create(void);
void EDBM_preselect_edgering_destroy(struct EditMesh_PreSelEdgeRing *psel);
@@ -210,6 +222,16 @@ void EDBM_preselect_edgering_update_from_edge(
struct EditMesh_PreSelEdgeRing *psel,
struct BMesh *bm, struct BMEdge *eed_start, int previewlines, const float (*coords)[3]);
+/* editmesh_preselect_elem.c */
+struct EditMesh_PreSelElem;
+struct EditMesh_PreSelElem *EDBM_preselect_elem_create(void);
+void EDBM_preselect_elem_destroy(struct EditMesh_PreSelElem *psel);
+void EDBM_preselect_elem_clear(struct EditMesh_PreSelElem *psel);
+void EDBM_preselect_elem_draw(struct EditMesh_PreSelElem *psel, const float matrix[4][4]);
+void EDBM_preselect_elem_update_from_single(
+ struct EditMesh_PreSelElem *psel,
+ struct BMesh *bm, struct BMElem *ele, const float (*coords)[3]);
+
/* mesh_ops.c */
void ED_operatortypes_mesh(void);
void ED_operatormacros_mesh(void);
@@ -297,7 +319,7 @@ void ED_mesh_edges_remove(struct Mesh *mesh, struct ReportList *reports, int cou
void ED_mesh_vertices_remove(struct Mesh *mesh, struct ReportList *reports, int count);
void ED_mesh_calc_tessface(struct Mesh *mesh, bool free_mpoly);
-void ED_mesh_update(struct Mesh *mesh, struct bContext *C, bool calc_edges, bool calc_tessface);
+void ED_mesh_update(struct Mesh *mesh, struct bContext *C, bool calc_edges, bool calc_edges_loose, bool calc_tessface);
void ED_mesh_uv_texture_ensure(struct Mesh *me, const char *name);
int ED_mesh_uv_texture_add(struct Mesh *me, const char *name, const bool active_set);
diff --git a/source/blender/editors/include/ED_numinput.h b/source/blender/editors/include/ED_numinput.h
index 00558a3a787..f674a0d87f9 100644
--- a/source/blender/editors/include/ED_numinput.h
+++ b/source/blender/editors/include/ED_numinput.h
@@ -88,4 +88,6 @@ bool handleNumInput(struct bContext *C, NumInput *n, const struct wmEvent *event
#define NUM_MODAL_INCREMENT_UP 18
#define NUM_MODAL_INCREMENT_DOWN 19
+bool user_string_to_number(bContext *C, const char *str, const struct UnitSettings *unit, int type, double *r_value);
+
#endif /* __ED_NUMINPUT_H__ */
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index a39523983ba..afe037c92d1 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -108,13 +108,6 @@ bool ED_object_parent_set(struct ReportList *reports, const struct bContext *C,
const int vert_par[3]);
void ED_object_parent_clear(struct Object *ob, const int type);
-void ED_keymap_proportional_cycle(struct wmKeyConfig *keyconf, struct wmKeyMap *keymap);
-void ED_keymap_proportional_obmode(struct wmKeyConfig *keyconf, struct wmKeyMap *keymap);
-void ED_keymap_proportional_maskmode(struct wmKeyConfig *keyconf, struct wmKeyMap *keymap);
-void ED_keymap_proportional_editmode(struct wmKeyConfig *keyconf, struct wmKeyMap *keymap,
- const bool do_connected);
-void ED_keymap_editmesh_elem_mode(struct wmKeyConfig *keyconf, struct wmKeyMap *keymap);
-
void ED_object_base_select(struct Base *base, eObjectSelect_Mode mode);
void ED_object_base_activate(struct bContext *C, struct Base *base);
void ED_object_base_free_and_unlink(struct Main *bmain, struct Scene *scene, struct Object *ob);
@@ -183,12 +176,12 @@ void ED_object_add_generic_props(struct wmOperatorType *ot, bool do_editmode);
void ED_object_add_mesh_props(struct wmOperatorType *ot);
bool ED_object_add_generic_get_opts(struct bContext *C, struct wmOperator *op, const char view_align_axis,
float loc[3], float rot[3],
- bool *enter_editmode, unsigned int *layer, bool *is_view_aligned);
+ bool *enter_editmode, bool *is_view_aligned);
struct Object *ED_object_add_type(
struct bContext *C,
int type, const char *name, const float loc[3], const float rot[3],
- bool enter_editmode, unsigned int layer)
+ bool enter_editmode)
ATTR_NONNULL(1) ATTR_RETURNS_NONNULL;
void ED_object_single_users(struct Main *bmain, struct Scene *scene, const bool full, const bool copy_groups);
@@ -196,7 +189,7 @@ void ED_object_single_user(struct Main *bmain, struct Scene *scene, struct Objec
/* object motion paths */
void ED_objects_clear_paths(struct bContext *C, bool only_selected);
-void ED_objects_recalculate_paths(struct bContext *C, struct Scene *scene);
+void ED_objects_recalculate_paths(struct bContext *C, struct Scene *scene, bool current_frame_only);
/* constraints */
struct ListBase *get_active_constraints(struct Object *ob);
@@ -217,6 +210,7 @@ bool ED_object_mode_compat_test(const struct Object *ob, eObjectMode mode);
bool ED_object_mode_compat_set(struct bContext *C, struct Object *ob, eObjectMode mode, struct ReportList *reports);
void ED_object_mode_toggle(struct bContext *C, eObjectMode mode);
void ED_object_mode_set(struct bContext *C, eObjectMode mode);
+void ED_object_mode_exit(struct bContext *C);
bool ED_object_mode_generic_enter(
struct bContext *C,
@@ -229,10 +223,6 @@ bool ED_object_mode_generic_has_data(
struct Depsgraph *depsgraph,
struct Object *ob);
-bool ED_object_mode_generic_exists(
- struct wmWindowManager *wm, struct Object *ob,
- eObjectMode object_mode);
-
/* object_modifier.c */
enum {
MODIFIER_APPLY_DATA = 1,
diff --git a/source/blender/editors/include/ED_particle.h b/source/blender/editors/include/ED_particle.h
index 552975b9e55..7e7198a8ace 100644
--- a/source/blender/editors/include/ED_particle.h
+++ b/source/blender/editors/include/ED_particle.h
@@ -62,7 +62,7 @@ void PE_update_object(
/* selection tools */
int PE_mouse_particles(struct bContext *C, const int mval[2], bool extend, bool deselect, bool toggle);
-int PE_border_select(struct bContext *C, const struct rcti *rect, const int sel_op);
+int PE_box_select(struct bContext *C, const struct rcti *rect, const int sel_op);
int PE_circle_select(struct bContext *C, int selecting, const int mval[2], float rad);
int PE_lasso_select(struct bContext *C, const int mcords[][2], const short moves, const int sel_op);
void PE_deselect_all_visible(struct PTCacheEdit *edit);
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 8d7b723002a..a5660c43416 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -195,6 +195,7 @@ void ED_screen_full_prevspace(struct bContext *C, ScrArea *sa);
void ED_screen_full_restore(struct bContext *C, ScrArea *sa);
struct ScrArea *ED_screen_state_toggle(struct bContext *C, struct wmWindow *win, struct ScrArea *sa, const short state);
void ED_screens_header_tools_menu_create(struct bContext *C, struct uiLayout *layout, void *arg);
+void ED_screens_navigation_bar_tools_menu_create(struct bContext *C, struct uiLayout *layout, void *arg);
bool ED_screen_stereo3d_required(const struct bScreen *screen, const struct Scene *scene);
Scene *ED_screen_scene_find(const struct bScreen *screen, const struct wmWindowManager *wm);
Scene *ED_screen_scene_find_with_window(const struct bScreen *screen, const struct wmWindowManager *wm, struct wmWindow **r_window);
@@ -342,18 +343,35 @@ void ED_region_cache_draw_background(const struct ARegion *ar);
void ED_region_cache_draw_curfra_label(const int framenr, const float x, const float y);
void ED_region_cache_draw_cached_segments(const struct ARegion *ar, const int num_segments, const int *points, const int sfra, 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 *sa, struct ARegion *ar,
+ struct wmMsgBus *mbus);
+int ED_region_generic_tools_region_snap_size(const struct ARegion *ar, int size, int axis);
+
/* interface_region_hud.c */
struct ARegionType *ED_area_type_hud(int space_type);
void ED_area_type_hud_clear(struct wmWindowManager *wm, ScrArea *sa_keep);
void ED_area_type_hud_ensure(struct bContext *C, struct ScrArea *sa);
-/* default keymaps, bitflags */
-#define ED_KEYMAP_UI 1
-#define ED_KEYMAP_VIEW2D 2
-#define ED_KEYMAP_MARKERS 4
-#define ED_KEYMAP_ANIMATION 8
-#define ED_KEYMAP_FRAMES 16
-#define ED_KEYMAP_GPENCIL 32
-#define ED_KEYMAP_HEADER 64
+/* default keymaps, bitflags (matches order of evaluation). */
+enum {
+ ED_KEYMAP_UI = (1 << 1),
+ ED_KEYMAP_GIZMO = (1 << 2),
+ ED_KEYMAP_VIEW2D = (1 << 3),
+ ED_KEYMAP_MARKERS = (1 << 4),
+ ED_KEYMAP_ANIMATION = (1 << 5),
+ ED_KEYMAP_FRAMES = (1 << 6),
+ ED_KEYMAP_HEADER = (1 << 7),
+ ED_KEYMAP_GPENCIL = (1 << 8),
+};
+
+/* SCREEN_OT_space_context_cycle direction */
+enum {
+ SPACE_CONTEXT_CYCLE_PREV,
+ SPACE_CONTEXT_CYCLE_NEXT,
+};
#endif /* __ED_SCREEN_H__ */
diff --git a/source/blender/editors/include/ED_select_utils.h b/source/blender/editors/include/ED_select_utils.h
index add1c812e1f..d7f55e2a2d6 100644
--- a/source/blender/editors/include/ED_select_utils.h
+++ b/source/blender/editors/include/ED_select_utils.h
@@ -25,6 +25,8 @@
#ifndef __ED_SELECT_UTILS_H__
#define __ED_SELECT_UTILS_H__
+struct KDTree;
+
enum {
SEL_TOGGLE = 0,
SEL_SELECT = 1,
@@ -41,6 +43,13 @@ typedef enum {
SEL_OP_XOR,
} eSelectOp;
+/* Select Similar */
+enum {
+ SIM_CMP_EQ = 0,
+ SIM_CMP_GT,
+ SIM_CMP_LT
+};
+
#define SEL_OP_USE_OUTSIDE(sel_op) (ELEM(sel_op, SEL_OP_AND))
#define SEL_OP_USE_PRE_DESELECT(sel_op) (ELEM(sel_op, SEL_OP_SET))
#define SEL_OP_CAN_DESELECT(sel_op) (!ELEM(sel_op, SEL_OP_ADD))
@@ -49,4 +58,6 @@ typedef enum {
int ED_select_op_action(const eSelectOp sel_op, const bool is_select, const bool is_inside);
int ED_select_op_action_deselected(const eSelectOp sel_op, const bool is_select, const bool is_inside);
+int ED_select_similar_compare_float(const float delta, const float thresh, const int compare);
+bool ED_select_similar_compare_float_tree(const struct KDTree *tree, const float length, const float thresh, const int compare);
#endif /* __ED_SELECT_UTILS_H__ */
diff --git a/source/blender/editors/include/ED_space_api.h b/source/blender/editors/include/ED_space_api.h
index ddd8b59c264..709af6e8b09 100644
--- a/source/blender/editors/include/ED_space_api.h
+++ b/source/blender/editors/include/ED_space_api.h
@@ -75,7 +75,6 @@ void *ED_region_draw_cb_activate(struct ARegionType *,
void *custumdata, int type);
void ED_region_draw_cb_draw(const struct bContext *, struct ARegion *, int);
void ED_region_draw_cb_exit(struct ARegionType *, void *);
-void *ED_region_draw_cb_customdata(void *handle);
/* generic callbacks */
/* ed_util.c */
void ED_region_draw_mouse_line_cb(const struct bContext *C, struct ARegion *ar, void *arg_info);
diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h
index 223163264ca..7adc2d99879 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -48,7 +48,7 @@ struct Main;
struct SnapObjectContext;
struct SnapObjectParams;
-void transform_keymap_for_space(struct wmKeyConfig *keyconf, struct wmKeyMap *keymap, int spaceid);
+void ED_keymap_transform(struct wmKeyConfig *keyconf);
void transform_operatortypes(void);
/* ******************** Macros & Prototypes *********************** */
@@ -144,6 +144,7 @@ int BIF_countTransformOrientation(const struct bContext *C);
#define P_MIRROR_DUMMY (P_MIRROR | (1 << 9))
#define P_PROPORTIONAL (1 << 1)
#define P_AXIS (1 << 2)
+#define P_AXIS_ORTHO (1 << 16)
#define P_SNAP (1 << 3)
#define P_GEO_SNAP (P_SNAP | (1 << 4))
#define P_ALIGN_SNAP (P_GEO_SNAP | (1 << 5))
@@ -163,6 +164,7 @@ void Transform_Properties(struct wmOperatorType *ot, int flags);
void TRANSFORM_GGT_gizmo(struct wmGizmoGroupType *gzgt);
void VIEW3D_GGT_xform_cage(struct wmGizmoGroupType *gzgt);
+void VIEW3D_GGT_xform_shear(struct wmGizmoGroupType *gzgt);
bool ED_widgetgroup_gizmo2d_poll(const struct bContext *C, struct wmGizmoGroupType *gzgt);
void ED_widgetgroup_gizmo2d_setup(const struct bContext *C, struct wmGizmoGroup *gzgroup);
@@ -173,6 +175,7 @@ void ED_widgetgroup_gizmo2d_draw_prepare(const struct bContext *C, struct wmGizm
/* Snapping */
#define SNAP_MIN_DISTANCE 30
+#define SNAP_INCREMENTAL_ANGLE DEG2RAD(5.0)
bool peelObjectsTransform(
struct TransInfo *t,
diff --git a/source/blender/editors/include/ED_types.h b/source/blender/editors/include/ED_types.h
index a478278da4c..9188fca2422 100644
--- a/source/blender/editors/include/ED_types.h
+++ b/source/blender/editors/include/ED_types.h
@@ -33,7 +33,7 @@
/* **************** GENERAL EDITOR-WIDE TYPES AND DEFINES ************************** */
-/* old blender defines... should be depricated? */
+/* old blender defines... should be deprecated? */
#define DESELECT 0
#define SELECT 1
#define ACTIVE 2
diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h
index 434e9cfe2ac..433c7c7fa48 100644
--- a/source/blender/editors/include/ED_uvedit.h
+++ b/source/blender/editors/include/ED_uvedit.h
@@ -110,8 +110,12 @@ void uvedit_uv_select_disable(
const int cd_loop_uv_offset);
bool ED_uvedit_nearest_uv(
- struct Scene *scene, struct Object *obedit, struct Image *ima,
- const float co[2], float r_uv[2]);
+ struct Scene *scene, struct Object *obedit, struct Image *ima, const float co[2],
+ float *dist_sq, float r_uv[2]);
+bool ED_uvedit_nearest_uv_multi(
+ struct Scene *scene, struct Image *ima,
+ struct Object **objects, const uint objects_len, const float co[2],
+ float *dist_sq, float r_uv[2]);
void ED_uvedit_get_aspect(struct Scene *scene, struct Object *ob, struct BMesh *em, float *aspx, float *aspy);
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index fc204013a51..35c92c3561b 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -252,14 +252,17 @@ float ED_view3d_pixel_size_no_ui_scale(const struct RegionView3D *rv3d, const fl
float ED_view3d_calc_zfac(const struct RegionView3D *rv3d, const float co[3], bool *r_flip);
bool ED_view3d_clip_segment(const struct RegionView3D *rv3d, float ray_start[3], float ray_end[3]);
-bool ED_view3d_win_to_ray(
+bool ED_view3d_win_to_ray_clipped(
struct Depsgraph *depsgraph,
const struct ARegion *ar, const struct View3D *v3d, const float mval[2],
float ray_start[3], float ray_normal[3], const bool do_clip);
-bool ED_view3d_win_to_ray_ex(
+bool ED_view3d_win_to_ray_clipped_ex(
struct Depsgraph *depsgraph,
const struct ARegion *ar, const struct View3D *v3d, const float mval[2],
float r_ray_co[3], float r_ray_normal[3], float r_ray_start[3], bool do_clip);
+void ED_view3d_win_to_ray(
+ const struct ARegion *ar, const float mval[2],
+ float r_ray_start[3], float r_ray_normal[3]);
void ED_view3d_global_to_vector(const struct RegionView3D *rv3d, const float coord[3], float vec[3]);
void ED_view3d_win_to_3d(
const struct View3D *v3d, const struct ARegion *ar,
@@ -269,12 +272,21 @@ void ED_view3d_win_to_3d_int(
const struct View3D *v3d, const struct ARegion *ar,
const float depth_pt[3], const int mval[2],
float r_out[3]);
+bool ED_view3d_win_to_3d_on_plane(
+ const struct ARegion *ar,
+ const float plane[4], const float mval[2], const bool do_clip,
+ float r_out[3]);
+bool ED_view3d_win_to_3d_on_plane_int(
+ const struct ARegion *ar,
+ const float plane[4], const int mval[2], const bool do_clip,
+ float r_out[3]);
void ED_view3d_win_to_delta(const struct ARegion *ar, const float mval[2], float out[3], const float zfac);
void ED_view3d_win_to_origin(const struct ARegion *ar, const float mval[2], float out[3]);
void ED_view3d_win_to_vector(const struct ARegion *ar, const float mval[2], float out[3]);
-bool ED_view3d_win_to_segment(struct Depsgraph *depsgraph,
- const struct ARegion *ar, struct View3D *v3d, const float mval[2],
- float r_ray_start[3], float r_ray_end[3], const bool do_clip);
+bool ED_view3d_win_to_segment_clipped(
+ struct Depsgraph *depsgraph,
+ const struct ARegion *ar, struct View3D *v3d, const float mval[2],
+ float r_ray_start[3], float r_ray_end[3], const bool do_clip);
void ED_view3d_ob_project_mat_get(const struct RegionView3D *v3d, struct Object *ob, float pmat[4][4]);
void ED_view3d_ob_project_mat_get_from_obmat(const struct RegionView3D *rv3d, float obmat[4][4], float pmat[4][4]);
@@ -414,7 +426,7 @@ struct RV3DMatrixStore *ED_view3d_mats_rv3d_backup(struct RegionView3D *rv3d);
void ED_view3d_mats_rv3d_restore(struct RegionView3D *rv3d, struct RV3DMatrixStore *rv3dmat);
void ED_draw_object_facemap(
- struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, const float col[4], const int facemap);
+ struct Depsgraph *depsgraph, struct Object *ob, const float col[4], const int facemap);
struct RenderEngineType *ED_view3d_engine_type(struct Scene *scene, int drawtype);
@@ -457,6 +469,8 @@ struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(
struct GPUOffScreen *ofs, char err_out[256]);
struct Base *ED_view3d_give_base_under_cursor(struct bContext *C, const int mval[2]);
+struct Object *ED_view3d_give_object_under_cursor(struct bContext *C, const int mval[2]);
+bool ED_view3d_is_object_under_cursor(struct bContext *C, const int mval[2]);
void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar, bool do_clip);
void ED_view3d_update_viewmat(
struct Depsgraph *depsgraph, struct Scene *scene, struct View3D *v3d, struct ARegion *ar,
@@ -508,8 +522,10 @@ void ED_view3d_distance_set(struct RegionView3D *rv3d, const float dist);
float ED_scene_grid_scale(struct Scene *scene, const char **grid_unit);
float ED_view3d_grid_scale(struct Scene *scene, struct View3D *v3d, const char **grid_unit);
+float ED_view3d_grid_view_scale(
+ struct Scene *scene, struct View3D *v3d, struct RegionView3D *rv3d, const char **grid_unit);
-void ED_scene_draw_fps(struct Scene *scene, const struct rcti *rect);
+void ED_scene_draw_fps(struct Scene *scene, int xoffset, int *yoffset);
/* view matrix properties utilities */
/* unused */
@@ -523,8 +539,8 @@ void ED_view3d_operator_properties_viewmat_get(struct wmOperator *op, int *winx,
void ED_view3d_stop_render_preview(struct wmWindowManager *wm, struct ARegion *ar);
void ED_view3d_shade_update(struct Main *bmain, struct View3D *v3d, struct ScrArea *sa);
-#define V3D_IS_ZBUF(v3d) \
- (((v3d)->flag & V3D_ZBUF_SELECT) && ((v3d)->shading.type > OB_WIRE))
+#define V3D_XRAY_FLAG(v3d) (((v3d)->shading.type == OB_WIRE) ? V3D_SHADING_XRAY_WIREFRAME : V3D_SHADING_XRAY)
+#define V3D_IS_ZBUF(v3d) (((v3d)->shading.flag & V3D_XRAY_FLAG(v3d)) == 0)
void ED_view3d_id_remap(struct View3D *v3d, const struct ID *old_id, struct ID *new_id);
diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h
index 5601beb9228..9d82e074415 100644
--- a/source/blender/editors/include/UI_icons.h
+++ b/source/blender/editors/include/UI_icons.h
@@ -28,12 +28,30 @@
* \ingroup editorui
*/
-/* Note: this is included twice with different #defines for DEF_ICON
- * once from UI_resources.h for the internal icon enum and
- * once for interface_api.c for the definition of the RNA enum for the icons */
+/* Note: this is included multiple times with different #defines for DEF_ICON. */
+
+/* Auto define more specific types for places that do not need the distinction. */
+#ifndef DEF_ICON_COLLECTION
+# define DEF_ICON_COLLECTION DEF_ICON
+#endif
+#ifndef DEF_ICON_OBJECT
+# define DEF_ICON_OBJECT DEF_ICON
+#endif
+#ifndef DEF_ICON_OBJECT_DATA
+# define DEF_ICON_OBJECT_DATA DEF_ICON
+#endif
+#ifndef DEF_ICON_MODIFIER
+# define DEF_ICON_MODIFIER DEF_ICON
+#endif
+#ifndef DEF_ICON_SHADING
+# define DEF_ICON_SHADING DEF_ICON
+#endif
+#ifndef DEF_ICON_COLOR
+# define DEF_ICON_COLOR DEF_ICON
+#endif
/* ICON_ prefix added */
-DEF_ICON(NONE)
+DEF_ICON_COLOR(NONE)
DEF_ICON(QUESTION)
DEF_ICON(ERROR)
DEF_ICON(CANCEL)
@@ -43,8 +61,8 @@ DEF_ICON(TRIA_LEFT)
DEF_ICON(TRIA_UP)
DEF_ICON(ARROW_LEFTRIGHT)
DEF_ICON(PLUS)
-DEF_ICON(DISCLOSURE_TRI_DOWN)
DEF_ICON(DISCLOSURE_TRI_RIGHT)
+DEF_ICON(DISCLOSURE_TRI_DOWN)
DEF_ICON(RADIOBUT_OFF)
DEF_ICON(RADIOBUT_ON)
DEF_ICON(MENU_PANEL)
@@ -53,30 +71,28 @@ DEF_ICON(GRIP)
DEF_ICON(DOT)
DEF_ICON(COLLAPSEMENU)
DEF_ICON(X)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK005) /* XXX 'DOWNARROW' icon! */
-#endif
-DEF_ICON(GO_LEFT)
-DEF_ICON(PLUG)
-DEF_ICON(UI)
+DEF_ICON(DUPLICATE)
+DEF_ICON_BLANK(75)
+DEF_ICON_BLANK(76)
+DEF_ICON_BLANK(77)
DEF_ICON(NODE)
DEF_ICON(NODE_SEL)
/* ui */
-DEF_ICON(FULLSCREEN)
-DEF_ICON(SPLITSCREEN)
+DEF_ICON(WINDOW)
+DEF_ICON(WORKSPACE)
DEF_ICON(RIGHTARROW_THIN)
DEF_ICON(BORDERMOVE)
DEF_ICON(VIEWZOOM)
-DEF_ICON(ZOOMIN)
-DEF_ICON(ZOOMOUT)
+DEF_ICON(ADD)
+DEF_ICON(REMOVE)
DEF_ICON(PANEL_CLOSE)
DEF_ICON(COPY_ID)
DEF_ICON(EYEDROPPER)
-DEF_ICON(LINK_AREA)
+DEF_ICON_BLANK(92)
DEF_ICON(AUTO)
-DEF_ICON(CHECKBOX_DEHLT)
-DEF_ICON(CHECKBOX_HLT)
+DEF_ICON(CHECKBOX_DEHLT) /* de-Hilight - Checkbox OFF */
+DEF_ICON(CHECKBOX_HLT) /* Hilight - Checkbox ON */
DEF_ICON(UNLOCKED)
DEF_ICON(LOCKED)
DEF_ICON(UNPINNED)
@@ -84,171 +100,161 @@ DEF_ICON(PINNED)
DEF_ICON(SCREEN_BACK)
DEF_ICON(RIGHTARROW)
DEF_ICON(DOWNARROW_HLT)
-DEF_ICON(DOTSUP)
-DEF_ICON(DOTSDOWN)
-DEF_ICON(LINK)
-DEF_ICON(INLINK)
+DEF_ICON_BLANK(103)
+DEF_ICON_BLANK(104)
+DEF_ICON_BLANK(105)
+DEF_ICON_BLANK(106)
DEF_ICON(PLUGIN)
/* various ui */
DEF_ICON(HELP)
DEF_ICON(GHOST_ENABLED)
DEF_ICON(COLOR) /* see COLOR_RED/GREEN/BLUE */
-DEF_ICON(LINKED)
DEF_ICON(UNLINKED)
+DEF_ICON(LINKED)
DEF_ICON(HAND)
DEF_ICON(ZOOM_ALL)
DEF_ICON(ZOOM_SELECTED)
DEF_ICON(ZOOM_PREVIOUS)
DEF_ICON(ZOOM_IN)
DEF_ICON(ZOOM_OUT)
-DEF_ICON(RENDER_REGION)
-DEF_ICON(BORDER_RECT)
-DEF_ICON(BORDER_LASSO)
+DEF_ICON(DRIVER_DISTANCE)
+DEF_ICON(DRIVER_ROTATIONAL_DIFFERENCE)
+DEF_ICON(DRIVER_TRANSFORM)
DEF_ICON(FREEZE)
DEF_ICON(STYLUS_PRESSURE)
DEF_ICON(GHOST_DISABLED)
-DEF_ICON(NEW)
+DEF_ICON(FILE_NEW)
DEF_ICON(FILE_TICK)
DEF_ICON(QUIT)
DEF_ICON(URL)
DEF_ICON(RECOVER_LAST)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK030)
-#endif
+DEF_ICON(THREE_DOTS)
DEF_ICON(FULLSCREEN_ENTER)
DEF_ICON(FULLSCREEN_EXIT)
-DEF_ICON(BLANK1) // Not actually blank - this is used all over the place
+DEF_ICON_BLANK(135)
/* BUTTONS */
-DEF_ICON(LIGHT)
-DEF_ICON(MATERIAL)
-DEF_ICON(TEXTURE)
+DEF_ICON_SHADING(LIGHT)
+DEF_ICON_SHADING(MATERIAL)
+DEF_ICON_SHADING(TEXTURE)
DEF_ICON(ANIM)
-DEF_ICON(WORLD)
+DEF_ICON_SHADING(WORLD)
DEF_ICON(SCENE)
-DEF_ICON(EDIT)
-DEF_ICON(GAME)
-DEF_ICON(RADIO)
+DEF_ICON_BLANK(144)
+DEF_ICON_BLANK(145)
+DEF_ICON_BLANK(146)
DEF_ICON(SCRIPT)
-DEF_ICON(PARTICLES)
+DEF_ICON_MODIFIER(PARTICLES)
DEF_ICON(PHYSICS)
DEF_ICON(SPEAKER)
-DEF_ICON(TEXTURE_SHADED)
+DEF_ICON_BLANK(151)
DEF_ICON(TOOL_SETTINGS)
DEF_ICON(SHADERFX)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK044)
- DEF_ICON(BLANK045)
- DEF_ICON(BLANK046)
- DEF_ICON(BLANK047)
- DEF_ICON(BLANK048)
- DEF_ICON(BLANK049)
- DEF_ICON(BLANK050)
- DEF_ICON(BLANK051)
- DEF_ICON(BLANK052)
- DEF_ICON(BLANK052b)
-#endif
+DEF_ICON_BLANK(154)
+DEF_ICON_BLANK(155)
+DEF_ICON_BLANK(156)
+DEF_ICON_BLANK(157)
+DEF_ICON_BLANK(158)
+DEF_ICON_BLANK(159)
+DEF_ICON_BLANK(160)
+DEF_ICON(BLANK1) // Not actually blank - this is used all over the place
+DEF_ICON(FAKE_USER_OFF)
+DEF_ICON(FAKE_USER_ON)
/* EDITORS */
DEF_ICON(VIEW3D)
-DEF_ICON(IPO)
-DEF_ICON(OOPS)
-DEF_ICON(BUTS)
-DEF_ICON(FILESEL)
-DEF_ICON(IMAGE_COL)
+DEF_ICON(GRAPH)
+DEF_ICON(OUTLINER)
+DEF_ICON(PROPERTIES)
+DEF_ICON(FILEBROWSER)
+DEF_ICON(IMAGE)
DEF_ICON(INFO)
DEF_ICON(SEQUENCE)
DEF_ICON(TEXT)
-DEF_ICON(IMASEL)
+DEF_ICON_BLANK(174)
DEF_ICON(SOUND)
DEF_ICON(ACTION)
DEF_ICON(NLA)
-DEF_ICON(SCRIPTWIN)
+DEF_ICON(PREFERENCES)
DEF_ICON(TIME)
DEF_ICON(NODETREE)
-DEF_ICON(LOGIC)
+DEF_ICON_BLANK(181)
DEF_ICON(CONSOLE)
-DEF_ICON(PREFERENCES)
+DEF_ICON_BLANK(183)
DEF_ICON(CLIP)
DEF_ICON(ASSET_MANAGER)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK057)
- DEF_ICON(BLANK058)
- DEF_ICON(BLANK059)
- DEF_ICON(BLANK060)
- DEF_ICON(BLANK061)
-#endif
+DEF_ICON(NODE_COMPOSITING)
+DEF_ICON(NODE_TEXTURE)
+DEF_ICON(NODE_MATERIAL)
+DEF_ICON_BLANK(189)
+DEF_ICON_BLANK(190)
/* MODES */
DEF_ICON(OBJECT_DATAMODE) // XXX fix this up
DEF_ICON(EDITMODE_HLT)
-DEF_ICON(FACESEL_HLT)
+DEF_ICON(UV)
DEF_ICON(VPAINT_HLT)
DEF_ICON(TPAINT_HLT)
DEF_ICON(WPAINT_HLT)
DEF_ICON(SCULPTMODE_HLT)
DEF_ICON(POSE_HLT)
DEF_ICON(PARTICLEMODE)
-DEF_ICON(LIGHTPAINT)
-DEF_ICON(GREASEPENCIL_STROKE_PAINT)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK064)
- DEF_ICON(BLANK065)
- DEF_ICON(BLANK066)
- DEF_ICON(BLANK067)
- DEF_ICON(BLANK068)
- DEF_ICON(BLANK069)
- DEF_ICON(BLANK070)
- DEF_ICON(BLANK071)
- DEF_ICON(BLANK072)
- DEF_ICON(BLANK073)
- DEF_ICON(BLANK074)
- DEF_ICON(BLANK075)
- DEF_ICON(BLANK076)
- DEF_ICON(BLANK077)
- DEF_ICON(BLANK077b)
-#endif
+DEF_ICON_BLANK(202)
+DEF_ICON_BLANK(203)
+DEF_ICON_BLANK(204)
+DEF_ICON_BLANK(205)
+DEF_ICON_BLANK(206)
+DEF_ICON_BLANK(207)
+DEF_ICON_BLANK(208)
+DEF_ICON(TRACKING)
+DEF_ICON(TRACKING_BACKWARDS)
+DEF_ICON(TRACKING_FORWARDS)
+DEF_ICON(TRACKING_BACKWARDS_SINGLE)
+DEF_ICON(TRACKING_FORWARDS_SINGLE)
+DEF_ICON(TRACKING_CLEAR_BACKWARDS)
+DEF_ICON(TRACKING_CLEAR_FORWARDS)
+DEF_ICON(TRACKING_REFINE_BACKWARDS)
+DEF_ICON(TRACKING_REFINE_FORWARDS)
+DEF_ICON_BLANK(77b)
/* DATA */
DEF_ICON(SCENE_DATA)
DEF_ICON(RENDERLAYERS)
-DEF_ICON(WORLD_DATA)
+DEF_ICON_SHADING(WORLD_DATA)
DEF_ICON(OBJECT_DATA)
DEF_ICON(MESH_DATA)
DEF_ICON(CURVE_DATA)
DEF_ICON(META_DATA)
DEF_ICON(LATTICE_DATA)
-DEF_ICON(LIGHT_DATA)
-DEF_ICON(MATERIAL_DATA)
-DEF_ICON(TEXTURE_DATA)
+DEF_ICON_SHADING(LIGHT_DATA)
+DEF_ICON_SHADING(MATERIAL_DATA)
+DEF_ICON_SHADING(TEXTURE_DATA)
DEF_ICON(ANIM_DATA)
DEF_ICON(CAMERA_DATA)
DEF_ICON(PARTICLE_DATA)
DEF_ICON(LIBRARY_DATA_DIRECT)
-DEF_ICON(GROUP)
+DEF_ICON_COLLECTION(GROUP)
DEF_ICON(ARMATURE_DATA)
DEF_ICON(POSE_DATA)
DEF_ICON(BONE_DATA)
-DEF_ICON(CONSTRAINT)
+DEF_ICON_MODIFIER(CONSTRAINT)
DEF_ICON(SHAPEKEY_DATA)
-DEF_ICON(CONSTRAINT_BONE)
+DEF_ICON_MODIFIER(CONSTRAINT_BONE)
DEF_ICON(CAMERA_STEREO)
DEF_ICON(PACKAGE)
DEF_ICON(UGLYPACKAGE)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK079b)
-#endif
+DEF_ICON_BLANK(246)
/* DATA */
-DEF_ICON(BRUSH_DATA)
-DEF_ICON(IMAGE_DATA)
+DEF_ICON_SHADING(BRUSH_DATA)
+DEF_ICON_SHADING(IMAGE_DATA)
DEF_ICON(FILE)
DEF_ICON(FCURVE)
DEF_ICON(FONT_DATA)
DEF_ICON(RENDER_RESULT)
DEF_ICON(SURFACE_DATA)
DEF_ICON(EMPTY_DATA)
-DEF_ICON(SETTINGS)
+DEF_ICON(PRESET)
DEF_ICON(RENDER_ANIMATION)
DEF_ICON(RENDER_STILL)
DEF_ICON(LIBRARY_DATA_BROKEN)
@@ -256,20 +262,18 @@ DEF_ICON(BOIDS)
DEF_ICON(STRANDS)
DEF_ICON(LIBRARY_DATA_INDIRECT)
DEF_ICON(GREASEPENCIL)
-DEF_ICON(LINE_DATA)
+DEF_ICON_SHADING(LINE_DATA)
DEF_ICON(LIBRARY_DATA_OVERRIDE)
DEF_ICON(GROUP_BONE)
DEF_ICON(GROUP_VERTEX)
DEF_ICON(GROUP_VCOL)
DEF_ICON(GROUP_UVS)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK089)
- DEF_ICON(BLANK090)
-#endif
+DEF_ICON(FACE_MAPS)
+DEF_ICON_BLANK(272)
DEF_ICON(RNA)
DEF_ICON(RNA_ADD)
- /* MONOCHROME ICONS */
+ /* INPUT + DECORATOR */
DEF_ICON(MOUSE_LMB)
DEF_ICON(MOUSE_MMB)
DEF_ICON(MOUSE_RMB)
@@ -277,95 +281,81 @@ DEF_ICON(MOUSE_MOVE)
DEF_ICON(MOUSE_LMB_DRAG)
DEF_ICON(MOUSE_MMB_DRAG)
DEF_ICON(MOUSE_RMB_DRAG)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK099)
-#endif
-DEF_ICON(PRESET)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK101)
-#endif
+DEF_ICON_BLANK(284)
+DEF_ICON(PRESET_NEW)
+DEF_ICON_BLANK(286)
DEF_ICON(DECORATE)
DEF_ICON(DECORATE_KEYFRAME)
DEF_ICON(DECORATE_ANIMATE)
DEF_ICON(DECORATE_DRIVER)
DEF_ICON(DECORATE_LINKED)
-DEF_ICON(DECORATE_OVERRIDE)
+DEF_ICON(DECORATE_LIBRARY_OVERRIDE)
DEF_ICON(DECORATE_UNLOCKED)
DEF_ICON(DECORATE_LOCKED)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK110)
- DEF_ICON(BLANK111)
- DEF_ICON(BLANK112)
- DEF_ICON(BLANK113)
- DEF_ICON(BLANK114)
- DEF_ICON(BLANK115)
- DEF_ICON(BLANK116)
- DEF_ICON(BLANK116b)
-#endif
+DEF_ICON(DECORATE_OVERRIDE)
+DEF_ICON_BLANK(111)
+DEF_ICON(SEALED)
+DEF_ICON(HEART)
+DEF_ICON(ORPHAN_DATA)
+DEF_ICON(USER)
+DEF_ICON(SYSTEM)
+DEF_ICON(SETTINGS)
/* OUTLINER */
-DEF_ICON(OUTLINER_OB_EMPTY)
-DEF_ICON(OUTLINER_OB_MESH)
-DEF_ICON(OUTLINER_OB_CURVE)
-DEF_ICON(OUTLINER_OB_LATTICE)
-DEF_ICON(OUTLINER_OB_META)
-DEF_ICON(OUTLINER_OB_LIGHT)
-DEF_ICON(OUTLINER_OB_CAMERA)
-DEF_ICON(OUTLINER_OB_ARMATURE)
-DEF_ICON(OUTLINER_OB_FONT)
-DEF_ICON(OUTLINER_OB_SURFACE)
-DEF_ICON(OUTLINER_OB_SPEAKER)
-DEF_ICON(OUTLINER_OB_FORCE_FIELD)
-DEF_ICON(OUTLINER_OB_GROUP_INSTANCE)
-DEF_ICON(OUTLINER_OB_GREASEPENCIL)
-DEF_ICON(OUTLINER_OB_LIGHTPROBE)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK124)
- DEF_ICON(BLANK125)
-#endif
+DEF_ICON_OBJECT(OUTLINER_OB_EMPTY)
+DEF_ICON_OBJECT(OUTLINER_OB_MESH)
+DEF_ICON_OBJECT(OUTLINER_OB_CURVE)
+DEF_ICON_OBJECT(OUTLINER_OB_LATTICE)
+DEF_ICON_OBJECT(OUTLINER_OB_META)
+DEF_ICON_OBJECT(OUTLINER_OB_LIGHT)
+DEF_ICON_OBJECT(OUTLINER_OB_CAMERA)
+DEF_ICON_OBJECT(OUTLINER_OB_ARMATURE)
+DEF_ICON_OBJECT(OUTLINER_OB_FONT)
+DEF_ICON_OBJECT(OUTLINER_OB_SURFACE)
+DEF_ICON_OBJECT(OUTLINER_OB_SPEAKER)
+DEF_ICON_OBJECT(OUTLINER_OB_FORCE_FIELD)
+DEF_ICON_OBJECT(OUTLINER_OB_GROUP_INSTANCE)
+DEF_ICON_OBJECT(OUTLINER_OB_GREASEPENCIL)
+DEF_ICON_OBJECT(OUTLINER_OB_LIGHTPROBE)
+DEF_ICON_OBJECT(OUTLINER_OB_IMAGE)
+DEF_ICON_BLANK(321)
DEF_ICON(RESTRICT_COLOR_OFF)
DEF_ICON(RESTRICT_COLOR_ON)
-DEF_ICON(HIDE_OFF)
DEF_ICON(HIDE_ON)
-DEF_ICON(RESTRICT_SELECT_OFF)
+DEF_ICON(HIDE_OFF)
DEF_ICON(RESTRICT_SELECT_ON)
-DEF_ICON(RESTRICT_RENDER_OFF)
+DEF_ICON(RESTRICT_SELECT_OFF)
DEF_ICON(RESTRICT_RENDER_ON)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK127b)
-#endif
+DEF_ICON(RESTRICT_RENDER_OFF)
+DEF_ICON_BLANK(330)
/* OUTLINER */
-DEF_ICON(OUTLINER_DATA_EMPTY)
-DEF_ICON(OUTLINER_DATA_MESH)
-DEF_ICON(OUTLINER_DATA_CURVE)
-DEF_ICON(OUTLINER_DATA_LATTICE)
-DEF_ICON(OUTLINER_DATA_META)
-DEF_ICON(OUTLINER_DATA_LIGHT)
-DEF_ICON(OUTLINER_DATA_CAMERA)
-DEF_ICON(OUTLINER_DATA_ARMATURE)
-DEF_ICON(OUTLINER_DATA_FONT)
-DEF_ICON(OUTLINER_DATA_SURFACE)
-DEF_ICON(OUTLINER_DATA_SPEAKER)
-DEF_ICON(OUTLINER_DATA_POSE)
-DEF_ICON(OUTLINER_DATA_GREASEPENCIL)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK131)
- DEF_ICON(BLANK132)
- DEF_ICON(BLANK133)
- DEF_ICON(BLANK134)
- DEF_ICON(BLANK135)
- DEF_ICON(BLANK136)
- DEF_ICON(BLANK137)
- DEF_ICON(BLANK138)
- DEF_ICON(BLANK139)
- DEF_ICON(BLANK140)
-#endif
-DEF_ICON(RESTRICT_VIEW_OFF)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_EMPTY)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_MESH)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_CURVE)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_LATTICE)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_META)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_LIGHT)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_CAMERA)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_ARMATURE)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_FONT)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_SURFACE)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_SPEAKER)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_POSE)
+DEF_ICON_BLANK(345)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_GREASEPENCIL)
+DEF_ICON(GP_SELECT_POINTS)
+DEF_ICON(GP_SELECT_STROKES)
+DEF_ICON(GP_MULTIFRAME_EDITING)
+DEF_ICON(GP_ONLY_SELECTED)
+DEF_ICON_BLANK(351)
+DEF_ICON(MODIFIER_OFF)
+DEF_ICON(MODIFIER_ON)
+DEF_ICON(ONIONSKIN_OFF)
+DEF_ICON(ONIONSKIN_ON)
DEF_ICON(RESTRICT_VIEW_ON)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK142b)
-#endif
+DEF_ICON(RESTRICT_VIEW_OFF)
+DEF_ICON_BLANK(353)
/* PRIMITIVES */
DEF_ICON(MESH_PLANE)
@@ -379,27 +369,21 @@ DEF_ICON(MESH_CYLINDER)
DEF_ICON(MESH_TORUS)
DEF_ICON(MESH_CONE)
DEF_ICON(MESH_CAPSULE)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK611)
-#endif
-DEF_ICON(LIGHT_POINT)
-DEF_ICON(LIGHT_SUN)
-DEF_ICON(LIGHT_SPOT)
-DEF_ICON(LIGHT_HEMI)
-DEF_ICON(LIGHT_AREA)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK617)
- DEF_ICON(BLANK618)
-#endif
+DEF_ICON_BLANK(372)
+DEF_ICON_SHADING(LIGHT_POINT)
+DEF_ICON_SHADING(LIGHT_SUN)
+DEF_ICON_SHADING(LIGHT_SPOT)
+DEF_ICON_SHADING(LIGHT_HEMI)
+DEF_ICON_SHADING(LIGHT_AREA)
+DEF_ICON_BLANK(278)
+DEF_ICON_BLANK(379)
DEF_ICON(META_EMPTY)
DEF_ICON(META_PLANE)
DEF_ICON(META_CUBE)
DEF_ICON(META_BALL)
DEF_ICON(META_ELLIPSOID)
DEF_ICON(META_CAPSULE)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK625)
-#endif
+DEF_ICON_BLANK(625)
/* PRIMITIVES */
DEF_ICON(SURFACE_NCURVE)
@@ -408,23 +392,19 @@ DEF_ICON(SURFACE_NSURFACE)
DEF_ICON(SURFACE_NCYLINDER)
DEF_ICON(SURFACE_NSPHERE)
DEF_ICON(SURFACE_NTORUS)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK636)
- DEF_ICON(BLANK637)
- DEF_ICON(BLANK638)
-#endif
+DEF_ICON(GP_EMPTY)
+DEF_ICON(GP_STROKE)
+DEF_ICON_BLANK(397)
DEF_ICON(CURVE_BEZCURVE)
DEF_ICON(CURVE_BEZCIRCLE)
DEF_ICON(CURVE_NCURVE)
DEF_ICON(CURVE_NCIRCLE)
DEF_ICON(CURVE_PATH)
-DEF_ICON(LIGHTPROBE_CUBEMAP)
-DEF_ICON(LIGHTPROBE_PLANAR)
-DEF_ICON(LIGHTPROBE_GRID)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK647)
- DEF_ICON(BLANK648)
-#endif
+DEF_ICON_SHADING(LIGHTPROBE_CUBEMAP)
+DEF_ICON_SHADING(LIGHTPROBE_PLANAR)
+DEF_ICON_SHADING(LIGHTPROBE_GRID)
+DEF_ICON_BLANK(406)
+DEF_ICON_BLANK(407)
DEF_ICON(COLOR_RED)
DEF_ICON(COLOR_GREEN)
DEF_ICON(COLOR_BLUE)
@@ -447,165 +427,159 @@ DEF_ICON(FORCE_BOID)
DEF_ICON(FORCE_TURBULENCE)
DEF_ICON(FORCE_DRAG)
DEF_ICON(FORCE_SMOKEFLOW)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK673)
- DEF_ICON(BLANK674)
- DEF_ICON(BLANK675)
- DEF_ICON(BLANK676)
- DEF_ICON(BLANK677)
- DEF_ICON(BLANK678)
- DEF_ICON(BLANK679)
- DEF_ICON(BLANK680)
- DEF_ICON(BLANK681)
- DEF_ICON(BLANK682)
- DEF_ICON(BLANK683)
- DEF_ICON(BLANK684)
- DEF_ICON(BLANK685)
+DEF_ICON_BLANK(673)
+DEF_ICON_BLANK(674)
+DEF_ICON_BLANK(675)
+DEF_ICON_BLANK(676)
+DEF_ICON_BLANK(677)
+DEF_ICON_BLANK(678)
+DEF_ICON_BLANK(679)
+DEF_ICON_BLANK(680)
+DEF_ICON_BLANK(681)
+DEF_ICON_BLANK(682)
+DEF_ICON_BLANK(683)
+DEF_ICON_BLANK(684)
+DEF_ICON_BLANK(685)
/* EMPTY */
- DEF_ICON(BLANK690) /* XXX 'Temperature' icon! */
- DEF_ICON(BLANK691) /* XXX 'Temperature' icon! */
- DEF_ICON(BLANK692) /* XXX 'Gear' icon! */
-#endif
+DEF_ICON_BLANK(445)
+DEF_ICON_BLANK(446)
+DEF_ICON_BLANK(447)
DEF_ICON(NODE_INSERT_ON)
DEF_ICON(NODE_INSERT_OFF)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK695)
- DEF_ICON(BLANK696)
- DEF_ICON(BLANK697)
- DEF_ICON(BLANK698)
- DEF_ICON(BLANK699)
- DEF_ICON(BLANK700)
- DEF_ICON(BLANK701)
- DEF_ICON(BLANK702)
- DEF_ICON(BLANK703)
- DEF_ICON(BLANK704)
- DEF_ICON(BLANK705)
- DEF_ICON(BLANK706)
- DEF_ICON(BLANK707)
- DEF_ICON(BLANK708)
- DEF_ICON(BLANK709)
- DEF_ICON(BLANK710)
- DEF_ICON(BLANK711)
- DEF_ICON(BLANK712)
- DEF_ICON(BLANK713)
- DEF_ICON(BLANK714)
- DEF_ICON(BLANK715)
+DEF_ICON(NODE_TOP)
+DEF_ICON(NODE_SIDE)
+DEF_ICON(NODE_CORNER)
+DEF_ICON_BLANK(698)
+DEF_ICON_BLANK(699)
+DEF_ICON_BLANK(700)
+DEF_ICON_BLANK(701)
+DEF_ICON_BLANK(702)
+DEF_ICON_BLANK(703)
+DEF_ICON_BLANK(704)
+DEF_ICON_BLANK(705)
+DEF_ICON_BLANK(706)
+DEF_ICON_BLANK(707)
+DEF_ICON_BLANK(708)
+DEF_ICON_BLANK(709)
+DEF_ICON_BLANK(710)
+DEF_ICON_BLANK(711)
+DEF_ICON_BLANK(712)
+DEF_ICON_BLANK(713)
+DEF_ICON_BLANK(714)
+DEF_ICON_BLANK(715)
/* EMPTY */
- DEF_ICON(BLANK720)
- DEF_ICON(BLANK721)
- DEF_ICON(BLANK722)
- DEF_ICON(BLANK733)
- DEF_ICON(BLANK734)
- DEF_ICON(BLANK735)
- DEF_ICON(BLANK736)
- DEF_ICON(BLANK737)
- DEF_ICON(BLANK738)
- DEF_ICON(BLANK739)
- DEF_ICON(BLANK740)
- DEF_ICON(BLANK741)
- DEF_ICON(BLANK742)
- DEF_ICON(BLANK743)
- DEF_ICON(BLANK744)
- DEF_ICON(BLANK745)
- DEF_ICON(BLANK746)
- DEF_ICON(BLANK747)
- DEF_ICON(BLANK748)
- DEF_ICON(BLANK749)
- DEF_ICON(BLANK750)
- DEF_ICON(BLANK751)
- DEF_ICON(BLANK752)
- DEF_ICON(BLANK753)
- DEF_ICON(BLANK754)
- DEF_ICON(BLANK755)
+DEF_ICON(ALIGN_LEFT)
+DEF_ICON(ALIGN_CENTER)
+DEF_ICON(ALIGN_RIGHT)
+DEF_ICON(ALIGN_JUSTIFY)
+DEF_ICON(ALIGN_FLUSH)
+DEF_ICON(ALIGN_TOP)
+DEF_ICON(ALIGN_MIDDLE)
+DEF_ICON(ALIGN_BOTTOM)
+DEF_ICON(BOLD)
+DEF_ICON(ITALIC)
+DEF_ICON(UNDERLINE)
+DEF_ICON(SMALL_CAPS)
+DEF_ICON_BLANK(742)
+DEF_ICON_BLANK(743)
+DEF_ICON_BLANK(744)
+DEF_ICON_BLANK(745)
+DEF_ICON_BLANK(746)
+DEF_ICON_BLANK(747)
+DEF_ICON_BLANK(748)
+DEF_ICON_BLANK(749)
+DEF_ICON_BLANK(750)
+DEF_ICON_BLANK(751)
+DEF_ICON_BLANK(752)
+DEF_ICON_BLANK(753)
+DEF_ICON_BLANK(754)
+DEF_ICON_BLANK(755)
/* EMPTY */
- DEF_ICON(BLANK760)
- DEF_ICON(BLANK761)
- DEF_ICON(BLANK762)
- DEF_ICON(BLANK763)
- DEF_ICON(BLANK764)
- DEF_ICON(BLANK765)
- DEF_ICON(BLANK766)
- DEF_ICON(BLANK767)
- DEF_ICON(BLANK768)
- DEF_ICON(BLANK769)
- DEF_ICON(BLANK770)
- DEF_ICON(BLANK771)
- DEF_ICON(BLANK772)
- DEF_ICON(BLANK773)
- DEF_ICON(BLANK774)
- DEF_ICON(BLANK775)
- DEF_ICON(BLANK776)
- DEF_ICON(BLANK777)
- DEF_ICON(BLANK778)
- DEF_ICON(BLANK779)
- DEF_ICON(BLANK780)
- DEF_ICON(BLANK781)
- DEF_ICON(BLANK782)
- DEF_ICON(BLANK783)
- DEF_ICON(BLANK784)
- DEF_ICON(BLANK785)
-#endif
+DEF_ICON_BLANK(501)
+DEF_ICON_BLANK(502)
+DEF_ICON_BLANK(503)
+DEF_ICON_BLANK(504)
+DEF_ICON_BLANK(505)
+DEF_ICON_BLANK(506)
+DEF_ICON_BLANK(507)
+DEF_ICON_BLANK(508)
+DEF_ICON_BLANK(509)
+DEF_ICON_BLANK(510)
+DEF_ICON_BLANK(511)
+DEF_ICON_BLANK(512)
+DEF_ICON_BLANK(513)
+DEF_ICON_BLANK(514)
+DEF_ICON_BLANK(515)
+DEF_ICON_BLANK(516)
+DEF_ICON_BLANK(517)
+DEF_ICON_BLANK(518)
+DEF_ICON_BLANK(519)
+DEF_ICON_BLANK(520)
+DEF_ICON_BLANK(521)
+DEF_ICON_BLANK(522)
+DEF_ICON_BLANK(523)
+DEF_ICON_BLANK(524)
+DEF_ICON_BLANK(525)
+DEF_ICON_BLANK(526)
/* MODIFIERS */
-DEF_ICON(MODIFIER)
-DEF_ICON(MOD_WAVE)
-DEF_ICON(MOD_BUILD)
-DEF_ICON(MOD_DECIM)
-DEF_ICON(MOD_MIRROR)
-DEF_ICON(MOD_SOFT)
-DEF_ICON(MOD_SUBSURF)
-DEF_ICON(HOOK)
-DEF_ICON(MOD_PHYSICS)
-DEF_ICON(MOD_PARTICLES)
-DEF_ICON(MOD_BOOLEAN)
-DEF_ICON(MOD_EDGESPLIT)
-DEF_ICON(MOD_ARRAY)
-DEF_ICON(MOD_UVPROJECT)
-DEF_ICON(MOD_DISPLACE)
-DEF_ICON(MOD_CURVE)
-DEF_ICON(MOD_LATTICE)
-DEF_ICON(CONSTRAINT_DATA)
-DEF_ICON(MOD_ARMATURE)
-DEF_ICON(MOD_SHRINKWRAP)
-DEF_ICON(MOD_CAST)
-DEF_ICON(MOD_MESHDEFORM)
-DEF_ICON(MOD_BEVEL)
-DEF_ICON(MOD_SMOOTH)
-DEF_ICON(MOD_SIMPLEDEFORM)
-DEF_ICON(MOD_MASK)
+DEF_ICON_MODIFIER(MODIFIER)
+DEF_ICON_MODIFIER(MOD_WAVE)
+DEF_ICON_MODIFIER(MOD_BUILD)
+DEF_ICON_MODIFIER(MOD_DECIM)
+DEF_ICON_MODIFIER(MOD_MIRROR)
+DEF_ICON_MODIFIER(MOD_SOFT)
+DEF_ICON_MODIFIER(MOD_SUBSURF)
+DEF_ICON_MODIFIER(HOOK)
+DEF_ICON_MODIFIER(MOD_PHYSICS)
+DEF_ICON_MODIFIER(MOD_PARTICLES)
+DEF_ICON_MODIFIER(MOD_BOOLEAN)
+DEF_ICON_MODIFIER(MOD_EDGESPLIT)
+DEF_ICON_MODIFIER(MOD_ARRAY)
+DEF_ICON_MODIFIER(MOD_UVPROJECT)
+DEF_ICON_MODIFIER(MOD_DISPLACE)
+DEF_ICON_MODIFIER(MOD_CURVE)
+DEF_ICON_MODIFIER(MOD_LATTICE)
+DEF_ICON_MODIFIER(MOD_TINT)
+DEF_ICON_MODIFIER(MOD_ARMATURE)
+DEF_ICON_MODIFIER(MOD_SHRINKWRAP)
+DEF_ICON_MODIFIER(MOD_CAST)
+DEF_ICON_MODIFIER(MOD_MESHDEFORM)
+DEF_ICON_MODIFIER(MOD_BEVEL)
+DEF_ICON_MODIFIER(MOD_SMOOTH)
+DEF_ICON_MODIFIER(MOD_SIMPLEDEFORM)
+DEF_ICON_MODIFIER(MOD_MASK)
/* MODIFIERS */
-DEF_ICON(MOD_CLOTH)
-DEF_ICON(MOD_EXPLODE)
-DEF_ICON(MOD_FLUIDSIM)
-DEF_ICON(MOD_MULTIRES)
-DEF_ICON(MOD_SMOKE)
-DEF_ICON(MOD_SOLIDIFY)
-DEF_ICON(MOD_SCREW)
-DEF_ICON(MOD_VERTEX_WEIGHT)
-DEF_ICON(MOD_DYNAMICPAINT)
-DEF_ICON(MOD_REMESH)
-DEF_ICON(MOD_OCEAN)
-DEF_ICON(MOD_WARP)
-DEF_ICON(MOD_SKIN)
-DEF_ICON(MOD_TRIANGULATE)
-DEF_ICON(MOD_WIREFRAME)
-DEF_ICON(MOD_DATA_TRANSFER)
-DEF_ICON(MOD_NORMALEDIT)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK169)
- DEF_ICON(BLANK170)
- DEF_ICON(BLANK171)
- DEF_ICON(BLANK172)
- DEF_ICON(BLANK173)
- DEF_ICON(BLANK174)
- DEF_ICON(BLANK175)
- DEF_ICON(BLANK176)
- DEF_ICON(BLANK177)
-#endif
+DEF_ICON_MODIFIER(MOD_CLOTH)
+DEF_ICON_MODIFIER(MOD_EXPLODE)
+DEF_ICON_MODIFIER(MOD_FLUIDSIM)
+DEF_ICON_MODIFIER(MOD_MULTIRES)
+DEF_ICON_MODIFIER(MOD_SMOKE)
+DEF_ICON_MODIFIER(MOD_SOLIDIFY)
+DEF_ICON_MODIFIER(MOD_SCREW)
+DEF_ICON_MODIFIER(MOD_VERTEX_WEIGHT)
+DEF_ICON_MODIFIER(MOD_DYNAMICPAINT)
+DEF_ICON_MODIFIER(MOD_REMESH)
+DEF_ICON_MODIFIER(MOD_OCEAN)
+DEF_ICON_MODIFIER(MOD_WARP)
+DEF_ICON_MODIFIER(MOD_SKIN)
+DEF_ICON_MODIFIER(MOD_TRIANGULATE)
+DEF_ICON_MODIFIER(MOD_WIREFRAME)
+DEF_ICON_MODIFIER(MOD_DATA_TRANSFER)
+DEF_ICON_MODIFIER(MOD_NORMALEDIT)
+DEF_ICON_MODIFIER(MOD_PARTICLE_INSTANCE)
+DEF_ICON_MODIFIER(MOD_HUE_SATURATION)
+DEF_ICON_MODIFIER(MOD_NOISE)
+DEF_ICON_MODIFIER(MOD_OFFSET)
+DEF_ICON_MODIFIER(MOD_SIMPLIFY)
+DEF_ICON_MODIFIER(MOD_THICKNESS)
+DEF_ICON_MODIFIER(MOD_INSTANCE)
+DEF_ICON_MODIFIER(MOD_TIME)
+DEF_ICON_MODIFIER(MOD_OPACITY)
/* ANIMATION */
DEF_ICON(REC)
@@ -615,7 +589,7 @@ DEF_ICON(REW)
DEF_ICON(PAUSE)
DEF_ICON(PREV_KEYFRAME)
DEF_ICON(NEXT_KEYFRAME)
-DEF_ICON(PLAY_AUDIO)
+DEF_ICON_BLANK(185)
DEF_ICON(PLAY_REVERSE)
DEF_ICON(PREVIEW_RANGE)
DEF_ICON(ACTION_TWEAK)
@@ -624,8 +598,8 @@ DEF_ICON(PMARKER_SEL)
DEF_ICON(PMARKER)
DEF_ICON(MARKER_HLT)
DEF_ICON(MARKER)
-DEF_ICON(SPACE2) // XXX
-DEF_ICON(SPACE3) // XXX
+DEF_ICON(KEYFRAME_HLT)
+DEF_ICON(KEYFRAME)
DEF_ICON(KEYINGSET)
DEF_ICON(KEY_DEHLT)
DEF_ICON(KEY_HLT)
@@ -658,31 +632,24 @@ DEF_ICON(IPO_EASE_IN)
DEF_ICON(IPO_EASE_OUT)
DEF_ICON(IPO_EASE_IN_OUT)
DEF_ICON(NORMALIZE_FCURVES)
-#ifndef DEF_ICON_BLANK_SKIP
- /* available */
- DEF_ICON(BLANK204)
- DEF_ICON(BLANK205)
- DEF_ICON(BLANK206)
- DEF_ICON(BLANK207)
-#endif
+DEF_ICON_BLANK(635)
+DEF_ICON_BLANK(636)
+DEF_ICON_BLANK(637)
+DEF_ICON_BLANK(638)
/* EDITING */
DEF_ICON(VERTEXSEL)
DEF_ICON(EDGESEL)
DEF_ICON(FACESEL)
-DEF_ICON(LOOPSEL)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK210)
-#endif
-DEF_ICON(ROTATE)
-DEF_ICON(CURSOR)
-DEF_ICON(ROTATECOLLECTION)
-DEF_ICON(ROTATECENTER)
-DEF_ICON(ROTACTIVE)
-DEF_ICON(ALIGN)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK211)
-#endif
+DEF_ICON_BLANK(209)
+DEF_ICON_BLANK(210)
+DEF_ICON(PIVOT_BOUNDBOX)
+DEF_ICON(PIVOT_CURSOR)
+DEF_ICON(PIVOT_INDIVIDUAL)
+DEF_ICON(PIVOT_MEDIAN)
+DEF_ICON(PIVOT_ACTIVE)
+DEF_ICON(CENTER_ONLY)
+DEF_ICON_BLANK(652)
DEF_ICON(SMOOTHCURVE)
DEF_ICON(SPHERECURVE)
DEF_ICON(ROOTCURVE)
@@ -699,10 +666,10 @@ DEF_ICON(PARTICLE_TIP)
DEF_ICON(PARTICLE_PATH)
/* EDITING */
-DEF_ICON(MAN_TRANS)
-DEF_ICON(MAN_ROT)
-DEF_ICON(MAN_SCALE)
-DEF_ICON(MANIPUL)
+DEF_ICON_BLANK(669)
+DEF_ICON_BLANK(670)
+DEF_ICON_BLANK(671)
+DEF_ICON_BLANK(672)
DEF_ICON(SNAP_OFF)
DEF_ICON(SNAP_ON)
DEF_ICON(SNAP_NORMAL)
@@ -720,61 +687,53 @@ DEF_ICON(CLIPUV_HLT)
DEF_ICON(SNAP_PEEL_OBJECT)
DEF_ICON(GRID)
DEF_ICON(OBJECT_ORIGIN)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK222)
- DEF_ICON(BLANK224)
- DEF_ICON(BLANK225)
- DEF_ICON(BLANK226)
- DEF_ICON(BLANK226b)
-#endif
+DEF_ICON(ORIENTATION_GLOBAL)
+DEF_ICON(ORIENTATION_GIMBAL)
+DEF_ICON(ORIENTATION_LOCAL)
+DEF_ICON(ORIENTATION_NORMAL)
+DEF_ICON(ORIENTATION_VIEW)
/* EDITING */
-DEF_ICON(PASTEDOWN)
DEF_ICON(COPYDOWN)
+DEF_ICON(PASTEDOWN)
DEF_ICON(PASTEFLIPUP)
DEF_ICON(PASTEFLIPDOWN)
DEF_ICON(VIS_SEL_11)
DEF_ICON(VIS_SEL_10)
DEF_ICON(VIS_SEL_01)
DEF_ICON(VIS_SEL_00)
-DEF_ICON(SNAP_SURFACE)
+DEF_ICON_BLANK(231)
DEF_ICON(AUTOMERGE_ON)
DEF_ICON(AUTOMERGE_OFF)
-DEF_ICON(RETOPO)
+DEF_ICON_BLANK(234)
DEF_ICON(UV_VERTEXSEL)
DEF_ICON(UV_EDGESEL)
DEF_ICON(UV_FACESEL)
DEF_ICON(UV_ISLANDSEL)
DEF_ICON(UV_SYNC_SELECT)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK240)
- DEF_ICON(BLANK241)
- DEF_ICON(BLANK242)
- DEF_ICON(BLANK243)
- DEF_ICON(BLANK244)
- DEF_ICON(BLANK245)
- DEF_ICON(BLANK246)
- DEF_ICON(BLANK247)
- DEF_ICON(BLANK247b)
-#endif
+DEF_ICON_BLANK(240)
+DEF_ICON_BLANK(241)
+DEF_ICON_BLANK(242)
+DEF_ICON_BLANK(243)
+DEF_ICON_BLANK(244)
+DEF_ICON_BLANK(245)
+DEF_ICON(NORMALS_VERTEX)
+DEF_ICON(NORMALS_FACE)
+DEF_ICON(NORMALS_VERTEX_FACE)
/* 3D VIEW */
-DEF_ICON(BBOX)
-DEF_ICON(WIRE)
-DEF_ICON(SOLID)
-DEF_ICON(SMOOTH)
-DEF_ICON(POTATO)
+DEF_ICON(SHADING_BBOX)
+DEF_ICON(SHADING_WIRE)
+DEF_ICON(SHADING_SOLID)
+DEF_ICON(SHADING_RENDERED)
+DEF_ICON(SHADING_TEXTURE)
DEF_ICON(OVERLAY)
-DEF_ICON(ORTHO)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK249)
- DEF_ICON(BLANK250)
-#endif
+DEF_ICON(XRAY)
+DEF_ICON_BLANK(249)
+DEF_ICON_BLANK(250)
DEF_ICON(LOCKVIEW_OFF)
DEF_ICON(LOCKVIEW_ON)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK251)
-#endif
+DEF_ICON_BLANK(251)
DEF_ICON(AXIS_SIDE)
DEF_ICON(AXIS_FRONT)
DEF_ICON(AXIS_TOP)
@@ -784,57 +743,55 @@ DEF_ICON(NDOF_FLY)
DEF_ICON(NDOF_TRANS)
DEF_ICON(LAYER_USED)
DEF_ICON(LAYER_ACTIVE)
-#ifndef DEF_ICON_BLANK_SKIP
/* available */
- DEF_ICON(BLANK254)
- DEF_ICON(BLANK255)
- DEF_ICON(BLANK256)
- DEF_ICON(BLANK257)
- DEF_ICON(BLANK257b)
- DEF_ICON(BLANK258)
- DEF_ICON(BLANK259)
- DEF_ICON(BLANK260)
- DEF_ICON(BLANK261)
- DEF_ICON(BLANK262)
- DEF_ICON(BLANK263)
- DEF_ICON(BLANK264)
- DEF_ICON(BLANK265)
- DEF_ICON(BLANK266)
- DEF_ICON(BLANK267)
- DEF_ICON(BLANK268)
- DEF_ICON(BLANK269)
- DEF_ICON(BLANK270)
- DEF_ICON(BLANK271)
- DEF_ICON(BLANK272)
- DEF_ICON(BLANK273)
- DEF_ICON(BLANK274)
- DEF_ICON(BLANK275)
- DEF_ICON(BLANK276)
- DEF_ICON(BLANK277)
- DEF_ICON(BLANK278)
- DEF_ICON(BLANK279)
- DEF_ICON(BLANK280)
- DEF_ICON(BLANK281)
- DEF_ICON(BLANK282)
- DEF_ICON(BLANK282b)
-#endif
+DEF_ICON_BLANK(254)
+DEF_ICON_BLANK(255)
+DEF_ICON_BLANK(256)
+DEF_ICON_BLANK(257)
+DEF_ICON_BLANK(257b)
+DEF_ICON_BLANK(258)
+DEF_ICON_BLANK(259)
+DEF_ICON_BLANK(260)
+DEF_ICON_BLANK(261)
+DEF_ICON_BLANK(262)
+DEF_ICON_BLANK(263)
+DEF_ICON_BLANK(264)
+DEF_ICON_BLANK(265)
+DEF_ICON_BLANK(266)
+DEF_ICON_BLANK(267)
+DEF_ICON_BLANK(268)
+DEF_ICON_BLANK(269)
+DEF_ICON_BLANK(270)
+DEF_ICON_BLANK(271)
+DEF_ICON_BLANK(766)
+DEF_ICON_BLANK(767)
+DEF_ICON_BLANK(274)
+DEF_ICON_BLANK(275)
+DEF_ICON_BLANK(276)
+DEF_ICON_BLANK(277)
+DEF_ICON_BLANK(772)
+DEF_ICON_BLANK(773)
+DEF_ICON_BLANK(774)
+DEF_ICON_BLANK(775)
+DEF_ICON_BLANK(776)
+DEF_ICON_BLANK(777)
/* FILE SELECT */
DEF_ICON(SORTALPHA)
DEF_ICON(SORTBYEXT)
DEF_ICON(SORTTIME)
DEF_ICON(SORTSIZE)
-DEF_ICON(LONGDISPLAY)
DEF_ICON(SHORTDISPLAY)
-DEF_ICON(GHOST)
+DEF_ICON(LONGDISPLAY)
+DEF_ICON_BLANK(786)
DEF_ICON(IMGDISPLAY)
-DEF_ICON(SAVE_AS)
-DEF_ICON(SAVE_COPY)
+DEF_ICON_BLANK(788)
+DEF_ICON_BLANK(789)
DEF_ICON(BOOKMARKS)
DEF_ICON(FONTPREVIEW)
DEF_ICON(FILTER)
DEF_ICON(NEWFOLDER)
-DEF_ICON(OPEN_RECENT)
+DEF_ICON_BLANK(794)
DEF_ICON(FILE_PARENT)
DEF_ICON(FILE_REFRESH)
DEF_ICON(FILE_FOLDER)
@@ -848,33 +805,29 @@ DEF_ICON(FILE_FONT)
DEF_ICON(FILE_TEXT)
/* FILE SELECT */
-DEF_ICON(RECOVER_AUTO)
-DEF_ICON(SAVE_PREFS)
+DEF_ICON(SORT_DESC)
+DEF_ICON(SORT_ASC)
DEF_ICON(LINK_BLEND)
DEF_ICON(APPEND_BLEND)
DEF_ICON(IMPORT)
DEF_ICON(EXPORT)
-DEF_ICON(EXTERNAL_DATA)
-DEF_ICON(LOAD_FACTORY)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK300)
- DEF_ICON(BLANK301)
- DEF_ICON(BLANK302)
- DEF_ICON(BLANK303)
- DEF_ICON(BLANK304)
-#endif
+DEF_ICON_BLANK(814)
+DEF_ICON_BLANK(815)
+DEF_ICON_BLANK(816)
+DEF_ICON_BLANK(817)
+DEF_ICON_BLANK(818)
+DEF_ICON_BLANK(819)
+DEF_ICON_BLANK(820)
DEF_ICON(LOOP_BACK)
DEF_ICON(LOOP_FORWARDS)
DEF_ICON(BACK)
DEF_ICON(FORWARD)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK309)
- DEF_ICON(BLANK310)
- DEF_ICON(BLANK311)
- DEF_ICON(BLANK312)
- DEF_ICON(BLANK313)
- DEF_ICON(BLANK314)
-#endif
+DEF_ICON_BLANK(825)
+DEF_ICON_BLANK(826)
+DEF_ICON_BLANK(827)
+DEF_ICON_BLANK(828)
+DEF_ICON(ALEMBIC)
+DEF_ICON(VOLUME)
DEF_ICON(FILE_HIDDEN)
DEF_ICON(FILE_BACKUP)
DEF_ICON(DISK_DRIVE)
@@ -888,28 +841,24 @@ DEF_ICON(HAIR)
DEF_ICON(ALIASED)
DEF_ICON(ANTIALIASED)
DEF_ICON(MAT_SPHERE_SKY)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK319)
- DEF_ICON(BLANK320)
- DEF_ICON(BLANK321)
- DEF_ICON(BLANK322)
-#endif
+DEF_ICON(MATSHADERBALL)
+DEF_ICON(MATCLOTH)
+DEF_ICON(MATFLUID)
+DEF_ICON_BLANK(847)
DEF_ICON(WORDWRAP_OFF)
DEF_ICON(WORDWRAP_ON)
DEF_ICON(SYNTAX_OFF)
DEF_ICON(SYNTAX_ON)
DEF_ICON(LINENUMBERS_OFF)
DEF_ICON(LINENUMBERS_ON)
-DEF_ICON(SCRIPTPLUGINS) // XXX CREATE NEW
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK323)
- DEF_ICON(BLANK324)
- DEF_ICON(BLANK325)
- DEF_ICON(BLANK326)
- DEF_ICON(BLANK327)
- DEF_ICON(BLANK328)
- DEF_ICON(BLANK328b)
-#endif
+DEF_ICON(SCRIPTPLUGINS)
+DEF_ICON_BLANK(855)
+DEF_ICON_BLANK(856)
+DEF_ICON_BLANK(857)
+DEF_ICON_BLANK(858)
+DEF_ICON_BLANK(859)
+DEF_ICON_BLANK(860)
+DEF_ICON_BLANK(861)
/* SEQUENCE / IMAGE EDITOR */
DEF_ICON(SEQ_SEQUENCER)
@@ -918,194 +867,209 @@ DEF_ICON(SEQ_LUMA_WAVEFORM)
DEF_ICON(SEQ_CHROMA_SCOPE)
DEF_ICON(SEQ_HISTOGRAM)
DEF_ICON(SEQ_SPLITVIEW)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK331)
- DEF_ICON(BLANK332)
- DEF_ICON(BLANK333)
-#endif
+DEF_ICON_BLANK(870)
+DEF_ICON_BLANK(871)
+DEF_ICON_BLANK(872)
DEF_ICON(IMAGE_RGB) // XXX CHANGE TO STRAIGHT ALPHA, Z ETC
DEF_ICON(IMAGE_RGB_ALPHA)
DEF_ICON(IMAGE_ALPHA)
DEF_ICON(IMAGE_ZDEPTH)
-DEF_ICON(IMAGEFILE)
-#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK336)
- DEF_ICON(BLANK337)
- DEF_ICON(BLANK338)
- DEF_ICON(BLANK339)
- DEF_ICON(BLANK340)
- DEF_ICON(BLANK341)
- DEF_ICON(BLANK342)
- DEF_ICON(BLANK343)
- DEF_ICON(BLANK344)
- DEF_ICON(BLANK345)
- DEF_ICON(BLANK346)
- DEF_ICON(BLANK346b)
-#endif
+DEF_ICON_BLANK(877)
+DEF_ICON_BLANK(878)
+DEF_ICON_BLANK(879)
+DEF_ICON_BLANK(880)
+DEF_ICON_BLANK(881)
+DEF_ICON_BLANK(882)
+DEF_ICON_BLANK(883)
+DEF_ICON_BLANK(884)
+DEF_ICON(VIEW_PERSPECTIVE)
+DEF_ICON(VIEW_ORTHO)
+DEF_ICON(VIEW_CAMERA)
+DEF_ICON(VIEW_PAN)
+DEF_ICON(VIEW_ZOOM)
/* brush icons */
-DEF_ICON(BRUSH_ADD)
-DEF_ICON(BRUSH_BLOB)
-DEF_ICON(BRUSH_BLUR)
-DEF_ICON(BRUSH_CLAY)
-DEF_ICON(BRUSH_CLAY_STRIPS)
-DEF_ICON(BRUSH_CLONE)
-DEF_ICON(BRUSH_CREASE)
-DEF_ICON(BRUSH_DARKEN)
-DEF_ICON(BRUSH_FILL)
-DEF_ICON(BRUSH_FLATTEN)
-DEF_ICON(BRUSH_GRAB)
-DEF_ICON(BRUSH_INFLATE)
-DEF_ICON(BRUSH_LAYER)
-DEF_ICON(BRUSH_LIGHTEN)
-DEF_ICON(BRUSH_MASK)
-DEF_ICON(BRUSH_MIX)
-DEF_ICON(BRUSH_MULTIPLY)
-DEF_ICON(BRUSH_NUDGE)
-DEF_ICON(BRUSH_PINCH)
-DEF_ICON(BRUSH_SCRAPE)
-DEF_ICON(BRUSH_SCULPT_DRAW)
-DEF_ICON(BRUSH_SMEAR)
-DEF_ICON(BRUSH_SMOOTH)
-DEF_ICON(BRUSH_SNAKE_HOOK)
-DEF_ICON(BRUSH_SOFTEN)
-DEF_ICON(BRUSH_SUBTRACT)
-DEF_ICON(BRUSH_TEXDRAW)
-DEF_ICON(BRUSH_TEXFILL)
-DEF_ICON(BRUSH_TEXMASK)
-DEF_ICON(BRUSH_THUMB)
-DEF_ICON(BRUSH_ROTATE)
-DEF_ICON(BRUSH_VERTEXDRAW)
+DEF_ICON_COLOR(BRUSH_ADD)
+DEF_ICON_COLOR(BRUSH_BLOB)
+DEF_ICON_COLOR(BRUSH_BLUR)
+DEF_ICON_COLOR(BRUSH_CLAY)
+DEF_ICON_COLOR(BRUSH_CLAY_STRIPS)
+DEF_ICON_COLOR(BRUSH_CLONE)
+DEF_ICON_COLOR(BRUSH_CREASE)
+DEF_ICON_COLOR(BRUSH_DARKEN)
+DEF_ICON_COLOR(BRUSH_FILL)
+DEF_ICON_COLOR(BRUSH_FLATTEN)
+DEF_ICON_COLOR(BRUSH_GRAB)
+DEF_ICON_COLOR(BRUSH_INFLATE)
+DEF_ICON_COLOR(BRUSH_LAYER)
+DEF_ICON_COLOR(BRUSH_LIGHTEN)
+DEF_ICON_COLOR(BRUSH_MASK)
+DEF_ICON_COLOR(BRUSH_MIX)
+DEF_ICON_COLOR(BRUSH_MULTIPLY)
+DEF_ICON_COLOR(BRUSH_NUDGE)
+DEF_ICON_COLOR(BRUSH_PINCH)
+DEF_ICON_COLOR(BRUSH_SCRAPE)
+DEF_ICON_COLOR(BRUSH_SCULPT_DRAW)
+DEF_ICON_COLOR(BRUSH_SMEAR)
+DEF_ICON_COLOR(BRUSH_SMOOTH)
+DEF_ICON_COLOR(BRUSH_SNAKE_HOOK)
+DEF_ICON_COLOR(BRUSH_SOFTEN)
+DEF_ICON_COLOR(BRUSH_SUBTRACT)
+DEF_ICON_COLOR(BRUSH_TEXDRAW)
+DEF_ICON_COLOR(BRUSH_TEXFILL)
+DEF_ICON_COLOR(BRUSH_TEXMASK)
+DEF_ICON_COLOR(BRUSH_THUMB)
+DEF_ICON_COLOR(BRUSH_ROTATE)
+DEF_ICON_COLOR(BRUSH_VERTEXDRAW)
/* Matcaps */
-DEF_ICON(MATCAP_01)
-DEF_ICON(MATCAP_02)
-DEF_ICON(MATCAP_03)
-DEF_ICON(MATCAP_04)
-DEF_ICON(MATCAP_05)
-DEF_ICON(MATCAP_06)
-DEF_ICON(MATCAP_07)
-DEF_ICON(MATCAP_08)
-DEF_ICON(MATCAP_09)
-DEF_ICON(MATCAP_10)
-DEF_ICON(MATCAP_11)
-DEF_ICON(MATCAP_12)
-DEF_ICON(MATCAP_13)
-DEF_ICON(MATCAP_14)
-DEF_ICON(MATCAP_15)
-DEF_ICON(MATCAP_16)
-DEF_ICON(MATCAP_17)
-DEF_ICON(MATCAP_18)
-DEF_ICON(MATCAP_19)
-DEF_ICON(MATCAP_20)
-DEF_ICON(MATCAP_21)
-DEF_ICON(MATCAP_22)
-DEF_ICON(MATCAP_23)
-DEF_ICON(MATCAP_24)
+DEF_ICON_COLOR(MATCAP_01)
+DEF_ICON_COLOR(MATCAP_02)
+DEF_ICON_COLOR(MATCAP_03)
+DEF_ICON_COLOR(MATCAP_04)
+DEF_ICON_COLOR(MATCAP_05)
+DEF_ICON_COLOR(MATCAP_06)
+DEF_ICON_COLOR(MATCAP_07)
+DEF_ICON_COLOR(MATCAP_08)
+DEF_ICON_COLOR(MATCAP_09)
+DEF_ICON_COLOR(MATCAP_10)
+DEF_ICON_COLOR(MATCAP_11)
+DEF_ICON_COLOR(MATCAP_12)
+DEF_ICON_COLOR(MATCAP_13)
+DEF_ICON_COLOR(MATCAP_14)
+DEF_ICON_COLOR(MATCAP_15)
+DEF_ICON_COLOR(MATCAP_16)
+DEF_ICON_COLOR(MATCAP_17)
+DEF_ICON_COLOR(MATCAP_18)
+DEF_ICON_COLOR(MATCAP_19)
+DEF_ICON_COLOR(MATCAP_20)
+DEF_ICON_COLOR(MATCAP_21)
+DEF_ICON_COLOR(MATCAP_22)
+DEF_ICON_COLOR(MATCAP_23)
+DEF_ICON_COLOR(MATCAP_24)
/* grease pencil sculpt */
-DEF_ICON(GPBRUSH_SMOOTH)
-DEF_ICON(GPBRUSH_THICKNESS)
-DEF_ICON(GPBRUSH_STRENGTH)
-DEF_ICON(GPBRUSH_GRAB)
-DEF_ICON(GPBRUSH_PUSH)
-DEF_ICON(GPBRUSH_TWIST)
-DEF_ICON(GPBRUSH_PINCH)
-DEF_ICON(GPBRUSH_RANDOMIZE)
-DEF_ICON(GPBRUSH_CLONE)
-DEF_ICON(GPBRUSH_WEIGHT)
+DEF_ICON_COLOR(GPBRUSH_SMOOTH)
+DEF_ICON_COLOR(GPBRUSH_THICKNESS)
+DEF_ICON_COLOR(GPBRUSH_STRENGTH)
+DEF_ICON_COLOR(GPBRUSH_GRAB)
+DEF_ICON_COLOR(GPBRUSH_PUSH)
+DEF_ICON_COLOR(GPBRUSH_TWIST)
+DEF_ICON_COLOR(GPBRUSH_PINCH)
+DEF_ICON_COLOR(GPBRUSH_RANDOMIZE)
+DEF_ICON_COLOR(GPBRUSH_CLONE)
+DEF_ICON_COLOR(GPBRUSH_WEIGHT)
+
+DEF_ICON_COLOR(GPBRUSH_PENCIL)
+DEF_ICON_COLOR(GPBRUSH_PEN)
+DEF_ICON_COLOR(GPBRUSH_INK)
+DEF_ICON_COLOR(GPBRUSH_INKNOISE)
+DEF_ICON_COLOR(GPBRUSH_BLOCK)
+DEF_ICON_COLOR(GPBRUSH_MARKER)
+DEF_ICON_COLOR(GPBRUSH_CUSTOM)
+DEF_ICON_COLOR(GPBRUSH_FILL)
+DEF_ICON_COLOR(GPBRUSH_ERASE_SOFT)
+DEF_ICON_COLOR(GPBRUSH_ERASE_HARD)
+DEF_ICON_COLOR(GPBRUSH_ERASE_STROKE)
-DEF_ICON(GPBRUSH_PENCIL)
-DEF_ICON(GPBRUSH_PEN)
-DEF_ICON(GPBRUSH_INK)
-DEF_ICON(GPBRUSH_INKNOISE)
-DEF_ICON(GPBRUSH_BLOCK)
-DEF_ICON(GPBRUSH_MARKER)
-DEF_ICON(GPBRUSH_CUSTOM)
-DEF_ICON(GPBRUSH_FILL)
-DEF_ICON(GPBRUSH_ERASE_SOFT)
-DEF_ICON(GPBRUSH_ERASE_HARD)
-DEF_ICON(GPBRUSH_ERASE_STROKE)
+/* Vector Icons */
+DEF_ICON_VECTOR(SMALL_TRI_RIGHT_VEC)
-/* vector icons, VICO_ prefix added */
-DEF_VICO(SMALL_TRI_RIGHT_VEC)
+DEF_ICON_VECTOR(KEYTYPE_KEYFRAME_VEC)
+DEF_ICON_VECTOR(KEYTYPE_BREAKDOWN_VEC)
+DEF_ICON_VECTOR(KEYTYPE_EXTREME_VEC)
+DEF_ICON_VECTOR(KEYTYPE_JITTER_VEC)
+DEF_ICON_VECTOR(KEYTYPE_MOVING_HOLD_VEC)
-DEF_VICO(KEYTYPE_KEYFRAME_VEC)
-DEF_VICO(KEYTYPE_BREAKDOWN_VEC)
-DEF_VICO(KEYTYPE_EXTREME_VEC)
-DEF_VICO(KEYTYPE_JITTER_VEC)
-DEF_VICO(KEYTYPE_MOVING_HOLD_VEC)
+DEF_ICON_VECTOR(HANDLETYPE_FREE_VEC)
+DEF_ICON_VECTOR(HANDLETYPE_ALIGNED_VEC)
+DEF_ICON_VECTOR(HANDLETYPE_VECTOR_VEC)
+DEF_ICON_VECTOR(HANDLETYPE_AUTO_VEC)
+DEF_ICON_VECTOR(HANDLETYPE_AUTO_CLAMP_VEC)
-DEF_VICO(COLORSET_01_VEC)
-DEF_VICO(COLORSET_02_VEC)
-DEF_VICO(COLORSET_03_VEC)
-DEF_VICO(COLORSET_04_VEC)
-DEF_VICO(COLORSET_05_VEC)
-DEF_VICO(COLORSET_06_VEC)
-DEF_VICO(COLORSET_07_VEC)
-DEF_VICO(COLORSET_08_VEC)
-DEF_VICO(COLORSET_09_VEC)
-DEF_VICO(COLORSET_10_VEC)
-DEF_VICO(COLORSET_11_VEC)
-DEF_VICO(COLORSET_12_VEC)
-DEF_VICO(COLORSET_13_VEC)
-DEF_VICO(COLORSET_14_VEC)
-DEF_VICO(COLORSET_15_VEC)
-DEF_VICO(COLORSET_16_VEC)
-DEF_VICO(COLORSET_17_VEC)
-DEF_VICO(COLORSET_18_VEC)
-DEF_VICO(COLORSET_19_VEC)
-DEF_VICO(COLORSET_20_VEC)
+DEF_ICON_VECTOR(COLORSET_01_VEC)
+DEF_ICON_VECTOR(COLORSET_02_VEC)
+DEF_ICON_VECTOR(COLORSET_03_VEC)
+DEF_ICON_VECTOR(COLORSET_04_VEC)
+DEF_ICON_VECTOR(COLORSET_05_VEC)
+DEF_ICON_VECTOR(COLORSET_06_VEC)
+DEF_ICON_VECTOR(COLORSET_07_VEC)
+DEF_ICON_VECTOR(COLORSET_08_VEC)
+DEF_ICON_VECTOR(COLORSET_09_VEC)
+DEF_ICON_VECTOR(COLORSET_10_VEC)
+DEF_ICON_VECTOR(COLORSET_11_VEC)
+DEF_ICON_VECTOR(COLORSET_12_VEC)
+DEF_ICON_VECTOR(COLORSET_13_VEC)
+DEF_ICON_VECTOR(COLORSET_14_VEC)
+DEF_ICON_VECTOR(COLORSET_15_VEC)
+DEF_ICON_VECTOR(COLORSET_16_VEC)
+DEF_ICON_VECTOR(COLORSET_17_VEC)
+DEF_ICON_VECTOR(COLORSET_18_VEC)
+DEF_ICON_VECTOR(COLORSET_19_VEC)
+DEF_ICON_VECTOR(COLORSET_20_VEC)
/* Events */
-DEF_ICON(EVENT_A)
-DEF_ICON(EVENT_B)
-DEF_ICON(EVENT_C)
-DEF_ICON(EVENT_D)
-DEF_ICON(EVENT_E)
-DEF_ICON(EVENT_F)
-DEF_ICON(EVENT_G)
-DEF_ICON(EVENT_H)
-DEF_ICON(EVENT_I)
-DEF_ICON(EVENT_J)
-DEF_ICON(EVENT_K)
-DEF_ICON(EVENT_L)
-DEF_ICON(EVENT_M)
-DEF_ICON(EVENT_N)
-DEF_ICON(EVENT_O)
-DEF_ICON(EVENT_P)
-DEF_ICON(EVENT_Q)
-DEF_ICON(EVENT_R)
-DEF_ICON(EVENT_S)
-DEF_ICON(EVENT_T)
-DEF_ICON(EVENT_U)
-DEF_ICON(EVENT_V)
-DEF_ICON(EVENT_W)
-DEF_ICON(EVENT_X)
-DEF_ICON(EVENT_Y)
-DEF_ICON(EVENT_Z)
-DEF_ICON(EVENT_SHIFT)
-DEF_ICON(EVENT_CTRL)
-DEF_ICON(EVENT_ALT)
-DEF_ICON(EVENT_OS)
-DEF_ICON(EVENT_F1)
-DEF_ICON(EVENT_F2)
-DEF_ICON(EVENT_F3)
-DEF_ICON(EVENT_F4)
-DEF_ICON(EVENT_F5)
-DEF_ICON(EVENT_F6)
-DEF_ICON(EVENT_F7)
-DEF_ICON(EVENT_F8)
-DEF_ICON(EVENT_F9)
-DEF_ICON(EVENT_F10)
-DEF_ICON(EVENT_F11)
-DEF_ICON(EVENT_F12)
-DEF_ICON(EVENT_ESC)
-DEF_ICON(EVENT_TAB)
-DEF_ICON(EVENT_PAGEUP)
-DEF_ICON(EVENT_PAGEDOWN)
-DEF_ICON(EVENT_HOME)
-DEF_ICON(EVENT_END)
-DEF_ICON(EVENT_RETURN)
+DEF_ICON_COLOR(EVENT_A)
+DEF_ICON_COLOR(EVENT_B)
+DEF_ICON_COLOR(EVENT_C)
+DEF_ICON_COLOR(EVENT_D)
+DEF_ICON_COLOR(EVENT_E)
+DEF_ICON_COLOR(EVENT_F)
+DEF_ICON_COLOR(EVENT_G)
+DEF_ICON_COLOR(EVENT_H)
+DEF_ICON_COLOR(EVENT_I)
+DEF_ICON_COLOR(EVENT_J)
+DEF_ICON_COLOR(EVENT_K)
+DEF_ICON_COLOR(EVENT_L)
+DEF_ICON_COLOR(EVENT_M)
+DEF_ICON_COLOR(EVENT_N)
+DEF_ICON_COLOR(EVENT_O)
+DEF_ICON_COLOR(EVENT_P)
+DEF_ICON_COLOR(EVENT_Q)
+DEF_ICON_COLOR(EVENT_R)
+DEF_ICON_COLOR(EVENT_S)
+DEF_ICON_COLOR(EVENT_T)
+DEF_ICON_COLOR(EVENT_U)
+DEF_ICON_COLOR(EVENT_V)
+DEF_ICON_COLOR(EVENT_W)
+DEF_ICON_COLOR(EVENT_X)
+DEF_ICON_COLOR(EVENT_Y)
+DEF_ICON_COLOR(EVENT_Z)
+DEF_ICON_COLOR(EVENT_SHIFT)
+DEF_ICON_COLOR(EVENT_CTRL)
+DEF_ICON_COLOR(EVENT_ALT)
+DEF_ICON_COLOR(EVENT_OS)
+DEF_ICON_COLOR(EVENT_F1)
+DEF_ICON_COLOR(EVENT_F2)
+DEF_ICON_COLOR(EVENT_F3)
+DEF_ICON_COLOR(EVENT_F4)
+DEF_ICON_COLOR(EVENT_F5)
+DEF_ICON_COLOR(EVENT_F6)
+DEF_ICON_COLOR(EVENT_F7)
+DEF_ICON_COLOR(EVENT_F8)
+DEF_ICON_COLOR(EVENT_F9)
+DEF_ICON_COLOR(EVENT_F10)
+DEF_ICON_COLOR(EVENT_F11)
+DEF_ICON_COLOR(EVENT_F12)
+DEF_ICON_COLOR(EVENT_ESC)
+DEF_ICON_COLOR(EVENT_TAB)
+DEF_ICON_COLOR(EVENT_PAGEUP)
+DEF_ICON_COLOR(EVENT_PAGEDOWN)
+DEF_ICON_COLOR(EVENT_HOME)
+DEF_ICON_COLOR(EVENT_END)
+DEF_ICON_COLOR(EVENT_RETURN)
/* add as needed. */
+
+/* Undefine all types. */
+
+#undef DEF_ICON
+#undef DEF_ICON_ERROR
+#undef DEF_ICON_COLLECTION
+#undef DEF_ICON_OBJECT
+#undef DEF_ICON_OBJECT_DATA
+#undef DEF_ICON_MODIFIER
+#undef DEF_ICON_SHADING
+#undef DEF_ICON_VECTOR
+#undef DEF_ICON_COLOR
+#undef DEF_ICON_BLANK
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index e739308bd1e..d0d2b83f7cc 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -195,7 +195,7 @@ enum {
UI_BUT_TEXTEDIT_UPDATE = (1 << 29), /* when widget is in textedit mode, update value on each char stroke */
UI_BUT_VALUE_CLEAR = (1 << 30), /* show 'x' icon to clear/unlink value of text or search button */
- UI_BUT_OVERRIDEN = (1 << 31), /* RNA property of the button is overriden from linked reference data. */
+ UI_BUT_OVERRIDEN = (1 << 31), /* RNA property of the button is overridden from linked reference data. */
};
#define UI_PANEL_WIDTH 340
@@ -235,7 +235,10 @@ enum {
UI_BUT_ACTIVE_LEFT = (1 << 21), /* Active left part of number button */
UI_BUT_ACTIVE_RIGHT = (1 << 22), /* Active right part of number button */
- UI_BUT_HAS_SHORTCUT = (1 << 23), /* Button has shortcut text */
+ /* (also used by search buttons to enforce shortcut display for their items). */
+ UI_BUT_HAS_SHORTCUT = (1 << 23), /* Button has shortcut text. */
+
+ UI_BUT_ICON_REVERSE = (1 << 24), /* Reverse order of consecutive off/on icons */
};
/* scale fixed button widths by this to account for DPI */
@@ -407,6 +410,7 @@ typedef bool (*uiMenuStepFunc)(struct bContext *C, int direction, void *arg1);
/* interface_query.c */
+bool UI_but_has_tooltip_label(const uiBut *but);
bool UI_but_is_tool(const uiBut *but);
#define UI_but_is_decorator(but) \
((but)->func == ui_but_anim_decorate_cb)
@@ -505,6 +509,11 @@ void UI_blocklist_update_window_matrix(const struct bContext *C, const struct Li
void UI_blocklist_draw(const struct bContext *C, const struct ListBase *lb);
void UI_block_update_from_old(const struct bContext *C, struct uiBlock *block);
+enum {
+ UI_BLOCK_THEME_STYLE_REGULAR = 0,
+ UI_BLOCK_THEME_STYLE_POPUP = 1,
+};
+void UI_block_theme_style_set(uiBlock *block, char theme_style);
void UI_block_emboss_set(uiBlock *block, char dt);
void UI_block_free(const struct bContext *C, uiBlock *block);
@@ -907,6 +916,7 @@ void UI_exit(void);
#define UI_LAYOUT_MENU 2
#define UI_LAYOUT_TOOLBAR 3
#define UI_LAYOUT_PIEMENU 4
+#define UI_LAYOUT_VERT_BAR 5
#define UI_UNIT_X ((void)0, U.widget_unit)
#define UI_UNIT_Y ((void)0, U.widget_unit)
@@ -985,6 +995,8 @@ void uiLayoutSetAlignment(uiLayout *layout, char alignment);
void uiLayoutSetKeepAspect(uiLayout *layout, bool keepaspect);
void uiLayoutSetScaleX(uiLayout *layout, float scale);
void uiLayoutSetScaleY(uiLayout *layout, float scale);
+void uiLayoutSetUnitsX(uiLayout *layout, float unit);
+void uiLayoutSetUnitsY(uiLayout *layout, float unit);
void uiLayoutSetEmboss(uiLayout *layout, char emboss);
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep);
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep);
@@ -998,6 +1010,8 @@ bool uiLayoutGetKeepAspect(uiLayout *layout);
int uiLayoutGetWidth(uiLayout *layout);
float uiLayoutGetScaleX(uiLayout *layout);
float uiLayoutGetScaleY(uiLayout *layout);
+float uiLayoutGetUnitsX(uiLayout *layout);
+float uiLayoutGetUnitsY(uiLayout *layout);
int uiLayoutGetEmboss(uiLayout *layout);
bool uiLayoutGetPropSep(uiLayout *layout);
bool uiLayoutGetPropDecorate(uiLayout *layout);
@@ -1029,11 +1043,12 @@ void uiTemplateIDBrowse(
const char *newop, const char *openop, const char *unlinkop, int filter);
void uiTemplateIDPreview(
uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
- const char *newop, const char *openop, const char *unlinkop, int rows, int cols, int filter);
+ const char *newop, const char *openop, const char *unlinkop, int rows, int cols,
+ int filter, const bool hide_buttons);
void uiTemplateIDTabs(
uiLayout *layout, struct bContext *C,
PointerRNA *ptr, const char *propname,
- const char *newop, const char *openop, const char *menu,
+ const char *newop, const char *menu,
int filter);
void uiTemplateAnyID(
uiLayout *layout, struct PointerRNA *ptr, const char *propname,
@@ -1055,8 +1070,8 @@ void uiTemplatePathBuilder(
uiLayout *uiTemplateModifier(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
uiLayout *uiTemplateGpencilModifier(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
void uiTemplateGpencilColorPreview(
- uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
- int rows, int cols, float scale, int filter);
+ uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
+ int rows, int cols, float scale, int filter);
uiLayout *uiTemplateShaderFx(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
@@ -1110,7 +1125,7 @@ void uiTemplateList(
uiLayout *layout, struct bContext *C, const char *listtype_name, const char *list_id,
struct PointerRNA *dataptr, const char *propname, struct PointerRNA *active_dataptr,
const char *active_propname, const char *item_dyntip_propname,
- int rows, int maxrows, int layout_type, int columns);
+ int rows, int maxrows, int layout_type, int columns, bool reverse);
void uiTemplateNodeLink(uiLayout *layout, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input);
void uiTemplateNodeView(uiLayout *layout, struct bContext *C, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input);
void uiTemplateTextureUser(uiLayout *layout, struct bContext *C);
@@ -1124,6 +1139,8 @@ void uiTemplateMovieclipInformation(struct uiLayout *layout, struct PointerRNA *
void uiTemplateColorspaceSettings(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname);
void uiTemplateColormanagedViewSettings(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname);
+int uiTemplateRecentFiles(struct uiLayout *layout, int rows);
+
/* items */
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname);
void uiItemEnumO_ptr(uiLayout *layout, struct wmOperatorType *ot, const char *name, int icon, const char *propname, int value);
@@ -1172,6 +1189,7 @@ void uiItemLDrag(uiLayout *layout, struct PointerRNA *ptr, const char *name, int
void uiItemM(uiLayout *layout, const char *menuname, const char *name, int icon); /* menu */
void uiItemV(uiLayout *layout, const char *name, int icon, int argval); /* value */
void uiItemS(uiLayout *layout); /* separator */
+void uiItemS_ex(uiLayout *layout, float factor);
void uiItemSpacer(uiLayout *layout); /* Special separator. */
void uiItemPopoverPanel_ptr(
@@ -1188,10 +1206,12 @@ void uiItemPopoverPanelFromGroup(
const char *context, const char *category);
void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg);
+void uiItemMenuFN(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *argN);
void uiItemMenuEnumO_ptr(uiLayout *layout, struct bContext *C, struct wmOperatorType *ot, const char *propname, const char *name, int icon);
void uiItemMenuEnumO(uiLayout *layout, struct bContext *C, const char *opname, const char *propname, const char *name, int icon);
void uiItemMenuEnumR_prop(uiLayout *layout, struct PointerRNA *ptr, PropertyRNA *prop, const char *name, int icon);
void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *name, int icon);
+void uiItemTabsEnumR_prop(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, PropertyRNA *prop, bool icon_only);
/* UI Operators */
typedef struct uiDragColorHandle {
@@ -1275,12 +1295,13 @@ bool UI_butstore_register_update(uiBlock *block, uiBut *but_dst, const uiBut *bu
void UI_butstore_unregister(uiButStore *bs_handle, uiBut **but_p);
/* ui_interface_region_tooltip.c */
-struct ARegion *UI_tooltip_create_from_button(struct bContext *C, struct ARegion *butregion, uiBut *but);
+struct ARegion *UI_tooltip_create_from_button(struct bContext *C, struct ARegion *butregion, uiBut *but, bool is_label);
struct ARegion *UI_tooltip_create_from_gizmo(struct bContext *C, struct wmGizmo *gz);
void UI_tooltip_free(struct bContext *C, struct bScreen *sc, struct ARegion *ar);
/* How long before a tool-tip shows. */
#define UI_TOOLTIP_DELAY 0.5
+#define UI_TOOLTIP_DELAY_LABEL 0.2
/* Float precision helpers */
#define UI_PRECISION_FLOAT_MAX 6
diff --git a/source/blender/editors/include/UI_interface_icons.h b/source/blender/editors/include/UI_interface_icons.h
index a34c4938b86..640d66c9ac4 100644
--- a/source/blender/editors/include/UI_interface_icons.h
+++ b/source/blender/editors/include/UI_interface_icons.h
@@ -73,10 +73,10 @@ void UI_icon_draw_preview(float x, float y, int icon_id);
void UI_icon_draw_preview_aspect(float x, float y, int icon_id, float aspect);
void UI_icon_draw_preview_aspect_size(float x, float y, int icon_id, float aspect, float alpha, int size);
-void UI_icon_draw_aspect(float x, float y, int icon_id, float aspect, float alpha);
-void UI_icon_draw_aspect_color(float x, float y, int icon_id, float aspect, const float rgb[3]);
+void UI_icon_draw_aspect(float x, float y, int icon_id, float aspect, float alpha, const char mono_color[4]);
+void UI_icon_draw_aspect_color(float x, float y, int icon_id, float aspect, const float rgb[3], const char mono_color[4]);
void UI_icon_draw_size(float x, float y, int size, int icon_id, float alpha);
-void UI_icon_draw_desaturate(float x, float y, int icon_id, float aspect, float alpha, float desaturate);
+void UI_icon_draw_desaturate(float x, float y, int icon_id, float aspect, float alpha, float desaturate, const char mono_color[4]);
void UI_icons_free(void);
void UI_icons_free_drawinfo(void *drawinfo);
diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h
index 94223d1ff46..277aae923d6 100644
--- a/source/blender/editors/include/UI_resources.h
+++ b/source/blender/editors/include/UI_resources.h
@@ -29,13 +29,16 @@
* \ingroup editorui
*/
+#include "BLI_sys_types.h"
+
#ifndef __UI_RESOURCES_H__
#define __UI_RESOURCES_H__
-/* elubie: TODO: move the typedef for icons to UI_interface_icons.h */
-/* and add/replace include of UI_resources.h by UI_interface_icons.h */
+/* Define icon enum. */
#define DEF_ICON(name) ICON_##name,
-#define DEF_VICO(name) VICO_##name,
+#define DEF_ICON_VECTOR(name) ICON_##name,
+#define DEF_ICON_COLOR(name) ICON_##name,
+#define DEF_ICON_BLANK(name) ICON_BLANK_##name,
typedef enum {
/* ui */
@@ -45,9 +48,6 @@ typedef enum {
#define BIFICONID_FIRST (ICON_NONE)
-#undef DEF_ICON
-#undef DEF_VICO
-
/* use to denote intentionally unset theme color */
#define TH_UNDEFINED -1
@@ -156,6 +156,8 @@ typedef enum ThemeColorID {
TH_KEYTYPE_BREAKDOWN_SELECT,
TH_KEYTYPE_JITTER,
TH_KEYTYPE_JITTER_SELECT,
+ TH_KEYTYPE_MOVEHOLD,
+ TH_KEYTYPE_MOVEHOLD_SELECT,
TH_KEYBORDER,
TH_KEYBORDER_SELECT,
@@ -215,6 +217,7 @@ typedef enum ThemeColorID {
TH_DOPESHEET_CHANNELOB,
TH_DOPESHEET_CHANNELSUBOB,
+ TH_DOPESHEET_IPOLINE,
TH_PREVIEW_BACK,
@@ -261,6 +264,13 @@ typedef enum ThemeColorID {
TH_ANIM_ACTIVE, /* active action */
TH_ANIM_INACTIVE, /* no active action */
+ TH_ANIM_PREVIEW_RANGE,/* preview range overlay */
+
+ TH_ICON_COLLECTION,
+ TH_ICON_OBJECT,
+ TH_ICON_OBJECT_DATA,
+ TH_ICON_MODIFIER,
+ TH_ICON_SHADING,
TH_NLA_TWEAK, /* 'tweaking' track in NLA */
TH_NLA_TWEAK_DUPLI, /* error/warning flag for other strips referencing dupli strip */
@@ -361,6 +371,9 @@ void UI_GetThemeColor4ubv(int colorid, unsigned char col[4]);
// get a theme color from specified space type
void UI_GetThemeColorType4ubv(int colorid, int spacetype, char col[4]);
+// get theme color for coloring monochrome icons
+bool UI_GetIconThemeColor4fv(int colorid, float col[4]);
+
// shade a 3 byte color (same as UI_GetColorPtrBlendShade3ubv with 0.0 factor)
void UI_GetColorPtrShade3ubv(const unsigned char cp1[3], unsigned char col[3], int offset);
diff --git a/source/blender/editors/include/UI_view2d.h b/source/blender/editors/include/UI_view2d.h
index 4c4ee1e01c5..8581e5d4a93 100644
--- a/source/blender/editors/include/UI_view2d.h
+++ b/source/blender/editors/include/UI_view2d.h
@@ -158,6 +158,8 @@ void UI_view2d_sync(struct bScreen *screen, struct ScrArea *sa, struct View2D *v
void UI_view2d_totRect_set(struct View2D *v2d, int width, int height);
void UI_view2d_totRect_set_resize(struct View2D *v2d, int width, int height, bool resize);
+void UI_view2d_mask_from_win(const struct View2D *v2d, struct rcti *r_mask);
+
/* per tab offsets, returns 1 if tab changed */
bool UI_view2d_tab_set(struct View2D *v2d, int tab);
@@ -178,8 +180,9 @@ void UI_view2d_grid_size(View2DGrid *grid, float *r_dx, float *r_dy);
void UI_view2d_grid_free(View2DGrid *grid);
/* scrollbar drawing */
-View2DScrollers *UI_view2d_scrollers_calc(const struct bContext *C, struct View2D *v2d,
- short xunits, short xclamp, short yunits, short yclamp);
+View2DScrollers *UI_view2d_scrollers_calc(
+ const struct bContext *C, struct View2D *v2d, const struct rcti *mask_custom,
+ short xunits, short xclamp, short yunits, short yclamp);
void UI_view2d_scrollers_draw(const struct bContext *C, struct View2D *v2d, View2DScrollers *scrollers);
void UI_view2d_scrollers_free(View2DScrollers *scrollers);
@@ -222,7 +225,11 @@ void UI_view2d_center_set(struct View2D *v2d, float x, float y);
void UI_view2d_offset(struct View2D *v2d, float xfac, float yfac);
-short UI_view2d_mouse_in_scrollers(const struct ARegion *ar, struct View2D *v2d, int x, int y);
+char UI_view2d_mouse_in_scrollers_ex(
+ const struct ARegion *ar, struct View2D *v2d, int x, int y,
+ int *r_scroll);
+char UI_view2d_mouse_in_scrollers(
+ const struct ARegion *ar, struct View2D *v2d, int x, int y);
/* cached text drawing in v2d, to allow pixel-aligned draw as post process */
void UI_view2d_text_cache_add(struct View2D *v2d, float x, float y,
diff --git a/source/blender/editors/interface/CMakeLists.txt b/source/blender/editors/interface/CMakeLists.txt
index cf172441be1..c2c2438b942 100644
--- a/source/blender/editors/interface/CMakeLists.txt
+++ b/source/blender/editors/interface/CMakeLists.txt
@@ -23,6 +23,7 @@ set(INC
../../blenfont
../../blenkernel
../../blenlib
+ ../../blenloader
../../blentranslation
../../depsgraph
../../draw
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 78bac8b46ee..0ad7a18b5ac 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -80,6 +80,7 @@
#include "BPY_extern.h"
#include "ED_screen.h"
+#include "ED_numinput.h"
#include "IMB_colormanagement.h"
@@ -1216,8 +1217,12 @@ static void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block)
BLI_assert(block->flag & (UI_BLOCK_LOOP | UI_BLOCK_SHOW_SHORTCUT_ALWAYS));
/* only do it before bounding */
- if (block->rect.xmin != block->rect.xmax)
+ if (block->rect.xmin != block->rect.xmax) {
+ return;
+ }
+ if (STREQ(block->name, "splash")) {
return;
+ }
if (block->flag & UI_BLOCK_RADIAL) {
for (but = block->buttons.first; but; but = but->next) {
@@ -1234,6 +1239,10 @@ static void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block)
if (but->drawstr[0] == '\0') {
continue;
}
+ else if (((block->flag & UI_BLOCK_POPOVER) == 0) && UI_but_is_tool(but)) {
+ /* For non-popovers, shown in shortcut only (has special shortcut handling code). */
+ continue;
+ }
}
else if (but->dt != UI_EMBOSS_PULLDOWN) {
continue;
@@ -1461,8 +1470,12 @@ void UI_block_draw(const bContext *C, uiBlock *block)
ui_draw_popover_back(ar, &style, block, &rect);
else if (block->flag & UI_BLOCK_LOOP)
ui_draw_menu_back(&style, block, &rect);
- else if (block->panel)
- ui_draw_aligned_panel(&style, block, &rect, UI_panel_category_is_visible(ar));
+ else if (block->panel) {
+ bool show_background = ar->alignment != RGN_ALIGN_FLOAT;
+ ui_draw_aligned_panel(
+ &style, block, &rect,
+ UI_panel_category_is_visible(ar), show_background);
+ }
BLF_batch_draw_begin();
UI_icon_draw_cache_begin();
@@ -1569,17 +1582,8 @@ int ui_but_is_pushed_ex(uiBut *but, double *value)
break;
case UI_BTYPE_ROW:
case UI_BTYPE_LISTROW:
- UI_GET_BUT_VALUE_INIT(but, *value);
- /* support for rna enum buts */
- if (but->rnaprop && (RNA_property_flag(but->rnaprop) & PROP_ENUM_FLAG)) {
- if ((int)*value & (int)but->hardmax) is_push = true;
- }
- else {
- if (*value == (double)but->hardmax) is_push = true;
- }
- break;
case UI_BTYPE_TAB:
- if (but->rnaprop && but->custom_data) {
+ if ((but->type == UI_BTYPE_TAB) && but->rnaprop && but->custom_data) {
/* uiBut.custom_data points to data this tab represents (e.g. workspace).
* uiBut.rnapoin/prop store an active value (e.g. active workspace). */
if (RNA_property_type(but->rnaprop) == PROP_POINTER) {
@@ -1588,6 +1592,19 @@ int ui_but_is_pushed_ex(uiBut *but, double *value)
is_push = true;
}
}
+ break;
+ }
+ else if (but->optype) {
+ break;
+ }
+
+ UI_GET_BUT_VALUE_INIT(but, *value);
+ /* support for rna enum buts */
+ if (but->rnaprop && (RNA_property_flag(but->rnaprop) & PROP_ENUM_FLAG)) {
+ if ((int)*value & (int)but->hardmax) is_push = true;
+ }
+ else {
+ if (*value == (double)but->hardmax) is_push = true;
}
break;
default:
@@ -2165,7 +2182,6 @@ void ui_but_convert_to_unit_alt_name(uiBut *but, char *str, size_t maxlen)
static void ui_get_but_string_unit(uiBut *but, char *str, int len_max, double value, bool pad, int float_precision)
{
UnitSettings *unit = but->block->unit;
- const bool do_split = (unit->flag & USER_UNIT_OPT_SPLIT) != 0;
int unit_type = UI_but_unit_type_get(but);
int precision;
@@ -2182,9 +2198,9 @@ static void ui_get_but_string_unit(uiBut *but, char *str, int len_max, double va
precision = float_precision;
}
- bUnit_AsString(
+ bUnit_AsString2(
str, len_max, ui_get_but_scale_unit(but, value), precision,
- unit->system, RNA_SUBTYPE_UNIT_VALUE(unit_type), do_split, pad);
+ RNA_SUBTYPE_UNIT_VALUE(unit_type), unit, pad);
}
static float ui_get_but_step_unit(uiBut *but, float step_default)
@@ -2394,27 +2410,13 @@ char *ui_but_string_get_dynamic(uiBut *but, int *r_str_size)
return str;
}
-#ifdef WITH_PYTHON
-
static bool ui_set_but_string_eval_num_unit(bContext *C, uiBut *but, const char *str, double *r_value)
{
- char str_unit_convert[256];
- const int unit_type = UI_but_unit_type_get(but);
-
- BLI_strncpy(str_unit_convert, str, sizeof(str_unit_convert));
-
- /* ugly, use the draw string to get the value,
- * this could cause problems if it includes some text which resolves to a unit */
- bUnit_ReplaceString(
- str_unit_convert, sizeof(str_unit_convert), but->drawstr,
- ui_get_but_scale_unit(but, 1.0), but->block->unit->system, RNA_SUBTYPE_UNIT_VALUE(unit_type));
-
- return BPY_execute_string_as_number(C, str_unit_convert, true, r_value);
+ const UnitSettings *unit = but->block->unit;
+ int type = RNA_SUBTYPE_UNIT_VALUE(UI_but_unit_type_get(but));
+ return user_string_to_number(C, str, unit, type, r_value);
}
-#endif /* WITH_PYTHON */
-
-
bool ui_but_string_set_eval_num(bContext *C, uiBut *but, const char *str, double *r_value)
{
bool ok = false;
@@ -2424,7 +2426,7 @@ bool ui_but_string_set_eval_num(bContext *C, uiBut *but, const char *str, double
if (str[0] != '\0') {
bool is_unit_but = (ui_but_is_float(but) && ui_but_is_unit(but));
/* only enable verbose if we won't run again with units */
- if (BPY_execute_string_as_number(C, str, is_unit_but == false, r_value)) {
+ if (BPY_execute_string_as_number(C, NULL, str, is_unit_but == false, r_value)) {
/* if the value parsed ok without unit conversion this button may still need a unit multiplier */
if (is_unit_but) {
char str_new[128];
@@ -2939,11 +2941,20 @@ void UI_block_emboss_set(uiBlock *block, char dt)
block->dt = dt;
}
-void ui_but_update(uiBut *but)
+void UI_block_theme_style_set(uiBlock *block, char theme_style)
+{
+ block->theme_style = theme_style;
+}
+
+/**
+ * \param but: Button to update.
+ * \param validate: When set, this function may change the button value.
+ * Otherwise treat the button value as read-only.
+ */
+void ui_but_update_ex(uiBut *but, const bool validate)
{
/* if something changed in the button */
double value = UI_BUT_VALUE_UNSET;
-// float okwidth; // UNUSED
ui_but_update_select_flag(but, &value);
@@ -2961,20 +2972,29 @@ void ui_but_update(uiBut *but)
case UI_BTYPE_NUM:
case UI_BTYPE_SCROLL:
case UI_BTYPE_NUM_SLIDER:
- UI_GET_BUT_VALUE_INIT(but, value);
- if (value < (double)but->hardmin) ui_but_value_set(but, but->hardmin);
- else if (value > (double)but->hardmax) ui_but_value_set(but, but->hardmax);
+ if (validate) {
+ UI_GET_BUT_VALUE_INIT(but, value);
+ if (value < (double)but->hardmin) {
+ ui_but_value_set(but, but->hardmin);
+ }
+ else if (value > (double)but->hardmax) {
+ ui_but_value_set(but, but->hardmax);
+ }
- /* max must never be smaller than min! Both being equal is allowed though */
- BLI_assert(but->softmin <= but->softmax &&
- but->hardmin <= but->hardmax);
+ /* max must never be smaller than min! Both being equal is allowed though */
+ BLI_assert(but->softmin <= but->softmax &&
+ but->hardmin <= but->hardmax);
+ }
break;
case UI_BTYPE_ICON_TOGGLE:
case UI_BTYPE_ICON_TOGGLE_N:
- if (!but->rnaprop || (RNA_property_flag(but->rnaprop) & PROP_ICONS_CONSECUTIVE)) {
- if (but->flag & UI_SELECT) but->iconadd = 1;
- else but->iconadd = 0;
+ if ((but->rnaprop == NULL) || (RNA_property_flag(but->rnaprop) & PROP_ICONS_CONSECUTIVE)) {
+ if (but->rnaprop && RNA_property_flag(but->rnaprop) & PROP_ICONS_REVERSE) {
+ but->drawflag |= UI_BUT_ICON_REVERSE;
+ }
+
+ but->iconadd = (but->flag & UI_SELECT) ? 1 : 0;
}
break;
@@ -3143,6 +3163,15 @@ void ui_but_update(uiBut *but)
/* text clipping moved to widget drawing code itself */
}
+void ui_but_update(uiBut *but)
+{
+ ui_but_update_ex(but, false);
+}
+
+void ui_but_update_edited(uiBut *but)
+{
+ ui_but_update_ex(but, true);
+}
void UI_block_align_begin(uiBlock *block)
{
@@ -3293,10 +3322,11 @@ static uiBut *ui_def_but(
if (block->flag & UI_BLOCK_RADIAL) {
but->drawflag |= UI_BUT_TEXT_LEFT;
- if (but->str && but->str[0])
+ if (but->str && but->str[0]) {
but->drawflag |= UI_BUT_ICON_LEFT;
+ }
}
- else if ((block->flag & UI_BLOCK_LOOP) ||
+ else if (((block->flag & UI_BLOCK_LOOP) && !ui_block_is_popover(block)) ||
ELEM(but->type,
UI_BTYPE_MENU, UI_BTYPE_TEXT, UI_BTYPE_LABEL,
UI_BTYPE_BLOCK, UI_BTYPE_BUT_MENU, UI_BTYPE_SEARCH_MENU,
@@ -3495,7 +3525,7 @@ static void ui_def_but_rna__menu(bContext *UNUSED(C), uiLayout *layout, void *bu
static void ui_but_submenu_enable(uiBlock *block, uiBut *but)
{
but->flag |= UI_BUT_ICON_SUBMENU;
- block->content_hints |= BLOCK_CONTAINS_SUBMENU_BUT;
+ block->content_hints |= UI_BLOCK_CONTAINS_SUBMENU_BUT;
}
/**
@@ -4203,7 +4233,7 @@ void UI_but_drag_set_value(uiBut *but)
void UI_but_drag_set_image(uiBut *but, const char *path, int icon, struct ImBuf *imb, float scale, const bool use_free)
{
but->dragtype = WM_DRAG_PATH;
- ui_def_but_icon(but, icon, 0); /* no flag UI_HAS_ICON, so icon doesnt draw in button */
+ ui_def_but_icon(but, icon, 0); /* no flag UI_HAS_ICON, so icon doesn't draw in button */
if ((but->dragflag & UI_BUT_DRAGPOIN_FREE)) {
MEM_SAFE_FREE(but->dragpoin);
but->dragflag &= ~UI_BUT_DRAGPOIN_FREE;
@@ -4523,7 +4553,7 @@ static void operator_enum_search_cb(const struct bContext *C, void *but, const c
for (item = item_array; item->identifier; item++) {
/* note: need to give the index rather than the identifier because the enum can be freed */
if (BLI_strcasestr(item->name, str)) {
- if (false == UI_search_item_add(items, item->name, SET_INT_IN_POINTER(item->value), item->icon))
+ if (false == UI_search_item_add(items, item->name, POINTER_FROM_INT(item->value), item->icon))
break;
}
}
@@ -4541,7 +4571,7 @@ static void operator_enum_call_cb(struct bContext *UNUSED(C), void *but, void *a
if (ot) {
if (ot->prop) {
- RNA_property_enum_set(opptr, ot->prop, GET_INT_FROM_POINTER(arg2));
+ RNA_property_enum_set(opptr, ot->prop, POINTER_AS_INT(arg2));
/* We do not call op from here, will be called by button code.
* ui_apply_but_funcs_after() (in interface_handlers.c) called this func before checking operators,
* because one of its parameters is the button itself!
@@ -4725,7 +4755,7 @@ void UI_but_string_info_get(bContext *C, uiBut *but, ...)
/* enum property */
ptr = &but->rnapoin;
prop = but->rnaprop;
- value = (but->type == UI_BTYPE_ROW) ? (int)but->hardmax : (int)ui_but_value_get(but);
+ value = (ELEM(but->type, UI_BTYPE_ROW, UI_BTYPE_TAB)) ? (int)but->hardmax : (int)ui_but_value_get(but);
}
else if (but->optype) {
PointerRNA *opptr = UI_but_operator_ptr_get(but);
diff --git a/source/blender/editors/interface/interface_align.c b/source/blender/editors/interface/interface_align.c
index c945746c2df..d102c7c582d 100644
--- a/source/blender/editors/interface/interface_align.c
+++ b/source/blender/editors/interface/interface_align.c
@@ -115,6 +115,22 @@ bool ui_but_can_align(const uiBut *but)
return (btype_can_align && (BLI_rctf_size_x(&but->rect) > 0.0f) && (BLI_rctf_size_y(&but->rect) > 0.0f));
}
+int ui_but_align_opposite_to_area_align_get(const ARegion *ar)
+{
+ switch (ar->alignment) {
+ case RGN_ALIGN_TOP:
+ return UI_BUT_ALIGN_DOWN;
+ case RGN_ALIGN_BOTTOM:
+ return UI_BUT_ALIGN_TOP;
+ case RGN_ALIGN_LEFT:
+ return UI_BUT_ALIGN_RIGHT;
+ case RGN_ALIGN_RIGHT:
+ return UI_BUT_ALIGN_LEFT;
+ }
+
+ return 0;
+}
+
/**
* This function checks a pair of buttons (assumed in a same align group), and if they are neighbors,
* set needed data accordingly.
@@ -325,23 +341,23 @@ static void ui_block_align_but_to_region(uiBut *but, const ARegion *region)
rctf *rect = &but->rect;
const float but_width = BLI_rctf_size_x(rect);
const float but_height = BLI_rctf_size_y(rect);
- const float px = U.pixelsize;
+ const float outline_px = U.pixelsize; /* This may have to be made more variable. */
switch (but->drawflag & UI_BUT_ALIGN) {
case UI_BUT_ALIGN_TOP:
- rect->ymax = region->winy + px;
+ rect->ymax = region->winy + outline_px;
rect->ymin = but->rect.ymax - but_height;
break;
case UI_BUT_ALIGN_DOWN:
- rect->ymin = -px;
+ rect->ymin = -outline_px;
rect->ymax = rect->ymin + but_height;
break;
case UI_BUT_ALIGN_LEFT:
- rect->xmin = -px;
+ rect->xmin = -outline_px;
rect->xmax = rect->xmin + but_width;
break;
case UI_BUT_ALIGN_RIGHT:
- rect->xmax = region->winx + px;
+ rect->xmax = region->winx + outline_px;
rect->xmin = rect->xmax - but_width;
break;
default:
diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c
index d2a5ab80148..4fe555615c2 100644
--- a/source/blender/editors/interface/interface_anim.c
+++ b/source/blender/editors/interface/interface_anim.c
@@ -168,7 +168,7 @@ bool ui_but_anim_expression_set(uiBut *but, const char *str)
BLI_strncpy_utf8(driver->expression, str, sizeof(driver->expression));
/* tag driver as needing to be recompiled */
- driver->flag |= DRIVER_FLAG_RECOMPILE;
+ BKE_driver_invalidate_expression(driver, true, false);
/* clear invalid flags which may prevent this from working */
driver->flag &= ~DRIVER_FLAG_INVALID;
@@ -237,7 +237,7 @@ bool ui_but_anim_expression_create(uiBut *but, const char *str)
BLI_strncpy_utf8(driver->expression, str, sizeof(driver->expression));
/* updates */
- driver->flag |= DRIVER_FLAG_RECOMPILE;
+ BKE_driver_invalidate_expression(driver, true, false);
DEG_relations_tag_update(CTX_data_main(C));
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME, NULL);
ok = true;
diff --git a/source/blender/editors/interface/interface_context_menu.c b/source/blender/editors/interface/interface_context_menu.c
index 253de3d3d5a..03d941c2387 100644
--- a/source/blender/editors/interface/interface_context_menu.c
+++ b/source/blender/editors/interface/interface_context_menu.c
@@ -766,10 +766,17 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but)
/* Show header tools for header buttons. */
if (ui_block_is_popup_any(but->block) == false) {
- ARegion *ar = CTX_wm_region(C);
- if (ar && (ar->regiontype == RGN_TYPE_HEADER)) {
+ const ARegion *ar = CTX_wm_region(C);
+
+ if (!ar) {
+ /* skip */
+ }
+ else if (ar->regiontype == RGN_TYPE_HEADER) {
uiItemMenuF(layout, IFACE_("Header"), ICON_NONE, ED_screens_header_tools_menu_create, NULL);
}
+ else if (ar->regiontype == RGN_TYPE_NAV_BAR) {
+ uiItemMenuF(layout, IFACE_("Navigation Bar"), ICON_NONE, ED_screens_navigation_bar_tools_menu_create, NULL);
+ }
}
MenuType *mt = WM_menutype_find("WM_MT_button_context", true);
diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c
index 6a304a8150e..8c785f63978 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -259,7 +259,7 @@ static void round_box_shade_col(unsigned attrib, const float col1[3], float cons
fac * col1[2] + (1.0f - fac) * col2[2],
1.0f
};
- immAttrib4fv(attrib, col);
+ immAttr4fv(attrib, col);
}
#endif
@@ -573,7 +573,7 @@ void ui_draw_but_TAB_outline(const rcti *rect, float rad, unsigned char highligh
immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
immBeginAtMost(GPU_PRIM_LINE_STRIP, 25);
- immAttrib3ubv(col, highlight);
+ immAttr3ubv(col, highlight);
/* start with corner left-top */
if (roundboxtype & UI_CNR_TOP_LEFT) {
@@ -599,7 +599,7 @@ void ui_draw_but_TAB_outline(const rcti *rect, float rad, unsigned char highligh
immVertex2f(pos, maxx, maxy);
}
- immAttrib3ubv(col, highlight_fade);
+ immAttr3ubv(col, highlight_fade);
/* corner right-bottom */
if (roundboxtype & UI_CNR_BOTTOM_RIGHT) {
@@ -625,7 +625,7 @@ void ui_draw_but_TAB_outline(const rcti *rect, float rad, unsigned char highligh
immVertex2f(pos, minx, miny);
}
- immAttrib3ubv(col, highlight);
+ immAttr3ubv(col, highlight);
/* back to corner left-top */
immVertex2f(pos, minx, roundboxtype & UI_CNR_TOP_LEFT ? maxy - rad : maxy);
@@ -1456,7 +1456,7 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *UNUSED(wcol), const rcti
v1[0] = v2[0] = x1 + a;
- immAttrib4fv(col_id, colf);
+ immAttr4fv(col_id, colf);
immVertex2fv(pos_id, v1);
immVertex2fv(pos_id, v2);
}
@@ -1475,7 +1475,7 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *UNUSED(wcol), const rcti
v1[0] = v2[0] = x1 + a;
- immAttrib4f(col_id, colf[0], colf[1], colf[2], 1.0f);
+ immAttr4f(col_id, colf[0], colf[1], colf[2], 1.0f);
immVertex2fv(pos_id, v1);
immVertex2fv(pos_id, v2);
}
@@ -1765,54 +1765,82 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, const rcti
}
immEnd();
}
+ immUnbindProgram();
+
- /* the curve */
- immUniformColor3ubv((unsigned char *)wcol->item);
- GPU_line_smooth(true);
- GPU_blend(true);
- immBegin(GPU_PRIM_LINE_STRIP, (CM_TABLE + 1) + 2);
if (cuma->table == NULL)
curvemapping_changed(cumap, false);
CurveMapPoint *cmp = cuma->table;
+ rctf line_range;
- /* first point */
+ /* First curve point. */
if ((cuma->flag & CUMA_EXTEND_EXTRAPOLATE) == 0) {
- immVertex2f(pos, rect->xmin, rect->ymin + zoomy * (cmp[0].y - offsy));
+ line_range.xmin = rect->xmin;
+ line_range.ymin = rect->ymin + zoomy * (cmp[0].y - offsy);
}
else {
- float fx = rect->xmin + zoomx * (cmp[0].x - offsx + cuma->ext_in[0]);
- float fy = rect->ymin + zoomy * (cmp[0].y - offsy + cuma->ext_in[1]);
- immVertex2f(pos, fx, fy);
+ line_range.xmin = rect->xmin + zoomx * (cmp[0].x - offsx + cuma->ext_in[0]);
+ line_range.ymin = rect->ymin + zoomy * (cmp[0].y - offsy + cuma->ext_in[1]);
+ }
+ /* Last curve point. */
+ if ((cuma->flag & CUMA_EXTEND_EXTRAPOLATE) == 0) {
+ line_range.xmax = rect->xmax;
+ line_range.ymax = rect->ymin + zoomy * (cmp[CM_TABLE].y - offsy);
+ }
+ else {
+ line_range.xmax = rect->xmin + zoomx * (cmp[CM_TABLE].x - offsx - cuma->ext_out[0]);
+ line_range.ymax = rect->ymin + zoomy * (cmp[CM_TABLE].y - offsy - cuma->ext_out[1]);
}
+
+ immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+ GPU_blend(true);
+
+ /* Curve filled. */
+ immUniformColor3ubvAlpha((unsigned char *)wcol->item, 128);
+ GPU_polygon_smooth(true);
+ immBegin(GPU_PRIM_TRI_STRIP, (CM_TABLE * 2 + 2) + 4);
+ immVertex2f(pos, line_range.xmin, rect->ymin);
+ immVertex2f(pos, line_range.xmin, line_range.ymin);
for (int a = 0; a <= CM_TABLE; a++) {
float fx = rect->xmin + zoomx * (cmp[a].x - offsx);
float fy = rect->ymin + zoomy * (cmp[a].y - offsy);
+ immVertex2f(pos, fx, rect->ymin);
immVertex2f(pos, fx, fy);
}
- /* last point */
- if ((cuma->flag & CUMA_EXTEND_EXTRAPOLATE) == 0) {
- immVertex2f(pos, rect->xmax, rect->ymin + zoomy * (cmp[CM_TABLE].y - offsy));
- }
- else {
- float fx = rect->xmin + zoomx * (cmp[CM_TABLE].x - offsx - cuma->ext_out[0]);
- float fy = rect->ymin + zoomy * (cmp[CM_TABLE].y - offsy - cuma->ext_out[1]);
+ immVertex2f(pos, line_range.xmax, rect->ymin);
+ immVertex2f(pos, line_range.xmax, rect->ymax);
+ immEnd();
+ GPU_polygon_smooth(false);
+
+ /* Curve line. */
+ GPU_line_width(1.0f);
+ immUniformColor3ubvAlpha((unsigned char *)wcol->item, 255);
+ GPU_line_smooth(true);
+ immBegin(GPU_PRIM_LINE_STRIP, (CM_TABLE + 1) + 2);
+ immVertex2f(pos, line_range.xmin, line_range.ymin);
+ for (int a = 0; a <= CM_TABLE; a++) {
+ float fx = rect->xmin + zoomx * (cmp[a].x - offsx);
+ float fy = rect->ymin + zoomy * (cmp[a].y - offsy);
immVertex2f(pos, fx, fy);
}
+ immVertex2f(pos, line_range.xmax, line_range.ymax);
immEnd();
+
+ /* Reset state for fill & line. */
GPU_line_smooth(false);
GPU_blend(false);
immUnbindProgram();
- /* the points, use aspect to make them visible on edges */
+ /* The points, use aspect to make them visible on edges. */
format = immVertexFormat();
pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
uint col = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
cmp = cuma->curve;
- GPU_point_size(3.0f);
+ GPU_point_size(max_ff(1.0f, min_ff(UI_DPI_FAC / but->block->aspect * 4.0f, 4.0f)));
immBegin(GPU_PRIM_POINTS, cuma->totpoint);
for (int a = 0; a < cuma->totpoint; a++) {
float color[4];
@@ -1822,7 +1850,7 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, const rcti
UI_GetThemeColor4fv(TH_TEXT, color);
float fx = rect->xmin + zoomx * (cmp[a].x - offsx);
float fy = rect->ymin + zoomy * (cmp[a].y - offsy);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, fx, fy);
}
immEnd();
@@ -1945,9 +1973,9 @@ void ui_draw_but_TRACKPREVIEW(ARegion *UNUSED(ar), uiBut *but, uiWidgetColors *U
float y2 = pos_sel[i + 1] * axe;
if (i % 2 == 1)
- immAttrib4fv(col, col_sel);
+ immAttr4fv(col, col_sel);
else
- immAttrib4fv(col, col_outline);
+ immAttr4fv(col, col_outline);
immVertex2f(pos, x1, y1);
immVertex2f(pos, x2, y2);
@@ -2053,7 +2081,9 @@ void ui_draw_but_NODESOCKET(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wcol
static void ui_shadowbox(unsigned pos, unsigned color, float minx, float miny, float maxx, float maxy, float shadsize, unsigned char alpha)
{
- /* v1-_
+ /**
+ * <pre>
+ * v1-_
* | -_v2
* | |
* | |
@@ -2062,6 +2092,7 @@ static void ui_shadowbox(unsigned pos, unsigned color, float minx, float miny, f
* \ | /
* \ | _v5
* v8______v6_-
+ * </pre>
*/
const float v1[2] = {maxx, maxy - 0.3f * shadsize};
const float v2[2] = {maxx + shadsize, maxy - 0.75f * shadsize};
@@ -2075,38 +2106,38 @@ static void ui_shadowbox(unsigned pos, unsigned color, float minx, float miny, f
const float v8[2] = {minx + 0.5f * shadsize, miny - shadsize};
/* right quad */
- immAttrib4ub(color, 0, 0, 0, alpha);
+ immAttr4ub(color, 0, 0, 0, alpha);
immVertex2fv(pos, v3);
immVertex2fv(pos, v1);
- immAttrib4ub(color, 0, 0, 0, 0);
+ immAttr4ub(color, 0, 0, 0, 0);
immVertex2fv(pos, v2);
immVertex2fv(pos, v2);
immVertex2fv(pos, v4);
- immAttrib4ub(color, 0, 0, 0, alpha);
+ immAttr4ub(color, 0, 0, 0, alpha);
immVertex2fv(pos, v3);
/* corner shape */
- /* immAttrib4ub(color, 0, 0, 0, alpha); */ /* Not needed, done above in previous tri */
+ /* immAttr4ub(color, 0, 0, 0, alpha); */ /* Not needed, done above in previous tri */
immVertex2fv(pos, v3);
- immAttrib4ub(color, 0, 0, 0, 0);
+ immAttr4ub(color, 0, 0, 0, 0);
immVertex2fv(pos, v4);
immVertex2fv(pos, v5);
immVertex2fv(pos, v5);
immVertex2fv(pos, v6);
- immAttrib4ub(color, 0, 0, 0, alpha);
+ immAttr4ub(color, 0, 0, 0, alpha);
immVertex2fv(pos, v3);
/* bottom quad */
- /* immAttrib4ub(color, 0, 0, 0, alpha); */ /* Not needed, done above in previous tri */
+ /* immAttr4ub(color, 0, 0, 0, alpha); */ /* Not needed, done above in previous tri */
immVertex2fv(pos, v3);
- immAttrib4ub(color, 0, 0, 0, 0);
+ immAttr4ub(color, 0, 0, 0, 0);
immVertex2fv(pos, v6);
immVertex2fv(pos, v8);
immVertex2fv(pos, v8);
- immAttrib4ub(color, 0, 0, 0, alpha);
+ immAttr4ub(color, 0, 0, 0, alpha);
immVertex2fv(pos, v7);
immVertex2fv(pos, v3);
}
diff --git a/source/blender/editors/interface/interface_eyedropper.c b/source/blender/editors/interface/interface_eyedropper.c
index 424019995ad..3a799c6e7db 100644
--- a/source/blender/editors/interface/interface_eyedropper.c
+++ b/source/blender/editors/interface/interface_eyedropper.c
@@ -70,15 +70,6 @@ wmKeyMap *eyedropper_modal_keymap(wmKeyConfig *keyconf)
keymap = WM_modalkeymap_add(keyconf, "Eyedropper Modal Map", modal_items);
- /* items for modal map */
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, EYE_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_PRESS, KM_ANY, 0, EYE_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, RETKEY, KM_RELEASE, KM_ANY, 0, EYE_MODAL_SAMPLE_CONFIRM);
- WM_modalkeymap_add_item(keymap, PADENTER, KM_RELEASE, KM_ANY, 0, EYE_MODAL_SAMPLE_CONFIRM);
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, KM_ANY, 0, EYE_MODAL_SAMPLE_CONFIRM);
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_ANY, 0, EYE_MODAL_SAMPLE_BEGIN);
- WM_modalkeymap_add_item(keymap, SPACEKEY, KM_RELEASE, KM_ANY, 0, EYE_MODAL_SAMPLE_RESET);
-
/* assign to operators */
WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_colorband");
WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_color");
@@ -106,15 +97,6 @@ wmKeyMap *eyedropper_colorband_modal_keymap(wmKeyConfig *keyconf)
keymap = WM_modalkeymap_add(keyconf, "Eyedropper ColorBand PointSampling Map", modal_items_point);
- /* items for modal map */
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, EYE_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, BACKSPACEKEY, KM_PRESS, KM_ANY, 0, EYE_MODAL_POINT_REMOVE_LAST);
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_PRESS, KM_ANY, 0, EYE_MODAL_POINT_CONFIRM);
- WM_modalkeymap_add_item(keymap, RETKEY, KM_RELEASE, KM_ANY, 0, EYE_MODAL_POINT_CONFIRM);
- WM_modalkeymap_add_item(keymap, PADENTER, KM_RELEASE, KM_ANY, 0, EYE_MODAL_POINT_CONFIRM);
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_ANY, 0, EYE_MODAL_POINT_SAMPLE);
- WM_modalkeymap_add_item(keymap, SPACEKEY, KM_RELEASE, KM_ANY, 0, EYE_MODAL_POINT_RESET);
-
/* assign to operators */
WM_modalkeymap_assign(keymap, "UI_OT_eyedropper_colorband_point");
diff --git a/source/blender/editors/interface/interface_eyedropper_color.c b/source/blender/editors/interface/interface_eyedropper_color.c
index bcce70d9d8a..8e80d5657d7 100644
--- a/source/blender/editors/interface/interface_eyedropper_color.c
+++ b/source/blender/editors/interface/interface_eyedropper_color.c
@@ -103,7 +103,7 @@ static bool eyedropper_init(bContext *C, wmOperator *op)
display_device = scene->display_settings.display_device;
eye->display = IMB_colormanagement_display_get_named(display_device);
- /* store inital color */
+ /* store initial color */
RNA_property_float_get_array(&eye->ptr, eye->prop, col);
if (eye->display) {
IMB_colormanagement_display_to_scene_linear_v3(col, eye->display);
diff --git a/source/blender/editors/interface/interface_eyedropper_datablock.c b/source/blender/editors/interface/interface_eyedropper_datablock.c
index b1e649f4abe..781032ef971 100644
--- a/source/blender/editors/interface/interface_eyedropper_datablock.c
+++ b/source/blender/editors/interface/interface_eyedropper_datablock.c
@@ -190,7 +190,10 @@ static void datadropper_id_sample_pt(bContext *C, DataDropper *ddr, int mx, int
}
}
- if (id) {
+ PointerRNA idptr;
+ RNA_id_pointer_create(id, &idptr);
+
+ if (id && RNA_property_pointer_poll(&ddr->ptr, ddr->prop, &idptr)) {
BLI_snprintf(ddr->name, sizeof(ddr->name), "%s: %s",
ddr->idcode_name, id->name + 2);
*r_id = id;
diff --git a/source/blender/editors/interface/interface_eyedropper_depth.c b/source/blender/editors/interface/interface_eyedropper_depth.c
index fb125a3845b..1dae076f930 100644
--- a/source/blender/editors/interface/interface_eyedropper_depth.c
+++ b/source/blender/editors/interface/interface_eyedropper_depth.c
@@ -158,9 +158,6 @@ static void depthdropper_depth_sample_pt(bContext *C, DepthDropper *ddr, int mx,
ScrArea *sa = BKE_screen_find_area_xy(screen, SPACE_TYPE_ANY, mx, my);
Scene *scene = CTX_data_scene(C);
- UnitSettings *unit = &scene->unit;
- const bool do_split = (unit->flag & USER_UNIT_OPT_SPLIT) != 0;
-
ScrArea *area_prev = CTX_wm_area(C);
ARegion *ar_prev = CTX_wm_region(C);
@@ -199,9 +196,9 @@ static void depthdropper_depth_sample_pt(bContext *C, DepthDropper *ddr, int mx,
*r_depth = len_v3v3(view_co, co_align);
- bUnit_AsString(ddr->name, sizeof(ddr->name),
- (double)*r_depth,
- 4, unit->system, B_UNIT_LENGTH, do_split, false);
+ bUnit_AsString2(
+ ddr->name, sizeof(ddr->name), (double)*r_depth,
+ 4, B_UNIT_LENGTH, &scene->unit, false);
}
else {
BLI_strncpy(ddr->name, "Nothing under cursor", sizeof(ddr->name));
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 983e202eb92..8a0b44c1887 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -155,7 +155,7 @@ typedef enum uiHandleButtonState {
#ifdef USE_ALLSELECT
-/* Unfortunately theres no good way handle more generally:
+/* Unfortunately there's no good way handle more generally:
* (propagate single clicks on layer buttons to other objects) */
#define USE_ALLSELECT_LAYER_HACK
@@ -910,6 +910,7 @@ static void ui_apply_but_TAB(bContext *C, uiBut *but, uiHandleButtonData *data)
ui_but_update(but);
}
else {
+ ui_but_value_set(but, but->hardmax);
ui_apply_but_func(C, but);
}
@@ -1219,7 +1220,7 @@ static bool ui_drag_toggle_but_is_supported(const uiBut *but)
return true;
}
else if (UI_but_is_decorator(but)) {
- return ELEM(but->icon, ICON_SPACE2, ICON_SPACE3, ICON_DOT, ICON_LIBRARY_DATA_OVERRIDE);
+ return ELEM(but->icon, ICON_DECORATE, ICON_DECORATE_KEYFRAME, ICON_DECORATE_ANIMATE, ICON_DECORATE_OVERRIDE);
}
else {
return false;
@@ -1232,7 +1233,7 @@ static bool ui_drag_toggle_but_is_pushed(uiBut *but)
return ui_but_is_pushed(but);
}
else if (UI_but_is_decorator(but)) {
- return (but->icon == ICON_SPACE2);
+ return (but->icon == ICON_DECORATE_KEYFRAME);
}
else {
return false;
@@ -2010,7 +2011,7 @@ static void ui_but_drop(bContext *C, const wmEvent *event, uiBut *but, uiHandleB
if (wmd->type == WM_DRAG_ID) {
/* align these types with UI_but_active_drop_name */
if (ELEM(but->type, UI_BTYPE_TEXT, UI_BTYPE_SEARCH_MENU)) {
- ID *id = (ID *)wmd->poin;
+ ID *id = WM_drag_ID(wmd, 0);
button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
@@ -2030,280 +2031,406 @@ static void ui_but_drop(bContext *C, const wmEvent *event, uiBut *but, uiHandleB
/* ******************* copy and paste ******************** */
-/* c = copy, v = paste */
-static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data, const char mode, const bool copy_array)
+static bool ui_but_contains_password(uiBut *but)
{
- int buf_paste_len = 0;
- const char *buf_paste = "";
- bool buf_paste_alloc = false;
- bool show_report = false; /* use to display errors parsing paste input */
+ return but->rnaprop && (RNA_property_subtype(but->rnaprop) == PROP_PASSWORD);
+}
- BLI_assert((but->flag & UI_BUT_DISABLED) == 0); /* caller should check */
+static void ui_but_get_pasted_text_from_clipboard(char **buf_paste, int *buf_len)
+{
+ char *text;
+ int length;
+ /* get only first line even if the clipboard contains multiple lines */
+ text = WM_clipboard_text_get_firstline(false, &length);
- if (mode == 'c') {
- /* disallow copying from any passwords */
- if (but->rnaprop && (RNA_property_subtype(but->rnaprop) == PROP_PASSWORD)) {
- return;
- }
+ if (text) {
+ *buf_paste = text;
+ *buf_len = length;
+ }
+ else {
+ *buf_paste = MEM_callocN(sizeof(char), __func__);
+ *buf_len = 0;
}
+}
- if (mode == 'v') {
- /* extract first line from clipboard in case of multi-line copies */
- const char *buf_paste_test;
+static int get_but_property_array_length(uiBut *but)
+{
+ return RNA_property_array_length(&but->rnapoin, but->rnaprop);
+}
- buf_paste_test = WM_clipboard_text_get_firstline(false, &buf_paste_len);
- if (buf_paste_test) {
- buf_paste = buf_paste_test;
- buf_paste_alloc = true;
- }
+static void ui_but_set_float_array(bContext *C, uiBut *but, uiHandleButtonData *data, float *values, int array_length)
+{
+ button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
+
+ for (int i = 0; i < array_length; i++) {
+ RNA_property_float_set_index(&but->rnapoin, but->rnaprop, i, values[i]);
}
+ if (data) data->value = values[but->rnaindex];
- /* No return from here down */
+ button_activate_state(C, but, BUTTON_STATE_EXIT);
+}
+static void float_array_to_string(float *values, int array_length, char *output, int output_len_max)
+{
+ /* to avoid buffer overflow attacks; numbers are quite arbitrary */
+ BLI_assert(output_len_max > 15);
+ output_len_max -= 10;
- /* numeric value */
- if (ELEM(but->type, UI_BTYPE_NUM, UI_BTYPE_NUM_SLIDER)) {
+ int current_index = 0;
+ output[current_index] = '[';
+ current_index++;
- if (but->poin == NULL && but->rnapoin.data == NULL) {
- /* pass */
- }
- else if (copy_array && but->rnapoin.data && but->rnaprop &&
- ELEM(RNA_property_subtype(but->rnaprop), PROP_COLOR, PROP_TRANSLATION, PROP_DIRECTION,
- PROP_VELOCITY, PROP_ACCELERATION, PROP_MATRIX, PROP_EULER, PROP_QUATERNION, PROP_AXISANGLE,
- PROP_XYZ, PROP_XYZ_LENGTH, PROP_COLOR_GAMMA, PROP_COORDS))
- {
- float values[4];
- int array_length = RNA_property_array_length(&but->rnapoin, but->rnaprop);
+ for (int i = 0; i < array_length; i++) {
+ int length = BLI_snprintf(output + current_index, output_len_max - current_index, "%f", values[i]);
+ current_index += length;
- if (mode == 'c') {
- char buf_copy[UI_MAX_DRAW_STR];
+ if (i < array_length - 1) {
+ if (current_index < output_len_max) {
+ output[current_index + 0] = ',';
+ output[current_index + 1] = ' ';
+ current_index += 2;
+ }
+ }
+ }
- if (array_length == 4) {
- values[3] = RNA_property_float_get_index(&but->rnapoin, but->rnaprop, 3);
- }
- else {
- values[3] = 0.0f;
- }
- ui_but_v3_get(but, values);
+ output[current_index + 0] = ']';
+ output[current_index + 1] = '\0';
+}
- BLI_snprintf(buf_copy, sizeof(buf_copy), "[%f, %f, %f, %f]", values[0], values[1], values[2], values[3]);
- WM_clipboard_text_set(buf_copy, 0);
- }
- else {
- if (sscanf(buf_paste, "[%f, %f, %f, %f]", &values[0], &values[1], &values[2], &values[3]) >= array_length) {
- button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
+static void ui_but_copy_numeric_array(uiBut *but, char *output, int output_len_max)
+{
+ int array_length = get_but_property_array_length(but);
+ float *values = alloca(array_length * sizeof(float));
+ RNA_property_float_get_array(&but->rnapoin, but->rnaprop, values);
+ float_array_to_string(values, array_length, output, output_len_max);
+}
- ui_but_v3_set(but, values);
- if (but->rnaprop && array_length == 4) {
- RNA_property_float_set_index(&but->rnapoin, but->rnaprop, 3, values[3]);
- }
- data->value = values[but->rnaindex];
+static bool parse_float_array(char *text, float *values, int expected_length)
+{
+ /* can parse max 4 floats for now */
+ BLI_assert(0 <= expected_length && expected_length <= 4);
- button_activate_state(C, but, BUTTON_STATE_EXIT);
- }
- else {
- WM_report(RPT_ERROR, "Paste expected 4 numbers, formatted: '[n, n, n, n]'");
- show_report = true;
- }
- }
- }
- else if (mode == 'c') {
- /* Get many decimal places, then strip trailing zeros.
- * note: too high values start to give strange results */
- char buf_copy[UI_MAX_DRAW_STR];
- ui_but_string_get_ex(but, buf_copy, sizeof(buf_copy), UI_PRECISION_FLOAT_MAX, false, NULL);
- BLI_str_rstrip_float_zero(buf_copy, '\0');
+ float v[5];
+ int actual_length = sscanf(text, "[%f, %f, %f, %f, %f]", &v[0], &v[1], &v[2], &v[3], &v[4]);
- WM_clipboard_text_set(buf_copy, 0);
- }
- else {
- double val;
+ if (actual_length == expected_length) {
+ memcpy(values, v, sizeof(float) * expected_length);
+ return true;
+ }
+ else {
+ return false;
+ }
+}
- if (ui_but_string_set_eval_num(C, but, buf_paste, &val)) {
- button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
- data->value = val;
- ui_but_string_set(C, but, buf_paste);
- button_activate_state(C, but, BUTTON_STATE_EXIT);
- }
- else {
- /* evaluating will report errors */
- show_report = true;
- }
- }
+static void ui_but_paste_numeric_array(bContext *C, uiBut *but, uiHandleButtonData *data, char *buf_paste)
+{
+ int array_length = get_but_property_array_length(but);
+ if (array_length > 4) {
+ // not supported for now
+ return;
}
- /* NORMAL button */
- else if (but->type == UI_BTYPE_UNITVEC) {
- float xyz[3];
+ float *values = alloca(sizeof(float) * array_length);
- if (but->poin == NULL && but->rnapoin.data == NULL) {
- /* pass */
- }
- else if (mode == 'c') {
- char buf_copy[UI_MAX_DRAW_STR];
- ui_but_v3_get(but, xyz);
- BLI_snprintf(buf_copy, sizeof(buf_copy), "[%f, %f, %f]", xyz[0], xyz[1], xyz[2]);
- WM_clipboard_text_set(buf_copy, 0);
- }
- else {
- if (sscanf(buf_paste, "[%f, %f, %f]", &xyz[0], &xyz[1], &xyz[2]) == 3) {
- if (normalize_v3(xyz) == 0.0f) {
- /* better set Z up then have a zero vector */
- xyz[2] = 1.0;
- }
- button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
- ui_but_v3_set(but, xyz);
- button_activate_state(C, but, BUTTON_STATE_EXIT);
- }
- else {
- WM_report(RPT_ERROR, "Paste expected 3 numbers, formatted: '[n, n, n]'");
- show_report = true;
- }
- }
+ if (parse_float_array(buf_paste, values, array_length)) {
+ ui_but_set_float_array(C, but, data, values, array_length);
}
+ else {
+ WM_report(RPT_ERROR, "Expected an array of numbers: [n, n, ...]");
+ }
+}
+static void ui_but_copy_numeric_value(uiBut *but, char *output, int output_len_max)
+{
+ /* Get many decimal places, then strip trailing zeros.
+ * note: too high values start to give strange results */
+ ui_but_string_get_ex(but, output, output_len_max, UI_PRECISION_FLOAT_MAX, false, NULL);
+ BLI_str_rstrip_float_zero(output, '\0');
+}
- /* RGB triple */
- else if (but->type == UI_BTYPE_COLOR) {
- float rgba[4];
+static void ui_but_paste_numeric_value(bContext *C, uiBut *but, uiHandleButtonData *data, char *buf_paste)
+{
+ double value;
- if (but->poin == NULL && but->rnapoin.data == NULL) {
- /* pass */
+ if (ui_but_string_set_eval_num(C, but, buf_paste, &value)) {
+ button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
+ data->value = value;
+ ui_but_string_set(C, but, buf_paste);
+ button_activate_state(C, but, BUTTON_STATE_EXIT);
+ }
+ else {
+ WM_report(RPT_ERROR, "Expected a number");
+ }
+}
+
+static bool ui_but_has_array_value(uiBut *but)
+{
+ return (but->rnapoin.data && but->rnaprop &&
+ ELEM(RNA_property_subtype(but->rnaprop), PROP_COLOR, PROP_TRANSLATION, PROP_DIRECTION,
+ PROP_VELOCITY, PROP_ACCELERATION, PROP_MATRIX, PROP_EULER, PROP_QUATERNION, PROP_AXISANGLE,
+ PROP_XYZ, PROP_XYZ_LENGTH, PROP_COLOR_GAMMA, PROP_COORDS));
+}
+
+static void ui_but_paste_normalized_vector(bContext *C, uiBut *but, char *buf_paste)
+{
+ float xyz[3];
+ if (parse_float_array(buf_paste, xyz, 3)) {
+ if (normalize_v3(xyz) == 0.0f) {
+ /* better set Z up then have a zero vector */
+ xyz[2] = 1.0;
}
- else if (mode == 'c') {
- char buf_copy[UI_MAX_DRAW_STR];
+ ui_but_set_float_array(C, but, NULL, xyz, 3);
+ }
+ else {
+ WM_report(RPT_ERROR, "Paste expected 3 numbers, formatted: '[n, n, n]'");
+ }
+}
- if (but->rnaprop && RNA_property_array_length(&but->rnapoin, but->rnaprop) == 4)
- rgba[3] = RNA_property_float_get_index(&but->rnapoin, but->rnaprop, 3);
- else
- rgba[3] = 1.0f;
+static void ui_but_copy_color(uiBut *but, char *output, int output_len_max)
+{
+ float rgba[4];
- ui_but_v3_get(but, rgba);
- /* convert to linear color to do compatible copy between gamma and non-gamma */
- if (but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
- srgb_to_linearrgb_v3_v3(rgba, rgba);
+ if (but->rnaprop && get_but_property_array_length(but) == 4)
+ rgba[3] = RNA_property_float_get_index(&but->rnapoin, but->rnaprop, 3);
+ else
+ rgba[3] = 1.0f;
- BLI_snprintf(buf_copy, sizeof(buf_copy), "[%f, %f, %f, %f]", rgba[0], rgba[1], rgba[2], rgba[3]);
- WM_clipboard_text_set(buf_copy, 0);
+ ui_but_v3_get(but, rgba);
- }
- else {
- if (sscanf(buf_paste, "[%f, %f, %f, %f]", &rgba[0], &rgba[1], &rgba[2], &rgba[3]) == 4) {
- /* assume linear colors in buffer */
- if (but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
- linearrgb_to_srgb_v3_v3(rgba, rgba);
+ /* convert to linear color to do compatible copy between gamma and non-gamma */
+ if (but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
+ srgb_to_linearrgb_v3_v3(rgba, rgba);
- button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
- ui_but_v3_set(but, rgba);
- if (but->rnaprop && RNA_property_array_length(&but->rnapoin, but->rnaprop) == 4)
- RNA_property_float_set_index(&but->rnapoin, but->rnaprop, 3, rgba[3]);
+ float_array_to_string(rgba, 4, output, output_len_max);
+}
- button_activate_state(C, but, BUTTON_STATE_EXIT);
- }
- else {
- WM_report(RPT_ERROR, "Paste expected 4 numbers, formatted: '[n, n, n, n]'");
- show_report = true;
+static void ui_but_paste_color(bContext *C, uiBut *but, char *buf_paste)
+{
+ float rgba[4];
+ if (parse_float_array(buf_paste, rgba, 4)) {
+ if (but->rnaprop) {
+ /* Assume linear colors in buffer. */
+ if (RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA) {
+ linearrgb_to_srgb_v3_v3(rgba, rgba);
}
+
+ /* Some color properties are RGB, not RGBA. */
+ int array_len = get_but_property_array_length(but);
+ BLI_assert(ELEM(array_len, 3, 4));
+ ui_but_set_float_array(C, but, NULL, rgba, array_len);
}
}
+ else {
+ WM_report(RPT_ERROR, "Paste expected 4 numbers, formatted: '[n, n, n, n]'");
+ }
+}
- /* text/string and ID data */
- else if (ELEM(but->type, UI_BTYPE_TEXT, UI_BTYPE_SEARCH_MENU)) {
- uiHandleButtonData *active_data = but->active;
+static void ui_but_copy_text(uiBut *but, char *output, int output_len_max)
+{
+ ui_but_string_get(but, output, output_len_max);
+}
- if (but->poin == NULL && but->rnapoin.data == NULL) {
- /* pass */
- }
- else if (mode == 'c') {
- button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
- WM_clipboard_text_set(active_data->str, 0);
- active_data->cancel = true;
- button_activate_state(C, but, BUTTON_STATE_EXIT);
- }
- else {
- button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
+static void ui_but_paste_text(bContext *C, uiBut *but, uiHandleButtonData *data, char *buf_paste)
+{
+ button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
+ ui_textedit_string_set(but, but->active, buf_paste);
- ui_textedit_string_set(but, active_data, buf_paste);
+ if (but->type == UI_BTYPE_SEARCH_MENU) {
+ but->changed = true;
+ ui_searchbox_update(C, data->searchbox, but, true);
+ }
- if (but->type == UI_BTYPE_SEARCH_MENU) {
- /* else uiSearchboxData.active member is not updated [#26856] */
- but->changed = true;
- ui_searchbox_update(C, data->searchbox, but, true);
- }
- button_activate_state(C, but, BUTTON_STATE_EXIT);
- }
+ button_activate_state(C, but, BUTTON_STATE_EXIT);
+}
+
+static void ui_but_copy_colorband(uiBut *but)
+{
+ if (but->poin != NULL) {
+ memcpy(&but_copypaste_coba, but->poin, sizeof(ColorBand));
}
- /* colorband (not supported by system clipboard) */
- else if (but->type == UI_BTYPE_COLORBAND) {
- if (mode == 'c') {
- if (but->poin != NULL) {
- memcpy(&but_copypaste_coba, but->poin, sizeof(ColorBand));
- }
- }
- else {
- if (but_copypaste_coba.tot != 0) {
- if (!but->poin)
- but->poin = MEM_callocN(sizeof(ColorBand), "colorband");
+}
- button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
- memcpy(data->coba, &but_copypaste_coba, sizeof(ColorBand));
- button_activate_state(C, but, BUTTON_STATE_EXIT);
- }
- }
+static void ui_but_paste_colorband(bContext *C, uiBut *but, uiHandleButtonData *data)
+{
+ if (but_copypaste_coba.tot != 0) {
+ if (!but->poin)
+ but->poin = MEM_callocN(sizeof(ColorBand), "colorband");
+
+ button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
+ memcpy(data->coba, &but_copypaste_coba, sizeof(ColorBand));
+ button_activate_state(C, but, BUTTON_STATE_EXIT);
}
- else if (but->type == UI_BTYPE_CURVE) {
- if (mode == 'c') {
- if (but->poin != NULL) {
- but_copypaste_curve_alive = true;
- curvemapping_free_data(&but_copypaste_curve);
- curvemapping_copy_data(&but_copypaste_curve, (CurveMapping *) but->poin);
- }
- }
- else {
- if (but_copypaste_curve_alive) {
- if (!but->poin)
- but->poin = MEM_callocN(sizeof(CurveMapping), "curvemapping");
+}
- button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
- curvemapping_free_data((CurveMapping *) but->poin);
- curvemapping_copy_data((CurveMapping *) but->poin, &but_copypaste_curve);
- button_activate_state(C, but, BUTTON_STATE_EXIT);
- }
- }
+static void ui_but_copy_curvemapping(uiBut *but)
+{
+ if (but->poin != NULL) {
+ but_copypaste_curve_alive = true;
+ curvemapping_free_data(&but_copypaste_curve);
+ curvemapping_copy_data(&but_copypaste_curve, (CurveMapping *) but->poin);
}
- /* operator button (any type) */
- else if (but->optype) {
- if (mode == 'c') {
- PointerRNA *opptr;
- char *str;
- opptr = UI_but_operator_ptr_get(but); /* allocated when needed, the button owns it */
+}
- str = WM_operator_pystring_ex(C, NULL, false, true, but->optype, opptr);
+static void ui_but_paste_curvemapping(bContext *C, uiBut *but)
+{
+ if (but_copypaste_curve_alive) {
+ if (!but->poin)
+ but->poin = MEM_callocN(sizeof(CurveMapping), "curvemapping");
- WM_clipboard_text_set(str, 0);
+ button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
+ curvemapping_free_data((CurveMapping *) but->poin);
+ curvemapping_copy_data((CurveMapping *) but->poin, &but_copypaste_curve);
+ button_activate_state(C, but, BUTTON_STATE_EXIT);
+ }
+}
- MEM_freeN(str);
- }
+static void ui_but_copy_operator(bContext *C, uiBut *but, char *output, int output_len_max)
+{
+ PointerRNA *opptr;
+ opptr = UI_but_operator_ptr_get(but);
+
+ char *str;
+ str = WM_operator_pystring_ex(C, NULL, false, true, but->optype, opptr);
+ BLI_strncpy(output, str, output_len_max);
+ MEM_freeN(str);
+}
+
+static void ui_but_copy_menu(uiBut *but, char *output, int output_len_max)
+{
+ MenuType *mt = UI_but_menutype_get(but);
+ if (mt) {
+ BLI_snprintf(output, output_len_max, "bpy.ops.wm.call_menu(name=\"%s\")", mt->idname);
}
- /* menu (any type) */
- else if (ELEM(but->type, UI_BTYPE_MENU, UI_BTYPE_PULLDOWN)) {
- MenuType *mt = UI_but_menutype_get(but);
- if (mt) {
- char str[32 + sizeof(mt->idname)];
- BLI_snprintf(str, sizeof(str), "bpy.ops.wm.call_menu(name=\"%s\")", mt->idname);
- WM_clipboard_text_set(str, 0);
- }
+}
+
+static void ui_but_copy(bContext *C, uiBut *but, const bool copy_array)
+{
+ if (ui_but_contains_password(but)) {
+ return;
}
- if (buf_paste_alloc) {
- MEM_freeN((void *)buf_paste);
+ /* Arbitrary large value (allow for paths: 'PATH_MAX') */
+ char buf[4096] = {0};
+ const int buf_max_len = sizeof(buf);
+
+ /* Left false for copying internal data (color-band for eg). */
+ bool is_buf_set = false;
+
+ bool has_required_data = !(but->poin == NULL && but->rnapoin.data == NULL);
+
+ switch (but->type) {
+ case UI_BTYPE_NUM:
+ case UI_BTYPE_NUM_SLIDER:
+ if (!has_required_data) break;
+ if (copy_array && ui_but_has_array_value(but)) {
+ ui_but_copy_numeric_array(but, buf, buf_max_len);
+ }
+ else {
+ ui_but_copy_numeric_value(but, buf, buf_max_len);
+ }
+ is_buf_set = true;
+ break;
+
+ case UI_BTYPE_UNITVEC:
+ if (!has_required_data) break;
+ ui_but_copy_numeric_array(but, buf, buf_max_len);
+ is_buf_set = true;
+ break;
+
+ case UI_BTYPE_COLOR:
+ if (!has_required_data) break;
+ ui_but_copy_color(but, buf, buf_max_len);
+ is_buf_set = true;
+ break;
+
+ case UI_BTYPE_TEXT:
+ case UI_BTYPE_SEARCH_MENU:
+ if (!has_required_data) break;
+ ui_but_copy_text(but, buf, buf_max_len);
+ is_buf_set = true;
+ break;
+
+ case UI_BTYPE_COLORBAND:
+ ui_but_copy_colorband(but);
+ break;
+
+ case UI_BTYPE_CURVE:
+ ui_but_copy_curvemapping(but);
+ break;
+
+ case UI_BTYPE_BUT:
+ ui_but_copy_operator(C, but, buf, buf_max_len);
+ is_buf_set = true;
+ break;
+
+ case UI_BTYPE_MENU:
+ case UI_BTYPE_PULLDOWN:
+ ui_but_copy_menu(but, buf, buf_max_len);
+ is_buf_set = true;
+ break;
+
+ default:
+ break;
}
- if (show_report) {
- WM_report_banner_show();
+ if (is_buf_set) {
+ WM_clipboard_text_set(buf, 0);
}
}
+static void ui_but_paste(bContext *C, uiBut *but, uiHandleButtonData *data, const bool paste_array)
+{
+ BLI_assert((but->flag & UI_BUT_DISABLED) == 0); /* caller should check */
+
+ int buf_paste_len = 0;
+ char *buf_paste;
+ ui_but_get_pasted_text_from_clipboard(&buf_paste, &buf_paste_len);
+
+ bool has_required_data = !(but->poin == NULL && but->rnapoin.data == NULL);
+
+ switch (but->type) {
+ case UI_BTYPE_NUM:
+ case UI_BTYPE_NUM_SLIDER:
+ if (!has_required_data) break;
+ if (paste_array && ui_but_has_array_value(but)) {
+ ui_but_paste_numeric_array(C, but, data, buf_paste);
+ }
+ else {
+ ui_but_paste_numeric_value(C, but, data, buf_paste);
+ }
+ break;
+
+ case UI_BTYPE_UNITVEC:
+ if (!has_required_data) break;
+ ui_but_paste_normalized_vector(C, but, buf_paste);
+ break;
+
+ case UI_BTYPE_COLOR:
+ if (!has_required_data) break;
+ ui_but_paste_color(C, but, buf_paste);
+ break;
+
+ case UI_BTYPE_TEXT:
+ case UI_BTYPE_SEARCH_MENU:
+ if (!has_required_data) break;
+ ui_but_paste_text(C, but, data, buf_paste);
+ break;
+
+ case UI_BTYPE_COLORBAND:
+ ui_but_paste_colorband(C, but, data);
+ break;
+
+ case UI_BTYPE_CURVE:
+ ui_but_paste_curvemapping(C, but);
+ break;
+
+ default:
+ break;
+ }
+
+ MEM_freeN((void *)buf_paste);
+}
+
/**
* Password Text
* =============
@@ -2314,7 +2441,7 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
* It converts every UTF-8 character to an asterisk, and also remaps
* the cursor position and selection start/end.
*
- * \note: remaping is used, because password could contain UTF-8 characters.
+ * \note: remapping is used, because password could contain UTF-8 characters.
*
*/
@@ -2578,7 +2705,7 @@ static bool ui_textedit_insert_buf(
if ((len + step >= data->maxlen) && (data->maxlen - (len + 1) > 0)) {
if (ui_but_is_utf8(but)) {
- /* shorten 'step' to a utf8 algined size that fits */
+ /* shorten 'step' to a utf8 aligned size that fits */
BLI_strnlen_utf8_ex(buf, data->maxlen - (len + 1), &step);
}
else {
@@ -3658,7 +3785,7 @@ static int ui_do_but_HOTKEYEVT(
if (event->type == LEFTMOUSE && event->val == KM_PRESS) {
/* only cancel if click outside the button */
if (ui_but_contains_point_px(but->active->region, but, event->x, event->y) == 0) {
- /* data->cancel doesnt work, this button opens immediate */
+ /* data->cancel doesn't work, this button opens immediate */
if (but->flag & UI_BUT_IMMEDIATE)
ui_but_value_set(but, 0);
else
@@ -3749,7 +3876,12 @@ static bool ui_but_is_mouse_over_icon_extra(const ARegion *region, uiBut *but, c
static int ui_do_but_TAB(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
{
if (data->state == BUTTON_STATE_HIGHLIGHT) {
- if ((event->type == LEFTMOUSE) &&
+ const int rna_type = but->rnaprop ? RNA_property_type(but->rnaprop) : 0;
+
+ if (but->rnaprop &&
+ ELEM(rna_type, PROP_POINTER, PROP_STRING) &&
+ (but->custom_data != NULL) &&
+ (event->type == LEFTMOUSE) &&
((event->val == KM_DBL_CLICK) || event->ctrl))
{
button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
@@ -4322,7 +4454,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 didnt drag, then edit */
+ /* if we started multibutton but didn't drag, then edit */
if (data->multi_data.init == BUTTON_MULTI_INIT_SETUP) {
click = 1;
}
@@ -4630,7 +4762,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 didnt drag, then edit */
+ /* if we started multibutton but didn't drag, then edit */
if (data->multi_data.init == BUTTON_MULTI_INIT_SETUP) {
click = 1;
}
@@ -6445,8 +6577,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *
data = but->active;
retval = WM_UI_HANDLER_CONTINUE;
- if (but->flag & UI_BUT_DISABLED)
- return WM_UI_HANDLER_CONTINUE;
+ bool is_disabled = but->flag & UI_BUT_DISABLED;
/* if but->pointype is set, but->poin should be too */
BLI_assert(!but->pointype || but->poin);
@@ -6455,23 +6586,38 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *
* keymaps are handled using operators (see #ED_keymap_ui). */
if ((data->state == BUTTON_STATE_HIGHLIGHT) || (event->type == EVT_DROP)) {
- /* handle copy-paste */
- if (ELEM(event->type, CKEY, VKEY) && event->val == KM_PRESS &&
- IS_EVENT_MOD(event, ctrl, oskey) && !event->shift)
- {
- /* Specific handling for listrows, we try to find their overlapping tex button. */
- if (but->type == UI_BTYPE_LISTROW) {
- uiBut *labelbut = ui_but_list_row_text_activate(C, but, data, event, BUTTON_ACTIVATE_OVER);
- if (labelbut) {
- but = labelbut;
- data = but->active;
- }
+
+ /* handle copy and paste */
+ bool is_press_ctrl_but_no_shift = event->val == KM_PRESS && IS_EVENT_MOD(event, ctrl, oskey) && !event->shift;
+ bool do_copy = event->type == CKEY && is_press_ctrl_but_no_shift;
+ bool do_paste = event->type == VKEY && is_press_ctrl_but_no_shift;
+
+ /* Specific handling for listrows, we try to find their overlapping tex button. */
+ if ((do_copy || do_paste) && but->type == UI_BTYPE_LISTROW) {
+ uiBut *labelbut = ui_but_list_row_text_activate(C, but, data, event, BUTTON_ACTIVATE_OVER);
+ if (labelbut) {
+ but = labelbut;
+ data = but->active;
}
- ui_but_copy_paste(C, but, data, (event->type == CKEY) ? 'c' : 'v', event->alt);
+ }
+
+ /* do copy first, because it is the only allowed operator when disabled */
+ if (do_copy) {
+ ui_but_copy(C, but, event->alt);
+ return WM_UI_HANDLER_BREAK;
+ }
+
+ if (is_disabled) {
+ return WM_UI_HANDLER_CONTINUE;
+ }
+
+ if (do_paste) {
+ ui_but_paste(C, but, data, event->alt);
return WM_UI_HANDLER_BREAK;
}
+
/* handle drop */
- else if (event->type == EVT_DROP) {
+ if (event->type == EVT_DROP) {
ui_but_drop(C, event, but, data);
}
/* handle menu */
@@ -6486,6 +6632,10 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *
}
}
+ if (but->flag & UI_BUT_DISABLED) {
+ return WM_UI_HANDLER_CONTINUE;
+ }
+
switch (but->type) {
case UI_BTYPE_BUT:
retval = ui_do_but_BUT(C, but, data, event);
@@ -7039,12 +7189,21 @@ void UI_but_tooltip_timer_remove(bContext *C, uiBut *but)
}
}
-static ARegion *ui_but_tooltip_init(bContext *C, ARegion *ar, bool *r_exit_on_event)
+static ARegion *ui_but_tooltip_init(
+ bContext *C, ARegion *ar,
+ int *pass, double *r_pass_delay, bool *r_exit_on_event)
{
+ bool is_label = false;
+ if (*pass == 1) {
+ is_label = true;
+ (*pass)--;
+ (*r_pass_delay) = UI_TOOLTIP_DELAY - UI_TOOLTIP_DELAY_LABEL;
+ }
+
uiBut *but = UI_region_active_but_get(ar);
*r_exit_on_event = false;
if (but) {
- return UI_tooltip_create_from_button(C, ar, but);
+ return UI_tooltip_create_from_button(C, ar, but, is_label);
}
return NULL;
}
@@ -7059,7 +7218,15 @@ static void button_tooltip_timer_reset(bContext *C, uiBut *but)
if ((U.flag & USER_TOOLTIPS) || (data->tooltip_force)) {
if (!but->block->tooltipdisabled) {
if (!wm->drags.first) {
- WM_tooltip_timer_init(C, data->window, data->region, ui_but_tooltip_init);
+ bool is_label = UI_but_has_tooltip_label(but);
+ double delay = is_label ? UI_TOOLTIP_DELAY_LABEL : UI_TOOLTIP_DELAY;
+ WM_tooltip_timer_init_ex(C, data->window, data->region, ui_but_tooltip_init, delay);
+ if (is_label) {
+ bScreen *sc = WM_window_get_active_screen(data->window);
+ if (sc->tool_tip) {
+ sc->tool_tip->pass = 1;
+ }
+ }
}
}
}
@@ -7243,6 +7410,7 @@ static void button_activate_init(bContext *C, ARegion *ar, uiBut *but, uiButtonA
/* activate button */
but->flag |= UI_ACTIVE;
+
but->active = data;
/* we disable auto_open in the block after a threshold, because we still
@@ -7293,6 +7461,19 @@ static void button_activate_init(bContext *C, ARegion *ar, uiBut *but, uiButtonA
else if (but->type == UI_BTYPE_NUM) {
ui_numedit_set_active(but);
}
+
+ if (UI_but_has_tooltip_label(but)) {
+ /* Show a label for this button. */
+ bScreen *sc = WM_window_get_active_screen(data->window);
+ if ((PIL_check_seconds_timer() - WM_tooltip_time_closed()) < 0.1) {
+ WM_tooltip_immediate_init(
+ C, CTX_wm_window(C), ar,
+ ui_but_tooltip_init);
+ if (sc->tool_tip) {
+ sc->tool_tip->pass = 1;
+ }
+ }
+ }
}
static void button_activate_exit(
@@ -7876,7 +8057,7 @@ static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but)
case MOUSEMOVE:
{
/* deselect the button when moving the mouse away */
- /* also de-activate for buttons that only show higlights */
+ /* also de-activate for buttons that only show highlights */
if (ui_but_contains_point_px(ar, but, event->x, event->y)) {
/* Drag on a hold button (used in the toolbar) now opens it immediately. */
@@ -8199,7 +8380,7 @@ static void ui_handle_button_return_submenu(bContext *C, const wmEvent *event, u
/* ************************* menu handling *******************************/
/**
- * Function used to prevent loosing the open menu when using nested pulldowns,
+ * Function used to prevent losing the open menu when using nested pulldowns,
* when moving mouse towards the pulldown menu over other buttons that could
* steal the highlight from the current button, only checks:
*
@@ -8422,7 +8603,7 @@ static int ui_menu_scroll(ARegion *ar, uiBlock *block, int my, uiBut *to_bt)
* let the parent menu get the event.
*
* This allows a menu to be open,
- * but send key events to the parent if theres no active buttons.
+ * but send key events to the parent if there's no active buttons.
*
* Without this keyboard navigation from menu's wont work.
*/
@@ -8563,7 +8744,7 @@ static int ui_handle_menu_event(
if (but && button_modal_state(but->active->state)) {
if (block->flag & (UI_BLOCK_MOVEMOUSE_QUIT | UI_BLOCK_POPOVER)) {
/* if a button is activated modal, always reset the start mouse
- * position of the towards mechanism to avoid loosing focus,
+ * position of the towards mechanism to avoid losing focus,
* and don't handle events */
ui_mouse_motion_towards_reinit(menu, &event->x);
}
diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c
index 8816d6acec8..69f42fbfc07 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -58,6 +58,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_paint.h"
#include "BKE_icons.h"
#include "BKE_appdir.h"
#include "BKE_studiolight.h"
@@ -104,13 +105,14 @@ typedef struct IconImage {
typedef void (*VectorDrawFunc)(int x, int y, int w, int h, float alpha);
#define ICON_TYPE_PREVIEW 0
-#define ICON_TYPE_TEXTURE 1
+#define ICON_TYPE_COLOR_TEXTURE 1
#define ICON_TYPE_MONO_TEXTURE 2
#define ICON_TYPE_BUFFER 3
#define ICON_TYPE_VECTOR 4
#define ICON_TYPE_GEOM 5
#define ICON_TYPE_EVENT 6 /* draw keymap entries using custom renderer. */
#define ICON_TYPE_GPLAYER 7
+#define ICON_TYPE_BLANK 8
typedef struct DrawInfo {
int type;
@@ -128,6 +130,7 @@ typedef struct DrawInfo {
} buffer;
struct {
int x, y, w, h;
+ int theme_color;
} texture;
struct {
/* Can be packed into a single int. */
@@ -148,17 +151,35 @@ typedef struct IconTexture {
float invh;
} IconTexture;
+typedef struct IconType {
+ int type;
+ int theme_color;
+} IconType;
+
/* ******************* STATIC LOCAL VARS ******************* */
/* static here to cache results of icon directory scan, so it's not
* scanning the filesystem each time the menu is drawn */
static struct ListBase iconfilelist = {NULL, NULL};
static IconTexture icongltex = {0, 0, 0, 0.0f, 0.0f};
-/* **************************************************** */
-
#ifndef WITH_HEADLESS
-static DrawInfo *def_internal_icon(ImBuf *bbuf, int icon_id, int xofs, int yofs, int size, int type)
+static const IconType icontypes[] = {
+#define DEF_ICON(name) {ICON_TYPE_MONO_TEXTURE, 0},
+#define DEF_ICON_COLLECTION(name) {ICON_TYPE_MONO_TEXTURE, TH_ICON_COLLECTION},
+#define DEF_ICON_OBJECT(name) {ICON_TYPE_MONO_TEXTURE, TH_ICON_OBJECT},
+#define DEF_ICON_OBJECT_DATA(name) {ICON_TYPE_MONO_TEXTURE, TH_ICON_OBJECT_DATA},
+#define DEF_ICON_MODIFIER(name) {ICON_TYPE_MONO_TEXTURE, TH_ICON_MODIFIER},
+#define DEF_ICON_SHADING(name) {ICON_TYPE_MONO_TEXTURE, TH_ICON_SHADING},
+#define DEF_ICON_VECTOR(name) {ICON_TYPE_VECTOR, 0},
+#define DEF_ICON_COLOR(name) {ICON_TYPE_COLOR_TEXTURE, 0},
+#define DEF_ICON_BLANK(name) {ICON_TYPE_BLANK, 0},
+#include "UI_icons.h"
+};
+
+/* **************************************************** */
+
+static DrawInfo *def_internal_icon(ImBuf *bbuf, int icon_id, int xofs, int yofs, int size, int type, int theme_color)
{
Icon *new_icon = NULL;
IconImage *iimg = NULL;
@@ -172,7 +193,8 @@ static DrawInfo *def_internal_icon(ImBuf *bbuf, int icon_id, int xofs, int yofs,
di = MEM_callocN(sizeof(DrawInfo), "drawinfo");
di->type = type;
- if (ELEM(type, ICON_TYPE_TEXTURE, ICON_TYPE_MONO_TEXTURE)) {
+ if (ELEM(type, ICON_TYPE_COLOR_TEXTURE, ICON_TYPE_MONO_TEXTURE)) {
+ di->data.texture.theme_color = theme_color;
di->data.texture.x = xofs;
di->data.texture.y = yofs;
di->data.texture.w = size;
@@ -265,7 +287,7 @@ static void vicon_small_tri_right_draw(int x, int y, int w, int UNUSED(h), float
immUnbindProgram();
}
-static void vicon_keytype_draw_wrapper(int x, int y, int w, int h, float alpha, short key_type)
+static void vicon_keytype_draw_wrapper(int x, int y, int w, int h, float alpha, short key_type, short handle_type)
{
/* init dummy theme state for Action Editor - where these colors are defined
* (since we're doing this offscreen, free from any particular space_id)
@@ -279,25 +301,30 @@ static void vicon_keytype_draw_wrapper(int x, int y, int w, int h, float alpha,
* while the draw_keyframe_shape() function needs the midpoint for
* the keyframe
*/
- int xco = x + w / 2;
- int yco = y + h / 2;
+ float xco = x + w / 2 + 0.5f;
+ float yco = y + h / 2 + 0.5f;
GPUVertFormat *format = immVertexFormat();
uint pos_id = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
uint size_id = GPU_vertformat_attr_add(format, "size", GPU_COMP_F32, 1, GPU_FETCH_FLOAT);
uint color_id = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
uint outline_color_id = GPU_vertformat_attr_add(format, "outlineColor", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
+ uint flags_id = GPU_vertformat_attr_add(format, "flags", GPU_COMP_U32, 1, GPU_FETCH_INT);
immBindBuiltinProgram(GPU_SHADER_KEYFRAME_DIAMOND);
GPU_enable_program_point_size();
+ immUniform2f("ViewportSize", -1.0f, -1.0f);
immBegin(GPU_PRIM_POINTS, 1);
/* draw keyframe
- * - size: 0.6 * h (found out experimentally... dunno why!)
- * - sel: true (so that "keyframe" state shows the iconic yellow icon)
+ * - size: (default icon size == 16, default dopesheet icon size == 10)
+ * - sel: true unless in handletype icons (so that "keyframe" state shows the iconic yellow icon)
*/
- draw_keyframe_shape(xco, yco, 0.6f * h, true, key_type, KEYFRAME_SHAPE_BOTH, alpha,
- pos_id, size_id, color_id, outline_color_id);
+ bool sel = (handle_type == KEYFRAME_HANDLE_NONE);
+
+ draw_keyframe_shape(xco, yco, (10.0f / 16.0f) * h, sel, key_type, KEYFRAME_SHAPE_BOTH, alpha,
+ pos_id, size_id, color_id, outline_color_id,
+ flags_id, handle_type, KEYFRAME_EXTREME_NONE);
immEnd();
GPU_disable_program_point_size();
@@ -308,27 +335,52 @@ static void vicon_keytype_draw_wrapper(int x, int y, int w, int h, float alpha,
static void vicon_keytype_keyframe_draw(int x, int y, int w, int h, float alpha)
{
- vicon_keytype_draw_wrapper(x, y, w, h, alpha, BEZT_KEYTYPE_KEYFRAME);
+ vicon_keytype_draw_wrapper(x, y, w, h, alpha, BEZT_KEYTYPE_KEYFRAME, KEYFRAME_HANDLE_NONE);
}
static void vicon_keytype_breakdown_draw(int x, int y, int w, int h, float alpha)
{
- vicon_keytype_draw_wrapper(x, y, w, h, alpha, BEZT_KEYTYPE_BREAKDOWN);
+ vicon_keytype_draw_wrapper(x, y, w, h, alpha, BEZT_KEYTYPE_BREAKDOWN, KEYFRAME_HANDLE_NONE);
}
static void vicon_keytype_extreme_draw(int x, int y, int w, int h, float alpha)
{
- vicon_keytype_draw_wrapper(x, y, w, h, alpha, BEZT_KEYTYPE_EXTREME);
+ vicon_keytype_draw_wrapper(x, y, w, h, alpha, BEZT_KEYTYPE_EXTREME, KEYFRAME_HANDLE_NONE);
}
static void vicon_keytype_jitter_draw(int x, int y, int w, int h, float alpha)
{
- vicon_keytype_draw_wrapper(x, y, w, h, alpha, BEZT_KEYTYPE_JITTER);
+ vicon_keytype_draw_wrapper(x, y, w, h, alpha, BEZT_KEYTYPE_JITTER, KEYFRAME_HANDLE_NONE);
}
static void vicon_keytype_moving_hold_draw(int x, int y, int w, int h, float alpha)
{
- vicon_keytype_draw_wrapper(x, y, w, h, alpha, BEZT_KEYTYPE_MOVEHOLD);
+ vicon_keytype_draw_wrapper(x, y, w, h, alpha, BEZT_KEYTYPE_MOVEHOLD, KEYFRAME_HANDLE_NONE);
+}
+
+static void vicon_handletype_free_draw(int x, int y, int w, int h, float alpha)
+{
+ vicon_keytype_draw_wrapper(x, y, w, h, alpha, BEZT_KEYTYPE_KEYFRAME, KEYFRAME_HANDLE_FREE);
+}
+
+static void vicon_handletype_aligned_draw(int x, int y, int w, int h, float alpha)
+{
+ vicon_keytype_draw_wrapper(x, y, w, h, alpha, BEZT_KEYTYPE_KEYFRAME, KEYFRAME_HANDLE_ALIGNED);
+}
+
+static void vicon_handletype_vector_draw(int x, int y, int w, int h, float alpha)
+{
+ vicon_keytype_draw_wrapper(x, y, w, h, alpha, BEZT_KEYTYPE_KEYFRAME, KEYFRAME_HANDLE_VECTOR);
+}
+
+static void vicon_handletype_auto_draw(int x, int y, int w, int h, float alpha)
+{
+ vicon_keytype_draw_wrapper(x, y, w, h, alpha, BEZT_KEYTYPE_KEYFRAME, KEYFRAME_HANDLE_AUTO);
+}
+
+static void vicon_handletype_auto_clamp_draw(int x, int y, int w, int h, float alpha)
+{
+ vicon_keytype_draw_wrapper(x, y, w, h, alpha, BEZT_KEYTYPE_KEYFRAME, KEYFRAME_HANDLE_AUTO_CLAMP);
}
static void vicon_colorset_draw(int index, int x, int y, int w, int h, float UNUSED(alpha))
@@ -364,34 +416,34 @@ static void vicon_colorset_draw(int index, int x, int y, int w, int h, float UNU
immUnbindProgram();
}
-#define DEF_VICON_COLORSET_DRAW_NTH(prefix, index) \
+#define DEF_ICON_VECTOR_COLORSET_DRAW_NTH(prefix, index) \
static void vicon_colorset_draw_##prefix(int x, int y, int w, int h, float alpha) \
{ \
vicon_colorset_draw(index, x, y, w, h, alpha); \
}
-DEF_VICON_COLORSET_DRAW_NTH(01, 0)
-DEF_VICON_COLORSET_DRAW_NTH(02, 1)
-DEF_VICON_COLORSET_DRAW_NTH(03, 2)
-DEF_VICON_COLORSET_DRAW_NTH(04, 3)
-DEF_VICON_COLORSET_DRAW_NTH(05, 4)
-DEF_VICON_COLORSET_DRAW_NTH(06, 5)
-DEF_VICON_COLORSET_DRAW_NTH(07, 6)
-DEF_VICON_COLORSET_DRAW_NTH(08, 7)
-DEF_VICON_COLORSET_DRAW_NTH(09, 8)
-DEF_VICON_COLORSET_DRAW_NTH(10, 9)
-DEF_VICON_COLORSET_DRAW_NTH(11, 10)
-DEF_VICON_COLORSET_DRAW_NTH(12, 11)
-DEF_VICON_COLORSET_DRAW_NTH(13, 12)
-DEF_VICON_COLORSET_DRAW_NTH(14, 13)
-DEF_VICON_COLORSET_DRAW_NTH(15, 14)
-DEF_VICON_COLORSET_DRAW_NTH(16, 15)
-DEF_VICON_COLORSET_DRAW_NTH(17, 16)
-DEF_VICON_COLORSET_DRAW_NTH(18, 17)
-DEF_VICON_COLORSET_DRAW_NTH(19, 18)
-DEF_VICON_COLORSET_DRAW_NTH(20, 19)
-
-#undef DEF_VICON_COLORSET_DRAW_NTH
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(01, 0)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(02, 1)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(03, 2)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(04, 3)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(05, 4)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(06, 5)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(07, 6)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(08, 7)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(09, 8)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(10, 9)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(11, 10)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(12, 11)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(13, 12)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(14, 13)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(15, 14)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(16, 15)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(17, 16)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(18, 17)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(19, 18)
+DEF_ICON_VECTOR_COLORSET_DRAW_NTH(20, 19)
+
+#undef DEF_ICON_VECTOR_COLORSET_DRAW_NTH
/* Dynamically render icon instead of rendering a plain color to a texture/buffer
* This is mot strictly a "vicon", as it needs access to icon->obj to get the color info,
@@ -426,7 +478,7 @@ static void init_brush_icons(void)
int size = datatoc_ ##name## _png_size; \
DrawInfo *di; \
\
- di = def_internal_icon(NULL, icon_id, 0, 0, w, ICON_TYPE_BUFFER); \
+ di = def_internal_icon(NULL, icon_id, 0, 0, w, ICON_TYPE_BUFFER, 0); \
di->data.buffer.image->datatoc_rect = rect; \
di->data.buffer.image->datatoc_size = size; \
}
@@ -434,24 +486,20 @@ static void init_brush_icons(void)
const int w = 96; /* warning, brush size hardcoded in C, but it gets scaled */
- INIT_BRUSH_ICON(ICON_BRUSH_ADD, add);
INIT_BRUSH_ICON(ICON_BRUSH_BLOB, blob);
INIT_BRUSH_ICON(ICON_BRUSH_BLUR, blur);
INIT_BRUSH_ICON(ICON_BRUSH_CLAY, clay);
INIT_BRUSH_ICON(ICON_BRUSH_CLAY_STRIPS, claystrips);
INIT_BRUSH_ICON(ICON_BRUSH_CLONE, clone);
INIT_BRUSH_ICON(ICON_BRUSH_CREASE, crease);
- INIT_BRUSH_ICON(ICON_BRUSH_DARKEN, darken);
INIT_BRUSH_ICON(ICON_BRUSH_SCULPT_DRAW, draw);
INIT_BRUSH_ICON(ICON_BRUSH_FILL, fill);
INIT_BRUSH_ICON(ICON_BRUSH_FLATTEN, flatten);
INIT_BRUSH_ICON(ICON_BRUSH_GRAB, grab);
INIT_BRUSH_ICON(ICON_BRUSH_INFLATE, inflate);
INIT_BRUSH_ICON(ICON_BRUSH_LAYER, layer);
- INIT_BRUSH_ICON(ICON_BRUSH_LIGHTEN, lighten);
INIT_BRUSH_ICON(ICON_BRUSH_MASK, mask);
INIT_BRUSH_ICON(ICON_BRUSH_MIX, mix);
- INIT_BRUSH_ICON(ICON_BRUSH_MULTIPLY, multiply);
INIT_BRUSH_ICON(ICON_BRUSH_NUDGE, nudge);
INIT_BRUSH_ICON(ICON_BRUSH_PINCH, pinch);
INIT_BRUSH_ICON(ICON_BRUSH_SCRAPE, scrape);
@@ -459,13 +507,11 @@ static void init_brush_icons(void)
INIT_BRUSH_ICON(ICON_BRUSH_SMOOTH, smooth);
INIT_BRUSH_ICON(ICON_BRUSH_SNAKE_HOOK, snake_hook);
INIT_BRUSH_ICON(ICON_BRUSH_SOFTEN, soften);
- INIT_BRUSH_ICON(ICON_BRUSH_SUBTRACT, subtract);
INIT_BRUSH_ICON(ICON_BRUSH_TEXDRAW, texdraw);
INIT_BRUSH_ICON(ICON_BRUSH_TEXFILL, texfill);
INIT_BRUSH_ICON(ICON_BRUSH_TEXMASK, texmask);
INIT_BRUSH_ICON(ICON_BRUSH_THUMB, thumb);
INIT_BRUSH_ICON(ICON_BRUSH_ROTATE, twist);
- INIT_BRUSH_ICON(ICON_BRUSH_VERTEXDRAW, vertexdraw);
/* grease pencil sculpt */
INIT_BRUSH_ICON(ICON_GPBRUSH_SMOOTH, gp_brush_smooth);
@@ -567,7 +613,7 @@ static void init_event_icons(void)
#define INIT_EVENT_ICON(icon_id, type, value) \
{ \
- DrawInfo *di = def_internal_icon(NULL, icon_id, 0, 0, w, ICON_TYPE_EVENT); \
+ DrawInfo *di = def_internal_icon(NULL, icon_id, 0, 0, w, ICON_TYPE_EVENT, 0); \
di->data.input.event_type = type; \
di->data.input.event_value = value; \
di->data.input.icon = icon_id; \
@@ -727,44 +773,54 @@ static void init_internal_icons(void)
/* Define icons. */
for (y = 0; y < ICON_GRID_ROWS; y++) {
/* Row W has monochrome icons. */
- int icontype = (y == 8) ? ICON_TYPE_MONO_TEXTURE : ICON_TYPE_TEXTURE;
for (x = 0; x < ICON_GRID_COLS; x++) {
+ IconType icontype = icontypes[y * ICON_GRID_COLS + x];
+ if (!ELEM(icontype.type, ICON_TYPE_COLOR_TEXTURE, ICON_TYPE_MONO_TEXTURE)) {
+ continue;
+ }
+
def_internal_icon(b32buf, BIFICONID_FIRST + y * ICON_GRID_COLS + x,
x * (ICON_GRID_W + ICON_GRID_MARGIN) + ICON_GRID_MARGIN,
y * (ICON_GRID_H + ICON_GRID_MARGIN) + ICON_GRID_MARGIN, ICON_GRID_W,
- icontype);
+ icontype.type, icontype.theme_color);
}
}
}
- def_internal_vicon(VICO_SMALL_TRI_RIGHT_VEC, vicon_small_tri_right_draw);
-
- def_internal_vicon(VICO_KEYTYPE_KEYFRAME_VEC, vicon_keytype_keyframe_draw);
- def_internal_vicon(VICO_KEYTYPE_BREAKDOWN_VEC, vicon_keytype_breakdown_draw);
- def_internal_vicon(VICO_KEYTYPE_EXTREME_VEC, vicon_keytype_extreme_draw);
- def_internal_vicon(VICO_KEYTYPE_JITTER_VEC, vicon_keytype_jitter_draw);
- def_internal_vicon(VICO_KEYTYPE_MOVING_HOLD_VEC, vicon_keytype_moving_hold_draw);
-
- def_internal_vicon(VICO_COLORSET_01_VEC, vicon_colorset_draw_01);
- def_internal_vicon(VICO_COLORSET_02_VEC, vicon_colorset_draw_02);
- def_internal_vicon(VICO_COLORSET_03_VEC, vicon_colorset_draw_03);
- def_internal_vicon(VICO_COLORSET_04_VEC, vicon_colorset_draw_04);
- def_internal_vicon(VICO_COLORSET_05_VEC, vicon_colorset_draw_05);
- def_internal_vicon(VICO_COLORSET_06_VEC, vicon_colorset_draw_06);
- def_internal_vicon(VICO_COLORSET_07_VEC, vicon_colorset_draw_07);
- def_internal_vicon(VICO_COLORSET_08_VEC, vicon_colorset_draw_08);
- def_internal_vicon(VICO_COLORSET_09_VEC, vicon_colorset_draw_09);
- def_internal_vicon(VICO_COLORSET_10_VEC, vicon_colorset_draw_10);
- def_internal_vicon(VICO_COLORSET_11_VEC, vicon_colorset_draw_11);
- def_internal_vicon(VICO_COLORSET_12_VEC, vicon_colorset_draw_12);
- def_internal_vicon(VICO_COLORSET_13_VEC, vicon_colorset_draw_13);
- def_internal_vicon(VICO_COLORSET_14_VEC, vicon_colorset_draw_14);
- def_internal_vicon(VICO_COLORSET_15_VEC, vicon_colorset_draw_15);
- def_internal_vicon(VICO_COLORSET_16_VEC, vicon_colorset_draw_16);
- def_internal_vicon(VICO_COLORSET_17_VEC, vicon_colorset_draw_17);
- def_internal_vicon(VICO_COLORSET_18_VEC, vicon_colorset_draw_18);
- def_internal_vicon(VICO_COLORSET_19_VEC, vicon_colorset_draw_19);
- def_internal_vicon(VICO_COLORSET_20_VEC, vicon_colorset_draw_20);
+ def_internal_vicon(ICON_SMALL_TRI_RIGHT_VEC, vicon_small_tri_right_draw);
+
+ def_internal_vicon(ICON_KEYTYPE_KEYFRAME_VEC, vicon_keytype_keyframe_draw);
+ def_internal_vicon(ICON_KEYTYPE_BREAKDOWN_VEC, vicon_keytype_breakdown_draw);
+ def_internal_vicon(ICON_KEYTYPE_EXTREME_VEC, vicon_keytype_extreme_draw);
+ def_internal_vicon(ICON_KEYTYPE_JITTER_VEC, vicon_keytype_jitter_draw);
+ def_internal_vicon(ICON_KEYTYPE_MOVING_HOLD_VEC, vicon_keytype_moving_hold_draw);
+
+ def_internal_vicon(ICON_HANDLETYPE_FREE_VEC, vicon_handletype_free_draw);
+ def_internal_vicon(ICON_HANDLETYPE_ALIGNED_VEC, vicon_handletype_aligned_draw);
+ def_internal_vicon(ICON_HANDLETYPE_VECTOR_VEC, vicon_handletype_vector_draw);
+ def_internal_vicon(ICON_HANDLETYPE_AUTO_VEC, vicon_handletype_auto_draw);
+ def_internal_vicon(ICON_HANDLETYPE_AUTO_CLAMP_VEC, vicon_handletype_auto_clamp_draw);
+
+ def_internal_vicon(ICON_COLORSET_01_VEC, vicon_colorset_draw_01);
+ def_internal_vicon(ICON_COLORSET_02_VEC, vicon_colorset_draw_02);
+ def_internal_vicon(ICON_COLORSET_03_VEC, vicon_colorset_draw_03);
+ def_internal_vicon(ICON_COLORSET_04_VEC, vicon_colorset_draw_04);
+ def_internal_vicon(ICON_COLORSET_05_VEC, vicon_colorset_draw_05);
+ def_internal_vicon(ICON_COLORSET_06_VEC, vicon_colorset_draw_06);
+ def_internal_vicon(ICON_COLORSET_07_VEC, vicon_colorset_draw_07);
+ def_internal_vicon(ICON_COLORSET_08_VEC, vicon_colorset_draw_08);
+ def_internal_vicon(ICON_COLORSET_09_VEC, vicon_colorset_draw_09);
+ def_internal_vicon(ICON_COLORSET_10_VEC, vicon_colorset_draw_10);
+ def_internal_vicon(ICON_COLORSET_11_VEC, vicon_colorset_draw_11);
+ def_internal_vicon(ICON_COLORSET_12_VEC, vicon_colorset_draw_12);
+ def_internal_vicon(ICON_COLORSET_13_VEC, vicon_colorset_draw_13);
+ def_internal_vicon(ICON_COLORSET_14_VEC, vicon_colorset_draw_14);
+ def_internal_vicon(ICON_COLORSET_15_VEC, vicon_colorset_draw_15);
+ def_internal_vicon(ICON_COLORSET_16_VEC, vicon_colorset_draw_16);
+ def_internal_vicon(ICON_COLORSET_17_VEC, vicon_colorset_draw_17);
+ def_internal_vicon(ICON_COLORSET_18_VEC, vicon_colorset_draw_18);
+ def_internal_vicon(ICON_COLORSET_19_VEC, vicon_colorset_draw_19);
+ def_internal_vicon(ICON_COLORSET_20_VEC, vicon_colorset_draw_20);
IMB_freeImBuf(b16buf);
IMB_freeImBuf(b32buf);
@@ -1051,6 +1107,10 @@ static void ui_studiolight_free_function(StudioLight *sl, void *data)
{
wmWindowManager *wm = data;
+ /* Happens if job was canceled or already finished. */
+ if (wm == NULL)
+ return;
+
// get icons_id, get icons and kill wm jobs
if (sl->icon_id_radiance) {
ui_studiolight_kill_icon_preview_job(wm, sl->icon_id_radiance);
@@ -1066,6 +1126,14 @@ static void ui_studiolight_free_function(StudioLight *sl, void *data)
}
}
+static void ui_studiolight_icon_job_end(void *customdata)
+{
+ Icon **tmp = (Icon **)customdata;
+ Icon *icon = *tmp;
+ StudioLight *sl = icon->obj;
+ BKE_studiolight_set_free_function(sl, &ui_studiolight_free_function, NULL);
+}
+
void ui_icon_ensure_deferred(const bContext *C, const int icon_id, const bool big)
{
Icon *icon = BKE_icon_get(icon_id);
@@ -1113,7 +1181,7 @@ void ui_icon_ensure_deferred(const bContext *C, const int icon_id, const bool bi
*tmp = icon;
WM_jobs_customdata_set(wm_job, tmp, MEM_freeN);
WM_jobs_timer(wm_job, 0.01, 0, NC_WINDOW);
- WM_jobs_callbacks(wm_job, ui_studiolight_icon_job_exec, NULL, NULL, NULL);
+ WM_jobs_callbacks(wm_job, ui_studiolight_icon_job_exec, NULL, NULL, ui_studiolight_icon_job_end);
WM_jobs_start(CTX_wm_manager(C), wm_job);
}
}
@@ -1295,7 +1363,6 @@ static void icon_draw_cache_flush_ex(void)
return;
/* We need to flush widget base first to ensure correct ordering. */
- GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
UI_widgetbase_draw_cache_flush();
GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
@@ -1317,6 +1384,8 @@ static void icon_draw_cache_flush_ex(void)
glBindTexture(GL_TEXTURE_2D, 0);
g_icon_draw_cache.calls = 0;
+
+ GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
}
void UI_icon_draw_cache_end(void)
@@ -1329,10 +1398,7 @@ void UI_icon_draw_cache_end(void)
return;
GPU_blend(true);
-
icon_draw_cache_flush_ex();
-
- GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
GPU_blend(false);
}
@@ -1376,9 +1442,10 @@ static void icon_draw_texture(
}
/* We need to flush widget base first to ensure correct ordering. */
- GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
UI_widgetbase_draw_cache_flush();
+ GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
+
float x1, x2, y1, y2;
x1 = ix * icongltex.invw;
@@ -1402,6 +1469,8 @@ static void icon_draw_texture(
GPU_draw_primitive(GPU_PRIM_TRI_STRIP, 4);
glBindTexture(GL_TEXTURE_2D, 0);
+
+ GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
}
/* Drawing size for preview images */
@@ -1421,7 +1490,7 @@ static int get_draw_size(enum eIconSizes size)
static void icon_draw_size(
float x, float y, int icon_id, float aspect, float alpha, const float rgb[3],
- enum eIconSizes size, int draw_size, const float desaturate)
+ enum eIconSizes size, int draw_size, const float desaturate, const char mono_rgba[4])
{
bTheme *btheme = UI_GetTheme();
Icon *icon = NULL;
@@ -1487,26 +1556,31 @@ static void icon_draw_size(
const short event_value = di->data.input.event_value;
icon_draw_rect_input(x, y, w, h, alpha, event_type, event_value);
}
- else if (di->type == ICON_TYPE_TEXTURE) {
+ else if (di->type == ICON_TYPE_COLOR_TEXTURE) {
/* texture image use premul alpha for correct scaling */
- GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
icon_draw_texture(x, y, (float)w, (float)h, di->data.texture.x, di->data.texture.y,
di->data.texture.w, di->data.texture.h, alpha, rgb);
- GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
}
else if (di->type == ICON_TYPE_MONO_TEXTURE) {
/* icon that matches text color, assumed to be white */
- float text_color[4];
- UI_GetThemeColor4fv(TH_TEXT, text_color);
+ float color[4];
+ if (!UI_GetIconThemeColor4fv(di->data.texture.theme_color, color)) {
+ if (mono_rgba) {
+ rgba_uchar_to_float(color, (const uchar *)mono_rgba);
+ }
+ else {
+ UI_GetThemeColor4fv(TH_TEXT, color);
+ }
+ }
+
if (rgb) {
- mul_v3_v3(text_color, rgb);
+ mul_v3_v3(color, rgb);
}
- text_color[3] *= alpha;
- GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
+ mul_v4_fl(color, alpha);
+
icon_draw_texture(x, y, (float)w, (float)h, di->data.texture.x, di->data.texture.y,
- di->data.texture.w, di->data.texture.h, text_color[3], text_color);
- GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
+ di->data.texture.w, di->data.texture.h, color[3], color);
}
else if (di->type == ICON_TYPE_BUFFER) {
@@ -1542,7 +1616,9 @@ static void icon_draw_size(
UI_widgetbase_draw_cache_flush();
/* Just draw a colored rect - Like for vicon_colorset_draw() */
+#ifndef WITH_HEADLESS
vicon_gplayer_color_draw(icon, (int)x, (int)y, w, h);
+#endif
}
}
@@ -1600,7 +1676,7 @@ static int ui_id_brush_get_icon(const bContext *C, ID *id)
WorkSpace *workspace = CTX_wm_workspace(C);
Object *ob = CTX_data_active_object(C);
const EnumPropertyItem *items = NULL;
- int tool = PAINT_TOOL_DRAW, mode = 0;
+ ePaintMode paint_mode = ePaintInvalid;
ScrArea *sa = CTX_wm_area(C);
char space_type = sa->spacetype;
/* When in an unsupported space. */
@@ -1613,12 +1689,18 @@ static int ui_id_brush_get_icon(const bContext *C, ID *id)
* checking various context stuff here */
if ((space_type == SPACE_VIEW3D) && ob) {
- if (ob->mode & OB_MODE_SCULPT)
- mode = OB_MODE_SCULPT;
- else if (ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT))
- mode = OB_MODE_VERTEX_PAINT;
- else if (ob->mode & OB_MODE_TEXTURE_PAINT)
- mode = OB_MODE_TEXTURE_PAINT;
+ if (ob->mode & OB_MODE_SCULPT) {
+ paint_mode = ePaintSculpt;
+ }
+ else if (ob->mode & OB_MODE_VERTEX_PAINT) {
+ paint_mode = ePaintVertex;
+ }
+ else if (ob->mode & OB_MODE_WEIGHT_PAINT) {
+ paint_mode = ePaintWeight;
+ }
+ else if (ob->mode & OB_MODE_TEXTURE_PAINT) {
+ paint_mode = ePaintTexture3D;
+ }
}
else if (space_type == SPACE_IMAGE) {
int sima_mode;
@@ -1631,12 +1713,15 @@ static int ui_id_brush_get_icon(const bContext *C, ID *id)
}
if (sima_mode == SI_MODE_PAINT) {
- mode = OB_MODE_TEXTURE_PAINT;
+ paint_mode = ePaintTexture2D;
}
}
/* reset the icon */
- if (ob != NULL && ob->mode & OB_MODE_GPENCIL_PAINT) {
+ if ((ob != NULL) &&
+ (ob->mode & OB_MODE_GPENCIL_PAINT) &&
+ (br->gpencil_settings != NULL))
+ {
switch (br->gpencil_settings->icon_id) {
case GP_BRUSH_ICON_PENCIL:
br->id.icon_id = ICON_GPBRUSH_PENCIL;
@@ -1674,21 +1759,17 @@ static int ui_id_brush_get_icon(const bContext *C, ID *id)
}
return id->icon_id;
}
- else if (mode == OB_MODE_SCULPT) {
- items = rna_enum_brush_sculpt_tool_items;
- tool = br->sculpt_tool;
- }
- else if (mode == OB_MODE_VERTEX_PAINT) {
- items = rna_enum_brush_vertex_tool_items;
- tool = br->vertexpaint_tool;
- }
- else if (mode == OB_MODE_TEXTURE_PAINT) {
- items = rna_enum_brush_image_tool_items;
- tool = br->imagepaint_tool;
+ else if (paint_mode != ePaintInvalid) {
+ items = BKE_paint_get_tool_enum_from_paintmode(paint_mode);
+ const uint tool_offset = BKE_paint_get_brush_tool_offset_from_paintmode(paint_mode);
+ const int tool_type = *(char *)POINTER_OFFSET(br, tool_offset);
+ if (!items || !RNA_enum_icon_from_value(items, tool_type, &id->icon_id)) {
+ id->icon_id = 0;
+ }
}
-
- if (!items || !RNA_enum_icon_from_value(items, tool, &id->icon_id))
+ else {
id->icon_id = 0;
+ }
}
return id->icon_id;
@@ -1752,7 +1833,7 @@ int UI_rnaptr_icon_get(bContext *C, PointerRNA *ptr, int rnaicon, const bool big
DynamicPaintSurface *surface = ptr->data;
if (surface->format == MOD_DPAINT_SURFACE_F_PTEX)
- return ICON_TEXTURE_SHADED;
+ return ICON_SHADING_TEXTURE;
else if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX)
return ICON_OUTLINER_DATA_MESH;
else if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ)
@@ -1851,55 +1932,55 @@ int UI_idcode_icon_get(const int idcode)
static void icon_draw_at_size(
float x, float y, int icon_id, float aspect, float alpha,
- enum eIconSizes size, const float desaturate)
+ enum eIconSizes size, const float desaturate, const char mono_color[4])
{
int draw_size = get_draw_size(size);
- icon_draw_size(x, y, icon_id, aspect, alpha, NULL, size, draw_size, desaturate);
+ icon_draw_size(x, y, icon_id, aspect, alpha, NULL, size, draw_size, desaturate, mono_color);
}
-void UI_icon_draw_aspect(float x, float y, int icon_id, float aspect, float alpha)
+void UI_icon_draw_aspect(float x, float y, int icon_id, float aspect, float alpha, const char mono_color[4])
{
- icon_draw_at_size(x, y, icon_id, aspect, alpha, ICON_SIZE_ICON, 0.0f);
+ icon_draw_at_size(x, y, icon_id, aspect, alpha, ICON_SIZE_ICON, 0.0f, mono_color);
}
-void UI_icon_draw_aspect_color(float x, float y, int icon_id, float aspect, const float rgb[3])
+void UI_icon_draw_aspect_color(float x, float y, int icon_id, float aspect, const float rgb[3], const char mono_color[4])
{
int draw_size = get_draw_size(ICON_SIZE_ICON);
- icon_draw_size(x, y, icon_id, aspect, 1.0f, rgb, ICON_SIZE_ICON, draw_size, false);
+ icon_draw_size(x, y, icon_id, aspect, 1.0f, rgb, ICON_SIZE_ICON, draw_size, false, mono_color);
}
-void UI_icon_draw_desaturate(float x, float y, int icon_id, float aspect, float alpha, float desaturate)
+void UI_icon_draw_desaturate(float x, float y, int icon_id, float aspect, float alpha, float desaturate, const char mono_color[4])
{
- icon_draw_at_size(x, y, icon_id, aspect, alpha, ICON_SIZE_ICON, desaturate);
+ icon_draw_at_size(x, y, icon_id, aspect, alpha, ICON_SIZE_ICON, desaturate, mono_color);
}
/* draws icon with dpi scale factor */
void UI_icon_draw(float x, float y, int icon_id)
{
- UI_icon_draw_aspect(x, y, icon_id, 1.0f / UI_DPI_FAC, 1.0f);
+ UI_icon_draw_aspect(x, y, icon_id, 1.0f / UI_DPI_FAC, 1.0f, NULL);
}
void UI_icon_draw_alpha(float x, float y, int icon_id, float alpha)
{
- UI_icon_draw_aspect(x, y, icon_id, 1.0f / UI_DPI_FAC, alpha);
+ UI_icon_draw_aspect(x, y, icon_id, 1.0f / UI_DPI_FAC, alpha, NULL);
}
void UI_icon_draw_size(float x, float y, int size, int icon_id, float alpha)
{
- icon_draw_size(x, y, icon_id, 1.0f, alpha, NULL, ICON_SIZE_ICON, size, false);
+ icon_draw_size(x, y, icon_id, 1.0f, alpha, NULL, ICON_SIZE_ICON, size, false, NULL);
}
void UI_icon_draw_preview(float x, float y, int icon_id)
{
- icon_draw_at_size(x, y, icon_id, 1.0f, 1.0f, ICON_SIZE_PREVIEW, false);
+ icon_draw_at_size(x, y, icon_id, 1.0f, 1.0f, ICON_SIZE_PREVIEW, false, NULL);
}
void UI_icon_draw_preview_aspect(float x, float y, int icon_id, float aspect)
{
- icon_draw_at_size(x, y, icon_id, aspect, 1.0f, ICON_SIZE_PREVIEW, false);
+ icon_draw_at_size(x, y, icon_id, aspect, 1.0f, ICON_SIZE_PREVIEW, false, NULL);
}
void UI_icon_draw_preview_aspect_size(float x, float y, int icon_id, float aspect, float alpha, int size)
{
- icon_draw_size(x, y, icon_id, aspect, alpha, NULL, ICON_SIZE_PREVIEW, size, false);
+ icon_draw_size(x, y, icon_id, aspect, alpha, NULL, ICON_SIZE_PREVIEW, size, false, NULL);
}
diff --git a/source/blender/editors/interface/interface_icons_event.c b/source/blender/editors/interface/interface_icons_event.c
index fabf5f9bf48..598adcce87f 100644
--- a/source/blender/editors/interface/interface_icons_event.c
+++ b/source/blender/editors/interface/interface_icons_event.c
@@ -162,6 +162,7 @@ void icon_draw_rect_input(
{
float color[4];
const float margin[2] = {w / 20.0f, h / 20.0f};
+ GPU_line_width(1.0f);
UI_GetThemeColor4fv(TH_TEXT, color);
UI_draw_roundbox_corner_set(UI_CNR_ALL);
UI_draw_roundbox_aa(
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 10ea9adb14e..3a2114b32d6 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -354,7 +354,7 @@ struct PieMenuData {
enum eBlockContentHints {
/* In a menu block, if there is a single sub-menu button, we add some
* padding to the right to put nicely aligned triangle icons there. */
- BLOCK_CONTAINS_SUBMENU_BUT = (1 << 0),
+ UI_BLOCK_CONTAINS_SUBMENU_BUT = (1 << 0),
};
struct uiBlock {
@@ -409,6 +409,7 @@ struct uiBlock {
short content_hints; /* eBlockContentHints */
char direction;
+ char theme_style; /* UI_BLOCK_THEME_STYLE_* */
char dt; /* drawtype: UI_EMBOSS, UI_EMBOSS_NONE ... etc, copied to buttons */
bool auto_open;
char _pad[5];
@@ -671,7 +672,9 @@ void ui_popup_block_scrolltest(struct uiBlock *block);
extern int ui_handler_panel_region(
struct bContext *C, const struct wmEvent *event,
struct ARegion *ar, const uiBut *active_but);
-extern void ui_draw_aligned_panel(struct uiStyle *style, uiBlock *block, const rcti *rect, const bool show_pin);
+extern void ui_draw_aligned_panel(
+ struct uiStyle *style, uiBlock *block, const rcti *rect,
+ const bool show_pin, const bool show_background);
/* interface_draw.c */
extern void ui_draw_dropshadow(const rctf *rct, float radius, float aspect, float alpha, int select);
@@ -808,6 +811,7 @@ void ui_item_paneltype_func(struct bContext *C, struct uiLayout *layout, void *a
/* interface_align.c */
bool ui_but_can_align(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
+int ui_but_align_opposite_to_area_align_get(const ARegion *ar) ATTR_WARN_UNUSED_RESULT;
void ui_block_align_calc(uiBlock *block, const ARegion *region);
/* interface_anim.c */
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 58e1545b336..1191c6fc725 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -158,6 +158,9 @@ struct uiLayout {
bContextStore *context;
ListBase items;
+ /* Sub layout to add child items, if not the layout itself. */
+ uiLayout *child_items_layout;
+
int x, y, w, h;
float scale[2];
short space;
@@ -169,6 +172,7 @@ struct uiLayout {
bool variable_size; /* For layouts inside gridflow, they and their items shall never have a fixed maximal size. */
char alignment;
char emboss;
+ float units[2]; /* for fixed width or height to avoid UI size changes */
};
typedef struct uiLayoutItemFlow {
@@ -413,7 +417,7 @@ static void ui_layer_but_cb(bContext *C, void *arg_but, void *arg_index)
uiBut *but = arg_but, *cbut;
PointerRNA *ptr = &but->rnapoin;
PropertyRNA *prop = but->rnaprop;
- int i, index = GET_INT_FROM_POINTER(arg_index);
+ int i, index = POINTER_AS_INT(arg_index);
int shift = win->eventstate->shift;
int len = RNA_property_array_length(ptr, prop);
@@ -507,7 +511,7 @@ static void ui_item_array(
but = uiDefAutoButR(block, ptr, prop, layer_num, "", icon, x + butw * a, y + buth, butw, buth);
if (subtype == PROP_LAYER_MEMBER)
- UI_but_func_set(but, ui_layer_but_cb, but, SET_INT_IN_POINTER(layer_num));
+ UI_but_func_set(but, ui_layer_but_cb, but, POINTER_FROM_INT(layer_num));
}
for (a = 0; a < colbuts; a++) {
const int layer_num = a + len / 2 + b * colbuts;
@@ -525,7 +529,7 @@ static void ui_item_array(
but = uiDefAutoButR(block, ptr, prop, layer_num, "", icon, x + butw * a, y, butw, buth);
if (subtype == PROP_LAYER_MEMBER)
- UI_but_func_set(but, ui_layer_but_cb, but, SET_INT_IN_POINTER(layer_num));
+ UI_but_func_set(but, ui_layer_but_cb, but, POINTER_FROM_INT(layer_num));
}
UI_block_align_end(block);
@@ -623,7 +627,7 @@ static void ui_item_enum_expand_handle(bContext *C, void *arg1, void *arg2)
if (!win->eventstate->shift) {
uiBut *but = (uiBut *)arg1;
- int enum_value = GET_INT_FROM_POINTER(arg2);
+ int enum_value = POINTER_AS_INT(arg2);
int current_value = RNA_property_enum_get(&but->rnapoin, but->rnaprop);
if (!(current_value & enum_value)) {
@@ -635,9 +639,9 @@ static void ui_item_enum_expand_handle(bContext *C, void *arg1, void *arg2)
RNA_property_enum_set(&but->rnapoin, but->rnaprop, current_value);
}
}
-static void ui_item_enum_expand(
+static void ui_item_enum_expand_exec(
uiLayout *layout, uiBlock *block, PointerRNA *ptr, PropertyRNA *prop,
- const char *uiname, int h, bool icon_only)
+ const char *uiname, int h, int but_type, bool icon_only)
{
/* XXX The way this function currently handles uiname parameter is insane and inconsistent with general UI API:
* * uiname is the *enum property* label.
@@ -655,6 +659,8 @@ static void ui_item_enum_expand(
bool free;
bool radial = (layout->root->type == UI_LAYOUT_PIEMENU);
+ BLI_assert(RNA_property_type(prop) == PROP_ENUM);
+
if (radial)
RNA_property_enum_items_gettexted_all(block->evil_C, ptr, prop, &item_array, NULL, &free);
else
@@ -700,14 +706,14 @@ static void ui_item_enum_expand(
itemw = ui_text_icon_width(block->curlayout, icon_only ? "" : name, icon, 0);
if (icon && name[0] && !icon_only)
- but = uiDefIconTextButR_prop(block, UI_BTYPE_ROW, 0, icon, name, 0, 0, itemw, h, ptr, prop, -1, 0, value, -1, -1, NULL);
+ but = uiDefIconTextButR_prop(block, but_type, 0, icon, name, 0, 0, itemw, h, ptr, prop, -1, 0, value, -1, -1, NULL);
else if (icon)
- but = uiDefIconButR_prop(block, UI_BTYPE_ROW, 0, icon, 0, 0, itemw, h, ptr, prop, -1, 0, value, -1, -1, NULL);
+ but = uiDefIconButR_prop(block, but_type, 0, icon, 0, 0, itemw, h, ptr, prop, -1, 0, value, -1, -1, NULL);
else
- but = uiDefButR_prop(block, UI_BTYPE_ROW, 0, name, 0, 0, itemw, h, ptr, prop, -1, 0, value, -1, -1, NULL);
+ but = uiDefButR_prop(block, but_type, 0, name, 0, 0, itemw, h, ptr, prop, -1, 0, value, -1, -1, NULL);
if (RNA_property_flag(prop) & PROP_ENUM_FLAG) {
- UI_but_func_set(but, ui_item_enum_expand_handle, but, SET_INT_IN_POINTER(value));
+ UI_but_func_set(but, ui_item_enum_expand_handle, but, POINTER_FROM_INT(value));
}
if (ui_layout_local_dir(layout) != UI_LAYOUT_HORIZONTAL)
@@ -719,6 +725,24 @@ static void ui_item_enum_expand(
MEM_freeN((void *)item_array);
}
}
+static void ui_item_enum_expand(
+ uiLayout *layout, uiBlock *block, PointerRNA *ptr, PropertyRNA *prop,
+ const char *uiname, int h, bool icon_only)
+{
+ ui_item_enum_expand_exec(layout, block, ptr, prop, uiname, h, UI_BTYPE_ROW, icon_only);
+}
+static void ui_item_enum_expand_tabs(
+ uiLayout *layout, bContext *C, uiBlock *block, PointerRNA *ptr, PropertyRNA *prop,
+ const char *uiname, int h, bool icon_only)
+{
+ uiBut *last = block->buttons.last;
+
+ ui_item_enum_expand_exec(layout, block, ptr, prop, uiname, h, UI_BTYPE_TAB, icon_only);
+ BLI_assert(last != block->buttons.last);
+ for (uiBut *tab = last ? last->next : block->buttons.first; tab; tab = tab->next) {
+ UI_but_drawflag_enable(tab, ui_but_align_opposite_to_area_align_get(CTX_wm_region(C)));
+ }
+}
/* callback for keymap item change button */
static void ui_keymap_but_cb(bContext *UNUSED(C), void *but_v, void *UNUSED(key_v))
@@ -787,7 +811,7 @@ static uiBut *ui_item_with_label(
/* BUTTONS_OT_file_browse calls UI_context_active_but_prop_get_filebrowser */
uiDefIconButO(
block, UI_BTYPE_BUT, subtype == PROP_DIRPATH ? "BUTTONS_OT_directory_browse" : "BUTTONS_OT_file_browse",
- WM_OP_INVOKE_DEFAULT, ICON_FILESEL, x, y, UI_UNIT_X, h, NULL);
+ WM_OP_INVOKE_DEFAULT, ICON_FILEBROWSER, x, y, UI_UNIT_X, h, NULL);
}
else if (flag & UI_ITEM_R_EVENT) {
but = uiDefButR_prop(block, UI_BTYPE_KEY_EVENT, 0, name, x, y, prop_but_width, h, ptr, prop, index, 0, 0, -1, -1, NULL);
@@ -1219,7 +1243,7 @@ void uiItemsFullEnumO_items(
uiItemS(target);
}
else {
- /* XXX bug here, colums draw bottom item badly */
+ /* XXX bug here, columns draw bottom item badly */
uiItemS(target);
}
}
@@ -1627,6 +1651,7 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index
}
/* Split the label / property. */
+ uiLayout *layout_parent = layout;
if (use_prop_sep) {
uiLayout *layout_row = NULL;
#ifdef UI_PROP_DECORATE
@@ -1647,7 +1672,6 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index
uiLayout *layout_split;
#ifdef UI_PROP_SEP_ICON_WIDTH_EXCEPTION
if (type == PROP_BOOLEAN && (icon == ICON_NONE) && !icon_only) {
- w = UI_UNIT_X;
layout_split = uiLayoutRow(layout_row ? layout_row : layout, true);
}
else
@@ -1693,15 +1717,36 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index
}
}
- /* Watch out! We can only write into the new column now. */
- layout = uiLayoutColumn(layout_split, true);
- layout->space = 0;
+ /* Hack to add further items in a row into the second part of
+ * the split layout, so the label part keeps a fixed size. */
+ if (layout_parent && layout_parent->item.type == ITEM_LAYOUT_ROW) {
+ layout_split = uiLayoutRow(layout_split, true);
+ layout_parent->child_items_layout = layout_split;
+ }
+
+ /* Watch out! We can only write into the new layout now. */
if ((type == PROP_ENUM) && (flag & UI_ITEM_R_EXPAND)) {
- /* pass (expanded enums each have their own name) */
+ /* Expanded enums each have their own name. */
+
+ /* Often expanded enum's are better arranged into a row, so check the existing layout. */
+ if (ui_layout_local_dir(layout) == UI_LAYOUT_HORIZONTAL) {
+ layout = uiLayoutRow(layout_split, true);
+ }
+ else {
+ layout = uiLayoutColumn(layout_split, true);
+ }
}
else {
name = "";
+ layout = uiLayoutColumn(layout_split, true);
}
+ layout->space = 0;
+
+#ifdef UI_PROP_SEP_ICON_WIDTH_EXCEPTION
+ if (type == PROP_BOOLEAN && (icon == ICON_NONE) && !icon_only) {
+ w = UI_UNIT_X;
+ }
+#endif /* UI_PROP_SEP_ICON_WIDTH_EXCEPTION */
}
#ifdef UI_PROP_DECORATE
@@ -2183,8 +2228,11 @@ static uiBut *ui_item_menu(
else
but = uiDefMenuBut(block, func, arg, name, 0, 0, w, h, tip);
- if (argN) { /* ugly .. */
- but->poin = (char *)but;
+ if (argN) {
+ /* ugly .. */
+ if (arg != argN) {
+ but->poin = (char *)but;
+ }
but->func_argN = argN;
}
@@ -2304,12 +2352,15 @@ static uiBut *uiItemL_(uiLayout *layout, const char *name, int icon)
w = ui_text_icon_width(layout, name, icon, 0);
- if (icon && name[0])
- but = uiDefIconTextBut(block, UI_BTYPE_LABEL, 0, icon, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
- else if (icon)
- but = uiDefIconBut(block, UI_BTYPE_LABEL, 0, icon, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
- else
- but = uiDefBut(block, UI_BTYPE_LABEL, 0, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
+ if (icon && name[0]) {
+ but = uiDefIconTextBut(block, UI_BTYPE_LABEL, 0, icon, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, NULL);
+ }
+ else if (icon) {
+ but = uiDefIconBut(block, UI_BTYPE_LABEL, 0, icon, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, NULL);
+ }
+ else {
+ but = uiDefBut(block, UI_BTYPE_LABEL, 0, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, NULL);
+ }
/* to compensate for string size padding in ui_text_icon_width,
* make text aligned right if the layout is aligned right.
@@ -2324,6 +2375,10 @@ static uiBut *uiItemL_(uiLayout *layout, const char *name, int icon)
but->flag |= UI_BUT_LIST_ITEM;
}
+ if (layout->redalert) {
+ UI_but_flag_enable(but, UI_BUT_REDALERT);
+ }
+
return but;
}
@@ -2368,16 +2423,23 @@ void uiItemV(uiLayout *layout, const char *name, int icon, int argval)
}
/* separator item */
-void uiItemS(uiLayout *layout)
+void uiItemS_ex(uiLayout *layout, float factor)
{
uiBlock *block = layout->root->block;
bool is_menu = ui_block_is_menu(block);
int space = (is_menu) ? 0.45f * UI_UNIT_X : 0.3f * UI_UNIT_X;
+ space *= factor;
UI_block_layout_set_current(block, layout);
uiDefBut(block, (is_menu) ? UI_BTYPE_SEPR_LINE : UI_BTYPE_SEPR, 0, "", 0, 0, space, space, NULL, 0.0, 0.0, 0, 0, "");
}
+/* separator item */
+void uiItemS(uiLayout *layout)
+{
+ uiItemS_ex(layout, 1.0f);
+}
+
/* Flexible spacing. */
void uiItemSpacer(uiLayout *layout)
{
@@ -2407,6 +2469,18 @@ void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc
ui_item_menu(layout, name, icon, func, arg, NULL, "", false);
}
+/**
+ * Version of #uiItemMenuF that free's `argN`.
+ */
+void uiItemMenuFN(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *argN)
+{
+ if (!func)
+ return;
+
+ /* Second 'argN' only ensures it gets freed. */
+ ui_item_menu(layout, name, icon, func, argN, argN, "", false);
+}
+
typedef struct MenuItemLevel {
int opcontext;
/* don't use pointers to the strings because python can dynamically
@@ -2526,6 +2600,14 @@ void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propn
uiItemMenuEnumR_prop(layout, ptr, prop, name, icon);
}
+void uiItemTabsEnumR_prop(uiLayout *layout, bContext *C, PointerRNA *ptr, PropertyRNA *prop, bool icon_only)
+{
+ uiBlock *block = layout->root->block;
+
+ UI_block_layout_set_current(block, layout);
+ ui_item_enum_expand_tabs(layout, C, block, ptr, prop, NULL, UI_UNIT_Y, icon_only);
+}
+
/**************************** Layout Items ***************************/
/* single-row layout */
@@ -3057,7 +3139,7 @@ static void ui_litem_layout_column_flow(uiLayout *litem)
/* multi-column and multi-row layout. */
typedef struct UILayoutGridFlowInput {
- /* General layout controll settings. */
+ /* General layout control settings. */
const bool row_major : 1; /* Fill rows before columns */
const bool even_columns : 1; /* All columns will have same width. */
const bool even_rows : 1; /* All rows will have same height. */
@@ -3265,7 +3347,7 @@ static void ui_litem_estimate_grid_flow(uiLayout *litem)
/* Even in varying column width case, we fix our columns number from weighted average width of items,
* a proper solving of required width would be too costly, and this should give reasonably good results
- * in all resonable cases... */
+ * in all reasonable cases... */
if (gflow->columns_len > 0) {
gflow->tot_columns = gflow->columns_len;
}
@@ -3288,7 +3370,7 @@ static void ui_litem_estimate_grid_flow(uiLayout *litem)
const int step = modulo ? modulo : 1;
if (gflow->row_major) {
- /* Adjust number of columns to be mutiple of given modulo. */
+ /* Adjust number of columns to be multiple of given modulo. */
if (modulo && gflow->tot_columns % modulo != 0 && gflow->tot_columns > modulo) {
gflow->tot_columns = gflow->tot_columns - (gflow->tot_columns % modulo);
}
@@ -3299,7 +3381,7 @@ static void ui_litem_estimate_grid_flow(uiLayout *litem)
gflow->tot_columns -= step);
}
else {
- /* Adjust number of rows to be mutiple of given modulo. */
+ /* Adjust number of rows to be multiple of given modulo. */
if (modulo && gflow->tot_rows % modulo != 0) {
gflow->tot_rows = min_ii(gflow->tot_rows + modulo - (gflow->tot_rows % modulo), gflow->tot_items);
}
@@ -3595,7 +3677,13 @@ static void ui_litem_init_from_parent(uiLayout *litem, uiLayout *layout, int ali
litem->w = layout->w;
litem->emboss = layout->emboss;
litem->item.flag = (layout->item.flag & (UI_ITEM_PROP_SEP | UI_ITEM_PROP_DECORATE));
- BLI_addtail(&layout->items, litem);
+
+ if (layout->child_items_layout) {
+ BLI_addtail(&layout->child_items_layout->items, litem);
+ }
+ else {
+ BLI_addtail(&layout->items, litem);
+ }
}
/* layout create functions */
@@ -3844,6 +3932,16 @@ void uiLayoutSetScaleY(uiLayout *layout, float scale)
layout->scale[1] = scale;
}
+void uiLayoutSetUnitsX(uiLayout *layout, float unit)
+{
+ layout->units[0] = unit;
+}
+
+void uiLayoutSetUnitsY(uiLayout *layout, float unit)
+{
+ layout->units[1] = unit;
+}
+
void uiLayoutSetEmboss(uiLayout *layout, char emboss)
{
layout->emboss = emboss;
@@ -3909,6 +4007,16 @@ float uiLayoutGetScaleY(uiLayout *layout)
return layout->scale[1];
}
+float uiLayoutGetUnitsX(uiLayout *layout)
+{
+ return layout->units[0];
+}
+
+float uiLayoutGetUnitsY(uiLayout *layout)
+{
+ return layout->units[1];
+}
+
int uiLayoutGetEmboss(uiLayout *layout)
{
if (layout->emboss == UI_EMBOSS_UNDEFINED) {
@@ -3999,6 +4107,14 @@ static void ui_item_estimate(uiItem *item)
default:
break;
}
+
+ /* Force fixed size. */
+ if (litem->units[0] > 0) {
+ litem->w = UI_UNIT_X * litem->units[0];
+ }
+ if (litem->units[1] > 0) {
+ litem->h = UI_UNIT_Y * litem->units[1];
+ }
}
}
@@ -4174,7 +4290,7 @@ uiLayout *UI_block_layout(uiBlock *block, int dir, int type, int x, int y, int s
root->opcontext = WM_OP_INVOKE_REGION_WIN;
layout = MEM_callocN(sizeof(uiLayout), "uiLayout");
- layout->item.type = ITEM_LAYOUT_ROOT;
+ layout->item.type = (type == UI_LAYOUT_VERT_BAR) ? ITEM_LAYOUT_COLUMN : ITEM_LAYOUT_ROOT;
/* Only used when 'UI_ITEM_PROP_SEP' is set. */
layout->item.flag = UI_ITEM_PROP_DECORATE;
@@ -4191,10 +4307,6 @@ uiLayout *UI_block_layout(uiBlock *block, int dir, int type, int x, int y, int s
if (type == UI_LAYOUT_MENU || type == UI_LAYOUT_PIEMENU)
layout->space = 0;
- if (type == UI_LAYOUT_TOOLBAR) {
- block->flag |= UI_BLOCK_SHOW_SHORTCUT_ALWAYS;
- }
-
if (dir == UI_LAYOUT_HORIZONTAL) {
layout->h = size;
layout->root->emh = em * UI_UNIT_Y;
@@ -4245,7 +4357,12 @@ void ui_layout_add_but(uiLayout *layout, uiBut *but)
bitem->item.flag |= UI_ITEM_MIN;
}
- BLI_addtail(&layout->items, bitem);
+ if (layout->child_items_layout) {
+ BLI_addtail(&layout->child_items_layout->items, bitem);
+ }
+ else {
+ BLI_addtail(&layout->items, bitem);
+ }
if (layout->context) {
but->context = layout->context;
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index 19b6ab91877..5be2b82af9e 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -42,14 +42,15 @@
#include "BLT_lang.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "BKE_idprop.h"
#include "BKE_layer.h"
-#include "BKE_screen.h"
-#include "BKE_global.h"
+#include "BKE_library.h"
#include "BKE_library_override.h"
#include "BKE_node.h"
-#include "BKE_text.h" /* for UI_OT_reports_to_text */
#include "BKE_report.h"
+#include "BKE_screen.h"
+#include "BKE_text.h" /* for UI_OT_reports_to_text */
#include "DEG_depsgraph.h"
@@ -1243,6 +1244,66 @@ static void UI_OT_reloadtranslation(wmOperatorType *ot)
ot->exec = reloadtranslation_exec;
}
+
+static ARegion *region_event_inside_for_screen(bContext *C, const int xy[2])
+{
+ bScreen *sc = CTX_wm_screen(C);
+ if (sc) {
+ for (ARegion *ar = sc->regionbase.first; ar; ar = ar->next) {
+ if (BLI_rcti_isect_pt_v(&ar->winrct, xy)) {
+ return ar;
+ }
+ }
+ }
+ return NULL;
+}
+
+static int ui_button_press_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+{
+ const bool skip_depressed = RNA_boolean_get(op->ptr, "skip_depressed");
+ ARegion *ar_prev = CTX_wm_region(C);
+ ARegion *ar = region_event_inside_for_screen(C, &event->x);
+
+ if (ar == NULL) {
+ ar = ar_prev;
+ }
+
+ CTX_wm_region_set(C, ar);
+ uiBut *but = UI_context_active_but_get(C);
+ CTX_wm_region_set(C, ar_prev);
+
+ if (but == NULL) {
+ return OPERATOR_PASS_THROUGH;
+ }
+ if (skip_depressed && (but->flag & (UI_SELECT | UI_SELECT_DRAW))) {
+ return OPERATOR_PASS_THROUGH;
+ }
+
+ /* Weak, this is a workaround for 'UI_but_is_tool', which checks the operator type,
+ * having this avoids a minor drawing glitch. */
+ void *but_optype = but->optype;
+
+ UI_but_execute(C, but);
+
+ but->optype = but_optype;
+
+ WM_event_add_mousemove(C);
+
+ return OPERATOR_FINISHED;
+}
+
+static void UI_OT_button_execute(wmOperatorType *ot)
+{
+ ot->name = "Press Button";
+ ot->idname = "UI_OT_button_execute";
+ ot->description = "Presses active button";
+
+ ot->invoke = ui_button_press_invoke;
+ ot->flag = OPTYPE_INTERNAL;
+
+ RNA_def_boolean(ot->srna, "skip_depressed", 0, "Skip Depressed", "");
+}
+
bool UI_drop_color_poll(struct bContext *C, wmDrag *drag, const wmEvent *UNUSED(event), const char **UNUSED(tooltip))
{
/* should only return true for regions that include buttons, for now
@@ -1356,6 +1417,7 @@ void ED_operatortypes_ui(void)
WM_operatortype_append(UI_OT_edittranslation_init);
#endif
WM_operatortype_append(UI_OT_reloadtranslation);
+ WM_operatortype_append(UI_OT_button_execute);
/* external */
WM_operatortype_append(UI_OT_eyedropper_color);
@@ -1372,34 +1434,7 @@ void ED_operatortypes_ui(void)
*/
void ED_keymap_ui(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "User Interface", 0, 0);
- wmKeyMapItem *kmi;
-
- /* eyedroppers - notice they all have the same shortcut, but pass the event
- * through until a suitable eyedropper for the active button is found */
- WM_keymap_add_item(keymap, "UI_OT_eyedropper_color", EKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "UI_OT_eyedropper_colorband", EKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "UI_OT_eyedropper_colorband_point", EKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "UI_OT_eyedropper_id", EKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "UI_OT_eyedropper_depth", EKEY, KM_PRESS, 0, 0);
-
- /* Copy Data Path */
- WM_keymap_add_item(keymap, "UI_OT_copy_data_path_button", CKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- kmi = WM_keymap_add_item(keymap, "UI_OT_copy_data_path_button", CKEY, KM_PRESS, KM_CTRL | KM_SHIFT | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "full_path", true);
-
- /* keyframes */
- WM_keymap_add_item(keymap, "ANIM_OT_keyframe_insert_button", IKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_keyframe_delete_button", IKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_keyframe_clear_button", IKEY, KM_PRESS, KM_SHIFT | KM_ALT, 0);
-
- /* drivers */
- WM_keymap_add_item(keymap, "ANIM_OT_driver_button_add", DKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_driver_button_remove", DKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
-
- /* keyingsets */
- WM_keymap_add_item(keymap, "ANIM_OT_keyingset_button_add", KKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_keyingset_button_remove", KKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_ensure(keyconf, "User Interface", 0, 0);
eyedropper_modal_keymap(keyconf);
eyedropper_colorband_modal_keymap(keyconf);
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index cb5c104e638..aab580b49bd 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -134,7 +134,7 @@ static int panel_aligned(ScrArea *sa, ARegion *ar)
return BUT_VERTICAL;
else if (sa->spacetype == SPACE_IMAGE && ar->regiontype == RGN_TYPE_PREVIEW)
return BUT_VERTICAL;
- else if (ELEM(ar->regiontype, RGN_TYPE_UI, RGN_TYPE_TOOLS, RGN_TYPE_TOOL_PROPS, RGN_TYPE_HUD))
+ else if (ELEM(ar->regiontype, RGN_TYPE_UI, RGN_TYPE_TOOLS, RGN_TYPE_TOOL_PROPS, RGN_TYPE_HUD, RGN_TYPE_NAV_BAR))
return BUT_VERTICAL;
return 0;
@@ -381,6 +381,9 @@ Panel *UI_panel_begin(ScrArea *sa, ARegion *ar, ListBase *lb, uiBlock *block, Pa
/* assign to block */
block->panel = pa;
pa->runtime_flag |= PNL_ACTIVE | PNL_LAST_ADDED;
+ if (ar->alignment == RGN_ALIGN_FLOAT) {
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
+ }
*r_open = false;
@@ -548,18 +551,18 @@ static void immRectf_tris_color_ex(
unsigned int pos, float x1, float y1, float x2, float y2,
unsigned int col, const float color[3])
{
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x1, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x2, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x2, y2);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x1, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x2, y2);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x1, y2);
}
@@ -576,7 +579,7 @@ static void ui_draw_panel_dragwidget(unsigned int pos, unsigned int col, const r
const int x_min = rect->xmin;
const int y_min = rect->ymin;
- const int y_ofs = max_ii(round_fl_to_int(BLI_rctf_size_y(rect) / 3.0f), px);
+ const int y_ofs = max_ii(round_fl_to_int(BLI_rctf_size_y(rect) / 2.5f), px);
const int x_ofs = y_ofs;
int i_x, i_y;
@@ -652,7 +655,9 @@ static void ui_draw_aligned_panel_header(uiStyle *style, uiBlock *block, const r
}
/* panel integrated in buttonswindow, tool/property lists etc */
-void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, const rcti *rect, const bool show_pin)
+void ui_draw_aligned_panel(
+ uiStyle *style, uiBlock *block, const rcti *rect,
+ const bool show_pin, const bool show_background)
{
Panel *panel = block->panel;
rcti headrect;
@@ -661,7 +666,11 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, const rcti *rect, con
const bool is_closed_x = (panel->flag & PNL_CLOSEDX) ? true : false;
const bool is_closed_y = (panel->flag & PNL_CLOSEDY) ? true : false;
const bool is_subpanel = (panel->type && panel->type->parent);
- const bool show_drag = !is_subpanel;
+ const bool show_drag = (
+ !is_subpanel &&
+ /* FIXME(campbell): currently no background means floating panel which can't be dragged.
+ * This may be changed in future. */
+ show_background);
if (panel->paneltab) return;
if (panel->type && (panel->type->flag & PNL_NO_HEADER)) return;
@@ -680,7 +689,7 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, const rcti *rect, con
uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
- if (!is_subpanel) {
+ if (show_background && !is_subpanel) {
float minx = rect->xmin;
float maxx = is_closed_x ? (minx + PNL_HEADER / block->aspect) : rect->xmax;
float y = headrect.ymax;
@@ -714,11 +723,14 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, const rcti *rect, con
if (show_pin)
#endif
{
+ char col_title[4];
+ UI_GetThemeColor4ubv(TH_TITLE, (uchar *)col_title);
+
GPU_blend(true);
UI_icon_draw_aspect(
headrect.xmax - ((PNL_ICON * 2.2f) / block->aspect), headrect.ymin + (5.0f / block->aspect),
(panel->flag & PNL_PIN) ? ICON_PINNED : ICON_UNPINNED,
- (block->aspect / UI_DPI_FAC), 1.0f);
+ (block->aspect / UI_DPI_FAC), 1.0f, col_title);
GPU_blend(false);
}
@@ -775,11 +787,13 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, const rcti *rect, con
GPU_blend(true);
- /* panel backdrop */
- int panel_col = is_subpanel ? TH_PANEL_SUB_BACK : TH_PANEL_BACK;
+ if (show_background) {
+ /* panel backdrop */
+ int panel_col = is_subpanel ? TH_PANEL_SUB_BACK : TH_PANEL_BACK;
- immUniformThemeColor(panel_col);
- immRectf(pos, rect->xmin, rect->ymin, rect->xmax, rect->ymax);
+ immUniformThemeColor(panel_col);
+ immRectf(pos, rect->xmin, rect->ymin, rect->xmax, rect->ymax);
+ }
if (panel->control & UI_PNL_SCALE)
ui_draw_panel_scalewidget(pos, rect);
@@ -944,7 +958,7 @@ static void align_sub_panels(Panel *pa)
}
}
-/* this doesnt draw */
+/* this doesn't draw */
/* returns 1 when it did something */
static bool uiAlignPanelStep(ScrArea *sa, ARegion *ar, const float fac, const bool drag)
{
@@ -1004,7 +1018,7 @@ static bool uiAlignPanelStep(ScrArea *sa, ARegion *ar, const float fac, const bo
ps->pa->ofsy = -get_panel_size_y(ps->pa);
if (has_category_tabs) {
- if (align == BUT_VERTICAL) {
+ if (align == BUT_VERTICAL && (ar->alignment != RGN_ALIGN_RIGHT)) {
ps->pa->ofsx += UI_PANEL_CATEGORY_MARGIN_WIDTH;
}
}
@@ -1199,7 +1213,9 @@ void UI_panels_draw(const bContext *C, ARegion *ar)
{
uiBlock *block;
- UI_ThemeClearColor(TH_BACK);
+ if (ar->alignment != RGN_ALIGN_FLOAT) {
+ UI_ThemeClearColor(TH_BACK);
+ }
/* Draw panels, selected on top. Also in reverse order, because
* UI blocks are added in reverse order and we need child panels
@@ -1412,7 +1428,7 @@ static void ui_panel_drag_collapse(bContext *C, uiPanelDragCollapseHandle *dragc
/**
* Panel drag-collapse (modal handler)
* Clicking and dragging over panels toggles their collapse state based on the panel that was first
- * dragged over. If it was open all affected panels incl the initial one are closed and vise versa.
+ * dragged over. If it was open all affected panels incl the initial one are closed and vice versa.
*/
static int ui_panel_drag_collapse_handler(bContext *C, const wmEvent *event, void *userdata)
{
@@ -1690,11 +1706,21 @@ void UI_panel_category_clear_all(ARegion *ar)
BLI_freelistN(&ar->panels_category);
}
+static void imm_buf_append(
+ float vbuf[][2],
+ uchar cbuf[][3],
+ float x, float y, const uchar col[3], int *index)
+{
+ ARRAY_SET_ITEMS(vbuf[*index], x, y);
+ ARRAY_SET_ITEMS(cbuf[*index], UNPACK3(col));
+ (*index)++;
+}
+
/* based on UI_draw_roundbox, check on making a version which allows us to skip some sides */
static void ui_panel_category_draw_tab(
bool filled, float minx, float miny, float maxx, float maxy, float rad,
- int roundboxtype,
- bool use_highlight, bool use_shadow,
+ const int roundboxtype,
+ const bool use_highlight, const bool use_shadow, const bool use_flip_x,
const unsigned char highlight_fade[3],
const unsigned char col[3])
{
@@ -1705,10 +1731,6 @@ static void ui_panel_category_draw_tab(
{0.98, 0.805}};
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_U8, 3, GPU_FETCH_INT_TO_FLOAT_UNIT);
-
/* mult */
for (a = 0; a < 4; a++) {
mul_v2_fl(vec[a], rad);
@@ -1726,90 +1748,84 @@ static void ui_panel_category_draw_tab(
vert_len += (roundboxtype & UI_CNR_BOTTOM_RIGHT) ? 6 : 1;
vert_len += (roundboxtype & UI_CNR_BOTTOM_LEFT) ? 6 : 1;
}
-
- immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
-
- immBegin(filled ? GPU_PRIM_TRI_FAN : GPU_PRIM_LINE_STRIP, vert_len);
+ /* Maximum size. */
+ float vbuf[24][2];
+ uchar cbuf[24][3];
+ int buf_index = 0;
/* start with corner right-top */
if (use_highlight) {
if (roundboxtype & UI_CNR_TOP_RIGHT) {
- immAttrib3ubv(color, col);
- immVertex2f(pos, maxx, maxy - rad);
+ imm_buf_append(vbuf, cbuf, maxx, maxy - rad, col, &buf_index);
for (a = 0; a < 4; a++) {
- immAttrib3ubv(color, col);
- immVertex2f(pos, maxx - vec[a][1], maxy - rad + vec[a][0]);
+ imm_buf_append(vbuf, cbuf, maxx - vec[a][1], maxy - rad + vec[a][0], col, &buf_index);
}
- immAttrib3ubv(color, col);
- immVertex2f(pos, maxx - rad, maxy);
+ imm_buf_append(vbuf, cbuf, maxx - rad, maxy, col, &buf_index);
}
else {
- immAttrib3ubv(color, col);
- immVertex2f(pos, maxx, maxy);
+ imm_buf_append(vbuf, cbuf, maxx, maxy, col, &buf_index);
}
/* corner left-top */
if (roundboxtype & UI_CNR_TOP_LEFT) {
- immAttrib3ubv(color, col);
- immVertex2f(pos, minx + rad, maxy);
+ imm_buf_append(vbuf, cbuf, minx + rad, maxy, col, &buf_index);
for (a = 0; a < 4; a++) {
- immAttrib3ubv(color, col);
- immVertex2f(pos, minx + rad - vec[a][0], maxy - vec[a][1]);
+ imm_buf_append(vbuf, cbuf, minx + rad - vec[a][0], maxy - vec[a][1], col, &buf_index);
}
- immAttrib3ubv(color, col);
- immVertex2f(pos, minx, maxy - rad);
+ imm_buf_append(vbuf, cbuf, minx, maxy - rad, col, &buf_index);
}
else {
- immAttrib3ubv(color, col);
- immVertex2f(pos, minx, maxy);
+ imm_buf_append(vbuf, cbuf, minx, maxy, col, &buf_index);
}
}
if (use_highlight && !use_shadow) {
- if (highlight_fade) {
- immAttrib3ubv(color, highlight_fade);
+ imm_buf_append(vbuf, cbuf, minx, miny + rad, highlight_fade ? col : highlight_fade, &buf_index);
+ }
+ else {
+ /* corner left-bottom */
+ if (roundboxtype & UI_CNR_BOTTOM_LEFT) {
+ imm_buf_append(vbuf, cbuf, minx, miny + rad, col, &buf_index);
+ for (a = 0; a < 4; a++) {
+ imm_buf_append(vbuf, cbuf, minx + vec[a][1], miny + rad - vec[a][0], col, &buf_index);
+ }
+ imm_buf_append(vbuf, cbuf, minx + rad, miny, col, &buf_index);
}
else {
- immAttrib3ubv(color, col);
+ imm_buf_append(vbuf, cbuf, minx, miny, col, &buf_index);
}
- immVertex2f(pos, minx, miny + rad);
- immEnd();
- immUnbindProgram();
- return;
- }
- /* corner left-bottom */
- if (roundboxtype & UI_CNR_BOTTOM_LEFT) {
- immAttrib3ubv(color, col);
- immVertex2f(pos, minx, miny + rad);
- for (a = 0; a < 4; a++) {
- immAttrib3ubv(color, col);
- immVertex2f(pos, minx + vec[a][1], miny + rad - vec[a][0]);
+ /* corner right-bottom */
+ if (roundboxtype & UI_CNR_BOTTOM_RIGHT) {
+ imm_buf_append(vbuf, cbuf, maxx - rad, miny, col, &buf_index);
+ for (a = 0; a < 4; a++) {
+ imm_buf_append(vbuf, cbuf, maxx - rad + vec[a][0], miny + vec[a][1], col, &buf_index);
+ }
+ imm_buf_append(vbuf, cbuf, maxx, miny + rad, col, &buf_index);
+ }
+ else {
+ imm_buf_append(vbuf, cbuf, maxx, miny, col, &buf_index);
}
- immAttrib3ubv(color, col);
- immVertex2f(pos, minx + rad, miny);
- }
- else {
- immAttrib3ubv(color, col);
- immVertex2f(pos, minx, miny);
}
- /* corner right-bottom */
- if (roundboxtype & UI_CNR_BOTTOM_RIGHT) {
- immAttrib3ubv(color, col);
- immVertex2f(pos, maxx - rad, miny);
- for (a = 0; a < 4; a++) {
- immAttrib3ubv(color, col);
- immVertex2f(pos, maxx - rad + vec[a][0], miny + vec[a][1]);
+ if (use_flip_x) {
+ float midx = (minx + maxx) / 2.0f;
+ for (int i = 0; i < buf_index; i++) {
+ vbuf[i][0] = midx - (vbuf[i][0] - midx);
}
- immAttrib3ubv(color, col);
- immVertex2f(pos, maxx, miny + rad);
- }
- else {
- immAttrib3ubv(color, col);
- immVertex2f(pos, maxx, miny);
+
}
+ 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_U8, 3, GPU_FETCH_INT_TO_FLOAT_UNIT);
+
+ immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
+ immBegin(filled ? GPU_PRIM_TRI_FAN : GPU_PRIM_LINE_STRIP, vert_len);
+ for (int i = 0; i < buf_index; i++) {
+ immAttr3ubv(color, cbuf[i]);
+ immVertex2fv(pos, vbuf[i]);
+ }
immEnd();
immUnbindProgram();
}
@@ -1823,21 +1839,23 @@ void UI_panel_category_draw_all(ARegion *ar, const char *category_id_active)
{
/* no tab outlines for */
// #define USE_FLAT_INACTIVE
+ const bool is_left = (ar->alignment != RGN_ALIGN_RIGHT);
View2D *v2d = &ar->v2d;
uiStyle *style = UI_style_get();
const uiFontStyle *fstyle = &style->widget;
const int fontid = fstyle->uifont_id;
short fstyle_points = fstyle->points;
-
PanelCategoryDyn *pc_dyn;
const float aspect = ((uiBlock *)ar->uiblocks.first)->aspect;
const float zoom = 1.0f / aspect;
const int px = max_ii(1, round_fl_to_int(U.pixelsize));
+ const int px_x_sign = is_left ? px : -px;
const int category_tabs_width = round_fl_to_int(UI_PANEL_CATEGORY_MARGIN_WIDTH * zoom);
const float dpi_fac = UI_DPI_FAC;
- const int tab_v_pad_text = round_fl_to_int((2 + ((px * 3) * dpi_fac)) * zoom); /* pading of tabs around text */
+ const int tab_v_pad_text = round_fl_to_int((2 + ((px * 3) * dpi_fac)) * zoom); /* padding of tabs around text */
const int tab_v_pad = round_fl_to_int((4 + (2 * px * dpi_fac)) * zoom); /* padding between tabs */
const float tab_curve_radius = ((px * 3) * dpi_fac) * zoom;
+ /* We flip the tab drawing, so always use these flags. */
const int roundboxtype = UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT;
bool is_alpha;
bool do_scaletabs = false;
@@ -1846,8 +1864,9 @@ void UI_panel_category_draw_all(ARegion *ar, const char *category_id_active)
#endif
float scaletabs = 1.0f;
/* same for all tabs */
- const int rct_xmin = v2d->mask.xmin + 3; /* intentionally dont scale by 'px' */
- const int rct_xmax = v2d->mask.xmin + category_tabs_width;
+ /* intentionally dont scale by 'px' */
+ const int rct_xmin = is_left ? v2d->mask.xmin + 3 : (v2d->mask.xmax - category_tabs_width);
+ const int rct_xmax = is_left ? v2d->mask.xmin + category_tabs_width : (v2d->mask.xmax - 3);
const int text_v_ofs = (rct_xmax - rct_xmin) * 0.3f;
int y_ofs = tab_v_pad;
@@ -1946,7 +1965,12 @@ void UI_panel_category_draw_all(ARegion *ar, const char *category_id_active)
immUniformColor3ubv(theme_col_tab_bg);
}
- immRecti(pos, v2d->mask.xmin, v2d->mask.ymin, v2d->mask.xmin + category_tabs_width, v2d->mask.ymax);
+ if (is_left) {
+ immRecti(pos, v2d->mask.xmin, v2d->mask.ymin, v2d->mask.xmin + category_tabs_width, v2d->mask.ymax);
+ }
+ else {
+ immRecti(pos, v2d->mask.xmax - category_tabs_width, v2d->mask.ymin, v2d->mask.xmax, v2d->mask.ymax);
+ }
if (is_alpha) {
GPU_blend(false);
@@ -1954,6 +1978,11 @@ void UI_panel_category_draw_all(ARegion *ar, const char *category_id_active)
immUnbindProgram();
+ const int divider_xmin =
+ is_left ? (v2d->mask.xmin + (category_tabs_width - px)) : (v2d->mask.xmax - category_tabs_width) + px;
+ const int divider_xmax =
+ is_left ? (v2d->mask.xmin + category_tabs_width) : (v2d->mask.xmax - (category_tabs_width + px)) + px;
+
for (pc_dyn = ar->panels_category.first; pc_dyn; pc_dyn = pc_dyn->next) {
const rcti *rct = &pc_dyn->rect;
const char *category_id = pc_dyn->idname;
@@ -1976,20 +2005,24 @@ void UI_panel_category_draw_all(ARegion *ar, const char *category_id_active)
if (is_active)
#endif
{
+ const bool use_flip_x = !is_left;
ui_panel_category_draw_tab(
true, rct->xmin, rct->ymin, rct->xmax, rct->ymax,
- tab_curve_radius - px, roundboxtype, true, true, NULL,
+ tab_curve_radius - px, roundboxtype, true, true, use_flip_x,
+ NULL,
is_active ? theme_col_tab_active : theme_col_tab_inactive);
/* tab outline */
ui_panel_category_draw_tab(
- false, rct->xmin - px, rct->ymin - px, rct->xmax - px, rct->ymax + px,
- tab_curve_radius, roundboxtype, true, true, NULL, theme_col_tab_outline);
+ false, rct->xmin - px_x_sign, rct->ymin - px, rct->xmax - px_x_sign, rct->ymax + px,
+ tab_curve_radius, roundboxtype, true, true, use_flip_x,
+ NULL,
+ theme_col_tab_outline);
/* tab highlight (3d look) */
ui_panel_category_draw_tab(
false, rct->xmin, rct->ymin, rct->xmax, rct->ymax,
- tab_curve_radius, roundboxtype, true, false,
+ tab_curve_radius, roundboxtype, true, false, use_flip_x,
is_active ? theme_col_back : theme_col_tab_inactive,
is_active ? theme_col_tab_highlight : theme_col_tab_highlight_inactive);
}
@@ -2000,11 +2033,11 @@ void UI_panel_category_draw_all(ARegion *ar, const char *category_id_active)
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
immUniformColor3ubv(theme_col_tab_divider);
- immRecti(pos, v2d->mask.xmin + category_tabs_width - px,
+ immRecti(pos,
+ divider_xmin,
rct->ymin - tab_v_pad,
- v2d->mask.xmin + category_tabs_width,
+ divider_xmax,
rct->ymax + tab_v_pad);
-
immUnbindProgram();
}
@@ -2031,16 +2064,18 @@ void UI_panel_category_draw_all(ARegion *ar, const char *category_id_active)
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
if (pc_dyn->prev == NULL) {
immUniformColor3ubv(theme_col_tab_divider);
- immRecti(pos, v2d->mask.xmin + category_tabs_width - px,
+ immRecti(pos,
+ divider_xmin,
rct->ymax + px,
- v2d->mask.xmin + category_tabs_width,
+ divider_xmax,
v2d->mask.ymax);
}
if (pc_dyn->next == NULL) {
immUniformColor3ubv(theme_col_tab_divider);
- immRecti(pos, v2d->mask.xmin + category_tabs_width - px,
+ immRecti(pos,
+ divider_xmin,
0,
- v2d->mask.xmin + category_tabs_width,
+ divider_xmax,
rct->ymin);
}
@@ -2059,7 +2094,12 @@ void UI_panel_category_draw_all(ARegion *ar, const char *category_id_active)
immUnbindProgram();
/* not essential, but allows events to be handled right up until the region edge [#38171] */
- pc_dyn->rect.xmin = v2d->mask.xmin;
+ if (is_left) {
+ pc_dyn->rect.xmin = v2d->mask.xmin;
+ }
+ else {
+ pc_dyn->rect.xmax = v2d->mask.xmax;
+ }
}
GPU_line_smooth(false);
@@ -2078,7 +2118,10 @@ void UI_panel_category_draw_all(ARegion *ar, const char *category_id_active)
static int ui_handle_panel_category_cycling(const wmEvent *event, ARegion *ar, const uiBut *active_but)
{
const bool is_mousewheel = ELEM(event->type, WHEELUPMOUSE, WHEELDOWNMOUSE);
- const bool inside_tabregion = (event->mval[0] < ((PanelCategoryDyn *)ar->panels_category.first)->rect.xmax);
+ const bool inside_tabregion = (
+ (ar->alignment != RGN_ALIGN_RIGHT) ?
+ (event->mval[0] < ((PanelCategoryDyn *)ar->panels_category.first)->rect.xmax) :
+ (event->mval[0] > ((PanelCategoryDyn *)ar->panels_category.first)->rect.xmin));
/* if mouse is inside non-tab region, ctrl key is required */
if (is_mousewheel && !event->ctrl && !inside_tabregion)
diff --git a/source/blender/editors/interface/interface_query.c b/source/blender/editors/interface/interface_query.c
index d0f7e1341de..d49a1a727aa 100644
--- a/source/blender/editors/interface/interface_query.c
+++ b/source/blender/editors/interface/interface_query.c
@@ -96,6 +96,14 @@ bool UI_but_is_tool(const uiBut *but)
return false;
}
+bool UI_but_has_tooltip_label(const uiBut *but)
+{
+ if ((but->drawstr[0] == '\0') && !ui_block_is_popover(but->block)) {
+ return UI_but_is_tool(but);
+ }
+ return false;
+}
+
/** \} */
/* -------------------------------------------------------------------- */
diff --git a/source/blender/editors/interface/interface_region_color_picker.c b/source/blender/editors/interface/interface_region_color_picker.c
index 00462b456ea..afa3486cf6c 100644
--- a/source/blender/editors/interface/interface_region_color_picker.c
+++ b/source/blender/editors/interface/interface_region_color_picker.c
@@ -629,6 +629,7 @@ uiBlock *ui_block_func_COLOR(bContext *C, uiPopupBlockHandle *handle, void *arg_
ui_block_colorpicker(block, handle->retvec, &but->rnapoin, but->rnaprop, show_picker);
block->flag = UI_BLOCK_LOOP | UI_BLOCK_KEEP_OPEN | UI_BLOCK_OUT_1 | UI_BLOCK_MOVEMOUSE_QUIT;
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
UI_block_bounds_set_normal(block, 0.5 * UI_UNIT_X);
block->block_event_func = ui_colorpicker_small_wheel_cb;
diff --git a/source/blender/editors/interface/interface_region_hud.c b/source/blender/editors/interface/interface_region_hud.c
index f3ff6fdf2c0..4b3d1980189 100644
--- a/source/blender/editors/interface/interface_region_hud.c
+++ b/source/blender/editors/interface/interface_region_hud.c
@@ -39,6 +39,7 @@
#include "BLI_rect.h"
#include "BLI_listbase.h"
#include "BLI_utildefines.h"
+#include "BLI_math_color.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -82,6 +83,14 @@ static bool last_redo_poll(const bContext *C)
return success;
}
+static void hud_region_hide(ARegion *ar)
+{
+ ar->flag |= RGN_FLAG_HIDDEN;
+ /* Avoids setting 'AREA_FLAG_REGION_SIZE_UPDATE'
+ * since other regions don't depend on this. */
+ BLI_rcti_init(&ar->winrct, 0, 0, 0, 0);
+}
+
/** \} */
/* -------------------------------------------------------------------- */
@@ -168,7 +177,7 @@ static void hud_region_layout(const bContext *C, ARegion *ar)
if (!ok) {
ED_region_tag_redraw(ar);
- ar->flag |= RGN_FLAG_HIDDEN;
+ hud_region_hide(ar);
return;
}
@@ -185,6 +194,10 @@ static void hud_region_layout(const bContext *C, ARegion *ar)
ar->winrct.ymax = (ar->winrct.ymin + ar->winy) - 1;
UI_view2d_region_reinit(v2d, V2D_COMMONVIEW_PANELS_UI, ar->winx, ar->winy);
+
+ /* Weak, but needed to avoid glitches, especially with hi-dpi (where resizing the view glitches often).
+ * Fortunately this only happens occasionally. */
+ ED_region_panels_layout(C, ar);
}
/* restore view matrix */
@@ -199,12 +212,20 @@ static void hud_region_draw(const bContext *C, ARegion *ar)
GPU_clear(GPU_COLOR_BIT);
if ((ar->flag & RGN_FLAG_HIDDEN) == 0) {
- float color[4];
- UI_GetThemeColor4fv(TH_BUTBACK, color);
- if ((U.uiflag2 & USER_REGION_OVERLAP) == 0) {
- color[3] = 1.0f;
+ if (0) {
+ /* Has alpha flickering glitch, see T56752. */
+ ui_draw_menu_back(NULL, NULL, &(rcti){.xmax = ar->winx, .ymax = ar->winy});
}
- ui_draw_widget_back_color(UI_WTYPE_BOX, false, &(rcti){.xmax = ar->winx, .ymax = ar->winy}, color);
+ else {
+ /* Use basic drawing instead. */
+ bTheme *btheme = UI_GetTheme();
+ float color[4];
+ rgba_uchar_to_float(color, (const uchar *)btheme->tui.wcol_menu_back.inner);
+ const float radius = U.widget_unit * btheme->tui.wcol_menu_back.roundness;
+ UI_draw_roundbox_corner_set(UI_CNR_ALL);
+ UI_draw_roundbox_4fv(true, 0, 0, ar->winx, ar->winy, radius, color);
+ }
+
ED_region_panels_draw(C, ar);
}
}
@@ -252,7 +273,7 @@ void ED_area_type_hud_clear(wmWindowManager *wm, ScrArea *sa_keep)
for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) {
if (ar->regiontype == RGN_TYPE_HUD) {
if ((ar->flag & RGN_FLAG_HIDDEN) == 0) {
- ar->flag |= RGN_FLAG_HIDDEN;
+ hud_region_hide(ar);
ED_region_tag_redraw(ar);
ED_area_tag_redraw(sa);
}
@@ -278,7 +299,7 @@ void ED_area_type_hud_ensure(bContext *C, ScrArea *sa)
if (!last_redo_poll(C)) {
if (ar) {
ED_region_tag_redraw(ar);
- ar->flag |= RGN_FLAG_HIDDEN;
+ hud_region_hide(ar);
}
return;
}
@@ -289,14 +310,6 @@ void ED_area_type_hud_ensure(bContext *C, ScrArea *sa)
ar->type = art;
}
- ED_region_init(ar);
- ED_region_tag_redraw(ar);
-
- /* Reset zoom level (not well supported). */
- ar->v2d.cur = ar->v2d.tot = (rctf){.xmax = ar->winx, .ymax = ar->winy};
- ar->v2d.minzoom = 1.0f;
- ar->v2d.maxzoom = 1.0f;
-
/* Let 'ED_area_update_region_sizes' do the work of placing the region.
* Otherwise we could set the 'ar->winrct' & 'ar->winx/winy' here. */
if (init) {
@@ -325,6 +338,20 @@ void ED_area_type_hud_ensure(bContext *C, ScrArea *sa)
}
}
+ if (init) {
+ /* This is needed or 'winrct' will be invalid. */
+ wmWindow *win = CTX_wm_window(C);
+ ED_area_update_region_sizes(wm, win, sa);
+ }
+
+ ED_region_init(ar);
+ ED_region_tag_redraw(ar);
+
+ /* Reset zoom level (not well supported). */
+ ar->v2d.cur = ar->v2d.tot = (rctf){.xmax = ar->winx, .ymax = ar->winy};
+ ar->v2d.minzoom = 1.0f;
+ ar->v2d.maxzoom = 1.0f;
+
/* XXX, should be handled in more general way. */
ar->visible = !((ar->flag & RGN_FLAG_HIDDEN) || (ar->flag & RGN_FLAG_TOO_SMALL));
@@ -334,6 +361,7 @@ void ED_area_type_hud_ensure(bContext *C, ScrArea *sa)
CTX_wm_region_set((bContext *)C, ar);
hud_region_layout(C, ar);
CTX_wm_region_set((bContext *)C, ar_prev);
+
}
/** \} */
diff --git a/source/blender/editors/interface/interface_region_menu_pie.c b/source/blender/editors/interface/interface_region_menu_pie.c
index 504e1807a8f..6887235f5db 100644
--- a/source/blender/editors/interface/interface_region_menu_pie.c
+++ b/source/blender/editors/interface/interface_region_menu_pie.c
@@ -87,6 +87,7 @@ static uiBlock *ui_block_func_PIE(bContext *UNUSED(C), uiPopupBlockHandle *handl
UI_block_layout_resolve(block, &width, &height);
UI_block_flag_enable(block, UI_BLOCK_LOOP | UI_BLOCK_NUMSELECT);
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
block->minbounds = minwidth;
block->bounds = 1;
diff --git a/source/blender/editors/interface/interface_region_menu_popup.c b/source/blender/editors/interface/interface_region_menu_popup.c
index b9222a75803..bdac03de86b 100644
--- a/source/blender/editors/interface/interface_region_menu_popup.c
+++ b/source/blender/editors/interface/interface_region_menu_popup.c
@@ -241,6 +241,7 @@ static uiBlock *ui_block_func_POPUP(bContext *C, uiPopupBlockHandle *handle, voi
uiBut *but_activate = NULL;
UI_block_flag_enable(block, UI_BLOCK_LOOP | UI_BLOCK_NUMSELECT);
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
UI_block_direction_set(block, direction);
/* offset the mouse position, possibly based on earlier selection */
diff --git a/source/blender/editors/interface/interface_region_popover.c b/source/blender/editors/interface/interface_region_popover.c
index 56ec61c5226..cb4939adc56 100644
--- a/source/blender/editors/interface/interface_region_popover.c
+++ b/source/blender/editors/interface/interface_region_popover.c
@@ -100,7 +100,15 @@ static void ui_popover_create_block(bContext *C, uiPopover *pup, int opcontext)
BLI_assert(pup->ui_size_x != 0);
uiStyle *style = UI_style_get_dpi();
+
pup->block = UI_block_begin(C, NULL, __func__, UI_EMBOSS);
+ UI_block_flag_enable(pup->block, UI_BLOCK_KEEP_OPEN | UI_BLOCK_POPOVER);
+#ifdef USE_UI_POPOVER_ONCE
+ if (pup->is_once) {
+ UI_block_flag_enable(pup->block, UI_BLOCK_POPOVER_ONCE);
+ }
+#endif
+
pup->layout = UI_block_layout(
pup->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0,
pup->ui_size_x, 0, MENU_PADDING, style);
@@ -139,12 +147,6 @@ static uiBlock *ui_block_func_POPOVER(bContext *C, uiPopupBlockHandle *handle, v
UI_block_region_set(block, handle->region);
UI_block_layout_resolve(block, &width, &height);
- UI_block_flag_enable(block, UI_BLOCK_KEEP_OPEN | UI_BLOCK_POPOVER);
-#ifdef USE_UI_POPOVER_ONCE
- if (pup->is_once) {
- UI_block_flag_enable(block, UI_BLOCK_POPOVER_ONCE);
- }
-#endif
UI_block_direction_set(block, UI_DIR_DOWN | UI_DIR_CENTER_X);
const int block_margin = U.widget_unit / 2;
@@ -197,6 +199,7 @@ static uiBlock *ui_block_func_POPOVER(bContext *C, uiPopupBlockHandle *handle, v
/* Not attached to a button. */
int offset[2] = {0, 0};
UI_block_flag_enable(block, UI_BLOCK_LOOP);
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
UI_block_direction_set(block, block->direction);
block->minbounds = UI_MENU_WIDTH_MIN;
bool use_place_under_active = !handle->refresh;
diff --git a/source/blender/editors/interface/interface_region_popup.c b/source/blender/editors/interface/interface_region_popup.c
index 1bbf2242c5d..b62857983df 100644
--- a/source/blender/editors/interface/interface_region_popup.c
+++ b/source/blender/editors/interface/interface_region_popup.c
@@ -116,7 +116,7 @@ static void ui_popup_block_position(wmWindow *window, ARegion *butregion, uiBut
BLI_rctf_init_minmax(&block->rect);
for (uiBut *bt = block->buttons.first; bt; bt = bt->next) {
- if (block->content_hints & BLOCK_CONTAINS_SUBMENU_BUT) {
+ if (block->content_hints & UI_BLOCK_CONTAINS_SUBMENU_BUT) {
bt->rect.xmax += UI_MENU_SUBMENU_PADDING;
}
BLI_rctf_union(&block->rect, &bt->rect);
@@ -514,6 +514,7 @@ uiBlock *ui_popup_block_refresh(
}
block->flag |= UI_BLOCK_LOOP;
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
/* defer this until blocks are translated (below) */
block->oldblock = NULL;
diff --git a/source/blender/editors/interface/interface_region_search.c b/source/blender/editors/interface/interface_region_search.c
index d262cbc38bd..48d59830c2a 100644
--- a/source/blender/editors/interface/interface_region_search.c
+++ b/source/blender/editors/interface/interface_region_search.c
@@ -533,8 +533,10 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiBut *but
data->prv_cols = but->a2;
}
- /* only show key shortcuts when needed (not rna buttons) [#36699] */
- if (but->rnaprop == NULL) {
+ /* Only show key shortcuts when needed (checking RNA prop pointer is useless here, a lot of buttons are about data
+ * without having that pointer defined, let's rather try with optype!). One can also enforce that behavior by
+ * setting UI_BUT_HAS_SHORTCUT drawflag of search button. */
+ if (but->optype != NULL || (but->drawflag & UI_BUT_HAS_SHORTCUT) != 0) {
data->use_sep = true;
}
@@ -753,6 +755,7 @@ ARegion *ui_searchbox_create_operator(bContext *C, ARegion *butregion, uiBut *bu
{
ARegion *ar;
+ UI_but_drawflag_enable(but, UI_BUT_HAS_SHORTCUT);
ar = ui_searchbox_create_generic(C, butregion, but);
ar->type->draw = ui_searchbox_region_draw_cb__operator;
diff --git a/source/blender/editors/interface/interface_region_tooltip.c b/source/blender/editors/interface/interface_region_tooltip.c
index ae6ab09a62a..8d7d67fb69f 100644
--- a/source/blender/editors/interface/interface_region_tooltip.c
+++ b/source/blender/editors/interface/interface_region_tooltip.c
@@ -45,6 +45,7 @@
#include "MEM_guardedalloc.h"
#include "DNA_userdef_types.h"
+#include "DNA_brush_types.h"
#include "BLI_math.h"
#include "BLI_string.h"
@@ -53,6 +54,7 @@
#include "BLI_utildefines.h"
#include "BKE_context.h"
+#include "BKE_paint.h"
#include "BKE_screen.h"
#include "WM_api.h"
@@ -328,7 +330,7 @@ static bool ui_tooltip_data_append_from_keymap(
.color_id = UI_TIP_LC_MAIN,
.is_pad = true,
});
- field->text = BLI_strdup(ot->description[0] ? ot->description : ot->name);
+ field->text = BLI_strdup(ot->description ? ot->description : ot->name);
}
/* Shortcut */
{
@@ -366,7 +368,7 @@ static bool ui_tooltip_data_append_from_keymap(
/**
* Special tool-system exception.
*/
-static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but)
+static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is_label)
{
if (but->optype == NULL) {
return NULL;
@@ -376,6 +378,11 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but)
return NULL;
}
+ /* Needed to get the space-data's type (below). */
+ if (CTX_wm_space_data(C) == NULL) {
+ return NULL;
+ }
+
char tool_name[MAX_NAME];
RNA_string_get(but->opptr, "name", tool_name);
BLI_assert(tool_name[0] != '\0');
@@ -387,56 +394,192 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but)
/* it turns out to be most simple to do this via Python since C
* doesn't have access to information about non-active tools.
*/
- char expr[256];
- /* Tip */
- {
+ /* Title (when icon-only). */
+ if (but->drawstr[0] == '\0') {
+ uiTooltipField *field = text_field_add(
+ data, &(uiTooltipFormat){
+ .style = UI_TIP_STYLE_NORMAL,
+ .color_id = UI_TIP_LC_MAIN,
+ .is_pad = true,
+ });
+ field->text = BLI_strdup(tool_name);
+ }
+
+ /* Tip. */
+ if (is_label == false) {
+ const char *expr_imports[] = {"bpy", "bl_ui", NULL};
+ char expr[256];
SNPRINTF(
expr,
- "__import__('bl_ui').space_toolsystem_common.description_from_name("
- "__import__('bpy').context, "
- "__import__('bpy').context.space_data.type, "
+ "bl_ui.space_toolsystem_common.description_from_name("
+ "bpy.context, "
+ "bpy.context.space_data.type, "
"'%s') + '.'",
tool_name);
char *expr_result = NULL;
- if (BPY_execute_string_as_string(C, expr, true, &expr_result)) {
- if (!STREQ(expr_result, ".")) {
- uiTooltipField *field = text_field_add(
- data, &(uiTooltipFormat){
- .style = UI_TIP_STYLE_NORMAL,
- .color_id = UI_TIP_LC_MAIN,
- .is_pad = true,
- });
- field->text = expr_result;
- }
- else {
+ bool is_error = false;
+ if (BPY_execute_string_as_string(C, expr_imports, expr, true, &expr_result)) {
+ if (STREQ(expr_result, ".")) {
MEM_freeN(expr_result);
+ expr_result = NULL;
+ }
+ }
+ else {
+ /* Note, this is an exceptional case, we could even remove it
+ * however there have been reports of tooltips failing, so keep it for now. */
+ expr_result = BLI_strdup("Internal error!");
+ is_error = true;
+ }
+
+ if (expr_result != NULL) {
+ uiTooltipField *field = text_field_add(
+ data, &(uiTooltipFormat){
+ .style = UI_TIP_STYLE_NORMAL,
+ .color_id = UI_TIP_LC_MAIN,
+ .is_pad = true,
+ });
+ field->text = expr_result;
+
+ if (UNLIKELY(is_error)) {
+ field->format.color_id = UI_TIP_LC_ALERT;
}
}
}
+ /* Shortcut. */
+ if (is_label == false && ((but->block->flag & UI_BLOCK_SHOW_SHORTCUT_ALWAYS) == 0)) {
+ /* There are different kinds of shortcuts:
+ *
+ * - Direct access to the tool (as if the toolbar button is pressed).
+ * - The key is bound to a brush type (not the exact brush name).
+ * - The key is assigned to the operator it's self (bypassing the tool, executing the operator).
+ *
+ * Either way case it's useful to show the shortcut.
+ */
+ char *shortcut = NULL;
+
+ {
+ uiStringInfo op_keymap = {BUT_GET_OP_KEYMAP, NULL};
+ UI_but_string_info_get(C, but, &op_keymap, NULL);
+ shortcut = op_keymap.strinfo;
+ }
+
+ if (shortcut == NULL) {
+ ePaintMode paint_mode = BKE_paintmode_get_active_from_context(C);
+ const char *tool_attr = BKE_paint_get_tool_prop_id_from_paintmode(paint_mode);
+ if (tool_attr != NULL) {
+ const EnumPropertyItem *items = BKE_paint_get_tool_enum_from_paintmode(paint_mode);
+ const int i = RNA_enum_from_name(items, tool_name);
+ if (i != -1) {
+ wmOperatorType *ot = WM_operatortype_find("paint.brush_select", true);
+ PointerRNA op_props;
+ WM_operator_properties_create_ptr(&op_props, ot);
+ RNA_enum_set(&op_props, "paint_mode", paint_mode);
+ RNA_enum_set(&op_props, tool_attr, items[i].value);
+
+ /* Check for direct access to the tool. */
+ char shortcut_brush[128] = "";
+ if (WM_key_event_operator_string(
+ C, ot->idname, WM_OP_INVOKE_REGION_WIN, op_props.data, true,
+ shortcut_brush, ARRAY_SIZE(shortcut_brush)))
+ {
+ shortcut = BLI_strdup(shortcut_brush);
+ }
+ WM_operator_properties_free(&op_props);
+ }
+ }
+ }
+
+ if (shortcut == NULL) {
+ /* Check for direct access to the tool. */
+ char shortcut_toolbar[128] = "";
+ if (WM_key_event_operator_string(
+ C, "WM_OT_toolbar", WM_OP_INVOKE_REGION_WIN, NULL, true,
+ shortcut_toolbar, ARRAY_SIZE(shortcut_toolbar)))
+ {
+ /* Generate keymap in order to inspect it.
+ * Note, we could make a utility to avoid the keymap generation part of this. */
+ const char *expr_imports[] = {"bpy", "bl_ui", NULL};
+ const char *expr = (
+ "getattr("
+ "bl_ui.space_toolsystem_common.keymap_from_context("
+ "bpy.context, "
+ "bpy.context.space_data.type), "
+ "'as_pointer', lambda: 0)()");
+
+ intptr_t expr_result = 0;
+ if (BPY_execute_string_as_intptr(C, expr_imports, expr, true, &expr_result)) {
+ if (expr_result != 0) {
+ wmKeyMap *keymap = (wmKeyMap *)expr_result;
+ for (wmKeyMapItem *kmi = keymap->items.first; kmi; kmi = kmi->next) {
+ if (STREQ(kmi->idname, but->optype->idname)) {
+ char tool_name_test[MAX_NAME];
+ RNA_string_get(kmi->ptr, "name", tool_name_test);
+ if (STREQ(tool_name, tool_name_test)) {
+ char buf[128];
+ WM_keymap_item_to_string(kmi, false, buf, sizeof(buf));
+ shortcut = BLI_sprintfN("%s, %s", shortcut_toolbar, buf);
+ break;
+ }
+ }
+ }
+ }
+ }
+ else {
+ BLI_assert(0);
+ }
+ }
+ }
+
+ if (shortcut != NULL) {
+ uiTooltipField *field = text_field_add(
+ data, &(uiTooltipFormat){
+ .style = UI_TIP_STYLE_NORMAL,
+ .color_id = UI_TIP_LC_VALUE,
+ .is_pad = true,
+ });
+ field->text = BLI_sprintfN(TIP_("Shortcut: %s"), shortcut);
+ MEM_freeN(shortcut);
+ }
+ }
+
/* Keymap */
/* This is too handy not to expose somehow, let's be sneaky for now. */
- if (CTX_wm_window(C)->eventstate->shift) {
+ if ((is_label == false) && CTX_wm_window(C)->eventstate->shift) {
+ const char *expr_imports[] = {"bpy", "bl_ui", NULL};
+ char expr[256];
SNPRINTF(
expr,
"getattr("
- "__import__('bl_ui').space_toolsystem_common.keymap_from_name("
- "__import__('bpy').context, "
- "__import__('bpy').context.space_data.type, "
+ "bl_ui.space_toolsystem_common.keymap_from_name("
+ "bpy.context, "
+ "bpy.context.space_data.type, "
"'%s'), "
"'as_pointer', lambda: 0)()",
tool_name);
intptr_t expr_result = 0;
- if (BPY_execute_string_as_intptr(C, expr, true, &expr_result)) {
+ if (BPY_execute_string_as_intptr(C, expr_imports, expr, true, &expr_result)) {
if (expr_result != 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("Tool Keymap:");
+ }
wmKeyMap *keymap = (wmKeyMap *)expr_result;
ui_tooltip_data_append_from_keymap(C, data, keymap);
}
}
+ else {
+ BLI_assert(0);
+ }
}
#endif /* WITH_PYTHON */
@@ -714,7 +857,7 @@ static uiTooltipData *ui_tooltip_data_from_gizmo(bContext *C, wmGizmo *gz)
const struct {
int part;
const char *prefix;
- } mpop_actions[] = {
+ } gzop_actions[] = {
{
.part = gz->highlight_part,
.prefix = use_drag ? TIP_("Click") : NULL,
@@ -724,19 +867,19 @@ static uiTooltipData *ui_tooltip_data_from_gizmo(bContext *C, wmGizmo *gz)
},
};
- for (int i = 0; i < ARRAY_SIZE(mpop_actions); i++) {
- wmGizmoOpElem *mpop = (mpop_actions[i].part != -1) ? WM_gizmo_operator_get(gz, mpop_actions[i].part) : NULL;
- if (mpop != NULL) {
+ for (int i = 0; i < ARRAY_SIZE(gzop_actions); i++) {
+ wmGizmoOpElem *gzop = (gzop_actions[i].part != -1) ? WM_gizmo_operator_get(gz, gzop_actions[i].part) : NULL;
+ if (gzop != NULL) {
/* Description */
- const char *info = RNA_struct_ui_description(mpop->type->srna);
+ const char *info = RNA_struct_ui_description(gzop->type->srna);
if (!(info && info[0])) {
- info = RNA_struct_ui_name(mpop->type->srna);
+ info = RNA_struct_ui_name(gzop->type->srna);
}
if (info && info[0]) {
char *text = NULL;
- if (mpop_actions[i].prefix != NULL) {
- text = BLI_sprintfN("%s: %s", mpop_actions[i].prefix, info);
+ if (gzop_actions[i].prefix != NULL) {
+ text = BLI_sprintfN("%s: %s", gzop_actions[i].prefix, info);
}
else {
text = BLI_strdup(info);
@@ -756,10 +899,10 @@ static uiTooltipData *ui_tooltip_data_from_gizmo(bContext *C, wmGizmo *gz)
/* Shortcut */
{
bool found = false;
- IDProperty *prop = mpop->ptr.data;
+ IDProperty *prop = gzop->ptr.data;
char buf[128];
if (WM_key_event_operator_string(
- C, mpop->type->idname, WM_OP_INVOKE_DEFAULT, prop, true,
+ C, gzop->type->idname, WM_OP_INVOKE_DEFAULT, prop, true,
buf, ARRAY_SIZE(buf)))
{
found = true;
@@ -809,18 +952,18 @@ static uiTooltipData *ui_tooltip_data_from_gizmo(bContext *C, wmGizmo *gz)
static ARegion *ui_tooltip_create_with_data(
bContext *C, uiTooltipData *data,
- const float init_position[2],
+ const float init_position[2], const rcti *init_rect_overlap,
const float aspect)
{
const float pad_px = UI_TIP_PADDING;
wmWindow *win = CTX_wm_window(C);
const int winx = WM_window_pixels_x(win);
+ const int winy = WM_window_pixels_y(win);
uiStyle *style = UI_style_get();
static ARegionType type;
ARegion *ar;
int fonth, fontw;
int h, i;
- rctf rect_fl;
rcti rect_i;
int font_flag = 0;
@@ -900,36 +1043,131 @@ static ARegion *ui_tooltip_create_with_data(
data->toth = fonth;
data->lineh = h;
- /* compute position */
-
- rect_fl.xmin = init_position[0] - TIP_BORDER_X;
- rect_fl.xmax = rect_fl.xmin + fontw + pad_px;
- rect_fl.ymax = init_position[1] - TIP_BORDER_Y;
- rect_fl.ymin = rect_fl.ymax - fonth - TIP_BORDER_Y;
-
- BLI_rcti_rctf_copy(&rect_i, &rect_fl);
+ /* Compute position. */
+ {
+ rctf rect_fl;
+ rect_fl.xmin = init_position[0] - TIP_BORDER_X;
+ rect_fl.xmax = rect_fl.xmin + fontw + pad_px;
+ rect_fl.ymax = init_position[1] - TIP_BORDER_Y;
+ rect_fl.ymin = rect_fl.ymax - fonth - TIP_BORDER_Y;
+ BLI_rcti_rctf_copy(&rect_i, &rect_fl);
+ }
#undef TIP_BORDER_X
#undef TIP_BORDER_Y
- /* clip with window boundaries */
- if (rect_i.xmax > winx) {
- /* super size */
- if (rect_i.xmax > winx + rect_i.xmin) {
- rect_i.xmax = winx;
- rect_i.xmin = 0;
+// #define USE_ALIGN_Y_CENTER
+
+ /* Clamp to window bounds. */
+ {
+ /* Ensure at least 5 px above screen bounds
+ * UI_UNIT_Y is just a guess to be above the menu item */
+ if (init_rect_overlap != NULL) {
+ const int pad = max_ff(1.0f, U.pixelsize) * 5;
+ const rcti init_rect = {
+ .xmin = init_rect_overlap->xmin - pad,
+ .xmax = init_rect_overlap->xmax + pad,
+ .ymin = init_rect_overlap->ymin - pad,
+ .ymax = init_rect_overlap->ymax + pad,
+ };
+ const rcti rect_clamp = {
+ .xmin = 0,
+ .xmax = winx,
+ .ymin = 0,
+ .ymax = winy,
+ };
+ /* try right. */
+ const int size_x = BLI_rcti_size_x(&rect_i);
+ const int size_y = BLI_rcti_size_y(&rect_i);
+ const int cent_overlap_x = BLI_rcti_cent_x(&init_rect);
+#ifdef USE_ALIGN_Y_CENTER
+ const int cent_overlap_y = BLI_rcti_cent_y(&init_rect);
+#endif
+ struct {
+ rcti xpos;
+ rcti xneg;
+ rcti ypos;
+ rcti yneg;
+ } rect;
+
+ { /* xpos */
+ rcti r = rect_i;
+ r.xmin = init_rect.xmax;
+ r.xmax = r.xmin + size_x;
+#ifdef USE_ALIGN_Y_CENTER
+ r.ymin = cent_overlap_y - (size_y / 2);
+ r.ymax = r.ymin + size_y;
+#else
+ r.ymin = init_rect.ymax - BLI_rcti_size_y(&rect_i);
+ r.ymax = init_rect.ymax;
+ r.ymin -= UI_POPUP_MARGIN;
+ r.ymax -= UI_POPUP_MARGIN;
+#endif
+ rect.xpos = r;
+ }
+ { /* xneg */
+ rcti r = rect_i;
+ r.xmin = init_rect.xmin - size_x;
+ r.xmax = r.xmin + size_x;
+#ifdef USE_ALIGN_Y_CENTER
+ r.ymin = cent_overlap_y - (size_y / 2);
+ r.ymax = r.ymin + size_y;
+#else
+ r.ymin = init_rect.ymax - BLI_rcti_size_y(&rect_i);
+ r.ymax = init_rect.ymax;
+ r.ymin -= UI_POPUP_MARGIN;
+ r.ymax -= UI_POPUP_MARGIN;
+#endif
+ rect.xneg = r;
+ }
+ { /* ypos */
+ rcti r = rect_i;
+ r.xmin = cent_overlap_x - (size_x / 2);
+ r.xmax = r.xmin + size_x;
+ r.ymin = init_rect.ymax;
+ r.ymax = r.ymin + size_y;
+ rect.ypos = r;
+ }
+ { /* yneg */
+ rcti r = rect_i;
+ r.xmin = cent_overlap_x - (size_x / 2);
+ r.xmax = r.xmin + size_x;
+ r.ymin = init_rect.ymin - size_y;
+ r.ymax = r.ymin + size_y;
+ rect.yneg = r;
+ }
+
+ bool found = false;
+ for (int j = 0; j < 4; j++) {
+ const rcti *r = (&rect.xpos) + j;
+ if (BLI_rcti_inside_rcti(&rect_clamp, r)) {
+ rect_i = *r;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ /* Fallback, we could pick the best fallback, for now just use xpos. */
+ int offset_dummy[2];
+ rect_i = rect.xpos;
+ BLI_rcti_clamp(&rect_i, &rect_clamp, offset_dummy);
+ }
+
}
else {
- rect_i.xmin -= rect_i.xmax - winx;
- rect_i.xmax = winx;
+ const int pad = max_ff(1.0f, U.pixelsize) * 5;
+ const rcti rect_clamp = {
+ .xmin = pad,
+ .xmax = winx - pad,
+ .ymin = pad + (UI_UNIT_Y * 2),
+ .ymax = winy - pad,
+ };
+ int offset_dummy[2];
+ BLI_rcti_clamp(&rect_i, &rect_clamp, offset_dummy);
}
}
- /* ensure at least 5 px above screen bounds
- * 25 is just a guess to be above the menu item */
- if (rect_i.ymin < 5) {
- rect_i.ymax += (-rect_i.ymin) + 30;
- rect_i.ymin = 30;
- }
+
+#undef USE_ALIGN_Y_CENTER
/* add padding */
BLI_rcti_resize(&rect_i,
@@ -938,7 +1176,11 @@ static ARegion *ui_tooltip_create_with_data(
/* widget rect, in region coords */
{
+ /* Compensate for margin offset, visually this corrects the position. */
const int margin = UI_POPUP_MARGIN;
+ if (init_rect_overlap != NULL) {
+ BLI_rcti_translate(&rect_i, margin, margin / 2);
+ }
data->bbox.xmin = margin;
data->bbox.xmax = BLI_rcti_size_x(&rect_i) - margin;
@@ -968,7 +1210,7 @@ static ARegion *ui_tooltip_create_with_data(
* \{ */
-ARegion *UI_tooltip_create_from_button(bContext *C, ARegion *butregion, uiBut *but)
+ARegion *UI_tooltip_create_from_button(bContext *C, ARegion *butregion, uiBut *but, bool is_label)
{
wmWindow *win = CTX_wm_window(C);
/* aspect values that shrink text are likely unreadable */
@@ -981,7 +1223,7 @@ ARegion *UI_tooltip_create_from_button(bContext *C, ARegion *butregion, uiBut *b
uiTooltipData *data = NULL;
if (data == NULL) {
- data = ui_tooltip_data_from_tool(C, but);
+ data = ui_tooltip_data_from_tool(C, but, is_label);
}
if (data == NULL) {
@@ -992,15 +1234,33 @@ ARegion *UI_tooltip_create_from_button(bContext *C, ARegion *butregion, uiBut *b
return NULL;
}
- init_position[0] = BLI_rctf_cent_x(&but->rect);
- init_position[1] = but->rect.ymin;
-
- if (butregion) {
- ui_block_to_window_fl(butregion, but->block, &init_position[0], &init_position[1]);
- init_position[0] = win->eventstate->x;
+ const bool is_no_overlap = UI_but_has_tooltip_label(but) || UI_but_is_tool(but);
+ rcti init_rect;
+ if (is_no_overlap) {
+ rctf overlap_rect_fl;
+ init_position[0] = BLI_rctf_cent_x(&but->rect);
+ init_position[1] = BLI_rctf_cent_y(&but->rect);
+ if (butregion) {
+ ui_block_to_window_fl(butregion, but->block, &init_position[0], &init_position[1]);
+ ui_block_to_window_rctf(butregion, but->block, &overlap_rect_fl, &but->rect);
+ }
+ else {
+ overlap_rect_fl = but->rect;
+ }
+ BLI_rcti_rctf_copy_round(&init_rect, &overlap_rect_fl);
+ }
+ else {
+ init_position[0] = BLI_rctf_cent_x(&but->rect);
+ init_position[1] = but->rect.ymin - (UI_POPUP_MARGIN / 2);
+ if (butregion) {
+ ui_block_to_window_fl(butregion, but->block, &init_position[0], &init_position[1]);
+ init_position[0] = win->eventstate->x;
+ }
}
- return ui_tooltip_create_with_data(C, data, init_position, aspect);
+ ARegion *ar = ui_tooltip_create_with_data(C, data, init_position, is_no_overlap ? &init_rect : NULL, aspect);
+
+ return ar;
}
ARegion *UI_tooltip_create_from_gizmo(bContext *C, wmGizmo *gz)
@@ -1017,7 +1277,7 @@ ARegion *UI_tooltip_create_from_gizmo(bContext *C, wmGizmo *gz)
init_position[0] = win->eventstate->x;
init_position[1] = win->eventstate->y;
- return ui_tooltip_create_with_data(C, data, init_position, aspect);
+ return ui_tooltip_create_with_data(C, data, init_position, NULL, aspect);
}
void UI_tooltip_free(bContext *C, bScreen *sc, ARegion *ar)
diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c
index 16c3e01e7aa..738da4184b7 100644
--- a/source/blender/editors/interface/interface_style.c
+++ b/source/blender/editors/interface/interface_style.c
@@ -94,11 +94,11 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name, short uifont_id
style->paneltitle.uifont_id = uifont_id;
style->paneltitle.points = 12;
style->paneltitle.kerning = 1;
- style->paneltitle.shadow = 1;
+ style->paneltitle.shadow = 3;
style->paneltitle.shadx = 0;
style->paneltitle.shady = -1;
- style->paneltitle.shadowalpha = 0.15f;
- style->paneltitle.shadowcolor = 1.0f;
+ style->paneltitle.shadowalpha = 0.5f;
+ style->paneltitle.shadowcolor = 0.0f;
style->grouplabel.uifont_id = uifont_id;
style->grouplabel.points = 12;
@@ -106,7 +106,8 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name, short uifont_id
style->grouplabel.shadow = 3;
style->grouplabel.shadx = 0;
style->grouplabel.shady = -1;
- style->grouplabel.shadowalpha = 0.25f;
+ style->grouplabel.shadowalpha = 0.5f;
+ style->grouplabel.shadowcolor = 0.0f;
style->widgetlabel.uifont_id = uifont_id;
style->widgetlabel.points = 11;
@@ -114,13 +115,16 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name, short uifont_id
style->widgetlabel.shadow = 3;
style->widgetlabel.shadx = 0;
style->widgetlabel.shady = -1;
- style->widgetlabel.shadowalpha = 0.15f;
- style->widgetlabel.shadowcolor = 1.0f;
+ style->widgetlabel.shadowalpha = 0.5f;
+ style->widgetlabel.shadowcolor = 0.0f;
style->widget.uifont_id = uifont_id;
style->widget.points = 11;
style->widget.kerning = 1;
- style->widget.shadowalpha = 0.25f;
+ style->widget.shadow = 1;
+ style->widget.shady = -1;
+ style->widget.shadowalpha = 0.5f;
+ style->widget.shadowcolor = 0.0f;
style->columnspace = 8;
style->templatespace = 5;
@@ -179,7 +183,8 @@ void UI_fontstyle_draw_ex(
}
else {
/* draw from boundbox center */
- yofs = ceil(0.5f * (BLI_rcti_size_y(rect) - BLF_ascender(fs->uifont_id)));
+ float height = BLF_ascender(fs->uifont_id) + BLF_descender(fs->uifont_id);
+ yofs = ceil(0.5f * (BLI_rcti_size_y(rect) - height));
}
if (fs->align == UI_STYLE_TEXT_CENTER) {
@@ -225,7 +230,7 @@ void UI_fontstyle_draw_rotated(const uiFontStyle *fs, const rcti *rect, const ch
UI_fontstyle_set(fs);
- height = BLF_ascender(fs->uifont_id);
+ height = BLF_ascender(fs->uifont_id) + BLF_descender(fs->uifont_id);
/* becomes x-offset when rotated */
xofs = ceil(0.5f * (BLI_rcti_size_y(rect) - height));
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index c5a5d5f945b..bfb879bc183 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -50,6 +50,7 @@
#include "BLI_math.h"
#include "BLI_listbase.h"
#include "BLI_fnmatch.h"
+#include "BLI_path_util.h"
#include "BLI_timecode.h"
#include "BLF_api.h"
@@ -70,8 +71,8 @@
#include "BKE_modifier.h"
#include "BKE_object.h"
#include "BKE_packedFile.h"
-#include "BKE_particle.h"
#include "BKE_paint.h"
+#include "BKE_particle.h"
#include "BKE_report.h"
#include "BKE_screen.h"
#include "BKE_shader_fx.h"
@@ -89,6 +90,8 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "BLO_readfile.h"
+
#include "UI_interface.h"
#include "UI_interface_icons.h"
#include "interface_intern.h"
@@ -186,6 +189,7 @@ static uiBlock *template_common_search_menu(
block = UI_block_begin(C, region, "_popup", UI_EMBOSS);
UI_block_flag_enable(block, UI_BLOCK_LOOP | UI_BLOCK_SEARCH_MENU);
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
/* preview thumbnails */
if (preview_rows > 0 && preview_cols > 0) {
@@ -293,11 +297,11 @@ static bool id_search_add(
}
if (*str == '\0' || BLI_strcasestr(id->name + 2, str)) {
- /* +1 is needed because BKE_id_ui_prefix used 3 letter prefix
- * followed by ID_NAME-2 characters from id->name
+ /* +1 is needed because BKE_id_ui_prefix uses 3 letter prefix
+ * followed by ID_NAME-2 characters from id->name.
*/
- char name_ui[MAX_ID_NAME + 1];
- BKE_id_ui_prefix(name_ui, id);
+ char name_ui[MAX_ID_FULL_NAME];
+ BKE_id_full_name_ui_prefix_get(name_ui, id);
int iconid = ui_id_icon_get(C, id, template_ui->preview);
@@ -424,7 +428,7 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
TemplateID *template_ui = (TemplateID *)arg_litem;
PointerRNA idptr = RNA_property_pointer_get(&template_ui->ptr, template_ui->prop);
ID *id = idptr.data;
- int event = GET_INT_FROM_POINTER(arg_event);
+ int event = POINTER_AS_INT(arg_event);
switch (event) {
case UI_ID_BROWSE:
@@ -459,7 +463,7 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
case UI_ID_LOCAL:
if (id) {
Main *bmain = CTX_data_main(C);
- if (CTX_wm_window(C)->eventstate->shift) {
+ if (BKE_override_static_is_enabled() && CTX_wm_window(C)->eventstate->shift) {
ID *override_id = BKE_override_static_create_from_id(bmain, id);
if (override_id != NULL) {
BKE_main_id_clear_newpoins(bmain);
@@ -619,15 +623,16 @@ static uiBut *template_id_def_new_but(
if (newop) {
but = uiDefIconTextButO(
- block, but_type, newop, WM_OP_INVOKE_DEFAULT, ICON_ZOOMIN,
+ block, but_type, newop, WM_OP_INVOKE_DEFAULT, (id && !use_tab_but) ? ICON_DUPLICATE : ICON_ADD,
(id) ? "" : CTX_IFACE_(template_id_context(type), "New"), 0, 0, w, but_height, NULL);
- UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), SET_INT_IN_POINTER(UI_ID_ADD_NEW));
+ UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_ADD_NEW));
}
else {
but = uiDefIconTextBut(
- block, but_type, 0, ICON_ZOOMIN, (id) ? "" : CTX_IFACE_(template_id_context(type), "New"),
+ block, but_type, 0, (id && !use_tab_but) ? ICON_DUPLICATE : ICON_ADD,
+ (id) ? "" : CTX_IFACE_(template_id_context(type), "New"),
0, 0, w, but_height, NULL, 0, 0, 0, 0, NULL);
- UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), SET_INT_IN_POINTER(UI_ID_ADD_NEW));
+ UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_ADD_NEW));
}
if ((idfrom && idfrom->lib) || !editable) {
@@ -644,7 +649,7 @@ static uiBut *template_id_def_new_but(
static void template_ID(
bContext *C, uiLayout *layout, TemplateID *template_ui, StructRNA *type, int flag,
const char *newop, const char *openop, const char *unlinkop,
- const bool live_icon)
+ const bool live_icon, const bool hide_buttons)
{
uiBut *but;
uiBlock *block;
@@ -682,7 +687,7 @@ static void template_ID(
but = uiDefButR(
block, UI_BTYPE_TEXT, 0, name, 0, 0, TEMPLATE_SEARCH_TEXTBUT_WIDTH, TEMPLATE_SEARCH_TEXTBUT_HEIGHT,
&idptr, "name", -1, 0, 0, -1, -1, RNA_struct_ui_description(type));
- UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), SET_INT_IN_POINTER(UI_ID_RENAME));
+ UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_RENAME));
if (user_alert) UI_but_flag_enable(but, UI_BUT_REDALERT);
if (id->lib) {
@@ -705,7 +710,7 @@ static void template_ID(
UI_but_flag_enable(but, UI_BUT_DISABLED);
}
else {
- UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), SET_INT_IN_POINTER(UI_ID_LOCAL));
+ UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_LOCAL));
}
}
}
@@ -714,14 +719,14 @@ static void template_ID(
block, UI_BTYPE_BUT, 0, ICON_LIBRARY_DATA_OVERRIDE, 0, 0, UI_UNIT_X, UI_UNIT_Y,
NULL, 0, 0, 0, 0,
TIP_("Static override of linked library data-block, click to make fully local"));
- UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), SET_INT_IN_POINTER(UI_ID_OVERRIDE));
+ UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_OVERRIDE));
}
- if (id->us > 1) {
+ if ((ID_REAL_USERS(id) > 1) && (hide_buttons == false)) {
char numstr[32];
short numstr_len;
- numstr_len = BLI_snprintf(numstr, sizeof(numstr), "%d", id->us);
+ numstr_len = BLI_snprintf(numstr, sizeof(numstr), "%d", ID_REAL_USERS(id));
but = uiDefBut(
block, UI_BTYPE_BUT, 0, numstr, 0, 0,
@@ -729,7 +734,7 @@ static void template_ID(
TIP_("Display number of users of this data (click to make a single-user copy)"));
but->flag |= UI_BUT_UNDO;
- UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), SET_INT_IN_POINTER(UI_ID_ALONE));
+ UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_ALONE));
if (/* test only */
(id_copy(CTX_data_main(C), id, NULL, true) == false) ||
(idfrom && idfrom->lib) ||
@@ -741,14 +746,20 @@ static void template_ID(
}
}
- if (user_alert) UI_but_flag_enable(but, UI_BUT_REDALERT);
+ if (user_alert) {
+ UI_but_flag_enable(but, UI_BUT_REDALERT);
+ }
- if (id->lib == NULL && !(ELEM(GS(id->name), ID_GR, ID_SCE, ID_SCR, ID_TXT, ID_OB, ID_WS))) {
- uiDefButR(block, UI_BTYPE_TOGGLE, 0, "F", 0, 0, UI_UNIT_X, UI_UNIT_Y, &idptr, "use_fake_user", -1, 0, 0, -1, -1, NULL);
+ if (id->lib == NULL && !(ELEM(GS(id->name), ID_GR, ID_SCE, ID_SCR, ID_TXT, ID_OB, ID_WS)) &&
+ (hide_buttons == false))
+ {
+ uiDefIconButR(
+ block, UI_BTYPE_ICON_TOGGLE, 0, ICON_FAKE_USER_OFF, 0, 0, UI_UNIT_X, UI_UNIT_Y,
+ &idptr, "use_fake_user", -1, 0, 0, -1, -1, NULL);
}
}
- if (flag & UI_ID_ADD_NEW) {
+ if ((flag & UI_ID_ADD_NEW) && (hide_buttons == false)) {
template_id_def_new_but(block, id, template_ui, type, newop, editable, flag & UI_ID_OPEN, false, UI_UNIT_X);
}
@@ -769,15 +780,15 @@ static void template_ID(
if (openop) {
but = uiDefIconTextButO(
- block, UI_BTYPE_BUT, openop, WM_OP_INVOKE_DEFAULT, ICON_FILESEL, (id) ? "" : IFACE_("Open"),
+ block, UI_BTYPE_BUT, openop, WM_OP_INVOKE_DEFAULT, ICON_FILEBROWSER, (id) ? "" : IFACE_("Open"),
0, 0, w, UI_UNIT_Y, NULL);
- UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), SET_INT_IN_POINTER(UI_ID_OPEN));
+ UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_OPEN));
}
else {
but = uiDefIconTextBut(
- block, UI_BTYPE_BUT, 0, ICON_FILESEL, (id) ? "" : IFACE_("Open"), 0, 0, w, UI_UNIT_Y,
+ block, UI_BTYPE_BUT, 0, ICON_FILEBROWSER, (id) ? "" : IFACE_("Open"), 0, 0, w, UI_UNIT_Y,
NULL, 0, 0, 0, 0, NULL);
- UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), SET_INT_IN_POINTER(UI_ID_OPEN));
+ UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_OPEN));
}
if ((idfrom && idfrom->lib) || !editable)
@@ -786,7 +797,7 @@ static void template_ID(
/* delete button */
/* don't use RNA_property_is_unlink here */
- if (id && (flag & UI_ID_DELETE)) {
+ if (id && (flag & UI_ID_DELETE) && (hide_buttons == false)) {
/* allow unlink if 'unlinkop' is passed, even when 'PROP_NEVER_UNLINK' is set */
but = NULL;
@@ -801,7 +812,7 @@ static void template_ID(
block, UI_BTYPE_BUT, 0, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0,
TIP_("Unlink data-block "
"(Shift + Click to set users to zero, data will then not be saved)"));
- UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), SET_INT_IN_POINTER(UI_ID_DELETE));
+ UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_DELETE));
if (RNA_property_flag(template_ui->prop) & PROP_NEVER_NULL) {
UI_but_flag_enable(but, UI_BUT_DISABLED);
@@ -837,19 +848,23 @@ ID *UI_context_active_but_get_tab_ID(bContext *C)
static void template_ID_tabs(
bContext *C, uiLayout *layout, TemplateID *template, StructRNA *type, int flag,
- const char *newop, const char *UNUSED(openop), const char *menu)
+ const char *newop, const char *menu)
{
const ARegion *region = CTX_wm_region(C);
const PointerRNA active_ptr = RNA_property_pointer_get(&template->ptr, template->prop);
MenuType *mt = WM_menutype_find(menu, false);
- const int but_align = (region->alignment == RGN_ALIGN_TOP) ? UI_BUT_ALIGN_DOWN : UI_BUT_ALIGN_TOP;
+ const int but_align = ui_but_align_opposite_to_area_align_get(region);
const int but_height = UI_UNIT_Y * 1.1;
uiBlock *block = uiLayoutGetBlock(layout);
uiStyle *style = UI_style_get_dpi();
- for (ID *id = template->idlb->first; id; id = id->next) {
+ ListBase ordered;
+ BKE_id_ordered_list(&ordered, template->idlb);
+
+ for (LinkData *link = ordered.first; link; link = link->next) {
+ ID *id = link->data;
const int name_width = UI_fontstyle_string_width(&style->widgetlabel, id->name + 2);
const int but_width = name_width + UI_UNIT_X;
@@ -859,11 +874,14 @@ static void template_ID_tabs(
sizeof(id->name) - 2, 0.0f, 0.0f, "");
UI_but_funcN_set(&tab->but, template_ID_set_property_cb, MEM_dupallocN(template), id);
tab->but.custom_data = (void *)id;
+ tab->but.dragpoin = id;
tab->menu = mt;
UI_but_drawflag_enable(&tab->but, but_align);
}
+ BLI_freelistN(&ordered);
+
if (flag & UI_ID_ADD_NEW) {
const bool editable = RNA_property_editable(&template->ptr, template->prop);
uiBut *but;
@@ -882,7 +900,7 @@ static void ui_template_id(
PointerRNA *ptr, const char *propname,
const char *newop, const char *openop, const char *unlinkop,
int flag, int prv_rows, int prv_cols, int filter, bool use_tabs,
- float scale, bool live_icon)
+ float scale, const bool live_icon, const bool hide_buttons)
{
TemplateID *template_ui;
PropertyRNA *prop;
@@ -926,11 +944,13 @@ static void ui_template_id(
if (template_ui->idlb) {
if (use_tabs) {
uiLayoutRow(layout, true);
- template_ID_tabs(C, layout, template_ui, type, flag, newop, openop, unlinkop);
+ template_ID_tabs(C, layout, template_ui, type, flag, newop, unlinkop);
}
else {
uiLayoutRow(layout, true);
- template_ID(C, layout, template_ui, type, flag, newop, openop, unlinkop, live_icon);
+ template_ID(
+ C, layout, template_ui, type, flag, newop, openop,
+ unlinkop, live_icon, hide_buttons);
}
}
@@ -946,7 +966,7 @@ void uiTemplateID(
layout, C, ptr, propname,
newop, openop, unlinkop,
UI_ID_BROWSE | UI_ID_RENAME | UI_ID_DELETE,
- 0, 0, filter, false, 1.0f, live_icon);
+ 0, 0, filter, false, 1.0f, live_icon, false);
}
void uiTemplateIDBrowse(
@@ -957,18 +977,19 @@ void uiTemplateIDBrowse(
layout, C, ptr, propname,
newop, openop, unlinkop,
UI_ID_BROWSE | UI_ID_RENAME,
- 0, 0, filter, false, 1.0f, false);
+ 0, 0, filter, false, 1.0f, false, false);
}
void uiTemplateIDPreview(
uiLayout *layout, bContext *C, PointerRNA *ptr, const char *propname, const char *newop,
- const char *openop, const char *unlinkop, int rows, int cols, int filter)
+ const char *openop, const char *unlinkop, int rows, int cols, int filter,
+ const bool hide_buttons)
{
ui_template_id(
layout, C, ptr, propname,
newop, openop, unlinkop,
UI_ID_BROWSE | UI_ID_RENAME | UI_ID_DELETE | UI_ID_PREVIEWS,
- rows, cols, filter, false, 1.0f, false);
+ rows, cols, filter, false, 1.0f, false, hide_buttons);
}
void uiTemplateGpencilColorPreview(
@@ -979,7 +1000,7 @@ void uiTemplateGpencilColorPreview(
layout, C, ptr, propname,
NULL, NULL, NULL,
UI_ID_BROWSE | UI_ID_PREVIEWS | UI_ID_DELETE,
- rows, cols, filter, false, scale < 0.5f ? 0.5f : scale, false);
+ rows, cols, filter, false, scale < 0.5f ? 0.5f : scale, false, false);
}
/**
@@ -988,14 +1009,14 @@ void uiTemplateGpencilColorPreview(
void uiTemplateIDTabs(
uiLayout *layout, bContext *C,
PointerRNA *ptr, const char *propname,
- const char *newop, const char *openop, const char *unlinkop,
+ const char *newop, const char *unlinkop,
int filter)
{
ui_template_id(
layout, C, ptr, propname,
- newop, openop, unlinkop,
- UI_ID_BROWSE | UI_ID_RENAME | UI_ID_DELETE,
- 0, 0, filter, true, 1.0f, false);
+ newop, NULL, unlinkop,
+ UI_ID_BROWSE | UI_ID_RENAME,
+ 0, 0, filter, true, 1.0f, false, false);
}
/************************ ID Chooser Template ***************************/
@@ -1153,7 +1174,7 @@ static void template_search_buttons(
template_search_add_button_searchmenu(C, layout, block, template_search, editable, false);
template_search_add_button_name(block, &active_ptr, type);
- template_search_add_button_operator(block, newop, WM_OP_INVOKE_DEFAULT, ICON_ZOOMIN, editable);
+ template_search_add_button_operator(block, newop, WM_OP_INVOKE_DEFAULT, ICON_DUPLICATE, editable);
template_search_add_button_operator(block, unlinkop, WM_OP_INVOKE_REGION_WIN, ICON_X, editable);
UI_block_align_end(block);
@@ -1463,10 +1484,10 @@ static uiLayout *draw_modifier(
uiItemO(row, "", ICON_X, "OBJECT_OT_modifier_remove");
}
else if (modifier_is_simulation(md) == 1) {
- uiItemStringO(row, "", ICON_BUTS, "WM_OT_properties_context_change", "context", "PHYSICS");
+ uiItemStringO(row, "", ICON_PROPERTIES, "WM_OT_properties_context_change", "context", "PHYSICS");
}
else if (modifier_is_simulation(md) == 2) {
- uiItemStringO(row, "", ICON_BUTS, "WM_OT_properties_context_change", "context", "PARTICLES");
+ uiItemStringO(row, "", ICON_PROPERTIES, "WM_OT_properties_context_change", "context", "PARTICLES");
}
UI_block_emboss_set(block, UI_EMBOSS);
}
@@ -1561,7 +1582,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
/* find modifier and draw it */
cageIndex = modifiers_getCageIndex(scene, ob, &lastCageIndex, 0);
- /* XXX virtual modifiers are not accesible for python */
+ /* XXX virtual modifiers are not accessible for python */
vmd = modifiers_getVirtualModifierList(ob, &virtualModifierData);
for (i = 0; vmd; i++, vmd = vmd->next) {
@@ -1646,9 +1667,13 @@ static uiLayout *gpencil_draw_modifier(
UI_block_lock_set(block, BKE_object_obdata_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
uiLayoutSetOperatorContext(row, WM_OP_INVOKE_DEFAULT);
- uiItemEnumO(row, "OBJECT_OT_gpencil_modifier_apply", CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Apply"),
- 0, "apply_as", MODIFIER_APPLY_DATA);
+ sub = uiLayoutRow(row, false);
+ if (mti->flags & eGpencilModifierTypeFlag_NoApply) {
+ uiLayoutSetEnabled(sub, false);
+ }
+ uiItemEnumO(sub, "OBJECT_OT_gpencil_modifier_apply", CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Apply"),
+ 0, "apply_as", MODIFIER_APPLY_DATA);
uiItemO(row, CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Copy"), ICON_NONE,
"OBJECT_OT_gpencil_modifier_copy");
@@ -1995,7 +2020,7 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
UI_block_emboss_set(block, UI_EMBOSS_NONE);
/* draw a ghost icon (for proxy) and also a lock beside it, to show that constraint is "proxy locked" */
- uiDefIconBut(block, UI_BTYPE_BUT, B_CONSTRAINT_TEST, ICON_GHOST, xco + 12.2f * UI_UNIT_X, yco, 0.95f * UI_UNIT_X, 0.95f * UI_UNIT_Y,
+ uiDefIconBut(block, UI_BTYPE_BUT, B_CONSTRAINT_TEST, ICON_GHOST_ENABLED, xco + 12.2f * UI_UNIT_X, yco, 0.95f * UI_UNIT_X, 0.95f * UI_UNIT_Y,
NULL, 0.0, 0.0, 0.0, 0.0, TIP_("Proxy Protected"));
uiDefIconBut(block, UI_BTYPE_BUT, B_CONSTRAINT_TEST, ICON_LOCKED, xco + 13.1f * UI_UNIT_X, yco, 0.95f * UI_UNIT_X, 0.95f * UI_UNIT_Y,
NULL, 0.0, 0.0, 0.0, 0.0, TIP_("Proxy Protected"));
@@ -2006,11 +2031,11 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
short prev_proxylock, show_upbut, show_downbut;
/* Up/Down buttons:
- * Proxy-constraints are not allowed to occur after local (non-proxy) constraints
- * as that poses problems when restoring them, so disable the "up" button where
- * it may cause this situation.
+ * Proxy-constraints are not allowed to occur after local (non-proxy) constraints
+ * as that poses problems when restoring them, so disable the "up" button where
+ * it may cause this situation.
*
- * Up/Down buttons should only be shown (or not grayed - todo) if they serve some purpose.
+ * Up/Down buttons should only be shown (or not grayed - todo) if they serve some purpose.
*/
if (BKE_constraints_proxylocked_owner(ob, pchan)) {
if (con->prev) {
@@ -2350,13 +2375,13 @@ static void colorband_buttons_layout(
row = uiLayoutRow(split, false);
bt = uiDefIconTextBut(
- block, UI_BTYPE_BUT, 0, ICON_ZOOMIN, "", 0, 0, 2.0f * unit, UI_UNIT_Y, NULL,
+ block, UI_BTYPE_BUT, 0, ICON_ADD, "", 0, 0, 2.0f * unit, UI_UNIT_Y, NULL,
0, 0, 0, 0, TIP_("Add a new color stop to the colorband"));
UI_but_funcN_set(bt, colorband_add_cb, MEM_dupallocN(cb), coba);
bt = uiDefIconTextBut(
- block, UI_BTYPE_BUT, 0, ICON_ZOOMOUT, "", xs + 2.0f * unit, ys + UI_UNIT_Y, 2.0f * unit, UI_UNIT_Y,
+ block, UI_BTYPE_BUT, 0, ICON_REMOVE, "", xs + 2.0f * unit, ys + UI_UNIT_Y, 2.0f * unit, UI_UNIT_Y,
NULL, 0, 0, 0, 0, TIP_("Delete the active position"));
UI_but_funcN_set(bt, colorband_del_cb, MEM_dupallocN(cb), coba);
@@ -2510,6 +2535,7 @@ static uiBlock *ui_icon_view_menu_cb(bContext *C, ARegion *ar, void *arg_litem)
block = UI_block_begin(C, ar, "_popup", UI_EMBOSS_PULLDOWN);
UI_block_flag_enable(block, UI_BLOCK_LOOP | UI_BLOCK_NO_FLIP);
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
RNA_property_enum_items(C, &args.ptr, args.prop, &item, NULL, &free);
@@ -2780,7 +2806,7 @@ static uiBlock *curvemap_clipping_func(bContext *C, ARegion *ar, void *cumap_v)
block = UI_block_begin(C, ar, __func__, UI_EMBOSS);
- /* use this for a fake extra empy space around the buttons */
+ /* use this for a fake extra empty space around the buttons */
uiDefBut(block, UI_BTYPE_LABEL, 0, "", -4, 16, width + 8, 6 * UI_UNIT_Y, NULL, 0, 0, 0, 0, "");
bt = uiDefButBitI(
@@ -2965,7 +2991,7 @@ static void curvemap_buttons_layout(
if (tone) {
split = uiLayoutSplit(layout, 0.0f, false);
- uiItemR(uiLayoutRow(split, false), ptr, "tone", 0, NULL, ICON_NONE);
+ uiItemR(uiLayoutRow(split, false), ptr, "tone", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
}
/* curve chooser */
@@ -3047,14 +3073,14 @@ static void curvemap_buttons_layout(
UI_but_func_set(bt, curvemap_buttons_zoom_out, cumap, NULL);
if (brush)
- bt = uiDefIconBlockBut(block, curvemap_brush_tools_func, cumap, 0, ICON_MODIFIER, 0, 0, dx, dx, TIP_("Tools"));
+ bt = uiDefIconBlockBut(block, curvemap_brush_tools_func, cumap, 0, ICON_DOWNARROW_HLT, 0, 0, dx, dx, TIP_("Tools"));
else if (neg_slope)
bt = uiDefIconBlockBut(
- block, curvemap_tools_negslope_func, cumap, 0, ICON_MODIFIER,
+ block, curvemap_tools_negslope_func, cumap, 0, ICON_DOWNARROW_HLT,
0, 0, dx, dx, TIP_("Tools"));
else
bt = uiDefIconBlockBut(
- block, curvemap_tools_posslope_func, cumap, 0, ICON_MODIFIER,
+ block, curvemap_tools_posslope_func, cumap, 0, ICON_DOWNARROW_HLT,
0, 0, dx, dx, TIP_("Tools"));
UI_but_funcN_set(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
@@ -3297,8 +3323,8 @@ void uiTemplatePalette(uiLayout *layout, PointerRNA *ptr, const char *propname,
col = uiLayoutColumn(layout, true);
uiLayoutRow(col, true);
- uiDefIconButO(block, UI_BTYPE_BUT, "PALETTE_OT_color_add", WM_OP_INVOKE_DEFAULT, ICON_ZOOMIN, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
- uiDefIconButO(block, UI_BTYPE_BUT, "PALETTE_OT_color_delete", WM_OP_INVOKE_DEFAULT, ICON_ZOOMOUT, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
+ uiDefIconButO(block, UI_BTYPE_BUT, "PALETTE_OT_color_add", WM_OP_INVOKE_DEFAULT, ICON_ADD, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
+ uiDefIconButO(block, UI_BTYPE_BUT, "PALETTE_OT_color_delete", WM_OP_INVOKE_DEFAULT, ICON_REMOVE, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
col = uiLayoutColumn(layout, true);
uiLayoutRow(col, true);
@@ -3344,7 +3370,7 @@ void uiTemplateCryptoPicker(uiLayout *layout, PointerRNA *ptr, const char *propn
static void handle_layer_buttons(bContext *C, void *arg1, void *arg2)
{
uiBut *but = arg1;
- int cur = GET_INT_FROM_POINTER(arg2);
+ int cur = POINTER_AS_INT(arg2);
wmWindow *win = CTX_wm_window(C);
int i, tot, shift = win->eventstate->shift;
@@ -3428,7 +3454,7 @@ void uiTemplateLayers(
icon = ICON_LAYER_USED;
but = uiDefAutoButR(block, ptr, prop, layer, "", icon, 0, 0, UI_UNIT_X / 2, UI_UNIT_Y / 2);
- UI_but_func_set(but, handle_layer_buttons, but, SET_INT_IN_POINTER(layer));
+ UI_but_func_set(but, handle_layer_buttons, but, POINTER_FROM_INT(layer));
but->type = UI_BTYPE_TOGGLE;
}
}
@@ -3462,7 +3488,7 @@ static void uilist_draw_item_default(
}
}
-static void uilist_draw_filter_default(struct uiList *ui_list, struct bContext *UNUSED(C), struct uiLayout *layout)
+static void uilist_draw_filter_default(struct uiList *ui_list, struct bContext *UNUSED(C), struct uiLayout *layout, bool reverse)
{
PointerRNA listptr;
uiLayout *row, *subrow;
@@ -3476,10 +3502,13 @@ static void uilist_draw_filter_default(struct uiList *ui_list, struct bContext *
uiItemR(subrow, &listptr, "use_filter_invert", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "",
(ui_list->filter_flag & UILST_FLT_EXCLUDE) ? ICON_ZOOM_OUT : ICON_ZOOM_IN);
- subrow = uiLayoutRow(row, true);
- uiItemR(subrow, &listptr, "use_filter_sort_alpha", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
- uiItemR(subrow, &listptr, "use_filter_sort_reverse", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "",
- (ui_list->filter_sort_flag & UILST_FLT_SORT_REVERSE) ? ICON_TRIA_UP : ICON_TRIA_DOWN);
+ /* a reverse list, cannot sort or invert order in filter */
+ if (!reverse) {
+ subrow = uiLayoutRow(row, true);
+ uiItemR(subrow, &listptr, "use_filter_sort_alpha", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+ uiItemR(subrow, &listptr, "use_filter_sort_reverse", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "",
+ (ui_list->filter_sort_flag & UILST_FLT_SORT_REVERSE) ? ICON_SORT_DESC : ICON_SORT_ASC);
+ }
}
typedef struct {
@@ -3702,7 +3731,7 @@ static char *uilist_item_tooltip_func(bContext *UNUSED(C), void *argN, const cha
void uiTemplateList(
uiLayout *layout, bContext *C, const char *listtype_name, const char *list_id,
PointerRNA *dataptr, const char *propname, PointerRNA *active_dataptr, const char *active_propname,
- const char *item_dyntip_propname, int rows, int maxrows, int layout_type, int columns)
+ const char *item_dyntip_propname, int rows, int maxrows, int layout_type, int columns, bool reverse)
{
uiListType *ui_list_type;
uiList *ui_list = NULL;
@@ -3823,6 +3852,19 @@ void uiTemplateList(
MEM_SAFE_FREE(dyn_data->items_filter_neworder);
dyn_data->items_len = dyn_data->items_shown = -1;
+ /* if reverse, enable reverse and forced flag */
+ if (reverse) {
+ ui_list->filter_sort_flag |= UILST_FLT_SORT_REVERSE;
+ ui_list->filter_sort_flag |= UILST_FLT_FORCED_REVERSE;
+ }
+ else {
+ /* if it was forced, disable forced flag to restore all normal behavior */
+ if (ui_list->filter_sort_flag & UILST_FLT_FORCED_REVERSE) {
+ ui_list->filter_sort_flag &= ~UILST_FLT_SORT_REVERSE;
+ ui_list->filter_sort_flag &= ~UILST_FLT_FORCED_REVERSE;
+ }
+ }
+
/* When active item changed since last draw, scroll to it. */
if (activei != ui_list->list_last_activei) {
ui_list->flag |= UILST_SCROLL_TO_ACTIVE_ITEM;
@@ -4100,7 +4142,7 @@ void uiTemplateList(
subblock = uiLayoutGetBlock(col);
uiDefBut(subblock, UI_BTYPE_SEPR, 0, "", 0, 0, UI_UNIT_X, UI_UNIT_Y * 0.05f, NULL, 0.0, 0.0, 0, 0, "");
- draw_filter(ui_list, C, col);
+ draw_filter(ui_list, C, col, reverse);
}
else {
but = uiDefIconButBitI(subblock, UI_BTYPE_TOGGLE, UILST_FLT_SHOW, 0, ICON_DISCLOSURE_TRI_RIGHT, 0, 0,
@@ -4259,23 +4301,22 @@ eAutoPropButsReturn uiTemplateOperatorPropertyButs(
op->properties = IDP_New(IDP_GROUP, &val, "wmOperatorProperties");
}
- if (flag & UI_TEMPLATE_OP_PROPS_SHOW_TITLE) {
- uiItemL(layout, RNA_struct_ui_name(op->type->srna), ICON_NONE);
- }
-
/* poll() on this operator may still fail, at the moment there is no nice feedback when this happens
* just fails silently */
if (!WM_operator_repeat_check(C, op)) {
UI_block_lock_set(block, true, "Operator can't' redo");
-
- /* XXX, could give some nicer feedback or not show redo panel at all? */
- uiItemL(layout, IFACE_("* Redo Unsupported *"), ICON_NONE);
+ return return_info;
}
else {
/* useful for macros where only one of the steps can't be re-done */
UI_block_lock_clear(block);
}
+ if (flag & UI_TEMPLATE_OP_PROPS_SHOW_TITLE) {
+ uiItemL(layout, RNA_struct_ui_name(op->type->srna), ICON_NONE);
+ }
+
+
/* menu */
if (op->type->flag & OPTYPE_PRESET) {
/* XXX, no simple way to get WM_MT_operator_presets.bl_label from python! Label remains the same always! */
@@ -4288,10 +4329,10 @@ eAutoPropButsReturn uiTemplateOperatorPropertyButs(
uiItemM(row, "WM_MT_operator_presets", NULL, ICON_NONE);
wmOperatorType *ot = WM_operatortype_find("WM_OT_operator_preset_add", false);
- uiItemFullO_ptr(row, ot, "", ICON_ZOOMIN, NULL, WM_OP_INVOKE_DEFAULT, 0, &op_ptr);
+ uiItemFullO_ptr(row, ot, "", ICON_ADD, NULL, WM_OP_INVOKE_DEFAULT, 0, &op_ptr);
RNA_string_set(&op_ptr, "operator", op->type->idname);
- uiItemFullO_ptr(row, ot, "", ICON_ZOOMOUT, NULL, WM_OP_INVOKE_DEFAULT, 0, &op_ptr);
+ uiItemFullO_ptr(row, ot, "", ICON_REMOVE, NULL, WM_OP_INVOKE_DEFAULT, 0, &op_ptr);
RNA_string_set(&op_ptr, "operator", op->type->idname);
RNA_boolean_set(&op_ptr, "remove_active", true);
}
@@ -4470,7 +4511,7 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
owner = sa;
}
handle_event = B_STOPFILE;
- icon = ICON_FILESEL;
+ icon = ICON_FILEBROWSER;
}
else {
Scene *scene;
@@ -4495,7 +4536,7 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
*/
if (sa->spacetype != SPACE_NODE) {
handle_event = B_STOPOTHER;
- icon = ICON_IMAGE_COL;
+ icon = ICON_IMAGE;
break;
}
}
@@ -4563,9 +4604,11 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
UI_but_func_tooltip_set(but_progress, progress_tooltip_func, tip_arg);
}
- uiDefIconTextBut(block, UI_BTYPE_BUT, handle_event, ICON_PANEL_CLOSE,
- "", 0, 0, UI_UNIT_X, UI_UNIT_Y,
- NULL, 0.0f, 0.0f, 0, 0, TIP_("Stop this job"));
+ if (!wm->is_interface_locked) {
+ uiDefIconTextBut(block, UI_BTYPE_BUT, handle_event, ICON_PANEL_CLOSE,
+ "", 0, 0, UI_UNIT_X, UI_UNIT_Y,
+ NULL, 0.0f, 0.0f, 0, 0, TIP_("Stop this job"));
+ }
}
if (screen->animtimer)
@@ -4601,23 +4644,20 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C)
UI_fontstyle_set(&style->widgetlabel);
width = BLF_width(style->widgetlabel.uifont_id, report->message, report->len);
width = min_ii((int)(rti->widthfac * width), width);
- width = max_ii(width, 10);
+ 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 */
- rgb_float_to_uchar(but->col, rti->col);
- but->col[3] = 255;
+ rgba_float_to_uchar(but->col, rti->col);
but = uiDefBut(block, UI_BTYPE_ROUNDBOX, 0, "", UI_UNIT_X + 5, 0, UI_UNIT_X + width, UI_UNIT_Y,
NULL, 0.0f, 0.0f, 0, 0, "");
+ rgba_float_to_uchar(but->col, rti->col);
UI_block_align_end(block);
- UI_GetThemeColorShade3ubv(TH_BACK, 20, but->col);
- but->col[3] = 255;
-
/* icon and report message on top */
icon = UI_icon_from_report_type(report->type);
@@ -4953,3 +4993,20 @@ void uiTemplateCacheFile(uiLayout *layout, bContext *C, PointerRNA *ptr, const c
uiItemR(row, &fileptr, "up_axis", 0, "Up Axis", ICON_NONE);
#endif
}
+
+/******************************* Recent Files *******************************/
+
+int uiTemplateRecentFiles(uiLayout *layout, int rows)
+{
+ const RecentFile *recent;
+ int i;
+
+ for (recent = G.recent_files.first, i = 0; (i < rows) && (recent); recent = recent->next, i++) {
+ const char *filename = BLI_path_basename(recent->filepath);
+ uiItemStringO(layout, filename,
+ BLO_has_bfile_extension(filename) ? ICON_FILE_BLEND : ICON_FILE_BACKUP,
+ "WM_OT_open_mainfile", "filepath", recent->filepath);
+ }
+
+ return i;
+}
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c
index 60aa79e1093..d74bfe93f2f 100644
--- a/source/blender/editors/interface/interface_utils.c
+++ b/source/blender/editors/interface/interface_utils.c
@@ -43,6 +43,7 @@
#include "BLT_translation.h"
+#include "BKE_library.h"
#include "BKE_report.h"
#include "MEM_guardedalloc.h"
@@ -120,7 +121,7 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind
but = uiDefButR_prop(block, UI_BTYPE_TEXT, 0, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
if (RNA_property_flag(prop) & PROP_TEXTEDIT_UPDATE) {
- /* TEXTEDIT_UPDATE is usally used for search buttons. For these we also want
+ /* TEXTEDIT_UPDATE is usually used for search buttons. For these we also want
* the 'x' icon to clear search string, so setting VALUE_CLEAR flag, too. */
UI_but_flag_enable(but, UI_BUT_TEXTEDIT_UPDATE | UI_BUT_VALUE_CLEAR);
}
@@ -270,22 +271,28 @@ void ui_rna_collection_search_cb(const struct bContext *C, void *arg, const char
continue;
}
- name = RNA_struct_name_get_alloc(&itemptr, NULL, 0, NULL); /* could use the string length here */
iconid = 0;
if (itemptr.type && RNA_struct_is_ID(itemptr.type)) {
+ name = MEM_malloc_arrayN(MAX_ID_FULL_NAME, sizeof(*name), __func__);
+ BKE_id_full_name_ui_prefix_get(name, itemptr.data);
iconid = ui_id_icon_get(C, itemptr.data, false);
}
+ else {
+ name = RNA_struct_name_get_alloc(&itemptr, NULL, 0, NULL); /* could use the string length here */
+ }
if (name) {
if (skip_filter || BLI_strcasestr(name, str)) {
cis = MEM_callocN(sizeof(CollItemSearch), "CollectionItemSearch");
cis->data = itemptr.data;
- cis->name = MEM_dupallocN(name);
+ cis->name = name; /* Still ownership of that memory. */
cis->index = i;
cis->iconid = iconid;
BLI_addtail(items_list, cis);
}
- MEM_freeN(name);
+ else {
+ MEM_freeN(name);
+ }
}
i++;
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 2296c3bc39d..ea588c703c6 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -940,7 +940,7 @@ static void widget_draw_vertex_buffer(unsigned int pos, unsigned int col, int mo
immBegin(mode, totvert);
for (int i = 0; i < totvert; ++i) {
if (quads_col)
- immAttrib4ubv(col, quads_col[i]);
+ immAttr4ubv(col, quads_col[i]);
immVertex2fv(pos, quads_pos[i]);
}
immEnd();
@@ -1171,13 +1171,15 @@ static void draw_widgetbase_batch(GPUBatch *batch, uiWidgetBase *wtb)
float checker_params[3] = {UI_ALPHA_CHECKER_DARK / 255.0f, UI_ALPHA_CHECKER_LIGHT / 255.0f, 8.0f};
/* draw single */
GPU_batch_program_set_builtin(batch, GPU_SHADER_2D_WIDGET_BASE);
- GPU_batch_uniform_4fv_array(batch, "parameters", 11, (float *)&wtb->uniform_params);
+ GPU_batch_uniform_4fv_array(batch, "parameters", MAX_WIDGET_PARAMETERS, (float *)&wtb->uniform_params);
GPU_batch_uniform_3fv(batch, "checkerColorAndSize", checker_params);
GPU_batch_draw(batch);
}
}
-static void widgetbase_draw(uiWidgetBase *wtb, const uiWidgetColors *wcol)
+static void widgetbase_draw_ex(
+ uiWidgetBase *wtb, const uiWidgetColors *wcol,
+ bool show_alpha_checkers)
{
unsigned char inner_col1[4] = {0};
unsigned char inner_col2[4] = {0};
@@ -1185,7 +1187,9 @@ static void widgetbase_draw(uiWidgetBase *wtb, const uiWidgetColors *wcol)
unsigned char outline_col[4] = {0};
unsigned char tria_col[4] = {0};
/* For color widget. */
- bool alpha_check = (wcol->alpha_check && (wcol->shaded == 0));
+ if (wcol->shaded != 0) {
+ show_alpha_checkers = false;
+ }
GPU_blend(true);
@@ -1224,8 +1228,8 @@ static void widgetbase_draw(uiWidgetBase *wtb, const uiWidgetColors *wcol)
}
/* Draw everything in one drawcall */
- if (inner_col1[3] || inner_col2[3] || outline_col[3] || emboss_col[3] || tria_col[3] || alpha_check) {
- widgetbase_set_uniform_colors_ubv(wtb, inner_col1, inner_col2, outline_col, emboss_col, tria_col, alpha_check);
+ if (inner_col1[3] || inner_col2[3] || outline_col[3] || emboss_col[3] || tria_col[3] || show_alpha_checkers) {
+ widgetbase_set_uniform_colors_ubv(wtb, inner_col1, inner_col2, outline_col, emboss_col, tria_col, show_alpha_checkers);
GPUBatch *roundbox_batch = ui_batch_roundbox_widget_get(wtb->tria1.type);
draw_widgetbase_batch(roundbox_batch, wtb);
@@ -1234,6 +1238,11 @@ static void widgetbase_draw(uiWidgetBase *wtb, const uiWidgetColors *wcol)
GPU_blend(false);
}
+static void widgetbase_draw(uiWidgetBase *wtb, const uiWidgetColors *wcol)
+{
+ widgetbase_draw_ex(wtb, wcol, false);
+}
+
/* *********************** text/icon ************************************** */
#define UI_TEXT_CLIP_MARGIN (0.25f * U.widget_unit / but->block->aspect)
@@ -1268,9 +1277,9 @@ static int ui_but_draw_menu_icon(const uiBut *but)
/* icons have been standardized... and this call draws in untransformed coordinates */
-static void widget_draw_icon_ex(
+static void widget_draw_icon(
const uiBut *but, BIFIconID icon, float alpha,
- const rcti *rect, const int icon_size)
+ const rcti *rect, const char mono_color[4])
{
float xs = 0.0f, ys = 0.0f;
float aspect, height;
@@ -1286,13 +1295,13 @@ static void widget_draw_icon_ex(
if (icon == ICON_BLANK1 && (but->flag & UI_BUT_ICON_SUBMENU) == 0) return;
aspect = but->block->aspect / UI_DPI_FAC;
- height = icon_size / aspect;
+ height = ICON_DEFAULT_HEIGHT / aspect;
/* calculate blend color */
if (ELEM(but->type, UI_BTYPE_TOGGLE, UI_BTYPE_ROW, UI_BTYPE_TOGGLE_N, UI_BTYPE_LISTROW)) {
if (but->flag & UI_SELECT) {}
else if (but->flag & UI_ACTIVE) {}
- else alpha = 0.5f;
+ else alpha = 0.75f;
}
else if ((but->type == UI_BTYPE_LABEL)) {
/* extra feature allows more alpha blending */
@@ -1334,26 +1343,20 @@ static void widget_draw_icon_ex(
/* to indicate draggable */
if (but->dragpoin && (but->flag & UI_ACTIVE)) {
float rgb[3] = {1.25f, 1.25f, 1.25f};
- UI_icon_draw_aspect_color(xs, ys, icon, aspect, rgb);
+ UI_icon_draw_aspect_color(xs, ys, icon, aspect, rgb, mono_color);
}
else if ((but->flag & (UI_ACTIVE | UI_SELECT | UI_SELECT_DRAW)) || !UI_but_is_tool(but)) {
- UI_icon_draw_aspect(xs, ys, icon, aspect, alpha);
+ UI_icon_draw_aspect(xs, ys, icon, aspect, alpha, mono_color);
}
else {
const bTheme *btheme = UI_GetTheme();
- UI_icon_draw_desaturate(xs, ys, icon, aspect, alpha, 1.0 - btheme->tui.icon_saturation);
+ UI_icon_draw_desaturate(xs, ys, icon, aspect, alpha, 1.0 - btheme->tui.icon_saturation, mono_color);
}
}
GPU_blend(false);
}
-static void widget_draw_icon(
- const uiBut *but, BIFIconID icon, float alpha, const rcti *rect)
-{
- widget_draw_icon_ex(but, icon, alpha, rect, ICON_DEFAULT_HEIGHT);
-}
-
static void widget_draw_submenu_tria(const uiBut *but, const rcti *rect, const uiWidgetColors *wcol)
{
const float aspect = but->block->aspect / UI_DPI_FAC;
@@ -1453,7 +1456,7 @@ float UI_text_clip_middle_ex(
strwidth = BLF_width(fstyle->uifont_id, str, max_len);
if ((okwidth > 0.0f) && (strwidth > okwidth)) {
- /* utf8 ellipsis '..', some compilers complain */
+ /* utf8 two-dots leader '..' (shorter than ellipsis '...'), some compilers complain with real litteral string. */
const char sep[] = {0xe2, 0x80, 0xA5, 0x0};
const int sep_len = sizeof(sep) - 1;
const float sep_strwidth = BLF_width(fstyle->uifont_id, sep, sep_len + 1);
@@ -1518,6 +1521,16 @@ float UI_text_clip_middle_ex(
memmove(str + l_end + sep_len, str + r_offset, r_len);
memcpy(str + l_end, sep, sep_len);
final_lpart_len = (size_t)(l_end + sep_len + r_len - 1); /* -1 to remove trailing '\0'! */
+
+ while (BLF_width(fstyle->uifont_id, str, max_len) > okwidth) {
+ /* This will happen because a lot of string width processing is done in integer pixels,
+ * which can introduce a rather high error in the end (about 2 pixels or so).
+ * Only one char removal shall ever be needed in real-life situation... */
+ r_len--;
+ final_lpart_len--;
+ char *c = str + l_end + sep_len;
+ memmove(c, c + 1, r_len);
+ }
}
}
@@ -1975,7 +1988,7 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
}
fixedbuf[ul_index] = '\0';
- ul_advance = BLF_width(fstyle->uifont_id, fixedbuf, ul_index);
+ ul_advance = BLF_width(fstyle->uifont_id, fixedbuf, ul_index) + (1.0f * UI_DPI_FAC);
BLF_position(fstyle->uifont_id, rect->xmin + font_xofs + ul_advance, rect->ymin + font_yofs, 0.0f);
BLF_color4ubv(fstyle->uifont_id, (unsigned char *)wcol->text);
@@ -2003,6 +2016,21 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
}
}
+static BIFIconID widget_icon_id(uiBut *but)
+{
+ if (!(but->flag & UI_HAS_ICON)) {
+ return ICON_NONE;
+ }
+
+ /* Consecutive icons can be toggle between. */
+ if (but->drawflag & UI_BUT_ICON_REVERSE) {
+ return but->icon - but->iconadd;
+ }
+ else {
+ return but->icon + but->iconadd;
+ }
+}
+
/* draws text and icons for buttons */
static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *but, rcti *rect)
{
@@ -2017,7 +2045,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
if (ELEM(but->type, UI_BTYPE_MENU, UI_BTYPE_POPOVER) && (but->flag & UI_BUT_NODE_LINK)) {
rcti temp = *rect;
temp.xmin = rect->xmax - BLI_rcti_size_y(rect) - 1;
- widget_draw_icon(but, ICON_LAYER_USED, alpha, &temp);
+ widget_draw_icon(but, ICON_LAYER_USED, alpha, &temp, wcol->text);
rect->xmax = temp.xmin;
}
@@ -2026,7 +2054,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
/* Big previews with optional text label below */
if (but->flag & UI_BUT_ICON_PREVIEW && ui_block_is_menu(but->block)) {
- const BIFIconID icon = (but->flag & UI_HAS_ICON) ? but->icon + but->iconadd : ICON_NONE;
+ const BIFIconID icon = widget_icon_id(but);
int icon_size = BLI_rcti_size_y(rect);
int text_size = 0;
@@ -2063,9 +2091,10 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
}
#endif
- const BIFIconID icon = (but->flag & UI_HAS_ICON) ? but->icon + but->iconadd : ICON_NONE;
+ const BIFIconID icon = widget_icon_id(but);
int icon_size_init = is_tool ? ICON_DEFAULT_HEIGHT_TOOLBAR : ICON_DEFAULT_HEIGHT;
const float icon_size = icon_size_init / (but->block->aspect / UI_DPI_FAC);
+ const float icon_padding = 2 * UI_DPI_FAC;
#ifdef USE_UI_TOOLBAR_HACK
if (is_tool) {
@@ -2085,11 +2114,11 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
rect->xmin += 0.3f * U.widget_unit;
}
else if (ui_block_is_menu(but->block))
- rect->xmin += 0.3f * U.widget_unit;
+ rect->xmin += 0.2f * U.widget_unit;
- widget_draw_icon(but, icon, alpha, rect);
+ widget_draw_icon(but, icon, alpha, rect, wcol->text);
if (show_menu_icon) {
- BLI_assert(but->block->content_hints & BLOCK_CONTAINS_SUBMENU_BUT);
+ BLI_assert(but->block->content_hints & UI_BLOCK_CONTAINS_SUBMENU_BUT);
widget_draw_submenu_tria(but, rect, wcol);
}
@@ -2097,7 +2126,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
but->block->aspect = aspect_orig;
#endif
- rect->xmin += icon_size;
+ rect->xmin += icon_size + icon_padding;
}
if (but->editstr || (but->drawflag & UI_BUT_TEXT_LEFT)) {
@@ -2109,7 +2138,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
/* Menu contains sub-menu items with triangle icon on their right. Shortcut
* strings should be drawn with some padding to the right then. */
- if (ui_block_is_menu(but->block) && (but->block->content_hints & BLOCK_CONTAINS_SUBMENU_BUT)) {
+ if (ui_block_is_menu(but->block) && (but->block->content_hints & UI_BLOCK_CONTAINS_SUBMENU_BUT)) {
rect->xmax -= UI_MENU_SUBMENU_PADDING;
}
@@ -2120,10 +2149,10 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
temp.xmin = temp.xmax - (BLI_rcti_size_y(rect) * 1.08f);
if (extra_icon_type == UI_BUT_ICONEXTRA_CLEAR) {
- widget_draw_icon(but, ICON_PANEL_CLOSE, alpha, &temp);
+ widget_draw_icon(but, ICON_PANEL_CLOSE, alpha, &temp, wcol->text);
}
else if (extra_icon_type == UI_BUT_ICONEXTRA_EYEDROPPER) {
- widget_draw_icon(but, ICON_EYEDROPPER, alpha, &temp);
+ widget_draw_icon(but, ICON_EYEDROPPER, alpha, &temp, wcol->text);
}
else {
BLI_assert(0);
@@ -2252,7 +2281,12 @@ static void widget_state(uiWidgetType *wt, int state)
if (state & UI_BUT_REDALERT) {
char red[4] = {255, 0, 0};
- widget_state_blend(wt->wcol.inner, red, 0.4f);
+ if (wt->draw) {
+ widget_state_blend(wt->wcol.inner, red, 0.4f);
+ }
+ else {
+ widget_state_blend(wt->wcol.text, red, 0.4f);
+ }
}
if (state & UI_BUT_DRAG_MULTI) {
@@ -2356,7 +2390,7 @@ static void widget_state_pie_menu_item(uiWidgetType *wt, int state)
}
if (state & UI_SELECT) {
- copy_v4_v4_char(wt->wcol.outline, wt->wcol.inner_sel);
+ copy_v4_v4_char(wt->wcol.inner, wt->wcol.inner_sel);
}
else if (state & UI_ACTIVE) {
copy_v4_v4_char(wt->wcol.inner, wt->wcol.item);
@@ -2463,6 +2497,7 @@ static void widget_menu_back(uiWidgetColors *wcol, rcti *rect, int flag, int dir
rect->ymax += 0.1f * U.widget_unit;
}
+ GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
GPU_blend(true);
widget_softshadow(rect, roundboxalign, wcol->roundness * U.widget_unit);
@@ -2578,7 +2613,7 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, const rcti *
immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
immBegin(GPU_PRIM_TRI_FAN, tot + 2);
- immAttrib3fv(color, colcent);
+ immAttr3fv(color, colcent);
immVertex2f(pos, centx, centy);
float ang = 0.0f;
@@ -2590,7 +2625,7 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, const rcti *
ui_color_picker_to_rgb_v(hsv, col);
- immAttrib3fv(color, col);
+ immAttr3fv(color, col);
immVertex2f(pos, centx + co * radius, centy + si * radius);
}
immEnd();
@@ -2746,22 +2781,22 @@ void ui_draw_gradient(const rcti *rect, const float hsv[3], const int type, cons
dy = (float)BLI_rcti_size_y(rect) / 3.0f;
for (a = 0; a < 3; a++, sy += dy) {
- immAttrib4f(col, col0[a][0], col0[a][1], col0[a][2], alpha);
+ immAttr4f(col, col0[a][0], col0[a][1], col0[a][2], alpha);
immVertex2f(pos, sx1, sy);
- immAttrib4f(col, col1[a][0], col1[a][1], col1[a][2], alpha);
+ immAttr4f(col, col1[a][0], col1[a][1], col1[a][2], alpha);
immVertex2f(pos, sx2, sy);
- immAttrib4f(col, col1[a + 1][0], col1[a + 1][1], col1[a + 1][2], alpha);
+ immAttr4f(col, col1[a + 1][0], col1[a + 1][1], col1[a + 1][2], alpha);
immVertex2f(pos, sx2, sy + dy);
- immAttrib4f(col, col0[a][0], col0[a][1], col0[a][2], alpha);
+ immAttr4f(col, col0[a][0], col0[a][1], col0[a][2], alpha);
immVertex2f(pos, sx1, sy);
- immAttrib4f(col, col1[a + 1][0], col1[a + 1][1], col1[a + 1][2], alpha);
+ immAttr4f(col, col1[a + 1][0], col1[a + 1][1], col1[a + 1][2], alpha);
immVertex2f(pos, sx2, sy + dy);
- immAttrib4f(col, col0[a + 1][0], col0[a + 1][1], col0[a + 1][2], alpha);
+ immAttr4f(col, col0[a + 1][0], col0[a + 1][1], col0[a + 1][2], alpha);
immVertex2f(pos, sx1, sy + dy);
}
}
@@ -3375,9 +3410,9 @@ static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
ui_block_cm_to_display_space_v3(but->block, col);
rgba_float_to_uchar((unsigned char *)wcol->inner, col);
+ const bool show_alpha_checkers = (wcol->inner[3] < 255);
wcol->shaded = 0;
- wcol->alpha_check = (wcol->inner[3] < 255);
if (state & (UI_BUT_DISABLED | UI_BUT_INACTIVE)) {
/* Now we reduce alpha of the inner color (i.e. the color shown)
@@ -3388,7 +3423,7 @@ static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
wcol->inner[3] /= 2;
}
- widgetbase_draw(&wtb, wcol);
+ widgetbase_draw_ex(&wtb, wcol, show_alpha_checkers);
if (but->a1 == UI_PALETTE_COLOR && ((Palette *)but->rnapoin.id.data)->active_color == (int)but->a2) {
float width = rect->xmax - rect->xmin;
float height = rect->ymax - rect->ymin;
@@ -3624,6 +3659,11 @@ static void widget_state_label(uiWidgetType *wt, int state)
else
UI_GetThemeColor3ubv(TH_TEXT, (unsigned char *)wt->wcol.text);
}
+
+ if (state & UI_BUT_REDALERT) {
+ char red[4] = {255, 0, 0};
+ widget_state_blend(wt->wcol.text, red, 0.4f);
+ }
}
static void widget_radiobut(uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int roundboxalign)
@@ -3654,6 +3694,7 @@ static void widget_box(uiBut *but, uiWidgetColors *wcol, rcti *rect, int UNUSED(
wcol->inner[0] = but->col[0];
wcol->inner[1] = but->col[1];
wcol->inner[2] = but->col[2];
+ wcol->inner[3] = but->col[3];
}
rad = wcol->roundness * U.widget_unit;
@@ -4088,7 +4129,7 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
wt->wcol_theme = &tui->wcol_box;
wt->state = widget_state;
}
- else if (but->block->flag & UI_BLOCK_LOOP) {
+ else if (but->block->theme_style == UI_BLOCK_THEME_STYLE_POPUP) {
wt->wcol_theme = &tui->wcol_menu_back;
wt->state = widget_state;
}
@@ -4134,8 +4175,9 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
case UI_BTYPE_SEARCH_MENU:
wt = widget_type(UI_WTYPE_NAME);
- if (but->block->flag & UI_BLOCK_LOOP)
+ if (but->block->theme_style == UI_BLOCK_THEME_STYLE_POPUP) {
wt->wcol_theme = &btheme->tui.wcol_menu_back;
+ }
break;
case UI_BTYPE_TAB:
@@ -4158,9 +4200,9 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
wt = widget_type(UI_WTYPE_TOGGLE);
/* option buttons have strings outside, on menus use different colors */
- if (but->block->flag & UI_BLOCK_LOOP)
+ if (but->block->theme_style == UI_BLOCK_THEME_STYLE_POPUP) {
wt->state = widget_state_option_menu;
-
+ }
break;
case UI_BTYPE_MENU:
@@ -4500,14 +4542,14 @@ static void draw_disk_shaded(
if (shaded) {
fac = (y1 + radius_ext) * radius_ext_scale;
round_box_shade_col4_r(r_col, col1, col2, fac);
- immAttrib4ubv(col, r_col);
+ immAttr4ubv(col, r_col);
}
immVertex2f(pos, c * radius_int, s * radius_int);
if (shaded) {
fac = (y2 + radius_ext) * radius_ext_scale;
round_box_shade_col4_r(r_col, col1, col2, fac);
- immAttrib4ubv(col, r_col);
+ immAttr4ubv(col, r_col);
}
immVertex2f(pos, c * radius_ext, s * radius_ext);
}
@@ -4700,7 +4742,7 @@ void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, const char *name, int ic
aspect = ICON_DEFAULT_HEIGHT / height;
GPU_blend(true);
- UI_icon_draw_aspect(xs, ys, iconid, aspect, 1.0f); /* XXX scale weak get from fstyle? */
+ UI_icon_draw_aspect(xs, ys, iconid, aspect, 1.0f, wt->wcol.text); /* XXX scale weak get from fstyle? */
GPU_blend(false);
}
}
diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c
index 7b6f6d0038b..09b8933206e 100644
--- a/source/blender/editors/interface/resources.c
+++ b/source/blender/editors/interface/resources.c
@@ -35,11 +35,9 @@
#include "MEM_guardedalloc.h"
-#include "DNA_curve_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_userdef_types.h"
-#include "DNA_windowmanager_types.h"
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
@@ -47,12 +45,10 @@
#include "BKE_addon.h"
#include "BKE_appdir.h"
-#include "BKE_colorband.h"
-#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_mesh_runtime.h"
-#include "BIF_gl.h"
+#include "BLO_readfile.h" /* for UserDef version patching. */
#include "BLF_api.h"
@@ -64,9 +60,6 @@
#include "interface_intern.h"
#include "GPU_framebuffer.h"
-
-extern const bTheme U_theme_default;
-
/* global for themes */
typedef void (*VectorDrawFunc)(int x, int y, int w, int h, float alpha);
@@ -188,6 +181,8 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo
cp = ts->list;
else if (theme_regionid == RGN_TYPE_HEADER)
cp = ts->header;
+ else if (theme_regionid == RGN_TYPE_NAV_BAR)
+ cp = ts->navigation_bar;
else
cp = ts->button;
@@ -388,6 +383,10 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo
cp = ts->keytype_jitter; break;
case TH_KEYTYPE_JITTER_SELECT:
cp = ts->keytype_jitter_select; break;
+ case TH_KEYTYPE_MOVEHOLD:
+ cp = ts->keytype_movehold; break;
+ case TH_KEYTYPE_MOVEHOLD_SELECT:
+ cp = ts->keytype_movehold_select; break;
case TH_KEYBORDER:
cp = ts->keyborder; break;
case TH_KEYBORDER_SELECT:
@@ -551,6 +550,9 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo
case TH_DOPESHEET_CHANNELSUBOB:
cp = ts->ds_subchannel;
break;
+ case TH_DOPESHEET_IPOLINE:
+ cp = ts->ds_ipoline;
+ break;
case TH_PREVIEW_BACK:
cp = ts->preview_back;
@@ -639,6 +641,9 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo
case TH_ANIM_INACTIVE:
cp = ts->anim_non_active;
break;
+ case TH_ANIM_PREVIEW_RANGE:
+ cp = ts->anim_preview_range;
+ break;
case TH_NLA_TWEAK:
cp = ts->nla_tweaking;
@@ -690,6 +695,17 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo
case TH_GIZMO_B:
cp = btheme->tui.gizmo_b; break;
+ case TH_ICON_COLLECTION:
+ cp = btheme->tui.icon_collection; break;
+ case TH_ICON_OBJECT:
+ cp = btheme->tui.icon_object; break;
+ case TH_ICON_OBJECT_DATA:
+ cp = btheme->tui.icon_object_data; break;
+ case TH_ICON_MODIFIER:
+ cp = btheme->tui.icon_modifier; break;
+ case TH_ICON_SHADING:
+ cp = btheme->tui.icon_shading; break;
+
case TH_INFO_SELECTED:
cp = ts->info_selected;
break;
@@ -1113,6 +1129,31 @@ void UI_GetThemeColorType4ubv(int colorid, int spacetype, char col[4])
col[3] = cp[3];
}
+bool UI_GetIconThemeColor4fv(int colorid, float col[4])
+{
+ if (colorid == 0) {
+ return false;
+ }
+
+ /* Only colored icons in outliner and popups, overall UI is intended
+ * to stay monochrome and out of the way except a few places where it
+ * is important to communicate different data types. */
+ if (!((theme_spacetype == SPACE_OUTLINER) ||
+ (theme_regionid == RGN_TYPE_TEMPORARY)))
+ {
+ return false;
+ }
+
+ const unsigned char *cp;
+ cp = UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
+ col[0] = ((float)cp[0]) / 255.0f;
+ col[1] = ((float)cp[1]) / 255.0f;
+ col[2] = ((float)cp[2]) / 255.0f;
+ col[3] = ((float)cp[3]) / 255.0f;
+
+ return true;
+}
+
void UI_GetColorPtrShade3ubv(const unsigned char cp[3], unsigned char col[3], int offset)
{
int r, g, b;
@@ -1196,307 +1237,18 @@ void UI_make_axis_color(const unsigned char src_col[3], unsigned char dst_col[3]
}
}
-/* ************************************************************* */
-
/* patching UserDef struct and Themes */
void init_userdef_do_versions(Main *bmain)
{
-#define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_ATLEAST(bmain, ver, subver)
+ BLO_version_defaults_userpref_blend(bmain, &U);
- /* the UserDef struct is not corrected with do_versions() .... ugh! */
- if (U.wheellinescroll == 0) U.wheellinescroll = 3;
- if (U.menuthreshold1 == 0) {
- U.menuthreshold1 = 5;
- U.menuthreshold2 = 2;
- }
- if (U.tb_leftmouse == 0) {
- U.tb_leftmouse = 5;
- U.tb_rightmouse = 5;
- }
- if (U.mixbufsize == 0) U.mixbufsize = 2048;
if (STREQ(U.tempdir, "/")) {
BKE_tempdir_system_init(U.tempdir);
}
- if (U.autokey_mode == 0) {
- /* 'add/replace' but not on */
- U.autokey_mode = 2;
- }
- if (U.savetime <= 0) {
- U.savetime = 1;
-// XXX error(STRINGIFY(BLENDER_STARTUP_FILE)" is buggy, please consider removing it.\n");
- }
- if (U.gizmo_size == 0) {
- U.gizmo_size = 75;
- U.gizmo_flag |= USER_GIZMO_DRAW;
- }
- if (U.pad_rot_angle == 0.0f)
- U.pad_rot_angle = 15.0f;
-
- /* graph editor - unselected F-Curve visibility */
- if (U.fcu_inactive_alpha == 0) {
- U.fcu_inactive_alpha = 0.25f;
- }
-
- /* signal for evaluated mesh to use colorband */
- /* run in case this was on and is now off in the user prefs [#28096] */
- BKE_mesh_runtime_color_band_store((U.flag & USER_CUSTOM_RANGE) ? (&U.coba_weight) : NULL, UI_GetTheme()->tv3d.vertex_unreferenced);
-
- if (!USER_VERSION_ATLEAST(192, 0)) {
- strcpy(U.sounddir, "/");
- }
-
- /* patch to set Dupli Armature */
- if (!USER_VERSION_ATLEAST(220, 0)) {
- U.dupflag |= USER_DUP_ARM;
- }
-
- /* added seam, normal color, undo */
- if (!USER_VERSION_ATLEAST(235, 0)) {
- U.uiflag |= USER_GLOBALUNDO;
- if (U.undosteps == 0) U.undosteps = 32;
- }
- if (!USER_VERSION_ATLEAST(236, 0)) {
- /* illegal combo... */
- if (U.flag & USER_LMOUSESELECT)
- U.flag &= ~USER_TWOBUTTONMOUSE;
- }
- if (!USER_VERSION_ATLEAST(240, 0)) {
- U.uiflag |= USER_PLAINMENUS;
- if (U.obcenter_dia == 0) U.obcenter_dia = 6;
- }
- if (!USER_VERSION_ATLEAST(242, 0)) {
- /* set defaults for 3D View rotating axis indicator */
- /* since size can't be set to 0, this indicates it's not saved in startup.blend */
- if (U.rvisize == 0) {
- U.rvisize = 15;
- U.rvibright = 8;
- U.uiflag |= USER_SHOW_GIZMO_AXIS;
- }
-
- }
- if (!USER_VERSION_ATLEAST(244, 0)) {
- /* set default number of recently-used files (if not set) */
- if (U.recent_files == 0) U.recent_files = 10;
- }
- if (!USER_VERSION_ATLEAST(245, 3)) {
- if (U.coba_weight.tot == 0)
- BKE_colorband_init(&U.coba_weight, true);
- }
- if (!USER_VERSION_ATLEAST(245, 3)) {
- U.flag |= USER_ADD_VIEWALIGNED | USER_ADD_EDITMODE;
- }
- if (!USER_VERSION_ATLEAST(250, 0)) {
- /* adjust grease-pencil distances */
- U.gp_manhattendist = 1;
- U.gp_euclideandist = 2;
-
- /* adjust default interpolation for new IPO-curves */
- U.ipo_new = BEZT_IPO_BEZ;
- }
-
- if (!USER_VERSION_ATLEAST(250, 3)) {
- /* new audio system */
- if (U.audiochannels == 0)
- U.audiochannels = 2;
- if (U.audiodevice == 0) {
-#ifdef WITH_OPENAL
- U.audiodevice = 2;
-#endif
-#ifdef WITH_SDL
- U.audiodevice = 1;
-#endif
- }
- if (U.audioformat == 0)
- U.audioformat = 0x24;
- if (U.audiorate == 0)
- U.audiorate = 48000;
- }
-
- if (!USER_VERSION_ATLEAST(250, 8)) {
- wmKeyMap *km;
-
- for (km = U.user_keymaps.first; km; km = km->next) {
- if (STREQ(km->idname, "Armature_Sketch"))
- strcpy(km->idname, "Armature Sketch");
- else if (STREQ(km->idname, "View3D"))
- strcpy(km->idname, "3D View");
- else if (STREQ(km->idname, "View3D Generic"))
- strcpy(km->idname, "3D View Generic");
- else if (STREQ(km->idname, "EditMesh"))
- strcpy(km->idname, "Mesh");
- else if (STREQ(km->idname, "UVEdit"))
- strcpy(km->idname, "UV Editor");
- else if (STREQ(km->idname, "Animation_Channels"))
- strcpy(km->idname, "Animation Channels");
- else if (STREQ(km->idname, "GraphEdit Keys"))
- strcpy(km->idname, "Graph Editor");
- else if (STREQ(km->idname, "GraphEdit Generic"))
- strcpy(km->idname, "Graph Editor Generic");
- else if (STREQ(km->idname, "Action_Keys"))
- strcpy(km->idname, "Dopesheet");
- else if (STREQ(km->idname, "NLA Data"))
- strcpy(km->idname, "NLA Editor");
- else if (STREQ(km->idname, "Node Generic"))
- strcpy(km->idname, "Node Editor");
- else if (STREQ(km->idname, "Logic Generic"))
- strcpy(km->idname, "Logic Editor");
- else if (STREQ(km->idname, "File"))
- strcpy(km->idname, "File Browser");
- else if (STREQ(km->idname, "FileMain"))
- strcpy(km->idname, "File Browser Main");
- else if (STREQ(km->idname, "FileButtons"))
- strcpy(km->idname, "File Browser Buttons");
- else if (STREQ(km->idname, "Buttons Generic"))
- strcpy(km->idname, "Property Editor");
- }
- }
-
- if (!USER_VERSION_ATLEAST(252, 3)) {
- if (U.flag & USER_LMOUSESELECT)
- U.flag &= ~USER_TWOBUTTONMOUSE;
- }
- if (!USER_VERSION_ATLEAST(252, 4)) {
- /* default new handle type is auto handles */
- U.keyhandles_new = HD_AUTO;
- }
-
- if (!USER_VERSION_ATLEAST(257, 0)) {
- /* clear "AUTOKEY_FLAG_ONLYKEYINGSET" flag from userprefs,
- * so that it doesn't linger around from old configs like a ghost */
- U.autokey_flag &= ~AUTOKEY_FLAG_ONLYKEYINGSET;
- }
-
- if (!USER_VERSION_ATLEAST(260, 3)) {
- /* if new keyframes handle default is stuff "auto", make it "auto-clamped" instead
- * was changed in 260 as part of GSoC11, but version patch was wrong
- */
- if (U.keyhandles_new == HD_AUTO)
- U.keyhandles_new = HD_AUTO_ANIM;
-
- /* enable (Cycles) addon by default */
- BKE_addon_ensure(&U.addons, "cycles");
- }
-
- if (!USER_VERSION_ATLEAST(261, 4)) {
- U.use_16bit_textures = true;
- }
-
- if (!USER_VERSION_ATLEAST(267, 0)) {
-
- /* GL Texture Garbage Collection */
- if (U.textimeout == 0) {
- U.texcollectrate = 60;
- U.textimeout = 120;
- }
- if (U.memcachelimit <= 0) {
- U.memcachelimit = 32;
- }
- if (U.dbl_click_time == 0) {
- U.dbl_click_time = 350;
- }
- if (U.v2d_min_gridsize == 0) {
- U.v2d_min_gridsize = 35;
- }
- if (U.dragthreshold == 0)
- U.dragthreshold = 5;
- if (U.widget_unit == 0)
- U.widget_unit = 20;
- if (U.anisotropic_filter <= 0)
- U.anisotropic_filter = 1;
-
- if (U.ndof_sensitivity == 0.0f) {
- U.ndof_sensitivity = 1.0f;
- U.ndof_flag = (NDOF_LOCK_HORIZON | NDOF_SHOULD_PAN | NDOF_SHOULD_ZOOM | NDOF_SHOULD_ROTATE);
- }
-
- if (U.ndof_orbit_sensitivity == 0.0f) {
- U.ndof_orbit_sensitivity = U.ndof_sensitivity;
-
- if (!(U.flag & USER_TRACKBALL))
- U.ndof_flag |= NDOF_TURNTABLE;
- }
- if (U.tweak_threshold == 0)
- U.tweak_threshold = 10;
- }
-
- /* NOTE!! from now on use U.versionfile and U.subversionfile */
-#undef USER_VERSION_ATLEAST
-#define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_ATLEAST((&(U)), ver, subver)
-
- if (!USER_VERSION_ATLEAST(271, 5)) {
- U.pie_menu_radius = 100;
- U.pie_menu_threshold = 12;
- U.pie_animation_timeout = 6;
- }
-
- if (!USER_VERSION_ATLEAST(275, 2)) {
- U.ndof_deadzone = 0.1;
- }
-
- if (!USER_VERSION_ATLEAST(275, 4)) {
- U.node_margin = 80;
- }
-
- if (!USER_VERSION_ATLEAST(278, 6)) {
- /* Clear preference flags for re-use. */
- U.flag &= ~(
- USER_FLAG_NUMINPUT_ADVANCED | USER_FLAG_DEPRECATED_2 | USER_FLAG_DEPRECATED_3 |
- USER_FLAG_DEPRECATED_6 | USER_FLAG_DEPRECATED_7 |
- USER_FLAG_DEPRECATED_9 | USER_DEVELOPER_UI);
- U.uiflag &= ~(
- USER_UIFLAG_DEPRECATED_7);
- U.transopts &= ~(
- USER_TR_DEPRECATED_2 | USER_TR_DEPRECATED_3 | USER_TR_DEPRECATED_4 |
- USER_TR_DEPRECATED_6 | USER_TR_DEPRECATED_7);
-
- U.uiflag |= USER_LOCK_CURSOR_ADJUST;
- }
-
-
- if (!USER_VERSION_ATLEAST(280, 20)) {
- U.gpu_viewport_quality = 0.6f;
-
- /* Reset theme, old themes will not be compatible with minor version updates from now on. */
- for (bTheme *btheme = U.themes.first; btheme; btheme = btheme->next) {
- memcpy(btheme, &U_theme_default, sizeof(*btheme));
- }
-
- /* Annotations - new layer color
- * Replace anything that used to be set if it looks like was left
- * on the old default (i.e. black), which most users used
- */
- if ((U.gpencil_new_layer_col[3] < 0.1f) || (U.gpencil_new_layer_col[0] < 0.1f)) {
- /* - New color matches the annotation pencil icon
- * - Non-full alpha looks better!
- */
- ARRAY_SET_ITEMS(U.gpencil_new_layer_col, 0.38f, 0.61f, 0.78f, 0.9f);
- }
- }
-
- /**
- * Include next version bump.
- */
- {
- /* (keep this block even if it becomes empty). */
- }
-
- if (U.pixelsize == 0.0f)
- U.pixelsize = 1.0f;
-
- if (U.image_draw_method == 0)
- U.image_draw_method = IMAGE_DRAW_METHOD_2DTEXTURE;
-
- // we default to the first audio device
- U.audiodevice = 0;
/* Not versioning, just avoid errors. */
#ifndef WITH_CYCLES
BKE_addon_remove_safe(&U.addons, "cycles");
#endif
- /* funny name, but it is GE stuff, moves userdef stuff to engine */
-// XXX space_set_commmandline_options();
- /* this timer uses U */
-// XXX reset_autosave();
-
}
diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c
index 3a527712367..72f5a75904b 100644
--- a/source/blender/editors/interface/view2d.c
+++ b/source/blender/editors/interface/view2d.c
@@ -116,15 +116,28 @@ static int view2d_scroll_mapped(int scroll)
return scroll;
}
-/* called each time cur changes, to dynamically update masks */
-static void view2d_masks(View2D *v2d, bool check_scrollers)
+void UI_view2d_mask_from_win(const View2D *v2d, rcti *r_mask)
+{
+ r_mask->xmin = 0;
+ r_mask->ymin = 0;
+ r_mask->xmax = v2d->winx - 1; /* -1 yes! masks are pixels */
+ r_mask->ymax = v2d->winy - 1;
+}
+
+/**
+ * Called each time #View2D.cur changes, to dynamically update masks.
+ *
+ * \param mask_scroll: Optionally clamp scrollbars by this region.
+ */
+static void view2d_masks(View2D *v2d, bool check_scrollers, const rcti *mask_scroll)
{
int scroll;
/* mask - view frame */
- v2d->mask.xmin = v2d->mask.ymin = 0;
- v2d->mask.xmax = v2d->winx - 1; /* -1 yes! masks are pixels */
- v2d->mask.ymax = v2d->winy - 1;
+ UI_view2d_mask_from_win(v2d, &v2d->mask);
+ if (mask_scroll == NULL) {
+ mask_scroll = &v2d->mask;
+ }
if (check_scrollers) {
/* check size if hiding flag is set: */
@@ -161,12 +174,12 @@ static void view2d_masks(View2D *v2d, bool check_scrollers)
/* vertical scroller */
if (scroll & V2D_SCROLL_LEFT) {
/* on left-hand edge of region */
- v2d->vert = v2d->mask;
+ v2d->vert = *mask_scroll;
v2d->vert.xmax = scroll_width;
}
else if (scroll & V2D_SCROLL_RIGHT) {
/* on right-hand edge of region */
- v2d->vert = v2d->mask;
+ v2d->vert = *mask_scroll;
v2d->vert.xmax++; /* one pixel extra... was leaving a minor gap... */
v2d->vert.xmin = v2d->vert.xmax - scroll_width;
}
@@ -174,12 +187,12 @@ static void view2d_masks(View2D *v2d, bool check_scrollers)
/* horizontal scroller */
if (scroll & (V2D_SCROLL_BOTTOM)) {
/* on bottom edge of region */
- v2d->hor = v2d->mask;
+ v2d->hor = *mask_scroll;
v2d->hor.ymax = scroll_height;
}
else if (scroll & V2D_SCROLL_TOP) {
/* on upper edge of region */
- v2d->hor = v2d->mask;
+ v2d->hor = *mask_scroll;
v2d->hor.ymin = v2d->hor.ymax - scroll_height;
}
@@ -216,8 +229,8 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
/* see eView2D_CommonViewTypes in UI_view2d.h for available view presets */
switch (type) {
/* 'standard view' - optimum setup for 'standard' view behavior,
- * that should be used new views as basis for their
- * own unique View2D settings, which should be used instead of this in most cases...
+ * that should be used new views as basis for their
+ * own unique View2D settings, which should be used instead of this in most cases...
*/
case V2D_COMMONVIEW_STANDARD:
{
@@ -227,9 +240,9 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
v2d->maxzoom = 1000.0f;
/* tot rect and cur should be same size, and aligned using 'standard' OpenGL coordinates for now
- * - region can resize 'tot' later to fit other data
- * - keeptot is only within bounds, as strict locking is not that critical
- * - view is aligned for (0,0) -> (winx-1, winy-1) setup
+ * - region can resize 'tot' later to fit other data
+ * - keeptot is only within bounds, as strict locking is not that critical
+ * - view is aligned for (0,0) -> (winx-1, winy-1) setup
*/
v2d->align = (V2D_ALIGN_NO_NEG_X | V2D_ALIGN_NO_NEG_Y);
v2d->keeptot = V2D_KEEPTOT_BOUNDS;
@@ -261,7 +274,7 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
break;
}
/* 'stack view' - practically the same as list/channel view, except is located in the pos y half instead.
- * zoom, aspect ratio, and alignment restrictions are set here */
+ * zoom, aspect ratio, and alignment restrictions are set here */
case V2D_COMMONVIEW_STACK:
{
/* zoom + aspect ratio are locked */
@@ -356,7 +369,7 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
v2d->winy = winy;
/* set masks (always do), but leave scroller scheck to totrect_set */
- view2d_masks(v2d, 0);
+ view2d_masks(v2d, 0, NULL);
if (do_init) {
/* Visible by default. */
@@ -484,7 +497,7 @@ static void ui_view2d_curRect_validate_resize(View2D *v2d, bool resize, bool mas
float curRatio, winRatio;
/* when a window edge changes, the aspect ratio can't be used to
- * find which is the best new 'cur' rect. thats why it stores 'old'
+ * find which is the best new 'cur' rect. that's why it stores 'old'
*/
if (winx != v2d->oldwinx) do_x = true;
if (winy != v2d->oldwiny) do_y = true;
@@ -634,7 +647,7 @@ static void ui_view2d_curRect_validate_resize(View2D *v2d, bool resize, bool mas
}
else if (cur->xmax > tot->xmax) {
/* - only offset by difference of cur-xmax and tot-xmax if that would not move
- * cur-xmin to lie past tot-xmin
+ * cur-xmin to lie past tot-xmin
* - otherwise, simply shift to tot-xmin???
*/
temp = cur->xmax - tot->xmax;
@@ -678,7 +691,7 @@ static void ui_view2d_curRect_validate_resize(View2D *v2d, bool resize, bool mas
}
else if (cur->xmax > tot->xmax) {
/* - only offset by difference of cur-xmax and tot-xmax if that would not move
- * cur-xmin to lie past tot-xmin
+ * cur-xmin to lie past tot-xmin
* - otherwise, simply shift to tot-xmin???
*/
temp = cur->xmax - tot->xmax;
@@ -780,7 +793,7 @@ static void ui_view2d_curRect_validate_resize(View2D *v2d, bool resize, bool mas
}
/* set masks */
- view2d_masks(v2d, mask_scrollers);
+ view2d_masks(v2d, mask_scrollers, NULL);
}
void UI_view2d_curRect_validate(View2D *v2d)
@@ -1189,7 +1202,7 @@ static void step_to_grid(float *step, int *power, int unit)
/* for frames, we want 1.0 frame intervals only */
if (unit == V2D_UNIT_FRAMES) {
rem = 1.0f;
- *step = 2.0f; /* use 2 since there are grid lines drawn in between, this way to get 1 line per frane */
+ *step = 2.0f; /* use 2 since there are grid lines drawn in between, this way to get 1 line per frame */
}
/* prevents printing 1.0 2.0 3.0 etc */
@@ -1358,9 +1371,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag)
UI_GetThemeColor3ubv(TH_GRID, grid_line_color);
for (a = 0; a < step; a++) {
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2fv(pos, vec1);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2fv(pos, vec2);
vec2[0] = vec1[0] += grid->dx;
@@ -1374,9 +1387,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag)
step++;
for (a = 0; a <= step; a++) {
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2fv(pos, vec1);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2fv(pos, vec2);
vec2[0] = vec1[0] -= grid->dx;
@@ -1395,9 +1408,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag)
UI_GetThemeColor3ubv(TH_GRID, grid_line_color);
for (a = 0; a <= step; a++) {
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2fv(pos, vec1);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2fv(pos, vec2);
vec2[1] = vec1[1] += grid->dy;
@@ -1410,9 +1423,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag)
if (flag & V2D_HORIZONTAL_FINELINES) {
UI_GetThemeColorShade3ubv(TH_GRID, 16, grid_line_color);
for (a = 0; a < step; a++) {
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2fv(pos, vec1);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2fv(pos, vec2);
vec2[1] = vec1[1] -= grid->dy;
@@ -1429,9 +1442,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag)
vec2[0] = v2d->cur.xmax;
vec1[1] = vec2[1] = 0.0f;
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2fv(pos, vec1);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2fv(pos, vec2);
}
@@ -1441,9 +1454,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag)
vec2[1] = v2d->cur.ymax;
vec1[0] = vec2[0] = 0.0f;
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2fv(pos, vec1);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2fv(pos, vec2);
}
@@ -1490,7 +1503,7 @@ void UI_view2d_constant_grid_draw(View2D *v2d, float step)
immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
immBegin(GPU_PRIM_LINES, count_x * 2 + count_y * 2 + 4);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
for (int i = 0; i < count_x ; start_x += step, i++) {
immVertex2f(pos, start_x, v2d->cur.ymin);
immVertex2f(pos, start_x, v2d->cur.ymax);
@@ -1504,7 +1517,7 @@ void UI_view2d_constant_grid_draw(View2D *v2d, float step)
/* X and Y axis */
UI_GetThemeColorShade3fv(TH_BACK, -18, theme_color);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, 0.0f, v2d->cur.ymin);
immVertex2f(pos, 0.0f, v2d->cur.ymax);
immVertex2f(pos, v2d->cur.xmin, 0.0f);
@@ -1552,9 +1565,9 @@ void UI_view2d_multi_grid_draw(View2D *v2d, int colorid, float step, int level_s
if (i == 0 || (level < totlevels - 1 && i % level_size == 0))
continue;
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2f(pos, start, v2d->cur.ymin);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2f(pos, start, v2d->cur.ymax);
}
@@ -1567,9 +1580,9 @@ void UI_view2d_multi_grid_draw(View2D *v2d, int colorid, float step, int level_s
if (i == 0 || (level < totlevels - 1 && i % level_size == 0))
continue;
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2f(pos, v2d->cur.xmin, start);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2f(pos, v2d->cur.xmax, start);
}
@@ -1580,14 +1593,14 @@ void UI_view2d_multi_grid_draw(View2D *v2d, int colorid, float step, int level_s
/* X and Y axis */
UI_GetThemeColorShade3ubv(colorid, -18 + ((totlevels - 1) * -6), grid_line_color);
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2f(pos, 0.0f, v2d->cur.ymin);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2f(pos, 0.0f, v2d->cur.ymax);
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2f(pos, v2d->cur.xmin, 0.0f);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2f(pos, v2d->cur.xmax, 0.0f);
immEnd();
@@ -1635,7 +1648,7 @@ struct View2DScrollers {
/* Calculate relevant scroller properties */
View2DScrollers *UI_view2d_scrollers_calc(
- const bContext *C, View2D *v2d,
+ const bContext *C, View2D *v2d, const rcti *mask_custom,
short xunits, short xclamp, short yunits, short yclamp)
{
View2DScrollers *scrollers;
@@ -1648,7 +1661,7 @@ View2DScrollers *UI_view2d_scrollers_calc(
scrollers = MEM_callocN(sizeof(View2DScrollers), "View2DScrollers");
/* Always update before drawing (for dynamically sized scrollers). */
- view2d_masks(v2d, false);
+ view2d_masks(v2d, false, mask_custom);
vert = v2d->vert;
hor = v2d->hor;
@@ -2416,16 +2429,20 @@ void UI_view2d_offset(struct View2D *v2d, float xfac, float yfac)
* Check if mouse is within scrollers
*
* \param x, y: Mouse coordinates in screen (not region) space.
+ * \param r_scroll: Mapped view2d scroll flag.
*
* \return appropriate code for match.
* - 'h' = in horizontal scroller.
* - 'v' = in vertical scroller.
* - 0 = not in scroller.
*/
-short UI_view2d_mouse_in_scrollers(const ARegion *ar, View2D *v2d, int x, int y)
+char UI_view2d_mouse_in_scrollers_ex(
+ const ARegion *ar, View2D *v2d, int x, int y,
+ int *r_scroll)
{
int co[2];
int scroll = view2d_scroll_mapped(v2d->scroll);
+ *r_scroll = scroll;
/* clamp x,y to region-coordinates first */
co[0] = x - ar->winrct.xmin;
@@ -2443,6 +2460,13 @@ short UI_view2d_mouse_in_scrollers(const ARegion *ar, View2D *v2d, int x, int y)
return 0;
}
+char UI_view2d_mouse_in_scrollers(
+ const ARegion *ar, View2D *v2d, int x, int y)
+{
+ int scroll_dummy = 0;
+ return UI_view2d_mouse_in_scrollers_ex(ar, v2d, x, y, &scroll_dummy);
+}
+
/* ******************* view2d text drawing cache ******************** */
typedef struct View2DString {
diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c
index f2411c1861a..6009b0bdb81 100644
--- a/source/blender/editors/interface/view2d_ops.c
+++ b/source/blender/editors/interface/view2d_ops.c
@@ -1222,7 +1222,7 @@ static void VIEW2D_OT_zoom(wmOperatorType *ot)
/* BORDER-ZOOM */
/**
- * The user defines a rect using standard borderselect tools, and we use this rect to
+ * The user defines a rect using standard box select tools, and we use this rect to
* define the new zoom-level of the view in the following ways:
*
* -# LEFTMOUSE - zoom in to view
@@ -1302,15 +1302,15 @@ static void VIEW2D_OT_zoom_border(wmOperatorType *ot)
ot->idname = "VIEW2D_OT_zoom_border";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
+ ot->invoke = WM_gesture_box_invoke;
ot->exec = view_borderzoom_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = view_zoom_poll;
/* rna */
- WM_operator_properties_gesture_border_zoom(ot);
+ WM_operator_properties_gesture_box_zoom(ot);
}
#ifdef WITH_INPUT_NDOF
@@ -1566,7 +1566,7 @@ static void VIEW2D_OT_smoothview(wmOperatorType *ot)
ot->flag = OPTYPE_INTERNAL;
/* rna */
- WM_operator_properties_gesture_border(ot);
+ WM_operator_properties_gesture_box(ot);
}
/* ********************************************************* */
@@ -1587,7 +1587,7 @@ typedef struct v2dScrollerMove {
View2D *v2d; /* View2D data that this operation affects */
ARegion *ar; /* region that the scroller is in */
- short scroller; /* scroller that mouse is in ('h' or 'v') */
+ char scroller; /* scroller that mouse is in ('h' or 'v') */
short zone; /* -1 is min zoomer, 0 is bar, 1 is max zoomer */ // XXX find some way to provide visual feedback of this (active color?)
float fac; /* view adjustment factor, based on size of region */
@@ -1694,7 +1694,7 @@ static bool scroller_activate_poll(bContext *C)
}
/* initialize customdata for scroller manipulation operator */
-static void scroller_activate_init(bContext *C, wmOperator *op, const wmEvent *event, short in_scroller)
+static void scroller_activate_init(bContext *C, wmOperator *op, const wmEvent *event, const char in_scroller)
{
v2dScrollerMove *vsm;
View2DScrollers *scrollers;
@@ -1718,7 +1718,7 @@ static void scroller_activate_init(bContext *C, wmOperator *op, const wmEvent *e
/* 'zone' depends on where mouse is relative to bubble
* - zooming must be allowed on this axis, otherwise, default to pan
*/
- scrollers = UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
+ scrollers = UI_view2d_scrollers_calc(C, v2d, NULL, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
/* use a union of 'cur' & 'tot' incase the current view is far outside 'tot'.
* In this cases moving the scroll bars has far too little effect and the view can get stuck [#31476] */
@@ -1928,10 +1928,9 @@ static int scroller_activate_invoke(bContext *C, wmOperator *op, const wmEvent *
{
ARegion *ar = CTX_wm_region(C);
View2D *v2d = &ar->v2d;
- short in_scroller = 0;
/* check if mouse in scrollbars, if they're enabled */
- in_scroller = UI_view2d_mouse_in_scrollers(ar, v2d, event->x, event->y);
+ const char in_scroller = UI_view2d_mouse_in_scrollers(ar, v2d, event->x, event->y);
/* if in a scroller, init customdata then set modal handler which will catch mousedown to start doing useful stuff */
if (in_scroller) {
@@ -2130,85 +2129,5 @@ void ED_operatortypes_view2d(void)
void ED_keymap_view2d(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "View2D", 0, 0);
- wmKeyMapItem *kmi;
-
- /* scrollers */
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroller_activate", LEFTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroller_activate", MIDDLEMOUSE, KM_PRESS, 0, 0);
-
- /* pan/scroll */
- WM_keymap_add_item(keymap, "VIEW2D_OT_pan", MIDDLEMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_pan", MIDDLEMOUSE, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "VIEW2D_OT_pan", MOUSEPAN, 0, 0, 0);
-
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_right", WHEELDOWNMOUSE, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_left", WHEELUPMOUSE, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", WHEELDOWNMOUSE, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", WHEELUPMOUSE, KM_PRESS, KM_SHIFT, 0);
-
-#ifdef WITH_INPUT_NDOF
- WM_keymap_add_item(keymap, "VIEW2D_OT_ndof", NDOF_MOTION, 0, 0, 0);
-#endif
-
- /* zoom - single step */
- WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_out", WHEELOUTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_in", WHEELINMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_out", PADMINUS, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_in", PADPLUSKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MOUSEPAN, 0, KM_CTRL, 0);
-
- WM_keymap_verify_item(keymap, "VIEW2D_OT_smoothview", TIMER1, KM_ANY, KM_ANY, 0);
-
- /* scroll up/down - no modifiers, only when zoom fails */
- /* these may fail if zoom is disallowed, in which case they should pass on event */
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", WHEELDOWNMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", WHEELUPMOUSE, KM_PRESS, 0, 0);
- /* these may be necessary if vertical scroll is disallowed */
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_right", WHEELDOWNMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_left", WHEELUPMOUSE, KM_PRESS, 0, 0);
-
- /* alternatives for page up/down to scroll */
-#if 0 // XXX disabled, since this causes conflicts with hotkeys in animation editors
- /* scroll up/down may fall through to left/right */
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", PAGEDOWNKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", PAGEUPKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_right", PAGEDOWNKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_left", PAGEUPKEY, KM_PRESS, 0, 0);
- /* shift for moving view left/right with page up/down */
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_right", PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_left", PAGEUPKEY, KM_PRESS, KM_SHIFT, 0);
-#endif
-
- /* zoom - drag */
- WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MOUSEZOOM, 0, 0, 0);
-
- /* borderzoom - drag */
- WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_border", BKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* Alternative keymap for buttons listview */
- keymap = WM_keymap_ensure(keyconf, "View2D Buttons List", 0, 0);
-
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroller_activate", LEFTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroller_activate", MIDDLEMOUSE, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "VIEW2D_OT_pan", MIDDLEMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_pan", MOUSEPAN, 0, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", WHEELDOWNMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", WHEELUPMOUSE, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", PAGEDOWNKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "page", true);
- kmi = WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", PAGEUPKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "page", true);
-
- WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MOUSEZOOM, 0, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MOUSEPAN, 0, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_out", PADMINUS, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_in", PADPLUSKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_reset", HOMEKEY, KM_PRESS, 0, 0);
+ WM_keymap_ensure(keyconf, "View2D", 0, 0);
}
diff --git a/source/blender/editors/io/io_collada.c b/source/blender/editors/io/io_collada.c
index 8f05495bb7f..554480be72a 100644
--- a/source/blender/editors/io/io_collada.c
+++ b/source/blender/editors/io/io_collada.c
@@ -38,8 +38,8 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_main.h"
-#include "BKE_report.h"
#include "BKE_object.h"
+#include "BKE_report.h"
#include "DEG_depsgraph.h"
diff --git a/source/blender/editors/lattice/editlattice_select.c b/source/blender/editors/lattice/editlattice_select.c
index 41ed73baf0e..f342cefa362 100644
--- a/source/blender/editors/lattice/editlattice_select.c
+++ b/source/blender/editors/lattice/editlattice_select.c
@@ -52,6 +52,7 @@
#include "BKE_report.h"
#include "BKE_layer.h"
+#include "ED_object.h"
#include "ED_screen.h"
#include "ED_select_utils.h"
#include "ED_lattice.h"
@@ -266,43 +267,53 @@ static bool lattice_test_bitmap_uvw(Lattice *lt, BLI_bitmap *selpoints, int u, i
static int lattice_select_more_less(bContext *C, const bool select)
{
- Object *obedit = CTX_data_edit_object(C);
- Lattice *lt = ((Lattice *)obedit->data)->editlatt->latt;
- BPoint *bp;
- const int tot = lt->pntsu * lt->pntsv * lt->pntsw;
- int u, v, w;
- BLI_bitmap *selpoints;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len;
+ bool changed = false;
+
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Lattice *lt = ((Lattice *)obedit->data)->editlatt->latt;
+ BPoint *bp;
+ const int tot = lt->pntsu * lt->pntsv * lt->pntsw;
+ int u, v, w;
+ BLI_bitmap *selpoints;
- lt->actbp = LT_ACTBP_NONE;
+ lt->actbp = LT_ACTBP_NONE;
- selpoints = BLI_BITMAP_NEW(tot, __func__);
- BKE_lattice_bitmap_from_flag(lt, selpoints, SELECT, false, false);
+ selpoints = BLI_BITMAP_NEW(tot, __func__);
+ BKE_lattice_bitmap_from_flag(lt, selpoints, SELECT, false, false);
- bp = lt->def;
- for (w = 0; w < lt->pntsw; w++) {
- for (v = 0; v < lt->pntsv; v++) {
- for (u = 0; u < lt->pntsu; u++) {
- if ((bp->hide == 0) && (((bp->f1 & SELECT) == 0) == select)) {
- if (lattice_test_bitmap_uvw(lt, selpoints, u + 1, v, w, select) ||
- lattice_test_bitmap_uvw(lt, selpoints, u - 1, v, w, select) ||
- lattice_test_bitmap_uvw(lt, selpoints, u, v + 1, w, select) ||
- lattice_test_bitmap_uvw(lt, selpoints, u, v - 1, w, select) ||
- lattice_test_bitmap_uvw(lt, selpoints, u, v, w + 1, select) ||
- lattice_test_bitmap_uvw(lt, selpoints, u, v, w - 1, select))
- {
- SET_FLAG_FROM_TEST(bp->f1, select, SELECT);
+ bp = lt->def;
+ for (w = 0; w < lt->pntsw; w++) {
+ for (v = 0; v < lt->pntsv; v++) {
+ for (u = 0; u < lt->pntsu; u++) {
+ if ((bp->hide == 0) && (((bp->f1 & SELECT) == 0) == select)) {
+ if (lattice_test_bitmap_uvw(lt, selpoints, u + 1, v, w, select) ||
+ lattice_test_bitmap_uvw(lt, selpoints, u - 1, v, w, select) ||
+ lattice_test_bitmap_uvw(lt, selpoints, u, v + 1, w, select) ||
+ lattice_test_bitmap_uvw(lt, selpoints, u, v - 1, w, select) ||
+ lattice_test_bitmap_uvw(lt, selpoints, u, v, w + 1, select) ||
+ lattice_test_bitmap_uvw(lt, selpoints, u, v, w - 1, select))
+ {
+ SET_FLAG_FROM_TEST(bp->f1, select, SELECT);
+ }
}
+ bp++;
}
- bp++;
}
}
- }
- MEM_freeN(selpoints);
+ MEM_freeN(selpoints);
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
- return OPERATOR_FINISHED;
+ changed = true;
+ DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ }
+ MEM_freeN(objects);
+
+ return changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
static int lattice_select_more_exec(bContext *C, wmOperator *UNUSED(op))
@@ -451,35 +462,51 @@ void LATTICE_OT_select_all(wmOperatorType *ot)
static int lattice_select_ungrouped_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- Lattice *lt = ((Lattice *)obedit->data)->editlatt->latt;
- MDeformVert *dv;
- BPoint *bp;
- int a, tot;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len;
+ const bool is_extend = RNA_boolean_get(op->ptr, "extend");
+ bool changed = false;
- if (BLI_listbase_is_empty(&obedit->defbase) || lt->dvert == NULL) {
- BKE_report(op->reports, RPT_ERROR, "No weights/vertex groups on object");
- return OPERATOR_CANCELLED;
- }
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Lattice *lt = ((Lattice *)obedit->data)->editlatt->latt;
+ MDeformVert *dv;
+ BPoint *bp;
+ int a, tot;
- if (!RNA_boolean_get(op->ptr, "extend")) {
- ED_lattice_flags_set(obedit, 0);
- }
+ if (BLI_listbase_is_empty(&obedit->defbase) || lt->dvert == NULL) {
+ continue;
+ }
+
+ if (!is_extend) {
+ ED_lattice_flags_set(obedit, 0);
+ }
- dv = lt->dvert;
- tot = lt->pntsu * lt->pntsv * lt->pntsw;
+ dv = lt->dvert;
+ tot = lt->pntsu * lt->pntsv * lt->pntsw;
- for (a = 0, bp = lt->def; a < tot; a++, bp++, dv++) {
- if (bp->hide == 0) {
- if (dv->dw == NULL) {
- bp->f1 |= SELECT;
+ for (a = 0, bp = lt->def; a < tot; a++, bp++, dv++) {
+ if (bp->hide == 0) {
+ if (dv->dw == NULL) {
+ bp->f1 |= SELECT;
+ }
}
}
- }
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ changed = true;
+ DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ }
+ MEM_freeN(objects);
+ if (!changed) {
+ BKE_report(op->reports,
+ RPT_ERROR,
+ objects_len > 1 ? "No weights/vertex groups on objects" :
+ "No weights/vertex groups on object");
+ return OPERATOR_CANCELLED;
+ }
return OPERATOR_FINISHED;
}
@@ -513,7 +540,7 @@ void LATTICE_OT_select_ungrouped(wmOperatorType *ot)
static void findnearestLattvert__doClosest(void *userData, BPoint *bp, const float screen_co[2])
{
- struct { BPoint *bp; float dist; int select; float mval_fl[2]; } *data = userData;
+ struct { BPoint *bp; float dist; int select; float mval_fl[2]; bool is_changed; } *data = userData;
float dist_test = len_manhattan_v2v2(data->mval_fl, screen_co);
if ((bp->f1 & SELECT) && data->select)
@@ -521,26 +548,38 @@ static void findnearestLattvert__doClosest(void *userData, BPoint *bp, const flo
if (dist_test < data->dist) {
data->dist = dist_test;
-
data->bp = bp;
+ data->is_changed = true;
}
}
-static BPoint *findnearestLattvert(ViewContext *vc, const int mval[2], int sel)
+static BPoint *findnearestLattvert(ViewContext *vc, int sel, Base **r_base)
{
/* (sel == 1): selected gets a disadvantage */
/* in nurb and bezt or bp the nearest is written */
/* return 0 1 2: handlepunt */
- struct { BPoint *bp; float dist; int select; float mval_fl[2]; } data = {NULL};
+ struct { BPoint *bp; float dist; int select; float mval_fl[2]; bool is_changed; } data = {NULL};
data.dist = ED_view3d_select_dist_px();
data.select = sel;
- data.mval_fl[0] = mval[0];
- data.mval_fl[1] = mval[1];
+ data.mval_fl[0] = vc->mval[0];
+ data.mval_fl[1] = vc->mval[1];
+
+ uint bases_len;
+ Base **bases = BKE_view_layer_array_from_bases_in_edit_mode_unique_data(vc->view_layer, &bases_len);
+ for (uint base_index = 0; base_index < bases_len; base_index++) {
+ Base *base = bases[base_index];
+ data.is_changed = false;
- ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
- lattice_foreachScreenVert(vc, findnearestLattvert__doClosest, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
+ ED_view3d_viewcontext_init_object(vc, base->object);
+ ED_view3d_init_mats_rv3d(base->object, vc->rv3d);
+ lattice_foreachScreenVert(vc, findnearestLattvert__doClosest, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
+ if (data.is_changed) {
+ *r_base = base;
+ }
+ }
+ MEM_freeN(bases);
return data.bp;
}
@@ -548,13 +587,30 @@ bool ED_lattice_select_pick(bContext *C, const int mval[2], bool extend, bool de
{
ViewContext vc;
BPoint *bp = NULL;
- Lattice *lt;
+ Base *basact = NULL;
ED_view3d_viewcontext_init(C, &vc);
- lt = ((Lattice *)vc.obedit->data)->editlatt->latt;
- bp = findnearestLattvert(&vc, mval, true);
+ vc.mval[0] = mval[0];
+ vc.mval[1] = mval[1];
+ bp = findnearestLattvert(&vc, true, &basact);
if (bp) {
+ ED_view3d_viewcontext_init_object(&vc, basact->object);
+ Lattice *lt = ((Lattice *)vc.obedit->data)->editlatt->latt;
+
+ if (!extend && !deselect && !toggle) {
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(vc.view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ ED_lattice_flags_set(ob, 0);
+
+ DEG_id_tag_update(ob->data, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob->data);
+ }
+ MEM_freeN(objects);
+ }
+
if (extend) {
bp->f1 |= SELECT;
}
@@ -576,6 +632,10 @@ bool ED_lattice_select_pick(bContext *C, const int mval[2], bool extend, bool de
lt->actbp = LT_ACTBP_NONE;
}
+ if (vc.view_layer->basact != basact) {
+ ED_object_base_activate(C, basact);
+ }
+
DEG_id_tag_update(vc.obedit->data, DEG_TAG_SELECT_UPDATE);
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data);
diff --git a/source/blender/editors/lattice/editlattice_tools.c b/source/blender/editors/lattice/editlattice_tools.c
index c6ba0237a68..01211a436a4 100644
--- a/source/blender/editors/lattice/editlattice_tools.c
+++ b/source/blender/editors/lattice/editlattice_tools.c
@@ -27,6 +27,9 @@
* \ingroup edlattice
*/
+
+#include "MEM_guardedalloc.h"
+
#include "BLI_math.h"
#include "BLI_utildefines.h"
@@ -40,6 +43,7 @@
#include "BKE_context.h"
#include "BKE_lattice.h"
+#include "BKE_layer.h"
#include "DEG_depsgraph.h"
@@ -68,22 +72,40 @@ static bool make_regular_poll(bContext *C)
static int make_regular_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob = CTX_data_edit_object(C);
- Lattice *lt;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ const bool is_editmode = CTX_data_edit_object(C) != NULL;
+
+ if (is_editmode) {
+ uint objects_len;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ Lattice *lt = ob->data;
+
+ if (lt->editlatt->latt == NULL) {
+ continue;
+ }
- if (ob) {
- lt = ob->data;
- BKE_lattice_resize(lt->editlatt->latt, lt->pntsu, lt->pntsv, lt->pntsw, NULL);
+ BKE_lattice_resize(lt->editlatt->latt, lt->pntsu, lt->pntsv, lt->pntsw, NULL);
+
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
+ }
+ MEM_freeN(objects);
}
else {
- ob = CTX_data_active_object(C);
- lt = ob->data;
- BKE_lattice_resize(lt, lt->pntsu, lt->pntsv, lt->pntsw, NULL);
- }
+ FOREACH_SELECTED_OBJECT_BEGIN(view_layer, ob) {
+ if (ob->type != OB_LATTICE) {
+ continue;
+ }
- DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
+ Lattice *lt = ob->data;
+ BKE_lattice_resize(lt, lt->pntsu, lt->pntsv, lt->pntsw, NULL);
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
+ } FOREACH_SELECTED_OBJECT_END;
+ }
return OPERATOR_FINISHED;
}
@@ -191,126 +213,135 @@ static void lattice_swap_point_pairs(Lattice *lt, int u, int v, int w, float mid
static int lattice_flip_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- Lattice *lt;
-
- eLattice_FlipAxes axis = RNA_enum_get(op->ptr, "axis");
- int numU, numV, numW;
- int totP;
-
- float mid = 0.0f;
- short isOdd = 0;
-
- /* get lattice - we need the "edit lattice" from the lattice... confusing... */
- lt = (Lattice *)obedit->data;
- lt = lt->editlatt->latt;
-
- numU = lt->pntsu;
- numV = lt->pntsv;
- numW = lt->pntsw;
- totP = numU * numV * numW;
-
- /* First Pass: determine midpoint - used for flipping center verts if there are odd number of points on axis */
- switch (axis) {
- case LATTICE_FLIP_U:
- isOdd = numU & 1;
- break;
- case LATTICE_FLIP_V:
- isOdd = numV & 1;
- break;
- case LATTICE_FLIP_W:
- isOdd = numW & 1;
- break;
-
- default:
- printf("lattice_flip(): Unknown flipping axis (%u)\n", axis);
- return OPERATOR_CANCELLED;
- }
-
- if (isOdd) {
- BPoint *bp;
- float avgInv = 1.0f / (float)totP;
- int i;
-
- /* midpoint calculation - assuming that u/v/w are axis-aligned */
- for (i = 0, bp = lt->def; i < totP; i++, bp++) {
- mid += bp->vec[axis] * avgInv;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len;
+ bool changed = false;
+ const eLattice_FlipAxes axis = RNA_enum_get(op->ptr, "axis");
+
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Lattice *lt;
+
+ int numU, numV, numW;
+ int totP;
+
+ float mid = 0.0f;
+ short isOdd = 0;
+
+ /* get lattice - we need the "edit lattice" from the lattice... confusing... */
+ lt = (Lattice *)obedit->data;
+ lt = lt->editlatt->latt;
+
+ numU = lt->pntsu;
+ numV = lt->pntsv;
+ numW = lt->pntsw;
+ totP = numU * numV * numW;
+
+ /* First Pass: determine midpoint - used for flipping center verts if there are odd number of points on axis */
+ switch (axis) {
+ case LATTICE_FLIP_U:
+ isOdd = numU & 1;
+ break;
+ case LATTICE_FLIP_V:
+ isOdd = numV & 1;
+ break;
+ case LATTICE_FLIP_W:
+ isOdd = numW & 1;
+ break;
+
+ default:
+ printf("lattice_flip(): Unknown flipping axis (%u)\n", axis);
+ return OPERATOR_CANCELLED;
}
- }
-
- /* Second Pass: swap pairs of vertices per axis, assuming they are all sorted */
- switch (axis) {
- case LATTICE_FLIP_U:
- {
- int u, v, w;
- /* v/w strips - front to back, top to bottom */
- for (w = 0; w < numW; w++) {
- for (v = 0; v < numV; v++) {
- /* swap coordinates of pairs of vertices on u */
- for (u = 0; u < (numU / 2); u++) {
- lattice_swap_point_pairs(lt, u, v, w, mid, axis);
- }
+ if (isOdd) {
+ BPoint *bp;
+ float avgInv = 1.0f / (float)totP;
+ int i;
- /* flip u-coordinate of midpoint (i.e. unpaired point on u) */
- if (isOdd) {
- u = (numU / 2);
- lattice_flip_point_value(lt, u, v, w, mid, axis);
- }
- }
+ /* midpoint calculation - assuming that u/v/w are axis-aligned */
+ for (i = 0, bp = lt->def; i < totP; i++, bp++) {
+ mid += bp->vec[axis] * avgInv;
}
- break;
}
- case LATTICE_FLIP_V:
- {
- int u, v, w;
-
- /* u/w strips - front to back, left to right */
- for (w = 0; w < numW; w++) {
- for (u = 0; u < numU; u++) {
- /* swap coordinates of pairs of vertices on v */
- for (v = 0; v < (numV / 2); v++) {
- lattice_swap_point_pairs(lt, u, v, w, mid, axis);
- }
- /* flip v-coordinate of midpoint (i.e. unpaired point on v) */
- if (isOdd) {
- v = (numV / 2);
- lattice_flip_point_value(lt, u, v, w, mid, axis);
+ /* Second Pass: swap pairs of vertices per axis, assuming they are all sorted */
+ switch (axis) {
+ case LATTICE_FLIP_U:
+ {
+ int u, v, w;
+
+ /* v/w strips - front to back, top to bottom */
+ for (w = 0; w < numW; w++) {
+ for (v = 0; v < numV; v++) {
+ /* swap coordinates of pairs of vertices on u */
+ for (u = 0; u < (numU / 2); u++) {
+ lattice_swap_point_pairs(lt, u, v, w, mid, axis);
+ }
+
+ /* flip u-coordinate of midpoint (i.e. unpaired point on u) */
+ if (isOdd) {
+ u = (numU / 2);
+ lattice_flip_point_value(lt, u, v, w, mid, axis);
+ }
}
}
+ break;
}
- break;
- }
- case LATTICE_FLIP_W:
- {
- int u, v, w;
-
- for (v = 0; v < numV; v++) {
- for (u = 0; u < numU; u++) {
- /* swap coordinates of pairs of vertices on w */
- for (w = 0; w < (numW / 2); w++) {
- lattice_swap_point_pairs(lt, u, v, w, mid, axis);
+ case LATTICE_FLIP_V:
+ {
+ int u, v, w;
+
+ /* u/w strips - front to back, left to right */
+ for (w = 0; w < numW; w++) {
+ for (u = 0; u < numU; u++) {
+ /* swap coordinates of pairs of vertices on v */
+ for (v = 0; v < (numV / 2); v++) {
+ lattice_swap_point_pairs(lt, u, v, w, mid, axis);
+ }
+
+ /* flip v-coordinate of midpoint (i.e. unpaired point on v) */
+ if (isOdd) {
+ v = (numV / 2);
+ lattice_flip_point_value(lt, u, v, w, mid, axis);
+ }
}
+ }
+ break;
+ }
+ case LATTICE_FLIP_W:
+ {
+ int u, v, w;
- /* flip w-coordinate of midpoint (i.e. unpaired point on w) */
- if (isOdd) {
- w = (numW / 2);
- lattice_flip_point_value(lt, u, v, w, mid, axis);
+ for (v = 0; v < numV; v++) {
+ for (u = 0; u < numU; u++) {
+ /* swap coordinates of pairs of vertices on w */
+ for (w = 0; w < (numW / 2); w++) {
+ lattice_swap_point_pairs(lt, u, v, w, mid, axis);
+ }
+
+ /* flip w-coordinate of midpoint (i.e. unpaired point on w) */
+ if (isOdd) {
+ w = (numW / 2);
+ lattice_flip_point_value(lt, u, v, w, mid, axis);
+ }
}
}
+ break;
}
- break;
+ default: /* shouldn't happen, but just in case */
+ break;
}
- default: /* shouldn't happen, but just in case */
- break;
- }
- /* updates */
- DEG_id_tag_update(&obedit->id, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ /* updates */
+ DEG_id_tag_update(&obedit->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ changed = true;
+ }
+ MEM_freeN(objects);
- return OPERATOR_FINISHED;
+ return changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
void LATTICE_OT_flip(wmOperatorType *ot)
diff --git a/source/blender/editors/lattice/lattice_ops.c b/source/blender/editors/lattice/lattice_ops.c
index 2e6eafb0886..76ccc2250ee 100644
--- a/source/blender/editors/lattice/lattice_ops.c
+++ b/source/blender/editors/lattice/lattice_ops.c
@@ -56,28 +56,6 @@ void ED_operatortypes_lattice(void)
void ED_keymap_lattice(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap;
- wmKeyMapItem *kmi;
-
- keymap = WM_keymap_ensure(keyconf, "Lattice", 0, 0);
+ wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Lattice", 0, 0);
keymap->poll = ED_operator_editlattice;
-
- kmi = WM_keymap_add_item(keymap, "LATTICE_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "LATTICE_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "LATTICE_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
- WM_keymap_add_item(keymap, "LATTICE_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "LATTICE_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "OBJECT_OT_vertex_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "LATTICE_OT_flip", FKEY, KM_PRESS, KM_ALT, 0);
-
- /* menus */
- WM_keymap_add_menu(keymap, "VIEW3D_MT_hook", HKEY, KM_PRESS, KM_CTRL, 0);
-
- ED_keymap_proportional_cycle(keyconf, keymap);
- ED_keymap_proportional_editmode(keyconf, keymap, false);
}
diff --git a/source/blender/editors/mask/mask_edit.c b/source/blender/editors/mask/mask_edit.c
index d734f4fbb93..03fc7252ea6 100644
--- a/source/blender/editors/mask/mask_edit.c
+++ b/source/blender/editors/mask/mask_edit.c
@@ -479,7 +479,7 @@ void ED_operatortypes_mask(void)
/* select */
WM_operatortype_append(MASK_OT_select);
WM_operatortype_append(MASK_OT_select_all);
- WM_operatortype_append(MASK_OT_select_border);
+ WM_operatortype_append(MASK_OT_select_box);
WM_operatortype_append(MASK_OT_select_lasso);
WM_operatortype_append(MASK_OT_select_circle);
WM_operatortype_append(MASK_OT_select_linked_pick);
@@ -523,111 +523,8 @@ void ED_operatortypes_mask(void)
void ED_keymap_mask(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap;
- wmKeyMapItem *kmi;
-
- keymap = WM_keymap_ensure(keyconf, "Mask Editing", 0, 0);
+ wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Mask Editing", 0, 0);
keymap->poll = ED_maskedit_poll;
-
- WM_keymap_add_item(keymap, "MASK_OT_new", NKEY, KM_PRESS, KM_ALT, 0);
-
- /* add menu */
- WM_keymap_add_menu(keymap, "MASK_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* mask mode supports PET now */
- ED_keymap_proportional_cycle(keyconf, keymap);
- ED_keymap_proportional_maskmode(keyconf, keymap);
-
- /* geometry */
- WM_keymap_add_item(keymap, "MASK_OT_add_vertex_slide", ACTIONMOUSE, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "MASK_OT_add_feather_vertex_slide", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "MASK_OT_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "MASK_OT_delete", DELKEY, KM_PRESS, 0, 0);
-
- /* selection */
- kmi = WM_keymap_add_item(keymap, "MASK_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- RNA_boolean_set(kmi->ptr, "toggle", false);
- kmi = WM_keymap_add_item(keymap, "MASK_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- RNA_boolean_set(kmi->ptr, "toggle", true);
-
- kmi = WM_keymap_add_item(keymap, "MASK_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "MASK_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "MASK_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- WM_keymap_add_item(keymap, "MASK_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0);
- kmi = WM_keymap_add_item(keymap, "MASK_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- kmi = WM_keymap_add_item(keymap, "MASK_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", true);
-
- WM_keymap_add_item(keymap, "MASK_OT_select_border", BKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "MASK_OT_select_circle", CKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "MASK_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- kmi = WM_keymap_add_item(keymap, "MASK_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_SHIFT | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", true);
-
- WM_keymap_add_item(keymap, "MASK_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "MASK_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
-
- /* hide/reveal */
- WM_keymap_add_item(keymap, "MASK_OT_hide_view_clear", HKEY, KM_PRESS, KM_ALT, 0);
- kmi = WM_keymap_add_item(keymap, "MASK_OT_hide_view_set", HKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
-
- kmi = WM_keymap_add_item(keymap, "MASK_OT_hide_view_set", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
-
- /* select clip while in maker view,
- * this matches View3D functionality where you can select an
- * object while in editmode to allow vertex parenting */
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
-
- /* shape */
- WM_keymap_add_item(keymap, "MASK_OT_cyclic_toggle", CKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "MASK_OT_slide_point", ACTIONMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "MASK_OT_slide_spline_curvature", ACTIONMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "MASK_OT_handle_type_set", VKEY, KM_PRESS, 0, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "MASK_OT_normals_make_consistent", NKEY, KM_PRESS, KM_CTRL, 0);
-#else
- WM_keymap_add_item(keymap, "MASK_OT_normals_make_consistent", NKEY, KM_PRESS, KM_SHIFT, 0);
-#endif
- // WM_keymap_add_item(keymap, "MASK_OT_feather_weight_clear", SKEY, KM_PRESS, KM_ALT, 0);
- /* ... matches curve editmode */
-
- /* relationships */
- WM_keymap_add_item(keymap, "MASK_OT_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "MASK_OT_parent_clear", PKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "MASK_OT_shape_key_insert", IKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "MASK_OT_shape_key_clear", IKEY, KM_PRESS, KM_ALT, 0);
-
- /* duplicate */
- WM_keymap_add_item(keymap, "MASK_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "MASK_OT_copy_splines", CKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "MASK_OT_paste_splines", VKEY, KM_PRESS, KM_CTRL, 0);
-
- /* for image editor only */
- WM_keymap_add_item(keymap, "UV_OT_cursor_set", ACTIONMOUSE, KM_PRESS, 0, 0);
-
- /* Transform (don't use transform_keymap_for_space() since this maps to different spaces) */
- WM_keymap_add_item(keymap, "TRANSFORM_OT_translate", GKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "TRANSFORM_OT_translate", EVT_TWEAK_S, KM_ANY, 0, 0);
- WM_keymap_add_item(keymap, "TRANSFORM_OT_resize", SKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "TRANSFORM_OT_rotate", RKEY, KM_PRESS, 0, 0);
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_MASK_SHRINKFATTEN);
}
void ED_operatormacros_mask(void)
diff --git a/source/blender/editors/mask/mask_editaction.c b/source/blender/editors/mask/mask_editaction.c
index 771deca69b6..00db3c6e659 100644
--- a/source/blender/editors/mask/mask_editaction.c
+++ b/source/blender/editors/mask/mask_editaction.c
@@ -51,9 +51,9 @@
/* ***************************************** */
/* NOTE ABOUT THIS FILE:
- * This file contains code for editing Mask data in the Action Editor
- * as a 'keyframes', so that a user can adjust the timing of Mask shapekeys.
- * Therefore, this file mostly contains functions for selecting Mask frames (shapekeys).
+ * This file contains code for editing Mask data in the Action Editor
+ * as a 'keyframes', so that a user can adjust the timing of Mask shapekeys.
+ * Therefore, this file mostly contains functions for selecting Mask frames (shapekeys).
*/
/* ***************************************** */
/* Generics - Loopers */
@@ -187,7 +187,7 @@ void ED_mask_select_frame(MaskLayer *masklay, int selx, short select_mode)
}
/* select the frames in this layer that occur within the bounds specified */
-void ED_masklayer_frames_select_border(MaskLayer *masklay, float min, float max, short select_mode)
+void ED_masklayer_frames_select_box(MaskLayer *masklay, float min, float max, short select_mode)
{
MaskLayerShape *masklay_shape;
diff --git a/source/blender/editors/mask/mask_intern.h b/source/blender/editors/mask/mask_intern.h
index e9ef06a368f..cb2bb953994 100644
--- a/source/blender/editors/mask/mask_intern.h
+++ b/source/blender/editors/mask/mask_intern.h
@@ -103,7 +103,7 @@ void MASK_OT_parent_clear(struct wmOperatorType *ot);
void MASK_OT_select(struct wmOperatorType *ot);
void MASK_OT_select_all(struct wmOperatorType *ot);
-void MASK_OT_select_border(struct wmOperatorType *ot);
+void MASK_OT_select_box(struct wmOperatorType *ot);
void MASK_OT_select_lasso(struct wmOperatorType *ot);
void MASK_OT_select_circle(struct wmOperatorType *ot);
void MASK_OT_select_linked_pick(struct wmOperatorType *ot);
diff --git a/source/blender/editors/mask/mask_select.c b/source/blender/editors/mask/mask_select.c
index 530b7bd968c..a5daa7b4565 100644
--- a/source/blender/editors/mask/mask_select.c
+++ b/source/blender/editors/mask/mask_select.c
@@ -396,9 +396,9 @@ void MASK_OT_select(wmOperatorType *ot)
-/********************** border select operator *********************/
+/********************** box select operator *********************/
-static int border_select_exec(bContext *C, wmOperator *op)
+static int box_select_exec(bContext *C, wmOperator *op)
{
ScrArea *sa = CTX_wm_area(C);
ARegion *ar = CTX_wm_region(C);
@@ -462,24 +462,24 @@ static int border_select_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-void MASK_OT_select_border(wmOperatorType *ot)
+void MASK_OT_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
- ot->description = "Select curve points using border selection";
- ot->idname = "MASK_OT_select_border";
+ ot->name = "Box Select";
+ ot->description = "Select curve points using box selection";
+ ot->idname = "MASK_OT_select_box";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
- ot->exec = border_select_exec;
- ot->modal = WM_gesture_border_modal;
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = box_select_exec;
+ ot->modal = WM_gesture_box_modal;
ot->poll = ED_maskedit_mask_poll;
/* flags */
ot->flag = OPTYPE_UNDO;
/* properties */
- WM_operator_properties_gesture_border_select(ot);
+ WM_operator_properties_gesture_box_select(ot);
}
static bool do_lasso_select_mask(bContext *C, const int mcords[][2], short moves, bool select, bool extend)
diff --git a/source/blender/editors/mesh/CMakeLists.txt b/source/blender/editors/mesh/CMakeLists.txt
index 4784f07c297..5e014d3ef25 100644
--- a/source/blender/editors/mesh/CMakeLists.txt
+++ b/source/blender/editors/mesh/CMakeLists.txt
@@ -48,8 +48,10 @@ set(SRC
editmesh_bevel.c
editmesh_bisect.c
editmesh_extrude.c
+ editmesh_extrude_gizmo.c
editmesh_extrude_screw.c
editmesh_extrude_spin.c
+ editmesh_extrude_spin_gizmo.c
editmesh_inset.c
editmesh_intersect.c
editmesh_knife.c
@@ -57,10 +59,12 @@ set(SRC
editmesh_loopcut.c
editmesh_path.c
editmesh_polybuild.c
- editmesh_preselect.c
+ editmesh_preselect_edgering.c
+ editmesh_preselect_elem.c
editmesh_rip.c
editmesh_rip_edge.c
editmesh_select.c
+ editmesh_select_similar.c
editmesh_tools.c
editmesh_undo.c
editmesh_utils.c
diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c
index 66ad057e3ec..ae9b8898eb2 100644
--- a/source/blender/editors/mesh/editmesh_add.c
+++ b/source/blender/editors/mesh/editmesh_add.c
@@ -38,7 +38,6 @@
#include "BLT_translation.h"
#include "BKE_context.h"
-#include "BKE_library.h"
#include "BKE_editmesh.h"
#include "RNA_define.h"
@@ -67,14 +66,14 @@ typedef struct MakePrimitiveData {
static Object *make_prim_init(
bContext *C, const char *idname,
- const float loc[3], const float rot[3], const unsigned int layer,
+ const float loc[3], const float rot[3],
MakePrimitiveData *r_creation_data)
{
Object *obedit = CTX_data_edit_object(C);
r_creation_data->was_editmode = false;
if (obedit == NULL || obedit->type != OB_MESH) {
- obedit = ED_object_add_type(C, OB_MESH, idname, loc, rot, false, layer);
+ obedit = ED_object_add_type(C, OB_MESH, idname, loc, rot, false);
/* create editmode */
ED_object_editmode_enter(C, EM_IGNORE_LAYER); /* rare cases the active layer is messed up */
@@ -112,12 +111,11 @@ static int add_primitive_plane_exec(bContext *C, wmOperator *op)
BMEditMesh *em;
float loc[3], rot[3];
bool enter_editmode;
- unsigned int layer;
const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
WM_operator_view3d_unit_defaults(C, op);
- ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL);
- obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Plane"), loc, rot, layer, &creation_data);
+ ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL);
+ obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Plane"), loc, rot, &creation_data);
em = BKE_editmesh_from_object(obedit);
if (calc_uvs) {
@@ -163,12 +161,11 @@ static int add_primitive_cube_exec(bContext *C, wmOperator *op)
BMEditMesh *em;
float loc[3], rot[3];
bool enter_editmode;
- unsigned int layer;
const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
WM_operator_view3d_unit_defaults(C, op);
- ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL);
- obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Cube"), loc, rot, layer, &creation_data);
+ ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL);
+ obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Cube"), loc, rot, &creation_data);
em = BKE_editmesh_from_object(obedit);
if (calc_uvs) {
@@ -222,15 +219,14 @@ static int add_primitive_circle_exec(bContext *C, wmOperator *op)
float loc[3], rot[3];
bool enter_editmode;
int cap_end, cap_tri;
- unsigned int layer;
const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
cap_end = RNA_enum_get(op->ptr, "fill_type");
cap_tri = (cap_end == 2);
WM_operator_view3d_unit_defaults(C, op);
- ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL);
- obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Circle"), loc, rot, layer, &creation_data);
+ ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL);
+ obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Circle"), loc, rot, &creation_data);
em = BKE_editmesh_from_object(obedit);
if (calc_uvs) {
@@ -281,15 +277,14 @@ static int add_primitive_cylinder_exec(bContext *C, wmOperator *op)
BMEditMesh *em;
float loc[3], rot[3];
bool enter_editmode;
- unsigned int layer;
const int end_fill_type = RNA_enum_get(op->ptr, "end_fill_type");
const bool cap_end = (end_fill_type != 0);
const bool cap_tri = (end_fill_type == 2);
const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
WM_operator_view3d_unit_defaults(C, op);
- ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL);
- obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Cylinder"), loc, rot, layer, &creation_data);
+ ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL);
+ obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Cylinder"), loc, rot, &creation_data);
em = BKE_editmesh_from_object(obedit);
if (calc_uvs) {
@@ -344,15 +339,14 @@ static int add_primitive_cone_exec(bContext *C, wmOperator *op)
BMEditMesh *em;
float loc[3], rot[3];
bool enter_editmode;
- unsigned int layer;
const int end_fill_type = RNA_enum_get(op->ptr, "end_fill_type");
const bool cap_end = (end_fill_type != 0);
const bool cap_tri = (end_fill_type == 2);
const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
WM_operator_view3d_unit_defaults(C, op);
- ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL);
- obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Cone"), loc, rot, layer, &creation_data);
+ ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL);
+ obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Cone"), loc, rot, &creation_data);
em = BKE_editmesh_from_object(obedit);
if (calc_uvs) {
@@ -406,12 +400,11 @@ static int add_primitive_grid_exec(bContext *C, wmOperator *op)
BMEditMesh *em;
float loc[3], rot[3];
bool enter_editmode;
- unsigned int layer;
const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
WM_operator_view3d_unit_defaults(C, op);
- ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL);
- obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Grid"), loc, rot, layer, &creation_data);
+ ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL);
+ obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Grid"), loc, rot, &creation_data);
em = BKE_editmesh_from_object(obedit);
if (calc_uvs) {
@@ -466,13 +459,12 @@ static int add_primitive_monkey_exec(bContext *C, wmOperator *op)
float loc[3], rot[3];
float dia;
bool enter_editmode;
- unsigned int layer;
const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
WM_operator_view3d_unit_defaults(C, op);
- ED_object_add_generic_get_opts(C, op, 'Y', loc, rot, &enter_editmode, &layer, NULL);
+ ED_object_add_generic_get_opts(C, op, 'Y', loc, rot, &enter_editmode, NULL);
- obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Suzanne"), loc, rot, layer, &creation_data);
+ obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Suzanne"), loc, rot, &creation_data);
dia = RNA_float_get(op->ptr, "radius");
mul_mat3_m4_fl(creation_data.mat, dia);
@@ -521,12 +513,11 @@ static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op)
BMEditMesh *em;
float loc[3], rot[3];
bool enter_editmode;
- unsigned int layer;
const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
WM_operator_view3d_unit_defaults(C, op);
- ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL);
- obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Sphere"), loc, rot, layer, &creation_data);
+ ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL);
+ obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Sphere"), loc, rot, &creation_data);
em = BKE_editmesh_from_object(obedit);
if (calc_uvs) {
@@ -577,12 +568,11 @@ static int add_primitive_icosphere_exec(bContext *C, wmOperator *op)
BMEditMesh *em;
float loc[3], rot[3];
bool enter_editmode;
- unsigned int layer;
const bool calc_uvs = RNA_boolean_get(op->ptr, "calc_uvs");
WM_operator_view3d_unit_defaults(C, op);
- ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL);
- obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Icosphere"), loc, rot, layer, &creation_data);
+ ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL);
+ obedit = make_prim_init(C, CTX_DATA_(BLT_I18NCONTEXT_ID_MESH, "Icosphere"), loc, rot, &creation_data);
em = BKE_editmesh_from_object(obedit);
if (calc_uvs) {
diff --git a/source/blender/editors/mesh/editmesh_add_gizmo.c b/source/blender/editors/mesh/editmesh_add_gizmo.c
index 6fa0eb33b89..7437d86e6b5 100644
--- a/source/blender/editors/mesh/editmesh_add_gizmo.c
+++ b/source/blender/editors/mesh/editmesh_add_gizmo.c
@@ -35,6 +35,7 @@
#include "BKE_editmesh.h"
#include "ED_gizmo_library.h"
+#include "ED_gizmo_utils.h"
#include "ED_mesh.h"
#include "ED_object.h"
#include "ED_screen.h"
@@ -98,20 +99,11 @@ static void calc_initial_placement_point_from_view(
}
if (use_mouse_project) {
- float ray_co[3], ray_no[3];
- if (ED_view3d_win_to_ray(
- CTX_data_depsgraph(C),
- ar, v3d, mval,
- ray_co, ray_no, false))
- {
- float plane[4];
- plane_from_point_normal_v3(plane, cursor_matrix[3], orient_matrix[2]);
- float lambda;
- if (isect_ray_plane_v3(ray_co, ray_no, plane, &lambda, true)) {
- madd_v3_v3v3fl(r_location, ray_co, ray_no, lambda);
- copy_m3_m3(r_rotation, orient_matrix);
- return;
- }
+ float plane[4];
+ plane_from_point_normal_v3(plane, cursor_matrix[3], orient_matrix[2]);
+ if (ED_view3d_win_to_3d_on_plane(ar, plane, mval, true, r_location)) {
+ copy_m3_m3(r_rotation, orient_matrix);
+ return;
}
}
@@ -140,21 +132,21 @@ typedef struct GizmoPlacementGroup {
* This is needed because changing the RNA doesn't cause a redo
* and we're not using operator UI which does just this.
*/
-static void gizmo_placement_exec(GizmoPlacementGroup *man)
+static void gizmo_placement_exec(GizmoPlacementGroup *ggd)
{
- wmOperator *op = man->data.op;
- if (op == WM_operator_last_redo((bContext *)man->data.context)) {
- ED_undo_operator_repeat((bContext *)man->data.context, op);
+ wmOperator *op = ggd->data.op;
+ if (op == WM_operator_last_redo((bContext *)ggd->data.context)) {
+ ED_undo_operator_repeat((bContext *)ggd->data.context, op);
}
}
-static void gizmo_mesh_placement_update_from_op(GizmoPlacementGroup *man)
+static void gizmo_mesh_placement_update_from_op(GizmoPlacementGroup *ggd)
{
- wmOperator *op = man->data.op;
+ wmOperator *op = ggd->data.op;
UNUSED_VARS(op);
/* For now don't read back from the operator. */
#if 0
- RNA_property_float_get_array(op->ptr, man->data.prop_matrix, &man->cage->matrix_offset[0][0]);
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_matrix, &ggd->cage->matrix_offset[0][0]);
#endif
}
@@ -163,15 +155,15 @@ static void gizmo_placement_prop_matrix_get(
const wmGizmo *gz, wmGizmoProperty *gz_prop,
void *value_p)
{
- GizmoPlacementGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
+ GizmoPlacementGroup *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
float *value = value_p;
BLI_assert(gz_prop->type->array_length == 16);
UNUSED_VARS_NDEBUG(gz_prop);
- if (value_p != man->cage->matrix_offset) {
- mul_m4_m4m4(value_p, man->cage->matrix_basis, man->cage->matrix_offset);
- RNA_property_float_get_array(op->ptr, man->data.prop_matrix, value);
+ if (value_p != ggd->cage->matrix_offset) {
+ mul_m4_m4m4(value_p, ggd->cage->matrix_basis, ggd->cage->matrix_offset);
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_matrix, value);
}
}
@@ -179,42 +171,37 @@ static void gizmo_placement_prop_matrix_set(
const wmGizmo *gz, wmGizmoProperty *gz_prop,
const void *value)
{
- GizmoPlacementGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
+ GizmoPlacementGroup *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
BLI_assert(gz_prop->type->array_length == 16);
UNUSED_VARS_NDEBUG(gz_prop);
float mat[4][4];
- mul_m4_m4m4(mat, man->cage->matrix_basis, value);
+ mul_m4_m4m4(mat, ggd->cage->matrix_basis, value);
if (is_negative_m4(mat)) {
negate_mat3_m4(mat);
}
- RNA_property_float_set_array(op->ptr, man->data.prop_matrix, &mat[0][0]);
+ RNA_property_float_set_array(op->ptr, ggd->data.prop_matrix, &mat[0][0]);
- gizmo_placement_exec(man);
+ gizmo_placement_exec(ggd);
}
static bool gizmo_mesh_placement_poll(const bContext *C, wmGizmoGroupType *gzgt)
{
- wmOperator *op = WM_operator_last_redo(C);
- if (op == NULL || !STREQ(op->type->idname, "MESH_OT_primitive_cube_add_gizmo")) {
- WM_gizmo_group_type_unlink_delayed_ptr(gzgt);
- return false;
- }
- return true;
+ return ED_gizmo_poll_or_unlink_delayed_from_operator(C, gzgt, "MESH_OT_primitive_cube_add_gizmo");
}
static void gizmo_mesh_placement_modal_from_setup(
const bContext *C, wmGizmoGroup *gzgroup)
{
- GizmoPlacementGroup *man = gzgroup->customdata;
+ GizmoPlacementGroup *ggd = gzgroup->customdata;
/* Initial size. */
{
- wmGizmo *gz = man->cage;
+ wmGizmo *gz = ggd->cage;
zero_m4(gz->matrix_offset);
/* TODO: support zero scaled matrix in 'GIZMO_GT_cage_3d'. */
@@ -228,7 +215,7 @@ static void gizmo_mesh_placement_modal_from_setup(
{
wmWindow *win = CTX_wm_window(C);
ARegion *ar = CTX_wm_region(C);
- wmGizmo *gz = man->cage;
+ wmGizmo *gz = ggd->cage;
{
float mat3[3][3];
@@ -246,7 +233,7 @@ static void gizmo_mesh_placement_modal_from_setup(
if (1) {
wmGizmoMap *gzmap = gzgroup->parent_gzmap;
WM_gizmo_modal_set_from_setup(
- gzmap, (bContext *)C, man->cage, ED_GIZMO_CAGE3D_PART_SCALE_MAX_X_MAX_Y_MAX_Z, win->eventstate);
+ gzmap, (bContext *)C, ggd->cage, ED_GIZMO_CAGE3D_PART_SCALE_MAX_X_MAX_Y_MAX_Z, win->eventstate);
}
}
}
@@ -259,32 +246,32 @@ static void gizmo_mesh_placement_setup(const bContext *C, wmGizmoGroup *gzgroup)
return;
}
- struct GizmoPlacementGroup *man = MEM_callocN(sizeof(GizmoPlacementGroup), __func__);
- gzgroup->customdata = man;
+ struct GizmoPlacementGroup *ggd = MEM_callocN(sizeof(GizmoPlacementGroup), __func__);
+ gzgroup->customdata = ggd;
const wmGizmoType *gzt_cage = WM_gizmotype_find("GIZMO_GT_cage_3d", true);
- man->cage = WM_gizmo_new_ptr(gzt_cage, gzgroup, NULL);
+ ggd->cage = WM_gizmo_new_ptr(gzt_cage, gzgroup, NULL);
- UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, man->cage->color);
+ UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, ggd->cage->color);
- RNA_enum_set(man->cage->ptr, "transform",
+ RNA_enum_set(ggd->cage->ptr, "transform",
ED_GIZMO_CAGE2D_XFORM_FLAG_SCALE |
ED_GIZMO_CAGE2D_XFORM_FLAG_TRANSLATE |
ED_GIZMO_CAGE2D_XFORM_FLAG_SCALE_SIGNED);
- WM_gizmo_set_flag(man->cage, WM_GIZMO_DRAW_VALUE, true);
+ WM_gizmo_set_flag(ggd->cage, WM_GIZMO_DRAW_VALUE, true);
- man->data.context = (bContext *)C;
- man->data.op = op;
- man->data.prop_matrix = RNA_struct_find_property(op->ptr, "matrix");
+ ggd->data.context = (bContext *)C;
+ ggd->data.op = op;
+ ggd->data.prop_matrix = RNA_struct_find_property(op->ptr, "matrix");
- gizmo_mesh_placement_update_from_op(man);
+ gizmo_mesh_placement_update_from_op(ggd);
/* Setup property callbacks */
{
WM_gizmo_target_property_def_func(
- man->cage, "matrix",
+ ggd->cage, "matrix",
&(const struct wmGizmoPropertyFnParams) {
.value_get_fn = gizmo_placement_prop_matrix_get,
.value_set_fn = gizmo_placement_prop_matrix_set,
@@ -299,11 +286,11 @@ static void gizmo_mesh_placement_setup(const bContext *C, wmGizmoGroup *gzgroup)
static void gizmo_mesh_placement_draw_prepare(
const bContext *UNUSED(C), wmGizmoGroup *gzgroup)
{
- GizmoPlacementGroup *man = gzgroup->customdata;
- if (man->data.op->next) {
- man->data.op = WM_operator_last_redo((bContext *)man->data.context);
+ GizmoPlacementGroup *ggd = gzgroup->customdata;
+ if (ggd->data.op->next) {
+ ggd->data.op = WM_operator_last_redo((bContext *)ggd->data.context);
}
- gizmo_mesh_placement_update_from_op(man);
+ gizmo_mesh_placement_update_from_op(ggd);
}
static void MESH_GGT_add_bounds(struct wmGizmoGroupType *gzgt)
@@ -334,7 +321,7 @@ static void MESH_GGT_add_bounds(struct wmGizmoGroupType *gzgt)
static int add_primitive_cube_gizmo_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);;
+ Object *obedit = CTX_data_edit_object(C);
BMEditMesh *em = BKE_editmesh_from_object(obedit);
float matrix[4][4];
@@ -380,17 +367,10 @@ static int add_primitive_cube_gizmo_invoke(bContext *C, wmOperator *op, const wm
if (ret & OPERATOR_FINISHED) {
/* Setup gizmos */
if (v3d && ((v3d->gizmo_flag & V3D_GIZMO_HIDE) == 0)) {
- ARegion *ar = CTX_wm_region(C);
- wmGizmoMap *gzmap = ar->gizmo_map;
wmGizmoGroupType *gzgt = WM_gizmogrouptype_find("MESH_GGT_add_bounds", false);
- wmGizmoGroup *gzgroup = WM_gizmomap_group_find_ptr(gzmap, gzgt);
- if (gzgroup != NULL) {
- GizmoPlacementGroup *man = gzgroup->customdata;
- man->data.op = op;
- gizmo_mesh_placement_modal_from_setup(C, gzgroup);
- }
- else {
- WM_gizmo_group_type_ensure_ptr(gzgt);
+ if (!WM_gizmo_group_type_ensure_ptr(gzgt)) {
+ struct Main *bmain = CTX_data_main(C);
+ WM_gizmo_group_type_reinit_ptr(bmain, gzgt);
}
}
}
diff --git a/source/blender/editors/mesh/editmesh_bisect.c b/source/blender/editors/mesh/editmesh_bisect.c
index 0296c82c9aa..aaa46847495 100644
--- a/source/blender/editors/mesh/editmesh_bisect.c
+++ b/source/blender/editors/mesh/editmesh_bisect.c
@@ -50,6 +50,7 @@
#include "ED_mesh.h"
#include "ED_screen.h"
#include "ED_view3d.h"
+#include "ED_gizmo_utils.h"
#include "UI_resources.h"
@@ -287,7 +288,7 @@ static int mesh_bisect_exec(bContext *C, wmOperator *op)
/* -------------------------------------------------------------------- */
/* Modal support */
- /* Note: keep this isolated, exec can work wihout this */
+ /* Note: keep this isolated, exec can work without this */
if (opdata != NULL) {
mesh_bisect_interactive_calc(C, op, plane_co, plane_no);
/* Write back to the props. */
@@ -458,47 +459,47 @@ typedef struct GizmoGroup {
* This is needed because changing the RNA doesn't cause a redo
* and we're not using operator UI which does just this.
*/
-static void gizmo_bisect_exec(GizmoGroup *man)
+static void gizmo_bisect_exec(GizmoGroup *ggd)
{
- wmOperator *op = man->data.op;
- if (op == WM_operator_last_redo((bContext *)man->data.context)) {
- ED_undo_operator_repeat((bContext *)man->data.context, op);
+ wmOperator *op = ggd->data.op;
+ if (op == WM_operator_last_redo((bContext *)ggd->data.context)) {
+ ED_undo_operator_repeat((bContext *)ggd->data.context, op);
}
}
-static void gizmo_mesh_bisect_update_from_op(GizmoGroup *man)
+static void gizmo_mesh_bisect_update_from_op(GizmoGroup *ggd)
{
- wmOperator *op = man->data.op;
+ wmOperator *op = ggd->data.op;
float plane_co[3], plane_no[3];
- RNA_property_float_get_array(op->ptr, man->data.prop_plane_co, plane_co);
- RNA_property_float_get_array(op->ptr, man->data.prop_plane_no, plane_no);
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_plane_co, plane_co);
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_plane_no, plane_no);
- WM_gizmo_set_matrix_location(man->translate_z, plane_co);
- WM_gizmo_set_matrix_location(man->rotate_c, plane_co);
+ WM_gizmo_set_matrix_location(ggd->translate_z, plane_co);
+ WM_gizmo_set_matrix_location(ggd->rotate_c, plane_co);
/* translate_c location comes from the property. */
- WM_gizmo_set_matrix_rotation_from_z_axis(man->translate_z, plane_no);
+ WM_gizmo_set_matrix_rotation_from_z_axis(ggd->translate_z, plane_no);
- WM_gizmo_set_scale(man->translate_c, 0.2);
+ WM_gizmo_set_scale(ggd->translate_c, 0.2);
- RegionView3D *rv3d = ED_view3d_context_rv3d(man->data.context);
+ RegionView3D *rv3d = ED_view3d_context_rv3d(ggd->data.context);
if (rv3d) {
- normalize_v3_v3(man->data.rotate_axis, rv3d->viewinv[2]);
- normalize_v3_v3(man->data.rotate_up, rv3d->viewinv[1]);
+ normalize_v3_v3(ggd->data.rotate_axis, rv3d->viewinv[2]);
+ normalize_v3_v3(ggd->data.rotate_up, rv3d->viewinv[1]);
/* ensure its orthogonal */
- project_plane_normalized_v3_v3v3(man->data.rotate_up, man->data.rotate_up, man->data.rotate_axis);
- normalize_v3(man->data.rotate_up);
+ project_plane_normalized_v3_v3v3(ggd->data.rotate_up, ggd->data.rotate_up, ggd->data.rotate_axis);
+ normalize_v3(ggd->data.rotate_up);
- WM_gizmo_set_matrix_rotation_from_z_axis(man->translate_c, plane_no);
+ WM_gizmo_set_matrix_rotation_from_z_axis(ggd->translate_c, plane_no);
float plane_no_cross[3];
- cross_v3_v3v3(plane_no_cross, plane_no, man->data.rotate_axis);
+ cross_v3_v3v3(plane_no_cross, plane_no, ggd->data.rotate_axis);
- WM_gizmo_set_matrix_offset_rotation_from_yz_axis(man->rotate_c, plane_no_cross, man->data.rotate_axis);
- RNA_enum_set(man->rotate_c->ptr, "draw_options",
+ WM_gizmo_set_matrix_offset_rotation_from_yz_axis(ggd->rotate_c, plane_no_cross, ggd->data.rotate_axis);
+ RNA_enum_set(ggd->rotate_c->ptr, "draw_options",
ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_MIRROR |
ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_START_Y);
}
@@ -509,16 +510,16 @@ static void gizmo_bisect_prop_depth_get(
const wmGizmo *gz, wmGizmoProperty *gz_prop,
void *value_p)
{
- GizmoGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
+ GizmoGroup *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
float *value = value_p;
BLI_assert(gz_prop->type->array_length == 1);
UNUSED_VARS_NDEBUG(gz_prop);
float plane_co[3], plane_no[3];
- RNA_property_float_get_array(op->ptr, man->data.prop_plane_co, plane_co);
- RNA_property_float_get_array(op->ptr, man->data.prop_plane_no, plane_no);
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_plane_co, plane_co);
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_plane_no, plane_no);
value[0] = dot_v3v3(plane_no, plane_co) - dot_v3v3(plane_no, gz->matrix_basis[3]);
}
@@ -527,16 +528,16 @@ static void gizmo_bisect_prop_depth_set(
const wmGizmo *gz, wmGizmoProperty *gz_prop,
const void *value_p)
{
- GizmoGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
+ GizmoGroup *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
const float *value = value_p;
BLI_assert(gz_prop->type->array_length == 1);
UNUSED_VARS_NDEBUG(gz_prop);
float plane_co[3], plane[4];
- RNA_property_float_get_array(op->ptr, man->data.prop_plane_co, plane_co);
- RNA_property_float_get_array(op->ptr, man->data.prop_plane_no, plane);
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_plane_co, plane_co);
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_plane_no, plane);
normalize_v3(plane);
plane[3] = -value[0] - dot_v3v3(plane, gz->matrix_basis[3]);
@@ -544,9 +545,9 @@ static void gizmo_bisect_prop_depth_set(
/* Keep our location, may be offset simply to be inside the viewport. */
closest_to_plane_normalized_v3(plane_co, plane, plane_co);
- RNA_property_float_set_array(op->ptr, man->data.prop_plane_co, plane_co);
+ RNA_property_float_set_array(op->ptr, ggd->data.prop_plane_co, plane_co);
- gizmo_bisect_exec(man);
+ gizmo_bisect_exec(ggd);
}
/* translate callbacks */
@@ -554,28 +555,28 @@ static void gizmo_bisect_prop_translate_get(
const wmGizmo *gz, wmGizmoProperty *gz_prop,
void *value_p)
{
- GizmoGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
+ GizmoGroup *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
BLI_assert(gz_prop->type->array_length == 3);
UNUSED_VARS_NDEBUG(gz_prop);
- RNA_property_float_get_array(op->ptr, man->data.prop_plane_co, value_p);
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_plane_co, value_p);
}
static void gizmo_bisect_prop_translate_set(
const wmGizmo *gz, wmGizmoProperty *gz_prop,
const void *value_p)
{
- GizmoGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
+ GizmoGroup *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
BLI_assert(gz_prop->type->array_length == 3);
UNUSED_VARS_NDEBUG(gz_prop);
- RNA_property_float_set_array(op->ptr, man->data.prop_plane_co, value_p);
+ RNA_property_float_set_array(op->ptr, ggd->data.prop_plane_co, value_p);
- gizmo_bisect_exec(man);
+ gizmo_bisect_exec(ggd);
}
/* angle callbacks */
@@ -583,22 +584,22 @@ static void gizmo_bisect_prop_angle_get(
const wmGizmo *gz, wmGizmoProperty *gz_prop,
void *value_p)
{
- GizmoGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
+ GizmoGroup *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
float *value = value_p;
BLI_assert(gz_prop->type->array_length == 1);
UNUSED_VARS_NDEBUG(gz_prop);
float plane_no[4];
- RNA_property_float_get_array(op->ptr, man->data.prop_plane_no, plane_no);
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_plane_no, plane_no);
normalize_v3(plane_no);
float plane_no_proj[3];
- project_plane_normalized_v3_v3v3(plane_no_proj, plane_no, man->data.rotate_axis);
+ project_plane_normalized_v3_v3v3(plane_no_proj, plane_no, ggd->data.rotate_axis);
if (!is_zero_v3(plane_no_proj)) {
- const float angle = -angle_signed_on_axis_v3v3_v3(plane_no_proj, man->data.rotate_up, man->data.rotate_axis);
+ const float angle = -angle_signed_on_axis_v3v3_v3(plane_no_proj, ggd->data.rotate_up, ggd->data.rotate_axis);
value[0] = angle;
}
else {
@@ -610,44 +611,39 @@ static void gizmo_bisect_prop_angle_set(
const wmGizmo *gz, wmGizmoProperty *gz_prop,
const void *value_p)
{
- GizmoGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
+ GizmoGroup *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
const float *value = value_p;
BLI_assert(gz_prop->type->array_length == 1);
UNUSED_VARS_NDEBUG(gz_prop);
float plane_no[4];
- RNA_property_float_get_array(op->ptr, man->data.prop_plane_no, plane_no);
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_plane_no, plane_no);
normalize_v3(plane_no);
float plane_no_proj[3];
- project_plane_normalized_v3_v3v3(plane_no_proj, plane_no, man->data.rotate_axis);
+ project_plane_normalized_v3_v3v3(plane_no_proj, plane_no, ggd->data.rotate_axis);
if (!is_zero_v3(plane_no_proj)) {
- const float angle = -angle_signed_on_axis_v3v3_v3(plane_no_proj, man->data.rotate_up, man->data.rotate_axis);
+ const float angle = -angle_signed_on_axis_v3v3_v3(plane_no_proj, ggd->data.rotate_up, ggd->data.rotate_axis);
const float angle_delta = angle - angle_compat_rad(value[0], angle);
if (angle_delta != 0.0f) {
float mat[3][3];
- axis_angle_normalized_to_mat3(mat, man->data.rotate_axis, angle_delta);
+ axis_angle_normalized_to_mat3(mat, ggd->data.rotate_axis, angle_delta);
mul_m3_v3(mat, plane_no);
/* re-normalize - seems acceptable */
- RNA_property_float_set_array(op->ptr, man->data.prop_plane_no, plane_no);
+ RNA_property_float_set_array(op->ptr, ggd->data.prop_plane_no, plane_no);
- gizmo_bisect_exec(man);
+ gizmo_bisect_exec(ggd);
}
}
}
static bool gizmo_mesh_bisect_poll(const bContext *C, wmGizmoGroupType *gzgt)
{
- wmOperator *op = WM_operator_last_redo(C);
- if (op == NULL || !STREQ(op->type->idname, "MESH_OT_bisect")) {
- WM_gizmo_group_type_unlink_delayed_ptr(gzgt);
- return false;
- }
- return true;
+ return ED_gizmo_poll_or_unlink_delayed_from_operator(C, gzgt, "MESH_OT_bisect");
}
static void gizmo_mesh_bisect_setup(const bContext *C, wmGizmoGroup *gzgroup)
@@ -658,40 +654,40 @@ static void gizmo_mesh_bisect_setup(const bContext *C, wmGizmoGroup *gzgroup)
return;
}
- struct GizmoGroup *man = MEM_callocN(sizeof(GizmoGroup), __func__);
- gzgroup->customdata = man;
+ struct GizmoGroup *ggd = MEM_callocN(sizeof(GizmoGroup), __func__);
+ gzgroup->customdata = ggd;
const wmGizmoType *gzt_arrow = WM_gizmotype_find("GIZMO_GT_arrow_3d", true);
- const wmGizmoType *gzt_grab = WM_gizmotype_find("GIZMO_GT_grab_3d", true);
+ const wmGizmoType *gzt_move = WM_gizmotype_find("GIZMO_GT_move_3d", true);
const wmGizmoType *gzt_dial = WM_gizmotype_find("GIZMO_GT_dial_3d", true);
- man->translate_z = WM_gizmo_new_ptr(gzt_arrow, gzgroup, NULL);
- man->translate_c = WM_gizmo_new_ptr(gzt_grab, gzgroup, NULL);
- man->rotate_c = WM_gizmo_new_ptr(gzt_dial, gzgroup, NULL);
+ ggd->translate_z = WM_gizmo_new_ptr(gzt_arrow, gzgroup, NULL);
+ ggd->translate_c = WM_gizmo_new_ptr(gzt_move, gzgroup, NULL);
+ ggd->rotate_c = WM_gizmo_new_ptr(gzt_dial, gzgroup, NULL);
- UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, man->translate_z->color);
- UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, man->translate_c->color);
- UI_GetThemeColor3fv(TH_GIZMO_SECONDARY, man->rotate_c->color);
+ UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, ggd->translate_z->color);
+ UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, ggd->translate_c->color);
+ UI_GetThemeColor3fv(TH_GIZMO_SECONDARY, ggd->rotate_c->color);
- RNA_enum_set(man->translate_z->ptr, "draw_style", ED_GIZMO_ARROW_STYLE_NORMAL);
- RNA_enum_set(man->translate_c->ptr, "draw_style", ED_GIZMO_GRAB_STYLE_RING_2D);
+ RNA_enum_set(ggd->translate_z->ptr, "draw_style", ED_GIZMO_ARROW_STYLE_NORMAL);
+ RNA_enum_set(ggd->translate_c->ptr, "draw_style", ED_GIZMO_MOVE_STYLE_RING_2D);
- WM_gizmo_set_flag(man->translate_c, WM_GIZMO_DRAW_VALUE, true);
- WM_gizmo_set_flag(man->rotate_c, WM_GIZMO_DRAW_VALUE, true);
+ WM_gizmo_set_flag(ggd->translate_c, WM_GIZMO_DRAW_VALUE, true);
+ WM_gizmo_set_flag(ggd->rotate_c, WM_GIZMO_DRAW_VALUE, true);
{
- man->data.context = (bContext *)C;
- man->data.op = op;
- man->data.prop_plane_co = RNA_struct_find_property(op->ptr, "plane_co");
- man->data.prop_plane_no = RNA_struct_find_property(op->ptr, "plane_no");
+ ggd->data.context = (bContext *)C;
+ ggd->data.op = op;
+ ggd->data.prop_plane_co = RNA_struct_find_property(op->ptr, "plane_co");
+ ggd->data.prop_plane_no = RNA_struct_find_property(op->ptr, "plane_no");
}
- gizmo_mesh_bisect_update_from_op(man);
+ gizmo_mesh_bisect_update_from_op(ggd);
/* Setup property callbacks */
{
WM_gizmo_target_property_def_func(
- man->translate_z, "offset",
+ ggd->translate_z, "offset",
&(const struct wmGizmoPropertyFnParams) {
.value_get_fn = gizmo_bisect_prop_depth_get,
.value_set_fn = gizmo_bisect_prop_depth_set,
@@ -700,7 +696,7 @@ static void gizmo_mesh_bisect_setup(const bContext *C, wmGizmoGroup *gzgroup)
});
WM_gizmo_target_property_def_func(
- man->translate_c, "offset",
+ ggd->translate_c, "offset",
&(const struct wmGizmoPropertyFnParams) {
.value_get_fn = gizmo_bisect_prop_translate_get,
.value_set_fn = gizmo_bisect_prop_translate_set,
@@ -709,7 +705,7 @@ static void gizmo_mesh_bisect_setup(const bContext *C, wmGizmoGroup *gzgroup)
});
WM_gizmo_target_property_def_func(
- man->rotate_c, "offset",
+ ggd->rotate_c, "offset",
&(const struct wmGizmoPropertyFnParams) {
.value_get_fn = gizmo_bisect_prop_angle_get,
.value_set_fn = gizmo_bisect_prop_angle_set,
@@ -722,11 +718,11 @@ static void gizmo_mesh_bisect_setup(const bContext *C, wmGizmoGroup *gzgroup)
static void gizmo_mesh_bisect_draw_prepare(
const bContext *UNUSED(C), wmGizmoGroup *gzgroup)
{
- GizmoGroup *man = gzgroup->customdata;
- if (man->data.op->next) {
- man->data.op = WM_operator_last_redo((bContext *)man->data.context);
+ GizmoGroup *ggd = gzgroup->customdata;
+ if (ggd->data.op->next) {
+ ggd->data.op = WM_operator_last_redo((bContext *)ggd->data.context);
}
- gizmo_mesh_bisect_update_from_op(man);
+ gizmo_mesh_bisect_update_from_op(ggd);
}
static void MESH_GGT_bisect(struct wmGizmoGroupType *gzgt)
diff --git a/source/blender/editors/mesh/editmesh_extrude.c b/source/blender/editors/mesh/editmesh_extrude.c
index 6e87f20cf8c..714ff10f6ca 100644
--- a/source/blender/editors/mesh/editmesh_extrude.c
+++ b/source/blender/editors/mesh/editmesh_extrude.c
@@ -39,23 +39,16 @@
#include "BKE_context.h"
#include "BKE_report.h"
#include "BKE_editmesh.h"
-#include "BKE_global.h"
-#include "BKE_idprop.h"
#include "RNA_define.h"
#include "RNA_access.h"
-#include "WM_api.h"
#include "WM_types.h"
-#include "WM_message.h"
#include "ED_mesh.h"
#include "ED_screen.h"
#include "ED_transform.h"
#include "ED_view3d.h"
-#include "ED_gizmo_library.h"
-
-#include "UI_resources.h"
#include "MEM_guardedalloc.h"
@@ -173,15 +166,15 @@ static bool edbm_extrude_discrete_faces(BMEditMesh *em, wmOperator *op, const ch
}
/* extrudes individual edges */
-static bool edbm_extrude_edges_indiv(BMEditMesh *em, wmOperator *op, const char hflag)
+static bool edbm_extrude_edges_indiv(BMEditMesh *em, wmOperator *op, const char hflag, const bool use_normal_flip)
{
BMesh *bm = em->bm;
BMOperator bmop;
EDBM_op_init(
em, &bmop, op,
- "extrude_edge_only edges=%he use_select_history=%b",
- hflag, true);
+ "extrude_edge_only edges=%he use_normal_flip=%b use_select_history=%b",
+ hflag, use_normal_flip, true);
/* deselect original verts */
BM_SELECT_HISTORY_BACKUP(bm);
@@ -248,6 +241,7 @@ static char edbm_extrude_htype_from_em_select(BMEditMesh *em)
static bool edbm_extrude_ex(
Object *obedit, BMEditMesh *em,
char htype, const char hflag,
+ const bool use_normal_flip,
const bool use_mirror,
const bool use_select_history)
{
@@ -262,6 +256,7 @@ static bool edbm_extrude_ex(
}
BMO_op_init(bm, &extop, BMO_FLAG_DEFAULTS, "extrude_face_region");
+ BMO_slot_bool_set(extop.slots_in, "use_normal_flip", use_normal_flip);
BMO_slot_bool_set(extop.slots_in, "use_select_history", use_select_history);
BMO_slot_buffer_from_enabled_hflag(bm, &extop, extop.slots_in, "geom", htype, hflag);
@@ -319,7 +314,7 @@ static int edbm_extrude_repeat_exec(bContext *C, wmOperator *op)
mul_m3_v3(tmat, dvec);
for (a = 0; a < steps; a++) {
- edbm_extrude_ex(obedit, em, BM_ALL_NOLOOP, BM_ELEM_SELECT, false, false);
+ edbm_extrude_ex(obedit, em, BM_ALL_NOLOOP, BM_ELEM_SELECT, false, false, false);
BMO_op_callf(
em->bm, BMO_FLAG_DEFAULTS,
@@ -358,326 +353,6 @@ void MESH_OT_extrude_repeat(wmOperatorType *ot)
/** \} */
-
-/* -------------------------------------------------------------------- */
-/** \name Extrude Gizmo
- * \{ */
-
-#ifdef USE_GIZMO
-
-static const float extrude_button_scale = 0.15f;
-static const float extrude_button_offset_scale = 1.5f;
-static const float extrude_arrow_scale = 1.0f;
-static const float extrude_arrow_xyz_axis_scale = 1.0f;
-static const float extrude_arrow_normal_axis_scale = 1.75f;
-
-static const uchar shape_plus[] = {
- 0x5f, 0xfb, 0x40, 0xee, 0x25, 0xda, 0x11, 0xbf, 0x4, 0xa0, 0x0, 0x80, 0x4, 0x5f, 0x11,
- 0x40, 0x25, 0x25, 0x40, 0x11, 0x5f, 0x4, 0x7f, 0x0, 0xa0, 0x4, 0xbf, 0x11, 0xda, 0x25,
- 0xee, 0x40, 0xfb, 0x5f, 0xff, 0x7f, 0xfb, 0xa0, 0xee, 0xbf, 0xda, 0xda, 0xbf, 0xee,
- 0xa0, 0xfb, 0x80, 0xff, 0x6e, 0xd7, 0x92, 0xd7, 0x92, 0x90, 0xd8, 0x90, 0xd8, 0x6d,
- 0x92, 0x6d, 0x92, 0x27, 0x6e, 0x27, 0x6e, 0x6d, 0x28, 0x6d, 0x28, 0x90, 0x6e,
- 0x90, 0x6e, 0xd7, 0x80, 0xff, 0x5f, 0xfb, 0x5f, 0xfb,
-};
-
-typedef struct GizmoExtrudeGroup {
-
- /* XYZ & normal. */
- struct wmGizmo *invoke_xyz_no[4];
- struct wmGizmo *adjust_xyz_no[5];
-
- struct {
- float normal_mat3[3][3]; /* use Z axis for normal. */
- int orientation_type;
- } data;
-
- wmOperatorType *ot_extrude;
-} GizmoExtrudeGroup;
-
-static void gizmo_mesh_extrude_orientation_matrix_set(
- struct GizmoExtrudeGroup *man, const float mat[3][3])
-{
- for (int i = 0; i < 3; i++) {
- /* Set orientation without location. */
- for (int j = 0; j < 3; j++) {
- copy_v3_v3(man->adjust_xyz_no[i]->matrix_basis[j], mat[j]);
- }
- /* nop when (i == 2). */
- swap_v3_v3(man->adjust_xyz_no[i]->matrix_basis[i], man->adjust_xyz_no[i]->matrix_basis[2]);
- /* Orient to normal gives generally less awkward results. */
- if (man->data.orientation_type != V3D_MANIP_NORMAL) {
- if (dot_v3v3(man->adjust_xyz_no[i]->matrix_basis[2], man->data.normal_mat3[2]) < 0.0f) {
- negate_v3(man->adjust_xyz_no[i]->matrix_basis[2]);
- }
- }
- mul_v3_v3fl(
- man->invoke_xyz_no[i]->matrix_offset[3],
- man->adjust_xyz_no[i]->matrix_basis[2],
- (extrude_arrow_xyz_axis_scale * extrude_button_offset_scale) / extrude_button_scale);
- }
-}
-
-static bool gizmo_mesh_extrude_poll(const bContext *C, wmGizmoGroupType *gzgt)
-{
- ScrArea *sa = CTX_wm_area(C);
- bToolRef_Runtime *tref_rt = sa->runtime.tool ? sa->runtime.tool->runtime : NULL;
- if ((tref_rt == NULL) ||
- !STREQ(gzgt->idname, tref_rt->gizmo_group) ||
- !ED_operator_editmesh_view3d((bContext *)C))
- {
- WM_gizmo_group_type_unlink_delayed_ptr(gzgt);
- return false;
- }
- return true;
-}
-
-static void gizmo_mesh_extrude_setup(const bContext *UNUSED(C), wmGizmoGroup *gzgroup)
-{
- struct GizmoExtrudeGroup *man = MEM_callocN(sizeof(GizmoExtrudeGroup), __func__);
- gzgroup->customdata = man;
-
- const wmGizmoType *gzt_arrow = WM_gizmotype_find("GIZMO_GT_arrow_3d", true);
- const wmGizmoType *gzt_grab = WM_gizmotype_find("GIZMO_GT_button_2d", true);
-
- for (int i = 0; i < 4; i++) {
- man->adjust_xyz_no[i] = WM_gizmo_new_ptr(gzt_arrow, gzgroup, NULL);
- man->invoke_xyz_no[i] = WM_gizmo_new_ptr(gzt_grab, gzgroup, NULL);
- man->invoke_xyz_no[i]->flag |= WM_GIZMO_DRAW_OFFSET_SCALE;
- }
-
- {
- PropertyRNA *prop = RNA_struct_find_property(man->invoke_xyz_no[3]->ptr, "shape");
- for (int i = 0; i < 4; i++) {
- RNA_property_string_set_bytes(
- man->invoke_xyz_no[i]->ptr, prop,
- (const char *)shape_plus, ARRAY_SIZE(shape_plus));
- }
- }
-
- man->ot_extrude = WM_operatortype_find("MESH_OT_extrude_context_move", true);
-
- for (int i = 0; i < 3; i++) {
- UI_GetThemeColor3fv(TH_AXIS_X + i, man->invoke_xyz_no[i]->color);
- UI_GetThemeColor3fv(TH_AXIS_X + i, man->adjust_xyz_no[i]->color);
- }
- UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, man->invoke_xyz_no[3]->color);
- UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, man->adjust_xyz_no[3]->color);
-
- for (int i = 0; i < 4; i++) {
- WM_gizmo_set_scale(man->invoke_xyz_no[i], extrude_button_scale);
- WM_gizmo_set_scale(man->adjust_xyz_no[i], extrude_arrow_scale);
- }
- WM_gizmo_set_scale(man->adjust_xyz_no[3], extrude_arrow_normal_axis_scale);
-
- for (int i = 0; i < 4; i++) {
- }
-
- for (int i = 0; i < 4; i++) {
- WM_gizmo_set_flag(man->adjust_xyz_no[i], WM_GIZMO_DRAW_VALUE, true);
- }
-
- /* XYZ & normal axis extrude. */
- for (int i = 0; i < 4; i++) {
- PointerRNA *ptr = WM_gizmo_operator_set(man->invoke_xyz_no[i], 0, man->ot_extrude, NULL);
- {
- bool constraint[3] = {0, 0, 0};
- constraint[MIN2(i, 2)] = 1;
- PointerRNA macroptr = RNA_pointer_get(ptr, "TRANSFORM_OT_translate");
- RNA_boolean_set(&macroptr, "release_confirm", true);
- RNA_boolean_set_array(&macroptr, "constraint_axis", constraint);
- }
- }
-
- /* Adjust extrude. */
- for (int i = 0; i < 4; i++) {
- PointerRNA *ptr = WM_gizmo_operator_set(man->adjust_xyz_no[i], 0, man->ot_extrude, NULL);
- {
- bool constraint[3] = {0, 0, 0};
- constraint[MIN2(i, 2)] = 1;
- PointerRNA macroptr = RNA_pointer_get(ptr, "TRANSFORM_OT_translate");
- RNA_boolean_set(&macroptr, "release_confirm", true);
- RNA_boolean_set_array(&macroptr, "constraint_axis", constraint);
- }
- wmGizmoOpElem *mpop = WM_gizmo_operator_get(man->adjust_xyz_no[i], 0);
- mpop->is_redo = true;
- }
-}
-
-static void gizmo_mesh_extrude_refresh(const bContext *C, wmGizmoGroup *gzgroup)
-{
- GizmoExtrudeGroup *man = gzgroup->customdata;
-
- for (int i = 0; i < 4; i++) {
- WM_gizmo_set_flag(man->invoke_xyz_no[i], WM_GIZMO_HIDDEN, true);
- WM_gizmo_set_flag(man->adjust_xyz_no[i], WM_GIZMO_HIDDEN, true);
- }
-
- if (G.moving) {
- return;
- }
-
- Scene *scene = CTX_data_scene(C);
- man->data.orientation_type = scene->orientation_type;
- bool use_normal = (man->data.orientation_type != V3D_MANIP_NORMAL);
- const int axis_len_used = use_normal ? 4 : 3;
-
- struct TransformBounds tbounds;
-
- if (use_normal) {
- struct TransformBounds tbounds_normal;
- if (!ED_transform_calc_gizmo_stats(
- C, &(struct TransformCalcParams){
- .orientation_type = V3D_MANIP_NORMAL + 1,
- }, &tbounds_normal))
- {
- unit_m3(tbounds_normal.axis);
- }
- copy_m3_m3(man->data.normal_mat3, tbounds_normal.axis);
- }
-
- /* TODO(campbell): run second since this modifies the 3D view, it should not. */
- if (!ED_transform_calc_gizmo_stats(
- C, &(struct TransformCalcParams){
- .orientation_type = man->data.orientation_type + 1,
- }, &tbounds))
- {
- return;
- }
-
- /* Main axis is normal. */
- if (!use_normal) {
- copy_m3_m3(man->data.normal_mat3, tbounds.axis);
- }
-
- /* Offset the add icon. */
- mul_v3_v3fl(
- man->invoke_xyz_no[3]->matrix_offset[3],
- man->data.normal_mat3[2],
- (extrude_arrow_normal_axis_scale * extrude_button_offset_scale) / extrude_button_scale);
-
- /* Needed for normal orientation. */
- gizmo_mesh_extrude_orientation_matrix_set(man, tbounds.axis);
- if (use_normal) {
- copy_m4_m3(man->adjust_xyz_no[3]->matrix_basis, man->data.normal_mat3);
- }
-
- /* Location. */
- for (int i = 0; i < axis_len_used; i++) {
- WM_gizmo_set_matrix_location(man->invoke_xyz_no[i], tbounds.center);
- WM_gizmo_set_matrix_location(man->adjust_xyz_no[i], tbounds.center);
- }
-
- wmOperator *op = WM_operator_last_redo(C);
- bool has_redo = (op && op->type == man->ot_extrude);
-
- /* Un-hide. */
- for (int i = 0; i < axis_len_used; i++) {
- WM_gizmo_set_flag(man->invoke_xyz_no[i], WM_GIZMO_HIDDEN, false);
- WM_gizmo_set_flag(man->adjust_xyz_no[i], WM_GIZMO_HIDDEN, !has_redo);
- }
-
- /* Operator properties. */
- if (use_normal) {
- wmGizmoOpElem *mpop = WM_gizmo_operator_get(man->invoke_xyz_no[3], 0);
- PointerRNA macroptr = RNA_pointer_get(&mpop->ptr, "TRANSFORM_OT_translate");
- RNA_enum_set(&macroptr, "constraint_orientation", V3D_MANIP_NORMAL);
- }
-
- /* Redo with current settings. */
- if (has_redo) {
- wmOperator *op_transform = op->macro.last;
- float value[4];
- RNA_float_get_array(op_transform->ptr, "value", value);
- bool constraint_axis[3];
- RNA_boolean_get_array(op_transform->ptr, "constraint_axis", constraint_axis);
- int orientation_type = RNA_enum_get(op_transform->ptr, "constraint_orientation");
-
- /* We could also access this from 'ot->last_properties' */
- for (int i = 0; i < 4; i++) {
- if ((i != 3) ?
- (orientation_type == man->data.orientation_type && constraint_axis[i]) :
- (orientation_type == V3D_MANIP_NORMAL && constraint_axis[2]))
- {
- wmGizmoOpElem *mpop = WM_gizmo_operator_get(man->adjust_xyz_no[i], 0);
-
- PointerRNA macroptr = RNA_pointer_get(&mpop->ptr, "TRANSFORM_OT_translate");
-
- RNA_float_set_array(&macroptr, "value", value);
- RNA_boolean_set_array(&macroptr, "constraint_axis", constraint_axis);
- RNA_enum_set(&macroptr, "constraint_orientation", orientation_type);
- }
- else {
- /* TODO(campbell): ideally we could adjust all,
- * this is complicated by how operator redo and the transform macro works. */
- WM_gizmo_set_flag(man->adjust_xyz_no[i], WM_GIZMO_HIDDEN, true);
- }
- }
- }
-
- for (int i = 0; i < 4; i++) {
- RNA_enum_set(
- man->invoke_xyz_no[i]->ptr,
- "draw_options",
- (man->adjust_xyz_no[i]->flag & WM_GIZMO_HIDDEN) ?
- ED_GIZMO_BUTTON_SHOW_HELPLINE : 0);
- }
-}
-
-static void gizmo_mesh_extrude_draw_prepare(const bContext *C, wmGizmoGroup *gzgroup)
-{
- GizmoExtrudeGroup *man = gzgroup->customdata;
- switch (man->data.orientation_type) {
- case V3D_MANIP_VIEW:
- {
- RegionView3D *rv3d = CTX_wm_region_view3d(C);
- float mat[3][3];
- copy_m3_m4(mat, rv3d->viewinv);
- normalize_m3(mat);
- gizmo_mesh_extrude_orientation_matrix_set(man, mat);
- break;
- }
- }
-}
-
-static void gizmo_mesh_extrude_message_subscribe(
- const bContext *C, wmGizmoGroup *gzgroup, struct wmMsgBus *mbus)
-{
- ARegion *ar = CTX_wm_region(C);
-
- /* Subscribe to view properties */
- wmMsgSubscribeValue msg_sub_value_gz_tag_refresh = {
- .owner = ar,
- .user_data = gzgroup->parent_gzmap,
- .notify = WM_gizmo_do_msg_notify_tag_refresh,
- };
-
- {
- WM_msg_subscribe_rna_anon_prop(mbus, Scene, transform_orientation, &msg_sub_value_gz_tag_refresh);
- }
-
-}
-
-static void MESH_GGT_extrude(struct wmGizmoGroupType *gzgt)
-{
- gzgt->name = "Mesh Extrude";
- gzgt->idname = "MESH_GGT_extrude";
-
- gzgt->flag = WM_GIZMOGROUPTYPE_3D;
-
- gzgt->gzmap_params.spaceid = SPACE_VIEW3D;
- gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
-
- gzgt->poll = gizmo_mesh_extrude_poll;
- gzgt->setup = gizmo_mesh_extrude_setup;
- gzgt->refresh = gizmo_mesh_extrude_refresh;
- gzgt->draw_prepare = gizmo_mesh_extrude_draw_prepare;
- gzgt->message_subscribe = gizmo_mesh_extrude_message_subscribe;
-}
-
-#endif /* USE_GIZMO */
-
-/** \} */
-
/* -------------------------------------------------------------------- */
/** \name Extrude Operator
* \{ */
@@ -685,9 +360,10 @@ static void MESH_GGT_extrude(struct wmGizmoGroupType *gzgt)
/* generic extern called extruder */
static bool edbm_extrude_mesh(Object *obedit, BMEditMesh *em, wmOperator *op)
{
- bool changed = false;
+ const bool use_normal_flip = RNA_boolean_get(op->ptr, "use_normal_flip");
const char htype = edbm_extrude_htype_from_em_select(em);
enum {NONE = 0, ELEM_FLAG, VERT_ONLY, EDGE_ONLY} nr;
+ bool changed = false;
if (em->selectmode & SCE_SELECT_VERTEX) {
if (em->bm->totvertsel == 0) nr = NONE;
@@ -709,13 +385,13 @@ static bool edbm_extrude_mesh(Object *obedit, BMEditMesh *em, wmOperator *op)
case NONE:
return false;
case ELEM_FLAG:
- changed = edbm_extrude_ex(obedit, em, htype, BM_ELEM_SELECT, true, true);
+ changed = edbm_extrude_ex(obedit, em, htype, BM_ELEM_SELECT, use_normal_flip, true, true);
break;
case VERT_ONLY:
changed = edbm_extrude_verts_indiv(em, op, BM_ELEM_SELECT);
break;
case EDGE_ONLY:
- changed = edbm_extrude_edges_indiv(em, op, BM_ELEM_SELECT);
+ changed = edbm_extrude_edges_indiv(em, op, BM_ELEM_SELECT, use_normal_flip);
break;
}
@@ -771,6 +447,7 @@ void MESH_OT_extrude_region(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ RNA_def_boolean(ot->srna, "use_normal_flip", false, "Flip Normals", "");
Transform_Properties(ot, P_NO_DEFAULTS | P_MIRROR_DUMMY);
}
@@ -823,6 +500,7 @@ void MESH_OT_extrude_context(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ RNA_def_boolean(ot->srna, "use_normal_flip", false, "Flip Normals", "");
Transform_Properties(ot, P_NO_DEFAULTS | P_MIRROR_DUMMY);
#ifdef USE_GIZMO
@@ -884,6 +562,7 @@ void MESH_OT_extrude_verts_indiv(wmOperatorType *ot)
static int edbm_extrude_edges_exec(bContext *C, wmOperator *op)
{
+ const bool use_normal_flip = RNA_boolean_get(op->ptr, "use_normal_flip");
ViewLayer *view_layer = CTX_data_view_layer(C);
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
@@ -895,7 +574,7 @@ static int edbm_extrude_edges_exec(bContext *C, wmOperator *op)
continue;
}
- edbm_extrude_edges_indiv(em, op, BM_ELEM_SELECT);
+ edbm_extrude_edges_indiv(em, op, BM_ELEM_SELECT, use_normal_flip);
EDBM_update_generic(em, true, true);
}
@@ -919,6 +598,7 @@ void MESH_OT_extrude_edges_indiv(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* to give to transform */
+ RNA_def_boolean(ot->srna, "use_normal_flip", false, "Flip Normals", "");
Transform_Properties(ot, P_NO_DEFAULTS | P_MIRROR_DUMMY);
}
@@ -1141,7 +821,7 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, const w
}
}
- edbm_extrude_ex(vc.obedit, vc.em, extrude_htype, BM_ELEM_SELECT, true, true);
+ edbm_extrude_ex(vc.obedit, vc.em, extrude_htype, BM_ELEM_SELECT, false, true, true);
EDBM_op_callf(vc.em, op, "rotate verts=%hv cent=%v matrix=%m3",
BM_ELEM_SELECT, local_center, mat);
EDBM_op_callf(vc.em, op, "translate verts=%hv vec=%v",
diff --git a/source/blender/editors/mesh/editmesh_extrude_gizmo.c b/source/blender/editors/mesh/editmesh_extrude_gizmo.c
new file mode 100644
index 00000000000..5de8e896ddf
--- /dev/null
+++ b/source/blender/editors/mesh/editmesh_extrude_gizmo.c
@@ -0,0 +1,407 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2004 by Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Joseph Eagar
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/mesh/editmesh_extrude_gizmo.c
+ * \ingroup edmesh
+ */
+
+#include "BLI_math.h"
+#include "BLI_listbase.h"
+
+#include "BKE_context.h"
+#include "BKE_global.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+#include "WM_message.h"
+#include "WM_toolsystem.h"
+
+#include "ED_screen.h"
+#include "ED_transform.h"
+#include "ED_view3d.h"
+#include "ED_gizmo_library.h"
+#include "ED_gizmo_utils.h"
+
+#include "UI_resources.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "mesh_intern.h" /* own include */
+
+/* -------------------------------------------------------------------- */
+/** \name Extrude Gizmo
+ * \{ */
+
+enum {
+ EXTRUDE_AXIS_NORMAL = 0,
+ EXTRUDE_AXIS_XYZ = 1,
+};
+
+static const float extrude_button_scale = 0.15f;
+static const float extrude_button_offset_scale = 1.5f;
+static const float extrude_arrow_scale = 1.0f;
+static const float extrude_arrow_xyz_axis_scale = 1.0f;
+static const float extrude_arrow_normal_axis_scale = 1.0f;
+
+static const uchar shape_plus[] = {
+ 0x5f, 0xfb, 0x40, 0xee, 0x25, 0xda, 0x11, 0xbf, 0x4, 0xa0, 0x0, 0x80, 0x4, 0x5f, 0x11,
+ 0x40, 0x25, 0x25, 0x40, 0x11, 0x5f, 0x4, 0x7f, 0x0, 0xa0, 0x4, 0xbf, 0x11, 0xda, 0x25,
+ 0xee, 0x40, 0xfb, 0x5f, 0xff, 0x7f, 0xfb, 0xa0, 0xee, 0xbf, 0xda, 0xda, 0xbf, 0xee,
+ 0xa0, 0xfb, 0x80, 0xff, 0x6e, 0xd7, 0x92, 0xd7, 0x92, 0x90, 0xd8, 0x90, 0xd8, 0x6d,
+ 0x92, 0x6d, 0x92, 0x27, 0x6e, 0x27, 0x6e, 0x6d, 0x28, 0x6d, 0x28, 0x90, 0x6e,
+ 0x90, 0x6e, 0xd7, 0x80, 0xff, 0x5f, 0xfb, 0x5f, 0xfb,
+};
+
+typedef struct GizmoExtrudeGroup {
+
+ /* XYZ & normal. */
+ struct wmGizmo *invoke_xyz_no[4];
+ struct wmGizmo *adjust;
+ int adjust_axis;
+
+ struct {
+ float normal_mat3[3][3]; /* use Z axis for normal. */
+ int orientation_type;
+ } data;
+
+ wmOperatorType *ot_extrude;
+ PropertyRNA *gzgt_axis_type_prop;
+} GizmoExtrudeGroup;
+
+static void gizmo_mesh_extrude_orientation_matrix_set(
+ struct GizmoExtrudeGroup *ggd, const float mat[3][3])
+{
+ for (int i = 0; i < 3; i++) {
+ mul_v3_v3fl(
+ ggd->invoke_xyz_no[i]->matrix_offset[3],
+ mat[i],
+ (extrude_arrow_xyz_axis_scale * extrude_button_offset_scale) / extrude_button_scale);
+ }
+}
+
+static void gizmo_mesh_extrude_orientation_matrix_set_for_adjust(
+ struct GizmoExtrudeGroup *ggd, const float mat[3][3])
+{
+ /* Set orientation without location. */
+ for (int j = 0; j < 3; j++) {
+ copy_v3_v3(ggd->adjust->matrix_basis[j], mat[j]);
+ }
+ /* nop when (i == 2). */
+ swap_v3_v3(ggd->adjust->matrix_basis[ggd->adjust_axis], ggd->adjust->matrix_basis[2]);
+}
+
+static void gizmo_mesh_extrude_setup(const bContext *UNUSED(C), wmGizmoGroup *gzgroup)
+{
+ struct GizmoExtrudeGroup *ggd = MEM_callocN(sizeof(GizmoExtrudeGroup), __func__);
+ gzgroup->customdata = ggd;
+
+ const wmGizmoType *gzt_arrow = WM_gizmotype_find("GIZMO_GT_arrow_3d", true);
+ const wmGizmoType *gzt_move = WM_gizmotype_find("GIZMO_GT_button_2d", true);
+
+ ggd->adjust = WM_gizmo_new_ptr(gzt_arrow, gzgroup, NULL);
+ for (int i = 0; i < 4; i++) {
+ ggd->invoke_xyz_no[i] = WM_gizmo_new_ptr(gzt_move, gzgroup, NULL);
+ ggd->invoke_xyz_no[i]->flag |= WM_GIZMO_DRAW_OFFSET_SCALE;
+ }
+
+ {
+ PropertyRNA *prop = RNA_struct_find_property(ggd->invoke_xyz_no[3]->ptr, "shape");
+ for (int i = 0; i < 4; i++) {
+ RNA_property_string_set_bytes(
+ ggd->invoke_xyz_no[i]->ptr, prop,
+ (const char *)shape_plus, ARRAY_SIZE(shape_plus));
+ }
+ }
+
+ {
+ ggd->ot_extrude = WM_operatortype_find("MESH_OT_extrude_context_move", true);
+ ggd->gzgt_axis_type_prop = RNA_struct_type_find_property(gzgroup->type->srna, "axis_type");
+ }
+
+ for (int i = 0; i < 3; i++) {
+ UI_GetThemeColor3fv(TH_AXIS_X + i, ggd->invoke_xyz_no[i]->color);
+ }
+ UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, ggd->invoke_xyz_no[3]->color);
+ UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, ggd->adjust->color);
+
+ for (int i = 0; i < 4; i++) {
+ WM_gizmo_set_scale(ggd->invoke_xyz_no[i], extrude_button_scale);
+ }
+ WM_gizmo_set_scale(ggd->adjust, extrude_arrow_scale);
+
+ WM_gizmo_set_flag(ggd->adjust, WM_GIZMO_DRAW_VALUE, true);
+
+ /* XYZ & normal axis extrude. */
+ for (int i = 0; i < 4; i++) {
+ PointerRNA *ptr = WM_gizmo_operator_set(ggd->invoke_xyz_no[i], 0, ggd->ot_extrude, NULL);
+ {
+ bool constraint[3] = {0, 0, 0};
+ constraint[MIN2(i, 2)] = 1;
+ PointerRNA macroptr = RNA_pointer_get(ptr, "TRANSFORM_OT_translate");
+ RNA_boolean_set(&macroptr, "release_confirm", true);
+ RNA_boolean_set_array(&macroptr, "constraint_axis", constraint);
+ }
+ }
+
+ /* Adjust extrude. */
+ {
+ PointerRNA *ptr = WM_gizmo_operator_set(ggd->adjust, 0, ggd->ot_extrude, NULL);
+ PointerRNA macroptr = RNA_pointer_get(ptr, "TRANSFORM_OT_translate");
+ RNA_boolean_set(&macroptr, "release_confirm", true);
+ wmGizmoOpElem *gzop = WM_gizmo_operator_get(ggd->adjust, 0);
+ gzop->is_redo = true;
+ }
+}
+
+static void gizmo_mesh_extrude_refresh(const bContext *C, wmGizmoGroup *gzgroup)
+{
+ GizmoExtrudeGroup *ggd = gzgroup->customdata;
+
+ for (int i = 0; i < 4; i++) {
+ WM_gizmo_set_flag(ggd->invoke_xyz_no[i], WM_GIZMO_HIDDEN, true);
+ }
+ WM_gizmo_set_flag(ggd->adjust, WM_GIZMO_HIDDEN, true);
+
+ if (G.moving) {
+ return;
+ }
+
+ Scene *scene = CTX_data_scene(C);
+
+ int axis_type;
+ {
+ PointerRNA ptr;
+ bToolRef *tref = WM_toolsystem_ref_from_context((bContext *)C);
+ WM_toolsystem_ref_properties_ensure_from_gizmo_group(tref, gzgroup->type, &ptr);
+ axis_type = RNA_property_enum_get(&ptr, ggd->gzgt_axis_type_prop);
+ }
+
+ ggd->data.orientation_type = scene->orientation_type;
+ const bool use_normal = (
+ (ggd->data.orientation_type != V3D_MANIP_NORMAL) ||
+ (axis_type == EXTRUDE_AXIS_NORMAL));
+ const int axis_len_used = use_normal ? 4 : 3;
+
+ struct TransformBounds tbounds;
+
+ if (use_normal) {
+ struct TransformBounds tbounds_normal;
+ if (!ED_transform_calc_gizmo_stats(
+ C, &(struct TransformCalcParams){
+ .orientation_type = V3D_MANIP_NORMAL + 1,
+ }, &tbounds_normal))
+ {
+ unit_m3(tbounds_normal.axis);
+ }
+ copy_m3_m3(ggd->data.normal_mat3, tbounds_normal.axis);
+ }
+
+ /* TODO(campbell): run second since this modifies the 3D view, it should not. */
+ if (!ED_transform_calc_gizmo_stats(
+ C, &(struct TransformCalcParams){
+ .orientation_type = ggd->data.orientation_type + 1,
+ }, &tbounds))
+ {
+ return;
+ }
+
+ /* Main axis is normal. */
+ if (!use_normal) {
+ copy_m3_m3(ggd->data.normal_mat3, tbounds.axis);
+ }
+
+ /* Offset the add icon. */
+ mul_v3_v3fl(
+ ggd->invoke_xyz_no[3]->matrix_offset[3],
+ ggd->data.normal_mat3[2],
+ (extrude_arrow_normal_axis_scale * extrude_button_offset_scale) / extrude_button_scale);
+
+ /* Adjust current operator. */
+ /* Don't use 'WM_operator_last_redo' because selection actions will be ignored. */
+ wmOperator *op = CTX_wm_manager(C)->operators.last;
+ bool has_redo = (op && op->type == ggd->ot_extrude);
+ wmOperator *op_transform = has_redo ? op->macro.last : NULL;
+
+ struct {
+ float constraint_matrix[3][3];
+ bool constraint_axis[3];
+ float value[4];
+ bool is_flip;
+ } redo;
+
+ if (has_redo) {
+ /* We can't access this from 'ot->last_properties'
+ * because some properties use skip-save. */
+ RNA_float_get_array(op_transform->ptr, "constraint_matrix", &redo.constraint_matrix[0][0]);
+ RNA_boolean_get_array(op_transform->ptr, "constraint_axis", redo.constraint_axis);
+ RNA_float_get_array(op_transform->ptr, "value", redo.value);
+ for (int i = 0; i < 3; i++) {
+ if (redo.constraint_axis[i]) {
+ redo.is_flip = redo.value[i] < 0.0f;
+ ggd->adjust_axis = i;
+ break;
+ }
+ }
+ }
+
+ /* Needed for normal orientation. */
+ gizmo_mesh_extrude_orientation_matrix_set(ggd, tbounds.axis);
+ if (has_redo) {
+ gizmo_mesh_extrude_orientation_matrix_set_for_adjust(ggd, redo.constraint_matrix);
+ if (redo.is_flip) {
+ negate_v3(ggd->adjust->matrix_basis[2]);
+ }
+ }
+
+ /* Location. */
+ for (int i = 0; i < axis_len_used; i++) {
+ WM_gizmo_set_matrix_location(ggd->invoke_xyz_no[i], tbounds.center);
+ }
+ WM_gizmo_set_matrix_location(ggd->adjust, tbounds.center);
+
+ /* Un-hide. */
+ for (int i = 0; i < axis_len_used; i++) {
+ WM_gizmo_set_flag(ggd->invoke_xyz_no[i], WM_GIZMO_HIDDEN, false);
+ }
+ WM_gizmo_set_flag(ggd->adjust, WM_GIZMO_HIDDEN, !has_redo);
+
+ /* Operator properties. */
+ if (use_normal) {
+ wmGizmoOpElem *gzop = WM_gizmo_operator_get(ggd->invoke_xyz_no[3], 0);
+ PointerRNA macroptr = RNA_pointer_get(&gzop->ptr, "TRANSFORM_OT_translate");
+ RNA_float_set_array(&macroptr, "constraint_matrix", &ggd->data.normal_mat3[0][0]);
+ }
+
+ /* Redo with current settings. */
+ if (has_redo) {
+ for (int i = 0; i < 4; i++) {
+ RNA_enum_set(
+ ggd->invoke_xyz_no[i]->ptr,
+ "draw_options",
+ (dot_v3v3(ggd->adjust->matrix_basis[2],
+ ggd->invoke_xyz_no[i]->matrix_offset[3]) > 0.98f) ? 0 : ED_GIZMO_BUTTON_SHOW_HELPLINE);
+ }
+ }
+ else {
+ for (int i = 0; i < 4; i++) {
+ RNA_enum_set(ggd->invoke_xyz_no[i]->ptr, "draw_options", ED_GIZMO_BUTTON_SHOW_HELPLINE);
+ }
+ }
+
+ /* TODO: skip calculating axis which wont be used (above). */
+ switch (axis_type) {
+ case EXTRUDE_AXIS_NORMAL:
+ for (int i = 0; i < 3; i++) {
+ WM_gizmo_set_flag(ggd->invoke_xyz_no[i], WM_GIZMO_HIDDEN, true);
+ }
+ break;
+ case EXTRUDE_AXIS_XYZ:
+ WM_gizmo_set_flag(ggd->invoke_xyz_no[3], WM_GIZMO_HIDDEN, true);
+ break;
+ }
+}
+
+static void gizmo_mesh_extrude_draw_prepare(const bContext *C, wmGizmoGroup *gzgroup)
+{
+ GizmoExtrudeGroup *ggd = gzgroup->customdata;
+ switch (ggd->data.orientation_type) {
+ case V3D_MANIP_VIEW:
+ {
+ RegionView3D *rv3d = CTX_wm_region_view3d(C);
+ float mat[3][3];
+ copy_m3_m4(mat, rv3d->viewinv);
+ normalize_m3(mat);
+ gizmo_mesh_extrude_orientation_matrix_set(ggd, mat);
+ break;
+ }
+ }
+
+ /* Basic ordering for drawing only. */
+ {
+ RegionView3D *rv3d = CTX_wm_region_view3d(C);
+ LISTBASE_FOREACH (wmGizmo *, gz, &gzgroup->gizmos) {
+ gz->temp.f = dot_v3v3(rv3d->viewinv[2], gz->matrix_offset[3]);
+ }
+ BLI_listbase_sort(&gzgroup->gizmos, WM_gizmo_cmp_temp_fl_reverse);
+ }
+}
+
+static void gizmo_mesh_extrude_message_subscribe(
+ const bContext *C, wmGizmoGroup *gzgroup, struct wmMsgBus *mbus)
+{
+ GizmoExtrudeGroup *ggd = gzgroup->customdata;
+ ARegion *ar = CTX_wm_region(C);
+
+ /* Subscribe to view properties */
+ wmMsgSubscribeValue msg_sub_value_gz_tag_refresh = {
+ .owner = ar,
+ .user_data = gzgroup->parent_gzmap,
+ .notify = WM_gizmo_do_msg_notify_tag_refresh,
+ };
+
+ {
+ WM_msg_subscribe_rna_anon_prop(mbus, Scene, transform_orientation, &msg_sub_value_gz_tag_refresh);
+ }
+
+
+ WM_msg_subscribe_rna_params(
+ mbus,
+ &(const wmMsgParams_RNA){
+ .ptr = (PointerRNA){.type = gzgroup->type->srna},
+ .prop = ggd->gzgt_axis_type_prop,
+ },
+ &msg_sub_value_gz_tag_refresh, __func__);
+}
+
+void MESH_GGT_extrude(struct wmGizmoGroupType *gzgt)
+{
+ gzgt->name = "Mesh Extrude";
+ gzgt->idname = "MESH_GGT_extrude";
+
+ gzgt->flag = WM_GIZMOGROUPTYPE_3D;
+
+ gzgt->gzmap_params.spaceid = SPACE_VIEW3D;
+ gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
+
+ gzgt->poll = ED_gizmo_poll_or_unlink_delayed_from_tool;
+ gzgt->setup = gizmo_mesh_extrude_setup;
+ gzgt->refresh = gizmo_mesh_extrude_refresh;
+ gzgt->draw_prepare = gizmo_mesh_extrude_draw_prepare;
+ gzgt->message_subscribe = gizmo_mesh_extrude_message_subscribe;
+
+ static const EnumPropertyItem axis_type_items[] = {
+ {EXTRUDE_AXIS_NORMAL, "NORMAL", 0, "Normal", "Only show normal axis"},
+ {EXTRUDE_AXIS_XYZ, "XYZ", 0, "XYZ", "Follow scene orientation"},
+ {0, NULL, 0, NULL, NULL}
+ };
+ RNA_def_enum(gzgt->srna, "axis_type", axis_type_items, 0, "Axis Type", "");
+}
+
+/** \} */
diff --git a/source/blender/editors/mesh/editmesh_extrude_spin.c b/source/blender/editors/mesh/editmesh_extrude_spin.c
index adb7ee71ee0..848fe63cf8e 100644
--- a/source/blender/editors/mesh/editmesh_extrude_spin.c
+++ b/source/blender/editors/mesh/editmesh_extrude_spin.c
@@ -40,6 +40,7 @@
#include "RNA_define.h"
#include "RNA_access.h"
+#include "RNA_enum_types.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -56,381 +57,6 @@
#define USE_GIZMO
-#ifdef USE_GIZMO
-#include "ED_gizmo_library.h"
-#include "ED_undo.h"
-#endif
-
-/* -------------------------------------------------------------------- */
-/** \name Spin Gizmo
- * \{ */
-
-#ifdef USE_GIZMO
-typedef struct GizmoSpinGroup {
- /* Arrow to change plane depth. */
- struct wmGizmo *translate_z;
- /* Translate XYZ */
- struct wmGizmo *translate_c;
- /* For grabbing the gizmo and moving freely. */
- struct wmGizmo *rotate_c;
- /* Spin angle */
- struct wmGizmo *angle_z;
-
- /* We could store more vars here! */
- struct {
- bContext *context;
- wmOperator *op;
- PropertyRNA *prop_axis_co;
- PropertyRNA *prop_axis_no;
- PropertyRNA *prop_angle;
-
- float rotate_axis[3];
- float rotate_up[3];
- } data;
-} GizmoSpinGroup;
-
-/**
- * XXX. calling redo from property updates is not great.
- * This is needed because changing the RNA doesn't cause a redo
- * and we're not using operator UI which does just this.
- */
-static void gizmo_spin_exec(GizmoSpinGroup *man)
-{
- wmOperator *op = man->data.op;
- if (op == WM_operator_last_redo((bContext *)man->data.context)) {
- ED_undo_operator_repeat((bContext *)man->data.context, op);
- }
-}
-
-static void gizmo_mesh_spin_update_from_op(GizmoSpinGroup *man)
-{
- wmOperator *op = man->data.op;
-
- float plane_co[3], plane_no[3];
-
- RNA_property_float_get_array(op->ptr, man->data.prop_axis_co, plane_co);
- RNA_property_float_get_array(op->ptr, man->data.prop_axis_no, plane_no);
-
- WM_gizmo_set_matrix_location(man->translate_z, plane_co);
- WM_gizmo_set_matrix_location(man->rotate_c, plane_co);
- WM_gizmo_set_matrix_location(man->angle_z, plane_co);
- /* translate_c location comes from the property. */
-
- WM_gizmo_set_matrix_rotation_from_z_axis(man->translate_z, plane_no);
- WM_gizmo_set_matrix_rotation_from_z_axis(man->angle_z, plane_no);
-
- WM_gizmo_set_scale(man->translate_c, 0.2);
-
- RegionView3D *rv3d = ED_view3d_context_rv3d(man->data.context);
- if (rv3d) {
- normalize_v3_v3(man->data.rotate_axis, rv3d->viewinv[2]);
- normalize_v3_v3(man->data.rotate_up, rv3d->viewinv[1]);
-
- /* ensure its orthogonal */
- project_plane_normalized_v3_v3v3(man->data.rotate_up, man->data.rotate_up, man->data.rotate_axis);
- normalize_v3(man->data.rotate_up);
-
- WM_gizmo_set_matrix_rotation_from_z_axis(man->translate_c, plane_no);
- WM_gizmo_set_matrix_rotation_from_yz_axis(man->rotate_c, plane_no, man->data.rotate_axis);
-
- /* show the axis instead of mouse cursor */
- RNA_enum_set(man->rotate_c->ptr, "draw_options",
- ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_MIRROR |
- ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_START_Y);
-
- }
-}
-
-/* depth callbacks */
-static void gizmo_spin_prop_depth_get(
- const wmGizmo *gz, wmGizmoProperty *gz_prop,
- void *value_p)
-{
- GizmoSpinGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
- float *value = value_p;
-
- BLI_assert(gz_prop->type->array_length == 1);
- UNUSED_VARS_NDEBUG(gz_prop);
-
- float plane_co[3], plane_no[3];
- RNA_property_float_get_array(op->ptr, man->data.prop_axis_co, plane_co);
- RNA_property_float_get_array(op->ptr, man->data.prop_axis_no, plane_no);
-
- value[0] = dot_v3v3(plane_no, plane_co) - dot_v3v3(plane_no, gz->matrix_basis[3]);
-}
-
-static void gizmo_spin_prop_depth_set(
- const wmGizmo *gz, wmGizmoProperty *gz_prop,
- const void *value_p)
-{
- GizmoSpinGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
- const float *value = value_p;
-
- BLI_assert(gz_prop->type->array_length == 1);
- UNUSED_VARS_NDEBUG(gz_prop);
-
- float plane_co[3], plane[4];
- RNA_property_float_get_array(op->ptr, man->data.prop_axis_co, plane_co);
- RNA_property_float_get_array(op->ptr, man->data.prop_axis_no, plane);
- normalize_v3(plane);
-
- plane[3] = -value[0] - dot_v3v3(plane, gz->matrix_basis[3]);
-
- /* Keep our location, may be offset simply to be inside the viewport. */
- closest_to_plane_normalized_v3(plane_co, plane, plane_co);
-
- RNA_property_float_set_array(op->ptr, man->data.prop_axis_co, plane_co);
-
- gizmo_spin_exec(man);
-}
-
-/* translate callbacks */
-static void gizmo_spin_prop_translate_get(
- const wmGizmo *gz, wmGizmoProperty *gz_prop,
- void *value_p)
-{
- GizmoSpinGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
- float *value = value_p;
-
- BLI_assert(gz_prop->type->array_length == 3);
- UNUSED_VARS_NDEBUG(gz_prop);
-
- RNA_property_float_get_array(op->ptr, man->data.prop_axis_co, value);
-}
-
-static void gizmo_spin_prop_translate_set(
- const wmGizmo *gz, wmGizmoProperty *gz_prop,
- const void *value)
-{
- GizmoSpinGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
-
- BLI_assert(gz_prop->type->array_length == 3);
- UNUSED_VARS_NDEBUG(gz_prop);
-
- RNA_property_float_set_array(op->ptr, man->data.prop_axis_co, value);
-
- gizmo_spin_exec(man);
-}
-
-/* angle callbacks */
-static void gizmo_spin_prop_axis_angle_get(
- const wmGizmo *gz, wmGizmoProperty *gz_prop,
- void *value_p)
-{
- GizmoSpinGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
- float *value = value_p;
-
- BLI_assert(gz_prop->type->array_length == 1);
- UNUSED_VARS_NDEBUG(gz_prop);
-
- float plane_no[4];
- RNA_property_float_get_array(op->ptr, man->data.prop_axis_no, plane_no);
- normalize_v3(plane_no);
-
- float plane_no_proj[3];
- project_plane_normalized_v3_v3v3(plane_no_proj, plane_no, man->data.rotate_axis);
-
- if (!is_zero_v3(plane_no_proj)) {
- const float angle = -angle_signed_on_axis_v3v3_v3(plane_no_proj, man->data.rotate_up, man->data.rotate_axis);
- value[0] = angle;
- }
- else {
- value[0] = 0.0f;
- }
-}
-
-static void gizmo_spin_prop_axis_angle_set(
- const wmGizmo *gz, wmGizmoProperty *gz_prop,
- const void *value_p)
-{
- GizmoSpinGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
- const float *value = value_p;
-
- BLI_assert(gz_prop->type->array_length == 1);
- UNUSED_VARS_NDEBUG(gz_prop);
-
- float plane_no[4];
- RNA_property_float_get_array(op->ptr, man->data.prop_axis_no, plane_no);
- normalize_v3(plane_no);
-
- float plane_no_proj[3];
- project_plane_normalized_v3_v3v3(plane_no_proj, plane_no, man->data.rotate_axis);
-
- if (!is_zero_v3(plane_no_proj)) {
- const float angle = -angle_signed_on_axis_v3v3_v3(plane_no_proj, man->data.rotate_up, man->data.rotate_axis);
- const float angle_delta = angle - angle_compat_rad(value[0], angle);
- if (angle_delta != 0.0f) {
- float mat[3][3];
- axis_angle_normalized_to_mat3(mat, man->data.rotate_axis, angle_delta);
- mul_m3_v3(mat, plane_no);
-
- /* re-normalize - seems acceptable */
- RNA_property_float_set_array(op->ptr, man->data.prop_axis_no, plane_no);
-
- gizmo_spin_exec(man);
- }
- }
-}
-
-/* angle callbacks */
-static void gizmo_spin_prop_angle_get(
- const wmGizmo *gz, wmGizmoProperty *gz_prop,
- void *value_p)
-{
- GizmoSpinGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
- float *value = value_p;
-
- BLI_assert(gz_prop->type->array_length == 1);
- UNUSED_VARS_NDEBUG(gz_prop);
- value[0] = RNA_property_float_get(op->ptr, man->data.prop_angle);
-}
-
-static void gizmo_spin_prop_angle_set(
- const wmGizmo *gz, wmGizmoProperty *gz_prop,
- const void *value_p)
-{
- GizmoSpinGroup *man = gz->parent_gzgroup->customdata;
- wmOperator *op = man->data.op;
- BLI_assert(gz_prop->type->array_length == 1);
- UNUSED_VARS_NDEBUG(gz_prop);
- const float *value = value_p;
- RNA_property_float_set(op->ptr, man->data.prop_angle, value[0]);
-
- gizmo_spin_exec(man);
-}
-
-static bool gizmo_mesh_spin_poll(const bContext *C, wmGizmoGroupType *gzgt)
-{
- wmOperator *op = WM_operator_last_redo(C);
- if (op == NULL || !STREQ(op->type->idname, "MESH_OT_spin")) {
- WM_gizmo_group_type_unlink_delayed_ptr(gzgt);
- return false;
- }
- return true;
-}
-
-static void gizmo_mesh_spin_setup(const bContext *C, wmGizmoGroup *gzgroup)
-{
- wmOperator *op = WM_operator_last_redo(C);
-
- if (op == NULL || !STREQ(op->type->idname, "MESH_OT_spin")) {
- return;
- }
-
- struct GizmoSpinGroup *man = MEM_callocN(sizeof(GizmoSpinGroup), __func__);
- gzgroup->customdata = man;
-
- const wmGizmoType *gzt_arrow = WM_gizmotype_find("GIZMO_GT_arrow_3d", true);
- const wmGizmoType *gzt_grab = WM_gizmotype_find("GIZMO_GT_grab_3d", true);
- const wmGizmoType *gzt_dial = WM_gizmotype_find("GIZMO_GT_dial_3d", true);
-
- man->translate_z = WM_gizmo_new_ptr(gzt_arrow, gzgroup, NULL);
- man->translate_c = WM_gizmo_new_ptr(gzt_grab, gzgroup, NULL);
- man->rotate_c = WM_gizmo_new_ptr(gzt_dial, gzgroup, NULL);
- man->angle_z = WM_gizmo_new_ptr(gzt_dial, gzgroup, NULL);
-
- UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, man->translate_z->color);
- UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, man->translate_c->color);
- UI_GetThemeColor3fv(TH_GIZMO_SECONDARY, man->rotate_c->color);
- UI_GetThemeColor3fv(TH_AXIS_Z, man->angle_z->color);
-
-
- RNA_enum_set(man->translate_z->ptr, "draw_style", ED_GIZMO_ARROW_STYLE_NORMAL);
- RNA_enum_set(man->translate_c->ptr, "draw_style", ED_GIZMO_GRAB_STYLE_RING_2D);
-
- WM_gizmo_set_flag(man->translate_c, WM_GIZMO_DRAW_VALUE, true);
- WM_gizmo_set_flag(man->rotate_c, WM_GIZMO_DRAW_VALUE, true);
- WM_gizmo_set_flag(man->angle_z, WM_GIZMO_DRAW_VALUE, true);
-
- WM_gizmo_set_scale(man->angle_z, 0.5f);
-
- {
- man->data.context = (bContext *)C;
- man->data.op = op;
- man->data.prop_axis_co = RNA_struct_find_property(op->ptr, "center");
- man->data.prop_axis_no = RNA_struct_find_property(op->ptr, "axis");
- man->data.prop_angle = RNA_struct_find_property(op->ptr, "angle");
- }
-
- gizmo_mesh_spin_update_from_op(man);
-
- /* Setup property callbacks */
- {
- WM_gizmo_target_property_def_func(
- man->translate_z, "offset",
- &(const struct wmGizmoPropertyFnParams) {
- .value_get_fn = gizmo_spin_prop_depth_get,
- .value_set_fn = gizmo_spin_prop_depth_set,
- .range_get_fn = NULL,
- .user_data = NULL,
- });
-
- WM_gizmo_target_property_def_func(
- man->translate_c, "offset",
- &(const struct wmGizmoPropertyFnParams) {
- .value_get_fn = gizmo_spin_prop_translate_get,
- .value_set_fn = gizmo_spin_prop_translate_set,
- .range_get_fn = NULL,
- .user_data = NULL,
- });
-
- WM_gizmo_target_property_def_func(
- man->rotate_c, "offset",
- &(const struct wmGizmoPropertyFnParams) {
- .value_get_fn = gizmo_spin_prop_axis_angle_get,
- .value_set_fn = gizmo_spin_prop_axis_angle_set,
- .range_get_fn = NULL,
- .user_data = NULL,
- });
-
- WM_gizmo_target_property_def_func(
- man->angle_z, "offset",
- &(const struct wmGizmoPropertyFnParams) {
- .value_get_fn = gizmo_spin_prop_angle_get,
- .value_set_fn = gizmo_spin_prop_angle_set,
- .range_get_fn = NULL,
- .user_data = NULL,
- });
-
- }
-}
-
-static void gizmo_mesh_spin_draw_prepare(
- const bContext *UNUSED(C), wmGizmoGroup *gzgroup)
-{
- GizmoSpinGroup *man = gzgroup->customdata;
- if (man->data.op->next) {
- man->data.op = WM_operator_last_redo((bContext *)man->data.context);
- }
- gizmo_mesh_spin_update_from_op(man);
-}
-
-static void MESH_GGT_spin(struct wmGizmoGroupType *gzgt)
-{
- gzgt->name = "Mesh Spin";
- gzgt->idname = "MESH_GGT_spin";
-
- gzgt->flag = WM_GIZMOGROUPTYPE_3D;
-
- gzgt->gzmap_params.spaceid = SPACE_VIEW3D;
- gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
-
- gzgt->poll = gizmo_mesh_spin_poll;
- gzgt->setup = gizmo_mesh_spin_setup;
- gzgt->draw_prepare = gizmo_mesh_spin_draw_prepare;
-}
-
-/** \} */
-
-#endif /* USE_GIZMO */
-
/* -------------------------------------------------------------------- */
/** \name Spin Operator
* \{ */
@@ -440,16 +66,18 @@ static int edbm_spin_exec(bContext *C, wmOperator *op)
ViewLayer *view_layer = CTX_data_view_layer(C);
float cent[3], axis[3];
float d[3] = {0.0f, 0.0f, 0.0f};
- int steps, dupli;
- float angle;
RNA_float_get_array(op->ptr, "center", cent);
RNA_float_get_array(op->ptr, "axis", axis);
- steps = RNA_int_get(op->ptr, "steps");
- angle = RNA_float_get(op->ptr, "angle");
- //if (ts->editbutflag & B_CLOCKWISE)
- angle = -angle;
- dupli = RNA_boolean_get(op->ptr, "dupli");
+ const int steps = RNA_int_get(op->ptr, "steps");
+ const float angle = RNA_float_get(op->ptr, "angle");
+ const bool use_normal_flip = RNA_boolean_get(op->ptr, "use_normal_flip") ^ (angle < 0.0f);
+ const bool dupli = RNA_boolean_get(op->ptr, "dupli");
+ const bool use_auto_merge = (
+ RNA_boolean_get(op->ptr, "use_auto_merge") &&
+ (dupli == false) &&
+ (steps >= 3) &&
+ fabsf((fabsf(angle) - (float)(M_PI * 2))) <= 1e-6f);
if (is_zero_v3(axis)) {
BKE_report(op->reports, RPT_ERROR, "Invalid/unset axis");
@@ -466,15 +94,20 @@ static int edbm_spin_exec(bContext *C, wmOperator *op)
BMOperator spinop;
/* keep the values in worldspace since we're passing the obmat */
- if (!EDBM_op_init(em, &spinop, op,
- "spin geom=%hvef cent=%v axis=%v dvec=%v steps=%i angle=%f space=%m4 use_duplicate=%b",
- BM_ELEM_SELECT, cent, axis, d, steps, angle, obedit->obmat, dupli))
+ if (!EDBM_op_init(
+ em, &spinop, op,
+ "spin geom=%hvef cent=%v axis=%v dvec=%v steps=%i angle=%f space=%m4 "
+ "use_normal_flip=%b use_duplicate=%b use_merge=%b",
+ BM_ELEM_SELECT, cent, axis, d, steps, -angle, obedit->obmat,
+ use_normal_flip, dupli, use_auto_merge))
{
continue;
}
BMO_op_exec(bm, &spinop);
- EDBM_flag_disable_all(em, BM_ELEM_SELECT);
- BMO_slot_buffer_hflag_enable(bm, spinop.slots_out, "geom_last.out", BM_ALL_NOLOOP, BM_ELEM_SELECT, true);
+ if (use_auto_merge == false) {
+ EDBM_flag_disable_all(em, BM_ELEM_SELECT);
+ BMO_slot_buffer_hflag_enable(bm, spinop.slots_out, "geom_last.out", BM_ALL_NOLOOP, BM_ELEM_SELECT, true);
+ }
if (!EDBM_op_finish(em, &spinop, op, true)) {
continue;
}
@@ -506,13 +139,26 @@ static int edbm_spin_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(e
}
}
+
+#ifdef USE_GIZMO
+ /* Start with zero angle, drag out the value. */
+ prop = RNA_struct_find_property(op->ptr, "angle");
+ if (!RNA_property_is_set(op->ptr, prop)) {
+ RNA_property_float_set(op->ptr, prop, 0.0f);
+ }
+#endif
+
int ret = edbm_spin_exec(C, op);
#ifdef USE_GIZMO
if (ret & OPERATOR_FINISHED) {
/* Setup gizmos */
if (v3d && ((v3d->gizmo_flag & V3D_GIZMO_HIDE) == 0)) {
- WM_gizmo_group_type_ensure("MESH_GGT_spin");
+ wmGizmoGroupType *gzgt = WM_gizmogrouptype_find("MESH_GGT_spin_redo", false);
+ if (!WM_gizmo_group_type_ensure_ptr(gzgt)) {
+ struct Main *bmain = CTX_data_main(C);
+ WM_gizmo_group_type_reinit_ptr(bmain, gzgt);
+ }
}
}
#endif
@@ -520,6 +166,21 @@ static int edbm_spin_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(e
return ret;
}
+static bool edbm_spin_poll_property(const bContext *UNUSED(C), wmOperator *op, const PropertyRNA *prop)
+{
+ const char *prop_id = RNA_property_identifier(prop);
+ const bool dupli = RNA_boolean_get(op->ptr, "dupli");
+
+ if (dupli) {
+ if (STREQ(prop_id, "use_auto_merge") ||
+ STREQ(prop_id, "use_normal_flip"))
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
void MESH_OT_spin(wmOperatorType *ot)
{
PropertyRNA *prop;
@@ -533,6 +194,7 @@ void MESH_OT_spin(wmOperatorType *ot)
ot->invoke = edbm_spin_invoke;
ot->exec = edbm_spin_exec;
ot->poll = ED_operator_editmesh;
+ ot->poll_property = edbm_spin_poll_property;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -543,12 +205,17 @@ void MESH_OT_spin(wmOperatorType *ot)
prop = RNA_def_float(ot->srna, "angle", DEG2RADF(90.0f), -1e12f, 1e12f, "Angle", "Rotation for each step",
DEG2RADF(-360.0f), DEG2RADF(360.0f));
RNA_def_property_subtype(prop, PROP_ANGLE);
+ RNA_def_boolean(ot->srna, "use_auto_merge", true, "Auto Merge", "Merge first/last when the angle is a full revolution");
+ RNA_def_boolean(ot->srna, "use_normal_flip", 0, "Flip Normals", "");
RNA_def_float_vector(ot->srna, "center", 3, NULL, -1e12f, 1e12f,
"Center", "Center in global view space", -1e4f, 1e4f);
RNA_def_float_vector(ot->srna, "axis", 3, NULL, -1.0f, 1.0f, "Axis", "Axis in global view space", -1.0f, 1.0f);
-#ifdef USE_GIZMO
WM_gizmogrouptype_append(MESH_GGT_spin);
+#ifdef USE_GIZMO
+ WM_gizmogrouptype_append(MESH_GGT_spin_redo);
#endif
}
+
+/** \} */
diff --git a/source/blender/editors/mesh/editmesh_extrude_spin_gizmo.c b/source/blender/editors/mesh/editmesh_extrude_spin_gizmo.c
new file mode 100644
index 00000000000..db2bb3bc66d
--- /dev/null
+++ b/source/blender/editors/mesh/editmesh_extrude_spin_gizmo.c
@@ -0,0 +1,1080 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/mesh/editmesh_extrude_spin_gizmo.c
+ * \ingroup edmesh
+ */
+
+#include "BLI_math.h"
+
+#include "BKE_context.h"
+
+#include "RNA_define.h"
+#include "RNA_access.h"
+#include "RNA_enum_types.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+#include "WM_message.h"
+#include "WM_toolsystem.h"
+
+#include "ED_gizmo_utils.h"
+#include "ED_screen.h"
+#include "ED_view3d.h"
+
+#include "UI_resources.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "mesh_intern.h" /* own include */
+
+#include "ED_transform.h"
+
+#include "ED_gizmo_library.h"
+#include "ED_undo.h"
+
+/**
+ * Orient the handles towards the selection (can be slow with high-poly mesh!).
+ */
+// Disable for now, issues w/ refresh and '+' icons overlap.
+// #define USE_SELECT_CENTER
+
+#ifdef USE_SELECT_CENTER
+# include "BKE_editmesh.h"
+#endif
+
+static const float dial_angle_partial = M_PI / 2;
+static const float dial_angle_partial_margin = 0.92f;
+
+#define ORTHO_AXIS_OFFSET 2
+
+/* -------------------------------------------------------------------- */
+/** \name Spin Tool Gizmo
+ * \{ */
+
+typedef struct GizmoGroupData_SpinInit {
+ struct {
+ wmGizmo *xyz_view[4];
+ wmGizmo *icon_button[3][2];
+ } gizmos;
+
+ /* Only for view orientation. */
+ struct {
+ float viewinv_m3[3][3];
+ } prev;
+
+ /* We could store more vars here! */
+ struct {
+ wmOperatorType *ot_spin;
+ PropertyRNA *gzgt_axis_prop;
+ float orient_mat[3][3];
+#ifdef USE_SELECT_CENTER
+ float select_center[3];
+ float select_center_ortho_axis[3][3];
+ bool use_select_center;
+#endif
+ } data;
+
+ /* Store data for invoke. */
+ struct {
+ int ortho_axis_active;
+ } invoke;
+
+} GizmoGroupData_SpinInit;
+
+/* Use dials only as a visualization when hovering over the icons. */
+#define USE_DIAL_HOVER
+
+#define INIT_SCALE_BASE 2.3f
+#define INIT_SCALE_BUTTON 0.15f
+
+static const uchar shape_plus[] = {
+ 0x5f, 0xfb, 0x40, 0xee, 0x25, 0xda, 0x11, 0xbf, 0x4, 0xa0, 0x0, 0x80, 0x4, 0x5f, 0x11,
+ 0x40, 0x25, 0x25, 0x40, 0x11, 0x5f, 0x4, 0x7f, 0x0, 0xa0, 0x4, 0xbf, 0x11, 0xda, 0x25,
+ 0xee, 0x40, 0xfb, 0x5f, 0xff, 0x7f, 0xfb, 0xa0, 0xee, 0xbf, 0xda, 0xda, 0xbf, 0xee,
+ 0xa0, 0xfb, 0x80, 0xff, 0x6e, 0xd7, 0x92, 0xd7, 0x92, 0x90, 0xd8, 0x90, 0xd8, 0x6d,
+ 0x92, 0x6d, 0x92, 0x27, 0x6e, 0x27, 0x6e, 0x6d, 0x28, 0x6d, 0x28, 0x90, 0x6e,
+ 0x90, 0x6e, 0xd7, 0x80, 0xff, 0x5f, 0xfb, 0x5f, 0xfb,
+};
+
+static void gizmo_mesh_spin_init_setup(const bContext *UNUSED(C), wmGizmoGroup *gzgroup)
+{
+ /* alpha values for normal/highlighted states */
+ const float alpha = 0.6f;
+ const float alpha_hi = 1.0f;
+ const float scale_base = INIT_SCALE_BASE;
+ const float scale_button = INIT_SCALE_BUTTON;
+
+ GizmoGroupData_SpinInit *ggd = MEM_callocN(sizeof(*ggd), __func__);
+ gzgroup->customdata = ggd;
+ const wmGizmoType *gzt_dial = WM_gizmotype_find("GIZMO_GT_dial_3d", true);
+ const wmGizmoType *gzt_button = WM_gizmotype_find("GIZMO_GT_button_2d", true);
+
+ for (int i = 0; i < 3; i++) {
+ for (int j = 0; j < 2; j++) {
+ wmGizmo *gz = WM_gizmo_new_ptr(gzt_button, gzgroup, NULL);
+ PropertyRNA *prop = RNA_struct_find_property(gz->ptr, "shape");
+ RNA_property_string_set_bytes(
+ gz->ptr, prop,
+ (const char *)shape_plus, ARRAY_SIZE(shape_plus));
+
+ float color[4];
+ UI_GetThemeColor3fv(TH_AXIS_X + i, color);
+ color[3] = alpha;
+ WM_gizmo_set_color(gz, color);
+
+ WM_gizmo_set_scale(gz, scale_button);
+ gz->color[3] = 0.6f;
+
+ gz->flag |= WM_GIZMO_DRAW_OFFSET_SCALE;
+
+ ggd->gizmos.icon_button[i][j] = gz;
+ }
+ }
+
+ for (int i = 0; i < ARRAY_SIZE(ggd->gizmos.xyz_view); i++) {
+ wmGizmo *gz = WM_gizmo_new_ptr(gzt_dial, gzgroup, NULL);
+ UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, gz->color);
+ WM_gizmo_set_flag(gz, WM_GIZMO_DRAW_VALUE | WM_GIZMO_HIDDEN_SELECT, true);
+ ggd->gizmos.xyz_view[i] = gz;
+ }
+
+ for (int i = 0; i < 3; i++) {
+ wmGizmo *gz = ggd->gizmos.xyz_view[i];
+#ifndef USE_DIAL_HOVER
+ RNA_enum_set(gz->ptr, "draw_options", ED_GIZMO_DIAL_DRAW_FLAG_CLIP);
+#endif
+ WM_gizmo_set_line_width(gz, 2.0f);
+ float color[4];
+ UI_GetThemeColor3fv(TH_AXIS_X + i, color);
+ color[3] = alpha;
+ WM_gizmo_set_color(gz, color);
+ color[3] = alpha_hi;
+ WM_gizmo_set_color_highlight(gz, color);
+ WM_gizmo_set_scale(gz, INIT_SCALE_BASE);
+ RNA_float_set(gz->ptr, "arc_partial_angle", (M_PI * 2) - (dial_angle_partial * dial_angle_partial_margin));
+ }
+
+ {
+ wmGizmo *gz = ggd->gizmos.xyz_view[3];
+ WM_gizmo_set_line_width(gz, 2.0f);
+ float color[4];
+ copy_v3_fl(color, 1.0f);
+ color[3] = alpha;
+ WM_gizmo_set_color(gz, color);
+ color[3] = alpha_hi;
+ WM_gizmo_set_color_highlight(gz, color);
+ WM_gizmo_set_scale(gz, scale_base);
+ }
+
+
+#ifdef USE_DIAL_HOVER
+ for (int i = 0; i < 4; i++) {
+ wmGizmo *gz = ggd->gizmos.xyz_view[i];
+ WM_gizmo_set_flag(gz, WM_GIZMO_HIDDEN, true);
+ }
+#endif
+
+ ggd->data.ot_spin = WM_operatortype_find("MESH_OT_spin", true);
+ ggd->data.gzgt_axis_prop = RNA_struct_type_find_property(gzgroup->type->srna, "axis");
+}
+
+static void gizmo_mesh_spin_init_refresh(const bContext *C, wmGizmoGroup *gzgroup);
+
+static void gizmo_mesh_spin_init_refresh_axis_orientation(
+ wmGizmoGroup *gzgroup,
+ int axis_index, const float axis_vec[3], const float axis_tan[3])
+{
+ GizmoGroupData_SpinInit *ggd = gzgroup->customdata;
+ wmGizmo *gz = ggd->gizmos.xyz_view[axis_index];
+ if (axis_tan != NULL) {
+ WM_gizmo_set_matrix_rotation_from_yz_axis(gz, axis_tan, axis_vec);
+ }
+ else {
+ WM_gizmo_set_matrix_rotation_from_z_axis(gz, axis_vec);
+ }
+
+ /* Only for display, use icons to access. */
+#ifndef USE_DIAL_HOVER
+ {
+ PointerRNA *ptr = WM_gizmo_operator_set(gz, 0, ggd->data.ot_spin, NULL);
+ RNA_float_set_array(ptr, "axis", axis_vec);
+ }
+#endif
+ if (axis_index < 3) {
+ for (int j = 0; j < 2; j++) {
+ gz = ggd->gizmos.icon_button[axis_index][j];
+ PointerRNA *ptr = WM_gizmo_operator_set(gz, 0, ggd->data.ot_spin, NULL);
+ float axis_vec_flip[3];
+ if (0 == j) {
+ negate_v3_v3(axis_vec_flip, axis_vec);
+ }
+ else {
+ copy_v3_v3(axis_vec_flip, axis_vec);
+ }
+ RNA_float_set_array(ptr, "axis", axis_vec_flip);
+ }
+ }
+}
+
+static void gizmo_mesh_spin_init_draw_prepare(
+ const bContext *C, wmGizmoGroup *gzgroup)
+{
+ GizmoGroupData_SpinInit *ggd = gzgroup->customdata;
+ RegionView3D *rv3d = CTX_wm_region_view3d(C);
+ float viewinv_m3[3][3];
+ copy_m3_m4(viewinv_m3, rv3d->viewinv);
+
+ {
+ Scene *scene = CTX_data_scene(C);
+ switch (scene->orientation_type) {
+ case V3D_MANIP_VIEW:
+ {
+ if (!equals_m3m3(viewinv_m3, ggd->prev.viewinv_m3)) {
+ /* Take care calling refresh from draw_prepare,
+ * this should be OK because it's only adjusting the cage orientation. */
+ gizmo_mesh_spin_init_refresh(C, gzgroup);
+ }
+ break;
+ }
+ }
+ }
+
+ /* Refresh handled above when using view orientation. */
+ if (!equals_m3m3(viewinv_m3, ggd->prev.viewinv_m3)) {
+ gizmo_mesh_spin_init_refresh_axis_orientation(gzgroup, 3, rv3d->viewinv[2], NULL);
+ copy_m3_m4(ggd->prev.viewinv_m3, rv3d->viewinv);
+ }
+
+ /* Hack! highlight XYZ dials based on buttons */
+#ifdef USE_DIAL_HOVER
+ {
+ PointerRNA ptr;
+ bToolRef *tref = WM_toolsystem_ref_from_context((bContext *)C);
+ WM_toolsystem_ref_properties_ensure_from_gizmo_group(tref, gzgroup->type, &ptr);
+ const int axis_flag = RNA_property_enum_get(&ptr, ggd->data.gzgt_axis_prop);
+ for (int i = 0; i < 4; i++) {
+ bool hide = (axis_flag & (1 << i)) == 0;
+ wmGizmo *gz = ggd->gizmos.xyz_view[i];
+ WM_gizmo_set_flag(gz, WM_GIZMO_HIDDEN, hide);
+ if (!hide) {
+ RNA_float_set(gz->ptr, "arc_partial_angle", (M_PI * 2) - (dial_angle_partial * dial_angle_partial_margin));
+ }
+ }
+
+ for (int i = 0; i < 3; i++) {
+ for (int j = 0; j < 2; j++) {
+ wmGizmo *gz = ggd->gizmos.icon_button[i][j];
+ if (gz->state & WM_GIZMO_STATE_HIGHLIGHT) {
+ WM_gizmo_set_flag(ggd->gizmos.xyz_view[i], WM_GIZMO_HIDDEN, false);
+ RNA_float_set(ggd->gizmos.xyz_view[i]->ptr, "arc_partial_angle", 0.0f);
+ i = 3;
+ break;
+ }
+ }
+ }
+ }
+#endif
+
+}
+
+static void gizmo_mesh_spin_init_invoke_prepare(
+ const bContext *UNUSED(C), wmGizmoGroup *gzgroup, wmGizmo *gz)
+{
+ /* Set the initial ortho axis. */
+ GizmoGroupData_SpinInit *ggd = gzgroup->customdata;
+ ggd->invoke.ortho_axis_active = -1;
+ for (int i = 0; i < 3; i++) {
+ if (ELEM(gz, UNPACK2(ggd->gizmos.icon_button[i]))) {
+ ggd->invoke.ortho_axis_active = i;
+ break;
+ }
+ }
+}
+
+static void gizmo_mesh_spin_init_refresh(const bContext *C, wmGizmoGroup *gzgroup)
+{
+ GizmoGroupData_SpinInit *ggd = gzgroup->customdata;
+ RegionView3D *rv3d = ED_view3d_context_rv3d((bContext *)C);
+ const float *gizmo_center = NULL;
+ {
+ Scene *scene = CTX_data_scene(C);
+ View3D *v3d = CTX_wm_view3d(C);
+ const View3DCursor *cursor = ED_view3d_cursor3d_get(scene, v3d);
+ gizmo_center = cursor->location;
+ }
+
+ for (int i = 0; i < ARRAY_SIZE(ggd->gizmos.xyz_view); i++) {
+ wmGizmo *gz = ggd->gizmos.xyz_view[i];
+ WM_gizmo_set_matrix_location(gz, gizmo_center);
+ }
+
+ for (int i = 0; i < ARRAY_SIZE(ggd->gizmos.icon_button); i++) {
+ for (int j = 0; j < 2; j++) {
+ wmGizmo *gz = ggd->gizmos.icon_button[i][j];
+ WM_gizmo_set_matrix_location(gz, gizmo_center);
+ }
+ }
+
+ ED_transform_calc_orientation_from_type(C, ggd->data.orient_mat);
+ for (int i = 0; i < 3; i++) {
+ const int axis_ortho = (i + ORTHO_AXIS_OFFSET) % 3;
+ const float *axis_ortho_vec = ggd->data.orient_mat[axis_ortho];
+#ifdef USE_SELECT_CENTER
+ if (ggd->data.use_select_center) {
+ float delta[3];
+ sub_v3_v3v3(delta, ggd->data.select_center, gizmo_center);
+ project_plane_normalized_v3_v3v3(ggd->data.select_center_ortho_axis[i], delta, ggd->data.orient_mat[i]);
+ if (normalize_v3(ggd->data.select_center_ortho_axis[i]) != 0.0f) {
+ axis_ortho_vec = ggd->data.select_center_ortho_axis[i];
+ }
+ }
+#endif
+ gizmo_mesh_spin_init_refresh_axis_orientation(
+ gzgroup, i, ggd->data.orient_mat[i], axis_ortho_vec);
+ }
+
+ {
+ gizmo_mesh_spin_init_refresh_axis_orientation(
+ gzgroup, 3, rv3d->viewinv[2], NULL);
+ }
+
+
+#ifdef USE_SELECT_CENTER
+ {
+ Object *obedit = CTX_data_edit_object(C);
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ float select_center[3] = {0};
+ int totsel = 0;
+
+ BMesh *bm = em->bm;
+ BMVert *eve;
+ BMIter iter;
+
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
+ if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
+ totsel++;
+ add_v3_v3(select_center, eve->co);
+ }
+ }
+ }
+ if (totsel) {
+ mul_v3_fl(select_center, 1.0f / totsel);
+ mul_m4_v3(obedit->obmat, select_center);
+ copy_v3_v3(ggd->data.select_center, select_center);
+ ggd->data.use_select_center = true;
+ }
+ else {
+ ggd->data.use_select_center = false;
+ }
+ }
+#endif
+
+ for (int i = 0; i < ARRAY_SIZE(ggd->gizmos.icon_button); i++) {
+ const int axis_ortho = (i + ORTHO_AXIS_OFFSET) % 3;
+ const float *axis_ortho_vec = ggd->data.orient_mat[axis_ortho];
+ float offset = INIT_SCALE_BASE / INIT_SCALE_BUTTON;
+ float offset_vec[3];
+
+#ifdef USE_SELECT_CENTER
+ if (ggd->data.use_select_center && !is_zero_v3(ggd->data.select_center_ortho_axis[i])) {
+ axis_ortho_vec = ggd->data.select_center_ortho_axis[i];
+ }
+#endif
+
+ mul_v3_v3fl(offset_vec, axis_ortho_vec, offset);
+ for (int j = 0; j < 2; j++) {
+ wmGizmo *gz = ggd->gizmos.icon_button[i][j];
+ float mat3[3][3];
+ axis_angle_to_mat3(mat3, ggd->data.orient_mat[i], dial_angle_partial * (j ? -0.5f : 0.5f));
+ mul_v3_m3v3(gz->matrix_offset[3], mat3, offset_vec);
+ }
+ }
+
+ {
+ PointerRNA ptr;
+ bToolRef *tref = WM_toolsystem_ref_from_context((bContext *)C);
+ WM_toolsystem_ref_properties_ensure_from_gizmo_group(tref, gzgroup->type, &ptr);
+ const int axis_flag = RNA_property_enum_get(&ptr, ggd->data.gzgt_axis_prop);
+ for (int i = 0; i < ARRAY_SIZE(ggd->gizmos.icon_button); i++) {
+ for (int j = 0; j < 2; j++) {
+ wmGizmo *gz = ggd->gizmos.icon_button[i][j];
+ WM_gizmo_set_flag(gz, WM_GIZMO_HIDDEN, (axis_flag & (1 << i)) == 0);
+ }
+ }
+ }
+
+ /* Needed to test view orientation changes. */
+ copy_m3_m4(ggd->prev.viewinv_m3, rv3d->viewinv);
+}
+
+
+static void gizmo_mesh_spin_init_message_subscribe(
+ const bContext *C, wmGizmoGroup *gzgroup, struct wmMsgBus *mbus)
+{
+ GizmoGroupData_SpinInit *ggd = gzgroup->customdata;
+ Scene *scene = CTX_data_scene(C);
+ ARegion *ar = CTX_wm_region(C);
+
+ /* Subscribe to view properties */
+ wmMsgSubscribeValue msg_sub_value_gz_tag_refresh = {
+ .owner = ar,
+ .user_data = gzgroup->parent_gzmap,
+ .notify = WM_gizmo_do_msg_notify_tag_refresh,
+ };
+
+ PointerRNA scene_ptr;
+ RNA_id_pointer_create(&scene->id, &scene_ptr);
+
+ {
+ extern PropertyRNA rna_Scene_transform_orientation;
+ extern PropertyRNA rna_Scene_cursor_location;
+ const PropertyRNA *props[] = {
+ &rna_Scene_transform_orientation,
+ &rna_Scene_cursor_location,
+ };
+ for (int i = 0; i < ARRAY_SIZE(props); i++) {
+ WM_msg_subscribe_rna(mbus, &scene_ptr, props[i], &msg_sub_value_gz_tag_refresh, __func__);
+ }
+ }
+
+ WM_msg_subscribe_rna_params(
+ mbus,
+ &(const wmMsgParams_RNA){
+ .ptr = (PointerRNA){.type = gzgroup->type->srna},
+ .prop = ggd->data.gzgt_axis_prop,
+ },
+ &msg_sub_value_gz_tag_refresh, __func__);
+
+}
+
+void MESH_GGT_spin(struct wmGizmoGroupType *gzgt)
+{
+ gzgt->name = "Mesh Spin Init";
+ gzgt->idname = "MESH_GGT_spin";
+
+ gzgt->flag = WM_GIZMOGROUPTYPE_3D;
+
+ gzgt->gzmap_params.spaceid = SPACE_VIEW3D;
+ gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
+
+ gzgt->poll = ED_gizmo_poll_or_unlink_delayed_from_tool;
+ gzgt->setup = gizmo_mesh_spin_init_setup;
+ gzgt->refresh = gizmo_mesh_spin_init_refresh;
+ gzgt->message_subscribe = gizmo_mesh_spin_init_message_subscribe;
+ gzgt->draw_prepare = gizmo_mesh_spin_init_draw_prepare;
+ gzgt->invoke_prepare = gizmo_mesh_spin_init_invoke_prepare;
+
+ RNA_def_enum_flag(gzgt->srna, "axis", rna_enum_axis_flag_xyz_items, (1 << 2), "Axis", "");
+}
+
+#undef INIT_SCALE_BASE
+#undef INIT_SCALE_BUTTON
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Spin Redo Gizmo
+ * \{ */
+
+/**
+ * Orient the dial so the 'arc' starts where the mouse cursor is,
+ * this is simply to keep the gizmo displaying where the cursor starts.
+ * It's not needed for practical functionality.
+ */
+#define USE_ANGLE_Z_ORIENT
+
+typedef struct GizmoGroupData_SpinRedo {
+ /* Translate XYZ. */
+ struct wmGizmo *translate_c;
+ /* Spin angle */
+ struct wmGizmo *angle_z;
+
+ /* Translate XY constrained ('orient_mat'). */
+ struct wmGizmo *translate_xy[2];
+ /* Rotate XY constrained ('orient_mat'). */
+ struct wmGizmo *rotate_xy[2];
+
+ /* Rotate on view axis. */
+ struct wmGizmo *rotate_view;
+
+ struct {
+ float plane_co[3];
+ float plane_no[3];
+ } prev;
+
+ bool is_init;
+
+ /* We could store more vars here! */
+ struct {
+ bContext *context;
+ wmOperatorType *ot;
+ wmOperator *op;
+ PropertyRNA *prop_axis_co;
+ PropertyRNA *prop_axis_no;
+ PropertyRNA *prop_angle;
+
+ float rotate_axis[3];
+#ifdef USE_ANGLE_Z_ORIENT
+ /* Apply 'orient_mat' for the final value. */
+ float orient_axis_relative[3];
+#endif
+ /* The orientation, since the operator doesn't store this, we store our own.
+ * this is kept in sync with the operator,
+ * rotating the orientation when it doesn't match.
+ *
+ * Initialize to a sensible value where possible.
+ */
+ float orient_mat[3][3];
+
+ } data;
+} GizmoGroupData_SpinRedo;
+
+/**
+ * XXX. calling redo from property updates is not great.
+ * This is needed because changing the RNA doesn't cause a redo
+ * and we're not using operator UI which does just this.
+ */
+static void gizmo_spin_exec(GizmoGroupData_SpinRedo *ggd)
+{
+ if (ggd->is_init) {
+ wmGizmo *gz = ggd->angle_z;
+ PropertyRNA *prop = RNA_struct_find_property(gz->ptr, "click_value");
+ RNA_property_unset(gz->ptr, prop);
+ ggd->is_init = false;
+ }
+
+ wmOperator *op = ggd->data.op;
+ if (op == WM_operator_last_redo((bContext *)ggd->data.context)) {
+ ED_undo_operator_repeat((bContext *)ggd->data.context, op);
+ }
+}
+
+static void gizmo_mesh_spin_redo_update_orient_axis(GizmoGroupData_SpinRedo *ggd, const float plane_no[3])
+{
+ float mat[3][3];
+ rotation_between_vecs_to_mat3(mat, ggd->data.orient_mat[2], plane_no);
+ mul_m3_m3m3(ggd->data.orient_mat, mat, ggd->data.orient_mat);
+ /* Not needed, just set for numeric stability. */
+ copy_v3_v3(ggd->data.orient_mat[2], plane_no);
+}
+
+static void gizmo_mesh_spin_redo_update_from_op(GizmoGroupData_SpinRedo *ggd)
+{
+ wmOperator *op = ggd->data.op;
+ float plane_co[3], plane_no[3];
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_axis_co, plane_co);
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_axis_no, plane_no);
+ if (UNLIKELY(normalize_v3(plane_no) == 0.0f)) {
+ return;
+ }
+ const bool is_plane_co_eq = equals_v3v3(plane_co, ggd->prev.plane_co);
+ const bool is_plane_no_eq = equals_v3v3(plane_no, ggd->prev.plane_no);
+ if (is_plane_co_eq && is_plane_no_eq) {
+ return;
+ }
+ copy_v3_v3(ggd->prev.plane_co, plane_co);
+ copy_v3_v3(ggd->prev.plane_no, plane_no);
+
+ if (is_plane_no_eq == false) {
+ gizmo_mesh_spin_redo_update_orient_axis(ggd, plane_no);
+ }
+
+ for (int i = 0; i < 2; i++) {
+ WM_gizmo_set_matrix_location(ggd->rotate_xy[i], plane_co);
+ WM_gizmo_set_matrix_location(ggd->translate_xy[i], plane_co);
+ }
+ WM_gizmo_set_matrix_location(ggd->angle_z, plane_co);
+ WM_gizmo_set_matrix_location(ggd->rotate_view, plane_co);
+ /* translate_c location comes from the property. */
+
+ for (int i = 0; i < 2; i++) {
+ WM_gizmo_set_matrix_rotation_from_z_axis(ggd->translate_xy[i], ggd->data.orient_mat[i]);
+ WM_gizmo_set_matrix_rotation_from_z_axis(ggd->rotate_xy[i], ggd->data.orient_mat[i]);
+ }
+#ifdef USE_ANGLE_Z_ORIENT
+ {
+ float plane_tan[3];
+ float orient_axis[3];
+ mul_v3_m3v3(orient_axis, ggd->data.orient_mat, ggd->data.orient_axis_relative);
+ project_plane_normalized_v3_v3v3(plane_tan, orient_axis, plane_no);
+ if (normalize_v3(plane_tan) != 0.0f) {
+ WM_gizmo_set_matrix_rotation_from_yz_axis(ggd->angle_z, plane_tan, plane_no);
+ }
+ else {
+ WM_gizmo_set_matrix_rotation_from_z_axis(ggd->angle_z, plane_no);
+ }
+ }
+#else
+ WM_gizmo_set_matrix_rotation_from_z_axis(ggd->angle_z, plane_no);
+#endif
+}
+
+/* depth callbacks */
+static void gizmo_spin_prop_depth_get(
+ const wmGizmo *gz, wmGizmoProperty *gz_prop,
+ void *value_p)
+{
+ GizmoGroupData_SpinRedo *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
+ float *value = value_p;
+
+ BLI_assert(gz_prop->type->array_length == 1);
+ UNUSED_VARS_NDEBUG(gz_prop);
+
+ const float *plane_no = gz->matrix_basis[2];
+ float plane_co[3];
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_axis_co, plane_co);
+
+ value[0] = dot_v3v3(plane_no, plane_co) - dot_v3v3(plane_no, gz->matrix_basis[3]);
+}
+
+static void gizmo_spin_prop_depth_set(
+ const wmGizmo *gz, wmGizmoProperty *gz_prop,
+ const void *value_p)
+{
+ GizmoGroupData_SpinRedo *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
+ const float *value = value_p;
+
+ BLI_assert(gz_prop->type->array_length == 1);
+ UNUSED_VARS_NDEBUG(gz_prop);
+
+ float plane_co[3], plane[4];
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_axis_co, plane_co);
+ normalize_v3_v3(plane, gz->matrix_basis[2]);
+
+ plane[3] = -value[0] - dot_v3v3(plane, gz->matrix_basis[3]);
+
+ /* Keep our location, may be offset simply to be inside the viewport. */
+ closest_to_plane_normalized_v3(plane_co, plane, plane_co);
+
+ RNA_property_float_set_array(op->ptr, ggd->data.prop_axis_co, plane_co);
+
+ gizmo_spin_exec(ggd);
+}
+
+/* translate callbacks */
+static void gizmo_spin_prop_translate_get(
+ const wmGizmo *gz, wmGizmoProperty *gz_prop,
+ void *value_p)
+{
+ GizmoGroupData_SpinRedo *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
+ float *value = value_p;
+
+ BLI_assert(gz_prop->type->array_length == 3);
+ UNUSED_VARS_NDEBUG(gz_prop);
+
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_axis_co, value);
+}
+
+static void gizmo_spin_prop_translate_set(
+ const wmGizmo *gz, wmGizmoProperty *gz_prop,
+ const void *value)
+{
+ GizmoGroupData_SpinRedo *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
+
+ BLI_assert(gz_prop->type->array_length == 3);
+ UNUSED_VARS_NDEBUG(gz_prop);
+
+ RNA_property_float_set_array(op->ptr, ggd->data.prop_axis_co, value);
+
+ gizmo_spin_exec(ggd);
+}
+
+/* angle callbacks */
+static void gizmo_spin_prop_axis_angle_get(
+ const wmGizmo *gz, wmGizmoProperty *gz_prop,
+ void *value_p)
+{
+ GizmoGroupData_SpinRedo *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
+ float *value = value_p;
+
+ BLI_assert(gz_prop->type->array_length == 1);
+ UNUSED_VARS_NDEBUG(gz_prop);
+
+ float plane_no[4];
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_axis_no, plane_no);
+ normalize_v3(plane_no);
+
+ const float *rotate_axis = gz->matrix_basis[2];
+ float rotate_up[3];
+ ortho_v3_v3(rotate_up, rotate_axis);
+
+ float plane_no_proj[3];
+ project_plane_normalized_v3_v3v3(plane_no_proj, plane_no, rotate_axis);
+
+ if (!is_zero_v3(plane_no_proj)) {
+ const float angle = -angle_signed_on_axis_v3v3_v3(plane_no_proj, rotate_up, rotate_axis);
+ value[0] = angle;
+ }
+ else {
+ value[0] = 0.0f;
+ }
+}
+
+static void gizmo_spin_prop_axis_angle_set(
+ const wmGizmo *gz, wmGizmoProperty *gz_prop,
+ const void *value_p)
+{
+ GizmoGroupData_SpinRedo *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
+ const float *value = value_p;
+
+ BLI_assert(gz_prop->type->array_length == 1);
+ UNUSED_VARS_NDEBUG(gz_prop);
+
+ float plane_no[4];
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_axis_no, plane_no);
+ normalize_v3(plane_no);
+
+ const float *rotate_axis = gz->matrix_basis[2];
+ float rotate_up[3];
+ ortho_v3_v3(rotate_up, rotate_axis);
+
+ float plane_no_proj[3];
+ project_plane_normalized_v3_v3v3(plane_no_proj, plane_no, rotate_axis);
+
+ if (!is_zero_v3(plane_no_proj)) {
+ const float angle = -angle_signed_on_axis_v3v3_v3(plane_no_proj, rotate_up, rotate_axis);
+ const float angle_delta = angle - angle_compat_rad(value[0], angle);
+ if (angle_delta != 0.0f) {
+ float mat[3][3];
+ axis_angle_normalized_to_mat3(mat, rotate_axis, angle_delta);
+ mul_m3_v3(mat, plane_no);
+
+ /* re-normalize - seems acceptable */
+ RNA_property_float_set_array(op->ptr, ggd->data.prop_axis_no, plane_no);
+
+ gizmo_spin_exec(ggd);
+ }
+ }
+}
+
+/* angle callbacks */
+static void gizmo_spin_prop_angle_get(
+ const wmGizmo *gz, wmGizmoProperty *gz_prop,
+ void *value_p)
+{
+ GizmoGroupData_SpinRedo *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
+ float *value = value_p;
+
+ BLI_assert(gz_prop->type->array_length == 1);
+ UNUSED_VARS_NDEBUG(gz_prop);
+ value[0] = RNA_property_float_get(op->ptr, ggd->data.prop_angle);
+}
+
+static void gizmo_spin_prop_angle_set(
+ const wmGizmo *gz, wmGizmoProperty *gz_prop,
+ const void *value_p)
+{
+ GizmoGroupData_SpinRedo *ggd = gz->parent_gzgroup->customdata;
+ wmOperator *op = ggd->data.op;
+ BLI_assert(gz_prop->type->array_length == 1);
+ UNUSED_VARS_NDEBUG(gz_prop);
+ const float *value = value_p;
+ RNA_property_float_set(op->ptr, ggd->data.prop_angle, value[0]);
+
+ gizmo_spin_exec(ggd);
+}
+
+static bool gizmo_mesh_spin_redo_poll(const bContext *C, wmGizmoGroupType *gzgt)
+{
+ if (ED_gizmo_poll_or_unlink_delayed_from_operator(C, gzgt, "MESH_OT_spin")) {
+ if (ED_gizmo_poll_or_unlink_delayed_from_tool_ex(C, gzgt, "MESH_GGT_spin")) {
+ return true;
+ }
+ }
+ return false;
+}
+
+static void gizmo_mesh_spin_redo_modal_from_setup(
+ const bContext *C, wmGizmoGroup *gzgroup)
+{
+ /* Start off dragging. */
+ GizmoGroupData_SpinRedo *ggd = gzgroup->customdata;
+ wmWindow *win = CTX_wm_window(C);
+ wmGizmo *gz = ggd->angle_z;
+ wmGizmoMap *gzmap = gzgroup->parent_gzmap;
+
+ ggd->is_init = true;
+
+ WM_gizmo_modal_set_from_setup(
+ gzmap, (bContext *)C, gz, 0, win->eventstate);
+}
+
+static void gizmo_mesh_spin_redo_setup(const bContext *C, wmGizmoGroup *gzgroup)
+{
+ wmOperatorType *ot = WM_operatortype_find("MESH_OT_spin", true);
+ wmOperator *op = WM_operator_last_redo(C);
+
+ if ((op == NULL) || (op->type != ot)) {
+ return;
+ }
+
+ GizmoGroupData_SpinRedo *ggd = MEM_callocN(sizeof(*ggd), __func__);
+ gzgroup->customdata = ggd;
+
+ const wmGizmoType *gzt_arrow = WM_gizmotype_find("GIZMO_GT_arrow_3d", true);
+ const wmGizmoType *gzt_move = WM_gizmotype_find("GIZMO_GT_move_3d", true);
+ const wmGizmoType *gzt_dial = WM_gizmotype_find("GIZMO_GT_dial_3d", true);
+
+ /* Rotate View Axis (rotate_view) */
+ {
+ wmGizmo *gz = WM_gizmo_new_ptr(gzt_dial, gzgroup, NULL);
+ UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, gz->color);
+ zero_v4(gz->color);
+ copy_v3_fl(gz->color_hi, 1.0f);
+ gz->color_hi[3] = 0.1f;
+ WM_gizmo_set_flag(gz, WM_GIZMO_DRAW_VALUE, true);
+ RNA_enum_set(gz->ptr, "draw_options",
+ ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_MIRROR |
+ ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_START_Y |
+ ED_GIZMO_DIAL_DRAW_FLAG_FILL);
+ ggd->rotate_view = gz;
+ }
+
+ /* Translate Center (translate_c) */
+ {
+ wmGizmo *gz = WM_gizmo_new_ptr(gzt_move, gzgroup, NULL);
+ UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, gz->color);
+ gz->color[3] = 0.6f;
+ RNA_enum_set(gz->ptr, "draw_style", ED_GIZMO_MOVE_STYLE_RING_2D);
+ WM_gizmo_set_flag(gz, WM_GIZMO_DRAW_VALUE, true);
+ WM_gizmo_set_scale(gz, 0.15);
+ WM_gizmo_set_line_width(gz, 2.0f);
+ ggd->translate_c = gz;
+ }
+
+ /* Spin Angle (angle_z) */
+ {
+ wmGizmo *gz = WM_gizmo_new_ptr(gzt_dial, gzgroup, NULL);
+ copy_v3_v3(gz->color, gz->color_hi);
+ gz->color[3] = 0.5f;
+ RNA_boolean_set(gz->ptr, "wrap_angle", false);
+ RNA_enum_set(gz->ptr, "draw_options", ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_VALUE);
+ RNA_float_set(gz->ptr, "arc_inner_factor", 0.9f);
+ RNA_float_set(gz->ptr, "click_value", M_PI * 2);
+ WM_gizmo_set_flag(gz, WM_GIZMO_DRAW_VALUE, true);
+ WM_gizmo_set_scale(gz, 2.0f);
+ WM_gizmo_set_line_width(gz, 1.0f);
+ ggd->angle_z = gz;
+ }
+
+ /* Translate X/Y Tangents (translate_xy) */
+ for (int i = 0; i < 2; i++) {
+ wmGizmo *gz = WM_gizmo_new_ptr(gzt_arrow, gzgroup, NULL);
+ UI_GetThemeColor3fv(TH_AXIS_X + i, gz->color);
+ RNA_enum_set(gz->ptr, "draw_style", ED_GIZMO_ARROW_STYLE_NORMAL);
+ RNA_enum_set(gz->ptr, "draw_options", 0);
+ WM_gizmo_set_scale(gz, 1.2f);
+ ggd->translate_xy[i] = gz;
+ }
+
+ /* Rotate X/Y Tangents (rotate_xy) */
+ for (int i = 0; i < 2; i++) {
+ wmGizmo *gz = WM_gizmo_new_ptr(gzt_dial, gzgroup, NULL);
+ UI_GetThemeColor3fv(TH_AXIS_X + i, gz->color);
+ gz->color[3] = 0.6f;
+ WM_gizmo_set_flag(gz, WM_GIZMO_DRAW_VALUE, true);
+ WM_gizmo_set_line_width(gz, 3.0f);
+ /* show the axis instead of mouse cursor */
+ RNA_enum_set(gz->ptr, "draw_options",
+ ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_MIRROR |
+ ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_START_Y |
+ ED_GIZMO_DIAL_DRAW_FLAG_CLIP);
+ ggd->rotate_xy[i] = gz;
+ }
+
+ {
+ ggd->data.context = (bContext *)C;
+ ggd->data.ot = ot;
+ ggd->data.op = op;
+ ggd->data.prop_axis_co = RNA_struct_type_find_property(ot->srna, "center");
+ ggd->data.prop_axis_no = RNA_struct_type_find_property(ot->srna, "axis");
+ ggd->data.prop_angle = RNA_struct_type_find_property(ot->srna, "angle");
+ }
+
+ /* The spin operator only knows about an axis,
+ * while the manipulator has X/Y orientation for the gizmos.
+ * Initialize the orientation from the spin gizmo if possible.
+ */
+ {
+ ARegion *ar = CTX_wm_region(C);
+ wmGizmoMap *gzmap = ar->gizmo_map;
+ wmGizmoGroup *gzgroup_init = WM_gizmomap_group_find(gzmap, "MESH_GGT_spin");
+ if (gzgroup_init) {
+ GizmoGroupData_SpinInit *ggd_init = gzgroup_init->customdata;
+ copy_m3_m3(ggd->data.orient_mat, ggd_init->data.orient_mat);
+ if (ggd_init->invoke.ortho_axis_active != -1) {
+ copy_v3_v3(ggd->data.orient_axis_relative,
+ ggd_init->gizmos.xyz_view[ggd_init->invoke.ortho_axis_active]->matrix_basis[1]);
+ ggd_init->invoke.ortho_axis_active = -1;
+ }
+ }
+ else {
+ unit_m3(ggd->data.orient_mat);
+ }
+ }
+
+#ifdef USE_ANGLE_Z_ORIENT
+ {
+ wmWindow *win = CTX_wm_window(C);
+ View3D *v3d = CTX_wm_view3d(C);
+ ARegion *ar = CTX_wm_region(C);
+ const wmEvent *event = win->eventstate;
+ float plane_co[3], plane_no[3];
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_axis_co, plane_co);
+ RNA_property_float_get_array(op->ptr, ggd->data.prop_axis_no, plane_no);
+
+ gizmo_mesh_spin_redo_update_orient_axis(ggd, plane_no);
+
+ /* Use cursor as fallback if it's not set by the 'ortho_axis_active'. */
+ if (is_zero_v3(ggd->data.orient_axis_relative)) {
+ float cursor_co[3];
+ const int mval[2] = {event->x - ar->winrct.xmin, event->y - ar->winrct.ymin};
+ float plane[4];
+ plane_from_point_normal_v3(plane, plane_co, plane_no);
+ if (UNLIKELY(!ED_view3d_win_to_3d_on_plane_int(ar, plane, mval, false, cursor_co))) {
+ ED_view3d_win_to_3d_int(v3d, ar, plane, mval, cursor_co);
+ }
+ sub_v3_v3v3(ggd->data.orient_axis_relative, cursor_co, plane_co);
+ }
+
+ if (!is_zero_v3(ggd->data.orient_axis_relative)) {
+ normalize_v3(ggd->data.orient_axis_relative);
+ float imat3[3][3];
+ invert_m3_m3(imat3, ggd->data.orient_mat);
+ mul_m3_v3(imat3, ggd->data.orient_axis_relative);
+ }
+ }
+#endif
+
+ gizmo_mesh_spin_redo_update_from_op(ggd);
+
+ /* Setup property callbacks */
+ {
+ WM_gizmo_target_property_def_func(
+ ggd->translate_c, "offset",
+ &(const struct wmGizmoPropertyFnParams) {
+ .value_get_fn = gizmo_spin_prop_translate_get,
+ .value_set_fn = gizmo_spin_prop_translate_set,
+ .range_get_fn = NULL,
+ .user_data = NULL,
+ });
+
+ WM_gizmo_target_property_def_func(
+ ggd->rotate_view, "offset",
+ &(const struct wmGizmoPropertyFnParams) {
+ .value_get_fn = gizmo_spin_prop_axis_angle_get,
+ .value_set_fn = gizmo_spin_prop_axis_angle_set,
+ .range_get_fn = NULL,
+ .user_data = NULL,
+ });
+
+ for (int i = 0; i < 2; i++) {
+ WM_gizmo_target_property_def_func(
+ ggd->rotate_xy[i], "offset",
+ &(const struct wmGizmoPropertyFnParams) {
+ .value_get_fn = gizmo_spin_prop_axis_angle_get,
+ .value_set_fn = gizmo_spin_prop_axis_angle_set,
+ .range_get_fn = NULL,
+ .user_data = NULL,
+ });
+ WM_gizmo_target_property_def_func(
+ ggd->translate_xy[i], "offset",
+ &(const struct wmGizmoPropertyFnParams) {
+ .value_get_fn = gizmo_spin_prop_depth_get,
+ .value_set_fn = gizmo_spin_prop_depth_set,
+ .range_get_fn = NULL,
+ .user_data = NULL,
+ });
+ }
+
+ WM_gizmo_target_property_def_func(
+ ggd->angle_z, "offset",
+ &(const struct wmGizmoPropertyFnParams) {
+ .value_get_fn = gizmo_spin_prop_angle_get,
+ .value_set_fn = gizmo_spin_prop_angle_set,
+ .range_get_fn = NULL,
+ .user_data = NULL,
+ });
+ }
+
+ /* Become modal as soon as it's started. */
+ gizmo_mesh_spin_redo_modal_from_setup(C, gzgroup);
+}
+
+static void gizmo_mesh_spin_redo_draw_prepare(
+ const bContext *UNUSED(C), wmGizmoGroup *gzgroup)
+{
+ GizmoGroupData_SpinRedo *ggd = gzgroup->customdata;
+ if (ggd->data.op->next) {
+ ggd->data.op = WM_operator_last_redo((bContext *)ggd->data.context);
+ }
+
+ /* Not essential, just avoids feedback loop where matrices could shift because of float precision.
+ * Updates in this case are also redundant. */
+ bool is_modal = false;
+ for (wmGizmo *gz = gzgroup->gizmos.first; gz; gz = gz->next) {
+ if (gz->state & WM_GIZMO_STATE_MODAL) {
+ is_modal = true;
+ break;
+ }
+ }
+ if (!is_modal) {
+ gizmo_mesh_spin_redo_update_from_op(ggd);
+ }
+
+ RegionView3D *rv3d = ED_view3d_context_rv3d(ggd->data.context);
+ WM_gizmo_set_matrix_rotation_from_z_axis(ggd->translate_c, rv3d->viewinv[2]);
+ {
+ float view_up[3];
+ project_plane_normalized_v3_v3v3(view_up, ggd->data.orient_mat[2], rv3d->viewinv[2]);
+ if (normalize_v3(view_up) != 0.0f) {
+ WM_gizmo_set_matrix_rotation_from_yz_axis(ggd->rotate_view, view_up, rv3d->viewinv[2]);
+ }
+ else {
+ WM_gizmo_set_matrix_rotation_from_z_axis(ggd->rotate_view, rv3d->viewinv[2]);
+ }
+ }
+}
+
+void MESH_GGT_spin_redo(struct wmGizmoGroupType *gzgt)
+{
+ gzgt->name = "Mesh Spin Redo";
+ gzgt->idname = "MESH_GGT_spin_redo";
+
+ gzgt->flag = WM_GIZMOGROUPTYPE_3D;
+
+ gzgt->gzmap_params.spaceid = SPACE_VIEW3D;
+ gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
+
+ gzgt->poll = gizmo_mesh_spin_redo_poll;
+ gzgt->setup = gizmo_mesh_spin_redo_setup;
+ gzgt->draw_prepare = gizmo_mesh_spin_redo_draw_prepare;
+}
+
+/** \} */
diff --git a/source/blender/editors/mesh/editmesh_intersect.c b/source/blender/editors/mesh/editmesh_intersect.c
index 9af700aa6bf..044e1b8c9d0 100644
--- a/source/blender/editors/mesh/editmesh_intersect.c
+++ b/source/blender/editors/mesh/editmesh_intersect.c
@@ -707,7 +707,7 @@ static int edbm_face_split_by_edges_exec(bContext *C, wmOperator *UNUSED(op))
}
}
- /* edge index is set to -1 then used to assosiate them with faces */
+ /* edge index is set to -1 then used to associate them with faces */
BM_ITER_MESH(e, &iter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(e, BM_ELEM_SELECT) && BM_edge_is_wire(e)) {
BM_elem_flag_enable(e, hflag);
diff --git a/source/blender/editors/mesh/editmesh_knife.c b/source/blender/editors/mesh/editmesh_knife.c
index c98aef74ae7..2e442d97fad 100644
--- a/source/blender/editors/mesh/editmesh_knife.c
+++ b/source/blender/editors/mesh/editmesh_knife.c
@@ -482,7 +482,7 @@ static KnifeEdge *get_bm_knife_edge(KnifeTool_OpData *kcd, BMEdge *e)
/* Record the index in kcd->em->looptris of first looptri triple for a given face,
* given an index for some triple in that array.
* This assumes that all of the triangles for a given face are contiguous
- * in that array (as they are by the current tesselation routines).
+ * in that array (as they are by the current tessellation routines).
* Actually store index + 1 in the hash, because 0 looks like "no entry"
* to hash lookup routine; will reverse this in the get routine.
* Doing this lazily rather than all at once for all faces.
@@ -505,7 +505,7 @@ static void set_lowest_face_tri(KnifeTool_OpData *kcd, BMFace *f, int index)
if (i == -1)
i++;
- BLI_ghash_insert(kcd->facetrimap, f, SET_INT_IN_POINTER(i + 1));
+ BLI_ghash_insert(kcd->facetrimap, f, POINTER_FROM_INT(i + 1));
}
/* This should only be called for faces that have had a lowest face tri set by previous function */
@@ -513,7 +513,7 @@ static int get_lowest_face_tri(KnifeTool_OpData *kcd, BMFace *f)
{
int ans;
- ans = GET_INT_FROM_POINTER(BLI_ghash_lookup(kcd->facetrimap, f));
+ ans = POINTER_AS_INT(BLI_ghash_lookup(kcd->facetrimap, f));
BLI_assert(ans != 0);
return ans - 1;
}
@@ -1250,7 +1250,7 @@ static bool knife_ray_intersect_face(
lv2 = kcd->cagecos[BM_elem_index_get(tri[1]->v)];
lv3 = kcd->cagecos[BM_elem_index_get(tri[2]->v)];
/* using epsilon test in case ray is directly through an internal
- * tesselation edge and might not hit either tesselation tri with
+ * tessellation edge and might not hit either tessellation tri with
* an exact test;
* we will exclude hits near real edges by a later test */
if (isect_ray_tri_epsilon_v3(v1, raydir, lv1, lv2, lv3, &lambda, ray_tri_uv, KNIFE_FLT_EPS)) {
@@ -1572,8 +1572,8 @@ static void knife_find_line_hits(KnifeTool_OpData *kcd)
}
/* unproject screen line */
- ED_view3d_win_to_segment(kcd->vc.depsgraph, kcd->ar, kcd->vc.v3d, s1, v1, v3, true);
- ED_view3d_win_to_segment(kcd->vc.depsgraph, kcd->ar, kcd->vc.v3d, s2, v2, v4, true);
+ ED_view3d_win_to_segment_clipped(kcd->vc.depsgraph, kcd->ar, kcd->vc.v3d, s1, v1, v3, true);
+ ED_view3d_win_to_segment_clipped(kcd->vc.depsgraph, kcd->ar, kcd->vc.v3d, s2, v2, v4, true);
mul_m4_v3(kcd->ob->imat, v1);
mul_m4_v3(kcd->ob->imat, v2);
@@ -1581,7 +1581,7 @@ static void knife_find_line_hits(KnifeTool_OpData *kcd)
mul_m4_v3(kcd->ob->imat, v4);
/* numeric error, 'v1' -> 'v2', 'v2' -> 'v4' can end up being ~2000 units apart in otho mode
- * (from ED_view3d_win_to_segment_clip() above)
+ * (from ED_view3d_win_to_segment_clipped() above)
* this gives precision error; rather then solving properly
* (which may involve using doubles everywhere!),
* limit the distance between these points */
@@ -2220,7 +2220,7 @@ static int knife_update_active(KnifeTool_OpData *kcd)
/* if no hits are found this would normally default to (0, 0, 0) so instead
* get a point at the mouse ray closest to the previous point.
* Note that drawing lines in `free-space` isn't properly supported
- * but theres no guarantee (0, 0, 0) has any geometry either - campbell */
+ * but there's no guarantee (0, 0, 0) has any geometry either - campbell */
if (kcd->curr.vert == NULL && kcd->curr.edge == NULL && kcd->curr.bmface == NULL) {
float origin[3];
float origin_ofs[3];
@@ -2761,30 +2761,6 @@ wmKeyMap *knifetool_modal_keymap(wmKeyConfig *keyconf)
keymap = WM_modalkeymap_add(keyconf, "Knife Tool Modal Map", modal_items);
- /* items for modal map */
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, KNF_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_ANY, KM_ANY, 0, KNF_MODAL_PANNING);
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_DBL_CLICK, KM_ANY, 0, KNF_MODAL_ADD_CUT_CLOSED);
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_ANY, KM_ANY, 0, KNF_MODAL_ADD_CUT);
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_PRESS, KM_ANY, 0, KNF_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, KNF_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, KNF_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, SPACEKEY, KM_PRESS, KM_ANY, 0, KNF_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, EKEY, KM_PRESS, 0, 0, KNF_MODAL_NEW_CUT);
-
- WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, KNF_MODAL_MIDPOINT_ON);
- WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, KNF_MODAL_MIDPOINT_OFF);
- WM_modalkeymap_add_item(keymap, RIGHTCTRLKEY, KM_PRESS, KM_ANY, 0, KNF_MODAL_MIDPOINT_ON);
- WM_modalkeymap_add_item(keymap, RIGHTCTRLKEY, KM_RELEASE, KM_ANY, 0, KNF_MODAL_MIDPOINT_OFF);
-
- WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, KNF_MODEL_IGNORE_SNAP_ON);
- WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_RELEASE, KM_ANY, 0, KNF_MODEL_IGNORE_SNAP_OFF);
- WM_modalkeymap_add_item(keymap, RIGHTSHIFTKEY, KM_PRESS, KM_ANY, 0, KNF_MODEL_IGNORE_SNAP_ON);
- WM_modalkeymap_add_item(keymap, RIGHTSHIFTKEY, KM_RELEASE, KM_ANY, 0, KNF_MODEL_IGNORE_SNAP_OFF);
-
- WM_modalkeymap_add_item(keymap, CKEY, KM_PRESS, 0, 0, KNF_MODAL_ANGLE_SNAP_TOGGLE);
- WM_modalkeymap_add_item(keymap, ZKEY, KM_PRESS, 0, 0, KNF_MODAL_CUT_THROUGH_TOGGLE);
-
WM_modalkeymap_assign(keymap, "MESH_OT_knife_tool");
return keymap;
diff --git a/source/blender/editors/mesh/editmesh_knife_project.c b/source/blender/editors/mesh/editmesh_knife_project.c
index 5ccbcf063ad..da8b8d217d7 100644
--- a/source/blender/editors/mesh/editmesh_knife_project.c
+++ b/source/blender/editors/mesh/editmesh_knife_project.c
@@ -66,7 +66,7 @@ static LinkNode *knifeproject_poly_from_object(const bContext *C, Scene *scene,
struct Mesh *me_eval;
bool me_eval_needs_free;
- if (ob->type == OB_MESH || ob->derivedFinal) {
+ if (ob->type == OB_MESH || ob->runtime.mesh_eval) {
me_eval = (ob->runtime.mesh_eval ?
ob->runtime.mesh_eval : mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_BAREMESH));
me_eval_needs_free = false;
diff --git a/source/blender/editors/mesh/editmesh_loopcut.c b/source/blender/editors/mesh/editmesh_loopcut.c
index f239ccc5be1..b69609a9fa8 100644
--- a/source/blender/editors/mesh/editmesh_loopcut.c
+++ b/source/blender/editors/mesh/editmesh_loopcut.c
@@ -44,7 +44,6 @@
#include "BKE_modifier.h"
#include "BKE_report.h"
#include "BKE_editmesh.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_unit.h"
#include "BKE_layer.h"
@@ -455,7 +454,7 @@ static int ringcut_invoke(bContext *C, wmOperator *op, const wmEvent *event)
ARegion *ar = CTX_wm_region(C);
wmGizmoMap *gzmap = ar->gizmo_map;
wmGizmoGroup *gzgroup = gzmap ? WM_gizmomap_group_find(gzmap, "VIEW3D_GGT_mesh_preselect_edgering") : NULL;
- if (gzgroup != NULL) {
+ if ((gzgroup != NULL) && gzgroup->gizmos.first) {
wmGizmo *gz = gzgroup->gizmos.first;
const int object_index = RNA_int_get(gz->ptr, "object_index");
const int edge_index = RNA_int_get(gz->ptr, "edge_index");
diff --git a/source/blender/editors/mesh/editmesh_path.c b/source/blender/editors/mesh/editmesh_path.c
index cbfb33af937..c7f82a36eed 100644
--- a/source/blender/editors/mesh/editmesh_path.c
+++ b/source/blender/editors/mesh/editmesh_path.c
@@ -48,6 +48,7 @@
#include "BKE_editmesh.h"
#include "BKE_report.h"
+#include "ED_object.h"
#include "ED_mesh.h"
#include "ED_screen.h"
#include "ED_uvedit.h"
@@ -318,7 +319,7 @@ static void edgetag_ensure_cd_flag(Mesh *me, const char edge_mode)
/* since you want to create paths with multiple selects, it doesn't have extend option */
static void mouse_mesh_shortest_path_edge(
- Scene *scene, Object *obedit, const struct PathSelectParams *op_params,
+ Scene *UNUSED(scene), Object *obedit, const struct PathSelectParams *op_params,
BMEdge *e_act, BMEdge *e_dst)
{
BMEditMesh *em = BKE_editmesh_from_object(obedit);
@@ -326,7 +327,6 @@ static void mouse_mesh_shortest_path_edge(
struct UserData user_data = {bm, obedit->data, op_params};
LinkNode *path = NULL;
- Mesh *me = obedit->data;
bool is_path_ordered = false;
edgetag_ensure_cd_flag(obedit->data, op_params->edge_mode);
@@ -414,29 +414,6 @@ static void mouse_mesh_shortest_path_edge(
}
}
- /* force drawmode for mesh */
- switch (op_params->edge_mode) {
-
- case EDGE_MODE_TAG_SEAM:
- me->drawflag |= ME_DRAWSEAMS;
- ED_uvedit_live_unwrap(scene, obedit);
- break;
- case EDGE_MODE_TAG_SHARP:
- me->drawflag |= ME_DRAWSHARP;
- break;
- case EDGE_MODE_TAG_CREASE:
- me->drawflag |= ME_DRAWCREASES;
- break;
- case EDGE_MODE_TAG_BEVEL:
- me->drawflag |= ME_DRAWBWEIGHTS;
- break;
-#ifdef WITH_FREESTYLE
- case EDGE_MODE_TAG_FREESTYLE:
- me->drawflag |= ME_DRAW_FREESTYLE_EDGE;
- break;
-#endif
- }
-
EDBM_update_generic(em, false, false);
}
@@ -634,9 +611,16 @@ static int edbm_shortest_path_pick_invoke(bContext *C, wmOperator *op, const wmE
view3d_operator_needs_opengl(C);
- if (EDBM_unified_findnearest(&vc, &basact, &eve, &eed, &efa)) {
- ED_view3d_viewcontext_init_object(&vc, basact->object);
- em = vc.em;
+ {
+ int base_index = -1;
+ uint bases_len = 0;
+ Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(vc.view_layer, &bases_len);
+ if (EDBM_unified_findnearest(&vc, bases, bases_len, &base_index, &eve, &eed, &efa)) {
+ basact = bases[base_index];
+ ED_view3d_viewcontext_init_object(&vc, basact->object);
+ em = vc.em;
+ }
+ MEM_freeN(bases);
}
/* If nothing is selected, let's select the picked vertex/edge/face. */
@@ -679,9 +663,7 @@ static int edbm_shortest_path_pick_invoke(bContext *C, wmOperator *op, const wmE
}
if (vc.view_layer->basact != basact) {
- vc.view_layer->basact = basact;
- DEG_id_tag_update(&vc.scene->id, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, vc.scene);
+ ED_object_base_activate(C, basact);
}
/* to support redo */
diff --git a/source/blender/editors/mesh/editmesh_polybuild.c b/source/blender/editors/mesh/editmesh_polybuild.c
index 9b7d460973a..bf927478187 100644
--- a/source/blender/editors/mesh/editmesh_polybuild.c
+++ b/source/blender/editors/mesh/editmesh_polybuild.c
@@ -25,6 +25,8 @@
* an experimental tool for quickly constructing/manipulating faces.
*/
+#include "MEM_guardedalloc.h"
+
#include "DNA_object_types.h"
#include "BLI_math.h"
@@ -33,10 +35,13 @@
#include "BKE_report.h"
#include "BKE_editmesh.h"
#include "BKE_mesh.h"
+#include "BKE_layer.h"
#include "WM_types.h"
+#include "ED_object.h"
#include "ED_mesh.h"
+#include "ED_scene.h"
#include "ED_screen.h"
#include "ED_transform.h"
#include "ED_view3d.h"
@@ -50,6 +55,8 @@
#include "WM_api.h"
+#include "DEG_depsgraph.h"
+
/* -------------------------------------------------------------------- */
/** \name Local Utilities
* \{ */
@@ -63,24 +70,113 @@ static void edbm_selectmode_ensure(Scene *scene, BMEditMesh *em, short selectmod
}
}
+/* Could make public, for now just keep here. */
+static void edbm_flag_disable_all_multi(ViewLayer *view_layer, const char hflag)
+{
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob_iter = objects[ob_index];
+ BMEditMesh *em_iter = BKE_editmesh_from_object(ob_iter);
+ BMesh *bm_iter = em_iter->bm;
+ if (bm_iter->totvertsel) {
+ EDBM_flag_disable_all(em_iter, hflag);
+ DEG_id_tag_update(ob_iter->data, DEG_TAG_SELECT_UPDATE);
+ }
+ }
+ MEM_freeN(objects);
+}
+
+/* When accessed as a tool, get the active edge from the preselection gizmo. */
+static bool edbm_preselect_or_active(
+ bContext *C,
+ Base **r_base,
+ BMElem **r_ele)
+{
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ ARegion *ar = CTX_wm_region(C);
+ wmGizmoMap *gzmap = ar->gizmo_map;
+ wmGizmoGroup *gzgroup = gzmap ? WM_gizmomap_group_find(gzmap, "VIEW3D_GGT_mesh_preselect_elem") : NULL;
+ if (gzgroup != NULL) {
+ wmGizmo *gz = gzgroup->gizmos.first;
+ const int object_index = RNA_int_get(gz->ptr, "object_index");
+
+ /* weak, allocate an array just to access the index. */
+ Base *base = NULL;
+ Object *obedit = NULL;
+ {
+ uint bases_len;
+ Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(view_layer, &bases_len);
+ if (object_index < bases_len) {
+ base = bases[object_index];
+ obedit = base->object;
+ }
+ MEM_freeN(bases);
+ }
+
+ *r_base = base;
+ *r_ele = NULL;
+
+ if (obedit) {
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ BMesh *bm = em->bm;
+ const int vert_index = RNA_int_get(gz->ptr, "vert_index");
+ const int edge_index = RNA_int_get(gz->ptr, "edge_index");
+ const int face_index = RNA_int_get(gz->ptr, "face_index");
+ if (vert_index != -1) {
+ *r_ele = (BMElem *)BM_vert_at_index_find(bm, vert_index);
+ }
+ else if (edge_index != -1) {
+ *r_ele = (BMElem *)BM_edge_at_index_find(bm, edge_index);
+ }
+ else if (face_index != -1) {
+ *r_ele = (BMElem *)BM_face_at_index_find(bm, face_index);
+ }
+ }
+ }
+ else {
+ Base *base = view_layer->basact;
+ Object *obedit = base->object;
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ BMesh *bm = em->bm;
+ *r_base = base;
+ *r_ele = BM_mesh_active_elem_get(bm);
+ }
+ return (*r_ele != NULL);
+}
+
+static bool edbm_preselect_or_active_init_viewcontext(
+ bContext *C,
+ ViewContext *vc,
+ Base **r_base,
+ BMElem **r_ele)
+{
+ em_setup_viewcontext(C, vc);
+ bool ok = edbm_preselect_or_active(C, r_base, r_ele);
+ if (ok) {
+ ED_view3d_viewcontext_init_object(vc, (*r_base)->object);
+ }
+ return ok;
+}
+
/** \} */
/* -------------------------------------------------------------------- */
-/** \name Face At Cursor
+/** \name Face at Cursor
* \{ */
static int edbm_polybuild_face_at_cursor_invoke(
bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
{
- ViewContext vc;
float center[3];
bool changed = false;
- em_setup_viewcontext(C, &vc);
- Object *obedit = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ ViewContext vc;
+ Base *basact = NULL;
+ BMElem *ele_act = NULL;
+ edbm_preselect_or_active_init_viewcontext(C, &vc, &basact, &ele_act);
+ BMEditMesh *em = vc.em;
BMesh *bm = em->bm;
- BMElem *ele_act = BM_mesh_active_elem_get(bm);
invert_m4_m4(vc.obedit->imat, vc.obedit->obmat);
ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d);
@@ -95,8 +191,9 @@ static int edbm_polybuild_face_at_cursor_invoke(
mul_m4_v3(vc.obedit->imat, center);
BMVert *v_new = BM_vert_create(bm, center, NULL, BM_CREATE_NOP);
- EDBM_flag_disable_all(em, BM_ELEM_SELECT);
+ edbm_flag_disable_all_multi(vc.view_layer, BM_ELEM_SELECT);
BM_vert_select_set(bm, v_new, true);
+ BM_select_history_store(bm, v_new);
changed = true;
}
else if (ele_act->head.htype == BM_EDGE) {
@@ -118,8 +215,9 @@ static int edbm_polybuild_face_at_cursor_invoke(
// BMFace *f_new =
BM_face_create_verts(bm, v_tri, 3, f_reference, BM_CREATE_NOP, true);
- EDBM_flag_disable_all(em, BM_ELEM_SELECT);
+ edbm_flag_disable_all_multi(vc.view_layer, BM_ELEM_SELECT);
BM_vert_select_set(bm, v_tri[2], true);
+ BM_select_history_store(bm, v_tri[2]);
changed = true;
}
else if (ele_act->head.htype == BM_VERT) {
@@ -169,8 +267,9 @@ static int edbm_polybuild_face_at_cursor_invoke(
// BMFace *f_new =
BM_face_create_verts(bm, v_quad, 4, f_reference, BM_CREATE_NOP, true);
- EDBM_flag_disable_all(em, BM_ELEM_SELECT);
+ edbm_flag_disable_all_multi(vc.view_layer, BM_ELEM_SELECT);
BM_vert_select_set(bm, v_quad[2], true);
+ BM_select_history_store(bm, v_quad[2]);
changed = true;
}
else {
@@ -184,15 +283,21 @@ static int edbm_polybuild_face_at_cursor_invoke(
BM_edge_create(bm, v_act, v_new, NULL, BM_CREATE_NOP);
BM_vert_select_set(bm, v_new, true);
+ BM_select_history_store(bm, v_new);
+ changed = true;
}
}
if (changed) {
- BM_select_history_clear(bm);
-
EDBM_mesh_normals_update(em);
EDBM_update_generic(em, true, true);
+ if (basact != NULL) {
+ if (vc.view_layer->basact != basact) {
+ ED_object_base_activate(C, basact);
+ }
+ }
+
WM_event_add_mousemove(C);
return OPERATOR_FINISHED;
@@ -205,7 +310,7 @@ static int edbm_polybuild_face_at_cursor_invoke(
void MESH_OT_polybuild_face_at_cursor(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Poly Build Face At Cursor";
+ ot->name = "Poly Build Face at Cursor";
ot->idname = "MESH_OT_polybuild_face_at_cursor";
ot->description = "";
@@ -223,19 +328,20 @@ void MESH_OT_polybuild_face_at_cursor(wmOperatorType *ot)
/** \} */
/* -------------------------------------------------------------------- */
-/** \name Split At Cursor
+/** \name Split at Cursor
* \{ */
static int edbm_polybuild_split_at_cursor_invoke(
bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
{
- ViewContext vc;
float center[3];
bool changed = false;
- em_setup_viewcontext(C, &vc);
- Object *obedit = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ ViewContext vc;
+ Base *basact = NULL;
+ BMElem *ele_act = NULL;
+ edbm_preselect_or_active_init_viewcontext(C, &vc, &basact, &ele_act);
+ BMEditMesh *em = vc.em;
BMesh *bm = em->bm;
invert_m4_m4(vc.obedit->imat, vc.obedit->obmat);
@@ -243,8 +349,6 @@ static int edbm_polybuild_split_at_cursor_invoke(
edbm_selectmode_ensure(vc.scene, vc.em, SCE_SELECT_VERTEX);
- BMElem *ele_act = BM_mesh_active_elem_get(bm);
-
if (ele_act == NULL || ele_act->head.hflag == BM_FACE) {
return OPERATOR_PASS_THROUGH;
}
@@ -259,8 +363,9 @@ static int edbm_polybuild_split_at_cursor_invoke(
BMVert *v_new = BM_edge_split(bm, e_act, e_act->v1, NULL, CLAMPIS(fac, 0.0f, 1.0f));
copy_v3_v3(v_new->co, center);
- EDBM_flag_disable_all(em, BM_ELEM_SELECT);
+ edbm_flag_disable_all_multi(vc.view_layer, BM_ELEM_SELECT);
BM_vert_select_set(bm, v_new, true);
+ BM_select_history_store(bm, v_new);
changed = true;
}
else if (ele_act->head.htype == BM_VERT) {
@@ -269,13 +374,15 @@ static int edbm_polybuild_split_at_cursor_invoke(
}
if (changed) {
- BM_select_history_clear(bm);
-
EDBM_mesh_normals_update(em);
EDBM_update_generic(em, true, true);
WM_event_add_mousemove(C);
+ if (vc.view_layer->basact != basact) {
+ ED_object_base_activate(C, basact);
+ }
+
return OPERATOR_FINISHED;
}
else {
@@ -286,7 +393,7 @@ static int edbm_polybuild_split_at_cursor_invoke(
void MESH_OT_polybuild_split_at_cursor(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Poly Build Split At Cursor";
+ ot->name = "Poly Build Split at Cursor";
ot->idname = "MESH_OT_polybuild_split_at_cursor";
ot->description = "";
@@ -305,30 +412,24 @@ void MESH_OT_polybuild_split_at_cursor(wmOperatorType *ot)
/* -------------------------------------------------------------------- */
-/** \name Dissolve At Cursor
+/** \name Dissolve at Cursor
*
* \{ */
static int edbm_polybuild_dissolve_at_cursor_invoke(
bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
- ViewContext vc;
- em_setup_viewcontext(C, &vc);
bool changed = false;
- Object *obedit = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ ViewContext vc;
+ Base *basact = NULL;
+ BMElem *ele_act = NULL;
+ edbm_preselect_or_active_init_viewcontext(C, &vc, &basact, &ele_act);
+ BMEditMesh *em = vc.em;
BMesh *bm = em->bm;
- BMVert *v_act = BM_mesh_active_vert_get(bm);
- BMEdge *e_act = BM_mesh_active_edge_get(bm);
-
- invert_m4_m4(vc.obedit->imat, vc.obedit->obmat);
- ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d);
- edbm_selectmode_ensure(vc.scene, vc.em, SCE_SELECT_VERTEX);
-
-
- if (e_act) {
+ if (ele_act->head.htype == BM_EDGE) {
+ BMEdge *e_act = (BMEdge *)ele_act;
BMLoop *l_a, *l_b;
if (BM_edge_loop_pair(e_act, &l_a, &l_b)) {
BMFace *f_new = BM_faces_join_pair(bm, l_a, l_b, true);
@@ -337,7 +438,8 @@ static int edbm_polybuild_dissolve_at_cursor_invoke(
}
}
}
- else if (v_act) {
+ else if (ele_act->head.htype == BM_VERT) {
+ BMVert *v_act = (BMVert *)ele_act;
if (BM_vert_is_edge_pair(v_act)) {
BM_edge_collapse(
bm, v_act->e, v_act,
@@ -345,9 +447,14 @@ static int edbm_polybuild_dissolve_at_cursor_invoke(
}
else {
/* too involved to do inline */
+
+ /* Avoid using selection so failure wont leave modified state. */
+ EDBM_flag_disable_all(em, BM_ELEM_TAG);
+ BM_elem_flag_enable(v_act, BM_ELEM_TAG);
+
if (!EDBM_op_callf(em, op,
"dissolve_verts verts=%hv use_face_split=%b use_boundary_tear=%b",
- BM_ELEM_SELECT, false, true))
+ BM_ELEM_TAG, false, false))
{
return OPERATOR_CANCELLED;
}
@@ -356,13 +463,15 @@ static int edbm_polybuild_dissolve_at_cursor_invoke(
}
if (changed) {
- EDBM_flag_disable_all(em, BM_ELEM_SELECT);
-
- BM_select_history_clear(bm);
+ edbm_flag_disable_all_multi(vc.view_layer, BM_ELEM_SELECT);
EDBM_mesh_normals_update(em);
EDBM_update_generic(em, true, true);
+ if (vc.view_layer->basact != basact) {
+ ED_object_base_activate(C, basact);
+ }
+
WM_event_add_mousemove(C);
return OPERATOR_FINISHED;
@@ -375,7 +484,7 @@ static int edbm_polybuild_dissolve_at_cursor_invoke(
void MESH_OT_polybuild_dissolve_at_cursor(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Poly Build Dissolve At Cursor";
+ ot->name = "Poly Build Dissolve at Cursor";
ot->idname = "MESH_OT_polybuild_dissolve_at_cursor";
ot->description = "";
@@ -388,155 +497,3 @@ void MESH_OT_polybuild_dissolve_at_cursor(wmOperatorType *ot)
}
/** \} */
-
-/* -------------------------------------------------------------------- */
-/** \name Cursor Gizmo
- *
- * \note This may need its own file, for now not.
- * \{ */
-
-static BMElem *edbm_hover_preselect(
- bContext *C,
- const int mval[2],
- bool use_boundary)
-{
- ViewContext vc;
-
- em_setup_viewcontext(C, &vc);
- Object *obedit = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
- BMesh *bm = em->bm;
-
- invert_m4_m4(vc.obedit->imat, vc.obedit->obmat);
- ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d);
-
- const float mval_fl[2] = {UNPACK2(mval)};
- float ray_origin[3], ray_direction[3];
-
- BMElem *ele_best = NULL;
-
- if (ED_view3d_win_to_ray(
- CTX_data_depsgraph(C),
- vc.ar, vc.v3d, mval_fl,
- ray_origin, ray_direction, true))
- {
- BMEdge *e;
-
- BMIter eiter;
- float dist_sq_best = FLT_MAX;
-
- BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
- if ((BM_elem_flag_test(e, BM_ELEM_HIDDEN) == false) &&
- (!use_boundary || BM_edge_is_boundary(e)))
- {
- float dist_sq_test;
- float point[3];
- float depth;
-#if 0
- dist_sq_test = dist_squared_ray_to_seg_v3(
- ray_origin, ray_direction,
- e->v1->co, e->v2->co,
- point, &depth);
-#else
- mid_v3_v3v3(point, e->v1->co, e->v2->co);
- dist_sq_test = dist_squared_to_ray_v3(
- ray_origin, ray_direction,
- point, &depth);
-#endif
-
- if (dist_sq_test < dist_sq_best) {
- dist_sq_best = dist_sq_test;
- ele_best = (BMElem *)e;
- }
-
- dist_sq_test = dist_squared_to_ray_v3(
- ray_origin, ray_direction,
- e->v1->co, &depth);
- if (dist_sq_test < dist_sq_best) {
- dist_sq_best = dist_sq_test;
- ele_best = (BMElem *)e->v1;
- }
- dist_sq_test = dist_squared_to_ray_v3(
- ray_origin, ray_direction,
- e->v2->co, &depth);
- if (dist_sq_test < dist_sq_best) {
- dist_sq_best = dist_sq_test;
- ele_best = (BMElem *)e->v2;
- }
- }
- }
- }
- return ele_best;
-}
-
-/*
- * Developer note: this is not advocating pre-selection highlighting.
- * This is just a quick way to test how a tool for interactively editing polygons may work. */
-static int edbm_polybuild_hover_invoke(
- bContext *C, wmOperator *op, const wmEvent *event)
-{
- const bool use_boundary = RNA_boolean_get(op->ptr, "use_boundary");
- ViewContext vc;
-
- em_setup_viewcontext(C, &vc);
-
- /* Vertex selection is needed */
- if ((vc.scene->toolsettings->selectmode & SCE_SELECT_VERTEX) == 0) {
- return OPERATOR_PASS_THROUGH;
- }
-
- /* Don't overwrite click-drag events. */
- if (use_boundary == false) {
- /* pass */
- }
- else if (vc.win->tweak ||
- (vc.win->eventstate->check_click &&
- vc.win->eventstate->prevval == KM_PRESS &&
- ISMOUSE(vc.win->eventstate->prevtype)))
- {
- return OPERATOR_PASS_THROUGH;
- }
-
- Object *obedit = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
- BMesh *bm = em->bm;
- BMElem *ele_active = BM_mesh_active_elem_get(bm);
- BMElem *ele_hover = edbm_hover_preselect(C, event->mval, use_boundary);
-
- if (ele_hover && (ele_hover != ele_active)) {
- if (event->shift == 0) {
- EDBM_flag_disable_all(em, BM_ELEM_SELECT);
- BM_select_history_clear(bm);
- }
- BM_elem_select_set(bm, ele_hover, true);
- BM_select_history_store(em->bm, ele_hover);
- BKE_mesh_batch_cache_dirty_tag(obedit->data, BKE_MESH_BATCH_DIRTY_SELECT);
-
- ED_region_tag_redraw(vc.ar);
-
- return OPERATOR_FINISHED;
- }
- else {
- return OPERATOR_CANCELLED;
- }
-}
-
-void MESH_OT_polybuild_hover(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name = "Poly Build Hover";
- ot->idname = "MESH_OT_polybuild_hover";
- ot->description = "";
-
- /* api callbacks */
- ot->invoke = edbm_polybuild_hover_invoke;
- ot->poll = EDBM_view3d_poll;
-
- /* flags */
- ot->flag = OPTYPE_INTERNAL;
-
- /* properties */
- RNA_def_boolean(ot->srna, "use_boundary", false, "Boundary", "Select only boundary geometry");
-}
-
-/** \} */
diff --git a/source/blender/editors/mesh/editmesh_preselect.c b/source/blender/editors/mesh/editmesh_preselect_edgering.c
index 97a866ba9fa..ce62998a133 100644
--- a/source/blender/editors/mesh/editmesh_preselect.c
+++ b/source/blender/editors/mesh/editmesh_preselect_edgering.c
@@ -18,7 +18,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/editors/mesh/editmesh_preselect.c
+/** \file blender/editors/mesh/editmesh_preselect_edgering.c
* \ingroup edmesh
*/
diff --git a/source/blender/editors/mesh/editmesh_preselect_elem.c b/source/blender/editors/mesh/editmesh_preselect_elem.c
new file mode 100644
index 00000000000..e0b06019de1
--- /dev/null
+++ b/source/blender/editors/mesh/editmesh_preselect_elem.c
@@ -0,0 +1,218 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/mesh/editmesh_preselect_elem.c
+ * \ingroup edmesh
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_stack.h"
+#include "BLI_math.h"
+
+#include "BKE_context.h"
+#include "BKE_editmesh.h"
+
+#include "GPU_immediate.h"
+#include "GPU_matrix.h"
+#include "GPU_state.h"
+
+#include "DNA_object_types.h"
+
+#include "ED_mesh.h"
+#include "ED_view3d.h"
+
+/* -------------------------------------------------------------------- */
+/** \name Mesh Element Pre-Select
+ * Public API:
+ *
+ * #EDBM_preselect_elem_create
+ * #EDBM_preselect_elem_destroy
+ * #EDBM_preselect_elem_clear
+ * #EDBM_preselect_elem_draw
+ * #EDBM_preselect_elem_update_from_single
+ *
+ * \{ */
+
+static void vcos_get(BMVert *v, float r_co[3], const float (*coords)[3])
+{
+ if (coords) {
+ copy_v3_v3(r_co, coords[BM_elem_index_get(v)]);
+ }
+ else {
+ copy_v3_v3(r_co, v->co);
+ }
+}
+
+static void vcos_get_pair(BMVert *v[2], float r_cos[2][3], const float (*coords)[3])
+{
+ if (coords) {
+ for (int j = 0; j < 2; j++) {
+ copy_v3_v3(r_cos[j], coords[BM_elem_index_get(v[j])]);
+ }
+ }
+ else {
+ for (int j = 0; j < 2; j++) {
+ copy_v3_v3(r_cos[j], v[j]->co);
+ }
+ }
+}
+
+struct EditMesh_PreSelElem {
+ float (*edges)[2][3];
+ int edges_len;
+
+ float (*verts)[3];
+ int verts_len;
+};
+
+struct EditMesh_PreSelElem *EDBM_preselect_elem_create(void)
+{
+ struct EditMesh_PreSelElem *psel = MEM_callocN(sizeof(*psel), __func__);
+ return psel;
+}
+
+void EDBM_preselect_elem_destroy(
+ struct EditMesh_PreSelElem *psel)
+{
+ EDBM_preselect_elem_clear(psel);
+ MEM_freeN(psel);
+}
+
+void EDBM_preselect_elem_clear(
+ struct EditMesh_PreSelElem *psel)
+{
+ MEM_SAFE_FREE(psel->edges);
+ psel->edges_len = 0;
+
+ MEM_SAFE_FREE(psel->verts);
+ psel->verts_len = 0;
+}
+
+void EDBM_preselect_elem_draw(
+ struct EditMesh_PreSelElem *psel, const float matrix[4][4])
+{
+ if ((psel->edges_len == 0) && (psel->verts_len == 0)) {
+ return;
+ }
+
+ GPU_depth_test(false);
+
+ GPU_matrix_push();
+ GPU_matrix_mul(matrix);
+
+ uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+
+ immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
+ immUniformColor3ub(255, 0, 255);
+
+ if (psel->edges_len > 0) {
+ immBegin(GPU_PRIM_LINES, psel->edges_len * 2);
+
+ for (int i = 0; i < psel->edges_len; i++) {
+ immVertex3fv(pos, psel->edges[i][0]);
+ immVertex3fv(pos, psel->edges[i][1]);
+ }
+
+ immEnd();
+ }
+
+ if (psel->verts_len > 0) {
+ GPU_point_size(3.0f);
+
+ immBegin(GPU_PRIM_POINTS, psel->verts_len);
+
+ for (int i = 0; i < psel->verts_len; i++) {
+ immVertex3fv(pos, psel->verts[i]);
+ }
+
+ immEnd();
+ }
+
+ immUnbindProgram();
+
+ GPU_matrix_pop();
+
+ /* Reset default */
+ GPU_depth_test(true);
+}
+
+static void view3d_preselect_mesh_elem_update_from_vert(
+ struct EditMesh_PreSelElem *psel,
+ BMesh *UNUSED(bm), BMVert *eve, const float (*coords)[3])
+{
+ float (*verts)[3] = MEM_mallocN(sizeof(*psel->verts), __func__);
+ vcos_get(eve, verts[0], coords);
+ psel->verts = verts;
+ psel->verts_len = 1;
+}
+
+static void view3d_preselect_mesh_elem_update_from_edge(
+ struct EditMesh_PreSelElem *psel,
+ BMesh *UNUSED(bm), BMEdge *eed, const float (*coords)[3])
+{
+ float (*edges)[2][3] = MEM_mallocN(sizeof(*psel->edges), __func__);
+ vcos_get_pair(&eed->v1, edges[0], coords);
+ psel->edges = edges;
+ psel->edges_len = 1;
+}
+
+static void view3d_preselect_mesh_elem_update_from_face(
+ struct EditMesh_PreSelElem *psel,
+ BMesh *UNUSED(bm), BMFace *efa, const float (*coords)[3])
+{
+ float (*edges)[2][3] = MEM_mallocN(sizeof(*psel->edges) * efa->len, __func__);
+ BMLoop *l_iter, *l_first;
+ l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
+ int i = 0;
+ do {
+ vcos_get_pair(&l_iter->e->v1, edges[i++], coords);
+ } while ((l_iter = l_iter->next) != l_first);
+ psel->edges = edges;
+ psel->edges_len = efa->len;
+}
+
+void EDBM_preselect_elem_update_from_single(
+ struct EditMesh_PreSelElem *psel,
+ BMesh *bm, BMElem *ele,
+ const float (*coords)[3])
+{
+ EDBM_preselect_elem_clear(psel);
+
+ if (coords) {
+ BM_mesh_elem_index_ensure(bm, BM_VERT);
+ }
+
+ switch (ele->head.htype) {
+ case BM_VERT:
+ view3d_preselect_mesh_elem_update_from_vert(psel, bm, (BMVert *)ele, coords);
+ break;
+ case BM_EDGE:
+ view3d_preselect_mesh_elem_update_from_edge(psel, bm, (BMEdge *)ele, coords);
+ break;
+ case BM_FACE:
+ view3d_preselect_mesh_elem_update_from_face(psel, bm, (BMFace *)ele, coords);
+ break;
+ default:
+ BLI_assert(0);
+ }
+}
+
+/** \} */
diff --git a/source/blender/editors/mesh/editmesh_rip.c b/source/blender/editors/mesh/editmesh_rip.c
index 23011f835c1..9d6c0267cc2 100644
--- a/source/blender/editors/mesh/editmesh_rip.c
+++ b/source/blender/editors/mesh/editmesh_rip.c
@@ -1016,7 +1016,7 @@ static int edbm_rip_invoke(bContext *C, wmOperator *op, const wmEvent *event)
bool no_vertex_selected = true;
bool error_face_selected = true;
- bool error_disconected_vertices = true;
+ bool error_disconnected_vertices = true;
bool error_rip_failed = true;
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
@@ -1037,7 +1037,7 @@ static int edbm_rip_invoke(bContext *C, wmOperator *op, const wmEvent *event)
/* running in face mode hardly makes sense, so convert to region loop and rip */
if (bm->totfacesel) {
/* highly nifty but hard to support since the operator can fail and we're left
- * with modified selection */
+ * with modified selection */
// WM_operator_name_call(C, "MESH_OT_region_to_loop", WM_OP_INVOKE_DEFAULT, NULL);
continue;
}
@@ -1047,17 +1047,17 @@ static int edbm_rip_invoke(bContext *C, wmOperator *op, const wmEvent *event)
if ((bm->totvertsel > 1) && (bm->totedgesel == 0)) {
continue;
}
- error_disconected_vertices = false;
+ error_disconnected_vertices = false;
/* note on selection:
- * When calling edge split we operate on tagged edges rather then selected
- * this is important because the edges to operate on are extended by one,
- * but the selection is left alone.
- *
- * After calling edge split - the duplicated edges have the same selection state as the
- * original, so all we do is de-select the far side from the mouse and we have a
- * useful selection for grabbing.
- */
+ * When calling edge split we operate on tagged edges rather then selected
+ * this is important because the edges to operate on are extended by one,
+ * but the selection is left alone.
+ *
+ * After calling edge split - the duplicated edges have the same selection state as the
+ * original, so all we do is de-select the far side from the mouse and we have a
+ * useful selection for grabbing.
+ */
/* BM_ELEM_SELECT --> BM_ELEM_TAG */
BM_ITER_MESH(e, &iter, bm, BM_EDGES_OF_MESH) {
@@ -1096,7 +1096,7 @@ static int edbm_rip_invoke(bContext *C, wmOperator *op, const wmEvent *event)
BKE_report(op->reports, RPT_ERROR, "Cannot rip selected faces");
return OPERATOR_CANCELLED;
}
- else if (error_disconected_vertices) {
+ else if (error_disconnected_vertices) {
BKE_report(op->reports, RPT_ERROR, "Cannot rip multiple disconnected vertices");
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/mesh/editmesh_rip_edge.c b/source/blender/editors/mesh/editmesh_rip_edge.c
index 33dc252ab14..c4a1ee9134d 100644
--- a/source/blender/editors/mesh/editmesh_rip_edge.c
+++ b/source/blender/editors/mesh/editmesh_rip_edge.c
@@ -99,7 +99,7 @@ static int edbm_rip_edge_invoke(bContext *C, wmOperator *UNUSED(op), const wmEve
/* not essential, but gives more expected results with edge selection */
if (bm->totedgesel) {
/* angle against center can give odd result,
- * try re-position the center to the closest edge */
+ * try re-position the center to the closest edge */
BMIter eiter;
BMEdge *e;
float dist_sq_best = len_squared_v2v2(cent_sco, mval_fl);
diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c
index 280b8f91151..1a32a36bdb4 100644
--- a/source/blender/editors/mesh/editmesh_select.c
+++ b/source/blender/editors/mesh/editmesh_select.c
@@ -57,6 +57,7 @@
#include "RNA_define.h"
#include "RNA_enum_types.h"
+#include "ED_object.h"
#include "ED_mesh.h"
#include "ED_screen.h"
#include "ED_transform.h"
@@ -205,7 +206,7 @@ void EDBM_automerge(Scene *scene, Object *obedit, bool update, const char hflag)
unsigned int bm_solidoffs = 0, bm_wireoffs = 0, bm_vertoffs = 0; /* set in drawobject.c ... for colorindices */
-/* facilities for border select and circle select */
+/* facilities for box select and circle select */
static BLI_bitmap *selbuf = NULL;
static BLI_bitmap *edbm_backbuf_alloc(const int size)
@@ -939,8 +940,8 @@ BMFace *EDBM_face_find_nearest(ViewContext *vc, float *r_dist)
* return 1 if found one
*/
static bool unified_findnearest(
- ViewContext *vc,
- Base **r_base, BMVert **r_eve, BMEdge **r_eed, BMFace **r_efa)
+ ViewContext *vc, Base **bases, const uint bases_len,
+ int *r_base_index, BMVert **r_eve, BMEdge **r_eed, BMFace **r_efa)
{
BMEditMesh *em = vc->em;
static short mval_prev[2] = {-1, -1};
@@ -954,22 +955,20 @@ static bool unified_findnearest(
struct {
struct {
BMVert *ele;
- Base *base;
+ int base_index;
} v;
struct {
BMEdge *ele;
- Base *base;
+ int base_index;
} e, e_zbuf;
struct {
BMFace *ele;
- Base *base;
+ int base_index;
} f, f_zbuf;
} hit = {{NULL}};
/* TODO(campbell): perform selection as one pass
* instead of many smaller passes (which doesn't work for zbuf occlusion). */
- uint bases_len = 0;
- Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(vc->view_layer, &bases_len);
/* no afterqueue (yet), so we check it now, otherwise the em_xxxofs indices are bad */
@@ -981,6 +980,7 @@ static bool unified_findnearest(
Base *base_iter = bases[base_index];
Object *obedit = base_iter->object;
ED_view3d_viewcontext_init_object(vc, obedit);
+ BLI_assert(vc->em->selectmode == em->selectmode);
ED_view3d_backbuf_validate(vc);
BMFace *efa_zbuf = NULL;
BMFace *efa_test = EDBM_face_find_nearest_ex(vc, &dist, dist_center_p, true, use_cycle, &efa_zbuf);
@@ -988,11 +988,11 @@ static bool unified_findnearest(
dist = min_ff(dist_margin, dist_center);
}
if (efa_test) {
- hit.f.base = base_iter;
+ hit.f.base_index = base_index;
hit.f.ele = efa_test;
}
if (efa_zbuf) {
- hit.f_zbuf.base = base_iter;
+ hit.f_zbuf.base_index = base_index;
hit.f_zbuf.ele = efa_zbuf;
}
} /* bases */
@@ -1013,11 +1013,11 @@ static bool unified_findnearest(
dist = min_ff(dist_margin, dist_center);
}
if (eed_test) {
- hit.e.base = base_iter;
+ hit.e.base_index = base_index;
hit.e.ele = eed_test;
}
if (eed_zbuf) {
- hit.e_zbuf.base = base_iter;
+ hit.e_zbuf.base_index = base_index;
hit.e_zbuf.ele = eed_zbuf;
}
} /* bases */
@@ -1031,14 +1031,12 @@ static bool unified_findnearest(
ED_view3d_backbuf_validate(vc);
BMVert *eve_test = EDBM_vert_find_nearest_ex(vc, &dist, true, use_cycle);
if (eve_test) {
- hit.v.base = base_iter;
+ hit.v.base_index = base_index;
hit.v.ele = eve_test;
}
} /* bases */
}
- MEM_SAFE_FREE(bases);
-
/* return only one of 3 pointers, for frontbuffer redraws */
if (hit.v.ele) {
hit.f.ele = NULL;
@@ -1052,11 +1050,11 @@ static bool unified_findnearest(
* use this if all else fails, it makes sense to select this */
if ((hit.v.ele || hit.e.ele || hit.f.ele) == 0) {
if (hit.e_zbuf.ele) {
- hit.e.base = hit.e_zbuf.base;
+ hit.e.base_index = hit.e_zbuf.base_index;
hit.e.ele = hit.e_zbuf.ele;
}
else if (hit.f_zbuf.ele) {
- hit.f.base = hit.f_zbuf.base;
+ hit.f.base_index = hit.f_zbuf.base_index;
hit.f.ele = hit.f_zbuf.ele;
}
}
@@ -1068,13 +1066,13 @@ static bool unified_findnearest(
BLI_assert(((hit.v.ele != NULL) + (hit.e.ele != NULL) + (hit.f.ele != NULL)) <= 1);
if (hit.v.ele) {
- *r_base = hit.v.base;
+ *r_base_index = hit.v.base_index;
}
if (hit.e.ele) {
- *r_base = hit.e.base;
+ *r_base_index = hit.e.base_index;
}
if (hit.f.ele) {
- *r_base = hit.f.base;
+ *r_base_index = hit.f.base_index;
}
*r_eve = hit.v.ele;
@@ -1088,270 +1086,230 @@ static bool unified_findnearest(
#undef FAKE_SELECT_MODE_END
bool EDBM_unified_findnearest(
- ViewContext *vc,
- Base **r_base, BMVert **r_eve, BMEdge **r_eed, BMFace **r_efa)
+ ViewContext *vc, Base **bases, const uint bases_len,
+ int *r_base_index, BMVert **r_eve, BMEdge **r_eed, BMFace **r_efa)
{
- return unified_findnearest(vc, r_base, r_eve, r_eed, r_efa);
+ return unified_findnearest(vc, bases, bases_len, r_base_index, r_eve, r_eed, r_efa);
}
/** \} */
/* -------------------------------------------------------------------- */
-/** \name Select Similar (Vert/Edge/Face) Operator
+/** \name Alternate Find Nearest Vert/Edge (optional boundary)
+ *
+ * \note This uses ray-cast method instead of backbuffer,
+ * currently used for poly-build.
* \{ */
-static const EnumPropertyItem prop_similar_compare_types[] = {
- {SIM_CMP_EQ, "EQUAL", 0, "Equal", ""},
- {SIM_CMP_GT, "GREATER", 0, "Greater", ""},
- {SIM_CMP_LT, "LESS", 0, "Less", ""},
-
- {0, NULL, 0, NULL, NULL}
-};
-
-static const EnumPropertyItem prop_similar_types[] = {
- {SIMVERT_NORMAL, "NORMAL", 0, "Normal", ""},
- {SIMVERT_FACE, "FACE", 0, "Amount of Adjacent Faces", ""},
- {SIMVERT_VGROUP, "VGROUP", 0, "Vertex Groups", ""},
- {SIMVERT_EDGE, "EDGE", 0, "Amount of connecting edges", ""},
-
- {SIMEDGE_LENGTH, "LENGTH", 0, "Length", ""},
- {SIMEDGE_DIR, "DIR", 0, "Direction", ""},
- {SIMEDGE_FACE, "FACE", 0, "Amount of Faces Around an Edge", ""},
- {SIMEDGE_FACE_ANGLE, "FACE_ANGLE", 0, "Face Angles", ""},
- {SIMEDGE_CREASE, "CREASE", 0, "Crease", ""},
- {SIMEDGE_BEVEL, "BEVEL", 0, "Bevel", ""},
- {SIMEDGE_SEAM, "SEAM", 0, "Seam", ""},
- {SIMEDGE_SHARP, "SHARP", 0, "Sharpness", ""},
-#ifdef WITH_FREESTYLE
- {SIMEDGE_FREESTYLE, "FREESTYLE_EDGE", 0, "Freestyle Edge Marks", ""},
-#endif
-
- {SIMFACE_MATERIAL, "MATERIAL", 0, "Material", ""},
- {SIMFACE_AREA, "AREA", 0, "Area", ""},
- {SIMFACE_SIDES, "SIDES", 0, "Polygon Sides", ""},
- {SIMFACE_PERIMETER, "PERIMETER", 0, "Perimeter", ""},
- {SIMFACE_NORMAL, "NORMAL", 0, "Normal", ""},
- {SIMFACE_COPLANAR, "COPLANAR", 0, "Co-planar", ""},
- {SIMFACE_SMOOTH, "SMOOTH", 0, "Flat/Smooth", ""},
- {SIMFACE_FACEMAP, "FACE_MAP", 0, "Face-Map", ""},
-#ifdef WITH_FREESTYLE
- {SIMFACE_FREESTYLE, "FREESTYLE_FACE", 0, "Freestyle Face Marks", ""},
-#endif
-
- {0, NULL, 0, NULL, NULL}
-};
-
-/* selects new faces/edges/verts based on the existing selection */
-
-static int similar_face_select_exec(bContext *C, wmOperator *op)
+bool EDBM_unified_findnearest_from_raycast(
+ ViewContext *vc,
+ Base **bases, const uint bases_len,
+ bool use_boundary,
+ int *r_base_index,
+ struct BMVert **r_eve,
+ struct BMEdge **r_eed,
+ struct BMFace **r_efa)
{
- Object *ob = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(ob);
- BMOperator bmop;
-
- /* get the type from RNA */
- const int type = RNA_enum_get(op->ptr, "type");
- const float thresh = RNA_float_get(op->ptr, "threshold");
- const int compare = RNA_enum_get(op->ptr, "compare");
-
- /* initialize the bmop using EDBM api, which does various ui error reporting and other stuff */
- EDBM_op_init(em, &bmop, op,
- "similar_faces faces=%hf type=%i thresh=%f compare=%i",
- BM_ELEM_SELECT, type, thresh, compare);
-
- /* execute the operator */
- BMO_op_exec(em->bm, &bmop);
- /* clear the existing selection */
- EDBM_flag_disable_all(em, BM_ELEM_SELECT);
+ const float mval_fl[2] = {UNPACK2(vc->mval)};
+ float ray_origin[3], ray_direction[3];
- /* select the output */
- BMO_slot_buffer_hflag_enable(em->bm, bmop.slots_out, "faces.out", BM_FACE, BM_ELEM_SELECT, true);
-
- /* finish the operator */
- if (!EDBM_op_finish(em, &bmop, op, true)) {
- return OPERATOR_CANCELLED;
- }
-
- EDBM_update_generic(em, false, false);
-
- return OPERATOR_FINISHED;
-}
+ struct {
+ uint base_index;
+ BMElem *ele;
+ } best = {0, NULL};
+
+ if (ED_view3d_win_to_ray_clipped(
+ vc->depsgraph,
+ vc->ar, vc->v3d, mval_fl,
+ ray_origin, ray_direction, true))
+ {
+ float dist_sq_best = FLT_MAX;
-/* ***************************************************** */
+ const bool use_vert = (r_eve != NULL);
+ const bool use_edge = (r_eed != NULL);
+ const bool use_face = (r_efa != NULL);
-/* EDGE GROUP */
+ for (uint base_index = 0; base_index < bases_len; base_index++) {
+ Base *base_iter = bases[base_index];
+ Object *obedit = base_iter->object;
-/* wrap the above function but do selection flushing edge to face */
-static int similar_edge_select_exec(bContext *C, wmOperator *op)
-{
- Object *ob = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(ob);
- BMOperator bmop;
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ BMesh *bm = em->bm;
+ float imat3[3][3];
- /* get the type from RNA */
- const int type = RNA_enum_get(op->ptr, "type");
- const float thresh = RNA_float_get(op->ptr, "threshold");
- const int compare = RNA_enum_get(op->ptr, "compare");
+ ED_view3d_viewcontext_init_object(vc, obedit);
+ copy_m3_m4(imat3, obedit->obmat);
+ invert_m3(imat3);
- /* initialize the bmop using EDBM api, which does various ui error reporting and other stuff */
- EDBM_op_init(em, &bmop, op,
- "similar_edges edges=%he type=%i thresh=%f compare=%i",
- BM_ELEM_SELECT, type, thresh, compare);
+ const float (*coords)[3] = NULL;
+ {
+ Mesh *me_eval = (Mesh *)DEG_get_evaluated_id(vc->depsgraph, obedit->data);
+ if (me_eval->runtime.edit_data) {
+ coords = me_eval->runtime.edit_data->vertexCos;
+ }
+ }
- /* execute the operator */
- BMO_op_exec(em->bm, &bmop);
+ if (coords != NULL) {
+ BM_mesh_elem_index_ensure(bm, BM_VERT);
+ }
- /* clear the existing selection */
- EDBM_flag_disable_all(em, BM_ELEM_SELECT);
+ if (use_boundary && (use_vert || use_edge)) {
+ BMEdge *e;
+ BMIter eiter;
+ BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
+ if ((BM_elem_flag_test(e, BM_ELEM_HIDDEN) == false) &&
+ (BM_edge_is_boundary(e)))
+ {
+ float depth;
+
+ if (use_vert) {
+ for (uint j = 0; j < 2; j++) {
+ BMVert *v = *((&e->v1) + j);
+ float point[3];
+ mul_v3_m4v3(point, obedit->obmat, coords ? coords[BM_elem_index_get(v)] : v->co);
+ const float dist_sq_test = dist_squared_to_ray_v3(
+ ray_origin, ray_direction,
+ point, &depth);
+ if (dist_sq_test < dist_sq_best) {
+ dist_sq_best = dist_sq_test;
+ best.base_index = base_index;
+ best.ele = (BMElem *)v;
+ }
+ }
+ }
- /* select the output */
- BMO_slot_buffer_hflag_enable(em->bm, bmop.slots_out, "edges.out", BM_EDGE, BM_ELEM_SELECT, true);
- EDBM_selectmode_flush(em);
+ if (use_edge) {
+ float point[3];
+#if 0
+ const float dist_sq_test = dist_squared_ray_to_seg_v3(
+ ray_origin, ray_direction,
+ e->v1->co, e->v2->co,
+ point, &depth);
+#else
+ if (coords) {
+ mid_v3_v3v3(point, coords[BM_elem_index_get(e->v1)], coords[BM_elem_index_get(e->v2)]);
+ }
+ else {
+ mid_v3_v3v3(point, e->v1->co, e->v2->co);
+ }
+ mul_m4_v3(obedit->obmat, point);
+ const float dist_sq_test = dist_squared_to_ray_v3(
+ ray_origin, ray_direction,
+ point, &depth);
+ if (dist_sq_test < dist_sq_best) {
+ dist_sq_best = dist_sq_test;
+ best.base_index = base_index;
+ best.ele = (BMElem *)e;
+ }
+#endif
+ }
+ }
+ }
+ }
+ else {
+ /* Non boundary case. */
+ if (use_vert) {
+ BMVert *v;
+ BMIter viter;
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
+ if (BM_elem_flag_test(v, BM_ELEM_HIDDEN) == false) {
+ float point[3];
+ mul_v3_m4v3(point, obedit->obmat, v->co);
+ float depth;
+ const float dist_sq_test = dist_squared_to_ray_v3(
+ ray_origin, ray_direction,
+ v->co, &depth);
+ if (dist_sq_test < dist_sq_best) {
+ dist_sq_best = dist_sq_test;
+ best.base_index = base_index;
+ best.ele = (BMElem *)v;
+ }
+ }
+ }
+ }
+ if (use_edge) {
+ BMEdge *e;
+ BMIter eiter;
+ BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
+ if (BM_elem_flag_test(e, BM_ELEM_HIDDEN) == false) {
+ float point[3];
+ if (coords) {
+ mid_v3_v3v3(point, coords[BM_elem_index_get(e->v1)], coords[BM_elem_index_get(e->v2)]);
+ }
+ else {
+ mid_v3_v3v3(point, e->v1->co, e->v2->co);
+ }
+ mul_m4_v3(obedit->obmat, point);
+ float depth;
+ const float dist_sq_test = dist_squared_to_ray_v3(
+ ray_origin, ray_direction,
+ point, &depth);
+ if (dist_sq_test < dist_sq_best) {
+ dist_sq_best = dist_sq_test;
+ best.base_index = base_index;
+ best.ele = (BMElem *)e;
+ }
+ }
+ }
+ }
+ }
- /* finish the operator */
- if (!EDBM_op_finish(em, &bmop, op, true)) {
- return OPERATOR_CANCELLED;
+ if (use_face) {
+ BMFace *f;
+ BMIter fiter;
+ BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
+ if (BM_elem_flag_test(f, BM_ELEM_HIDDEN) == false) {
+ float point[3];
+ if (coords) {
+ BM_face_calc_center_mean_vcos(bm, f, point, coords);
+ }
+ else {
+ BM_face_calc_center_mean(f, point);
+ }
+ mul_m4_v3(obedit->obmat, point);
+ float depth;
+ const float dist_sq_test = dist_squared_to_ray_v3(
+ ray_origin, ray_direction,
+ point, &depth);
+ if (dist_sq_test < dist_sq_best) {
+ dist_sq_best = dist_sq_test;
+ best.base_index = base_index;
+ best.ele = (BMElem *)f;
+ }
+ }
+ }
+ }
+ }
}
- EDBM_update_generic(em, false, false);
-
- return OPERATOR_FINISHED;
-}
-
-/* ********************************* */
-
-/*
- * VERT GROUP
- * mode 1: same normal
- * mode 2: same number of face users
- * mode 3: same vertex groups
- */
-static int similar_vert_select_exec(bContext *C, wmOperator *op)
-{
- Object *ob = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(ob);
- BMOperator bmop;
- /* get the type from RNA */
- const int type = RNA_enum_get(op->ptr, "type");
- const float thresh = RNA_float_get(op->ptr, "threshold");
- const int compare = RNA_enum_get(op->ptr, "compare");
-
- /* initialize the bmop using EDBM api, which does various ui error reporting and other stuff */
- EDBM_op_init(em, &bmop, op,
- "similar_verts verts=%hv type=%i thresh=%f compare=%i",
- BM_ELEM_SELECT, type, thresh, compare);
-
- /* execute the operator */
- BMO_op_exec(em->bm, &bmop);
-
- /* clear the existing selection */
- EDBM_flag_disable_all(em, BM_ELEM_SELECT);
-
- /* select the output */
- BMO_slot_buffer_hflag_enable(em->bm, bmop.slots_out, "verts.out", BM_VERT, BM_ELEM_SELECT, true);
-
- /* finish the operator */
- if (!EDBM_op_finish(em, &bmop, op, true)) {
- return OPERATOR_CANCELLED;
+ *r_base_index = best.base_index;
+ if (r_eve) {
+ *r_eve = NULL;
}
-
- EDBM_selectmode_flush(em);
-
- EDBM_update_generic(em, false, false);
-
- return OPERATOR_FINISHED;
-}
-
-static int edbm_select_similar_exec(bContext *C, wmOperator *op)
-{
- ToolSettings *ts = CTX_data_tool_settings(C);
- PropertyRNA *prop = RNA_struct_find_property(op->ptr, "threshold");
-
- const int type = RNA_enum_get(op->ptr, "type");
-
- if (!RNA_property_is_set(op->ptr, prop)) {
- RNA_property_float_set(op->ptr, prop, ts->select_thresh);
+ if (r_eed) {
+ *r_eed = NULL;
}
- else {
- ts->select_thresh = RNA_property_float_get(op->ptr, prop);
+ if (r_efa) {
+ *r_efa = NULL;
}
- if (type < 100) return similar_vert_select_exec(C, op);
- else if (type < 200) return similar_edge_select_exec(C, op);
- else return similar_face_select_exec(C, op);
-}
-
-static const EnumPropertyItem *select_similar_type_itemf(
- bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop),
- bool *r_free)
-{
- Object *obedit;
-
- if (!C) /* needed for docs and i18n tools */
- return prop_similar_types;
-
- obedit = CTX_data_edit_object(C);
-
- if (obedit && obedit->type == OB_MESH) {
- EnumPropertyItem *item = NULL;
- int a, totitem = 0;
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
-
- if (em->selectmode & SCE_SELECT_VERTEX) {
- for (a = SIMVERT_NORMAL; a < SIMEDGE_LENGTH; a++) {
- RNA_enum_items_add_value(&item, &totitem, prop_similar_types, a);
- }
- }
- else if (em->selectmode & SCE_SELECT_EDGE) {
- for (a = SIMEDGE_LENGTH; a < SIMFACE_MATERIAL; a++) {
- RNA_enum_items_add_value(&item, &totitem, prop_similar_types, a);
- }
- }
- else if (em->selectmode & SCE_SELECT_FACE) {
-#ifdef WITH_FREESTYLE
- const int a_end = SIMFACE_FREESTYLE;
-#else
- const int a_end = SIMFACE_FACEMAP;
-#endif
- for (a = SIMFACE_MATERIAL; a <= a_end; a++) {
- RNA_enum_items_add_value(&item, &totitem, prop_similar_types, a);
- }
+ if (best.ele) {
+ switch (best.ele->head.htype) {
+ case BM_VERT:
+ *r_eve = (BMVert *)best.ele;
+ break;
+ case BM_EDGE:
+ *r_eed = (BMEdge *)best.ele;
+ break;
+ case BM_FACE:
+ *r_efa = (BMFace *)best.ele;
+ break;
+ default:
+ BLI_assert(0);
}
- RNA_enum_item_end(&item, &totitem);
-
- *r_free = true;
-
- return item;
}
-
- return prop_similar_types;
-}
-
-void MESH_OT_select_similar(wmOperatorType *ot)
-{
- PropertyRNA *prop;
-
- /* identifiers */
- ot->name = "Select Similar";
- ot->idname = "MESH_OT_select_similar";
- ot->description = "Select similar vertices, edges or faces by property types";
-
- /* api callbacks */
- ot->invoke = WM_menu_invoke;
- ot->exec = edbm_select_similar_exec;
- ot->poll = ED_operator_editmesh;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* properties */
- prop = ot->prop = RNA_def_enum(ot->srna, "type", prop_similar_types, SIMVERT_NORMAL, "Type", "");
- RNA_def_enum_funcs(prop, select_similar_type_itemf);
-
- RNA_def_enum(ot->srna, "compare", prop_similar_compare_types, SIM_CMP_EQ, "Compare", "");
-
- RNA_def_float(ot->srna, "threshold", 0.0f, 0.0f, 1.0f, "Threshold", "", 0.0f, 1.0f);
+ return (best.ele != NULL);
}
/** \} */
@@ -1525,14 +1483,16 @@ void MESH_OT_select_mode(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* properties */
+ /* Hide all, not to show redo panel. */
prop = RNA_def_boolean(ot->srna, "use_extend", false, "Extend", "");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
prop = RNA_def_boolean(ot->srna, "use_expand", false, "Expand", "");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
ot->prop = prop = RNA_def_enum(ot->srna, "type", elem_items, 0, "Type", "");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
- RNA_def_enum(ot->srna, "action", actions_items, 2, "Action", "Selection action to execute");
+ prop = RNA_def_enum(ot->srna, "action", actions_items, 2, "Action", "Selection action to execute");
+ RNA_def_property_flag(prop, PROP_HIDDEN);
}
/** \} */
@@ -1750,17 +1710,25 @@ static bool mouse_mesh_loop(bContext *C, const int mval[2], bool extend, bool de
const short selectmode = em_original->selectmode;
em_original->selectmode = SCE_SELECT_EDGE;
- if (EDBM_unified_findnearest(&vc, &basact, &eve, &eed, &efa)) {
- ED_view3d_viewcontext_init_object(&vc, basact->object);
- em = vc.em;
- }
- else {
- em = NULL;
+ uint bases_len;
+ Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(vc.view_layer, &bases_len);
+
+ {
+ int base_index = -1;
+ if (EDBM_unified_findnearest(&vc, bases, bases_len, &base_index, &eve, &eed, &efa)) {
+ basact = bases[base_index];
+ ED_view3d_viewcontext_init_object(&vc, basact->object);
+ em = vc.em;
+ }
+ else {
+ em = NULL;
+ }
}
em_original->selectmode = selectmode;
if (em == NULL || eed == NULL) {
+ MEM_freeN(bases);
return false;
}
@@ -1782,6 +1750,25 @@ static bool mouse_mesh_loop(bContext *C, const int mval[2], bool extend, bool de
select_cycle = false;
}
+ if (select_clear) {
+ for (uint base_index = 0; base_index < bases_len; base_index++) {
+ Base *base_iter = bases[base_index];
+ Object *ob_iter = base_iter->object;
+ BMEditMesh *em_iter = BKE_editmesh_from_object(ob_iter);
+
+ if (em_iter->bm->totvertsel == 0) {
+ continue;
+ }
+
+ if (em_iter == em) {
+ continue;
+ }
+
+ EDBM_flag_disable_all(em_iter, BM_ELEM_SELECT);
+ DEG_id_tag_update(ob_iter->data, DEG_TAG_SELECT_UPDATE);
+ }
+ }
+
if (em->selectmode & SCE_SELECT_FACE) {
mouse_mesh_loop_face(em, eed, select, select_clear);
}
@@ -1863,6 +1850,8 @@ static bool mouse_mesh_loop(bContext *C, const int mval[2], bool extend, bool de
}
}
+ MEM_freeN(bases);
+
DEG_id_tag_update(vc.obedit->data, DEG_TAG_SELECT_UPDATE);
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data);
@@ -2052,7 +2041,7 @@ bool EDBM_select_pick(bContext *C, const int mval[2], bool extend, bool deselect
{
ViewContext vc;
- Base *basact = NULL;
+ int base_index_active = -1;
BMVert *eve = NULL;
BMEdge *eed = NULL;
BMFace *efa = NULL;
@@ -2062,23 +2051,26 @@ bool EDBM_select_pick(bContext *C, const int mval[2], bool extend, bool deselect
vc.mval[0] = mval[0];
vc.mval[1] = mval[1];
- if (unified_findnearest(&vc, &basact, &eve, &eed, &efa)) {
+ uint bases_len = 0;
+ Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(vc.view_layer, &bases_len);
+
+ bool ok = false;
+
+ if (unified_findnearest(&vc, bases, bases_len, &base_index_active, &eve, &eed, &efa)) {
+ Base *basact = bases[base_index_active];
ED_view3d_viewcontext_init_object(&vc, basact->object);
/* Deselect everything */
if (extend == false && deselect == false && toggle == false) {
- uint objects_len = 0;
- Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(vc.view_layer, &objects_len);
-
- for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object *ob_iter = objects[ob_index];
+ for (uint base_index = 0; base_index < bases_len; base_index++) {
+ Base *base_iter = bases[base_index];
+ Object *ob_iter = base_iter->object;
EDBM_flag_disable_all(BKE_editmesh_from_object(ob_iter), BM_ELEM_SELECT);
if (basact->object != ob_iter) {
DEG_id_tag_update(ob_iter->data, DEG_TAG_SELECT_UPDATE);
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob_iter->data);
}
}
- MEM_freeN(objects);
}
if (efa) {
@@ -2192,17 +2184,18 @@ bool EDBM_select_pick(bContext *C, const int mval[2], bool extend, bool deselect
/* Changing active object is handy since it allows us to
* switch UV layers, vgroups for eg. */
if (vc.view_layer->basact != basact) {
- vc.view_layer->basact = basact;
- DEG_id_tag_update(&vc.scene->id, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, vc.scene);
+ ED_object_base_activate(C, basact);
}
+
DEG_id_tag_update(vc.obedit->data, DEG_TAG_SELECT_UPDATE);
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data);
- return true;
+ ok = true;
}
- return false;
+ MEM_freeN(bases);
+
+ return ok;
}
/** \} */
@@ -2526,6 +2519,7 @@ bool EDBM_selectmode_toggle(
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
Object *ob_iter = objects[ob_index];
BMEditMesh *em_iter = BKE_editmesh_from_object(ob_iter);
+ em_iter->selectmode = ts->selectmode;
EDBM_selectmode_set(em_iter);
DEG_id_tag_update(ob_iter->data, DEG_TAG_COPY_ON_WRITE | DEG_TAG_SELECT_UPDATE);
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob_iter->data);
@@ -3143,19 +3137,20 @@ static int edbm_select_linked_pick_invoke(bContext *C, wmOperator *op, const wmE
/* setup view context for argument to callbacks */
em_setup_viewcontext(C, &vc);
+ uint bases_len;
+ Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(vc.view_layer, &bases_len);
+
{
- uint objects_len = 0;
- Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(vc.view_layer, &objects_len);
bool has_edges = false;
- for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object *ob_iter = objects[ob_index];
+ for (uint base_index = 0; base_index < bases_len; base_index++) {
+ Object *ob_iter = bases[base_index]->object;
ED_view3d_viewcontext_init_object(&vc, ob_iter);
if (vc.em->bm->totedge) {
has_edges = true;
}
}
- MEM_freeN(objects);
if (has_edges == false) {
+ MEM_freeN(bases);
return OPERATOR_CANCELLED;
}
}
@@ -3164,9 +3159,16 @@ static int edbm_select_linked_pick_invoke(bContext *C, wmOperator *op, const wmE
vc.mval[1] = event->mval[1];
/* return warning! */
- if (unified_findnearest(&vc, &basact, &eve, &eed, &efa) == 0) {
- return OPERATOR_CANCELLED;
+ {
+ int base_index = -1;
+ const bool ok = unified_findnearest(&vc, bases, bases_len, &base_index, &eve, &eed, &efa);
+ if (!ok) {
+ MEM_freeN(bases);
+ return OPERATOR_CANCELLED;
+ }
+ basact = bases[base_index];
}
+
ED_view3d_viewcontext_init_object(&vc, basact->object);
BMEditMesh *em = vc.em;
BMesh *bm = em->bm;
@@ -3192,6 +3194,7 @@ static int edbm_select_linked_pick_invoke(bContext *C, wmOperator *op, const wmE
DEG_id_tag_update(basact->object->data, DEG_TAG_SELECT_UPDATE);
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, basact->object->data);
+ MEM_freeN(bases);
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/mesh/editmesh_select_similar.c b/source/blender/editors/mesh/editmesh_select_similar.c
new file mode 100644
index 00000000000..1124b58e116
--- /dev/null
+++ b/source/blender/editors/mesh/editmesh_select_similar.c
@@ -0,0 +1,1376 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2004 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/mesh/editmesh_select_similar.c
+ * \ingroup edmesh
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_kdtree.h"
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+
+#include "BKE_context.h"
+#include "BKE_editmesh.h"
+#include "BKE_layer.h"
+#include "BKE_material.h"
+#include "BKE_report.h"
+
+#include "DNA_meshdata_types.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "ED_mesh.h"
+#include "ED_screen.h"
+#include "ED_select_utils.h"
+
+#include "mesh_intern.h" /* own include */
+
+/* -------------------------------------------------------------------- */
+/** \name Select Similar (Vert/Edge/Face) Operator - common
+ * \{ */
+
+static const EnumPropertyItem prop_similar_compare_types[] = {
+ {SIM_CMP_EQ, "EQUAL", 0, "Equal", ""},
+ {SIM_CMP_GT, "GREATER", 0, "Greater", ""},
+ {SIM_CMP_LT, "LESS", 0, "Less", ""},
+
+ {0, NULL, 0, NULL, NULL}
+};
+
+static const EnumPropertyItem prop_similar_types[] = {
+ {SIMVERT_NORMAL, "NORMAL", 0, "Normal", ""},
+ {SIMVERT_FACE, "FACE", 0, "Amount of Adjacent Faces", ""},
+ {SIMVERT_VGROUP, "VGROUP", 0, "Vertex Groups", ""},
+ {SIMVERT_EDGE, "EDGE", 0, "Amount of connecting edges", ""},
+
+ {SIMEDGE_LENGTH, "LENGTH", 0, "Length", ""},
+ {SIMEDGE_DIR, "DIR", 0, "Direction", ""},
+ {SIMEDGE_FACE, "FACE", 0, "Amount of Faces Around an Edge", ""},
+ {SIMEDGE_FACE_ANGLE, "FACE_ANGLE", 0, "Face Angles", ""},
+ {SIMEDGE_CREASE, "CREASE", 0, "Crease", ""},
+ {SIMEDGE_BEVEL, "BEVEL", 0, "Bevel", ""},
+ {SIMEDGE_SEAM, "SEAM", 0, "Seam", ""},
+ {SIMEDGE_SHARP, "SHARP", 0, "Sharpness", ""},
+#ifdef WITH_FREESTYLE
+ {SIMEDGE_FREESTYLE, "FREESTYLE_EDGE", 0, "Freestyle Edge Marks", ""},
+#endif
+
+ {SIMFACE_MATERIAL, "MATERIAL", 0, "Material", ""},
+ {SIMFACE_AREA, "AREA", 0, "Area", ""},
+ {SIMFACE_SIDES, "SIDES", 0, "Polygon Sides", ""},
+ {SIMFACE_PERIMETER, "PERIMETER", 0, "Perimeter", ""},
+ {SIMFACE_NORMAL, "NORMAL", 0, "Normal", ""},
+ {SIMFACE_COPLANAR, "COPLANAR", 0, "Co-planar", ""},
+ {SIMFACE_SMOOTH, "SMOOTH", 0, "Flat/Smooth", ""},
+ {SIMFACE_FACEMAP, "FACE_MAP", 0, "Face-Map", ""},
+#ifdef WITH_FREESTYLE
+ {SIMFACE_FREESTYLE, "FREESTYLE_FACE", 0, "Freestyle Face Marks", ""},
+#endif
+
+ {0, NULL, 0, NULL, NULL}
+};
+
+static int mesh_select_similar_compare_int(const int delta, const int compare)
+{
+ switch (compare) {
+ case SIM_CMP_EQ:
+ return (delta == 0);
+ case SIM_CMP_GT:
+ return (delta > 0);
+ case SIM_CMP_LT:
+ return (delta < 0);
+ default:
+ BLI_assert(0);
+ return 0;
+ }
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Select Similar Face
+ * \{ */
+
+enum {
+ SIMFACE_DATA_NONE = 0,
+ SIMFACE_DATA_TRUE = (1 << 0),
+ SIMFACE_DATA_FALSE = (1 << 1),
+ SIMFACE_DATA_ALL = (SIMFACE_DATA_TRUE | SIMFACE_DATA_FALSE),
+};
+
+/**
+ * Return true if we still don't know the final value for this edge data.
+ * In other words, if we need to keep iterating over the objects or we can
+ * just go ahead and select all the objects.
+ */
+static bool face_data_value_set(BMFace *face, const int hflag, int *r_value)
+{
+ if (BM_elem_flag_test(face, hflag)) {
+ *r_value |= SIMFACE_DATA_TRUE;
+ }
+ else {
+ *r_value |= SIMFACE_DATA_FALSE;
+ }
+
+ return *r_value != SIMFACE_DATA_ALL;
+}
+
+/**
+ * Note: This is not normal, but the face direction itself and always in
+ * a positive quadrant (tries z, y then x).
+ * Also, unlike edge_pos_direction_worldspace_get we don't normalize the direction.
+ * In fact we scale the direction by the distance of the face center to the origin.
+ */
+static void face_pos_direction_worldspace_scaled_get(Object *ob, BMFace *face, float *r_dir)
+{
+ float distance;
+ float center[3];
+
+ copy_v3_v3(r_dir, face->no);
+ normalize_v3(r_dir);
+
+ BM_face_calc_center_mean(face, center);
+ mul_m4_v3(ob->obmat, center);
+
+ distance = dot_v3v3(r_dir, center);
+ mul_v3_fl(r_dir, distance);
+
+ /* Make sure we have a consistent direction regardless of the face orientation.
+ * This spares us from storing dir and -dir in the tree. */
+ if (fabs(r_dir[2]) < FLT_EPSILON) {
+ if (fabs(r_dir[1]) < FLT_EPSILON) {
+ if (r_dir[0] < 0.0f) {
+ mul_v3_fl(r_dir, -1.0f);
+ }
+ }
+ else if (r_dir[1] < 0.0f) {
+ mul_v3_fl(r_dir, -1.0f);
+ }
+ }
+ else if (r_dir[2] < 0.0f) {
+ mul_v3_fl(r_dir, -1.0f);
+ }
+}
+
+/* TODO(dfelinto): `types` that should technically be compared in world space but are not:
+ * -SIMFACE_AREA
+ * -SIMFACE_PERIMETER
+ */
+static int similar_face_select_exec(bContext *C, wmOperator *op)
+{
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+
+ const int type = RNA_enum_get(op->ptr, "type");
+ const float thresh = RNA_float_get(op->ptr, "threshold");
+ const float thresh_radians = thresh * (float)M_PI;
+ const int compare = RNA_enum_get(op->ptr, "compare");
+
+ int tot_faces_selected_all = 0;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(ob);
+ tot_faces_selected_all += em->bm->totfacesel;
+ }
+
+ if (tot_faces_selected_all == 0) {
+ BKE_report(op->reports, RPT_ERROR, "No face selected");
+ MEM_freeN(objects);
+ return OPERATOR_CANCELLED;
+ }
+
+ KDTree *tree = NULL;
+ GSet *gset = NULL;
+ GSet **gset_array = NULL;
+ int face_data_value = SIMFACE_DATA_NONE;
+
+ switch (type) {
+ case SIMFACE_AREA:
+ case SIMFACE_PERIMETER:
+ case SIMFACE_NORMAL:
+ case SIMFACE_COPLANAR:
+ tree = BLI_kdtree_new(tot_faces_selected_all);
+ break;
+ case SIMFACE_SIDES:
+ case SIMFACE_MATERIAL:
+ gset = BLI_gset_ptr_new("Select similar face");
+ break;
+ case SIMFACE_FACEMAP:
+ gset_array = MEM_callocN(sizeof(GSet *) * objects_len, "Select similar face: facemap gset array");
+ break;
+ }
+
+ int tree_index = 0;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(ob);
+ BMesh *bm = em->bm;
+ Material ***material_array = NULL;
+ invert_m4_m4(ob->imat, ob->obmat);
+ int custom_data_offset = 0;
+
+ if (bm->totfacesel == 0) {
+ continue;
+ }
+
+ float ob_m3[3][3];
+ copy_m3_m4(ob_m3, ob->obmat);
+
+ switch (type) {
+ case SIMFACE_MATERIAL:
+ {
+ if (ob->totcol == 0) {
+ continue;
+ }
+ material_array = give_matarar(ob);
+ break;
+ }
+ case SIMFACE_FREESTYLE:
+ {
+ if (!CustomData_has_layer(&bm->pdata, CD_FREESTYLE_FACE)) {
+ face_data_value |= SIMFACE_DATA_FALSE;
+ continue;
+ }
+ break;
+ }
+ case SIMFACE_FACEMAP:
+ {
+ custom_data_offset = CustomData_get_offset(&bm->pdata, CD_FACEMAP);
+ if (custom_data_offset == -1) {
+ continue;
+ }
+ else {
+ gset_array[ob_index] = BLI_gset_ptr_new("Select similar face: facemap gset");
+ }
+ }
+ }
+
+ BMFace *face; /* Mesh face. */
+ BMIter iter; /* Selected faces iterator. */
+
+ BM_ITER_MESH (face, &iter, bm, BM_FACES_OF_MESH) {
+ if (BM_elem_flag_test(face, BM_ELEM_SELECT)) {
+ switch (type) {
+ case SIMFACE_SIDES:
+ BLI_gset_add(gset, POINTER_FROM_INT(face->len));
+ break;
+ case SIMFACE_MATERIAL:
+ {
+ Material *material = (*material_array)[face->mat_nr];
+ if (material != NULL) {
+ BLI_gset_add(gset, material);
+ }
+ break;
+ }
+ case SIMFACE_AREA:
+ {
+ float area = BM_face_calc_area_with_mat3(face, ob_m3);
+ float dummy[3] = {area, 0.0f, 0.0f};
+ BLI_kdtree_insert(tree, tree_index++, dummy);
+ break;
+ }
+ case SIMFACE_PERIMETER:
+ {
+ float perimeter = BM_face_calc_perimeter_with_mat3(face, ob_m3);
+ float dummy[3] = {perimeter, 0.0f, 0.0f};
+ BLI_kdtree_insert(tree, tree_index++, dummy);
+ break;
+ break;
+ }
+ case SIMFACE_NORMAL:
+ {
+ float normal[3];
+ copy_v3_v3(normal, face->no);
+ mul_transposed_mat3_m4_v3(ob->imat, normal);
+ normalize_v3(normal);
+
+ BLI_kdtree_insert(tree, tree_index++, normal);
+ break;
+ }
+ case SIMFACE_COPLANAR:
+ {
+ float dir[3];
+ face_pos_direction_worldspace_scaled_get(ob, face, dir);
+ BLI_kdtree_insert(tree, tree_index++, dir);
+ break;
+ }
+ case SIMFACE_SMOOTH:
+ {
+ if (!face_data_value_set(face, BM_ELEM_SMOOTH, &face_data_value)) {
+ goto face_select_all;
+ }
+ break;
+ }
+ case SIMFACE_FREESTYLE:
+ {
+ FreestyleFace *fface;
+ fface = CustomData_bmesh_get(&bm->pdata, face->head.data, CD_FREESTYLE_FACE);
+ if ((fface == NULL) || ((fface->flag & FREESTYLE_FACE_MARK) == 0)) {
+ face_data_value |= SIMFACE_DATA_FALSE;
+ }
+ else {
+ face_data_value |= SIMFACE_DATA_TRUE;
+ }
+ if (face_data_value == SIMFACE_DATA_ALL) {
+ goto face_select_all;
+ }
+ break;
+ }
+ case SIMFACE_FACEMAP:
+ {
+ BLI_assert(custom_data_offset != -1);
+ int *face_map = BM_ELEM_CD_GET_VOID_P(face, custom_data_offset);
+ BLI_gset_add(gset_array[ob_index], face_map);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ BLI_assert((type != SIMFACE_FREESTYLE) || (face_data_value != SIMFACE_DATA_NONE));
+
+ if (tree != NULL) {
+ BLI_kdtree_balance(tree);
+ }
+
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(ob);
+ BMesh *bm = em->bm;
+ bool changed = false;
+ Material ***material_array = NULL;
+ int custom_data_offset;
+
+ float ob_m3[3][3];
+ copy_m3_m4(ob_m3, ob->obmat);
+
+ bool has_custom_data_layer = false;
+ switch (type) {
+ case SIMFACE_MATERIAL:
+ {
+ if (ob->totcol == 0) {
+ continue;
+ }
+ material_array = give_matarar(ob);
+ break;
+ }
+ case SIMFACE_FREESTYLE:
+ {
+ has_custom_data_layer = CustomData_has_layer(&bm->pdata, CD_FREESTYLE_FACE);
+ if ((face_data_value == SIMFACE_DATA_TRUE) && !has_custom_data_layer) {
+ continue;
+ }
+ break;
+ }
+ case SIMFACE_FACEMAP:
+ {
+ custom_data_offset = CustomData_get_offset(&bm->pdata, CD_FACEMAP);
+ if (custom_data_offset == -1) {
+ continue;
+ }
+ }
+ }
+
+ BMFace *face; /* Mesh face. */
+ BMIter iter; /* Selected faces iterator. */
+
+ BM_ITER_MESH (face, &iter, bm, BM_FACES_OF_MESH) {
+ if (!BM_elem_flag_test(face, BM_ELEM_SELECT) &&
+ !BM_elem_flag_test(face, BM_ELEM_HIDDEN))
+ {
+ bool select = false;
+ switch (type) {
+ case SIMFACE_SIDES:
+ {
+ const int num_sides = face->len;
+ GSetIterator gs_iter;
+ GSET_ITER(gs_iter, gset) {
+ const int num_sides_iter = POINTER_AS_INT(BLI_gsetIterator_getKey(&gs_iter));
+ const int delta_i = num_sides - num_sides_iter;
+ if (mesh_select_similar_compare_int(delta_i, compare)) {
+ select = true;
+ break;
+ }
+ }
+ break;
+ }
+ case SIMFACE_MATERIAL:
+ {
+ const Material *material = (*material_array)[face->mat_nr];
+ if (material == NULL) {
+ continue;
+ }
+
+ GSetIterator gs_iter;
+ GSET_ITER(gs_iter, gset) {
+ const Material *material_iter = BLI_gsetIterator_getKey(&gs_iter);
+ if (material == material_iter) {
+ select = true;
+ break;
+ }
+ }
+ break;
+ }
+ case SIMFACE_AREA:
+ {
+ float area = BM_face_calc_area_with_mat3(face, ob_m3);
+ if (ED_select_similar_compare_float_tree(tree, area, thresh, compare)) {
+ select = true;
+ }
+ break;
+ }
+ case SIMFACE_PERIMETER:
+ {
+ float perimeter = BM_face_calc_perimeter_with_mat3(face, ob_m3);
+ if (ED_select_similar_compare_float_tree(tree, perimeter, thresh, compare)) {
+ select = true;
+ }
+ break;
+ }
+ case SIMFACE_NORMAL:
+ {
+ float normal[3];
+ copy_v3_v3(normal, face->no);
+ mul_transposed_mat3_m4_v3(ob->imat, normal);
+ normalize_v3(normal);
+
+ /* We are treating the normals as coordinates, the "nearest" one will
+ * also be the one closest to the angle. */
+ KDTreeNearest nearest;
+ if (BLI_kdtree_find_nearest(tree, normal, &nearest) != -1) {
+ if (angle_normalized_v3v3(normal, nearest.co) <= thresh_radians) {
+ select = true;
+ }
+ }
+ break;
+ }
+ case SIMFACE_COPLANAR:
+ {
+ float diff[3];
+ float dir[3];
+ face_pos_direction_worldspace_scaled_get(ob, face, dir);
+
+ /* We are treating the direction as coordinates, the "nearest" one will
+ * also be the one closest to the angle.
+ * And since the direction is scaled by the face center distance to the origin,
+ * the nearest point will also be the closest between the planes. */
+ KDTreeNearest nearest;
+ if (BLI_kdtree_find_nearest(tree, dir, &nearest) != -1) {
+ sub_v3_v3v3(diff, dir, nearest.co);
+ if (len_v3(diff) <= thresh) {
+ if (angle_v3v3(dir, nearest.co) <= thresh_radians) {
+ select = true;
+ }
+ }
+ }
+ break;
+ }
+ case SIMFACE_SMOOTH:
+ if ((BM_elem_flag_test(face, BM_ELEM_SMOOTH) != 0) ==
+ ((face_data_value & SIMFACE_DATA_TRUE) != 0))
+ {
+ select = true;
+ }
+ break;
+ case SIMFACE_FREESTYLE:
+ {
+ FreestyleFace *fface;
+
+ if (!has_custom_data_layer) {
+ BLI_assert(face_data_value == SIMFACE_DATA_FALSE);
+ select = true;
+ break;
+ }
+
+ fface = CustomData_bmesh_get(&bm->pdata, face->head.data, CD_FREESTYLE_FACE);
+ if (((fface != NULL) && (fface->flag & FREESTYLE_FACE_MARK)) ==
+ ((face_data_value & SIMFACE_DATA_TRUE) != 0))
+ {
+ select = true;
+ }
+ break;
+ }
+ case SIMFACE_FACEMAP:
+ {
+ const int *face_map = BM_ELEM_CD_GET_VOID_P(face, custom_data_offset);
+ GSetIterator gs_iter;
+ GSET_ITER(gs_iter, gset_array[ob_index]) {
+ const int *face_map_iter = BLI_gsetIterator_getKey(&gs_iter);
+ if (*face_map == *face_map_iter) {
+ select = true;
+ break;
+ }
+ }
+ break;
+ }
+ }
+
+ if (select) {
+ BM_face_select_set(bm, face, true);
+ changed = true;
+ }
+ }
+ }
+
+ if (changed) {
+ EDBM_selectmode_flush(em);
+ EDBM_update_generic(em, false, false);
+ }
+ }
+
+ if (false) {
+face_select_all:
+ BLI_assert(ELEM(type,
+ SIMFACE_SMOOTH,
+ SIMFACE_FREESTYLE
+ ));
+
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(ob);
+ BMesh *bm = em->bm;
+
+ BMFace *face; /* Mesh face. */
+ BMIter iter; /* Selected faces iterator. */
+
+ BM_ITER_MESH (face, &iter, bm, BM_FACES_OF_MESH) {
+ if (!BM_elem_flag_test(face, BM_ELEM_SELECT)) {
+ BM_face_select_set(bm, face, true);
+ }
+ }
+ EDBM_selectmode_flush(em);
+ EDBM_update_generic(em, false, false);
+ }
+ }
+
+ MEM_freeN(objects);
+ BLI_kdtree_free(tree);
+ if (gset != NULL) {
+ BLI_gset_free(gset, NULL);
+ }
+ if (gset_array != NULL) {
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ if (gset_array[ob_index] != NULL) {
+ BLI_gset_free(gset_array[ob_index], NULL);
+ }
+ }
+ MEM_freeN(gset_array);
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Select Similar Edge
+ * \{ */
+
+
+/**
+ * Note: This is not normal, but the edge direction itself and always in
+ * a positive quadrant (tries z, y then x).
+ * Therefore we need to use the entire object transformation matrix.
+ */
+static void edge_pos_direction_worldspace_get(Object *ob, BMEdge *edge, float *r_dir)
+{
+ float v1[3], v2[3];
+ copy_v3_v3(v1, edge->v1->co);
+ copy_v3_v3(v2, edge->v2->co);
+
+ mul_m4_v3(ob->obmat, v1);
+ mul_m4_v3(ob->obmat, v2);
+
+ sub_v3_v3v3(r_dir, v1, v2);
+ normalize_v3(r_dir);
+
+ /* Make sure we have a consistent direction that can be checked regardless of
+ * the verts order of the edges. This spares us from storing dir and -dir in the tree. */
+ if (fabs(r_dir[2]) < FLT_EPSILON) {
+ if (fabs(r_dir[1]) < FLT_EPSILON) {
+ if (r_dir[0] < 0.0f) {
+ mul_v3_fl(r_dir, -1.0f);
+ }
+ }
+ else if (r_dir[1] < 0.0f) {
+ mul_v3_fl(r_dir, -1.0f);
+ }
+ }
+ else if (r_dir[2] < 0.0f) {
+ mul_v3_fl(r_dir, -1.0f);
+ }
+}
+
+static float edge_length_squared_worldspace_get(Object *ob, BMEdge *edge)
+{
+ float v1[3], v2[3];
+
+ mul_v3_mat3_m4v3(v1, ob->obmat, edge->v1->co);
+ mul_v3_mat3_m4v3(v2, ob->obmat, edge->v2->co);
+
+ return len_squared_v3v3(v1, v2);
+}
+
+enum {
+ SIMEDGE_DATA_NONE = 0,
+ SIMEDGE_DATA_TRUE = (1 << 0),
+ SIMEDGE_DATA_FALSE = (1 << 1),
+ SIMEDGE_DATA_ALL = (SIMEDGE_DATA_TRUE | SIMEDGE_DATA_FALSE),
+};
+
+/**
+ * Return true if we still don't know the final value for this edge data.
+ * In other words, if we need to keep iterating over the objects or we can
+ * just go ahead and select all the objects.
+ */
+static bool edge_data_value_set(BMEdge *edge, const int hflag, int *r_value)
+{
+ if (BM_elem_flag_test(edge, hflag)) {
+ *r_value |= SIMEDGE_DATA_TRUE;
+ }
+ else {
+ *r_value |= SIMEDGE_DATA_FALSE;
+ }
+
+ return *r_value != SIMEDGE_DATA_ALL;
+}
+
+/* TODO(dfelinto): `types` that should technically be compared in world space but are not:
+ * -SIMEDGE_FACE_ANGLE
+ */
+static int similar_edge_select_exec(bContext *C, wmOperator *op)
+{
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+
+ const int type = RNA_enum_get(op->ptr, "type");
+ const float thresh = RNA_float_get(op->ptr, "threshold");
+ const float thresh_radians = thresh * (float)M_PI + FLT_EPSILON;
+ const int compare = RNA_enum_get(op->ptr, "compare");
+ int custom_data_type = -1;
+
+ int tot_edges_selected_all = 0;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(ob);
+ tot_edges_selected_all += em->bm->totedgesel;
+ }
+
+ if (tot_edges_selected_all == 0) {
+ BKE_report(op->reports, RPT_ERROR, "No edge selected");
+ MEM_freeN(objects);
+ return OPERATOR_CANCELLED;
+ }
+
+ KDTree *tree = NULL;
+ GSet *gset = NULL;
+ int edge_data_value = SIMEDGE_DATA_NONE;
+
+ switch (type) {
+ case SIMEDGE_CREASE:
+ case SIMEDGE_BEVEL:
+ case SIMEDGE_FACE_ANGLE:
+ case SIMEDGE_LENGTH:
+ case SIMEDGE_DIR:
+ tree = BLI_kdtree_new(tot_edges_selected_all);
+ break;
+ case SIMEDGE_FACE:
+ gset = BLI_gset_ptr_new("Select similar edge: face");
+ break;
+ }
+
+ switch (type) {
+ case SIMEDGE_CREASE:
+ custom_data_type = CD_CREASE;
+ break;
+ case SIMEDGE_BEVEL:
+ custom_data_type = CD_BWEIGHT;
+ break;
+ }
+
+ int tree_index = 0;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(ob);
+ BMesh *bm = em->bm;
+
+ if (bm->totedgesel == 0) {
+ continue;
+ }
+
+ switch (type) {
+ case SIMEDGE_FREESTYLE:
+ {
+ if (!CustomData_has_layer(&bm->edata, CD_FREESTYLE_EDGE)) {
+ edge_data_value |= SIMEDGE_DATA_FALSE;
+ continue;
+ }
+ break;
+ }
+ case SIMEDGE_CREASE:
+ case SIMEDGE_BEVEL:
+ {
+ if (!CustomData_has_layer(&bm->edata, custom_data_type)) {
+ float dummy[3] = {0.0f, 0.0f, 0.0f};
+ BLI_kdtree_insert(tree, tree_index++, dummy);
+ continue;
+ }
+ break;
+ }
+ }
+
+ float ob_m3[3][3], ob_m3_inv[3][3];
+ copy_m3_m4(ob_m3, ob->obmat);
+ invert_m3_m3(ob_m3_inv, ob_m3);
+
+ BMEdge *edge; /* Mesh edge. */
+ BMIter iter; /* Selected edges iterator. */
+
+ BM_ITER_MESH (edge, &iter, bm, BM_EDGES_OF_MESH) {
+ if (BM_elem_flag_test(edge, BM_ELEM_SELECT)) {
+ switch (type) {
+ case SIMEDGE_FACE:
+ BLI_gset_add(gset, POINTER_FROM_INT(BM_edge_face_count(edge)));
+ break;
+ case SIMEDGE_DIR:
+ {
+ float dir[3];
+ edge_pos_direction_worldspace_get(ob, edge, dir);
+ BLI_kdtree_insert(tree, tree_index++, dir);
+ break;
+ }
+ case SIMEDGE_LENGTH:
+ {
+ float length = edge_length_squared_worldspace_get(ob, edge);
+ float dummy[3] = {length, 0.0f, 0.0f};
+ BLI_kdtree_insert(tree, tree_index++, dummy);
+ break;
+ }
+ case SIMEDGE_FACE_ANGLE:
+ {
+ if (BM_edge_face_count_at_most(edge, 2) == 2) {
+ float angle = BM_edge_calc_face_angle_with_imat3(edge, ob_m3_inv);
+ float dummy[3] = {angle, 0.0f, 0.0f};
+ BLI_kdtree_insert(tree, tree_index++, dummy);
+ }
+ break;
+ }
+ case SIMEDGE_SEAM:
+ if (!edge_data_value_set(edge, BM_ELEM_SEAM, &edge_data_value)) {
+ goto edge_select_all;
+ }
+ break;
+ case SIMEDGE_SHARP:
+ if (!edge_data_value_set(edge, BM_ELEM_SMOOTH, &edge_data_value)) {
+ goto edge_select_all;
+ }
+ break;
+ case SIMEDGE_FREESTYLE:
+ {
+ FreestyleEdge *fedge;
+ fedge = CustomData_bmesh_get(&bm->edata, edge->head.data, CD_FREESTYLE_EDGE);
+ if ((fedge == NULL) || ((fedge->flag & FREESTYLE_EDGE_MARK) == 0)) {
+ edge_data_value |= SIMEDGE_DATA_FALSE;
+ }
+ else {
+ edge_data_value |= SIMEDGE_DATA_TRUE;
+ }
+ if (edge_data_value == SIMEDGE_DATA_ALL) {
+ goto edge_select_all;
+ }
+ break;
+ }
+ case SIMEDGE_CREASE:
+ case SIMEDGE_BEVEL:
+ {
+ const float *value = CustomData_bmesh_get(&bm->edata, edge->head.data, custom_data_type);
+ float dummy[3] = {*value, 0.0f, 0.0f};
+ BLI_kdtree_insert(tree, tree_index++, dummy);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ BLI_assert((type != SIMEDGE_FREESTYLE) || (edge_data_value != SIMEDGE_DATA_NONE));
+
+ if (tree != NULL) {
+ BLI_kdtree_balance(tree);
+ }
+
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(ob);
+ BMesh *bm = em->bm;
+ bool changed = false;
+
+ bool has_custom_data_layer = false;
+ switch (type) {
+ case SIMEDGE_FREESTYLE:
+ {
+ has_custom_data_layer = CustomData_has_layer(&bm->edata, CD_FREESTYLE_EDGE);
+ if ((edge_data_value == SIMEDGE_DATA_TRUE) && !has_custom_data_layer) {
+ continue;
+ }
+ break;
+ }
+ case SIMEDGE_CREASE:
+ case SIMEDGE_BEVEL:
+ {
+ has_custom_data_layer = CustomData_has_layer(&bm->edata, custom_data_type);
+ if (!has_custom_data_layer) {
+ /* Proceed only if we have to select all the edges that have custom data value of 0.0f.
+ * In this case we will just select all the edges.
+ * Otherwise continue the for loop. */
+ if (!ED_select_similar_compare_float_tree(tree, 0.0f, thresh, compare)) {
+ continue;
+ }
+ }
+ }
+ }
+
+ float ob_m3[3][3], ob_m3_inv[3][3];
+ copy_m3_m4(ob_m3, ob->obmat);
+ invert_m3_m3(ob_m3_inv, ob_m3);
+
+ BMEdge *edge; /* Mesh edge. */
+ BMIter iter; /* Selected edges iterator. */
+
+ BM_ITER_MESH (edge, &iter, bm, BM_EDGES_OF_MESH) {
+ if (!BM_elem_flag_test(edge, BM_ELEM_SELECT) &&
+ !BM_elem_flag_test(edge, BM_ELEM_HIDDEN))
+ {
+ bool select = false;
+ switch (type) {
+ case SIMEDGE_FACE:
+ {
+ const int num_faces = BM_edge_face_count(edge);
+ GSetIterator gs_iter;
+ GSET_ITER(gs_iter, gset) {
+ const int num_faces_iter = POINTER_AS_INT(BLI_gsetIterator_getKey(&gs_iter));
+ const int delta_i = num_faces - num_faces_iter;
+ if (mesh_select_similar_compare_int(delta_i, compare)) {
+ select = true;
+ break;
+ }
+ }
+ break;
+ }
+ case SIMEDGE_DIR:
+ {
+ float dir[3];
+ edge_pos_direction_worldspace_get(ob, edge, dir);
+
+ /* We are treating the direction as coordinates, the "nearest" one will
+ * also be the one closest to the intended direction. */
+ KDTreeNearest nearest;
+ if (BLI_kdtree_find_nearest(tree, dir, &nearest) != -1) {
+ if (angle_normalized_v3v3(dir, nearest.co) <= thresh_radians) {
+ select = true;
+ }
+ }
+ break;
+ }
+ case SIMEDGE_LENGTH:
+ {
+ float length = edge_length_squared_worldspace_get(ob, edge);
+ if (ED_select_similar_compare_float_tree(tree, length, thresh, compare)) {
+ select = true;
+ }
+ break;
+ }
+ case SIMEDGE_FACE_ANGLE:
+ {
+ if (BM_edge_face_count_at_most(edge, 2) == 2) {
+ float angle = BM_edge_calc_face_angle_with_imat3(edge, ob_m3_inv);
+ if (ED_select_similar_compare_float_tree(tree, angle, thresh, SIM_CMP_EQ)) {
+ select = true;
+ }
+ }
+ break;
+ }
+ case SIMEDGE_SEAM:
+ if ((BM_elem_flag_test(edge, BM_ELEM_SEAM) != 0) ==
+ ((edge_data_value & SIMEDGE_DATA_TRUE) != 0))
+ {
+ select = true;
+ }
+ break;
+ case SIMEDGE_SHARP:
+ if ((BM_elem_flag_test(edge, BM_ELEM_SMOOTH) != 0) ==
+ ((edge_data_value & SIMEDGE_DATA_TRUE) != 0))
+ {
+ select = true;
+ }
+ break;
+ case SIMEDGE_FREESTYLE:
+ {
+ FreestyleEdge *fedge;
+
+ if (!has_custom_data_layer) {
+ BLI_assert(edge_data_value == SIMEDGE_DATA_FALSE);
+ select = true;
+ break;
+ }
+
+ fedge = CustomData_bmesh_get(&bm->edata, edge->head.data, CD_FREESTYLE_EDGE);
+ if (((fedge != NULL) && (fedge->flag & FREESTYLE_EDGE_MARK)) ==
+ ((edge_data_value & SIMEDGE_DATA_TRUE) != 0))
+ {
+ select = true;
+ }
+ break;
+ }
+ case SIMEDGE_CREASE:
+ case SIMEDGE_BEVEL:
+ {
+ if (!has_custom_data_layer) {
+ select = true;
+ break;
+ }
+
+ const float *value = CustomData_bmesh_get(&bm->edata, edge->head.data, custom_data_type);
+ if (ED_select_similar_compare_float_tree(tree, *value, thresh, compare)) {
+ select = true;
+ }
+ break;
+ }
+ }
+
+ if (select) {
+ BM_edge_select_set(bm, edge, true);
+ changed = true;
+ }
+ }
+ }
+
+ if (changed) {
+ EDBM_selectmode_flush(em);
+ EDBM_update_generic(em, false, false);
+ }
+ }
+
+ if (false) {
+edge_select_all:
+ BLI_assert(ELEM(type,
+ SIMEDGE_SEAM,
+ SIMEDGE_SHARP,
+ SIMEDGE_FREESTYLE
+ ));
+
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(ob);
+ BMesh *bm = em->bm;
+
+ BMEdge *edge; /* Mesh edge. */
+ BMIter iter; /* Selected edges iterator. */
+
+ BM_ITER_MESH (edge, &iter, bm, BM_EDGES_OF_MESH) {
+ if (!BM_elem_flag_test(edge, BM_ELEM_SELECT)) {
+ BM_edge_select_set(bm, edge, true);
+ }
+ }
+ EDBM_selectmode_flush(em);
+ EDBM_update_generic(em, false, false);
+ }
+ }
+
+ MEM_freeN(objects);
+ BLI_kdtree_free(tree);
+ if (gset != NULL) {
+ BLI_gset_free(gset, NULL);
+ }
+
+ return OPERATOR_FINISHED;
+}
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Select Similar Vert
+ * \{ */
+
+static int similar_vert_select_exec(bContext *C, wmOperator *op)
+{
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+
+ /* get the type from RNA */
+ const int type = RNA_enum_get(op->ptr, "type");
+ const float thresh = RNA_float_get(op->ptr, "threshold");
+ const float thresh_radians = thresh * (float)M_PI + FLT_EPSILON;
+ const int compare = RNA_enum_get(op->ptr, "compare");
+
+ int tot_verts_selected_all = 0;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(ob);
+ tot_verts_selected_all += em->bm->totvertsel;
+ }
+
+ if (tot_verts_selected_all == 0) {
+ BKE_report(op->reports, RPT_ERROR, "No vertex selected");
+ MEM_freeN(objects);
+ return OPERATOR_CANCELLED;
+ }
+
+ KDTree *tree = NULL;
+ GSet *gset = NULL;
+
+ switch (type) {
+ case SIMVERT_NORMAL:
+ tree = BLI_kdtree_new(tot_verts_selected_all);
+ break;
+ case SIMVERT_EDGE:
+ case SIMVERT_FACE:
+ gset = BLI_gset_ptr_new("Select similar vertex: edge/face");
+ break;
+ case SIMVERT_VGROUP:
+ gset = BLI_gset_str_new("Select similar vertex: vertex groups");
+ break;
+ }
+
+ int normal_tree_index = 0;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(ob);
+ BMesh *bm = em->bm;
+ int cd_dvert_offset = -1;
+ int dvert_selected = 0;
+ invert_m4_m4(ob->imat, ob->obmat);
+
+ if (bm->totvertsel == 0) {
+ continue;
+ }
+
+ if (type == SIMVERT_VGROUP) {
+ cd_dvert_offset = CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT);
+ if (cd_dvert_offset == -1) {
+ continue;
+ }
+ }
+
+ BMVert *vert; /* Mesh vertex. */
+ BMIter iter; /* Selected verts iterator. */
+
+ BM_ITER_MESH (vert, &iter, bm, BM_VERTS_OF_MESH) {
+ if (BM_elem_flag_test(vert, BM_ELEM_SELECT)) {
+ switch (type) {
+ case SIMVERT_FACE:
+ BLI_gset_add(gset, POINTER_FROM_INT(BM_vert_face_count(vert)));
+ break;
+ case SIMVERT_EDGE:
+ BLI_gset_add(gset, POINTER_FROM_INT(BM_vert_edge_count(vert)));
+ break;
+ case SIMVERT_NORMAL:
+ {
+ float normal[3];
+ copy_v3_v3(normal, vert->no);
+ mul_transposed_mat3_m4_v3(ob->imat, normal);
+ normalize_v3(normal);
+
+ BLI_kdtree_insert(tree, normal_tree_index++, normal);
+ break;
+ }
+ case SIMVERT_VGROUP:
+ {
+ MDeformVert *dvert = BM_ELEM_CD_GET_VOID_P(vert, cd_dvert_offset);
+ MDeformWeight *dw = dvert->dw;
+
+ for (int i = 0; i < dvert->totweight; i++, dw++) {
+ if (dw->weight > 0.0f) {
+ dvert_selected |= (1 << dw->def_nr);
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ if (type == SIMVERT_VGROUP) {
+ /* We store the names of the vertex groups, so we can select
+ * vertex groups with the same name in different objects. */
+ const int dvert_tot = BLI_listbase_count(&ob->defbase);
+ for (int i = 0; i < dvert_tot; i++) {
+ if (dvert_selected & (1 << i)) {
+ bDeformGroup *dg = BLI_findlink(&ob->defbase, i);
+ BLI_gset_add(gset, dg->name);
+ }
+ }
+ }
+ }
+
+ if (type == SIMVERT_VGROUP) {
+ if (BLI_gset_len(gset) == 0) {
+ BKE_report(op->reports,
+ RPT_INFO,
+ "No vertex group among the selected vertices");
+ }
+ }
+
+ /* Remove duplicated entries. */
+ if (tree != NULL) {
+ BLI_kdtree_balance(tree);
+ }
+
+ /* Run .the BM operators. */
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(ob);
+ BMesh *bm = em->bm;
+ bool changed = false;
+ int cd_dvert_offset = -1;
+ int dvert_selected = 0;
+
+ if (type == SIMVERT_VGROUP) {
+ cd_dvert_offset = CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT);
+ if (cd_dvert_offset == -1) {
+ continue;
+ }
+
+ /* We map back the names of the vertex groups to their corresponsing indices
+ * for this object. This is fast, and keep the logic for each vertex very simple. */
+ GSetIterator gs_iter;
+ GSET_ITER(gs_iter, gset) {
+ const char *name = BLI_gsetIterator_getKey(&gs_iter);
+ int vgroup_id = BLI_findstringindex(&ob->defbase,
+ name,
+ offsetof(bDeformGroup, name));
+ if (vgroup_id != -1) {
+ dvert_selected |= (1 << vgroup_id);
+ }
+ }
+ if (dvert_selected == 0) {
+ continue;
+ }
+ }
+
+ BMVert *vert; /* Mesh vertex. */
+ BMIter iter; /* Selected verts iterator. */
+
+ BM_ITER_MESH (vert, &iter, bm, BM_VERTS_OF_MESH) {
+ if (!BM_elem_flag_test(vert, BM_ELEM_SELECT) &&
+ !BM_elem_flag_test(vert, BM_ELEM_HIDDEN))
+ {
+ bool select = false;
+ switch (type) {
+ case SIMVERT_EDGE:
+ {
+ const int num_edges = BM_vert_edge_count(vert);
+ GSetIterator gs_iter;
+ GSET_ITER(gs_iter, gset) {
+ const int num_edges_iter = POINTER_AS_INT(BLI_gsetIterator_getKey(&gs_iter));
+ const int delta_i = num_edges - num_edges_iter;
+ if (mesh_select_similar_compare_int(delta_i, compare)) {
+ select = true;
+ break;
+ }
+ }
+ break;
+ }
+ case SIMVERT_FACE:
+ {
+ const int num_faces = BM_vert_face_count(vert);
+ GSetIterator gs_iter;
+ GSET_ITER(gs_iter, gset) {
+ const int num_faces_iter = POINTER_AS_INT(BLI_gsetIterator_getKey(&gs_iter));
+ const int delta_i = num_faces - num_faces_iter;
+ if (mesh_select_similar_compare_int(delta_i, compare)) {
+ select = true;
+ break;
+ }
+ }
+ break;
+ }
+ case SIMVERT_NORMAL:
+ {
+ float normal[3];
+ copy_v3_v3(normal, vert->no);
+ mul_transposed_mat3_m4_v3(ob->imat, normal);
+ normalize_v3(normal);
+
+ /* We are treating the normals as coordinates, the "nearest" one will
+ * also be the one closest to the angle. */
+ KDTreeNearest nearest;
+ if (BLI_kdtree_find_nearest(tree, normal, &nearest) != -1) {
+ if (angle_normalized_v3v3(normal, nearest.co) <= thresh_radians) {
+ select = true;
+ }
+ }
+ break;
+ }
+ case SIMVERT_VGROUP:
+ {
+ MDeformVert *dvert = BM_ELEM_CD_GET_VOID_P(vert, cd_dvert_offset);
+ MDeformWeight *dw = dvert->dw;
+
+ for (int i = 0; i < dvert->totweight; i++, dw++) {
+ if (dw->weight > 0.0f) {
+ if (dvert_selected & (1 << dw->def_nr)) {
+ select = true;
+ break;
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ if (select) {
+ BM_vert_select_set(bm, vert, true);
+ changed = true;
+ }
+ }
+ }
+
+ if (changed) {
+ EDBM_selectmode_flush(em);
+ EDBM_update_generic(em, false, false);
+ }
+ }
+
+ MEM_freeN(objects);
+ BLI_kdtree_free(tree);
+ if (gset != NULL) {
+ BLI_gset_free(gset, NULL);
+ }
+
+ return OPERATOR_FINISHED;
+}
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Select Similar Operator
+ * \{ */
+
+static int edbm_select_similar_exec(bContext *C, wmOperator *op)
+{
+ ToolSettings *ts = CTX_data_tool_settings(C);
+ PropertyRNA *prop = RNA_struct_find_property(op->ptr, "threshold");
+
+ const int type = RNA_enum_get(op->ptr, "type");
+
+ if (!RNA_property_is_set(op->ptr, prop)) {
+ RNA_property_float_set(op->ptr, prop, ts->select_thresh);
+ }
+ else {
+ ts->select_thresh = RNA_property_float_get(op->ptr, prop);
+ }
+
+ if (type < 100) return similar_vert_select_exec(C, op);
+ else if (type < 200) return similar_edge_select_exec(C, op);
+ else return similar_face_select_exec(C, op);
+}
+
+static const EnumPropertyItem *select_similar_type_itemf(
+ bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop),
+ bool *r_free)
+{
+ Object *obedit;
+
+ if (!C) /* needed for docs and i18n tools */
+ return prop_similar_types;
+
+ obedit = CTX_data_edit_object(C);
+
+ if (obedit && obedit->type == OB_MESH) {
+ EnumPropertyItem *item = NULL;
+ int a, totitem = 0;
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+
+ if (em->selectmode & SCE_SELECT_VERTEX) {
+ for (a = SIMVERT_NORMAL; a < SIMEDGE_LENGTH; a++) {
+ RNA_enum_items_add_value(&item, &totitem, prop_similar_types, a);
+ }
+ }
+ else if (em->selectmode & SCE_SELECT_EDGE) {
+ for (a = SIMEDGE_LENGTH; a < SIMFACE_MATERIAL; a++) {
+ RNA_enum_items_add_value(&item, &totitem, prop_similar_types, a);
+ }
+ }
+ else if (em->selectmode & SCE_SELECT_FACE) {
+#ifdef WITH_FREESTYLE
+ const int a_end = SIMFACE_FREESTYLE;
+#else
+ const int a_end = SIMFACE_FACEMAP;
+#endif
+ for (a = SIMFACE_MATERIAL; a <= a_end; a++) {
+ RNA_enum_items_add_value(&item, &totitem, prop_similar_types, a);
+ }
+ }
+ RNA_enum_item_end(&item, &totitem);
+
+ *r_free = true;
+
+ return item;
+ }
+
+ return prop_similar_types;
+}
+
+void MESH_OT_select_similar(wmOperatorType *ot)
+{
+ PropertyRNA *prop;
+
+ /* identifiers */
+ ot->name = "Select Similar";
+ ot->idname = "MESH_OT_select_similar";
+ ot->description = "Select similar vertices, edges or faces by property types";
+
+ /* api callbacks */
+ ot->invoke = WM_menu_invoke;
+ ot->exec = edbm_select_similar_exec;
+ ot->poll = ED_operator_editmesh;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* properties */
+ prop = ot->prop = RNA_def_enum(ot->srna, "type", prop_similar_types, SIMVERT_NORMAL, "Type", "");
+ RNA_def_enum_funcs(prop, select_similar_type_itemf);
+
+ RNA_def_enum(ot->srna, "compare", prop_similar_compare_types, SIM_CMP_EQ, "Compare", "");
+
+ RNA_def_float(ot->srna, "threshold", 0.0f, 0.0f, 1.0f, "Threshold", "", 0.0f, 1.0f);
+}
+
+/** \} */
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 4fe2351ef7d..35ab7fa9c55 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -42,7 +42,7 @@
#include "DNA_scene_types.h"
#include "BLI_bitmap.h"
-#include "BLI_heap.h"
+#include "BLI_heap_simple.h"
#include "BLI_listbase.h"
#include "BLI_linklist.h"
#include "BLI_linklist_stack.h"
@@ -52,15 +52,17 @@
#include "BLI_sort_utils.h"
#include "BLI_string.h"
-#include "BKE_layer.h"
-#include "BKE_material.h"
+#include "BKE_editmesh.h"
#include "BKE_context.h"
#include "BKE_deform.h"
-#include "BKE_report.h"
-#include "BKE_texture.h"
+#include "BKE_key.h"
+#include "BKE_layer.h"
+#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_material.h"
#include "BKE_mesh.h"
-#include "BKE_editmesh.h"
+#include "BKE_report.h"
+#include "BKE_texture.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
@@ -252,14 +254,14 @@ static int edbm_subdivide_edge_ring_exec(bContext *C, wmOperator *op)
ViewLayer *view_layer = CTX_data_view_layer(C);
uint objects_len = 0;
- Object * *objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
struct EdgeRingOpSubdProps op_props;
mesh_operator_edgering_props_get(op, &op_props);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object * obedit = objects[ob_index];
- BMEditMesh * em = BKE_editmesh_from_object(obedit);
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
if (em->bm->totedgesel == 0) {
continue;
@@ -987,13 +989,6 @@ static int edbm_mark_seam_exec(bContext *C, wmOperator *op)
continue;
}
- Mesh *me = ((Mesh *)obedit->data);
-
- /* auto-enable seams drawing */
- if (clear == 0) {
- me->drawflag |= ME_DRAWSEAMS;
- }
-
if (clear) {
BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
if (!BM_elem_flag_test(eed, BM_ELEM_SELECT) || BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
@@ -1062,17 +1057,11 @@ static int edbm_mark_sharp_exec(bContext *C, wmOperator *op)
Object *obedit = objects[ob_index];
BMEditMesh *em = BKE_editmesh_from_object(obedit);
BMesh *bm = em->bm;
- Mesh *me = ((Mesh *)obedit->data);
if (bm->totedgesel == 0) {
continue;
}
- /* auto-enable sharp edge drawing */
- if (clear == 0) {
- me->drawflag |= ME_DRAWSHARP;
- }
-
BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
if (use_verts) {
if (!(BM_elem_flag_test(eed->v1, BM_ELEM_SELECT) || BM_elem_flag_test(eed->v2, BM_ELEM_SELECT))) {
@@ -1128,11 +1117,6 @@ static bool edbm_connect_vert_pair(BMEditMesh *em, wmOperator *op)
BMVert **verts;
bool checks_succeded = true;
- /* sanity check */
- if (!is_pair) {
- return false;
- }
-
verts = MEM_mallocN(sizeof(*verts) * verts_len, __func__);
{
BMIter iter;
@@ -1922,7 +1906,7 @@ static int edbm_edge_rotate_selected_exec(bContext *C, wmOperator *op)
BMO_slot_buffer_hflag_disable(em->bm, bmop.slots_in, "edges", BM_EDGE, BM_ELEM_SELECT, true);
BMO_op_exec(em->bm, &bmop);
- /* edges may rotate into hidden vertices, if this does _not_ run we get an ilogical state */
+ /* edges may rotate into hidden vertices, if this does _not_ run we get an illogical state */
BMO_slot_buffer_hflag_disable(em->bm, bmop.slots_out, "edges.out", BM_EDGE, BM_ELEM_HIDDEN, true);
BMO_slot_buffer_hflag_enable(em->bm, bmop.slots_out, "edges.out", BM_EDGE, BM_ELEM_SELECT, true);
@@ -2229,7 +2213,7 @@ void MESH_OT_vertices_smooth(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
- RNA_def_float(ot->srna, "factor", 0.5f, -10.0f, 10.0f, "Smoothing", "Smoothing factor", 0.0f, 1.0f);
+ ot->prop = RNA_def_float(ot->srna, "factor", 0.5f, -10.0f, 10.0f, "Smoothing", "Smoothing factor", 0.0f, 1.0f);
RNA_def_int(ot->srna, "repeat", 1, 1, 1000, "Repeat", "Number of times to smooth the mesh", 1, 100);
WM_operatortype_props_advanced_begin(ot);
@@ -2247,59 +2231,91 @@ void MESH_OT_vertices_smooth(wmOperatorType *ot)
static int edbm_do_smooth_laplacian_vertex_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
- Mesh *me = obedit->data;
- bool use_topology = (me->editflag & ME_EDIT_MIRROR_TOPO) != 0;
- bool usex = true, usey = true, usez = true, preserve_volume = true;
- int i, repeat;
- float lambda_factor;
- float lambda_border;
BMIter fiter;
BMFace *f;
+ int tot_invalid = 0;
+ int tot_unselected = 0;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
- /* Check if select faces are triangles */
- BM_ITER_MESH (f, &fiter, em->bm, BM_FACES_OF_MESH) {
- if (BM_elem_flag_test(f, BM_ELEM_SELECT)) {
- if (f->len > 4) {
- BKE_report(op->reports, RPT_WARNING, "Selected faces must be triangles or quads");
- return OPERATOR_CANCELLED;
+ const float lambda_factor = RNA_float_get(op->ptr, "lambda_factor");
+ const float lambda_border = RNA_float_get(op->ptr, "lambda_border");
+ const bool usex = RNA_boolean_get(op->ptr, "use_x");
+ const bool usey = RNA_boolean_get(op->ptr, "use_y");
+ const bool usez = RNA_boolean_get(op->ptr, "use_z");
+ const bool preserve_volume = RNA_boolean_get(op->ptr, "preserve_volume");
+ int repeat = RNA_int_get(op->ptr, "repeat");
+
+ if (!repeat) {
+ repeat = 1;
+ }
+
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ Mesh *me = obedit->data;
+ bool use_topology = (me->editflag & ME_EDIT_MIRROR_TOPO) != 0;
+
+ if (em->bm->totvertsel == 0) {
+ tot_unselected++;
+ tot_invalid++;
+ continue;
+ }
+
+ bool is_invalid = false;
+ /* Check if select faces are triangles. */
+ BM_ITER_MESH (f, &fiter, em->bm, BM_FACES_OF_MESH) {
+ if (BM_elem_flag_test(f, BM_ELEM_SELECT)) {
+ if (f->len > 4) {
+ tot_invalid++;
+ is_invalid = true;
+ break;
+ }
}
}
- }
+ if (is_invalid) {
+ continue;
+ }
- /* mirror before smooth */
- if (((Mesh *)obedit->data)->editflag & ME_EDIT_MIRROR_X) {
- EDBM_verts_mirror_cache_begin(em, 0, false, true, use_topology);
- }
+ /* Mirror before smooth. */
+ if (((Mesh *)obedit->data)->editflag & ME_EDIT_MIRROR_X) {
+ EDBM_verts_mirror_cache_begin(em, 0, false, true, use_topology);
+ }
- repeat = RNA_int_get(op->ptr, "repeat");
- lambda_factor = RNA_float_get(op->ptr, "lambda_factor");
- lambda_border = RNA_float_get(op->ptr, "lambda_border");
- usex = RNA_boolean_get(op->ptr, "use_x");
- usey = RNA_boolean_get(op->ptr, "use_y");
- usez = RNA_boolean_get(op->ptr, "use_z");
- preserve_volume = RNA_boolean_get(op->ptr, "preserve_volume");
- if (!repeat)
- repeat = 1;
+ bool failed_repeat_loop = false;
+ for (int i = 0; i < repeat; i++) {
+ if (!EDBM_op_callf(
+ em, op,
+ "smooth_laplacian_vert verts=%hv lambda_factor=%f lambda_border=%f use_x=%b use_y=%b use_z=%b preserve_volume=%b",
+ BM_ELEM_SELECT, lambda_factor, lambda_border, usex, usey, usez, preserve_volume))
+ {
+ failed_repeat_loop = true;
+ break;
+ }
+ }
+ if (failed_repeat_loop) {
+ continue;
+ }
- for (i = 0; i < repeat; i++) {
- if (!EDBM_op_callf(
- em, op,
- "smooth_laplacian_vert verts=%hv lambda_factor=%f lambda_border=%f use_x=%b use_y=%b use_z=%b preserve_volume=%b",
- BM_ELEM_SELECT, lambda_factor, lambda_border, usex, usey, usez, preserve_volume))
- {
- return OPERATOR_CANCELLED;
+ /* Apply mirror. */
+ if (((Mesh *)obedit->data)->editflag & ME_EDIT_MIRROR_X) {
+ EDBM_verts_mirror_apply(em, BM_ELEM_SELECT, 0);
+ EDBM_verts_mirror_cache_end(em);
}
- }
- /* apply mirror */
- if (((Mesh *)obedit->data)->editflag & ME_EDIT_MIRROR_X) {
- EDBM_verts_mirror_apply(em, BM_ELEM_SELECT, 0);
- EDBM_verts_mirror_cache_end(em);
+ EDBM_update_generic(em, true, false);
}
+ MEM_freeN(objects);
- EDBM_update_generic(em, true, false);
+ if (tot_unselected == objects_len) {
+ BKE_report(op->reports, RPT_WARNING, "No selected vertex");
+ return OPERATOR_CANCELLED;
+ }
+ else if (tot_invalid == objects_len) {
+ BKE_report(op->reports, RPT_WARNING, "Selected faces must be triangles or quads");
+ return OPERATOR_CANCELLED;
+ }
return OPERATOR_FINISHED;
}
@@ -2355,12 +2371,12 @@ static void mesh_set_smooth_faces(BMEditMesh *em, short smooth)
static int edbm_faces_shade_smooth_exec(bContext *C, wmOperator *UNUSED(op))
{
- ViewLayer * view_layer = CTX_data_view_layer(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
uint objects_len = 0;
- Object * *objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object * obedit = objects[ob_index];
- BMEditMesh * em = BKE_editmesh_from_object(obedit);
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
if (em->bm->totfacesel == 0) {
continue;
@@ -2918,7 +2934,7 @@ static int edbm_remove_doubles_exec(bContext *C, wmOperator *op)
BMOperator bmop;
const int totvert_orig = em->bm->totvert;
- /* avoid loosing selection state (select -> tags) */
+ /* avoid losing selection state (select -> tags) */
char htype_select;
if (em->selectmode & SCE_SELECT_VERTEX) htype_select = BM_VERT;
else if (em->selectmode & SCE_SELECT_EDGE) htype_select = BM_EDGE;
@@ -3001,48 +3017,69 @@ void MESH_OT_remove_doubles(wmOperatorType *ot)
* \{ */
/* BMESH_TODO this should be properly encapsulated in a bmop. but later.*/
-static void shape_propagate(BMEditMesh *em, wmOperator *op)
+static bool shape_propagate(BMEditMesh *em)
{
BMIter iter;
BMVert *eve = NULL;
float *co;
- int i, totshape = CustomData_number_of_layers(&em->bm->vdata, CD_SHAPEKEY);
+ int totshape = CustomData_number_of_layers(&em->bm->vdata, CD_SHAPEKEY);
if (!CustomData_has_layer(&em->bm->vdata, CD_SHAPEKEY)) {
- BKE_report(op->reports, RPT_ERROR, "Mesh does not have shape keys");
- return;
+ return false;
}
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
- if (!BM_elem_flag_test(eve, BM_ELEM_SELECT) || BM_elem_flag_test(eve, BM_ELEM_HIDDEN))
+ if (!BM_elem_flag_test(eve, BM_ELEM_SELECT) || BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
continue;
+ }
- for (i = 0; i < totshape; i++) {
+ for (int i = 0; i < totshape; i++) {
co = CustomData_bmesh_get_n(&em->bm->vdata, eve->head.data, CD_SHAPEKEY, i);
copy_v3_v3(co, eve->co);
}
}
-
-#if 0
- //TAG Mesh Objects that share this data
- for (base = scene->base.first; base; base = base->next) {
- if (base->object && base->object->data == me) {
- DEG_id_tag_update(&base->object->id, OB_RECALC_DATA);
- }
- }
-#endif
+ return true;
}
-
static int edbm_shape_propagate_to_all_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- Mesh *me = obedit->data;
- BMEditMesh *em = me->edit_btmesh;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ int tot_shapekeys = 0;
+ int tot_selected_verts_objects = 0;
- shape_propagate(em, op);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Mesh *me = obedit->data;
+ BMEditMesh *em = me->edit_btmesh;
- EDBM_update_generic(em, false, false);
+ if (em->bm->totvertsel == 0) {
+ continue;
+ }
+ tot_selected_verts_objects++;
+
+ if (shape_propagate(em)) {
+ tot_shapekeys++;
+ }
+
+ EDBM_update_generic(em, false, false);
+ }
+ MEM_freeN(objects);
+
+ if (tot_selected_verts_objects == 0) {
+ BKE_report(op->reports, RPT_ERROR, "No selected vertex");
+ return OPERATOR_CANCELLED;
+ }
+ else if (tot_shapekeys == 0) {
+ BKE_report(
+ op->reports,
+ RPT_ERROR,
+ objects_len > 1 ?
+ "Meshes do not have shape keys" :
+ "Mesh does not have shape keys");
+ return OPERATOR_CANCELLED;
+ }
return OPERATOR_FINISHED;
}
@@ -3072,55 +3109,95 @@ void MESH_OT_shape_propagate_to_all(wmOperatorType *ot)
/* BMESH_TODO this should be properly encapsulated in a bmop. but later.*/
static int edbm_blend_from_shape_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- Mesh *me = obedit->data;
- Key *key = me->key;
- KeyBlock *kb = NULL;
- BMEditMesh *em = me->edit_btmesh;
+ Object *obedit_ref = CTX_data_edit_object(C);
+ Mesh *me_ref = obedit_ref->data;
+ Key *key_ref = me_ref->key;
+ KeyBlock *kb_ref = NULL;
+ BMEditMesh *em_ref = me_ref->edit_btmesh;
BMVert *eve;
BMIter iter;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
float co[3], *sco;
- int totshape;
+ int totshape_ref = 0;
const float blend = RNA_float_get(op->ptr, "blend");
- const int shape = RNA_enum_get(op->ptr, "shape");
+ int shape_ref = RNA_enum_get(op->ptr, "shape");
const bool use_add = RNA_boolean_get(op->ptr, "add");
- /* sanity check */
- totshape = CustomData_number_of_layers(&em->bm->vdata, CD_SHAPEKEY);
- if (totshape == 0 || shape < 0 || shape >= totshape)
- return OPERATOR_CANCELLED;
+ /* Sanity check. */
+ totshape_ref = CustomData_number_of_layers(&em_ref->bm->vdata, CD_SHAPEKEY);
- /* get shape key - needed for finding reference shape (for add mode only) */
- if (key) {
- kb = BLI_findlink(&key->block, shape);
+ if (totshape_ref == 0 || shape_ref < 0) {
+ BKE_report(op->reports, RPT_ERROR, "Active mesh does not have shape keys");
+ return OPERATOR_CANCELLED;
+ }
+ else if (shape_ref >= totshape_ref) {
+ /* This case occurs if operator was used before on object with more keys than current one. */
+ shape_ref = 0; /* default to basis */
}
- /* perform blending on selected vertices*/
- BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
- if (!BM_elem_flag_test(eve, BM_ELEM_SELECT) || BM_elem_flag_test(eve, BM_ELEM_HIDDEN))
- continue;
+ /* Get shape key - needed for finding reference shape (for add mode only). */
+ if (key_ref) {
+ kb_ref = BLI_findlink(&key_ref->block, shape_ref);
+ }
- /* get coordinates of shapekey we're blending from */
- sco = CustomData_bmesh_get_n(&em->bm->vdata, eve->head.data, CD_SHAPEKEY, shape);
- copy_v3_v3(co, sco);
+ int tot_selected_verts_objects = 0;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ Mesh *me = obedit->data;
+ Key *key = me->key;
+ KeyBlock *kb = NULL;
+ BMEditMesh *em = me->edit_btmesh;
+ int shape;
- if (use_add) {
- /* in add mode, we add relative shape key offset */
- if (kb) {
- const float *rco = CustomData_bmesh_get_n(&em->bm->vdata, eve->head.data, CD_SHAPEKEY, kb->relative);
- sub_v3_v3v3(co, co, rco);
- }
+ if (em->bm->totvertsel == 0) {
+ continue;
+ }
+ tot_selected_verts_objects++;
- madd_v3_v3fl(eve->co, co, blend);
+ if (!key) {
+ continue;
}
else {
- /* in blend mode, we interpolate to the shape key */
- interp_v3_v3v3(eve->co, eve->co, co, blend);
+ kb = BKE_keyblock_find_name(key, kb_ref->name);
+ shape = BLI_findindex(&key->block, kb);
+ }
+
+ if (kb) {
+ /* Perform blending on selected vertices. */
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
+ if (!BM_elem_flag_test(eve, BM_ELEM_SELECT) || BM_elem_flag_test(eve, BM_ELEM_HIDDEN))
+ continue;
+
+ /* Get coordinates of shapekey we're blending from. */
+ sco = CustomData_bmesh_get_n(&em->bm->vdata, eve->head.data, CD_SHAPEKEY, shape);
+ copy_v3_v3(co, sco);
+
+ if (use_add) {
+ /* In add mode, we add relative shape key offset. */
+ if (kb) {
+ const float *rco = CustomData_bmesh_get_n(&em->bm->vdata, eve->head.data, CD_SHAPEKEY, kb->relative);
+ sub_v3_v3v3(co, co, rco);
+ }
+
+ madd_v3_v3fl(eve->co, co, blend);
+ }
+ else {
+ /* In blend mode, we interpolate to the shape key. */
+ interp_v3_v3v3(eve->co, eve->co, co, blend);
+ }
+ }
+ EDBM_update_generic(em, true, false);
}
}
+ MEM_freeN(objects);
- EDBM_update_generic(em, true, false);
+ if (tot_selected_verts_objects == 0) {
+ BKE_report(op->reports, RPT_ERROR, "No selected vertex");
+ return OPERATOR_CANCELLED;
+ }
return OPERATOR_FINISHED;
}
@@ -3335,7 +3412,7 @@ static float bm_edge_seg_isect(
b2 = ((x22 * y21) - (x21 * y22)) / xdiff2;
}
else {
- m2 = MAXSLOPE; /* Verticle slope */
+ m2 = MAXSLOPE; /* Vertical slope */
b2 = x22;
}
@@ -5355,6 +5432,7 @@ static int edbm_dissolve_degenerate_exec(bContext *C, wmOperator *op)
totelem_new[1] += bm->totedge;
totelem_new[2] += bm->totface;
}
+ MEM_freeN(objects);
edbm_report_delete_info(op->reports, totelem_old, totelem_new);
@@ -5544,6 +5622,7 @@ static int bmelemsort_comp(const void *v1, const void *v2)
/* Reorders vertices/edges/faces using a given methods. Loops are not supported. */
static void sort_bmelem_flag(
+ bContext *C,
Scene *scene, Object *ob,
View3D *v3d, RegionView3D *rv3d,
const int types, const int flag, const int action,
@@ -5968,7 +6047,8 @@ static void sort_bmelem_flag(
}
BM_mesh_remap(em->bm, map[0], map[1], map[2]);
-/* DEG_id_tag_update(ob->data, 0);*/
+ DEG_id_tag_update(ob->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
for (j = 3; j--; ) {
if (map[j])
@@ -5979,7 +6059,8 @@ static void sort_bmelem_flag(
static int edbm_sort_elements_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
- Object *ob = CTX_data_edit_object(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ Object *ob_active = CTX_data_edit_object(C);
/* may be NULL */
View3D *v3d = CTX_wm_view3d(C);
@@ -6003,7 +6084,7 @@ static int edbm_sort_elements_exec(bContext *C, wmOperator *op)
elem_types = RNA_property_enum_get(op->ptr, prop_elem_types);
}
else {
- BMEditMesh *em = BKE_editmesh_from_object(ob);
+ BMEditMesh *em = BKE_editmesh_from_object(ob_active);
if (em->selectmode & SCE_SELECT_VERTEX)
elem_types |= BM_VERT;
if (em->selectmode & SCE_SELECT_EDGE)
@@ -6013,9 +6094,33 @@ static int edbm_sort_elements_exec(bContext *C, wmOperator *op)
RNA_enum_set(op->ptr, "elements", elem_types);
}
- sort_bmelem_flag(
- scene, ob, v3d, rv3d,
- elem_types, BM_ELEM_SELECT, action, use_reverse, seed);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(ob);
+ BMesh *bm = em->bm;
+
+ if (!((elem_types & BM_VERT && bm->totvertsel > 0) ||
+ (elem_types & BM_EDGE && bm->totedgesel > 0) ||
+ (elem_types & BM_FACE && bm->totfacesel > 0)))
+ {
+ continue;
+ }
+
+ int seed_iter = seed;
+
+ /* This gives a consistent result regardless of object order */
+ if (ob_index) {
+ seed_iter += BLI_ghashutil_strhash_p(ob->id.name);
+ }
+
+ sort_bmelem_flag(
+ C, scene, ob, v3d, rv3d,
+ elem_types, BM_ELEM_SELECT, action, use_reverse, seed_iter);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -6146,22 +6251,20 @@ static int edbm_bridge_tag_boundary_edges(BMesh *bm)
return totface_del;
}
-static int edbm_bridge_edge_loops_exec(bContext *C, wmOperator *op)
+static int edbm_bridge_edge_loops_for_single_editmesh(
+ wmOperator *op,
+ BMEditMesh *em,
+ const bool use_pairs,
+ const bool use_cyclic,
+ const bool use_merge,
+ const float merge_factor,
+ const int twist_offset)
{
BMOperator bmop;
- Object *obedit = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
- const int type = RNA_enum_get(op->ptr, "type");
- const bool use_pairs = (type == MESH_BRIDGELOOP_PAIRS);
- const bool use_cyclic = (type == MESH_BRIDGELOOP_CLOSED);
- const bool use_merge = RNA_boolean_get(op->ptr, "use_merge");
- const float merge_factor = RNA_float_get(op->ptr, "merge_factor");
- const int twist_offset = RNA_int_get(op->ptr, "twist_offset");
- const bool use_faces = (em->bm->totfacesel != 0);
char edge_hflag;
-
int totface_del = 0;
BMFace **totface_del_arr = NULL;
+ const bool use_faces = (em->bm->totfacesel != 0);
if (use_faces) {
BMIter iter;
@@ -6184,9 +6287,9 @@ static int edbm_bridge_edge_loops_exec(bContext *C, wmOperator *op)
}
EDBM_op_init(
- em, &bmop, op,
- "bridge_loops edges=%he use_pairs=%b use_cyclic=%b use_merge=%b merge_factor=%f twist_offset=%i",
- edge_hflag, use_pairs, use_cyclic, use_merge, merge_factor, twist_offset);
+ em, &bmop, op,
+ "bridge_loops edges=%he use_pairs=%b use_cyclic=%b use_merge=%b merge_factor=%f twist_offset=%i",
+ edge_hflag, use_pairs, use_cyclic, use_merge, merge_factor, twist_offset);
if (use_faces && totface_del) {
int i;
@@ -6195,9 +6298,9 @@ static int edbm_bridge_edge_loops_exec(bContext *C, wmOperator *op)
BM_elem_flag_enable(totface_del_arr[i], BM_ELEM_TAG);
}
BMO_op_callf(
- em->bm, BMO_FLAG_DEFAULTS,
- "delete geom=%hf context=%i",
- BM_ELEM_TAG, DEL_FACES_KEEP_BOUNDARY);
+ em->bm, BMO_FLAG_DEFAULTS,
+ "delete geom=%hf context=%i",
+ BM_ELEM_TAG, DEL_FACES_KEEP_BOUNDARY);
}
BMO_op_exec(em->bm, &bmop);
@@ -6219,18 +6322,15 @@ static int edbm_bridge_edge_loops_exec(bContext *C, wmOperator *op)
EDBM_mesh_normals_update(em);
BMO_op_initf(
- em->bm, &bmop_subd, 0,
- "subdivide_edgering edges=%S interp_mode=%i cuts=%i smooth=%f "
- "profile_shape=%i profile_shape_factor=%f",
- &bmop, "edges.out", op_props.interp_mode, op_props.cuts, op_props.smooth,
- op_props.profile_shape, op_props.profile_shape_factor
- );
+ em->bm, &bmop_subd, 0,
+ "subdivide_edgering edges=%S interp_mode=%i cuts=%i smooth=%f "
+ "profile_shape=%i profile_shape_factor=%f",
+ &bmop, "edges.out", op_props.interp_mode, op_props.cuts, op_props.smooth,
+ op_props.profile_shape, op_props.profile_shape_factor
+ );
BMO_op_exec(em->bm, &bmop_subd);
-
BMO_slot_buffer_hflag_enable(em->bm, bmop_subd.slots_out, "faces.out", BM_FACE, BM_ELEM_SELECT, true);
-
BMO_op_finish(em->bm, &bmop_subd);
-
}
}
}
@@ -6239,15 +6339,44 @@ static int edbm_bridge_edge_loops_exec(bContext *C, wmOperator *op)
MEM_freeN(totface_del_arr);
}
- if (!EDBM_op_finish(em, &bmop, op, true)) {
- /* grr, need to return finished so the user can select different options */
- //return OPERATOR_CANCELLED;
- return OPERATOR_FINISHED;
- }
- else {
+ if (EDBM_op_finish(em, &bmop, op, true)) {
EDBM_update_generic(em, true, true);
- return OPERATOR_FINISHED;
}
+
+ /* Always return finished so the user can select different options. */
+ return OPERATOR_FINISHED;
+}
+
+static int edbm_bridge_edge_loops_exec(bContext *C, wmOperator *op)
+{
+ const int type = RNA_enum_get(op->ptr, "type");
+ const bool use_pairs = (type == MESH_BRIDGELOOP_PAIRS);
+ const bool use_cyclic = (type == MESH_BRIDGELOOP_CLOSED);
+ const bool use_merge = RNA_boolean_get(op->ptr, "use_merge");
+ const float merge_factor = RNA_float_get(op->ptr, "merge_factor");
+ const int twist_offset = RNA_int_get(op->ptr, "twist_offset");
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+
+ if (em->bm->totvertsel == 0) {
+ continue;
+ }
+
+ edbm_bridge_edge_loops_for_single_editmesh(op,
+ em,
+ use_pairs,
+ use_cyclic,
+ use_merge,
+ merge_factor,
+ twist_offset);
+ }
+ MEM_freeN(objects);
+ return OPERATOR_FINISHED;
}
void MESH_OT_bridge_edge_loops(wmOperatorType *ot)
@@ -6373,37 +6502,62 @@ void MESH_OT_wireframe(wmOperatorType *ot)
static int edbm_offset_edgeloop_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
- BMOperator bmop;
+ bool mode_change = false;
const bool use_cap_endpoint = RNA_boolean_get(op->ptr, "use_cap_endpoint");
+ int ret = OPERATOR_CANCELLED;
- EDBM_op_init(
- em, &bmop, op,
- "offset_edgeloops edges=%he use_cap_endpoint=%b",
- BM_ELEM_SELECT, use_cap_endpoint);
+ {
+ Object *obedit = CTX_data_edit_object(C);
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ if (em->selectmode == SCE_SELECT_FACE) {
+ EDBM_selectmode_to_scene(C);
+ mode_change = true;
+ }
+ }
- BMO_op_exec(em->bm, &bmop);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
- BM_mesh_elem_hflag_disable_all(em->bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT, false);
+ /** If in face-only select mode, switch to edge select mode so that
+ * an edge-only selection is not inconsistent state.
+ *
+ * We need to run this for all objects, even when nothing is selected.
+ * This way we keep them in sync. */
+ if (mode_change) {
+ em->selectmode = SCE_SELECT_EDGE;
+ EDBM_selectmode_set(em);
+ }
- /* If in face-only select mode, switch to edge select mode so that
- * an edge-only selection is not inconsistent state */
- if (em->selectmode == SCE_SELECT_FACE) {
- em->selectmode = SCE_SELECT_EDGE;
- EDBM_selectmode_set(em);
- EDBM_selectmode_to_scene(C);
- }
+ if (em->bm->totedgesel == 0) {
+ continue;
+ }
- BMO_slot_buffer_hflag_enable(em->bm, bmop.slots_out, "edges.out", BM_EDGE, BM_ELEM_SELECT, true);
+ BMOperator bmop;
+ EDBM_op_init(
+ em, &bmop, op,
+ "offset_edgeloops edges=%he use_cap_endpoint=%b",
+ BM_ELEM_SELECT, use_cap_endpoint);
- if (!EDBM_op_finish(em, &bmop, op, true)) {
- return OPERATOR_CANCELLED;
- }
- else {
- EDBM_update_generic(em, true, true);
- return OPERATOR_FINISHED;
+ BMO_op_exec(em->bm, &bmop);
+
+ BM_mesh_elem_hflag_disable_all(em->bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT, false);
+
+ BMO_slot_buffer_hflag_enable(em->bm, bmop.slots_out, "edges.out", BM_EDGE, BM_ELEM_SELECT, true);
+
+ if (!EDBM_op_finish(em, &bmop, op, true)) {
+ continue;
+ }
+ else {
+ EDBM_update_generic(em, true, true);
+ ret = OPERATOR_FINISHED;
+ }
}
+ MEM_freeN(objects);
+ return ret;
}
void MESH_OT_offset_edge_loops(wmOperatorType *ot)
@@ -6562,6 +6716,7 @@ void MESH_OT_convex_hull(wmOperatorType *ot)
static int mesh_symmetrize_exec(bContext *C, wmOperator *op)
{
+ const float thresh = RNA_float_get(op->ptr, "threshold");
ViewLayer *view_layer = CTX_data_view_layer(C);
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
@@ -6573,10 +6728,8 @@ static int mesh_symmetrize_exec(bContext *C, wmOperator *op)
if (em->bm->totvertsel == 0 ) {
continue;
}
- BMOperator bmop;
-
- const float thresh = RNA_float_get(op->ptr, "threshold");
+ BMOperator bmop;
EDBM_op_init(
em, &bmop, op,
"symmetrize input=%hvef direction=%i dist=%f",
@@ -6632,103 +6785,114 @@ static int mesh_symmetry_snap_exec(bContext *C, wmOperator *op)
{
const float eps = 0.00001f;
const float eps_sq = eps * eps;
-
- Object *obedit = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
- BMesh *bm = em->bm;
- int *index = MEM_mallocN(bm->totvert * sizeof(*index), __func__);
const bool use_topology = false;
const float thresh = RNA_float_get(op->ptr, "threshold");
const float fac = RNA_float_get(op->ptr, "factor");
const bool use_center = RNA_boolean_get(op->ptr, "use_center");
+ const int axis_dir = RNA_enum_get(op->ptr, "direction");
- /* stats */
- int totmirr = 0, totfail = 0, totfound = 0;
+ /* Vertices stats (total over all selected objects). */
+ int totvertfound = 0, totvertmirr = 0, totvertfail = 0;
- /* axix */
- const int axis_dir = RNA_enum_get(op->ptr, "direction");
+ /* Axis. */
int axis = axis_dir % 3;
bool axis_sign = axis != axis_dir;
- /* vertex iter */
- BMIter iter;
- BMVert *v;
- int i;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ BMesh *bm = em->bm;
+
+ if (em->bm->totvertsel == 0) {
+ continue;
+ }
- EDBM_verts_mirror_cache_begin_ex(em, axis, true, true, use_topology, thresh, index);
+ /* Only allocate memory after checking whether to skip object. */
+ int *index = MEM_mallocN(bm->totvert * sizeof(*index), __func__);
- BM_mesh_elem_table_ensure(bm, BM_VERT);
+ /* Vertex iter. */
+ BMIter iter;
+ BMVert *v;
+ int i;
- BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, false);
+ EDBM_verts_mirror_cache_begin_ex(em, axis, true, true, use_topology, thresh, index);
+ BM_mesh_elem_table_ensure(bm, BM_VERT);
- BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) {
- if ((BM_elem_flag_test(v, BM_ELEM_SELECT) != false) &&
- (BM_elem_flag_test(v, BM_ELEM_TAG) == false))
- {
- int i_mirr = index[i];
- if (i_mirr != -1) {
+ BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, false);
- BMVert *v_mirr = BM_vert_at_index(bm, index[i]);
+ BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) {
+ if ((BM_elem_flag_test(v, BM_ELEM_SELECT) != false) &&
+ (BM_elem_flag_test(v, BM_ELEM_TAG) == false))
+ {
+ int i_mirr = index[i];
+ if (i_mirr != -1) {
- if (v != v_mirr) {
- float co[3], co_mirr[3];
+ BMVert *v_mirr = BM_vert_at_index(bm, index[i]);
- if ((v->co[axis] > v_mirr->co[axis]) == axis_sign) {
- SWAP(BMVert *, v, v_mirr);
- }
+ if (v != v_mirr) {
+ float co[3], co_mirr[3];
- copy_v3_v3(co_mirr, v_mirr->co);
- co_mirr[axis] *= -1.0f;
+ if ((v->co[axis] > v_mirr->co[axis]) == axis_sign) {
+ SWAP(BMVert *, v, v_mirr);
+ }
- if (len_squared_v3v3(v->co, co_mirr) > eps_sq) {
- totmirr++;
- }
+ copy_v3_v3(co_mirr, v_mirr->co);
+ co_mirr[axis] *= -1.0f;
+
+ if (len_squared_v3v3(v->co, co_mirr) > eps_sq) {
+ totvertmirr++;
+ }
- interp_v3_v3v3(co, v->co, co_mirr, fac);
+ interp_v3_v3v3(co, v->co, co_mirr, fac);
- copy_v3_v3(v->co, co);
+ copy_v3_v3(v->co, co);
- co[axis] *= -1.0f;
- copy_v3_v3(v_mirr->co, co);
+ co[axis] *= -1.0f;
+ copy_v3_v3(v_mirr->co, co);
- BM_elem_flag_enable(v, BM_ELEM_TAG);
- BM_elem_flag_enable(v_mirr, BM_ELEM_TAG);
- totfound++;
- }
- else {
- if (use_center) {
+ BM_elem_flag_enable(v, BM_ELEM_TAG);
+ BM_elem_flag_enable(v_mirr, BM_ELEM_TAG);
+ totvertfound++;
+ }
+ else {
+ if (use_center) {
- if (fabsf(v->co[axis]) > eps) {
- totmirr++;
- }
+ if (fabsf(v->co[axis]) > eps) {
+ totvertmirr++;
+ }
- v->co[axis] = 0.0f;
+ v->co[axis] = 0.0f;
+ }
+ BM_elem_flag_enable(v, BM_ELEM_TAG);
+ totvertfound++;
}
- BM_elem_flag_enable(v, BM_ELEM_TAG);
- totfound++;
}
- }
- else {
- totfail++;
+ else {
+ totvertfail++;
+ }
}
}
- }
+ /* No need to end cache, just free the array. */
+ MEM_freeN(index);
+ }
+ MEM_freeN(objects);
- if (totfail) {
+ if (totvertfail) {
BKE_reportf(op->reports, RPT_WARNING, "%d already symmetrical, %d pairs mirrored, %d failed",
- totfound - totmirr, totmirr, totfail);
+ totvertfound - totvertmirr, totvertmirr, totvertfail);
}
else {
BKE_reportf(op->reports, RPT_INFO, "%d already symmetrical, %d pairs mirrored",
- totfound - totmirr, totmirr);
+ totvertfound - totvertmirr, totvertmirr);
}
- /* no need to end cache, just free the array */
- MEM_freeN(index);
-
return OPERATOR_FINISHED;
}
@@ -6784,17 +6948,11 @@ static int edbm_mark_freestyle_edge_exec(bContext *C, wmOperator *op)
}
BMesh *bm = em->bm;
- Mesh *me = ((Mesh *)obedit->data);
if (bm->totedgesel == 0) {
continue;
}
- /* auto-enable Freestyle edge mark drawing */
- if (clear == 0) {
- me->drawflag |= ME_DRAW_FREESTYLE_EDGE;
- }
-
if (!CustomData_has_layer(&em->bm->edata, CD_FREESTYLE_EDGE)) {
BM_data_layer_add(em->bm, &em->bm->edata, CD_FREESTYLE_EDGE);
}
@@ -6862,7 +7020,6 @@ static int edbm_mark_freestyle_face_exec(bContext *C, wmOperator *op)
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
Object *obedit = objects[ob_index];
- Mesh *me = (Mesh *)obedit->data;
BMEditMesh *em = BKE_editmesh_from_object(obedit);
if (em == NULL) {
@@ -6873,11 +7030,6 @@ static int edbm_mark_freestyle_face_exec(bContext *C, wmOperator *op)
continue;
}
- /* auto-enable Freestyle face mark drawing */
- if (!clear) {
- me->drawflag |= ME_DRAW_FREESTYLE_FACE;
- }
-
if (!CustomData_has_layer(&em->bm->pdata, CD_FREESTYLE_FACE)) {
BM_data_layer_add(em->bm, &em->bm->pdata, CD_FREESTYLE_FACE);
}
@@ -6987,27 +7139,6 @@ wmKeyMap *point_normals_modal_keymap(wmKeyConfig *keyconf)
keymap = WM_modalkeymap_add(keyconf, keymap_name, modal_items);
- /* Generic items for modal map. */
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, EDBM_CLNOR_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_PRESS, KM_NOTHING, 0, EDBM_CLNOR_MODAL_CANCEL);
-
- WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, EDBM_CLNOR_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, EDBM_CLNOR_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_NOTHING, 0, EDBM_CLNOR_MODAL_CONFIRM);
-
- /* Point To items for modal map */
- WM_modalkeymap_add_item(keymap, RKEY, KM_PRESS, KM_NOTHING, 0, EDBM_CLNOR_MODAL_POINTTO_RESET);
- WM_modalkeymap_add_item(keymap, IKEY, KM_PRESS, KM_NOTHING, 0, EDBM_CLNOR_MODAL_POINTTO_INVERT);
- WM_modalkeymap_add_item(keymap, SKEY, KM_PRESS, KM_NOTHING, 0, EDBM_CLNOR_MODAL_POINTTO_SPHERIZE);
- WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, KM_NOTHING, 0, EDBM_CLNOR_MODAL_POINTTO_ALIGN);
-
- WM_modalkeymap_add_item(keymap, MKEY, KM_PRESS, KM_NOTHING, 0, EDBM_CLNOR_MODAL_POINTTO_USE_MOUSE);
- WM_modalkeymap_add_item(keymap, LKEY, KM_PRESS, KM_NOTHING, 0, EDBM_CLNOR_MODAL_POINTTO_USE_PIVOT);
- WM_modalkeymap_add_item(keymap, OKEY, KM_PRESS, KM_NOTHING, 0, EDBM_CLNOR_MODAL_POINTTO_USE_OBJECT);
-
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_CLICK, KM_CTRL, 0, EDBM_CLNOR_MODAL_POINTTO_SET_USE_3DCURSOR);
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_CLICK, KM_CTRL, 0, EDBM_CLNOR_MODAL_POINTTO_SET_USE_SELECTED);
-
WM_modalkeymap_assign(keymap, "MESH_OT_point_normals");
return keymap;
@@ -7229,6 +7360,7 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
new_mode = EDBM_CLNOR_POINTTO_MODE_COORDINATES;
ED_view3d_cursor3d_update(C, event->mval, false, V3D_CURSOR_ORIENT_NONE);
copy_v3_v3(target, ED_view3d_cursor3d_get(scene, v3d)->location);
+ ret = OPERATOR_RUNNING_MODAL;
break;
case EDBM_CLNOR_MODAL_POINTTO_SET_USE_SELECTED:
@@ -7501,6 +7633,7 @@ static void normals_split(BMesh *bm)
}
else {
BMVert *v_pivot = l_curr->v;
+ UNUSED_VARS_NDEBUG(v_pivot);
BMEdge *e_next;
const BMEdge *e_org = l_curr->e;
BMLoop *lfan_pivot, *lfan_pivot_next;
@@ -7561,10 +7694,6 @@ static int normals_split_merge(bContext *C, const bool do_merge)
BM_elem_flag_set(e, BM_ELEM_SMOOTH, do_merge);
}
}
- if (do_merge == 0) {
- Mesh *me = obedit->data;
- me->drawflag |= ME_DRAWSHARP;
- }
bm->spacearr_dirty |= BM_SPACEARR_DIRTY_ALL;
BKE_editmesh_lnorspace_update(em);
@@ -7670,7 +7799,7 @@ static int edbm_average_normals_exec(bContext *C, wmOperator *op)
BM_normals_loops_edges_tag(bm, true);
- Heap *loop_weight = BLI_heap_new();
+ HeapSimple *loop_weight = BLI_heapsimple_new();
BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) {
l_curr = l_first = BM_FACE_FIRST_LOOP(f);
@@ -7685,6 +7814,7 @@ static int edbm_average_normals_exec(bContext *C, wmOperator *op)
}
else {
BMVert *v_pivot = l_curr->v;
+ UNUSED_VARS_NDEBUG(v_pivot);
BMEdge *e_next;
const BMEdge *e_org = l_curr->e;
BMLoop *lfan_pivot, *lfan_pivot_next;
@@ -7709,7 +7839,7 @@ static int edbm_average_normals_exec(bContext *C, wmOperator *op)
val = 1.0f / BM_loop_calc_face_angle(lfan_pivot);
}
- BLI_heap_insert(loop_weight, val, lfan_pivot);
+ BLI_heapsimple_insert(loop_weight, val, lfan_pivot);
if (!BM_elem_flag_test(e_next, BM_ELEM_TAG) || (e_next == e_org)) {
break;
@@ -7719,15 +7849,15 @@ static int edbm_average_normals_exec(bContext *C, wmOperator *op)
BLI_SMALLSTACK_DECLARE(loops, BMLoop *);
float wnor[3], avg_normal[3] = { 0.0f }, count = 0;
- float val = BLI_heap_node_value(BLI_heap_top(loop_weight));
+ float val = BLI_heapsimple_top_value(loop_weight);
- while (!BLI_heap_is_empty(loop_weight)) {
- const float cur_val = BLI_heap_node_value(BLI_heap_top(loop_weight));
+ while (!BLI_heapsimple_is_empty(loop_weight)) {
+ const float cur_val = BLI_heapsimple_top_value(loop_weight);
if (!compare_ff(val, cur_val, threshold)) {
count++;
val = cur_val;
}
- l = BLI_heap_pop_min(loop_weight);
+ l = BLI_heapsimple_pop_min(loop_weight);
BLI_SMALLSTACK_PUSH(loops, l);
const float n_weight = pow(weight, count);
@@ -7758,7 +7888,7 @@ static int edbm_average_normals_exec(bContext *C, wmOperator *op)
} while ((l_curr = l_curr->next) != l_first);
}
- BLI_heap_free(loop_weight, NULL);
+ BLI_heapsimple_free(loop_weight, NULL);
EDBM_update_generic(em, true, false);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c
index fd87ba32653..7fdef86f7e5 100644
--- a/source/blender/editors/mesh/editmesh_utils.c
+++ b/source/blender/editors/mesh/editmesh_utils.c
@@ -328,7 +328,7 @@ void EDBM_mesh_make(Object *ob, const int select_mode, const bool add_key_index)
}
/**
- * \warning This can invalidate the #DerivedMesh cache of other objects (for linked duplicates).
+ * \warning This can invalidate the #Mesh runtime cache of other objects (for linked duplicates).
* Most callers should run #DEG_id_tag_update on \a ob->data, see: T46738, T46913
*/
void EDBM_mesh_load(Main *bmain, Object *ob)
@@ -438,14 +438,14 @@ void EDBM_selectmode_flush(BMEditMesh *em)
void EDBM_deselect_flush(BMEditMesh *em)
{
- /* function below doesnt use. just do this to keep the values in sync */
+ /* function below doesn't use. just do this to keep the values in sync */
em->bm->selectmode = em->selectmode;
BM_mesh_deselect_flush(em->bm);
}
void EDBM_select_flush(BMEditMesh *em)
{
- /* function below doesnt use. just do this to keep the values in sync */
+ /* function below doesn't use. just do this to keep the values in sync */
em->bm->selectmode = em->selectmode;
BM_mesh_select_flush(em->bm);
}
@@ -1368,19 +1368,6 @@ void EDBM_update_generic(BMEditMesh *em, const bool do_tessface, const bool is_d
/** \} */
/* -------------------------------------------------------------------- */
-/** \name Data Access
- * \{ */
-
-DerivedMesh *EDBM_mesh_deform_dm_get(BMEditMesh *em)
-{
- return ((em->derivedFinal != NULL) &&
- (em->derivedFinal->type == DM_TYPE_EDITBMESH) &&
- (em->derivedFinal->deformedOnly != false)) ? em->derivedFinal : NULL;
-}
-
-/** \} */
-
-/* -------------------------------------------------------------------- */
/** \name Operator Helpers
* \{ */
@@ -1502,7 +1489,7 @@ bool BMBVH_EdgeVisible(struct BMBVHTree *tree, BMEdge *e,
ar->winy / 2.0f,
};
- ED_view3d_win_to_segment(depsgraph, ar, v3d, mval_f, origin, end, false);
+ ED_view3d_win_to_segment_clipped(depsgraph, ar, v3d, mval_f, origin, end, false);
invert_m4_m4(invmat, obedit->obmat);
mul_m4_v3(invmat, origin);
diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c
index 3598262ecf4..fef4314019f 100644
--- a/source/blender/editors/mesh/mesh_data.c
+++ b/source/blender/editors/mesh/mesh_data.c
@@ -42,12 +42,10 @@
#include "BLI_math.h"
#include "BKE_context.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
+#include "BKE_editmesh.h"
#include "BKE_mesh.h"
#include "BKE_paint.h"
#include "BKE_report.h"
-#include "BKE_editmesh.h"
#include "DEG_depsgraph.h"
@@ -798,8 +796,6 @@ static int mesh_customdata_custom_splitnormals_add_exec(bContext *C, wmOperator
/* Tag edges as sharp according to smooth threshold if needed, to preserve autosmooth shading. */
if (me->flag & ME_AUTOSMOOTH) {
BM_edges_sharp_from_angle_set(me->edit_btmesh->bm, me->smoothresh);
-
- me->drawflag |= ME_DRAWSHARP;
}
BM_data_layer_add(me->edit_btmesh->bm, data, CD_CUSTOMLOOPNORMAL);
@@ -823,8 +819,6 @@ static int mesh_customdata_custom_splitnormals_add_exec(bContext *C, wmOperator
me->smoothresh);
MEM_freeN(polynors);
-
- me->drawflag |= ME_DRAWSHARP;
}
CustomData_add_layer(data, CD_CUSTOMLOOPNORMAL, CD_DEFAULT, NULL, me->totloop);
@@ -881,7 +875,7 @@ void MESH_OT_customdata_custom_splitnormals_clear(wmOperatorType *ot)
/************************** Add Geometry Layers *************************/
-void ED_mesh_update(Mesh *mesh, bContext *C, bool calc_edges, bool calc_tessface)
+void ED_mesh_update(Mesh *mesh, bContext *C, bool calc_edges, bool calc_edges_loose, bool calc_tessface)
{
bool tessface_input = false;
@@ -892,6 +886,10 @@ void ED_mesh_update(Mesh *mesh, bContext *C, bool calc_edges, bool calc_tessface
tessface_input = true;
}
+ if (calc_edges_loose && mesh->totedge) {
+ BKE_mesh_calc_edges_loose(mesh);
+ }
+
if (calc_edges || ((mesh->totpoly || mesh->totface) && mesh->totedge == 0))
BKE_mesh_calc_edges(mesh, calc_edges, true);
diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h
index efaf90fd8ef..25a477546cc 100644
--- a/source/blender/editors/mesh/mesh_intern.h
+++ b/source/blender/editors/mesh/mesh_intern.h
@@ -110,11 +110,17 @@ void MESH_OT_extrude_edges_indiv(struct wmOperatorType *ot);
void MESH_OT_extrude_faces_indiv(struct wmOperatorType *ot);
void MESH_OT_dupli_extrude_cursor(struct wmOperatorType *ot);
+/* *** editmesh_extrude_gizmo.c *** */
+void MESH_GGT_extrude(struct wmGizmoGroupType *gzgt);
+
/* *** editmesh_extrude_screw.c *** */
void MESH_OT_screw(struct wmOperatorType *ot);
/* *** editmesh_extrude_spin.c *** */
void MESH_OT_spin(struct wmOperatorType *ot);
+/* *** editmesh_extrude_spin_gizmo.c *** */
+void MESH_GGT_spin(struct wmGizmoGroupType *gzgt);
+void MESH_GGT_spin_redo(struct wmGizmoGroupType *gzgt);
/* *** editmesh_polybuild.c *** */
void MESH_OT_polybuild_face_at_cursor(struct wmOperatorType *ot);
diff --git a/source/blender/editors/mesh/mesh_mirror.c b/source/blender/editors/mesh/mesh_mirror.c
index 4b526915551..b9479a660f9 100644
--- a/source/blender/editors/mesh/mesh_mirror.c
+++ b/source/blender/editors/mesh/mesh_mirror.c
@@ -35,9 +35,8 @@
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
-#include "BLI_kdtree.h"
#include "BKE_editmesh.h"
-#include "BKE_library.h"
+#include "BLI_kdtree.h"
#include "BKE_mesh.h"
#include "ED_mesh.h"
@@ -267,7 +266,7 @@ void ED_mesh_mirrtopo_init(
/* sort so we can count unique values */
qsort(topo_hash_prev, totvert, sizeof(MirrTopoHash_t), mirrtopo_hash_sort);
- tot_unique = 1; /* account for skiping the first value */
+ tot_unique = 1; /* account for skipping the first value */
for (a = 1; a < totvert; a++) {
if (topo_hash_prev[a - 1] != topo_hash_prev[a]) {
tot_unique++;
diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c
index a318b3b78e5..a517f41d1fe 100644
--- a/source/blender/editors/mesh/mesh_ops.c
+++ b/source/blender/editors/mesh/mesh_ops.c
@@ -156,7 +156,6 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_polybuild_face_at_cursor);
WM_operatortype_append(MESH_OT_polybuild_split_at_cursor);
WM_operatortype_append(MESH_OT_polybuild_dissolve_at_cursor);
- WM_operatortype_append(MESH_OT_polybuild_hover);
WM_operatortype_append(MESH_OT_uv_texture_add);
WM_operatortype_append(MESH_OT_uv_texture_remove);
@@ -277,7 +276,7 @@ void ED_operatormacros_mesh(void)
RNA_boolean_set(otmacro->ptr, "mirror", false);
ot = WM_operatortype_append_macro("MESH_OT_extrude_region_shrink_fatten", "Extrude Region and Shrink/Fatten",
- "Extrude region and move result", OPTYPE_UNDO | OPTYPE_REGISTER);
+ "Extrude along normals and move result", OPTYPE_UNDO | OPTYPE_REGISTER);
otmacro = WM_operatortype_macro_define(ot, "MESH_OT_extrude_region");
otmacro = WM_operatortype_macro_define(ot, "TRANSFORM_OT_shrink_fatten");
RNA_enum_set(otmacro->ptr, "proportional", 0);
@@ -306,7 +305,7 @@ void ED_operatormacros_mesh(void)
ot = WM_operatortype_append_macro(
- "MESH_OT_polybuild_face_at_cursor_move", "Face At Cursor Move", "",
+ "MESH_OT_polybuild_face_at_cursor_move", "Face at Cursor Move", "",
OPTYPE_UNDO | OPTYPE_REGISTER);
WM_operatortype_macro_define(ot, "MESH_OT_polybuild_face_at_cursor");
otmacro = WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
@@ -314,7 +313,7 @@ void ED_operatormacros_mesh(void)
RNA_boolean_set(otmacro->ptr, "mirror", false);
ot = WM_operatortype_append_macro(
- "MESH_OT_polybuild_split_at_cursor_move", "Split At Cursor Move", "",
+ "MESH_OT_polybuild_split_at_cursor_move", "Split at Cursor Move", "",
OPTYPE_UNDO | OPTYPE_REGISTER);
WM_operatortype_macro_define(ot, "MESH_OT_polybuild_split_at_cursor");
otmacro = WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
@@ -325,212 +324,9 @@ void ED_operatormacros_mesh(void)
/* note mesh keymap also for other space? */
void ED_keymap_mesh(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap;
- wmKeyMapItem *kmi;
-
- keymap = WM_keymap_ensure(keyconf, "Mesh", 0, 0);
+ wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Mesh", 0, 0);
keymap->poll = ED_operator_editmesh;
- kmi = WM_keymap_add_item(keymap, "MESH_OT_loopcut_slide", RKEY, KM_PRESS, KM_CTRL, 0);
- {
- PointerRNA macro_ptr = RNA_pointer_get(kmi->ptr, "TRANSFORM_OT_edge_slide");
- RNA_boolean_set(&macro_ptr, "release_confirm", false);
- }
- kmi = WM_keymap_add_item(keymap, "MESH_OT_offset_edge_loops_slide", RKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- {
- PointerRNA macro_ptr = RNA_pointer_get(kmi->ptr, "TRANSFORM_OT_edge_slide");
- RNA_boolean_set(&macro_ptr, "release_confirm", false);
- }
-
- WM_keymap_add_item(keymap, "MESH_OT_inset", IKEY, KM_PRESS, 0, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "MESH_OT_poke", PKEY, KM_PRESS, KM_ALT, 0);
-#endif
- kmi = WM_keymap_add_item(keymap, "MESH_OT_bevel", BKEY, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "vertex_only", false);
- kmi = WM_keymap_add_item(keymap, "MESH_OT_bevel", BKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "vertex_only", true);
-
- /* Selec Vert/Edge/Face. */
- ED_keymap_editmesh_elem_mode(keyconf, keymap);
-
- /* standard mouse selection goes via space_view3d */
- kmi = WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- RNA_boolean_set(kmi->ptr, "toggle", false);
- kmi = WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_SHIFT | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- RNA_boolean_set(kmi->ptr, "toggle", true);
-
- kmi = WM_keymap_add_item(keymap, "MESH_OT_edgering_select", SELECTMOUSE, KM_PRESS, KM_ALT | KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- RNA_boolean_set(kmi->ptr, "toggle", false);
- kmi = WM_keymap_add_item(keymap, "MESH_OT_edgering_select", SELECTMOUSE, KM_PRESS, KM_SHIFT | KM_ALT | KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- RNA_boolean_set(kmi->ptr, "toggle", true);
-
- kmi = WM_keymap_add_item(keymap, "MESH_OT_shortest_path_pick", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "use_fill", false);
-
- kmi = WM_keymap_add_item(keymap, "MESH_OT_shortest_path_pick", SELECTMOUSE, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "use_fill", true);
-
- kmi = WM_keymap_add_item(keymap, "MESH_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "MESH_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "MESH_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- WM_keymap_add_item(keymap, "MESH_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "MESH_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "MESH_OT_select_next_item", PADPLUSKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "MESH_OT_select_prev_item", PADMINUS, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "MESH_OT_select_non_manifold", MKEY, KM_PRESS, (KM_CTRL | KM_SHIFT | KM_ALT), 0);
-#endif
-
- WM_keymap_add_item(keymap, "MESH_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0);
- kmi = WM_keymap_add_item(keymap, "MESH_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- kmi = WM_keymap_add_item(keymap, "MESH_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", true);
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "MESH_OT_faces_select_linked_flat", FKEY, KM_PRESS, (KM_CTRL | KM_SHIFT | KM_ALT), 0);
-#endif
-
- WM_keymap_add_item(keymap, "MESH_OT_select_mirror", MKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_select_similar", GKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* hide */
- kmi = WM_keymap_add_item(keymap, "MESH_OT_hide", HKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
- kmi = WM_keymap_add_item(keymap, "MESH_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
- WM_keymap_add_item(keymap, "MESH_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
-
- /* tools */
-#ifdef USE_WM_KEYMAP_27X
- kmi = WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "inside", false);
- kmi = WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "inside", true);
-#else
- kmi = WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "inside", false);
- kmi = WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "inside", true);
-#endif
-
- WM_keymap_add_item(keymap, "VIEW3D_OT_edit_mesh_extrude_move_normal", EKEY, KM_PRESS, 0, 0); /* python operator */
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_extrude", EKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "TRANSFORM_OT_edge_crease", EKEY, KM_PRESS, KM_SHIFT, 0);
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "MESH_OT_spin", RKEY, KM_PRESS, KM_ALT, 0);
-#endif
-
- WM_keymap_add_item(keymap, "MESH_OT_fill", FKEY, KM_PRESS, KM_ALT, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "MESH_OT_beautify_fill", FKEY, KM_PRESS, KM_SHIFT | KM_ALT, 0);
-#endif
-
- kmi = WM_keymap_add_item(keymap, "MESH_OT_quads_convert_to_tris", TKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "quad_method", MOD_TRIANGULATE_QUAD_BEAUTY);
- RNA_enum_set(kmi->ptr, "ngon_method", MOD_TRIANGULATE_NGON_BEAUTY);
- kmi = WM_keymap_add_item(keymap, "MESH_OT_quads_convert_to_tris", TKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "quad_method", MOD_TRIANGULATE_QUAD_FIXED);
- RNA_enum_set(kmi->ptr, "ngon_method", MOD_TRIANGULATE_NGON_EARCLIP);
-
- WM_keymap_add_item(keymap, "MESH_OT_tris_convert_to_quads", JKEY, KM_PRESS, KM_ALT, 0);
-
- kmi = WM_keymap_add_item(keymap, "MESH_OT_rip_move", VKEY, KM_PRESS, 0, 0);
- {
- PointerRNA macro_ptr = RNA_pointer_get(kmi->ptr, "MESH_OT_rip");
- RNA_boolean_set(&macro_ptr, "use_fill", false);
- }
- kmi = WM_keymap_add_item(keymap, "MESH_OT_rip_move", VKEY, KM_PRESS, KM_ALT, 0);
- {
- PointerRNA macro_ptr = RNA_pointer_get(kmi->ptr, "MESH_OT_rip");
- RNA_boolean_set(&macro_ptr, "use_fill", true);
- }
-
- WM_keymap_add_item(keymap, "MESH_OT_rip_edge_move", DKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "MESH_OT_merge", MKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "TRANSFORM_OT_shrink_fatten", SKEY, KM_PRESS, KM_ALT, 0);
-
- /* add/remove */
- WM_keymap_add_item(keymap, "MESH_OT_edge_face_add", FKEY, KM_PRESS, 0, 0);
-// WM_keymap_add_item(keymap, "MESH_OT_skin", FKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); /* python, removed */
- WM_keymap_add_item(keymap, "MESH_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_mesh_add", AKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "MESH_OT_separate", PKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "MESH_OT_split", YKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "MESH_OT_vert_connect_path", JKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "MESH_OT_point_normals", LKEY, KM_PRESS, KM_ALT, 0);
-
- /* Vertex Slide */
- WM_keymap_add_item(keymap, "TRANSFORM_OT_vert_slide", VKEY, KM_PRESS, KM_SHIFT, 0);
- /* use KM_CLICK because same key is used for tweaks */
- kmi = WM_keymap_add_item(keymap, "MESH_OT_dupli_extrude_cursor", ACTIONMOUSE, KM_CLICK, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "rotate_source", true);
- kmi = WM_keymap_add_item(keymap, "MESH_OT_dupli_extrude_cursor", ACTIONMOUSE, KM_CLICK, KM_SHIFT | KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "rotate_source", false);
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_delete", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "MESH_OT_dissolve_mode", XKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "MESH_OT_dissolve_mode", DELKEY, KM_PRESS, KM_CTRL, 0);
-
- kmi = WM_keymap_add_item(keymap, "MESH_OT_knife_tool", KKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "use_occlude_geometry", true);
- RNA_boolean_set(kmi->ptr, "only_selected", false);
-
-#ifdef USE_WM_KEYMAP_27X
- kmi = WM_keymap_add_item(keymap, "MESH_OT_knife_tool", KKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "use_occlude_geometry", false);
- RNA_boolean_set(kmi->ptr, "only_selected", true);
-#endif
-
- WM_keymap_add_item(keymap, "OBJECT_OT_vertex_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
-
- /* menus */
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_specials", WKEY, KM_PRESS, 0, 0);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_faces", FKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_edges", EKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_vertices", VKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_hook", HKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_menu(keymap, "VIEW3D_MT_uv_map", UKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_vertex_group", GKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "OBJECT_OT_vertex_group_remove_from", GKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
-
-#ifdef USE_WM_KEYMAP_27X
- /* useful stuff from object-mode */
- for (int i = 0; i <= 5; i++) {
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_subdivision_set", ZEROKEY + i, KM_PRESS, KM_CTRL, 0);
- RNA_int_set(kmi->ptr, "level", i);
- }
-#endif
-
- ED_keymap_proportional_cycle(keyconf, keymap);
- ED_keymap_proportional_editmode(keyconf, keymap, true);
-
knifetool_modal_keymap(keyconf);
point_normals_modal_keymap(keyconf);
}
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index 537056cd1ba..32eaa578be1 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -50,19 +50,19 @@
#include "BKE_context.h"
#include "BKE_deform.h"
+#include "BKE_editmesh.h"
#include "BKE_key.h"
+#include "BKE_layer.h"
#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_mesh_iterators.h"
#include "BKE_mesh_runtime.h"
-#include "BKE_material.h"
+#include "BKE_multires.h"
#include "BKE_object.h"
#include "BKE_object_deform.h"
#include "BKE_report.h"
-#include "BKE_editmesh.h"
-#include "BKE_multires.h"
-#include "BKE_layer.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
@@ -298,18 +298,18 @@ int join_mesh_exec(bContext *C, wmOperator *op)
Depsgraph *depsgraph = CTX_data_depsgraph(C);
/* count & check */
- CTX_DATA_BEGIN (C, Base *, base, selected_editable_bases)
+ CTX_DATA_BEGIN (C, Object *, ob_iter, selected_editable_objects)
{
- if (base->object->type == OB_MESH) {
- me = base->object->data;
+ if (ob_iter->type == OB_MESH) {
+ me = ob_iter->data;
totvert += me->totvert;
totedge += me->totedge;
totloop += me->totloop;
totpoly += me->totpoly;
- totmat += base->object->totcol;
+ totmat += ob_iter->totcol;
- if (base->object == ob)
+ if (ob_iter == ob)
ok = true;
/* check for shapekeys */
@@ -357,9 +357,9 @@ int join_mesh_exec(bContext *C, wmOperator *op)
}
/* - if destination mesh had shapekeys, move them somewhere safe, and set up placeholders
- * with arrays that are large enough to hold shapekey data for all meshes
- * - if destination mesh didn't have shapekeys, but we encountered some in the meshes we're
- * joining, set up a new keyblock and assign to the mesh
+ * with arrays that are large enough to hold shapekey data for all meshes
+ * - if destination mesh didn't have shapekeys, but we encountered some in the meshes we're
+ * joining, set up a new keyblock and assign to the mesh
*/
if (key) {
/* make a duplicate copy that will only be used here... (must remember to free it!) */
@@ -379,14 +379,14 @@ int join_mesh_exec(bContext *C, wmOperator *op)
}
/* first pass over objects - copying materials and vertexgroups across */
- CTX_DATA_BEGIN (C, Base *, base, selected_editable_bases)
+ CTX_DATA_BEGIN (C, Object *, ob_iter, selected_editable_objects)
{
/* only act if a mesh, and not the one we're joining to */
- if ((ob != base->object) && (base->object->type == OB_MESH)) {
- me = base->object->data;
+ if ((ob != ob_iter) && (ob_iter->type == OB_MESH)) {
+ me = ob_iter->data;
/* Join this object's vertex groups to the base one's */
- for (dg = base->object->defbase.first; dg; dg = dg->next) {
+ for (dg = ob_iter->defbase.first; dg; dg = dg->next) {
/* See if this group exists in the object (if it doesn't, add it to the end) */
if (!defgroup_find_name(ob, dg->name)) {
odg = MEM_callocN(sizeof(bDeformGroup), "join deformGroup");
@@ -401,8 +401,8 @@ int join_mesh_exec(bContext *C, wmOperator *op)
if (me->totvert) {
/* Add this object's materials to the base one's if they don't exist already (but only if limits not exceeded yet) */
if (totcol < MAXMAT) {
- for (a = 1; a <= base->object->totcol; a++) {
- ma = give_current_material(base->object, a);
+ for (a = 1; a <= ob_iter->totcol; a++) {
+ ma = give_current_material(ob_iter, a);
for (b = 0; b < totcol; b++) {
if (ma == matar[b]) {
@@ -500,16 +500,16 @@ int join_mesh_exec(bContext *C, wmOperator *op)
matar, matmap, totcol,
&vertofs, &edgeofs, &loopofs, &polyofs);
- CTX_DATA_BEGIN (C, Base *, base, selected_editable_bases)
+ CTX_DATA_BEGIN (C, Object *, ob_iter, selected_editable_objects)
{
- if (base->object == ob) {
+ if (ob_iter == ob) {
continue;
}
/* only join if this is a mesh */
- if (base->object->type == OB_MESH) {
+ if (ob_iter->type == OB_MESH) {
join_mesh_single(
depsgraph, bmain, scene,
- ob, base->object, imat,
+ ob, ob_iter, imat,
&mvert, &medge, &mloop, &mpoly,
&vdata, &edata, &ldata, &pdata,
totvert, totedge, totloop, totpoly,
@@ -518,8 +518,8 @@ int join_mesh_exec(bContext *C, wmOperator *op)
&vertofs, &edgeofs, &loopofs, &polyofs);
/* free base, now that data is merged */
- if (base->object != ob) {
- ED_object_base_free_and_unlink(bmain, scene, base->object);
+ if (ob_iter != ob) {
+ ED_object_base_free_and_unlink(bmain, scene, ob_iter);
}
}
}
@@ -609,21 +609,23 @@ int join_mesh_shapes_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
- Object *ob = CTX_data_active_object(C);
+ Object *ob_active = CTX_data_active_object(C);
Depsgraph *depsgraph = CTX_data_depsgraph(C);
- Mesh *me = (Mesh *)ob->data;
+ Mesh *me = (Mesh *)ob_active->data;
Mesh *selme = NULL;
Mesh *me_deformed = NULL;
Key *key = me->key;
KeyBlock *kb;
bool ok = false, nonequal_verts = false;
- CTX_DATA_BEGIN (C, Base *, base, selected_editable_bases)
+ CTX_DATA_BEGIN (C, Object *, ob_iter, selected_editable_objects)
{
- if (base->object == ob) continue;
+ if (ob_iter == ob_active) {
+ continue;
+ }
- if (base->object->type == OB_MESH) {
- selme = (Mesh *)base->object->data;
+ if (ob_iter->type == OB_MESH) {
+ selme = (Mesh *)ob_iter->data;
if (selme->totvert == me->totvert)
ok = true;
@@ -651,21 +653,23 @@ int join_mesh_shapes_exec(bContext *C, wmOperator *op)
}
/* now ready to add new keys from selected meshes */
- CTX_DATA_BEGIN (C, Base *, base, selected_editable_bases)
+ CTX_DATA_BEGIN (C, Object *, ob_iter, selected_editable_objects)
{
- if (base->object == ob) continue;
+ if (ob_iter == ob_active) {
+ continue;
+ }
- if (base->object->type == OB_MESH) {
- selme = (Mesh *)base->object->data;
+ if (ob_iter->type == OB_MESH) {
+ selme = (Mesh *)ob_iter->data;
if (selme->totvert == me->totvert) {
- me_deformed = mesh_get_eval_deform(depsgraph, scene, base->object, CD_MASK_BAREMESH);
+ me_deformed = mesh_get_eval_deform(depsgraph, scene, ob_iter, CD_MASK_BAREMESH);
if (!me_deformed) {
continue;
}
- kb = BKE_keyblock_add(key, base->object->id.name + 2);
+ kb = BKE_keyblock_add(key, ob_iter->id.name + 2);
BKE_mesh_runtime_eval_to_meshkey(me_deformed, me, kb);
}
diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c
index 06add39d90f..6d1ba2d3fe0 100644
--- a/source/blender/editors/metaball/mball_edit.c
+++ b/source/blender/editors/metaball/mball_edit.c
@@ -38,6 +38,7 @@
#include "BLI_math.h"
#include "BLI_rand.h"
#include "BLI_utildefines.h"
+#include "BLI_kdtree.h"
#include "DNA_defs.h"
#include "DNA_meta_types.h"
@@ -50,10 +51,12 @@
#include "BKE_context.h"
#include "BKE_mball.h"
#include "BKE_layer.h"
+#include "BKE_object.h"
#include "DEG_depsgraph.h"
#include "ED_mball.h"
+#include "ED_object.h"
#include "ED_screen.h"
#include "ED_select_utils.h"
#include "ED_view3d.h"
@@ -125,38 +128,38 @@ MetaElem *ED_mball_add_primitive(bContext *UNUSED(C), Object *obedit, float mat[
/* Select or deselect all MetaElements */
static int mball_select_all_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- MetaBall *mb = (MetaBall *)obedit->data;
- MetaElem *ml;
int action = RNA_enum_get(op->ptr, "action");
- if (BLI_listbase_is_empty(mb->editelems))
- return OPERATOR_CANCELLED;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
if (action == SEL_TOGGLE) {
- action = SEL_SELECT;
- for (ml = mb->editelems->first; ml; ml = ml->next) {
- if (ml->flag & SELECT) {
- action = SEL_DESELECT;
- break;
- }
- }
+ action = BKE_mball_is_any_selected_multi(objects, objects_len) ?
+ SEL_DESELECT :
+ SEL_SELECT;
}
switch (action) {
case SEL_SELECT:
- BKE_mball_select_all(mb);
+ BKE_mball_select_all_multi(objects, objects_len);
break;
case SEL_DESELECT:
- BKE_mball_deselect_all(mb);
+ BKE_mball_deselect_all_multi(objects, objects_len);
break;
case SEL_INVERT:
- BKE_mball_select_swap(mb);
+ BKE_mball_select_swap_multi(objects, objects_len);
break;
}
- DEG_id_tag_update(&mb->id, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, mb);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ MetaBall *mb = (MetaBall *)obedit->data;
+ DEG_id_tag_update(&mb->id, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, mb);
+ }
+
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -197,150 +200,199 @@ static const EnumPropertyItem prop_similar_types[] = {
{0, NULL, 0, NULL, NULL}
};
-static bool mball_select_similar_type(MetaBall *mb)
+static void mball_select_similar_type_get(Object *obedit, MetaBall *mb, int type, KDTree *r_tree)
{
+ float tree_entry[3] = {0.0f, 0.0f, 0.0f};
MetaElem *ml;
- bool changed = false;
-
+ int tree_index = 0;
for (ml = mb->editelems->first; ml; ml = ml->next) {
if (ml->flag & SELECT) {
- MetaElem *ml_iter;
-
- for (ml_iter = mb->editelems->first; ml_iter; ml_iter = ml_iter->next) {
- if ((ml_iter->flag & SELECT) == 0) {
- if (ml->type == ml_iter->type) {
- ml_iter->flag |= SELECT;
- changed = true;
- }
+ switch (type) {
+ case SIMMBALL_RADIUS:
+ {
+ float radius = ml->rad;
+ /* Radius in world space. */
+ float smat[3][3];
+ float radius_vec[3] = {radius, radius, radius};
+ BKE_object_scale_to_mat3(obedit, smat);
+ mul_m3_v3(smat, radius_vec);
+ radius = (radius_vec[0] + radius_vec[1] + radius_vec[2]) / 3;
+ tree_entry[0] = radius;
+ break;
+ }
+ case SIMMBALL_STIFFNESS:
+ {
+ tree_entry[0] = ml->s;
+ break;
+ }
+ break;
+ case SIMMBALL_ROTATION:
+ {
+ float dir[3] = {1.0f, 0.0f, 0.0f};
+ float rmat[3][3];
+ mul_qt_v3(ml->quat, dir);
+ BKE_object_rot_to_mat3(obedit, rmat, true);
+ mul_m3_v3(rmat, dir);
+ copy_v3_v3(tree_entry, dir);
+ break;
}
}
+ BLI_kdtree_insert(r_tree, tree_index++, tree_entry);
}
}
-
- return changed;
}
-static bool mball_select_similar_radius(MetaBall *mb, const float thresh)
+static bool mball_select_similar_type(Object *obedit, MetaBall *mb, int type, const KDTree *tree, const float thresh)
{
MetaElem *ml;
bool changed = false;
-
for (ml = mb->editelems->first; ml; ml = ml->next) {
- if (ml->flag & SELECT) {
- MetaElem *ml_iter;
-
- for (ml_iter = mb->editelems->first; ml_iter; ml_iter = ml_iter->next) {
- if ((ml_iter->flag & SELECT) == 0) {
- if (fabsf(ml_iter->rad - ml->rad) <= (thresh * ml->rad)) {
- ml_iter->flag |= SELECT;
- changed = true;
+ bool select = false;
+ switch (type) {
+ case SIMMBALL_RADIUS:
+ {
+ float radius = ml->rad;
+ /* Radius in world space is the average of the
+ * scaled radius in x, y and z directions. */
+ float smat[3][3];
+ float radius_vec[3] = {radius, radius, radius};
+ BKE_object_scale_to_mat3(obedit, smat);
+ mul_m3_v3(smat, radius_vec);
+ radius = (radius_vec[0] + radius_vec[1] + radius_vec[2]) / 3;
+
+ if (ED_select_similar_compare_float_tree(tree, radius, thresh, SIM_CMP_EQ)) {
+ select = true;
+ }
+ break;
+ }
+ case SIMMBALL_STIFFNESS:
+ {
+ float s = ml->s;
+ if (ED_select_similar_compare_float_tree(tree, s, thresh, SIM_CMP_EQ)) {
+ select = true;
+ }
+ break;
+ }
+ case SIMMBALL_ROTATION:
+ {
+ float dir[3] = {1.0f, 0.0f, 0.0f};
+ float rmat[3][3];
+ mul_qt_v3(ml->quat, dir);
+ BKE_object_rot_to_mat3(obedit, rmat, true);
+ mul_m3_v3(rmat, dir);
+
+ float thresh_cos = cosf(thresh * (float)M_PI_2);
+
+ KDTreeNearest nearest;
+ if (BLI_kdtree_find_nearest(tree, dir, &nearest) != -1) {
+ float orient = angle_normalized_v3v3(dir, nearest.co);
+ /* Map to 0-1 to compare orientation. */
+ float delta = thresh_cos - fabsf(cosf(orient));
+ if (ED_select_similar_compare_float(delta, thresh, SIM_CMP_EQ)) {
+ select = true;
}
}
+ break;
}
}
- }
+ if (select) {
+ changed = true;
+ ml->flag |= SELECT;
+ }
+ }
return changed;
}
-static bool mball_select_similar_stiffness(MetaBall *mb, const float thresh)
+static int mball_select_similar_exec(bContext *C, wmOperator *op)
{
- MetaElem *ml;
- bool changed = false;
+ const int type = RNA_enum_get(op->ptr, "type");
+ const float thresh = RNA_float_get(op->ptr, "threshold");
+ int tot_mball_selected_all = 0;
- for (ml = mb->editelems->first; ml; ml = ml->next) {
- if (ml->flag & SELECT) {
- MetaElem *ml_iter;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
- for (ml_iter = mb->editelems->first; ml_iter; ml_iter = ml_iter->next) {
- if ((ml_iter->flag & SELECT) == 0) {
- if (fabsf(ml_iter->s - ml->s) <= thresh) {
- ml_iter->flag |= SELECT;
- changed = true;
+ tot_mball_selected_all = BKE_mball_select_count_multi(objects, objects_len);
+
+ short type_ref = 0;
+ KDTree *tree = NULL;
+
+ if (type != SIMMBALL_TYPE) {
+ tree = BLI_kdtree_new(tot_mball_selected_all);
+ }
+
+ /* Get type of selected MetaBall */
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ MetaBall *mb = (MetaBall *)obedit->data;
+
+ switch (type) {
+ case SIMMBALL_TYPE:
+ {
+ MetaElem *ml;
+ for (ml = mb->editelems->first; ml; ml = ml->next) {
+ if (ml->flag & SELECT) {
+ short mball_type = 1 << (ml->type + 1);
+ type_ref |= mball_type;
}
}
+ break;
}
+ case SIMMBALL_RADIUS:
+ case SIMMBALL_STIFFNESS:
+ case SIMMBALL_ROTATION:
+ mball_select_similar_type_get(obedit, mb, type, tree);
+ break;
+ default:
+ BLI_assert(0);
+ break;
}
}
- return changed;
-}
-
-static bool mball_select_similar_rotation(MetaBall *mb, const float thresh)
-{
- const float thresh_rad = thresh * (float)M_PI_2;
- MetaElem *ml;
- bool changed = false;
-
- for (ml = mb->editelems->first; ml; ml = ml->next) {
- if (ml->flag & SELECT) {
- MetaElem *ml_iter;
-
- float ml_mat[3][3];
-
- unit_m3(ml_mat);
- mul_qt_v3(ml->quat, ml_mat[0]);
- mul_qt_v3(ml->quat, ml_mat[1]);
- mul_qt_v3(ml->quat, ml_mat[2]);
- normalize_m3(ml_mat);
-
- for (ml_iter = mb->editelems->first; ml_iter; ml_iter = ml_iter->next) {
- if ((ml_iter->flag & SELECT) == 0) {
- float ml_iter_mat[3][3];
-
- unit_m3(ml_iter_mat);
- mul_qt_v3(ml_iter->quat, ml_iter_mat[0]);
- mul_qt_v3(ml_iter->quat, ml_iter_mat[1]);
- mul_qt_v3(ml_iter->quat, ml_iter_mat[2]);
- normalize_m3(ml_iter_mat);
-
- if ((angle_normalized_v3v3(ml_mat[0], ml_iter_mat[0]) +
- angle_normalized_v3v3(ml_mat[1], ml_iter_mat[1]) +
- angle_normalized_v3v3(ml_mat[2], ml_iter_mat[2])) < thresh_rad)
- {
- ml_iter->flag |= SELECT;
+ if (tree != NULL) {
+ BLI_kdtree_balance(tree);
+ }
+ /* Select MetaBalls with desired type. */
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ MetaBall *mb = (MetaBall *)obedit->data;
+ bool changed = false;
+
+ switch (type) {
+ case SIMMBALL_TYPE:
+ {
+ MetaElem *ml;
+ for (ml = mb->editelems->first; ml; ml = ml->next) {
+ short mball_type = 1 << (ml->type + 1);
+ if (mball_type & type_ref) {
+ ml->flag |= SELECT;
changed = true;
}
}
+ break;
}
+ case SIMMBALL_RADIUS:
+ case SIMMBALL_STIFFNESS:
+ case SIMMBALL_ROTATION:
+ changed = mball_select_similar_type(obedit, mb, type, tree, thresh);
+ break;
+ default:
+ BLI_assert(0);
+ break;
}
- }
-
- return changed;
-}
-static int mball_select_similar_exec(bContext *C, wmOperator *op)
-{
- Object *obedit = CTX_data_edit_object(C);
- MetaBall *mb = (MetaBall *)obedit->data;
-
- int type = RNA_enum_get(op->ptr, "type");
- float thresh = RNA_float_get(op->ptr, "threshold");
- bool changed = false;
-
- switch (type) {
- case SIMMBALL_TYPE:
- changed = mball_select_similar_type(mb);
- break;
- case SIMMBALL_RADIUS:
- changed = mball_select_similar_radius(mb, thresh);
- break;
- case SIMMBALL_STIFFNESS:
- changed = mball_select_similar_stiffness(mb, thresh);
- break;
- case SIMMBALL_ROTATION:
- changed = mball_select_similar_rotation(mb, thresh);
- break;
- default:
- BLI_assert(0);
- break;
+ if (changed) {
+ DEG_id_tag_update(&mb->id, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, mb);
+ }
}
- if (changed) {
- DEG_id_tag_update(&mb->id, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, mb);
+ MEM_freeN(objects);
+ if (tree != NULL) {
+ BLI_kdtree_free(tree);
}
-
return OPERATOR_FINISHED;
}
@@ -362,7 +414,7 @@ void MBALL_OT_select_similar(wmOperatorType *ot)
/* properties */
ot->prop = RNA_def_enum(ot->srna, "type", prop_similar_types, 0, "Type", "");
- RNA_def_float(ot->srna, "threshold", 0.1, 0.0, 1.0, "Threshold", "", 0.01, 1.0);
+ RNA_def_float(ot->srna, "threshold", 0.1, 0.0, FLT_MAX, "Threshold", "", 0.01, 1.0);
}
@@ -436,25 +488,34 @@ void MBALL_OT_select_random_metaelems(struct wmOperatorType *ot)
/* Duplicate selected MetaElements */
static int duplicate_metaelems_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *obedit = CTX_data_edit_object(C);
- MetaBall *mb = (MetaBall *)obedit->data;
- MetaElem *ml, *newml;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ MetaBall *mb = (MetaBall *)obedit->data;
+ MetaElem *ml, *newml;
- ml = mb->editelems->last;
- if (ml) {
- while (ml) {
- if (ml->flag & SELECT) {
- newml = MEM_dupallocN(ml);
- BLI_addtail(mb->editelems, newml);
- mb->lastelem = newml;
- ml->flag &= ~SELECT;
+ if (!BKE_mball_is_any_selected(mb)) {
+ continue;
+ }
+
+ ml = mb->editelems->last;
+ if (ml) {
+ while (ml) {
+ if (ml->flag & SELECT) {
+ newml = MEM_dupallocN(ml);
+ BLI_addtail(mb->editelems, newml);
+ mb->lastelem = newml;
+ ml->flag &= ~SELECT;
+ }
+ ml = ml->prev;
}
- ml = ml->prev;
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, mb);
+ DEG_id_tag_update(obedit->data, 0);
}
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, mb);
- DEG_id_tag_update(obedit->data, 0);
}
-
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -478,25 +539,34 @@ void MBALL_OT_duplicate_metaelems(wmOperatorType *ot)
/* Delete all selected MetaElems (not MetaBall) */
static int delete_metaelems_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *obedit = CTX_data_edit_object(C);
- MetaBall *mb = (MetaBall *)obedit->data;
- MetaElem *ml, *next;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ MetaBall *mb = (MetaBall *)obedit->data;
+ MetaElem *ml, *next;
- ml = mb->editelems->first;
- if (ml) {
- while (ml) {
- next = ml->next;
- if (ml->flag & SELECT) {
- if (mb->lastelem == ml) mb->lastelem = NULL;
- BLI_remlink(mb->editelems, ml);
- MEM_freeN(ml);
+ if (!BKE_mball_is_any_selected(mb)) {
+ continue;
+ }
+
+ ml = mb->editelems->first;
+ if (ml) {
+ while (ml) {
+ next = ml->next;
+ if (ml->flag & SELECT) {
+ if (mb->lastelem == ml) mb->lastelem = NULL;
+ BLI_remlink(mb->editelems, ml);
+ MEM_freeN(ml);
+ }
+ ml = next;
}
- ml = next;
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, mb);
+ DEG_id_tag_update(obedit->data, 0);
}
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, mb);
- DEG_id_tag_update(obedit->data, 0);
}
-
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -508,6 +578,7 @@ void MBALL_OT_delete_metaelems(wmOperatorType *ot)
ot->idname = "MBALL_OT_delete_metaelems";
/* callback functions */
+ ot->invoke = WM_operator_confirm;
ot->exec = delete_metaelems_exec;
ot->poll = ED_operator_editmball;
@@ -606,10 +677,7 @@ void MBALL_OT_reveal_metaelems(wmOperatorType *ot)
bool ED_mball_select_pick(bContext *C, const int mval[2], bool extend, bool deselect, bool toggle)
{
static MetaElem *startelem = NULL;
- Object *obedit = CTX_data_edit_object(C);
ViewContext vc;
- MetaBall *mb = (MetaBall *)obedit->data;
- MetaElem *ml, *ml_act = NULL;
int a, hits;
unsigned int buffer[MAXPICKBUF];
rcti rect;
@@ -622,66 +690,116 @@ bool ED_mball_select_pick(bContext *C, const int mval[2], bool extend, bool dese
&vc, buffer, MAXPICKBUF, &rect,
VIEW3D_SELECT_PICK_NEAREST, VIEW3D_SELECT_FILTER_NOP);
- /* does startelem exist? */
- ml = mb->editelems->first;
- while (ml) {
- if (ml == startelem) break;
- ml = ml->next;
- }
-
- if (ml == NULL) startelem = mb->editelems->first;
+ FOREACH_BASE_IN_EDIT_MODE_BEGIN (vc.view_layer, base) {
+ ED_view3d_viewcontext_init_object(&vc, base->object);
+ MetaBall *mb = (MetaBall *)base->object->data;
+ MetaElem *ml, *ml_act = NULL;
- if (hits > 0) {
- ml = startelem;
+ /* does startelem exist? */
+ ml = mb->editelems->first;
while (ml) {
- for (a = 0; a < hits; a++) {
- /* index converted for gl stuff */
- if (ml->selcol1 == buffer[4 * a + 3]) {
- ml->flag |= MB_SCALE_RAD;
- ml_act = ml;
- }
- if (ml->selcol2 == buffer[4 * a + 3]) {
- ml->flag &= ~MB_SCALE_RAD;
- ml_act = ml;
- }
- }
- if (ml_act) break;
- ml = ml->next;
- if (ml == NULL) ml = mb->editelems->first;
if (ml == startelem) break;
+ ml = ml->next;
}
- /* When some metaelem was found, then it is necessary to select or
- * deselect it. */
- if (ml_act) {
- if (extend) {
- ml_act->flag |= SELECT;
- }
- else if (deselect) {
- ml_act->flag &= ~SELECT;
+ if (ml == NULL) startelem = mb->editelems->first;
+
+ if (hits > 0) {
+ int metaelem_id = 0;
+ ml = startelem;
+ while (ml) {
+ for (a = 0; a < hits; a++) {
+ int hitresult = buffer[(4 * a) + 3];
+ if (hitresult == -1) {
+ continue;
+ }
+ else if (hitresult & MBALL_NOSEL) {
+ continue;
+ }
+
+ const uint hit_object = hitresult & 0xFFFF;
+ if (vc.obedit->select_color != hit_object) {
+ continue;
+ }
+
+ if (metaelem_id != (hitresult & 0xFFFF0000 & ~(MBALLSEL_ANY))) {
+ continue;
+ }
+
+ if (hitresult & MBALLSEL_RADIUS) {
+ ml->flag |= MB_SCALE_RAD;
+ ml_act = ml;
+ break;
+ }
+
+ if (hitresult & MBALLSEL_STIFF) {
+ ml->flag &= ~MB_SCALE_RAD;
+ ml_act = ml;
+ break;
+ }
+ }
+
+ if (ml_act) break;
+ ml = ml->next;
+ if (ml == NULL) ml = mb->editelems->first;
+ if (ml == startelem) break;
+
+ metaelem_id += 0x10000;
}
- else if (toggle) {
- if (ml_act->flag & SELECT)
+
+ /* When some metaelem was found, then it is necessary to select or
+ * deselect it. */
+ if (ml_act) {
+ if (!extend && !deselect && !toggle) {
+ uint objects_len;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(vc.view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob_iter = objects[ob_index];
+
+ if (ob_iter == base->object) {
+ continue;
+ }
+
+ BKE_mball_deselect_all((MetaBall *)ob_iter->data);
+ DEG_id_tag_update(ob_iter->data, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob_iter->data);
+ }
+ MEM_freeN(objects);
+ }
+
+ if (extend) {
+ ml_act->flag |= SELECT;
+ }
+ else if (deselect) {
ml_act->flag &= ~SELECT;
- else
+ }
+ else if (toggle) {
+ if (ml_act->flag & SELECT)
+ ml_act->flag &= ~SELECT;
+ else
+ ml_act->flag |= SELECT;
+ }
+ else {
+ /* Deselect all existing metaelems */
+ BKE_mball_deselect_all(mb);
+
+ /* Select only metaelem clicked on */
ml_act->flag |= SELECT;
- }
- else {
- /* Deselect all existing metaelems */
- BKE_mball_deselect_all(mb);
+ }
- /* Select only metaelem clicked on */
- ml_act->flag |= SELECT;
- }
+ mb->lastelem = ml_act;
- mb->lastelem = ml_act;
+ DEG_id_tag_update(&mb->id, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, mb);
- DEG_id_tag_update(&mb->id, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, mb);
+ if (vc.view_layer->basact != base) {
+ ED_object_base_activate(C, base);
+ }
- return true;
+ return true;
+ }
}
- }
+ } FOREACH_BASE_IN_EDIT_MODE_END;
return false;
}
diff --git a/source/blender/editors/metaball/mball_ops.c b/source/blender/editors/metaball/mball_ops.c
index 97636b59143..0e029e36e0e 100644
--- a/source/blender/editors/metaball/mball_ops.c
+++ b/source/blender/editors/metaball/mball_ops.c
@@ -70,34 +70,6 @@ void ED_operatormacros_metaball(void)
void ED_keymap_metaball(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap;
- wmKeyMapItem *kmi;
-
- keymap = WM_keymap_ensure(keyconf, "Metaball", 0, 0);
+ wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Metaball", 0, 0);
keymap->poll = ED_operator_editmball;
-
- WM_keymap_add_item(keymap, "OBJECT_OT_metaball_add", AKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "MBALL_OT_reveal_metaelems", HKEY, KM_PRESS, KM_ALT, 0);
- kmi = WM_keymap_add_item(keymap, "MBALL_OT_hide_metaelems", HKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
- kmi = WM_keymap_add_item(keymap, "MBALL_OT_hide_metaelems", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
-
- WM_keymap_add_item(keymap, "MBALL_OT_delete_metaelems", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "MBALL_OT_delete_metaelems", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "MBALL_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
-
- kmi = WM_keymap_add_item(keymap, "MBALL_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "MBALL_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "MBALL_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- WM_keymap_add_item(keymap, "MBALL_OT_select_similar", GKEY, KM_PRESS, KM_SHIFT, 0);
-
- ED_keymap_proportional_cycle(keyconf, keymap);
- ED_keymap_proportional_editmode(keyconf, keymap, true);
}
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 36944a53877..46a244d2a33 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -67,18 +67,17 @@
#include "BKE_context.h"
#include "BKE_constraint.h"
#include "BKE_curve.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_displist.h"
#include "BKE_effect.h"
#include "BKE_font.h"
#include "BKE_gpencil.h"
+#include "BKE_key.h"
#include "BKE_lamp.h"
#include "BKE_lattice.h"
#include "BKE_layer.h"
#include "BKE_library.h"
#include "BKE_library_query.h"
#include "BKE_library_remap.h"
-#include "BKE_key.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_mball.h"
@@ -301,9 +300,6 @@ void ED_object_add_generic_props(wmOperatorType *ot, bool do_editmode)
"Rotation", "Rotation for the newly added object",
DEG2RADF(-360.0f), DEG2RADF(360.0f));
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
-
- prop = RNA_def_boolean_layer_member(ot->srna, "layers", 20, NULL, "Layer", "");
- RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
}
void ED_object_add_mesh_props(wmOperatorType *ot)
@@ -313,10 +309,8 @@ void ED_object_add_mesh_props(wmOperatorType *ot)
bool ED_object_add_generic_get_opts(bContext *C, wmOperator *op, const char view_align_axis,
float loc[3], float rot[3],
- bool *enter_editmode, unsigned int *layer, bool *is_view_aligned)
+ bool *enter_editmode, bool *is_view_aligned)
{
- View3D *v3d = CTX_wm_view3d(C);
- unsigned int _layer;
PropertyRNA *prop;
/* Switch to Edit mode? optional prop */
@@ -333,37 +327,6 @@ bool ED_object_add_generic_get_opts(bContext *C, wmOperator *op, const char view
}
}
- /* Get layers! */
- {
- int a;
- bool layer_values[20];
- if (!layer)
- layer = &_layer;
-
- prop = RNA_struct_find_property(op->ptr, "layers");
- if (RNA_property_is_set(op->ptr, prop)) {
- RNA_property_boolean_get_array(op->ptr, prop, layer_values);
- *layer = 0;
- for (a = 0; a < 20; a++) {
- if (layer_values[a])
- *layer |= (1 << a);
- }
- }
- else {
- Scene *scene = CTX_data_scene(C);
- *layer = BKE_screen_view3d_layer_active_ex(v3d, scene, false);
- for (a = 0; a < 20; a++) {
- layer_values[a] = (*layer & (1 << a)) != 0;
- }
- RNA_property_boolean_set_array(op->ptr, prop, layer_values);
- }
-
- /* in local view we additionally add local view layers,
- * not part of operator properties */
- if (v3d && v3d->localvd)
- *layer |= v3d->lay;
- }
-
/* Location! */
{
float _loc[3];
@@ -405,11 +368,6 @@ bool ED_object_add_generic_get_opts(bContext *C, wmOperator *op, const char view
RNA_float_get_array(op->ptr, "rotation", rot);
}
- if (layer && *layer == 0) {
- BKE_report(op->reports, RPT_ERROR, "Property 'layer' has no values set");
- return false;
- }
-
return true;
}
@@ -419,7 +377,7 @@ Object *ED_object_add_type(
bContext *C,
int type, const char *name,
const float loc[3], const float rot[3],
- bool enter_editmode, unsigned int UNUSED(layer))
+ bool enter_editmode)
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
@@ -431,7 +389,7 @@ Object *ED_object_add_type(
ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR);
}
- /* deselects all, sets scene->basact */
+ /* deselects all, sets active object */
ob = BKE_object_add(bmain, scene, view_layer, type, name);
/* editor level activate, notifiers */
ED_object_base_activate(C, view_layer->basact);
@@ -464,15 +422,14 @@ static int object_add_exec(bContext *C, wmOperator *op)
{
Object *ob;
bool enter_editmode;
- unsigned int layer;
float loc[3], rot[3], radius;
WM_operator_view3d_unit_defaults(C, op);
- if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL))
+ if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL))
return OPERATOR_CANCELLED;
radius = RNA_float_get(op->ptr, "radius");
- ob = ED_object_add_type(C, RNA_enum_get(op->ptr, "type"), NULL, loc, rot, enter_editmode, layer);
+ ob = ED_object_add_type(C, RNA_enum_get(op->ptr, "type"), NULL, loc, rot, enter_editmode);
if (ob->type == OB_LATTICE) {
/* lattice is a special case!
@@ -510,25 +467,34 @@ void OBJECT_OT_add(wmOperatorType *ot)
/********************** Add Probe Operator **********************/
/* for object add operator */
+static const char *get_lightprobe_defname(int type)
+{
+ switch (type) {
+ case LIGHTPROBE_TYPE_GRID: return CTX_DATA_(BLT_I18NCONTEXT_ID_LAMP, "IrradianceVolume");
+ case LIGHTPROBE_TYPE_PLANAR: return CTX_DATA_(BLT_I18NCONTEXT_ID_LAMP, "ReflectionPlane");
+ case LIGHTPROBE_TYPE_CUBE: return CTX_DATA_(BLT_I18NCONTEXT_ID_LAMP, "ReflectionCubemap");
+ default:
+ return CTX_DATA_(BLT_I18NCONTEXT_ID_LAMP, "LightProbe");
+ }
+}
+
static int lightprobe_add_exec(bContext *C, wmOperator *op)
{
Object *ob;
LightProbe *probe;
int type;
bool enter_editmode;
- unsigned int layer;
float loc[3], rot[3];
float radius;
WM_operator_view3d_unit_defaults(C, op);
- if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL))
+ if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL))
return OPERATOR_CANCELLED;
type = RNA_enum_get(op->ptr, "type");
radius = RNA_float_get(op->ptr, "radius");
- const char *name = CTX_DATA_(BLT_I18NCONTEXT_ID_OBJECT, "Light Probe");
- ob = ED_object_add_type(C, OB_LIGHTPROBE, name, loc, rot, false, layer);
+ ob = ED_object_add_type(C, OB_LIGHTPROBE, get_lightprobe_defname(type), loc, rot, false);
BKE_object_obdata_size_init(ob, radius);
probe = (LightProbe *)ob->data;
@@ -550,7 +516,7 @@ static int lightprobe_add_exec(bContext *C, wmOperator *op)
probe->attenuation_type = LIGHTPROBE_SHAPE_ELIPSOID;
break;
default:
- BLI_assert(!"Lightprobe type not configured.");
+ BLI_assert(!"LightProbe type not configured.");
break;
}
@@ -588,13 +554,12 @@ static int effector_add_exec(bContext *C, wmOperator *op)
Object *ob;
int type;
bool enter_editmode;
- unsigned int layer;
float loc[3], rot[3];
float mat[4][4];
float dia;
WM_operator_view3d_unit_defaults(C, op);
- if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL))
+ if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL))
return OPERATOR_CANCELLED;
type = RNA_enum_get(op->ptr, "type");
@@ -603,7 +568,7 @@ static int effector_add_exec(bContext *C, wmOperator *op)
if (type == PFIELD_GUIDE) {
Curve *cu;
const char *name = CTX_DATA_(BLT_I18NCONTEXT_ID_OBJECT, "CurveGuide");
- ob = ED_object_add_type(C, OB_CURVE, name, loc, rot, false, layer);
+ ob = ED_object_add_type(C, OB_CURVE, name, loc, rot, false);
cu = ob->data;
cu->flag |= CU_PATH | CU_3D;
@@ -615,7 +580,7 @@ static int effector_add_exec(bContext *C, wmOperator *op)
}
else {
const char *name = CTX_DATA_(BLT_I18NCONTEXT_ID_OBJECT, "Field");
- ob = ED_object_add_type(C, OB_EMPTY, name, loc, rot, false, layer);
+ ob = ED_object_add_type(C, OB_EMPTY, name, loc, rot, false);
BKE_object_obdata_size_init(ob, dia);
if (ELEM(type, PFIELD_WIND, PFIELD_VORTEX))
ob->empty_drawtype = OB_SINGLE_ARROW;
@@ -658,16 +623,15 @@ static int object_camera_add_exec(bContext *C, wmOperator *op)
Object *ob;
Camera *cam;
bool enter_editmode;
- unsigned int layer;
float loc[3], rot[3];
/* force view align for cameras */
RNA_boolean_set(op->ptr, "view_align", true);
- if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL))
+ if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL))
return OPERATOR_CANCELLED;
- ob = ED_object_add_type(C, OB_CAMERA, NULL, loc, rot, false, layer);
+ ob = ED_object_add_type(C, OB_CAMERA, NULL, loc, rot, false);
if (v3d) {
if (v3d->camera == NULL)
@@ -714,17 +678,16 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op)
Object *obedit = CTX_data_edit_object(C);
bool newob = false;
bool enter_editmode;
- unsigned int layer;
float loc[3], rot[3];
float mat[4][4];
float dia;
WM_operator_view3d_unit_defaults(C, op);
- if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL))
+ if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL))
return OPERATOR_CANCELLED;
if (obedit == NULL || obedit->type != OB_MBALL) {
- obedit = ED_object_add_type(C, OB_MBALL, NULL, loc, rot, true, layer);
+ obedit = ED_object_add_type(C, OB_MBALL, NULL, loc, rot, true);
newob = true;
}
else {
@@ -773,17 +736,16 @@ static int object_add_text_exec(bContext *C, wmOperator *op)
{
Object *obedit = CTX_data_edit_object(C);
bool enter_editmode;
- unsigned int layer;
float loc[3], rot[3];
WM_operator_view3d_unit_defaults(C, op);
- if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL))
+ if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL))
return OPERATOR_CANCELLED;
if (obedit && obedit->type == OB_FONT)
return OPERATOR_CANCELLED;
- obedit = ED_object_add_type(C, OB_FONT, NULL, loc, rot, enter_editmode, layer);
+ obedit = ED_object_add_type(C, OB_FONT, NULL, loc, rot, enter_editmode);
BKE_object_obdata_size_init(obedit, RNA_float_get(op->ptr, "radius"));
WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit);
@@ -818,16 +780,15 @@ static int object_armature_add_exec(bContext *C, wmOperator *op)
RegionView3D *rv3d = CTX_wm_region_view3d(C);
bool newob = false;
bool enter_editmode;
- unsigned int layer;
float loc[3], rot[3], dia;
bool view_aligned = rv3d && (U.flag & USER_ADD_VIEWALIGNED);
WM_operator_view3d_unit_defaults(C, op);
- if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL))
+ if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL))
return OPERATOR_CANCELLED;
if ((obedit == NULL) || (obedit->type != OB_ARMATURE)) {
- obedit = ED_object_add_type(C, OB_ARMATURE, NULL, loc, rot, true, layer);
+ obedit = ED_object_add_type(C, OB_ARMATURE, NULL, loc, rot, true);
ED_object_editmode_enter(C, 0);
newob = true;
}
@@ -877,14 +838,13 @@ static int object_empty_add_exec(bContext *C, wmOperator *op)
{
Object *ob;
int type = RNA_enum_get(op->ptr, "type");
- unsigned int layer;
float loc[3], rot[3];
WM_operator_view3d_unit_defaults(C, op);
- if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &layer, NULL))
+ if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, NULL))
return OPERATOR_CANCELLED;
- ob = ED_object_add_type(C, OB_EMPTY, NULL, loc, rot, false, layer);
+ ob = ED_object_add_type(C, OB_EMPTY, NULL, loc, rot, false);
BKE_object_empty_draw_type_set(ob, type);
BKE_object_obdata_size_init(ob, RNA_float_get(op->ptr, "radius"));
@@ -918,9 +878,7 @@ static int empty_drop_named_image_invoke(bContext *C, wmOperator *op, const wmEv
{
Scene *scene = CTX_data_scene(C);
- Base *base = NULL;
Image *ima = NULL;
- Object *ob = NULL;
ima = (Image *)WM_operator_drop_load_path(C, op, ID_IM);
if (!ima) {
@@ -929,27 +887,22 @@ static int empty_drop_named_image_invoke(bContext *C, wmOperator *op, const wmEv
/* handled below */
id_us_min((ID *)ima);
- base = ED_view3d_give_base_under_cursor(C, event->mval);
+ Object *ob = NULL;
+ Object *ob_cursor = ED_view3d_give_object_under_cursor(C, event->mval);
- /* if empty under cursor, then set object */
- if (base && base->object->type == OB_EMPTY) {
- ob = base->object;
- DEG_id_tag_update(&scene->id, DEG_TAG_SELECT_UPDATE);
+ /* either change empty under cursor or create a new empty */
+ if (ob_cursor && ob_cursor->type == OB_EMPTY) {
WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene);
+ DEG_id_tag_update((ID *)ob_cursor, DEG_TAG_TRANSFORM);
+ ob = ob_cursor;
}
else {
- /* add new empty */
- unsigned int layer;
- float rot[3];
+ ob = ED_object_add_type(C, OB_EMPTY, NULL, NULL, NULL, false);
- if (!ED_object_add_generic_get_opts(C, op, 'Z', NULL, rot, NULL, &layer, NULL))
- return OPERATOR_CANCELLED;
-
- ob = ED_object_add_type(C, OB_EMPTY, NULL, NULL, rot, false, layer);
-
- /* add under the mouse */
ED_object_location_from_view(C, ob->loc);
ED_view3d_cursor3d_position(C, event->mval, false, ob->loc);
+ ED_object_rotation_from_view(C, ob->rot, 'Z');
+ ob->empty_drawsize = 5.0f;
}
BKE_object_empty_draw_type_set(ob, OB_EMPTY_IMAGE);
@@ -997,32 +950,37 @@ static int object_gpencil_add_exec(bContext *C, wmOperator *op)
const int type = RNA_enum_get(op->ptr, "type");
float loc[3], rot[3];
- unsigned int layer;
bool newob = false;
- /* Hack: Force view-align to be on by default
- * since it's not nice for adding shapes in 2D
- * for them to end up aligned oddly, but only for Monkey
- */
- if ((RNA_struct_property_is_set(op->ptr, "view_align") == false) &&
- (type == GP_MONKEY))
- {
- RNA_boolean_set(op->ptr, "view_align", true);
- }
-
/* Note: We use 'Y' here (not 'Z'), as */
WM_operator_view3d_unit_defaults(C, op);
- if (!ED_object_add_generic_get_opts(C, op, 'Y', loc, rot, NULL, &layer, NULL))
+ if (!ED_object_add_generic_get_opts(C, op, 'Y', loc, rot, NULL, NULL))
return OPERATOR_CANCELLED;
/* add new object if not currently editing a GP object,
* or if "empty" was chosen (i.e. user wants a blank GP canvas)
*/
if ((gpd == NULL) || (GPENCIL_ANY_MODE(gpd) == false) || (type == GP_EMPTY)) {
- const char *ob_name = (type == GP_MONKEY) ? "Suzanne" : NULL;
- float radius = RNA_float_get(op->ptr, "radius");
+ const char *ob_name = NULL;
+ switch (type) {
+ case GP_MONKEY:
+ {
+ ob_name = "Suzanne";
+ break;
+ }
+ case GP_STROKE:
+ {
+ ob_name = "Stroke";
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
- ob = ED_object_add_type(C, OB_GPENCIL, ob_name, loc, rot, true, layer);
+ float radius = RNA_float_get(op->ptr, "radius");
+ ob = ED_object_add_type(C, OB_GPENCIL, ob_name, loc, rot, true);
gpd = ob->data;
newob = true;
@@ -1081,8 +1039,8 @@ static int object_gpencil_add_exec(bContext *C, wmOperator *op)
void OBJECT_OT_gpencil_add(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Add GPencil";
- ot->description = "Add a grease pencil object to the scene";
+ ot->name = "Add Grease Pencil";
+ ot->description = "Add a Grease Pencil object to the scene";
ot->idname = "OBJECT_OT_gpencil_add";
/* api callbacks */
@@ -1121,14 +1079,13 @@ static int object_light_add_exec(bContext *C, wmOperator *op)
Object *ob;
Lamp *la;
int type = RNA_enum_get(op->ptr, "type");
- unsigned int layer;
float loc[3], rot[3];
WM_operator_view3d_unit_defaults(C, op);
- if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &layer, NULL))
+ if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, NULL))
return OPERATOR_CANCELLED;
- ob = ED_object_add_type(C, OB_LAMP, get_light_defname(type), loc, rot, false, layer);
+ ob = ED_object_add_type(C, OB_LAMP, get_light_defname(type), loc, rot, false);
float size = RNA_float_get(op->ptr, "radius");
/* Better defaults for light size. */
@@ -1185,7 +1142,6 @@ static int collection_instance_add_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
Collection *collection;
- unsigned int layer;
float loc[3], rot[3];
if (RNA_struct_property_is_set(op->ptr, "name")) {
@@ -1207,7 +1163,7 @@ static int collection_instance_add_exec(bContext *C, wmOperator *op)
else
collection = BLI_findlink(&CTX_data_main(C)->collection, RNA_enum_get(op->ptr, "collection"));
- if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &layer, NULL))
+ if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, NULL))
return OPERATOR_CANCELLED;
if (collection) {
@@ -1220,7 +1176,7 @@ static int collection_instance_add_exec(bContext *C, wmOperator *op)
active_lc = BKE_layer_collection_activate_parent(view_layer, active_lc);
}
- Object *ob = ED_object_add_type(C, OB_EMPTY, collection->id.name + 2, loc, rot, false, layer);
+ Object *ob = ED_object_add_type(C, OB_EMPTY, collection->id.name + 2, loc, rot, false);
ob->dup_group = collection;
ob->transflag |= OB_DUPLICOLLECTION;
id_us_plus(&collection->id);
@@ -1268,14 +1224,13 @@ void OBJECT_OT_collection_instance_add(wmOperatorType *ot)
static int object_speaker_add_exec(bContext *C, wmOperator *op)
{
Object *ob;
- unsigned int layer;
float loc[3], rot[3];
Scene *scene = CTX_data_scene(C);
- if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &layer, NULL))
+ if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, NULL))
return OPERATOR_CANCELLED;
- ob = ED_object_add_type(C, OB_SPEAKER, NULL, loc, rot, false, layer);
+ ob = ED_object_add_type(C, OB_SPEAKER, NULL, loc, rot, false);
/* 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
@@ -1454,7 +1409,9 @@ void OBJECT_OT_delete(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
- RNA_def_boolean(ot->srna, "use_global", 0, "Delete Globally", "Remove object from all scenes");
+ PropertyRNA *prop;
+ prop = RNA_def_boolean(ot->srna, "use_global", 0, "Delete Globally", "Remove object from all scenes");
+ RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
}
/**************************** Copy Utilities ******************************/
@@ -1677,7 +1634,7 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base,
* still work out ok */
BKE_object_apply_mat4(ob_dst, dob->mat, false, true);
- /* to set ob_dst->orig and in case theres any other discrepicies */
+ /* to set ob_dst->orig and in case there's any other discrepancies */
DEG_id_tag_update(&ob_dst->id, OB_RECALC_OB);
}
}
@@ -1822,7 +1779,6 @@ static int convert_exec(bContext *C, wmOperator *op)
ViewLayer *view_layer = CTX_data_view_layer(C);
Base *basen = NULL, *basact = NULL;
Object *ob1, *obact = CTX_data_active_object(C);
- DerivedMesh *dm;
Curve *cu;
Nurb *nu;
MetaBall *mb;
@@ -1838,7 +1794,7 @@ static int convert_exec(bContext *C, wmOperator *op)
{
ob->flag &= ~OB_DONE;
- /* flag data thats not been edited (only needed for !keep_original) */
+ /* flag data that's not been edited (only needed for !keep_original) */
if (ob->data) {
((ID *)ob->data)->tag |= LIB_TAG_DOIT;
}
@@ -1867,7 +1823,7 @@ static int convert_exec(bContext *C, wmOperator *op)
Base *base = link->ptr.data;
Object *ob = base->object;
- /* The way object type conversion works currently (enforcing conversion of *all* objetcs using converted
+ /* The way object type conversion works currently (enforcing conversion of *all* objects using converted
* obdata, even some un-selected/hidden/inother scene ones, sounds totally bad to me.
* However, changing this is more design than bugfix, not to mention convoluted code below,
* so that will be for later.
@@ -1957,14 +1913,13 @@ static int convert_exec(bContext *C, wmOperator *op)
/* make new mesh data from the original copy */
/* note: get the mesh from the original, not from the copy in some
- * cases this doesnt give correct results (when MDEF is used for eg)
+ * cases this doesn't give correct results (when MDEF is used for eg)
*/
- dm = mesh_get_derived_final(depsgraph, scene, newob, CD_MASK_MESH);
-
- DM_to_mesh(dm, newob->data, newob, CD_MASK_MESH, true);
-
- /* re-tessellation is called by DM_to_mesh */
-
+ Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, newob, CD_MASK_MESH);
+ if (newob->runtime.mesh_eval == me_eval) {
+ newob->runtime.mesh_eval = NULL;
+ }
+ BKE_mesh_nomain_to_mesh(me_eval, newob->data, newob, CD_MASK_MESH, true);
BKE_object_free_modifiers(newob, 0); /* after derivedmesh calls! */
}
else if (ob->type == OB_FONT) {
@@ -1990,6 +1945,7 @@ static int convert_exec(bContext *C, wmOperator *op)
* datablock, but for until we've got granular update
* lets take care by selves.
*/
+ /* XXX This may fail/crash, since BKE_vfont_to_curve() accesses evaluated data in some cases (bastien). */
BKE_vfont_to_curve(newob, FO_EDIT);
newob->type = OB_CURVE;
diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c
index 8ad0d09a9fb..5a650d9dc05 100644
--- a/source/blender/editors/object/object_bake.c
+++ b/source/blender/editors/object/object_bake.c
@@ -230,21 +230,21 @@ static DerivedMesh *multiresbake_create_loresdm(Scene *scene, Object *ob, int *l
MultiresModifierData tmp_mmd = *mmd;
DerivedMesh *cddm = CDDM_from_mesh(me);
- if (mmd->lvl > 0) {
- *lvl = mmd->lvl;
+ DM_set_only_copy(cddm, CD_MASK_BAREMESH);
+
+ if (mmd->lvl == 0) {
+ dm = CDDM_copy(cddm);
}
else {
- *lvl = 1;
- tmp_mmd.simple = true;
+ tmp_mmd.lvl = mmd->lvl;
+ tmp_mmd.sculptlvl = mmd->lvl;
+ dm = multires_make_derived_from_derived(cddm, &tmp_mmd, scene, ob, 0);
}
- DM_set_only_copy(cddm, CD_MASK_BAREMESH);
-
- tmp_mmd.lvl = *lvl;
- tmp_mmd.sculptlvl = *lvl;
- dm = multires_make_derived_from_derived(cddm, &tmp_mmd, scene, ob, 0);
cddm->release(cddm);
+ *lvl = mmd->lvl;
+
return dm;
}
diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c
index d0d82a8ccc7..2f879937f7a 100644
--- a/source/blender/editors/object/object_bake_api.c
+++ b/source/blender/editors/object/object_bake_api.c
@@ -53,10 +53,10 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_material.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
#include "BKE_node.h"
#include "BKE_report.h"
-#include "BKE_modifier.h"
-#include "BKE_mesh.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
@@ -635,7 +635,7 @@ static Mesh *bake_mesh_new_from_object(Depsgraph *depsgraph, Main *bmain, Scene
{
ED_object_editmode_load(bmain, ob);
- Mesh *me = BKE_mesh_new_from_object(depsgraph, bmain, scene, ob, 1, 0, 0);
+ Mesh *me = BKE_mesh_new_from_object(depsgraph, bmain, scene, ob, 1, 0);
if (me->flag & ME_AUTOSMOOTH) {
BKE_mesh_split_faces(me, true);
}
diff --git a/source/blender/editors/object/object_collection.c b/source/blender/editors/object/object_collection.c
index 8386b1fc520..57f1ad7dea1 100644
--- a/source/blender/editors/object/object_collection.c
+++ b/source/blender/editors/object/object_collection.c
@@ -44,8 +44,8 @@
#include "BKE_library.h"
#include "BKE_library_remap.h"
#include "BKE_main.h"
-#include "BKE_report.h"
#include "BKE_object.h"
+#include "BKE_report.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c
index 8de245fc369..212bf0ba018 100644
--- a/source/blender/editors/object/object_constraint.c
+++ b/source/blender/editors/object/object_constraint.c
@@ -430,6 +430,11 @@ static void test_constraint(Main *bmain, Object *owner, bPoseChannel *pchan, bCo
if (check_targets && cti && cti->get_constraint_targets) {
cti->get_constraint_targets(con, &targets);
+ /* constraints with empty target list that actually require targets */
+ if (!targets.first && ELEM(con->type, CONSTRAINT_TYPE_ARMATURE)) {
+ con->flag |= CONSTRAINT_DISABLE;
+ }
+
/* disable and clear constraints targets that are incorrect */
for (ct = targets.first; ct; ct = ct->next) {
/* general validity checks (for those constraints that need this) */
@@ -473,6 +478,18 @@ static void test_constraint(Main *bmain, Object *owner, bPoseChannel *pchan, bCo
}
}
}
+ else if (con->type == CONSTRAINT_TYPE_ARMATURE) {
+ if (ct->tar) {
+ if (ct->tar->type != OB_ARMATURE) {
+ ct->tar = NULL;
+ con->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (!BKE_armature_find_bone_name(BKE_armature_from_object(ct->tar), ct->subtarget)) {
+ /* bone must exist in armature... */
+ con->flag |= CONSTRAINT_DISABLE;
+ }
+ }
+ }
}
/* free any temporary targets */
@@ -501,7 +518,7 @@ static int constraint_type_get(Object *owner, bPoseChannel *pchan)
}
/* checks validity of object pointers, and NULLs,
- * if Bone doesnt exist it sets the CONSTRAINT_DISABLE flag.
+ * if Bone doesn't exist it sets the CONSTRAINT_DISABLE flag.
*/
static void test_constraints(Main *bmain, Object *owner, bPoseChannel *pchan)
{
@@ -599,7 +616,7 @@ static bool edit_constraint_poll_generic(bContext *C, StructRNA *rna_type)
}
if (ID_IS_STATIC_OVERRIDE(ob)) {
- CTX_wm_operator_poll_msg_set(C, "Cannot edit constraints comming from static override");
+ CTX_wm_operator_poll_msg_set(C, "Cannot edit constraints coming from static override");
return (((bConstraint *)ptr.data)->flag & CONSTRAINT_STATICOVERRIDE_LOCAL) != 0;
}
@@ -799,10 +816,10 @@ static void child_get_inverse_matrix(const bContext *C, Scene *scene, Object *ob
if (ob && ob->pose && (pchan = BKE_pose_channel_active(ob))) {
bConstraint *con_last;
/* calculate/set inverse matrix:
- * We just calculate all transform-stack eval up to but not including this constraint.
- * This is because inverse should just inverse correct for just the constraint's influence
- * when it gets applied; that is, at the time of application, we don't know anything about
- * what follows.
+ * We just calculate all transform-stack eval up to but not including this constraint.
+ * This is because inverse should just inverse correct for just the constraint's influence
+ * when it gets applied; that is, at the time of application, we don't know anything about
+ * what follows.
*/
float imat[4][4], tmat[4][4];
float pmat[4][4];
@@ -998,7 +1015,7 @@ static int followpath_path_animate_exec(bContext *C, wmOperator *op)
{
/* create F-Curve for path animation */
act = verify_adt_action(bmain, &cu->id, 1);
- fcu = verify_fcurve(act, NULL, NULL, "eval_time", 0, 1);
+ fcu = verify_fcurve(bmain, act, NULL, NULL, "eval_time", 0, 1);
/* standard vertical range - 1:1 = 100 frames */
standardRange = 100.0f;
@@ -1023,7 +1040,7 @@ static int followpath_path_animate_exec(bContext *C, wmOperator *op)
/* create F-Curve for constraint */
act = verify_adt_action(bmain, &ob->id, 1);
- fcu = verify_fcurve(act, NULL, NULL, path, 0, 1);
+ fcu = verify_fcurve(bmain, act, NULL, NULL, path, 0, 1);
/* standard vertical range - 0.0 to 1.0 */
standardRange = 1.0f;
@@ -1245,7 +1262,9 @@ void ED_object_constraint_tag_update(Main *bmain, Object *ob, bConstraint *con)
BKE_pose_tag_update_constraint_flags(ob->pose);
}
- object_test_constraint(bmain, ob, con);
+ if (con) {
+ object_test_constraint(bmain, ob, con);
+ }
if (ob->type == OB_ARMATURE)
DEG_id_tag_update(&ob->id, OB_RECALC_DATA | OB_RECALC_OB);
@@ -1421,13 +1440,19 @@ void CONSTRAINT_OT_move_up(wmOperatorType *ot)
static int pose_constraints_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain = CTX_data_main(C);
- Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C));
+ Object *prev_ob = NULL;
/* free constraints for all selected bones */
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones)
+ CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, selected_pose_bones, Object *, ob)
{
BKE_constraints_free(&pchan->constraints);
pchan->constflag &= ~(PCHAN_HAS_IK | PCHAN_HAS_SPLINEIK | PCHAN_HAS_CONST);
+
+ if (prev_ob != ob) {
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT | NA_REMOVED, ob);
+ prev_ob = ob;
+ }
}
CTX_DATA_END;
@@ -1436,10 +1461,6 @@ static int pose_constraints_clear_exec(bContext *C, wmOperator *UNUSED(op))
/* note, calling BIK_clear_data() isn't needed here */
- /* do updates */
- DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT | NA_REMOVED, ob);
-
return OPERATOR_FINISHED;
}
@@ -1495,8 +1516,6 @@ static int pose_constraint_copy_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
bPoseChannel *pchan = CTX_data_active_pose_bone(C);
- ListBase lb;
- CollectionPointerLink *link;
/* don't do anything if bone doesn't exist or doesn't have any constraints */
if (ELEM(NULL, pchan, pchan->constraints.first)) {
@@ -1504,23 +1523,25 @@ static int pose_constraint_copy_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- /* copy all constraints from active posebone to all selected posebones */
- CTX_data_selected_pose_bones(C, &lb);
- for (link = lb.first; link; link = link->next) {
- Object *ob = link->ptr.id.data;
- bPoseChannel *chan = link->ptr.data;
+ Object *prev_ob = NULL;
+ /* copy all constraints from active posebone to all selected posebones */
+ CTX_DATA_BEGIN_WITH_ID(C, bPoseChannel *, chan, selected_pose_bones, Object *, ob)
+ {
/* if we're not handling the object we're copying from, copy all constraints over */
if (pchan != chan) {
BKE_constraints_copy(&chan->constraints, &pchan->constraints, true);
/* update flags (need to add here, not just copy) */
chan->constflag |= pchan->constflag;
- BKE_pose_tag_recalc(bmain, ob->pose);
- DEG_id_tag_update((ID *)ob, OB_RECALC_DATA);
+ if (prev_ob != ob) {
+ BKE_pose_tag_recalc(bmain, ob->pose);
+ DEG_id_tag_update((ID *)ob, OB_RECALC_DATA);
+ prev_ob = ob;
+ }
}
}
- BLI_freelistN(&lb);
+ CTX_DATA_END;
/* force depsgraph to get recalculated since new relationships added */
DEG_relations_tag_update(bmain);
@@ -1637,7 +1658,7 @@ static bool get_new_constraint_target(bContext *C, int con_type, Object **tar_ob
/* if the active Object is Armature, and we can search for bones, do so... */
if ((obact->type == OB_ARMATURE) && (only_ob == false)) {
/* search in list of selected Pose-Channels for target */
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones)
+ CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones_from_active_object)
{
/* just use the first one that we encounter, as long as it is not the active one */
if (pchan != pchanact) {
@@ -1699,17 +1720,12 @@ static bool get_new_constraint_target(bContext *C, int con_type, Object **tar_ob
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
- Base *base = BASACT(view_layer), *newbase = NULL;
+ Base *base = BASACT(view_layer);
Object *obt;
/* add new target object */
obt = BKE_object_add(bmain, scene, view_layer, OB_EMPTY, NULL);
- /* set layers OK */
- newbase = BASACT(view_layer);
- newbase->lay = base->lay;
- obt->lay = newbase->lay;
-
/* transform cent to global coords for loc */
if (pchanact) {
/* since by default, IK targets the tip of the last bone, use the tip of the active PoseChannel
@@ -1769,7 +1785,7 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase
return OPERATOR_CANCELLED;
}
- /* create a new constraint of the type requried, and add it to the active/given constraints list */
+ /* create a new constraint of the type required, and add it to the active/given constraints list */
if (pchan)
con = BKE_constraint_add_for_pose(ob, pchan, NULL, type);
else
@@ -2004,7 +2020,7 @@ static int pose_ik_add_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED
return OPERATOR_CANCELLED;
}
- /* prepare popup menu to choose targetting options */
+ /* prepare popup menu to choose targeting options */
pup = UI_popup_menu_begin(C, IFACE_("Add IK"), ICON_NONE);
layout = UI_popup_menu_layout(pup);
@@ -2064,14 +2080,14 @@ void POSE_OT_ik_add(wmOperatorType *ot)
/* remove IK constraints from selected bones */
static int pose_ik_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C));
+ Object *prev_ob = NULL;
/* only remove IK Constraints */
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones)
+ CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, selected_pose_bones, Object *, ob)
{
bConstraint *con, *next;
- /* TODO: should we be checking if these contraints were local before we try and remove them? */
+ /* TODO: should we be checking if these constraints were local before we try and remove them? */
for (con = pchan->constraints.first; con; con = next) {
next = con->next;
if (con->type == CONSTRAINT_TYPE_KINEMATIC) {
@@ -2079,14 +2095,18 @@ static int pose_ik_clear_exec(bContext *C, wmOperator *UNUSED(op))
}
}
pchan->constflag &= ~(PCHAN_HAS_IK | PCHAN_HAS_TARGET);
- }
- CTX_DATA_END;
- /* refresh depsgraph */
- DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ if (prev_ob != ob) {
+ prev_ob = ob;
+
+ /* Refresh depsgraph. */
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT | NA_REMOVED, ob);
+ /* Note, notifier might evolve. */
+ WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT | NA_REMOVED, ob);
+ }
+ }
+ CTX_DATA_END;
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/object/object_data_transfer.c b/source/blender/editors/object/object_data_transfer.c
index ad0b091ede9..7b65d4c4f47 100644
--- a/source/blender/editors/object/object_data_transfer.c
+++ b/source/blender/editors/object/object_data_transfer.c
@@ -531,7 +531,7 @@ void OBJECT_OT_data_transfer(wmOperatorType *ot)
ot->check = data_transfer_check;
/* Flags.*/
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_USE_EVAL_DATA;
/* Properties.*/
prop = RNA_def_boolean(ot->srna, "use_reverse_transfer", false, "Reverse Transfer",
@@ -694,7 +694,7 @@ void OBJECT_OT_datalayout_transfer(wmOperatorType *ot)
ot->check = data_transfer_check;
/* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_USE_EVAL_DATA;
/* Properties.*/
edit_modifier_properties(ot);
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 58ecd7fb472..aa148512e16 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -67,25 +67,25 @@
#include "BKE_constraint.h"
#include "BKE_context.h"
#include "BKE_curve.h"
+#include "BKE_editlattice.h"
#include "BKE_effect.h"
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_lattice.h"
+#include "BKE_layer.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_mball.h"
#include "BKE_mesh.h"
+#include "BKE_modifier.h"
#include "BKE_object.h"
#include "BKE_paint.h"
#include "BKE_pointcache.h"
#include "BKE_softbody.h"
-#include "BKE_modifier.h"
-#include "BKE_editlattice.h"
#include "BKE_editmesh.h"
#include "BKE_report.h"
#include "BKE_workspace.h"
-#include "BKE_layer.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
@@ -1223,9 +1223,14 @@ void OBJECT_OT_forcefield_toggle(wmOperatorType *ot)
*
* To be called from various tools that do incremental updates
*/
-void ED_objects_recalculate_paths(bContext *C, Scene *scene)
+void ED_objects_recalculate_paths(bContext *C, Scene *scene, bool current_frame_only)
{
- struct Main *bmain = CTX_data_main(C);
+ /* Transform doesn't always have context available to do update. */
+ if (C == NULL) {
+ return;
+ }
+
+ Main *bmain = CTX_data_main(C);
Depsgraph *depsgraph = CTX_data_depsgraph(C);
ListBase targets = {NULL, NULL};
@@ -1239,17 +1244,20 @@ void ED_objects_recalculate_paths(bContext *C, Scene *scene)
CTX_DATA_END;
/* recalculate paths, then free */
- animviz_calc_motionpaths(depsgraph, bmain, scene, &targets);
+ animviz_calc_motionpaths(depsgraph, bmain, scene, &targets, true, current_frame_only);
BLI_freelistN(&targets);
- /* tag objects for copy on write - so paths will draw/redraw */
- CTX_DATA_BEGIN(C, Object *, ob, selected_editable_objects)
- {
- if (ob->mpath) {
- DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE);
+ if (!current_frame_only) {
+ /* Tag objects for copy on write - so paths will draw/redraw
+ * For currently frame only we update evaluated object directly. */
+ CTX_DATA_BEGIN(C, Object *, ob, selected_editable_objects)
+ {
+ if (ob->mpath) {
+ DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE);
+ }
}
+ CTX_DATA_END;
}
- CTX_DATA_END;
}
@@ -1271,7 +1279,7 @@ static int object_calculate_paths_invoke(bContext *C, wmOperator *op, const wmEv
/* show popup dialog to allow editing of range... */
/* FIXME: hardcoded dimensions here are just arbitrary */
- return WM_operator_props_dialog_popup(C, op, 10 * UI_UNIT_X, 10 * UI_UNIT_Y);
+ return WM_operator_props_dialog_popup(C, op, 200, 200);
}
/* Calculate/recalculate whole paths (avs.path_sf to avs.path_ef) */
@@ -1296,7 +1304,7 @@ static int object_calculate_paths_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
/* calculate the paths for objects that have them (and are tagged to get refreshed) */
- ED_objects_recalculate_paths(C, scene);
+ ED_objects_recalculate_paths(C, scene, false);
/* notifiers for updates */
WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
@@ -1346,7 +1354,7 @@ static int object_update_paths_exec(bContext *C, wmOperator *UNUSED(op))
return OPERATOR_CANCELLED;
/* calculate the paths for objects that have them (and are tagged to get refreshed) */
- ED_objects_recalculate_paths(C, scene);
+ ED_objects_recalculate_paths(C, scene, false);
/* notifiers for updates */
WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
@@ -1985,7 +1993,7 @@ static void move_to_collection_menu_create(bContext *UNUSED(C), uiLayout *layout
uiItemFullO_ptr(layout,
menu->ot,
"New Collection",
- ICON_ZOOMIN,
+ ICON_ADD,
menu->ptr.data,
WM_OP_INVOKE_DEFAULT,
0,
@@ -2036,7 +2044,7 @@ static int move_to_collection_invoke(bContext *C, wmOperator *op, const wmEvent
BKE_collection_new_name_get(collection, name);
RNA_property_string_set(op->ptr, prop, name);
- return WM_operator_props_dialog_popup(C, op, 10 * UI_UNIT_X, 5 * UI_UNIT_Y);
+ return WM_operator_props_dialog_popup(C, op, 200, 100);
}
}
return move_to_collection_exec(C, op);
diff --git a/source/blender/editors/object/object_facemap_ops.c b/source/blender/editors/object/object_facemap_ops.c
index 25fe52ba279..ab710b21817 100644
--- a/source/blender/editors/object/object_facemap_ops.c
+++ b/source/blender/editors/object/object_facemap_ops.c
@@ -97,7 +97,6 @@ void ED_object_facemap_face_remove(Object *ob, bFaceMap *fmap, int facenum)
int *facemap;
Mesh *me = ob->data;
- /* if there's is no facemap layer then create one */
if ((facemap = CustomData_get_layer(&me->pdata, CD_FACEMAP)) == NULL)
return;
diff --git a/source/blender/editors/object/object_gpencil_modifier.c b/source/blender/editors/object/object_gpencil_modifier.c
index e8b5bebef0d..d67b79375e2 100644
--- a/source/blender/editors/object/object_gpencil_modifier.c
+++ b/source/blender/editors/object/object_gpencil_modifier.c
@@ -207,7 +207,7 @@ int ED_object_gpencil_modifier_move_down(ReportList *UNUSED(reports), Object *ob
}
static int gpencil_modifier_apply_obdata(
- ReportList *reports, Main *bmain, Depsgraph *depsgraph, Object *ob, GpencilModifierData *md)
+ ReportList *reports, Main *bmain, Depsgraph *depsgraph, Object *ob, GpencilModifierData *md)
{
const GpencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md->type);
@@ -269,9 +269,18 @@ int ED_object_gpencil_modifier_apply(
return 1;
}
-int ED_object_gpencil_modifier_copy(ReportList *UNUSED(reports), Object *ob, GpencilModifierData *md)
+int ED_object_gpencil_modifier_copy(ReportList *reports, Object *ob, GpencilModifierData *md)
{
GpencilModifierData *nmd;
+ const GpencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md->type);
+ GpencilModifierType type = md->type;
+
+ if (mti->flags & eGpencilModifierTypeFlag_Single) {
+ if (BKE_gpencil_modifiers_findByType(ob, type)) {
+ BKE_report(reports, RPT_WARNING, "Only one modifier of this type is allowed");
+ return 0;
+ }
+ }
nmd = BKE_gpencil_modifier_new(md->type);
BKE_gpencil_modifier_copyData(md, nmd);
@@ -379,7 +388,7 @@ static int gpencil_edit_modifier_poll_generic(bContext *C, StructRNA *rna_type,
if (ptr.id.data && ID_IS_LINKED(ptr.id.data)) return 0;
if (ID_IS_STATIC_OVERRIDE(ob)) {
- CTX_wm_operator_poll_msg_set(C, "Cannot edit modifiers comming from static override");
+ CTX_wm_operator_poll_msg_set(C, "Cannot edit modifiers coming from static override");
return (((GpencilModifierData *)ptr.data)->flag & eGpencilModifierFlag_StaticOverride_Local) != 0;
}
diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c
index 392fde4ceec..ff9cc65180b 100644
--- a/source/blender/editors/object/object_hook.c
+++ b/source/blender/editors/object/object_hook.c
@@ -450,14 +450,12 @@ static bool hook_op_edit_poll(bContext *C)
static Object *add_hook_object_new(Main *bmain, Scene *scene, ViewLayer *view_layer, Object *obedit)
{
- Base *base, *basedit;
+ Base *basedit;
Object *ob;
ob = BKE_object_add(bmain, scene, view_layer, OB_EMPTY, NULL);
basedit = BKE_view_layer_base_find(view_layer, obedit);
- base = view_layer->basact;
- base->lay = ob->lay = obedit->lay;
BLI_assert(view_layer->basact->object == ob);
/* icky, BKE_object_add sets new base as active.
diff --git a/source/blender/editors/object/object_modes.c b/source/blender/editors/object/object_modes.c
index b9bfb44f680..ee075a94d29 100644
--- a/source/blender/editors/object/object_modes.c
+++ b/source/blender/editors/object/object_modes.c
@@ -38,6 +38,7 @@
#include "BKE_object.h"
#include "BKE_paint.h"
#include "BKE_report.h"
+#include "BKE_layer.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -176,6 +177,21 @@ void ED_object_mode_set(bContext *C, eObjectMode mode)
wm->op_undo_depth--;
}
+void ED_object_mode_exit(bContext *C)
+{
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
+ struct Main *bmain = CTX_data_main(C);
+ Scene *scene = CTX_data_scene(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ FOREACH_OBJECT_BEGIN(view_layer, ob)
+ {
+ if (ob->mode & OB_MODE_ALL_MODE_DATA) {
+ ED_object_mode_generic_exit(bmain, depsgraph, scene, ob);
+ }
+ }
+ FOREACH_OBJECT_END;
+}
+
/** \} */
/* -------------------------------------------------------------------- */
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 71cd7661d85..f0acfb0c667 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -1,31 +1,31 @@
/*
-* ***** BEGIN GPL LICENSE BLOCK *****
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software Foundation,
-* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-* All rights reserved.
-*
-* Contributor(s): Blender Foundation, 2009
-*
-* ***** END GPL LICENSE BLOCK *****
-*/
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation, 2009
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
/** \file blender/editors/object/object_modifier.c
-* \ingroup edobj
-*/
+ * \ingroup edobj
+ */
#include <math.h>
@@ -59,21 +59,21 @@
#include "BKE_curve.h"
#include "BKE_collection.h"
#include "BKE_context.h"
-#include "BKE_displist.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_displist.h"
+#include "BKE_editmesh.h"
#include "BKE_effect.h"
#include "BKE_fracture.h"
#include "BKE_global.h"
#include "BKE_key.h"
#include "BKE_lattice.h"
-#include "BKE_library_remap.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_mesh_mapping.h"
#include "BKE_mesh_runtime.h"
#include "BKE_modifier.h"
#include "BKE_multires.h"
-#include "BKE_report.h"
#include "BKE_object.h"
#include "BKE_object_deform.h"
#include "BKE_ocean.h"
@@ -87,6 +87,7 @@
#include "BKE_material.h"
#include "BKE_library.h"
#include "BKE_rigidbody.h"
+#include "BKE_softbody.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
@@ -117,6 +118,23 @@ static void modifier_skin_customdata_delete(struct Object *ob);
/******************************** API ****************************/
+static void object_force_modifier_update_for_bind(Depsgraph *depsgraph, Scene *scene, Object *ob)
+{
+ if (ob->type == OB_MESH) {
+ Mesh *me_eval = mesh_create_eval_final_view(depsgraph, scene, ob, 0);
+ BKE_id_free(NULL, me_eval);
+ }
+ else if (ob->type == OB_LATTICE) {
+ BKE_lattice_modifiers_calc(depsgraph, scene, ob);
+ }
+ else if (ob->type == OB_MBALL) {
+ BKE_displist_make_mball(depsgraph, scene, ob);
+ }
+ else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
+ BKE_displist_make_curveTypes(depsgraph, scene, ob, 0);
+ }
+}
+
ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, const char *name, int type)
{
ModifierData *md = NULL, *new_md = NULL;
@@ -137,8 +155,8 @@ ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *sc
if (type == eModifierType_ParticleSystem) {
/* don't need to worry about the new modifier's name, since that is set to the number
- * of particle systems which shouldn't have too many duplicates
- */
+ * of particle systems which shouldn't have too many duplicates
+ */
new_md = object_add_particle_system(bmain, scene, ob, name);
}
else {
@@ -202,7 +220,7 @@ ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *sc
}
/* Return true if the object has a modifier of type 'type' other than
-* the modifier pointed to be 'exclude', otherwise returns false. */
+ * the modifier pointed to be 'exclude', otherwise returns false. */
static bool object_has_modifier(const Object *ob, const ModifierData *exclude,
ModifierType type)
{
@@ -217,17 +235,17 @@ static bool object_has_modifier(const Object *ob, const ModifierData *exclude,
}
/* If the object data of 'orig_ob' has other users, run 'callback' on
-* each of them.
-*
-* If include_orig is true, the callback will run on 'orig_ob' too.
-*
-* If the callback ever returns true, iteration will stop and the
-* function value will be true. Otherwise the function returns false.
-*/
+ * each of them.
+ *
+ * If include_orig is true, the callback will run on 'orig_ob' too.
+ *
+ * If the callback ever returns true, iteration will stop and the
+ * function value will be true. Otherwise the function returns false.
+ */
bool ED_object_iter_other(
- Main *bmain, Object *orig_ob, const bool include_orig,
- bool (*callback)(Object *ob, void *callback_data),
- void *callback_data)
+ Main *bmain, Object *orig_ob, const bool include_orig,
+ bool (*callback)(Object *ob, void *callback_data),
+ void *callback_data)
{
ID *ob_data_id = orig_ob->data;
int users = ob_data_id->us;
@@ -297,10 +315,9 @@ static bool object_modifier_safe_to_delete(Main *bmain, Object *ob,
static bool object_modifier_remove(Main *bmain, Object *ob, ModifierData *md,
bool *r_sort_depsgraph)
{
-
/* It seems on rapid delete it is possible to
- * get called twice on same modifier, so make
- * sure it is in list. */
+ * get called twice on same modifier, so make
+ * sure it is in list. */
if (BLI_findindex(&ob->modifiers, md) == -1) {
return 0;
}
@@ -340,7 +357,7 @@ static bool object_modifier_remove(Main *bmain, Object *ob, ModifierData *md,
}
if (ELEM(md->type, eModifierType_Softbody, eModifierType_Cloth) &&
- BLI_listbase_is_empty(&ob->particlesystem))
+ BLI_listbase_is_empty(&ob->particlesystem))
{
ob->mode &= ~OB_MODE_PARTICLE_EDIT;
}
@@ -421,8 +438,7 @@ int ED_object_modifier_move_down(ReportList *reports, Object *ob, ModifierData *
if (mti->flags & eModifierTypeFlag_RequiresOriginalData) {
const ModifierTypeInfo *nmti = modifierType_getInfo(md->next->type);
- /*make an exception here for fluidsim, in case: it is beyond a fracture modifier and this may have some other mods above it*/
- if ((nmti->type != eModifierTypeType_OnlyDeform) && (md->type != eModifierType_Fluidsim)) {
+ if (nmti->type != eModifierTypeType_OnlyDeform) {
BKE_report(reports, RPT_WARNING, "Cannot move beyond a non-deforming modifier");
return 0;
}
@@ -555,15 +571,15 @@ static int modifier_apply_shape(
}
/*
- * It should be ridiculously easy to extract the original verts that we want
- * and form the shape data. We can probably use the CD KEYINDEX layer (or
- * whatever I ended up calling it, too tired to check now), though this would
- * by necessity have to make some potentially ugly assumptions about the order
- * of the mesh data :-/ you can probably assume in 99% of cases that the first
- * element of a given index is the original, and any subsequent duplicates are
- * copies/interpolates, but that's an assumption that would need to be tested
- * and then predominantly stated in comments in a half dozen headers.
- */
+ * It should be ridiculously easy to extract the original verts that we want
+ * and form the shape data. We can probably use the CD KEYINDEX layer (or
+ * whatever I ended up calling it, too tired to check now), though this would
+ * by necessity have to make some potentially ugly assumptions about the order
+ * of the mesh data :-/ you can probably assume in 99% of cases that the first
+ * element of a given index is the original, and any subsequent duplicates are
+ * copies/interpolates, but that's an assumption that would need to be tested
+ * and then predominantly stated in comments in a half dozen headers.
+ */
if (ob->type == OB_MESH) {
Mesh *mesh_applied;
@@ -586,7 +602,7 @@ static int modifier_apply_shape(
key = me->key = BKE_key_add(bmain, (ID *)me);
key->type = KEY_RELATIVE;
/* if that was the first key block added, then it was the basis.
- * Initialize it with the mesh, and add another for the modifier */
+ * Initialize it with the mesh, and add another for the modifier */
kb = BKE_keyblock_add(key, NULL);
BKE_keyblock_convert_from_mesh(me, key, kb);
}
@@ -660,7 +676,7 @@ static int modifier_apply_obdata(ReportList *reports, Depsgraph *depsgraph, Scen
BKE_report(reports, RPT_INFO, "Applied modifier only changed CV points, not tessellated/bevel vertices");
vertexCos = BKE_curve_nurbs_vertexCos_get(&cu->nurb, &numVerts);
- modifier_deformVerts(md, &mectx, NULL, vertexCos, numVerts);
+ mti->deformVerts(md, &mectx, NULL, vertexCos, numVerts);
BK_curve_nurbs_vertexCos_apply(&cu->nurb, vertexCos);
MEM_freeN(vertexCos);
@@ -704,8 +720,8 @@ int ED_object_modifier_apply(
return 0;
}
else if ((ob->mode & OB_MODE_SCULPT) &&
- (find_multires_modifier_before(scene, md)) &&
- (modifier_isSameTopology(md) == false))
+ (find_multires_modifier_before(scene, md)) &&
+ (modifier_isSameTopology(md) == false))
{
BKE_report(reports, RPT_ERROR, "Constructive modifier cannot be applied to multi-res data in sculpt mode");
return 0;
@@ -715,7 +731,7 @@ int ED_object_modifier_apply(
BKE_report(reports, RPT_INFO, "Applied modifier was not first, result may not be as expected");
/* Get evaluated modifier, so object links pointer to evaluated data,
- * but still use original object it is applied to the original mesh. */
+ * but still use original object it is applied to the original mesh. */
Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
ModifierData *md_eval = (ob_eval) ? modifiers_findByName(ob_eval, md->name) : md;
@@ -854,7 +870,7 @@ bool edit_modifier_poll_generic(bContext *C, StructRNA *rna_type, int obtype_fla
if (ptr.id.data && ID_IS_LINKED(ptr.id.data)) return 0;
if (ID_IS_STATIC_OVERRIDE(ob)) {
- CTX_wm_operator_poll_msg_set(C, "Cannot edit modifiers comming from static override");
+ CTX_wm_operator_poll_msg_set(C, "Cannot edit modifiers coming from static override");
return (((ModifierData *)ptr.data)->flag & eModifierFlag_StaticOverride_Local) != 0;
}
@@ -1296,7 +1312,7 @@ static int multires_reshape_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- if (!multiresModifier_reshape(depsgraph, mmd, ob, secondob)) {
+ if (!multiresModifier_reshapeFromObject(depsgraph, mmd, ob, secondob)) {
BKE_report(op->reports, RPT_ERROR, "Objects do not have the same number of vertices");
return OPERATOR_CANCELLED;
}
@@ -1543,7 +1559,7 @@ static int skin_root_mark_exec(bContext *C, wmOperator *UNUSED(op))
BM_ITER_MESH (bm_vert, &bm_iter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(bm_vert, BM_ELEM_SELECT) &&
- BLI_gset_add(visited, bm_vert))
+ BLI_gset_add(visited, bm_vert))
{
MVertSkin *vs = BM_ELEM_CD_GET_VOID_P(bm_vert, cd_vert_skin_offset);
@@ -1734,7 +1750,7 @@ static void skin_armature_bone_create(Object *skin_ob,
static Object *modifier_skin_armature_create(Depsgraph *depsgraph, Main *bmain, Scene *scene, Object *skin_ob)
{
BLI_bitmap *edges_visited;
- DerivedMesh *deform_dm;
+ Mesh *me_eval_deform;
MVert *mvert;
Mesh *me = skin_ob->data;
Object *arm_ob;
@@ -1744,8 +1760,8 @@ static Object *modifier_skin_armature_create(Depsgraph *depsgraph, Main *bmain,
int *emap_mem;
int v;
- deform_dm = mesh_get_derived_deform(depsgraph, scene, skin_ob, CD_MASK_BAREMESH);
- mvert = deform_dm->getVertArray(deform_dm);
+ me_eval_deform = mesh_get_eval_deform(depsgraph, scene, skin_ob, CD_MASK_BAREMESH);
+ mvert = me_eval_deform->mvert;
/* add vertex weights to original mesh */
CustomData_add_layer(&me->vdata,
@@ -1770,14 +1786,14 @@ static Object *modifier_skin_armature_create(Depsgraph *depsgraph, Main *bmain,
edges_visited = BLI_BITMAP_NEW(me->totedge, "edge_visited");
/* note: we use EditBones here, easier to set them up and use
- * edit-armature functions to convert back to regular bones */
+ * edit-armature functions to convert back to regular bones */
for (v = 0; v < me->totvert; v++) {
if (mvert_skin[v].flag & MVERT_SKIN_ROOT) {
EditBone *bone = NULL;
/* Unless the skin root has just one adjacent edge, create
- * a fake root bone (have it going off in the Y direction
- * (arbitrary) */
+ * a fake root bone (have it going off in the Y direction
+ * (arbitrary) */
if (emap[v].count > 1) {
bone = ED_armature_ebone_add(arm, "Bone");
@@ -1944,9 +1960,9 @@ static bool meshdeform_poll(bContext *C)
static int meshdeform_bind_exec(bContext *C, wmOperator *op)
{
- Scene *scene = CTX_data_scene(C);
- Object *ob = ED_object_active_context(C);
+ Main *bmain = CTX_data_main(C);
Depsgraph *depsgraph = CTX_data_depsgraph(C);
+ Object *ob = ED_object_active_context(C);
MeshDeformModifierData *mmd = (MeshDeformModifierData *)edit_modifier_property_get(op, ob, eModifierType_MeshDeform);
if (!mmd)
@@ -1973,36 +1989,23 @@ static int meshdeform_bind_exec(bContext *C, wmOperator *op)
mmd->totvert = 0;
mmd->totcagevert = 0;
mmd->totinfluence = 0;
-
- DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
}
else {
- DerivedMesh *dm;
int mode = mmd->modifier.mode;
-
- /* force modifier to run, it will call binding routine */
mmd->bindfunc = ED_mesh_deform_bind_callback;
mmd->modifier.mode |= eModifierMode_Realtime;
- if (ob->type == OB_MESH) {
- dm = mesh_create_derived_view(depsgraph, scene, ob, 0);
- dm->release(dm);
- }
- else if (ob->type == OB_LATTICE) {
- BKE_lattice_modifiers_calc(depsgraph, scene, ob);
- }
- else if (ob->type == OB_MBALL) {
- BKE_displist_make_mball(depsgraph, scene, ob);
- }
- else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
- BKE_displist_make_curveTypes(depsgraph, scene, ob, 0);
- }
+ /* Force depsgraph update, this will do binding. */
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ BKE_scene_graph_update_tagged(depsgraph, bmain);
mmd->bindfunc = NULL;
mmd->modifier.mode = mode;
}
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
+
return OPERATOR_FINISHED;
}
@@ -2110,7 +2113,7 @@ static int oceanbake_breakjob(void *UNUSED(customdata))
//return *(ob->stop);
/* this is not nice yet, need to make the jobs list template better
- * for identifying/acting upon various different jobs */
+ * for identifying/acting upon various different jobs */
/* but for now we'll reuse the render break... */
return (G.is_break);
}
@@ -2194,22 +2197,22 @@ static int ocean_bake_exec(bContext *C, wmOperator *op)
/* precalculate time variable before baking */
for (f = omd->bakestart; f <= omd->bakeend; f++) {
/* from physics_fluid.c:
- *
- * XXX: This can't be used due to an anim sys optimization that ignores recalc object animation,
- * leaving it for the depgraph (this ignores object animation such as modifier properties though... :/ )
- * --> BKE_animsys_evaluate_all_animation(bmain, eval_time);
- * This doesn't work with drivers:
- * --> BKE_animsys_evaluate_animdata(&fsDomain->id, fsDomain->adt, eval_time, ADT_RECALC_ALL);
- */
+ *
+ * XXX: This can't be used due to an anim sys optimization that ignores recalc object animation,
+ * leaving it for the depgraph (this ignores object animation such as modifier properties though... :/ )
+ * --> BKE_animsys_evaluate_all_animation(bmain, eval_time);
+ * This doesn't work with drivers:
+ * --> BKE_animsys_evaluate_animdata(&fsDomain->id, fsDomain->adt, eval_time, ADT_RECALC_ALL);
+ */
/* Modifying the global scene isn't nice, but we can do it in
- * this part of the process before a threaded job is created */
+ * this part of the process before a threaded job is created */
//scene->r.cfra = f;
//ED_update_for_newframe(bmain, scene);
/* ok, this doesn't work with drivers, but is way faster.
- * let's use this for now and hope nobody wants to drive the time value... */
+ * let's use this for now and hope nobody wants to drive the time value... */
BKE_animsys_evaluate_animdata(CTX_data_depsgraph(C), scene, (ID *)ob, ob->adt, f, ADT_RECALC_ANIM);
och->time[i] = omd->time;
@@ -2303,27 +2306,13 @@ static int laplaciandeform_bind_exec(bContext *C, wmOperator *op)
lmd->flag &= ~MOD_LAPLACIANDEFORM_BIND;
}
else {
- DerivedMesh *dm;
int mode = lmd->modifier.mode;
/* Force modifier to run, it will call binding routine. */
- /* TODO(Sybren): deduplicate the code below, it's used multiple times here. */
lmd->modifier.mode |= eModifierMode_Realtime;
lmd->flag |= MOD_LAPLACIANDEFORM_BIND;
- if (ob->type == OB_MESH) {
- dm = mesh_create_derived_view(depsgraph, scene, ob, 0);
- dm->release(dm);
- }
- else if (ob->type == OB_LATTICE) {
- BKE_lattice_modifiers_calc(depsgraph, scene, ob);
- }
- else if (ob->type == OB_MBALL) {
- BKE_displist_make_mball(depsgraph, scene, ob);
- }
- else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
- BKE_displist_make_curveTypes(depsgraph, scene, ob, 0);
- }
+ object_force_modifier_update_for_bind(depsgraph, scene, ob);
lmd->modifier.mode = mode;
}
@@ -2374,39 +2363,24 @@ static int surfacedeform_bind_exec(bContext *C, wmOperator *op)
if (!smd)
return OPERATOR_CANCELLED;
-
if (smd->flags & MOD_SDEF_BIND) {
/* Un-binding happens inside the modifier when it's evaluated. */
smd->flags &= ~MOD_SDEF_BIND;
}
else if (smd->target) {
- DerivedMesh *dm;
int mode = smd->modifier.mode;
/* Force modifier to run, it will call binding routine. */
smd->modifier.mode |= eModifierMode_Realtime;
smd->flags |= MOD_SDEF_BIND;
- if (ob->type == OB_MESH) {
- dm = mesh_create_derived_view(depsgraph, scene, ob, 0);
- dm->release(dm);
- }
- else if (ob->type == OB_LATTICE) {
- BKE_lattice_modifiers_calc(depsgraph, scene, ob);
- }
- else if (ob->type == OB_MBALL) {
- BKE_displist_make_mball(depsgraph, scene, ob);
- }
- else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
- BKE_displist_make_curveTypes(depsgraph, scene, ob, 0);
- }
+ object_force_modifier_update_for_bind(depsgraph, scene, ob);
smd->modifier.mode = mode;
}
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
-
return OPERATOR_FINISHED;
}
@@ -2512,7 +2486,7 @@ static int fracture_refresh_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, obact);
WM_event_add_notifier(C, NC_OBJECT | ND_POINTCACHE, NULL);
- //DEG_relations_tag_update(bmain);
+ DEG_relations_tag_update(bmain);
WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
WM_event_add_notifier(C, NC_OBJECT | ND_PARENT, NULL);
WM_event_add_notifier(C, NC_SCENE | ND_FRAME, NULL);
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index e4b63718846..7347c14fc99 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -312,229 +312,12 @@ static bool object_mode_poll(bContext *C)
void ED_keymap_object(wmKeyConfig *keyconf)
{
wmKeyMap *keymap;
- wmKeyMapItem *kmi;
/* Objects, Regardless of Mode -------------------------------------------------- */
keymap = WM_keymap_ensure(keyconf, "Object Non-modal", 0, 0);
- /* modes */
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_mode_set", TABKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", OB_MODE_EDIT);
- RNA_boolean_set(kmi->ptr, "toggle", true);
-
-#if 0
- WM_keymap_add_menu_pie(keymap, "VIEW3D_MT_object_mode_pie", TABKEY, KM_PRESS, KM_CTRL, 0);
-#else
- WM_keymap_add_item(keymap, "VIEW3D_OT_object_mode_pie_or_toggle", TABKEY, KM_PRESS, KM_CTRL, 0);
-#endif
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "OBJECT_OT_origin_set", CKEY, KM_PRESS, KM_ALT | KM_SHIFT | KM_CTRL, 0);
-#endif
-
/* Object Mode ---------------------------------------------------------------- */
/* Note: this keymap gets disabled in non-objectmode, */
keymap = WM_keymap_ensure(keyconf, "Object Mode", 0, 0);
keymap->poll = object_mode_poll;
-
- /* object mode supports PET now */
- ED_keymap_proportional_cycle(keyconf, keymap);
- ED_keymap_proportional_obmode(keyconf, keymap);
-
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- WM_keymap_add_item(keymap, "OBJECT_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "OBJECT_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "OBJECT_OT_select_linked", LKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "OBJECT_OT_select_grouped", GKEY, KM_PRESS, KM_SHIFT, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "OBJECT_OT_select_mirror", MKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
-#endif
-
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_enum_set_identifier(NULL, kmi->ptr, "direction", "PARENT");
- RNA_boolean_set(kmi->ptr, "extend", false);
-
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set_identifier(NULL, kmi->ptr, "direction", "PARENT");
- RNA_boolean_set(kmi->ptr, "extend", true);
-
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_enum_set_identifier(NULL, kmi->ptr, "direction", "CHILD");
- RNA_boolean_set(kmi->ptr, "extend", false);
-
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set_identifier(NULL, kmi->ptr, "direction", "CHILD");
- RNA_boolean_set(kmi->ptr, "extend", true);
-
- WM_keymap_verify_item(keymap, "OBJECT_OT_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_verify_item(keymap, "OBJECT_OT_parent_no_inverse_set", PKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
-#endif
- WM_keymap_verify_item(keymap, "OBJECT_OT_parent_clear", PKEY, KM_PRESS, KM_ALT, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_verify_item(keymap, "OBJECT_OT_track_set", TKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_verify_item(keymap, "OBJECT_OT_track_clear", TKEY, KM_PRESS, KM_ALT, 0);
-#endif
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_verify_item(keymap, "OBJECT_OT_constraint_add_with_targets", CKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- WM_keymap_verify_item(keymap, "OBJECT_OT_constraints_clear", CKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
-#endif
-
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_location_clear", GKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "clear_delta", false);
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_rotation_clear", RKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "clear_delta", false);
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_scale_clear", SKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "clear_delta", false);
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_verify_item(keymap, "OBJECT_OT_origin_clear", OKEY, KM_PRESS, KM_ALT, 0);
-#endif
-
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "use_global", false);
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "use_global", true);
-
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "use_global", false);
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "use_global", true);
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0);
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "OBJECT_OT_duplicates_make_real", AKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
-
-#endif
- WM_keymap_add_menu(keymap, "VIEW3D_MT_object_apply", AKEY, KM_PRESS, KM_CTRL, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_menu(keymap, "VIEW3D_MT_make_single_user", UKEY, KM_PRESS, 0, 0);
-#endif
- WM_keymap_add_menu(keymap, "VIEW3D_MT_make_links", LKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "OBJECT_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "OBJECT_OT_duplicate_move_linked", DKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "OBJECT_OT_join", JKEY, KM_PRESS, KM_CTRL, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "OBJECT_OT_convert", CKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "OBJECT_OT_proxy_make", PKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- WM_keymap_add_item(keymap, "OBJECT_OT_make_local", LKEY, KM_PRESS, 0, 0);
-#endif
-
- /* XXX this should probably be in screen instead... here for testing purposes in the meantime... - Aligorith */
- WM_keymap_verify_item(keymap, "ANIM_OT_keyframe_insert_menu", IKEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "ANIM_OT_keyframe_delete_v3d", IKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_verify_item(keymap, "ANIM_OT_keying_set_active_set", IKEY, KM_PRESS, KM_CTRL | KM_SHIFT | KM_ALT, 0);
-
- WM_keymap_verify_item(keymap, "COLLECTION_OT_create", GKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_verify_item(keymap, "COLLECTION_OT_objects_remove", GKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- WM_keymap_verify_item(keymap, "COLLECTION_OT_objects_remove_all", GKEY, KM_PRESS, KM_SHIFT | KM_CTRL | KM_ALT, 0);
- WM_keymap_verify_item(keymap, "COLLECTION_OT_objects_add_active", GKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- WM_keymap_verify_item(keymap, "COLLECTION_OT_objects_remove_active", GKEY, KM_PRESS, KM_SHIFT | KM_ALT, 0);
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_object_specials", WKEY, KM_PRESS, 0, 0);
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_verify_item(keymap, "OBJECT_OT_data_transfer", TKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
-#endif
- /* XXX No more available 'T' shortcuts... :/ */
- /* WM_keymap_verify_item(keymap, "OBJECT_OT_datalayout_transfer", TKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0); */
-
- for (int i = 0; i <= 5; i++) {
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_subdivision_set", ZEROKEY + i, KM_PRESS, KM_CTRL, 0);
- RNA_int_set(kmi->ptr, "level", i);
- }
-
- WM_keymap_add_item(keymap, "OBJECT_OT_move_to_collection", MKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "OBJECT_OT_link_to_collection", MKEY, KM_PRESS, KM_SHIFT, 0);
-
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_hide_view_clear", HKEY, KM_PRESS, KM_ALT, 0);
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_hide_view_set", HKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_hide_view_set", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_hide_collection", HKEY, KM_PRESS, KM_CTRL, 0);
-
- /* Collection switching. */
- for (int i = 0; i < 10; i++) {
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_hide_collection", ZEROKEY + i, KM_PRESS, KM_ANY, 0);
- RNA_int_set(kmi->ptr, "collection_index", (i == 0) ? 10 : i);
- }
-}
-
-void ED_keymap_proportional_cycle(struct wmKeyConfig *UNUSED(keyconf), struct wmKeyMap *keymap)
-{
- wmKeyMapItem *kmi;
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_enum", OKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.proportional_edit_falloff");
- RNA_boolean_set(kmi->ptr, "wrap", true);
-}
-
-void ED_keymap_proportional_obmode(struct wmKeyConfig *UNUSED(keyconf), struct wmKeyMap *keymap)
-{
- wmKeyMapItem *kmi;
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", OKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.use_proportional_edit_objects");
-}
-
-void ED_keymap_proportional_maskmode(struct wmKeyConfig *UNUSED(keyconf), struct wmKeyMap *keymap)
-{
- wmKeyMapItem *kmi;
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", OKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.use_proportional_edit_mask");
-}
-
-void ED_keymap_proportional_editmode(struct wmKeyConfig *UNUSED(keyconf), struct wmKeyMap *keymap,
- const bool do_connected)
-{
- wmKeyMapItem *kmi;
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle_enum", OKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.proportional_edit");
- RNA_string_set(kmi->ptr, "value_1", "DISABLED");
- RNA_string_set(kmi->ptr, "value_2", "ENABLED");
-
- /* for modes/object types that allow 'connected' mode, add the Alt O key */
- if (do_connected) {
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle_enum", OKEY, KM_PRESS, KM_ALT, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.proportional_edit");
- RNA_string_set(kmi->ptr, "value_1", "DISABLED");
- RNA_string_set(kmi->ptr, "value_2", "CONNECTED");
- }
-}
-
-/**
- * Map 1..3 to Vert/Edge/Face.
- */
-void ED_keymap_editmesh_elem_mode(struct wmKeyConfig *UNUSED(keyconf), struct wmKeyMap *keymap)
-{
- for (int i = 0; i < 4; i++) {
- const bool is_extend = (i & 1);
- const bool is_expand = (i & 2);
- const int key_modifier = (is_extend ? KM_SHIFT : 0) | (is_expand ? KM_CTRL : 0);
- for (int j = 0; j < 3; j++) {
- wmKeyMapItem *kmi = WM_keymap_add_item(
- keymap, "MESH_OT_select_mode", ONEKEY + j, KM_PRESS, key_modifier, 0);
- RNA_enum_set(kmi->ptr, "type", SCE_SELECT_VERTEX << j);
- if (is_extend) {
- RNA_boolean_set(kmi->ptr, "use_extend", true);
- }
- if (is_expand) {
- RNA_boolean_set(kmi->ptr, "use_expand", true);
- }
- }
- }
}
diff --git a/source/blender/editors/object/object_random.c b/source/blender/editors/object/object_random.c
index a293f7a950e..918c1c8d8e7 100644
--- a/source/blender/editors/object/object_random.c
+++ b/source/blender/editors/object/object_random.c
@@ -25,6 +25,9 @@
* \ingroup edobj
*/
+#include "MEM_guardedalloc.h"
+
+#include "DNA_layer_types.h"
#include "DNA_object_types.h"
#include "BLI_math.h"
@@ -32,6 +35,7 @@
#include "BKE_context.h"
+#include "BKE_layer.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -45,7 +49,7 @@
/**
- * Generic randomize vertices function
+ * Generic randomize vertices function
*/
static bool object_rand_transverts(
@@ -94,34 +98,53 @@ static bool object_rand_transverts(
static int object_rand_verts_exec(bContext *C, wmOperator *op)
{
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ Object *ob_active = CTX_data_edit_object(C);
+ const int ob_mode = ob_active->mode;
+
const float offset = RNA_float_get(op->ptr, "offset");
const float uniform = RNA_float_get(op->ptr, "uniform");
const float normal_factor = RNA_float_get(op->ptr, "normal");
const unsigned int seed = RNA_int_get(op->ptr, "seed");
- TransVertStore tvs = {NULL};
- Object *obedit = CTX_data_edit_object(C);
+ bool changed_multi = false;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, &objects_len, ob_mode);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob_iter = objects[ob_index];
- if (obedit) {
- int mode = TM_ALL_JOINTS;
+ TransVertStore tvs = { NULL };
- if (normal_factor != 0.0f) {
- mode |= TX_VERT_USE_NORMAL;
- }
+ if (ob_iter) {
+ int mode = TM_ALL_JOINTS;
- ED_transverts_create_from_obedit(&tvs, obedit, mode);
- if (tvs.transverts_tot == 0)
- return OPERATOR_CANCELLED;
+ if (normal_factor != 0.0f) {
+ mode |= TX_VERT_USE_NORMAL;
+ }
- object_rand_transverts(&tvs, offset, uniform, normal_factor, seed);
+ ED_transverts_create_from_obedit(&tvs, ob_iter, mode);
+ if (tvs.transverts_tot == 0) {
+ continue;
+ }
- ED_transverts_update_obedit(&tvs, obedit);
- ED_transverts_free(&tvs);
- }
+ int seed_iter = seed;
+ /* This gives a consistent result regardless of object order. */
+ if (ob_index) {
+ seed_iter += BLI_ghashutil_strhash_p(ob_iter->id.name);
+ }
+
+ object_rand_transverts(&tvs, offset, uniform, normal_factor, seed_iter);
+
+ ED_transverts_update_obedit(&tvs, ob_iter);
+ ED_transverts_free(&tvs);
- WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit);
+ WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob_iter);
+ changed_multi = true;
+ }
+ }
+ MEM_freeN(objects);
- return OPERATOR_FINISHED;
+ return changed_multi ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
void TRANSFORM_OT_vertex_random(struct wmOperatorType *ot)
@@ -139,10 +162,12 @@ void TRANSFORM_OT_vertex_random(struct wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* props */
- RNA_def_float(ot->srna, "offset", 0.1f, -FLT_MAX, FLT_MAX, "Amount", "Distance to offset", -10.0f, 10.0f);
+ ot->prop = RNA_def_float(
+ ot->srna, "offset", 0.1f, -FLT_MAX, FLT_MAX,
+ "Amount", "Distance to offset", -10.0f, 10.0f);
RNA_def_float(ot->srna, "uniform", 0.0f, 0.0f, 1.0f, "Uniform",
"Increase for uniform offset distance", 0.0f, 1.0f);
- RNA_def_float(ot->srna, "normal", 0.0f, 0.0f, 1.0f, "normal",
+ RNA_def_float(ot->srna, "normal", 0.0f, 0.0f, 1.0f, "Normal",
"Align offset direction to normals", 0.0f, 1.0f);
RNA_def_int(ot->srna, "seed", 0, 0, 10000, "Random Seed", "Seed for the random number generator", 0, 50);
}
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index 0df08ae8192..5c01f02c3ef 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -69,6 +69,7 @@
#include "BKE_curve.h"
#include "BKE_DerivedMesh.h"
#include "BKE_displist.h"
+#include "BKE_editmesh.h"
#include "BKE_global.h"
#include "BKE_gpencil.h"
#include "BKE_fcurve.h"
@@ -92,8 +93,6 @@
#include "BKE_scene.h"
#include "BKE_speaker.h"
#include "BKE_texture.h"
-#include "BKE_editmesh.h"
-#include "BKE_rigidbody.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
@@ -130,12 +129,12 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
+ View3D *v3d = CTX_wm_view3d(C);
Depsgraph *depsgraph = CTX_data_depsgraph(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
Object *obedit = CTX_data_edit_object(C);
BMVert *eve;
BMIter iter;
- Curve *cu;
Nurb *nu;
BezTriple *bezt;
BPoint *bp;
@@ -176,15 +175,13 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
else if (ELEM(obedit->type, OB_SURF, OB_CURVE)) {
ListBase *editnurb = object_editcurve_get(obedit);
- cu = obedit->data;
-
nu = editnurb->first;
while (nu) {
if (nu->type == CU_BEZIER) {
bezt = nu->bezt;
a = nu->pntsu;
while (a--) {
- if (BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt)) {
+ if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) {
if (v1 == 0) v1 = nr;
else if (v2 == 0) v2 = nr;
else if (v3 == 0) v3 = nr;
@@ -644,7 +641,7 @@ bool ED_object_parent_set(ReportList *reports, const bContext *C, Scene *scene,
if (partype == PAR_FOLLOW) {
/* get or create F-Curve */
bAction *act = verify_adt_action(bmain, &cu->id, 1);
- FCurve *fcu = verify_fcurve(act, NULL, NULL, "eval_time", 0, 1);
+ FCurve *fcu = verify_fcurve(bmain, act, NULL, NULL, "eval_time", 0, 1);
/* setup dummy 'generator' modifier here to get 1-1 correspondence still working */
if (!fcu->bezt && !fcu->fpt && !fcu->modifiers.first)
@@ -804,7 +801,7 @@ bool ED_object_parent_set(ReportList *reports, const bContext *C, Scene *scene,
ED_gpencil_add_armature_weights(C, reports, ob, par, GP_PAR_ARMATURE_NAME);
}
else if ((partype == PAR_ARMATURE_AUTO) ||
- (partype == PAR_ARMATURE_ENVELOPE))
+ (partype == PAR_ARMATURE_ENVELOPE))
{
WM_cursor_wait(1);
ED_gpencil_add_armature_weights(C, reports, ob, par, GP_PAR_ARMATURE_AUTO);
@@ -1476,13 +1473,13 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
DEG_id_tag_update(&ob_dst->id, OB_RECALC_DATA);
break;
case MAKE_LINKS_ANIMDATA:
- BKE_animdata_copy_id(bmain, (ID *)ob_dst, (ID *)ob_src, false, true);
+ BKE_animdata_copy_id(bmain, (ID *)ob_dst, (ID *)ob_src, 0);
if (ob_dst->data && ob_src->data) {
if (ID_IS_LINKED(obdata_id)) {
is_lib = true;
break;
}
- BKE_animdata_copy_id(bmain, (ID *)ob_dst->data, (ID *)ob_src->data, false, true);
+ BKE_animdata_copy_id(bmain, (ID *)ob_dst->data, (ID *)ob_src->data, 0);
}
DEG_id_tag_update(&ob_dst->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
break;
@@ -1629,20 +1626,11 @@ void OBJECT_OT_make_links_data(wmOperatorType *ot)
/**************************** Make Single User ********************************/
-static Object *single_object_users_object(Main *bmain, Object *ob)
-{
- /* base gets copy of object */
- Object *obn = ID_NEW_SET(ob, BKE_object_copy(bmain, ob));
-
-
- id_us_plus(&obn->id);
- id_us_min(&ob->id);
- return obn;
-}
-
static void libblock_relink_collection(Collection *collection)
{
- for (CollectionObject *cob = collection->gobject.first; cob; cob = cob->next) {
+ BKE_libblock_relink_to_newid(&collection->id);
+
+ for (CollectionObject *cob = collection->gobject.first; cob != NULL; cob = cob->next) {
BKE_libblock_relink_to_newid(&cob->ob->id);
}
@@ -1651,42 +1639,47 @@ static void libblock_relink_collection(Collection *collection)
}
}
-static void single_object_users_collection(Main *bmain, Scene *scene, Collection *collection, const int flag, const bool copy_collections)
+static void single_object_users_collection(
+ Main *bmain, Scene *scene, Collection *collection,
+ const int flag, const bool copy_collections, const bool is_master_collection)
{
+ /* Generate new copies for objects in given collection and all its children,
+ * and optionnaly also copy collections themselves. */
+ if (copy_collections && !is_master_collection) {
+ collection = ID_NEW_SET(collection, BKE_collection_copy(bmain, NULL, collection));
+ }
+
+ /* We do not remap to new objects here, this is done in separate step. */
for (CollectionObject *cob = collection->gobject.first; cob; cob = cob->next) {
Object *ob = cob->ob;
/* an object may be in more than one collection */
if ((ob->id.newid == NULL) && ((ob->flag & flag) == flag)) {
if (!ID_IS_LINKED(ob) && ob->id.us > 1) {
- cob->ob = single_object_users_object(bmain, cob->ob);
+ ID_NEW_SET(ob, BKE_object_copy(bmain, ob));
}
}
}
for (CollectionChild *child = collection->children.first; child; child = child->next) {
- single_object_users_collection(bmain, scene, child->collection, flag, copy_collections);
+ single_object_users_collection(bmain, scene, child->collection, flag, copy_collections, false);
}
}
/* Warning, sets ID->newid pointers of objects and collections, but does not clear them. */
static void single_object_users(Main *bmain, Scene *scene, View3D *v3d, const int flag, const bool copy_collections)
{
- Collection *collection, *collectionn;
-
- /* duplicate all the objects of the scene */
+ /* duplicate all the objects of the scene (and matching collections, if required). */
Collection *master_collection = BKE_collection_master(scene);
- single_object_users_collection(bmain, scene, master_collection, flag, copy_collections);
-
- /* loop over ViewLayers and assign the pointers accordingly */
- for (ViewLayer *view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) {
- for (Base *base = view_layer->object_bases.first; base; base = base->next) {
- ID_NEW_REMAP(base->object);
- }
- }
+ single_object_users_collection(bmain, scene, master_collection, flag, copy_collections, true);
/* duplicate collections that consist entirely of duplicated objects */
- for (collection = bmain->collection.first; collection; collection = collection->id.next) {
- if (copy_collections) {
+ /* XXX I guess that was designed for calls from 'make single user' operator... But since copy_collection is
+ * always false then, was not doing anything. And that kind of behavior should be added at operator level,
+ * not in a utility function also used by rather different code... */
+#if 0
+ if (copy_collections) {
+ Collection *collection, *collectionn;
+ for (collection = bmain->collection.first; collection; collection = collection->id.next) {
bool all_duplicated = true;
bool any_duplicated = false;
@@ -1708,6 +1701,10 @@ static void single_object_users(Main *bmain, Scene *scene, View3D *v3d, const in
}
}
}
+#endif
+
+ /* Collection and object pointers in collections */
+ libblock_relink_collection(master_collection);
/* collection pointers in scene */
BKE_scene_groups_relink(scene);
@@ -1716,8 +1713,7 @@ static void single_object_users(Main *bmain, Scene *scene, View3D *v3d, const in
ID_NEW_REMAP(scene->camera);
if (v3d) ID_NEW_REMAP(v3d->camera);
- /* object and collection pointers */
- libblock_relink_collection(master_collection);
+ BKE_scene_collection_sync(scene);
}
/* not an especially efficient function, only added so the single user
@@ -2067,9 +2063,6 @@ static void make_local_animdata_tag_strips(ListBase *strips)
if (strip->act) {
strip->act->id.tag &= ~LIB_TAG_PRE_EXISTING;
}
- if (strip->remap && strip->remap->target) {
- strip->remap->target->id.tag &= ~LIB_TAG_PRE_EXISTING;
- }
make_local_animdata_tag_strips(&strip->strips);
}
@@ -2086,10 +2079,6 @@ static void make_local_animdata_tag(AnimData *adt)
if (adt->tmpact) {
adt->tmpact->id.tag &= ~LIB_TAG_PRE_EXISTING;
}
- /* Remaps */
- if (adt->remap && adt->remap->target) {
- adt->remap->target->id.tag &= ~LIB_TAG_PRE_EXISTING;
- }
/* Drivers */
/* TODO: need to handle the ID-targets too? */
@@ -2332,7 +2321,7 @@ static int make_override_static_exec(bContext *C, wmOperator *op)
success = BKE_override_static_create_from_tag(bmain);
- /* Intantiate our newly overridden objects in scene, if not yet done. */
+ /* Instantiate our newly overridden objects in scene, if not yet done. */
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
Collection *new_collection = (Collection *)collection->id.newid;
@@ -2351,7 +2340,8 @@ static int make_override_static_exec(bContext *C, wmOperator *op)
new_ob->parent = obcollection;
}
if (new_ob == (Object *)obact->id.newid) {
- BKE_view_layer_base_select(view_layer, base);
+ /* TODO: is setting active needed? */
+ BKE_view_layer_base_select_and_set_active(view_layer, base);
}
else {
/* Disable auto-override tags for non-active objects, will help with performaces... */
@@ -2366,7 +2356,7 @@ static int make_override_static_exec(bContext *C, wmOperator *op)
/* obcollection is no more duplicollection-ing, it merely parents whole collection of overriding instantiated objects. */
obcollection->dup_group = NULL;
- /* Also, we'd likely want to lock by default things like transformations of implicitly overriden objects? */
+ /* Also, we'd likely want to lock by default things like transformations of implicitly overridden objects? */
DEG_id_tag_update(&scene->id, 0);
@@ -2386,7 +2376,7 @@ static int make_override_static_exec(bContext *C, wmOperator *op)
success = BKE_override_static_create_from_tag(bmain);
- /* Also, we'd likely want to lock by default things like transformations of implicitly overriden objects? */
+ /* Also, we'd likely want to lock by default things like transformations of implicitly overridden objects? */
/* Cleanup. */
BKE_main_id_clear_newpoins(bmain);
@@ -2407,7 +2397,8 @@ static bool make_override_static_poll(bContext *C)
Object *obact = CTX_data_active_object(C);
/* Object must be directly linked to be overridable. */
- return (ED_operator_objectmode(C) && obact != NULL &&
+ return (BKE_override_static_is_enabled() &&
+ ED_operator_objectmode(C) && obact != NULL &&
((ID_IS_LINKED(obact) && obact->id.tag & LIB_TAG_EXTERN) ||
(!ID_IS_LINKED(obact) && obact->dup_group != NULL && ID_IS_LINKED(obact->dup_group))));
}
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index fc4934fe4b3..a50c5a14e06 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -53,17 +53,17 @@
#include "BKE_collection.h"
#include "BKE_context.h"
+#include "BKE_deform.h"
#include "BKE_layer.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_object.h"
-#include "BKE_particle.h"
#include "BKE_paint.h"
+#include "BKE_particle.h"
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_workspace.h"
-#include "BKE_library.h"
-#include "BKE_deform.h"
#include "DEG_depsgraph.h"
diff --git a/source/blender/editors/object/object_shader_fx.c b/source/blender/editors/object/object_shader_fx.c
index 62569676434..47cf9f6c20b 100644
--- a/source/blender/editors/object/object_shader_fx.c
+++ b/source/blender/editors/object/object_shader_fx.c
@@ -301,7 +301,7 @@ static bool edit_shaderfx_poll_generic(bContext *C, StructRNA *rna_type, int obt
if (ptr.id.data && ID_IS_LINKED(ptr.id.data)) return 0;
if (ID_IS_STATIC_OVERRIDE(ob)) {
- CTX_wm_operator_poll_msg_set(C, "Cannot edit shaderfxs comming from static override");
+ CTX_wm_operator_poll_msg_set(C, "Cannot edit shaderfxs coming from static override");
return (((ShaderFxData *)ptr.data)->flag & eShaderFxFlag_StaticOverride_Local) != 0;
}
diff --git a/source/blender/editors/object/object_shapekey.c b/source/blender/editors/object/object_shapekey.c
index 30fb2896670..7d16898c2a2 100644
--- a/source/blender/editors/object/object_shapekey.c
+++ b/source/blender/editors/object/object_shapekey.c
@@ -51,12 +51,11 @@
#include "DNA_object_types.h"
#include "BKE_context.h"
+#include "BKE_curve.h"
#include "BKE_key.h"
-#include "BKE_library.h"
+#include "BKE_lattice.h"
#include "BKE_main.h"
#include "BKE_object.h"
-#include "BKE_lattice.h"
-#include "BKE_curve.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index ca5c000819d..81e074a7e8f 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -494,7 +494,7 @@ static void mesh_defvert_mirror_update_internal(
const int def_nr)
{
if (def_nr == -1) {
- /* all vgroups, add groups where neded */
+ /* all vgroups, add groups where needed */
int flip_map_len;
int *flip_map = defgroup_flip_map(ob, &flip_map_len, true);
defvert_sync_mapped(dvert_dst, dvert_src, flip_map, flip_map_len, true);
@@ -3119,21 +3119,32 @@ void OBJECT_OT_vertex_group_invert(wmOperatorType *ot)
static int vertex_group_smooth_exec(bContext *C, wmOperator *op)
{
- Object *ob = ED_object_context(C);
const float fac = RNA_float_get(op->ptr, "factor");
const int repeat = RNA_int_get(op->ptr, "repeat");
eVGroupSelect subset_type = RNA_enum_get(op->ptr, "group_select_mode");
const float fac_expand = RNA_float_get(op->ptr, "expand");
+ ViewLayer *view_layer = CTX_data_view_layer(C);
- int subset_count, vgroup_tot;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
- const bool *vgroup_validmap = BKE_object_defgroup_subset_from_select_type(ob, subset_type, &vgroup_tot, &subset_count);
- vgroup_smooth_subset(ob, vgroup_validmap, vgroup_tot, subset_count, fac, repeat, fac_expand);
- MEM_freeN((void *)vgroup_validmap);
+ int subset_count, vgroup_tot;
- DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
+ const bool *vgroup_validmap = BKE_object_defgroup_subset_from_select_type(ob,
+ subset_type,
+ &vgroup_tot,
+ &subset_count);
+
+ vgroup_smooth_subset(ob, vgroup_validmap, vgroup_tot, subset_count, fac, repeat, fac_expand);
+ MEM_freeN((void *)vgroup_validmap);
+
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/physics/dynamicpaint_ops.c b/source/blender/editors/physics/dynamicpaint_ops.c
index 7f74dd4666a..a967450408c 100644
--- a/source/blender/editors/physics/dynamicpaint_ops.c
+++ b/source/blender/editors/physics/dynamicpaint_ops.c
@@ -319,7 +319,7 @@ static void dpaint_bake_endjob(void *customdata)
WM_set_locked_interface(G_MAIN->wm.first, false);
/* Bake was successful:
- * Report for ended bake and how long it took */
+ * Report for ended bake and how long it took */
if (job->success) {
/* Show bake info */
WM_reportf(RPT_INFO, "DynamicPaint: Bake complete! (%.2f)", PIL_check_seconds_timer() - job->start);
diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c
index 9c7c9fde066..457ff5be4de 100644
--- a/source/blender/editors/physics/particle_edit.c
+++ b/source/blender/editors/physics/particle_edit.c
@@ -52,19 +52,18 @@
#include "BLI_task.h"
#include "BLI_utildefines.h"
+#include "BKE_bvhutils.h"
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_object.h"
-#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
#include "BKE_modifier.h"
+#include "BKE_object.h"
#include "BKE_particle.h"
+#include "BKE_pointcache.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_bvhutils.h"
-#include "BKE_pointcache.h"
#include "DEG_depsgraph.h"
@@ -491,8 +490,8 @@ static void PE_free_shape_tree(PEData *data)
static void PE_create_random_generator(PEData *data)
{
uint rng_seed = (uint)(PIL_check_seconds_timer_i() & UINT_MAX);
- rng_seed ^= GET_UINT_FROM_POINTER(data->ob);
- rng_seed ^= GET_UINT_FROM_POINTER(data->edit);
+ rng_seed ^= POINTER_AS_UINT(data->ob);
+ rng_seed ^= POINTER_AS_UINT(data->edit);
data->rng = BLI_rng_new(rng_seed);
}
@@ -1311,7 +1310,7 @@ void recalc_emitter_field(Depsgraph *UNUSED(depsgraph), Object *UNUSED(ob), Part
BLI_kdtree_free(edit->emitter_field);
totface = mesh->totface;
- /*totvert=dm->getNumVerts(dm);*/ /*UNSUED*/
+ /*totvert=dm->getNumVerts(dm);*/ /*UNUSED*/
edit->emitter_cosnos = MEM_callocN(totface * 6 * sizeof(float), "emitter cosnos");
@@ -1967,7 +1966,7 @@ void PARTICLE_OT_select_linked(wmOperatorType *ot)
RNA_def_int_vector(ot->srna, "location", 2, NULL, 0, INT_MAX, "Location", "", 0, 16384);
}
-/************************ border select operator ************************/
+/************************ box select operator ************************/
void PE_deselect_all_visible(PTCacheEdit *edit)
{
POINT_P; KEY_K;
@@ -1980,7 +1979,7 @@ void PE_deselect_all_visible(PTCacheEdit *edit)
}
}
-int PE_border_select(bContext *C, const rcti *rect, const int sel_op)
+int PE_box_select(bContext *C, const rcti *rect, const int sel_op)
{
Scene *scene = CTX_data_scene(C);
Object *ob = CTX_data_active_object(C);
@@ -2945,7 +2944,12 @@ static void toggle_particle_cursor(bContext *C, int enable)
pset->paintcursor = NULL;
}
else if (enable)
- pset->paintcursor = WM_paint_cursor_activate(CTX_wm_manager(C), PE_poll_view3d, brush_drawcursor, NULL);
+ pset->paintcursor = WM_paint_cursor_activate(
+ CTX_wm_manager(C),
+ SPACE_VIEW3D, RGN_TYPE_WINDOW,
+ PE_poll_view3d,
+ brush_drawcursor,
+ NULL);
}
/*************************** delete operator **************************/
@@ -3443,7 +3447,7 @@ static void brush_puff(PEData *data, int point_index)
#else
/* translate (not rotate) the rest of the hair if its not selected */
{
-#if 0 /* kindof works but looks worse then whats below */
+#if 0 /* kindof works but looks worse then what's below */
/* Move the unselected point on a vector based on the
* hair direction and the offset */
@@ -3751,7 +3755,7 @@ static void brush_add_count_iter(
mco[1] = data->mval[1] + dmy;
float co1[3], co2[3];
- ED_view3d_win_to_segment(depsgraph, data->vc.ar, data->vc.v3d, mco, co1, co2, true);
+ ED_view3d_win_to_segment_clipped(depsgraph, data->vc.ar, data->vc.v3d, mco, co1, co2, true);
mul_m4_v3(iter_data->imat, co1);
mul_m4_v3(iter_data->imat, co2);
@@ -3841,7 +3845,7 @@ static int brush_add(const bContext *C, PEData *data, short number)
BLI_assert(mesh);
/* Calculate positions of new particles to add, based on brush interseciton
- * with object. New particle data is assigned to a correponding to check
+ * with object. New particle data is assigned to a corresponding to check
* index element of add_pars array. This means, that add_pars is a sparse
* array.
*/
diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c
index fa272ffe34d..228bf2c648f 100644
--- a/source/blender/editors/physics/particle_object.c
+++ b/source/blender/editors/physics/particle_object.c
@@ -1268,7 +1268,7 @@ static int duplicate_particle_systems_exec(bContext *C, wmOperator *op)
void PARTICLE_OT_duplicate_particle_system(wmOperatorType *ot)
{
- ot->name = "Duplicate Particle Systems";
+ ot->name = "Duplicate Particle System";
ot->description = "Duplicate particle system within the active object";
ot->idname = "PARTICLE_OT_duplicate_particle_system";
@@ -1279,5 +1279,5 @@ void PARTICLE_OT_duplicate_particle_system(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
RNA_def_boolean(ot->srna, "use_duplicate_settings", false, "Duplicate Settings",
- "Duplicate settings as well, so new particle system uses own settings");
+ "Duplicate settings as well, so the new particle system uses its own settings");
}
diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c
index dd58d24871d..1272ae3ff41 100644
--- a/source/blender/editors/physics/physics_fluid.c
+++ b/source/blender/editors/physics/physics_fluid.c
@@ -42,6 +42,7 @@
#include "DNA_object_fluidsim_types.h"
#include "BLI_blenlib.h"
+#include "BLI_path_util.h"
#include "BLI_math.h"
#include "BLI_utildefines.h"
@@ -875,8 +876,8 @@ static int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain, shor
fb= MEM_callocN(sizeof(FluidBakeJob), "fluid bake job");
- if (getenv(strEnvName)) {
- int dlevel = atoi(getenv(strEnvName));
+ if (BLI_getenv(strEnvName)) {
+ int dlevel = atoi(BLI_getenv(strEnvName));
elbeemSetDebugLevel(dlevel);
BLI_snprintf(debugStrBuffer, sizeof(debugStrBuffer), "fluidsimBake::msg: Debug messages activated due to envvar '%s'\n", strEnvName);
elbeemDebugOut(debugStrBuffer);
diff --git a/source/blender/editors/physics/physics_ops.c b/source/blender/editors/physics/physics_ops.c
index 736f7c48a10..421e19d5109 100644
--- a/source/blender/editors/physics/physics_ops.c
+++ b/source/blender/editors/physics/physics_ops.c
@@ -112,53 +112,8 @@ static void operatortypes_particle(void)
static void keymap_particle(wmKeyConfig *keyconf)
{
- wmKeyMapItem *kmi;
- wmKeyMap *keymap;
-
- keymap = WM_keymap_ensure(keyconf, "Particle", 0, 0);
+ wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Particle", 0, 0);
keymap->poll = PE_poll;
-
- kmi = WM_keymap_add_item(keymap, "PARTICLE_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "PARTICLE_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "PARTICLE_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- WM_keymap_add_item(keymap, "PARTICLE_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "PARTICLE_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
-
- kmi = WM_keymap_add_item(keymap, "PARTICLE_OT_select_linked", LKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- kmi = WM_keymap_add_item(keymap, "PARTICLE_OT_select_linked", LKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", true);
-
- WM_keymap_add_item(keymap, "PARTICLE_OT_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "PARTICLE_OT_delete", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "PARTICLE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
- kmi = WM_keymap_add_item(keymap, "PARTICLE_OT_hide", HKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
- kmi = WM_keymap_add_item(keymap, "PARTICLE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
-
- WM_keymap_add_item(keymap, "PARTICLE_OT_brush_edit", LEFTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "PARTICLE_OT_brush_edit", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
-
- /* size radial control */
- kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path_primary", "tool_settings.particle_edit.brush.size");
-
- /* size radial control */
- kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path_primary", "tool_settings.particle_edit.brush.strength");
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_particle_specials", WKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "PARTICLE_OT_weight_set", KKEY, KM_PRESS, KM_SHIFT, 0);
-
- ED_keymap_proportional_cycle(keyconf, keymap);
- ED_keymap_proportional_editmode(keyconf, keymap, false);
}
/******************************* boids *************************************/
@@ -207,16 +162,6 @@ static void operatortypes_dynamicpaint(void)
WM_operatortype_append(DPAINT_OT_output_toggle);
}
-//static void keymap_pointcache(wmWindowManager *wm)
-//{
-// wmKeyMap *keymap = WM_keymap_ensure(wm, "Pointcache", 0, 0);
-//
-// WM_keymap_add_item(keymap, "PHYSICS_OT_bake_all", AKEY, KM_PRESS, 0, 0);
-// WM_keymap_add_item(keymap, "PHYSICS_OT_free_all", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
-// WM_keymap_add_item(keymap, "PHYSICS_OT_bake_particle_system", PADMINUS, KM_PRESS, KM_CTRL, 0);
-// WM_keymap_add_item(keymap, "PHYSICS_OT_free_particle_system", LKEY, KM_PRESS, 0, 0);
-//}
-
/****************************** general ************************************/
void ED_operatortypes_physics(void)
@@ -231,5 +176,4 @@ void ED_operatortypes_physics(void)
void ED_keymap_physics(wmKeyConfig *keyconf)
{
keymap_particle(keyconf);
- //keymap_pointcache(keyconf);
}
diff --git a/source/blender/editors/physics/physics_pointcache.c b/source/blender/editors/physics/physics_pointcache.c
index 7fc3dc2e1b8..58bd761a2a9 100644
--- a/source/blender/editors/physics/physics_pointcache.c
+++ b/source/blender/editors/physics/physics_pointcache.c
@@ -69,6 +69,7 @@ static bool ptcache_poll(bContext *C)
}
typedef struct PointCacheJob {
+ wmWindowManager *wm;
void *owner;
short *stop, *do_update;
float *progress;
@@ -123,8 +124,7 @@ static void ptcache_job_startjob(void *customdata, short *stop, short *do_update
/* XXX annoying hack: needed to prevent data corruption when changing
* scene frame in separate threads
*/
- G.is_rendering = true;
- BKE_spacedata_draw_locks(true);
+ WM_set_locked_interface(job->wm, true);
BKE_ptcache_bake(job->baker);
@@ -137,10 +137,7 @@ static void ptcache_job_endjob(void *customdata)
PointCacheJob *job = customdata;
Scene *scene = job->baker->scene;
- G.is_rendering = false;
- BKE_spacedata_draw_locks(false);
-
- WM_set_locked_interface(G_MAIN->wm.first, false);
+ WM_set_locked_interface(job->wm, false);
WM_main_add_notifier(NC_SCENE | ND_FRAME, scene);
WM_main_add_notifier(NC_OBJECT | ND_POINTCACHE, job->baker->pid.ob);
@@ -199,6 +196,7 @@ static int ptcache_bake_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSE
bool all = STREQ(op->type->idname, "PTCACHE_OT_bake_all");
PointCacheJob *job = MEM_mallocN(sizeof(PointCacheJob), "PointCacheJob");
+ job->wm = CTX_wm_manager(C);
job->baker = ptcache_baker_create(C, op, all);
job->baker->bake_job = job;
job->baker->update_progress = ptcache_job_update;
diff --git a/source/blender/editors/physics/rigidbody_constraint.c b/source/blender/editors/physics/rigidbody_constraint.c
index 68395886c67..a98faf82c3b 100644
--- a/source/blender/editors/physics/rigidbody_constraint.c
+++ b/source/blender/editors/physics/rigidbody_constraint.c
@@ -39,6 +39,7 @@
#include "BKE_collection.h"
#include "BKE_context.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_rigidbody.h"
diff --git a/source/blender/editors/physics/rigidbody_object.c b/source/blender/editors/physics/rigidbody_object.c
index 53e7d72409e..a36b430d8ac 100644
--- a/source/blender/editors/physics/rigidbody_object.c
+++ b/source/blender/editors/physics/rigidbody_object.c
@@ -45,6 +45,7 @@
#include "BKE_collection.h"
#include "BKE_context.h"
+#include "BKE_library.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 d6a968d993c..1ca06beefad 100644
--- a/source/blender/editors/render/render_internal.c
+++ b/source/blender/editors/render/render_internal.c
@@ -111,7 +111,6 @@ typedef struct RenderJob {
Depsgraph *depsgraph;
Render *re;
struct Object *camera_override;
- int lay_override;
bool v3d_override;
bool anim, write_still;
Image *image;
@@ -307,7 +306,6 @@ static int screen_render_exec(bContext *C, wmOperator *op)
Image *ima;
View3D *v3d = CTX_wm_view3d(C);
Main *mainp = CTX_data_main(C);
- unsigned int lay_override;
const bool is_animation = RNA_boolean_get(op->ptr, "animation");
const bool is_write_still = RNA_boolean_get(op->ptr, "write_still");
struct Object *camera_override = v3d ? V3D_CAMERA_LOCAL(v3d) : NULL;
@@ -326,7 +324,6 @@ static int screen_render_exec(bContext *C, wmOperator *op)
}
re = RE_NewSceneRender(scene);
- lay_override = (v3d && v3d->lay != scene->lay) ? v3d->lay : 0;
G.is_break = false;
RE_test_break_cb(re, NULL, render_break);
@@ -345,9 +342,9 @@ static int screen_render_exec(bContext *C, wmOperator *op)
BLI_threaded_malloc_begin();
if (is_animation)
- RE_BlenderAnim(re, mainp, scene, camera_override, lay_override, scene->r.sfra, scene->r.efra, scene->r.frame_step);
+ RE_BlenderAnim(re, mainp, scene, single_layer, camera_override, scene->r.sfra, scene->r.efra, scene->r.frame_step);
else
- RE_BlenderFrame(re, mainp, scene, single_layer, camera_override, lay_override, scene->r.cfra, is_write_still);
+ RE_BlenderFrame(re, mainp, scene, single_layer, camera_override, scene->r.cfra, is_write_still);
BLI_threaded_malloc_end();
RE_SetReports(re, NULL);
@@ -620,9 +617,9 @@ static void render_startjob(void *rjv, short *stop, short *do_update, float *pro
RE_SetReports(rj->re, rj->reports);
if (rj->anim)
- RE_BlenderAnim(rj->re, rj->main, rj->scene, rj->camera_override, rj->lay_override, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step);
+ RE_BlenderAnim(rj->re, rj->main, rj->scene, rj->single_layer, rj->camera_override, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step);
else
- RE_BlenderFrame(rj->re, rj->main, rj->scene, rj->single_layer, rj->camera_override, rj->lay_override, rj->scene->r.cfra, rj->write_still);
+ RE_BlenderFrame(rj->re, rj->main, rj->scene, rj->single_layer, rj->camera_override, rj->scene->r.cfra, rj->write_still);
RE_SetReports(rj->re, NULL);
}
@@ -734,24 +731,11 @@ static void render_endjob(void *rjv)
/* Finally unlock the user interface (if it was locked). */
if (rj->interface_locked) {
- Scene *scene;
-
/* Interface was locked, so window manager couldn't have been changed
* and using one from Global will unlock exactly the same manager as
* was locked before running the job.
*/
WM_set_locked_interface(G_MAIN->wm.first, false);
-
- /* We've freed all the derived caches before rendering, which is
- * effectively the same as if we re-loaded the file.
- *
- * So let's not try being smart here and just reset all updated
- * scene layers and use generic DAG_on_visible_update.
- */
- for (scene = G_MAIN->scene.first; scene; scene = scene->id.next) {
- scene->lay_updated = 0;
- }
-
DEG_on_visible_update(G_MAIN, false);
}
}
@@ -778,7 +762,7 @@ static int render_break(void *UNUSED(rjv))
}
/* runs in thread, no cursor setting here works. careful with notifiers too (malloc conflicts) */
-/* maybe need a way to get job send notifer? */
+/* maybe need a way to get job send notifier? */
static void render_drawlock(void *rjv, int lock)
{
RenderJob *rj = rjv;
@@ -941,7 +925,6 @@ static int screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *even
/* TODO(sergey): Render engine should be using own depsgraph. */
rj->depsgraph = CTX_data_depsgraph(C);
rj->camera_override = camera_override;
- rj->lay_override = 0;
rj->anim = is_animation;
rj->write_still = is_write_still && !is_animation;
rj->iuser.scene = scene;
@@ -961,15 +944,8 @@ static int screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *even
}
if (v3d) {
- if (scene->lay != v3d->lay) {
- rj->lay_override = v3d->lay;
- rj->v3d_override = true;
- }
- else if (camera_override && camera_override != scene->camera)
+ if (camera_override && camera_override != scene->camera)
rj->v3d_override = true;
-
- if (v3d->localvd)
- rj->lay_override |= v3d->localvd->lay;
}
/* Lock the user interface depending on render settings. */
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index ed7950f3993..8006f5071d1 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -269,6 +269,7 @@ static void screen_opengl_views_setup(OGLRender *oglrender)
static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, RenderResult *rr)
{
Depsgraph *depsgraph = CTX_data_depsgraph(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
Scene *scene = oglrender->scene;
ARegion *ar = oglrender->ar;
View3D *v3d = oglrender->v3d;
@@ -329,7 +330,8 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R
GPU_matrix_translate_2f(sizex / 2, sizey / 2);
G.f |= G_RENDER_OGL;
- ED_gpencil_draw_ex(rv3d, scene, gpd, sizex, sizey, scene->r.cfra, SPACE_SEQ);
+ ED_gpencil_draw_ex(
+ view_layer, rv3d, scene, gpd, sizex, sizey, scene->r.cfra, SPACE_SEQ);
G.f &= ~G_RENDER_OGL;
gp_rect = MEM_mallocN(sizex * sizey * sizeof(unsigned char) * 4, "offscreen rect");
@@ -1099,8 +1101,8 @@ void RENDER_OT_opengl(wmOperatorType *ot)
PropertyRNA *prop;
/* identifiers */
- ot->name = "OpenGL Render";
- ot->description = "OpenGL render active viewport";
+ ot->name = "Viewport Render";
+ ot->description = "Take a snapshot of the active viewport";
ot->idname = "RENDER_OT_opengl";
/* api callbacks */
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 0059d782eaf..1c2aa4537e9 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -71,7 +71,6 @@
#include "BKE_icons.h"
#include "BKE_lamp.h"
#include "BKE_layer.h"
-#include "BKE_library.h"
#include "BKE_library_remap.h"
#include "BKE_main.h"
#include "BKE_material.h"
@@ -95,6 +94,7 @@
#include "RE_pipeline.h"
#include "RE_engine.h"
+#include "RE_shader_ext.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -196,7 +196,6 @@ typedef struct IconPreview {
/* *************************** Preview for buttons *********************** */
-static Main *G_pr_main = NULL;
static Main *G_pr_main_cycles = NULL;
static Main *G_pr_main_grease_pencil = NULL;
@@ -226,7 +225,6 @@ void ED_preview_ensure_dbase(void)
static bool base_initialized = false;
BLI_assert(BLI_thread_is_main());
if (!base_initialized) {
- G_pr_main = load_main_from_memory(datatoc_preview_blend, datatoc_preview_blend_size);
G_pr_main_cycles = load_main_from_memory(datatoc_preview_cycles_blend, datatoc_preview_cycles_blend_size);
G_pr_main_grease_pencil = load_main_from_memory(datatoc_preview_grease_pencil_blend, datatoc_preview_grease_pencil_blend_size);
base_initialized = true;
@@ -248,9 +246,6 @@ static bool check_engine_supports_preview(Scene *scene)
void ED_preview_free_dbase(void)
{
- if (G_pr_main)
- BKE_main_free(G_pr_main);
-
if (G_pr_main_cycles)
BKE_main_free(G_pr_main_cycles);
@@ -727,6 +722,61 @@ static void shader_preview_updatejob(void *spv)
}
}
+/* Renders texture directly to render buffer. */
+static void shader_preview_texture(ShaderPreview *sp, Tex *tex, Scene *sce, Render *re)
+{
+ /* Setup output buffer. */
+ int width = sp->sizex;
+ int height = sp->sizey;
+
+ /* This is needed otherwise no RenderResult is created. */
+ sce->r.scemode &= ~R_BUTS_PREVIEW;
+ RE_InitState(re, NULL, &sce->r, &sce->view_layers, NULL, width, height, NULL);
+ RE_SetScene(re, sce);
+
+ /* Create buffer in empty RenderView created in the init step. */
+ RenderResult *rr = RE_AcquireResultWrite(re);
+ RenderView *rv = (RenderView *)rr->views.first;
+ rv->rectf = MEM_callocN(sizeof(float) * 4 * width * height, "texture render result");
+ RE_ReleaseResult(re);
+
+ /* Get texture image pool (if any) */
+ struct ImagePool *img_pool = BKE_image_pool_new();
+ BKE_texture_fetch_images_for_pool(tex, img_pool);
+
+ /* Fill in image buffer. */
+ float *rect_float = rv->rectf;
+ float tex_coord[3] = {0.0f, 0.0f, 0.0f};
+ bool color_manage = true;
+
+ for (int y = 0; y < height; y++) {
+ /* Tex coords between -1.0f and 1.0f. */
+ tex_coord[1] = ((float)y / (float)height) * 2.0f - 1.0f;
+
+ for (int x = 0; x < width; x++) {
+ tex_coord[0] = ((float)x / (float)height) * 2.0f - 1.0f;
+
+ /* Evaluate texture at tex_coord .*/
+ TexResult texres = {0};
+ BKE_texture_get_value_ex(sce, tex, tex_coord, &texres, img_pool, color_manage);
+
+ rect_float[0] = texres.tr;
+ rect_float[1] = texres.tg;
+ rect_float[2] = texres.tb;
+ rect_float[3] = 1.0f;
+
+ rect_float += 4;
+ }
+
+ /* Check if we should cancel texture preview. */
+ if (shader_preview_break(sp)) {
+ break;
+ }
+ }
+
+ BKE_image_pool_free(img_pool);
+}
+
static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int first)
{
Render *re;
@@ -803,7 +853,13 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
((Camera *)sce->camera->data)->lens *= (float)sp->sizey / (float)sizex;
/* entire cycle for render engine */
- RE_PreviewRender(re, pr_main, sce);
+ if (idtype == ID_TE) {
+ shader_preview_texture(sp, (Tex *)id, sce, re);
+ }
+ else {
+ /* Render preview scene */
+ RE_PreviewRender(re, pr_main, sce);
+ }
((Camera *)sce->camera->data)->lens = oldlens;
@@ -1122,25 +1178,17 @@ static void icon_preview_startjob_all_sizes(void *customdata, short *stop, short
if (is_render) {
BLI_assert(ip->id);
- /* texture icon rendering is hardcoded to use the BI scene,
- * so don't even think of using cycle's bmain for
- * texture icons
- */
- if (GS(ip->id->name) != ID_TE) {
- /* grease pencil use its own preview file */
- if (GS(ip->id->name) == ID_MA) {
- ma = (Material *)ip->id;
- }
- if ((ma == NULL) || (ma->gp_style == NULL)) {
- sp->pr_main = G_pr_main_cycles;
- }
- else {
- sp->pr_main = G_pr_main_grease_pencil;
- }
+ /* grease pencil use its own preview file */
+ if (GS(ip->id->name) == ID_MA) {
+ ma = (Material *)ip->id;
+ }
+
+ if ((ma == NULL) || (ma->gp_style == NULL)) {
+ sp->pr_main = G_pr_main_cycles;
}
else {
- sp->pr_main = G_pr_main;
+ sp->pr_main = G_pr_main_grease_pencil;
}
}
@@ -1311,22 +1359,17 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, M
/* hardcoded preview .blend for Eevee + Cycles, this should be solved
* once with custom preview .blend path for external engines */
- if ((method != PR_NODE_RENDER) && id_type != ID_TE) {
- /* grease pencil use its own preview file */
- if (GS(id->name) == ID_MA) {
- ma = (Material *)id;
- }
- if ((ma == NULL) || (ma->gp_style == NULL)) {
- sp->pr_main = G_pr_main_cycles;
- }
- else {
- sp->pr_main = G_pr_main_grease_pencil;
- }
+ /* grease pencil use its own preview file */
+ if (GS(id->name) == ID_MA) {
+ ma = (Material *)id;
+ }
+ if ((ma == NULL) || (ma->gp_style == NULL)) {
+ sp->pr_main = G_pr_main_cycles;
}
else {
- sp->pr_main = G_pr_main;
+ sp->pr_main = G_pr_main_grease_pencil;
}
if (ob && ob->totcol) copy_v4_v4(sp->col, ob->col);
diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c
index 2dd4f328d06..99abb8b61c7 100644
--- a/source/blender/editors/render/render_shading.c
+++ b/source/blender/editors/render/render_shading.c
@@ -51,6 +51,7 @@
#include "BKE_animsys.h"
#include "BKE_context.h"
#include "BKE_curve.h"
+#include "BKE_editmesh.h"
#include "BKE_font.h"
#include "BKE_global.h"
#include "BKE_image.h"
@@ -65,7 +66,6 @@
#include "BKE_texture.h"
#include "BKE_workspace.h"
#include "BKE_world.h"
-#include "BKE_editmesh.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
@@ -186,6 +186,7 @@ void OBJECT_OT_material_slot_remove(wmOperatorType *ot)
static int material_slot_assign_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob = ED_object_context(C);
+ View3D *v3d = CTX_wm_view3d(C);
if (!ob)
return OPERATOR_CANCELLED;
@@ -209,7 +210,7 @@ static int material_slot_assign_exec(bContext *C, wmOperator *UNUSED(op))
if (nurbs) {
for (nu = nurbs->first; nu; nu = nu->next) {
- if (ED_curve_nurb_select_check(ob->data, nu)) {
+ if (ED_curve_nurb_select_check(v3d, nu)) {
nu->mat_nr = ob->actcol - 1;
}
}
@@ -382,9 +383,9 @@ static int material_slot_copy_exec(bContext *C, wmOperator *UNUSED(op))
void OBJECT_OT_material_slot_copy(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Copy Material to Others";
+ ot->name = "Copy Material to Selected";
ot->idname = "OBJECT_OT_material_slot_copy";
- ot->description = "Copies materials to other selected objects";
+ ot->description = "Copy material to selected objects";
/* api callbacks */
ot->exec = material_slot_copy_exec;
@@ -832,6 +833,10 @@ static int light_cache_free_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene = CTX_data_scene(C);
+ /* kill potential bake job first (see T57011) */
+ wmWindowManager *wm = CTX_wm_manager(C);
+ WM_jobs_kill_type(wm, scene, WM_JOB_TYPE_LIGHT_BAKE);
+
if (!scene->eevee.light_cache) {
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/render/render_update.c b/source/blender/editors/render/render_update.c
index 09d89e3b90f..c42eda678ba 100644
--- a/source/blender/editors/render/render_update.c
+++ b/source/blender/editors/render/render_update.c
@@ -58,8 +58,6 @@
#include "BKE_scene.h"
#include "BKE_workspace.h"
-#include "GPU_material.h"
-
#include "RE_engine.h"
#include "RE_pipeline.h"
@@ -73,8 +71,6 @@
#include "render_intern.h" // own include
-extern Material defmaterial;
-
/***************************** Render Engines ********************************/
void ED_render_scene_update(const DEGEditorUpdateContext *update_ctx, int updated)
@@ -244,22 +240,12 @@ static void material_changed(Main *UNUSED(bmain), Material *ma)
{
/* icons */
BKE_icon_changed(BKE_icon_id_ensure(&ma->id));
-
- /* glsl */
- if (ma->id.recalc & ID_RECALC) {
- if (!BLI_listbase_is_empty(&ma->gpumaterial)) {
- GPU_material_free(&ma->gpumaterial);
- }
- }
}
static void lamp_changed(Main *UNUSED(bmain), Lamp *la)
{
/* icons */
BKE_icon_changed(BKE_icon_id_ensure(&la->id));
-
- if (defmaterial.gpumaterial.first)
- GPU_material_free(&defmaterial.gpumaterial);
}
static void texture_changed(Main *bmain, Tex *tex)
@@ -271,15 +257,12 @@ static void texture_changed(Main *bmain, Tex *tex)
/* icons */
BKE_icon_changed(BKE_icon_id_ensure(&tex->id));
- /* paint overlays */
for (scene = bmain->scene.first; scene; scene = scene->id.next) {
+ /* paint overlays */
for (view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) {
BKE_paint_invalidate_overlay_tex(scene, view_layer, tex);
}
- }
-
- /* find compositing nodes */
- for (scene = bmain->scene.first; scene; scene = scene->id.next) {
+ /* find compositing nodes */
if (scene->use_nodes && scene->nodetree) {
for (node = scene->nodetree->nodes.first; node; node = node->next) {
if (node->id == &tex->id)
@@ -293,16 +276,6 @@ static void world_changed(Main *UNUSED(bmain), World *wo)
{
/* icons */
BKE_icon_changed(BKE_icon_id_ensure(&wo->id));
-
- /* glsl */
- if (wo->id.recalc & ID_RECALC) {
- if (!BLI_listbase_is_empty(&defmaterial.gpumaterial)) {
- GPU_material_free(&defmaterial.gpumaterial);
- }
- if (!BLI_listbase_is_empty(&wo->gpumaterial)) {
- GPU_material_free(&wo->gpumaterial);
- }
- }
}
static void image_changed(Main *bmain, Image *ima)
diff --git a/source/blender/editors/scene/scene_edit.c b/source/blender/editors/scene/scene_edit.c
index 1f4e86f89ab..0553e223c55 100644
--- a/source/blender/editors/scene/scene_edit.c
+++ b/source/blender/editors/scene/scene_edit.c
@@ -32,6 +32,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_layer.h"
+#include "BKE_library.h"
#include "BKE_library_remap.h"
#include "BKE_main.h"
#include "BKE_node.h"
diff --git a/source/blender/editors/screen/CMakeLists.txt b/source/blender/editors/screen/CMakeLists.txt
index 4be65f60b21..e01be2ed709 100644
--- a/source/blender/editors/screen/CMakeLists.txt
+++ b/source/blender/editors/screen/CMakeLists.txt
@@ -42,6 +42,7 @@ set(INC_SYS
set(SRC
area.c
+ area_utils.c
glutil.c
screen_context.c
screen_draw.c
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index 4ad40807c8b..8163959f909 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -250,7 +250,7 @@ static void area_draw_azone_fullscreen(short x1, short y1, short x2, short y2, f
alpha = min_ff(alpha, 0.75f);
- UI_icon_draw_aspect(x, y, ICON_FULLSCREEN_EXIT, 0.7f / UI_DPI_FAC, alpha);
+ UI_icon_draw_aspect(x, y, ICON_FULLSCREEN_EXIT, 0.7f / UI_DPI_FAC, alpha, NULL);
/* debug drawing :
* The click_rect is the same as defined in fullscreen_click_rcti_init
@@ -700,7 +700,7 @@ void ED_area_status_text(ScrArea *sa, const char *str)
{
ARegion *ar;
- /* happens when running transform operators in backround mode */
+ /* happens when running transform operators in background mode */
if (sa == NULL)
return;
@@ -756,7 +756,7 @@ static void area_azone_initialize(wmWindow *win, const bScreen *screen, ScrArea
{
AZone *az;
- /* reinitalize entirely, regions and fullscreen add azones too */
+ /* reinitialize entirely, regions and fullscreen add azones too */
BLI_freelistN(&sa->actionzones);
if (screen->state != SCREENNORMAL) {
@@ -1159,7 +1159,11 @@ static void region_rect_recursive(ScrArea *sa, ARegion *ar, rcti *remainder, rct
int prefsizex = UI_DPI_FAC * ((ar->sizex > 1) ? ar->sizex + 0.5f : ar->type->prefsizex);
int prefsizey;
- if (ar->regiontype == RGN_TYPE_HEADER) {
+ if (ar->flag & RGN_FLAG_PREFSIZE_OR_HIDDEN) {
+ prefsizex = UI_DPI_FAC * ar->type->prefsizex;
+ prefsizey = UI_DPI_FAC * ar->type->prefsizey;
+ }
+ else if (ar->regiontype == RGN_TYPE_HEADER) {
prefsizey = ED_area_headersize();
}
else if (ED_area_is_global(sa)) {
@@ -1183,6 +1187,7 @@ static void region_rect_recursive(ScrArea *sa, ARegion *ar, rcti *remainder, rct
*
* This aligns to the lower left of the area.
*/
+ const int size_min[2] = {UI_UNIT_X, UI_UNIT_Y};
rcti overlap_remainder_margin = *overlap_remainder;
BLI_rcti_resize(
&overlap_remainder_margin,
@@ -1194,8 +1199,17 @@ static void region_rect_recursive(ScrArea *sa, ARegion *ar, rcti *remainder, rct
ar->winrct.ymax = ar->winrct.ymin + ar->sizey - 1;
BLI_rcti_isect(&ar->winrct, &overlap_remainder_margin, &ar->winrct);
- if (BLI_rcti_size_x(&ar->winrct) < UI_UNIT_X ||
- BLI_rcti_size_y(&ar->winrct) < UI_UNIT_Y)
+
+ /* We need to use a test that wont have been previously clamped. */
+ rcti winrct_test = {
+ .xmin = ar->winrct.xmin,
+ .ymin = ar->winrct.ymin,
+ .xmax = ar->winrct.xmin + size_min[0],
+ .ymax = ar->winrct.ymin + size_min[1],
+ };
+ BLI_rcti_isect(&winrct_test, &overlap_remainder_margin, &winrct_test);
+ if (BLI_rcti_size_x(&winrct_test) < size_min[0] ||
+ BLI_rcti_size_y(&winrct_test) < size_min[1])
{
ar->flag |= RGN_FLAG_TOO_SMALL;
}
@@ -1447,6 +1461,18 @@ static void ed_default_handlers(wmWindowManager *wm, ScrArea *sa, ListBase *hand
/* user interface widgets */
UI_region_handlers_add(handlers);
}
+ if (flag & ED_KEYMAP_GIZMO) {
+ ARegion *ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
+ if (ar) {
+ /* Anything else is confusing, only allow this. */
+ BLI_assert(&ar->handlers == handlers);
+ if (ar->gizmo_map == NULL) {
+ ar->gizmo_map = WM_gizmomap_new_from_type(
+ &(const struct wmGizmoMapType_Params){sa->spacetype, RGN_TYPE_WINDOW});
+ }
+ WM_gizmomap_add_handlers(ar, ar->gizmo_map);
+ }
+ }
if (flag & ED_KEYMAP_VIEW2D) {
/* 2d-viewport handling+manipulation */
wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "View2D", 0, 0);
@@ -1476,6 +1502,13 @@ static void ed_default_handlers(wmWindowManager *wm, ScrArea *sa, ListBase *hand
wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Frames", 0, 0);
WM_event_add_keymap_handler(handlers, keymap);
}
+ if (flag & ED_KEYMAP_HEADER) {
+ /* standard keymap for headers regions */
+ wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Header", 0, 0);
+ WM_event_add_keymap_handler(handlers, keymap);
+ }
+
+ /* Keep last because of LMB/RMB handling, see: T57527. */
if (flag & ED_KEYMAP_GPENCIL) {
/* grease pencil */
/* NOTE: This is now 4 keymaps - One for basic functionality,
@@ -1505,11 +1538,6 @@ static void ed_default_handlers(wmWindowManager *wm, ScrArea *sa, ListBase *hand
wmKeyMap *keymap_sculpt = WM_keymap_ensure(wm->defaultconf, "Grease Pencil Stroke Sculpt Mode", 0, 0);
WM_event_add_keymap_handler(handlers, keymap_sculpt);
}
- if (flag & ED_KEYMAP_HEADER) {
- /* standard keymap for headers regions */
- wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Header", 0, 0);
- WM_event_add_keymap_handler(handlers, keymap);
- }
}
void ED_area_update_region_sizes(wmWindowManager *wm, wmWindow *win, ScrArea *area)
@@ -1582,7 +1610,7 @@ void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
if (sa->type->init)
sa->type->init(wm, sa);
- /* clear all azones, add the area triange widgets */
+ /* clear all azones, add the area triangle widgets */
area_azone_initialize(win, screen, sa);
/* region windows, default and own handlers */
@@ -1648,7 +1676,7 @@ void ED_region_cursor_set(wmWindow *win, ScrArea *sa, ARegion *ar)
}
}
-/* for use after changing visiblity of regions */
+/* for use after changing visibility of regions */
void ED_region_visibility_change_update(bContext *C, ARegion *ar)
{
ScrArea *sa = CTX_wm_area(C);
@@ -2010,14 +2038,21 @@ static void ed_panel_draw(
short panelContext;
/* panel context can either be toolbar region or normal panels region */
- if (ar->regiontype == RGN_TYPE_TOOLS)
+ if (pt->flag & PNL_LAYOUT_VERT_BAR) {
+ panelContext = UI_LAYOUT_VERT_BAR;
+ }
+ else if (ar->regiontype == RGN_TYPE_TOOLS) {
panelContext = UI_LAYOUT_TOOLBAR;
- else
+ }
+ else {
panelContext = UI_LAYOUT_PANEL;
+ }
panel->layout = UI_block_layout(
block, UI_LAYOUT_VERTICAL, panelContext,
- style->panelspace, 0, w - 2 * style->panelspace, em, 0, style);
+ (pt->flag & PNL_LAYOUT_VERT_BAR) ? 0 : style->panelspace, 0,
+ (pt->flag & PNL_LAYOUT_VERT_BAR) ? 0 : w - 2 * style->panelspace,
+ em, 0, style);
pt->draw(C, panel);
@@ -2066,7 +2101,7 @@ void ED_region_panels_layout_ex(
int scroll;
/* XXX, should use some better check? */
- bool use_category_tabs = (ELEM(ar->regiontype, RGN_TYPE_TOOLS, RGN_TYPE_UI));
+ bool use_category_tabs = (1 << ar->regiontype) & RGN_TYPE_HAS_CATEGORY_MASK;
/* offset panels for small vertical tab area */
const char *category = NULL;
const int category_tabs_width = UI_PANEL_CATEGORY_MARGIN_WIDTH;
@@ -2279,8 +2314,15 @@ void ED_region_panels_draw(const bContext *C, ARegion *ar)
}
/* scrollers */
+ const rcti *mask = NULL;
+ rcti mask_buf;
+ if (ar->runtime.category && (ar->alignment == RGN_ALIGN_RIGHT)) {
+ UI_view2d_mask_from_win(v2d, &mask_buf);
+ mask_buf.xmax -= UI_PANEL_CATEGORY_MARGIN_WIDTH;
+ mask = &mask_buf;
+ }
View2DScrollers *scrollers = UI_view2d_scrollers_calc(
- C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
+ C, v2d, mask, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);
}
@@ -2339,6 +2381,10 @@ void ED_region_header_layout(const bContext *C, ARegion *ar)
/* draw all headers types */
for (ht = ar->type->headertypes.first; ht; ht = ht->next) {
+ if (ht->poll && !ht->poll(C, ht)) {
+ continue;
+ }
+
block = UI_block_begin(C, ar, ht->idname, UI_EMBOSS);
layout = UI_block_layout(block, UI_LAYOUT_HORIZONTAL, UI_LAYOUT_HEADER, xco, yco, buttony, 1, 0, style);
@@ -2350,6 +2396,9 @@ void ED_region_header_layout(const bContext *C, ARegion *ar)
header.type = ht;
header.layout = layout;
ht->draw(C, &header);
+ if (ht->next) {
+ uiItemS(layout);
+ }
/* for view2d */
xco = uiLayoutGetWidth(layout);
@@ -2855,13 +2904,13 @@ void ED_region_grid_draw(ARegion *ar, float zoomx, float zoomy)
/* the fine resolution level */
for (int i = 0; i < count_fine; i++) {
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x1, y1 * (1.0f - fac) + y2 * fac);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x2, y1 * (1.0f - fac) + y2 * fac);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x1 * (1.0f - fac) + x2 * fac, y1);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x1 * (1.0f - fac) + x2 * fac, y2);
fac += gridstep;
}
@@ -2872,13 +2921,13 @@ void ED_region_grid_draw(ARegion *ar, float zoomx, float zoomy)
/* the large resolution level */
for (int i = 0; i < count_large; i++) {
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x1, y1 * (1.0f - fac) + y2 * fac);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x2, y1 * (1.0f - fac) + y2 * fac);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x1 * (1.0f - fac) + x2 * fac, y1);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x1 * (1.0f - fac) + x2 * fac, y2);
fac += 4.0f * gridstep;
}
@@ -3004,7 +3053,7 @@ void ED_region_message_subscribe(
WM_gizmomap_message_subscribe(C, ar->gizmo_map, ar, mbus);
}
- if (BLI_listbase_is_empty(&ar->uiblocks)) {
+ if (!BLI_listbase_is_empty(&ar->uiblocks)) {
UI_region_message_subscribe(ar, mbus);
}
diff --git a/source/blender/editors/screen/area_utils.c b/source/blender/editors/screen/area_utils.c
new file mode 100644
index 00000000000..53e2f96d6c4
--- /dev/null
+++ b/source/blender/editors/screen/area_utils.c
@@ -0,0 +1,89 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/screen/area_utils.c
+ * \ingroup edscr
+ *
+ * Helper functions for area/region API.
+ */
+
+#include "DNA_userdef_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_context.h"
+
+#include "RNA_access.h"
+#include "RNA_types.h"
+
+#include "WM_api.h"
+#include "WM_message.h"
+
+#include "ED_screen.h"
+
+#include "UI_interface.h"
+
+/* -------------------------------------------------------------------- */
+/** \name Generic Tool System Region Callbacks
+ * \{ */
+
+/**
+ * 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(sa), struct ARegion *ar,
+ struct wmMsgBus *mbus)
+{
+ wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
+ .owner = ar,
+ .user_data = ar,
+ .notify = ED_region_do_msg_notify_tag_redraw,
+ };
+ WM_msg_subscribe_rna_anon_prop(mbus, WorkSpace, tools, &msg_sub_value_region_tag_redraw);
+}
+
+/**
+ * Callback for #ARegionType.snap_size
+ */
+int ED_region_generic_tools_region_snap_size(const ARegion *ar, int size, int axis)
+{
+ if (axis == 0) {
+ /* Note, this depends on the icon size: see #ICON_DEFAULT_HEIGHT_TOOLBAR. */
+ const float snap_units[] = {2 + 0.8f, 4 + 0.8f};
+ const float aspect = BLI_rctf_size_x(&ar->v2d.cur) / (BLI_rcti_size_x(&ar->v2d.mask) + 1);
+ int best_diff = INT_MAX;
+ int best_size = size;
+ for (uint i = 0; i < ARRAY_SIZE(snap_units); i += 1) {
+ const int test_size = (snap_units[i] * U.widget_unit) / (UI_DPI_FAC * aspect);
+ const int test_diff = ABS(test_size - size);
+ if (test_diff < best_diff) {
+ best_size = test_size;
+ best_diff = test_diff;
+ }
+ }
+ return best_size;
+ }
+ return size;
+}
+
+/** \} */
diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c
index b1bda08e9a5..728df79fbbd 100644
--- a/source/blender/editors/screen/glutil.c
+++ b/source/blender/editors/screen/glutil.c
@@ -297,16 +297,16 @@ void immDrawPixelsTexScaled_clipping(IMMDrawPixelsTexState *state,
}
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texco, (float)(0 + offset_left) / tex_w, (float)(0 + offset_bot) / tex_h);
+ immAttr2f(texco, (float)(0 + offset_left) / tex_w, (float)(0 + offset_bot) / tex_h);
immVertex2f(pos, rast_x + (float)offset_left * xzoom, rast_y + (float)offset_bot * yzoom);
- immAttrib2f(texco, (float)(subpart_w - offset_right) / tex_w, (float)(0 + offset_bot) / tex_h);
+ immAttr2f(texco, (float)(subpart_w - offset_right) / tex_w, (float)(0 + offset_bot) / tex_h);
immVertex2f(pos, rast_x + (float)(subpart_w - offset_right) * xzoom * scaleX, rast_y + (float)offset_bot * yzoom);
- immAttrib2f(texco, (float)(subpart_w - offset_right) / tex_w, (float)(subpart_h - offset_top) / tex_h);
+ immAttr2f(texco, (float)(subpart_w - offset_right) / tex_w, (float)(subpart_h - offset_top) / tex_h);
immVertex2f(pos, rast_x + (float)(subpart_w - offset_right) * xzoom * scaleX, rast_y + (float)(subpart_h - offset_top) * yzoom * scaleY);
- immAttrib2f(texco, (float)(0 + offset_left) / tex_w, (float)(subpart_h - offset_top) / tex_h);
+ immAttr2f(texco, (float)(0 + offset_left) / tex_w, (float)(subpart_h - offset_top) / tex_h);
immVertex2f(pos, rast_x + (float)offset_left * xzoom, rast_y + (float)(subpart_h - offset_top) * yzoom * scaleY);
immEnd();
}
diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c
index 5a520540301..1cfe34c86a1 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -65,6 +65,7 @@
#include "ED_armature.h"
#include "ED_gpencil.h"
#include "ED_anim_api.h"
+#include "ED_uvedit.h"
#include "WM_api.h"
#include "UI_interface.h"
@@ -77,10 +78,11 @@ const char *screen_context_dir[] = {
"editable_objects", "editable_bases",
"selected_editable_objects", "selected_editable_bases",
"visible_bones", "editable_bones", "selected_bones", "selected_editable_bones",
- "visible_pose_bones", "selected_pose_bones", "active_bone", "active_pose_bone",
+ "visible_pose_bones", "selected_pose_bones", "selected_pose_bones_from_active_object",
+ "active_bone", "active_pose_bone",
"active_base", "active_object", "object", "edit_object",
"sculpt_object", "vertex_paint_object", "weight_paint_object",
- "image_paint_object", "particle_edit_object",
+ "image_paint_object", "particle_edit_object", "uv_sculpt_object",
"sequences", "selected_sequences", "selected_editable_sequences", /* sequencer */
"gpencil_data", "gpencil_data_owner", /* grease pencil data */
"visible_gpencil_layers", "editable_gpencil_layers", "editable_gpencil_strokes",
@@ -346,6 +348,23 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
return 1;
}
}
+ else if (CTX_data_equals(member, "selected_pose_bones_from_active_object")) {
+ Object *obpose = BKE_object_pose_armature_get(obact);
+ if (obpose && obpose->pose && obpose->data) {
+ if (obpose != obact) {
+ FOREACH_PCHAN_SELECTED_IN_OBJECT_BEGIN (obpose, pchan) {
+ CTX_data_list_add(result, &obpose->id, &RNA_PoseBone, pchan);
+ } FOREACH_PCHAN_SELECTED_IN_OBJECT_END;
+ }
+ else if (obact->mode & OB_MODE_POSE) {
+ FOREACH_PCHAN_SELECTED_IN_OBJECT_BEGIN (obact, pchan) {
+ CTX_data_list_add(result, &obact->id, &RNA_PoseBone, pchan);
+ } FOREACH_PCHAN_SELECTED_IN_OBJECT_END;
+ }
+ CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
+ return 1;
+ }
+ }
else if (CTX_data_equals(member, "active_bone")) {
if (obact && obact->type == OB_ARMATURE) {
bArmature *arm = obact->data;
@@ -428,6 +447,23 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
return 1;
}
+ else if (CTX_data_equals(member, "uv_sculpt_object")) {
+ /* TODO(campbell): most likely we change rules for uv_sculpt. */
+ if (obact && (obact->mode & OB_MODE_EDIT)) {
+ const ToolSettings *ts = scene->toolsettings;
+ if (ts->use_uv_sculpt) {
+ if (ED_uvedit_test(obedit)) {
+ WorkSpace *workspace = CTX_wm_workspace(C);
+ if ((workspace->tools_space_type == SPACE_IMAGE) &&
+ (workspace->tools_mode == SI_MODE_UV))
+ {
+ CTX_data_id_pointer_set(result, &obact->id);
+ }
+ }
+ }
+ }
+ return 1;
+ }
else if (CTX_data_equals(member, "sequences")) {
Editing *ed = BKE_sequencer_editing_get(scene, false);
if (ed) {
@@ -506,7 +542,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
}
}
else if (CTX_data_equals(member, "active_gpencil_brush")) {
- Brush *brush = BKE_brush_getactive_gpencil(scene->toolsettings);
+ Brush *brush = BKE_paint_brush(&scene->toolsettings->gp_paint->paint);
if (brush) {
CTX_data_pointer_set(result, &scene->id, &RNA_Brush, brush);
@@ -561,7 +597,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
else if (CTX_data_equals(member, "editable_gpencil_strokes")) {
/* XXX: see comment for gpencil_data case... */
bGPdata *gpd = ED_gpencil_data_get_active_direct((ID *)sc, sa, scene, obact);
- bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+ const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
if (gpd) {
bGPDlayer *gpl;
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index e20668e417f..b4c639e51b6 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -43,9 +43,9 @@
#include "BLI_utildefines.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "BKE_icons.h"
#include "BKE_image.h"
-#include "BKE_global.h"
#include "BKE_layer.h"
#include "BKE_library.h"
#include "BKE_library_remap.h"
@@ -325,7 +325,7 @@ int area_getorientation(ScrArea *sa, ScrArea *sb)
}
/* Helper function to join 2 areas, it has a return value, 0=failed 1=success
- * used by the split, join operators
+ * used by the split, join operators
*/
int screen_area_join(bContext *C, bScreen *scr, ScrArea *sa1, ScrArea *sa2)
{
@@ -680,7 +680,7 @@ void ED_screen_set_active_region(bContext *C, wmWindow *win, const int xy[2])
}
}
- /* cursors, for time being set always on edges, otherwise aregion doesnt switch */
+ /* cursors, for time being set always on edges, otherwise aregion doesn't switch */
if (scr->active_region == NULL) {
screen_cursor_set(win, xy);
}
@@ -1251,7 +1251,7 @@ ScrArea *ED_screen_state_toggle(bContext *C, wmWindow *win, ScrArea *sa, const s
for (ar = newa->regionbase.first; ar; ar = ar->next) {
ar->flagfullscreen = ar->flag;
- if (ELEM(ar->regiontype, RGN_TYPE_UI, RGN_TYPE_HEADER, RGN_TYPE_TOOLS)) {
+ if (ELEM(ar->regiontype, RGN_TYPE_UI, RGN_TYPE_HEADER, RGN_TYPE_TOOLS, RGN_TYPE_NAV_BAR)) {
ar->flag |= RGN_FLAG_HIDDEN;
}
}
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 4acffb6eca7..6a9f1e13aea 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -55,17 +55,18 @@
#include "BKE_context.h"
#include "BKE_customdata.h"
+#include "BKE_editmesh.h"
#include "BKE_fcurve.h"
#include "BKE_global.h"
#include "BKE_icons.h"
+#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_mask.h"
#include "BKE_object.h"
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
-#include "BKE_editmesh.h"
#include "BKE_sound.h"
-#include "BKE_mask.h"
#include "BKE_workspace.h"
#include "WM_api.h"
@@ -740,8 +741,16 @@ static AZone *area_actionzone_refresh_xy(ScrArea *sa, const int xy[2], const boo
else if (az->type == AZONE_REGION_SCROLL) {
ARegion *ar = az->ar;
View2D *v2d = &ar->v2d;
- const short isect_value = UI_view2d_mouse_in_scrollers(ar, v2d, xy[0], xy[1]);
- if (test_only) {
+ int scroll_flag = 0;
+ const int isect_value = UI_view2d_mouse_in_scrollers_ex(ar, v2d, xy[0], xy[1], &scroll_flag);
+
+ /* Check if we even have scroll bars. */
+ if (((az->direction == AZ_SCROLL_HOR) && !(scroll_flag & V2D_SCROLL_HORIZONTAL)) ||
+ ((az->direction == AZ_SCROLL_VERT) && !(scroll_flag & V2D_SCROLL_VERTICAL)))
+ {
+ /* no scrollbars, do nothing. */
+ }
+ else if (test_only) {
if (isect_value != 0) {
break;
}
@@ -2627,10 +2636,10 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op)
}
/* populate tree with keyframe nodes */
- scene_to_keylist(&ads, scene, &keys, NULL);
+ scene_to_keylist(&ads, scene, &keys, 0);
if (ob) {
- ob_to_keylist(&ads, ob, &keys, NULL);
+ ob_to_keylist(&ads, ob, &keys, 0);
if (ob->type == OB_GPENCIL) {
const bool active = !(scene->flag & SCE_KEYS_NO_SELONLY);
@@ -2646,9 +2655,6 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op)
}
}
- /* build linked-list for searching */
- BLI_dlrbTree_linkedlist_sync(&keys);
-
/* find matching keyframe in the right direction */
if (next)
ak = (ActKeyColumn *)BLI_dlrbTree_search_next(&keys, compare_ak_cfraPtr, &cfra);
@@ -3588,6 +3594,7 @@ static int region_flip_exec(bContext *C, wmOperator *UNUSED(op))
ar->alignment = RGN_ALIGN_LEFT;
ED_area_tag_redraw(CTX_wm_area(C));
+ WM_event_add_mousemove(C);
WM_event_add_notifier(C, NC_SCREEN | NA_EDITED, NULL);
return OPERATOR_FINISHED;
@@ -3598,7 +3605,7 @@ static bool region_flip_poll(bContext *C)
ScrArea *area = CTX_wm_area(C);
/* don't flip anything around in topbar */
- if (area->spacetype == SPACE_TOPBAR) {
+ if (area && area->spacetype == SPACE_TOPBAR) {
CTX_wm_operator_poll_msg_set(C, "Flipping regions in the Top-bar is not allowed");
return 0;
}
@@ -3759,6 +3766,23 @@ static void SCREEN_OT_header_context_menu(wmOperatorType *ot)
/** \} */
/* -------------------------------------------------------------------- */
+/** \name Navigation Bar Tools Menu
+ * \{ */
+
+void ED_screens_navigation_bar_tools_menu_create(bContext *C, uiLayout *layout, void *UNUSED(arg))
+{
+ const ARegion *ar = CTX_wm_region(C);
+ const char *but_flip_str = (ar->alignment == RGN_ALIGN_LEFT) ? IFACE_("Flip to Right") : IFACE_("Flip to Left");
+
+ /* default is WM_OP_INVOKE_REGION_WIN, which we don't want here. */
+ uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT);
+
+ uiItemO(layout, but_flip_str, ICON_NONE, "SCREEN_OT_region_flip");
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
/** \name Animation Step Operator
*
* Animation Step.
@@ -4206,7 +4230,7 @@ static void SCREEN_OT_animation_cancel(wmOperatorType *ot)
/** \} */
/* -------------------------------------------------------------------- */
-/** \name Border Select Operator (Template)
+/** \name Box Select Operator (Template)
* \{ */
/* operator state vars used: (added by default WM callbacks)
@@ -4228,31 +4252,31 @@ static void SCREEN_OT_animation_cancel(wmOperatorType *ot)
* poll() has to be filled in by user for context
*/
#if 0
-static int border_select_exec(bContext *C, wmOperator *op)
+static int box_select_exec(bContext *C, wmOperator *op)
{
int event_type = RNA_int_get(op->ptr, "event_type");
if (event_type == LEFTMOUSE)
- printf("border select do select\n");
+ printf("box select do select\n");
else if (event_type == RIGHTMOUSE)
- printf("border select deselect\n");
+ printf("box select deselect\n");
else
- printf("border select do something\n");
+ printf("box select do something\n");
return 1;
}
-static void SCREEN_OT_border_select(wmOperatorType *ot)
+static void SCREEN_OT_box_select(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
- ot->idname = "SCREEN_OT_border_select";
+ ot->name = "Box Select";
+ ot->idname = "SCREEN_OT_box_select";
/* api callbacks */
- ot->exec = border_select_exec;
- ot->invoke = WM_gesture_border_invoke;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->exec = box_select_exec;
+ ot->invoke = WM_gesture_box_invoke;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = ED_operator_areaactive;
@@ -4472,7 +4496,7 @@ static void SCREEN_OT_delete(wmOperatorType *ot)
/* implementation note: a disappearing region needs at least 1 last draw with 100% backbuffer
* texture over it- then triple buffer will clear it entirely.
- * This because flag RGN_HIDDEN is set in end - region doesnt draw at all then */
+ * This because flag RGN_HIDDEN is set in end - region doesn't draw at all then */
typedef struct RegionAlphaInfo {
ScrArea *sa;
@@ -4480,8 +4504,8 @@ typedef struct RegionAlphaInfo {
int hidden;
} RegionAlphaInfo;
-#define TIMEOUT 0.2f
-#define TIMESTEP 0.04f
+#define TIMEOUT 0.1f
+#define TIMESTEP (1.0f / 60.0f)
float ED_region_blend_alpha(ARegion *ar)
{
@@ -4616,12 +4640,6 @@ static void SCREEN_OT_region_blend(wmOperatorType *ot)
/** \name Space Context Cycle Operator
* \{ */
-/* SCREEN_OT_space_context_cycle direction */
-enum {
- SPACE_CONTEXT_CYCLE_PREV,
- SPACE_CONTEXT_CYCLE_NEXT,
-};
-
static const EnumPropertyItem space_context_cycle_direction[] = {
{SPACE_CONTEXT_CYCLE_PREV, "PREV", 0, "Previous", ""},
{SPACE_CONTEXT_CYCLE_NEXT, "NEXT", 0, "Next", ""},
@@ -4712,15 +4730,37 @@ static int space_workspace_cycle_invoke(bContext *C, wmOperator *op, const wmEve
Main *bmain = CTX_data_main(C);
const int direction = RNA_enum_get(op->ptr, "direction");
WorkSpace *workspace_src = WM_window_get_active_workspace(win);
- WorkSpace *workspace_dst = (direction == SPACE_CONTEXT_CYCLE_PREV) ? workspace_src->id.prev : workspace_src->id.next;
+ WorkSpace *workspace_dst = NULL;
+
+ ListBase ordered;
+ BKE_id_ordered_list(&ordered, &bmain->workspaces);
+
+ for (LinkData *link = ordered.first; link; link = link->next) {
+ if (link->data == workspace_src) {
+ if (direction == SPACE_CONTEXT_CYCLE_PREV) {
+ workspace_dst = (link->prev) ? link->prev->data : NULL;
+ }
+ else {
+ workspace_dst = (link->next) ? link->next->data : NULL;
+ }
+ }
+ }
+
if (workspace_dst == NULL) {
- workspace_dst = (direction == SPACE_CONTEXT_CYCLE_PREV) ? bmain->workspaces.last : bmain->workspaces.first;
+ LinkData *link = (direction == SPACE_CONTEXT_CYCLE_PREV) ? ordered.last : ordered.first;
+ workspace_dst = link->data;
}
- if (workspace_src != workspace_dst) {
- win->workspace_hook->temp_workspace_store = workspace_dst;
- WM_event_add_notifier(C, NC_SCREEN | ND_WORKSPACE_SET, workspace_dst);
- win->workspace_hook->temp_workspace_store = NULL;
+
+ BLI_freelistN(&ordered);
+
+ if (workspace_src == workspace_dst) {
+ return OPERATOR_CANCELLED;
}
+
+ win->workspace_hook->temp_workspace_store = workspace_dst;
+ WM_event_add_notifier(C, NC_SCREEN | ND_WORKSPACE_SET, workspace_dst);
+ win->workspace_hook->temp_workspace_store = NULL;
+
return OPERATOR_FINISHED;
}
@@ -4733,7 +4773,7 @@ static void SCREEN_OT_workspace_cycle(wmOperatorType *ot)
/* api callbacks */
ot->invoke = space_workspace_cycle_invoke;
- ot->poll = ED_operator_screenactive;;
+ ot->poll = ED_operator_screenactive;
ot->flag = 0;
@@ -4824,19 +4864,11 @@ static void keymap_modal_set(wmKeyConfig *keyconf)
/* Standard Modal keymap ------------------------------------------------ */
keymap = WM_modalkeymap_add(keyconf, "Standard Modal Map", modal_items);
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, KM_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_ANY, KM_ANY, 0, KM_MODAL_APPLY);
- WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, KM_MODAL_APPLY);
- WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, KM_MODAL_APPLY);
-
- WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, KM_MODAL_SNAP_ON);
- WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, KM_MODAL_SNAP_OFF);
-
WM_modalkeymap_assign(keymap, "SCREEN_OT_area_move");
}
-static bool open_file_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event), const char **UNUSED(tooltip))
+static bool blend_file_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event), const char **UNUSED(tooltip))
{
if (drag->type == WM_DRAG_PATH) {
if (drag->icon == ICON_FILE_BLEND)
@@ -4845,11 +4877,10 @@ static bool open_file_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent
return 0;
}
-static void open_file_drop_copy(wmDrag *drag, wmDropBox *drop)
+static void blend_file_drop_copy(wmDrag *drag, wmDropBox *drop)
{
/* copy drag path to properties */
RNA_string_set(drop->ptr, "filepath", drag->path);
- drop->opcontext = WM_OP_EXEC_DEFAULT;
}
@@ -4857,186 +4888,23 @@ static void open_file_drop_copy(wmDrag *drag, wmDropBox *drop)
void ED_keymap_screen(wmKeyConfig *keyconf)
{
ListBase *lb;
- wmKeyMap *keymap;
- wmKeyMapItem *kmi;
/* Screen Editing ------------------------------------------------ */
- keymap = WM_keymap_ensure(keyconf, "Screen Editing", 0, 0);
-
- RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "modifier", 0);
- RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "modifier", 1);
- RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "modifier", 2);
-
- /* screen tools */
- WM_keymap_verify_item(keymap, "SCREEN_OT_area_split", EVT_ACTIONZONE_AREA, 0, 0, 0);
- WM_keymap_verify_item(keymap, "SCREEN_OT_area_join", EVT_ACTIONZONE_AREA, 0, 0, 0);
- WM_keymap_verify_item(keymap, "SCREEN_OT_area_dupli", EVT_ACTIONZONE_AREA, 0, KM_SHIFT, 0);
- WM_keymap_verify_item(keymap, "SCREEN_OT_area_swap", EVT_ACTIONZONE_AREA, 0, KM_CTRL, 0);
- WM_keymap_verify_item(keymap, "SCREEN_OT_region_scale", EVT_ACTIONZONE_REGION, 0, 0, 0);
- kmi = WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", EVT_ACTIONZONE_FULLSCREEN, 0, 0, 0);
- RNA_boolean_set(kmi->ptr, "use_hide_panels", true);
- /* area move after action zones */
- WM_keymap_verify_item(keymap, "SCREEN_OT_area_move", LEFTMOUSE, KM_PRESS, 0, 0);
-
- WM_keymap_verify_item(keymap, "SCREEN_OT_area_options", RIGHTMOUSE, KM_PRESS, 0, 0);
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "SCREEN_OT_header", F9KEY, KM_PRESS, KM_ALT, 0);
-#endif
+ WM_keymap_ensure(keyconf, "Screen Editing", 0, 0);
/* Header Editing ------------------------------------------------ */
/* note: this is only used when the cursor is inside the header */
- keymap = WM_keymap_ensure(keyconf, "Header", 0, 0);
-
- WM_keymap_add_item(keymap, "SCREEN_OT_header_context_menu", RIGHTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_ensure(keyconf, "Header", 0, 0);
/* Screen General ------------------------------------------------ */
- keymap = WM_keymap_ensure(keyconf, "Screen", 0, 0);
-
- /* standard timers */
- WM_keymap_add_item(keymap, "SCREEN_OT_animation_step", TIMER0, KM_ANY, KM_ANY, 0);
- WM_keymap_add_item(keymap, "SCREEN_OT_region_blend", TIMERREGION, KM_ANY, KM_ANY, 0);
-
-#ifdef USE_WM_KEYMAP_27X
- RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_screen_set", RIGHTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "delta", 1);
- RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_screen_set", LEFTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "delta", -1);
-#endif
- WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", SPACEKEY, KM_PRESS, KM_CTRL, 0);
- kmi = WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", SPACEKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "use_hide_panels", true);
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "SCREEN_OT_screenshot", F3KEY, KM_PRESS, KM_CTRL, 0);
-#endif
-
- kmi = WM_keymap_add_item(keymap, "SCREEN_OT_space_context_cycle", TABKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "direction", SPACE_CONTEXT_CYCLE_NEXT);
- kmi = WM_keymap_add_item(keymap, "SCREEN_OT_space_context_cycle", TABKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "direction", SPACE_CONTEXT_CYCLE_PREV);
-
- kmi = WM_keymap_add_item(keymap, "SCREEN_OT_workspace_cycle", PAGEDOWNKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "direction", SPACE_CONTEXT_CYCLE_NEXT);
- kmi = WM_keymap_add_item(keymap, "SCREEN_OT_workspace_cycle", PAGEUPKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "direction", SPACE_CONTEXT_CYCLE_PREV);
-
- /* tests */
- WM_keymap_add_item(keymap, "SCREEN_OT_region_quadview", QKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "SCREEN_OT_repeat_last", RKEY, KM_PRESS, KM_SHIFT, 0);
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_verify_item(keymap, "SCREEN_OT_repeat_history", RKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- WM_keymap_verify_item(keymap, "SCREEN_OT_region_flip", F5KEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "SCREEN_OT_redo_last", F6KEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "SCRIPT_OT_reload", F8KEY, KM_PRESS, 0, 0);
-#endif
-
- /* files */
- WM_keymap_add_item(keymap, "FILE_OT_execute", RETKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "FILE_OT_execute", PADENTER, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "FILE_OT_cancel", ESCKEY, KM_PRESS, 0, 0);
-
- /* undo */
-#ifdef __APPLE__
- WM_keymap_add_item(keymap, "ED_OT_undo", ZKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "ED_OT_redo", ZKEY, KM_PRESS, KM_SHIFT | KM_OSKEY, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "ED_OT_undo_history", ZKEY, KM_PRESS, KM_ALT | KM_OSKEY, 0);
-#endif
-#endif
- WM_keymap_add_item(keymap, "ED_OT_undo", ZKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "ED_OT_redo", ZKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "ED_OT_undo_history", ZKEY, KM_PRESS, KM_ALT | KM_CTRL, 0);
-#endif
-
- /* render */
- kmi = WM_keymap_add_item(keymap, "RENDER_OT_render", F12KEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "use_viewport", true);
- kmi = WM_keymap_add_item(keymap, "RENDER_OT_render", F12KEY, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "animation", true);
- RNA_boolean_set(kmi->ptr, "use_viewport", true);
- WM_keymap_add_item(keymap, "RENDER_OT_view_cancel", ESCKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "RENDER_OT_view_show", F11KEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "RENDER_OT_play_rendered_anim", F11KEY, KM_PRESS, KM_CTRL, 0);
-
- /* user prefs */
-#ifdef __APPLE__
- WM_keymap_add_item(keymap, "SCREEN_OT_userpref_show", COMMAKEY, KM_PRESS, KM_OSKEY, 0);
-#endif
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "SCREEN_OT_userpref_show", UKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
-#endif
-
+ WM_keymap_ensure(keyconf, "Screen", 0, 0);
/* Anim Playback ------------------------------------------------ */
- keymap = WM_keymap_ensure(keyconf, "Frames", 0, 0);
-
- /* frame offsets */
-#ifdef USE_WM_KEYMAP_27X
- RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", UPARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "delta", 10);
- RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", DOWNARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "delta", -10);
-#endif
- RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", LEFTARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", -1);
- RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", RIGHTARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", 1);
-
-#ifdef USE_WM_KEYMAP_27X
- RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", WHEELDOWNMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "delta", 1);
- RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", WHEELUPMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "delta", -1);
-
- RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", UPARROWKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0)->ptr, "end", true);
- RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", DOWNARROWKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0)->ptr, "end", false);
-#endif
- RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", true);
- RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", false);
-
- kmi = WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", UPARROWKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "next", true);
-
- kmi = WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", DOWNARROWKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "next", false);
-
- kmi = WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", MEDIALAST, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "next", true);
-
- kmi = WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", MEDIAFIRST, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "next", false);
-
-
-#ifdef USE_WM_KEYMAP_27X
- /* play (forward and backwards) */
- WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(
- WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT | KM_SHIFT, 0)->ptr,
- "reverse", true);
-#else
- /* play (forward and backwards) */
- WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", SPACEKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(
- WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", SPACEKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0)->ptr,
- "reverse", true);
-#endif
- WM_keymap_add_item(keymap, "SCREEN_OT_animation_cancel", ESCKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", MEDIAPLAY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "SCREEN_OT_animation_cancel", MEDIASTOP, KM_PRESS, 0, 0);
-
- /* Alternative keys for animation and sequencer playing */
-#if 0 /* XXX: disabled for restoring later... bad implementation */
- keymap = WM_keymap_ensure(keyconf, "Frames", 0, 0);
- kmi = WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", RIGHTARROWKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "cycle_speed", true);
-
- kmi = WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", LEFTARROWKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "reverse", true);
- RNA_boolean_set(kmi->ptr, "cycle_speed", true);
-
- WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", DOWNARROWKEY, KM_PRESS, KM_ALT, 0);
-#endif
+ WM_keymap_ensure(keyconf, "Frames", 0, 0);
/* dropbox for entire window */
lb = WM_dropboxmap_find("Window", 0, 0);
- WM_dropbox_add(lb, "WM_OT_open_mainfile", open_file_drop_poll, open_file_drop_copy);
+ 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);
keymap_modal_set(keyconf);
diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c
index 9c0c59a7160..8e3b32941e5 100644
--- a/source/blender/editors/screen/screendump.c
+++ b/source/blender/editors/screen/screendump.c
@@ -46,8 +46,8 @@
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_main.h"
#include "BKE_image.h"
+#include "BKE_main.h"
#include "BKE_report.h"
#include "BIF_gl.h"
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c
index 77fc20a98a5..6c836c9fc08 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@ -35,9 +35,9 @@
#include "BKE_blendfile.h"
#include "BKE_context.h"
#include "BKE_idcode.h"
-#include "BKE_main.h"
#include "BKE_layer.h"
#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
@@ -272,6 +272,11 @@ static WorkSpace *workspace_context_get(bContext *C)
return WM_window_get_active_workspace(win);
}
+static bool workspace_context_poll(bContext *C)
+{
+ return workspace_context_get(C) != NULL;
+}
+
static int workspace_new_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain = CTX_data_main(C);
@@ -293,8 +298,8 @@ static void WORKSPACE_OT_duplicate(wmOperatorType *ot)
ot->idname = "WORKSPACE_OT_duplicate";
/* api callbacks */
+ ot->poll = workspace_context_poll;
ot->exec = workspace_new_exec;
- ot->poll = WM_operator_winactive;
}
static int workspace_delete_exec(bContext *C, wmOperator *UNUSED(op))
@@ -313,6 +318,7 @@ static void WORKSPACE_OT_delete(wmOperatorType *ot)
ot->idname = "WORKSPACE_OT_delete";
/* api callbacks */
+ ot->poll = workspace_context_poll;
ot->exec = workspace_delete_exec;
}
@@ -343,20 +349,23 @@ static int workspace_append(bContext *C, const char *directory, const char *idna
static int workspace_append_activate_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
- char idname[MAX_ID_NAME - 2], directory[FILE_MAX];
+ char idname[MAX_ID_NAME - 2], filepath[FILE_MAX];
if (!RNA_struct_property_is_set(op->ptr, "idname") ||
- !RNA_struct_property_is_set(op->ptr, "directory"))
+ !RNA_struct_property_is_set(op->ptr, "filepath"))
{
return OPERATOR_CANCELLED;
}
RNA_string_get(op->ptr, "idname", idname);
- RNA_string_get(op->ptr, "directory", directory);
+ RNA_string_get(op->ptr, "filepath", filepath);
- if (workspace_append(C, directory, idname) != OPERATOR_CANCELLED) {
+ if (workspace_append(C, filepath, idname) != OPERATOR_CANCELLED) {
WorkSpace *appended_workspace = BLI_findstring(&bmain->workspaces, idname, offsetof(ID, name) + 2);
-
BLI_assert(appended_workspace != NULL);
+
+ /* Reorder to last position. */
+ BKE_id_reorder(&bmain->workspaces, &appended_workspace->id, NULL, true);
+
/* Changing workspace changes context. Do delayed! */
WM_event_add_notifier(C, NC_SCREEN | ND_WORKSPACE_SET, appended_workspace);
@@ -379,37 +388,39 @@ static void WORKSPACE_OT_append_activate(wmOperatorType *ot)
RNA_def_string(ot->srna, "idname", NULL, MAX_ID_NAME - 2, "Identifier",
"Name of the workspace to append and activate");
- RNA_def_string(ot->srna, "directory", NULL, FILE_MAX, "Directory",
+ RNA_def_string(ot->srna, "filepath", NULL, FILE_MAX, "Filepath",
"Path to the library");
}
-static void workspace_config_file_path_from_folder_id(
- const Main *bmain, int folder_id, char *r_path)
+static WorkspaceConfigFileData *workspace_config_file_read(const char *app_template)
{
- const char *app_template = U.app_template[0] ? U.app_template : NULL;
- const char * const cfgdir = BKE_appdir_folder_id(folder_id, app_template);
+ const char *cfgdir = BKE_appdir_folder_id(BLENDER_USER_CONFIG, app_template);
+ char startup_file_path[FILE_MAX] = {0};
if (cfgdir) {
- BLI_make_file_string(bmain->name, r_path, cfgdir, BLENDER_STARTUP_FILE);
- }
- else {
- r_path[0] = '\0';
+ BLI_join_dirfile(startup_file_path, sizeof(startup_file_path), cfgdir, BLENDER_STARTUP_FILE);
}
+
+ bool has_path = BLI_exists(startup_file_path);
+ return (has_path) ? BKE_blendfile_workspace_config_read(startup_file_path, NULL, 0, NULL) : NULL;
}
-ATTR_NONNULL(1)
-static WorkspaceConfigFileData *workspace_config_file_read(
- const Main *bmain, ReportList *reports)
+static WorkspaceConfigFileData *workspace_system_file_read(const char *app_template)
{
- char workspace_config_path[FILE_MAX];
- bool has_path = false;
+ if (app_template == NULL) {
+ return BKE_blendfile_workspace_config_read(NULL, datatoc_startup_blend, datatoc_startup_blend_size, NULL);
+ }
- workspace_config_file_path_from_folder_id(bmain, BLENDER_USER_CONFIG, workspace_config_path);
- if (BLI_exists(workspace_config_path)) {
- has_path = true;
+ char template_dir[FILE_MAX];
+ if (!BKE_appdir_app_template_id_search(app_template, template_dir, sizeof(template_dir))) {
+ return NULL;
}
- return (has_path) ? BKE_blendfile_workspace_config_read(workspace_config_path, NULL, 0, reports) : NULL;
+ char startup_file_path[FILE_MAX];
+ BLI_join_dirfile(startup_file_path, sizeof(startup_file_path), template_dir, BLENDER_STARTUP_FILE);
+
+ bool has_path = BLI_exists(startup_file_path);
+ return (has_path) ? BKE_blendfile_workspace_config_read(startup_file_path, NULL, 0, NULL) : NULL;
}
static void workspace_append_button(
@@ -432,32 +443,28 @@ static void workspace_append_button(
layout, ot_append, workspace->id.name + 2, ICON_NONE, NULL,
WM_OP_EXEC_DEFAULT, 0, &opptr);
RNA_string_set(&opptr, "idname", id->name + 2);
- RNA_string_set(&opptr, "directory", lib_path);
+ RNA_string_set(&opptr, "filepath", lib_path);
}
-ATTR_NONNULL(1, 2)
-static void workspace_config_file_append_buttons(
- uiLayout *layout, const Main *bmain, ReportList *reports)
+static void workspace_add_menu(bContext *C, uiLayout *layout, void *template_v)
{
+ Main *bmain = CTX_data_main(C);
+ const char *app_template = template_v;
+ bool has_startup_items = false;
+
wmOperatorType *ot_append = WM_operatortype_find("WORKSPACE_OT_append_activate", true);
- WorkspaceConfigFileData *startup_config = workspace_config_file_read(bmain, reports);
- WorkspaceConfigFileData *builtin_config = BKE_blendfile_workspace_config_read(NULL, datatoc_startup_blend, datatoc_startup_blend_size, reports);
+ WorkspaceConfigFileData *startup_config = workspace_config_file_read(app_template);
+ WorkspaceConfigFileData *builtin_config = workspace_system_file_read(app_template);
if (startup_config) {
- bool has_title = false;
-
for (WorkSpace *workspace = startup_config->workspaces.first; workspace; workspace = workspace->id.next) {
+ uiLayout *row = uiLayoutRow(layout, false);
if (BLI_findstring(&bmain->workspaces, workspace->id.name, offsetof(ID, name))) {
- continue;
- }
-
- if (!has_title) {
- uiItemS(layout);
- uiItemL(layout, IFACE_("Startup File"), ICON_NONE);
- has_title = true;
+ uiLayoutSetActive(row, false);
}
- workspace_append_button(layout, ot_append, workspace, startup_config->main);
+ workspace_append_button(row, ot_append, workspace, startup_config->main);
+ has_startup_items = true;
}
}
@@ -465,22 +472,23 @@ static void workspace_config_file_append_buttons(
bool has_title = false;
for (WorkSpace *workspace = builtin_config->workspaces.first; workspace; workspace = workspace->id.next) {
- if (BLI_findstring(&bmain->workspaces, workspace->id.name, offsetof(ID, name))) {
- continue;
- }
if (startup_config && BLI_findstring(&startup_config->workspaces, workspace->id.name, offsetof(ID, name))) {
continue;
}
if (!has_title) {
- uiItemS(layout);
- uiItemL(layout, IFACE_("Builtin"), ICON_NONE);
+ if (has_startup_items) {
+ uiItemS(layout);
+ }
has_title = true;
}
- if (BLI_findstring(&bmain->workspaces, workspace->id.name, offsetof(ID, name)) == NULL) {
- workspace_append_button(layout, ot_append, workspace, builtin_config->main);
+ uiLayout *row = uiLayoutRow(layout, false);
+ if (BLI_findstring(&bmain->workspaces, workspace->id.name, offsetof(ID, name))) {
+ uiLayoutSetActive(row, false);
}
+
+ workspace_append_button(row, ot_append, workspace, builtin_config->main);
}
}
@@ -494,37 +502,100 @@ static void workspace_config_file_append_buttons(
static int workspace_add_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
- const Main *bmain = CTX_data_main(C);
-
- uiPopupMenu *pup = UI_popup_menu_begin(C, op->type->name, ICON_NONE);
+ uiPopupMenu *pup = UI_popup_menu_begin(C, op->type->name, ICON_ADD);
uiLayout *layout = UI_popup_menu_layout(pup);
- uiItemO(layout, "Duplicate Current", ICON_NONE, "WORKSPACE_OT_duplicate");
- workspace_config_file_append_buttons(layout, bmain, op->reports);
+ uiItemMenuF(layout, IFACE_("General"), ICON_NONE, workspace_add_menu, NULL);
+
+ ListBase templates;
+ BKE_appdir_app_templates(&templates);
+
+ for (LinkData *link = templates.first; link; link = link->next) {
+ char *template = link->data;
+ char display_name[FILE_MAX];
+
+ BLI_path_to_display_name(display_name, sizeof(display_name), template);
+
+ /* Steals ownership of link data string. */
+ uiItemMenuFN(layout, display_name, ICON_NONE, workspace_add_menu, template);
+ }
+
+ BLI_freelistN(&templates);
+
+ uiItemS(layout);
+ uiItemO(layout, "Duplicate Current", ICON_DUPLICATE, "WORKSPACE_OT_duplicate");
UI_popup_menu_end(C, pup);
return OPERATOR_INTERFACE;
}
-static void WORKSPACE_OT_add_menu(wmOperatorType *ot)
+static void WORKSPACE_OT_add(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Add Workspace";
ot->description = "Add a new workspace by duplicating the current one or appending one "
"from the user configuration";
- ot->idname = "WORKSPACE_OT_add_menu";
+ ot->idname = "WORKSPACE_OT_add";
/* api callbacks */
ot->invoke = workspace_add_invoke;
}
+static int workspace_reorder_to_back_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Main *bmain = CTX_data_main(C);
+ WorkSpace *workspace = workspace_context_get(C);
+
+ BKE_id_reorder(&bmain->workspaces, &workspace->id, NULL, true);
+ WM_event_add_notifier(C, NC_WINDOW, NULL);
+
+ return OPERATOR_INTERFACE;
+}
+
+static void WORKSPACE_OT_reorder_to_back(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Workspace Reorder to Back";
+ ot->description = "Reorder workspace to be first in the list";
+ ot->idname = "WORKSPACE_OT_reorder_to_back";
+
+ /* api callbacks */
+ ot->poll = workspace_context_poll;
+ ot->exec = workspace_reorder_to_back_exec;
+}
+
+static int workspace_reorder_to_front_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Main *bmain = CTX_data_main(C);
+ WorkSpace *workspace = workspace_context_get(C);
+
+ BKE_id_reorder(&bmain->workspaces, &workspace->id, NULL, false);
+ WM_event_add_notifier(C, NC_WINDOW, NULL);
+
+ return OPERATOR_INTERFACE;
+}
+
+static void WORKSPACE_OT_reorder_to_front(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Workspace Reorder to Front";
+ ot->description = "Reorder workspace to be first in the list";
+ ot->idname = "WORKSPACE_OT_reorder_to_front";
+
+ /* api callbacks */
+ ot->poll = workspace_context_poll;
+ ot->exec = workspace_reorder_to_front_exec;
+}
+
void ED_operatortypes_workspace(void)
{
WM_operatortype_append(WORKSPACE_OT_duplicate);
WM_operatortype_append(WORKSPACE_OT_delete);
- WM_operatortype_append(WORKSPACE_OT_add_menu);
+ WM_operatortype_append(WORKSPACE_OT_add);
WM_operatortype_append(WORKSPACE_OT_append_activate);
+ WM_operatortype_append(WORKSPACE_OT_reorder_to_back);
+ WM_operatortype_append(WORKSPACE_OT_reorder_to_front);
}
/** \} Workspace Operators */
diff --git a/source/blender/editors/sculpt_paint/paint_cursor.c b/source/blender/editors/sculpt_paint/paint_cursor.c
index 5cca61d4c78..dfad5afc9dc 100644
--- a/source/blender/editors/sculpt_paint/paint_cursor.c
+++ b/source/blender/editors/sculpt_paint/paint_cursor.c
@@ -41,6 +41,7 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
#include "DNA_userdef_types.h"
#include "DNA_view3d_types.h"
@@ -694,13 +695,13 @@ static void paint_draw_tex_overlay(
immUniform1i("image", GL_TEXTURE0);
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texCoord, 0.0f, 0.0f);
+ immAttr2f(texCoord, 0.0f, 0.0f);
immVertex2f(pos, quad.xmin, quad.ymin);
- immAttrib2f(texCoord, 1.0f, 0.0f);
+ immAttr2f(texCoord, 1.0f, 0.0f);
immVertex2f(pos, quad.xmax, quad.ymin);
- immAttrib2f(texCoord, 1.0f, 1.0f);
+ immAttr2f(texCoord, 1.0f, 1.0f);
immVertex2f(pos, quad.xmax, quad.ymax);
- immAttrib2f(texCoord, 0.0f, 1.0f);
+ immAttr2f(texCoord, 0.0f, 1.0f);
immVertex2f(pos, quad.xmin, quad.ymax);
immEnd();
@@ -777,13 +778,13 @@ static void paint_draw_cursor_overlay(
immUniform1i("image", 0);
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texCoord, 0.0f, 0.0f);
+ immAttr2f(texCoord, 0.0f, 0.0f);
immVertex2f(pos, quad.xmin, quad.ymin);
- immAttrib2f(texCoord, 1.0f, 0.0f);
+ immAttr2f(texCoord, 1.0f, 0.0f);
immVertex2f(pos, quad.xmax, quad.ymin);
- immAttrib2f(texCoord, 1.0f, 1.0f);
+ immAttr2f(texCoord, 1.0f, 1.0f);
immVertex2f(pos, quad.xmax, quad.ymax);
- immAttrib2f(texCoord, 0.0f, 1.0f);
+ immAttr2f(texCoord, 0.0f, 1.0f);
immVertex2f(pos, quad.xmin, quad.ymax);
immEnd();
@@ -801,7 +802,7 @@ static void paint_draw_alpha_overlay(
ViewContext *vc, int x, int y, float zoom, ePaintMode mode)
{
/* color means that primary brush texture is colured and secondary is used for alpha/mask control */
- bool col = ELEM(mode, ePaintTextureProjective, ePaintTexture2D, ePaintVertex) ? true : false;
+ bool col = ELEM(mode, ePaintTexture3D, ePaintTexture2D, ePaintVertex) ? true : false;
eOverlayControlFlags flags = BKE_paint_get_overlay_flags();
gpuPushAttrib(GPU_DEPTH_BUFFER_BIT | GPU_BLEND_BIT);
@@ -922,8 +923,11 @@ BLI_INLINE void draw_bezier_handle_lines(unsigned int pos, float sel_col[4], Bez
immEnd();
}
-static void paint_draw_curve_cursor(Brush *brush)
+static void paint_draw_curve_cursor(Brush *brush, ViewContext *vc)
{
+ GPU_matrix_push();
+ GPU_matrix_translate_2f(vc->ar->winrct.xmin, vc->ar->winrct.ymin);
+
if (brush->paint_curve && brush->paint_curve->points) {
int i;
PaintCurve *pc = brush->paint_curve;
@@ -990,6 +994,7 @@ static void paint_draw_curve_cursor(Brush *brush)
immUnbindProgram();
}
+ GPU_matrix_pop();
}
/* Special actions taken when paint cursor goes over mesh */
@@ -1028,7 +1033,7 @@ static void paint_cursor_on_hit(
static bool ommit_cursor_drawing(Paint *paint, ePaintMode mode, Brush *brush)
{
if (paint->flags & PAINT_SHOW_BRUSH) {
- if (ELEM(mode, ePaintTexture2D, ePaintTextureProjective) && brush->imagepaint_tool == PAINT_TOOL_FILL) {
+ if (ELEM(mode, ePaintTexture2D, ePaintTexture3D) && brush->imagepaint_tool == PAINT_TOOL_FILL) {
return true;
}
return false;
@@ -1060,7 +1065,7 @@ static void paint_draw_cursor(bContext *C, int x, int y, void *UNUSED(unused))
/* skip everything and draw brush here */
if (brush->flag & BRUSH_CURVE) {
- paint_draw_curve_cursor(brush);
+ paint_draw_curve_cursor(brush, &vc);
return;
}
@@ -1149,8 +1154,14 @@ void paint_cursor_start(bContext *C, bool (*poll)(bContext *C))
{
Paint *p = BKE_paint_get_active_from_context(C);
- if (p && !p->paint_cursor)
- p->paint_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), poll, paint_draw_cursor, NULL);
+ if (p && !p->paint_cursor) {
+ p->paint_cursor = WM_paint_cursor_activate(
+ CTX_wm_manager(C),
+ SPACE_TYPE_ANY, RGN_TYPE_ANY,
+ poll,
+ paint_draw_cursor,
+ NULL);
+ }
/* invalidate the paint cursors */
BKE_paint_invalidate_overlay_all();
@@ -1158,6 +1169,12 @@ void paint_cursor_start(bContext *C, bool (*poll)(bContext *C))
void paint_cursor_start_explicit(Paint *p, wmWindowManager *wm, bool (*poll)(bContext *C))
{
- if (p && !p->paint_cursor)
- p->paint_cursor = WM_paint_cursor_activate(wm, poll, paint_draw_cursor, NULL);
+ if (p && !p->paint_cursor) {
+ p->paint_cursor = WM_paint_cursor_activate(
+ wm,
+ SPACE_TYPE_ANY, RGN_TYPE_ANY,
+ poll,
+ paint_draw_cursor,
+ NULL);
+ }
}
diff --git a/source/blender/editors/sculpt_paint/paint_curve.c b/source/blender/editors/sculpt_paint/paint_curve.c
index 3213ee005cf..90e068ab17a 100644
--- a/source/blender/editors/sculpt_paint/paint_curve.c
+++ b/source/blender/editors/sculpt_paint/paint_curve.c
@@ -661,7 +661,7 @@ static int paintcurve_draw_exec(bContext *C, wmOperator *UNUSED(op))
switch (mode) {
case ePaintTexture2D:
- case ePaintTextureProjective:
+ case ePaintTexture3D:
name = "PAINT_OT_image_paint";
break;
case ePaintWeight:
diff --git a/source/blender/editors/sculpt_paint/paint_hide.c b/source/blender/editors/sculpt_paint/paint_hide.c
index a0589623f92..6faabe66462 100644
--- a/source/blender/editors/sculpt_paint/paint_hide.c
+++ b/source/blender/editors/sculpt_paint/paint_hide.c
@@ -391,8 +391,7 @@ static int hide_show_exec(bContext *C, wmOperator *op)
clip_planes_from_rect(C, clip_planes, &rect);
- Mesh *me_eval_deform = mesh_get_eval_deform(depsgraph, CTX_data_scene(C), ob, CD_MASK_BAREMESH);
- pbvh = BKE_sculpt_object_pbvh_ensure(ob, me_eval_deform);
+ pbvh = BKE_sculpt_object_pbvh_ensure(depsgraph, ob);
BLI_assert(ob->sculpt->pbvh == pbvh);
get_pbvh_nodes(pbvh, &nodes, &totnode, clip_planes, area);
@@ -444,7 +443,7 @@ static int hide_show_invoke(bContext *C, wmOperator *op, const wmEvent *event)
PartialVisArea area = RNA_enum_get(op->ptr, "area");
if (!ELEM(area, PARTIALVIS_ALL, PARTIALVIS_MASKED))
- return WM_gesture_border_invoke(C, op, event);
+ return WM_gesture_box_invoke(C, op, event);
else
return op->type->exec(C, op);
}
@@ -472,7 +471,7 @@ void PAINT_OT_hide_show(struct wmOperatorType *ot)
/* api callbacks */
ot->invoke = hide_show_invoke;
- ot->modal = WM_gesture_border_modal;
+ ot->modal = WM_gesture_box_modal;
ot->exec = hide_show_exec;
/* sculpt-only for now */
ot->poll = sculpt_mode_poll_view3d;
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index 897a74eb497..e528c64b6e2 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -485,7 +485,11 @@ static PaintOperation *texture_paint_init(bContext *C, wmOperator *op, const flo
}
if ((brush->imagepaint_tool == PAINT_TOOL_FILL) && (brush->flag & BRUSH_USE_GRADIENT)) {
- pop->cursor = WM_paint_cursor_activate(CTX_wm_manager(C), image_paint_poll, gradient_draw_line, pop);
+ pop->cursor = WM_paint_cursor_activate(
+ CTX_wm_manager(C),
+ SPACE_TYPE_ANY, RGN_TYPE_ANY,
+ image_paint_poll, gradient_draw_line,
+ pop);
}
settings->imapaint.flag |= IMAGEPAINT_DRAWING;
@@ -915,7 +919,7 @@ static int sample_color_exec(bContext *C, wmOperator *op)
RNA_int_get_array(op->ptr, "location", location);
const bool use_palette = RNA_boolean_get(op->ptr, "palette");
- const bool use_sample_texture = (mode == ePaintTextureProjective) && !RNA_boolean_get(op->ptr, "merged");
+ const bool use_sample_texture = (mode == ePaintTexture3D) && !RNA_boolean_get(op->ptr, "merged");
paint_sample_color(C, ar, location[0], location[1], use_sample_texture, use_palette);
@@ -955,7 +959,7 @@ static int sample_color_invoke(bContext *C, wmOperator *op, const wmEvent *event
RNA_int_set_array(op->ptr, "location", event->mval);
ePaintMode mode = BKE_paintmode_get_active_from_context(C);
- const bool use_sample_texture = (mode == ePaintTextureProjective) && !RNA_boolean_get(op->ptr, "merged");
+ const bool use_sample_texture = (mode == ePaintTexture3D) && !RNA_boolean_get(op->ptr, "merged");
paint_sample_color(C, ar, event->mval[0], event->mval[1], use_sample_texture, false);
WM_cursor_modal_set(win, BC_EYEDROPPER_CURSOR);
@@ -989,7 +993,7 @@ static int sample_color_modal(bContext *C, wmOperator *op, const wmEvent *event)
}
ePaintMode mode = BKE_paintmode_get_active_from_context(C);
- const bool use_sample_texture = (mode == ePaintTextureProjective) && !RNA_boolean_get(op->ptr, "merged");
+ const bool use_sample_texture = (mode == ePaintTexture3D) && !RNA_boolean_get(op->ptr, "merged");
switch (event->type) {
case MOUSEMOVE:
@@ -1126,7 +1130,9 @@ static int texture_paint_toggle_exec(bContext *C, wmOperator *op)
ob->mode |= mode_flag;
- BKE_paint_init(bmain, scene, ePaintTextureProjective, PAINT_CURSOR_TEXTURE_PAINT);
+ BKE_paint_init(bmain, scene, ePaintTexture3D, PAINT_CURSOR_TEXTURE_PAINT);
+
+ BKE_paint_toolslots_brush_validate(bmain, &imapaint->paint);
if (U.glreslimit != 0)
GPU_free_images(bmain);
diff --git a/source/blender/editors/sculpt_paint/paint_image_2d.c b/source/blender/editors/sculpt_paint/paint_image_2d.c
index da08766b322..6b2287290d1 100644
--- a/source/blender/editors/sculpt_paint/paint_image_2d.c
+++ b/source/blender/editors/sculpt_paint/paint_image_2d.c
@@ -701,7 +701,7 @@ static void brush_painter_2d_refresh_cache(ImagePaintState *s, BrushPainter *pai
do_partial_update_mask = true;
renew_maxmask = true;
}
- /* explicilty disable partial update even if it has been enabled above */
+ /* explicitly disable partial update even if it has been enabled above */
if (brush->mask_pressure) {
do_partial_update_mask = false;
renew_maxmask = true;
@@ -1421,8 +1421,9 @@ static void paint_2d_fill_add_pixel_byte(
float color_f[4];
unsigned char *color_b = (unsigned char *)(ibuf->rect + coordinate);
rgba_uchar_to_float(color_f, color_b);
+ straight_to_premul_v4(color_f);
- if (compare_len_squared_v3v3(color_f, color, threshold_sq)) {
+ if (compare_len_squared_v4v4(color_f, color, threshold_sq)) {
BLI_stack_push(stack, &coordinate);
}
BLI_BITMAP_SET(touched, coordinate, true);
@@ -1441,7 +1442,7 @@ static void paint_2d_fill_add_pixel_float(
coordinate = ((size_t)y_px) * ibuf->x + x_px;
if (!BLI_BITMAP_TEST(touched, coordinate)) {
- if (compare_len_squared_v3v3(ibuf->rect_float + 4 * coordinate, color, threshold_sq)) {
+ if (compare_len_squared_v4v4(ibuf->rect_float + 4 * coordinate, color, threshold_sq)) {
BLI_stack_push(stack, &coordinate);
}
BLI_BITMAP_SET(touched, coordinate, true);
@@ -1548,6 +1549,7 @@ void paint_2d_bucket_fill(
else {
int pixel_color_b = *(ibuf->rect + coordinate);
rgba_uchar_to_float(pixel_color, (unsigned char *)&pixel_color_b);
+ straight_to_premul_v4(pixel_color);
}
BLI_stack_push(stack, &coordinate);
diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c b/source/blender/editors/sculpt_paint/paint_image_proj.c
index 7badd30e6d0..6ed502ec016 100644
--- a/source/blender/editors/sculpt_paint/paint_image_proj.c
+++ b/source/blender/editors/sculpt_paint/paint_image_proj.c
@@ -62,12 +62,12 @@
#include "DNA_node_types.h"
#include "DNA_object_types.h"
+#include "BKE_brush.h"
#include "BKE_camera.h"
#include "BKE_colorband.h"
#include "BKE_context.h"
#include "BKE_colortools.h"
#include "BKE_idprop.h"
-#include "BKE_brush.h"
#include "BKE_image.h"
#include "BKE_library.h"
#include "BKE_main.h"
@@ -186,7 +186,7 @@ BLI_INLINE unsigned char f_to_char(const float val)
#define PROJ_VERT_CULL 1
/* to avoid locking in tile initialization */
-#define TILE_PENDING SET_INT_IN_POINTER(-1)
+#define TILE_PENDING POINTER_FROM_INT(-1)
/* This is mainly a convenience struct used so we can keep an array of images we use -
* their imbufs, etc, in 1 array, When using threads this array is copied for each thread
@@ -355,6 +355,7 @@ typedef struct ProjPaintState {
SpinLock *tile_lock;
Mesh *me_eval;
+ bool me_eval_free;
int totlooptri_eval;
int totpoly_eval;
int totedge_eval;
@@ -571,7 +572,7 @@ static float VecZDepthPersp(
}
else /* dummy values for zero area face */
w_tmp[0] = w_tmp[1] = w_tmp[2] = 1.0f / 3.0f;
- /* done mimicing barycentric_weights_v2() */
+ /* done mimicking barycentric_weights_v2() */
return (v1[2] * w_tmp[0]) + (v2[2] * w_tmp[1]) + (v3[2] * w_tmp[2]);
}
@@ -598,7 +599,7 @@ static int project_paint_PickFace(
* that the point its testing is only every originated from an existing face */
for (node = ps->bucketFaces[bucket_index]; node; node = node->next) {
- const int tri_index = GET_INT_FROM_POINTER(node->link);
+ const int tri_index = POINTER_AS_INT(node->link);
const MLoopTri *lt = &ps->mlooptri_eval[tri_index];
const float *vtri_ss[3] = {
ps->screenCoords[ps->mloop_eval[lt->tri[0]].v],
@@ -812,7 +813,7 @@ static bool project_bucket_point_occluded(
* that the point its testing is only every originated from an existing face */
for (; bucketFace; bucketFace = bucketFace->next) {
- const int tri_index = GET_INT_FROM_POINTER(bucketFace->link);
+ const int tri_index = POINTER_AS_INT(bucketFace->link);
if (orig_face != tri_index) {
const MLoopTri *lt = &ps->mlooptri_eval[tri_index];
@@ -1033,7 +1034,7 @@ static bool check_seam(
int i1_fidx = -1, i2_fidx = -1; /* index in face */
for (node = ps->vertFaces[i1]; node; node = node->next) {
- const int tri_index = GET_INT_FROM_POINTER(node->link);
+ const int tri_index = POINTER_AS_INT(node->link);
if (tri_index != orig_face) {
const MLoopTri *lt = &ps->mlooptri_eval[tri_index];
@@ -1695,7 +1696,7 @@ static ProjPixel *project_paint_uvpixel_init(
if (ibuf->rect_float) projPixel->pixel.f_pt[0] = 0;
else projPixel->pixel.ch_pt[0] = 0;
#endif
- /* pointer arithmetics */
+ /* pointer arithmetic */
projPixel->image_index = projima - ps->projImages;
return projPixel;
@@ -2586,7 +2587,7 @@ static void project_paint_face_init(
v2coSS = ps->screenCoords[lt_vtri[1]];
v3coSS = ps->screenCoords[lt_vtri[2]];
- /* This funtion gives is a concave polyline in UV space from the clipped tri*/
+ /* This function gives is a concave polyline in UV space from the clipped tri*/
project_bucket_clip_face(
is_ortho, is_flip_object,
clip_rect, bucket_bounds,
@@ -2620,7 +2621,7 @@ static void project_paint_face_init(
//uv[0] = (((float)x) + 0.5f) / ibuf->x;
uv[0] = (float)x / ibuf_xf; /* use pixel offset UV coords instead */
- /* Note about IsectPoly2Df_twoside, checking the face or uv flipping doesnt work,
+ /* Note about IsectPoly2Df_twoside, checking the face or uv flipping doesn't work,
* could check the poly direction but better to do this */
if ((do_backfacecull == true && IsectPoly2Df(uv, uv_clip, uv_clip_tot)) ||
(do_backfacecull == false && IsectPoly2Df_twoside(uv, uv_clip, uv_clip_tot)))
@@ -2713,7 +2714,7 @@ static void project_paint_face_init(
/* Now create new UV's for the seam face */
float (*outset_uv)[2] = ps->faceSeamUVs[tri_index];
- float insetCos[3][3]; /* inset face coords. NOTE!!! ScreenSace for ortho, Worldspace in prespective view */
+ float insetCos[3][3]; /* inset face coords. NOTE!!! ScreenSace for ortho, Worldspace in perspective view */
const float *vCoSS[3]; /* vertex screenspace coords */
@@ -2928,7 +2929,7 @@ static void project_bucket_init(
for (node = ps->bucketFaces[bucket_index]; node; node = node->next) {
project_paint_face_init(
- ps, thread_index, bucket_index, GET_INT_FROM_POINTER(node->link), 0,
+ ps, thread_index, bucket_index, POINTER_AS_INT(node->link), 0,
clip_rect, bucket_bounds, ibuf, &tmpibuf);
}
}
@@ -2936,7 +2937,7 @@ static void project_bucket_init(
/* More complicated loop, switch between images */
for (node = ps->bucketFaces[bucket_index]; node; node = node->next) {
- tri_index = GET_INT_FROM_POINTER(node->link);
+ tri_index = POINTER_AS_INT(node->link);
/* Image context switching */
tpage = project_paint_face_paint_image(ps, tri_index);
@@ -3045,7 +3046,7 @@ static void project_paint_delayed_face_init(ProjPaintState *ps, const MLoopTri *
int bucket_index = bucket_x + (bucket_y * ps->buckets_x);
BLI_linklist_prepend_arena(
&ps->bucketFaces[bucket_index],
- SET_INT_IN_POINTER(tri_index), /* cast to a pointer to shut up the compiler */
+ POINTER_FROM_INT(tri_index), /* cast to a pointer to shut up the compiler */
arena
);
@@ -3385,7 +3386,7 @@ static void project_paint_bleed_add_face_user(
/* annoying but we need to add all faces even ones we never use elsewhere */
if (ps->seam_bleed_px > 0.0f) {
const int lt_vtri[3] = { PS_LOOPTRI_AS_VERT_INDEX_3(ps, lt) };
- void *tri_index_p = SET_INT_IN_POINTER(tri_index);
+ void *tri_index_p = POINTER_FROM_INT(tri_index);
BLI_linklist_prepend_arena(&ps->vertFaces[lt_vtri[0]], tri_index_p, arena);
BLI_linklist_prepend_arena(&ps->vertFaces[lt_vtri[1]], tri_index_p, arena);
BLI_linklist_prepend_arena(&ps->vertFaces[lt_vtri[2]], tri_index_p, arena);
@@ -3397,29 +3398,26 @@ static void project_paint_bleed_add_face_user(
static bool proj_paint_state_mesh_eval_init(const bContext *C, ProjPaintState *ps)
{
Depsgraph *depsgraph = CTX_data_depsgraph(C);
- Scene *sce = ps->scene;
Object *ob = ps->ob;
/* Workaround for subsurf selection, try the display mesh first */
- /* XXX Don't think this is easily doable with new system, and not sure why that was needed in the first place :/ */
-#if 0
if (ps->source == PROJ_SRC_IMAGE_CAM) {
/* using render mesh, assume only camera was rendered from */
- ps->dm = mesh_create_derived_render(
+ ps->me_eval = mesh_create_eval_final_render(
depsgraph, ps->scene, ps->ob, ps->scene->customdata_mask | CD_MASK_MLOOPUV | CD_MASK_MTFACE);
- ps->dm_release = true;
+ ps->me_eval_free = true;
}
else {
- ps->dm = mesh_get_derived_final(
+ ps->me_eval = mesh_get_eval_final(
depsgraph, ps->scene, ps->ob,
ps->scene->customdata_mask | CD_MASK_MLOOPUV | CD_MASK_MTFACE | (ps->do_face_sel ? CD_MASK_ORIGINDEX : 0));
- ps->dm_release = false;
+ ps->me_eval_free = false;
}
-#endif
- ps->me_eval = mesh_get_eval_final(
- depsgraph, sce, ob,
- sce->customdata_mask | CD_MASK_MLOOPUV | CD_MASK_MTFACE | (ps->do_face_sel ? CD_MASK_ORIGINDEX : 0));
+
if (!CustomData_has_layer(&ps->me_eval->ldata, CD_MLOOPUV)) {
+ if (ps->me_eval_free) {
+ BKE_id_free(NULL, ps->me_eval);
+ }
ps->me_eval = NULL;
return false;
}
@@ -3965,6 +3963,11 @@ static void project_paint_end(ProjPaintState *ps)
if (ps->do_mask_cavity) {
MEM_freeN(ps->cavities);
}
+
+ if (ps->me_eval_free) {
+ BKE_id_free(NULL, ps->me_eval);
+ }
+ ps->me_eval = NULL;
}
if (ps->blurkernel) {
@@ -5612,13 +5615,24 @@ bool BKE_paint_proj_mesh_data_check(Scene *scene, Object *ob, bool *uvs, bool *m
}
/* Add layer operator */
+enum {
+ LAYER_BASE_COLOR,
+ LAYER_SPECULAR,
+ LAYER_ROUGHNESS,
+ LAYER_METALLIC,
+ LAYER_NORMAL,
+ LAYER_BUMP,
+ LAYER_DISPLACEMENT
+};
static const EnumPropertyItem layer_type_items[] = {
- {0, "BASE_COLOR", 0, "Base Color", ""},
- {1, "EMISSION", 0, "Emission", ""},
- {2, "NORMAL", 0, "Normal", ""},
- {3, "BUMP", 0, "Bump", ""},
- {4, "DISPLACEMENT", 0, "Displacement", ""},
+ {LAYER_BASE_COLOR, "BASE_COLOR", 0, "Base Color", ""},
+ {LAYER_SPECULAR, "SPECULAR", 0, "Specular", ""},
+ {LAYER_ROUGHNESS, "ROUGHNESS", 0, "Roughness", ""},
+ {LAYER_METALLIC, "METALLIC", 0, "Metallic", ""},
+ {LAYER_NORMAL, "NORMAL", 0, "Normal", ""},
+ {LAYER_BUMP, "BUMP", 0, "Bump", ""},
+ {LAYER_DISPLACEMENT, "DISPLACEMENT", 0, "Displacement", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -5649,6 +5663,57 @@ static Image *proj_paint_image_create(wmOperator *op, Main *bmain)
return ima;
}
+static void proj_paint_default_color(wmOperator *op, int type, Material *ma)
+{
+ if (RNA_struct_property_is_set(op->ptr, "color")) {
+ return;
+ }
+
+ bNode *in_node = ntreeFindType(ma->nodetree, SH_NODE_BSDF_PRINCIPLED);
+ if (in_node == NULL) {
+ return;
+ }
+
+ float color[4];
+
+ if (type >= LAYER_BASE_COLOR && type < LAYER_NORMAL) {
+ /* Copy color from node, so result is unchanged after assigning textures. */
+ bNodeSocket *in_sock = nodeFindSocket(in_node, SOCK_IN, layer_type_items[type].name);
+
+ switch (in_sock->type) {
+ case SOCK_FLOAT: {
+ bNodeSocketValueFloat *socket_data = in_sock->default_value;
+ copy_v3_fl(color, socket_data->value);
+ color[3] = 1.0f;
+ break;
+ }
+ case SOCK_VECTOR:
+ case SOCK_RGBA: {
+ bNodeSocketValueRGBA *socket_data = in_sock->default_value;
+ copy_v3_v3(color, socket_data->value);
+ color[3] = 1.0f;
+ break;
+ }
+ default: {
+ return;
+ }
+ }
+ }
+ else if (type == LAYER_NORMAL) {
+ /* Neutral tangent space normal map. */
+ rgba_float_args_set(color, 0.5f, 0.5f, 1.0f, 1.0f);
+ }
+ else if (ELEM(type, LAYER_BUMP, LAYER_DISPLACEMENT)) {
+ /* Neutral displacement and bump map. */
+ rgba_float_args_set(color, 0.5f, 0.5f, 0.5f, 1.0f);
+ }
+ else {
+ return;
+ }
+
+ RNA_float_set_array(op->ptr, "color", color);
+}
+
static bool proj_paint_add_slot(bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
@@ -5662,8 +5727,8 @@ static bool proj_paint_add_slot(bContext *C, wmOperator *op)
ma = give_current_material(ob, ob->actcol);
if (ma) {
- /* TODO: use type to link to proper socket. */
Main *bmain = CTX_data_main(C);
+ int type = RNA_enum_get(op->ptr, "type");
bNode *imanode;
bNodeTree *ntree = ma->nodetree;
@@ -5683,7 +5748,71 @@ static bool proj_paint_add_slot(bContext *C, wmOperator *op)
nodeSetActive(ntree, imanode);
+ /* Connect to first available principled bsdf node. */
+ bNode *in_node = ntreeFindType(ntree, SH_NODE_BSDF_PRINCIPLED);
+ bNode *out_node = imanode;
+
+ if (in_node != NULL) {
+ bNodeSocket *out_sock = nodeFindSocket(out_node, SOCK_OUT, "Color");
+ bNodeSocket *in_sock = NULL;
+
+ if (type >= LAYER_BASE_COLOR && type < LAYER_NORMAL) {
+ in_sock = nodeFindSocket(in_node, SOCK_IN, layer_type_items[type].name);
+ }
+ else if (type == LAYER_NORMAL) {
+ bNode *nor_node;
+ nor_node = nodeAddStaticNode(C, ntree, SH_NODE_NORMAL_MAP);
+
+ in_sock = nodeFindSocket(nor_node, SOCK_IN, "Color");
+ nodeAddLink(ntree, out_node, out_sock, nor_node, in_sock);
+
+ in_sock = nodeFindSocket(in_node, SOCK_IN, "Normal");
+ out_sock = nodeFindSocket(nor_node, SOCK_OUT, "Normal");
+
+ out_node = nor_node;
+ }
+ else if (type == LAYER_BUMP) {
+ bNode *bump_node;
+ bump_node = nodeAddStaticNode(C, ntree, SH_NODE_BUMP);
+
+ in_sock = nodeFindSocket(bump_node, SOCK_IN, "Height");
+ nodeAddLink(ntree, out_node, out_sock, bump_node, in_sock);
+
+ in_sock = nodeFindSocket(in_node, SOCK_IN, "Normal");
+ out_sock = nodeFindSocket(bump_node, SOCK_OUT, "Normal");
+
+ out_node = bump_node;
+ }
+ else if (type == LAYER_DISPLACEMENT) {
+ /* Connect to the displacement output socket */
+ in_node = ntreeFindType(ntree, SH_NODE_OUTPUT_MATERIAL);
+
+ if (in_node != NULL) {
+ in_sock = nodeFindSocket(in_node, SOCK_IN, layer_type_items[type].name);
+ }
+ else {
+ in_sock = NULL;
+ }
+ }
+
+ if (type > LAYER_BASE_COLOR) {
+ /* This is a "non color data" image */
+ NodeTexImage *tex = imanode->storage;
+ tex->color_space = SHD_COLORSPACE_NONE;
+ }
+
+ /* Check if the socket in already connected to something */
+ bNodeLink *link = in_sock ? in_sock->link : NULL;
+ if (in_sock != NULL && link == NULL) {
+ nodeAddLink(ntree, out_node, out_sock, in_node, in_sock);
+
+ nodePositionRelative(out_node, in_node, out_sock, in_sock);
+ }
+ }
+
ntreeUpdateTree(CTX_data_main(C), ntree);
+ /* In case we added more than one node, position them too. */
+ nodePositionPropagate(out_node);
if (ima) {
BKE_texpaint_slot_refresh_cache(scene, ma);
@@ -5701,8 +5830,33 @@ static bool proj_paint_add_slot(bContext *C, wmOperator *op)
return false;
}
+static int get_texture_layer_type(wmOperator *op, const char *prop_name)
+{
+ int type_value = RNA_enum_get(op->ptr, prop_name);
+ int type = RNA_enum_from_value(layer_type_items, type_value);
+ BLI_assert(type != -1);
+ return type;
+}
+
+static Material *get_or_create_current_material(bContext *C, Object *ob)
+{
+ Material *ma = give_current_material(ob, ob->actcol);
+ if (!ma) {
+ Main *bmain = CTX_data_main(C);
+ ma = BKE_material_add(bmain, "Material");
+ assign_material(bmain, ob, ma, ob->actcol, BKE_MAT_ASSIGN_USERPREF);
+ }
+ return ma;
+}
+
static int texture_paint_add_texture_paint_slot_exec(bContext *C, wmOperator *op)
{
+ Object *ob = ED_object_active_context(C);
+ Material *ma = get_or_create_current_material(C, ob);
+
+ int type = get_texture_layer_type(op, "type");
+ proj_paint_default_color(op, type, ma);
+
if (proj_paint_add_slot(C, op)) {
return OPERATOR_FINISHED;
}
@@ -5711,31 +5865,23 @@ static int texture_paint_add_texture_paint_slot_exec(bContext *C, wmOperator *op
}
}
+static void get_default_texture_layer_name_for_object(Object *ob, int texture_type, char *dst, int dst_length)
+{
+ Material *ma = give_current_material(ob, ob->actcol);
+ const char *base_name = ma ? &ma->id.name[2] : &ob->id.name[2];
+ BLI_snprintf(dst, dst_length, "%s %s", base_name, layer_type_items[texture_type].name);
+}
static int texture_paint_add_texture_paint_slot_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
- char imagename[MAX_ID_NAME - 2];
- Main *bmain = CTX_data_main(C);
Object *ob = ED_object_active_context(C);
- Material *ma = give_current_material(ob, ob->actcol);
- int type = RNA_enum_get(op->ptr, "type");
-
- if (!ma) {
- ma = BKE_material_add(bmain, "Material");
- /* no material found, just assign to first slot */
- assign_material(bmain, ob, ma, ob->actcol, BKE_MAT_ASSIGN_USERPREF);
- }
-
- type = RNA_enum_from_value(layer_type_items, type);
-
- /* get the name of the texture layer type */
- BLI_assert(type != -1);
-
- /* take the second letter to avoid the ID identifier */
- BLI_snprintf(imagename, sizeof(imagename), "%s %s", &ma->id.name[2], layer_type_items[type].name);
+ int type = get_texture_layer_type(op, "type");
+ char imagename[MAX_ID_NAME - 2];
+ get_default_texture_layer_name_for_object(ob, type, (char *)&imagename, sizeof(imagename));
RNA_string_set(op->ptr, "name", imagename);
- return WM_operator_props_dialog_popup(C, op, 15 * UI_UNIT_X, 5 * UI_UNIT_Y);
+
+ return WM_operator_props_dialog_popup(C, op, 300, 100);
}
#define IMA_DEF_NAME N_("Untitled")
diff --git a/source/blender/editors/sculpt_paint/paint_intern.h b/source/blender/editors/sculpt_paint/paint_intern.h
index 7d3049434d6..b991755325a 100644
--- a/source/blender/editors/sculpt_paint/paint_intern.h
+++ b/source/blender/editors/sculpt_paint/paint_intern.h
@@ -54,10 +54,14 @@ struct wmEvent;
struct wmOperator;
struct wmOperatorType;
struct wmWindowManager;
-struct DMCoNo;
struct UndoStep;
enum ePaintMode;
+typedef struct CoNo {
+ float co[3];
+ float no[3];
+} CoNo;
+
/* paint_stroke.c */
typedef bool (*StrokeGetLocation)(struct bContext *C, float location[3], const float mouse[2]);
typedef bool (*StrokeTestStart)(struct bContext *C, struct wmOperator *op, const float mouse[2]);
@@ -116,7 +120,7 @@ void PAINT_OT_weight_gradient(struct wmOperatorType *ot);
void PAINT_OT_vertex_paint_toggle(struct wmOperatorType *ot);
void PAINT_OT_vertex_paint(struct wmOperatorType *ot);
-unsigned int vpaint_get_current_col(struct Scene *scene, struct VPaint *vp);
+unsigned int vpaint_get_current_col(struct Scene *scene, struct VPaint *vp, bool secondary);
/* paint_vertex_color_utils.c */
unsigned int ED_vpaint_blend_tool(
@@ -161,7 +165,7 @@ void PAINT_OT_weight_sample_group(struct wmOperatorType *ot);
struct VertProjHandle;
struct VertProjHandle *ED_vpaint_proj_handle_create(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob,
- struct DMCoNo **r_vcosnos);
+ struct CoNo **r_vcosnos);
void ED_vpaint_proj_handle_update(
struct Depsgraph *depsgraph, struct VertProjHandle *vp_handle,
/* runtime vars */
@@ -302,20 +306,6 @@ typedef enum BrushStrokeMode {
BRUSH_STROKE_SMOOTH
} BrushStrokeMode;
-/* paint_ops.c */
-typedef enum {
- RC_COLOR = 1,
- RC_ROTATION = 2,
- RC_ZOOM = 4,
- RC_WEIGHT = 8,
- RC_SECONDARY_ROTATION = 16,
- RC_COLOR_OVERRIDE = 32,
-} RCFlags;
-
-void set_brush_rc_props(
- struct PointerRNA *ptr, const char *paint, const char *prop, const char *secondary_prop,
- RCFlags flags);
-
/* paint_hide.c */
typedef enum {
diff --git a/source/blender/editors/sculpt_paint/paint_mask.c b/source/blender/editors/sculpt_paint/paint_mask.c
index a09c04f6fb0..b8175e3d368 100644
--- a/source/blender/editors/sculpt_paint/paint_mask.c
+++ b/source/blender/editors/sculpt_paint/paint_mask.c
@@ -201,7 +201,7 @@ void PAINT_OT_mask_flood_fill(struct wmOperatorType *ot)
"Mask level to use when mode is 'Value'; zero means no masking and one is fully masked", 0, 1);
}
-/* Box select, operator is VIEW3D_OT_select_border, defined in view3d_select.c */
+/* Box select, operator is VIEW3D_OT_select_box, defined in view3d_select.c */
static bool is_effected(float planes[4][4], const float co[3])
{
diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c
index 05be3db635f..316372ece4e 100644
--- a/source/blender/editors/sculpt_paint/paint_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_ops.c
@@ -39,9 +39,10 @@
#include "BKE_brush.h"
#include "BKE_context.h"
-#include "BKE_paint.h"
#include "BKE_gpencil.h"
+#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_paint.h"
#include "BKE_report.h"
#include "DEG_depsgraph.h"
@@ -49,6 +50,7 @@
#include "ED_paint.h"
#include "ED_screen.h"
#include "ED_select_utils.h"
+#include "ED_keymap_templates.h"
#include "ED_image.h"
#include "ED_gpencil.h"
#include "UI_resources.h"
@@ -81,7 +83,7 @@ static int brush_add_exec(bContext *C, wmOperator *UNUSED(op))
br = BKE_brush_copy(bmain, br);
}
else {
- br = BKE_brush_add(bmain, "Brush", BKE_paint_object_mode_from_paint_mode(mode));
+ br = BKE_brush_add(bmain, "Brush", BKE_paint_object_mode_from_paintmode(mode));
id_us_min(&br->id); /* fake user only */
}
@@ -132,7 +134,7 @@ static void BRUSH_OT_add_gpencil(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Add Drawing Brush";
- ot->description = "Add brush for grease pencil";
+ ot->description = "Add brush for Grease Pencil";
ot->idname = "BRUSH_OT_add_gpencil";
/* api callbacks */
@@ -251,7 +253,7 @@ static int palette_color_add_exec(bContext *C, wmOperator *UNUSED(op))
color = BKE_palette_color_add(palette);
palette->active_color = BLI_listbase_count(&palette->colors) - 1;
- if (ELEM(mode, ePaintTextureProjective, ePaintTexture2D, ePaintVertex)) {
+ if (ELEM(mode, ePaintTexture3D, ePaintTexture2D, ePaintVertex)) {
copy_v3_v3(color->rgb, BKE_brush_color_get(scene, brush));
color->value = 0.0;
}
@@ -348,8 +350,7 @@ static void brush_tool_set(const Brush *brush, size_t tool_offset, int tool)
*(((char *)brush) + tool_offset) = tool;
}
-/* generic functions for setting the active brush based on the tool */
-static Brush *brush_tool_cycle(Main *bmain, Brush *brush_orig, const int tool, const size_t tool_offset, const int ob_mode)
+static Brush *brush_tool_cycle(Main *bmain, Paint *paint, Brush *brush_orig, const int tool)
{
Brush *brush, *first_brush;
@@ -357,13 +358,18 @@ static Brush *brush_tool_cycle(Main *bmain, Brush *brush_orig, const int tool, c
return NULL;
}
- if (brush_tool(brush_orig, tool_offset) != tool) {
+ if (brush_tool(brush_orig, paint->runtime.tool_offset) != tool) {
/* If current brush's tool is different from what we need,
* start cycling from the beginning of the list.
* Such logic will activate the same exact brush not relating from
* which tool user requests other tool.
*/
- first_brush = bmain->brush.first;
+
+ /* Try to tool-slot first. */
+ first_brush = BKE_paint_toolslots_brush_get(paint, tool);
+ if (first_brush == NULL) {
+ first_brush = bmain->brush.first;
+ }
}
else {
/* If user wants to switch to brush with the same tool as
@@ -376,8 +382,8 @@ static Brush *brush_tool_cycle(Main *bmain, Brush *brush_orig, const int tool, c
/* get the next brush with the active tool */
brush = first_brush;
do {
- if ((brush->ob_mode & ob_mode) &&
- (brush_tool(brush, tool_offset) == tool))
+ if ((brush->ob_mode & paint->runtime.ob_mode) &&
+ (brush_tool(brush, paint->runtime.tool_offset) == tool))
{
return brush;
}
@@ -388,13 +394,13 @@ static Brush *brush_tool_cycle(Main *bmain, Brush *brush_orig, const int tool, c
return NULL;
}
-static Brush *brush_tool_toggle(Main *bmain, Brush *brush_orig, const int tool, const size_t tool_offset, const int ob_mode)
+static Brush *brush_tool_toggle(Main *bmain, Paint *paint, Brush *brush_orig, const int tool)
{
- if (!brush_orig || brush_tool(brush_orig, tool_offset) != tool) {
+ if (!brush_orig || brush_tool(brush_orig, paint->runtime.tool_offset) != tool) {
Brush *br;
/* if the current brush is not using the desired tool, look
* for one that is */
- br = brush_tool_cycle(bmain, brush_orig, tool, tool_offset, ob_mode);
+ br = brush_tool_cycle(bmain, paint, brush_orig, tool);
/* store the previously-selected brush */
if (br)
br->toggle_brush = brush_orig;
@@ -412,21 +418,22 @@ static Brush *brush_tool_toggle(Main *bmain, Brush *brush_orig, const int tool,
static int brush_generic_tool_set(
Main *bmain, Paint *paint, const int tool,
- const size_t tool_offset, const int ob_mode,
const char *tool_name, const bool create_missing,
const bool toggle)
{
Brush *brush, *brush_orig = BKE_paint_brush(paint);
- if (toggle)
- brush = brush_tool_toggle(bmain, brush_orig, tool, tool_offset, ob_mode);
- else
- brush = brush_tool_cycle(bmain, brush_orig, tool, tool_offset, ob_mode);
+ if (toggle) {
+ brush = brush_tool_toggle(bmain, paint, brush_orig, tool);
+ }
+ else {
+ brush = brush_tool_cycle(bmain, paint, brush_orig, tool);
+ }
- if (!brush && brush_tool(brush_orig, tool_offset) != tool && create_missing) {
- brush = BKE_brush_add(bmain, tool_name, ob_mode);
+ if (!brush && brush_tool(brush_orig, paint->runtime.tool_offset) != tool && create_missing) {
+ brush = BKE_brush_add(bmain, tool_name, paint->runtime.ob_mode);
id_us_min(&brush->id); /* fake user only */
- brush_tool_set(brush, tool_offset, tool);
+ brush_tool_set(brush, paint->runtime.tool_offset, tool);
brush->toggle_brush = brush_orig;
}
@@ -442,87 +449,48 @@ static int brush_generic_tool_set(
}
}
-/* used in the PAINT_OT_brush_select operator */
-#define OB_MODE_ACTIVE 0
-
static int brush_select_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
- ToolSettings *toolsettings = CTX_data_tool_settings(C);
- Paint *paint = NULL;
- int tool, paint_mode = RNA_enum_get(op->ptr, "paint_mode");
+ Scene *scene = CTX_data_scene(C);
+ ePaintMode paint_mode = RNA_enum_get(op->ptr, "paint_mode");
const bool create_missing = RNA_boolean_get(op->ptr, "create_missing");
const bool toggle = RNA_boolean_get(op->ptr, "toggle");
const char *tool_name = "Brush";
- size_t tool_offset;
- if (paint_mode == OB_MODE_ACTIVE) {
- Object *ob = CTX_data_active_object(C);
- if (ob) {
- /* select current paint mode */
- paint_mode = ob->mode & OB_MODE_ALL_PAINT;
- }
- else {
+ if (paint_mode == ePaintInvalid) {
+ paint_mode = BKE_paintmode_get_active_from_context(C);
+ if (paint_mode == ePaintInvalid) {
return OPERATOR_CANCELLED;
}
}
- switch (paint_mode) {
- case OB_MODE_SCULPT:
- paint = &toolsettings->sculpt->paint;
- tool_offset = offsetof(Brush, sculpt_tool);
- tool = RNA_enum_get(op->ptr, "sculpt_tool");
- RNA_enum_name_from_value(rna_enum_brush_sculpt_tool_items, tool, &tool_name);
- break;
- case OB_MODE_VERTEX_PAINT:
- paint = &toolsettings->vpaint->paint;
- tool_offset = offsetof(Brush, vertexpaint_tool);
- tool = RNA_enum_get(op->ptr, "vertex_paint_tool");
- RNA_enum_name_from_value(rna_enum_brush_vertex_tool_items, tool, &tool_name);
- break;
- case OB_MODE_WEIGHT_PAINT:
- paint = &toolsettings->wpaint->paint;
- /* vertexpaint_tool is used for weight paint mode */
- tool_offset = offsetof(Brush, vertexpaint_tool);
- tool = RNA_enum_get(op->ptr, "weight_paint_tool");
- RNA_enum_name_from_value(rna_enum_brush_vertex_tool_items, tool, &tool_name);
- break;
- case OB_MODE_TEXTURE_PAINT:
- paint = &toolsettings->imapaint.paint;
- tool_offset = offsetof(Brush, imagepaint_tool);
- tool = RNA_enum_get(op->ptr, "texture_paint_tool");
- RNA_enum_name_from_value(rna_enum_brush_image_tool_items, tool, &tool_name);
- break;
- default:
- /* invalid paint mode */
- return OPERATOR_CANCELLED;
+ Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
+ const EnumPropertyItem *items = BKE_paint_get_tool_enum_from_paintmode(paint_mode);
+ const char *op_prop_id = BKE_paint_get_tool_prop_id_from_paintmode(paint_mode);
+
+ if (op_prop_id == NULL) {
+ return OPERATOR_CANCELLED;
}
- /* TODO(campbell): Use the toolsystem for now, ideally the toolsystem will display brushes directly
- * so we don't need to sync between tools and brushes. */
- int ret = brush_generic_tool_set(
- bmain, paint, tool, tool_offset,
- paint_mode, tool_name, create_missing,
+ const int tool = RNA_enum_get(op->ptr, op_prop_id);
+ RNA_enum_name_from_value(items, tool, &tool_name);
+ return brush_generic_tool_set(
+ bmain, paint, tool,
+ tool_name, create_missing,
toggle);
-
- if ((ret == OPERATOR_FINISHED) && (paint->brush != NULL)) {
- Brush *brush = paint->brush;
- WorkSpace *workspace = CTX_wm_workspace(C);
- if (WM_toolsystem_ref_set_by_name(C, workspace, NULL, brush->id.name + 2, true)) {
- /* ok */
- }
- }
- return ret;
}
static void PAINT_OT_brush_select(wmOperatorType *ot)
{
+ /* Keep names matching 'rna_enum_object_mode_items' (besides active). */
static const EnumPropertyItem paint_mode_items[] = {
- {OB_MODE_ACTIVE, "ACTIVE", 0, "Current", "Set brush for active paint mode"},
- {OB_MODE_SCULPT, "SCULPT", ICON_SCULPTMODE_HLT, "Sculpt", ""},
- {OB_MODE_VERTEX_PAINT, "VERTEX_PAINT", ICON_VPAINT_HLT, "Vertex Paint", ""},
- {OB_MODE_WEIGHT_PAINT, "WEIGHT_PAINT", ICON_WPAINT_HLT, "Weight Paint", ""},
- {OB_MODE_TEXTURE_PAINT, "TEXTURE_PAINT", ICON_TPAINT_HLT, "Texture Paint", ""},
+ {ePaintInvalid, "ACTIVE", 0, "Current", "Set brush for active paint mode"},
+ {ePaintSculpt, "SCULPT", ICON_SCULPTMODE_HLT, "Sculpt", ""},
+ {ePaintVertex, "VERTEX_PAINT", ICON_VPAINT_HLT, "Vertex Paint", ""},
+ {ePaintWeight, "WEIGHT_PAINT", ICON_WPAINT_HLT, "Weight Paint", ""},
+ {ePaintTexture3D, "TEXTURE_PAINT", ICON_TPAINT_HLT, "Texture Paint", ""},
+ {ePaintGpencil, "GPENCIL_PAINT", ICON_GREASEPENCIL, "Grease Pencil Paint", ""},
{0, NULL, 0, NULL, NULL}
};
PropertyRNA *prop;
@@ -539,46 +507,21 @@ static void PAINT_OT_brush_select(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* props */
- RNA_def_enum(ot->srna, "paint_mode", paint_mode_items, OB_MODE_ACTIVE, "Paint Mode", "");
- RNA_def_enum(ot->srna, "sculpt_tool", rna_enum_brush_sculpt_tool_items, 0, "Sculpt Tool", "");
- RNA_def_enum(ot->srna, "vertex_paint_tool", rna_enum_brush_vertex_tool_items, 0, "Vertex Paint Tool", "");
- RNA_def_enum(ot->srna, "weight_paint_tool", rna_enum_brush_vertex_tool_items, 0, "Weight Paint Tool", "");
- RNA_def_enum(ot->srna, "texture_paint_tool", rna_enum_brush_image_tool_items, 0, "Texture Paint Tool", "");
+ /* All properties are hidden, so as not to show the redo panel. */
+ prop = RNA_def_enum(ot->srna, "paint_mode", paint_mode_items, ePaintInvalid, "Paint Mode", "");
+ RNA_def_property_flag(prop, PROP_HIDDEN);
+
+ for (const EnumPropertyItem *item = paint_mode_items + 1; item->identifier; item++) {
+ const ePaintMode paint_mode = item->value;
+ const char *prop_id = BKE_paint_get_tool_prop_id_from_paintmode(paint_mode);
+ prop = RNA_def_enum(ot->srna, prop_id, BKE_paint_get_tool_enum_from_paintmode(paint_mode), 0, prop_id, "");
+ RNA_def_property_flag(prop, PROP_HIDDEN);
+ }
prop = RNA_def_boolean(ot->srna, "toggle", 0, "Toggle", "Toggle between two brushes rather than cycling");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
prop = RNA_def_boolean(ot->srna, "create_missing", 0, "Create Missing", "If the requested brush type does not exist, create a new brush");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
-}
-
-static wmKeyMapItem *keymap_brush_select(
- wmKeyMap *keymap, int paint_mode,
- int tool, int keymap_type,
- int keymap_modifier)
-{
- wmKeyMapItem *kmi;
- kmi = WM_keymap_add_item(
- keymap, "PAINT_OT_brush_select",
- keymap_type, KM_PRESS, keymap_modifier, 0);
-
- RNA_enum_set(kmi->ptr, "paint_mode", paint_mode);
-
- switch (paint_mode) {
- case OB_MODE_SCULPT:
- RNA_enum_set(kmi->ptr, "sculpt_tool", tool);
- break;
- case OB_MODE_VERTEX_PAINT:
- RNA_enum_set(kmi->ptr, "vertex_paint_tool", tool);
- break;
- case OB_MODE_WEIGHT_PAINT:
- RNA_enum_set(kmi->ptr, "weight_paint_tool", tool);
- break;
- case OB_MODE_TEXTURE_PAINT:
- RNA_enum_set(kmi->ptr, "texture_paint_tool", tool);
- break;
- }
-
- return kmi;
+ RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
}
static int brush_uv_sculpt_tool_set_exec(bContext *C, wmOperator *op)
@@ -1017,28 +960,6 @@ static void BRUSH_OT_stencil_reset_transform(wmOperatorType *ot)
}
-static void ed_keymap_stencil(wmKeyMap *keymap)
-{
- wmKeyMapItem *kmi;
-
- kmi = WM_keymap_add_item(keymap, "BRUSH_OT_stencil_control", RIGHTMOUSE, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", STENCIL_TRANSLATE);
- kmi = WM_keymap_add_item(keymap, "BRUSH_OT_stencil_control", RIGHTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "mode", STENCIL_SCALE);
- kmi = WM_keymap_add_item(keymap, "BRUSH_OT_stencil_control", RIGHTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "mode", STENCIL_ROTATE);
-
- kmi = WM_keymap_add_item(keymap, "BRUSH_OT_stencil_control", RIGHTMOUSE, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "mode", STENCIL_TRANSLATE);
- RNA_enum_set(kmi->ptr, "texmode", STENCIL_SECONDARY);
- kmi = WM_keymap_add_item(keymap, "BRUSH_OT_stencil_control", RIGHTMOUSE, KM_PRESS, KM_SHIFT | KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "texmode", STENCIL_SECONDARY);
- RNA_enum_set(kmi->ptr, "mode", STENCIL_SCALE);
- kmi = WM_keymap_add_item(keymap, "BRUSH_OT_stencil_control", RIGHTMOUSE, KM_PRESS, KM_CTRL | KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "texmode", STENCIL_SECONDARY);
- RNA_enum_set(kmi->ptr, "mode", STENCIL_ROTATE);
-}
-
/**************************** registration **********************************/
void ED_operatormacros_paint(void)
@@ -1141,382 +1062,40 @@ void ED_operatortypes_paint(void)
WM_operatortype_append(PAINT_OT_mask_lasso_gesture);
}
-static void ed_keymap_paint_brush_size(wmKeyMap *keymap, const char *UNUSED(path))
-{
- wmKeyMapItem *kmi;
-
- kmi = WM_keymap_add_item(keymap, "BRUSH_OT_scale_size", LEFTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_float_set(kmi->ptr, "scalar", 0.9);
-
- kmi = WM_keymap_add_item(keymap, "BRUSH_OT_scale_size", RIGHTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_float_set(kmi->ptr, "scalar", 10.0 / 9.0); // 1.1111....
-}
-
-static void set_brush_rc_path(
- PointerRNA *ptr, const char *brush_path,
- const char *output_name, const char *input_name)
-{
- char *path;
-
- path = BLI_sprintfN("%s.%s", brush_path, input_name);
- RNA_string_set(ptr, output_name, path);
- MEM_freeN(path);
-}
-
-void set_brush_rc_props(
- PointerRNA *ptr, const char *paint,
- const char *prop, const char *secondary_prop,
- RCFlags flags)
-{
- const char *ups_path = "tool_settings.unified_paint_settings";
- char *brush_path;
-
- brush_path = BLI_sprintfN("tool_settings.%s.brush", paint);
-
- set_brush_rc_path(ptr, brush_path, "data_path_primary", prop);
- if (secondary_prop) {
- set_brush_rc_path(ptr, ups_path, "use_secondary", secondary_prop);
- set_brush_rc_path(ptr, ups_path, "data_path_secondary", prop);
- }
- else {
- RNA_string_set(ptr, "use_secondary", "");
- RNA_string_set(ptr, "data_path_secondary", "");
- }
- set_brush_rc_path(ptr, brush_path, "color_path", "cursor_color_add");
- if (flags & RC_SECONDARY_ROTATION)
- set_brush_rc_path(ptr, brush_path, "rotation_path", "mask_texture_slot.angle");
- else
- set_brush_rc_path(ptr, brush_path, "rotation_path", "texture_slot.angle");
- RNA_string_set(ptr, "image_id", brush_path);
-
- if (flags & RC_COLOR) {
- set_brush_rc_path(ptr, brush_path, "fill_color_path", "color");
- }
- else {
- RNA_string_set(ptr, "fill_color_path", "");
- }
-
- if (flags & RC_COLOR_OVERRIDE) {
- RNA_string_set(ptr, "fill_color_override_path", "tool_settings.unified_paint_settings.color");
- RNA_string_set(ptr, "fill_color_override_test_path", "tool_settings.unified_paint_settings.use_unified_color");
- }
- else {
- RNA_string_set(ptr, "fill_color_override_path", "");
- RNA_string_set(ptr, "fill_color_override_test_path", "");
- }
-
- if (flags & RC_ZOOM)
- RNA_string_set(ptr, "zoom_path", "space_data.zoom");
- else
- RNA_string_set(ptr, "zoom_path", "");
-
- RNA_boolean_set(ptr, "secondary_tex", (flags & RC_SECONDARY_ROTATION) != 0);
-
- MEM_freeN(brush_path);
-}
-
-static void ed_keymap_paint_brush_radial_control(
- wmKeyMap *keymap, const char *paint,
- RCFlags flags)
-{
- wmKeyMapItem *kmi;
- /* only size needs to follow zoom, strength shows fixed size circle */
- int flags_nozoom = flags & (~RC_ZOOM);
- int flags_noradial_secondary = flags & (~(RC_SECONDARY_ROTATION | RC_ZOOM));
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, 0, 0);
- set_brush_rc_props(kmi->ptr, paint, "size", "use_unified_size", flags);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0);
- set_brush_rc_props(kmi->ptr, paint, "strength", "use_unified_strength", flags_nozoom);
-
- if (flags & RC_WEIGHT) {
- kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", WKEY, KM_PRESS, 0, 0);
- set_brush_rc_props(kmi->ptr, paint, "weight", "use_unified_weight", flags_nozoom);
- }
-
- if (flags & RC_ROTATION) {
- kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, KM_CTRL, 0);
- set_brush_rc_props(kmi->ptr, paint, "texture_slot.angle", NULL, flags_noradial_secondary);
- }
-
- if (flags & RC_SECONDARY_ROTATION) {
- kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- set_brush_rc_props(kmi->ptr, paint, "mask_texture_slot.angle", NULL, flags_nozoom);
- }
-}
-
-static void paint_partial_visibility_keys(wmKeyMap *keymap)
-{
- wmKeyMapItem *kmi;
-
- /* Partial visibility */
- kmi = WM_keymap_add_item(keymap, "PAINT_OT_hide_show", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "action", PARTIALVIS_SHOW);
- RNA_enum_set(kmi->ptr, "area", PARTIALVIS_INSIDE);
- kmi = WM_keymap_add_item(keymap, "PAINT_OT_hide_show", HKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", PARTIALVIS_HIDE);
- RNA_enum_set(kmi->ptr, "area", PARTIALVIS_INSIDE);
- kmi = WM_keymap_add_item(keymap, "PAINT_OT_hide_show", HKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", PARTIALVIS_SHOW);
- RNA_enum_set(kmi->ptr, "area", PARTIALVIS_ALL);
-}
-
-
-static void paint_keymap_curve(wmKeyMap *keymap)
-{
- wmKeyMapItem *kmi;
-
- WM_keymap_add_item(keymap, "PAINTCURVE_OT_add_point_slide", ACTIONMOUSE, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "PAINTCURVE_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
- kmi = WM_keymap_add_item(keymap, "PAINTCURVE_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- WM_keymap_add_item(keymap, "PAINTCURVE_OT_slide", ACTIONMOUSE, KM_PRESS, 0, 0);
- kmi = WM_keymap_add_item(keymap, "PAINTCURVE_OT_slide", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "align", true);
- kmi = WM_keymap_add_item(keymap, "PAINTCURVE_OT_select", AKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "toggle", true);
-
- WM_keymap_add_item(keymap, "PAINTCURVE_OT_cursor", ACTIONMOUSE, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "PAINTCURVE_OT_delete_point", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "PAINTCURVE_OT_delete_point", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "PAINTCURVE_OT_draw", RETKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "PAINTCURVE_OT_draw", PADENTER, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "TRANSFORM_OT_translate", GKEY, KM_PRESS, 0, 0);
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_translate", EVT_TWEAK_S, KM_ANY, 0, 0);
- WM_keymap_add_item(keymap, "TRANSFORM_OT_rotate", RKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "TRANSFORM_OT_resize", SKEY, KM_PRESS, 0, 0);
-}
-
void ED_keymap_paint(wmKeyConfig *keyconf)
{
wmKeyMap *keymap;
- wmKeyMapItem *kmi;
- int i;
keymap = WM_keymap_ensure(keyconf, "Paint Curve", 0, 0);
keymap->poll = paint_curve_poll;
- paint_keymap_curve(keymap);
-
/* Sculpt mode */
keymap = WM_keymap_ensure(keyconf, "Sculpt", 0, 0);
keymap->poll = sculpt_mode_poll;
- RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "mode", BRUSH_STROKE_NORMAL);
- RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "mode", BRUSH_STROKE_INVERT);
- RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", BRUSH_STROKE_SMOOTH);
-
- /* Partial visibility, sculpt-only for now */
- paint_partial_visibility_keys(keymap);
-
- for (i = 0; i <= 5; i++)
- RNA_int_set(WM_keymap_add_item(keymap, "OBJECT_OT_subdivision_set", ZEROKEY + i, KM_PRESS, KM_CTRL, 0)->ptr, "level", i);
-
- /* Clear mask */
- kmi = WM_keymap_add_item(keymap, "PAINT_OT_mask_flood_fill", MKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "mode", PAINT_MASK_FLOOD_VALUE);
- RNA_float_set(kmi->ptr, "value", 0);
-
- /* Invert mask */
- kmi = WM_keymap_add_item(keymap, "PAINT_OT_mask_flood_fill", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "mode", PAINT_MASK_INVERT);
-
- WM_keymap_add_item(keymap, "PAINT_OT_mask_lasso_gesture", LEFTMOUSE, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
-
- /* Toggle mask visibility */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "scene.tool_settings.sculpt.show_mask");
-
- /* Toggle dynamic topology */
- WM_keymap_add_item(keymap, "SCULPT_OT_dynamic_topology_toggle", DKEY, KM_PRESS, KM_CTRL, 0);
-
- /* Dynamic-topology detail size
- *
- * This should be improved further, perhaps by showing a triangle
- * grid rather than brush alpha */
- kmi = WM_keymap_add_item(keymap, "SCULPT_OT_set_detail_size", DKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* multires switch */
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_subdivision_set", PAGEUPKEY, KM_PRESS, 0, 0);
- RNA_int_set(kmi->ptr, "level", 1);
- RNA_boolean_set(kmi->ptr, "relative", true);
-
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_subdivision_set", PAGEDOWNKEY, KM_PRESS, 0, 0);
- RNA_int_set(kmi->ptr, "level", -1);
- RNA_boolean_set(kmi->ptr, "relative", true);
-
- ed_keymap_paint_brush_size(keymap, "tool_settings.sculpt.brush.size");
- ed_keymap_paint_brush_radial_control(keymap, "sculpt", RC_ROTATION);
-
- ed_keymap_stencil(keymap);
-
- keymap_brush_select(keymap, OB_MODE_SCULPT, SCULPT_TOOL_DRAW, XKEY, 0);
- keymap_brush_select(keymap, OB_MODE_SCULPT, SCULPT_TOOL_SMOOTH, SKEY, 0);
- keymap_brush_select(keymap, OB_MODE_SCULPT, SCULPT_TOOL_PINCH, PKEY, 0);
- keymap_brush_select(keymap, OB_MODE_SCULPT, SCULPT_TOOL_INFLATE, IKEY, 0);
- keymap_brush_select(keymap, OB_MODE_SCULPT, SCULPT_TOOL_GRAB, GKEY, 0);
- keymap_brush_select(keymap, OB_MODE_SCULPT, SCULPT_TOOL_LAYER, LKEY, 0);
- keymap_brush_select(keymap, OB_MODE_SCULPT, SCULPT_TOOL_FLATTEN, TKEY, KM_SHIFT);
- keymap_brush_select(keymap, OB_MODE_SCULPT, SCULPT_TOOL_CLAY, CKEY, 0);
- keymap_brush_select(keymap, OB_MODE_SCULPT, SCULPT_TOOL_CREASE, CKEY, KM_SHIFT);
- keymap_brush_select(keymap, OB_MODE_SCULPT, SCULPT_TOOL_SNAKE_HOOK, KKEY, 0);
- kmi = keymap_brush_select(keymap, OB_MODE_SCULPT, SCULPT_TOOL_MASK, MKEY, 0);
- RNA_boolean_set(kmi->ptr, "toggle", 1);
- RNA_boolean_set(kmi->ptr, "create_missing", 1);
-
- /* */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_menu_enum", EKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.stroke_method");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", SKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.use_smooth_stroke");
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_angle_control", RKEY, KM_PRESS, 0, 0);
-
/* Vertex Paint mode */
keymap = WM_keymap_ensure(keyconf, "Vertex Paint", 0, 0);
keymap->poll = vertex_paint_mode_poll;
- WM_keymap_verify_item(keymap, "PAINT_OT_vertex_paint", LEFTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "PAINT_OT_brush_colors_flip", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "PAINT_OT_sample_color", SKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "PAINT_OT_vertex_color_set", KKEY, KM_PRESS, KM_SHIFT, 0);
-
- ed_keymap_paint_brush_size(keymap, "tool_settings.vertex_paint.brush.size");
- ed_keymap_paint_brush_radial_control(keymap, "vertex_paint", RC_COLOR | RC_COLOR_OVERRIDE | RC_ROTATION);
-
- ed_keymap_stencil(keymap);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* mask toggle */
- RNA_string_set(kmi->ptr, "data_path", "vertex_paint_object.data.use_paint_mask");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", SKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.vertex_paint.brush.use_smooth_stroke");
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_angle_control", RKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_menu_enum", EKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.vertex_paint.brush.stroke_method");
-
/* Weight Paint mode */
keymap = WM_keymap_ensure(keyconf, "Weight Paint", 0, 0);
keymap->poll = weight_paint_mode_poll;
- WM_keymap_verify_item(keymap, "PAINT_OT_weight_paint", LEFTMOUSE, KM_PRESS, 0, 0);
-
- /* these keys are from 2.4x but could be changed */
- WM_keymap_verify_item(keymap, "PAINT_OT_weight_sample", ACTIONMOUSE, KM_PRESS, KM_CTRL, 0);
- WM_keymap_verify_item(keymap, "PAINT_OT_weight_sample_group", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_weight_gradient", LEFTMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "type", WPAINT_GRADIENT_TYPE_LINEAR);
- RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_weight_gradient", LEFTMOUSE, KM_PRESS, KM_ALT | KM_CTRL, 0)->ptr, "type", WPAINT_GRADIENT_TYPE_RADIAL);
-
- WM_keymap_add_item(keymap, "PAINT_OT_weight_set", KKEY, KM_PRESS, KM_SHIFT, 0);
-
- ed_keymap_paint_brush_size(keymap, "tool_settings.weight_paint.brush.size");
- ed_keymap_paint_brush_radial_control(keymap, "weight_paint", RC_WEIGHT);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_menu_enum", EKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.vertex_paint.brush.stroke_method");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* face mask toggle */
- RNA_string_set(kmi->ptr, "data_path", "weight_paint_object.data.use_paint_mask");
-
- /* note, conflicts with vertex paint, but this is more useful */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", VKEY, KM_PRESS, 0, 0); /* vert mask toggle */
- RNA_string_set(kmi->ptr, "data_path", "weight_paint_object.data.use_paint_mask_vertex");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", SKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.weight_paint.brush.use_smooth_stroke");
-
/*Weight paint's Vertex Selection Mode */
keymap = WM_keymap_ensure(keyconf, "Weight Paint Vertex Selection", 0, 0);
keymap->poll = vert_paint_poll;
- kmi = WM_keymap_add_item(keymap, "PAINT_OT_vert_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "PAINT_OT_vert_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "PAINT_OT_vert_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
- WM_keymap_add_item(keymap, "VIEW3D_OT_select_border", BKEY, KM_PRESS, 0, 0);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "mode", SEL_OP_ADD);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_SHIFT | KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "mode", SEL_OP_SUB);
- WM_keymap_add_item(keymap, "VIEW3D_OT_select_circle", CKEY, KM_PRESS, 0, 0);
/* Image/Texture Paint mode */
keymap = WM_keymap_ensure(keyconf, "Image Paint", 0, 0);
keymap->poll = image_texture_paint_poll;
- RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_image_paint", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "mode", BRUSH_STROKE_NORMAL);
- RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_image_paint", LEFTMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "mode", BRUSH_STROKE_INVERT);
- WM_keymap_add_item(keymap, "PAINT_OT_brush_colors_flip", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "PAINT_OT_grab_clone", RIGHTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "PAINT_OT_sample_color", SKEY, KM_PRESS, 0, 0);
-
- ed_keymap_paint_brush_size(keymap, "tool_settings.image_paint.brush.size");
- ed_keymap_paint_brush_radial_control(
- keymap, "image_paint",
- RC_COLOR | RC_COLOR_OVERRIDE | RC_ZOOM | RC_ROTATION | RC_SECONDARY_ROTATION);
-
- ed_keymap_stencil(keymap);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* mask toggle */
- RNA_string_set(kmi->ptr, "data_path", "image_paint_object.data.use_paint_mask");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", SKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.image_paint.brush.use_smooth_stroke");
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_angle_control", RKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_menu_enum", EKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.image_paint.brush.stroke_method");
-
/* face-mask mode */
keymap = WM_keymap_ensure(keyconf, "Face Mask", 0, 0);
keymap->poll = facemask_paint_poll;
- kmi = WM_keymap_add_item(keymap, "PAINT_OT_face_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "PAINT_OT_face_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "PAINT_OT_face_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
- kmi = WM_keymap_add_item(keymap, "PAINT_OT_face_select_hide", HKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
- kmi = WM_keymap_add_item(keymap, "PAINT_OT_face_select_hide", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
- WM_keymap_add_item(keymap, "PAINT_OT_face_select_reveal", HKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "PAINT_OT_face_select_linked", LKEY, KM_PRESS, KM_CTRL, 0);
- kmi = WM_keymap_add_item(keymap, "PAINT_OT_face_select_linked_pick", LKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- kmi = WM_keymap_add_item(keymap, "PAINT_OT_face_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", true);
-
keymap = WM_keymap_ensure(keyconf, "UV Sculpt", 0, 0);
keymap->poll = uv_sculpt_keymap_poll;
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", QKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.use_uv_sculpt");
-
- RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_uv_sculpt_stroke", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "mode", BRUSH_STROKE_NORMAL);
- RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_uv_sculpt_stroke", LEFTMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "mode", BRUSH_STROKE_INVERT);
- RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_uv_sculpt_stroke", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", BRUSH_STROKE_SMOOTH);
-
- ed_keymap_paint_brush_size(keymap, "tool_settings.uv_sculpt.brush.size");
- ed_keymap_paint_brush_radial_control(keymap, "uv_sculpt", 0);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_uv_sculpt_tool_set", SKEY, KM_PRESS, 0, 0)->ptr, "tool", UV_SCULPT_TOOL_RELAX);
- RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_uv_sculpt_tool_set", PKEY, KM_PRESS, 0, 0)->ptr, "tool", UV_SCULPT_TOOL_PINCH);
- RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_uv_sculpt_tool_set", GKEY, KM_PRESS, 0, 0)->ptr, "tool", UV_SCULPT_TOOL_GRAB);
-
/* paint stroke */
keymap = paint_stroke_modal_keymap(keyconf);
WM_modalkeymap_assign(keymap, "SCULPT_OT_brush_stroke");
diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c
index b5d68786664..af2ed032931 100644
--- a/source/blender/editors/sculpt_paint/paint_stroke.c
+++ b/source/blender/editors/sculpt_paint/paint_stroke.c
@@ -414,7 +414,7 @@ static bool paint_brush_update(
if ((do_random || do_random_mask) && stroke->rng == NULL) {
/* Lazy initialization. */
uint rng_seed = (uint)(PIL_check_seconds_timer_i() & UINT_MAX);
- rng_seed ^= (uint)GET_INT_FROM_POINTER(brush);
+ rng_seed ^= (uint)POINTER_AS_INT(brush);
stroke->rng = BLI_rng_new(rng_seed);
}
@@ -459,7 +459,7 @@ static bool paint_stroke_use_jitter(ePaintMode mode, Brush *brush, bool invert)
/* jitter-ed brush gives weird and unpredictable result for this
* kinds of stroke, so manually disable jitter usage (sergey) */
use_jitter &= (brush->flag & (BRUSH_DRAG_DOT | BRUSH_ANCHORED)) == 0;
- use_jitter &= (!ELEM(mode, ePaintTexture2D, ePaintTextureProjective) ||
+ use_jitter &= (!ELEM(mode, ePaintTexture2D, ePaintTexture3D) ||
!(invert && brush->imagepaint_tool == PAINT_TOOL_CLONE));
@@ -862,7 +862,7 @@ bool paint_supports_dynamic_size(Brush *br, ePaintMode mode)
break;
case ePaintTexture2D: /* fall through */
- case ePaintTextureProjective:
+ case ePaintTexture3D:
if ((br->imagepaint_tool == PAINT_TOOL_FILL) &&
(br->flag & BRUSH_USE_GRADIENT))
{
@@ -898,7 +898,7 @@ bool paint_supports_smooth_stroke(Brush *br, ePaintMode mode)
bool paint_supports_texture(ePaintMode mode)
{
/* omit: PAINT_WEIGHT, PAINT_SCULPT_UV, PAINT_INVALID */
- return ELEM(mode, ePaintSculpt, ePaintVertex, ePaintTextureProjective, ePaintTexture2D);
+ return ELEM(mode, ePaintSculpt, ePaintVertex, ePaintTexture3D, ePaintTexture2D);
}
/* return true if the brush size can change during paint (normally used for pressure) */
@@ -938,10 +938,6 @@ struct wmKeyMap *paint_stroke_modal_keymap(struct wmKeyConfig *keyconf)
/* this function is called for each spacetype, only needs to add map once */
if (!keymap) {
keymap = WM_modalkeymap_add(keyconf, name, modal_items);
-
- /* items for modal map */
- WM_modalkeymap_add_item(
- keymap, ESCKEY, KM_PRESS, KM_ANY, 0, PAINT_STROKE_MODAL_CANCEL);
}
return keymap;
@@ -1201,8 +1197,10 @@ int paint_stroke_modal(bContext *C, wmOperator *op, const wmEvent *event)
return OPERATOR_FINISHED;
if (paint_supports_smooth_stroke(br, mode))
- stroke->stroke_cursor =
- WM_paint_cursor_activate(CTX_wm_manager(C), paint_poll, paint_draw_smooth_cursor, stroke);
+ stroke->stroke_cursor = WM_paint_cursor_activate(
+ CTX_wm_manager(C),
+ SPACE_TYPE_ANY, RGN_TYPE_ANY,
+ paint_poll, paint_draw_smooth_cursor, stroke);
stroke->stroke_init = true;
first_modal = true;
@@ -1220,8 +1218,10 @@ int paint_stroke_modal(bContext *C, wmOperator *op, const wmEvent *event)
stroke->timer = WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, stroke->brush->rate);
if (br->flag & BRUSH_LINE) {
- stroke->stroke_cursor =
- WM_paint_cursor_activate(CTX_wm_manager(C), paint_poll, paint_draw_line_cursor, stroke);
+ stroke->stroke_cursor = WM_paint_cursor_activate(
+ CTX_wm_manager(C),
+ SPACE_TYPE_ANY, RGN_TYPE_ANY,
+ paint_poll, paint_draw_line_cursor, stroke);
}
first_dab = true;
diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c
index e914a24092e..9057c3b0609 100644
--- a/source/blender/editors/sculpt_paint/paint_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_utils.c
@@ -53,6 +53,7 @@
#include "BKE_customdata.h"
#include "BKE_image.h"
#include "BKE_material.h"
+#include "BKE_mesh_runtime.h"
#include "BKE_object.h"
#include "BKE_paint.h"
#include "BKE_report.h"
@@ -285,13 +286,15 @@ static void imapaint_tri_weights(
/* compute uv coordinates of mouse in face */
static void imapaint_pick_uv(Mesh *me_eval, Scene *scene, Object *ob_eval, unsigned int faceindex, const int xy[2], float uv[2])
{
- const int tottri = me_eval->runtime.looptris.len;
int i, findex;
float p[2], w[3], absw, minabsw;
float matrix[4][4], proj[4][4];
GLint view[4];
const eImagePaintMode mode = scene->toolsettings->imapaint.mode;
- const MLoopTri *lt = me_eval->runtime.looptris.array;
+
+ const MLoopTri *lt = BKE_mesh_runtime_looptri_ensure(me_eval);
+ const int tottri = me_eval->runtime.looptris.len;
+
const MVert *mvert = me_eval->mvert;
const MPoly *mpoly = me_eval->mpoly;
const MLoop *mloop = me_eval->mloop;
@@ -327,7 +330,7 @@ static void imapaint_pick_uv(Mesh *me_eval, Scene *scene, Object *ob_eval, unsig
const Material *ma;
const TexPaintSlot *slot;
- ma = give_current_material(ob_eval, mp->mat_nr);
+ ma = give_current_material(ob_eval, mp->mat_nr + 1);
slot = &ma->texpaintslot[ma->paint_active_slot];
if (!(slot && slot->uvname &&
@@ -466,7 +469,7 @@ void paint_sample_color(bContext *C, ARegion *ar, int x, int y, bool texpaint_pr
if (ob) {
Mesh *me = (Mesh *)ob->data;
- Mesh *me_eval = BKE_object_get_evaluated_mesh(depsgraph, ob); /* Or shall we just do ob_eval->mesh_eval ? */
+ Mesh *me_eval = ob_eval->runtime.mesh_eval;
ViewContext vc;
const int mval[2] = {x, y};
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index edbe3caf333..bf20146f195 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -76,6 +76,9 @@
#include "ED_screen.h"
#include "ED_view3d.h"
+/* For IMB_BlendMode only. */
+#include "IMB_imbuf.h"
+
#include "bmesh.h"
#include "BKE_ccg.h"
@@ -153,9 +156,17 @@ static bool vwpaint_use_normal(const VPaint *vp)
((vp->paint.brush->flag & BRUSH_FRONTFACE_FALLOFF) != 0);
}
-static bool brush_use_accumulate(const Brush *brush)
+static bool brush_use_accumulate_ex(const Brush *brush, const int ob_mode)
+{
+ return ((brush->flag & BRUSH_ACCUMULATE) != 0 ||
+ (ob_mode == OB_MODE_VERTEX_PAINT ?
+ (brush->vertexpaint_tool == VPAINT_TOOL_SMEAR) :
+ (brush->weightpaint_tool == WPAINT_TOOL_SMEAR)));
+}
+
+static bool brush_use_accumulate(const VPaint *vp)
{
- return (brush->flag & BRUSH_ACCUMULATE) != 0 || brush->vertexpaint_tool == PAINT_BLEND_SMEAR;
+ return brush_use_accumulate_ex(vp->paint.brush, vp->paint.runtime.ob_mode);
}
static MDeformVert *defweight_prev_init(MDeformVert *dvert_prev, MDeformVert *dvert_curr, int index)
@@ -173,12 +184,12 @@ static MDeformVert *defweight_prev_init(MDeformVert *dvert_prev, MDeformVert *dv
* (without rebuilding the 'derivedFinal') */
static bool vertex_paint_use_fast_update_check(Object *ob)
{
- DerivedMesh *dm = ob->derivedFinal;
+ Mesh *me_eval = ob->runtime.mesh_eval;
- if (dm) {
+ if (me_eval != NULL) {
Mesh *me = BKE_mesh_from_object(ob);
if (me && me->mloopcol) {
- return (me->mloopcol == CustomData_get_layer(&dm->loopData, CD_MLOOPCOL));
+ return (me->mloopcol == CustomData_get_layer(&me_eval->ldata, CD_MLOOPCOL));
}
}
@@ -274,20 +285,11 @@ bool weight_paint_poll_ignore_tool(bContext *C)
return weight_paint_poll_ex(C, false);
}
-static VPaint *new_vpaint(void)
-{
- VPaint *vp = MEM_callocN(sizeof(VPaint), "VPaint");
-
- vp->paint.flags |= PAINT_SHOW_BRUSH;
-
- return vp;
-}
-
-uint vpaint_get_current_col(Scene *scene, VPaint *vp)
+uint vpaint_get_current_col(Scene *scene, VPaint *vp, bool secondary)
{
Brush *brush = BKE_paint_brush(&vp->paint);
uchar col[4];
- rgb_float_to_uchar(col, BKE_brush_color_get(scene, brush));
+ rgb_float_to_uchar(col, secondary ? BKE_brush_secondary_color_get(scene, brush) : BKE_brush_color_get(scene, brush));
col[3] = 255; /* alpha isn't used, could even be removed to speedup paint a little */
return *(uint *)col;
}
@@ -300,16 +302,16 @@ static uint vpaint_blend(
const int brush_alpha_value_i)
{
const Brush *brush = vp->paint.brush;
- const int tool = brush->vertexpaint_tool;
+ const IMB_BlendMode blend = brush->blend;
- uint color_blend = ED_vpaint_blend_tool(tool, color_curr, color_paint, alpha_i);
+ uint color_blend = ED_vpaint_blend_tool(blend, color_curr, color_paint, alpha_i);
/* if no accumulate, clip color adding with colorig & orig alpha */
- if (!brush_use_accumulate(brush)) {
+ if (!brush_use_accumulate(vp)) {
uint color_test, a;
char *cp, *ct, *co;
- color_test = ED_vpaint_blend_tool(tool, color_orig, color_paint, brush_alpha_value_i);
+ color_test = ED_vpaint_blend_tool(blend, color_orig, color_paint, brush_alpha_value_i);
cp = (char *)&color_blend;
ct = (char *)&color_test;
@@ -328,7 +330,7 @@ static uint vpaint_blend(
}
if ((brush->flag & BRUSH_LOCK_ALPHA) &&
- !ELEM(tool, PAINT_BLEND_ALPHA_SUB, PAINT_BLEND_ALPHA_ADD))
+ !ELEM(blend, IMB_BLEND_ERASE_ALPHA, IMB_BLEND_ADD_ALPHA))
{
char *cp, *cc;
cp = (char *)&color_blend;
@@ -372,24 +374,25 @@ static float wpaint_blend(
const short do_flip)
{
const Brush *brush = wp->paint.brush;
- int tool = brush->vertexpaint_tool;
+ IMB_BlendMode blend = brush->blend;
if (do_flip) {
- switch (tool) {
- case PAINT_BLEND_MIX:
+ switch (blend) {
+ case IMB_BLEND_MIX:
paintval = 1.f - paintval; break;
- case PAINT_BLEND_ADD:
- tool = PAINT_BLEND_SUB; break;
- case PAINT_BLEND_SUB:
- tool = PAINT_BLEND_ADD; break;
- case PAINT_BLEND_LIGHTEN:
- tool = PAINT_BLEND_DARKEN; break;
- case PAINT_BLEND_DARKEN:
- tool = PAINT_BLEND_LIGHTEN; break;
+ case IMB_BLEND_ADD:
+ blend = IMB_BLEND_SUB; break;
+ case IMB_BLEND_SUB:
+ blend = IMB_BLEND_ADD; break;
+ case IMB_BLEND_LIGHTEN:
+ blend = IMB_BLEND_DARKEN; break;
+ case IMB_BLEND_DARKEN:
+ blend = IMB_BLEND_LIGHTEN; break;
+ default: break;
}
}
- weight = ED_wpaint_blend_tool(tool, weight, paintval, alpha);
+ weight = ED_wpaint_blend_tool(blend, weight, paintval, alpha);
CLAMP(weight, 0.0f, 1.0f);
@@ -768,7 +771,7 @@ static void do_weight_paint_vertex_single(
dw_mirr = NULL;
}
- if (!brush_use_accumulate(wp->paint.brush)) {
+ if (!brush_use_accumulate(wp)) {
MDeformVert *dvert_prev = ob->sculpt->mode.wpaint.dvert_prev;
MDeformVert *dv_prev = defweight_prev_init(dvert_prev, me->dvert, index);
if (index_mirr != -1) {
@@ -884,7 +887,7 @@ static void do_weight_paint_vertex_multi(
return;
}
- if (!brush_use_accumulate(wp->paint.brush)) {
+ if (!brush_use_accumulate(wp)) {
MDeformVert *dvert_prev = ob->sculpt->mode.wpaint.dvert_prev;
MDeformVert *dv_prev = defweight_prev_init(dvert_prev, me->dvert, index);
if (index_mirr != -1) {
@@ -987,15 +990,12 @@ static void vertex_paint_init_session_data(const ToolSettings *ts, Object *ob)
{
/* Create maps */
struct SculptVertexPaintGeomMap *gmap = NULL;
- const Brush *brush = NULL;
if (ob->mode == OB_MODE_VERTEX_PAINT) {
gmap = &ob->sculpt->mode.vpaint.gmap;
- brush = BKE_paint_brush(&ts->vpaint->paint);
BLI_assert(ob->sculpt->mode_type == OB_MODE_VERTEX_PAINT);
}
else if (ob->mode == OB_MODE_WEIGHT_PAINT) {
gmap = &ob->sculpt->mode.wpaint.gmap;
- brush = BKE_paint_brush(&ts->wpaint->paint);
BLI_assert(ob->sculpt->mode_type == OB_MODE_WEIGHT_PAINT);
}
else {
@@ -1023,7 +1023,7 @@ static void vertex_paint_init_session_data(const ToolSettings *ts, Object *ob)
/* Create average brush arrays */
if (ob->mode == OB_MODE_VERTEX_PAINT) {
- if (!brush_use_accumulate(brush)) {
+ if (!brush_use_accumulate(ts->vpaint)) {
if (ob->sculpt->mode.vpaint.previous_color == NULL) {
ob->sculpt->mode.vpaint.previous_color =
MEM_callocN(me->totloop * sizeof(uint), __func__);
@@ -1034,7 +1034,7 @@ static void vertex_paint_init_session_data(const ToolSettings *ts, Object *ob)
}
}
else if (ob->mode == OB_MODE_WEIGHT_PAINT) {
- if (!brush_use_accumulate(brush)) {
+ if (!brush_use_accumulate(ts->wpaint)) {
if (ob->sculpt->mode.wpaint.alpha_weight == NULL) {
ob->sculpt->mode.wpaint.alpha_weight =
MEM_callocN(me->totvert * sizeof(float), __func__);
@@ -1082,10 +1082,7 @@ static void ed_vwpaintmode_enter_generic(
const ePaintMode paint_mode = ePaintVertex;
ED_mesh_color_ensure(me, NULL);
- if (scene->toolsettings->vpaint == NULL) {
- scene->toolsettings->vpaint = new_vpaint();
- }
-
+ BKE_paint_ensure(scene->toolsettings, (Paint **)&scene->toolsettings->vpaint);
Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
paint_cursor_start_explicit(paint, wm, vertex_paint_poll);
BKE_paint_init(bmain, scene, paint_mode, PAINT_CURSOR_VERTEX_PAINT);
@@ -1093,10 +1090,7 @@ static void ed_vwpaintmode_enter_generic(
else if (mode_flag == OB_MODE_WEIGHT_PAINT) {
const ePaintMode paint_mode = ePaintWeight;
- if (scene->toolsettings->wpaint == NULL) {
- scene->toolsettings->wpaint = new_vpaint();
- }
-
+ BKE_paint_ensure(scene->toolsettings, (Paint **)&scene->toolsettings->wpaint);
Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
paint_cursor_start_explicit(paint, wm, weight_paint_poll);
BKE_paint_init(bmain, scene, paint_mode, PAINT_CURSOR_WEIGHT_PAINT);
@@ -1247,6 +1241,7 @@ static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op)
const int mode_flag = OB_MODE_WEIGHT_PAINT;
const bool is_mode_set = (ob->mode & mode_flag) != 0;
Scene *scene = CTX_data_scene(C);
+ ToolSettings *ts = scene->toolsettings;
if (!is_mode_set) {
if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
@@ -1263,6 +1258,7 @@ static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op)
Depsgraph *depsgraph = CTX_data_depsgraph_on_load(C);
wmWindowManager *wm = CTX_wm_manager(C);
ED_object_wpaintmode_enter_ex(bmain, depsgraph, wm, scene, ob);
+ BKE_paint_toolslots_brush_validate(bmain, &ts->wpaint->paint);
}
/* Weightpaint works by overriding colors in mesh,
@@ -1401,7 +1397,7 @@ static void vwpaint_update_cache_variants(bContext *C, VPaint *vp, Object *ob, P
Brush *brush = BKE_paint_brush(&vp->paint);
/* This effects the actual brush radius, so things farther away
- * are compared with a larger radius and vise versa. */
+ * are compared with a larger radius and vice versa. */
if (cache->first_time) {
RNA_float_get_array(ptr, "location", cache->true_location);
}
@@ -1557,7 +1553,7 @@ static bool wpaint_stroke_test_start(bContext *C, wmOperator *op, const float mo
wpd->mirror.lock = tmpflags;
}
- if (ELEM(vp->paint.brush->vertexpaint_tool, PAINT_BLEND_SMEAR, PAINT_BLEND_BLUR)) {
+ if (ELEM(vp->paint.brush->weightpaint_tool, WPAINT_TOOL_SMEAR, WPAINT_TOOL_BLUR)) {
wpd->precomputed_weight = MEM_mallocN(sizeof(float) * me->totvert, __func__);
}
@@ -1625,7 +1621,7 @@ static void do_wpaint_precompute_weight_cb_ex(
static void precompute_weight_values(
bContext *C, Object *ob, Brush *brush, struct WPaintData *wpd, WeightPaintInfo *wpi, Mesh *me)
{
- if (wpd->precomputed_weight_ready && !brush_use_accumulate(brush))
+ if (wpd->precomputed_weight_ready && !brush_use_accumulate_ex(brush, ob->mode))
return;
/* threaded loop over vertices */
@@ -1651,7 +1647,8 @@ static void do_wpaint_brush_blur_task_cb_ex(
{
SculptThreadedTaskData *data = userdata;
SculptSession *ss = data->ob->sculpt;
- CCGDerivedMesh *ccgdm = BKE_pbvh_get_ccgdm(ss->pbvh);
+ const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh);
+ const bool has_grids = (pbvh_type == PBVH_GRIDS);
const struct SculptVertexPaintGeomMap *gmap = &ss->mode.wpaint.gmap;
const Brush *brush = data->brush;
@@ -1678,8 +1675,8 @@ static void do_wpaint_brush_blur_task_cb_ex(
if (sculpt_brush_test_sq_fn(&test, vd.co)) {
/* For grid based pbvh, take the vert whose loop coopresponds to the current grid.
* Otherwise, take the current vert. */
- const int v_index = ccgdm ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
- const float grid_alpha = ccgdm ? 1.0f / vd.gridsize : 1.0f;
+ const int v_index = has_grids ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
+ const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f;
const char v_flag = data->me->mvert[v_index].flag;
/* If the vertex is selected */
if (!(use_face_sel || use_vert_sel) || v_flag & SELECT) {
@@ -1723,7 +1720,7 @@ static void do_wpaint_brush_blur_task_cb_ex(
}
weight_final /= total_hit_loops;
- /* Only paint visable verts */
+ /* Only paint visible verts */
do_weight_paint_vertex(
data->vp, data->ob, data->wpi,
v_index, final_alpha, weight_final);
@@ -1742,7 +1739,8 @@ static void do_wpaint_brush_smear_task_cb_ex(
{
SculptThreadedTaskData *data = userdata;
SculptSession *ss = data->ob->sculpt;
- CCGDerivedMesh *ccgdm = BKE_pbvh_get_ccgdm(ss->pbvh);
+ const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh);
+ const bool has_grids = (pbvh_type == PBVH_GRIDS);
const struct SculptVertexPaintGeomMap *gmap = &ss->mode.wpaint.gmap;
const Brush *brush = data->brush;
@@ -1774,8 +1772,8 @@ static void do_wpaint_brush_smear_task_cb_ex(
if (sculpt_brush_test_sq_fn(&test, vd.co)) {
/* For grid based pbvh, take the vert whose loop cooresponds to the current grid.
* Otherwise, take the current vert. */
- const int v_index = ccgdm ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
- const float grid_alpha = ccgdm ? 1.0f / vd.gridsize : 1.0f;
+ const int v_index = has_grids ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
+ const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f;
const MVert *mv_curr = &data->me->mvert[v_index];
/* If the vertex is selected */
@@ -1851,7 +1849,8 @@ static void do_wpaint_brush_draw_task_cb_ex(
{
SculptThreadedTaskData *data = userdata;
SculptSession *ss = data->ob->sculpt;
- CCGDerivedMesh *ccgdm = BKE_pbvh_get_ccgdm(ss->pbvh);
+ const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh);
+ const bool has_grids = (pbvh_type == PBVH_GRIDS);
const Scene *scene = CTX_data_scene(data->C);
const Brush *brush = data->brush;
@@ -1880,8 +1879,8 @@ static void do_wpaint_brush_draw_task_cb_ex(
/* Note: grids are 1:1 with corners (aka loops).
* For multires, take the vert whose loop cooresponds to the current grid.
* Otherwise, take the current vert. */
- const int v_index = ccgdm ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
- const float grid_alpha = ccgdm ? 1.0f / vd.gridsize : 1.0f;
+ const int v_index = has_grids ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
+ const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f;
const char v_flag = data->me->mvert[v_index].flag;
/* If the vertex is selected */
@@ -1924,7 +1923,8 @@ static void do_wpaint_brush_calc_average_weight_cb_ex(
SculptThreadedTaskData *data = userdata;
SculptSession *ss = data->ob->sculpt;
StrokeCache *cache = ss->cache;
- CCGDerivedMesh *ccgdm = BKE_pbvh_get_ccgdm(ss->pbvh);
+ const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh);
+ const bool has_grids = (pbvh_type == PBVH_GRIDS);
const bool use_normal = vwpaint_use_normal(data->vp);
const bool use_face_sel = (data->me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0;
@@ -1949,8 +1949,8 @@ static void do_wpaint_brush_calc_average_weight_cb_ex(
const float angle_cos = (use_normal && vd.no) ?
dot_vf3vs3(sculpt_normal_frontface, vd.no) : 1.0f;
if (angle_cos > 0.0 && BKE_brush_curve_strength(data->brush, sqrtf(test.dist), cache->radius) > 0.0) {
- const int v_index = ccgdm ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
- // const float grid_alpha = ccgdm ? 1.0f / vd.gridsize : 1.0f;
+ const int v_index = has_grids ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
+ // const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f;
const char v_flag = data->me->mvert[v_index].flag;
/* If the vertex is selected. */
@@ -2015,8 +2015,8 @@ static void wpaint_paint_leaves(
/* NOTE: current mirroring code cannot be run in parallel */
settings.use_threading = !(me->editflag & ME_EDIT_MIRROR_X);
- switch (brush->vertexpaint_tool) {
- case PAINT_BLEND_AVERAGE:
+ switch ((eBrushWeightPaintTool)brush->weightpaint_tool) {
+ case WPAINT_TOOL_AVERAGE:
calculate_average_weight(&data, nodes, totnode);
BLI_task_parallel_range(
0, totnode,
@@ -2024,21 +2024,21 @@ static void wpaint_paint_leaves(
do_wpaint_brush_draw_task_cb_ex,
&settings);
break;
- case PAINT_BLEND_SMEAR:
+ case WPAINT_TOOL_SMEAR:
BLI_task_parallel_range(
0, totnode,
&data,
do_wpaint_brush_smear_task_cb_ex,
&settings);
break;
- case PAINT_BLEND_BLUR:
+ case WPAINT_TOOL_BLUR:
BLI_task_parallel_range(
0, totnode,
&data,
do_wpaint_brush_blur_task_cb_ex,
&settings);
break;
- default:
+ case WPAINT_TOOL_DRAW:
BLI_task_parallel_range(
0, totnode,
&data,
@@ -2386,6 +2386,7 @@ static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op)
const int mode_flag = OB_MODE_VERTEX_PAINT;
const bool is_mode_set = (ob->mode & mode_flag) != 0;
Scene *scene = CTX_data_scene(C);
+ ToolSettings *ts = scene->toolsettings;
if (!is_mode_set) {
if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
@@ -2403,6 +2404,7 @@ static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op)
Depsgraph *depsgraph = CTX_data_depsgraph_on_load(C);
wmWindowManager *wm = CTX_wm_manager(C);
ED_object_vpaintmode_enter_ex(bmain, depsgraph, wm, scene, ob);
+ BKE_paint_toolslots_brush_validate(bmain, &ts->vpaint->paint);
}
BKE_mesh_batch_cache_dirty_tag(ob->data, BKE_MESH_BATCH_DIRTY_ALL);
@@ -2452,7 +2454,7 @@ void PAINT_OT_vertex_paint_toggle(wmOperatorType *ot)
* (return OPERATOR_FINISHED also removes handler and operator)
*
* For future:
- * - implement a stroke event (or mousemove with past positons)
+ * - implement a stroke event (or mousemove with past positions)
* - revise whether op->customdata should be added in object, in set_vpaint
*/
@@ -2468,7 +2470,7 @@ struct VPaintData {
uint paintcol;
struct VertProjHandle *vp_handle;
- struct DMCoNo *vertexcosnos;
+ struct CoNo *vertexcosnos;
/* modify 'me->mcol' directly, since the derived mesh is drawing from this
* array, otherwise we need to refresh the modifier stack */
@@ -2517,9 +2519,9 @@ static bool vpaint_stroke_test_start(bContext *C, struct wmOperator *op, const f
&vpd->normal_angle_precalc, vp->paint.brush->falloff_angle,
(vp->paint.brush->flag & BRUSH_FRONTFACE_FALLOFF) != 0);
- vpd->paintcol = vpaint_get_current_col(scene, vp);
+ vpd->paintcol = vpaint_get_current_col(scene, vp, (RNA_enum_get(op->ptr, "mode") == BRUSH_STROKE_INVERT));
- vpd->is_texbrush = !(brush->vertexpaint_tool == PAINT_BLEND_BLUR) && brush->mtex.tex;
+ vpd->is_texbrush = !(brush->vertexpaint_tool == VPAINT_TOOL_BLUR) && brush->mtex.tex;
/* are we painting onto a modified mesh?,
* if not we can skip face map trickiness */
@@ -2533,11 +2535,11 @@ static bool vpaint_stroke_test_start(bContext *C, struct wmOperator *op, const f
}
/* to keep tracked of modified loops for shared vertex color blending */
- if (brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
+ if (brush->vertexpaint_tool == VPAINT_TOOL_BLUR) {
vpd->mlooptag = MEM_mallocN(sizeof(bool) * me->totloop, "VPaintData mlooptag");
}
- if (brush->vertexpaint_tool == PAINT_BLEND_SMEAR) {
+ if (brush->vertexpaint_tool == VPAINT_TOOL_SMEAR) {
vpd->smear.color_prev = MEM_mallocN(sizeof(uint) * me->totloop, __func__);
memcpy(vpd->smear.color_prev, me->mloopcol, sizeof(uint) * me->totloop);
vpd->smear.color_curr = MEM_dupallocN(vpd->smear.color_prev);
@@ -2569,7 +2571,8 @@ static void do_vpaint_brush_calc_average_color_cb_ex(
{
SculptThreadedTaskData *data = userdata;
SculptSession *ss = data->ob->sculpt;
- CCGDerivedMesh *ccgdm = BKE_pbvh_get_ccgdm(ss->pbvh);
+ const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh);
+ const bool has_grids = (pbvh_type == PBVH_GRIDS);
const struct SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap;
StrokeCache *cache = ss->cache;
@@ -2591,7 +2594,7 @@ static void do_vpaint_brush_calc_average_color_cb_ex(
{
/* Test to see if the vertex coordinates are within the spherical brush region. */
if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const int v_index = ccgdm ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
+ const int v_index = has_grids ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
if (BKE_brush_curve_strength(data->brush, 0.0, cache->radius) > 0.0) {
/* If the vertex is selected for painting. */
const MVert *mv = &data->me->mvert[v_index];
@@ -2633,7 +2636,8 @@ static void do_vpaint_brush_draw_task_cb_ex(
{
SculptThreadedTaskData *data = userdata;
SculptSession *ss = data->ob->sculpt;
- CCGDerivedMesh *ccgdm = BKE_pbvh_get_ccgdm(ss->pbvh);
+ const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh);
+ const bool has_grids = (pbvh_type == PBVH_GRIDS);
const struct SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap;
const Brush *brush = data->brush;
@@ -2661,8 +2665,8 @@ static void do_vpaint_brush_draw_task_cb_ex(
/* Note: Grids are 1:1 with corners (aka loops).
* For grid based pbvh, take the vert whose loop cooresponds to the current grid.
* Otherwise, take the current vert. */
- const int v_index = ccgdm ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
- const float grid_alpha = ccgdm ? 1.0f / vd.gridsize : 1.0f;
+ const int v_index = has_grids ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
+ const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f;
const MVert *mv = &data->me->mvert[v_index];
/* If the vertex is selected for painting. */
@@ -2727,7 +2731,8 @@ static void do_vpaint_brush_blur_task_cb_ex(
{
SculptThreadedTaskData *data = userdata;
SculptSession *ss = data->ob->sculpt;
- CCGDerivedMesh *ccgdm = BKE_pbvh_get_ccgdm(ss->pbvh);
+ const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh);
+ const bool has_grids = (pbvh_type == PBVH_GRIDS);
Scene *scene = CTX_data_scene(data->C);
const struct SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap;
@@ -2754,8 +2759,8 @@ static void do_vpaint_brush_blur_task_cb_ex(
if (sculpt_brush_test_sq_fn(&test, vd.co)) {
/* For grid based pbvh, take the vert whose loop cooresponds to the current grid.
* Otherwise, take the current vert. */
- const int v_index = ccgdm ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
- const float grid_alpha = ccgdm ? 1.0f / vd.gridsize : 1.0f;
+ const int v_index = has_grids ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
+ const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f;
const MVert *mv = &data->me->mvert[v_index];
/* If the vertex is selected for painting. */
@@ -2838,7 +2843,8 @@ static void do_vpaint_brush_smear_task_cb_ex(
{
SculptThreadedTaskData *data = userdata;
SculptSession *ss = data->ob->sculpt;
- CCGDerivedMesh *ccgdm = BKE_pbvh_get_ccgdm(ss->pbvh);
+ const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh);
+ const bool has_grids = (pbvh_type == PBVH_GRIDS);
Scene *scene = CTX_data_scene(data->C);
const struct SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap;
@@ -2871,8 +2877,8 @@ static void do_vpaint_brush_smear_task_cb_ex(
if (sculpt_brush_test_sq_fn(&test, vd.co)) {
/* For grid based pbvh, take the vert whose loop cooresponds to the current grid.
* Otherwise, take the current vert. */
- const int v_index = ccgdm ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
- const float grid_alpha = ccgdm ? 1.0f / vd.gridsize : 1.0f;
+ const int v_index = has_grids ? data->me->mloop[vd.grid_indices[vd.g]].v : vd.vert_indices[vd.i];
+ const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f;
const MVert *mv_curr = &data->me->mvert[v_index];
/* if the vertex is selected for painting. */
@@ -3012,8 +3018,8 @@ static void vpaint_paint_leaves(
};
ParallelRangeSettings settings;
BLI_parallel_range_settings_defaults(&settings);
- switch (brush->vertexpaint_tool) {
- case PAINT_BLEND_AVERAGE:
+ switch ((eBrushVertexPaintTool)brush->vertexpaint_tool) {
+ case VPAINT_TOOL_AVERAGE:
calculate_average_color(&data, nodes, totnode);
BLI_task_parallel_range(
0, totnode,
@@ -3021,21 +3027,21 @@ static void vpaint_paint_leaves(
do_vpaint_brush_draw_task_cb_ex,
&settings);
break;
- case PAINT_BLEND_BLUR:
+ case VPAINT_TOOL_BLUR:
BLI_task_parallel_range(
0, totnode,
&data,
do_vpaint_brush_blur_task_cb_ex,
&settings);
break;
- case PAINT_BLEND_SMEAR:
+ case VPAINT_TOOL_SMEAR:
BLI_task_parallel_range(
0, totnode,
&data,
do_vpaint_brush_smear_task_cb_ex,
&settings);
break;
- default:
+ case VPAINT_TOOL_DRAW:
BLI_task_parallel_range(
0, totnode,
&data,
@@ -3147,7 +3153,7 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
BKE_mesh_batch_cache_dirty_tag(ob->data, BKE_MESH_BATCH_DIRTY_ALL);
- if (vp->paint.brush->vertexpaint_tool == PAINT_BLEND_SMEAR) {
+ if (vp->paint.brush->vertexpaint_tool == PAINT_TOOL_SMEAR) {
memcpy(vpd->smear.color_prev, vpd->smear.color_curr, sizeof(uint) * ((Mesh *)ob->data)->totloop);
}
diff --git a/source/blender/editors/sculpt_paint/paint_vertex_color_ops.c b/source/blender/editors/sculpt_paint/paint_vertex_color_ops.c
index 4c8ca493cd1..ba3bc5501e3 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex_color_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex_color_ops.c
@@ -107,7 +107,7 @@ static int vertex_color_set_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene = CTX_data_scene(C);
Object *obact = CTX_data_active_object(C);
- unsigned int paintcol = vpaint_get_current_col(scene, scene->toolsettings->vpaint);
+ unsigned int paintcol = vpaint_get_current_col(scene, scene->toolsettings->vpaint, false);
if (vertex_color_set(obact, paintcol)) {
WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obact);
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 481d5e7d5ea..f78588df0fa 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex_color_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex_color_utils.c
@@ -36,6 +36,7 @@
#include "BLI_math_color.h"
#include "IMB_colormanagement.h"
+#include "IMB_imbuf.h"
#include "BKE_context.h"
#include "BKE_mesh.h"
@@ -617,29 +618,26 @@ uint ED_vpaint_blend_tool(
const int tool, const uint col,
const uint paintcol, const int alpha_i)
{
- switch (tool) {
- case PAINT_BLEND_MIX:
- case PAINT_BLEND_BLUR: return mcol_blend(col, paintcol, alpha_i);
- case PAINT_BLEND_AVERAGE: return mcol_blend(col, paintcol, alpha_i);
- case PAINT_BLEND_SMEAR: return mcol_blend(col, paintcol, alpha_i);
- case PAINT_BLEND_ADD: return mcol_add(col, paintcol, alpha_i);
- case PAINT_BLEND_SUB: return mcol_sub(col, paintcol, alpha_i);
- case PAINT_BLEND_MUL: return mcol_mul(col, paintcol, alpha_i);
- case PAINT_BLEND_LIGHTEN: return mcol_lighten(col, paintcol, alpha_i);
- case PAINT_BLEND_DARKEN: return mcol_darken(col, paintcol, alpha_i);
- case PAINT_BLEND_COLORDODGE: return mcol_colordodge(col, paintcol, alpha_i);
- case PAINT_BLEND_DIFFERENCE: return mcol_difference(col, paintcol, alpha_i);
- case PAINT_BLEND_SCREEN: return mcol_screen(col, paintcol, alpha_i);
- case PAINT_BLEND_HARDLIGHT: return mcol_hardlight(col, paintcol, alpha_i);
- case PAINT_BLEND_OVERLAY: return mcol_overlay(col, paintcol, alpha_i);
- case PAINT_BLEND_SOFTLIGHT: return mcol_softlight(col, paintcol, alpha_i);
- case PAINT_BLEND_EXCLUSION: return mcol_exclusion(col, paintcol, alpha_i);
- case PAINT_BLEND_LUMINOCITY: return mcol_luminosity(col, paintcol, alpha_i);
- case PAINT_BLEND_SATURATION: return mcol_saturation(col, paintcol, alpha_i);
- case PAINT_BLEND_HUE: return mcol_hue(col, paintcol, alpha_i);
+ switch ((IMB_BlendMode)tool) {
+ case IMB_BLEND_MIX: return mcol_blend(col, paintcol, alpha_i);
+ case IMB_BLEND_ADD: return mcol_add(col, paintcol, alpha_i);
+ case IMB_BLEND_SUB: return mcol_sub(col, paintcol, alpha_i);
+ case IMB_BLEND_MUL: return mcol_mul(col, paintcol, alpha_i);
+ case IMB_BLEND_LIGHTEN: return mcol_lighten(col, paintcol, alpha_i);
+ case IMB_BLEND_DARKEN: return mcol_darken(col, paintcol, alpha_i);
+ case IMB_BLEND_COLORDODGE: return mcol_colordodge(col, paintcol, alpha_i);
+ case IMB_BLEND_DIFFERENCE: return mcol_difference(col, paintcol, alpha_i);
+ case IMB_BLEND_SCREEN: return mcol_screen(col, paintcol, alpha_i);
+ case IMB_BLEND_HARDLIGHT: return mcol_hardlight(col, paintcol, alpha_i);
+ case IMB_BLEND_OVERLAY: return mcol_overlay(col, paintcol, alpha_i);
+ case IMB_BLEND_SOFTLIGHT: return mcol_softlight(col, paintcol, alpha_i);
+ case IMB_BLEND_EXCLUSION: return mcol_exclusion(col, paintcol, alpha_i);
+ case IMB_BLEND_LUMINOSITY: return mcol_luminosity(col, paintcol, alpha_i);
+ case IMB_BLEND_SATURATION: return mcol_saturation(col, paintcol, alpha_i);
+ case IMB_BLEND_HUE: return mcol_hue(col, paintcol, alpha_i);
/* non-color */
- case PAINT_BLEND_ALPHA_SUB: return mcol_alpha_sub(col, alpha_i);
- case PAINT_BLEND_ALPHA_ADD: return mcol_alpha_add(col, alpha_i);
+ case IMB_BLEND_ERASE_ALPHA: return mcol_alpha_sub(col, alpha_i);
+ case IMB_BLEND_ADD_ALPHA: return mcol_alpha_add(col, alpha_i);
default:
BLI_assert(0);
return 0;
diff --git a/source/blender/editors/sculpt_paint/paint_vertex_proj.c b/source/blender/editors/sculpt_paint/paint_vertex_proj.c
index 602bfe1ab8e..31ae12c112a 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex_proj.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex_proj.c
@@ -39,7 +39,6 @@
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
-#include "BKE_DerivedMesh.h" /* XXX To be removed, only used for DMCoNo struct */
#include "BKE_context.h"
#include "BKE_mesh_iterators.h"
#include "BKE_mesh_runtime.h"
@@ -56,7 +55,7 @@
/* stored while painting */
struct VertProjHandle {
- DMCoNo *vcosnos;
+ CoNo *vcosnos;
bool use_update;
@@ -85,7 +84,7 @@ static void vpaint_proj_dm_map_cosnos_init__map_cb(
const float no_f[3], const short no_s[3])
{
struct VertProjHandle *vp_handle = userData;
- DMCoNo *co_no = &vp_handle->vcosnos[index];
+ CoNo *co_no = &vp_handle->vcosnos[index];
/* check if we've been here before (normal should not be 0) */
if (!is_zero_v3(co_no->no)) {
@@ -127,7 +126,7 @@ static void vpaint_proj_dm_map_cosnos_update__map_cb(
struct VertProjUpdate *vp_update = userData;
struct VertProjHandle *vp_handle = vp_update->vp_handle;
- DMCoNo *co_no = &vp_handle->vcosnos[index];
+ CoNo *co_no = &vp_handle->vcosnos[index];
/* find closest vertex */
{
@@ -187,13 +186,13 @@ static void vpaint_proj_dm_map_cosnos_update(
struct VertProjHandle *ED_vpaint_proj_handle_create(
struct Depsgraph *depsgraph, Scene *scene, Object *ob,
- DMCoNo **r_vcosnos)
+ CoNo **r_vcosnos)
{
struct VertProjHandle *vp_handle = MEM_mallocN(sizeof(struct VertProjHandle), __func__);
Mesh *me = ob->data;
/* setup the handle */
- vp_handle->vcosnos = MEM_mallocN(sizeof(DMCoNo) * me->totvert, "vertexcosnos map");
+ vp_handle->vcosnos = MEM_mallocN(sizeof(CoNo) * me->totvert, "vertexcosnos map");
vp_handle->use_update = false;
/* sets 'use_update' if needed */
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 436f4ac5993..46eb3995ea3 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.c
@@ -241,7 +241,7 @@ static int weight_sample_invoke(bContext *C, wmOperator *op, const wmEvent *even
}
if (changed) {
- /* not really correct since the brush didnt change, but redraws the toolbar */
+ /* not really correct since the brush didn't change, but redraws the toolbar */
WM_main_add_notifier(NC_BRUSH | NA_EDITED, NULL); /* ts->wpaint->paint.brush */
return OPERATOR_FINISHED;
@@ -591,7 +591,7 @@ static void gradientVert_update(WPGradient_userData *grad_data, int index)
MDeformVert *dv = &me->dvert[index];
MDeformWeight *dw = defvert_verify_index(dv, grad_data->def_nr);
// dw->weight = alpha; // testing
- int tool = grad_data->brush->vertexpaint_tool;
+ int tool = grad_data->brush->blend;
float testw;
/* init if we just added */
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 51cd759b260..0a1fc7c0b4e 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.c
@@ -45,6 +45,9 @@
#include "BKE_report.h"
#include "BKE_object.h"
+/* Only for blend modes. */
+#include "IMB_imbuf.h"
+
#include "WM_api.h"
#include "WM_types.h"
@@ -280,31 +283,24 @@ float ED_wpaint_blend_tool(
const float weight,
const float paintval, const float alpha)
{
- switch (tool) {
- case PAINT_BLEND_MIX:
- case PAINT_BLEND_AVERAGE:
- case PAINT_BLEND_SMEAR:
- case PAINT_BLEND_BLUR: return wval_blend(weight, paintval, alpha);
- case PAINT_BLEND_ADD: return wval_add(weight, paintval, alpha);
- case PAINT_BLEND_SUB: return wval_sub(weight, paintval, alpha);
- case PAINT_BLEND_MUL: return wval_mul(weight, paintval, alpha);
- case PAINT_BLEND_LIGHTEN: return wval_lighten(weight, paintval, alpha);
- case PAINT_BLEND_DARKEN: return wval_darken(weight, paintval, alpha);
+ switch ((IMB_BlendMode)tool) {
+ case IMB_BLEND_MIX: return wval_blend(weight, paintval, alpha);
+ case IMB_BLEND_ADD: return wval_add(weight, paintval, alpha);
+ case IMB_BLEND_SUB: return wval_sub(weight, paintval, alpha);
+ case IMB_BLEND_MUL: return wval_mul(weight, paintval, alpha);
+ case IMB_BLEND_LIGHTEN: return wval_lighten(weight, paintval, alpha);
+ case IMB_BLEND_DARKEN: return wval_darken(weight, paintval, alpha);
/* Mostly make sense for color: support anyway. */
- case PAINT_BLEND_COLORDODGE: return wval_colordodge(weight, paintval, alpha);
- case PAINT_BLEND_DIFFERENCE: return wval_difference(weight, paintval, alpha);
- case PAINT_BLEND_SCREEN: return wval_screen(weight, paintval, alpha);
- case PAINT_BLEND_HARDLIGHT: return wval_hardlight(weight, paintval, alpha);
- case PAINT_BLEND_OVERLAY: return wval_overlay(weight, paintval, alpha);
- case PAINT_BLEND_SOFTLIGHT: return wval_softlight(weight, paintval, alpha);
- case PAINT_BLEND_EXCLUSION: return wval_exclusion(weight, paintval, alpha);
+ case IMB_BLEND_COLORDODGE: return wval_colordodge(weight, paintval, alpha);
+ case IMB_BLEND_DIFFERENCE: return wval_difference(weight, paintval, alpha);
+ case IMB_BLEND_SCREEN: return wval_screen(weight, paintval, alpha);
+ case IMB_BLEND_HARDLIGHT: return wval_hardlight(weight, paintval, alpha);
+ case IMB_BLEND_OVERLAY: return wval_overlay(weight, paintval, alpha);
+ case IMB_BLEND_SOFTLIGHT: return wval_softlight(weight, paintval, alpha);
+ case IMB_BLEND_EXCLUSION: return wval_exclusion(weight, paintval, alpha);
/* Only for color: just use blend. */
- case PAINT_BLEND_LUMINOCITY:
- case PAINT_BLEND_SATURATION:
- case PAINT_BLEND_HUE:
- case PAINT_BLEND_ALPHA_SUB:
- case PAINT_BLEND_ALPHA_ADD:
- default: return wval_blend(weight, paintval, alpha);
+ default:
+ return wval_blend(weight, paintval, alpha);
}
}
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 45037cfddfa..79f7ad9a135 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -52,9 +52,9 @@
#include "DNA_scene_types.h"
#include "DNA_brush_types.h"
-#include "BKE_pbvh.h"
#include "BKE_brush.h"
#include "BKE_ccg.h"
+#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_image.h"
@@ -65,15 +65,16 @@
#include "BKE_mesh_mapping.h"
#include "BKE_modifier.h"
#include "BKE_multires.h"
+#include "BKE_node.h"
+#include "BKE_object.h"
#include "BKE_paint.h"
+#include "BKE_pbvh.h"
#include "BKE_report.h"
#include "BKE_screen.h"
-#include "BKE_node.h"
-#include "BKE_object.h"
#include "BKE_subsurf.h"
-#include "BKE_colortools.h"
#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -4696,7 +4697,7 @@ static float sculpt_raycast_init(
RegionView3D *rv3d = vc->ar->regiondata;
/* TODO: what if the segment is totally clipped? (return == 0) */
- ED_view3d_win_to_segment(vc->depsgraph, vc->ar, vc->v3d, mouse, ray_start, ray_end, true);
+ ED_view3d_win_to_segment_clipped(vc->depsgraph, vc->ar, vc->v3d, mouse, ray_start, ray_end, true);
invert_m4_m4(obimat, ob->obmat);
mul_m4_v3(obimat, ray_start);
@@ -4868,8 +4869,12 @@ static void sculpt_flush_update(bContext *C)
ARegion *ar = CTX_wm_region(C);
MultiresModifierData *mmd = ss->multires;
- if (mmd)
- multires_mark_as_modified(ob, MULTIRES_COORDS_MODIFIED);
+ if (mmd != NULL) {
+ /* NOTE: SubdivCCG is living in the evaluated object. */
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
+ Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
+ multires_mark_as_modified(ob_eval, MULTIRES_COORDS_MODIFIED);
+ }
DEG_id_tag_update(&ob->id, DEG_TAG_SHADING_UPDATE);
@@ -5814,6 +5819,7 @@ static int sculpt_mode_toggle_exec(bContext *C, wmOperator *op)
Main *bmain = CTX_data_main(C);
Depsgraph *depsgraph = CTX_data_depsgraph_on_load(C);
Scene *scene = CTX_data_scene(C);
+ ToolSettings *ts = scene->toolsettings;
Object *ob = CTX_data_active_object(C);
const int mode_flag = OB_MODE_SCULPT;
const bool is_mode_set = (ob->mode & mode_flag) != 0;
@@ -5829,6 +5835,7 @@ static int sculpt_mode_toggle_exec(bContext *C, wmOperator *op)
}
else {
ED_object_sculptmode_enter_ex(bmain, depsgraph, scene, ob, op->reports);
+ BKE_paint_toolslots_brush_validate(bmain, &ts->sculpt->paint);
}
WM_event_add_notifier(C, NC_SCENE | ND_MODE, scene);
@@ -6045,6 +6052,17 @@ static void SCULPT_OT_sample_detail_size(wmOperatorType *ot)
}
+/* Dynamic-topology detail size
+ *
+ * This should be improved further, perhaps by showing a triangle
+ * grid rather than brush alpha */
+static void set_brush_rc_props(PointerRNA *ptr, const char *prop)
+{
+ char *path = BLI_sprintfN("tool_settings.sculpt.brush.%s", prop);
+ RNA_string_set(ptr, "data_path_primary", path);
+ MEM_freeN(path);
+}
+
static int sculpt_set_detail_size_exec(bContext *C, wmOperator *UNUSED(op))
{
Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
@@ -6055,15 +6073,15 @@ static int sculpt_set_detail_size_exec(bContext *C, wmOperator *UNUSED(op))
WM_operator_properties_create_ptr(&props_ptr, ot);
if (sd->flags & (SCULPT_DYNTOPO_DETAIL_CONSTANT | SCULPT_DYNTOPO_DETAIL_MANUAL)) {
- set_brush_rc_props(&props_ptr, "sculpt", "constant_detail_resolution", NULL, 0);
+ set_brush_rc_props(&props_ptr, "constant_detail_resolution");
RNA_string_set(&props_ptr, "data_path_primary", "tool_settings.sculpt.constant_detail_resolution");
}
else if (sd->flags & SCULPT_DYNTOPO_DETAIL_BRUSH) {
- set_brush_rc_props(&props_ptr, "sculpt", "constant_detail_resolution", NULL, 0);
+ set_brush_rc_props(&props_ptr, "constant_detail_resolution");
RNA_string_set(&props_ptr, "data_path_primary", "tool_settings.sculpt.detail_percent");
}
else {
- set_brush_rc_props(&props_ptr, "sculpt", "detail_size", NULL, 0);
+ set_brush_rc_props(&props_ptr, "detail_size");
RNA_string_set(&props_ptr, "data_path_primary", "tool_settings.sculpt.detail_size");
}
diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c
index b78d030407b..d79c6b81fd7 100644
--- a/source/blender/editors/sculpt_paint/sculpt_undo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_undo.c
@@ -60,6 +60,7 @@
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
#include "BKE_subsurf.h"
+#include "BKE_subdiv_ccg.h"
#include "BKE_undo_system.h"
#include "DEG_depsgraph.h"
@@ -136,13 +137,14 @@ static bool sculpt_undo_restore_deformed(
}
}
-static bool sculpt_undo_restore_coords(bContext *C, DerivedMesh *dm, SculptUndoNode *unode)
+static bool sculpt_undo_restore_coords(bContext *C, SculptUndoNode *unode)
{
Scene *scene = CTX_data_scene(C);
Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
Object *ob = CTX_data_active_object(C);
Depsgraph *depsgraph = CTX_data_depsgraph(C);
SculptSession *ss = ob->sculpt;
+ SubdivCCG *subdiv_ccg = ss->subdiv_ccg;
MVert *mvert;
int *index;
@@ -228,16 +230,16 @@ static bool sculpt_undo_restore_coords(bContext *C, DerivedMesh *dm, SculptUndoN
}
}
}
- else if (unode->maxgrid && dm->getGridData) {
+ else if (unode->maxgrid && subdiv_ccg != NULL) {
/* multires restore */
CCGElem **grids, *grid;
CCGKey key;
float (*co)[3];
int gridsize;
- grids = dm->getGridData(dm);
- gridsize = dm->getGridSize(dm);
- dm->getGridKey(dm, &key);
+ grids = subdiv_ccg->grids;
+ gridsize = subdiv_ccg->grid_size;
+ BKE_subdiv_ccg_key_top_level(&key, subdiv_ccg);
co = unode->co;
for (int j = 0; j < unode->totgrid; j++) {
@@ -253,11 +255,12 @@ static bool sculpt_undo_restore_coords(bContext *C, DerivedMesh *dm, SculptUndoN
}
static bool sculpt_undo_restore_hidden(
- bContext *C, DerivedMesh *dm,
+ bContext *C,
SculptUndoNode *unode)
{
Object *ob = CTX_data_active_object(C);
SculptSession *ss = ob->sculpt;
+ SubdivCCG *subdiv_ccg = ss->subdiv_ccg;
int i;
if (unode->maxvert) {
@@ -272,8 +275,8 @@ static bool sculpt_undo_restore_hidden(
}
}
}
- else if (unode->maxgrid && dm->getGridData) {
- BLI_bitmap **grid_hidden = dm->getGridHidden(dm);
+ else if (unode->maxgrid && subdiv_ccg != NULL) {
+ BLI_bitmap **grid_hidden = subdiv_ccg->grid_hidden;
for (i = 0; i < unode->totgrid; i++) {
SWAP(BLI_bitmap *,
@@ -286,10 +289,11 @@ static bool sculpt_undo_restore_hidden(
return 1;
}
-static bool sculpt_undo_restore_mask(bContext *C, DerivedMesh *dm, SculptUndoNode *unode)
+static bool sculpt_undo_restore_mask(bContext *C, SculptUndoNode *unode)
{
Object *ob = CTX_data_active_object(C);
SculptSession *ss = ob->sculpt;
+ SubdivCCG *subdiv_ccg = ss->subdiv_ccg;
MVert *mvert;
float *vmask;
int *index, i, j;
@@ -308,16 +312,16 @@ static bool sculpt_undo_restore_mask(bContext *C, DerivedMesh *dm, SculptUndoNod
}
}
}
- else if (unode->maxgrid && dm->getGridData) {
+ else if (unode->maxgrid && subdiv_ccg != NULL) {
/* multires restore */
CCGElem **grids, *grid;
CCGKey key;
float *mask;
int gridsize;
- grids = dm->getGridData(dm);
- gridsize = dm->getGridSize(dm);
- dm->getGridKey(dm, &key);
+ grids = subdiv_ccg->grids;
+ gridsize = subdiv_ccg->grid_size;
+ BKE_subdiv_ccg_key_top_level(&key, subdiv_ccg);
mask = unode->mask;
for (j = 0; j < unode->totgrid; j++) {
@@ -475,8 +479,8 @@ static void sculpt_undo_restore_list(bContext *C, ListBase *lb)
Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
Object *ob = CTX_data_active_object(C);
Depsgraph *depsgraph = CTX_data_depsgraph(C);
- DerivedMesh *dm;
SculptSession *ss = ob->sculpt;
+ SubdivCCG *subdiv_ccg = ss->subdiv_ccg;
SculptUndoNode *unode;
bool update = false, rebuild = false;
bool need_mask = false;
@@ -497,9 +501,6 @@ static void sculpt_undo_restore_list(bContext *C, ListBase *lb)
BKE_sculpt_update_mesh_elements(depsgraph, scene, sd, ob, false, need_mask);
- /* call _after_ sculpt_update_mesh_elements() which may update 'ob->derivedFinal' */
- dm = mesh_get_derived_final(depsgraph, scene, ob, 0);
-
if (lb->first && sculpt_undo_bmesh_restore(C, lb->first, ob, ss))
return;
@@ -513,9 +514,9 @@ static void sculpt_undo_restore_list(bContext *C, ListBase *lb)
if (ss->totvert != unode->maxvert)
continue;
}
- else if (unode->maxgrid && dm->getGridData) {
- if ((dm->getNumGrids(dm) != unode->maxgrid) ||
- (dm->getGridSize(dm) != unode->gridsize))
+ else if (unode->maxgrid && subdiv_ccg != NULL) {
+ if ((subdiv_ccg->num_grids != unode->maxgrid) ||
+ (subdiv_ccg->grid_size != unode->gridsize))
{
continue;
}
@@ -526,15 +527,15 @@ static void sculpt_undo_restore_list(bContext *C, ListBase *lb)
switch (unode->type) {
case SCULPT_UNDO_COORDS:
- if (sculpt_undo_restore_coords(C, dm, unode))
+ if (sculpt_undo_restore_coords(C, unode))
update = true;
break;
case SCULPT_UNDO_HIDDEN:
- if (sculpt_undo_restore_hidden(C, dm, unode))
+ if (sculpt_undo_restore_hidden(C, unode))
rebuild = true;
break;
case SCULPT_UNDO_MASK:
- if (sculpt_undo_restore_mask(C, dm, unode))
+ if (sculpt_undo_restore_mask(C, unode))
update = true;
break;
@@ -591,10 +592,9 @@ static void sculpt_undo_restore_list(bContext *C, ListBase *lb)
static void sculpt_undo_free_list(ListBase *lb)
{
- SculptUndoNode *unode;
- int i;
-
- for (unode = lb->first; unode; unode = unode->next) {
+ SculptUndoNode *unode = lb->first;
+ while (unode != NULL) {
+ SculptUndoNode *unode_next = unode->next;
if (unode->co)
MEM_freeN(unode->co);
if (unode->no)
@@ -608,7 +608,7 @@ static void sculpt_undo_free_list(ListBase *lb)
if (unode->vert_hidden)
MEM_freeN(unode->vert_hidden);
if (unode->grid_hidden) {
- for (i = 0; i < unode->totgrid; i++) {
+ for (int i = 0; i < unode->totgrid; i++) {
if (unode->grid_hidden[i])
MEM_freeN(unode->grid_hidden[i]);
}
@@ -629,6 +629,10 @@ static void sculpt_undo_free_list(ListBase *lb)
CustomData_free(&unode->bm_enter_ldata, unode->bm_enter_totloop);
if (unode->bm_enter_totpoly)
CustomData_free(&unode->bm_enter_pdata, unode->bm_enter_totpoly);
+
+ MEM_freeN(unode);
+
+ unode = unode_next;
}
}
diff --git a/source/blender/editors/sculpt_paint/sculpt_uv.c b/source/blender/editors/sculpt_paint/sculpt_uv.c
index 8fafc545fa9..c5cebed0b8b 100644
--- a/source/blender/editors/sculpt_paint/sculpt_uv.c
+++ b/source/blender/editors/sculpt_paint/sculpt_uv.c
@@ -236,19 +236,18 @@ void ED_space_image_uv_sculpt_update(Main *bmain, wmWindowManager *wm, Scene *sc
{
ToolSettings *settings = scene->toolsettings;
if (settings->use_uv_sculpt) {
- if (!settings->uvsculpt) {
- settings->uvsculpt = MEM_callocN(sizeof(*settings->uvsculpt), "UV Smooth paint");
+ if (settings->uvsculpt == NULL) {
settings->uv_sculpt_tool = UV_SCULPT_TOOL_GRAB;
settings->uv_sculpt_settings = UV_SCULPT_LOCK_BORDERS | UV_SCULPT_ALL_ISLANDS;
settings->uv_relax_method = UV_SCULPT_TOOL_RELAX_LAPLACIAN;
- /* Uv sculpting does not include explicit brush view control yet, always enable */
- settings->uvsculpt->paint.flags |= PAINT_SHOW_BRUSH;
}
-
+ BKE_paint_ensure(settings, (Paint **)&settings->uvsculpt);
BKE_paint_init(bmain, scene, ePaintSculptUV, PAINT_CURSOR_SCULPT);
settings->uvsculpt->paint.paint_cursor = WM_paint_cursor_activate(
- wm, uv_sculpt_brush_poll,
+ wm,
+ SPACE_IMAGE, RGN_TYPE_WINDOW,
+ uv_sculpt_brush_poll,
brush_drawcursor_uvsculpt, NULL);
}
else {
diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c
index 15f688549a8..7f51f9e4149 100644
--- a/source/blender/editors/sound/sound_ops.c
+++ b/source/blender/editors/sound/sound_ops.c
@@ -49,13 +49,13 @@
#include "BKE_context.h"
#include "BKE_fcurve.h"
#include "BKE_global.h"
-#include "BKE_main.h"
-#include "BKE_report.h"
#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_packedFile.h"
+#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_sound.h"
#include "BKE_sequencer.h"
+#include "BKE_sound.h"
#include "RNA_access.h"
#include "RNA_define.h"
diff --git a/source/blender/editors/space_action/action_data.c b/source/blender/editors/space_action/action_data.c
index 8d4596a79a7..a3773110d0f 100644
--- a/source/blender/editors/space_action/action_data.c
+++ b/source/blender/editors/space_action/action_data.c
@@ -53,12 +53,12 @@
#include "BKE_animsys.h"
#include "BKE_action.h"
+#include "BKE_context.h"
#include "BKE_fcurve.h"
-#include "BKE_library.h"
#include "BKE_key.h"
+#include "BKE_library.h"
#include "BKE_nla.h"
#include "BKE_scene.h"
-#include "BKE_context.h"
#include "BKE_report.h"
#include "UI_view2d.h"
@@ -566,11 +566,11 @@ void ED_animedit_unlink_action(bContext *C, ID *id, AnimData *adt, bAction *act,
if (strip->act == act) {
/* Remove this strip, and the track too if it doesn't have anything else */
- BKE_nlastrip_free(&nlt->strips, strip);
+ BKE_nlastrip_free(&nlt->strips, strip, true);
if (nlt->strips.first == NULL) {
BLI_assert(nstrip == NULL);
- BKE_nlatrack_free(&adt->nla_tracks, nlt);
+ BKE_nlatrack_free(&adt->nla_tracks, nlt, true);
}
}
}
diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c
index e679688f887..ef2694ec70a 100644
--- a/source/blender/editors/space_action/action_draw.c
+++ b/source/blender/editors/space_action/action_draw.c
@@ -171,22 +171,22 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
float act_start, act_end, y;
- unsigned char col1[3], col2[3];
- unsigned char col1a[3], col2a[3];
- unsigned char col1b[3], col2b[3];
+ unsigned char col1[4], col2[4];
+ unsigned char col1a[4], col2a[4];
+ unsigned char col1b[4], col2b[4];
const bool show_group_colors = !(saction->flag & SACTION_NODRAWGCOLORS);
/* get theme colors */
- UI_GetThemeColor3ubv(TH_BACK, col2);
- UI_GetThemeColor3ubv(TH_HILITE, col1);
+ UI_GetThemeColor4ubv(TH_SHADE2, col2);
+ UI_GetThemeColor4ubv(TH_HILITE, col1);
- UI_GetThemeColor3ubv(TH_GROUP, col2a);
- UI_GetThemeColor3ubv(TH_GROUP_ACTIVE, col1a);
+ UI_GetThemeColor4ubv(TH_GROUP, col2a);
+ UI_GetThemeColor4ubv(TH_GROUP_ACTIVE, col1a);
- UI_GetThemeColor3ubv(TH_DOPESHEET_CHANNELOB, col1b);
- UI_GetThemeColor3ubv(TH_DOPESHEET_CHANNELSUBOB, col2b);
+ UI_GetThemeColor4ubv(TH_DOPESHEET_CHANNELOB, col1b);
+ UI_GetThemeColor4ubv(TH_DOPESHEET_CHANNELSUBOB, col2b);
/* set view-mapping rect (only used for x-axis), for NLA-scaling mapping with less calculation */
@@ -246,14 +246,14 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
case ANIMTYPE_SCENE:
case ANIMTYPE_OBJECT:
{
- immUniformColor3ubvAlpha(col1b, sel ? 0x45 : 0x22);
+ immUniformColor3ubvAlpha(col1b, sel ? col1[3] : col1b[3]);
break;
}
case ANIMTYPE_FILLACTD:
case ANIMTYPE_DSSKEY:
case ANIMTYPE_DSWOR:
{
- immUniformColor3ubvAlpha(col2b, sel ? 0x45 : 0x22);
+ immUniformColor3ubvAlpha(col2b, sel ? col1[3] : col2b[3]);
break;
}
case ANIMTYPE_GROUP:
@@ -261,14 +261,14 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
bActionGroup *agrp = ale->data;
if (show_group_colors && agrp->customCol) {
if (sel) {
- immUniformColor3ubvAlpha((unsigned char *)agrp->cs.select, 0x45);
+ immUniformColor3ubvAlpha((unsigned char *)agrp->cs.select, col1a[3]);
}
else {
- immUniformColor3ubvAlpha((unsigned char *)agrp->cs.solid, 0x1D);
+ immUniformColor3ubvAlpha((unsigned char *)agrp->cs.solid, col2a[3]);
}
}
else {
- immUniformColor3ubvAlpha(sel ? col1a : col2a, 0x22);
+ immUniformColor4ubv(sel ? col1a : col2a);
}
break;
}
@@ -276,16 +276,16 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
{
FCurve *fcu = ale->data;
if (show_group_colors && fcu->grp && fcu->grp->customCol) {
- immUniformColor3ubvAlpha((unsigned char *)fcu->grp->cs.active, sel ? 0x65 : 0x0B);
+ immUniformColor3ubvAlpha((unsigned char *)fcu->grp->cs.active, sel ? col1[3] : col2[3]);
}
else {
- immUniformColor3ubvAlpha(sel ? col1 : col2, 0x22);
+ immUniformColor4ubv(sel ? col1 : col2);
}
break;
}
default:
{
- immUniformColor3ubvAlpha(sel ? col1 : col2, 0x22);
+ immUniformColor4ubv(sel ? col1 : col2);
}
}
@@ -297,21 +297,23 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
}
else if (ac->datatype == ANIMCONT_GPENCIL) {
/* frames less than one get less saturated background */
- immUniformColor3ubvAlpha(sel ? col1 : col2, 0x22);
+ unsigned char *color = sel ? col1 : col2;
+ immUniformColor4ubv(color);
immRectf(pos, 0.0f, (float)y - ACHANNEL_HEIGHT_HALF(ac), v2d->cur.xmin, (float)y + ACHANNEL_HEIGHT_HALF(ac));
/* frames one and higher get a saturated background */
- immUniformColor3ubvAlpha(sel ? col1 : col2, 0x44);
+ immUniformColor3ubvAlpha(color, MIN2(255, color[3] * 2));
immRectf(pos, v2d->cur.xmin, (float)y - ACHANNEL_HEIGHT_HALF(ac), v2d->cur.xmax + EXTRA_SCROLL_PAD, (float)y + ACHANNEL_HEIGHT_HALF(ac));
}
else if (ac->datatype == ANIMCONT_MASK) {
/* TODO --- this is a copy of gpencil */
/* frames less than one get less saturated background */
- immUniformColor3ubvAlpha(sel ? col1 : col2, 0x22);
+ unsigned char *color = sel ? col1 : col2;
+ immUniformColor4ubv(color);
immRectf(pos, 0.0f, (float)y - ACHANNEL_HEIGHT_HALF(ac), v2d->cur.xmin, (float)y + ACHANNEL_HEIGHT_HALF(ac));
/* frames one and higher get a saturated background */
- immUniformColor3ubvAlpha(sel ? col1 : col2, 0x44);
+ immUniformColor3ubvAlpha(color, MIN2(255, color[3] * 2));
immRectf(pos, v2d->cur.xmin, (float)y - ACHANNEL_HEIGHT_HALF(ac), v2d->cur.xmax + EXTRA_SCROLL_PAD, (float)y + ACHANNEL_HEIGHT_HALF(ac));
}
}
@@ -355,28 +357,28 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
/* draw 'keyframes' for each specific datatype */
switch (ale->datatype) {
case ALE_ALL:
- draw_summary_channel(v2d, ale->data, y, ac->yscale_fac);
+ draw_summary_channel(v2d, ale->data, y, ac->yscale_fac, saction->flag);
break;
case ALE_SCE:
- draw_scene_channel(v2d, ads, ale->key_data, y, ac->yscale_fac);
+ draw_scene_channel(v2d, ads, ale->key_data, y, ac->yscale_fac, saction->flag);
break;
case ALE_OB:
- draw_object_channel(v2d, ads, ale->key_data, y, ac->yscale_fac);
+ draw_object_channel(v2d, ads, ale->key_data, y, ac->yscale_fac, saction->flag);
break;
case ALE_ACT:
- draw_action_channel(v2d, adt, ale->key_data, y, ac->yscale_fac);
+ draw_action_channel(v2d, adt, ale->key_data, y, ac->yscale_fac, saction->flag);
break;
case ALE_GROUP:
- draw_agroup_channel(v2d, adt, ale->data, y, ac->yscale_fac);
+ draw_agroup_channel(v2d, adt, ale->data, y, ac->yscale_fac, saction->flag);
break;
case ALE_FCURVE:
- draw_fcurve_channel(v2d, adt, ale->key_data, y, ac->yscale_fac);
+ draw_fcurve_channel(v2d, adt, ale->key_data, y, ac->yscale_fac, saction->flag);
break;
case ALE_GPFRAME:
- draw_gpl_channel(v2d, ads, ale->data, y, ac->yscale_fac);
+ draw_gpl_channel(v2d, ads, ale->data, y, ac->yscale_fac, saction->flag);
break;
case ALE_MASKLAY:
- draw_masklay_channel(v2d, ads, ale->data, y, ac->yscale_fac);
+ draw_masklay_channel(v2d, ads, ale->data, y, ac->yscale_fac, saction->flag);
break;
}
}
diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c
index 912b8db05db..2e0b7a2adb8 100644
--- a/source/blender/editors/space_action/action_edit.c
+++ b/source/blender/editors/space_action/action_edit.c
@@ -54,14 +54,12 @@
#include "RNA_enum_types.h"
#include "BKE_action.h"
+#include "BKE_context.h"
#include "BKE_fcurve.h"
#include "BKE_gpencil.h"
#include "BKE_global.h"
#include "BKE_key.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
#include "BKE_nla.h"
-#include "BKE_context.h"
#include "BKE_report.h"
#include "UI_view2d.h"
@@ -702,15 +700,8 @@ static void insert_action_keys(bAnimContext *ac, short mode)
/* insert keyframes */
for (ale = anim_data.first; ale; ale = ale->next) {
- AnimData *adt = ANIM_nla_mapping_get(ac, ale);
FCurve *fcu = (FCurve *)ale->key_data;
- float cfra;
-
- /* adjust current frame for NLA-scaling */
- if (adt)
- cfra = BKE_nla_tweakedit_remap(adt, (float)CFRA, NLATIME_CONVERT_UNMAP);
- else
- cfra = (float)CFRA;
+ float cfra = (float)CFRA;
/* read value from property the F-Curve represents, or from the curve only?
* - ale->id != NULL: Typically, this means that we have enough info to try resolving the path
@@ -723,6 +714,12 @@ static void insert_action_keys(bAnimContext *ac, short mode)
fcu->rna_path, fcu->array_index, cfra, ts->keyframe_type, flag);
}
else {
+ AnimData *adt = ANIM_nla_mapping_get(ac, ale);
+
+ /* adjust current frame for NLA-scaling */
+ if (adt)
+ cfra = BKE_nla_tweakedit_remap(adt, (float)CFRA, NLATIME_CONVERT_UNMAP);
+
const float curval = evaluate_fcurve(fcu, cfra);
insert_vert_fcurve(fcu, cfra, curval, ts->keyframe_type, 0);
}
diff --git a/source/blender/editors/space_action/action_intern.h b/source/blender/editors/space_action/action_intern.h
index bb8de677b57..986afe96e11 100644
--- a/source/blender/editors/space_action/action_intern.h
+++ b/source/blender/editors/space_action/action_intern.h
@@ -63,7 +63,7 @@ void timeline_draw_cache(struct SpaceAction *saction, struct Object *ob, struct
/* action_select.c */
void ACTION_OT_select_all(struct wmOperatorType *ot);
-void ACTION_OT_select_border(struct wmOperatorType *ot);
+void ACTION_OT_select_box(struct wmOperatorType *ot);
void ACTION_OT_select_lasso(struct wmOperatorType *ot);
void ACTION_OT_select_circle(struct wmOperatorType *ot);
void ACTION_OT_select_column(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_action/action_ops.c b/source/blender/editors/space_action/action_ops.c
index 4976ffa3fc3..bbcba93370d 100644
--- a/source/blender/editors/space_action/action_ops.c
+++ b/source/blender/editors/space_action/action_ops.c
@@ -60,7 +60,7 @@ void action_operatortypes(void)
/* selection */
WM_operatortype_append(ACTION_OT_clickselect);
WM_operatortype_append(ACTION_OT_select_all);
- WM_operatortype_append(ACTION_OT_select_border);
+ WM_operatortype_append(ACTION_OT_select_box);
WM_operatortype_append(ACTION_OT_select_lasso);
WM_operatortype_append(ACTION_OT_select_circle);
WM_operatortype_append(ACTION_OT_select_column);
@@ -119,173 +119,12 @@ void ED_operatormacros_action(void)
/* ************************** registration - keymaps **********************************/
-static void action_keymap_keyframes(wmKeyConfig *keyconf, wmKeyMap *keymap)
-{
- wmKeyMapItem *kmi;
-
- /* action_select.c - selection tools */
- /* click-select: keyframe (replace) */
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_clickselect", SELECTMOUSE, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "column", false);
- RNA_boolean_set(kmi->ptr, "channel", false);
- /* click-select: all on same frame (replace) */
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "column", true);
- RNA_boolean_set(kmi->ptr, "channel", false);
- /* click-select: keyframe (add) */
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "column", false);
- RNA_boolean_set(kmi->ptr, "channel", false);
- /* click-select: all on same frame (add) */
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "column", true);
- RNA_boolean_set(kmi->ptr, "channel", false);
- /* click-select: all on same channel (replace) */
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "column", false);
- RNA_boolean_set(kmi->ptr, "channel", true);
- /* click-select: all on same channel (add) */
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL | KM_ALT | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "column", false);
- RNA_boolean_set(kmi->ptr, "channel", true);
-
- /* click-select: left/right */
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_enum_set(kmi->ptr, "mode", ACTKEYS_LRSEL_TEST);
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_enum_set(kmi->ptr, "mode", ACTKEYS_LRSEL_TEST);
-
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_select_leftright", LEFTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_enum_set(kmi->ptr, "mode", ACTKEYS_LRSEL_LEFT);
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_select_leftright", RIGHTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_enum_set(kmi->ptr, "mode", ACTKEYS_LRSEL_RIGHT);
-
- /* deselect all */
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- /* borderselect */
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_select_border", BKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "axis_range", false);
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_select_border", BKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "axis_range", true);
-
- /* region select */
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", true);
-
- WM_keymap_add_item(keymap, "ACTION_OT_select_circle", CKEY, KM_PRESS, 0, 0);
-
- /* column select */
- RNA_enum_set(WM_keymap_add_item(keymap, "ACTION_OT_select_column", KKEY, KM_PRESS, 0, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_KEYS);
- RNA_enum_set(WM_keymap_add_item(keymap, "ACTION_OT_select_column", KKEY, KM_PRESS, KM_CTRL, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_CFRA);
- RNA_enum_set(WM_keymap_add_item(keymap, "ACTION_OT_select_column", KKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_MARKERS_COLUMN);
- RNA_enum_set(WM_keymap_add_item(keymap, "ACTION_OT_select_column", KKEY, KM_PRESS, KM_ALT, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_MARKERS_BETWEEN);
-
- /* select more/less */
- WM_keymap_add_item(keymap, "ACTION_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "ACTION_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
-
- /* select linked */
- WM_keymap_add_item(keymap, "ACTION_OT_select_linked", LKEY, KM_PRESS, 0, 0);
-
-
- /* action_edit.c */
- /* jump to selected keyframes */
- WM_keymap_add_item(keymap, "ACTION_OT_frame_jump", GKEY, KM_PRESS, KM_CTRL, 0);
-
- /* menu + single-step transform */
- WM_keymap_add_item(keymap, "ACTION_OT_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "ACTION_OT_mirror", MKEY, KM_PRESS, KM_CTRL, 0);
-
- /* menu + set setting */
- WM_keymap_add_item(keymap, "ACTION_OT_handle_type", VKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ACTION_OT_interpolation_type", TKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ACTION_OT_extrapolation_type", EKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "ACTION_OT_keyframe_type", RKEY, KM_PRESS, 0, 0);
-
- /* specials */
- WM_keymap_add_menu(keymap, "DOPESHEET_MT_specials", WKEY, KM_PRESS, 0, 0);
-
- /* destructive */
- WM_keymap_add_item(keymap, "ACTION_OT_sample", OKEY, KM_PRESS, KM_SHIFT | KM_ALT, 0);
-
- WM_keymap_add_menu(keymap, "DOPESHEET_MT_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_menu(keymap, "DOPESHEET_MT_delete", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "ACTION_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "ACTION_OT_keyframe_insert", IKEY, KM_PRESS, 0, 0);
-
- /* copy/paste */
- WM_keymap_add_item(keymap, "ACTION_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "ACTION_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0);
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_paste", VKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "flipped", true);
-#ifdef __APPLE__
- WM_keymap_add_item(keymap, "ACTION_OT_copy", CKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "ACTION_OT_paste", VKEY, KM_PRESS, KM_OSKEY, 0);
- kmi = WM_keymap_add_item(keymap, "ACTION_OT_paste", VKEY, KM_PRESS, KM_OSKEY | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "flipped", true);
-#endif
-
- /* auto-set range */
- WM_keymap_add_item(keymap, "ACTION_OT_previewrange_set", PKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- WM_keymap_add_item(keymap, "ACTION_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
-#ifdef WITH_INPUT_NDOF
- WM_keymap_add_item(keymap, "ACTION_OT_view_all", NDOF_BUTTON_FIT, KM_PRESS, 0, 0);
-#endif
- WM_keymap_add_item(keymap, "ACTION_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ACTION_OT_view_frame", PAD0, KM_PRESS, 0, 0);
-
-
- /* animation module */
- /* channels list
- * NOTE: these operators were originally for the channels list, but are added here too for convenience...
- */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_editable_toggle", TABKEY, KM_PRESS, 0, 0);
-
- /* find (i.e. a shortcut for setting the name filter) */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_find", FKEY, KM_PRESS, KM_CTRL, 0);
-
- /* transform system */
- transform_keymap_for_space(keyconf, keymap, SPACE_ACTION);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", OKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.use_proportional_action");
- ED_keymap_proportional_cycle(keyconf, keymap);
-
- /* special markers hotkeys for anim editors: see note in definition of this function */
- ED_marker_keymap_animedit_conflictfree(keymap);
-}
-
/* --------------- */
void action_keymap(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap;
-
/* keymap for all regions */
- keymap = WM_keymap_ensure(keyconf, "Dopesheet Generic", SPACE_ACTION, 0);
-
- /* region management... */
- WM_keymap_add_item(keymap, "ACTION_OT_properties", NKEY, KM_PRESS, 0, 0);
-
+ WM_keymap_ensure(keyconf, "Dopesheet Generic", SPACE_ACTION, 0);
/* channels */
/* Channels are not directly handled by the Action Editor module, but are inherited from the Animation module.
@@ -294,6 +133,5 @@ void action_keymap(wmKeyConfig *keyconf)
*/
/* keyframes */
- keymap = WM_keymap_ensure(keyconf, "Dopesheet", SPACE_ACTION, 0);
- action_keymap_keyframes(keyconf, keymap);
+ WM_keymap_ensure(keyconf, "Dopesheet", SPACE_ACTION, 0);
}
diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c
index ca671078a82..c00be5f4c39 100644
--- a/source/blender/editors/space_action/action_select.c
+++ b/source/blender/editors/space_action/action_select.c
@@ -207,7 +207,7 @@ void ACTION_OT_select_all(wmOperatorType *ot)
WM_operator_properties_select_all(ot);
}
-/* ******************** Border Select Operator **************************** */
+/* ******************** Box Select Operator **************************** */
/* This operator currently works in one of three ways:
* -> BKEY - 1) all keyframes within region are selected (ACTKEYS_BORDERSEL_ALLKEYS)
* -> ALT-BKEY - depending on which axis of the region was larger...
@@ -215,15 +215,15 @@ void ACTION_OT_select_all(wmOperatorType *ot)
* -> 3) y-axis, so select all frames within channels that region included (ACTKEYS_BORDERSEL_CHANNELS)
*/
-/* defines for borderselect mode */
+/* defines for box_select mode */
enum {
ACTKEYS_BORDERSEL_ALLKEYS = 0,
ACTKEYS_BORDERSEL_FRAMERANGE,
ACTKEYS_BORDERSEL_CHANNELS,
-} /*eActKeys_BorderSelect_Mode*/;
+} /*eActKeys_BoxSelect_Mode*/;
-static void borderselect_action(bAnimContext *ac, const rcti rect, short mode, short selectmode)
+static void box_select_action(bAnimContext *ac, const rcti rect, short mode, short selectmode)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
@@ -254,7 +254,7 @@ static void borderselect_action(bAnimContext *ac, const rcti rect, short mode, s
/* init editing data */
memset(&ked, 0, sizeof(KeyframeEditData));
- /* loop over data, doing border select */
+ /* loop over data, doing box select */
for (ale = anim_data.first; ale; ale = ale->next) {
AnimData *adt = ANIM_nla_mapping_get(ac, ale);
@@ -288,7 +288,7 @@ static void borderselect_action(bAnimContext *ac, const rcti rect, short mode, s
bGPdata *gpd = ale->data;
bGPDlayer *gpl;
for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
- ED_gplayer_frames_select_border(gpl, rectf.xmin, rectf.xmax, selectmode);
+ ED_gplayer_frames_select_box(gpl, rectf.xmin, rectf.xmax, selectmode);
}
ale->update |= ANIM_UPDATE_DEPS;
break;
@@ -296,7 +296,7 @@ static void borderselect_action(bAnimContext *ac, const rcti rect, short mode, s
#endif
case ANIMTYPE_GPLAYER:
{
- ED_gplayer_frames_select_border(ale->data, rectf.xmin, rectf.xmax, selectmode);
+ ED_gplayer_frames_select_box(ale->data, rectf.xmin, rectf.xmax, selectmode);
ale->update |= ANIM_UPDATE_DEPS;
break;
}
@@ -305,12 +305,12 @@ static void borderselect_action(bAnimContext *ac, const rcti rect, short mode, s
Mask *mask = ale->data;
MaskLayer *masklay;
for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
- ED_masklayer_frames_select_border(masklay, rectf.xmin, rectf.xmax, selectmode);
+ ED_masklayer_frames_select_box(masklay, rectf.xmin, rectf.xmax, selectmode);
}
break;
}
case ANIMTYPE_MASKLAYER:
- ED_masklayer_frames_select_border(ale->data, rectf.xmin, rectf.xmax, selectmode);
+ ED_masklayer_frames_select_box(ale->data, rectf.xmin, rectf.xmax, selectmode);
break;
default:
ANIM_animchannel_keyframes_loop(&ked, ac->ads, ale, ok_cb, select_cb, NULL);
@@ -329,7 +329,7 @@ static void borderselect_action(bAnimContext *ac, const rcti rect, short mode, s
/* ------------------- */
-static int actkeys_borderselect_exec(bContext *C, wmOperator *op)
+static int actkeys_box_select_exec(bContext *C, wmOperator *op)
{
bAnimContext ac;
rcti rect;
@@ -356,7 +356,7 @@ static int actkeys_borderselect_exec(bContext *C, wmOperator *op)
selectmode = SELECT_SUBTRACT;
}
- /* selection 'mode' depends on whether borderselect region only matters on one axis */
+ /* selection 'mode' depends on whether box_select region only matters on one axis */
if (RNA_boolean_get(op->ptr, "axis_range")) {
/* mode depends on which axis of the range is larger to determine which axis to use
* - checking this in region-space is fine, as it's fundamentally still going to be a different rect size
@@ -371,8 +371,8 @@ static int actkeys_borderselect_exec(bContext *C, wmOperator *op)
else
mode = ACTKEYS_BORDERSEL_ALLKEYS;
- /* apply borderselect action */
- borderselect_action(&ac, rect, mode, selectmode);
+ /* apply box_select action */
+ box_select_action(&ac, rect, mode, selectmode);
/* set notifier that keyframe selection have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, NULL);
@@ -380,18 +380,18 @@ static int actkeys_borderselect_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void ACTION_OT_select_border(wmOperatorType *ot)
+void ACTION_OT_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
- ot->idname = "ACTION_OT_select_border";
+ ot->name = "Box Select";
+ ot->idname = "ACTION_OT_select_box";
ot->description = "Select all keyframes within the specified region";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
- ot->exec = actkeys_borderselect_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = actkeys_box_select_exec;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = ED_operator_action_active;
@@ -399,7 +399,7 @@ void ACTION_OT_select_border(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* rna */
- WM_operator_properties_gesture_border_select(ot);
+ WM_operator_properties_gesture_box_select(ot);
ot->prop = RNA_def_boolean(ot->srna, "axis_range", 0, "Axis Range", "");
}
@@ -573,7 +573,7 @@ static int actkeys_lassoselect_exec(bContext *C, wmOperator *op)
BLI_lasso_boundbox(&rect, data_lasso.mcords, data_lasso.mcords_tot);
BLI_rctf_rcti_copy(&rect_fl, &rect);
- /* apply borderselect action */
+ /* apply box_select action */
region_select_action_keys(&ac, &rect_fl, BEZT_OK_CHANNEL_LASSO, selectmode, &data_lasso);
MEM_freeN((void *)data_lasso.mcords);
@@ -720,11 +720,11 @@ static void markers_selectkeys_between(bAnimContext *ac)
ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
}
else if (ale->type == ANIMTYPE_GPLAYER) {
- ED_gplayer_frames_select_border(ale->data, min, max, SELECT_ADD);
+ ED_gplayer_frames_select_box(ale->data, min, max, SELECT_ADD);
ale->update |= ANIM_UPDATE_DEPS;
}
else if (ale->type == ANIMTYPE_MASKLAYER) {
- ED_masklayer_frames_select_border(ale->data, min, max, SELECT_ADD);
+ ED_masklayer_frames_select_box(ale->data, min, max, SELECT_ADD);
}
else {
ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
@@ -1104,11 +1104,11 @@ static void actkeys_select_leftright(bAnimContext *ac, short leftright, short se
ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
}
else if (ale->type == ANIMTYPE_GPLAYER) {
- ED_gplayer_frames_select_border(ale->data, ked.f1, ked.f2, select_mode);
+ ED_gplayer_frames_select_box(ale->data, ked.f1, ked.f2, select_mode);
ale->update |= ANIM_UPDATE_DEPS;
}
else if (ale->type == ANIMTYPE_MASKLAYER) {
- ED_masklayer_frames_select_border(ale->data, ked.f1, ked.f2, select_mode);
+ ED_masklayer_frames_select_box(ale->data, ked.f1, ked.f2, select_mode);
}
else {
ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
@@ -1419,7 +1419,7 @@ static void mouse_action_keys(bAnimContext *ac, const int mval[2], short select_
* on either side of mouse click (size of keyframe icon)
*/
key_hsize = ACHANNEL_HEIGHT(ac) * 0.8f; /* standard channel height (to allow for some slop) */
- key_hsize = roundf(key_hsize / 2.0f); /* half-size (for either side), but rounded up to nearest int (for easier targetting) */
+ key_hsize = roundf(key_hsize / 2.0f); /* half-size (for either side), but rounded up to nearest int (for easier targeting) */
UI_view2d_region_to_view(v2d, mval[0] - (int)key_hsize, mval[1], &rectf.xmin, &rectf.ymin);
UI_view2d_region_to_view(v2d, mval[0] + (int)key_hsize, mval[1], &rectf.xmax, &rectf.ymax);
@@ -1449,37 +1449,37 @@ static void mouse_action_keys(bAnimContext *ac, const int mval[2], short select_
case ALE_SCE:
{
Scene *scene = (Scene *)ale->key_data;
- scene_to_keylist(ads, scene, &anim_keys, NULL);
+ scene_to_keylist(ads, scene, &anim_keys, 0);
break;
}
case ALE_OB:
{
Object *ob = (Object *)ale->key_data;
- ob_to_keylist(ads, ob, &anim_keys, NULL);
+ ob_to_keylist(ads, ob, &anim_keys, 0);
break;
}
case ALE_ACT:
{
bAction *act = (bAction *)ale->key_data;
- action_to_keylist(adt, act, &anim_keys, NULL);
+ action_to_keylist(adt, act, &anim_keys, 0);
break;
}
case ALE_FCURVE:
{
FCurve *fcu = (FCurve *)ale->key_data;
- fcurve_to_keylist(adt, fcu, &anim_keys, NULL);
+ fcurve_to_keylist(adt, fcu, &anim_keys, 0);
break;
}
}
}
else if (ale->type == ANIMTYPE_SUMMARY) {
/* dopesheet summary covers everything */
- summary_to_keylist(ac, &anim_keys, NULL);
+ summary_to_keylist(ac, &anim_keys, 0);
}
else if (ale->type == ANIMTYPE_GROUP) {
// TODO: why don't we just give groups key_data too?
bActionGroup *agrp = (bActionGroup *)ale->data;
- agroup_to_keylist(adt, agrp, &anim_keys, NULL);
+ agroup_to_keylist(adt, agrp, &anim_keys, 0);
}
else if (ale->type == ANIMTYPE_GPLAYER) {
// TODO: why don't we just give gplayers key_data too?
diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c
index 3e8e92d814d..15587a5f39d 100644
--- a/source/blender/editors/space_action/space_action.c
+++ b/source/blender/editors/space_action/space_action.c
@@ -274,7 +274,7 @@ static void action_main_region_draw(const bContext *C, ARegion *ar)
UI_view2d_view_restore(C);
/* scrollers */
- scrollers = UI_view2d_scrollers_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
+ scrollers = UI_view2d_scrollers_calc(C, v2d, NULL, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);
@@ -299,8 +299,6 @@ static void action_channel_region_init(wmWindowManager *wm, ARegion *ar)
keymap = WM_keymap_ensure(wm->defaultconf, "Animation Channels", 0, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
- WM_keymap_add_menu(keymap, "DOPESHEET_MT_specials_channels", WKEY, KM_PRESS, 0, 0);
-
keymap = WM_keymap_ensure(wm->defaultconf, "Dopesheet Generic", SPACE_ACTION, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
}
diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c
index 5492cf13564..afaa3325f6b 100644
--- a/source/blender/editors/space_api/spacetypes.c
+++ b/source/blender/editors/space_api/spacetypes.c
@@ -68,6 +68,7 @@
#include "ED_mask.h"
#include "ED_sequencer.h"
#include "ED_gizmo_library.h"
+#include "ED_transform.h"
#include "io_ops.h"
@@ -132,7 +133,7 @@ void ED_spacetypes_init(void)
/* gizmo types */
ED_gizmotypes_button_2d();
ED_gizmotypes_dial_3d();
- ED_gizmotypes_grab_3d();
+ ED_gizmotypes_move_3d();
ED_gizmotypes_arrow_2d();
ED_gizmotypes_arrow_3d();
ED_gizmotypes_preselect_3d();
@@ -140,6 +141,10 @@ void ED_spacetypes_init(void)
ED_gizmotypes_blank_3d();
ED_gizmotypes_cage_2d();
ED_gizmotypes_cage_3d();
+ ED_gizmotypes_value_2d();
+
+ /* gizmo group types */
+ ED_gizmogrouptypes_value_2d();
/* register types for operators and gizmos */
spacetypes = BKE_spacetypes_list();
@@ -212,6 +217,8 @@ void ED_spacetypes_keymap(wmKeyConfig *keyconf)
ED_keymap_view2d(keyconf);
ED_keymap_ui(keyconf);
+ ED_keymap_transform(keyconf);
+
spacetypes = BKE_spacetypes_list();
for (stype = spacetypes->first; stype; stype = stype->next) {
if (stype->keymap)
@@ -262,11 +269,6 @@ void ED_region_draw_cb_exit(ARegionType *art, void *handle)
}
}
-void *ED_region_draw_cb_customdata(void *handle)
-{
- return ((RegionDrawCB *)handle)->customdata;
-}
-
void ED_region_draw_cb_draw(const bContext *C, ARegion *ar, int type)
{
RegionDrawCB *rdc;
diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c
index bbd36ce6d7d..d8a85e6daab 100644
--- a/source/blender/editors/space_buttons/buttons_context.c
+++ b/source/blender/editors/space_buttons/buttons_context.c
@@ -118,6 +118,13 @@ static int buttons_context_path_scene(ButsContextPath *path)
static int buttons_context_path_view_layer(ButsContextPath *path, wmWindow *win)
{
+ PointerRNA *ptr = &path->ptr[path->len - 1];
+
+ /* View Layer may have already been resolved in a previous call (e.g. in buttons_context_path_linestyle). */
+ if (RNA_struct_is_a(ptr->type, &RNA_ViewLayer)) {
+ return 1;
+ }
+
if (buttons_context_path_scene(path)) {
Scene *scene = path->ptr[path->len - 1].data;
ViewLayer *view_layer = (win->scene == scene) ?
@@ -405,7 +412,8 @@ static int buttons_context_path_brush(const bContext *C, ButsContextPath *path)
scene = path->ptr[path->len - 1].data;
if (scene) {
- ViewLayer *view_layer = CTX_data_view_layer(C);
+ wmWindow *window = CTX_wm_window(C);
+ ViewLayer *view_layer = WM_window_get_active_view_layer(window);
br = BKE_paint_brush(BKE_paint_get_active(scene, view_layer));
}
@@ -460,7 +468,8 @@ static int buttons_context_path_texture(const bContext *C, ButsContextPath *path
#ifdef WITH_FREESTYLE
static bool buttons_context_linestyle_pinnable(const bContext *C, ViewLayer *view_layer)
{
- Scene *scene = CTX_data_scene(C);
+ wmWindow *window = CTX_wm_window(C);
+ Scene *scene = WM_window_get_active_scene(window);
FreestyleConfig *config;
SpaceButs *sbuts;
@@ -484,13 +493,15 @@ static bool buttons_context_linestyle_pinnable(const bContext *C, ViewLayer *vie
static int buttons_context_path(const bContext *C, ButsContextPath *path, int mainb, int flag)
{
+ /* Note we don't use CTX_data here, instead we get it from the window.
+ * Otherwise there is a loop reading the context that we are setting. */
SpaceButs *sbuts = CTX_wm_space_buts(C);
- Scene *scene = CTX_data_scene(C);
- ViewLayer *view_layer = CTX_data_view_layer(C);
wmWindow *window = CTX_wm_window(C);
+ Scene *scene = WM_window_get_active_scene(window);
+ ViewLayer *view_layer = WM_window_get_active_view_layer(window);
+ Object *ob = OBACT(view_layer);
ID *id;
int found;
- Object *ob = CTX_data_active_object(C);
memset(path, 0, sizeof(*path));
path->flag = flag;
@@ -507,7 +518,7 @@ static int buttons_context_path(const bContext *C, ButsContextPath *path, int ma
RNA_id_pointer_create(&scene->id, &path->ptr[0]);
path->len++;
- if (!ELEM(mainb, BCONTEXT_SCENE, BCONTEXT_RENDER, BCONTEXT_VIEW_LAYER, BCONTEXT_WORLD)) {
+ if (!ELEM(mainb, BCONTEXT_SCENE, BCONTEXT_RENDER, BCONTEXT_OUTPUT, BCONTEXT_VIEW_LAYER, BCONTEXT_WORLD)) {
RNA_pointer_create(NULL, &RNA_ViewLayer, view_layer, &path->ptr[path->len]);
path->len++;
}
@@ -518,6 +529,7 @@ static int buttons_context_path(const bContext *C, ButsContextPath *path, int ma
switch (mainb) {
case BCONTEXT_SCENE:
case BCONTEXT_RENDER:
+ case BCONTEXT_OUTPUT:
found = buttons_context_path_scene(path);
break;
case BCONTEXT_VIEW_LAYER:
@@ -585,7 +597,9 @@ static int buttons_context_path(const bContext *C, ButsContextPath *path, int ma
static int buttons_shading_context(const bContext *C, int mainb)
{
- Object *ob = CTX_data_active_object(C);
+ wmWindow *window = CTX_wm_window(C);
+ ViewLayer *view_layer = WM_window_get_active_view_layer(window);
+ Object *ob = OBACT(view_layer);
if (ELEM(mainb, BCONTEXT_MATERIAL, BCONTEXT_WORLD, BCONTEXT_TEXTURE))
return 1;
@@ -597,7 +611,9 @@ static int buttons_shading_context(const bContext *C, int mainb)
static int buttons_shading_new_context(const bContext *C, int flag)
{
- Object *ob = CTX_data_active_object(C);
+ wmWindow *window = CTX_wm_window(C);
+ ViewLayer *view_layer = WM_window_get_active_view_layer(window);
+ Object *ob = OBACT(view_layer);
if (flag & (1 << BCONTEXT_MATERIAL))
return BCONTEXT_MATERIAL;
@@ -639,13 +655,7 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
sbuts->dataicon = RNA_struct_ui_icon(ptr->type);
}
else {
- Object *ob = CTX_data_active_object(C);
- if (ob->type == OB_GPENCIL) {
- sbuts->dataicon = ICON_GREASEPENCIL;
- }
- else {
- sbuts->dataicon = ICON_EMPTY_DATA;
- }
+ sbuts->dataicon = ICON_EMPTY_DATA;
}
}
}
@@ -1021,28 +1031,21 @@ void buttons_context_draw(const bContext *C, uiLayout *layout)
row = uiLayoutRow(layout, true);
uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_LEFT);
- block = uiLayoutGetBlock(row);
- UI_block_emboss_set(block, UI_EMBOSS_NONE);
- but = uiDefIconButBitC(block, UI_BTYPE_ICON_TOGGLE, SB_PIN_CONTEXT, 0, ICON_UNPINNED, 0, 0, UI_UNIT_X, UI_UNIT_Y, &sbuts->flag,
- 0, 0, 0, 0, TIP_("Follow context or keep fixed data-block displayed"));
- UI_but_flag_disable(but, UI_BUT_UNDO); /* skip undo on screen buttons */
- UI_but_func_set(but, pin_cb, NULL, NULL);
-
for (a = 0; a < path->len; a++) {
ptr = &path->ptr[a];
if (a != 0)
- uiItemL(row, "", VICO_SMALL_TRI_RIGHT_VEC);
+ uiItemL(row, "", ICON_SMALL_TRI_RIGHT_VEC);
if (ptr->data) {
icon = RNA_struct_ui_icon(ptr->type);
name = RNA_struct_name_get_alloc(ptr, namebuf, sizeof(namebuf), NULL);
if (name) {
- if ((!ELEM(sbuts->mainb, BCONTEXT_RENDER, BCONTEXT_SCENE, BCONTEXT_VIEW_LAYER, BCONTEXT_WORLD) && ptr->type == &RNA_Scene)) {
+ if ((!ELEM(sbuts->mainb, BCONTEXT_RENDER, BCONTEXT_OUTPUT, BCONTEXT_SCENE, BCONTEXT_VIEW_LAYER, BCONTEXT_WORLD) && ptr->type == &RNA_Scene)) {
uiItemLDrag(row, ptr, "", icon); /* save some space */
}
- else if ((!ELEM(sbuts->mainb, BCONTEXT_RENDER, BCONTEXT_SCENE, BCONTEXT_VIEW_LAYER, BCONTEXT_WORLD) && ptr->type == &RNA_ViewLayer)) {
+ else if ((!ELEM(sbuts->mainb, BCONTEXT_RENDER, BCONTEXT_OUTPUT, BCONTEXT_SCENE, BCONTEXT_VIEW_LAYER, BCONTEXT_WORLD) && ptr->type == &RNA_ViewLayer)) {
uiItemLDrag(row, ptr, "", icon); /* save some space */
}
else {
@@ -1056,21 +1059,49 @@ void buttons_context_draw(const bContext *C, uiLayout *layout)
uiItemL(row, "", icon);
}
}
+
+ uiItemSpacer(row);
+
+ block = uiLayoutGetBlock(row);
+ UI_block_emboss_set(block, UI_EMBOSS_NONE);
+ but = uiDefIconButBitC(block, UI_BTYPE_ICON_TOGGLE, SB_PIN_CONTEXT, 0, ICON_UNPINNED, 0, 0, UI_UNIT_X, UI_UNIT_Y, &sbuts->flag,
+ 0, 0, 0, 0, TIP_("Follow context or keep fixed data-block displayed"));
+ UI_but_flag_disable(but, UI_BUT_UNDO); /* skip undo on screen buttons */
+ UI_but_func_set(but, pin_cb, NULL, NULL);
}
+#ifdef USE_HEADER_CONTEXT_PATH
+static bool buttons_header_context_poll(const bContext *C, HeaderType *UNUSED(ht))
+#else
static bool buttons_panel_context_poll(const bContext *C, PanelType *UNUSED(pt))
+#endif
{
SpaceButs *sbuts = CTX_wm_space_buts(C);
return (sbuts->mainb != BCONTEXT_TOOL);
}
-static void buttons_panel_context_draw(const bContext *C, Panel *pa)
+#ifdef USE_HEADER_CONTEXT_PATH
+static void buttons_header_context_draw(const bContext *C, Header *ptr)
+#else
+static void buttons_panel_context_draw(const bContext *C, Panel *ptr)
+#endif
{
- buttons_context_draw(C, pa->layout);
+ buttons_context_draw(C, ptr->layout);
}
void buttons_context_register(ARegionType *art)
{
+#ifdef USE_HEADER_CONTEXT_PATH
+ HeaderType *ht;
+
+ ht = MEM_callocN(sizeof(HeaderType), "spacetype buttons context header");
+ strcpy(ht->idname, "BUTTONS_HT_context");
+ ht->space_type = SPACE_BUTS;
+ ht->region_type = art->regionid;
+ ht->poll = buttons_header_context_poll;
+ ht->draw = buttons_header_context_draw;
+ BLI_addtail(&art->headertypes, ht);
+#else
PanelType *pt;
pt = MEM_callocN(sizeof(PanelType), "spacetype buttons panel context");
@@ -1081,6 +1112,7 @@ void buttons_context_register(ARegionType *art)
pt->draw = buttons_panel_context_draw;
pt->flag = PNL_NO_HEADER;
BLI_addtail(&art->paneltypes, pt);
+#endif
}
ID *buttons_context_id_path(const bContext *C)
diff --git a/source/blender/editors/space_buttons/buttons_intern.h b/source/blender/editors/space_buttons/buttons_intern.h
index aab7b39484d..65bcf7ef1c8 100644
--- a/source/blender/editors/space_buttons/buttons_intern.h
+++ b/source/blender/editors/space_buttons/buttons_intern.h
@@ -45,6 +45,9 @@ struct bNodeTree;
struct uiLayout;
struct wmOperatorType;
+/* Display the context path in the header instead of the main window */
+#define USE_HEADER_CONTEXT_PATH
+
/* context data */
typedef struct ButsContextPath {
diff --git a/source/blender/editors/space_buttons/buttons_ops.c b/source/blender/editors/space_buttons/buttons_ops.c
index fb2907983c8..473deb35aac 100644
--- a/source/blender/editors/space_buttons/buttons_ops.c
+++ b/source/blender/editors/space_buttons/buttons_ops.c
@@ -64,9 +64,15 @@
static int context_menu_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *UNUSED(event))
{
+ const ARegion *ar = CTX_wm_region(C);
uiPopupMenu *pup = UI_popup_menu_begin(C, IFACE_("Context Menu"), ICON_NONE);
uiLayout *layout = UI_popup_menu_layout(pup);
+
uiItemM(layout, "INFO_MT_area", NULL, ICON_NONE);
+ if (ar->regiontype == RGN_TYPE_NAV_BAR) {
+ ED_screens_navigation_bar_tools_menu_create(C, layout, NULL);
+ }
+
UI_popup_menu_end(C, pup);
return OPERATOR_INTERFACE;
diff --git a/source/blender/editors/space_buttons/buttons_texture.c b/source/blender/editors/space_buttons/buttons_texture.c
index de422565abd..958b55526c3 100644
--- a/source/blender/editors/space_buttons/buttons_texture.c
+++ b/source/blender/editors/space_buttons/buttons_texture.c
@@ -507,7 +507,7 @@ void uiTemplateTextureShow(uiLayout *layout, bContext *C, PointerRNA *ptr, Prope
uiBlock *block = uiLayoutGetBlock(layout);
uiBut *but;
- but = uiDefIconBut(block, UI_BTYPE_BUT, 0, ICON_BUTS, 0, 0, UI_UNIT_X, UI_UNIT_Y,
+ but = uiDefIconBut(block, UI_BTYPE_BUT, 0, ICON_PROPERTIES, 0, 0, UI_UNIT_X, UI_UNIT_Y,
NULL, 0.0, 0.0, 0.0, 0.0, TIP_("Show texture in texture tab"));
UI_but_func_set(but, template_texture_show, user->ptr.data, user->prop);
}
diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c
index 56d70d10a96..1f1f238daf6 100644
--- a/source/blender/editors/space_buttons/space_buttons.c
+++ b/source/blender/editors/space_buttons/space_buttons.c
@@ -75,6 +75,13 @@ static SpaceLink *buttons_new(const ScrArea *UNUSED(area), const Scene *UNUSED(s
ar->regiontype = RGN_TYPE_HEADER;
ar->alignment = RGN_ALIGN_TOP;
+ /* navigation bar */
+ ar = MEM_callocN(sizeof(ARegion), "navigation bar for buts");
+
+ BLI_addtail(&sbuts->regionbase, ar);
+ ar->regiontype = RGN_TYPE_NAV_BAR;
+ ar->alignment = RGN_ALIGN_LEFT;
+
#if 0
/* context region */
ar = MEM_callocN(sizeof(ARegion), "context region for buts");
@@ -147,6 +154,9 @@ static void buttons_main_region_layout_properties(const bContext *C, SpaceButs *
case BCONTEXT_RENDER:
contexts[0] = "render";
break;
+ case BCONTEXT_OUTPUT:
+ contexts[0] = "output";
+ break;
case BCONTEXT_VIEW_LAYER:
contexts[0] = "view_layer";
break;
@@ -260,7 +270,20 @@ static void buttons_main_region_layout_tool(const bContext *C, ARegion *ar)
}
}
else if (workspace->tools_space_type == SPACE_IMAGE) {
- /* TODO */
+ switch (workspace->tools_mode) {
+ case SI_MODE_VIEW:
+ break;
+ case SI_MODE_PAINT:
+ ARRAY_SET_ITEMS(contexts, ".paint_common_2d", ".imagepaint_2d");
+ break;
+ case SI_MODE_MASK:
+ break;
+ case SI_MODE_UV:
+ if (mode == CTX_MODE_EDIT_MESH) {
+ ARRAY_SET_ITEMS(contexts, ".uv_sculpt");
+ }
+ break;
+ }
}
/* for grease pencil we don't use tool system yet, so we need check outside
@@ -330,14 +353,19 @@ static void buttons_operatortypes(void)
static void buttons_keymap(struct wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Property Editor", SPACE_BUTS, 0);
-
- WM_keymap_add_item(keymap, "BUTTONS_OT_context_menu", RIGHTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_ensure(keyconf, "Property Editor", SPACE_BUTS, 0);
}
/* add handlers, stuff you only do once or on area/region changes */
static void buttons_header_region_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
+#ifdef USE_HEADER_CONTEXT_PATH
+ /* Reinsert context buttons header-type at the end of the list so it's drawn last. */
+ HeaderType *context_ht = BLI_findstring(&ar->type->headertypes, "BUTTONS_HT_context", offsetof(HeaderType, idname));
+ BLI_remlink(&ar->type->headertypes, context_ht);
+ BLI_addtail(&ar->type->headertypes, context_ht);
+#endif
+
ED_region_header_init(ar);
}
@@ -368,13 +396,39 @@ static void buttons_header_region_message_subscribe(
* where one has no active object, so that available contexts changes. */
WM_msg_subscribe_rna_anon_prop(mbus, Window, view_layer, &msg_sub_value_region_tag_redraw);
- if (!ELEM(sbuts->mainb, BCONTEXT_RENDER, BCONTEXT_SCENE, BCONTEXT_WORLD)) {
+ if (!ELEM(sbuts->mainb, BCONTEXT_RENDER, BCONTEXT_OUTPUT, BCONTEXT_SCENE, BCONTEXT_WORLD)) {
WM_msg_subscribe_rna_anon_prop(mbus, ViewLayer, name, &msg_sub_value_region_tag_redraw);
}
if (sbuts->mainb == BCONTEXT_TOOL) {
WM_msg_subscribe_rna_anon_prop(mbus, WorkSpace, tools, &msg_sub_value_region_tag_redraw);
}
+
+#ifdef USE_HEADER_CONTEXT_PATH
+ WM_msg_subscribe_rna_anon_prop(mbus, SpaceProperties, context, &msg_sub_value_region_tag_redraw);
+#endif
+}
+
+static void buttons_navigation_bar_region_init(wmWindowManager *wm, ARegion *ar)
+{
+ wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Property Editor", SPACE_BUTS, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ ar->flag |= RGN_FLAG_PREFSIZE_OR_HIDDEN;
+
+ ED_region_panels_init(wm, ar);
+ ar->v2d.keepzoom |= V2D_LOCKZOOM_X | V2D_LOCKZOOM_Y;
+}
+
+static void buttons_navigation_bar_region_draw(const bContext *C, ARegion *ar)
+{
+ for (PanelType *pt = ar->type->paneltypes.first; pt; pt = pt->next) {
+ pt->flag |= PNL_LAYOUT_VERT_BAR;
+ }
+
+ ED_region_panels_layout(C, ar);
+ ar->v2d.scroll &= ~V2D_SCROLL_VERTICAL; /* ED_region_panels_layout adds vertical scrollbars, we don't want them. */
+ ED_region_panels_draw(C, ar);
}
/* draw a certain button set only if properties area is currently
@@ -511,6 +565,7 @@ static void buttons_area_listener(
break;
case NC_BRUSH:
buttons_area_redraw(sa, BCONTEXT_TEXTURE);
+ buttons_area_redraw(sa, BCONTEXT_TOOL);
sbuts->preview = 1;
break;
case NC_TEXTURE:
@@ -651,9 +706,10 @@ void ED_spacetype_buttons(void)
art->draw = ED_region_panels_draw;
art->listener = buttons_main_region_listener;
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_FRAMES;
- BLI_addhead(&st->regiontypes, art);
-
+#ifndef USE_HEADER_CONTEXT_PATH
buttons_context_register(art);
+#endif
+ BLI_addhead(&st->regiontypes, art);
/* regions: header */
art = MEM_callocN(sizeof(ARegionType), "spacetype buttons region");
@@ -664,6 +720,18 @@ void ED_spacetype_buttons(void)
art->init = buttons_header_region_init;
art->draw = buttons_header_region_draw;
art->message_subscribe = buttons_header_region_message_subscribe;
+#ifdef USE_HEADER_CONTEXT_PATH
+ buttons_context_register(art);
+#endif
+ BLI_addhead(&st->regiontypes, art);
+
+ /* regions: navigation bar */
+ art = MEM_callocN(sizeof(ARegionType), "spacetype nav buttons region");
+ art->regionid = RGN_TYPE_NAV_BAR;
+ art->prefsizex = AREAMINX - 3; /* XXX Works and looks best, should we update AREAMINX accordingly? */
+ art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_FRAMES;
+ art->init = buttons_navigation_bar_region_init;
+ art->draw = buttons_navigation_bar_region_draw;
BLI_addhead(&st->regiontypes, art);
BKE_spacetype_register(st);
diff --git a/source/blender/editors/space_clip/clip_buttons.c b/source/blender/editors/space_clip/clip_buttons.c
index 6953b7cfb71..a106ab5c465 100644
--- a/source/blender/editors/space_clip/clip_buttons.c
+++ b/source/blender/editors/space_clip/clip_buttons.c
@@ -390,6 +390,7 @@ void uiTemplateMarker(uiLayout *layout, PointerRNA *ptr, const char *propname, P
bt = uiDefIconButBitI(block, UI_BTYPE_TOGGLE_N, MARKER_DISABLED, 0, ICON_HIDE_OFF, 0, 0, UI_UNIT_X, UI_UNIT_Y,
&cb->marker_flag, 0, 0, 1, 0, tip);
UI_but_funcN_set(bt, marker_update_cb, cb, NULL);
+ UI_but_drawflag_enable(bt, UI_BUT_ICON_REVERSE);
}
else {
int width, height, step, digits;
diff --git a/source/blender/editors/space_clip/clip_dopesheet_draw.c b/source/blender/editors/space_clip/clip_dopesheet_draw.c
index 2aa0a3e2b9a..c05a4c1b64c 100644
--- a/source/blender/editors/space_clip/clip_dopesheet_draw.c
+++ b/source/blender/editors/space_clip/clip_dopesheet_draw.c
@@ -82,7 +82,7 @@ static void draw_keyframe_shape(float x, float y, bool sel, float alpha,
UI_GetThemeColorShadeAlpha4fv(TH_STRIP_SELECT, 50, -255 * (1.0f - alpha), color);
}
- immAttrib4fv(color_id, color);
+ immAttr4fv(color_id, color);
immVertex2f(pos_id, x, y);
}
@@ -219,14 +219,17 @@ void clip_draw_dopesheet_main(SpaceClip *sc, ARegion *ar, Scene *scene)
uint size_id = GPU_vertformat_attr_add(format, "size", GPU_COMP_F32, 1, GPU_FETCH_FLOAT);
uint color_id = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
uint outline_color_id = GPU_vertformat_attr_add(format, "outlineColor", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
+ uint flags_id = GPU_vertformat_attr_add(format, "flags", GPU_COMP_U32, 1, GPU_FETCH_INT);
immBindBuiltinProgram(GPU_SHADER_KEYFRAME_DIAMOND);
GPU_enable_program_point_size();
+ immUniform2f("ViewportSize", BLI_rcti_size_x(&v2d->mask) + 1, BLI_rcti_size_y(&v2d->mask) + 1);
immBegin(GPU_PRIM_POINTS, keyframe_len);
/* all same size with black outline */
- immAttrib1f(size_id, 2.0f * STRIP_HEIGHT_HALF);
- immAttrib4ub(outline_color_id, 0, 0, 0, 255);
+ immAttr1f(size_id, 2.0f * STRIP_HEIGHT_HALF);
+ immAttr4ub(outline_color_id, 0, 0, 0, 255);
+ immAttr1u(flags_id, 0);
y = (float) CHANNEL_FIRST; /* start again at the top */
for (channel = dopesheet->channels.first; channel; channel = channel->next) {
diff --git a/source/blender/editors/space_clip/clip_draw.c b/source/blender/editors/space_clip/clip_draw.c
index ebdf5342172..9f4983a35b2 100644
--- a/source/blender/editors/space_clip/clip_draw.c
+++ b/source/blender/editors/space_clip/clip_draw.c
@@ -1154,16 +1154,16 @@ static void draw_plane_marker_image(Scene *scene,
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texCoord, 0.0f, 0.0f);
+ immAttr2f(texCoord, 0.0f, 0.0f);
immVertex2f(pos, 0.0f, 0.0f);
- immAttrib2f(texCoord, 1.0f, 0.0f);
+ immAttr2f(texCoord, 1.0f, 0.0f);
immVertex2f(pos, 1.0f, 0.0f);
- immAttrib2f(texCoord, 1.0f, 1.0f);
+ immAttr2f(texCoord, 1.0f, 1.0f);
immVertex2f(pos, 1.0f, 1.0f);
- immAttrib2f(texCoord, 0.0f, 1.0f);
+ immAttr2f(texCoord, 0.0f, 1.0f);
immVertex2f(pos, 0.0f, 1.0f);
immEnd();
diff --git a/source/blender/editors/space_clip/clip_editor.c b/source/blender/editors/space_clip/clip_editor.c
index 0fb7d63180f..8308c781902 100644
--- a/source/blender/editors/space_clip/clip_editor.c
+++ b/source/blender/editors/space_clip/clip_editor.c
@@ -50,13 +50,13 @@
#include "BLI_rect.h"
#include "BLI_task.h"
+#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_mask.h"
#include "BKE_movieclip.h"
-#include "BKE_context.h"
#include "BKE_tracking.h"
-#include "BKE_library.h"
#include "IMB_colormanagement.h"
diff --git a/source/blender/editors/space_clip/clip_graph_ops.c b/source/blender/editors/space_clip/clip_graph_ops.c
index 5b51f70c447..06233d64a36 100644
--- a/source/blender/editors/space_clip/clip_graph_ops.c
+++ b/source/blender/editors/space_clip/clip_graph_ops.c
@@ -329,17 +329,17 @@ void CLIP_OT_graph_select(wmOperatorType *ot)
"Extend", "Extend selection rather than clearing the existing selection");
}
-/********************** border select operator *********************/
+/********************** box select operator *********************/
-typedef struct BorderSelectuserData {
+typedef struct BoxSelectuserData {
rctf rect;
bool select, extend, changed;
-} BorderSelectuserData;
+} BoxSelectuserData;
-static void border_select_cb(void *userdata, MovieTrackingTrack *UNUSED(track),
+static void box_select_cb(void *userdata, MovieTrackingTrack *UNUSED(track),
MovieTrackingMarker *marker, int coord, int scene_framenr, float val)
{
- BorderSelectuserData *data = (BorderSelectuserData *) userdata;
+ BoxSelectuserData *data = (BoxSelectuserData *) userdata;
if (BLI_rctf_isect_pt(&data->rect, scene_framenr, val)) {
int flag = 0;
@@ -362,7 +362,7 @@ static void border_select_cb(void *userdata, MovieTrackingTrack *UNUSED(track),
}
}
-static int border_select_graph_exec(bContext *C, wmOperator *op)
+static int box_select_graph_exec(bContext *C, wmOperator *op)
{
SpaceClip *sc = CTX_wm_space_clip(C);
ARegion *ar = CTX_wm_region(C);
@@ -370,7 +370,7 @@ static int border_select_graph_exec(bContext *C, wmOperator *op)
MovieClip *clip = ED_space_clip_get_clip(sc);
MovieTracking *tracking = &clip->tracking;
MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking);
- BorderSelectuserData userdata;
+ BoxSelectuserData userdata;
rctf rect;
if (act_track == NULL) {
@@ -385,7 +385,7 @@ static int border_select_graph_exec(bContext *C, wmOperator *op)
userdata.select = !RNA_boolean_get(op->ptr, "deselect");
userdata.extend = RNA_boolean_get(op->ptr, "extend");
- clip_graph_tracking_values_iterate_track(sc, act_track, &userdata, border_select_cb, NULL, NULL);
+ clip_graph_tracking_values_iterate_track(sc, act_track, &userdata, box_select_cb, NULL, NULL);
if (userdata.changed) {
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, NULL);
@@ -396,24 +396,24 @@ static int border_select_graph_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-void CLIP_OT_graph_select_border(wmOperatorType *ot)
+void CLIP_OT_graph_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
- ot->description = "Select curve points using border selection";
- ot->idname = "CLIP_OT_graph_select_border";
+ ot->name = "Box Select";
+ ot->description = "Select curve points using box selection";
+ ot->idname = "CLIP_OT_graph_select_box";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
- ot->exec = border_select_graph_exec;
- ot->modal = WM_gesture_border_modal;
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = box_select_graph_exec;
+ ot->modal = WM_gesture_box_modal;
ot->poll = clip_graph_knots_poll;
/* flags */
ot->flag = OPTYPE_UNDO;
/* properties */
- WM_operator_properties_gesture_border_select(ot);
+ WM_operator_properties_gesture_box_select(ot);
}
/********************** select all operator *********************/
diff --git a/source/blender/editors/space_clip/clip_intern.h b/source/blender/editors/space_clip/clip_intern.h
index e5c4f567d5c..b407056ea96 100644
--- a/source/blender/editors/space_clip/clip_intern.h
+++ b/source/blender/editors/space_clip/clip_intern.h
@@ -84,7 +84,7 @@ void clip_draw_graph(struct SpaceClip *sc, struct ARegion *ar, struct Scene *sce
void ED_clip_graph_center_current_frame(struct Scene *scene, struct ARegion *ar);
void CLIP_OT_graph_select(struct wmOperatorType *ot);
-void CLIP_OT_graph_select_border(struct wmOperatorType *ot);
+void CLIP_OT_graph_select_box(struct wmOperatorType *ot);
void CLIP_OT_graph_select_all_markers(struct wmOperatorType *ot);
void CLIP_OT_graph_delete_curve(struct wmOperatorType *ot);
void CLIP_OT_graph_delete_knot(struct wmOperatorType *ot);
@@ -212,7 +212,7 @@ void CLIP_OT_keyframe_delete(struct wmOperatorType *ot);
/* tracking_select.c */
void CLIP_OT_select(struct wmOperatorType *ot);
void CLIP_OT_select_all(struct wmOperatorType *ot);
-void CLIP_OT_select_border(struct wmOperatorType *ot);
+void CLIP_OT_select_box(struct wmOperatorType *ot);
void CLIP_OT_select_lasso(struct wmOperatorType *ot);
void CLIP_OT_select_circle(struct wmOperatorType *ot);
void CLIP_OT_select_grouped(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_clip/clip_ops.c b/source/blender/editors/space_clip/clip_ops.c
index 26327dc9b41..e56ec98a232 100644
--- a/source/blender/editors/space_clip/clip_ops.c
+++ b/source/blender/editors/space_clip/clip_ops.c
@@ -56,10 +56,10 @@
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_report.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_movieclip.h"
+#include "BKE_report.h"
#include "BKE_sound.h"
#include "BKE_tracking.h"
@@ -114,12 +114,16 @@ static void sclip_zoom_set(const bContext *C, float zoom, float location[2])
}
if ((U.uiflag & USER_ZOOM_TO_MOUSEPOS) && location) {
- float dx, dy;
+ float aspx, aspy, w, h, dx, dy;
ED_space_clip_get_size(sc, &width, &height);
+ ED_space_clip_get_aspect(sc, &aspx, &aspy);
+
+ w = width * aspx;
+ h = height * aspy;
- dx = ((location[0] - 0.5f) * width - sc->xof) * (sc->zoom - oldzoom) / sc->zoom;
- dy = ((location[1] - 0.5f) * height - sc->yof) * (sc->zoom - oldzoom) / sc->zoom;
+ 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) {
sc->xlockof += dx;
@@ -1586,7 +1590,7 @@ void CLIP_OT_cursor_set(wmOperatorType *ot)
"Cursor location in normalized clip coordinates", -10.0f, 10.0f);
}
-/********************** macroses *********************/
+/********************** macros *********************/
void ED_operatormacros_clip(void)
{
diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c
index bee266285d3..10f7777ee31 100644
--- a/source/blender/editors/space_clip/space_clip.c
+++ b/source/blender/editors/space_clip/space_clip.c
@@ -44,10 +44,10 @@
#include "BLI_math.h"
#include "BKE_context.h"
-#include "BKE_screen.h"
#include "BKE_library.h"
#include "BKE_movieclip.h"
#include "BKE_tracking.h"
+#include "BKE_screen.h"
#include "IMB_imbuf_types.h"
@@ -446,7 +446,7 @@ static void clip_operatortypes(void)
/* selection */
WM_operatortype_append(CLIP_OT_select);
WM_operatortype_append(CLIP_OT_select_all);
- WM_operatortype_append(CLIP_OT_select_border);
+ WM_operatortype_append(CLIP_OT_select_box);
WM_operatortype_append(CLIP_OT_select_lasso);
WM_operatortype_append(CLIP_OT_select_circle);
WM_operatortype_append(CLIP_OT_select_grouped);
@@ -520,7 +520,7 @@ static void clip_operatortypes(void)
/* selection */
WM_operatortype_append(CLIP_OT_graph_select);
- WM_operatortype_append(CLIP_OT_graph_select_border);
+ WM_operatortype_append(CLIP_OT_graph_select_box);
WM_operatortype_append(CLIP_OT_graph_select_all_markers);
WM_operatortype_append(CLIP_OT_graph_delete_curve);
@@ -538,287 +538,18 @@ static void clip_operatortypes(void)
static void clip_keymap(struct wmKeyConfig *keyconf)
{
- wmKeyMap *keymap;
- wmKeyMapItem *kmi;
-
/* ******** Global hotkeys avalaible for all regions ******** */
-
- keymap = WM_keymap_ensure(keyconf, "Clip", SPACE_CLIP, 0);
-
- WM_keymap_add_item(keymap, "CLIP_OT_open", OKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "CLIP_OT_tools", TKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_properties", NKEY, KM_PRESS, 0, 0);
-
- /* 2d tracking */
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_track_markers", LEFTARROWKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "backwards", true);
- RNA_boolean_set(kmi->ptr, "sequence", false);
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_track_markers", RIGHTARROWKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "backwards", false);
- RNA_boolean_set(kmi->ptr, "sequence", false);
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_track_markers", TKEY, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "backwards", false);
- RNA_boolean_set(kmi->ptr, "sequence", true);
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_track_markers", TKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "backwards", true);
- RNA_boolean_set(kmi->ptr, "sequence", true);
-
- /* mode */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle_enum", TABKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.mode");
- RNA_string_set(kmi->ptr, "value_1", "TRACKING");
- RNA_string_set(kmi->ptr, "value_2", "MASK");
-
- WM_keymap_add_item(keymap, "CLIP_OT_solve_camera", SKEY, KM_PRESS, KM_SHIFT, 0);
-
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_set_solver_keyframe", QKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "keyframe", 0);
-
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_set_solver_keyframe", EKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "keyframe", 1);
-
- /* io/playback */
- WM_keymap_add_item(keymap, "CLIP_OT_prefetch", PKEY, KM_PRESS, 0, 0);
+ WM_keymap_ensure(keyconf, "Clip", SPACE_CLIP, 0);
/* ******** Hotkeys avalaible for main region only ******** */
-
- keymap = WM_keymap_ensure(keyconf, "Clip Editor", SPACE_CLIP, 0);
+ WM_keymap_ensure(keyconf, "Clip Editor", SPACE_CLIP, 0);
// keymap->poll = ED_space_clip_tracking_poll;
- /* ** View/navigation ** */
-
- WM_keymap_add_item(keymap, "CLIP_OT_view_pan", MIDDLEMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_view_pan", MIDDLEMOUSE, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_view_pan", MOUSEPAN, 0, 0, 0);
-
- WM_keymap_add_item(keymap, "CLIP_OT_view_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_view_zoom", MOUSEZOOM, 0, 0, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_view_zoom", MOUSEPAN, 0, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_in", WHEELINMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_out", WHEELOUTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_in", PADPLUSKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_out", PADMINUS, KM_PRESS, 0, 0);
-
- /* ctrl now works as well, shift + numpad works as arrow keys on Windows */
- RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD8, KM_PRESS, KM_CTRL, 0)->ptr, "ratio", 8.0f);
- RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD4, KM_PRESS, KM_CTRL, 0)->ptr, "ratio", 4.0f);
- RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD2, KM_PRESS, KM_CTRL, 0)->ptr, "ratio", 2.0f);
- RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD8, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 8.0f);
- RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD4, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 4.0f);
- RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD2, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 2.0f);
-
- RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD1, KM_PRESS, 0, 0)->ptr, "ratio", 1.0f);
- RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD2, KM_PRESS, 0, 0)->ptr, "ratio", 0.5f);
- RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD4, KM_PRESS, 0, 0)->ptr, "ratio", 0.25f);
- RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD8, KM_PRESS, 0, 0)->ptr, "ratio", 0.125f);
-
- WM_keymap_add_item(keymap, "CLIP_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_view_all", FKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "fit_view", true);
-
- WM_keymap_add_item(keymap, "CLIP_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
-
-#ifdef WITH_INPUT_NDOF
- WM_keymap_add_item(keymap, "CLIP_OT_view_all", NDOF_BUTTON_FIT, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_view_ndof", NDOF_MOTION, 0, 0, 0);
-#endif
-
- /* jump to special frame */
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "position", 0);
-
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "position", 1);
-
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_ALT | KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "position", 2);
-
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_ALT | KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "position", 3);
-
- /* "timeline" */
- WM_keymap_add_item(keymap, "CLIP_OT_change_frame", LEFTMOUSE, KM_PRESS, 0, 0);
-
- /* selection */
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
-
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
- WM_keymap_add_item(keymap, "CLIP_OT_select_border", BKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_select_circle", CKEY, KM_PRESS, 0, 0);
- WM_keymap_add_menu(keymap, "CLIP_MT_select_grouped", GKEY, KM_PRESS, KM_SHIFT, 0);
-
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_SHIFT | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", true);
-
- /* marker */
- WM_keymap_add_item(keymap, "CLIP_OT_add_marker_slide", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "CLIP_OT_delete_marker", XKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_delete_marker", DELKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "CLIP_OT_slide_marker", LEFTMOUSE, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_disable_markers", DKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "action", 2); /* toggle */
-
- /* tracks */
- WM_keymap_add_item(keymap, "CLIP_OT_delete_track", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_delete_track", DELKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_lock_tracks", LKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", 0); /* lock */
-
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_lock_tracks", LKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", 1); /* unlock */
-
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_hide_tracks", HKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
-
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_hide_tracks", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
-
- WM_keymap_add_item(keymap, "CLIP_OT_hide_tracks_clear", HKEY, KM_PRESS, KM_ALT, 0);
-
- /* plane tracks */
- WM_keymap_add_item(keymap, "CLIP_OT_slide_plane_marker", ACTIONMOUSE, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "CLIP_OT_keyframe_insert", IKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_keyframe_delete", IKEY, KM_PRESS, KM_ALT, 0);
-
- /* clean-up */
- WM_keymap_add_item(keymap, "CLIP_OT_join_tracks", JKEY, KM_PRESS, KM_CTRL, 0);
-
- /* menus */
- WM_keymap_add_menu(keymap, "CLIP_MT_tracking_specials", WKEY, KM_PRESS, 0, 0);
-
- /* display */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", LKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.lock_selection");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", DKEY, KM_PRESS, KM_ALT, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.show_disabled");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", SKEY, KM_PRESS, KM_ALT, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.show_marker_search");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.use_mute_footage");
-
- transform_keymap_for_space(keyconf, keymap, SPACE_CLIP);
-
- /* clean-up */
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_clear_track_path", TKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", TRACK_CLEAR_REMAINED);
- RNA_boolean_set(kmi->ptr, "clear_active", false);
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_clear_track_path", TKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "action", TRACK_CLEAR_UPTO);
- RNA_boolean_set(kmi->ptr, "clear_active", false);
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_clear_track_path", TKEY, KM_PRESS, KM_ALT | KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "action", TRACK_CLEAR_ALL);
- RNA_boolean_set(kmi->ptr, "clear_active", false);
-
- /* Cursor */
- WM_keymap_add_item(keymap, "CLIP_OT_cursor_set", ACTIONMOUSE, KM_PRESS, 0, 0);
-
- /* pivot point */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", COMMAKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point");
- RNA_string_set(kmi->ptr, "value", "BOUNDING_BOX_CENTER");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", COMMAKEY, KM_PRESS, KM_CTRL, 0); /* 2.4x allowed Comma+Shift too, rather not use both */
- RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point");
- RNA_string_set(kmi->ptr, "value", "MEDIAN_POINT");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", PERIODKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point");
- RNA_string_set(kmi->ptr, "value", "CURSOR");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", PERIODKEY, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point");
- RNA_string_set(kmi->ptr, "value", "INDIVIDUAL_ORIGINS");
-
- /* Copy-paste */
- WM_keymap_add_item(keymap, "CLIP_OT_copy_tracks", CKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_paste_tracks", VKEY, KM_PRESS, KM_CTRL, 0);
/* ******** Hotkeys avalaible for preview region only ******** */
-
- keymap = WM_keymap_ensure(keyconf, "Clip Graph Editor", SPACE_CLIP, 0);
-
- /* "timeline" */
- WM_keymap_add_item(keymap, "CLIP_OT_change_frame", ACTIONMOUSE, KM_PRESS, 0, 0);
-
- /* selection */
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_graph_select", SELECTMOUSE, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_graph_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
-
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_graph_select_all_markers", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_graph_select_all_markers", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_graph_select_all_markers", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- WM_keymap_add_item(keymap, "CLIP_OT_graph_select_border", BKEY, KM_PRESS, 0, 0);
-
- /* delete */
- WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_curve", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_curve", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_knot", XKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_knot", DELKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* view */
- WM_keymap_add_item(keymap, "CLIP_OT_graph_view_all", HOMEKEY, KM_PRESS, 0, 0);
-#ifdef WITH_INPUT_NDOF
- WM_keymap_add_item(keymap, "CLIP_OT_graph_view_all", NDOF_BUTTON_FIT, KM_PRESS, 0, 0);
-#endif
- WM_keymap_add_item(keymap, "CLIP_OT_graph_center_current_frame", PAD0, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", LKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.lock_time_cursor");
-
- /* clean-up */
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_clear_track_path", TKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", TRACK_CLEAR_REMAINED);
- RNA_boolean_set(kmi->ptr, "clear_active", true);
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_clear_track_path", TKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "action", TRACK_CLEAR_UPTO);
- RNA_boolean_set(kmi->ptr, "clear_active", true);
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_clear_track_path", TKEY, KM_PRESS, KM_ALT | KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "action", TRACK_CLEAR_ALL);
- RNA_boolean_set(kmi->ptr, "clear_active", true);
-
- /* tracks */
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_graph_disable_markers", DKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "action", 2); /* toggle */
-
- transform_keymap_for_space(keyconf, keymap, SPACE_CLIP);
+ WM_keymap_ensure(keyconf, "Clip Graph Editor", SPACE_CLIP, 0);
/* ******** Hotkeys avalaible for channels region only ******** */
-
- keymap = WM_keymap_ensure(keyconf, "Clip Dopesheet Editor", SPACE_CLIP, 0);
-
- kmi = WM_keymap_add_item(keymap, "CLIP_OT_dopesheet_select_channel", LEFTMOUSE, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", true); /* toggle */
-
- WM_keymap_add_item(keymap, "CLIP_OT_dopesheet_view_all", HOMEKEY, KM_PRESS, 0, 0);
-#ifdef WITH_INPUT_NDOF
- WM_keymap_add_item(keymap, "CLIP_OT_dopesheet_view_all", NDOF_BUTTON_FIT, KM_PRESS, 0, 0);
-#endif
+ WM_keymap_ensure(keyconf, "Clip Dopesheet Editor", SPACE_CLIP, 0);
}
/* DO NOT make this static, this hides the symbol and breaks API generation script. */
@@ -1276,11 +1007,11 @@ static void graph_region_draw(const bContext *C, ARegion *ar)
/* scrollers */
unitx = (sc->flag & SC_SHOW_SECONDS) ? V2D_UNIT_SECONDS : V2D_UNIT_FRAMES;
unity = V2D_UNIT_VALUES;
- scrollers = UI_view2d_scrollers_calc(C, v2d, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP);
+ scrollers = UI_view2d_scrollers_calc(C, v2d, NULL, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP);
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);
- /* currnt frame indicator */
+ /* current frame indicator */
if (sc->flag & SC_SHOW_SECONDS) cfra_flag |= DRAWCFRA_UNIT_SECONDS;
UI_view2d_view_orthoSpecial(ar, v2d, 1);
ANIM_draw_cfra_number(C, v2d, cfra_flag);
@@ -1323,11 +1054,11 @@ static void dopesheet_region_draw(const bContext *C, ARegion *ar)
UI_view2d_view_restore(C);
/* scrollers */
- scrollers = UI_view2d_scrollers_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
+ scrollers = UI_view2d_scrollers_calc(C, v2d, NULL, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);
- /* currnt frame number indicator */
+ /* current frame number indicator */
UI_view2d_view_orthoSpecial(ar, v2d, 1);
ANIM_draw_cfra_number(C, v2d, cfra_flag);
}
diff --git a/source/blender/editors/space_clip/tracking_ops_detect.c b/source/blender/editors/space_clip/tracking_ops_detect.c
index 0ee06b305da..77f7e8d112c 100644
--- a/source/blender/editors/space_clip/tracking_ops_detect.c
+++ b/source/blender/editors/space_clip/tracking_ops_detect.c
@@ -131,10 +131,10 @@ void CLIP_OT_detect_features(wmOperatorType *ot)
static const EnumPropertyItem placement_items[] = {
{0, "FRAME", 0, "Whole Frame",
"Place markers across the whole frame"},
- {1, "INSIDE_GPENCIL", 0, "Inside grease pencil",
- "Place markers only inside areas outlined with grease pencil"},
- {2, "OUTSIDE_GPENCIL", 0, "Outside grease pencil",
- "Place markers only outside areas outlined with grease pencil"},
+ {1, "INSIDE_GPENCIL", 0, "Inside Grease Pencil",
+ "Place markers only inside areas outlined with Grease Pencil"},
+ {2, "OUTSIDE_GPENCIL", 0, "Outside Grease Pencil",
+ "Place markers only outside areas outlined with Grease Pencil"},
{0, NULL, 0, NULL, NULL}
};
diff --git a/source/blender/editors/space_clip/tracking_ops_solve.c b/source/blender/editors/space_clip/tracking_ops_solve.c
index 89dfadc8974..4148b3a0070 100644
--- a/source/blender/editors/space_clip/tracking_ops_solve.c
+++ b/source/blender/editors/space_clip/tracking_ops_solve.c
@@ -40,11 +40,11 @@
#include "BLI_string.h"
#include "BKE_context.h"
-#include "BKE_movieclip.h"
-#include "BKE_tracking.h"
#include "BKE_global.h"
-#include "BKE_report.h"
#include "BKE_library.h"
+#include "BKE_movieclip.h"
+#include "BKE_report.h"
+#include "BKE_tracking.h"
#include "DEG_depsgraph.h"
diff --git a/source/blender/editors/space_clip/tracking_select.c b/source/blender/editors/space_clip/tracking_select.c
index 7fb2e32770d..162948c8e64 100644
--- a/source/blender/editors/space_clip/tracking_select.c
+++ b/source/blender/editors/space_clip/tracking_select.c
@@ -427,9 +427,9 @@ void CLIP_OT_select(wmOperatorType *ot)
"Location", "Mouse location in normalized coordinates, 0.0 to 1.0 is within the image bounds", -100.0f, 100.0f);
}
-/********************** border select operator *********************/
+/********************** box select operator *********************/
-static int border_select_exec(bContext *C, wmOperator *op)
+static int box_select_exec(bContext *C, wmOperator *op)
{
SpaceClip *sc = CTX_wm_space_clip(C);
ARegion *ar = CTX_wm_region(C);
@@ -519,24 +519,24 @@ static int border_select_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-void CLIP_OT_select_border(wmOperatorType *ot)
+void CLIP_OT_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
- ot->description = "Select markers using border selection";
- ot->idname = "CLIP_OT_select_border";
+ ot->name = "Box Select";
+ ot->description = "Select markers using box selection";
+ ot->idname = "CLIP_OT_select_box";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
- ot->exec = border_select_exec;
- ot->modal = WM_gesture_border_modal;
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = box_select_exec;
+ ot->modal = WM_gesture_box_modal;
ot->poll = ED_space_clip_tracking_poll;
/* flags */
ot->flag = OPTYPE_UNDO;
/* properties */
- WM_operator_properties_gesture_border_select(ot);
+ WM_operator_properties_gesture_box_select(ot);
}
/********************** lasso select operator *********************/
diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c
index a5e9f6cf641..596d66da9a6 100644
--- a/source/blender/editors/space_console/space_console.c
+++ b/source/blender/editors/space_console/space_console.c
@@ -235,7 +235,7 @@ static void console_main_region_draw(const bContext *C, ARegion *ar)
UI_view2d_view_restore(C);
/* scrollers */
- scrollers = UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_GRID_CLAMP);
+ scrollers = UI_view2d_scrollers_calc(C, v2d, NULL, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_GRID_CLAMP);
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);
}
@@ -265,87 +265,7 @@ static void console_operatortypes(void)
static void console_keymap(struct wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Console", SPACE_CONSOLE, 0);
- wmKeyMapItem *kmi;
-
-#ifdef __APPLE__
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", LEFTARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", LINE_BEGIN);
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", RIGHTARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", LINE_END);
-#endif
-
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", LEFTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", PREV_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", RIGHTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", NEXT_WORD);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", HOMEKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_BEGIN);
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", ENDKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_END);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", WHEELUPMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.font_size");
- RNA_boolean_set(kmi->ptr, "reverse", false);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", WHEELDOWNMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.font_size");
- RNA_boolean_set(kmi->ptr, "reverse", true);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.font_size");
- RNA_boolean_set(kmi->ptr, "reverse", false);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", PADMINUS, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.font_size");
- RNA_boolean_set(kmi->ptr, "reverse", true);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", LEFTARROWKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_CHAR);
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", RIGHTARROWKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_CHAR);
-
- RNA_boolean_set(WM_keymap_add_item(keymap, "CONSOLE_OT_history_cycle", UPARROWKEY, KM_PRESS, 0, 0)->ptr, "reverse", true);
- RNA_boolean_set(WM_keymap_add_item(keymap, "CONSOLE_OT_history_cycle", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "reverse", false);
-
-#if 0
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", LEFTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", PREV_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", RIGHTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", NEXT_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", UPARROWKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_LINE);
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_LINE);
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_PAGE);
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", PAGEDOWNKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_PAGE);
-#endif
-
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", DELKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_NEXT_CHAR);
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_PREV_CHAR);
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", BACKSPACEKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", DEL_PREV_CHAR); /* same as above [#26623] */
-
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", DELKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_NEXT_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", BACKSPACEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_PREV_WORD);
-
- WM_keymap_add_item(keymap, "CONSOLE_OT_clear_line", RETKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_clear_line", PADENTER, KM_PRESS, KM_SHIFT, 0);
-
-#ifdef WITH_PYTHON
- kmi = WM_keymap_add_item(keymap, "CONSOLE_OT_execute", RETKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "interactive", true);
- kmi = WM_keymap_add_item(keymap, "CONSOLE_OT_execute", PADENTER, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "interactive", true);
-
- WM_keymap_add_item(keymap, "CONSOLE_OT_autocomplete", SPACEKEY, KM_PRESS, KM_CTRL, 0); /* python operator - space_text.py */
-#endif
-
- WM_keymap_add_item(keymap, "CONSOLE_OT_copy_as_script", CKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0);
-#ifdef __APPLE__
- WM_keymap_add_item(keymap, "CONSOLE_OT_copy", CKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_paste", VKEY, KM_PRESS, KM_OSKEY, 0);
-#endif
-
- WM_keymap_add_item(keymap, "CONSOLE_OT_select_set", LEFTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_select_word", LEFTMOUSE, KM_DBL_CLICK, 0, 0);
-
- RNA_string_set(WM_keymap_add_item(keymap, "CONSOLE_OT_insert", TABKEY, KM_PRESS, KM_CTRL, 0)->ptr, "text", "\t"); /* fake tabs */
-
- WM_keymap_add_item(keymap, "CONSOLE_OT_indent", TABKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_unindent", TABKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "CONSOLE_OT_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last!
+ WM_keymap_ensure(keyconf, "Console", SPACE_CONSOLE, 0);
}
/****************** header region ******************/
diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c
index 4a71afbcf4a..2ae432fbc4e 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -221,13 +221,13 @@ void file_draw_buttons(const bContext *C, ARegion *ar)
/* Filename number increment / decrement buttons. */
if (fnumbuttons && (params->flag & FILE_DIRSEL_ONLY) == 0) {
UI_block_align_begin(block);
- but = uiDefIconButO(block, UI_BTYPE_BUT, "FILE_OT_filenum", 0, ICON_ZOOMOUT,
+ but = uiDefIconButO(block, UI_BTYPE_BUT, "FILE_OT_filenum", 0, ICON_REMOVE,
min_x + line2_w + separator - chan_offs, line2_y,
btn_fn_w, btn_h,
TIP_("Decrement the filename number"));
RNA_int_set(UI_but_operator_ptr_get(but), "increment", -1);
- but = uiDefIconButO(block, UI_BTYPE_BUT, "FILE_OT_filenum", 0, ICON_ZOOMIN,
+ but = uiDefIconButO(block, UI_BTYPE_BUT, "FILE_OT_filenum", 0, ICON_ADD,
min_x + line2_w + separator + btn_fn_w - chan_offs, line2_y,
btn_fn_w, btn_h,
TIP_("Increment the filename number"));
@@ -397,7 +397,7 @@ static void file_draw_preview(
scale, scale, 1.0f, 1.0f, col);
if (icon) {
- UI_icon_draw_aspect((float)xco, (float)yco, icon, icon_aspect, 1.0f);
+ UI_icon_draw_aspect((float)xco, (float)yco, icon, icon_aspect, 1.0f, NULL);
}
/* border */
@@ -515,15 +515,15 @@ static void draw_dividers(FileLayout *layout, View2D *v2d)
sx += step;
v1[0] = v2[0] = sx;
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2iv(pos, v1);
- immAttrib3ubv(color, col_lo);
+ immAttr3ubv(color, col_lo);
immVertex2iv(pos, v2);
v1[0] = v2[0] = sx + 1;
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2iv(pos, v1);
- immAttrib3ubv(color, col_hi);
+ immAttr3ubv(color, col_hi);
immVertex2iv(pos, v2);
}
@@ -595,7 +595,7 @@ void file_draw_list(const bContext *C, ARegion *ar)
filelist_cache_previews_update(files);
/* Handle preview timer here, since it's filelist_file_cache_block() and filelist_cache_previews_update()
- * which controlls previews task. */
+ * which controls previews task. */
{
const bool previews_running = filelist_cache_previews_running(files);
// printf("%s: preview task: %d\n", __func__, previews_running);
diff --git a/source/blender/editors/space_file/file_intern.h b/source/blender/editors/space_file/file_intern.h
index 48acbdb137d..710aa472a8b 100644
--- a/source/blender/editors/space_file/file_intern.h
+++ b/source/blender/editors/space_file/file_intern.h
@@ -73,7 +73,7 @@ void FILE_OT_highlight(struct wmOperatorType *ot);
void FILE_OT_select(struct wmOperatorType *ot);
void FILE_OT_select_walk(struct wmOperatorType *ot);
void FILE_OT_select_all(struct wmOperatorType *ot);
-void FILE_OT_select_border(struct wmOperatorType *ot);
+void FILE_OT_select_box(struct wmOperatorType *ot);
void FILE_OT_select_bookmark(struct wmOperatorType *ot);
void FILE_OT_bookmark_add(struct wmOperatorType *ot);
void FILE_OT_bookmark_delete(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c
index b19b2ff6cd5..92f0ceddc3c 100644
--- a/source/blender/editors/space_file/file_ops.c
+++ b/source/blender/editors/space_file/file_ops.c
@@ -37,10 +37,10 @@
#include "BKE_appdir.h"
#include "BKE_context.h"
-#include "BKE_screen.h"
#include "BKE_global.h"
-#include "BKE_report.h"
#include "BKE_main.h"
+#include "BKE_report.h"
+#include "BKE_screen.h"
#ifdef WIN32
# include "BLI_winstuff.h"
@@ -113,7 +113,7 @@ typedef enum FileSelect {
static void clamp_to_filelist(int numfiles, FileSelection *sel)
{
- /* border select before the first file */
+ /* box select before the first file */
if ( (sel->first < 0) && (sel->last >= 0) ) {
sel->first = 0;
}
@@ -338,7 +338,7 @@ static FileSelect file_select(bContext *C, const rcti *rect, FileSelType select,
return retval;
}
-static int file_border_select_find_last_selected(
+static int file_box_select_find_last_selected(
SpaceFile *sfile, ARegion *ar, const FileSelection *sel,
const int mouse_xy[2])
{
@@ -371,7 +371,7 @@ static int file_border_select_find_last_selected(
return (dist_first < dist_last) ? sel->first : sel->last;
}
-static int file_border_select_modal(bContext *C, wmOperator *op, const wmEvent *event)
+static int file_box_select_modal(bContext *C, wmOperator *op, const wmEvent *event)
{
ARegion *ar = CTX_wm_region(C);
SpaceFile *sfile = CTX_wm_space_file(C);
@@ -381,7 +381,7 @@ static int file_border_select_modal(bContext *C, wmOperator *op, const wmEvent *
int result;
- result = WM_gesture_border_modal(C, op, event);
+ result = WM_gesture_box_modal(C, op, event);
if (result == OPERATOR_RUNNING_MODAL) {
WM_operator_properties_border_to_rcti(op, &rect);
@@ -399,7 +399,7 @@ static int file_border_select_modal(bContext *C, wmOperator *op, const wmEvent *
for (idx = sel.last; idx >= 0; idx--) {
const FileDirEntry *file = filelist_file(sfile->files, idx);
- /* dont highlight readonly file (".." or ".") on border select */
+ /* dont highlight readonly file (".." or ".") on box select */
if (FILENAME_IS_CURRPAR(file->relpath)) {
filelist_entry_select_set(sfile->files, file, FILE_SEL_REMOVE, FILE_SEL_HIGHLIGHTED, CHECK_ALL);
}
@@ -411,7 +411,7 @@ static int file_border_select_modal(bContext *C, wmOperator *op, const wmEvent *
}
}
params->sel_first = sel.first; params->sel_last = sel.last;
- params->active_file = file_border_select_find_last_selected(sfile, ar, &sel, event->mval);
+ params->active_file = file_box_select_find_last_selected(sfile, ar, &sel, event->mval);
}
else {
params->highlight_file = -1;
@@ -424,7 +424,7 @@ static int file_border_select_modal(bContext *C, wmOperator *op, const wmEvent *
return result;
}
-static int file_border_select_exec(bContext *C, wmOperator *op)
+static int file_box_select_exec(bContext *C, wmOperator *op)
{
ARegion *ar = CTX_wm_region(C);
SpaceFile *sfile = CTX_wm_space_file(C);
@@ -455,22 +455,22 @@ static int file_border_select_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void FILE_OT_select_border(wmOperatorType *ot)
+void FILE_OT_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
+ ot->name = "Box Select";
ot->description = "Activate/select the file(s) contained in the border";
- ot->idname = "FILE_OT_select_border";
+ ot->idname = "FILE_OT_select_box";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
- ot->exec = file_border_select_exec;
- ot->modal = file_border_select_modal;
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = file_box_select_exec;
+ ot->modal = file_box_select_modal;
ot->poll = ED_operator_file_active;
- ot->cancel = WM_gesture_border_cancel;
+ ot->cancel = WM_gesture_box_cancel;
/* properties */
- WM_operator_properties_gesture_border_select(ot);
+ WM_operator_properties_gesture_box_select(ot);
}
static int file_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
@@ -1301,7 +1301,7 @@ void file_operator_to_sfile(bContext *C, SpaceFile *sfile, wmOperator *op)
}
/* we could check for relative_path property which is used when converting
- * in the other direction but doesnt hurt to do this every time */
+ * in the other direction but doesn't hurt to do this every time */
BLI_path_abs(sfile->params->dir, BKE_main_blendfile_path(bmain));
/* XXX, files and dirs updates missing, not really so important though */
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 968757bc637..218c7dcdb42 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -65,7 +65,6 @@
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_library.h"
#include "BKE_icons.h"
#include "BKE_idcode.h"
#include "BKE_main.h"
@@ -215,7 +214,7 @@ typedef struct FileListInternEntry {
int blentype; /* ID type, in case typeflag has FILE_TYPE_BLENDERLIB set. */
char *relpath;
- char *name; /* not striclty needed, but used during sorting, avoids to have to recompute it there... */
+ char *name; /* not strictly needed, but used during sorting, avoids to have to recompute it there... */
BLI_stat_t st;
} FileListInternEntry;
@@ -236,7 +235,7 @@ typedef struct FileListEntryCache {
/* This one gathers all entries from both block and misc caches. Used for easy bulk-freing. */
ListBase cached_entries;
- /* Block cache: all entries between start and end index. used for part of the list on diplay. */
+ /* Block cache: all entries between start and end index. used for part of the list on display. */
FileDirEntry **block_entries;
int block_start_index, block_end_index, block_center_index, block_cursor;
@@ -1516,7 +1515,7 @@ static FileDirEntry *filelist_file_ex(struct FileList *filelist, const int index
return cache->block_entries[idx];
}
- if ((ret = BLI_ghash_lookup(cache->misc_entries, SET_INT_IN_POINTER(index)))) {
+ if ((ret = BLI_ghash_lookup(cache->misc_entries, POINTER_FROM_INT(index)))) {
return ret;
}
@@ -1529,11 +1528,11 @@ static FileDirEntry *filelist_file_ex(struct FileList *filelist, const int index
/* Else, we have to add new entry to 'misc' cache - and possibly make room for it first! */
ret = filelist_file_create_entry(filelist, index);
old_index = cache->misc_entries_indices[cache->misc_cursor];
- if ((old = BLI_ghash_popkey(cache->misc_entries, SET_INT_IN_POINTER(old_index), NULL))) {
+ if ((old = BLI_ghash_popkey(cache->misc_entries, POINTER_FROM_INT(old_index), NULL))) {
BLI_ghash_remove(cache->uuids, old->uuid, NULL, NULL);
filelist_file_release_entry(filelist, old);
}
- BLI_ghash_insert(cache->misc_entries, SET_INT_IN_POINTER(index), ret);
+ BLI_ghash_insert(cache->misc_entries, POINTER_FROM_INT(index), ret);
BLI_ghash_insert(cache->uuids, ret->uuid, ret);
cache->misc_entries_indices[cache->misc_cursor] = index;
@@ -1628,7 +1627,7 @@ static bool filelist_file_cache_block_create(FileList *filelist, const int start
FileDirEntry *entry;
/* That entry might have already been requested and stored in misc cache... */
- if ((entry = BLI_ghash_popkey(cache->misc_entries, SET_INT_IN_POINTER(idx), NULL)) == NULL) {
+ if ((entry = BLI_ghash_popkey(cache->misc_entries, POINTER_FROM_INT(idx), NULL)) == NULL) {
entry = filelist_file_create_entry(filelist, idx);
BLI_ghash_insert(cache->uuids, entry->uuid, entry);
}
@@ -2064,7 +2063,7 @@ unsigned int filelist_entry_select_set(
{
/* Default NULL pointer if not found is fine here! */
void **es_p = BLI_ghash_lookup_p(filelist->selection_state, entry->uuid);
- unsigned int entry_flag = es_p ? GET_UINT_FROM_POINTER(*es_p) : 0;
+ unsigned int entry_flag = es_p ? POINTER_AS_UINT(*es_p) : 0;
const unsigned int org_entry_flag = entry_flag;
BLI_assert(entry);
@@ -2090,7 +2089,7 @@ unsigned int filelist_entry_select_set(
if (entry_flag != org_entry_flag) {
if (es_p) {
if (entry_flag) {
- *es_p = SET_UINT_IN_POINTER(entry_flag);
+ *es_p = POINTER_FROM_UINT(entry_flag);
}
else {
BLI_ghash_remove(filelist->selection_state, entry->uuid, MEM_freeN, NULL);
@@ -2099,7 +2098,7 @@ unsigned int filelist_entry_select_set(
else if (entry_flag) {
void *key = MEM_mallocN(sizeof(entry->uuid), __func__);
memcpy(key, entry->uuid, sizeof(entry->uuid));
- BLI_ghash_insert(filelist->selection_state, key, SET_UINT_IN_POINTER(entry_flag));
+ BLI_ghash_insert(filelist->selection_state, key, POINTER_FROM_UINT(entry_flag));
}
}
@@ -2139,7 +2138,7 @@ unsigned int filelist_entry_select_get(FileList *filelist, FileDirEntry *entry,
((check == CHECK_FILES) && !(entry->typeflag & FILE_TYPE_DIR)))
{
/* Default NULL pointer if not found is fine here! */
- return GET_UINT_FROM_POINTER(BLI_ghash_lookup(filelist->selection_state, entry->uuid));
+ return POINTER_AS_UINT(BLI_ghash_lookup(filelist->selection_state, entry->uuid));
}
return 0;
diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h
index 76845c44226..6d898ee2fe9 100644
--- a/source/blender/editors/space_file/filelist.h
+++ b/source/blender/editors/space_file/filelist.h
@@ -56,12 +56,12 @@ typedef enum FileCheckType {
CHECK_ALL = 3
} FileCheckType;
-struct ListBase * folderlist_new(void);
+struct ListBase *folderlist_new(void);
void folderlist_free(struct ListBase *folderlist);
-struct ListBase * folderlist_duplicate(ListBase *folderlist);
+struct ListBase *folderlist_duplicate(ListBase *folderlist);
void folderlist_popdir(struct ListBase *folderlist, char *dir);
void folderlist_pushdir(struct ListBase *folderlist, const char *dir);
-const char * folderlist_peeklastdir(struct ListBase *folderdist);
+const char *folderlist_peeklastdir(struct ListBase *folderdist);
int folderlist_clear_next(struct SpaceFile *sfile);
@@ -77,24 +77,24 @@ void filelist_filter(struct FileList *filelist);
void filelist_init_icons(void);
void filelist_free_icons(void);
void filelist_imgsize(struct FileList *filelist, short w, short h);
-struct ImBuf * filelist_getimage(struct FileList *filelist, const int index);
-struct ImBuf * filelist_geticon_image(struct FileList *filelist, const int index);
+struct ImBuf *filelist_getimage(struct FileList *filelist, const int index);
+struct ImBuf *filelist_geticon_image(struct FileList *filelist, const int index);
int filelist_geticon(struct FileList *filelist, const int index, const bool is_main);
-struct FileList * filelist_new(short type);
+struct FileList *filelist_new(short type);
void filelist_clear(struct FileList *filelist);
void filelist_clear_ex(struct FileList *filelist, const bool do_cache, const bool do_selection);
void filelist_free(struct FileList *filelist);
-const char * filelist_dir(struct FileList *filelist);
+const char *filelist_dir(struct FileList *filelist);
bool filelist_is_dir(struct FileList *filelist, const char *path);
void filelist_setdir(struct FileList *filelist, char *r_dir);
int filelist_files_ensure(struct FileList *filelist);
int filelist_empty(struct FileList *filelist);
-FileDirEntry * filelist_file(struct FileList *filelist, int index);
+FileDirEntry *filelist_file(struct FileList *filelist, int index);
int filelist_file_findpath(struct FileList *filelist, const char *file);
-FileDirEntry * filelist_entry_find_uuid(struct FileList *filelist, const int uuid[4]);
+FileDirEntry *filelist_entry_find_uuid(struct FileList *filelist, const int uuid[4]);
void filelist_file_cache_slidingwindow_set(struct FileList *filelist, size_t window_size);
bool filelist_file_cache_block(struct FileList *filelist, const int index);
diff --git a/source/blender/editors/space_file/fsmenu.c b/source/blender/editors/space_file/fsmenu.c
index 5ecb95bf61b..6fd2c3515fa 100644
--- a/source/blender/editors/space_file/fsmenu.c
+++ b/source/blender/editors/space_file/fsmenu.c
@@ -437,7 +437,7 @@ void fsmenu_read_bookmarks(struct FSMenu *fsmenu, const char *filename)
line[len - 1] = '\0';
}
/* don't do this because it can be slow on network drives,
- * having a bookmark from a drive thats ejected or so isn't
+ * having a bookmark from a drive that's ejected or so isn't
* all _that_ bad */
#if 0
if (BLI_exists(line))
@@ -575,7 +575,7 @@ void fsmenu_read_system(struct FSMenu *fsmenu, int read_bookmarks)
#else
/* unix */
{
- const char *home = getenv("HOME");
+ const char *home = BLI_getenv("HOME");
if (read_bookmarks && home) {
BLI_snprintf(line, sizeof(line), "%s/", home);
@@ -596,13 +596,22 @@ void fsmenu_read_system(struct FSMenu *fsmenu, int read_bookmarks)
fp = setmntent(MOUNTED, "r");
if (fp == NULL) {
- fprintf(stderr, "could not get a list of mounted filesystemts\n");
+ fprintf(stderr, "could not get a list of mounted filesystems\n");
}
else {
while ((mnt = getmntent(fp))) {
- /* not sure if this is right, but seems to give the relevant mnts */
- if (!STREQLEN(mnt->mnt_fsname, "/dev", 4))
+ if (STRPREFIX(mnt->mnt_dir, "/boot")) {
+ /* Hide share not usable to the user. */
continue;
+ }
+ else if (!STRPREFIX(mnt->mnt_fsname, "/dev")) {
+ continue;
+ }
+ else if (STRPREFIX(mnt->mnt_fsname, "/dev/loop")) {
+ /* The dev/loop* entries are SNAPS used by desktop environment
+ * (Gnome) no need for them to show up in the list. */
+ continue;
+ }
len = strlen(mnt->mnt_dir);
if (len && mnt->mnt_dir[len - 1] != '/') {
@@ -616,7 +625,7 @@ void fsmenu_read_system(struct FSMenu *fsmenu, int read_bookmarks)
found = 1;
}
if (endmntent(fp) == 0) {
- fprintf(stderr, "could not close the list of mounted filesystemts\n");
+ fprintf(stderr, "could not close the list of mounted filesystems\n");
}
}
#endif
diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c
index d1847956c13..e0413e48346 100644
--- a/source/blender/editors/space_file/space_file.c
+++ b/source/blender/editors/space_file/space_file.c
@@ -424,7 +424,7 @@ static void file_main_region_draw(const bContext *C, ARegion *ar)
v2d->keepofs |= V2D_LOCKOFS_Y;
/* XXX this happens on scaling down Screen (like from startup.blend) */
- /* view2d has no type specific for filewindow case, which doesnt scroll vertically */
+ /* view2d has no type specific for filewindow case, which doesn't scroll vertically */
if (v2d->cur.ymax < 0) {
v2d->cur.ymin -= v2d->cur.ymax;
v2d->cur.ymax = 0;
@@ -451,7 +451,7 @@ static void file_main_region_draw(const bContext *C, ARegion *ar)
UI_view2d_view_restore(C);
/* scrollers */
- scrollers = UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
+ scrollers = UI_view2d_scrollers_calc(C, v2d, NULL, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);
@@ -462,7 +462,7 @@ static void file_operatortypes(void)
WM_operatortype_append(FILE_OT_select);
WM_operatortype_append(FILE_OT_select_walk);
WM_operatortype_append(FILE_OT_select_all);
- WM_operatortype_append(FILE_OT_select_border);
+ WM_operatortype_append(FILE_OT_select_box);
WM_operatortype_append(FILE_OT_select_bookmark);
WM_operatortype_append(FILE_OT_highlight);
WM_operatortype_append(FILE_OT_execute);
@@ -489,137 +489,14 @@ static void file_operatortypes(void)
/* NOTE: do not add .blend file reading on this level */
static void file_keymap(struct wmKeyConfig *keyconf)
{
- wmKeyMapItem *kmi;
/* keys for all regions */
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "File Browser", SPACE_FILE, 0);
-
- /* More common 'fliebrowser-like navigation' shortcuts. */
- WM_keymap_add_item(keymap, "FILE_OT_parent", UPARROWKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "FILE_OT_previous", LEFTARROWKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "FILE_OT_next", RIGHTARROWKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "FILE_OT_refresh", RKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "FILE_OT_parent", PKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "FILE_OT_previous", BACKSPACEKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "FILE_OT_next", BACKSPACEKEY, KM_PRESS, KM_SHIFT, 0);
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", HKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.params.show_hidden");
- WM_keymap_add_item(keymap, "FILE_OT_directory_new", IKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "FILE_OT_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "FILE_OT_delete", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_verify_item(keymap, "FILE_OT_smoothscroll", TIMER1, KM_ANY, KM_ANY, 0);
-
- WM_keymap_add_item(keymap, "FILE_OT_bookmark_toggle", TKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "FILE_OT_bookmark_add", BKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_ensure(keyconf, "File Browser", SPACE_FILE, 0);
/* keys for main region */
- keymap = WM_keymap_ensure(keyconf, "File Browser Main", SPACE_FILE, 0);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_execute", LEFTMOUSE, KM_DBL_CLICK, 0, 0);
- RNA_boolean_set(kmi->ptr, "need_active", true);
-
- WM_keymap_add_item(keymap, "FILE_OT_refresh", PADPERIOD, KM_PRESS, 0, 0);
-
- /* left mouse selects and opens */
- WM_keymap_add_item(keymap, "FILE_OT_select", LEFTMOUSE, KM_CLICK, 0, 0);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select", LEFTMOUSE, KM_CLICK, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select", LEFTMOUSE, KM_CLICK, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "fill", true);
-
- /* right mouse selects without opening */
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select", RIGHTMOUSE, KM_CLICK, 0, 0);
- RNA_boolean_set(kmi->ptr, "open", false);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select", RIGHTMOUSE, KM_CLICK, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "open", false);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select", RIGHTMOUSE, KM_CLICK, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "fill", true);
- RNA_boolean_set(kmi->ptr, "open", false);
-
-
- /* arrow keys navigation (walk selecting) */
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", UPARROWKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_UP);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", UPARROWKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_UP);
- RNA_boolean_set(kmi->ptr, "extend", true);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", UPARROWKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_UP);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "fill", true);
-
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", DOWNARROWKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_DOWN);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", DOWNARROWKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_DOWN);
- RNA_boolean_set(kmi->ptr, "extend", true);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", DOWNARROWKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_DOWN);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "fill", true);
-
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", LEFTARROWKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_LEFT);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", LEFTARROWKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_LEFT);
- RNA_boolean_set(kmi->ptr, "extend", true);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", LEFTARROWKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_LEFT);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "fill", true);
-
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", RIGHTARROWKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_RIGHT);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", RIGHTARROWKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_RIGHT);
- RNA_boolean_set(kmi->ptr, "extend", true);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", RIGHTARROWKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_RIGHT);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "fill", true);
-
-
- /* front and back mouse folder navigation */
- WM_keymap_add_item(keymap, "FILE_OT_previous", BUTTON4MOUSE, KM_CLICK, 0, 0);
- WM_keymap_add_item(keymap, "FILE_OT_next", BUTTON5MOUSE, KM_CLICK, 0, 0);
-
- WM_keymap_add_item(keymap, "FILE_OT_select_all", AKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "FILE_OT_select_border", BKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "FILE_OT_select_border", EVT_TWEAK_L, KM_ANY, 0, 0);
- WM_keymap_add_item(keymap, "FILE_OT_rename", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "FILE_OT_highlight", MOUSEMOVE, KM_ANY, KM_ANY, 0);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, 0, 0);
- RNA_int_set(kmi->ptr, "increment", 1);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_int_set(kmi->ptr, "increment", 10);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- RNA_int_set(kmi->ptr, "increment", 100);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, 0, 0);
- RNA_int_set(kmi->ptr, "increment", -1);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, KM_SHIFT, 0);
- RNA_int_set(kmi->ptr, "increment", -10);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, KM_CTRL, 0);
- RNA_int_set(kmi->ptr, "increment", -100);
-
+ WM_keymap_ensure(keyconf, "File Browser Main", SPACE_FILE, 0);
/* keys for button region (top) */
- keymap = WM_keymap_ensure(keyconf, "File Browser Buttons", SPACE_FILE, 0);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, 0, 0);
- RNA_int_set(kmi->ptr, "increment", 1);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_int_set(kmi->ptr, "increment", 10);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- RNA_int_set(kmi->ptr, "increment", 100);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, 0, 0);
- RNA_int_set(kmi->ptr, "increment", -1);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, KM_SHIFT, 0);
- RNA_int_set(kmi->ptr, "increment", -10);
- kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, KM_CTRL, 0);
- RNA_int_set(kmi->ptr, "increment", -100);
+ WM_keymap_ensure(keyconf, "File Browser Buttons", SPACE_FILE, 0);
}
diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c
index 4162e6dec92..2f0b6faabe4 100644
--- a/source/blender/editors/space_graph/graph_buttons.c
+++ b/source/blender/editors/space_graph/graph_buttons.c
@@ -46,6 +46,7 @@
#include "BLT_translation.h"
+#include "BKE_animsys.h"
#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_fcurve.h"
@@ -54,6 +55,7 @@
#include "BKE_screen.h"
#include "BKE_unit.h"
+#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
#include "WM_api.h"
@@ -467,7 +469,7 @@ static void graph_panel_key_properties(const bContext *C, Panel *pa)
#define B_IPO_DEPCHANGE 10
-static void do_graph_region_driver_buttons(bContext *C, void *fcu_v, int event)
+static void do_graph_region_driver_buttons(bContext *C, void *id_v, int event)
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
@@ -475,6 +477,9 @@ static void do_graph_region_driver_buttons(bContext *C, void *fcu_v, int event)
switch (event) {
case B_IPO_DEPCHANGE:
{
+ /* Was not actually run ever (NULL always passed as arg to this callback).
+ * If needed again, will need to check how to pass both fcurve and ID... :/ */
+#if 0
/* force F-Curve & Driver to get re-evaluated (same as the old Update Dependencies) */
FCurve *fcu = (FCurve *)fcu_v;
ChannelDriver *driver = (fcu) ? fcu->driver : NULL;
@@ -484,9 +489,22 @@ static void do_graph_region_driver_buttons(bContext *C, void *fcu_v, int event)
fcu->flag &= ~FCURVE_DISABLED;
driver->flag &= ~DRIVER_FLAG_INVALID;
}
+#endif
+ ID *id = id_v;
+ AnimData *adt = BKE_animdata_from_id(id);
- /* rebuild depsgraph for the new deps */
+ /* rebuild depsgraph for the new deps, and ensure COW copies get flushed. */
DEG_relations_tag_update(bmain);
+ DEG_id_tag_update_ex(bmain, id, DEG_TAG_COPY_ON_WRITE);
+ if (adt != NULL) {
+ if (adt->action != NULL) {
+ DEG_id_tag_update_ex(bmain, &adt->action->id, DEG_TAG_COPY_ON_WRITE);
+ }
+ if (adt->tmpact != NULL) {
+ DEG_id_tag_update_ex(bmain, &adt->tmpact->id, DEG_TAG_COPY_ON_WRITE);
+ }
+ }
+
break;
}
}
@@ -742,7 +760,7 @@ static void graph_draw_driven_property_panel(uiLayout *layout, ID *id, FCurve *f
uiItemL(row, id->name + 2, icon);
/* -> user friendly 'name' for F-Curve/driver target */
- uiItemL(row, "", VICO_SMALL_TRI_RIGHT_VEC);
+ uiItemL(row, "", ICON_SMALL_TRI_RIGHT_VEC);
uiItemL(row, name, ICON_RNA);
}
@@ -759,7 +777,7 @@ static void graph_draw_driver_settings_panel(uiLayout *layout, ID *id, FCurve *f
/* set event handler for panel */
block = uiLayoutGetBlock(layout);
- UI_block_func_handle_set(block, do_graph_region_driver_buttons, NULL);
+ UI_block_func_handle_set(block, do_graph_region_driver_buttons, id);
/* driver-level settings - type, expressions, and errors */
RNA_pointer_create(id, &RNA_Driver, driver, &driver_ptr);
@@ -799,13 +817,18 @@ static void graph_draw_driver_settings_panel(uiLayout *layout, ID *id, FCurve *f
col = uiLayoutColumn(layout, true);
block = uiLayoutGetBlock(col);
- if ((G.f & G_SCRIPT_AUTOEXEC) == 0) {
- /* TODO: Add button to enable? */
- uiItemL(col, IFACE_("WARNING: Python expressions limited for security"), ICON_ERROR);
- }
- else if (driver->flag & DRIVER_FLAG_INVALID) {
+ if (driver->flag & DRIVER_FLAG_INVALID) {
uiItemL(col, IFACE_("ERROR: Invalid Python expression"), ICON_CANCEL);
}
+ else if (!BKE_driver_has_simple_expression(driver)) {
+ if ((G.f & G_SCRIPT_AUTOEXEC) == 0) {
+ /* TODO: Add button to enable? */
+ uiItemL(col, IFACE_("WARNING: Python expressions limited for security"), ICON_ERROR);
+ }
+ else {
+ uiItemL(col, IFACE_("Slow Python expression"), ICON_INFO);
+ }
+ }
/* Explicit bpy-references are evil. Warn about these to prevent errors */
/* TODO: put these in a box? */
@@ -851,7 +874,7 @@ static void graph_draw_driver_settings_panel(uiLayout *layout, ID *id, FCurve *f
/* add driver variable - add blank */
row = uiLayoutRow(layout, true);
block = uiLayoutGetBlock(row);
- but = uiDefIconTextBut(block, UI_BTYPE_BUT, B_IPO_DEPCHANGE, ICON_ZOOMIN, IFACE_("Add Input Variable"),
+ but = uiDefIconTextBut(block, UI_BTYPE_BUT, B_IPO_DEPCHANGE, ICON_ADD, IFACE_("Add Input Variable"),
0, 0, 10 * UI_UNIT_X, UI_UNIT_Y,
NULL, 0.0, 0.0, 0, 0,
TIP_("Add a Driver Variable to keep track an input used by the driver"));
@@ -865,10 +888,10 @@ static void graph_draw_driver_settings_panel(uiLayout *layout, ID *id, FCurve *f
/* add driver variable */
row = uiLayoutRow(layout, false);
block = uiLayoutGetBlock(row);
- but = uiDefIconTextBut(block, UI_BTYPE_BUT, B_IPO_DEPCHANGE, ICON_ZOOMIN, IFACE_("Add Input Variable"),
+ but = uiDefIconTextBut(block, UI_BTYPE_BUT, B_IPO_DEPCHANGE, ICON_ADD, IFACE_("Add Input Variable"),
0, 0, 10 * UI_UNIT_X, UI_UNIT_Y,
NULL, 0.0, 0.0, 0, 0,
- TIP_("Driver variables ensure that all dependencies will be accounted for, eusuring that drivers will update correctly"));
+ TIP_("Driver variables ensure that all dependencies will be accounted for, ensuring that drivers will update correctly"));
UI_but_func_set(but, driver_add_var_cb, driver, NULL);
/* copy/paste (as sub-row) */
@@ -1175,6 +1198,7 @@ void graph_buttons_register(ARegionType *art)
pt->draw = graph_panel_drivers_popover;
pt->poll = graph_panel_drivers_popover_poll;
BLI_addtail(&art->paneltypes, pt);
+ WM_paneltype_add(pt); /* This panel isn't used in this region. Add explicitly to global list (so popovers work). */
pt = MEM_callocN(sizeof(PanelType), "spacetype graph panel modifiers");
strcpy(pt->idname, "GRAPH_PT_modifiers");
diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c
index ad9af8cb948..927f64cb528 100644
--- a/source/blender/editors/space_graph/graph_draw.c
+++ b/source/blender/editors/space_graph/graph_draw.c
@@ -363,9 +363,9 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu)
if ((!prevbezt && (bezt->ipo == BEZT_IPO_BEZ)) || (prevbezt && (prevbezt->ipo == BEZT_IPO_BEZ))) {
UI_GetThemeColor3ubv(basecol + bezt->h1, col);
col[3] = fcurve_display_alpha(fcu) * 255;
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp);
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp + 3);
}
@@ -373,9 +373,9 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu)
if (bezt->ipo == BEZT_IPO_BEZ) {
UI_GetThemeColor3ubv(basecol + bezt->h2, col);
col[3] = fcurve_display_alpha(fcu) * 255;
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp + 3);
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp + 6);
}
}
@@ -387,9 +387,9 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu)
fp = bezt->vec[0];
UI_GetThemeColor3ubv(basecol + bezt->h1, col);
col[3] = fcurve_display_alpha(fcu) * 255;
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp);
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp + 3);
}
@@ -400,9 +400,9 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu)
fp = bezt->vec[1];
UI_GetThemeColor3ubv(basecol + bezt->h2, col);
col[3] = fcurve_display_alpha(fcu) * 255;
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp);
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp + 3);
}
}
diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c
index b10141929d5..4a5bd0c09b9 100644
--- a/source/blender/editors/space_graph/graph_edit.c
+++ b/source/blender/editors/space_graph/graph_edit.c
@@ -589,17 +589,8 @@ static void insert_graph_keys(bAnimContext *ac, eGraphKeys_InsertKey_Types mode)
}
else {
for (ale = anim_data.first; ale; ale = ale->next) {
- AnimData *adt = ANIM_nla_mapping_get(ac, ale);
FCurve *fcu = (FCurve *)ale->key_data;
- float cfra;
-
- /* adjust current frame for NLA-mapping */
- if ((sipo) && (sipo->mode == SIPO_MODE_DRIVERS))
- cfra = sipo->cursorTime;
- else if (adt)
- cfra = BKE_nla_tweakedit_remap(adt, (float)CFRA, NLATIME_CONVERT_UNMAP);
- else
- cfra = (float)CFRA;
+ float cfra = (float)CFRA;
/* read value from property the F-Curve represents, or from the curve only?
* - ale->id != NULL: Typically, this means that we have enough info to try resolving the path
@@ -614,6 +605,14 @@ static void insert_graph_keys(bAnimContext *ac, eGraphKeys_InsertKey_Types mode)
fcu->rna_path, fcu->array_index, cfra, ts->keyframe_type, flag);
}
else {
+ AnimData *adt = ANIM_nla_mapping_get(ac, ale);
+
+ /* adjust current frame for NLA-mapping */
+ if ((sipo) && (sipo->mode == SIPO_MODE_DRIVERS))
+ cfra = sipo->cursorTime;
+ else if (adt)
+ cfra = BKE_nla_tweakedit_remap(adt, (float)CFRA, NLATIME_CONVERT_UNMAP);
+
const float curval = evaluate_fcurve(fcu, cfra);
insert_vert_fcurve(fcu, cfra, curval, ts->keyframe_type, 0);
}
diff --git a/source/blender/editors/space_graph/graph_intern.h b/source/blender/editors/space_graph/graph_intern.h
index 398561927dd..286d3cea59c 100644
--- a/source/blender/editors/space_graph/graph_intern.h
+++ b/source/blender/editors/space_graph/graph_intern.h
@@ -59,7 +59,7 @@ void graph_draw_ghost_curves(struct bAnimContext *ac, struct SpaceIpo *sipo, str
void deselect_graph_keys(struct bAnimContext *ac, bool test, short sel, bool do_channels);
void GRAPH_OT_select_all(struct wmOperatorType *ot);
-void GRAPH_OT_select_border(struct wmOperatorType *ot);
+void GRAPH_OT_select_box(struct wmOperatorType *ot);
void GRAPH_OT_select_lasso(struct wmOperatorType *ot);
void GRAPH_OT_select_circle(struct wmOperatorType *ot);
void GRAPH_OT_select_column(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c
index 8699bb595fa..1b3d154f804 100644
--- a/source/blender/editors/space_graph/graph_ops.c
+++ b/source/blender/editors/space_graph/graph_ops.c
@@ -430,7 +430,7 @@ void graphedit_operatortypes(void)
/* selection */
WM_operatortype_append(GRAPH_OT_clickselect);
WM_operatortype_append(GRAPH_OT_select_all);
- WM_operatortype_append(GRAPH_OT_select_border);
+ WM_operatortype_append(GRAPH_OT_select_box);
WM_operatortype_append(GRAPH_OT_select_lasso);
WM_operatortype_append(GRAPH_OT_select_circle);
WM_operatortype_append(GRAPH_OT_select_column);
@@ -490,227 +490,10 @@ void ED_operatormacros_graph(void)
/* ************************** registration - keymaps **********************************/
-static void graphedit_keymap_keyframes(wmKeyConfig *keyconf, wmKeyMap *keymap)
-{
- wmKeyMapItem *kmi;
-
- /* view */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", HKEY, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.show_handles");
-
- /* NOTE: 'ACTIONMOUSE' not 'LEFTMOUSE', as user may have swapped mouse-buttons
- * This keymap is supposed to override ANIM_OT_change_frame, which does the same except it doesn't do y-values
- */
- WM_keymap_add_item(keymap, "GRAPH_OT_cursor_set", ACTIONMOUSE, KM_PRESS, 0, 0);
-
-
- /* graph_select.c - selection tools */
- /* click-select: keyframe (replace) */
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "curves", false);
- RNA_boolean_set(kmi->ptr, "column", false);
- /* click-select: all keyframes on same frame (replace) */
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "curves", false);
- RNA_boolean_set(kmi->ptr, "column", true);
- /* click-select: keyframe (add) */
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "curves", false);
- RNA_boolean_set(kmi->ptr, "column", false);
- /* click-select: all keyframes on same frame (add) */
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "curves", false);
- RNA_boolean_set(kmi->ptr, "column", true);
- /* click-select: all keyframes in same curve (replace) */
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "curves", true);
- RNA_boolean_set(kmi->ptr, "column", false);
- /* click-select: all keyframes in same curve (add) */
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL | KM_ALT | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "curves", true);
- RNA_boolean_set(kmi->ptr, "column", false);
-
- /* click-select left/right */
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_enum_set(kmi->ptr, "mode", GRAPHKEYS_LRSEL_TEST);
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_enum_set(kmi->ptr, "mode", GRAPHKEYS_LRSEL_TEST);
-
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_leftright", LEFTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_enum_set(kmi->ptr, "mode", GRAPHKEYS_LRSEL_LEFT);
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_leftright", RIGHTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_enum_set(kmi->ptr, "mode", GRAPHKEYS_LRSEL_RIGHT);
-
- /* deselect all */
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- /* borderselect */
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "axis_range", false);
- RNA_boolean_set(kmi->ptr, "include_handles", false);
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "axis_range", true);
- RNA_boolean_set(kmi->ptr, "include_handles", false);
-
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "axis_range", false);
- RNA_boolean_set(kmi->ptr, "include_handles", true);
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "axis_range", true);
- RNA_boolean_set(kmi->ptr, "include_handles", true);
-
- /* region select */
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", true);
-
- WM_keymap_add_item(keymap, "GRAPH_OT_select_circle", CKEY, KM_PRESS, 0, 0);
-
- /* column select */
- RNA_enum_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_column", KKEY, KM_PRESS, 0, 0)->ptr, "mode", GRAPHKEYS_COLUMNSEL_KEYS);
- RNA_enum_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_column", KKEY, KM_PRESS, KM_CTRL, 0)->ptr, "mode", GRAPHKEYS_COLUMNSEL_CFRA);
- RNA_enum_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_column", KKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", GRAPHKEYS_COLUMNSEL_MARKERS_COLUMN);
- RNA_enum_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_column", KKEY, KM_PRESS, KM_ALT, 0)->ptr, "mode", GRAPHKEYS_COLUMNSEL_MARKERS_BETWEEN);
-
- /* select more/less */
- WM_keymap_add_item(keymap, "GRAPH_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
-
- /* select linked */
- WM_keymap_add_item(keymap, "GRAPH_OT_select_linked", LKEY, KM_PRESS, 0, 0);
-
-
- /* graph_edit.c */
- /* jump to selected keyframes */
- WM_keymap_add_item(keymap, "GRAPH_OT_frame_jump", GKEY, KM_PRESS, KM_CTRL, 0);
-
- /* menu + single-step transform */
- WM_keymap_add_item(keymap, "GRAPH_OT_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_mirror", MKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "GRAPH_OT_handle_type", VKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "GRAPH_OT_interpolation_type", TKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_easing_type", EKEY, KM_PRESS, KM_CTRL, 0);
-
- /* destructive */
- WM_keymap_add_item(keymap, "GRAPH_OT_smooth", OKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_sample", OKEY, KM_PRESS, KM_SHIFT | KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "GRAPH_OT_bake", CKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_menu(keymap, "GRAPH_MT_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_menu(keymap, "GRAPH_MT_delete", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_menu(keymap, "GRAPH_MT_specials", WKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "GRAPH_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* insertkey */
- WM_keymap_add_item(keymap, "GRAPH_OT_keyframe_insert", IKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_click_insert", ACTIONMOUSE, KM_CLICK, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_click_insert", ACTIONMOUSE, KM_CLICK, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
-
- /* copy/paste */
- WM_keymap_add_item(keymap, "GRAPH_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0);
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_paste", VKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "flipped", true);
-#ifdef __APPLE__
- WM_keymap_add_item(keymap, "GRAPH_OT_copy", CKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_paste", VKEY, KM_PRESS, KM_OSKEY, 0);
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_paste", VKEY, KM_PRESS, KM_OSKEY | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "flipped", true);
-#endif
-
- /* auto-set range */
- WM_keymap_add_item(keymap, "GRAPH_OT_previewrange_set", PKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
-#ifdef WITH_INPUT_NDOF
- WM_keymap_add_item(keymap, "GRAPH_OT_view_all", NDOF_BUTTON_FIT, KM_PRESS, 0, 0);
-#endif
- WM_keymap_add_item(keymap, "GRAPH_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_view_frame", PAD0, KM_PRESS, 0, 0);
-
- /* F-Modifiers */
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_fmodifier_add", MKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "only_active", false);
-
- /* animation module */
- /* channels list
- * NOTE: these operators were originally for the channels list, but are added here too for convenience...
- */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_editable_toggle", TABKEY, KM_PRESS, 0, 0);
-
- /* transform system */
- transform_keymap_for_space(keyconf, keymap, SPACE_IPO);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", OKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.use_proportional_fcurve");
- ED_keymap_proportional_cycle(keyconf, keymap);
-
- /* pivot point settings */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", COMMAKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point");
- RNA_string_set(kmi->ptr, "value", "BOUNDING_BOX_CENTER");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", PERIODKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point");
- RNA_string_set(kmi->ptr, "value", "CURSOR");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", PERIODKEY, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point");
- RNA_string_set(kmi->ptr, "value", "INDIVIDUAL_ORIGINS");
-
- /* special markers hotkeys for anim editors: see note in definition of this function */
- ED_marker_keymap_animedit_conflictfree(keymap);
-}
-
-/* --------------- */
-
void graphedit_keymap(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap;
- wmKeyMapItem *kmi;
-
/* keymap for all regions */
- keymap = WM_keymap_ensure(keyconf, "Graph Editor Generic", SPACE_IPO, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_properties", NKEY, KM_PRESS, 0, 0);
-
- /* extrapolation works on channels, not keys */
- WM_keymap_add_item(keymap, "GRAPH_OT_extrapolation_type", EKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* find (i.e. a shortcut for setting the name filter) */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_find", FKEY, KM_PRESS, KM_CTRL, 0);
-
- /* hide/reveal selected curves */
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_hide", HKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
-
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
-
- WM_keymap_add_item(keymap, "GRAPH_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
-
+ WM_keymap_ensure(keyconf, "Graph Editor Generic", SPACE_IPO, 0);
/* channels */
/* Channels are not directly handled by the Graph Editor module, but are inherited from the Animation module.
@@ -719,6 +502,5 @@ void graphedit_keymap(wmKeyConfig *keyconf)
*/
/* keyframes */
- keymap = WM_keymap_ensure(keyconf, "Graph Editor", SPACE_IPO, 0);
- graphedit_keymap_keyframes(keyconf, keymap);
+ WM_keymap_ensure(keyconf, "Graph Editor", SPACE_IPO, 0);
}
diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c
index 3b2ff4266b7..ffbde1e9aab 100644
--- a/source/blender/editors/space_graph/graph_select.c
+++ b/source/blender/editors/space_graph/graph_select.c
@@ -219,7 +219,7 @@ void GRAPH_OT_select_all(wmOperatorType *ot)
WM_operator_properties_select_all(ot);
}
-/* ******************** Border Select Operator **************************** */
+/* ******************** Box Select Operator **************************** */
/* This operator currently works in one of three ways:
* -> BKEY - 1) all keyframes within region are selected (validation with BEZT_OK_REGION)
* -> ALT-BKEY - depending on which axis of the region was larger...
@@ -229,12 +229,12 @@ void GRAPH_OT_select_all(wmOperatorType *ot)
* The selection backend is also reused for the Lasso and Circle select operators.
*/
-/* Borderselect only selects keyframes now, as overshooting handles often get caught too,
+/* Box Select only selects keyframes now, as overshooting handles often get caught too,
* which means that they may be inadvertently moved as well. However, incl_handles overrides
* this, and allow handles to be considered independently too.
* Also, for convenience, handles should get same status as keyframe (if it was within bounds).
*/
-static void borderselect_graphkeys(
+static void box_select_graphkeys(
bAnimContext *ac, const rctf *rectf_view, short mode, short selectmode, bool incl_handles,
void *data)
{
@@ -285,7 +285,7 @@ static void borderselect_graphkeys(
mapping_flag |= ANIM_get_normalization_flags(ac);
- /* loop over data, doing border select */
+ /* loop over data, doing box select */
for (ale = anim_data.first; ale; ale = ale->next) {
AnimData *adt = ANIM_nla_mapping_get(ac, ale);
FCurve *fcu = (FCurve *)ale->key_data;
@@ -340,7 +340,7 @@ static void borderselect_graphkeys(
/* ------------------- */
-static int graphkeys_borderselect_exec(bContext *C, wmOperator *op)
+static int graphkeys_box_select_exec(bContext *C, wmOperator *op)
{
bAnimContext ac;
rcti rect;
@@ -374,7 +374,7 @@ static int graphkeys_borderselect_exec(bContext *C, wmOperator *op)
/* get settings from operator */
WM_operator_properties_border_to_rcti(op, &rect);
- /* selection 'mode' depends on whether borderselect region only matters on one axis */
+ /* selection 'mode' depends on whether box_select region only matters on one axis */
if (RNA_boolean_get(op->ptr, "axis_range")) {
/* mode depends on which axis of the range is larger to determine which axis to use
* - checking this in region-space is fine, as it's fundamentally still going to be a different rect size
@@ -391,8 +391,8 @@ static int graphkeys_borderselect_exec(bContext *C, wmOperator *op)
BLI_rctf_rcti_copy(&rect_fl, &rect);
- /* apply borderselect action */
- borderselect_graphkeys(&ac, &rect_fl, mode, selectmode, incl_handles, NULL);
+ /* apply box_select action */
+ box_select_graphkeys(&ac, &rect_fl, mode, selectmode, incl_handles, NULL);
/* send notifier that keyframe selection has changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, NULL);
@@ -400,18 +400,18 @@ static int graphkeys_borderselect_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void GRAPH_OT_select_border(wmOperatorType *ot)
+void GRAPH_OT_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
- ot->idname = "GRAPH_OT_select_border";
+ ot->name = "Box Select";
+ ot->idname = "GRAPH_OT_select_box";
ot->description = "Select all keyframes within the specified region";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
- ot->exec = graphkeys_borderselect_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = graphkeys_box_select_exec;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = graphop_visible_keyframes_poll;
@@ -419,7 +419,7 @@ void GRAPH_OT_select_border(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* rna */
- WM_operator_properties_gesture_border_select(ot);
+ WM_operator_properties_gesture_box_select(ot);
ot->prop = RNA_def_boolean(ot->srna, "axis_range", 0, "Axis Range", "");
RNA_def_boolean(ot->srna, "include_handles", 0, "Include Handles", "Are handles tested individually against the selection criteria");
@@ -474,8 +474,8 @@ static int graphkeys_lassoselect_exec(bContext *C, wmOperator *op)
BLI_lasso_boundbox(&rect, data_lasso.mcords, data_lasso.mcords_tot);
BLI_rctf_rcti_copy(&rect_fl, &rect);
- /* apply borderselect action */
- borderselect_graphkeys(&ac, &rect_fl, BEZT_OK_REGION_LASSO, selectmode, incl_handles, &data_lasso);
+ /* apply box_select action */
+ box_select_graphkeys(&ac, &rect_fl, BEZT_OK_REGION_LASSO, selectmode, incl_handles, &data_lasso);
MEM_freeN((void *)data_lasso.mcords);
@@ -547,8 +547,8 @@ static int graph_circle_select_exec(bContext *C, wmOperator *op)
}
}
- /* apply borderselect action */
- borderselect_graphkeys(&ac, &rect_fl, BEZT_OK_REGION_CIRCLE, selectmode, incl_handles, &data);
+ /* apply box_select action */
+ box_select_graphkeys(&ac, &rect_fl, BEZT_OK_REGION_CIRCLE, selectmode, incl_handles, &data);
/* send notifier that keyframe selection has changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, NULL);
diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c
index 6a921eede4a..eff216f8c02 100644
--- a/source/blender/editors/space_graph/space_graph.c
+++ b/source/blender/editors/space_graph/space_graph.c
@@ -344,7 +344,7 @@ static void graph_main_region_draw(const bContext *C, ARegion *ar)
/* scrollers */
// FIXME: args for scrollers depend on the type of data being shown...
- scrollers = UI_view2d_scrollers_calc(C, v2d, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP);
+ scrollers = UI_view2d_scrollers_calc(C, v2d, NULL, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP);
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);
@@ -397,7 +397,7 @@ static void graph_channel_region_draw(const bContext *C, ARegion *ar)
UI_view2d_view_restore(C);
/* scrollers */
- scrollers = UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
+ scrollers = UI_view2d_scrollers_calc(C, v2d, NULL, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);
}
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index afcae7a27ab..26162266441 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -125,7 +125,7 @@ static void image_info(Scene *scene, ImageUser *iuser, Image *ima, ImBuf *ibuf,
/* the frame number, even if we cant */
if (ima->source == IMA_SRC_SEQUENCE) {
/* don't use iuser->framenr directly because it may not be updated if auto-refresh is off */
- const int framenr = BKE_image_user_frame_get(iuser, CFRA, 0, NULL);
+ const int framenr = BKE_image_user_frame_get(iuser, CFRA, NULL);
ofs += BLI_snprintf(str + ofs, len - ofs, IFACE_(", Frame: %d"), framenr);
}
}
@@ -863,7 +863,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
ima = imaptr.data;
iuser = userptr->data;
- BKE_image_user_check_frame_calc(iuser, (int)scene->r.cfra, 0);
+ BKE_image_user_check_frame_calc(iuser, (int)scene->r.cfra);
cb = MEM_callocN(sizeof(RNAUpdateCb), "RNAUpdateCb");
cb->ptr = *ptr;
@@ -965,7 +965,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
uiItemR(col, &imaptr, "use_view_as_render", 0, NULL, ICON_NONE);
if (ima->source != IMA_SRC_GENERATED) {
- if (compact == 0) { /* background image view doesnt need these */
+ if (compact == 0) { /* background image view doesn't need these */
ImBuf *ibuf = BKE_image_acquire_ibuf(ima, iuser, NULL);
bool has_alpha = true;
@@ -1051,19 +1051,19 @@ void uiTemplateImageSettings(uiLayout *layout, PointerRNA *imfptr, bool color_ma
PointerRNA display_settings_ptr;
PropertyRNA *prop;
const int depth_ok = BKE_imtype_valid_depths(imf->imtype);
- /* some settings depend on this being a scene thats rendered */
+ /* some settings depend on this being a scene that's rendered */
const bool is_render_out = (id && GS(id->name) == ID_SCE);
- uiLayout *col, *row, *split, *sub;
+ uiLayout *col;
bool show_preview = false;
col = uiLayoutColumn(layout, false);
- split = uiLayoutSplit(col, 0.5f, false);
+ uiLayoutSetPropSep(col, true);
+ uiLayoutSetPropDecorate(col, false);
- uiItemR(split, imfptr, "file_format", 0, "", ICON_NONE);
- sub = uiLayoutRow(split, false);
- uiItemR(sub, imfptr, "color_mode", UI_ITEM_R_EXPAND, IFACE_("Color"), ICON_NONE);
+ uiItemR(col, imfptr, "file_format", 0, NULL, ICON_NONE);
+ uiItemR(uiLayoutRow(col, true), imfptr, "color_mode", UI_ITEM_R_EXPAND, IFACE_("Color"), ICON_NONE);
/* only display depth setting if multiple depths can be used */
if ((ELEM(depth_ok,
@@ -1075,10 +1075,7 @@ void uiTemplateImageSettings(uiLayout *layout, PointerRNA *imfptr, bool color_ma
R_IMF_CHAN_DEPTH_24,
R_IMF_CHAN_DEPTH_32)) == 0)
{
- row = uiLayoutRow(col, false);
-
- uiItemL(row, IFACE_("Color Depth:"), ICON_NONE);
- uiItemR(row, imfptr, "color_depth", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+ uiItemR(uiLayoutRow(col, true), imfptr, "color_depth", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
}
if (BKE_imtype_supports_quality(imf->imtype)) {
@@ -1093,22 +1090,20 @@ void uiTemplateImageSettings(uiLayout *layout, PointerRNA *imfptr, bool color_ma
uiItemR(col, imfptr, "exr_codec", 0, NULL, ICON_NONE);
}
- row = uiLayoutRow(col, false);
if (BKE_imtype_supports_zbuf(imf->imtype)) {
- uiItemR(row, imfptr, "use_zbuffer", 0, NULL, ICON_NONE);
+ uiItemR(col, imfptr, "use_zbuffer", 0, NULL, ICON_NONE);
}
if (is_render_out && ELEM(imf->imtype, R_IMF_IMTYPE_OPENEXR, R_IMF_IMTYPE_MULTILAYER)) {
show_preview = true;
- uiItemR(row, imfptr, "use_preview", 0, NULL, ICON_NONE);
+ uiItemR(col, imfptr, "use_preview", 0, NULL, ICON_NONE);
}
if (imf->imtype == R_IMF_IMTYPE_JP2) {
uiItemR(col, imfptr, "jpeg2k_codec", 0, NULL, ICON_NONE);
- row = uiLayoutRow(col, false);
- uiItemR(row, imfptr, "use_jpeg2k_cinema_preset", 0, NULL, ICON_NONE);
- uiItemR(row, imfptr, "use_jpeg2k_cinema_48", 0, NULL, ICON_NONE);
+ uiItemR(col, imfptr, "use_jpeg2k_cinema_preset", 0, NULL, ICON_NONE);
+ uiItemR(col, imfptr, "use_jpeg2k_cinema_48", 0, NULL, ICON_NONE);
uiItemR(col, imfptr, "use_jpeg2k_ycc", 0, NULL, ICON_NONE);
}
@@ -1184,17 +1179,19 @@ void uiTemplateImageStereo3d(uiLayout *layout, PointerRNA *stereo3d_format_ptr)
static void uiTemplateViewsFormat(uiLayout *layout, PointerRNA *ptr, PointerRNA *stereo3d_format_ptr)
{
- uiLayout *col, *box;
+ uiLayout *col;
col = uiLayoutColumn(layout, false);
- uiItemL(col, IFACE_("Views Format:"), ICON_NONE);
- uiItemR(uiLayoutRow(col, false), ptr, "views_format", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+ uiLayoutSetPropSep(col, true);
+ uiLayoutSetPropDecorate(col, false);
- if (stereo3d_format_ptr) {
- box = uiLayoutBox(col);
- uiLayoutSetActive(box, RNA_enum_get(ptr, "views_format") == R_IMF_VIEWS_STEREO_3D);
- uiTemplateImageStereo3d(box, stereo3d_format_ptr);
+ uiItemR(col, ptr, "views_format", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+
+ if (stereo3d_format_ptr &&
+ RNA_enum_get(ptr, "views_format") == R_IMF_VIEWS_STEREO_3D)
+ {
+ uiTemplateImageStereo3d(col, stereo3d_format_ptr);
}
}
diff --git a/source/blender/editors/space_image/image_edit.c b/source/blender/editors/space_image/image_edit.c
index 4388accc534..96c3f55df92 100644
--- a/source/blender/editors/space_image/image_edit.c
+++ b/source/blender/editors/space_image/image_edit.c
@@ -38,9 +38,9 @@
#include "BKE_colortools.h"
#include "BKE_context.h"
+#include "BKE_editmesh.h"
#include "BKE_global.h"
#include "BKE_image.h"
-#include "BKE_editmesh.h"
#include "BKE_library.h"
#include "BKE_main.h"
@@ -361,8 +361,14 @@ bool ED_space_image_show_paint(SpaceImage *sima)
bool ED_space_image_show_uvedit(SpaceImage *sima, Object *obedit)
{
- if (sima && (ED_space_image_show_render(sima) || ED_space_image_show_paint(sima)))
- return false;
+ if (sima) {
+ if (ED_space_image_show_render(sima)) {
+ return false;
+ }
+ if (sima->mode != SI_MODE_UV) {
+ return false;
+ }
+ }
if (obedit && obedit->type == OB_MESH) {
struct BMEditMesh *em = BKE_editmesh_from_object(obedit);
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index be91f7abf99..b161de9f472 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -288,13 +288,12 @@ static bool image_sample_poll(bContext *C)
{
SpaceImage *sima = CTX_wm_space_image(C);
if (sima) {
- Scene *scene = CTX_data_scene(C);
Object *obedit = CTX_data_edit_object(C);
- ToolSettings *toolsettings = scene->toolsettings;
-
if (obedit) {
- if (ED_space_image_show_uvedit(sima, obedit) && (toolsettings->use_uv_sculpt))
+ /* Disable when UV editing so it doesn't swallow all click events (use for setting cursor). */
+ if (ED_space_image_show_uvedit(sima, obedit)) {
return false;
+ }
}
else if (sima->mode != SI_MODE_VIEW) {
return false;
@@ -1041,15 +1040,15 @@ void IMAGE_OT_view_zoom_border(wmOperatorType *ot)
ot->idname = "IMAGE_OT_view_zoom_border";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
+ ot->invoke = WM_gesture_box_invoke;
ot->exec = image_view_zoom_border_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = space_image_main_region_poll;
/* rna */
- WM_operator_properties_gesture_border_zoom(ot);
+ WM_operator_properties_gesture_box_zoom(ot);
}
/**************** load/replace/save callbacks ******************/
@@ -1495,7 +1494,7 @@ static int image_match_len_exec(bContext *C, wmOperator *UNUSED(op))
if (!anim)
return OPERATOR_CANCELLED;
iuser->frames = IMB_anim_get_duration(anim, IMB_TC_RECORD_RUN);
- BKE_image_user_frame_calc(iuser, scene->r.cfra, 0);
+ BKE_image_user_frame_calc(iuser, scene->r.cfra);
return OPERATOR_FINISHED;
}
@@ -1859,6 +1858,8 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
rr = BKE_image_acquire_renderresult(scene, ima);
bool is_mono = rr ? BLI_listbase_count_at_most(&rr->views, 2) < 2 : BLI_listbase_count_at_most(&ima->views, 2) < 2;
bool is_exr_rr = rr && ELEM(imf->imtype, R_IMF_IMTYPE_OPENEXR, R_IMF_IMTYPE_MULTILAYER) && RE_HasFloatPixels(rr);
+ bool is_multilayer = is_exr_rr && (imf->imtype == R_IMF_IMTYPE_MULTILAYER);
+ int layer = (is_multilayer) ? -1 : sima->iuser.layer;
/* error handling */
if (!rr) {
@@ -1890,14 +1891,14 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
/* fancy multiview OpenEXR */
if (imf->views_format == R_IMF_VIEWS_MULTIVIEW && is_exr_rr) {
/* save render result */
- ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf, NULL, sima->iuser.layer);
+ ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf, NULL, layer);
save_image_post(bmain, op, ibuf, ima, ok, true, relbase, relative, do_newpath, simopts->filepath);
ED_space_image_release_buffer(sima, ibuf, lock);
}
/* regular mono pipeline */
else if (is_mono) {
if (is_exr_rr) {
- ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf, NULL, -1);
+ ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf, NULL, layer);
}
else {
colormanaged_ibuf = IMB_colormanagement_imbuf_for_write(ibuf, save_as_render, true, &imf->view_settings, &imf->display_settings, imf);
@@ -1925,7 +1926,7 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
if (is_exr_rr) {
BKE_scene_multiview_view_filepath_get(&scene->r, simopts->filepath, view, filepath);
- ok_view = RE_WriteRenderResult(op->reports, rr, filepath, imf, view, -1);
+ ok_view = RE_WriteRenderResult(op->reports, rr, filepath, imf, view, layer);
save_image_post(bmain, op, ibuf, ima, ok_view, true, relbase, relative, do_newpath, filepath);
}
else {
@@ -1960,7 +1961,7 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
/* stereo (multiview) images */
else if (simopts->im_format.views_format == R_IMF_VIEWS_STEREO_3D) {
if (imf->imtype == R_IMF_IMTYPE_MULTILAYER) {
- ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf, NULL, -1);
+ ok = RE_WriteRenderResult(op->reports, rr, simopts->filepath, imf, NULL, layer);
save_image_post(bmain, op, ibuf, ima, ok, true, relbase, relative, do_newpath, simopts->filepath);
ED_space_image_release_buffer(sima, ibuf, lock);
}
@@ -2487,7 +2488,7 @@ static int image_new_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(e
/* Better for user feedback. */
RNA_string_set(op->ptr, "name", DATA_(IMA_DEF_NAME));
- return WM_operator_props_dialog_popup(C, op, 15 * UI_UNIT_X, 5 * UI_UNIT_Y);
+ return WM_operator_props_dialog_popup(C, op, 300, 100);
}
static void image_new_draw(bContext *UNUSED(C), wmOperator *op)
@@ -3768,10 +3769,10 @@ void IMAGE_OT_render_border(wmOperatorType *ot)
ot->idname = "IMAGE_OT_render_border";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
+ ot->invoke = WM_gesture_box_invoke;
ot->exec = render_border_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = image_cycle_render_slot_poll;
/* flags */
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index 1b7851eede7..01d2fc28c6b 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -48,9 +48,9 @@
#include "BKE_image.h"
#include "BKE_layer.h"
#include "BKE_library.h"
+#include "BKE_material.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
-#include "BKE_material.h"
#include "BKE_workspace.h"
#include "DEG_depsgraph.h"
@@ -293,97 +293,8 @@ static void image_operatortypes(void)
static void image_keymap(struct wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Image Generic", SPACE_IMAGE, 0);
- wmKeyMapItem *kmi;
- int i;
-
- WM_keymap_add_item(keymap, "IMAGE_OT_new", NKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_open", OKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_reload", RKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_read_viewlayers", RKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_save", SKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_save_as", SKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_properties", NKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_toolshelf", TKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_menu(keymap, "IMAGE_MT_specials", WKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "IMAGE_OT_cycle_render_slot", JKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "IMAGE_OT_cycle_render_slot", JKEY, KM_PRESS, KM_ALT, 0)->ptr, "reverse", true);
-
- keymap = WM_keymap_ensure(keyconf, "Image", SPACE_IMAGE, 0);
-
- WM_keymap_add_item(keymap, "IMAGE_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "IMAGE_OT_view_all", HOMEKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "fit_view", true);
-
- WM_keymap_add_item(keymap, "IMAGE_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_view_pan", MIDDLEMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_view_pan", MIDDLEMOUSE, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_view_pan", MOUSEPAN, 0, 0, 0);
-
-#ifdef WITH_INPUT_NDOF
- WM_keymap_add_item(keymap, "IMAGE_OT_view_all", NDOF_BUTTON_FIT, KM_PRESS, 0, 0); // or view selected?
- WM_keymap_add_item(keymap, "IMAGE_OT_view_ndof", NDOF_MOTION, 0, 0, 0);
-#endif
-
- WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_in", WHEELINMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_out", WHEELOUTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_in", PADPLUSKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_out", PADMINUS, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom", MOUSEZOOM, 0, 0, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom", MOUSEPAN, 0, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_border", BKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* ctrl now works as well, shift + numpad works as arrow keys on Windows */
- RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD8, KM_PRESS, KM_CTRL, 0)->ptr, "ratio", 8.0f);
- RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD4, KM_PRESS, KM_CTRL, 0)->ptr, "ratio", 4.0f);
- RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD2, KM_PRESS, KM_CTRL, 0)->ptr, "ratio", 2.0f);
- RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD8, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 8.0f);
- RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD4, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 4.0f);
- RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD2, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 2.0f);
-
- RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD1, KM_PRESS, 0, 0)->ptr, "ratio", 1.0f);
- RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD2, KM_PRESS, 0, 0)->ptr, "ratio", 0.5f);
- RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD4, KM_PRESS, 0, 0)->ptr, "ratio", 0.25f);
- RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD8, KM_PRESS, 0, 0)->ptr, "ratio", 0.125f);
-
- WM_keymap_add_item(keymap, "IMAGE_OT_change_frame", LEFTMOUSE, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "IMAGE_OT_sample", ACTIONMOUSE, KM_PRESS, 0, 0);
- RNA_enum_set(WM_keymap_add_item(keymap, "IMAGE_OT_curves_point_set", ACTIONMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "point", 0);
- RNA_enum_set(WM_keymap_add_item(keymap, "IMAGE_OT_curves_point_set", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "point", 1);
-
- /* toggle editmode is handy to have while UV unwrapping */
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_mode_set", TABKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", OB_MODE_EDIT);
- RNA_boolean_set(kmi->ptr, "toggle", true);
-
- /* fast switch to render slots */
- for (i = 0; i < 9; i++) {
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_int", ONEKEY + i, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.image.render_slots.active_index");
- RNA_int_set(kmi->ptr, "value", i);
- }
-
- /* pivot */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", COMMAKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point");
- RNA_string_set(kmi->ptr, "value", "CENTER");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", COMMAKEY, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point");
- RNA_string_set(kmi->ptr, "value", "MEDIAN");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", PERIODKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point");
- RNA_string_set(kmi->ptr, "value", "CURSOR");
-
- /* render border */
- WM_keymap_add_item(keymap, "IMAGE_OT_render_border", BKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_clear_render_border", BKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
+ WM_keymap_ensure(keyconf, "Image Generic", SPACE_IMAGE, 0);
+ WM_keymap_ensure(keyconf, "Image", SPACE_IMAGE, 0);
}
/* dropboxes */
@@ -421,7 +332,7 @@ static void image_refresh(const bContext *C, ScrArea *sa)
ima = ED_space_image(sima);
- BKE_image_user_check_frame_calc(&sima->iuser, scene->r.cfra, 0);
+ BKE_image_user_check_frame_calc(&sima->iuser, scene->r.cfra);
/* check if we have to set the image from the editmesh */
if (ima && (ima->source == IMA_SRC_VIEWER && sima->mode == SI_MODE_MASK)) {
@@ -586,7 +497,8 @@ static void IMAGE_GGT_gizmo2d(wmGizmoGroupType *gzgt)
gzgt->name = "UV Transform Gizmo";
gzgt->idname = "IMAGE_GGT_gizmo2d";
- gzgt->flag |= WM_GIZMOGROUPTYPE_PERSISTENT;
+ gzgt->gzmap_params.spaceid = SPACE_IMAGE;
+ gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
gzgt->poll = ED_widgetgroup_gizmo2d_poll;
gzgt->setup = ED_widgetgroup_gizmo2d_setup;
@@ -596,10 +508,7 @@ static void IMAGE_GGT_gizmo2d(wmGizmoGroupType *gzgt)
static void image_widgets(void)
{
- wmGizmoMapType *gzmap_type = WM_gizmomaptype_ensure(
- &(const struct wmGizmoMapType_Params){SPACE_IMAGE, RGN_TYPE_WINDOW});
-
- WM_gizmogrouptype_append_and_link(gzmap_type, IMAGE_GGT_gizmo2d);
+ WM_gizmogrouptype_append(IMAGE_GGT_gizmo2d);
}
/************************** main region ***************************/
@@ -667,16 +576,6 @@ static void image_main_region_init(wmWindowManager *wm, ARegion *ar)
// image space manages own v2d
// UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_STANDARD, ar->winx, ar->winy);
- /* gizmos */
- if (ar->gizmo_map == NULL) {
- const struct wmGizmoMapType_Params wmap_params = {
- .spaceid = SPACE_IMAGE,
- .regionid = RGN_TYPE_WINDOW,
- };
- ar->gizmo_map = WM_gizmomap_new_from_type(&wmap_params);
- }
- WM_gizmomap_add_handlers(ar, ar->gizmo_map);
-
/* mask polls mode */
keymap = WM_keymap_ensure(wm->defaultconf, "Mask Editing", 0, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
@@ -987,21 +886,6 @@ static void image_tools_region_listener(
}
}
-static void image_tools_region_message_subscribe(
- const struct bContext *UNUSED(C),
- struct WorkSpace *UNUSED(workspace), struct Scene *UNUSED(scene),
- struct bScreen *UNUSED(screen), struct ScrArea *UNUSED(sa), struct ARegion *ar,
- struct wmMsgBus *mbus)
-{
- wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
- .owner = ar,
- .user_data = ar,
- .notify = ED_region_do_msg_notify_tag_redraw,
- };
- WM_msg_subscribe_rna_anon_prop(mbus, WorkSpace, tools, &msg_sub_value_region_tag_redraw);
-}
-
-
/************************* header region **************************/
/* add handlers, stuff you only do once or on area/region changes */
@@ -1097,7 +981,7 @@ void ED_spacetype_image(void)
/* regions: main window */
art = MEM_callocN(sizeof(ARegionType), "spacetype image region");
art->regionid = RGN_TYPE_WINDOW;
- art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_GPENCIL;
+ art->keymapflag = ED_KEYMAP_GIZMO | ED_KEYMAP_FRAMES | ED_KEYMAP_GPENCIL;
art->init = image_main_region_init;
art->draw = image_main_region_draw;
art->listener = image_main_region_listener;
@@ -1119,10 +1003,12 @@ void ED_spacetype_image(void)
/* regions: statistics/scope buttons */
art = MEM_callocN(sizeof(ARegionType), "spacetype image region");
art->regionid = RGN_TYPE_TOOLS;
- art->prefsizex = 220; // XXX
+ art->prefsizex = 58; /* XXX */
+ art->prefsizey = 50; /* XXX */
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_FRAMES;
art->listener = image_tools_region_listener;
- art->message_subscribe = image_tools_region_message_subscribe;
+ art->message_subscribe = ED_region_generic_tools_region_message_subscribe;
+ art->snap_size = ED_region_generic_tools_region_snap_size;
art->init = image_tools_region_init;
art->draw = image_tools_region_draw;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_info/CMakeLists.txt b/source/blender/editors/space_info/CMakeLists.txt
index 96fe9322b97..4896515182e 100644
--- a/source/blender/editors/space_info/CMakeLists.txt
+++ b/source/blender/editors/space_info/CMakeLists.txt
@@ -25,6 +25,7 @@ set(INC
../../blenlib
../../blenloader
../../blentranslation
+ ../../depsgraph
../../imbuf
../../bmesh
../../gpu
diff --git a/source/blender/editors/space_info/info_intern.h b/source/blender/editors/space_info/info_intern.h
index a16acd665b4..37d3c73f705 100644
--- a/source/blender/editors/space_info/info_intern.h
+++ b/source/blender/editors/space_info/info_intern.h
@@ -61,7 +61,7 @@ void info_textview_main(struct SpaceInfo *sinfo, struct ARegion *ar, struct Repo
int info_report_mask(struct SpaceInfo *sinfo);
void INFO_OT_select_pick(struct wmOperatorType *ot); /* report selection */
void INFO_OT_select_all_toggle(struct wmOperatorType *ot);
-void INFO_OT_select_border(struct wmOperatorType *ot);
+void INFO_OT_select_box(struct wmOperatorType *ot);
void INFO_OT_report_replay(struct wmOperatorType *ot);
void INFO_OT_report_delete(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_info/info_ops.c b/source/blender/editors/space_info/info_ops.c
index acd0a856f1a..ec0084931eb 100644
--- a/source/blender/editors/space_info/info_ops.c
+++ b/source/blender/editors/space_info/info_ops.c
@@ -70,7 +70,7 @@
#include "info_intern.h"
-/********************* pack blend file libaries operator *********************/
+/********************* pack blend file libraries operator *********************/
static int pack_libraries_exec(bContext *C, wmOperator *op)
{
@@ -124,7 +124,7 @@ void FILE_OT_unpack_libraries(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/********************* toogle auto-pack operator *********************/
+/********************* toggle auto-pack operator *********************/
static int autopack_toggle_exec(bContext *C, wmOperator *op)
{
@@ -509,8 +509,7 @@ static int update_reports_display_invoke(bContext *C, wmOperator *UNUSED(op), co
Report *report;
ReportTimerInfo *rti;
float progress = 0.0, color_progress = 0.0;
- float neutral_col[3] = {0.35, 0.35, 0.35};
- float neutral_gray = 0.6;
+ float neutral_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
float timeout = 0.0, color_timeout = 0.0;
int send_note = 0;
@@ -541,34 +540,33 @@ static int update_reports_display_invoke(bContext *C, wmOperator *UNUSED(op), co
if (rti->widthfac == 0.0f) {
/* initialize colors based on report type */
if (report->type & RPT_ERROR_ALL) {
- rti->col[0] = 1.0;
- rti->col[1] = 0.2;
- rti->col[2] = 0.0;
+ rti->col[0] = 1.0f;
+ rti->col[1] = 0.2f;
+ rti->col[2] = 0.0f;
}
else if (report->type & RPT_WARNING_ALL) {
- rti->col[0] = 1.0;
- rti->col[1] = 1.0;
- rti->col[2] = 0.0;
+ rti->col[0] = 1.0f;
+ rti->col[1] = 1.0f;
+ rti->col[2] = 0.0f;
}
else if (report->type & RPT_INFO_ALL) {
- rti->col[0] = 0.3;
- rti->col[1] = 0.45;
- rti->col[2] = 0.7;
+ rti->col[0] = 0.3f;
+ rti->col[1] = 0.45f;
+ rti->col[2] = 0.7f;
}
- rti->grayscale = 0.75;
- rti->widthfac = 1.0;
+ rti->col[3] = 0.65f;
+ rti->widthfac = 1.0f;
}
- progress = (float)reports->reporttimer->duration / timeout;
- color_progress = (float)reports->reporttimer->duration / color_timeout;
+ progress = powf((float)reports->reporttimer->duration / timeout, 2.0f);
+ color_progress = powf((float)reports->reporttimer->duration / color_timeout, 2.0);
/* save us from too many draws */
if (color_progress <= 1.0f) {
send_note = 1;
/* fade colors out sharply according to progress through fade-out duration */
- interp_v3_v3v3(rti->col, rti->col, neutral_col, color_progress);
- rti->grayscale = interpf(neutral_gray, rti->grayscale, color_progress);
+ interp_v4_v4v4(rti->col, rti->col, neutral_col, color_progress);
}
/* collapse report at end of timeout */
diff --git a/source/blender/editors/space_info/info_report.c b/source/blender/editors/space_info/info_report.c
index a6b3dad239c..d512ac8b32b 100644
--- a/source/blender/editors/space_info/info_report.c
+++ b/source/blender/editors/space_info/info_report.c
@@ -212,8 +212,8 @@ void INFO_OT_select_all_toggle(wmOperatorType *ot)
/* properties */
}
-/* borderselect operator */
-static int borderselect_exec(bContext *C, wmOperator *op)
+/* box_select operator */
+static int box_select_exec(bContext *C, wmOperator *op)
{
SpaceInfo *sinfo = CTX_wm_space_info(C);
ARegion *ar = CTX_wm_region(C);
@@ -286,19 +286,19 @@ static int borderselect_exec(bContext *C, wmOperator *op)
}
-/* ****** Border Select ****** */
-void INFO_OT_select_border(wmOperatorType *ot)
+/* ****** Box Select ****** */
+void INFO_OT_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
- ot->description = "Toggle border selection";
- ot->idname = "INFO_OT_select_border";
+ ot->name = "Box Select";
+ ot->description = "Toggle box selection";
+ ot->idname = "INFO_OT_select_box";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
- ot->exec = borderselect_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = box_select_exec;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = ED_operator_info_active;
@@ -306,7 +306,7 @@ void INFO_OT_select_border(wmOperatorType *ot)
/* ot->flag = OPTYPE_REGISTER; */
/* rna */
- WM_operator_properties_gesture_border_select(ot);
+ WM_operator_properties_gesture_box_select(ot);
}
diff --git a/source/blender/editors/space_info/info_stats.c b/source/blender/editors/space_info/info_stats.c
index b9814e97dfc..2bdb21633d9 100644
--- a/source/blender/editors/space_info/info_stats.c
+++ b/source/blender/editors/space_info/info_stats.c
@@ -57,6 +57,9 @@
#include "BKE_editmesh.h"
#include "BKE_object.h"
#include "BKE_gpencil.h"
+#include "BKE_scene.h"
+
+#include "DEG_depsgraph_query.h"
#include "ED_info.h"
#include "ED_armature.h"
@@ -171,16 +174,16 @@ static void stats_object_edit(Object *obedit, SceneStats *stats)
if (obedit->type == OB_MESH) {
BMEditMesh *em = BKE_editmesh_from_object(obedit);
- stats->totvert = em->bm->totvert;
- stats->totvertsel = em->bm->totvertsel;
+ stats->totvert += em->bm->totvert;
+ stats->totvertsel += em->bm->totvertsel;
- stats->totedge = em->bm->totedge;
- stats->totedgesel = em->bm->totedgesel;
+ stats->totedge += em->bm->totedge;
+ stats->totedgesel += em->bm->totedgesel;
- stats->totface = em->bm->totface;
- stats->totfacesel = em->bm->totfacesel;
+ stats->totface += em->bm->totface;
+ stats->totfacesel += em->bm->totfacesel;
- stats->tottri = em->tottri;
+ stats->tottri += em->tottri;
}
else if (obedit->type == OB_ARMATURE) {
/* Armature Edit */
@@ -314,9 +317,10 @@ static void stats_dupli_object_group_doit(Collection *collection, SceneStats *st
}
}
-static void stats_dupli_object(Base *base, Object *ob, SceneStats *stats)
+static void stats_dupli_object(Object *ob, SceneStats *stats)
{
- if (base->flag & BASE_SELECTED) stats->totobjsel++;
+ const bool is_selected = (ob->base_flag & BASE_SELECTED) != 0;
+ if (is_selected) stats->totobjsel++;
if (ob->transflag & OB_DUPLIPARTS) {
/* Dupli Particles */
@@ -339,7 +343,7 @@ static void stats_dupli_object(Base *base, Object *ob, SceneStats *stats)
}
}
- stats_object(ob, base->flag & BASE_SELECTED, 1, stats);
+ stats_object(ob, is_selected, 1, stats);
stats->totobj++;
}
else if (ob->parent && (ob->parent->transflag & (OB_DUPLIVERTS | OB_DUPLIFACES))) {
@@ -355,23 +359,23 @@ static void stats_dupli_object(Base *base, Object *ob, SceneStats *stats)
}
stats->totobj += tot;
- stats_object(ob, base->flag & BASE_SELECTED, tot, stats);
+ stats_object(ob, is_selected, tot, stats);
}
else if (ob->transflag & OB_DUPLIFRAMES) {
/* Dupli Frames */
int tot = count_duplilist(ob);
stats->totobj += tot;
- stats_object(ob, base->flag & BASE_SELECTED, tot, stats);
+ stats_object(ob, is_selected, tot, stats);
}
else if ((ob->transflag & OB_DUPLICOLLECTION) && ob->dup_group) {
/* Dupli Group */
int tot = count_duplilist(ob);
stats->totobj += tot;
- stats_object(ob, base->flag & BASE_SELECTED, tot, stats);
+ stats_object(ob, is_selected, tot, stats);
}
else {
/* No Dupli */
- stats_object(ob, base->flag & BASE_SELECTED, 1, stats);
+ stats_object(ob, is_selected, 1, stats);
stats->totobj++;
}
}
@@ -384,16 +388,19 @@ static bool stats_is_object_dynamic_topology_sculpt(Object *ob, const eObjectMod
}
/* Statistics displayed in info header. Called regularly on scene changes. */
-static void stats_update(ViewLayer *view_layer)
+static void stats_update(Depsgraph *depsgraph, ViewLayer *view_layer)
{
SceneStats stats = {0};
Object *ob = OBACT(view_layer);
Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
- Base *base;
if (obedit) {
/* Edit Mode */
- stats_object_edit(ob, &stats);
+ FOREACH_OBJECT_IN_MODE_BEGIN(view_layer, ob->mode, ob_iter)
+ {
+ stats_object_edit(ob_iter, &stats);
+ }
+ FOREACH_OBJECT_IN_MODE_END;
}
else if (ob && (ob->mode & OB_MODE_POSE)) {
/* Pose Mode */
@@ -405,10 +412,11 @@ static void stats_update(ViewLayer *view_layer)
}
else {
/* Objects */
- for (base = view_layer->object_bases.first; base; base = base->next)
- if (base->flag & BASE_VISIBLE) {
- stats_dupli_object(base, base->object, &stats);
- }
+ DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(depsgraph, ob_iter)
+ {
+ stats_dupli_object(ob_iter, &stats);
+ }
+ DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END;
}
if (!view_layer->stats) {
@@ -527,8 +535,9 @@ static void stats_string(ViewLayer *view_layer)
}
else if ((ob) && (ob->type == OB_GPENCIL)) {
ofs += BLI_snprintf(s + ofs, MAX_INFO_LEN - ofs,
- IFACE_("Layers:%s | Frames:%s | Strokes:%s | Points:%s"),
- stats_fmt.totgplayer, stats_fmt.totgpframe, stats_fmt.totgpstroke, stats_fmt.totgppoint);
+ IFACE_("Layers:%s | Frames:%s | Strokes:%s | Points:%s | Objects:%s/%s"),
+ stats_fmt.totgplayer, stats_fmt.totgpframe, stats_fmt.totgpstroke,
+ stats_fmt.totgppoint, stats_fmt.totobjsel, stats_fmt.totobj);
ofs += BLI_strncpy_rlen(s + ofs, memstr, MAX_INFO_LEN - ofs);
ofs += BLI_strncpy_rlen(s + ofs, gpumemstr, MAX_INFO_LEN - ofs);
@@ -559,10 +568,11 @@ void ED_info_stats_clear(ViewLayer *view_layer)
}
}
-const char *ED_info_stats_string(Scene *UNUSED(scene), ViewLayer *view_layer)
+const char *ED_info_stats_string(Scene *scene, ViewLayer *view_layer)
{
+ Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer, true);
if (!view_layer->stats) {
- stats_update(view_layer);
+ stats_update(depsgraph, view_layer);
}
stats_string(view_layer);
return view_layer->stats->infostr;
diff --git a/source/blender/editors/space_info/space_info.c b/source/blender/editors/space_info/space_info.c
index abc953507e0..d2b6d07541e 100644
--- a/source/blender/editors/space_info/space_info.c
+++ b/source/blender/editors/space_info/space_info.c
@@ -175,7 +175,7 @@ static void info_main_region_draw(const bContext *C, ARegion *ar)
UI_view2d_view_restore(C);
/* scrollers */
- scrollers = UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_GRID_CLAMP);
+ scrollers = UI_view2d_scrollers_calc(C, v2d, NULL, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_GRID_CLAMP);
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);
}
@@ -198,7 +198,7 @@ static void info_operatortypes(void)
/* info_report.c */
WM_operatortype_append(INFO_OT_select_pick);
WM_operatortype_append(INFO_OT_select_all_toggle);
- WM_operatortype_append(INFO_OT_select_border);
+ WM_operatortype_append(INFO_OT_select_box);
WM_operatortype_append(INFO_OT_report_replay);
WM_operatortype_append(INFO_OT_report_delete);
@@ -207,28 +207,8 @@ static void info_operatortypes(void)
static void info_keymap(struct wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Window", 0, 0);
-
- WM_keymap_verify_item(keymap, "INFO_OT_reports_display_update", TIMERREPORT, KM_ANY, KM_ANY, 0);
-
- /* info space */
- keymap = WM_keymap_ensure(keyconf, "Info", SPACE_INFO, 0);
-
-
- /* report selection */
- WM_keymap_add_item(keymap, "INFO_OT_select_pick", SELECTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "INFO_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "INFO_OT_select_border", BKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "INFO_OT_report_replay", RKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "INFO_OT_report_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "INFO_OT_report_delete", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "INFO_OT_report_copy", CKEY, KM_PRESS, KM_CTRL, 0);
-#ifdef __APPLE__
- WM_keymap_add_item(keymap, "INFO_OT_report_copy", CKEY, KM_PRESS, KM_OSKEY, 0);
-#endif
+ WM_keymap_ensure(keyconf, "Window", 0, 0);
+ WM_keymap_ensure(keyconf, "Info", SPACE_INFO, 0);
}
/* add handlers, stuff you only do once or on area/region changes */
diff --git a/source/blender/editors/space_logic/space_logic.c b/source/blender/editors/space_logic/space_logic.c
index 6d484b4cb4c..1896d7ec3a2 100644
--- a/source/blender/editors/space_logic/space_logic.c
+++ b/source/blender/editors/space_logic/space_logic.c
@@ -41,7 +41,6 @@
#include "DNA_gpencil_types.h"
#include "BKE_context.h"
-#include "BKE_library.h"
#include "BKE_screen.h"
#include "ED_space_api.h"
@@ -179,16 +178,7 @@ static void logic_operatortypes(void)
static void logic_keymap(struct wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Logic Editor", SPACE_LOGIC, 0);
-
- WM_keymap_add_item(keymap, "LOGIC_OT_properties", NKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "LOGIC_OT_links_cut", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_menu(keymap, "LOGIC_MT_logicbricks_add", AKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "LOGIC_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
-#ifdef WITH_INPUT_NDOF
- WM_keymap_add_item(keymap, "LOGIC_OT_view_all", NDOF_BUTTON_FIT, KM_PRESS, 0, 0);
-#endif
+ WM_keymap_ensure(keyconf, "Logic Editor", SPACE_LOGIC, 0);
}
static void logic_refresh(const bContext *UNUSED(C), ScrArea *UNUSED(sa))
diff --git a/source/blender/editors/space_nla/CMakeLists.txt b/source/blender/editors/space_nla/CMakeLists.txt
index c8c64a79945..a6b80a9a587 100644
--- a/source/blender/editors/space_nla/CMakeLists.txt
+++ b/source/blender/editors/space_nla/CMakeLists.txt
@@ -23,6 +23,7 @@ set(INC
../../blenkernel
../../blenlib
../../blentranslation
+ ../../depsgraph
../../gpu
../../makesdna
../../makesrna
diff --git a/source/blender/editors/space_nla/nla_buttons.c b/source/blender/editors/space_nla/nla_buttons.c
index 40caf919848..d3964698fa3 100644
--- a/source/blender/editors/space_nla/nla_buttons.c
+++ b/source/blender/editors/space_nla/nla_buttons.c
@@ -277,7 +277,7 @@ static void nla_panel_animdata(const bContext *C, Panel *pa)
uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_LEFT);
uiItemL(row, id->name + 2, RNA_struct_ui_icon(id_ptr.type)); /* id-block (src) */
- uiItemL(row, "", VICO_SMALL_TRI_RIGHT_VEC); /* expander */
+ uiItemL(row, "", ICON_SMALL_TRI_RIGHT_VEC); /* expander */
uiItemL(row, IFACE_("Animation Data"), ICON_ANIM_DATA); /* animdata */
uiItemS(layout);
diff --git a/source/blender/editors/space_nla/nla_channels.c b/source/blender/editors/space_nla/nla_channels.c
index 51177a77f0d..132a296d5a3 100644
--- a/source/blender/editors/space_nla/nla_channels.c
+++ b/source/blender/editors/space_nla/nla_channels.c
@@ -60,6 +60,9 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
+
#include "UI_view2d.h"
#include "nla_intern.h" // own include
@@ -235,6 +238,7 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe
/* notifier flags - channel was edited */
notifierFlags |= (ND_ANIMCHAN | NA_EDITED);
+ ale->update |= ANIM_UPDATE_DEPS;
}
else if (x <= ((NLACHANNEL_BUTTON_WIDTH * 2) + offset)) {
/* toggle 'solo' */
@@ -242,6 +246,7 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe
/* notifier flags - channel was edited */
notifierFlags |= (ND_ANIMCHAN | NA_EDITED);
+ ale->update |= ANIM_UPDATE_DEPS;
}
else if (nlaedit_is_tweakmode_on(ac) == 0) {
/* set selection */
@@ -273,7 +278,8 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe
if (nlaedit_is_tweakmode_on(ac) == 0) {
/* 'push-down' action - only usable when not in TweakMode */
/* TODO: make this use the operator instead of calling the function directly
- * however, calling the operator requires that we supply the args, and that works with proper buttons only */
+ * however, calling the operator requires that we supply the args,
+ * and that works with proper buttons only */
BKE_nla_action_pushdown(adt);
}
else {
@@ -283,6 +289,7 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe
/* changes to NLA-Action occurred */
notifierFlags |= ND_NLA_ACTCHANGE;
+ ale->update |= ANIM_UPDATE_DEPS;
}
/* OR rest of name... */
else {
@@ -300,6 +307,7 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe
/* changes to NLA-Action occurred */
notifierFlags |= ND_NLA_ACTCHANGE;
+ ale->update |= ANIM_UPDATE_DEPS;
}
else {
/* select/deselect */
@@ -329,6 +337,7 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe
}
/* free channels */
+ ANIM_animdata_update(ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
/* return the notifier-flags set */
@@ -410,6 +419,7 @@ void NLA_OT_channels_click(wmOperatorType *ot)
static int nlachannels_pushdown_exec(bContext *C, wmOperator *op)
{
bAnimContext ac;
+ ID *id = NULL;
AnimData *adt = NULL;
int channel_index = RNA_int_get(op->ptr, "channel_index");
@@ -428,6 +438,7 @@ static int nlachannels_pushdown_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
else {
+ id = adt_ptr.id.data;
adt = adt_ptr.data;
}
}
@@ -456,6 +467,7 @@ static int nlachannels_pushdown_exec(bContext *C, wmOperator *op)
/* grab AnimData from the channel */
adt = ale->adt;
+ id = ale->id;
/* we don't need anything here anymore, so free it all */
ANIM_animdata_freelist(&anim_data);
@@ -478,6 +490,8 @@ static int nlachannels_pushdown_exec(bContext *C, wmOperator *op)
else {
/* 'push-down' action - only usable when not in TweakMode */
BKE_nla_action_pushdown(adt);
+
+ DEG_id_tag_update_ex(CTX_data_main(C), id, DEG_TAG_TIME | DEG_TAG_COPY_ON_WRITE);
}
/* set notifier that things have changed */
@@ -596,18 +610,21 @@ bool nlaedit_add_tracks_existing(bAnimContext *ac, bool above_sel)
if (above_sel) {
/* just add a new one above this one */
BKE_nlatrack_add(adt, nlt);
+ ale->update = ANIM_UPDATE_DEPS;
added = true;
}
else if ((lastAdt == NULL) || (adt != lastAdt)) {
/* add one track to the top of the owning AnimData's stack, then don't add anymore to this stack */
BKE_nlatrack_add(adt, NULL);
lastAdt = adt;
+ ale->update = ANIM_UPDATE_DEPS;
added = true;
}
}
}
/* free temp data */
+ ANIM_animdata_update(ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
return added;
@@ -636,11 +653,13 @@ bool nlaedit_add_tracks_empty(bAnimContext *ac)
if (BLI_listbase_is_empty(&adt->nla_tracks)) {
/* add new track to this AnimData block then */
BKE_nlatrack_add(adt, NULL);
+ ale->update = ANIM_UPDATE_DEPS;
added = true;
}
}
/* cleanup */
+ ANIM_animdata_update(ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
return added;
@@ -664,6 +683,8 @@ static int nlaedit_add_tracks_exec(bContext *C, wmOperator *op)
/* done? */
if (op_done) {
+ DEG_relations_tag_update(CTX_data_main(C));
+
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
@@ -730,13 +751,17 @@ static int nlaedit_delete_tracks_exec(bContext *C, wmOperator *UNUSED(op))
adt->flag &= ~ADT_NLA_SOLO_TRACK;
/* call delete on this track - deletes all strips too */
- BKE_nlatrack_free(&adt->nla_tracks, nlt);
+ BKE_nlatrack_free(&adt->nla_tracks, nlt, true);
+ ale->update = ANIM_UPDATE_DEPS;
}
}
/* free temp data */
+ ANIM_animdata_update(&ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
+ DEG_relations_tag_update(ac.bmain);
+
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
diff --git a/source/blender/editors/space_nla/nla_draw.c b/source/blender/editors/space_nla/nla_draw.c
index 7dd8c7f2eed..15a66b225c9 100644
--- a/source/blender/editors/space_nla/nla_draw.c
+++ b/source/blender/editors/space_nla/nla_draw.c
@@ -101,13 +101,12 @@ void nla_action_get_color(AnimData *adt, bAction *act, float color[4])
}
/* draw the keyframes in the specified Action */
-static void nla_action_draw_keyframes(AnimData *adt, bAction *act, float y, float ymin, float ymax)
+static void nla_action_draw_keyframes(View2D *v2d, AnimData *adt, bAction *act, float y, float ymin, float ymax)
{
/* get a list of the keyframes with NLA-scaling applied */
DLRBT_Tree keys;
BLI_dlrbTree_init(&keys);
- action_to_keylist(adt, act, &keys, NULL);
- BLI_dlrbTree_linkedlist_sync(&keys);
+ action_to_keylist(adt, act, &keys, 0);
if (ELEM(NULL, act, keys.first))
return;
@@ -146,8 +145,10 @@ static void nla_action_draw_keyframes(AnimData *adt, bAction *act, float y, floa
uint size_id = GPU_vertformat_attr_add(format, "size", GPU_COMP_F32, 1, GPU_FETCH_FLOAT);
uint color_id = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
uint outline_color_id = GPU_vertformat_attr_add(format, "outlineColor", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
+ uint flags_id = GPU_vertformat_attr_add(format, "flags", GPU_COMP_U32, 1, GPU_FETCH_INT);
immBindBuiltinProgram(GPU_SHADER_KEYFRAME_DIAMOND);
GPU_enable_program_point_size();
+ immUniform2f("ViewportSize", BLI_rcti_size_x(&v2d->mask) + 1, BLI_rcti_size_y(&v2d->mask) + 1);
immBegin(GPU_PRIM_POINTS, key_len);
/* - disregard the selection status of keyframes so they draw a certain way
@@ -155,7 +156,8 @@ static void nla_action_draw_keyframes(AnimData *adt, bAction *act, float y, floa
*/
for (ActKeyColumn *ak = keys.first; ak; ak = ak->next) {
draw_keyframe_shape(ak->cfra, y, 6.0f, false, ak->key_type, KEYFRAME_SHAPE_FRAME, 1.0f,
- pos_id, size_id, color_id, outline_color_id);
+ pos_id, size_id, color_id, outline_color_id,
+ flags_id, KEYFRAME_HANDLE_NONE, KEYFRAME_EXTREME_NONE);
}
immEnd();
@@ -751,7 +753,7 @@ void draw_nla_main_data(bAnimContext *ac, SpaceNla *snla, ARegion *ar)
immUnbindProgram();
/* draw keyframes in the action */
- nla_action_draw_keyframes(adt, ale->data, y, yminc + NLACHANNEL_SKIP, ymaxc - NLACHANNEL_SKIP);
+ nla_action_draw_keyframes(v2d, adt, ale->data, y, yminc + NLACHANNEL_SKIP, ymaxc - NLACHANNEL_SKIP);
GPU_blend(false);
break;
diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c
index 23cd504978c..387560c3f6c 100644
--- a/source/blender/editors/space_nla/nla_edit.c
+++ b/source/blender/editors/space_nla/nla_edit.c
@@ -46,11 +46,11 @@
#include "BLT_translation.h"
#include "BKE_action.h"
-#include "BKE_fcurve.h"
-#include "BKE_nla.h"
#include "BKE_context.h"
+#include "BKE_fcurve.h"
#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_nla.h"
#include "BKE_report.h"
#include "BKE_screen.h"
@@ -67,6 +67,8 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "DEG_depsgraph_build.h"
+
#include "UI_interface.h"
#include "UI_resources.h"
#include "UI_view2d.h"
@@ -90,9 +92,12 @@ void ED_nla_postop_refresh(bAnimContext *ac)
for (ale = anim_data.first; ale; ale = ale->next) {
/* performing auto-blending, extend-mode validation, etc. */
BKE_nla_validate_state(ale->data);
+
+ ale->update |= ANIM_UPDATE_DEPS;
}
/* free temp memory */
+ ANIM_animdata_update(ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
}
@@ -144,9 +149,12 @@ static int nlaedit_enable_tweakmode_exec(bContext *C, wmOperator *op)
BKE_nlatrack_solo_toggle(adt, nlt);
}
}
+
+ ale->update |= ANIM_UPDATE_DEPS;
}
/* free temp data */
+ ANIM_animdata_update(&ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
/* if we managed to enter tweakmode on at least one AnimData block,
@@ -223,9 +231,12 @@ bool nlaedit_disable_tweakmode(bAnimContext *ac, bool do_solo)
/* to be sure that we're doing everything right, just exit tweakmode... */
BKE_nla_tweakmode_exit(adt);
+
+ ale->update |= ANIM_UPDATE_DEPS;
}
/* free temp data */
+ ANIM_animdata_update(ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
/* if we managed to enter tweakmode on at least one AnimData block,
@@ -669,6 +680,8 @@ static int nlaedit_add_actionclip_exec(bContext *C, wmOperator *op)
/* refresh auto strip properties */
ED_nla_postop_refresh(&ac);
+ DEG_relations_tag_update(ac.bmain);
+
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
@@ -939,9 +952,12 @@ static int nlaedit_add_meta_exec(bContext *C, wmOperator *UNUSED(op))
if (strip->flag & NLASTRIP_FLAG_SELECT)
BKE_nlastrip_validate_name(adt, strip);
}
+
+ ale->update |= ANIM_UPDATE_DEPS;
}
/* free temp data */
+ ANIM_animdata_update(&ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
/* set notifier that things have changed */
@@ -991,9 +1007,12 @@ static int nlaedit_remove_meta_exec(bContext *C, wmOperator *UNUSED(op))
/* clear all selected meta-strips, regardless of whether they are temporary or not */
BKE_nlastrips_clear_metas(&nlt->strips, 1, 0);
+
+ ale->update |= ANIM_UPDATE_DEPS;
}
/* free temp data */
+ ANIM_animdata_update(&ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
/* set notifier that things have changed */
@@ -1057,7 +1076,7 @@ static int nlaedit_duplicate_exec(bContext *C, wmOperator *op)
/* if selected, split the strip at its midpoint */
if (strip->flag & NLASTRIP_FLAG_SELECT) {
/* make a copy (assume that this is possible) */
- nstrip = BKE_nlastrip_copy(ac.bmain, strip, linked);
+ nstrip = BKE_nlastrip_copy(ac.bmain, strip, linked, 0);
/* in case there's no space in the track above, or we haven't got a reference to it yet, try adding */
if (BKE_nlatrack_add_strip(nlt->next, nstrip) == 0) {
@@ -1087,6 +1106,10 @@ static int nlaedit_duplicate_exec(bContext *C, wmOperator *op)
/* refresh auto strip properties */
ED_nla_postop_refresh(&ac);
+ if (!linked) {
+ DEG_relations_tag_update(ac.bmain);
+ }
+
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
@@ -1160,14 +1183,14 @@ static int nlaedit_delete_exec(bContext *C, wmOperator *UNUSED(op))
if (strip->flag & NLASTRIP_FLAG_SELECT) {
/* if a strip either side of this was a transition, delete those too */
if ((strip->prev) && (strip->prev->type == NLASTRIP_TYPE_TRANSITION))
- BKE_nlastrip_free(&nlt->strips, strip->prev);
+ BKE_nlastrip_free(&nlt->strips, strip->prev, true);
if ((nstrip) && (nstrip->type == NLASTRIP_TYPE_TRANSITION)) {
nstrip = nstrip->next;
- BKE_nlastrip_free(&nlt->strips, strip->next);
+ BKE_nlastrip_free(&nlt->strips, strip->next, true);
}
/* finally, delete this strip */
- BKE_nlastrip_free(&nlt->strips, strip);
+ BKE_nlastrip_free(&nlt->strips, strip, true);
}
}
}
@@ -1178,6 +1201,8 @@ static int nlaedit_delete_exec(bContext *C, wmOperator *UNUSED(op))
/* refresh auto strip properties */
ED_nla_postop_refresh(&ac);
+ DEG_relations_tag_update(ac.bmain);
+
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
@@ -1242,7 +1267,7 @@ static void nlaedit_split_strip_actclip(Main *bmain, AnimData *adt, NlaTrack *nl
/* make a copy (assume that this is possible) and append
* it immediately after the current strip
*/
- nstrip = BKE_nlastrip_copy(bmain, strip, true);
+ nstrip = BKE_nlastrip_copy(bmain, strip, true, 0);
BLI_insertlinkafter(&nlt->strips, strip, nstrip);
/* set the endpoint of the first strip and the start of the new strip
@@ -1345,60 +1370,6 @@ void NLA_OT_split(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* ******************** Bake Strips Operator ***************************** */
-/* Bakes the NLA Strips for the active AnimData blocks */
-
-static int nlaedit_bake_exec(bContext *C, wmOperator *UNUSED(op))
-{
- bAnimContext ac;
-
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-// int flag = 0;
-
- /* get editor data */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
-
- /* get a list of the editable tracks being shown in the NLA */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_ANIMDATA | ANIMFILTER_FOREDIT);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* for each AnimData block, bake strips to animdata... */
- for (ale = anim_data.first; ale; ale = ale->next) {
- //BKE_nla_bake(ac.scene, ale->id, ale->data, flag);
- }
-
- /* free temp data */
- ANIM_animdata_freelist(&anim_data);
-
- /* refresh auto strip properties */
- ED_nla_postop_refresh(&ac);
-
- /* set notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
-
- /* done */
- return OPERATOR_FINISHED;
-}
-
-/* why isn't this used? */
-static void UNUSED_FUNCTION(NLA_OT_bake)(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name = "Bake Strips";
- ot->idname = "NLA_OT_bake";
- ot->description = "Bake all strips of selected AnimData blocks";
-
- /* api callbacks */
- ot->exec = nlaedit_bake_exec;
- ot->poll = nlaop_poll_tweakmode_off;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-}
-
/* *********************************************** */
/* NLA Editing Operations (Modifying) */
@@ -1819,11 +1790,14 @@ static int nlaedit_sync_actlen_exec(bContext *C, wmOperator *op)
/* adjust the strip extents in response to this */
BKE_nlastrip_recalculate_bounds(strip);
+
+ ale->update |= ANIM_UPDATE_DEPS;
}
}
}
/* free temp data */
+ ANIM_animdata_update(&ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
/* set notifier that things have changed */
@@ -1862,6 +1836,7 @@ static int nlaedit_make_single_user_exec(bContext *C, wmOperator *UNUSED(op))
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
+ bool copied = false;
/* get editor data */
if (ANIM_animdata_get_context(C, &ac) == 0)
@@ -1895,14 +1870,22 @@ static int nlaedit_make_single_user_exec(bContext *C, wmOperator *UNUSED(op))
/* switch to the new copy */
strip->act = new_action;
+
+ ale->update |= ANIM_UPDATE_DEPS;
+ copied = true;
}
}
}
}
/* free temp data */
+ ANIM_animdata_update(&ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
+ if (copied) {
+ DEG_relations_tag_update(ac.bmain);
+ }
+
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
@@ -1952,6 +1935,7 @@ static int nlaedit_apply_scale_exec(bContext *C, wmOperator *UNUSED(op))
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
+ bool copied = false;
KeyframeEditData ked = {{NULL}};
@@ -1981,6 +1965,8 @@ static int nlaedit_apply_scale_exec(bContext *C, wmOperator *UNUSED(op))
/* set this as the new referenced action, decrementing the users of the old one */
id_us_min(&strip->act->id);
strip->act = act;
+
+ copied = true;
}
/* setup iterator, and iterate over all the keyframes in the action, applying this scaling */
@@ -1993,13 +1979,20 @@ static int nlaedit_apply_scale_exec(bContext *C, wmOperator *UNUSED(op))
*/
strip->scale = 1.0f;
calc_action_range(strip->act, &strip->actstart, &strip->actend, 0);
+
+ ale->update |= ANIM_UPDATE_DEPS;
}
}
}
/* free temp data */
+ ANIM_animdata_update(&ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
+ if (copied) {
+ DEG_relations_tag_update(ac.bmain);
+ }
+
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
diff --git a/source/blender/editors/space_nla/nla_intern.h b/source/blender/editors/space_nla/nla_intern.h
index e59395cac6b..59844f31447 100644
--- a/source/blender/editors/space_nla/nla_intern.h
+++ b/source/blender/editors/space_nla/nla_intern.h
@@ -66,7 +66,7 @@ enum eNlaEdit_LeftRightSelect_Mode {
/* --- */
void NLA_OT_select_all(wmOperatorType *ot);
-void NLA_OT_select_border(wmOperatorType *ot);
+void NLA_OT_select_box(wmOperatorType *ot);
void NLA_OT_select_leftright(wmOperatorType *ot);
void NLA_OT_click_select(wmOperatorType *ot);
diff --git a/source/blender/editors/space_nla/nla_ops.c b/source/blender/editors/space_nla/nla_ops.c
index 53e9321b2e8..abe99eca381 100644
--- a/source/blender/editors/space_nla/nla_ops.c
+++ b/source/blender/editors/space_nla/nla_ops.c
@@ -124,7 +124,7 @@ void nla_operatortypes(void)
/* select */
WM_operatortype_append(NLA_OT_click_select);
- WM_operatortype_append(NLA_OT_select_border);
+ WM_operatortype_append(NLA_OT_select_box);
WM_operatortype_append(NLA_OT_select_all);
WM_operatortype_append(NLA_OT_select_leftright);
@@ -172,172 +172,10 @@ void nla_operatortypes(void)
/* ************************** registration - keymaps **********************************/
-static void nla_keymap_channels(wmKeyMap *keymap)
-{
- wmKeyMapItem *kmi;
-
- /* keymappings here are NLA-specific (different to standard channels keymap) */
-
- /* selection --------------------------------------------------------------------- */
- /* click-select */
- // XXX for now, only leftmouse....
- kmi = WM_keymap_add_item(keymap, "NLA_OT_channels_click", LEFTMOUSE, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- kmi = WM_keymap_add_item(keymap, "NLA_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
-
- /* channel operations ------------------------------------------------------------ */
- /* add tracks */
- kmi = WM_keymap_add_item(keymap, "NLA_OT_tracks_add", AKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "above_selected", false);
- kmi = WM_keymap_add_item(keymap, "NLA_OT_tracks_add", AKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "above_selected", true);
-
- /* delete tracks */
- WM_keymap_add_item(keymap, "NLA_OT_tracks_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "NLA_OT_tracks_delete", DELKEY, KM_PRESS, 0, 0);
-}
-
-static void nla_keymap_main(wmKeyConfig *keyconf, wmKeyMap *keymap)
-{
- wmKeyMapItem *kmi;
-
- /* selection ------------------------------------------------ */
- /* click select */
- kmi = WM_keymap_add_item(keymap, "NLA_OT_click_select", SELECTMOUSE, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- kmi = WM_keymap_add_item(keymap, "NLA_OT_click_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
-
- /* select left/right */
- kmi = WM_keymap_add_item(keymap, "NLA_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_enum_set(kmi->ptr, "mode", NLAEDIT_LRSEL_TEST);
- kmi = WM_keymap_add_item(keymap, "NLA_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_enum_set(kmi->ptr, "mode", NLAEDIT_LRSEL_TEST);
-
- kmi = WM_keymap_add_item(keymap, "NLA_OT_select_leftright", LEFTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_enum_set(kmi->ptr, "mode", NLAEDIT_LRSEL_LEFT);
- kmi = WM_keymap_add_item(keymap, "NLA_OT_select_leftright", RIGHTBRACKETKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_enum_set(kmi->ptr, "mode", NLAEDIT_LRSEL_RIGHT);
-
- /* deselect all */
- kmi = WM_keymap_add_item(keymap, "NLA_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "NLA_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "NLA_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- /* borderselect */
- kmi = WM_keymap_add_item(keymap, "NLA_OT_select_border", BKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "axis_range", false);
- kmi = WM_keymap_add_item(keymap, "NLA_OT_select_border", BKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "axis_range", true);
-
- /* view ---------------------------------------------------- */
- /* auto-set range */
- WM_keymap_add_item(keymap, "NLA_OT_previewrange_set", PKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "NLA_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
-#ifdef WITH_INPUT_NDOF
- WM_keymap_add_item(keymap, "NLA_OT_view_all", NDOF_BUTTON_FIT, KM_PRESS, 0, 0);
-#endif
- WM_keymap_add_item(keymap, "NLA_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "NLA_OT_view_frame", PAD0, KM_PRESS, 0, 0);
-
- /* editing ------------------------------------------------ */
-
- /* add strips */
- WM_keymap_add_item(keymap, "NLA_OT_actionclip_add", AKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "NLA_OT_transition_add", TKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "NLA_OT_soundclip_add", KKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* meta-strips */
- WM_keymap_add_item(keymap, "NLA_OT_meta_add", GKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "NLA_OT_meta_remove", GKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
-
- /* duplicate */
- kmi = WM_keymap_add_item(keymap, "NLA_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "linked", false);
-
- kmi = WM_keymap_add_item(keymap, "NLA_OT_duplicate", DKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "linked", true);
-
- /* single user */
- WM_keymap_add_item(keymap, "NLA_OT_make_single_user", UKEY, KM_PRESS, 0, 0);
-
- /* delete */
- WM_keymap_add_item(keymap, "NLA_OT_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "NLA_OT_delete", DELKEY, KM_PRESS, 0, 0);
-
- /* split */
- WM_keymap_add_item(keymap, "NLA_OT_split", YKEY, KM_PRESS, 0, 0);
-
- /* toggles */
- WM_keymap_add_item(keymap, "NLA_OT_mute_toggle", HKEY, KM_PRESS, 0, 0);
-
- /* swap */
- WM_keymap_add_item(keymap, "NLA_OT_swap", FKEY, KM_PRESS, KM_ALT, 0);
-
- /* move up */
- WM_keymap_add_item(keymap, "NLA_OT_move_up", PAGEUPKEY, KM_PRESS, 0, 0);
- /* move down */
- WM_keymap_add_item(keymap, "NLA_OT_move_down", PAGEDOWNKEY, KM_PRESS, 0, 0);
-
- /* apply scale */
- WM_keymap_add_item(keymap, "NLA_OT_apply_scale", AKEY, KM_PRESS, KM_CTRL, 0);
- /* clear scale */
- WM_keymap_add_item(keymap, "NLA_OT_clear_scale", SKEY, KM_PRESS, KM_ALT, 0);
-
- /* snap */
- WM_keymap_add_item(keymap, "NLA_OT_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* add f-modifier */
- WM_keymap_add_item(keymap, "NLA_OT_fmodifier_add", MKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
-
- /* transform system */
- transform_keymap_for_space(keyconf, keymap, SPACE_NLA);
-
- /* special markers hotkeys for anim editors: see note in definition of this function */
- ED_marker_keymap_animedit_conflictfree(keymap);
-}
-
-/* --------------- */
-
void nla_keymap(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap;
- wmKeyMapItem *kmi;
-
/* keymap for all regions ------------------------------------------- */
- keymap = WM_keymap_ensure(keyconf, "NLA Generic", SPACE_NLA, 0);
-
- /* region management */
- WM_keymap_add_item(keymap, "NLA_OT_properties", NKEY, KM_PRESS, 0, 0);
-
- /* tweakmode
- * - enter and exit are separate operators with the same hotkey...
- * This works as they use different poll()'s
- */
- WM_keymap_add_item(keymap, "NLA_OT_tweakmode_enter", TABKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "NLA_OT_tweakmode_exit", TABKEY, KM_PRESS, 0, 0);
-
- /* tweakmode for stashed actions
- * - similar to normal tweakmode, except we mark the tracks as being "solo"
- * too so that the action can be edited in isolation
- */
- kmi = WM_keymap_add_item(keymap, "NLA_OT_tweakmode_enter", TABKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "isolate_action", true);
-
- kmi = WM_keymap_add_item(keymap, "NLA_OT_tweakmode_exit", TABKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "isolate_action", true);
-
- /* find (i.e. a shortcut for setting the name filter) */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_find", FKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_ensure(keyconf, "NLA Generic", SPACE_NLA, 0);
/* channels ---------------------------------------------------------- */
/* Channels are not directly handled by the NLA Editor module, but are inherited from the Animation module.
@@ -346,10 +184,8 @@ void nla_keymap(wmKeyConfig *keyconf)
*
* However, those operations which involve clicking on channels and/or the placement of them in the view are implemented here instead
*/
- keymap = WM_keymap_ensure(keyconf, "NLA Channels", SPACE_NLA, 0);
- nla_keymap_channels(keymap);
+ WM_keymap_ensure(keyconf, "NLA Channels", SPACE_NLA, 0);
/* data ------------------------------------------------------------- */
- keymap = WM_keymap_ensure(keyconf, "NLA Editor", SPACE_NLA, 0);
- nla_keymap_main(keyconf, keymap);
+ WM_keymap_ensure(keyconf, "NLA Editor", SPACE_NLA, 0);
}
diff --git a/source/blender/editors/space_nla/nla_select.c b/source/blender/editors/space_nla/nla_select.c
index 6d03354c165..0df5df2f31d 100644
--- a/source/blender/editors/space_nla/nla_select.c
+++ b/source/blender/editors/space_nla/nla_select.c
@@ -211,7 +211,7 @@ void NLA_OT_select_all(wmOperatorType *ot)
WM_operator_properties_select_all(ot);
}
-/* ******************** Border Select Operator **************************** */
+/* ******************** Box Select Operator **************************** */
/* This operator currently works in one of three ways:
* -> BKEY - 1) all strips within region are selected (NLAEDIT_BORDERSEL_ALLSTRIPS)
* -> ALT-BKEY - depending on which axis of the region was larger...
@@ -219,15 +219,15 @@ void NLA_OT_select_all(wmOperatorType *ot)
* -> 3) y-axis, so select all frames within channels that region included (NLAEDIT_BORDERSEL_CHANNELS)
*/
-/* defines for borderselect mode */
+/* defines for box_select mode */
enum {
- NLA_BORDERSEL_ALLSTRIPS = 0,
- NLA_BORDERSEL_FRAMERANGE,
- NLA_BORDERSEL_CHANNELS,
-} /* eNLAEDIT_BorderSelect_Mode */;
+ NLA_BOXSEL_ALLSTRIPS = 0,
+ NLA_BOXSEL_FRAMERANGE,
+ NLA_BOXSEL_CHANNELS,
+} /* eNLAEDIT_BoxSelect_Mode */;
-static void borderselect_nla_strips(bAnimContext *ac, rcti rect, short mode, short selectmode)
+static void box_select_nla_strips(bAnimContext *ac, rcti rect, short mode, short selectmode)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
@@ -249,12 +249,12 @@ static void borderselect_nla_strips(bAnimContext *ac, rcti rect, short mode, sho
/* convert selection modes to selection modes */
selectmode = selmodes_to_flagmodes(selectmode);
- /* loop over data, doing border select */
+ /* loop over data, doing box select */
for (ale = anim_data.first; ale; ale = ale->next) {
ymin = ymax - NLACHANNEL_STEP(snla);
/* perform vertical suitability check (if applicable) */
- if ((mode == NLA_BORDERSEL_FRAMERANGE) ||
+ if ((mode == NLA_BOXSEL_FRAMERANGE) ||
!((ymax < rectf.ymin) || (ymin > rectf.ymax)))
{
/* loop over data selecting (only if NLA-Track) */
@@ -264,7 +264,7 @@ static void borderselect_nla_strips(bAnimContext *ac, rcti rect, short mode, sho
/* only select strips if they fall within the required ranges (if applicable) */
for (strip = nlt->strips.first; strip; strip = strip->next) {
- if ((mode == NLA_BORDERSEL_CHANNELS) ||
+ if ((mode == NLA_BOXSEL_CHANNELS) ||
BKE_nlastrip_within_bounds(strip, rectf.xmin, rectf.xmax))
{
/* set selection */
@@ -287,7 +287,7 @@ static void borderselect_nla_strips(bAnimContext *ac, rcti rect, short mode, sho
/* ------------------- */
-static int nlaedit_borderselect_exec(bContext *C, wmOperator *op)
+static int nlaedit_box_select_exec(bContext *C, wmOperator *op)
{
bAnimContext ac;
rcti rect;
@@ -314,7 +314,7 @@ static int nlaedit_borderselect_exec(bContext *C, wmOperator *op)
selectmode = SELECT_SUBTRACT;
}
- /* selection 'mode' depends on whether borderselect region only matters on one axis */
+ /* selection 'mode' depends on whether box_select region only matters on one axis */
if (RNA_boolean_get(op->ptr, "axis_range")) {
/* mode depends on which axis of the range is larger to determine which axis to use
* - checking this in region-space is fine, as it's fundamentally still going to be a different rect size
@@ -322,15 +322,15 @@ static int nlaedit_borderselect_exec(bContext *C, wmOperator *op)
* used for tweaking timing when "blocking", while channels is not that useful...
*/
if (BLI_rcti_size_x(&rect) >= BLI_rcti_size_y(&rect))
- mode = NLA_BORDERSEL_FRAMERANGE;
+ mode = NLA_BOXSEL_FRAMERANGE;
else
- mode = NLA_BORDERSEL_CHANNELS;
+ mode = NLA_BOXSEL_CHANNELS;
}
else
- mode = NLA_BORDERSEL_ALLSTRIPS;
+ mode = NLA_BOXSEL_ALLSTRIPS;
- /* apply borderselect action */
- borderselect_nla_strips(&ac, rect, mode, selectmode);
+ /* apply box_select action */
+ box_select_nla_strips(&ac, rect, mode, selectmode);
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_SELECTED, NULL);
@@ -338,18 +338,18 @@ static int nlaedit_borderselect_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void NLA_OT_select_border(wmOperatorType *ot)
+void NLA_OT_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
- ot->idname = "NLA_OT_select_border";
+ ot->name = "Box Select";
+ ot->idname = "NLA_OT_select_box";
ot->description = "Use box selection to grab NLA-Strips";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
- ot->exec = nlaedit_borderselect_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = nlaedit_box_select_exec;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = nlaop_poll_tweakmode_off;
@@ -357,7 +357,7 @@ void NLA_OT_select_border(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* rna */
- WM_operator_properties_gesture_border_select(ot);
+ WM_operator_properties_gesture_box_select(ot);
RNA_def_boolean(ot->srna, "axis_range", 0, "Axis Range", "");
}
@@ -559,7 +559,7 @@ static void mouse_nla_strips(bContext *C, bAnimContext *ac, const int mval[2], s
return;
}
else {
- /* found some channel - we only really should do somethign when its an Nla-Track */
+ /* found some channel - we only really should do something when its an Nla-Track */
if (ale->type == ANIMTYPE_NLATRACK) {
NlaTrack *nlt = (NlaTrack *)ale->data;
diff --git a/source/blender/editors/space_nla/space_nla.c b/source/blender/editors/space_nla/space_nla.c
index bf9aa090b94..d72014901a6 100644
--- a/source/blender/editors/space_nla/space_nla.c
+++ b/source/blender/editors/space_nla/space_nla.c
@@ -246,7 +246,7 @@ static void nla_channel_region_draw(const bContext *C, ARegion *ar)
UI_view2d_view_restore(C);
/* scrollers */
- scrollers = UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
+ scrollers = UI_view2d_scrollers_calc(C, v2d, NULL, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);
}
@@ -325,7 +325,7 @@ static void nla_main_region_draw(const bContext *C, ARegion *ar)
UI_view2d_view_restore(C);
/* scrollers */
- scrollers = UI_view2d_scrollers_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
+ scrollers = UI_view2d_scrollers_calc(C, v2d, NULL, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 2634b3108fa..65170c7c203 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -658,7 +658,7 @@ static void node_buts_image_user(uiLayout *layout, bContext *C, PointerRNA *ptr,
/* Image *ima = imaptr->data; */ /* UNUSED */
char numstr[32];
- const int framenr = BKE_image_user_frame_get(iuser, CFRA, 0, NULL);
+ const int framenr = BKE_image_user_frame_get(iuser, CFRA, NULL);
BLI_snprintf(numstr, sizeof(numstr), IFACE_("Frame: %d"), framenr);
uiItemL(layout, numstr, ICON_NONE);
}
@@ -1786,7 +1786,7 @@ static void node_composit_buts_file_output_ex(uiLayout *layout, bContext *C, Poi
uiItemS(layout);
- uiItemO(layout, IFACE_("Add Input"), ICON_ZOOMIN, "NODE_OT_output_file_add_socket");
+ uiItemO(layout, IFACE_("Add Input"), ICON_ADD, "NODE_OT_output_file_add_socket");
row = uiLayoutRow(layout, false);
col = uiLayoutColumn(row, true);
@@ -1795,13 +1795,13 @@ static void node_composit_buts_file_output_ex(uiLayout *layout, bContext *C, Poi
/* using different collection properties if multilayer format is enabled */
if (multilayer) {
uiTemplateList(col, C, "UI_UL_list", "file_output_node", ptr, "layer_slots", ptr, "active_input_index",
- NULL, 0, 0, 0, 0);
+ NULL, 0, 0, 0, 0, false);
RNA_property_collection_lookup_int(ptr, RNA_struct_find_property(ptr, "layer_slots"),
active_index, &active_input_ptr);
}
else {
uiTemplateList(col, C, "UI_UL_list", "file_output_node", ptr, "file_slots", ptr, "active_input_index",
- NULL, 0, 0, 0, 0);
+ NULL, 0, 0, 0, 0, false);
RNA_property_collection_lookup_int(ptr, RNA_struct_find_property(ptr, "file_slots"),
active_index, &active_input_ptr);
}
@@ -2340,7 +2340,6 @@ static void node_composit_buts_mask(uiLayout *layout, bContext *C, PointerRNA *p
bNode *node = ptr->data;
uiTemplateID(layout, C, ptr, "mask", NULL, NULL, NULL, UI_TEMPLATE_ID_FILTER_ALL, false);
- uiItemR(layout, ptr, "use_antialiasing", 0, NULL, ICON_NONE);
uiItemR(layout, ptr, "use_feather", 0, NULL, ICON_NONE);
uiItemR(layout, ptr, "size_source", 0, "", ICON_NONE);
@@ -2496,8 +2495,8 @@ static void node_composit_buts_cryptomatte(uiLayout *layout, bContext *UNUSED(C)
static void node_composit_buts_cryptomatte_ex(uiLayout *layout, bContext *UNUSED(C), PointerRNA *UNUSED(ptr))
{
- uiItemO(layout, IFACE_("Add Crypto Layer"), ICON_ZOOMIN, "NODE_OT_cryptomatte_layer_add");
- uiItemO(layout, IFACE_("Remove Crypto Layer"), ICON_ZOOMOUT, "NODE_OT_cryptomatte_layer_remove");
+ uiItemO(layout, IFACE_("Add Crypto Layer"), ICON_ADD, "NODE_OT_cryptomatte_layer_add");
+ uiItemO(layout, IFACE_("Remove Crypto Layer"), ICON_REMOVE, "NODE_OT_cryptomatte_layer_remove");
}
static void node_composit_buts_brightcontrast(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -3008,9 +3007,9 @@ void ED_node_init_butfuncs(void)
NODE_TYPES_END
/* tree type icons */
- ntreeType_Composite->ui_icon = ICON_RENDERLAYERS;
- ntreeType_Shader->ui_icon = ICON_MATERIAL;
- ntreeType_Texture->ui_icon = ICON_TEXTURE;
+ ntreeType_Composite->ui_icon = ICON_NODE_COMPOSITING;
+ ntreeType_Shader->ui_icon = ICON_NODE_MATERIAL;
+ ntreeType_Texture->ui_icon = ICON_NODE_TEXTURE;
}
void ED_init_custom_node_type(bNodeType *ntype)
diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c
index c2efc548c30..0a913bcbea8 100644
--- a/source/blender/editors/space_node/node_buttons.c
+++ b/source/blender/editors/space_node/node_buttons.c
@@ -150,14 +150,14 @@ static void node_tree_interface_panel(const bContext *C, Panel *pa)
ot = WM_operatortype_find("NODE_OT_tree_socket_add", false);
uiItemL(col, IFACE_("Inputs:"), ICON_NONE);
uiTemplateList(col, (bContext *)C, "NODE_UL_interface_sockets", "inputs", &ptr, "inputs", &ptr, "active_input",
- NULL, 0, 0, 0, 0);
+ NULL, 0, 0, 0, 0, false);
uiItemFullO_ptr(col, ot, "", ICON_PLUS, NULL, WM_OP_EXEC_DEFAULT, 0, &opptr);
RNA_enum_set(&opptr, "in_out", SOCK_IN);
col = uiLayoutColumn(split, true);
uiItemL(col, IFACE_("Outputs:"), ICON_NONE);
uiTemplateList(col, (bContext *)C, "NODE_UL_interface_sockets", "outputs", &ptr, "outputs", &ptr, "active_output",
- NULL, 0, 0, 0, 0);
+ NULL, 0, 0, 0, 0, false);
uiItemFullO_ptr(col, ot, "", ICON_PLUS, NULL, WM_OP_EXEC_DEFAULT, 0, &opptr);
RNA_enum_set(&opptr, "in_out", SOCK_OUT);
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index bba46771674..f00b745a317 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -638,7 +638,7 @@ static void node_socket_circle_draw(const bContext *C, bNodeTree *ntree, Pointer
RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr);
sock->typeinfo->draw_color((bContext *)C, &ptr, &node_ptr, color);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, sock->locx, sock->locy);
}
@@ -1460,7 +1460,7 @@ void drawnodespace(const bContext *C, ARegion *ar)
draw_tree_path(snode);
/* scrollers */
- scrollers = UI_view2d_scrollers_calc(C, v2d, 10, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
+ scrollers = UI_view2d_scrollers_calc(C, v2d, NULL, 10, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);
}
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index edab76cd7e1..aca87261da8 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -676,7 +676,7 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node)
if (was_output == 0)
ED_node_tag_update_nodetree(bmain, ntree, node);
- /* addnode() doesnt link this yet... */
+ /* addnode() doesn't link this yet... */
node->id = (ID *)BKE_image_verify_viewer(bmain, IMA_TYPE_COMPOSITE, "Viewer Node");
}
else if (node->type == CMP_NODE_COMPOSITE) {
@@ -2509,17 +2509,17 @@ void NODE_OT_viewer_border(wmOperatorType *ot)
ot->idname = "NODE_OT_viewer_border";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
+ ot->invoke = WM_gesture_box_invoke;
ot->exec = viewer_border_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = composite_node_active;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* properties */
- WM_operator_properties_gesture_border_select(ot);
+ WM_operator_properties_gesture_box_select(ot);
}
static int clear_viewer_border_exec(bContext *C, wmOperator *UNUSED(op))
diff --git a/source/blender/editors/space_node/node_gizmo.c b/source/blender/editors/space_node/node_gizmo.c
index b265d95c06a..6778ba8fb04 100644
--- a/source/blender/editors/space_node/node_gizmo.c
+++ b/source/blender/editors/space_node/node_gizmo.c
@@ -431,10 +431,10 @@ static void WIDGETGROUP_node_sbeam_setup(const bContext *UNUSED(C), wmGizmoGroup
{
struct NodeSunBeamsWidgetGroup *sbeam_group = MEM_mallocN(sizeof(struct NodeSunBeamsWidgetGroup), __func__);
- sbeam_group->gizmo = WM_gizmo_new("GIZMO_GT_grab_3d", gzgroup, NULL);
+ sbeam_group->gizmo = WM_gizmo_new("GIZMO_GT_move_3d", gzgroup, NULL);
wmGizmo *gz = sbeam_group->gizmo;
- RNA_enum_set(gz->ptr, "draw_style", ED_GIZMO_GRAB_STYLE_CROSS_2D);
+ RNA_enum_set(gz->ptr, "draw_style", ED_GIZMO_MOVE_STYLE_CROSS_2D);
gz->scale_basis = 0.05f;
@@ -535,13 +535,13 @@ static bool WIDGETGROUP_node_corner_pin_poll(const bContext *C, wmGizmoGroupType
static void WIDGETGROUP_node_corner_pin_setup(const bContext *UNUSED(C), wmGizmoGroup *gzgroup)
{
struct NodeCornerPinWidgetGroup *cpin_group = MEM_mallocN(sizeof(struct NodeCornerPinWidgetGroup), __func__);
- const wmGizmoType *gzt_grab_3d = WM_gizmotype_find("GIZMO_GT_grab_3d", false);
+ const wmGizmoType *gzt_move_3d = WM_gizmotype_find("GIZMO_GT_move_3d", false);
for (int i = 0; i < 4; i++) {
- cpin_group->gizmos[i] = WM_gizmo_new_ptr(gzt_grab_3d, gzgroup, NULL);
+ cpin_group->gizmos[i] = WM_gizmo_new_ptr(gzt_move_3d, gzgroup, NULL);
wmGizmo *gz = cpin_group->gizmos[i];
- RNA_enum_set(gz->ptr, "draw_style", ED_GIZMO_GRAB_STYLE_CROSS_2D);
+ RNA_enum_set(gz->ptr, "draw_style", ED_GIZMO_MOVE_STYLE_CROSS_2D);
gz->scale_basis = 0.01f;
}
diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h
index 3644c8d09e6..3407c17bc67 100644
--- a/source/blender/editors/space_node/node_intern.h
+++ b/source/blender/editors/space_node/node_intern.h
@@ -111,7 +111,7 @@ void NODE_OT_select(struct wmOperatorType *ot);
void NODE_OT_select_all(struct wmOperatorType *ot);
void NODE_OT_select_linked_to(struct wmOperatorType *ot);
void NODE_OT_select_linked_from(struct wmOperatorType *ot);
-void NODE_OT_select_border(struct wmOperatorType *ot);
+void NODE_OT_select_box(struct wmOperatorType *ot);
void NODE_OT_select_circle(struct wmOperatorType *ot);
void NODE_OT_select_lasso(struct wmOperatorType *ot);
void NODE_OT_select_grouped(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c
index 759b157b3f8..1eead941c97 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -56,7 +56,7 @@ void node_operatortypes(void)
WM_operatortype_append(NODE_OT_select_all);
WM_operatortype_append(NODE_OT_select_linked_to);
WM_operatortype_append(NODE_OT_select_linked_from);
- WM_operatortype_append(NODE_OT_select_border);
+ WM_operatortype_append(NODE_OT_select_box);
WM_operatortype_append(NODE_OT_select_circle);
WM_operatortype_append(NODE_OT_select_lasso);
WM_operatortype_append(NODE_OT_select_grouped);
@@ -202,159 +202,11 @@ void ED_operatormacros_node(void)
WM_operatortype_macro_define(ot, "NODE_OT_translate_attach");
}
-/* helper function for repetitive select operator keymap */
-static void node_select_keymap(wmKeyMap *keymap, int extend)
-{
- /* modifier combinations */
- const int mod_single[] = { 0, KM_CTRL, KM_ALT, KM_CTRL | KM_ALT,
- -1 /* terminator */
- };
- const int mod_extend[] = { KM_SHIFT, KM_SHIFT | KM_CTRL,
- KM_SHIFT | KM_ALT, KM_SHIFT | KM_CTRL | KM_ALT,
- -1 /* terminator */
- };
- const int *mod = (extend ? mod_extend : mod_single);
- wmKeyMapItem *kmi;
- int i;
-
- for (i = 0; mod[i] >= 0; ++i) {
- kmi = WM_keymap_add_item(keymap, "NODE_OT_select", ACTIONMOUSE, KM_PRESS, mod[i], 0);
- RNA_boolean_set(kmi->ptr, "extend", extend);
- kmi = WM_keymap_add_item(keymap, "NODE_OT_select", SELECTMOUSE, KM_PRESS, mod[i], 0);
- RNA_boolean_set(kmi->ptr, "extend", extend);
- }
-}
-
void node_keymap(struct wmKeyConfig *keyconf)
{
- wmKeyMap *keymap;
- wmKeyMapItem *kmi;
-
/* Entire Editor only ----------------- */
- keymap = WM_keymap_ensure(keyconf, "Node Generic", SPACE_NODE, 0);
-
- WM_keymap_add_item(keymap, "NODE_OT_properties", NKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "NODE_OT_toolbar", TKEY, KM_PRESS, 0, 0);
+ WM_keymap_ensure(keyconf, "Node Generic", SPACE_NODE, 0);
/* Main Region only ----------------- */
- keymap = WM_keymap_ensure(keyconf, "Node Editor", SPACE_NODE, 0);
-
- /* mouse select in nodes used to be both keys, but perhaps this should be reduced?
- * NOTE: mouse-clicks on left-mouse will fall through to allow transform-tweak, but also link/resize
- * NOTE 2: socket select is part of the node select operator, to handle overlapping cases
- * NOTE 3: select op is registered for various combinations of modifier key, so the specialized
- * grab operators (unlink, attach, etc.) can work easily on single nodes.
- */
- node_select_keymap(keymap, false);
- node_select_keymap(keymap, true);
-
- kmi = WM_keymap_add_item(keymap, "NODE_OT_select_border", EVT_TWEAK_S, KM_ANY, 0, 0);
- RNA_boolean_set(kmi->ptr, "tweak", true);
-
- kmi = WM_keymap_add_item(keymap, "NODE_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- kmi = WM_keymap_add_item(keymap, "NODE_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_SHIFT | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", true);
-
- WM_keymap_add_item(keymap, "NODE_OT_select_circle", CKEY, KM_PRESS, 0, 0);
-
- /* each of these falls through if not handled... */
- kmi = WM_keymap_add_item(keymap, "NODE_OT_link", LEFTMOUSE, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "detach", false);
- kmi = WM_keymap_add_item(keymap, "NODE_OT_link", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "detach", true);
-
- WM_keymap_add_item(keymap, "NODE_OT_resize", LEFTMOUSE, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "NODE_OT_add_reroute", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "NODE_OT_links_cut", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "NODE_OT_select_link_viewer", LEFTMOUSE, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "NODE_OT_backimage_move", MIDDLEMOUSE, KM_PRESS, KM_ALT, 0);
- kmi = WM_keymap_add_item(keymap, "NODE_OT_backimage_zoom", VKEY, KM_PRESS, 0, 0);
- RNA_float_set(kmi->ptr, "factor", 0.83333f);
- kmi = WM_keymap_add_item(keymap, "NODE_OT_backimage_zoom", VKEY, KM_PRESS, KM_ALT, 0);
- RNA_float_set(kmi->ptr, "factor", 1.2f);
- WM_keymap_add_item(keymap, "NODE_OT_backimage_fit", HOMEKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "NODE_OT_backimage_sample", ACTIONMOUSE, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_menu(keymap, "NODE_MT_specials", WKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "NODE_OT_link_make", FKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "replace", false);
- kmi = WM_keymap_add_item(keymap, "NODE_OT_link_make", FKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "replace", true);
-
- WM_keymap_add_menu(keymap, "NODE_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "NODE_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
- /* modified operator call for duplicating with input links */
- WM_keymap_add_item(keymap, "NODE_OT_duplicate_move_keep_inputs", DKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "NODE_OT_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "NODE_OT_detach", PKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "NODE_OT_join", JKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "NODE_OT_hide_toggle", HKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "NODE_OT_mute_toggle", MKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "NODE_OT_preview_toggle", HKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "NODE_OT_hide_socket_toggle", HKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "NODE_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
-#ifdef WITH_INPUT_NDOF
- WM_keymap_add_item(keymap, "NODE_OT_view_all", NDOF_BUTTON_FIT, KM_PRESS, 0, 0);
-#endif
- WM_keymap_add_item(keymap, "NODE_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "NODE_OT_select_border", BKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "tweak", false);
-
- WM_keymap_add_item(keymap, "NODE_OT_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "NODE_OT_delete", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "NODE_OT_delete_reconnect", XKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "NODE_OT_delete_reconnect", DELKEY, KM_PRESS, KM_CTRL, 0);
-
- kmi = WM_keymap_add_item(keymap, "NODE_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "NODE_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "NODE_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- WM_keymap_add_item(keymap, "NODE_OT_select_linked_to", LKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "NODE_OT_select_linked_from", LKEY, KM_PRESS, 0, 0);
- kmi = WM_keymap_add_item(keymap, "NODE_OT_select_grouped", GKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- kmi = WM_keymap_add_item(keymap, "NODE_OT_select_grouped", GKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
-
- kmi = WM_keymap_add_item(keymap, "NODE_OT_select_same_type_step", RIGHTBRACKETKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "prev", false);
- kmi = WM_keymap_add_item(keymap, "NODE_OT_select_same_type_step", LEFTBRACKETKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "prev", true);
-
- WM_keymap_add_item(keymap, "NODE_OT_find_node", FKEY, KM_PRESS, KM_CTRL, 0);
-
- /* node group operators */
- WM_keymap_add_item(keymap, "NODE_OT_group_make", GKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "NODE_OT_group_ungroup", GKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- WM_keymap_add_item(keymap, "NODE_OT_group_separate", PKEY, KM_PRESS, 0, 0);
- kmi = WM_keymap_add_item(keymap, "NODE_OT_group_edit", TABKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "exit", false);
- kmi = WM_keymap_add_item(keymap, "NODE_OT_group_edit", TABKEY, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "exit", true);
-
- WM_keymap_add_item(keymap, "NODE_OT_read_viewlayers", RKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "NODE_OT_render_changed", ZKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "NODE_OT_clipboard_copy", CKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "NODE_OT_clipboard_paste", VKEY, KM_PRESS, KM_CTRL, 0);
-#ifdef __APPLE__
- WM_keymap_add_item(keymap, "NODE_OT_clipboard_copy", CKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "NODE_OT_clipboard_paste", VKEY, KM_PRESS, KM_OSKEY, 0);
-#endif
- WM_keymap_add_item(keymap, "NODE_OT_viewer_border", BKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "NODE_OT_clear_viewer_border", BKEY, KM_PRESS, KM_ALT | KM_CTRL, 0);
-
- transform_keymap_for_space(keyconf, keymap, SPACE_NODE);
+ WM_keymap_ensure(keyconf, "Node Editor", SPACE_NODE, 0);
}
diff --git a/source/blender/editors/space_node/node_relationships.c b/source/blender/editors/space_node/node_relationships.c
index c4cd59b65f4..8f3d3d8a4b3 100644
--- a/source/blender/editors/space_node/node_relationships.c
+++ b/source/blender/editors/space_node/node_relationships.c
@@ -1161,7 +1161,7 @@ static void node_join_attach_recursive(bNode *node, bNode *frame)
if (node->parent->done & NODE_JOIN_IS_DESCENDANT)
node->done |= NODE_JOIN_IS_DESCENDANT;
else if (node->flag & NODE_TEST) {
- /* if parent is not an decendant of the frame, reattach the node */
+ /* if parent is not an descendant of the frame, reattach the node */
nodeDetachNode(node);
nodeAttachNode(node, frame);
node->done |= NODE_JOIN_IS_DESCENDANT;
@@ -1327,7 +1327,7 @@ static void node_detach_recursive(bNode *node)
if (node->parent->done & NODE_DETACH_IS_DESCENDANT)
node->done |= NODE_DETACH_IS_DESCENDANT;
else if (node->flag & NODE_SELECT) {
- /* if parent is not a decendant of a selected node, detach */
+ /* if parent is not a descendant of a selected node, detach */
nodeDetachNode(node);
node->done |= NODE_DETACH_IS_DESCENDANT;
}
@@ -1590,7 +1590,7 @@ static void node_link_insert_offset_frame_chains(
/**
* Callback that applies NodeInsertOfsData.offset_x to a node or its parent,
- * considering the logic needed for offseting nodes after link insert
+ * considering the logic needed for offsetting nodes after link insert
*/
static bool node_link_insert_offset_chain_cb(
bNode *fromnode, bNode *tonode,
@@ -1648,7 +1648,7 @@ static void node_link_insert_offset_ntree(
/* insert->totr isn't updated yet, so totr_insert is used to get the correct worldspace coords */
node_to_updated_rect(insert, &totr_insert);
- /* frame attachement was't handled yet so we search the frame that the node will be attached to later */
+ /* frame attachment wasn't handled yet so we search the frame that the node will be attached to later */
insert->parent = node_find_frame_to_attach(ar, ntree, mouse_xy);
/* this makes sure nodes are also correctly offset when inserting a node on top of a frame
diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c
index ed119f34aa5..eb233f3fea1 100644
--- a/source/blender/editors/space_node/node_select.c
+++ b/source/blender/editors/space_node/node_select.c
@@ -517,9 +517,9 @@ void NODE_OT_select(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "extend", 0, "Extend", "");
}
-/* ****** Border Select ****** */
+/* ****** Box Select ****** */
-static int node_borderselect_exec(bContext *C, wmOperator *op)
+static int node_box_select_exec(bContext *C, wmOperator *op)
{
SpaceNode *snode = CTX_wm_space_node(C);
ARegion *ar = CTX_wm_region(C);
@@ -555,13 +555,13 @@ static int node_borderselect_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int node_border_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+static int node_box_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
const bool tweak = RNA_boolean_get(op->ptr, "tweak");
if (tweak) {
- /* prevent initiating the border select if the mouse is over a node */
- /* this allows border select on empty space, but drag-translate on nodes */
+ /* prevent initiating the box select if the mouse is over a node */
+ /* this allows box select on empty space, but drag-translate on nodes */
SpaceNode *snode = CTX_wm_space_node(C);
ARegion *ar = CTX_wm_region(C);
float mx, my;
@@ -572,21 +572,21 @@ static int node_border_select_invoke(bContext *C, wmOperator *op, const wmEvent
return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH;
}
- return WM_gesture_border_invoke(C, op, event);
+ return WM_gesture_box_invoke(C, op, event);
}
-void NODE_OT_select_border(wmOperatorType *ot)
+void NODE_OT_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
- ot->idname = "NODE_OT_select_border";
+ ot->name = "Box Select";
+ ot->idname = "NODE_OT_select_box";
ot->description = "Use box selection to select nodes";
/* api callbacks */
- ot->invoke = node_border_select_invoke;
- ot->exec = node_borderselect_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->invoke = node_box_select_invoke;
+ ot->exec = node_box_select_exec;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = ED_operator_node_active;
@@ -594,7 +594,7 @@ void NODE_OT_select_border(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* rna */
- WM_operator_properties_gesture_border_select(ot);
+ WM_operator_properties_gesture_box_select(ot);
RNA_def_boolean(ot->srna, "tweak", 0, "Tweak", "Only activate when mouse is not over a node - useful for tweak gesture");
}
@@ -1020,6 +1020,7 @@ static uiBlock *node_find_menu(bContext *C, ARegion *ar, void *arg_op)
block = UI_block_begin(C, ar, "_popup", UI_EMBOSS);
UI_block_flag_enable(block, UI_BLOCK_LOOP | UI_BLOCK_MOVEMOUSE_QUIT | UI_BLOCK_SEARCH_MENU);
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
but = uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, sizeof(search), 10, 10, 9 * UI_UNIT_X, UI_UNIT_Y, 0, 0, "");
UI_but_func_search_set(but, NULL, node_find_cb, op->type, node_find_call_cb, NULL);
diff --git a/source/blender/editors/space_node/node_templates.c b/source/blender/editors/space_node/node_templates.c
index 8667056a687..64c898cb628 100644
--- a/source/blender/editors/space_node/node_templates.c
+++ b/source/blender/editors/space_node/node_templates.c
@@ -218,20 +218,15 @@ static void node_socket_add_replace(const bContext *C, bNodeTree *ntree, bNode *
else if (!node_from) {
node_from = nodeAddStaticNode(C, ntree, type);
if (node_prev != NULL) {
- /* If we're replacing existing node, use it's location. */
+ /* If we're replacing existing node, use its location. */
node_from->locx = node_prev->locx;
node_from->locy = node_prev->locy;
node_from->offsetx = node_prev->offsetx;
node_from->offsety = node_prev->offsety;
}
else {
- /* Avoid exact intersection of nodes.
- * TODO(sergey): Still not ideal, but better than nothing.
- */
- int index = BLI_findindex(&node_to->inputs, sock_to);
- BLI_assert(index != -1);
- node_from->locx = node_to->locx - (node_from->typeinfo->width + 50);
- node_from->locy = node_to->locy - (node_from->typeinfo->height * index);
+ sock_from_tmp = BLI_findlink(&node_from->outputs, item->socket_index);
+ nodePositionRelative(node_from, node_to, sock_from_tmp, sock_to);
}
node_link_item_apply(bmain, node_from, item);
@@ -375,7 +370,7 @@ static void ui_node_link(bContext *C, void *arg_p, void *event_p)
bNode *node_to = arg->node;
bNodeSocket *sock_to = arg->sock;
bNodeTree *ntree = arg->ntree;
- int event = GET_INT_FROM_POINTER(event_p);
+ int event = POINTER_AS_INT(event_p);
if (event == UI_NODE_LINK_DISCONNECT)
node_socket_disconnect(bmain, ntree, node_to, sock_to);
@@ -573,11 +568,11 @@ static void ui_template_node_link_menu(bContext *C, uiLayout *layout, void *but_
but = uiDefBut(block, UI_BTYPE_BUT, 0, IFACE_("Remove"), 0, 0, UI_UNIT_X * 4, UI_UNIT_Y,
NULL, 0.0, 0.0, 0.0, 0.0, TIP_("Remove nodes connected to the input"));
- UI_but_funcN_set(but, ui_node_link, MEM_dupallocN(arg), SET_INT_IN_POINTER(UI_NODE_LINK_REMOVE));
+ UI_but_funcN_set(but, ui_node_link, MEM_dupallocN(arg), POINTER_FROM_INT(UI_NODE_LINK_REMOVE));
but = uiDefBut(block, UI_BTYPE_BUT, 0, IFACE_("Disconnect"), 0, 0, UI_UNIT_X * 4, UI_UNIT_Y,
NULL, 0.0, 0.0, 0.0, 0.0, TIP_("Disconnect nodes connected to the input"));
- UI_but_funcN_set(but, ui_node_link, MEM_dupallocN(arg), SET_INT_IN_POINTER(UI_NODE_LINK_DISCONNECT));
+ UI_but_funcN_set(but, ui_node_link, MEM_dupallocN(arg), POINTER_FROM_INT(UI_NODE_LINK_DISCONNECT));
}
ui_node_menu_column(arg, NODE_CLASS_GROUP, N_("Group"));
diff --git a/source/blender/editors/space_node/node_view.c b/source/blender/editors/space_node/node_view.c
index 00eab0c69c1..22df2586a7b 100644
--- a/source/blender/editors/space_node/node_view.c
+++ b/source/blender/editors/space_node/node_view.c
@@ -193,7 +193,7 @@ void NODE_OT_view_selected(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-/* **************** Backround Image Operators ************** */
+/* **************** Background Image Operators ************** */
typedef struct NodeViewMove {
int mvalo[2];
diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index 38bc1b6da8d..ba5703946c3 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -646,14 +646,6 @@ static void node_main_region_init(wmWindowManager *wm, ARegion *ar)
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
- /* gizmos stay in the background for now - quick patchjob to make sure nodes themselves work */
- if (ar->gizmo_map == NULL) {
- ar->gizmo_map = WM_gizmomap_new_from_type(
- &(const struct wmGizmoMapType_Params){SPACE_NODE, RGN_TYPE_WINDOW});
- }
-
- WM_gizmomap_add_handlers(ar, ar->gizmo_map);
-
/* own keymaps */
keymap = WM_keymap_ensure(wm->defaultconf, "Node Generic", SPACE_NODE, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
@@ -987,6 +979,7 @@ void ED_spacetype_node(void)
/* regions: main window */
art = MEM_callocN(sizeof(ARegionType), "spacetype node region");
art->regionid = RGN_TYPE_WINDOW;
+ art->keymapflag = ED_KEYMAP_GIZMO;
art->init = node_main_region_init;
art->draw = node_main_region_draw;
art->listener = node_region_listener;
diff --git a/source/blender/editors/space_outliner/outliner_collections.c b/source/blender/editors/space_outliner/outliner_collections.c
index 34128942382..460ba8b89fb 100644
--- a/source/blender/editors/space_outliner/outliner_collections.c
+++ b/source/blender/editors/space_outliner/outliner_collections.c
@@ -35,6 +35,7 @@
#include "BKE_context.h"
#include "BKE_collection.h"
#include "BKE_layer.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_report.h"
@@ -81,7 +82,7 @@ Collection *outliner_collection_from_tree_element(const TreeElement *te)
TreeStoreElem *tselem = TREESTORE(te);
if (!tselem) {
- return false;
+ return NULL;
}
if (tselem->type == TSE_LAYER_COLLECTION) {
@@ -226,7 +227,7 @@ void OUTLINER_OT_collection_new(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* properties */
- PropertyRNA *prop = RNA_def_boolean(ot->srna, "nested", true, "Nested", "Add as child of selected collection");;
+ PropertyRNA *prop = RNA_def_boolean(ot->srna, "nested", true, "Nested", "Add as child of selected collection");
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
@@ -248,7 +249,7 @@ static TreeTraversalAction collection_find_data_to_edit(TreeElement *te, void *c
}
if (collection == BKE_collection_master(data->scene)) {
- /* skip - showing warning/error message might be missleading
+ /* skip - showing warning/error message might be misleading
* when deleting multiple collections, so just do nothing */
}
else {
@@ -557,7 +558,7 @@ static int collection_instance_exec(bContext *C, wmOperator *UNUSED(op))
/* Effectively instance the collections. */
GSET_ITER(collections_to_edit_iter, data.collections_to_edit) {
Collection *collection = BLI_gsetIterator_getKey(&collections_to_edit_iter);
- Object *ob = ED_object_add_type(C, OB_EMPTY, collection->id.name + 2, scene->cursor.location, NULL, false, scene->layact);
+ Object *ob = ED_object_add_type(C, OB_EMPTY, collection->id.name + 2, scene->cursor.location, NULL, false);
ob->dup_group = collection;
ob->transflag |= OB_DUPLICOLLECTION;
id_lib_extern(&collection->id);
@@ -601,7 +602,7 @@ static TreeTraversalAction layer_collection_find_data_to_edit(TreeElement *te, v
LayerCollection *lc = te->directdata;
if (lc->collection->flag & COLLECTION_IS_MASTER) {
- /* skip - showing warning/error message might be missleading
+ /* skip - showing warning/error message might be misleading
* when deleting multiple collections, so just do nothing */
}
else {
diff --git a/source/blender/editors/space_outliner/outliner_dragdrop.c b/source/blender/editors/space_outliner/outliner_dragdrop.c
index 60f02dd9529..2217048aca7 100644
--- a/source/blender/editors/space_outliner/outliner_dragdrop.c
+++ b/source/blender/editors/space_outliner/outliner_dragdrop.c
@@ -46,8 +46,10 @@
#include "BKE_collection.h"
#include "BKE_context.h"
#include "BKE_layer.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_material.h"
+#include "BKE_object.h"
#include "BKE_report.h"
#include "BKE_scene.h"
@@ -192,83 +194,113 @@ static TreeElement *outliner_drop_insert_find(
}
}
+static Collection *outliner_collection_from_tree_element_and_parents(TreeElement *te, TreeElement **r_te)
+{
+ while (te != NULL) {
+ Collection *collection = outliner_collection_from_tree_element(te);
+ if (collection) {
+ *r_te = te;
+ return collection;
+ }
+ te = te->parent;
+ }
+ return NULL;
+}
+
static TreeElement *outliner_drop_insert_collection_find(
bContext *C, const wmEvent *event,
TreeElementInsertType *r_insert_type)
{
TreeElement *te = outliner_drop_insert_find(C, event, r_insert_type);
- if (!te) {
- return NULL;
- }
+ if (!te) return NULL;
- Collection *collection = outliner_collection_from_tree_element(te);
- if (!collection) {
- return NULL;
+ TreeElement *collection_te;
+ Collection *collection = outliner_collection_from_tree_element_and_parents(te, &collection_te);
+ if (!collection) return NULL;
+
+ if (collection_te != te) {
+ *r_insert_type = TE_INSERT_INTO;
}
- /* We can't insert/before after master collection. */
+ /* We can't insert before/after master collection. */
if (collection->flag & COLLECTION_IS_MASTER) {
- if (*r_insert_type == TE_INSERT_BEFORE) {
- /* can't go higher than master collection, insert into it */
- *r_insert_type = TE_INSERT_INTO;
- }
- else if (*r_insert_type == TE_INSERT_AFTER) {
- te = te->subtree.last;
- collection = outliner_collection_from_tree_element(te);
- if (!collection) {
- return NULL;
- }
- }
+ *r_insert_type = TE_INSERT_INTO;
}
- return te;
+ return collection_te;
}
/* ******************** Parent Drop Operator *********************** */
-static bool parent_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event, const char **UNUSED(tooltip))
+static bool parent_drop_allowed(SpaceOops *soops, TreeElement *te, Object *potential_child)
{
- SpaceOops *soops = CTX_wm_space_outliner(C);
- Object *ob = (Object *)WM_drag_ID(drag, ID_OB);
- if (!ob) {
+ TreeStoreElem *tselem = TREESTORE(te);
+ if (te->idcode != ID_OB || tselem->type != 0) {
return false;
}
- /* Ensure item under cursor is valid drop target */
- TreeElement *te = outliner_drop_find(C, event);
- TreeStoreElem *tselem = te ? TREESTORE(te) : NULL;
+ Object *potential_parent = (Object *)tselem->id;
- if (!te) {
- /* pass */
+ if (potential_parent == potential_child) return false;
+ if (BKE_object_is_child_recursive(potential_child, potential_parent)) return false;
+ if (potential_parent == potential_child->parent) return false;
+
+ /* check that parent/child are both in the same scene */
+ Scene *scene = (Scene *)outliner_search_back(soops, te, ID_SCE);
+
+ /* currently outliner organized in a way that if there's no parent scene
+ * element for object it means that all displayed objects belong to
+ * active scene and parenting them is allowed (sergey)
+ */
+ if (scene) {
+ for (ViewLayer *view_layer = scene->view_layers.first;
+ view_layer;
+ view_layer = view_layer->next)
+ {
+ if (BKE_view_layer_base_find(view_layer, potential_child)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ else {
+ return true;
}
- else if (te->idcode == ID_OB && tselem->type == 0) {
- Scene *scene;
- ID *te_id = tselem->id;
+}
- /* check if dropping self or parent */
- if (te_id == &ob->id || (Object *)te_id == ob->parent)
+static bool allow_parenting_without_modifier_key(SpaceOops *soops)
+{
+ switch (soops->outlinevis) {
+ case SO_VIEW_LAYER:
+ return soops->filter & SO_FILTER_NO_COLLECTION;
+ case SO_SCENES:
+ return true;
+ default:
return false;
+ }
+}
- /* check that parent/child are both in the same scene */
- scene = (Scene *)outliner_search_back(soops, te, ID_SCE);
+static bool parent_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event, const char **UNUSED(tooltip))
+{
+ SpaceOops *soops = CTX_wm_space_outliner(C);
- /* currently outliner organized in a way that if there's no parent scene
- * element for object it means that all displayed objects belong to
- * active scene and parenting them is allowed (sergey)
- */
- if (!scene) {
- return true;
- }
- else {
- for (ViewLayer *view_layer = scene->view_layers.first;
- view_layer;
- view_layer = view_layer->next)
- {
- if (BKE_view_layer_base_find(view_layer, ob)) {
- return true;
- }
- }
- }
+ bool changed = outliner_flag_set(&soops->tree, TSE_DRAG_ANY, false);
+ if (changed) ED_region_tag_redraw_no_rebuild(CTX_wm_region(C));
+
+ Object *potential_child = (Object *)WM_drag_ID(drag, ID_OB);
+ if (!potential_child) return false;
+
+ if (!allow_parenting_without_modifier_key(soops)) {
+ if (!event->shift) return false;
+ }
+
+ TreeElement *te = outliner_drop_find(C, event);
+ if (!te) return false;
+
+ if (parent_drop_allowed(soops, te, potential_child)) {
+ TREESTORE(te)->flag |= TSE_DRAG_INTO;
+ ED_region_tag_redraw_no_rebuild(CTX_wm_region(C));
+ return true;
}
return false;
@@ -280,7 +312,7 @@ static int parent_drop_exec(bContext *C, wmOperator *op)
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
int partype = -1;
- char parname[MAX_ID_NAME], childname[MAX_ID_NAME];
+ char parname[MAX_NAME], childname[MAX_NAME];
partype = RNA_enum_get(op->ptr, "type");
RNA_string_get(op->ptr, "parent", parname);
@@ -327,10 +359,10 @@ static int parent_drop_invoke(bContext *C, wmOperator *op, const wmEvent *event)
return OPERATOR_CANCELLED;
}
- char childname[MAX_ID_NAME];
- char parname[MAX_ID_NAME];
- STRNCPY(childname, ob->id.name);
- STRNCPY(parname, par->id.name);
+ char childname[MAX_NAME];
+ char parname[MAX_NAME];
+ STRNCPY(childname, ob->id.name + 2);
+ STRNCPY(parname, par->id.name + 2);
RNA_string_set(op->ptr, "child", childname);
RNA_string_set(op->ptr, "parent", parname);
@@ -441,57 +473,43 @@ void OUTLINER_OT_parent_drop(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
/* properties */
- RNA_def_string(ot->srna, "child", "Object", MAX_ID_NAME, "Child", "Child Object");
- RNA_def_string(ot->srna, "parent", "Object", MAX_ID_NAME, "Parent", "Parent Object");
+ RNA_def_string(ot->srna, "child", "Object", MAX_NAME, "Child", "Child Object");
+ RNA_def_string(ot->srna, "parent", "Object", MAX_NAME, "Parent", "Parent Object");
RNA_def_enum(ot->srna, "type", prop_make_parent_types, 0, "Type", "");
}
-static bool parenting_poll(bContext *C)
-{
- SpaceOops *soops = CTX_wm_space_outliner(C);
-
- if (soops) {
- if (soops->outlinevis == SO_SCENES) {
- return true;
- }
- else if ((soops->outlinevis == SO_VIEW_LAYER) &&
- (soops->filter & SO_FILTER_NO_COLLECTION))
- {
- return true;
- }
- }
-
- return false;
-}
-
/* ******************** Parent Clear Operator *********************** */
static bool parent_clear_poll(bContext *C, wmDrag *drag, const wmEvent *event, const char **UNUSED(tooltip))
{
SpaceOops *soops = CTX_wm_space_outliner(C);
- if (!ELEM(soops->outlinevis, SO_VIEW_LAYER)) {
- return false;
+ if (!allow_parenting_without_modifier_key(soops)) {
+ if (!event->shift) return false;
}
Object *ob = (Object *)WM_drag_ID(drag, ID_OB);
- if (!(ob && ob->parent)) {
- return false;
- }
+ if (!ob) return false;
+ if (!ob->parent) return false;
TreeElement *te = outliner_drop_find(C, event);
if (te) {
TreeStoreElem *tselem = TREESTORE(te);
+ ID *id = tselem->id;
+ if (!id) return true;
- switch (te->idcode) {
- case ID_SCE:
- return (ELEM(tselem->type, TSE_R_LAYER_BASE, TSE_R_LAYER));
+ switch (GS(id->name)) {
case ID_OB:
- return (ELEM(tselem->type, TSE_MODIFIER_BASE, TSE_CONSTRAINT_BASE));
- /* Other codes to ignore? */
+ return ELEM(tselem->type, TSE_MODIFIER_BASE, TSE_CONSTRAINT_BASE);
+ case ID_GR:
+ return event->shift;
+ default:
+ return true;
}
}
- return (te == NULL);
+ else {
+ return true;
+ }
}
static int parent_clear_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
@@ -521,7 +539,7 @@ void OUTLINER_OT_parent_clear(wmOperatorType *ot)
/* api callbacks */
ot->invoke = parent_clear_invoke;
- ot->poll = parenting_poll;
+ ot->poll = ED_operator_outliner_active;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
@@ -665,6 +683,8 @@ static Collection *collection_parent_from_ID(ID *id)
static bool collection_drop_init(bContext *C, wmDrag *drag, const wmEvent *event, CollectionDrop *data)
{
+ SpaceOops *soops = CTX_wm_space_outliner(C);
+
/* Get collection to drop into. */
TreeElementInsertType insert_type;
TreeElement *te = outliner_drop_insert_collection_find(C, event, &insert_type);
@@ -695,7 +715,7 @@ static bool collection_drop_init(bContext *C, wmDrag *drag, const wmEvent *event
/* Get collection to drag out of. */
ID *parent = drag_id->from_parent;
Collection *from_collection = collection_parent_from_ID(parent);
- if (event->ctrl) {
+ if (event->ctrl || soops->outlinevis == SO_SCENES) {
from_collection = NULL;
}
@@ -724,14 +744,15 @@ static bool collection_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event
bool changed = outliner_flag_set(&soops->tree, TSE_HIGHLIGHTED | TSE_DRAG_ANY, false);
CollectionDrop data;
- if (collection_drop_init(C, drag, event, &data)) {
+ if (!event->shift && collection_drop_init(C, drag, event, &data)) {
+ TreeElement *te = data.te;
+ TreeStoreElem *tselem = TREESTORE(te);
if (!data.from || event->ctrl) {
+ tselem->flag |= TSE_DRAG_INTO;
+ changed = true;
*tooltip = IFACE_("Link inside Collection");
}
else {
- TreeElement *te = data.te;
- TreeStoreElem *tselem = TREESTORE(te);
-
switch (data.insert_type) {
case TE_INSERT_BEFORE:
tselem->flag |= TSE_DRAG_BEFORE;
@@ -756,17 +777,17 @@ static bool collection_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event
case TE_INSERT_INTO:
tselem->flag |= TSE_DRAG_INTO;
changed = true;
- *tooltip = TIP_("Move inside collection (Ctrl to link)");
+ *tooltip = TIP_("Move inside collection (Ctrl to link, Shift to parent)");
break;
}
}
+ if (changed) ED_region_tag_redraw_no_rebuild(ar);
+ return true;
}
-
- if (changed) {
- ED_region_tag_redraw_no_rebuild(ar);
+ else {
+ if (changed) ED_region_tag_redraw_no_rebuild(ar);
+ return false;
}
-
- return true;
}
static int collection_drop_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
@@ -804,6 +825,10 @@ static int collection_drop_invoke(bContext *C, wmOperator *UNUSED(op), const wmE
return OPERATOR_CANCELLED;
}
+ if (BKE_collection_is_empty(data.to)) {
+ TREESTORE(data.te)->flag &= ~TSE_CLOSED;
+ }
+
for (wmDragID *drag_id = drag->ids.first; drag_id; drag_id = drag_id->next) {
/* Ctrl enables linking, so we don't need a from collection then. */
Collection *from = (event->ctrl) ? NULL : collection_parent_from_ID(drag_id->from_parent);
@@ -885,7 +910,12 @@ static int outliner_item_drag_drop_invoke(bContext *C, wmOperator *UNUSED(op), c
if (ELEM(GS(data.drag_id->name), ID_OB, ID_GR)) {
/* For collections and objects we cheat and drag all selected. */
- TREESTORE(te)->flag |= TSE_SELECTED;
+
+ /* Only drag element under mouse if it was not selected before. */
+ if ((TREESTORE(te)->flag & TSE_SELECTED) == 0) {
+ outliner_flag_set(&soops->tree, TSE_SELECTED, 0);
+ TREESTORE(te)->flag |= TSE_SELECTED;
+ }
/* Gather all selected elements. */
struct IDsSelectedData selected = {
diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c
index 2f7d8b7523c..e5d1a42c274 100644
--- a/source/blender/editors/space_outliner/outliner_draw.c
+++ b/source/blender/editors/space_outliner/outliner_draw.c
@@ -51,16 +51,16 @@
#include "BKE_context.h"
#include "BKE_deform.h"
#include "BKE_fcurve.h"
-#include "BKE_gpencil.h"
#include "BKE_global.h"
+#include "BKE_gpencil.h"
#include "BKE_idcode.h"
#include "BKE_layer.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_modifier.h"
+#include "BKE_object.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_object.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
@@ -200,14 +200,6 @@ static void restrictbutton_r_lay_cb(bContext *C, void *poin, void *UNUSED(poin2)
WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, poin);
}
-static void restrictbutton_modifier_cb(bContext *C, void *UNUSED(poin), void *poin2)
-{
- Object *ob = (Object *)poin2;
-
- DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
-}
-
static void restrictbutton_bone_visibility_cb(bContext *C, void *UNUSED(poin), void *poin2)
{
Bone *bone = (Bone *)poin2;
@@ -343,6 +335,14 @@ static void namebutton_cb(bContext *C, void *tsep, char *oldname)
WM_event_add_notifier(C, NC_IMAGE, NULL); break;
case ID_SCE:
WM_event_add_notifier(C, NC_SCENE, NULL); break;
+ case ID_OB:
+ {
+ Object *ob = (Object *)tselem->id;
+ if (ob->type == OB_MBALL) {
+ DEG_id_tag_update(&ob->id, DEG_TAG_GEOMETRY);
+ }
+ WM_event_add_notifier(C, NC_ID | NA_RENAME, NULL); break;
+ }
default:
WM_event_add_notifier(C, NC_ID | NA_RENAME, NULL); break;
}
@@ -483,25 +483,30 @@ static void namebutton_cb(bContext *C, void *tsep, char *oldname)
static void outliner_draw_restrictbuts(
uiBlock *block, Scene *scene, ViewLayer *view_layer, ARegion *ar, SpaceOops *soops, ListBase *lb)
{
- uiBut *bt;
-
- /* get RNA properties (once for speed) */
- PropertyRNA *object_prop_hide_viewport, *object_prop_hide_select, *object_prop_hide_render;
- PropertyRNA *collection_prop_hide_viewport, *collection_prop_hide_select, *collection_prop_hide_render;
-
- object_prop_hide_viewport = RNA_struct_type_find_property(&RNA_Object, "hide_viewport");
- object_prop_hide_select = RNA_struct_type_find_property(&RNA_Object, "hide_select");
- object_prop_hide_render = RNA_struct_type_find_property(&RNA_Object, "hide_render");
- collection_prop_hide_select = RNA_struct_type_find_property(&RNA_Collection, "hide_select");
- collection_prop_hide_viewport = RNA_struct_type_find_property(&RNA_Collection, "hide_viewport");
- collection_prop_hide_render = RNA_struct_type_find_property(&RNA_Collection, "hide_render");
+ /* Get RNA properties (once for speed). */
+ static struct RestrictProperties {
+ bool initialized;
+
+ PropertyRNA *object_hide_viewport, *object_hide_select, *object_hide_render;
+ PropertyRNA *collection_hide_viewport, *collection_hide_select, *collection_hide_render;
+ PropertyRNA *modifier_show_viewport, *modifier_show_render;
+ } props = {false};
+
+ if (!props.initialized) {
+ props.object_hide_viewport = RNA_struct_type_find_property(&RNA_Object, "hide_viewport");
+ props.object_hide_select = RNA_struct_type_find_property(&RNA_Object, "hide_select");
+ props.object_hide_render = RNA_struct_type_find_property(&RNA_Object, "hide_render");
+ props.collection_hide_select = RNA_struct_type_find_property(&RNA_Collection, "hide_select");
+ props.collection_hide_viewport = RNA_struct_type_find_property(&RNA_Collection, "hide_viewport");
+ props.collection_hide_render = RNA_struct_type_find_property(&RNA_Collection, "hide_render");
+ props.modifier_show_viewport = RNA_struct_type_find_property(&RNA_Modifier, "show_viewport");
+ props.modifier_show_render = RNA_struct_type_find_property(&RNA_Modifier, "show_render");
+
+ props.initialized = true;
+ }
- BLI_assert(object_prop_hide_viewport &&
- object_prop_hide_select &&
- object_prop_hide_render &&
- collection_prop_hide_viewport &&
- collection_prop_hide_select &&
- collection_prop_hide_render);
+ /* Create buttons. */
+ uiBut *bt;
for (TreeElement *te = lb->first; te; te = te->next) {
TreeStoreElem *tselem = TREESTORE(te);
@@ -516,6 +521,7 @@ static void outliner_draw_restrictbuts(
UI_UNIT_Y, &layer->flag, 0, 0, 0, 0, TIP_("Use view layer for rendering"));
UI_but_func_set(bt, restrictbutton_r_lay_cb, tselem->id, NULL);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
+ UI_but_drawflag_enable(bt, UI_BUT_ICON_REVERSE);
}
else if (tselem->type == 0 && te->idcode == ID_OB) {
Object *ob = (Object *)tselem->id;
@@ -529,47 +535,44 @@ static void outliner_draw_restrictbuts(
TIP_("Hide object in viewport (Ctrl to isolate)"));
UI_but_func_set(bt, hidebutton_base_flag_cb, view_layer, base);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
+ UI_but_drawflag_enable(bt, UI_BUT_ICON_REVERSE);
}
PointerRNA ptr;
- RNA_pointer_create((ID *)ob, &RNA_Object, ob, &ptr);
+ RNA_pointer_create(&ob->id, &RNA_Object, ob, &ptr);
- bt = uiDefIconButR_prop(block, UI_BTYPE_ICON_TOGGLE, 0, ICON_RESTRICT_VIEW_OFF,
+ bt = uiDefIconButR_prop(block, UI_BTYPE_ICON_TOGGLE, 0, 0,
(int)(ar->v2d.cur.xmax - OL_TOG_RESTRICT_VIEWX), te->ys, UI_UNIT_X, UI_UNIT_Y,
- &ptr, object_prop_hide_viewport, -1, 0, 0, -1, -1,
- TIP_("Restrict viewport visibility"));
+ &ptr, props.object_hide_viewport, -1, 0, 0, -1, -1, NULL);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
- bt = uiDefIconButR_prop(block, UI_BTYPE_ICON_TOGGLE, 0, ICON_RESTRICT_SELECT_OFF,
+ bt = uiDefIconButR_prop(block, UI_BTYPE_ICON_TOGGLE, 0, 0,
(int)(ar->v2d.cur.xmax - OL_TOG_RESTRICT_SELECTX), te->ys, UI_UNIT_X, UI_UNIT_Y,
- &ptr, object_prop_hide_select, -1, 0, 0, -1, -1,
- TIP_("Restrict viewport selection"));
+ &ptr, props.object_hide_select, -1, 0, 0, -1, -1, NULL);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
- bt = uiDefIconButR_prop(block, UI_BTYPE_ICON_TOGGLE, 0, ICON_RESTRICT_RENDER_OFF,
+ bt = uiDefIconButR_prop(block, UI_BTYPE_ICON_TOGGLE, 0, 0,
(int)(ar->v2d.cur.xmax - OL_TOG_RESTRICT_RENDERX), te->ys, UI_UNIT_X, UI_UNIT_Y,
- &ptr, object_prop_hide_render, -1, 0, 0, -1, -1,
- TIP_("Restrict render visibility"));
+ &ptr, props.object_hide_render, -1, 0, 0, -1, -1, NULL);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
}
else if (tselem->type == TSE_MODIFIER) {
ModifierData *md = (ModifierData *)te->directdata;
- Object *ob = (Object *)tselem->id;
- bt = uiDefIconButBitI(
- block, UI_BTYPE_ICON_TOGGLE_N, eModifierMode_Realtime, 0, ICON_RESTRICT_VIEW_OFF,
- (int)(ar->v2d.cur.xmax - OL_TOG_RESTRICT_VIEWX), te->ys, UI_UNIT_X,
- UI_UNIT_Y, &(md->mode), 0, 0, 0, 0,
- TIP_("Restrict/Allow visibility in the 3D View"));
- UI_but_func_set(bt, restrictbutton_modifier_cb, scene, ob);
+ PointerRNA ptr;
+ RNA_pointer_create(tselem->id, &RNA_Modifier, md, &ptr);
+
+ bt = uiDefIconButR_prop(
+ block, UI_BTYPE_ICON_TOGGLE, 0, 0,
+ (int)(ar->v2d.cur.xmax - OL_TOG_RESTRICT_VIEWX), te->ys, UI_UNIT_X, UI_UNIT_Y,
+ &ptr, props.modifier_show_viewport, -1, 0, 0, -1, -1, NULL);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
- bt = uiDefIconButBitI(
- block, UI_BTYPE_ICON_TOGGLE_N, eModifierMode_Render, 0, ICON_RESTRICT_RENDER_OFF,
- (int)(ar->v2d.cur.xmax - OL_TOG_RESTRICT_RENDERX), te->ys, UI_UNIT_X,
- UI_UNIT_Y, &(md->mode), 0, 0, 0, 0, TIP_("Restrict/Allow renderability"));
- UI_but_func_set(bt, restrictbutton_modifier_cb, scene, ob);
+ bt = uiDefIconButR_prop(
+ block, UI_BTYPE_ICON_TOGGLE, 0, 0,
+ (int)(ar->v2d.cur.xmax - OL_TOG_RESTRICT_RENDERX), te->ys, UI_UNIT_X, UI_UNIT_Y,
+ &ptr, props.modifier_show_render, -1, 0, 0, -1, -1, NULL);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
}
else if (tselem->type == TSE_POSE_CHANNEL) {
@@ -584,6 +587,7 @@ static void outliner_draw_restrictbuts(
TIP_("Restrict/Allow visibility in the 3D View"));
UI_but_func_set(bt, restrictbutton_bone_visibility_cb, ob->data, bone);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
+ UI_but_drawflag_enable(bt, UI_BUT_ICON_REVERSE);
bt = uiDefIconButBitI(
block, UI_BTYPE_ICON_TOGGLE, BONE_UNSELECTABLE, 0, ICON_RESTRICT_SELECT_OFF,
@@ -592,6 +596,7 @@ static void outliner_draw_restrictbuts(
TIP_("Restrict/Allow selection in the 3D View"));
UI_but_func_set(bt, restrictbutton_bone_select_cb, ob->data, bone);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
+ UI_but_drawflag_enable(bt, UI_BUT_ICON_REVERSE);
}
else if (tselem->type == TSE_EBONE) {
EditBone *ebone = (EditBone *)te->directdata;
@@ -603,6 +608,7 @@ static void outliner_draw_restrictbuts(
TIP_("Restrict/Allow visibility in the 3D View"));
UI_but_func_set(bt, restrictbutton_ebone_visibility_cb, NULL, ebone);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
+ UI_but_drawflag_enable(bt, UI_BUT_ICON_REVERSE);
bt = uiDefIconButBitI(
block, UI_BTYPE_ICON_TOGGLE, BONE_UNSELECTABLE, 0, ICON_RESTRICT_SELECT_OFF,
@@ -611,6 +617,7 @@ static void outliner_draw_restrictbuts(
TIP_("Restrict/Allow selection in the 3D View"));
UI_but_func_set(bt, restrictbutton_ebone_select_cb, NULL, ebone);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
+ UI_but_drawflag_enable(bt, UI_BUT_ICON_REVERSE);
}
else if (tselem->type == TSE_GP_LAYER) {
bGPDlayer *gpl = (bGPDlayer *)te->directdata;
@@ -622,6 +629,7 @@ static void outliner_draw_restrictbuts(
TIP_("Restrict/Allow visibility in the 3D View"));
UI_but_func_set(bt, restrictbutton_gp_layer_flag_cb, NULL, gpl);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
+ UI_but_drawflag_enable(bt, UI_BUT_ICON_REVERSE);
bt = uiDefIconButBitS(
block, UI_BTYPE_ICON_TOGGLE, GP_LAYER_LOCKED, 0, ICON_UNLOCKED,
@@ -648,27 +656,28 @@ static void outliner_draw_restrictbuts(
TIP_("Hide collection in viewport (Ctrl to isolate)"));
UI_but_func_set(bt, hidebutton_layer_collection_flag_cb, view_layer, lc);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
+ UI_but_drawflag_enable(bt, UI_BUT_ICON_REVERSE);
}
PointerRNA collection_ptr;
RNA_id_pointer_create(&collection->id, &collection_ptr);
bt = uiDefIconButR_prop(
- block, UI_BTYPE_ICON_TOGGLE, 0, ICON_RESTRICT_VIEW_OFF,
+ block, UI_BTYPE_ICON_TOGGLE, 0, 0,
(int)(ar->v2d.cur.xmax - OL_TOG_RESTRICT_VIEWX), te->ys, UI_UNIT_X,
- UI_UNIT_Y, &collection_ptr, collection_prop_hide_viewport, -1, 0, 0, 0, 0, NULL);
+ UI_UNIT_Y, &collection_ptr, props.collection_hide_viewport, -1, 0, 0, 0, 0, NULL);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
bt = uiDefIconButR_prop(
- block, UI_BTYPE_ICON_TOGGLE, 0, ICON_RESTRICT_RENDER_OFF,
+ block, UI_BTYPE_ICON_TOGGLE, 0, 0,
(int)(ar->v2d.cur.xmax - OL_TOG_RESTRICT_RENDERX), te->ys, UI_UNIT_X,
- UI_UNIT_Y, &collection_ptr, collection_prop_hide_render, -1, 0, 0, 0, 0, NULL);
+ UI_UNIT_Y, &collection_ptr, props.collection_hide_render, -1, 0, 0, 0, 0, NULL);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
bt = uiDefIconButR_prop(
- block, UI_BTYPE_ICON_TOGGLE, 0, ICON_RESTRICT_SELECT_OFF,
+ block, UI_BTYPE_ICON_TOGGLE, 0, 0,
(int)(ar->v2d.cur.xmax - OL_TOG_RESTRICT_SELECTX), te->ys, UI_UNIT_X,
- UI_UNIT_Y, &collection_ptr, collection_prop_hide_select, -1, 0, 0, 0, 0, NULL);
+ UI_UNIT_Y, &collection_ptr, props.collection_hide_select, -1, 0, 0, 0, 0, NULL);
UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK);
}
}
@@ -842,7 +851,7 @@ static void outliner_buttons(const bContext *C, uiBlock *block, ARegion *ar, Tre
if (false == UI_but_active_only(C, ar, block, bt)) {
tselem->flag &= ~TSE_TEXTBUT;
- /* bad! (notifier within draw) without this, we don't get a refesh */
+ /* bad! (notifier within draw) without this, we don't get a refresh */
WM_event_add_notifier(C, NC_SPACE | ND_SPACE_OUTLINER, NULL);
}
}
@@ -1059,12 +1068,12 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
data.icon = ICON_MOD_SUBSURF;
break;
case eGpencilModifierType_Thick:
- data.icon = ICON_MAN_ROT;
+ data.icon = ICON_MOD_THICKNESS;
break;
case eGpencilModifierType_Tint:
- data.icon = ICON_COLOR;
+ data.icon = ICON_MOD_TINT;
break;
- case eGpencilModifierType_Instance:
+ case eGpencilModifierType_Array:
data.icon = ICON_MOD_ARRAY;
break;
case eGpencilModifierType_Build:
@@ -1074,7 +1083,7 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
data.icon = ICON_MOD_MASK;
break;
case eGpencilModifierType_Color:
- data.icon = ICON_GROUP_VCOL;
+ data.icon = ICON_MOD_HUE_SATURATION;
break;
case eGpencilModifierType_Lattice:
data.icon = ICON_MOD_LATTICE;
@@ -1083,7 +1092,7 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
data.icon = ICON_MOD_MIRROR;
break;
case eGpencilModifierType_Simplify:
- data.icon = ICON_MOD_DECIM;
+ data.icon = ICON_MOD_SIMPLIFY;
break;
case eGpencilModifierType_Smooth:
data.icon = ICON_MOD_SMOOTH;
@@ -1092,7 +1101,7 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
data.icon = ICON_HOOK;
break;
case eGpencilModifierType_Offset:
- data.icon = ICON_MOD_DISPLACE;
+ data.icon = ICON_MOD_OFFSET;
break;
case eGpencilModifierType_Armature:
data.icon = ICON_MOD_ARMATURE;
@@ -1113,7 +1122,7 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
data.icon = ICON_BONE_DATA;
break;
case TSE_PROXY:
- data.icon = ICON_GHOST;
+ data.icon = ICON_GHOST_ENABLED;
break;
case TSE_R_LAYER_BASE:
data.icon = ICON_RENDERLAYERS;
@@ -1143,7 +1152,7 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
else if (te->idcode == SEQ_TYPE_SOUND_RAM)
data.icon = ICON_SOUND;
else if (te->idcode == SEQ_TYPE_IMAGE)
- data.icon = ICON_IMAGE_COL;
+ data.icon = ICON_IMAGE;
else
data.icon = ICON_PARTICLES;
break;
@@ -1226,6 +1235,9 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
if (ob->dup_group) {
data.icon = ICON_OUTLINER_OB_GROUP_INSTANCE;
}
+ else if (ob->empty_drawtype == OB_EMPTY_IMAGE) {
+ data.icon = ICON_OUTLINER_OB_IMAGE;
+ }
else {
data.icon = ICON_OUTLINER_OB_EMPTY;
}
@@ -1311,7 +1323,7 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
data.icon = ICON_OUTLINER_DATA_GREASEPENCIL; break;
case ID_LP:
{
- LightProbe * lp = (LightProbe *)tselem->id;
+ LightProbe *lp = (LightProbe *)tselem->id;
switch (lp->type) {
case LIGHTPROBE_TYPE_CUBE:
data.icon = ICON_LIGHTPROBE_CUBEMAP; break;
@@ -1328,7 +1340,7 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
data.icon = ICON_BRUSH_DATA; break;
case ID_SCR:
case ID_WS:
- data.icon = ICON_SPLITSCREEN; break;
+ data.icon = ICON_WORKSPACE; break;
default:
break;
}
@@ -1355,7 +1367,7 @@ static void tselem_draw_icon(
y += 2.0f * aspect;
/* restrict column clip... it has been coded by simply overdrawing,
- * doesnt work for buttons */
+ * doesn't work for buttons */
UI_icon_draw_alpha(x, y, data.icon, alpha);
}
else {
@@ -1423,7 +1435,7 @@ static void outliner_draw_iconrow_doit(
if (active != OL_DRAWSEL_NONE) {
float ufac = UI_UNIT_X / 20.0f;
- float color[4] = {1.0f, 1.0f, 1.0f, 0.4f};
+ float color[4] = {1.0f, 1.0f, 1.0f, 0.2f};
UI_draw_roundbox_corner_set(UI_CNR_ALL);
color[3] *= alpha_fac;
@@ -1453,7 +1465,7 @@ static void outliner_draw_iconrow_doit(
/**
* Return the index to use based on the TreeElement ID and object type
*
- * We use a continuum of indeces until we get to the object datablocks
+ * We use a continuum of indices until we get to the object datablocks
* and we then make room for the object types.
*/
static int tree_element_id_type_to_index(TreeElement *te)
@@ -1693,7 +1705,7 @@ static void outliner_draw_tree_element(
if (!(ELEM(tselem->type, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM, TSE_ID_BASE))) {
tselem_draw_icon(block, xmax, (float)startx + offsx, (float)*starty, tselem, te, alpha_fac, true);
- offsx += UI_UNIT_X + 2 * ufac;
+ offsx += UI_UNIT_X + 4 * ufac;
}
else
offsx += 2 * ufac;
@@ -1714,13 +1726,13 @@ static void outliner_draw_tree_element(
(float)startx + offsx + 2 * ufac, (float)*starty + 2 * ufac, ICON_LIBRARY_DATA_DIRECT,
alpha_fac);
}
- offsx += UI_UNIT_X + 2 * ufac;
+ offsx += UI_UNIT_X + 4 * ufac;
}
else if (ELEM(tselem->type, 0, TSE_LAYER_COLLECTION) && ID_IS_STATIC_OVERRIDE(tselem->id)) {
UI_icon_draw_alpha(
(float)startx + offsx + 2 * ufac, (float)*starty + 2 * ufac, ICON_LIBRARY_DATA_OVERRIDE,
alpha_fac);
- offsx += UI_UNIT_X + 2 * ufac;
+ offsx += UI_UNIT_X + 4 * ufac;
}
GPU_blend(false);
diff --git a/source/blender/editors/space_outliner/outliner_edit.c b/source/blender/editors/space_outliner/outliner_edit.c
index b845e5c4d40..7cee70def37 100644
--- a/source/blender/editors/space_outliner/outliner_edit.c
+++ b/source/blender/editors/space_outliner/outliner_edit.c
@@ -58,10 +58,10 @@
#include "BKE_library_query.h"
#include "BKE_library_remap.h"
#include "BKE_main.h"
+#include "BKE_material.h"
#include "BKE_outliner_treehash.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_material.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h
index 99411df3fda..41a0dce7a38 100644
--- a/source/blender/editors/space_outliner/outliner_intern.h
+++ b/source/blender/editors/space_outliner/outliner_intern.h
@@ -129,10 +129,10 @@ typedef enum {
/* size constants */
#define OL_Y_OFFSET 2
-#define OL_TOG_HIDEX (UI_UNIT_X * 4.0f)
-#define OL_TOG_RESTRICT_SELECTX (UI_UNIT_X * 3.0f)
-#define OL_TOG_RESTRICT_VIEWX (UI_UNIT_X * 2.0f)
-#define OL_TOG_RESTRICT_RENDERX UI_UNIT_X
+#define OL_TOG_HIDEX (UI_UNIT_X * 4.0f + V2D_SCROLL_WIDTH)
+#define OL_TOG_RESTRICT_SELECTX (UI_UNIT_X * 3.0f + V2D_SCROLL_WIDTH)
+#define OL_TOG_RESTRICT_VIEWX (UI_UNIT_X * 2.0f + V2D_SCROLL_WIDTH)
+#define OL_TOG_RESTRICT_RENDERX (UI_UNIT_X + V2D_SCROLL_WIDTH)
#define OL_TOGW OL_TOG_HIDEX
@@ -162,7 +162,7 @@ typedef enum {
#define SEARCHING_OUTLINER(sov) (sov->search_flags & SO_SEARCH_RECURSIVE)
-/* is the currrent element open? if so we also show children */
+/* is the current element open? if so we also show children */
#define TSELEM_OPEN(telm, sv) ( (telm->flag & TSE_CLOSED) == 0 || (SEARCHING_OUTLINER(sv) && (telm->flag & TSE_CHILDSEARCH)) )
/* outliner_tree.c ----------------------------------------------- */
@@ -293,7 +293,7 @@ void OUTLINER_OT_show_one_level(struct wmOperatorType *ot);
void OUTLINER_OT_show_active(struct wmOperatorType *ot);
void OUTLINER_OT_show_hierarchy(struct wmOperatorType *ot);
-void OUTLINER_OT_select_border(struct wmOperatorType *ot);
+void OUTLINER_OT_select_box(struct wmOperatorType *ot);
void OUTLINER_OT_select_all(struct wmOperatorType *ot);
void OUTLINER_OT_expanded_toggle(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_outliner/outliner_ops.c b/source/blender/editors/space_outliner/outliner_ops.c
index 66fd680a1e0..87c9827a15a 100644
--- a/source/blender/editors/space_outliner/outliner_ops.c
+++ b/source/blender/editors/space_outliner/outliner_ops.c
@@ -62,7 +62,7 @@ void outliner_operatortypes(void)
{
WM_operatortype_append(OUTLINER_OT_highlight_update);
WM_operatortype_append(OUTLINER_OT_item_activate);
- WM_operatortype_append(OUTLINER_OT_select_border);
+ WM_operatortype_append(OUTLINER_OT_select_box);
WM_operatortype_append(OUTLINER_OT_item_openclose);
WM_operatortype_append(OUTLINER_OT_item_rename);
WM_operatortype_append(OUTLINER_OT_item_drag_drop);
@@ -120,91 +120,5 @@ void outliner_operatortypes(void)
void outliner_keymap(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Outliner", SPACE_OUTLINER, 0);
- wmKeyMapItem *kmi;
-
- WM_keymap_add_item(keymap, "OUTLINER_OT_highlight_update", MOUSEMOVE, KM_ANY, KM_ANY, 0);
-
- WM_keymap_add_item(keymap, "OUTLINER_OT_item_rename", LEFTMOUSE, KM_DBL_CLICK, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_CLICK, 0, 0);
- RNA_boolean_set(kmi->ptr, "recursive", false);
- RNA_boolean_set(kmi->ptr, "extend", false);
-
- kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_CLICK, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "recursive", false);
- RNA_boolean_set(kmi->ptr, "extend", true);
-
- kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_CLICK, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "recursive", true);
- RNA_boolean_set(kmi->ptr, "extend", false);
-
- kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_CLICK, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "recursive", true);
- RNA_boolean_set(kmi->ptr, "extend", true);
-
-
- WM_keymap_add_item(keymap, "OUTLINER_OT_select_border", BKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_item_openclose", RETKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "all", false);
- kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_item_openclose", RETKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "all", true);
-
- WM_keymap_add_item(keymap, "OUTLINER_OT_item_rename", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "OUTLINER_OT_operation", RIGHTMOUSE, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "OUTLINER_OT_item_drag_drop", EVT_TWEAK_L, KM_ANY, 0, 0);
-
- WM_keymap_add_item(keymap, "OUTLINER_OT_show_hierarchy", HOMEKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "OUTLINER_OT_show_active", PERIODKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "OUTLINER_OT_show_active", PADPERIOD, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_scroll_page", PAGEDOWNKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "up", false);
- kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_scroll_page", PAGEUPKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "up", true);
-
- WM_keymap_add_item(keymap, "OUTLINER_OT_show_one_level", PADPLUSKEY, KM_PRESS, 0, 0); /* open */
- kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_show_one_level", PADMINUS, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "open", false); /* close */
-
- kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- WM_keymap_add_item(keymap, "OUTLINER_OT_expanded_toggle", AKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* keying sets - only for databrowse */
- WM_keymap_add_item(keymap, "OUTLINER_OT_keyingset_add_selected", KKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "OUTLINER_OT_keyingset_remove_selected", KKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "ANIM_OT_keyframe_insert", IKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_keyframe_delete", IKEY, KM_PRESS, KM_ALT, 0);
-
- /* Note: was D, Alt-D, keep these free for duplicate. */
- WM_keymap_add_item(keymap, "OUTLINER_OT_drivers_add_selected", DKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "OUTLINER_OT_drivers_delete_selected", DKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "OUTLINER_OT_collection_new", CKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "OUTLINER_OT_collection_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "OUTLINER_OT_collection_delete", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "OBJECT_OT_move_to_collection", MKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "OBJECT_OT_link_to_collection", MKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "OUTLINER_OT_collection_exclude_set", EKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "OUTLINER_OT_collection_exclude_clear", EKEY, KM_PRESS, KM_ALT, 0);
-
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_hide_view_clear", HKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "select", false);
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_hide_view_set", HKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_hide_view_set", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
+ WM_keymap_ensure(keyconf, "Outliner", SPACE_OUTLINER, 0);
}
diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c
index e713a0a2797..b03d4ae3d67 100644
--- a/source/blender/editors/space_outliner/outliner_select.c
+++ b/source/blender/editors/space_outliner/outliner_select.c
@@ -211,7 +211,7 @@ static void do_outliner_object_select_recursive(ViewLayer *view_layer, Object *o
for (base = FIRSTBASE(view_layer); base; base = base->next) {
Object *ob = base->object;
- if ((((base->flag & BASE_VISIBLE) == 0) && BKE_object_is_child_recursive(ob_parent, ob))) {
+ if ((((base->flag & BASE_VISIBLE) != 0) && BKE_object_is_child_recursive(ob_parent, ob))) {
ED_object_base_select(base, select ? BA_SELECT : BA_DESELECT);
}
}
@@ -1187,8 +1187,8 @@ void OUTLINER_OT_item_activate(wmOperatorType *ot)
/* ****************************************************** */
-/* **************** Border Select Tool ****************** */
-static void outliner_item_border_select(Scene *scene, rctf *rectf, TreeElement *te, bool select)
+/* **************** Box Select Tool ****************** */
+static void outliner_item_box_select(Scene *scene, rctf *rectf, TreeElement *te, bool select)
{
TreeStoreElem *tselem = TREESTORE(te);
@@ -1204,12 +1204,12 @@ static void outliner_item_border_select(Scene *scene, rctf *rectf, TreeElement *
/* Look at its children. */
if ((tselem->flag & TSE_CLOSED) == 0) {
for (te = te->subtree.first; te; te = te->next) {
- outliner_item_border_select(scene, rectf, te, select);
+ outliner_item_box_select(scene, rectf, te, select);
}
}
}
-static int outliner_border_select_exec(bContext *C, wmOperator *op)
+static int outliner_box_select_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
SpaceOops *soops = CTX_wm_space_outliner(C);
@@ -1222,7 +1222,7 @@ static int outliner_border_select_exec(bContext *C, wmOperator *op)
UI_view2d_region_to_view_rctf(&ar->v2d, &rectf, &rectf);
for (te = soops->tree.first; te; te = te->next) {
- outliner_item_border_select(scene, &rectf, te, select);
+ outliner_item_box_select(scene, &rectf, te, select);
}
DEG_id_tag_update(&scene->id, DEG_TAG_SELECT_UPDATE);
@@ -1232,18 +1232,18 @@ static int outliner_border_select_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void OUTLINER_OT_select_border(wmOperatorType *ot)
+void OUTLINER_OT_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
- ot->idname = "OUTLINER_OT_select_border";
+ ot->name = "Box Select";
+ ot->idname = "OUTLINER_OT_select_box";
ot->description = "Use box selection to select tree elements";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
- ot->exec = outliner_border_select_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = outliner_box_select_exec;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = ED_operator_outliner_active;
@@ -1251,7 +1251,7 @@ void OUTLINER_OT_select_border(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* rna */
- WM_operator_properties_gesture_border_ex(ot, true, false);
+ WM_operator_properties_gesture_box_ex(ot, true, false);
}
/* ****************************************************** */
diff --git a/source/blender/editors/space_outliner/outliner_tools.c b/source/blender/editors/space_outliner/outliner_tools.c
index 84af223733d..b66622536e9 100644
--- a/source/blender/editors/space_outliner/outliner_tools.c
+++ b/source/blender/editors/space_outliner/outliner_tools.c
@@ -1076,8 +1076,8 @@ typedef enum eOutlinerIdOpTypes {
static const EnumPropertyItem prop_id_op_types[] = {
{OUTLINER_IDOP_UNLINK, "UNLINK", 0, "Unlink", ""},
{OUTLINER_IDOP_LOCAL, "LOCAL", 0, "Make Local", ""},
- {OUTLINER_IDOP_STATIC_OVERRIDE, "STATIC_OVERRIDE",
- 0, "Add Static Override", "Add a local static override of this data-block"},
+ {OUTLINER_IDOP_STATIC_OVERRIDE, "STATIC_OVERRIDE", 0, "Add Static Override",
+ "Add a local static override of this data-block"},
{OUTLINER_IDOP_SINGLE, "SINGLE", 0, "Make Single User", ""},
{OUTLINER_IDOP_DELETE, "DELETE", 0, "Delete", "WARNING: no undo"},
{OUTLINER_IDOP_REMAP, "REMAP", 0, "Remap Users",
@@ -1090,6 +1090,29 @@ static const EnumPropertyItem prop_id_op_types[] = {
{0, NULL, 0, NULL, NULL}
};
+static const EnumPropertyItem *outliner_id_operation_itemf(
+ bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free)
+{
+ if (BKE_override_static_is_enabled()) {
+ *r_free = false;
+ return prop_id_op_types;
+ }
+
+ EnumPropertyItem *items = NULL;
+ int totitem = 0;
+
+ for (const EnumPropertyItem *it = prop_id_op_types; it->identifier != NULL; it++) {
+ if (it->value == OUTLINER_IDOP_STATIC_OVERRIDE) {
+ continue;
+ }
+ RNA_enum_item_add(&items, &totitem, it);
+ }
+ RNA_enum_item_end(&items, &totitem);
+ *r_free = true;
+
+ return items;
+}
+
static int outliner_id_operation_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
@@ -1163,9 +1186,11 @@ static int outliner_id_operation_exec(bContext *C, wmOperator *op)
}
case OUTLINER_IDOP_STATIC_OVERRIDE:
{
- /* make local */
- outliner_do_libdata_operation(C, op->reports, scene, soops, &soops->tree, id_static_override_cb, NULL);
- ED_undo_push(C, "Overrided Data");
+ if (BKE_override_static_is_enabled()) {
+ /* make local */
+ outliner_do_libdata_operation(C, op->reports, scene, soops, &soops->tree, id_static_override_cb, NULL);
+ ED_undo_push(C, "Overridden Data");
+ }
break;
}
case OUTLINER_IDOP_SINGLE:
@@ -1270,6 +1295,7 @@ void OUTLINER_OT_id_operation(wmOperatorType *ot)
ot->flag = 0;
ot->prop = RNA_def_enum(ot->srna, "type", prop_id_op_types, 0, "ID data Operation", "");
+ RNA_def_enum_funcs(ot->prop, outliner_id_operation_itemf);
}
/* **************************************** */
diff --git a/source/blender/editors/space_outliner/outliner_tree.c b/source/blender/editors/space_outliner/outliner_tree.c
index 170a54cd404..74510c3b02f 100644
--- a/source/blender/editors/space_outliner/outliner_tree.c
+++ b/source/blender/editors/space_outliner/outliner_tree.c
@@ -63,13 +63,13 @@
#include "BLT_translation.h"
#include "BKE_fcurve.h"
-#include "BKE_main.h"
+#include "BKE_idcode.h"
#include "BKE_layer.h"
#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_modifier.h"
-#include "BKE_sequencer.h"
-#include "BKE_idcode.h"
#include "BKE_outliner_treehash.h"
+#include "BKE_sequencer.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
@@ -769,7 +769,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
tselem->flag |= TSE_CHILDSEARCH;
te->parent = parent;
- te->index = index; // for data arays
+ te->index = index; // for data arrays
if (ELEM(type, TSE_SEQUENCE, TSE_SEQ_STRIP, TSE_SEQUENCE_DUP)) {
/* pass */
}
@@ -933,7 +933,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
int a, tot;
- /* we do lazy build, for speed and to avoid infinite recusion */
+ /* we do lazy build, for speed and to avoid infinite recursion */
if (ptr->data == NULL) {
te->name = IFACE_("(empty)");
@@ -1456,7 +1456,7 @@ static int treesort_alpha(const void *v1, const void *v2)
}
-/* this is nice option for later? doesnt look too useful... */
+/* this is nice option for later? doesn't look too useful... */
#if 0
static int treesort_obtype_alpha(const void *v1, const void *v2)
{
diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c
index 37fa44f7386..57b13749f2b 100644
--- a/source/blender/editors/space_outliner/space_outliner.c
+++ b/source/blender/editors/space_outliner/space_outliner.c
@@ -108,7 +108,7 @@ static void outliner_main_region_draw(const bContext *C, ARegion *ar)
UI_view2d_view_restore(C);
/* scrollers */
- scrollers = UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
+ scrollers = UI_view2d_scrollers_calc(C, v2d, NULL, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);
}
diff --git a/source/blender/editors/space_script/script_edit.c b/source/blender/editors/space_script/script_edit.c
index 6bfb51d07c6..ee8dcf0ca9a 100644
--- a/source/blender/editors/space_script/script_edit.c
+++ b/source/blender/editors/space_script/script_edit.c
@@ -125,7 +125,7 @@ static int script_reload_exec(bContext *C, wmOperator *op)
/* TODO, this crashes on netrender and keying sets, need to look into why
* disable for now unless running in debug mode */
WM_cursor_wait(1);
- BPY_execute_string(C, "__import__('bpy').utils.load_scripts(reload_scripts=True)");
+ BPY_execute_string(C, (const char *[]){"bpy", NULL}, "bpy.utils.load_scripts(reload_scripts=True)");
WM_cursor_wait(0);
WM_event_add_notifier(C, NC_WINDOW, NULL);
return OPERATOR_FINISHED;
@@ -145,23 +145,3 @@ void SCRIPT_OT_reload(wmOperatorType *ot)
/* api callbacks */
ot->exec = script_reload_exec;
}
-
-static int script_autoexec_warn_clear_exec(bContext *UNUSED(C), wmOperator *UNUSED(op))
-{
- G.f |= G_SCRIPT_AUTOEXEC_FAIL_QUIET;
- return OPERATOR_FINISHED;
-}
-
-void SCRIPT_OT_autoexec_warn_clear(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name = "Continue Untrusted";
- ot->description = "Ignore autoexec warning";
- ot->idname = "SCRIPT_OT_autoexec_warn_clear";
-
- /* flags */
- ot->flag = OPTYPE_INTERNAL;
-
- /* api callbacks */
- ot->exec = script_autoexec_warn_clear_exec;
-}
diff --git a/source/blender/editors/space_script/script_intern.h b/source/blender/editors/space_script/script_intern.h
index 0e0936cf082..649992fec4f 100644
--- a/source/blender/editors/space_script/script_intern.h
+++ b/source/blender/editors/space_script/script_intern.h
@@ -40,6 +40,5 @@ void script_keymap(struct wmKeyConfig *keyconf);
/* script_edit.c */
void SCRIPT_OT_reload(struct wmOperatorType *ot);
void SCRIPT_OT_python_file_run(struct wmOperatorType *ot);
-void SCRIPT_OT_autoexec_warn_clear(struct wmOperatorType *ot);
#endif /* __SCRIPT_INTERN_H__ */
diff --git a/source/blender/editors/space_script/script_ops.c b/source/blender/editors/space_script/script_ops.c
index 41c07596a3b..90eb38db7f7 100644
--- a/source/blender/editors/space_script/script_ops.c
+++ b/source/blender/editors/space_script/script_ops.c
@@ -44,7 +44,6 @@ void script_operatortypes(void)
{
WM_operatortype_append(SCRIPT_OT_python_file_run);
WM_operatortype_append(SCRIPT_OT_reload);
- WM_operatortype_append(SCRIPT_OT_autoexec_warn_clear);
}
void script_keymap(wmKeyConfig *UNUSED(keyconf))
diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c
index 3cd5bfc3e58..d814a27c282 100644
--- a/source/blender/editors/space_sequencer/sequencer_add.c
+++ b/source/blender/editors/space_sequencer/sequencer_add.c
@@ -48,10 +48,10 @@
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_sequencer.h"
-#include "BKE_movieclip.h"
#include "BKE_mask.h"
+#include "BKE_movieclip.h"
#include "BKE_report.h"
+#include "BKE_sequencer.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -166,7 +166,7 @@ static void sequencer_generic_invoke_xy__internal(bContext *C, wmOperator *op, i
RNA_int_set(op->ptr, "frame_start", cfra);
if ((flag & SEQPROP_ENDFRAME) && RNA_struct_property_is_set(op->ptr, "frame_end") == 0)
- RNA_int_set(op->ptr, "frame_end", cfra + 25); // XXX arbitary but ok for now.
+ RNA_int_set(op->ptr, "frame_end", cfra + 25); // XXX arbitrary but ok for now.
if (!(flag & SEQPROP_NOPATHS)) {
sequencer_generic_invoke_path__internal(C, op, "filepath");
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 864609e4157..d91ade75807 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -1341,29 +1341,29 @@ void draw_image_seq(const bContext *C, Scene *scene, ARegion *ar, SpaceSeq *sseq
tot_clip.xmax = v2d->tot.xmin + (fabsf(BLI_rctf_size_x(&v2d->tot)) * scene->ed->over_border.xmax);
tot_clip.ymax = v2d->tot.ymin + (fabsf(BLI_rctf_size_y(&v2d->tot)) * scene->ed->over_border.ymax);
- immAttrib2f(texCoord, scene->ed->over_border.xmin, scene->ed->over_border.ymin);
+ immAttr2f(texCoord, scene->ed->over_border.xmin, scene->ed->over_border.ymin);
immVertex2f(pos, tot_clip.xmin, tot_clip.ymin);
- immAttrib2f(texCoord, scene->ed->over_border.xmin, scene->ed->over_border.ymax);
+ immAttr2f(texCoord, scene->ed->over_border.xmin, scene->ed->over_border.ymax);
immVertex2f(pos, tot_clip.xmin, tot_clip.ymax);
- immAttrib2f(texCoord, scene->ed->over_border.xmax, scene->ed->over_border.ymax);
+ immAttr2f(texCoord, scene->ed->over_border.xmax, scene->ed->over_border.ymax);
immVertex2f(pos, tot_clip.xmax, tot_clip.ymax);
- immAttrib2f(texCoord, scene->ed->over_border.xmax, scene->ed->over_border.ymin);
+ immAttr2f(texCoord, scene->ed->over_border.xmax, scene->ed->over_border.ymin);
immVertex2f(pos, tot_clip.xmax, tot_clip.ymin);
}
else if (sseq->overlay_type == SEQ_DRAW_OVERLAY_REFERENCE) {
- immAttrib2f(texCoord, 0.0f, 0.0f);
+ immAttr2f(texCoord, 0.0f, 0.0f);
immVertex2f(pos, v2d->tot.xmin, v2d->tot.ymin);
- immAttrib2f(texCoord, 0.0f, 1.0f);
+ immAttr2f(texCoord, 0.0f, 1.0f);
immVertex2f(pos, v2d->tot.xmin, v2d->tot.ymax);
- immAttrib2f(texCoord, 1.0f, 1.0f);
+ immAttr2f(texCoord, 1.0f, 1.0f);
immVertex2f(pos, v2d->tot.xmax, v2d->tot.ymax);
- immAttrib2f(texCoord, 1.0f, 0.0f);
+ immAttr2f(texCoord, 1.0f, 0.0f);
immVertex2f(pos, v2d->tot.xmax, v2d->tot.ymin);
}
}
@@ -1383,31 +1383,31 @@ void draw_image_seq(const bContext *C, Scene *scene, ARegion *ar, SpaceSeq *sseq
imagey = aspect / image_aspect;
}
- immAttrib2f(texCoord, 0.0f, 0.0f);
+ immAttr2f(texCoord, 0.0f, 0.0f);
immVertex2f(pos, -imagex, -imagey);
- immAttrib2f(texCoord, 0.0f, 1.0f);
+ immAttr2f(texCoord, 0.0f, 1.0f);
immVertex2f(pos, -imagex, imagey);
- immAttrib2f(texCoord, 1.0f, 1.0f);
+ immAttr2f(texCoord, 1.0f, 1.0f);
immVertex2f(pos, imagex, imagey);
- immAttrib2f(texCoord, 1.0f, 0.0f);
+ immAttr2f(texCoord, 1.0f, 0.0f);
immVertex2f(pos, imagex, -imagey);
}
else {
draw_metadata = ((sseq->flag & SEQ_SHOW_METADATA) != 0);
- immAttrib2f(texCoord, 0.0f, 0.0f);
+ immAttr2f(texCoord, 0.0f, 0.0f);
immVertex2f(pos, v2d->tot.xmin, v2d->tot.ymin);
- immAttrib2f(texCoord, 0.0f, 1.0f);
+ immAttr2f(texCoord, 0.0f, 1.0f);
immVertex2f(pos, v2d->tot.xmin, v2d->tot.ymax);
- immAttrib2f(texCoord, 1.0f, 1.0f);
+ immAttr2f(texCoord, 1.0f, 1.0f);
immVertex2f(pos, v2d->tot.xmax, v2d->tot.ymax);
- immAttrib2f(texCoord, 1.0f, 0.0f);
+ immAttr2f(texCoord, 1.0f, 0.0f);
immVertex2f(pos, v2d->tot.xmax, v2d->tot.ymin);
}
@@ -1756,7 +1756,7 @@ void draw_timeline_seq(const bContext *C, ARegion *ar)
/* scrollers */
unit = (sseq->flag & SEQ_DRAWFRAMES) ? V2D_UNIT_FRAMES : V2D_UNIT_SECONDS;
- scrollers = UI_view2d_scrollers_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_UNIT_VALUES, V2D_GRID_CLAMP);
+ scrollers = UI_view2d_scrollers_calc(C, v2d, NULL, unit, V2D_GRID_CLAMP, V2D_UNIT_VALUES, V2D_GRID_CLAMP);
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index a3c20d5bab2..89667b6a028 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -48,8 +48,8 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_main.h"
-#include "BKE_sequencer.h"
#include "BKE_report.h"
+#include "BKE_sequencer.h"
#include "BKE_sound.h"
@@ -100,8 +100,11 @@ EnumPropertyItem sequencer_prop_effect_types[] = {
/* mute operator */
+#define SEQ_SIDE_MOUSE -1
+
EnumPropertyItem prop_side_types[] = {
- {SEQ_SIDE_LEFT, "LEFT", 0, "Left", ""},
+ {SEQ_SIDE_MOUSE, "MOUSE", 0, "Mouse position", "" },
+ {SEQ_SIDE_LEFT, "LEFT", 0, "Left", "" },
{SEQ_SIDE_RIGHT, "RIGHT", 0, "Right", ""},
{SEQ_SIDE_BOTH, "BOTH", 0, "Both", ""},
{0, NULL, 0, NULL, NULL}
@@ -561,7 +564,7 @@ int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequen
switch (BKE_sequence_effect_get_num_inputs(type)) {
case 0:
*selseq1 = *selseq2 = *selseq3 = NULL;
- return 1; /* succsess */
+ return 1; /* success */
case 1:
if (seq2 == NULL) {
*error_str = N_("At least one selected sequence strip is needed");
@@ -1380,7 +1383,7 @@ static int sequencer_slip_invoke(bContext *C, wmOperator *op, const wmEvent *eve
int num_seq, i;
View2D *v2d = UI_view2d_fromcontext(C);
- /* first recursively cound the trimmed elements */
+ /* first recursively count the trimmed elements */
num_seq = slip_count_sequences_rec(ed->seqbasep, true);
if (num_seq == 0)
@@ -1488,7 +1491,7 @@ static int sequencer_slip_exec(bContext *C, wmOperator *op)
int offset = RNA_int_get(op->ptr, "offset");
bool success = false;
- /* first recursively cound the trimmed elements */
+ /* first recursively count the trimmed elements */
num_seq = slip_count_sequences_rec(ed->seqbasep, true);
if (num_seq == 0)
@@ -2121,16 +2124,20 @@ static int sequencer_cut_invoke(bContext *C, wmOperator *op, const wmEvent *even
Scene *scene = CTX_data_scene(C);
View2D *v2d = UI_view2d_fromcontext(C);
- int cut_side = SEQ_SIDE_BOTH;
+ int cut_side = RNA_enum_get(op->ptr, "side");
int cut_frame = CFRA;
- if (ED_operator_sequencer_active(C) && v2d)
- cut_side = mouse_frame_side(v2d, event->mval[0], cut_frame);
-
+ if (cut_side == SEQ_SIDE_MOUSE) {
+ if (ED_operator_sequencer_active(C) && v2d) {
+ cut_side = mouse_frame_side(v2d, event->mval[0], cut_frame);
+ }
+ else {
+ cut_side = SEQ_SIDE_BOTH;
+ }
+ }
RNA_int_set(op->ptr, "frame", cut_frame);
RNA_enum_set(op->ptr, "side", cut_side);
/*RNA_enum_set(op->ptr, "type", cut_hard); */ /*This type is set from the key shortcut */
-
return sequencer_cut_exec(C, op);
}
@@ -2150,11 +2157,15 @@ void SEQUENCER_OT_cut(struct wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ PropertyRNA *prop;
RNA_def_int(ot->srna, "frame", 0, INT_MIN, INT_MAX, "Frame", "Frame where selected strips will be cut", INT_MIN, INT_MAX);
RNA_def_enum(ot->srna, "type", prop_cut_types, SEQ_CUT_SOFT, "Type", "The type of cut operation to perform on strips");
- RNA_def_enum(ot->srna, "side", prop_side_types, SEQ_SIDE_BOTH, "Side", "The side that remains selected after cutting");
+ prop = RNA_def_enum(ot->srna, "side", prop_side_types, SEQ_SIDE_MOUSE, "Side", "The side that remains selected after cutting");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
+#undef SEQ_SIDE_MOUSE
+
/* duplicate operator */
static int apply_unique_name_cb(Sequence *seq, void *arg_pt)
{
@@ -2645,7 +2656,7 @@ static int sequencer_meta_separate_exec(bContext *C, wmOperator *UNUSED(op))
BLI_remlink(ed->seqbasep, last_seq);
BKE_sequence_free(scene, last_seq);
- /* emtpy meta strip, delete all effects depending on it */
+ /* empty meta strip, delete all effects depending on it */
for (seq = ed->seqbasep->first; seq; seq = seq->next)
if ((seq->type & SEQ_TYPE_EFFECT) && seq_depends_on_meta(seq, last_seq))
seq->flag |= SEQ_FLAG_DELETE;
@@ -3394,7 +3405,7 @@ void SEQUENCER_OT_swap_data(wmOperatorType *ot)
/* properties */
}
-/* borderselect operator */
+/* box select operator */
static int view_ghost_border_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
@@ -3429,7 +3440,7 @@ static int view_ghost_border_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-/* ****** Border Select ****** */
+/* ****** Box Select ****** */
void SEQUENCER_OT_view_ghost_border(wmOperatorType *ot)
{
/* identifiers */
@@ -3438,17 +3449,17 @@ void SEQUENCER_OT_view_ghost_border(wmOperatorType *ot)
ot->description = "Set the boundaries of the border used for offset-view";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
+ ot->invoke = WM_gesture_box_invoke;
ot->exec = view_ghost_border_exec;
- ot->modal = WM_gesture_border_modal;
+ ot->modal = WM_gesture_box_modal;
ot->poll = sequencer_view_preview_poll;
- ot->cancel = WM_gesture_border_cancel;
+ ot->cancel = WM_gesture_box_cancel;
/* flags */
ot->flag = 0;
/* rna */
- WM_operator_properties_gesture_border(ot);
+ WM_operator_properties_gesture_box(ot);
}
/* rebuild_proxy operator */
@@ -3518,7 +3529,7 @@ void SEQUENCER_OT_rebuild_proxy(wmOperatorType *ot)
static int sequencer_enable_proxies_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
- return WM_operator_props_dialog_popup(C, op, 10 * UI_UNIT_X, 5 * UI_UNIT_Y);
+ return WM_operator_props_dialog_popup(C, op, 200, 100);
}
static int sequencer_enable_proxies_exec(bContext *C, wmOperator *op)
diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h b/source/blender/editors/space_sequencer/sequencer_intern.h
index ef1559ca940..0d647c883be 100644
--- a/source/blender/editors/space_sequencer/sequencer_intern.h
+++ b/source/blender/editors/space_sequencer/sequencer_intern.h
@@ -148,7 +148,7 @@ void SEQUENCER_OT_select_linked(struct wmOperatorType *ot);
void SEQUENCER_OT_select_linked_pick(struct wmOperatorType *ot);
void SEQUENCER_OT_select_handles(struct wmOperatorType *ot);
void SEQUENCER_OT_select_active_side(struct wmOperatorType *ot);
-void SEQUENCER_OT_select_border(struct wmOperatorType *ot);
+void SEQUENCER_OT_select_box(struct wmOperatorType *ot);
void SEQUENCER_OT_select_inverse(struct wmOperatorType *ot);
void SEQUENCER_OT_select_grouped(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c
index bf1804955d7..cdba163f574 100644
--- a/source/blender/editors/space_sequencer/sequencer_ops.c
+++ b/source/blender/editors/space_sequencer/sequencer_ops.c
@@ -106,7 +106,7 @@ void sequencer_operatortypes(void)
WM_operatortype_append(SEQUENCER_OT_select_linked);
WM_operatortype_append(SEQUENCER_OT_select_handles);
WM_operatortype_append(SEQUENCER_OT_select_active_side);
- WM_operatortype_append(SEQUENCER_OT_select_border);
+ WM_operatortype_append(SEQUENCER_OT_select_box);
WM_operatortype_append(SEQUENCER_OT_select_grouped);
/* sequencer_add.c */
@@ -134,239 +134,14 @@ void sequencer_operatortypes(void)
void sequencer_keymap(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap;
- wmKeyMapItem *kmi;
-
/* Common items ------------------------------------------------------------------ */
- keymap = WM_keymap_ensure(keyconf, "SequencerCommon", SPACE_SEQ, 0);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_properties", NKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", OKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "scene.sequence_editor.show_overlay");
-
- /* operators common to sequence and preview view */
- WM_keymap_add_item(keymap, "SEQUENCER_OT_view_toggle", TABKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_ensure(keyconf, "SequencerCommon", SPACE_SEQ, 0);
/* Strips Region --------------------------------------------------------------- */
- keymap = WM_keymap_ensure(keyconf, "Sequencer", SPACE_SEQ, 0);
-
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_cut", KKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "type", SEQ_CUT_SOFT);
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_cut", KKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "type", SEQ_CUT_HARD);
-
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_mute", HKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_mute", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
-
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_unmute", HKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_unmute", HKEY, KM_PRESS, KM_ALT | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_lock", LKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "SEQUENCER_OT_unlock", LKEY, KM_PRESS, KM_SHIFT | KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_reassign_inputs", RKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_reload", RKEY, KM_PRESS, KM_ALT, 0);
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_reload", RKEY, KM_PRESS, KM_SHIFT | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "adjust_length", true);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_offset_clear", OKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "SEQUENCER_OT_delete", DELKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "SEQUENCER_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0);
-#ifdef __APPLE__
- WM_keymap_add_item(keymap, "SEQUENCER_OT_copy", CKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "SEQUENCER_OT_paste", VKEY, KM_PRESS, KM_OSKEY, 0);
-#endif
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_images_separate", YKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_meta_toggle", TABKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_meta_make", GKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "SEQUENCER_OT_meta_separate", GKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
-#ifdef WITH_INPUT_NDOF
- WM_keymap_add_item(keymap, "SEQUENCER_OT_view_all", NDOF_BUTTON_FIT, KM_PRESS, 0, 0);
-#endif
- WM_keymap_add_item(keymap, "SEQUENCER_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "SEQUENCER_OT_view_frame", PAD0, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_strip_jump", PAGEUPKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "next", true);
- RNA_boolean_set(kmi->ptr, "center", false);
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_strip_jump", PAGEDOWNKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "next", false);
- RNA_boolean_set(kmi->ptr, "center", false);
-
- /* alt for center */
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_strip_jump", PAGEUPKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "next", true);
- RNA_boolean_set(kmi->ptr, "center", true);
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_strip_jump", PAGEDOWNKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "next", false);
- RNA_boolean_set(kmi->ptr, "center", true);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_swap", LEFTARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "side", SEQ_SIDE_LEFT);
- RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_swap", RIGHTARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "side", SEQ_SIDE_RIGHT);
-
- RNA_boolean_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_gap_remove", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "all", false);
- RNA_boolean_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_gap_remove", BACKSPACEKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "all", true);
- WM_keymap_add_item(keymap, "SEQUENCER_OT_gap_insert", EQUALKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "SEQUENCER_OT_swap_inputs", SKEY, KM_PRESS, KM_ALT, 0);
-
- /* multicam editing keyboard layout, switch to camera 1-10 using
- * regular number keys */
- {
- int keys[] = { ONEKEY, TWOKEY, THREEKEY, FOURKEY, FIVEKEY,
- SIXKEY, SEVENKEY, EIGHTKEY, NINEKEY, ZEROKEY };
- int i;
-
- for (i = 1; i <= 10; i++) {
- RNA_int_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_cut_multicam", keys[i - 1], KM_PRESS, 0, 0)->ptr, "camera", i);
- }
- }
-
- /* Mouse selection, a bit verbose :/ */
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "linked_handle", false);
- RNA_enum_set(kmi->ptr, "left_right", SEQ_SELECT_LR_NONE);
- RNA_boolean_set(kmi->ptr, "linked_time", false);
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "linked_handle", false);
- RNA_enum_set(kmi->ptr, "left_right", SEQ_SELECT_LR_NONE);
- RNA_boolean_set(kmi->ptr, "linked_time", false);
-
-
- /* 2.4x method, now use Alt for handles and select the side based on which handle was selected */
-#if 0
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "linked_left", true);
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "linked_right", true);
-
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "linked_left", true);
- RNA_boolean_set(kmi->ptr, "linked_right", true);
-
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT | KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "linked_left", true);
- RNA_boolean_set(kmi->ptr, "linked_right", true);
-
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "linked_left", true);
-
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "linked_right", true);
-#endif
-
- /* 2.5 method, Alt and use selected handle */
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "linked_handle", true);
- RNA_enum_set(kmi->ptr, "left_right", SEQ_SELECT_LR_NONE);
- RNA_boolean_set(kmi->ptr, "linked_time", false);
-
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "linked_handle", true);
- RNA_enum_set(kmi->ptr, "left_right", SEQ_SELECT_LR_NONE);
- RNA_boolean_set(kmi->ptr, "linked_time", false);
-
- /* match action editor */
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "linked_handle", false);
- RNA_enum_set(kmi->ptr, "left_right", SEQ_SELECT_LR_MOUSE); /* grr, these conflict - only use left_right if not over an active seq */
- RNA_boolean_set(kmi->ptr, "linked_time", true);
- /* adjusted since 2.4 */
-
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "linked_handle", false);
- RNA_enum_set(kmi->ptr, "left_right", SEQ_SELECT_LR_NONE);
- RNA_boolean_set(kmi->ptr, "linked_time", true);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "SEQUENCER_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
-
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_select_border", BKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_select_grouped", GKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_menu(keymap, "SEQUENCER_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_menu(keymap, "SEQUENCER_MT_change", CKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_slip", SKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_int", OKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "scene.sequence_editor.overlay_frame");
- RNA_int_set(kmi->ptr, "value", 0);
-
- transform_keymap_for_space(keyconf, keymap, SPACE_SEQ);
-
- /* special markers hotkeys for anim editors: see note in definition of this function */
- ED_marker_keymap_animedit_conflictfree(keymap);
-
+ WM_keymap_ensure(keyconf, "Sequencer", SPACE_SEQ, 0);
/* Preview Region ----------------------------------------------------------- */
- keymap = WM_keymap_ensure(keyconf, "SequencerPreview", SPACE_SEQ, 0);
- WM_keymap_add_item(keymap, "SEQUENCER_OT_view_all_preview", HOMEKEY, KM_PRESS, 0, 0);
-#ifdef WITH_INPUT_NDOF
- WM_keymap_add_item(keymap, "SEQUENCER_OT_view_all_preview", NDOF_BUTTON_FIT, KM_PRESS, 0, 0);
-#endif
-
- WM_keymap_add_item(keymap, "SEQUENCER_OT_view_ghost_border", OKEY, KM_PRESS, 0, 0);
-
- /* would prefer to use numpad keys for job */
- RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD1, KM_PRESS, 0, 0)->ptr, "ratio", 1.0f);
-
- /* Setting zoom levels is not that useful, except for back to zoom level 1, removing keymap because of conflicts for now */
-#if 0
- RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD8, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 8.0f);
- RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD4, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 4.0f);
- RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD2, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 2.0f);
-
- RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD2, KM_PRESS, 0, 0)->ptr, "ratio", 0.5f);
- RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD4, KM_PRESS, 0, 0)->ptr, "ratio", 0.25f);
- RNA_float_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_view_zoom_ratio", PAD8, KM_PRESS, 0, 0)->ptr, "ratio", 0.125f);
-#endif
-
- /* sample */
- WM_keymap_add_item(keymap, "SEQUENCER_OT_sample", ACTIONMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_ensure(keyconf, "SequencerPreview", SPACE_SEQ, 0);
}
void ED_operatormacros_sequencer(void)
diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c
index 5506ccf249a..5fbe134b301 100644
--- a/source/blender/editors/space_sequencer/sequencer_select.c
+++ b/source/blender/editors/space_sequencer/sequencer_select.c
@@ -881,8 +881,8 @@ void SEQUENCER_OT_select_active_side(wmOperatorType *ot)
}
-/* borderselect operator */
-static int sequencer_borderselect_exec(bContext *C, wmOperator *op)
+/* box_select operator */
+static int sequencer_box_select_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
Editing *ed = BKE_sequencer_editing_get(scene, false);
@@ -919,19 +919,19 @@ static int sequencer_borderselect_exec(bContext *C, wmOperator *op)
}
-/* ****** Border Select ****** */
-void SEQUENCER_OT_select_border(wmOperatorType *ot)
+/* ****** Box Select ****** */
+void SEQUENCER_OT_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
- ot->idname = "SEQUENCER_OT_select_border";
- ot->description = "Select strips using border selection";
+ ot->name = "Box Select";
+ ot->idname = "SEQUENCER_OT_select_box";
+ ot->description = "Select strips using box selection";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
- ot->exec = sequencer_borderselect_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = sequencer_box_select_exec;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = ED_operator_sequencer_active;
@@ -939,7 +939,7 @@ void SEQUENCER_OT_select_border(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* rna */
- WM_operator_properties_gesture_border_select(ot);
+ WM_operator_properties_gesture_box_select(ot);
}
/* ****** Selected Grouped ****** */
@@ -1151,7 +1151,7 @@ static bool select_grouped_effect_link(Editing *ed, Sequence *actseq, const int
}
SEQ_END;
- actseq->tmp = SET_INT_IN_POINTER(true);
+ actseq->tmp = POINTER_FROM_INT(true);
for (BKE_sequence_iterator_begin(ed, &iter, true); iter.valid; BKE_sequence_iterator_next(&iter)) {
seq = iter.seq;
@@ -1167,7 +1167,7 @@ static bool select_grouped_effect_link(Editing *ed, Sequence *actseq, const int
continue;
}
- /* If the seq is an effect one, we need extra cheking! */
+ /* If the seq is an effect one, we need extra checking! */
if (SEQ_IS_EFFECT(seq) && ((seq->seq1 && seq->seq1->tmp) ||
(seq->seq2 && seq->seq2->tmp) ||
(seq->seq3 && seq->seq3->tmp)))
@@ -1176,7 +1176,7 @@ static bool select_grouped_effect_link(Editing *ed, Sequence *actseq, const int
if (enddisp < seq->enddisp) enddisp = seq->enddisp;
if (machine < seq->machine) machine = seq->machine;
- seq->tmp = SET_INT_IN_POINTER(true);
+ seq->tmp = POINTER_FROM_INT(true);
seq->flag |= SELECT;
changed = true;
@@ -1186,7 +1186,7 @@ static bool select_grouped_effect_link(Editing *ed, Sequence *actseq, const int
BKE_sequence_iterator_begin(ed, &iter, true);
}
- /* Video strips bellow active one, or any strip for audio (order do no matters here!). */
+ /* Video strips below active one, or any strip for audio (order do no matters here!). */
else if (seq->machine < machine || is_audio) {
seq->flag |= SELECT;
changed = true;
diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c
index c5d5a9695f8..092911cb7c2 100644
--- a/source/blender/editors/space_sequencer/space_sequencer.c
+++ b/source/blender/editors/space_sequencer/space_sequencer.c
@@ -42,10 +42,10 @@
#include "BLI_utildefines.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_screen.h"
#include "BKE_sequencer.h"
-#include "BKE_global.h"
#include "ED_space_api.h"
#include "ED_screen.h"
@@ -537,12 +537,9 @@ static void sequencer_main_region_listener(
static void sequencer_main_region_message_subscribe(
const struct bContext *UNUSED(C),
struct WorkSpace *UNUSED(workspace), struct Scene *scene,
- struct bScreen *screen, struct ScrArea *sa, struct ARegion *ar,
+ struct bScreen *UNUSED(screen), struct ScrArea *UNUSED(sa), struct ARegion *ar,
struct wmMsgBus *mbus)
{
- PointerRNA ptr;
- RNA_pointer_create(&screen->id, &RNA_SpaceSequenceEditor, sa->spacedata.first, &ptr);
-
wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
.owner = ar,
.user_data = ar,
@@ -572,6 +569,24 @@ static void sequencer_main_region_message_subscribe(
WM_msg_subscribe_rna(mbus, &idptr, props[i], &msg_sub_value_region_tag_redraw, __func__);
}
}
+
+ {
+ StructRNA *type_array[] = {
+ &RNA_SequenceEditor,
+
+ &RNA_Sequence,
+ /* Members of 'Sequence'. */
+ &RNA_SequenceCrop,
+ &RNA_SequenceTransform,
+ &RNA_SequenceModifier,
+ &RNA_SequenceColorBalanceData,
+ };
+ wmMsgParams_RNA msg_key_params = {{{0}}};
+ for (int i = 0; i < ARRAY_SIZE(type_array); i++) {
+ msg_key_params.ptr.type = type_array[i];
+ WM_msg_subscribe_rna_params(mbus, &msg_key_params, &msg_sub_value_region_tag_redraw, __func__);
+ }
+ }
}
/* *********************** header region ************************ */
@@ -638,7 +653,9 @@ static void sequencer_preview_region_draw(const bContext *C, ARegion *ar)
if ((U.uiflag & USER_SHOW_FPS) && ED_screen_animation_no_scrub(wm)) {
rcti rect;
ED_region_visible_rect(ar, &rect);
- ED_scene_draw_fps(scene, &rect);
+ int xoffset = rect.xmin + U.widget_unit;
+ int yoffset = rect.xmax;
+ ED_scene_draw_fps(scene, xoffset, &yoffset);
}
}
@@ -667,7 +684,7 @@ static void sequencer_preview_region_listener(
case NC_ANIMATION:
switch (wmn->data) {
case ND_KEYFRAME:
- /* Otherwise, often prevents seing immediately effects of keyframe editing... */
+ /* Otherwise, often prevents seeing immediately effects of keyframe editing... */
BKE_sequencer_cache_cleanup();
ED_region_tag_redraw(ar);
break;
diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c
index 7f2ce59361e..27b75f49b44 100644
--- a/source/blender/editors/space_text/space_text.c
+++ b/source/blender/editors/space_text/space_text.c
@@ -241,160 +241,8 @@ static void text_operatortypes(void)
static void text_keymap(struct wmKeyConfig *keyconf)
{
- wmKeyMap *keymap;
- wmKeyMapItem *kmi;
-
- keymap = WM_keymap_ensure(keyconf, "Text Generic", SPACE_TEXT, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_start_find", FKEY, KM_PRESS, KM_CTRL, 0);
-#ifdef __APPLE__
- WM_keymap_add_item(keymap, "TEXT_OT_start_find", FKEY, KM_PRESS, KM_OSKEY, 0);
-#endif
- WM_keymap_add_item(keymap, "TEXT_OT_jump", JKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_find", GKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_replace", HKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_properties", TKEY, KM_PRESS, KM_CTRL, 0);
-
- keymap = WM_keymap_ensure(keyconf, "Text", SPACE_TEXT, 0);
-
-#ifdef __APPLE__
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", LEFTARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", LINE_BEGIN);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", RIGHTARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", LINE_END);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", LEFTARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "type", PREV_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", RIGHTARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "type", NEXT_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", UPARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", FILE_TOP);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", DOWNARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", FILE_BOTTOM);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", LEFTARROWKEY, KM_PRESS, KM_SHIFT | KM_OSKEY, 0)->ptr, "type", LINE_BEGIN);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT | KM_OSKEY, 0)->ptr, "type", LINE_END);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", LEFTARROWKEY, KM_PRESS, KM_SHIFT | KM_ALT, 0)->ptr, "type", PREV_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT | KM_ALT, 0)->ptr, "type", NEXT_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", UPARROWKEY, KM_PRESS, KM_SHIFT | KM_OSKEY, 0)->ptr, "type", FILE_TOP);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", DOWNARROWKEY, KM_PRESS, KM_SHIFT | KM_OSKEY, 0)->ptr, "type", FILE_BOTTOM);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_ALT, 0)->ptr, "type", DEL_PREV_WORD);
-
- WM_keymap_add_item(keymap, "TEXT_OT_save", SKEY, KM_PRESS, KM_ALT | KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_save_as", SKEY, KM_PRESS, KM_ALT | KM_SHIFT | KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_cut", XKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_copy", CKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_paste", VKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_find_set_selected", EKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_select_all", AKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_select_line", AKEY, KM_PRESS, KM_SHIFT | KM_OSKEY, 0);
-#endif
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", WHEELUPMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.font_size");
- RNA_boolean_set(kmi->ptr, "reverse", false);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", WHEELDOWNMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.font_size");
- RNA_boolean_set(kmi->ptr, "reverse", true);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.font_size");
- RNA_boolean_set(kmi->ptr, "reverse", false);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_cycle_int", PADMINUS, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "space_data.font_size");
- RNA_boolean_set(kmi->ptr, "reverse", true);
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "TEXT_OT_new", NKEY, KM_PRESS, KM_CTRL, 0);
-#else
- WM_keymap_add_item(keymap, "TEXT_OT_new", NKEY, KM_PRESS, KM_ALT, 0);
-#endif
- WM_keymap_add_item(keymap, "TEXT_OT_open", OKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_reload", RKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_save", SKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_save_as", SKEY, KM_PRESS, KM_ALT | KM_SHIFT | KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "TEXT_OT_run_script", PKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "TEXT_OT_cut", XKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "TEXT_OT_cut", DELKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_copy", INSERTKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_paste", INSERTKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "TEXT_OT_duplicate_line", DKEY, KM_PRESS, KM_CTRL, 0);
-
- if (U.uiflag & USER_MMB_PASTE) { // XXX not dynamic
- kmi = WM_keymap_add_item(keymap, "TEXT_OT_paste", MIDDLEMOUSE, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "selection", true);
- }
-
- WM_keymap_add_item(keymap, "TEXT_OT_select_all", AKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_select_line", AKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_select_word", LEFTMOUSE, KM_DBL_CLICK, 0, 0);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_lines", UPARROWKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0)->ptr, "direction", TXT_MOVE_LINE_UP);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_lines", DOWNARROWKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0)->ptr, "direction", TXT_MOVE_LINE_DOWN);
-
- WM_keymap_add_item(keymap, "TEXT_OT_indent", TABKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_unindent", TABKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_uncomment", DKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", HOMEKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_BEGIN);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", ENDKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_END);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", EKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", LINE_END);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", EKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0)->ptr, "type", LINE_END);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", LEFTARROWKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_CHAR);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", RIGHTARROWKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_CHAR);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", LEFTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", PREV_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", RIGHTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", NEXT_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", UPARROWKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_LINE);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_LINE);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_PAGE);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", PAGEDOWNKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_PAGE);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", HOMEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", FILE_TOP);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", ENDKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", FILE_BOTTOM);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", HOMEKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", LINE_BEGIN);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", ENDKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", LINE_END);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", LEFTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", PREV_CHAR);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", NEXT_CHAR);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", LEFTARROWKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0)->ptr, "type", PREV_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0)->ptr, "type", NEXT_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", UPARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", PREV_LINE);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", DOWNARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", NEXT_LINE);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", PAGEUPKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", PREV_PAGE);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", NEXT_PAGE);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", HOMEKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0)->ptr, "type", FILE_TOP);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", ENDKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0)->ptr, "type", FILE_BOTTOM);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", DELKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_NEXT_CHAR);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_PREV_CHAR);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", DEL_PREV_CHAR); /* same as above [#26623] */
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", DELKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_NEXT_WORD);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_PREV_WORD);
-
- WM_keymap_add_item(keymap, "TEXT_OT_overwrite_toggle", INSERTKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "TEXT_OT_scroll_bar", LEFTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_scroll_bar", MIDDLEMOUSE, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "TEXT_OT_scroll", MIDDLEMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_scroll", MOUSEPAN, 0, 0, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_selection_set", EVT_TWEAK_L, KM_ANY, 0, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_cursor_set", LEFTMOUSE, KM_PRESS, 0, 0);
- kmi = WM_keymap_add_item(keymap, "TEXT_OT_selection_set", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "select", true);
- RNA_int_set(WM_keymap_add_item(keymap, "TEXT_OT_scroll", WHEELUPMOUSE, KM_PRESS, 0, 0)->ptr, "lines", -1);
- RNA_int_set(WM_keymap_add_item(keymap, "TEXT_OT_scroll", WHEELDOWNMOUSE, KM_PRESS, 0, 0)->ptr, "lines", 1);
-
- WM_keymap_add_item(keymap, "TEXT_OT_line_break", RETKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_line_break", PADENTER, KM_PRESS, 0, 0);
-
- WM_keymap_add_menu(keymap, "TEXT_MT_toolbox", RIGHTMOUSE, KM_PRESS, KM_ANY, 0);
-
- WM_keymap_add_item(keymap, "TEXT_OT_autocomplete", SPACEKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "TEXT_OT_line_number", KM_TEXTINPUT, KM_ANY, KM_ANY, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last!
+ WM_keymap_ensure(keyconf, "Text Generic", SPACE_TEXT, 0);
+ WM_keymap_ensure(keyconf, "Text", SPACE_TEXT, 0);
}
const char *text_context_dir[] = {"edit_text", NULL};
diff --git a/source/blender/editors/space_text/text_format_lua.c b/source/blender/editors/space_text/text_format_lua.c
index 8b6ec2d804b..2a92f9a4d7d 100644
--- a/source/blender/editors/space_text/text_format_lua.c
+++ b/source/blender/editors/space_text/text_format_lua.c
@@ -69,7 +69,7 @@ static int txtfmt_lua_find_keyword(const char *string)
else if (STR_LITERAL_STARTSWITH(string, "while", len)) i = len;
else i = 0;
- /* If next source char is an identifier (eg. 'i' in "definate") no match */
+ /* If next source char is an identifier (eg. 'i' in "definite") no match */
if (i == 0 || text_check_identifier(string[i]))
return -1;
return i;
@@ -120,7 +120,7 @@ static int txtfmt_lua_find_specialvar(const char *string)
else if (STR_LITERAL_STARTSWITH(string, "xpcall", len)) i = len;
else i = 0;
- /* If next source char is an identifier (eg. 'i' in "definate") no match */
+ /* If next source char is an identifier (eg. 'i' in "definite") no match */
if (i == 0 || text_check_identifier(string[i]))
return -1;
return i;
diff --git a/source/blender/editors/space_text/text_format_osl.c b/source/blender/editors/space_text/text_format_osl.c
index 2daaaa348e6..2b2dfef72d3 100644
--- a/source/blender/editors/space_text/text_format_osl.c
+++ b/source/blender/editors/space_text/text_format_osl.c
@@ -66,7 +66,7 @@ static int txtfmt_osl_find_builtinfunc(const char *string)
else if (STR_LITERAL_STARTSWITH(string, "while", len)) i = len;
else i = 0;
- /* If next source char is an identifier (eg. 'i' in "definate") no match */
+ /* If next source char is an identifier (eg. 'i' in "definite") no match */
if (i == 0 || text_check_identifier(string[i]))
return -1;
return i;
@@ -116,7 +116,7 @@ static int txtfmt_osl_find_reserved(const char *string)
else if (STR_LITERAL_STARTSWITH(string, "volatile", len)) i = len;
else i = 0;
- /* If next source char is an identifier (eg. 'i' in "definate") no match */
+ /* If next source char is an identifier (eg. 'i' in "definite") no match */
if (i == 0 || text_check_identifier(string[i]))
return -1;
return i;
@@ -140,7 +140,7 @@ static int txtfmt_osl_find_specialvar(const char *string)
else if (STR_LITERAL_STARTSWITH(string, "displacement", len)) i = len;
else i = 0;
- /* If next source char is an identifier (eg. 'i' in "definate") no match */
+ /* If next source char is an identifier (eg. 'i' in "definite") no match */
if (i == 0 || text_check_identifier(string[i]))
return -1;
return i;
diff --git a/source/blender/editors/space_text/text_format_pov.c b/source/blender/editors/space_text/text_format_pov.c
index 4c9abecedd6..f6b6d4f8d42 100644
--- a/source/blender/editors/space_text/text_format_pov.c
+++ b/source/blender/editors/space_text/text_format_pov.c
@@ -83,7 +83,7 @@ static int txtfmt_pov_find_keyword(const char *string)
else if (STR_LITERAL_STARTSWITH(string, "if", len)) i = len;
else i = 0;
- /* If next source char is an identifier (eg. 'i' in "definate") no match */
+ /* If next source char is an identifier (eg. 'i' in "definite") no match */
return (i == 0 || text_check_identifier(string[i])) ? -1 : i;
}
@@ -236,7 +236,7 @@ static int txtfmt_pov_find_reserved_keywords(const char *string)
else if (STR_LITERAL_STARTSWITH(string, "str", len)) i = len;
else i = 0;
- /* If next source char is an identifier (eg. 'i' in "definate") no match */
+ /* If next source char is an identifier (eg. 'i' in "definite") no match */
return (i == 0 || text_check_identifier(string[i])) ? -1 : i;
}
@@ -466,7 +466,7 @@ static int txtfmt_pov_find_reserved_builtins(const char *string)
else if (STR_LITERAL_STARTSWITH(string, "z", len)) i = len;
else i = 0;
- /* If next source char is an identifier (eg. 'i' in "definate") no match */
+ /* If next source char is an identifier (eg. 'i' in "definite") no match */
return (i == 0 || text_check_identifier(string[i])) ? -1 : i;
}
@@ -683,7 +683,7 @@ static int txtfmt_pov_find_specialvar(const char *string)
else if (STR_LITERAL_STARTSWITH(string, "gall", len)) i = len;
else i = 0;
- /* If next source char is an identifier (eg. 'i' in "definate") no match */
+ /* If next source char is an identifier (eg. 'i' in "definite") no match */
return (i == 0 || text_check_identifier(string[i])) ? -1 : i;
}
diff --git a/source/blender/editors/space_text/text_format_pov_ini.c b/source/blender/editors/space_text/text_format_pov_ini.c
index 453dd1d748c..ae7d784dffc 100644
--- a/source/blender/editors/space_text/text_format_pov_ini.c
+++ b/source/blender/editors/space_text/text_format_pov_ini.c
@@ -93,7 +93,7 @@ static int txtfmt_ini_find_keyword(const char *string)
else i = 0;
- /* If next source char is an identifier (eg. 'i' in "definate") no match */
+ /* If next source char is an identifier (eg. 'i' in "definite") no match */
return (i == 0 || text_check_identifier(string[i])) ? -1 : i;
}
@@ -299,7 +299,7 @@ static int txtfmt_ini_find_reserved(const char *string)
else i = 0;
- /* If next source char is an identifier (eg. 'i' in "definate") no match */
+ /* If next source char is an identifier (eg. 'i' in "definite") no match */
return (i == 0 || text_check_identifier(string[i])) ? -1 : i;
}
diff --git a/source/blender/editors/space_text/text_format_py.c b/source/blender/editors/space_text/text_format_py.c
index 2f6962f0493..50bad9c07cf 100644
--- a/source/blender/editors/space_text/text_format_py.c
+++ b/source/blender/editors/space_text/text_format_py.c
@@ -62,6 +62,8 @@ static int txtfmt_py_find_builtinfunc(const char *string)
if (STR_LITERAL_STARTSWITH(string, "and", len)) i = len;
else if (STR_LITERAL_STARTSWITH(string, "as", len)) i = len;
else if (STR_LITERAL_STARTSWITH(string, "assert", len)) i = len;
+ else if (STR_LITERAL_STARTSWITH(string, "async", len)) i = len;
+ else if (STR_LITERAL_STARTSWITH(string, "await", len)) i = len;
else if (STR_LITERAL_STARTSWITH(string, "break", len)) i = len;
else if (STR_LITERAL_STARTSWITH(string, "continue", len)) i = len;
else if (STR_LITERAL_STARTSWITH(string, "del", len)) i = len;
@@ -89,7 +91,7 @@ static int txtfmt_py_find_builtinfunc(const char *string)
else if (STR_LITERAL_STARTSWITH(string, "yield", len)) i = len;
else i = 0;
- /* If next source char is an identifier (eg. 'i' in "definate") no match */
+ /* If next source char is an identifier (eg. 'i' in "definite") no match */
if (i == 0 || text_check_identifier(string[i]))
return -1;
return i;
@@ -110,7 +112,7 @@ static int txtfmt_py_find_specialvar(const char *string)
else if (STR_LITERAL_STARTSWITH(string, "class", len)) i = len;
else i = 0;
- /* If next source char is an identifier (eg. 'i' in "definate") no match */
+ /* If next source char is an identifier (eg. 'i' in "definite") no match */
if (i == 0 || text_check_identifier(string[i]))
return -1;
return i;
diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c
index a8c14a3d4c1..8d8d98135e5 100644
--- a/source/blender/editors/space_text/text_ops.c
+++ b/source/blender/editors/space_text/text_ops.c
@@ -1949,7 +1949,7 @@ static int text_jump_exec(bContext *C, wmOperator *op)
static int text_jump_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
- return WM_operator_props_dialog_popup(C, op, 10 * UI_UNIT_X, 5 * UI_UNIT_Y);
+ return WM_operator_props_dialog_popup(C, op, 200, 100);
}
@@ -3196,7 +3196,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 possibilites. */
+ /* modified locally and externally, ahhh. offer more possibilities. */
pup = UI_popup_menu_begin(C, IFACE_("File Modified Outside and Inside Blender"), ICON_NONE);
layout = UI_popup_menu_layout(pup);
uiItemEnumO_ptr(layout, op->type, IFACE_("Reload from disk (ignore local changes)"),
diff --git a/source/blender/editors/space_text/text_undo.c b/source/blender/editors/space_text/text_undo.c
index 729522cc8f4..b8ae9972eec 100644
--- a/source/blender/editors/space_text/text_undo.c
+++ b/source/blender/editors/space_text/text_undo.c
@@ -37,7 +37,6 @@
#include "PIL_time.h"
#include "BKE_context.h"
-#include "BKE_library.h"
#include "BKE_report.h"
#include "BKE_text.h"
#include "BKE_undo_system.h"
diff --git a/source/blender/editors/space_time/time_ops.c b/source/blender/editors/space_time/time_ops.c
index a68bd2a9fbb..6962af52bb1 100644
--- a/source/blender/editors/space_time/time_ops.c
+++ b/source/blender/editors/space_time/time_ops.c
@@ -214,13 +214,5 @@ void time_operatortypes(void)
void time_keymap(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Timeline", SPACE_TIME, 0);
-
- WM_keymap_add_item(keymap, "TIME_OT_start_frame_set", SKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "TIME_OT_end_frame_set", EKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "TIME_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
-#ifdef WITH_INPUT_NDOF
- WM_keymap_add_item(keymap, "TIME_OT_view_all", NDOF_BUTTON_FIT, KM_PRESS, 0, 0);
-#endif
- WM_keymap_add_item(keymap, "TIME_OT_view_frame", PAD0, KM_PRESS, 0, 0);
+ WM_keymap_ensure(keyconf, "Timeline", SPACE_TIME, 0);
}
diff --git a/source/blender/editors/space_topbar/space_topbar.c b/source/blender/editors/space_topbar/space_topbar.c
index db75545fbd6..567a733309c 100644
--- a/source/blender/editors/space_topbar/space_topbar.c
+++ b/source/blender/editors/space_topbar/space_topbar.c
@@ -180,6 +180,14 @@ static void topbar_header_listener(wmWindow *UNUSED(win), ScrArea *UNUSED(sa), A
{
/* context changes */
switch (wmn->category) {
+ case NC_WM:
+ if (wmn->data == ND_JOB)
+ ED_region_tag_redraw(ar);
+ break;
+ case NC_SPACE:
+ if (wmn->data == ND_SPACE_INFO)
+ ED_region_tag_redraw(ar);
+ break;
case NC_SCREEN:
if (wmn->data == ND_LAYER)
ED_region_tag_redraw(ar);
diff --git a/source/blender/editors/space_view3d/CMakeLists.txt b/source/blender/editors/space_view3d/CMakeLists.txt
index 4bcec142aa9..0d30d623b8d 100644
--- a/source/blender/editors/space_view3d/CMakeLists.txt
+++ b/source/blender/editors/space_view3d/CMakeLists.txt
@@ -44,7 +44,6 @@ set(INC_SYS
set(SRC
drawobject.c
- drawvolume.c
space_view3d.c
view3d_buttons.c
view3d_camera_control.c
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 616095188bb..9a73ef25819 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -27,93 +27,31 @@
* \ingroup spview3d
*/
-#include "MEM_guardedalloc.h"
-
-#include "DNA_camera_types.h"
-#include "DNA_curve_types.h"
-#include "DNA_constraint_types.h" /* for drawing constraint */
-#include "DNA_lamp_types.h"
-#include "DNA_lattice_types.h"
-#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
-#include "DNA_meta_types.h"
-#include "DNA_rigidbody_types.h"
#include "DNA_scene_types.h"
-#include "DNA_smoke_types.h"
-#include "DNA_world_types.h"
#include "DNA_object_types.h"
-#include "BLI_listbase.h"
-#include "BLI_link_utils.h"
-#include "BLI_string.h"
#include "BLI_math.h"
-#include "BLI_memarena.h"
-
-#include "BKE_anim.h" /* for the where_on_path function */
-#include "BKE_armature.h"
-#include "BKE_camera.h"
-#include "BKE_colortools.h"
-#include "BKE_constraint.h" /* for the get_constraint_target function */
-#include "BKE_context.h"
-#include "BKE_curve.h"
+
#include "BKE_DerivedMesh.h"
-#include "BKE_deform.h"
-#include "BKE_displist.h"
-#include "BKE_font.h"
#include "BKE_global.h"
-#include "BKE_image.h"
-#include "BKE_key.h"
-#include "BKE_layer.h"
-#include "BKE_lattice.h"
-#include "BKE_main.h"
-#include "BKE_mesh.h"
-#include "BKE_mesh_runtime.h"
-#include "BKE_material.h"
-#include "BKE_mball.h"
-#include "BKE_modifier.h"
-#include "BKE_movieclip.h"
-#include "BKE_object.h"
-#include "BKE_paint.h"
-#include "BKE_particle.h"
-#include "BKE_pointcache.h"
-#include "BKE_scene.h"
-#include "BKE_subsurf.h"
-#include "BKE_unit.h"
-#include "BKE_tracking.h"
-#include "BKE_gpencil.h"
#include "BKE_editmesh.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
-#include "IMB_imbuf.h"
-#include "IMB_imbuf_types.h"
-
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
-
#include "GPU_draw.h"
-#include "GPU_select.h"
#include "GPU_shader.h"
#include "GPU_immediate.h"
-#include "GPU_immediate_util.h"
#include "GPU_batch.h"
#include "GPU_matrix.h"
#include "GPU_state.h"
#include "GPU_framebuffer.h"
#include "ED_mesh.h"
-#include "ED_particle.h"
-#include "ED_screen.h"
-#include "ED_sculpt.h"
-#include "ED_types.h"
#include "UI_resources.h"
-#include "UI_interface_icons.h"
-
-#include "WM_api.h"
-#include "BLF_api.h"
#include "view3d_intern.h" /* bad level include */
@@ -258,92 +196,15 @@ bool view3d_camera_border_hack_test = false;
/* ***************** BACKBUF SEL (BBS) ********* */
-#ifdef USE_MESH_DM_SELECT
-static void bbs_obmode_mesh_verts__mapFunc(void *userData, int index, const float co[3],
- const float UNUSED(no_f[3]), const short UNUSED(no_s[3]))
-{
- drawMVertOffset_userData *data = userData;
- MVert *mv = &data->mvert[index];
-
- if (!(mv->flag & ME_HIDE)) {
- int selcol;
- GPU_select_index_get(data->offset + index, &selcol);
- immAttrib1u(data->col, selcol);
- immVertex3fv(data->pos, co);
- }
-}
-
-static void bbs_obmode_mesh_verts(Object *ob, DerivedMesh *dm, int offset)
-{
- drawMVertOffset_userData data;
- Mesh *me = ob->data;
- MVert *mvert = me->mvert;
- data.mvert = mvert;
- data.offset = offset;
-
- const int imm_len = dm->getNumVerts(dm);
-
- if (imm_len == 0) return;
-
- GPUVertFormat *format = immVertexFormat();
- data.pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
- data.col = GPU_vertformat_attr_add(format, "color", GPU_COMP_U32, 1, GPU_FETCH_INT);
-
- immBindBuiltinProgram(GPU_SHADER_3D_FLAT_COLOR_U32);
-
- GPU_point_size(UI_GetThemeValuef(TH_VERTEX_SIZE));
-
- immBeginAtMost(GPU_PRIM_POINTS, imm_len);
- dm->foreachMappedVert(dm, bbs_obmode_mesh_verts__mapFunc, &data, DM_FOREACH_NOP);
- immEnd();
-
- immUnbindProgram();
-}
-#else
-static void bbs_obmode_mesh_verts(Object *ob, DerivedMesh *UNUSED(dm), int offset)
+static void bbs_obmode_mesh_verts(Object *ob, int offset)
{
Mesh *me = ob->data;
GPUBatch *batch = DRW_mesh_batch_cache_get_verts_with_select_id(me, offset);
GPU_batch_program_set_builtin(batch, GPU_SHADER_3D_FLAT_COLOR_U32);
GPU_batch_draw(batch);
}
-#endif
-
-#ifdef USE_MESH_DM_SELECT
-static void bbs_mesh_verts__mapFunc(void *userData, int index, const float co[3],
- const float UNUSED(no_f[3]), const short UNUSED(no_s[3]))
-{
- drawBMOffset_userData *data = userData;
- BMVert *eve = BM_vert_at_index(data->bm, index);
-
- if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
- int selcol;
- GPU_select_index_get(data->offset + index, &selcol);
- immAttrib1u(data->col, selcol);
- immVertex3fv(data->pos, co);
- }
-}
-static void bbs_mesh_verts(BMEditMesh *em, DerivedMesh *dm, int offset)
-{
- drawBMOffset_userData data;
- data.bm = em->bm;
- data.offset = offset;
- GPUVertFormat *format = immVertexFormat();
- data.pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
- data.col = GPU_vertformat_attr_add(format, "color", GPU_COMP_U32, 1, GPU_FETCH_INT);
- immBindBuiltinProgram(GPU_SHADER_3D_FLAT_COLOR_U32);
-
- GPU_point_size(UI_GetThemeValuef(TH_VERTEX_SIZE));
-
- immBeginAtMost(GPU_PRIM_POINTS, em->bm->totvert);
- dm->foreachMappedVert(dm, bbs_mesh_verts__mapFunc, &data, DM_FOREACH_NOP);
- immEnd();
-
- immUnbindProgram();
-}
-#else
-static void bbs_mesh_verts(BMEditMesh *em, DerivedMesh *UNUSED(dm), int offset)
+static void bbs_mesh_verts(BMEditMesh *em, int offset)
{
GPU_point_size(UI_GetThemeValuef(TH_VERTEX_SIZE));
@@ -352,50 +213,8 @@ static void bbs_mesh_verts(BMEditMesh *em, DerivedMesh *UNUSED(dm), int offset)
GPU_batch_program_set_builtin(batch, GPU_SHADER_3D_FLAT_COLOR_U32);
GPU_batch_draw(batch);
}
-#endif
-#ifdef USE_MESH_DM_SELECT
-static void bbs_mesh_wire__mapFunc(void *userData, int index, const float v0co[3], const float v1co[3])
-{
- drawBMOffset_userData *data = userData;
- BMEdge *eed = BM_edge_at_index(data->bm, index);
-
- if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
- int selcol;
- GPU_select_index_get(data->offset + index, &selcol);
- immAttrib1u(data->col, selcol);
- immVertex3fv(data->pos, v0co);
- immVertex3fv(data->pos, v1co);
- }
-}
-
-static void bbs_mesh_wire(BMEditMesh *em, DerivedMesh *dm, int offset)
-{
- drawBMOffset_userData data;
- data.bm = em->bm;
- data.offset = offset;
-
- GPUVertFormat *format = immVertexFormat();
-
- const int imm_len = dm->getNumEdges(dm) * 2;
-
- if (imm_len == 0) return;
-
- data.pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
- data.col = GPU_vertformat_attr_add(format, "color", GPU_COMP_U32, 1, GPU_FETCH_INT);
-
- immBindBuiltinProgram(GPU_SHADER_3D_FLAT_COLOR_U32);
-
- GPU_line_width(1.0f);
-
- immBeginAtMost(GPU_PRIM_LINES, imm_len);
- dm->foreachMappedEdge(dm, bbs_mesh_wire__mapFunc, &data);
- immEnd();
-
- immUnbindProgram();
-}
-#else
-static void bbs_mesh_wire(BMEditMesh *em, DerivedMesh *UNUSED(dm), int offset)
+static void bbs_mesh_wire(BMEditMesh *em, int offset)
{
GPU_line_width(1.0f);
@@ -404,63 +223,8 @@ static void bbs_mesh_wire(BMEditMesh *em, DerivedMesh *UNUSED(dm), int offset)
GPU_batch_program_set_builtin(batch, GPU_SHADER_3D_FLAT_COLOR_U32);
GPU_batch_draw(batch);
}
-#endif
-#ifdef USE_MESH_DM_SELECT
-static void bbs_mesh_face(BMEditMesh *em, DerivedMesh *dm, const bool use_select)
-{
- UNUSED_VARS(dm);
-
- drawBMOffset_userData data;
- data.bm = em->bm;
-
- const int tri_len = em->tottri;
- const int imm_len = tri_len * 3;
- const char hflag_skip = use_select ? BM_ELEM_HIDDEN : (BM_ELEM_HIDDEN | BM_ELEM_SELECT);
-
- if (imm_len == 0) return;
-
- GPUVertFormat *format = immVertexFormat();
- data.pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
- data.col = GPU_vertformat_attr_add(format, "color", GPU_COMP_U32, 1, GPU_FETCH_INT);
-
- immBindBuiltinProgram(GPU_SHADER_3D_FLAT_COLOR_U32);
-
- immBeginAtMost(GPU_PRIM_TRIS, imm_len);
-
- if (use_select == false) {
- int selcol;
- GPU_select_index_get(0, &selcol);
- immAttrib1u(data.col, selcol);
- }
-
- int index = 0;
- while (index < tri_len) {
- const BMFace *f = em->looptris[index][0]->f;
- const int ntris = f->len - 2;
- if (!BM_elem_flag_test(f, hflag_skip)) {
- if (use_select) {
- int selcol;
- GPU_select_index_get(BM_elem_index_get(f) + 1, &selcol);
- immAttrib1u(data.col, selcol);
- }
- for (int t = 0; t < ntris; t++) {
- immVertex3fv(data.pos, em->looptris[index][0]->v->co);
- immVertex3fv(data.pos, em->looptris[index][1]->v->co);
- immVertex3fv(data.pos, em->looptris[index][2]->v->co);
- index++;
- }
- }
- else {
- index += ntris;
- }
- }
- immEnd();
-
- immUnbindProgram();
-}
-#else
-static void bbs_mesh_face(BMEditMesh *em, DerivedMesh *UNUSED(dm), const bool use_select)
+static void bbs_mesh_face(BMEditMesh *em, const bool use_select)
{
Mesh *me = em->ob->data;
GPUBatch *batch;
@@ -479,100 +243,31 @@ static void bbs_mesh_face(BMEditMesh *em, DerivedMesh *UNUSED(dm), const bool us
GPU_batch_draw(batch);
}
}
-#endif
-
-#ifdef USE_MESH_DM_SELECT
-static void bbs_mesh_solid__drawCenter(void *userData, int index, const float cent[3], const float UNUSED(no[3]))
-{
- drawBMOffset_userData *data = (drawBMOffset_userData *)userData;
- BMFace *efa = BM_face_at_index(userData, index);
-
- if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
- int selcol;
- GPU_select_index_get(index + 1, &selcol);
- immAttrib1u(data->col, selcol);
- immVertex3fv(data->pos, cent);
- }
-}
-
-static void bbs_mesh_face_dot(BMEditMesh *em, DerivedMesh *dm)
-{
- drawBMOffset_userData data; /* don't use offset */
- data.bm = em->bm;
- GPUVertFormat *format = immVertexFormat();
- data.pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
- data.col = GPU_vertformat_attr_add(format, "color", GPU_COMP_U32, 1, GPU_FETCH_INT);
-
- immBindBuiltinProgram(GPU_SHADER_3D_FLAT_COLOR_U32);
-
- GPU_point_size(UI_GetThemeValuef(TH_FACEDOT_SIZE));
-
- immBeginAtMost(GPU_PRIM_POINTS, em->bm->totface);
- dm->foreachMappedFaceCenter(dm, bbs_mesh_solid__drawCenter, &data, DM_FOREACH_NOP);
- immEnd();
- immUnbindProgram();
-}
-#else
-static void bbs_mesh_face_dot(BMEditMesh *em, DerivedMesh *UNUSED(dm))
+static void bbs_mesh_face_dot(BMEditMesh *em)
{
Mesh *me = em->ob->data;
GPUBatch *batch = DRW_mesh_batch_cache_get_facedots_with_select_id(me, 1);
GPU_batch_program_set_builtin(batch, GPU_SHADER_3D_FLAT_COLOR_U32);
GPU_batch_draw(batch);
}
-#endif
/* two options, facecolors or black */
static void bbs_mesh_solid_EM(BMEditMesh *em, Scene *scene, View3D *v3d,
- Object *ob, DerivedMesh *dm, bool use_faceselect)
+ Object *ob, bool use_faceselect)
{
if (use_faceselect) {
- bbs_mesh_face(em, dm, true);
+ bbs_mesh_face(em, true);
if (check_ob_drawface_dot(scene, v3d, ob->dt)) {
- bbs_mesh_face_dot(em, dm);
+ bbs_mesh_face_dot(em);
}
}
else {
- bbs_mesh_face(em, dm, false);
- }
-}
-
-#ifdef USE_MESH_DM_SELECT
-/* must have called GPU_framebuffer_index_set beforehand */
-static DMDrawOption bbs_mesh_solid_hide2__setDrawOpts(void *userData, int index)
-{
- Mesh *me = userData;
-
- if (!(me->mpoly[index].flag & ME_HIDE)) {
- return DM_DRAW_OPTION_NORMAL;
- }
- else {
- return DM_DRAW_OPTION_SKIP;
+ bbs_mesh_face(em, false);
}
}
-static void bbs_mesh_solid_verts(Depsgraph *depsgraph, Scene *scene, Object *ob)
-{
- Mesh *me = ob->data;
- DerivedMesh *dm = mesh_get_derived_final(depsgraph, scene, ob, scene->customdata_mask);
-
- DM_update_materials(dm, ob);
-
- /* Only draw faces to mask out verts, we don't want their selection ID's. */
- const int G_f_orig = G.f;
- G.f &= ~G_BACKBUFSEL;
-
- dm->drawMappedFaces(dm, bbs_mesh_solid_hide2__setDrawOpts, NULL, NULL, me, DM_DRAW_SKIP_HIDDEN);
-
- G.f |= (G_f_orig & G_BACKBUFSEL);
-
- bbs_obmode_mesh_verts(ob, dm, 1);
- bm_vertoffs = me->totvert + 1;
- dm->release(dm);
-}
-#else
static void bbs_mesh_solid_verts(Depsgraph *UNUSED(depsgraph), Scene *UNUSED(scene), Object *ob)
{
Mesh *me = ob->data;
@@ -593,10 +288,9 @@ static void bbs_mesh_solid_verts(Depsgraph *UNUSED(depsgraph), Scene *UNUSED(sce
G.f |= (G_f_orig & G_BACKBUFSEL);
- bbs_obmode_mesh_verts(ob, NULL, 1);
+ bbs_obmode_mesh_verts(ob, 1);
bm_vertoffs = me->totvert + 1;
}
-#endif
static void bbs_mesh_solid_faces(Scene *UNUSED(scene), Object *ob)
{
@@ -632,13 +326,9 @@ void draw_object_backbufsel(
Mesh *me = ob->data;
BMEditMesh *em = me->edit_btmesh;
- DerivedMesh *dm = editbmesh_get_derived_cage(depsgraph, scene, ob, em, CD_MASK_BAREMESH);
-
BM_mesh_elem_table_ensure(em->bm, BM_VERT | BM_EDGE | BM_FACE);
- DM_update_materials(dm, ob);
-
- bbs_mesh_solid_EM(em, scene, v3d, ob, dm, (select_mode & SCE_SELECT_FACE) != 0);
+ bbs_mesh_solid_EM(em, scene, v3d, ob, (select_mode & SCE_SELECT_FACE) != 0);
if (select_mode & SCE_SELECT_FACE)
bm_solidoffs = 1 + em->bm->totface;
else {
@@ -649,7 +339,7 @@ void draw_object_backbufsel(
/* we draw edges if edge select mode */
if (select_mode & SCE_SELECT_EDGE) {
- bbs_mesh_wire(em, dm, bm_solidoffs);
+ bbs_mesh_wire(em, bm_solidoffs);
bm_wireoffs = bm_solidoffs + em->bm->totedge;
}
else {
@@ -659,7 +349,7 @@ void draw_object_backbufsel(
/* we draw verts if vert select mode. */
if (select_mode & SCE_SELECT_VERTEX) {
- bbs_mesh_verts(em, dm, bm_wireoffs);
+ bbs_mesh_verts(em, bm_wireoffs);
bm_vertoffs = bm_wireoffs + em->bm->totvert;
}
else {
@@ -667,8 +357,6 @@ void draw_object_backbufsel(
}
ED_view3d_polygon_offset(rv3d, 0.0);
-
- dm->release(dm);
}
else {
Mesh *me = ob->data;
@@ -693,128 +381,102 @@ void draw_object_backbufsel(
void ED_draw_object_facemap(
- Depsgraph *depsgraph, Scene *scene, Object *ob, const float col[4], const int facemap)
+ Depsgraph *depsgraph, Object *ob, const float col[4], const int facemap)
{
- DerivedMesh *dm = NULL;
-
/* happens on undo */
- if (ob->type != OB_MESH || !ob->data)
- return;
-
- /* Temporary, happens on undo, would resolve but will eventually move away from DM. */
- if (ob->derivedFinal == NULL) {
+ if (ob->type != OB_MESH || !ob->data) {
return;
}
- dm = mesh_get_derived_final(depsgraph, scene, ob, CD_MASK_BAREMESH);
- if (!dm || !CustomData_has_layer(&dm->polyData, CD_FACEMAP))
- return;
-
-
- glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW);
-
-#if 0
- DM_update_materials(dm, ob);
-
- /* add polygon offset so we draw above the original surface */
- glPolygonOffset(1.0, 1.0);
-
- GPU_facemap_setup(dm);
-
- glColor4fv(col);
-
- gpuPushAttrib(GL_ENABLE_BIT);
- GPU_blend(true);
- glDisable(GL_LIGHTING);
-
- /* always draw using backface culling */
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
-
- if (dm->drawObject->facemapindices) {
- glDrawElements(GL_TRIANGLES, dm->drawObject->facemap_count[facemap] * 3, GL_UNSIGNED_INT,
- (int *)NULL + dm->drawObject->facemap_start[facemap] * 3);
+ Mesh *me = ob->data;
+ {
+ Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
+ if (ob_eval->runtime.mesh_eval) {
+ me = ob_eval->runtime.mesh_eval;
+ }
}
- gpuPopAttrib();
-
- GPU_buffers_unbind();
- glPolygonOffset(0.0, 0.0);
-
-#else
+ glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW);
/* Just to create the data to pass to immediate mode, grr! */
- Mesh *me = ob->data;
const int *facemap_data = CustomData_get_layer(&me->pdata, CD_FACEMAP);
if (facemap_data) {
- GPUVertFormat *format = immVertexFormat();
- uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
-
- immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
- immUniformColor4fv(col);
-
- /* XXX, alpha isn't working yet, not sure why. */
GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
GPU_blend(true);
- MVert *mvert;
+ const MVert *mvert = me->mvert;
+ const MPoly *mpoly = me->mpoly;
+ const MLoop *mloop = me->mloop;
- MPoly *mpoly;
- int mpoly_len;
+ int mpoly_len = me->totpoly;
+ int mloop_len = me->totloop;
- MLoop *mloop;
- int mloop_len;
+ facemap_data = CustomData_get_layer(&me->pdata, CD_FACEMAP);
- if (dm && CustomData_has_layer(&dm->polyData, CD_FACEMAP)) {
- mvert = dm->getVertArray(dm);
- mpoly = dm->getPolyArray(dm);
- mloop = dm->getLoopArray(dm);
-
- mpoly_len = dm->getNumPolys(dm);
- mloop_len = dm->getNumLoops(dm);
-
- facemap_data = CustomData_get_layer(&dm->polyData, CD_FACEMAP);
- }
- else {
- mvert = me->mvert;
- mpoly = me->mpoly;
- mloop = me->mloop;
+ /* use gawain immediate mode fore now */
+ const int looptris_len = poly_to_tri_count(mpoly_len, mloop_len);
+ const int vbo_len_capacity = looptris_len * 3;
+ int vbo_len_used = 0;
- mpoly_len = me->totpoly;
- mloop_len = me->totloop;
+ GPUVertFormat format_pos = { 0 };
+ const uint pos_id = GPU_vertformat_attr_add(&format_pos, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
- facemap_data = CustomData_get_layer(&me->pdata, CD_FACEMAP);
- }
+ GPUVertBuf *vbo_pos = GPU_vertbuf_create_with_format(&format_pos);
+ GPU_vertbuf_data_alloc(vbo_pos, vbo_len_capacity);
- /* use gawain immediate mode fore now */
- const int looptris_len = poly_to_tri_count(mpoly_len, mloop_len);
- immBeginAtMost(GPU_PRIM_TRIS, looptris_len * 3);
+ GPUVertBufRaw pos_step;
+ GPU_vertbuf_attr_get_raw_data(vbo_pos, pos_id, &pos_step);
- MPoly *mp;
+ const MPoly *mp;
int i;
- for (mp = mpoly, i = 0; i < mpoly_len; i++, mp++) {
- if (facemap_data[i] == facemap) {
- /* Weak, fan-fill, use until we have derived-mesh replaced. */
- const MLoop *ml_start = &mloop[mp->loopstart];
- const MLoop *ml_a = ml_start + 1;
- const MLoop *ml_b = ml_start + 2;
- for (int j = 2; j < mp->totloop; j++) {
- immVertex3fv(pos, mvert[ml_start->v].co);
- immVertex3fv(pos, mvert[ml_a->v].co);
- immVertex3fv(pos, mvert[ml_b->v].co);
-
- ml_a++;
- ml_b++;
+ if (me->runtime.looptris.array) {
+ MLoopTri *mlt = me->runtime.looptris.array;
+ for (mp = mpoly, i = 0; i < mpoly_len; i++, mp++) {
+ if (facemap_data[i] == facemap) {
+ for (int j = 2; j < mp->totloop; j++) {
+ copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mvert[mloop[mlt->tri[0]].v].co);
+ copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mvert[mloop[mlt->tri[1]].v].co);
+ copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mvert[mloop[mlt->tri[2]].v].co);
+ vbo_len_used += 3;
+ mlt++;
+ }
+ }
+ else {
+ mlt += mp->totloop - 2;
+ }
+ }
+ }
+ else {
+ /* No tessellation data, fan-fill. */
+ for (mp = mpoly, i = 0; i < mpoly_len; i++, mp++) {
+ if (facemap_data[i] == facemap) {
+ const MLoop *ml_start = &mloop[mp->loopstart];
+ const MLoop *ml_a = ml_start + 1;
+ const MLoop *ml_b = ml_start + 2;
+ for (int j = 2; j < mp->totloop; j++) {
+ copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mvert[ml_start->v].co);
+ copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mvert[ml_a->v].co);
+ copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mvert[ml_b->v].co);
+ vbo_len_used += 3;
+
+ ml_a++;
+ ml_b++;
+ }
}
}
}
- immEnd();
- immUnbindProgram();
+ if (vbo_len_capacity != vbo_len_used) {
+ GPU_vertbuf_data_resize(vbo_pos, vbo_len_used);
+ }
+
+ GPUBatch *draw_batch = GPU_batch_create(GPU_PRIM_TRIS, vbo_pos, NULL);
+ GPU_batch_program_set_builtin(draw_batch, GPU_SHADER_3D_UNIFORM_COLOR);
+ GPU_batch_uniform_4fv(draw_batch, "color", col);
+ GPU_batch_draw(draw_batch);
+ GPU_batch_discard(draw_batch);
+ GPU_vertbuf_discard(vbo_pos);
GPU_blend(false);
}
-#endif
-
- dm->release(dm);
}
diff --git a/source/blender/editors/space_view3d/drawvolume.c b/source/blender/editors/space_view3d/drawvolume.c
deleted file mode 100644
index c6874a663a5..00000000000
--- a/source/blender/editors/space_view3d/drawvolume.c
+++ /dev/null
@@ -1,853 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * Contributor(s): Daniel Genrich
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/editors/space_view3d/drawvolume.c
- * \ingroup spview3d
- */
-
-#include <string.h>
-#include <math.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_smoke_types.h"
-#include "DNA_view3d_types.h"
-
-#include "BLI_utildefines.h"
-#include "BLI_math.h"
-
-#include "BKE_colorband.h"
-#include "BKE_deform.h"
-#include "BKE_particle.h"
-
-#include "smoke_API.h"
-
-#include "BIF_gl.h"
-
-#include "GPU_shader.h"
-#include "GPU_texture.h"
-#include "GPU_state.h"
-
-#include "view3d_intern.h" // own include
-
-struct GPUTexture;
-
-// #define DEBUG_DRAW_TIME
-
-#ifdef DEBUG_DRAW_TIME
-# include "PIL_time.h"
-# include "PIL_time_utildefines.h"
-#endif
-
-/* *************************** Transfer functions *************************** */
-
-enum {
- TFUNC_FLAME_SPECTRUM = 0,
- TFUNC_COLOR_RAMP = 1,
-};
-
-#define TFUNC_WIDTH 256
-
-static void create_flame_spectrum_texture(float *data)
-{
-#define FIRE_THRESH 7
-#define MAX_FIRE_ALPHA 0.06f
-#define FULL_ON_FIRE 100
-
- float *spec_pixels = MEM_mallocN(TFUNC_WIDTH * 4 * 16 * 16 * sizeof(float), "spec_pixels");
-
- blackbody_temperature_to_rgb_table(data, TFUNC_WIDTH, 1500, 3000);
-
- for (int i = 0; i < 16; i++) {
- for (int j = 0; j < 16; j++) {
- for (int k = 0; k < TFUNC_WIDTH; k++) {
- int index = (j * TFUNC_WIDTH * 16 + i * TFUNC_WIDTH + k) * 4;
- if (k >= FIRE_THRESH) {
- spec_pixels[index] = (data[k * 4]);
- spec_pixels[index + 1] = (data[k * 4 + 1]);
- spec_pixels[index + 2] = (data[k * 4 + 2]);
- spec_pixels[index + 3] = MAX_FIRE_ALPHA * (
- (k > FULL_ON_FIRE) ? 1.0f : (k - FIRE_THRESH) / ((float)FULL_ON_FIRE - FIRE_THRESH));
- }
- else {
- zero_v4(&spec_pixels[index]);
- }
- }
- }
- }
-
- memcpy(data, spec_pixels, sizeof(float) * 4 * TFUNC_WIDTH);
-
- MEM_freeN(spec_pixels);
-
-#undef FIRE_THRESH
-#undef MAX_FIRE_ALPHA
-#undef FULL_ON_FIRE
-}
-
-static void create_color_ramp(const ColorBand *coba, float *data)
-{
- for (int i = 0; i < TFUNC_WIDTH; i++) {
- BKE_colorband_evaluate(coba, (float)i / TFUNC_WIDTH, &data[i * 4]);
- }
-}
-
-static GPUTexture *create_transfer_function(int type, const ColorBand *coba)
-{
- float *data = MEM_mallocN(sizeof(float) * 4 * TFUNC_WIDTH, __func__);
-
- switch (type) {
- case TFUNC_FLAME_SPECTRUM:
- create_flame_spectrum_texture(data);
- break;
- case TFUNC_COLOR_RAMP:
- create_color_ramp(coba, data);
- break;
- }
-
- GPUTexture *tex = GPU_texture_create_1D(TFUNC_WIDTH, GPU_RGBA8, data, NULL);
-
- MEM_freeN(data);
-
- return tex;
-}
-
-static GPUTexture *create_field_texture(SmokeDomainSettings *sds)
-{
- float *field = NULL;
-
- switch (sds->coba_field) {
-#ifdef WITH_SMOKE
- case FLUID_FIELD_DENSITY: field = smoke_get_density(sds->fluid); break;
- case FLUID_FIELD_HEAT: field = smoke_get_heat(sds->fluid); break;
- case FLUID_FIELD_FUEL: field = smoke_get_fuel(sds->fluid); break;
- case FLUID_FIELD_REACT: field = smoke_get_react(sds->fluid); break;
- case FLUID_FIELD_FLAME: field = smoke_get_flame(sds->fluid); break;
- case FLUID_FIELD_VELOCITY_X: field = smoke_get_velocity_x(sds->fluid); break;
- case FLUID_FIELD_VELOCITY_Y: field = smoke_get_velocity_y(sds->fluid); break;
- case FLUID_FIELD_VELOCITY_Z: field = smoke_get_velocity_z(sds->fluid); break;
- case FLUID_FIELD_COLOR_R: field = smoke_get_color_r(sds->fluid); break;
- case FLUID_FIELD_COLOR_G: field = smoke_get_color_g(sds->fluid); break;
- case FLUID_FIELD_COLOR_B: field = smoke_get_color_b(sds->fluid); break;
- case FLUID_FIELD_FORCE_X: field = smoke_get_force_x(sds->fluid); break;
- case FLUID_FIELD_FORCE_Y: field = smoke_get_force_y(sds->fluid); break;
- case FLUID_FIELD_FORCE_Z: field = smoke_get_force_z(sds->fluid); break;
-#endif
- default: return NULL;
- }
-
- return GPU_texture_create_3D(sds->res[0], sds->res[1], sds->res[2], GPU_R8, field, NULL);
-}
-
-typedef struct VolumeSlicer {
- float size[3];
- float min[3];
- float max[3];
- float (*verts)[3];
-} VolumeSlicer;
-
-/* *************************** Axis Aligned Slicing ************************** */
-
-static void create_single_slice(VolumeSlicer *slicer, const float depth,
- const int axis, const int idx)
-{
- const float vertices[3][4][3] = {
- {
- { depth, slicer->min[1], slicer->min[2] },
- { depth, slicer->max[1], slicer->min[2] },
- { depth, slicer->max[1], slicer->max[2] },
- { depth, slicer->min[1], slicer->max[2] }
- },
- {
- { slicer->min[0], depth, slicer->min[2] },
- { slicer->min[0], depth, slicer->max[2] },
- { slicer->max[0], depth, slicer->max[2] },
- { slicer->max[0], depth, slicer->min[2] }
- },
- {
- { slicer->min[0], slicer->min[1], depth },
- { slicer->min[0], slicer->max[1], depth },
- { slicer->max[0], slicer->max[1], depth },
- { slicer->max[0], slicer->min[1], depth }
- }
- };
-
- copy_v3_v3(slicer->verts[idx + 0], vertices[axis][0]);
- copy_v3_v3(slicer->verts[idx + 1], vertices[axis][1]);
- copy_v3_v3(slicer->verts[idx + 2], vertices[axis][2]);
- copy_v3_v3(slicer->verts[idx + 3], vertices[axis][0]);
- copy_v3_v3(slicer->verts[idx + 4], vertices[axis][2]);
- copy_v3_v3(slicer->verts[idx + 5], vertices[axis][3]);
-}
-
-static void create_axis_aligned_slices(VolumeSlicer *slicer, const int num_slices,
- const float view_dir[3], const int axis)
-{
- float depth, slice_size = slicer->size[axis] / num_slices;
-
- /* always process slices in back to front order! */
- if (view_dir[axis] > 0.0f) {
- depth = slicer->min[axis];
- }
- else {
- depth = slicer->max[axis];
- slice_size = -slice_size;
- }
-
- int count = 0;
- for (int slice = 0; slice < num_slices; slice++) {
- create_single_slice(slicer, depth, axis, count);
-
- count += 6;
- depth += slice_size;
- }
-}
-
-/* *************************** View Aligned Slicing ************************** */
-
-/* Code adapted from:
- * "GPU-based Volume Rendering, Real-time Volume Graphics", AK Peters/CRC Press
- */
-static int create_view_aligned_slices(VolumeSlicer *slicer,
- const int num_slices,
- const float view_dir[3])
-{
- const int indices[] = { 0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5 };
-
- const float vertices[8][3] = {
- { slicer->min[0], slicer->min[1], slicer->min[2] },
- { slicer->max[0], slicer->min[1], slicer->min[2] },
- { slicer->max[0], slicer->max[1], slicer->min[2] },
- { slicer->min[0], slicer->max[1], slicer->min[2] },
- { slicer->min[0], slicer->min[1], slicer->max[2] },
- { slicer->max[0], slicer->min[1], slicer->max[2] },
- { slicer->max[0], slicer->max[1], slicer->max[2] },
- { slicer->min[0], slicer->max[1], slicer->max[2] }
- };
-
- const int edges[12][2] = {
- { 0, 1 }, { 1, 2 }, { 2, 3 },
- { 3, 0 }, { 0, 4 }, { 1, 5 },
- { 2, 6 }, { 3, 7 }, { 4, 5 },
- { 5, 6 }, { 6, 7 }, { 7, 4 }
- };
-
- const int edge_list[8][12] = {
- { 0, 1, 5, 6, 4, 8, 11, 9, 3, 7, 2, 10 },
- { 0, 4, 3, 11, 1, 2, 6, 7, 5, 9, 8, 10 },
- { 1, 5, 0, 8, 2, 3, 7, 4, 6, 10, 9, 11 },
- { 7, 11, 10, 8, 2, 6, 1, 9, 3, 0, 4, 5 },
- { 8, 5, 9, 1, 11, 10, 7, 6, 4, 3, 0, 2 },
- { 9, 6, 10, 2, 8, 11, 4, 7, 5, 0, 1, 3 },
- { 9, 8, 5, 4, 6, 1, 2, 0, 10, 7, 11, 3 },
- { 10, 9, 6, 5, 7, 2, 3, 1, 11, 4, 8, 0 }
- };
-
- /* find vertex that is the furthest from the view plane */
- int max_index = 0;
- float max_dist, min_dist;
- min_dist = max_dist = dot_v3v3(view_dir, vertices[0]);
-
- for (int i = 1; i < 8; i++) {
- float dist = dot_v3v3(view_dir, vertices[i]);
-
- if (dist > max_dist) {
- max_dist = dist;
- max_index = i;
- }
-
- if (dist < min_dist) {
- min_dist = dist;
- }
- }
-
- max_dist -= FLT_EPSILON;
- min_dist += FLT_EPSILON;
-
- /* start and direction vectors */
- float vec_start[12][3], vec_dir[12][3];
- /* lambda intersection values */
- float lambda[12], lambda_inc[12];
- float denom = 0.0f;
-
- float plane_dist = min_dist;
- float plane_dist_inc = (max_dist - min_dist) / (float)num_slices;
-
- /* for all egdes */
- for (int i = 0; i < 12; i++) {
- copy_v3_v3(vec_start[i], vertices[edges[edge_list[max_index][i]][0]]);
- copy_v3_v3(vec_dir[i], vertices[edges[edge_list[max_index][i]][1]]);
- sub_v3_v3(vec_dir[i], vec_start[i]);
-
- denom = dot_v3v3(vec_dir[i], view_dir);
-
- if (1.0f + denom != 1.0f) {
- lambda_inc[i] = plane_dist_inc / denom;
- lambda[i] = (plane_dist - dot_v3v3(vec_start[i], view_dir)) / denom;
- }
- else {
- lambda[i] = -1.0f;
- lambda_inc[i] = 0.0f;
- }
- }
-
- float intersections[6][3];
- float dL[12];
- int num_points = 0;
- /* find intersections for each slice, process them in back to front order */
- for (int i = 0; i < num_slices; i++) {
- for (int e = 0; e < 12; e++) {
- dL[e] = lambda[e] + i * lambda_inc[e];
- }
-
- if ((dL[0] >= 0.0f) && (dL[0] < 1.0f)) {
- madd_v3_v3v3fl(intersections[0], vec_start[0], vec_dir[0], dL[0]);
- }
- else if ((dL[1] >= 0.0f) && (dL[1] < 1.0f)) {
- madd_v3_v3v3fl(intersections[0], vec_start[1], vec_dir[1], dL[1]);
- }
- else if ((dL[3] >= 0.0f) && (dL[3] < 1.0f)) {
- madd_v3_v3v3fl(intersections[0], vec_start[3], vec_dir[3], dL[3]);
- }
- else continue;
-
- if ((dL[2] >= 0.0f) && (dL[2] < 1.0f)) {
- madd_v3_v3v3fl(intersections[1], vec_start[2], vec_dir[2], dL[2]);
- }
- else if ((dL[0] >= 0.0f) && (dL[0] < 1.0f)) {
- madd_v3_v3v3fl(intersections[1], vec_start[0], vec_dir[0], dL[0]);
- }
- else if ((dL[1] >= 0.0f) && (dL[1] < 1.0f)) {
- madd_v3_v3v3fl(intersections[1], vec_start[1], vec_dir[1], dL[1]);
- }
- else {
- madd_v3_v3v3fl(intersections[1], vec_start[3], vec_dir[3], dL[3]);
- }
-
- if ((dL[4] >= 0.0f) && (dL[4] < 1.0f)) {
- madd_v3_v3v3fl(intersections[2], vec_start[4], vec_dir[4], dL[4]);
- }
- else if ((dL[5] >= 0.0f) && (dL[5] < 1.0f)) {
- madd_v3_v3v3fl(intersections[2], vec_start[5], vec_dir[5], dL[5]);
- }
- else {
- madd_v3_v3v3fl(intersections[2], vec_start[7], vec_dir[7], dL[7]);
- }
-
- if ((dL[6] >= 0.0f) && (dL[6] < 1.0f)) {
- madd_v3_v3v3fl(intersections[3], vec_start[6], vec_dir[6], dL[6]);
- }
- else if ((dL[4] >= 0.0f) && (dL[4] < 1.0f)) {
- madd_v3_v3v3fl(intersections[3], vec_start[4], vec_dir[4], dL[4]);
- }
- else if ((dL[5] >= 0.0f) && (dL[5] < 1.0f)) {
- madd_v3_v3v3fl(intersections[3], vec_start[5], vec_dir[5], dL[5]);
- }
- else {
- madd_v3_v3v3fl(intersections[3], vec_start[7], vec_dir[7], dL[7]);
- }
-
- if ((dL[8] >= 0.0f) && (dL[8] < 1.0f)) {
- madd_v3_v3v3fl(intersections[4], vec_start[8], vec_dir[8], dL[8]);
- }
- else if ((dL[9] >= 0.0f) && (dL[9] < 1.0f)) {
- madd_v3_v3v3fl(intersections[4], vec_start[9], vec_dir[9], dL[9]);
- }
- else {
- madd_v3_v3v3fl(intersections[4], vec_start[11], vec_dir[11], dL[11]);
- }
-
- if ((dL[10] >= 0.0f) && (dL[10] < 1.0f)) {
- madd_v3_v3v3fl(intersections[5], vec_start[10], vec_dir[10], dL[10]);
- }
- else if ((dL[8] >= 0.0f) && (dL[8] < 1.0f)) {
- madd_v3_v3v3fl(intersections[5], vec_start[8], vec_dir[8], dL[8]);
- }
- else if ((dL[9] >= 0.0f) && (dL[9] < 1.0f)) {
- madd_v3_v3v3fl(intersections[5], vec_start[9], vec_dir[9], dL[9]);
- }
- else {
- madd_v3_v3v3fl(intersections[5], vec_start[11], vec_dir[11], dL[11]);
- }
-
- for (int e = 0; e < 12; e++) {
- copy_v3_v3(slicer->verts[num_points++], intersections[indices[e]]);
- }
- }
-
- return num_points;
-}
-
-static void bind_shader(SmokeDomainSettings *sds, GPUShader *shader, GPUTexture *tex_spec,
- GPUTexture *tex_tfunc, GPUTexture *tex_coba,
- bool use_fire, const float min[3],
- const float ob_sizei[3], const float invsize[3])
-{
- int invsize_location = GPU_shader_get_uniform(shader, "invsize");
- int ob_sizei_location = GPU_shader_get_uniform(shader, "ob_sizei");
- int min_location = GPU_shader_get_uniform(shader, "min_location");
-
- int soot_location;
- int stepsize_location;
- int densityscale_location;
- int spec_location, flame_location;
- int shadow_location, actcol_location;
- int tfunc_location = 0;
- int coba_location = 0;
-
- if (use_fire) {
- spec_location = GPU_shader_get_uniform(shader, "spectrum_texture");
- flame_location = GPU_shader_get_uniform(shader, "flame_texture");
- }
- else {
- shadow_location = GPU_shader_get_uniform(shader, "shadow_texture");
- actcol_location = GPU_shader_get_uniform(shader, "active_color");
- soot_location = GPU_shader_get_uniform(shader, "soot_texture");
- stepsize_location = GPU_shader_get_uniform(shader, "step_size");
- densityscale_location = GPU_shader_get_uniform(shader, "density_scale");
-
- if (sds->use_coba) {
- tfunc_location = GPU_shader_get_uniform(shader, "transfer_texture");
- coba_location = GPU_shader_get_uniform(shader, "color_band_texture");
- }
- }
-
- GPU_shader_bind(shader);
-
- if (use_fire) {
- GPU_texture_bind(sds->tex_flame, 2);
- GPU_shader_uniform_texture(shader, flame_location, sds->tex_flame);
-
- GPU_texture_bind(tex_spec, 3);
- GPU_shader_uniform_texture(shader, spec_location, tex_spec);
- }
- else {
- float density_scale = 10.0f * sds->display_thickness;
-
- GPU_shader_uniform_vector(shader, stepsize_location, 1, 1, &sds->dx);
- GPU_shader_uniform_vector(shader, densityscale_location, 1, 1, &density_scale);
-
- GPU_texture_bind(sds->tex, 0);
- GPU_shader_uniform_texture(shader, soot_location, sds->tex);
-
- GPU_texture_bind(sds->tex_shadow, 1);
- GPU_shader_uniform_texture(shader, shadow_location, sds->tex_shadow);
-
- float active_color[3] = { 0.9, 0.9, 0.9 };
- if ((sds->active_fields & SM_ACTIVE_COLORS) == 0)
- mul_v3_v3(active_color, sds->active_color);
- GPU_shader_uniform_vector(shader, actcol_location, 3, 1, active_color);
-
- if (sds->use_coba) {
- GPU_texture_bind(tex_tfunc, 4);
- GPU_shader_uniform_texture(shader, tfunc_location, tex_tfunc);
-
- GPU_texture_bind(tex_coba, 5);
- GPU_shader_uniform_texture(shader, coba_location, tex_coba);
- }
- }
-
- GPU_shader_uniform_vector(shader, min_location, 3, 1, min);
- GPU_shader_uniform_vector(shader, ob_sizei_location, 3, 1, ob_sizei);
- GPU_shader_uniform_vector(shader, invsize_location, 3, 1, invsize);
-}
-
-static void unbind_shader(SmokeDomainSettings *sds, GPUTexture *tex_spec,
- GPUTexture *tex_tfunc, GPUTexture *tex_coba, bool use_fire)
-{
- GPU_shader_unbind();
-
- GPU_texture_unbind(sds->tex);
-
- if (use_fire) {
- GPU_texture_unbind(sds->tex_flame);
- GPU_texture_unbind(tex_spec);
- GPU_texture_free(tex_spec);
- }
- else {
- GPU_texture_unbind(sds->tex_shadow);
-
- if (sds->use_coba) {
- GPU_texture_unbind(tex_tfunc);
- GPU_texture_free(tex_tfunc);
-
- GPU_texture_unbind(tex_coba);
- GPU_texture_free(tex_coba);
- }
- }
-}
-
-static void draw_buffer(SmokeDomainSettings *sds, GPUShader *shader, const VolumeSlicer *slicer,
- const float ob_sizei[3], const float invsize[3], const int num_points, const bool do_fire)
-{
- GPUTexture *tex_spec = (do_fire) ? create_transfer_function(TFUNC_FLAME_SPECTRUM, NULL) : NULL;
- GPUTexture *tex_tfunc = (sds->use_coba) ? create_transfer_function(TFUNC_COLOR_RAMP, sds->coba) : NULL;
- GPUTexture *tex_coba = (sds->use_coba) ? create_field_texture(sds) : NULL;
-
- GLuint vertex_buffer;
- glGenBuffers(1, &vertex_buffer);
- glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
- glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * num_points, &slicer->verts[0][0], GL_STATIC_DRAW);
-
- bind_shader(sds, shader, tex_spec, tex_tfunc, tex_coba, do_fire, slicer->min, ob_sizei, invsize);
-
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(3, GL_FLOAT, 0, NULL);
-
- glDrawArrays(GL_TRIANGLES, 0, num_points);
-
- glDisableClientState(GL_VERTEX_ARRAY);
-
- unbind_shader(sds, tex_spec, tex_tfunc, tex_coba, do_fire);
-
- /* cleanup */
-
- glBindBuffer(GL_ARRAY_BUFFER, 0);
-
- glDeleteBuffers(1, &vertex_buffer);
-}
-
-void draw_smoke_volume(SmokeDomainSettings *sds, Object *ob,
- const float min[3], const float max[3],
- const float viewnormal[3])
-{
- if (!sds->tex || !sds->tex_shadow) {
- fprintf(stderr, "Could not allocate 3D texture for volume rendering!\n");
- return;
- }
-
- const bool use_fire = (sds->active_fields & SM_ACTIVE_FIRE) && sds->tex_flame;
-
- GPUBuiltinShader builtin_shader;
-
- if (sds->use_coba) {
- builtin_shader = GPU_SHADER_SMOKE_COBA;
- }
- else {
- builtin_shader = GPU_SHADER_SMOKE;
- }
-
- GPUShader *shader = GPU_shader_get_builtin_shader(builtin_shader);
-
- if (!shader) {
- fprintf(stderr, "Unable to create GLSL smoke shader.\n");
- return;
- }
-
- GPUShader *fire_shader = NULL;
- if (use_fire) {
- fire_shader = GPU_shader_get_builtin_shader(GPU_SHADER_SMOKE_FIRE);
-
- if (!fire_shader) {
- fprintf(stderr, "Unable to create GLSL fire shader.\n");
- return;
- }
- }
-
- const float ob_sizei[3] = {
- 1.0f / fabsf(ob->size[0]),
- 1.0f / fabsf(ob->size[1]),
- 1.0f / fabsf(ob->size[2])
- };
-
- const float size[3] = { max[0] - min[0], max[1] - min[1], max[2] - min[2] };
- const float invsize[3] = { 1.0f / size[0], 1.0f / size[1], 1.0f / size[2] };
-
-#ifdef DEBUG_DRAW_TIME
- TIMEIT_START(draw);
-#endif
-
- /* setup slicing information */
-
- const bool view_aligned = (sds->slice_method == MOD_SMOKE_SLICE_VIEW_ALIGNED);
- int max_slices, max_points, axis = 0;
-
- if (view_aligned) {
- max_slices = max_iii(sds->res[0], sds->res[1], sds->res[2]) * sds->slice_per_voxel;
- max_points = max_slices * 12;
- }
- else {
- if (sds->axis_slice_method == AXIS_SLICE_FULL) {
- axis = axis_dominant_v3_single(viewnormal);
- max_slices = sds->res[axis] * sds->slice_per_voxel;
- }
- else {
- axis = (sds->slice_axis == SLICE_AXIS_AUTO) ? axis_dominant_v3_single(viewnormal) : sds->slice_axis - 1;
- max_slices = 1;
- }
-
- max_points = max_slices * 6;
- }
-
- VolumeSlicer slicer;
- copy_v3_v3(slicer.min, min);
- copy_v3_v3(slicer.max, max);
- copy_v3_v3(slicer.size, size);
- slicer.verts = MEM_mallocN(sizeof(float) * 3 * max_points, "smoke_slice_vertices");
-
- int num_points;
-
- if (view_aligned) {
- num_points = create_view_aligned_slices(&slicer, max_slices, viewnormal);
- }
- else {
- num_points = max_points;
-
- if (sds->axis_slice_method == AXIS_SLICE_FULL) {
- create_axis_aligned_slices(&slicer, max_slices, viewnormal, axis);
- }
- else {
- const float depth = (sds->slice_depth - 0.5f) * size[axis];
- create_single_slice(&slicer, depth, axis, 0);
- }
- }
-
- /* setup buffer and draw */
-
- int gl_depth = 0, gl_blend = 0, gl_depth_write = 0;
- glGetBooleanv(GL_BLEND, (GLboolean *)&gl_blend);
- glGetBooleanv(GL_DEPTH_TEST, (GLboolean *)&gl_depth);
- glGetBooleanv(GL_DEPTH_WRITEMASK, (GLboolean *)&gl_depth_write);
-
- GPU_depth_test(true);
- glDepthMask(GL_FALSE);
- GPU_blend(true);
-
- GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
- draw_buffer(sds, shader, &slicer, ob_sizei, invsize, num_points, false);
-
- /* Draw fire separately (T47639). */
- if (use_fire && !sds->use_coba) {
- glBlendFunc(GL_ONE, GL_ONE);
- draw_buffer(sds, fire_shader, &slicer, ob_sizei, invsize, num_points, true);
- }
-
-#ifdef DEBUG_DRAW_TIME
- printf("Draw Time: %f\n", (float)TIMEIT_VALUE(draw));
- TIMEIT_END(draw);
-#endif
-
- MEM_freeN(slicer.verts);
-
- glDepthMask(gl_depth_write);
-
- if (!gl_blend) {
- GPU_blend(false);
- }
-
- if (gl_depth) {
- GPU_depth_test(true);
- }
-}
-
-#ifdef WITH_SMOKE
-static void add_tri(float (*verts)[3], float(*colors)[3], int *offset,
- float p1[3], float p2[3], float p3[3], float rgb[3])
-{
- copy_v3_v3(verts[*offset + 0], p1);
- copy_v3_v3(verts[*offset + 1], p2);
- copy_v3_v3(verts[*offset + 2], p3);
-
- copy_v3_v3(colors[*offset + 0], rgb);
- copy_v3_v3(colors[*offset + 1], rgb);
- copy_v3_v3(colors[*offset + 2], rgb);
-
- *offset += 3;
-}
-
-static void add_needle(float (*verts)[3], float (*colors)[3], float center[3],
- float dir[3], float scale, float voxel_size, int *offset)
-{
- float len = len_v3(dir);
-
- float rgb[3];
- BKE_defvert_weight_to_rgb(rgb, len);
-
- if (len != 0.0f) {
- mul_v3_fl(dir, 1.0f / len);
- len *= scale;
- }
-
- len *= voxel_size;
-
- float corners[4][3] = {
- { 0.0f, 0.2f, -0.5f },
- { -0.2f * 0.866f, -0.2f * 0.5f, -0.5f },
- { 0.2f * 0.866f, -0.2f * 0.5f, -0.5f },
- { 0.0f, 0.0f, 0.5f }
- };
-
- const float up[3] = { 0.0f, 0.0f, 1.0f };
- float rot[3][3];
-
- rotation_between_vecs_to_mat3(rot, up, dir);
- transpose_m3(rot);
-
- for (int i = 0; i < 4; i++) {
- mul_m3_v3(rot, corners[i]);
- mul_v3_fl(corners[i], len);
- add_v3_v3(corners[i], center);
- }
-
- add_tri(verts, colors, offset, corners[0], corners[1], corners[2], rgb);
- add_tri(verts, colors, offset, corners[0], corners[1], corners[3], rgb);
- add_tri(verts, colors, offset, corners[1], corners[2], corners[3], rgb);
- add_tri(verts, colors, offset, corners[2], corners[0], corners[3], rgb);
-}
-
-static void add_streamline(float (*verts)[3], float(*colors)[3], float center[3],
- float dir[3], float scale, float voxel_size, int *offset)
-{
- const float len = len_v3(dir);
-
- float rgb[3];
- BKE_defvert_weight_to_rgb(rgb, len);
-
- copy_v3_v3(colors[(*offset)], rgb);
- copy_v3_v3(verts[(*offset)++], center);
-
- mul_v3_fl(dir, scale * voxel_size);
- add_v3_v3(center, dir);
-
- copy_v3_v3(colors[(*offset)], rgb);
- copy_v3_v3(verts[(*offset)++], center);
-}
-
-typedef void (*vector_draw_func)(float(*)[3], float(*)[3], float *, float *, float, float, int *);
-#endif /* WITH_SMOKE */
-
-void draw_smoke_velocity(SmokeDomainSettings *domain, float viewnormal[3])
-{
-#ifdef WITH_SMOKE
- const float *vel_x = smoke_get_velocity_x(domain->fluid);
- const float *vel_y = smoke_get_velocity_y(domain->fluid);
- const float *vel_z = smoke_get_velocity_z(domain->fluid);
-
- if (ELEM(NULL, vel_x, vel_y, vel_z)) {
- return;
- }
-
- const int *base_res = domain->base_res;
- const int *res = domain->res;
- const int *res_min = domain->res_min;
-
- int res_max[3];
- copy_v3_v3_int(res_max, domain->res_max);
-
- const float *cell_size = domain->cell_size;
- const float step_size = ((float)max_iii(base_res[0], base_res[1], base_res[2])) / 16.0f;
-
- /* set first position so that it doesn't jump when domain moves */
- float xyz[3] = {
- res_min[0] + fmod(-(float)domain->shift[0] + res_min[0], step_size),
- res_min[1] + fmod(-(float)domain->shift[1] + res_min[1], step_size),
- res_min[2] + fmod(-(float)domain->shift[2] + res_min[2], step_size)
- };
-
- if (xyz[0] < res_min[0]) xyz[0] += step_size;
- if (xyz[1] < res_min[1]) xyz[1] += step_size;
- if (xyz[2] < res_min[2]) xyz[2] += step_size;
-
- float min[3] = {
- domain->p0[0] - domain->cell_size[0] * domain->adapt_res,
- domain->p0[1] - domain->cell_size[1] * domain->adapt_res,
- domain->p0[2] - domain->cell_size[2] * domain->adapt_res,
- };
-
- int num_points_v[3] = {
- ((float)(res_max[0] - floor(xyz[0])) / step_size) + 0.5f,
- ((float)(res_max[1] - floor(xyz[1])) / step_size) + 0.5f,
- ((float)(res_max[2] - floor(xyz[2])) / step_size) + 0.5f
- };
-
- if (domain->slice_method == MOD_SMOKE_SLICE_AXIS_ALIGNED &&
- domain->axis_slice_method == AXIS_SLICE_SINGLE)
- {
- const int axis = (domain->slice_axis == SLICE_AXIS_AUTO) ?
- axis_dominant_v3_single(viewnormal) : domain->slice_axis - 1;
-
- xyz[axis] = (float)base_res[axis] * domain->slice_depth;
- num_points_v[axis] = 1;
- res_max[axis] = xyz[axis] + 1;
- }
-
- vector_draw_func func;
- int max_points;
-
- if (domain->vector_draw_type == VECTOR_DRAW_NEEDLE) {
- func = add_needle;
- max_points = (num_points_v[0] * num_points_v[1] * num_points_v[2]) * 4 * 3;
- }
- else {
- func = add_streamline;
- max_points = (num_points_v[0] * num_points_v[1] * num_points_v[2]) * 2;
- }
-
- float (*verts)[3] = MEM_mallocN(sizeof(float) * 3 * max_points, "");
- float (*colors)[3] = MEM_mallocN(sizeof(float) * 3 * max_points, "");
-
- int num_points = 0;
-
- for (float x = floor(xyz[0]); x < res_max[0]; x += step_size) {
- for (float y = floor(xyz[1]); y < res_max[1]; y += step_size) {
- for (float z = floor(xyz[2]); z < res_max[2]; z += step_size) {
- int index = (floor(x) - res_min[0]) + (floor(y) - res_min[1]) * res[0] + (floor(z) - res_min[2]) * res[0] * res[1];
-
- float pos[3] = {
- min[0] + ((float)x + 0.5f) * cell_size[0],
- min[1] + ((float)y + 0.5f) * cell_size[1],
- min[2] + ((float)z + 0.5f) * cell_size[2]
- };
-
- float vel[3] = {
- vel_x[index], vel_y[index], vel_z[index]
- };
-
- func(verts, colors, pos, vel, domain->vector_scale, cell_size[0], &num_points);
- }
- }
- }
-
- GPU_line_width(1.0f);
-
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(3, GL_FLOAT, 0, verts);
-
- glEnableClientState(GL_COLOR_ARRAY);
- glColorPointer(3, GL_FLOAT, 0, colors);
-
- glDrawArrays(GL_LINES, 0, num_points);
-
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_COLOR_ARRAY);
-
- MEM_freeN(verts);
- MEM_freeN(colors);
-#else
- UNUSED_VARS(domain, viewnormal);
-#endif
-}
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 674f4e1f778..044cb56d367 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -48,7 +48,6 @@
#include "BKE_curve.h"
#include "BKE_icons.h"
#include "BKE_lattice.h"
-#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_mball.h"
#include "BKE_mesh.h"
@@ -316,9 +315,7 @@ static SpaceLink *view3d_new(const ScrArea *UNUSED(sa), const Scene *scene)
v3d = MEM_callocN(sizeof(View3D), "initview3d");
v3d->spacetype = SPACE_VIEW3D;
- v3d->lay = v3d->layact = 1;
if (scene) {
- v3d->lay = v3d->layact = scene->lay;
v3d->camera = scene->camera;
}
v3d->scenelock = true;
@@ -330,8 +327,18 @@ static SpaceLink *view3d_new(const ScrArea *UNUSED(sa), const Scene *scene)
v3d->overlay.wireframe_threshold = 0.5f;
v3d->overlay.bone_select_alpha = 0.5f;
v3d->overlay.texture_paint_mode_opacity = 0.8;
- v3d->overlay.weight_paint_mode_opacity = 0.8;
+ v3d->overlay.weight_paint_mode_opacity = 1.0f;
v3d->overlay.vertex_paint_mode_opacity = 0.8;
+ v3d->overlay.edit_flag = V3D_OVERLAY_EDIT_FACES |
+ V3D_OVERLAY_EDIT_SEAMS |
+ V3D_OVERLAY_EDIT_SHARP |
+ V3D_OVERLAY_EDIT_FREESTYLE_EDGE |
+ V3D_OVERLAY_EDIT_FREESTYLE_FACE |
+ V3D_OVERLAY_EDIT_EDGES |
+ V3D_OVERLAY_EDIT_CREASES |
+ V3D_OVERLAY_EDIT_BWEIGHTS |
+ V3D_OVERLAY_EDIT_CU_HANDLES |
+ V3D_OVERLAY_EDIT_CU_NORMALS;
v3d->gridflag = V3D_SHOW_X | V3D_SHOW_Y | V3D_SHOW_FLOOR;
@@ -342,10 +349,7 @@ static SpaceLink *view3d_new(const ScrArea *UNUSED(sa), const Scene *scene)
v3d->near = 0.01f;
v3d->far = 1000.0f;
- v3d->overlay.gpencil_grid_scale = 1.0; // Scales
- v3d->overlay.gpencil_grid_lines = GP_DEFAULT_GRID_LINES; // NUmber of Lines
v3d->overlay.gpencil_paper_opacity = 0.5f;
- v3d->overlay.gpencil_grid_axis = V3D_GP_GRID_AXIS_Y;
v3d->overlay.gpencil_grid_opacity = 0.9f;
v3d->bundle_size = 0.2f;
@@ -432,7 +436,6 @@ static SpaceLink *view3d_duplicate(SpaceLink *sl)
if (v3dn->localvd) {
v3dn->localvd = NULL;
v3dn->properties_storage = NULL;
- v3dn->lay = v3do->localvd->lay & 0xFFFFFF;
}
if (v3dn->shading.type == OB_RENDER)
@@ -455,13 +458,6 @@ static void view3d_main_region_init(wmWindowManager *wm, ARegion *ar)
ListBase *lb;
wmKeyMap *keymap;
- if (ar->gizmo_map == NULL) {
- ar->gizmo_map = WM_gizmomap_new_from_type(
- &(const struct wmGizmoMapType_Params) {SPACE_VIEW3D, RGN_TYPE_WINDOW});
- }
-
- WM_gizmomap_add_handlers(ar, ar->gizmo_map);
-
/* object ops. */
/* important to be before Pose keymap since they can both be enabled at once */
@@ -593,32 +589,34 @@ static bool view3d_ima_bg_is_camera_view(bContext *C)
static bool view3d_ima_bg_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event, const char **tooltip)
{
- if (view3d_ima_bg_is_camera_view(C)) {
- return true;
+ if (!view3d_ima_drop_poll(C, drag, event, tooltip)) {
+ return false;
}
- if (!ED_view3d_give_base_under_cursor(C, event->mval)) {
- return view3d_ima_drop_poll(C, drag, event, tooltip);
+ if (ED_view3d_is_object_under_cursor(C, event->mval)) {
+ return false;
}
- return 0;
+
+ return view3d_ima_bg_is_camera_view(C);
}
static bool view3d_ima_empty_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event, const char **tooltip)
{
- if (!view3d_ima_bg_is_camera_view(C)) {
- return true;
+ if (!view3d_ima_drop_poll(C, drag, event, tooltip)) {
+ return false;
}
- Base *base = ED_view3d_give_base_under_cursor(C, event->mval);
+ Object *ob = ED_view3d_give_object_under_cursor(C, event->mval);
- /* either holding and ctrl and no object, or dropping to empty */
- if ((base == NULL) ||
- ((base != NULL) && base->object->type == OB_EMPTY))
- {
- return view3d_ima_drop_poll(C, drag, event, tooltip);
+ if (ob == NULL) {
+ return true;
+ }
+
+ if (ob->type == OB_EMPTY && ob->empty_drawtype == OB_EMPTY_IMAGE) {
+ return true;
}
- return 0;
+ return false;
}
static void view3d_ob_drop_copy(wmDrag *drag, wmDropBox *drop)
@@ -684,8 +682,8 @@ static void view3d_dropboxes(void)
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, "OBJECT_OT_drop_named_image", view3d_ima_empty_drop_poll, view3d_id_path_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_collection_instance_add", view3d_collection_drop_poll, view3d_collection_drop_copy);
}
@@ -705,6 +703,8 @@ static void view3d_widgets(void)
WM_gizmogrouptype_append(TRANSFORM_GGT_gizmo);
WM_gizmogrouptype_append(VIEW3D_GGT_xform_cage);
+ WM_gizmogrouptype_append(VIEW3D_GGT_xform_shear);
+ WM_gizmogrouptype_append(VIEW3D_GGT_mesh_preselect_elem);
WM_gizmogrouptype_append(VIEW3D_GGT_mesh_preselect_edgering);
WM_gizmogrouptype_append(VIEW3D_GGT_ruler);
@@ -766,25 +766,6 @@ static void *view3d_main_region_duplicate(void *poin)
return NULL;
}
-static void view3d_recalc_used_layers(ARegion *ar, wmNotifier *wmn, const Scene *UNUSED(scene))
-{
- wmWindow *win = wmn->wm->winactive;
- unsigned int lay_used = 0;
-
- if (!win) return;
-
- const bScreen *screen = WM_window_get_active_screen(win);
- for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
- if (sa->spacetype == SPACE_VIEW3D) {
- if (BLI_findindex(&sa->regionbase, ar) != -1) {
- View3D *v3d = sa->spacedata.first;
- v3d->lay_used = lay_used;
- break;
- }
- }
- }
-}
-
static void view3d_main_region_listener(
wmWindow *UNUSED(win), ScrArea *sa, ARegion *ar,
wmNotifier *wmn, const Scene *scene)
@@ -821,8 +802,6 @@ static void view3d_main_region_listener(
switch (wmn->data) {
case ND_SCENEBROWSE:
case ND_LAYER_CONTENT:
- if (wmn->reference)
- view3d_recalc_used_layers(ar, wmn, wmn->reference);
ED_region_tag_redraw(ar);
WM_gizmomap_tag_refresh(gzmap);
break;
@@ -1116,20 +1095,6 @@ static void view3d_main_region_message_subscribe(
}
}
-static void view3d_tools_region_message_subscribe(
- const struct bContext *UNUSED(C),
- struct WorkSpace *UNUSED(workspace), struct Scene *UNUSED(scene),
- struct bScreen *UNUSED(screen), struct ScrArea *UNUSED(sa), struct ARegion *ar,
- struct wmMsgBus *mbus)
-{
- wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
- .owner = ar,
- .user_data = ar,
- .notify = ED_region_do_msg_notify_tag_redraw,
- };
- WM_msg_subscribe_rna_anon_prop(mbus, WorkSpace, tools, &msg_sub_value_region_tag_redraw);
-}
-
/* concept is to retrieve cursor type context-less */
static void view3d_main_region_cursor(wmWindow *win, ScrArea *sa, ARegion *ar)
{
@@ -1237,7 +1202,7 @@ static void view3d_buttons_region_init(wmWindowManager *wm, ARegion *ar)
static void view3d_buttons_region_draw(const bContext *C, ARegion *ar)
{
- ED_region_panels(C, ar);
+ ED_region_panels_ex(C, ar, (const char * []){CTX_data_mode_string(C), NULL}, -1, true);
}
static void view3d_buttons_region_listener(
@@ -1332,27 +1297,6 @@ static void view3d_buttons_region_listener(
}
}
-static int view3d_tools_region_snap_size(const ARegion *ar, int size, int axis)
-{
- if (axis == 0) {
- /* Note, this depends on the icon size: see #ICON_DEFAULT_HEIGHT_TOOLBAR. */
- const float snap_units[] = {2 + 0.8f, 4 + 0.8f};
- const float aspect = BLI_rctf_size_x(&ar->v2d.cur) / (BLI_rcti_size_x(&ar->v2d.mask) + 1);
- int best_diff = INT_MAX;
- int best_size = size;
- for (uint i = 0; i < ARRAY_SIZE(snap_units); i += 1) {
- const int test_size = (snap_units[i] * U.widget_unit) / (UI_DPI_FAC * aspect);
- const int test_diff = ABS(test_size - size);
- if (test_diff < best_diff) {
- best_size = test_size;
- best_diff = test_diff;
- }
- }
- return best_size;
- }
- return size;
-}
-
/* add handlers, stuff you only do once or on area/region changes */
static void view3d_tools_region_init(wmWindowManager *wm, ARegion *ar)
{
@@ -1528,7 +1472,7 @@ void ED_spacetype_view3d(void)
/* regions: main window */
art = MEM_callocN(sizeof(ARegionType), "spacetype view3d main region");
art->regionid = RGN_TYPE_WINDOW;
- art->keymapflag = ED_KEYMAP_GPENCIL;
+ art->keymapflag = ED_KEYMAP_GIZMO | ED_KEYMAP_GPENCIL;
art->draw = view3d_main_region_draw;
art->init = view3d_main_region_init;
art->exit = view3d_main_region_exit;
@@ -1555,12 +1499,12 @@ void ED_spacetype_view3d(void)
/* regions: tool(bar) */
art = MEM_callocN(sizeof(ARegionType), "spacetype view3d tools region");
art->regionid = RGN_TYPE_TOOLS;
- art->prefsizex = 160; /* XXX */
+ art->prefsizex = 58; /* XXX */
art->prefsizey = 50; /* XXX */
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_FRAMES;
art->listener = view3d_buttons_region_listener;
- art->message_subscribe = view3d_tools_region_message_subscribe;
- art->snap_size = view3d_tools_region_snap_size;
+ art->message_subscribe = ED_region_generic_tools_region_message_subscribe;
+ art->snap_size = ED_region_generic_tools_region_snap_size;
art->init = view3d_tools_region_init;
art->draw = view3d_tools_region_draw;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c
index 43b7b940b4f..7732023b6a4 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -940,7 +940,7 @@ static void v3d_transform_butsR(uiLayout *layout, PointerRNA *ptr)
colsub = uiLayoutColumn(split, true);
uiLayoutSetEmboss(colsub, UI_EMBOSS_NONE);
uiItemL(colsub, "", ICON_NONE);
- uiItemR(colsub, ptr, "lock_location", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+ uiItemR(colsub, ptr, "lock_location", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_DECORATE_UNLOCKED);
split = uiLayoutSplit(layout, 0.8f, false);
@@ -952,10 +952,10 @@ static void v3d_transform_butsR(uiLayout *layout, PointerRNA *ptr)
uiLayoutSetEmboss(colsub, UI_EMBOSS_NONE);
uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, IFACE_("4L"), ICON_NONE);
if (RNA_boolean_get(ptr, "lock_rotations_4d"))
- uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE + UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+ uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE + UI_ITEM_R_ICON_ONLY, "", ICON_DECORATE_UNLOCKED);
else
uiItemL(colsub, "", ICON_NONE);
- uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+ uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_DECORATE_UNLOCKED);
break;
case ROT_MODE_AXISANGLE: /* axis angle */
colsub = uiLayoutColumn(split, true);
@@ -964,10 +964,10 @@ static void v3d_transform_butsR(uiLayout *layout, PointerRNA *ptr)
uiLayoutSetEmboss(colsub, UI_EMBOSS_NONE);
uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, IFACE_("4L"), ICON_NONE);
if (RNA_boolean_get(ptr, "lock_rotations_4d"))
- uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+ uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_DECORATE_UNLOCKED);
else
uiItemL(colsub, "", ICON_NONE);
- uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+ uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_DECORATE_UNLOCKED);
break;
default: /* euler rotations */
colsub = uiLayoutColumn(split, true);
@@ -975,7 +975,7 @@ static void v3d_transform_butsR(uiLayout *layout, PointerRNA *ptr)
colsub = uiLayoutColumn(split, true);
uiLayoutSetEmboss(colsub, UI_EMBOSS_NONE);
uiItemL(colsub, "", ICON_NONE);
- uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+ uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_DECORATE_UNLOCKED);
break;
}
uiItemR(layout, ptr, "rotation_mode", 0, "", ICON_NONE);
@@ -986,7 +986,7 @@ static void v3d_transform_butsR(uiLayout *layout, PointerRNA *ptr)
colsub = uiLayoutColumn(split, true);
uiLayoutSetEmboss(colsub, UI_EMBOSS_NONE);
uiItemL(colsub, "", ICON_NONE);
- uiItemR(colsub, ptr, "lock_scale", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+ uiItemR(colsub, ptr, "lock_scale", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_DECORATE_UNLOCKED);
if (ptr->type == &RNA_Object) {
Object *ob = ptr->data;
@@ -1182,6 +1182,7 @@ void view3d_buttons_register(ARegionType *art)
pt = MEM_callocN(sizeof(PanelType), "spacetype view3d panel object");
strcpy(pt->idname, "VIEW3D_PT_transform");
strcpy(pt->label, N_("Transform")); /* XXX C panels not available through RNA (bpy.types)! */
+ strcpy(pt->category, "View");
strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA);
pt->draw = view3d_panel_transform;
pt->poll = view3d_panel_transform_poll;
@@ -1190,6 +1191,7 @@ void view3d_buttons_register(ARegionType *art)
pt = MEM_callocN(sizeof(PanelType), "spacetype view3d panel vgroup");
strcpy(pt->idname, "VIEW3D_PT_vgroup");
strcpy(pt->label, N_("Vertex Weights")); /* XXX C panels are not available through RNA (bpy.types)! */
+ strcpy(pt->category, "View");
strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA);
pt->draw = view3d_panel_vgroup;
pt->poll = view3d_panel_vgroup_poll;
diff --git a/source/blender/editors/space_view3d/view3d_camera_control.c b/source/blender/editors/space_view3d/view3d_camera_control.c
index d0475684262..24871e16db6 100644
--- a/source/blender/editors/space_view3d/view3d_camera_control.c
+++ b/source/blender/editors/space_view3d/view3d_camera_control.c
@@ -88,7 +88,7 @@ typedef struct View3DCameraControl {
/* -------------------------------------------------------------------- */
- /* intial values */
+ /* initial values */
/* root most parent */
Object *root_parent;
@@ -303,7 +303,7 @@ void ED_view3d_cameracontrol_release(
DEG_id_tag_update(&ob_back->id, OB_RECALC_OB);
}
else {
- /* Non Camera we need to reset the view back to the original location bacause the user canceled*/
+ /* Non Camera we need to reset the view back to the original location because the user canceled*/
copy_qt_qt(rv3d->viewquat, vctrl->rot_backup);
rv3d->persp = vctrl->persp_backup;
}
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 46b53a369e3..98f5aab88ed 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -774,6 +774,36 @@ float ED_view3d_grid_scale(Scene *scene, View3D *v3d, const char **grid_unit)
return v3d->grid * ED_scene_grid_scale(scene, grid_unit);
}
+/* Simulates the grid scale that is visualized by the shaders drawing functions.
+ * The actual code is seen in `object_grid_frag.glsl` when you get the `grid_res` value.
+ * Currently the simulation is done only when RV3D_VIEW_IS_AXIS. */
+float ED_view3d_grid_view_scale(
+ Scene *scene, View3D *v3d, RegionView3D *rv3d, const char **grid_unit)
+{
+ float grid_scale = ED_view3d_grid_scale(scene, v3d, grid_unit);
+ if (!rv3d->is_persp && RV3D_VIEW_IS_AXIS(rv3d->view)) {
+ /* Decrease the distance between grid snap points depending on zoom. */
+ float grid_subdiv = v3d->gridsubdiv;
+ if (grid_subdiv > 1) {
+ float grid_distance = rv3d->dist;
+ float lvl = (logf(grid_distance / grid_scale) / logf(grid_subdiv));
+ if (lvl < 0.0f) {
+ /* Negative values need an offset for correct casting.
+ * By convention, the minimum lvl is limited to -2 (see `objec_mode.c`) */
+ if (lvl > -2.0f) {
+ lvl -= 1.0f;
+ }
+ else {
+ lvl = -2.0f;
+ }
+ }
+ grid_scale *= pow(grid_subdiv, (int)lvl - 1);
+ }
+ }
+
+ return v3d->grid * grid_scale;
+}
+
static void draw_view_axis(RegionView3D *rv3d, const rcti *rect)
{
const float k = U.rvisize * U.pixelsize; /* axis size */
@@ -824,9 +854,9 @@ static void draw_view_axis(RegionView3D *rv3d, const rcti *rect)
for (int axis_i = 0; axis_i < 3; axis_i++) {
int i = axis_order[axis_i];
- immAttrib4ubv(col, axis_col[i]);
+ immAttr4ubv(col, axis_col[i]);
immVertex2f(pos, startx, starty);
- immAttrib4ubv(col, axis_col[i]);
+ immAttr4ubv(col, axis_col[i]);
immVertex2fv(pos, axis_pos[i]);
}
@@ -874,7 +904,7 @@ static void UNUSED_FUNCTION(draw_rotation_guide)(RegionView3D *rv3d)
immBegin(GPU_PRIM_LINE_STRIP, 3);
color[3] = 0; /* more transparent toward the ends */
- immAttrib4ubv(col, color);
+ immAttr4ubv(col, color);
add_v3_v3v3(end, o, scaled_axis);
immVertex3fv(pos, end);
@@ -884,11 +914,11 @@ static void UNUSED_FUNCTION(draw_rotation_guide)(RegionView3D *rv3d)
#endif
color[3] = 127; /* more opaque toward the center */
- immAttrib4ubv(col, color);
+ immAttr4ubv(col, color);
immVertex3fv(pos, o);
color[3] = 0;
- immAttrib4ubv(col, color);
+ immAttr4ubv(col, color);
sub_v3_v3v3(end, o, scaled_axis);
immVertex3fv(pos, end);
immEnd();
@@ -913,7 +943,7 @@ static void UNUSED_FUNCTION(draw_rotation_guide)(RegionView3D *rv3d)
immBegin(GPU_PRIM_LINE_LOOP, ROT_AXIS_DETAIL);
color[3] = 63; /* somewhat faint */
- immAttrib4ubv(col, color);
+ immAttr4ubv(col, color);
float angle = 0.0f;
for (int i = 0; i < ROT_AXIS_DETAIL; ++i, angle += step) {
float p[3] = {s * cosf(angle), s * sinf(angle), 0.0f};
@@ -941,7 +971,7 @@ static void UNUSED_FUNCTION(draw_rotation_guide)(RegionView3D *rv3d)
immBindBuiltinProgram(GPU_SHADER_3D_POINT_FIXED_SIZE_VARYING_COLOR);
GPU_point_size(5.0f);
immBegin(GPU_PRIM_POINTS, 1);
- immAttrib4ubv(col, color);
+ immAttr4ubv(col, color);
immVertex3fv(pos, o);
immEnd();
immUnbindProgram();
@@ -961,8 +991,8 @@ static void UNUSED_FUNCTION(draw_rotation_guide)(RegionView3D *rv3d)
/* ******************** info ***************** */
/**
-* Render and camera border
-*/
+ * Render and camera border
+ */
static void view3d_draw_border(const bContext *C, ARegion *ar)
{
Scene *scene = CTX_data_scene(C);
@@ -979,44 +1009,44 @@ static void view3d_draw_border(const bContext *C, ARegion *ar)
}
/**
-* Grease Pencil
-*/
+ * Grease Pencil
+ */
static void view3d_draw_grease_pencil(const bContext *UNUSED(C))
{
/* TODO viewport */
}
/**
-* Viewport Name
-*/
+ * Viewport Name
+ */
static const char *view3d_get_name(View3D *v3d, RegionView3D *rv3d)
{
const char *name = NULL;
switch (rv3d->view) {
case RV3D_VIEW_FRONT:
- if (rv3d->persp == RV3D_ORTHO) name = IFACE_("Front Ortho");
- else name = IFACE_("Front Persp");
+ if (rv3d->persp == RV3D_ORTHO) name = IFACE_("Front Orthographic");
+ else name = IFACE_("Front Perspective");
break;
case RV3D_VIEW_BACK:
- if (rv3d->persp == RV3D_ORTHO) name = IFACE_("Back Ortho");
- else name = IFACE_("Back Persp");
+ if (rv3d->persp == RV3D_ORTHO) name = IFACE_("Back Orthographic");
+ else name = IFACE_("Back Perspective");
break;
case RV3D_VIEW_TOP:
- if (rv3d->persp == RV3D_ORTHO) name = IFACE_("Top Ortho");
- else name = IFACE_("Top Persp");
+ if (rv3d->persp == RV3D_ORTHO) name = IFACE_("Top Orthographic");
+ else name = IFACE_("Top Perspective");
break;
case RV3D_VIEW_BOTTOM:
- if (rv3d->persp == RV3D_ORTHO) name = IFACE_("Bottom Ortho");
- else name = IFACE_("Bottom Persp");
+ if (rv3d->persp == RV3D_ORTHO) name = IFACE_("Bottom Orthographic");
+ else name = IFACE_("Bottom Perspective");
break;
case RV3D_VIEW_RIGHT:
- if (rv3d->persp == RV3D_ORTHO) name = IFACE_("Right Ortho");
- else name = IFACE_("Right Persp");
+ if (rv3d->persp == RV3D_ORTHO) name = IFACE_("Right Orthographic");
+ else name = IFACE_("Right Perspective");
break;
case RV3D_VIEW_LEFT:
- if (rv3d->persp == RV3D_ORTHO) name = IFACE_("Left Ortho");
- else name = IFACE_("Left Persp");
+ if (rv3d->persp == RV3D_ORTHO) name = IFACE_("Left Orthographic");
+ else name = IFACE_("Left Perspective");
break;
default:
@@ -1025,14 +1055,14 @@ static const char *view3d_get_name(View3D *v3d, RegionView3D *rv3d)
Camera *cam;
cam = v3d->camera->data;
if (cam->type == CAM_PERSP) {
- name = IFACE_("Camera Persp");
+ name = IFACE_("Camera Perspective");
}
else if (cam->type == CAM_ORTHO) {
- name = IFACE_("Camera Ortho");
+ name = IFACE_("Camera Orthographic");
}
else {
BLI_assert(cam->type == CAM_PANO);
- name = IFACE_("Camera Pano");
+ name = IFACE_("Camera Panoramic");
}
}
else {
@@ -1040,17 +1070,19 @@ static const char *view3d_get_name(View3D *v3d, RegionView3D *rv3d)
}
}
else {
- name = (rv3d->persp == RV3D_ORTHO) ? IFACE_("User Ortho") : IFACE_("User Persp");
+ name = (rv3d->persp == RV3D_ORTHO) ? IFACE_("User Orthographic") : IFACE_("User Perspective");
}
}
return name;
}
-static void draw_viewport_name(ARegion *ar, View3D *v3d, const rcti *rect)
+static void draw_viewport_name(ARegion *ar, View3D *v3d, int xoffset, int *yoffset)
{
RegionView3D *rv3d = ar->regiondata;
const char *name = view3d_get_name(v3d, rv3d);
+ const int font_id = BLF_default();
+
/* increase size for unicode languages (Chinese in utf-8...) */
#ifdef WITH_INTERNATIONAL
char tmpstr[96];
@@ -1058,17 +1090,26 @@ static void draw_viewport_name(ARegion *ar, View3D *v3d, const rcti *rect)
char tmpstr[32];
#endif
+ BLF_enable(font_id, BLF_SHADOW);
+ BLF_shadow(font_id, 5, (const float[4]){0.0f, 0.0f, 0.0f, 1.0f});
+ BLF_shadow_offset(font_id, 1, -1);
+
if (v3d->localvd) {
BLI_snprintf(tmpstr, sizeof(tmpstr), IFACE_("%s (Local)"), name);
name = tmpstr;
}
UI_FontThemeColor(BLF_default(), TH_TEXT_HI);
+
+ *yoffset -= U.widget_unit;
+
#ifdef WITH_INTERNATIONAL
- BLF_draw_default(U.widget_unit + rect->xmin, rect->ymax - U.widget_unit, 0.0f, name, sizeof(tmpstr));
+ BLF_draw_default(xoffset, *yoffset, 0.0f, name, sizeof(tmpstr));
#else
- BLF_draw_default_ascii(U.widget_unit + rect->xmin, rect->ymax - U.widget_unit, 0.0f, name, sizeof(tmpstr));
+ BLF_draw_default_ascii(xoffset, *yoffset, 0.0f, name, sizeof(tmpstr));
#endif
+
+ BLF_disable(font_id, BLF_SHADOW);
}
/**
@@ -1076,7 +1117,7 @@ static void draw_viewport_name(ARegion *ar, View3D *v3d, const rcti *rect)
* framenum, object name, bone name (if available), marker name (if available)
*/
-static void draw_selected_name(Scene *scene, Object *ob, rcti *rect)
+static void draw_selected_name(Scene *scene, Object *ob, int xoffset, int *yoffset)
{
const int cfra = CFRA;
const char *msg_pin = " (Pinned)";
@@ -1176,15 +1217,22 @@ static void draw_selected_name(Scene *scene, Object *ob, rcti *rect)
s += sprintf(s, " <%s>", markern);
}
- BLF_draw_default(rect->xmin + UI_UNIT_X, rect->ymax - (2 * U.widget_unit), 0.0f, info, sizeof(info));
+ BLF_enable(font_id, BLF_SHADOW);
+ BLF_shadow(font_id, 5, (const float[4]){0.0f, 0.0f, 0.0f, 1.0f});
+ BLF_shadow_offset(font_id, 1, -1);
+
+ *yoffset -= U.widget_unit;
+ BLF_draw_default(xoffset, *yoffset, 0.0f, info, sizeof(info));
+
+ BLF_disable(font_id, BLF_SHADOW);
}
/* ******************** view loop ***************** */
/**
-* Information drawn on top of the solid plates and composed data
-*/
-void view3d_draw_region_info(const bContext *C, ARegion *ar, const int UNUSED(offset))
+ * Information drawn on top of the solid plates and composed data
+ */
+void view3d_draw_region_info(const bContext *C, ARegion *ar)
{
RegionView3D *rv3d = ar->regiondata;
View3D *v3d = CTX_wm_view3d(C);
@@ -1194,7 +1242,7 @@ void view3d_draw_region_info(const bContext *C, ARegion *ar, const int UNUSED(of
/* correct projection matrix */
ED_region_pixelspace(ar);
- /* local coordinate visible rect inside region, to accomodate overlapping ui */
+ /* local coordinate visible rect inside region, to accommodate overlapping ui */
rcti rect;
ED_region_visible_rect(ar, &rect);
@@ -1215,20 +1263,23 @@ void view3d_draw_region_info(const bContext *C, ARegion *ar, const int UNUSED(of
draw_view_axis(rv3d, &rect);
}
+ int xoffset = rect.xmin + U.widget_unit;
+ int yoffset = rect.ymax;
+
if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0 &&
(v3d->overlay.flag & V3D_OVERLAY_HIDE_TEXT) == 0)
{
if ((U.uiflag & USER_SHOW_FPS) && ED_screen_animation_no_scrub(wm)) {
- ED_scene_draw_fps(scene, &rect);
+ ED_scene_draw_fps(scene, xoffset, &yoffset);
}
else if (U.uiflag & USER_SHOW_VIEWPORTNAME) {
- draw_viewport_name(ar, v3d, &rect);
+ draw_viewport_name(ar, v3d, xoffset, &yoffset);
}
if (U.uiflag & USER_DRAWVIEWINFO) {
ViewLayer *view_layer = CTX_data_view_layer(C);
Object *ob = OBACT(view_layer);
- draw_selected_name(scene, ob, &rect);
+ draw_selected_name(scene, ob, xoffset, &yoffset);
}
#if 0 /* TODO */
@@ -1240,14 +1291,16 @@ void view3d_draw_region_info(const bContext *C, ARegion *ar, const int UNUSED(of
BLI_snprintf(numstr, sizeof(numstr), "%s x %.4g", grid_unit, v3d->grid);
}
- BLF_draw_default_ascii(
- rect.xmin + U.widget_unit,
- rect.ymax - (USER_SHOW_VIEWPORTNAME ? 2 * U.widget_unit : U.widget_unit), 0.0f,
- numstr[0] ? numstr : grid_unit, sizeof(numstr));
+ *yoffset -= U.widget_unit;
+ BLF_draw_default_ascii(xoffset, *yoffset, numstr[0] ? numstr : grid_unit, sizeof(numstr));
}
#endif
}
+ if ((v3d->overlay.flag & V3D_OVERLAY_HIDE_TEXT) == 0) {
+ DRW_draw_region_engine_info(xoffset, yoffset);
+ }
+
BLF_batch_draw_end();
}
@@ -1255,14 +1308,14 @@ static void view3d_draw_view(const bContext *C, ARegion *ar)
{
ED_view3d_draw_setup_view(CTX_wm_window(C), CTX_data_depsgraph(C), CTX_data_scene(C), ar, CTX_wm_view3d(C), NULL, NULL, NULL);
- /* Only 100% compliant on new spec goes bellow */
+ /* Only 100% compliant on new spec goes below */
DRW_draw_view(C);
}
RenderEngineType *ED_view3d_engine_type(Scene *scene, int drawtype)
{
/*
- * Tempory viewport draw modes until we have a proper system.
+ * Temporary viewport draw modes until we have a proper system.
* all modes are done in the draw manager, except
* cycles material as it is an external render engine.
*/
@@ -1598,7 +1651,6 @@ ImBuf *ED_view3d_draw_offscreen_imbuf_simple(
ar.regiontype = RGN_TYPE_WINDOW;
v3d.camera = camera;
- v3d.lay = scene->lay;
v3d.shading.type = drawtype;
v3d.flag2 = V3D_RENDER_OVERRIDE;
diff --git a/source/blender/editors/space_view3d/view3d_draw_legacy.c b/source/blender/editors/space_view3d/view3d_draw_legacy.c
index 612be3ad6aa..f51a46cd95f 100644
--- a/source/blender/editors/space_view3d/view3d_draw_legacy.c
+++ b/source/blender/editors/space_view3d/view3d_draw_legacy.c
@@ -515,7 +515,7 @@ static void view3d_draw_bgpic(Scene *scene, Depsgraph *depsgraph,
ima = bgpic->ima;
if (ima == NULL)
continue;
- BKE_image_user_frame_calc(&bgpic->iuser, (int)DEG_get_ctime(depsgraph), 0);
+ BKE_image_user_frame_calc(&bgpic->iuser, (int)DEG_get_ctime(depsgraph));
if (ima->source == IMA_SRC_SEQUENCE && !(bgpic->iuser.flag & IMA_USER_FRAME_IN_RANGE)) {
ibuf = NULL; /* frame is out of range, dont show */
}
@@ -881,9 +881,7 @@ void ED_view3d_draw_depth_gpencil(
GPU_depth_test(true);
- if (v3d->flag2 & V3D_SHOW_ANNOTATION) {
- ED_gpencil_draw_view3d(NULL, scene, view_layer, depsgraph, v3d, ar, true);
- }
+ ED_gpencil_draw_view3d(NULL, scene, view_layer, depsgraph, v3d, ar, true);
GPU_depth_test(false);
}
@@ -967,7 +965,7 @@ void ED_view3d_mats_rv3d_restore(struct RegionView3D *rv3d, struct RV3DMatrixSto
* \note The info that this uses is updated in #ED_refresh_viewport_fps,
* which currently gets called during #SCREEN_OT_animation_step.
*/
-void ED_scene_draw_fps(Scene *scene, const rcti *rect)
+void ED_scene_draw_fps(Scene *scene, int xoffset, int *yoffset)
{
ScreenFrameRateInfo *fpsi = scene->fps_info;
char printable[16];
@@ -1014,11 +1012,19 @@ void ED_scene_draw_fps(Scene *scene, const rcti *rect)
BLI_snprintf(printable, sizeof(printable), IFACE_("fps: %i"), (int)(fps + 0.5f));
}
+ BLF_enable(font_id, BLF_SHADOW);
+ BLF_shadow(font_id, 5, (const float[4]){0.0f, 0.0f, 0.0f, 1.0f});
+ BLF_shadow_offset(font_id, 1, -1);
+
+ *yoffset -= U.widget_unit;
+
#ifdef WITH_INTERNATIONAL
- BLF_draw_default(rect->xmin + U.widget_unit, rect->ymax - U.widget_unit, 0.0f, printable, sizeof(printable));
+ BLF_draw_default(xoffset, *yoffset, 0.0f, printable, sizeof(printable));
#else
- BLF_draw_default_ascii(rect->xmin + U.widget_unit, rect->ymax - U.widget_unit, 0.0f, printable, sizeof(printable));
+ BLF_draw_default_ascii(xoffset, *yoffset, 0.0f, printable, sizeof(printable));
#endif
+
+ BLF_disable(font_id, BLF_SHADOW);
}
static bool view3d_main_region_do_render_draw(const Scene *scene)
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 2e9b01c9ea2..beb71a83dad 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -48,6 +48,7 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
+#include "BKE_action.h"
#include "BKE_armature.h"
#include "BKE_camera.h"
#include "BKE_context.h"
@@ -61,7 +62,6 @@
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
-#include "BKE_action.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
@@ -588,13 +588,6 @@ void viewrotate_modal_keymap(wmKeyConfig *keyconf)
keymap = WM_modalkeymap_add(keyconf, "View3D Rotate Modal", modal_items);
- /* items for modal map */
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, KM_ANY, 0, VIEW_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, VIEW_MODAL_CONFIRM);
-
- WM_modalkeymap_add_item(keymap, LEFTALTKEY, KM_PRESS, KM_ANY, 0, VIEWROT_MODAL_AXIS_SNAP_ENABLE);
- WM_modalkeymap_add_item(keymap, LEFTALTKEY, KM_RELEASE, KM_ANY, 0, VIEWROT_MODAL_AXIS_SNAP_DISABLE);
-
/* disabled mode switching for now, can re-implement better, later on */
#if 0
WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_ANY, 0, VIEWROT_MODAL_SWITCH_ZOOM);
@@ -807,7 +800,7 @@ static void viewrotate_apply(ViewOpsData *vod, const int event_xy[2])
/* avoid precision loss over time */
normalize_qt(vod->curr.viewquat);
- /* use a working copy so view rotation locking doesnt overwrite the locked
+ /* use a working copy so view rotation locking doesn't overwrite the locked
* rotation back into the view we calculate with */
copy_qt_qt(rv3d->viewquat, vod->curr.viewquat);
@@ -1050,7 +1043,7 @@ static float view3d_ndof_pan_speed_calc(RegionView3D *rv3d)
/**
* Zoom and pan in the same function since sometimes zoom is interpreted as dolly (pan forward).
*
- * \param has_zoom zoom, otherwise dolly, often `!rv3d->is_persp` since it doesnt make sense to dolly in ortho.
+ * \param has_zoom zoom, otherwise dolly, often `!rv3d->is_persp` since it doesn't make sense to dolly in ortho.
*/
static void view3d_ndof_pan_zoom(
const struct wmNDOFMotionData *ndof, ScrArea *sa, ARegion *ar,
@@ -1792,10 +1785,6 @@ void viewzoom_modal_keymap(wmKeyConfig *keyconf)
keymap = WM_modalkeymap_add(keyconf, "View3D Zoom Modal", modal_items);
- /* items for modal map */
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, KM_ANY, 0, VIEW_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, VIEW_MODAL_CONFIRM);
-
/* disabled mode switching for now, can re-implement better, later on */
#if 0
WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, KM_ANY, 0, VIEWROT_MODAL_SWITCH_ROTATE);
@@ -2327,10 +2316,6 @@ void viewdolly_modal_keymap(wmKeyConfig *keyconf)
keymap = WM_modalkeymap_add(keyconf, "View3D Dolly Modal", modal_items);
- /* items for modal map */
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, KM_ANY, 0, VIEW_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, VIEW_MODAL_CONFIRM);
-
/* disabled mode switching for now, can re-implement better, later on */
#if 0
WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, KM_ANY, 0, VIEWROT_MODAL_SWITCH_ROTATE);
@@ -2830,7 +2815,7 @@ static int viewselected_exec(bContext *C, wmOperator *op)
const int smooth_viewtx = WM_operator_smooth_viewtx_get(op);
INIT_MINMAX(min, max);
- if (is_gp_edit || is_face_map) {
+ if (is_face_map) {
ob_eval = NULL;
}
@@ -2850,7 +2835,6 @@ static int viewselected_exec(bContext *C, wmOperator *op)
}
if (is_gp_edit) {
- /* TODO(sergey): Check on this after gpencil merge. */
CTX_DATA_BEGIN(C, bGPDstroke *, gps, editable_gpencil_strokes)
{
/* we're only interested in selected points here... */
@@ -2859,6 +2843,14 @@ static int viewselected_exec(bContext *C, wmOperator *op)
}
}
CTX_DATA_END;
+
+ if ((ob_eval) && (ok)) {
+ add_v3_v3(min, ob_eval->obmat[3]);
+ add_v3_v3(max, ob_eval->obmat[3]);
+ }
+ }
+ else if (ob_eval && (ob_eval->type == OB_GPENCIL)) {
+ ok |= BKE_gpencil_data_minmax(ob_eval, gpd, min, max);
}
else if (is_face_map) {
ok = WM_gizmomap_minmax(ar->gizmo_map, true, true, min, max);
@@ -3235,7 +3227,7 @@ static int render_border_exec(bContext *C, wmOperator *op)
rcti rect;
rctf vb, border;
- /* get border select values using rna */
+ /* get box select values using rna */
WM_operator_properties_border_to_rcti(op, &rect);
/* calculate range */
@@ -3301,10 +3293,10 @@ void VIEW3D_OT_render_border(wmOperatorType *ot)
ot->idname = "VIEW3D_OT_render_border";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
+ ot->invoke = WM_gesture_box_invoke;
ot->exec = render_border_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = ED_operator_view3d_active;
@@ -3397,7 +3389,7 @@ static int view3d_zoom_border_exec(bContext *C, wmOperator *op)
/* note; otherwise opengl won't work */
view3d_operator_needs_opengl(C);
- /* get border select values using rna */
+ /* get box select values using rna */
WM_operator_properties_border_to_rcti(op, &rect);
/* check if zooming in/out view */
@@ -3519,10 +3511,10 @@ void VIEW3D_OT_zoom_border(wmOperatorType *ot)
ot->idname = "VIEW3D_OT_zoom_border";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
+ ot->invoke = WM_gesture_box_invoke;
ot->exec = view3d_zoom_border_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = ED_operator_region_view3d_active;
@@ -3530,7 +3522,7 @@ void VIEW3D_OT_zoom_border(wmOperatorType *ot)
ot->flag = 0;
/* properties */
- WM_operator_properties_gesture_border_zoom(ot);
+ WM_operator_properties_gesture_box_zoom(ot);
}
/** \} */
@@ -3863,7 +3855,7 @@ static int view_camera_exec(bContext *C, wmOperator *op)
if (v3d->camera == NULL)
v3d->camera = BKE_view_layer_camera_find(view_layer);
- /* couldnt find any useful camera, bail out */
+ /* couldn't find any useful camera, bail out */
if (v3d->camera == NULL)
return OPERATOR_CANCELLED;
@@ -4593,7 +4585,7 @@ static int view3d_clipping_invoke(bContext *C, wmOperator *op, const wmEvent *ev
return OPERATOR_FINISHED;
}
else {
- return WM_gesture_border_invoke(C, op, event);
+ return WM_gesture_box_invoke(C, op, event);
}
}
@@ -4608,8 +4600,8 @@ void VIEW3D_OT_clip_border(wmOperatorType *ot)
/* api callbacks */
ot->invoke = view3d_clipping_invoke;
ot->exec = view3d_clipping_exec;
- ot->modal = WM_gesture_border_modal;
- ot->cancel = WM_gesture_border_cancel;
+ ot->modal = WM_gesture_box_modal;
+ ot->cancel = WM_gesture_box_cancel;
ot->poll = ED_operator_region_view3d_active;
@@ -4868,7 +4860,8 @@ void VIEW3D_OT_cursor3d(wmOperatorType *ot)
* \{ */
static const EnumPropertyItem prop_shading_type_items[] = {
- {OB_SOLID, "SOLID", 0, "Solid and X-Ray", "Toggle solid and X-ray shading"},
+ {OB_WIRE, "WIREFRAME", 0, "Wireframe", "Toggle wireframe shading"},
+ {OB_SOLID, "SOLID", 0, "Solid", "Toggle solid shading"},
{OB_MATERIAL, "MATERIAL", 0, "LookDev", "Toggle lookdev shading"},
{OB_RENDER, "RENDERED", 0, "Rendered", "Toggle rendered shading"},
{0, NULL, 0, NULL, NULL}
@@ -4881,36 +4874,25 @@ static int toggle_shading_exec(bContext *C, wmOperator *op)
ScrArea *sa = CTX_wm_area(C);
int type = RNA_enum_get(op->ptr, "type");
- if (type == OB_SOLID) {
- if (v3d->shading.type == OB_SOLID) {
- /* Toggle X-Ray if already in solid mode. */
- if (ED_operator_posemode(C) || ED_operator_editmesh(C)) {
- v3d->flag ^= V3D_ZBUF_SELECT;
- }
- else {
- v3d->shading.flag ^= V3D_SHADING_XRAY;
- }
+ if (ELEM(type, OB_WIRE, OB_SOLID)) {
+ if (v3d->shading.type != type) {
+ v3d->shading.type = type;
}
- else {
- /* Go to solid mode. */
- v3d->shading.type = OB_SOLID;
- }
- }
- else if (type == OB_MATERIAL) {
- if (v3d->shading.type == OB_MATERIAL) {
+ else if (v3d->shading.type == OB_WIRE) {
v3d->shading.type = OB_SOLID;
}
else {
- v3d->shading.type = OB_MATERIAL;
+ v3d->shading.type = OB_WIRE;
}
}
- else if (type == OB_RENDER) {
- if (v3d->shading.type == OB_RENDER) {
+ else {
+
+ if (v3d->shading.type == type) {
v3d->shading.type = v3d->shading.prev_type;
}
else {
v3d->shading.prev_type = v3d->shading.type;
- v3d->shading.type = OB_RENDER;
+ v3d->shading.type = type;
}
}
diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c
index 3cf036e1ce1..345d9fe39de 100644
--- a/source/blender/editors/space_view3d/view3d_fly.c
+++ b/source/blender/editors/space_view3d/view3d_fly.c
@@ -28,7 +28,7 @@
#ifdef WITH_INPUT_NDOF
//# define NDOF_FLY_DEBUG
-//# define NDOF_FLY_DRAW_TOOMUCH /* is this needed for ndof? - commented so redraw doesnt thrash - campbell */
+//# define NDOF_FLY_DRAW_TOOMUCH /* is this needed for ndof? - commented so redraw doesn't thrash - campbell */
#endif /* WITH_INPUT_NDOF */
#include "DNA_object_types.h"
@@ -137,56 +137,6 @@ void fly_modal_keymap(wmKeyConfig *keyconf)
keymap = WM_modalkeymap_add(keyconf, "View3D Fly Modal", modal_items);
- /* items for modal map */
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_ANY, KM_ANY, 0, FLY_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CANCEL);
-
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_ANY, KM_ANY, 0, FLY_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, SPACEKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM);
-
- WM_modalkeymap_add_item(keymap, PADPLUSKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_ACCELERATE);
- WM_modalkeymap_add_item(keymap, PADMINUS, KM_PRESS, KM_ANY, 0, FLY_MODAL_DECELERATE);
- WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, KM_ANY, 0, FLY_MODAL_ACCELERATE);
- WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, KM_ANY, 0, FLY_MODAL_DECELERATE);
-
- WM_modalkeymap_add_item(keymap, MOUSEPAN, 0, 0, 0, FLY_MODAL_SPEED);
-
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_PRESS, KM_ANY, 0, FLY_MODAL_PAN_ENABLE);
- /* XXX - Bug in the event system, middle mouse release doesnt work */
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, KM_ANY, 0, FLY_MODAL_PAN_DISABLE);
-
- /* WASD */
- WM_modalkeymap_add_item(keymap, WKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_FORWARD);
- WM_modalkeymap_add_item(keymap, SKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_BACKWARD);
- WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_LEFT);
- WM_modalkeymap_add_item(keymap, DKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_RIGHT);
- WM_modalkeymap_add_item(keymap, EKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_UP);
- WM_modalkeymap_add_item(keymap, QKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_DOWN);
-
- /* for legacy reasons, leave R/F working */
- WM_modalkeymap_add_item(keymap, RKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_UP);
- WM_modalkeymap_add_item(keymap, FKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_DOWN);
-
- WM_modalkeymap_add_item(keymap, UPARROWKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_FORWARD);
- WM_modalkeymap_add_item(keymap, DOWNARROWKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_BACKWARD);
- WM_modalkeymap_add_item(keymap, LEFTARROWKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_LEFT);
- WM_modalkeymap_add_item(keymap, RIGHTARROWKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_RIGHT);
-
- WM_modalkeymap_add_item(keymap, XKEY, KM_PRESS, 0, 0, FLY_MODAL_AXIS_LOCK_X);
- WM_modalkeymap_add_item(keymap, ZKEY, KM_PRESS, 0, 0, FLY_MODAL_AXIS_LOCK_Z);
-
- WM_modalkeymap_add_item(keymap, LEFTALTKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_PRECISION_ENABLE);
- WM_modalkeymap_add_item(keymap, LEFTALTKEY, KM_RELEASE, KM_ANY, 0, FLY_MODAL_PRECISION_DISABLE);
-
- /* for legacy reasons, leave shift working */
- WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_PRECISION_ENABLE);
- WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_RELEASE, KM_ANY, 0, FLY_MODAL_PRECISION_DISABLE);
-
- WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_FREELOOK_ENABLE);
- WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, FLY_MODAL_FREELOOK_DISABLE);
-
/* assign map to operators */
WM_modalkeymap_assign(keymap, "VIEW3D_OT_fly");
}
@@ -746,7 +696,7 @@ static int flyApply(bContext *C, FlyInfo *fly)
RegionView3D *rv3d = fly->rv3d;
float mat[3][3]; /* 3x3 copy of the view matrix so we can move along the view axis */
- float dvec[3] = {0, 0, 0}; /* this is the direction thast added to the view offset per redraw */
+ float dvec[3] = {0, 0, 0}; /* this is the direction that's added to the view offset per redraw */
/* Camera Uprighting variables */
float moffset[2]; /* mouse offset from the views center */
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_armature.c b/source/blender/editors/space_view3d/view3d_gizmo_armature.c
index 88a95e89bd8..eea906620a6 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_armature.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_armature.c
@@ -155,7 +155,7 @@ static void WIDGETGROUP_armature_spline_setup(const bContext *C, wmGizmoGroup *g
Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C));
bPoseChannel *pchan = BKE_pose_channel_active(ob);
- const wmGizmoType *gzt_grab = WM_gizmotype_find("GIZMO_GT_grab_3d", true);
+ const wmGizmoType *gzt_move = WM_gizmotype_find("GIZMO_GT_move_3d", true);
struct BoneSplineWidgetGroup *bspline_group = MEM_callocN(sizeof(struct BoneSplineWidgetGroup), __func__);
gzgroup->customdata = bspline_group;
@@ -163,10 +163,10 @@ static void WIDGETGROUP_armature_spline_setup(const bContext *C, wmGizmoGroup *g
/* Handles */
for (int i = 0; i < ARRAY_SIZE(bspline_group->handles); i++) {
wmGizmo *gz;
- gz = bspline_group->handles[i].gizmo = WM_gizmo_new_ptr(gzt_grab, gzgroup, NULL);
- RNA_enum_set(gz->ptr, "draw_style", ED_GIZMO_GRAB_STYLE_RING_2D);
+ gz = bspline_group->handles[i].gizmo = WM_gizmo_new_ptr(gzt_move, gzgroup, NULL);
+ RNA_enum_set(gz->ptr, "draw_style", ED_GIZMO_MOVE_STYLE_RING_2D);
RNA_enum_set(gz->ptr, "draw_options",
- ED_GIZMO_GRAB_DRAW_FLAG_FILL | ED_GIZMO_GRAB_DRAW_FLAG_ALIGN_VIEW);
+ ED_GIZMO_MOVE_DRAW_FLAG_FILL | ED_GIZMO_MOVE_DRAW_FLAG_ALIGN_VIEW);
WM_gizmo_set_flag(gz, WM_GIZMO_DRAW_VALUE, true);
UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, gz->color);
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_camera.c b/source/blender/editors/space_view3d/view3d_gizmo_camera.c
index 87b11f5d7a3..0878bef98f2 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_camera.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_camera.c
@@ -246,7 +246,7 @@ static void WIDGETGROUP_camera_message_subscribe(
{
extern PropertyRNA rna_Camera_dof_distance;
- extern PropertyRNA rna_Camera_draw_size;
+ extern PropertyRNA rna_Camera_display_size;
extern PropertyRNA rna_Camera_ortho_scale;
extern PropertyRNA rna_Camera_sensor_fit;
extern PropertyRNA rna_Camera_sensor_width;
@@ -256,7 +256,7 @@ static void WIDGETGROUP_camera_message_subscribe(
extern PropertyRNA rna_Camera_lens;
const PropertyRNA *props[] = {
&rna_Camera_dof_distance,
- &rna_Camera_draw_size,
+ &rna_Camera_display_size,
&rna_Camera_ortho_scale,
&rna_Camera_sensor_fit,
&rna_Camera_sensor_width,
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_empty.c b/source/blender/editors/space_view3d/view3d_gizmo_empty.c
index 2913ba245e7..c58b1a6d6cd 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_empty.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_empty.c
@@ -31,6 +31,8 @@
#include "BKE_object.h"
#include "BKE_image.h"
+#include "DEG_depsgraph.h"
+
#include "DNA_object_types.h"
#include "DNA_lamp_types.h"
@@ -94,6 +96,7 @@ static void gizmo_empty_image_prop_matrix_set(
Object *ob = igzgroup->state.ob;
ob->empty_drawsize = matrix[0][0];
+ DEG_id_tag_update(&ob->id, DEG_TAG_TRANSFORM);
float dims[2];
RNA_float_get_array(gz->ptr, "dimensions", dims);
@@ -104,9 +107,21 @@ static void gizmo_empty_image_prop_matrix_set(
ob->ima_ofs[1] = (matrix[3][1] - (0.5f * dims[1])) / dims[1];
}
+static bool is_image_empty_visible(Object *ob, RegionView3D *rv3d)
+{
+ int visibility_flag = ob->empty_image_visibility_flag;
+ if (rv3d->is_persp) {
+ return visibility_flag & OB_EMPTY_IMAGE_VISIBLE_PERSPECTIVE;
+ }
+ else {
+ return visibility_flag & OB_EMPTY_IMAGE_VISIBLE_ORTHOGRAPHIC;
+ }
+}
+
static bool WIDGETGROUP_empty_image_poll(const bContext *C, wmGizmoGroupType *UNUSED(gzgt))
{
View3D *v3d = CTX_wm_view3d(C);
+ RegionView3D *rv3d = CTX_wm_region_view3d(C);
if ((v3d->flag2 & V3D_RENDER_OVERRIDE) ||
(v3d->gizmo_flag & (V3D_GIZMO_HIDE | V3D_GIZMO_HIDE_CONTEXT)))
@@ -117,7 +132,9 @@ static bool WIDGETGROUP_empty_image_poll(const bContext *C, wmGizmoGroupType *UN
Object *ob = CTX_data_active_object(C);
if (ob && ob->type == OB_EMPTY) {
- return (ob->empty_drawtype == OB_EMPTY_IMAGE);
+ if (ob->empty_drawtype == OB_EMPTY_IMAGE) {
+ return is_image_empty_visible(ob, rv3d);
+ }
}
return false;
}
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_lamp.c b/source/blender/editors/space_view3d/view3d_gizmo_lamp.c
index 057c085b69d..044efae0402 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_lamp.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_lamp.c
@@ -261,7 +261,7 @@ static bool WIDGETGROUP_lamp_target_poll(const bContext *C, wmGizmoGroupType *UN
static void WIDGETGROUP_lamp_target_setup(const bContext *UNUSED(C), wmGizmoGroup *gzgroup)
{
wmGizmoWrapper *wwrapper = MEM_mallocN(sizeof(wmGizmoWrapper), __func__);
- wwrapper->gizmo = WM_gizmo_new("GIZMO_GT_grab_3d", gzgroup, NULL);
+ wwrapper->gizmo = WM_gizmo_new("GIZMO_GT_move_3d", gzgroup, NULL);
wmGizmo *gz = wwrapper->gizmo;
gzgroup->customdata = wwrapper;
@@ -274,7 +274,7 @@ static void WIDGETGROUP_lamp_target_setup(const bContext *UNUSED(C), wmGizmoGrou
wmOperatorType *ot = WM_operatortype_find("OBJECT_OT_transform_axis_target", true);
RNA_enum_set(gz->ptr, "draw_options",
- ED_GIZMO_GRAB_DRAW_FLAG_FILL | ED_GIZMO_GRAB_DRAW_FLAG_ALIGN_VIEW);
+ ED_GIZMO_MOVE_DRAW_FLAG_FILL | ED_GIZMO_MOVE_DRAW_FLAG_ALIGN_VIEW);
WM_gizmo_operator_set(gz, 0, ot, NULL);
}
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_navigate.c b/source/blender/editors/space_view3d/view3d_gizmo_navigate.c
index a234aa03482..d45da76a477 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_navigate.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_navigate.c
@@ -57,7 +57,7 @@
/* 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.42f
+#define GIZMO_MINI_OFFSET_FAC 0.38f
enum {
@@ -74,94 +74,40 @@ enum {
MPR_TOTAL = 6,
};
-/* Vector icons compatible with 'GPU_batch_from_poly_2d_encoded' */
-static const uchar shape_camera[] = {
- 0xa3, 0x19, 0x78, 0x55, 0x4d, 0x19, 0x4f, 0x0a, 0x7f, 0x00, 0xb0, 0x0a, 0xa9, 0x19,
- 0xa9, 0x19, 0x25, 0xda, 0x0a, 0xb0, 0x00, 0x7f, 0x0a, 0x4f, 0x25, 0x25, 0x4f, 0x0a,
- 0x4d, 0x19, 0x47, 0x19, 0x65, 0x55, 0x41, 0x55, 0x41, 0x9e, 0x43, 0xa8, 0x38, 0xb3,
- 0x34, 0xc3, 0x38, 0xd2, 0x43, 0xdd, 0x53, 0xe1, 0x62, 0xdd, 0x6d, 0xd2, 0x72, 0xc3,
- 0x78, 0xc3, 0x7c, 0xd2, 0x87, 0xdd, 0x96, 0xe1, 0xa6, 0xdd, 0xb1, 0xd2, 0xb5, 0xc3,
- 0xb1, 0xb3, 0xa6, 0xa8, 0xa9, 0x9e, 0xa9, 0x8c, 0xbb, 0x8c, 0xbb, 0x86, 0xc7, 0x86,
- 0xe0, 0x9e, 0xe0, 0x55, 0xc7, 0x6d, 0xbb, 0x6d, 0xbb, 0x67, 0xa9, 0x67, 0xa9, 0x55,
- 0x8a, 0x55, 0xa9, 0x19, 0xb0, 0x0a, 0xda, 0x25, 0xf5, 0x4f, 0xff, 0x80, 0xf5, 0xb0,
- 0xda, 0xda, 0xb0, 0xf5, 0x80, 0xff, 0x4f, 0xf5, 0x4f, 0xf5, 0x7c, 0xb3, 0x78, 0xc3,
- 0x72, 0xc3, 0x6d, 0xb3, 0x62, 0xa8, 0x53, 0xa4, 0x43, 0xa8, 0x41, 0x9e, 0xa9, 0x9e,
- 0xa6, 0xa8, 0x96, 0xa4, 0x87, 0xa8, 0x87, 0xa8,
-};
-static const uchar shape_ortho[] = {
- 0x85, 0x15, 0x85, 0x7c, 0xde, 0xb3, 0xde, 0xb8, 0xd9, 0xba, 0x80, 0x85, 0x27, 0xba,
- 0x22, 0xb8, 0x22, 0xb3, 0x7b, 0x7c, 0x7b, 0x15, 0x80, 0x12, 0x80, 0x12, 0x1d, 0xba,
- 0x80, 0xf2, 0x80, 0xff, 0x4f, 0xf5, 0x25, 0xda, 0x0a, 0xb0, 0x00, 0x7f, 0x0a, 0x4f,
- 0x25, 0x25, 0x4f, 0x0a, 0x7f, 0x00, 0x80, 0x0d, 0x1d, 0x45, 0x1d, 0x45, 0xb0, 0x0a,
- 0xda, 0x25, 0xf5, 0x4f, 0xff, 0x80, 0xf5, 0xb0, 0xda, 0xda, 0xb0, 0xf5, 0x80, 0xff,
- 0x80, 0xf2, 0xe3, 0xba, 0xe3, 0x45, 0x80, 0x0d, 0x7f, 0x00, 0x7f, 0x00,
-};
-static const uchar shape_pan[] = {
- 0xbf, 0x4c, 0xbf, 0x66, 0x99, 0x66, 0x99, 0x40, 0xb2, 0x40, 0x7f, 0x0d, 0x7f, 0x00,
- 0xb0, 0x0a, 0xda, 0x25, 0xf5, 0x4f, 0xff, 0x80, 0xf5, 0xb0, 0xda, 0xda, 0xb0, 0xf5,
- 0x80, 0xff, 0x80, 0xf2, 0xb3, 0xbf, 0x99, 0xbf, 0x99, 0x99, 0xbf, 0x99, 0xbf, 0xb2,
- 0xf2, 0x7f, 0xf2, 0x7f, 0x40, 0xb3, 0x40, 0x99, 0x66, 0x99, 0x66, 0xbf, 0x4d, 0xbf,
- 0x80, 0xf2, 0x80, 0xff, 0x4f, 0xf5, 0x25, 0xda, 0x0a, 0xb0, 0x00, 0x7f, 0x0a, 0x4f,
- 0x25, 0x25, 0x4f, 0x0a, 0x7f, 0x00, 0x7f, 0x0d, 0x4c, 0x40, 0x66, 0x40, 0x66, 0x66,
- 0x40, 0x66, 0x40, 0x4d, 0x0d, 0x80, 0x0d, 0x80,
-};
-static const uchar shape_persp[] = {
- 0xda, 0xda, 0xb0, 0xf5, 0x80, 0xff, 0x4f, 0xf5, 0x25, 0xda, 0x0a, 0xb0, 0x00, 0x7f,
- 0x0a, 0x4f, 0x25, 0x25, 0x4f, 0x0a, 0x7f, 0x00, 0x80, 0x07, 0x30, 0x50, 0x18, 0xbd,
- 0x80, 0xdb, 0xe8, 0xbd, 0xf5, 0xb0, 0xf5, 0xb0, 0x83, 0x0f, 0x87, 0x7b, 0xe2, 0xb7,
- 0xe3, 0xba, 0xe0, 0xbb, 0x80, 0x87, 0x20, 0xbb, 0x1d, 0xba, 0x1d, 0xb7, 0x78, 0x7b,
- 0x7d, 0x0f, 0x80, 0x0c, 0x80, 0x0c, 0xd0, 0x50, 0x80, 0x07, 0x7f, 0x00, 0xb0, 0x0a,
- 0xda, 0x25, 0xf5, 0x4f, 0xff, 0x80, 0xf5, 0xb0, 0xe8, 0xbd, 0xe8, 0xbd,
-};
-static const uchar shape_zoom[] = {
- 0xad, 0x7f, 0xf1, 0x7f, 0xff, 0x80, 0xf5, 0xb0, 0xda, 0xda, 0xb0, 0xf5, 0x80, 0xff,
- 0x4f, 0xf5, 0x25, 0xda, 0x0a, 0xb0, 0x00, 0x7f, 0x0d, 0x7f, 0x52, 0x7f, 0x69, 0xb7,
- 0x48, 0xb7, 0x80, 0xd8, 0xb8, 0xb7, 0x96, 0xb7, 0x96, 0xb7, 0x7f, 0x2f, 0x0d, 0x7f,
- 0x00, 0x7f, 0x0a, 0x4f, 0x25, 0x25, 0x4f, 0x0a, 0x7f, 0x00, 0xb0, 0x0a, 0xda, 0x25,
- 0xf5, 0x4f, 0xff, 0x80, 0xf1, 0x7f, 0xf1, 0x7f,
-};
-
-
struct NavigateGizmoInfo {
const char *opname;
const char *gizmo;
- const unsigned char *shape;
- uint shape_size;
+ uint icon;
};
-#define SHAPE_VARS(shape_id) shape = shape_id, .shape_size = ARRAY_SIZE(shape_id)
-
static struct NavigateGizmoInfo g_navigate_params[MPR_TOTAL] = {
{
.opname = "VIEW3D_OT_move",
.gizmo = "GIZMO_GT_button_2d",
- .SHAPE_VARS(shape_pan),
+ ICON_VIEW_PAN,
}, {
.opname = "VIEW3D_OT_rotate",
.gizmo = "VIEW3D_GT_navigate_rotate",
- .shape = NULL,
- .shape_size = 0,
+ 0,
}, {
.opname = "VIEW3D_OT_zoom",
.gizmo = "GIZMO_GT_button_2d",
- .SHAPE_VARS(shape_zoom),
+ ICON_VIEW_ZOOM,
}, {
.opname = "VIEW3D_OT_view_persportho",
.gizmo = "GIZMO_GT_button_2d",
- .SHAPE_VARS(shape_persp),
+ ICON_VIEW_PERSPECTIVE,
}, {
.opname = "VIEW3D_OT_view_persportho",
.gizmo = "GIZMO_GT_button_2d",
- .SHAPE_VARS(shape_ortho),
+ ICON_VIEW_ORTHO,
}, {
.opname = "VIEW3D_OT_view_camera",
.gizmo = "GIZMO_GT_button_2d",
- .SHAPE_VARS(shape_camera),
+ ICON_VIEW_CAMERA,
},
};
-#undef SHAPE_VARS
-
struct NavigateWidgetGroup {
wmGizmo *gz_array[MPR_TOTAL];
/* Store the view state to check for changes. */
@@ -203,26 +149,26 @@ static void WIDGETGROUP_navigate_setup(const bContext *UNUSED(C), wmGizmoGroup *
const struct NavigateGizmoInfo *info = &g_navigate_params[i];
navgroup->gz_array[i] = WM_gizmo_new(info->gizmo, gzgroup, NULL);
wmGizmo *gz = navgroup->gz_array[i];
- gz->flag |= WM_GIZMO_GRAB_CURSOR | WM_GIZMO_DRAW_MODAL;
+ gz->flag |= WM_GIZMO_MOVE_CURSOR | WM_GIZMO_DRAW_MODAL;
if (i == MPR_ROTATE) {
gz->color[3] = 0.0f;
gz->color_hi[3] = 0.1f;
}
else {
- gz->color[3] = 0.2f;
- gz->color_hi[3] = 0.4f;
+ UI_GetThemeColorShade3fv(TH_HEADER, -40, gz->color);
+ UI_GetThemeColorShade3fv(TH_HEADER, 160, gz->color_hi);
+ gz->color[3] = 0.4f;
+ gz->color_hi[3] = 0.2f;
}
/* may be overwritten later */
gz->scale_basis = (GIZMO_SIZE * GIZMO_MINI_FAC) / 2;
- if (info->shape != NULL) {
- PropertyRNA *prop = RNA_struct_find_property(gz->ptr, "shape");
- RNA_property_string_set_bytes(
- gz->ptr, prop,
- (const char *)info->shape, info->shape_size);
- RNA_enum_set(gz->ptr, "draw_options", ED_GIZMO_BUTTON_SHOW_OUTLINE);
+ if (info->icon != 0) {
+ PropertyRNA *prop = RNA_struct_find_property(gz->ptr, "icon");
+ RNA_property_enum_set(gz->ptr, prop, info->icon);
+ RNA_enum_set(gz->ptr, "draw_options", ED_GIZMO_BUTTON_SHOW_OUTLINE | ED_GIZMO_BUTTON_SHOW_BACKDROP);
}
wmOperatorType *ot = WM_operatortype_find(info->opname, true);
@@ -248,8 +194,8 @@ static void WIDGETGROUP_navigate_setup(const bContext *UNUSED(C), wmGizmoGroup *
int gz_ids[] = {MPR_MOVE, MPR_ROTATE, MPR_ZOOM};
for (int i = 0; i < ARRAY_SIZE(gz_ids); i++) {
wmGizmo *gz = navgroup->gz_array[gz_ids[i]];
- wmGizmoOpElem *mpop = WM_gizmo_operator_get(gz, 0);
- RNA_boolean_set(&mpop->ptr, "use_mouse_init", false);
+ wmGizmoOpElem *gzop = WM_gizmo_operator_get(gz, 0);
+ RNA_boolean_set(&gzop->ptr, "use_mouse_init", false);
}
}
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 4b1fe375084..94284f8439d 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_navigate_type.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_navigate_type.c
@@ -60,10 +60,21 @@
#include "view3d_intern.h"
+#define USE_AXIS_FONT
+#ifdef USE_AXIS_FONT
+# include "BLF_api.h"
+#endif
+
#define DIAL_RESOLUTION 32
-#define HANDLE_SIZE 0.33
+/* 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)
+#ifndef USE_AXIS_FONT
/**
* \param viewmat_local_unit is typically the 'rv3d->viewmatob'
* copied into a 3x3 matrix and normalized.
@@ -167,8 +178,12 @@ static void draw_xyz_wire(
}
immEnd();
}
+#endif /* !USE_AXIS_FONT */
-static void axis_geom_draw(const wmGizmo *gz, const float color[4], const bool UNUSED(select))
+static void axis_geom_draw(
+ const wmGizmo *gz, const float color[4], const bool UNUSED(select),
+ /* Needed for screen-aligned font drawing. */
+ const float matrix_final[4][4])
{
GPU_line_width(gz->line_width);
@@ -191,10 +206,38 @@ static void axis_geom_draw(const wmGizmo *gz, const float color[4], const bool U
};
qsort(&axis_order, ARRAY_SIZE(axis_order), sizeof(axis_order[0]), BLI_sortutil_cmp_float);
- const float scale_axis = 0.25f;
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];
+
+
+#ifdef USE_AXIS_FONT
+ struct {
+ float matrix[4][4];
+ int id;
+ } font;
+
+ {
+ 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, 11 * U.dpi_fac, 72);
+
+ /* 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_final);
+ copy_m3_m4(m3_offset, gz->matrix_offset);
+ mul_m3_m3m3(m3, m3, m3_offset);
+ invert_m3(m3);
+ copy_m4_m3(font.matrix, m3);
+ }
+#else
+ UNUSED_VARS(matrix_final);
+#endif
+
GPU_matrix_push();
GPU_matrix_mul(gz->matrix_offset);
@@ -244,12 +287,8 @@ static void axis_geom_draw(const wmGizmo *gz, const float color[4], const bool U
/* 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, 3 * (is_pos ? 1 : -1)};
- const float v_final[3] = {
- v[index_x] * scale_axis,
- v[index_y] * scale_axis,
- v[index_z] * scale_axis,
- };
+ 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];
copy_v4_v4(color_current_fade, color_current);
@@ -281,7 +320,7 @@ static void axis_geom_draw(const wmGizmo *gz, const float color[4], const bool U
{
GPU_matrix_push();
GPU_matrix_translate_3fv(v_final);
- GPU_matrix_scale_1f(show_axis_char ? 0.22f : 0.18f);
+ GPU_matrix_scale_1f(show_axis_char ? 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);
@@ -292,11 +331,29 @@ static void axis_geom_draw(const wmGizmo *gz, const float color[4], const bool U
/* Axis XYZ Character. */
if (show_axis_char) {
+#ifdef USE_AXIS_FONT
+ immUnbindProgram();
+
+ GPU_matrix_push();
+ GPU_matrix_translate_3fv(v_final);
+ GPU_matrix_mul(font.matrix);
+
+ const char axis_str[2] = {'X' + axis, 0};
+ float offset[2] = {0};
+ BLF_width_and_height(font.id, axis_str, 2, &offset[0], &offset[1]);
+ BLF_position(font.id, roundf(offset[0] * -0.5f), roundf(offset[1] * -0.5f), 0);
+ BLF_draw_ascii(font.id, axis_str, 2);
+ GPU_blend(true); /* XXX, blf disables */
+ GPU_matrix_pop();
+
+ immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
+#else
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);
+#endif
}
}
}
@@ -325,7 +382,7 @@ static void axis3d_draw_intern(
GPU_matrix_mul(matrix_final);
GPU_blend(true);
- axis_geom_draw(gz, color, select);
+ axis_geom_draw(gz, color, select, matrix_final);
GPU_blend(false);
GPU_matrix_pop();
}
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_preselect.c b/source/blender/editors/space_view3d/view3d_gizmo_preselect.c
index aebad326a57..7b8e3a76c85 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_preselect.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_preselect.c
@@ -30,6 +30,7 @@
#include "BKE_context.h"
+#include "ED_gizmo_utils.h"
#include "ED_screen.h"
#include "UI_resources.h"
@@ -41,33 +42,57 @@
#include "view3d_intern.h" /* own include */
/* -------------------------------------------------------------------- */
-/** \name Mesh Pre-Select Edge Ring Gizmo
+/** \name Mesh Pre-Select Element Gizmo
*
* \{ */
-struct GizmoGroupPreSelEdgeRing {
+struct GizmoGroupPreSelElem {
wmGizmo *gizmo;
};
-static bool WIDGETGROUP_mesh_preselect_edgering_poll(const bContext *C, wmGizmoGroupType *gzgt)
+static void WIDGETGROUP_mesh_preselect_elem_setup(const bContext *UNUSED(C), wmGizmoGroup *gzgroup)
{
- bToolRef_Runtime *tref_rt = WM_toolsystem_runtime_from_context((bContext *)C);
- if ((tref_rt == NULL) ||
- !STREQ(gzgt->idname, tref_rt->gizmo_group))
- {
- WM_gizmo_group_type_unlink_delayed_ptr(gzgt);
- return false;
- }
- return true;
+ const wmGizmoType *gzt_presel = WM_gizmotype_find("GIZMO_GT_mesh_preselect_elem_3d", true);
+ struct GizmoGroupPreSelElem *ggd = MEM_callocN(sizeof(struct GizmoGroupPreSelElem), __func__);
+ gzgroup->customdata = ggd;
+
+ wmGizmo *gz = ggd->gizmo = WM_gizmo_new_ptr(gzt_presel, gzgroup, NULL);
+ UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, gz->color);
+ UI_GetThemeColor3fv(TH_GIZMO_HI, gz->color_hi);
}
+void VIEW3D_GGT_mesh_preselect_elem(wmGizmoGroupType *gzgt)
+{
+ gzgt->name = "Mesh Preselect Element";
+ gzgt->idname = "VIEW3D_GGT_mesh_preselect_elem";
+
+ gzgt->flag = WM_GIZMOGROUPTYPE_3D;
+
+ gzgt->gzmap_params.spaceid = SPACE_VIEW3D;
+ gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
+
+ gzgt->poll = ED_gizmo_poll_or_unlink_delayed_from_tool;
+ gzgt->setup = WIDGETGROUP_mesh_preselect_elem_setup;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Mesh Pre-Select Edge Ring Gizmo
+ *
+ * \{ */
+
+struct GizmoGroupPreSelEdgeRing {
+ wmGizmo *gizmo;
+};
+
static void WIDGETGROUP_mesh_preselect_edgering_setup(const bContext *UNUSED(C), wmGizmoGroup *gzgroup)
{
- const wmGizmoType *gzt_presel = WM_gizmotype_find("GIZMO_GT_preselect_edgering_3d", true);
- struct GizmoGroupPreSelEdgeRing *man = MEM_callocN(sizeof(struct GizmoGroupPreSelEdgeRing), __func__);
- gzgroup->customdata = man;
+ const wmGizmoType *gzt_presel = WM_gizmotype_find("GIZMO_GT_mesh_preselect_edgering_3d", true);
+ struct GizmoGroupPreSelEdgeRing *ggd = MEM_callocN(sizeof(struct GizmoGroupPreSelEdgeRing), __func__);
+ gzgroup->customdata = ggd;
- wmGizmo *gz = man->gizmo = WM_gizmo_new_ptr(gzt_presel, gzgroup, NULL);
+ wmGizmo *gz = ggd->gizmo = WM_gizmo_new_ptr(gzt_presel, gzgroup, NULL);
UI_GetThemeColor3fv(TH_GIZMO_PRIMARY, gz->color);
UI_GetThemeColor3fv(TH_GIZMO_HI, gz->color_hi);
}
@@ -82,7 +107,7 @@ void VIEW3D_GGT_mesh_preselect_edgering(wmGizmoGroupType *gzgt)
gzgt->gzmap_params.spaceid = SPACE_VIEW3D;
gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
- gzgt->poll = WIDGETGROUP_mesh_preselect_edgering_poll;
+ gzgt->poll = ED_gizmo_poll_or_unlink_delayed_from_tool;
gzgt->setup = WIDGETGROUP_mesh_preselect_edgering_setup;
}
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 fffca6c0887..6cd94830fe9 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c
@@ -55,15 +55,213 @@
#include "ED_gizmo_library.h"
/* -------------------------------------------------------------------- */
+/** \name Mesh Element (Vert/Edge/Face) Pre-Select Gizmo API
+ *
+ * \{ */
+
+
+typedef struct MeshElemGizmo3D {
+ wmGizmo gizmo;
+ Base **bases;
+ uint bases_len;
+ int base_index;
+ int vert_index;
+ int edge_index;
+ int face_index;
+ struct EditMesh_PreSelElem *psel;
+} MeshElemGizmo3D;
+
+static void gizmo_preselect_elem_draw(const bContext *UNUSED(C), wmGizmo *gz)
+{
+ MeshElemGizmo3D *gz_ele = (MeshElemGizmo3D *)gz;
+ if (gz_ele->base_index != -1) {
+ Object *ob = gz_ele->bases[gz_ele->base_index]->object;
+ EDBM_preselect_elem_draw(gz_ele->psel, ob->obmat);
+ }
+}
+
+static int gizmo_preselect_elem_test_select(
+ bContext *C, wmGizmo *gz, const int mval[2])
+{
+ MeshElemGizmo3D *gz_ele = (MeshElemGizmo3D *)gz;
+ struct {
+ Object *ob;
+ BMElem *ele;
+ float dist;
+ int base_index;
+ } best = {
+ .dist = ED_view3d_select_dist_px(),
+ };
+
+ struct {
+ int base_index;
+ int vert_index;
+ int edge_index;
+ int face_index;
+ } prev = {
+ .base_index = gz_ele->base_index,
+ .vert_index = gz_ele->vert_index,
+ .edge_index = gz_ele->edge_index,
+ .face_index = gz_ele->face_index,
+ };
+
+ {
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ if (((gz_ele->bases)) == NULL ||
+ (gz_ele->bases[0] != view_layer->basact))
+ {
+ MEM_SAFE_FREE(gz_ele->bases);
+ gz_ele->bases = BKE_view_layer_array_from_bases_in_edit_mode(
+ view_layer, &gz_ele->bases_len);
+ }
+ }
+
+ ViewContext vc;
+ em_setup_viewcontext(C, &vc);
+ copy_v2_v2_int(vc.mval, mval);
+
+ {
+ /* TODO: support faces. */
+ int base_index = -1;
+ BMVert *eve_test;
+ BMEdge *eed_test;
+
+ if (EDBM_unified_findnearest_from_raycast(
+ &vc, gz_ele->bases, gz_ele->bases_len,
+ true, &base_index, &eve_test, &eed_test, NULL))
+ {
+ Base *base = gz_ele->bases[base_index];
+ best.ob = base->object;
+ if (eve_test) {
+ best.ele = (BMElem *)eve_test;
+ }
+ else if (eed_test) {
+ best.ele = (BMElem *)eed_test;
+ }
+ else {
+ BLI_assert(0);
+ }
+ best.base_index = base_index;
+ /* Check above should never fail, if it does it's an internal error. */
+ BLI_assert(best.base_index != -1);
+ }
+ }
+
+ BMesh *bm = NULL;
+
+ gz_ele->base_index = -1;
+ gz_ele->vert_index = -1;
+ gz_ele->edge_index = -1;
+ gz_ele->face_index = -1;
+
+ if (best.ele) {
+ gz_ele->base_index = best.base_index;
+ bm = BKE_editmesh_from_object(gz_ele->bases[gz_ele->base_index]->object)->bm;
+ BM_mesh_elem_index_ensure(bm, best.ele->head.htype);
+
+ if (best.ele->head.htype == BM_VERT) {
+ gz_ele->vert_index = BM_elem_index_get(best.ele);
+ }
+ else if (best.ele->head.htype == BM_EDGE) {
+ gz_ele->edge_index = BM_elem_index_get(best.ele);
+ }
+ else if (best.ele->head.htype == BM_FACE) {
+ gz_ele->face_index = BM_elem_index_get(best.ele);
+ }
+ }
+
+ if ((prev.base_index == gz_ele->base_index) &&
+ (prev.vert_index == gz_ele->vert_index) &&
+ (prev.edge_index == gz_ele->edge_index) &&
+ (prev.face_index == gz_ele->face_index))
+ {
+ /* pass (only recalculate on change) */
+ }
+ else {
+ if (best.ele) {
+ const float (*coords)[3] = NULL;
+ {
+ Object *ob = gz_ele->bases[gz_ele->base_index]->object;
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
+ Mesh *me_eval = (Mesh *)DEG_get_evaluated_id(depsgraph, ob->data);
+ if (me_eval->runtime.edit_data) {
+ coords = me_eval->runtime.edit_data->vertexCos;
+ }
+ }
+ EDBM_preselect_elem_update_from_single(gz_ele->psel, bm, best.ele, coords);
+ }
+ else {
+ EDBM_preselect_elem_clear(gz_ele->psel);
+ }
+
+ RNA_int_set(gz->ptr, "object_index", gz_ele->base_index);
+ RNA_int_set(gz->ptr, "vert_index", gz_ele->vert_index);
+ RNA_int_set(gz->ptr, "edge_index", gz_ele->edge_index);
+ RNA_int_set(gz->ptr, "face_index", gz_ele->face_index);
+
+ ARegion *ar = CTX_wm_region(C);
+ ED_region_tag_redraw(ar);
+ }
+
+ // return best.eed ? 0 : -1;
+ return -1;
+}
+
+static void gizmo_preselect_elem_setup(wmGizmo *gz)
+{
+ MeshElemGizmo3D *gz_ele = (MeshElemGizmo3D *)gz;
+ if (gz_ele->psel == NULL) {
+ gz_ele->psel = EDBM_preselect_elem_create();
+ }
+ gz_ele->base_index = -1;
+}
+
+static void gizmo_preselect_elem_free(wmGizmo *gz)
+{
+ MeshElemGizmo3D *gz_ele = (MeshElemGizmo3D *)gz;
+ EDBM_preselect_elem_destroy(gz_ele->psel);
+ gz_ele->psel = NULL;
+ MEM_SAFE_FREE(gz_ele->bases);
+}
+
+static int gizmo_preselect_elem_invoke(
+ bContext *UNUSED(C), wmGizmo *UNUSED(gz), const wmEvent *UNUSED(event))
+{
+ return OPERATOR_PASS_THROUGH;
+}
+
+static void GIZMO_GT_mesh_preselect_elem_3d(wmGizmoType *gzt)
+{
+ /* identifiers */
+ gzt->idname = "GIZMO_GT_mesh_preselect_elem_3d";
+
+ /* api callbacks */
+ gzt->invoke = gizmo_preselect_elem_invoke;
+ gzt->draw = gizmo_preselect_elem_draw;
+ gzt->test_select = gizmo_preselect_elem_test_select;
+ gzt->setup = gizmo_preselect_elem_setup;
+ gzt->free = gizmo_preselect_elem_free;
+
+ gzt->struct_size = sizeof(MeshElemGizmo3D);
+
+ RNA_def_int(gzt->srna, "object_index", -1, -1, INT_MAX, "Object Index", "", -1, INT_MAX);
+ RNA_def_int(gzt->srna, "vert_index", -1, -1, INT_MAX, "Vert Index", "", -1, INT_MAX);
+ RNA_def_int(gzt->srna, "edge_index", -1, -1, INT_MAX, "Edge Index", "", -1, INT_MAX);
+ RNA_def_int(gzt->srna, "face_index", -1, -1, INT_MAX, "Face Index", "", -1, INT_MAX);
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
/** \name Mesh Edge-Ring Pre-Select Gizmo API
*
* \{ */
typedef struct MeshEdgeRingGizmo3D {
wmGizmo gizmo;
- Object **objects;
- uint objects_len;
- int object_index;
+ Base **bases;
+ uint bases_len;
+ int base_index;
int edge_index;
struct EditMesh_PreSelEdgeRing *psel;
} MeshEdgeRingGizmo3D;
@@ -71,8 +269,8 @@ typedef struct MeshEdgeRingGizmo3D {
static void gizmo_preselect_edgering_draw(const bContext *UNUSED(C), wmGizmo *gz)
{
MeshEdgeRingGizmo3D *gz_ring = (MeshEdgeRingGizmo3D *)gz;
- if (gz_ring->object_index != -1) {
- Object *ob = gz_ring->objects[gz_ring->object_index];
+ if (gz_ring->base_index != -1) {
+ Object *ob = gz_ring->bases[gz_ring->base_index]->object;
EDBM_preselect_edgering_draw(gz_ring->psel, ob->obmat);
}
}
@@ -85,54 +283,59 @@ static int gizmo_preselect_edgering_test_select(
Object *ob;
BMEdge *eed;
float dist;
- int ob_index;
+ int base_index;
} best = {
.dist = ED_view3d_select_dist_px(),
};
struct {
- int object_index;
+ int base_index;
int edge_index;
} prev = {
- .object_index = gz_ring->object_index,
+ .base_index = gz_ring->base_index,
.edge_index = gz_ring->edge_index,
};
- if (gz_ring->objects == NULL) {
+ {
ViewLayer *view_layer = CTX_data_view_layer(C);
- gz_ring->objects = BKE_view_layer_array_from_objects_in_edit_mode(
- view_layer, &gz_ring->objects_len);
+ if (((gz_ring->bases)) == NULL ||
+ (gz_ring->bases[0] != view_layer->basact))
+ {
+ MEM_SAFE_FREE(gz_ring->bases);
+ gz_ring->bases = BKE_view_layer_array_from_bases_in_edit_mode(
+ view_layer, &gz_ring->bases_len);
+ }
}
ViewContext vc;
em_setup_viewcontext(C, &vc);
copy_v2_v2_int(vc.mval, mval);
- for (uint ob_index = 0; ob_index < gz_ring->objects_len; ob_index++) {
- Object *ob_iter = gz_ring->objects[ob_index];
+ for (uint base_index = 0; base_index < gz_ring->bases_len; base_index++) {
+ Object *ob_iter = gz_ring->bases[base_index]->object;
ED_view3d_viewcontext_init_object(&vc, ob_iter);
BMEdge *eed_test = EDBM_edge_find_nearest_ex(&vc, &best.dist, NULL, false, false, NULL);
if (eed_test) {
best.ob = ob_iter;
best.eed = eed_test;
- best.ob_index = ob_index;
+ best.base_index = base_index;
}
}
BMesh *bm = NULL;
if (best.eed) {
- gz_ring->object_index = best.ob_index;
- bm = BKE_editmesh_from_object(gz_ring->objects[gz_ring->object_index])->bm;
+ gz_ring->base_index = best.base_index;
+ bm = BKE_editmesh_from_object(gz_ring->bases[gz_ring->base_index]->object)->bm;
BM_mesh_elem_index_ensure(bm, BM_EDGE);
gz_ring->edge_index = BM_elem_index_get(best.eed);
}
else {
- gz_ring->object_index = -1;
+ gz_ring->base_index = -1;
gz_ring->edge_index = -1;
}
- if ((prev.object_index == gz_ring->object_index) &&
+ if ((prev.base_index == gz_ring->base_index) &&
(prev.edge_index == gz_ring->edge_index))
{
/* pass (only recalculate on change) */
@@ -141,7 +344,7 @@ static int gizmo_preselect_edgering_test_select(
if (best.eed) {
const float (*coords)[3] = NULL;
{
- Object *ob = gz_ring->objects[gz_ring->object_index];
+ Object *ob = gz_ring->bases[gz_ring->base_index]->object;
Depsgraph *depsgraph = CTX_data_depsgraph(C);
Mesh *me_eval = (Mesh *)DEG_get_evaluated_id(depsgraph, ob->data);
if (me_eval->runtime.edit_data) {
@@ -154,7 +357,7 @@ static int gizmo_preselect_edgering_test_select(
EDBM_preselect_edgering_clear(gz_ring->psel);
}
- RNA_int_set(gz->ptr, "object_index", gz_ring->object_index);
+ RNA_int_set(gz->ptr, "object_index", gz_ring->base_index);
RNA_int_set(gz->ptr, "edge_index", gz_ring->edge_index);
ARegion *ar = CTX_wm_region(C);
@@ -171,7 +374,7 @@ static void gizmo_preselect_edgering_setup(wmGizmo *gz)
if (gz_ring->psel == NULL) {
gz_ring->psel = EDBM_preselect_edgering_create();
}
- gz_ring->object_index = -1;
+ gz_ring->base_index = -1;
}
static void gizmo_preselect_edgering_free(wmGizmo *gz)
@@ -179,7 +382,7 @@ static void gizmo_preselect_edgering_free(wmGizmo *gz)
MeshEdgeRingGizmo3D *gz_ring = (MeshEdgeRingGizmo3D *)gz;
EDBM_preselect_edgering_destroy(gz_ring->psel);
gz_ring->psel = NULL;
- MEM_SAFE_FREE(gz_ring->objects);
+ MEM_SAFE_FREE(gz_ring->bases);
}
static int gizmo_preselect_edgering_invoke(
@@ -189,10 +392,10 @@ static int gizmo_preselect_edgering_invoke(
}
-static void GIZMO_GT_preselect_edgering_3d(wmGizmoType *gzt)
+static void GIZMO_GT_mesh_preselect_edgering_3d(wmGizmoType *gzt)
{
/* identifiers */
- gzt->idname = "GIZMO_GT_preselect_edgering_3d";
+ gzt->idname = "GIZMO_GT_mesh_preselect_edgering_3d";
/* api callbacks */
gzt->invoke = gizmo_preselect_edgering_invoke;
@@ -207,9 +410,18 @@ static void GIZMO_GT_preselect_edgering_3d(wmGizmoType *gzt)
RNA_def_int(gzt->srna, "edge_index", -1, -1, INT_MAX, "Edge Index", "", -1, INT_MAX);
}
+/** \} */
+
+
+/* -------------------------------------------------------------------- */
+/** \name Gizmo API
+ *
+ * \{ */
+
void ED_gizmotypes_preselect_3d(void)
{
- WM_gizmotype_append(GIZMO_GT_preselect_edgering_3d);
+ WM_gizmotype_append(GIZMO_GT_mesh_preselect_elem_3d);
+ WM_gizmotype_append(GIZMO_GT_mesh_preselect_edgering_3d);
}
/** \} */
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_ruler.c b/source/blender/editors/space_view3d/view3d_gizmo_ruler.c
index 938b4c45181..34709e434ac 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_ruler.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_ruler.c
@@ -45,6 +45,7 @@
#include "BIF_gl.h"
+#include "ED_gizmo_utils.h"
#include "ED_gpencil.h"
#include "ED_screen.h"
#include "ED_transform_snap_object_context.h"
@@ -163,8 +164,6 @@ static void ruler_item_remove(bContext *C, wmGizmoGroup *gzgroup, RulerItem *rul
static void ruler_item_as_string(RulerItem *ruler_item, UnitSettings *unit,
char *numstr, size_t numstr_size, int prec)
{
- const bool do_split = (unit->flag & USER_UNIT_OPT_SPLIT) != 0;
-
if (ruler_item->flag & RULERITEM_USE_ANGLE) {
const float ruler_angle = angle_v3v3v3(ruler_item->co[0],
ruler_item->co[1],
@@ -174,9 +173,9 @@ static void ruler_item_as_string(RulerItem *ruler_item, UnitSettings *unit,
BLI_snprintf(numstr, numstr_size, "%.*f°", prec, RAD2DEGF(ruler_angle));
}
else {
- bUnit_AsString(numstr, numstr_size,
- (double)ruler_angle,
- prec, unit->system, B_UNIT_ROTATION, do_split, false);
+ bUnit_AsString2(
+ numstr, numstr_size, (double)ruler_angle,
+ prec, B_UNIT_ROTATION, unit, false);
}
}
else {
@@ -187,9 +186,9 @@ static void ruler_item_as_string(RulerItem *ruler_item, UnitSettings *unit,
BLI_snprintf(numstr, numstr_size, "%.*f", prec, ruler_len);
}
else {
- bUnit_AsString(numstr, numstr_size,
- (double)(ruler_len * unit->scale_length),
- prec, unit->system, B_UNIT_LENGTH, do_split, false);
+ bUnit_AsString2(
+ numstr, numstr_size, (double)(ruler_len * unit->scale_length),
+ prec, B_UNIT_LENGTH, unit, false);
}
}
}
@@ -410,7 +409,7 @@ static bool view3d_ruler_to_gpencil(bContext *C, wmGizmoGroup *gzgroup)
gpl->flag |= GP_LAYER_HIDE;
}
- gpf = BKE_gpencil_layer_getframe(gpl, CFRA, true);
+ gpf = BKE_gpencil_layer_getframe(gpl, CFRA, GP_GETFRAME_ADD_NEW);
BKE_gpencil_free_strokes(gpf);
for (ruler_item = gzgroup->gizmos.first; ruler_item; ruler_item = (RulerItem *)ruler_item->gz.next) {
@@ -460,7 +459,7 @@ static bool view3d_ruler_from_gpencil(const bContext *C, wmGizmoGroup *gzgroup)
gpl = BLI_findstring(&scene->gpd->layers, ruler_name, offsetof(bGPDlayer, info));
if (gpl) {
bGPDframe *gpf;
- gpf = BKE_gpencil_layer_getframe(gpl, CFRA, false);
+ gpf = BKE_gpencil_layer_getframe(gpl, CFRA, GP_GETFRAME_USE_PREV);
if (gpf) {
bGPDstroke *gps;
for (gps = gpf->strokes.first; gps; gps = gps->next) {
@@ -508,7 +507,6 @@ static void gizmo_ruler_draw(const bContext *C, wmGizmo *gz)
RegionView3D *rv3d = ar->regiondata;
const float cap_size = 4.0f;
const float bg_margin = 4.0f * U.pixelsize;
- const float bg_radius = 4.0f * U.pixelsize;
const float arc_size = 64.0f * U.pixelsize;
#define ARC_STEPS 24
const int arc_steps = ARC_STEPS;
@@ -520,6 +518,7 @@ static void gizmo_ruler_draw(const bContext *C, wmGizmo *gz)
/* anti-aliased lines for more consistent appearance */
GPU_line_smooth(true);
+ GPU_line_width(1.0f);
BLF_enable(blf_mono_font, BLF_ROTATION);
BLF_size(blf_mono_font, 14 * U.pixelsize, U.dpi);
@@ -528,6 +527,11 @@ static void gizmo_ruler_draw(const bContext *C, wmGizmo *gz)
UI_GetThemeColor3ubv(TH_TEXT, color_text);
UI_GetThemeColor3ubv(TH_WIRE, color_wire);
+ /* Avoid white on white text. (TODO Fix by using theme) */
+ if ((int)color_text[0] + (int)color_text[1] + (int)color_text[2] > 127 * 3 * 0.6f) {
+ copy_v3_fl(color_back, 0.0f);
+ }
+
const bool is_act = (gz->flag & WM_GIZMO_DRAW_HOVER);
float dir_ruler[2];
float co_ss[3][2];
@@ -577,7 +581,7 @@ static void gizmo_ruler_draw(const bContext *C, wmGizmo *gz)
float quat[4];
float axis[3];
float angle;
- const float px_scale = (ED_view3d_pixel_size(rv3d, ruler_item->co[1]) *
+ const float px_scale = (ED_view3d_pixel_size_no_ui_scale(rv3d, ruler_item->co[1]) *
min_fff(arc_size,
len_v2v2(co_ss[0], co_ss[1]) / 2.0f,
len_v2v2(co_ss[2], co_ss[1]) / 2.0f));
@@ -652,30 +656,33 @@ static void gizmo_ruler_draw(const bContext *C, wmGizmo *gz)
GPU_blend(false);
}
+ /* text */
+ char numstr[256];
+ float numstr_size[2];
+ float posit[2];
+ const int prec = 2; /* XXX, todo, make optional */
+
+ ruler_item_as_string(ruler_item, unit, numstr, sizeof(numstr), prec);
+
+ BLF_width_and_height(blf_mono_font, numstr, sizeof(numstr), &numstr_size[0], &numstr_size[1]);
+
+ posit[0] = co_ss[1][0] + (cap_size * 2.0f);
+ posit[1] = co_ss[1][1] - (numstr_size[1] / 2.0f);
+
+ /* draw text (bg) */
+ {
+ immUniformColor4fv(color_back);
+ GPU_blend(true);
+ immRectf(shdr_pos,
+ posit[0] - bg_margin, posit[1] - bg_margin,
+ posit[0] + bg_margin + numstr_size[0], posit[1] + bg_margin + numstr_size[1]);
+ GPU_blend(false);
+ }
+
immUnbindProgram();
- /* text */
+ /* draw text */
{
- char numstr[256];
- float numstr_size[2];
- float posit[2];
- const int prec = 2; /* XXX, todo, make optional */
-
- ruler_item_as_string(ruler_item, unit, numstr, sizeof(numstr), prec);
-
- BLF_width_and_height(blf_mono_font, numstr, sizeof(numstr), &numstr_size[0], &numstr_size[1]);
-
- posit[0] = co_ss[1][0] + (cap_size * 2.0f);
- posit[1] = co_ss[1][1] - (numstr_size[1] / 2.0f);
-
- /* draw text (bg) */
- UI_draw_roundbox_corner_set(UI_CNR_ALL);
- UI_draw_roundbox_aa(
- true,
- posit[0] - bg_margin, posit[1] - bg_margin,
- posit[0] + bg_margin + numstr_size[0], posit[1] + bg_margin + numstr_size[1],
- bg_radius, color_back);
- /* draw text */
BLF_color3ubv(blf_mono_font, color_text);
BLF_position(blf_mono_font, posit[0], posit[1], 0.0f);
BLF_rotation(blf_mono_font, 0.0f);
@@ -735,33 +742,36 @@ static void gizmo_ruler_draw(const bContext *C, wmGizmo *gz)
GPU_blend(false);
}
- immUnbindProgram();
-
/* text */
- {
- char numstr[256];
- float numstr_size[2];
- const int prec = 6; /* XXX, todo, make optional */
- float posit[2];
+ char numstr[256];
+ float numstr_size[2];
+ const int prec = 6; /* XXX, todo, make optional */
+ float posit[2];
- ruler_item_as_string(ruler_item, unit, numstr, sizeof(numstr), prec);
+ ruler_item_as_string(ruler_item, unit, numstr, sizeof(numstr), prec);
- BLF_width_and_height(blf_mono_font, numstr, sizeof(numstr), &numstr_size[0], &numstr_size[1]);
+ BLF_width_and_height(blf_mono_font, numstr, sizeof(numstr), &numstr_size[0], &numstr_size[1]);
- mid_v2_v2v2(posit, co_ss[0], co_ss[2]);
+ mid_v2_v2v2(posit, co_ss[0], co_ss[2]);
- /* center text */
- posit[0] -= numstr_size[0] / 2.0f;
- posit[1] -= numstr_size[1] / 2.0f;
+ /* center text */
+ posit[0] -= numstr_size[0] / 2.0f;
+ posit[1] -= numstr_size[1] / 2.0f;
- /* draw text (bg) */
- UI_draw_roundbox_corner_set(UI_CNR_ALL);
- UI_draw_roundbox_aa(
- true,
- posit[0] - bg_margin, posit[1] - bg_margin,
- posit[0] + bg_margin + numstr_size[0], posit[1] + bg_margin + numstr_size[1],
- bg_radius, color_back);
- /* draw text */
+ /* draw text (bg) */
+ {
+ immUniformColor4fv(color_back);
+ GPU_blend(true);
+ immRectf(shdr_pos,
+ posit[0] - bg_margin, posit[1] - bg_margin,
+ posit[0] + bg_margin + numstr_size[0], posit[1] + bg_margin + numstr_size[1]);
+ GPU_blend(false);
+ }
+
+ immUnbindProgram();
+
+ /* draw text */
+ {
BLF_color3ubv(blf_mono_font, color_text);
BLF_position(blf_mono_font, posit[0], posit[1], 0.0f);
BLF_draw(blf_mono_font, numstr, sizeof(numstr));
@@ -974,18 +984,6 @@ void VIEW3D_GT_ruler_item(wmGizmoType *gzt)
/** \name Ruler Gizmo Group
* \{ */
-static bool WIDGETGROUP_ruler_poll(const bContext *C, wmGizmoGroupType *gzgt)
-{
- bToolRef_Runtime *tref_rt = WM_toolsystem_runtime_from_context((bContext *)C);
- if ((tref_rt == NULL) ||
- !STREQ(gzgt->idname, tref_rt->gizmo_group))
- {
- WM_gizmo_group_type_unlink_delayed_ptr(gzgt);
- return false;
- }
- return true;
-}
-
static void WIDGETGROUP_ruler_setup(const bContext *C, wmGizmoGroup *gzgroup)
{
RulerInfo *ruler_info = MEM_callocN(sizeof(RulerInfo), __func__);
@@ -1014,7 +1012,7 @@ void VIEW3D_GGT_ruler(wmGizmoGroupType *gzgt)
gzgt->gzmap_params.spaceid = SPACE_VIEW3D;
gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
- gzgt->poll = WIDGETGROUP_ruler_poll;
+ gzgt->poll = ED_gizmo_poll_or_unlink_delayed_from_tool;
gzgt->setup = WIDGETGROUP_ruler_setup;
}
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index 83cabd2a60e..854bf01b158 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -69,160 +69,6 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event);
#define B_SEL_EDGE 111
#define B_SEL_FACE 112
-/* XXX quickly ported across */
-static void handle_view3d_lock(bContext *C)
-{
- Scene *scene = CTX_data_scene(C);
- ScrArea *sa = CTX_wm_area(C);
- View3D *v3d = CTX_wm_view3d(C);
-
- if (v3d != NULL && sa != NULL) {
- if (v3d->localvd == NULL && v3d->scenelock && sa->spacetype == SPACE_VIEW3D) {
- /* copy to scene */
- scene->lay = v3d->lay;
- scene->layact = v3d->layact;
- scene->camera = v3d->camera;
-
- /* notifiers for scene update */
- WM_event_add_notifier(C, NC_SCENE | ND_LAYER, scene);
- }
- }
-}
-
-/**
- * layer code is on three levels actually:
- * - here for operator
- * - uiTemplateLayers in interface/ code for buttons
- * - ED_view3d_view_layer_set for RNA
- */
-static void view3d_layers_editmode_ensure(View3D *v3d, Object *obedit)
-{
- /* sanity check - when in editmode disallow switching the editmode layer off since its confusing
- * an alternative would be to always draw the editmode object. */
- if (obedit && (obedit->lay & v3d->lay) == 0) {
- int bit;
- for (bit = 0; bit < 32; bit++) {
- if (obedit->lay & (1u << bit)) {
- v3d->lay |= (1u << bit);
- break;
- }
- }
- }
-}
-
-static int view3d_layers_exec(bContext *C, wmOperator *op)
-{
- ScrArea *sa = CTX_wm_area(C);
- View3D *v3d = sa->spacedata.first;
- Object *obedit = CTX_data_edit_object(C);
- int nr = RNA_int_get(op->ptr, "nr");
- const bool toggle = RNA_boolean_get(op->ptr, "toggle");
-
- if (nr < 0)
- return OPERATOR_CANCELLED;
-
- if (nr == 0) {
- /* all layers */
- if (!v3d->lay_prev)
- v3d->lay_prev = 1;
-
- if (toggle && v3d->lay == ((1 << 20) - 1)) {
- /* return to active layer only */
- v3d->lay = v3d->lay_prev;
-
- view3d_layers_editmode_ensure(v3d, obedit);
- }
- else {
- v3d->lay_prev = v3d->lay;
- v3d->lay |= (1 << 20) - 1;
- }
- }
- else {
- int bit;
- nr--;
-
- if (RNA_boolean_get(op->ptr, "extend")) {
- if (toggle && v3d->lay & (1 << nr) && (v3d->lay & ~(1 << nr)))
- v3d->lay &= ~(1 << nr);
- else
- v3d->lay |= (1 << nr);
- }
- else {
- v3d->lay = (1 << nr);
- }
-
- view3d_layers_editmode_ensure(v3d, obedit);
-
- /* set active layer, ensure to always have one */
- if (v3d->lay & (1 << nr))
- v3d->layact = 1 << nr;
- else if ((v3d->lay & v3d->layact) == 0) {
- for (bit = 0; bit < 32; bit++) {
- if (v3d->lay & (1u << bit)) {
- v3d->layact = (1u << bit);
- break;
- }
- }
- }
- }
-
- if (v3d->scenelock) handle_view3d_lock(C);
-
- DEG_on_visible_update(CTX_data_main(C), false);
-
- ED_area_tag_redraw(sa);
-
- return OPERATOR_FINISHED;
-}
-
-/* applies shift and alt, lazy coding or ok? :) */
-/* the local per-keymap-entry keymap will solve it */
-static int view3d_layers_invoke(bContext *C, wmOperator *op, const wmEvent *event)
-{
- if (event->ctrl || event->oskey)
- return OPERATOR_PASS_THROUGH;
-
- if (event->shift)
- RNA_boolean_set(op->ptr, "extend", true);
- else
- RNA_boolean_set(op->ptr, "extend", false);
-
- if (event->alt) {
- const int nr = RNA_int_get(op->ptr, "nr") + 10;
- RNA_int_set(op->ptr, "nr", nr);
- }
- view3d_layers_exec(C, op);
-
- return OPERATOR_FINISHED;
-}
-
-static bool view3d_layers_poll(bContext *C)
-{
- return (ED_operator_view3d_active(C) && CTX_wm_view3d(C)->localvd == NULL);
-}
-
-void VIEW3D_OT_layers(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name = "Layers";
- ot->description = "Toggle layer(s) visibility";
- ot->idname = "VIEW3D_OT_layers";
-
- /* api callbacks */
- ot->invoke = view3d_layers_invoke;
- ot->exec = view3d_layers_exec;
- ot->poll = view3d_layers_poll;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- RNA_def_int(ot->srna, "nr", 1, 0, 20, "Number", "The layer number to set, zero for all layers", 0, 20);
- RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Add this layer to the current view layers");
- RNA_def_boolean(ot->srna, "toggle", 1, "Toggle", "Toggle the layer");
-}
-
-/** \} */
-
/* -------------------------------------------------------------------- */
/** \name Toggle Matcap Flip Operator
* \{ */
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index e4ef442d49a..b3e77927024 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -105,8 +105,8 @@ void VIEW3D_OT_clear_render_border(struct wmOperatorType *ot);
void VIEW3D_OT_zoom_border(struct wmOperatorType *ot);
void VIEW3D_OT_toggle_shading(struct wmOperatorType *ot);
-void view3d_boxview_copy(ScrArea *sa, ARegion *ar);
-void view3d_boxview_sync(ScrArea *sa, ARegion *ar);
+void view3d_boxview_copy(struct ScrArea *sa, struct ARegion *ar);
+void view3d_boxview_sync(struct ScrArea *sa, struct ARegion *ar);
void view3d_orbit_apply_dyn_ofs(
float r_ofs[3], const float ofs_old[3], const float viewquat_old[4],
@@ -142,21 +142,21 @@ int view3d_effective_drawtype(const struct View3D *v3d);
/* view3d_draw.c */
void view3d_main_region_draw(const struct bContext *C, struct ARegion *ar);
-void view3d_draw_region_info(const struct bContext *C, struct ARegion *ar, const int offset);
+void view3d_draw_region_info(const struct bContext *C, struct ARegion *ar);
void ED_view3d_draw_depth(
struct Depsgraph *depsgraph,
struct ARegion *ar, View3D *v3d, bool alphaoverride);
/* view3d_draw_legacy.c */
-void ED_view3d_draw_depth_gpencil(struct Depsgraph *depsgraph, Scene *scene, ARegion *ar, View3D *v3d);
+void ED_view3d_draw_depth_gpencil(struct Depsgraph *depsgraph, Scene *scene, struct ARegion *ar, View3D *v3d);
void ED_view3d_draw_select_loop(
- struct Depsgraph *depsgraph, ViewContext *vc, Scene *scene, struct ViewLayer *view_layer, View3D *v3d, ARegion *ar,
+ struct Depsgraph *depsgraph, ViewContext *vc, Scene *scene, struct ViewLayer *view_layer, View3D *v3d, struct ARegion *ar,
bool use_obedit_skip, bool use_nearest);
void ED_view3d_draw_depth_loop(
- struct Depsgraph *depsgraph, Scene *scene, ARegion *ar, View3D *v3d);
+ struct Depsgraph *depsgraph, Scene *scene, struct ARegion *ar, View3D *v3d);
void ED_view3d_after_add(ListBase *lb, Base *base, const short dflag);
@@ -166,7 +166,7 @@ float view3d_depth_near(struct ViewDepths *d);
/* view3d_select.c */
void VIEW3D_OT_select(struct wmOperatorType *ot);
void VIEW3D_OT_select_circle(struct wmOperatorType *ot);
-void VIEW3D_OT_select_border(struct wmOperatorType *ot);
+void VIEW3D_OT_select_box(struct wmOperatorType *ot);
void VIEW3D_OT_select_lasso(struct wmOperatorType *ot);
void VIEW3D_OT_select_menu(struct wmOperatorType *ot);
@@ -202,7 +202,7 @@ void ED_view3d_smooth_view_force_finish(
void view3d_winmatrix_set(
struct Depsgraph *depsgraph,
- ARegion *ar, const View3D *v3d, const rcti *rect);
+ struct ARegion *ar, const View3D *v3d, const rcti *rect);
void view3d_viewmatrix_set(
struct Depsgraph *depsgraph, Scene *scene,
const View3D *v3d, RegionView3D *rv3d, const float rect_scale[2]);
@@ -248,8 +248,8 @@ void VIEW3D_OT_snap_cursor_to_selected(struct wmOperatorType *ot);
void VIEW3D_OT_snap_cursor_to_active(struct wmOperatorType *ot);
/* space_view3d.c */
-ARegion *view3d_has_buttons_region(ScrArea *sa);
-ARegion *view3d_has_tools_region(ScrArea *sa);
+struct ARegion *view3d_has_buttons_region(struct ScrArea *sa);
+struct ARegion *view3d_has_tools_region(struct ScrArea *sa);
extern const char *view3d_context_dir[]; /* doc access */
@@ -263,6 +263,7 @@ void VIEW3D_GGT_force_field(struct wmGizmoGroupType *gzgt);
void VIEW3D_GGT_empty_image(struct wmGizmoGroupType *gzgt);
void VIEW3D_GGT_armature_spline(struct wmGizmoGroupType *gzgt);
void VIEW3D_GGT_navigate(struct wmGizmoGroupType *gzgt);
+void VIEW3D_GGT_mesh_preselect_elem(struct wmGizmoGroupType *gzgt);
void VIEW3D_GGT_mesh_preselect_edgering(struct wmGizmoGroupType *gzgt);
void VIEW3D_GGT_ruler(struct wmGizmoGroupType *gzgt);
diff --git a/source/blender/editors/space_view3d/view3d_iterators.c b/source/blender/editors/space_view3d/view3d_iterators.c
index 74071e77901..3d0b0a7a348 100644
--- a/source/blender/editors/space_view3d/view3d_iterators.c
+++ b/source/blender/editors/space_view3d/view3d_iterators.c
@@ -28,6 +28,7 @@
#include "DNA_lattice_types.h"
#include "DNA_meta_types.h"
#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
#include "DNA_armature_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -43,6 +44,7 @@
#include "BKE_editmesh.h"
#include "BKE_context.h"
#include "BKE_mesh_runtime.h"
+#include "BKE_mesh_iterators.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
@@ -115,9 +117,9 @@ void meshobject_foreachScreenVert(
void *userData, eV3DProjTest clip_flag)
{
foreachScreenObjectVert_userData data;
- DerivedMesh *dm;
+ Mesh *me;
- dm = mesh_get_derived_deform(vc->depsgraph, vc->scene, vc->obact, CD_MASK_BAREMESH);
+ me = mesh_get_eval_deform(vc->depsgraph, vc->scene, vc->obact, CD_MASK_BAREMESH);
ED_view3d_check_mats_rv3d(vc->rv3d);
@@ -130,9 +132,7 @@ void meshobject_foreachScreenVert(
ED_view3d_clipping_local(vc->rv3d, vc->obact->obmat);
}
- dm->foreachMappedVert(dm, meshobject_foreachScreenVert__mapFunc, &data, DM_FOREACH_NOP);
-
- dm->release(dm);
+ BKE_mesh_foreach_mapped_vert(me, meshobject_foreachScreenVert__mapFunc, &data, MESH_FOREACH_NOP);
}
static void mesh_foreachScreenVert__mapFunc(void *userData, int index, const float co[3],
@@ -158,9 +158,8 @@ void mesh_foreachScreenVert(
void *userData, eV3DProjTest clip_flag)
{
foreachScreenVert_userData data;
- DerivedMesh *dm;
- dm = editbmesh_get_derived_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
+ Mesh *me = editbmesh_get_eval_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
ED_view3d_check_mats_rv3d(vc->rv3d);
@@ -174,9 +173,7 @@ void mesh_foreachScreenVert(
}
BM_mesh_elem_table_ensure(vc->em->bm, BM_VERT);
- dm->foreachMappedVert(dm, mesh_foreachScreenVert__mapFunc, &data, DM_FOREACH_NOP);
-
- dm->release(dm);
+ BKE_mesh_foreach_mapped_vert(me, mesh_foreachScreenVert__mapFunc, &data, MESH_FOREACH_NOP);
}
/* ------------------------------------------------------------------------ */
@@ -214,9 +211,8 @@ void mesh_foreachScreenEdge(
void *userData, eV3DProjTest clip_flag)
{
foreachScreenEdge_userData data;
- DerivedMesh *dm;
- dm = editbmesh_get_derived_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
+ Mesh *me = editbmesh_get_eval_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
ED_view3d_check_mats_rv3d(vc->rv3d);
@@ -236,9 +232,7 @@ void mesh_foreachScreenEdge(
}
BM_mesh_elem_table_ensure(vc->em->bm, BM_EDGE);
- dm->foreachMappedEdge(dm, mesh_foreachScreenEdge__mapFunc, &data);
-
- dm->release(dm);
+ BKE_mesh_foreach_mapped_edge(me, mesh_foreachScreenEdge__mapFunc, &data);
}
/* ------------------------------------------------------------------------ */
@@ -262,10 +256,8 @@ void mesh_foreachScreenFace(
void *userData, const eV3DProjTest clip_flag)
{
foreachScreenFace_userData data;
- DerivedMesh *dm;
-
- dm = editbmesh_get_derived_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
+ Mesh *me = editbmesh_get_eval_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
ED_view3d_check_mats_rv3d(vc->rv3d);
data.vc = *vc;
@@ -274,9 +266,7 @@ void mesh_foreachScreenFace(
data.clip_flag = clip_flag;
BM_mesh_elem_table_ensure(vc->em->bm, BM_FACE);
- dm->foreachMappedFaceCenter(dm, mesh_foreachScreenFace__mapFunc, &data, DM_FOREACH_NOP);
-
- dm->release(dm);
+ BKE_mesh_foreach_mapped_face_center(me, mesh_foreachScreenFace__mapFunc, &data, MESH_FOREACH_NOP);
}
/* ------------------------------------------------------------------------ */
@@ -305,7 +295,7 @@ void nurbs_foreachScreenVert(
if (bezt->hide == 0) {
float screen_co[2];
- if (cu->drawflag & CU_HIDE_HANDLES) {
+ if ((vc->v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) {
if (ED_view3d_project_float_object(vc->ar, bezt->vec[1], screen_co,
V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN) == V3D_PROJ_RET_OK)
{
diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c
index c53382a60ad..6c56bd7e72b 100644
--- a/source/blender/editors/space_view3d/view3d_ops.c
+++ b/source/blender/editors/space_view3d/view3d_ops.c
@@ -191,7 +191,7 @@ void view3d_operatortypes(void)
WM_operatortype_append(VIEW3D_OT_view_center_camera);
WM_operatortype_append(VIEW3D_OT_view_center_lock);
WM_operatortype_append(VIEW3D_OT_select);
- WM_operatortype_append(VIEW3D_OT_select_border);
+ WM_operatortype_append(VIEW3D_OT_select_box);
WM_operatortype_append(VIEW3D_OT_clip_border);
WM_operatortype_append(VIEW3D_OT_select_circle);
WM_operatortype_append(VIEW3D_OT_smoothview);
@@ -208,7 +208,6 @@ void view3d_operatortypes(void)
WM_operatortype_append(VIEW3D_OT_walk);
WM_operatortype_append(VIEW3D_OT_navigate);
WM_operatortype_append(VIEW3D_OT_ruler);
- WM_operatortype_append(VIEW3D_OT_layers);
WM_operatortype_append(VIEW3D_OT_copybuffer);
WM_operatortype_append(VIEW3D_OT_pastebuffer);
@@ -234,317 +233,10 @@ void view3d_operatortypes(void)
void view3d_keymap(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap;
- wmKeyMapItem *kmi;
-
- keymap = WM_keymap_ensure(keyconf, "3D View Generic", SPACE_VIEW3D, 0);
-
- WM_keymap_add_item(keymap, "VIEW3D_OT_properties", NKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_toolshelf", TKEY, KM_PRESS, 0, 0);
+ WM_keymap_ensure(keyconf, "3D View Generic", SPACE_VIEW3D, 0);
/* only for region 3D window */
- keymap = WM_keymap_ensure(keyconf, "3D View", SPACE_VIEW3D, 0);
-
- WM_keymap_verify_item(keymap, "VIEW3D_OT_cursor3d", ACTIONMOUSE, KM_CLICK, 0, 0);
-
- WM_keymap_verify_item(keymap, "VIEW3D_OT_rotate", MIDDLEMOUSE, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "VIEW3D_OT_move", MIDDLEMOUSE, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_verify_item(keymap, "VIEW3D_OT_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0);
- WM_keymap_verify_item(keymap, "VIEW3D_OT_dolly", MIDDLEMOUSE, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_selected", PADPERIOD, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "use_all_regions", true);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "use_all_regions", false);
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_verify_item(keymap, "VIEW3D_OT_view_lock_to_active", PADPERIOD, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_verify_item(keymap, "VIEW3D_OT_view_lock_clear", PADPERIOD, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_verify_item(keymap, "VIEW3D_OT_navigate", FKEY, KM_PRESS, KM_SHIFT, 0);
-#endif
-
- WM_keymap_verify_item(keymap, "VIEW3D_OT_smoothview", TIMER1, KM_ANY, KM_ANY, 0);
-
- WM_keymap_add_item(keymap, "VIEW3D_OT_rotate", MOUSEPAN, 0, 0, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_rotate", MOUSEROTATE, 0, 0, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_move", MOUSEPAN, 0, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", MOUSEZOOM, 0, 0, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", MOUSEPAN, 0, KM_CTRL, 0);
-
- /*numpad +/-*/
- RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", PADPLUSKEY, KM_PRESS, 0, 0)->ptr, "delta", 1);
- RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", PADMINUS, KM_PRESS, 0, 0)->ptr, "delta", -1);
- /*ctrl +/-*/
- RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", EQUALKEY, KM_PRESS, KM_CTRL, 0)->ptr, "delta", 1);
- RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", MINUSKEY, KM_PRESS, KM_CTRL, 0)->ptr, "delta", -1);
-
- /*wheel mouse forward/back*/
- RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", WHEELINMOUSE, KM_PRESS, 0, 0)->ptr, "delta", 1);
- RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", WHEELOUTMOUSE, KM_PRESS, 0, 0)->ptr, "delta", -1);
-
- /* ... and for dolly */
- /*numpad +/-*/
- RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_dolly", PADPLUSKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "delta", 1);
- RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_dolly", PADMINUS, KM_PRESS, KM_SHIFT, 0)->ptr, "delta", -1);
- /*ctrl +/-*/
- RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_dolly", EQUALKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0)->ptr, "delta", 1);
- RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_dolly", MINUSKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0)->ptr, "delta", -1);
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "VIEW3D_OT_zoom_camera_1_to_1", PADENTER, KM_PRESS, KM_SHIFT, 0);
-#endif
-
- WM_keymap_add_item(keymap, "VIEW3D_OT_view_center_camera", HOMEKEY, KM_PRESS, 0, 0); /* only with camera view */
- WM_keymap_add_item(keymap, "VIEW3D_OT_view_center_lock", HOMEKEY, KM_PRESS, 0, 0); /* only with lock view */
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "VIEW3D_OT_view_center_cursor", HOMEKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_view_center_pick", FKEY, KM_PRESS, KM_ALT, 0);
-#endif
-
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "center", false); /* only without camera view */
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", HOMEKEY, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "use_all_regions", true);
- RNA_boolean_set(kmi->ptr, "center", false); /* only without camera view */
-#ifdef USE_WM_KEYMAP_27X
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", CKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "center", true);
-#endif
-
- WM_keymap_add_menu_pie(keymap, "VIEW3D_MT_view_pie", ACCENTGRAVEKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_navigate", ACCENTGRAVEKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* numpad view hotkeys*/
- WM_keymap_add_item(keymap, "VIEW3D_OT_view_camera", PAD0, KM_PRESS, 0, 0);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", PAD1, KM_PRESS, 0, 0)->ptr, "type", RV3D_VIEW_FRONT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", PAD2, KM_PRESS, 0, 0)->ptr, "type", V3D_VIEW_STEPDOWN);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", PAD3, KM_PRESS, 0, 0)->ptr, "type", RV3D_VIEW_RIGHT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", PAD4, KM_PRESS, 0, 0)->ptr, "type", V3D_VIEW_STEPLEFT);
- WM_keymap_add_item(keymap, "VIEW3D_OT_view_persportho", PAD5, KM_PRESS, 0, 0);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", PAD6, KM_PRESS, 0, 0)->ptr, "type", V3D_VIEW_STEPRIGHT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", PAD7, KM_PRESS, 0, 0)->ptr, "type", RV3D_VIEW_TOP);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", PAD8, KM_PRESS, 0, 0)->ptr, "type", V3D_VIEW_STEPUP);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", PAD1, KM_PRESS, KM_CTRL, 0)->ptr, "type", RV3D_VIEW_BACK);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", PAD3, KM_PRESS, KM_CTRL, 0)->ptr, "type", RV3D_VIEW_LEFT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", PAD7, KM_PRESS, KM_CTRL, 0)->ptr, "type", RV3D_VIEW_BOTTOM);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_pan", PAD2, KM_PRESS, KM_CTRL, 0)->ptr, "type", V3D_VIEW_PANDOWN);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_pan", PAD4, KM_PRESS, KM_CTRL, 0)->ptr, "type", V3D_VIEW_PANLEFT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_pan", PAD6, KM_PRESS, KM_CTRL, 0)->ptr, "type", V3D_VIEW_PANRIGHT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_pan", PAD8, KM_PRESS, KM_CTRL, 0)->ptr, "type", V3D_VIEW_PANUP);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_roll", PAD4, KM_PRESS, KM_SHIFT, 0)->ptr, "type", V3D_VIEW_STEPLEFT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_roll", PAD6, KM_PRESS, KM_SHIFT, 0)->ptr, "type", V3D_VIEW_STEPRIGHT);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", PAD9, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "type", V3D_VIEW_STEPRIGHT);
- RNA_float_set(kmi->ptr, "angle", (float)M_PI);
-
-#ifdef USE_WM_KEYMAP_27X
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_pan", WHEELUPMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "type", V3D_VIEW_PANRIGHT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_pan", WHEELDOWNMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "type", V3D_VIEW_PANLEFT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_pan", WHEELUPMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "type", V3D_VIEW_PANUP);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_pan", WHEELDOWNMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "type", V3D_VIEW_PANDOWN);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", WHEELUPMOUSE, KM_PRESS, KM_CTRL | KM_ALT, 0)->ptr, "type", V3D_VIEW_STEPLEFT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", WHEELDOWNMOUSE, KM_PRESS, KM_CTRL | KM_ALT, 0)->ptr, "type", V3D_VIEW_STEPRIGHT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", WHEELUPMOUSE, KM_PRESS, KM_SHIFT | KM_ALT, 0)->ptr, "type", V3D_VIEW_STEPUP);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", WHEELDOWNMOUSE, KM_PRESS, KM_SHIFT | KM_ALT, 0)->ptr, "type", V3D_VIEW_STEPDOWN);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_roll", WHEELUPMOUSE, KM_PRESS, KM_CTRL | KM_SHIFT, 0)->ptr, "type", V3D_VIEW_STEPLEFT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_roll", WHEELDOWNMOUSE, KM_PRESS, KM_CTRL | KM_SHIFT, 0)->ptr, "type", V3D_VIEW_STEPRIGHT);
-#endif
-
- /* active aligned, replaces '*' key in 2.4x */
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", PAD1, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_FRONT);
- RNA_boolean_set(kmi->ptr, "align_active", true);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", PAD3, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_RIGHT);
- RNA_boolean_set(kmi->ptr, "align_active", true);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", PAD7, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_TOP);
- RNA_boolean_set(kmi->ptr, "align_active", true);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", PAD1, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BACK);
- RNA_boolean_set(kmi->ptr, "align_active", true);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", PAD3, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_LEFT);
- RNA_boolean_set(kmi->ptr, "align_active", true);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", PAD7, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BOTTOM);
- RNA_boolean_set(kmi->ptr, "align_active", true);
-
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", EVT_TWEAK_M, EVT_GESTURE_N, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_TOP);
- RNA_boolean_set(kmi->ptr, "relative", true);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", EVT_TWEAK_M, EVT_GESTURE_S, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BOTTOM);
- RNA_boolean_set(kmi->ptr, "relative", true);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", EVT_TWEAK_M, EVT_GESTURE_E, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_RIGHT);
- RNA_boolean_set(kmi->ptr, "relative", true);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", EVT_TWEAK_M, EVT_GESTURE_W, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_LEFT);
- RNA_boolean_set(kmi->ptr, "relative", true);
-
-#ifdef WITH_INPUT_NDOF
- /* note: positioned here so keymaps show keyboard keys if assigned */
- /* 3D mouse */
- WM_keymap_add_item(keymap, "VIEW3D_OT_ndof_orbit_zoom", NDOF_MOTION, 0, 0, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_ndof_orbit", NDOF_MOTION, 0, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_ndof_pan", NDOF_MOTION, 0, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_ndof_all", NDOF_MOTION, 0, KM_CTRL | KM_SHIFT, 0);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_selected", NDOF_BUTTON_FIT, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "use_all_regions", false);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_roll", NDOF_BUTTON_ROLL_CCW, KM_PRESS, 0, 0)->ptr, "type", V3D_VIEW_STEPLEFT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_roll", NDOF_BUTTON_ROLL_CCW, KM_PRESS, 0, 0)->ptr, "type", V3D_VIEW_STEPRIGHT);
-
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", NDOF_BUTTON_FRONT, KM_PRESS, 0, 0)->ptr, "type", RV3D_VIEW_FRONT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", NDOF_BUTTON_BACK, KM_PRESS, 0, 0)->ptr, "type", RV3D_VIEW_BACK);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", NDOF_BUTTON_LEFT, KM_PRESS, 0, 0)->ptr, "type", RV3D_VIEW_LEFT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", NDOF_BUTTON_RIGHT, KM_PRESS, 0, 0)->ptr, "type", RV3D_VIEW_RIGHT);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", NDOF_BUTTON_TOP, KM_PRESS, 0, 0)->ptr, "type", RV3D_VIEW_TOP);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", NDOF_BUTTON_BOTTOM, KM_PRESS, 0, 0)->ptr, "type", RV3D_VIEW_BOTTOM);
-
- /* 3D mouse align */
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", NDOF_BUTTON_FRONT, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_FRONT);
- RNA_boolean_set(kmi->ptr, "align_active", true);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", NDOF_BUTTON_RIGHT, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_RIGHT);
- RNA_boolean_set(kmi->ptr, "align_active", true);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_axis", NDOF_BUTTON_TOP, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_TOP);
- RNA_boolean_set(kmi->ptr, "align_active", true);
-#endif /* WITH_INPUT_NDOF */
-
- /* drawtype */
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_toggle_shading", ZKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "type", OB_SOLID);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_toggle_shading", ZKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "type", OB_MATERIAL);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_toggle_shading", ZKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "type", OB_RENDER);
-
- /* selection*/
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- RNA_boolean_set(kmi->ptr, "toggle", false);
- RNA_boolean_set(kmi->ptr, "center", false);
- RNA_boolean_set(kmi->ptr, "object", false);
- RNA_boolean_set(kmi->ptr, "enumerate", false);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- RNA_boolean_set(kmi->ptr, "toggle", true);
- RNA_boolean_set(kmi->ptr, "center", false);
- RNA_boolean_set(kmi->ptr, "object", false);
- RNA_boolean_set(kmi->ptr, "enumerate", false);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- RNA_boolean_set(kmi->ptr, "toggle", false);
- RNA_boolean_set(kmi->ptr, "center", true);
- RNA_boolean_set(kmi->ptr, "object", true); /* use Ctrl+Select for 2 purposes */
- RNA_boolean_set(kmi->ptr, "enumerate", false);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- RNA_boolean_set(kmi->ptr, "toggle", false);
- RNA_boolean_set(kmi->ptr, "center", false);
- RNA_boolean_set(kmi->ptr, "object", false);
- RNA_boolean_set(kmi->ptr, "enumerate", true);
-
- /* selection key-combinations */
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- RNA_boolean_set(kmi->ptr, "toggle", true);
- RNA_boolean_set(kmi->ptr, "center", true);
- RNA_boolean_set(kmi->ptr, "object", false);
- RNA_boolean_set(kmi->ptr, "enumerate", false);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- RNA_boolean_set(kmi->ptr, "toggle", false);
- RNA_boolean_set(kmi->ptr, "center", true);
- RNA_boolean_set(kmi->ptr, "object", false);
- RNA_boolean_set(kmi->ptr, "enumerate", true);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- RNA_boolean_set(kmi->ptr, "toggle", true);
- RNA_boolean_set(kmi->ptr, "center", false);
- RNA_boolean_set(kmi->ptr, "object", false);
- RNA_boolean_set(kmi->ptr, "enumerate", true);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT | KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- RNA_boolean_set(kmi->ptr, "toggle", true);
- RNA_boolean_set(kmi->ptr, "center", true);
- RNA_boolean_set(kmi->ptr, "object", false);
- RNA_boolean_set(kmi->ptr, "enumerate", true);
-
- WM_keymap_add_item(keymap, "VIEW3D_OT_select_border", BKEY, KM_PRESS, 0, 0);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "mode", SEL_OP_ADD);
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_SHIFT | KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "mode", SEL_OP_SUB);
- WM_keymap_add_item(keymap, "VIEW3D_OT_select_circle", CKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "VIEW3D_OT_clip_border", BKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_zoom_border", BKEY, KM_PRESS, KM_SHIFT, 0);
-
- kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_render_border", BKEY, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_item(keymap, "VIEW3D_OT_clear_render_border", BKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "VIEW3D_OT_camera_to_view", PAD0, KM_PRESS, KM_ALT | KM_CTRL, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_object_as_camera", PAD0, KM_PRESS, KM_CTRL, 0);
-
- WM_keymap_add_menu(keymap, "VIEW3D_MT_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
-
-#ifdef __APPLE__
- WM_keymap_add_item(keymap, "VIEW3D_OT_copybuffer", CKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_pastebuffer", VKEY, KM_PRESS, KM_OSKEY, 0);
-#endif
- WM_keymap_add_item(keymap, "VIEW3D_OT_copybuffer", CKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_pastebuffer", VKEY, KM_PRESS, KM_CTRL, 0);
-
- /* context ops */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", COMMAKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.transform_pivot_point");
- RNA_string_set(kmi->ptr, "value", "BOUNDING_BOX_CENTER");
-
- /* 2.4x allowed Comma+Shift too, rather not use both */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", COMMAKEY, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.transform_pivot_point");
- RNA_string_set(kmi->ptr, "value", "MEDIAN_POINT");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", COMMAKEY, KM_PRESS, KM_ALT, 0); /* new in 2.5 */
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.use_transform_pivot_point_align");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", PERIODKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.transform_pivot_point");
- RNA_string_set(kmi->ptr, "value", "CURSOR");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", PERIODKEY, KM_PRESS, KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.transform_pivot_point");
- RNA_string_set(kmi->ptr, "value", "INDIVIDUAL_ORIGINS");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", PERIODKEY, KM_PRESS, KM_ALT, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.transform_pivot_point");
- RNA_string_set(kmi->ptr, "value", "ACTIVE_ELEMENT");
-
-#ifdef USE_WM_KEYMAP_27X
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", SPACEKEY, KM_PRESS, KM_CTRL, 0); /* new in 2.5 */
-#else
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", ACCENTGRAVEKEY, KM_PRESS, KM_CTRL, 0);
-#endif
- RNA_string_set(kmi->ptr, "data_path", "space_data.show_gizmo_tool");
-
- transform_keymap_for_space(keyconf, keymap, SPACE_VIEW3D);
+ WM_keymap_ensure(keyconf, "3D View", SPACE_VIEW3D, 0);
fly_modal_keymap(keyconf);
walk_modal_keymap(keyconf);
diff --git a/source/blender/editors/space_view3d/view3d_project.c b/source/blender/editors/space_view3d/view3d_project.c
index 91e255aec82..116f4af34e5 100644
--- a/source/blender/editors/space_view3d/view3d_project.c
+++ b/source/blender/editors/space_view3d/view3d_project.c
@@ -367,20 +367,20 @@ bool ED_view3d_clip_segment(const RegionView3D *rv3d, float ray_start[3], float
* \param r_ray_co The world-space point where the ray intersects the window plane.
* \param r_ray_normal The normalized world-space direction of towards mval.
* \param r_ray_start The world-space starting point of the ray.
- * \param do_clip Optionally clip the start of the ray by the view clipping planes.
+ * \param do_clip_planes Optionally clip the start of the ray by the view clipping planes.
* \return success, false if the ray is totally clipped.
*/
-bool ED_view3d_win_to_ray_ex(
+bool ED_view3d_win_to_ray_clipped_ex(
struct Depsgraph *depsgraph,
const ARegion *ar, const View3D *v3d, const float mval[2],
- float r_ray_co[3], float r_ray_normal[3], float r_ray_start[3], bool do_clip)
+ float r_ray_co[3], float r_ray_normal[3], float r_ray_start[3], bool do_clip_planes)
{
float ray_end[3];
view3d_win_to_ray_segment(depsgraph, ar, v3d, mval, r_ray_co, r_ray_normal, r_ray_start, ray_end);
/* bounds clipping */
- if (do_clip) {
+ if (do_clip_planes) {
return ED_view3d_clip_segment(ar->regiondata, r_ray_start, ray_end);
}
@@ -397,15 +397,33 @@ bool ED_view3d_win_to_ray_ex(
* \param mval The area relative 2d location (such as event->mval, converted into float[2]).
* \param r_ray_start The world-space point where the ray intersects the window plane.
* \param r_ray_normal The normalized world-space direction of towards mval.
- * \param do_clip Optionally clip the start of the ray by the view clipping planes.
+ * \param do_clip_planes Optionally clip the start of the ray by the view clipping planes.
* \return success, false if the ray is totally clipped.
*/
-bool ED_view3d_win_to_ray(
+bool ED_view3d_win_to_ray_clipped(
struct Depsgraph *depsgraph,
const ARegion *ar, const View3D *v3d, const float mval[2],
- float r_ray_start[3], float r_ray_normal[3], const bool do_clip)
+ float r_ray_start[3], float r_ray_normal[3], const bool do_clip_planes)
{
- return ED_view3d_win_to_ray_ex(depsgraph, ar, v3d, mval, NULL, r_ray_normal, r_ray_start, do_clip);
+ return ED_view3d_win_to_ray_clipped_ex(depsgraph, ar, v3d, mval, NULL, r_ray_normal, r_ray_start, do_clip_planes);
+}
+
+/**
+ * Calculate a 3d viewpoint and direction vector from 2d window coordinates.
+ * This ray_start is located at the viewpoint, ray_normal is the direction towards mval.
+ * \param ar The region (used for the window width and height).
+ * \param mval The area relative 2d location (such as event->mval, converted into float[2]).
+ * \param r_ray_start The world-space point where the ray intersects the window plane.
+ * \param r_ray_normal The normalized world-space direction of towards mval.
+ *
+ * \note Ignores view near/far clipping, to take this into account use #ED_view3d_win_to_ray_clipped.
+ */
+void ED_view3d_win_to_ray(
+ const ARegion *ar, const float mval[2],
+ float r_ray_start[3], float r_ray_normal[3])
+{
+ ED_view3d_win_to_origin(ar, mval, r_ray_start);
+ ED_view3d_win_to_vector(ar, mval, r_ray_normal);
}
/**
@@ -539,6 +557,31 @@ void ED_view3d_win_to_3d_int(
ED_view3d_win_to_3d(v3d, ar, depth_pt, mval_fl, r_out);
}
+bool ED_view3d_win_to_3d_on_plane(
+ const ARegion *ar,
+ const float plane[4], const float mval[2], const bool do_clip,
+ float r_out[3])
+{
+ float ray_co[3], ray_no[3];
+ ED_view3d_win_to_origin(ar, mval, ray_co);
+ ED_view3d_win_to_vector(ar, mval, ray_no);
+ float lambda;
+ if (isect_ray_plane_v3(ray_co, ray_no, plane, &lambda, do_clip)) {
+ madd_v3_v3v3fl(r_out, ray_co, ray_no, lambda);
+ return true;
+ }
+ return false;
+}
+
+bool ED_view3d_win_to_3d_on_plane_int(
+ const ARegion *ar,
+ const float plane[4], const int mval[2], const bool do_clip,
+ float r_out[3])
+{
+ const float mval_fl[2] = {mval[0], mval[1]};
+ return ED_view3d_win_to_3d_on_plane(ar, plane, mval_fl, do_clip, r_out);
+}
+
/**
* Calculate a 3d difference vector from 2d window offset.
* note that ED_view3d_calc_zfac() must be called first to determine
@@ -632,17 +675,18 @@ void ED_view3d_win_to_vector(const ARegion *ar, const float mval[2], float out[3
* \param mval The area relative 2d location (such as event->mval, converted into float[2]).
* \param r_ray_start The world-space starting point of the segment.
* \param r_ray_end The world-space end point of the segment.
- * \param do_clip Optionally clip the ray by the view clipping planes.
+ * \param do_clip_planes Optionally clip the ray by the view clipping planes.
* \return success, false if the segment is totally clipped.
*/
-bool ED_view3d_win_to_segment(struct Depsgraph *depsgraph,
- const ARegion *ar, View3D *v3d, const float mval[2],
- float r_ray_start[3], float r_ray_end[3], const bool do_clip)
+bool ED_view3d_win_to_segment_clipped(
+ struct Depsgraph *depsgraph,
+ const ARegion *ar, View3D *v3d, const float mval[2],
+ float r_ray_start[3], float r_ray_end[3], const bool do_clip_planes)
{
view3d_win_to_ray_segment(depsgraph, ar, v3d, mval, NULL, NULL, r_ray_start, r_ray_end);
/* bounds clipping */
- if (do_clip) {
+ if (do_clip_planes) {
return ED_view3d_clip_segment((RegionView3D *)ar->regiondata, r_ray_start, r_ray_end);
}
diff --git a/source/blender/editors/space_view3d/view3d_ruler.c b/source/blender/editors/space_view3d/view3d_ruler.c
index df8d65449e9..208f147f943 100644
--- a/source/blender/editors/space_view3d/view3d_ruler.c
+++ b/source/blender/editors/space_view3d/view3d_ruler.c
@@ -159,7 +159,6 @@ static void ruler_item_active_set(RulerInfo *ruler_info, RulerItem *ruler_item)
static void ruler_item_as_string(RulerItem *ruler_item, UnitSettings *unit,
char *numstr, size_t numstr_size, int prec)
{
- const bool do_split = (unit->flag & USER_UNIT_OPT_SPLIT) != 0;
if (ruler_item->flag & RULERITEM_USE_ANGLE) {
const float ruler_angle = angle_v3v3v3(ruler_item->co[0],
@@ -170,9 +169,9 @@ static void ruler_item_as_string(RulerItem *ruler_item, UnitSettings *unit,
BLI_snprintf(numstr, numstr_size, "%.*f°", prec, RAD2DEGF(ruler_angle));
}
else {
- bUnit_AsString(numstr, numstr_size,
- (double)ruler_angle,
- prec, unit->system, B_UNIT_ROTATION, do_split, false);
+ bUnit_AsString2(
+ numstr, numstr_size, (double)ruler_angle,
+ prec, B_UNIT_ROTATION, unit, false);
}
}
else {
@@ -183,9 +182,9 @@ static void ruler_item_as_string(RulerItem *ruler_item, UnitSettings *unit,
BLI_snprintf(numstr, numstr_size, "%.*f", prec, ruler_len);
}
else {
- bUnit_AsString(numstr, numstr_size,
- (double)(ruler_len * unit->scale_length),
- prec, unit->system, B_UNIT_LENGTH, do_split, false);
+ bUnit_AsString2(
+ numstr, numstr_size, (double)(ruler_len * unit->scale_length),
+ prec, B_UNIT_LENGTH, unit, false);
}
}
@@ -326,7 +325,7 @@ static bool view3d_ruler_to_gpencil(bContext *C, RulerInfo *ruler_info)
gpl->flag |= GP_LAYER_HIDE;
}
- gpf = BKE_gpencil_layer_getframe(gpl, CFRA, true);
+ gpf = BKE_gpencil_layer_getframe(gpl, CFRA, GP_GETFRAME_ADD_NEW);
BKE_gpencil_free_strokes(gpf);
for (ruler_item = ruler_info->items.first; ruler_item; ruler_item = ruler_item->next) {
@@ -376,7 +375,7 @@ static bool view3d_ruler_from_gpencil(bContext *C, RulerInfo *ruler_info)
gpl = BLI_findstring(&scene->gpd->layers, ruler_name, offsetof(bGPDlayer, info));
if (gpl) {
bGPDframe *gpf;
- gpf = BKE_gpencil_layer_getframe(gpl, CFRA, false);
+ gpf = BKE_gpencil_layer_getframe(gpl, CFRA, GP_GETFRAME_USE_PREV);
if (gpf) {
bGPDstroke *gps;
for (gps = gpf->strokes.first; gps; gps = gps->next) {
@@ -420,7 +419,6 @@ static void ruler_info_draw_pixel(const struct bContext *C, ARegion *ar, void *a
// ARegion *ar = ruler_info->ar;
const float cap_size = 4.0f;
const float bg_margin = 4.0f * U.pixelsize;
- const float bg_radius = 4.0f * U.pixelsize;
const float arc_size = 64.0f * U.pixelsize;
#define ARC_STEPS 24
const int arc_steps = ARC_STEPS;
@@ -433,6 +431,7 @@ static void ruler_info_draw_pixel(const struct bContext *C, ARegion *ar, void *a
/* anti-aliased lines for more consistent appearance */
GPU_line_smooth(true);
+ GPU_line_width(1.0f);
BLF_enable(blf_mono_font, BLF_ROTATION);
BLF_size(blf_mono_font, 14 * U.pixelsize, U.dpi);
@@ -441,6 +440,11 @@ static void ruler_info_draw_pixel(const struct bContext *C, ARegion *ar, void *a
UI_GetThemeColor3ubv(TH_TEXT, color_text);
UI_GetThemeColor3ubv(TH_WIRE, color_wire);
+ /* Avoid white on white text. (TODO Fix by using theme) */
+ if ((int)color_text[0] + (int)color_text[1] + (int)color_text[2] > 127 * 3 * 0.6f) {
+ copy_v3_fl(color_back, 0.0f);
+ }
+
for (ruler_item = ruler_info->items.first, i = 0; ruler_item; ruler_item = ruler_item->next, i++) {
const bool is_act = (i == ruler_info->item_active);
float dir_ruler[2];
@@ -491,7 +495,7 @@ static void ruler_info_draw_pixel(const struct bContext *C, ARegion *ar, void *a
float quat[4];
float axis[3];
float angle;
- const float px_scale = (ED_view3d_pixel_size(rv3d, ruler_item->co[1]) *
+ const float px_scale = (ED_view3d_pixel_size_no_ui_scale(rv3d, ruler_item->co[1]) *
min_fff(arc_size,
len_v2v2(co_ss[0], co_ss[1]) / 2.0f,
len_v2v2(co_ss[2], co_ss[1]) / 2.0f));
@@ -566,28 +570,32 @@ static void ruler_info_draw_pixel(const struct bContext *C, ARegion *ar, void *a
GPU_blend(false);
}
- immUnbindProgram();
+ char numstr[256];
+ float numstr_size[2];
+ float posit[2];
+ const int prec = 2; /* XXX, todo, make optional */
- /* text */
- {
- char numstr[256];
- float numstr_size[2];
- float posit[2];
- const int prec = 2; /* XXX, todo, make optional */
+ ruler_item_as_string(ruler_item, unit, numstr, sizeof(numstr), prec);
+
+ BLF_width_and_height(blf_mono_font, numstr, sizeof(numstr), &numstr_size[0], &numstr_size[1]);
- ruler_item_as_string(ruler_item, unit, numstr, sizeof(numstr), prec);
+ posit[0] = co_ss[1][0] + (cap_size * 2.0f);
+ posit[1] = co_ss[1][1] - (numstr_size[1] / 2.0f);
- BLF_width_and_height(blf_mono_font, numstr, sizeof(numstr), &numstr_size[0], &numstr_size[1]);
+ /* draw text (bg) */
+ {
+ immUniformColor4fv(color_back);
+ GPU_blend(true);
+ immRectf(shdr_pos,
+ posit[0] - bg_margin, posit[1] - bg_margin,
+ posit[0] + bg_margin + numstr_size[0], posit[1] + bg_margin + numstr_size[1]);
+ GPU_blend(false);
+ }
- posit[0] = co_ss[1][0] + (cap_size * 2.0f);
- posit[1] = co_ss[1][1] - (numstr_size[1] / 2.0f);
+ immUnbindProgram();
- /* draw text (bg) */
- UI_draw_roundbox_corner_set(UI_CNR_ALL);
- UI_draw_roundbox_aa(true,
- posit[0] - bg_margin, posit[1] - bg_margin,
- posit[0] + bg_margin + numstr_size[0], posit[1] + bg_margin + numstr_size[1],
- bg_radius, color_back);
+ /* text */
+ {
/* draw text */
BLF_color3ubv(blf_mono_font, color_text);
BLF_position(blf_mono_font, posit[0], posit[1], 0.0f);
@@ -648,31 +656,35 @@ static void ruler_info_draw_pixel(const struct bContext *C, ARegion *ar, void *a
GPU_blend(false);
}
- immUnbindProgram();
+ char numstr[256];
+ float numstr_size[2];
+ const int prec = 6; /* XXX, todo, make optional */
+ float posit[2];
- /* text */
- {
- char numstr[256];
- float numstr_size[2];
- const int prec = 6; /* XXX, todo, make optional */
- float posit[2];
+ ruler_item_as_string(ruler_item, unit, numstr, sizeof(numstr), prec);
+
+ BLF_width_and_height(blf_mono_font, numstr, sizeof(numstr), &numstr_size[0], &numstr_size[1]);
- ruler_item_as_string(ruler_item, unit, numstr, sizeof(numstr), prec);
+ mid_v2_v2v2(posit, co_ss[0], co_ss[2]);
- BLF_width_and_height(blf_mono_font, numstr, sizeof(numstr), &numstr_size[0], &numstr_size[1]);
+ /* center text */
+ posit[0] -= numstr_size[0] / 2.0f;
+ posit[1] -= numstr_size[1] / 2.0f;
- mid_v2_v2v2(posit, co_ss[0], co_ss[2]);
+ /* draw text (bg) */
+ {
+ immUniformColor4fv(color_back);
+ GPU_blend(true);
+ immRectf(shdr_pos,
+ posit[0] - bg_margin, posit[1] - bg_margin,
+ posit[0] + bg_margin + numstr_size[0], posit[1] + bg_margin + numstr_size[1]);
+ GPU_blend(false);
+ }
- /* center text */
- posit[0] -= numstr_size[0] / 2.0f;
- posit[1] -= numstr_size[1] / 2.0f;
+ immUnbindProgram();
- /* draw text (bg) */
- UI_draw_roundbox_corner_set(UI_CNR_ALL);
- UI_draw_roundbox_aa(true,
- posit[0] - bg_margin, posit[1] - bg_margin,
- posit[0] + bg_margin + numstr_size[0], posit[1] + bg_margin + numstr_size[1],
- bg_radius, color_back);
+ /* text */
+ {
/* draw text */
BLF_color3ubv(blf_mono_font, color_text);
BLF_position(blf_mono_font, posit[0], posit[1], 0.0f);
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index d32176ab20a..c421c96e530 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -311,7 +311,7 @@ static bool view3d_selectable_data(bContext *C)
}
-/* helper also for borderselect */
+/* helper also for box_select */
static bool edge_fully_inside_rect(const rctf *rect, const float v1[2], const float v2[2])
{
return BLI_rctf_isect_pt_v(rect, v1) && BLI_rctf_isect_pt_v(rect, v2);
@@ -448,7 +448,7 @@ static void do_lasso_select_objects(
/**
- * Use for lasso & border select.
+ * Use for lasso & box select.
*/
static Base **do_pose_tag_select_op_prepare(ViewContext *vc, uint *r_bases_len)
{
@@ -664,8 +664,6 @@ static void do_lasso_select_curve__doSelect(
void *userData, Nurb *UNUSED(nu), BPoint *bp, BezTriple *bezt, int beztindex, const float screen_co[2])
{
LassoSelectUserData *data = userData;
- Object *obedit = data->vc->obedit;
- Curve *cu = (Curve *)obedit->data;
const bool is_inside = BLI_lasso_is_point_inside(data->mcords, data->moves, screen_co[0], screen_co[1], IS_CLIPPED);
if (bp) {
@@ -676,7 +674,7 @@ static void do_lasso_select_curve__doSelect(
}
}
else {
- if (cu->drawflag & CU_HIDE_HANDLES) {
+ if ((data->vc->v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) {
/* can only be (beztindex == 0) here since handles are hidden */
const bool is_select = bezt->f2 & SELECT;
const int sel_op_result = ED_select_op_action_deselected(data->sel_op, is_select, is_inside);
@@ -718,7 +716,7 @@ static void do_lasso_select_curve(ViewContext *vc, const int mcords[][2], short
static void do_lasso_select_lattice__doSelect(void *userData, BPoint *bp, const float screen_co[2])
{
LassoSelectUserData *data = userData;
- const bool is_select = bp->f1 | SELECT;
+ const bool is_select = bp->f1 & SELECT;
const bool is_inside = (
BLI_rctf_isect_pt_v(data->rect_fl, screen_co) &&
BLI_lasso_is_point_inside(data->mcords, data->moves, screen_co[0], screen_co[1], IS_CLIPPED));
@@ -875,7 +873,7 @@ static void do_lasso_select_meshobject__doSelectVert(void *userData, MVert *mv,
}
static void do_lasso_select_paintvert(ViewContext *vc, const int mcords[][2], short moves, const eSelectOp sel_op)
{
- const bool use_zbuf = (vc->v3d->flag & V3D_ZBUF_SELECT) != 0;
+ const bool use_zbuf = V3D_IS_ZBUF(vc->v3d);
Object *ob = vc->obact;
Mesh *me = ob->data;
rcti rect;
@@ -1530,6 +1528,18 @@ Base *ED_view3d_give_base_under_cursor(bContext *C, const int mval[2])
return basact;
}
+Object *ED_view3d_give_object_under_cursor(bContext *C, const int mval[2])
+{
+ Base *base = ED_view3d_give_base_under_cursor(C, mval);
+ if (base) return base->object;
+ return NULL;
+}
+
+bool ED_view3d_is_object_under_cursor(bContext *C, const int mval[2])
+{
+ return ED_view3d_give_object_under_cursor(C, mval) != NULL;
+}
+
static void deselect_all_tracks(MovieTracking *tracking)
{
MovieTrackingObject *object;
@@ -1819,7 +1829,7 @@ static bool ed_object_select_pick(
/* Set special modes for grease pencil
The grease pencil modes are not real modes, but a hack to make the interface
consistent, so need some tricks to keep UI synchronized */
- // XXX: This stuff neeeds reviewing (Aligorith)
+ // XXX: This stuff needs reviewing (Aligorith)
if (false &&
(((oldbasact) && oldbasact->object->type == OB_GPENCIL) ||
(basact->object->type == OB_GPENCIL)))
@@ -1896,7 +1906,7 @@ static void do_paintvert_box_select__doSelectVert(void *userData, MVert *mv, con
static int do_paintvert_box_select(
ViewContext *vc, rcti *rect, const eSelectOp sel_op)
{
- const bool use_zbuf = (vc->v3d->flag & V3D_ZBUF_SELECT) != 0;
+ const bool use_zbuf = V3D_IS_ZBUF(vc->v3d);
Mesh *me;
MVert *mvert;
struct ImBuf *ibuf;
@@ -1984,8 +1994,6 @@ static void do_nurbs_box_select__doSelect(
void *userData, Nurb *UNUSED(nu), BPoint *bp, BezTriple *bezt, int beztindex, const float screen_co[2])
{
BoxSelectUserData *data = userData;
- Object *obedit = data->vc->obedit;
- Curve *cu = (Curve *)obedit->data;
const bool is_inside = BLI_rctf_isect_pt_v(data->rect_fl, screen_co);
if (bp) {
@@ -1996,7 +2004,7 @@ static void do_nurbs_box_select__doSelect(
}
}
else {
- if (cu->drawflag & CU_HIDE_HANDLES) {
+ if ((data->vc->v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) {
/* can only be (beztindex == 0) here since handles are hidden */
const bool is_select = bezt->f2 & SELECT;
const int sel_op_result = ED_select_op_action_deselected(data->sel_op, is_select, is_inside);
@@ -2161,7 +2169,8 @@ static int do_meta_box_select(
ViewContext *vc,
const rcti *rect, const eSelectOp sel_op)
{
- MetaBall *mb = (MetaBall *)vc->obedit->data;
+ Object *ob = vc->obedit;
+ MetaBall *mb = (MetaBall *)ob->data;
MetaElem *ml;
int a;
@@ -2176,27 +2185,50 @@ static int do_meta_box_select(
BKE_mball_deselect_all(mb);
}
- for (ml = mb->editelems->first; ml; ml = ml->next) {
- bool is_inside_1 = false;
- bool is_inside_2 = false;
+ int metaelem_id = 0;
+ for (ml = mb->editelems->first; ml; ml = ml->next, metaelem_id += 0x10000) {
+ bool is_inside_radius = false;
+ bool is_inside_stiff = false;
+
for (a = 0; a < hits; a++) {
- if (ml->selcol1 == buffer[(4 * a) + 3]) {
- is_inside_1 = true;
+ int hitresult = buffer[(4 * a) + 3];
+
+ if (hitresult == -1) {
+ continue;
+ }
+ else if (hitresult & MBALL_NOSEL) {
+ continue;
+ }
+
+ const uint hit_object = hitresult & 0xFFFF;
+ if (vc->obedit->select_color != hit_object) {
+ continue;
+ }
+
+ if (metaelem_id != (hitresult & 0xFFFF0000 & ~(MBALLSEL_ANY))) {
+ continue;
+ }
+
+ if (hitresult & MBALLSEL_RADIUS) {
+ is_inside_radius = true;
break;
}
- if (ml->selcol2 == buffer[(4 * a) + 3]) {
- is_inside_2 = true;
+
+ if (hitresult & MBALLSEL_STIFF) {
+ is_inside_stiff = true;
break;
}
}
- if (is_inside_1) {
+ if (is_inside_radius) {
ml->flag |= MB_SCALE_RAD;
}
- if (is_inside_2) {
+ if (is_inside_stiff) {
ml->flag &= ~MB_SCALE_RAD;
}
+
const bool is_select = (ml->flag & SELECT);
- const bool is_inside = is_inside_1 || is_inside_2;
+ const bool is_inside = is_inside_radius || is_inside_stiff;
+
const int sel_op_result = ED_select_op_action_deselected(sel_op, is_select, is_inside);
if (sel_op_result != -1) {
SET_FLAG_FROM_TEST(ml->flag, sel_op_result, SELECT);
@@ -2476,7 +2508,7 @@ static int do_pose_box_select(bContext *C, ViewContext *vc, rcti *rect, const eS
return hits > 0 ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
-static int view3d_borderselect_exec(bContext *C, wmOperator *op)
+static int view3d_box_select_exec(bContext *C, wmOperator *op)
{
ViewContext vc;
rcti rect;
@@ -2534,7 +2566,7 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
}
break;
default:
- assert(!"border select on incorrect object type");
+ assert(!"box select on incorrect object type");
break;
}
}
@@ -2552,7 +2584,7 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
ret |= do_paintvert_box_select(&vc, &rect, sel_op);
}
else if (vc.obact && vc.obact->mode & OB_MODE_PARTICLE_EDIT) {
- ret |= PE_border_select(C, &rect, sel_op);
+ ret |= PE_box_select(C, &rect, sel_op);
}
else if (vc.obact && vc.obact->mode & OB_MODE_POSE) {
ret |= do_pose_box_select(C, &vc, &rect, sel_op);
@@ -2575,26 +2607,26 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
/* *****************Selection Operators******************* */
-/* ****** Border Select ****** */
-void VIEW3D_OT_select_border(wmOperatorType *ot)
+/* ****** Box Select ****** */
+void VIEW3D_OT_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
- ot->description = "Select items using border selection";
- ot->idname = "VIEW3D_OT_select_border";
+ ot->name = "Box Select";
+ ot->description = "Select items using box selection";
+ ot->idname = "VIEW3D_OT_select_box";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
- ot->exec = view3d_borderselect_exec;
- ot->modal = WM_gesture_border_modal;
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = view3d_box_select_exec;
+ ot->modal = WM_gesture_box_modal;
ot->poll = view3d_selectable_data;
- ot->cancel = WM_gesture_border_cancel;
+ ot->cancel = WM_gesture_box_cancel;
/* flags */
ot->flag = OPTYPE_UNDO;
/* rna */
- WM_operator_properties_gesture_border(ot);
+ WM_operator_properties_gesture_box(ot);
WM_operator_properties_select_operation(ot);
}
@@ -2606,7 +2638,7 @@ static bool ed_wpaint_vertex_select_pick(
bool extend, bool deselect, bool toggle, Object *obact)
{
View3D *v3d = CTX_wm_view3d(C);
- const bool use_zbuf = (v3d->flag & V3D_ZBUF_SELECT) != 0;
+ const bool use_zbuf = V3D_IS_ZBUF(v3d);
Mesh *me = obact->data; /* already checked for NULL */
unsigned int index = 0;
@@ -2877,7 +2909,7 @@ static void paint_vertsel_circle_select_doSelectVert(void *userData, MVert *mv,
}
static void paint_vertsel_circle_select(ViewContext *vc, const bool select, const int mval[2], float rad)
{
- const bool use_zbuf = (vc->v3d->flag & V3D_ZBUF_SELECT) != 0;
+ const bool use_zbuf = V3D_IS_ZBUF(vc->v3d);
Object *ob = vc->obact;
Mesh *me = ob->data;
bool bbsel;
@@ -2912,15 +2944,13 @@ static void nurbscurve_circle_doSelect(
void *userData, Nurb *UNUSED(nu), BPoint *bp, BezTriple *bezt, int beztindex, const float screen_co[2])
{
CircleSelectUserData *data = userData;
- Object *obedit = data->vc->obedit;
- Curve *cu = (Curve *)obedit->data;
if (len_squared_v2v2(data->mval_fl, screen_co) <= data->radius_squared) {
if (bp) {
bp->f1 = data->select ? (bp->f1 | SELECT) : (bp->f1 & ~SELECT);
}
else {
- if (cu->drawflag & CU_HIDE_HANDLES) {
+ if ((data->vc->v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) {
/* can only be (beztindex == 0) here since handles are hidden */
bezt->f1 = bezt->f2 = bezt->f3 = data->select ? (bezt->f2 | SELECT) : (bezt->f2 & ~SELECT);
}
diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index 37f096c3e49..9089a34ecaf 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -93,32 +93,38 @@ static int snap_sel_to_grid_exec(bContext *C, wmOperator *UNUSED(op))
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
obedit = objects[ob_index];
+
+ if (obedit->type == OB_MESH) {
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+
+ if (em->bm->totvertsel == 0) {
+ continue;
+ }
+ }
+
if (ED_transverts_check_obedit(obedit)) {
ED_transverts_create_from_obedit(&tvs, obedit, 0);
}
- if (tvs.transverts_tot == 0) {
- continue;
- }
+ if (tvs.transverts_tot != 0) {
+ copy_m3_m4(bmat, obedit->obmat);
+ invert_m3_m3(imat, bmat);
- copy_m3_m4(bmat, obedit->obmat);
- invert_m3_m3(imat, bmat);
-
- tv = tvs.transverts;
- for (a = 0; a < tvs.transverts_tot; a++, tv++) {
- copy_v3_v3(vec, tv->loc);
- mul_m3_v3(bmat, vec);
- add_v3_v3(vec, obedit->obmat[3]);
- vec[0] = gridf * floorf(0.5f + vec[0] / gridf);
- vec[1] = gridf * floorf(0.5f + vec[1] / gridf);
- vec[2] = gridf * floorf(0.5f + vec[2] / gridf);
- sub_v3_v3(vec, obedit->obmat[3]);
-
- mul_m3_v3(imat, vec);
- copy_v3_v3(tv->loc, vec);
- }
+ tv = tvs.transverts;
+ for (a = 0; a < tvs.transverts_tot; a++, tv++) {
+ copy_v3_v3(vec, tv->loc);
+ mul_m3_v3(bmat, vec);
+ add_v3_v3(vec, obedit->obmat[3]);
+ vec[0] = gridf * floorf(0.5f + vec[0] / gridf);
+ vec[1] = gridf * floorf(0.5f + vec[1] / gridf);
+ vec[2] = gridf * floorf(0.5f + vec[2] / gridf);
+ sub_v3_v3(vec, obedit->obmat[3]);
- ED_transverts_update_obedit(&tvs, obedit);
+ mul_m3_v3(imat, vec);
+ copy_v3_v3(tv->loc, vec);
+ }
+ ED_transverts_update_obedit(&tvs, obedit);
+ }
ED_transverts_free(&tvs);
}
MEM_freeN(objects);
@@ -260,104 +266,122 @@ static int snap_selected_to_location(bContext *C, const float snap_target_global
if (obedit) {
float snap_target_local[3];
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ obedit = objects[ob_index];
- if (ED_transverts_check_obedit(obedit))
- ED_transverts_create_from_obedit(&tvs, obedit, 0);
- if (tvs.transverts_tot == 0)
- return OPERATOR_CANCELLED;
+ if (obedit->type == OB_MESH) {
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+
+ if (em->bm->totvertsel == 0) {
+ continue;
+ }
+ }
+
+ if (ED_transverts_check_obedit(obedit)) {
+ ED_transverts_create_from_obedit(&tvs, obedit, 0);
+ }
- copy_m3_m4(bmat, obedit->obmat);
- invert_m3_m3(imat, bmat);
+ if (tvs.transverts_tot != 0) {
+ copy_m3_m4(bmat, obedit->obmat);
+ invert_m3_m3(imat, bmat);
- /* get the cursor in object space */
- sub_v3_v3v3(snap_target_local, snap_target_global, obedit->obmat[3]);
- mul_m3_v3(imat, snap_target_local);
+ /* get the cursor in object space */
+ sub_v3_v3v3(snap_target_local, snap_target_global, obedit->obmat[3]);
+ mul_m3_v3(imat, snap_target_local);
- if (use_offset) {
- float offset_local[3];
+ if (use_offset) {
+ float offset_local[3];
- mul_v3_m3v3(offset_local, imat, offset_global);
+ mul_v3_m3v3(offset_local, imat, offset_global);
- tv = tvs.transverts;
- for (a = 0; a < tvs.transverts_tot; a++, tv++) {
- add_v3_v3(tv->loc, offset_local);
- }
- }
- else {
- tv = tvs.transverts;
- for (a = 0; a < tvs.transverts_tot; a++, tv++) {
- copy_v3_v3(tv->loc, snap_target_local);
+ tv = tvs.transverts;
+ for (a = 0; a < tvs.transverts_tot; a++, tv++) {
+ add_v3_v3(tv->loc, offset_local);
+ }
+ }
+ else {
+ tv = tvs.transverts;
+ for (a = 0; a < tvs.transverts_tot; a++, tv++) {
+ copy_v3_v3(tv->loc, snap_target_local);
+ }
+ }
+ ED_transverts_update_obedit(&tvs, obedit);
}
+ ED_transverts_free(&tvs);
}
-
- ED_transverts_update_obedit(&tvs, obedit);
- ED_transverts_free(&tvs);
+ MEM_freeN(objects);
}
else if (obact && (obact->mode & OB_MODE_POSE)) {
struct KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_LOCATION_ID);
-
- bPoseChannel *pchan;
- bArmature *arm = obact->data;
- float snap_target_local[3];
-
- invert_m4_m4(obact->imat, obact->obmat);
- mul_v3_m4v3(snap_target_local, obact->imat, snap_target_global);
-
- for (pchan = obact->pose->chanbase.first; pchan; pchan = pchan->next) {
- if ((pchan->bone->flag & BONE_SELECTED) &&
- (PBONE_VISIBLE(arm, pchan->bone)) &&
- /* if the bone has a parent and is connected to the parent,
- * don't do anything - will break chain unless we do auto-ik.
- */
- (pchan->bone->flag & BONE_CONNECTED) == 0)
- {
- pchan->bone->flag |= BONE_TRANSFORM;
- }
- else {
- pchan->bone->flag &= ~BONE_TRANSFORM;
- }
- }
-
- for (pchan = obact->pose->chanbase.first; pchan; pchan = pchan->next) {
- if ((pchan->bone->flag & BONE_TRANSFORM) &&
- /* check that our parents not transformed (if we have one) */
- ((pchan->bone->parent &&
- BKE_armature_bone_flag_test_recursive(pchan->bone->parent, BONE_TRANSFORM)) == 0))
- {
- /* Get position in pchan (pose) space. */
- float cursor_pose[3];
-
- if (use_offset) {
- mul_v3_m4v3(cursor_pose, obact->obmat, pchan->pose_mat[3]);
- add_v3_v3(cursor_pose, offset_global);
-
- mul_m4_v3(obact->imat, cursor_pose);
- BKE_armature_loc_pose_to_bone(pchan, cursor_pose, cursor_pose);
+ CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
+ {
+ bPoseChannel *pchan;
+ bArmature *arm = ob->data;
+ float snap_target_local[3];
+
+ invert_m4_m4(ob->imat, ob->obmat);
+ mul_v3_m4v3(snap_target_local, ob->imat, snap_target_global);
+
+ for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
+ if ((pchan->bone->flag & BONE_SELECTED) &&
+ (PBONE_VISIBLE(arm, pchan->bone)) &&
+ /* if the bone has a parent and is connected to the parent,
+ * don't do anything - will break chain unless we do auto-ik.
+ */
+ (pchan->bone->flag & BONE_CONNECTED) == 0)
+ {
+ pchan->bone->flag |= BONE_TRANSFORM;
}
else {
- BKE_armature_loc_pose_to_bone(pchan, snap_target_local, cursor_pose);
+ pchan->bone->flag &= ~BONE_TRANSFORM;
}
+ }
- /* copy new position */
- if ((pchan->protectflag & OB_LOCK_LOCX) == 0)
- pchan->loc[0] = cursor_pose[0];
- if ((pchan->protectflag & OB_LOCK_LOCY) == 0)
- pchan->loc[1] = cursor_pose[1];
- if ((pchan->protectflag & OB_LOCK_LOCZ) == 0)
- pchan->loc[2] = cursor_pose[2];
+ for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
+ if ((pchan->bone->flag & BONE_TRANSFORM) &&
+ /* check that our parents not transformed (if we have one) */
+ ((pchan->bone->parent &&
+ BKE_armature_bone_flag_test_recursive(pchan->bone->parent, BONE_TRANSFORM)) == 0))
+ {
+ /* Get position in pchan (pose) space. */
+ float cursor_pose[3];
+
+ if (use_offset) {
+ mul_v3_m4v3(cursor_pose, ob->obmat, pchan->pose_mat[3]);
+ add_v3_v3(cursor_pose, offset_global);
+
+ mul_m4_v3(ob->imat, cursor_pose);
+ BKE_armature_loc_pose_to_bone(pchan, cursor_pose, cursor_pose);
+ }
+ else {
+ BKE_armature_loc_pose_to_bone(pchan, snap_target_local, cursor_pose);
+ }
- /* auto-keyframing */
- ED_autokeyframe_pchan(C, scene, obact, pchan, ks);
+ /* copy new position */
+ if ((pchan->protectflag & OB_LOCK_LOCX) == 0)
+ pchan->loc[0] = cursor_pose[0];
+ if ((pchan->protectflag & OB_LOCK_LOCY) == 0)
+ pchan->loc[1] = cursor_pose[1];
+ if ((pchan->protectflag & OB_LOCK_LOCZ) == 0)
+ pchan->loc[2] = cursor_pose[2];
+
+ /* auto-keyframing */
+ ED_autokeyframe_pchan(C, scene, ob, pchan, ks);
+ }
}
- }
- for (pchan = obact->pose->chanbase.first; pchan; pchan = pchan->next) {
- pchan->bone->flag &= ~BONE_TRANSFORM;
- }
+ for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
+ pchan->bone->flag &= ~BONE_TRANSFORM;
+ }
- obact->pose->flag |= (POSE_LOCKED | POSE_DO_UNLOCK);
+ ob->pose->flag |= (POSE_LOCKED | POSE_DO_UNLOCK);
- DEG_id_tag_update(&obact->id, OB_RECALC_DATA);
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ }
+ CTX_DATA_END;
}
else {
struct KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_LOCATION_ID);
@@ -597,34 +621,51 @@ static bool snap_curs_to_sel_ex(bContext *C, float cursor[3])
zero_v3(centroid);
if (obedit) {
- if (ED_transverts_check_obedit(obedit))
- ED_transverts_create_from_obedit(&tvs, obedit, TM_ALL_JOINTS | TM_SKIP_HANDLES);
+ int global_transverts_tot = 0;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ obedit = objects[ob_index];
- if (tvs.transverts_tot == 0) {
- return false;
- }
+ /* We can do that quick check for meshes only... */
+ if (obedit->type == OB_MESH) {
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+
+ if (em->bm->totvertsel == 0) {
+ continue;
+ }
+ }
- Object *obedit_eval = DEG_get_evaluated_object(depsgraph, obedit);
- copy_m3_m4(bmat, obedit_eval->obmat);
+ if (ED_transverts_check_obedit(obedit)) {
+ ED_transverts_create_from_obedit(&tvs, obedit, TM_ALL_JOINTS | TM_SKIP_HANDLES);
+ }
- tv = tvs.transverts;
- for (a = 0; a < tvs.transverts_tot; a++, tv++) {
- copy_v3_v3(vec, tv->loc);
- mul_m3_v3(bmat, vec);
- add_v3_v3(vec, obedit_eval->obmat[3]);
- add_v3_v3(centroid, vec);
- minmax_v3v3_v3(min, max, vec);
+ global_transverts_tot += tvs.transverts_tot;
+ if (tvs.transverts_tot != 0) {
+ Object *obedit_eval = DEG_get_evaluated_object(depsgraph, obedit);
+ copy_m3_m4(bmat, obedit_eval->obmat);
+
+ tv = tvs.transverts;
+ for (a = 0; a < tvs.transverts_tot; a++, tv++) {
+ copy_v3_v3(vec, tv->loc);
+ mul_m3_v3(bmat, vec);
+ add_v3_v3(vec, obedit_eval->obmat[3]);
+ add_v3_v3(centroid, vec);
+ minmax_v3v3_v3(min, max, vec);
+ }
+ }
+ ED_transverts_free(&tvs);
}
+ MEM_freeN(objects);
if (scene->toolsettings->transform_pivot_point == V3D_AROUND_CENTER_MEAN) {
- mul_v3_fl(centroid, 1.0f / (float)tvs.transverts_tot);
+ mul_v3_fl(centroid, 1.0f / (float)global_transverts_tot);
copy_v3_v3(cursor, centroid);
}
else {
mid_v3_v3v3(cursor, min, max);
}
-
- ED_transverts_free(&tvs);
}
else {
Object *obact = CTX_data_active_object(C);
@@ -727,10 +768,8 @@ static bool snap_calc_active_center(bContext *C, const bool select_only, float r
Object *obedit = CTX_data_edit_object(C);
if (obedit) {
- Object *ob_edit_eval = DEG_get_evaluated_object(depsgraph, obedit);
-
- if (ED_object_editmode_calc_active_center(ob_edit_eval, select_only, r_center)) {
- mul_m4_v3(ob_edit_eval->obmat, r_center);
+ if (ED_object_editmode_calc_active_center(obedit, select_only, r_center)) {
+ mul_m4_v3(obedit->obmat, r_center);
return true;
}
}
@@ -817,7 +856,7 @@ static int snap_curs_to_center_exec(bContext *C, wmOperator *UNUSED(op))
void VIEW3D_OT_snap_cursor_to_center(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Snap Cursor to Center";
+ ot->name = "Snap Cursor to World Origin";
ot->description = "Snap 3D cursor to the world origin";
ot->idname = "VIEW3D_OT_snap_cursor_to_center";
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index 8a4a0efad2a..33a3cd8e151 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -857,7 +857,6 @@ void view3d_opengl_select_cache_end(void)
GPU_select_cache_end();
}
-#ifndef WITH_OPENGL_LEGACY
struct DrawSelectLoopUserData {
uint pass;
uint hits;
@@ -894,7 +893,6 @@ static bool drw_select_loop_pass(eDRWSelectStage stage, void *user_data)
return continue_pass;
}
-#endif /* WITH_OPENGL_LEGACY */
/** Implement #VIEW3D_SELECT_FILTER_OBJECT_MODE_LOCK. */
static bool drw_select_filter_object_mode_lock(Object *ob, void *user_data)
@@ -920,7 +918,7 @@ int view3d_opengl_select(
View3D *v3d = vc->v3d;
ARegion *ar = vc->ar;
rcti rect;
- int hits;
+ int hits = 0;
const bool use_obedit_skip = (OBEDIT_FROM_VIEW_LAYER(vc->view_layer) != NULL) && (vc->obedit == NULL);
const bool is_pick_select = (U.gpu_select_pick_deph != 0);
const bool do_passes = (
@@ -928,10 +926,11 @@ int view3d_opengl_select(
(select_mode == VIEW3D_SELECT_PICK_NEAREST) &&
GPU_select_query_check_active());
const bool use_nearest = (is_pick_select && select_mode == VIEW3D_SELECT_PICK_NEAREST);
+ bool draw_surface = true;
char gpu_select_mode;
- /* case not a border select */
+ /* case not a box select */
if (input->xmin == input->xmax) {
/* seems to be default value for bones only now */
BLI_rcti_init_pt_radius(&rect, (const int[2]){input->xmin, input->ymin}, 12);
@@ -992,10 +991,8 @@ int view3d_opengl_select(
goto finally;
}
-#ifndef WITH_OPENGL_LEGACY
/* All of the queries need to be perform on the drawing context. */
DRW_opengl_context_enable();
-#endif
G.f |= G_PICKSEL;
@@ -1007,25 +1004,35 @@ int view3d_opengl_select(
GPU_depth_test(true);
}
- if (vc->rv3d->rflag & RV3D_CLIPPING)
+ if (vc->rv3d->rflag & RV3D_CLIPPING) {
ED_view3d_clipping_set(vc->rv3d);
+ }
-
-#ifdef WITH_OPENGL_LEGACY
- if (IS_VIEWPORT_LEGACY(vc->v3d)) {
- GPU_select_begin(buffer, bufsize, &rect, gpu_select_mode, 0);
- ED_view3d_draw_select_loop(vc, scene, sl, v3d, ar, use_obedit_skip, use_nearest);
- hits = GPU_select_end();
-
- if (do_passes && (hits > 0)) {
- GPU_select_begin(buffer, bufsize, &rect, GPU_SELECT_NEAREST_SECOND_PASS, hits);
- ED_view3d_draw_select_loop(vc, scene, sl, v3d, ar, use_obedit_skip, use_nearest);
- GPU_select_end();
- }
+ /* If in xray mode, we select the wires in priority. */
+ if ((v3d->shading.flag & V3D_XRAY_FLAG(v3d)) && use_nearest) {
+ /* We need to call "GPU_select_*" API's inside DRW_draw_select_loop
+ * because the OpenGL context created & destroyed inside this function. */
+ struct DrawSelectLoopUserData drw_select_loop_user_data = {
+ .pass = 0,
+ .hits = 0,
+ .buffer = buffer,
+ .buffer_len = bufsize,
+ .rect = &rect,
+ .gpu_select_mode = gpu_select_mode,
+ };
+ draw_surface = false;
+ DRW_draw_select_loop(
+ depsgraph, ar, v3d,
+ use_obedit_skip, draw_surface, use_nearest, &rect,
+ drw_select_loop_pass, &drw_select_loop_user_data,
+ object_filter.fn, object_filter.user_data);
+ hits = drw_select_loop_user_data.hits;
+ /* FIX: This cleanup the state before doing another selection pass.
+ * (see T56695) */
+ GPU_select_cache_end();
}
- else
-#else
- {
+
+ if (hits == 0) {
/* We need to call "GPU_select_*" API's inside DRW_draw_select_loop
* because the OpenGL context created & destroyed inside this function. */
struct DrawSelectLoopUserData drw_select_loop_user_data = {
@@ -1036,14 +1043,14 @@ int view3d_opengl_select(
.rect = &rect,
.gpu_select_mode = gpu_select_mode,
};
+ draw_surface = true;
DRW_draw_select_loop(
depsgraph, ar, v3d,
- use_obedit_skip, use_nearest, &rect,
+ use_obedit_skip, draw_surface, use_nearest, &rect,
drw_select_loop_pass, &drw_select_loop_user_data,
object_filter.fn, object_filter.user_data);
hits = drw_select_loop_user_data.hits;
}
-#endif /* WITH_OPENGL_LEGACY */
G.f &= ~G_PICKSEL;
ED_view3d_draw_setup_view(vc->win, depsgraph, scene, ar, v3d, vc->rv3d->viewmat, NULL, NULL);
@@ -1055,9 +1062,7 @@ int view3d_opengl_select(
if (vc->rv3d->rflag & RV3D_CLIPPING)
ED_view3d_clipping_disable();
-#ifndef WITH_OPENGL_LEGACY
DRW_opengl_context_disable();
-#endif
finally:
diff --git a/source/blender/editors/space_view3d/view3d_walk.c b/source/blender/editors/space_view3d/view3d_walk.c
index e4e12cc3686..68a40f33368 100644
--- a/source/blender/editors/space_view3d/view3d_walk.c
+++ b/source/blender/editors/space_view3d/view3d_walk.c
@@ -65,7 +65,7 @@
#ifdef WITH_INPUT_NDOF
//# define NDOF_WALK_DEBUG
-//# define NDOF_WALK_DRAW_TOOMUCH /* is this needed for ndof? - commented so redraw doesnt thrash - campbell */
+//# define NDOF_WALK_DRAW_TOOMUCH /* is this needed for ndof? - commented so redraw doesn't thrash - campbell */
#endif
#define USE_TABLET_SUPPORT
@@ -177,59 +177,6 @@ void walk_modal_keymap(wmKeyConfig *keyconf)
keymap = WM_modalkeymap_add(keyconf, "View3D Walk Modal", modal_items);
- /* items for modal map */
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_ANY, KM_ANY, 0, WALK_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, WALK_MODAL_CANCEL);
-
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_ANY, KM_ANY, 0, WALK_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, WALK_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, WALK_MODAL_CONFIRM);
-
- WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, WALK_MODAL_FAST_ENABLE);
- WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_RELEASE, KM_ANY, 0, WALK_MODAL_FAST_DISABLE);
-
- WM_modalkeymap_add_item(keymap, LEFTALTKEY, KM_PRESS, KM_ANY, 0, WALK_MODAL_SLOW_ENABLE);
- WM_modalkeymap_add_item(keymap, LEFTALTKEY, KM_RELEASE, KM_ANY, 0, WALK_MODAL_SLOW_DISABLE);
-
- /* WASD */
- WM_modalkeymap_add_item(keymap, WKEY, KM_PRESS, KM_ANY, 0, WALK_MODAL_DIR_FORWARD);
- WM_modalkeymap_add_item(keymap, SKEY, KM_PRESS, KM_ANY, 0, WALK_MODAL_DIR_BACKWARD);
- WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, KM_ANY, 0, WALK_MODAL_DIR_LEFT);
- WM_modalkeymap_add_item(keymap, DKEY, KM_PRESS, KM_ANY, 0, WALK_MODAL_DIR_RIGHT);
- WM_modalkeymap_add_item(keymap, EKEY, KM_PRESS, KM_ANY, 0, WALK_MODAL_DIR_UP);
- WM_modalkeymap_add_item(keymap, QKEY, KM_PRESS, KM_ANY, 0, WALK_MODAL_DIR_DOWN);
-
- WM_modalkeymap_add_item(keymap, WKEY, KM_RELEASE, KM_ANY, 0, WALK_MODAL_DIR_FORWARD_STOP);
- WM_modalkeymap_add_item(keymap, SKEY, KM_RELEASE, KM_ANY, 0, WALK_MODAL_DIR_BACKWARD_STOP);
- WM_modalkeymap_add_item(keymap, AKEY, KM_RELEASE, KM_ANY, 0, WALK_MODAL_DIR_LEFT_STOP);
- WM_modalkeymap_add_item(keymap, DKEY, KM_RELEASE, KM_ANY, 0, WALK_MODAL_DIR_RIGHT_STOP);
- WM_modalkeymap_add_item(keymap, EKEY, KM_RELEASE, KM_ANY, 0, WALK_MODAL_DIR_UP_STOP);
- WM_modalkeymap_add_item(keymap, QKEY, KM_RELEASE, KM_ANY, 0, WALK_MODAL_DIR_DOWN_STOP);
-
- WM_modalkeymap_add_item(keymap, UPARROWKEY, KM_PRESS, 0, 0, WALK_MODAL_DIR_FORWARD);
- WM_modalkeymap_add_item(keymap, DOWNARROWKEY, KM_PRESS, 0, 0, WALK_MODAL_DIR_BACKWARD);
- WM_modalkeymap_add_item(keymap, LEFTARROWKEY, KM_PRESS, 0, 0, WALK_MODAL_DIR_LEFT);
- WM_modalkeymap_add_item(keymap, RIGHTARROWKEY, KM_PRESS, 0, 0, WALK_MODAL_DIR_RIGHT);
-
- WM_modalkeymap_add_item(keymap, UPARROWKEY, KM_RELEASE, KM_ANY, 0, WALK_MODAL_DIR_FORWARD_STOP);
- WM_modalkeymap_add_item(keymap, DOWNARROWKEY, KM_RELEASE, KM_ANY, 0, WALK_MODAL_DIR_BACKWARD_STOP);
- WM_modalkeymap_add_item(keymap, LEFTARROWKEY, KM_RELEASE, KM_ANY, 0, WALK_MODAL_DIR_LEFT_STOP);
- WM_modalkeymap_add_item(keymap, RIGHTARROWKEY, KM_RELEASE, KM_ANY, 0, WALK_MODAL_DIR_RIGHT_STOP);
-
- WM_modalkeymap_add_item(keymap, TABKEY, KM_PRESS, 0, 0, WALK_MODAL_TOGGLE);
- WM_modalkeymap_add_item(keymap, GKEY, KM_PRESS, 0, 0, WALK_MODAL_TOGGLE);
-
- WM_modalkeymap_add_item(keymap, VKEY, KM_PRESS, KM_ANY, 0, WALK_MODAL_JUMP);
- WM_modalkeymap_add_item(keymap, VKEY, KM_RELEASE, KM_ANY, 0, WALK_MODAL_JUMP_STOP);
-
- WM_modalkeymap_add_item(keymap, SPACEKEY, KM_PRESS, KM_ANY, 0, WALK_MODAL_TELEPORT);
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_ANY, KM_ANY, 0, WALK_MODAL_TELEPORT);
-
- WM_modalkeymap_add_item(keymap, PADPLUSKEY, KM_PRESS, KM_ANY, 0, WALK_MODAL_ACCELERATE);
- WM_modalkeymap_add_item(keymap, PADMINUS, KM_PRESS, KM_ANY, 0, WALK_MODAL_DECELERATE);
- WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, KM_ANY, 0, WALK_MODAL_ACCELERATE);
- WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, KM_ANY, 0, WALK_MODAL_DECELERATE);
-
/* assign map to operators */
WM_modalkeymap_assign(keymap, "VIEW3D_OT_walk");
}
@@ -450,7 +397,7 @@ static bool walk_floor_distance_get(
ray_start, ray_normal, r_distance,
r_location, r_normal_dummy);
- /* artifically scale the distance to the scene size */
+ /* artificially scale the distance to the scene size */
*r_distance /= walk->grid;
return ret;
}
@@ -489,7 +436,7 @@ static bool walk_ray_cast(
negate_v3(r_normal);
}
- /* artifically scale the distance to the scene size */
+ /* artificially scale the distance to the scene size */
*ray_distance /= walk->grid;
return ret;
@@ -1069,7 +1016,7 @@ static int walkApply(bContext *C, wmOperator *op, WalkInfo *walk)
/* speed factor */
y *= WALK_ROTATE_FAC;
- /* user adjustement factor */
+ /* user adjustment factor */
y *= walk->mouse_speed;
/* clamp the angle limits */
@@ -1107,7 +1054,7 @@ static int walkApply(bContext *C, wmOperator *op, WalkInfo *walk)
/* speed factor */
x *= WALK_ROTATE_FAC;
- /* user adjustement factor */
+ /* user adjustment factor */
x *= walk->mouse_speed;
/* Rotate about the relative up vec */
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 5816815f5bc..82c88924752 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -235,7 +235,7 @@ bool transdata_check_local_islands(TransInfo *t, short around)
(ELEM(t->obedit_type, OB_MESH))));
}
-/* ************************** SPACE DEPENDANT CODE **************************** */
+/* ************************** SPACE DEPENDENT CODE **************************** */
void setTransformViewMatrices(TransInfo *t)
{
@@ -932,7 +932,7 @@ wmKeyMap *transform_modal_keymap(wmKeyConfig *keyconf)
{TFM_MODAL_EDGESLIDE_DOWN, "EDGESLIDE_PREV_NEXT", 0, "Select previous Edge Slide Edge", ""},
{TFM_MODAL_PROPSIZE, "PROPORTIONAL_SIZE", 0, "Adjust Proportional Influence", ""},
{TFM_MODAL_INSERTOFS_TOGGLE_DIR, "INSERTOFS_TOGGLE_DIR", 0, "Toggle Direction for Node Auto-offset", ""},
- {TFM_MODAL_TRANSLATE, "TRANSLATE", 0, "Translate", ""},
+ {TFM_MODAL_TRANSLATE, "TRANSLATE", 0, "Move", ""},
{TFM_MODAL_ROTATE, "ROTATE", 0, "Rotate", ""},
{TFM_MODAL_RESIZE, "RESIZE", 0, "Resize", ""},
{0, NULL, 0, NULL, NULL}
@@ -940,65 +940,9 @@ wmKeyMap *transform_modal_keymap(wmKeyConfig *keyconf)
wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "Transform Modal Map");
- /* this function is called for each spacetype, only needs to add map once */
- if (keymap && keymap->modal_items) return NULL;
-
keymap = WM_modalkeymap_add(keyconf, "Transform Modal Map", modal_items);
keymap->poll_modal_item = transform_modal_item_poll;
- /* items for modal map */
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_ANY, 0, TFM_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, TFM_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, TFM_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_PRESS, KM_ANY, 0, TFM_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, TFM_MODAL_CANCEL);
-
- WM_modalkeymap_add_item(keymap, XKEY, KM_PRESS, 0, 0, TFM_MODAL_AXIS_X);
- WM_modalkeymap_add_item(keymap, YKEY, KM_PRESS, 0, 0, TFM_MODAL_AXIS_Y);
- WM_modalkeymap_add_item(keymap, ZKEY, KM_PRESS, 0, 0, TFM_MODAL_AXIS_Z);
-
- WM_modalkeymap_add_item(keymap, XKEY, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_PLANE_X);
- WM_modalkeymap_add_item(keymap, YKEY, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_PLANE_Y);
- WM_modalkeymap_add_item(keymap, ZKEY, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_PLANE_Z);
-
- WM_modalkeymap_add_item(keymap, CKEY, KM_PRESS, 0, 0, TFM_MODAL_CONS_OFF);
-
- WM_modalkeymap_add_item(keymap, GKEY, KM_PRESS, 0, 0, TFM_MODAL_TRANSLATE);
- WM_modalkeymap_add_item(keymap, RKEY, KM_PRESS, 0, 0, TFM_MODAL_ROTATE);
- WM_modalkeymap_add_item(keymap, SKEY, KM_PRESS, 0, 0, TFM_MODAL_RESIZE);
-
- WM_modalkeymap_add_item(keymap, TABKEY, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_SNAP_TOGGLE);
-
- WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, TFM_MODAL_SNAP_INV_ON);
- WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, TFM_MODAL_SNAP_INV_OFF);
-
- WM_modalkeymap_add_item(keymap, RIGHTCTRLKEY, KM_PRESS, KM_ANY, 0, TFM_MODAL_SNAP_INV_ON);
- WM_modalkeymap_add_item(keymap, RIGHTCTRLKEY, KM_RELEASE, KM_ANY, 0, TFM_MODAL_SNAP_INV_OFF);
-
- WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, 0, 0, TFM_MODAL_ADD_SNAP);
- WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, KM_ALT, 0, TFM_MODAL_REMOVE_SNAP);
-
- WM_modalkeymap_add_item(keymap, PAGEUPKEY, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_UP);
- WM_modalkeymap_add_item(keymap, PAGEDOWNKEY, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_DOWN);
- WM_modalkeymap_add_item(keymap, PAGEUPKEY, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_PROPSIZE_UP);
- WM_modalkeymap_add_item(keymap, PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_PROPSIZE_DOWN);
- WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_UP);
- WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_DOWN);
- WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_PROPSIZE_UP);
- WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_PROPSIZE_DOWN);
- WM_modalkeymap_add_item(keymap, MOUSEPAN, 0, 0, 0, TFM_MODAL_PROPSIZE);
-
- WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, KM_ALT, 0, TFM_MODAL_EDGESLIDE_UP);
- WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, KM_ALT, 0, TFM_MODAL_EDGESLIDE_DOWN);
-
- WM_modalkeymap_add_item(keymap, PAGEUPKEY, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_AUTOIK_LEN_INC);
- WM_modalkeymap_add_item(keymap, PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_AUTOIK_LEN_DEC);
- WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_AUTOIK_LEN_INC);
- WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_AUTOIK_LEN_DEC);
-
- /* node editor only */
- WM_modalkeymap_add_item(keymap, TKEY, KM_PRESS, 0, 0, TFM_MODAL_INSERTOFS_TOGGLE_DIR);
-
return keymap;
}
@@ -1926,6 +1870,29 @@ static void drawHelpline(bContext *C, int x, int y, void *customdata)
drawArrow(UP, 5, 10, 5);
drawArrow(DOWN, 5, 10, 5);
break;
+ case HLP_CARROW:
+ {
+ /* Draw arrow based on direction defined by custom-points. */
+ immUniformThemeColor(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, 5, 10, 5);
+ drawArrow(DOWN, 5, 10, 5);
+
+ GPU_matrix_pop();
+ break;
+ }
case HLP_ANGLE:
{
float dx = tmval[0] - cent[0], dy = tmval[1] - cent[1];
@@ -1999,6 +1966,9 @@ static void drawTransformView(const struct bContext *C, ARegion *UNUSED(ar), voi
/* edge slide, vert slide */
drawEdgeSlide(t);
drawVertSlide(t);
+
+ /* Rotation */
+ drawDial3d(t);
}
/* just draw a little warning message in the top-right corner of the viewport to warn that autokeying is enabled */
@@ -2050,7 +2020,7 @@ static void drawTransformPixel(const struct bContext *UNUSED(C), ARegion *ar, vo
/* draw autokeyframing hint in the corner
* - only draw if enabled (advanced users may be distracted/annoyed),
- * for objects that will be autokeyframed (no point ohterwise),
+ * for objects that will be autokeyframed (no point otherwise),
* AND only for the active region (as showing all is too overwhelming)
*/
if ((U.autokey_flag & AUTOKEY_FLAG_NOWARNING) == 0) {
@@ -2171,6 +2141,10 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
RNA_property_float_set_array(op->ptr, prop, t->axis);
}
+ if ((prop = RNA_struct_find_property(op->ptr, "axis_ortho"))) {
+ RNA_property_float_set_array(op->ptr, prop, t->axis_ortho);
+ }
+
if ((prop = RNA_struct_find_property(op->ptr, "mirror"))) {
RNA_property_boolean_set(op->ptr, prop, (t->flag & T_MIRROR) != 0);
}
@@ -2188,7 +2162,13 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
orientation = V3D_MANIP_CUSTOM + orientation_index_custom;
BLI_assert(orientation >= V3D_MANIP_CUSTOM);
}
- RNA_enum_set(op->ptr, "constraint_orientation", orientation);
+
+ RNA_float_set_array(op->ptr, "constraint_matrix", &t->spacemtx[0][0]);
+
+ /* Use 'constraint_matrix' instead. */
+ if (orientation != V3D_MANIP_CUSTOM_MATRIX) {
+ RNA_enum_set(op->ptr, "constraint_orientation", orientation);
+ }
if (t->con.mode & CON_APPLY) {
if (t->con.mode & CON_AXIS0) {
@@ -2211,19 +2191,26 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
{
const char *prop_id = NULL;
+ bool prop_state = true;
if (t->mode == TFM_SHRINKFATTEN) {
prop_id = "use_even_offset";
+ prop_state = false;
}
if (prop_id && (prop = RNA_struct_find_property(op->ptr, prop_id))) {
-
- RNA_property_boolean_set(op->ptr, prop, (t->flag & T_ALT_TRANSFORM) != 0);
+ RNA_property_boolean_set(op->ptr, prop, ((t->flag & T_ALT_TRANSFORM) != 0) == prop_state);
}
}
if ((prop = RNA_struct_find_property(op->ptr, "correct_uv"))) {
RNA_property_boolean_set(op->ptr, prop, (t->settings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT) != 0);
}
+
+ if (t->mode == TFM_SHEAR) {
+ prop = RNA_struct_find_property(op->ptr, "shear_axis");
+ t->custom.mode.data = POINTER_FROM_INT(RNA_property_enum_get(op->ptr, prop));
+ RNA_property_enum_set(op->ptr, prop, POINTER_AS_INT(t->custom.mode.data));
+ }
}
/**
@@ -2282,31 +2269,49 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
t->draw_handle_apply = ED_region_draw_cb_activate(t->ar->type, drawTransformApply, t, REGION_DRAW_PRE_VIEW);
t->draw_handle_view = ED_region_draw_cb_activate(t->ar->type, drawTransformView, t, REGION_DRAW_POST_VIEW);
t->draw_handle_pixel = ED_region_draw_cb_activate(t->ar->type, drawTransformPixel, t, REGION_DRAW_POST_PIXEL);
- t->draw_handle_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), helpline_poll, drawHelpline, t);
+ t->draw_handle_cursor = WM_paint_cursor_activate(
+ CTX_wm_manager(C),
+ SPACE_TYPE_ANY, RGN_TYPE_ANY,
+ helpline_poll, drawHelpline, t);
}
else if (t->spacetype == SPACE_IMAGE) {
t->draw_handle_view = ED_region_draw_cb_activate(t->ar->type, drawTransformView, t, REGION_DRAW_POST_VIEW);
//t->draw_handle_pixel = ED_region_draw_cb_activate(t->ar->type, drawTransformPixel, t, REGION_DRAW_POST_PIXEL);
- t->draw_handle_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), helpline_poll, drawHelpline, t);
+ t->draw_handle_cursor = WM_paint_cursor_activate(
+ CTX_wm_manager(C),
+ SPACE_TYPE_ANY, RGN_TYPE_ANY,
+ helpline_poll, drawHelpline, t);
}
else if (t->spacetype == SPACE_CLIP) {
t->draw_handle_view = ED_region_draw_cb_activate(t->ar->type, drawTransformView, t, REGION_DRAW_POST_VIEW);
- t->draw_handle_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), helpline_poll, drawHelpline, t);
+ t->draw_handle_cursor = WM_paint_cursor_activate(
+ CTX_wm_manager(C),
+ SPACE_TYPE_ANY, RGN_TYPE_ANY,
+ helpline_poll, drawHelpline, t);
}
else if (t->spacetype == SPACE_NODE) {
/*t->draw_handle_apply = ED_region_draw_cb_activate(t->ar->type, drawTransformApply, t, REGION_DRAW_PRE_VIEW);*/
t->draw_handle_view = ED_region_draw_cb_activate(t->ar->type, drawTransformView, t, REGION_DRAW_POST_VIEW);
- t->draw_handle_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), helpline_poll, drawHelpline, t);
+ t->draw_handle_cursor = WM_paint_cursor_activate(
+ CTX_wm_manager(C),
+ SPACE_TYPE_ANY, RGN_TYPE_ANY,
+ helpline_poll, drawHelpline, t);
}
else if (t->spacetype == SPACE_IPO) {
t->draw_handle_view = ED_region_draw_cb_activate(t->ar->type, drawTransformView, t, REGION_DRAW_POST_VIEW);
//t->draw_handle_pixel = ED_region_draw_cb_activate(t->ar->type, drawTransformPixel, t, REGION_DRAW_POST_PIXEL);
- t->draw_handle_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), helpline_poll, drawHelpline, t);
+ t->draw_handle_cursor = WM_paint_cursor_activate(
+ CTX_wm_manager(C),
+ SPACE_TYPE_ANY, RGN_TYPE_ANY,
+ helpline_poll, drawHelpline, t);
}
else if (t->spacetype == SPACE_ACTION) {
t->draw_handle_view = ED_region_draw_cb_activate(t->ar->type, drawTransformView, t, REGION_DRAW_POST_VIEW);
//t->draw_handle_pixel = ED_region_draw_cb_activate(t->ar->type, drawTransformPixel, t, REGION_DRAW_POST_PIXEL);
- t->draw_handle_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), helpline_poll, drawHelpline, t);
+ t->draw_handle_cursor = WM_paint_cursor_activate(
+ CTX_wm_manager(C),
+ SPACE_TYPE_ANY, RGN_TYPE_ANY,
+ helpline_poll, drawHelpline, t);
}
createTransData(C, t); // make TransData structs from selection
@@ -2390,6 +2395,11 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
copy_v3_v3(t->axis_orig, t->axis);
}
+ if ((prop = RNA_struct_find_property(op->ptr, "axis_ortho")) && RNA_property_is_set(op->ptr, prop)) {
+ RNA_property_float_get_array(op->ptr, prop, t->axis_ortho);
+ normalize_v3(t->axis_ortho);
+ }
+
/* Constraint init from operator */
if ((prop = RNA_struct_find_property(op->ptr, "constraint_axis")) && RNA_property_is_set(op->ptr, prop)) {
bool constraint_axis[3];
@@ -2441,6 +2451,8 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
initToSphere(t);
break;
case TFM_SHEAR:
+ prop = RNA_struct_find_property(op->ptr, "shear_axis");
+ t->custom.mode.data = POINTER_FROM_INT(RNA_property_enum_get(op->ptr, prop));
initShear(t);
break;
case TFM_BEND:
@@ -2573,7 +2585,7 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
bool do_skip = false;
/* Currently only used for two of three most frequent transform ops, can include more ops.
- * Note that scaling cannot be included here, non-uniform scaling will affect normals. */
+ * Note that scaling cannot be included here, non-uniform scaling will affect normals. */
if (ELEM(t->mode, TFM_TRANSLATION, TFM_ROTATION)) {
if (em->bm->totvertsel == em->bm->totvert) {
/* No need to invalidate if whole mesh is selected. */
@@ -2860,7 +2872,7 @@ static void constraintTransLim(TransInfo *t, TransData *td)
mul_m4_m3m4(cob.matrix, td->mtx, cob.matrix);
}
else if (con->ownspace != CONSTRAINT_SPACE_LOCAL) {
- /* skip... incompatable spacetype */
+ /* skip... incompatible spacetype */
continue;
}
@@ -2936,7 +2948,7 @@ static void constraintRotLim(TransInfo *UNUSED(t), TransData *td)
if ((data->flag2 & LIMIT_TRANSFORM) == 0)
continue;
- /* skip incompatable spacetypes */
+ /* skip incompatible spacetypes */
if (!ELEM(con->ownspace, CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_LOCAL))
continue;
@@ -3100,8 +3112,8 @@ static void initBend(TransInfo *t)
t->idx_max = 1;
t->num.idx_max = 1;
t->snap[0] = 0.0f;
- t->snap[1] = DEG2RAD(5.0);
- t->snap[2] = DEG2RAD(1.0);
+ t->snap[1] = SNAP_INCREMENTAL_ANGLE;
+ t->snap[2] = t->snap[1] * 0.2;
copy_v3_fl(t->num.val_inc, t->snap[1]);
t->num.unit_sys = t->scene->unit.system;
@@ -3305,13 +3317,42 @@ static void Bend(TransInfo *t, const int UNUSED(mval[2]))
/** \name Transform Shear
* \{ */
+static void initShear_mouseInputMode(TransInfo *t)
+{
+ float dir[3];
+
+ if (t->custom.mode.data == NULL) {
+ copy_v3_v3(dir, t->axis_ortho);
+ }
+ else {
+ cross_v3_v3v3(dir, t->axis_ortho, t->axis);
+ }
+
+ mul_mat3_m4_v3(t->viewmat, dir);
+ if (normalize_v2(dir) == 0.0f) {
+ dir[0] = 1.0f;
+ }
+ setCustomPointsFromDirection(t, &t->mouse, dir);
+
+ initMouseInputMode(t, &t->mouse, INPUT_CUSTOM_RATIO);
+}
+
static void initShear(TransInfo *t)
{
t->mode = TFM_SHEAR;
t->transform = applyShear;
t->handleEvent = handleEventShear;
- initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_RATIO);
+ if (is_zero_v3(t->axis)) {
+ negate_v3_v3(t->axis, t->viewinv[2]);
+ normalize_v3(t->axis);
+ }
+ if (is_zero_v3(t->axis_ortho)) {
+ copy_v3_v3(t->axis_ortho, t->viewinv[0]);
+ normalize_v3(t->axis_ortho);
+ }
+
+ initShear_mouseInputMode(t);
t->idx_max = 0;
t->num.idx_max = 0;
@@ -3333,25 +3374,24 @@ static eRedrawFlag handleEventShear(TransInfo *t, const wmEvent *event)
if (event->type == MIDDLEMOUSE && event->val == KM_PRESS) {
/* Use custom.mode.data pointer to signal Shear direction */
if (t->custom.mode.data == NULL) {
- initMouseInputMode(t, &t->mouse, INPUT_VERTICAL_RATIO);
t->custom.mode.data = (void *)1;
}
else {
- initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_RATIO);
t->custom.mode.data = NULL;
}
+ initShear_mouseInputMode(t);
status = TREDRAW_HARD;
}
else if (event->type == XKEY && event->val == KM_PRESS) {
- initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_RATIO);
t->custom.mode.data = NULL;
+ initShear_mouseInputMode(t);
status = TREDRAW_HARD;
}
else if (event->type == YKEY && event->val == KM_PRESS) {
- initMouseInputMode(t, &t->mouse, INPUT_VERTICAL_RATIO);
t->custom.mode.data = (void *)1;
+ initShear_mouseInputMode(t);
status = TREDRAW_HARD;
}
@@ -3363,15 +3403,12 @@ static eRedrawFlag handleEventShear(TransInfo *t, const wmEvent *event)
static void applyShear(TransInfo *t, const int UNUSED(mval[2]))
{
float vec[3];
- float smat[3][3], tmat[3][3], totmat[3][3], persmat[3][3], persinv[3][3];
+ float smat[3][3], tmat[3][3], totmat[3][3], axismat[3][3], axismat_inv[3][3];
float value;
int i;
char str[UI_MAX_DRAW_STR];
const bool is_local_center = transdata_check_local_center(t, t->around);
- copy_m3_m4(persmat, t->viewmat);
- invert_m3_m3(persinv, persmat);
-
value = t->values[0];
snapGridIncrement(t, &value);
@@ -3401,8 +3438,12 @@ static void applyShear(TransInfo *t, const int UNUSED(mval[2]))
else
smat[0][1] = value;
- mul_m3_m3m3(tmat, smat, persmat);
- mul_m3_m3m3(totmat, persinv, tmat);
+ copy_v3_v3(axismat_inv[0], t->axis_ortho);
+ copy_v3_v3(axismat_inv[2], t->axis);
+ cross_v3_v3v3(axismat_inv[1], axismat_inv[0], axismat_inv[2]);
+ invert_m3_m3(axismat, axismat_inv);
+
+ mul_m3_series(totmat, axismat_inv, smat, axismat);
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
TransData *td = tc->data;
@@ -3416,9 +3457,7 @@ static void applyShear(TransInfo *t, const int UNUSED(mval[2]))
continue;
if (t->flag & T_EDIT) {
- float mat3[3][3];
- mul_m3_m3m3(mat3, totmat, td->mtx);
- mul_m3_m3m3(tmat, td->smtx, mat3);
+ mul_m3_series(tmat, td->smtx, totmat, td->mtx);
}
else {
copy_m3_m3(tmat, totmat);
@@ -3588,7 +3627,8 @@ static void ElementResize(TransInfo *t, TransDataContainer *tc, TransData *td, f
copy_v3_v3(center, tc->center_local);
}
- if (td->ext) {
+ /* Size checked needed since the 3D cursor only uses rotation fields. */
+ if (td->ext && td->ext->size) {
float fsize[3];
if (t->flag & (T_OBJECT | T_TEXTURE | T_POSE)) {
@@ -4580,7 +4620,7 @@ static void initSnapSpatial(TransInfo *t, float r_snap[3])
if (rv3d) {
View3D *v3d = t->sa->spacedata.first;
r_snap[0] = 0.0f;
- r_snap[1] = ED_view3d_grid_scale(t->scene, v3d, NULL) * 1.0f;
+ r_snap[1] = ED_view3d_grid_view_scale(t->scene, v3d, rv3d, NULL) * 1.0f;
r_snap[2] = r_snap[1] * 0.1f;
}
}
@@ -4670,12 +4710,12 @@ static void headerTranslation(TransInfo *t, const float vec[3], char str[UI_MAX_
dist = len_v3(vec);
if (!(t->flag & T_2D_EDIT) && t->scene->unit.system) {
- const bool do_split = (t->scene->unit.flag & USER_UNIT_OPT_SPLIT) != 0;
int i;
for (i = 0; i < 3; i++) {
- bUnit_AsString(&tvec[NUM_STR_REP_LEN * i], NUM_STR_REP_LEN, dvec[i] * t->scene->unit.scale_length,
- 4, t->scene->unit.system, B_UNIT_LENGTH, do_split, true);
+ bUnit_AsString2(
+ &tvec[NUM_STR_REP_LEN * i], NUM_STR_REP_LEN, dvec[i] * t->scene->unit.scale_length,
+ 4, B_UNIT_LENGTH, &t->scene->unit, true);
}
}
else {
@@ -4686,9 +4726,9 @@ static void headerTranslation(TransInfo *t, const float vec[3], char str[UI_MAX_
}
if (!(t->flag & T_2D_EDIT) && t->scene->unit.system) {
- const bool do_split = (t->scene->unit.flag & USER_UNIT_OPT_SPLIT) != 0;
- bUnit_AsString(distvec, sizeof(distvec), dist * t->scene->unit.scale_length, 4, t->scene->unit.system,
- B_UNIT_LENGTH, do_split, false);
+ bUnit_AsString2(
+ distvec, sizeof(distvec), dist * t->scene->unit.scale_length,
+ 4, B_UNIT_LENGTH, &t->scene->unit, false);
}
else if (dist > 1e10f || dist < -1e10f) {
/* prevent string buffer overflow */
@@ -4985,7 +5025,7 @@ static void applyShrinkFatten(TransInfo *t, const int UNUSED(mval[2]))
}
}
BLI_snprintf(str + ofs, sizeof(str) - ofs, IFACE_(" or Alt) Even Thickness %s"),
- WM_bool_as_string((t->flag & T_ALT_TRANSFORM) != 0));
+ WM_bool_as_string((t->flag & T_ALT_TRANSFORM) == 0));
/* done with header string */
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
@@ -5000,7 +5040,7 @@ static void applyShrinkFatten(TransInfo *t, const int UNUSED(mval[2]))
/* get the final offset */
tdistance = distance * td->factor;
- if (td->ext && (t->flag & T_ALT_TRANSFORM)) {
+ if (td->ext && (t->flag & T_ALT_TRANSFORM) == 0) {
tdistance *= td->ext->isize[0]; /* shell factor */
}
@@ -5355,8 +5395,6 @@ static void applyGPShrinkFatten(TransInfo *t, const int UNUSED(mval[2]))
}
}
- recalcData(t);
-
ED_area_status_text(t->sa, str);
}
/** \} */
@@ -6188,7 +6226,7 @@ static void calcEdgeSlideCustomPoints(struct TransInfo *t)
setCustomPoints(t, &t->mouse, sld->mval_end, sld->mval_start);
/* setCustomPoints isn't normally changing as the mouse moves,
- * in this case apply mouse input immediatly so we don't refresh
+ * in this case apply mouse input immediately so we don't refresh
* with the value from the previous points */
applyMouseInput(t, &t->mouse, t->mval, t->values);
}
@@ -7581,7 +7619,7 @@ static void calcVertSlideCustomPoints(struct TransInfo *t)
}
/* setCustomPoints isn't normally changing as the mouse moves,
- * in this case apply mouse input immediatly so we don't refresh
+ * in this case apply mouse input immediately so we don't refresh
* with the value from the previous points */
applyMouseInput(t, &t->mouse, t->mval, t->values);
}
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index dfcd3e4cfd6..d777b034e76 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -126,7 +126,7 @@ typedef struct TransCon {
float imtx[3][3]; /* Inverse Matrix of the Constraint space */
float pmtx[3][3]; /* Projection Constraint Matrix (same as imtx with some axis == 0) */
int imval[2]; /* initial mouse value for visual calculation */
- /* the one in TransInfo is not garanty to stay the same (Rotates change it) */
+ /* the one in TransInfo is not guarantee to stay the same (Rotates change it) */
int mode; /* Mode flags of the Constraint */
void (*drawExtra)(struct TransInfo *t);
@@ -163,7 +163,7 @@ typedef struct TransDataExtension {
float r_mtx[3][3]; /* The rotscale matrix of pose bone, to allow using snap-align in translation mode,
* when td->mtx is the loc pose bone matrix (and hence can't be used to apply rotation in some cases,
* namely when a bone is in "NoLocal" or "Hinge" mode)... */
- float r_smtx[3][3]; /* Invers of previous one. */
+ float r_smtx[3][3]; /* Inverse of previous one. */
int rotOrder; /* rotation mode, as defined in eRotationModes (DNA_action_types.h) */
float oloc[3], orot[3], oquat[4], orotAxis[3], orotAngle; /* Original object transformation used for rigid bodies */
} TransDataExtension;
@@ -176,7 +176,7 @@ typedef struct TransData2D {
float ih1[2], ih2[2];
} TransData2D;
-/* we need to store 2 handles for each transdata in case the other handle wasnt selected */
+/* we need to store 2 handles for each transdata in case the other handle wasn't selected */
typedef struct TransDataCurveHandleFlags {
char ih1, ih2;
char *h1, *h2;
@@ -516,6 +516,7 @@ typedef struct TransInfo {
float auto_values[4];
float axis[3];
float axis_orig[3]; /* TransCon can change 'axis', store the original value here */
+ float axis_ortho[3];
bool remove_on_cancel; /* remove elements if operator is canceled */
@@ -593,7 +594,7 @@ typedef struct TransInfo {
#define T_AUTOVALUES (1 << 20)
- /* to specificy if we save back settings at the end */
+ /* to specify if we save back settings at the end */
#define T_MODAL (1 << 21)
/* no retopo */
@@ -632,7 +633,8 @@ typedef struct TransInfo {
#define HLP_ANGLE 2
#define HLP_HARROW 3
#define HLP_VARROW 4
-#define HLP_TRACKBALL 5
+#define HLP_CARROW 5
+#define HLP_TRACKBALL 6
/* transinfo->con->mode */
#define CON_APPLY 1
@@ -718,6 +720,7 @@ void restoreBones(TransDataContainer *tc);
/* return 0 when no gimbal for selection */
bool gimbal_axis(struct Object *ob, float gmat[3][3]);
+void drawDial3d(const TransInfo *t);
/*********************** TransData Creation and General Handling *********** */
void createTransData(struct bContext *C, TransInfo *t);
@@ -730,12 +733,16 @@ bool transdata_check_local_islands(TransInfo *t, short around);
int count_set_pose_transflags(struct Object *ob, const int mode, const short around, bool has_translate_rotate[2]);
-/* auto-keying stuff used by special_aftertrans_update */
-void autokeyframe_ob_cb_func(
+/* Auto-keyframe applied after transform, returns true if motion paths need to be updated. */
+void autokeyframe_object(
struct bContext *C, struct Scene *scene, struct ViewLayer *view_layer, struct Object *ob, int tmode);
-void autokeyframe_pose_cb_func(
+void autokeyframe_pose(
struct bContext *C, struct Scene *scene, struct Object *ob, int tmode, short targetless_ik);
+/* Test if we need to update motion paths for a given object. */
+bool motionpath_need_update_object(struct Scene *scene, struct Object *ob);
+bool motionpath_need_update_pose(struct Scene *scene, struct Object *ob);
+
/*********************** Constraints *****************************/
void drawConstraint(TransInfo *t);
@@ -818,11 +825,12 @@ eRedrawFlag handleMouseInput(struct TransInfo *t, struct MouseInput *mi, const s
void applyMouseInput(struct TransInfo *t, struct MouseInput *mi, const int mval[2], float output[3]);
void setCustomPoints(TransInfo *t, MouseInput *mi, const int start[2], const int end[2]);
+void setCustomPointsFromDirection(TransInfo *t, MouseInput *mi, const float dir[2]);
void setInputPostFct(MouseInput *mi, void (*post)(struct TransInfo *t, float values[3]));
/*********************** Generics ********************************/
-void initTransDataContainers_FromObjectData(TransInfo *t);
+void initTransDataContainers_FromObjectData(TransInfo *t, struct Object *obact, struct Object **objects, uint objects_len);
void initTransInfo(struct bContext *C, TransInfo *t, struct wmOperator *op, const struct wmEvent *event);
void freeTransCustomDataForMode(TransInfo *t);
void postTrans(struct bContext *C, TransInfo *t);
@@ -875,6 +883,8 @@ bool applyTransformOrientation(const struct TransformOrientation *ts, float r_ma
#define ORIENTATION_VERT 2
#define ORIENTATION_EDGE 3
#define ORIENTATION_FACE 4
+#define ORIENTATION_USE_PLANE(ty) \
+ ELEM(ty, ORIENTATION_NORMAL, ORIENTATION_EDGE, ORIENTATION_FACE)
int getTransformOrientation_ex(const struct bContext *C, float normal[3], float plane[3], const short around);
int getTransformOrientation(const struct bContext *C, float normal[3], float plane[3]);
@@ -898,8 +908,6 @@ bool checkUseAxisMatrix(TransInfo *t);
/* Temp macros. */
-/* This is to be replaced, just to get things compiling early on. */
-#define TRANS_DATA_CONTAINER_FIRST_EVIL(t) (&(t)->data_container[0])
#define TRANS_DATA_CONTAINER_FIRST_OK(t) (&(t)->data_container[0])
/* For cases we _know_ there is only one handle. */
#define TRANS_DATA_CONTAINER_FIRST_SINGLE(t) (BLI_assert((t)->data_container_len == 1), (&(t)->data_container[0]))
diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c
index b24ef4e0ba2..22d616572c1 100644
--- a/source/blender/editors/transform/transform_constraints.c
+++ b/source/blender/editors/transform/transform_constraints.c
@@ -701,6 +701,10 @@ void setUserConstraint(TransInfo *t, short orientation, int mode, const char fte
BLI_snprintf(text, sizeof(text), ftext, IFACE_("gimbal"));
setConstraint(t, t->spacemtx, mode, text);
break;
+ case V3D_MANIP_CUSTOM_MATRIX:
+ BLI_snprintf(text, sizeof(text), ftext, IFACE_("custom matrix"));
+ setConstraint(t, t->spacemtx, mode, text);
+ break;
case V3D_MANIP_CUSTOM:
{
char orientation_str[128];
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 6923c62249a..b9b4aff2a0c 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -346,7 +346,40 @@ static void createTransTexspace(TransInfo *t)
copy_v3_v3(td->ext->isize, td->ext->size);
}
-static void createTransCursor3D(TransInfo *t)
+/* -------------------------------------------------------------------- */
+/** \name Cursor Transform Creation
+ *
+ * Instead of transforming the selection, move the 2D/3D cursor.
+ *
+ * \{ */
+
+static void createTransCursor_image(TransInfo *t)
+{
+ TransData *td;
+ SpaceImage *sima = t->sa->spacedata.first;
+ float *cursor_location = sima->cursor;
+
+ {
+ 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, cursor_location);
+ td->ob = NULL;
+
+ unit_m3(td->mtx);
+ unit_m3(td->axismtx);
+ pseudoinverse_m3_m3(td->smtx, td->mtx, PSEUDOINVERSE_EPSILON);
+
+ td->loc = cursor_location;
+ copy_v3_v3(td->iloc, cursor_location);
+}
+
+static void createTransCursor_view3d(TransInfo *t)
{
TransData *td;
@@ -383,6 +416,8 @@ static void createTransCursor3D(TransInfo *t)
copy_qt_qt(td->ext->iquat, cursor->rotation);
}
+/** \} */
+
/* ********************* edge (for crease) ***** */
static void createTransEdge(TransInfo *t)
@@ -803,7 +838,7 @@ int count_set_pose_transflags(Object *ob, const int mode, const short around, bo
}
}
else {
- has_translate_rotate[1] = true;
+ has_translate_rotate[0] = true;
}
}
}
@@ -1098,19 +1133,8 @@ static short pose_grab_with_ik(Main *bmain, Object *ob)
/**
* When objects array is NULL, use 't->data_container' as is.
*/
-static void createTransPose(TransInfo *t, Object **objects, uint objects_len)
+static void createTransPose(TransInfo *t)
{
- if (objects != NULL) {
- if (t->data_container) {
- MEM_freeN(t->data_container);
- }
- t->data_container = MEM_callocN(sizeof(*t->data_container) * objects_len, __func__);
- t->data_container_len = objects_len;
- int th_index;
- FOREACH_TRANS_DATA_CONTAINER_INDEX (t, tc, th_index) {
- tc->poseobj = objects[th_index];
- }
- }
Main *bmain = CTX_data_main(t->context);
t->data_len_all = 0;
@@ -1672,7 +1696,8 @@ static void createTransCurveVerts(TransInfo *t)
int a;
int count = 0, countsel = 0;
const bool is_prop_edit = (t->flag & T_PROP_EDIT) != 0;
- short hide_handles = (cu->drawflag & CU_HIDE_HANDLES);
+ View3D *v3d = t->view;
+ short hide_handles = (v3d != NULL) ? ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) : false;
ListBase *nurbs;
/* to be sure */
@@ -2388,7 +2413,7 @@ static struct TransIslandData *editmesh_islands_info_calc(
vert_map = MEM_mallocN(sizeof(*vert_map) * bm->totvert, __func__);
/* we shouldn't need this, but with incorrect selection flushing
- * its possible we have a selected vertex thats not in a face, for now best not crash in that case. */
+ * its possible we have a selected vertex that's not in a face, for now best not crash in that case. */
copy_vn_i(vert_map, bm->totvert, -1);
BM_mesh_elem_table_ensure(bm, htype);
@@ -3001,7 +3026,7 @@ void flushTransSeq(TransInfo *t)
if (seq != seq_prev) {
if (seq->depth == 0) {
- /* test overlap, displayes red outline */
+ /* test overlap, displays red outline */
seq->flag &= ~SEQ_OVERLAP;
if (BKE_sequence_test_overlap(seqbasep, seq)) {
seq->flag |= SEQ_OVERLAP;
@@ -3198,11 +3223,7 @@ static void createTransUVs(bContext *C, TransInfo *t)
}
if (sima->flag & SI_LIVE_UNWRAP) {
- /* TODO(campbell): xform: Only active object currently!
- * it uses a static variable. */
- if (tc->is_active) {
- ED_uvedit_live_unwrap_begin(t->scene, tc->obedit);
- }
+ ED_uvedit_live_unwrap_begin(t->scene, tc->obedit);
}
finally:
@@ -4196,7 +4217,7 @@ static void createTransActionData(bContext *C, TransInfo *t)
else {
bGPDframe *gpf_iter;
int min = INT_MAX;
- for (gpf_iter = gpl->frames.first; gpf_iter; gpf_iter = gpf->next) {
+ for (gpf_iter = gpl->frames.first; gpf_iter; gpf_iter = gpf_iter->next) {
if (gpf_iter->flag & GP_FRAME_SELECT) {
if (FrameOnMouseSide(t->frame_side, (float)gpf_iter->framenum, cfra)) {
int val = abs(gpf->framenum - gpf_iter->framenum);
@@ -5579,6 +5600,7 @@ static bool constraints_list_needinv(TransInfo *t, ListBase *list)
if (ELEM(con->type,
CONSTRAINT_TYPE_FOLLOWPATH,
CONSTRAINT_TYPE_CLAMPTO,
+ CONSTRAINT_TYPE_ARMATURE,
CONSTRAINT_TYPE_OBJECTSOLVER,
CONSTRAINT_TYPE_FOLLOWTRACK))
{
@@ -5918,10 +5940,10 @@ static void clear_trans_object_base_flags(TransInfo *t)
}
/* auto-keyframing feature - for objects
- * tmode: should be a transform mode
+ * tmode: should be a transform mode
*/
// NOTE: context may not always be available, so must check before using it as it's a luxury for a few cases
-void autokeyframe_ob_cb_func(bContext *C, Scene *scene, ViewLayer *view_layer, Object *ob, int tmode)
+void autokeyframe_object(bContext *C, Scene *scene, ViewLayer *view_layer, Object *ob, int tmode)
{
Main *bmain = CTX_data_main(C);
ID *id = &ob->id;
@@ -6017,33 +6039,33 @@ void autokeyframe_ob_cb_func(bContext *C, Scene *scene, ViewLayer *view_layer, O
ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cfra);
}
- /* only calculate paths if there are paths to be recalculated,
- * assuming that since we've autokeyed the transforms this is
- * now safe to apply...
- *
- * NOTE: only do this when there's context info
- */
- if (C && (ob->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS)) {
- //ED_objects_clear_paths(C); // XXX for now, don't need to clear
- ED_objects_recalculate_paths(C, scene);
-
- /* XXX: there's potential here for problems with unkeyed rotations/scale,
- * but for now (until proper data-locality for baking operations),
- * this should be a better fix for T24451 and T37755
- */
- }
-
/* free temp info */
BLI_freelistN(&dsources);
}
}
+/* Return if we need to update motion paths, only if they already exist,
+ * and we will insert a keyframe at the end of transform. */
+bool motionpath_need_update_object(Scene *scene, Object *ob)
+{
+ /* XXX: there's potential here for problems with unkeyed rotations/scale,
+ * but for now (until proper data-locality for baking operations),
+ * this should be a better fix for T24451 and T37755
+ */
+
+ if (autokeyframe_cfra_can_key(scene, &ob->id)) {
+ return (ob->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS) != 0;
+ }
+
+ return false;
+}
+
/* auto-keyframing feature - for poses/pose-channels
- * tmode: should be a transform mode
- * targetless_ik: has targetless ik been done on any channels?
+ * tmode: should be a transform mode
+ * targetless_ik: has targetless ik been done on any channels?
*/
// NOTE: context may not always be available, so must check before using it as it's a luxury for a few cases
-void autokeyframe_pose_cb_func(bContext *C, Scene *scene, Object *ob, int tmode, short targetless_ik)
+void autokeyframe_pose(bContext *C, Scene *scene, Object *ob, int tmode, short targetless_ik)
{
Main *bmain = CTX_data_main(C);
ID *id = &ob->id;
@@ -6163,16 +6185,6 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, Object *ob, int tmode,
BLI_freelistN(&dsources);
}
}
-
- /* do the bone paths
- * - only do this when there is context info, since we need that to resolve
- * how to do the updates and so on...
- * - do not calculate unless there are paths already to update...
- */
- if (C && (ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS)) {
- //ED_pose_clear_paths(C, ob); // XXX for now, don't need to clear
- ED_pose_recalculate_paths(C, scene, ob);
- }
}
else {
/* tag channels that should have unkeyed data */
@@ -6185,6 +6197,17 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, Object *ob, int tmode,
}
}
+/* Return if we need to update motion paths, only if they already exist,
+ * and we will insert a keyframe at the end of transform. */
+bool motionpath_need_update_pose(Scene *scene, Object *ob)
+{
+ if (autokeyframe_cfra_can_key(scene, &ob->id)) {
+ return (ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS) != 0;
+ }
+
+ return false;
+}
+
static void special_aftertrans_update__movieclip(bContext *C, TransInfo *t)
{
SpaceClip *sc = t->sa->spacedata.first;
@@ -6672,7 +6695,16 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
}
}
}
+ else if (t->flag & T_POSE && (t->mode == TFM_BONESIZE)) {
+ /* Handle the exception where for TFM_BONESIZE in edit mode we pretend to be
+ * in pose mode (to use bone orientation matrix), in that case we don't do operations like autokeyframing. */
+ FOREACH_TRANS_DATA_CONTAINER (t, tc) {
+ ob = tc->poseobj;
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ }
+ }
else if (t->flag & T_POSE) {
+ GSet *motionpath_updates = BLI_gset_ptr_new("motionpath updates");
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
@@ -6712,7 +6744,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
/* automatic inserting of keys and unkeyed tagging - only if transform wasn't canceled (or TFM_DUMMY) */
if (!canceled && (t->mode != TFM_DUMMY)) {
- autokeyframe_pose_cb_func(C, t->scene, ob, t->mode, targetless_ik);
+ autokeyframe_pose(C, t->scene, ob, t->mode, targetless_ik);
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else if (arm->flag & ARM_DELAYDEFORM) {
@@ -6726,7 +6758,20 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
else {
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
+
+ if (t->mode != TFM_DUMMY && motionpath_need_update_pose(t->scene, ob)) {
+ BLI_gset_insert(motionpath_updates, ob);
+ }
+ }
+
+ /* Update motion paths once for all transformed bones in an object. */
+ GSetIterator gs_iter;
+ GSET_ITER (gs_iter, motionpath_updates) {
+ bool current_frame_only = canceled;
+ ob = BLI_gsetIterator_getKey(&gs_iter);
+ ED_pose_recalculate_paths(C, t->scene, ob, current_frame_only);
}
+ BLI_gset_free(motionpath_updates, NULL);
}
else if (t->options & CTX_PAINT_CURVE) {
/* pass */
@@ -6742,13 +6787,12 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
/* do nothing */
}
else { /* Objects */
- int i;
-
BLI_assert(t->flag & (T_OBJECT | T_TEXTURE));
TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t);
+ bool motionpath_update = false;
- for (i = 0; i < tc->data_len; i++) {
+ for (int i = 0; i < tc->data_len; i++) {
TransData *td = tc->data + i;
ListBase pidlist;
PTCacheID *pid;
@@ -6780,9 +6824,11 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
/* Set autokey if necessary */
if (!canceled) {
- autokeyframe_ob_cb_func(C, t->scene, t->view_layer, ob, t->mode);
+ autokeyframe_object(C, t->scene, t->view_layer, ob, t->mode);
}
+ motionpath_update |= motionpath_need_update_object(t->scene, ob);
+
/* restore rigid body transform */
if (ob->rigidbody_object && canceled) {
float ctime = BKE_scene_frame_get(t->scene);
@@ -6801,6 +6847,12 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
#endif
}
}
+
+ if (motionpath_update) {
+ /* Update motion paths once for all transformed objects. */
+ bool current_frame_only = canceled;
+ ED_objects_recalculate_paths(C, t->scene, current_frame_only);
+ }
}
clear_trans_object_base_flags(t);
@@ -8425,7 +8477,12 @@ void createTransData(bContext *C, TransInfo *t)
t->flag |= T_CURSOR;
t->obedit_type = -1;
- createTransCursor3D(t);
+ if (t->spacetype == SPACE_IMAGE) {
+ createTransCursor_image(t);
+ }
+ else {
+ createTransCursor_view3d(t);
+ }
countAndCleanTransDataContainer(t);
}
else if (t->options & CTX_TEXTURE) {
@@ -8437,7 +8494,7 @@ void createTransData(bContext *C, TransInfo *t)
}
else if (t->options & CTX_EDGE) {
/* Multi object editing. */
- initTransDataContainers_FromObjectData(t);
+ initTransDataContainers_FromObjectData(t, ob, NULL, 0);
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
tc->data_ext = NULL;
}
@@ -8487,7 +8544,7 @@ void createTransData(bContext *C, TransInfo *t)
}
else if (t->obedit_type == OB_MESH) {
- initTransDataContainers_FromObjectData(t);
+ initTransDataContainers_FromObjectData(t, ob, NULL, 0);
createTransUVs(C, t);
countAndCleanTransDataContainer(t);
@@ -8576,7 +8633,7 @@ void createTransData(bContext *C, TransInfo *t)
}
else if (t->obedit_type != -1) {
/* Multi object editing. */
- initTransDataContainers_FromObjectData(t);
+ initTransDataContainers_FromObjectData(t, ob, NULL, 0);
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
tc->data_ext = NULL;
@@ -8640,8 +8697,8 @@ void createTransData(bContext *C, TransInfo *t)
// XXX active-layer checking isn't done as that should probably be checked through context instead
/* Multi object editing. */
- initTransDataContainers_FromObjectData(t);
- createTransPose(t, NULL, 0);
+ initTransDataContainers_FromObjectData(t, ob, NULL, 0);
+ createTransPose(t);
countAndCleanTransDataContainer(t);
}
else if (ob && (ob->mode & OB_MODE_WEIGHT_PAINT) && !(t->options & CTX_PAINT_CURVE)) {
@@ -8655,7 +8712,8 @@ void createTransData(bContext *C, TransInfo *t)
Object *objects[1];
objects[0] = ob_armature;
uint objects_len = 1;
- createTransPose(t, objects, objects_len);
+ initTransDataContainers_FromObjectData(t, ob_armature, objects, objects_len);
+ createTransPose(t);
countAndCleanTransDataContainer(t);
}
}
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index a2377166dff..5cc98e52da2 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -69,25 +69,24 @@
#include "BIK_api.h"
-#include "BKE_animsys.h"
#include "BKE_action.h"
+#include "BKE_animsys.h"
#include "BKE_armature.h"
+#include "BKE_context.h"
#include "BKE_curve.h"
+#include "BKE_editmesh.h"
#include "BKE_fcurve.h"
#include "BKE_gpencil.h"
#include "BKE_lattice.h"
+#include "BKE_layer.h"
#include "BKE_library.h"
-#include "BKE_main.h"
+#include "BKE_mask.h"
#include "BKE_nla.h"
-#include "BKE_context.h"
#include "BKE_paint.h"
+#include "BKE_scene.h"
#include "BKE_sequencer.h"
-#include "BKE_editmesh.h"
#include "BKE_tracking.h"
-#include "BKE_mask.h"
#include "BKE_workspace.h"
-#include "BKE_layer.h"
-#include "BKE_scene.h"
#include "DEG_depsgraph.h"
@@ -318,7 +317,7 @@ static void animrecord_check_state(Scene *scene, ID *id, wmTimer *animtimer)
* NOTE: An alternative way would have been to instead hack the influence
* to not get always get reset to full strength if NLASTRIP_FLAG_USR_INFLUENCE
* is disabled but auto-blending isn't being used. However, that approach
- * is a bit hacky/hard to discover, and may cause backwards compatability issues,
+ * is a bit hacky/hard to discover, and may cause backwards compatibility issues,
* so it's better to just do it this way.
*/
strip->flag |= NLASTRIP_FLAG_USR_INFLUENCE;
@@ -492,7 +491,7 @@ static void recalcData_nla(TransInfo *t)
* BUT only if realtime updates are enabled
*/
if ((snla->flag & SNLA_NOREALTIMEUPDATES) == 0)
- ANIM_id_update(t->scene, tdn->id);
+ ANIM_id_update(CTX_data_main(t->context), tdn->id);
/* if canceling transform, just write the values without validating, then move on */
if (t->state == TRANS_CANCEL) {
@@ -937,6 +936,8 @@ static void recalcData_objects(TransInfo *t)
}
else if (t->flag & T_POSE) {
+ GSet *motionpath_updates = BLI_gset_ptr_new("motionpath updates");
+
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
Object *ob = tc->poseobj;
bArmature *arm = ob->data;
@@ -952,7 +953,11 @@ static void recalcData_objects(TransInfo *t)
int targetless_ik = (t->flag & T_AUTOIK); // XXX this currently doesn't work, since flags aren't set yet!
animrecord_check_state(t->scene, &ob->id, t->animtimer);
- autokeyframe_pose_cb_func(t->context, t->scene, ob, t->mode, targetless_ik);
+ autokeyframe_pose(t->context, t->scene, ob, t->mode, targetless_ik);
+ }
+
+ if (motionpath_need_update_pose(t->scene, ob)) {
+ BLI_gset_insert(motionpath_updates, ob);
}
/* old optimize trick... this enforces to bypass the depgraph */
@@ -965,6 +970,14 @@ static void recalcData_objects(TransInfo *t)
BKE_pose_where_is(t->depsgraph, t->scene, ob);
}
}
+
+ /* Update motion paths once for all transformed bones in an object. */
+ GSetIterator gs_iter;
+ GSET_ITER (gs_iter, motionpath_updates) {
+ Object *ob = BLI_gsetIterator_getKey(&gs_iter);
+ ED_pose_recalculate_paths(t->context, t->scene, ob, true);
+ }
+ BLI_gset_free(motionpath_updates, NULL);
}
else if (base && (base->object->mode & OB_MODE_PARTICLE_EDIT) &&
PE_get_current(t->scene, base->object))
@@ -975,7 +988,7 @@ static void recalcData_objects(TransInfo *t)
flushTransParticles(t);
}
else {
- int i;
+ bool motionpath_update = false;
if (t->state != TRANS_CANCEL) {
applyProject(t);
@@ -984,7 +997,7 @@ static void recalcData_objects(TransInfo *t)
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
TransData *td = tc->data;
- for (i = 0; i < tc->data_len; i++, td++) {
+ for (int i = 0; i < tc->data_len; i++, td++) {
Object *ob = td->ob;
if (td->flag & TD_NOACTION)
@@ -1000,9 +1013,11 @@ static void recalcData_objects(TransInfo *t)
// TODO: autokeyframe calls need some setting to specify to add samples (FPoints) instead of keyframes?
if ((t->animtimer) && IS_AUTOKEY_ON(t->scene)) {
animrecord_check_state(t->scene, &ob->id, t->animtimer);
- autokeyframe_ob_cb_func(t->context, t->scene, t->view_layer, ob, t->mode);
+ autokeyframe_object(t->context, t->scene, t->view_layer, ob, t->mode);
}
+ motionpath_update |= motionpath_need_update_object(t->scene, ob);
+
/* sets recalc flags fully, instead of flushing existing ones
* otherwise proxies don't function correctly
*/
@@ -1012,6 +1027,11 @@ static void recalcData_objects(TransInfo *t)
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
}
+
+ if (motionpath_update) {
+ /* Update motion paths once for all transformed objects. */
+ ED_objects_recalculate_paths(t->context, t->scene, true);
+ }
}
}
@@ -1178,10 +1198,10 @@ static int initTransInfo_edit_pet_to_flag(const int proportional)
}
}
-void initTransDataContainers_FromObjectData(TransInfo *t)
+void initTransDataContainers_FromObjectData(TransInfo *t, Object *obact, Object **objects, uint objects_len)
{
- const eObjectMode object_mode = OBACT(t->view_layer) ? OBACT(t->view_layer)->mode : OB_MODE_OBJECT;
- const short object_type = OBACT(t->view_layer) ? OBACT(t->view_layer)->type : -1;
+ const eObjectMode object_mode = obact ? obact->mode : OB_MODE_OBJECT;
+ const short object_type = obact ? obact->type : -1;
if ((object_mode & OB_MODE_EDIT) ||
((object_mode & OB_MODE_POSE) && (object_type == OB_ARMATURE)))
@@ -1189,11 +1209,16 @@ void initTransDataContainers_FromObjectData(TransInfo *t)
if (t->data_container) {
MEM_freeN(t->data_container);
}
- uint objects_len;
- Object **objects = BKE_view_layer_array_from_objects_in_mode(
- t->view_layer, &objects_len, {
- .object_mode = object_mode,
- .no_dup_data = true});
+
+ bool free_objects = false;
+ if (objects == NULL) {
+ objects = BKE_view_layer_array_from_objects_in_mode(
+ t->view_layer, &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;
@@ -1221,7 +1246,10 @@ void initTransDataContainers_FromObjectData(TransInfo *t)
}
/* Otherwise leave as zero. */
}
- MEM_freeN(objects);
+
+ if (free_objects) {
+ MEM_freeN(objects);
+ }
}
}
@@ -1314,7 +1342,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
}
/* GPencil editing context */
- if (GPENCIL_ANY_MODE(gpd)) {
+ if (GPENCIL_EDIT_MODE(gpd)) {
t->options |= CTX_GPENCIL_STROKES;
}
@@ -1457,9 +1485,16 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
t->around = V3D_AROUND_CENTER_BOUNDS;
}
- if (op && ((prop = RNA_struct_find_property(op->ptr, "constraint_orientation")) &&
+ if (op && ((prop = RNA_struct_find_property(op->ptr, "constraint_matrix")) &&
RNA_property_is_set(op->ptr, prop)))
{
+ RNA_property_float_get_array(op->ptr, prop, &t->spacemtx[0][0]);
+ t->current_orientation = V3D_MANIP_CUSTOM_MATRIX;
+ t->custom_orientation = 0;
+ }
+ else if (op && ((prop = RNA_struct_find_property(op->ptr, "constraint_orientation")) &&
+ RNA_property_is_set(op->ptr, prop)))
+ {
short orientation = RNA_property_enum_get(op->ptr, prop);
TransformOrientation *custom_orientation = NULL;
@@ -1834,11 +1869,12 @@ void calculateCenterCursor(TransInfo *t, float r_center[3])
td = tc->data;
Object *ob = td->ob;
-
- sub_v3_v3v3(r_center, r_center, ob->obmat[3]);
- copy_m3_m4(mat, ob->obmat);
- invert_m3_m3(imat, mat);
- mul_m3_v3(imat, r_center);
+ if (ob) {
+ sub_v3_v3v3(r_center, r_center, ob->obmat[3]);
+ copy_m3_m4(mat, ob->obmat);
+ invert_m3_m3(imat, mat);
+ mul_m3_v3(imat, r_center);
+ }
}
}
}
diff --git a/source/blender/editors/transform/transform_gizmo_2d.c b/source/blender/editors/transform/transform_gizmo_2d.c
index ff69c2859fc..48c18ef2d8a 100644
--- a/source/blender/editors/transform/transform_gizmo_2d.c
+++ b/source/blender/editors/transform/transform_gizmo_2d.c
@@ -39,6 +39,7 @@
#include "BKE_context.h"
#include "BKE_editmesh.h"
+#include "BKE_layer.h"
#include "RNA_access.h"
@@ -86,21 +87,21 @@ typedef struct GizmoGroup2D {
wmGizmo *axis; \
int axis_idx; \
for (axis_idx = 0; axis_idx < MAN2D_AXIS_LAST; axis_idx++) { \
- axis = gizmo2d_get_axis_from_index(man, axis_idx);
+ axis = gizmo2d_get_axis_from_index(ggd, axis_idx);
#define MAN2D_ITER_AXES_END \
} \
} ((void)0)
-static wmGizmo *gizmo2d_get_axis_from_index(const GizmoGroup2D *man, const short axis_idx)
+static wmGizmo *gizmo2d_get_axis_from_index(const GizmoGroup2D *ggd, const short axis_idx)
{
BLI_assert(IN_RANGE_INCL(axis_idx, (float)MAN2D_AXIS_TRANS_X, (float)MAN2D_AXIS_TRANS_Y));
switch (axis_idx) {
case MAN2D_AXIS_TRANS_X:
- return man->translate_x;
+ return ggd->translate_x;
case MAN2D_AXIS_TRANS_Y:
- return man->translate_y;
+ return ggd->translate_y;
}
return NULL;
@@ -133,18 +134,18 @@ static GizmoGroup2D *gizmogroup2d_init(wmGizmoGroup *gzgroup)
const wmGizmoType *gzt_arrow = WM_gizmotype_find("GIZMO_GT_arrow_2d", true);
const wmGizmoType *gzt_cage = WM_gizmotype_find("GIZMO_GT_cage_2d", true);
- GizmoGroup2D *man = MEM_callocN(sizeof(GizmoGroup2D), __func__);
+ GizmoGroup2D *ggd = MEM_callocN(sizeof(GizmoGroup2D), __func__);
- man->translate_x = WM_gizmo_new_ptr(gzt_arrow, gzgroup, NULL);
- man->translate_y = WM_gizmo_new_ptr(gzt_arrow, gzgroup, NULL);
- man->cage = WM_gizmo_new_ptr(gzt_cage, gzgroup, NULL);
+ ggd->translate_x = WM_gizmo_new_ptr(gzt_arrow, gzgroup, NULL);
+ ggd->translate_y = WM_gizmo_new_ptr(gzt_arrow, gzgroup, NULL);
+ ggd->cage = WM_gizmo_new_ptr(gzt_cage, gzgroup, NULL);
- RNA_enum_set(man->cage->ptr, "transform",
+ RNA_enum_set(ggd->cage->ptr, "transform",
ED_GIZMO_CAGE2D_XFORM_FLAG_TRANSLATE |
ED_GIZMO_CAGE2D_XFORM_FLAG_SCALE |
ED_GIZMO_CAGE2D_XFORM_FLAG_ROTATE);
- return man;
+ return ggd;
}
/**
@@ -152,9 +153,6 @@ static GizmoGroup2D *gizmogroup2d_init(wmGizmoGroup *gzgroup)
*/
static void gizmo2d_calc_bounds(const bContext *C, float *r_center, float *r_min, float *r_max)
{
- SpaceImage *sima = CTX_wm_space_image(C);
- Image *ima = ED_space_image(sima);
-
float min_buf[2], max_buf[2];
if (r_min == NULL) {
r_min = min_buf;
@@ -163,7 +161,21 @@ static void gizmo2d_calc_bounds(const bContext *C, float *r_center, float *r_min
r_max = max_buf;
}
- if (!ED_uvedit_minmax(CTX_data_scene(C), ima, CTX_data_edit_object(C), r_min, r_max)) {
+ ScrArea *sa = CTX_wm_area(C);
+ if (sa->spacetype == SPACE_IMAGE) {
+ SpaceImage *sima = sa->spacedata.first;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ Image *ima = ED_space_image(sima);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(
+ view_layer, &objects_len);
+ if (!ED_uvedit_minmax_multi(CTX_data_scene(C), ima, objects, objects_len, r_min, r_max)) {
+ zero_v2(r_min);
+ zero_v2(r_max);
+ }
+ MEM_freeN(objects);
+ }
+ else {
zero_v2(r_min);
zero_v2(r_max);
}
@@ -200,8 +212,8 @@ static int gizmo2d_modal(
void ED_widgetgroup_gizmo2d_setup(const bContext *UNUSED(C), wmGizmoGroup *gzgroup)
{
wmOperatorType *ot_translate = WM_operatortype_find("TRANSFORM_OT_translate", true);
- GizmoGroup2D *man = gizmogroup2d_init(gzgroup);
- gzgroup->customdata = man;
+ GizmoGroup2D *ggd = gizmogroup2d_init(gzgroup);
+ gzgroup->customdata = ggd;
MAN2D_ITER_AXES_BEGIN(axis, axis_idx)
{
@@ -237,96 +249,96 @@ void ED_widgetgroup_gizmo2d_setup(const bContext *UNUSED(C), wmGizmoGroup *gzgro
PointerRNA *ptr;
/* assign operator */
- ptr = WM_gizmo_operator_set(man->cage, 0, ot_translate, NULL);
+ ptr = WM_gizmo_operator_set(ggd->cage, 0, ot_translate, NULL);
RNA_boolean_set(ptr, "release_confirm", 1);
bool constraint_x[3] = {1, 0, 0};
bool constraint_y[3] = {0, 1, 0};
- ptr = WM_gizmo_operator_set(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X, ot_resize, NULL);
+ ptr = WM_gizmo_operator_set(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X, ot_resize, NULL);
PropertyRNA *prop_release_confirm = RNA_struct_find_property(ptr, "release_confirm");
PropertyRNA *prop_constraint_axis = RNA_struct_find_property(ptr, "constraint_axis");
RNA_property_boolean_set_array(ptr, prop_constraint_axis, constraint_x);
RNA_property_boolean_set(ptr, prop_release_confirm, true);
- ptr = WM_gizmo_operator_set(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X, ot_resize, NULL);
+ ptr = WM_gizmo_operator_set(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X, ot_resize, NULL);
RNA_property_boolean_set_array(ptr, prop_constraint_axis, constraint_x);
RNA_property_boolean_set(ptr, prop_release_confirm, true);
- ptr = WM_gizmo_operator_set(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_Y, ot_resize, NULL);
+ ptr = WM_gizmo_operator_set(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_Y, ot_resize, NULL);
RNA_property_boolean_set_array(ptr, prop_constraint_axis, constraint_y);
RNA_property_boolean_set(ptr, prop_release_confirm, true);
- ptr = WM_gizmo_operator_set(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_Y, ot_resize, NULL);
+ ptr = WM_gizmo_operator_set(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_Y, ot_resize, NULL);
RNA_property_boolean_set_array(ptr, prop_constraint_axis, constraint_y);
RNA_property_boolean_set(ptr, prop_release_confirm, true);
- ptr = WM_gizmo_operator_set(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MIN_Y, ot_resize, NULL);
+ ptr = WM_gizmo_operator_set(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MIN_Y, ot_resize, NULL);
RNA_property_boolean_set(ptr, prop_release_confirm, true);
- ptr = WM_gizmo_operator_set(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MAX_Y, ot_resize, NULL);
+ ptr = WM_gizmo_operator_set(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MAX_Y, ot_resize, NULL);
RNA_property_boolean_set(ptr, prop_release_confirm, true);
- ptr = WM_gizmo_operator_set(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MIN_Y, ot_resize, NULL);
+ ptr = WM_gizmo_operator_set(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MIN_Y, ot_resize, NULL);
RNA_property_boolean_set(ptr, prop_release_confirm, true);
- ptr = WM_gizmo_operator_set(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MAX_Y, ot_resize, NULL);
+ ptr = WM_gizmo_operator_set(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MAX_Y, ot_resize, NULL);
RNA_property_boolean_set(ptr, prop_release_confirm, true);
- ptr = WM_gizmo_operator_set(man->cage, ED_GIZMO_CAGE2D_PART_ROTATE, ot_rotate, NULL);
+ ptr = WM_gizmo_operator_set(ggd->cage, ED_GIZMO_CAGE2D_PART_ROTATE, ot_rotate, NULL);
RNA_property_boolean_set(ptr, prop_release_confirm, true);
}
}
void ED_widgetgroup_gizmo2d_refresh(const bContext *C, wmGizmoGroup *gzgroup)
{
- GizmoGroup2D *man = gzgroup->customdata;
+ GizmoGroup2D *ggd = gzgroup->customdata;
float origin[3];
- gizmo2d_calc_bounds(C, origin, man->min, man->max);
- copy_v2_v2(man->origin, origin);
- bool show_cage = !equals_v2v2(man->min, man->max);
+ gizmo2d_calc_bounds(C, origin, ggd->min, ggd->max);
+ copy_v2_v2(ggd->origin, origin);
+ bool show_cage = !equals_v2v2(ggd->min, ggd->max);
if (show_cage) {
- man->cage->flag &= ~WM_GIZMO_HIDDEN;
- man->translate_x->flag |= WM_GIZMO_HIDDEN;
- man->translate_y->flag |= WM_GIZMO_HIDDEN;
+ ggd->cage->flag &= ~WM_GIZMO_HIDDEN;
+ ggd->translate_x->flag |= WM_GIZMO_HIDDEN;
+ ggd->translate_y->flag |= WM_GIZMO_HIDDEN;
}
else {
- man->cage->flag |= WM_GIZMO_HIDDEN;
- man->translate_x->flag &= ~WM_GIZMO_HIDDEN;
- man->translate_y->flag &= ~WM_GIZMO_HIDDEN;
+ ggd->cage->flag |= WM_GIZMO_HIDDEN;
+ ggd->translate_x->flag &= ~WM_GIZMO_HIDDEN;
+ ggd->translate_y->flag &= ~WM_GIZMO_HIDDEN;
}
if (show_cage) {
- wmGizmoOpElem *mpop;
+ wmGizmoOpElem *gzop;
float mid[2];
- const float *min = man->min;
- const float *max = man->max;
+ const float *min = ggd->min;
+ const float *max = ggd->max;
mid_v2_v2v2(mid, min, max);
- mpop = WM_gizmo_operator_get(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X);
- PropertyRNA *prop_center_override = RNA_struct_find_property(&mpop->ptr, "center_override");
- RNA_property_float_set_array(&mpop->ptr, prop_center_override, (float[3]){max[0], mid[1], 0.0f});
- mpop = WM_gizmo_operator_get(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X);
- RNA_property_float_set_array(&mpop->ptr, prop_center_override, (float[3]){min[0], mid[1], 0.0f});
- mpop = WM_gizmo_operator_get(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_Y);
- RNA_property_float_set_array(&mpop->ptr, prop_center_override, (float[3]){mid[0], max[1], 0.0f});
- mpop = WM_gizmo_operator_get(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_Y);
- RNA_property_float_set_array(&mpop->ptr, prop_center_override, (float[3]){mid[0], min[1], 0.0f});
-
- mpop = WM_gizmo_operator_get(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MIN_Y);
- RNA_property_float_set_array(&mpop->ptr, prop_center_override, (float[3]){max[0], max[1], 0.0f});
- mpop = WM_gizmo_operator_get(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MAX_Y);
- RNA_property_float_set_array(&mpop->ptr, prop_center_override, (float[3]){max[0], min[1], 0.0f});
- mpop = WM_gizmo_operator_get(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MIN_Y);
- RNA_property_float_set_array(&mpop->ptr, prop_center_override, (float[3]){min[0], max[1], 0.0f});
- mpop = WM_gizmo_operator_get(man->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MAX_Y);
- RNA_property_float_set_array(&mpop->ptr, prop_center_override, (float[3]){min[0], min[1], 0.0f});
-
- mpop = WM_gizmo_operator_get(man->cage, ED_GIZMO_CAGE2D_PART_ROTATE);
- RNA_property_float_set_array(&mpop->ptr, prop_center_override, (float[3]){mid[0], mid[1], 0.0f});
+ gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X);
+ PropertyRNA *prop_center_override = RNA_struct_find_property(&gzop->ptr, "center_override");
+ RNA_property_float_set_array(&gzop->ptr, prop_center_override, (float[3]){max[0], mid[1], 0.0f});
+ gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X);
+ RNA_property_float_set_array(&gzop->ptr, prop_center_override, (float[3]){min[0], mid[1], 0.0f});
+ gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_Y);
+ RNA_property_float_set_array(&gzop->ptr, prop_center_override, (float[3]){mid[0], max[1], 0.0f});
+ gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_Y);
+ RNA_property_float_set_array(&gzop->ptr, prop_center_override, (float[3]){mid[0], min[1], 0.0f});
+
+ gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MIN_Y);
+ RNA_property_float_set_array(&gzop->ptr, prop_center_override, (float[3]){max[0], max[1], 0.0f});
+ gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MAX_Y);
+ RNA_property_float_set_array(&gzop->ptr, prop_center_override, (float[3]){max[0], min[1], 0.0f});
+ gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MIN_Y);
+ RNA_property_float_set_array(&gzop->ptr, prop_center_override, (float[3]){min[0], max[1], 0.0f});
+ gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MAX_Y);
+ RNA_property_float_set_array(&gzop->ptr, prop_center_override, (float[3]){min[0], min[1], 0.0f});
+
+ gzop = WM_gizmo_operator_get(ggd->cage, ED_GIZMO_CAGE2D_PART_ROTATE);
+ RNA_property_float_set_array(&gzop->ptr, prop_center_override, (float[3]){mid[0], mid[1], 0.0f});
}
}
void ED_widgetgroup_gizmo2d_draw_prepare(const bContext *C, wmGizmoGroup *gzgroup)
{
ARegion *ar = CTX_wm_region(C);
- GizmoGroup2D *man = gzgroup->customdata;
- float origin[3] = {UNPACK2(man->origin), 0.0f};
- float origin_aa[3] = {UNPACK2(man->origin), 0.0f};
+ GizmoGroup2D *ggd = gzgroup->customdata;
+ float origin[3] = {UNPACK2(ggd->origin), 0.0f};
+ float origin_aa[3] = {UNPACK2(ggd->origin), 0.0f};
gizmo2d_origin_to_region(ar, origin);
@@ -336,10 +348,10 @@ void ED_widgetgroup_gizmo2d_draw_prepare(const bContext *C, wmGizmoGroup *gzgrou
}
MAN2D_ITER_AXES_END;
- UI_view2d_view_to_region_m4(&ar->v2d, man->cage->matrix_space);
- WM_gizmo_set_matrix_offset_location(man->cage, origin_aa);
- man->cage->matrix_offset[0][0] = (man->max[0] - man->min[0]);
- man->cage->matrix_offset[1][1] = (man->max[1] - man->min[1]);
+ UI_view2d_view_to_region_m4(&ar->v2d, ggd->cage->matrix_space);
+ WM_gizmo_set_matrix_offset_location(ggd->cage, origin_aa);
+ ggd->cage->matrix_offset[0][0] = (ggd->max[0] - ggd->min[0]);
+ ggd->cage->matrix_offset[1][1] = (ggd->max[1] - ggd->min[1]);
}
/* TODO (Julian)
diff --git a/source/blender/editors/transform/transform_gizmo_3d.c b/source/blender/editors/transform/transform_gizmo_3d.c
index 845f361a869..bf5500903a2 100644
--- a/source/blender/editors/transform/transform_gizmo_3d.c
+++ b/source/blender/editors/transform/transform_gizmo_3d.c
@@ -44,12 +44,11 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
-#include "RNA_access.h"
-
#include "BKE_action.h"
#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_global.h"
+#include "BKE_layer.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
#include "BKE_editmesh.h"
@@ -57,6 +56,7 @@
#include "BKE_gpencil.h"
#include "BKE_scene.h"
#include "BKE_workspace.h"
+#include "BKE_object.h"
#include "BIF_gl.h"
@@ -66,6 +66,7 @@
#include "WM_types.h"
#include "WM_message.h"
#include "WM_toolsystem.h"
+#include "wm.h"
#include "ED_armature.h"
#include "ED_curve.h"
@@ -75,15 +76,21 @@
#include "ED_gpencil.h"
#include "ED_screen.h"
#include "ED_gizmo_library.h"
+#include "ED_gizmo_utils.h"
+#include "UI_interface.h"
#include "UI_resources.h"
+#include "RNA_access.h"
+#include "RNA_define.h"
+
/* local module include */
#include "transform.h"
#include "MEM_guardedalloc.h"
#include "GPU_select.h"
+#include "GPU_state.h"
#include "GPU_immediate.h"
#include "GPU_matrix.h"
@@ -148,9 +155,7 @@ enum {
#define MAN_AXIS_RANGE_SCALE_START MAN_AXIS_SCALE_X
#define MAN_AXIS_RANGE_SCALE_END (MAN_AXIS_SCALE_ZX + 1)
- MAN_AXIS_APRON_C,
-
- MAN_AXIS_LAST = MAN_AXIS_APRON_C + 1,
+ MAN_AXIS_LAST = MAN_AXIS_SCALE_ZX + 1,
};
/* axis types */
@@ -164,7 +169,6 @@ enum {
typedef struct GizmoGroup {
bool all_hidden;
int twtype;
- int axis_type_default;
/* Users may change the twtype, detect changes to re-setup gizmo options. */
int twtype_init;
@@ -184,19 +188,19 @@ typedef struct GizmoGroup {
wmGizmo *axis; \
int axis_idx; \
for (axis_idx = 0; axis_idx < MAN_AXIS_LAST; axis_idx++) { \
- axis = gizmo_get_axis_from_index(man, axis_idx);
+ axis = gizmo_get_axis_from_index(ggd, axis_idx);
#define MAN_ITER_AXES_END \
} \
} ((void)0)
-static wmGizmo *gizmo_get_axis_from_index(const GizmoGroup *man, const short axis_idx)
+static wmGizmo *gizmo_get_axis_from_index(const GizmoGroup *ggd, const short axis_idx)
{
BLI_assert(IN_RANGE_INCL(axis_idx, (float)MAN_AXIS_TRANS_X, (float)MAN_AXIS_LAST));
- return man->gizmos[axis_idx];
+ return ggd->gizmos[axis_idx];
}
-static short gizmo_get_axis_type(const int axis_idx, const int axis_type_default)
+static short gizmo_get_axis_type(const int axis_idx)
{
if (axis_idx >= MAN_AXIS_RANGE_TRANS_START && axis_idx < MAN_AXIS_RANGE_TRANS_END) {
return MAN_AXES_TRANSLATE;
@@ -207,9 +211,6 @@ static short gizmo_get_axis_type(const int axis_idx, const int axis_type_default
if (axis_idx >= MAN_AXIS_RANGE_SCALE_START && axis_idx < MAN_AXIS_RANGE_SCALE_END) {
return MAN_AXES_SCALE;
}
- if (axis_idx == MAN_AXIS_APRON_C) {
- return axis_type_default;
- }
BLI_assert(0);
return -1;
}
@@ -272,9 +273,9 @@ static bool gizmo_is_axis_visible(
}
}
- if ((axis_type == MAN_AXES_TRANSLATE && !(twtype & SCE_MANIP_TRANSLATE)) ||
- (axis_type == MAN_AXES_ROTATE && !(twtype & SCE_MANIP_ROTATE)) ||
- (axis_type == MAN_AXES_SCALE && !(twtype & SCE_MANIP_SCALE)))
+ if ((axis_type == MAN_AXES_TRANSLATE && !(twtype & SCE_GIZMO_SHOW_TRANSLATE)) ||
+ (axis_type == MAN_AXES_ROTATE && !(twtype & SCE_GIZMO_SHOW_ROTATE)) ||
+ (axis_type == MAN_AXES_SCALE && !(twtype & SCE_GIZMO_SHOW_SCALE)))
{
return false;
}
@@ -304,36 +305,34 @@ static bool gizmo_is_axis_visible(
case MAN_AXIS_SCALE_Z:
return (rv3d->twdrawflag & MAN_SCALE_Z);
case MAN_AXIS_SCALE_C:
- return (rv3d->twdrawflag & MAN_SCALE_C && (twtype & SCE_MANIP_TRANSLATE) == 0);
+ return (rv3d->twdrawflag & MAN_SCALE_C && (twtype & SCE_GIZMO_SHOW_TRANSLATE) == 0);
case MAN_AXIS_TRANS_XY:
return (rv3d->twdrawflag & MAN_TRANS_X &&
rv3d->twdrawflag & MAN_TRANS_Y &&
- (twtype & SCE_MANIP_ROTATE) == 0);
+ (twtype & SCE_GIZMO_SHOW_ROTATE) == 0);
case MAN_AXIS_TRANS_YZ:
return (rv3d->twdrawflag & MAN_TRANS_Y &&
rv3d->twdrawflag & MAN_TRANS_Z &&
- (twtype & SCE_MANIP_ROTATE) == 0);
+ (twtype & SCE_GIZMO_SHOW_ROTATE) == 0);
case MAN_AXIS_TRANS_ZX:
return (rv3d->twdrawflag & MAN_TRANS_Z &&
rv3d->twdrawflag & MAN_TRANS_X &&
- (twtype & SCE_MANIP_ROTATE) == 0);
+ (twtype & SCE_GIZMO_SHOW_ROTATE) == 0);
case MAN_AXIS_SCALE_XY:
return (rv3d->twdrawflag & MAN_SCALE_X &&
rv3d->twdrawflag & MAN_SCALE_Y &&
- (twtype & SCE_MANIP_TRANSLATE) == 0 &&
- (twtype & SCE_MANIP_ROTATE) == 0);
+ (twtype & SCE_GIZMO_SHOW_TRANSLATE) == 0 &&
+ (twtype & SCE_GIZMO_SHOW_ROTATE) == 0);
case MAN_AXIS_SCALE_YZ:
return (rv3d->twdrawflag & MAN_SCALE_Y &&
rv3d->twdrawflag & MAN_SCALE_Z &&
- (twtype & SCE_MANIP_TRANSLATE) == 0 &&
- (twtype & SCE_MANIP_ROTATE) == 0);
+ (twtype & SCE_GIZMO_SHOW_TRANSLATE) == 0 &&
+ (twtype & SCE_GIZMO_SHOW_ROTATE) == 0);
case MAN_AXIS_SCALE_ZX:
return (rv3d->twdrawflag & MAN_SCALE_Z &&
rv3d->twdrawflag & MAN_SCALE_X &&
- (twtype & SCE_MANIP_TRANSLATE) == 0 &&
- (twtype & SCE_MANIP_ROTATE) == 0);
- case MAN_AXIS_APRON_C:
- return true;
+ (twtype & SCE_GIZMO_SHOW_TRANSLATE) == 0 &&
+ (twtype & SCE_GIZMO_SHOW_ROTATE) == 0);
}
return false;
}
@@ -657,7 +656,7 @@ void ED_transform_calc_orientation_from_type_ex(
if (ob->mode & OB_MODE_POSE) {
/* each bone moves on its own local axis, but to avoid confusion,
* use the active pones axis for display [#33575], this works as expected on a single bone
- * and users who select many bones will understand whats going on and what local means
+ * and users who select many bones will understand what's going on and what local means
* when they start transforming */
ED_getTransformOrientationMatrix(C, r_mat, pivot_point);
ok = true;
@@ -814,26 +813,53 @@ int ED_transform_calc_gizmo_stats(
BMEditSelection ese;
float vec[3] = {0, 0, 0};
- /* USE LAST SELECTE WITH ACTIVE */
+ /* USE LAST SELECT WITH ACTIVE */
if ((pivot_point == V3D_AROUND_ACTIVE) && BM_select_history_active_get(em->bm, &ese)) {
BM_editselection_center(&ese, vec);
calc_tw_center(tbounds, vec);
totsel = 1;
}
else {
- BMesh *bm = em->bm;
- BMVert *eve;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode(view_layer, &objects_len);
- BMIter iter;
+ float mat_local[4][4];
+ invert_m4_m4(obedit->imat, obedit->obmat);
- BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
- if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
- if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
- totsel++;
- calc_tw_center(tbounds, eve->co);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob_iter = objects[ob_index];
+ BMEditMesh *em_iter = BKE_editmesh_from_object(ob_iter);
+ BMesh *bm = em_iter->bm;
+
+ if (bm->totvertsel == 0) {
+ continue;
+ }
+
+ BMVert *eve;
+ BMIter iter;
+
+ const bool use_mat_local = (ob_iter != obedit);
+ if (use_mat_local) {
+ mul_m4_m4m4(mat_local, obedit->imat, ob_iter->obmat);
+ }
+
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
+ if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
+ float co[3];
+ if (use_mat_local) {
+ mul_v3_m4v3(co, mat_local, eve->co);
+ }
+ else {
+ copy_v3_v3(co, eve->co);
+ }
+ calc_tw_center(tbounds, co);
+ totsel++;
+ }
}
}
}
+ MEM_freeN(objects);
}
} /* end editmesh */
else if (obedit->type == OB_ARMATURE) {
@@ -855,6 +881,7 @@ int ED_transform_calc_gizmo_stats(
protectflag_to_drawflags_ebone(rv3d, ebo);
}
else {
+ /* TODO: multi-object support. */
for (ebo = arm->edbo->first; ebo; ebo = ebo->next) {
if (EBONE_VISIBLE(arm, ebo)) {
if (ebo->flag & BONE_TIPSEL) {
@@ -887,6 +914,7 @@ int ED_transform_calc_gizmo_stats(
totsel++;
}
else {
+ /* TODO: multi-object support. */
Nurb *nu;
BezTriple *bezt;
BPoint *bp;
@@ -902,7 +930,7 @@ int ED_transform_calc_gizmo_stats(
* if handles are hidden then only check the center points.
* If the center knot is selected then only use this as the center point.
*/
- if (cu->drawflag & CU_HIDE_HANDLES) {
+ if ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) {
if (bezt->f2 & SELECT) {
calc_tw_center(tbounds, bezt->vec[1]);
totsel++;
@@ -951,6 +979,7 @@ int ED_transform_calc_gizmo_stats(
totsel++;
}
else {
+ /* TODO: multi-object support. */
for (ml = mb->editelems->first; ml; ml = ml->next) {
if (ml->flag & SELECT) {
calc_tw_center(tbounds, &ml->x);
@@ -968,6 +997,7 @@ int ED_transform_calc_gizmo_stats(
totsel++;
}
else {
+ /* TODO: multi-object support. */
bp = lt->def;
a = lt->pntsu * lt->pntsv * lt->pntsw;
while (a--) {
@@ -1067,13 +1097,20 @@ int ED_transform_calc_gizmo_stats(
if (ob == NULL) {
ob = base->object;
}
- if (params->use_only_center || base->object->bb == NULL) {
+
+ /* Get the boundbox out of the evaluated object. */
+ const BoundBox *bb = NULL;
+ if (params->use_only_center == false) {
+ bb = BKE_object_boundbox_get(base->object);
+ }
+
+ if (params->use_only_center || (bb == NULL)) {
calc_tw_center(tbounds, base->object->obmat[3]);
}
else {
for (uint j = 0; j < 8; j++) {
float co[3];
- mul_v3_m4v3(co, base->object->obmat, base->object->bb->vec[j]);
+ mul_v3_m4v3(co, base->object->obmat, bb->vec[j]);
calc_tw_center(tbounds, co);
}
}
@@ -1157,15 +1194,15 @@ static void gizmo_line_range(const int twtype, const short axis_type, float *r_s
switch (axis_type) {
case MAN_AXES_TRANSLATE:
- if (twtype & SCE_MANIP_SCALE) {
+ if (twtype & SCE_GIZMO_SHOW_SCALE) {
*r_start = *r_len - ofs + 0.075f;
}
- if (twtype & SCE_MANIP_ROTATE) {
+ if (twtype & SCE_GIZMO_SHOW_ROTATE) {
*r_len += ofs;
}
break;
case MAN_AXES_SCALE:
- if (twtype & (SCE_MANIP_TRANSLATE | SCE_MANIP_ROTATE)) {
+ if (twtype & (SCE_GIZMO_SHOW_TRANSLATE | SCE_GIZMO_SHOW_ROTATE)) {
*r_len -= ofs + 0.025f;
}
break;
@@ -1208,11 +1245,9 @@ static void gizmo_xform_message_subscribe(
if (type_fn == TRANSFORM_GGT_gizmo) {
extern PropertyRNA rna_ToolSettings_transform_pivot_point;
extern PropertyRNA rna_ToolSettings_use_gizmo_mode;
- extern PropertyRNA rna_ToolSettings_use_gizmo_apron;
const PropertyRNA *props[] = {
&rna_ToolSettings_transform_pivot_point,
&rna_ToolSettings_use_gizmo_mode,
- &rna_ToolSettings_use_gizmo_apron,
};
for (int i = 0; i < ARRAY_SIZE(props); i++) {
WM_msg_subscribe_rna(mbus, &toolsettings_ptr, props[i], &msg_sub_value_gz_tag_refresh, __func__);
@@ -1221,6 +1256,9 @@ static void gizmo_xform_message_subscribe(
else if (type_fn == VIEW3D_GGT_xform_cage) {
/* pass */
}
+ else if (type_fn == VIEW3D_GGT_xform_shear) {
+ /* pass */
+ }
else {
BLI_assert(0);
}
@@ -1228,6 +1266,104 @@ static void gizmo_xform_message_subscribe(
WM_msg_subscribe_rna_anon_prop(mbus, Window, view_layer, &msg_sub_value_gz_tag_refresh);
}
+
+void drawDial3d(const TransInfo *t)
+{
+ if (t->mode == TFM_ROTATION && t->spacetype == SPACE_VIEW3D) {
+ wmGizmo *gz = wm_gizmomap_highlight_get(t->ar->gizmo_map);
+ if (gz == NULL) {
+ /* We only draw Dial3d if the operator has been called by a gizmo. */
+ return;
+ }
+
+ float mat_basis[4][4];
+ float mat_final[4][4];
+ float color[4];
+ float increment;
+ float line_with = GIZMO_AXIS_LINE_WIDTH + 1.0f;
+ float scale = UI_DPI_FAC * U.gizmo_size;
+
+ int axis_idx;
+
+ const TransCon *tc = &(t->con);
+ if (tc->mode & CON_APPLY) {
+ if (tc->mode & CON_AXIS0) {
+ axis_idx = MAN_AXIS_ROT_X;
+ negate_v3_v3(mat_basis[2], tc->mtx[0]);
+ }
+ else if (tc->mode & CON_AXIS1) {
+ axis_idx = MAN_AXIS_ROT_Y;
+ negate_v3_v3(mat_basis[2], tc->mtx[1]);
+ }
+ else {
+ BLI_assert((tc->mode & CON_AXIS2) != 0);
+ axis_idx = MAN_AXIS_ROT_Z;
+ negate_v3_v3(mat_basis[2], tc->mtx[2]);
+ }
+ }
+ else {
+ axis_idx = MAN_AXIS_ROT_C;
+ negate_v3_v3(mat_basis[2], t->axis);
+ scale *= 1.2f;
+ line_with -= 1.0f;
+ }
+
+ copy_v3_v3(mat_basis[3], t->center_global);
+ mat_basis[2][3] = -dot_v3v3(mat_basis[2], mat_basis[3]);
+
+ if (ED_view3d_win_to_3d_on_plane(
+ t->ar, mat_basis[2], (float[2]){UNPACK2(t->mouse.imval)},
+ false, mat_basis[1]))
+ {
+ sub_v3_v3(mat_basis[1], mat_basis[3]);
+ normalize_v3(mat_basis[1]);
+ cross_v3_v3v3(mat_basis[0], mat_basis[1], mat_basis[2]);
+ }
+ else {
+ /* The plane and the mouse direction are parallel.
+ * Calculate a matrix orthogonal to the axis. */
+ ortho_basis_v3v3_v3(mat_basis[0], mat_basis[1], mat_basis[2]);
+ }
+
+ mat_basis[0][3] = 0.0f;
+ mat_basis[1][3] = 0.0f;
+ mat_basis[2][3] = 0.0f;
+ mat_basis[3][3] = 1.0f;
+
+ copy_m4_m4(mat_final, mat_basis);
+ scale *= ED_view3d_pixel_size_no_ui_scale(t->ar->regiondata, mat_final[3]);
+ mul_mat3_m4_fl(mat_final, scale);
+
+ if ((t->tsnap.mode & (SCE_SNAP_MODE_INCREMENT | SCE_SNAP_MODE_GRID)) &&
+ activeSnap(t))
+ {
+ increment = (t->modifiers & MOD_PRECISION) ? t->snap[2] : t->snap[1];
+ }
+ else {
+ increment = t->snap[0];
+ }
+
+ BLI_assert(axis_idx >= MAN_AXIS_RANGE_ROT_START && axis_idx < MAN_AXIS_RANGE_ROT_END);
+ gizmo_get_axis_color(axis_idx, NULL, color, color);
+
+ GPU_depth_test(false);
+ GPU_blend(true);
+ GPU_line_smooth(true);
+
+ ED_gizmotypes_dial_3d_draw_util(
+ mat_basis, mat_final, line_with, color,
+ &(struct Dial3dParams){
+ .draw_options = ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_VALUE,
+ .angle_delta = t->values[0],
+ .angle_increment = increment,
+ });
+
+ GPU_line_smooth(false);
+ GPU_depth_test(true);
+ GPU_blend(false);
+ }
+}
+
/** \} */
@@ -1237,31 +1373,25 @@ static void gizmo_xform_message_subscribe(
static GizmoGroup *gizmogroup_init(wmGizmoGroup *gzgroup)
{
- GizmoGroup *man;
+ GizmoGroup *ggd;
- man = MEM_callocN(sizeof(GizmoGroup), "gizmo_data");
+ ggd = MEM_callocN(sizeof(GizmoGroup), "gizmo_data");
const wmGizmoType *gzt_arrow = WM_gizmotype_find("GIZMO_GT_arrow_3d", true);
const wmGizmoType *gzt_dial = WM_gizmotype_find("GIZMO_GT_dial_3d", true);
const wmGizmoType *gzt_prim = WM_gizmotype_find("GIZMO_GT_primitive_3d", true);
- /* Fallback action. */
- {
- const wmGizmoType *gzt_mask = WM_gizmotype_find("GIZMO_GT_blank_3d", true);
- man->gizmos[MAN_AXIS_APRON_C] = WM_gizmo_new_ptr(gzt_mask, gzgroup, NULL);
- }
-
#define GIZMO_NEW_ARROW(v, draw_style) { \
- man->gizmos[v] = WM_gizmo_new_ptr(gzt_arrow, gzgroup, NULL); \
- RNA_enum_set(man->gizmos[v]->ptr, "draw_style", draw_style); \
+ ggd->gizmos[v] = WM_gizmo_new_ptr(gzt_arrow, gzgroup, NULL); \
+ RNA_enum_set(ggd->gizmos[v]->ptr, "draw_style", draw_style); \
} ((void)0)
#define GIZMO_NEW_DIAL(v, draw_options) { \
- man->gizmos[v] = WM_gizmo_new_ptr(gzt_dial, gzgroup, NULL); \
- RNA_enum_set(man->gizmos[v]->ptr, "draw_options", draw_options); \
+ ggd->gizmos[v] = WM_gizmo_new_ptr(gzt_dial, gzgroup, NULL); \
+ RNA_enum_set(ggd->gizmos[v]->ptr, "draw_options", draw_options); \
} ((void)0)
#define GIZMO_NEW_PRIM(v, draw_style) { \
- man->gizmos[v] = WM_gizmo_new_ptr(gzt_prim, gzgroup, NULL); \
- RNA_enum_set(man->gizmos[v]->ptr, "draw_style", draw_style); \
+ ggd->gizmos[v] = WM_gizmo_new_ptr(gzt_prim, gzgroup, NULL); \
+ RNA_enum_set(ggd->gizmos[v]->ptr, "draw_style", draw_style); \
} ((void)0)
/* add/init widgets - order matters! */
@@ -1294,9 +1424,9 @@ static GizmoGroup *gizmogroup_init(wmGizmoGroup *gzgroup)
GIZMO_NEW_PRIM(MAN_AXIS_TRANS_YZ, ED_GIZMO_PRIMITIVE_STYLE_PLANE);
GIZMO_NEW_PRIM(MAN_AXIS_TRANS_ZX, ED_GIZMO_PRIMITIVE_STYLE_PLANE);
- man->gizmos[MAN_AXIS_ROT_T]->flag |= WM_GIZMO_SELECT_BACKGROUND;
+ ggd->gizmos[MAN_AXIS_ROT_T]->flag |= WM_GIZMO_SELECT_BACKGROUND;
- return man;
+ return ggd;
}
/**
@@ -1337,24 +1467,11 @@ static void gizmogroup_init_properties_from_twtype(wmGizmoGroup *gzgroup)
struct {
wmOperatorType *translate, *rotate, *trackball, *resize;
} ot_store = {NULL};
- GizmoGroup *man = gzgroup->customdata;
-
- if (man->twtype & SCE_MANIP_TRANSLATE) {
- man->axis_type_default = MAN_AXES_TRANSLATE;
- }
- else if (man->twtype & SCE_MANIP_ROTATE) {
- man->axis_type_default = MAN_AXES_ROTATE;
- }
- else if (man->twtype & SCE_MANIP_SCALE) {
- man->axis_type_default = MAN_AXES_SCALE;
- }
- else {
- man->axis_type_default = 0;
- }
+ GizmoGroup *ggd = gzgroup->customdata;
MAN_ITER_AXES_BEGIN(axis, axis_idx)
{
- const short axis_type = gizmo_get_axis_type(axis_idx, man->axis_type_default);
+ const short axis_type = gizmo_get_axis_type(axis_idx);
bool constraint_axis[3] = {1, 0, 0};
PointerRNA *ptr = NULL;
@@ -1372,7 +1489,7 @@ static void gizmogroup_init_properties_from_twtype(wmGizmoGroup *gzgroup)
case MAN_AXIS_SCALE_Z:
if (axis_idx >= MAN_AXIS_RANGE_TRANS_START && axis_idx < MAN_AXIS_RANGE_TRANS_END) {
int draw_options = 0;
- if ((man->twtype & (SCE_MANIP_ROTATE | SCE_MANIP_SCALE)) == 0) {
+ if ((ggd->twtype & (SCE_GIZMO_SHOW_ROTATE | SCE_GIZMO_SHOW_SCALE)) == 0) {
draw_options |= ED_GIZMO_ARROW_DRAW_FLAG_STEM;
}
RNA_enum_set(axis->ptr, "draw_options", draw_options);
@@ -1417,9 +1534,6 @@ static void gizmogroup_init_properties_from_twtype(wmGizmoGroup *gzgroup)
WM_gizmo_set_scale(axis, 0.2f);
}
break;
- case MAN_AXIS_APRON_C:
- WM_gizmo_set_scale(axis, 1.2f);
- break;
}
switch (axis_type) {
@@ -1473,31 +1587,31 @@ static void gizmogroup_init_properties_from_twtype(wmGizmoGroup *gzgroup)
static void WIDGETGROUP_gizmo_setup(const bContext *C, wmGizmoGroup *gzgroup)
{
- GizmoGroup *man = gizmogroup_init(gzgroup);
+ GizmoGroup *ggd = gizmogroup_init(gzgroup);
- gzgroup->customdata = man;
+ gzgroup->customdata = ggd;
{
- man->twtype = 0;
+ ggd->twtype = 0;
ScrArea *sa = CTX_wm_area(C);
const bToolRef *tref = sa->runtime.tool;
if (tref == NULL || STREQ(tref->idname, "Transform")) {
/* Setup all gizmos, they can be toggled via 'ToolSettings.gizmo_flag' */
- man->twtype = SCE_MANIP_TRANSLATE | SCE_MANIP_ROTATE | SCE_MANIP_SCALE;
- man->use_twtype_refresh = true;
+ ggd->twtype = SCE_GIZMO_SHOW_TRANSLATE | SCE_GIZMO_SHOW_ROTATE | SCE_GIZMO_SHOW_SCALE;
+ ggd->use_twtype_refresh = true;
}
- else if (STREQ(tref->idname, "Grab")) {
- man->twtype |= SCE_MANIP_TRANSLATE;
+ else if (STREQ(tref->idname, "Move")) {
+ ggd->twtype |= SCE_GIZMO_SHOW_TRANSLATE;
}
else if (STREQ(tref->idname, "Rotate")) {
- man->twtype |= SCE_MANIP_ROTATE;
+ ggd->twtype |= SCE_GIZMO_SHOW_ROTATE;
}
else if (STREQ(tref->idname, "Scale")) {
- man->twtype |= SCE_MANIP_SCALE;
+ ggd->twtype |= SCE_GIZMO_SHOW_SCALE;
}
- BLI_assert(man->twtype != 0);
- man->twtype_init = man->twtype;
+ BLI_assert(ggd->twtype != 0);
+ ggd->twtype_init = ggd->twtype;
}
/* *** set properties for axes *** */
@@ -1506,24 +1620,24 @@ static void WIDGETGROUP_gizmo_setup(const bContext *C, wmGizmoGroup *gzgroup)
static void WIDGETGROUP_gizmo_refresh(const bContext *C, wmGizmoGroup *gzgroup)
{
- GizmoGroup *man = gzgroup->customdata;
+ GizmoGroup *ggd = gzgroup->customdata;
ScrArea *sa = CTX_wm_area(C);
ARegion *ar = CTX_wm_region(C);
View3D *v3d = sa->spacedata.first;
RegionView3D *rv3d = ar->regiondata;
struct TransformBounds tbounds;
- if (man->use_twtype_refresh) {
+ if (ggd->use_twtype_refresh) {
Scene *scene = CTX_data_scene(C);
- man->twtype = scene->toolsettings->gizmo_flag & man->twtype_init;
- if (man->twtype != man->twtype_prev) {
- man->twtype_prev = man->twtype;
+ ggd->twtype = scene->toolsettings->gizmo_flag & ggd->twtype_init;
+ if (ggd->twtype != ggd->twtype_prev) {
+ ggd->twtype_prev = ggd->twtype;
gizmogroup_init_properties_from_twtype(gzgroup);
}
}
/* skip, we don't draw anything anyway */
- if ((man->all_hidden =
+ if ((ggd->all_hidden =
(ED_transform_calc_gizmo_stats(
C, &(struct TransformCalcParams){
.use_only_center = true,
@@ -1538,7 +1652,7 @@ static void WIDGETGROUP_gizmo_refresh(const bContext *C, wmGizmoGroup *gzgroup)
MAN_ITER_AXES_BEGIN(axis, axis_idx)
{
- const short axis_type = gizmo_get_axis_type(axis_idx, man->axis_type_default);
+ const short axis_type = gizmo_get_axis_type(axis_idx);
const int aidx_norm = gizmo_orientation_axis(axis_idx, NULL);
WM_gizmo_set_matrix_location(axis, rv3d->twmat[3]);
@@ -1554,13 +1668,13 @@ static void WIDGETGROUP_gizmo_refresh(const bContext *C, wmGizmoGroup *gzgroup)
float start_co[3] = {0.0f, 0.0f, 0.0f};
float len;
- gizmo_line_range(man->twtype, axis_type, &start_co[2], &len);
+ gizmo_line_range(ggd->twtype, axis_type, &start_co[2], &len);
WM_gizmo_set_matrix_rotation_from_z_axis(axis, rv3d->twmat[aidx_norm]);
RNA_float_set(axis->ptr, "length", len);
if (axis_idx >= MAN_AXIS_RANGE_TRANS_START && axis_idx < MAN_AXIS_RANGE_TRANS_END) {
- if (man->twtype & SCE_MANIP_ROTATE) {
+ if (ggd->twtype & SCE_GIZMO_SHOW_ROTATE) {
/* Avoid rotate and translate arrows overlap. */
start_co[2] += 0.215f;
}
@@ -1603,8 +1717,7 @@ static void WIDGETGROUP_gizmo_message_subscribe(
static void WIDGETGROUP_gizmo_draw_prepare(const bContext *C, wmGizmoGroup *gzgroup)
{
- const Scene *scene = CTX_data_scene(C);
- GizmoGroup *man = gzgroup->customdata;
+ GizmoGroup *ggd = gzgroup->customdata;
// ScrArea *sa = CTX_wm_area(C);
ARegion *ar = CTX_wm_region(C);
// View3D *v3d = sa->spacedata.first;
@@ -1613,7 +1726,7 @@ static void WIDGETGROUP_gizmo_draw_prepare(const bContext *C, wmGizmoGroup *gzgr
/* when looking through a selected camera, the gizmo can be at the
* exact same position as the view, skip so we don't break selection */
- if (man->all_hidden || fabsf(ED_view3d_pixel_size(rv3d, rv3d->twmat[3])) < 1e-6f) {
+ if (ggd->all_hidden || fabsf(ED_view3d_pixel_size(rv3d, rv3d->twmat[3])) < 1e-6f) {
MAN_ITER_AXES_BEGIN(axis, axis_idx)
{
WM_gizmo_set_flag(axis, WM_GIZMO_HIDDEN, true);
@@ -1627,13 +1740,10 @@ static void WIDGETGROUP_gizmo_draw_prepare(const bContext *C, wmGizmoGroup *gzgr
MAN_ITER_AXES_BEGIN(axis, axis_idx)
{
- const short axis_type = gizmo_get_axis_type(axis_idx, man->axis_type_default);
+ const short axis_type = gizmo_get_axis_type(axis_idx);
/* XXX maybe unset _HIDDEN flag on redraw? */
- if (axis_idx == MAN_AXIS_APRON_C) {
- WM_gizmo_set_flag(axis, WM_GIZMO_HIDDEN, (scene->toolsettings->gizmo_flag & SCE_MANIP_DISABLE_APRON) != 0);
- }
- else if (gizmo_is_axis_visible(rv3d, man->twtype, idot, axis_type, axis_idx)) {
+ if (gizmo_is_axis_visible(rv3d, ggd->twtype, idot, axis_type, axis_idx)) {
WM_gizmo_set_flag(axis, WM_GIZMO_HIDDEN, false);
}
else {
@@ -1651,7 +1761,6 @@ static void WIDGETGROUP_gizmo_draw_prepare(const bContext *C, wmGizmoGroup *gzgr
case MAN_AXIS_ROT_C:
case MAN_AXIS_SCALE_C:
case MAN_AXIS_ROT_T:
- case MAN_AXIS_APRON_C:
WM_gizmo_set_matrix_rotation_from_z_axis(axis, rv3d->viewinv[2]);
break;
}
@@ -1661,15 +1770,9 @@ static void WIDGETGROUP_gizmo_draw_prepare(const bContext *C, wmGizmoGroup *gzgr
static bool WIDGETGROUP_gizmo_poll(const struct bContext *C, struct wmGizmoGroupType *gzgt)
{
- /* it's a given we only use this in 3D view */
- bToolRef_Runtime *tref_rt = WM_toolsystem_runtime_from_context((bContext *)C);
- if ((tref_rt == NULL) ||
- !STREQ(gzgt->idname, tref_rt->gizmo_group))
- {
- WM_gizmo_group_type_unlink_delayed_ptr(gzgt);
+ if (!ED_gizmo_poll_or_unlink_delayed_from_tool(C, gzgt)) {
return false;
}
-
View3D *v3d = CTX_wm_view3d(C);
if (v3d->gizmo_flag & (V3D_GIZMO_HIDE | V3D_GIZMO_HIDE_TOOL)) {
return false;
@@ -1692,6 +1795,15 @@ void TRANSFORM_GGT_gizmo(wmGizmoGroupType *gzgt)
gzgt->refresh = WIDGETGROUP_gizmo_refresh;
gzgt->message_subscribe = WIDGETGROUP_gizmo_message_subscribe;
gzgt->draw_prepare = WIDGETGROUP_gizmo_draw_prepare;
+
+ static const EnumPropertyItem rna_enum_gizmo_items[] = {
+ {SCE_GIZMO_SHOW_TRANSLATE, "TRANSLATE", 0, "Move", ""},
+ {SCE_GIZMO_SHOW_ROTATE, "ROTATE", 0, "Rotate", ""},
+ {SCE_GIZMO_SHOW_SCALE, "SCALE", 0, "Scale", ""},
+ {0, "NONE", 0, "None", ""},
+ {0, NULL, 0, NULL, NULL}
+ };
+ RNA_def_enum(gzgt->srna, "drag_action", rna_enum_gizmo_items, SCE_GIZMO_SHOW_TRANSLATE, "Drag Action", "");
}
/** \} */
@@ -1703,13 +1815,19 @@ void TRANSFORM_GGT_gizmo(wmGizmoGroupType *gzgt)
struct XFormCageWidgetGroup {
wmGizmo *gizmo;
+ /* Only for view orientation. */
+ struct {
+ float viewinv_m3[3][3];
+ } prev;
};
static bool WIDGETGROUP_xform_cage_poll(const bContext *C, wmGizmoGroupType *gzgt)
{
- bToolRef_Runtime *tref_rt = WM_toolsystem_runtime_from_context((bContext *)C);
- if (!STREQ(gzgt->idname, tref_rt->gizmo_group)) {
- WM_gizmo_group_type_unlink_delayed_ptr(gzgt);
+ if (!ED_gizmo_poll_or_unlink_delayed_from_tool(C, gzgt)) {
+ return false;
+ }
+ View3D *v3d = CTX_wm_view3d(C);
+ if (v3d->gizmo_flag & (V3D_GIZMO_HIDE | V3D_GIZMO_HIDE_TOOL)) {
return false;
}
return true;
@@ -1782,7 +1900,7 @@ static void WIDGETGROUP_xform_cage_refresh(const bContext *C, wmGizmoGroup *gzgr
gizmo_prepare_mat(C, v3d, rv3d, &tbounds);
WM_gizmo_set_flag(gz, WM_GIZMO_HIDDEN, false);
- WM_gizmo_set_flag(gz, WM_GIZMO_GRAB_CURSOR, true);
+ WM_gizmo_set_flag(gz, WM_GIZMO_MOVE_CURSOR, true);
float dims[3];
sub_v3_v3v3(dims, rv3d->tw_axis_max, rv3d->tw_axis_min);
@@ -1793,6 +1911,9 @@ static void WIDGETGROUP_xform_cage_refresh(const bContext *C, wmGizmoGroup *gzgr
mid_v3_v3v3(gz->matrix_offset[3], rv3d->tw_axis_max, rv3d->tw_axis_min);
mul_m3_v3(rv3d->tw_axis_matrix, gz->matrix_offset[3]);
+ float matrix_offset_global[4][4];
+ mul_m4_m4m4(matrix_offset_global, gz->matrix_space, gz->matrix_offset);
+
PropertyRNA *prop_center_override = NULL;
float center[3];
float center_global[3];
@@ -1803,17 +1924,20 @@ static void WIDGETGROUP_xform_cage_refresh(const bContext *C, wmGizmoGroup *gzgr
center[1] = (float)(1 - y) * dims[1];
for (int z = 0; z < 3; z++) {
center[2] = (float)(1 - z) * dims[2];
- struct wmGizmoOpElem *mpop = WM_gizmo_operator_get(gz, i);
+ struct wmGizmoOpElem *gzop = WM_gizmo_operator_get(gz, i);
if (prop_center_override == NULL) {
- prop_center_override = RNA_struct_find_property(&mpop->ptr, "center_override");
+ prop_center_override = RNA_struct_find_property(&gzop->ptr, "center_override");
}
- mul_v3_m4v3(center_global, gz->matrix_offset, center);
- RNA_property_float_set_array(&mpop->ptr, prop_center_override, center_global);
+ mul_v3_m4v3(center_global, matrix_offset_global, center);
+ RNA_property_float_set_array(&gzop->ptr, prop_center_override, center_global);
i++;
}
}
}
}
+
+ /* Needed to test view orientation changes. */
+ copy_m3_m4(xgzgroup->prev.viewinv_m3, rv3d->viewinv);
}
static void WIDGETGROUP_xform_cage_message_subscribe(
@@ -1830,7 +1954,6 @@ static void WIDGETGROUP_xform_cage_draw_prepare(const bContext *C, wmGizmoGroup
{
struct XFormCageWidgetGroup *xgzgroup = gzgroup->customdata;
wmGizmo *gz = xgzgroup->gizmo;
-
ViewLayer *view_layer = CTX_data_view_layer(C);
Object *ob = OBACT(view_layer);
if (ob && ob->mode & OB_MODE_EDIT) {
@@ -1839,6 +1962,24 @@ static void WIDGETGROUP_xform_cage_draw_prepare(const bContext *C, wmGizmoGroup
else {
unit_m4(gz->matrix_space);
}
+
+ RegionView3D *rv3d = CTX_wm_region_view3d(C);
+ {
+ Scene *scene = CTX_data_scene(C);
+ switch (scene->orientation_type) {
+ case V3D_MANIP_VIEW:
+ {
+ float viewinv_m3[3][3];
+ copy_m3_m4(viewinv_m3, rv3d->viewinv);
+ if (!equals_m3m3(viewinv_m3, xgzgroup->prev.viewinv_m3)) {
+ /* Take care calling refresh from draw_prepare,
+ * this should be OK because it's only adjusting the cage orientation. */
+ WIDGETGROUP_xform_cage_refresh(C, gzgroup);
+ }
+ break;
+ }
+ }
+ }
}
void VIEW3D_GGT_xform_cage(wmGizmoGroupType *gzgt)
@@ -1859,3 +2000,180 @@ void VIEW3D_GGT_xform_cage(wmGizmoGroupType *gzgt)
}
/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Transform Shear Gizmo
+ * \{ */
+
+struct XFormShearWidgetGroup {
+ wmGizmo *gizmo[3][2];
+ /* Only for view orientation. */
+ struct {
+ float viewinv_m3[3][3];
+ } prev;
+};
+
+static bool WIDGETGROUP_xform_shear_poll(const bContext *C, wmGizmoGroupType *gzgt)
+{
+ if (!ED_gizmo_poll_or_unlink_delayed_from_tool(C, gzgt)) {
+ return false;
+ }
+ View3D *v3d = CTX_wm_view3d(C);
+ if (v3d->gizmo_flag & (V3D_GIZMO_HIDE | V3D_GIZMO_HIDE_TOOL)) {
+ return false;
+ }
+ return true;
+}
+
+static void WIDGETGROUP_xform_shear_setup(const bContext *UNUSED(C), wmGizmoGroup *gzgroup)
+{
+ struct XFormShearWidgetGroup *xgzgroup = MEM_mallocN(sizeof(struct XFormShearWidgetGroup), __func__);
+ const wmGizmoType *gzt_arrow = WM_gizmotype_find("GIZMO_GT_arrow_3d", true);
+ wmOperatorType *ot_shear = WM_operatortype_find("TRANSFORM_OT_shear", true);
+
+ float axis_color[3][3];
+ for (int i = 0; i < 3; i++) {
+ UI_GetThemeColor3fv(TH_AXIS_X + i, axis_color[i]);
+ }
+
+ for (int i = 0; i < 3; i++) {
+ for (int j = 0; j < 2; j++) {
+ wmGizmo *gz = WM_gizmo_new_ptr(gzt_arrow, gzgroup, NULL);
+ RNA_enum_set(gz->ptr, "draw_style", ED_GIZMO_ARROW_STYLE_BOX);
+ const int i_ortho_a = (i + j + 1) % 3;
+ const int i_ortho_b = (i + (1 - j) + 1) % 3;
+ interp_v3_v3v3(gz->color, axis_color[i_ortho_a], axis_color[i_ortho_b], 0.75f);
+ gz->color[3] = 0.5f;
+ PointerRNA *ptr = WM_gizmo_operator_set(gz, 0, ot_shear, NULL);
+ RNA_enum_set(ptr, "shear_axis", 0);
+ RNA_boolean_set(ptr, "release_confirm", 1);
+ xgzgroup->gizmo[i][j] = gz;
+ }
+ }
+
+ gzgroup->customdata = xgzgroup;
+}
+
+static void WIDGETGROUP_xform_shear_refresh(const bContext *C, wmGizmoGroup *gzgroup)
+{
+ ScrArea *sa = CTX_wm_area(C);
+ View3D *v3d = sa->spacedata.first;
+ ARegion *ar = CTX_wm_region(C);
+ RegionView3D *rv3d = ar->regiondata;
+
+ struct XFormShearWidgetGroup *xgzgroup = gzgroup->customdata;
+ struct TransformBounds tbounds;
+
+ if (ED_transform_calc_gizmo_stats(
+ C, &(struct TransformCalcParams) {
+ .use_local_axis = false,
+ }, &tbounds) == 0)
+ {
+ for (int i = 0; i < 3; i++) {
+ for (int j = 0; j < 2; j++) {
+ wmGizmo *gz = xgzgroup->gizmo[i][j];
+ WM_gizmo_set_flag(gz, WM_GIZMO_HIDDEN, true);
+ }
+ }
+ }
+ else {
+ gizmo_prepare_mat(C, v3d, rv3d, &tbounds);
+ for (int i = 0; i < 3; i++) {
+ for (int j = 0; j < 2; j++) {
+ wmGizmo *gz = xgzgroup->gizmo[i][j];
+ WM_gizmo_set_flag(gz, WM_GIZMO_HIDDEN, false);
+ WM_gizmo_set_flag(gz, WM_GIZMO_MOVE_CURSOR, true);
+
+ wmGizmoOpElem *gzop = WM_gizmo_operator_get(gz, 0);
+ const int i_ortho_a = (i + j + 1) % 3;
+ const int i_ortho_b = (i + (1 - j) + 1) % 3;
+ WM_gizmo_set_matrix_rotation_from_yz_axis(gz, rv3d->twmat[i_ortho_a], rv3d->twmat[i]);
+ WM_gizmo_set_matrix_location(gz, rv3d->twmat[3]);
+
+ float axis[3];
+ if (j == 0) {
+ copy_v3_v3(axis, tbounds.axis[i_ortho_b]);
+ }
+ else {
+ negate_v3_v3(axis, tbounds.axis[i_ortho_b]);
+ }
+ RNA_float_set_array(&gzop->ptr, "axis", axis);
+ RNA_float_set_array(&gzop->ptr, "axis_ortho", tbounds.axis[i_ortho_a]);
+ mul_v3_fl(gz->matrix_basis[0], 0.5f);
+ mul_v3_fl(gz->matrix_basis[1], 6.0f);
+ }
+ }
+ }
+
+ /* Needed to test view orientation changes. */
+ copy_m3_m4(xgzgroup->prev.viewinv_m3, rv3d->viewinv);
+}
+
+static void WIDGETGROUP_xform_shear_message_subscribe(
+ const bContext *C, wmGizmoGroup *gzgroup, struct wmMsgBus *mbus)
+{
+ Scene *scene = CTX_data_scene(C);
+ bScreen *screen = CTX_wm_screen(C);
+ ScrArea *sa = CTX_wm_area(C);
+ ARegion *ar = CTX_wm_region(C);
+ gizmo_xform_message_subscribe(gzgroup, mbus, scene, screen, sa, ar, VIEW3D_GGT_xform_shear);
+}
+
+static void WIDGETGROUP_xform_shear_draw_prepare(const bContext *C, wmGizmoGroup *gzgroup)
+{
+ struct XFormShearWidgetGroup *xgzgroup = gzgroup->customdata;
+ RegionView3D *rv3d = CTX_wm_region_view3d(C);
+ {
+ Scene *scene = CTX_data_scene(C);
+ switch (scene->orientation_type) {
+ case V3D_MANIP_VIEW:
+ {
+ float viewinv_m3[3][3];
+ copy_m3_m4(viewinv_m3, rv3d->viewinv);
+ if (!equals_m3m3(viewinv_m3, xgzgroup->prev.viewinv_m3)) {
+ /* Take care calling refresh from draw_prepare,
+ * this should be OK because it's only adjusting the cage orientation. */
+ WIDGETGROUP_xform_shear_refresh(C, gzgroup);
+ }
+ break;
+ }
+ }
+ }
+
+ /* Basic ordering for drawing only. */
+ {
+ LISTBASE_FOREACH (wmGizmo *, gz, &gzgroup->gizmos) {
+ /* Since we have two pairs of each axis,
+ * bias the values so gizmos that are orthogonal to the view get priority.
+ * This means we never default to shearing along the view axis in the case of an overlap. */
+ float axis_order[3], axis_bias[3];
+ copy_v3_v3(axis_order, gz->matrix_basis[2]);
+ copy_v3_v3(axis_bias, gz->matrix_basis[1]);
+ if (dot_v3v3(axis_bias, rv3d->viewinv[2]) < 0.0f) {
+ negate_v3(axis_bias);
+ }
+ madd_v3_v3fl(axis_order, axis_bias, 0.01f);
+ gz->temp.f = dot_v3v3(rv3d->viewinv[2], axis_order);
+ }
+ BLI_listbase_sort(&gzgroup->gizmos, WM_gizmo_cmp_temp_fl_reverse);
+ }
+}
+
+void VIEW3D_GGT_xform_shear(wmGizmoGroupType *gzgt)
+{
+ gzgt->name = "Transform Shear";
+ gzgt->idname = "VIEW3D_GGT_xform_shear";
+
+ gzgt->flag |= WM_GIZMOGROUPTYPE_3D;
+
+ gzgt->gzmap_params.spaceid = SPACE_VIEW3D;
+ gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
+
+ gzgt->poll = WIDGETGROUP_xform_shear_poll;
+ gzgt->setup = WIDGETGROUP_xform_shear_setup;
+ gzgt->refresh = WIDGETGROUP_xform_shear_refresh;
+ gzgt->message_subscribe = WIDGETGROUP_xform_shear_message_subscribe;
+ gzgt->draw_prepare = WIDGETGROUP_xform_shear_draw_prepare;
+}
+
+/** \} */
diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c
index ff87d1e47ef..45a91182c7e 100644
--- a/source/blender/editors/transform/transform_input.c
+++ b/source/blender/editors/transform/transform_input.c
@@ -142,6 +142,18 @@ void setCustomPoints(TransInfo *UNUSED(t), MouseInput *mi, const int mval_start[
data[3] = mval_end[1];
}
+void setCustomPointsFromDirection(TransInfo *t, MouseInput *mi, const float dir[2])
+{
+ BLI_ASSERT_UNIT_V2(dir);
+ const int win_axis = t->ar ? ((abs((int)(t->ar->winx * dir[0])) + abs((int)(t->ar->winy * dir[1]))) / 2) : 1;
+ const int mval_start[2] = {
+ mi->imval[0] + dir[0] * win_axis,
+ mi->imval[1] + dir[1] * win_axis,
+ };
+ const int mval_end[2] = {mi->imval[0], mi->imval[1]};
+ setCustomPoints(t, mi, mval_start, mval_end);
+}
+
static void InputCustomRatioFlip(TransInfo *UNUSED(t), MouseInput *mi, const double mval[2], float output[3])
{
double length;
@@ -338,11 +350,11 @@ void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode)
break;
case INPUT_CUSTOM_RATIO:
mi->apply = InputCustomRatio;
- t->helpline = HLP_NONE;
+ t->helpline = HLP_CARROW;
break;
case INPUT_CUSTOM_RATIO_FLIP:
mi->apply = InputCustomRatioFlip;
- t->helpline = HLP_NONE;
+ t->helpline = HLP_CARROW;
break;
case INPUT_NONE:
default:
@@ -366,6 +378,7 @@ void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode)
case HLP_TRACKBALL:
case HLP_HARROW:
case HLP_VARROW:
+ case HLP_CARROW:
if (t->flag & T_MODAL) {
t->flag |= T_MODAL_CURSOR_SET;
WM_cursor_modal_set(win, CURSOR_NONE);
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index ad51528ad47..d11cfa8d3d3 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -47,6 +47,7 @@
#include "WM_api.h"
#include "WM_message.h"
#include "WM_types.h"
+#include "WM_toolsystem.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -552,11 +553,25 @@ void Transform_Properties(struct wmOperatorType *ot, int flags)
RNA_def_property_ui_text(prop, "Axis", "The axis around which the transformation occurs");
}
+ if (flags & P_AXIS_ORTHO) {
+ prop = RNA_def_property(ot->srna, "axis_ortho", PROP_FLOAT, PROP_DIRECTION);
+ RNA_def_property_array(prop, 3);
+ /* Make this not hidden when there's a nice axis selection widget */
+ RNA_def_property_flag(prop, PROP_HIDDEN);
+ RNA_def_property_ui_text(prop, "Axis", "The orthogonal axis around which the transformation occurs");
+ }
+
if (flags & P_CONSTRAINT) {
RNA_def_boolean_vector(ot->srna, "constraint_axis", 3, NULL, "Constraint Axis", "");
+
+ /* Set by 'constraint_orientation' or gizmo which acts on non-standard orientation. */
+ prop = RNA_def_float_matrix(ot->srna, "constraint_matrix", 3, 3, NULL, 0.0f, 0.0f, "Matrix", "", 0.0f, 0.0f);
+ RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
+
prop = RNA_def_property(ot->srna, "constraint_orientation", PROP_ENUM, PROP_NONE);
RNA_def_property_ui_text(prop, "Orientation", "Transformation orientation");
RNA_def_enum_funcs(prop, rna_TransformOrientation_itemf);
+
}
if (flags & P_MIRROR) {
@@ -637,8 +652,8 @@ void Transform_Properties(struct wmOperatorType *ot, int flags)
static void TRANSFORM_OT_translate(struct wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Translate";
- ot->description = "Translate (move) selected items";
+ ot->name = "Move";
+ ot->description = "Move selected items";
ot->idname = OP_TRANSLATION;
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING;
@@ -831,11 +846,11 @@ static void TRANSFORM_OT_shear(struct wmOperatorType *ot)
ot->poll_property = transform_poll_property;
RNA_def_float(ot->srna, "value", 0, -FLT_MAX, FLT_MAX, "Offset", "", -FLT_MAX, FLT_MAX);
+ RNA_def_enum(ot->srna, "shear_axis", rna_enum_axis_xy_items, 0, "Shear Axis", "");
WM_operatortype_props_advanced_begin(ot);
- Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | P_GPENCIL_EDIT);
- // XXX Shear axis?
+ Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | P_GPENCIL_EDIT | P_AXIS | P_AXIS_ORTHO);
}
static void TRANSFORM_OT_push_pull(struct wmOperatorType *ot)
@@ -1017,27 +1032,6 @@ static void TRANSFORM_OT_edge_crease(struct wmOperatorType *ot)
Transform_Properties(ot, P_SNAP);
}
-static int edge_bevelweight_exec(bContext *C, wmOperator *op)
-{
- Mesh *me = (Mesh *)CTX_data_edit_object(C)->data;
-
- /* auto-enable bevel edge weight drawing, then chain to common transform code */
- me->drawflag |= ME_DRAWBWEIGHTS;
-
- return transform_exec(C, op);
-}
-
-static int edge_bevelweight_invoke(bContext *C, wmOperator *op, const wmEvent *event)
-{
- Mesh *me = (Mesh *)CTX_data_edit_object(C)->data;
-
- /* auto-enable bevel edge weight drawing, then chain to common transform code */
- me->drawflag |= ME_DRAWBWEIGHTS;
-
- return transform_invoke(C, op, event);
-}
-
-
static void TRANSFORM_OT_edge_bevelweight(struct wmOperatorType *ot)
{
/* identifiers */
@@ -1047,8 +1041,8 @@ static void TRANSFORM_OT_edge_bevelweight(struct wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING;
/* api callbacks */
- ot->invoke = edge_bevelweight_invoke;
- ot->exec = edge_bevelweight_exec;
+ ot->invoke = transform_invoke;
+ ot->exec = transform_exec;
ot->modal = transform_modal;
ot->cancel = transform_cancel;
ot->poll = ED_operator_editmesh;
@@ -1132,6 +1126,58 @@ static void TRANSFORM_OT_transform(struct wmOperatorType *ot)
ot, P_AXIS | P_CONSTRAINT | P_PROPORTIONAL | P_MIRROR | P_ALIGN_SNAP | P_GPENCIL_EDIT | P_CENTER);
}
+static int transform_from_gizmo_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *UNUSED(event))
+{
+ bToolRef *tref = WM_toolsystem_ref_from_context(C);
+ if (tref) {
+ ARegion *ar = CTX_wm_region(C);
+ wmGizmoMap *gzmap = ar->gizmo_map;
+ wmGizmoGroup *gzgroup = gzmap ? WM_gizmomap_group_find(gzmap, "TRANSFORM_GGT_gizmo") : NULL;
+ if (gzgroup != NULL) {
+ PointerRNA gzg_ptr;
+ WM_toolsystem_ref_properties_ensure_from_gizmo_group(tref, gzgroup->type, &gzg_ptr);
+ const int drag_action = RNA_enum_get(&gzg_ptr, "drag_action");
+ const char *op_id = NULL;
+ switch (drag_action) {
+ case SCE_GIZMO_SHOW_TRANSLATE:
+ op_id = "TRANSFORM_OT_translate";
+ break;
+ case SCE_GIZMO_SHOW_ROTATE:
+ op_id = "TRANSFORM_OT_rotate";
+ break;
+ case SCE_GIZMO_SHOW_SCALE:
+ op_id = "TRANSFORM_OT_resize";
+ break;
+ default:
+ break;
+ }
+ if (op_id) {
+ wmOperatorType *ot = WM_operatortype_find(op_id, true);
+ PointerRNA op_ptr;
+ WM_operator_properties_create_ptr(&op_ptr, ot);
+ RNA_boolean_set(&op_ptr, "release_confirm", true);
+ WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &op_ptr);
+ WM_operator_properties_free(&op_ptr);
+ return OPERATOR_FINISHED;
+ }
+ }
+ }
+ return OPERATOR_PASS_THROUGH;
+}
+
+/* Use with 'TRANSFORM_GGT_gizmo'. */
+static void TRANSFORM_OT_from_gizmo(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Transform From Gizmo";
+ ot->description = "Transform selected items by mode type";
+ ot->idname = "TRANSFORM_OT_from_gizmo";
+ ot->flag = 0;
+
+ /* api callbacks */
+ ot->invoke = transform_from_gizmo_invoke;
+}
+
void transform_operatortypes(void)
{
TransformModeItem *tmode;
@@ -1145,174 +1191,18 @@ void transform_operatortypes(void)
WM_operatortype_append(TRANSFORM_OT_select_orientation);
WM_operatortype_append(TRANSFORM_OT_create_orientation);
WM_operatortype_append(TRANSFORM_OT_delete_orientation);
+
+ WM_operatortype_append(TRANSFORM_OT_from_gizmo);
}
-void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spaceid)
+void ED_keymap_transform(wmKeyConfig *keyconf)
{
- wmKeyMapItem *kmi;
- wmKeyMap *modalmap;
-
- /* transform.c, only adds modal map once, checks if it's there */
- modalmap = transform_modal_keymap(keyconf);
-
- /* assign map to operators only the first time */
- if (modalmap) {
- TransformModeItem *tmode;
-
- for (tmode = transform_modes; tmode->idname; tmode++) {
- WM_modalkeymap_assign(modalmap, tmode->idname);
- }
- WM_modalkeymap_assign(modalmap, "TRANSFORM_OT_transform");
- }
-
- switch (spaceid) {
- case SPACE_VIEW3D:
- WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
-
- WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
+ wmKeyMap *modalmap = transform_modal_keymap(keyconf);
- WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, OP_BEND, WKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, OP_TOSPHERE, SKEY, KM_PRESS, KM_ALT | KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, OP_SHEAR, SKEY, KM_PRESS, KM_ALT | KM_CTRL | KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "TRANSFORM_OT_select_orientation", SPACEKEY, KM_PRESS, KM_ALT, 0);
-
-#ifdef USE_WM_KEYMAP_27X
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_create_orientation", SPACEKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "use", true);
-#endif
-
- WM_keymap_add_item(keymap, OP_MIRROR, MKEY, KM_PRESS, KM_CTRL, 0);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TABKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.use_snap");
-
- WM_keymap_add_panel(keymap, "VIEW3D_PT_snapping", TABKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
-
- /* Will fall-through to texture-space transform. */
- kmi = WM_keymap_add_item(keymap, "OBJECT_OT_transform_axis_target", TKEY, KM_PRESS, KM_SHIFT, 0);
-
-#ifdef USE_WM_KEYMAP_27X
- kmi = WM_keymap_add_item(keymap, OP_TRANSLATION, TKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "texture_space", true);
-
- kmi = WM_keymap_add_item(keymap, OP_RESIZE, TKEY, KM_PRESS, KM_SHIFT | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "texture_space", true);
-#endif
-
- WM_keymap_add_item(keymap, OP_SKIN_RESIZE, AKEY, KM_PRESS, KM_CTRL, 0);
+ TransformModeItem *tmode;
- break;
- case SPACE_ACTION:
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", GKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_TIME_TRANSLATE);
-
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EVT_TWEAK_S, KM_ANY, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_TIME_TRANSLATE);
-
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_TIME_EXTEND);
-
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_TIME_SCALE);
-
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", TKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_TIME_SLIDE);
- break;
- case SPACE_IPO:
- WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_TIME_EXTEND);
-
- WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
- break;
- case SPACE_NLA:
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", GKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_TRANSLATION);
-
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EVT_TWEAK_S, KM_ANY, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_TRANSLATION);
-
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_TIME_EXTEND);
-
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_TIME_SCALE);
- break;
- case SPACE_NODE:
- WM_keymap_add_item(keymap, "NODE_OT_translate_attach", GKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "NODE_OT_translate_attach", EVT_TWEAK_A, KM_ANY, 0, 0);
- WM_keymap_add_item(keymap, "NODE_OT_translate_attach", EVT_TWEAK_S, KM_ANY, 0, 0);
- /* NB: small trick: macro operator poll may fail due to library data edit,
- * in that case the secondary regular operators are called with same keymap.
- */
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_translate", GKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "release_confirm", true);
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_translate", EVT_TWEAK_A, KM_ANY, 0, 0);
- RNA_boolean_set(kmi->ptr, "release_confirm", true);
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_translate", EVT_TWEAK_S, KM_ANY, 0, 0);
- RNA_boolean_set(kmi->ptr, "release_confirm", true);
-
- WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
-
- /* detach and translate */
- WM_keymap_add_item(keymap, "NODE_OT_move_detach_links", DKEY, KM_PRESS, KM_ALT, 0);
- /* XXX release_confirm is set in the macro operator definition */
- WM_keymap_add_item(keymap, "NODE_OT_move_detach_links_release", EVT_TWEAK_A, KM_ANY, KM_ALT, 0);
- WM_keymap_add_item(keymap, "NODE_OT_move_detach_links", EVT_TWEAK_S, KM_ANY, KM_ALT, 0);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TABKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.use_snap");
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_menu_enum", TABKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.snap_node_element");
- break;
- case SPACE_SEQ:
- WM_keymap_add_item(keymap, OP_SEQ_SLIDE, GKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, OP_SEQ_SLIDE, EVT_TWEAK_S, KM_ANY, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "mode", TFM_TIME_EXTEND);
- break;
- case SPACE_IMAGE:
- WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
-
- WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, OP_SHEAR, SKEY, KM_PRESS, KM_ALT | KM_CTRL | KM_SHIFT, 0);
-
- WM_keymap_add_item(keymap, "TRANSFORM_OT_mirror", MKEY, KM_PRESS, KM_CTRL, 0);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TABKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.use_snap");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_menu_enum", TABKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.snap_uv_element");
- break;
- case SPACE_CLIP:
- WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
- WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
- break;
- default:
- break;
+ for (tmode = transform_modes; tmode->idname; tmode++) {
+ WM_modalkeymap_assign(modalmap, tmode->idname);
}
+ WM_modalkeymap_assign(modalmap, "TRANSFORM_OT_transform");
}
diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c
index b22cf3bd338..447842e9bf0 100644
--- a/source/blender/editors/transform/transform_orientations.c
+++ b/source/blender/editors/transform/transform_orientations.c
@@ -487,6 +487,10 @@ void initTransformOrientation(bContext *C, TransInfo *t)
ED_view3d_cursor3d_calc_mat3(t->scene, CTX_wm_view3d(C), t->spacemtx);
break;
}
+ case V3D_MANIP_CUSTOM_MATRIX:
+ /* Already set. */
+ BLI_strncpy(t->spacename, IFACE_("custom"), sizeof(t->spacename));
+ break;
case V3D_MANIP_CUSTOM:
BLI_strncpy(t->spacename, t->custom_orientation->name, sizeof(t->spacename));
@@ -659,7 +663,7 @@ int getTransformOrientation_ex(const bContext *C, float normal[3], float plane[3
}
if (em->bm->totedgesel >= 1) {
- /* find an edge thats apart of v_tri (no need to search all edges) */
+ /* find an edge that's apart of v_tri (no need to search all edges) */
float e_length;
int j;
@@ -793,12 +797,7 @@ int getTransformOrientation_ex(const bContext *C, float normal[3], float plane[3
}
}
- if (is_zero_v3(plane)) {
- result = ORIENTATION_VERT;
- }
- else {
- result = ORIENTATION_EDGE;
- }
+ result = is_zero_v3(plane) ? ORIENTATION_VERT : ORIENTATION_EDGE;
}
else if (em->bm->totvertsel > 3) {
BMIter iter;
@@ -840,7 +839,8 @@ int getTransformOrientation_ex(const bContext *C, float normal[3], float plane[3
}
}
else {
- const bool use_handle = (cu->drawflag & CU_HIDE_HANDLES) == 0;
+ View3D *v3d = CTX_wm_view3d(C);
+ const bool use_handle = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) != 0;
for (nu = nurbs->first; nu; nu = nu->next) {
/* only bezier has a normal */
@@ -1101,6 +1101,11 @@ void ED_getTransformOrientationMatrix(const bContext *C, float orientation_mat[3
type = getTransformOrientation_ex(C, normal, plane, around);
+ /* Fallback, when the plane can't be calculated. */
+ if (ORIENTATION_USE_PLANE(type) && is_zero_v3(plane)) {
+ type = ORIENTATION_VERT;
+ }
+
switch (type) {
case ORIENTATION_NORMAL:
if (createSpaceNormalTangent(orientation_mat, normal, plane) == 0) {
@@ -1124,7 +1129,10 @@ void ED_getTransformOrientationMatrix(const bContext *C, float orientation_mat[3
break;
default:
BLI_assert(type == ORIENTATION_NONE);
- unit_m3(orientation_mat);
break;
}
+
+ if (type == ORIENTATION_NONE) {
+ unit_m3(orientation_mat);
+ }
}
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index 8188cb3f51c..22eb817c2b1 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -53,6 +53,7 @@
#include "GPU_state.h"
#include "BKE_global.h"
+#include "BKE_layer.h"
#include "BKE_object.h"
#include "BKE_anim.h" /* for duplis */
#include "BKE_context.h"
@@ -593,7 +594,7 @@ static void initSnappingMode(TransInfo *t)
(bool (*)(BMVert *, void *))BM_elem_cb_check_hflag_disabled,
bm_edge_is_snap_target,
bm_face_is_snap_target,
- SET_UINT_IN_POINTER((BM_ELEM_SELECT | BM_ELEM_HIDDEN)));
+ POINTER_FROM_UINT((BM_ELEM_SELECT | BM_ELEM_HIDDEN)));
}
}
}
@@ -991,7 +992,12 @@ static void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
UI_view2d_region_to_view(&t->ar->v2d, t->mval[0], t->mval[1], &co[0], &co[1]);
- if (ED_uvedit_nearest_uv(t->scene, TRANS_DATA_CONTAINER_FIRST_EVIL(t)->obedit, ima, co, t->tsnap.snapPoint)) {
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(
+ t->view_layer, &objects_len);
+
+ float dist_sq = FLT_MAX;
+ if (ED_uvedit_nearest_uv_multi(t->scene, ima, objects, objects_len, co, &dist_sq, t->tsnap.snapPoint)) {
t->tsnap.snapPoint[0] *= t->aspect[0];
t->tsnap.snapPoint[1] *= t->aspect[1];
@@ -1000,6 +1006,7 @@ static void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
else {
t->tsnap.status &= ~POINT_INIT;
}
+ MEM_freeN(objects);
}
}
else if (t->spacetype == SPACE_NODE) {
diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index 33eb481e528..aecbb22072d 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -100,6 +100,7 @@ typedef struct SnapObjectData {
typedef struct SnapObjectData_Mesh {
SnapObjectData sd;
BVHTreeFromMesh treedata;
+ const struct MPoly *poly;
BVHTree *bvhtree[2]; /* from loose verts and from loose edges */
uint has_looptris : 1;
uint has_loose_edge : 1;
@@ -172,29 +173,43 @@ static void min_max_from_bmesh(
}
}
-static SnapObjectData_Mesh *snap_object_data_mesh_create(SnapObjectContext *sctx)
+static SnapObjectData_Mesh *snap_object_data_mesh_get(SnapObjectContext *sctx, Object *ob)
{
- SnapObjectData_Mesh *sod = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(*sod));
- sod->sd.type = SNAP_MESH;
- /* start assuming that it has each of these element types */
- sod->has_looptris = true;
- sod->has_loose_edge = true;
- sod->has_loose_vert = true;
-
- return sod;
+ void **sod_p;
+ if (BLI_ghash_ensure_p(sctx->cache.object_map, ob, &sod_p)) {
+ BLI_assert(((SnapObjectData *)*sod_p)->type == SNAP_MESH);
+ }
+ else {
+ SnapObjectData_Mesh *sod = *sod_p = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(*sod));
+ sod->sd.type = SNAP_MESH;
+ /* start assuming that it has each of these element types */
+ sod->has_looptris = true;
+ sod->has_loose_edge = true;
+ sod->has_loose_vert = true;
+ }
+
+ return *sod_p;
}
-static SnapObjectData_EditMesh *snap_object_data_editmesh_create(SnapObjectContext *sctx, BMesh *bm)
+/* Use `em->ob` as the key in ghash since the editmesh is used
+ * to create bvhtree and is the same for each linked object. */
+static SnapObjectData_EditMesh *snap_object_data_editmesh_get(SnapObjectContext *sctx, BMEditMesh *em)
{
- SnapObjectData_EditMesh *sod = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(*sod));
- sod->sd.type = SNAP_EDIT_MESH;
- min_max_from_bmesh(bm, sod->min, sod->max);
+ void **sod_p;
+ if (BLI_ghash_ensure_p(sctx->cache.object_map, em->ob, &sod_p)) {
+ BLI_assert(((SnapObjectData *)*sod_p)->type == SNAP_EDIT_MESH);
+ }
+ else {
+ SnapObjectData_EditMesh *sod = *sod_p = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(*sod));
+ sod->sd.type = SNAP_EDIT_MESH;
+ min_max_from_bmesh(em->bm, sod->min, sod->max);
+ }
- return sod;
+ return *sod_p;
}
/**
- * Walks through all objects in the scene to create the list of objets to snap.
+ * Walks through all objects in the scene to create the list of objects to snap.
*
* \param sctx: Snap context to store data.
* \param snap_select : from enum eSnapSelect.
@@ -399,15 +414,7 @@ static bool raycastMesh(
}
}
- SnapObjectData_Mesh *sod = NULL;
-
- void **sod_p;
- if (BLI_ghash_ensure_p(sctx->cache.object_map, ob, &sod_p)) {
- sod = *sod_p;
- }
- else {
- sod = *sod_p = snap_object_data_mesh_create(sctx);
- }
+ SnapObjectData_Mesh *sod = snap_object_data_mesh_get(sctx, ob);
BVHTreeFromMesh *treedata = &sod->treedata;
@@ -428,12 +435,19 @@ static bool raycastMesh(
if (treedata->looptri && treedata->looptri_allocated == false) {
treedata->looptri = BKE_mesh_runtime_looptri_ensure(me);
}
+ /* required for snapping with occlusion. */
+ treedata->edge = me->medge;
+ sod->poly = me->mpoly;
}
}
if (treedata->tree == NULL) {
BKE_bvhtree_from_mesh_get(treedata, me, BVHTREE_FROM_LOOPTRI, 4);
+ /* required for snapping with occlusion. */
+ treedata->edge = me->medge;
+ sod->poly = me->mpoly;
+
if (treedata->tree == NULL) {
return retval;
}
@@ -533,22 +547,9 @@ static bool raycastEditMesh(
return retval;
}
- SnapObjectData_EditMesh *sod = NULL;
- BVHTreeFromEditMesh *treedata = NULL;
- Object *em_ob = em->ob;
-
- BLI_assert(em_ob->data == BKE_object_get_pre_modified_mesh(ob));
-
- void **sod_p;
- /* Use `em->ob` as the key in ghash since the editmesh is used
- * to create bvhtree and is the same for each linked object. */
- if (BLI_ghash_ensure_p(sctx->cache.object_map, em_ob, &sod_p)) {
- sod = *sod_p;
- }
- else {
- sod = *sod_p = snap_object_data_editmesh_create(sctx, em->bm);
- }
+ BLI_assert(em->ob->data == BKE_object_get_pre_modified_mesh(ob));
+ SnapObjectData_EditMesh *sod = snap_object_data_editmesh_get(sctx, em);
{
float min[3], max[3];
mul_v3_m4v3(min, obmat, sod->min);
@@ -562,11 +563,12 @@ static bool raycastEditMesh(
}
if (sod->bvh_trees[2] == NULL) {
- sod->bvh_trees[2] = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(*treedata));
+ sod->bvh_trees[2] = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(BVHTreeFromEditMesh));
}
- treedata = sod->bvh_trees[2];
- BVHCache *em_bvh_cache = ((Mesh *)em_ob->data)->runtime.bvh_cache;
+ BVHTreeFromEditMesh *treedata = sod->bvh_trees[2];
+
+ BVHCache *em_bvh_cache = ((Mesh *)em->ob->data)->runtime.bvh_cache;
if (sctx->callbacks.edit_mesh.test_face_fn == NULL) {
/* The tree is owned by the Mesh and may have been freed since we last used! */
@@ -727,7 +729,7 @@ static bool raycastObj(
if (use_occlusion_test) {
if (use_obedit && sctx->use_v3d &&
- !(sctx->v3d_data.v3d->flag & V3D_ZBUF_SELECT))
+ !V3D_IS_ZBUF(sctx->v3d_data.v3d))
{
/* Use of occlude geometry in editing mode disabled. */
return false;
@@ -736,22 +738,29 @@ static bool raycastObj(
switch (ob->type) {
case OB_MESH:
- if (use_obedit && BKE_object_is_in_editmode(ob)) {
+ {
+ Mesh *me = ob->data;
+ if (BKE_object_is_in_editmode(ob)) {
BMEditMesh *em = BKE_editmesh_from_object(ob);
- retval = raycastEditMesh(
- sctx,
- ray_start, ray_dir,
- ob, em, obmat, ob_index,
- ray_depth, r_loc, r_no, r_index, r_hit_list);
- }
- else {
- retval = raycastMesh(
- sctx,
- ray_start, ray_dir,
- ob, ob->data, obmat, ob_index,
- ray_depth, r_loc, r_no, r_index, r_hit_list);
+ if (use_obedit) {
+ retval = raycastEditMesh(
+ sctx,
+ ray_start, ray_dir,
+ ob, em, obmat, ob_index,
+ ray_depth, r_loc, r_no, r_index, r_hit_list);
+ break;
+ }
+ else if (em->mesh_eval_final) {
+ me = em->mesh_eval_final;
+ }
}
+ retval = raycastMesh(
+ sctx,
+ ray_start, ray_dir,
+ ob, me, obmat, ob_index,
+ ray_depth, r_loc, r_no, r_index, r_hit_list);
break;
+ }
}
if (retval) {
@@ -1202,12 +1211,11 @@ static short snap_mesh_polygon(
nearest2d.get_edge_verts_index = (Nearest2DGetEdgeVertsCallback)cb_medge_verts_get;
nearest2d.copy_vert_no = (Nearest2DCopyVertNoCallback)cb_mvert_no_copy;
- MPoly *mp = &((Mesh *)ob->data)->mpoly[*r_index];
- const MLoop *ml;
+ const MPoly *mp = &((SnapObjectData_Mesh *)sod)->poly[*r_index];
+ const MLoop *ml = &treedata->loop[mp->loopstart];
if (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) {
elem = SCE_SNAP_MODE_EDGE;
- treedata->edge = ((Mesh *)ob->data)->medge;
- ml = &treedata->loop[mp->loopstart];
+ BLI_assert(treedata->edge != NULL);
for (int i = mp->totloop; i--; ml++) {
cb_snap_edge(
&nearest2d, ml->e, &neasrest_precalc,
@@ -1217,7 +1225,6 @@ static short snap_mesh_polygon(
}
else {
elem = SCE_SNAP_MODE_VERTEX;
- ml = &treedata->loop[mp->loopstart];
for (int i = mp->totloop; i--; ml++) {
cb_snap_vert(
&nearest2d, ml->v, &neasrest_precalc,
@@ -1850,15 +1857,7 @@ static short snapMesh(
}
}
- SnapObjectData_Mesh *sod = NULL;
-
- void **sod_p;
- if (BLI_ghash_ensure_p(sctx->cache.object_map, ob, &sod_p)) {
- sod = *sod_p;
- }
- else {
- sod = *sod_p = snap_object_data_mesh_create(sctx);
- }
+ SnapObjectData_Mesh *sod = snap_object_data_mesh_get(sctx, ob);
BVHTreeFromMesh *treedata, dummy_treedata;
BVHTree **bvhtree;
@@ -2053,22 +2052,12 @@ static short snapEditMesh(
}
}
- SnapObjectData_EditMesh *sod = NULL;
BVHTreeFromEditMesh *treedata_vert = NULL, *treedata_edge = NULL;
- Object *em_ob = em->ob;
- BLI_assert(em_ob->data == BKE_object_get_pre_modified_mesh(ob));
+ BLI_assert(em->ob->data == BKE_object_get_pre_modified_mesh(ob));
UNUSED_VARS_NDEBUG(ob);
- void **sod_p;
- /* Use `em->ob` as the key in ghash since the editmesh is used
- * to create bvhtree and is the same for each linked object. */
- if (BLI_ghash_ensure_p(sctx->cache.object_map, em_ob, &sod_p)) {
- sod = *sod_p;
- }
- else {
- sod = *sod_p = snap_object_data_editmesh_create(sctx, em->bm);
- }
+ SnapObjectData_EditMesh *sod = snap_object_data_editmesh_get(sctx, em);
float dist_px_sq = SQUARE(*dist_px);
@@ -2091,7 +2080,7 @@ static short snapEditMesh(
}
}
- BVHCache *em_bvh_cache = ((Mesh *)em_ob->data)->runtime.bvh_cache;
+ BVHCache *em_bvh_cache = ((Mesh *)em->ob->data)->runtime.bvh_cache;
if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) {
if (sod->bvh_trees[0] == NULL) {
@@ -2243,21 +2232,27 @@ static short snapObject(
switch (ob->type) {
case OB_MESH:
- if (use_obedit && BKE_object_is_in_editmode(ob)) {
+ {
+ Mesh *me = ob->data;
+ if (BKE_object_is_in_editmode(ob)) {
BMEditMesh *em = BKE_editmesh_from_object(ob);
- retval = snapEditMesh(
- sctx, snapdata, ob, em, obmat,
- dist_px,
- r_loc, r_no, r_index);
- }
- else {
- retval = snapMesh(
- sctx, snapdata, ob, ob->data, obmat,
- dist_px,
- r_loc, r_no, r_index);
+ if (use_obedit) {
+ retval = snapEditMesh(
+ sctx, snapdata, ob, em, obmat,
+ dist_px,
+ r_loc, r_no, r_index);
+ break;
+ }
+ else if (em->mesh_eval_final) {
+ me = em->mesh_eval_final;
+ }
}
+ retval = snapMesh(
+ sctx, snapdata, ob, me, obmat,
+ dist_px,
+ r_loc, r_no, r_index);
break;
-
+ }
case OB_ARMATURE:
retval = snapArmature(
snapdata,
@@ -2601,12 +2596,12 @@ static short transform_snap_context_project_view3d_mixed_impl(
bool use_occlusion_test =
params->use_occlusion_test &&
- !(sctx->v3d_data.v3d->shading.flag & V3D_SHADING_XRAY);
+ !(sctx->v3d_data.v3d->shading.flag & V3D_XRAY_FLAG(sctx->v3d_data.v3d));
if (snap_to_flag & SCE_SNAP_MODE_FACE || use_occlusion_test) {
float ray_start[3], ray_normal[3];
- if (!ED_view3d_win_to_ray_ex(
+ if (!ED_view3d_win_to_ray_clipped_ex(
sctx->depsgraph,
sctx->v3d_data.ar, sctx->v3d_data.v3d,
mval, NULL, ray_normal, ray_start, true))
@@ -2770,7 +2765,7 @@ bool ED_transform_snap_object_project_all_view3d_ex(
{
float ray_start[3], ray_normal[3];
- if (!ED_view3d_win_to_ray_ex(
+ if (!ED_view3d_win_to_ray_clipped_ex(
sctx->depsgraph,
sctx->v3d_data.ar, sctx->v3d_data.v3d,
mval, NULL, ray_normal, ray_start, true))
diff --git a/source/blender/editors/undo/CMakeLists.txt b/source/blender/editors/undo/CMakeLists.txt
index 89832604ed8..2e3e73f34f4 100644
--- a/source/blender/editors/undo/CMakeLists.txt
+++ b/source/blender/editors/undo/CMakeLists.txt
@@ -22,6 +22,7 @@ set(INC
../include
../../blenkernel
../../blenlib
+ ../../blenloader
../../blentranslation
../../makesdna
../../makesrna
diff --git a/source/blender/editors/undo/ed_undo.c b/source/blender/editors/undo/ed_undo.c
index 279f3e7cf38..8b4292dedbd 100644
--- a/source/blender/editors/undo/ed_undo.c
+++ b/source/blender/editors/undo/ed_undo.c
@@ -48,6 +48,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_main.h"
+#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
#include "BKE_layer.h"
@@ -55,6 +56,8 @@
#include "BKE_workspace.h"
#include "BKE_paint.h"
+#include "BLO_writefile.h"
+
#include "ED_gpencil.h"
#include "ED_render.h"
#include "ED_object.h"
@@ -108,11 +111,10 @@ void ED_undo_push(bContext *C, const char *str)
}
/* note: also check undo_history_exec() in bottom if you change notifiers */
-static int ed_undo_step(bContext *C, int step, const char *undoname)
+static int ed_undo_step(bContext *C, int step, const char *undoname, ReportList *reports)
{
CLOG_INFO(&LOG, 1, "name='%s', step=%d", undoname, step);
wmWindowManager *wm = CTX_wm_manager(C);
- wmWindow *win = CTX_wm_window(C);
Scene *scene = CTX_data_scene(C);
ScrArea *sa = CTX_wm_area(C);
@@ -120,6 +122,14 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
* or they can just lead to freezing job in some other cases */
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()) {
@@ -193,16 +203,22 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
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);
+ }
+ }
+
WM_event_add_notifier(C, NC_WINDOW, NULL);
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 (win) {
- win->addmousemove = true;
- }
-
return OPERATOR_FINISHED;
}
@@ -221,11 +237,11 @@ void ED_undo_grouped_push(bContext *C, const char *str)
void ED_undo_pop(bContext *C)
{
- ed_undo_step(C, 1, NULL);
+ ed_undo_step(C, 1, NULL, NULL);
}
void ED_undo_redo(bContext *C)
{
- ed_undo_step(C, -1, NULL);
+ ed_undo_step(C, -1, NULL, NULL);
}
void ED_undo_push_op(bContext *C, wmOperator *op)
@@ -247,7 +263,7 @@ void ED_undo_grouped_push_op(bContext *C, wmOperator *op)
void ED_undo_pop_op(bContext *C, wmOperator *op)
{
/* search back a couple of undo's, in case something else added pushes */
- ed_undo_step(C, 0, op->type->name);
+ ed_undo_step(C, 0, op->type->name, op->reports);
}
/* name optionally, function used to check for operator redo panel */
@@ -276,11 +292,16 @@ UndoStack *ED_undo_stack_get(void)
/** \name Undo, Undo Push & Redo Operators
* \{ */
-static int ed_undo_exec(bContext *C, wmOperator *UNUSED(op))
+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));
- return ed_undo_step(C, 1, NULL);
+ int ret = ed_undo_step(C, 1, NULL, op->reports);
+ if (ret & OPERATOR_FINISHED) {
+ /* Keep button under the cursor active. */
+ WM_event_add_mousemove(C);
+ }
+ return ret;
}
static int ed_undo_push_exec(bContext *C, wmOperator *op)
@@ -291,16 +312,26 @@ static int ed_undo_push_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int ed_redo_exec(bContext *C, wmOperator *UNUSED(op))
+static int ed_redo_exec(bContext *C, wmOperator *op)
{
- return ed_undo_step(C, -1, NULL);
+ int ret = ed_undo_step(C, -1, NULL, op->reports);
+ if (ret & OPERATOR_FINISHED) {
+ /* Keep button under the cursor active. */
+ WM_event_add_mousemove(C);
+ }
+ return ret;
}
static int ed_undo_redo_exec(bContext *C, wmOperator *UNUSED(op))
{
wmOperator *last_op = WM_operator_last_redo(C);
- const int ret = ED_undo_operator_repeat(C, last_op);
- return ret ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+ int ret = ED_undo_operator_repeat(C, last_op);
+ ret = ret ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+ if (ret & OPERATOR_FINISHED) {
+ /* Keep button under the cursor active. */
+ WM_event_add_mousemove(C);
+ }
+ return ret;
}
static bool ed_undo_redo_poll(bContext *C)
diff --git a/source/blender/editors/undo/memfile_undo.c b/source/blender/editors/undo/memfile_undo.c
index d45470ab0a1..4b38ab282a0 100644
--- a/source/blender/editors/undo/memfile_undo.c
+++ b/source/blender/editors/undo/memfile_undo.c
@@ -83,7 +83,7 @@ static bool memfile_undosys_step_encode(struct bContext *C, UndoStep *us_p)
static void memfile_undosys_step_decode(struct bContext *C, UndoStep *us_p, int UNUSED(dir))
{
/* Loading the content will correctly switch into compatible non-object modes. */
- ED_object_mode_set(C, OB_MODE_OBJECT);
+ ED_object_mode_exit(C);
MemFileUndoStep *us = (MemFileUndoStep *)us_p;
BKE_memfile_undo_decode(us->data, C);
diff --git a/source/blender/editors/util/CMakeLists.txt b/source/blender/editors/util/CMakeLists.txt
index 3fd8656ad2c..6bef0f77e1a 100644
--- a/source/blender/editors/util/CMakeLists.txt
+++ b/source/blender/editors/util/CMakeLists.txt
@@ -42,6 +42,7 @@ set(INC_SYS
set(SRC
ed_transverts.c
ed_util.c
+ gizmo_utils.c
numinput.c
select_utils.c
@@ -56,6 +57,7 @@ set(SRC
../include/ED_datafiles.h
../include/ED_fileselect.h
../include/ED_gizmo_library.h
+ ../include/ED_gizmo_utils.h
../include/ED_gpencil.h
../include/ED_image.h
../include/ED_info.h
diff --git a/source/blender/editors/util/ed_transverts.c b/source/blender/editors/util/ed_transverts.c
index 3cd74f1266f..583d1116eec 100644
--- a/source/blender/editors/util/ed_transverts.c
+++ b/source/blender/editors/util/ed_transverts.c
@@ -43,6 +43,7 @@
#include "BKE_editmesh.h"
#include "BKE_DerivedMesh.h"
#include "BKE_context.h"
+#include "BKE_mesh_iterators.h"
#include "DEG_depsgraph.h"
@@ -304,9 +305,9 @@ void ED_transverts_create_from_obedit(TransVertStore *tvs, Object *obedit, const
userdata[1] = tvs->transverts;
}
- if (tvs->transverts && em->derivedCage) {
+ if (tvs->transverts && em->mesh_eval_cage) {
BM_mesh_elem_table_ensure(bm, BM_VERT);
- em->derivedCage->foreachMappedVert(em->derivedCage, set_mapped_co, userdata, DM_FOREACH_NOP);
+ BKE_mesh_foreach_mapped_vert(em->mesh_eval_cage, set_mapped_co, userdata, MESH_FOREACH_NOP);
}
}
else if (obedit->type == OB_ARMATURE) {
diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c
index 35a77fcd4c0..f316b1a61cb 100644
--- a/source/blender/editors/util/ed_util.c
+++ b/source/blender/editors/util/ed_util.c
@@ -28,7 +28,6 @@
* \ingroup edutil
*/
-
#include <stdlib.h>
#include <string.h>
#include <math.h>
@@ -54,15 +53,15 @@
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_layer.h"
#include "BKE_main.h"
#include "BKE_multires.h"
#include "BKE_object.h"
#include "BKE_packedFile.h"
#include "BKE_paint.h"
#include "BKE_screen.h"
-#include "BKE_workspace.h"
-#include "BKE_layer.h"
#include "BKE_undo_system.h"
+#include "BKE_workspace.h"
#include "ED_armature.h"
#include "ED_buttons.h"
@@ -116,11 +115,15 @@ void ED_editors_init(bContext *C)
/* pass */
}
else if (!BKE_object_has_mode_data(ob, mode)) {
- /* For multi-edit mode we may already have mode data. */
- ID *data = ob->data;
- ob->mode = OB_MODE_OBJECT;
- if ((ob == obact) && !ID_IS_LINKED(ob) && !(data && ID_IS_LINKED(data))) {
- ED_object_mode_toggle(C, mode);
+ /* For multi-edit mode we may already have mode data.
+ * (grease pencil does not need it)
+ */
+ if (ob->type != OB_GPENCIL) {
+ ID *data = ob->data;
+ ob->mode = OB_MODE_OBJECT;
+ if ((ob == obact) && !ID_IS_LINKED(ob) && !(data && ID_IS_LINKED(data))) {
+ ED_object_mode_toggle(C, mode);
+ }
}
}
}
@@ -344,6 +347,8 @@ void ED_region_draw_mouse_line_cb(const bContext *C, ARegion *ar, void *arg_info
const uint shdr_pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+ GPU_line_width(1.0f);
+
immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR);
float viewport_size[4];
diff --git a/source/blender/editors/util/gizmo_utils.c b/source/blender/editors/util/gizmo_utils.c
new file mode 100644
index 00000000000..6b150f93e38
--- /dev/null
+++ b/source/blender/editors/util/gizmo_utils.c
@@ -0,0 +1,76 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file gizmo_utils.c
+ * \ingroup edutil
+ *
+ * \name Generic Gizmo Utilities.
+ */
+
+#include <string.h>
+
+#include "BLI_utildefines.h"
+
+#include "BKE_context.h"
+
+#include "DNA_workspace_types.h"
+
+#include "WM_types.h"
+#include "WM_api.h"
+#include "WM_toolsystem.h"
+
+#include "ED_gizmo_utils.h"
+
+bool ED_gizmo_poll_or_unlink_delayed_from_operator(
+ const bContext *C, wmGizmoGroupType *gzgt,
+ const char *idname)
+{
+#if 0
+ /* Causes selection to continue showing the last gizmo. */
+ wmOperator *op = WM_operator_last_redo(C);
+#else
+ wmWindowManager *wm = CTX_wm_manager(C);
+ wmOperator *op = wm->operators.last;
+#endif
+
+ if (op == NULL || !STREQ(op->type->idname, idname)) {
+ WM_gizmo_group_type_unlink_delayed_ptr(gzgt);
+ return false;
+ }
+ return true;
+}
+
+bool ED_gizmo_poll_or_unlink_delayed_from_tool_ex(const bContext *C, wmGizmoGroupType *gzgt, const char *gzgt_idname)
+{
+ bToolRef_Runtime *tref_rt = WM_toolsystem_runtime_from_context((bContext *)C);
+ if ((tref_rt == NULL) ||
+ !STREQ(gzgt_idname, tref_rt->gizmo_group))
+ {
+ WM_gizmo_group_type_unlink_delayed_ptr(gzgt);
+ return false;
+ }
+ return true;
+}
+
+/** Can use this as poll function directly. */
+bool ED_gizmo_poll_or_unlink_delayed_from_tool(const bContext *C, wmGizmoGroupType *gzgt)
+{
+ return ED_gizmo_poll_or_unlink_delayed_from_tool_ex(C, gzgt, gzgt->idname);
+}
diff --git a/source/blender/editors/util/numinput.c b/source/blender/editors/util/numinput.c
index f64182d2ad6..52cf1b2d708 100644
--- a/source/blender/editors/util/numinput.c
+++ b/source/blender/editors/util/numinput.c
@@ -254,6 +254,32 @@ static bool editstr_insert_at_cursor(NumInput *n, const char *buf, const int buf
return true;
}
+bool user_string_to_number(bContext *C, const char *str, const UnitSettings *unit, int type, double *r_value)
+{
+#ifdef WITH_PYTHON
+ double unit_scale = BKE_scene_unit_scale(unit, type, 1.0);
+ if (!bUnit_ContainsUnit(str, unit->system, type)) {
+ int success = BPY_execute_string_as_number(C, NULL, str, true, r_value);
+ *r_value *= bUnit_PreferredUnitScalar(unit, type);
+ *r_value /= unit_scale;
+ return success;
+ }
+ else {
+ char str_unit_convert[256];
+ BLI_strncpy(str_unit_convert, str, sizeof(str_unit_convert));
+ bUnit_ReplaceString(
+ str_unit_convert, sizeof(str_unit_convert), str,
+ unit_scale, unit->system, type);
+
+ return BPY_execute_string_as_number(C, NULL, str_unit_convert, true, r_value);
+ }
+#else
+ *r_value = atof(str);
+ return true;
+#endif
+}
+
+
static bool editstr_is_simple_numinput(const char ascii)
{
if (ascii >= '0' && ascii <= '9') {
@@ -519,38 +545,18 @@ bool handleNumInput(bContext *C, NumInput *n, const wmEvent *event)
/* At this point, our value has changed, try to interpret it with python (if str is not empty!). */
if (n->str[0]) {
const float val_prev = n->val[idx];
- double val;
-#ifdef WITH_PYTHON
Scene *sce = CTX_data_scene(C);
- char str_unit_convert[NUM_STR_REP_LEN * 6]; /* Should be more than enough! */
- const char *default_unit = NULL;
-
- /* Use scale_length if needed! */
- const float fac = (float)BKE_scene_unit_scale(&sce->unit, n->unit_type[idx], 1.0);
-
- /* Make radian default unit when needed. */
- if (n->unit_use_radians && n->unit_type[idx] == B_UNIT_ROTATION) {
- default_unit = "r";
- }
- BLI_strncpy(str_unit_convert, n->str, sizeof(str_unit_convert));
-
- bUnit_ReplaceString(str_unit_convert, sizeof(str_unit_convert), default_unit, fac,
- n->unit_sys, n->unit_type[idx]);
+ double val;
+ int success = user_string_to_number(C, n->str, &sce->unit, n->unit_type[idx], &val);
- /* Note: with angles, we always get values as radians here... */
- if (BPY_execute_string_as_number(C, str_unit_convert, false, &val)) {
+ if (success) {
n->val[idx] = (float)val;
n->val_flag[idx] &= ~NUM_INVALID;
}
else {
n->val_flag[idx] |= NUM_INVALID;
}
-#else /* Very unlikely, but does not harm... */
- val = atof(n->str);
- n->val[idx] = (float)val;
- UNUSED_VARS(C);
-#endif /* WITH_PYTHON */
#ifdef USE_FAKE_EDIT
diff --git a/source/blender/editors/util/select_utils.c b/source/blender/editors/util/select_utils.c
index 39a49be3f67..92de124800b 100644
--- a/source/blender/editors/util/select_utils.c
+++ b/source/blender/editors/util/select_utils.c
@@ -19,13 +19,17 @@
*/
/** \file select_utils.c
- * \ingroup editors
+ * \ingroup edutil
*/
#include "BLI_utildefines.h"
+#include "BLI_kdtree.h"
+#include "BLI_math.h"
#include "ED_select_utils.h"
+#include "float.h"
+
/** 1: select, 0: deselect, -1: pass. */
int ED_select_op_action(const eSelectOp sel_op, const bool is_select, const bool is_inside)
{
@@ -68,3 +72,54 @@ int ED_select_op_action_deselected(const eSelectOp sel_op, const bool is_select,
BLI_assert(!"invalid sel_op");
return -1;
}
+
+int ED_select_similar_compare_float(const float delta, const float thresh, const int compare)
+{
+ switch (compare) {
+ case SIM_CMP_EQ:
+ return (fabsf(delta) < thresh + FLT_EPSILON);
+ case SIM_CMP_GT:
+ return ((delta + thresh) > -FLT_EPSILON);
+ case SIM_CMP_LT:
+ return ((delta - thresh) < FLT_EPSILON);
+ default:
+ BLI_assert(0);
+ return 0;
+ }
+}
+
+bool ED_select_similar_compare_float_tree(const KDTree *tree, const float length, const float thresh, const int compare)
+{
+ /* Length of the edge we want to compare against. */
+ float nearest_edge_length;
+
+ switch (compare) {
+ case SIM_CMP_EQ:
+ /* Compare to the edge closest to the current edge. */
+ nearest_edge_length = length;
+ break;
+ case SIM_CMP_GT:
+ /* Compare against the shortest edge. */
+ /* -FLT_MAX leads to some precision issues and the wrong edge being selected.
+ * For example, in a tree with 1, 2 and 3, which is stored squared as 1, 4, 9, it returns as the nearest
+ * length/node the "4" instead of "1". */
+ nearest_edge_length = -1.0f;
+ break;
+ case SIM_CMP_LT:
+ /* Compare against the longest edge. */
+ nearest_edge_length = FLT_MAX;
+ break;
+ default:
+ BLI_assert(0);
+ return false;
+ }
+
+ KDTreeNearest nearest;
+ float dummy[3] = {nearest_edge_length, 0.0f, 0.0f};
+ if (BLI_kdtree_find_nearest(tree, dummy, &nearest) != -1) {
+ float delta = length - nearest.co[0];
+ return ED_select_similar_compare_float(delta, thresh, compare);
+ }
+
+ return false;
+}
diff --git a/source/blender/editors/uvedit/uvedit_buttons.c b/source/blender/editors/uvedit/uvedit_buttons.c
index 60500f0211a..317a07bcf96 100644
--- a/source/blender/editors/uvedit/uvedit_buttons.c
+++ b/source/blender/editors/uvedit/uvedit_buttons.c
@@ -210,6 +210,10 @@ static void do_uvedit_vertex(bContext *C, void *UNUSED(arg), int event)
static bool image_panel_uv_poll(const bContext *C, PanelType *UNUSED(pt))
{
+ SpaceImage *sima = CTX_wm_space_image(C);
+ if (sima->mode != SI_MODE_UV) {
+ return false;
+ }
Object *obedit = CTX_data_edit_object(C);
return ED_uvedit_test(obedit);
}
diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c
index 446e8d66fd0..d9805214964 100644
--- a/source/blender/editors/uvedit/uvedit_draw.c
+++ b/source/blender/editors/uvedit/uvedit_draw.c
@@ -43,6 +43,8 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "../../draw/intern/draw_cache_impl.h"
+
#include "BLI_math.h"
#include "BLI_utildefines.h"
#include "BLI_buffer.h"
@@ -65,6 +67,7 @@
#include "GPU_immediate_util.h"
#include "GPU_matrix.h"
#include "GPU_state.h"
+#include "GPU_draw.h"
#include "ED_image.h"
#include "ED_mesh.h"
@@ -76,7 +79,52 @@
#include "uvedit_intern.h"
-static void draw_uvs_lineloop_bmfaces(BMesh *bm, const int cd_loop_uv_offset, const uint shdr_pos);
+static int draw_uvs_face_check(Scene *scene)
+{
+ ToolSettings *ts = scene->toolsettings;
+
+ /* checks if we are selecting only faces */
+ if (ts->uv_flag & UV_SYNC_SELECTION) {
+ if (ts->selectmode == SCE_SELECT_FACE)
+ return 2;
+ else if (ts->selectmode & SCE_SELECT_FACE)
+ return 1;
+ else
+ return 0;
+ }
+ else
+ return (ts->uv_selectmode == UV_SELECT_FACE);
+}
+
+static uchar get_state(SpaceImage *sima, Scene *scene)
+{
+ ToolSettings *ts = scene->toolsettings;
+ int drawfaces = draw_uvs_face_check(scene);
+ const bool draw_stretch = (sima->flag & SI_DRAW_STRETCH) != 0;
+ uchar state = UVEDIT_EDGES | UVEDIT_DATA;
+
+ if (drawfaces) {
+ state |= UVEDIT_FACEDOTS;
+ }
+ if (draw_stretch || !(sima->flag & SI_NO_DRAWFACES)) {
+ state |= UVEDIT_FACES;
+
+ if (draw_stretch) {
+ if (sima->dt_uvstretch == SI_UVDT_STRETCH_AREA) {
+ state |= UVEDIT_STRETCH_AREA;
+ }
+ else {
+ state |= UVEDIT_STRETCH_ANGLE;
+ }
+ }
+ }
+ if (ts->uv_flag & UV_SYNC_SELECTION) {
+ state |= UVEDIT_SYNC_SEL;
+ }
+ return state;
+}
+
+/* ------------------------- */
void ED_image_draw_cursor(ARegion *ar, const float cursor[2])
{
@@ -144,895 +192,261 @@ void ED_image_draw_cursor(ARegion *ar, const float cursor[2])
GPU_matrix_translate_2f(-cursor[0], -cursor[1]);
}
-static int draw_uvs_face_check(Scene *scene)
+static void draw_uvs_shadow(SpaceImage *sima, Scene *scene, Object *obedit, Depsgraph *depsgraph)
{
- ToolSettings *ts = scene->toolsettings;
-
- /* checks if we are selecting only faces */
- if (ts->uv_flag & UV_SYNC_SELECTION) {
- if (ts->selectmode == SCE_SELECT_FACE)
- return 2;
- else if (ts->selectmode & SCE_SELECT_FACE)
- return 1;
- else
- return 0;
+ Object *eval_ob = DEG_get_evaluated_object(depsgraph, obedit);
+ GPUBatch *faces, *edges, *verts, *facedots;
+ uchar state = UVEDIT_EDGES | UVEDIT_DATA;
+ float col[4];
+ UI_GetThemeColor4fv(TH_UV_SHADOW, col);
+
+ DRW_mesh_cache_uvedit(
+ eval_ob, sima, scene, state,
+ &faces, &edges, &verts, &facedots);
+
+ if (edges) {
+ GPU_batch_program_set_builtin(edges, GPU_SHADER_2D_UNIFORM_COLOR);
+ GPU_batch_uniform_4fv(edges, "color", col);
+ GPU_batch_draw(edges);
}
- else
- return (ts->uv_selectmode == UV_SELECT_FACE);
}
-static void draw_uvs_shadow(Object *obedit)
+static void draw_uvs_texpaint(Scene *scene, Object *ob, Depsgraph *depsgraph)
{
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
- BMesh *bm = em->bm;
+ Object *eval_ob = DEG_get_evaluated_object(depsgraph, ob);
+ Mesh *me = eval_ob->data;
+ ToolSettings *ts = scene->toolsettings;
+ GPUBatch *geom = DRW_mesh_batch_cache_get_texpaint_loop_wire(me);
+ float col[4];
+ UI_GetThemeColor4fv(TH_UV_SHADOW, col);
- if (bm->totloop == 0) {
+ if (!geom)
return;
- }
-
- const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
-
- uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
-
- immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
-
- /* draws the mesh when painting */
- immUniformThemeColor(TH_UV_SHADOW);
-
- draw_uvs_lineloop_bmfaces(bm, cd_loop_uv_offset, pos);
-
- immUnbindProgram();
-}
-
-static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, Object *obedit, BMEditMesh *em, const BMFace *efa_act)
-{
- BMesh *bm = em->bm;
- BMFace *efa;
- BMLoop *l;
- BMIter iter, liter;
- MLoopUV *luv;
- Image *ima = sima->image;
- float aspx, aspy, col[4];
- int i;
-
- const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
-
- BLI_buffer_declare_static(vec2f, tf_uv_buf, BLI_BUFFER_NOP, BM_DEFAULT_NGON_STACK_SIZE);
- BLI_buffer_declare_static(vec2f, tf_uvorig_buf, BLI_BUFFER_NOP, BM_DEFAULT_NGON_STACK_SIZE);
-
- ED_space_image_get_uv_aspect(sima, &aspx, &aspy);
-
- switch (sima->dt_uvstretch) {
- case SI_UVDT_STRETCH_AREA:
- {
- float totarea = 0.0f, totuvarea = 0.0f, areadiff, uvarea, area;
-
- BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- const int efa_len = efa->len;
- float (*tf_uv)[2] = (float (*)[2])BLI_buffer_reinit_data(&tf_uv_buf, vec2f, efa_len);
- float (*tf_uvorig)[2] = (float (*)[2])BLI_buffer_reinit_data(&tf_uvorig_buf, vec2f, efa_len);
-
- BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- copy_v2_v2(tf_uvorig[i], luv->uv);
- }
-
- uv_poly_copy_aspect(tf_uvorig, tf_uv, aspx, aspy, efa->len);
-
- totarea += BM_face_calc_area(efa);
- totuvarea += area_poly_v2(tf_uv, efa->len);
-
- if (uvedit_face_visible_test(scene, obedit, ima, efa)) {
- BM_elem_flag_enable(efa, BM_ELEM_TAG);
- }
- else {
- if (efa == efa_act) {
- efa_act = NULL;
- }
- BM_elem_flag_disable(efa, BM_ELEM_TAG);
- }
- }
-
- uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
-
- immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
-
- if (totarea < FLT_EPSILON || totuvarea < FLT_EPSILON) {
- col[0] = 1.0;
- col[1] = col[2] = 0.0;
-
- immUniformColor3fv(col);
-
- BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- if (BM_elem_flag_test(efa, BM_ELEM_TAG)) {
- immBegin(GPU_PRIM_TRI_FAN, efa->len);
-
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- immVertex2fv(pos, luv->uv);
- }
- immEnd();
- }
- }
- }
- else {
- BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- if (BM_elem_flag_test(efa, BM_ELEM_TAG)) {
- const int efa_len = efa->len;
- float (*tf_uv)[2] = (float (*)[2])BLI_buffer_reinit_data(&tf_uv_buf, vec2f, efa_len);
- float (*tf_uvorig)[2] = (float (*)[2])BLI_buffer_reinit_data(&tf_uvorig_buf, vec2f, efa_len);
-
- area = BM_face_calc_area(efa) / totarea;
-
- BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- copy_v2_v2(tf_uvorig[i], luv->uv);
- }
-
- uv_poly_copy_aspect(tf_uvorig, tf_uv, aspx, aspy, efa->len);
-
- uvarea = area_poly_v2(tf_uv, efa->len) / totuvarea;
-
- if (area < FLT_EPSILON || uvarea < FLT_EPSILON)
- areadiff = 1.0f;
- else if (area > uvarea)
- areadiff = 1.0f - (uvarea / area);
- else
- areadiff = 1.0f - (area / uvarea);
-
- BKE_defvert_weight_to_rgb(col, areadiff);
- immUniformColor3fv(col);
+ GPU_batch_program_set_builtin(geom, GPU_SHADER_2D_UNIFORM_COLOR);
+ GPU_batch_uniform_4fv(geom, "color", col);
- /* TODO: use editmesh tessface */
- immBegin(GPU_PRIM_TRI_FAN, efa->len);
-
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- immVertex2fv(pos, luv->uv);
- }
-
- immEnd();
- }
- }
- }
-
- immUnbindProgram();
-
- break;
- }
- case SI_UVDT_STRETCH_ANGLE:
- {
- float a;
-
- BLI_buffer_declare_static(float, uvang_buf, BLI_BUFFER_NOP, BM_DEFAULT_NGON_STACK_SIZE);
- BLI_buffer_declare_static(float, ang_buf, BLI_BUFFER_NOP, BM_DEFAULT_NGON_STACK_SIZE);
- BLI_buffer_declare_static(vec3f, av_buf, BLI_BUFFER_NOP, BM_DEFAULT_NGON_STACK_SIZE);
- BLI_buffer_declare_static(vec2f, auv_buf, BLI_BUFFER_NOP, BM_DEFAULT_NGON_STACK_SIZE);
-
- col[3] = 0.5f; /* hard coded alpha, not that nice */
-
- 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, 3, GPU_FETCH_FLOAT);
-
- immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
-
- BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- if (uvedit_face_visible_test(scene, obedit, ima, efa)) {
- const int efa_len = efa->len;
- float (*tf_uv)[2] = (float (*)[2])BLI_buffer_reinit_data(&tf_uv_buf, vec2f, efa_len);
- float (*tf_uvorig)[2] = (float (*)[2])BLI_buffer_reinit_data(&tf_uvorig_buf, vec2f, efa_len);
- float *uvang = BLI_buffer_reinit_data(&uvang_buf, float, efa_len);
- float *ang = BLI_buffer_reinit_data(&ang_buf, float, efa_len);
- float (*av)[3] = (float (*)[3])BLI_buffer_reinit_data(&av_buf, vec3f, efa_len);
- float (*auv)[2] = (float (*)[2])BLI_buffer_reinit_data(&auv_buf, vec2f, efa_len);
- int j;
-
- BM_elem_flag_enable(efa, BM_ELEM_TAG);
-
- BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- copy_v2_v2(tf_uvorig[i], luv->uv);
- }
-
- uv_poly_copy_aspect(tf_uvorig, tf_uv, aspx, aspy, efa_len);
-
- j = efa_len - 1;
- BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
- sub_v2_v2v2(auv[i], tf_uv[j], tf_uv[i]); normalize_v2(auv[i]);
- sub_v3_v3v3(av[i], l->prev->v->co, l->v->co); normalize_v3(av[i]);
- j = i;
- }
-
- for (i = 0; i < efa_len; i++) {
-#if 0
- /* Simple but slow, better reuse normalized vectors
- * (Not ported to bmesh, copied for reference) */
- uvang1 = RAD2DEG(angle_v2v2v2(tf_uv[3], tf_uv[0], tf_uv[1]));
- ang1 = RAD2DEG(angle_v3v3v3(efa->v4->co, efa->v1->co, efa->v2->co));
-#endif
- uvang[i] = angle_normalized_v2v2(auv[i], auv[(i + 1) % efa_len]);
- ang[i] = angle_normalized_v3v3(av[i], av[(i + 1) % efa_len]);
- }
-
- /* TODO: use editmesh tessface */
- immBegin(GPU_PRIM_TRI_FAN, efa->len);
- BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- a = fabsf(uvang[i] - ang[i]) / (float)M_PI;
- BKE_defvert_weight_to_rgb(col, 1.0f - pow2f(1.0f - a));
- immAttrib3fv(color, col);
- immVertex2fv(pos, luv->uv);
- }
- immEnd();
+ const bool do_material_masking = (ts->uv_flag & UV_SHOW_SAME_IMAGE);
+ if (do_material_masking && me->mloopuv) {
+ /* Render loops that have the active material. Minize draw calls. */
+ MPoly *mpoly = me->mpoly;
+ uint draw_start = 0;
+ uint idx = 0;
+ bool prev_ma_match = (mpoly->mat_nr == (eval_ob->actcol - 1));
+
+ GPU_matrix_bind(geom->interface);
+
+ /* TODO(fclem): If drawcall count becomes a problem in the future
+ * we can use multi draw indirect drawcalls for this.
+ * (not implemented in GPU module at the time of writing). */
+ for (int a = 0; a < me->totpoly; a++, mpoly++) {
+ bool ma_match = (mpoly->mat_nr == (eval_ob->actcol - 1));
+ if (ma_match != prev_ma_match) {
+ if (ma_match == false) {
+ GPU_batch_draw_range_ex(geom, draw_start, idx - draw_start, false);
}
else {
- if (efa == efa_act)
- efa_act = NULL;
- BM_elem_flag_disable(efa, BM_ELEM_TAG);
+ draw_start = idx;
}
}
-
- immUnbindProgram();
-
- BLI_buffer_free(&uvang_buf);
- BLI_buffer_free(&ang_buf);
- BLI_buffer_free(&av_buf);
- BLI_buffer_free(&auv_buf);
-
- break;
- }
- }
-
- BLI_buffer_free(&tf_uv_buf);
- BLI_buffer_free(&tf_uvorig_buf);
-}
-
-static void draw_uvs_lineloop_bmfaces(BMesh *bm, const int cd_loop_uv_offset, const uint shdr_pos)
-{
- BMIter iter, liter;
- BMFace *efa;
- BMLoop *l;
- MLoopUV *luv;
-
- /* For more efficiency first transfer the entire buffer to vram. */
- GPUBatch *loop_batch = immBeginBatchAtMost(GPU_PRIM_LINE_LOOP, bm->totloop);
-
- BM_ITER_MESH(efa, &iter, bm, BM_FACES_OF_MESH) {
- if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
- continue;
-
- BM_ITER_ELEM(l, &liter, efa, BM_LOOPS_OF_FACE) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- immVertex2fv(shdr_pos, luv->uv);
- }
- }
- immEnd();
-
- /* Then draw each face contour separately. */
- GPU_batch_program_use_begin(loop_batch);
- unsigned int index = 0;
- BM_ITER_MESH(efa, &iter, bm, BM_FACES_OF_MESH) {
- if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
- continue;
-
- GPU_batch_draw_range_ex(loop_batch, index, efa->len, false);
- index += efa->len;
- }
- GPU_batch_program_use_end(loop_batch);
- GPU_batch_discard(loop_batch);
-}
-
-static void draw_uvs_lineloop_mpoly(Mesh *me, MPoly *mpoly, unsigned int pos)
-{
- MLoopUV *mloopuv;
- int i;
-
- immBegin(GPU_PRIM_LINE_LOOP, mpoly->totloop);
-
- mloopuv = &me->mloopuv[mpoly->loopstart];
- for (i = mpoly->totloop; i != 0; i--, mloopuv++) {
- immVertex2fv(pos, mloopuv->uv);
- }
-
- immEnd();
-}
-
-static void draw_uvs_other_mesh(Object *ob, const Image *curimage,
- const int other_uv_filter, unsigned int pos)
-{
- Mesh *me = ob->data;
- MPoly *mpoly = me->mpoly;
- int a;
- BLI_bitmap *mat_test_array;
- bool ok = false;
- int totcol = 0;
-
- if (me->mloopuv == NULL) {
- return;
- }
-
- if (curimage && ob->totcol == 0) {
- return;
- }
-
- totcol = max_ii(ob->totcol, 1);
- mat_test_array = BLI_BITMAP_NEW_ALLOCA(totcol);
-
- for (a = 0; a < totcol; a++) {
- Image *image;
-
- /* if no materials, assume a default material with no image */
- if (ob->totcol)
- ED_object_get_active_image(ob, a + 1, &image, NULL, NULL, NULL);
- else
- image = NULL;
-
- if (image == curimage) {
- BLI_BITMAP_ENABLE(mat_test_array, a);
- ok = true;
+ idx += mpoly->totloop + 1;
+ prev_ma_match = ma_match;
}
- }
-
- if (ok == false) {
- return;
- }
-
- for (a = me->totpoly; a != 0; a--, mpoly++) {
- if (other_uv_filter == SI_FILTER_ALL) {
- /* Nothing to compare, all UV faces are visible. */
- }
- else if (other_uv_filter == SI_FILTER_SAME_IMAGE) {
- const int mat_nr = mpoly->mat_nr;
- if ((mat_nr >= totcol) ||
- (BLI_BITMAP_TEST(mat_test_array, mat_nr)) == 0)
- {
- continue;
- }
+ if (prev_ma_match == true) {
+ GPU_batch_draw_range_ex(geom, draw_start, idx - draw_start, false);
}
- draw_uvs_lineloop_mpoly(me, mpoly, pos);
+ GPU_batch_program_use_end(geom);
}
-}
-
-static void draw_uvs_other(ViewLayer *view_layer, Object *obedit, const Image *curimage,
- const int other_uv_filter)
-{
- uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
-
- immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
-
- immUniformThemeColor(TH_UV_OTHERS);
-
- for (Base *base = view_layer->object_bases.first; base; base = base->next) {
- if (((base->flag & BASE_SELECTED) != 0) &&
- ((base->flag & BASE_VISIBLE) != 0))
- {
- Object *ob = base->object;
- if ((ob->type == OB_MESH) && (ob != obedit) && ((Mesh *)ob->data)->mloopuv) {
- draw_uvs_other_mesh(ob, curimage, other_uv_filter, pos);
- }
- }
- }
- immUnbindProgram();
-}
-
-static void draw_uvs_texpaint(SpaceImage *sima, Scene *scene, ViewLayer *view_layer, Object *ob)
-{
- Image *curimage = ED_space_image(sima);
- Mesh *me = ob->data;
- Material *ma;
-
- if (sima->flag & SI_DRAW_OTHER) {
- draw_uvs_other(view_layer, ob, curimage, sima->other_uv_filter);
- }
-
- ma = give_current_material(ob, ob->actcol);
-
- if (me->mloopuv) {
- MPoly *mpoly = me->mpoly;
- MLoopUV *mloopuv, *mloopuv_base;
- int a, b;
- if (!(ma && ma->texpaintslot && ma->texpaintslot[ma->paint_active_slot].uvname &&
- (mloopuv = CustomData_get_layer_named(&me->ldata, CD_MLOOPUV, ma->texpaintslot[ma->paint_active_slot].uvname))))
- {
- mloopuv = me->mloopuv;
- }
-
- uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
-
- immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
-
- immUniformThemeColor(TH_UV_SHADOW);
-
- mloopuv_base = mloopuv;
-
- for (a = me->totpoly; a > 0; a--, mpoly++) {
- if ((scene->toolsettings->uv_flag & UV_SHOW_SAME_IMAGE) && mpoly->mat_nr != ob->actcol - 1)
- continue;
-
- immBegin(GPU_PRIM_LINE_LOOP, mpoly->totloop);
-
- mloopuv = mloopuv_base + mpoly->loopstart;
- for (b = 0; b < mpoly->totloop; b++, mloopuv++) {
- immVertex2fv(pos, mloopuv->uv);
- }
-
- immEnd();
- }
-
- immUnbindProgram();
+ else {
+ GPU_batch_draw(geom);
}
}
-static void draw_uvs_looptri(BMEditMesh *em, unsigned int *r_loop_index, const int cd_loop_uv_offset, unsigned int pos)
-{
- unsigned int i = *r_loop_index;
- BMFace *f = em->looptris[i][0]->f;
- do {
- unsigned int j;
- for (j = 0; j < 3; j++) {
- MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(em->looptris[i][j], cd_loop_uv_offset);
- immVertex2fv(pos, luv->uv);
- }
- i++;
- } while (i != em->tottri && (f == em->looptris[i][0]->f));
- *r_loop_index = i - 1;
-}
-
/* draws uv's in the image space */
-static void draw_uvs(SpaceImage *sima, Scene *scene, ViewLayer *view_layer, Object *obedit, Depsgraph *depsgraph)
+static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit, Depsgraph *depsgraph)
{
- ToolSettings *ts;
- Mesh *me = obedit->data;
- BMEditMesh *em = me->edit_btmesh;
- BMesh *bm = em->bm;
- BMFace *efa, *efa_act;
- BMLoop *l;
- BMIter iter, liter;
- MLoopUV *luv;
- float col1[4], col2[4];
- float pointsize;
- int drawfaces, interpedges;
- Image *ima = sima->image;
-
- const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
-
- unsigned int pos, color;
-
- efa_act = EDBM_uv_active_face_get(em, false, false); /* will be set to NULL if hidden */
- ts = scene->toolsettings;
-
- drawfaces = draw_uvs_face_check(scene);
- if (ts->uv_flag & UV_SYNC_SELECTION)
- interpedges = (ts->selectmode & SCE_SELECT_VERTEX);
- else
- interpedges = (ts->uv_selectmode == UV_SELECT_VERTEX);
-
- /* draw other uvs */
- if (sima->flag & SI_DRAW_OTHER) {
- Image *curimage;
-
- if (efa_act) {
- ED_object_get_active_image(obedit, efa_act->mat_nr + 1, &curimage, NULL, NULL, NULL);
- }
- else {
- curimage = ima;
- }
-
- draw_uvs_other(view_layer, obedit, curimage, sima->other_uv_filter);
- }
-
- /* 1. draw shadow mesh */
+ GPUBatch *faces, *edges, *verts, *facedots;
+ Object *eval_ob = DEG_get_evaluated_object(depsgraph, obedit);
+ ToolSettings *ts = scene->toolsettings;
+ float col1[4], col2[4], col3[4], transparent[4] = {0.0f, 0.0f, 0.0f, 0.0f};
if (sima->flag & SI_DRAWSHADOW) {
- Object *ob_cage_eval = DEG_get_evaluated_object(depsgraph, obedit);
/* XXX TODO: Need to check if shadow mesh is different than original mesh. */
- bool is_cage_like_final_meshes = (ob_cage_eval == obedit);
+ bool is_cage_like_final_meshes = true;
/* When sync selection is enabled, all faces are drawn (except for hidden)
* so if cage is the same as the final, there is no point in drawing this. */
- if (((ts->uv_flag & UV_SYNC_SELECTION) == 0) || is_cage_like_final_meshes) {
- draw_uvs_shadow(ob_cage_eval);
+ if (!((ts->uv_flag & UV_SYNC_SELECTION) && is_cage_like_final_meshes)) {
+ draw_uvs_shadow(sima, scene, obedit, depsgraph);
}
}
- if (bm->totloop == 0) {
- return;
- }
+ uchar state = get_state(sima, scene);
- /* 2. draw colored faces */
+ DRW_mesh_cache_uvedit(
+ eval_ob, sima, scene, state,
+ &faces, &edges, &verts, &facedots);
- if (sima->flag & SI_DRAW_STRETCH) {
- draw_uvs_stretch(sima, scene, obedit, em, efa_act);
+ bool interpedges;
+ bool do_elem_order_fix = (ts->uv_flag & UV_SYNC_SELECTION) && (ts->selectmode & SCE_SELECT_FACE);
+ bool do_selected_edges = ((sima->flag & SI_NO_DRAWEDGES) == 0);
+ bool draw_stretch = (state & (UVEDIT_STRETCH_AREA | UVEDIT_STRETCH_ANGLE)) != 0;
+ if (ts->uv_flag & UV_SYNC_SELECTION) {
+ interpedges = (ts->selectmode & SCE_SELECT_VERTEX) != 0;
}
else {
- unsigned int tri_count = 0;
- BM_ITER_MESH(efa, &iter, bm, BM_FACES_OF_MESH) {
- if (uvedit_face_visible_test(scene, obedit, ima, efa)) {
- BM_elem_flag_enable(efa, BM_ELEM_TAG);
- tri_count += efa->len - 2;
- }
- else {
- BM_elem_flag_disable(efa, BM_ELEM_TAG);
- }
- }
-
- if (tri_count && !(sima->flag & SI_NO_DRAWFACES)) {
- /* draw transparent faces */
- UI_GetThemeColor4fv(TH_FACE, col1);
- UI_GetThemeColor4fv(TH_FACE_SELECT, col2);
- GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
- GPU_blend(true);
-
- GPUVertFormat *format = immVertexFormat();
- pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
- color = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
-
- immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
-
- GPUBatch *face_batch = immBeginBatch(GPU_PRIM_TRIS, tri_count * 3);
- for (unsigned int i = 0; i < em->tottri; i++) {
- efa = em->looptris[i][0]->f;
- if (BM_elem_flag_test(efa, BM_ELEM_TAG)) {
- const bool is_select = uvedit_face_select_test(scene, efa, cd_loop_uv_offset);
-
- if (efa == efa_act) {
- /* only once */
- float tmp_col[4];
- UI_GetThemeColor4fv(TH_EDITMESH_ACTIVE, tmp_col);
- immAttrib4fv(color, tmp_col);
- }
- else {
- immAttrib4fv(color, is_select ? col2 : col1);
- }
-
- draw_uvs_looptri(em, &i, cd_loop_uv_offset, pos);
- }
- }
- immEnd();
-
- /* XXX performance: we should not create and throw away result. */
- GPU_batch_draw(face_batch);
- GPU_batch_program_use_end(face_batch);
- GPU_batch_discard(face_batch);
-
- immUnbindProgram();
-
- GPU_blend(false);
- }
- else {
- if (efa_act && !uvedit_face_visible_test(scene, obedit, ima, efa_act)) {
- efa_act = NULL;
- }
- }
- }
-
- /* 3. draw active face stippled */
- /* (removed during OpenGL upgrade, reimplement if needed) */
-
- /* 4. draw edges */
-
- if (sima->flag & SI_SMOOTH_UV) {
- GPU_line_smooth(true);
- GPU_blend(true);
- GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
+ interpedges = (ts->uv_selectmode == UV_SELECT_VERTEX);
}
- pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
-
- switch (sima->dt_uv) {
- case SI_UVDT_DASH:
- {
- immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR);
+ GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
- float viewport_size[4];
- GPU_viewport_size_get_f(viewport_size);
- immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC);
+ if (faces) {
+ GPU_batch_program_set_builtin(faces, (draw_stretch)
+ ? GPU_SHADER_2D_UV_FACES_STRETCH
+ : GPU_SHADER_2D_UV_FACES);
- immUniform1i("colors_len", 2); /* "advanced" mode */
- immUniformArray4fv("colors", (float *)(float[][4]){{0.56f, 0.56f, 0.56f, 1.0f}, {0.07f, 0.07f, 0.07f, 1.0f}}, 2);
- immUniform1f("dash_width", 4.0f);
- GPU_line_width(1.0f);
+ if (!draw_stretch) {
+ GPU_blend(true);
- break;
+ UI_GetThemeColor4fv(TH_FACE, col1);
+ UI_GetThemeColor4fv(TH_FACE_SELECT, col2);
+ UI_GetThemeColor4fv(TH_EDITMESH_ACTIVE, col3);
+ col3[3] *= 0.2; /* Simulate dithering */
+ GPU_batch_uniform_4fv(faces, "faceColor", col1);
+ GPU_batch_uniform_4fv(faces, "selectColor", col2);
+ GPU_batch_uniform_4fv(faces, "activeColor", col3);
}
- case SI_UVDT_BLACK: /* black/white */
- case SI_UVDT_WHITE:
- immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
- if (sima->dt_uv == SI_UVDT_WHITE) {
- immUniformColor3f(1.0f, 1.0f, 1.0f);
- }
- else {
- immUniformColor3f(0.0f, 0.0f, 0.0f);
- }
- GPU_line_width(1.0f);
- break;
- case SI_UVDT_OUTLINE:
- immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
- imm_cpack(0x0);
- GPU_line_width(3.0f);
+ GPU_batch_draw(faces);
- break;
- }
-
- /* For more efficiency first transfer the entire buffer to vram. */
- GPUBatch *loop_batch = immBeginBatchAtMost(GPU_PRIM_LINE_LOOP, bm->totloop);
- GPUVertBuf *loop_vbo = loop_batch->verts[0];
- BM_ITER_MESH(efa, &iter, bm, BM_FACES_OF_MESH) {
- if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
- continue;
-
- BM_ITER_ELEM(l, &liter, efa, BM_LOOPS_OF_FACE) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- immVertex2fv(pos, luv->uv);
+ if (!draw_stretch) {
+ GPU_blend(false);
}
}
- immEnd();
-
- /* Then draw each face contour separately. */
- if (loop_vbo->vertex_len != 0) {
- GPU_batch_program_use_begin(loop_batch);
- unsigned int index = 0, loop_vbo_count;
- BM_ITER_MESH(efa, &iter, bm, BM_FACES_OF_MESH) {
- if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
- continue;
-
- GPU_batch_draw_range_ex(loop_batch, index, efa->len, false);
- index += efa->len;
+ if (edges) {
+ if (sima->flag & SI_SMOOTH_UV) {
+ GPU_line_smooth(true);
+ GPU_blend(true);
}
- loop_vbo_count = index;
- GPU_batch_program_use_end(loop_batch);
- immUnbindProgram();
-
-
- if (sima->dt_uv == SI_UVDT_OUTLINE) {
- GPU_line_width(1.0f);
- UI_GetThemeColor4fv(TH_WIRE_EDIT, col2);
-
- if (me->drawflag & ME_DRAWEDGES) {
- int sel;
- UI_GetThemeColor4fv(TH_EDGE_SELECT, col1);
-
- if (interpedges) {
- /* Create a color buffer. */
- static GPUVertFormat format = { 0 };
- static uint shdr_col;
- if (format.attr_len == 0) {
- shdr_col = GPU_vertformat_attr_add(&format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
- }
-
- GPUVertBuf *vbo_col = GPU_vertbuf_create_with_format(&format);
- GPU_vertbuf_data_alloc(vbo_col, loop_vbo_count);
-
- index = 0;
- BM_ITER_MESH(efa, &iter, bm, BM_FACES_OF_MESH) {
- if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
- continue;
-
- BM_ITER_ELEM(l, &liter, efa, BM_LOOPS_OF_FACE) {
- sel = uvedit_uv_select_test(scene, l, cd_loop_uv_offset);
- GPU_vertbuf_attr_set(vbo_col, shdr_col, index++, sel ? col1 : col2);
- }
- }
- /* Reuse the UV buffer and add the color buffer. */
- GPU_batch_vertbuf_add_ex(loop_batch, vbo_col, true);
-
- /* Now draw each face contour separately with another builtin program. */
- GPU_batch_program_set_builtin(loop_batch, GPU_SHADER_2D_SMOOTH_COLOR);
- GPU_matrix_bind(loop_batch->interface);
-
- GPU_batch_program_use_begin(loop_batch);
- index = 0;
- BM_ITER_MESH(efa, &iter, bm, BM_FACES_OF_MESH) {
- if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
- continue;
-
- GPU_batch_draw_range_ex(loop_batch, index, efa->len, false);
- index += efa->len;
- }
- GPU_batch_program_use_end(loop_batch);
+ switch (sima->dt_uv) {
+ case SI_UVDT_DASH:
+ {
+ float dash_colors[2][4] = {{0.56f, 0.56f, 0.56f, 1.0f}, {0.07f, 0.07f, 0.07f, 1.0f}};
+ float viewport_size[4];
+ GPU_viewport_size_get_f(viewport_size);
+
+ GPU_line_width(1.0f);
+ GPU_batch_program_set_builtin(edges, GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR);
+ GPU_batch_uniform_4fv_array(edges, "colors", 2, (float *)dash_colors);
+ GPU_batch_uniform_2f(edges, "viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC);
+ GPU_batch_uniform_1i(edges, "colors_len", 2); /* "advanced" mode */
+ GPU_batch_uniform_1f(edges, "dash_width", 4.0f);
+ GPU_batch_draw(edges);
+ break;
+ }
+ case SI_UVDT_BLACK:
+ case SI_UVDT_WHITE:
+ {
+ GPU_line_width(1.0f);
+ GPU_batch_program_set_builtin(edges, GPU_SHADER_2D_UNIFORM_COLOR);
+ if (sima->dt_uv == SI_UVDT_WHITE) {
+ GPU_batch_uniform_4f(edges, "color", 1.0f, 1.0f, 1.0f, 1.0f);
}
else {
- GPUVertFormat *format = immVertexFormat();
- pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
- color = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
-
- immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
-
- /* Use batch here to avoid problems with `IMM_BUFFER_SIZE`. */
- GPUBatch *flat_edges_batch = immBeginBatchAtMost(GPU_PRIM_LINES, loop_vbo_count * 2);
- BM_ITER_MESH(efa, &iter, bm, BM_FACES_OF_MESH) {
- if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
- continue;
-
- BM_ITER_ELEM(l, &liter, efa, BM_LOOPS_OF_FACE) {
- sel = uvedit_edge_select_test(scene, l, cd_loop_uv_offset);
- immAttrib4fv(color, sel ? col1 : col2);
-
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- immVertex2fv(pos, luv->uv);
- luv = BM_ELEM_CD_GET_VOID_P(l->next, cd_loop_uv_offset);
- immVertex2fv(pos, luv->uv);
- }
- }
- immEnd();
-
- GPU_batch_draw(flat_edges_batch);
- GPU_batch_discard(flat_edges_batch);
-
- immUnbindProgram();
- }
- }
- else {
- GPU_batch_uniform_4fv(loop_batch, "color", col2);
- immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
-
- /* no nice edges */
- GPU_batch_program_use_begin(loop_batch);
- index = 0;
- BM_ITER_MESH(efa, &iter, bm, BM_FACES_OF_MESH) {
- if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
- continue;
-
- GPU_batch_draw_range_ex(loop_batch, index, efa->len, false);
- index += efa->len;
+ GPU_batch_uniform_4f(edges, "color", 0.0f, 0.0f, 0.0f, 1.0f);
}
- GPU_batch_program_use_end(loop_batch);
- immUnbindProgram();
+ GPU_batch_draw(edges);
+ break;
}
- }
- }
- else {
- immUnbindProgram();
- }
-
- GPU_batch_discard(loop_batch);
-
- if (sima->flag & SI_SMOOTH_UV) {
- GPU_line_smooth(false);
- GPU_blend(false);
- }
-
- /* 5. draw face centers */
-
- if (drawfaces) {
- float cent[2];
- bool col_set = false;
-
- GPUVertFormat *format = immVertexFormat();
- pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
- color = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
-
- immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
-
- pointsize = UI_GetThemeValuef(TH_FACEDOT_SIZE);
- GPU_point_size(pointsize);
-
- immBeginAtMost(GPU_PRIM_POINTS, bm->totface);
-
- /* unselected faces */
-
- BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
- continue;
-
- if (!uvedit_face_select_test(scene, efa, cd_loop_uv_offset)) {
- /* Only set color for the first face */
- if (!col_set) {
- UI_GetThemeColor3fv(TH_WIRE, col1);
- immAttrib3fv(color, col1);
-
- col_set = true;
+ case SI_UVDT_OUTLINE:
+ {
+ GPU_line_width(3.0f);
+ GPU_batch_program_set_builtin(edges, GPU_SHADER_2D_UNIFORM_COLOR);
+ GPU_batch_uniform_4f(edges, "color", 0.0f, 0.0f, 0.0f, 1.0f);
+ GPU_batch_draw(edges);
+
+ UI_GetThemeColor4fv(TH_WIRE_EDIT, col1);
+ UI_GetThemeColor4fv(TH_EDGE_SELECT, col2);
+
+ /* We could modify the vbo's data filling instead of modifying the provoking vert. */
+ glProvokingVertex(GL_FIRST_VERTEX_CONVENTION);
+
+ GPU_line_width(1.0f);
+ GPU_batch_program_set_builtin(edges, (interpedges)
+ ? GPU_SHADER_2D_UV_EDGES_SMOOTH
+ : GPU_SHADER_2D_UV_EDGES);
+ GPU_batch_uniform_4fv(edges, "edgeColor", col1);
+ GPU_batch_uniform_4fv(edges, "selectColor", do_selected_edges ? col2 : col1);
+ GPU_batch_draw(edges);
+
+ if (do_elem_order_fix && do_selected_edges) {
+ /* We have problem in this mode when face order make some edges
+ * appear unselected because an adjacent face is not selected and
+ * render after the selected face.
+ * So, to avoid sorting edges by state we just render selected edges
+ * on top. A bit overkill but it's simple. */
+ GPU_blend(true);
+ GPU_batch_uniform_4fv(edges, "edgeColor", transparent);
+ GPU_batch_uniform_4fv(edges, "selectColor", col2);
+ GPU_batch_draw(edges);
+ GPU_blend(false);
}
-
- uv_poly_center(efa, cent, cd_loop_uv_offset);
- immVertex2fv(pos, cent);
+ glProvokingVertex(GL_LAST_VERTEX_CONVENTION);
+ break;
}
}
-
- col_set = false;
-
- /* selected faces */
-
- BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
- continue;
-
- if (uvedit_face_select_test(scene, efa, cd_loop_uv_offset)) {
- /* Only set color for the first face */
- if (!col_set) {
- UI_GetThemeColor3fv(TH_FACE_DOT, col1);
- immAttrib3fv(color, col1);
-
- col_set = true;
- }
-
- uv_poly_center(efa, cent, cd_loop_uv_offset);
- immVertex2fv(pos, cent);
- }
+ if (sima->flag & SI_SMOOTH_UV) {
+ GPU_line_smooth(false);
+ GPU_blend(false);
}
-
- immEnd();
-
- immUnbindProgram();
}
-
- /* 6. draw uv vertices */
-
- if (drawfaces != 2) { /* 2 means Mesh Face Mode */
- pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
-
- immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
-
- /* unselected uvs */
- immUniformThemeColor(TH_VERTEX);
- pointsize = UI_GetThemeValuef(TH_VERTEX_SIZE);
- GPU_point_size(pointsize);
-
- immBeginAtMost(GPU_PRIM_POINTS, bm->totloop);
-
- BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
- continue;
-
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- if (!uvedit_uv_select_test(scene, l, cd_loop_uv_offset))
- immVertex2fv(pos, luv->uv);
+ if (verts || facedots) {
+ float pointsize = UI_GetThemeValuef(TH_VERTEX_SIZE);
+ UI_GetThemeColor4fv(TH_VERTEX_SELECT, col2);
+ if (verts) {
+ float pinned_col[4] = {1.0f, 0.0f, 0.0f, 1.0f}; /* TODO Theme? */
+ UI_GetThemeColor4fv(TH_VERTEX, col1);
+ GPU_blend(true);
+ GPU_enable_program_point_size();
+
+ GPU_batch_program_set_builtin(verts, GPU_SHADER_2D_UV_VERTS);
+ GPU_batch_uniform_4f(verts, "vertColor", col1[0], col1[1], col1[2], 1.0f);
+ GPU_batch_uniform_4fv(verts, "selectColor", (do_elem_order_fix) ? transparent : col2);
+ GPU_batch_uniform_4fv(verts, "pinnedColor", pinned_col);
+ GPU_batch_uniform_1f(verts, "pointSize", (pointsize + 1.5f) * M_SQRT2);
+ GPU_batch_uniform_1f(verts, "outlineWidth", 0.75f);
+ GPU_batch_draw(verts);
+
+ if (do_elem_order_fix) {
+ /* We have problem in this mode when face order make some verts
+ * appear unselected because an adjacent face is not selected and
+ * render after the selected face.
+ * So, to avoid sorting verts by state we just render selected verts
+ * on top. A bit overkill but it's simple. */
+ GPU_batch_uniform_4fv(verts, "vertColor", transparent);
+ GPU_batch_uniform_4fv(verts, "selectColor", col2);
+ GPU_batch_uniform_4fv(verts, "pinnedColor", pinned_col);
+ GPU_batch_uniform_1f(verts, "pointSize", (pointsize + 1.5f) * M_SQRT2);
+ GPU_batch_uniform_1f(verts, "outlineWidth", 0.75f);
+ GPU_batch_draw(verts);
}
- }
- immEnd();
-
- /* pinned uvs */
- /* give odd pointsizes odd pin pointsizes */
- GPU_point_size(pointsize * 2 + (((int)pointsize % 2) ? (-1) : 0));
- imm_cpack(0xFF);
-
- immBeginAtMost(GPU_PRIM_POINTS, bm->totloop);
-
- BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
- continue;
-
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-
- if (luv->flag & MLOOPUV_PINNED)
- immVertex2fv(pos, luv->uv);
- }
+ GPU_blend(false);
+ GPU_disable_program_point_size();
}
-
- immEnd();
-
- /* selected uvs */
- immUniformThemeColor(TH_VERTEX_SELECT);
- GPU_point_size(pointsize);
-
- immBeginAtMost(GPU_PRIM_POINTS, bm->totloop);
-
- BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
- continue;
-
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-
- if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset))
- immVertex2fv(pos, luv->uv);
- }
+ if (facedots) {
+ GPU_point_size(pointsize);
+
+ UI_GetThemeColor4fv(TH_WIRE, col1);
+ GPU_batch_program_set_builtin(facedots, GPU_SHADER_2D_UV_FACEDOTS);
+ GPU_batch_uniform_4fv(facedots, "vertColor", col1);
+ GPU_batch_uniform_4fv(facedots, "selectColor", col2);
+ GPU_batch_draw(facedots);
}
-
- immEnd();
-
- immUnbindProgram();
}
}
-
static void draw_uv_shadows_get(
SpaceImage *sima, Object *ob, Object *obedit,
bool *show_shadow, bool *show_texpaint)
@@ -1063,19 +477,19 @@ void ED_uvedit_draw_main(
if (show_uvedit || show_uvshadow || show_texpaint_uvshadow) {
if (show_uvshadow) {
- draw_uvs_shadow(obedit);
+ draw_uvs_shadow(sima, scene, obedit, depsgraph);
}
else if (show_uvedit) {
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, &objects_len);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
Object *ob_iter = objects[ob_index];
- draw_uvs(sima, scene, view_layer, ob_iter, depsgraph);
+ draw_uvs(sima, scene, ob_iter, depsgraph);
}
MEM_freeN(objects);
}
else {
- draw_uvs_texpaint(sima, scene, view_layer, obact);
+ draw_uvs_texpaint(scene, obact, depsgraph);
}
if (show_uvedit && !(toolsettings->use_uv_sculpt))
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index 80c443ab1eb..2d9995d3ccc 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -52,23 +52,25 @@
#include "BLI_lasso_2d.h"
#include "BLI_blenlib.h"
#include "BLI_array.h"
+#include "BLI_kdtree.h"
#include "BLT_translation.h"
#include "BKE_context.h"
#include "BKE_customdata.h"
+#include "BKE_editmesh.h"
#include "BKE_image.h"
-#include "BKE_library.h"
+#include "BKE_layer.h"
#include "BKE_main.h"
#include "BKE_material.h"
+#include "BKE_mesh.h"
#include "BKE_mesh_mapping.h"
#include "BKE_node.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_editmesh.h"
-#include "BKE_layer.h"
#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
#include "ED_image.h"
#include "ED_mesh.h"
@@ -98,6 +100,7 @@ static void uv_select_all_perform(Scene *scene, Image *ima, Object *obedit, int
static void uv_select_all_perform_multi(Scene *scene, Image *ima, Object **objects, const uint objects_len, int action);
static void uv_select_flush_from_tag_face(SpaceImage *sima, Scene *scene, Object *obedit, const bool select);
static void uv_select_flush_from_tag_loop(SpaceImage *sima, Scene *scene, Object *obedit, const bool select);
+static void uv_select_tag_update_for_object(Depsgraph *depsgraph, const ToolSettings *ts, Object *obedit);
/* -------------------------------------------------------------------- */
/** \name State Testing
@@ -908,38 +911,53 @@ bool uv_find_nearest_vert_multi(
return found;
}
-bool ED_uvedit_nearest_uv(Scene *scene, Object *obedit, Image *ima, const float co[2], float r_uv[2])
+bool ED_uvedit_nearest_uv(
+ Scene *scene, Object *obedit, Image *ima, const float co[2],
+ float *dist_sq, float r_uv[2])
{
BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ BMIter iter;
BMFace *efa;
- BMLoop *l;
- BMIter iter, liter;
- MLoopUV *luv;
- float mindist, dist;
- bool found = false;
-
- const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
-
- mindist = 1e10f;
- copy_v2_v2(r_uv, co);
-
+ const float *uv_best = NULL;
+ float dist_best = *dist_sq;
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- if (!uvedit_face_visible_test(scene, obedit, ima, efa))
+ if (!uvedit_face_visible_test(scene, obedit, ima, efa)) {
continue;
+ }
+ BMLoop *l_iter, *l_first;
+ l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
+ do {
+ const float *uv = ((const MLoopUV *)BM_ELEM_CD_GET_VOID_P(l_iter, cd_loop_uv_offset))->uv;
+ const float dist_test = len_squared_v2v2(co, uv);
+ if (dist_best > dist_test) {
+ dist_best = dist_test;
+ uv_best = uv;
+ }
+ } while ((l_iter = l_iter->next) != l_first);
+ }
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- dist = len_manhattan_v2v2(co, luv->uv);
-
- if (dist <= mindist) {
- mindist = dist;
+ if (uv_best != NULL) {
+ copy_v2_v2(r_uv, uv_best);
+ *dist_sq = dist_best;
+ return true;
+ }
+ else {
+ return false;
+ }
+}
- copy_v2_v2(r_uv, luv->uv);
- found = true;
- }
+bool ED_uvedit_nearest_uv_multi(
+ Scene *scene, Image *ima, Object **objects, const uint objects_len, const float co[2],
+ float *dist_sq, float r_uv[2])
+{
+ bool found = false;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ if (ED_uvedit_nearest_uv(scene, obedit, ima, co, dist_sq, r_uv)) {
+ found = true;
}
}
-
return found;
}
@@ -1346,99 +1364,110 @@ static float *uv_sel_co_from_eve(Scene *scene, Object *obedit, Image *ima, BMEdi
static int uv_select_more_less(bContext *C, const bool select)
{
Scene *scene = CTX_data_scene(C);
- Object *obedit = CTX_data_edit_object(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
Image *ima = CTX_data_edit_image(C);
SpaceImage *sima = CTX_wm_space_image(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
BMFace *efa;
BMLoop *l;
BMIter iter, liter;
ToolSettings *ts = scene->toolsettings;
- const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, &objects_len);
- if (ts->uv_flag & UV_SYNC_SELECTION) {
- if (select) {
- EDBM_select_more(em, true);
- }
- else {
- EDBM_select_less(em, true);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+
+ bool changed = false;
+
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+
+ if (ts->uv_flag & UV_SYNC_SELECTION) {
+ if (select) {
+ EDBM_select_more(em, true);
+ }
+ else {
+ EDBM_select_less(em, true);
+ }
+
+ DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ continue;
}
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
- return OPERATOR_FINISHED;
- }
- if (ts->uv_selectmode == UV_SELECT_FACE) {
+ if (ts->uv_selectmode == UV_SELECT_FACE) {
- /* clear tags */
- BM_mesh_elem_hflag_disable_all(em->bm, BM_FACE, BM_ELEM_TAG, false);
+ /* clear tags */
+ BM_mesh_elem_hflag_disable_all(em->bm, BM_FACE, BM_ELEM_TAG, false);
- /* mark loops to be selected */
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- if (uvedit_face_visible_test(scene, obedit, ima, efa)) {
+ /* mark loops to be selected */
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ if (uvedit_face_visible_test(scene, obedit, ima, efa)) {
#define IS_SEL 1
#define IS_UNSEL 2
- int sel_state = 0;
+ int sel_state = 0;
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- if (luv->flag & MLOOPUV_VERTSEL) {
- sel_state |= IS_SEL;
- }
- else {
- sel_state |= IS_UNSEL;
- }
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ if (luv->flag & MLOOPUV_VERTSEL) {
+ sel_state |= IS_SEL;
+ }
+ else {
+ sel_state |= IS_UNSEL;
+ }
- /* if we have a mixed selection, tag to grow it */
- if (sel_state == (IS_SEL | IS_UNSEL)) {
- BM_elem_flag_enable(efa, BM_ELEM_TAG);
- break;
+ /* if we have a mixed selection, tag to grow it */
+ if (sel_state == (IS_SEL | IS_UNSEL)) {
+ BM_elem_flag_enable(efa, BM_ELEM_TAG);
+ changed = true;
+ break;
+ }
}
- }
#undef IS_SEL
#undef IS_UNSEL
+ }
}
}
+ else {
- /* select tagged faces */
- uv_select_flush_from_tag_face(sima, scene, obedit, select);
- }
- else {
-
- /* clear tags */
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- BM_elem_flag_disable(l, BM_ELEM_TAG);
+ /* clear tags */
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ BM_elem_flag_disable(l, BM_ELEM_TAG);
+ }
}
- }
- /* mark loops to be selected */
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- if (uvedit_face_visible_test(scene, obedit, ima, efa)) {
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ /* mark loops to be selected */
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ if (uvedit_face_visible_test(scene, obedit, ima, efa)) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- if (((luv->flag & MLOOPUV_VERTSEL) != 0) == select) {
- BM_elem_flag_enable(l->next, BM_ELEM_TAG);
- BM_elem_flag_enable(l->prev, BM_ELEM_TAG);
+ if (((luv->flag & MLOOPUV_VERTSEL) != 0) == select) {
+ BM_elem_flag_enable(l->next, BM_ELEM_TAG);
+ BM_elem_flag_enable(l->prev, BM_ELEM_TAG);
+ changed = true;
+ }
}
}
}
}
- /* select tagged loops */
- uv_select_flush_from_tag_loop(sima, scene, obedit, select);
+ if (changed) {
+ /* Select tagged loops. */
+ uv_select_flush_from_tag_loop(sima, scene, obedit, select);
+ DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ }
}
-
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -1485,224 +1514,261 @@ static void UV_OT_select_less(wmOperatorType *ot)
/** \name Weld Align Operator
* \{ */
-static void uv_weld_align(bContext *C, int tool)
+typedef enum eUVWeldAlign {
+ UV_STRAIGHTEN,
+ UV_STRAIGHTEN_X,
+ UV_STRAIGHTEN_Y,
+ UV_ALIGN_AUTO,
+ UV_ALIGN_X,
+ UV_ALIGN_Y,
+ UV_WELD,
+} eUVWeldAlign;
+
+static void uv_weld_align(bContext *C, eUVWeldAlign tool)
{
- Object *obedit = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
- SpaceImage *sima;
- Scene *scene;
- Image *ima;
+ Scene *scene = CTX_data_scene(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ SpaceImage *sima = CTX_wm_space_image(C);
+ Image *ima = CTX_data_edit_image(C);
+ ToolSettings *ts = scene->toolsettings;
+ const bool synced_selection = (ts->uv_flag & UV_SYNC_SELECTION) != 0;
float cent[2], min[2], max[2];
- const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
-
- scene = CTX_data_scene(C);
- ima = CTX_data_edit_image(C);
- sima = CTX_wm_space_image(C);
-
INIT_MINMAX2(min, max);
- if (tool == 'a') {
- BMIter iter, liter;
- BMFace *efa;
- BMLoop *l;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, &objects_len);
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- if (!uvedit_face_visible_test(scene, obedit, ima, efa))
- continue;
+ if (tool == UV_ALIGN_AUTO) {
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
- MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- minmax_v2v2_v2(min, max, luv->uv);
- }
+ if (synced_selection && (em->bm->totvertsel == 0)) {
+ continue;
}
- }
- tool = (max[0] - min[0] >= max[1] - min[1]) ? 'y' : 'x';
- }
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
- ED_uvedit_center(scene, ima, obedit, cent, 0);
-
- if (tool == 'x' || tool == 'w') {
- BMIter iter, liter;
- BMFace *efa;
- BMLoop *l;
+ BMIter iter, liter;
+ BMFace *efa;
+ BMLoop *l;
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- if (!uvedit_face_visible_test(scene, obedit, ima, efa))
- continue;
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ if (!uvedit_face_visible_test(scene, obedit, ima, efa))
+ continue;
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
- MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- luv->uv[0] = cent[0];
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
+ MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ minmax_v2v2_v2(min, max, luv->uv);
+ }
}
-
}
}
+ tool = (max[0] - min[0] >= max[1] - min[1]) ? 'y' : 'x';
}
- if (tool == 'y' || tool == 'w') {
- BMIter iter, liter;
- BMFace *efa;
- BMLoop *l;
+ ED_uvedit_center_multi(scene, ima, objects, objects_len, cent, 0);
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- if (!uvedit_face_visible_test(scene, obedit, ima, efa))
- continue;
-
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
- MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- luv->uv[1] = cent[1];
- }
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ bool changed = false;
- }
+ if (synced_selection && (em->bm->totvertsel == 0)) {
+ continue;
}
- }
- if (tool == 's' || tool == 't' || tool == 'u') {
- BMEdge *eed;
- BMLoop *l;
- BMVert *eve;
- BMVert *eve_start;
- BMIter iter, liter, eiter;
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
- /* clear tag */
- BM_mesh_elem_hflag_disable_all(em->bm, BM_VERT, BM_ELEM_TAG, false);
+ if (ELEM(tool, UV_ALIGN_X, UV_WELD)) {
+ BMIter iter, liter;
+ BMFace *efa;
+ BMLoop *l;
- /* tag verts with a selected UV */
- BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
- BM_ITER_ELEM (l, &liter, eve, BM_LOOPS_OF_VERT) {
- if (!uvedit_face_visible_test(scene, obedit, ima, l->f))
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ if (!uvedit_face_visible_test(scene, obedit, ima, efa))
continue;
- if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
- BM_elem_flag_enable(eve, BM_ELEM_TAG);
- break;
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
+ MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ luv->uv[0] = cent[0];
+ changed = true;
+ }
+
}
}
}
- /* flush vertex tags to edges */
- BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
- BM_elem_flag_set(
- eed, BM_ELEM_TAG,
- (BM_elem_flag_test(eed->v1, BM_ELEM_TAG) &&
- BM_elem_flag_test(eed->v2, BM_ELEM_TAG)));
- }
+ if (ELEM(tool, UV_ALIGN_Y, UV_WELD)) {
+ BMIter iter, liter;
+ BMFace *efa;
+ BMLoop *l;
- /* find a vertex with only one tagged edge */
- eve_start = NULL;
- BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
- int tot_eed_tag = 0;
- BM_ITER_ELEM (eed, &eiter, eve, BM_EDGES_OF_VERT) {
- if (BM_elem_flag_test(eed, BM_ELEM_TAG)) {
- tot_eed_tag++;
- }
- }
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ if (!uvedit_face_visible_test(scene, obedit, ima, efa))
+ continue;
- if (tot_eed_tag == 1) {
- eve_start = eve;
- break;
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
+ MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ luv->uv[1] = cent[1];
+ changed = true;
+ }
+
+ }
}
}
- if (eve_start) {
- BMVert **eve_line = NULL;
- BMVert *eve_next = NULL;
- BLI_array_declare(eve_line);
- int i;
+ if (ELEM(tool, UV_STRAIGHTEN, UV_STRAIGHTEN_X, UV_STRAIGHTEN_Y)) {
+ BMEdge *eed;
+ BMLoop *l;
+ BMVert *eve;
+ BMVert *eve_start;
+ BMIter iter, liter, eiter;
- eve = eve_start;
+ /* clear tag */
+ BM_mesh_elem_hflag_disable_all(em->bm, BM_VERT, BM_ELEM_TAG, false);
- /* walk over edges, building an array of verts in a line */
- while (eve) {
- BLI_array_append(eve_line, eve);
- /* don't touch again */
- BM_elem_flag_disable(eve, BM_ELEM_TAG);
+ /* tag verts with a selected UV */
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, eve, BM_LOOPS_OF_VERT) {
+ if (!uvedit_face_visible_test(scene, obedit, ima, l->f))
+ continue;
- eve_next = NULL;
+ if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
+ BM_elem_flag_enable(eve, BM_ELEM_TAG);
+ break;
+ }
+ }
+ }
+
+ /* flush vertex tags to edges */
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
+ BM_elem_flag_set(
+ eed, BM_ELEM_TAG,
+ (BM_elem_flag_test(eed->v1, BM_ELEM_TAG) &&
+ BM_elem_flag_test(eed->v2, BM_ELEM_TAG)));
+ }
- /* find next eve */
+ /* find a vertex with only one tagged edge */
+ eve_start = NULL;
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
+ int tot_eed_tag = 0;
BM_ITER_ELEM (eed, &eiter, eve, BM_EDGES_OF_VERT) {
if (BM_elem_flag_test(eed, BM_ELEM_TAG)) {
- BMVert *eve_other = BM_edge_other_vert(eed, eve);
- if (BM_elem_flag_test(eve_other, BM_ELEM_TAG)) {
- /* this is a tagged vert we didnt walk over yet, step onto it */
- eve_next = eve_other;
- break;
- }
+ tot_eed_tag++;
}
}
- eve = eve_next;
+ if (tot_eed_tag == 1) {
+ eve_start = eve;
+ break;
+ }
}
- /* now we have all verts, make into a line */
- if (BLI_array_len(eve_line) > 2) {
-
- /* we know the returns from these must be valid */
- const float *uv_start = uv_sel_co_from_eve(
- scene, obedit, ima, em, eve_line[0]);
- const float *uv_end = uv_sel_co_from_eve(
- scene, obedit, ima, em, eve_line[BLI_array_len(eve_line) - 1]);
- /* For t & u modes */
- float a = 0.0f;
-
- if (tool == 't') {
- if (uv_start[1] == uv_end[1])
- tool = 's';
- else
- a = (uv_end[0] - uv_start[0]) / (uv_end[1] - uv_start[1]);
- }
- else if (tool == 'u') {
- if (uv_start[0] == uv_end[0])
- tool = 's';
- else
- a = (uv_end[1] - uv_start[1]) / (uv_end[0] - uv_start[0]);
+ if (eve_start) {
+ BMVert **eve_line = NULL;
+ BMVert *eve_next = NULL;
+ BLI_array_declare(eve_line);
+ int i;
+
+ eve = eve_start;
+
+ /* walk over edges, building an array of verts in a line */
+ while (eve) {
+ BLI_array_append(eve_line, eve);
+ /* don't touch again */
+ BM_elem_flag_disable(eve, BM_ELEM_TAG);
+
+ eve_next = NULL;
+
+ /* find next eve */
+ BM_ITER_ELEM (eed, &eiter, eve, BM_EDGES_OF_VERT) {
+ if (BM_elem_flag_test(eed, BM_ELEM_TAG)) {
+ BMVert *eve_other = BM_edge_other_vert(eed, eve);
+ if (BM_elem_flag_test(eve_other, BM_ELEM_TAG)) {
+ /* this is a tagged vert we didn't walk over yet, step onto it */
+ eve_next = eve_other;
+ break;
+ }
+ }
+ }
+
+ eve = eve_next;
}
- /* go over all verts except for endpoints */
- for (i = 0; i < BLI_array_len(eve_line); i++) {
- BM_ITER_ELEM (l, &liter, eve_line[i], BM_LOOPS_OF_VERT) {
- if (!uvedit_face_visible_test(scene, obedit, ima, l->f))
- continue;
+ /* now we have all verts, make into a line */
+ if (BLI_array_len(eve_line) > 2) {
+
+ /* we know the returns from these must be valid */
+ const float *uv_start = uv_sel_co_from_eve(
+ scene, obedit, ima, em, eve_line[0]);
+ const float *uv_end = uv_sel_co_from_eve(
+ scene, obedit, ima, em, eve_line[BLI_array_len(eve_line) - 1]);
+ /* For UV_STRAIGHTEN_X & UV_STRAIGHTEN_Y modes */
+ float a = 0.0f;
+ eUVWeldAlign tool_local = tool;
+
+ if (tool_local == UV_STRAIGHTEN_X) {
+ if (uv_start[1] == uv_end[1])
+ tool_local = UV_STRAIGHTEN;
+ else
+ a = (uv_end[0] - uv_start[0]) / (uv_end[1] - uv_start[1]);
+ }
+ else if (tool_local == UV_STRAIGHTEN_Y) {
+ if (uv_start[0] == uv_end[0])
+ tool_local = UV_STRAIGHTEN;
+ else
+ a = (uv_end[1] - uv_start[1]) / (uv_end[0] - uv_start[0]);
+ }
- if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
- MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- /* Projection of point (x, y) over line (x1, y1, x2, y2) along X axis:
- * new_y = (y2 - y1) / (x2 - x1) * (x - x1) + y1
- * Maybe this should be a BLI func? Or is it already existing?
- * Could use interp_v2_v2v2, but not sure it's worth it here...*/
- if (tool == 't')
- luv->uv[0] = a * (luv->uv[1] - uv_start[1]) + uv_start[0];
- else if (tool == 'u')
- luv->uv[1] = a * (luv->uv[0] - uv_start[0]) + uv_start[1];
- else
- closest_to_line_segment_v2(luv->uv, luv->uv, uv_start, uv_end);
+ /* go over all verts except for endpoints */
+ for (i = 0; i < BLI_array_len(eve_line); i++) {
+ BM_ITER_ELEM (l, &liter, eve_line[i], BM_LOOPS_OF_VERT) {
+ if (!uvedit_face_visible_test(scene, obedit, ima, l->f))
+ continue;
+
+ if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
+ MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ /* Projection of point (x, y) over line (x1, y1, x2, y2) along X axis:
+ * new_y = (y2 - y1) / (x2 - x1) * (x - x1) + y1
+ * Maybe this should be a BLI func? Or is it already existing?
+ * Could use interp_v2_v2v2, but not sure it's worth it here...*/
+ if (tool_local == UV_STRAIGHTEN_X)
+ luv->uv[0] = a * (luv->uv[1] - uv_start[1]) + uv_start[0];
+ else if (tool_local == UV_STRAIGHTEN_Y)
+ luv->uv[1] = a * (luv->uv[0] - uv_start[0]) + uv_start[1];
+ else
+ closest_to_line_segment_v2(luv->uv, luv->uv, uv_start, uv_end);
+ changed = true;
+ }
}
}
}
+ else {
+ /* error - not a line, needs 3+ points */
+ }
+
+ if (eve_line) {
+ MEM_freeN(eve_line);
+ }
}
else {
- /* error - not a line, needs 3+ points */
- }
-
- if (eve_line) {
- MEM_freeN(eve_line);
+ /* error - cant find an endpoint */
}
}
- else {
- /* error - cant find an endpoint */
+
+ if (changed) {
+ uvedit_live_unwrap_update(sima, scene, obedit);
+ DEG_id_tag_update(obedit->data, 0);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
}
}
-
- uvedit_live_unwrap_update(sima, scene, obedit);
- DEG_id_tag_update(obedit->data, 0);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ MEM_freeN(objects);
}
static int uv_align_exec(bContext *C, wmOperator *op)
@@ -1715,12 +1781,16 @@ static int uv_align_exec(bContext *C, wmOperator *op)
static void UV_OT_align(wmOperatorType *ot)
{
static const EnumPropertyItem axis_items[] = {
- {'s', "ALIGN_S", 0, "Straighten", "Align UVs along the line defined by the endpoints"},
- {'t', "ALIGN_T", 0, "Straighten X", "Align UVs along the line defined by the endpoints along the X axis"},
- {'u', "ALIGN_U", 0, "Straighten Y", "Align UVs along the line defined by the endpoints along the Y axis"},
- {'a', "ALIGN_AUTO", 0, "Align Auto", "Automatically choose the axis on which there is most alignment already"},
- {'x', "ALIGN_X", 0, "Align X", "Align UVs on X axis"},
- {'y', "ALIGN_Y", 0, "Align Y", "Align UVs on Y axis"},
+ {UV_STRAIGHTEN, "ALIGN_S", 0, "Straighten",
+ "Align UVs along the line defined by the endpoints"},
+ {UV_STRAIGHTEN_X, "ALIGN_T", 0, "Straighten X",
+ "Align UVs along the line defined by the endpoints along the X axis"},
+ {UV_STRAIGHTEN_Y, "ALIGN_U", 0, "Straighten Y",
+ "Align UVs along the line defined by the endpoints along the Y axis"},
+ {UV_ALIGN_AUTO, "ALIGN_AUTO", 0, "Align Auto",
+ "Automatically choose the axis on which there is most alignment already"},
+ {UV_ALIGN_X, "ALIGN_X", 0, "Align X", "Align UVs on X axis"},
+ {UV_ALIGN_Y, "ALIGN_Y", 0, "Align Y", "Align UVs on Y axis"},
{0, NULL, 0, NULL, NULL}};
/* identifiers */
@@ -1734,7 +1804,7 @@ static void UV_OT_align(wmOperatorType *ot)
ot->poll = ED_operator_uvedit;
/* properties */
- RNA_def_enum(ot->srna, "axis", axis_items, 'a', "Axis", "Axis to align UV locations on");
+ RNA_def_enum(ot->srna, "axis", axis_items, UV_ALIGN_AUTO, "Axis", "Axis to align UV locations on");
}
/** \} */
@@ -1743,149 +1813,275 @@ static void UV_OT_align(wmOperatorType *ot)
/** \name Remove Doubles Operator
* \{ */
-typedef struct UVvert {
- MLoopUV *uv_loop;
- bool weld;
-} UVvert;
-
-static int uv_remove_doubles_exec(bContext *C, wmOperator *op)
+static int uv_remove_doubles_to_selected(bContext *C, wmOperator *op)
{
+ Scene *scene = CTX_data_scene(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ SpaceImage *sima = CTX_wm_space_image(C);
+ Image *ima = CTX_data_edit_image(C);
+ ToolSettings *ts = scene->toolsettings;
+
const float threshold = RNA_float_get(op->ptr, "threshold");
- const bool use_unselected = RNA_boolean_get(op->ptr, "use_unselected");
+ const bool synced_selection = (ts->uv_flag & UV_SYNC_SELECTION) != 0;
- SpaceImage *sima;
- Scene *scene;
- Object *obedit = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
- Image *ima;
- int uv_a_index;
- int uv_b_index;
- float *uv_a;
- const float *uv_b;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, &objects_len);
- BMIter iter, liter;
- BMFace *efa;
- BMLoop *l;
+ bool *changed = MEM_callocN(sizeof(bool) * objects_len, "uv_remove_doubles_selected.changed");
- const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+ /* Maximum index of an objects[i]'s MLoopUVs in MLoopUV_arr.
+ * It helps find which MLoopUV in *MLoopUV_arr belongs to which object. */
+ uint *ob_mloopuv_max_idx = MEM_callocN(sizeof(uint) * objects_len,
+ "uv_remove_doubles_selected.ob_mloopuv_max_idx");
- sima = CTX_wm_space_image(C);
- scene = CTX_data_scene(C);
- ima = CTX_data_edit_image(C);
+ /* Calculate max possible number of kdtree nodes. */
+ int uv_maxlen = 0;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
- if (use_unselected == false) {
- UVvert *vert_arr = NULL;
- BLI_array_declare(vert_arr);
- MLoopUV **loop_arr = NULL;
- BLI_array_declare(loop_arr);
+ if (synced_selection && (em->bm->totvertsel == 0)) {
+ continue;
+ }
- /* TODO, use kd-tree as with MESH_OT_remove_doubles, this isn't optimal */
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- if (!uvedit_face_visible_test(scene, obedit, ima, efa))
+ uv_maxlen += em->bm->totloop;
+ }
+
+ KDTree *tree = BLI_kdtree_new(uv_maxlen);
+
+ int *duplicates = NULL;
+ BLI_array_declare(duplicates);
+
+ MLoopUV **mloopuv_arr = NULL;
+ BLI_array_declare(mloopuv_arr);
+
+ int mloopuv_count = 0; /* Also used for *duplicates count. */
+
+ float uvw[3];
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ BMIter iter, liter;
+ BMFace *efa;
+ BMLoop *l;
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+
+ if (synced_selection && (em->bm->totvertsel == 0)) {
+ continue;
+ }
+
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+
+ BM_ITER_MESH(efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ if (!uvedit_face_visible_test(scene, obedit, ima, efa)) {
continue;
+ }
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ BM_ITER_ELEM(l, &liter, efa, BM_LOOPS_OF_FACE) {
if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- UVvert vert;
- vert.uv_loop = luv;
- vert.weld = false;
- BLI_array_append(vert_arr, vert);
+ copy_v3_fl3(uvw, luv->uv[0], luv->uv[1], 0.0f);
+ BLI_kdtree_insert(tree, mloopuv_count, uvw);
+ BLI_array_append(duplicates, -1);
+ BLI_array_append(mloopuv_arr, luv);
+ mloopuv_count++;
}
+ }
+ }
+
+ ob_mloopuv_max_idx[ob_index] = mloopuv_count - 1;
+ }
+ BLI_kdtree_balance(tree);
+ int found_duplicates = BLI_kdtree_calc_duplicates_fast(tree, threshold, false, duplicates);
+
+ if (found_duplicates > 0) {
+ /* Calculate average uv for duplicates. */
+ int *uv_duplicate_count = MEM_callocN(sizeof(int) * mloopuv_count,
+ "uv_remove_doubles_selected.uv_duplicate_count");
+ for (int i = 0; i < mloopuv_count; i++) {
+ if (duplicates[i] == -1) { /* If doesn't reference another */
+ uv_duplicate_count[i]++; /* self */
+ continue;
+ }
+
+ if (duplicates[i] != i) {
+ /* If not self then accumulate uv for averaging.
+ * Self uv is already present in accumulator */
+ add_v2_v2(mloopuv_arr[duplicates[i]]->uv, mloopuv_arr[i]->uv);
}
+ uv_duplicate_count[duplicates[i]]++;
}
- for (uv_a_index = 0; uv_a_index < BLI_array_len(vert_arr); uv_a_index++) {
- if (vert_arr[uv_a_index].weld == false) {
- float uv_min[2];
- float uv_max[2];
+ for (int i = 0; i < mloopuv_count; i++) {
+ if (uv_duplicate_count[i] < 2) {
+ continue;
+ }
- BLI_array_clear(loop_arr);
- BLI_array_append(loop_arr, vert_arr[uv_a_index].uv_loop);
+ mul_v2_fl(mloopuv_arr[i]->uv, 1.0f / (float)uv_duplicate_count[i]);
+ }
+ MEM_freeN(uv_duplicate_count);
- uv_a = vert_arr[uv_a_index].uv_loop->uv;
+ /* Update duplicated uvs. */
+ uint ob_index = 0;
+ for (int i = 0; i < mloopuv_count; i++) {
+ /* Make sure we know which object owns the MLoopUV at this index.
+ * Remember that in some cases the object will have no loop uv,
+ * thus we need the while loop, and not simply an if check. */
+ while (ob_mloopuv_max_idx[ob_index] < i) {
+ ob_index++;
+ }
- copy_v2_v2(uv_max, uv_a);
- copy_v2_v2(uv_min, uv_a);
+ if (duplicates[i] == -1) {
+ continue;
+ }
- vert_arr[uv_a_index].weld = true;
- for (uv_b_index = uv_a_index + 1; uv_b_index < BLI_array_len(vert_arr); uv_b_index++) {
- uv_b = vert_arr[uv_b_index].uv_loop->uv;
- if ((vert_arr[uv_b_index].weld == false) &&
- (len_manhattan_v2v2(uv_a, uv_b) < threshold))
- {
- minmax_v2v2_v2(uv_min, uv_max, uv_b);
- BLI_array_append(loop_arr, vert_arr[uv_b_index].uv_loop);
- vert_arr[uv_b_index].weld = true;
- }
- }
- if (BLI_array_len(loop_arr)) {
- float uv_mid[2];
- mid_v2_v2v2(uv_mid, uv_min, uv_max);
- for (uv_b_index = 0; uv_b_index < BLI_array_len(loop_arr); uv_b_index++) {
- copy_v2_v2(loop_arr[uv_b_index]->uv, uv_mid);
- }
- }
+ copy_v2_v2(mloopuv_arr[i]->uv, mloopuv_arr[duplicates[i]]->uv);
+ changed[ob_index] = true;
+ }
+
+ for (ob_index = 0; ob_index < objects_len; ob_index++) {
+ if (changed[ob_index]) {
+ Object *obedit = objects[ob_index];
+ uvedit_live_unwrap_update(sima, scene, obedit);
+ DEG_id_tag_update(obedit->data, 0);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
}
}
+ }
+
+ BLI_kdtree_free(tree);
+ BLI_array_free(mloopuv_arr);
+ BLI_array_free(duplicates);
+ MEM_freeN(changed);
+ MEM_freeN(objects);
+ MEM_freeN(ob_mloopuv_max_idx);
+
+ return OPERATOR_FINISHED;
+}
+
+static int uv_remove_doubles_to_unselected(bContext *C, wmOperator *op)
+{
+ Scene *scene = CTX_data_scene(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ SpaceImage *sima = CTX_wm_space_image(C);
+ Image *ima = CTX_data_edit_image(C);
+ ToolSettings *ts = scene->toolsettings;
+
+ const float threshold = RNA_float_get(op->ptr, "threshold");
+ const bool synced_selection = (ts->uv_flag & UV_SYNC_SELECTION) != 0;
- BLI_array_free(vert_arr);
- BLI_array_free(loop_arr);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, &objects_len);
+
+ /* Calculate max possible number of kdtree nodes. */
+ int uv_maxlen = 0;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ uv_maxlen += em->bm->totloop;
}
- else {
- /* selected -> unselected
- *
- * No need to use 'UVvert' here */
- MLoopUV **loop_arr = NULL;
- BLI_array_declare(loop_arr);
- MLoopUV **loop_arr_unselected = NULL;
- BLI_array_declare(loop_arr_unselected);
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- if (!uvedit_face_visible_test(scene, obedit, ima, efa))
+ KDTree *tree = BLI_kdtree_new(uv_maxlen);
+
+ MLoopUV **mloopuv_arr = NULL;
+ BLI_array_declare(mloopuv_arr);
+
+ int mloopuv_count = 0;
+
+ float uvw[3];
+ /* Add visible non-selected uvs to tree */
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ BMIter iter, liter;
+ BMFace *efa;
+ BMLoop *l;
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+
+ if (synced_selection && (em->bm->totvertsel == em->bm->totvert)) {
+ continue;
+ }
+
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+
+ BM_ITER_MESH(efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ if (!uvedit_face_visible_test(scene, obedit, ima, efa)) {
continue;
+ }
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
- BLI_array_append(loop_arr, luv);
- }
- else {
- BLI_array_append(loop_arr_unselected, luv);
+ BM_ITER_ELEM(l, &liter, efa, BM_LOOPS_OF_FACE) {
+ if (!uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
+ MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ copy_v3_fl3(uvw, luv->uv[0], luv->uv[1], 0.0f);
+ BLI_kdtree_insert(tree, mloopuv_count, uvw);
+ BLI_array_append(mloopuv_arr, luv);
+ mloopuv_count++;
}
}
}
+ }
- for (uv_a_index = 0; uv_a_index < BLI_array_len(loop_arr); uv_a_index++) {
- float dist_best = FLT_MAX, dist;
- const float *uv_best = NULL;
+ BLI_kdtree_balance(tree);
- uv_a = loop_arr[uv_a_index]->uv;
- for (uv_b_index = 0; uv_b_index < BLI_array_len(loop_arr_unselected); uv_b_index++) {
- uv_b = loop_arr_unselected[uv_b_index]->uv;
- dist = len_manhattan_v2v2(uv_a, uv_b);
- if ((dist < threshold) && (dist < dist_best)) {
- uv_best = uv_b;
- dist_best = dist;
- }
+ /* For each selected uv, find duplicate non selected uv. */
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ BMIter iter, liter;
+ BMFace *efa;
+ BMLoop *l;
+ bool changed = false;
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+
+ if (synced_selection && (em->bm->totvertsel == 0)) {
+ continue;
+ }
+
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+
+ BM_ITER_MESH(efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ if (!uvedit_face_visible_test(scene, obedit, ima, efa)) {
+ continue;
}
- if (uv_best) {
- copy_v2_v2(uv_a, uv_best);
+
+ BM_ITER_ELEM(l, &liter, efa, BM_LOOPS_OF_FACE) {
+ if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
+ MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ copy_v3_fl3(uvw, luv->uv[0], luv->uv[1], 0.0f);
+
+ KDTreeNearest nearest;
+ const int i = BLI_kdtree_find_nearest(tree, uvw, &nearest);
+
+ if (i != -1 && nearest.dist < threshold) {
+ copy_v2_v2(luv->uv, mloopuv_arr[i]->uv);
+ changed = true;
+ }
+ }
}
}
- BLI_array_free(loop_arr);
- BLI_array_free(loop_arr_unselected);
+ if (changed) {
+ uvedit_live_unwrap_update(sima, scene, obedit);
+ DEG_id_tag_update(obedit->data, 0);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ }
}
- uvedit_live_unwrap_update(sima, scene, obedit);
- DEG_id_tag_update(obedit->data, 0);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ BLI_kdtree_free(tree);
+ BLI_array_free(mloopuv_arr);
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
+static int uv_remove_doubles_exec(bContext *C, wmOperator *op)
+{
+ if (RNA_boolean_get(op->ptr, "use_unselected")) {
+ return uv_remove_doubles_to_unselected(C, op);
+ }
+ else {
+ return uv_remove_doubles_to_selected(C, op);
+ }
+}
+
static void UV_OT_remove_doubles(wmOperatorType *ot)
{
/* identifiers */
@@ -1911,7 +2107,7 @@ static void UV_OT_remove_doubles(wmOperatorType *ot)
static int uv_weld_exec(bContext *C, wmOperator *UNUSED(op))
{
- uv_weld_align(C, 'w');
+ uv_weld_align(C, UV_WELD);
return OPERATOR_FINISHED;
}
@@ -2049,7 +2245,9 @@ static void uv_select_all_perform_multi(
static int uv_select_all_exec(bContext *C, wmOperator *op)
{
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
Scene *scene = CTX_data_scene(C);
+ ToolSettings *ts = scene->toolsettings;
Image *ima = CTX_data_edit_image(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
@@ -2062,8 +2260,7 @@ static int uv_select_all_exec(bContext *C, wmOperator *op)
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
Object *obedit = objects[ob_index];
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ uv_select_tag_update_for_object(depsgraph, ts, obedit);
}
MEM_freeN(objects);
@@ -2119,6 +2316,7 @@ static int uv_mouse_select_multi(
bContext *C, Object **objects, uint objects_len,
const float co[2], bool extend, bool loop)
{
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
SpaceImage *sima = CTX_wm_space_image(C);
Scene *scene = CTX_data_scene(C);
ToolSettings *ts = scene->toolsettings;
@@ -2376,8 +2574,10 @@ static int uv_mouse_select_multi(
#endif
}
- DEG_id_tag_update(obedit->data, DEG_TAG_COPY_ON_WRITE | DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obiter = objects[ob_index];
+ uv_select_tag_update_for_object(depsgraph, ts, obiter);
+ }
return OPERATOR_PASS_THROUGH | OPERATOR_FINISHED;
}
@@ -2622,67 +2822,76 @@ static void UV_OT_select_linked_pick(wmOperatorType *ot)
static int uv_select_split_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
ToolSettings *ts = scene->toolsettings;
Image *ima = CTX_data_edit_image(C);
- Object *obedit = CTX_data_edit_object(C);
- BMesh *bm = BKE_editmesh_from_object(obedit)->bm;
BMFace *efa;
BMLoop *l;
BMIter iter, liter;
MLoopUV *luv;
- bool changed = false;
-
- const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
if (ts->uv_flag & UV_SYNC_SELECTION) {
BKE_report(op->reports, RPT_ERROR, "Cannot split selection when sync selection is enabled");
return OPERATOR_CANCELLED;
}
+ bool changed_multi = false;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, &objects_len);
- BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- bool is_sel = false;
- bool is_unsel = false;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMesh *bm = BKE_editmesh_from_object(obedit)->bm;
- if (!uvedit_face_visible_test(scene, obedit, ima, efa))
- continue;
+ bool changed = false;
- /* are we all selected? */
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
- if (luv->flag & MLOOPUV_VERTSEL) {
- is_sel = true;
- }
- else {
- is_unsel = true;
- }
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
+ bool is_sel = false;
+ bool is_unsel = false;
- /* we have mixed selection, bail out */
- if (is_sel && is_unsel) {
- break;
+ if (!uvedit_face_visible_test(scene, obedit, ima, efa)) {
+ continue;
}
- }
- if (is_sel && is_unsel) {
+ /* are we all selected? */
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- luv->flag &= ~MLOOPUV_VERTSEL;
+
+ if (luv->flag & MLOOPUV_VERTSEL) {
+ is_sel = true;
+ }
+ else {
+ is_unsel = true;
+ }
+
+ /* we have mixed selection, bail out */
+ if (is_sel && is_unsel) {
+ break;
+ }
}
- changed = true;
+ if (is_sel && is_unsel) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ luv->flag &= ~MLOOPUV_VERTSEL;
+ }
+
+ changed = true;
+ }
}
- }
- if (changed) {
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_IMAGE, NULL);
- return OPERATOR_FINISHED;
- }
- else {
- return OPERATOR_CANCELLED;
+ if (changed) {
+ changed_multi = true;
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_IMAGE, NULL);
+ }
}
+ MEM_freeN(objects);
+
+ return changed_multi ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
@@ -2718,6 +2927,20 @@ static void uv_select_sync_flush(ToolSettings *ts, BMEditMesh *em, const short s
}
}
+static void uv_select_tag_update_for_object(Depsgraph *depsgraph, const ToolSettings *ts, Object *obedit)
+{
+ if (ts->uv_flag & UV_SYNC_SELECTION) {
+ DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
+ WM_main_add_notifier(NC_GEOM | ND_SELECT, obedit->data);
+ }
+ else {
+ Object *obedit_eval = DEG_get_evaluated_object(depsgraph, obedit);
+ BKE_mesh_batch_cache_dirty_tag(obedit_eval->data, BKE_MESH_BATCH_DIRTY_UVEDIT_SELECT);
+ /* Only for region redraw. */
+ WM_main_add_notifier(NC_GEOM | ND_SELECT, obedit->data);
+ }
+}
+
/** \} */
/* -------------------------------------------------------------------- */
@@ -2945,11 +3168,12 @@ static void uv_select_flush_from_tag_loop(SpaceImage *sima, Scene *scene, Object
/** \} */
/* -------------------------------------------------------------------- */
-/** \name Border Select Operator
+/** \name Box Select Operator
* \{ */
-static int uv_border_select_exec(bContext *C, wmOperator *op)
+static int uv_box_select_exec(bContext *C, wmOperator *op)
{
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
SpaceImage *sima = CTX_wm_space_image(C);
Scene *scene = CTX_data_scene(C);
ToolSettings *ts = scene->toolsettings;
@@ -3055,11 +3279,7 @@ static int uv_border_select_exec(bContext *C, wmOperator *op)
changed_multi = true;
uv_select_sync_flush(ts, em, select);
-
- if (ts->uv_flag & UV_SYNC_SELECTION) {
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
- }
+ uv_select_tag_update_for_object(depsgraph, ts, obedit);
}
}
@@ -3068,27 +3288,27 @@ static int uv_border_select_exec(bContext *C, wmOperator *op)
return changed_multi ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
-static void UV_OT_select_border(wmOperatorType *ot)
+static void UV_OT_select_box(wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Border Select";
- ot->description = "Select UV vertices using border selection";
- ot->idname = "UV_OT_select_border";
+ ot->name = "Box Select";
+ ot->description = "Select UV vertices using box selection";
+ ot->idname = "UV_OT_select_box";
/* api callbacks */
- ot->invoke = WM_gesture_border_invoke;
- ot->exec = uv_border_select_exec;
- ot->modal = WM_gesture_border_modal;
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = uv_box_select_exec;
+ ot->modal = WM_gesture_box_modal;
ot->poll = ED_operator_uvedit_space_image; /* requires space image */;
- ot->cancel = WM_gesture_border_cancel;
+ ot->cancel = WM_gesture_box_cancel;
/* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ ot->flag = OPTYPE_UNDO;
/* properties */
RNA_def_boolean(ot->srna, "pinned", 0, "Pinned", "Border select pinned UVs only");
- WM_operator_properties_gesture_border_select(ot);
+ WM_operator_properties_gesture_box_select(ot);
}
/** \} */
@@ -3108,11 +3328,11 @@ static int uv_inside_circle(const float uv[2], const float offset[2], const floa
static int uv_circle_select_exec(bContext *C, wmOperator *op)
{
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
SpaceImage *sima = CTX_wm_space_image(C);
Scene *scene = CTX_data_scene(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
ToolSettings *ts = scene->toolsettings;
- Object *obedit = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
ARegion *ar = CTX_wm_region(C);
BMFace *efa;
BMLoop *l;
@@ -3121,14 +3341,12 @@ static int uv_circle_select_exec(bContext *C, wmOperator *op)
int x, y, radius, width, height;
float zoomx, zoomy, offset[2], ellipse[2];
const bool select = !RNA_boolean_get(op->ptr, "deselect");
- bool changed = false;
+
const bool use_face_center = (
(ts->uv_flag & UV_SYNC_SELECTION) ?
(ts->selectmode == SCE_SELECT_FACE) :
(ts->uv_selectmode == UV_SELECT_FACE));
- const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
-
/* get operator properties */
x = RNA_int_get(op->ptr, "x");
y = RNA_int_get(op->ptr, "y");
@@ -3144,62 +3362,77 @@ static int uv_circle_select_exec(bContext *C, wmOperator *op)
UI_view2d_region_to_view(&ar->v2d, x, y, &offset[0], &offset[1]);
- /* do selection */
- if (use_face_center) {
- changed = false;
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- BM_elem_flag_disable(efa, BM_ELEM_TAG);
- /* assume not touched */
- if (select != uvedit_face_select_test(scene, efa, cd_loop_uv_offset)) {
- float cent[2];
- uv_poly_center(efa, cent, cd_loop_uv_offset);
- if (uv_inside_circle(cent, offset, ellipse)) {
- BM_elem_flag_enable(efa, BM_ELEM_TAG);
- changed = true;
+ bool changed_multi = false;
+
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, &objects_len);
+
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+
+ bool changed = false;
+
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+
+ /* do selection */
+ if (use_face_center) {
+ changed = false;
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ BM_elem_flag_disable(efa, BM_ELEM_TAG);
+ /* assume not touched */
+ if (select != uvedit_face_select_test(scene, efa, cd_loop_uv_offset)) {
+ float cent[2];
+ uv_poly_center(efa, cent, cd_loop_uv_offset);
+ if (uv_inside_circle(cent, offset, ellipse)) {
+ BM_elem_flag_enable(efa, BM_ELEM_TAG);
+ changed = true;
+ }
}
}
- }
- /* (de)selects all tagged faces and deals with sticky modes */
- if (changed) {
- uv_select_flush_from_tag_face(sima, scene, obedit, select);
+ /* (de)selects all tagged faces and deals with sticky modes */
+ if (changed) {
+ uv_select_flush_from_tag_face(sima, scene, obedit, select);
+ }
}
- }
- else {
- BM_mesh_elem_hflag_disable_all(em->bm, BM_VERT, BM_ELEM_TAG, false);
+ else {
+ BM_mesh_elem_hflag_disable_all(em->bm, BM_VERT, BM_ELEM_TAG, false);
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- if (uv_inside_circle(luv->uv, offset, ellipse)) {
- changed = true;
- uvedit_uv_select_set(em, scene, l, select, false, cd_loop_uv_offset);
- BM_elem_flag_enable(l->v, BM_ELEM_TAG);
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ if (uv_inside_circle(luv->uv, offset, ellipse)) {
+ changed = true;
+ uvedit_uv_select_set(em, scene, l, select, false, cd_loop_uv_offset);
+ BM_elem_flag_enable(l->v, BM_ELEM_TAG);
+ }
}
}
- }
- if (sima->sticky == SI_STICKY_VERTEX) {
- uvedit_vertex_select_tagged(em, scene, select, cd_loop_uv_offset);
+ if (sima->sticky == SI_STICKY_VERTEX) {
+ uvedit_vertex_select_tagged(em, scene, select, cd_loop_uv_offset);
+ }
}
- }
- if (changed) {
- uv_select_sync_flush(ts, em, select);
+ if (changed) {
+ changed_multi = true;
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ uv_select_sync_flush(ts, em, select);
+ uv_select_tag_update_for_object(depsgraph, ts, obedit);
+ }
}
+ MEM_freeN(objects);
- return OPERATOR_FINISHED;
+ return changed_multi ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
-static void UV_OT_circle_select(wmOperatorType *ot)
+static void UV_OT_select_circle(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Circle Select";
ot->description = "Select UV vertices using circle selection";
- ot->idname = "UV_OT_circle_select";
+ ot->idname = "UV_OT_select_circle";
/* api callbacks */
ot->invoke = WM_gesture_circle_invoke;
@@ -3209,7 +3442,7 @@ static void UV_OT_circle_select(wmOperatorType *ot)
ot->cancel = WM_gesture_circle_cancel;
/* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ ot->flag = OPTYPE_UNDO;
/* properties */
WM_operator_properties_gesture_circle_select(ot);
@@ -3224,6 +3457,7 @@ static void UV_OT_circle_select(wmOperatorType *ot)
static bool do_lasso_select_mesh_uv(bContext *C, const int mcords[][2], short moves,
const bool select, const bool extend)
{
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
SpaceImage *sima = CTX_wm_space_image(C);
Image *ima = CTX_data_edit_image(C);
ARegion *ar = CTX_wm_region(C);
@@ -3318,14 +3552,11 @@ static bool do_lasso_select_mesh_uv(bContext *C, const int mcords[][2], short mo
if (changed) {
changed_multi = true;
- uv_select_sync_flush(scene->toolsettings, em, select);
-
- if (ts->uv_flag & UV_SYNC_SELECTION) {
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
- }
+ uv_select_sync_flush(ts, em, select);
+ uv_select_tag_update_for_object(depsgraph, ts, obedit);
}
}
+ MEM_freeN(objects);
return changed_multi;
}
@@ -3603,42 +3834,62 @@ static bool uv_snap_uvs_to_pixels(SpaceImage *sima, Scene *scene, Object *obedit
static int uv_snap_selection_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima = CTX_wm_space_image(C);
Scene *scene = CTX_data_scene(C);
- Object *obedit = CTX_data_edit_object(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ SpaceImage *sima = CTX_wm_space_image(C);
Image *ima = CTX_data_edit_image(C);
- bool changed = false;
+ ToolSettings *ts = scene->toolsettings;
+ const bool synced_selection = (ts->uv_flag & UV_SYNC_SELECTION) != 0;
+ const int target = RNA_enum_get(op->ptr, "target");
+ float offset[2] = {0};
- switch (RNA_enum_get(op->ptr, "target")) {
- case 0:
- changed = uv_snap_uvs_to_pixels(sima, scene, obedit);
- break;
- case 1:
- changed = uv_snap_uvs_to_cursor(scene, ima, obedit, sima->cursor);
- break;
- case 2:
- {
- float center[2];
- if (ED_uvedit_center(scene, ima, obedit, center, sima->around)) {
- float offset[2];
- sub_v2_v2v2(offset, sima->cursor, center);
- changed = uv_snap_uvs_offset(scene, ima, obedit, offset);
- }
- break;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, &objects_len);
+
+ if (target == 2) {
+ float center[2];
+ if (!ED_uvedit_center_multi(scene, ima, objects, objects_len, center, sima->around)) {
+ MEM_freeN(objects);
+ return OPERATOR_CANCELLED;
}
- case 3:
- changed = uv_snap_uvs_to_adjacent_unselected(scene, ima, obedit);
- break;
+ sub_v2_v2v2(offset, sima->cursor, center);
}
- if (!changed)
- return OPERATOR_CANCELLED;
+ bool changed_multi = false;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
- uvedit_live_unwrap_update(sima, scene, obedit);
- DEG_id_tag_update(obedit->data, 0);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ if (synced_selection && (em->bm->totvertsel == 0)) {
+ continue;
+ }
- return OPERATOR_FINISHED;
+ bool changed = false;
+ switch (target) {
+ case 0:
+ changed = uv_snap_uvs_to_pixels(sima, scene, obedit);
+ break;
+ case 1:
+ changed = uv_snap_uvs_to_cursor(scene, ima, obedit, sima->cursor);
+ break;
+ case 2:
+ changed = uv_snap_uvs_offset(scene, ima, obedit, offset);
+ break;
+ case 3:
+ changed = uv_snap_uvs_to_adjacent_unselected(scene, ima, obedit);
+ break;
+ }
+
+ if (changed) {
+ changed_multi = true;
+ uvedit_live_unwrap_update(sima, scene, obedit);
+ DEG_id_tag_update(obedit->data, 0);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ }
+ }
+ MEM_freeN(objects);
+
+ return changed_multi ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
static void UV_OT_snap_selected(wmOperatorType *ot)
@@ -3673,36 +3924,55 @@ static void UV_OT_snap_selected(wmOperatorType *ot)
static int uv_pin_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
- Object *obedit = CTX_data_edit_object(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
Image *ima = CTX_data_edit_image(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
BMFace *efa;
BMLoop *l;
BMIter iter, liter;
MLoopUV *luv;
+ ToolSettings *ts = scene->toolsettings;
const bool clear = RNA_boolean_get(op->ptr, "clear");
+ const bool synced_selection = (ts->uv_flag & UV_SYNC_SELECTION) != 0;
- const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, &objects_len);
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- if (!uvedit_face_visible_test(scene, obedit, ima, efa))
- continue;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ bool changed = false;
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
- if (!clear) {
- if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset))
- luv->flag |= MLOOPUV_PINNED;
+ if (synced_selection && (em->bm->totvertsel == 0)) {
+ continue;
+ }
+
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ if (!uvedit_face_visible_test(scene, obedit, ima, efa)) {
+ continue;
}
- else {
- if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset))
- luv->flag &= ~MLOOPUV_PINNED;
+
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+
+ if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
+ changed = true;
+ if (clear) {
+ luv->flag &= ~MLOOPUV_PINNED;
+ }
+ else {
+ luv->flag |= MLOOPUV_PINNED;
+ }
+ }
}
}
- }
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ if (changed) {
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ }
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -3731,31 +4001,46 @@ static void UV_OT_pin(wmOperatorType *ot)
static int uv_select_pinned_exec(bContext *C, wmOperator *UNUSED(op))
{
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
Scene *scene = CTX_data_scene(C);
- Object *obedit = CTX_data_edit_object(C);
+ ToolSettings *ts = scene->toolsettings;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
Image *ima = CTX_data_edit_image(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
BMFace *efa;
BMLoop *l;
BMIter iter, liter;
MLoopUV *luv;
- const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, &objects_len);
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- if (!uvedit_face_visible_test(scene, obedit, ima, efa))
- continue;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+ bool changed = false;
+
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ if (!uvedit_face_visible_test(scene, obedit, ima, efa)) {
+ continue;
+ }
+
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- if (luv->flag & MLOOPUV_PINNED)
- uvedit_uv_select_enable(em, scene, l, false, cd_loop_uv_offset);
+ if (luv->flag & MLOOPUV_PINNED) {
+ uvedit_uv_select_enable(em, scene, l, false, cd_loop_uv_offset);
+ changed = true;
+ }
+ }
}
- }
- DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ if (changed) {
+ uv_select_tag_update_for_object(depsgraph, ts, obedit);
+ }
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -4116,9 +4401,6 @@ static void UV_OT_cursor_set(wmOperatorType *ot)
ot->invoke = uv_set_2d_cursor_invoke;
ot->poll = uv_set_2d_cursor_poll;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
/* properties */
RNA_def_float_vector(ot->srna, "location", 2, NULL, -FLT_MAX, FLT_MAX, "Location",
"Cursor location in normalized (0.0-1.0) coordinates", -10.0f, 10.0f);
@@ -4132,117 +4414,116 @@ static void UV_OT_cursor_set(wmOperatorType *ot)
static int uv_seams_from_islands_exec(bContext *C, wmOperator *op)
{
- UvVertMap *vmap;
- Object *ob = CTX_data_edit_object(C);
- Mesh *me = (Mesh *)ob->data;
- BMEditMesh *em;
- BMEdge *editedge;
- float limit[2] = {STD_UV_CONNECT_LIMIT, STD_UV_CONNECT_LIMIT};
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ int ret = OPERATOR_CANCELLED;
+ const float limit[2] = {STD_UV_CONNECT_LIMIT, STD_UV_CONNECT_LIMIT};
const bool mark_seams = RNA_boolean_get(op->ptr, "mark_seams");
const bool mark_sharp = RNA_boolean_get(op->ptr, "mark_sharp");
- BMesh *bm;
- BMIter iter;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, &objects_len);
- em = me->edit_btmesh;
- bm = em->bm;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ Mesh *me = (Mesh *)ob->data;
+ BMEditMesh *em = me->edit_btmesh;
+ BMesh *bm = em->bm;
- if (!EDBM_uv_check(em)) {
- return OPERATOR_CANCELLED;
- }
+ UvVertMap *vmap;
+ BMEdge *editedge;
+ BMIter iter;
+
+ if (!EDBM_uv_check(em)) {
+ continue;
+ }
+ ret = OPERATOR_FINISHED;
- /* This code sets editvert->tmp.l to the index. This will be useful later on. */
- BM_mesh_elem_table_ensure(bm, BM_FACE);
- vmap = BM_uv_vert_map_create(bm, limit, false, false);
-
- BM_ITER_MESH (editedge, &iter, bm, BM_EDGES_OF_MESH) {
- /* flags to determine if we uv is separated from first editface match */
- char separated1 = 0, separated2;
- /* set to denote edge must be flagged as seam */
- char faces_separated = 0;
- /* flag to keep track if uv1 is disconnected from first editface match */
- char v1coincident = 1;
- /* For use with v1coincident. v1coincident will change only if we've had commonFaces */
- int commonFaces = 0;
-
- BMFace *efa1, *efa2;
-
- UvMapVert *mv1, *mvinit1, *mv2, *mvinit2, *mviter;
- /* mv2cache stores the first of the list of coincident uv's for later comparison
- * mv2sep holds the last separator and is copied to mv2cache when a hit is first found */
- UvMapVert *mv2cache = NULL, *mv2sep = NULL;
-
- mvinit1 = vmap->vert[BM_elem_index_get(editedge->v1)];
- if (mark_seams)
- BM_elem_flag_disable(editedge, BM_ELEM_SEAM);
-
- for (mv1 = mvinit1; mv1 && !faces_separated; mv1 = mv1->next) {
- if (mv1->separate && commonFaces)
- v1coincident = 0;
-
- separated2 = 0;
- efa1 = BM_face_at_index(bm, mv1->poly_index);
- mvinit2 = vmap->vert[BM_elem_index_get(editedge->v2)];
-
- for (mv2 = mvinit2; mv2; mv2 = mv2->next) {
- if (mv2->separate)
- mv2sep = mv2;
-
- efa2 = BM_face_at_index(bm, mv2->poly_index);
- if (efa1 == efa2) {
- /* if v1 is not coincident no point in comparing */
- if (v1coincident) {
- /* have we found previously anything? */
- if (mv2cache) {
- /* flag seam unless proved to be coincident with previous hit */
- separated2 = 1;
- for (mviter = mv2cache; mviter; mviter = mviter->next) {
- if (mviter->separate && mviter != mv2cache)
- break;
- /* coincident with previous hit, do not flag seam */
- if (mviter == mv2)
- separated2 = 0;
+ /* This code sets editvert->tmp.l to the index. This will be useful later on. */
+ BM_mesh_elem_table_ensure(bm, BM_FACE);
+ vmap = BM_uv_vert_map_create(bm, limit, false, false);
+
+ BM_ITER_MESH (editedge, &iter, bm, BM_EDGES_OF_MESH) {
+ /* flags to determine if we uv is separated from first editface match */
+ char separated1 = 0, separated2;
+ /* set to denote edge must be flagged as seam */
+ char faces_separated = 0;
+ /* flag to keep track if uv1 is disconnected from first editface match */
+ char v1coincident = 1;
+ /* For use with v1coincident. v1coincident will change only if we've had commonFaces */
+ int commonFaces = 0;
+
+ BMFace *efa1, *efa2;
+
+ UvMapVert *mv1, *mvinit1, *mv2, *mvinit2, *mviter;
+ /* mv2cache stores the first of the list of coincident uv's for later comparison
+ * mv2sep holds the last separator and is copied to mv2cache when a hit is first found */
+ UvMapVert *mv2cache = NULL, *mv2sep = NULL;
+
+ mvinit1 = vmap->vert[BM_elem_index_get(editedge->v1)];
+ if (mark_seams)
+ BM_elem_flag_disable(editedge, BM_ELEM_SEAM);
+
+ for (mv1 = mvinit1; mv1 && !faces_separated; mv1 = mv1->next) {
+ if (mv1->separate && commonFaces)
+ v1coincident = 0;
+
+ separated2 = 0;
+ efa1 = BM_face_at_index(bm, mv1->poly_index);
+ mvinit2 = vmap->vert[BM_elem_index_get(editedge->v2)];
+
+ for (mv2 = mvinit2; mv2; mv2 = mv2->next) {
+ if (mv2->separate)
+ mv2sep = mv2;
+
+ efa2 = BM_face_at_index(bm, mv2->poly_index);
+ if (efa1 == efa2) {
+ /* if v1 is not coincident no point in comparing */
+ if (v1coincident) {
+ /* have we found previously anything? */
+ if (mv2cache) {
+ /* flag seam unless proved to be coincident with previous hit */
+ separated2 = 1;
+ for (mviter = mv2cache; mviter; mviter = mviter->next) {
+ if (mviter->separate && mviter != mv2cache)
+ break;
+ /* coincident with previous hit, do not flag seam */
+ if (mviter == mv2)
+ separated2 = 0;
+ }
+ }
+ /* First hit case, store the hit in the cache */
+ else {
+ mv2cache = mv2sep;
+ commonFaces = 1;
}
}
- /* First hit case, store the hit in the cache */
- else {
- mv2cache = mv2sep;
- commonFaces = 1;
- }
- }
- else
- separated1 = 1;
+ else
+ separated1 = 1;
- if (separated1 || separated2) {
- faces_separated = 1;
- break;
+ if (separated1 || separated2) {
+ faces_separated = 1;
+ break;
+ }
}
}
}
- }
- if (faces_separated) {
- if (mark_seams)
- BM_elem_flag_enable(editedge, BM_ELEM_SEAM);
- if (mark_sharp)
- BM_elem_flag_disable(editedge, BM_ELEM_SMOOTH);
+ if (faces_separated) {
+ if (mark_seams)
+ BM_elem_flag_enable(editedge, BM_ELEM_SEAM);
+ if (mark_sharp)
+ BM_elem_flag_disable(editedge, BM_ELEM_SMOOTH);
+ }
}
- }
- if (mark_seams) {
- me->drawflag |= ME_DRAWSEAMS;
- }
- if (mark_sharp) {
- me->drawflag |= ME_DRAWSHARP;
- }
-
-
- BM_uv_vert_map_free(vmap);
+ BM_uv_vert_map_free(vmap);
- DEG_id_tag_update(&me->id, 0);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, me);
+ DEG_id_tag_update(&me->id, 0);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, me);
+ }
+ MEM_freeN(objects);
- return OPERATOR_FINISHED;
+ return ret;
}
@@ -4272,33 +4553,53 @@ static void UV_OT_seams_from_islands(wmOperatorType *ot)
static int uv_mark_seam_exec(bContext *C, wmOperator *op)
{
- Object *ob = CTX_data_edit_object(C);
Scene *scene = CTX_data_scene(C);
- Mesh *me = (Mesh *)ob->data;
- BMEditMesh *em = me->edit_btmesh;
- BMesh *bm = em->bm;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ ToolSettings *ts = scene->toolsettings;
+
BMFace *efa;
BMLoop *loop;
BMIter iter, liter;
- bool flag_set = !RNA_boolean_get(op->ptr, "clear");
- const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
+ const bool flag_set = !RNA_boolean_get(op->ptr, "clear");
+ const bool synced_selection = (ts->uv_flag & UV_SYNC_SELECTION) != 0;
- BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- BM_ITER_ELEM (loop, &liter, efa, BM_LOOPS_OF_FACE) {
- if (uvedit_edge_select_test(scene, loop, cd_loop_uv_offset)) {
- BM_elem_flag_set(loop->e, BM_ELEM_SEAM, flag_set);
- }
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, &objects_len);
+
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
+ Mesh *me = (Mesh *)ob->data;
+ BMEditMesh *em = me->edit_btmesh;
+ BMesh *bm = em->bm;
+
+ if (synced_selection && (bm->totedgesel == 0)) {
+ continue;
}
- }
- me->drawflag |= ME_DRAWSEAMS;
+ const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
- if (scene->toolsettings->edge_mode_live_unwrap)
- ED_unwrap_lscm(scene, ob, false, false);
+ bool changed = false;
+
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (loop, &liter, efa, BM_LOOPS_OF_FACE) {
+ if (uvedit_edge_select_test(scene, loop, cd_loop_uv_offset)) {
+ BM_elem_flag_set(loop->e, BM_ELEM_SEAM, flag_set);
+ changed = true;
+ }
+ }
+ }
- DEG_id_tag_update(&me->id, 0);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, me);
+ if (changed) {
+ if (scene->toolsettings->edge_mode_live_unwrap) {
+ ED_unwrap_lscm(scene, ob, false, false);
+ }
+
+ DEG_id_tag_update(&me->id, 0);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, me);
+ }
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -4357,9 +4658,9 @@ void ED_operatortypes_uvedit(void)
WM_operatortype_append(UV_OT_select_linked_pick);
WM_operatortype_append(UV_OT_select_split);
WM_operatortype_append(UV_OT_select_pinned);
- WM_operatortype_append(UV_OT_select_border);
+ WM_operatortype_append(UV_OT_select_box);
WM_operatortype_append(UV_OT_select_lasso);
- WM_operatortype_append(UV_OT_circle_select);
+ WM_operatortype_append(UV_OT_select_circle);
WM_operatortype_append(UV_OT_select_more);
WM_operatortype_append(UV_OT_select_less);
@@ -4395,112 +4696,9 @@ void ED_operatortypes_uvedit(void)
void ED_keymap_uvedit(wmKeyConfig *keyconf)
{
wmKeyMap *keymap;
- wmKeyMapItem *kmi;
keymap = WM_keymap_ensure(keyconf, "UV Editor", 0, 0);
keymap->poll = ED_operator_uvedit_can_uv_sculpt;
-
-#ifdef USE_WM_KEYMAP_27X
- /* Uv sculpt toggle */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", QKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.use_uv_sculpt");
-#endif
-
- /* Select Element (Sync Select: on) */
- ED_keymap_editmesh_elem_mode(keyconf, keymap);
- /* Hack to prevent fall-through, when the button isn't visible. */
- WM_keymap_add_item(keymap, "MESH_OT_select_mode", FOURKEY, KM_PRESS, 0, 0);
- /* Select Element (Sync Select: off) */
- WM_keymap_add_context_enum_set_items(
- keymap, rna_enum_mesh_select_mode_uv_items, "tool_settings.uv_select_mode",
- ONEKEY, KM_PRESS, 0, 0);
-
- /* Mark edge seam */
- WM_keymap_add_item(keymap, "UV_OT_mark_seam", EKEY, KM_PRESS, KM_CTRL, 0);
-
- /* pick selection */
- RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_select", SELECTMOUSE, KM_PRESS, 0, 0)->ptr, "extend", false);
- RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", true);
- RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_select_loop", SELECTMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "extend", false);
- RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_select_loop", SELECTMOUSE, KM_PRESS, KM_SHIFT | KM_ALT, 0)->ptr, "extend", true);
- WM_keymap_add_item(keymap, "UV_OT_select_split", YKEY, KM_PRESS, 0, 0);
-
- /* border/circle selection */
- kmi = WM_keymap_add_item(keymap, "UV_OT_select_border", BKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "pinned", false);
- kmi = WM_keymap_add_item(keymap, "UV_OT_select_border", BKEY, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "pinned", true);
-
- WM_keymap_add_item(keymap, "UV_OT_circle_select", CKEY, KM_PRESS, 0, 0);
-
- kmi = WM_keymap_add_item(keymap, "UV_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- kmi = WM_keymap_add_item(keymap, "UV_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "deselect", true);
-
- /* selection manipulation */
- kmi = WM_keymap_add_item(keymap, "UV_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- kmi = WM_keymap_add_item(keymap, "UV_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "extend", true);
- RNA_boolean_set(kmi->ptr, "deselect", false);
- kmi = WM_keymap_add_item(keymap, "UV_OT_select_linked", LKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "deselect", true);
- kmi = WM_keymap_add_item(keymap, "UV_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", false);
- RNA_boolean_set(kmi->ptr, "deselect", true);
-
- /* select more/less */
- WM_keymap_add_item(keymap, "UV_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "UV_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
-
- kmi = WM_keymap_add_item(keymap, "UV_OT_select_all", AKEY, KM_PRESS, 0, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_SELECT);
- kmi = WM_keymap_add_item(keymap, "UV_OT_select_all", AKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_DESELECT);
- kmi = WM_keymap_add_item(keymap, "UV_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
-
- WM_keymap_add_item(keymap, "UV_OT_select_pinned", PKEY, KM_PRESS, KM_SHIFT, 0);
-
- WM_keymap_add_menu(keymap, "IMAGE_MT_uvs_weldalign", WKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* uv operations */
- WM_keymap_add_item(keymap, "UV_OT_stitch", VKEY, KM_PRESS, 0, 0);
- kmi = WM_keymap_add_item(keymap, "UV_OT_pin", PKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "clear", false);
- kmi = WM_keymap_add_item(keymap, "UV_OT_pin", PKEY, KM_PRESS, KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "clear", true);
-
- /* unwrap */
- WM_keymap_add_item(keymap, "UV_OT_unwrap", UKEY, KM_PRESS, 0, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "UV_OT_minimize_stretch", VKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "UV_OT_pack_islands", PKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "UV_OT_average_islands_scale", AKEY, KM_PRESS, KM_CTRL, 0);
-#endif
-
- /* hide */
- kmi = WM_keymap_add_item(keymap, "UV_OT_hide", HKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(kmi->ptr, "unselected", false);
- kmi = WM_keymap_add_item(keymap, "UV_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "unselected", true);
-
- WM_keymap_add_item(keymap, "UV_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
-
- /* cursor */
- WM_keymap_add_item(keymap, "UV_OT_cursor_set", ACTIONMOUSE, KM_PRESS, 0, 0);
-
- /* menus */
- WM_keymap_add_menu(keymap, "IMAGE_MT_uvs_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_menu(keymap, "IMAGE_MT_uvs_select_mode", TABKEY, KM_PRESS, KM_CTRL, 0);
-
- ED_keymap_proportional_cycle(keyconf, keymap);
- ED_keymap_proportional_editmode(keyconf, keymap, false);
-
- transform_keymap_for_space(keyconf, keymap, SPACE_IMAGE);
}
/** \} */
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c
index 79e804725e5..412d68a5d4d 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -34,6 +34,8 @@
#include "BLI_heap.h"
#include "BLI_boxpack_2d.h"
#include "BLI_convexhull_2d.h"
+#include "BLI_polyfill_2d.h"
+#include "BLI_polyfill_2d_beautify.h"
#include "uvedit_parametrizer.h"
@@ -219,6 +221,8 @@ enum PHandleState {
typedef struct PHandle {
enum PHandleState state;
MemArena *arena;
+ MemArena *polyfill_arena;
+ Heap *polyfill_heap;
PChart *construction_chart;
PHash *hash_verts;
@@ -4119,6 +4123,8 @@ ParamHandle *param_construct_begin(void)
handle->construction_chart = p_chart_new(handle);
handle->state = PHANDLE_STATE_ALLOCATED;
handle->arena = BLI_memarena_new(MEM_SIZE_OPTIMAL(1 << 16), "param construct arena");
+ handle->polyfill_arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "param polyfill arena");
+ handle->polyfill_heap = BLI_heap_new_ex(BLI_POLYFILL_ALLOC_NGON_RESERVE);
handle->aspx = 1.0f;
handle->aspy = 1.0f;
handle->do_aspect = false;
@@ -4162,82 +4168,71 @@ void param_delete(ParamHandle *handle)
}
BLI_memarena_free(phandle->arena);
+ BLI_memarena_free(phandle->polyfill_arena);
+ BLI_heap_free(phandle->polyfill_heap, NULL);
MEM_freeN(phandle);
}
static void p_add_ngon(ParamHandle *handle, ParamKey key, int nverts,
ParamKey *vkeys, float **co, float **uv,
- ParamBool *pin, ParamBool *select, const float normal[3])
+ ParamBool *pin, ParamBool *select)
{
- int *boundary = BLI_array_alloca(boundary, nverts);
-
- /* boundary vertex indexes */
- for (int i = 0; i < nverts; i++) {
- boundary[i] = i;
- }
-
- while (nverts > 2) {
- float minangle = FLT_MAX;
- float minshape = FLT_MAX;
- int i, mini = 0;
-
- /* find corner with smallest angle */
- for (i = 0; i < nverts; i++) {
- int v0 = boundary[(i + nverts - 1) % nverts];
- int v1 = boundary[i];
- int v2 = boundary[(i + 1) % nverts];
- float angle = p_vec_angle(co[v0], co[v1], co[v2]);
- float n[3];
-
- normal_tri_v3(n, co[v0], co[v1], co[v2]);
+ /* Allocate memory for polyfill. */
+ PHandle *phandle = (PHandle *)handle;
+ MemArena *arena = phandle->polyfill_arena;
+ Heap *heap = phandle->polyfill_heap;
+ unsigned int nfilltri = nverts - 2;
+ unsigned int (*tris)[3] = BLI_memarena_alloc(arena, sizeof(*tris) * (size_t)nfilltri);
+ float (*projverts)[2] = BLI_memarena_alloc(arena, sizeof(*projverts) * (size_t)nverts);
- if (normal && (dot_v3v3(n, normal) < 0.0f))
- angle = (float)(2.0 * M_PI) - angle;
+ /* Calc normal, flipped: to get a positive 2d cross product. */
+ float normal[3];
+ zero_v3(normal);
- float other_angle = p_vec_angle(co[v2], co[v0], co[v1]);
- float shape = fabsf((float)M_PI - angle - 2.0f * other_angle);
+ const float *co_curr, *co_prev = co[nverts - 1];
+ for (int j = 0; j < nverts; j++) {
+ co_curr = co[j];
+ add_newell_cross_v3_v3v3(normal, co_prev, co_curr);
+ co_prev = co_curr;
+ }
+ if (UNLIKELY(normalize_v3(normal) == 0.0f)) {
+ normal[2] = 1.0f;
+ }
- if (fabsf(angle - minangle) < 0.01f) {
- /* for nearly equal angles, try to get well shaped triangles */
- if (shape < minshape) {
- minangle = angle;
- minshape = shape;
- mini = i;
- }
- }
- else if (angle < minangle) {
- minangle = angle;
- minshape = shape;
- mini = i;
- }
- }
+ /* Project verts to 2d. */
+ float axis_mat[3][3];
+ axis_dominant_v3_to_m3_negate(axis_mat, normal);
+ for (int j = 0; j < nverts; j++) {
+ mul_v2_m3v3(projverts[j], axis_mat, co[j]);
+ }
- /* add triangle in corner */
- {
- int v0 = boundary[(mini + nverts - 1) % nverts];
- int v1 = boundary[mini];
- int v2 = boundary[(mini + 1) % nverts];
+ BLI_polyfill_calc_arena(projverts, nverts, 1, tris, arena);
- ParamKey tri_vkeys[3] = {vkeys[v0], vkeys[v1], vkeys[v2]};
- float *tri_co[3] = {co[v0], co[v1], co[v2]};
- float *tri_uv[3] = {uv[v0], uv[v1], uv[v2]};
- ParamBool tri_pin[3] = {pin[v0], pin[v1], pin[v2]};
- ParamBool tri_select[3] = {select[v0], select[v1], select[v2]};
+ /* Beautify helps avoid thin triangles that give numerical problems. */
+ BLI_polyfill_beautify(projverts, nverts, tris, arena, heap);
- param_face_add(handle, key, 3, tri_vkeys, tri_co, tri_uv, tri_pin, tri_select, NULL);
- }
+ /* Add triangles. */
+ for (int j = 0; j < nfilltri; j++) {
+ unsigned int *tri = tris[j];
+ unsigned int v0 = tri[0];
+ unsigned int v1 = tri[1];
+ unsigned int v2 = tri[2];
- /* remove corner */
- if (mini + 1 < nverts)
- memmove(boundary + mini, boundary + mini + 1, (nverts - mini - 1) * sizeof(int));
+ ParamKey tri_vkeys[3] = {vkeys[v0], vkeys[v1], vkeys[v2]};
+ float *tri_co[3] = {co[v0], co[v1], co[v2]};
+ float *tri_uv[3] = {uv[v0], uv[v1], uv[v2]};
+ ParamBool tri_pin[3] = {pin[v0], pin[v1], pin[v2]};
+ ParamBool tri_select[3] = {select[v0], select[v1], select[v2]};
- nverts--;
+ param_face_add(handle, key, 3, tri_vkeys, tri_co, tri_uv, tri_pin, tri_select);
}
+
+ BLI_memarena_clear(arena);
}
void param_face_add(ParamHandle *handle, ParamKey key, int nverts,
ParamKey *vkeys, float *co[4], float *uv[4],
- ParamBool *pin, ParamBool *select, float normal[3])
+ ParamBool *pin, ParamBool *select)
{
PHandle *phandle = (PHandle *)handle;
@@ -4247,7 +4242,7 @@ void param_face_add(ParamHandle *handle, ParamKey key, int nverts,
if (nverts > 4) {
/* ngon */
- p_add_ngon(handle, key, nverts, vkeys, co, uv, pin, select, normal);
+ p_add_ngon(handle, key, nverts, vkeys, co, uv, pin, select);
}
else if (nverts == 4) {
/* quad */
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.h b/source/blender/editors/uvedit/uvedit_parametrizer.h
index 2714bc33769..e42944f3da4 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.h
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.h
@@ -62,8 +62,7 @@ void param_face_add(ParamHandle *handle,
float *co[4],
float *uv[4],
ParamBool *pin,
- ParamBool *select,
- float face_normal[3]);
+ ParamBool *select);
void param_edge_set_seam(ParamHandle *handle,
ParamKey *vkeys);
diff --git a/source/blender/editors/uvedit/uvedit_smart_stitch.c b/source/blender/editors/uvedit/uvedit_smart_stitch.c
index 422c3489e01..c358cffa0b4 100644
--- a/source/blender/editors/uvedit/uvedit_smart_stitch.c
+++ b/source/blender/editors/uvedit/uvedit_smart_stitch.c
@@ -233,6 +233,18 @@ enum StitchModes {
STITCH_EDGE
};
+/* UvElement identification. */
+typedef struct UvElementID {
+ int faceIndex;
+ int elementIndex;
+} UvElementID;
+
+/* StitchState initializition. */
+typedef struct StitchStateInit {
+ int uv_selected_count;
+ UvElementID *to_select;
+} StitchStateInit;
+
/* constructor */
static StitchPreviewer *stitch_preview_init(void)
{
@@ -915,8 +927,16 @@ static void stitch_validate_edge_stitchability(
if ((edge_iter->element->island == ssc->static_island) || (edge->element->island == ssc->static_island)) {
edge->flag |= STITCH_STITCHABLE;
preview->num_stitchable++;
- stitch_setup_face_preview_for_uv_group(state->uvs[edge->uv1], ssc, state, island_stitch_data, preview_position);
- stitch_setup_face_preview_for_uv_group(state->uvs[edge->uv2], ssc, state, island_stitch_data, preview_position);
+ stitch_setup_face_preview_for_uv_group(state->uvs[edge->uv1],
+ ssc,
+ state,
+ island_stitch_data,
+ preview_position);
+ stitch_setup_face_preview_for_uv_group(state->uvs[edge->uv2],
+ ssc,
+ state,
+ island_stitch_data,
+ preview_position);
return;
}
}
@@ -1007,7 +1027,8 @@ static int stitch_process_data(
preview_position[i].data_position = STITCH_NO_PREVIEW;
}
- island_stitch_data = MEM_callocN(sizeof(*island_stitch_data) * state->element_map->totalIslands, "stitch_island_data");
+ island_stitch_data = MEM_callocN(sizeof(*island_stitch_data) * state->element_map->totalIslands,
+ "stitch_island_data");
if (!island_stitch_data) {
return 0;
}
@@ -1015,9 +1036,9 @@ static int stitch_process_data(
/* store indices to editVerts and Faces. May be unneeded but ensuring anyway */
BM_mesh_elem_index_ensure(bm, BM_VERT | BM_FACE);
- /*****************************************
- * First determine stitchability of uvs *
- *****************************************/
+ /****************************************
+ * First determine stitchability of uvs *
+ ****************************************/
for (i = 0; i < state->selection_size; i++) {
if (ssc->mode == STITCH_VERT) {
@@ -1074,8 +1095,8 @@ static int stitch_process_data(
}
/*********************************************************************
- * Setup the stitchable & unstitchable preview buffers and fill *
- * them with the appropriate data *
+ * Setup the stitchable & unstitchable preview buffers and fill *
+ * them with the appropriate data *
*********************************************************************/
if (!final) {
BMLoop *l;
@@ -1083,8 +1104,10 @@ static int stitch_process_data(
int stitchBufferIndex = 0, unstitchBufferIndex = 0;
int preview_size = (ssc->mode == STITCH_VERT) ? 2 : 4;
/* initialize the preview buffers */
- preview->preview_stitchable = (float *)MEM_mallocN(preview->num_stitchable * sizeof(float) * preview_size, "stitch_preview_stitchable_data");
- preview->preview_unstitchable = (float *)MEM_mallocN(preview->num_unstitchable * sizeof(float) * preview_size, "stitch_preview_unstitchable_data");
+ preview->preview_stitchable = (float *)MEM_mallocN(preview->num_stitchable * sizeof(float) * preview_size,
+ "stitch_preview_stitchable_data");
+ preview->preview_unstitchable = (float *)MEM_mallocN(preview->num_unstitchable * sizeof(float) * preview_size,
+ "stitch_preview_unstitchable_data");
/* will cause cancel and freeing of all data structures so OK */
if (!preview->preview_stitchable || !preview->preview_unstitchable) {
@@ -1153,9 +1176,9 @@ static int stitch_process_data(
return 1;
}
- /*****************************************
- * Setup preview for stitchable islands *
- *****************************************/
+ /****************************************
+ * Setup preview for stitchable islands *
+ ****************************************/
if (ssc->snap_islands) {
for (i = 0; i < state->element_map->totalIslands; i++) {
if (island_stitch_data[i].addedForPreview) {
@@ -1181,10 +1204,12 @@ static int stitch_process_data(
unsigned int buffer_index = 0;
/* initialize the preview buffers */
- preview->preview_polys = (float *)MEM_mallocN(preview->preview_uvs * sizeof(float) * 2, "tri_uv_stitch_prev");
- preview->uvs_per_polygon = MEM_mallocN(preview->num_polys * sizeof(*preview->uvs_per_polygon), "tri_uv_stitch_prev");
+ preview->preview_polys = MEM_mallocN(preview->preview_uvs * sizeof(float) * 2, "tri_uv_stitch_prev");
+ preview->uvs_per_polygon = MEM_mallocN(preview->num_polys * sizeof(*preview->uvs_per_polygon),
+ "tri_uv_stitch_prev");
- preview->static_tris = (float *)MEM_mallocN(state->tris_per_island[ssc->static_island] * sizeof(float) * 6, "static_island_preview_tris");
+ preview->static_tris = MEM_mallocN(state->tris_per_island[ssc->static_island] * sizeof(float) * 6,
+ "static_island_preview_tris");
preview->num_static_tris = state->tris_per_island[ssc->static_island];
/* will cause cancel and freeing of all data structures so OK */
@@ -1379,7 +1404,12 @@ static int stitch_process_data(
(state->uvs[edge->uv1]->flag & STITCH_STITCHABLE) &&
(state->uvs[edge->uv2]->flag & STITCH_STITCHABLE))
{
- stitch_island_calculate_edge_rotation(edge, ssc, state, final_position, uvfinal_map, island_stitch_data);
+ stitch_island_calculate_edge_rotation(edge,
+ ssc,
+ state,
+ final_position,
+ uvfinal_map,
+ island_stitch_data);
island_stitch_data[state->uvs[edge->uv1]->island].use_edge_rotation = true;
}
}
@@ -1417,7 +1447,7 @@ static int stitch_process_data(
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
/* accumulate each islands' translation from stitchable elements. it is important to do here
- * because in final pass MTFaces get modified and result is zero. */
+ * because in final pass MTFaces get modified and result is zero. */
island_stitch_data[element->island].translation[0] += final_position[i].uv[0] - luv->uv[0];
island_stitch_data[element->island].translation[1] += final_position[i].uv[1] - luv->uv[1];
island_stitch_data[element->island].medianPoint[0] += luv->uv[0];
@@ -1728,8 +1758,14 @@ static void stitch_draw(const bContext *UNUSED(C), ARegion *UNUSED(ar), void *ar
GPU_vertbuf_attr_set(vbo, pos_id, tri_idx++, &stitch_preview->preview_polys[index + (j + 0) * 2]);
GPU_vertbuf_attr_set(vbo, pos_id, tri_idx++, &stitch_preview->preview_polys[index + (j + 1) * 2]);
- GPU_vertbuf_attr_set(vbo_line, pos_id, line_idx++, &stitch_preview->preview_polys[index + (j + 0) * 2]);
- GPU_vertbuf_attr_set(vbo_line, pos_id, line_idx++, &stitch_preview->preview_polys[index + (j + 1) * 2]);
+ GPU_vertbuf_attr_set(vbo_line,
+ pos_id,
+ line_idx++,
+ &stitch_preview->preview_polys[index + (j + 0) * 2]);
+ GPU_vertbuf_attr_set(vbo_line,
+ pos_id,
+ line_idx++,
+ &stitch_preview->preview_polys[index + (j + 1) * 2]);
}
/* Closing line */
@@ -1812,7 +1848,7 @@ static UvEdge *uv_edge_get(BMLoop *l, StitchState *state)
static StitchState *stitch_init(
bContext *C, wmOperator *op,
- StitchStateContainer *ssc, Object *obedit)
+ StitchStateContainer *ssc, Object *obedit, StitchStateInit *state_init)
{
/* for fast edge lookup... */
GHash *edge_hash;
@@ -1997,41 +2033,50 @@ static StitchState *stitch_init(
state->selection_size = 0;
/* Load old selection if redoing operator with different settings */
- /* WIP */
- if (false && RNA_struct_property_is_set(op->ptr, "selection")) {
+ if (state_init != NULL) {
int faceIndex, elementIndex;
UvElement *element;
enum StitchModes stored_mode = RNA_enum_get(op->ptr, "stored_mode");
BM_mesh_elem_table_ensure(em->bm, BM_FACE);
+ int selected_count = state_init->uv_selected_count;
+
if (stored_mode == STITCH_VERT) {
- state->selection_stack = MEM_mallocN(sizeof(*state->selection_stack) * state->total_separate_uvs, "uv_stitch_selection_stack");
+ state->selection_stack = MEM_mallocN(sizeof(*state->selection_stack) * state->total_separate_uvs,
+ "uv_stitch_selection_stack");
- RNA_BEGIN (op->ptr, itemptr, "selection")
- {
- faceIndex = RNA_int_get(&itemptr, "face_index");
- elementIndex = RNA_int_get(&itemptr, "element_index");
+ while (selected_count--) {
+ faceIndex = state_init->to_select[selected_count].faceIndex;
+ elementIndex = state_init->to_select[selected_count].elementIndex;
efa = BM_face_at_index(em->bm, faceIndex);
- element = BM_uv_element_get(state->element_map, efa, BM_iter_at_index(NULL, BM_LOOPS_OF_FACE, efa, elementIndex));
+ element = BM_uv_element_get(state->element_map,
+ efa,
+ BM_iter_at_index(NULL, BM_LOOPS_OF_FACE, efa, elementIndex));
stitch_select_uv(element, state, 1);
}
- RNA_END;
}
else {
- state->selection_stack = MEM_mallocN(sizeof(*state->selection_stack) * state->total_separate_edges, "uv_stitch_selection_stack");
+ state->selection_stack = MEM_mallocN(sizeof(*state->selection_stack) * state->total_separate_edges,
+ "uv_stitch_selection_stack");
- RNA_BEGIN (op->ptr, itemptr, "selection")
- {
+ while (selected_count--) {
UvEdge tmp_edge, *edge;
int uv1, uv2;
- faceIndex = RNA_int_get(&itemptr, "face_index");
- elementIndex = RNA_int_get(&itemptr, "element_index");
+ faceIndex = state_init->to_select[selected_count].faceIndex;
+ elementIndex = state_init->to_select[selected_count].elementIndex;
efa = BM_face_at_index(em->bm, faceIndex);
- element = BM_uv_element_get(state->element_map, efa, BM_iter_at_index(NULL, BM_LOOPS_OF_FACE, efa, elementIndex));
+ element = BM_uv_element_get(state->element_map,
+ efa,
+ BM_iter_at_index(NULL, BM_LOOPS_OF_FACE, efa, elementIndex));
uv1 = map[element - state->element_map->buf];
- element = BM_uv_element_get(state->element_map, efa, BM_iter_at_index(NULL, BM_LOOPS_OF_FACE, efa, (elementIndex + 1) % efa->len));
+ element = BM_uv_element_get(state->element_map,
+ efa,
+ BM_iter_at_index(NULL,
+ BM_LOOPS_OF_FACE,
+ efa,
+ (elementIndex + 1) % efa->len));
uv2 = map[element - state->element_map->buf];
if (uv1 < uv2) {
@@ -2047,20 +2092,17 @@ static StitchState *stitch_init(
stitch_select_edge(edge, state, true);
}
- RNA_END;
}
/* if user has switched the operator mode after operation, we need to convert
* the stored format */
if (ssc->mode != stored_mode) {
stitch_set_selection_mode(state, stored_mode);
}
- /* Clear the selection */
- RNA_collection_clear(op->ptr, "selection");
-
}
else {
if (ssc->mode == STITCH_VERT) {
- state->selection_stack = MEM_mallocN(sizeof(*state->selection_stack) * state->total_separate_uvs, "uv_stitch_selection_stack");
+ state->selection_stack = MEM_mallocN(sizeof(*state->selection_stack) * state->total_separate_uvs,
+ "uv_stitch_selection_stack");
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
@@ -2074,7 +2116,8 @@ static StitchState *stitch_init(
}
}
else {
- state->selection_stack = MEM_mallocN(sizeof(*state->selection_stack) * state->total_separate_edges, "uv_stitch_selection_stack");
+ state->selection_stack = MEM_mallocN(sizeof(*state->selection_stack) * state->total_separate_edges,
+ "uv_stitch_selection_stack");
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!(ts->uv_flag & UV_SYNC_SELECTION) &&
@@ -2211,10 +2254,54 @@ static int stitch_init_all(bContext *C, wmOperator *op)
ssc->states = MEM_callocN(sizeof(StitchState *) * objects_len, "StitchState");
ssc->objects_len = 0;
+ int *objs_selection_count = NULL;
+ UvElementID *selected_uvs_arr = NULL;
+ StitchStateInit *state_init = NULL;
+
+ if (RNA_struct_property_is_set(op->ptr, "selection") &&
+ RNA_struct_property_is_set(op->ptr, "objects_selection_count"))
+ {
+ /* Retrieve list of selected UVs, one list contains all selected UVs
+ * for all objects. */
+
+ objs_selection_count = MEM_mallocN(sizeof(int *) * objects_len, "objects_selection_count");
+ RNA_int_get_array(op->ptr, "objects_selection_count", objs_selection_count);
+
+ int total_selected = 0;
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ total_selected += objs_selection_count[ob_index];
+ }
+
+ selected_uvs_arr = MEM_callocN(sizeof(UvElementID) * total_selected, "selected_uvs_arr");
+ int sel_idx = 0;
+ RNA_BEGIN (op->ptr, itemptr, "selection")
+ {
+ BLI_assert(sel_idx < total_selected);
+ selected_uvs_arr[sel_idx].faceIndex = RNA_int_get(&itemptr, "face_index");
+ selected_uvs_arr[sel_idx].elementIndex = RNA_int_get(&itemptr, "element_index");
+ sel_idx++;
+ }
+ RNA_END;
+
+ RNA_collection_clear(op->ptr, "selection");
+
+ state_init = MEM_callocN(sizeof(StitchStateInit), "UV_init_selected");
+ state_init->to_select = selected_uvs_arr;
+ }
+
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
Object *obedit = objects[ob_index];
- StitchState *stitch_state_ob = stitch_init(C, op, ssc, obedit);
+ if (state_init != NULL) {
+ state_init->uv_selected_count = objs_selection_count[ob_index];
+ }
+
+ StitchState *stitch_state_ob = stitch_init(C, op, ssc, obedit, state_init);
+
+ if (state_init != NULL) {
+ /* Move pointer to beginning of next object's data. */
+ state_init->to_select += state_init->uv_selected_count;
+ }
if (stitch_state_ob) {
ssc->objects[ssc->objects_len] = obedit;
@@ -2224,6 +2311,9 @@ static int stitch_init_all(bContext *C, wmOperator *op)
}
MEM_freeN(objects);
+ MEM_SAFE_FREE(selected_uvs_arr);
+ MEM_SAFE_FREE(objs_selection_count);
+ MEM_SAFE_FREE(state_init);
if (ssc->objects_len == 0) {
state_delete_all(ssc);
@@ -2257,31 +2347,41 @@ static int stitch_init_all(bContext *C, wmOperator *op)
static int stitch_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
- Object *obedit = CTX_data_edit_object(C);
if (!stitch_init_all(C, op))
return OPERATOR_CANCELLED;
WM_event_add_modal_handler(C, op);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+
+ Scene *scene = CTX_data_scene(C);
+ ToolSettings *ts = scene->toolsettings;
+ const bool synced_selection = (ts->uv_flag & UV_SYNC_SELECTION) != 0;
+
+ StitchStateContainer *ssc = (StitchStateContainer *)op->customdata;
+
+ for (uint ob_index = 0; ob_index < ssc->objects_len; ob_index++) {
+ StitchState *state = ssc->states[ob_index];
+ Object *obedit = state->obedit;
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+
+ if (synced_selection && (em->bm->totvertsel == 0)) {
+ continue;
+ }
+
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ }
+
return OPERATOR_RUNNING_MODAL;
}
static void stitch_exit(bContext *C, wmOperator *op, int finished)
{
- Scene *scene;
- SpaceImage *sima;
+ Scene *scene = CTX_data_scene(C);
+ SpaceImage *sima = CTX_wm_space_image(C);
ScrArea *sa = CTX_wm_area(C);
- scene = CTX_data_scene(C);
- sima = CTX_wm_space_image(C);
-
StitchStateContainer *ssc = (StitchStateContainer *)op->customdata;
- StitchState *state = ssc->states[ssc->active_object_index];
- Object *obedit = state->obedit;
if (finished) {
- int i;
-
RNA_float_set(op->ptr, "limit", ssc->limit_dist);
RNA_boolean_set(op->ptr, "use_limit", ssc->use_limit);
RNA_boolean_set(op->ptr, "snap_islands", ssc->snap_islands);
@@ -2293,24 +2393,41 @@ static void stitch_exit(bContext *C, wmOperator *op, int finished)
RNA_int_set(op->ptr, "static_island", ssc->static_island);
- /* Store selection for re-execution of stitch */
- /* WIP */
- for (i = 0; i < state->selection_size; i++) {
- UvElement *element;
+ int *objs_selection_count = NULL;
+ objs_selection_count = MEM_mallocN(sizeof(int *) * ssc->objects_len, "objects_selection_count");
+
+ /* Store selection for re-execution of stitch
+ * - Store all selected UVs in "selection"
+ * - Store how many each object has in "objects_selection_count". */
+ RNA_collection_clear(op->ptr, "selection");
+ for (uint ob_index = 0; ob_index < ssc->objects_len; ob_index++) {
+ StitchState *state = ssc->states[ob_index];
+ Object *obedit = state->obedit;
+
PointerRNA itemptr;
- if (ssc->mode == STITCH_VERT) {
- element = state->selection_stack[i];
- }
- else {
- element = ((UvEdge *)state->selection_stack[i])->element;
+ for (int i = 0; i < state->selection_size; i++) {
+ UvElement *element;
+
+ if (ssc->mode == STITCH_VERT) {
+ element = state->selection_stack[i];
+ }
+ else {
+ element = ((UvEdge *)state->selection_stack[i])->element;
+ }
+ RNA_collection_add(op->ptr, "selection", &itemptr);
+
+ RNA_int_set(&itemptr, "face_index", BM_elem_index_get(element->l->f));
+ RNA_int_set(&itemptr, "element_index", element->loop_of_poly_index);
}
- RNA_collection_add(op->ptr, "selection", &itemptr);
+ uvedit_live_unwrap_update(sima, scene, obedit);
- RNA_int_set(&itemptr, "face_index", BM_elem_index_get(element->l->f));
- RNA_int_set(&itemptr, "element_index", element->loop_of_poly_index);
+ objs_selection_count[ob_index] = state->selection_size;
}
- uvedit_live_unwrap_update(sima, scene, obedit);
+ PropertyRNA *prop = RNA_struct_find_property(op->ptr, "objects_selection_count");
+ RNA_def_property_array(prop, ssc->objects_len);
+ RNA_int_set_array(op->ptr, "objects_selection_count", objs_selection_count);
+ MEM_freeN(objs_selection_count);
}
if (sa)
@@ -2318,8 +2435,21 @@ static void stitch_exit(bContext *C, wmOperator *op, int finished)
ED_region_draw_cb_exit(CTX_wm_region(C)->type, ssc->draw_handle);
- DEG_id_tag_update(obedit->data, 0);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ ToolSettings *ts = scene->toolsettings;
+ const bool synced_selection = (ts->uv_flag & UV_SYNC_SELECTION) != 0;
+
+ for (uint ob_index = 0; ob_index < ssc->objects_len; ob_index++) {
+ StitchState *state = ssc->states[ob_index];
+ Object *obedit = state->obedit;
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+
+ if (synced_selection && (em->bm->totvertsel == 0)) {
+ continue;
+ }
+
+ DEG_id_tag_update(obedit->data, 0);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ }
state_delete_all(ssc);
@@ -2361,9 +2491,7 @@ static StitchState *stitch_select(
UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &co[0], &co[1]);
if (ssc->mode == STITCH_VERT) {
- if (uv_find_nearest_vert_multi(
- scene, ima, ssc->objects, ssc->objects_len, co, 0.0f, &hit))
- {
+ if (uv_find_nearest_vert_multi(scene, ima, ssc->objects, ssc->objects_len, co, 0.0f, &hit)) {
/* Add vertex to selection, deselect all common uv's of vert other
* than selected and update the preview. This behavior was decided so that
* you can do stuff like deselect the opposite stitchable vertex and the initial still gets deselected */
@@ -2384,24 +2512,20 @@ static StitchState *stitch_select(
return state;
}
}
- else {
- if (uv_find_nearest_edge_multi(
- scene, ima, ssc->objects, ssc->objects_len, co, &hit))
- {
- /* find StitchState from hit->ob */
- StitchState *state = NULL;
- for (uint ob_index = 0; ob_index < ssc->objects_len; ob_index++) {
- if (hit.ob == ssc->objects[ob_index]) {
- state = ssc->states[ob_index];
- break;
- }
+ else if (uv_find_nearest_edge_multi(scene, ima, ssc->objects, ssc->objects_len, co, &hit)) {
+ /* find StitchState from hit->ob */
+ StitchState *state = NULL;
+ for (uint ob_index = 0; ob_index < ssc->objects_len; ob_index++) {
+ if (hit.ob == ssc->objects[ob_index]) {
+ state = ssc->states[ob_index];
+ break;
}
+ }
- UvEdge *edge = uv_edge_get(hit.l, state);
- stitch_select_edge(edge, state, false);
+ UvEdge *edge = uv_edge_get(hit.l, state);
+ stitch_select_edge(edge, state, false);
- return state;
- }
+ return state;
}
return NULL;
@@ -2501,7 +2625,7 @@ static int stitch_modal(bContext *C, wmOperator *op, const wmEvent *event)
if (goto_next_island(ssc)) {
StitchState *new_active_state = ssc->states[ssc->active_object_index];
- /* active_state is the origional active state */
+ /* active_state is the original active state */
if (active_state != new_active_state) {
if (!stitch_process_data(ssc, active_state, scene, false)) {
stitch_cancel(C, op);
@@ -2628,4 +2752,10 @@ void UV_OT_stitch(wmOperatorType *ot)
prop = RNA_def_collection_runtime(ot->srna, "selection", &RNA_SelectedUvElement, "Selection", "");
/* Selection should not be editable or viewed in toolbar */
RNA_def_property_flag(prop, PROP_HIDDEN);
+
+ /* test should not be editable or viewed in toolbar */
+ prop = RNA_def_int_array(ot->srna, "objects_selection_count", 1, NULL, 0, INT_MAX, "objects_selection_count",
+ "objects_selection_count", 0, INT_MAX);
+ RNA_def_property_array(prop, 6);
+ RNA_def_property_flag(prop, PROP_HIDDEN);
}
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index 52409dc2a1f..b344bb42318 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -262,7 +262,7 @@ static void construct_param_handle_face_add(ParamHandle *handle, Scene *scene,
select[i] = uvedit_uv_select_test(scene, l, cd_loop_uv_offset);
}
- param_face_add(handle, key, i, vkeys, co, uv, pin, select, efa->no);
+ param_face_add(handle, key, i, vkeys, co, uv, pin, select);
}
/* See: construct_param_handle_multi to handle multiple objects at once. */
@@ -571,7 +571,7 @@ static ParamHandle *construct_param_handle_subsurfed(Scene *scene, Object *ob, B
texface_from_original_index(origFace, origVertIndices[mloop[2].v], &uv[2], &pin[2], &select[2], scene, cd_loop_uv_offset);
texface_from_original_index(origFace, origVertIndices[mloop[3].v], &uv[3], &pin[3], &select[3], scene, cd_loop_uv_offset);
- param_face_add(handle, key, 4, vkeys, co, uv, pin, select, NULL);
+ param_face_add(handle, key, 4, vkeys, co, uv, pin, select);
}
/* these are calculated from original mesh too */
@@ -598,8 +598,8 @@ static ParamHandle *construct_param_handle_subsurfed(Scene *scene, Object *ob, B
typedef struct MinStretch {
Scene *scene;
- Object *obedit;
- BMEditMesh *em;
+ Object **objects_edit;
+ uint objects_len;
ParamHandle *handle;
float blend;
double lasttime;
@@ -610,24 +610,28 @@ typedef struct MinStretch {
static bool minimize_stretch_init(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
- Object *obedit = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+
MinStretch *ms;
const bool fill_holes = RNA_boolean_get(op->ptr, "fill_holes");
bool implicit = true;
- if (!uvedit_have_selection(scene, em, implicit)) {
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, &objects_len);
+
+ if (!uvedit_have_selection_multi(scene, objects, objects_len, implicit)) {
+ MEM_freeN(objects);
return false;
}
ms = MEM_callocN(sizeof(MinStretch), "MinStretch");
ms->scene = scene;
- ms->obedit = obedit;
- ms->em = em;
+ ms->objects_edit = objects;
+ ms->objects_len = objects_len;
ms->blend = RNA_float_get(op->ptr, "blend");
ms->iterations = RNA_int_get(op->ptr, "iterations");
ms->i = 0;
- ms->handle = construct_param_handle(scene, obedit, em->bm, implicit, fill_holes, 1, 1);
+ ms->handle = construct_param_handle_multi(scene, objects, objects_len, implicit, fill_holes, true, true);
ms->lasttime = PIL_check_seconds_timer();
param_stretch_begin(ms->handle);
@@ -643,6 +647,9 @@ static void minimize_stretch_iteration(bContext *C, wmOperator *op, bool interac
{
MinStretch *ms = op->customdata;
ScrArea *sa = CTX_wm_area(C);
+ Scene *scene = CTX_data_scene(C);
+ ToolSettings *ts = scene->toolsettings;
+ const bool synced_selection = (ts->uv_flag & UV_SYNC_SELECTION) != 0;
param_stretch_blend(ms->handle, ms->blend);
param_stretch_iter(ms->handle);
@@ -663,8 +670,17 @@ static void minimize_stretch_iteration(bContext *C, wmOperator *op, bool interac
ms->lasttime = PIL_check_seconds_timer();
- DEG_id_tag_update(ms->obedit->data, 0);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, ms->obedit->data);
+ for (uint ob_index = 0; ob_index < ms->objects_len; ob_index++) {
+ Object *obedit = ms->objects_edit[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+
+ if (synced_selection && (em->bm->totfacesel == 0)) {
+ continue;
+ }
+
+ DEG_id_tag_update(obedit->data, 0);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ }
}
}
@@ -672,6 +688,9 @@ static void minimize_stretch_exit(bContext *C, wmOperator *op, bool cancel)
{
MinStretch *ms = op->customdata;
ScrArea *sa = CTX_wm_area(C);
+ Scene *scene = CTX_data_scene(C);
+ ToolSettings *ts = scene->toolsettings;
+ const bool synced_selection = (ts->uv_flag & UV_SYNC_SELECTION) != 0;
ED_area_status_text(sa, NULL);
ED_workspace_status_text(C, NULL);
@@ -687,9 +706,19 @@ static void minimize_stretch_exit(bContext *C, wmOperator *op, bool cancel)
param_stretch_end(ms->handle);
param_delete(ms->handle);
- DEG_id_tag_update(ms->obedit->data, 0);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, ms->obedit->data);
+ for (uint ob_index = 0; ob_index < ms->objects_len; ob_index++) {
+ Object *obedit = ms->objects_edit[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ if (synced_selection && (em->bm->totfacesel == 0)) {
+ continue;
+ }
+
+ DEG_id_tag_update(obedit->data, 0);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ }
+
+ MEM_freeN(ms->objects_edit);
MEM_freeN(ms);
op->customdata = NULL;
}
@@ -885,23 +914,37 @@ void UV_OT_pack_islands(wmOperatorType *ot)
static int average_islands_scale_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene = CTX_data_scene(C);
- Object *obedit = CTX_data_edit_object(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ ToolSettings *ts = scene->toolsettings;
+ const bool synced_selection = (ts->uv_flag & UV_SYNC_SELECTION) != 0;
+ const bool implicit = true;
ParamHandle *handle;
- bool implicit = true;
- if (!uvedit_have_selection(scene, em, implicit)) {
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, &objects_len);
+
+ if (!uvedit_have_selection_multi(scene, objects, objects_len, implicit)) {
+ MEM_freeN(objects);
return OPERATOR_CANCELLED;
}
- handle = construct_param_handle(scene, obedit, em->bm, implicit, 0, 1, 1);
+ handle = construct_param_handle_multi(scene, objects, objects_len, implicit, false, true, true);
param_average(handle);
param_flush(handle);
param_delete(handle);
- DEG_id_tag_update(obedit->data, 0);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ if (synced_selection && (em->bm->totvertsel == 0)) {
+ continue;
+ }
+
+ DEG_id_tag_update(obedit->data, 0);
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -921,10 +964,14 @@ void UV_OT_average_islands_scale(wmOperatorType *ot)
/**************** Live Unwrap *****************/
-static ParamHandle *liveHandle = NULL;
+static struct {
+ ParamHandle **handles;
+ uint len, len_alloc;
+} g_live_unwrap = {NULL};
void ED_uvedit_live_unwrap_begin(Scene *scene, Object *obedit)
{
+ ParamHandle *handle = NULL;
BMEditMesh *em = BKE_editmesh_from_object(obedit);
const bool abf = (scene->toolsettings->unwrapper == 0);
const bool fillholes = (scene->toolsettings->uvcalc_flag & UVCALC_FILLHOLES) != 0;
@@ -937,29 +984,49 @@ void ED_uvedit_live_unwrap_begin(Scene *scene, Object *obedit)
}
if (use_subsurf)
- liveHandle = construct_param_handle_subsurfed(scene, obedit, em, fillholes, false, true);
+ handle = construct_param_handle_subsurfed(scene, obedit, em, fillholes, false, true);
else
- liveHandle = construct_param_handle(scene, obedit, em->bm, false, fillholes, false, true);
+ handle = construct_param_handle(scene, obedit, em->bm, false, fillholes, false, true);
+
+ param_lscm_begin(handle, PARAM_TRUE, abf);
- param_lscm_begin(liveHandle, PARAM_TRUE, abf);
+ /* Create or increase size of g_live_unwrap.handles array */
+ if (g_live_unwrap.handles == NULL) {
+ g_live_unwrap.len_alloc = 32;
+ g_live_unwrap.handles = MEM_mallocN(sizeof(ParamHandle *) * g_live_unwrap.len_alloc, "uvedit_live_unwrap_liveHandles");
+ g_live_unwrap.len = 0;
+ }
+ if (g_live_unwrap.len >= g_live_unwrap.len_alloc) {
+ g_live_unwrap.len_alloc *= 2;
+ g_live_unwrap.handles = MEM_reallocN(g_live_unwrap.handles, sizeof(ParamHandle *) * g_live_unwrap.len_alloc);
+ }
+ g_live_unwrap.handles[g_live_unwrap.len] = handle;
+ g_live_unwrap.len++;
}
void ED_uvedit_live_unwrap_re_solve(void)
{
- if (liveHandle) {
- param_lscm_solve(liveHandle);
- param_flush(liveHandle);
+ if (g_live_unwrap.handles) {
+ for (int i = 0; i < g_live_unwrap.len; i++) {
+ param_lscm_solve(g_live_unwrap.handles[i]);
+ param_flush(g_live_unwrap.handles[i]);
+ }
}
}
void ED_uvedit_live_unwrap_end(short cancel)
{
- if (liveHandle) {
- param_lscm_end(liveHandle);
- if (cancel)
- param_flush_restore(liveHandle);
- param_delete(liveHandle);
- liveHandle = NULL;
+ if (g_live_unwrap.handles) {
+ for (int i = 0; i < g_live_unwrap.len; i++) {
+ param_lscm_end(g_live_unwrap.handles[i]);
+ if (cancel)
+ param_flush_restore(g_live_unwrap.handles[i]);
+ param_delete(g_live_unwrap.handles[i]);
+ }
+ MEM_freeN(g_live_unwrap.handles);
+ g_live_unwrap.handles = NULL;
+ g_live_unwrap.len = 0;
+ g_live_unwrap.len_alloc = 0;
}
}
@@ -1068,12 +1135,12 @@ static void uv_map_transform_center(
}
}
-static void uv_map_rotation_matrix(float result[4][4], RegionView3D *rv3d, Object *ob,
- float upangledeg, float sideangledeg, float radius)
+static void uv_map_rotation_matrix_ex(
+ float result[4][4], RegionView3D *rv3d, Object *ob,
+ float upangledeg, float sideangledeg, float radius, float offset[4])
{
float rotup[4][4], rotside[4][4], viewmatrix[4][4], rotobj[4][4];
float sideangle = 0.0f, upangle = 0.0f;
- int k;
/* get rotation of the current view matrix */
if (rv3d)
@@ -1082,15 +1149,14 @@ static void uv_map_rotation_matrix(float result[4][4], RegionView3D *rv3d, Objec
unit_m4(viewmatrix);
/* but shifting */
- for (k = 0; k < 4; k++)
- viewmatrix[3][k] = 0.0f;
+ copy_v4_fl(viewmatrix[3], 0.0f);
/* get rotation of the current object matrix */
copy_m4_m4(rotobj, ob->obmat);
/* but shifting */
- for (k = 0; k < 4; k++)
- rotobj[3][k] = 0.0f;
+ add_v4_v4(rotobj[3], offset);
+ rotobj[3][3] = 0.0f;
zero_m4(rotup);
zero_m4(rotside);
@@ -1116,6 +1182,14 @@ static void uv_map_rotation_matrix(float result[4][4], RegionView3D *rv3d, Objec
mul_m4_series(result, rotup, rotside, viewmatrix, rotobj);
}
+static void uv_map_rotation_matrix(
+ float result[4][4], RegionView3D *rv3d, Object *ob,
+ float upangledeg, float sideangledeg, float radius)
+{
+ float offset[4] = {0};
+ uv_map_rotation_matrix_ex(result, rv3d, ob, upangledeg, sideangledeg, radius, offset);
+}
+
static void uv_map_transform(bContext *C, wmOperator *op, float rotmat[4][4])
{
/* context checks are messy here, making it work in both 3d view and uv editor */
@@ -1343,6 +1417,11 @@ void ED_unwrap_lscm(Scene *scene, Object *obedit, const short sel, const bool pa
param_delete(handle);
}
+enum {
+ UNWRAP_ERROR_NONUNIFORM = (1 << 0),
+ UNWRAP_ERROR_NEGATIVE = (1 << 1),
+};
+
static int unwrap_exec(bContext *C, wmOperator *op)
{
ViewLayer *view_layer = CTX_data_view_layer(C);
@@ -1351,8 +1430,10 @@ static int unwrap_exec(bContext *C, wmOperator *op)
const bool fill_holes = RNA_boolean_get(op->ptr, "fill_holes");
const bool correct_aspect = RNA_boolean_get(op->ptr, "correct_aspect");
const bool use_subsurf = RNA_boolean_get(op->ptr, "use_subsurf_data");
- float obsize[3];
bool implicit = false;
+ int reported_errors = 0;
+ /* We will report an error unless at least one object has the subsurf modifier in the right place. */
+ bool subsurf_error = use_subsurf;
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
@@ -1365,36 +1446,54 @@ static int unwrap_exec(bContext *C, wmOperator *op)
/* add uvs if they don't exist yet */
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
Object *obedit = objects[ob_index];
+ float obsize[3];
bool use_subsurf_final;
if (!ED_uvedit_ensure_uvs(C, scene, obedit)) {
continue;
}
+ if (subsurf_error) {
+ /* Double up the check here but better keep ED_unwrap_lscm interface simple and not
+ * pass operator for warning append. */
+ modifier_unwrap_state(obedit, scene, &use_subsurf_final);
+ if (use_subsurf_final) {
+ subsurf_error = false;
+ }
+ }
+
+ if (reported_errors & (UNWRAP_ERROR_NONUNIFORM | UNWRAP_ERROR_NEGATIVE)) {
+ continue;
+ }
+
mat4_to_size(obsize, obedit->obmat);
- if (!(fabsf(obsize[0] - obsize[1]) < 1e-4f && fabsf(obsize[1] - obsize[2]) < 1e-4f))
- BKE_report(op->reports, RPT_INFO,
- "Object has non-uniform scale, unwrap will operate on a non-scaled version of the mesh");
- else if (is_negative_m4(obedit->obmat))
- BKE_report(op->reports, RPT_INFO,
- "Object has negative scale, unwrap will operate on a non-flipped version of the mesh");
-
-
- /* double up the check here but better keep ED_unwrap_lscm interface simple and not
- * pass operator for warning append */
- modifier_unwrap_state(obedit, scene, &use_subsurf_final);
- if (use_subsurf != use_subsurf_final) {
- BKE_report(op->reports, RPT_INFO, "Subdivision Surface modifier needs to be first to work with unwrap");
+ if (!(fabsf(obsize[0] - obsize[1]) < 1e-4f && fabsf(obsize[1] - obsize[2]) < 1e-4f)) {
+ if ((reported_errors & UNWRAP_ERROR_NONUNIFORM) == 0) {
+ BKE_report(op->reports, RPT_INFO,
+ "Object has non-uniform scale, unwrap will operate on a non-scaled version of the mesh");
+ reported_errors |= UNWRAP_ERROR_NONUNIFORM;
+ }
+ }
+ else if (is_negative_m4(obedit->obmat)) {
+ if ((reported_errors & UNWRAP_ERROR_NEGATIVE) == 0) {
+ BKE_report(op->reports, RPT_INFO,
+ "Object has negative scale, unwrap will operate on a non-flipped version of the mesh");
+ reported_errors |= UNWRAP_ERROR_NEGATIVE;
+ }
}
}
+ if (subsurf_error) {
+ BKE_report(op->reports, RPT_INFO, "Subdivision Surface modifier needs to be first to work with unwrap");
+ }
+
/* remember last method for live unwrap */
if (RNA_struct_property_is_set(op->ptr, "method"))
scene->toolsettings->unwrapper = method;
else
RNA_enum_set(op->ptr, "method", scene->toolsettings->unwrapper);
- /* remember packing marging */
+ /* remember packing margin */
if (RNA_struct_property_is_set(op->ptr, "margin"))
scene->toolsettings->uvcalc_margin = RNA_float_get(op->ptr, "margin");
else
@@ -1485,11 +1584,27 @@ static int uv_from_view_exec(bContext *C, wmOperator *op)
BMIter iter, liter;
MLoopUV *luv;
float rotmat[4][4];
+ float objects_pos_offset[4];
bool changed_multi = false;
+ const bool use_orthographic = RNA_boolean_get(op->ptr, "orthographic");
+
/* Note: objects that aren't touched are set to NULL (to skip clipping). */
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+
+ if (use_orthographic) {
+ /* Calculate average object position. */
+ float objects_pos_avg[4] = {0};
+
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ add_v4_v4(objects_pos_avg, objects[ob_index]->obmat[3]);
+ }
+
+ mul_v4_fl(objects_pos_avg, 1.0f / objects_len);
+ negate_v4_v4(objects_pos_offset, objects_pos_avg);
+ }
+
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
Object *obedit = objects[ob_index];
BMEditMesh *em = BKE_editmesh_from_object(obedit);
@@ -1502,8 +1617,8 @@ static int uv_from_view_exec(bContext *C, wmOperator *op)
const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
- if (RNA_boolean_get(op->ptr, "orthographic")) {
- uv_map_rotation_matrix(rotmat, rv3d, obedit, 90.0f, 0.0f, 1.0f);
+ if (use_orthographic) {
+ uv_map_rotation_matrix_ex(rotmat, rv3d, obedit, 90.0f, 0.0f, 1.0f, objects_pos_offset);
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT))
diff --git a/source/blender/freestyle/intern/application/AppCanvas.h b/source/blender/freestyle/intern/application/AppCanvas.h
index 9a92cf482d0..ed473e22489 100644
--- a/source/blender/freestyle/intern/application/AppCanvas.h
+++ b/source/blender/freestyle/intern/application/AppCanvas.h
@@ -69,7 +69,7 @@ public:
virtual float thickness() const;
AppView *_pViewer;
- inline const AppView * viewer() const {return _pViewer;}
+ inline const AppView *viewer() const {return _pViewer;}
/*! modifiers */
void setViewer(AppView *iViewer);
diff --git a/source/blender/freestyle/intern/application/AppConfig.h b/source/blender/freestyle/intern/application/AppConfig.h
index ae1d96e06d8..d7572aa1a04 100644
--- a/source/blender/freestyle/intern/application/AppConfig.h
+++ b/source/blender/freestyle/intern/application/AppConfig.h
@@ -44,7 +44,7 @@ namespace Config {
class Path {
protected:
- static Path * _pInstance;
+ static Path *_pInstance;
string _ProjectDir;
string _ModelsPath;
string _PatternsPath;
diff --git a/source/blender/freestyle/intern/application/Controller.cpp b/source/blender/freestyle/intern/application/Controller.cpp
index b4c815f8ad0..5ae04698a73 100644
--- a/source/blender/freestyle/intern/application/Controller.cpp
+++ b/source/blender/freestyle/intern/application/Controller.cpp
@@ -642,11 +642,11 @@ void Controller::ComputeSteerableViewMap()
NodeShape *completeNS = new NodeShape;
completeNS->material().setDiffuse(c,c,c,1);
ng[Canvas::NB_STEERABLE_VIEWMAP-1]->AddChild(completeNS);
- SteerableViewMap * svm = _Canvas->getSteerableViewMap();
+ SteerableViewMap *svm = _Canvas->getSteerableViewMap();
svm->Reset();
ViewMap::fedges_container& fedges = _ViewMap->FEdges();
- LineRep * fRep;
+ LineRep *fRep;
NodeShape *ns;
for (ViewMap::fedges_container::iterator f = fedges.begin(), fend = fedges.end();
f != fend;
@@ -722,7 +722,7 @@ void Controller::ComputeSteerableViewMap()
void Controller::saveSteerableViewMapImages()
{
- SteerableViewMap * svm = _Canvas->getSteerableViewMap();
+ SteerableViewMap *svm = _Canvas->getSteerableViewMap();
if (!svm) {
cerr << "the Steerable ViewMap has not been computed yet" << endl;
return;
@@ -1003,7 +1003,7 @@ void Controller::resetModified(bool iMod)
_Canvas->resetModified(iMod);
}
-NodeGroup * Controller::BuildRep(vector<ViewEdge*>::iterator vedges_begin, vector<ViewEdge*>::iterator vedges_end)
+NodeGroup *Controller::BuildRep(vector<ViewEdge*>::iterator vedges_begin, vector<ViewEdge*>::iterator vedges_end)
{
ViewMapTesselator2D tesselator2D;
FrsMaterial mat;
@@ -1052,7 +1052,7 @@ void Controller::resetInterpreter()
void Controller::displayDensityCurves(int x, int y)
{
- SteerableViewMap * svm = _Canvas->getSteerableViewMap();
+ SteerableViewMap *svm = _Canvas->getSteerableViewMap();
if (!svm)
return;
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
index a0b97b817fd..a42e59ddb2a 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
+++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
@@ -107,13 +107,11 @@ NodeGroup *BlenderFileLoader::Load()
bool apply_modifiers = false;
bool calc_undeformed = false;
- bool calc_tessface = false;
Mesh *mesh = BKE_mesh_new_from_object(depsgraph,
_re->main,
_re->scene,
ob,
apply_modifiers,
- calc_tessface,
calc_undeformed);
if (mesh) {
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h
index 0542b7f45fd..2fcf4373bba 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h
+++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h
@@ -52,6 +52,7 @@ extern "C" {
#include "render_types.h"
#include "BKE_customdata.h"
+#include "BKE_library.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_scene.h"
@@ -92,7 +93,7 @@ public:
virtual ~BlenderFileLoader();
/*! Loads the 3D scene and returns a pointer to the scene root node */
- NodeGroup * Load();
+ NodeGroup *Load();
/*! Gets the number of read faces */
inline unsigned int numFacesRead() {return _numFacesRead;}
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
index 07776bfc1b7..14b638da545 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
+++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
@@ -100,7 +100,8 @@ BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : Str
freestyle_scene->r.tiley = old_scene->r.tiley;
freestyle_scene->r.size = 100; // old_scene->r.size
freestyle_scene->r.color_mgt_flag = 0; // old_scene->r.color_mgt_flag;
- freestyle_scene->r.scemode = old_scene->r.scemode & ~(R_SINGLE_LAYER | R_NO_FRAME_UPDATE | R_MULTIVIEW);
+ freestyle_scene->r.scemode = (old_scene->r.scemode & ~(R_SINGLE_LAYER | R_NO_FRAME_UPDATE | R_MULTIVIEW)) &
+ (re->r.scemode | ~R_FULL_SAMPLE);
freestyle_scene->r.flag = old_scene->r.flag;
freestyle_scene->r.threads = old_scene->r.threads;
freestyle_scene->r.border.xmin = old_scene->r.border.xmin;
@@ -860,7 +861,6 @@ Object *BlenderStrokeRenderer::NewMesh() const
ob = BKE_object_add_only_object(freestyle_bmain, OB_MESH, name);
BLI_snprintf(name, MAX_ID_NAME, "0%08xME", mesh_id);
ob->data = BKE_mesh_add(freestyle_bmain, name);
- ob->lay = 1;
Collection *collection_master = BKE_collection_master(freestyle_scene);
BKE_collection_object_add(freestyle_bmain, collection_master, ob);
diff --git a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
index 6d911ea04d2..0548d49dce0 100644
--- a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
+++ b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
@@ -46,13 +46,12 @@ extern "C" {
#include "DNA_material_types.h"
#include "DNA_text_types.h"
+#include "BKE_context.h"
#include "BKE_freestyle.h"
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_linestyle.h"
-#include "BKE_main.h"
#include "BKE_text.h"
-#include "BKE_context.h"
#include "BLT_translation.h"
diff --git a/source/blender/freestyle/intern/geometry/Grid.h b/source/blender/freestyle/intern/geometry/Grid.h
index 62c0e58232a..0a9be01aba1 100644
--- a/source/blender/freestyle/intern/geometry/Grid.h
+++ b/source/blender/freestyle/intern/geometry/Grid.h
@@ -30,7 +30,7 @@
#include <cstring> // for memset
#include <float.h>
-#include <stdint.h> // For SET_UINT_IN_POINTER, i.e. uintptr_t.
+#include <stdint.h> // For POINTER_FROM_UINT, i.e. uintptr_t.
#include <vector>
#include "Geom.h"
@@ -290,8 +290,9 @@ public:
* Returns the first intersection (occluder,t,u,v) or null.
* Starts with a call to InitRay.
*/
- Polygon3r * castRayToFindFirstIntersection(const Vec3r& orig, const Vec3r& dir, double& t,
- double& u, double& v, unsigned timestamp);
+ Polygon3r *castRayToFindFirstIntersection(
+ const Vec3r& orig, const Vec3r& dir, double& t,
+ double& u, double& v, unsigned timestamp);
/*! Init all structures and values for computing the cells intersected by this new ray */
@@ -338,8 +339,8 @@ protected:
visitor.discoverCell(current_cell);
OccludersSet& occluders = current_cell->getOccluders(); // FIXME: I had forgotten the ref &
for (OccludersSet::iterator it = occluders.begin(); it != occluders.end(); it++) {
- if (GET_UINT_FROM_POINTER((*it)->userdata2) != _timestamp) {
- (*it)->userdata2 = SET_UINT_IN_POINTER(_timestamp);
+ if (POINTER_AS_UINT((*it)->userdata2) != _timestamp) {
+ (*it)->userdata2 = POINTER_FROM_UINT(_timestamp);
visitor.examineOccluder(*it);
}
}
diff --git a/source/blender/freestyle/intern/geometry/SweepLine.h b/source/blender/freestyle/intern/geometry/SweepLine.h
index 98e860862bb..3edd045320f 100644
--- a/source/blender/freestyle/intern/geometry/SweepLine.h
+++ b/source/blender/freestyle/intern/geometry/SweepLine.h
@@ -72,7 +72,7 @@ public:
}
public:
- void * userdata; // FIXME
+ void *userdata; // FIXME
Edge *EdgeA; // first segment
Edge *EdgeB; // second segment
diff --git a/source/blender/freestyle/intern/image/GaussianFilter.h b/source/blender/freestyle/intern/image/GaussianFilter.h
index fdbfd20d764..f460d56e5a5 100644
--- a/source/blender/freestyle/intern/image/GaussianFilter.h
+++ b/source/blender/freestyle/intern/image/GaussianFilter.h
@@ -120,18 +120,16 @@ protected:
};
/*
-
- #############################################
- #############################################
- #############################################
- ###### ######
- ###### I M P L E M E N T A T I O N ######
- ###### ######
- #############################################
- #############################################
- #############################################
-
-*/
+ * #############################################
+ * #############################################
+ * #############################################
+ * ###### ######
+ * ###### I M P L E M E N T A T I O N ######
+ * ###### ######
+ * #############################################
+ * #############################################
+ * #############################################
+ */
template<class Map>
float GaussianFilter::getSmoothedPixel(Map *map, int x, int y)
diff --git a/source/blender/freestyle/intern/image/ImagePyramid.cpp b/source/blender/freestyle/intern/image/ImagePyramid.cpp
index b81f8303945..db92cc68286 100644
--- a/source/blender/freestyle/intern/image/ImagePyramid.cpp
+++ b/source/blender/freestyle/intern/image/ImagePyramid.cpp
@@ -61,7 +61,7 @@ ImagePyramid::~ImagePyramid()
}
}
-GrayImage * ImagePyramid::getLevel(int l)
+GrayImage *ImagePyramid::getLevel(int l)
{
return _levels[l];
}
diff --git a/source/blender/freestyle/intern/python/BPy_Convert.h b/source/blender/freestyle/intern/python/BPy_Convert.h
index a0e0b578c10..976b760a325 100644
--- a/source/blender/freestyle/intern/python/BPy_Convert.h
+++ b/source/blender/freestyle/intern/python/BPy_Convert.h
@@ -98,53 +98,53 @@ extern "C" {
// C++ => Python
//==============================
-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 * 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, bool reversed);
-PyObject * BPy_CurvePointIterator_from_CurvePointIterator(CurveInternal::CurvePointIterator& cp_it);
-PyObject * BPy_StrokeVertexIterator_from_StrokeVertexIterator(StrokeInternal::StrokeVertexIterator& sv_it,
+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 *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, bool reversed);
+PyObject *BPy_CurvePointIterator_from_CurvePointIterator(CurveInternal::CurvePointIterator& cp_it);
+PyObject *BPy_StrokeVertexIterator_from_StrokeVertexIterator(StrokeInternal::StrokeVertexIterator& sv_it,
bool reversed);
-PyObject * BPy_SVertexIterator_from_SVertexIterator(ViewEdgeInternal::SVertexIterator& sv_it);
-PyObject * BPy_orientedViewEdgeIterator_from_orientedViewEdgeIterator(ViewVertexInternal::orientedViewEdgeIterator& ove_it,
+PyObject *BPy_SVertexIterator_from_SVertexIterator(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);
+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);
//==============================
// Python => C++
diff --git a/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp b/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp
index 548ab529f34..a6683f538c6 100644
--- a/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp
+++ b/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp
@@ -63,7 +63,7 @@ PyDoc_STRVAR(Integrator_integrate_doc,
" :class:`UnaryFunction0DUnsigned` type.\n"
" :rtype: int or float");
-static PyObject * Integrator_integrate(PyObject * /*self*/, PyObject *args, PyObject *kwds)
+static PyObject *Integrator_integrate(PyObject * /*self*/, PyObject *args, PyObject *kwds)
{
static const char *kwlist[] = {"func", "it", "it_end", "integration_type", NULL};
PyObject *obj1, *obj4 = 0;
diff --git a/source/blender/freestyle/intern/python/BPy_Interface1D.cpp b/source/blender/freestyle/intern/python/BPy_Interface1D.cpp
index 0fc3ec41dec..c5a07fd295b 100644
--- a/source/blender/freestyle/intern/python/BPy_Interface1D.cpp
+++ b/source/blender/freestyle/intern/python/BPy_Interface1D.cpp
@@ -138,7 +138,7 @@ PyDoc_STRVAR(Interface1D_vertices_begin_doc,
" :return: An Interface0DIterator pointing to the first vertex.\n"
" :rtype: :class:`Interface0DIterator`");
-static PyObject * Interface1D_vertices_begin(BPy_Interface1D *self)
+static PyObject *Interface1D_vertices_begin(BPy_Interface1D *self)
{
Interface0DIterator if0D_it(self->if1D->verticesBegin());
return BPy_Interface0DIterator_from_Interface0DIterator(if0D_it, false);
@@ -153,7 +153,7 @@ PyDoc_STRVAR(Interface1D_vertices_end_doc,
" :return: An Interface0DIterator pointing after the last vertex.\n"
" :rtype: :class:`Interface0DIterator`");
-static PyObject * Interface1D_vertices_end(BPy_Interface1D *self)
+static PyObject *Interface1D_vertices_end(BPy_Interface1D *self)
{
Interface0DIterator if0D_it(self->if1D->verticesEnd());
return BPy_Interface0DIterator_from_Interface0DIterator(if0D_it, true);
@@ -173,7 +173,7 @@ PyDoc_STRVAR(Interface1D_points_begin_doc,
" :return: An Interface0DIterator pointing to the first point.\n"
" :rtype: :class:`Interface0DIterator`");
-static PyObject * Interface1D_points_begin(BPy_Interface1D *self, PyObject *args, PyObject *kwds)
+static PyObject *Interface1D_points_begin(BPy_Interface1D *self, PyObject *args, PyObject *kwds)
{
static const char *kwlist[] = {"t", NULL};
float f = 0.0f;
@@ -198,7 +198,7 @@ PyDoc_STRVAR(Interface1D_points_end_doc,
" :return: An Interface0DIterator pointing after the last point.\n"
" :rtype: :class:`Interface0DIterator`");
-static PyObject * Interface1D_points_end(BPy_Interface1D *self, PyObject *args, PyObject *kwds)
+static PyObject *Interface1D_points_end(BPy_Interface1D *self, PyObject *args, PyObject *kwds)
{
static const char *kwlist[] = {"t", NULL};
float f = 0.0f;
diff --git a/source/blender/freestyle/intern/python/BPy_SShape.cpp b/source/blender/freestyle/intern/python/BPy_SShape.cpp
index cf4880ad3f7..28c9e815196 100644
--- a/source/blender/freestyle/intern/python/BPy_SShape.cpp
+++ b/source/blender/freestyle/intern/python/BPy_SShape.cpp
@@ -122,7 +122,7 @@ PyDoc_STRVAR(SShape_add_vertex_doc,
" :arg vertex: An SVertex object.\n"
" :type vertex: :class:`SVertex`");
-static PyObject * SShape_add_vertex(BPy_SShape *self, PyObject *args, PyObject *kwds)
+static PyObject *SShape_add_vertex(BPy_SShape *self, PyObject *args, PyObject *kwds)
{
static const char *kwlist[] = {"edge", NULL};
PyObject *py_sv = 0;
diff --git a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp
index fb7eb49127c..b390bb293d5 100644
--- a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp
+++ b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp
@@ -135,7 +135,7 @@ static void StrokeAttribute_dealloc(BPy_StrokeAttribute *self)
Py_TYPE(self)->tp_free((PyObject *)self);
}
-static PyObject * StrokeAttribute_repr(BPy_StrokeAttribute *self)
+static PyObject *StrokeAttribute_repr(BPy_StrokeAttribute *self)
{
stringstream repr("StrokeAttribute:");
repr << " r: " << self->sa->getColorR() << " g: " << self->sa->getColorG() << " b: " << self->sa->getColorB() <<
@@ -282,7 +282,7 @@ PyDoc_STRVAR(StrokeAttribute_set_attribute_real_doc,
" :arg value: The attribute value.\n"
" :type value: float\n");
-static PyObject * StrokeAttribute_set_attribute_real(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds)
+static PyObject *StrokeAttribute_set_attribute_real(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds)
{
static const char *kwlist[] = {"name", "value", NULL};
char *s = 0;
@@ -306,7 +306,7 @@ PyDoc_STRVAR(StrokeAttribute_set_attribute_vec2_doc,
" :arg value: The attribute value.\n"
" :type value: :class:`mathutils.Vector`, list or tuple of 2 real numbers\n");
-static PyObject * StrokeAttribute_set_attribute_vec2(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds)
+static PyObject *StrokeAttribute_set_attribute_vec2(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds)
{
static const char *kwlist[] = {"name", "value", NULL};
char *s;
@@ -335,7 +335,7 @@ PyDoc_STRVAR(StrokeAttribute_set_attribute_vec3_doc,
" :arg value: The attribute value.\n"
" :type value: :class:`mathutils.Vector`, list or tuple of 3 real numbers\n");
-static PyObject * StrokeAttribute_set_attribute_vec3(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds)
+static PyObject *StrokeAttribute_set_attribute_vec3(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds)
{
static const char *kwlist[] = {"name", "value", NULL};
char *s;
diff --git a/source/blender/freestyle/intern/scene_graph/IndexedFaceSet.h b/source/blender/freestyle/intern/scene_graph/IndexedFaceSet.h
index c1a5b2a6774..aa090155537 100644
--- a/source/blender/freestyle/intern/scene_graph/IndexedFaceSet.h
+++ b/source/blender/freestyle/intern/scene_graph/IndexedFaceSet.h
@@ -113,7 +113,7 @@ public:
* 0 : the arrays are not copied. The pointers passed as arguments are used. IndexedFaceSet takes these
* arrays desallocation in charge.
* 1 : the arrays are copied. The caller is in charge of the arrays, passed as arguments desallocation.
- */
+ */
IndexedFaceSet(float *iVertices, unsigned iVSize, float *iNormals, unsigned iNSize, FrsMaterial **iMaterials,
unsigned iMSize, float *iTexCoords, unsigned iTSize, unsigned iNumFaces, unsigned *iNumVertexPerFace,
TRIANGLES_STYLE *iFaceStyle, FaceEdgeMark *iFaceEdgeMarks, unsigned *iVIndices, unsigned iVISize,
diff --git a/source/blender/freestyle/intern/scene_graph/NodeCamera.h b/source/blender/freestyle/intern/scene_graph/NodeCamera.h
index c2f70d514a8..2fc6a00f955 100644
--- a/source/blender/freestyle/intern/scene_graph/NodeCamera.h
+++ b/source/blender/freestyle/intern/scene_graph/NodeCamera.h
@@ -68,12 +68,12 @@ public:
/*! Matrix is copied */
void setProjectionMatrix(double projection_matrix[16]);
- double * modelViewMatrix()
+ double *modelViewMatrix()
{
return modelview_matrix_;
}
- double * projectionMatrix()
+ double *projectionMatrix()
{
return projection_matrix_;
}
diff --git a/source/blender/freestyle/intern/stroke/AdvancedStrokeShaders.h b/source/blender/freestyle/intern/stroke/AdvancedStrokeShaders.h
index 5ba96f31272..50b55027de7 100644
--- a/source/blender/freestyle/intern/stroke/AdvancedStrokeShaders.h
+++ b/source/blender/freestyle/intern/stroke/AdvancedStrokeShaders.h
@@ -68,7 +68,7 @@ protected:
/*! [ Geometry Shader ].
* Spatial Noise stroke shader.
* Moves the vertices to make the stroke more noisy.
- * @see \htmlonly <a href=noise/noise.html>noise/noise.html</a> \endhtmlonly
+ * \see \htmlonly <a href=noise/noise.html>noise/noise.html</a> \endhtmlonly
*/
class SpatialNoiseShader : public StrokeShader
{
@@ -106,7 +106,7 @@ protected:
* (Moves the vertices to make the stroke smoother).
* Uses curvature flow to converge towards a curve of constant curvature. The diffusion method we use is anisotropic
* to prevent the diffusion accross corners.
- * @see \htmlonly <a href=/smoothing/smoothing.html>smoothing/smoothing.html</a> \endhtmlonly
+ * \see \htmlonly <a href=/smoothing/smoothing.html>smoothing/smoothing.html</a> \endhtmlonly
*/
class SmoothingShader : public StrokeShader
{
diff --git a/source/blender/freestyle/intern/stroke/BasicStrokeShaders.h b/source/blender/freestyle/intern/stroke/BasicStrokeShaders.h
index d3d19beba95..1cdc754d725 100644
--- a/source/blender/freestyle/intern/stroke/BasicStrokeShaders.h
+++ b/source/blender/freestyle/intern/stroke/BasicStrokeShaders.h
@@ -428,7 +428,7 @@ public:
/*! [ Geometry Shader. ]
* Resamples the stroke.
- * @see Stroke::Resample(float).
+ * \see Stroke::Resample(float).
*/
class SamplingShader: public StrokeShader
{
@@ -479,7 +479,7 @@ public:
/*! [ Geometry Shader ].
* Transforms the stroke backbone geometry so that it corresponds to a Bezier Curve approximation of the
* original backbone geometry.
- * @see \htmlonly <a href=bezier/bezier.html>bezier/bezier.html</a> \endhtmlonly
+ * \see \htmlonly <a href=bezier/bezier.html>bezier/bezier.html</a> \endhtmlonly
*/
class BezierCurveShader : public StrokeShader
{
diff --git a/source/blender/freestyle/intern/stroke/Stroke.h b/source/blender/freestyle/intern/stroke/Stroke.h
index 83e6a947917..a813d516d44 100644
--- a/source/blender/freestyle/intern/stroke/Stroke.h
+++ b/source/blender/freestyle/intern/stroke/Stroke.h
@@ -582,8 +582,8 @@ public:
* \param iNVertices
* The number of StrokeVertices we eventually want in our Stroke.
* \return the sampling that must be used in the Resample(float) method.
- * @see Resample(int)
- * @see Resample(float)
+ * \see Resample(int)
+ * \see Resample(float)
*/
float ComputeSampling(int iNVertices);
diff --git a/source/blender/freestyle/intern/system/PythonInterpreter.h b/source/blender/freestyle/intern/system/PythonInterpreter.h
index 4f5e94ef7a0..cb49e7718a0 100644
--- a/source/blender/freestyle/intern/system/PythonInterpreter.h
+++ b/source/blender/freestyle/intern/system/PythonInterpreter.h
@@ -112,7 +112,7 @@ public:
BKE_reports_clear(reports);
- if (!BPY_execute_string(_context, str.c_str())) {
+ if (!BPY_execute_string(_context, NULL, str.c_str())) {
BPy_errors_to_report(reports);
cerr << "\nError executing Python script from PythonInterpreter::interpretString" << endl;
cerr << "Name: " << name << endl;
diff --git a/source/blender/freestyle/intern/view_map/Interface0D.cpp b/source/blender/freestyle/intern/view_map/Interface0D.cpp
index 1d8515700d3..5cfd216cda2 100644
--- a/source/blender/freestyle/intern/view_map/Interface0D.cpp
+++ b/source/blender/freestyle/intern/view_map/Interface0D.cpp
@@ -78,7 +78,7 @@ Geometry::Vec2r Interface0D::getPoint2D() const
return 0;
}
-FEdge * Interface0D::getFEdge(Interface0D&)
+FEdge *Interface0D::getFEdge(Interface0D&)
{
PyErr_SetString(PyExc_TypeError, "method getFEdge() not properly overridden");
return 0;
@@ -96,25 +96,25 @@ Nature::VertexNature Interface0D::getNature() const
return Nature::POINT;
}
-SVertex * Interface0D::castToSVertex()
+SVertex *Interface0D::castToSVertex()
{
PyErr_SetString(PyExc_TypeError, "method castToSVertex() not properly overridden");
return 0;
}
-ViewVertex * Interface0D::castToViewVertex()
+ViewVertex *Interface0D::castToViewVertex()
{
PyErr_SetString(PyExc_TypeError, "method castToViewVertex() not properly overridden");
return 0;
}
-NonTVertex * Interface0D::castToNonTVertex()
+NonTVertex *Interface0D::castToNonTVertex()
{
PyErr_SetString(PyExc_TypeError, "method castToNonTVertex() not properly overridden");
return 0;
}
-TVertex * Interface0D::castToTVertex()
+TVertex *Interface0D::castToTVertex()
{
PyErr_SetString(PyExc_TypeError, "method castToTVertex() not properly overridden");
return 0;
diff --git a/source/blender/freestyle/intern/view_map/ViewMap.h b/source/blender/freestyle/intern/view_map/ViewMap.h
index 16c9699dcef..74fb875ffc6 100644
--- a/source/blender/freestyle/intern/view_map/ViewMap.h
+++ b/source/blender/freestyle/intern/view_map/ViewMap.h
@@ -1625,16 +1625,16 @@ public:
/*
- #############################################
- #############################################
- #############################################
- ###### ######
- ###### I M P L E M E N T A T I O N ######
- ###### ######
- #############################################
- #############################################
- #############################################
-*/
+ * #############################################
+ * #############################################
+ * #############################################
+ * ###### ######
+ * ###### I M P L E M E N T A T I O N ######
+ * ###### ######
+ * #############################################
+ * #############################################
+ * #############################################
+ */
/* for inline functions */
void ViewShape::SplitEdge(FEdge *fe, const vector<TVertex*>& iViewVertices, vector<FEdge*>& ioNewEdges,
diff --git a/source/blender/freestyle/intern/view_map/ViewMapIO.cpp b/source/blender/freestyle/intern/view_map/ViewMapIO.cpp
index 3e80c004b5f..c0562cbb417 100644
--- a/source/blender/freestyle/intern/view_map/ViewMapIO.cpp
+++ b/source/blender/freestyle/intern/view_map/ViewMapIO.cpp
@@ -979,7 +979,7 @@ int load(istream& in, ViewMap *vm, ProgressBar *pb)
READ(flags);
Options::setFlags(flags);
- // Read the size of the five ViewMap's lists (with some extra informations for the ViewVertices)
+ // Read the size of the five ViewMap's lists (with some extra information for the ViewVertices)
// and instantiate them (with default costructors)
unsigned vs_s, fe_s, fe_rle1, fe_rle2, sv_s, ve_s, vv_s, vv_rle1, vv_rle2;
READ(vs_s);
@@ -1102,23 +1102,23 @@ int save(ostream& out, ViewMap *vm, ProgressBar *pb)
// For every object, initialize its userdata member to its index in the ViewMap list
for (unsigned int i0 = 0; i0 < vm->ViewShapes().size(); i0++) {
- vm->ViewShapes()[i0]->userdata = SET_UINT_IN_POINTER(i0);
- vm->ViewShapes()[i0]->sshape()->userdata = SET_UINT_IN_POINTER(i0);
+ vm->ViewShapes()[i0]->userdata = POINTER_FROM_UINT(i0);
+ vm->ViewShapes()[i0]->sshape()->userdata = POINTER_FROM_UINT(i0);
}
for (unsigned int i1 = 0; i1 < vm->FEdges().size(); i1++)
- vm->FEdges()[i1]->userdata = SET_UINT_IN_POINTER(i1);
+ vm->FEdges()[i1]->userdata = POINTER_FROM_UINT(i1);
for (unsigned int i2 = 0; i2 < vm->SVertices().size(); i2++)
- vm->SVertices()[i2]->userdata = SET_UINT_IN_POINTER(i2);
+ vm->SVertices()[i2]->userdata = POINTER_FROM_UINT(i2);
for (unsigned int i3 = 0; i3 < vm->ViewEdges().size(); i3++)
- vm->ViewEdges()[i3]->userdata = SET_UINT_IN_POINTER(i3);
+ vm->ViewEdges()[i3]->userdata = POINTER_FROM_UINT(i3);
for (unsigned int i4 = 0; i4 < vm->ViewVertices().size(); i4++)
- vm->ViewVertices()[i4]->userdata = SET_UINT_IN_POINTER(i4);
+ vm->ViewVertices()[i4]->userdata = POINTER_FROM_UINT(i4);
// Write the current options
unsigned char flags = Options::getFlags();
WRITE(flags);
- // Write the size of the five lists (with some extra informations for the ViewVertices)
+ // Write the size of the five lists (with some extra information for the ViewVertices)
unsigned size;
size = vm->ViewShapes().size();
WRITE(size);
diff --git a/source/blender/freestyle/intern/winged_edge/WEdge.h b/source/blender/freestyle/intern/winged_edge/WEdge.h
index 14109fba843..30f55ff7e73 100644
--- a/source/blender/freestyle/intern/winged_edge/WEdge.h
+++ b/source/blender/freestyle/intern/winged_edge/WEdge.h
@@ -1370,18 +1370,16 @@ private:
/*
-
-#############################################
-#############################################
-#############################################
-###### ######
-###### I M P L E M E N T A T I O N ######
-###### ######
-#############################################
-#############################################
-#############################################
-
-*/
+ * #############################################
+ * #############################################
+ * #############################################
+ * ###### ######
+ * ###### I M P L E M E N T A T I O N ######
+ * ###### ######
+ * #############################################
+ * #############################################
+ * #############################################
+ */
/* for inline functions */
void WOEdge::RetrieveCWOrderedEdges(vector<WEdge *>& oEdges)
{
diff --git a/source/blender/freestyle/intern/winged_edge/WXEdge.h b/source/blender/freestyle/intern/winged_edge/WXEdge.h
index 774cc67f3ab..cabb1f81c1a 100644
--- a/source/blender/freestyle/intern/winged_edge/WXEdge.h
+++ b/source/blender/freestyle/intern/winged_edge/WXEdge.h
@@ -802,18 +802,16 @@ public:
};
/*
-
-#############################################
-#############################################
-#############################################
-###### ######
-###### I M P L E M E N T A T I O N ######
-###### ######
-#############################################
-#############################################
-#############################################
-
-*/
+ * #############################################
+ * #############################################
+ * #############################################
+ * ###### ######
+ * ###### I M P L E M E N T A T I O N ######
+ * ###### ######
+ * #############################################
+ * #############################################
+ * #############################################
+ */
/* for inline functions */
bool WXVertex::isFeature()
diff --git a/source/blender/gpencil_modifiers/CMakeLists.txt b/source/blender/gpencil_modifiers/CMakeLists.txt
index 44689a1d091..b28a83372b8 100644
--- a/source/blender/gpencil_modifiers/CMakeLists.txt
+++ b/source/blender/gpencil_modifiers/CMakeLists.txt
@@ -50,7 +50,7 @@ set(SRC
intern/MOD_gpencilthick.c
intern/MOD_gpenciltint.c
intern/MOD_gpencilcolor.c
- intern/MOD_gpencilinstance.c
+ intern/MOD_gpencilarray.c
intern/MOD_gpencilbuild.c
intern/MOD_gpencilopacity.c
intern/MOD_gpencillattice.c
@@ -58,6 +58,7 @@ set(SRC
intern/MOD_gpencilsmooth.c
intern/MOD_gpencilhook.c
intern/MOD_gpenciloffset.c
+ intern/MOD_gpenciltime.c
MOD_gpencil_modifiertypes.h
)
diff --git a/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h b/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h
index 968f7e73544..07db9f15288 100644
--- a/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h
+++ b/source/blender/gpencil_modifiers/MOD_gpencil_modifiertypes.h
@@ -36,7 +36,7 @@ extern GpencilModifierTypeInfo modifierType_Gpencil_Simplify;
extern GpencilModifierTypeInfo modifierType_Gpencil_Thick;
extern GpencilModifierTypeInfo modifierType_Gpencil_Tint;
extern GpencilModifierTypeInfo modifierType_Gpencil_Color;
-extern GpencilModifierTypeInfo modifierType_Gpencil_Instance;
+extern GpencilModifierTypeInfo modifierType_Gpencil_Array;
extern GpencilModifierTypeInfo modifierType_Gpencil_Build;
extern GpencilModifierTypeInfo modifierType_Gpencil_Opacity;
extern GpencilModifierTypeInfo modifierType_Gpencil_Lattice;
@@ -45,6 +45,7 @@ extern GpencilModifierTypeInfo modifierType_Gpencil_Smooth;
extern GpencilModifierTypeInfo modifierType_Gpencil_Hook;
extern GpencilModifierTypeInfo modifierType_Gpencil_Offset;
extern GpencilModifierTypeInfo modifierType_Gpencil_Armature;
+extern GpencilModifierTypeInfo modifierType_Gpencil_Time;
/* MOD_gpencil_util.c */
void gpencil_modifier_type_init(GpencilModifierTypeInfo *types[]);
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c b/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c
index 5aa9073eacb..2551d9a216d 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c
@@ -69,7 +69,7 @@ void gpencil_modifier_type_init(GpencilModifierTypeInfo *types[])
INIT_GP_TYPE(Thick);
INIT_GP_TYPE(Tint);
INIT_GP_TYPE(Color);
- INIT_GP_TYPE(Instance);
+ INIT_GP_TYPE(Array);
INIT_GP_TYPE(Build);
INIT_GP_TYPE(Opacity);
INIT_GP_TYPE(Lattice);
@@ -78,13 +78,14 @@ void gpencil_modifier_type_init(GpencilModifierTypeInfo *types[])
INIT_GP_TYPE(Hook);
INIT_GP_TYPE(Offset);
INIT_GP_TYPE(Armature);
+ INIT_GP_TYPE(Time);
#undef INIT_GP_TYPE
}
/* verify if valid layer and pass index */
bool is_stroke_affected_by_modifier(
- Object *ob, char *mlayername, int mpassindex, int minpoints,
- bGPDlayer *gpl, bGPDstroke *gps, bool inv1, bool inv2)
+ Object *ob, char *mlayername, int mpassindex, int gpl_passindex, int minpoints,
+ bGPDlayer *gpl, bGPDstroke *gps, bool inv1, bool inv2, bool inv3)
{
MaterialGPencilStyle *gp_style = BKE_material_gpencil_settings_get(ob, gps->mat_nr + 1);
@@ -101,7 +102,20 @@ bool is_stroke_affected_by_modifier(
}
}
}
- /* verify pass */
+ /* verify layer pass */
+ if (gpl_passindex > 0) {
+ if (inv3 == false) {
+ if (gpl->pass_index != gpl_passindex) {
+ return false;
+ }
+ }
+ else {
+ if (gpl->pass_index == gpl_passindex) {
+ return false;
+ }
+ }
+ }
+ /* verify material pass */
if (mpassindex > 0) {
if (inv2 == false) {
if (gp_style->index != mpassindex) {
@@ -127,7 +141,7 @@ float get_modifier_point_weight(MDeformVert *dvert, bool inverse, int def_nr)
{
float weight = 1.0f;
- if (def_nr != -1) {
+ if ((dvert != NULL) && (def_nr != -1)) {
MDeformWeight *dw = defvert_find_index(dvert, def_nr);
weight = dw ? dw->weight : -1.0f;
if ((weight >= 0.0f) && (inverse == 1)) {
@@ -145,6 +159,16 @@ float get_modifier_point_weight(MDeformVert *dvert, bool inverse, int def_nr)
}
+ /* handle special empty groups */
+ if ((dvert == NULL) && (def_nr != -1)) {
+ if (inverse == 1) {
+ return 1.0f;
+ }
+ else {
+ return -1.0f;
+ }
+ }
+
return weight;
}
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.h b/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.h
index 95772d141f1..480c431b8b4 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.h
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.h
@@ -42,8 +42,10 @@ struct Material;
struct GHash;
bool is_stroke_affected_by_modifier(
- struct Object *ob, char *mlayername, int mpassindex, int minpoints,
- bGPDlayer *gpl, bGPDstroke *gps, bool inv1, bool inv2);
+ struct Object *ob, char *mlayername, int mpassindex,
+ int gpl_passindex, int minpoints,
+ bGPDlayer *gpl, bGPDstroke *gps,
+ bool inv1, bool inv2, bool inv3);
float get_modifier_point_weight(struct MDeformVert *dvert, bool inverse, int def_nr);
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c
index 4ae48e73d0f..69a48a2c93b 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c
@@ -92,12 +92,13 @@ static void gpencil_deform_verts(
}
/* deform verts */
- armature_deform_verts(mmd->object, target, NULL,
- (float(*)[3])all_vert_coords,
- NULL, gps->totpoints,
- mmd->deformflag,
- (float(*)[3])mmd->prevCos,
- mmd->vgname, gps);
+ armature_deform_verts(
+ mmd->object, target, NULL,
+ (float(*)[3])all_vert_coords,
+ NULL, gps->totpoints,
+ mmd->deformflag,
+ (float(*)[3])mmd->prevCos,
+ mmd->vgname, gps);
/* Apply deformed coordinates */
pt = gps->points;
@@ -193,7 +194,7 @@ GpencilModifierTypeInfo modifierType_Gpencil_Armature = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
/* bakeModifier */ bakeModifier,
-
+ /* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,
/* isDisabled */ isDisabled,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c
new file mode 100644
index 00000000000..0d0ce7476b9
--- /dev/null
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c
@@ -0,0 +1,341 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2017, Blender Foundation
+ * This is a new part of Blender
+ *
+ * Contributor(s): Antonio Vazquez, Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/** \file blender/gpencil_modifiers/intern/MOD_gpencilarray.c
+ * \ingroup modifiers
+ */
+
+#include <stdio.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_gpencil_types.h"
+#include "DNA_gpencil_modifier_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_rand.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_gpencil.h"
+#include "BKE_gpencil_modifier.h"
+#include "BKE_modifier.h"
+#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_object.h"
+#include "BKE_main.h"
+#include "BKE_scene.h"
+#include "BKE_layer.h"
+#include "BKE_library_query.h"
+#include "BKE_collection.h"
+
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
+#include "DEG_depsgraph_query.h"
+
+#include "MOD_gpencil_util.h"
+#include "MOD_gpencil_modifiertypes.h"
+
+static void initData(GpencilModifierData *md)
+{
+ ArrayGpencilModifierData *gpmd = (ArrayGpencilModifierData *)md;
+ gpmd->count = 2;
+ gpmd->offset[0] = 1.0f;
+ gpmd->offset[1] = 0.0f;
+ gpmd->offset[2] = 0.0f;
+ gpmd->shift[0] = 0.0f;
+ gpmd->shift[1] = 0.0f;
+ gpmd->shift[2] = 0.0f;
+ gpmd->scale[0] = 1.0f;
+ gpmd->scale[1] = 1.0f;
+ gpmd->scale[2] = 1.0f;
+ gpmd->rnd_rot = 0.5f;
+ gpmd->rnd_size = 0.5f;
+ gpmd->object = NULL;
+
+ /* fill random values */
+ BLI_array_frand(gpmd->rnd, 20, 1);
+ gpmd->rnd[0] = 1;
+}
+
+static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
+{
+ BKE_gpencil_modifier_copyData_generic(md, target);
+}
+
+/* -------------------------------- */
+/* helper function for per-instance positioning */
+static void BKE_gpencil_instance_modifier_instance_tfm(
+ Object *ob, ArrayGpencilModifierData *mmd, const int elem_idx,
+ float r_mat[4][4], float r_offset[4][4])
+{
+ float offset[3], rot[3], scale[3];
+ int ri = mmd->rnd[0];
+ float factor;
+
+ offset[0] = mmd->offset[0] * elem_idx;
+ offset[1] = mmd->offset[1] * elem_idx;
+ offset[2] = mmd->offset[2] * elem_idx;
+
+ /* rotation */
+ if (mmd->flag & GP_ARRAY_RANDOM_ROT) {
+ factor = mmd->rnd_rot * mmd->rnd[ri];
+ mul_v3_v3fl(rot, mmd->rot, factor);
+ add_v3_v3(rot, mmd->rot);
+ }
+ else {
+ copy_v3_v3(rot, mmd->rot);
+ }
+
+ /* scale */
+ if (mmd->flag & GP_ARRAY_RANDOM_SIZE) {
+ factor = mmd->rnd_size * mmd->rnd[ri];
+ mul_v3_v3fl(scale, mmd->scale, factor);
+ add_v3_v3(scale, mmd->scale);
+ }
+ else {
+ copy_v3_v3(scale, mmd->scale);
+ }
+
+ /* advance random index */
+ mmd->rnd[0]++;
+ if (mmd->rnd[0] > 19) {
+ mmd->rnd[0] = 1;
+ }
+
+ /* calculate matrix */
+ loc_eul_size_to_mat4(r_mat, offset, rot, scale);
+
+ copy_m4_m4(r_offset, r_mat);
+
+ /* offset object */
+ if (mmd->object) {
+ float mat_offset[4][4];
+ float obinv[4][4];
+
+ unit_m4(mat_offset);
+ add_v3_v3(mat_offset[3], mmd->offset);
+ invert_m4_m4(obinv, ob->obmat);
+
+ mul_m4_series(r_offset, mat_offset,
+ obinv, mmd->object->obmat);
+ copy_m4_m4(mat_offset, r_offset);
+
+ /* clear r_mat locations to avoid double transform */
+ zero_v3(r_mat[3]);
+ }
+}
+
+/* array modifier - generate geometry callback (for viewport/rendering) */
+static void generate_geometry(
+ GpencilModifierData *md, Depsgraph *UNUSED(depsgraph),
+ Object *ob, bGPDlayer *gpl, bGPDframe *gpf)
+{
+ ArrayGpencilModifierData *mmd = (ArrayGpencilModifierData *)md;
+ ListBase stroke_cache = {NULL, NULL};
+ bGPDstroke *gps;
+ int idx;
+
+ /* Check which strokes we can use once, and store those results in an array
+ * for quicker checking of what's valid (since string comparisons are expensive)
+ */
+ const int num_strokes = BLI_listbase_count(&gpf->strokes);
+ int num_valid = 0;
+
+ bool *valid_strokes = MEM_callocN(sizeof(bool) * num_strokes, __func__);
+
+ for (gps = gpf->strokes.first, idx = 0; gps; gps = gps->next, idx++) {
+ /* Record whether this stroke can be used
+ * ATTENTION: The logic here is the inverse of what's used everywhere else!
+ */
+ if (is_stroke_affected_by_modifier(
+ ob,
+ mmd->layername, mmd->pass_index, mmd->layer_pass, 1, gpl, gps,
+ mmd->flag & GP_ARRAY_INVERT_LAYER, mmd->flag & GP_ARRAY_INVERT_PASS,
+ mmd->flag & GP_ARRAY_INVERT_LAYERPASS))
+ {
+ valid_strokes[idx] = true;
+ num_valid++;
+ }
+ }
+
+ /* Early exit if no strokes can be copied */
+ if (num_valid == 0) {
+ if (G.debug & G_DEBUG) {
+ printf("GP Array Mod - No strokes to be included\n");
+ }
+
+ MEM_SAFE_FREE(valid_strokes);
+ return;
+ }
+
+
+ /* Generate new instances of all existing strokes,
+ * keeping each instance together so they maintain
+ * the correct ordering relative to each other
+ */
+ float current_offset[4][4];
+ unit_m4(current_offset);
+
+ for (int x = 0; x < mmd->count; x++) {
+ /* original strokes are at index = 0 */
+ if (x == 0) {
+ continue;
+ }
+
+ /* Compute transforms for this instance */
+ float mat[4][4];
+ float mat_offset[4][4];
+ BKE_gpencil_instance_modifier_instance_tfm(ob, mmd, x, mat, mat_offset);
+
+ if (mmd->object) {
+ /* recalculate cumulative offset here */
+ mul_m4_m4m4(current_offset, current_offset, mat_offset);
+ }
+ else {
+ copy_m4_m4(current_offset, mat);
+ }
+ /* apply shift */
+ madd_v3_v3fl(current_offset[3], mmd->shift, x);
+
+ /* Duplicate original strokes to create this instance */
+ for (gps = gpf->strokes.first, idx = 0; gps; gps = gps->next, idx++) {
+ /* check if stroke can be duplicated */
+ if (valid_strokes[idx]) {
+ /* Duplicate stroke */
+ bGPDstroke *gps_dst = MEM_dupallocN(gps);
+ gps_dst->points = MEM_dupallocN(gps->points);
+ if (gps->dvert) {
+ gps_dst->dvert = MEM_dupallocN(gps->dvert);
+ BKE_gpencil_stroke_weights_duplicate(gps, gps_dst);
+ }
+ gps_dst->triangles = MEM_dupallocN(gps->triangles);
+
+ /* Move points */
+ for (int i = 0; i < gps->totpoints; i++) {
+ bGPDspoint *pt = &gps_dst->points[i];
+ if (mmd->object) {
+ /* apply local changes (rot/scale) */
+ mul_m4_v3(mat, &pt->x);
+ }
+ /* global changes */
+ mul_m4_v3(current_offset, &pt->x);
+ }
+
+ /* if replace material, use new one */
+ if ((mmd->mat_rpl > 0) && (mmd->mat_rpl <= ob->totcol)) {
+ gps_dst->mat_nr = mmd->mat_rpl - 1;
+ }
+
+ /* Add new stroke to cache, to be added to the frame once
+ * all duplicates have been made
+ */
+ BLI_addtail(&stroke_cache, gps_dst);
+ }
+ }
+ }
+
+ /* merge newly created stroke instances back into the main stroke list */
+ if (mmd->flag & GP_ARRAY_KEEP_ONTOP) {
+ BLI_movelisttolist_reverse(&gpf->strokes, &stroke_cache);
+ }
+ else {
+ BLI_movelisttolist(&gpf->strokes, &stroke_cache);
+ }
+
+ /* free temp data */
+ MEM_SAFE_FREE(valid_strokes);
+}
+
+static void bakeModifier(
+ Main *UNUSED(bmain), Depsgraph *depsgraph,
+ GpencilModifierData *md, Object *ob)
+{
+
+ bGPdata *gpd = ob->data;
+
+ for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+ for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+ generate_geometry(md, depsgraph, ob, gpl, gpf);
+ }
+ }
+}
+
+/* -------------------------------- */
+
+/* Generic "generateStrokes" callback */
+static void generateStrokes(
+ GpencilModifierData *md, Depsgraph *depsgraph,
+ Object *ob, bGPDlayer *gpl, bGPDframe *gpf)
+{
+ generate_geometry(md, depsgraph, ob, gpl, gpf);
+}
+
+static void updateDepsgraph(GpencilModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
+{
+ ArrayGpencilModifierData *lmd = (ArrayGpencilModifierData *)md;
+ if (lmd->object != NULL) {
+ DEG_add_object_relation(ctx->node, lmd->object, DEG_OB_COMP_GEOMETRY, "Array Modifier");
+ DEG_add_object_relation(ctx->node, lmd->object, DEG_OB_COMP_TRANSFORM, "Array Modifier");
+ }
+ DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Array Modifier");
+}
+
+static void foreachObjectLink(
+ GpencilModifierData *md, Object *ob,
+ ObjectWalkFunc walk, void *userData)
+{
+ ArrayGpencilModifierData *mmd = (ArrayGpencilModifierData *)md;
+
+ walk(userData, ob, &mmd->object, IDWALK_CB_NOP);
+}
+
+
+GpencilModifierTypeInfo modifierType_Gpencil_Array = {
+ /* name */ "Array",
+ /* structName */ "ArrayGpencilModifierData",
+ /* structSize */ sizeof(ArrayGpencilModifierData),
+ /* type */ eGpencilModifierTypeType_Gpencil,
+ /* flags */ 0,
+
+ /* copyData */ copyData,
+
+ /* deformStroke */ NULL,
+ /* generateStrokes */ generateStrokes,
+ /* bakeModifier */ bakeModifier,
+ /* remapTime */ NULL,
+
+ /* initData */ initData,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
+ /* updateDepsgraph */ updateDepsgraph,
+ /* dependsOnTime */ NULL,
+ /* foreachObjectLink */ foreachObjectLink,
+ /* foreachIDLink */ NULL,
+ /* foreachTexLink */ NULL,
+};
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c
index 6435ca1ce70..e2a257fcb43 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c
@@ -435,6 +435,19 @@ static void generateStrokes(
}
}
}
+ /* verify layer pass */
+ if (mmd->layer_pass > 0) {
+ if ((mmd->flag & GP_BUILD_INVERT_LAYERPASS) == 0) {
+ if (gpl->pass_index != mmd->layer_pass) {
+ return;
+ }
+ }
+ else {
+ if (gpl->pass_index == mmd->layer_pass) {
+ return;
+ }
+ }
+ }
/* Early exit if outside of the frame range for this modifier
* (e.g. to have one forward, and one backwards modifier)
@@ -515,27 +528,6 @@ static void generateStrokes(
}
}
-/* ******************************************** */
-
-/* FIXME: Baking the Build Modifier is currently unsupported.
- * Adding support for this is more complicated than for other
- * modifiers, as to implement this, we'd have to add more frames,
- * which would in turn break how the modifier functions.
- */
-#if 0
-static void bakeModifier(
- Main *bmain, const Depsgraph *UNUSED(depsgraph),
- GpencilModifierData *md, Object *ob)
-{
- bGPdata *gpd = ob->data;
-
- for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
- for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
-
- }
- }
-}
-#endif
/* ******************************************** */
@@ -544,13 +536,14 @@ GpencilModifierTypeInfo modifierType_Gpencil_Build = {
/* structName */ "BuildGpencilModifierData",
/* structSize */ sizeof(BuildGpencilModifierData),
/* type */ eGpencilModifierTypeType_Gpencil,
- /* flags */ 0,
+ /* flags */ eGpencilModifierTypeFlag_NoApply,
/* copyData */ copyData,
/* deformStroke */ NULL,
/* generateStrokes */ generateStrokes,
/* bakeModifier */ NULL,
+ /* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilcolor.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilcolor.c
index 0bbd26da670..4c1418fe0e3 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilcolor.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilcolor.c
@@ -77,9 +77,11 @@ static void deformStroke(
ColorGpencilModifierData *mmd = (ColorGpencilModifierData *)md;
float hsv[3], factor[3];
- if (!is_stroke_affected_by_modifier(ob,
- mmd->layername, mmd->pass_index, 1, gpl, gps,
- mmd->flag & GP_COLOR_INVERT_LAYER, mmd->flag & GP_COLOR_INVERT_PASS))
+ if (!is_stroke_affected_by_modifier(
+ ob,
+ mmd->layername, mmd->pass_index, mmd->layer_pass, 1, gpl, gps,
+ mmd->flag & GP_COLOR_INVERT_LAYER, mmd->flag & GP_COLOR_INVERT_PASS,
+ mmd->flag & GP_COLOR_INVERT_LAYERPASS))
{
return;
}
@@ -151,7 +153,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Color = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
- /* bakeModifier */ bakeModifier,
+ /* bakeModifier */ bakeModifier,
+ /* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilhook.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilhook.c
index 1ba2a08acdb..1ec6103939a 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilhook.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilhook.c
@@ -151,7 +151,6 @@ static float gp_hook_falloff(const struct GPHookData_cb *tData, const float len_
fac = sqrtf(2 * fac - fac * fac);
break;
default:
- fac = fac;
break;
}
@@ -209,9 +208,11 @@ static void deformStroke(
float dmat[4][4];
struct GPHookData_cb tData;
- if (!is_stroke_affected_by_modifier(ob,
- mmd->layername, mmd->pass_index, 3, gpl, gps,
- mmd->flag & GP_HOOK_INVERT_LAYER, mmd->flag & GP_HOOK_INVERT_PASS))
+ if (!is_stroke_affected_by_modifier(
+ ob,
+ mmd->layername, mmd->pass_index, mmd->layer_pass, 3, gpl, gps,
+ mmd->flag & GP_HOOK_INVERT_LAYER, mmd->flag & GP_HOOK_INVERT_PASS,
+ mmd->flag & GP_HOOK_INVERT_LAYERPASS))
{
return;
}
@@ -249,7 +250,7 @@ static void deformStroke(
/* loop points and apply deform */
for (int i = 0; i < gps->totpoints; i++) {
bGPDspoint *pt = &gps->points[i];
- MDeformVert *dvert = &gps->dvert[i];
+ MDeformVert *dvert = gps->dvert != NULL ? &gps->dvert[i] : NULL;
/* verify vertex group */
const float weight = get_modifier_point_weight(dvert, (mmd->flag & GP_HOOK_INVERT_VGROUP) != 0, def_nr);
@@ -341,7 +342,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Hook = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
- /* bakeModifier */ bakeModifier,
+ /* bakeModifier */ bakeModifier,
+ /* remapTime */ NULL,
/* initData */ initData,
/* freeData */ freeData,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilinstance.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilinstance.c
deleted file mode 100644
index 613c46803b9..00000000000
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilinstance.c
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2017, Blender Foundation
- * This is a new part of Blender
- *
- * Contributor(s): Antonio Vazquez, Joshua Leung
- *
- * ***** END GPL LICENSE BLOCK *****
- *
- */
-
-/** \file blender/gpencil_modifiers/intern/MOD_gpencilinstance.c
- * \ingroup modifiers
- */
-
-#include <stdio.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "DNA_scene_types.h"
-#include "DNA_object_types.h"
-#include "DNA_gpencil_types.h"
-#include "DNA_gpencil_modifier_types.h"
-
-#include "BLI_blenlib.h"
-#include "BLI_rand.h"
-#include "BLI_math.h"
-#include "BLI_utildefines.h"
-
-#include "BKE_gpencil.h"
-#include "BKE_gpencil_modifier.h"
-#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_object.h"
-#include "BKE_main.h"
-#include "BKE_scene.h"
-#include "BKE_layer.h"
-#include "BKE_collection.h"
-
-#include "DEG_depsgraph.h"
-#include "DEG_depsgraph_build.h"
-#include "DEG_depsgraph_query.h"
-
-#include "MOD_gpencil_util.h"
-#include "MOD_gpencil_modifiertypes.h"
-
-static void initData(GpencilModifierData *md)
-{
- InstanceGpencilModifierData *gpmd = (InstanceGpencilModifierData *)md;
- gpmd->count[0] = 1;
- gpmd->count[1] = 1;
- gpmd->count[2] = 1;
- gpmd->offset[0] = 1.0f;
- gpmd->offset[1] = 1.0f;
- gpmd->offset[2] = 1.0f;
- gpmd->shift[0] = 0.0f;
- gpmd->shift[1] = 0.0f;
- gpmd->shift[2] = 0.0f;
- gpmd->scale[0] = 1.0f;
- gpmd->scale[1] = 1.0f;
- gpmd->scale[2] = 1.0f;
- gpmd->rnd_rot = 0.5f;
- gpmd->rnd_size = 0.5f;
- gpmd->lock_axis |= GP_LOCKAXIS_X;
-
- /* fill random values */
- BLI_array_frand(gpmd->rnd, 20, 1);
- gpmd->rnd[0] = 1;
-}
-
-static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
-{
- BKE_gpencil_modifier_copyData_generic(md, target);
-}
-
-/* -------------------------------- */
-
-/* array modifier - generate geometry callback (for viewport/rendering) */
-/* TODO: How to skip this for the simplify options? --> !GP_SIMPLIFY_MODIF(ts, playing) */
-static void generate_geometry(
- GpencilModifierData *md, Depsgraph *UNUSED(depsgraph),
- Object *ob, bGPDlayer *gpl, bGPDframe *gpf)
-{
- InstanceGpencilModifierData *mmd = (InstanceGpencilModifierData *)md;
- ListBase stroke_cache = {NULL, NULL};
- bGPDstroke *gps;
- int idx;
-
- /* Check which strokes we can use once, and store those results in an array
- * for quicker checking of what's valid (since string comparisons are expensive)
- */
- const int num_strokes = BLI_listbase_count(&gpf->strokes);
- int num_valid = 0;
-
- bool *valid_strokes = MEM_callocN(sizeof(bool) * num_strokes, __func__);
-
- for (gps = gpf->strokes.first, idx = 0; gps; gps = gps->next, idx++) {
- /* Record whether this stroke can be used
- * ATTENTION: The logic here is the inverse of what's used everywhere else!
- */
- if (is_stroke_affected_by_modifier(ob,
- mmd->layername, mmd->pass_index, 1, gpl, gps,
- mmd->flag & GP_INSTANCE_INVERT_LAYER, mmd->flag & GP_INSTANCE_INVERT_PASS))
- {
- valid_strokes[idx] = true;
- num_valid++;
- }
- }
-
- /* Early exit if no strokes can be copied */
- if (num_valid == 0) {
- if (G.debug & G_DEBUG) {
- printf("GP Array Mod - No strokes to be included\n");
- }
-
- MEM_SAFE_FREE(valid_strokes);
- return;
- }
-
-
- /* Generate new instances of all existing strokes,
- * keeping each instance together so they maintain
- * the correct ordering relative to each other
- */
- for (int x = 0; x < mmd->count[0]; x++) {
- for (int y = 0; y < mmd->count[1]; y++) {
- for (int z = 0; z < mmd->count[2]; z++) {
- /* original strokes are at index = 0,0,0 */
- if ((x == 0) && (y == 0) && (z == 0)) {
- continue;
- }
-
- /* Compute transforms for this instance */
- const int elem_idx[3] = {x, y, z};
- float mat[4][4];
-
- BKE_gpencil_instance_modifier_instance_tfm(mmd, elem_idx, mat);
-
- /* apply shift */
- int sh = x;
- if (mmd->lock_axis == GP_LOCKAXIS_Y) {
- sh = y;
- }
- if (mmd->lock_axis == GP_LOCKAXIS_Z) {
- sh = z;
- }
- madd_v3_v3fl(mat[3], mmd->shift, sh);
-
- /* Duplicate original strokes to create this instance */
- for (gps = gpf->strokes.first, idx = 0; gps; gps = gps->next, idx++) {
- /* check if stroke can be duplicated */
- if (valid_strokes[idx]) {
- /* Duplicate stroke */
- bGPDstroke *gps_dst = MEM_dupallocN(gps);
- gps_dst->points = MEM_dupallocN(gps->points);
- gps_dst->dvert = MEM_dupallocN(gps->dvert);
- BKE_gpencil_stroke_weights_duplicate(gps, gps_dst);
-
- gps_dst->triangles = MEM_dupallocN(gps->triangles);
-
- /* Move points */
- for (int i = 0; i < gps->totpoints; i++) {
- bGPDspoint *pt = &gps_dst->points[i];
- mul_m4_v3(mat, &pt->x);
- }
-
- /* Add new stroke to cache, to be added to the frame once
- * all duplicates have been made
- */
- BLI_addtail(&stroke_cache, gps_dst);
- }
- }
- }
- }
- }
-
- /* merge newly created stroke instances back into the main stroke list */
- BLI_movelisttolist(&gpf->strokes, &stroke_cache);
-
- /* free temp data */
- MEM_SAFE_FREE(valid_strokes);
-}
-
-static void bakeModifier(
- Main *UNUSED(bmain), Depsgraph *depsgraph,
- GpencilModifierData *md, Object *ob)
-{
-
- bGPdata *gpd = ob->data;
-
- for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
- for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) {
- generate_geometry(md, depsgraph, ob, gpl, gpf);
- }
- }
-}
-
-/* -------------------------------- */
-
-/* Generic "generateStrokes" callback */
-static void generateStrokes(
- GpencilModifierData *md, Depsgraph *depsgraph,
- Object *ob, bGPDlayer *gpl, bGPDframe *gpf)
-{
- generate_geometry(md, depsgraph, ob, gpl, gpf);
-}
-
-GpencilModifierTypeInfo modifierType_Gpencil_Instance = {
- /* name */ "Instance",
- /* structName */ "InstanceGpencilModifierData",
- /* structSize */ sizeof(InstanceGpencilModifierData),
- /* type */ eGpencilModifierTypeType_Gpencil,
- /* flags */ 0,
-
- /* copyData */ copyData,
-
- /* deformStroke */ NULL,
- /* generateStrokes */ generateStrokes,
- /* bakeModifier */ bakeModifier,
-
- /* initData */ initData,
- /* freeData */ NULL,
- /* isDisabled */ NULL,
- /* updateDepsgraph */ NULL,
- /* dependsOnTime */ NULL,
- /* foreachObjectLink */ NULL,
- /* foreachIDLink */ NULL,
- /* foreachTexLink */ NULL,
-};
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c
index 55836dce1cd..d9ec81b70b9 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c
@@ -81,9 +81,11 @@ static void deformStroke(
LatticeGpencilModifierData *mmd = (LatticeGpencilModifierData *)md;
const int def_nr = defgroup_name_index(ob, mmd->vgname);
- if (!is_stroke_affected_by_modifier(ob,
- mmd->layername, mmd->pass_index, 3, gpl, gps,
- mmd->flag & GP_LATTICE_INVERT_LAYER, mmd->flag & GP_LATTICE_INVERT_PASS))
+ if (!is_stroke_affected_by_modifier(
+ ob,
+ mmd->layername, mmd->pass_index, mmd->layer_pass, 3, gpl, gps,
+ mmd->flag & GP_LATTICE_INVERT_LAYER, mmd->flag & GP_LATTICE_INVERT_PASS,
+ mmd->flag & GP_LATTICE_INVERT_LAYERPASS))
{
return;
}
@@ -94,7 +96,7 @@ static void deformStroke(
for (int i = 0; i < gps->totpoints; i++) {
bGPDspoint *pt = &gps->points[i];
- MDeformVert *dvert = &gps->dvert[i];
+ MDeformVert *dvert = gps->dvert != NULL ? &gps->dvert[i] : NULL;
/* verify vertex group */
const float weight = get_modifier_point_weight(dvert, (mmd->flag & GP_LATTICE_INVERT_VGROUP) != 0, def_nr);
@@ -198,7 +200,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Lattice = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
- /* bakeModifier */ bakeModifier,
+ /* bakeModifier */ bakeModifier,
+ /* remapTime */ NULL,
/* initData */ initData,
/* freeData */ freeData,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c
index 4c359be670f..9c3d3dc9235 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c
@@ -124,8 +124,11 @@ static void generateStrokes(
for (i = 0, gps = gpf->strokes.first; i < tot_strokes; i++, gps = gps->next) {
if (is_stroke_affected_by_modifier(
- ob, mmd->layername, mmd->pass_index, 1, gpl, gps,
- mmd->flag & GP_MIRROR_INVERT_LAYER, mmd->flag & GP_MIRROR_INVERT_PASS))
+ ob, mmd->layername, mmd->pass_index, mmd->layer_pass,
+ 1, gpl, gps,
+ mmd->flag & GP_MIRROR_INVERT_LAYER,
+ mmd->flag & GP_MIRROR_INVERT_PASS,
+ mmd->flag & GP_MIRROR_INVERT_LAYERPASS))
{
gps_new = BKE_gpencil_stroke_duplicate(gps);
update_position(ob, mmd, gps_new, xi);
@@ -197,7 +200,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Mirror = {
/* deformStroke */ NULL,
/* generateStrokes */ generateStrokes,
- /* bakeModifier */ bakeModifier,
+ /* bakeModifier */ bakeModifier,
+ /* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
index d2e74a1de66..399ff27eafb 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
@@ -101,13 +101,10 @@ static void deformStroke(
{
NoiseGpencilModifierData *mmd = (NoiseGpencilModifierData *)md;
bGPDspoint *pt0, *pt1;
- MDeformVert *dvert;
+ MDeformVert *dvert = NULL;
float shift, vran, vdir;
float normal[3];
float vec1[3], vec2[3];
-#if 0
- Scene *scene = DEG_get_evaluated_scene(depsgraph);
-#endif
int sc_frame = 0;
int sc_diff = 0;
const int def_nr = defgroup_name_index(ob, mmd->vgname);
@@ -115,13 +112,15 @@ static void deformStroke(
/* Random generator, only init once. */
if (mmd->rng == NULL) {
uint rng_seed = (uint)(PIL_check_seconds_timer_i() & UINT_MAX);
- rng_seed ^= GET_UINT_FROM_POINTER(mmd);
+ rng_seed ^= POINTER_AS_UINT(mmd);
mmd->rng = BLI_rng_new(rng_seed);
}
- if (!is_stroke_affected_by_modifier(ob,
- mmd->layername, mmd->pass_index, 3, gpl, gps,
- mmd->flag & GP_NOISE_INVERT_LAYER, mmd->flag & GP_NOISE_INVERT_PASS))
+ if (!is_stroke_affected_by_modifier(
+ ob,
+ mmd->layername, mmd->pass_index, mmd->layer_pass, 3, gpl, gps,
+ mmd->flag & GP_NOISE_INVERT_LAYER, mmd->flag & GP_NOISE_INVERT_PASS,
+ mmd->flag & GP_NOISE_INVERT_LAYERPASS))
{
return;
}
@@ -141,12 +140,16 @@ static void deformStroke(
/* last point is special */
if (i == gps->totpoints) {
- dvert = &gps->dvert[i - 2];
+ if (gps->dvert) {
+ dvert = &gps->dvert[i - 2];
+ }
pt0 = &gps->points[i - 2];
pt1 = &gps->points[i - 1];
}
else {
- dvert = &gps->dvert[i - 1];
+ if (gps->dvert) {
+ dvert = &gps->dvert[i - 1];
+ }
pt0 = &gps->points[i - 1];
pt1 = &gps->points[i];
@@ -271,7 +274,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Noise = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
- /* bakeModifier */ bakeModifier,
+ /* bakeModifier */ bakeModifier,
+ /* remapTime */ NULL,
/* initData */ initData,
/* freeData */ freeData,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c b/source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c
index f59056b2845..43af4b94c15 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c
@@ -77,16 +77,18 @@ static void deformStroke(
float mat[4][4];
float loc[3], rot[3], scale[3];
- if (!is_stroke_affected_by_modifier(ob,
- mmd->layername, mmd->pass_index, 1, gpl, gps,
- mmd->flag & GP_OFFSET_INVERT_LAYER, mmd->flag & GP_OFFSET_INVERT_PASS))
+ if (!is_stroke_affected_by_modifier(
+ ob,
+ mmd->layername, mmd->pass_index, mmd->layer_pass, 1, gpl, gps,
+ mmd->flag & GP_OFFSET_INVERT_LAYER, mmd->flag & GP_OFFSET_INVERT_PASS,
+ mmd->flag & GP_OFFSET_INVERT_LAYERPASS))
{
return;
}
for (int i = 0; i < gps->totpoints; i++) {
bGPDspoint *pt = &gps->points[i];
- MDeformVert *dvert = &gps->dvert[i];
+ MDeformVert *dvert = gps->dvert != NULL ? &gps->dvert[i] : NULL;
/* verify vertex group */
const float weight = get_modifier_point_weight(dvert, (mmd->flag & GP_OFFSET_INVERT_VGROUP) != 0, def_nr);
@@ -130,7 +132,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Offset = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
- /* bakeModifier */ bakeModifier,
+ /* bakeModifier */ bakeModifier,
+ /* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilopacity.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilopacity.c
index 19e3b1bb384..b89c3792455 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilopacity.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilopacity.c
@@ -79,8 +79,9 @@ static void deformStroke(
if (!is_stroke_affected_by_modifier(
ob,
- mmd->layername, mmd->pass_index, 1, gpl, gps,
- mmd->flag & GP_OPACITY_INVERT_LAYER, mmd->flag & GP_OPACITY_INVERT_PASS))
+ mmd->layername, mmd->pass_index, mmd->layer_pass, 1, gpl, gps,
+ mmd->flag & GP_OPACITY_INVERT_LAYER, mmd->flag & GP_OPACITY_INVERT_PASS,
+ mmd->flag & GP_OPACITY_INVERT_LAYERPASS))
{
return;
}
@@ -107,7 +108,7 @@ static void deformStroke(
if (mmd->factor > 1.0f) {
for (int i = 0; i < gps->totpoints; i++) {
bGPDspoint *pt = &gps->points[i];
- MDeformVert *dvert = &gps->dvert[i];
+ MDeformVert *dvert = gps->dvert != NULL ? &gps->dvert[i] : NULL;
/* verify vertex group */
const float weight = get_modifier_point_weight(dvert, (mmd->flag & GP_OPACITY_INVERT_VGROUP) != 0, def_nr);
@@ -171,7 +172,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Opacity = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
- /* bakeModifier */ bakeModifier,
+ /* bakeModifier */ bakeModifier,
+ /* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilsimplify.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilsimplify.c
index a8d10c973ce..2d0b90e6de7 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilsimplify.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilsimplify.c
@@ -66,9 +66,11 @@ static void deformStroke(
{
SimplifyGpencilModifierData *mmd = (SimplifyGpencilModifierData *)md;
- if (!is_stroke_affected_by_modifier(ob,
- mmd->layername, mmd->pass_index, 4, gpl, gps,
- mmd->flag & GP_SIMPLIFY_INVERT_LAYER, mmd->flag & GP_SIMPLIFY_INVERT_PASS))
+ if (!is_stroke_affected_by_modifier(
+ ob,
+ mmd->layername, mmd->pass_index, mmd->layer_pass, 4, gpl, gps,
+ mmd->flag & GP_SIMPLIFY_INVERT_LAYER, mmd->flag & GP_SIMPLIFY_INVERT_PASS,
+ mmd->flag & GP_SIMPLIFY_INVERT_LAYERPASS))
{
return;
}
@@ -110,7 +112,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Simplify = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
- /* bakeModifier */ bakeModifier,
+ /* bakeModifier */ bakeModifier,
+ /* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c
index d6a0721129d..8d93980a9d0 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilsmooth.c
@@ -69,9 +69,11 @@ static void deformStroke(
SmoothGpencilModifierData *mmd = (SmoothGpencilModifierData *)md;
const int def_nr = defgroup_name_index(ob, mmd->vgname);
- if (!is_stroke_affected_by_modifier(ob,
- mmd->layername, mmd->pass_index, 3, gpl, gps,
- mmd->flag & GP_SMOOTH_INVERT_LAYER, mmd->flag & GP_SMOOTH_INVERT_PASS))
+ if (!is_stroke_affected_by_modifier(
+ ob,
+ mmd->layername, mmd->pass_index, mmd->layer_pass, 3, gpl, gps,
+ mmd->flag & GP_SMOOTH_INVERT_LAYER, mmd->flag & GP_SMOOTH_INVERT_PASS,
+ mmd->flag & GP_SMOOTH_INVERT_LAYERPASS))
{
return;
}
@@ -80,8 +82,7 @@ static void deformStroke(
if (mmd->factor > 0.0f) {
for (int r = 0; r < mmd->step; r++) {
for (int i = 0; i < gps->totpoints; i++) {
- // bGPDspoint *pt = &gps->points[i];
- MDeformVert *dvert = &gps->dvert[i];
+ MDeformVert *dvert = gps->dvert != NULL ? &gps->dvert[i] : NULL;
/* verify vertex group */
const float weight = get_modifier_point_weight(
@@ -138,7 +139,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Smooth = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
- /* bakeModifier */ bakeModifier,
+ /* bakeModifier */ bakeModifier,
+ /* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilsubdiv.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilsubdiv.c
index 3ba53250abd..38aa4159632 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilsubdiv.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilsubdiv.c
@@ -70,9 +70,11 @@ static void deformStroke(
{
SubdivGpencilModifierData *mmd = (SubdivGpencilModifierData *)md;
- if (!is_stroke_affected_by_modifier(ob,
- mmd->layername, mmd->pass_index, 3, gpl, gps,
- mmd->flag & GP_SUBDIV_INVERT_LAYER, mmd->flag & GP_SUBDIV_INVERT_PASS))
+ if (!is_stroke_affected_by_modifier(
+ ob,
+ mmd->layername, mmd->pass_index, mmd->layer_pass, 3, gpl, gps,
+ mmd->flag & GP_SUBDIV_INVERT_LAYER, mmd->flag & GP_SUBDIV_INVERT_PASS,
+ mmd->flag & GP_SUBDIV_INVERT_LAYERPASS))
{
return;
}
@@ -106,7 +108,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Subdiv = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
- /* bakeModifier */ bakeModifier,
+ /* bakeModifier */ bakeModifier,
+ /* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilthick.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilthick.c
index 3b5f4dbf7c7..4c44559f36e 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilthick.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilthick.c
@@ -94,9 +94,11 @@ static void deformStroke(
ThickGpencilModifierData *mmd = (ThickGpencilModifierData *)md;
const int def_nr = defgroup_name_index(ob, mmd->vgname);
- if (!is_stroke_affected_by_modifier(ob,
- mmd->layername, mmd->pass_index, 3, gpl, gps,
- mmd->flag & GP_THICK_INVERT_LAYER, mmd->flag & GP_THICK_INVERT_PASS))
+ if (!is_stroke_affected_by_modifier(
+ ob,
+ mmd->layername, mmd->pass_index, mmd->layer_pass, 1, gpl, gps,
+ mmd->flag & GP_THICK_INVERT_LAYER, mmd->flag & GP_THICK_INVERT_PASS,
+ mmd->flag & GP_THICK_INVERT_LAYERPASS))
{
return;
}
@@ -108,7 +110,7 @@ static void deformStroke(
for (int i = 0; i < gps->totpoints; i++) {
bGPDspoint *pt = &gps->points[i];
- MDeformVert *dvert = &gps->dvert[i];
+ MDeformVert *dvert = gps->dvert != NULL ? &gps->dvert[i] : NULL;
float curvef = 1.0f;
/* verify vertex group */
const float weight = get_modifier_point_weight(dvert, (mmd->flag & GP_THICK_INVERT_VGROUP) != 0, def_nr);
@@ -127,7 +129,7 @@ static void deformStroke(
}
pt->pressure += mmd->thickness * weight * curvef;
- CLAMP(pt->strength, 0.0f, 1.0f);
+ CLAMP_MIN(pt->pressure, 0.1f);
}
}
}
@@ -156,9 +158,10 @@ GpencilModifierTypeInfo modifierType_Gpencil_Thick = {
/* copyData */ copyData,
- /* deformStroke */ deformStroke,
- /* generateStrokes */ NULL,
- /* bakeModifier */ bakeModifier,
+ /* deformStroke */ deformStroke,
+ /* generateStrokes */ NULL,
+ /* bakeModifier */ bakeModifier,
+ /* remapTime */ NULL,
/* initData */ initData,
/* freeData */ freeData,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpenciltime.c b/source/blender/gpencil_modifiers/intern/MOD_gpenciltime.c
new file mode 100644
index 00000000000..e220d5a5e85
--- /dev/null
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpenciltime.c
@@ -0,0 +1,190 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2018, Blender Foundation
+ * This is a new part of Blender
+ *
+ * Contributor(s): Antonio Vazquez
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/** \file blender/gpencil_modifiers/intern/MOD_gpenciltime.c
+ * \ingroup modifiers
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "BLI_utildefines.h"
+
+#include "DNA_meshdata_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_gpencil_types.h"
+#include "DNA_gpencil_modifier_types.h"
+
+#include "BKE_colortools.h"
+#include "BKE_context.h"
+#include "BKE_deform.h"
+#include "BKE_gpencil.h"
+#include "BKE_gpencil_modifier.h"
+
+#include "DEG_depsgraph.h"
+
+#include "MOD_gpencil_util.h"
+#include "MOD_gpencil_modifiertypes.h"
+
+static void initData(GpencilModifierData *md)
+{
+ TimeGpencilModifierData *gpmd = (TimeGpencilModifierData *)md;
+ gpmd->layername[0] = '\0';
+ gpmd->offset = 1;
+ gpmd->frame_scale = 1.0f;
+ gpmd->flag |= GP_TIME_KEEP_LOOP;
+ gpmd->sfra = 1;
+ gpmd->efra = 250;
+}
+
+static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
+{
+ BKE_gpencil_modifier_copyData_generic(md, target);
+}
+
+static int remapTime(
+ struct GpencilModifierData *md, struct Depsgraph *UNUSED(depsgraph),
+ struct Scene *scene, struct Object *UNUSED(ob), struct bGPDlayer *gpl, int cfra)
+{
+ TimeGpencilModifierData *mmd = (TimeGpencilModifierData *)md;
+ const bool custom = mmd->flag & GP_TIME_CUSTOM_RANGE;
+ const bool invgpl = mmd->flag & GP_TIME_INVERT_LAYER;
+ const bool invpass = mmd->flag & GP_TIME_INVERT_LAYERPASS;
+ int sfra = custom ? mmd->sfra : scene->r.sfra;
+ int efra = custom ? mmd->efra : scene->r.efra;
+ CLAMP_MIN(sfra, 1);
+ CLAMP_MIN(efra, 1);
+ const int time_range = efra - sfra + 1;
+ int offset = mmd->offset;
+ int segments = 0;
+
+ /* omit if filter by layer */
+ if (mmd->layername[0] != '\0') {
+ if (invgpl == false) {
+ if (!STREQ(mmd->layername, gpl->info)) {
+ return cfra;
+ }
+ }
+ else {
+ if (STREQ(mmd->layername, gpl->info)) {
+ return cfra;
+ }
+ }
+ }
+ /* verify pass */
+ if (mmd->layer_pass > 0) {
+ if (invpass == false) {
+ if (gpl->pass_index != mmd->layer_pass) {
+ return cfra;
+ }
+ }
+ else {
+ if (gpl->pass_index == mmd->layer_pass) {
+ return cfra;
+ }
+ }
+ }
+
+ /* if fix mode, return predefined frame number */
+ if (mmd->mode == GP_TIME_MODE_FIX) {
+ return offset;
+ }
+
+ /* invert current frame number */
+ if (mmd->mode == GP_TIME_MODE_REVERSE) {
+ cfra = efra - cfra + sfra;
+ }
+
+ /* apply frame scale */
+ cfra *= mmd->frame_scale;
+
+ /* verify offset never is greater than frame range */
+ if (abs(offset) > time_range) {
+ offset = offset - ((offset / time_range) * time_range);
+ }
+
+ /* verify not outside range if loop is disabled */
+ if ((mmd->flag & GP_TIME_KEEP_LOOP) == 0) {
+ if (cfra + offset < sfra) {
+ return sfra;
+ }
+ if (cfra + offset > efra) {
+ return efra;
+ }
+ }
+
+ /* check frames before start */
+ if (cfra < sfra) {
+ segments = ((cfra + sfra) / time_range);
+ cfra = cfra + (segments * time_range);
+ }
+
+ /* check frames after end */
+ if (cfra > efra) {
+ segments = ((cfra - sfra) / time_range);
+ cfra = cfra - (segments * time_range);
+ }
+
+ if (mmd->flag & GP_TIME_KEEP_LOOP) {
+ const int nfra = cfra + offset;
+
+ /* if the sum of the cfra is out scene frame range, recalc */
+ if (cfra + offset < sfra) {
+ const int delta = abs(sfra - nfra);
+ return efra - delta + 1;
+ }
+ else if (cfra + offset > efra) {
+ return nfra - efra + sfra - 1;
+ }
+ }
+
+ return cfra + offset;
+}
+
+GpencilModifierTypeInfo modifierType_Gpencil_Time = {
+ /* name */ "Time Offset",
+ /* structName */ "TimeGpencilModifierData",
+ /* structSize */ sizeof(TimeGpencilModifierData),
+ /* type */ eGpencilModifierTypeType_Gpencil,
+ /* flags */ eGpencilModifierTypeFlag_NoApply,
+
+ /* copyData */ copyData,
+
+ /* deformStroke */ NULL,
+ /* generateStrokes */ NULL,
+ /* bakeModifier */ NULL,
+ /* remapTime */ remapTime,
+
+ /* initData */ initData,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
+ /* updateDepsgraph */ NULL,
+ /* dependsOnTime */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
+ /* foreachTexLink */ NULL,
+};
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpenciltint.c b/source/blender/gpencil_modifiers/intern/MOD_gpenciltint.c
index 98cf3ae16e7..ba3b2d84861 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpenciltint.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpenciltint.c
@@ -75,9 +75,11 @@ static void deformStroke(
{
TintGpencilModifierData *mmd = (TintGpencilModifierData *)md;
- if (!is_stroke_affected_by_modifier(ob,
- mmd->layername, mmd->pass_index, 1, gpl, gps,
- mmd->flag & GP_TINT_INVERT_LAYER, mmd->flag & GP_TINT_INVERT_PASS))
+ if (!is_stroke_affected_by_modifier(
+ ob,
+ mmd->layername, mmd->pass_index, mmd->layer_pass, 1, gpl, gps,
+ mmd->flag & GP_TINT_INVERT_LAYER, mmd->flag & GP_TINT_INVERT_PASS,
+ mmd->flag & GP_TINT_INVERT_LAYERPASS))
{
return;
}
@@ -159,7 +161,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Tint = {
/* deformStroke */ deformStroke,
/* generateStrokes */ NULL,
- /* bakeModifier */ bakeModifier,
+ /* bakeModifier */ bakeModifier,
+ /* remapTime */ NULL,
/* initData */ initData,
/* freeData */ NULL,
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index d232d3fab93..2eb24f08227 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -87,15 +87,13 @@ set(SRC
intern/gpu_vertex_format.c
intern/gpu_viewport.c
- shaders/gpu_shader_material.glsl
- shaders/gpu_shader_fire_frag.glsl
- shaders/gpu_shader_smoke_frag.glsl
- shaders/gpu_shader_smoke_vert.glsl
-
GPU_attr_binding.h
GPU_batch.h
+ GPU_batch_presets.h
+ GPU_batch_utils.h
GPU_buffers.h
GPU_common.h
+ GPU_context.h
GPU_debug.h
GPU_draw.h
GPU_element.h
@@ -201,6 +199,7 @@ data_to_c_simple(shaders/gpu_shader_point_uniform_color_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_point_uniform_color_aa_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_point_uniform_color_outline_aa_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_point_varying_color_outline_aa_frag.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_point_varying_color_varying_outline_aa_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_point_varying_color_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_point_fixed_size_varying_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_point_varying_size_vert.glsl SRC)
@@ -212,6 +211,12 @@ data_to_c_simple(shaders/gpu_shader_2D_point_uniform_size_aa_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_point_uniform_size_outline_aa_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_point_uniform_size_varying_color_outline_aa_vert.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_2D_edituvs_points_vert.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_2D_edituvs_facedots_vert.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_2D_edituvs_edges_vert.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_2D_edituvs_faces_vert.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_2D_edituvs_stretch_vert.glsl SRC)
+
data_to_c_simple(shaders/gpu_shader_edges_front_back_persp_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_edges_front_back_persp_geom.glsl SRC)
data_to_c_simple(shaders/gpu_shader_edges_front_back_persp_legacy_vert.glsl SRC)
@@ -229,9 +234,6 @@ data_to_c_simple(shaders/gpu_shader_keyframe_diamond_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_keyframe_diamond_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_geometry.glsl SRC)
-data_to_c_simple(shaders/gpu_shader_fire_frag.glsl SRC)
-data_to_c_simple(shaders/gpu_shader_smoke_frag.glsl SRC)
-data_to_c_simple(shaders/gpu_shader_smoke_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_material.glsl SRC)
data_to_c_simple(shaders/gpu_shader_gpencil_stroke_vert.glsl SRC)
@@ -252,8 +254,4 @@ if(WITH_IMAGE_DDS)
add_definitions(-DWITH_DDS)
endif()
-if(WITH_OPENSUBDIV)
- add_definitions(-DWITH_OPENSUBDIV)
-endif()
-
blender_add_lib(bf_gpu "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/gpu/GPU_batch_presets.h b/source/blender/gpu/GPU_batch_presets.h
index 6b010396a9b..d5cabf8bf90 100644
--- a/source/blender/gpu/GPU_batch_presets.h
+++ b/source/blender/gpu/GPU_batch_presets.h
@@ -49,6 +49,7 @@ struct GPUBatch *GPU_batch_preset_sphere_wire(int lod) ATTR_WARN_UNUSED_RESULT;
void gpu_batch_presets_init(void);
void gpu_batch_presets_register(struct GPUBatch *preset_batch);
+bool gpu_batch_presets_unregister(struct GPUBatch *preset_batch);
void gpu_batch_presets_reset(void);
void gpu_batch_presets_exit(void);
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index e60b5d60c30..5b96312300b 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -38,7 +38,6 @@ struct BMesh;
struct CCGElem;
struct CCGKey;
struct DMFlagMat;
-struct GridCommonGPUBuffer;
struct GSet;
struct MLoop;
struct MLoopTri;
@@ -46,7 +45,7 @@ struct MPoly;
struct MVert;
struct PBVH;
-/* Buffers for non-DerivedMesh drawing */
+/* Buffers for drawing from PBVH grids. */
typedef struct GPU_PBVH_Buffers GPU_PBVH_Buffers;
/* build */
@@ -58,8 +57,7 @@ GPU_PBVH_Buffers *GPU_pbvh_mesh_buffers_build(
const int face_indices_len);
GPU_PBVH_Buffers *GPU_pbvh_grid_buffers_build(
- int *grid_indices, int totgrid, unsigned int **grid_hidden, int gridsize, const struct CCGKey *key,
- struct GridCommonGPUBuffer **grid_common_gpu_buffer);
+ int *grid_indices, int totgrid, unsigned int **grid_hidden, int gridsize, const struct CCGKey *key);
GPU_PBVH_Buffers *GPU_pbvh_bmesh_buffers_build(bool smooth_shading);
@@ -98,7 +96,6 @@ bool GPU_pbvh_buffers_has_mask(GPU_PBVH_Buffers *buffers);
void GPU_pbvh_BB_draw(float min[3], float max[3], bool leaf, unsigned int pos);
void GPU_pbvh_buffers_free(GPU_PBVH_Buffers *buffers);
-void GPU_pbvh_multires_buffers_free(struct GridCommonGPUBuffer **grid_common_gpu_buffer);
void GPU_pbvh_fix_linking(void);
diff --git a/source/blender/gpu/GPU_context.h b/source/blender/gpu/GPU_context.h
index 3e32b64b281..4d667a02fac 100644
--- a/source/blender/gpu/GPU_context.h
+++ b/source/blender/gpu/GPU_context.h
@@ -26,7 +26,7 @@
/** \file blender/gpu/GPU_context.h
* \ingroup gpu
*
- * This interface allow GPU to manage VAOs for mutiple context and threads.
+ * This interface allow GPU to manage VAOs for multiple context and threads.
*/
#ifndef __GPU_CONTEXT_H__
diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h
index 028756bc739..008f4199b02 100644
--- a/source/blender/gpu/GPU_draw.h
+++ b/source/blender/gpu/GPU_draw.h
@@ -103,6 +103,7 @@ void GPU_free_images_old(struct Main *bmain);
void GPU_free_smoke(struct SmokeModifierData *smd);
void GPU_free_smoke_velocity(struct SmokeModifierData *smd);
void GPU_create_smoke(struct SmokeModifierData *smd, int highres);
+void GPU_create_smoke_coba_field(struct SmokeModifierData *smd);
void GPU_create_smoke_velocity(struct SmokeModifierData *smd);
/* Delayed free of OpenGL buffers by main thread */
diff --git a/source/blender/gpu/GPU_element.h b/source/blender/gpu/GPU_element.h
index adc705ab641..9d2458ef1aa 100644
--- a/source/blender/gpu/GPU_element.h
+++ b/source/blender/gpu/GPU_element.h
@@ -89,6 +89,7 @@ void GPU_indexbuf_build_in_place(GPUIndexBufBuilder *, GPUIndexBuf *);
void GPU_indexbuf_discard(GPUIndexBuf *);
+int GPU_indexbuf_primitive_len(GPUPrimType prim_type);
/* Macros */
diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h
index f435be7fb34..07d8a5f8c8b 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -38,19 +38,22 @@ extern "C" {
/* GPU extensions support */
-bool GPU_full_non_power_of_two_support(void);
-bool GPU_bicubic_bump_support(void);
-
int GPU_max_texture_size(void);
int GPU_max_texture_layers(void);
int GPU_max_textures(void);
+int GPU_max_textures_vert(void);
+int GPU_max_textures_geom(void);
+int GPU_max_textures_frag(void);
float GPU_max_texture_anisotropy(void);
int GPU_max_color_texture_samples(void);
int GPU_max_cube_map_size(void);
int GPU_max_ubo_binds(void);
int GPU_max_ubo_size(void);
+float GPU_max_line_width(void);
int GPU_color_depth(void);
void GPU_get_dfdy_factors(float fac[2]);
+bool GPU_mip_render_workaround(void);
+bool GPU_depth_blitting_workaround(void);
bool GPU_mem_stats_supported(void);
void GPU_mem_stats_get(int *totalmem, int *freemem);
diff --git a/source/blender/gpu/GPU_immediate.h b/source/blender/gpu/GPU_immediate.h
index c8a4ea6a837..846adc44cee 100644
--- a/source/blender/gpu/GPU_immediate.h
+++ b/source/blender/gpu/GPU_immediate.h
@@ -57,46 +57,46 @@ GPUBatch *immBeginBatchAtMost(GPUPrimType, uint vertex_len);
/* Provide attribute values that can change per vertex. */
/* First vertex after immBegin must have all its attributes specified. */
-/* Skipped attributes will continue using the previous value for that attrib_id. */
-void immAttrib1f(uint attrib_id, float x);
-void immAttrib2f(uint attrib_id, float x, float y);
-void immAttrib3f(uint attrib_id, float x, float y, float z);
-void immAttrib4f(uint attrib_id, float x, float y, float z, float w);
+/* Skipped attributes will continue using the previous value for that attr_id. */
+void immAttr1f(uint attr_id, float x);
+void immAttr2f(uint attr_id, float x, float y);
+void immAttr3f(uint attr_id, float x, float y, float z);
+void immAttr4f(uint attr_id, float x, float y, float z, float w);
-void immAttrib2i(uint attrib_id, int x, int y);
+void immAttr2i(uint attr_id, int x, int y);
-void immAttrib1u(uint attrib_id, uint x);
+void immAttr1u(uint attr_id, uint x);
-void immAttrib2s(uint attrib_id, short x, short y);
+void immAttr2s(uint attr_id, short x, short y);
-void immAttrib2fv(uint attrib_id, const float data[2]);
-void immAttrib3fv(uint attrib_id, const float data[3]);
-void immAttrib4fv(uint attrib_id, const float data[4]);
+void immAttr2fv(uint attr_id, const float data[2]);
+void immAttr3fv(uint attr_id, const float data[3]);
+void immAttr4fv(uint attr_id, const float data[4]);
-void immAttrib3ub(uint attrib_id, unsigned char r, unsigned char g, unsigned char b);
-void immAttrib4ub(uint attrib_id, unsigned char r, unsigned char g, unsigned char b, unsigned char a);
+void immAttr3ub(uint attr_id, unsigned char r, unsigned char g, unsigned char b);
+void immAttr4ub(uint attr_id, unsigned char r, unsigned char g, unsigned char b, unsigned char a);
-void immAttrib3ubv(uint attrib_id, const unsigned char data[4]);
-void immAttrib4ubv(uint attrib_id, const unsigned char data[4]);
+void immAttr3ubv(uint attr_id, const unsigned char data[4]);
+void immAttr4ubv(uint attr_id, const unsigned char data[4]);
/* Explicitly skip an attribute. */
-/* This advanced option kills automatic value copying for this attrib_id. */
-void immSkipAttrib(uint attrib_id);
+/* This advanced option kills automatic value copying for this attr_id. */
+void immAttrSkip(uint attr_id);
/* Provide one last attribute value & end the current vertex. */
/* This is most often used for 2D or 3D position (similar to glVertex). */
-void immVertex2f(uint attrib_id, float x, float y);
-void immVertex3f(uint attrib_id, float x, float y, float z);
-void immVertex4f(uint attrib_id, float x, float y, float z, float w);
+void immVertex2f(uint attr_id, float x, float y);
+void immVertex3f(uint attr_id, float x, float y, float z);
+void immVertex4f(uint attr_id, float x, float y, float z, float w);
-void immVertex2i(uint attrib_id, int x, int y);
+void immVertex2i(uint attr_id, int x, int y);
-void immVertex2s(uint attrib_id, short x, short y);
+void immVertex2s(uint attr_id, short x, short y);
-void immVertex2fv(uint attrib_id, const float data[2]);
-void immVertex3fv(uint attrib_id, const float data[3]);
+void immVertex2fv(uint attr_id, const float data[2]);
+void immVertex3fv(uint attr_id, const float data[3]);
-void immVertex2iv(uint attrib_id, const int data[2]);
+void immVertex2iv(uint attr_id, const int data[2]);
/* Provide uniform values that don't change for the entire draw call. */
void immUniform1i(const char *name, int x);
diff --git a/source/blender/gpu/GPU_immediate_util.h b/source/blender/gpu/GPU_immediate_util.h
index 58555e287b0..7baf359c52e 100644
--- a/source/blender/gpu/GPU_immediate_util.h
+++ b/source/blender/gpu/GPU_immediate_util.h
@@ -28,7 +28,7 @@
#define __GPU_IMMEDIATE_UTIL_H__
/* Draw 2D rectangles (replaces glRect functions) */
-/* caller is reponsible for vertex format & shader */
+/* caller is responsible for vertex format & shader */
void immRectf(uint pos, float x1, float y1, float x2, float y2);
void immRecti(uint pos, int x1, int y1, int x2, int y2);
@@ -48,6 +48,11 @@ void imm_draw_circle_fill_aspect_2d(uint shdr_pos, float x, float y, float radiu
void imm_draw_circle_wire_3d(uint pos, float x, float y, float radius, int nsegments);
void imm_draw_circle_fill_3d(uint pos, float x, float y, float radius, int nsegments);
+/* same as 'imm_draw_disk_partial_fill_2d', except it draws a wire arc. */
+void imm_draw_circle_partial_wire_2d(
+ uint pos, float x, float y,
+ float radius, int nsegments, float start, float sweep);
+
void imm_draw_disk_partial_fill_2d(
uint pos, float x, float y,
float radius_inner, float radius_outer, int nsegments, float start, float sweep);
diff --git a/source/blender/gpu/GPU_legacy_stubs.h b/source/blender/gpu/GPU_legacy_stubs.h
index a195eac9eec..27f805c4d31 100644
--- a/source/blender/gpu/GPU_legacy_stubs.h
+++ b/source/blender/gpu/GPU_legacy_stubs.h
@@ -28,10 +28,10 @@
/** \file GPU_legacy_stubs.h
* \ingroup gpu
*
- * This is to mark the transition to OpenGL core profile
- * The idea is to allow Blender 2.8 to be built with OpenGL 3.3 even if it means breaking things
+ * This is to mark the transition to OpenGL core profile
+ * The idea is to allow Blender 2.8 to be built with OpenGL 3.3 even if it means breaking things
*
- * This file should be removed in the future
+ * This file should be removed in the future
*/
#ifndef __GPU_LEGACY_STUBS_H__
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index c8f66e33202..737093ddffc 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -114,13 +114,9 @@ typedef enum GPUBuiltin {
GPU_VOLUME_FLAME = (1 << 17),
GPU_VOLUME_TEMPERATURE = (1 << 18),
GPU_BARYCENTRIC_TEXCO = (1 << 19),
+ GPU_BARYCENTRIC_DIST = (1 << 20),
} GPUBuiltin;
-typedef enum GPUMatType {
- GPU_MATERIAL_TYPE_MESH = 1,
- GPU_MATERIAL_TYPE_WORLD = 2,
-} GPUMatType;
-
typedef enum GPUMatFlag {
GPU_MATFLAG_DIFFUSE = (1 << 0),
GPU_MATFLAG_GLOSSY = (1 << 1),
@@ -186,13 +182,13 @@ void GPU_material_free(struct ListBase *gpumaterial);
void GPU_materials_free(struct Main *bmain);
struct Scene *GPU_material_scene(GPUMaterial *material);
-GPUMatType GPU_Material_get_type(GPUMaterial *material);
struct GPUPass *GPU_material_get_pass(GPUMaterial *material);
struct ListBase *GPU_material_get_inputs(GPUMaterial *material);
GPUMaterialStatus GPU_material_status(GPUMaterial *mat);
struct GPUUniformBuffer *GPU_material_uniform_buffer_get(GPUMaterial *material);
void GPU_material_uniform_buffer_create(GPUMaterial *material, ListBase *inputs);
+struct GPUUniformBuffer *GPU_material_create_sss_profile_ubo(void);
void GPU_material_vertex_attributes(
GPUMaterial *material,
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index 7cb841c421a..308205339db 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -44,12 +44,6 @@ struct GPUUniformBuffer;
* - only for fragment shaders now
* - must call texture bind before setting a texture as uniform! */
-enum {
- GPU_SHADER_FLAGS_NONE = 0,
- GPU_SHADER_FLAGS_SPECIAL_OPENSUBDIV = (1 << 0),
- GPU_SHADER_FLAGS_NEW_SHADING = (1 << 1),
-};
-
typedef enum GPUShaderTFBType {
GPU_SHADER_TFB_NONE = 0, /* Transform feedback unsupported. */
GPU_SHADER_TFB_POINTS = 1,
@@ -70,7 +64,6 @@ GPUShader *GPU_shader_create_ex(
const char *geocode,
const char *libcode,
const char *defines,
- const int flags,
const GPUShaderTFBType tf_type,
const char **tf_names,
const int tf_count,
@@ -80,7 +73,7 @@ void GPU_shader_free(GPUShader *shader);
void GPU_shader_bind(GPUShader *shader);
void GPU_shader_unbind(void);
-/* Returns true if transform feedback was succesfully enabled. */
+/* Returns true if transform feedback was successfully enabled. */
bool GPU_shader_transform_feedback_enable(GPUShader *shader, unsigned int vbo_id);
void GPU_shader_transform_feedback_disable(GPUShader *shader);
@@ -100,6 +93,7 @@ void GPU_shader_uniform_vector_int(
void GPU_shader_uniform_buffer(GPUShader *shader, int location, struct GPUUniformBuffer *ubo);
void GPU_shader_uniform_texture(GPUShader *shader, int location, struct GPUTexture *tex);
+void GPU_shader_uniform_float(GPUShader *shader, int location, float value);
void GPU_shader_uniform_int(GPUShader *shader, int location, int value);
void GPU_shader_geometry_stage_primitive_io(GPUShader *shader, int input, int output, int number);
@@ -107,11 +101,6 @@ int GPU_shader_get_attribute(GPUShader *shader, const char *name);
/* Builtin/Non-generated shaders */
typedef enum GPUBuiltinShader {
- /* UNUSED (TODO REMOVE) */
- GPU_SHADER_SMOKE,
- GPU_SHADER_SMOKE_FIRE,
- GPU_SHADER_SMOKE_COBA,
-
/* specialized drawing */
GPU_SHADER_TEXT,
GPU_SHADER_TEXT_SIMPLE,
@@ -202,7 +191,7 @@ typedef enum GPUBuiltinShader {
GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR,
GPU_SHADER_2D_IMAGE_MASK_UNIFORM_COLOR,
/**
- * Draw texture with alpha. Take a 3D positon and a 2D texture coordinate for each vertex.
+ * Draw texture with alpha. Take a 3D position and a 2D texture coordinate for each vertex.
*
* \param alpha: uniform float
* \param image: uniform sampler2D
@@ -212,7 +201,7 @@ typedef enum GPUBuiltinShader {
GPU_SHADER_3D_IMAGE_MODULATE_ALPHA,
/**
* Draw linearized depth texture relate to near and far distances.
- * Take a 3D positon and a 2D texture coordinate for each vertex.
+ * Take a 3D position and a 2D texture coordinate for each vertex.
*
* \param znear: uniform float
* \param zfar: uniform float
@@ -357,14 +346,21 @@ typedef enum GPUBuiltinShader {
GPU_SHADER_2D_WIDGET_SHADOW,
GPU_SHADER_2D_NODELINK,
GPU_SHADER_2D_NODELINK_INST,
+ /* specialized for edituv drawing */
+ GPU_SHADER_2D_UV_VERTS,
+ GPU_SHADER_2D_UV_FACEDOTS,
+ GPU_SHADER_2D_UV_EDGES,
+ GPU_SHADER_2D_UV_EDGES_SMOOTH,
+ GPU_SHADER_2D_UV_FACES,
+ GPU_SHADER_2D_UV_FACES_STRETCH,
GPU_NUM_BUILTIN_SHADERS /* (not an actual shader) */
} GPUBuiltinShader;
-/* Keep these in sync with:
- * gpu_shader_image_interlace_frag.glsl
- * gpu_shader_image_rect_interlace_frag.glsl
- **/
+/** Keep these in sync with:
+ * - `gpu_shader_image_interlace_frag.glsl`
+ * - `gpu_shader_image_rect_interlace_frag.glsl`
+ */
typedef enum GPUInterlaceShader {
GPU_SHADER_INTERLACE_ROW = 0,
GPU_SHADER_INTERLACE_COLUMN = 1,
@@ -373,6 +369,11 @@ typedef enum GPUInterlaceShader {
GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader);
+void GPU_shader_get_builtin_shader_code(
+ GPUBuiltinShader shader,
+ const char **r_vert, const char **r_frag,
+ const char **r_geom, const char **r_defines);
+
void GPU_shader_free_builtin_shaders(void);
/* Vertex attributes for shaders */
diff --git a/source/blender/gpu/GPU_shader_interface.h b/source/blender/gpu/GPU_shader_interface.h
index 458a49a366b..af89e487cf8 100644
--- a/source/blender/gpu/GPU_shader_interface.h
+++ b/source/blender/gpu/GPU_shader_interface.h
@@ -58,6 +58,7 @@ typedef enum {
GPU_UNIFORM_COLOR, /* vec4 color */
GPU_UNIFORM_EYE, /* vec3 eye */
GPU_UNIFORM_CALLID, /* int callId */
+ GPU_UNIFORM_OBJECT_INFO, /* vec3 objectInfo */
GPU_UNIFORM_CUSTOM, /* custom uniform, not one of the above built-ins */
diff --git a/source/blender/gpu/GPU_state.h b/source/blender/gpu/GPU_state.h
index 16627fec42b..057caffd17d 100644
--- a/source/blender/gpu/GPU_state.h
+++ b/source/blender/gpu/GPU_state.h
@@ -47,6 +47,7 @@ void GPU_blend_set_func(GPUBlendFunction sfactor, GPUBlendFunction dfactor);
void GPU_blend_set_func_separate(
GPUBlendFunction src_rgb, GPUBlendFunction dst_rgb,
GPUBlendFunction src_alpha, GPUBlendFunction dst_alpha);
+void GPU_depth_range(float near, float far);
void GPU_depth_test(bool enable);
bool GPU_depth_test_enabled(void);
void GPU_line_smooth(bool enable);
@@ -60,4 +61,7 @@ void GPU_scissor_get_i(int coords[4]);
void GPU_viewport_size_get_f(float coords[4]);
void GPU_viewport_size_get_i(int coords[4]);
+void GPU_flush(void);
+void GPU_finish(void);
+
#endif /* __GPU_STATE_H__ */
diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h
index 23b88645e33..a74388d6340 100644
--- a/source/blender/gpu/GPU_texture.h
+++ b/source/blender/gpu/GPU_texture.h
@@ -100,9 +100,9 @@ typedef enum GPUTextureFormat {
#if 0
GPU_RGB10_A2,
GPU_RGB10_A2UI,
- GPU_DEPTH32F_STENCIL8,
#endif
GPU_R11F_G11F_B10F,
+ GPU_DEPTH32F_STENCIL8,
GPU_DEPTH24_STENCIL8,
/* Texture only format */
diff --git a/source/blender/gpu/GPU_vertex_format.h b/source/blender/gpu/GPU_vertex_format.h
index 7e0038e3473..113a3e894d0 100644
--- a/source/blender/gpu/GPU_vertex_format.h
+++ b/source/blender/gpu/GPU_vertex_format.h
@@ -80,13 +80,17 @@ typedef struct GPUVertFormat {
GPUVertAttr attribs[GPU_VERT_ATTR_MAX_LEN]; /* TODO: variable-size attribs array */
} GPUVertFormat;
+struct GPUShaderInterface;
+
void GPU_vertformat_clear(GPUVertFormat *);
void GPU_vertformat_copy(GPUVertFormat *dest, const GPUVertFormat *src);
+void GPU_vertformat_from_interface(GPUVertFormat *format, const struct GPUShaderInterface *shaderface);
uint GPU_vertformat_attr_add(
GPUVertFormat *, const char *name,
GPUVertCompType, uint comp_len, GPUVertFetchMode);
void GPU_vertformat_alias_add(GPUVertFormat *, const char *alias);
+int GPU_vertformat_attr_id_get(const GPUVertFormat *, const char *name);
/* format conversion */
diff --git a/source/blender/gpu/GPU_viewport.h b/source/blender/gpu/GPU_viewport.h
index 921cd0e7369..45712050b73 100644
--- a/source/blender/gpu/GPU_viewport.h
+++ b/source/blender/gpu/GPU_viewport.h
@@ -43,7 +43,7 @@
typedef struct GPUViewport GPUViewport;
-/* Contains memory pools informations */
+/* Contains memory pools information */
typedef struct ViewportMemoryPool {
struct BLI_mempool *calls;
struct BLI_mempool *states;
diff --git a/source/blender/gpu/intern/gpu_attr_binding_private.h b/source/blender/gpu/intern/gpu_attr_binding_private.h
index cb338b10aa4..c545983637c 100644
--- a/source/blender/gpu/intern/gpu_attr_binding_private.h
+++ b/source/blender/gpu/intern/gpu_attr_binding_private.h
@@ -39,7 +39,7 @@ void AttribBinding_clear(GPUAttrBinding *binding);
void get_attrib_locations(
const GPUVertFormat *format, GPUAttrBinding *binding, const GPUShaderInterface *shaderface);
-unsigned read_attrib_location(
- const GPUAttrBinding *binding, unsigned a_idx);
+uint read_attrib_location(
+ const GPUAttrBinding *binding, uint a_idx);
#endif /* __GPU_ATTR_BINDING_PRIVATE_H__ */
diff --git a/source/blender/gpu/intern/gpu_batch.c b/source/blender/gpu/intern/gpu_batch.c
index 87ea112148c..2cbeeb26924 100644
--- a/source/blender/gpu/intern/gpu_batch.c
+++ b/source/blender/gpu/intern/gpu_batch.c
@@ -528,6 +528,18 @@ static void primitive_restart_disable(void)
glDisable(GL_PRIMITIVE_RESTART);
}
+static void *elem_offset(const GPUIndexBuf *el, int v_first)
+{
+#if GPU_TRACK_INDEX_RANGE
+ if (el->index_type == GPU_INDEX_U8)
+ return (GLubyte *)0 + v_first;
+ else if (el->index_type == GPU_INDEX_U16)
+ return (GLushort *)0 + v_first;
+ else
+#endif
+ return (GLuint *)0 + v_first;
+}
+
void GPU_batch_draw(GPUBatch *batch)
{
#if TRUST_NO_ONE
@@ -547,10 +559,11 @@ void GPU_batch_draw_range_ex(GPUBatch *batch, int v_first, int v_count, bool for
#if TRUST_NO_ONE
assert(!(force_instance && (batch->inst == NULL)) || v_count > 0); // we cannot infer length if force_instance
#endif
+
const bool do_instance = (force_instance || batch->inst);
// If using offset drawing, use the default VAO and redo bindings.
- if (v_first != 0 && (do_instance || batch->elem)) {
+ if (v_first != 0 && do_instance) {
glBindVertexArray(GPU_vao_default());
batch_update_program_bindings(batch, v_first);
}
@@ -601,6 +614,8 @@ void GPU_batch_draw_range_ex(GPUBatch *batch, int v_first, int v_count, bool for
primitive_restart_enable(el);
}
+ void *v_first_ofs = elem_offset(el, v_first);
+
#if GPU_TRACK_INDEX_RANGE
if (el->base_index) {
glDrawRangeElementsBaseVertex(
@@ -609,14 +624,14 @@ void GPU_batch_draw_range_ex(GPUBatch *batch, int v_first, int v_count, bool for
el->max_index,
v_count,
el->gl_index_type,
- 0,
+ v_first_ofs,
el->base_index);
}
else {
- glDrawRangeElements(batch->gl_prim_type, el->min_index, el->max_index, v_count, el->gl_index_type, 0);
+ glDrawRangeElements(batch->gl_prim_type, el->min_index, el->max_index, v_count, el->gl_index_type, v_first_ofs);
}
#else
- glDrawElements(batch->gl_prim_type, v_count, GL_UNSIGNED_INT, 0);
+ glDrawElements(batch->gl_prim_type, v_count, GL_UNSIGNED_INT, v_first_ofs);
#endif
if (el->use_prim_restart) {
primitive_restart_disable();
diff --git a/source/blender/gpu/intern/gpu_batch_presets.c b/source/blender/gpu/intern/gpu_batch_presets.c
index 83287c57441..562971c760d 100644
--- a/source/blender/gpu/intern/gpu_batch_presets.c
+++ b/source/blender/gpu/intern/gpu_batch_presets.c
@@ -57,6 +57,8 @@ static struct {
struct {
uint pos, nor;
} attr_id;
+
+ ThreadMutex mutex;
} g_presets_3d = {{0}};
static ListBase presets_list = {NULL, NULL};
@@ -214,22 +216,42 @@ void gpu_batch_presets_init(void)
g_presets_3d.batch.sphere_wire_med = batch_sphere_wire(8, 16);
gpu_batch_presets_register(g_presets_3d.batch.sphere_wire_med);
+
+ BLI_mutex_init(&g_presets_3d.mutex);
}
void gpu_batch_presets_register(GPUBatch *preset_batch)
{
+ BLI_mutex_lock(&g_presets_3d.mutex);
BLI_addtail(&presets_list, BLI_genericNodeN(preset_batch));
+ BLI_mutex_unlock(&g_presets_3d.mutex);
+}
+
+bool gpu_batch_presets_unregister(GPUBatch *preset_batch)
+{
+ BLI_mutex_lock(&g_presets_3d.mutex);
+ for (LinkData *link = presets_list.last; link; link = link->prev) {
+ if (preset_batch == link->data) {
+ BLI_remlink(&presets_list, link);
+ BLI_mutex_unlock(&g_presets_3d.mutex);
+ MEM_freeN(link);
+ return true;
+ }
+ }
+ BLI_mutex_unlock(&g_presets_3d.mutex);
+ return false;
}
void gpu_batch_presets_reset(void)
{
+ BLI_mutex_lock(&g_presets_3d.mutex);
/* Reset vao caches for these every time we switch opengl context.
* This way they will draw correctly for each window. */
- LinkData *link = presets_list.first;
- for (link = presets_list.first; link; link = link->next) {
+ for (LinkData *link = presets_list.first; link; link = link->next) {
GPUBatch *preset = link->data;
GPU_batch_vao_cache_clear(preset);
}
+ BLI_mutex_unlock(&g_presets_3d.mutex);
}
void gpu_batch_presets_exit(void)
@@ -240,4 +262,6 @@ void gpu_batch_presets_exit(void)
GPU_batch_discard(preset);
MEM_freeN(link);
}
+
+ BLI_mutex_end(&g_presets_3d.mutex);
}
diff --git a/source/blender/gpu/intern/gpu_batch_utils.c b/source/blender/gpu/intern/gpu_batch_utils.c
index 0a7f1ca901d..13e615e120b 100644
--- a/source/blender/gpu/intern/gpu_batch_utils.c
+++ b/source/blender/gpu/intern/gpu_batch_utils.c
@@ -202,6 +202,7 @@ GPUBatch *GPU_batch_wire_from_poly_2d_encoded(
i++;
}
}
+ *lines_step++ = lines[lines_len - 1];
lines_len = lines_step - lines;
}
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index cea2de77848..38edcbe7f71 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -58,15 +58,6 @@
#include "bmesh.h"
-static ThreadMutex buffer_mutex = BLI_MUTEX_INITIALIZER;
-
-/* multires global buffer, can be used for many grids having the same grid size */
-typedef struct GridCommonGPUBuffer {
- GPUIndexBuf *mres_buffer;
- int mres_prev_gridsize;
- unsigned mres_prev_totquad;
-} GridCommonGPUBuffer;
-
/* XXX: the rest of the code in this file is used for optimized PBVH
* drawing and doesn't interact at all with the buffer code above */
@@ -98,7 +89,7 @@ struct GPU_PBVH_Buffers {
bool use_bmesh;
- unsigned int tot_tri, tot_quad;
+ uint tot_tri, tot_quad;
/* The PBVH ensures that either all faces in the node are
* smooth-shaded or all faces are flat-shaded */
@@ -113,7 +104,7 @@ static struct {
/* Allocates a non-initialized buffer to be sent to GPU.
* Return is false it indicates that the memory map failed. */
-static bool gpu_pbvh_vert_buf_data_set(GPU_PBVH_Buffers *buffers, unsigned int vert_len)
+static bool gpu_pbvh_vert_buf_data_set(GPU_PBVH_Buffers *buffers, uint vert_len)
{
if (buffers->vert_buf == NULL) {
/* Initialize vertex buffer */
@@ -140,7 +131,7 @@ static bool gpu_pbvh_vert_buf_data_set(GPU_PBVH_Buffers *buffers, unsigned int v
return buffers->vert_buf->data != NULL;
}
-static void gpu_pbvh_batch_init(GPU_PBVH_Buffers *buffers)
+static void gpu_pbvh_batch_init(GPU_PBVH_Buffers *buffers, GPUPrimType prim)
{
/* force flushing to the GPU */
if (buffers->vert_buf->data) {
@@ -149,15 +140,14 @@ static void gpu_pbvh_batch_init(GPU_PBVH_Buffers *buffers)
if (buffers->triangles == NULL) {
buffers->triangles = GPU_batch_create(
- GPU_PRIM_TRIS, buffers->vert_buf,
+ prim, buffers->vert_buf,
/* can be NULL */
buffers->index_buf);
}
if ((buffers->triangles_fast == NULL) && buffers->index_buf_fast) {
buffers->triangles_fast = GPU_batch_create(
- GPU_PRIM_TRIS, buffers->vert_buf,
- /* can be NULL */
+ prim, buffers->vert_buf,
buffers->index_buf_fast);
}
}
@@ -201,13 +191,13 @@ void GPU_pbvh_mesh_buffers_update(
}
else {
/* calculate normal for each polygon only once */
- unsigned int mpoly_prev = UINT_MAX;
+ uint mpoly_prev = UINT_MAX;
short no[3];
int vbo_index = 0;
for (uint i = 0; i < buffers->face_indices_len; i++) {
const MLoopTri *lt = &buffers->looptri[buffers->face_indices[i]];
- const unsigned int vtri[3] = {
+ const uint vtri[3] = {
buffers->mloop[lt->tri[0]].v,
buffers->mloop[lt->tri[1]].v,
buffers->mloop[lt->tri[2]].v,
@@ -244,7 +234,7 @@ void GPU_pbvh_mesh_buffers_update(
}
}
- gpu_pbvh_batch_init(buffers);
+ gpu_pbvh_batch_init(buffers, GPU_PRIM_TRIS);
}
}
@@ -333,6 +323,67 @@ GPU_PBVH_Buffers *GPU_pbvh_mesh_buffers_build(
return buffers;
}
+static void gpu_pbvh_grid_fill_fast_buffer(GPU_PBVH_Buffers *buffers, int totgrid, int gridsize)
+{
+ GPUIndexBufBuilder elb;
+ if (buffers->smooth) {
+ GPU_indexbuf_init(&elb, GPU_PRIM_TRIS, 6 * totgrid, INT_MAX);
+ for (int i = 0; i < totgrid; i++) {
+ GPU_indexbuf_add_generic_vert(&elb, i * gridsize * gridsize + gridsize - 1);
+ GPU_indexbuf_add_generic_vert(&elb, i * gridsize * gridsize);
+ GPU_indexbuf_add_generic_vert(&elb, (i + 1) * gridsize * gridsize - gridsize);
+ GPU_indexbuf_add_generic_vert(&elb, (i + 1) * gridsize * gridsize - 1);
+ GPU_indexbuf_add_generic_vert(&elb, i * gridsize * gridsize + gridsize - 1);
+ GPU_indexbuf_add_generic_vert(&elb, (i + 1) * gridsize * gridsize - gridsize);
+ }
+ }
+ else {
+ GPU_indexbuf_init_ex(&elb, GPU_PRIM_TRI_STRIP, 5 * totgrid, INT_MAX, true);
+ uint vbo_index_offset = 0;
+ for (int i = 0; i < totgrid; i++) {
+ uint grid_indices[4];
+ for (int j = 0; j < gridsize - 1; j++) {
+ for (int k = 0; k < gridsize - 1; k++) {
+ const bool is_row_start = (k == 0);
+ const bool is_row_end = (k == gridsize - 2);
+ const bool is_grid_start = (j == 0);
+ const bool is_grid_end = (j == gridsize - 2);
+ const bool is_first_grid = (i == 0);
+ const bool is_last_grid = (i == totgrid - 1);
+
+ if (is_row_start && !(is_grid_start && is_first_grid)) {
+ vbo_index_offset += 1;
+ }
+
+ if (is_grid_start && is_row_start) {
+ grid_indices[0] = vbo_index_offset + 0;
+ }
+ else if (is_grid_start && is_row_end) {
+ grid_indices[1] = vbo_index_offset + 2;
+ }
+ else if (is_grid_end && is_row_start) {
+ grid_indices[2] = vbo_index_offset + 1;
+ }
+ else if (is_grid_end && is_row_end) {
+ grid_indices[3] = vbo_index_offset + 3;
+ }
+ vbo_index_offset += 4;
+
+ if (is_row_end && !(is_grid_end && is_last_grid)) {
+ vbo_index_offset += 1;
+ }
+ }
+ }
+ GPU_indexbuf_add_generic_vert(&elb, grid_indices[1]);
+ GPU_indexbuf_add_generic_vert(&elb, grid_indices[0]);
+ GPU_indexbuf_add_generic_vert(&elb, grid_indices[3]);
+ GPU_indexbuf_add_generic_vert(&elb, grid_indices[2]);
+ GPU_indexbuf_add_primitive_restart(&elb);
+ }
+ }
+ buffers->index_buf_fast = GPU_indexbuf_build(&elb);
+}
+
void GPU_pbvh_grid_buffers_update(
GPU_PBVH_Buffers *buffers, CCGElem **grids,
const DMFlagMat *grid_flag_mats, int *grid_indices,
@@ -346,75 +397,134 @@ void GPU_pbvh_grid_buffers_update(
buffers->smooth = grid_flag_mats[grid_indices[0]].flag & ME_SMOOTH;
/* Build VBO */
- if (buffers->index_buf) {
- const int has_mask = key->has_mask;
+ const int has_mask = key->has_mask;
- uint vbo_index_offset = 0;
- /* Build VBO */
- if (gpu_pbvh_vert_buf_data_set(buffers, totgrid * key->grid_area)) {
- for (i = 0; i < totgrid; ++i) {
- CCGElem *grid = grids[grid_indices[i]];
- int vbo_index = vbo_index_offset;
+ uint vert_count = totgrid * key->grid_area;
+
+ if (!buffers->smooth) {
+ vert_count = totgrid * (key->grid_size - 1) * (key->grid_size - 1) * 4;
+ /* Count strip restart verts (2 verts between each row and grid) */
+ vert_count += ((totgrid - 1) + totgrid * (key->grid_size - 2)) * 2;
+ }
+
+ if (buffers->smooth && buffers->index_buf == NULL) {
+ /* Not sure if really needed. */
+ GPU_BATCH_DISCARD_SAFE(buffers->triangles_fast);
+ GPU_INDEXBUF_DISCARD_SAFE(buffers->index_buf_fast);
+ }
+ else if (!buffers->smooth && buffers->index_buf != NULL) {
+ /* Discard unnecessary index buffers. */
+ GPU_BATCH_DISCARD_SAFE(buffers->triangles);
+ GPU_BATCH_DISCARD_SAFE(buffers->triangles_fast);
+ GPU_INDEXBUF_DISCARD_SAFE(buffers->index_buf);
+ GPU_INDEXBUF_DISCARD_SAFE(buffers->index_buf_fast);
+ }
+
+ if (buffers->index_buf_fast == NULL) {
+ gpu_pbvh_grid_fill_fast_buffer(buffers, totgrid, key->grid_size);
+ }
+
+ uint vbo_index_offset = 0;
+ /* Build VBO */
+ if (gpu_pbvh_vert_buf_data_set(buffers, vert_count)) {
+ for (i = 0; i < totgrid; ++i) {
+ CCGElem *grid = grids[grid_indices[i]];
+ int vbo_index = vbo_index_offset;
+ if (buffers->smooth) {
for (y = 0; y < key->grid_size; y++) {
for (x = 0; x < key->grid_size; x++) {
CCGElem *elem = CCG_grid_elem(key, grid, x, y);
GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.pos, vbo_index, CCG_elem_co(key, elem));
- if (buffers->smooth) {
- short no_short[3];
- normal_float_to_short_v3(no_short, CCG_elem_no(key, elem));
- GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.nor, vbo_index, no_short);
+ short no_short[3];
+ normal_float_to_short_v3(no_short, CCG_elem_no(key, elem));
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.nor, vbo_index, no_short);
- if (has_mask && show_mask) {
- float fmask = *CCG_elem_mask(key, elem);
- GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.msk, vbo_index, &fmask);
- empty_mask = empty_mask && (fmask == 0.0f);
- }
+ if (has_mask && show_mask) {
+ float fmask = *CCG_elem_mask(key, elem);
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.msk, vbo_index, &fmask);
+ empty_mask = empty_mask && (fmask == 0.0f);
}
vbo_index += 1;
}
}
+ vbo_index_offset += key->grid_area;
+ }
+ else {
+ for (j = 0; j < key->grid_size - 1; j++) {
+ for (k = 0; k < key->grid_size - 1; k++) {
+ const bool is_row_start = (k == 0);
+ const bool is_row_end = (k == key->grid_size - 2);
+ const bool is_grid_start = (j == 0);
+ const bool is_grid_end = (j == key->grid_size - 2);
+ const bool is_first_grid = (i == 0);
+ const bool is_last_grid = (i == totgrid - 1);
+
+ CCGElem *elems[4] = {
+ CCG_grid_elem(key, grid, k, j + 1),
+ CCG_grid_elem(key, grid, k + 1, j + 1),
+ CCG_grid_elem(key, grid, k + 1, j),
+ CCG_grid_elem(key, grid, k, j)
+ };
+ float *co[4] = {
+ CCG_elem_co(key, elems[0]),
+ CCG_elem_co(key, elems[1]),
+ CCG_elem_co(key, elems[2]),
+ CCG_elem_co(key, elems[3])
+ };
+
+ float fno[3];
+ short no_short[3];
+ normal_quad_v3(fno, co[0], co[1], co[2], co[3]);
+ normal_float_to_short_v3(no_short, fno);
+
+ if (is_row_start && !(is_grid_start && is_first_grid)) {
+ /* Duplicate first vert
+ * (only pos is needed since the triangle will be degenerate) */
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.pos, vbo_index, co[3]);
+ vbo_index += 1;
+ vbo_index_offset += 1;
+ }
+
+ /* Note indices orders (3, 0, 2, 1); we are drawing a triangle strip. */
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.pos, vbo_index, co[3]);
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.nor, vbo_index, no_short);
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.pos, vbo_index + 1, co[0]);
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.nor, vbo_index + 1, no_short);
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.pos, vbo_index + 2, co[2]);
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.nor, vbo_index + 2, no_short);
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.pos, vbo_index + 3, co[1]);
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.nor, vbo_index + 3, no_short);
+
+ if (has_mask && show_mask) {
+ float fmask = (*CCG_elem_mask(key, elems[0]) +
+ *CCG_elem_mask(key, elems[1]) +
+ *CCG_elem_mask(key, elems[2]) +
+ *CCG_elem_mask(key, elems[3])) * 0.25f;
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.msk, vbo_index, &fmask);
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.msk, vbo_index + 1, &fmask);
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.msk, vbo_index + 2, &fmask);
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.msk, vbo_index + 3, &fmask);
+ empty_mask = empty_mask && (fmask == 0.0f);
+ }
- if (!buffers->smooth) {
- for (j = 0; j < key->grid_size - 1; j++) {
- for (k = 0; k < key->grid_size - 1; k++) {
- CCGElem *elems[4] = {
- CCG_grid_elem(key, grid, k, j + 1),
- CCG_grid_elem(key, grid, k + 1, j + 1),
- CCG_grid_elem(key, grid, k + 1, j),
- CCG_grid_elem(key, grid, k, j)
- };
- float fno[3];
-
- normal_quad_v3(fno,
- CCG_elem_co(key, elems[0]),
- CCG_elem_co(key, elems[1]),
- CCG_elem_co(key, elems[2]),
- CCG_elem_co(key, elems[3]));
-
- vbo_index = vbo_index_offset + ((j + 1) * key->grid_size + k);
- short no_short[3];
- normal_float_to_short_v3(no_short, fno);
- GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.nor, vbo_index, no_short);
-
- if (has_mask && show_mask) {
- float fmask = (*CCG_elem_mask(key, elems[0]) +
- *CCG_elem_mask(key, elems[1]) +
- *CCG_elem_mask(key, elems[2]) +
- *CCG_elem_mask(key, elems[3])) * 0.25f;
- GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.msk, vbo_index, &fmask);
- empty_mask = empty_mask && (fmask == 0.0f);
- }
+ if (is_row_end && !(is_grid_end && is_last_grid)) {
+ /* Duplicate last vert
+ * (only pos is needed since the triangle will be degenerate) */
+ GPU_vertbuf_attr_set(buffers->vert_buf, g_vbo_id.pos, vbo_index + 4, co[1]);
+ vbo_index += 1;
+ vbo_index_offset += 1;
}
+
+ vbo_index += 4;
}
}
-
- vbo_index_offset += key->grid_area;
+ vbo_index_offset += (key->grid_size - 1) * (key->grid_size - 1) * 4;
}
-
- gpu_pbvh_batch_init(buffers);
}
+
+ gpu_pbvh_batch_init(buffers, buffers->smooth ? GPU_PRIM_TRIS : GPU_PRIM_TRI_STRIP);
}
buffers->grids = grids;
@@ -428,7 +538,7 @@ void GPU_pbvh_grid_buffers_update(
}
/* Build the element array buffer of grid indices using either
- * unsigned shorts or unsigned ints. */
+ * ushorts or uints. */
#define FILL_QUAD_BUFFER(max_vert_, tot_quad_, buffer_) \
{ \
int offset = 0; \
@@ -469,64 +579,26 @@ void GPU_pbvh_grid_buffers_update(
/* end FILL_QUAD_BUFFER */
static GPUIndexBuf *gpu_get_grid_buffer(
- int gridsize, unsigned *totquad, GridCommonGPUBuffer **grid_common_gpu_buffer,
+ int gridsize, uint *totquad,
/* remove this arg when GPU gets base-vertex support! */
int totgrid)
{
/* used in the FILL_QUAD_BUFFER macro */
BLI_bitmap * const *grid_hidden = NULL;
const int *grid_indices = NULL;
- // int totgrid = 1;
-
- GridCommonGPUBuffer *gridbuff = *grid_common_gpu_buffer;
-
- if (gridbuff == NULL) {
- *grid_common_gpu_buffer = gridbuff = MEM_mallocN(sizeof(GridCommonGPUBuffer), __func__);
- gridbuff->mres_buffer = NULL;
- gridbuff->mres_prev_gridsize = -1;
- gridbuff->mres_prev_totquad = 0;
- }
-
- /* VBO is already built */
- if (gridbuff->mres_buffer && gridbuff->mres_prev_gridsize == gridsize) {
- *totquad = gridbuff->mres_prev_totquad;
- return gridbuff->mres_buffer;
- }
- /* we can't reuse old, delete the existing buffer */
- else if (gridbuff->mres_buffer) {
- GPU_indexbuf_discard(gridbuff->mres_buffer);
- gridbuff->mres_buffer = NULL;
- }
/* Build new VBO */
*totquad = (gridsize - 1) * (gridsize - 1) * totgrid;
int max_vert = gridsize * gridsize * totgrid;
- FILL_QUAD_BUFFER(max_vert, *totquad, gridbuff->mres_buffer);
+ GPUIndexBuf *mres_buffer;
+ FILL_QUAD_BUFFER(max_vert, *totquad, mres_buffer);
- gridbuff->mres_prev_gridsize = gridsize;
- gridbuff->mres_prev_totquad = *totquad;
- return gridbuff->mres_buffer;
+ return mres_buffer;
}
-#define FILL_FAST_BUFFER() \
-{ \
- GPUIndexBufBuilder elb; \
- GPU_indexbuf_init(&elb, GPU_PRIM_TRIS, 6 * totgrid, INT_MAX); \
- for (int i = 0; i < totgrid; i++) { \
- GPU_indexbuf_add_generic_vert(&elb, i * gridsize * gridsize + gridsize - 1); \
- GPU_indexbuf_add_generic_vert(&elb, i * gridsize * gridsize); \
- GPU_indexbuf_add_generic_vert(&elb, (i + 1) * gridsize * gridsize - gridsize); \
- GPU_indexbuf_add_generic_vert(&elb, (i + 1) * gridsize * gridsize - 1); \
- GPU_indexbuf_add_generic_vert(&elb, i * gridsize * gridsize + gridsize - 1); \
- GPU_indexbuf_add_generic_vert(&elb, (i + 1) * gridsize * gridsize - gridsize); \
- } \
- buffers->index_buf_fast = GPU_indexbuf_build(&elb); \
-} (void)0
-
GPU_PBVH_Buffers *GPU_pbvh_grid_buffers_build(
- int *grid_indices, int totgrid, BLI_bitmap **grid_hidden, int gridsize, const CCGKey *UNUSED(key),
- GridCommonGPUBuffer **grid_common_gpu_buffer)
+ int *grid_indices, int totgrid, BLI_bitmap **grid_hidden, int gridsize, const CCGKey *UNUSED(key))
{
GPU_PBVH_Buffers *buffers;
int totquad;
@@ -545,14 +617,12 @@ GPU_PBVH_Buffers *GPU_pbvh_grid_buffers_build(
if (totquad == 0)
return buffers;
- /* create and fill indices of the fast buffer too */
- FILL_FAST_BUFFER();
-
+ /* TODO(fclem) this needs a bit of cleanup. It's only needed for smooth grids.
+ * Could be moved to the update function somehow. */
if (totquad == fully_visible_totquad) {
- buffers->index_buf = gpu_get_grid_buffer(
- gridsize, &buffers->tot_quad, grid_common_gpu_buffer, totgrid);
+ buffers->index_buf = gpu_get_grid_buffer(gridsize, &buffers->tot_quad, totgrid);
buffers->has_hidden = false;
- buffers->is_index_buf_global = true;
+ buffers->is_index_buf_global = false;
}
else {
uint max_vert = totgrid * gridsize * gridsize;
@@ -564,20 +634,6 @@ GPU_PBVH_Buffers *GPU_pbvh_grid_buffers_build(
buffers->is_index_buf_global = false;
}
-#ifdef USE_BASE_ELEM
- /* Build coord/normal VBO */
- if (GLEW_ARB_draw_elements_base_vertex /* 3.2 */) {
- int i;
- buffers->baseelemarray = MEM_mallocN(sizeof(int) * totgrid * 2, "GPU_PBVH_Buffers.baseelemarray");
- buffers->baseindex = MEM_mallocN(sizeof(void *) * totgrid, "GPU_PBVH_Buffers.baseindex");
- for (i = 0; i < totgrid; i++) {
- buffers->baseelemarray[i] = buffers->tot_quad * 6;
- buffers->baseelemarray[i + totgrid] = i * key->grid_area;
- buffers->baseindex[i] = NULL;
- }
- }
-#endif
-
return buffers;
}
@@ -815,7 +871,7 @@ void GPU_pbvh_bmesh_buffers_update(
buffers->show_mask = !empty_mask;
- gpu_pbvh_batch_init(buffers);
+ gpu_pbvh_batch_init(buffers, GPU_PRIM_TRIS);
}
GPU_PBVH_Buffers *GPU_pbvh_bmesh_buffers_build(bool smooth_shading)
@@ -852,34 +908,12 @@ void GPU_pbvh_buffers_free(GPU_PBVH_Buffers *buffers)
GPU_INDEXBUF_DISCARD_SAFE(buffers->index_buf_fast);
GPU_VERTBUF_DISCARD_SAFE(buffers->vert_buf);
-#ifdef USE_BASE_ELEM
- if (buffers->baseelemarray)
- MEM_freeN(buffers->baseelemarray);
- if (buffers->baseindex)
- MEM_freeN(buffers->baseindex);
-#endif
-
MEM_freeN(buffers);
}
}
-void GPU_pbvh_multires_buffers_free(GridCommonGPUBuffer **grid_common_gpu_buffer)
-{
- GridCommonGPUBuffer *gridbuff = *grid_common_gpu_buffer;
-
- if (gridbuff) {
- if (gridbuff->mres_buffer) {
- BLI_mutex_lock(&buffer_mutex);
- GPU_INDEXBUF_DISCARD_SAFE(gridbuff->mres_buffer);
- BLI_mutex_unlock(&buffer_mutex);
- }
- MEM_freeN(gridbuff);
- *grid_common_gpu_buffer = NULL;
- }
-}
-
/* debug function, draws the pbvh BB */
-void GPU_pbvh_BB_draw(float min[3], float max[3], bool leaf, unsigned int pos)
+void GPU_pbvh_BB_draw(float min[3], float max[3], bool leaf, uint pos)
{
if (leaf)
immUniformColor4f(0.0, 1.0, 0.0, 0.5);
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index 678c3019dc7..952886bafed 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -82,15 +82,15 @@ static uint32_t gpu_pass_hash(const char *frag_gen, const char *defs, GPUVertexA
{
BLI_HashMurmur2A hm2a;
BLI_hash_mm2a_init(&hm2a, 0);
- BLI_hash_mm2a_add(&hm2a, (unsigned char *)frag_gen, strlen(frag_gen));
+ BLI_hash_mm2a_add(&hm2a, (uchar *)frag_gen, strlen(frag_gen));
if (attribs) {
for (int att_idx = 0; att_idx < attribs->totlayer; att_idx++) {
char *name = attribs->layer[att_idx].name;
- BLI_hash_mm2a_add(&hm2a, (unsigned char *)name, strlen(name));
+ BLI_hash_mm2a_add(&hm2a, (uchar *)name, strlen(name));
}
}
if (defs)
- BLI_hash_mm2a_add(&hm2a, (unsigned char *)defs, strlen(defs));
+ BLI_hash_mm2a_add(&hm2a, (uchar *)defs, strlen(defs));
return BLI_hash_mm2a_end(&hm2a);
}
@@ -185,7 +185,7 @@ static char *gpu_str_skip_token(char *str, char *token, int max)
/* skip a variable/function name */
while (*str) {
- if (ELEM(*str, ' ', '(', ')', ',', '\t', '\n', '\r'))
+ if (ELEM(*str, ' ', '(', ')', ',', ';', '\t', '\n', '\r'))
break;
else {
if (token && len < max - 1) {
@@ -203,7 +203,7 @@ static char *gpu_str_skip_token(char *str, char *token, int max)
/* skip the next special characters:
* note the missing ')' */
while (*str) {
- if (ELEM(*str, ' ', '(', ',', '\t', '\n', '\r'))
+ if (ELEM(*str, ' ', '(', ',', ';', '\t', '\n', '\r'))
str++;
else
break;
@@ -507,6 +507,8 @@ const char *GPU_builtin_name(GPUBuiltin builtin)
return "unftemperature";
else if (builtin == GPU_BARYCENTRIC_TEXCO)
return "unfbarycentrictex";
+ else if (builtin == GPU_BARYCENTRIC_DIST)
+ return "unfbarycentricdist";
else
return "";
}
@@ -516,14 +518,14 @@ static void codegen_set_texid(GHash *bindhash, GPUInput *input, int *texid, void
{
if (BLI_ghash_haskey(bindhash, key)) {
/* Reuse existing texid */
- input->texid = GET_INT_FROM_POINTER(BLI_ghash_lookup(bindhash, key));
+ input->texid = POINTER_AS_INT(BLI_ghash_lookup(bindhash, key));
}
else {
/* Allocate new texid */
input->texid = *texid;
(*texid)++;
input->bindtex = true;
- BLI_ghash_insert(bindhash, key, SET_INT_IN_POINTER(input->texid));
+ BLI_ghash_insert(bindhash, key, POINTER_FROM_INT(input->texid));
}
}
@@ -612,8 +614,7 @@ static int codegen_process_uniforms_functions(GPUMaterial *material, DynStr *ds,
}
else {
BLI_dynstr_appendf(
- ds, "%s %s %s;\n",
- GLEW_VERSION_3_0 ? "in" : "varying",
+ ds, "in %s %s;\n",
GPU_DATATYPE_STR[input->type], name);
}
}
@@ -636,21 +637,9 @@ static int codegen_process_uniforms_functions(GPUMaterial *material, DynStr *ds,
BLI_dynstr_append(ds, ";\n");
}
else if (input->source == GPU_SOURCE_ATTRIB && input->attribfirst) {
-#ifdef WITH_OPENSUBDIV
- bool skip_opensubdiv = input->attribtype == CD_TANGENT;
- if (skip_opensubdiv) {
- BLI_dynstr_appendf(ds, "#ifndef USE_OPENSUBDIV\n");
- }
-#endif
BLI_dynstr_appendf(
- ds, "%s %s var%d;\n",
- GLEW_VERSION_3_0 ? "in" : "varying",
+ ds, "in %s var%d;\n",
GPU_DATATYPE_STR[input->type], input->attribid);
-#ifdef WITH_OPENSUBDIV
- if (skip_opensubdiv) {
- BLI_dynstr_appendf(ds, "#endif\n");
- }
-#endif
}
}
}
@@ -726,6 +715,12 @@ static void codegen_call_functions(DynStr *ds, ListBase *nodes, GPUOutput *final
BLI_dynstr_append(ds, "viewmat");
else if (input->builtin == GPU_CAMERA_TEXCO_FACTORS)
BLI_dynstr_append(ds, "camtexfac");
+ else if (input->builtin == GPU_LOC_TO_VIEW_MATRIX)
+ BLI_dynstr_append(ds, "localtoviewmat");
+ else if (input->builtin == GPU_INVERSE_LOC_TO_VIEW_MATRIX)
+ BLI_dynstr_append(ds, "invlocaltoviewmat");
+ else if (input->builtin == GPU_BARYCENTRIC_DIST)
+ BLI_dynstr_append(ds, "barycentricDist");
else if (input->builtin == GPU_BARYCENTRIC_TEXCO)
BLI_dynstr_append(ds, "barytexco");
else if (input->builtin == GPU_OBJECT_MATRIX)
@@ -768,28 +763,24 @@ static void codegen_call_functions(DynStr *ds, ListBase *nodes, GPUOutput *final
BLI_dynstr_append(ds, ";\n");
}
-static char *code_generate_fragment(GPUMaterial *material, ListBase *nodes, GPUOutput *output)
+static char *code_generate_fragment(GPUMaterial *material, ListBase *nodes, GPUOutput *output, int *rbuiltins)
{
DynStr *ds = BLI_dynstr_new();
char *code;
int builtins;
-#ifdef WITH_OPENSUBDIV
- GPUNode *node;
- GPUInput *input;
-#endif
-
-
#if 0
BLI_dynstr_append(ds, FUNCTION_PROTOTYPES);
#endif
codegen_set_unique_ids(nodes);
- builtins = codegen_process_uniforms_functions(material, ds, nodes);
-
+ *rbuiltins = builtins = codegen_process_uniforms_functions(material, ds, nodes);
if (builtins & GPU_BARYCENTRIC_TEXCO)
- BLI_dynstr_append(ds, "\tin vec2 barycentricTexCo;\n");
+ BLI_dynstr_append(ds, "in vec2 barycentricTexCo;\n");
+
+ if (builtins & GPU_BARYCENTRIC_DIST)
+ BLI_dynstr_append(ds, "flat in vec3 barycentricDist;\n");
BLI_dynstr_append(ds, "Closure nodetree_exec(void)\n{\n");
@@ -805,49 +796,23 @@ static char *code_generate_fragment(GPUMaterial *material, ListBase *nodes, GPUO
}
/* TODO(fclem) get rid of that. */
if (builtins & GPU_VIEW_MATRIX)
- BLI_dynstr_append(ds, "\tmat4 viewmat = ViewMatrix;\n");
+ BLI_dynstr_append(ds, "\t#define viewmat ViewMatrix\n");
if (builtins & GPU_CAMERA_TEXCO_FACTORS)
- BLI_dynstr_append(ds, "\tvec4 camtexfac = CameraTexCoFactors;\n");
+ BLI_dynstr_append(ds, "\t#define camtexfac CameraTexCoFactors\n");
if (builtins & GPU_OBJECT_MATRIX)
- BLI_dynstr_append(ds, "\tmat4 objmat = ModelMatrix;\n");
+ BLI_dynstr_append(ds, "\t#define objmat ModelMatrix\n");
if (builtins & GPU_INVERSE_OBJECT_MATRIX)
- BLI_dynstr_append(ds, "\tmat4 objinv = ModelMatrixInverse;\n");
+ BLI_dynstr_append(ds, "\t#define objinv ModelMatrixInverse\n");
if (builtins & GPU_INVERSE_VIEW_MATRIX)
- BLI_dynstr_append(ds, "\tmat4 viewinv = ViewMatrixInverse;\n");
+ BLI_dynstr_append(ds, "\t#define viewinv ViewMatrixInverse\n");
+ if (builtins & GPU_LOC_TO_VIEW_MATRIX)
+ BLI_dynstr_append(ds, "\t#define localtoviewmat ModelViewMatrix\n");
+ if (builtins & GPU_INVERSE_LOC_TO_VIEW_MATRIX)
+ BLI_dynstr_append(ds, "\t#define invlocaltoviewmat ModelViewMatrixInverse\n");
if (builtins & GPU_VIEW_NORMAL)
BLI_dynstr_append(ds, "\tvec3 facingnormal = gl_FrontFacing? viewNormal: -viewNormal;\n");
if (builtins & GPU_VIEW_POSITION)
- BLI_dynstr_append(ds, "\tvec3 viewposition = viewPosition;\n");
-
- /* Calculate tangent space. */
-#ifdef WITH_OPENSUBDIV
- {
- bool has_tangent = false;
- for (node = nodes->first; node; node = node->next) {
- for (input = node->inputs.first; input; input = input->next) {
- if (input->source == GPU_SOURCE_ATTRIB && input->attribfirst) {
- if (input->attribtype == CD_TANGENT) {
- BLI_dynstr_appendf(
- ds, "#ifdef USE_OPENSUBDIV\n");
- BLI_dynstr_appendf(
- ds, "\t%s var%d;\n",
- GPU_DATATYPE_STR[input->type],
- input->attribid);
- if (has_tangent == false) {
- BLI_dynstr_appendf(ds, "\tvec3 Q1 = dFdx(inpt.v.position.xyz);\n");
- BLI_dynstr_appendf(ds, "\tvec3 Q2 = dFdy(inpt.v.position.xyz);\n");
- BLI_dynstr_appendf(ds, "\tvec2 st1 = dFdx(inpt.v.uv);\n");
- BLI_dynstr_appendf(ds, "\tvec2 st2 = dFdy(inpt.v.uv);\n");
- BLI_dynstr_appendf(ds, "\tvec3 T = normalize(Q1 * st2.t - Q2 * st1.t);\n");
- }
- BLI_dynstr_appendf(ds, "\tvar%d = vec4(T, 1.0);\n", input->attribid);
- BLI_dynstr_appendf(ds, "#endif\n");
- }
- }
- }
- }
- }
-#endif
+ BLI_dynstr_append(ds, "\t#define viewposition viewPosition\n");
codegen_declare_tmps(ds, nodes);
codegen_call_functions(ds, nodes, output);
@@ -915,7 +880,7 @@ static char *code_generate_vertex(ListBase *nodes, const char *vert_code, bool u
/* XXX FIXME : see notes in mesh_render_data_create() */
/* NOTE : Replicate changes to mesh_render_data_create() in draw_cache_impl_mesh.c */
if (input->attribtype == CD_ORCO) {
- /* orco is computed from local positions, see bellow */
+ /* orco is computed from local positions, see below */
BLI_dynstr_appendf(ds, "uniform vec3 OrcoTexCoFactors[2];\n");
}
else if (input->attribname[0] == '\0') {
@@ -923,7 +888,7 @@ static char *code_generate_vertex(ListBase *nodes, const char *vert_code, bool u
BLI_dynstr_appendf(ds, "#define att%d %s\n", input->attribid, attrib_prefix_get(input->attribtype));
}
else {
- unsigned int hash = BLI_ghashutil_strhash_p(input->attribname);
+ uint hash = BLI_ghashutil_strhash_p(input->attribname);
BLI_dynstr_appendf(
ds, "DEFINE_ATTRIB(%s, %s%u);\n",
GPU_DATATYPE_STR[input->type], attrib_prefix_get(input->attribtype), hash);
@@ -950,6 +915,11 @@ static char *code_generate_vertex(ListBase *nodes, const char *vert_code, bool u
use_geom ? "g" : "");
}
+ if (builtins & GPU_BARYCENTRIC_DIST) {
+ BLI_dynstr_appendf(ds, "out vec3 barycentricPosg;\n");
+ }
+
+
BLI_dynstr_append(ds, "\n");
BLI_dynstr_append(
@@ -957,6 +927,7 @@ static char *code_generate_vertex(ListBase *nodes, const char *vert_code, bool u
"#define ATTRIB\n"
"uniform mat3 NormalMatrix;\n"
"uniform mat4 ModelMatrixInverse;\n"
+ "uniform mat4 ModelMatrix;\n"
"vec3 srgb_to_linear_attrib(vec3 c) {\n"
"\tc = max(c, vec3(0.0));\n"
"\tvec3 c1 = c * (1.0 / 12.92);\n"
@@ -994,6 +965,10 @@ static char *code_generate_vertex(ListBase *nodes, const char *vert_code, bool u
use_geom ? "g" : "");
}
+ if (builtins & GPU_BARYCENTRIC_DIST) {
+ BLI_dynstr_appendf(ds, "\tbarycentricPosg = position;\n");
+ }
+
for (node = nodes->first; node; node = node->next) {
for (input = node->inputs.first; input; input = input->next) {
if (input->source == GPU_SOURCE_ATTRIB && input->attribfirst) {
@@ -1028,6 +1003,10 @@ static char *code_generate_vertex(ListBase *nodes, const char *vert_code, bool u
use_geom ? "g" : "");
}
+ if (builtins & GPU_BARYCENTRIC_DIST) {
+ BLI_dynstr_appendf(ds, "\tbarycentricPosg = (ModelMatrix * vec4(position, 1.0)).xyz;\n");
+ }
+
for (node = nodes->first; node; node = node->next) {
for (input = node->inputs.first; input; input = input->next) {
if (input->source == GPU_SOURCE_ATTRIB && input->attribfirst) {
@@ -1067,7 +1046,27 @@ static char *code_generate_vertex(ListBase *nodes, const char *vert_code, bool u
BLI_dynstr_append(ds, "}\n");
- BLI_dynstr_append(ds, vert_code);
+ if (use_geom) {
+ /* XXX HACK: Eevee specific. */
+ char *vert_new, *vert_new2;
+ vert_new = BLI_str_replaceN(vert_code, "worldPosition", "worldPositiong");
+ vert_new2 = vert_new;
+ vert_new = BLI_str_replaceN(vert_new2, "viewPosition", "viewPositiong");
+ MEM_freeN(vert_new2);
+ vert_new2 = vert_new;
+ vert_new = BLI_str_replaceN(vert_new2, "worldNormal", "worldNormalg");
+ MEM_freeN(vert_new2);
+ vert_new2 = vert_new;
+ vert_new = BLI_str_replaceN(vert_new2, "viewNormal", "viewNormalg");
+ MEM_freeN(vert_new2);
+
+ BLI_dynstr_append(ds, vert_new);
+
+ MEM_freeN(vert_new);
+ }
+ else {
+ BLI_dynstr_append(ds, vert_code);
+ }
code = BLI_dynstr_get_cstring(ds);
@@ -1090,10 +1089,9 @@ static char *code_generate_geometry(ListBase *nodes, const char *geom_code)
/* Create prototype because attributes cannot be declared before layout. */
BLI_dynstr_appendf(ds, "void pass_attrib(in int vert);\n");
+ BLI_dynstr_appendf(ds, "void calc_barycentric_distances(vec3 pos0, vec3 pos1, vec3 pos2);\n");
BLI_dynstr_append(ds, "#define ATTRIB\n");
- BLI_dynstr_append(ds, geom_code);
-
/* Generate varying declarations. */
for (node = nodes->first; node; node = node->next) {
for (input = node->inputs.first; input; input = input->next) {
@@ -1115,14 +1113,91 @@ static char *code_generate_geometry(ListBase *nodes, const char *geom_code)
if (builtins & GPU_BARYCENTRIC_TEXCO) {
BLI_dynstr_appendf(ds, "in vec2 barycentricTexCog[];\n");
- BLI_dynstr_appendf(ds, "out vec2 barycentricTexCo[];\n");
+ BLI_dynstr_appendf(ds, "out vec2 barycentricTexCo;\n");
+ }
+
+ if (builtins & GPU_BARYCENTRIC_DIST) {
+ BLI_dynstr_appendf(ds, "in vec3 barycentricPosg[];\n");
+ BLI_dynstr_appendf(ds, "flat out vec3 barycentricDist;\n");
+ }
+
+ if (geom_code == NULL) {
+ if ((builtins & GPU_BARYCENTRIC_DIST) == 0) {
+ /* Early out */
+ BLI_dynstr_free(ds);
+ return NULL;
+ }
+ else {
+ /* Force geom shader usage */
+ /* TODO put in external file. */
+ BLI_dynstr_appendf(ds, "layout(triangles) in;\n");
+ BLI_dynstr_appendf(ds, "layout(triangle_strip, max_vertices=3) out;\n");
+
+ BLI_dynstr_appendf(ds, "in vec3 worldPositiong[];\n");
+ BLI_dynstr_appendf(ds, "in vec3 viewPositiong[];\n");
+ BLI_dynstr_appendf(ds, "in vec3 worldNormalg[];\n");
+ BLI_dynstr_appendf(ds, "in vec3 viewNormalg[];\n");
+
+ BLI_dynstr_appendf(ds, "out vec3 worldPosition;\n");
+ BLI_dynstr_appendf(ds, "out vec3 viewPosition;\n");
+ BLI_dynstr_appendf(ds, "out vec3 worldNormal;\n");
+ BLI_dynstr_appendf(ds, "out vec3 viewNormal;\n");
+
+ BLI_dynstr_appendf(ds, "void main(){\n");
+
+ if (builtins & GPU_BARYCENTRIC_DIST) {
+ BLI_dynstr_appendf(ds, "\tcalc_barycentric_distances(barycentricPosg[0], barycentricPosg[1], barycentricPosg[2]);\n");
+ }
+
+ BLI_dynstr_appendf(ds, "\tgl_Position = gl_in[0].gl_Position;\n");
+ BLI_dynstr_appendf(ds, "\tpass_attrib(0);\n");
+ BLI_dynstr_appendf(ds, "\tEmitVertex();\n");
+
+ BLI_dynstr_appendf(ds, "\tgl_Position = gl_in[1].gl_Position;\n");
+ BLI_dynstr_appendf(ds, "\tpass_attrib(1);\n");
+ BLI_dynstr_appendf(ds, "\tEmitVertex();\n");
+
+ BLI_dynstr_appendf(ds, "\tgl_Position = gl_in[2].gl_Position;\n");
+ BLI_dynstr_appendf(ds, "\tpass_attrib(2);\n");
+ BLI_dynstr_appendf(ds, "\tEmitVertex();\n");
+ BLI_dynstr_appendf(ds, "};\n");
+ }
+ }
+ else {
+ BLI_dynstr_append(ds, geom_code);
+ }
+
+ if (builtins & GPU_BARYCENTRIC_DIST) {
+ BLI_dynstr_appendf(ds, "void calc_barycentric_distances(vec3 pos0, vec3 pos1, vec3 pos2) {\n");
+ BLI_dynstr_appendf(ds, "\tvec3 edge21 = pos2 - pos1;\n");
+ BLI_dynstr_appendf(ds, "\tvec3 edge10 = pos1 - pos0;\n");
+ BLI_dynstr_appendf(ds, "\tvec3 edge02 = pos0 - pos2;\n");
+ BLI_dynstr_appendf(ds, "\tvec3 d21 = normalize(edge21);\n");
+ BLI_dynstr_appendf(ds, "\tvec3 d10 = normalize(edge10);\n");
+ BLI_dynstr_appendf(ds, "\tvec3 d02 = normalize(edge02);\n");
+
+ BLI_dynstr_appendf(ds, "\tfloat d = dot(d21, edge02);\n");
+ BLI_dynstr_appendf(ds, "\tbarycentricDist.x = sqrt(dot(edge02, edge02) - d * d);\n");
+ BLI_dynstr_appendf(ds, "\td = dot(d02, edge10);\n");
+ BLI_dynstr_appendf(ds, "\tbarycentricDist.y = sqrt(dot(edge10, edge10) - d * d);\n");
+ BLI_dynstr_appendf(ds, "\td = dot(d10, edge21);\n");
+ BLI_dynstr_appendf(ds, "\tbarycentricDist.z = sqrt(dot(edge21, edge21) - d * d);\n");
+ BLI_dynstr_append(ds, "}\n");
}
/* Generate varying assignments. */
BLI_dynstr_appendf(ds, "void pass_attrib(in int vert) {\n");
+ /* XXX HACK: Eevee specific. */
+ if (geom_code == NULL) {
+ BLI_dynstr_appendf(ds, "\tworldPosition = worldPositiong[vert];\n");
+ BLI_dynstr_appendf(ds, "\tviewPosition = viewPositiong[vert];\n");
+ BLI_dynstr_appendf(ds, "\tworldNormal = worldNormalg[vert];\n");
+ BLI_dynstr_appendf(ds, "\tviewNormal = viewNormalg[vert];\n");
+ }
+
if (builtins & GPU_BARYCENTRIC_TEXCO) {
- BLI_dynstr_appendf(ds, "\tbarycentricTexCo = barycentricTexCog;\n");
+ BLI_dynstr_appendf(ds, "\tbarycentricTexCo = barycentricTexCog[vert];\n");
}
for (node = nodes->first; node; node = node->next) {
@@ -1342,19 +1417,11 @@ static GPUNodeLink *gpu_uniformbuffer_link(
{
bNodeSocket *socket;
- /* Some nodes can have been create on the fly and does
- * not have an original to point to. (i.e. the bump from
- * ntree_shader_relink_displacement). In this case just
- * revert to static constant folding. */
- if (node->original == NULL) {
- return NULL;
- }
-
if (in_out == SOCK_IN) {
- socket = BLI_findlink(&node->original->inputs, index);
+ socket = BLI_findlink(&node->inputs, index);
}
else {
- socket = BLI_findlink(&node->original->outputs, index);
+ socket = BLI_findlink(&node->outputs, index);
}
BLI_assert(socket != NULL);
@@ -1371,7 +1438,7 @@ static GPUNodeLink *gpu_uniformbuffer_link(
}
case SOCK_VECTOR:
{
- bNodeSocketValueRGBA *socket_data = socket->default_value;
+ bNodeSocketValueVector *socket_data = socket->default_value;
link = GPU_uniform(socket_data->value);
break;
}
@@ -1717,11 +1784,12 @@ static bool gpu_pass_is_valid(GPUPass *pass)
return (pass->compiled == false || pass->shader != NULL);
}
-GPUPass *GPU_generate_pass_new(
+GPUPass *GPU_generate_pass(
GPUMaterial *material,
GPUNodeLink *frag_outlink,
struct GPUVertexAttribs *attribs,
ListBase *nodes,
+ int *builtins,
const char *vert_code,
const char *geom_code,
const char *frag_lib,
@@ -1736,7 +1804,7 @@ GPUPass *GPU_generate_pass_new(
GPU_nodes_get_vertex_attributes(nodes, attribs);
/* generate code */
- char *fragmentgen = code_generate_fragment(material, nodes, frag_outlink->output);
+ char *fragmentgen = code_generate_fragment(material, nodes, frag_outlink->output, builtins);
/* Cache lookup: Reuse shaders already compiled */
uint32_t hash = gpu_pass_hash(fragmentgen, defines, attribs);
@@ -1757,8 +1825,8 @@ GPUPass *GPU_generate_pass_new(
* continue generating the shader strings. */
char *tmp = BLI_strdupcat(frag_lib, glsl_material_library);
- vertexcode = code_generate_vertex(nodes, vert_code, (geom_code != NULL));
- geometrycode = (geom_code) ? code_generate_geometry(nodes, geom_code) : NULL;
+ geometrycode = code_generate_geometry(nodes, geom_code);
+ vertexcode = code_generate_vertex(nodes, vert_code, (geometrycode != NULL));
fragmentcode = BLI_strdupcat(tmp, fragmentgen);
MEM_freeN(fragmentgen);
@@ -1811,6 +1879,87 @@ GPUPass *GPU_generate_pass_new(
return pass;
}
+static int count_active_texture_sampler(GPUShader *shader, char *source)
+{
+ char *code = source;
+ int samplers_id[64]; /* Remember this is per stage. */
+ int sampler_len = 0;
+
+ while ((code = strstr(code, "uniform "))) {
+ /* Move past "uniform". */
+ code += 7;
+ /* Skip following spaces. */
+ while (*code == ' ') { code++; }
+ /* Skip "i" from potential isamplers. */
+ if (*code == 'i') { code++; }
+ /* Skip following spaces. */
+ if (gpu_str_prefix(code, "sampler")) {
+ /* Move past "uniform". */
+ code += 7;
+ /* Skip sampler type suffix. */
+ while (*code != ' ' && *code != '\0') { code++; }
+ /* Skip following spaces. */
+ while (*code == ' ') { code++; }
+
+ if (*code != '\0') {
+ char sampler_name[64];
+ code = gpu_str_skip_token(code, sampler_name, sizeof(sampler_name));
+ int id = GPU_shader_get_uniform(shader, sampler_name);
+
+ if (id == -1) {
+ continue;
+ }
+ /* Catch duplicates. */
+ bool is_duplicate = false;
+ for (int i = 0; i < sampler_len; ++i) {
+ if (samplers_id[i] == id) {
+ is_duplicate = true;
+ }
+ }
+
+ if (!is_duplicate) {
+ samplers_id[sampler_len] = id;
+ sampler_len++;
+ }
+ }
+ }
+ }
+
+ return sampler_len;
+}
+
+static bool gpu_pass_shader_validate(GPUPass *pass)
+{
+ if (pass->shader == NULL) {
+ return false;
+ }
+
+ /* NOTE: The only drawback of this method is that it will count a sampler
+ * used in the fragment shader and only declared (but not used) in the vertex
+ * shader as used by both. But this corner case is not happening for now. */
+ int vert_samplers_len = count_active_texture_sampler(pass->shader, pass->vertexcode);
+ int frag_samplers_len = count_active_texture_sampler(pass->shader, pass->fragmentcode);
+
+ int total_samplers_len = vert_samplers_len + frag_samplers_len;
+
+ /* Validate against opengl limit. */
+ if ((frag_samplers_len > GPU_max_textures_frag()) ||
+ (frag_samplers_len > GPU_max_textures_vert()))
+ {
+ return false;
+ }
+
+ if (pass->geometrycode) {
+ int geom_samplers_len = count_active_texture_sampler(pass->shader, pass->geometrycode);
+ total_samplers_len += geom_samplers_len;
+ if (geom_samplers_len > GPU_max_textures_geom()) {
+ return false;
+ }
+ }
+
+ return (total_samplers_len <= GPU_max_textures());
+}
+
void GPU_pass_compile(GPUPass *pass, const char *shname)
{
if (!pass->compiled) {
@@ -1821,6 +1970,16 @@ void GPU_pass_compile(GPUPass *pass, const char *shname)
NULL,
pass->defines,
shname);
+
+ /* NOTE: Some drivers / gpu allows more active samplers than the opengl limit.
+ * We need to make sure to count active samplers to avoid undefined behaviour. */
+ if (!gpu_pass_shader_validate(pass)) {
+ if (pass->shader != NULL) {
+ fprintf(stderr, "GPUShader: error: too many samplers in shader.\n");
+ GPU_shader_free(pass->shader);
+ }
+ pass->shader = NULL;
+ }
pass->compiled = true;
}
}
diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h
index 7a86bed55de..96be3a1a422 100644
--- a/source/blender/gpu/intern/gpu_codegen.h
+++ b/source/blender/gpu/intern/gpu_codegen.h
@@ -169,17 +169,17 @@ struct GPUPass {
char *geometrycode;
char *vertexcode;
char *defines;
- unsigned int refcount; /* Orphaned GPUPasses gets freed by the garbage collector. */
+ uint refcount; /* Orphaned GPUPasses gets freed by the garbage collector. */
uint32_t hash; /* Identity hash generated from all GLSL code. */
bool compiled; /* Did we already tried to compile the attached GPUShader. */
};
typedef struct GPUPass GPUPass;
-GPUPass *GPU_generate_pass_new(
+GPUPass *GPU_generate_pass(
GPUMaterial *material,
GPUNodeLink *frag_outlink, struct GPUVertexAttribs *attribs,
- ListBase *nodes,
+ ListBase *nodes, int *builtins,
const char *vert_code, const char *geom_code,
const char *frag_lib, const char *defines);
diff --git a/source/blender/gpu/intern/gpu_context_private.h b/source/blender/gpu/intern/gpu_context_private.h
index 762d9ff10c0..7f13dd542da 100644
--- a/source/blender/gpu/intern/gpu_context_private.h
+++ b/source/blender/gpu/intern/gpu_context_private.h
@@ -26,7 +26,7 @@
/** \file blender/gpu/intern/gpu_context_private.h
* \ingroup gpu
*
- * This interface allow GPU to manage GL objects for mutiple context and threads.
+ * This interface allow GPU to manage GL objects for multiple context and threads.
*/
#ifndef __GPU_CONTEXT_PRIVATE_H__
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index 325ade776de..347b48bf321 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -62,14 +62,13 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
-#include "BKE_bmfont.h"
+#include "BKE_colorband.h"
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_node.h"
#include "BKE_scene.h"
-#include "BKE_DerivedMesh.h"
#include "GPU_draw.h"
#include "GPU_extensions.h"
@@ -85,15 +84,6 @@
# include "smoke_API.h"
#endif
-#ifdef WITH_OPENSUBDIV
-# include "BKE_subsurf.h"
-# include "BKE_editmesh.h"
-
-# include "gpu_codegen.h"
-#endif
-
-extern Material defmaterial; /* from material.c */
-
//* Checking powers of two for images since OpenGL ES requires it */
#ifdef WITH_DDS
static bool is_power_of_2_resolution(int w, int h)
@@ -309,7 +299,7 @@ GPUTexture *GPU_texture_from_blender(
/* Check if we have a valid image. If not, we return a dummy
* texture with zero bindcode so we don't keep trying. */
- unsigned int bindcode = 0;
+ uint bindcode = 0;
if (ima->ok == 0) {
*tex = GPU_texture_from_bindcode(textarget, bindcode);
return *tex;
@@ -353,7 +343,7 @@ GPUTexture *GPU_texture_from_blender(
const int rectw = ibuf->x;
const int recth = ibuf->y;
- unsigned int *rect = ibuf->rect;
+ uint *rect = ibuf->rect;
float *frect = NULL;
float *srgb_frect = NULL;
@@ -397,9 +387,9 @@ GPUTexture *GPU_texture_from_blender(
return *tex;
}
-static void **gpu_gen_cube_map(unsigned int *rect, float *frect, int rectw, int recth, bool use_high_bit_depth)
+static void **gpu_gen_cube_map(uint *rect, float *frect, int rectw, int recth, bool use_high_bit_depth)
{
- size_t block_size = use_high_bit_depth ? sizeof(float) * 4 : sizeof(unsigned char) * 4;
+ size_t block_size = use_high_bit_depth ? sizeof(float[4]) : sizeof(uchar[4]);
void **sides = NULL;
int h = recth / 2;
int w = rectw / 3;
@@ -437,7 +427,7 @@ static void **gpu_gen_cube_map(unsigned int *rect, float *frect, int rectw, int
}
}
else {
- unsigned int **isides = (unsigned int **)sides;
+ uint **isides = (uint **)sides;
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
@@ -466,7 +456,7 @@ static void gpu_del_cube_map(void **cube_map)
/* Image *ima can be NULL */
void GPU_create_gl_tex(
- unsigned int *bind, unsigned int *rect, float *frect, int rectw, int recth,
+ uint *bind, uint *rect, float *frect, int rectw, int recth,
int textarget, bool mipmap, bool use_high_bit_depth, Image *ima)
{
ImBuf *ibuf = NULL;
@@ -480,13 +470,11 @@ void GPU_create_gl_tex(
if (textarget == GL_TEXTURE_2D) {
if (use_high_bit_depth) {
- if (GLEW_ARB_texture_float)
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, rectw, recth, 0, GL_RGBA, GL_FLOAT, frect);
- else
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, rectw, recth, 0, GL_RGBA, GL_FLOAT, frect);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, rectw, recth, 0, GL_RGBA, GL_FLOAT, frect);
}
- else
+ else {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, rectw, recth, 0, GL_RGBA, GL_UNSIGNED_BYTE, rect);
+ }
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter(1));
@@ -509,10 +497,7 @@ void GPU_create_gl_tex(
for (i = 1; i < ibuf->miptot; i++) {
ImBuf *mip = ibuf->mipmap[i - 1];
if (use_high_bit_depth) {
- if (GLEW_ARB_texture_float)
- glTexImage2D(GL_TEXTURE_2D, i, GL_RGBA16F, mip->x, mip->y, 0, GL_RGBA, GL_FLOAT, mip->rect_float);
- else
- glTexImage2D(GL_TEXTURE_2D, i, GL_RGBA16, mip->x, mip->y, 0, GL_RGBA, GL_FLOAT, mip->rect_float);
+ glTexImage2D(GL_TEXTURE_2D, i, GL_RGBA16F, mip->x, mip->y, 0, GL_RGBA, GL_FLOAT, mip->rect_float);
}
else {
glTexImage2D(GL_TEXTURE_2D, i, GL_RGBA8, mip->x, mip->y, 0, GL_RGBA, GL_UNSIGNED_BYTE, mip->rect);
@@ -532,7 +517,7 @@ void GPU_create_gl_tex(
if (h == w && is_power_of_2_i(h) && !is_over_resolution_limit(textarget, h, w)) {
void **cube_map = gpu_gen_cube_map(rect, frect, rectw, recth, use_high_bit_depth);
- GLenum informat = use_high_bit_depth ? (GLEW_ARB_texture_float ? GL_RGBA16F : GL_RGBA16) : GL_RGBA8;
+ GLenum informat = use_high_bit_depth ? GL_RGBA16F : GL_RGBA8;
GLenum type = use_high_bit_depth ? GL_FLOAT : GL_UNSIGNED_BYTE;
if (cube_map)
@@ -670,7 +655,7 @@ bool GPU_upload_dxt_texture(ImBuf *ibuf)
}
void GPU_create_gl_tex_compressed(
- unsigned int *bind, unsigned int *pix, int x, int y,
+ uint *bind, uint *pix, int x, int y,
int textarget, int mipmap, Image *ima, ImBuf *ibuf)
{
#ifndef WITH_DDS
@@ -775,8 +760,8 @@ static bool gpu_check_scaled_image(ImBuf *ibuf, Image *ima, float *frect, int x,
}
/* byte images are not continuous in memory so do manual interpolation */
else {
- unsigned char *scalerect = MEM_mallocN(rectw * recth * sizeof(*scalerect) * 4, "scalerect");
- unsigned int *p = (unsigned int *)scalerect;
+ uchar *scalerect = MEM_mallocN(rectw * recth * sizeof(*scalerect) * 4, "scalerect");
+ uint *p = (uint *)scalerect;
int i, j;
float inv_xratio = 1.0f / xratio;
float inv_yratio = 1.0f / yratio;
@@ -784,7 +769,7 @@ static bool gpu_check_scaled_image(ImBuf *ibuf, Image *ima, float *frect, int x,
float u = (x + i) * inv_xratio;
for (j = 0; j < recth; j++) {
float v = (y + j) * inv_yratio;
- bilinear_interpolation_color_wrap(ibuf, (unsigned char *)(p + i + j * (rectw)), NULL, u, v);
+ bilinear_interpolation_color_wrap(ibuf, (uchar *)(p + i + j * (rectw)), NULL, u, v);
}
}
@@ -896,6 +881,192 @@ void GPU_paint_update_image(Image *ima, ImageUser *iuser, int x, int y, int w, i
BKE_image_release_ibuf(ima, ibuf, NULL);
}
+/* *************************** Transfer functions *************************** */
+
+enum {
+ TFUNC_FLAME_SPECTRUM = 0,
+ TFUNC_COLOR_RAMP = 1,
+};
+
+#define TFUNC_WIDTH 256
+
+#ifdef WITH_SMOKE
+static void create_flame_spectrum_texture(float *data)
+{
+#define FIRE_THRESH 7
+#define MAX_FIRE_ALPHA 0.06f
+#define FULL_ON_FIRE 100
+
+ float *spec_pixels = MEM_mallocN(TFUNC_WIDTH * 4 * 16 * 16 * sizeof(float), "spec_pixels");
+
+ blackbody_temperature_to_rgb_table(data, TFUNC_WIDTH, 1500, 3000);
+
+ for (int i = 0; i < 16; i++) {
+ for (int j = 0; j < 16; j++) {
+ for (int k = 0; k < TFUNC_WIDTH; k++) {
+ int index = (j * TFUNC_WIDTH * 16 + i * TFUNC_WIDTH + k) * 4;
+ if (k >= FIRE_THRESH) {
+ spec_pixels[index] = (data[k * 4]);
+ spec_pixels[index + 1] = (data[k * 4 + 1]);
+ spec_pixels[index + 2] = (data[k * 4 + 2]);
+ spec_pixels[index + 3] = MAX_FIRE_ALPHA * (
+ (k > FULL_ON_FIRE) ? 1.0f : (k - FIRE_THRESH) / ((float)FULL_ON_FIRE - FIRE_THRESH));
+ }
+ else {
+ zero_v4(&spec_pixels[index]);
+ }
+ }
+ }
+ }
+
+ memcpy(data, spec_pixels, sizeof(float) * 4 * TFUNC_WIDTH);
+
+ MEM_freeN(spec_pixels);
+
+#undef FIRE_THRESH
+#undef MAX_FIRE_ALPHA
+#undef FULL_ON_FIRE
+}
+
+static void create_color_ramp(const ColorBand *coba, float *data)
+{
+ for (int i = 0; i < TFUNC_WIDTH; i++) {
+ BKE_colorband_evaluate(coba, (float)i / TFUNC_WIDTH, &data[i * 4]);
+ }
+}
+
+static GPUTexture *create_transfer_function(int type, const ColorBand *coba)
+{
+ float *data = MEM_mallocN(sizeof(float) * 4 * TFUNC_WIDTH, __func__);
+
+ switch (type) {
+ case TFUNC_FLAME_SPECTRUM:
+ create_flame_spectrum_texture(data);
+ break;
+ case TFUNC_COLOR_RAMP:
+ create_color_ramp(coba, data);
+ break;
+ }
+
+ GPUTexture *tex = GPU_texture_create_1D(TFUNC_WIDTH, GPU_RGBA8, data, NULL);
+
+ MEM_freeN(data);
+
+ return tex;
+}
+
+static void swizzle_texture_channel_rrrr(GPUTexture *tex)
+{
+ GPU_texture_bind(tex, 0);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R, GL_RED);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G, GL_RED);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B, GL_RED);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A, GL_RED);
+ GPU_texture_unbind(tex);
+}
+
+static GPUTexture *create_field_texture(SmokeDomainSettings *sds)
+{
+ float *field = NULL;
+
+ switch (sds->coba_field) {
+ case FLUID_FIELD_DENSITY: field = smoke_get_density(sds->fluid); break;
+ case FLUID_FIELD_HEAT: field = smoke_get_heat(sds->fluid); break;
+ case FLUID_FIELD_FUEL: field = smoke_get_fuel(sds->fluid); break;
+ case FLUID_FIELD_REACT: field = smoke_get_react(sds->fluid); break;
+ case FLUID_FIELD_FLAME: field = smoke_get_flame(sds->fluid); break;
+ case FLUID_FIELD_VELOCITY_X: field = smoke_get_velocity_x(sds->fluid); break;
+ case FLUID_FIELD_VELOCITY_Y: field = smoke_get_velocity_y(sds->fluid); break;
+ case FLUID_FIELD_VELOCITY_Z: field = smoke_get_velocity_z(sds->fluid); break;
+ case FLUID_FIELD_COLOR_R: field = smoke_get_color_r(sds->fluid); break;
+ case FLUID_FIELD_COLOR_G: field = smoke_get_color_g(sds->fluid); break;
+ case FLUID_FIELD_COLOR_B: field = smoke_get_color_b(sds->fluid); break;
+ case FLUID_FIELD_FORCE_X: field = smoke_get_force_x(sds->fluid); break;
+ case FLUID_FIELD_FORCE_Y: field = smoke_get_force_y(sds->fluid); break;
+ case FLUID_FIELD_FORCE_Z: field = smoke_get_force_z(sds->fluid); break;
+ default: return NULL;
+ }
+
+ GPUTexture *tex = GPU_texture_create_nD(
+ sds->res[0], sds->res[1], sds->res[2], 3,
+ field, GPU_R8, GPU_DATA_FLOAT, 0, true, NULL);
+
+ swizzle_texture_channel_rrrr(tex);
+ return tex;
+}
+
+static GPUTexture *create_density_texture(SmokeDomainSettings *sds, int highres)
+{
+ float *data = NULL, *source;
+ int cell_count = (highres) ? smoke_turbulence_get_cells(sds->wt) : sds->total_cells;
+ const bool has_color = (highres) ? smoke_turbulence_has_colors(sds->wt) : smoke_has_colors(sds->fluid);
+ int *dim = (highres) ? sds->res_wt : sds->res;
+ GPUTextureFormat format = (has_color) ? GPU_RGBA8 : GPU_R8;
+
+ if (has_color) {
+ data = MEM_callocN(sizeof(float) * cell_count * 4, "smokeColorTexture");
+ }
+
+ if (highres) {
+ if (has_color) {
+ smoke_turbulence_get_rgba(sds->wt, data, 0);
+ }
+ else {
+ source = smoke_turbulence_get_density(sds->wt);
+ }
+ }
+ else {
+ if (has_color) {
+ smoke_get_rgba(sds->fluid, data, 0);
+ }
+ else {
+ source = smoke_get_density(sds->fluid);
+ }
+ }
+
+ GPUTexture *tex = GPU_texture_create_nD(
+ dim[0], dim[1], dim[2], 3,
+ (has_color) ? data : source,
+ format, GPU_DATA_FLOAT, 0, true, NULL);
+ if (data) {
+ MEM_freeN(data);
+ }
+
+ if (format == GPU_R8) {
+ /* Swizzle the RGBA components to read the Red channel so
+ * that the shader stay the same for colored and non color
+ * density textures. */
+ swizzle_texture_channel_rrrr(tex);
+ }
+ return tex;
+}
+
+static GPUTexture *create_flame_texture(SmokeDomainSettings *sds, int highres)
+{
+ float *source = NULL;
+ const bool has_fuel = (highres) ? smoke_turbulence_has_fuel(sds->wt) : smoke_has_fuel(sds->fluid);
+ int *dim = (highres) ? sds->res_wt : sds->res;
+
+ if (!has_fuel)
+ return NULL;
+
+ if (highres) {
+ source = smoke_turbulence_get_flame(sds->wt);
+ }
+ else {
+ source = smoke_get_flame(sds->fluid);
+ }
+
+ GPUTexture *tex = GPU_texture_create_nD(
+ dim[0], dim[1], dim[2], 3,
+ source, GPU_R8, GPU_DATA_FLOAT, 0, true, NULL);
+
+ swizzle_texture_channel_rrrr(tex);
+
+ return tex;
+}
+#endif /* WITH_SMOKE */
+
void GPU_free_smoke(SmokeModifierData *smd)
{
if (smd->type & MOD_SMOKE_TYPE_DOMAIN && smd->domain) {
@@ -910,85 +1081,66 @@ void GPU_free_smoke(SmokeModifierData *smd)
if (smd->domain->tex_flame)
GPU_texture_free(smd->domain->tex_flame);
smd->domain->tex_flame = NULL;
+
+ if (smd->domain->tex_flame_coba)
+ GPU_texture_free(smd->domain->tex_flame_coba);
+ smd->domain->tex_flame_coba = NULL;
+
+ if (smd->domain->tex_coba)
+ GPU_texture_free(smd->domain->tex_coba);
+ smd->domain->tex_coba = NULL;
+
+ if (smd->domain->tex_field)
+ GPU_texture_free(smd->domain->tex_field);
+ smd->domain->tex_field = NULL;
}
}
-void GPU_create_smoke(SmokeModifierData *smd, int highres)
+void GPU_create_smoke_coba_field(SmokeModifierData *smd)
{
#ifdef WITH_SMOKE
if (smd->type & MOD_SMOKE_TYPE_DOMAIN) {
SmokeDomainSettings *sds = smd->domain;
- if (!sds->tex && !highres) {
- /* rgba texture for color + density */
- if (smoke_has_colors(sds->fluid)) {
- float *data = MEM_callocN(sizeof(float) * sds->total_cells * 4, "smokeColorTexture");
- smoke_get_rgba(sds->fluid, data, 0);
- sds->tex = GPU_texture_create_3D(sds->res[0], sds->res[1], sds->res[2], GPU_RGBA8, data, NULL);
- MEM_freeN(data);
- }
- /* density only */
- else {
- sds->tex = GPU_texture_create_3D(
- sds->res[0], sds->res[1], sds->res[2],
- GPU_R8, smoke_get_density(sds->fluid), NULL);
-
- /* Swizzle the RGBA components to read the Red channel so
- * that the shader stay the same for colored and non color
- * density textures. */
- GPU_texture_bind(sds->tex, 0);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R, GL_RED);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G, GL_RED);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B, GL_RED);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A, GL_RED);
- GPU_texture_unbind(sds->tex);
- }
- sds->tex_flame = (
- smoke_has_fuel(sds->fluid) ?
- GPU_texture_create_3D(
- sds->res[0], sds->res[1], sds->res[2],
- GPU_R8, smoke_get_flame(sds->fluid), NULL) :
- NULL);
+
+ if (!sds->tex_field) {
+ sds->tex_field = create_field_texture(sds);
}
- else if (!sds->tex && highres) {
- /* rgba texture for color + density */
- if (smoke_turbulence_has_colors(sds->wt)) {
- float *data = MEM_callocN(sizeof(float) * smoke_turbulence_get_cells(sds->wt) * 4, "smokeColorTexture");
- smoke_turbulence_get_rgba(sds->wt, data, 0);
- sds->tex = GPU_texture_create_3D(sds->res_wt[0], sds->res_wt[1], sds->res_wt[2], GPU_RGBA8, data, NULL);
- MEM_freeN(data);
- }
- /* density only */
- else {
- sds->tex = GPU_texture_create_3D(
- sds->res_wt[0], sds->res_wt[1], sds->res_wt[2],
- GPU_R8, smoke_turbulence_get_density(sds->wt), NULL);
-
- /* Swizzle the RGBA components to read the Red channel so
- * that the shader stay the same for colored and non color
- * density textures. */
- GPU_texture_bind(sds->tex, 0);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R, GL_RED);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G, GL_RED);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B, GL_RED);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A, GL_RED);
- GPU_texture_unbind(sds->tex);
- }
- sds->tex_flame = (
- smoke_turbulence_has_fuel(sds->wt) ?
- GPU_texture_create_3D(
- sds->res_wt[0], sds->res_wt[1], sds->res_wt[2],
- GPU_R8, smoke_turbulence_get_flame(sds->wt), NULL) :
- NULL);
+ if (!sds->tex_coba) {
+ sds->tex_coba = create_transfer_function(TFUNC_COLOR_RAMP, sds->coba);
}
+ }
+#else // WITH_SMOKE
+ smd->domain->tex_field = NULL;
+#endif // WITH_SMOKE
+}
+
+void GPU_create_smoke(SmokeModifierData *smd, int highres)
+{
+#ifdef WITH_SMOKE
+ if (smd->type & MOD_SMOKE_TYPE_DOMAIN) {
+ SmokeDomainSettings *sds = smd->domain;
- sds->tex_shadow = GPU_texture_create_3D(
- sds->res[0], sds->res[1], sds->res[2],
- GPU_R8, sds->shadow, NULL);
+ if (!sds->tex) {
+ sds->tex = create_density_texture(sds, highres);
+ }
+ if (!sds->tex_flame) {
+ sds->tex_flame = create_flame_texture(sds, highres);
+ }
+ if (!sds->tex_flame_coba && sds->tex_flame) {
+ sds->tex_flame_coba = create_transfer_function(TFUNC_FLAME_SPECTRUM, NULL);
+ }
+ if (!sds->tex_shadow) {
+ sds->tex_shadow = GPU_texture_create_nD(
+ sds->res[0], sds->res[1], sds->res[2], 3,
+ sds->shadow,
+ GPU_R8, GPU_DATA_FLOAT, 0, true, NULL);
+ }
}
#else // WITH_SMOKE
(void)highres;
smd->domain->tex = NULL;
smd->domain->tex_flame = NULL;
+ smd->domain->tex_flame_coba = NULL;
smd->domain->tex_shadow = NULL;
#endif // WITH_SMOKE
}
@@ -1215,9 +1367,9 @@ void GPU_disable_program_point_size(void)
/* apple seems to round colors to below and up on some configs */
-static unsigned int index_to_framebuffer(int index)
+static uint index_to_framebuffer(int index)
{
- unsigned int i = index;
+ uint i = index;
switch (GPU_color_depth()) {
case 12:
@@ -1245,9 +1397,9 @@ static unsigned int index_to_framebuffer(int index)
/* this is the old method as being in use for ages.... seems to work? colors are rounded to lower values */
-static unsigned int index_to_framebuffer(int index)
+static uint index_to_framebuffer(int index)
{
- unsigned int i = index;
+ uint i = index;
switch (GPU_color_depth()) {
case 8:
@@ -1303,7 +1455,7 @@ void GPU_select_index_get(int index, int *r_col)
#define INDEX_FROM_BUF_18(col) ((((col) & 0xFC0000) >> 6) + (((col) & 0xFC00) >> 4) + (((col) & 0xFC) >> 2))
#define INDEX_FROM_BUF_24(col) ((col) & 0xFFFFFF)
-int GPU_select_to_index(unsigned int col)
+int GPU_select_to_index(uint col)
{
if (col == 0) {
return 0;
@@ -1319,7 +1471,7 @@ int GPU_select_to_index(unsigned int col)
}
}
-void GPU_select_to_index_array(unsigned int *col, const unsigned int size)
+void GPU_select_to_index_array(uint *col, const uint size)
{
#define INDEX_BUF_ARRAY(INDEX_FROM_BUF_BITS) \
for (i = size; i--; col++) { \
@@ -1329,7 +1481,7 @@ void GPU_select_to_index_array(unsigned int *col, const unsigned int size)
} ((void)0)
if (size > 0) {
- unsigned int i, c;
+ uint i, c;
switch (GPU_color_depth()) {
case 8:
@@ -1360,32 +1512,32 @@ typedef struct {
eGPUAttribMask mask;
/* GL_ENABLE_BIT */
- unsigned int is_blend : 1;
- unsigned int is_cull_face : 1;
- unsigned int is_depth_test : 1;
- unsigned int is_dither : 1;
- unsigned int is_lighting : 1;
- unsigned int is_line_smooth : 1;
- unsigned int is_color_logic_op : 1;
- unsigned int is_multisample : 1;
- unsigned int is_polygon_offset_line : 1;
- unsigned int is_polygon_offset_fill : 1;
- unsigned int is_polygon_smooth : 1;
- unsigned int is_sample_alpha_to_coverage : 1;
- unsigned int is_scissor_test : 1;
- unsigned int is_stencil_test : 1;
+ uint is_blend : 1;
+ uint is_cull_face : 1;
+ uint is_depth_test : 1;
+ uint is_dither : 1;
+ uint is_lighting : 1;
+ uint is_line_smooth : 1;
+ uint is_color_logic_op : 1;
+ uint is_multisample : 1;
+ uint is_polygon_offset_line : 1;
+ uint is_polygon_offset_fill : 1;
+ uint is_polygon_smooth : 1;
+ uint is_sample_alpha_to_coverage : 1;
+ uint is_scissor_test : 1;
+ uint is_stencil_test : 1;
bool is_clip_plane[6];
/* GL_DEPTH_BUFFER_BIT */
- /* unsigned int is_depth_test : 1; */
+ /* uint is_depth_test : 1; */
int depth_func;
double depth_clear_value;
bool depth_write_mask;
/* GL_SCISSOR_BIT */
int scissor_box[4];
- /* unsigned int is_scissor_test : 1; */
+ /* uint is_scissor_test : 1; */
/* GL_VIEWPORT_BIT */
int viewport[4];
@@ -1394,7 +1546,7 @@ typedef struct {
typedef struct {
GPUAttribValues attrib_stack[STATE_STACK_DEPTH];
- unsigned int top;
+ uint top;
} GPUAttribStack;
static GPUAttribStack state = {
diff --git a/source/blender/gpu/intern/gpu_element.c b/source/blender/gpu/intern/gpu_element.c
index 56a0c90d5b5..b8ce4faabea 100644
--- a/source/blender/gpu/intern/gpu_element.c
+++ b/source/blender/gpu/intern/gpu_element.c
@@ -63,6 +63,26 @@ uint GPU_indexbuf_size_get(const GPUIndexBuf *elem)
#endif
}
+int GPU_indexbuf_primitive_len(GPUPrimType prim_type)
+{
+ switch (prim_type) {
+ case GPU_PRIM_POINTS:
+ return 1;
+ case GPU_PRIM_LINES:
+ return 2;
+ case GPU_PRIM_TRIS:
+ return 3;
+ case GPU_PRIM_LINES_ADJ:
+ return 4;
+ default:
+ break;
+ }
+#if TRUST_NO_ONE
+ assert(false);
+#endif
+ return -1;
+}
+
void GPU_indexbuf_init_ex(
GPUIndexBufBuilder *builder, GPUPrimType prim_type,
uint index_len, uint vertex_len, bool use_prim_restart)
@@ -77,28 +97,11 @@ void GPU_indexbuf_init_ex(
void GPU_indexbuf_init(GPUIndexBufBuilder *builder, GPUPrimType prim_type, uint prim_len, uint vertex_len)
{
- uint verts_per_prim = 0;
- switch (prim_type) {
- case GPU_PRIM_POINTS:
- verts_per_prim = 1;
- break;
- case GPU_PRIM_LINES:
- verts_per_prim = 2;
- break;
- case GPU_PRIM_TRIS:
- verts_per_prim = 3;
- break;
- case GPU_PRIM_LINES_ADJ:
- verts_per_prim = 4;
- break;
- default:
+ int verts_per_prim = GPU_indexbuf_primitive_len(prim_type);
#if TRUST_NO_ONE
- assert(false);
+ assert(verts_per_prim != -1);
#endif
- return;
- }
-
- GPU_indexbuf_init_ex(builder, prim_type, prim_len * verts_per_prim, vertex_len, false);
+ GPU_indexbuf_init_ex(builder, prim_type, prim_len * (uint)verts_per_prim, vertex_len, false);
}
void GPU_indexbuf_add_generic_vert(GPUIndexBufBuilder *builder, uint v)
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index 0c2f11b1f74..2237a6ea49c 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -37,8 +37,10 @@
#include "BLI_math_vector.h"
#include "BKE_global.h"
+#include "MEM_guardedalloc.h"
#include "GPU_extensions.h"
+#include "GPU_framebuffer.h"
#include "GPU_glew.h"
#include "GPU_texture.h"
@@ -68,6 +70,9 @@ static struct GPUGlobal {
GLint maxtexlayers;
GLint maxcubemapsize;
GLint maxtextures;
+ GLint maxtexturesfrag;
+ GLint maxtexturesgeom;
+ GLint maxtexturesvert;
GLint maxubosize;
GLint maxubobinds;
int colordepth;
@@ -75,13 +80,53 @@ static struct GPUGlobal {
GPUDeviceType device;
GPUOSType os;
GPUDriverType driver;
+ float line_width_range[2];
/* workaround for different calculation of dfdy factors on GPUs. Some GPUs/drivers
* calculate dfdy in shader differently when drawing to an offscreen buffer. First
* number is factor on screen and second is off-screen */
float dfdyfactors[2];
float max_anisotropy;
+ /* Some Intel drivers have issues with using mips as framebuffer targets if
+ * GL_TEXTURE_MAX_LEVEL is higher than the target mip.
+ * We need a workaround in this cases. */
+ bool mip_render_workaround;
+ /* There is an issue with the glBlitFramebuffer on MacOS with radeon pro graphics.
+ * Blitting depth with GL_DEPTH24_STENCIL8 is buggy so the workaround is to use
+ * GPU_DEPTH32F_STENCIL8. Then Blitting depth will work but blitting stencil will
+ * still be broken. */
+ bool depth_blitting_workaround;
} GG = {1, 0};
+
+static void gpu_detect_mip_render_workaround(void)
+{
+ int cube_size = 2;
+ float *source_pix = MEM_callocN(sizeof(float) * 4 * 6 * cube_size * cube_size, __func__);
+ float clear_color[4] = {1.0f, 0.5f, 0.0f, 0.0f};
+
+ GPUTexture *tex = GPU_texture_create_cube(cube_size, GPU_RGBA16F, source_pix, NULL);
+ MEM_freeN(source_pix);
+
+ GPU_texture_bind(tex, 0);
+ GPU_texture_generate_mipmap(tex);
+ glTexParameteri(GPU_texture_target(tex), GL_TEXTURE_BASE_LEVEL, 0);
+ glTexParameteri(GPU_texture_target(tex), GL_TEXTURE_MAX_LEVEL, 0);
+ GPU_texture_unbind(tex);
+
+ GPUFrameBuffer *fb = GPU_framebuffer_create();
+ GPU_framebuffer_texture_attach(fb, tex, 0, 1);
+ GPU_framebuffer_bind(fb);
+ GPU_framebuffer_clear_color(fb, clear_color);
+ GPU_framebuffer_restore();
+ GPU_framebuffer_free(fb);
+
+ float *data = GPU_texture_read(tex, GPU_DATA_FLOAT, 1);
+ GG.mip_render_workaround = !equals_v4v4(clear_color, data);
+
+ MEM_freeN(data);
+ GPU_texture_free(tex);
+}
+
/* GPU Types */
bool GPU_type_matches(GPUDeviceType device, GPUOSType os, GPUDriverType driver)
@@ -106,6 +151,21 @@ int GPU_max_textures(void)
return GG.maxtextures;
}
+int GPU_max_textures_frag(void)
+{
+ return GG.maxtexturesfrag;
+}
+
+int GPU_max_textures_geom(void)
+{
+ return GG.maxtexturesgeom;
+}
+
+int GPU_max_textures_vert(void)
+{
+ return GG.maxtexturesvert;
+}
+
float GPU_max_texture_anisotropy(void)
{
return GG.max_anisotropy;
@@ -131,11 +191,26 @@ int GPU_max_ubo_size(void)
return GG.maxubosize;
}
+float GPU_max_line_width(void)
+{
+ return GG.line_width_range[1];
+}
+
void GPU_get_dfdy_factors(float fac[2])
{
copy_v2_v2(fac, GG.dfdyfactors);
}
+bool GPU_mip_render_workaround(void)
+{
+ return GG.mip_render_workaround;
+}
+
+bool GPU_depth_blitting_workaround(void)
+{
+ return GG.depth_blitting_workaround;
+}
+
void gpu_extensions_init(void)
{
/* during 2.8 development each platform has its own OpenGL minimum requirements
@@ -144,7 +219,10 @@ void gpu_extensions_init(void)
*/
BLI_assert(GLEW_VERSION_3_3);
- glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &GG.maxtextures);
+ glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &GG.maxtexturesfrag);
+ glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &GG.maxtexturesvert);
+ glGetIntegerv(GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, &GG.maxtexturesgeom);
+ glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &GG.maxtextures);
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &GG.maxtexsize);
glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &GG.maxtexlayers);
@@ -158,6 +236,8 @@ void gpu_extensions_init(void)
glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_BLOCKS, &GG.maxubobinds);
glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &GG.maxubosize);
+ glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, GG.line_width_range);
+
#ifndef NDEBUG
GLint ret;
glBindFramebuffer(GL_FRAMEBUFFER, 0);
@@ -172,9 +252,7 @@ void gpu_extensions_init(void)
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_FRONT_LEFT, GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE, &b);
GG.colordepth = r + g + b; /* Assumes same depth for RGB. */
- if (GLEW_VERSION_3_2 || GLEW_ARB_texture_multisample) {
- glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &GG.samples_color_texture_max);
- }
+ glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &GG.samples_color_texture_max);
const char *vendor = (const char *)glGetString(GL_VENDOR);
const char *renderer = (const char *)glGetString(GL_RENDERER);
@@ -183,6 +261,12 @@ void gpu_extensions_init(void)
if (strstr(vendor, "ATI") || strstr(vendor, "AMD")) {
GG.device = GPU_DEVICE_ATI;
GG.driver = GPU_DRIVER_OFFICIAL;
+
+#if defined(__APPLE__)
+ if (strstr(renderer, "AMD Radeon Pro") || strstr(renderer, "AMD Radeon R9")) {
+ GG.depth_blitting_workaround = true;
+ }
+#endif
}
else if (strstr(vendor, "NVIDIA")) {
GG.device = GPU_DEVICE_NVIDIA;
@@ -234,6 +318,7 @@ void gpu_extensions_init(void)
GG.os = GPU_OS_UNIX;
#endif
+ gpu_detect_mip_render_workaround();
/* df/dy calculation factors, those are dependent on driver */
if ((strstr(vendor, "ATI") && strstr(version, "3.3.10750"))) {
@@ -265,18 +350,6 @@ void gpu_extensions_exit(void)
GPU_invalid_tex_free();
}
-bool GPU_full_non_power_of_two_support(void)
-{
- /* always supported on full GL but still relevant for OpenGL ES 2.0 where
- * NPOT textures can't use mipmaps or repeat wrap mode */
- return true;
-}
-
-bool GPU_bicubic_bump_support(void)
-{
- return GLEW_VERSION_4_0 || (GLEW_ARB_texture_query_lod && GLEW_VERSION_3_0);
-}
-
int GPU_color_depth(void)
{
return GG.colordepth;
diff --git a/source/blender/gpu/intern/gpu_framebuffer.c b/source/blender/gpu/intern/gpu_framebuffer.c
index 21bfae00faa..f92899f91a0 100644
--- a/source/blender/gpu/intern/gpu_framebuffer.c
+++ b/source/blender/gpu/intern/gpu_framebuffer.c
@@ -75,7 +75,7 @@ struct GPUFrameBuffer {
int width, height;
bool multisample;
/* TODO Check that we always use the right context when binding
- * (FBOs are not shared accross ogl contexts). */
+ * (FBOs are not shared across ogl contexts). */
// void *ctx;
};
@@ -101,6 +101,7 @@ static GPUAttachmentType attachment_type_from_tex(GPUTexture *tex, int slot)
case GPU_DEPTH_COMPONENT16:
return GPU_FB_DEPTH_ATTACHMENT;
case GPU_DEPTH24_STENCIL8:
+ case GPU_DEPTH32F_STENCIL8:
return GPU_FB_DEPTH_STENCIL_ATTACHMENT;
default:
return GPU_FB_COLOR_ATTACHMENT0 + slot;
@@ -198,7 +199,7 @@ GPUFrameBuffer *GPU_framebuffer_create(void)
{
/* We generate the FB object later at first use in order to
* create the framebuffer in the right opengl context. */
- return MEM_callocN(sizeof(GPUFrameBuffer), "GPUFrameBuffer");;
+ return MEM_callocN(sizeof(GPUFrameBuffer), "GPUFrameBuffer");
}
static void gpu_framebuffer_init(GPUFrameBuffer *fb)
@@ -415,6 +416,31 @@ static void gpu_framebuffer_update_attachments(GPUFrameBuffer *fb)
glDrawBuffer(GL_NONE);
}
+
+#define FRAMEBUFFER_STACK_DEPTH 16
+
+static struct {
+ GPUFrameBuffer *framebuffers[FRAMEBUFFER_STACK_DEPTH];
+ uint top;
+} FrameBufferStack = { 0 };
+
+static void gpuPushFrameBuffer(GPUFrameBuffer *fbo)
+{
+ BLI_assert(FrameBufferStack.top < FRAMEBUFFER_STACK_DEPTH);
+ FrameBufferStack.framebuffers[FrameBufferStack.top] = fbo;
+ FrameBufferStack.top++;
+}
+
+static GPUFrameBuffer *gpuPopFrameBuffer(void)
+{
+ BLI_assert(FrameBufferStack.top > 0);
+ FrameBufferStack.top--;
+ return FrameBufferStack.framebuffers[FrameBufferStack.top];
+}
+
+#undef FRAMEBUFFER_STACK_DEPTH
+
+
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
{
if (fb->object == 0)
@@ -487,7 +513,7 @@ void GPU_framebuffer_viewport_set(GPUFrameBuffer *fb, int x, int y, int w, int h
void GPU_framebuffer_clear(
GPUFrameBuffer *fb, GPUFrameBufferBits buffers,
- const float clear_col[4], float clear_depth, unsigned int clear_stencil)
+ const float clear_col[4], float clear_depth, uint clear_stencil)
{
CHECK_FRAMEBUFFER_IS_BOUND(fb);
@@ -605,10 +631,14 @@ void GPU_framebuffer_blit(
if (fb_write == prev_fb) {
GPU_framebuffer_bind(fb_write); /* To update drawbuffers */
}
- else {
+ else if (prev_fb) {
glBindFramebuffer(GL_FRAMEBUFFER, prev_fb->object);
gpu_framebuffer_current_set(prev_fb);
}
+ else {
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ gpu_framebuffer_current_set(NULL);
+ }
}
/**
@@ -628,6 +658,9 @@ void GPU_framebuffer_recursive_downsample(
GPUFrameBuffer *prev_fb = GPU_framebuffer_active_get();
gpu_framebuffer_current_set(NULL);
+ int levels = floor(log2(max_ii(fb->width, fb->height)));
+ max_lvl = min_ii(max_lvl, levels);
+
int i;
int current_dim[2] = {fb->width, fb->height};
for (i = 1; i < max_lvl + 1; i++) {
@@ -637,11 +670,15 @@ void GPU_framebuffer_recursive_downsample(
for (GPUAttachmentType type = 0; type < GPU_FB_MAX_ATTACHEMENT; ++type) {
if (fb->attachments[type].tex != NULL) {
+ /* Some Intel HDXXX have issue with rendering to a mipmap that is below
+ * the texture GL_TEXTURE_MAX_LEVEL. So even if it not correct, in this case
+ * we allow GL_TEXTURE_MAX_LEVEL to be one level lower. In practice it does work! */
+ int next_lvl = (GPU_mip_render_workaround()) ? i : i - 1;
/* bind next level for rendering but first restrict fetches only to previous level */
GPUTexture *tex = fb->attachments[type].tex;
GPU_texture_bind(tex, 0);
glTexParameteri(GPU_texture_target(tex), GL_TEXTURE_BASE_LEVEL, i - 1);
- glTexParameteri(GPU_texture_target(tex), GL_TEXTURE_MAX_LEVEL, i - 1);
+ glTexParameteri(GPU_texture_target(tex), GL_TEXTURE_MAX_LEVEL, next_lvl);
GPU_texture_unbind(tex);
/* copy attachment and replace miplevel. */
GPUAttachment attachment = fb->attachments[type];
@@ -741,6 +778,8 @@ void GPU_offscreen_bind(GPUOffScreen *ofs, bool save)
{
if (save) {
gpuPushAttrib(GPU_SCISSOR_BIT | GPU_VIEWPORT_BIT);
+ GPUFrameBuffer *fb = GPU_framebuffer_active_get();
+ gpuPushFrameBuffer(fb);
}
glDisable(GL_SCISSOR_TEST);
GPU_framebuffer_bind(ofs->fb);
@@ -748,9 +787,18 @@ void GPU_offscreen_bind(GPUOffScreen *ofs, bool save)
void GPU_offscreen_unbind(GPUOffScreen *UNUSED(ofs), bool restore)
{
- GPU_framebuffer_restore();
+ GPUFrameBuffer *fb = NULL;
+
if (restore) {
gpuPopAttrib();
+ fb = gpuPopFrameBuffer();
+ }
+
+ if (fb) {
+ GPU_framebuffer_bind(fb);
+ }
+ else {
+ GPU_framebuffer_restore();
}
}
diff --git a/source/blender/gpu/intern/gpu_immediate.c b/source/blender/gpu/intern/gpu_immediate.c
index 32c30c3f924..a71ba68821b 100644
--- a/source/blender/gpu/intern/gpu_immediate.c
+++ b/source/blender/gpu/intern/gpu_immediate.c
@@ -412,56 +412,56 @@ static void setAttribValueBit(uint attrib_id)
/* --- generic attribute functions --- */
-void immAttrib1f(uint attrib_id, float x)
+void immAttr1f(uint attrib_id, float x)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_F32);
- assert(attrib->comp_len == 1);
+ assert(attr->comp_type == GPU_COMP_F32);
+ assert(attr->comp_len == 1);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- float *data = (float *)(imm.vertex_data + attrib->offset);
+ float *data = (float *)(imm.vertex_data + attr->offset);
/* printf("%s %td %p\n", __FUNCTION__, (GLubyte*)data - imm.buffer_data, data); */
data[0] = x;
}
-void immAttrib2f(uint attrib_id, float x, float y)
+void immAttr2f(uint attrib_id, float x, float y)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_F32);
- assert(attrib->comp_len == 2);
+ assert(attr->comp_type == GPU_COMP_F32);
+ assert(attr->comp_len == 2);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- float *data = (float *)(imm.vertex_data + attrib->offset);
+ float *data = (float *)(imm.vertex_data + attr->offset);
/* printf("%s %td %p\n", __FUNCTION__, (GLubyte*)data - imm.buffer_data, data); */
data[0] = x;
data[1] = y;
}
-void immAttrib3f(uint attrib_id, float x, float y, float z)
+void immAttr3f(uint attrib_id, float x, float y, float z)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_F32);
- assert(attrib->comp_len == 3);
+ assert(attr->comp_type == GPU_COMP_F32);
+ assert(attr->comp_len == 3);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- float *data = (float *)(imm.vertex_data + attrib->offset);
+ float *data = (float *)(imm.vertex_data + attr->offset);
/* printf("%s %td %p\n", __FUNCTION__, (GLubyte*)data - imm.buffer_data, data); */
data[0] = x;
@@ -469,19 +469,19 @@ void immAttrib3f(uint attrib_id, float x, float y, float z)
data[2] = z;
}
-void immAttrib4f(uint attrib_id, float x, float y, float z, float w)
+void immAttr4f(uint attrib_id, float x, float y, float z, float w)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_F32);
- assert(attrib->comp_len == 4);
+ assert(attr->comp_type == GPU_COMP_F32);
+ assert(attr->comp_len == 4);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- float *data = (float *)(imm.vertex_data + attrib->offset);
+ float *data = (float *)(imm.vertex_data + attr->offset);
/* printf("%s %td %p\n", __FUNCTION__, (GLubyte*)data - imm.buffer_data, data); */
data[0] = x;
@@ -490,87 +490,87 @@ void immAttrib4f(uint attrib_id, float x, float y, float z, float w)
data[3] = w;
}
-void immAttrib1u(uint attrib_id, uint x)
+void immAttr1u(uint attrib_id, uint x)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_U32);
- assert(attrib->comp_len == 1);
+ assert(attr->comp_type == GPU_COMP_U32);
+ assert(attr->comp_len == 1);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- uint *data = (uint *)(imm.vertex_data + attrib->offset);
+ uint *data = (uint *)(imm.vertex_data + attr->offset);
data[0] = x;
}
-void immAttrib2i(uint attrib_id, int x, int y)
+void immAttr2i(uint attrib_id, int x, int y)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_I32);
- assert(attrib->comp_len == 2);
+ assert(attr->comp_type == GPU_COMP_I32);
+ assert(attr->comp_len == 2);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- int *data = (int *)(imm.vertex_data + attrib->offset);
+ int *data = (int *)(imm.vertex_data + attr->offset);
data[0] = x;
data[1] = y;
}
-void immAttrib2s(uint attrib_id, short x, short y)
+void immAttr2s(uint attrib_id, short x, short y)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_I16);
- assert(attrib->comp_len == 2);
+ assert(attr->comp_type == GPU_COMP_I16);
+ assert(attr->comp_len == 2);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- short *data = (short *)(imm.vertex_data + attrib->offset);
+ short *data = (short *)(imm.vertex_data + attr->offset);
data[0] = x;
data[1] = y;
}
-void immAttrib2fv(uint attrib_id, const float data[2])
+void immAttr2fv(uint attrib_id, const float data[2])
{
- immAttrib2f(attrib_id, data[0], data[1]);
+ immAttr2f(attrib_id, data[0], data[1]);
}
-void immAttrib3fv(uint attrib_id, const float data[3])
+void immAttr3fv(uint attrib_id, const float data[3])
{
- immAttrib3f(attrib_id, data[0], data[1], data[2]);
+ immAttr3f(attrib_id, data[0], data[1], data[2]);
}
-void immAttrib4fv(uint attrib_id, const float data[4])
+void immAttr4fv(uint attrib_id, const float data[4])
{
- immAttrib4f(attrib_id, data[0], data[1], data[2], data[3]);
+ immAttr4f(attrib_id, data[0], data[1], data[2], data[3]);
}
-void immAttrib3ub(uint attrib_id, unsigned char r, unsigned char g, unsigned char b)
+void immAttr3ub(uint attrib_id, uchar r, uchar g, uchar b)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_U8);
- assert(attrib->comp_len == 3);
+ assert(attr->comp_type == GPU_COMP_U8);
+ assert(attr->comp_len == 3);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- GLubyte *data = imm.vertex_data + attrib->offset;
+ GLubyte *data = imm.vertex_data + attr->offset;
/* printf("%s %td %p\n", __FUNCTION__, data - imm.buffer_data, data); */
data[0] = r;
@@ -578,19 +578,19 @@ void immAttrib3ub(uint attrib_id, unsigned char r, unsigned char g, unsigned cha
data[2] = b;
}
-void immAttrib4ub(uint attrib_id, unsigned char r, unsigned char g, unsigned char b, unsigned char a)
+void immAttr4ub(uint attrib_id, uchar r, uchar g, uchar b, uchar a)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_U8);
- assert(attrib->comp_len == 4);
+ assert(attr->comp_type == GPU_COMP_U8);
+ assert(attr->comp_len == 4);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- GLubyte *data = imm.vertex_data + attrib->offset;
+ GLubyte *data = imm.vertex_data + attr->offset;
/* printf("%s %td %p\n", __FUNCTION__, data - imm.buffer_data, data); */
data[0] = r;
@@ -599,17 +599,17 @@ void immAttrib4ub(uint attrib_id, unsigned char r, unsigned char g, unsigned cha
data[3] = a;
}
-void immAttrib3ubv(uint attrib_id, const unsigned char data[3])
+void immAttr3ubv(uint attrib_id, const uchar data[3])
{
- immAttrib3ub(attrib_id, data[0], data[1], data[2]);
+ immAttr3ub(attrib_id, data[0], data[1], data[2]);
}
-void immAttrib4ubv(uint attrib_id, const unsigned char data[4])
+void immAttr4ubv(uint attrib_id, const uchar data[4])
{
- immAttrib4ub(attrib_id, data[0], data[1], data[2], data[3]);
+ immAttr4ub(attrib_id, data[0], data[1], data[2], data[3]);
}
-void immSkipAttrib(uint attrib_id)
+void immAttrSkip(uint attrib_id)
{
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
@@ -652,49 +652,49 @@ static void immEndVertex(void) /* and move on to the next vertex */
void immVertex2f(uint attrib_id, float x, float y)
{
- immAttrib2f(attrib_id, x, y);
+ immAttr2f(attrib_id, x, y);
immEndVertex();
}
void immVertex3f(uint attrib_id, float x, float y, float z)
{
- immAttrib3f(attrib_id, x, y, z);
+ immAttr3f(attrib_id, x, y, z);
immEndVertex();
}
void immVertex4f(uint attrib_id, float x, float y, float z, float w)
{
- immAttrib4f(attrib_id, x, y, z, w);
+ immAttr4f(attrib_id, x, y, z, w);
immEndVertex();
}
void immVertex2i(uint attrib_id, int x, int y)
{
- immAttrib2i(attrib_id, x, y);
+ immAttr2i(attrib_id, x, y);
immEndVertex();
}
void immVertex2s(uint attrib_id, short x, short y)
{
- immAttrib2s(attrib_id, x, y);
+ immAttr2s(attrib_id, x, y);
immEndVertex();
}
void immVertex2fv(uint attrib_id, const float data[2])
{
- immAttrib2f(attrib_id, data[0], data[1]);
+ immAttr2f(attrib_id, data[0], data[1]);
immEndVertex();
}
void immVertex3fv(uint attrib_id, const float data[3])
{
- immAttrib3f(attrib_id, data[0], data[1], data[2]);
+ immAttr3f(attrib_id, data[0], data[1], data[2]);
immEndVertex();
}
void immVertex2iv(uint attrib_id, const int data[2])
{
- immAttrib2i(attrib_id, data[0], data[1]);
+ immAttr2i(attrib_id, data[0], data[1]);
immEndVertex();
}
@@ -847,29 +847,29 @@ void immUniformColor3fvAlpha(const float rgb[3], float a)
/* TODO: v-- treat as sRGB? --v */
-void immUniformColor3ub(unsigned char r, unsigned char g, unsigned char b)
+void immUniformColor3ub(uchar r, uchar g, uchar b)
{
const float scale = 1.0f / 255.0f;
immUniformColor4f(scale * r, scale * g, scale * b, 1.0f);
}
-void immUniformColor4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
+void immUniformColor4ub(uchar r, uchar g, uchar b, uchar a)
{
const float scale = 1.0f / 255.0f;
immUniformColor4f(scale * r, scale * g, scale * b, scale * a);
}
-void immUniformColor3ubv(const unsigned char rgb[3])
+void immUniformColor3ubv(const uchar rgb[3])
{
immUniformColor3ub(rgb[0], rgb[1], rgb[2]);
}
-void immUniformColor3ubvAlpha(const unsigned char rgb[3], unsigned char alpha)
+void immUniformColor3ubvAlpha(const uchar rgb[3], uchar alpha)
{
immUniformColor4ub(rgb[0], rgb[1], rgb[2], alpha);
}
-void immUniformColor4ubv(const unsigned char rgba[4])
+void immUniformColor4ubv(const uchar rgba[4])
{
immUniformColor4ub(rgba[0], rgba[1], rgba[2], rgba[3]);
}
@@ -918,7 +918,7 @@ void immUniformThemeColorBlend(int color_id1, int color_id2, float fac)
void immThemeColorShadeAlpha(int colorid, int coloffset, int alphaoffset)
{
- unsigned char col[4];
+ uchar col[4];
UI_GetThemeColorShadeAlpha4ubv(colorid, coloffset, alphaoffset, col);
immUniformColor4ub(col[0], col[1], col[2], col[3]);
}
diff --git a/source/blender/gpu/intern/gpu_immediate_util.c b/source/blender/gpu/intern/gpu_immediate_util.c
index 0a75bd17d8c..983c70281a2 100644
--- a/source/blender/gpu/intern/gpu_immediate_util.c
+++ b/source/blender/gpu/intern/gpu_immediate_util.c
@@ -89,35 +89,35 @@ void immRecti(uint pos, int x1, int y1, int x2, int y2)
void immRectf_fast_with_color(uint pos, uint col, float x1, float y1, float x2, float y2, const float color[4])
{
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x1, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x2, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x2, y2);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x1, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x2, y2);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x1, y2);
}
void immRecti_fast_with_color(uint pos, uint col, int x1, int y1, int x2, int y2, const float color[4])
{
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2i(pos, x1, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2i(pos, x2, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2i(pos, x2, y2);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2i(pos, x1, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2i(pos, x2, y2);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2i(pos, x1, y2);
}
@@ -144,7 +144,7 @@ void immRecti_complete(int x1, int y1, int x2, int y2, const float color[4])
*
* \param x color.
*/
-void imm_cpack(unsigned int x)
+void imm_cpack(uint x)
{
immUniformColor3ub(((x) & 0xFF),
(((x) >> 8) & 0xFF),
@@ -201,13 +201,39 @@ void imm_draw_circle_fill_aspect_2d(uint shdr_pos, float x, float y, float rad_x
imm_draw_circle(GPU_PRIM_TRI_FAN, shdr_pos, x, y, rad_x, rad_y, nsegments);
}
-/**
- * \note We could have `imm_draw_lined_disk_partial` but currently there is no need.
- */
+static void imm_draw_circle_partial(
+ GPUPrimType prim_type, uint pos, float x, float y,
+ float rad, int nsegments, float start, float sweep)
+{
+ /* shift & reverse angle, increase 'nsegments' to match gluPartialDisk */
+ const float angle_start = -(DEG2RADF(start)) + (float)(M_PI / 2);
+ const float angle_end = -(DEG2RADF(sweep) - angle_start);
+ nsegments += 1;
+ immBegin(prim_type, nsegments);
+ for (int i = 0; i < nsegments; ++i) {
+ const float angle = interpf(angle_start, angle_end, ((float)i / (float)(nsegments - 1)));
+ const float angle_sin = sinf(angle);
+ const float angle_cos = cosf(angle);
+ immVertex2f(pos, x + rad * angle_cos, y + rad * angle_sin);
+ }
+ immEnd();
+}
+
+void imm_draw_circle_partial_wire_2d(
+ uint pos, float x, float y,
+ float rad, int nsegments, float start, float sweep)
+{
+ imm_draw_circle_partial(GPU_PRIM_LINE_STRIP, pos, x, y, rad, nsegments, start, sweep);
+}
+
static void imm_draw_disk_partial(
- GPUPrimType prim_type, unsigned pos, float x, float y,
+ GPUPrimType prim_type, uint pos, float x, float y,
float rad_inner, float rad_outer, int nsegments, float start, float sweep)
{
+ /* to avoid artifacts */
+ const float max_angle = 3 * 360;
+ CLAMP(sweep, -max_angle, max_angle);
+
/* shift & reverse angle, increase 'nsegments' to match gluPartialDisk */
const float angle_start = -(DEG2RADF(start)) + (float)(M_PI / 2);
const float angle_end = -(DEG2RADF(sweep) - angle_start);
@@ -239,14 +265,14 @@ static void imm_draw_disk_partial(
* \param sweep: Specifies the sweep angle, in degrees, of the disk portion.
*/
void imm_draw_disk_partial_fill_2d(
- unsigned pos, float x, float y,
+ uint pos, float x, float y,
float rad_inner, float rad_outer, int nsegments, float start, float sweep)
{
imm_draw_disk_partial(GPU_PRIM_TRI_STRIP, pos, x, y, rad_inner, rad_outer, nsegments, start, sweep);
}
static void imm_draw_circle_3D(
- GPUPrimType prim_type, unsigned pos, float x, float y,
+ GPUPrimType prim_type, uint pos, float x, float y,
float rad, int nsegments)
{
immBegin(prim_type, nsegments);
@@ -257,12 +283,12 @@ static void imm_draw_circle_3D(
immEnd();
}
-void imm_draw_circle_wire_3d(unsigned pos, float x, float y, float rad, int nsegments)
+void imm_draw_circle_wire_3d(uint pos, float x, float y, float rad, int nsegments)
{
imm_draw_circle_3D(GPU_PRIM_LINE_LOOP, pos, x, y, rad, nsegments);
}
-void imm_draw_circle_fill_3d(unsigned pos, float x, float y, float rad, int nsegments)
+void imm_draw_circle_fill_3d(uint pos, float x, float y, float rad, int nsegments)
{
imm_draw_circle_3D(GPU_PRIM_TRI_FAN, pos, x, y, rad, nsegments);
}
@@ -276,7 +302,7 @@ void imm_draw_circle_fill_3d(unsigned pos, float x, float y, float rad, int nseg
* \param x2 right.
* \param y2 top.
*/
-void imm_draw_box_wire_2d(unsigned pos, float x1, float y1, float x2, float y2)
+void imm_draw_box_wire_2d(uint pos, float x1, float y1, float x2, float y2)
{
immBegin(GPU_PRIM_LINE_LOOP, 4);
immVertex2f(pos, x1, y1);
@@ -286,7 +312,7 @@ void imm_draw_box_wire_2d(unsigned pos, float x1, float y1, float x2, float y2)
immEnd();
}
-void imm_draw_box_wire_3d(unsigned pos, float x1, float y1, float x2, float y2)
+void imm_draw_box_wire_3d(uint pos, float x1, float y1, float x2, float y2)
{
/* use this version when GPUVertFormat has a vec3 position */
immBegin(GPU_PRIM_LINE_LOOP, 4);
@@ -364,7 +390,7 @@ void imm_draw_cube_wire_3d(uint pos, const float co[3], const float aspect[3])
* \param stacks Specifies the number of subdivisions along the z axis.
*/
void imm_draw_cylinder_fill_normal_3d(
- unsigned int pos, unsigned int nor, float base, float top, float height, int slices, int stacks)
+ uint pos, uint nor, float base, float top, float height, int slices, int stacks)
{
immBegin(GPU_PRIM_TRIS, 6 * slices * stacks);
for (int i = 0; i < slices; ++i) {
@@ -399,23 +425,23 @@ void imm_draw_cylinder_fill_normal_3d(
n2[0] = cos2; n2[1] = sin2; n2[2] = 1 - n2[2];
/* first tri */
- immAttrib3fv(nor, n2);
+ immAttr3fv(nor, n2);
immVertex3fv(pos, v1);
immVertex3fv(pos, v2);
- immAttrib3fv(nor, n1);
+ immAttr3fv(nor, n1);
immVertex3fv(pos, v3);
/* second tri */
immVertex3fv(pos, v3);
immVertex3fv(pos, v4);
- immAttrib3fv(nor, n2);
+ immAttr3fv(nor, n2);
immVertex3fv(pos, v1);
}
}
immEnd();
}
-void imm_draw_cylinder_wire_3d(unsigned int pos, float base, float top, float height, int slices, int stacks)
+void imm_draw_cylinder_wire_3d(uint pos, float base, float top, float height, int slices, int stacks)
{
immBegin(GPU_PRIM_LINES, 6 * slices * stacks);
for (int i = 0; i < slices; ++i) {
@@ -452,7 +478,7 @@ void imm_draw_cylinder_wire_3d(unsigned int pos, float base, float top, float he
immEnd();
}
-void imm_draw_cylinder_fill_3d(unsigned int pos, float base, float top, float height, int slices, int stacks)
+void imm_draw_cylinder_fill_3d(uint pos, float base, float top, float height, int slices, int stacks)
{
immBegin(GPU_PRIM_TRIS, 6 * slices * stacks);
for (int i = 0; i < slices; ++i) {
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index b03df2c643c..1002e6f483c 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -58,10 +58,6 @@
#include "gpu_codegen.h"
-#ifdef WITH_OPENSUBDIV
-# include "BKE_DerivedMesh.h"
-#endif
-
/* Structs */
#define MAX_COLOR_BAND 128
@@ -71,12 +67,9 @@ typedef struct GPUColorBandBuilder {
} GPUColorBandBuilder;
struct GPUMaterial {
- Scene *scene; /* DEPRECATED was only usefull for lamps */
+ Scene *scene; /* DEPRECATED was only useful for lamps */
Material *ma;
- /* material for mesh surface, worlds or something else.
- * some code generation is done differently depending on the use case */
- int type; /* DEPRECATED */
GPUMaterialStatus status;
const void *engine_type; /* attached engine type */
@@ -108,8 +101,6 @@ struct GPUMaterial {
int objectinfoloc;
- bool is_opensubdiv;
-
/* XXX: Should be in Material. But it depends on the output node
* used and since the output selection is difference for GPUMaterial...
*/
@@ -147,12 +138,13 @@ enum {
/* Functions */
-/* Returns the adress of the future pointer to coba_tex */
+/* Returns the address of the future pointer to coba_tex */
GPUTexture **gpu_material_ramp_texture_row_set(GPUMaterial *mat, int size, float *pixels, float *row)
{
/* In order to put all the colorbands into one 1D array texture,
* we need them to be the same size. */
BLI_assert(size == CM_TABLE + 1);
+ UNUSED_VARS_NDEBUG(size);
if (mat->coba_builder == NULL) {
mat->coba_builder = MEM_mallocN(sizeof(GPUColorBandBuilder), "GPUColorBandBuilder");
@@ -233,11 +225,6 @@ Scene *GPU_material_scene(GPUMaterial *material)
return material->scene;
}
-GPUMatType GPU_Material_get_type(GPUMaterial *material)
-{
- return material->type;
-}
-
GPUPass *GPU_material_get_pass(GPUMaterial *material)
{
return material->pass;
@@ -472,7 +459,7 @@ static void compute_sss_translucence_kernel(
/* Distance from surface. */
float d = kd->max_radius * ((float)i + 0.00001f) / ((float)resolution);
- /* For each distance d we compute the radiance incomming from an hypothetic parallel plane. */
+ /* For each distance d we compute the radiance incoming from an hypothetic parallel plane. */
/* Compute radius of the footprint on the hypothetic plane */
float r_fp = sqrtf(kd->max_radius * kd->max_radius - d * d);
float r_step = r_fp / INTEGRAL_RESOLUTION;
@@ -487,7 +474,7 @@ static void compute_sss_translucence_kernel(
profile[1] = eval_profile(dist, falloff_type, sharpness, kd->param[1]);
profile[2] = eval_profile(dist, falloff_type, sharpness, kd->param[2]);
- /* Since the profile and configuration are radially symetrical we
+ /* Since the profile and configuration are radially symmetrical we
* can just evaluate it once and weight it accordingly */
float r_next = r + r_step;
float disk_area = (M_PI * r_next * r_next) - (M_PI * r * r);
@@ -573,6 +560,11 @@ struct GPUUniformBuffer *GPU_material_sss_profile_get(GPUMaterial *material, int
return material->sss_profile;
}
+struct GPUUniformBuffer *GPU_material_create_sss_profile_ubo(void)
+{
+ return GPU_uniformbuffer_create(sizeof(GPUSssKernelData), NULL, NULL);
+}
+
#undef SSS_EXPONENT
#undef SSS_SAMPLES
@@ -659,7 +651,7 @@ GPUMaterial *GPU_material_from_nodetree(
BLI_assert(GPU_material_from_nodetree_find(gpumaterials, engine_type, options) == NULL);
/* allocate material */
- GPUMaterial *mat = MEM_callocN(sizeof(GPUMaterial), "GPUMaterial");;
+ GPUMaterial *mat = MEM_callocN(sizeof(GPUMaterial), "GPUMaterial");
mat->scene = scene;
mat->engine_type = engine_type;
mat->options = options;
@@ -688,11 +680,12 @@ GPUMaterial *GPU_material_from_nodetree(
GPU_nodes_prune(&mat->nodes, mat->outlink);
GPU_nodes_get_vertex_attributes(&mat->nodes, &mat->attribs);
/* Create source code and search pass cache for an already compiled version. */
- mat->pass = GPU_generate_pass_new(
+ mat->pass = GPU_generate_pass(
mat,
mat->outlink,
&mat->attribs,
&mat->nodes,
+ &mat->builtins,
vert_code,
geom_code,
frag_lib,
diff --git a/source/blender/gpu/intern/gpu_matrix.c b/source/blender/gpu/intern/gpu_matrix.c
index 0fa4a158c00..5ab8086397c 100644
--- a/source/blender/gpu/intern/gpu_matrix.c
+++ b/source/blender/gpu/intern/gpu_matrix.c
@@ -50,7 +50,7 @@ typedef float Mat3[3][3];
typedef struct MatrixStack {
Mat4 stack[MATRIX_STACK_DEPTH];
- unsigned int top;
+ uint top;
} MatrixStack;
typedef struct {
diff --git a/source/blender/gpu/intern/gpu_select_private.h b/source/blender/gpu/intern/gpu_select_private.h
index 8935bd7b253..d6c02d5b3ea 100644
--- a/source/blender/gpu/intern/gpu_select_private.h
+++ b/source/blender/gpu/intern/gpu_select_private.h
@@ -33,9 +33,9 @@
#define __GPU_SELECT_PRIVATE_H__
/* gpu_select_pick */
-void gpu_select_pick_begin(unsigned int (*buffer)[4], unsigned int bufsize, const rcti *input, char mode);
-bool gpu_select_pick_load_id(unsigned int id);
-unsigned int gpu_select_pick_end(void);
+void gpu_select_pick_begin(uint (*buffer)[4], uint bufsize, const rcti *input, char mode);
+bool gpu_select_pick_load_id(uint id);
+uint gpu_select_pick_end(void);
void gpu_select_pick_cache_begin(void);
void gpu_select_pick_cache_end(void);
@@ -43,11 +43,11 @@ bool gpu_select_pick_is_cached(void);
void gpu_select_pick_cache_load_id(void);
/* gpu_select_sample_query */
-void gpu_select_query_begin(unsigned int (*buffer)[4], unsigned int bufsize, const rcti *input, char mode, int oldhits);
-bool gpu_select_query_load_id(unsigned int id);
-unsigned int gpu_select_query_end(void);
+void gpu_select_query_begin(uint (*buffer)[4], uint bufsize, const rcti *input, char mode, int oldhits);
+bool gpu_select_query_load_id(uint id);
+uint gpu_select_query_end(void);
-#define SELECT_ID_NONE ((unsigned int)0xffffffff)
+#define SELECT_ID_NONE ((uint)0xffffffff)
#endif /* __GPU_SELECT_PRIVATE_H__ */
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index 1bfa0788f00..d428e2f9bd9 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -127,6 +127,7 @@ extern char datatoc_gpu_shader_point_uniform_color_frag_glsl[];
extern char datatoc_gpu_shader_point_uniform_color_aa_frag_glsl[];
extern char datatoc_gpu_shader_point_uniform_color_outline_aa_frag_glsl[];
extern char datatoc_gpu_shader_point_varying_color_outline_aa_frag_glsl[];
+extern char datatoc_gpu_shader_point_varying_color_varying_outline_aa_frag_glsl[];
extern char datatoc_gpu_shader_point_varying_color_frag_glsl[];
extern char datatoc_gpu_shader_3D_point_fixed_size_varying_color_vert_glsl[];
extern char datatoc_gpu_shader_3D_point_varying_size_vert_glsl[];
@@ -138,6 +139,12 @@ extern char datatoc_gpu_shader_2D_point_uniform_size_aa_vert_glsl[];
extern char datatoc_gpu_shader_2D_point_uniform_size_outline_aa_vert_glsl[];
extern char datatoc_gpu_shader_2D_point_uniform_size_varying_color_outline_aa_vert_glsl[];
+extern char datatoc_gpu_shader_2D_edituvs_points_vert_glsl[];
+extern char datatoc_gpu_shader_2D_edituvs_facedots_vert_glsl[];
+extern char datatoc_gpu_shader_2D_edituvs_edges_vert_glsl[];
+extern char datatoc_gpu_shader_2D_edituvs_faces_vert_glsl[];
+extern char datatoc_gpu_shader_2D_edituvs_stretch_vert_glsl[];
+
extern char datatoc_gpu_shader_2D_line_dashed_uniform_color_vert_glsl[];
extern char datatoc_gpu_shader_2D_line_dashed_frag_glsl[];
extern char datatoc_gpu_shader_2D_line_dashed_geom_glsl[];
@@ -160,10 +167,6 @@ extern char datatoc_gpu_shader_text_simple_geom_glsl[];
extern char datatoc_gpu_shader_keyframe_diamond_vert_glsl[];
extern char datatoc_gpu_shader_keyframe_diamond_frag_glsl[];
-extern char datatoc_gpu_shader_fire_frag_glsl[];
-extern char datatoc_gpu_shader_smoke_vert_glsl[];
-extern char datatoc_gpu_shader_smoke_frag_glsl[];
-
extern char datatoc_gpu_shader_gpencil_stroke_vert_glsl[];
extern char datatoc_gpu_shader_gpencil_stroke_frag_glsl[];
extern char datatoc_gpu_shader_gpencil_stroke_geom_glsl[];
@@ -227,7 +230,17 @@ static void gpu_shader_standard_extensions(char defines[MAX_EXT_DEFINE_LENGTH])
* is reported to be supported but yield a compile error (see T55802). */
if (!GPU_type_matches(GPU_DEVICE_NVIDIA, GPU_OS_ANY, GPU_DRIVER_ANY) || GLEW_VERSION_4_0) {
strcat(defines, "#extension GL_ARB_texture_gather: enable\n");
- strcat(defines, "#define GPU_ARB_texture_gather\n");
+
+ /* Some drivers don't agree on GLEW_ARB_texture_gather and the actual support in the
+ * shader so double check the preprocessor define (see T56544). */
+ if (!GPU_type_matches(GPU_DEVICE_NVIDIA, GPU_OS_ANY, GPU_DRIVER_ANY) && !GLEW_VERSION_4_0) {
+ strcat(defines, "#ifdef GL_ARB_texture_gather\n");
+ strcat(defines, "# define GPU_ARB_texture_gather\n");
+ strcat(defines, "#endif\n");
+ }
+ else {
+ strcat(defines, "#define GPU_ARB_texture_gather\n");
+ }
}
}
if (GLEW_ARB_texture_query_lod) {
@@ -236,9 +249,7 @@ static void gpu_shader_standard_extensions(char defines[MAX_EXT_DEFINE_LENGTH])
}
}
-static void gpu_shader_standard_defines(
- char defines[MAX_DEFINE_LENGTH],
- bool use_opensubdiv)
+static void gpu_shader_standard_defines(char defines[MAX_DEFINE_LENGTH])
{
/* some useful defines to detect GPU type */
if (GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_ANY, GPU_DRIVER_ANY))
@@ -248,31 +259,6 @@ static void gpu_shader_standard_defines(
else if (GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_ANY, GPU_DRIVER_ANY))
strcat(defines, "#define GPU_INTEL\n");
- if (GPU_bicubic_bump_support())
- strcat(defines, "#define BUMP_BICUBIC\n");
-
-#ifdef WITH_OPENSUBDIV
- /* TODO(sergey): Check whether we actually compiling shader for
- * the OpenSubdiv mesh.
- */
- if (use_opensubdiv) {
- strcat(defines, "#define USE_OPENSUBDIV\n");
-
- /* TODO(sergey): not strictly speaking a define, but this is
- * a global typedef which we don't have better place to define
- * in yet.
- */
- strcat(defines,
- "struct VertexData {\n"
- " vec4 position;\n"
- " vec3 normal;\n"
- " vec2 uv;"
- "};\n");
- }
-#else
- UNUSED_VARS(use_opensubdiv);
-#endif
-
return;
}
@@ -290,7 +276,6 @@ GPUShader *GPU_shader_create(
geocode,
libcode,
defines,
- GPU_SHADER_FLAGS_NONE,
GPU_SHADER_TFB_NONE,
NULL,
0,
@@ -316,7 +301,7 @@ static void gpu_dump_shaders(const char **code, const int num_shaders, const cha
}
/* We use the same shader index for shaders in the same program.
- * So we call this function once before calling for the invidual shaders. */
+ * So we call this function once before calling for the individual shaders. */
static int shader_index = 0;
if (code == NULL) {
shader_index++;
@@ -350,18 +335,11 @@ GPUShader *GPU_shader_create_ex(
const char *geocode,
const char *libcode,
const char *defines,
- const int flags,
const GPUShaderTFBType tf_type,
const char **tf_names,
const int tf_count,
const char *shname)
{
-#ifdef WITH_OPENSUBDIV
- bool use_opensubdiv = (flags & GPU_SHADER_FLAGS_SPECIAL_OPENSUBDIV) != 0;
-#else
- UNUSED_VARS(flags);
- bool use_opensubdiv = false;
-#endif
GLint status;
GLchar log[5000];
GLsizei length = 0;
@@ -397,9 +375,7 @@ GPUShader *GPU_shader_create_ex(
return NULL;
}
- gpu_shader_standard_defines(
- standard_defines,
- use_opensubdiv);
+ gpu_shader_standard_defines(standard_defines);
gpu_shader_standard_extensions(standard_extensions);
if (vertexcode) {
@@ -439,19 +415,6 @@ GPUShader *GPU_shader_create_ex(
source[num_source++] = standard_extensions;
source[num_source++] = standard_defines;
-#ifdef WITH_OPENSUBDIV
- /* TODO(sergey): Move to fragment shader source code generation. */
- if (use_opensubdiv) {
- source[num_source++] = (
- "#ifdef USE_OPENSUBDIV\n"
- "in block {\n"
- " VertexData v;\n"
- "} inpt;\n"
- "#endif\n"
- );
- }
-#endif
-
if (defines) source[num_source++] = defines;
if (libcode) source[num_source++] = libcode;
source[num_source++] = fragcode;
@@ -501,13 +464,6 @@ GPUShader *GPU_shader_create_ex(
}
}
-#ifdef WITH_OPENSUBDIV
- if (use_opensubdiv) {
- glBindAttribLocation(shader->program, 0, "position");
- glBindAttribLocation(shader->program, 1, "normal");
- }
-#endif
-
if (tf_names != NULL) {
glTransformFeedbackVaryings(shader->program, tf_count, tf_names, GL_INTERLEAVED_ATTRIBS);
/* Primitive type must be setup */
@@ -531,29 +487,6 @@ GPUShader *GPU_shader_create_ex(
shader->interface = GPU_shaderinterface_create(shader->program);
-#ifdef WITH_OPENSUBDIV
- /* TODO(sergey): Find a better place for this. */
- if (use_opensubdiv) {
- if (GLEW_VERSION_4_1) {
- glProgramUniform1i(
- shader->program,
- GPU_shaderinterface_uniform(shader->interface, "FVarDataOffsetBuffer")->location,
- 30); /* GL_TEXTURE30 */
-
- glProgramUniform1i(
- shader->program,
- GPU_shaderinterface_uniform(shader->interface, "FVarDataBuffer")->location,
- 31); /* GL_TEXTURE31 */
- }
- else {
- glUseProgram(shader->program);
- glUniform1i(GPU_shaderinterface_uniform(shader->interface, "FVarDataOffsetBuffer")->location, 30);
- glUniform1i(GPU_shaderinterface_uniform(shader->interface, "FVarDataBuffer")->location, 31);
- glUseProgram(0);
- }
- }
-#endif
-
return shader;
}
@@ -575,7 +508,7 @@ void GPU_shader_unbind(void)
glUseProgram(0);
}
-bool GPU_shader_transform_feedback_enable(GPUShader *shader, unsigned int vbo_id)
+bool GPU_shader_transform_feedback_enable(GPUShader *shader, uint vbo_id)
{
if (shader->feedback_transform_type == GPU_SHADER_TFB_NONE) {
return false;
@@ -652,6 +585,14 @@ int GPU_shader_get_program(GPUShader *shader)
return (int)shader->program;
}
+void GPU_shader_uniform_float(GPUShader *UNUSED(shader), int location, float value)
+{
+ if (location == -1)
+ return;
+
+ glUniform1f(location, value);
+}
+
void GPU_shader_uniform_vector(GPUShader *UNUSED(shader), int location, int length, int arraysize, const float *value)
{
if (location == -1 || value == NULL)
@@ -718,251 +659,361 @@ int GPU_shader_get_attribute(GPUShader *shader, const char *name)
return attrib ? attrib->location : -1;
}
+static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
+ [GPU_SHADER_TEXT] =
+ { datatoc_gpu_shader_text_vert_glsl,
+ datatoc_gpu_shader_text_frag_glsl,
+ datatoc_gpu_shader_text_geom_glsl },
+ [GPU_SHADER_TEXT_SIMPLE] =
+ { datatoc_gpu_shader_text_simple_vert_glsl,
+ datatoc_gpu_shader_text_frag_glsl,
+ datatoc_gpu_shader_text_simple_geom_glsl },
+ [GPU_SHADER_KEYFRAME_DIAMOND] =
+ { datatoc_gpu_shader_keyframe_diamond_vert_glsl,
+ datatoc_gpu_shader_keyframe_diamond_frag_glsl },
+ [GPU_SHADER_EDGES_FRONT_BACK_PERSP] =
+ { datatoc_gpu_shader_edges_front_back_persp_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl, /* this version is */
+ datatoc_gpu_shader_edges_front_back_persp_geom_glsl }, /* magical but slooow */
+ [GPU_SHADER_EDGES_FRONT_BACK_ORTHO] =
+ { datatoc_gpu_shader_edges_front_back_ortho_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl },
+ [GPU_SHADER_EDGES_OVERLAY_SIMPLE] =
+ { datatoc_gpu_shader_3D_vert_glsl,
+ datatoc_gpu_shader_edges_overlay_frag_glsl,
+ datatoc_gpu_shader_edges_overlay_simple_geom_glsl },
+ [GPU_SHADER_EDGES_OVERLAY] =
+ { datatoc_gpu_shader_edges_overlay_vert_glsl,
+ datatoc_gpu_shader_edges_overlay_frag_glsl,
+ datatoc_gpu_shader_edges_overlay_geom_glsl },
+ [GPU_SHADER_SIMPLE_LIGHTING] =
+ { datatoc_gpu_shader_3D_normal_vert_glsl,
+ datatoc_gpu_shader_simple_lighting_frag_glsl },
+ /* Use 'USE_FLAT_NORMAL' to make flat shader from smooth */
+ [GPU_SHADER_SIMPLE_LIGHTING_FLAT_COLOR] =
+ { datatoc_gpu_shader_3D_normal_smooth_color_vert_glsl,
+ datatoc_gpu_shader_simple_lighting_smooth_color_frag_glsl },
+ [GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR] =
+ { datatoc_gpu_shader_3D_normal_smooth_color_vert_glsl,
+ datatoc_gpu_shader_simple_lighting_smooth_color_frag_glsl },
+ [GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR_ALPHA] =
+ { datatoc_gpu_shader_3D_normal_smooth_color_vert_glsl,
+ datatoc_gpu_shader_simple_lighting_smooth_color_alpha_frag_glsl },
+
+ [GPU_SHADER_2D_IMAGE_MASK_UNIFORM_COLOR] =
+ { datatoc_gpu_shader_3D_image_vert_glsl,
+ datatoc_gpu_shader_image_mask_uniform_color_frag_glsl },
+ [GPU_SHADER_3D_IMAGE_MODULATE_ALPHA] =
+ { datatoc_gpu_shader_3D_image_vert_glsl,
+ datatoc_gpu_shader_image_modulate_alpha_frag_glsl },
+ [GPU_SHADER_3D_IMAGE_DEPTH] =
+ { datatoc_gpu_shader_3D_image_vert_glsl,
+ datatoc_gpu_shader_image_depth_linear_frag_glsl },
+ [GPU_SHADER_3D_IMAGE_DEPTH_COPY] =
+ { datatoc_gpu_shader_3D_image_vert_glsl,
+ datatoc_gpu_shader_image_depth_copy_frag_glsl },
+ [GPU_SHADER_2D_IMAGE_MULTISAMPLE_2] =
+ { datatoc_gpu_shader_2D_vert_glsl,
+ datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
+ [GPU_SHADER_2D_IMAGE_MULTISAMPLE_4] =
+ { datatoc_gpu_shader_2D_vert_glsl,
+ datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
+ [GPU_SHADER_2D_IMAGE_MULTISAMPLE_8] =
+ { datatoc_gpu_shader_2D_vert_glsl,
+ datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
+ [GPU_SHADER_2D_IMAGE_MULTISAMPLE_16] =
+ { datatoc_gpu_shader_2D_vert_glsl,
+ datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
+ [GPU_SHADER_2D_IMAGE_MULTISAMPLE_2_DEPTH_TEST] =
+ { datatoc_gpu_shader_2D_vert_glsl,
+ datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
+ [GPU_SHADER_2D_IMAGE_MULTISAMPLE_4_DEPTH_TEST] =
+ { datatoc_gpu_shader_2D_vert_glsl,
+ datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
+ [GPU_SHADER_2D_IMAGE_MULTISAMPLE_8_DEPTH_TEST] =
+ { datatoc_gpu_shader_2D_vert_glsl,
+ datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
+ [GPU_SHADER_2D_IMAGE_MULTISAMPLE_16_DEPTH_TEST] =
+ { datatoc_gpu_shader_2D_vert_glsl,
+ datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
+
+ [GPU_SHADER_2D_IMAGE_INTERLACE] =
+ { datatoc_gpu_shader_2D_image_vert_glsl,
+ datatoc_gpu_shader_image_interlace_frag_glsl },
+ [GPU_SHADER_2D_CHECKER] =
+ { datatoc_gpu_shader_2D_vert_glsl,
+ datatoc_gpu_shader_checker_frag_glsl },
+
+ [GPU_SHADER_2D_DIAG_STRIPES] =
+ { datatoc_gpu_shader_2D_vert_glsl,
+ datatoc_gpu_shader_diag_stripes_frag_glsl },
+
+ [GPU_SHADER_2D_UNIFORM_COLOR] =
+ { datatoc_gpu_shader_2D_vert_glsl,
+ datatoc_gpu_shader_uniform_color_frag_glsl },
+ [GPU_SHADER_2D_FLAT_COLOR] =
+ { datatoc_gpu_shader_2D_flat_color_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl },
+ [GPU_SHADER_2D_SMOOTH_COLOR] =
+ { datatoc_gpu_shader_2D_smooth_color_vert_glsl,
+ datatoc_gpu_shader_2D_smooth_color_frag_glsl },
+ [GPU_SHADER_2D_SMOOTH_COLOR_DITHER] =
+ { datatoc_gpu_shader_2D_smooth_color_vert_glsl,
+ datatoc_gpu_shader_2D_smooth_color_dithered_frag_glsl },
+ [GPU_SHADER_2D_IMAGE_LINEAR_TO_SRGB] =
+ { datatoc_gpu_shader_2D_image_vert_glsl,
+ datatoc_gpu_shader_image_linear_frag_glsl },
+ [GPU_SHADER_2D_IMAGE] =
+ { datatoc_gpu_shader_2D_image_vert_glsl,
+ datatoc_gpu_shader_image_frag_glsl },
+ [GPU_SHADER_2D_IMAGE_COLOR] =
+ { datatoc_gpu_shader_2D_image_vert_glsl,
+ datatoc_gpu_shader_image_color_frag_glsl },
+ [GPU_SHADER_2D_IMAGE_DESATURATE_COLOR] =
+ { datatoc_gpu_shader_2D_image_vert_glsl,
+ datatoc_gpu_shader_image_desaturate_frag_glsl },
+ [GPU_SHADER_2D_IMAGE_ALPHA_COLOR] =
+ { datatoc_gpu_shader_2D_image_vert_glsl,
+ datatoc_gpu_shader_image_alpha_color_frag_glsl },
+ [GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR] =
+ { datatoc_gpu_shader_2D_image_vert_glsl,
+ datatoc_gpu_shader_image_shuffle_color_frag_glsl },
+ [GPU_SHADER_2D_IMAGE_RECT_COLOR] =
+ { datatoc_gpu_shader_2D_image_rect_vert_glsl,
+ datatoc_gpu_shader_image_color_frag_glsl },
+ [GPU_SHADER_2D_IMAGE_MULTI_RECT_COLOR] =
+ { datatoc_gpu_shader_2D_image_multi_rect_vert_glsl,
+ datatoc_gpu_shader_image_varying_color_frag_glsl },
+
+ [GPU_SHADER_3D_UNIFORM_COLOR] =
+ { datatoc_gpu_shader_3D_vert_glsl,
+ datatoc_gpu_shader_uniform_color_frag_glsl },
+ [GPU_SHADER_3D_UNIFORM_COLOR_U32] =
+ { datatoc_gpu_shader_3D_vert_glsl,
+ datatoc_gpu_shader_uniform_color_frag_glsl },
+ [GPU_SHADER_3D_FLAT_COLOR] =
+ { datatoc_gpu_shader_3D_flat_color_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl },
+ [GPU_SHADER_3D_FLAT_COLOR_U32] =
+ { datatoc_gpu_shader_3D_flat_color_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl },
+ [GPU_SHADER_3D_SMOOTH_COLOR] =
+ { datatoc_gpu_shader_3D_smooth_color_vert_glsl,
+ datatoc_gpu_shader_3D_smooth_color_frag_glsl },
+ [GPU_SHADER_3D_DEPTH_ONLY] =
+ { datatoc_gpu_shader_3D_vert_glsl,
+ datatoc_gpu_shader_depth_only_frag_glsl },
+ [GPU_SHADER_3D_CLIPPED_UNIFORM_COLOR] =
+ { datatoc_gpu_shader_3D_clipped_uniform_color_vert_glsl,
+ datatoc_gpu_shader_uniform_color_frag_glsl },
+
+ [GPU_SHADER_3D_GROUNDPOINT] =
+ { datatoc_gpu_shader_3D_groundpoint_vert_glsl,
+ datatoc_gpu_shader_point_uniform_color_frag_glsl },
+ [GPU_SHADER_3D_GROUNDLINE] =
+ { datatoc_gpu_shader_3D_passthrough_vert_glsl,
+ datatoc_gpu_shader_uniform_color_frag_glsl,
+ datatoc_gpu_shader_3D_groundline_geom_glsl },
+
+ [GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR] =
+ { datatoc_gpu_shader_2D_line_dashed_uniform_color_vert_glsl,
+ datatoc_gpu_shader_2D_line_dashed_frag_glsl,
+ datatoc_gpu_shader_2D_line_dashed_geom_glsl },
+ [GPU_SHADER_3D_LINE_DASHED_UNIFORM_COLOR] =
+ { datatoc_gpu_shader_3D_line_dashed_uniform_color_vert_glsl,
+ datatoc_gpu_shader_2D_line_dashed_frag_glsl,
+ datatoc_gpu_shader_2D_line_dashed_geom_glsl },
+
+ [GPU_SHADER_3D_OBJECTSPACE_SIMPLE_LIGHTING_VARIYING_COLOR] =
+ { datatoc_gpu_shader_instance_objectspace_variying_color_vert_glsl,
+ datatoc_gpu_shader_simple_lighting_frag_glsl},
+ [GPU_SHADER_3D_OBJECTSPACE_VARIYING_COLOR] =
+ { datatoc_gpu_shader_instance_objectspace_variying_color_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl},
+ [GPU_SHADER_3D_SCREENSPACE_VARIYING_COLOR] =
+ { datatoc_gpu_shader_instance_screenspace_variying_color_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl},
+ [GPU_SHADER_3D_INSTANCE_SCREEN_ALIGNED_AXIS] =
+ { datatoc_gpu_shader_instance_screen_aligned_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl},
+ [GPU_SHADER_3D_INSTANCE_SCREEN_ALIGNED] =
+ { datatoc_gpu_shader_instance_screen_aligned_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl},
+
+ [GPU_SHADER_CAMERA] =
+ { datatoc_gpu_shader_instance_camera_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl},
+ [GPU_SHADER_DISTANCE_LINES] =
+ { datatoc_gpu_shader_instance_distance_line_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl},
+
+ [GPU_SHADER_2D_POINT_FIXED_SIZE_UNIFORM_COLOR] =
+ { datatoc_gpu_shader_2D_vert_glsl,
+ datatoc_gpu_shader_point_uniform_color_frag_glsl },
+ [GPU_SHADER_2D_POINT_VARYING_SIZE_VARYING_COLOR] =
+ { datatoc_gpu_shader_2D_point_varying_size_varying_color_vert_glsl,
+ datatoc_gpu_shader_point_varying_color_frag_glsl },
+ [GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA] =
+ { datatoc_gpu_shader_2D_point_uniform_size_aa_vert_glsl,
+ datatoc_gpu_shader_point_uniform_color_aa_frag_glsl },
+ [GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_AA] =
+ { datatoc_gpu_shader_2D_point_uniform_size_outline_aa_vert_glsl,
+ datatoc_gpu_shader_point_uniform_color_outline_aa_frag_glsl },
+ [GPU_SHADER_2D_POINT_UNIFORM_SIZE_VARYING_COLOR_OUTLINE_AA] =
+ { datatoc_gpu_shader_2D_point_uniform_size_varying_color_outline_aa_vert_glsl,
+ datatoc_gpu_shader_point_varying_color_outline_aa_frag_glsl },
+ [GPU_SHADER_3D_POINT_FIXED_SIZE_UNIFORM_COLOR] =
+ { datatoc_gpu_shader_3D_vert_glsl,
+ datatoc_gpu_shader_point_uniform_color_frag_glsl },
+ [GPU_SHADER_3D_POINT_FIXED_SIZE_VARYING_COLOR] =
+ { datatoc_gpu_shader_3D_point_fixed_size_varying_color_vert_glsl,
+ datatoc_gpu_shader_point_varying_color_frag_glsl },
+ [GPU_SHADER_3D_POINT_VARYING_SIZE_UNIFORM_COLOR] =
+ { datatoc_gpu_shader_3D_point_varying_size_vert_glsl,
+ datatoc_gpu_shader_point_uniform_color_frag_glsl },
+ [GPU_SHADER_3D_POINT_VARYING_SIZE_VARYING_COLOR] =
+ { datatoc_gpu_shader_3D_point_varying_size_varying_color_vert_glsl,
+ datatoc_gpu_shader_point_varying_color_frag_glsl },
+ [GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA] =
+ { datatoc_gpu_shader_3D_point_uniform_size_aa_vert_glsl,
+ datatoc_gpu_shader_point_uniform_color_aa_frag_glsl },
+ [GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_AA] =
+ { datatoc_gpu_shader_3D_point_uniform_size_outline_aa_vert_glsl,
+ datatoc_gpu_shader_point_uniform_color_outline_aa_frag_glsl },
+
+ [GPU_SHADER_INSTANCE_UNIFORM_COLOR] =
+ { datatoc_gpu_shader_instance_vert_glsl,
+ datatoc_gpu_shader_uniform_color_frag_glsl },
+ [GPU_SHADER_INSTANCE_VARIYING_ID_VARIYING_SIZE] =
+ { datatoc_gpu_shader_instance_variying_size_variying_id_vert_glsl,
+ datatoc_gpu_shader_flat_id_frag_glsl },
+ [GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE] =
+ { datatoc_gpu_shader_instance_variying_size_variying_color_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl },
+ [GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SCALE] =
+ { datatoc_gpu_shader_instance_variying_size_variying_color_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl },
+ [GPU_SHADER_INSTANCE_EDGES_VARIYING_COLOR] =
+ { datatoc_gpu_shader_instance_edges_variying_color_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl,
+ datatoc_gpu_shader_instance_edges_variying_color_geom_glsl},
+
+ [GPU_SHADER_2D_AREA_EDGES] =
+ { datatoc_gpu_shader_2D_area_borders_vert_glsl,
+ datatoc_gpu_shader_uniform_color_frag_glsl},
+ [GPU_SHADER_2D_WIDGET_BASE] =
+ { datatoc_gpu_shader_2D_widget_base_vert_glsl,
+ datatoc_gpu_shader_2D_widget_base_frag_glsl},
+ [GPU_SHADER_2D_WIDGET_BASE_INST] =
+ { datatoc_gpu_shader_2D_widget_base_vert_glsl,
+ datatoc_gpu_shader_2D_widget_base_frag_glsl},
+ [GPU_SHADER_2D_WIDGET_SHADOW] =
+ { datatoc_gpu_shader_2D_widget_shadow_vert_glsl,
+ datatoc_gpu_shader_2D_widget_shadow_frag_glsl },
+ [GPU_SHADER_2D_NODELINK] =
+ { datatoc_gpu_shader_2D_nodelink_vert_glsl,
+ datatoc_gpu_shader_2D_nodelink_frag_glsl },
+ [GPU_SHADER_2D_NODELINK_INST] =
+ { datatoc_gpu_shader_2D_nodelink_vert_glsl,
+ datatoc_gpu_shader_2D_nodelink_frag_glsl },
+
+ [GPU_SHADER_2D_UV_VERTS] =
+ { datatoc_gpu_shader_2D_edituvs_points_vert_glsl,
+ datatoc_gpu_shader_point_varying_color_varying_outline_aa_frag_glsl },
+ [GPU_SHADER_2D_UV_FACEDOTS] =
+ { datatoc_gpu_shader_2D_edituvs_facedots_vert_glsl,
+ datatoc_gpu_shader_point_varying_color_frag_glsl },
+ [GPU_SHADER_2D_UV_EDGES] =
+ { datatoc_gpu_shader_2D_edituvs_edges_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl },
+ [GPU_SHADER_2D_UV_EDGES_SMOOTH] =
+ { datatoc_gpu_shader_2D_edituvs_edges_vert_glsl,
+ datatoc_gpu_shader_2D_smooth_color_frag_glsl },
+ [GPU_SHADER_2D_UV_FACES] =
+ { datatoc_gpu_shader_2D_edituvs_faces_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl },
+ [GPU_SHADER_2D_UV_FACES_STRETCH] =
+ { datatoc_gpu_shader_2D_edituvs_stretch_vert_glsl,
+ datatoc_gpu_shader_2D_smooth_color_frag_glsl },
+
+ [GPU_SHADER_GPENCIL_STROKE] =
+ { datatoc_gpu_shader_gpencil_stroke_vert_glsl,
+ datatoc_gpu_shader_gpencil_stroke_frag_glsl,
+ datatoc_gpu_shader_gpencil_stroke_geom_glsl },
+
+ [GPU_SHADER_GPENCIL_FILL] =
+ { datatoc_gpu_shader_gpencil_fill_vert_glsl,
+ datatoc_gpu_shader_gpencil_fill_frag_glsl },
+};
+
+/* just a few special cases */
+static const char *gpu_shader_get_builtin_shader_defines(
+ GPUBuiltinShader shader)
+{
+ switch (shader) {
+ case GPU_SHADER_2D_IMAGE_MULTISAMPLE_2:
+ return "#define SAMPLES 2\n";
+
+ case GPU_SHADER_2D_IMAGE_MULTISAMPLE_2_DEPTH_TEST:
+ return "#define SAMPLES 2\n"
+ "#define USE_DEPTH\n";
+
+ case GPU_SHADER_2D_IMAGE_MULTISAMPLE_4:
+ return "#define SAMPLES 4\n";
+
+ case GPU_SHADER_2D_IMAGE_MULTISAMPLE_4_DEPTH_TEST:
+ return "#define SAMPLES 4\n"
+ "#define USE_DEPTH\n";
+
+ case GPU_SHADER_2D_IMAGE_MULTISAMPLE_8:
+ return "#define SAMPLES 8\n";
+
+ case GPU_SHADER_2D_IMAGE_MULTISAMPLE_8_DEPTH_TEST:
+ return "#define SAMPLES 8\n"
+ "#define USE_DEPTH\n";
+
+ case GPU_SHADER_2D_IMAGE_MULTISAMPLE_16:
+ return "#define SAMPLES 16\n";
+
+ case GPU_SHADER_2D_IMAGE_MULTISAMPLE_16_DEPTH_TEST:
+ return "#define SAMPLES 16\n"
+ "#define USE_DEPTH\n";
+
+ case GPU_SHADER_2D_WIDGET_BASE_INST:
+ case GPU_SHADER_2D_NODELINK_INST:
+ return "#define USE_INSTANCE\n";
+
+ case GPU_SHADER_INSTANCE_VARIYING_ID_VARIYING_SIZE:
+ case GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE:
+ return "#define UNIFORM_SCALE\n";
+
+ case GPU_SHADER_3D_INSTANCE_SCREEN_ALIGNED_AXIS:
+ return "#define AXIS_NAME\n";
+
+ case GPU_SHADER_3D_OBJECTSPACE_SIMPLE_LIGHTING_VARIYING_COLOR:
+ return "#define USE_INSTANCE_COLOR\n";
+
+ case GPU_SHADER_3D_FLAT_COLOR_U32:
+ case GPU_SHADER_3D_UNIFORM_COLOR_U32:
+ return "#define USE_COLOR_U32\n";
+
+ case GPU_SHADER_SIMPLE_LIGHTING_FLAT_COLOR:
+ return "#define USE_FLAT_NORMAL\n";
+
+ case GPU_SHADER_2D_UV_EDGES_SMOOTH:
+ return "#define SMOOTH_COLOR\n";
+
+ default:
+ return NULL;
+ }
+}
+
GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
{
BLI_assert(shader != GPU_NUM_BUILTIN_SHADERS); /* don't be a troll */
- static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
- [GPU_SHADER_SMOKE] = { datatoc_gpu_shader_smoke_vert_glsl, datatoc_gpu_shader_smoke_frag_glsl },
- [GPU_SHADER_SMOKE_FIRE] = { datatoc_gpu_shader_smoke_vert_glsl, datatoc_gpu_shader_smoke_frag_glsl },
- [GPU_SHADER_SMOKE_COBA] = { datatoc_gpu_shader_smoke_vert_glsl, datatoc_gpu_shader_smoke_frag_glsl },
-
- [GPU_SHADER_TEXT] = { datatoc_gpu_shader_text_vert_glsl,
- datatoc_gpu_shader_text_frag_glsl,
- datatoc_gpu_shader_text_geom_glsl },
- [GPU_SHADER_TEXT_SIMPLE] = { datatoc_gpu_shader_text_simple_vert_glsl,
- datatoc_gpu_shader_text_frag_glsl,
- datatoc_gpu_shader_text_simple_geom_glsl },
- [GPU_SHADER_KEYFRAME_DIAMOND] = { datatoc_gpu_shader_keyframe_diamond_vert_glsl,
- datatoc_gpu_shader_keyframe_diamond_frag_glsl },
- [GPU_SHADER_EDGES_FRONT_BACK_PERSP] = { datatoc_gpu_shader_edges_front_back_persp_vert_glsl,
- /* this version is */ datatoc_gpu_shader_flat_color_frag_glsl,
- /* magical but slooow */ datatoc_gpu_shader_edges_front_back_persp_geom_glsl },
- [GPU_SHADER_EDGES_FRONT_BACK_ORTHO] = { datatoc_gpu_shader_edges_front_back_ortho_vert_glsl,
- datatoc_gpu_shader_flat_color_frag_glsl },
- [GPU_SHADER_EDGES_OVERLAY_SIMPLE] = { datatoc_gpu_shader_3D_vert_glsl, datatoc_gpu_shader_edges_overlay_frag_glsl,
- datatoc_gpu_shader_edges_overlay_simple_geom_glsl },
- [GPU_SHADER_EDGES_OVERLAY] = { datatoc_gpu_shader_edges_overlay_vert_glsl,
- datatoc_gpu_shader_edges_overlay_frag_glsl,
- datatoc_gpu_shader_edges_overlay_geom_glsl },
- [GPU_SHADER_SIMPLE_LIGHTING] = { datatoc_gpu_shader_3D_normal_vert_glsl, datatoc_gpu_shader_simple_lighting_frag_glsl },
- /* Use 'USE_FLAT_NORMAL' to make flat shader from smooth */
- [GPU_SHADER_SIMPLE_LIGHTING_FLAT_COLOR] = { datatoc_gpu_shader_3D_normal_smooth_color_vert_glsl, datatoc_gpu_shader_simple_lighting_smooth_color_frag_glsl },
- [GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR] = { datatoc_gpu_shader_3D_normal_smooth_color_vert_glsl, datatoc_gpu_shader_simple_lighting_smooth_color_frag_glsl },
- [GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR_ALPHA] = { datatoc_gpu_shader_3D_normal_smooth_color_vert_glsl, datatoc_gpu_shader_simple_lighting_smooth_color_alpha_frag_glsl },
-
- [GPU_SHADER_2D_IMAGE_MASK_UNIFORM_COLOR] = { datatoc_gpu_shader_3D_image_vert_glsl,
- datatoc_gpu_shader_image_mask_uniform_color_frag_glsl },
- [GPU_SHADER_3D_IMAGE_MODULATE_ALPHA] = { datatoc_gpu_shader_3D_image_vert_glsl,
- datatoc_gpu_shader_image_modulate_alpha_frag_glsl },
- [GPU_SHADER_3D_IMAGE_DEPTH] = { datatoc_gpu_shader_3D_image_vert_glsl,
- datatoc_gpu_shader_image_depth_linear_frag_glsl },
- [GPU_SHADER_3D_IMAGE_DEPTH_COPY] = { datatoc_gpu_shader_3D_image_vert_glsl,
- datatoc_gpu_shader_image_depth_copy_frag_glsl },
- [GPU_SHADER_2D_IMAGE_MULTISAMPLE_2] = { datatoc_gpu_shader_2D_vert_glsl, datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
- [GPU_SHADER_2D_IMAGE_MULTISAMPLE_4] = { datatoc_gpu_shader_2D_vert_glsl, datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
- [GPU_SHADER_2D_IMAGE_MULTISAMPLE_8] = { datatoc_gpu_shader_2D_vert_glsl, datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
- [GPU_SHADER_2D_IMAGE_MULTISAMPLE_16] = { datatoc_gpu_shader_2D_vert_glsl, datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
- [GPU_SHADER_2D_IMAGE_MULTISAMPLE_2_DEPTH_TEST] = { datatoc_gpu_shader_2D_vert_glsl, datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
- [GPU_SHADER_2D_IMAGE_MULTISAMPLE_4_DEPTH_TEST] = { datatoc_gpu_shader_2D_vert_glsl, datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
- [GPU_SHADER_2D_IMAGE_MULTISAMPLE_8_DEPTH_TEST] = { datatoc_gpu_shader_2D_vert_glsl, datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
- [GPU_SHADER_2D_IMAGE_MULTISAMPLE_16_DEPTH_TEST] = { datatoc_gpu_shader_2D_vert_glsl, datatoc_gpu_shader_image_multisample_resolve_frag_glsl },
-
- [GPU_SHADER_2D_IMAGE_INTERLACE] = { datatoc_gpu_shader_2D_image_vert_glsl,
- datatoc_gpu_shader_image_interlace_frag_glsl },
- [GPU_SHADER_2D_CHECKER] = { datatoc_gpu_shader_2D_vert_glsl, datatoc_gpu_shader_checker_frag_glsl },
-
- [GPU_SHADER_2D_DIAG_STRIPES] = { datatoc_gpu_shader_2D_vert_glsl, datatoc_gpu_shader_diag_stripes_frag_glsl },
-
- [GPU_SHADER_2D_UNIFORM_COLOR] = { datatoc_gpu_shader_2D_vert_glsl, datatoc_gpu_shader_uniform_color_frag_glsl },
- [GPU_SHADER_2D_FLAT_COLOR] = { datatoc_gpu_shader_2D_flat_color_vert_glsl,
- datatoc_gpu_shader_flat_color_frag_glsl },
- [GPU_SHADER_2D_SMOOTH_COLOR] = { datatoc_gpu_shader_2D_smooth_color_vert_glsl,
- datatoc_gpu_shader_2D_smooth_color_frag_glsl },
- [GPU_SHADER_2D_SMOOTH_COLOR_DITHER] = { datatoc_gpu_shader_2D_smooth_color_vert_glsl,
- datatoc_gpu_shader_2D_smooth_color_dithered_frag_glsl },
- [GPU_SHADER_2D_IMAGE_LINEAR_TO_SRGB] = { datatoc_gpu_shader_2D_image_vert_glsl,
- datatoc_gpu_shader_image_linear_frag_glsl },
- [GPU_SHADER_2D_IMAGE] = { datatoc_gpu_shader_2D_image_vert_glsl,
- datatoc_gpu_shader_image_frag_glsl },
- [GPU_SHADER_2D_IMAGE_COLOR] = { datatoc_gpu_shader_2D_image_vert_glsl,
- datatoc_gpu_shader_image_color_frag_glsl },
- [GPU_SHADER_2D_IMAGE_DESATURATE_COLOR] = { datatoc_gpu_shader_2D_image_vert_glsl,
- datatoc_gpu_shader_image_desaturate_frag_glsl },
- [GPU_SHADER_2D_IMAGE_ALPHA_COLOR] = { datatoc_gpu_shader_2D_image_vert_glsl,
- datatoc_gpu_shader_image_alpha_color_frag_glsl },
- [GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR] = { datatoc_gpu_shader_2D_image_vert_glsl,
- datatoc_gpu_shader_image_shuffle_color_frag_glsl },
- [GPU_SHADER_2D_IMAGE_RECT_COLOR] = { datatoc_gpu_shader_2D_image_rect_vert_glsl,
- datatoc_gpu_shader_image_color_frag_glsl },
- [GPU_SHADER_2D_IMAGE_MULTI_RECT_COLOR] = { datatoc_gpu_shader_2D_image_multi_rect_vert_glsl,
- datatoc_gpu_shader_image_varying_color_frag_glsl },
-
- [GPU_SHADER_3D_UNIFORM_COLOR] = { datatoc_gpu_shader_3D_vert_glsl, datatoc_gpu_shader_uniform_color_frag_glsl },
- [GPU_SHADER_3D_UNIFORM_COLOR_U32] = { datatoc_gpu_shader_3D_vert_glsl, datatoc_gpu_shader_uniform_color_frag_glsl },
- [GPU_SHADER_3D_FLAT_COLOR] = { datatoc_gpu_shader_3D_flat_color_vert_glsl,
- datatoc_gpu_shader_flat_color_frag_glsl },
- [GPU_SHADER_3D_FLAT_COLOR_U32] = { datatoc_gpu_shader_3D_flat_color_vert_glsl,
- datatoc_gpu_shader_flat_color_frag_glsl },
- [GPU_SHADER_3D_SMOOTH_COLOR] = { datatoc_gpu_shader_3D_smooth_color_vert_glsl,
- datatoc_gpu_shader_3D_smooth_color_frag_glsl },
- [GPU_SHADER_3D_DEPTH_ONLY] = { datatoc_gpu_shader_3D_vert_glsl, datatoc_gpu_shader_depth_only_frag_glsl },
- [GPU_SHADER_3D_CLIPPED_UNIFORM_COLOR] = { datatoc_gpu_shader_3D_clipped_uniform_color_vert_glsl,
- datatoc_gpu_shader_uniform_color_frag_glsl },
-
- [GPU_SHADER_3D_GROUNDPOINT] = { datatoc_gpu_shader_3D_groundpoint_vert_glsl, datatoc_gpu_shader_point_uniform_color_frag_glsl },
- [GPU_SHADER_3D_GROUNDLINE] = { datatoc_gpu_shader_3D_passthrough_vert_glsl,
- datatoc_gpu_shader_uniform_color_frag_glsl,
- datatoc_gpu_shader_3D_groundline_geom_glsl },
-
- [GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR] = { datatoc_gpu_shader_2D_line_dashed_uniform_color_vert_glsl,
- datatoc_gpu_shader_2D_line_dashed_frag_glsl,
- datatoc_gpu_shader_2D_line_dashed_geom_glsl },
- [GPU_SHADER_3D_LINE_DASHED_UNIFORM_COLOR] = { datatoc_gpu_shader_3D_line_dashed_uniform_color_vert_glsl,
- datatoc_gpu_shader_2D_line_dashed_frag_glsl,
- datatoc_gpu_shader_2D_line_dashed_geom_glsl },
-
- [GPU_SHADER_3D_OBJECTSPACE_SIMPLE_LIGHTING_VARIYING_COLOR] =
- { datatoc_gpu_shader_instance_objectspace_variying_color_vert_glsl,
- datatoc_gpu_shader_simple_lighting_frag_glsl},
- [GPU_SHADER_3D_OBJECTSPACE_VARIYING_COLOR] = { datatoc_gpu_shader_instance_objectspace_variying_color_vert_glsl,
- datatoc_gpu_shader_flat_color_frag_glsl},
- [GPU_SHADER_3D_SCREENSPACE_VARIYING_COLOR] = { datatoc_gpu_shader_instance_screenspace_variying_color_vert_glsl,
- datatoc_gpu_shader_flat_color_frag_glsl},
- [GPU_SHADER_3D_INSTANCE_SCREEN_ALIGNED_AXIS] = { datatoc_gpu_shader_instance_screen_aligned_vert_glsl,
- datatoc_gpu_shader_flat_color_frag_glsl},
- [GPU_SHADER_3D_INSTANCE_SCREEN_ALIGNED] = { datatoc_gpu_shader_instance_screen_aligned_vert_glsl,
- datatoc_gpu_shader_flat_color_frag_glsl},
-
- [GPU_SHADER_CAMERA] = { datatoc_gpu_shader_instance_camera_vert_glsl,
- datatoc_gpu_shader_flat_color_frag_glsl},
- [GPU_SHADER_DISTANCE_LINES] = { datatoc_gpu_shader_instance_distance_line_vert_glsl,
- datatoc_gpu_shader_flat_color_frag_glsl},
-
- [GPU_SHADER_2D_POINT_FIXED_SIZE_UNIFORM_COLOR] =
- { datatoc_gpu_shader_2D_vert_glsl, datatoc_gpu_shader_point_uniform_color_frag_glsl },
- [GPU_SHADER_2D_POINT_VARYING_SIZE_VARYING_COLOR] =
- { datatoc_gpu_shader_2D_point_varying_size_varying_color_vert_glsl,
- datatoc_gpu_shader_point_varying_color_frag_glsl },
- [GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA] =
- { datatoc_gpu_shader_2D_point_uniform_size_aa_vert_glsl,
- datatoc_gpu_shader_point_uniform_color_aa_frag_glsl },
- [GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_AA] =
- { datatoc_gpu_shader_2D_point_uniform_size_outline_aa_vert_glsl,
- datatoc_gpu_shader_point_uniform_color_outline_aa_frag_glsl },
- [GPU_SHADER_2D_POINT_UNIFORM_SIZE_VARYING_COLOR_OUTLINE_AA] =
- { datatoc_gpu_shader_2D_point_uniform_size_varying_color_outline_aa_vert_glsl,
- datatoc_gpu_shader_point_varying_color_outline_aa_frag_glsl },
- [GPU_SHADER_3D_POINT_FIXED_SIZE_UNIFORM_COLOR] = { datatoc_gpu_shader_3D_vert_glsl,
- datatoc_gpu_shader_point_uniform_color_frag_glsl },
- [GPU_SHADER_3D_POINT_FIXED_SIZE_VARYING_COLOR] = { datatoc_gpu_shader_3D_point_fixed_size_varying_color_vert_glsl,
- datatoc_gpu_shader_point_varying_color_frag_glsl },
- [GPU_SHADER_3D_POINT_VARYING_SIZE_UNIFORM_COLOR] = { datatoc_gpu_shader_3D_point_varying_size_vert_glsl,
- datatoc_gpu_shader_point_uniform_color_frag_glsl },
- [GPU_SHADER_3D_POINT_VARYING_SIZE_VARYING_COLOR] =
- { datatoc_gpu_shader_3D_point_varying_size_varying_color_vert_glsl,
- datatoc_gpu_shader_point_varying_color_frag_glsl },
- [GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA] =
- { datatoc_gpu_shader_3D_point_uniform_size_aa_vert_glsl,
- datatoc_gpu_shader_point_uniform_color_aa_frag_glsl },
- [GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_AA] =
- { datatoc_gpu_shader_3D_point_uniform_size_outline_aa_vert_glsl,
- datatoc_gpu_shader_point_uniform_color_outline_aa_frag_glsl },
-
- [GPU_SHADER_INSTANCE_UNIFORM_COLOR] = { datatoc_gpu_shader_instance_vert_glsl, datatoc_gpu_shader_uniform_color_frag_glsl },
- [GPU_SHADER_INSTANCE_VARIYING_ID_VARIYING_SIZE] =
- { datatoc_gpu_shader_instance_variying_size_variying_id_vert_glsl,
- datatoc_gpu_shader_flat_id_frag_glsl },
- [GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE] =
- { datatoc_gpu_shader_instance_variying_size_variying_color_vert_glsl,
- datatoc_gpu_shader_flat_color_frag_glsl },
- [GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SCALE] =
- { datatoc_gpu_shader_instance_variying_size_variying_color_vert_glsl,
- datatoc_gpu_shader_flat_color_frag_glsl },
- [GPU_SHADER_INSTANCE_EDGES_VARIYING_COLOR] = { datatoc_gpu_shader_instance_edges_variying_color_vert_glsl,
- datatoc_gpu_shader_flat_color_frag_glsl,
- datatoc_gpu_shader_instance_edges_variying_color_geom_glsl},
-
- [GPU_SHADER_2D_AREA_EDGES] = { datatoc_gpu_shader_2D_area_borders_vert_glsl,
- datatoc_gpu_shader_uniform_color_frag_glsl},
- [GPU_SHADER_2D_WIDGET_BASE] = { datatoc_gpu_shader_2D_widget_base_vert_glsl,
- datatoc_gpu_shader_2D_widget_base_frag_glsl},
- [GPU_SHADER_2D_WIDGET_BASE_INST] = { datatoc_gpu_shader_2D_widget_base_vert_glsl,
- datatoc_gpu_shader_2D_widget_base_frag_glsl},
- [GPU_SHADER_2D_WIDGET_SHADOW] = { datatoc_gpu_shader_2D_widget_shadow_vert_glsl,
- datatoc_gpu_shader_2D_widget_shadow_frag_glsl },
- [GPU_SHADER_2D_NODELINK] = { datatoc_gpu_shader_2D_nodelink_vert_glsl,
- datatoc_gpu_shader_2D_nodelink_frag_glsl },
- [GPU_SHADER_2D_NODELINK_INST] = { datatoc_gpu_shader_2D_nodelink_vert_glsl,
- datatoc_gpu_shader_2D_nodelink_frag_glsl },
-
- [GPU_SHADER_GPENCIL_STROKE] = { datatoc_gpu_shader_gpencil_stroke_vert_glsl,
- datatoc_gpu_shader_gpencil_stroke_frag_glsl,
- datatoc_gpu_shader_gpencil_stroke_geom_glsl },
-
- [GPU_SHADER_GPENCIL_FILL] = { datatoc_gpu_shader_gpencil_fill_vert_glsl,
- datatoc_gpu_shader_gpencil_fill_frag_glsl },
- };
-
if (builtin_shaders[shader] == NULL) {
- /* just a few special cases */
- const char *defines = NULL;
- switch (shader) {
- case GPU_SHADER_2D_IMAGE_MULTISAMPLE_2:
- defines = "#define SAMPLES 2\n";
- break;
- case GPU_SHADER_2D_IMAGE_MULTISAMPLE_2_DEPTH_TEST:
- defines = "#define SAMPLES 2\n"
- "#define USE_DEPTH\n";
- break;
- case GPU_SHADER_2D_IMAGE_MULTISAMPLE_4:
- defines = "#define SAMPLES 4\n";
- break;
- case GPU_SHADER_2D_IMAGE_MULTISAMPLE_4_DEPTH_TEST:
- defines = "#define SAMPLES 4\n"
- "#define USE_DEPTH\n";
- break;
- case GPU_SHADER_2D_IMAGE_MULTISAMPLE_8:
- defines = "#define SAMPLES 8\n";
- break;
- case GPU_SHADER_2D_IMAGE_MULTISAMPLE_8_DEPTH_TEST:
- defines = "#define SAMPLES 8\n"
- "#define USE_DEPTH\n";
- break;
- case GPU_SHADER_2D_IMAGE_MULTISAMPLE_16:
- defines = "#define SAMPLES 16\n";
- break;
- case GPU_SHADER_2D_IMAGE_MULTISAMPLE_16_DEPTH_TEST:
- defines = "#define SAMPLES 16\n"
- "#define USE_DEPTH\n";
- break;
- case GPU_SHADER_2D_WIDGET_BASE_INST:
- case GPU_SHADER_2D_NODELINK_INST:
- defines = "#define USE_INSTANCE\n";
- break;
- case GPU_SHADER_SMOKE_COBA:
- defines = "#define USE_COBA\n";
- break;
- case GPU_SHADER_INSTANCE_VARIYING_ID_VARIYING_SIZE:
- case GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE:
- defines = "#define UNIFORM_SCALE\n";
- break;
- case GPU_SHADER_3D_INSTANCE_SCREEN_ALIGNED_AXIS:
- defines = "#define AXIS_NAME\n";
- break;
- case GPU_SHADER_3D_OBJECTSPACE_SIMPLE_LIGHTING_VARIYING_COLOR:
- defines = "#define USE_INSTANCE_COLOR\n";
- break;
- case GPU_SHADER_3D_FLAT_COLOR_U32:
- case GPU_SHADER_3D_UNIFORM_COLOR_U32:
- defines = "#define USE_COLOR_U32\n";
- break;
- case GPU_SHADER_SIMPLE_LIGHTING_FLAT_COLOR:
- defines = "#define USE_FLAT_NORMAL\n";
- break;
- default:
- break;
- }
+ const char *defines = gpu_shader_get_builtin_shader_defines(shader);
const GPUShaderStages *stages = builtin_shader_stages + shader;
@@ -992,6 +1043,18 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
return builtin_shaders[shader];
}
+void GPU_shader_get_builtin_shader_code(
+ GPUBuiltinShader shader,
+ const char **r_vert, const char **r_frag,
+ const char **r_geom, const char **r_defines)
+{
+ const GPUShaderStages *stages = builtin_shader_stages + shader;
+ *r_vert = stages->vert;
+ *r_frag = stages->frag;
+ *r_geom = stages->geom;
+ *r_defines = gpu_shader_get_builtin_shader_defines(shader);
+}
+
#define MAX_DEFINES 100
void GPU_shader_free_builtin_shaders(void)
diff --git a/source/blender/gpu/intern/gpu_shader_interface.c b/source/blender/gpu/intern/gpu_shader_interface.c
index f6bbc228ae9..d46fc979363 100644
--- a/source/blender/gpu/intern/gpu_shader_interface.c
+++ b/source/blender/gpu/intern/gpu_shader_interface.c
@@ -72,6 +72,7 @@ static const char *BuiltinUniform_name(GPUUniformBuiltin u)
[GPU_UNIFORM_COLOR] = "color",
[GPU_UNIFORM_EYE] = "eye",
[GPU_UNIFORM_CALLID] = "callId",
+ [GPU_UNIFORM_OBJECT_INFO] = "unfobjectinfo",
[GPU_UNIFORM_CUSTOM] = NULL,
[GPU_NUM_UNIFORMS] = NULL,
diff --git a/source/blender/gpu/intern/gpu_state.c b/source/blender/gpu/intern/gpu_state.c
index 68d846ccfba..d06854f669f 100644
--- a/source/blender/gpu/intern/gpu_state.c
+++ b/source/blender/gpu/intern/gpu_state.c
@@ -25,8 +25,11 @@
*
*/
+#include "DNA_userdef_types.h"
+
#include "GPU_glew.h"
#include "GPU_state.h"
+#include "GPU_extensions.h"
static GLenum gpu_get_gl_blendfunction(GPUBlendFunction blend)
{
@@ -73,6 +76,12 @@ void GPU_blend_set_func_separate(
gpu_get_gl_blendfunction(dst_alpha));
}
+void GPU_depth_range(float near, float far)
+{
+ /* glDepthRangef is only for OpenGL 4.1 or higher */
+ glDepthRange(near, far);
+}
+
void GPU_depth_test(bool enable)
{
if (enable) {
@@ -110,12 +119,18 @@ void GPU_line_stipple(bool enable)
void GPU_line_width(float width)
{
- glLineWidth(width);
+ float max_size = GPU_max_line_width();
+ float final_size = width * U.pixelsize;
+ /* Fix opengl errors on certain platform / drivers. */
+ if (max_size < final_size) {
+ final_size = max_size;
+ }
+ glLineWidth(final_size);
}
void GPU_point_size(float size)
{
- glPointSize(size);
+ glPointSize(size * U.pixelsize);
}
void GPU_polygon_smooth(bool enable)
@@ -152,3 +167,13 @@ void GPU_viewport_size_get_i(int coords[4])
{
glGetIntegerv(GL_VIEWPORT, coords);
}
+
+void GPU_flush(void)
+{
+ glFlush();
+}
+
+void GPU_finish(void)
+{
+ glFinish();
+}
diff --git a/source/blender/gpu/intern/gpu_texture.c b/source/blender/gpu/intern/gpu_texture.c
index 2ccc9f10269..4641bde74b9 100644
--- a/source/blender/gpu/intern/gpu_texture.c
+++ b/source/blender/gpu/intern/gpu_texture.c
@@ -55,7 +55,7 @@ static struct GPUTextureGlobal {
} GG = {NULL, NULL, NULL};
/* Maximum number of FBOs a texture can be attached to. */
-#define GPU_TEX_MAX_FBO_ATTACHED 8
+#define GPU_TEX_MAX_FBO_ATTACHED 10
typedef enum GPUTextureFormatFlag {
GPU_FORMAT_DEPTH = (1 << 0),
@@ -83,7 +83,7 @@ struct GPUTexture {
GPUTextureFormat format;
GPUTextureFormatFlag format_flag;
- unsigned int bytesize; /* number of byte for one pixel */
+ uint bytesize; /* number of byte for one pixel */
int components; /* number of color/alpha channels */
int samples; /* number of samples for multisamples textures. 0 if not multisample target */
@@ -94,9 +94,9 @@ struct GPUTexture {
/* ------ Memory Management ------- */
/* Records every texture allocation / free
* to estimate the Texture Pool Memory consumption */
-static unsigned int memory_usage;
+static uint memory_usage;
-static unsigned int gpu_texture_memory_footprint_compute(GPUTexture *tex)
+static uint gpu_texture_memory_footprint_compute(GPUTexture *tex)
{
int samp = max_ii(tex->samples, 1);
switch (tex->target) {
@@ -127,7 +127,7 @@ static void gpu_texture_memory_footprint_remove(GPUTexture *tex)
memory_usage -= gpu_texture_memory_footprint_compute(tex);
}
-unsigned int GPU_texture_memory_usage_get(void)
+uint GPU_texture_memory_usage_get(void)
{
return memory_usage;
}
@@ -138,6 +138,7 @@ static int gpu_get_component_count(GPUTextureFormat format)
{
switch (format) {
case GPU_RGBA8:
+ case GPU_RGBA8UI:
case GPU_RGBA16F:
case GPU_RGBA16:
case GPU_RGBA32F:
@@ -169,7 +170,10 @@ static void gpu_validate_data_format(GPUTextureFormat tex_format, GPUDataFormat
{
BLI_assert(data_format == GPU_DATA_FLOAT);
}
- else if (tex_format == GPU_DEPTH24_STENCIL8) {
+ else if (ELEM(tex_format,
+ GPU_DEPTH24_STENCIL8,
+ GPU_DEPTH32F_STENCIL8))
+ {
BLI_assert(data_format == GPU_DATA_UNSIGNED_INT_24_8);
}
else {
@@ -183,7 +187,7 @@ static void gpu_validate_data_format(GPUTextureFormat tex_format, GPUDataFormat
}
}
/* Byte formats */
- else if (ELEM(tex_format, GPU_R8, GPU_RG8, GPU_RGBA8)) {
+ else if (ELEM(tex_format, GPU_R8, GPU_RG8, GPU_RGBA8, GPU_RGBA8UI)) {
BLI_assert(ELEM(data_format, GPU_DATA_UNSIGNED_BYTE, GPU_DATA_FLOAT));
}
/* Special case */
@@ -206,7 +210,10 @@ static GPUDataFormat gpu_get_data_format_from_tex_format(GPUTextureFormat tex_fo
{
return GPU_DATA_FLOAT;
}
- else if (tex_format == GPU_DEPTH24_STENCIL8) {
+ else if (ELEM(tex_format,
+ GPU_DEPTH24_STENCIL8,
+ GPU_DEPTH32F_STENCIL8))
+ {
return GPU_DATA_UNSIGNED_INT_24_8;
}
else {
@@ -244,7 +251,10 @@ static GLenum gpu_get_gl_dataformat(GPUTextureFormat data_type, GPUTextureFormat
*format_flag |= GPU_FORMAT_DEPTH;
return GL_DEPTH_COMPONENT;
}
- else if (data_type == GPU_DEPTH24_STENCIL8) {
+ else if (ELEM(data_type,
+ GPU_DEPTH24_STENCIL8,
+ GPU_DEPTH32F_STENCIL8))
+ {
*format_flag |= GPU_FORMAT_DEPTH | GPU_FORMAT_STENCIL;
return GL_DEPTH_STENCIL;
}
@@ -281,7 +291,7 @@ static GLenum gpu_get_gl_dataformat(GPUTextureFormat data_type, GPUTextureFormat
return GL_RGBA;
}
-static unsigned int gpu_get_bytesize(GPUTextureFormat data_type)
+static uint gpu_get_bytesize(GPUTextureFormat data_type)
{
switch (data_type) {
case GPU_RGBA32F:
@@ -292,12 +302,15 @@ static unsigned int gpu_get_bytesize(GPUTextureFormat data_type)
return 16;
case GPU_RGB16F:
return 12;
+ case GPU_DEPTH32F_STENCIL8:
+ return 8;
case GPU_RG16F:
case GPU_RG16I:
case GPU_RG16UI:
case GPU_RG16:
case GPU_DEPTH24_STENCIL8:
case GPU_DEPTH_COMPONENT32F:
+ case GPU_RGBA8UI:
case GPU_RGBA8:
case GPU_R11F_G11F_B10F:
case GPU_R32F:
@@ -335,6 +348,7 @@ static GLenum gpu_get_gl_internalformat(GPUTextureFormat format)
case GPU_RG16I: return GL_RG16I;
case GPU_RG16: return GL_RG16;
case GPU_RGBA8: return GL_RGBA8;
+ case GPU_RGBA8UI: return GL_RGBA8UI;
case GPU_R32F: return GL_R32F;
case GPU_R32UI: return GL_R32UI;
case GPU_R32I: return GL_R32I;
@@ -347,6 +361,7 @@ static GLenum gpu_get_gl_internalformat(GPUTextureFormat format)
/* Special formats texture & renderbuffer */
case GPU_R11F_G11F_B10F: return GL_R11F_G11F_B10F;
case GPU_DEPTH24_STENCIL8: return GL_DEPTH24_STENCIL8;
+ case GPU_DEPTH32F_STENCIL8: return GL_DEPTH32F_STENCIL8;
/* Texture only format */
/* ** Add Format here **/
/* Special formats texture only */
@@ -384,22 +399,22 @@ static GLenum gpu_get_gl_datatype(GPUDataFormat format)
static float *GPU_texture_3D_rescale(GPUTexture *tex, int w, int h, int d, int channels, const float *fpixels)
{
- const unsigned int xf = w / tex->w, yf = h / tex->h, zf = d / tex->d;
+ const uint xf = w / tex->w, yf = h / tex->h, zf = d / tex->d;
float *nfpixels = MEM_mallocN(channels * sizeof(float) * tex->w * tex->h * tex->d, "GPUTexture Rescaled 3Dtex");
if (nfpixels) {
GPU_print_error_debug("You need to scale a 3D texture, feel the pain!");
- for (unsigned k = 0; k < tex->d; k++) {
- for (unsigned j = 0; j < tex->h; j++) {
- for (unsigned i = 0; i < tex->w; i++) {
+ for (uint k = 0; k < tex->d; k++) {
+ for (uint j = 0; j < tex->h; j++) {
+ for (uint i = 0; i < tex->w; i++) {
/* obviously doing nearest filtering here,
* it's going to be slow in any case, let's not make it worse */
float xb = i * xf;
float yb = j * yf;
float zb = k * zf;
- unsigned int offset = k * (tex->w * tex->h) + i * tex->h + j;
- unsigned int offset_orig = (zb) * (w * h) + (xb) * h + (yb);
+ uint offset = k * (tex->w * tex->h) + i * tex->h + j;
+ uint offset_orig = (zb) * (w * h) + (xb) * h + (yb);
if (channels == 4) {
nfpixels[offset * 4] = fpixels[offset_orig * 4];
@@ -497,6 +512,12 @@ GPUTexture *GPU_texture_create_nD(
CLAMP_MAX(samples, GPU_max_color_texture_samples());
}
+ if ((tex_format == GPU_DEPTH24_STENCIL8) && GPU_depth_blitting_workaround()) {
+ /* MacOS + Radeon Pro fails to blit depth on GPU_DEPTH24_STENCIL8
+ * but works on GPU_DEPTH32F_STENCIL8. */
+ tex_format = GPU_DEPTH32F_STENCIL8;
+ }
+
GPUTexture *tex = MEM_callocN(sizeof(GPUTexture), "GPUTexture");
tex->w = w;
tex->h = h;
@@ -764,7 +785,7 @@ GPUTexture *GPU_texture_create_buffer(GPUTextureFormat tex_format, const GLuint
if (!tex->bindcode) {
fprintf(stderr, "GPUTexture: texture create failed\n");
GPU_texture_free(tex);
- BLI_assert(0 && "glGenTextures failled: Are you sure a valid OGL context is active on this thread?\n");
+ BLI_assert(0 && "glGenTextures failed: Are you sure a valid OGL context is active on this thread?\n");
return NULL;
}
@@ -913,12 +934,13 @@ GPUTexture *GPU_texture_create_cube(
const int channels = gpu_get_component_count(tex_format);
if (fpixels) {
- fpixels_px = fpixels + 0 * w * w * channels;
- fpixels_nx = fpixels + 1 * w * w * channels;
- fpixels_py = fpixels + 2 * w * w * channels;
- fpixels_ny = fpixels + 3 * w * w * channels;
- fpixels_pz = fpixels + 4 * w * w * channels;
- fpixels_nz = fpixels + 5 * w * w * channels;
+ int face_ofs = w * w * channels;
+ fpixels_px = fpixels + 0 * face_ofs;
+ fpixels_nx = fpixels + 1 * face_ofs;
+ fpixels_py = fpixels + 2 * face_ofs;
+ fpixels_ny = fpixels + 3 * face_ofs;
+ fpixels_pz = fpixels + 4 * face_ofs;
+ fpixels_nz = fpixels + 5 * face_ofs;
}
else {
fpixels_px = fpixels_py = fpixels_pz = fpixels_nx = fpixels_ny = fpixels_nz = NULL;
@@ -939,7 +961,7 @@ GPUTexture *GPU_texture_create_from_vertbuf(GPUVertBuf *vert)
BLI_assert(attr->comp_type != GPU_COMP_I10);
BLI_assert(attr->fetch_mode != GPU_FETCH_INT_TO_FLOAT);
- unsigned int byte_per_comp = attr->sz / attr->comp_len;
+ uint byte_per_comp = attr->sz / attr->comp_len;
bool is_uint = ELEM(attr->comp_type, GPU_COMP_U8, GPU_COMP_U16, GPU_COMP_U32);
/* Cannot fetch signed int or 32bit ints as normalized float. */
@@ -1096,6 +1118,7 @@ void *GPU_texture_read(GPUTexture *tex, GPUDataFormat gpu_data_format, int miplv
samples_count *= size[0];
samples_count *= max_ii(1, size[1]);
samples_count *= max_ii(1, size[2]);
+ samples_count *= (GPU_texture_cube(tex)) ? 6 : 1;
switch (gpu_data_format) {
case GPU_DATA_FLOAT:
@@ -1120,7 +1143,16 @@ void *GPU_texture_read(GPUTexture *tex, GPUDataFormat gpu_data_format, int miplv
glBindTexture(tex->target, tex->bindcode);
- glGetTexImage(tex->target, miplvl, data_format, data_type, buf);
+ if (GPU_texture_cube(tex)) {
+ int cube_face_size = buf_size / 6;
+ for (int i = 0; i < 6; ++i) {
+ glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, miplvl, data_format, data_type,
+ ((char *)buf) + cube_face_size * i);
+ }
+ }
+ else {
+ glGetTexImage(tex->target, miplvl, data_format, data_type, buf);
+ }
glBindTexture(tex->target, 0);
@@ -1226,7 +1258,21 @@ void GPU_texture_generate_mipmap(GPUTexture *tex)
WARN_NOT_BOUND(tex);
glActiveTexture(GL_TEXTURE0 + tex->number);
- glGenerateMipmap(tex->target_base);
+
+ if (GPU_texture_depth(tex)) {
+ /* 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 downsampling.
+ * You must initialize the texture levels using other methods like GPU_framebuffer_recursive_downsample(). */
+ int levels = 1 + floor(log2(max_ii(tex->w, tex->h)));
+ GPUDataFormat data_format = gpu_get_data_format_from_tex_format(tex->format);
+ for (int i = 1; i < levels; ++i) {
+ GPU_texture_add_mipmap(tex, data_format, i, NULL);
+ }
+ glBindTexture(tex->target, tex->bindcode);
+ }
+ else {
+ glGenerateMipmap(tex->target_base);
+ }
}
void GPU_texture_compare_mode(GPUTexture *tex, bool use_compare)
@@ -1427,7 +1473,7 @@ int GPU_texture_detach_framebuffer(GPUTexture *tex, GPUFrameBuffer *fb)
void GPU_texture_get_mipmap_size(GPUTexture *tex, int lvl, int *size)
{
- /* TODO assert if lvl is bellow the limit of 1px in each dimension. */
+ /* TODO assert if lvl is below the limit of 1px in each dimension. */
int div = 1 << lvl;
size[0] = max_ii(1, tex->w / div);
diff --git a/source/blender/gpu/intern/gpu_uniformbuffer.c b/source/blender/gpu/intern/gpu_uniformbuffer.c
index 82b82d622a4..9bc3727bb03 100644
--- a/source/blender/gpu/intern/gpu_uniformbuffer.c
+++ b/source/blender/gpu/intern/gpu_uniformbuffer.c
@@ -291,7 +291,7 @@ static void gpu_uniformbuffer_inputs_sort(ListBase *inputs)
while (link != NULL && ((GPUInput *)link->data)->type == GPU_VEC3) {
LinkData *link_next = link->next;
- /* If GPU_VEC3 is followed by nothing or a GPU_FLOAT, no need for aligment. */
+ /* If GPU_VEC3 is followed by nothing or a GPU_FLOAT, no need for alignment. */
if ((link_next == NULL) ||
((GPUInput *)link_next->data)->type == GPU_FLOAT)
{
diff --git a/source/blender/gpu/intern/gpu_vertex_buffer.c b/source/blender/gpu/intern/gpu_vertex_buffer.c
index 05100b8a23f..b6058a2cb79 100644
--- a/source/blender/gpu/intern/gpu_vertex_buffer.c
+++ b/source/blender/gpu/intern/gpu_vertex_buffer.c
@@ -155,7 +155,7 @@ void GPU_vertbuf_data_resize(GPUVertBuf *verts, uint v_len)
/* Set vertex count but does not change allocation.
* Only this many verts will be uploaded to the GPU and rendered.
- * This is usefull for streaming data. */
+ * This is useful for streaming data. */
void GPU_vertbuf_vertex_count_set(GPUVertBuf *verts, uint v_len)
{
#if TRUST_NO_ONE
diff --git a/source/blender/gpu/intern/gpu_vertex_format.c b/source/blender/gpu/intern/gpu_vertex_format.c
index eef4945d9ef..c3de3d52b47 100644
--- a/source/blender/gpu/intern/gpu_vertex_format.c
+++ b/source/blender/gpu/intern/gpu_vertex_format.c
@@ -29,11 +29,15 @@
* GPU vertex format
*/
+#include "GPU_shader_interface.h"
+
#include "GPU_vertex_format.h"
#include "gpu_vertex_format_private.h"
#include <stddef.h>
#include <string.h>
+#include "BLI_utildefines.h"
+
#define PACK_DEBUG 0
#if PACK_DEBUG
@@ -50,7 +54,7 @@ void GPU_vertformat_clear(GPUVertFormat *format)
format->name_offset = 0;
format->name_len = 0;
- for (unsigned i = 0; i < GPU_VERT_ATTR_MAX_LEN; i++) {
+ for (uint i = 0; i < GPU_VERT_ATTR_MAX_LEN; i++) {
format->attribs[i].name_len = 0;
}
#endif
@@ -61,8 +65,8 @@ void GPU_vertformat_copy(GPUVertFormat *dest, const GPUVertFormat *src)
/* copy regular struct fields */
memcpy(dest, src, sizeof(GPUVertFormat));
- for (unsigned i = 0; i < dest->attr_len; i++) {
- for (unsigned j = 0; j < dest->attribs[i].name_len; j++) {
+ for (uint i = 0; i < dest->attr_len; i++) {
+ for (uint j = 0; j < dest->attribs[i].name_len; j++) {
dest->attribs[i].name[j] = (char *)dest + (src->attribs[i].name[j] - ((char *)src));
}
}
@@ -85,7 +89,7 @@ static GLenum convert_comp_type_to_gl(GPUVertCompType type)
return table[type];
}
-static unsigned comp_sz(GPUVertCompType type)
+static uint comp_sz(GPUVertCompType type)
{
#if TRUST_NO_ONE
assert(type <= GPU_COMP_F32); /* other types have irregular sizes (not bytes) */
@@ -94,7 +98,7 @@ static unsigned comp_sz(GPUVertCompType type)
return sizes[type];
}
-static unsigned attrib_sz(const GPUVertAttr *a)
+static uint attrib_sz(const GPUVertAttr *a)
{
if (a->comp_type == GPU_COMP_I10) {
return 4; /* always packed as 10_10_10_2 */
@@ -102,12 +106,12 @@ static unsigned attrib_sz(const GPUVertAttr *a)
return a->comp_len * comp_sz(a->comp_type);
}
-static unsigned attrib_align(const GPUVertAttr *a)
+static uint attrib_align(const GPUVertAttr *a)
{
if (a->comp_type == GPU_COMP_I10) {
return 4; /* always packed as 10_10_10_2 */
}
- unsigned c = comp_sz(a->comp_type);
+ uint c = comp_sz(a->comp_type);
if (a->comp_len == 3 && c <= 2) {
return 4 * c; /* AMD HW can't fetch these well, so pad it out (other vendors too?) */
}
@@ -116,7 +120,7 @@ static unsigned attrib_align(const GPUVertAttr *a)
}
}
-unsigned vertex_buffer_size(const GPUVertFormat *format, unsigned vertex_len)
+uint vertex_buffer_size(const GPUVertFormat *format, uint vertex_len)
{
#if TRUST_NO_ONE
assert(format->packed && format->stride > 0);
@@ -128,10 +132,10 @@ static const char *copy_attrib_name(GPUVertFormat *format, const char *name)
{
/* strncpy does 110% of what we need; let's do exactly 100% */
char *name_copy = format->names + format->name_offset;
- unsigned available = GPU_VERT_ATTR_NAMES_BUF_LEN - format->name_offset;
+ uint available = GPU_VERT_ATTR_NAMES_BUF_LEN - format->name_offset;
bool terminated = false;
- for (unsigned i = 0; i < available; ++i) {
+ for (uint i = 0; i < available; ++i) {
const char c = name[i];
name_copy[i] = c;
if (c == '\0') {
@@ -149,9 +153,9 @@ static const char *copy_attrib_name(GPUVertFormat *format, const char *name)
return name_copy;
}
-unsigned GPU_vertformat_attr_add(
+uint GPU_vertformat_attr_add(
GPUVertFormat *format, const char *name,
- GPUVertCompType comp_type, unsigned comp_len, GPUVertFetchMode fetch_mode)
+ GPUVertCompType comp_type, uint comp_len, GPUVertFetchMode fetch_mode)
{
#if TRUST_NO_ONE
assert(format->name_len < GPU_VERT_ATTR_MAX_LEN); /* there's room for more */
@@ -179,7 +183,7 @@ unsigned GPU_vertformat_attr_add(
#endif
format->name_len++; /* multiname support */
- const unsigned attrib_id = format->attr_len++;
+ const uint attrib_id = format->attr_len++;
GPUVertAttr *attrib = format->attribs + attrib_id;
attrib->name[attrib->name_len++] = copy_attrib_name(format, name);
@@ -204,20 +208,33 @@ void GPU_vertformat_alias_add(GPUVertFormat *format, const char *alias)
attrib->name[attrib->name_len++] = copy_attrib_name(format, alias);
}
-unsigned padding(unsigned offset, unsigned alignment)
+int GPU_vertformat_attr_id_get(const GPUVertFormat *format, const char *name)
+{
+ for (int i = 0; i < format->attr_len; i++) {
+ const GPUVertAttr *attrib = format->attribs + i;
+ for (int j = 0; j < attrib->name_len; j++) {
+ if (STREQ(name, attrib->name[j])) {
+ return i;
+ }
+ }
+ }
+ return -1;
+}
+
+uint padding(uint offset, uint alignment)
{
- const unsigned mod = offset % alignment;
+ const uint mod = offset % alignment;
return (mod == 0) ? 0 : (alignment - mod);
}
#if PACK_DEBUG
-static void show_pack(unsigned a_idx, unsigned sz, unsigned pad)
+static void show_pack(uint a_idx, uint sz, uint pad)
{
const char c = 'A' + a_idx;
- for (unsigned i = 0; i < pad; ++i) {
+ for (uint i = 0; i < pad; ++i) {
putchar('-');
}
- for (unsigned i = 0; i < sz; ++i) {
+ for (uint i = 0; i < sz; ++i) {
putchar(c);
}
}
@@ -235,15 +252,15 @@ void VertexFormat_pack(GPUVertFormat *format)
GPUVertAttr *a0 = format->attribs + 0;
a0->offset = 0;
- unsigned offset = a0->sz;
+ uint offset = a0->sz;
#if PACK_DEBUG
show_pack(0, a0->sz, 0);
#endif
- for (unsigned a_idx = 1; a_idx < format->attr_len; ++a_idx) {
+ for (uint a_idx = 1; a_idx < format->attr_len; ++a_idx) {
GPUVertAttr *a = format->attribs + a_idx;
- unsigned mid_padding = padding(offset, attrib_align(a));
+ uint mid_padding = padding(offset, attrib_align(a));
offset += mid_padding;
a->offset = offset;
offset += a->sz;
@@ -253,7 +270,7 @@ void VertexFormat_pack(GPUVertFormat *format)
#endif
}
- unsigned end_padding = padding(offset, attrib_align(a0));
+ uint end_padding = padding(offset, attrib_align(a0));
#if PACK_DEBUG
show_pack(0, 0, end_padding);
@@ -263,6 +280,115 @@ void VertexFormat_pack(GPUVertFormat *format)
format->packed = true;
}
+static uint calc_input_component_size(const GPUShaderInput *input)
+{
+ int size = input->size;
+ switch (input->gl_type) {
+ case GL_FLOAT_VEC2:
+ case GL_INT_VEC2:
+ case GL_UNSIGNED_INT_VEC2:
+ return size * 2;
+ case GL_FLOAT_VEC3:
+ case GL_INT_VEC3:
+ case GL_UNSIGNED_INT_VEC3:
+ return size * 3;
+ case GL_FLOAT_VEC4:
+ case GL_FLOAT_MAT2:
+ case GL_INT_VEC4:
+ case GL_UNSIGNED_INT_VEC4:
+ return size * 4;
+ case GL_FLOAT_MAT3:
+ return size * 9;
+ case GL_FLOAT_MAT4:
+ return size * 16;
+ case GL_FLOAT_MAT2x3:
+ case GL_FLOAT_MAT3x2:
+ return size * 6;
+ case GL_FLOAT_MAT2x4:
+ case GL_FLOAT_MAT4x2:
+ return size * 8;
+ case GL_FLOAT_MAT3x4:
+ case GL_FLOAT_MAT4x3:
+ return size * 12;
+ default:
+ return size;
+ }
+}
+
+static void get_fetch_mode_and_comp_type(
+ int gl_type,
+ GPUVertCompType *r_comp_type,
+ uint *r_gl_comp_type,
+ GPUVertFetchMode *r_fetch_mode)
+{
+ switch (gl_type) {
+ case GL_FLOAT:
+ case GL_FLOAT_VEC2:
+ case GL_FLOAT_VEC3:
+ case GL_FLOAT_VEC4:
+ case GL_FLOAT_MAT2:
+ case GL_FLOAT_MAT3:
+ case GL_FLOAT_MAT4:
+ case GL_FLOAT_MAT2x3:
+ case GL_FLOAT_MAT2x4:
+ case GL_FLOAT_MAT3x2:
+ case GL_FLOAT_MAT3x4:
+ case GL_FLOAT_MAT4x2:
+ case GL_FLOAT_MAT4x3:
+ *r_comp_type = GPU_COMP_F32;
+ *r_gl_comp_type = GL_FLOAT;
+ *r_fetch_mode = GPU_FETCH_FLOAT;
+ break;
+ case GL_INT:
+ case GL_INT_VEC2:
+ case GL_INT_VEC3:
+ case GL_INT_VEC4:
+ *r_comp_type = GPU_COMP_I32;
+ *r_gl_comp_type = GL_INT;
+ *r_fetch_mode = GPU_FETCH_INT;
+ break;
+ case GL_UNSIGNED_INT:
+ case GL_UNSIGNED_INT_VEC2:
+ case GL_UNSIGNED_INT_VEC3:
+ case GL_UNSIGNED_INT_VEC4:
+ *r_comp_type = GPU_COMP_U32;
+ *r_gl_comp_type = GL_UNSIGNED_INT;
+ *r_fetch_mode = GPU_FETCH_INT;
+ break;
+ default:
+ BLI_assert(0);
+ }
+}
+
+void GPU_vertformat_from_interface(GPUVertFormat *format, const GPUShaderInterface *shaderface)
+{
+ const char *name_buffer = shaderface->name_buffer;
+
+ for (int i = 0; i < GPU_NUM_SHADERINTERFACE_BUCKETS; i++) {
+ const GPUShaderInput *input = shaderface->attrib_buckets[i];
+ if (input == NULL) {
+ continue;
+ }
+
+ const GPUShaderInput *next = input;
+ while (next != NULL) {
+ input = next;
+ next = input->next;
+
+ format->name_len++; /* multiname support */
+ format->attr_len++;
+
+ GPUVertAttr *attrib = format->attribs + input->location;
+
+ attrib->name[attrib->name_len++] = copy_attrib_name(format, name_buffer + input->name_offset);
+ attrib->offset = 0; /* offsets & stride are calculated later (during pack) */
+ attrib->comp_len = calc_input_component_size(input);
+ attrib->sz = attrib->comp_len * 4;
+ get_fetch_mode_and_comp_type(input->gl_type, &attrib->comp_type, &attrib->gl_comp_type, &attrib->fetch_mode);
+ }
+ }
+}
+
/* OpenGL ES packs in a different order as desktop GL but component conversion is the same.
* Of the code here, only struct GPUPackedNormal needs to change. */
diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c
index 5d495779ba1..1dd3faa3b03 100644
--- a/source/blender/gpu/intern/gpu_viewport.c
+++ b/source/blender/gpu/intern/gpu_viewport.c
@@ -76,7 +76,7 @@ struct GPUViewport {
int flag;
ListBase data; /* ViewportEngineData wrapped in LinkData */
- unsigned int data_hash; /* If hash mismatch we free all ViewportEngineData in this viewport */
+ uint data_hash; /* If hash mismatch we free all ViewportEngineData in this viewport */
DefaultFramebufferList *fbl;
DefaultTextureList *txl;
@@ -288,7 +288,7 @@ double *GPU_viewport_cache_time_get(GPUViewport *viewport)
}
/**
- * Try to find a texture coresponding to params into the texture pool.
+ * Try to find a texture corresponding to params into the texture pool.
* If no texture was found, create one and add it to the pool.
*/
GPUTexture *GPU_viewport_texture_pool_query(GPUViewport *viewport, void *engine, int width, int height, int format)
@@ -360,7 +360,7 @@ static void gpu_viewport_texture_pool_free(GPUViewport *viewport)
BLI_freelistN(&viewport->tex_pool);
}
-bool GPU_viewport_engines_data_validate(GPUViewport *viewport, unsigned int hash)
+bool GPU_viewport_engines_data_validate(GPUViewport *viewport, uint hash)
{
bool dirty = false;
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_edituvs_edges_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_edges_vert.glsl
new file mode 100644
index 00000000000..76e9c066103
--- /dev/null
+++ b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_edges_vert.glsl
@@ -0,0 +1,29 @@
+
+uniform mat4 ModelViewProjectionMatrix;
+uniform vec4 edgeColor;
+uniform vec4 selectColor;
+
+in vec2 pos;
+in int flag;
+
+#ifdef SMOOTH_COLOR
+noperspective out vec4 finalColor;
+#else
+flat out vec4 finalColor;
+#endif
+
+#define VERTEX_SELECT (1 << 0)
+#define EDGE_SELECT (1 << 4)
+
+void main()
+{
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0);
+
+#ifdef SMOOTH_COLOR
+ bool is_select = (flag & VERTEX_SELECT) != 0;
+#else
+ bool is_select = (flag & EDGE_SELECT) != 0;
+#endif
+
+ finalColor = (is_select) ? selectColor : edgeColor;
+}
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_edituvs_facedots_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_facedots_vert.glsl
new file mode 100644
index 00000000000..c5f84b976c5
--- /dev/null
+++ b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_facedots_vert.glsl
@@ -0,0 +1,17 @@
+
+uniform mat4 ModelViewProjectionMatrix;
+uniform vec4 vertColor;
+uniform vec4 selectColor;
+
+in vec2 pos;
+in int flag;
+
+out vec4 finalColor;
+
+#define FACE_SELECT (1 << 2)
+
+void main()
+{
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0);
+ finalColor = ((flag & FACE_SELECT) != 0) ? selectColor : vertColor;
+}
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_edituvs_faces_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_faces_vert.glsl
new file mode 100644
index 00000000000..82c8d3f0c4a
--- /dev/null
+++ b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_faces_vert.glsl
@@ -0,0 +1,24 @@
+
+uniform mat4 ModelViewProjectionMatrix;
+uniform vec4 faceColor;
+uniform vec4 selectColor;
+uniform vec4 activeColor;
+
+in vec2 pos;
+in int flag;
+
+flat out vec4 finalColor;
+
+#define FACE_SELECT (1 << 2)
+#define FACE_ACTIVE (1 << 3)
+
+void main()
+{
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0);
+
+ bool is_selected = (flag & FACE_SELECT) != 0;
+ bool is_active = (flag & FACE_ACTIVE) != 0;
+
+ finalColor = (is_selected) ? selectColor : faceColor;
+ finalColor = (is_active) ? activeColor : finalColor;
+}
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_edituvs_points_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_points_vert.glsl
new file mode 100644
index 00000000000..46dd1e066c8
--- /dev/null
+++ b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_points_vert.glsl
@@ -0,0 +1,42 @@
+
+uniform mat4 ModelViewProjectionMatrix;
+uniform vec4 vertColor;
+uniform vec4 selectColor;
+uniform vec4 pinnedColor;
+uniform float pointSize;
+uniform float outlineWidth;
+
+in vec2 pos;
+in int flag;
+
+out vec4 fillColor;
+out vec4 outlineColor;
+out vec4 radii;
+
+#define VERTEX_SELECT (1 << 0)
+#define VERTEX_PINNED (1 << 1)
+
+void main()
+{
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0);
+ gl_PointSize = pointSize;
+
+ bool is_selected = (flag & VERTEX_SELECT) != 0;
+ bool is_pinned = (flag & VERTEX_PINNED) != 0;
+
+ vec4 deselect_col = (is_pinned) ? pinnedColor : vertColor;
+ fillColor = (is_selected) ? selectColor : deselect_col;
+ outlineColor = (is_pinned) ? pinnedColor : vec4(fillColor.rgb, 0.0);
+
+ // calculate concentric radii in pixels
+ float radius = 0.5 * pointSize;
+
+ // start at the outside and progress toward the center
+ radii[0] = radius;
+ radii[1] = radius - 1.0;
+ radii[2] = radius - outlineWidth;
+ radii[3] = radius - outlineWidth - 1.0;
+
+ // convert to PointCoord units
+ radii /= pointSize;
+}
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_edituvs_stretch_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_stretch_vert.glsl
new file mode 100644
index 00000000000..4588e41573b
--- /dev/null
+++ b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_stretch_vert.glsl
@@ -0,0 +1,49 @@
+
+uniform mat4 ModelViewProjectionMatrix;
+
+in vec2 pos;
+in float stretch;
+
+noperspective out vec4 finalColor;
+
+vec3 weight_to_rgb(float weight)
+{
+ vec3 r_rgb;
+ float blend = ((weight / 2.0) + 0.5);
+
+ if (weight <= 0.25) { /* blue->cyan */
+ r_rgb[0] = 0.0;
+ r_rgb[1] = blend * weight * 4.0;
+ r_rgb[2] = blend;
+ }
+ else if (weight <= 0.50) { /* cyan->green */
+ r_rgb[0] = 0.0;
+ r_rgb[1] = blend;
+ r_rgb[2] = blend * (1.0 - ((weight - 0.25) * 4.0));
+ }
+ else if (weight <= 0.75) { /* green->yellow */
+ r_rgb[0] = blend * ((weight - 0.50) * 4.0);
+ r_rgb[1] = blend;
+ r_rgb[2] = 0.0;
+ }
+ else if (weight <= 1.0) { /* yellow->red */
+ r_rgb[0] = blend;
+ r_rgb[1] = blend * (1.0 - ((weight - 0.75) * 4.0));
+ r_rgb[2] = 0.0;
+ }
+ else {
+ /* exceptional value, unclamped or nan,
+ * avoid uninitialized memory use */
+ r_rgb[0] = 1.0;
+ r_rgb[1] = 0.0;
+ r_rgb[2] = 1.0;
+ }
+
+ return r_rgb;
+}
+
+void main()
+{
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0);
+ finalColor = vec4(weight_to_rgb(stretch), 1.0);
+}
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 9b63952db5c..7db0029e64d 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
@@ -47,7 +47,11 @@ const vec2 jit[9] = vec2[9](
/* We can reuse the CORNER_* bits for tria */
#define TRIA_VEC_RANGE BIT_RANGE(6)
-const vec2 triavec[43] = vec2[43](
+
+/* Some GPUs have performanse issues with this array being const (Doesn't fit in the registers?).
+ * To resolve this issue, store the array as a uniform buffer.
+ * (The array is still stored in the registry, but indexing is done in the uniform buffer.) */
+uniform vec2 triavec[43] = vec2[43](
/* ROUNDBOX_TRIA_ARROWS */
vec2(-0.170000, 0.400000), vec2(-0.050000, 0.520000), vec2( 0.250000, 0.000000), vec2( 0.470000, -0.000000), vec2(-0.170000, -0.400000), vec2(-0.050000, -0.520000),
@@ -74,10 +78,12 @@ const vec2 triavec[43] = vec2[43](
vec2(-0.130000, -0.170000), vec2(0.720000, 0.430000), vec2(0.530000, 0.590000),
/* ROUNDBOX_TRIA_HOLD_ACTION_ARROW - hold action arrows */
-#define OY (-0.2 / 2)
+#define OX (-0.32)
+#define OY (0.1)
#define SC (0.35 * 2)
// vec2(-0.5 + SC, 1.0 + OY), vec2( 0.5, 1.0 + OY), vec2( 0.5, 0.0 + OY + SC),
- vec2( 0.5 - SC, 1.0 + OY), vec2(-0.5, 1.0 + OY), vec2(-0.5, 0.0 + OY + SC)
+ vec2((0.5 - SC) + OX, 1.0 + OY), vec2(-0.5 + OX, 1.0 + OY), vec2(-0.5 + OX, SC + OY)
+#undef OX
#undef OY
#undef SC
);
diff --git a/source/blender/gpu/shaders/gpu_shader_fire_frag.glsl b/source/blender/gpu/shaders/gpu_shader_fire_frag.glsl
deleted file mode 100644
index fc9cafb6b02..00000000000
--- a/source/blender/gpu/shaders/gpu_shader_fire_frag.glsl
+++ /dev/null
@@ -1,15 +0,0 @@
-
-in vec3 coords;
-out vec4 fragColor;
-
-uniform sampler3D flame_texture;
-uniform sampler1D spectrum_texture;
-
-void main()
-{
- float flame = texture(flame_texture, coords).r;
- vec4 emission = texture(spectrum_texture, flame);
-
- fragColor.rgb = emission.a * emission.rgb;
- fragColor.a = emission.a;
-}
diff --git a/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_vert.glsl b/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_vert.glsl
index 5f4f56dcca1..5cbe2f60ebd 100644
--- a/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_gpencil_stroke_vert.glsl
@@ -2,7 +2,6 @@ uniform mat4 ModelViewProjectionMatrix;
uniform mat4 ProjectionMatrix;
uniform float pixsize; /* rv3d->pixsize */
-uniform float pixelsize; /* U.pixelsize */
uniform int keep_size;
uniform float objscale;
uniform int pixfactor;
@@ -16,7 +15,7 @@ out float finalThickness;
#define TRUE 1
-float defaultpixsize = pixsize * pixelsize * (1000.0 / pixfactor);
+float defaultpixsize = pixsize * (1000.0 / pixfactor);
void main(void)
{
diff --git a/source/blender/gpu/shaders/gpu_shader_image_alpha_color_frag.glsl b/source/blender/gpu/shaders/gpu_shader_image_alpha_color_frag.glsl
index fc0c8609069..e2af83ec529 100644
--- a/source/blender/gpu/shaders/gpu_shader_image_alpha_color_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_image_alpha_color_frag.glsl
@@ -9,6 +9,6 @@ void main()
{
fragColor = texture(image, texCoord_interp).r * color.rgba;
/* Premul by alpha (not texture alpha)
- * Use blending function GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); */
+ * Use blending function GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); */
fragColor.rgb *= color.a;
}
diff --git a/source/blender/gpu/shaders/gpu_shader_instance_camera_vert.glsl b/source/blender/gpu/shaders/gpu_shader_instance_camera_vert.glsl
index aec8fd9b0a1..805ecd6085f 100644
--- a/source/blender/gpu/shaders/gpu_shader_instance_camera_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_instance_camera_vert.glsl
@@ -1,7 +1,7 @@
uniform mat4 ViewProjectionMatrix;
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in float pos;
/* ---- Per instance Attribs ---- */
diff --git a/source/blender/gpu/shaders/gpu_shader_instance_distance_line_vert.glsl b/source/blender/gpu/shaders/gpu_shader_instance_distance_line_vert.glsl
index ced5bb7f684..255eeb9baf1 100644
--- a/source/blender/gpu/shaders/gpu_shader_instance_distance_line_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_instance_distance_line_vert.glsl
@@ -1,7 +1,7 @@
uniform mat4 ViewProjectionMatrix;
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec3 pos;
/* ---- Per instance Attribs ---- */
diff --git a/source/blender/gpu/shaders/gpu_shader_instance_objectspace_variying_color_vert.glsl b/source/blender/gpu/shaders/gpu_shader_instance_objectspace_variying_color_vert.glsl
index 9876717b297..d2b64608eaa 100644
--- a/source/blender/gpu/shaders/gpu_shader_instance_objectspace_variying_color_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_instance_objectspace_variying_color_vert.glsl
@@ -2,7 +2,7 @@
uniform mat4 ViewMatrix;
uniform mat4 ViewProjectionMatrix;
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec3 pos;
in vec3 nor;
diff --git a/source/blender/gpu/shaders/gpu_shader_instance_screen_aligned_vert.glsl b/source/blender/gpu/shaders/gpu_shader_instance_screen_aligned_vert.glsl
index 2ee74b3eae0..429b648ca53 100644
--- a/source/blender/gpu/shaders/gpu_shader_instance_screen_aligned_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_instance_screen_aligned_vert.glsl
@@ -2,7 +2,7 @@
uniform mat4 ViewProjectionMatrix;
uniform vec3 screen_vecs[2];
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec3 pos; /* using Z as axis id */
/* ---- Per instance Attribs ---- */
diff --git a/source/blender/gpu/shaders/gpu_shader_instance_screenspace_variying_color_vert.glsl b/source/blender/gpu/shaders/gpu_shader_instance_screenspace_variying_color_vert.glsl
index ba0ac29fb79..2a4675ce2c9 100644
--- a/source/blender/gpu/shaders/gpu_shader_instance_screenspace_variying_color_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_instance_screenspace_variying_color_vert.glsl
@@ -4,7 +4,7 @@ uniform vec3 screen_vecs[2];
uniform float size;
uniform float pixel_size;
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec2 pos;
/* ---- Per instance Attribs ---- */
diff --git a/source/blender/gpu/shaders/gpu_shader_instance_variying_size_variying_color_vert.glsl b/source/blender/gpu/shaders/gpu_shader_instance_variying_size_variying_color_vert.glsl
index 1c49d9dec3e..1ec158ae15c 100644
--- a/source/blender/gpu/shaders/gpu_shader_instance_variying_size_variying_color_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_instance_variying_size_variying_color_vert.glsl
@@ -2,7 +2,7 @@
uniform mat4 ViewProjectionMatrix;
uniform float alpha;
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec3 pos;
/* ---- Per instance Attribs ---- */
diff --git a/source/blender/gpu/shaders/gpu_shader_instance_variying_size_variying_id_vert.glsl b/source/blender/gpu/shaders/gpu_shader_instance_variying_size_variying_id_vert.glsl
index 49750dddb3c..f265bf9fc01 100644
--- a/source/blender/gpu/shaders/gpu_shader_instance_variying_size_variying_id_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_instance_variying_size_variying_id_vert.glsl
@@ -2,7 +2,7 @@
uniform mat4 ViewProjectionMatrix;
uniform int baseId;
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec3 pos;
/* ---- Per instance Attribs ---- */
diff --git a/source/blender/gpu/shaders/gpu_shader_instance_vert.glsl b/source/blender/gpu/shaders/gpu_shader_instance_vert.glsl
index eac167e8045..a4facae435e 100644
--- a/source/blender/gpu/shaders/gpu_shader_instance_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_instance_vert.glsl
@@ -1,7 +1,7 @@
uniform mat4 ViewProjectionMatrix;
-/* ---- Instanciated Attribs ---- */
+/* ---- Instantiated Attribs ---- */
in vec3 pos;
/* ---- Per instance Attribs ---- */
diff --git a/source/blender/gpu/shaders/gpu_shader_keyframe_diamond_frag.glsl b/source/blender/gpu/shaders/gpu_shader_keyframe_diamond_frag.glsl
index 7f445369833..1c12a4f942d 100644
--- a/source/blender/gpu/shaders/gpu_shader_keyframe_diamond_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_keyframe_diamond_frag.glsl
@@ -1,31 +1,87 @@
+flat in vec4 radii;
+flat in vec4 thresholds;
+
+flat in vec4 finalColor;
+flat in vec4 finalOutlineColor;
+
+flat in int finalFlags;
-in vec4 radii;
-in vec4 finalColor;
-in vec4 finalOutlineColor;
out vec4 fragColor;
+const float diagonal_scale = sqrt(0.5);
+
+const float minmax_bias = 0.7;
+const float minmax_scale = sqrt(1.0 / (1.0 + 1.0/minmax_bias));
+
+bool test(int bit) {
+ return (finalFlags & bit) != 0;
+}
+
void main() {
- vec2 quad = abs(gl_PointCoord - vec2(0.5));
- float dist = quad.x + quad.y;
-
-// transparent outside of point
-// --- 0 ---
-// smooth transition
-// --- 1 ---
-// pure outline color
-// --- 2 ---
-// smooth transition
-// --- 3 ---
-// pure point color
-// ...
-// dist = 0 at center of point
-
- float mid_stroke = 0.5 * (radii[1] + radii[2]);
-
- vec4 backgroundColor = vec4(finalOutlineColor.rgb, 0.0);
-
- if (dist > mid_stroke)
- fragColor = mix(finalOutlineColor, backgroundColor, smoothstep(radii[1], radii[0], dist));
- else
- fragColor = mix(finalColor, finalOutlineColor, smoothstep(radii[3], radii[2], dist));
+ vec2 pos = gl_PointCoord - vec2(0.5);
+ vec2 absPos = abs(pos);
+ float radius = (absPos.x + absPos.y) * diagonal_scale;
+
+ float outline_dist = -1.0;
+
+ /* Diamond outline */
+ if (test(0x1)) {
+ outline_dist = max(outline_dist, radius - radii[0]);
+ }
+
+ /* Circle outline */
+ if (test(0x2)) {
+ radius = length(absPos);
+
+ outline_dist = max(outline_dist, radius - radii[1]);
+ }
+
+ /* Top & Bottom clamp */
+ if (test(0x4)) {
+ outline_dist = max(outline_dist, absPos.y - radii[2]);
+ }
+
+ /* Left & Right clamp */
+ if (test(0x8)) {
+ outline_dist = max(outline_dist, absPos.x - radii[2]);
+ }
+
+ float alpha = 1 - smoothstep(thresholds[0], thresholds[1], abs(outline_dist));
+
+ /* Inside the outline. */
+ if (outline_dist < 0) {
+ /* Middle dot */
+ if (test(0x10)) {
+ alpha = max(alpha, 1 - smoothstep(thresholds[2], thresholds[3], radius));
+ }
+
+ /* Up and down arrow-like shading. */
+ if (test(0x300)) {
+ float ypos = -1.0;
+
+ /* Up arrow (maximum) */
+ if (test(0x100)) {
+ ypos = max(ypos, pos.y);
+ }
+ /* Down arrow (minimum) */
+ if (test(0x200)) {
+ ypos = max(ypos, -pos.y);
+ }
+
+ /* Arrow shape threshold. */
+ float minmax_dist = (ypos - radii[3]) - absPos.x * minmax_bias;
+ float minmax_step = smoothstep(thresholds[0], thresholds[1], minmax_dist * minmax_scale);
+
+ /* Reduced alpha for uncertain extremes. */
+ float minmax_alpha = test(0x400) ? 0.55 : 0.85;
+
+ alpha = max(alpha, minmax_step * minmax_alpha);
+ }
+
+ fragColor = mix(finalColor, finalOutlineColor, alpha);
+ }
+ /* Outside the outline. */
+ else {
+ fragColor = vec4(finalOutlineColor.rgb, finalOutlineColor.a * alpha);
+ }
}
diff --git a/source/blender/gpu/shaders/gpu_shader_keyframe_diamond_vert.glsl b/source/blender/gpu/shaders/gpu_shader_keyframe_diamond_vert.glsl
index c49832bf9b4..26eb864821a 100644
--- a/source/blender/gpu/shaders/gpu_shader_keyframe_diamond_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_keyframe_diamond_vert.glsl
@@ -1,34 +1,83 @@
uniform mat4 ModelViewProjectionMatrix;
+uniform vec2 ViewportSize = vec2(-1, -1);
-const float pixel_fudge = sqrt(2.0);
-const float outline_width = 1.15 * pixel_fudge;
+const float line_falloff = 1.0;
+const float circle_scale = sqrt(2.0 / 3.1416);
+const float square_scale = sqrt(0.5);
+
+const float diagonal_scale = sqrt(0.5);
in vec2 pos;
in float size;
in vec4 color;
in vec4 outlineColor;
-out vec4 finalColor;
-out vec4 finalOutlineColor;
-out vec4 radii;
+in int flags;
+
+flat out vec4 finalColor;
+flat out vec4 finalOutlineColor;
+
+flat out int finalFlags;
+
+flat out vec4 radii;
+flat out vec4 thresholds;
+
+bool test(int bit) {
+ return (flags & bit) != 0;
+}
+
+vec2 line_thresholds(float width) {
+ return vec2(max(0, width - line_falloff), width);
+}
void main() {
gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0);
- // pass through unchanged
- gl_PointSize = size + pixel_fudge; // 0.5 pixel_fudge on either side
+ /* Align to pixel grid if the viewport size is known. */
+ if (ViewportSize.x > 0) {
+ vec2 scale = ViewportSize * 0.5;
+ vec2 px_pos = (gl_Position.xy + 1) * scale;
+ vec2 adj_pos = round(px_pos - 0.5) + 0.5;
+ gl_Position.xy = adj_pos / scale - 1;
+ }
+
+ /* Pass through parameters. */
finalColor = color;
finalOutlineColor = outlineColor;
+ finalFlags = flags;
+
+ if (!test(0xF)) {
+ finalFlags |= 1;
+ }
+
+ /* Size-dependent line thickness. */
+ float half_width = (0.06 + (size - 10) * 0.04);
+ float line_width = half_width + line_falloff;
+
+ /* Outline thresholds. */
+ thresholds.xy = line_thresholds(line_width);
+
+ /* Inner dot thresholds. */
+ thresholds.zw = line_thresholds(line_width * 1.6);
+
+ /* Extend the primitive size by half line width on either side; odd for symmetry. */
+ float ext_radius = round(0.5 * size) + thresholds.x;
+
+ gl_PointSize = ceil(ext_radius + thresholds.y) * 2 + 1;
+
+ /* Diamond radius. */
+ radii[0] = ext_radius * diagonal_scale;
+
+ /* Circle radius. */
+ radii[1] = ext_radius * circle_scale;
- // calculate concentric radii in pixels
- float radius = 0.5 * gl_PointSize;
+ /* Square radius. */
+ radii[2] = round(ext_radius * square_scale);
- // start at the outside and progress toward the center
- radii[0] = radius;
- radii[1] = radius - pixel_fudge;
- radii[2] = radius - outline_width;
- radii[3] = radius - outline_width - pixel_fudge;
+ /* Min/max cutout offset. */
+ radii[3] = -line_falloff;
- // convert to PointCoord units
- radii /= size;
+ /* Convert to PointCoord units. */
+ radii /= gl_PointSize;
+ thresholds /= gl_PointSize;
}
diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl
index f3dea3afaf4..e729034f617 100644
--- a/source/blender/gpu/shaders/gpu_shader_material.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_material.glsl
@@ -1,10 +1,10 @@
-uniform mat4 ModelMatrix;
uniform mat4 ModelViewMatrix;
uniform mat4 ModelViewMatrixInverse;
uniform mat3 NormalMatrix;
#ifndef ATTRIB
+uniform mat4 ModelMatrix;
uniform mat4 ModelMatrixInverse;
#endif
@@ -204,7 +204,13 @@ void point_transform_m4v3(vec3 vin, mat4 mat, out vec3 vout)
void point_texco_remap_square(vec3 vin, out vec3 vout)
{
- vout = vec3(vin - vec3(0.5, 0.5, 0.5)) * 2.0;
+ vout = vin * 2.0 - 1.0;
+}
+
+void point_texco_clamp(vec3 vin, sampler2D ima, out vec3 vout)
+{
+ vec2 half_texel_size = 0.5 / vec2(textureSize(ima, 0).xy);
+ vout = clamp(vin, half_texel_size.xyy, 1.0 - half_texel_size.xyy);
}
void point_map_to_sphere(vec3 vin, out vec3 vout)
@@ -468,16 +474,10 @@ void invert_z(vec3 v, out vec3 outv)
outv = v;
}
-void normal(vec3 dir, vec3 nor, out vec3 outnor, out float outdot)
-{
- outnor = nor;
- outdot = -dot(dir, nor);
-}
-
-void normal_new_shading(vec3 dir, vec3 nor, out vec3 outnor, out float outdot)
+void normal_new_shading(vec3 nor, vec3 dir, out vec3 outnor, out float outdot)
{
- outnor = normalize(nor);
- outdot = dot(normalize(dir), nor);
+ outnor = dir;
+ outdot = dot(normalize(nor), dir);
}
void curves_vec(float fac, vec3 vec, sampler1DArray curvemap, float layer, out vec3 outvec)
@@ -820,7 +820,8 @@ void valtorgb(float fac, sampler1DArray colormap, float layer, out vec4 outcol,
void valtorgb_nearest(float fac, sampler1DArray colormap, float layer, out vec4 outcol, out float outalpha)
{
- outcol = texelFetch(colormap, ivec2(fac * textureSize(colormap, 0).x, layer), 0);
+ fac = clamp(fac, 0.0, 1.0);
+ outcol = texelFetch(colormap, ivec2(fac * (textureSize(colormap, 0).x - 1), layer), 0);
outalpha = outcol.a;
}
@@ -1096,7 +1097,8 @@ vec3 principled_sheen(float NV, vec3 basecol_tint, float sheen_tint)
#ifndef VOLUMETRICS
void node_bsdf_diffuse(vec4 color, float roughness, vec3 N, out Closure result)
{
- vec3 vN = normalize(mat3(ViewMatrix) * N);
+ N = normalize(N);
+ vec3 vN = mat3(ViewMatrix) * N;
result = CLOSURE_DEFAULT;
result.ssr_normal = normal_encode(vN, viewCameraVec);
eevee_closure_diffuse(N, color.rgb, 1.0, result.radiance);
@@ -1105,9 +1107,10 @@ void node_bsdf_diffuse(vec4 color, float roughness, vec3 N, out Closure result)
void node_bsdf_glossy(vec4 color, float roughness, vec3 N, float ssr_id, out Closure result)
{
+ N = normalize(N);
vec3 out_spec, ssr_spec;
eevee_closure_glossy(N, vec3(1.0), int(ssr_id), roughness, 1.0, out_spec, ssr_spec);
- vec3 vN = normalize(mat3(ViewMatrix) * N);
+ vec3 vN = mat3(ViewMatrix) * N;
result = CLOSURE_DEFAULT;
result.radiance = out_spec * color.rgb;
result.ssr_data = vec4(ssr_spec * color.rgb, roughness);
@@ -1124,13 +1127,14 @@ void node_bsdf_anisotropic(
void node_bsdf_glass(vec4 color, float roughness, float ior, vec3 N, 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), int(ssr_id), roughness, 1.0, ior, out_spec, out_refr, ssr_spec);
out_refr *= refr_color;
out_spec *= color.rgb;
float fresnel = F_eta(ior, dot(N, cameraVec));
- vec3 vN = normalize(mat3(ViewMatrix) * N);
+ vec3 vN = mat3(ViewMatrix) * N;
result = CLOSURE_DEFAULT;
result.radiance = mix(out_refr, out_spec, fresnel);
result.ssr_data = vec4(ssr_spec * color.rgb * fresnel, roughness);
@@ -1149,6 +1153,7 @@ void node_bsdf_principled(
float clearcoat_roughness, float ior, float transmission, float transmission_roughness, vec3 N, vec3 CN, vec3 T, vec3 I, 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);
@@ -1183,7 +1188,7 @@ void node_bsdf_principled(
refr_color *= (refractionDepth > 0.0) ? refr_color : vec3(1.0); /* Simulate 2 transmission event */
out_refr *= refr_color * (1.0 - fresnel) * transmission;
- vec3 vN = normalize(mat3(ViewMatrix) * N);
+ vec3 vN = mat3(ViewMatrix) * N;
result = CLOSURE_DEFAULT;
result.radiance = out_spec + out_refr;
result.radiance += out_diff * out_sheen; /* Coarse approx. */
@@ -1211,6 +1216,7 @@ void node_bsdf_principled_dielectric(
float clearcoat_roughness, float ior, float transmission, float transmission_roughness, vec3 N, vec3 CN, vec3 T, vec3 I, float ssr_id,
float sss_id, vec3 sss_scale, out Closure result)
{
+ N = normalize(N);
metallic = saturate(metallic);
float dielectric = 1.0 - metallic;
@@ -1223,7 +1229,7 @@ void node_bsdf_principled_dielectric(
eevee_closure_default(N, diffuse, f0, int(ssr_id), roughness, 1.0, out_diff, out_spec, ssr_spec);
- vec3 vN = normalize(mat3(ViewMatrix) * N);
+ vec3 vN = mat3(ViewMatrix) * N;
result = CLOSURE_DEFAULT;
result.radiance = out_spec + out_diff * (diffuse + out_sheen);
result.ssr_data = vec4(ssr_spec, roughness);
@@ -1237,11 +1243,12 @@ void node_bsdf_principled_metallic(
float clearcoat_roughness, float ior, float transmission, float transmission_roughness, vec3 N, vec3 CN, vec3 T, vec3 I, float ssr_id,
float sss_id, vec3 sss_scale, out Closure result)
{
+ N = normalize(N);
vec3 out_spec, ssr_spec;
eevee_closure_glossy(N, base_color.rgb, int(ssr_id), roughness, 1.0, out_spec, ssr_spec);
- vec3 vN = normalize(mat3(ViewMatrix) * N);
+ vec3 vN = mat3(ViewMatrix) * N;
result = CLOSURE_DEFAULT;
result.radiance = out_spec;
result.ssr_data = vec4(ssr_spec, roughness);
@@ -1256,11 +1263,12 @@ void node_bsdf_principled_clearcoat(
float sss_id, vec3 sss_scale, out Closure result)
{
vec3 out_spec, ssr_spec;
+ N = normalize(N);
eevee_closure_clearcoat(N, base_color.rgb, int(ssr_id), roughness, CN, clearcoat * 0.25, clearcoat_roughness,
1.0, out_spec, ssr_spec);
- vec3 vN = normalize(mat3(ViewMatrix) * N);
+ vec3 vN = mat3(ViewMatrix) * N;
result = CLOSURE_DEFAULT;
result.radiance = out_spec;
result.ssr_data = vec4(ssr_spec, roughness);
@@ -1275,6 +1283,7 @@ void node_bsdf_principled_subsurface(
float sss_id, vec3 sss_scale, out Closure result)
{
metallic = saturate(metallic);
+ N = normalize(N);
vec3 diffuse, f0, out_diff, out_spec, out_trans, ssr_spec;
vec3 ctint = tint_from_color(base_color.rgb);
@@ -1290,7 +1299,7 @@ void node_bsdf_principled_subsurface(
eevee_closure_skin(N, mixed_ss_base_color, f0, int(ssr_id), roughness, 1.0, sss_scalef,
out_diff, out_trans, out_spec, ssr_spec);
- vec3 vN = normalize(mat3(ViewMatrix) * N);
+ vec3 vN = mat3(ViewMatrix) * N;
result = CLOSURE_DEFAULT;
result.radiance = out_spec;
result.ssr_data = vec4(ssr_spec, roughness);
@@ -1317,6 +1326,7 @@ void node_bsdf_principled_glass(
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);
@@ -1332,7 +1342,7 @@ void node_bsdf_principled_glass(
out_spec *= spec_col;
ssr_spec *= spec_col * fresnel;
- vec3 vN = normalize(mat3(ViewMatrix) * N);
+ vec3 vN = mat3(ViewMatrix) * N;
result = CLOSURE_DEFAULT;
result.radiance = mix(out_refr, out_spec, fresnel);
result.ssr_data = vec4(ssr_spec, roughness);
@@ -1350,7 +1360,7 @@ void node_bsdf_transparent(vec4 color, out Closure result)
/* this isn't right */
result = CLOSURE_DEFAULT;
result.radiance = vec3(0.0);
- result.opacity = 0.0;
+ result.opacity = clamp(1.0 - dot(color.rgb, vec3(0.3333334)), 0.0, 1.0);
result.ssr_id = TRANSPARENT_CLOSURE_FLAG;
}
@@ -1364,8 +1374,9 @@ void node_subsurface_scattering(
out Closure result)
{
#if defined(USE_SSS)
+ N = normalize(N);
vec3 out_diff, out_trans;
- vec3 vN = normalize(mat3(ViewMatrix) * N);
+ vec3 vN = mat3(ViewMatrix) * N;
result = CLOSURE_DEFAULT;
result.ssr_data = vec4(0.0);
result.ssr_normal = normal_encode(vN, viewCameraVec);
@@ -1374,7 +1385,7 @@ void node_subsurface_scattering(
eevee_closure_subsurface(N, color.rgb, 1.0, scale, out_diff, out_trans);
result.sss_data.rgb = out_diff + out_trans;
# ifdef USE_SSS_ALBEDO
- /* Not perfect for texture_blur not exaclty equal to 0.0 or 1.0. */
+ /* Not perfect for texture_blur not exactly equal to 0.0 or 1.0. */
result.sss_albedo.rgb = mix(color.rgb, vec3(1.0), texture_blur);
result.sss_data.rgb *= mix(vec3(1.0), color.rgb, texture_blur);
# else
@@ -1387,10 +1398,11 @@ void node_subsurface_scattering(
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, out_refr);
- vec3 vN = normalize(mat3(ViewMatrix) * N);
+ vec3 vN = mat3(ViewMatrix) * N;
result = CLOSURE_DEFAULT;
result.ssr_normal = normal_encode(vN, viewCameraVec);
result.radiance = out_refr * color.rgb;
@@ -1422,18 +1434,48 @@ void node_emission(vec4 color, float strength, vec3 vN, out Closure result)
#endif
}
+void node_wireframe(float size, vec2 barycentric, vec3 barycentric_dist, out float fac)
+{
+ vec3 barys = barycentric.xyy;
+ barys.z = 1.0 - barycentric.x - barycentric.y;
+
+ size *= 0.5;
+ vec3 s = step(-size, -barys * barycentric_dist);
+
+ fac = max(s.x, max(s.y, s.z));
+}
+
+void node_wireframe_screenspace(float size, vec2 barycentric, out float fac)
+{
+ vec3 barys = barycentric.xyy;
+ barys.z = 1.0 - barycentric.x - barycentric.y;
+
+ size *= (1.0 / 3.0);
+ vec3 dx = dFdx(barys);
+ vec3 dy = dFdy(barys);
+ vec3 deltas = sqrt(dx * dx + dy * dy);
+
+ vec3 s = step(-deltas * size, -barys);
+
+ fac = max(s.x, max(s.y, s.z));
+}
+
/* background */
-void background_transform_to_world(vec3 viewvec, out vec3 worldvec)
+void node_tex_environment_texco(vec3 viewvec, out vec3 worldvec)
{
+#ifdef MESH_SHADER
+ worldvec = worldPosition;
+#else
vec4 v = (ProjectionMatrix[3][3] == 0.0) ? vec4(viewvec, 1.0) : vec4(0.0, 0.0, 1.0, 1.0);
vec4 co_homogenous = (ProjectionMatrixInverse * v);
vec4 co = vec4(co_homogenous.xyz / co_homogenous.w, 0.0);
-#if defined(WORLD_BACKGROUND) || defined(PROBE_CAPTURE)
+# if defined(WORLD_BACKGROUND) || defined(PROBE_CAPTURE)
worldvec = (ViewMatrixInverse * co).xyz;
-#else
+# else
worldvec = (ModelViewMatrixInverse * co).xyz;
+# endif
#endif
}
@@ -1566,6 +1608,7 @@ void node_add_shader(Closure shader1, Closure shader2, out Closure shader)
void node_fresnel(float ior, vec3 N, vec3 I, out float result)
{
+ N = normalize(N);
/* handle perspective/orthographic */
vec3 I_view = (ProjectionMatrix[3][3] == 0.0) ? normalize(I) : vec3(0.0, 0.0, -1.0);
@@ -1577,6 +1620,8 @@ void node_fresnel(float ior, vec3 N, vec3 I, out float result)
void node_layer_weight(float blend, vec3 N, vec3 I, out float fresnel, out float facing)
{
+ N = normalize(N);
+
/* fresnel */
float eta = max(1.0 - blend, 0.00001);
vec3 I_view = (ProjectionMatrix[3][3] == 0.0) ? normalize(I) : vec3(0.0, 0.0, -1.0);
@@ -1679,17 +1724,17 @@ void node_uvmap(vec3 attr_uv, out vec3 outvec)
void tangent_orco_x(vec3 orco_in, out vec3 orco_out)
{
- orco_out = vec3(0.0, (orco_in.z - 0.5) * -0.5, (orco_in.y - 0.5) * 0.5);
+ orco_out = orco_in.xzy * vec3(0.0, -0.5, 0.5) + vec3(0.0, 0.25, -0.25);
}
void tangent_orco_y(vec3 orco_in, out vec3 orco_out)
{
- orco_out = vec3((orco_in.z - 0.5) * -0.5, 0.0, (orco_in.x - 0.5) * 0.5);
+ orco_out = orco_in.zyx * vec3(-0.5, 0.0, 0.5) + vec3(0.25, 0.0, -0.25);
}
void tangent_orco_z(vec3 orco_in, out vec3 orco_out)
{
- orco_out = vec3((orco_in.y - 0.5) * -0.5, (orco_in.x - 0.5) * 0.5, 0.0);
+ orco_out = orco_in.yxz * vec3(-0.5, 0.5, 0.0) + vec3(0.25, -0.25, 0.0);
}
void node_tangentmap(vec4 attr_tangent, mat4 toworld, out vec3 tangent)
@@ -1699,7 +1744,11 @@ void node_tangentmap(vec4 attr_tangent, mat4 toworld, out vec3 tangent)
void node_tangent(vec3 N, vec3 orco, mat4 objmat, mat4 toworld, out vec3 T)
{
+#ifndef VOLUMETRICS
+ N = normalize(worldNormal);
+#else
N = (toworld * vec4(N, 0.0)).xyz;
+#endif
T = (objmat * vec4(orco, 0.0)).xyz;
T = cross(N, normalize(cross(T, N)));
}
@@ -1710,19 +1759,50 @@ void node_geometry(
out vec3 true_normal, out vec3 incoming, out vec3 parametric,
out float backfacing, out float pointiness)
{
+ /* handle perspective/orthographic */
+ vec3 I_view = (ProjectionMatrix[3][3] == 0.0) ? normalize(I) : vec3(0.0, 0.0, -1.0);
+ incoming = -(toworld * vec4(I_view, 0.0)).xyz;
+
+#if defined(WORLD_BACKGROUND) || defined(PROBE_CAPTURE)
+ position = -incoming;
+ true_normal = normal = incoming;
+ tangent = parametric = vec3(0.0);
+ vec3(0.0);
+ backfacing = 0.0;
+ pointiness = 0.0;
+#else
+
position = worldPosition;
+# ifndef VOLUMETRICS
+ normal = normalize(worldNormal);
+
+ vec3 B = dFdx(worldPosition);
+ vec3 T = dFdy(worldPosition);
+ true_normal = normalize(cross(B, T));
+# else
normal = (toworld * vec4(N, 0.0)).xyz;
+ true_normal = normal;
+# endif
tangent_orco_z(orco, orco);
node_tangent(N, orco, objmat, toworld, tangent);
- true_normal = normal;
-
- /* handle perspective/orthographic */
- vec3 I_view = (ProjectionMatrix[3][3] == 0.0) ? normalize(I) : vec3(0.0, 0.0, -1.0);
- incoming = -(toworld * vec4(I_view, 0.0)).xyz;
parametric = vec3(barycentric, 0.0);
backfacing = (gl_FrontFacing) ? 0.0 : 1.0;
pointiness = 0.5;
+#endif
+}
+
+void generated_texco(vec3 I, vec3 attr_orco, out vec3 generated)
+{
+ vec4 v = (ProjectionMatrix[3][3] == 0.0) ? vec4(I, 1.0) : vec4(0.0, 0.0, 1.0, 1.0);
+ vec4 co_homogenous = (ProjectionMatrixInverse * v);
+ vec4 co = vec4(co_homogenous.xyz / co_homogenous.w, 0.0);
+ co.xyz = normalize(co.xyz);
+#if defined(WORLD_BACKGROUND) || defined(PROBE_CAPTURE)
+ generated = (ViewMatrixInverse * co).xyz;
+#else
+ generated_from_orco(attr_orco, generated);
+#endif
}
void node_tex_coord(
@@ -1835,9 +1915,7 @@ void node_tex_checker(vec3 co, vec4 color1, vec4 color2, float scale, out vec4 c
vec3 p = co * scale;
/* Prevent precision issues on unit coordinates. */
- p.x = (p.x + 0.000001) * 0.999999;
- p.y = (p.y + 0.000001) * 0.999999;
- p.z = (p.z + 0.000001) * 0.999999;
+ p = (p + 0.000001) * 0.999999;
int xi = int(abs(floor(p.x)));
int yi = int(abs(floor(p.y)));
@@ -1915,37 +1993,27 @@ void node_tex_clouds(vec3 co, float size, out vec4 color, out float fac)
fac = 1.0;
}
-void node_tex_environment_equirectangular(vec3 co, sampler2D ima, out vec4 color)
+void node_tex_environment_equirectangular(vec3 co, float clamp_size, sampler2D ima, out vec3 uv)
{
vec3 nco = normalize(co);
- float u = -atan(nco.y, nco.x) / (2.0 * M_PI) + 0.5;
- float v = atan(nco.z, hypot(nco.x, nco.y)) / M_PI + 0.5;
+ uv.x = -atan(nco.y, nco.x) / (2.0 * M_PI) + 0.5;
+ uv.y = atan(nco.z, hypot(nco.x, nco.y)) / M_PI + 0.5;
/* Fix pole bleeding */
- float half_width = 0.5 / float(textureSize(ima, 0).x);
- v = clamp(v, half_width, 1.0 - half_width);
-
- /* Fix u = 0 seam */
- /* This is caused by texture filtering, since uv don't have smooth derivatives
- * at u = 0 or 2PI, hardware filtering is using the smallest mipmap for certain
- * texels. So we force the highest mipmap and don't do anisotropic filtering. */
- color = textureLod(ima, vec2(u, v), 0.0);
+ float half_height = clamp_size / float(textureSize(ima, 0).y);
+ uv.y = clamp(uv.y, half_height, 1.0 - half_height);
+ uv.z = 0.0;
}
-void node_tex_environment_mirror_ball(vec3 co, sampler2D ima, out vec4 color)
+void node_tex_environment_mirror_ball(vec3 co, out vec3 uv)
{
vec3 nco = normalize(co);
-
nco.y -= 1.0;
float div = 2.0 * sqrt(max(-0.5 * nco.y, 0.0));
- if (div > 0.0)
- nco /= div;
+ nco /= max(1e-8, div);
- float u = 0.5 * (nco.x + 1.0);
- float v = 0.5 * (nco.z + 1.0);
-
- color = texture(ima, vec2(u, v));
+ uv = 0.5 * nco.xzz + 0.5;
}
void node_tex_environment_empty(vec3 co, out vec4 color)
@@ -1959,6 +2027,12 @@ void node_tex_image_linear(vec3 co, sampler2D ima, out vec4 color, out float alp
alpha = color.a;
}
+void node_tex_image_linear_no_mip(vec3 co, sampler2D ima, out vec4 color, out float alpha)
+{
+ color = textureLod(ima, co.xy, 0.0);
+ alpha = color.a;
+}
+
void node_tex_image_nearest(vec3 co, sampler2D ima, out vec4 color, out float alpha)
{
ivec2 pix = ivec2(fract(co.xy) * textureSize(ima, 0).xy);
@@ -1966,21 +2040,27 @@ void node_tex_image_nearest(vec3 co, sampler2D ima, out vec4 color, out float al
alpha = color.a;
}
-void node_tex_image_cubic(vec3 co, sampler2D ima, out vec4 color, out float alpha)
+/* @arg f: signed distance to texel center. */
+void cubic_bspline_coefs(vec2 f, out vec2 w0, out vec2 w1, out vec2 w2, out vec2 w3)
+{
+ vec2 f2 = f * f;
+ vec2 f3 = f2 * f;
+ /* Bspline coefs (optimized) */
+ w3 = f3 / 6.0;
+ w0 = -w3 + f2 * 0.5 - f * 0.5 + 1.0 / 6.0;
+ w1 = f3 * 0.5 - f2 * 1.0 + 2.0 / 3.0;
+ w2 = 1.0 - w0 - w1 - w3;
+}
+
+void node_tex_image_cubic_ex(vec3 co, sampler2D ima, float do_extend, out vec4 color, out float alpha)
{
vec2 tex_size = vec2(textureSize(ima, 0).xy);
co.xy *= tex_size;
/* texel center */
vec2 tc = floor(co.xy - 0.5) + 0.5;
- vec2 f = co.xy - tc;
- vec2 f2 = f * f;
- vec2 f3 = f2 * f;
- /* Bspline coefs (optimized) */
- vec2 w3 = f3 / 6.0;
- vec2 w0 = -w3 + f2 * 0.5 - f * 0.5 + 1.0 / 6.0;
- vec2 w1 = f3 * 0.5 - f2 * 1.0 + 2.0 / 3.0;
- vec2 w2 = 1.0 - w0 - w1 - w3;
+ vec2 w0, w1, w2, w3;
+ cubic_bspline_coefs(co.xy - tc, w0, w1, w2, w3);
#if 1 /* Optimized version using 4 filtered tap. */
vec2 s0 = w0 + w1;
@@ -1993,12 +2073,15 @@ void node_tex_image_cubic(vec3 co, sampler2D ima, out vec4 color, out float alph
final_co.xy = tc - 1.0 + f0;
final_co.zw = tc + 1.0 + f1;
+ if (do_extend == 1.0) {
+ final_co = clamp(final_co, vec4(0.5), tex_size.xyxy - 0.5);
+ }
final_co /= tex_size.xyxy;
- color = texture(ima, final_co.xy) * s0.x * s0.y;
- color += texture(ima, final_co.zy) * s1.x * s0.y;
- color += texture(ima, final_co.xw) * s0.x * s1.y;
- color += texture(ima, final_co.zw) * s1.x * s1.y;
+ color = textureLod(ima, final_co.xy, 0.0) * s0.x * s0.y;
+ color += textureLod(ima, final_co.zy, 0.0) * s1.x * s0.y;
+ color += textureLod(ima, final_co.xw, 0.0) * s0.x * s1.y;
+ color += textureLod(ima, final_co.zw, 0.0) * s1.x * s1.y;
#else /* Reference bruteforce 16 tap. */
color = texelFetch(ima, ivec2(tc + vec2(-1.0, -1.0)), 0) * w0.x * w0.y;
@@ -2025,10 +2108,20 @@ void node_tex_image_cubic(vec3 co, sampler2D ima, out vec4 color, out float alph
alpha = color.a;
}
+void node_tex_image_cubic(vec3 co, sampler2D ima, out vec4 color, out float alpha)
+{
+ node_tex_image_cubic_ex(co, ima, 0.0, color, alpha);
+}
+
+void node_tex_image_cubic_extend(vec3 co, sampler2D ima, out vec4 color, out float alpha)
+{
+ node_tex_image_cubic_ex(co, ima, 1.0, color, alpha);
+}
+
void node_tex_image_smart(vec3 co, sampler2D ima, out vec4 color, out float alpha)
{
/* use cubic for now */
- node_tex_image_cubic(co, ima, color, alpha);
+ node_tex_image_cubic_ex(co, ima, 0.0, color, alpha);
}
void tex_box_sample_linear(vec3 texco,
@@ -2101,19 +2194,19 @@ void tex_box_sample_cubic(vec3 texco,
if (N.x < 0.0) {
uv.x = 1.0 - uv.x;
}
- node_tex_image_cubic(uv.xyy, ima, color1, alpha);
+ node_tex_image_cubic_ex(uv.xyy, ima, 0.0, color1, alpha);
/* Y projection */
uv = texco.xz;
if (N.y > 0.0) {
uv.x = 1.0 - uv.x;
}
- node_tex_image_cubic(uv.xyy, ima, color2, alpha);
+ node_tex_image_cubic_ex(uv.xyy, ima, 0.0, color2, alpha);
/* Z projection */
uv = texco.yx;
if (N.z > 0.0) {
uv.x = 1.0 - uv.x;
}
- node_tex_image_cubic(uv.xyy, ima, color3, alpha);
+ node_tex_image_cubic_ex(uv.xyy, ima, 0.0, color3, alpha);
}
void tex_box_sample_smart(vec3 texco,
@@ -2154,9 +2247,7 @@ void node_tex_image_box(vec3 texco,
float limit = 0.5 + 0.5 * blend;
vec3 weight;
- weight.x = N.x / (N.x + N.y);
- weight.y = N.y / (N.y + N.z);
- weight.z = N.z / (N.x + N.z);
+ weight = N.xyz / (N.xyx + N.yzz);
weight = clamp((weight - 0.5 * (1.0 - blend)) / max(1e-8, blend), 0.0, 1.0);
/* test for mixes between two textures */
@@ -2181,6 +2272,69 @@ void node_tex_image_box(vec3 texco,
alpha = color.a;
}
+void tex_clip_linear(vec3 co, sampler2D ima, vec4 icolor, out vec4 color, out float alpha)
+{
+ vec2 tex_size = vec2(textureSize(ima, 0).xy);
+ vec2 minco = min(co.xy, 1.0 - co.xy);
+ minco = clamp(minco * tex_size + 0.5, 0.0, 1.0);
+ float fac = minco.x * minco.y;
+
+ color = mix(vec4(0.0), icolor, fac);
+ alpha = color.a;
+}
+
+void tex_clip_nearest(vec3 co, sampler2D ima, vec4 icolor, out vec4 color, out float alpha)
+{
+ vec4 minco = vec4(co.xy, 1.0 - co.xy);
+ color = (any(lessThan(minco, vec4(0.0)))) ? vec4(0.0) : icolor;
+ alpha = color.a;
+}
+
+void tex_clip_cubic(vec3 co, sampler2D ima, vec4 icolor, out vec4 color, out float alpha)
+{
+ vec2 tex_size = vec2(textureSize(ima, 0).xy);
+
+ co.xy *= tex_size;
+ /* texel center */
+ vec2 tc = floor(co.xy - 0.5) + 0.5;
+ vec2 w0, w1, w2, w3;
+ cubic_bspline_coefs(co.xy - tc, w0, w1, w2, w3);
+
+ /* TODO Optimize this part. I'm sure there is a smarter way to do that.
+ * Could do that when sampling? */
+#define CLIP_CUBIC_SAMPLE(samp, size) (float(all(greaterThan(samp, vec2(-0.5)))) * float(all(lessThan(ivec2(samp), itex_size))))
+ ivec2 itex_size = textureSize(ima, 0).xy;
+ float fac;
+ fac = CLIP_CUBIC_SAMPLE(tc + vec2(-1.0, -1.0), itex_size) * w0.x * w0.y;
+ fac += CLIP_CUBIC_SAMPLE(tc + vec2( 0.0, -1.0), itex_size) * w1.x * w0.y;
+ fac += CLIP_CUBIC_SAMPLE(tc + vec2( 1.0, -1.0), itex_size) * w2.x * w0.y;
+ fac += CLIP_CUBIC_SAMPLE(tc + vec2( 2.0, -1.0), itex_size) * w3.x * w0.y;
+
+ fac += CLIP_CUBIC_SAMPLE(tc + vec2(-1.0, 0.0), itex_size) * w0.x * w1.y;
+ fac += CLIP_CUBIC_SAMPLE(tc + vec2( 0.0, 0.0), itex_size) * w1.x * w1.y;
+ fac += CLIP_CUBIC_SAMPLE(tc + vec2( 1.0, 0.0), itex_size) * w2.x * w1.y;
+ fac += CLIP_CUBIC_SAMPLE(tc + vec2( 2.0, 0.0), itex_size) * w3.x * w1.y;
+
+ fac += CLIP_CUBIC_SAMPLE(tc + vec2(-1.0, 1.0), itex_size) * w0.x * w2.y;
+ fac += CLIP_CUBIC_SAMPLE(tc + vec2( 0.0, 1.0), itex_size) * w1.x * w2.y;
+ fac += CLIP_CUBIC_SAMPLE(tc + vec2( 1.0, 1.0), itex_size) * w2.x * w2.y;
+ fac += CLIP_CUBIC_SAMPLE(tc + vec2( 2.0, 1.0), itex_size) * w3.x * w2.y;
+
+ fac += CLIP_CUBIC_SAMPLE(tc + vec2(-1.0, 2.0), itex_size) * w0.x * w3.y;
+ fac += CLIP_CUBIC_SAMPLE(tc + vec2( 0.0, 2.0), itex_size) * w1.x * w3.y;
+ fac += CLIP_CUBIC_SAMPLE(tc + vec2( 1.0, 2.0), itex_size) * w2.x * w3.y;
+ fac += CLIP_CUBIC_SAMPLE(tc + vec2( 2.0, 2.0), itex_size) * w3.x * w3.y;
+#undef CLIP_CUBIC_SAMPLE
+
+ color = mix(vec4(0.0), icolor, fac);
+ alpha = color.a;
+}
+
+void tex_clip_smart(vec3 co, sampler2D ima, vec4 icolor, out vec4 color, out float alpha)
+{
+ tex_clip_cubic(co, ima, icolor, color, alpha);
+}
+
void node_tex_image_empty(vec3 co, out vec4 color, out float alpha)
{
color = vec4(0.0);
@@ -2577,7 +2731,7 @@ void node_tex_sky(vec3 co, out vec4 color)
color = vec4(1.0);
}
-void node_tex_voronoi(vec3 co, float scale, float exponent, float coloring, out vec4 color, out float fac)
+void node_tex_voronoi(vec3 co, float scale, float exponent, float coloring, float metric, float feature, out vec4 color, out float fac)
{
vec3 p = co * scale;
int xx, yy, zz, xi, yi, zi;
@@ -2599,7 +2753,21 @@ void node_tex_voronoi(vec3 co, float scale, float exponent, float coloring, out
vec3 ip = vec3(xx, yy, zz);
vec3 vp = cellnoise_color(ip);
vec3 pd = p - (vp + ip);
- float d = dot(pd, pd);
+
+ float d = 0.0;
+ if (metric == 0) { /* SHD_VORONOI_DISTANCE 0 */
+ d = dot(pd, pd);
+ }
+ else if (metric == 1) { /* SHD_VORONOI_MANHATTAN 1 */
+ d = abs(pd[0]) + abs(pd[1]) + abs(pd[2]);
+ }
+ else if (metric == 2) { /* SHD_VORONOI_CHEBYCHEV 2 */
+ d = max(abs(pd[0]), max(abs(pd[1]), abs(pd[2])));
+ }
+ else if (metric == 3) { /* SHD_VORONOI_MINKOWSKI 3 */
+ d = pow(pow(abs(pd[0]), exponent) + pow(abs(pd[1]), exponent) + pow(abs(pd[2]), exponent), 1.0/exponent);
+ }
+
vp += vec3(xx, yy, zz);
if (d < da[0]) {
da[3] = da[2];
@@ -2636,11 +2804,44 @@ void node_tex_voronoi(vec3 co, float scale, float exponent, float coloring, out
}
if (coloring == 0.0) {
- fac = abs(da[0]);
+ /* Intensity output */
+ if (feature == 0) { /* F1 */
+ fac = abs(da[0]);
+ }
+ else if (feature == 1) { /* F2 */
+ fac = abs(da[1]);
+ }
+ else if (feature == 2) { /* F3 */
+ fac = abs(da[2]);
+ }
+ else if (feature == 3) { /* F4 */
+ fac = abs(da[3]);
+ }
+ else if (feature == 4) { /* F2F1 */
+ fac = abs(da[1] - da[0]);
+ }
color = vec4(fac, fac, fac, 1);
}
else {
- color = vec4(cellnoise_color(pa[0]), 1);
+ /* Color output */
+ vec3 col = vec3(fac, fac, fac);
+ if (feature == 0) { /* F1 */
+ col = pa[0];
+ }
+ else if (feature == 1) { /* F2 */
+ col = pa[1];
+ }
+ else if (feature == 2) { /* F3 */
+ col = pa[2];
+ }
+ else if (feature == 3) { /* F4 */
+ col = pa[3];
+ }
+ else if (feature == 4) { /* F2F1 */
+ col = abs(pa[1] - pa[0]);
+ }
+
+ color = vec4(cellnoise_color(col), 1);
fac = (color.x + color.y + color.z) * (1.0 / 3.0);
}
}
@@ -2695,27 +2896,22 @@ void node_light_path(
out float transparent_depth,
out float transmission_depth)
{
-#ifndef PROBE_CAPTURE
- is_camera_ray = 1.0;
- is_glossy_ray = 0.0;
- is_diffuse_ray = 0.0;
- is_reflection_ray = 0.0;
- is_transmission_ray = 0.0;
-#else
- is_camera_ray = 0.0;
- is_glossy_ray = 1.0;
- is_diffuse_ray = 1.0;
- is_reflection_ray = 1.0;
- is_transmission_ray = 1.0;
-#endif
- is_shadow_ray = 0.0;
- is_singular_ray = 0.0;
+ /* Supported. */
+ is_camera_ray = (rayType == EEVEE_RAY_CAMERA) ? 1.0 : 0.0;
+ is_shadow_ray = (rayType == EEVEE_RAY_SHADOW) ? 1.0 : 0.0;
+ is_diffuse_ray = (rayType == EEVEE_RAY_DIFFUSE) ? 1.0 : 0.0;
+ is_glossy_ray = (rayType == EEVEE_RAY_GLOSSY) ? 1.0 : 0.0;
+ /* Kind of supported. */
+ is_singular_ray = is_glossy_ray;
+ is_reflection_ray = is_glossy_ray;
+ is_transmission_ray = is_glossy_ray;
+ ray_depth = rayDepth;
+ diffuse_depth = (is_diffuse_ray == 1.0) ? rayDepth : 0.0;
+ glossy_depth = (is_glossy_ray == 1.0) ? rayDepth : 0.0;
+ transmission_depth = (is_transmission_ray == 1.0) ? glossy_depth : 0.0;
+ /* Not supported. */
ray_length = 1.0;
- ray_depth = 1.0;
- diffuse_depth = 1.0;
- glossy_depth = 1.0;
- transparent_depth = 1.0;
- transmission_depth = 1.0;
+ transparent_depth = 0.0;
}
void node_light_falloff(float strength, float tsmooth, out float quadratic, out float linear, out float constant)
@@ -2743,9 +2939,9 @@ void node_normal_map(vec4 tangent, vec3 normal, vec3 texnormal, out vec3 outnorm
void node_bump(float strength, float dist, float height, vec3 N, vec3 surf_pos, float invert, out vec3 result)
{
- if (invert != 0.0) {
- dist *= -1.0;
- }
+ N = mat3(ViewMatrix) * normalize(N);
+ dist *= invert;
+
vec3 dPdx = dFdx(surf_pos);
vec3 dPdy = dFdy(surf_pos);
@@ -2755,7 +2951,6 @@ void node_bump(float strength, float dist, float height, vec3 N, vec3 surf_pos,
/* Compute surface gradient and determinant. */
float det = dot(dPdx, Rx);
- float absdet = abs(det);
float dHdx = dFdx(height);
float dHdy = dFdy(height);
@@ -2763,8 +2958,10 @@ void node_bump(float strength, float dist, float height, vec3 N, vec3 surf_pos,
strength = max(strength, 0.0);
- result = normalize(absdet * N - dist * sign(det) * surfgrad);
- result = normalize(strength * result + (1.0 - strength) * N);
+ result = normalize(abs(det) * N - dist * sign(det) * surfgrad);
+ result = normalize(mix(N, result, strength));
+
+ result = mat3(ViewMatrixInverse) * result;
}
void node_bevel(float radius, vec3 N, out vec3 result)
diff --git a/source/blender/gpu/shaders/gpu_shader_point_varying_color_varying_outline_aa_frag.glsl b/source/blender/gpu/shaders/gpu_shader_point_varying_color_varying_outline_aa_frag.glsl
new file mode 100644
index 00000000000..e1f8203cb26
--- /dev/null
+++ b/source/blender/gpu/shaders/gpu_shader_point_varying_color_varying_outline_aa_frag.glsl
@@ -0,0 +1,30 @@
+
+in vec4 radii;
+in vec4 fillColor;
+in vec4 outlineColor;
+out vec4 fragColor;
+
+void main() {
+ float dist = length(gl_PointCoord - vec2(0.5));
+
+// transparent outside of point
+// --- 0 ---
+// smooth transition
+// --- 1 ---
+// pure outline color
+// --- 2 ---
+// smooth transition
+// --- 3 ---
+// pure fill color
+// ...
+// dist = 0 at center of point
+
+ float midStroke = 0.5 * (radii[1] + radii[2]);
+
+ if (dist > midStroke) {
+ fragColor.rgb = outlineColor.rgb;
+ fragColor.a = mix(outlineColor.a, 0.0, smoothstep(radii[1], radii[0], dist));
+ }
+ else
+ fragColor = mix(fillColor, outlineColor, smoothstep(radii[3], radii[2], dist));
+}
diff --git a/source/blender/gpu/shaders/gpu_shader_smoke_frag.glsl b/source/blender/gpu/shaders/gpu_shader_smoke_frag.glsl
deleted file mode 100644
index b57bd5b6a37..00000000000
--- a/source/blender/gpu/shaders/gpu_shader_smoke_frag.glsl
+++ /dev/null
@@ -1,47 +0,0 @@
-
-in vec3 coords;
-out vec4 fragColor;
-
-uniform vec3 active_color;
-uniform float step_size;
-uniform float density_scale;
-
-uniform sampler3D soot_texture;
-uniform sampler3D shadow_texture;
-
-#ifdef USE_COBA
-uniform sampler1D transfer_texture;
-uniform sampler3D color_band_texture;
-#endif
-
-void main()
-{
- /* compute color and density from volume texture */
- vec4 soot = texture(soot_texture, coords);
-
-#ifndef USE_COBA
- vec3 soot_color;
- if (soot.a != 0) {
- soot_color = active_color * soot.rgb / soot.a;
- }
- else {
- soot_color = vec3(0);
- }
- float soot_density = density_scale * soot.a;
-
- /* compute transmittance and alpha */
- float soot_transmittance = pow(2.71828182846, -soot_density * step_size);
- float soot_alpha = 1.0 - soot_transmittance;
-
- /* shade */
- float shadow = texture(shadow_texture, coords).r;
- soot_color *= soot_transmittance * shadow;
-
- /* premultiply alpha */
- fragColor = vec4(soot_alpha * soot_color, soot_alpha);
-#else
- float color_band = texture(color_band_texture, coords).r;
- vec4 transfer_function = texture(transfer_texture, color_band);
- fragColor = transfer_function * density_scale;
-#endif
-}
diff --git a/source/blender/gpu/shaders/gpu_shader_smoke_vert.glsl b/source/blender/gpu/shaders/gpu_shader_smoke_vert.glsl
deleted file mode 100644
index 8c30e9baf9e..00000000000
--- a/source/blender/gpu/shaders/gpu_shader_smoke_vert.glsl
+++ /dev/null
@@ -1,15 +0,0 @@
-
-uniform mat4 ModelViewProjectionMatrix;
-
-out vec3 coords;
-
-uniform vec3 min_location;
-uniform vec3 invsize;
-uniform vec3 ob_sizei;
-
-void main()
-{
- // TODO: swap gl_Vertex for vec3 pos, update smoke setup code
- gl_Position = ModelViewProjectionMatrix * vec4(gl_Vertex.xyz * ob_sizei, 1.0);
- coords = (gl_Vertex.xyz - min_location) * invsize;
-}
diff --git a/source/blender/ikplugin/intern/ikplugin_api.c b/source/blender/ikplugin/intern/ikplugin_api.c
index d2681440177..80de0beb9f4 100644
--- a/source/blender/ikplugin/intern/ikplugin_api.c
+++ b/source/blender/ikplugin/intern/ikplugin_api.c
@@ -53,8 +53,8 @@ static IKPlugin ikplugin_tab[] = {
{
iksolver_initialize_tree,
iksolver_execute_tree,
- NULL,
- NULL,
+ iksolver_release_tree,
+ iksolver_clear_data,
NULL,
NULL,
NULL,
diff --git a/source/blender/ikplugin/intern/iksolver_plugin.c b/source/blender/ikplugin/intern/iksolver_plugin.c
index 9248d85c809..0baaa406201 100644
--- a/source/blender/ikplugin/intern/iksolver_plugin.c
+++ b/source/blender/ikplugin/intern/iksolver_plugin.c
@@ -582,3 +582,27 @@ void iksolver_execute_tree(struct Depsgraph *depsgraph, struct Scene *scene, Obj
free_posetree(tree);
}
}
+
+void iksolver_release_tree(struct Scene *UNUSED(scene), struct Object *ob, float UNUSED(ctime))
+{
+ iksolver_clear_data(ob->pose);
+}
+
+void iksolver_clear_data(bPose *pose)
+{
+ for (bPoseChannel *pchan = pose->chanbase.first; pchan; pchan = pchan->next) {
+ if ((pchan->flag & POSE_IKTREE) == 0)
+ continue;
+
+ while (pchan->iktree.first) {
+ PoseTree *tree = pchan->iktree.first;
+
+ /* stop on the first tree that isn't a standard IK chain */
+ if (tree->type != CONSTRAINT_TYPE_KINEMATIC)
+ break;
+
+ BLI_remlink(&pchan->iktree, tree);
+ free_posetree(tree);
+ }
+ }
+}
diff --git a/source/blender/ikplugin/intern/iksolver_plugin.h b/source/blender/ikplugin/intern/iksolver_plugin.h
index cce9511630f..09eb7139192 100644
--- a/source/blender/ikplugin/intern/iksolver_plugin.h
+++ b/source/blender/ikplugin/intern/iksolver_plugin.h
@@ -45,6 +45,8 @@ void iksolver_initialize_tree(
void iksolver_execute_tree(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob,
struct bPoseChannel *pchan_root, float ctime);
+void iksolver_release_tree(struct Scene *scene, struct Object *ob, float ctime);
+void iksolver_clear_data(struct bPose *pose);
#ifdef __cplusplus
}
diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h
index e83357ac82e..d407845e45d 100644
--- a/source/blender/imbuf/IMB_imbuf_types.h
+++ b/source/blender/imbuf/IMB_imbuf_types.h
@@ -67,7 +67,7 @@ typedef struct DDSData {
*/
/* ibuf->ftype flag, main image types */
-/* Warning: Keep explicit value assignements here, this file is included in areas where not all format defines
+/* Warning: Keep explicit value assignments here, this file is included in areas where not all format defines
* are set (e.g. intern/dds only get WITH_DDS, even if TIFF, HDR etc are also defined). See T46524. */
enum eImbTypes {
IMB_FTYPE_PNG = 1,
@@ -222,12 +222,10 @@ typedef struct ImBuf {
struct DDSData dds_data;
} ImBuf;
-/* Moved from BKE_bmfont_types.h because it is a userflag bit mask. */
/**
* \brief userflags: Flags used internally by blender for imagebuffers
*/
-#define IB_BITMAPFONT (1 << 0) /* this image is a font */
#define IB_BITMAPDIRTY (1 << 1) /* image needs to be saved is not the same as filename */
#define IB_MIPMAP_INVALID (1 << 2) /* image mipmaps are invalid, need recreate */
#define IB_RECT_INVALID (1 << 3) /* float buffer changed, needs recreation of byte rect */
@@ -253,7 +251,7 @@ typedef struct ImBuf {
#define IB_tilecache (1 << 11)
#define IB_alphamode_premul (1 << 12) /* indicates whether image on disk have premul alpha */
#define IB_alphamode_detect (1 << 13) /* if this flag is set, alpha mode would be guessed from file */
-#define IB_ignore_alpha (1 << 14) /* ignore alpha on load and substitude it with 1.0f */
+#define IB_ignore_alpha (1 << 14) /* ignore alpha on load and substitute it with 1.0f */
#define IB_thumbnail (1 << 15)
#define IB_multiview (1 << 16)
diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c
index 58554693aeb..f7005d7ee89 100644
--- a/source/blender/imbuf/intern/allocimbuf.c
+++ b/source/blender/imbuf/intern/allocimbuf.c
@@ -155,13 +155,6 @@ void imb_freetilesImBuf(ImBuf *ibuf)
ibuf->mall &= ~IB_tiles;
}
-static void imb_free_bitmap_font(ImBuf *ibuf)
-{
- if (ibuf->userdata && (ibuf->userflags & IB_BITMAPFONT)) {
- MEM_freeN(ibuf->userdata);
- }
-}
-
static void freeencodedbufferImBuf(ImBuf *ibuf)
{
if (ibuf == NULL) return;
@@ -215,7 +208,6 @@ void IMB_freeImBuf(ImBuf *ibuf)
imb_freerectImBuf(ibuf);
imb_freerectfloatImBuf(ibuf);
imb_freetilesImBuf(ibuf);
- imb_free_bitmap_font(ibuf);
IMB_freezbufImBuf(ibuf);
IMB_freezbuffloatImBuf(ibuf);
freeencodedbufferImBuf(ibuf);
diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c
index 9ab2ee7dd21..89ae32ee2b3 100644
--- a/source/blender/imbuf/intern/anim_movie.c
+++ b/source/blender/imbuf/intern/anim_movie.c
@@ -1269,7 +1269,7 @@ static ImBuf *anim_getnew(struct anim *anim)
#ifdef WITH_AVI
case ANIM_AVI:
if (startavi(anim)) {
- printf("couldnt start avi\n");
+ printf("couldn't start avi\n");
return (NULL);
}
ibuf = IMB_allocImBuf(anim->x, anim->y, 24, 0);
diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c
index 86c0dd69930..1d287025a4e 100644
--- a/source/blender/imbuf/intern/colormanagement.c
+++ b/source/blender/imbuf/intern/colormanagement.c
@@ -624,7 +624,7 @@ void colormanagement_init(void)
OCIO_init();
- ocio_env = getenv("OCIO");
+ ocio_env = BLI_getenv("OCIO");
if (ocio_env && ocio_env[0] != '\0') {
config = OCIO_configCreateFromEnv();
diff --git a/source/blender/imbuf/intern/dds/BlockDXT.cpp b/source/blender/imbuf/intern/dds/BlockDXT.cpp
index 7273ec1659c..0887576eedf 100644
--- a/source/blender/imbuf/intern/dds/BlockDXT.cpp
+++ b/source/blender/imbuf/intern/dds/BlockDXT.cpp
@@ -430,7 +430,7 @@ void AlphaBlockDXT5::decodeBlock(ColorBlock *block) const
void AlphaBlockDXT5::flip4()
{
- uint64 * b = (uint64 *)this;
+ uint64 *b = (uint64 *)this;
// @@ The masks might have to be byte swapped.
uint64 tmp = (*b & (uint64)(0x000000000000FFFFLL));
@@ -444,7 +444,7 @@ void AlphaBlockDXT5::flip4()
void AlphaBlockDXT5::flip2()
{
- uint * b = (uint *)this;
+ uint *b = (uint *)this;
// @@ The masks might have to be byte swapped.
uint tmp = (*b & 0xFF000000);
diff --git a/source/blender/imbuf/intern/dds/ColorBlock.cpp b/source/blender/imbuf/intern/dds/ColorBlock.cpp
index d0db912f4dc..e2f52f547f0 100644
--- a/source/blender/imbuf/intern/dds/ColorBlock.cpp
+++ b/source/blender/imbuf/intern/dds/ColorBlock.cpp
@@ -170,7 +170,7 @@ bool ColorBlock::isSingleColor(Color32 mask/*= Color32(0xFF, 0xFF, 0xFF, 0x00)*/
return true;
}
-/*
+#if 0
/// Returns true if the block has a single color, ignoring transparent pixels.
bool ColorBlock::isSingleColorNoAlpha() const
{
@@ -194,10 +194,11 @@ bool ColorBlock::isSingleColorNoAlpha() const
return true;
}
-*/
+#endif
+#if 0
/// Count number of unique colors in this color block.
-/*uint ColorBlock::countUniqueColors() const
+uint ColorBlock::countUniqueColors() const
{
uint count = 0;
@@ -217,9 +218,11 @@ bool ColorBlock::isSingleColorNoAlpha() const
}
return count;
-}*/
+}
+#endif
-/*/// Get average color of the block.
+#if 0
+/// Get average color of the block.
Color32 ColorBlock::averageColor() const
{
uint r, g, b, a;
@@ -233,7 +236,8 @@ Color32 ColorBlock::averageColor() const
}
return Color32(uint8(r / 16), uint8(g / 16), uint8(b / 16), uint8(a / 16));
-}*/
+}
+#endif
/// Return true if the block is not fully opaque.
bool ColorBlock::hasAlpha() const
@@ -367,7 +371,8 @@ void ColorBlock::boundsRangeAlpha(Color32 *start, Color32 *end) const
}
#endif
-/*/// Sort colors by abosolute value in their 16 bit representation.
+#if 0
+/// Sort colors by abosolute value in their 16 bit representation.
void ColorBlock::sortColorsByAbsoluteValue()
{
// Dummy selection sort.
@@ -385,10 +390,11 @@ void ColorBlock::sortColorsByAbsoluteValue()
}
swap( m_color[a], m_color[max] );
}
-}*/
-
+}
+#endif
-/*/// Find extreme colors in the given axis.
+#if 0
+/// Find extreme colors in the given axis.
void ColorBlock::computeRange(Vector3::Arg axis, Color32 *start, Color32 *end) const
{
@@ -415,10 +421,11 @@ void ColorBlock::computeRange(Vector3::Arg axis, Color32 *start, Color32 *end) c
*start = m_color[mini];
*end = m_color[maxi];
-}*/
-
+}
+#endif
-/*/// Sort colors in the given axis.
+#if 0
+/// Sort colors in the given axis.
void ColorBlock::sortColors(const Vector3 & axis)
{
float luma_array[16];
@@ -439,10 +446,11 @@ void ColorBlock::sortColors(const Vector3 & axis)
swap( luma_array[a], luma_array[min] );
swap( m_color[a], m_color[min] );
}
-}*/
-
+}
+#endif
-/*/// Get the volume of the color block.
+#if 0
+/// Get the volume of the color block.
float ColorBlock::volume() const
{
Box bounds;
@@ -455,4 +463,4 @@ float ColorBlock::volume() const
return bounds.volume();
}
-*/
+#endif
diff --git a/source/blender/imbuf/intern/dds/ColorBlock.h b/source/blender/imbuf/intern/dds/ColorBlock.h
index 7b5291cf976..67c0b64d53e 100644
--- a/source/blender/imbuf/intern/dds/ColorBlock.h
+++ b/source/blender/imbuf/intern/dds/ColorBlock.h
@@ -45,9 +45,9 @@ struct ColorBlock {
ColorBlock();
ColorBlock(const uint * linearImage);
ColorBlock(const ColorBlock & block);
- ColorBlock(const Image * img, uint x, uint y);
+ ColorBlock(const Image *img, uint x, uint y);
- void init(const Image * img, uint x, uint y);
+ void init(const Image *img, uint x, uint y);
void init(uint w, uint h, const uint * data, uint x, uint y);
void init(uint w, uint h, const float * data, uint x, uint y);
diff --git a/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp b/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp
index df9182c2c1e..9dc48fc10c8 100644
--- a/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp
+++ b/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp
@@ -792,7 +792,7 @@ void DDSHeader::setUserVersion(int version)
this->reserved[8] = version;
}
-/*
+#if 0
void DDSHeader::swapBytes()
{
this->fourcc = POSH_LittleU32(this->fourcc);
@@ -828,7 +828,7 @@ void DDSHeader::swapBytes()
this->header10.arraySize = POSH_LittleU32(this->header10.arraySize);
this->header10.reserved = POSH_LittleU32(this->header10.reserved);
}
-*/
+#endif
bool DDSHeader::hasDX10Header() const
{
@@ -909,11 +909,11 @@ bool DirectDrawSurface::isValid() const
}
/* in some files DDSCAPS_TEXTURE is missing: silently ignore */
- /*
- if ( !(header.caps.caps1 & DDSCAPS_TEXTURE) ) {
+#if 0
+ if (!(header.caps.caps1 & DDSCAPS_TEXTURE)) {
return false;
}
- */
+#endif
return true;
}
@@ -1394,7 +1394,7 @@ uint DirectDrawSurface::mipmapSize(uint mipmap) const
}
else if (header.pf.flags & DDPF_RGB || (header.pf.flags & DDPF_LUMINANCE))
{
- uint pitch = computePitch(w, header.pf.bitcount, 8); // Asuming 8 bit alignment, which is the same D3DX expects.
+ uint pitch = computePitch(w, header.pf.bitcount, 8); // Assuming 8 bit alignment, which is the same D3DX expects.
return pitch * h * d;
}
diff --git a/source/blender/imbuf/intern/dds/Image.cpp b/source/blender/imbuf/intern/dds/Image.cpp
index fd3ca1c35e6..2e9ae9da388 100644
--- a/source/blender/imbuf/intern/dds/Image.cpp
+++ b/source/blender/imbuf/intern/dds/Image.cpp
@@ -82,7 +82,7 @@ const Color32 * Image::scanline(uint h) const
return m_data + h * m_width;
}
-Color32 * Image::scanline(uint h)
+Color32 *Image::scanline(uint h)
{
if (h >= m_height) {
printf("DDS: scanline beyond dimensions of image\n");
@@ -91,12 +91,12 @@ Color32 * Image::scanline(uint h)
return m_data + h * m_width;
}
-const Color32 * Image::pixels() const
+const Color32 *Image::pixels() const
{
return m_data;
}
-Color32 * Image::pixels()
+Color32 *Image::pixels()
{
return m_data;
}
diff --git a/source/blender/imbuf/intern/dds/Image.h b/source/blender/imbuf/intern/dds/Image.h
index bb74a9d5d15..9a8bacd93a3 100644
--- a/source/blender/imbuf/intern/dds/Image.h
+++ b/source/blender/imbuf/intern/dds/Image.h
@@ -65,11 +65,11 @@ public:
uint width() const;
uint height() const;
- const Color32 * scanline(uint h) const;
- Color32 * scanline(uint h);
+ const Color32 *scanline(uint h) const;
+ Color32 *scanline(uint h);
- const Color32 * pixels() const;
- Color32 * pixels();
+ const Color32 *pixels() const;
+ Color32 *pixels();
const Color32 & pixel(uint idx) const;
Color32 & pixel(uint idx);
@@ -87,7 +87,7 @@ private:
uint m_width;
uint m_height;
Format m_format;
- Color32 * m_data;
+ Color32 *m_data;
};
diff --git a/source/blender/imbuf/intern/filetype.c b/source/blender/imbuf/intern/filetype.c
index 25bbd132a49..a5af51e3e95 100644
--- a/source/blender/imbuf/intern/filetype.c
+++ b/source/blender/imbuf/intern/filetype.c
@@ -74,7 +74,7 @@ const ImFileType IMB_FILE_TYPES[] = {
{NULL, NULL, imb_is_a_hdr, NULL, imb_ftype_default, imb_loadhdr, NULL, imb_savehdr, NULL, IM_FTYPE_FLOAT, IMB_FTYPE_RADHDR, COLOR_ROLE_DEFAULT_FLOAT},
#endif
#ifdef WITH_OPENEXR
- {imb_initopenexr, NULL, imb_is_a_openexr, NULL, imb_ftype_default, imb_load_openexr, NULL, imb_save_openexr, NULL, IM_FTYPE_FLOAT, IMB_FTYPE_OPENEXR, COLOR_ROLE_DEFAULT_FLOAT},
+ {imb_initopenexr, imb_exitopenexr, imb_is_a_openexr, NULL, imb_ftype_default, imb_load_openexr, NULL, imb_save_openexr, NULL, IM_FTYPE_FLOAT, IMB_FTYPE_OPENEXR, COLOR_ROLE_DEFAULT_FLOAT},
#endif
#ifdef WITH_OPENJPEG
{NULL, NULL, imb_is_a_jp2, NULL, imb_ftype_default, imb_load_jp2, NULL, imb_save_jp2, NULL, IM_FTYPE_FLOAT, IMB_FTYPE_JP2, COLOR_ROLE_DEFAULT_BYTE},
diff --git a/source/blender/imbuf/intern/imageprocess.c b/source/blender/imbuf/intern/imageprocess.c
index 2eec5da7bc4..507455c47f4 100644
--- a/source/blender/imbuf/intern/imageprocess.c
+++ b/source/blender/imbuf/intern/imageprocess.c
@@ -391,7 +391,7 @@ static void processor_apply_scanline_func(TaskPool * __restrict pool,
int UNUSED(threadid))
{
ScanlineGlobalData *data = BLI_task_pool_userdata(pool);
- int start_scanline = GET_INT_FROM_POINTER(taskdata);
+ int start_scanline = POINTER_AS_INT(taskdata);
int num_scanlines = min_ii(data->scanlines_per_task,
data->total_scanlines - start_scanline);
data->do_thread(data->custom_data,
@@ -415,7 +415,7 @@ void IMB_processor_apply_threaded_scanlines(int total_scanlines,
for (int i = 0, start_line = 0; i < total_tasks; i++) {
BLI_task_pool_push(task_pool,
processor_apply_scanline_func,
- SET_INT_IN_POINTER(start_line),
+ POINTER_FROM_INT(start_line),
false,
TASK_PRIORITY_LOW);
start_line += scanlines_per_task;
diff --git a/source/blender/imbuf/intern/iris.c b/source/blender/imbuf/intern/iris.c
index ba48feb01e8..50690cfa047 100644
--- a/source/blender/imbuf/intern/iris.c
+++ b/source/blender/imbuf/intern/iris.c
@@ -765,17 +765,16 @@ fail:
return DIRTY_FLAG_ENCODING;
}
-/*
- * output_iris -
- * copy an array of ints to an iris image file. Each int
- * represents one pixel. xsize and ysize specify the dimensions of
- * the pixel array. zsize specifies what kind of image file to
- * write out. if zsize is 1, the luminance of the pixels are
- * calculated, and a single channel black and white image is saved.
- * If zsize is 3, an RGB image file is saved. If zsize is 4, an
- * RGBA image file is saved.
+/**
+ * Copy an array of ints to an iris image file.
+ * Each int represents one pixel. xsize and ysize specify the dimensions of
+ * the pixel array. zsize specifies what kind of image file to
+ * write out. if zsize is 1, the luminance of the pixels are
+ * calculated, and a single channel black and white image is saved.
+ * If zsize is 3, an RGB image file is saved. If zsize is 4, an
+ * RGBA image file is saved.
*
- * Added: zbuf write
+ * Added: zbuf write
*/
static int output_iris(uint *lptr, int xsize, int ysize, int zsize, const char *name, int *zptr)
diff --git a/source/blender/imbuf/intern/jp2.c b/source/blender/imbuf/intern/jp2.c
index cd6bdd643d5..caf2634bac7 100644
--- a/source/blender/imbuf/intern/jp2.c
+++ b/source/blender/imbuf/intern/jp2.c
@@ -38,12 +38,6 @@
#include "openjpeg.h"
-/* Temporary duplicated implementations for version 1.5 and 2.3, until we
- * upgrade all platforms to 2.3. When removing the old code,
- * imb_load_jp2_filepath can be added in filetype.c. */
-
-#if defined(OPJ_VERSION_MAJOR) && OPJ_VERSION_MAJOR >= 2
-
#define JP2_FILEHEADER_SIZE 12
static const char JP2_HEAD[] = {0x0, 0x0, 0x0, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A};
@@ -1281,1020 +1275,3 @@ finally:
return ok;
}
-
-#else /* defined(OPJ_VERSION_MAJOR) && OPJ_VERSION_MAJOR >= 2 */
-
-static const char JP2_HEAD[] = {0x0, 0x0, 0x0, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A};
-static const char J2K_HEAD[] = {0xFF, 0x4F, 0xFF, 0x51, 0x00};
-
-/* We only need this because of how the presets are set */
-/* this typedef is copied from 'openjpeg-1.5.0/applications/codec/image_to_j2k.c' */
-typedef struct img_folder {
- /** The directory path of the folder containing input images*/
- char *imgdirpath;
- /** Output format*/
- char *out_format;
- /** Enable option*/
- char set_imgdir;
- /** Enable Cod Format for output*/
- char set_out_format;
- /** User specified rate stored in case of cinema option*/
- float *rates;
-} img_fol_t;
-
-enum {
- DCP_CINEMA2K = 3,
- DCP_CINEMA4K = 4,
-};
-
-static bool check_jp2(const unsigned char *mem) /* J2K_CFMT */
-{
- return memcmp(JP2_HEAD, mem, sizeof(JP2_HEAD)) ? 0 : 1;
-}
-
-static bool check_j2k(const unsigned char *mem) /* J2K_CFMT */
-{
- return memcmp(J2K_HEAD, mem, sizeof(J2K_HEAD)) ? 0 : 1;
-}
-
-int imb_is_a_jp2(const unsigned char *buf)
-{
- return check_jp2(buf);
-}
-
-/**
- * sample error callback expecting a FILE* client object
- */
-static void error_callback(const char *msg, void *client_data)
-{
- FILE *stream = (FILE *)client_data;
- fprintf(stream, "[ERROR] %s", msg);
-}
-/**
- * sample warning callback expecting a FILE* client object
- */
-static void warning_callback(const char *msg, void *client_data)
-{
- FILE *stream = (FILE *)client_data;
- fprintf(stream, "[WARNING] %s", msg);
-}
-
-/**
- * sample debug callback expecting no client object
- */
-static void info_callback(const char *msg, void *client_data)
-{
- (void)client_data;
- fprintf(stdout, "[INFO] %s", msg);
-}
-
-# define PIXEL_LOOPER_BEGIN(_rect) \
- for (y = h - 1; y != (unsigned int)(-1); y--) { \
- for (i = y * w, i_next = (y + 1) * w; \
- i < i_next; \
- i++, _rect += 4) \
- { \
-
-# define PIXEL_LOOPER_BEGIN_CHANNELS(_rect, _channels) \
- for (y = h - 1; y != (unsigned int)(-1); y--) { \
- for (i = y * w, i_next = (y + 1) * w; \
- i < i_next; \
- i++, _rect += _channels) \
- { \
-
-# define PIXEL_LOOPER_END \
- } \
-} (void)0 \
-
-struct ImBuf *imb_load_jp2(const unsigned char *mem, size_t size, int flags, char colorspace[IM_MAX_SPACE])
-{
- struct ImBuf *ibuf = NULL;
- bool use_float = false; /* for precision higher then 8 use float */
- bool use_alpha = false;
-
- long signed_offsets[4] = {0, 0, 0, 0};
- int float_divs[4] = {1, 1, 1, 1};
-
- unsigned int i, i_next, w, h, planes;
- unsigned int y;
- int *r, *g, *b, *a; /* matching 'opj_image_comp.data' type */
- bool is_jp2, is_j2k;
-
- opj_dparameters_t parameters; /* decompression parameters */
-
- opj_event_mgr_t event_mgr; /* event manager */
- opj_image_t *image = NULL;
-
- opj_dinfo_t *dinfo = NULL; /* handle to a decompressor */
- opj_cio_t *cio = NULL;
-
- is_jp2 = check_jp2(mem);
- is_j2k = check_j2k(mem);
-
- if (!is_jp2 && !is_j2k)
- return(NULL);
-
- /* both 8, 12 and 16 bit JP2Ks are default to standard byte colorspace */
- colorspace_set_default_role(colorspace, IM_MAX_SPACE, COLOR_ROLE_DEFAULT_BYTE);
-
- /* configure the event callbacks (not required) */
- memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
- event_mgr.error_handler = error_callback;
- event_mgr.warning_handler = warning_callback;
- event_mgr.info_handler = info_callback;
-
-
- /* set decoding parameters to default values */
- opj_set_default_decoder_parameters(&parameters);
-
-
- /* JPEG 2000 compressed image data */
-
- /* get a decoder handle */
- dinfo = opj_create_decompress(is_jp2 ? CODEC_JP2 : CODEC_J2K);
-
- /* catch events using our callbacks and give a local context */
- opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
-
- /* setup the decoder decoding parameters using the current image and user parameters */
- opj_setup_decoder(dinfo, &parameters);
-
- /* open a byte stream */
- /* note, we can't avoid removing 'const' cast here */
- cio = opj_cio_open((opj_common_ptr)dinfo, (unsigned char *)mem, size);
-
- /* decode the stream and fill the image structure */
- image = opj_decode(dinfo, cio);
-
- if (!image) {
- fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");
- opj_destroy_decompress(dinfo);
- opj_cio_close(cio);
- return NULL;
- }
-
- /* close the byte stream */
- opj_cio_close(cio);
-
-
- if ((image->numcomps * image->x1 * image->y1) == 0) {
- fprintf(stderr, "\nError: invalid raw image parameters\n");
- return NULL;
- }
-
- w = image->comps[0].w;
- h = image->comps[0].h;
-
- switch (image->numcomps) {
- case 1: /* Grayscale */
- case 3: /* Color */
- planes = 24;
- use_alpha = false;
- break;
- default: /* 2 or 4 - Grayscale or Color + alpha */
- planes = 32; /* grayscale + alpha */
- use_alpha = true;
- break;
- }
-
-
- i = image->numcomps;
- if (i > 4) i = 4;
-
- while (i) {
- i--;
-
- if (image->comps[i].prec > 8)
- use_float = true;
-
- if (image->comps[i].sgnd)
- signed_offsets[i] = 1 << (image->comps[i].prec - 1);
-
- /* only needed for float images but dosnt hurt to calc this */
- float_divs[i] = (1 << image->comps[i].prec) - 1;
- }
-
- ibuf = IMB_allocImBuf(w, h, planes, use_float ? IB_rectfloat : IB_rect);
-
- if (ibuf == NULL) {
- if (dinfo)
- opj_destroy_decompress(dinfo);
- return NULL;
- }
-
- ibuf->ftype = IMB_FTYPE_JP2;
- if (is_jp2)
- ibuf->foptions.flag |= JP2_JP2;
- else
- ibuf->foptions.flag |= JP2_J2K;
-
- if (use_float) {
- float *rect_float = ibuf->rect_float;
-
- if (image->numcomps < 3) {
- r = image->comps[0].data;
- a = (use_alpha) ? image->comps[1].data : NULL;
-
- /* grayscale 12bits+ */
- if (use_alpha) {
- a = image->comps[1].data;
- PIXEL_LOOPER_BEGIN(rect_float) {
- rect_float[0] = rect_float[1] = rect_float[2] = (float)(r[i] + signed_offsets[0]) / float_divs[0];
- rect_float[3] = (a[i] + signed_offsets[1]) / float_divs[1];
- }
- PIXEL_LOOPER_END;
- }
- else {
- PIXEL_LOOPER_BEGIN(rect_float) {
- rect_float[0] = rect_float[1] = rect_float[2] = (float)(r[i] + signed_offsets[0]) / float_divs[0];
- rect_float[3] = 1.0f;
- }
- PIXEL_LOOPER_END;
- }
- }
- else {
- r = image->comps[0].data;
- g = image->comps[1].data;
- b = image->comps[2].data;
-
- /* rgb or rgba 12bits+ */
- if (use_alpha) {
- a = image->comps[3].data;
- PIXEL_LOOPER_BEGIN(rect_float) {
- rect_float[0] = (float)(r[i] + signed_offsets[0]) / float_divs[0];
- rect_float[1] = (float)(g[i] + signed_offsets[1]) / float_divs[1];
- rect_float[2] = (float)(b[i] + signed_offsets[2]) / float_divs[2];
- rect_float[3] = (float)(a[i] + signed_offsets[3]) / float_divs[3];
- }
- PIXEL_LOOPER_END;
- }
- else {
- PIXEL_LOOPER_BEGIN(rect_float) {
- rect_float[0] = (float)(r[i] + signed_offsets[0]) / float_divs[0];
- rect_float[1] = (float)(g[i] + signed_offsets[1]) / float_divs[1];
- rect_float[2] = (float)(b[i] + signed_offsets[2]) / float_divs[2];
- rect_float[3] = 1.0f;
- }
- PIXEL_LOOPER_END;
- }
- }
-
- }
- else {
- unsigned char *rect_uchar = (unsigned char *)ibuf->rect;
-
- if (image->numcomps < 3) {
- r = image->comps[0].data;
- a = (use_alpha) ? image->comps[1].data : NULL;
-
- /* grayscale */
- if (use_alpha) {
- a = image->comps[3].data;
- PIXEL_LOOPER_BEGIN(rect_uchar) {
- rect_uchar[0] = rect_uchar[1] = rect_uchar[2] = (r[i] + signed_offsets[0]);
- rect_uchar[3] = a[i] + signed_offsets[1];
- }
- PIXEL_LOOPER_END;
- }
- else {
- PIXEL_LOOPER_BEGIN(rect_uchar) {
- rect_uchar[0] = rect_uchar[1] = rect_uchar[2] = (r[i] + signed_offsets[0]);
- rect_uchar[3] = 255;
- }
- PIXEL_LOOPER_END;
- }
- }
- else {
- r = image->comps[0].data;
- g = image->comps[1].data;
- b = image->comps[2].data;
-
- /* 8bit rgb or rgba */
- if (use_alpha) {
- a = image->comps[3].data;
- PIXEL_LOOPER_BEGIN(rect_uchar) {
- rect_uchar[0] = r[i] + signed_offsets[0];
- rect_uchar[1] = g[i] + signed_offsets[1];
- rect_uchar[2] = b[i] + signed_offsets[2];
- rect_uchar[3] = a[i] + signed_offsets[3];
- }
- PIXEL_LOOPER_END;
- }
- else {
- PIXEL_LOOPER_BEGIN(rect_uchar) {
- rect_uchar[0] = r[i] + signed_offsets[0];
- rect_uchar[1] = g[i] + signed_offsets[1];
- rect_uchar[2] = b[i] + signed_offsets[2];
- rect_uchar[3] = 255;
- }
- PIXEL_LOOPER_END;
- }
- }
- }
-
- /* free remaining structures */
- if (dinfo) {
- opj_destroy_decompress(dinfo);
- }
-
- /* free image data structure */
- opj_image_destroy(image);
-
- if (flags & IB_rect) {
- IMB_rect_from_float(ibuf);
- }
-
- return(ibuf);
-}
-
-//static opj_image_t* rawtoimage(const char *filename, opj_cparameters_t *parameters, raw_cparameters_t *raw_cp)
-/* prec can be 8, 12, 16 */
-
-/* use inline because the float passed can be a function call that would end up being called many times */
-#if 0
-#define UPSAMPLE_8_TO_12(_val) ((_val << 4) | (_val & ((1 << 4) - 1)))
-#define UPSAMPLE_8_TO_16(_val) ((_val << 8) + _val)
-
-#define DOWNSAMPLE_FLOAT_TO_8BIT(_val) (_val) <= 0.0f ? 0 : ((_val) >= 1.0f ? 255 : (int)(255.0f * (_val)))
-#define DOWNSAMPLE_FLOAT_TO_12BIT(_val) (_val) <= 0.0f ? 0 : ((_val) >= 1.0f ? 4095 : (int)(4095.0f * (_val)))
-#define DOWNSAMPLE_FLOAT_TO_16BIT(_val) (_val) <= 0.0f ? 0 : ((_val) >= 1.0f ? 65535 : (int)(65535.0f * (_val)))
-#else
-
-BLI_INLINE int UPSAMPLE_8_TO_12(const unsigned char _val)
-{
- return (_val << 4) | (_val & ((1 << 4) - 1));
-}
-BLI_INLINE int UPSAMPLE_8_TO_16(const unsigned char _val)
-{
- return (_val << 8) + _val;
-}
-
-BLI_INLINE int DOWNSAMPLE_FLOAT_TO_8BIT(const float _val)
-{
- return (_val) <= 0.0f ? 0 : ((_val) >= 1.0f ? 255 : (int)(255.0f * (_val)));
-}
-BLI_INLINE int DOWNSAMPLE_FLOAT_TO_12BIT(const float _val)
-{
- return (_val) <= 0.0f ? 0 : ((_val) >= 1.0f ? 4095 : (int)(4095.0f * (_val)));
-}
-BLI_INLINE int DOWNSAMPLE_FLOAT_TO_16BIT(const float _val)
-{
- return (_val) <= 0.0f ? 0 : ((_val) >= 1.0f ? 65535 : (int)(65535.0f * (_val)));
-}
-#endif
-
-/*
- * 2048x1080 (2K) at 24 fps or 48 fps, or 4096x2160 (4K) at 24 fps; 3x12 bits per pixel, XYZ color space
- *
- * - In 2K, for Scope (2.39:1) presentation 2048x858 pixels of the image is used
- * - In 2K, for Flat (1.85:1) presentation 1998x1080 pixels of the image is used
- */
-
-/* ****************************** COPIED FROM image_to_j2k.c */
-
-/* ----------------------------------------------------------------------- */
-#define CINEMA_24_CS 1302083 /*Codestream length for 24fps*/
-#define CINEMA_48_CS 651041 /*Codestream length for 48fps*/
-#define COMP_24_CS 1041666 /*Maximum size per color component for 2K & 4K @ 24fps*/
-#define COMP_48_CS 520833 /*Maximum size per color component for 2K @ 48fps*/
-
-
-static int initialise_4K_poc(opj_poc_t *POC, int numres)
-{
- POC[0].tile = 1;
- POC[0].resno0 = 0;
- POC[0].compno0 = 0;
- POC[0].layno1 = 1;
- POC[0].resno1 = numres - 1;
- POC[0].compno1 = 3;
- POC[0].prg1 = CPRL;
- POC[1].tile = 1;
- POC[1].resno0 = numres - 1;
- POC[1].compno0 = 0;
- POC[1].layno1 = 1;
- POC[1].resno1 = numres;
- POC[1].compno1 = 3;
- POC[1].prg1 = CPRL;
- return 2;
-}
-
-static void cinema_parameters(opj_cparameters_t *parameters)
-{
- parameters->tile_size_on = 0; /* false */
- parameters->cp_tdx = 1;
- parameters->cp_tdy = 1;
-
- /*Tile part*/
- parameters->tp_flag = 'C';
- parameters->tp_on = 1;
-
- /*Tile and Image shall be at (0, 0)*/
- parameters->cp_tx0 = 0;
- parameters->cp_ty0 = 0;
- parameters->image_offset_x0 = 0;
- parameters->image_offset_y0 = 0;
-
- /*Codeblock size = 32 * 32*/
- parameters->cblockw_init = 32;
- parameters->cblockh_init = 32;
- parameters->csty |= 0x01;
-
- /*The progression order shall be CPRL*/
- parameters->prog_order = CPRL;
-
- /* No ROI */
- parameters->roi_compno = -1;
-
- parameters->subsampling_dx = 1; parameters->subsampling_dy = 1;
-
- /* 9-7 transform */
- parameters->irreversible = 1;
-}
-
-static void cinema_setup_encoder(opj_cparameters_t *parameters, opj_image_t *image, img_fol_t *img_fol)
-{
- int i;
- float temp_rate;
-
- switch (parameters->cp_cinema) {
- case CINEMA2K_24:
- case CINEMA2K_48:
- if (parameters->numresolution > 6) {
- parameters->numresolution = 6;
- }
- if (!((image->comps[0].w == 2048) || (image->comps[0].h == 1080))) {
- fprintf(stdout, "Image coordinates %d x %d is not 2K compliant.\nJPEG Digital Cinema Profile-3 "
- "(2K profile) compliance requires that at least one of coordinates match 2048 x 1080\n",
- image->comps[0].w, image->comps[0].h);
- parameters->cp_rsiz = STD_RSIZ;
- }
- else {
- parameters->cp_rsiz = DCP_CINEMA2K;
- }
- break;
-
- case CINEMA4K_24:
- if (parameters->numresolution < 1) {
- parameters->numresolution = 1;
- }
- else if (parameters->numresolution > 7) {
- parameters->numresolution = 7;
- }
- if (!((image->comps[0].w == 4096) || (image->comps[0].h == 2160))) {
- fprintf(stdout, "Image coordinates %d x %d is not 4K compliant.\nJPEG Digital Cinema Profile-4"
- "(4K profile) compliance requires that at least one of coordinates match 4096 x 2160\n",
- image->comps[0].w, image->comps[0].h);
- parameters->cp_rsiz = STD_RSIZ;
- }
- else {
- parameters->cp_rsiz = DCP_CINEMA2K;
- }
- parameters->numpocs = initialise_4K_poc(parameters->POC, parameters->numresolution);
- break;
- case OFF:
- /* do nothing */
- break;
- }
-
- switch (parameters->cp_cinema) {
- case CINEMA2K_24:
- case CINEMA4K_24:
- for (i = 0; i < parameters->tcp_numlayers; i++) {
- temp_rate = 0;
- if (img_fol->rates[i] == 0) {
- parameters->tcp_rates[0] = ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)) /
- (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy);
- }
- else {
- temp_rate = ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)) /
- (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy);
- if (temp_rate > CINEMA_24_CS) {
- parameters->tcp_rates[i] = ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)) /
- (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy);
- }
- else {
- parameters->tcp_rates[i] = img_fol->rates[i];
- }
- }
- }
- parameters->max_comp_size = COMP_24_CS;
- break;
-
- case CINEMA2K_48:
- for (i = 0; i < parameters->tcp_numlayers; i++) {
- temp_rate = 0;
- if (img_fol->rates[i] == 0) {
- parameters->tcp_rates[0] = ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)) /
- (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy);
- }
- else {
- temp_rate = ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)) /
- (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy);
- if (temp_rate > CINEMA_48_CS) {
- parameters->tcp_rates[0] = ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)) /
- (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy);
- }
- else {
- parameters->tcp_rates[i] = img_fol->rates[i];
- }
- }
- }
- parameters->max_comp_size = COMP_48_CS;
- break;
- case OFF:
- /* do nothing */
- break;
- }
- parameters->cp_disto_alloc = 1;
-}
-
-static float channel_colormanage_noop(float value)
-{
- return value;
-}
-
-static opj_image_t *ibuftoimage(ImBuf *ibuf, opj_cparameters_t *parameters)
-{
- unsigned char *rect_uchar;
- float *rect_float, from_straight[4];
-
- unsigned int subsampling_dx = parameters->subsampling_dx;
- unsigned int subsampling_dy = parameters->subsampling_dy;
-
- unsigned int i, i_next, numcomps, w, h, prec;
- unsigned int y;
- int *r, *g, *b, *a; /* matching 'opj_image_comp.data' type */
- OPJ_COLOR_SPACE color_space;
- opj_image_cmptparm_t cmptparm[4]; /* maximum of 4 components */
- opj_image_t *image = NULL;
-
- float (*chanel_colormanage_cb)(float);
-
- img_fol_t img_fol; /* only needed for cinema presets */
- memset(&img_fol, 0, sizeof(img_fol_t));
-
- if (ibuf->float_colorspace || (ibuf->colormanage_flag & IMB_COLORMANAGE_IS_DATA)) {
- /* float buffer was managed already, no need in color space conversion */
- chanel_colormanage_cb = channel_colormanage_noop;
- }
- else {
- /* standard linear-to-srgb conversion if float buffer wasn't managed */
- chanel_colormanage_cb = linearrgb_to_srgb;
- }
-
- if (ibuf->foptions.flag & JP2_CINE) {
-
- if (ibuf->x == 4096 || ibuf->y == 2160)
- parameters->cp_cinema = CINEMA4K_24;
- else {
- if (ibuf->foptions.flag & JP2_CINE_48FPS) {
- parameters->cp_cinema = CINEMA2K_48;
- }
- else {
- parameters->cp_cinema = CINEMA2K_24;
- }
- }
- if (parameters->cp_cinema) {
- img_fol.rates = (float *)MEM_mallocN(parameters->tcp_numlayers * sizeof(float), "jp2_rates");
- for (i = 0; i < parameters->tcp_numlayers; i++) {
- img_fol.rates[i] = parameters->tcp_rates[i];
- }
- cinema_parameters(parameters);
- }
-
- color_space = (ibuf->foptions.flag & JP2_YCC) ? CLRSPC_SYCC : CLRSPC_SRGB;
- prec = 12;
- numcomps = 3;
- }
- else {
- /* Get settings from the imbuf */
- color_space = (ibuf->foptions.flag & JP2_YCC) ? CLRSPC_SYCC : CLRSPC_SRGB;
-
- if (ibuf->foptions.flag & JP2_16BIT) prec = 16;
- else if (ibuf->foptions.flag & JP2_12BIT) prec = 12;
- else prec = 8;
-
- /* 32bit images == alpha channel */
- /* grayscale not supported yet */
- numcomps = (ibuf->planes == 32) ? 4 : 3;
- }
-
- w = ibuf->x;
- h = ibuf->y;
-
-
- /* initialize image components */
- memset(&cmptparm, 0, 4 * sizeof(opj_image_cmptparm_t));
- for (i = 0; i < numcomps; i++) {
- cmptparm[i].prec = prec;
- cmptparm[i].bpp = prec;
- cmptparm[i].sgnd = 0;
- cmptparm[i].dx = subsampling_dx;
- cmptparm[i].dy = subsampling_dy;
- cmptparm[i].w = w;
- cmptparm[i].h = h;
- }
- /* create the image */
- image = opj_image_create(numcomps, &cmptparm[0], color_space);
- if (!image) {
- printf("Error: opj_image_create() failed\n");
- return NULL;
- }
-
- /* set image offset and reference grid */
- image->x0 = parameters->image_offset_x0;
- image->y0 = parameters->image_offset_y0;
- image->x1 = image->x0 + (w - 1) * subsampling_dx + 1 + image->x0;
- image->y1 = image->y0 + (h - 1) * subsampling_dy + 1 + image->y0;
-
- /* set image data */
- rect_uchar = (unsigned char *) ibuf->rect;
- rect_float = ibuf->rect_float;
-
- /* set the destination channels */
- r = image->comps[0].data;
- g = image->comps[1].data;
- b = image->comps[2].data;
- a = (numcomps == 4) ? image->comps[3].data : NULL;
-
- if (rect_float && rect_uchar && prec == 8) {
- /* No need to use the floating point buffer, just write the 8 bits from the char buffer */
- rect_float = NULL;
- }
-
- if (rect_float) {
- int channels_in_float = ibuf->channels ? ibuf->channels : 4;
-
- switch (prec) {
- case 8: /* Convert blenders float color channels to 8, 12 or 16bit ints */
- if (numcomps == 4) {
- if (channels_in_float == 4) {
- PIXEL_LOOPER_BEGIN(rect_float)
- {
- premul_to_straight_v4_v4(from_straight, rect_float);
- r[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[0]));
- g[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[1]));
- b[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[2]));
- a[i] = DOWNSAMPLE_FLOAT_TO_8BIT(from_straight[3]);
- }
- PIXEL_LOOPER_END;
- }
- else if (channels_in_float == 3) {
- PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 3)
- {
- r[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[0]));
- g[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[1]));
- b[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[2]));
- a[i] = 255;
- }
- PIXEL_LOOPER_END;
- }
- else {
- PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 1)
- {
- r[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[0]));
- g[i] = b[i] = r[i];
- a[i] = 255;
- }
- PIXEL_LOOPER_END;
- }
- }
- else {
- if (channels_in_float == 4) {
- PIXEL_LOOPER_BEGIN(rect_float)
- {
- premul_to_straight_v4_v4(from_straight, rect_float);
- r[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[0]));
- g[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[1]));
- b[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[2]));
- }
- PIXEL_LOOPER_END;
- }
- else if (channels_in_float == 3) {
- PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 3)
- {
- r[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[0]));
- g[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[1]));
- b[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[2]));
- }
- PIXEL_LOOPER_END;
- }
- else {
- PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 1)
- {
- r[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[0]));
- g[i] = b[i] = r[i];
- }
- PIXEL_LOOPER_END;
- }
- }
- break;
-
- case 12:
- if (numcomps == 4) {
- if (channels_in_float == 4) {
- PIXEL_LOOPER_BEGIN(rect_float)
- {
- premul_to_straight_v4_v4(from_straight, rect_float);
- r[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[0]));
- g[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[1]));
- b[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[2]));
- a[i] = DOWNSAMPLE_FLOAT_TO_12BIT(from_straight[3]);
- }
- PIXEL_LOOPER_END;
- }
- else if (channels_in_float == 3) {
- PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 3)
- {
- r[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[0]));
- g[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[1]));
- b[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[2]));
- a[i] = 4095;
- }
- PIXEL_LOOPER_END;
- }
- else {
- PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 1)
- {
- r[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[0]));
- g[i] = b[i] = r[i];
- a[i] = 4095;
- }
- PIXEL_LOOPER_END;
- }
- }
- else {
- if (channels_in_float == 4) {
- PIXEL_LOOPER_BEGIN(rect_float)
- {
- premul_to_straight_v4_v4(from_straight, rect_float);
- r[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[0]));
- g[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[1]));
- b[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[2]));
- }
- PIXEL_LOOPER_END;
- }
- else if (channels_in_float == 3) {
- PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 3)
- {
- r[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[0]));
- g[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[1]));
- b[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[2]));
- }
- PIXEL_LOOPER_END;
- }
- else {
- PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 1)
- {
- r[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[0]));
- g[i] = b[i] = r[i];
- }
- PIXEL_LOOPER_END;
- }
- }
- break;
-
- case 16:
- if (numcomps == 4) {
- if (channels_in_float == 4) {
- PIXEL_LOOPER_BEGIN(rect_float)
- {
- premul_to_straight_v4_v4(from_straight, rect_float);
- r[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[0]));
- g[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[1]));
- b[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[2]));
- a[i] = DOWNSAMPLE_FLOAT_TO_16BIT(from_straight[3]);
- }
- PIXEL_LOOPER_END;
- }
- else if (channels_in_float == 3) {
- PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 3)
- {
- r[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[0]));
- g[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[1]));
- b[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[2]));
- a[i] = 65535;
- }
- PIXEL_LOOPER_END;
- }
- else {
- PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 1)
- {
- r[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[0]));
- g[i] = b[i] = r[i];
- a[i] = 65535;
- }
- PIXEL_LOOPER_END;
- }
- }
- else {
- if (channels_in_float == 4) {
- PIXEL_LOOPER_BEGIN(rect_float)
- {
- premul_to_straight_v4_v4(from_straight, rect_float);
- r[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[0]));
- g[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[1]));
- b[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[2]));
- }
- PIXEL_LOOPER_END;
- }
- else if (channels_in_float == 3) {
- PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 3)
- {
- r[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[0]));
- g[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[1]));
- b[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[2]));
- }
- PIXEL_LOOPER_END;
- }
- else {
- PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 1)
- {
- r[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[0]));
- g[i] = b[i] = r[i];
- }
- PIXEL_LOOPER_END;
- }
- }
- break;
- }
- }
- else {
- /* just use rect*/
- switch (prec) {
- case 8:
- if (numcomps == 4) {
- PIXEL_LOOPER_BEGIN(rect_uchar)
- {
- r[i] = rect_uchar[0];
- g[i] = rect_uchar[1];
- b[i] = rect_uchar[2];
- a[i] = rect_uchar[3];
- }
- PIXEL_LOOPER_END;
- }
- else {
- PIXEL_LOOPER_BEGIN(rect_uchar)
- {
- r[i] = rect_uchar[0];
- g[i] = rect_uchar[1];
- b[i] = rect_uchar[2];
- }
- PIXEL_LOOPER_END;
- }
- break;
-
- case 12: /* Up Sampling, a bit pointless but best write the bit depth requested */
- if (numcomps == 4) {
- PIXEL_LOOPER_BEGIN(rect_uchar)
- {
- r[i] = UPSAMPLE_8_TO_12(rect_uchar[0]);
- g[i] = UPSAMPLE_8_TO_12(rect_uchar[1]);
- b[i] = UPSAMPLE_8_TO_12(rect_uchar[2]);
- a[i] = UPSAMPLE_8_TO_12(rect_uchar[3]);
- }
- PIXEL_LOOPER_END;
- }
- else {
- PIXEL_LOOPER_BEGIN(rect_uchar)
- {
- r[i] = UPSAMPLE_8_TO_12(rect_uchar[0]);
- g[i] = UPSAMPLE_8_TO_12(rect_uchar[1]);
- b[i] = UPSAMPLE_8_TO_12(rect_uchar[2]);
- }
- PIXEL_LOOPER_END;
- }
- break;
-
- case 16:
- if (numcomps == 4) {
- PIXEL_LOOPER_BEGIN(rect_uchar)
- {
- r[i] = UPSAMPLE_8_TO_16(rect_uchar[0]);
- g[i] = UPSAMPLE_8_TO_16(rect_uchar[1]);
- b[i] = UPSAMPLE_8_TO_16(rect_uchar[2]);
- a[i] = UPSAMPLE_8_TO_16(rect_uchar[3]);
- }
- PIXEL_LOOPER_END;
- }
- else {
- PIXEL_LOOPER_BEGIN(rect_uchar)
- {
- r[i] = UPSAMPLE_8_TO_16(rect_uchar[0]);
- g[i] = UPSAMPLE_8_TO_16(rect_uchar[1]);
- b[i] = UPSAMPLE_8_TO_16(rect_uchar[2]);
- }
- PIXEL_LOOPER_END;
- }
- break;
- }
- }
-
- /* Decide if MCT should be used */
- parameters->tcp_mct = image->numcomps == 3 ? 1 : 0;
-
- if (parameters->cp_cinema) {
- cinema_setup_encoder(parameters, image, &img_fol);
- }
-
- if (img_fol.rates)
- MEM_freeN(img_fol.rates);
-
- return image;
-}
-
-
-/* Found write info at http://users.ece.gatech.edu/~slabaugh/personal/c/bitmapUnix.c */
-int imb_save_jp2(struct ImBuf *ibuf, const char *name, int flags)
-{
- int quality = ibuf->foptions.quality;
-
- int bSuccess;
- opj_cparameters_t parameters; /* compression parameters */
- opj_event_mgr_t event_mgr; /* event manager */
- opj_image_t *image = NULL;
-
- (void)flags; /* unused */
-
- /*
- * configure the event callbacks (not required)
- * setting of each callback is optional
- */
- memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
- event_mgr.error_handler = error_callback;
- event_mgr.warning_handler = warning_callback;
- event_mgr.info_handler = info_callback;
-
- /* set encoding parameters to default values */
- opj_set_default_encoder_parameters(&parameters);
-
- /* compression ratio */
- /* invert range, from 10-100, 100-1
- * where jpeg see's 1 and highest quality (lossless) and 100 is very low quality*/
- parameters.tcp_rates[0] = ((100 - quality) / 90.0f * 99.0f) + 1;
-
-
- parameters.tcp_numlayers = 1; /* only one resolution */
- parameters.cp_disto_alloc = 1;
-
- image = ibuftoimage(ibuf, &parameters);
-
-
- { /* JP2 format output */
- int codestream_length;
- opj_cio_t *cio = NULL;
- FILE *f = NULL;
- opj_cinfo_t *cinfo = NULL;
-
- /* get a JP2 compressor handle */
- if (ibuf->foptions.flag & JP2_JP2)
- cinfo = opj_create_compress(CODEC_JP2);
- else if (ibuf->foptions.flag & JP2_J2K)
- cinfo = opj_create_compress(CODEC_J2K);
- else
- BLI_assert(!"Unsupported codec was specified in save settings");
-
- /* catch events using our callbacks and give a local context */
- opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);
-
- /* setup the encoder parameters using the current image and using user parameters */
- opj_setup_encoder(cinfo, &parameters, image);
-
- /* open a byte stream for writing */
- /* allocate memory for all tiles */
- cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);
-
- /* encode the image */
- bSuccess = opj_encode(cinfo, cio, image, NULL); /* last arg used to be parameters.index but this deprecated */
-
- if (!bSuccess) {
- opj_cio_close(cio);
- fprintf(stderr, "failed to encode image\n");
- return 0;
- }
- codestream_length = cio_tell(cio);
-
- /* write the buffer to disk */
- f = BLI_fopen(name, "wb");
-
- if (!f) {
- fprintf(stderr, "failed to open %s for writing\n", name);
- return 1;
- }
- fwrite(cio->buffer, 1, codestream_length, f);
- fclose(f);
- fprintf(stderr, "Generated outfile %s\n", name);
- /* close and free the byte stream */
- opj_cio_close(cio);
-
- /* free remaining compression structures */
- opj_destroy_compress(cinfo);
- }
-
- /* free image data */
- opj_image_destroy(image);
-
- return 1;
-}
-
-#endif /* defined(OPJ_VERSION_MAJOR) && OPJ_VERSION_MAJOR >= 2 */
diff --git a/source/blender/imbuf/intern/moviecache.c b/source/blender/imbuf/intern/moviecache.c
index daf062f5499..2a650a0c63a 100644
--- a/source/blender/imbuf/intern/moviecache.c
+++ b/source/blender/imbuf/intern/moviecache.c
@@ -380,7 +380,7 @@ static void do_moviecache_put(MovieCache *cache, void *userkey, ImBuf *ibuf, boo
if (need_lock)
BLI_mutex_unlock(&limitor_lock);
- /* cache limiter can't remove unused keys which points to destoryed values */
+ /* cache limiter can't remove unused keys which points to destroyed values */
check_unused_keys(cache);
if (cache->points) {
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp
index a52ae75e87b..bad5e0efd65 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp
@@ -1021,7 +1021,7 @@ void IMB_exr_write_channels(void *handle)
}
for (echan = (ExrChannel *)data->channels.first; echan; echan = echan->next) {
- /* Writting starts from last scanline, stride negative. */
+ /* Writing starts from last scanline, stride negative. */
if (echan->use_half_float) {
float *rect = echan->rect;
half *cur = current_rect_half;
@@ -1921,4 +1921,12 @@ void imb_initopenexr(void)
setGlobalThreadCount(num_threads);
}
+void imb_exitopenexr(void)
+{
+ /* Tells OpenEXR to free thread pool, also ensures there is no running
+ * tasks.
+ */
+ setGlobalThreadCount(0);
+}
+
} // export "C"
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.h b/source/blender/imbuf/intern/openexr/openexr_api.h
index 92bbeecfd5d..32d276b31ea 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.h
+++ b/source/blender/imbuf/intern/openexr/openexr_api.h
@@ -40,6 +40,7 @@ extern "C" {
#include <stdio.h>
void imb_initopenexr (void);
+void imb_exitopenexr (void);
int imb_is_a_openexr (const unsigned char *mem);
diff --git a/source/blender/imbuf/intern/targa.c b/source/blender/imbuf/intern/targa.c
index 9d92d146f50..b83097c2eaa 100644
--- a/source/blender/imbuf/intern/targa.c
+++ b/source/blender/imbuf/intern/targa.c
@@ -367,7 +367,7 @@ static void complete_partial_load(struct ImBuf *ibuf, unsigned int *rect)
memset(rect, 0, size);
}
else {
- /* shouldnt happen */
+ /* shouldn't happen */
printf("decodetarga: incomplete file, all pixels written\n");
}
}
diff --git a/source/blender/imbuf/intern/thumbs.c b/source/blender/imbuf/intern/thumbs.c
index a35ca7f0c47..fbc34264b30 100644
--- a/source/blender/imbuf/intern/thumbs.c
+++ b/source/blender/imbuf/intern/thumbs.c
@@ -99,10 +99,10 @@ static bool get_thumb_dir(char *dir, ThumbSize size)
s += strlen(dir);
#else
#if defined(USE_FREEDESKTOP)
- const char *home_cache = getenv("XDG_CACHE_HOME");
- const char *home = home_cache ? home_cache : getenv("HOME");
+ const char *home_cache = BLI_getenv("XDG_CACHE_HOME");
+ const char *home = home_cache ? home_cache : BLI_getenv("HOME");
#else
- const char *home = getenv("HOME");
+ const char *home = BLI_getenv("HOME");
#endif
if (!home) return 0;
s += BLI_strncpy_rlen(s, home, FILE_MAX);
@@ -362,7 +362,7 @@ static ImBuf *thumb_create_ex(
}
else {
if (ELEM(source, THB_SOURCE_IMAGE, THB_SOURCE_BLEND, THB_SOURCE_FONT)) {
- /* only load if we didnt give an image */
+ /* only load if we didn't give an image */
if (img == NULL) {
switch (source) {
case THB_SOURCE_IMAGE:
diff --git a/source/blender/imbuf/intern/thumbs_blend.c b/source/blender/imbuf/intern/thumbs_blend.c
index 9cf1b96635b..5bdab03e57c 100644
--- a/source/blender/imbuf/intern/thumbs_blend.c
+++ b/source/blender/imbuf/intern/thumbs_blend.c
@@ -39,7 +39,6 @@
#include "BKE_idcode.h"
#include "BKE_icons.h"
-#include "BKE_library.h"
#include "BKE_main.h"
#include "DNA_ID.h" /* For preview images... */
diff --git a/source/blender/imbuf/intern/tiff.c b/source/blender/imbuf/intern/tiff.c
index 0d650daa1c9..f72a924806b 100644
--- a/source/blender/imbuf/intern/tiff.c
+++ b/source/blender/imbuf/intern/tiff.c
@@ -178,10 +178,10 @@ static tsize_t imb_tiff_WriteProc(thandle_t handle, tdata_t data, tsize_t n)
* \param handle: Handle of the TIFF file (pointer to ImbTIFFMemFile).
* \param ofs: Offset value (interpreted according to whence below).
* \param whence: This can be one of three values:
- * SEEK_SET - The offset is set to ofs bytes.
- * SEEK_CUR - The offset is set to its current location plus ofs bytes.
- * SEEK_END - (This is unsupported and will return -1, indicating an
- * error).
+ * SEEK_SET - The offset is set to ofs bytes.
+ * SEEK_CUR - The offset is set to its current location plus ofs bytes.
+ * SEEK_END - (This is unsupported and will return -1, indicating an
+ * error).
*
* \return: Resulting offset location within the file, measured in bytes from
* the beginning of the file. (-1) indicates an error.
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index d7dfa70adad..9e5e822c4d5 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -187,7 +187,7 @@ enum {
IDOVERRIDESTATIC_FLAG_LOCKED = 1 << 1, /* User cannot change that override operation. */
};
-/* A single overriden property, contain all operations on this one. */
+/* A single overridden property, contain all operations on this one. */
typedef struct IDOverrideStaticProperty {
struct IDOverrideStaticProperty *next, *prev;
@@ -294,9 +294,9 @@ enum ePreviewImage_Flag {
/* for PreviewImage->tag */
enum {
- PRV_TAG_DEFFERED = (1 << 0), /* Actual loading of preview is deffered. */
- PRV_TAG_DEFFERED_RENDERING = (1 << 1), /* Deffered preview is being loaded. */
- PRV_TAG_DEFFERED_DELETE = (1 << 2), /* Deffered preview should be deleted asap. */
+ PRV_TAG_DEFFERED = (1 << 0), /* Actual loading of preview is deferred. */
+ PRV_TAG_DEFFERED_RENDERING = (1 << 1), /* Deferred preview is being loaded. */
+ PRV_TAG_DEFFERED_DELETE = (1 << 2), /* Deferred preview should be deleted asap. */
};
typedef struct PreviewImage {
diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h
index 55e1a43925d..7d4ac170489 100644
--- a/source/blender/makesdna/DNA_action_types.h
+++ b/source/blender/makesdna/DNA_action_types.h
@@ -224,7 +224,7 @@ typedef struct bPoseChannel {
char constflag; /* for quick detecting which constraints affect this channel */
char selectflag; /* copy of bone flag, so you can work with library armatures, not for runtime use */
char drawflag;
- char bboneflag;
+ char bboneflag DNA_DEPRECATED;
char pad0[4];
struct Bone *bone; /* set on read file or rebuild pose */
@@ -278,7 +278,7 @@ typedef struct bPoseChannel {
float ease1, ease2;
float scaleIn, scaleOut;
- struct bPoseChannel *bbone_prev; /* next/prev bones to use as handle references when calculating bbones (optional) */
+ struct bPoseChannel *bbone_prev; /* B-Bone custom handles; set on read file or rebuild pose based on pchan->bone data */
struct bPoseChannel *bbone_next;
void *temp; /* use for outliner */
@@ -361,6 +361,7 @@ typedef enum ePchan_DrawFlag {
#define PCHAN_CUSTOM_DRAW_SIZE(pchan) \
(pchan)->custom_scale * (((pchan)->drawflag & PCHAN_DRAW_NO_CUSTOM_BONE_SIZE) ? 1.0f : (pchan)->bone->length)
+#ifdef DNA_DEPRECATED_ALLOW
/* PoseChannel->bboneflag */
typedef enum ePchan_BBoneFlag {
/* Use custom reference bones (for roll and handle alignment), instead of immediate neighbors */
@@ -370,6 +371,7 @@ typedef enum ePchan_BBoneFlag {
/* Evaluate end handle as being "relative" */
PCHAN_BBONE_CUSTOM_END_REL = (1 << 3),
} ePchan_BBoneFlag;
+#endif
/* PoseChannel->rotmode and Object->rotmode */
typedef enum eRotationModes {
@@ -722,7 +724,11 @@ typedef enum eSAction_Flag {
/* don't perform realtime updates */
SACTION_NOREALTIMEUPDATES = (1 << 10),
/* move markers as well as keyframes */
- SACTION_MARKERS_MOVE = (1 << 11)
+ SACTION_MARKERS_MOVE = (1 << 11),
+ /* show interpolation type */
+ SACTION_SHOW_INTERPOLATION = (1 << 12),
+ /* show extremes */
+ SACTION_SHOW_EXTREMES = (1 << 13),
} eSAction_Flag;
/* SpaceAction Mode Settings */
diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h
index 22067b87ff8..515e84c917d 100644
--- a/source/blender/makesdna/DNA_anim_types.h
+++ b/source/blender/makesdna/DNA_anim_types.h
@@ -415,6 +415,8 @@ typedef struct ChannelDriver {
char expression[256]; /* expression to compile for evaluation */
void *expr_comp; /* PyObject - compiled expression, don't save this */
+ struct ExprPyLike_Parsed *expr_simple; /* compiled simple arithmetic expression */
+
float curval; /* result of previous evaluation */
float influence; /* influence of driver on result */ // XXX to be implemented... this is like the constraint influence setting
@@ -564,42 +566,6 @@ typedef enum eFCurve_Smoothing {
/* ************************************************ */
-/* Animation Reuse - i.e. users of Actions */
-
-/* Retargetting ----------------------------------- */
-
-/* Retargetting Pair
- *
- * Defines what parts of the paths should be remapped from 'abc' to 'xyz'.
- * TODO:
- * - Regrex (possibly provided through PY, though having our own module might be faster)
- * would be important to have at some point. Current replacements are just simple
- * string matches...
- */
-typedef struct AnimMapPair {
- char from[128]; /* part of path to bed replaced */
- char to[128]; /* part of path to replace with */
-} AnimMapPair;
-
-/* Retargetting Information for Actions
- *
- * This should only be used if it is strictly necessary (i.e. user will need to explicitly
- * add this when they find that some channels do not match, or motion is not going to right
- * places). When executing an action, this will be checked to see if it provides any useful
- * remaps for the given paths.
- *
- * NOTE: we currently don't store this in the Action itself, as that causes too many problems.
- */
-// FIXME: will this be too clumsy or slow? If we're using RNA paths anyway, we'll have to accept
-// such consequences...
-typedef struct AnimMapper {
- struct AnimMapper *next, *prev;
-
- bAction *target; /* target action */
- ListBase mappings; /* remapping table (bAnimMapPair) */
-} AnimMapper;
-
-/* ************************************************ */
/* NLA - Non-Linear Animation */
/* NLA Strips ------------------------------------- */
@@ -614,7 +580,6 @@ typedef struct NlaStrip {
ListBase strips; /* 'Child' strips (used for 'meta' strips) */
bAction *act; /* Action that is referenced by this strip (strip is 'user' of the action) */
- AnimMapper *remap; /* Remapping info this strip (for tweaking correspondence of action with context) */
ListBase fcurves; /* F-Curves for controlling this strip's influence and timing */ // TODO: move out?
ListBase modifiers; /* F-Curve modifiers to be applied to the entire strip's referenced F-Curves */
@@ -853,6 +818,7 @@ typedef enum eInsertKeyFlags {
* Used by copy/paste code. */
INSERTKEY_OVERWRITE_FULL = (1<<7),
INSERTKEY_DRIVER = (1<<8), /* for driver FCurves, use driver's "input" value - for easier corrective driver setup */
+ INSERTKEY_CYCLE_AWARE = (1<<9), /* for cyclic FCurves, adjust key timing to preserve the cycle period and flow */
} eInsertKeyFlags;
/* ************************************************ */
@@ -899,10 +865,6 @@ typedef struct AnimData {
* took over to be edited in the Animation Editors)
*/
bAction *tmpact;
- /* remapping-info for active action - should only be used if needed
- * (for 'foreign' actions that aren't working correctly)
- */
- AnimMapper *remap;
/* nla-tracks */
ListBase nla_tracks;
diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h
index af555fe6d83..3e68ddcb96b 100644
--- a/source/blender/makesdna/DNA_armature_types.h
+++ b/source/blender/makesdna/DNA_armature_types.h
@@ -78,8 +78,10 @@ typedef struct Bone {
int layer; /* layers that bone appears on */
short segments; /* for B-bones */
- short pad1;
-
+ char bbone_prev_type; /* Type of next/prev bone handles */
+ char bbone_next_type;
+ struct Bone *bbone_prev; /* Next/prev bones to use as handle references when calculating bbones (optional) */
+ struct Bone *bbone_next;
} Bone;
typedef struct bArmature {
@@ -109,7 +111,7 @@ typedef struct bArmature {
unsigned int layer_used; /* for UI, to show which layers are there */
unsigned int layer, layer_protected; /* for buttons to work, both variables in this order together */
-// XXX deprecated... old animaton system (armature only viz) ---
+// XXX deprecated... old animation system (armature only viz) ---
short ghostep, ghostsize; /* number of frames to ghosts to show, and step between them */
short ghosttype, pathsize; /* ghost drawing options and number of frames between points of path */
int ghostsf, ghostef; /* start and end frames of ghost-drawing range */
@@ -214,6 +216,14 @@ typedef enum eBone_Flag {
} eBone_Flag;
+/* bone->bbone_prev_type, bbone_next_type */
+typedef enum eBone_BBoneHandleType {
+ BBONE_HANDLE_AUTO = 0, /* Default mode based on parents & children. */
+ BBONE_HANDLE_ABSOLUTE, /* Custom handle in absolute position mode. */
+ BBONE_HANDLE_RELATIVE, /* Custom handle in relative position mode. */
+ BBONE_HANDLE_TANGENT, /* Custom handle in tangent mode (use direction, not location). */
+} eBone_BBoneHandleType;
+
#define MAXBONENAME 64
#endif
diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h
index 09d5ec92859..d51c94fb536 100644
--- a/source/blender/makesdna/DNA_brush_types.h
+++ b/source/blender/makesdna/DNA_brush_types.h
@@ -55,7 +55,7 @@ typedef struct BrushClone {
typedef struct BrushGpencilSettings {
float draw_smoothfac; /* amount of smoothing to apply to newly created strokes */
- float draw_sensitivity; /* amount of sensivity to apply to newly created strokes */
+ float draw_sensitivity; /* amount of sensitivity to apply to newly created strokes */
float draw_strength; /* amount of alpha strength to apply to newly created strokes */
float draw_jitter; /* amount of jitter to apply to newly created strokes */
float draw_angle; /* angle when the brush has full thickness */
@@ -80,10 +80,11 @@ typedef struct BrushGpencilSettings {
int input_samples; /* maximum distance before generate new point for very fast mouse movements */
float uv_random; /* random factor for UV rotation */
-
- int brush_type; /* type of brush (draw, fill, erase, etc..) */
+ int brush_type DNA_DEPRECATED; /* moved to 'Brush.gpencil_tool' */
int eraser_mode; /* soft, hard or stroke */
float active_smooth; /* smooth while drawing factor */
+ float era_strength_f; /* factor to apply to strength for soft eraser */
+ float era_thickness_f; /* factor to apply to thickness for soft eraser */
char pad_2[4];
struct CurveMapping *curve_sensitivity;
@@ -119,7 +120,9 @@ typedef enum eGPDbrush_Flag {
/* Random settings group */
GP_BRUSH_GROUP_RANDOM = (1 << 12),
/* Keep material assigned to brush */
- GP_BRUSH_MATERIAL_PINNED = (1 << 13)
+ GP_BRUSH_MATERIAL_PINNED = (1 << 13),
+ /* Do not show fill color while drawing (no lasso mode) */
+ GP_BRUSH_DISSABLE_LASSO = (1 << 14),
} eGPDbrush_Flag;
/* BrushGpencilSettings->gp_fill_draw_mode */
@@ -129,13 +132,6 @@ typedef enum eGP_FillDrawModes {
GP_FILL_DMODE_CONTROL = 2,
} eGP_FillDrawModes;
-/* BrushGpencilSettings->brush type */
-typedef enum eGP_BrushType {
- GP_BRUSH_TYPE_DRAW = 0,
- GP_BRUSH_TYPE_FILL = 1,
- GP_BRUSH_TYPE_ERASE = 2,
-} eGP_BrushType;
-
/* BrushGpencilSettings->gp_eraser_mode */
typedef enum eGP_BrushEraserMode {
GP_BRUSH_ERASER_SOFT = 0,
@@ -209,9 +205,12 @@ typedef struct Brush {
float falloff_angle;
char sculpt_tool; /* active sculpt tool */
- char vertexpaint_tool; /* active vertex/weight paint blend mode (poorly named) */
+ char vertexpaint_tool; /* active vertex paint */
+ char weightpaint_tool; /* active weight paint */
char imagepaint_tool; /* active image paint tool */
char mask_tool; /* enum eBrushMaskTool, only used if sculpt_tool is SCULPT_TOOL_MASK */
+ char gpencil_tool; /* Active grease pencil tool. */
+ char _pad0[6];
float autosmooth_factor;
@@ -412,6 +411,28 @@ typedef enum eBrushImagePaintTool {
PAINT_TOOL_MASK = 5
} eBrushImagePaintTool;
+typedef enum eBrushVertexPaintTool {
+ VPAINT_TOOL_DRAW = 0,
+ VPAINT_TOOL_BLUR = 1,
+ VPAINT_TOOL_AVERAGE = 2,
+ VPAINT_TOOL_SMEAR = 3,
+} eBrushVertexPaintTool;
+
+typedef enum eBrushWeightPaintTool {
+ WPAINT_TOOL_DRAW = 0,
+ WPAINT_TOOL_BLUR = 1,
+ WPAINT_TOOL_AVERAGE = 2,
+ WPAINT_TOOL_SMEAR = 3,
+} eBrushWeightPaintTool;
+
+/* BrushGpencilSettings->brush type */
+typedef enum eBrushGPaintTool {
+ GPAINT_TOOL_DRAW = 0,
+ GPAINT_TOOL_FILL = 1,
+ GPAINT_TOOL_ERASE = 2,
+} eBrushGPaintTool;
+
+
/* direction that the brush displaces along */
enum {
SCULPT_DISP_DIR_AREA = 0,
@@ -421,30 +442,6 @@ enum {
SCULPT_DISP_DIR_Z = 4
};
-enum {
- PAINT_BLEND_MIX = 0,
- PAINT_BLEND_ADD = 1,
- PAINT_BLEND_SUB = 2,
- PAINT_BLEND_MUL = 3,
- PAINT_BLEND_BLUR = 4,
- PAINT_BLEND_LIGHTEN = 5,
- PAINT_BLEND_DARKEN = 6,
- PAINT_BLEND_AVERAGE = 7,
- PAINT_BLEND_SMEAR = 8,
- PAINT_BLEND_COLORDODGE = 9,
- PAINT_BLEND_DIFFERENCE = 10,
- PAINT_BLEND_SCREEN = 11,
- PAINT_BLEND_HARDLIGHT = 12,
- PAINT_BLEND_OVERLAY = 13,
- PAINT_BLEND_SOFTLIGHT = 14,
- PAINT_BLEND_EXCLUSION = 15,
- PAINT_BLEND_LUMINOCITY = 16,
- PAINT_BLEND_SATURATION = 17,
- PAINT_BLEND_HUE = 18,
- PAINT_BLEND_ALPHA_SUB = 19,
- PAINT_BLEND_ALPHA_ADD = 20,
-};
-
typedef enum {
BRUSH_MASK_DRAW = 0,
BRUSH_MASK_SMOOTH = 1
diff --git a/source/blender/makesdna/DNA_cloth_types.h b/source/blender/makesdna/DNA_cloth_types.h
index 940872fd08d..39a110d6ad4 100644
--- a/source/blender/makesdna/DNA_cloth_types.h
+++ b/source/blender/makesdna/DNA_cloth_types.h
@@ -49,17 +49,17 @@
typedef struct ClothSimSettings {
struct LinkNode *cache; /* UNUSED atm */
float mingoal; /* see SB */
- float Cdis; /* Mechanical damping of springs. */
+ float Cdis DNA_DEPRECATED; /* Mechanical damping of springs. */
float Cvi; /* Viscous/fluid damping. */
float gravity[3]; /* Gravity/external force vector. */
float dt; /* This is the duration of our time step, computed. */
float mass; /* The mass of the entire cloth. */
- float structural; /* Structural spring stiffness. */
+ float structural DNA_DEPRECATED; /* Structural spring stiffness. */
float shear; /* Shear spring stiffness. */
float bending; /* Flexion spring stiffness. */
float max_bend; /* max bending scaling value, min is "bending" */
- float max_struct; /* max structural scaling value, min is "structural" */
- float max_shear; /* max shear scaling value, UNUSED */
+ float max_struct DNA_DEPRECATED; /* max structural scaling value, min is "structural" */
+ float max_shear; /* max shear scaling value */
float max_sewing; /* max sewing force */
float avg_spring_len; /* used for normalized springs */
float timescale; /* parameter how fast cloth runs */
@@ -75,7 +75,7 @@ typedef struct ClothSimSettings {
float density_target; /* minimum density for hair */
float density_strength; /* influence of hair density */
float collider_friction; /* friction with colliders */
- float vel_damping; /* damp the velocity to speed up getting to the resting position */
+ float vel_damping DNA_DEPRECATED; /* damp the velocity to speed up getting to the resting position */
float shrink_min; /* min amount to shrink cloth by 0.0f (no shrink) - 1.0f (shrink to nothing) */
float shrink_max; /* max amount to shrink cloth by 0.0f (no shrink) - 1.0f (shrink to nothing) */
@@ -101,6 +101,16 @@ typedef struct ClothSimSettings {
char pad0[4];
struct EffectorWeights *effector_weights;
+
+ short bending_model;
+ short vgroup_shear; /* Vertex group for scaling structural stiffness. */
+ float tension;
+ float compression;
+ float max_tension;
+ float max_compression;
+ float tension_damp; /* Mechanical damping of tension springs. */
+ float compression_damp; /* Mechanical damping of compression springs. */
+ float shear_damp; /* Mechanical damping of shear springs. */
} ClothSimSettings;
@@ -111,14 +121,17 @@ typedef struct ClothCollSettings {
float friction; /* Friction/damping applied on contact with other object.*/
float damping; /* Collision restitution on contact with other object.*/
float selfepsilon; /* for selfcollision */
- float repel_force, distance_repel;
+ float repel_force DNA_DEPRECATED;
+ float distance_repel DNA_DEPRECATED;
int flags; /* collision flags defined in BKE_cloth.h */
- short self_loop_count; /* How many iterations for the selfcollision loop */
+ short self_loop_count DNA_DEPRECATED; /* How many iterations for the selfcollision loop */
short loop_count; /* How many iterations for the collision loop. */
int pad;
struct Collection *group; /* Only use colliders from this group of objects */
short vgroup_selfcol; /* vgroup to paint which vertices are used for self collisions */
short pad2[3];
+ float clamp; /* Impulse clamp for object collisions. */
+ float self_clamp; /* Impulse clamp for self collisions. */
} ClothCollSettings;
diff --git a/source/blender/makesdna/DNA_color_types.h b/source/blender/makesdna/DNA_color_types.h
index def1a2bad91..01f0b06c178 100644
--- a/source/blender/makesdna/DNA_color_types.h
+++ b/source/blender/makesdna/DNA_color_types.h
@@ -107,9 +107,8 @@ typedef enum eCurveMappingPreset {
/* CurveMapping->tone */
typedef enum eCurveMappingTone {
- CURVE_TONE_STANDARD = 0,
- CURVE_TONE_WEIGHTED_STANDARD = 1,
- CURVE_TONE_FILMLIKE = 2,
+ CURVE_TONE_STANDARD = 0,
+ CURVE_TONE_FILMLIKE = 2,
} eCurveMappingTone;
/* histogram->mode */
diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h
index 50f0b550201..15555a2bd50 100644
--- a/source/blender/makesdna/DNA_constraint_types.h
+++ b/source/blender/makesdna/DNA_constraint_types.h
@@ -94,6 +94,8 @@ typedef struct bConstraintTarget {
short flag; /* runtime settings (for editor, etc.) */
short type; /* type of target (eConstraintObType) */
short rotOrder; /* rotation order for target (as defined in BLI_math.h) */
+ float weight; /* weight for armature deform */
+ char pad[4];
} bConstraintTarget;
/* bConstraintTarget -> flag */
@@ -121,7 +123,7 @@ typedef struct bPythonConstraint {
ListBase targets; /* a list of targets that this constraint has (bConstraintTarget-s) */
struct Object *tar; /* target from previous implementation (version-patch sets this to NULL on file-load) */
- char subtarget[64]; /* subtarger from previous implentation (version-patch sets this to "" on file-load), MAX_ID_NAME-2 */
+ char subtarget[64]; /* subtarger from previous implementation (version-patch sets this to "" on file-load), MAX_ID_NAME-2 */
} bPythonConstraint;
@@ -180,6 +182,13 @@ typedef struct bSplineIKConstraint {
float bulge_smooth;
} bSplineIKConstraint;
+/* Armature Constraint */
+typedef struct bArmatureConstraint {
+ int flag; /* general settings/state indicators accessed by bitmapping */
+ char pad[4];
+
+ ListBase targets; /* a list of targets that this constraint has (bConstraintTarget-s) */
+} bArmatureConstraint;
/* Single-target subobject constraints --------------------- */
@@ -428,7 +437,10 @@ typedef struct bShrinkwrapConstraint {
char projAxis; /* axis to project/constrain */
char projAxisSpace; /* space to project axis in */
float projLimit; /* distance to search */
- char pad[4];
+ char shrinkMode; /* inside/outside/on surface (see MOD shrinkwrap) */
+ char flag; /* options */
+ char trackAxis; /* axis to align to normal */
+ char pad;
} bShrinkwrapConstraint;
/* Follow Track constraints */
@@ -501,6 +513,7 @@ typedef enum eBConstraint_Types {
CONSTRAINT_TYPE_CAMERASOLVER = 27, /* Camera Solver Constraint */
CONSTRAINT_TYPE_OBJECTSOLVER = 28, /* Object Solver Constraint */
CONSTRAINT_TYPE_TRANSFORM_CACHE = 29, /* Transform Cache Constraint */
+ CONSTRAINT_TYPE_ARMATURE = 30, /* Armature Deform Constraint */
/* NOTE: no constraints are allowed to be added after this */
NUM_CONSTRAINT_TYPES
@@ -634,6 +647,23 @@ typedef enum eTrackToAxis_Modes {
TRACK_nZ = 5
} eTrackToAxis_Modes;
+/* Shrinkwrap flags */
+typedef enum eShrinkwrap_Flags {
+ /* Also raycast in the opposite direction. */
+ CON_SHRINKWRAP_PROJECT_OPPOSITE = (1 << 0),
+ /* Invert the cull mode when projecting opposite. */
+ CON_SHRINKWRAP_PROJECT_INVERT_CULL = (1 << 1),
+ /* Align the specified axis to the target normal. */
+ CON_SHRINKWRAP_TRACK_NORMAL = (1 << 2),
+
+ /* Ignore front faces in project; same value as MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE */
+ CON_SHRINKWRAP_PROJECT_CULL_FRONTFACE = (1 << 3),
+ /* Ignore back faces in project; same value as MOD_SHRINKWRAP_CULL_TARGET_BACKFACE */
+ CON_SHRINKWRAP_PROJECT_CULL_BACKFACE = (1 << 4),
+} eShrinkwrap_Flags;
+
+#define CON_SHRINKWRAP_PROJECT_CULL_MASK (CON_SHRINKWRAP_PROJECT_CULL_FRONTFACE | CON_SHRINKWRAP_PROJECT_CULL_BACKFACE)
+
/* FollowPath flags */
typedef enum eFollowPath_Flags {
FOLLOWPATH_FOLLOW = (1<<0),
@@ -646,7 +676,7 @@ typedef enum eTrackTo_Flags {
TARGET_Z_UP = (1<<0)
} eTrackTo_Flags;
-/* Strech To Constraint -> volmode */
+/* Stretch To Constraint -> volmode */
typedef enum eStretchTo_VolMode {
VOLUME_XZ = 0,
VOLUME_X = 1,
@@ -727,6 +757,13 @@ typedef enum eSplineIK_XZScaleModes {
CONSTRAINT_SPLINEIK_XZS_VOLUMETRIC = 3
} eSplineIK_XZScaleModes;
+/* bArmatureConstraint -> flag */
+typedef enum eArmature_Flags {
+ CONSTRAINT_ARMATURE_QUATERNION = (1<<0), /* use dual quaternion blending */
+ CONSTRAINT_ARMATURE_ENVELOPE = (1<<1), /* use envelopes */
+ CONSTRAINT_ARMATURE_CUR_LOCATION = (1<<2), /* use current bone location */
+} eArmature_Flags;
+
/* MinMax (floor) flags */
typedef enum eFloor_Flags {
MINMAX_STICKY = (1<<0),
diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h
index 6e3573b9f80..b8b1066e1a9 100644
--- a/source/blender/makesdna/DNA_curve_types.h
+++ b/source/blender/makesdna/DNA_curve_types.h
@@ -278,11 +278,13 @@ enum {
CU_AUTOSPACE = 1,
};
+#if 0 /* Moved to overlay options in 2.8 */
/* Curve.drawflag */
enum {
CU_HIDE_HANDLES = 1 << 0,
CU_HIDE_NORMALS = 1 << 1,
};
+#endif
/* Curve.flag */
enum {
@@ -334,7 +336,8 @@ enum {
CU_ALIGN_Y_TOP_BASELINE = 0,
CU_ALIGN_Y_TOP = 1,
CU_ALIGN_Y_CENTER = 2,
- CU_ALIGN_Y_BOTTOM = 3,
+ CU_ALIGN_Y_BOTTOM_BASELINE = 3,
+ CU_ALIGN_Y_BOTTOM = 4,
};
/* Nurb.flag */
@@ -442,8 +445,8 @@ typedef enum eBezTriple_KeyframeType {
/* checks if the given BezTriple is selected */
#define BEZT_ISSEL_ANY(bezt) \
(((bezt)->f2 & SELECT) || ((bezt)->f1 & SELECT) || ((bezt)->f3 & SELECT))
-#define BEZT_ISSEL_ANY_HIDDENHANDLES(cu, bezt) \
- (((cu)->drawflag & CU_HIDE_HANDLES) ? (bezt)->f2 & SELECT : BEZT_ISSEL_ANY(bezt))
+#define BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt) \
+ ((((v3d) != NULL) && ((v3d)->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) ? (bezt)->f2 & SELECT : BEZT_ISSEL_ANY(bezt))
#define BEZT_SEL_ALL(bezt) { (bezt)->f1 |= SELECT; (bezt)->f2 |= SELECT; (bezt)->f3 |= SELECT; } ((void)0)
#define BEZT_DESEL_ALL(bezt) { (bezt)->f1 &= ~SELECT; (bezt)->f2 &= ~SELECT; (bezt)->f3 &= ~SELECT; } ((void)0)
diff --git a/source/blender/makesdna/DNA_dynamicpaint_types.h b/source/blender/makesdna/DNA_dynamicpaint_types.h
index d8caec4da40..589135e1d58 100644
--- a/source/blender/makesdna/DNA_dynamicpaint_types.h
+++ b/source/blender/makesdna/DNA_dynamicpaint_types.h
@@ -163,7 +163,7 @@ enum {
/* Canvas settings */
typedef struct DynamicPaintCanvasSettings {
struct DynamicPaintModifierData *pmd; /* for fast RNA access */
- struct DerivedMesh *dm;
+ struct Mesh *mesh;
struct ListBase surfaces;
short active_sur, flags;
@@ -229,7 +229,7 @@ enum {
/* Brush settings */
typedef struct DynamicPaintBrushSettings {
struct DynamicPaintModifierData *pmd; /* for fast RNA access */
- struct DerivedMesh *dm;
+ struct Mesh *mesh;
struct ParticleSystem *psys;
int flags;
diff --git a/source/blender/makesdna/DNA_gpencil_modifier_types.h b/source/blender/makesdna/DNA_gpencil_modifier_types.h
index ae341b24e41..af680b8fb9d 100644
--- a/source/blender/makesdna/DNA_gpencil_modifier_types.h
+++ b/source/blender/makesdna/DNA_gpencil_modifier_types.h
@@ -40,7 +40,7 @@ typedef enum GpencilModifierType {
eGpencilModifierType_Subdiv = 2,
eGpencilModifierType_Thick = 3,
eGpencilModifierType_Tint = 4,
- eGpencilModifierType_Instance = 5,
+ eGpencilModifierType_Array = 5,
eGpencilModifierType_Build = 6,
eGpencilModifierType_Opacity = 7,
eGpencilModifierType_Color = 8,
@@ -51,6 +51,7 @@ typedef enum GpencilModifierType {
eGpencilModifierType_Offset = 13,
eGpencilModifierType_Mirror = 14,
eGpencilModifierType_Armature = 15,
+ eGpencilModifierType_Time = 16,
NUM_GREASEPENCIL_MODIFIER_TYPES
} GpencilModifierType;
@@ -90,6 +91,8 @@ typedef struct NoiseGpencilModifierData {
int scene_frame; /* last scene frame used */
float vrand1, vrand2; /* random values */
struct RNG *rng;
+ int layer_pass; /* custom index for passes */
+ char pad_[4];
} NoiseGpencilModifierData;
typedef enum eNoiseGpencil_Flag {
@@ -103,6 +106,7 @@ typedef enum eNoiseGpencil_Flag {
GP_NOISE_INVERT_PASS = (1 << 7),
GP_NOISE_INVERT_VGROUP = (1 << 8),
GP_NOISE_MOD_UV = (1 << 9),
+ GP_NOISE_INVERT_LAYERPASS = (1 << 10),
} eNoiseGpencil_Flag;
typedef struct SubdivGpencilModifierData {
@@ -111,13 +115,14 @@ typedef struct SubdivGpencilModifierData {
int pass_index; /* custom index for passes */
int flag; /* flags */
int level; /* factor of subdivision */
- char pad[4];
+ int layer_pass; /* custom index for passes */
} SubdivGpencilModifierData;
typedef enum eSubdivGpencil_Flag {
GP_SUBDIV_SIMPLE = (1 << 0),
GP_SUBDIV_INVERT_LAYER = (1 << 1),
GP_SUBDIV_INVERT_PASS = (1 << 2),
+ GP_SUBDIV_INVERT_LAYERPASS = (1 << 3),
} eSubdivGpencil_Flag;
typedef struct ThickGpencilModifierData {
@@ -127,7 +132,7 @@ typedef struct ThickGpencilModifierData {
int pass_index; /* custom index for passes */
int flag; /* flags */
int thickness; /* Thickness change */
- char pad[4];
+ int layer_pass; /* custom index for passes */
struct CurveMapping *curve_thickness;
} ThickGpencilModifierData;
@@ -137,8 +142,35 @@ typedef enum eThickGpencil_Flag {
GP_THICK_INVERT_VGROUP = (1 << 2),
GP_THICK_CUSTOM_CURVE = (1 << 3),
GP_THICK_NORMALIZE = (1 << 4),
+ GP_THICK_INVERT_LAYERPASS = (1 << 5),
} eThickGpencil_Flag;
+typedef struct TimeGpencilModifierData {
+ GpencilModifierData modifier;
+ char layername[64]; /* layer name */
+ int layer_pass; /* custom index for passes */
+ int flag; /* flags */
+ int offset;
+ float frame_scale; /* animation scale */
+ int mode;
+ int sfra, efra; /* start and end frame for custom range */
+ char pad_[4];
+} TimeGpencilModifierData;
+
+typedef enum eTimeGpencil_Flag {
+ GP_TIME_INVERT_LAYER = (1 << 0),
+ GP_TIME_KEEP_LOOP = (1 << 1),
+ GP_TIME_INVERT_LAYERPASS = (1 << 2),
+ GP_TIME_CUSTOM_RANGE = (1 << 3),
+} eTimeGpencil_Flag;
+
+typedef enum eTimeGpencil_Mode {
+ GP_TIME_MODE_NORMAL = 0,
+ GP_TIME_MODE_REVERSE = 1,
+ GP_TIME_MODE_FIX = 2
+} eTimeGpencil_Mode;
+
+
typedef enum eModifyColorGpencil_Flag {
GP_MODIFY_COLOR_BOTH = 0,
GP_MODIFY_COLOR_STROKE = 1,
@@ -152,14 +184,17 @@ typedef struct TintGpencilModifierData {
int flag; /* flags */
float rgb[3]; /* Tint color */
float factor; /* Mix factor */
- char modify_color; /* modify stroke, fill or both */
+ char modify_color; /* modify stroke, fill or both */
char pad[7];
+ int layer_pass; /* custom index for passes */
+ char pad_[4];
} TintGpencilModifierData;
typedef enum eTintGpencil_Flag {
GP_TINT_CREATE_COLORS = (1 << 0),
GP_TINT_INVERT_LAYER = (1 << 1),
GP_TINT_INVERT_PASS = (1 << 2),
+ GP_TINT_INVERT_LAYERPASS = (1 << 3),
} eTintGpencil_Flag;
typedef struct ColorGpencilModifierData {
@@ -168,14 +203,17 @@ typedef struct ColorGpencilModifierData {
int pass_index; /* custom index for passes */
int flag; /* flags */
float hsv[3]; /* hsv factors */
- char modify_color; /* modify stroke, fill or both */
+ char modify_color; /* modify stroke, fill or both */
char pad[3];
+ int layer_pass; /* custom index for passes */
+ char pad_[4];
} ColorGpencilModifierData;
typedef enum eColorGpencil_Flag {
GP_COLOR_CREATE_COLORS = (1 << 0),
GP_COLOR_INVERT_LAYER = (1 << 1),
GP_COLOR_INVERT_PASS = (1 << 2),
+ GP_COLOR_INVERT_LAYERPASS = (1 << 3),
} eColorGpencil_Flag;
typedef struct OpacityGpencilModifierData {
@@ -187,6 +225,8 @@ typedef struct OpacityGpencilModifierData {
float factor; /* Main Opacity factor */
char modify_color; /* modify stroke, fill or both */
char pad[3];
+ int layer_pass; /* custom index for passes */
+ char pad_[4];
} OpacityGpencilModifierData;
typedef enum eOpacityGpencil_Flag {
@@ -194,11 +234,13 @@ typedef enum eOpacityGpencil_Flag {
GP_OPACITY_INVERT_PASS = (1 << 1),
GP_OPACITY_INVERT_VGROUP = (1 << 2),
GP_OPACITY_CREATE_COLORS = (1 << 3),
+ GP_OPACITY_INVERT_LAYERPASS = (1 << 4),
} eOpacityGpencil_Flag;
-typedef struct InstanceGpencilModifierData {
+typedef struct ArrayGpencilModifierData {
GpencilModifierData modifier;
- int count[3]; /* number of elements in array */
+ struct Object *object;
+ int count; /* number of elements in array */
int flag; /* several flags */
float offset[3]; /* Location increments */
float shift[3]; /* shift increment */
@@ -207,18 +249,22 @@ typedef struct InstanceGpencilModifierData {
float rot[3]; /* Rotation changes */
float scale[3]; /* Scale changes */
float rnd[20]; /* (first element is the index) random values */
- int lock_axis; /* lock shift to one axis */
+ char pad_[4];
int pass_index; /* custom index for passes */
char layername[64]; /* layer name */
-} InstanceGpencilModifierData;
-
-typedef enum eInstanceGpencil_Flag {
- GP_INSTANCE_RANDOM_SIZE = (1 << 0),
- GP_INSTANCE_RANDOM_ROT = (1 << 1),
- GP_INSTANCE_INVERT_LAYER = (1 << 2),
- GP_INSTANCE_INVERT_PASS = (1 << 3),
-} eInstanceGpencil_Flag;
+ int mat_rpl; /* material replace (0 keep default) */
+ int layer_pass; /* custom index for passes */
+} ArrayGpencilModifierData;
+
+typedef enum eArrayGpencil_Flag {
+ GP_ARRAY_RANDOM_SIZE = (1 << 0),
+ GP_ARRAY_RANDOM_ROT = (1 << 1),
+ GP_ARRAY_INVERT_LAYER = (1 << 2),
+ GP_ARRAY_INVERT_PASS = (1 << 3),
+ GP_ARRAY_KEEP_ONTOP = (1 << 4),
+ GP_ARRAY_INVERT_LAYERPASS = (1 << 5),
+} eArrayGpencil_Flag;
typedef struct BuildGpencilModifierData {
GpencilModifierData modifier;
@@ -226,7 +272,7 @@ typedef struct BuildGpencilModifierData {
char layername[64]; /* if set, restrict modifier to operating on this layer */
int pass_index;
- int pad;
+ int layer_pass; /* custom index for passes */
float start_frame; /* If GP_BUILD_RESTRICT_TIME is set, the defines the frame range where GP frames are considered */
float end_frame;
@@ -274,6 +320,7 @@ typedef enum eBuildGpencil_Flag {
/* Restrict modifier to only operating between the nominated frames */
GP_BUILD_RESTRICT_TIME = (1 << 2),
+ GP_BUILD_INVERT_LAYERPASS = (1 << 3),
} eBuildGpencil_Flag;
typedef struct LatticeGpencilModifierData {
@@ -284,7 +331,7 @@ typedef struct LatticeGpencilModifierData {
int pass_index; /* custom index for passes */
int flag; /* flags */
float strength;
- char pad[4];
+ int layer_pass; /* custom index for passes */
void *cache_data; /* runtime only (LatticeDeformData) */
} LatticeGpencilModifierData;
@@ -292,6 +339,7 @@ typedef enum eLatticeGpencil_Flag {
GP_LATTICE_INVERT_LAYER = (1 << 0),
GP_LATTICE_INVERT_PASS = (1 << 1),
GP_LATTICE_INVERT_VGROUP = (1 << 2),
+ GP_LATTICE_INVERT_LAYERPASS = (1 << 3),
} eLatticeGpencil_Flag;
typedef struct MirrorGpencilModifierData {
@@ -300,6 +348,8 @@ typedef struct MirrorGpencilModifierData {
char layername[64]; /* layer name */
int pass_index; /* custom index for passes */
int flag; /* flags */
+ int layer_pass; /* custom index for passes */
+ char pad_[4];
} MirrorGpencilModifierData;
typedef enum eMirrorGpencil_Flag {
@@ -309,6 +359,7 @@ typedef enum eMirrorGpencil_Flag {
GP_MIRROR_AXIS_X = (1 << 3),
GP_MIRROR_AXIS_Y = (1 << 4),
GP_MIRROR_AXIS_Z = (1 << 5),
+ GP_MIRROR_INVERT_LAYERPASS = (1 << 6),
} eMirrorGpencil_Flag;
typedef struct HookGpencilModifierData {
@@ -319,6 +370,8 @@ typedef struct HookGpencilModifierData {
char layername[64]; /* layer name */
char vgname[64]; /* optional vertexgroup name, MAX_VGROUP_NAME */
int pass_index; /* custom index for passes */
+ int layer_pass; /* custom index for passes */
+ char pad_[4];
int flag;
char falloff_type; /* use enums from WarpGpencilModifier (exact same functionality) */
@@ -335,6 +388,7 @@ typedef enum eHookGpencil_Flag {
GP_HOOK_INVERT_PASS = (1 << 1),
GP_HOOK_INVERT_VGROUP = (1 << 2),
GP_HOOK_UNIFORM_SPACE = (1 << 3),
+ GP_HOOK_INVERT_LAYERPASS = (1 << 4),
} eHookGpencil_Flag;
typedef enum eHookGpencil_Falloff {
@@ -357,11 +411,14 @@ typedef struct SimplifyGpencilModifierData {
float factor; /* factor of simplify */
short mode; /* type of simplify */
short step; /* every n vertex to keep */
+ int layer_pass; /* custom index for passes */
+ char pad_[4];
} SimplifyGpencilModifierData;
typedef enum eSimplifyGpencil_Flag {
GP_SIMPLIFY_INVERT_LAYER = (1 << 0),
GP_SIMPLIFY_INVERT_PASS = (1 << 1),
+ GP_SIMPLIFY_INVERT_LAYERPASS = (1 << 2),
} eSimplifyGpencil_Flag;
typedef enum eSimplifyGpencil_Mode {
@@ -380,13 +437,14 @@ typedef struct OffsetGpencilModifierData {
float loc[3];
float rot[3];
float scale[3];
- char pad[4];
+ int layer_pass; /* custom index for passes */
} OffsetGpencilModifierData;
typedef enum eOffsetGpencil_Flag {
GP_OFFSET_INVERT_LAYER = (1 << 0),
GP_OFFSET_INVERT_PASS = (1 << 1),
- GP_OFFSET_INVERT_VGROUP = (1 << 2)
+ GP_OFFSET_INVERT_VGROUP = (1 << 2),
+ GP_OFFSET_INVERT_LAYERPASS = (1 << 3),
} eOffsetGpencil_Flag;
typedef struct SmoothGpencilModifierData {
@@ -397,6 +455,8 @@ typedef struct SmoothGpencilModifierData {
int flag; /* several flags */
float factor; /* factor of noise */
int step; /* how many times apply smooth */
+ int layer_pass; /* custom index for passes */
+ char pad_[4];
} SmoothGpencilModifierData;
typedef enum eSmoothGpencil_Flag {
@@ -407,6 +467,7 @@ typedef enum eSmoothGpencil_Flag {
GP_SMOOTH_INVERT_PASS = (1 << 4),
GP_SMOOTH_INVERT_VGROUP = (1 << 5),
GP_SMOOTH_MOD_UV = (1 << 6),
+ GP_SMOOTH_INVERT_LAYERPASS = (1 << 7),
} eSmoothGpencil_Flag;
typedef struct ArmatureGpencilModifierData {
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index 8462b615d2c..fcaf8b00cde 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -34,12 +34,12 @@
#include "DNA_ID.h"
#include "DNA_brush_types.h"
+struct ARegion;
struct AnimData;
struct CurveMapping;
struct GHash;
struct MDeformVert;
-/* TODO: add size as userprefs parameter */
#define GP_OBGPENCIL_DEFAULT_SIZE 0.2f
#define GP_DEFAULT_PIX_FACTOR 1.0f
#define GP_DEFAULT_GRID_LINES 4
@@ -71,17 +71,19 @@ typedef enum eGPDspoint_Flag {
/* stroke point is tagged (for some editing operation) */
GP_SPOINT_TAG = (1 << 1),
+ /* stroke point is temp tagged (for some editing operation) */
+ GP_SPOINT_TEMP_TAG = (1 << 2),
} eGPSPoint_Flag;
/* ***************************************** */
-/* GP Fill - Triangle Tesselation Data */
+/* GP Fill - Triangle Tessellation Data */
/* Grease-Pencil Annotations - 'Triangle'
* -> A triangle contains the index of three vertices for filling the stroke
* This is only used if high quality fill is enabled
*/
typedef struct bGPDtriangle {
- /* indices for tesselated triangle used for GP Fill */
+ /* indices for tessellated triangle used for GP Fill */
unsigned int verts[3];
/* texture coordinates for verts */
float uv[3][2];
@@ -138,7 +140,7 @@ typedef enum eGPDpalette_Flag {
/* GP Strokes */
/* Runtime temp data for bGPDstroke */
-typedef struct bGPDstroke_runtime {
+typedef struct bGPDstroke_Runtime {
/* runtime final colors (result of original colors and modifiers) */
float tmp_stroke_rgba[4];
float tmp_fill_rgba[4];
@@ -147,7 +149,7 @@ typedef struct bGPDstroke_runtime {
char tmp_layerinfo[128];
float multi_frame_falloff; /* runtime falloff factor (only for transform) */
-} bGPDstroke_runtime;
+} bGPDstroke_Runtime;
/* Grease-Pencil Annotations - 'Stroke'
* -> A stroke represents a (simplified version) of the curve
@@ -157,7 +159,7 @@ typedef struct bGPDstroke {
struct bGPDstroke *next, *prev;
bGPDspoint *points; /* array of data-points for stroke */
- bGPDtriangle *triangles;/* tesselated triangles for GP Fill */
+ bGPDtriangle *triangles;/* tessellated triangles for GP Fill */
int totpoints; /* number of data-points in array */
int tot_triangles; /* number of triangles in array */
@@ -173,7 +175,7 @@ typedef struct bGPDstroke {
struct MDeformVert *dvert; /* vertex weight data */
- bGPDstroke_runtime runtime;
+ bGPDstroke_Runtime runtime;
char pad_1[4];
} bGPDstroke;
@@ -201,9 +203,9 @@ typedef enum eGPDstroke_Flag {
/* GP Frame */
/* Runtime temp data for bGPDframe */
-typedef struct bGPDframe_runtime {
+typedef struct bGPDframe_Runtime {
float viewmatrix[4][4]; /* parent matrix for drawing */
-} bGPDframe_runtime;
+} bGPDframe_Runtime;
/* Grease-Pencil Annotations - 'Frame'
* -> Acts as storage for the 'image' formed by strokes
@@ -218,7 +220,7 @@ typedef struct bGPDframe {
short flag; /* temp settings */
short key_type; /* keyframe type (eBezTriple_KeyframeType) */
- bGPDframe_runtime runtime;
+ bGPDframe_Runtime runtime;
} bGPDframe;
/* bGPDframe->flag */
@@ -233,11 +235,13 @@ typedef enum eGPDframe_Flag {
/* GP Layer */
/* Runtime temp data for bGPDlayer */
-typedef struct bGPDlayer_runtime {
- struct GHash *derived_data; /* runtime data created by modifiers */
+typedef struct bGPDlayer_Runtime {
+ struct bGPDframe *derived_array;/* runtime data created by modifiers */
int icon_id; /* id for dynamic icon used to show annotation color preview for layer */
int batch_index; /* batch used for dupli instances */
-} bGPDlayer_runtime;
+ int len_derived; /* len of the derived array */
+ char pad_[4];
+} bGPDlayer_Runtime;
/* Grease-Pencil Annotations - 'Layer' */
typedef struct bGPDlayer {
@@ -256,7 +260,7 @@ typedef struct bGPDlayer {
* needs to be kept unique, as it's used as the layer identifier */
short thickness; /* thickness to apply to strokes (Annotations) */
- char pad_1[2];
+ short pass_index; /* used to filter groups of layers in modifiers */
struct Object *parent; /* parent object */
float inverse[4][4]; /* inverse matrix (only used if parented) */
@@ -266,8 +270,9 @@ typedef struct bGPDlayer {
short line_change; /* Thickness adjustment */
float tintcolor[4]; /* Color used to tint layer, alpha value is used as factor */
float opacity; /* Opacity of the layer */
+ char viewlayername[64]; /* Name of the layer used to filter render output */
- bGPDlayer_runtime runtime;
+ bGPDlayer_Runtime runtime;
} bGPDlayer;
/* bGPDlayer->flag */
@@ -302,9 +307,8 @@ typedef enum eGPDlayer_OnionFlag {
/* GP Datablock */
/* Runtime temp data for bGPdata */
-typedef struct bGPdata_runtime {
- /* Drawing Manager cache */
- struct GHash *batch_cache_data;
+typedef struct bGPdata_Runtime {
+ struct ARegion *ar; /* last region where drawing was originated */
void *sbuffer; /* stroke buffer (can hold GP_STROKE_BUFFER_MAX) */
/* GP Object drawing */
@@ -315,13 +319,24 @@ typedef struct bGPdata_runtime {
short bfill_style; /* buffer style for filling areas (used to select shader type) */
/* Stroke Buffer data (only used during paint-session)
- * - buffer must be initialized before use, but freed after
- * whole paint operation is over
- */
+ * - buffer must be initialized before use, but freed after
+ * whole paint operation is over
+ */
short sbuffer_size; /* number of elements currently in cache */
short sbuffer_sflag; /* flags for stroke that cache represents */
char pad_[6];
-} bGPdata_runtime;
+} bGPdata_Runtime;
+
+/* grid configuration */
+typedef struct bGPgrid {
+ float color[3];
+ float scale[2];
+ float offset[2];
+ char _pad1[4];
+
+ int lines;
+ char pad_[4];
+} bGPgrid;
/* Grease-Pencil Annotations - 'DataBlock' */
typedef struct bGPdata {
@@ -352,7 +367,7 @@ typedef struct bGPdata {
float gcolor_prev[3]; /* optional color for ghosts before the active frame */
float gcolor_next[3]; /* optional color for ghosts after the active frame */
- char pad[4];
+ float zdepth_offset; /* offset for drawing over surfaces to keep strokes on top */
struct Material **mat; /* materials array */
short totcol; /* total materials */
@@ -363,7 +378,9 @@ typedef struct bGPdata {
int totstroke;
int totpoint;
char pad_3[4];
- bGPdata_runtime runtime;
+ bGPgrid grid;
+
+ bGPdata_Runtime runtime;
} bGPdata;
/* bGPdata->flag */
@@ -429,6 +446,10 @@ typedef enum eGPdata_Flag {
GP_DATA_STROKE_FORCE_RECALC = (1 << 17),
/* Special mode drawing polygons */
GP_DATA_STROKE_POLYGON = (1 << 18),
+ /* Use adaptative UV scales */
+ GP_DATA_UV_ADAPTATIVE = (1 << 19),
+ /* Autolock not active layers */
+ GP_DATA_AUTOLOCK_LAYERS = (1 << 20),
} eGPdata_Flag;
/* gpd->onion_flag */
@@ -473,6 +494,8 @@ typedef enum eGP_DepthOrdering {
((gpd) && (gpd->flag & \
(GP_DATA_STROKE_PAINTMODE | GP_DATA_STROKE_EDITMODE | \
GP_DATA_STROKE_SCULPTMODE | GP_DATA_STROKE_WEIGHTMODE)))
+#define GPENCIL_EDIT_MODE(gpd) \
+ ((gpd) && (gpd->flag & GP_DATA_STROKE_EDITMODE))
#define GPENCIL_ANY_EDIT_MODE(gpd) \
((gpd) && (gpd->flag & (GP_DATA_STROKE_EDITMODE | GP_DATA_STROKE_SCULPTMODE | GP_DATA_STROKE_WEIGHTMODE)))
#define GPENCIL_PAINT_MODE(gpd) \
diff --git a/source/blender/makesdna/DNA_key_types.h b/source/blender/makesdna/DNA_key_types.h
index 2b097092bc4..fa58f8f8abd 100644
--- a/source/blender/makesdna/DNA_key_types.h
+++ b/source/blender/makesdna/DNA_key_types.h
@@ -135,4 +135,15 @@ enum {
KEYBLOCK_LOCKED = (1 << 2)
};
+#define KEYELEM_FLOAT_LEN_COORD 3
+
+/* Curve key data layout constants */
+#define KEYELEM_ELEM_SIZE_CURVE 3
+
+#define KEYELEM_ELEM_LEN_BPOINT 2
+#define KEYELEM_FLOAT_LEN_BPOINT (KEYELEM_ELEM_LEN_BPOINT * KEYELEM_ELEM_SIZE_CURVE)
+
+#define KEYELEM_ELEM_LEN_BEZTRIPLE 4
+#define KEYELEM_FLOAT_LEN_BEZTRIPLE (KEYELEM_ELEM_LEN_BEZTRIPLE * KEYELEM_ELEM_SIZE_CURVE)
+
#endif /* __DNA_KEY_TYPES_H__ */
diff --git a/source/blender/makesdna/DNA_layer_types.h b/source/blender/makesdna/DNA_layer_types.h
index e6b1bda7cf5..3dcd31fbd7b 100644
--- a/source/blender/makesdna/DNA_layer_types.h
+++ b/source/blender/makesdna/DNA_layer_types.h
@@ -40,7 +40,7 @@ typedef struct Base {
short pad;
short sx, sy;
struct Object *object;
- unsigned int lay;
+ unsigned int lay DNA_DEPRECATED;
int flag_legacy;
} Base;
diff --git a/source/blender/makesdna/DNA_mask_types.h b/source/blender/makesdna/DNA_mask_types.h
index b84292d0519..9d4b68b7242 100644
--- a/source/blender/makesdna/DNA_mask_types.h
+++ b/source/blender/makesdna/DNA_mask_types.h
@@ -88,7 +88,7 @@ typedef struct MaskSplinePoint {
typedef struct MaskSpline {
struct MaskSpline *next, *prev;
- short flag; /* defferent spline flag (closed, ...) */
+ short flag; /* different spline flag (closed, ...) */
char offset_mode; /* feather offset method */
char weight_interp; /* weight interpolation */
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index 9d4da91aaed..85dfe300429 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -98,7 +98,11 @@ typedef enum eMaterialGPencilStyle_Flag {
/* Flip fill colors */
GP_STYLE_COLOR_FLIP_FILL = (1 << 6),
/* Stroke Texture is a pattern */
- GP_STYLE_STROKE_PATTERN = (1 << 7)
+ GP_STYLE_STROKE_PATTERN = (1 << 7),
+ /* Stroke show main switch */
+ GP_STYLE_STROKE_SHOW = (1 << 8),
+ /* Fill show main switch */
+ GP_STYLE_FILL_SHOW = (1 << 9)
} eMaterialGPencilStyle_Flag;
typedef enum eMaterialGPencilStyle_Mode {
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index a91f2f05c1a..fda18e5cbd6 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -53,6 +53,7 @@ struct MVert;
struct Material;
struct Mesh;
struct Multires;
+struct SubdivCCG;
#
#
@@ -84,6 +85,11 @@ typedef struct Mesh_Runtime {
struct EditMeshData *edit_data;
void *batch_cache;
+ struct SubdivCCG *subdiv_ccg;
+ void *pad1;
+ int subdiv_ccg_tot_level;
+ int pad2;
+
int64_t cd_dirty_vert;
int64_t cd_dirty_edge;
int64_t cd_dirty_loop;
@@ -94,8 +100,17 @@ typedef struct Mesh_Runtime {
/** 'BVHCache', for 'BKE_bvhutil.c' */
struct LinkNode *bvh_cache;
- int deformed_only; /* set by modifier stack if only deformed from original */
- char padding[4];
+ /** Non-manifold boundary data for Shrinkwrap Target Project. */
+ struct ShrinkwrapBoundaryData *shrinkwrap_data;
+
+ /** Set by modifier stack if only deformed from original. */
+ char deformed_only;
+ /**
+ * Copied from edit-mesh (hint, draw with editmesh data).
+ * In the future we may leave the mesh-data empty
+ * since its not needed if we can use edit-mesh data. */
+ char is_original;
+ char padding[6];
} Mesh_Runtime;
typedef struct Mesh {
@@ -235,6 +250,7 @@ enum {
ME_CDFLAG_EDGE_CREASE = 1 << 2,
};
+#if 0 /* Was moved to overlay options for 2.8 */
/* me->drawflag, short */
enum {
ME_DRAWEDGES = 1 << 0,
@@ -267,6 +283,7 @@ enum {
/* draw loop normals */
ME_DRAW_LNORMALS = 1 << 18,
};
+#endif
/* Subsurf Type */
enum {
diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h
index 7d79242016f..8525f9d0334 100644
--- a/source/blender/makesdna/DNA_meshdata_types.h
+++ b/source/blender/makesdna/DNA_meshdata_types.h
@@ -95,7 +95,7 @@ typedef struct MLoop {
* There is no attempt to maintain this data's validity over time, any changes to the underlying mesh
* invalidate the #MLoopTri array, which will need to be re-calculated.
*
- * Users normally access this via #DerivedMesh.getLoopTriArray.
+ * Users normally access this via #BKE_mesh_runtime_looptri_ensure.
* In rare cases its calculated directly, with #BKE_mesh_recalc_looptri.
*
* Typical usage includes:
@@ -172,10 +172,10 @@ typedef struct MLoop {
* }
* \endcode
*
+ * See #BKE_mesh_looptri_get_real_edges for a utility that does this.
+ *
* \note A #MLoopTri may be in the middle of an ngon and not reference **any** edges.
*/
-#
-#
typedef struct MLoopTri {
unsigned int tri[3];
unsigned int poly;
diff --git a/source/blender/makesdna/DNA_meta_types.h b/source/blender/makesdna/DNA_meta_types.h
index c312d45567f..3f0b1b302c7 100644
--- a/source/blender/makesdna/DNA_meta_types.h
+++ b/source/blender/makesdna/DNA_meta_types.h
@@ -47,7 +47,8 @@ typedef struct MetaElem {
struct BoundBox *bb; /* Bound Box of MetaElem */
- short type, flag, selcol1, selcol2;
+ short type, flag;
+ short pad[2];
float x, y, z; /* Position of center of MetaElem */
float quat[4]; /* Rotation of MetaElem (MUST be kept normalized) */
float expx; /* dimension parameters, used for some types like cubes */
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 8efac9fcd4a..6976c517713 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -220,8 +220,9 @@ typedef struct MaskModifierData {
struct Object *ob_arm; /* armature to use to in place of hardcoded vgroup */
char vgroup[64]; /* name of vertex group to use to mask, MAX_VGROUP_NAME */
- int mode; /* using armature or hardcoded vgroup */
- int flag; /* flags for various things */
+ short mode; /* using armature or hardcoded vgroup */
+ short flag; /* flags for various things */
+ float threshold;
} MaskModifierData;
/* Mask Modifier -> mode */
@@ -871,7 +872,7 @@ typedef struct ShrinkwrapModifierData {
float keepDist; /* distance offset to keep from mesh/projection point */
short shrinkType; /* shrink type projection */
char shrinkOpts; /* shrink options */
- char pad1;
+ char shrinkMode; /* shrink to surface mode */
float projLimit; /* limit the projection ray cast */
char projAxis; /* axis to project over */
@@ -888,6 +889,21 @@ enum {
MOD_SHRINKWRAP_NEAREST_SURFACE = 0,
MOD_SHRINKWRAP_PROJECT = 1,
MOD_SHRINKWRAP_NEAREST_VERTEX = 2,
+ MOD_SHRINKWRAP_TARGET_PROJECT = 3,
+};
+
+/* Shrinkwrap->shrinkMode */
+enum {
+ /* Move vertex to the surface of the target object (keepDist towards original position) */
+ MOD_SHRINKWRAP_ON_SURFACE = 0,
+ /* Move the vertex inside the target object; don't change if already inside */
+ MOD_SHRINKWRAP_INSIDE = 1,
+ /* Move the vertex outside the target object; don't change if already outside */
+ MOD_SHRINKWRAP_OUTSIDE = 2,
+ /* Move vertex to the surface of the target object, with keepDist towards the outside */
+ MOD_SHRINKWRAP_OUTSIDE_SURFACE = 3,
+ /* Move vertex to the surface of the target object, with keepDist along the normal */
+ MOD_SHRINKWRAP_ABOVE_SURFACE = 4,
};
/* Shrinkwrap->shrinkOpts */
@@ -902,11 +918,16 @@ enum {
/* ignore vertex moves if a vertex ends projected on a back face of the target */
MOD_SHRINKWRAP_CULL_TARGET_BACKFACE = (1 << 4),
+#ifdef DNA_DEPRECATED_ALLOW
MOD_SHRINKWRAP_KEEP_ABOVE_SURFACE = (1 << 5), /* distance is measure to the front face of the target */
+#endif
MOD_SHRINKWRAP_INVERT_VGROUP = (1 << 6),
+ MOD_SHRINKWRAP_INVERT_CULL_TARGET = (1 << 7),
};
+#define MOD_SHRINKWRAP_CULL_TARGET_MASK (MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE | MOD_SHRINKWRAP_CULL_TARGET_BACKFACE)
+
/* Shrinkwrap->projAxis */
enum {
MOD_SHRINKWRAP_PROJECT_OVER_NORMAL = 0, /* projection over normal is used if no axis is selected */
@@ -925,7 +946,7 @@ typedef struct SimpleDeformModifierData {
float limit[2]; /* lower and upper limit */
char mode; /* deform function */
- char axis; /* lock axis (for taper and strech) */
+ char axis; /* lock axis (for taper and stretch) */
char deform_axis; /* axis to perform the deform on (default is X, but can be overridden by origin */
char flag;
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 31a5931dde4..832002d63ee 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -503,7 +503,7 @@ enum {
};
enum {
- CMP_NODEFLAG_MASK_AA = (1 << 0),
+ /* CMP_NODEFLAG_MASK_AA = (1 << 0), */ /* DEPRECATED */
CMP_NODEFLAG_MASK_NO_FEATHER = (1 << 1),
CMP_NODEFLAG_MASK_MOTION_BLUR = (1 << 2),
diff --git a/source/blender/makesdna/DNA_object_enums.h b/source/blender/makesdna/DNA_object_enums.h
index 01228376174..8a7016ccd13 100644
--- a/source/blender/makesdna/DNA_object_enums.h
+++ b/source/blender/makesdna/DNA_object_enums.h
@@ -46,6 +46,8 @@ typedef enum eObjectMode {
/* Any mode where the brush system is used. */
#define OB_MODE_ALL_PAINT (OB_MODE_SCULPT | OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)
+#define OB_MODE_ALL_PAINT_GPENCIL (OB_MODE_GPENCIL_PAINT | OB_MODE_GPENCIL_SCULPT | OB_MODE_GPENCIL_WEIGHT)
+
/* Any mode that uses Object.sculpt. */
#define OB_MODE_ALL_SCULPT (OB_MODE_SCULPT | OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT)
diff --git a/source/blender/makesdna/DNA_object_fluidsim_types.h b/source/blender/makesdna/DNA_object_fluidsim_types.h
index 0b0c1c40ef4..9ddae38edf2 100644
--- a/source/blender/makesdna/DNA_object_fluidsim_types.h
+++ b/source/blender/makesdna/DNA_object_fluidsim_types.h
@@ -102,7 +102,7 @@ typedef struct FluidsimSettings {
/* additional flags depending on the type, lower short contains flags
* to check validity, higher short additional flags */
short typeFlags;
- /* switch off velocity genration, volume init type for fluid/obstacles (volume=1, shell=2, both=3) */
+ /* switch off velocity generation, volume init type for fluid/obstacles (volume=1, shell=2, both=3) */
char domainNovecgen, volumeInitType;
/* boundary "stickiness" for part slip values */
diff --git a/source/blender/makesdna/DNA_object_force_types.h b/source/blender/makesdna/DNA_object_force_types.h
index 3538abcff1a..6e42284f1a4 100644
--- a/source/blender/makesdna/DNA_object_force_types.h
+++ b/source/blender/makesdna/DNA_object_force_types.h
@@ -120,6 +120,9 @@ typedef struct PartDeflect {
float drawvec_falloff_max[3], pad2; /* Runtime only */
struct Object *f_source; /* force source object */
+
+ float pdef_cfrict; /* Friction of cloth collisions. */
+ float pad;
} PartDeflect;
typedef struct EffectorWeights {
@@ -137,8 +140,8 @@ typedef struct EffectorWeights {
/* Point cache file data types:
* - used as (1<<flag) so poke jahka if you reach the limit of 15
* - to add new data types update:
- * * BKE_ptcache_data_size()
- * * ptcache_file_init_pointers()
+ * - BKE_ptcache_data_size()
+ * - ptcache_file_init_pointers()
*/
#define BPHYS_DATA_INDEX 0
#define BPHYS_DATA_LOCATION 1
@@ -337,6 +340,8 @@ typedef struct SoftBody {
#define PFIELD_GUIDE_PATH_WEIGHT (1<<16) /* apply curve weights */
#define PFIELD_SMOKE_DENSITY (1<<17) /* multiply smoke force by density */
#define PFIELD_GRAVITATION (1<<18) /* used for (simple) force */
+#define PFIELD_CLOTH_USE_CULLING (1<<19) /* Enable cloth collision side detection based on normal. */
+#define PFIELD_CLOTH_USE_NORMAL (1<<20) /* Replace collision direction with collider normal. */
/* pd->falloff */
#define PFIELD_FALL_SPHERE 0
@@ -348,6 +353,7 @@ typedef struct SoftBody {
#define PFIELD_SHAPE_PLANE 1
#define PFIELD_SHAPE_SURFACE 2
#define PFIELD_SHAPE_POINTS 3
+#define PFIELD_SHAPE_LINE 4
/* pd->tex_mode */
#define PFIELD_TEX_RGB 0
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index 1f6f7cd9bf2..fca6a8767be 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -58,7 +58,7 @@ struct DerivedMesh;
struct SculptSession;
struct bGPdata;
struct RigidBodyOb;
-
+struct GpencilBatchCache;
/* Vertex Groups - Name Info */
typedef struct bDeformGroup {
@@ -146,6 +146,9 @@ typedef struct Object_Runtime {
/* Runtime evaluated curve-specific data, not stored in the file. */
struct CurveCache *curve_cache;
+
+ /* Runtime grease pencil drawing data */
+ struct GpencilBatchCache *gpencil_cache;
} Object_Runtime;
typedef struct Object {
@@ -216,7 +219,7 @@ typedef struct Object {
*/
float imat_ren[4][4];
- unsigned int lay; /* copy of Base's layer in the scene */
+ unsigned int lay DNA_DEPRECATED; /* copy of Base's layer in the scene */
short flag; /* copy of Base */
short colbits DNA_DEPRECATED; /* deprecated, use 'matbits' */
@@ -292,7 +295,10 @@ typedef struct Object {
struct RigidBodyCon *rigidbody_constraint; /* settings for Bullet constraint */
float ima_ofs[2]; /* offset for image empties */
- ImageUser *iuser; /* must be non-null when oject is an empty image */
+ ImageUser *iuser; /* must be non-null when object is an empty image */
+ char empty_image_visibility_flag;
+ char empty_image_depth;
+ char pad11[6];
ListBase lodlevels; /* contains data for levels of detail */
LodLevel *currentlod;
@@ -593,6 +599,17 @@ enum {
OB_DUPLI_FLAG_RENDER = 1 << 1,
};
+/* ob->empty_image_depth */
+#define OB_EMPTY_IMAGE_DEPTH_DEFAULT 0
+#define OB_EMPTY_IMAGE_DEPTH_FRONT 1
+#define OB_EMPTY_IMAGE_DEPTH_BACK 2
+
+/* ob->empty_image_visibility_flag */
+enum {
+ OB_EMPTY_IMAGE_VISIBLE_PERSPECTIVE = 1 << 0,
+ OB_EMPTY_IMAGE_VISIBLE_ORTHOGRAPHIC = 1 << 1,
+};
+
#define MAX_DUPLI_RECUR 8
#ifdef __cplusplus
diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h
index a7f212a0694..037e9b9c499 100644
--- a/source/blender/makesdna/DNA_particle_types.h
+++ b/source/blender/makesdna/DNA_particle_types.h
@@ -106,15 +106,15 @@ typedef struct ParticleData {
int totkey; /* amount of hair or keyed keys*/
- float time, lifetime; /* dietime is not nescessarily time+lifetime as */
- float dietime; /* particles can die unnaturally (collision) */
+ float time, lifetime; /* dietime is not necessarily time+lifetime as */
+ float dietime; /* particles can die unnaturally (collision). */
/* WARNING! Those two indices, when not affected to vertices, are for !!! TESSELLATED FACES !!!, not POLYGONS! */
int num; /* index to vert/edge/face */
int num_dmcache; /* index to derived mesh data (face) to avoid slow lookups */
float fuv[4], foffset; /* coordinates on face/edge number "num" and depth along*/
- /* face normal for volume emission */
+ /* face normal for volume emission. */
float size; /* size and multiplier so that we can update size when ever */
@@ -367,7 +367,7 @@ typedef enum eParticleDrawFlag {
} eParticleDrawFlag;
/* part->type */
-/* hair is allways baked static in object/geometry space */
+/* hair is always baked static in object/geometry space */
/* other types (normal particles) are in global space and not static baked */
#define PART_EMITTER 0
//#define PART_REACTOR 1
diff --git a/source/blender/makesdna/DNA_rigidbody_types.h b/source/blender/makesdna/DNA_rigidbody_types.h
index 0c9cdfb92dd..631d2758c90 100644
--- a/source/blender/makesdna/DNA_rigidbody_types.h
+++ b/source/blender/makesdna/DNA_rigidbody_types.h
@@ -129,7 +129,7 @@ typedef struct RigidBodyOb {
int is_fractured;
int flag; /* (eRigidBodyOb_Flag) */
- int col_groups; /* Collision groups that determines wich rigid bodies can collide with each other */
+ int col_groups; /* Collision groups that determines which rigid bodies can collide with each other */
short mesh_source; /* (eRigidBody_MeshSource) mesh source for mesh based collision shapes */
short pad;
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 1429e7ce238..1352e28e6c2 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -113,7 +113,7 @@ typedef enum eFFMpegPreset {
/* Used by WEBM/VP9 and h.264 to control encoding speed vs. file size.
* WEBM/VP9 use these values directly, whereas h.264 map those to
* respectively the MEDIUM, SLOWER, and SUPERFAST presets.
- */
+ */
FFM_PRESET_GOOD = 10, /* the default and recommended for most applications */
FFM_PRESET_BEST, /* recommended if you have lots of time and want the best compression efficiency */
FFM_PRESET_REALTIME, /* recommended for live / fast encoding */
@@ -136,6 +136,14 @@ typedef enum eFFMpegCrf {
FFM_CRF_LOWEST = 32,
} eFFMpegCrf;
+typedef enum eFFMpegAudioChannels {
+ FFM_CHANNELS_MONO = 1,
+ FFM_CHANNELS_STEREO = 2,
+ FFM_CHANNELS_SURROUND4 = 4,
+ FFM_CHANNELS_SURROUND51 = 6,
+ FFM_CHANNELS_SURROUND71 = 8,
+} eFFMpegAudioChannels;
+
typedef struct FFMpegCodecData {
int type;
int codec;
@@ -367,8 +375,8 @@ typedef enum eStereo3dInterlaceType {
* this is used for NodeImageFile and IMAGE_OT_save_as operator too.
*
* note: its a bit strange that even though this is an image format struct
- * the imtype can still be used to select video formats.
- * RNA ensures these enum's are only selectable for render output.
+ * the imtype can still be used to select video formats.
+ * RNA ensures these enum's are only selectable for render output.
*/
typedef struct ImageFormatData {
char imtype; /* R_IMF_IMTYPE_PNG, R_... */
@@ -789,9 +797,28 @@ typedef struct TimeMarker {
#define PAINT_MAX_INPUT_SAMPLES 64
+typedef struct Paint_Runtime {
+ /* Avoid having to compare with scene pointer everywhere. */
+ unsigned int tool_offset;
+ unsigned short ob_mode;
+ char _pad[2];
+} Paint_Runtime;
+
+/* We might want to store other things here. */
+typedef struct PaintToolSlot {
+ struct Brush *brush;
+} PaintToolSlot;
+
/* Paint Tool Base */
typedef struct Paint {
struct Brush *brush;
+
+ /* Each tool has it's own active brush,
+ * The currently active tool is defined by the current 'brush'. */
+ struct PaintToolSlot *tool_slots;
+ int tool_slots_len;
+ char _pad1[4];
+
struct Palette *palette;
struct CurveMapping *cavity_curve; /* cavity curve */
@@ -811,6 +838,8 @@ typedef struct Paint {
float tile_offset[3];
int pad2;
+
+ struct Paint_Runtime runtime;
} Paint;
/* ------------------------------------------- */
@@ -948,12 +977,12 @@ typedef enum eGP_EditBrush_Types {
/* add any weight paint brush below this value. Do no mix brushes */
/* !!! Update GP_EditBrush_Data brush[###]; below !!! */
- TOT_GP_EDITBRUSH_TYPES
+ GP_EDITBRUSH_TYPE_MAX,
} eGP_EditBrush_Types;
/* GP_BrushEdit_Settings.lock_axis */
typedef enum eGP_Lockaxis_Types {
- GP_LOCKAXIS_NONE = 0,
+ GP_LOCKAXIS_VIEW = 0,
GP_LOCKAXIS_X = 1,
GP_LOCKAXIS_Y = 2,
GP_LOCKAXIS_Z = 3
@@ -978,19 +1007,22 @@ typedef enum eGP_EditBrush_Flag {
/* strength of brush falls off with distance from cursor */
GP_EDITBRUSH_FLAG_USE_FALLOFF = (1 << 2),
+ /* XXX: currently unused. */
/* smooth brush affects pressure values as well */
GP_EDITBRUSH_FLAG_SMOOTH_PRESSURE = (1 << 3),
/* enable screen cursor */
GP_EDITBRUSH_FLAG_ENABLE_CURSOR = (1 << 4),
/* temporary invert action */
GP_EDITBRUSH_FLAG_TMP_INVERT = (1 << 5),
+ /* adjust radius using pen pressure */
+ GP_EDITBRUSH_FLAG_PRESSURE_RADIUS = (1 << 6),
} eGP_EditBrush_Flag;
/* GPencil Stroke Sculpting Settings */
typedef struct GP_BrushEdit_Settings {
- GP_EditBrush_Data brush[12]; /* TOT_GP_EDITBRUSH_TYPES */
+ GP_EditBrush_Data brush[12]; /* GP_EDITBRUSH_TYPE_MAX */
void *paintcursor; /* runtime */
int brushtype; /* eGP_EditBrush_Types (sculpt) */
@@ -1109,9 +1141,9 @@ typedef struct UnifiedPaintSettings {
float brush_rotation;
float brush_rotation_sec;
- /*********************************************************************************
- * all data below are used to communicate with cursor drawing and tex sampling *
- *********************************************************************************/
+ /*******************************************************************************
+ * all data below are used to communicate with cursor drawing and tex sampling *
+ *******************************************************************************/
int anchored_size;
float overlap_factor; /* normalization factor due to accumulated value of curve along spacing.
@@ -1276,7 +1308,7 @@ typedef struct ToolSettings {
char annotate_v3d_align; /* stroke placement settings - 3D View */
short annotate_thickness; /* default stroke thickness for annotation strokes */
- char _pad3[2];
+ short gpencil_selectmode; /* stroke selection mode */
/* Grease Pencil Sculpt */
struct GP_BrushEdit_Settings gp_sculpt;
@@ -1376,6 +1408,12 @@ typedef struct UnitSettings {
char system; /* imperial, metric etc */
char system_rotation; /* not implemented as a proper unit system yet */
short flag;
+
+ char length_unit;
+ char mass_unit;
+ char time_unit;
+
+ char pad[5];
} UnitSettings;
/* ------------------------------------------- */
@@ -1468,6 +1506,9 @@ typedef struct SceneEEVEE {
struct LightCache *light_cache;
char light_cache_info[64];
+
+ float overscan;
+ float pad;
} SceneEEVEE;
/* *************************************************************** */
@@ -1488,9 +1529,9 @@ typedef struct Scene {
View3DCursor cursor; /* 3d cursor location */
- unsigned int lay; /* bitflags for layer visibility */
- int layact; /* active layer */
- unsigned int lay_updated; /* runtime flag, has layer ever been updated since load? */
+ unsigned int lay DNA_DEPRECATED; /* bitflags for layer visibility */
+ int layact DNA_DEPRECATED; /* active layer */
+ unsigned int pad1;
short flag; /* various settings */
@@ -2054,11 +2095,9 @@ typedef enum eImagePaintMode {
/* ToolSettings.gizmo_flag */
enum {
- SCE_MANIP_TRANSLATE = (1 << 0),
- SCE_MANIP_ROTATE = (1 << 1),
- SCE_MANIP_SCALE = (1 << 2),
-
- SCE_MANIP_DISABLE_APRON = (1 << 3),
+ SCE_GIZMO_SHOW_TRANSLATE = (1 << 0),
+ SCE_GIZMO_SHOW_ROTATE = (1 << 1),
+ SCE_GIZMO_SHOW_SCALE = (1 << 2),
};
/* ToolSettings.gpencil_flags */
@@ -2104,8 +2143,15 @@ typedef enum eGPencil_Placement_Flags {
/* "Use Endpoints" */
GP_PROJECT_DEPTH_STROKE_ENDPOINTS = (1 << 4),
GP_PROJECT_CURSOR = (1 << 5),
+ GP_PROJECT_DEPTH_STROKE_FIRST = (1 << 6),
} eGPencil_Placement_Flags;
+/* ToolSettings.gpencil_selectmode */
+typedef enum eGPencil_Selectmode_types {
+ GP_SELECTMODE_POINT = 0,
+ GP_SELECTMODE_STROKE = 1
+} eGPencil_Selectmode_types;
+
/* ToolSettings.particle flag */
#define PE_KEEP_LENGTHS 1
#define PE_LOCK_FIRST 2
@@ -2139,6 +2185,7 @@ typedef enum eGPencil_Placement_Flags {
/* UnitSettings */
+#define USER_UNIT_ADAPTIVE 0xFF
/* UnitSettings.system */
#define USER_UNIT_NONE 0
#define USER_UNIT_METRIC 1
@@ -2169,6 +2216,8 @@ enum {
SCE_EEVEE_SHOW_IRRADIANCE = (1 << 17),
SCE_EEVEE_SHOW_CUBEMAPS = (1 << 18),
SCE_EEVEE_GI_AUTOBAKE = (1 << 19),
+ SCE_EEVEE_SHADOW_SOFT = (1 << 20),
+ SCE_EEVEE_OVERSCAN = (1 << 21),
};
/* SceneEEVEE->shadow_method */
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index e17c7e17450..99404fbf057 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -420,6 +420,7 @@ enum {
/* paneltype flag */
#define PNL_DEFAULT_CLOSED 1
#define PNL_NO_HEADER 2
+#define PNL_LAYOUT_VERT_BAR 4
/* Fallback panel category (only for old scripts which need updating) */
#define PNL_CATEGORY_FALLBACK "Misc"
@@ -455,6 +456,7 @@ enum {
/* uiList filter orderby type */
enum {
UILST_FLT_SORT_ALPHA = 1 << 0,
+ UILST_FLT_FORCED_REVERSE = 1 << 1, /* Special flag to indicate reverse was set by external parameter */
UILST_FLT_SORT_REVERSE = 1u << 31 /* Special value, bitflag used to reverse order! */
};
@@ -472,10 +474,15 @@ enum {
RGN_TYPE_TOOL_PROPS = 6,
RGN_TYPE_PREVIEW = 7,
RGN_TYPE_HUD = 8,
+ /* Region to navigate the main region from (RGN_TYPE_WINDOW). */
+ RGN_TYPE_NAV_BAR = 9,
};
/* use for function args */
#define RGN_TYPE_ANY -1
+/* Region supports panel tabs (categories). */
+#define RGN_TYPE_HAS_CATEGORY_MASK (1 << RGN_TYPE_UI)
+
/* region alignment */
#define RGN_ALIGN_NONE 0
#define RGN_ALIGN_TOP 1
@@ -499,6 +506,8 @@ enum {
RGN_FLAG_DYNAMIC_SIZE = (1 << 2),
/* Region data is NULL'd on read, never written. */
RGN_FLAG_TEMP_REGIONDATA = (1 << 3),
+ /* The region must either use its prefsizex/y or be hidden. */
+ RGN_FLAG_PREFSIZE_OR_HIDDEN = (1 << 4),
};
/* region do_draw */
diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h
index ef076c98b5f..6e2fd412445 100644
--- a/source/blender/makesdna/DNA_sequence_types.h
+++ b/source/blender/makesdna/DNA_sequence_types.h
@@ -126,7 +126,7 @@ typedef struct Strip {
* each of the strips uses a different sequence structure.
*
* \warning The first part identical to ID (for use in ipo's)
- * the commend above is historic, probably we can drop the ID compatibility,
+ * the comment above is historic, probably we can drop the ID compatibility,
* but take care making this change.
*
* \warning This is really a 'Strip' in the UI!, name is highly confusing.
diff --git a/source/blender/makesdna/DNA_shader_fx_types.h b/source/blender/makesdna/DNA_shader_fx_types.h
index f3c9f06c8dc..7c138f21887 100644
--- a/source/blender/makesdna/DNA_shader_fx_types.h
+++ b/source/blender/makesdna/DNA_shader_fx_types.h
@@ -44,6 +44,8 @@ typedef enum ShaderFxType {
eShaderFxType_Wave = 6,
eShaderFxType_Rim = 7,
eShaderFxType_Colorize = 8,
+ eShaderFxType_Shadow = 9,
+ eShaderFxType_Glow = 10,
NUM_SHADER_FX_TYPES
} ShaderFxType;
@@ -72,11 +74,11 @@ typedef struct ShaderFxData {
} ShaderFxData;
/* Runtime temp data */
-typedef struct ShaderFxData_runtime {
+typedef struct ShaderFxData_Runtime {
struct DRWShadingGroup *fx_sh;
struct DRWShadingGroup *fx_sh_b;
struct DRWShadingGroup *fx_sh_c;
-} ShaderFxData_runtime;
+} ShaderFxData_Runtime;
typedef struct BlurShaderFxData {
ShaderFxData shaderfx;
@@ -86,7 +88,8 @@ typedef struct BlurShaderFxData {
float coc; /* circle of confusion */
int blur[2]; /* not visible in rna */
char pad[4];
- ShaderFxData_runtime runtime;
+
+ ShaderFxData_Runtime runtime;
} BlurShaderFxData;
typedef enum eBlurShaderFx_Flag {
@@ -101,7 +104,8 @@ typedef struct ColorizeShaderFxData {
float factor;
int flag; /* flags */
char pad[4];
- ShaderFxData_runtime runtime;
+
+ ShaderFxData_Runtime runtime;
} ColorizeShaderFxData;
typedef enum ColorizeShaderFxModes {
@@ -116,7 +120,7 @@ typedef struct FlipShaderFxData {
ShaderFxData shaderfx;
int flag; /* flags */
int flipmode; /* internal, not visible in rna */
- ShaderFxData_runtime runtime;
+ ShaderFxData_Runtime runtime;
} FlipShaderFxData;
typedef enum eFlipShaderFx_Flag {
@@ -124,6 +128,27 @@ typedef enum eFlipShaderFx_Flag {
FX_FLIP_VERTICAL = (1 << 1),
} eFlipShaderFx_Flag;
+typedef struct GlowShaderFxData {
+ ShaderFxData shaderfx;
+ float glow_color[3];
+ float select_color[3];
+ float threshold;
+ int flag; /* flags */
+ int mode;
+ int blur[2];
+ int samples;
+ ShaderFxData_Runtime runtime;
+} GlowShaderFxData;
+
+typedef enum GlowShaderFxModes {
+ eShaderFxGlowMode_Luminance = 0,
+ eShaderFxGlowMode_Color = 1,
+} GlowShaderFxModes;
+
+typedef enum eGlowShaderFx_Flag {
+ FX_GLOW_USE_ALPHA = (1 << 0),
+} eGlowShaderFx_Flag;
+
typedef struct LightShaderFxData {
ShaderFxData shaderfx;
struct Object *object;
@@ -132,7 +157,7 @@ typedef struct LightShaderFxData {
float ambient;
float loc[4]; /* internal, not visible in rna */
char pad[4];
- ShaderFxData_runtime runtime;
+ ShaderFxData_Runtime runtime;
} LightShaderFxData;
typedef struct PixelShaderFxData {
@@ -140,7 +165,7 @@ typedef struct PixelShaderFxData {
int size[3]; /* last element used for shader only */
int flag; /* flags */
float rgba[4];
- ShaderFxData_runtime runtime;
+ ShaderFxData_Runtime runtime;
} PixelShaderFxData;
typedef enum ePixelShaderFx_Flag {
@@ -157,7 +182,7 @@ typedef struct RimShaderFxData {
int blur[2];
int samples;
char pad[4];
- ShaderFxData_runtime runtime;
+ ShaderFxData_Runtime runtime;
} RimShaderFxData;
typedef enum RimShaderFxModes {
@@ -169,6 +194,29 @@ typedef enum RimShaderFxModes {
eShaderFxRimMode_Divide = 5,
} RimShaderFxModes;
+typedef struct ShadowShaderFxData {
+ ShaderFxData shaderfx;
+ struct Object *object;
+ int offset[2];
+ int flag; /* flags */
+ float shadow_rgba[4];
+ float amplitude;
+ float period;
+ float phase;
+ int orientation;
+ float scale[2];
+ float rotation;
+ int blur[2];
+ int samples;
+ char pad[4];
+ ShaderFxData_Runtime runtime;
+} ShadowShaderFxData;
+
+typedef enum eShadowShaderFx_Flag {
+ FX_SHADOW_USE_OBJECT = (1 << 0),
+ FX_SHADOW_USE_WAVE = (1 << 1),
+} eShadowShaderFx_Flag;
+
typedef struct SwirlShaderFxData {
ShaderFxData shaderfx;
struct Object *object;
@@ -176,7 +224,7 @@ typedef struct SwirlShaderFxData {
int radius;
float angle;
int transparent; /* not visible in rna */
- ShaderFxData_runtime runtime;
+ ShaderFxData_Runtime runtime;
} SwirlShaderFxData;
typedef enum eSwirlShaderFx_Flag {
@@ -191,6 +239,6 @@ typedef struct WaveShaderFxData {
int orientation;
int flag; /* flags */
char pad[4];
- ShaderFxData_runtime runtime;
+ ShaderFxData_Runtime runtime;
} WaveShaderFxData;
#endif /* __DNA_SHADER_FX_TYPES_H__ */
diff --git a/source/blender/makesdna/DNA_smoke_types.h b/source/blender/makesdna/DNA_smoke_types.h
index 443c6923ed0..97913e29ad4 100644
--- a/source/blender/makesdna/DNA_smoke_types.h
+++ b/source/blender/makesdna/DNA_smoke_types.h
@@ -72,6 +72,12 @@ enum {
SLICE_AXIS_Z = 3,
};
+/* axis aligned method */
+enum {
+ VOLUME_INTERP_LINEAR = 0,
+ VOLUME_INTERP_CUBIC = 1,
+};
+
enum {
VECTOR_DRAW_NEEDLE = 0,
VECTOR_DRAW_STREAMLINE = 1,
@@ -113,7 +119,7 @@ enum {
#define SM_HRES_LINEAR 1
#define SM_HRES_FULLSAMPLE 2
-/* smoke data fileds (active_fields) */
+/* smoke data fields (active_fields) */
#define SM_ACTIVE_HEAT (1<<0)
#define SM_ACTIVE_FIRE (1<<1)
#define SM_ACTIVE_COLORS (1<<2)
@@ -137,6 +143,9 @@ typedef struct SmokeDomainSettings {
struct GPUTexture *tex_wt;
struct GPUTexture *tex_shadow;
struct GPUTexture *tex_flame;
+ struct GPUTexture *tex_flame_coba;
+ struct GPUTexture *tex_coba;
+ struct GPUTexture *tex_field;
struct GPUTexture *tex_velocity_x;
struct GPUTexture *tex_velocity_y;
struct GPUTexture *tex_velocity_z;
@@ -219,7 +228,7 @@ typedef struct SmokeDomainSettings {
char vector_draw_type;
char use_coba;
char coba_field; /* simulation field used for the color mapping */
- char pad2;
+ char interp_method;
float clipping;
float pad3;
@@ -250,7 +259,7 @@ typedef struct SmokeDomainSettings {
typedef struct SmokeFlowSettings {
struct SmokeModifierData *smd; /* for fast RNA access */
- struct DerivedMesh *dm;
+ struct Mesh *mesh;
struct ParticleSystem *psys;
struct Tex *noise_texture;
@@ -290,7 +299,7 @@ typedef struct SmokeFlowSettings {
/* collision objects (filled with smoke) */
typedef struct SmokeCollSettings {
struct SmokeModifierData *smd; /* for fast RNA access */
- struct DerivedMesh *dm;
+ struct Mesh *mesh;
float *verts_old;
int numverts;
short type; // static = 0, rigid = 1, dynamic = 2
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index f38669a757a..43781c47828 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -198,6 +198,7 @@ typedef enum eSpaceButtons_Context {
BCONTEXT_VIEW_LAYER = 13,
BCONTEXT_TOOL = 14,
BCONTEXT_SHADERFX = 15,
+ BCONTEXT_OUTPUT = 16,
/* always as last... */
BCONTEXT_TOT
@@ -453,7 +454,7 @@ typedef struct SpaceNla {
/* SpaceNla.flag */
typedef enum eSpaceNla_Flag {
- /* flags (1<<0), (1<<1), and (1<<3) are deprecated flags from old verisons */
+ /* flags (1<<0), (1<<1), and (1<<3) are deprecated flags from old versions */
/* draw timing in seconds instead of frames */
SNLA_DRAWTIME = (1 << 2),
@@ -917,8 +918,7 @@ typedef struct SpaceImage {
char dt_uvstretch;
char around;
- /* Filter settings when editor shows other object's UVs. */
- int other_uv_filter;
+ int pad2;
int flag;
@@ -944,7 +944,8 @@ typedef enum eSpaceImage_UVDT_Stretch {
typedef enum eSpaceImage_Mode {
SI_MODE_VIEW = 0,
SI_MODE_PAINT = 1,
- SI_MODE_MASK = 2 /* note: mesh edit mode overrides mask */
+ SI_MODE_MASK = 2,
+ SI_MODE_UV = 3,
} eSpaceImage_Mode;
/* SpaceImage.sticky
@@ -988,7 +989,7 @@ typedef enum eSpaceImage_Flag {
SI_SMOOTH_UV = (1 << 20),
SI_DRAW_STRETCH = (1 << 21),
SI_SHOW_GPENCIL = (1 << 22),
- SI_DRAW_OTHER = (1 << 23),
+/* SI_DEPRECATED6 = (1 << 23), */ /* deprecated */
SI_COLOR_CORRECTION = (1 << 24),
@@ -998,6 +999,8 @@ typedef enum eSpaceImage_Flag {
SI_SHOW_R = (1 << 27),
SI_SHOW_G = (1 << 28),
SI_SHOW_B = (1 << 29),
+
+ SI_NO_DRAWEDGES = (1 << 30),
} eSpaceImage_Flag;
/* SpaceImage.other_uv_filter */
diff --git a/source/blender/makesdna/DNA_tracking_types.h b/source/blender/makesdna/DNA_tracking_types.h
index 42b72c1ff93..bfd9edceab4 100644
--- a/source/blender/makesdna/DNA_tracking_types.h
+++ b/source/blender/makesdna/DNA_tracking_types.h
@@ -108,7 +108,7 @@ typedef struct MovieTrackingTrack {
char name[64]; /* MAX_NAME */
- /* ** setings ** */
+ /* ** settings ** */
/* positions of left-bottom and right-top corners of pattern (in unified 0..1 units,
* relative to marker->pos)
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 362a9232553..512481a75b5 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -64,7 +64,7 @@ typedef enum eUIFont_ID {
UIFONT_CUSTOM2 = 3
} eUIFont_ID;
-/* default fonts to load/initalize */
+/* default fonts to load/initialize */
/* first font is the default (index 0), others optional */
typedef struct uiFont {
struct uiFont *next, *prev;
@@ -133,11 +133,10 @@ typedef struct uiWidgetColors {
char item[4];
char text[4];
char text_sel[4];
- short shaded;
+ char shaded;
+ char _pad0[7];
short shadetop, shadedown;
- short alpha_check;
float roundness;
- float pad;
} uiWidgetColors;
typedef struct uiWidgetStateColors {
@@ -176,7 +175,7 @@ typedef struct ThemeUI {
uiWidgetStateColors wcol_state;
- uiPanelColors panel; /* depricated, but we keep it for do_versions (2.66.1) */
+ uiPanelColors panel; /* deprecated, but we keep it for do_versions (2.66.1) */
char widget_emboss[4];
@@ -201,7 +200,13 @@ typedef struct ThemeUI {
char gizmo_secondary[4];
char gizmo_a[4];
char gizmo_b[4];
- char pad2[4];
+
+ /* Icon Colors. */
+ char icon_collection[4]; /* Collection items */
+ char icon_object[4]; /* Object items */
+ char icon_object_data[4]; /* Object data items */
+ char icon_modifier[4]; /* Modifier and constraint items */
+ char icon_shading[4]; /* Shading related items */
} ThemeUI;
/* try to put them all in one, if needed a special struct can be created as well
@@ -238,6 +243,10 @@ typedef struct ThemeSpace {
char list_text[4];
char list_text_hi[4];
+ /* navigation bar regions */
+ char navigation_bar[4]; /* region background */
+ int pad2;
+
/* float panel */
/* char panel[4]; unused */
/* char panel_title[4]; unused */
@@ -281,10 +290,11 @@ typedef struct ThemeSpace {
char handle_free[4], handle_auto[4], handle_vect[4], handle_align[4], handle_auto_clamped[4];
char handle_sel_free[4], handle_sel_auto[4], handle_sel_vect[4], handle_sel_align[4], handle_sel_auto_clamped[4];
- char ds_channel[4], ds_subchannel[4]; /* dopesheet */
- char keytype_keyframe[4], keytype_extreme[4], keytype_breakdown[4], keytype_jitter[4]; /* keytypes */
- char keytype_keyframe_select[4], keytype_extreme_select[4], keytype_breakdown_select[4], keytype_jitter_select[4]; /* keytypes */
+ char ds_channel[4], ds_subchannel[4], ds_ipoline[4]; /* dopesheet */
+ char keytype_keyframe[4], keytype_extreme[4], keytype_breakdown[4], keytype_jitter[4], keytype_movehold[4]; /* keytypes */
+ char keytype_keyframe_select[4], keytype_extreme_select[4], keytype_breakdown_select[4], keytype_jitter_select[4], keytype_movehold_select[4]; /* keytypes */
char keyborder[4], keyborder_select[4];
+ char pad[4];
char console_output[4], console_input[4], console_info[4], console_error[4];
char console_cursor[4], console_select[4];
@@ -345,6 +355,8 @@ typedef struct ThemeSpace {
/* NLA */
char anim_active[4]; /* Active Action + Summary Channel */
char anim_non_active[4]; /* Active Action = NULL */
+ char anim_preview_range[4]; /* Preview range overlay */
+ char anim_pad[4];
char nla_tweaking[4]; /* NLA 'Tweaking' action/strip */
char nla_tweakdupli[4]; /* NLA - warning color for duplicate instances of tweaking strip */
@@ -584,7 +596,7 @@ typedef struct UserDef {
short rvisize; /* rotating view icon size */
short rvibright; /* rotating view icon brightness */
short recent_files; /* maximum number of recently used files to remember */
- short smooth_viewtx; /* miliseconds to spend spinning the view */
+ short smooth_viewtx; /* milliseconds to spend spinning the view */
short glreslimit;
short curssize;
short color_picker_type; /* eColorPicker_Types */
@@ -742,7 +754,7 @@ typedef enum eUserpref_UI_Flag {
USER_PLAINMENUS = (1 << 5),
USER_LOCK_CURSOR_ADJUST = (1 << 6),
/* Avoid accidentally adjusting the layout
- * (exact behavior may change based on whats considered reasonable to lock down). */
+ * (exact behavior may change based on what's considered reasonable to lock down). */
USER_UIFLAG_DEPRECATED_7 = (1 << 7),
USER_ALLWINCODECS = (1 << 8),
USER_MENUOPENAUTO = (1 << 9),
@@ -815,6 +827,7 @@ typedef enum eAutokey_Flag {
/* toolsettings->autokey_flag */
AUTOKEY_FLAG_ONLYKEYINGSET = (1 << 6),
AUTOKEY_FLAG_NOWARNING = (1 << 7),
+ AUTOKEY_FLAG_CYCLEAWARE = (1 << 8),
ANIMRECORD_FLAG_WITHNLA = (1 << 10),
} eAutokey_Flag;
@@ -876,8 +889,8 @@ typedef enum eText_Draw_Options {
/* Grease Pencil Settings.
* UserDef.gp_settings */
typedef enum eGP_UserdefSettings {
- GP_PAINT_DOSMOOTH = (1 << 0),
- GP_PAINT_DOSIMPLIFY = (1 << 1),
+ GP_PAINT_DOSMOOTH = (1 << 0),
+ GP_PAINT_DOSIMPLIFY = (1 << 1),
} eGP_UserdefSettings;
enum {
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index 65b6192b9c8..6796c9d4d00 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -133,7 +133,7 @@ typedef struct View3DCursor {
char _pad[4];
} View3DCursor;
-/* 3D Viewport Shading setings */
+/* 3D Viewport Shading settings */
typedef struct View3DShading {
short type; /* Shading type (VIEW3D_SHADE_SOLID, ..) */
short prev_type; /* Runtime, for toggle between rendered viewport. */
@@ -156,16 +156,16 @@ typedef struct View3DShading {
float object_outline_color[3];
float xray_alpha;
+ float xray_alpha_wire;
float cavity_valley_factor;
float cavity_ridge_factor;
float background_color[3];
- int pad;
} View3DShading;
-/* 3D Viewport Overlay setings */
+/* 3D Viewport Overlay settings */
typedef struct View3DOverlay {
int flag;
@@ -177,6 +177,10 @@ typedef struct View3DOverlay {
/* Paint mode settings */
int paint_flag;
+ /* Weight paint mode settings */
+ int wpaint_flag;
+ char _pad2[4];
+
/* Alpha for texture, weight, vertex paint overlay */
float texture_paint_mode_opacity;
float vertex_paint_mode_opacity;
@@ -188,15 +192,11 @@ typedef struct View3DOverlay {
/* Other settings */
float wireframe_threshold;
- char _pad0[4];
- /* grease pencil setttings */
- float gpencil_grid_scale;
+ /* grease pencil settings */
float gpencil_paper_opacity;
- int gpencil_grid_lines;
- int gpencil_grid_axis;
float gpencil_grid_opacity;
- char _pad1[4];
+ float gpencil_fade_layer;
} View3DOverlay;
@@ -216,8 +216,8 @@ typedef struct View3D {
char bundle_drawtype; /* display style for bundle */
char pad[3];
- unsigned int lay_prev; /* for active layer toggle */
- unsigned int lay_used; /* used while drawing */
+ unsigned int lay_prev DNA_DEPRECATED; /* for active layer toggle */
+ unsigned int lay_used DNA_DEPRECATED; /* used while drawing */
int object_type_exclude_viewport;
int object_type_exclude_select;
@@ -232,8 +232,8 @@ typedef struct View3D {
char ob_centre_bone[64]; /* optional string for armature bone to define center, MAXBONENAME */
- unsigned int lay;
- int layact;
+ unsigned int lay DNA_DEPRECATED;
+ int layact DNA_DEPRECATED;
short ob_centre_cursor; /* optional bool for 3d cursor to define center */
short scenelock;
@@ -308,7 +308,7 @@ typedef struct View3D {
/* #define V3D_FLAG_DEPRECATED_10 (1 << 10) */ /* UNUSED */
#define V3D_SELECT_OUTLINE 2048
-#define V3D_ZBUF_SELECT 4096
+#define V3D_ZBUF_SELECT 4096 /* XXX: DNA deprecated */
#define V3D_GLOBAL_STATS 8192
#define V3D_DRAW_CENTERS 32768
@@ -361,7 +361,7 @@ typedef struct View3D {
#define V3D_RENDER_BORDER (1 << 11)
#define V3D_SOLID_MATCAP (1 << 12) /* user flag */
#define V3D_SHOW_SOLID_MATCAP (1 << 13) /* runtime flag */
-#define V3D_OCCLUDE_WIRE (1 << 14)
+#define V3D_OCCLUDE_WIRE (1 << 14) /* XXX: DNA deprecated */
#define V3D_SHOW_MODE_SHADE_OVERRIDE (1 << 15) /* XXX: DNA deprecated */
/* View3d->gp_flag (short) */
@@ -370,6 +370,7 @@ typedef struct View3D {
#define V3D_GP_SHOW_EDIT_LINES (1 << 2)
#define V3D_GP_SHOW_MULTIEDIT_LINES (1 << 3)
#define V3D_GP_SHOW_ONION_SKIN (1 << 4) /* main switch at view level */
+#define V3D_GP_FADE_NOACTIVE_LAYERS (1 << 5) /* fade layers not active */
/* View3DShading->light */
enum {
@@ -388,6 +389,7 @@ enum {
V3D_SHADING_CAVITY = (1 << 5),
V3D_SHADING_MATCAP_FLIP_X = (1 << 6),
V3D_SHADING_SCENE_WORLD = (1 << 7),
+ V3D_SHADING_XRAY_WIREFRAME = (1 << 8),
};
/* View3DShading->color_type */
@@ -429,6 +431,28 @@ enum {
V3D_OVERLAY_EDIT_OCCLUDE_WIRE = (1 << 3),
V3D_OVERLAY_EDIT_WEIGHT = (1 << 4),
+
+ V3D_OVERLAY_EDIT_EDGES = (1 << 5),
+ V3D_OVERLAY_EDIT_FACES = (1 << 6),
+ V3D_OVERLAY_EDIT_FACE_DOT = (1 << 7),
+
+ V3D_OVERLAY_EDIT_SEAMS = (1 << 8),
+ V3D_OVERLAY_EDIT_SHARP = (1 << 9),
+ V3D_OVERLAY_EDIT_CREASES = (1 << 10),
+ V3D_OVERLAY_EDIT_BWEIGHTS = (1 << 11),
+
+ V3D_OVERLAY_EDIT_FREESTYLE_EDGE = (1 << 12),
+ V3D_OVERLAY_EDIT_FREESTYLE_FACE = (1 << 13),
+
+ V3D_OVERLAY_EDIT_STATVIS = (1 << 14),
+ V3D_OVERLAY_EDIT_EDGE_LEN = (1 << 15),
+ V3D_OVERLAY_EDIT_EDGE_ANG = (1 << 16),
+ V3D_OVERLAY_EDIT_FACE_ANG = (1 << 17),
+ V3D_OVERLAY_EDIT_FACE_AREA = (1 << 18),
+ V3D_OVERLAY_EDIT_INDICES = (1 << 19),
+
+ V3D_OVERLAY_EDIT_CU_HANDLES = (1 << 20),
+ V3D_OVERLAY_EDIT_CU_NORMALS = (1 << 21),
};
/* View3DOverlay->arm_flag */
@@ -441,6 +465,11 @@ enum {
V3D_OVERLAY_PAINT_WIRE = (1 << 0),
};
+/* View3DOverlay->wpaint_flag */
+enum {
+ V3D_OVERLAY_WPAINT_CONTOURS = (1 << 0),
+};
+
/* View3D->around */
enum {
/* center of the bounding box */
@@ -478,6 +507,7 @@ enum {
#define V3D_MANIP_VIEW 3
#define V3D_MANIP_GIMBAL 4
#define V3D_MANIP_CURSOR 5
+#define V3D_MANIP_CUSTOM_MATRIX (V3D_MANIP_CUSTOM - 1) /* Runtime only, never saved to DNA. */
#define V3D_MANIP_CUSTOM 1024
/* View3d.mpr_flag (also) */
@@ -496,12 +526,4 @@ enum {
#define RV3D_CAMZOOM_MIN_FACTOR 0.1657359312880714853f
#define RV3D_CAMZOOM_MAX_FACTOR 44.9852813742385702928f
-/* View3d.gpencil_grid_axis */
-enum {
- V3D_GP_GRID_AXIS_LOCK = (1 << 0),
- V3D_GP_GRID_AXIS_X = (1 << 1),
- V3D_GP_GRID_AXIS_Y = (1 << 2),
- V3D_GP_GRID_AXIS_Z = (1 << 3),
-};
-
#endif
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index 25d9e50ff7a..abd35a3cc73 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -118,8 +118,7 @@ typedef struct ReportList {
#
#
typedef struct ReportTimerInfo {
- float col[3];
- float grayscale;
+ float col[4];
float widthfac;
} ReportTimerInfo;
@@ -179,7 +178,7 @@ enum {
# endif
#endif
-/* the savable part, rest of data is local in ghostwinlay */
+/* the saveable part, rest of data is local in ghostwinlay */
typedef struct wmWindow {
struct wmWindow *next, *prev;
diff --git a/source/blender/makesdna/DNA_workspace_types.h b/source/blender/makesdna/DNA_workspace_types.h
index fd56c246c96..3ad5071fdf2 100644
--- a/source/blender/makesdna/DNA_workspace_types.h
+++ b/source/blender/makesdna/DNA_workspace_types.h
@@ -64,7 +64,7 @@ typedef struct bToolRef_Runtime {
char data_block[64];
/** Use to infer primary operator to use when setting accelerator keys. */
- char operator[64];
+ char op[64];
/** Index when a tool is a member of a group. */
int index;
@@ -111,7 +111,7 @@ typedef struct bToolRef {
typedef struct WorkSpaceLayout {
struct WorkSpaceLayout *next, *prev;
- struct bScreen *screen DNA_PRIVATE_WORKSPACE;
+ struct bScreen *screen;
/* The name of this layout, we override the RNA name of the screen with this (but not ID name itself) */
char name[64] DNA_PRIVATE_WORKSPACE; /* MAX_NAME */
} WorkSpaceLayout;
@@ -144,12 +144,15 @@ typedef struct WorkSpace {
char tools_space_type;
/** Type is different for each space-type. */
char tools_mode;
- char _pad[6];
+ char _pad[2];
int object_mode;
int flags DNA_PRIVATE_WORKSPACE; /* enum eWorkSpaceFlags */
+ /* Number for workspace tab reordering in the UI. */
+ int order;
+
/* Info text from modal operators (runtime). */
char *status_text;
} WorkSpace;
@@ -192,7 +195,7 @@ typedef struct WorkSpaceDataRelation {
#endif /* DNA_PRIVATE_WORKSPACE_READ_WRITE */
/**
- * Little wrapper to store data that is going to be per window, but comming from the workspace.
+ * Little wrapper to store data that is going to be per window, but coming from the workspace.
* It allows us to keep workspace and window data completely separate.
*/
typedef struct WorkSpaceInstanceHook {
diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c
index cf059c08cd5..2881f3138b2 100644
--- a/source/blender/makesdna/intern/dna_genfile.c
+++ b/source/blender/makesdna/intern/dna_genfile.c
@@ -102,7 +102,7 @@
*
* ALLOWED AND TESTED CHANGES IN STRUCTS:
* - type change (a char to float will be divided by 255)
- * - location within a struct (everthing can be randomly mixed up)
+ * - location within a struct (everything can be randomly mixed up)
* - struct within struct (within struct etc), this is recursive
* - adding new elements, will be default initialized zero
* - removing elements
@@ -271,7 +271,7 @@ int DNA_struct_find_nr_ex(const SDNA *sdna, const char *str, unsigned int *index
index_p = BLI_ghash_lookup_p(sdna->structs_map, str);
if (index_p) {
- a = GET_INT_FROM_POINTER(*index_p);
+ a = POINTER_AS_INT(*index_p);
*index_last = a;
}
else {
@@ -583,7 +583,7 @@ static bool init_structDNA(
for (intptr_t nr = 0; nr < sdna->nr_structs; nr++) {
sp = sdna->structs[nr];
- BLI_ghash_insert(sdna->structs_map, (void *)sdna->types[sp[0]], SET_INT_IN_POINTER(nr));
+ BLI_ghash_insert(sdna->structs_map, (void *)sdna->types[sp[0]], POINTER_FROM_INT(nr));
}
}
#endif
@@ -984,7 +984,7 @@ static int elem_strcmp(const char *name, const char *oname)
* \param type Current field type name
* \param name Current field name
* \param old Pointer to struct information in sdna
- * \return true when existsing, false otherwise.
+ * \return true when existing, false otherwise.
*/
static bool elem_exists(
const SDNA *sdna,
@@ -1342,7 +1342,7 @@ void DNA_struct_switch_endian(const SDNA *oldsdna, int oldSDNAnr, char *data)
else if (ELEM(spc[0], SDNA_TYPE_INT, SDNA_TYPE_FLOAT)) {
/* note, intentionally ignore long/ulong here these could be 4 or 8 bits,
* but turns out we only used for runtime vars and
- * only once for a struct type thats no longer used. */
+ * only once for a struct type that's no longer used. */
BLI_endian_switch_int32_array((int32_t *)cur, DNA_elem_array_size(name));
}
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index e4f825e31dd..3810ef9a12f 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -998,7 +998,7 @@ static int make_structDNA(const char *baseDirectory, FILE *file, FILE *file_offs
printf("Running makesdna at debug level %d\n", debugSDNA);
}
- /* the longest known struct is 50k, so we assume 100k is sufficent! */
+ /* the longest known struct is 50k, so we assume 100k is sufficient! */
namedata = MEM_callocN(maxdata, "namedata");
typedata = MEM_callocN(maxdata, "typedata");
structdata = MEM_callocN(maxdata, "structdata");
@@ -1272,7 +1272,7 @@ int main(int argc, char **argv)
return(return_status);
}
-/* handy but fails on struct bounds which makesdna doesnt care about
+/* handy but fails on struct bounds which makesdna doesn't care about
* with quite the same strictness as GCC does */
#if 0
/* include files for automatic dependencies */
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index d1be0243338..b9741348be5 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -48,8 +48,9 @@ struct ReportList;
struct Scene;
/* Types */
-
extern BlenderRNA BLENDER_RNA;
+
+/* Keep sorted. */
extern StructRNA RNA_Action;
extern StructRNA RNA_ActionConstraint;
extern StructRNA RNA_ActionFCurves;
@@ -71,12 +72,13 @@ extern StructRNA RNA_AnyType;
extern StructRNA RNA_Area;
extern StructRNA RNA_AreaLight;
extern StructRNA RNA_Armature;
+extern StructRNA RNA_ArmatureGpencilModifier;
extern StructRNA RNA_ArmatureModifier;
extern StructRNA RNA_ArmatureSensor;
+extern StructRNA RNA_ArrayGpencilModifier;
extern StructRNA RNA_ArrayModifier;
extern StructRNA RNA_BackgroundImage;
extern StructRNA RNA_BevelModifier;
-extern StructRNA RNA_SplinePoint;
extern StructRNA RNA_BezierSplinePoint;
extern StructRNA RNA_BlendData;
extern StructRNA RNA_BlendTexture;
@@ -92,13 +94,12 @@ extern StructRNA RNA_BoidSettings;
extern StructRNA RNA_BoidState;
extern StructRNA RNA_Bone;
extern StructRNA RNA_BoneGroup;
-extern StructRNA RNA_BooleanModifier;
extern StructRNA RNA_BoolProperty;
+extern StructRNA RNA_BooleanModifier;
extern StructRNA RNA_Brush;
extern StructRNA RNA_BrushTextureSlot;
+extern StructRNA RNA_BuildGpencilModifier;
extern StructRNA RNA_BuildModifier;
-extern StructRNA RNA_MeshCacheModifier;
-extern StructRNA RNA_MeshSequenceCacheModifier;
extern StructRNA RNA_CacheFile;
extern StructRNA RNA_Camera;
extern StructRNA RNA_CastModifier;
@@ -115,14 +116,15 @@ extern StructRNA RNA_CollectionProperty;
extern StructRNA RNA_CollisionModifier;
extern StructRNA RNA_CollisionSensor;
extern StructRNA RNA_CollisionSettings;
+extern StructRNA RNA_ColorGpencilModifier;
+extern StructRNA RNA_ColorManagedDisplaySettings;
extern StructRNA RNA_ColorManagedInputColorspaceSettings;
extern StructRNA RNA_ColorManagedSequencerColorspaceSettings;
-extern StructRNA RNA_ColorManagedDisplaySettings;
extern StructRNA RNA_ColorManagedViewSettings;
+extern StructRNA RNA_ColorMixSequence;
extern StructRNA RNA_ColorRamp;
extern StructRNA RNA_ColorRampElement;
extern StructRNA RNA_ColorSequence;
-extern StructRNA RNA_ColorMixSequence;
extern StructRNA RNA_CompositorNode;
extern StructRNA RNA_CompositorNodeAlphaOver;
extern StructRNA RNA_CompositorNodeBilateralblur;
@@ -147,24 +149,24 @@ extern StructRNA RNA_CompositorNodeDiffMatte;
extern StructRNA RNA_CompositorNodeDilateErode;
extern StructRNA RNA_CompositorNodeDisplace;
extern StructRNA RNA_CompositorNodeDistanceMatte;
+extern StructRNA RNA_CompositorNodeDoubleEdgeMask;
extern StructRNA RNA_CompositorNodeFilter;
extern StructRNA RNA_CompositorNodeFlip;
extern StructRNA RNA_CompositorNodeGamma;
extern StructRNA RNA_CompositorNodeGlare;
extern StructRNA RNA_CompositorNodeHueSat;
extern StructRNA RNA_CompositorNodeIDMask;
-extern StructRNA RNA_CompositorNodeDoubleEdgeMask;
extern StructRNA RNA_CompositorNodeImage;
extern StructRNA RNA_CompositorNodeInpaint;
extern StructRNA RNA_CompositorNodeInvert;
extern StructRNA RNA_CompositorNodeLensdist;
extern StructRNA RNA_CompositorNodeLevels;
extern StructRNA RNA_CompositorNodeLumaMatte;
+extern StructRNA RNA_CompositorNodeMapRange;
extern StructRNA RNA_CompositorNodeMapUV;
extern StructRNA RNA_CompositorNodeMapValue;
-extern StructRNA RNA_CompositorNodeMapRange;
-extern StructRNA RNA_CompositorNodeMath;
extern StructRNA RNA_CompositorNodeMask;
+extern StructRNA RNA_CompositorNodeMath;
extern StructRNA RNA_CompositorNodeMixRGB;
extern StructRNA RNA_CompositorNodeNormal;
extern StructRNA RNA_CompositorNodeNormalize;
@@ -203,22 +205,21 @@ extern StructRNA RNA_CopyLocationConstraint;
extern StructRNA RNA_CopyRotationConstraint;
extern StructRNA RNA_CopyScaleConstraint;
extern StructRNA RNA_CopyTransformsConstraint;
+extern StructRNA RNA_CorrectiveSmoothModifier;
extern StructRNA RNA_Curve;
extern StructRNA RNA_CurveMap;
extern StructRNA RNA_CurveMapPoint;
extern StructRNA RNA_CurveMapping;
extern StructRNA RNA_CurveModifier;
extern StructRNA RNA_CurvePoint;
-extern StructRNA RNA_Depsgraph;
-extern StructRNA RNA_DepsgraphObjectInstance;
-extern StructRNA RNA_DepsgraphUpdate;
extern StructRNA RNA_DampedTrackConstraint;
extern StructRNA RNA_DataTransferModifier;
extern StructRNA RNA_DecimateModifier;
extern StructRNA RNA_DelaySensor;
-extern StructRNA RNA_CorrectiveSmoothModifier;
+extern StructRNA RNA_Depsgraph;
+extern StructRNA RNA_DepsgraphObjectInstance;
+extern StructRNA RNA_DepsgraphUpdate;
extern StructRNA RNA_DisplaceModifier;
-extern StructRNA RNA_SceneDisplay;
extern StructRNA RNA_DisplaySafeAreas;
extern StructRNA RNA_DistortedNoiseTexture;
extern StructRNA RNA_DomainFluidSettings;
@@ -226,6 +227,7 @@ extern StructRNA RNA_DopeSheet;
extern StructRNA RNA_Driver;
extern StructRNA RNA_DriverTarget;
extern StructRNA RNA_DriverVariable;
+extern StructRNA RNA_DupliGpencilModifier;
extern StructRNA RNA_DynamicPaintBrushSettings;
extern StructRNA RNA_DynamicPaintCanvasSettings;
extern StructRNA RNA_DynamicPaintModifier;
@@ -239,7 +241,6 @@ extern StructRNA RNA_EnumPropertyItem;
extern StructRNA RNA_Event;
extern StructRNA RNA_ExplodeModifier;
extern StructRNA RNA_ExpressionController;
-extern StructRNA RNA_FaceMap;
extern StructRNA RNA_FCurve;
extern StructRNA RNA_FCurveSample;
extern StructRNA RNA_FFmpegSettings;
@@ -253,6 +254,7 @@ extern StructRNA RNA_FModifierLimits;
extern StructRNA RNA_FModifierNoise;
extern StructRNA RNA_FModifierPython;
extern StructRNA RNA_FModifierStepped;
+extern StructRNA RNA_FaceMap;
extern StructRNA RNA_FieldSettings;
extern StructRNA RNA_FileBrowserFSMenuEntry;
extern StructRNA RNA_FileSelectParams;
@@ -263,24 +265,29 @@ extern StructRNA RNA_FluidSettings;
extern StructRNA RNA_FluidSimulationModifier;
extern StructRNA RNA_FollowPathConstraint;
extern StructRNA RNA_FractureModifier;
-extern StructRNA RNA_FreestyleLineStyle;
extern StructRNA RNA_FreestyleLineSet;
+extern StructRNA RNA_FreestyleLineStyle;
extern StructRNA RNA_FreestyleModuleSettings;
extern StructRNA RNA_FreestyleSettings;
extern StructRNA RNA_Function;
extern StructRNA RNA_GPencilFrame;
-extern StructRNA RNA_GPencilLayer;
extern StructRNA RNA_GPencilInterpolateSettings;
+extern StructRNA RNA_GPencilLayer;
+extern StructRNA RNA_GPencilSculptBrush;
+extern StructRNA RNA_GPencilSculptSettings;
extern StructRNA RNA_GPencilStroke;
extern StructRNA RNA_GPencilStrokePoint;
-extern StructRNA RNA_GPencilSculptSettings;
-extern StructRNA RNA_GPencilSculptBrush;
extern StructRNA RNA_GaussianBlurSequence;
+extern StructRNA RNA_Gizmo;
+extern StructRNA RNA_GizmoGroupProperties;
+extern StructRNA RNA_GizmoProperties;
extern StructRNA RNA_GlowSequence;
+extern StructRNA RNA_GpencilModifier;
extern StructRNA RNA_GreasePencil;
extern StructRNA RNA_Header;
extern StructRNA RNA_HemiLight;
extern StructRNA RNA_Histogram;
+extern StructRNA RNA_HookGpencilModifier;
extern StructRNA RNA_HookModifier;
extern StructRNA RNA_ID;
extern StructRNA RNA_IDOverrideStatic;
@@ -310,16 +317,18 @@ extern StructRNA RNA_KeyingSetInfo;
extern StructRNA RNA_KeyingSetPath;
extern StructRNA RNA_KeyingSetsAll;
extern StructRNA RNA_KinematicConstraint;
-extern StructRNA RNA_Light;
-extern StructRNA RNA_LightSkySettings;
-extern StructRNA RNA_LightTextureSlot;
extern StructRNA RNA_LaplacianDeformModifier;
extern StructRNA RNA_LaplacianSmoothModifier;
extern StructRNA RNA_Lattice;
+extern StructRNA RNA_LatticeGpencilModifier;
extern StructRNA RNA_LatticeModifier;
extern StructRNA RNA_LatticePoint;
extern StructRNA RNA_LayerCollection;
extern StructRNA RNA_Library;
+extern StructRNA RNA_Light;
+extern StructRNA RNA_LightProbe;
+extern StructRNA RNA_LightSkySettings;
+extern StructRNA RNA_LightTextureSlot;
extern StructRNA RNA_LimitDistanceConstraint;
extern StructRNA RNA_LimitLocationConstraint;
extern StructRNA RNA_LimitRotationConstraint;
@@ -372,32 +381,32 @@ extern StructRNA RNA_LineStyleThicknessModifier_Tangent;
extern StructRNA RNA_LockedTrackConstraint;
extern StructRNA RNA_Macro;
extern StructRNA RNA_MagicTexture;
-extern StructRNA RNA_Gizmo;
-extern StructRNA RNA_GizmoProperties;
extern StructRNA RNA_MarbleTexture;
+extern StructRNA RNA_Mask;
+extern StructRNA RNA_MaskLayer;
extern StructRNA RNA_MaskModifier;
extern StructRNA RNA_MaskSequence;
extern StructRNA RNA_Material;
extern StructRNA RNA_MaterialRaytraceMirror;
extern StructRNA RNA_MaterialSlot;
-extern StructRNA RNA_Mask;
-extern StructRNA RNA_MaskLayer;
extern StructRNA RNA_Menu;
extern StructRNA RNA_Mesh;
+extern StructRNA RNA_MeshCacheModifier;
extern StructRNA RNA_MeshColor;
extern StructRNA RNA_MeshColorLayer;
-extern StructRNA RNA_MeshLoopColorLayer;
extern StructRNA RNA_MeshDeformModifier;
extern StructRNA RNA_MeshEdge;
-extern StructRNA RNA_MeshPolygon;
-extern StructRNA RNA_MeshTessFace;
-extern StructRNA RNA_MeshLoop;
extern StructRNA RNA_MeshFloatProperty;
extern StructRNA RNA_MeshFloatPropertyLayer;
extern StructRNA RNA_MeshIntProperty;
extern StructRNA RNA_MeshIntPropertyLayer;
-extern StructRNA RNA_MeshSkinVertexLayer;
+extern StructRNA RNA_MeshLoop;
+extern StructRNA RNA_MeshLoopColorLayer;
+extern StructRNA RNA_MeshLoopTriangle;
+extern StructRNA RNA_MeshPolygon;
+extern StructRNA RNA_MeshSequenceCacheModifier;
extern StructRNA RNA_MeshSkinVertex;
+extern StructRNA RNA_MeshSkinVertexLayer;
extern StructRNA RNA_MeshSticky;
extern StructRNA RNA_MeshStringProperty;
extern StructRNA RNA_MeshStringPropertyLayer;
@@ -410,17 +419,18 @@ extern StructRNA RNA_MessageSensor;
extern StructRNA RNA_MetaBall;
extern StructRNA RNA_MetaElement;
extern StructRNA RNA_MetaSequence;
+extern StructRNA RNA_MirrorGpencilModifier;
extern StructRNA RNA_MirrorModifier;
extern StructRNA RNA_Modifier;
extern StructRNA RNA_MotionPath;
extern StructRNA RNA_MotionPathVert;
extern StructRNA RNA_MouseSensor;
-extern StructRNA RNA_MovieSequence;
extern StructRNA RNA_MovieClipSequence;
+extern StructRNA RNA_MovieSequence;
extern StructRNA RNA_MovieTracking;
extern StructRNA RNA_MovieTrackingObject;
-extern StructRNA RNA_MovieTrackingTrack;
extern StructRNA RNA_MovieTrackingStabilization;
+extern StructRNA RNA_MovieTrackingTrack;
extern StructRNA RNA_MulticamSequence;
extern StructRNA RNA_MultiresModifier;
extern StructRNA RNA_MusgraveTexture;
@@ -429,15 +439,17 @@ extern StructRNA RNA_NearSensor;
extern StructRNA RNA_NlaStrip;
extern StructRNA RNA_NlaTrack;
extern StructRNA RNA_Node;
-extern StructRNA RNA_NodeOutputFileSlotFile;
-extern StructRNA RNA_NodeOutputFileSlotLayer;
extern StructRNA RNA_NodeInstanceHash;
extern StructRNA RNA_NodeLink;
+extern StructRNA RNA_NodeOutputFileSlotFile;
+extern StructRNA RNA_NodeOutputFileSlotLayer;
extern StructRNA RNA_NodeSocket;
extern StructRNA RNA_NodeSocketInterface;
extern StructRNA RNA_NodeTree;
+extern StructRNA RNA_NoiseGpencilModifier;
extern StructRNA RNA_NoiseTexture;
extern StructRNA RNA_NorController;
+extern StructRNA RNA_NormalEditModifier;
extern StructRNA RNA_Object;
extern StructRNA RNA_ObjectBase;
extern StructRNA RNA_ObjectDisplay;
@@ -445,17 +457,20 @@ extern StructRNA RNA_ObstacleFluidSettings;
extern StructRNA RNA_OceanModifier;
extern StructRNA RNA_OceanTexData;
extern StructRNA RNA_OceanTexture;
+extern StructRNA RNA_OffsetGpencilModifier;
+extern StructRNA RNA_OpacityGpencilModifier;
extern StructRNA RNA_Operator;
extern StructRNA RNA_OperatorFileListElement;
+extern StructRNA RNA_OperatorMacro;
extern StructRNA RNA_OperatorMousePath;
extern StructRNA RNA_OperatorProperties;
extern StructRNA RNA_OperatorStrokeElement;
-extern StructRNA RNA_OperatorMacro;
extern StructRNA RNA_OrController;
extern StructRNA RNA_OutflowFluidSettings;
extern StructRNA RNA_PackedFile;
extern StructRNA RNA_Paint;
extern StructRNA RNA_PaintCurve;
+extern StructRNA RNA_PaintToolSlot;
extern StructRNA RNA_Palette;
extern StructRNA RNA_PaletteColor;
extern StructRNA RNA_Panel;
@@ -478,7 +493,6 @@ extern StructRNA RNA_PointLight;
extern StructRNA RNA_PointerProperty;
extern StructRNA RNA_Pose;
extern StructRNA RNA_PoseBone;
-extern StructRNA RNA_LightProbe;
extern StructRNA RNA_Property;
extern StructRNA RNA_PropertyGroup;
extern StructRNA RNA_PropertyGroupItem;
@@ -490,17 +504,18 @@ extern StructRNA RNA_RandomSensor;
extern StructRNA RNA_RaySensor;
extern StructRNA RNA_Region;
extern StructRNA RNA_RenderEngine;
+extern StructRNA RNA_RenderEngineSettings;
+extern StructRNA RNA_RenderEngineSettingsClay;
extern StructRNA RNA_RenderLayer;
extern StructRNA RNA_RenderPass;
extern StructRNA RNA_RenderResult;
extern StructRNA RNA_RenderSettings;
-extern StructRNA RNA_RenderEngineSettings;
-extern StructRNA RNA_RenderEngineSettingsClay;
-extern StructRNA RNA_RigidBodyWorld;
-extern StructRNA RNA_RigidBodyObject;
extern StructRNA RNA_RigidBodyJointConstraint;
+extern StructRNA RNA_RigidBodyObject;
+extern StructRNA RNA_RigidBodyWorld;
extern StructRNA RNA_SPHFluidSettings;
extern StructRNA RNA_Scene;
+extern StructRNA RNA_SceneDisplay;
extern StructRNA RNA_SceneEEVEE;
extern StructRNA RNA_SceneObjects;
extern StructRNA RNA_SceneRenderLayer;
@@ -513,16 +528,29 @@ extern StructRNA RNA_SelectedUvElement;
extern StructRNA RNA_Sensor;
extern StructRNA RNA_Sequence;
extern StructRNA RNA_SequenceColorBalance;
+extern StructRNA RNA_SequenceColorBalanceData;
extern StructRNA RNA_SequenceCrop;
extern StructRNA RNA_SequenceEditor;
extern StructRNA RNA_SequenceElement;
+extern StructRNA RNA_SequenceModifier;
extern StructRNA RNA_SequenceProxy;
extern StructRNA RNA_SequenceTransform;
-extern StructRNA RNA_NormalEditModifier;
+extern StructRNA RNA_ShaderFx;
+extern StructRNA RNA_ShaderFxBlur;
+extern StructRNA RNA_ShaderFxColorize;
+extern StructRNA RNA_ShaderFxFlip;
+extern StructRNA RNA_ShaderFxGlow;
+extern StructRNA RNA_ShaderFxLight;
+extern StructRNA RNA_ShaderFxPixel;
+extern StructRNA RNA_ShaderFxRim;
+extern StructRNA RNA_ShaderFxShadow;
+extern StructRNA RNA_ShaderFxSwirl;
+extern StructRNA RNA_ShaderFxWave;
extern StructRNA RNA_ShaderNode;
extern StructRNA RNA_ShaderNodeCameraData;
extern StructRNA RNA_ShaderNodeCombineRGB;
extern StructRNA RNA_ShaderNodeExtendedMaterial;
+extern StructRNA RNA_ShaderNodeGamma;
extern StructRNA RNA_ShaderNodeGeometry;
extern StructRNA RNA_ShaderNodeHueSaturation;
extern StructRNA RNA_ShaderNodeIESLight;
@@ -533,12 +561,11 @@ extern StructRNA RNA_ShaderNodeMaterial;
extern StructRNA RNA_ShaderNodeMath;
extern StructRNA RNA_ShaderNodeMixRGB;
extern StructRNA RNA_ShaderNodeNormal;
-extern StructRNA RNA_ShaderNodeGamma;
extern StructRNA RNA_ShaderNodeOutput;
-extern StructRNA RNA_ShaderNodeScript;
extern StructRNA RNA_ShaderNodeRGB;
extern StructRNA RNA_ShaderNodeRGBCurve;
extern StructRNA RNA_ShaderNodeRGBToBW;
+extern StructRNA RNA_ShaderNodeScript;
extern StructRNA RNA_ShaderNodeSeparateRGB;
extern StructRNA RNA_ShaderNodeSqueeze;
extern StructRNA RNA_ShaderNodeTexture;
@@ -554,11 +581,13 @@ extern StructRNA RNA_ShapeKeyPoint;
extern StructRNA RNA_ShrinkwrapConstraint;
extern StructRNA RNA_ShrinkwrapModifier;
extern StructRNA RNA_SimpleDeformModifier;
+extern StructRNA RNA_SimplifyGpencilModifier;
extern StructRNA RNA_SkinModifier;
extern StructRNA RNA_SmokeCollSettings;
extern StructRNA RNA_SmokeDomainSettings;
extern StructRNA RNA_SmokeFlowSettings;
extern StructRNA RNA_SmokeModifier;
+extern StructRNA RNA_SmoothGpencilModifier;
extern StructRNA RNA_SmoothModifier;
extern StructRNA RNA_SoftBodyModifier;
extern StructRNA RNA_SoftBodySettings;
@@ -566,6 +595,7 @@ extern StructRNA RNA_SolidifyModifier;
extern StructRNA RNA_Sound;
extern StructRNA RNA_SoundSequence;
extern StructRNA RNA_Space;
+extern StructRNA RNA_SpaceClipEditor;
extern StructRNA RNA_SpaceConsole;
extern StructRNA RNA_SpaceDopeSheetEditor;
extern StructRNA RNA_SpaceFileBrowser;
@@ -581,11 +611,11 @@ extern StructRNA RNA_SpaceTextEditor;
extern StructRNA RNA_SpaceUVEditor;
extern StructRNA RNA_SpaceUserPreferences;
extern StructRNA RNA_SpaceView3D;
-extern StructRNA RNA_SpaceClipEditor;
extern StructRNA RNA_Speaker;
extern StructRNA RNA_SpeedControlSequence;
extern StructRNA RNA_Spline;
extern StructRNA RNA_SplineIKConstraint;
+extern StructRNA RNA_SplinePoint;
extern StructRNA RNA_SpotLight;
extern StructRNA RNA_Stereo3dDisplay;
extern StructRNA RNA_StretchToConstraint;
@@ -593,43 +623,19 @@ extern StructRNA RNA_StringProperty;
extern StructRNA RNA_Struct;
extern StructRNA RNA_StucciTexture;
extern StructRNA RNA_StudioLight;
+extern StructRNA RNA_SubdivGpencilModifier;
extern StructRNA RNA_SubsurfModifier;
extern StructRNA RNA_SunLight;
extern StructRNA RNA_SurfaceCurve;
extern StructRNA RNA_SurfaceDeformModifier;
extern StructRNA RNA_SurfaceModifier;
-extern StructRNA RNA_GpencilModifier;
-extern StructRNA RNA_BuildGpencilModifier;
-extern StructRNA RNA_NoiseGpencilModifier;
-extern StructRNA RNA_SubdivGpencilModifier;
-extern StructRNA RNA_SimplifyGpencilModifier;
-extern StructRNA RNA_ThickGpencilModifier;
-extern StructRNA RNA_TintGpencilModifier;
-extern StructRNA RNA_ColorGpencilModifier;
-extern StructRNA RNA_InstanceGpencilModifier;
-extern StructRNA RNA_DupliGpencilModifier;
-extern StructRNA RNA_OpacityGpencilModifier;
-extern StructRNA RNA_LatticeGpencilModifier;
-extern StructRNA RNA_MirrorGpencilModifier;
-extern StructRNA RNA_SmoothGpencilModifier;
-extern StructRNA RNA_HookGpencilModifier;
-extern StructRNA RNA_OffsetGpencilModifier;
-extern StructRNA RNA_ArmatureGpencilModifier;
-extern StructRNA RNA_ShaderFx;
-extern StructRNA RNA_ShaderFxBlur;
-extern StructRNA RNA_ShaderFxColorize;
-extern StructRNA RNA_ShaderFxFlip;
-extern StructRNA RNA_ShaderFxLight;
-extern StructRNA RNA_ShaderFxPixel;
-extern StructRNA RNA_ShaderFxRim;
-extern StructRNA RNA_ShaderFxSwirl;
-extern StructRNA RNA_ShaderFxWave;
extern StructRNA RNA_TexMapping;
extern StructRNA RNA_Text;
extern StructRNA RNA_TextBox;
extern StructRNA RNA_TextCharacterFormat;
extern StructRNA RNA_TextCurve;
extern StructRNA RNA_TextLine;
+extern StructRNA RNA_TextSequence;
extern StructRNA RNA_Texture;
extern StructRNA RNA_TextureNode;
extern StructRNA RNA_TextureNodeBricks;
@@ -672,7 +678,6 @@ extern StructRNA RNA_ThemeNodeEditor;
extern StructRNA RNA_ThemeOutliner;
extern StructRNA RNA_ThemeProperties;
extern StructRNA RNA_ThemeSequenceEditor;
-extern StructRNA RNA_TextSequence;
extern StructRNA RNA_ThemeSpaceGeneric;
extern StructRNA RNA_ThemeSpaceGradient;
extern StructRNA RNA_ThemeSpaceListGeneric;
@@ -683,8 +688,11 @@ extern StructRNA RNA_ThemeUserPreferences;
extern StructRNA RNA_ThemeView3D;
extern StructRNA RNA_ThemeWidgetColors;
extern StructRNA RNA_ThemeWidgetStateColors;
+extern StructRNA RNA_ThickGpencilModifier;
+extern StructRNA RNA_TimeGpencilModifier;
extern StructRNA RNA_TimelineMarker;
extern StructRNA RNA_Timer;
+extern StructRNA RNA_TintGpencilModifier;
extern StructRNA RNA_ToolSettings;
extern StructRNA RNA_TrackToConstraint;
extern StructRNA RNA_TransformConstraint;
@@ -692,11 +700,10 @@ extern StructRNA RNA_TransformSequence;
extern StructRNA RNA_UILayout;
extern StructRNA RNA_UIList;
extern StructRNA RNA_UIPieMenu;
-extern StructRNA RNA_uiPopover;
extern StructRNA RNA_UIPopupMenu;
-extern StructRNA RNA_UVWarpModifier;
extern StructRNA RNA_UVProjectModifier;
extern StructRNA RNA_UVProjector;
+extern StructRNA RNA_UVWarpModifier;
extern StructRNA RNA_UnitSettings;
extern StructRNA RNA_UnknownType;
extern StructRNA RNA_UserPreferences;
@@ -711,23 +718,22 @@ extern StructRNA RNA_VectorFont;
extern StructRNA RNA_VertexGroup;
extern StructRNA RNA_VertexGroupElement;
extern StructRNA RNA_VertexPaint;
-extern StructRNA RNA_VoronoiTexture;
-extern StructRNA RNA_WarpModifier;
-extern StructRNA RNA_WaveModifier;
extern StructRNA RNA_VertexWeightEditModifier;
extern StructRNA RNA_VertexWeightMixModifier;
extern StructRNA RNA_VertexWeightProximityModifier;
-extern StructRNA RNA_WeightedNormalModifier;
extern StructRNA RNA_View3DOverlay;
extern StructRNA RNA_View3DShading;
extern StructRNA RNA_ViewLayer;
+extern StructRNA RNA_VoronoiTexture;
+extern StructRNA RNA_WarpModifier;
+extern StructRNA RNA_WaveModifier;
+extern StructRNA RNA_WeightedNormalModifier;
extern StructRNA RNA_Window;
extern StructRNA RNA_WindowManager;
extern StructRNA RNA_WipeSequence;
extern StructRNA RNA_WireframeModifier;
extern StructRNA RNA_WoodTexture;
extern StructRNA RNA_WorkSpace;
-extern StructRNA RNA_wmOwnerIDs;
extern StructRNA RNA_World;
extern StructRNA RNA_WorldAmbientOcclusion;
extern StructRNA RNA_WorldLighting;
@@ -735,6 +741,8 @@ extern StructRNA RNA_WorldMistSettings;
extern StructRNA RNA_WorldTextureSlot;
extern StructRNA RNA_XnorController;
extern StructRNA RNA_XorController;
+extern StructRNA RNA_uiPopover;
+extern StructRNA RNA_wmOwnerIDs;
/* Pointer
*
@@ -870,6 +878,7 @@ bool RNA_enum_name(const EnumPropertyItem *item, const int value, const char **r
bool RNA_enum_description(const EnumPropertyItem *item, const int value, const char **description);
int RNA_enum_from_value(const EnumPropertyItem *item, const int value);
int RNA_enum_from_identifier(const EnumPropertyItem *item, const char *identifier);
+int RNA_enum_from_name(const EnumPropertyItem *item, const char *name);
unsigned int RNA_enum_items_count(const EnumPropertyItem *item);
void RNA_property_enum_items_ex(
diff --git a/source/blender/makesrna/RNA_define.h b/source/blender/makesrna/RNA_define.h
index 97a8a4a5546..e14dcbea09e 100644
--- a/source/blender/makesrna/RNA_define.h
+++ b/source/blender/makesrna/RNA_define.h
@@ -25,7 +25,9 @@
/** \file RNA_define.h
* \ingroup RNA
- * Functions used during preprocess and runtime, for defining the RNA. */
+ *
+ * Functions used during preprocess and runtime, for defining the RNA.
+ */
#include <float.h>
#include <limits.h>
@@ -173,7 +175,7 @@ void RNA_def_property_string_default(PropertyRNA *prop, const char *value);
void RNA_def_property_ui_text(PropertyRNA *prop, const char *name, const char *description);
void RNA_def_property_ui_range(PropertyRNA *prop, double min, double max, double step, int precision);
-void RNA_def_property_ui_icon(PropertyRNA *prop, int icon, bool consecutive);
+void RNA_def_property_ui_icon(PropertyRNA *prop, int icon, int consecutive);
void RNA_def_property_update(PropertyRNA *prop, int noteflag, const char *updatefunc);
void RNA_def_property_editable_func(PropertyRNA *prop, const char *editable);
diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h
index 613454e2f33..10c08464c8c 100644
--- a/source/blender/makesrna/RNA_enum_types.h
+++ b/source/blender/makesrna/RNA_enum_types.h
@@ -72,6 +72,7 @@ extern const EnumPropertyItem rna_enum_object_shaderfx_type_items[];
extern const EnumPropertyItem rna_enum_modifier_triangulate_quad_method_items[];
extern const EnumPropertyItem rna_enum_modifier_triangulate_ngon_method_items[];
+extern const EnumPropertyItem rna_enum_modifier_shrinkwrap_mode_items[];
extern const EnumPropertyItem rna_enum_image_type_items[];
extern const EnumPropertyItem rna_enum_image_color_mode_items[];
@@ -119,6 +120,8 @@ extern const EnumPropertyItem rna_enum_operator_property_tags[];
extern const EnumPropertyItem rna_enum_brush_sculpt_tool_items[];
extern const EnumPropertyItem rna_enum_brush_vertex_tool_items[];
+extern const EnumPropertyItem rna_enum_brush_weight_tool_items[];
+extern const EnumPropertyItem rna_enum_brush_gpencil_types_items[];
extern const EnumPropertyItem rna_enum_brush_image_tool_items[];
extern const EnumPropertyItem rna_enum_particle_edit_hair_brush_items[];
@@ -181,7 +184,6 @@ extern const EnumPropertyItem rna_enum_navigation_mode_items[];
extern const EnumPropertyItem rna_enum_file_sort_items[];
extern const EnumPropertyItem rna_enum_node_socket_in_out_items[];
-extern const EnumPropertyItem rna_enum_node_icon_items[];
extern const EnumPropertyItem rna_enum_node_math_items[];
extern const EnumPropertyItem rna_enum_node_vec_math_items[];
diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h
index ccf9affa1f8..72e1c05de3c 100644
--- a/source/blender/makesrna/RNA_types.h
+++ b/source/blender/makesrna/RNA_types.h
@@ -184,6 +184,7 @@ typedef enum PropertyFlag {
/* icon */
PROP_ICONS_CONSECUTIVE = (1 << 12),
+ PROP_ICONS_REVERSE = (1 << 8),
/* hidden in the user interface */
PROP_HIDDEN = (1 << 19),
@@ -237,7 +238,6 @@ typedef enum PropertyFlag {
* most common case is functions that return arrays where the array */
PROP_THICK_WRAP = (1 << 23),
- PROP_EXPORT = (1 << 8), /* XXX Is this still used? makesrna.c seems to ignore it currently... */
PROP_IDPROPERTY = (1 << 10), /* This is an IDProperty, not a DNA one. */
PROP_DYNAMIC = (1 << 17), /* for dynamic arrays, and retvals of type string */
PROP_ENUM_NO_CONTEXT = (1 << 24), /* for enum that shouldn't be contextual */
@@ -247,7 +247,7 @@ typedef enum PropertyFlag {
/* Flags related to comparing and overriding RNA properties. Make sure enums are updated with these */
/* FREE FLAGS: 2, 3, 4, 5, 6, 7, 8, 9, 12 and above. */
typedef enum PropertyOverrideFlag {
- /* Means the property can be overriden by a local 'proxy' of some linked datablock. */
+ /* Means the property can be overridden by a local 'proxy' of some linked datablock. */
PROPOVERRIDE_OVERRIDABLE_STATIC = (1 << 0),
/* Forbid usage of this property in comparison (& hence override) code.
@@ -431,7 +431,7 @@ typedef struct ParameterDynAlloc {
typedef enum FunctionFlag {
/***** Options affecting callback signature. *****/
- /* Those add additionnal parameters at the beginning of the C callback, like that:
+ /* Those add additional parameters at the beginning of the C callback, like that:
* rna_my_func([ID *_selfid],
* [<DNA_STRUCT> *self|StructRNA *type],
* [Main *bmain],
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index f9e65811ca8..c67b3cc72c5 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -2666,7 +2666,7 @@ static void rna_generate_property_prototypes(BlenderRNA *UNUSED(brna), StructRNA
fprintf(f, "\n");
for (prop = srna->cont.properties.first; prop; prop = prop->next)
- fprintf(f, "%s%s rna_%s_%s;\n", (prop->flag & PROP_EXPORT) ? "" : "", rna_property_structname(prop->type),
+ fprintf(f, "%s rna_%s_%s;\n", rna_property_structname(prop->type),
srna->identifier, prop->identifier);
fprintf(f, "\n");
}
@@ -3061,8 +3061,7 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
break;
}
- fprintf(f, "%s%s rna_%s%s_%s = {\n",
- (prop->flag & PROP_EXPORT) ? "" : "",
+ fprintf(f, "%s rna_%s%s_%s = {\n",
rna_property_structname(prop->type),
srna->identifier, strnest, prop->identifier);
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index 0a294bfaab9..b550b4043e3 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -36,6 +36,7 @@
#include "BLI_math_base.h"
#include "BKE_icons.h"
+#include "BKE_library.h"
#include "BKE_object.h"
#include "RNA_access.h"
@@ -81,9 +82,9 @@ const EnumPropertyItem rna_enum_id_type_items[] = {
{ID_SPK, "SPEAKER", ICON_SPEAKER, "Speaker", ""},
{ID_TXT, "TEXT", ICON_TEXT, "Text", ""},
{ID_TE, "TEXTURE", ICON_TEXTURE_DATA, "Texture", ""},
- {ID_WM, "WINDOWMANAGER", ICON_FULLSCREEN, "Window Manager", ""},
+ {ID_WM, "WINDOWMANAGER", ICON_WINDOW, "Window Manager", ""},
{ID_WO, "WORLD", ICON_WORLD_DATA, "World", ""},
- {ID_WS, "WORKSPACE", ICON_SPLITSCREEN, "Workspace", ""},
+ {ID_WS, "WORKSPACE", ICON_WORKSPACE, "Workspace", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -95,7 +96,6 @@ const EnumPropertyItem rna_enum_id_type_items[] = {
#include "BKE_font.h"
#include "BKE_idprop.h"
-#include "BKE_library.h"
#include "BKE_library_query.h"
#include "BKE_library_override.h"
#include "BKE_library_remap.h"
@@ -105,6 +105,7 @@ const EnumPropertyItem rna_enum_id_type_items[] = {
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
+#include "DEG_depsgraph_query.h"
#include "WM_api.h"
@@ -150,8 +151,15 @@ void rna_ID_name_set(PointerRNA *ptr, const char *value)
{
ID *id = (ID *)ptr->data;
BLI_strncpy_utf8(id->name + 2, value, sizeof(id->name) - 2);
- BLI_assert(BKE_id_is_in_gobal_main(id));
+ BLI_assert(BKE_id_is_in_global_main(id));
BLI_libblock_ensure_unique_name(G_MAIN, id->name);
+
+ if (GS(id->name) == ID_OB) {
+ Object *ob = (Object *)id;
+ if (ob->type == OB_MBALL) {
+ DEG_id_tag_update(&ob->id, DEG_TAG_GEOMETRY);
+ }
+ }
}
static int rna_ID_name_editable(PointerRNA *ptr, const char **UNUSED(r_info))
@@ -161,12 +169,43 @@ static int rna_ID_name_editable(PointerRNA *ptr, const char **UNUSED(r_info))
if (GS(id->name) == ID_VF) {
VFont *vfont = (VFont *)id;
if (BKE_vfont_is_builtin(vfont))
- return false;
+ return 0;
+ }
+ else if (!BKE_id_is_in_global_main(id)) {
+ return 0;
}
return PROP_EDITABLE;
}
+void rna_ID_name_full_get(PointerRNA *ptr, char *value)
+{
+ ID *id = (ID *)ptr->data;
+ BKE_id_full_name_get(value, id);
+}
+
+int rna_ID_name_full_length(PointerRNA *ptr)
+{
+ ID *id = (ID *)ptr->data;
+ char name[MAX_ID_FULL_NAME];
+ BKE_id_full_name_get(name, id);
+ return strlen(name);
+}
+
+static int rna_ID_is_evaluated_get(PointerRNA *ptr)
+{
+ ID *id = (ID *)ptr->data;
+
+ return (DEG_get_original_id(id) != id);
+}
+
+static PointerRNA rna_ID_original_get(PointerRNA *ptr)
+{
+ ID *id = (ID *)ptr->data;
+
+ return rna_pointer_inherit_refine(ptr, &RNA_ID, DEG_get_original_id(id));
+}
+
short RNA_type_to_ID_code(const StructRNA *type)
{
const StructRNA *base_type = RNA_struct_base_child_of(type, &RNA_ID);
@@ -340,7 +379,7 @@ static ID *rna_ID_copy(ID *id, Main *bmain)
static ID *rna_ID_override_create(ID *id, Main *bmain)
{
- if (id->lib == NULL) {
+ if (!BKE_override_static_is_enabled() || id->lib == NULL) {
return NULL;
}
@@ -418,7 +457,7 @@ static struct ID *rna_ID_make_local(struct ID *self, Main *bmain, bool clear_pro
}
-static AnimData * rna_ID_animation_data_create(ID *id, Main *bmain)
+static AnimData *rna_ID_animation_data_create(ID *id, Main *bmain)
{
AnimData *adt = BKE_animdata_add_id(id);
DEG_relations_tag_update(bmain);
@@ -457,8 +496,8 @@ int rna_IDMaterials_assign_int(PointerRNA *ptr, int key, const PointerRNA *assig
short *totcol = give_totcolp_id(id);
Material *mat_id = assign_ptr->id.data;
if (totcol && (key >= 0 && key < *totcol)) {
- BLI_assert(BKE_id_is_in_gobal_main(id));
- BLI_assert(BKE_id_is_in_gobal_main(&mat_id->id));
+ BLI_assert(BKE_id_is_in_global_main(id));
+ BLI_assert(BKE_id_is_in_global_main(&mat_id->id));
assign_material_id(G_MAIN, id, mat_id, key + 1);
return 1;
}
@@ -516,7 +555,7 @@ static void rna_IDMaterials_clear_id(ID *id, Main *bmain, bool remove_material_s
static void rna_Library_filepath_set(PointerRNA *ptr, const char *value)
{
Library *lib = (Library *)ptr->data;
- BLI_assert(BKE_id_is_in_gobal_main(&lib->id));
+ BLI_assert(BKE_id_is_in_global_main(&lib->id));
BKE_library_filepath_set(G_MAIN, lib, value);
}
@@ -825,52 +864,52 @@ static void rna_def_ID_properties(BlenderRNA *brna)
/* IDP_STRING */
prop = RNA_def_property(srna, "string", PROP_STRING, PROP_NONE);
- RNA_def_property_flag(prop, PROP_EXPORT | PROP_IDPROPERTY);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY);
/* IDP_INT */
prop = RNA_def_property(srna, "int", PROP_INT, PROP_NONE);
- RNA_def_property_flag(prop, PROP_EXPORT | PROP_IDPROPERTY);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY);
prop = RNA_def_property(srna, "int_array", PROP_INT, PROP_NONE);
- RNA_def_property_flag(prop, PROP_EXPORT | PROP_IDPROPERTY);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY);
RNA_def_property_array(prop, 1);
/* IDP_FLOAT */
prop = RNA_def_property(srna, "float", PROP_FLOAT, PROP_NONE);
- RNA_def_property_flag(prop, PROP_EXPORT | PROP_IDPROPERTY);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY);
prop = RNA_def_property(srna, "float_array", PROP_FLOAT, PROP_NONE);
- RNA_def_property_flag(prop, PROP_EXPORT | PROP_IDPROPERTY);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY);
RNA_def_property_array(prop, 1);
/* IDP_DOUBLE */
prop = RNA_def_property(srna, "double", PROP_FLOAT, PROP_NONE);
- RNA_def_property_flag(prop, PROP_EXPORT | PROP_IDPROPERTY);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY);
prop = RNA_def_property(srna, "double_array", PROP_FLOAT, PROP_NONE);
- RNA_def_property_flag(prop, PROP_EXPORT | PROP_IDPROPERTY);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY);
RNA_def_property_array(prop, 1);
/* IDP_GROUP */
prop = RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
- RNA_def_property_flag(prop, PROP_EXPORT | PROP_IDPROPERTY);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "PropertyGroup");
prop = RNA_def_property(srna, "collection", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_flag(prop, PROP_EXPORT | PROP_IDPROPERTY);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY);
RNA_def_property_struct_type(prop, "PropertyGroup");
prop = RNA_def_property(srna, "idp_array", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "PropertyGroup");
RNA_def_property_collection_funcs(prop, "rna_IDPArray_begin", "rna_iterator_array_next", "rna_iterator_array_end",
"rna_iterator_array_get", "rna_IDPArray_length", NULL, NULL, NULL);
- RNA_def_property_flag(prop, PROP_EXPORT | PROP_IDPROPERTY);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY);
/* never tested, maybe its useful to have this? */
#if 0
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_property_flag(prop, PROP_EXPORT | PROP_IDPROPERTY);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Name", "Unique name used in the code and scripting");
RNA_def_struct_name_property(srna, prop);
@@ -878,7 +917,7 @@ static void rna_def_ID_properties(BlenderRNA *brna)
/* IDP_ID */
prop = RNA_def_property(srna, "id", PROP_POINTER, PROP_NONE);
- RNA_def_property_flag(prop, PROP_EXPORT | PROP_IDPROPERTY | PROP_NEVER_UNLINK);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY | PROP_NEVER_UNLINK);
RNA_def_property_struct_type(prop, "ID");
@@ -896,7 +935,7 @@ static void rna_def_ID_properties(BlenderRNA *brna)
* however this isn't prefect because it overrides how python would set the name
* when we only really want this so RNA_def_struct_name_property() is set to something useful */
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_property_flag(prop, PROP_EXPORT | PROP_IDPROPERTY);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY);
/*RNA_def_property_clear_flag(prop, PROP_EDITABLE); */
RNA_def_property_ui_text(prop, "Name", "Unique name used in the code and scripting");
RNA_def_struct_name_property(srna, prop);
@@ -1137,6 +1176,25 @@ static void rna_def_ID(BlenderRNA *brna)
RNA_def_property_update(prop, NC_ID | NA_RENAME, NULL);
RNA_def_struct_name_property(srna, prop);
+ prop = RNA_def_property(srna, "name_full", PROP_STRING, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Full Name", "Unique data-block ID name, including library one is any");
+ RNA_def_property_string_funcs(prop, "rna_ID_name_full_get", "rna_ID_name_full_length", NULL);
+ RNA_def_property_string_maxlength(prop, MAX_ID_FULL_NAME);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop = RNA_def_property(srna, "is_evaluated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Is Evaluated",
+ "Whether this ID is runtime-only, evaluated data-block, or actual data from .blend file");
+ RNA_def_property_boolean_funcs(prop, "rna_ID_is_evaluated_get", NULL);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop = RNA_def_property(srna, "original", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "ID");
+ RNA_def_property_ui_text(prop, "Original ID",
+ "Actual data-block from .blend file (Main database) that generated that evaluated one");
+ RNA_def_property_pointer_funcs(prop, "rna_ID_original_get", NULL, NULL, NULL);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE | PROP_PTR_NO_OWNERSHIP);
+
prop = RNA_def_property(srna, "users", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "us");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -1145,6 +1203,7 @@ static void rna_def_ID(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_fake_user", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LIB_FAKEUSER);
RNA_def_property_ui_text(prop, "Fake User", "Save this data-block even if it has no users");
+ RNA_def_property_ui_icon(prop, ICON_FAKE_USER_OFF, true);
RNA_def_property_boolean_funcs(prop, NULL, "rna_ID_fake_user_set");
prop = RNA_def_property(srna, "tag", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index a0c34afa7ed..f52e13ba1c9 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -56,7 +56,6 @@
#include "BKE_idcode.h"
#include "BKE_idprop.h"
#include "BKE_fcurve.h"
-#include "BKE_library.h"
#include "BKE_library_override.h"
#include "BKE_main.h"
#include "BKE_report.h"
@@ -1665,6 +1664,21 @@ int RNA_enum_from_identifier(const EnumPropertyItem *item, const char *identifie
return -1;
}
+/**
+ * Take care using this with translated enums,
+ * prefer #RNA_enum_from_identifier where possible.
+ */
+int RNA_enum_from_name(const EnumPropertyItem *item, const char *name)
+{
+ int i = 0;
+ for (; item->identifier; item++, i++) {
+ if (item->identifier[0] && STREQ(item->name, name)) {
+ return i;
+ }
+ }
+ return -1;
+}
+
int RNA_enum_from_value(const EnumPropertyItem *item, const int value)
{
int i = 0;
@@ -2070,7 +2084,7 @@ static void rna_property_update(bContext *C, Main *bmain, Scene *scene, PointerR
prop->update(bmain, scene, ptr);
}
-#if 1
+#if 0
/* TODO(campbell): Should eventually be replaced entirely by message bus (below)
* for now keep since COW, bugs are hard to track when we have other missing updates. */
if (prop->noteflag) {
@@ -2097,7 +2111,7 @@ static void rna_property_update(bContext *C, Main *bmain, Scene *scene, PointerR
if (!is_rna || (prop->flag & PROP_IDPROPERTY)) {
/* WARNING! This is so property drivers update the display!
* not especially nice */
- DEG_id_tag_update(ptr->id.data, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
+ DEG_id_tag_update(ptr->id.data, OB_RECALC_OB | OB_RECALC_DATA);
WM_main_add_notifier(NC_WINDOW, NULL);
/* Not nice as well, but the only way to make sure material preview
* is updated with custom nodes.
@@ -7075,7 +7089,7 @@ int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *pt
case PROP_COLLECTION:
{
StructRNA *srna = va_arg(args, StructRNA *);
- ListBase **arg = va_arg(args, ListBase * *);
+ ListBase **arg = va_arg(args, ListBase **);
err = rna_function_parameter_parse(&funcptr, parm, type, ftype, len, arg, retdata,
srna, tid, fid, pid);
break;
@@ -7516,13 +7530,13 @@ static bool rna_property_override_operation_apply(
}
if (ELEM(override_op, IDOVERRIDESTATIC_OP_ADD, IDOVERRIDESTATIC_OP_SUBTRACT, IDOVERRIDESTATIC_OP_MULTIPLY) && !ptr_storage) {
- /* We cannot apply 'diff' override operations without some refference storage.
+ /* We cannot apply 'diff' override operations without some reference storage.
* This should typically only happen at read time of .blend file... */
return false;
}
if (ELEM(override_op, IDOVERRIDESTATIC_OP_ADD, IDOVERRIDESTATIC_OP_SUBTRACT, IDOVERRIDESTATIC_OP_MULTIPLY) && !prop_storage) {
- /* We cannot apply 'diff' override operations without some refference storage.
+ /* We cannot apply 'diff' override operations without some reference storage.
* This should typically only happen at read time of .blend file... */
return false;
}
@@ -7582,7 +7596,7 @@ static bool rna_property_override_operation_apply(
}
/**
- * Check whether reference and local overriden data match (are the same),
+ * Check whether reference and local overridden data match (are the same),
* with respect to given restrictive sets of properties.
* If requested, will generate needed new property overrides, and/or restore values from reference.
*
@@ -7976,6 +7990,10 @@ eRNAOverrideStatus RNA_property_static_override_status(PointerRNA *ptr, Property
{
int override_status = 0;
+ if (!BKE_override_static_is_enabled()) {
+ return override_status;
+ }
+
if (!ptr || !prop || !ptr->id.data || !((ID *)ptr->id.data)->override_static) {
return override_status;
}
diff --git a/source/blender/makesrna/intern/rna_action.c b/source/blender/makesrna/intern/rna_action.c
index 12e28d457fb..8728f0634da 100644
--- a/source/blender/makesrna/intern/rna_action.c
+++ b/source/blender/makesrna/intern/rna_action.c
@@ -102,7 +102,7 @@ static void rna_Action_groups_remove(bAction *act, ReportList *reports, PointerR
RNA_POINTER_INVALIDATE(agrp_ptr);
}
-static FCurve *rna_Action_fcurve_new(bAction *act, ReportList *reports, const char *data_path,
+static FCurve *rna_Action_fcurve_new(bAction *act, Main *bmain, ReportList *reports, const char *data_path,
int index, const char *group)
{
if (group && group[0] == '\0') group = NULL;
@@ -113,12 +113,12 @@ static FCurve *rna_Action_fcurve_new(bAction *act, ReportList *reports, const ch
}
/* annoying, check if this exists */
- if (verify_fcurve(act, group, NULL, data_path, index, 0)) {
+ if (verify_fcurve(bmain, act, group, NULL, data_path, index, 0)) {
BKE_reportf(reports, RPT_ERROR, "F-Curve '%s[%d]' already exists in action '%s'", data_path,
index, act->id.name + 2);
return NULL;
}
- return verify_fcurve(act, group, NULL, data_path, index, 1);
+ return verify_fcurve(bmain, act, group, NULL, data_path, index, 1);
}
static FCurve *rna_Action_fcurve_find(bAction *act, ReportList *reports, const char *data_path, int index)
@@ -322,7 +322,7 @@ static void rna_def_dopesheet(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_only_errors", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "filterflag", ADS_FILTER_ONLY_ERRORS);
RNA_def_property_ui_text(prop, "Show Errors", "Only include F-Curves and drivers that are disabled or have errors");
- RNA_def_property_ui_icon(prop, ICON_HELP, 0); /* XXX: this doesn't quite fit */
+ RNA_def_property_ui_icon(prop, ICON_ERROR, 0);
RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
/* Object Collection Filtering Settings */
@@ -383,7 +383,7 @@ static void rna_def_dopesheet(BlenderRNA *brna)
RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOOBJ);
RNA_def_property_ui_text(prop, "Display Transforms",
"Include visualization of object-level animation data (mostly transforms)");
- RNA_def_property_ui_icon(prop, ICON_MANIPUL, 0); /* XXX? */
+ RNA_def_property_ui_icon(prop, ICON_ORIENTATION_GLOBAL, 0); /* XXX? */
RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
prop = RNA_def_property(srna, "show_shapekeys", PROP_BOOLEAN, PROP_NONE);
@@ -402,19 +402,19 @@ static void rna_def_dopesheet(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_meshes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOMESH);
RNA_def_property_ui_text(prop, "Display Meshes", "Include visualization of mesh related animation data");
- RNA_def_property_ui_icon(prop, ICON_MESH_DATA, 0);
+ RNA_def_property_ui_icon(prop, ICON_OUTLINER_OB_MESH, 0);
RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
prop = RNA_def_property(srna, "show_lattices", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOLAT);
RNA_def_property_ui_text(prop, "Display Lattices", "Include visualization of lattice related animation data");
- RNA_def_property_ui_icon(prop, ICON_LATTICE_DATA, 0);
+ RNA_def_property_ui_icon(prop, ICON_OUTLINER_OB_LATTICE, 0);
RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
prop = RNA_def_property(srna, "show_cameras", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOCAM);
RNA_def_property_ui_text(prop, "Display Camera", "Include visualization of camera related animation data");
- RNA_def_property_ui_icon(prop, ICON_CAMERA_DATA, 0);
+ RNA_def_property_ui_icon(prop, ICON_OUTLINER_OB_CAMERA, 0);
RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
prop = RNA_def_property(srna, "show_materials", PROP_BOOLEAN, PROP_NONE);
@@ -426,7 +426,7 @@ static void rna_def_dopesheet(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_lights", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOLAM);
RNA_def_property_ui_text(prop, "Display Light", "Include visualization of light related animation data");
- RNA_def_property_ui_icon(prop, ICON_LIGHT_DATA, 0);
+ RNA_def_property_ui_icon(prop, ICON_OUTLINER_OB_LIGHT, 0);
RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
prop = RNA_def_property(srna, "show_linestyles", PROP_BOOLEAN, PROP_NONE);
@@ -468,13 +468,13 @@ static void rna_def_dopesheet(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_metaballs", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOMBA);
RNA_def_property_ui_text(prop, "Display Metaball", "Include visualization of metaball related animation data");
- RNA_def_property_ui_icon(prop, ICON_META_DATA, 0);
+ RNA_def_property_ui_icon(prop, ICON_OUTLINER_OB_META, 0);
RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
prop = RNA_def_property(srna, "show_armatures", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOARM);
RNA_def_property_ui_text(prop, "Display Armature", "Include visualization of armature related animation data");
- RNA_def_property_ui_icon(prop, ICON_ARMATURE_DATA, 0);
+ RNA_def_property_ui_icon(prop, ICON_OUTLINER_OB_ARMATURE, 0);
RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
prop = RNA_def_property(srna, "show_nodes", PROP_BOOLEAN, PROP_NONE);
@@ -486,13 +486,13 @@ static void rna_def_dopesheet(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_speakers", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOSPK);
RNA_def_property_ui_text(prop, "Display Speaker", "Include visualization of speaker related animation data");
- RNA_def_property_ui_icon(prop, ICON_SPEAKER, 0);
+ RNA_def_property_ui_icon(prop, ICON_OUTLINER_OB_SPEAKER, 0);
RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
prop = RNA_def_property(srna, "show_gpencil", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOGPENCIL);
RNA_def_property_ui_text(prop, "Display Grease Pencil", "Include visualization of Grease Pencil related animation data and frames");
- RNA_def_property_ui_icon(prop, ICON_GREASEPENCIL, 0);
+ RNA_def_property_ui_icon(prop, ICON_OUTLINER_OB_GREASEPENCIL, 0);
RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
/* GPencil Mode Settings */
@@ -598,7 +598,7 @@ static void rna_def_action_fcurves(BlenderRNA *brna, PropertyRNA *cprop)
/* Action.fcurves.new(...) */
func = RNA_def_function(srna, "new", "rna_Action_fcurve_new");
RNA_def_function_ui_description(func, "Add an F-Curve to the action");
- RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_MAIN);
parm = RNA_def_string(func, "data_path", NULL, 0, "Data Path", "F-Curve data path to use");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "Array index", 0, INT_MAX);
diff --git a/source/blender/makesrna/intern/rna_animation.c b/source/blender/makesrna/intern/rna_animation.c
index 6b014f462b5..6c0ce6b124e 100644
--- a/source/blender/makesrna/intern/rna_animation.c
+++ b/source/blender/makesrna/intern/rna_animation.c
@@ -77,19 +77,26 @@ const EnumPropertyItem rna_enum_keying_flag_items[] = {
#include "BKE_nla.h"
#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
#include "DNA_object_types.h"
+#include "ED_anim_api.h"
+
#include "WM_api.h"
-static void rna_AnimData_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
+static void rna_AnimData_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
{
ID *id = ptr->id.data;
- /* tag for refresh so that scheduled updates (e.g. action changed) will
- * get computed and reflected in the scene [#34869]
- */
- DEG_id_tag_update(id, OB_RECALC_OB | OB_RECALC_DATA);
+ ANIM_id_update(bmain, id);
+}
+
+static void rna_AnimData_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ DEG_relations_tag_update(bmain);
+
+ rna_AnimData_update(bmain, scene, ptr);
}
static int rna_AnimData_action_editable(PointerRNA *ptr, const char **UNUSED(r_info))
@@ -106,17 +113,9 @@ static int rna_AnimData_action_editable(PointerRNA *ptr, const char **UNUSED(r_i
static void rna_AnimData_action_set(PointerRNA *ptr, PointerRNA value)
{
ID *ownerId = (ID *)ptr->id.data;
- AnimData *adt;
/* set action */
BKE_animdata_set_action(NULL, ownerId, value.data);
-
- /* force action to get evaluated [#34869] */
- adt = BKE_animdata_from_id(ownerId);
- if (adt) {
- adt->recalc |= ADT_RECALC_ANIM;
- DEG_id_tag_update(ownerId, OB_RECALC_TIME);
- }
}
static void rna_AnimData_tweakmode_set(PointerRNA *ptr, const bool value)
@@ -518,16 +517,19 @@ static void rna_KeyingSet_paths_clear(KeyingSet *keyingset, ReportList *reports)
}
/* needs wrapper function to push notifier */
-static NlaTrack *rna_NlaTrack_new(AnimData *adt, bContext *C, NlaTrack *track)
+static NlaTrack *rna_NlaTrack_new(ID *id, AnimData *adt, Main *bmain, bContext *C, NlaTrack *track)
{
NlaTrack *new_track = BKE_nlatrack_add(adt, track);
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_ADDED, NULL);
+ DEG_relations_tag_update(bmain);
+ DEG_id_tag_update_ex(bmain, id, DEG_TAG_TIME | DEG_TAG_COPY_ON_WRITE);
+
return new_track;
}
-static void rna_NlaTrack_remove(AnimData *adt, bContext *C, ReportList *reports, PointerRNA *track_ptr)
+static void rna_NlaTrack_remove(ID *id, AnimData *adt, Main *bmain, bContext *C, ReportList *reports, PointerRNA *track_ptr)
{
NlaTrack *track = track_ptr->data;
@@ -536,10 +538,13 @@ static void rna_NlaTrack_remove(AnimData *adt, bContext *C, ReportList *reports,
return;
}
- BKE_nlatrack_free(&adt->nla_tracks, track);
+ BKE_nlatrack_free(&adt->nla_tracks, track, true);
RNA_POINTER_INVALIDATE(track_ptr);
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_REMOVED, NULL);
+
+ DEG_relations_tag_update(bmain);
+ DEG_id_tag_update_ex(bmain, id, DEG_TAG_TIME | DEG_TAG_COPY_ON_WRITE);
}
static PointerRNA rna_NlaTrack_active_get(PointerRNA *ptr)
@@ -603,7 +608,7 @@ bool rna_AnimaData_override_apply(
if (adt_dst == NULL && adt_src != NULL) {
/* Copy anim data from reference into final local ID. */
- BKE_animdata_copy_id(NULL, ptr_dst->id.data, ptr_src->id.data, false, true);
+ BKE_animdata_copy_id(NULL, ptr_dst->id.data, ptr_src->id.data, 0);
return true;
}
else if (adt_dst != NULL && adt_src == NULL) {
@@ -964,7 +969,7 @@ static void rna_api_animdata_nla_tracks(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_struct_ui_text(srna, "NLA Tracks", "Collection of NLA Tracks");
func = RNA_def_function(srna, "new", "rna_NlaTrack_new");
- RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_MAIN | FUNC_USE_CONTEXT);
RNA_def_function_ui_description(func, "Add a new NLA Track");
RNA_def_pointer(func, "prev", "NlaTrack", "", "NLA Track to add the new one after");
/* return type */
@@ -972,7 +977,7 @@ static void rna_api_animdata_nla_tracks(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_return(func, parm);
func = RNA_def_function(srna, "remove", "rna_NlaTrack_remove");
- RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_CONTEXT);
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_REPORTS | FUNC_USE_MAIN | FUNC_USE_CONTEXT);
RNA_def_function_ui_description(func, "Remove a NLA Track");
parm = RNA_def_pointer(func, "track", "NlaTrack", "", "NLA Track to remove");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
@@ -1059,7 +1064,7 @@ static void rna_def_animdata(BlenderRNA *brna)
RNA_def_property_pointer_funcs(prop, NULL, "rna_AnimData_action_set", NULL, "rna_Action_id_poll");
RNA_def_property_editable_func(prop, "rna_AnimData_action_editable");
RNA_def_property_ui_text(prop, "Action", "Active Action for this data-block");
- RNA_def_property_update(prop, NC_ANIMATION | ND_NLA_ACTCHANGE, "rna_AnimData_update");
+ RNA_def_property_update(prop, NC_ANIMATION | ND_NLA_ACTCHANGE, "rna_AnimData_dependency_update");
/* Active Action Settings */
prop = RNA_def_property(srna, "action_extrapolation", PROP_ENUM, PROP_NONE);
@@ -1067,14 +1072,14 @@ static void rna_def_animdata(BlenderRNA *brna)
RNA_def_property_enum_items(prop, rna_enum_nla_mode_extend_items);
RNA_def_property_ui_text(prop, "Action Extrapolation",
"Action to take for gaps past the Active Action's range (when evaluating with NLA)");
- RNA_def_property_update(prop, NC_ANIMATION | ND_NLA, NULL);
+ RNA_def_property_update(prop, NC_ANIMATION | ND_NLA, "rna_AnimData_update");
prop = RNA_def_property(srna, "action_blend_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "act_blendmode");
RNA_def_property_enum_items(prop, rna_enum_nla_mode_blend_items);
RNA_def_property_ui_text(prop, "Action Blending",
"Method used for combining Active Action's result with result of NLA stack");
- RNA_def_property_update(prop, NC_ANIMATION | ND_NLA, NULL); /* this will do? */
+ RNA_def_property_update(prop, NC_ANIMATION | ND_NLA, "rna_AnimData_update"); /* this will do? */
prop = RNA_def_property(srna, "action_influence", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "act_influence");
@@ -1082,7 +1087,7 @@ static void rna_def_animdata(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Action Influence",
"Amount the Active Action contributes to the result of the NLA stack");
- RNA_def_property_update(prop, NC_ANIMATION | ND_NLA, NULL); /* this will do? */
+ RNA_def_property_update(prop, NC_ANIMATION | ND_NLA, "rna_AnimData_update"); /* this will do? */
/* Drivers */
prop = RNA_def_property(srna, "drivers", PROP_COLLECTION, PROP_NONE);
@@ -1097,13 +1102,13 @@ static void rna_def_animdata(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_nla", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ADT_NLA_EVAL_OFF);
RNA_def_property_ui_text(prop, "NLA Evaluation Enabled", "NLA stack is evaluated when evaluating this block");
- RNA_def_property_update(prop, NC_ANIMATION | ND_NLA, NULL); /* this will do? */
+ RNA_def_property_update(prop, NC_ANIMATION | ND_NLA, "rna_AnimData_update"); /* this will do? */
prop = RNA_def_property(srna, "use_tweak_mode", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ADT_NLA_EDIT_ON);
RNA_def_property_boolean_funcs(prop, NULL, "rna_AnimData_tweakmode_set");
RNA_def_property_ui_text(prop, "Use NLA Tweak Mode", "Whether to enable or disable tweak mode in NLA");
- RNA_def_property_update(prop, NC_ANIMATION | ND_NLA, NULL);
+ RNA_def_property_update(prop, NC_ANIMATION | ND_NLA, "rna_AnimData_update");
}
/* --- */
diff --git a/source/blender/makesrna/intern/rna_armature.c b/source/blender/makesrna/intern/rna_armature.c
index a44ccffdd05..c3e68cf0869 100644
--- a/source/blender/makesrna/intern/rna_armature.c
+++ b/source/blender/makesrna/intern/rna_armature.c
@@ -43,6 +43,7 @@
#ifdef RNA_RUNTIME
+#include "BKE_action.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_idprop.h"
@@ -351,7 +352,7 @@ static void rna_EditBone_name_set(PointerRNA *ptr, const char *value)
BLI_strncpy_utf8(newname, value, sizeof(ebone->name));
BLI_strncpy(oldname, ebone->name, sizeof(ebone->name));
- BLI_assert(BKE_id_is_in_gobal_main(&arm->id));
+ BLI_assert(BKE_id_is_in_global_main(&arm->id));
ED_armature_bone_rename(G_MAIN, arm, oldname, newname);
}
@@ -365,7 +366,7 @@ static void rna_Bone_name_set(PointerRNA *ptr, const char *value)
BLI_strncpy_utf8(newname, value, sizeof(bone->name));
BLI_strncpy(oldname, bone->name, sizeof(bone->name));
- BLI_assert(BKE_id_is_in_gobal_main(&arm->id));
+ BLI_assert(BKE_id_is_in_global_main(&arm->id));
ED_armature_bone_rename(G_MAIN, arm, oldname, newname);
}
@@ -449,6 +450,82 @@ static void rna_EditBone_matrix_set(PointerRNA *ptr, const float *values)
ED_armature_ebone_from_mat4(ebone, (float(*)[4])values);
}
+static void rna_Bone_bbone_handle_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ bArmature *arm = (bArmature *)ptr->id.data;
+ Bone *bone = (Bone *)ptr->data;
+
+ /* Update all users of this armature after changing B-Bone handles. */
+ for (Object *obt = bmain->object.first; obt; obt = obt->id.next) {
+ if (obt->data == arm && obt->pose) {
+ bPoseChannel *pchan = BKE_pose_channel_find_name(obt->pose, bone->name);
+
+ if (pchan && pchan->bone == bone) {
+ BKE_pchan_rebuild_bbone_handles(obt->pose, pchan);
+ DEG_id_tag_update(&obt->id, DEG_TAG_COPY_ON_WRITE);
+ }
+ }
+ }
+
+ rna_Armature_dependency_update(bmain, scene, ptr);
+}
+
+static PointerRNA rna_EditBone_bbone_prev_get(PointerRNA *ptr)
+{
+ EditBone *data = (EditBone *)(ptr->data);
+ return rna_pointer_inherit_refine(ptr, &RNA_EditBone, data->bbone_prev);
+}
+
+static void rna_EditBone_bbone_prev_set(PointerRNA *ptr, PointerRNA value)
+{
+ EditBone *ebone = (EditBone *)(ptr->data);
+ EditBone *hbone = (EditBone *)value.data;
+
+ /* Within the same armature? */
+ if (hbone == NULL || value.id.data == ptr->id.data) {
+ ebone->bbone_prev = hbone;
+ }
+}
+
+static void rna_Bone_bbone_prev_set(PointerRNA *ptr, PointerRNA value)
+{
+ Bone *bone = (Bone *)ptr->data;
+ Bone *hbone = (Bone *)value.data;
+
+ /* Within the same armature? */
+ if (hbone == NULL || value.id.data == ptr->id.data) {
+ bone->bbone_prev = hbone;
+ }
+}
+
+static PointerRNA rna_EditBone_bbone_next_get(PointerRNA *ptr)
+{
+ EditBone *data = (EditBone *)(ptr->data);
+ return rna_pointer_inherit_refine(ptr, &RNA_EditBone, data->bbone_next);
+}
+
+static void rna_EditBone_bbone_next_set(PointerRNA *ptr, PointerRNA value)
+{
+ EditBone *ebone = (EditBone *)(ptr->data);
+ EditBone *hbone = (EditBone *)value.data;
+
+ /* Within the same armature? */
+ if (hbone == NULL || value.id.data == ptr->id.data) {
+ ebone->bbone_next = hbone;
+ }
+}
+
+static void rna_Bone_bbone_next_set(PointerRNA *ptr, PointerRNA value)
+{
+ Bone *bone = (Bone *)ptr->data;
+ Bone *hbone = (Bone *)value.data;
+
+ /* Within the same armature? */
+ if (hbone == NULL || value.id.data == ptr->id.data) {
+ bone->bbone_next = hbone;
+ }
+}
+
static void rna_Armature_editbone_transform_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
bArmature *arm = (bArmature *)ptr->id.data;
@@ -617,6 +694,14 @@ void rna_def_bone_curved_common(StructRNA *srna, bool is_posebone)
static void rna_def_bone_common(StructRNA *srna, int editbone)
{
+ static const EnumPropertyItem prop_bbone_handle_type[] = {
+ {BBONE_HANDLE_AUTO, "AUTO", 0, "Automatic", "Use connected parent and children to compute the handle"},
+ {BBONE_HANDLE_ABSOLUTE, "ABSOLUTE", 0, "Absolute", "Use the position of the specified bone to compute the handle"},
+ {BBONE_HANDLE_RELATIVE, "RELATIVE", 0, "Relative", "Use the offset of the specified bone from rest pose to compute the handle"},
+ {BBONE_HANDLE_TANGENT, "TANGENT", 0, "Tangent", "Use the orientation of the specified bone to compute the handle, ignoring the location"},
+ {0, NULL, 0, NULL, NULL}
+ };
+
PropertyRNA *prop;
/* strings */
@@ -677,7 +762,7 @@ static void rna_def_bone_common(StructRNA *srna, int editbone)
prop = RNA_def_property(srna, "show_wire", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_DRAWWIRE);
- RNA_def_property_ui_text(prop, "Draw Wire",
+ RNA_def_property_ui_text(prop, "Display Wire",
"Bone is always drawn as Wireframe regardless of viewport draw mode "
"(useful for non-obstructive custom bone shapes)");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
@@ -745,6 +830,50 @@ static void rna_def_bone_common(StructRNA *srna, int editbone)
RNA_def_property_range(prop, 0.0f, 1000.0f);
RNA_def_property_ui_text(prop, "B-Bone Display Z Width", "B-Bone Z size");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
+
+ prop = RNA_def_property(srna, "bbone_handle_type_start", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "bbone_prev_type");
+ RNA_def_property_enum_items(prop, prop_bbone_handle_type);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_ui_text(prop, "B-Bone Start Handle Type", "Selects how the start handle of the B-Bone is computed");
+ RNA_def_property_update(prop, 0, "rna_Armature_dependency_update");
+
+ prop = RNA_def_property(srna, "bbone_custom_handle_start", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "bbone_prev");
+ RNA_def_property_struct_type(prop, editbone ? "EditBone" : "Bone");
+ if (editbone) {
+ RNA_def_property_pointer_funcs(prop, "rna_EditBone_bbone_prev_get", "rna_EditBone_bbone_prev_set", NULL, NULL);
+ RNA_def_property_update(prop, 0, "rna_Armature_dependency_update");
+ }
+ else {
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Bone_bbone_prev_set", NULL, NULL);
+ RNA_def_property_update(prop, 0, "rna_Bone_bbone_handle_update");
+ }
+ RNA_def_property_flag(prop, PROP_EDITABLE | PROP_PTR_NO_OWNERSHIP);
+ RNA_def_property_ui_text(prop, "B-Bone Start Handle",
+ "Bone that serves as the start handle for the B-Bone curve");
+
+ prop = RNA_def_property(srna, "bbone_handle_type_end", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "bbone_next_type");
+ RNA_def_property_enum_items(prop, prop_bbone_handle_type);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_ui_text(prop, "B-Bone End Handle Type", "Selects how the end handle of the B-Bone is computed");
+ RNA_def_property_update(prop, 0, "rna_Armature_dependency_update");
+
+ prop = RNA_def_property(srna, "bbone_custom_handle_end", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "bbone_next");
+ RNA_def_property_struct_type(prop, editbone ? "EditBone" : "Bone");
+ if (editbone) {
+ RNA_def_property_pointer_funcs(prop, "rna_EditBone_bbone_next_get", "rna_EditBone_bbone_next_set", NULL, NULL);
+ RNA_def_property_update(prop, 0, "rna_Armature_dependency_update");
+ }
+ else {
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Bone_bbone_next_set", NULL, NULL);
+ RNA_def_property_update(prop, 0, "rna_Bone_bbone_handle_update");
+ }
+ RNA_def_property_flag(prop, PROP_EDITABLE | PROP_PTR_NO_OWNERSHIP);
+ RNA_def_property_ui_text(prop, "B-Bone End Handle",
+ "Bone that serves as the end handle for the B-Bone curve");
}
/* err... bones should not be directly edited (only editbones should be...) */
@@ -924,7 +1053,7 @@ static void rna_def_edit_bone(BlenderRNA *brna)
/* calculated and read only, not actual data access */
prop = RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
- /*RNA_def_property_float_sdna(prop, NULL, ""); *//* doesnt access any real data */
+ /*RNA_def_property_float_sdna(prop, NULL, ""); *//* doesn't access any real data */
RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
//RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_flag(prop, PROP_THICK_WRAP); /* no reference to original data */
@@ -1077,10 +1206,10 @@ static void rna_def_armature(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
- prop = RNA_def_property(srna, "draw_type", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "display_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "drawtype");
RNA_def_property_enum_items(prop, prop_drawtype_items);
- RNA_def_property_ui_text(prop, "Draw Type", "");
+ RNA_def_property_ui_text(prop, "Display Type Type", "");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
@@ -1115,13 +1244,13 @@ static void rna_def_armature(BlenderRNA *brna)
/* flag */
prop = RNA_def_property(srna, "show_axes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_DRAWAXES);
- RNA_def_property_ui_text(prop, "Draw Axes", "Draw bone axes");
+ RNA_def_property_ui_text(prop, "Display Axes", "Display bone axes");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
prop = RNA_def_property(srna, "show_names", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_DRAWNAMES);
- RNA_def_property_ui_text(prop, "Draw Names", "Draw bone names");
+ RNA_def_property_ui_text(prop, "Display Names", "Display bone names");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
@@ -1144,18 +1273,18 @@ static void rna_def_armature(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_bone_custom_shapes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ARM_NO_CUSTOM);
- RNA_def_property_ui_text(prop, "Draw Custom Bone Shapes", "Draw bones with their custom shapes");
+ RNA_def_property_ui_text(prop, "Display Custom Bone Shapes", "Display bones with their custom shapes");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop = RNA_def_property(srna, "show_group_colors", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_COL_CUSTOM);
- RNA_def_property_ui_text(prop, "Draw Bone Group Colors", "Draw bone group colors");
+ RNA_def_property_ui_text(prop, "Display Bone Group Colors", "Display bone group colors");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
/* XXX deprecated ....... old animviz for armatures only */
prop = RNA_def_property(srna, "show_only_ghost_selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_GHOST_ONLYSEL);
- RNA_def_property_ui_text(prop, "Draw Ghosts on Selected Bones Only", "");
+ RNA_def_property_ui_text(prop, "Display Ghosts on Selected Bones Only", "");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
/* XXX deprecated ....... old animviz for armatures only */
diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c
index 680ed346b54..d263ead29b3 100644
--- a/source/blender/makesrna/intern/rna_brush.c
+++ b/source/blender/makesrna/intern/rna_brush.c
@@ -46,8 +46,8 @@
#include "WM_types.h"
static const EnumPropertyItem prop_direction_items[] = {
- {0, "ADD", ICON_ZOOMIN, "Add", "Add effect of brush"},
- {BRUSH_DIR_IN, "SUBTRACT", ICON_ZOOMOUT, "Subtract", "Subtract effect of brush"},
+ {0, "ADD", ICON_ADD, "Add", "Add effect of brush"},
+ {BRUSH_DIR_IN, "SUBTRACT", ICON_REMOVE, "Subtract", "Subtract effect of brush"},
{0, NULL, 0, NULL, NULL}
};
@@ -65,52 +65,44 @@ static const EnumPropertyItem sculpt_stroke_method_items[] = {
const EnumPropertyItem rna_enum_brush_sculpt_tool_items[] = {
- {SCULPT_TOOL_BLOB, "BLOB", ICON_BRUSH_BLOB, "Blob", ""},
+ {SCULPT_TOOL_DRAW, "DRAW", ICON_BRUSH_SCULPT_DRAW, "Draw", ""},
{SCULPT_TOOL_CLAY, "CLAY", ICON_BRUSH_CLAY, "Clay", ""},
{SCULPT_TOOL_CLAY_STRIPS, "CLAY_STRIPS", ICON_BRUSH_CLAY_STRIPS, "Clay Strips", ""},
+ {SCULPT_TOOL_LAYER, "LAYER", ICON_BRUSH_LAYER, "Layer", ""},
+ {SCULPT_TOOL_INFLATE, "INFLATE", ICON_BRUSH_INFLATE, "Inflate", ""},
+ {SCULPT_TOOL_BLOB, "BLOB", ICON_BRUSH_BLOB, "Blob", ""},
{SCULPT_TOOL_CREASE, "CREASE", ICON_BRUSH_CREASE, "Crease", ""},
- {SCULPT_TOOL_DRAW, "DRAW", ICON_BRUSH_SCULPT_DRAW, "Draw", ""},
- {SCULPT_TOOL_FILL, "FILL", ICON_BRUSH_FILL, "Fill", ""},
+ {0, "", 0, NULL, NULL},
+ {SCULPT_TOOL_SMOOTH, "SMOOTH", ICON_BRUSH_SMOOTH, "Smooth", ""},
{SCULPT_TOOL_FLATTEN, "FLATTEN", ICON_BRUSH_FLATTEN, "Flatten", ""},
+ {SCULPT_TOOL_FILL, "FILL", ICON_BRUSH_FILL, "Fill", ""},
+ {SCULPT_TOOL_SCRAPE, "SCRAPE", ICON_BRUSH_SCRAPE, "Scrape", ""},
+ {SCULPT_TOOL_PINCH, "PINCH", ICON_BRUSH_PINCH, "Pinch", ""},
+ {0, "", 0, NULL, NULL},
{SCULPT_TOOL_GRAB, "GRAB", ICON_BRUSH_GRAB, "Grab", ""},
- {SCULPT_TOOL_INFLATE, "INFLATE", ICON_BRUSH_INFLATE, "Inflate", ""},
- {SCULPT_TOOL_LAYER, "LAYER", ICON_BRUSH_LAYER, "Layer", ""},
- {SCULPT_TOOL_MASK, "MASK", ICON_BRUSH_MASK, "Mask", ""},
+ {SCULPT_TOOL_SNAKE_HOOK, "SNAKE_HOOK", ICON_BRUSH_SNAKE_HOOK, "Snake Hook", ""},
+ {SCULPT_TOOL_THUMB, "THUMB", ICON_BRUSH_THUMB, "Thumb", ""},
{SCULPT_TOOL_NUDGE, "NUDGE", ICON_BRUSH_NUDGE, "Nudge", ""},
- {SCULPT_TOOL_PINCH, "PINCH", ICON_BRUSH_PINCH, "Pinch", ""},
{SCULPT_TOOL_ROTATE, "ROTATE", ICON_BRUSH_ROTATE, "Rotate", ""},
- {SCULPT_TOOL_SCRAPE, "SCRAPE", ICON_BRUSH_SCRAPE, "Scrape", ""},
+ {0, "", 0, NULL, NULL},
+ {SCULPT_TOOL_MASK, "MASK", ICON_BRUSH_MASK, "Mask", ""},
{SCULPT_TOOL_SIMPLIFY, "SIMPLIFY", ICON_BRUSH_SUBTRACT /* icon TODO */, "Simplify", ""},
- {SCULPT_TOOL_SMOOTH, "SMOOTH", ICON_BRUSH_SMOOTH, "Smooth", ""},
- {SCULPT_TOOL_SNAKE_HOOK, "SNAKE_HOOK", ICON_BRUSH_SNAKE_HOOK, "Snake Hook", ""},
- {SCULPT_TOOL_THUMB, "THUMB", ICON_BRUSH_THUMB, "Thumb", ""},
{0, NULL, 0, NULL, NULL}
};
-
const EnumPropertyItem rna_enum_brush_vertex_tool_items[] = {
- {PAINT_BLEND_MIX, "MIX", ICON_BRUSH_MIX, "Mix", "Use mix blending mode while painting"},
- {PAINT_BLEND_ADD, "ADD", ICON_BRUSH_ADD, "Add", "Use add blending mode while painting"},
- {PAINT_BLEND_SUB, "SUB", ICON_BRUSH_SUBTRACT, "Subtract", "Use subtract blending mode while painting"},
- {PAINT_BLEND_MUL, "MUL", ICON_BRUSH_MULTIPLY, "Multiply", "Use multiply blending mode while painting"},
- {PAINT_BLEND_BLUR, "BLUR", ICON_BRUSH_BLUR, "Blur", "Blur the color with surrounding values"},
- {PAINT_BLEND_LIGHTEN, "LIGHTEN", ICON_BRUSH_LIGHTEN, "Lighten", "Use lighten blending mode while painting"},
- {PAINT_BLEND_DARKEN, "DARKEN", ICON_BRUSH_DARKEN, "Darken", "Use darken blending mode while painting"},
- {PAINT_BLEND_AVERAGE, "AVERAGE", ICON_BRUSH_BLUR, "Average", "Use average blending mode while painting"},
- {PAINT_BLEND_SMEAR, "SMEAR", ICON_BRUSH_BLUR, "Smear", "Use smear blending mode while painting"},
- {PAINT_BLEND_COLORDODGE, "COLORDODGE", ICON_BRUSH_BLUR, "Color Dodge", "Use color dodge blending mode while painting" },
- {PAINT_BLEND_DIFFERENCE, "DIFFERENCE", ICON_BRUSH_BLUR, "Difference", "Use difference blending mode while painting"},
- {PAINT_BLEND_SCREEN, "SCREEN", ICON_BRUSH_BLUR, "Screen", "Use screen blending mode while painting"},
- {PAINT_BLEND_HARDLIGHT, "HARDLIGHT", ICON_BRUSH_BLUR, "Hardlight", "Use hardlight blending mode while painting"},
- {PAINT_BLEND_OVERLAY, "OVERLAY", ICON_BRUSH_BLUR, "Overlay", "Use overlay blending mode while painting"},
- {PAINT_BLEND_SOFTLIGHT, "SOFTLIGHT", ICON_BRUSH_BLUR, "Softlight", "Use softlight blending mode while painting"},
- {PAINT_BLEND_EXCLUSION, "EXCLUSION", ICON_BRUSH_BLUR, "Exclusion", "Use exclusion blending mode while painting"},
- {PAINT_BLEND_LUMINOCITY, "LUMINOCITY", ICON_BRUSH_BLUR, "Luminocity", "Use luminocity blending mode while painting"},
- {PAINT_BLEND_SATURATION, "SATURATION", ICON_BRUSH_BLUR, "Saturation", "Use saturation blending mode while painting"},
- {PAINT_BLEND_HUE, "HUE", ICON_BRUSH_BLUR, "Hue", "Use hue blending mode while painting"},
- {PAINT_BLEND_ALPHA_SUB, "ERASE_ALPHA", 0, "Erase Alpha", "Erase alpha while painting"},
- {PAINT_BLEND_ALPHA_ADD, "ADD_ALPHA", 0, "Add Alpha", "Add alpha while painting"},
+ {VPAINT_TOOL_DRAW, "DRAW", ICON_BRUSH_MIX, "Draw", ""},
+ {VPAINT_TOOL_BLUR, "BLUR", ICON_BRUSH_BLUR, "Blur", ""},
+ {VPAINT_TOOL_AVERAGE, "AVERAGE", ICON_BRUSH_BLUR, "Average", ""},
+ {VPAINT_TOOL_SMEAR, "SMEAR", ICON_BRUSH_BLUR, "Smear", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+const EnumPropertyItem rna_enum_brush_weight_tool_items[] = {
+ {WPAINT_TOOL_DRAW, "DRAW", ICON_BRUSH_MIX, "Draw", ""},
+ {WPAINT_TOOL_BLUR, "BLUR", ICON_BRUSH_BLUR, "Blur", ""},
+ {WPAINT_TOOL_AVERAGE, "AVERAGE", ICON_BRUSH_BLUR, "Average", ""},
+ {WPAINT_TOOL_SMEAR, "SMEAR", ICON_BRUSH_BLUR, "Smear", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -124,40 +116,40 @@ const EnumPropertyItem rna_enum_brush_image_tool_items[] = {
{0, NULL, 0, NULL, NULL}
};
-#ifndef RNA_RUNTIME
-static EnumPropertyItem rna_enum_gpencil_brush_types_items[] = {
- { GP_BRUSH_TYPE_DRAW, "DRAW", ICON_GREASEPENCIL_STROKE_PAINT, "Draw", "The brush is of type used for drawing strokes" },
- { GP_BRUSH_TYPE_FILL, "FILL", ICON_COLOR, "Fill", "The brush is of type used for filling areas" },
- { GP_BRUSH_TYPE_ERASE, "ERASE", ICON_PANEL_CLOSE, "Erase", "The brush is used for erasing strokes" },
- { 0, NULL, 0, NULL, NULL }
+const EnumPropertyItem rna_enum_brush_gpencil_types_items[] = {
+ {GPAINT_TOOL_DRAW, "DRAW", ICON_GP_STROKE, "Draw", "The brush is of type used for drawing strokes"},
+ {GPAINT_TOOL_FILL, "FILL", ICON_COLOR, "Fill", "The brush is of type used for filling areas"},
+ {GPAINT_TOOL_ERASE, "ERASE", ICON_PANEL_CLOSE, "Erase", "The brush is used for erasing strokes"},
+ {0, NULL, 0, NULL, NULL}
};
+#ifndef RNA_RUNTIME
static EnumPropertyItem rna_enum_gpencil_brush_eraser_modes_items[] = {
- { GP_BRUSH_ERASER_SOFT, "SOFT", 0, "Soft", "Use soft eraser" },
- { GP_BRUSH_ERASER_HARD, "HARD", 0, "Hard", "Use hard eraser" },
- { GP_BRUSH_ERASER_STROKE, "STROKE", 0, "Stroke", "Use stroke eraser" },
- { 0, NULL, 0, NULL, NULL }
+ {GP_BRUSH_ERASER_SOFT, "SOFT", 0, "Soft", "Use soft eraser"},
+ {GP_BRUSH_ERASER_HARD, "HARD", 0, "Hard", "Use hard eraser"},
+ {GP_BRUSH_ERASER_STROKE, "STROKE", 0, "Stroke", "Use stroke eraser"},
+ {0, NULL, 0, NULL, NULL}
};
static EnumPropertyItem rna_enum_gpencil_fill_draw_modes_items[] = {
- { GP_FILL_DMODE_STROKE, "STROKE", 0, "Strokes", "Use visible strokes as fill boundary limits" },
- { GP_FILL_DMODE_CONTROL, "CONTROL", 0, "Control", "Use internal control lines as fill boundary limits" },
- { GP_FILL_DMODE_BOTH, "BOTH", 0, "Both", "Use visible strokes and control lines as fill boundary limits" },
- { 0, NULL, 0, NULL, NULL }
+ {GP_FILL_DMODE_STROKE, "STROKE", 0, "Strokes", "Use visible strokes as fill boundary limits"},
+ {GP_FILL_DMODE_CONTROL, "CONTROL", 0, "Control", "Use internal control lines as fill boundary limits"},
+ {GP_FILL_DMODE_BOTH, "BOTH", 0, "Both", "Use visible strokes and control lines as fill boundary limits"},
+ {0, NULL, 0, NULL, NULL}
};
static EnumPropertyItem rna_enum_gpencil_brush_icons_items[] = {
- { GP_BRUSH_ICON_PENCIL, "PENCIL", ICON_GPBRUSH_PENCIL, "Pencil", "" },
- { GP_BRUSH_ICON_PEN, "PEN", ICON_GPBRUSH_PEN, "Pen", "" },
- { GP_BRUSH_ICON_INK, "INK", ICON_GPBRUSH_INK, "Ink", "" },
- { GP_BRUSH_ICON_INKNOISE, "INKNOISE", ICON_GPBRUSH_INKNOISE, "Ink Noise", "" },
- { GP_BRUSH_ICON_BLOCK, "BLOCK", ICON_GPBRUSH_BLOCK, "Block", "" },
- { GP_BRUSH_ICON_MARKER, "MARKER", ICON_GPBRUSH_MARKER, "Marker", "" },
- { GP_BRUSH_ICON_FILL, "FILL", ICON_GPBRUSH_FILL, "Fill", "" },
- { GP_BRUSH_ICON_ERASE_SOFT, "SOFT", ICON_GPBRUSH_ERASE_SOFT, "Eraser Soft", "" },
- { GP_BRUSH_ICON_ERASE_HARD, "HARD", ICON_GPBRUSH_ERASE_HARD, "Eraser Hard", "" },
- { GP_BRUSH_ICON_ERASE_STROKE, "STROKE", ICON_GPBRUSH_ERASE_STROKE, "Eraser Stroke", "" },
- { 0, NULL, 0, NULL, NULL }
+ {GP_BRUSH_ICON_PENCIL, "PENCIL", ICON_GPBRUSH_PENCIL, "Pencil", ""},
+ {GP_BRUSH_ICON_PEN, "PEN", ICON_GPBRUSH_PEN, "Pen", ""},
+ {GP_BRUSH_ICON_INK, "INK", ICON_GPBRUSH_INK, "Ink", ""},
+ {GP_BRUSH_ICON_INKNOISE, "INKNOISE", ICON_GPBRUSH_INKNOISE, "Ink Noise", ""},
+ {GP_BRUSH_ICON_BLOCK, "BLOCK", ICON_GPBRUSH_BLOCK, "Block", ""},
+ {GP_BRUSH_ICON_MARKER, "MARKER", ICON_GPBRUSH_MARKER, "Marker", ""},
+ {GP_BRUSH_ICON_FILL, "FILL", ICON_GPBRUSH_FILL, "Fill", ""},
+ {GP_BRUSH_ICON_ERASE_SOFT, "SOFT", ICON_GPBRUSH_ERASE_SOFT, "Eraser Soft", ""},
+ {GP_BRUSH_ICON_ERASE_HARD, "HARD", ICON_GPBRUSH_ERASE_HARD, "Eraser Hard", ""},
+ {GP_BRUSH_ICON_ERASE_STROKE, "STROKE", ICON_GPBRUSH_ERASE_STROKE, "Eraser Stroke", ""},
+ {0, NULL, 0, NULL, NULL}
};
#endif
@@ -390,7 +382,7 @@ static PointerRNA rna_Brush_capabilities_get(PointerRNA *ptr)
return rna_pointer_inherit_refine(ptr, &RNA_BrushCapabilities, ptr->id.data);
}
-static void rna_Brush_reset_icon(Brush *br, const char *UNUSED(type))
+static void rna_Brush_reset_icon(Brush *br)
{
ID *id = &br->id;
@@ -463,24 +455,10 @@ static void rna_Brush_size_update(Main *bmain, Scene *scene, PointerRNA *ptr)
rna_Brush_update(bmain, scene, ptr);
}
-static void rna_Brush_sculpt_tool_update(Main *bmain, Scene *scene, PointerRNA *ptr)
-{
- Brush *br = (Brush *)ptr->data;
- rna_Brush_reset_icon(br, "sculpt");
- rna_Brush_update(bmain, scene, ptr);
-}
-
-static void rna_Brush_vertex_tool_update(Main *bmain, Scene *scene, PointerRNA *ptr)
-{
- Brush *br = (Brush *)ptr->data;
- rna_Brush_reset_icon(br, "vertex_paint");
- rna_Brush_update(bmain, scene, ptr);
-}
-
-static void rna_Brush_imagepaint_tool_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_Brush_update_and_reset_icon(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- Brush *br = (Brush *)ptr->data;
- rna_Brush_reset_icon(br, "image_paint");
+ Brush *br = ptr->data;
+ rna_Brush_reset_icon(br);
rna_Brush_update(bmain, scene, ptr);
}
@@ -508,33 +486,6 @@ static void rna_Brush_icon_update(Main *UNUSED(bmain), Scene *UNUSED(scene), Poi
WM_main_add_notifier(NC_BRUSH | NA_EDITED, br);
}
-static const EnumPropertyItem *rna_DynamicGpencil_type_itemf(
- bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free)
-{
- Main *bmain = CTX_data_main(C);
- EnumPropertyItem *item = NULL, item_tmp = { 0 };
- int totitem = 0;
- int i = 0;
-
- Brush *brush;
- for (brush = bmain->brush.first; brush; brush = brush->id.next, i++) {
- if (brush->gpencil_settings == NULL)
- continue;
-
- item_tmp.identifier = brush->id.name + 2;
- item_tmp.name = brush->id.name + 2;
- item_tmp.value = i;
- item_tmp.icon = brush->gpencil_settings->icon_id;
-
- RNA_enum_item_add(&item, &totitem, &item_tmp);
- }
-
- RNA_enum_item_end(&item, &totitem);
- *r_free = true;
-
- return item;
-}
-
static void rna_TextureSlot_brush_angle_update(bContext *C, PointerRNA *ptr)
{
Scene *scene = CTX_data_scene(C);
@@ -589,39 +540,39 @@ static const EnumPropertyItem *rna_Brush_direction_itemf(bContext *C, PointerRNA
/* sculpt mode */
static const EnumPropertyItem prop_flatten_contrast_items[] = {
- {BRUSH_DIR_IN, "CONTRAST", ICON_ZOOMIN, "Contrast", "Subtract effect of brush"},
- {0, "FLATTEN", ICON_ZOOMOUT, "Flatten", "Add effect of brush"},
+ {BRUSH_DIR_IN, "CONTRAST", ICON_ADD, "Contrast", "Subtract effect of brush"},
+ {0, "FLATTEN", ICON_REMOVE, "Flatten", "Add effect of brush"},
{0, NULL, 0, NULL, NULL}
};
static const EnumPropertyItem prop_fill_deepen_items[] = {
- {0, "FILL", ICON_ZOOMIN, "Fill", "Add effect of brush"},
- {BRUSH_DIR_IN, "DEEPEN", ICON_ZOOMOUT, "Deepen", "Subtract effect of brush"},
+ {0, "FILL", ICON_ADD, "Fill", "Add effect of brush"},
+ {BRUSH_DIR_IN, "DEEPEN", ICON_REMOVE, "Deepen", "Subtract effect of brush"},
{0, NULL, 0, NULL, NULL}
};
static const EnumPropertyItem prop_scrape_peaks_items[] = {
- {0, "SCRAPE", ICON_ZOOMIN, "Scrape", "Add effect of brush"},
- {BRUSH_DIR_IN, "PEAKS", ICON_ZOOMOUT, "Peaks", "Subtract effect of brush"},
+ {0, "SCRAPE", ICON_ADD, "Scrape", "Add effect of brush"},
+ {BRUSH_DIR_IN, "PEAKS", ICON_REMOVE, "Peaks", "Subtract effect of brush"},
{0, NULL, 0, NULL, NULL}
};
static const EnumPropertyItem prop_pinch_magnify_items[] = {
- {BRUSH_DIR_IN, "MAGNIFY", ICON_ZOOMIN, "Magnify", "Subtract effect of brush"},
- {0, "PINCH", ICON_ZOOMOUT, "Pinch", "Add effect of brush"},
+ {BRUSH_DIR_IN, "MAGNIFY", ICON_ADD, "Magnify", "Subtract effect of brush"},
+ {0, "PINCH", ICON_REMOVE, "Pinch", "Add effect of brush"},
{0, NULL, 0, NULL, NULL}
};
static const EnumPropertyItem prop_inflate_deflate_items[] = {
- {0, "INFLATE", ICON_ZOOMIN, "Inflate", "Add effect of brush"},
- {BRUSH_DIR_IN, "DEFLATE", ICON_ZOOMOUT, "Deflate", "Subtract effect of brush"},
+ {0, "INFLATE", ICON_ADD, "Inflate", "Add effect of brush"},
+ {BRUSH_DIR_IN, "DEFLATE", ICON_REMOVE, "Deflate", "Subtract effect of brush"},
{0, NULL, 0, NULL, NULL}
};
/* texture paint mode */
static const EnumPropertyItem prop_soften_sharpen_items[] = {
- {BRUSH_DIR_IN, "SHARPEN", ICON_ZOOMIN, "Sharpen", "Sharpen effect of brush"},
- {0, "SOFTEN", ICON_ZOOMOUT, "Soften", "Blur effect of brush"},
+ {BRUSH_DIR_IN, "SHARPEN", ICON_ADD, "Sharpen", "Sharpen effect of brush"},
+ {0, "SOFTEN", ICON_REMOVE, "Soften", "Blur effect of brush"},
{0, NULL, 0, NULL, NULL}
};
@@ -670,7 +621,7 @@ static const EnumPropertyItem *rna_Brush_direction_itemf(bContext *C, PointerRNA
}
case ePaintTexture2D:
- case ePaintTextureProjective:
+ case ePaintTexture3D:
switch (me->imagepaint_tool) {
case PAINT_TOOL_SOFTEN:
return prop_soften_sharpen_items;
@@ -701,7 +652,7 @@ static const EnumPropertyItem *rna_Brush_stroke_itemf(bContext *C, PointerRNA *U
switch (mode) {
case ePaintSculpt:
case ePaintTexture2D:
- case ePaintTextureProjective:
+ case ePaintTexture3D:
return sculpt_stroke_method_items;
default:
@@ -710,6 +661,11 @@ static const EnumPropertyItem *rna_Brush_stroke_itemf(bContext *C, PointerRNA *U
}
/* Grease Pencil Drawing Brushes Settings */
+static char *rna_BrushGpencilSettings_path(PointerRNA *UNUSED(ptr))
+{
+ return BLI_strdup("tool_settings.gpencil_paint.brush.gpencil_settings");
+}
+
static void rna_BrushGpencilSettings_default_eraser_update(Main *bmain, Scene *scene, PointerRNA *UNUSED(ptr))
{
ToolSettings *ts = scene->toolsettings;
@@ -720,7 +676,7 @@ static void rna_BrushGpencilSettings_default_eraser_update(Main *bmain, Scene *s
for (Brush *brush = bmain->brush.first; brush; brush = brush->id.next) {
if ((brush != brush_cur) &&
(brush->ob_mode == OB_MODE_GPENCIL_PAINT) &&
- (brush->gpencil_settings->brush_type == GP_BRUSH_TYPE_ERASE))
+ (brush->gpencil_tool == GPAINT_TOOL_ERASE))
{
brush->gpencil_settings->flag &= ~GP_BRUSH_DEFAULT_ERASER;
}
@@ -734,7 +690,7 @@ static void rna_BrushGpencilSettings_eraser_mode_update(Main *UNUSED(bmain), Sce
Brush *brush = paint->brush;
/* set eraser icon */
- if ((brush) && (brush->gpencil_settings->brush_type == GP_BRUSH_TYPE_ERASE)) {
+ if ((brush) && (brush->gpencil_tool == GPAINT_TOOL_ERASE)) {
switch (brush->gpencil_settings->eraser_mode) {
case GP_BRUSH_ERASER_SOFT:
brush->gpencil_settings->icon_id = GP_BRUSH_ICON_ERASE_SOFT;
@@ -959,26 +915,11 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- /* Grease Pencil Drawing - generated dynamically */
- static const EnumPropertyItem prop_dynamic_gpencil_type[] = {
- {1, "DRAW", 0, "Draw", ""},
- {0, NULL, 0, NULL, NULL}
- };
-
srna = RNA_def_struct(brna, "BrushGpencilSettings", NULL);
RNA_def_struct_sdna(srna, "BrushGpencilSettings");
+ RNA_def_struct_path_func(srna, "rna_BrushGpencilSettings_path");
RNA_def_struct_ui_text(srna, "Grease Pencil Brush Settings", "Settings for grease pencil brush");
- /* grease pencil drawing brushes */
- prop = RNA_def_property(srna, "grease_pencil_tool", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "brush_type");
- RNA_def_property_enum_items(prop, prop_dynamic_gpencil_type);
- RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_DynamicGpencil_type_itemf");
- RNA_def_property_ui_text(prop, "Grease Pencil Tool", "");
- /* TODO: GPXX review update */
- RNA_def_property_update(prop, 0, NULL);
- //RNA_def_property_update(prop, 0, "rna_Brush_gpencil_tool_update");
-
/* Sensitivity factor for new strokes */
prop = RNA_def_property(srna, "pen_sensitivity_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "draw_sensitivity");
@@ -988,9 +929,10 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
/* Strength factor for new strokes */
- prop = RNA_def_property(srna, "pen_strength", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "pen_strength", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "draw_strength");
RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 3);
RNA_def_property_ui_text(prop, "Strength", "Color strength for new strokes (affect alpha factor of color)");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
@@ -1114,7 +1056,7 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
/* fill threshold for transparence */
- prop = RNA_def_property(srna, "gpencil_fill_threshold", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "fill_threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fill_threshold");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Threshold",
@@ -1123,7 +1065,7 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
/* fill leak size */
- prop = RNA_def_property(srna, "gpencil_fill_leak", PROP_INT, PROP_PIXEL);
+ prop = RNA_def_property(srna, "fill_leak", PROP_INT, PROP_PIXEL);
RNA_def_property_int_sdna(prop, NULL, "fill_leak");
RNA_def_property_range(prop, 0, 100);
RNA_def_property_ui_text(prop, "Leak Size",
@@ -1132,7 +1074,7 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
/* fill simplify steps */
- prop = RNA_def_property(srna, "gpencil_fill_simplyfy_level", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "fill_simplify_level", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "fill_simplylvl");
RNA_def_property_range(prop, 0, 10);
RNA_def_property_ui_text(prop, "Simplify",
@@ -1163,6 +1105,24 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
+ prop = RNA_def_property(srna, "eraser_strength_factor", PROP_FLOAT, PROP_PERCENTAGE);
+ RNA_def_property_float_sdna(prop, NULL, "era_strength_f");
+ RNA_def_property_range(prop, 0.0, 100.0);
+ RNA_def_property_ui_range(prop, 0.0, 100.0, 10, 1);
+ RNA_def_property_ui_text(prop, "Affect Stroke Strength",
+ "Amount of erasing for strength ");
+ RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
+ RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
+
+ prop = RNA_def_property(srna, "eraser_thickness_factor", PROP_FLOAT, PROP_PERCENTAGE);
+ RNA_def_property_float_sdna(prop, NULL, "era_thickness_f");
+ RNA_def_property_range(prop, 0.0, 100.0);
+ RNA_def_property_ui_range(prop, 0.0, 100.0, 10, 1);
+ RNA_def_property_ui_text(prop, "Affect Stroke Thickness",
+ "Amount of erasing for thickness ");
+ RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
+ RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
+
/* brush standard icon */
prop = RNA_def_property(srna, "gp_icon", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "icon_id");
@@ -1192,10 +1152,10 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
- prop = RNA_def_property(srna, "use_stabilizer", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_settings_stabilizer", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_STABILIZE_MOUSE);
RNA_def_property_boolean_default(prop, true);
- RNA_def_property_ui_text(prop, "Stabilizer",
+ RNA_def_property_ui_text(prop, "Use Stabilizer",
"Draw lines with a delay to allow smooth strokes. Press Shift key to override while drawing");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
@@ -1205,12 +1165,6 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Enable Cursor", "Enable cursor on screen");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
- prop = RNA_def_property(srna, "gpencil_brush_type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "brush_type");
- RNA_def_property_enum_items(prop, rna_enum_gpencil_brush_types_items);
- RNA_def_property_ui_text(prop, "Type", "Category of the brush");
- RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
-
prop = RNA_def_property(srna, "eraser_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "eraser_mode");
RNA_def_property_enum_items(prop, rna_enum_gpencil_brush_eraser_modes_items);
@@ -1218,7 +1172,7 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_BrushGpencilSettings_eraser_mode_update");
- prop = RNA_def_property(srna, "gpencil_fill_draw_mode", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "fill_draw_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "fill_draw_mode");
RNA_def_property_enum_items(prop, rna_enum_gpencil_fill_draw_modes_items);
RNA_def_property_ui_text(prop, "Mode", "Mode to draw boundary limits");
@@ -1233,19 +1187,19 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_Brush_material_update");
- prop = RNA_def_property(srna, "gpencil_fill_show_boundary", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "show_fill_boundary", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_FILL_SHOW_HELPLINES);
RNA_def_property_boolean_default(prop, true);
RNA_def_property_ui_text(prop, "Show Lines", "Show help lines for filling to see boundaries");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
- prop = RNA_def_property(srna, "gpencil_fill_hide", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_FILL_HIDE);
+ 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);
- RNA_def_property_ui_text(prop, "Hide", "Hide transparent lines to use as boundary for filling");
+ RNA_def_property_ui_text(prop, "Show Fill", "Show transparent lines to use as boundary for filling");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
- prop = RNA_def_property(srna, "default_eraser", PROP_BOOLEAN, PROP_NONE);
+ 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);
RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1);
@@ -1253,21 +1207,26 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_BrushGpencilSettings_default_eraser_update");
- prop = RNA_def_property(srna, "enable_settings", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_settings_postprocess", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_GROUP_SETTINGS);
- RNA_def_property_ui_text(prop, "Settings", "Enable additional post processing options for new strokes");
+ RNA_def_property_ui_text(prop, "Use Post-Process Settings", "Additional post processing options for new strokes");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
- prop = RNA_def_property(srna, "enable_random", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_settings_random", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_GROUP_RANDOM);
- RNA_def_property_ui_text(prop, "Random Settings", "Enable random settings for brush");
+ RNA_def_property_ui_text(prop, "Random Settings", "Random brush settings");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
- prop = RNA_def_property(srna, "pin_material", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_material_pin", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSH_MATERIAL_PINNED);
RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1);
RNA_def_property_ui_text(prop, "Pin Material", "Keep material assigned to brush");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
+
+ prop = RNA_def_property(srna, "show_lasso", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_BRUSH_DISSABLE_LASSO);
+ RNA_def_property_ui_text(prop, "Show Lasso", "Do not draw fill color while drawing the stroke");
+ RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
}
static void rna_def_brush(BlenderRNA *brna)
@@ -1277,29 +1236,35 @@ static void rna_def_brush(BlenderRNA *brna)
static const EnumPropertyItem prop_blend_items[] = {
{IMB_BLEND_MIX, "MIX", 0, "Mix", "Use mix blending mode while painting"},
- {IMB_BLEND_ADD, "ADD", 0, "Add", "Use add blending mode while painting"},
- {IMB_BLEND_SUB, "SUB", 0, "Subtract", "Use subtract blending mode while painting"},
- {IMB_BLEND_MUL, "MUL", 0, "Multiply", "Use multiply blending mode while painting"},
- {IMB_BLEND_LIGHTEN, "LIGHTEN", 0, "Lighten", "Use lighten blending mode while painting"},
+ {0, "", ICON_NONE, NULL, NULL},
{IMB_BLEND_DARKEN, "DARKEN", 0, "Darken", "Use darken blending mode while painting"},
- {IMB_BLEND_ERASE_ALPHA, "ERASE_ALPHA", 0, "Erase Alpha", "Erase alpha while painting"},
- {IMB_BLEND_ADD_ALPHA, "ADD_ALPHA", 0, "Add Alpha", "Add alpha while painting"},
- {IMB_BLEND_OVERLAY, "OVERLAY", 0, "Overlay", "Use overlay blending mode while painting"},
- {IMB_BLEND_HARDLIGHT, "HARDLIGHT", 0, "Hard light", "Use hard light blending mode while painting"},
+ {IMB_BLEND_MUL, "MUL", 0, "Multiply", "Use multiply blending mode while painting"},
{IMB_BLEND_COLORBURN, "COLORBURN", 0, "Color burn", "Use color burn blending mode while painting"},
{IMB_BLEND_LINEARBURN, "LINEARBURN", 0, "Linear burn", "Use linear burn blending mode while painting"},
- {IMB_BLEND_COLORDODGE, "COLORDODGE", 0, "Color dodge", "Use color dodge blending mode while painting"},
+ {0, "", ICON_NONE, NULL, NULL},
+ {IMB_BLEND_LIGHTEN, "LIGHTEN", 0, "Lighten", "Use lighten blending mode while painting"},
{IMB_BLEND_SCREEN, "SCREEN", 0, "Screen", "Use screen blending mode while painting"},
+ {IMB_BLEND_COLORDODGE, "COLORDODGE", 0, "Color dodge", "Use color dodge blending mode while painting"},
+ {IMB_BLEND_ADD, "ADD", 0, "Add", "Use add blending mode while painting"},
+ {0, "", ICON_NONE, NULL, NULL},
+ {IMB_BLEND_OVERLAY, "OVERLAY", 0, "Overlay", "Use overlay blending mode while painting"},
{IMB_BLEND_SOFTLIGHT, "SOFTLIGHT", 0, "Soft light", "Use softlight blending mode while painting"},
- {IMB_BLEND_PINLIGHT, "PINLIGHT", 0, "Pin light", "Use pinlight blending mode while painting"},
+ {IMB_BLEND_HARDLIGHT, "HARDLIGHT", 0, "Hard light", "Use hard light blending mode while painting"},
{IMB_BLEND_VIVIDLIGHT, "VIVIDLIGHT", 0, "Vivid light", "Use vividlight blending mode while painting"},
{IMB_BLEND_LINEARLIGHT, "LINEARLIGHT", 0, "Linear light", "Use linearlight blending mode while painting"},
+ {IMB_BLEND_PINLIGHT, "PINLIGHT", 0, "Pin light", "Use pinlight blending mode while painting"},
+ {0, "", ICON_NONE, NULL, NULL},
{IMB_BLEND_DIFFERENCE, "DIFFERENCE", 0, "Difference", "Use difference blending mode while painting"},
{IMB_BLEND_EXCLUSION, "EXCLUSION", 0, "Exclusion", "Use exclusion blending mode while painting"},
+ {IMB_BLEND_SUB, "SUB", 0, "Subtract", "Use subtract blending mode while painting"},
+ {0, "", ICON_NONE, NULL, NULL},
{IMB_BLEND_HUE, "HUE", 0, "Hue", "Use hue blending mode while painting"},
{IMB_BLEND_SATURATION, "SATURATION", 0, "Saturation", "Use saturation blending mode while painting"},
- {IMB_BLEND_LUMINOSITY, "LUMINOSITY", 0, "Luminosity", "Use luminosity blending mode while painting"},
{IMB_BLEND_COLOR, "COLOR", 0, "Color", "Use color blending mode while painting"},
+ {IMB_BLEND_LUMINOSITY, "LUMINOSITY", 0, "Luminosity", "Use luminosity blending mode while painting"},
+ {0, "", ICON_NONE, NULL, NULL},
+ {IMB_BLEND_ERASE_ALPHA, "ERASE_ALPHA", 0, "Erase Alpha", "Erase alpha while painting"},
+ {IMB_BLEND_ADD_ALPHA, "ADD_ALPHA", 0, "Add Alpha", "Add alpha while painting"},
{0, NULL, 0, NULL, NULL}
};
@@ -1354,22 +1319,42 @@ static void rna_def_brush(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Blending mode", "Brush blending mode");
RNA_def_property_update(prop, 0, "rna_Brush_update");
+
+ /**
+ * Begin per-mode tool properties.
+ *
+ * keep in sync with #BKE_paint_get_tool_prop_id_from_paintmode
+ */
prop = RNA_def_property(srna, "sculpt_tool", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, rna_enum_brush_sculpt_tool_items);
RNA_def_property_ui_text(prop, "Sculpt Tool", "");
- RNA_def_property_update(prop, 0, "rna_Brush_sculpt_tool_update");
+ RNA_def_property_update(prop, 0, "rna_Brush_update_and_reset_icon");
prop = RNA_def_property(srna, "vertex_tool", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "vertexpaint_tool");
RNA_def_property_enum_items(prop, rna_enum_brush_vertex_tool_items);
- RNA_def_property_ui_text(prop, "Blending mode", "Brush blending mode");
- RNA_def_property_update(prop, 0, "rna_Brush_vertex_tool_update");
+ RNA_def_property_ui_text(prop, "Vertex Paint Tool", "");
+ RNA_def_property_update(prop, 0, "rna_Brush_update_and_reset_icon");
+
+ prop = RNA_def_property(srna, "weight_tool", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "weightpaint_tool");
+ RNA_def_property_enum_items(prop, rna_enum_brush_weight_tool_items);
+ RNA_def_property_ui_text(prop, "Weight Paint Tool", "");
+ RNA_def_property_update(prop, 0, "rna_Brush_update_and_reset_icon");
prop = RNA_def_property(srna, "image_tool", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "imagepaint_tool");
RNA_def_property_enum_items(prop, rna_enum_brush_image_tool_items);
RNA_def_property_ui_text(prop, "Image Paint Tool", "");
- RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, "rna_Brush_imagepaint_tool_update");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, "rna_Brush_update_and_reset_icon");
+
+ prop = RNA_def_property(srna, "gpencil_tool", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "gpencil_tool");
+ RNA_def_property_enum_items(prop, rna_enum_brush_gpencil_types_items);
+ RNA_def_property_ui_text(prop, "Type", "Category of the brush");
+ RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
+ /** End per mode tool properties. */
+
prop = RNA_def_property(srna, "direction", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
@@ -1949,16 +1934,16 @@ static void rna_def_brush(BlenderRNA *brna)
}
-
-/* A brush stroke is a list of changes to the brush that
+/**
+ * A brush stroke is a list of changes to the brush that
* can occur during a stroke
*
- * o 3D location of the brush
- * o 2D mouse location
- * o Tablet pressure
- * o Direction flip
- * o Tool switch
- * o Time
+ * - 3D location of the brush
+ * - 2D mouse location
+ * - Tablet pressure
+ * - Direction flip
+ * - Tool switch
+ * - Time
*/
static void rna_def_operator_stroke_element(BlenderRNA *brna)
{
diff --git a/source/blender/makesrna/intern/rna_camera.c b/source/blender/makesrna/intern/rna_camera.c
index 8ca45e6dd2d..60c68bc7214 100644
--- a/source/blender/makesrna/intern/rna_camera.c
+++ b/source/blender/makesrna/intern/rna_camera.c
@@ -156,7 +156,7 @@ static void rna_def_camera_background_image(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}
};
- static const EnumPropertyItem bgpic_draw_depth_items[] = {
+ static const EnumPropertyItem bgpic_display_depth_items[] = {
{0, "BACK", 0, "Back", ""},
{CAM_BGIMG_FLAG_FOREGROUND, "FRONT", 0, "Front", ""},
{0, NULL, 0, NULL, NULL}
@@ -251,10 +251,10 @@ static void rna_def_camera_background_image(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
/* expose 1 flag as a enum of 2 items */
- prop = RNA_def_property(srna, "draw_depth", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "display_depth", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
- RNA_def_property_enum_items(prop, bgpic_draw_depth_items);
- RNA_def_property_ui_text(prop, "Depth", "Draw under or over everything");
+ RNA_def_property_enum_items(prop, bgpic_display_depth_items);
+ RNA_def_property_ui_text(prop, "Depth", "Display under or over everything");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
/* expose 2 flags as a enum of 3 items */
@@ -378,7 +378,7 @@ void RNA_def_camera(BlenderRNA *brna)
{CAM_PANO, "PANO", 0, "Panoramic", ""},
{0, NULL, 0, NULL, NULL}
};
- static const EnumPropertyItem prop_draw_type_extra_items[] = {
+ static const EnumPropertyItem prop_display_type_extra_items[] = {
{CAM_DTX_CENTER, "CENTER", 0, "Center", ""},
{CAM_DTX_CENTER_DIAG, "CENTER_DIAGONAL", 0, "Center Diagonal", ""},
{CAM_DTX_THIRDS, "THIRDS", 0, "Thirds", ""},
@@ -413,9 +413,9 @@ void RNA_def_camera(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_guide", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "dtx");
- RNA_def_property_enum_items(prop, prop_draw_type_extra_items);
+ RNA_def_property_enum_items(prop, prop_display_type_extra_items);
RNA_def_property_flag(prop, PROP_ENUM_FLAG);
- RNA_def_property_ui_text(prop, "Composition Guides", "Draw overlay");
+ RNA_def_property_ui_text(prop, "Composition Guides", "Display overlay");
RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
prop = RNA_def_property(srna, "sensor_fit", PROP_ENUM, PROP_NONE);
@@ -501,12 +501,12 @@ void RNA_def_camera(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Orthographic Scale", "Orthographic Camera scale (similar to zoom)");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Camera_update");
- prop = RNA_def_property(srna, "draw_size", PROP_FLOAT, PROP_DISTANCE);
+ prop = RNA_def_property(srna, "display_size", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "drawsize");
RNA_def_property_float_default(prop, 1.0f);
RNA_def_property_range(prop, 0.01f, 1000.0f);
RNA_def_property_ui_range(prop, 0.01, 100, 1, 2);
- RNA_def_property_ui_text(prop, "Draw Size", "Apparent size of the Camera object in the 3D View");
+ RNA_def_property_ui_text(prop, "Display Size", "Apparent size of the Camera object in the 3D View");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
prop = RNA_def_property(srna, "shift_x", PROP_FLOAT, PROP_NONE);
@@ -540,12 +540,12 @@ void RNA_def_camera(BlenderRNA *brna)
/* flag */
prop = RNA_def_property(srna, "show_limits", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_SHOWLIMITS);
- RNA_def_property_ui_text(prop, "Show Limits", "Draw the clipping range and focus point on the camera");
+ RNA_def_property_ui_text(prop, "Show Limits", "Display the clipping range and focus point on the camera");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
prop = RNA_def_property(srna, "show_mist", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_SHOWMIST);
- RNA_def_property_ui_text(prop, "Show Mist", "Draw a line from the Camera to indicate the mist area");
+ RNA_def_property_ui_text(prop, "Show Mist", "Display a line from the Camera to indicate the mist area");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
prop = RNA_def_property(srna, "show_passepartout", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_cloth.c b/source/blender/makesrna/intern/rna_cloth.c
index 0958011a7f0..c178f0b7389 100644
--- a/source/blender/makesrna/intern/rna_cloth.c
+++ b/source/blender/makesrna/intern/rna_cloth.c
@@ -31,6 +31,8 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "BLI_math_base.h"
+
#include "RNA_define.h"
#include "rna_internal.h"
@@ -97,26 +99,70 @@ static void rna_ClothSettings_max_bend_set(struct PointerRNA *ptr, float value)
settings->max_bend = value;
}
-static void rna_ClothSettings_structural_set(struct PointerRNA *ptr, float value)
+static void rna_ClothSettings_tension_set(struct PointerRNA *ptr, float value)
+{
+ ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
+
+ settings->tension = value;
+
+ /* check for max clipping */
+ if (value > settings->max_tension)
+ settings->max_tension = value;
+}
+
+static void rna_ClothSettings_max_tension_set(struct PointerRNA *ptr, float value)
+{
+ ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
+
+ /* check for clipping */
+ if (value < settings->tension)
+ value = settings->tension;
+
+ settings->max_tension = value;
+}
+
+static void rna_ClothSettings_compression_set(struct PointerRNA *ptr, float value)
+{
+ ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
+
+ settings->compression = value;
+
+ /* check for max clipping */
+ if (value > settings->max_compression)
+ settings->max_compression = value;
+}
+
+static void rna_ClothSettings_max_compression_set(struct PointerRNA *ptr, float value)
+{
+ ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
+
+ /* check for clipping */
+ if (value < settings->compression)
+ value = settings->compression;
+
+ settings->max_compression = value;
+}
+
+static void rna_ClothSettings_shear_set(struct PointerRNA *ptr, float value)
{
ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
- settings->structural = value;
+ settings->shear = value;
/* check for max clipping */
- if (value > settings->max_struct)
- settings->max_struct = value;
+ if (value > settings->max_shear)
+ settings->max_shear = value;
}
-static void rna_ClothSettings_max_struct_set(struct PointerRNA *ptr, float value)
+static void rna_ClothSettings_max_shear_set(struct PointerRNA *ptr, float value)
{
ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
/* check for clipping */
- if (value < settings->structural)
- value = settings->structural;
+ if (value < settings->shear)
+ value = settings->shear;
- settings->max_struct = value;
+ settings->max_shear = value;
}
static void rna_ClothSettings_max_sewing_set(struct PointerRNA *ptr, float value)
@@ -130,6 +176,28 @@ static void rna_ClothSettings_max_sewing_set(struct PointerRNA *ptr, float value
settings->max_sewing = value;
}
+static void rna_ClothSettings_shrink_min_set(struct PointerRNA *ptr, float value)
+{
+ ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
+
+ settings->shrink_min = value;
+
+ /* check for max clipping */
+ if (value > settings->shrink_max)
+ settings->shrink_max = value;
+}
+
+static void rna_ClothSettings_shrink_max_set(struct PointerRNA *ptr, float value)
+{
+ ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
+
+ /* check for clipping */
+ if (value < settings->shrink_min)
+ value = settings->shrink_min;
+
+ settings->shrink_max = value;
+}
+
static void rna_ClothSettings_mass_vgroup_get(PointerRNA *ptr, char *value)
{
ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
@@ -184,6 +252,24 @@ static void rna_ClothSettings_struct_vgroup_set(PointerRNA *ptr, const char *val
rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_struct);
}
+static void rna_ClothSettings_shear_vgroup_get(PointerRNA *ptr, char *value)
+{
+ ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
+ rna_object_vgroup_name_index_get(ptr, value, sim->vgroup_shear);
+}
+
+static int rna_ClothSettings_shear_vgroup_length(PointerRNA *ptr)
+{
+ ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
+ return rna_object_vgroup_name_index_length(ptr, sim->vgroup_shear);
+}
+
+static void rna_ClothSettings_shear_vgroup_set(PointerRNA *ptr, const char *value)
+{
+ ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
+ rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_shear);
+}
+
static void rna_ClothSettings_bend_vgroup_get(PointerRNA *ptr, char *value)
{
ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
@@ -350,6 +436,12 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
+ static const EnumPropertyItem prop_bending_model_items[] = {
+ {CLOTH_BENDING_ANGULAR, "ANGULAR", 0, "Angular", "Cloth model with angular bending springs"},
+ {CLOTH_BENDING_LINEAR, "LINEAR", 0, "Linear", "Cloth model with linear bending springs (legacy)"},
+ {0, NULL, 0, NULL, NULL}
+ };
+
srna = RNA_def_struct(brna, "ClothSettings", NULL);
RNA_def_struct_ui_text(srna, "Cloth Settings", "Cloth simulation settings for an object");
RNA_def_struct_sdna(srna, "ClothSimSettings");
@@ -442,20 +534,6 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Air Damping", "Air has normally some thickness which slows falling things down");
RNA_def_property_update(prop, 0, "rna_cloth_update");
- prop = RNA_def_property(srna, "vel_damping", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "vel_damping");
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Velocity Damping",
- "Damp velocity to help cloth reach the resting position faster "
- "(1.0 = no damping, 0.0 = fully dampened)");
- RNA_def_property_update(prop, 0, "rna_cloth_update");
-
- prop = RNA_def_property(srna, "use_pin_cloth", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_GOAL);
- RNA_def_property_ui_text(prop, "Pin Cloth", "Enable pinning of cloth vertices to other objects/positions");
- RNA_def_property_update(prop, 0, "rna_cloth_pinning_changed");
- RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
-
prop = RNA_def_property(srna, "pin_stiffness", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "goalspring");
RNA_def_property_range(prop, 0.0f, 50.0);
@@ -486,12 +564,14 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
prop = RNA_def_property(srna, "shrink_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "shrink_min");
RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Shrink Factor Min", "Min amount to shrink cloth by");
+ RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_shrink_min_set", NULL);
+ RNA_def_property_ui_text(prop, "Shrink Factor", "Factor by which to shrink cloth");
RNA_def_property_update(prop, 0, "rna_cloth_update");
prop = RNA_def_property(srna, "shrink_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "shrink_max");
RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_shrink_max_set", NULL);
RNA_def_property_ui_text(prop, "Shrink Factor Max", "Max amount to shrink cloth by");
RNA_def_property_update(prop, 0, "rna_cloth_update");
@@ -503,33 +583,64 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_cloth_update");
/* springs */
+ prop = RNA_def_property(srna, "tension_damping", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "tension_damp");
+ RNA_def_property_range(prop, 0.0f, 50.0f);
+ RNA_def_property_ui_text(prop, "Tension Spring Damping", "Amount of damping in stretching behavior");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
- prop = RNA_def_property(srna, "use_stiffness_scale", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_SCALING);
- RNA_def_property_ui_text(prop, "Stiffness Scaling",
- "If enabled, stiffness can be scaled along a weight painted vertex group");
+ prop = RNA_def_property(srna, "compression_damping", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "compression_damp");
+ RNA_def_property_range(prop, 0.0f, 50.0f);
+ RNA_def_property_ui_text(prop, "Compression Spring Damping", "Amount of damping in compression behavior");
RNA_def_property_update(prop, 0, "rna_cloth_update");
- RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
- prop = RNA_def_property(srna, "spring_damping", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "Cdis");
+ prop = RNA_def_property(srna, "shear_damping", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "shear_damp");
RNA_def_property_range(prop, 0.0f, 50.0f);
- RNA_def_property_ui_text(prop, "Spring Damping",
- "Damping of cloth velocity (higher = more smooth, less jiggling)");
+ RNA_def_property_ui_text(prop, "Shear Spring Damping", "Amount of damping in shearing behavior");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
+
+ prop = RNA_def_property(srna, "tension_stiffness", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "tension");
+ RNA_def_property_range(prop, 0.0f, 10000.0f);
+ RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_tension_set", NULL);
+ RNA_def_property_ui_text(prop, "Tension Stiffness", "How much the material resists stretching");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
+
+ prop = RNA_def_property(srna, "tension_stiffness_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "max_tension");
+ RNA_def_property_range(prop, 0.0f, 10000.0f);
+ RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_tension_set", NULL);
+ RNA_def_property_ui_text(prop, "Tension Stiffness Maximum", "Maximum tension stiffness value");
RNA_def_property_update(prop, 0, "rna_cloth_update");
- prop = RNA_def_property(srna, "structural_stiffness", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "structural");
+ prop = RNA_def_property(srna, "compression_stiffness", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "compression");
RNA_def_property_range(prop, 0.0f, 10000.0f);
- RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_structural_set", NULL);
- RNA_def_property_ui_text(prop, "Structural Stiffness", "Overall stiffness of structure");
+ RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_compression_set", NULL);
+ RNA_def_property_ui_text(prop, "Compression Stiffness", "How much the material resists compression");
RNA_def_property_update(prop, 0, "rna_cloth_update");
- prop = RNA_def_property(srna, "structural_stiffness_max", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "max_struct");
+ prop = RNA_def_property(srna, "compression_stiffness_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "max_compression");
RNA_def_property_range(prop, 0.0f, 10000.0f);
- RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_struct_set", NULL);
- RNA_def_property_ui_text(prop, "Structural Stiffness Maximum", "Maximum structural stiffness value");
+ RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_compression_set", NULL);
+ RNA_def_property_ui_text(prop, "Compression Stiffness Maximum", "Maximum compression stiffness value");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
+
+ prop = RNA_def_property(srna, "shear_stiffness", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "shear");
+ RNA_def_property_range(prop, 0.0f, 10000.0f);
+ RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_shear_set", NULL);
+ RNA_def_property_ui_text(prop, "Shear Stiffness", "How much the material resists shearing");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
+
+ prop = RNA_def_property(srna, "shear_stiffness_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "max_shear");
+ RNA_def_property_range(prop, 0.0f, 10000.0f);
+ RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_shear_set", NULL);
+ RNA_def_property_ui_text(prop, "Shear Stiffness Maximum", "Maximum shear scaling value");
RNA_def_property_update(prop, 0, "rna_cloth_update");
prop = RNA_def_property(srna, "sewing_force_max", PROP_FLOAT, PROP_NONE);
@@ -547,12 +658,19 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
"Vertex group for fine control over structural stiffness");
RNA_def_property_update(prop, 0, "rna_cloth_update");
+ prop = RNA_def_property(srna, "vertex_group_shear_stiffness", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_funcs(prop, "rna_ClothSettings_shear_vgroup_get",
+ "rna_ClothSettings_shear_vgroup_length",
+ "rna_ClothSettings_shear_vgroup_set");
+ RNA_def_property_ui_text(prop, "Shear Stiffness Vertex Group",
+ "Vertex group for fine control over shear stiffness");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
+
prop = RNA_def_property(srna, "bending_stiffness", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "bending");
RNA_def_property_range(prop, 0.0f, 10000.0f);
RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_bending_set", NULL);
- RNA_def_property_ui_text(prop, "Bending Stiffness",
- "Wrinkle coefficient (higher = less smaller but more big wrinkles)");
+ RNA_def_property_ui_text(prop, "Bending Stiffness", "How much the material resists bending");
RNA_def_property_update(prop, 0, "rna_cloth_update");
prop = RNA_def_property(srna, "bending_stiffness_max", PROP_FLOAT, PROP_NONE);
@@ -565,8 +683,7 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
prop = RNA_def_property(srna, "bending_damping", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "bending_damping");
RNA_def_property_range(prop, 0.0f, 1000.0f);
- RNA_def_property_ui_text(prop, "Bending Spring Damping",
- "Damping of bending motion");
+ RNA_def_property_ui_text(prop, "Bending Spring Damping", "Amount of damping in bending behavior");
RNA_def_property_update(prop, 0, "rna_cloth_update");
prop = RNA_def_property(srna, "use_sewing_springs", PROP_BOOLEAN, PROP_NONE);
@@ -601,24 +718,17 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_cloth_update");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ prop = RNA_def_property(srna, "bending_model", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "bending_model");
+ RNA_def_property_enum_items(prop, prop_bending_model_items);
+ RNA_def_property_ui_text(prop, "Bending Model", "Physical model for simulating bending forces");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+
/* unused */
/* unused still */
#if 0
- prop = RNA_def_property(srna, "shear_stiffness", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "shear");
- RNA_def_property_range(prop, 0.0f, 1000.0f);
- RNA_def_property_ui_text(prop, "Shear Stiffness", "Shear spring stiffness");
-#endif
- /* unused still */
-#if 0
- prop = RNA_def_property(srna, "shear_stiffness_max", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "max_shear");
- RNA_def_property_range(prop, 0.0f, upperLimitf);
- RNA_def_property_ui_text(prop, "Shear Stiffness Maximum", "Maximum shear scaling value");
-#endif
- /* unused still */
-#if 0
prop = RNA_def_property(srna, "effector_force_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "eff_force_scale");
RNA_def_property_range(prop, 0.0f, 100.0f);
@@ -664,26 +774,11 @@ static void rna_def_cloth_collision_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Enable Collision", "Enable collisions with other objects");
RNA_def_property_update(prop, 0, "rna_cloth_update");
- prop = RNA_def_property(srna, "repel_force", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "repel_force");
- RNA_def_property_range(prop, 0.0f, 20.0f);
- RNA_def_property_float_default(prop, 1.0f);
- RNA_def_property_ui_text(prop, "Repulsion Force", "Repulsion force to apply on cloth when close to colliding");
- RNA_def_property_update(prop, 0, "rna_cloth_update");
-
- prop = RNA_def_property(srna, "distance_repel", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "distance_repel");
- RNA_def_property_range(prop, 0.001f, 10.0f);
- RNA_def_property_float_default(prop, 0.005f);
- RNA_def_property_ui_text(prop, "Repulsion Distance",
- "Maximum distance to apply repulsion force, must be greater than minimum distance");
- RNA_def_property_update(prop, 0, "rna_cloth_update");
-
prop = RNA_def_property(srna, "distance_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "epsilon");
RNA_def_property_range(prop, 0.001f, 1.0f);
RNA_def_property_ui_text(prop, "Minimum Distance",
- "Minimum distance between collision objects before collision response takes in");
+ "Minimum distance between collision objects before collision response takes effect");
RNA_def_property_update(prop, 0, "rna_cloth_update");
prop = RNA_def_property(srna, "friction", PROP_FLOAT, PROP_NONE);
@@ -706,6 +801,12 @@ static void rna_def_cloth_collision_settings(BlenderRNA *brna)
"How many collision iterations should be done. (higher is better quality but slower)");
RNA_def_property_update(prop, 0, "rna_cloth_update");
+ prop = RNA_def_property(srna, "impulse_clamp", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "clamp");
+ RNA_def_property_range(prop, 0.0f, 100.0f);
+ RNA_def_property_ui_text(prop, "Impulse Clamping", "Clamp collision impulses to avoid instability (0.0 to disable clamping)");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
+
/* self collision */
prop = RNA_def_property(srna, "use_self_collision", PROP_BOOLEAN, PROP_NONE);
@@ -715,22 +816,13 @@ static void rna_def_cloth_collision_settings(BlenderRNA *brna)
prop = RNA_def_property(srna, "self_distance_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "selfepsilon");
- RNA_def_property_range(prop, 0.5f, 1.0f);
- RNA_def_property_ui_text(prop, "Self Minimum Distance", "0.5 means no distance at all, 1.0 is maximum distance");
+ RNA_def_property_range(prop, 0.001f, 0.1f);
+ RNA_def_property_ui_text(prop, "Self Minimum Distance", "Minimum distance between cloth faces before collision response takes effect");
RNA_def_property_update(prop, 0, "rna_cloth_update");
prop = RNA_def_property(srna, "self_friction", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0f, 80.0f);
- RNA_def_property_ui_text(prop, "Self Friction", "Friction/damping with self contact");
- RNA_def_property_update(prop, 0, "rna_cloth_update");
-
- prop = RNA_def_property(srna, "self_collision_quality", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "self_loop_count");
- RNA_def_property_range(prop, 1, SHRT_MAX);
- RNA_def_property_ui_range(prop, 1, 10, 1, -1);
- RNA_def_property_ui_text(prop, "Self Collision Quality",
- "How many self collision iterations should be done "
- "(higher is better quality but slower)");
+ RNA_def_property_ui_text(prop, "Self Friction", "Friction with self contact");
RNA_def_property_update(prop, 0, "rna_cloth_update");
prop = RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
@@ -744,6 +836,12 @@ static void rna_def_cloth_collision_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Selfcollision Vertex Group",
"Vertex group to define vertices which are not used during self collisions");
RNA_def_property_update(prop, 0, "rna_cloth_update");
+
+ prop = RNA_def_property(srna, "self_impulse_clamp", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "self_clamp");
+ RNA_def_property_range(prop, 0.0f, 100.0f);
+ RNA_def_property_ui_text(prop, "Impulse Clamping", "Clamp collision impulses to avoid instability (0.0 to disable clamping)");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
}
void RNA_def_cloth(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_collection.c b/source/blender/makesrna/intern/rna_collection.c
index 1262ae05390..2279dc6880d 100644
--- a/source/blender/makesrna/intern/rna_collection.c
+++ b/source/blender/makesrna/intern/rna_collection.c
@@ -47,7 +47,6 @@
#include "BKE_collection.h"
#include "BKE_global.h"
#include "BKE_layer.h"
-#include "BKE_library.h"
#include "WM_api.h"
@@ -359,21 +358,21 @@ void RNA_def_collections(BlenderRNA *brna)
prop = RNA_def_property(srna, "hide_select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", COLLECTION_RESTRICT_SELECT);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
- RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, -1);
RNA_def_property_ui_text(prop, "Disable Select", "Disable collection for viewport selection");
RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_Collection_flag_update");
prop = RNA_def_property(srna, "hide_viewport", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", COLLECTION_RESTRICT_VIEW);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
- RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, -1);
RNA_def_property_ui_text(prop, "Disable Viewport", "Disable collection in viewport");
RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_Collection_flag_update");
prop = RNA_def_property(srna, "hide_render", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", COLLECTION_RESTRICT_RENDER);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
- RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, -1);
RNA_def_property_ui_text(prop, "Disable Render", "Disable collection in renders");
RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_Collection_flag_update");
}
diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c
index f91be9ae1e9..3cf959eaee1 100644
--- a/source/blender/makesrna/intern/rna_color.c
+++ b/source/blender/makesrna/intern/rna_color.c
@@ -764,9 +764,8 @@ static void rna_def_curvemapping(BlenderRNA *brna)
FunctionRNA *func;
static const EnumPropertyItem tone_items[] = {
- {CURVE_TONE_STANDARD, "STANDARD", 0, "Standard", ""},
- {CURVE_TONE_WEIGHTED_STANDARD, "WEIGHTED", 0, "Weighted Standard", ""},
- {CURVE_TONE_FILMLIKE, "FILMLIKE", 0, "Film like", ""},
+ {CURVE_TONE_STANDARD, "STANDARD", 0, "Standard", ""},
+ {CURVE_TONE_FILMLIKE, "FILMLIKE", 0, "Film like", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -1006,7 +1005,7 @@ static void rna_def_histogram(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_line", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", HISTO_FLAG_LINE);
RNA_def_property_ui_text(prop, "Show Line", "Display lines rather than filled shapes");
- RNA_def_property_ui_icon(prop, ICON_IPO, 0);
+ RNA_def_property_ui_icon(prop, ICON_GRAPH, 0);
}
static void rna_def_scopes(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c
index 52c6bc105fd..d7fd0aae917 100644
--- a/source/blender/makesrna/intern/rna_constraint.c
+++ b/source/blender/makesrna/intern/rna_constraint.c
@@ -27,6 +27,9 @@
#include <stdlib.h>
#include "BLI_math.h"
+#include "BLI_listbase.h"
+
+#include "MEM_guardedalloc.h"
#include "BLT_translation.h"
@@ -48,64 +51,66 @@
/* please keep the names in sync with constraint.c */
const EnumPropertyItem rna_enum_constraint_type_items[] = {
{0, "", 0, N_("Motion Tracking"), ""},
- {CONSTRAINT_TYPE_CAMERASOLVER, "CAMERA_SOLVER", ICON_CONSTRAINT_DATA, "Camera Solver", ""},
- {CONSTRAINT_TYPE_FOLLOWTRACK, "FOLLOW_TRACK", ICON_CONSTRAINT_DATA, "Follow Track", ""},
- {CONSTRAINT_TYPE_OBJECTSOLVER, "OBJECT_SOLVER", ICON_CONSTRAINT_DATA, "Object Solver", ""},
+ {CONSTRAINT_TYPE_CAMERASOLVER, "CAMERA_SOLVER", ICON_CONSTRAINT, "Camera Solver", ""},
+ {CONSTRAINT_TYPE_FOLLOWTRACK, "FOLLOW_TRACK", ICON_CONSTRAINT, "Follow Track", ""},
+ {CONSTRAINT_TYPE_OBJECTSOLVER, "OBJECT_SOLVER", ICON_CONSTRAINT, "Object Solver", ""},
{0, "", 0, N_("Transform"), ""},
- {CONSTRAINT_TYPE_LOCLIKE, "COPY_LOCATION", ICON_CONSTRAINT_DATA, "Copy Location",
+ {CONSTRAINT_TYPE_LOCLIKE, "COPY_LOCATION", ICON_CONSTRAINT, "Copy Location",
"Copy the location of a target (with an optional offset), so that they move together"},
- {CONSTRAINT_TYPE_ROTLIKE, "COPY_ROTATION", ICON_CONSTRAINT_DATA, "Copy Rotation",
+ {CONSTRAINT_TYPE_ROTLIKE, "COPY_ROTATION", ICON_CONSTRAINT, "Copy Rotation",
"Copy the rotation of a target (with an optional offset), so that they rotate together"},
- {CONSTRAINT_TYPE_SIZELIKE, "COPY_SCALE", ICON_CONSTRAINT_DATA, "Copy Scale",
+ {CONSTRAINT_TYPE_SIZELIKE, "COPY_SCALE", ICON_CONSTRAINT, "Copy Scale",
"Copy the scale factors of a target (with an optional offset), so that they are scaled by the same amount"},
- {CONSTRAINT_TYPE_TRANSLIKE, "COPY_TRANSFORMS", ICON_CONSTRAINT_DATA, "Copy Transforms",
+ {CONSTRAINT_TYPE_TRANSLIKE, "COPY_TRANSFORMS", ICON_CONSTRAINT, "Copy Transforms",
"Copy all the transformations of a target, so that they move together"},
- {CONSTRAINT_TYPE_DISTLIMIT, "LIMIT_DISTANCE", ICON_CONSTRAINT_DATA, "Limit Distance",
+ {CONSTRAINT_TYPE_DISTLIMIT, "LIMIT_DISTANCE", ICON_CONSTRAINT, "Limit Distance",
"Restrict movements to within a certain distance of a target (at the time of constraint evaluation only)"},
- {CONSTRAINT_TYPE_LOCLIMIT, "LIMIT_LOCATION", ICON_CONSTRAINT_DATA, "Limit Location",
+ {CONSTRAINT_TYPE_LOCLIMIT, "LIMIT_LOCATION", ICON_CONSTRAINT, "Limit Location",
"Restrict movement along each axis within given ranges"},
- {CONSTRAINT_TYPE_ROTLIMIT, "LIMIT_ROTATION", ICON_CONSTRAINT_DATA, "Limit Rotation",
+ {CONSTRAINT_TYPE_ROTLIMIT, "LIMIT_ROTATION", ICON_CONSTRAINT, "Limit Rotation",
"Restrict rotation along each axis within given ranges"},
- {CONSTRAINT_TYPE_SIZELIMIT, "LIMIT_SCALE", ICON_CONSTRAINT_DATA, "Limit Scale",
+ {CONSTRAINT_TYPE_SIZELIMIT, "LIMIT_SCALE", ICON_CONSTRAINT, "Limit Scale",
"Restrict scaling along each axis with given ranges"},
- {CONSTRAINT_TYPE_SAMEVOL, "MAINTAIN_VOLUME", ICON_CONSTRAINT_DATA, "Maintain Volume",
+ {CONSTRAINT_TYPE_SAMEVOL, "MAINTAIN_VOLUME", ICON_CONSTRAINT, "Maintain Volume",
"Compensate for scaling one axis by applying suitable scaling to the other two axes"},
- {CONSTRAINT_TYPE_TRANSFORM, "TRANSFORM", ICON_CONSTRAINT_DATA, "Transformation",
+ {CONSTRAINT_TYPE_TRANSFORM, "TRANSFORM", ICON_CONSTRAINT, "Transformation",
"Use one transform property from target to control another (or same) property on owner"},
- {CONSTRAINT_TYPE_TRANSFORM_CACHE, "TRANSFORM_CACHE", ICON_CONSTRAINT_DATA, "Transform Cache",
+ {CONSTRAINT_TYPE_TRANSFORM_CACHE, "TRANSFORM_CACHE", ICON_CONSTRAINT, "Transform Cache",
"Look up the transformation matrix from an external file"},
{0, "", 0, N_("Tracking"), ""},
- {CONSTRAINT_TYPE_CLAMPTO, "CLAMP_TO", ICON_CONSTRAINT_DATA, "Clamp To",
+ {CONSTRAINT_TYPE_CLAMPTO, "CLAMP_TO", ICON_CONSTRAINT, "Clamp To",
"Restrict movements to lie along a curve by remapping location along curve's longest axis"},
- {CONSTRAINT_TYPE_DAMPTRACK, "DAMPED_TRACK", ICON_CONSTRAINT_DATA, "Damped Track",
+ {CONSTRAINT_TYPE_DAMPTRACK, "DAMPED_TRACK", ICON_CONSTRAINT, "Damped Track",
"Point towards a target by performing the smallest rotation necessary"},
- {CONSTRAINT_TYPE_KINEMATIC, "IK", ICON_CONSTRAINT_DATA, "Inverse Kinematics",
+ {CONSTRAINT_TYPE_KINEMATIC, "IK", ICON_CONSTRAINT, "Inverse Kinematics",
"Control a chain of bones by specifying the endpoint target (Bones only)"},
- {CONSTRAINT_TYPE_LOCKTRACK, "LOCKED_TRACK", ICON_CONSTRAINT_DATA, "Locked Track",
+ {CONSTRAINT_TYPE_LOCKTRACK, "LOCKED_TRACK", ICON_CONSTRAINT, "Locked Track",
"Rotate around the specified ('locked') axis to point towards a target"},
- {CONSTRAINT_TYPE_SPLINEIK, "SPLINE_IK", ICON_CONSTRAINT_DATA, "Spline IK",
+ {CONSTRAINT_TYPE_SPLINEIK, "SPLINE_IK", ICON_CONSTRAINT, "Spline IK",
"Align chain of bones along a curve (Bones only)"},
- {CONSTRAINT_TYPE_STRETCHTO, "STRETCH_TO", ICON_CONSTRAINT_DATA, "Stretch To",
+ {CONSTRAINT_TYPE_STRETCHTO, "STRETCH_TO", ICON_CONSTRAINT, "Stretch To",
"Stretch along Y-Axis to point towards a target"},
- {CONSTRAINT_TYPE_TRACKTO, "TRACK_TO", ICON_CONSTRAINT_DATA, "Track To",
+ {CONSTRAINT_TYPE_TRACKTO, "TRACK_TO", ICON_CONSTRAINT, "Track To",
"Legacy tracking constraint prone to twisting artifacts"},
{0, "", 0, N_("Relationship"), ""},
- {CONSTRAINT_TYPE_ACTION, "ACTION", ICON_CONSTRAINT_DATA, "Action",
+ {CONSTRAINT_TYPE_ACTION, "ACTION", ICON_CONSTRAINT, "Action",
"Use transform property of target to look up pose for owner from an Action"},
- {CONSTRAINT_TYPE_CHILDOF, "CHILD_OF", ICON_CONSTRAINT_DATA, "Child Of",
+ {CONSTRAINT_TYPE_CHILDOF, "CHILD_OF", ICON_CONSTRAINT, "Child Of",
"Make target the 'detachable' parent of owner"},
- {CONSTRAINT_TYPE_MINMAX, "FLOOR", ICON_CONSTRAINT_DATA, "Floor",
+ {CONSTRAINT_TYPE_MINMAX, "FLOOR", ICON_CONSTRAINT, "Floor",
"Use position (and optionally rotation) of target to define a 'wall' or 'floor' that the owner can not cross"},
- {CONSTRAINT_TYPE_FOLLOWPATH, "FOLLOW_PATH", ICON_CONSTRAINT_DATA, "Follow Path",
+ {CONSTRAINT_TYPE_FOLLOWPATH, "FOLLOW_PATH", ICON_CONSTRAINT, "Follow Path",
"Use to animate an object/bone following a path"},
- {CONSTRAINT_TYPE_PIVOT, "PIVOT", ICON_CONSTRAINT_DATA, "Pivot",
+ {CONSTRAINT_TYPE_PIVOT, "PIVOT", ICON_CONSTRAINT, "Pivot",
"Change pivot point for transforms (buggy)"},
/* {CONSTRAINT_TYPE_RIGIDBODYJOINT, "RIGID_BODY_JOINT", ICON_CONSTRAINT_DATA, "Rigid Body Joint",
"Use to define a Rigid Body Constraint (for Game Engine use only)"}, */
/* {CONSTRAINT_TYPE_PYTHON, "SCRIPT", ICON_CONSTRAINT_DATA, "Script",
"Custom constraint(s) written in Python (Not yet implemented)"}, */
- {CONSTRAINT_TYPE_SHRINKWRAP, "SHRINKWRAP", ICON_CONSTRAINT_DATA, "Shrinkwrap",
+ {CONSTRAINT_TYPE_SHRINKWRAP, "SHRINKWRAP", ICON_CONSTRAINT, "Shrinkwrap",
"Restrict movements to surface of target mesh"},
+ {CONSTRAINT_TYPE_ARMATURE, "ARMATURE", ICON_CONSTRAINT, "Armature",
+ "Apply weight-blended transformation from multiple bones like the Armature modifier"},
{0, NULL, 0, NULL, NULL}
};
@@ -138,6 +143,16 @@ static const EnumPropertyItem owner_space_pchan_items[] = {
{0, NULL, 0, NULL, NULL}
};
+static const EnumPropertyItem track_axis_items[] = {
+ {TRACK_X, "TRACK_X", 0, "X", ""},
+ {TRACK_Y, "TRACK_Y", 0, "Y", ""},
+ {TRACK_Z, "TRACK_Z", 0, "Z", ""},
+ {TRACK_nX, "TRACK_NEGATIVE_X", 0, "-X", ""},
+ {TRACK_nY, "TRACK_NEGATIVE_Y", 0, "-Y", ""},
+ {TRACK_nZ, "TRACK_NEGATIVE_Z", 0, "-Z", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
#ifdef RNA_RUNTIME
static const EnumPropertyItem space_object_items[] = {
@@ -182,6 +197,8 @@ static StructRNA *rna_ConstraintType_refine(struct PointerRNA *ptr)
return &RNA_MaintainVolumeConstraint;
case CONSTRAINT_TYPE_PYTHON:
return &RNA_PythonConstraint;
+ case CONSTRAINT_TYPE_ARMATURE:
+ return &RNA_ArmatureConstraint;
case CONSTRAINT_TYPE_ACTION:
return &RNA_ActionConstraint;
case CONSTRAINT_TYPE_LOCKTRACK:
@@ -225,6 +242,17 @@ static StructRNA *rna_ConstraintType_refine(struct PointerRNA *ptr)
}
}
+static void rna_ConstraintTargetBone_target_set(PointerRNA *ptr, PointerRNA value)
+{
+ bConstraintTarget *tgt = (bConstraintTarget *)ptr->data;
+ Object *ob = value.data;
+
+ if (!ob || ob->type == OB_ARMATURE) {
+ id_lib_extern((ID *)ob);
+ tgt->tar = ob;
+ }
+}
+
static void rna_Constraint_name_set(PointerRNA *ptr, const char *value)
{
bConstraint *con = ptr->data;
@@ -250,10 +278,8 @@ static void rna_Constraint_name_set(PointerRNA *ptr, const char *value)
BKE_animdata_fix_paths_rename_all(NULL, "constraints", oldname, con->name);
}
-static char *rna_Constraint_path(PointerRNA *ptr)
+static char *rna_Constraint_do_compute_path(Object *ob, bConstraint *con)
{
- Object *ob = ptr->id.data;
- bConstraint *con = ptr->data;
bPoseChannel *pchan;
ListBase *lb = get_constraint_lb(ob, con, &pchan);
@@ -275,6 +301,55 @@ static char *rna_Constraint_path(PointerRNA *ptr)
}
}
+static char *rna_Constraint_path(PointerRNA *ptr)
+{
+ Object *ob = ptr->id.data;
+ bConstraint *con = ptr->data;
+
+ return rna_Constraint_do_compute_path(ob, con);
+}
+
+static bConstraint *rna_constraint_from_target(PointerRNA *ptr)
+{
+ Object *ob = ptr->id.data;
+ bConstraintTarget *tgt = ptr->data;
+
+ return BKE_constraint_find_from_target(ob, tgt);
+}
+
+static char *rna_ConstraintTarget_path(PointerRNA *ptr)
+{
+ Object *ob = ptr->id.data;
+ bConstraintTarget *tgt = ptr->data;
+ bConstraint *con = rna_constraint_from_target(ptr);
+ int index = -1;
+
+ if (con != NULL) {
+ if (con->type == CONSTRAINT_TYPE_ARMATURE) {
+ bArmatureConstraint *acon = con->data;
+ index = BLI_findindex(&acon->targets, tgt);
+ }
+ else if (con->type == CONSTRAINT_TYPE_PYTHON) {
+ bPythonConstraint *pcon = con->data;
+ index = BLI_findindex(&pcon->targets, tgt);
+ }
+ }
+
+ if (index >= 0) {
+ char *con_path = rna_Constraint_do_compute_path(ob, con);
+ char *result = BLI_sprintfN("%s.targets[%d]", con_path, index);
+
+ MEM_freeN(con_path);
+ return result;
+ }
+ else {
+ printf("%s: internal error, constraint '%s' of object '%s' does not contain the target\n",
+ __func__, con->name, ob->id.name);
+ }
+
+ return NULL;
+}
+
static void rna_Constraint_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
{
ED_object_constraint_tag_update(bmain, ptr->id.data, ptr->data);
@@ -285,6 +360,16 @@ static void rna_Constraint_dependency_update(Main *bmain, Scene *UNUSED(scene),
ED_object_constraint_dependency_tag_update(bmain, ptr->id.data, ptr->data);
}
+static void rna_ConstraintTarget_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
+{
+ ED_object_constraint_tag_update(bmain, ptr->id.data, rna_constraint_from_target(ptr));
+}
+
+static void rna_ConstraintTarget_dependency_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
+{
+ ED_object_constraint_dependency_tag_update(bmain, ptr->id.data, rna_constraint_from_target(ptr));
+}
+
static void rna_Constraint_influence_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Object *ob = ptr->id.data;
@@ -313,8 +398,9 @@ static void rna_Constraint_ik_type_set(struct PointerRNA *ptr, int value)
}
}
-static const EnumPropertyItem *rna_Constraint_owner_space_itemf(bContext *UNUSED(C), PointerRNA *ptr,
- PropertyRNA *UNUSED(prop), bool *UNUSED(r_free))
+static const EnumPropertyItem *rna_Constraint_owner_space_itemf(
+ bContext *UNUSED(C), PointerRNA *ptr,
+ PropertyRNA *UNUSED(prop), bool *UNUSED(r_free))
{
Object *ob = (Object *)ptr->id.data;
bConstraint *con = (bConstraint *)ptr->data;
@@ -325,8 +411,9 @@ static const EnumPropertyItem *rna_Constraint_owner_space_itemf(bContext *UNUSED
return space_object_items;
}
-static const EnumPropertyItem *rna_Constraint_target_space_itemf(bContext *UNUSED(C), PointerRNA *ptr,
- PropertyRNA *UNUSED(prop), bool *UNUSED(r_free))
+static const EnumPropertyItem *rna_Constraint_target_space_itemf(
+ bContext *UNUSED(C), PointerRNA *ptr,
+ PropertyRNA *UNUSED(prop), bool *UNUSED(r_free))
{
bConstraint *con = (bConstraint *)ptr->data;
const bConstraintTypeInfo *cti = BKE_constraint_typeinfo_get(con);
@@ -350,6 +437,43 @@ static const EnumPropertyItem *rna_Constraint_target_space_itemf(bContext *UNUSE
return space_object_items;
}
+static bConstraintTarget *rna_ArmatureConstraint_target_new(ID *id, bConstraint *con, Main *bmain)
+{
+ bArmatureConstraint *acon = con->data;
+ bConstraintTarget *tgt = MEM_callocN(sizeof(bConstraintTarget), "Constraint Target");
+
+ tgt->weight = 1.0f;
+ BLI_addtail(&acon->targets, tgt);
+
+ ED_object_constraint_dependency_tag_update(bmain, (Object *)id, con);
+ return tgt;
+}
+
+static void rna_ArmatureConstraint_target_remove(
+ ID *id, bConstraint *con, Main *bmain, ReportList *reports, PointerRNA *target_ptr)
+{
+ bArmatureConstraint *acon = con->data;
+ bConstraintTarget *tgt = target_ptr->data;
+
+ if (BLI_findindex(&acon->targets, tgt) < 0) {
+ BKE_reportf(reports, RPT_ERROR, "Target is not in the constraint target list");
+ return;
+ }
+
+ BLI_freelinkN(&acon->targets, tgt);
+
+ ED_object_constraint_dependency_tag_update(bmain, (Object *)id, con);
+}
+
+static void rna_ArmatureConstraint_target_clear(ID *id, bConstraint *con, Main *bmain)
+{
+ bArmatureConstraint *acon = con->data;
+
+ BLI_freelistN(&acon->targets);
+
+ ED_object_constraint_dependency_tag_update(bmain, (Object *)id, con);
+}
+
static void rna_ActionConstraint_minmax_range(PointerRNA *ptr, float *min, float *max,
float *UNUSED(softmin), float *UNUSED(softmax))
{
@@ -396,6 +520,20 @@ static void rna_SplineIKConstraint_joint_bindings_set(PointerRNA *ptr, const flo
memcpy(ikData->points, values, ikData->numpoints * sizeof(float));
}
+static int rna_ShrinkwrapConstraint_face_cull_get(PointerRNA *ptr)
+{
+ bConstraint *con = (bConstraint *)ptr->data;
+ bShrinkwrapConstraint *swc = (bShrinkwrapConstraint *)con->data;
+ return swc->flag & CON_SHRINKWRAP_PROJECT_CULL_MASK;
+}
+
+static void rna_ShrinkwrapConstraint_face_cull_set(struct PointerRNA *ptr, int value)
+{
+ bConstraint *con = (bConstraint *)ptr->data;
+ bShrinkwrapConstraint *swc = (bShrinkwrapConstraint *)con->data;
+ swc->flag = (swc->flag & ~CON_SHRINKWRAP_PROJECT_CULL_MASK) | value;
+}
+
static bool rna_Constraint_cameraObject_poll(PointerRNA *ptr, PointerRNA value)
{
Object *ob = (Object *)value.data;
@@ -540,16 +678,58 @@ static void rna_def_constraint_target_common(StructRNA *srna)
static void rna_def_constrainttarget(BlenderRNA *brna)
{
StructRNA *srna;
+ PropertyRNA *prop;
srna = RNA_def_struct(brna, "ConstraintTarget", NULL);
RNA_def_struct_ui_text(srna, "Constraint Target", "Target object for multi-target constraints");
+ RNA_def_struct_path_func(srna, "rna_ConstraintTarget_path");
RNA_def_struct_sdna(srna, "bConstraintTarget");
- rna_def_constraint_target_common(srna);
+ prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "tar");
+ RNA_def_property_ui_text(prop, "Target", "Target object");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
+ RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_ConstraintTarget_dependency_update");
+
+ prop = RNA_def_property(srna, "subtarget", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "subtarget");
+ RNA_def_property_ui_text(prop, "Sub-Target", "Armature bone, mesh or lattice vertex group, ...");
+ RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_ConstraintTarget_dependency_update");
/* space, flag and type still to do */
}
+static void rna_def_constrainttarget_bone(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "ConstraintTargetBone", NULL);
+ RNA_def_struct_ui_text(srna, "Constraint Target Bone", "Target bone for multi-target constraints");
+ RNA_def_struct_path_func(srna, "rna_ConstraintTarget_path");
+ RNA_def_struct_sdna(srna, "bConstraintTarget");
+
+ prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "tar");
+ RNA_def_property_ui_text(prop, "Target", "Target armature");
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_ConstraintTargetBone_target_set", NULL, "rna_Armature_object_poll");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
+ RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_ConstraintTarget_dependency_update");
+
+ prop = RNA_def_property(srna, "subtarget", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "subtarget");
+ RNA_def_property_ui_text(prop, "Sub-Target", "Target armature bone");
+ RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_ConstraintTarget_dependency_update");
+
+ prop = RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "weight");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Blend Weight", "Blending weight of this bone");
+ RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_ConstraintTarget_update");
+}
+
static void rna_def_constraint_childof(BlenderRNA *brna)
{
StructRNA *srna;
@@ -649,6 +829,70 @@ static void rna_def_constraint_python(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Script Error", "The linked Python script has thrown an error");
}
+
+static void rna_def_constraint_armature_deform_targets(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "ArmatureConstraintTargets");
+ srna = RNA_def_struct(brna, "ArmatureConstraintTargets", NULL);
+ RNA_def_struct_sdna(srna, "bConstraint");
+ RNA_def_struct_ui_text(srna, "Armature Deform Constraint Targets", "Collection of target bones and weights");
+
+ func = RNA_def_function(srna, "new", "rna_ArmatureConstraint_target_new");
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_MAIN);
+ RNA_def_function_ui_description(func, "Add a new target to the constraint");
+ parm = RNA_def_pointer(func, "target", "ConstraintTargetBone", "", "New target bone");
+ RNA_def_function_return(func, parm);
+
+ func = RNA_def_function(srna, "remove", "rna_ArmatureConstraint_target_remove");
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_MAIN | FUNC_USE_REPORTS);
+ RNA_def_function_ui_description(func, "Delete target from the constraint");
+ parm = RNA_def_pointer(func, "target", "ConstraintTargetBone", "", "Target to remove");
+ RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
+ RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
+
+ func = RNA_def_function(srna, "clear", "rna_ArmatureConstraint_target_clear");
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_MAIN);
+ RNA_def_function_ui_description(func, "Delete all targets from object");
+}
+
+static void rna_def_constraint_armature_deform(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "ArmatureConstraint", "Constraint");
+ RNA_def_struct_ui_text(srna, "Armature Constraint", "Applies transformations done by the Armature modifier");
+ RNA_def_struct_sdna_from(srna, "bArmatureConstraint", "data");
+
+ prop = RNA_def_property(srna, "targets", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "targets", NULL);
+ RNA_def_property_struct_type(prop, "ConstraintTargetBone");
+ RNA_def_property_ui_text(prop, "Targets", "Target Bones");
+ rna_def_constraint_armature_deform_targets(brna, prop);
+
+ prop = RNA_def_property(srna, "use_deform_preserve_volume", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_ARMATURE_QUATERNION);
+ RNA_def_property_ui_text(prop, "Preserve Volume", "Deform rotation interpolation with quaternions");
+ RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop = RNA_def_property(srna, "use_bone_envelopes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_ARMATURE_ENVELOPE);
+ RNA_def_property_ui_text(prop, "Use Envelopes",
+ "Multiply weights by envelope for all bones, instead of acting like Vertex Group based blending. "
+ "The specified weights are still used, and only the listed bones are considered");
+ RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop = RNA_def_property(srna, "use_current_location", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_ARMATURE_CUR_LOCATION);
+ RNA_def_property_ui_text(prop, "Use Current Location",
+ "Use the current bone location for envelopes and choosing B-Bone segments instead of rest position");
+ RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_update");
+}
+
static void rna_def_constraint_kinematic(BlenderRNA *brna)
{
StructRNA *srna;
@@ -794,16 +1038,6 @@ static void rna_def_constraint_track_to(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static const EnumPropertyItem track_items[] = {
- {TRACK_X, "TRACK_X", 0, "X", ""},
- {TRACK_Y, "TRACK_Y", 0, "Y", ""},
- {TRACK_Z, "TRACK_Z", 0, "Z", ""},
- {TRACK_nX, "TRACK_NEGATIVE_X", 0, "-X", ""},
- {TRACK_nY, "TRACK_NEGATIVE_Y", 0, "-Y", ""},
- {TRACK_nZ, "TRACK_NEGATIVE_Z", 0, "-Z", ""},
- {0, NULL, 0, NULL, NULL}
- };
-
static const EnumPropertyItem up_items[] = {
{TRACK_X, "UP_X", 0, "X", ""},
{TRACK_Y, "UP_Y", 0, "Y", ""},
@@ -822,7 +1056,7 @@ static void rna_def_constraint_track_to(BlenderRNA *brna)
prop = RNA_def_property(srna, "track_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "reserved1");
- RNA_def_property_enum_items(prop, track_items);
+ RNA_def_property_enum_items(prop, track_axis_items);
RNA_def_property_ui_text(prop, "Track Axis", "Axis that points to the target object");
RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_update");
@@ -1137,16 +1371,6 @@ static void rna_def_constraint_locked_track(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static const EnumPropertyItem locktrack_items[] = {
- {TRACK_X, "TRACK_X", 0, "X", ""},
- {TRACK_Y, "TRACK_Y", 0, "Y", ""},
- {TRACK_Z, "TRACK_Z", 0, "Z", ""},
- {TRACK_nX, "TRACK_NEGATIVE_X", 0, "-X", ""},
- {TRACK_nY, "TRACK_NEGATIVE_Y", 0, "-Y", ""},
- {TRACK_nZ, "TRACK_NEGATIVE_Z", 0, "-Z", ""},
- {0, NULL, 0, NULL, NULL}
- };
-
static const EnumPropertyItem lock_items[] = {
{TRACK_X, "LOCK_X", 0, "X", ""},
{TRACK_Y, "LOCK_Y", 0, "Y", ""},
@@ -1166,7 +1390,7 @@ static void rna_def_constraint_locked_track(BlenderRNA *brna)
prop = RNA_def_property(srna, "track_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "trackflag");
- RNA_def_property_enum_items(prop, locktrack_items);
+ RNA_def_property_enum_items(prop, track_axis_items);
RNA_def_property_ui_text(prop, "Track Axis", "Axis that points to the target object");
RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_update");
@@ -1913,6 +2137,16 @@ static void rna_def_constraint_shrinkwrap(BlenderRNA *brna)
"Shrink the location to the nearest target surface along a given axis"},
{MOD_SHRINKWRAP_NEAREST_VERTEX, "NEAREST_VERTEX", 0, "Nearest Vertex",
"Shrink the location to the nearest target vertex"},
+ {MOD_SHRINKWRAP_TARGET_PROJECT, "TARGET_PROJECT", 0, "Target Normal Project",
+ "Shrink the location to the nearest target surface "
+ "along the interpolated vertex normals of the target"},
+ {0, NULL, 0, NULL, NULL}
+ };
+
+ static const EnumPropertyItem shrink_face_cull_items[] = {
+ {0, "OFF", 0, "Off", "No culling"},
+ {CON_SHRINKWRAP_PROJECT_CULL_FRONTFACE, "FRONT", 0, "Front", "No projection when in front of the face"},
+ {CON_SHRINKWRAP_PROJECT_CULL_BACKFACE, "BACK", 0, "Back", "No projection when behind the face"},
{0, NULL, 0, NULL, NULL}
};
@@ -1932,7 +2166,13 @@ static void rna_def_constraint_shrinkwrap(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "shrinkType");
RNA_def_property_enum_items(prop, type_items);
RNA_def_property_ui_text(prop, "Shrinkwrap Type", "Select type of shrinkwrap algorithm for target position");
- RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_update");
+ RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_dependency_update");
+
+ prop = RNA_def_property(srna, "wrap_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "shrinkMode");
+ RNA_def_property_enum_items(prop, rna_enum_modifier_shrinkwrap_mode_items);
+ RNA_def_property_ui_text(prop, "Snap Mode", "Select how to constrain the object to the target surface");
+ RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_dependency_update");
prop = RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "dist");
@@ -1959,6 +2199,36 @@ static void rna_def_constraint_shrinkwrap(BlenderRNA *brna)
RNA_def_property_ui_range(prop, 0.0f, 100.0f, 10, 3);
RNA_def_property_ui_text(prop, "Project Distance", "Limit the distance used for projection (zero disables)");
RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop = RNA_def_property(srna, "use_project_opposite", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", CON_SHRINKWRAP_PROJECT_OPPOSITE);
+ RNA_def_property_ui_text(prop, "Project Opposite", "Project in both specified and opposite directions");
+ RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop = RNA_def_property(srna, "cull_face", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "flag");
+ RNA_def_property_enum_items(prop, shrink_face_cull_items);
+ RNA_def_property_enum_funcs(prop, "rna_ShrinkwrapConstraint_face_cull_get",
+ "rna_ShrinkwrapConstraint_face_cull_set", NULL);
+ RNA_def_property_ui_text(prop, "Face Cull",
+ "Stop vertices from projecting to a face on the target when facing towards/away");
+ RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop = RNA_def_property(srna, "use_invert_cull", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", CON_SHRINKWRAP_PROJECT_INVERT_CULL);
+ RNA_def_property_ui_text(prop, "Invert Cull", "When projecting in the opposite direction invert the face cull mode");
+ RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop = RNA_def_property(srna, "use_track_normal", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", CON_SHRINKWRAP_TRACK_NORMAL);
+ RNA_def_property_ui_text(prop, "Align Axis To Normal", "Align the specified axis to the surface normal");
+ RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_dependency_update");
+
+ prop = RNA_def_property(srna, "track_axis", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "trackAxis");
+ RNA_def_property_enum_items(prop, track_axis_items);
+ RNA_def_property_ui_text(prop, "Track Axis", "Axis that is aligned to the normal");
+ RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_update");
}
static void rna_def_constraint_damped_track(BlenderRNA *brna)
@@ -1966,16 +2236,6 @@ static void rna_def_constraint_damped_track(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static const EnumPropertyItem damptrack_items[] = {
- {TRACK_X, "TRACK_X", 0, "X", ""},
- {TRACK_Y, "TRACK_Y", 0, "Y", ""},
- {TRACK_Z, "TRACK_Z", 0, "Z", ""},
- {TRACK_nX, "TRACK_NEGATIVE_X", 0, "-X", ""},
- {TRACK_nY, "TRACK_NEGATIVE_Y", 0, "-Y", ""},
- {TRACK_nZ, "TRACK_NEGATIVE_Z", 0, "-Z", ""},
- {0, NULL, 0, NULL, NULL}
- };
-
srna = RNA_def_struct(brna, "DampedTrackConstraint", "Constraint");
RNA_def_struct_ui_text(srna, "Damped Track Constraint",
"Point toward target by taking the shortest rotation path");
@@ -1988,7 +2248,7 @@ rna_def_constraint_headtail_common(srna);
prop = RNA_def_property(srna, "track_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "trackflag");
- RNA_def_property_enum_items(prop, damptrack_items);
+ RNA_def_property_enum_items(prop, track_axis_items);
RNA_def_property_ui_text(prop, "Track Axis", "Axis that points to the target object");
RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_update");
}
@@ -2428,9 +2688,11 @@ void RNA_def_constraint(BlenderRNA *brna)
/* pointers */
rna_def_constrainttarget(brna);
+ rna_def_constrainttarget_bone(brna);
rna_def_constraint_childof(brna);
rna_def_constraint_python(brna);
+ rna_def_constraint_armature_deform(brna);
rna_def_constraint_stretch_to(brna);
rna_def_constraint_follow_path(brna);
rna_def_constraint_locked_track(brna);
diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c
index 6b294b9b3cd..e9671754288 100644
--- a/source/blender/makesrna/intern/rna_curve.c
+++ b/source/blender/makesrna/intern/rna_curve.c
@@ -57,11 +57,11 @@ static const EnumPropertyItem beztriple_handle_type_items[] = {
#endif
const EnumPropertyItem rna_enum_keyframe_handle_type_items[] = {
- {HD_FREE, "FREE", 0, "Free", ""},
- {HD_VECT, "VECTOR", 0, "Vector", ""},
- {HD_ALIGN, "ALIGNED", 0, "Aligned", ""},
- {HD_AUTO, "AUTO", 0, "Automatic", ""},
- {HD_AUTO_ANIM, "AUTO_CLAMPED", 0, "Auto Clamped", "Auto handles clamped to not overshoot"},
+ {HD_FREE, "FREE", ICON_HANDLETYPE_FREE_VEC, "Free", "Completely independent manually set handle"},
+ {HD_ALIGN, "ALIGNED", ICON_HANDLETYPE_ALIGNED_VEC, "Aligned", "Manually set handle with rotation locked together with its pair"},
+ {HD_VECT, "VECTOR", ICON_HANDLETYPE_VECTOR_VEC, "Vector", "Automatic handles that create straight lines"},
+ {HD_AUTO, "AUTO", ICON_HANDLETYPE_AUTO_VEC, "Automatic", "Automatic handles that create smooth curves"},
+ {HD_AUTO_ANIM, "AUTO_CLAMPED", ICON_HANDLETYPE_AUTO_CLAMP_VEC, "Auto Clamped", "Automatic handles that create smooth curves which only change direction at keyframes"},
{0, NULL, 0, NULL, NULL}
};
@@ -956,19 +956,21 @@ static void rna_def_font(BlenderRNA *UNUSED(brna), StructRNA *srna)
PropertyRNA *prop;
static const EnumPropertyItem prop_align_items[] = {
- {CU_ALIGN_X_LEFT, "LEFT", 0, "Left", "Align text to the left"},
- {CU_ALIGN_X_MIDDLE, "CENTER", 0, "Center", "Center text"},
- {CU_ALIGN_X_RIGHT, "RIGHT", 0, "Right", "Align text to the right"},
- {CU_ALIGN_X_JUSTIFY, "JUSTIFY", 0, "Justify", "Align to the left and the right"},
- {CU_ALIGN_X_FLUSH, "FLUSH", 0, "Flush", "Align to the left and the right, with equal character spacing"},
+ {CU_ALIGN_X_LEFT, "LEFT", ICON_ALIGN_LEFT, "Left", "Align text to the left"},
+ {CU_ALIGN_X_MIDDLE, "CENTER", ICON_ALIGN_CENTER, "Center", "Center text"},
+ {CU_ALIGN_X_RIGHT, "RIGHT", ICON_ALIGN_RIGHT, "Right", "Align text to the right"},
+ {CU_ALIGN_X_JUSTIFY, "JUSTIFY", ICON_ALIGN_JUSTIFY, "Justify", "Align to the left and the right"},
+ {CU_ALIGN_X_FLUSH, "FLUSH", ICON_ALIGN_FLUSH, "Flush", "Align to the left and the right, with equal character spacing"},
{0, NULL, 0, NULL, NULL}
};
static const EnumPropertyItem prop_align_y_items[] = {
- {CU_ALIGN_Y_TOP_BASELINE, "TOP_BASELINE", 0, "Top Base-Line", "Align to top but use the base-line of the text"},
- {CU_ALIGN_Y_TOP, "TOP", 0, "Top", "Align text to the top"},
- {CU_ALIGN_Y_CENTER, "CENTER", 0, "Center", "Align text to the middle"},
- {CU_ALIGN_Y_BOTTOM, "BOTTOM", 0, "Bottom", "Align text to the bottom"},
+ {CU_ALIGN_Y_TOP_BASELINE, "TOP_BASELINE", ICON_ALIGN_TOP, "Top Base-Line", "Align to top but use the base-line of the text"},
+ {CU_ALIGN_Y_TOP, "TOP", ICON_ALIGN_TOP, "Top", "Align text to the top"},
+ {CU_ALIGN_Y_CENTER, "CENTER", ICON_ALIGN_MIDDLE, "Center", "Align text to the middle"},
+ {CU_ALIGN_Y_BOTTOM, "BOTTOM", ICON_ALIGN_BOTTOM, "Bottom", "Align text to the bottom"},
+ {CU_ALIGN_Y_BOTTOM_BASELINE, "BOTTOM_BASELINE", ICON_ALIGN_BOTTOM, "Bottom Base-Line",
+ "Align text to the bottom but use the base-line of the text"},
{0, NULL, 0, NULL, NULL}
};
@@ -1177,16 +1179,19 @@ static void rna_def_charinfo(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_bold", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_BOLD);
RNA_def_property_ui_text(prop, "Bold", "");
+ RNA_def_property_ui_icon(prop, ICON_BOLD, 0);
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop = RNA_def_property(srna, "use_italic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_ITALIC);
RNA_def_property_ui_text(prop, "Italic", "");
+ RNA_def_property_ui_icon(prop, ICON_ITALIC, 0);
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop = RNA_def_property(srna, "use_underline", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_UNDERLINE);
RNA_def_property_ui_text(prop, "Underline", "");
+ RNA_def_property_ui_icon(prop, ICON_UNDERLINE, 0);
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* probably there is no reason to expose this */
@@ -1200,6 +1205,7 @@ static void rna_def_charinfo(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_small_caps", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_SMALLCAPS);
RNA_def_property_ui_text(prop, "Small Caps", "");
+ RNA_def_property_ui_icon(prop, ICON_SMALL_CAPS, 0);
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED);
@@ -1242,7 +1248,7 @@ static void rna_def_curve_spline_points(BlenderRNA *brna, PropertyRNA *cprop)
/*PropertyRNA *prop; */
FunctionRNA *func;
- /*PropertyRNA *parm; */
+ PropertyRNA *parm;
RNA_def_property_srna(cprop, "SplinePoints");
srna = RNA_def_struct(brna, "SplinePoints", NULL);
@@ -1252,7 +1258,8 @@ static void rna_def_curve_spline_points(BlenderRNA *brna, PropertyRNA *cprop)
func = RNA_def_function(srna, "add", "rna_Curve_spline_points_add");
RNA_def_function_ui_description(func, "Add a number of points to this spline");
RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_REPORTS);
- RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
+ parm = RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
#if 0
func = RNA_def_function(srna, "remove", "rna_Curve_spline_remove");
@@ -1270,7 +1277,7 @@ static void rna_def_curve_spline_bezpoints(BlenderRNA *brna, PropertyRNA *cprop)
/*PropertyRNA *prop; */
FunctionRNA *func;
- /*PropertyRNA *parm; */
+ PropertyRNA *parm;
RNA_def_property_srna(cprop, "SplineBezierPoints");
srna = RNA_def_struct(brna, "SplineBezierPoints", NULL);
@@ -1280,7 +1287,8 @@ static void rna_def_curve_spline_bezpoints(BlenderRNA *brna, PropertyRNA *cprop)
func = RNA_def_function(srna, "add", "rna_Curve_spline_bezpoints_add");
RNA_def_function_ui_description(func, "Add a number of points to this spline");
RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_REPORTS);
- RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
+ parm = RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
#if 0
func = RNA_def_function(srna, "remove", "rna_Curve_spline_remove");
@@ -1381,16 +1389,6 @@ static void rna_def_curve(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Splines", "Collection of splines in this curve data object");
rna_def_curve_splines(brna, prop);
- prop = RNA_def_property(srna, "show_handles", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "drawflag", CU_HIDE_HANDLES);
- RNA_def_property_ui_text(prop, "Draw Handles", "Display Bezier handles in editmode");
- RNA_def_property_update(prop, NC_GEOM | ND_DATA, NULL);
-
- prop = RNA_def_property(srna, "show_normal_face", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "drawflag", CU_HIDE_NORMALS);
- RNA_def_property_ui_text(prop, "Draw Normals", "Display 3D curve normals in editmode");
- RNA_def_property_update(prop, NC_GEOM | ND_DATA, NULL);
-
rna_def_path(brna, srna);
/* Number values */
diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c
index 4964e94652c..2a9b1aac56e 100644
--- a/source/blender/makesrna/intern/rna_define.c
+++ b/source/blender/makesrna/intern/rna_define.c
@@ -425,7 +425,7 @@ static int rna_validate_identifier(const char *identifier, char *error, bool pro
*/
static const char *kwlist[] = {
/* "False", "None", "True", */
- "and", "as", "assert", "break",
+ "and", "as", "assert", "async", "await", "break",
"class", "continue", "def", "del", "elif", "else", "except",
"finally", "for", "from", "global", "if", "import", "in",
"is", "lambda", "nonlocal", "not", "or", "pass", "raise",
@@ -1165,7 +1165,8 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier
case PROP_STRING:
{
StringPropertyRNA *sprop = (StringPropertyRNA *)prop;
-
+ /* By default don't allow NULL string args, callers may clear. */
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
sprop->defaultvalue = "";
break;
}
@@ -1426,11 +1427,13 @@ void RNA_def_property_ui_text(PropertyRNA *prop, const char *name, const char *d
prop->description = description;
}
-void RNA_def_property_ui_icon(PropertyRNA *prop, int icon, bool consecutive)
+void RNA_def_property_ui_icon(PropertyRNA *prop, int icon, int consecutive)
{
prop->icon = icon;
- if (consecutive)
+ if (consecutive != 0)
prop->flag |= PROP_ICONS_CONSECUTIVE;
+ if (consecutive < 0)
+ prop->flag |= PROP_ICONS_REVERSE;
}
/**
@@ -1878,7 +1881,7 @@ static PropertyDefRNA *rna_def_property_sdna(PropertyRNA *prop, const char *stru
return dp;
}
else {
- fprintf(stderr, "%s: \"%s.%s\" (identifier \"%s\") not found.\n",
+ fprintf(stderr, "%s: \"%s.%s\" (identifier \"%s\") not found. Struct must be in DNA.\n",
__func__, structname, propname, prop->identifier);
DefRNA.error = 1;
return NULL;
diff --git a/source/blender/makesrna/intern/rna_depsgraph.c b/source/blender/makesrna/intern/rna_depsgraph.c
index a18442df085..7bfd3f679d8 100644
--- a/source/blender/makesrna/intern/rna_depsgraph.c
+++ b/source/blender/makesrna/intern/rna_depsgraph.c
@@ -43,6 +43,7 @@
#ifdef RNA_RUNTIME
#include "BLI_iterator.h"
+#include "BLI_math.h"
#include "BKE_anim.h"
@@ -60,6 +61,13 @@ static PointerRNA rna_DepsgraphObjectInstance_object_get(PointerRNA *ptr)
return rna_pointer_inherit_refine(ptr, &RNA_Object, iterator->current);
}
+static int rna_DepsgraphObjectInstance_is_instance_get(PointerRNA *ptr)
+{
+ BLI_Iterator *iterator = ptr->data;
+ DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
+ return (deg_iter->dupli_object_current != NULL);
+}
+
static PointerRNA rna_DepsgraphObjectInstance_instance_object_get(PointerRNA *ptr)
{
BLI_Iterator *iterator = ptr->data;
@@ -86,46 +94,72 @@ static PointerRNA rna_DepsgraphObjectInstance_particle_system_get(PointerRNA *pt
{
BLI_Iterator *iterator = ptr->data;
DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
- return rna_pointer_inherit_refine(ptr, &RNA_ParticleSystem,
- deg_iter->dupli_object_current->particle_system);
+ struct ParticleSystem *particle_system = NULL;
+ if (deg_iter->dupli_object_current != NULL) {
+ particle_system = deg_iter->dupli_object_current->particle_system;
+ }
+ return rna_pointer_inherit_refine(ptr, &RNA_ParticleSystem, particle_system);
}
static void rna_DepsgraphObjectInstance_persistent_id_get(PointerRNA *ptr, int *persistent_id)
{
BLI_Iterator *iterator = ptr->data;
DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
- memcpy(persistent_id, deg_iter->dupli_object_current->persistent_id,
- sizeof(deg_iter->dupli_object_current->persistent_id));
+ if (deg_iter->dupli_object_current != NULL) {
+ memcpy(persistent_id, deg_iter->dupli_object_current->persistent_id,
+ sizeof(deg_iter->dupli_object_current->persistent_id));
+ }
+ else {
+ memset(persistent_id, 0, sizeof(deg_iter->dupli_object_current->persistent_id));
+ }
}
-static void rna_DepsgraphObjectInstance_orco_get(PointerRNA *ptr, float *orco)
+static unsigned int rna_DepsgraphObjectInstance_random_id_get(PointerRNA *ptr)
{
BLI_Iterator *iterator = ptr->data;
DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
- memcpy(orco, deg_iter->dupli_object_current->orco,
- sizeof(deg_iter->dupli_object_current->orco));
+ if (deg_iter->dupli_object_current != NULL) {
+ return deg_iter->dupli_object_current->random_id;
+ }
+ else {
+ return 0;
+ }
}
-static unsigned int rna_DepsgraphObjectInstance_random_id_get(PointerRNA *ptr)
+static void rna_DepsgraphObjectInstance_matrix_world_get(PointerRNA *ptr, float *mat)
{
BLI_Iterator *iterator = ptr->data;
DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
- return deg_iter->dupli_object_current->random_id;
+ if (deg_iter->dupli_object_current != NULL) {
+ copy_m4_m4((float(*)[4])mat, deg_iter->dupli_object_current->mat);
+ }
+ else {
+ unit_m4((float(*)[4])mat);
+ }
}
-static void rna_DepsgraphObjectInstance_uv_get(PointerRNA *ptr, float *uv)
+static void rna_DepsgraphObjectInstance_orco_get(PointerRNA *ptr, float *orco)
{
BLI_Iterator *iterator = ptr->data;
DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
- memcpy(uv, deg_iter->dupli_object_current->uv,
- sizeof(deg_iter->dupli_object_current->uv));
+ if (deg_iter->dupli_object_current != NULL) {
+ copy_v3_v3(orco, deg_iter->dupli_object_current->orco);
+ }
+ else {
+ zero_v3(orco);
+ }
}
-static int rna_DepsgraphObjectInstance_is_instance_get(PointerRNA *ptr)
+static void rna_DepsgraphObjectInstance_uv_get(PointerRNA *ptr, float *uv)
{
BLI_Iterator *iterator = ptr->data;
DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
- return (deg_iter->dupli_object_current != NULL);
+ if (deg_iter->dupli_object_current != NULL) {
+ copy_v2_v2(uv, deg_iter->dupli_object_current->uv);
+ }
+ else {
+ zero_v2(uv);
+ }
}
/* ******************** Sorted ***************** */
@@ -380,30 +414,36 @@ static void rna_def_depsgraph_instance(BlenderRNA *brna)
srna = RNA_def_struct(brna, "DepsgraphObjectInstance", NULL);
RNA_def_struct_ui_text(srna, "Dependency Graph Object Instance",
- "Extended information about dependency graph object iterator");
+ "Extended information about dependency graph object iterator "
+ "(WARNING: all data here is *evaluated* one, not original .blend IDs...)");
prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Object");
- RNA_def_property_ui_text(prop, "Object", "Object the iterator points to");
+ RNA_def_property_ui_text(prop, "Object", "Evaluated object the iterator points to");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
RNA_def_property_pointer_funcs(prop, "rna_DepsgraphObjectInstance_object_get", NULL, NULL, NULL);
+ prop = RNA_def_property(srna, "is_instance", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Is Instance", "Denotes whether the object is coming from dupli-list");
+ RNA_def_property_boolean_funcs(prop, "rna_DepsgraphObjectInstance_is_instance_get", NULL);
+
prop = RNA_def_property(srna, "instance_object", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Object");
- RNA_def_property_ui_text(prop, "Instance Object", "Object which is being instanced by this iterator");
+ RNA_def_property_ui_text(prop, "Instance Object", "Evaluated object which is being instanced by this iterator");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
RNA_def_property_pointer_funcs(prop, "rna_DepsgraphObjectInstance_instance_object_get", NULL, NULL, NULL);
prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Object");
- RNA_def_property_ui_text(prop, "Parent", "Parent of the duplication list");
+ RNA_def_property_ui_text(prop, "Parent", "Evaluated parent object of the duplication list");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
RNA_def_property_pointer_funcs(prop, "rna_DepsgraphObjectInstance_parent_get", NULL, NULL, NULL);
prop = RNA_def_property(srna, "particle_system", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "ParticleSystem");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Particle System", "Particle system that this object was instanced from");
+ RNA_def_property_ui_text(prop, "Particle System", "Evaluated particle system that this object was instanced from");
RNA_def_property_pointer_funcs(prop, "rna_DepsgraphObjectInstance_particle_system_get", NULL, NULL, NULL);
prop = RNA_def_property(srna, "persistent_id", PROP_INT, PROP_NONE);
@@ -413,30 +453,28 @@ static void rna_def_depsgraph_instance(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
RNA_def_property_int_funcs(prop, "rna_DepsgraphObjectInstance_persistent_id_get", NULL, NULL);
+ prop = RNA_def_property(srna, "random_id", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Dupli random id", "Random id for this dupli object");
+ RNA_def_property_int_funcs(prop, "rna_DepsgraphObjectInstance_random_id_get", NULL, NULL);
+
+ prop = RNA_def_property(srna, "matrix_world", PROP_FLOAT, PROP_MATRIX);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+ RNA_def_property_ui_text(prop, "Generated Matrix", "Generated transform matrix in world space");
+ RNA_def_property_float_funcs(prop, "rna_DepsgraphObjectInstance_matrix_world_get", NULL, NULL);
+
prop = RNA_def_property(srna, "orco", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
- /* Seems system is not smart enough to figure that getter function should return
- * array for PROP_TRANSLATION.
- */
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Generated Coordinates", "Generated coordinates in parent object space");
RNA_def_property_float_funcs(prop, "rna_DepsgraphObjectInstance_orco_get", NULL, NULL);
- prop = RNA_def_property(srna, "random_id", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Dupli random id", "Random id for this dupli object");
- RNA_def_property_int_funcs(prop, "rna_DepsgraphObjectInstance_random_id_get", NULL, NULL);
-
prop = RNA_def_property(srna, "uv", PROP_FLOAT, PROP_NONE);
RNA_def_property_ui_text(prop, "UV Coordinates", "UV coordinates in parent object space");
RNA_def_property_array(prop, 2);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
RNA_def_property_float_funcs(prop, "rna_DepsgraphObjectInstance_uv_get", NULL, NULL);
-
- prop = RNA_def_property(srna, "is_instance", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Is Instance", "Denotes whether the object is coming from dupli-list");
- RNA_def_property_boolean_funcs(prop, "rna_DepsgraphObjectInstance_is_instance_get", NULL);
}
static void rna_def_depsgraph_update(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_dynamicpaint.c b/source/blender/makesrna/intern/rna_dynamicpaint.c
index 884435d70cf..209860e26c6 100644
--- a/source/blender/makesrna/intern/rna_dynamicpaint.c
+++ b/source/blender/makesrna/intern/rna_dynamicpaint.c
@@ -128,7 +128,7 @@ static void rna_DynamicPaintSurface_changePreview(Main *bmain, Scene *scene, Poi
DynamicPaintSurface *surface = act_surface->canvas->surfaces.first;
/* since only one color surface can show preview at time
- * disable preview on other surfaces*/
+ * disable preview on other surfaces. */
for (; surface; surface = surface->next) {
if (surface != act_surface)
surface->flags &= ~MOD_DPAINT_PREVIEW;
diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c
index 3141e788d8d..7b714bef186 100644
--- a/source/blender/makesrna/intern/rna_fcurve.c
+++ b/source/blender/makesrna/intern/rna_fcurve.c
@@ -72,11 +72,11 @@ const EnumPropertyItem rna_enum_fmodifier_type_items[] = {
};
const EnumPropertyItem rna_enum_beztriple_keyframe_type_items[] = {
- {BEZT_KEYTYPE_KEYFRAME, "KEYFRAME", VICO_KEYTYPE_KEYFRAME_VEC, "Keyframe", "Normal keyframe - e.g. for key poses"},
- {BEZT_KEYTYPE_BREAKDOWN, "BREAKDOWN", VICO_KEYTYPE_BREAKDOWN_VEC, "Breakdown", "A breakdown pose - e.g. for transitions between key poses"},
- {BEZT_KEYTYPE_MOVEHOLD, "MOVING_HOLD", VICO_KEYTYPE_MOVING_HOLD_VEC, "Moving Hold", "A keyframe that is part of a moving hold"},
- {BEZT_KEYTYPE_EXTREME, "EXTREME", VICO_KEYTYPE_EXTREME_VEC, "Extreme", "An 'extreme' pose, or some other purpose as needed"},
- {BEZT_KEYTYPE_JITTER, "JITTER", VICO_KEYTYPE_JITTER_VEC, "Jitter", "A filler or baked keyframe for keying on ones, or some other purpose as needed"},
+ {BEZT_KEYTYPE_KEYFRAME, "KEYFRAME", ICON_KEYTYPE_KEYFRAME_VEC, "Keyframe", "Normal keyframe - e.g. for key poses"},
+ {BEZT_KEYTYPE_BREAKDOWN, "BREAKDOWN", ICON_KEYTYPE_BREAKDOWN_VEC, "Breakdown", "A breakdown pose - e.g. for transitions between key poses"},
+ {BEZT_KEYTYPE_MOVEHOLD, "MOVING_HOLD", ICON_KEYTYPE_MOVING_HOLD_VEC, "Moving Hold", "A keyframe that is part of a moving hold"},
+ {BEZT_KEYTYPE_EXTREME, "EXTREME", ICON_KEYTYPE_EXTREME_VEC, "Extreme", "An 'extreme' pose, or some other purpose as needed"},
+ {BEZT_KEYTYPE_JITTER, "JITTER", ICON_KEYTYPE_JITTER_VEC, "Jitter", "A filler or baked keyframe for keying on ones, or some other purpose as needed"},
{0, NULL, 0, NULL, NULL}
};
@@ -132,6 +132,13 @@ static StructRNA *rna_FModifierType_refine(struct PointerRNA *ptr)
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
+static bool rna_ChannelDriver_is_simple_expression_get(PointerRNA *ptr)
+{
+ ChannelDriver *driver = ptr->data;
+
+ return BKE_driver_has_simple_expression(driver);
+}
+
static void rna_ChannelDriver_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
{
ID *id = ptr->id.data;
@@ -151,7 +158,7 @@ static void rna_ChannelDriver_update_expr(Main *bmain, Scene *scene, PointerRNA
ChannelDriver *driver = ptr->data;
/* tag driver as needing to be recompiled */
- driver->flag |= DRIVER_FLAG_RECOMPILE;
+ BKE_driver_invalidate_expression(driver, true, false);
/* update_data() clears invalid flag and schedules for updates */
rna_ChannelDriver_update_data(bmain, scene, ptr);
@@ -184,8 +191,7 @@ static void rna_DriverTarget_update_name(Main *bmain, Scene *scene, PointerRNA *
ChannelDriver *driver = ptr->data;
rna_DriverTarget_update_data(bmain, scene, ptr);
- driver->flag |= DRIVER_FLAG_RENAMEVAR;
-
+ BKE_driver_invalidate_expression(driver, false, true);
}
/* ----------- */
@@ -1393,7 +1399,7 @@ static void rna_def_fmodifier(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_MUTED);
RNA_def_property_ui_text(prop, "Muted", "F-Curve Modifier will not be evaluated");
RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME_PROP, "rna_FModifier_update");
- RNA_def_property_ui_icon(prop, ICON_MUTE_IPO_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_CHECKBOX_DEHLT, 1);
prop = RNA_def_property(srna, "is_valid", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -1548,10 +1554,10 @@ static void rna_def_drivervar(BlenderRNA *brna)
static const EnumPropertyItem prop_type_items[] = {
{DVAR_TYPE_SINGLE_PROP, "SINGLE_PROP", ICON_RNA, "Single Property", "Use the value from some RNA property (Default)"},
- {DVAR_TYPE_TRANSFORM_CHAN, "TRANSFORMS", ICON_MANIPUL, "Transform Channel",
+ {DVAR_TYPE_TRANSFORM_CHAN, "TRANSFORMS", ICON_DRIVER_TRANSFORM, "Transform Channel",
"Final transformation value of object or bone"},
- {DVAR_TYPE_ROT_DIFF, "ROTATION_DIFF", ICON_PARTICLE_TIP, "Rotational Difference", "Use the angle between two bones"}, /* XXX: Icon... */
- {DVAR_TYPE_LOC_DIFF, "LOC_DIFF", ICON_FULLSCREEN_ENTER, "Distance", "Distance between two bones or objects"}, /* XXX: Icon... */
+ {DVAR_TYPE_ROT_DIFF, "ROTATION_DIFF", ICON_DRIVER_ROTATIONAL_DIFFERENCE, "Rotational Difference", "Use the angle between two bones"},
+ {DVAR_TYPE_LOC_DIFF, "LOC_DIFF", ICON_DRIVER_DISTANCE, "Distance", "Distance between two bones or objects"},
{0, NULL, 0, NULL, NULL}
};
@@ -1675,6 +1681,10 @@ static void rna_def_channeldriver(BlenderRNA *brna)
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", DRIVER_FLAG_INVALID);
RNA_def_property_ui_text(prop, "Invalid", "Driver could not be evaluated in past, so should be skipped");
+ prop = RNA_def_property(srna, "is_simple_expression", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_ChannelDriver_is_simple_expression_get", NULL);
+ RNA_def_property_ui_text(prop, "Simple Expression", "The scripted expression can be evaluated without using the full python interpreter");
/* Functions */
RNA_api_drivers(srna);
@@ -1884,7 +1894,8 @@ static void rna_def_fcurve_keyframe_points(BlenderRNA *brna, PropertyRNA *cprop)
func = RNA_def_function(srna, "add", "rna_FKeyframe_points_add");
RNA_def_function_ui_description(func, "Add a keyframe point to a F-Curve");
- RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
+ parm = RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
func = RNA_def_function(srna, "remove", "rna_FKeyframe_points_remove");
RNA_def_function_ui_description(func, "Remove keyframe from an F-Curve");
diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c
index 6bb93e9e313..8c11909d022 100644
--- a/source/blender/makesrna/intern/rna_gpencil.c
+++ b/source/blender/makesrna/intern/rna_gpencil.c
@@ -59,18 +59,25 @@ static const EnumPropertyItem parent_type_items[] = {
#ifndef RNA_RUNTIME
static EnumPropertyItem rna_enum_gpencil_xraymodes_items[] = {
- { GP_XRAY_FRONT, "FRONT", 0, "Front", "Draw all strokes in front" },
- { GP_XRAY_3DSPACE, "3DSPACE", 0, "3DSpace", "Draw strokes relative to other objects in 3D space" },
- { GP_XRAY_BACK, "BACK", 0, "Back", "Draw all strokes on back" },
- { 0, NULL, 0, NULL, NULL }
+ {GP_XRAY_FRONT, "FRONT", 0, "Front", "Draw all strokes in front"},
+ {GP_XRAY_3DSPACE, "3DSPACE", 0, "3D Space", "Draw strokes relative to other objects in 3D space"},
+ {GP_XRAY_BACK, "BACK", 0, "Back", "Draw all strokes last"},
+ {0, NULL, 0, NULL, NULL}
};
static EnumPropertyItem rna_enum_gpencil_onion_modes_items[] = {
- { GP_ONION_MODE_ABSOLUTE, "ABSOLUTE", 0, "Frames", "Frames in absolute range of scene frame number" },
- { GP_ONION_MODE_RELATIVE, "RELATIVE", 0, "Keyframes", "Frames in relative range of grease pencil keyframes" },
- { GP_ONION_MODE_SELECTED, "SELECTED", 0, "Selected", "Only Selected Frames" },
- { 0, NULL, 0, NULL, NULL }
+ {GP_ONION_MODE_ABSOLUTE, "ABSOLUTE", 0, "Frames", "Frames in absolute range of the scene frame"},
+ {GP_ONION_MODE_RELATIVE, "RELATIVE", 0, "Keyframes", "Frames in relative range of the Grease Pencil keyframes"},
+ {GP_ONION_MODE_SELECTED, "SELECTED", 0, "Selected", "Only selected keyframes"},
+ {0, NULL, 0, NULL, NULL}
};
+
+const EnumPropertyItem rna_enum_gplayer_move_type_items[] = {
+ {-1, "UP", 0, "Up", ""},
+ {1, "DOWN", 0, "Down", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
#endif
#ifdef RNA_RUNTIME
@@ -93,6 +100,38 @@ static void rna_GPencil_update(Main *UNUSED(bmain), Scene *UNUSED(scene), Pointe
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL);
}
+static void rna_GPencil_autolock(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ bGPdata *gpd = (bGPdata *)ptr->id.data;
+ bGPDlayer *gpl = NULL;
+
+ if (gpd->flag & GP_DATA_AUTOLOCK_LAYERS) {
+ bGPDlayer *layer = BKE_gpencil_layer_getactive(gpd);
+
+ /* Lock all other layers */
+ for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+ /* unlock active layer */
+ if (gpl == layer) {
+ gpl->flag &= ~GP_LAYER_LOCKED;
+ }
+ else {
+ gpl->flag |= GP_LAYER_LOCKED;
+ }
+ }
+ }
+ else {
+ /* If disable is better unlock all layers by default or it looks there is
+ * a problem in the UI because the user expects all layers will be unlocked
+ */
+ for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+ gpl->flag &= ~GP_LAYER_LOCKED;
+ }
+ }
+
+ /* standard update */
+ rna_GPencil_update(bmain, scene, ptr);
+}
+
static void rna_GPencil_editmode_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
{
bGPdata *gpd = (bGPdata *)ptr->id.data;
@@ -250,7 +289,7 @@ static const EnumPropertyItem *rna_Object_parent_type_itemf(
Object *par = gpl->parent;
if (par->type == OB_ARMATURE) {
- /* special hack: prevents this being overrided */
+ /* special hack: prevents this being overridden */
RNA_enum_items_add_value(&item, &totitem, &parent_type_items[1], PARSKEL);
RNA_enum_items_add_value(&item, &totitem, parent_type_items, PARBONE);
}
@@ -332,6 +371,10 @@ static void rna_GPencil_active_layer_index_set(PointerRNA *ptr, int value)
bGPDlayer *gpl = BLI_findlink(&gpd->layers, value);
BKE_gpencil_layer_setactive(gpd, gpl);
+
+ /* Now do standard updates... */
+ DEG_id_tag_update(&gpd->id, OB_RECALC_DATA);
+ WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED | ND_SPACE_PROPERTIES, NULL);
}
static void rna_GPencil_active_layer_index_range(PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
@@ -633,6 +676,25 @@ static void rna_GPencil_layer_remove(bGPdata *gpd, ReportList *reports, PointerR
WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
}
+static void rna_GPencil_layer_move(bGPdata *gpd, ReportList *reports, PointerRNA *layer_ptr, int type)
+{
+ bGPDlayer *gpl = layer_ptr->data;
+ if (BLI_findindex(&gpd->layers, gpl) == -1) {
+ BKE_report(reports, RPT_ERROR, "Layer not found in grease pencil data");
+ return;
+ }
+
+ BLI_assert(ELEM(type, -1, 0, 1)); /* we use value below */
+
+ const int direction = type * -1;
+
+ if (BLI_listbase_link_move(&gpd->layers, gpl, direction)) {
+ DEG_id_tag_update(&gpd->id, OB_RECALC_OB | OB_RECALC_DATA);
+ }
+
+ WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
+}
+
static void rna_GPencil_frame_clear(bGPDframe *frame)
{
BKE_gpencil_free_strokes(frame);
@@ -666,6 +728,12 @@ static void rna_GpencilVertex_groups_begin(CollectionPropertyIterator *iter, Poi
else
rna_iterator_array_begin(iter, NULL, 0, 0, 0, NULL);
}
+
+static char *rna_GreasePencilGrid_path(PointerRNA *UNUSED(ptr))
+{
+ return BLI_sprintfN("grid");
+}
+
#else
static void rna_def_gpencil_stroke_point(BlenderRNA *brna)
@@ -719,6 +787,7 @@ static void rna_def_gpencil_stroke_points_api(BlenderRNA *brna, PropertyRNA *cpr
{
StructRNA *srna;
FunctionRNA *func;
+ PropertyRNA *parm;
RNA_def_property_srna(cprop, "GPencilStrokePoints");
srna = RNA_def_struct(brna, "GPencilStrokePoints", NULL);
@@ -727,7 +796,8 @@ static void rna_def_gpencil_stroke_points_api(BlenderRNA *brna, PropertyRNA *cpr
func = RNA_def_function(srna, "add", "rna_GPencil_stroke_point_add");
RNA_def_function_ui_description(func, "Add a new grease pencil stroke point");
- RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the stroke", 0, INT_MAX);
+ parm = RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the stroke", 0, INT_MAX);
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
RNA_def_float(func, "pressure", 1.0f, 0.0f, 1.0f, "Pressure", "Pressure for newly created points", 0.0f, 1.0f);
RNA_def_float(func, "strength", 1.0f, 0.0f, 1.0f, "Strength", "Color intensity (alpha factor) for newly created points", 0.0f, 1.0f);
@@ -798,7 +868,7 @@ static void rna_def_gpencil_mvert_group(BlenderRNA *brna)
RNA_def_struct_ui_icon(srna, ICON_GROUP_VERTEX);
/* we can't point to actual group, it is in the object and so
- * there is no unique group to point to, hence the index */
+ * there is no unique group to point to, hence the index */
prop = RNA_def_property(srna, "group", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "def_nr");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -816,7 +886,7 @@ static void rna_def_gpencil_stroke(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static const EnumPropertyItem stroke_draw_mode_items[] = {
+ static const EnumPropertyItem stroke_display_mode_items[] = {
{0, "SCREEN", 0, "Screen", "Stroke is in screen-space"},
{GP_STROKE_3DSPACE, "3DSPACE", 0, "3D Space", "Stroke is in 3D-space"},
{GP_STROKE_2DSPACE, "2DSPACE", 0, "2D Space", "Stroke is in 2D-space"},
@@ -855,9 +925,9 @@ static void rna_def_gpencil_stroke(BlenderRNA *brna)
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
/* Settings */
- prop = RNA_def_property(srna, "draw_mode", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "display_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
- RNA_def_property_enum_items(prop, stroke_draw_mode_items);
+ RNA_def_property_enum_items(prop, stroke_display_mode_items);
RNA_def_property_ui_text(prop, "Draw Mode", "Coordinate space that stroke is in");
RNA_def_property_update(prop, 0, "rna_GPencil_update");
@@ -1078,10 +1148,21 @@ static void rna_def_gpencil_layer(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Onion Skinning", "Display onion skins before and after the current frame");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+ /* pass index for compositing and modifiers */
+ prop = RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "pass_index");
+ RNA_def_property_ui_text(prop, "Pass Index", "Index number for the \"Layer Index\" pass");
+ RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+
+ prop = RNA_def_property(srna, "viewlayer_render", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "viewlayername");
+ RNA_def_property_ui_text(prop, "ViewLayer",
+ "Only include Layer in this View Layer render output (leave blank to include always)");
+
/* Flags */
prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_HIDE);
- RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, -1);
RNA_def_property_ui_text(prop, "Hide", "Set layer Visibility");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
@@ -1097,12 +1178,10 @@ static void rna_def_gpencil_layer(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Frame Locked", "Lock current frame displayed by layer");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
- /* Unlock colors */
- prop = RNA_def_property(srna, "unlock_color", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_UNLOCK_COLOR);
- RNA_def_property_ui_icon(prop, ICON_RESTRICT_COLOR_OFF, 1);
- RNA_def_property_ui_text(prop, "Unlock Color",
- "Unprotect selected colors from further editing and/or frame changes");
+ prop = RNA_def_property(srna, "lock_material", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_LAYER_UNLOCK_COLOR);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_ui_text(prop, "Lock Material", "Disable Material editing");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
@@ -1125,10 +1204,10 @@ static void rna_def_gpencil_layer(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Points", "Draw the points which make up the strokes (for debugging purposes)");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
- /* X-Ray */
- prop = RNA_def_property(srna, "show_x_ray", PROP_BOOLEAN, PROP_NONE);
+ /* In Front */
+ prop = RNA_def_property(srna, "show_in_front", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_LAYER_NO_XRAY);
- RNA_def_property_ui_text(prop, "X Ray", "Make the layer draw in front of objects");
+ RNA_def_property_ui_text(prop, "In Front", "Make the layer draw in front of objects");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
/* Parent object */
@@ -1200,6 +1279,15 @@ static void rna_def_gpencil_layers_api(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
+ func = RNA_def_function(srna, "move", "rna_GPencil_layer_move");
+ RNA_def_function_ui_description(func, "Move a grease pencil layer in the layer stack");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm = RNA_def_pointer(func, "layer", "GPencilLayer", "", "The layer to move");
+ RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
+ RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
+ parm = RNA_def_enum(func, "type", rna_enum_gplayer_move_type_items, 1, "", "Direction of movement");
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+
prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "GPencilLayer");
RNA_def_property_pointer_funcs(prop, "rna_GPencil_active_layer_get", "rna_GPencil_active_layer_set", NULL, NULL);
@@ -1228,6 +1316,51 @@ static void rna_def_gpencil_layers_api(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
}
+static void rna_def_gpencil_grid(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static const float default_grid_color[] = { 0.5f, 0.5f, 0.5f };
+
+ srna = RNA_def_struct(brna, "GreasePencilGrid", NULL);
+ RNA_def_struct_sdna(srna, "bGPgrid");
+ RNA_def_struct_nested(brna, srna, "GreasePencil");
+
+ RNA_def_struct_path_func(srna, "rna_GreasePencilGrid_path");
+ RNA_def_struct_ui_text(srna, "Grid and Canvas Settings",
+ "Settings for grid and canvas in 3D viewport");
+
+ prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
+ RNA_def_property_float_sdna(prop, NULL, "scale");
+ RNA_def_property_range(prop, 0.01f, FLT_MAX);
+ RNA_def_property_float_default(prop, 1.0f);
+ RNA_def_property_ui_text(prop, "Grid Scale", "Grid scale");
+ RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+
+ prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "color");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_float_array_default(prop, default_grid_color);
+ RNA_def_property_ui_text(prop, "Grid Color", "Color for grid lines");
+ RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+
+ prop = RNA_def_property(srna, "lines", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "lines");
+ RNA_def_property_range(prop, 0, INT_MAX);
+ RNA_def_property_int_default(prop, GP_DEFAULT_GRID_LINES);
+ RNA_def_property_ui_text(prop, "Grid Subdivisions", "Number of subdivisions in each side of symmetry line");
+ RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+
+ prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_XYZ);
+ RNA_def_property_float_sdna(prop, NULL, "offset");
+ RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
+ RNA_def_property_array(prop, 2);
+ RNA_def_property_ui_text(prop, "Offset", "Offset of the canvas");
+ RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+}
+
static void rna_def_gpencil_data(BlenderRNA *brna)
{
StructRNA *srna;
@@ -1294,7 +1427,7 @@ static void rna_def_gpencil_data(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_onion_skinning", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_SHOW_ONIONSKINS);
- RNA_def_property_ui_text(prop, "Onion Skins", "Show ghosts of the frames before and after the current frame");
+ RNA_def_property_ui_text(prop, "Onion Skins", "Show ghosts of the keyframes before and after the current frame");
RNA_def_property_update(prop, NC_SCREEN | NC_SCENE | ND_TOOLSETTINGS | ND_DATA | NC_GPENCIL, "rna_GPencil_update");
prop = RNA_def_property(srna, "show_stroke_direction", PROP_BOOLEAN, PROP_NONE);
@@ -1325,6 +1458,17 @@ static void rna_def_gpencil_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Force Fill Update", "Force recalc of fill data after use deformation modifiers (reduce FPS)");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+ prop = RNA_def_property(srna, "use_adaptative_uv", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_UV_ADAPTATIVE);
+ RNA_def_property_ui_text(prop, "Adaptative UV", "Automatic UVs are calculated depending of the stroke size");
+ RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+
+ prop = RNA_def_property(srna, "use_autolock_layers", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_AUTOLOCK_LAYERS);
+ RNA_def_property_ui_text(prop, "Autolock Layers",
+ "Lock automatically all layers except active one to avoid accidental changes");
+ RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_autolock");
+
prop = RNA_def_property(srna, "edit_line_color", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "line_color");
RNA_def_property_array(prop, 4);
@@ -1404,9 +1548,25 @@ static void rna_def_gpencil_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Onion Opacity", "Change fade opacity of displayed onion frames");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+ prop = RNA_def_property(srna, "zdepth_offset", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "zdepth_offset");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 5);
+ RNA_def_property_ui_text(prop, "Surface Offset",
+ "Offset amount when drawing in surface mode");
+ RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+
+ /* Nested Structs */
+ prop = RNA_def_property(srna, "grid", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_struct_type(prop, "GreasePencilGrid");
+ RNA_def_property_ui_text(prop, "Grid Settings", "Settings for grid and canvas in the 3D viewport");
+
+ rna_def_gpencil_grid(brna);
+
/* API Functions */
func = RNA_def_function(srna, "clear", "rna_GPencil_clear");
- RNA_def_function_ui_description(func, "Remove all the grease pencil data");
+ RNA_def_function_ui_description(func, "Remove all the Grease Pencil data");
}
/* --- */
diff --git a/source/blender/makesrna/intern/rna_gpencil_modifier.c b/source/blender/makesrna/intern/rna_gpencil_modifier.c
index ec8adeaddda..aca68992b59 100644
--- a/source/blender/makesrna/intern/rna_gpencil_modifier.c
+++ b/source/blender/makesrna/intern/rna_gpencil_modifier.c
@@ -43,7 +43,6 @@
#include "BKE_animsys.h"
#include "BKE_data_transfer.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_dynamicpaint.h"
#include "BKE_effect.h"
#include "BKE_mesh_mapping.h"
@@ -62,52 +61,53 @@
const EnumPropertyItem rna_enum_object_greasepencil_modifier_type_items[] = {
{0, "", 0, N_("Generate"), "" },
- {eGpencilModifierType_Instance, "GP_INSTANCE", ICON_MOD_ARRAY, "Instance", "Create grid of duplicate instances"},
+ {eGpencilModifierType_Array, "GP_ARRAY", ICON_MOD_ARRAY, "Array", "Create array of duplicate instances"},
{eGpencilModifierType_Build, "GP_BUILD", ICON_MOD_BUILD, "Build", "Create duplication of strokes"},
- {eGpencilModifierType_Simplify, "GP_SIMPLIFY", ICON_MOD_DECIM, "Simplify", "Simplify stroke reducing number of points"},
+ {eGpencilModifierType_Mirror, "GP_MIRROR", ICON_MOD_MIRROR, "Mirror", "Duplicate strokes like a mirror"},
+ {eGpencilModifierType_Simplify, "GP_SIMPLIFY", ICON_MOD_SIMPLIFY, "Simplify", "Simplify stroke reducing number of points"},
{eGpencilModifierType_Subdiv, "GP_SUBDIV", ICON_MOD_SUBSURF, "Subdivide", "Subdivide stroke adding more control points"},
{0, "", 0, N_("Deform"), "" },
{eGpencilModifierType_Armature, "GP_ARMATURE", ICON_MOD_ARMATURE, "Armature", "Deform stroke points using armature object"},
{eGpencilModifierType_Hook, "GP_HOOK", ICON_HOOK, "Hook", "Deform stroke points using objects"},
{eGpencilModifierType_Lattice, "GP_LATTICE", ICON_MOD_LATTICE, "Lattice", "Deform strokes using lattice"},
- {eGpencilModifierType_Mirror, "GP_MIRROR", ICON_MOD_MIRROR, "Mirror", "Duplicate strokes like a mirror"},
- {eGpencilModifierType_Noise, "GP_NOISE", ICON_RNDCURVE, "Noise", "Add noise to strokes"},
- {eGpencilModifierType_Offset, "GP_OFFSET", ICON_MOD_DISPLACE, "Offset", "Change stroke location, rotation or scale"},
+ {eGpencilModifierType_Noise, "GP_NOISE", ICON_MOD_NOISE, "Noise", "Add noise to strokes"},
+ {eGpencilModifierType_Offset, "GP_OFFSET", ICON_MOD_OFFSET, "Offset", "Change stroke location, rotation or scale"},
{eGpencilModifierType_Smooth, "GP_SMOOTH", ICON_MOD_SMOOTH, "Smooth", "Smooth stroke"},
- {eGpencilModifierType_Thick, "GP_THICK", ICON_MAN_ROT, "Thickness", "Change stroke thickness"},
+ {eGpencilModifierType_Thick, "GP_THICK", ICON_MOD_THICKNESS, "Thickness", "Change stroke thickness"},
+ {eGpencilModifierType_Time, "GP_TIME", ICON_MOD_TIME, "Time Offset", "Offset keyframes"},
{0, "", 0, N_("Color"), "" },
- {eGpencilModifierType_Color, "GP_COLOR", ICON_GROUP_VCOL, "Hue/Saturation", "Apply changes to stroke colors"},
- {eGpencilModifierType_Opacity, "GP_OPACITY", ICON_MOD_MASK, "Opacity", "Opacity of the strokes"},
- {eGpencilModifierType_Tint, "GP_TINT", ICON_COLOR, "Tint", "Tint strokes with new color"},
+ {eGpencilModifierType_Color, "GP_COLOR", ICON_MOD_HUE_SATURATION, "Hue/Saturation", "Apply changes to stroke colors"},
+ {eGpencilModifierType_Opacity, "GP_OPACITY", ICON_MOD_OPACITY, "Opacity", "Opacity of the strokes"},
+ {eGpencilModifierType_Tint, "GP_TINT", ICON_MOD_TINT, "Tint", "Tint strokes with new color"},
{0, NULL, 0, NULL, NULL}
};
#ifndef RNA_RUNTIME
static const EnumPropertyItem modifier_modify_color_items[] = {
- { GP_MODIFY_COLOR_BOTH, "BOTH", 0, "Both", "Modify fill and stroke colors" },
- { GP_MODIFY_COLOR_STROKE, "STROKE", 0, "Stroke", "Modify stroke color only" },
- { GP_MODIFY_COLOR_FILL, "FILL", 0, "Fill", "Modify fill color only" },
- { 0, NULL, 0, NULL, NULL }
+ {GP_MODIFY_COLOR_BOTH, "BOTH", 0, "Both", "Modify fill and stroke colors"},
+ {GP_MODIFY_COLOR_STROKE, "STROKE", 0, "Stroke", "Modify stroke color only"},
+ {GP_MODIFY_COLOR_FILL, "FILL", 0, "Fill", "Modify fill color only"},
+ {0, NULL, 0, NULL, NULL}
};
static const EnumPropertyItem modifier_gphook_falloff_items[] = {
- { eGPHook_Falloff_None, "NONE", 0, "No Falloff", "" },
- { eGPHook_Falloff_Curve, "CURVE", 0, "Curve", "" },
- { eGPHook_Falloff_Smooth, "SMOOTH", ICON_SMOOTHCURVE, "Smooth", "" },
- { eGPHook_Falloff_Sphere, "SPHERE", ICON_SPHERECURVE, "Sphere", "" },
- { eGPHook_Falloff_Root, "ROOT", ICON_ROOTCURVE, "Root", "" },
- { eGPHook_Falloff_InvSquare, "INVERSE_SQUARE", ICON_ROOTCURVE, "Inverse Square", "" },
- { eGPHook_Falloff_Sharp, "SHARP", ICON_SHARPCURVE, "Sharp", "" },
- { eGPHook_Falloff_Linear, "LINEAR", ICON_LINCURVE, "Linear", "" },
- { eGPHook_Falloff_Const, "CONSTANT", ICON_NOCURVE, "Constant", "" },
- { 0, NULL, 0, NULL, NULL }
+ {eGPHook_Falloff_None, "NONE", 0, "No Falloff", ""},
+ {eGPHook_Falloff_Curve, "CURVE", 0, "Curve", ""},
+ {eGPHook_Falloff_Smooth, "SMOOTH", ICON_SMOOTHCURVE, "Smooth", ""},
+ {eGPHook_Falloff_Sphere, "SPHERE", ICON_SPHERECURVE, "Sphere", ""},
+ {eGPHook_Falloff_Root, "ROOT", ICON_ROOTCURVE, "Root", ""},
+ {eGPHook_Falloff_InvSquare, "INVERSE_SQUARE", ICON_ROOTCURVE, "Inverse Square", ""},
+ {eGPHook_Falloff_Sharp, "SHARP", ICON_SHARPCURVE, "Sharp", ""},
+ {eGPHook_Falloff_Linear, "LINEAR", ICON_LINCURVE, "Linear", ""},
+ {eGPHook_Falloff_Const, "CONSTANT", ICON_NOCURVE, "Constant", ""},
+ {0, NULL, 0, NULL, NULL}
};
-static const EnumPropertyItem rna_enum_gpencil_lockshift_items[] = {
- { GP_LOCKAXIS_X, "GP_LOCKAXIS_X", 0, "X", "Use X axis" },
- { GP_LOCKAXIS_Y, "GP_LOCKAXIS_Y", 0, "Y", "Use Y axis" },
- { GP_LOCKAXIS_Z, "GP_LOCKAXIS_Z", 0, "Z", "Use Z axis" },
- { 0, NULL, 0, NULL, NULL }
+static const EnumPropertyItem rna_enum_time_mode_items[] = {
+ {GP_TIME_MODE_NORMAL, "NORMAL", 0, "Normal", "Apply offset in normal animation direction"},
+ {GP_TIME_MODE_REVERSE, "REVERSE", 0, "Reverse", "Apply offset in reverse animation direction"},
+ {GP_TIME_MODE_FIX, "FIX", 0, "Fixed Frame", "Keep frame and do not change with time"},
+ {0, NULL, 0, NULL, NULL}
};
#endif
@@ -120,7 +120,6 @@ static const EnumPropertyItem rna_enum_gpencil_lockshift_items[] = {
#include "BKE_cachefile.h"
#include "BKE_context.h"
-#include "BKE_library.h"
#include "BKE_gpencil_modifier.h"
#include "BKE_object.h"
#include "BKE_gpencil.h"
@@ -143,10 +142,12 @@ static StructRNA *rna_GpencilModifier_refine(struct PointerRNA *ptr)
return &RNA_ThickGpencilModifier;
case eGpencilModifierType_Tint:
return &RNA_TintGpencilModifier;
+ case eGpencilModifierType_Time:
+ return &RNA_TimeGpencilModifier;
case eGpencilModifierType_Color:
return &RNA_ColorGpencilModifier;
- case eGpencilModifierType_Instance:
- return &RNA_InstanceGpencilModifier;
+ case eGpencilModifierType_Array:
+ return &RNA_ArrayGpencilModifier;
case eGpencilModifierType_Build:
return &RNA_BuildGpencilModifier;
case eGpencilModifierType_Opacity:
@@ -271,6 +272,28 @@ static void rna_HookGpencilModifier_object_set(PointerRNA *ptr, PointerRNA value
BKE_object_modifier_gpencil_hook_reset(ob, hmd);
}
+static void rna_TimeModifier_start_frame_set(PointerRNA *ptr, int value)
+{
+ TimeGpencilModifierData *tmd = ptr->data;
+ CLAMP(value, MINFRAME, MAXFRAME);
+ tmd->sfra = value;
+
+ if (tmd->sfra >= tmd->efra) {
+ tmd->efra = MIN2(tmd->sfra, MAXFRAME);
+ }
+}
+
+static void rna_TimeModifier_end_frame_set(PointerRNA *ptr, int value)
+{
+ TimeGpencilModifierData *tmd = ptr->data;
+ CLAMP(value, MINFRAME, MAXFRAME);
+ tmd->efra = value;
+
+ if (tmd->sfra >= tmd->efra) {
+ tmd->sfra = MAX2(tmd->efra, MINFRAME);
+ }
+}
+
#else
static void rna_def_modifier_gpencilnoise(BlenderRNA *brna)
@@ -281,7 +304,7 @@ static void rna_def_modifier_gpencilnoise(BlenderRNA *brna)
srna = RNA_def_struct(brna, "NoiseGpencilModifier", "GpencilModifier");
RNA_def_struct_ui_text(srna, "Noise Modifier", "Noise effect modifier");
RNA_def_struct_sdna(srna, "NoiseGpencilModifierData");
- RNA_def_struct_ui_icon(srna, ICON_RNDCURVE);
+ RNA_def_struct_ui_icon(srna, ICON_MOD_NOISE);
prop = RNA_def_property(srna, "layer", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "layername");
@@ -305,22 +328,22 @@ static void rna_def_modifier_gpencilnoise(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Random", "Use random values");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "affect_position", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_edit_position", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_NOISE_MOD_LOCATION);
RNA_def_property_ui_text(prop, "Affect Position", "The modifier affects the position of the point");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "affect_strength", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_edit_strength", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_NOISE_MOD_STRENGTH);
RNA_def_property_ui_text(prop, "Affect Strength", "The modifier affects the color strength of the point");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "affect_thickness", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_edit_thickness", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_NOISE_MOD_THICKNESS);
RNA_def_property_ui_text(prop, "Affect Thickness", "The modifier affects the thickness of the point");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "affect_uv", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_edit_uv", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_NOISE_MOD_UV);
RNA_def_property_ui_text(prop, "Affect UV", "The modifier affects the UV rotation factor of the point");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
@@ -352,7 +375,7 @@ static void rna_def_modifier_gpencilnoise(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "invert_pass", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "invert_material_pass", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_NOISE_INVERT_PASS);
RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
@@ -361,6 +384,17 @@ static void rna_def_modifier_gpencilnoise(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_NOISE_INVERT_VGROUP);
RNA_def_property_ui_text(prop, "Inverse VertexGroup", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "layer_pass", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "layer_pass");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Pass", "Layer pass index");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "invert_layer_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_NOISE_INVERT_LAYERPASS);
+ RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
}
static void rna_def_modifier_gpencilsmooth(BlenderRNA *brna)
@@ -390,22 +424,22 @@ static void rna_def_modifier_gpencilsmooth(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Factor", "Amount of smooth to apply");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "affect_position", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_edit_position", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_SMOOTH_MOD_LOCATION);
RNA_def_property_ui_text(prop, "Affect Position", "The modifier affects the position of the point");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "affect_strength", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_edit_strength", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_SMOOTH_MOD_STRENGTH);
RNA_def_property_ui_text(prop, "Affect Strength", "The modifier affects the color strength of the point");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "affect_thickness", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_edit_thickness", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_SMOOTH_MOD_THICKNESS);
RNA_def_property_ui_text(prop, "Affect Thickness", "The modifier affects the thickness of the point");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "affect_uv", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_edit_uv", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_SMOOTH_MOD_UV);
RNA_def_property_ui_text(prop, "Affect UV", "The modifier affects the UV rotation factor of the point");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
@@ -427,7 +461,7 @@ static void rna_def_modifier_gpencilsmooth(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "invert_pass", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "invert_material_pass", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_SMOOTH_INVERT_PASS);
RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
@@ -436,6 +470,17 @@ static void rna_def_modifier_gpencilsmooth(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_SMOOTH_INVERT_VGROUP);
RNA_def_property_ui_text(prop, "Inverse VertexGroup", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "layer_pass", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "layer_pass");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Pass", "Layer pass index");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "invert_layer_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_SMOOTH_INVERT_LAYERPASS);
+ RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
}
static void rna_def_modifier_gpencilsubdiv(BlenderRNA *brna)
@@ -475,10 +520,21 @@ static void rna_def_modifier_gpencilsubdiv(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "invert_pass", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "invert_material_pass", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_SUBDIV_INVERT_PASS);
RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "layer_pass", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "layer_pass");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Pass", "Layer pass index");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "invert_layer_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_SUBDIV_INVERT_LAYERPASS);
+ RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
}
static void rna_def_modifier_gpencilsimplify(BlenderRNA *brna)
@@ -487,17 +543,17 @@ static void rna_def_modifier_gpencilsimplify(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem prop_gpencil_simplify_mode_items[] = {
- { GP_SIMPLIFY_FIXED, "FIXED", ICON_IPO_CONSTANT, "Fixed",
- "Delete alternative vertices in the stroke, except extrems" },
- { GP_SIMPLIFY_ADAPTATIVE, "ADAPTATIVE", ICON_IPO_EASE_IN_OUT, "Adaptative",
+ {GP_SIMPLIFY_FIXED, "FIXED", ICON_IPO_CONSTANT, "Fixed",
+ "Delete alternative vertices in the stroke, except extrems"},
+ {GP_SIMPLIFY_ADAPTATIVE, "ADAPTATIVE", ICON_IPO_EASE_IN_OUT, "Adaptative",
"Use a RDP algorithm to simplify" },
- { 0, NULL, 0, NULL, NULL }
+ {0, NULL, 0, NULL, NULL}
};
srna = RNA_def_struct(brna, "SimplifyGpencilModifier", "GpencilModifier");
RNA_def_struct_ui_text(srna, "Simplify Modifier", "Simplify Stroke modifier");
RNA_def_struct_sdna(srna, "SimplifyGpencilModifierData");
- RNA_def_struct_ui_icon(srna, ICON_MOD_DECIM);
+ RNA_def_struct_ui_icon(srna, ICON_MOD_SIMPLIFY);
prop = RNA_def_property(srna, "layer", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "layername");
@@ -522,11 +578,22 @@ static void rna_def_modifier_gpencilsimplify(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "invert_pass", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "invert_material_pass", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_SIMPLIFY_INVERT_PASS);
RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+ prop = RNA_def_property(srna, "layer_pass", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "layer_pass");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Pass", "Layer pass index");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "invert_layer_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_SIMPLIFY_INVERT_LAYERPASS);
+ RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
/* Mode */
prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_gpencil_simplify_mode_items);
@@ -548,7 +615,7 @@ static void rna_def_modifier_gpencilthick(BlenderRNA *brna)
srna = RNA_def_struct(brna, "ThickGpencilModifier", "GpencilModifier");
RNA_def_struct_ui_text(srna, "Thick Modifier", "Subdivide and Smooth Stroke modifier");
RNA_def_struct_sdna(srna, "ThickGpencilModifierData");
- RNA_def_struct_ui_icon(srna, ICON_MAN_ROT);
+ RNA_def_struct_ui_icon(srna, ICON_MOD_THICKNESS);
prop = RNA_def_property(srna, "layer", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "layername");
@@ -578,7 +645,7 @@ static void rna_def_modifier_gpencilthick(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "invert_pass", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "invert_material_pass", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_THICK_INVERT_PASS);
RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
@@ -588,6 +655,17 @@ static void rna_def_modifier_gpencilthick(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse VertexGroup", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+ prop = RNA_def_property(srna, "layer_pass", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "layer_pass");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Pass", "Layer pass index");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "invert_layer_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_THICK_INVERT_LAYERPASS);
+ RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
+ 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_THICK_CUSTOM_CURVE);
RNA_def_property_ui_text(prop, "Custom Curve", "Use a custom curve to define thickness changes");
@@ -612,7 +690,7 @@ static void rna_def_modifier_gpenciloffset(BlenderRNA *brna)
srna = RNA_def_struct(brna, "OffsetGpencilModifier", "GpencilModifier");
RNA_def_struct_ui_text(srna, "Offset Modifier", "Offset Stroke modifier");
RNA_def_struct_sdna(srna, "OffsetGpencilModifierData");
- RNA_def_struct_ui_icon(srna, ICON_MOD_DISPLACE);
+ RNA_def_struct_ui_icon(srna, ICON_MOD_OFFSET);
prop = RNA_def_property(srna, "layer", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "layername");
@@ -636,7 +714,7 @@ static void rna_def_modifier_gpenciloffset(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "invert_pass", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "invert_material_pass", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_OFFSET_INVERT_PASS);
RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
@@ -646,6 +724,17 @@ static void rna_def_modifier_gpenciloffset(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse VertexGroup", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+ prop = RNA_def_property(srna, "layer_pass", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "layer_pass");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Pass", "Layer pass index");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "invert_layer_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_OFFSET_INVERT_LAYERPASS);
+ RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
prop = RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "loc");
RNA_def_property_ui_text(prop, "Location", "Values for change location");
@@ -654,7 +743,7 @@ static void rna_def_modifier_gpenciloffset(BlenderRNA *brna)
prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_EULER);
RNA_def_property_float_sdna(prop, NULL, "rot");
- RNA_def_property_ui_text(prop, "Rotation", "Values for chages in 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_GpencilModifier_update");
@@ -714,10 +803,102 @@ static void rna_def_modifier_gpenciltint(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "invert_pass", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "invert_material_pass", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TINT_INVERT_PASS);
RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "layer_pass", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "layer_pass");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Pass", "Layer pass index");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "invert_layer_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TINT_INVERT_LAYERPASS);
+ RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+}
+
+static void rna_def_modifier_gpenciltime(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "TimeGpencilModifier", "GpencilModifier");
+ RNA_def_struct_ui_text(srna, "Time Offset Modifier", "Time offset modifier");
+ RNA_def_struct_sdna(srna, "TimeGpencilModifierData");
+ RNA_def_struct_ui_icon(srna, ICON_MOD_TIME);
+
+ prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "mode");
+ RNA_def_property_enum_items(prop, rna_enum_time_mode_items);
+ RNA_def_property_ui_text(prop, "Mode", "");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "layer", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "layername");
+ RNA_def_property_ui_text(prop, "Layer", "Layer name");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "invert_layers", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TIME_INVERT_LAYER);
+ RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "layer_pass", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "layer_pass");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Pass", "Layer pass index");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "invert_layer_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TIME_INVERT_LAYERPASS);
+ RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "offset", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "offset");
+ RNA_def_property_range(prop, -INT_MAX, INT_MAX);
+ RNA_def_property_ui_text(prop, "Frame Offset",
+ "Number of frames to offset original keyframe number or frame to fix");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "frame_scale", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "frame_scale");
+ RNA_def_property_range(prop, 0.001f, 100.0f);
+ RNA_def_property_ui_text(prop, "Frame Scale", "Evaluation time in seconds");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_int_sdna(prop, NULL, "sfra");
+ RNA_def_property_int_funcs(prop, NULL, "rna_TimeModifier_start_frame_set", NULL);
+ RNA_def_property_range(prop, MINFRAME, MAXFRAME);
+ RNA_def_property_int_default(prop, 1);
+ RNA_def_property_ui_text(prop, "Start Frame", "First frame of the range");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_int_sdna(prop, NULL, "efra");
+ RNA_def_property_int_funcs(prop, NULL, "rna_TimeModifier_end_frame_set", NULL);
+ RNA_def_property_range(prop, MINFRAME, MAXFRAME);
+ RNA_def_property_int_default(prop, 250);
+ RNA_def_property_ui_text(prop, "End Frame", "Final frame of the range");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "use_keep_loop", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TIME_KEEP_LOOP);
+ RNA_def_property_ui_text(prop, "Keep Loop",
+ "Retiming end frames and move to start of animation to keep loop");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "use_custom_frame_range", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_TIME_CUSTOM_RANGE);
+ RNA_def_property_ui_text(prop, "Custom Range",
+ "Define a custom range of frames to use in modifier");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
}
static void rna_def_modifier_gpencilcolor(BlenderRNA *brna)
@@ -728,7 +909,7 @@ static void rna_def_modifier_gpencilcolor(BlenderRNA *brna)
srna = RNA_def_struct(brna, "ColorGpencilModifier", "GpencilModifier");
RNA_def_struct_ui_text(srna, "Hue/Saturation Modifier", "Change Hue/Saturation modifier");
RNA_def_struct_sdna(srna, "ColorGpencilModifierData");
- RNA_def_struct_ui_icon(srna, ICON_GROUP_VCOL);
+ RNA_def_struct_ui_icon(srna, ICON_MOD_TINT);
prop = RNA_def_property(srna, "modify_color", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, modifier_modify_color_items); /* share the enum */
@@ -777,10 +958,21 @@ static void rna_def_modifier_gpencilcolor(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "invert_pass", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "invert_material_pass", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_COLOR_INVERT_PASS);
RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "layer_pass", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "layer_pass");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Pass", "Layer pass index");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "invert_layer_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_COLOR_INVERT_LAYERPASS);
+ RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
}
static void rna_def_modifier_gpencilopacity(BlenderRNA *brna)
@@ -791,7 +983,7 @@ static void rna_def_modifier_gpencilopacity(BlenderRNA *brna)
srna = RNA_def_struct(brna, "OpacityGpencilModifier", "GpencilModifier");
RNA_def_struct_ui_text(srna, "Opacity Modifier", "Opacity of Strokes modifier");
RNA_def_struct_sdna(srna, "OpacityGpencilModifierData");
- RNA_def_struct_ui_icon(srna, ICON_MOD_MASK);
+ RNA_def_struct_ui_icon(srna, ICON_MOD_OPACITY);
prop = RNA_def_property(srna, "modify_color", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, modifier_modify_color_items); /* share the enum */
@@ -831,7 +1023,7 @@ static void rna_def_modifier_gpencilopacity(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "invert_pass", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "invert_material_pass", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_OPACITY_INVERT_PASS);
RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
@@ -840,6 +1032,17 @@ static void rna_def_modifier_gpencilopacity(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_OPACITY_INVERT_VGROUP);
RNA_def_property_ui_text(prop, "Inverse VertexGroup", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "layer_pass", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "layer_pass");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Pass", "Layer pass index");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "invert_layer_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_OPACITY_INVERT_LAYERPASS);
+ RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
}
static void rna_def_modifier_gpencilinstance(BlenderRNA *brna)
@@ -847,9 +1050,9 @@ static void rna_def_modifier_gpencilinstance(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- srna = RNA_def_struct(brna, "InstanceGpencilModifier", "GpencilModifier");
+ srna = RNA_def_struct(brna, "ArrayGpencilModifier", "GpencilModifier");
RNA_def_struct_ui_text(srna, "Instance Modifier", "Create grid of duplicate instances");
- RNA_def_struct_sdna(srna, "InstanceGpencilModifierData");
+ RNA_def_struct_sdna(srna, "ArrayGpencilModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_ARRAY);
prop = RNA_def_property(srna, "layer", PROP_STRING, PROP_NONE);
@@ -863,13 +1066,21 @@ static void rna_def_modifier_gpencilinstance(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Pass", "Pass index");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "count", PROP_INT, PROP_XYZ);
+ prop = RNA_def_property(srna, "count", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 1, INT_MAX);
- RNA_def_property_ui_range(prop, 1, 20, 1, -1);
+ RNA_def_property_ui_range(prop, 1, 50, 1, -1);
RNA_def_property_ui_text(prop, "Count", "Number of items");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
/* Offset parameters */
+ prop = RNA_def_property(srna, "offset_object", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "object");
+ RNA_def_property_ui_text(prop, "Object Offset",
+ "Use the location and rotation of another object to determine the distance and "
+ "rotational change between arrayed items");
+ RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_dependency_update");
+
prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "offset");
RNA_def_property_ui_text(prop, "Offset", "Value for the distance between items");
@@ -882,16 +1093,9 @@ static void rna_def_modifier_gpencilinstance(BlenderRNA *brna)
RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT);
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "lock_axis", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "lock_axis");
- RNA_def_property_enum_items(prop, rna_enum_gpencil_lockshift_items);
- //RNA_def_property_flag(prop, PROP_ENUM_FLAG);
- RNA_def_property_ui_text(prop, "Axis", "");
- RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
-
prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_EULER);
RNA_def_property_float_sdna(prop, NULL, "rot");
- RNA_def_property_ui_text(prop, "Rotation", "Value for chages in rotation");
+ RNA_def_property_ui_text(prop, "Rotation", "Value 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_GpencilModifier_update");
@@ -902,7 +1106,7 @@ static void rna_def_modifier_gpencilinstance(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
prop = RNA_def_property(srna, "random_rot", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_INSTANCE_RANDOM_ROT);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_ARRAY_RANDOM_ROT);
RNA_def_property_ui_text(prop, "Random Rotation", "Use random factors for rotation");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
@@ -913,7 +1117,7 @@ static void rna_def_modifier_gpencilinstance(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
prop = RNA_def_property(srna, "random_scale", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_INSTANCE_RANDOM_SIZE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_ARRAY_RANDOM_SIZE);
RNA_def_property_ui_text(prop, "Random Scale", "Use random factors for scale");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
@@ -923,16 +1127,38 @@ static void rna_def_modifier_gpencilinstance(BlenderRNA *brna)
RNA_def_property_range(prop, -10.0, 10.0);
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+ prop = RNA_def_property(srna, "replace_material", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "mat_rpl");
+ RNA_def_property_range(prop, 0, INT_MAX);
+ RNA_def_property_ui_text(prop, "Material", "Index of the material used for generated strokes (0 keep original material)");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
prop = RNA_def_property(srna, "invert_layers", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_INSTANCE_INVERT_LAYER);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_ARRAY_INVERT_LAYER);
RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "invert_pass", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_INSTANCE_INVERT_PASS);
+ prop = RNA_def_property(srna, "invert_material_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_ARRAY_INVERT_PASS);
+ RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "layer_pass", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "layer_pass");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Pass", "Layer pass index");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "invert_layer_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_ARRAY_INVERT_LAYERPASS);
RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+ prop = RNA_def_property(srna, "keep_on_top", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_ARRAY_KEEP_ONTOP);
+ RNA_def_property_ui_text(prop, "Keep On Top",
+ "Keep the original stroke in front of new instances (only affect by layer)");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
}
static void rna_def_modifier_gpencilbuild(BlenderRNA *brna)
@@ -1044,19 +1270,16 @@ static void rna_def_modifier_gpencilbuild(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- /* Filters - Pass Index */
-#if 0
- prop = RNA_def_property(srna, "pass_index", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "pass_index");
+ prop = RNA_def_property(srna, "layer_pass", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "layer_pass");
RNA_def_property_range(prop, 0, 100);
- RNA_def_property_ui_text(prop, "Pass", "Pass index");
+ RNA_def_property_ui_text(prop, "Pass", "Layer pass index");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "invert_pass", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BUILD_INVERT_PASS);
+ prop = RNA_def_property(srna, "invert_layer_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BUILD_INVERT_LAYERPASS);
RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
-#endif
}
static void rna_def_modifier_gpencillattice(BlenderRNA *brna)
@@ -1091,7 +1314,7 @@ static void rna_def_modifier_gpencillattice(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "invert_pass", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "invert_material_pass", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LATTICE_INVERT_PASS);
RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
@@ -1101,6 +1324,17 @@ static void rna_def_modifier_gpencillattice(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse VertexGroup", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+ prop = RNA_def_property(srna, "layer_pass", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "layer_pass");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Pass", "Layer pass index");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "invert_layer_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LATTICE_INVERT_LAYERPASS);
+ RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Object", "Lattice object to deform with");
RNA_def_property_pointer_funcs(prop, NULL, "rna_LatticeGpencilModifier_object_set", NULL, "rna_Lattice_object_poll");
@@ -1140,11 +1374,22 @@ static void rna_def_modifier_gpencilmirror(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "invert_pass", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "invert_material_pass", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_MIRROR_INVERT_PASS);
RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+ prop = RNA_def_property(srna, "layer_pass", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "layer_pass");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Pass", "Layer pass index");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "invert_layer_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_MIRROR_INVERT_LAYERPASS);
+ RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Object", "Object used as center");
RNA_def_property_pointer_funcs(prop, NULL, "rna_MirrorGpencilModifier_object_set", NULL, NULL);
@@ -1216,7 +1461,7 @@ static void rna_def_modifier_gpencilhook(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse Layers", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- prop = RNA_def_property(srna, "invert_pass", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "invert_material_pass", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_HOOK_INVERT_PASS);
RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
@@ -1226,6 +1471,17 @@ static void rna_def_modifier_gpencilhook(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Inverse VertexGroup", "Inverse filter");
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+ prop = RNA_def_property(srna, "layer_pass", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "layer_pass");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Pass", "Layer pass index");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
+ prop = RNA_def_property(srna, "invert_layer_pass", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_HOOK_INVERT_LAYERPASS);
+ RNA_def_property_ui_text(prop, "Inverse Pass", "Inverse filter");
+ RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
+
prop = RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "force");
RNA_def_property_range(prop, 0, 1);
@@ -1353,13 +1609,13 @@ void RNA_def_greasepencil_modifier(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
- RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 0);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_ON, 1);
prop = RNA_def_property(srna, "show_render", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", eGpencilModifierMode_Render);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
RNA_def_property_ui_text(prop, "Render", "Use modifier during render");
- RNA_def_property_ui_icon(prop, ICON_SCENE, 0);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_ON, 1);
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, NULL);
prop = RNA_def_property(srna, "show_in_editmode", PROP_BOOLEAN, PROP_NONE);
@@ -1382,6 +1638,7 @@ void RNA_def_greasepencil_modifier(BlenderRNA *brna)
rna_def_modifier_gpencilthick(brna);
rna_def_modifier_gpenciloffset(brna);
rna_def_modifier_gpenciltint(brna);
+ rna_def_modifier_gpenciltime(brna);
rna_def_modifier_gpencilcolor(brna);
rna_def_modifier_gpencilinstance(brna);
rna_def_modifier_gpencilbuild(brna);
diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c
index 1759eb812e6..9d3699e220e 100644
--- a/source/blender/makesrna/intern/rna_image.c
+++ b/source/blender/makesrna/intern/rna_image.c
@@ -93,7 +93,7 @@ static void rna_Image_source_set(PointerRNA *ptr, int value)
if (value != ima->source) {
ima->source = value;
- BLI_assert(BKE_id_is_in_gobal_main(&ima->id));
+ BLI_assert(BKE_id_is_in_global_main(&ima->id));
BKE_image_signal(G_MAIN, ima, NULL, IMA_SIGNAL_SRC_CHANGE);
DEG_id_tag_update(&ima->id, 0);
}
@@ -143,7 +143,7 @@ static void rna_ImageUser_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *
{
ImageUser *iuser = ptr->data;
- BKE_image_user_frame_calc(iuser, scene->r.cfra, 0);
+ BKE_image_user_frame_calc(iuser, scene->r.cfra);
if (ptr->id.data) {
/* Update material or texture for render preview. */
diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h
index 28e5b9d7c71..e4c5800cd07 100644
--- a/source/blender/makesrna/intern/rna_internal.h
+++ b/source/blender/makesrna/intern/rna_internal.h
@@ -492,7 +492,7 @@ int rna_parameter_size(struct PropertyRNA *parm);
struct Mesh *rna_Main_meshes_new_from_object(
struct Main *bmain, struct ReportList *reports, struct Depsgraph *depsgraph,
- struct Object *ob, bool apply_modifiers, bool calc_tessface, bool calc_undeformed);
+ struct Object *ob, bool apply_modifiers, bool calc_undeformed);
/* XXX, these should not need to be defined here~! */
struct MTex *rna_mtex_texture_slots_add(struct ID *self, struct bContext *C, struct ReportList *reports);
diff --git a/source/blender/makesrna/intern/rna_key.c b/source/blender/makesrna/intern/rna_key.c
index 05efe350a2f..a8d6246e169 100644
--- a/source/blender/makesrna/intern/rna_key.c
+++ b/source/blender/makesrna/intern/rna_key.c
@@ -722,7 +722,7 @@ static void rna_def_keyblock(BlenderRNA *brna)
prop = RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYBLOCK_MUTE);
RNA_def_property_ui_text(prop, "Mute", "Mute this shape key");
- RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, -1);
RNA_def_property_update(prop, 0, "rna_Key_update_data");
prop = RNA_def_property(srna, "slider_min", PROP_FLOAT, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_lattice.c b/source/blender/makesrna/intern/rna_lattice.c
index d10471ad896..cc6a46123db 100644
--- a/source/blender/makesrna/intern/rna_lattice.c
+++ b/source/blender/makesrna/intern/rna_lattice.c
@@ -104,7 +104,7 @@ static void rna_Lattice_update_data(Main *UNUSED(bmain), Scene *UNUSED(scene), P
/* copy settings to editlattice,
* we could split this up differently (one update call per property)
- * but for now thats overkill
+ * but for now that's overkill
*/
static void rna_Lattice_update_data_editlatt(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
{
diff --git a/source/blender/makesrna/intern/rna_layer.c b/source/blender/makesrna/intern/rna_layer.c
index df86a45b1a9..693d7a06a79 100644
--- a/source/blender/makesrna/intern/rna_layer.c
+++ b/source/blender/makesrna/intern/rna_layer.c
@@ -70,19 +70,21 @@
/***********************************/
-static PointerRNA rna_LayerCollections_active_collection_get(PointerRNA *ptr)
+static PointerRNA rna_ViewLayer_active_layer_collection_get(PointerRNA *ptr)
{
ViewLayer *view_layer = (ViewLayer *)ptr->data;
LayerCollection *lc = view_layer->active_collection;
return rna_pointer_inherit_refine(ptr, &RNA_LayerCollection, lc);
}
-static void rna_LayerCollections_active_collection_set(PointerRNA *ptr, PointerRNA value)
+static void rna_ViewLayer_active_layer_collection_set(PointerRNA *ptr, PointerRNA value)
{
ViewLayer *view_layer = (ViewLayer *)ptr->data;
LayerCollection *lc = (LayerCollection *)value.data;
const int index = BKE_layer_collection_findindex(view_layer, lc);
- if (index != -1) BKE_layer_collection_activate(view_layer, lc);
+ if (index != -1) {
+ BKE_layer_collection_activate(view_layer, lc);
+ }
}
static PointerRNA rna_LayerObjects_active_object_get(PointerRNA *ptr)
@@ -190,6 +192,18 @@ static void rna_ObjectBase_select_update(Main *UNUSED(bmain), Scene *UNUSED(scen
ED_object_base_select(base, mode);
}
+static void rna_LayerCollection_name_get(struct PointerRNA *ptr, char *value)
+{
+ ID *id = (ID *)((LayerCollection *)ptr->data)->collection;
+ BLI_strncpy(value, id->name + 2, sizeof(id->name) - 2);
+}
+
+int rna_LayerCollection_name_length(PointerRNA *ptr)
+{
+ ID *id = (ID *)((LayerCollection *)ptr->data)->collection;
+ return strlen(id->name + 2);
+}
+
static void rna_LayerCollection_use_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
{
Scene *scene = (Scene *)ptr->id.data;
@@ -220,6 +234,13 @@ static void rna_def_layer_collection(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Collection");
RNA_def_property_ui_text(prop, "Collection", "Collection this layer collection is wrapping");
+ prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "collection->id.name");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE | PROP_ANIMATABLE);
+ RNA_def_property_ui_text(prop, "Name", "Name of this view layer (same as its collection one)");
+ RNA_def_property_string_funcs(prop, "rna_LayerCollection_name_get", "rna_LayerCollection_name_length", NULL);
+ RNA_def_struct_name_property(srna, prop);
+
prop = RNA_def_property(srna, "children", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "layer_collections", NULL);
RNA_def_property_struct_type(prop, "LayerCollection");
@@ -240,29 +261,12 @@ static void rna_def_layer_collection(BlenderRNA *brna)
prop = RNA_def_property(srna, "indirect_only", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LAYER_COLLECTION_INDIRECT_ONLY);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
- RNA_def_property_ui_text(prop, "Indirect Only", "Objects in collection only contribute indirectly (through shadows and reflections) in the view layer");
+ RNA_def_property_ui_text(prop, "Indirect Only",
+ "Objects in collection only contribute indirectly (through shadows and reflections) "
+ "in the view layer");
RNA_def_property_update(prop, NC_SCENE | ND_LAYER, "rna_LayerCollection_use_update");
}
-static void rna_def_layer_collections(BlenderRNA *brna, PropertyRNA *cprop)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- RNA_def_property_srna(cprop, "LayerCollections");
- srna = RNA_def_struct(brna, "LayerCollections", NULL);
- RNA_def_struct_sdna(srna, "ViewLayer");
- RNA_def_struct_ui_text(srna, "Layer Collections", "Collections of render layer");
-
- prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "LayerCollection");
- RNA_def_property_pointer_funcs(prop, "rna_LayerCollections_active_collection_get",
- "rna_LayerCollections_active_collection_set", NULL, NULL);
- RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_NULL);
- RNA_def_property_ui_text(prop, "Active Layer Collection", "Active Layer Collection");
- RNA_def_property_update(prop, NC_SCENE | ND_LAYER, NULL);
-}
-
static void rna_def_layer_objects(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
@@ -275,7 +279,8 @@ static void rna_def_layer_objects(BlenderRNA *brna, PropertyRNA *cprop)
prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Object");
- RNA_def_property_pointer_funcs(prop, "rna_LayerObjects_active_object_get", "rna_LayerObjects_active_object_set", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_LayerObjects_active_object_get",
+ "rna_LayerObjects_active_object_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_UNLINK);
RNA_def_property_ui_text(prop, "Active Object", "Active object for this layer");
/* Could call: ED_object_base_activate(C, rl->basact);
@@ -329,11 +334,22 @@ void RNA_def_view_layer(BlenderRNA *brna)
RNA_def_function_ui_description(func, "Requery the enabled render passes from the render engine");
RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_NO_SELF);
- prop = RNA_def_property(srna, "collections", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_collection_sdna(prop, NULL, "layer_collections", NULL);
+ prop = RNA_def_property(srna, "layer_collection", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "LayerCollection");
+ RNA_def_property_pointer_sdna(prop, NULL, "layer_collections.first");
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_ui_text(prop, "Layer Collection",
+ "Root of collections hierarchy of this view layer,"
+ "its 'collection' pointer property is the same as the scene's master collection");
+
+ prop = RNA_def_property(srna, "active_layer_collection", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "LayerCollection");
- RNA_def_property_ui_text(prop, "Layer Collections", "");
- rna_def_layer_collections(brna, prop);
+ RNA_def_property_pointer_funcs(prop, "rna_ViewLayer_active_layer_collection_get",
+ "rna_ViewLayer_active_layer_collection_set", NULL, NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_NULL);
+ RNA_def_property_ui_text(prop, "Active Layer Collection",
+ "Active layer collection in this view layer's hierarchy");
+ RNA_def_property_update(prop, NC_SCENE | ND_LAYER, NULL);
prop = RNA_def_property(srna, "objects", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "object_bases", NULL);
diff --git a/source/blender/makesrna/intern/rna_lightprobe.c b/source/blender/makesrna/intern/rna_lightprobe.c
index cae06b5aa89..85df1c5ba72 100644
--- a/source/blender/makesrna/intern/rna_lightprobe.c
+++ b/source/blender/makesrna/intern/rna_lightprobe.c
@@ -107,7 +107,7 @@ static void rna_def_lightprobe(BlenderRNA *brna)
prop = RNA_def_property(srna, "influence_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "attenuation_type");
RNA_def_property_enum_items(prop, parallax_type_items);
- RNA_def_property_ui_text(prop, "Type", "Type of parallax volume");
+ RNA_def_property_ui_text(prop, "Type", "Type of influence volume");
RNA_def_property_update(prop, NC_MATERIAL | ND_SHADING, NULL);
prop = RNA_def_property(srna, "show_influence", PROP_BOOLEAN, PROP_NONE);
@@ -215,7 +215,7 @@ static void rna_def_lightprobe(BlenderRNA *brna)
/* Data preview */
prop = RNA_def_property(srna, "show_data", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LIGHTPROBE_FLAG_SHOW_DATA);
- RNA_def_property_ui_text(prop, "Show Data", "Show captured lighting data into the 3D view for debuging purpose");
+ RNA_def_property_ui_text(prop, "Show Data", "Show captured lighting data into the 3D view for debugging purpose");
RNA_def_property_update(prop, NC_MATERIAL | ND_SHADING, NULL);
/* common */
diff --git a/source/blender/makesrna/intern/rna_linestyle.c b/source/blender/makesrna/intern/rna_linestyle.c
index e138d0d98d8..5cee2fb90cb 100644
--- a/source/blender/makesrna/intern/rna_linestyle.c
+++ b/source/blender/makesrna/intern/rna_linestyle.c
@@ -592,7 +592,7 @@ static void rna_def_modifier_type_common(
{LS_VALUE_MULT, "MULTIPLY", 0, "Multiply", ""},
{LS_VALUE_DIV, "DIVIDE", 0, "Divide", ""},
{LS_VALUE_DIFF, "DIFFERENCE", 0, "Difference", ""},
- {LS_VALUE_MIN, "MININUM", 0, "Minimum", ""},
+ {LS_VALUE_MIN, "MINIMUM", 0, "Minimum", ""},
{LS_VALUE_MAX, "MAXIMUM", 0, "Maximum", ""},
{0, NULL, 0, NULL, NULL}
};
diff --git a/source/blender/makesrna/intern/rna_main.c b/source/blender/makesrna/intern/rna_main.c
index 5e05d37dc8c..4f145d1f48d 100644
--- a/source/blender/makesrna/intern/rna_main.c
+++ b/source/blender/makesrna/intern/rna_main.c
@@ -31,6 +31,7 @@
#include "BLI_path_util.h"
#include "RNA_define.h"
+#include "RNA_access.h"
#include "rna_internal.h"
@@ -305,6 +306,239 @@ static void rna_Main_lightprobes_begin(CollectionPropertyIterator *iter, Pointer
rna_iterator_listbase_begin(iter, &bmain->lightprobe, NULL);
}
+static int rna_ID_lookup_string(ListBase *lb, const char *key, PointerRNA *r_ptr)
+{
+ ID *id;
+ for (id = lb->first; id != NULL; id = id->next) {
+ if (STREQ(id->name + 2, key)) {
+ break;
+ }
+ else if (strstr(key, id->name + 2) != NULL) {
+ char full_name_ui[MAX_ID_FULL_NAME_UI];
+ BKE_id_full_name_ui_prefix_get(full_name_ui, id);
+ /* Second check skips the three 'UI keycode letters' prefix. */
+ if (STREQ(full_name_ui, key) || STREQ(full_name_ui + 3, key)) {
+ break;
+ }
+ }
+ }
+ if (id != NULL) {
+ RNA_id_pointer_create(id, r_ptr);
+ return true;
+ }
+ return false;
+}
+
+int rna_Main_camera_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->camera, key, r_ptr);
+}
+
+int rna_Main_scene_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->scene, key, r_ptr);
+}
+
+int rna_Main_object_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->object, key, r_ptr);
+}
+
+int rna_Main_mat_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->mat, key, r_ptr);
+}
+
+int rna_Main_nodetree_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->nodetree, key, r_ptr);
+}
+
+int rna_Main_mesh_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->mesh, key, r_ptr);
+}
+
+int rna_Main_light_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->lamp, key, r_ptr);
+}
+
+int rna_Main_library_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->library, key, r_ptr);
+}
+
+int rna_Main_screen_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->screen, key, r_ptr);
+}
+
+int rna_Main_wm_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->wm, key, r_ptr);
+}
+
+int rna_Main_image_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->image, key, r_ptr);
+}
+
+int rna_Main_latt_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->latt, key, r_ptr);
+}
+
+int rna_Main_curve_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->curve, key, r_ptr);
+}
+
+int rna_Main_mball_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->mball, key, r_ptr);
+}
+
+int rna_Main_font_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->vfont, key, r_ptr);
+}
+
+int rna_Main_tex_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->tex, key, r_ptr);
+}
+
+int rna_Main_brush_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->brush, key, r_ptr);
+}
+
+int rna_Main_world_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->world, key, r_ptr);
+}
+
+int rna_Main_collection_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->collection, key, r_ptr);
+}
+
+int rna_Main_key_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->key, key, r_ptr);
+}
+
+int rna_Main_text_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->text, key, r_ptr);
+}
+
+int rna_Main_speaker_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->speaker, key, r_ptr);
+}
+
+int rna_Main_sound_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->sound, key, r_ptr);
+}
+
+int rna_Main_armature_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->armature, key, r_ptr);
+}
+
+int rna_Main_action_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->action, key, r_ptr);
+}
+
+int rna_Main_particle_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->particle, key, r_ptr);
+}
+
+int rna_Main_palette_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->palettes, key, r_ptr);
+}
+
+int rna_Main_gpencil_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->gpencil, key, r_ptr);
+}
+
+int rna_Main_movieclip_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->movieclip, key, r_ptr);
+}
+
+int rna_Main_mask_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->mask, key, r_ptr);
+}
+
+int rna_Main_linestyle_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->linestyle, key, r_ptr);
+}
+
+int rna_Main_cachefile_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->cachefiles, key, r_ptr);
+}
+
+int rna_Main_paintcurve_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->paintcurves, key, r_ptr);
+}
+
+int rna_Main_workspace_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->workspaces, key, r_ptr);
+}
+
+int rna_Main_lightprobe_lookup_string(PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr)
+{
+ Main *bmain = ptr->data;
+ return rna_ID_lookup_string(&bmain->lightprobe, key, r_ptr);
+}
+
static void rna_Main_version_get(PointerRNA *ptr, int *value)
{
Main *bmain = (Main *)ptr->data;
@@ -337,6 +571,7 @@ typedef struct MainCollectionDef {
const char *name;
const char *description;
CollectionDefFunc *func;
+ const char *lookup_string;
} MainCollectionDef;
void RNA_def_main(BlenderRNA *brna)
@@ -347,41 +582,41 @@ void RNA_def_main(BlenderRNA *brna)
/* plural must match idtypes in readblenentry.c */
MainCollectionDef lists[] = {
- {"cameras", "Camera", "rna_Main_camera_begin", "Cameras", "Camera data-blocks", RNA_def_main_cameras},
- {"scenes", "Scene", "rna_Main_scene_begin", "Scenes", "Scene data-blocks", RNA_def_main_scenes},
- {"objects", "Object", "rna_Main_object_begin", "Objects", "Object data-blocks", RNA_def_main_objects},
- {"materials", "Material", "rna_Main_mat_begin", "Materials", "Material data-blocks", RNA_def_main_materials},
- {"node_groups", "NodeTree", "rna_Main_nodetree_begin", "Node Groups", "Node group data-blocks", RNA_def_main_node_groups},
- {"meshes", "Mesh", "rna_Main_mesh_begin", "Meshes", "Mesh data-blocks", RNA_def_main_meshes},
- {"lights", "Light", "rna_Main_light_begin", "Lights", "Light data-blocks", RNA_def_main_lights},
- {"libraries", "Library", "rna_Main_library_begin", "Libraries", "Library data-blocks", RNA_def_main_libraries},
- {"screens", "Screen", "rna_Main_screen_begin", "Screens", "Screen data-blocks", RNA_def_main_screens},
- {"window_managers", "WindowManager", "rna_Main_wm_begin", "Window Managers", "Window manager data-blocks", RNA_def_main_window_managers},
- {"images", "Image", "rna_Main_image_begin", "Images", "Image data-blocks", RNA_def_main_images},
- {"lattices", "Lattice", "rna_Main_latt_begin", "Lattices", "Lattice data-blocks", RNA_def_main_lattices},
- {"curves", "Curve", "rna_Main_curve_begin", "Curves", "Curve data-blocks", RNA_def_main_curves},
- {"metaballs", "MetaBall", "rna_Main_mball_begin", "Metaballs", "Metaball data-blocks", RNA_def_main_metaballs},
- {"fonts", "VectorFont", "rna_Main_font_begin", "Vector Fonts", "Vector font data-blocks", RNA_def_main_fonts},
- {"textures", "Texture", "rna_Main_tex_begin", "Textures", "Texture data-blocks", RNA_def_main_textures},
- {"brushes", "Brush", "rna_Main_brush_begin", "Brushes", "Brush data-blocks", RNA_def_main_brushes},
- {"worlds", "World", "rna_Main_world_begin", "Worlds", "World data-blocks", RNA_def_main_worlds},
- {"collections", "Collection", "rna_Main_collection_begin", "Collections", "Collection data-blocks", RNA_def_main_collections},
- {"shape_keys", "Key", "rna_Main_key_begin", "Shape Keys", "Shape Key data-blocks", NULL},
- {"texts", "Text", "rna_Main_text_begin", "Texts", "Text data-blocks", RNA_def_main_texts},
- {"speakers", "Speaker", "rna_Main_speaker_begin", "Speakers", "Speaker data-blocks", RNA_def_main_speakers},
- {"sounds", "Sound", "rna_Main_sound_begin", "Sounds", "Sound data-blocks", RNA_def_main_sounds},
- {"armatures", "Armature", "rna_Main_armature_begin", "Armatures", "Armature data-blocks", RNA_def_main_armatures},
- {"actions", "Action", "rna_Main_action_begin", "Actions", "Action data-blocks", RNA_def_main_actions},
- {"particles", "ParticleSettings", "rna_Main_particle_begin", "Particles", "Particle data-blocks", RNA_def_main_particles},
- {"palettes", "Palette", "rna_Main_palettes_begin", "Palettes", "Palette data-blocks", RNA_def_main_palettes},
- {"grease_pencil", "GreasePencil", "rna_Main_gpencil_begin", "Grease Pencil", "Grease Pencil data-blocks", RNA_def_main_gpencil},
- {"movieclips", "MovieClip", "rna_Main_movieclips_begin", "Movie Clips", "Movie Clip data-blocks", RNA_def_main_movieclips},
- {"masks", "Mask", "rna_Main_masks_begin", "Masks", "Masks data-blocks", RNA_def_main_masks},
- {"linestyles", "FreestyleLineStyle", "rna_Main_linestyle_begin", "Line Styles", "Line Style data-blocks", RNA_def_main_linestyles},
- {"cache_files", "CacheFile", "rna_Main_cachefiles_begin", "Cache Files", "Cache Files data-blocks", RNA_def_main_cachefiles},
- {"paint_curves", "PaintCurve", "rna_Main_paintcurves_begin", "Paint Curves", "Paint Curves data-blocks", RNA_def_main_paintcurves},
- {"workspaces", "WorkSpace", "rna_Main_workspaces_begin", "Workspaces", "Workspace data-blocks", RNA_def_main_workspaces},
- {"lightprobes", "LightProbe", "rna_Main_lightprobes_begin", "LightProbes", "LightProbe data-blocks", RNA_def_main_lightprobes},
+ {"cameras", "Camera", "rna_Main_camera_begin", "Cameras", "Camera data-blocks", RNA_def_main_cameras, "rna_Main_camera_lookup_string"},
+ {"scenes", "Scene", "rna_Main_scene_begin", "Scenes", "Scene data-blocks", RNA_def_main_scenes, "rna_Main_scene_lookup_string"},
+ {"objects", "Object", "rna_Main_object_begin", "Objects", "Object data-blocks", RNA_def_main_objects, "rna_Main_object_lookup_string"},
+ {"materials", "Material", "rna_Main_mat_begin", "Materials", "Material data-blocks", RNA_def_main_materials, "rna_Main_mat_lookup_string"},
+ {"node_groups", "NodeTree", "rna_Main_nodetree_begin", "Node Groups", "Node group data-blocks", RNA_def_main_node_groups, "rna_Main_nodetree_lookup_string"},
+ {"meshes", "Mesh", "rna_Main_mesh_begin", "Meshes", "Mesh data-blocks", RNA_def_main_meshes, "rna_Main_mesh_lookup_string"},
+ {"lights", "Light", "rna_Main_light_begin", "Lights", "Light data-blocks", RNA_def_main_lights, "rna_Main_light_lookup_string"},
+ {"libraries", "Library", "rna_Main_library_begin", "Libraries", "Library data-blocks", RNA_def_main_libraries, "rna_Main_library_lookup_string"},
+ {"screens", "Screen", "rna_Main_screen_begin", "Screens", "Screen data-blocks", RNA_def_main_screens, "rna_Main_screen_lookup_string"},
+ {"window_managers", "WindowManager", "rna_Main_wm_begin", "Window Managers", "Window manager data-blocks", RNA_def_main_window_managers, "rna_Main_wm_lookup_string"},
+ {"images", "Image", "rna_Main_image_begin", "Images", "Image data-blocks", RNA_def_main_images, "rna_Main_image_lookup_string"},
+ {"lattices", "Lattice", "rna_Main_latt_begin", "Lattices", "Lattice data-blocks", RNA_def_main_lattices, "rna_Main_latt_lookup_string"},
+ {"curves", "Curve", "rna_Main_curve_begin", "Curves", "Curve data-blocks", RNA_def_main_curves, "rna_Main_curve_lookup_string"},
+ {"metaballs", "MetaBall", "rna_Main_mball_begin", "Metaballs", "Metaball data-blocks", RNA_def_main_metaballs, "rna_Main_mball_lookup_string"},
+ {"fonts", "VectorFont", "rna_Main_font_begin", "Vector Fonts", "Vector font data-blocks", RNA_def_main_fonts, "rna_Main_font_lookup_string"},
+ {"textures", "Texture", "rna_Main_tex_begin", "Textures", "Texture data-blocks", RNA_def_main_textures, "rna_Main_tex_lookup_string"},
+ {"brushes", "Brush", "rna_Main_brush_begin", "Brushes", "Brush data-blocks", RNA_def_main_brushes, "rna_Main_brush_lookup_string"},
+ {"worlds", "World", "rna_Main_world_begin", "Worlds", "World data-blocks", RNA_def_main_worlds, "rna_Main_world_lookup_string"},
+ {"collections", "Collection", "rna_Main_collection_begin", "Collections", "Collection data-blocks", RNA_def_main_collections, "rna_Main_collection_lookup_string"},
+ {"shape_keys", "Key", "rna_Main_key_begin", "Shape Keys", "Shape Key data-blocks", NULL, "rna_Main_key_lookup_string"},
+ {"texts", "Text", "rna_Main_text_begin", "Texts", "Text data-blocks", RNA_def_main_texts, "rna_Main_text_lookup_string"},
+ {"speakers", "Speaker", "rna_Main_speaker_begin", "Speakers", "Speaker data-blocks", RNA_def_main_speakers, "rna_Main_speaker_lookup_string"},
+ {"sounds", "Sound", "rna_Main_sound_begin", "Sounds", "Sound data-blocks", RNA_def_main_sounds, "rna_Main_sound_lookup_string"},
+ {"armatures", "Armature", "rna_Main_armature_begin", "Armatures", "Armature data-blocks", RNA_def_main_armatures, "rna_Main_armature_lookup_string"},
+ {"actions", "Action", "rna_Main_action_begin", "Actions", "Action data-blocks", RNA_def_main_actions, "rna_Main_action_lookup_string"},
+ {"particles", "ParticleSettings", "rna_Main_particle_begin", "Particles", "Particle data-blocks", RNA_def_main_particles, "rna_Main_particle_lookup_string"},
+ {"palettes", "Palette", "rna_Main_palettes_begin", "Palettes", "Palette data-blocks", RNA_def_main_palettes, "rna_Main_palette_lookup_string"},
+ {"grease_pencil", "GreasePencil", "rna_Main_gpencil_begin", "Grease Pencil", "Grease Pencil data-blocks", RNA_def_main_gpencil, "rna_Main_gpencil_lookup_string"},
+ {"movieclips", "MovieClip", "rna_Main_movieclips_begin", "Movie Clips", "Movie Clip data-blocks", RNA_def_main_movieclips, "rna_Main_movieclip_lookup_string"},
+ {"masks", "Mask", "rna_Main_masks_begin", "Masks", "Masks data-blocks", RNA_def_main_masks, "rna_Main_mask_lookup_string"},
+ {"linestyles", "FreestyleLineStyle", "rna_Main_linestyle_begin", "Line Styles", "Line Style data-blocks", RNA_def_main_linestyles, "rna_Main_linestyle_lookup_string"},
+ {"cache_files", "CacheFile", "rna_Main_cachefiles_begin", "Cache Files", "Cache Files data-blocks", RNA_def_main_cachefiles, "rna_Main_cachefile_lookup_string"},
+ {"paint_curves", "PaintCurve", "rna_Main_paintcurves_begin", "Paint Curves", "Paint Curves data-blocks", RNA_def_main_paintcurves, "rna_Main_paintcurve_lookup_string"},
+ {"workspaces", "WorkSpace", "rna_Main_workspaces_begin", "Workspaces", "Workspace data-blocks", RNA_def_main_workspaces, "rna_Main_workspace_lookup_string"},
+ {"lightprobes", "LightProbe", "rna_Main_lightprobes_begin", "LightProbes", "LightProbe data-blocks", RNA_def_main_lightprobes, "rna_Main_lightprobe_lookup_string"},
{NULL, NULL, NULL, NULL, NULL, NULL}
};
@@ -423,7 +658,7 @@ void RNA_def_main(BlenderRNA *brna)
RNA_def_property_struct_type(prop, lists[i].type);
RNA_def_property_collection_funcs(prop, lists[i].iter_begin, "rna_iterator_listbase_next",
"rna_iterator_listbase_end", "rna_iterator_listbase_get",
- NULL, NULL, NULL, NULL);
+ NULL, NULL, lists[i].lookup_string, NULL);
RNA_def_property_ui_text(prop, lists[i].name, lists[i].description);
/* collection functions */
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index 6e68eb51ff8..c6094dc2dc3 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -49,41 +49,39 @@
#ifdef RNA_RUNTIME
-#include "BKE_main.h"
+#include "BKE_action.h"
+#include "BKE_armature.h"
+#include "BKE_brush.h"
#include "BKE_camera.h"
#include "BKE_collection.h"
#include "BKE_curve.h"
#include "BKE_displist.h"
-#include "BKE_mesh.h"
-#include "BKE_armature.h"
-#include "BKE_lamp.h"
-#include "BKE_library.h"
-#include "BKE_library_remap.h"
-#include "BKE_object.h"
-#include "BKE_material.h"
+#include "BKE_font.h"
+#include "BKE_gpencil.h"
#include "BKE_icons.h"
#include "BKE_idcode.h"
#include "BKE_image.h"
-#include "BKE_texture.h"
-#include "BKE_scene.h"
-#include "BKE_sound.h"
-#include "BKE_text.h"
-#include "BKE_action.h"
-#include "BKE_brush.h"
+#include "BKE_lamp.h"
#include "BKE_lattice.h"
+#include "BKE_library_remap.h"
+#include "BKE_lightprobe.h"
+#include "BKE_linestyle.h"
+#include "BKE_mask.h"
+#include "BKE_material.h"
#include "BKE_mball.h"
-#include "BKE_world.h"
-#include "BKE_particle.h"
-#include "BKE_paint.h"
-#include "BKE_font.h"
+#include "BKE_mesh.h"
+#include "BKE_movieclip.h"
#include "BKE_node.h"
+#include "BKE_object.h"
+#include "BKE_paint.h"
+#include "BKE_particle.h"
+#include "BKE_scene.h"
+#include "BKE_sound.h"
#include "BKE_speaker.h"
-#include "BKE_lightprobe.h"
-#include "BKE_movieclip.h"
-#include "BKE_mask.h"
-#include "BKE_gpencil.h"
-#include "BKE_linestyle.h"
+#include "BKE_text.h"
+#include "BKE_texture.h"
#include "BKE_workspace.h"
+#include "BKE_world.h"
#include "DEG_depsgraph_build.h"
#include "DEG_depsgraph_query.h"
@@ -310,7 +308,7 @@ static Mesh *rna_Main_meshes_new(Main *bmain, const char *name)
/* copied from Mesh_getFromObject and adapted to RNA interface */
Mesh *rna_Main_meshes_new_from_object(
Main *bmain, ReportList *reports, Depsgraph *depsgraph,
- Object *ob, bool apply_modifiers, bool calc_tessface, bool calc_undeformed)
+ Object *ob, bool apply_modifiers, bool calc_undeformed)
{
Scene *sce = DEG_get_evaluated_scene(depsgraph);
@@ -326,7 +324,7 @@ Mesh *rna_Main_meshes_new_from_object(
return NULL;
}
- return BKE_mesh_new_from_object(depsgraph, bmain, sce, ob, apply_modifiers, calc_tessface, calc_undeformed);
+ return BKE_mesh_new_from_object(depsgraph, bmain, sce, ob, apply_modifiers, calc_undeformed);
}
static Lamp *rna_Main_lights_new(Main *bmain, const char *name, int type)
@@ -887,13 +885,12 @@ void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
func = RNA_def_function(srna, "new_from_object", "rna_Main_meshes_new_from_object");
RNA_def_function_ui_description(func, "Add a new mesh created from object with modifiers applied");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- parm = RNA_def_pointer(func, "depsgraph", "Depsgraph", "Dependency Graph", "Evaluated dependency graph within wich to evaluate modifiers");
+ parm = RNA_def_pointer(func, "depsgraph", "Depsgraph", "Dependency Graph", "Evaluated dependency graph within which to evaluate modifiers");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
parm = RNA_def_pointer(func, "object", "Object", "", "Object to create mesh from");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
parm = RNA_def_boolean(func, "apply_modifiers", 0, "", "Apply modifiers");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
- RNA_def_boolean(func, "calc_tessface", true, "Calculate Tessellation", "Calculate tessellation faces");
RNA_def_boolean(func, "calc_undeformed", false, "Calculate Undeformed", "Calculate undeformed vertex coordinates");
parm = RNA_def_pointer(func, "mesh", "Mesh", "",
"Mesh created from object, remove it if it is only used for export");
@@ -1751,7 +1748,8 @@ void RNA_def_main_masks(BlenderRNA *brna, PropertyRNA *cprop)
/* new func */
func = RNA_def_function(srna, "new", "rna_Main_mask_new");
RNA_def_function_ui_description(func, "Add a new mask with a given name to the main database");
- RNA_def_string_file_path(func, "name", NULL, MAX_ID_NAME - 2, "Mask", "Name of new mask data-block");
+ parm = RNA_def_string(func, "name", NULL, MAX_ID_NAME - 2, "Mask", "Name of new mask data-block");
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
/* return type */
parm = RNA_def_pointer(func, "mask", "Mask", "", "New mask data-block");
RNA_def_function_return(func, parm);
diff --git a/source/blender/makesrna/intern/rna_mask.c b/source/blender/makesrna/intern/rna_mask.c
index 564232c3dd4..2cd427fbbd8 100644
--- a/source/blender/makesrna/intern/rna_mask.c
+++ b/source/blender/makesrna/intern/rna_mask.c
@@ -811,7 +811,8 @@ static void rna_def_maskSplinePoints(BlenderRNA *brna)
func = RNA_def_function(srna, "add", "rna_MaskSpline_points_add");
RNA_def_function_flag(func, FUNC_USE_SELF_ID);
RNA_def_function_ui_description(func, "Add a number of point to this spline");
- RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
+ parm = RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
/* Remove the point */
func = RNA_def_function(srna, "remove", "rna_MaskSpline_point_remove");
@@ -932,19 +933,19 @@ static void rna_def_mask_layer(BlenderRNA *brna)
prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", MASK_RESTRICT_VIEW);
RNA_def_property_ui_text(prop, "Restrict View", "Restrict visibility in the viewport");
- RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, -1);
RNA_def_property_update(prop, NC_MASK | ND_DRAW, NULL);
prop = RNA_def_property(srna, "hide_select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", MASK_RESTRICT_SELECT);
RNA_def_property_ui_text(prop, "Restrict Select", "Restrict selection in the viewport");
- RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, -1);
RNA_def_property_update(prop, NC_MASK | ND_DRAW, NULL);
prop = RNA_def_property(srna, "hide_render", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", MASK_RESTRICT_RENDER);
RNA_def_property_ui_text(prop, "Restrict Render", "Restrict renderability");
- RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, -1);
RNA_def_property_update(prop, NC_MASK | NA_EDITED, NULL);
/* select (for dopesheet)*/
diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c
index f99636de991..2ad379f60eb 100644
--- a/source/blender/makesrna/intern/rna_material.c
+++ b/source/blender/makesrna/intern/rna_material.c
@@ -40,23 +40,28 @@
const EnumPropertyItem rna_enum_ramp_blend_items[] = {
{MA_RAMP_BLEND, "MIX", 0, "Mix", ""},
- {MA_RAMP_ADD, "ADD", 0, "Add", ""},
- {MA_RAMP_MULT, "MULTIPLY", 0, "Multiply", ""},
- {MA_RAMP_SUB, "SUBTRACT", 0, "Subtract", ""},
- {MA_RAMP_SCREEN, "SCREEN", 0, "Screen", ""},
- {MA_RAMP_DIV, "DIVIDE", 0, "Divide", ""},
- {MA_RAMP_DIFF, "DIFFERENCE", 0, "Difference", ""},
+ {0, "", ICON_NONE, NULL, NULL},
{MA_RAMP_DARK, "DARKEN", 0, "Darken", ""},
+ {MA_RAMP_MULT, "MULTIPLY", 0, "Multiply", ""},
+ {MA_RAMP_BURN, "BURN", 0, "Burn", ""},
+ {0, "", ICON_NONE, NULL, NULL},
{MA_RAMP_LIGHT, "LIGHTEN", 0, "Lighten", ""},
- {MA_RAMP_OVERLAY, "OVERLAY", 0, "Overlay", ""},
+ {MA_RAMP_SCREEN, "SCREEN", 0, "Screen", ""},
{MA_RAMP_DODGE, "DODGE", 0, "Dodge", ""},
- {MA_RAMP_BURN, "BURN", 0, "Burn", ""},
+ {MA_RAMP_ADD, "ADD", 0, "Add", ""},
+ {0, "", ICON_NONE, NULL, NULL},
+ {MA_RAMP_OVERLAY, "OVERLAY", 0, "Overlay", ""},
+ {MA_RAMP_SOFT, "SOFT_LIGHT", 0, "Soft Light", ""},
+ {MA_RAMP_LINEAR, "LINEAR_LIGHT", 0, "Linear Light", ""},
+ {0, "", ICON_NONE, NULL, NULL},
+ {MA_RAMP_DIFF, "DIFFERENCE", 0, "Difference", ""},
+ {MA_RAMP_SUB, "SUBTRACT", 0, "Subtract", ""},
+ {MA_RAMP_DIV, "DIVIDE", 0, "Divide", ""},
+ {0, "", ICON_NONE, NULL, NULL},
{MA_RAMP_HUE, "HUE", 0, "Hue", ""},
{MA_RAMP_SAT, "SATURATION", 0, "Saturation", ""},
- {MA_RAMP_VAL, "VALUE", 0, "Value", ""},
{MA_RAMP_COLOR, "COLOR", 0, "Color", ""},
- {MA_RAMP_SOFT, "SOFT_LIGHT", 0, "Soft Light", ""},
- {MA_RAMP_LINEAR, "LINEAR_LIGHT", 0, "Linear Light", ""},
+ {MA_RAMP_VAL, "VALUE", 0, "Value", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -109,27 +114,8 @@ static void rna_Material_update_previews(Main *UNUSED(bmain), Scene *UNUSED(scen
static void rna_MaterialGpencil_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Material *ma = ptr->id.data;
- PreviewImage *preview = ma->preview;
rna_Material_update(bmain, scene, ptr);
-
- /* update previews (icon and thumbnail) */
- if (preview != NULL) {
- bool changed = false;
- if ((preview->flag[ICON_SIZE_ICON] & PRV_CHANGED) == 0) {
- preview->flag[ICON_SIZE_ICON] |= PRV_CHANGED;
- changed = true;
- }
-
- if ((preview->flag[ICON_SIZE_PREVIEW] & PRV_CHANGED) == 0) {
- preview->flag[ICON_SIZE_PREVIEW] |= PRV_CHANGED;
- changed = true;
- }
-
- if (changed) {
- WM_main_add_notifier(NC_MATERIAL | ND_SHADING_PREVIEW, ma);
- }
- }
WM_main_add_notifier(NC_GPENCIL | ND_DATA, ma);
}
@@ -138,7 +124,6 @@ static void rna_MaterialGpencil_nopreview_update(Main *bmain, Scene *scene, Poin
Material *ma = ptr->id.data;
rna_Material_update(bmain, scene, ptr);
-
WM_main_add_notifier(NC_GPENCIL | ND_DATA, ma);
}
@@ -281,6 +266,33 @@ void rna_mtex_texture_slots_clear(ID *self_id, struct bContext *C, ReportList *r
WM_event_add_notifier(C, NC_TEXTURE, CTX_data_scene(C));
}
+static void rna_TexPaintSlot_uv_layer_get(PointerRNA *ptr, char *value)
+{
+ TexPaintSlot *data = (TexPaintSlot *)(ptr->data);
+
+ if (data->uvname != NULL) {
+ BLI_strncpy_utf8(value, data->uvname, 64);
+ }
+ else {
+ value[0] = '\0';
+ }
+}
+
+static int rna_TexPaintSlot_uv_layer_length(PointerRNA *ptr)
+{
+ TexPaintSlot *data = (TexPaintSlot *)(ptr->data);
+ return data->uvname == NULL ? 0 : strlen(data->uvname);
+}
+
+static void rna_TexPaintSlot_uv_layer_set(PointerRNA *ptr, const char *value)
+{
+ TexPaintSlot *data = (TexPaintSlot *)(ptr->data);
+
+ if (data->uvname != NULL) {
+ BLI_strncpy_utf8(data->uvname, value, 64);
+ }
+}
+
static bool rna_is_grease_pencil_get(PointerRNA *ptr)
{
Material *ma = (Material *)ptr->data;
@@ -394,32 +406,32 @@ static void rna_def_material_greasepencil(BlenderRNA *brna)
/* mode type styles */
static EnumPropertyItem gpcolordata_mode_types_items[] = {
- { GP_STYLE_MODE_LINE, "LINE", 0, "Line", "Draw strokes using a continuous line" },
- { GP_STYLE_MODE_DOTS, "DOTS", 0, "Dots", "Draw strokes using separated dots" },
- { GP_STYLE_MODE_BOX, "BOX", 0, "Boxes", "Draw strokes using separated rectangle boxes" },
- { 0, NULL, 0, NULL, NULL }
+ {GP_STYLE_MODE_LINE, "LINE", 0, "Line", "Draw strokes using a continuous line"},
+ {GP_STYLE_MODE_DOTS, "DOTS", 0, "Dots", "Draw strokes using separated dots"},
+ {GP_STYLE_MODE_BOX, "BOX", 0, "Boxes", "Draw strokes using separated rectangle boxes"},
+ {0, NULL, 0, NULL, NULL}
};
/* stroke styles */
static EnumPropertyItem stroke_style_items[] = {
- { GP_STYLE_STROKE_STYLE_SOLID, "SOLID", 0, "Solid", "Draw strokes with solid color" },
- { GP_STYLE_STROKE_STYLE_TEXTURE, "TEXTURE", 0, "Texture", "Draw strokes using texture" },
- { 0, NULL, 0, NULL, NULL }
+ {GP_STYLE_STROKE_STYLE_SOLID, "SOLID", 0, "Solid", "Draw strokes with solid color"},
+ {GP_STYLE_STROKE_STYLE_TEXTURE, "TEXTURE", 0, "Texture", "Draw strokes using texture"},
+ {0, NULL, 0, NULL, NULL}
};
/* fill styles */
static EnumPropertyItem fill_style_items[] = {
- { GP_STYLE_FILL_STYLE_SOLID, "SOLID", 0, "Solid", "Fill area with solid color" },
- { GP_STYLE_FILL_STYLE_GRADIENT, "GRADIENT", 0, "Gradient", "Fill area with gradient color" },
- { GP_STYLE_FILL_STYLE_CHESSBOARD, "CHESSBOARD", 0, "Checker Board", "Fill area with chessboard pattern" },
- { GP_STYLE_FILL_STYLE_TEXTURE, "TEXTURE", 0, "Texture", "Fill area with image texture" },
- { 0, NULL, 0, NULL, NULL }
+ {GP_STYLE_FILL_STYLE_SOLID, "SOLID", 0, "Solid", "Fill area with solid color"},
+ {GP_STYLE_FILL_STYLE_GRADIENT, "GRADIENT", 0, "Gradient", "Fill area with gradient color"},
+ {GP_STYLE_FILL_STYLE_CHESSBOARD, "CHESSBOARD", 0, "Checker Board", "Fill area with chessboard pattern"},
+ {GP_STYLE_FILL_STYLE_TEXTURE, "TEXTURE", 0, "Texture", "Fill area with image texture"},
+ {0, NULL, 0, NULL, NULL}
};
static EnumPropertyItem fill_gradient_items[] = {
- { GP_STYLE_GRADIENT_LINEAR, "LINEAR", 0, "Linear", "Fill area with gradient color" },
- { GP_STYLE_GRADIENT_RADIAL, "RADIAL", 0, "Radial", "Fill area with radial gradient" },
- { 0, NULL, 0, NULL, NULL }
+ {GP_STYLE_GRADIENT_LINEAR, "LINEAR", 0, "Linear", "Fill area with gradient color"},
+ {GP_STYLE_GRADIENT_RADIAL, "RADIAL", 0, "Radial", "Fill area with radial gradient"},
+ {0, NULL, 0, NULL, NULL}
};
srna = RNA_def_struct(brna, "MaterialGPencilStyle", NULL);
@@ -528,7 +540,7 @@ static void rna_def_material_greasepencil(BlenderRNA *brna)
/* Flags */
prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_COLOR_HIDE);
- RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, -1);
RNA_def_property_ui_text(prop, "Hide", "Set color Visibility");
RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_nopreview_update");
@@ -569,6 +581,16 @@ static void rna_def_material_greasepencil(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Pattern", "Use Fill Texture as a pattern to apply color");
RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
+ prop = RNA_def_property(srna, "show_stroke", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_STROKE_SHOW);
+ RNA_def_property_ui_text(prop, "Show Stroke", "Show stroke lines of this material");
+ RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
+
+ prop = RNA_def_property(srna, "show_fill", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_FILL_SHOW);
+ RNA_def_property_ui_text(prop, "Show Fill", "Show stroke fills of this material");
+ RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
+
/* pass index for future compositing and editing tools */
prop = RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "index");
@@ -832,6 +854,8 @@ static void rna_def_tex_slot(BlenderRNA *brna)
prop = RNA_def_property(srna, "uv_layer", PROP_STRING, PROP_NONE);
RNA_def_property_string_maxlength(prop, 64); /* else it uses the pointer size! */
RNA_def_property_string_sdna(prop, NULL, "uvname");
+ RNA_def_property_string_funcs(prop, "rna_TexPaintSlot_uv_layer_get", "rna_TexPaintSlot_uv_layer_length",
+ "rna_TexPaintSlot_uv_layer_set");
RNA_def_property_ui_text(prop, "UV Map", "Name of UV map");
RNA_def_property_update(prop, NC_GEOM | ND_DATA, "rna_Material_update");
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index 53c5da243fe..40690731b76 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -70,6 +70,7 @@ const EnumPropertyItem rna_enum_mesh_delimit_mode_items[] = {
#include "BKE_customdata.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
+#include "BKE_mesh_runtime.h"
#include "BKE_report.h"
#include "DEG_depsgraph.h"
@@ -139,12 +140,6 @@ static CustomData *rna_mesh_ldata(PointerRNA *ptr)
return rna_mesh_ldata_helper(me);
}
-static CustomData *rna_mesh_fdata(PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- return rna_mesh_fdata_helper(me);
-}
-
/* -------------------------------------------------------------------- */
/* Generic CustomData Layer Functions */
@@ -195,12 +190,6 @@ static void rna_MeshLoopLayer_name_set(PointerRNA *ptr, const char *value)
{
rna_cd_layer_name_set(rna_mesh_ldata(ptr), (CustomDataLayer *)ptr->data, value);
}
-#if 0
-static void rna_MeshTessfaceLayer_name_set(PointerRNA *ptr, const char *value)
-{
- rna_cd_layer_name_set(rna_mesh_fdata(ptr), (CustomDataLayer *)ptr->data, value);
-}
-#endif
/* only for layers shared between types */
static void rna_MeshAnyLayer_name_set(PointerRNA *ptr, const char *value)
{
@@ -228,15 +217,6 @@ static void rna_Mesh_update_data(Main *UNUSED(bmain), Scene *UNUSED(scene), Poin
}
}
-static void rna_Mesh_update_data_edit_color(Main *bmain, Scene *scene, PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- rna_Mesh_update_data(bmain, scene, ptr);
- if (me->edit_btmesh) {
- BKE_editmesh_color_free(me->edit_btmesh);
- }
-}
-
static void rna_Mesh_update_data_edit_weight(Main *bmain, Scene *scene, PointerRNA *ptr)
{
BKE_mesh_batch_cache_dirty_tag(rna_mesh(ptr), BKE_MESH_BATCH_DIRTY_ALL);
@@ -444,232 +424,57 @@ static void rna_MeshPolygon_flip(ID *id, MPoly *mp)
BKE_mesh_polygon_flip(mp, me->mloop, &me->ldata);
BKE_mesh_tessface_clear(me);
+ BKE_mesh_runtime_clear_geometry(me);
}
-static void rna_MeshTessFace_normal_get(PointerRNA *ptr, float *values)
+static void rna_MeshLoopTriangle_verts_get(PointerRNA *ptr, int *values)
{
Mesh *me = rna_mesh(ptr);
- MFace *mface = (MFace *)ptr->data;
-
- if (mface->v4)
- normal_quad_v3(values, me->mvert[mface->v1].co, me->mvert[mface->v2].co,
- me->mvert[mface->v3].co, me->mvert[mface->v4].co);
- else
- normal_tri_v3(values, me->mvert[mface->v1].co, me->mvert[mface->v2].co, me->mvert[mface->v3].co);
+ MLoopTri *lt = (MLoopTri *)ptr->data;
+ values[0] = me->mloop[lt->tri[0]].v;
+ values[1] = me->mloop[lt->tri[1]].v;
+ values[2] = me->mloop[lt->tri[2]].v;
}
-static void rna_MeshTessFace_split_normals_get(PointerRNA *ptr, float *values)
-{
- Mesh *me = rna_mesh(ptr);
- MFace *mface = (MFace *)ptr->data;
- const short (*vec)[4][3] = CustomData_get(&me->fdata, (int)(mface - me->mface), CD_TESSLOOPNORMAL);
- int i = 4;
-
- if (!vec) {
- while (i--) zero_v3(&values[i * 3]);
- }
- else {
- while (i--) normal_short_to_float_v3(&values[i * 3], (const short *)(*vec)[i]);
- }
-}
-static float rna_MeshTessFace_area_get(PointerRNA *ptr)
+static void rna_MeshLoopTriangle_normal_get(PointerRNA *ptr, float *values)
{
Mesh *me = rna_mesh(ptr);
- MFace *mface = (MFace *)ptr->data;
+ MLoopTri *lt = (MLoopTri *)ptr->data;
+ unsigned int v1 = me->mloop[lt->tri[0]].v;
+ unsigned int v2 = me->mloop[lt->tri[1]].v;
+ unsigned int v3 = me->mloop[lt->tri[2]].v;
- if (mface->v4)
- return area_quad_v3(me->mvert[mface->v1].co, me->mvert[mface->v2].co, me->mvert[mface->v3].co,
- me->mvert[mface->v4].co);
- else
- return area_tri_v3(me->mvert[mface->v1].co, me->mvert[mface->v2].co, me->mvert[mface->v3].co);
+ normal_tri_v3(values, me->mvert[v1].co, me->mvert[v2].co, me->mvert[v3].co);
}
-static void rna_MeshTextureFace_uv1_get(PointerRNA *ptr, float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- values[0] = mtface->uv[0][0];
- values[1] = mtface->uv[0][1];
-}
-
-static void rna_MeshTextureFace_uv1_set(PointerRNA *ptr, const float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- mtface->uv[0][0] = values[0];
- mtface->uv[0][1] = values[1];
-}
-
-static void rna_MeshTextureFace_uv2_get(PointerRNA *ptr, float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- values[0] = mtface->uv[1][0];
- values[1] = mtface->uv[1][1];
-}
-
-static void rna_MeshTextureFace_uv2_set(PointerRNA *ptr, const float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- mtface->uv[1][0] = values[0];
- mtface->uv[1][1] = values[1];
-}
-
-static void rna_MeshTextureFace_uv3_get(PointerRNA *ptr, float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- values[0] = mtface->uv[2][0];
- values[1] = mtface->uv[2][1];
-}
-
-static void rna_MeshTextureFace_uv3_set(PointerRNA *ptr, const float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- mtface->uv[2][0] = values[0];
- mtface->uv[2][1] = values[1];
-}
-
-static void rna_MeshTextureFace_uv4_get(PointerRNA *ptr, float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- values[0] = mtface->uv[3][0];
- values[1] = mtface->uv[3][1];
-}
-
-static void rna_MeshTextureFace_uv4_set(PointerRNA *ptr, const float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- mtface->uv[3][0] = values[0];
- mtface->uv[3][1] = values[1];
-}
-
-static int rna_CustomDataData_numverts(PointerRNA *ptr, int type)
+static void rna_MeshLoopTriangle_split_normals_get(PointerRNA *ptr, float *values)
{
Mesh *me = rna_mesh(ptr);
- CustomData *fdata = rna_mesh_fdata(ptr);
- CustomDataLayer *cdl;
- int a, b;
+ const float (*lnors)[3] = CustomData_get_layer(&me->ldata, CD_NORMAL);
- for (cdl = fdata->layers, a = 0; a < fdata->totlayer; cdl++, a++) {
- if (cdl->type == type) {
- b = ((char *)ptr->data - ((char *)cdl->data)) / CustomData_sizeof(type);
- if (b >= 0 && b < me->totface) {
- return (me->mface[b].v4 ? 4 : 3);
- }
- }
+ if (!lnors) {
+ zero_v3(values + 0);
+ zero_v3(values + 3);
+ zero_v3(values + 6);
+ }
+ else {
+ MLoopTri *lt = (MLoopTri *)ptr->data;
+ copy_v3_v3(values + 0, lnors[lt->tri[0]]);
+ copy_v3_v3(values + 3, lnors[lt->tri[1]]);
+ copy_v3_v3(values + 6, lnors[lt->tri[2]]);
}
-
- return 0;
-}
-
-static int rna_MeshTextureFace_uv_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
-{
- length[0] = rna_CustomDataData_numverts(ptr, CD_MTFACE);
- length[1] = 2;
- return length[0] * length[1];
-}
-
-static void rna_MeshTextureFace_uv_get(PointerRNA *ptr, float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
- int totvert = rna_CustomDataData_numverts(ptr, CD_MTFACE);
-
- memcpy(values, mtface->uv, totvert * 2 * sizeof(float));
-}
-
-static void rna_MeshTextureFace_uv_set(PointerRNA *ptr, const float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
- int totvert = rna_CustomDataData_numverts(ptr, CD_MTFACE);
-
- memcpy(mtface->uv, values, totvert * 2 * sizeof(float));
-}
-
-/* notice red and blue are swapped */
-static void rna_MeshColor_color1_get(PointerRNA *ptr, float *values)
-{
- MCol *mcol = (MCol *)ptr->data;
-
- values[3] = mcol[0].a / 255.0f;
- values[2] = mcol[0].r / 255.0f;
- values[1] = mcol[0].g / 255.0f;
- values[0] = mcol[0].b / 255.0f;
-}
-
-static void rna_MeshColor_color1_set(PointerRNA *ptr, const float *values)
-{
- MCol *mcol = (MCol *)ptr->data;
-
- mcol[0].a = round_fl_to_uchar_clamp(values[3] * 255.0f);
- mcol[0].r = round_fl_to_uchar_clamp(values[2] * 255.0f);
- mcol[0].g = round_fl_to_uchar_clamp(values[1] * 255.0f);
- mcol[0].b = round_fl_to_uchar_clamp(values[0] * 255.0f);
-}
-
-static void rna_MeshColor_color2_get(PointerRNA *ptr, float *values)
-{
- MCol *mcol = (MCol *)ptr->data;
-
- values[3] = mcol[1].a / 255.0f;
- values[2] = mcol[1].r / 255.0f;
- values[1] = mcol[1].g / 255.0f;
- values[0] = mcol[1].b / 255.0f;
-}
-
-static void rna_MeshColor_color2_set(PointerRNA *ptr, const float *values)
-{
- MCol *mcol = (MCol *)ptr->data;
-
- mcol[1].a = round_fl_to_uchar_clamp(values[3] * 255.0f);
- mcol[1].r = round_fl_to_uchar_clamp(values[2] * 255.0f);
- mcol[1].g = round_fl_to_uchar_clamp(values[1] * 255.0f);
- mcol[1].b = round_fl_to_uchar_clamp(values[0] * 255.0f);
-}
-
-static void rna_MeshColor_color3_get(PointerRNA *ptr, float *values)
-{
- MCol *mcol = (MCol *)ptr->data;
-
- values[3] = mcol[2].a / 255.0f;
- values[2] = mcol[2].r / 255.0f;
- values[1] = mcol[2].g / 255.0f;
- values[0] = mcol[2].b / 255.0f;
-}
-
-static void rna_MeshColor_color3_set(PointerRNA *ptr, const float *values)
-{
- MCol *mcol = (MCol *)ptr->data;
-
- mcol[2].a = round_fl_to_uchar_clamp(values[3] * 255.0f);
- mcol[2].r = round_fl_to_uchar_clamp(values[2] * 255.0f);
- mcol[2].g = round_fl_to_uchar_clamp(values[1] * 255.0f);
- mcol[2].b = round_fl_to_uchar_clamp(values[0] * 255.0f);
-}
-
-static void rna_MeshColor_color4_get(PointerRNA *ptr, float *values)
-{
- MCol *mcol = (MCol *)ptr->data;
-
- values[3] = mcol[3].a / 255.0f;
- values[2] = mcol[3].r / 255.0f;
- values[1] = mcol[3].g / 255.0f;
- values[0] = mcol[3].b / 255.0f;
}
-static void rna_MeshColor_color4_set(PointerRNA *ptr, const float *values)
+static float rna_MeshLoopTriangle_area_get(PointerRNA *ptr)
{
- MCol *mcol = (MCol *)ptr->data;
+ Mesh *me = rna_mesh(ptr);
+ MLoopTri *lt = (MLoopTri *)ptr->data;
+ unsigned int v1 = me->mloop[lt->tri[0]].v;
+ unsigned int v2 = me->mloop[lt->tri[1]].v;
+ unsigned int v3 = me->mloop[lt->tri[2]].v;
- mcol[3].a = round_fl_to_uchar_clamp(values[3] * 255.0f);
- mcol[3].r = round_fl_to_uchar_clamp(values[2] * 255.0f);
- mcol[3].g = round_fl_to_uchar_clamp(values[1] * 255.0f);
- mcol[3].b = round_fl_to_uchar_clamp(values[0] * 255.0f);
+ return area_tri_v3(me->mvert[v1].co, me->mvert[v2].co, me->mvert[v3].co);
}
static void rna_MeshLoopColor_color_get(PointerRNA *ptr, float *values)
@@ -911,96 +716,8 @@ static void rna_MeshUVLoopLayer_clone_set(PointerRNA *ptr, bool value)
rna_CustomDataLayer_clone_set(ptr, rna_mesh_ldata(ptr), value, CD_MLOOPUV);
}
-/* face uv_textures */
-
-DEFINE_CUSTOMDATA_LAYER_COLLECTION(tessface_uv_texture, fdata, CD_MTFACE)
-DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(tessface_uv_texture, fdata, CD_MTFACE, active, MeshTextureFaceLayer)
-DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(tessface_uv_texture, fdata, CD_MTFACE, clone, MeshTextureFaceLayer)
-DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(tessface_uv_texture, fdata, CD_MTFACE, stencil, MeshTextureFaceLayer)
-DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(tessface_uv_texture, fdata, CD_MTFACE, render, MeshTextureFaceLayer)
-
-static void rna_MeshTextureFaceLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
- rna_iterator_array_begin(iter, layer->data, sizeof(MTFace), (me->edit_btmesh) ? 0 : me->totface, 0, NULL);
-}
-
-static int rna_MeshTextureFaceLayer_data_length(PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- return (me->edit_btmesh) ? 0 : me->totface;
-}
-
-static bool rna_MeshTextureFaceLayer_active_render_get(PointerRNA *ptr)
-{
- return rna_CustomDataLayer_active_get(ptr, rna_mesh_fdata(ptr), CD_MTFACE, 1);
-}
-
-static bool rna_MeshTextureFaceLayer_active_get(PointerRNA *ptr)
-{
- return rna_CustomDataLayer_active_get(ptr, rna_mesh_fdata(ptr), CD_MTFACE, 0);
-}
-
-static bool rna_MeshTextureFaceLayer_clone_get(PointerRNA *ptr)
-{
- return rna_CustomDataLayer_clone_get(ptr, rna_mesh_fdata(ptr), CD_MTFACE);
-}
-
-static void rna_MeshTextureFaceLayer_active_render_set(PointerRNA *ptr, bool value)
-{
- rna_CustomDataLayer_active_set(ptr, rna_mesh_fdata(ptr), value, CD_MTFACE, 1);
-}
-
-static void rna_MeshTextureFaceLayer_active_set(PointerRNA *ptr, int value)
-{
- rna_CustomDataLayer_active_set(ptr, rna_mesh_fdata(ptr), value, CD_MTFACE, 0);
-}
-
-static void rna_MeshTextureFaceLayer_clone_set(PointerRNA *ptr, int value)
-{
- rna_CustomDataLayer_clone_set(ptr, rna_mesh_fdata(ptr), value, CD_MTFACE);
-}
-
/* vertex_color_layers */
-DEFINE_CUSTOMDATA_LAYER_COLLECTION(tessface_vertex_color, fdata, CD_MCOL)
-DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(tessface_vertex_color, fdata, CD_MCOL, active, MeshColorLayer)
-DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(tessface_vertex_color, fdata, CD_MCOL, render, MeshColorLayer)
-
-static void rna_MeshColorLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
- rna_iterator_array_begin(iter, layer->data, sizeof(MCol) * 4, me->totface, 0, NULL);
-}
-
-static int rna_MeshColorLayer_data_length(PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- return me->totface;
-}
-
-static bool rna_MeshColorLayer_active_render_get(PointerRNA *ptr)
-{
- return rna_CustomDataLayer_active_get(ptr, rna_mesh_fdata(ptr), CD_MCOL, 1);
-}
-
-static bool rna_MeshColorLayer_active_get(PointerRNA *ptr)
-{
- return rna_CustomDataLayer_active_get(ptr, rna_mesh_fdata(ptr), CD_MCOL, 0);
-}
-
-static void rna_MeshColorLayer_active_render_set(PointerRNA *ptr, bool value)
-{
- rna_CustomDataLayer_active_set(ptr, rna_mesh_fdata(ptr), value, CD_MCOL, 1);
-}
-
-static void rna_MeshColorLayer_active_set(PointerRNA *ptr, int value)
-{
- rna_CustomDataLayer_active_set(ptr, rna_mesh_fdata(ptr), value, CD_MCOL, 0);
-}
-
DEFINE_CUSTOMDATA_LAYER_COLLECTION(vertex_color, ldata, CD_MLOOPCOL)
DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(vertex_color, ldata, CD_MLOOPCOL, active, MeshLoopColorLayer)
DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(vertex_color, ldata, CD_MLOOPCOL, render, MeshLoopColorLayer)
@@ -1254,30 +971,6 @@ static void rna_Mesh_face_map_remove(struct Mesh *me, ReportList *reports, struc
/* End face maps */
-static int rna_MeshTessFace_verts_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
-{
- MFace *face = (MFace *)ptr->data;
-
- if (face)
- length[0] = (face->v4) ? 4 : 3;
- else
- length[0] = 4; /* XXX rna_raw_access wants the length of a dummy face. this needs fixing. - Campbell */
-
- return length[0];
-}
-
-static void rna_MeshTessFace_verts_get(PointerRNA *ptr, int *values)
-{
- MFace *face = (MFace *)ptr->data;
- memcpy(values, &face->v1, (face->v4 ? 4 : 3) * sizeof(int));
-}
-
-static void rna_MeshTessFace_verts_set(PointerRNA *ptr, const int *values)
-{
- MFace *face = (MFace *)ptr->data;
- memcpy(&face->v1, values, (face->v4 ? 4 : 3) * sizeof(int));
-}
-
/* poly.vertices - this is faked loop access for convenience */
static int rna_MeshPoly_vertices_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
{
@@ -1332,11 +1025,25 @@ static int rna_MeshEdge_index_get(PointerRNA *ptr)
return (int)(edge - me->medge);
}
-static int rna_MeshTessFace_index_get(PointerRNA *ptr)
+static int rna_MeshLoopTriangle_index_get(PointerRNA *ptr)
+{
+ Mesh *me = rna_mesh(ptr);
+ MLoopTri *ltri = (MLoopTri *)ptr->data;
+ return (int)(ltri - me->runtime.looptris.array);
+}
+
+static int rna_MeshLoopTriangle_material_index_get(PointerRNA *ptr)
{
Mesh *me = rna_mesh(ptr);
- MFace *face = (MFace *)ptr->data;
- return (int)(face - me->mface);
+ MLoopTri *ltri = (MLoopTri *)ptr->data;
+ return me->mpoly[ltri->poly].mat_nr;
+}
+
+static bool rna_MeshLoopTriangle_use_smooth_get(PointerRNA *ptr)
+{
+ Mesh *me = rna_mesh(ptr);
+ MLoopTri *ltri = (MLoopTri *)ptr->data;
+ return me->mpoly[ltri->poly].flag & ME_SMOOTH;
}
static int rna_MeshPolygon_index_get(PointerRNA *ptr)
@@ -1375,9 +1082,9 @@ static char *rna_MeshPolygon_path(PointerRNA *ptr)
return BLI_sprintfN("polygons[%d]", (int)((MPoly *)ptr->data - rna_mesh(ptr)->mpoly));
}
-static char *rna_MeshTessFace_path(PointerRNA *ptr)
+static char *rna_MeshLoopTriangle_path(PointerRNA *ptr)
{
- return BLI_sprintfN("tessfaces[%d]", (int)((MFace *)ptr->data - rna_mesh(ptr)->mface));
+ return BLI_sprintfN("loop_triangles[%d]", (int)((MLoopTri *)ptr->data - rna_mesh(ptr)->runtime.looptris.array));
}
static char *rna_MeshEdge_path(PointerRNA *ptr)
@@ -1396,14 +1103,6 @@ static char *rna_MeshVertex_path(PointerRNA *ptr)
return BLI_sprintfN("vertices[%d]", (int)((MVert *)ptr->data - rna_mesh(ptr)->mvert));
}
-static char *rna_MeshTextureFaceLayer_path(PointerRNA *ptr)
-{
- CustomDataLayer *cdl = ptr->data;
- char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
- return BLI_sprintfN("tessface_uv_textures[\"%s\"]", name_esc);
-}
-
static char *rna_VertCustomData_data_path(PointerRNA *ptr, const char *collection, int type)
{
CustomDataLayer *cdl;
@@ -1467,46 +1166,11 @@ static char *rna_LoopCustomData_data_path(PointerRNA *ptr, const char *collectio
return NULL;
}
-static char *rna_FaceCustomData_data_path(PointerRNA *ptr, const char *collection, int type)
-{
- CustomDataLayer *cdl;
- Mesh *me = rna_mesh(ptr);
- CustomData *fdata = rna_mesh_fdata(ptr);
- int a, b, totloop = (me->edit_btmesh) ? 0 : me->totloop;
-
- for (cdl = fdata->layers, a = 0; a < fdata->totlayer; cdl++, a++) {
- if (cdl->type == type) {
- b = ((char *)ptr->data - ((char *)cdl->data)) / CustomData_sizeof(type);
- if (b >= 0 && b < totloop) {
- char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
- return BLI_sprintfN("%s[\"%s\"].data[%d]", collection, name_esc, b);
- }
- }
- }
-
- return NULL;
-}
-
-
static char *rna_MeshUVLoop_path(PointerRNA *ptr)
{
return rna_LoopCustomData_data_path(ptr, "uv_layers", CD_MLOOPUV);
}
-static char *rna_MeshTextureFace_path(PointerRNA *ptr)
-{
- return rna_FaceCustomData_data_path(ptr, "tessface_uv_textures", CD_MTFACE);
-}
-
-static char *rna_MeshColorLayer_path(PointerRNA *ptr)
-{
- CustomDataLayer *cdl = ptr->data;
- char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
- return BLI_sprintfN("tessface_vertex_colors[\"%s\"]", name_esc);
-}
-
static char *rna_MeshLoopColorLayer_path(PointerRNA *ptr)
{
CustomDataLayer *cdl = ptr->data;
@@ -1733,34 +1397,6 @@ static void rna_Mesh_vertex_color_remove(struct Mesh *me, ReportList *reports, C
}
}
-static PointerRNA rna_Mesh_tessface_vertex_color_new(struct Mesh *me, ReportList *reports, const char *name)
-{
- PointerRNA ptr;
- CustomData *fdata;
- CustomDataLayer *cdl = NULL;
- int index;
-
- if (me->edit_btmesh) {
- BKE_report(reports, RPT_ERROR, "Cannot add tessface colors in edit mode");
- return PointerRNA_NULL;
- }
-
- if (me->mpoly) {
- BKE_report(reports, RPT_ERROR, "Cannot add tessface colors when MPoly's exist");
- return PointerRNA_NULL;
- }
-
- index = ED_mesh_color_add(me, name, false);
-
- if (index != -1) {
- fdata = rna_mesh_fdata_helper(me);
- cdl = &fdata->layers[CustomData_get_layer_index_n(fdata, CD_MCOL, index)];
- }
-
- RNA_pointer_create(&me->id, &RNA_MeshColorLayer, cdl, &ptr);
- return ptr;
-}
-
#define DEFINE_CUSTOMDATA_PROPERTY_API(elemname, datatype, cd_prop_type, cdata, countvar, layertype) \
static PointerRNA rna_Mesh_##elemname##_##datatype##_property_new(struct Mesh *me, const char *name) \
{ \
@@ -1808,38 +1444,6 @@ static void rna_Mesh_uv_layers_remove(struct Mesh *me, ReportList *reports, Cust
}
}
-/* while this is supposed to be readonly,
- * keep it to support importers that only make tessfaces */
-
-static PointerRNA rna_Mesh_tessface_uv_texture_new(struct Mesh *me, ReportList *reports, const char *name)
-{
- PointerRNA ptr;
- CustomData *fdata;
- CustomDataLayer *cdl = NULL;
- int index;
-
- if (me->edit_btmesh) {
- BKE_report(reports, RPT_ERROR, "Cannot add tessface uv's in edit mode");
- return PointerRNA_NULL;
- }
-
- if (me->mpoly) {
- BKE_report(reports, RPT_ERROR, "Cannot add tessface uv's when MPoly's exist");
- return PointerRNA_NULL;
- }
-
- index = ED_mesh_uv_texture_add(me, name, false);
-
- if (index != -1) {
- fdata = rna_mesh_fdata_helper(me);
- cdl = &fdata->layers[CustomData_get_layer_index_n(fdata, CD_MTFACE, index)];
- }
-
- RNA_pointer_create(&me->id, &RNA_MeshTextureFaceLayer, cdl, &ptr);
- return ptr;
-}
-
-
static bool rna_Mesh_is_editmode_get(PointerRNA *ptr)
{
Mesh *me = rna_mesh(ptr);
@@ -1852,26 +1456,6 @@ static void UNUSED_FUNCTION(rna_mesh_unused)(void)
/* unused functions made by macros */
(void)rna_Mesh_skin_vertice_index_range;
(void)rna_Mesh_vertex_paint_mask_index_range;
- (void)rna_Mesh_tessface_uv_texture_active_set;
- (void)rna_Mesh_tessface_uv_texture_clone_get;
- (void)rna_Mesh_tessface_uv_texture_clone_index_get;
- (void)rna_Mesh_tessface_uv_texture_clone_index_set;
- (void)rna_Mesh_tessface_uv_texture_clone_set;
- (void)rna_Mesh_tessface_uv_texture_index_range;
- (void)rna_Mesh_tessface_uv_texture_render_get;
- (void)rna_Mesh_tessface_uv_texture_render_index_get;
- (void)rna_Mesh_tessface_uv_texture_render_index_set;
- (void)rna_Mesh_tessface_uv_texture_render_set;
- (void)rna_Mesh_tessface_uv_texture_stencil_get;
- (void)rna_Mesh_tessface_uv_texture_stencil_index_get;
- (void)rna_Mesh_tessface_uv_texture_stencil_index_set;
- (void)rna_Mesh_tessface_uv_texture_stencil_set;
- (void)rna_Mesh_tessface_vertex_color_active_set;
- (void)rna_Mesh_tessface_vertex_color_index_range;
- (void)rna_Mesh_tessface_vertex_color_render_get;
- (void)rna_Mesh_tessface_vertex_color_render_index_get;
- (void)rna_Mesh_tessface_vertex_color_render_index_set;
- (void)rna_Mesh_tessface_vertex_color_render_set;
(void)rna_Mesh_uv_layer_render_get;
(void)rna_Mesh_uv_layer_render_index_get;
(void)rna_Mesh_uv_layer_render_index_set;
@@ -2033,83 +1617,70 @@ static void rna_def_medge(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Index", "Index of this edge");
}
-static void rna_def_mface(BlenderRNA *brna)
+static void rna_def_mlooptri(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
- const int splitnor_dim[] = {4, 3};
+ const int splitnor_dim[] = {3, 3};
- srna = RNA_def_struct(brna, "MeshTessFace", NULL);
- RNA_def_struct_sdna(srna, "MFace");
- RNA_def_struct_ui_text(srna, "Mesh TessFace", "TessFace in a Mesh data-block");
- RNA_def_struct_path_func(srna, "rna_MeshTessFace_path");
+ srna = RNA_def_struct(brna, "MeshLoopTriangle", NULL);
+ RNA_def_struct_sdna(srna, "MLoopTri");
+ RNA_def_struct_ui_text(srna, "Mesh Loop Triangle", "Tessellated triangle in a Mesh data-block");
+ RNA_def_struct_path_func(srna, "rna_MeshLoopTriangle_path");
RNA_def_struct_ui_icon(srna, ICON_FACESEL);
- /* XXX allows creating invalid meshes */
prop = RNA_def_property(srna, "vertices", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_array(prop, 4);
- RNA_def_property_flag(prop, PROP_DYNAMIC);
- RNA_def_property_dynamic_array_funcs(prop, "rna_MeshTessFace_verts_get_length");
- RNA_def_property_int_funcs(prop, "rna_MeshTessFace_verts_get", "rna_MeshTessFace_verts_set", NULL);
- RNA_def_property_ui_text(prop, "Vertices", "Vertex indices");
-
- /* leaving this fixed size array for foreach_set used in import scripts */
- prop = RNA_def_property(srna, "vertices_raw", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_sdna(prop, NULL, "v1");
- RNA_def_property_array(prop, 4);
- RNA_def_property_ui_text(prop, "Vertices", "Fixed size vertex indices array");
-
- prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_sdna(prop, NULL, "mat_nr");
- RNA_def_property_ui_text(prop, "Material Index", "");
-#if 0
- RNA_def_property_int_funcs(prop, NULL, NULL, "rna_MeshPoly_material_index_range"); /* reuse for tessface is ok */
-#endif
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_FACE_SEL);
- RNA_def_property_ui_text(prop, "Select", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_int_funcs(prop, "rna_MeshLoopTriangle_verts_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Vertices", "Indices of triangle vertices");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_HIDE);
- RNA_def_property_ui_text(prop, "Hide", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
+ prop = RNA_def_property(srna, "loops", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "tri");
+ RNA_def_property_ui_text(prop, "Loops", "Indices of mesh loops that make up the triangle");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop = RNA_def_property(srna, "use_smooth", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_SMOOTH);
- RNA_def_property_ui_text(prop, "Smooth", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+ prop = RNA_def_property(srna, "polygon_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "poly");
+ RNA_def_property_ui_text(prop, "Polygon", "Index of mesh polygon that the triangle is a part of");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
prop = RNA_def_property(srna, "normal", PROP_FLOAT, PROP_DIRECTION);
RNA_def_property_array(prop, 3);
RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_float_funcs(prop, "rna_MeshTessFace_normal_get", NULL, NULL);
- RNA_def_property_ui_text(prop, "Face Normal", "Local space unit length normal vector for this face");
+ RNA_def_property_float_funcs(prop, "rna_MeshLoopTriangle_normal_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Triangle Normal", "Local space unit length normal vector for this triangle");
prop = RNA_def_property(srna, "split_normals", PROP_FLOAT, PROP_DIRECTION);
RNA_def_property_multi_array(prop, 2, splitnor_dim);
RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_float_funcs(prop, "rna_MeshTessFace_split_normals_get", NULL, NULL);
+ RNA_def_property_float_funcs(prop, "rna_MeshLoopTriangle_split_normals_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Split Normals",
- "Local space unit length split normals vectors of the vertices of this face "
- "(must be computed beforehand using calc_normals_split or calc_tangents, "
- "and then calc_tessface)");
+ "Local space unit length split normals vectors of the vertices of this triangle "
+ "(must be computed beforehand using calc_normals_split or calc_tangents)");
prop = RNA_def_property(srna, "area", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_float_funcs(prop, "rna_MeshTessFace_area_get", NULL, NULL);
- RNA_def_property_ui_text(prop, "Face Area", "Read only area of this face");
+ RNA_def_property_float_funcs(prop, "rna_MeshLoopTriangle_area_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Triangle Area", "Area of this triangle");
prop = RNA_def_property(srna, "index", PROP_INT, PROP_UNSIGNED);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_int_funcs(prop, "rna_MeshTessFace_index_get", NULL, NULL);
- RNA_def_property_ui_text(prop, "Index", "Index of this face");
-}
+ RNA_def_property_int_funcs(prop, "rna_MeshLoopTriangle_index_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Index", "Index of this loop triangle");
+ prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_int_funcs(prop, "rna_MeshLoopTriangle_material_index_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Material Index", "");
+
+ prop = RNA_def_property(srna, "use_smooth", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_MeshLoopTriangle_use_smooth_get", NULL);
+ RNA_def_property_ui_text(prop, "Smooth", "");
+}
static void rna_def_mloop(BlenderRNA *brna)
{
@@ -2319,179 +1890,6 @@ static void rna_def_mloopuv(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "UV Edge Select", "");
}
-static void rna_def_mtface(BlenderRNA *brna)
-{
- StructRNA *srna;
- PropertyRNA *prop;
- const int uv_dim[] = {4, 2};
-
- srna = RNA_def_struct(brna, "MeshTextureFaceLayer", NULL);
- RNA_def_struct_ui_text(srna, "Mesh UV Map", "UV map with assigned image textures in a Mesh data-block");
- RNA_def_struct_sdna(srna, "CustomDataLayer");
- RNA_def_struct_path_func(srna, "rna_MeshTextureFaceLayer_path");
- RNA_def_struct_ui_icon(srna, ICON_GROUP_UVS);
-
- prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_struct_name_property(srna, prop);
- RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MeshUVLayer_name_set");
- RNA_def_property_ui_text(prop, "Name", "Name of UV map");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_funcs(prop, "rna_MeshTextureFaceLayer_active_get", "rna_MeshTextureFaceLayer_active_set");
- RNA_def_property_ui_text(prop, "Active", "Set the map as active for display and editing");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "active_render", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "active_rnd", 0);
- RNA_def_property_boolean_funcs(prop, "rna_MeshTextureFaceLayer_active_render_get",
- "rna_MeshTextureFaceLayer_active_render_set");
- RNA_def_property_ui_text(prop, "Active Render", "Set the map as active for rendering");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "active_clone", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "active_clone", 0);
- RNA_def_property_boolean_funcs(prop, "rna_MeshTextureFaceLayer_clone_get", "rna_MeshTextureFaceLayer_clone_set");
- RNA_def_property_ui_text(prop, "Active Clone", "Set the map as active for cloning");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_struct_type(prop, "MeshTextureFace");
- RNA_def_property_ui_text(prop, "Data", "");
- RNA_def_property_collection_funcs(prop, "rna_MeshTextureFaceLayer_data_begin", "rna_iterator_array_next",
- "rna_iterator_array_end", "rna_iterator_array_get",
- "rna_MeshTextureFaceLayer_data_length", NULL, NULL, NULL);
-
- srna = RNA_def_struct(brna, "MeshTextureFace", NULL);
- RNA_def_struct_sdna(srna, "MTFace");
- RNA_def_struct_ui_text(srna, "Mesh UV Map Face", "UV map and image texture for a face");
- RNA_def_struct_path_func(srna, "rna_MeshTextureFace_path");
- RNA_def_struct_ui_icon(srna, ICON_FACESEL_HLT);
-
- /* these are for editing only, access at loops now */
-#if 0
- prop = RNA_def_property(srna, "select_uv", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", TF_SEL1);
- RNA_def_property_array(prop, 4);
- RNA_def_property_ui_text(prop, "UV Selected", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
-
- prop = RNA_def_property(srna, "pin_uv", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "unwrap", TF_PIN1);
- RNA_def_property_array(prop, 4);
- RNA_def_property_ui_text(prop, "UV Pinned", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
-#endif
-
- prop = RNA_def_property(srna, "uv1", PROP_FLOAT, PROP_XYZ);
- RNA_def_property_array(prop, 2);
- RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv1_get", "rna_MeshTextureFace_uv1_set", NULL);
- RNA_def_property_ui_text(prop, "UV 1", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "uv2", PROP_FLOAT, PROP_XYZ);
- RNA_def_property_array(prop, 2);
- RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv2_get", "rna_MeshTextureFace_uv2_set", NULL);
- RNA_def_property_ui_text(prop, "UV 2", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "uv3", PROP_FLOAT, PROP_XYZ);
- RNA_def_property_array(prop, 2);
- RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv3_get", "rna_MeshTextureFace_uv3_set", NULL);
- RNA_def_property_ui_text(prop, "UV 3", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "uv4", PROP_FLOAT, PROP_XYZ);
- RNA_def_property_array(prop, 2);
- RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv4_get", "rna_MeshTextureFace_uv4_set", NULL);
- RNA_def_property_ui_text(prop, "UV 4", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "uv", PROP_FLOAT, PROP_NONE);
- RNA_def_property_multi_array(prop, 2, uv_dim);
- RNA_def_property_flag(prop, PROP_DYNAMIC);
- RNA_def_property_dynamic_array_funcs(prop, "rna_MeshTextureFace_uv_get_length");
- RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv_get", "rna_MeshTextureFace_uv_set", NULL);
- RNA_def_property_ui_text(prop, "UV", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "uv_raw", PROP_FLOAT, PROP_NONE);
- RNA_def_property_multi_array(prop, 2, uv_dim);
- RNA_def_property_float_sdna(prop, NULL, "uv");
- RNA_def_property_ui_text(prop, "UV Raw", "Fixed size UV coordinates array");
-
-}
-
-static void rna_def_mcol(BlenderRNA *brna)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- srna = RNA_def_struct(brna, "MeshColorLayer", NULL);
- RNA_def_struct_ui_text(srna, "Mesh Vertex Color Layer", "Layer of vertex colors in a Mesh data-block");
- RNA_def_struct_sdna(srna, "CustomDataLayer");
- RNA_def_struct_path_func(srna, "rna_MeshColorLayer_path");
- RNA_def_struct_ui_icon(srna, ICON_GROUP_VCOL);
-
- prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_struct_name_property(srna, prop);
- RNA_def_property_string_funcs(prop, NULL, NULL, NULL);
- RNA_def_property_ui_text(prop, "Name", "Name of Vertex color layer");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_funcs(prop, "rna_MeshColorLayer_active_get", "rna_MeshColorLayer_active_set");
- RNA_def_property_ui_text(prop, "Active", "Sets the layer as active for display and editing");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "active_render", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "active_rnd", 0);
- RNA_def_property_boolean_funcs(prop, "rna_MeshColorLayer_active_render_get",
- "rna_MeshColorLayer_active_render_set");
- RNA_def_property_ui_text(prop, "Active Render", "Sets the layer as active for rendering");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_struct_type(prop, "MeshColor");
- RNA_def_property_ui_text(prop, "Data", "");
- RNA_def_property_collection_funcs(prop, "rna_MeshColorLayer_data_begin", "rna_iterator_array_next",
- "rna_iterator_array_end", "rna_iterator_array_get",
- "rna_MeshColorLayer_data_length", NULL, NULL, NULL);
-
- srna = RNA_def_struct(brna, "MeshColor", NULL);
- RNA_def_struct_sdna(srna, "MCol");
- RNA_def_struct_ui_text(srna, "Mesh Vertex Color", "Vertex colors for a face in a Mesh");
- RNA_def_struct_path_func(srna, "rna_MeshColor_path");
-
- prop = RNA_def_property(srna, "color1", PROP_FLOAT, PROP_COLOR);
- RNA_def_property_array(prop, 4);
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_float_funcs(prop, "rna_MeshColor_color1_get", "rna_MeshColor_color1_set", NULL);
- RNA_def_property_ui_text(prop, "Color 1", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "color2", PROP_FLOAT, PROP_COLOR);
- RNA_def_property_array(prop, 4);
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_float_funcs(prop, "rna_MeshColor_color2_get", "rna_MeshColor_color2_set", NULL);
- RNA_def_property_ui_text(prop, "Color 2", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "color3", PROP_FLOAT, PROP_COLOR);
- RNA_def_property_array(prop, 4);
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_float_funcs(prop, "rna_MeshColor_color3_get", "rna_MeshColor_color3_set", NULL);
- RNA_def_property_ui_text(prop, "Color 3", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "color4", PROP_FLOAT, PROP_COLOR);
- RNA_def_property_array(prop, 4);
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_float_funcs(prop, "rna_MeshColor_color4_get", "rna_MeshColor_color4_set", NULL);
- RNA_def_property_ui_text(prop, "Color 4", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-}
-
static void rna_def_mloopcol(BlenderRNA *brna)
{
StructRNA *srna;
@@ -2747,33 +2145,15 @@ static void rna_def_mesh_edges(BlenderRNA *brna, PropertyRNA *cprop)
#endif
}
-/* mesh.faces */
-static void rna_def_mesh_tessfaces(BlenderRNA *brna, PropertyRNA *cprop)
+/* mesh.loop_triangles */
+static void rna_def_mesh_looptris(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
- PropertyRNA *prop;
- FunctionRNA *func;
- PropertyRNA *parm;
-
- RNA_def_property_srna(cprop, "MeshTessFaces");
- srna = RNA_def_struct(brna, "MeshTessFaces", NULL);
+ RNA_def_property_srna(cprop, "MeshLoopTriangle");
+ srna = RNA_def_struct(brna, "MeshLoopTriangles", NULL);
RNA_def_struct_sdna(srna, "Mesh");
- RNA_def_struct_ui_text(srna, "Mesh Faces", "Collection of mesh faces");
-
- prop = RNA_def_property(srna, "active", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "act_face");
- RNA_def_property_ui_text(prop, "Active Face", "The active face for this mesh");
-
- func = RNA_def_function(srna, "add", "ED_mesh_tessfaces_add");
- RNA_def_function_flag(func, FUNC_USE_REPORTS);
- parm = RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of faces to add", 0, INT_MAX);
- RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
-#if 0 /* BMESH_TODO Remove until BMesh merge */
- func = RNA_def_function(srna, "remove", "ED_mesh_faces_remove");
- RNA_def_function_flag(func, FUNC_USE_REPORTS);
- RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of faces to remove", 0, INT_MAX);
-#endif
+ RNA_def_struct_ui_text(srna, "Mesh Loop Triangles", "Tessellation of mesh polygons into triangles");
}
/* mesh.loops */
@@ -2823,43 +2203,6 @@ static void rna_def_mesh_polygons(BlenderRNA *brna, PropertyRNA *cprop)
}
-/* mesh.vertex_colors */
-static void rna_def_tessface_vertex_colors(BlenderRNA *brna, PropertyRNA *cprop)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- FunctionRNA *func;
- PropertyRNA *parm;
-
- RNA_def_property_srna(cprop, "VertexColors");
- srna = RNA_def_struct(brna, "VertexColors", NULL);
- RNA_def_struct_sdna(srna, "Mesh");
- RNA_def_struct_ui_text(srna, "Vertex Colors", "Collection of vertex colors");
-
- /* eventually deprecate this */
- func = RNA_def_function(srna, "new", "rna_Mesh_tessface_vertex_color_new");
- RNA_def_function_flag(func, FUNC_USE_REPORTS);
- RNA_def_function_ui_description(func, "Add a vertex color layer to Mesh");
- RNA_def_string(func, "name", "Col", 0, "", "Vertex color name");
- parm = RNA_def_pointer(func, "layer", "MeshColorLayer", "", "The newly created layer");
- RNA_def_parameter_flags(parm, 0, PARM_RNAPTR);
- RNA_def_function_return(func, parm);
-
- prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "MeshColorLayer");
- RNA_def_property_pointer_funcs(prop, "rna_Mesh_tessface_vertex_color_active_get",
- "rna_Mesh_tessface_vertex_color_active_set", NULL, NULL);
- RNA_def_property_ui_text(prop, "Active Vertex Color Layer", "Active vertex color layer");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_funcs(prop, "rna_Mesh_tessface_vertex_color_active_index_get",
- "rna_Mesh_tessface_vertex_color_active_index_set", "rna_Mesh_vertex_color_index_range");
- RNA_def_property_ui_text(prop, "Active Vertex Color Index", "Active vertex color index");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-}
-
static void rna_def_loop_colors(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
@@ -3069,43 +2412,6 @@ static void rna_def_polygon_string_layers(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_return(func, parm);
}
-/* mesh.tessface_uv_layers */
-static void rna_def_tessface_uv_textures(BlenderRNA *brna, PropertyRNA *cprop)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- FunctionRNA *func;
- PropertyRNA *parm;
-
- RNA_def_property_srna(cprop, "TessfaceUVTextures");
- srna = RNA_def_struct(brna, "TessfaceUVTextures", NULL);
- RNA_def_struct_sdna(srna, "Mesh");
- RNA_def_struct_ui_text(srna, "UV Maps", "Collection of UV maps for tessellated faces");
-
- /* eventually deprecate this */
- func = RNA_def_function(srna, "new", "rna_Mesh_tessface_uv_texture_new");
- RNA_def_function_flag(func, FUNC_USE_REPORTS);
- RNA_def_function_ui_description(func, "Add a UV tessface-texture layer to Mesh (only for meshes with no polygons)");
- RNA_def_string(func, "name", "UVMap", 0, "", "UV map name");
- parm = RNA_def_pointer(func, "layer", "MeshTextureFaceLayer", "", "The newly created layer");
- RNA_def_parameter_flags(parm, 0, PARM_RNAPTR);
- RNA_def_function_return(func, parm);
-
- prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "MeshTextureFaceLayer");
- RNA_def_property_pointer_funcs(prop, "rna_Mesh_tessface_uv_texture_active_get",
- "rna_Mesh_tessface_uv_texture_active_set", NULL, NULL);
- RNA_def_property_ui_text(prop, "Active UV Map", "Active UV Map");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_funcs(prop, "rna_Mesh_tessface_uv_texture_active_index_get",
- "rna_Mesh_tessface_uv_texture_active_index_set", "rna_Mesh_uv_layer_index_range");
- RNA_def_property_ui_text(prop, "Active UV Map Index", "Active UV Map index");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-}
-
static void rna_def_skin_vertices(BlenderRNA *brna, PropertyRNA *UNUSED(cprop))
{
StructRNA *srna;
@@ -3280,12 +2586,6 @@ static void rna_def_mesh(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Edges", "Edges of the mesh");
rna_def_mesh_edges(brna, prop);
- prop = RNA_def_property(srna, "tessfaces", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_collection_sdna(prop, NULL, "mface", "totface");
- RNA_def_property_struct_type(prop, "MeshTessFace");
- RNA_def_property_ui_text(prop, "TessFaces", "Tessellated faces of the mesh (derived from polygons)");
- rna_def_mesh_tessfaces(brna, prop);
-
prop = RNA_def_property(srna, "loops", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "mloop", "totloop");
RNA_def_property_struct_type(prop, "MeshLoop");
@@ -3298,6 +2598,12 @@ static void rna_def_mesh(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Polygons", "Polygons of the mesh");
rna_def_mesh_polygons(brna, prop);
+ prop = RNA_def_property(srna, "loop_triangles", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "runtime.looptris.array", "runtime.looptris.len");
+ RNA_def_property_struct_type(prop, "MeshLoopTriangle");
+ RNA_def_property_ui_text(prop, "Loop Triangles", "Tessellation of mesh polygons into triangles");
+ rna_def_mesh_looptris(brna, prop);
+
/* TODO, should this be allowed to be its self? */
prop = RNA_def_property(srna, "texture_mesh", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "texcomesh");
@@ -3338,27 +2644,6 @@ static void rna_def_mesh(BlenderRNA *brna)
"rna_Mesh_uv_layer_stencil_index_set", "rna_Mesh_uv_layer_index_range");
RNA_def_property_ui_text(prop, "Mask UV loop layer Index", "Mask UV loop layer index");
- /* Tessellated face UV maps - used by renderers */
- prop = RNA_def_property(srna, "tessface_uv_textures", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_collection_sdna(prop, NULL, "fdata.layers", "fdata.totlayer");
- RNA_def_property_collection_funcs(prop, "rna_Mesh_tessface_uv_textures_begin", NULL, NULL, NULL,
- "rna_Mesh_tessface_uv_textures_length", NULL, NULL, NULL);
- RNA_def_property_struct_type(prop, "MeshTextureFaceLayer");
- RNA_def_property_ui_text(prop, "Tessellated Face UV Maps",
- "All UV maps for tessellated faces (read-only, for use by renderers)");
- rna_def_tessface_uv_textures(brna, prop);
-
- /* Tessellated face colors - used by renderers */
-
- prop = RNA_def_property(srna, "tessface_vertex_colors", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_collection_sdna(prop, NULL, "fdata.layers", "fdata.totlayer");
- RNA_def_property_collection_funcs(prop, "rna_Mesh_tessface_vertex_colors_begin", NULL, NULL, NULL,
- "rna_Mesh_tessface_vertex_colors_length", NULL, NULL, NULL);
- RNA_def_property_struct_type(prop, "MeshColorLayer");
- RNA_def_property_ui_text(prop, "Tessellated Face Colors",
- "All tessellated face colors (read-only, for use by renderers)");
- rna_def_tessface_vertex_colors(brna, prop);
-
/* Vertex colors */
prop = RNA_def_property(srna, "vertex_colors", PROP_COLLECTION, PROP_NONE);
@@ -3510,94 +2795,11 @@ static void rna_def_mesh(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
#endif
- /* Mesh Draw Options for Edit Mode*/
-
- prop = RNA_def_property(srna, "show_edges", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEDGES);
- RNA_def_property_ui_text(prop, "Draw Edges",
- "Display selected edges using highlights in the 3D view and UV editor");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
-
- prop = RNA_def_property(srna, "show_faces", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWFACES);
- RNA_def_property_ui_text(prop, "Draw Faces", "Display all faces as shades in the 3D view and UV editor");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
-
- prop = RNA_def_property(srna, "show_face_center", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_FACE_DOT);
- RNA_def_property_ui_text(prop, "Draw Face Center", "Display face center");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
-
- prop = RNA_def_property(srna, "show_edge_crease", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWCREASES);
- RNA_def_property_ui_text(prop, "Draw Creases", "Display creases created for Subdivision Surface modifier");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
-
- prop = RNA_def_property(srna, "show_edge_bevel_weight", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWBWEIGHTS);
- RNA_def_property_ui_text(prop, "Draw Bevel Weights", "Display weights created for the Bevel modifier");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
-
- prop = RNA_def_property(srna, "show_edge_seams", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWSEAMS);
- RNA_def_property_ui_text(prop, "Draw Seams", "Display UV unwrapping seams");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
-
- prop = RNA_def_property(srna, "show_edge_sharp", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWSHARP);
- RNA_def_property_ui_text(prop, "Draw Sharp", "Display sharp edges, used with the Edge Split modifier");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
-
- prop = RNA_def_property(srna, "show_freestyle_edge_marks", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_FREESTYLE_EDGE);
- RNA_def_property_ui_text(prop, "Draw Freestyle Edge Marks", "Display Freestyle edge marks, used with the Freestyle renderer");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
-
- prop = RNA_def_property(srna, "show_freestyle_face_marks", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_FREESTYLE_FACE);
- RNA_def_property_ui_text(prop, "Draw Freestyle Face Marks", "Display Freestyle face marks, used with the Freestyle renderer");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
-
- prop = RNA_def_property(srna, "show_statvis", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_STATVIS);
- RNA_def_property_ui_text(prop, "Stat Vis", "Display statistical information about the mesh");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data_edit_color");
-
- prop = RNA_def_property(srna, "show_extra_edge_length", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_EDGELEN);
- RNA_def_property_ui_text(prop, "Edge Length",
- "Display selected edge lengths, using global values when set in the transform panel");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
-
- prop = RNA_def_property(srna, "show_extra_edge_angle", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_EDGEANG);
- RNA_def_property_ui_text(prop, "Edge Angle",
- "Display selected edge angle, using global values when set in the transform panel");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
-
- prop = RNA_def_property(srna, "show_extra_face_angle", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_FACEANG);
- RNA_def_property_ui_text(prop, "Face Angles",
- "Display the angles in the selected edges, "
- "using global values when set in the transform panel");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
-
- prop = RNA_def_property(srna, "show_extra_face_area", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_FACEAREA);
- RNA_def_property_ui_text(prop, "Face Area",
- "Display the area of selected faces, "
- "using global values when set in the transform panel");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
-
- prop = RNA_def_property(srna, "show_extra_indices", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_INDICES);
- RNA_def_property_ui_text(prop, "Indices", "Display the index numbers of selected vertices, edges, and faces");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
-
/* editflag */
prop = RNA_def_property(srna, "use_mirror_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "editflag", ME_EDIT_MIRROR_X);
RNA_def_property_ui_text(prop, "X Mirror", "X Axis mirror editing");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
#if 0
prop = RNA_def_property(srna, "use_mirror_y", PROP_BOOLEAN, PROP_NONE);
@@ -3618,7 +2820,7 @@ static void rna_def_mesh(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_paint_mask", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "editflag", ME_EDIT_PAINT_FACE_SEL);
RNA_def_property_ui_text(prop, "Paint Mask", "Face selection masking for painting");
- RNA_def_property_ui_icon(prop, ICON_FACESEL_HLT, 0);
+ RNA_def_property_ui_icon(prop, ICON_FACESEL, 0);
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_Mesh_update_facemask");
prop = RNA_def_property(srna, "use_paint_mask_vertex", PROP_BOOLEAN, PROP_NONE);
@@ -3677,12 +2879,10 @@ void RNA_def_mesh(BlenderRNA *brna)
rna_def_mvert(brna);
rna_def_mvert_group(brna);
rna_def_medge(brna);
- rna_def_mface(brna);
+ rna_def_mlooptri(brna);
rna_def_mloop(brna);
rna_def_mpolygon(brna);
rna_def_mloopuv(brna);
- rna_def_mtface(brna);
- rna_def_mcol(brna);
rna_def_mloopcol(brna);
rna_def_mproperties(brna);
rna_def_face_map(brna);
diff --git a/source/blender/makesrna/intern/rna_mesh_api.c b/source/blender/makesrna/intern/rna_mesh_api.c
index 7328686af7f..a08555794d8 100644
--- a/source/blender/makesrna/intern/rna_mesh_api.c
+++ b/source/blender/makesrna/intern/rna_mesh_api.c
@@ -50,6 +50,7 @@
#include "BKE_mesh.h"
#include "BKE_mesh_tangent.h"
#include "BKE_mesh_mapping.h"
+#include "BKE_mesh_runtime.h"
#include "ED_mesh.h"
static const char *rna_Mesh_unit_test_compare(struct Mesh *mesh, struct Mesh *mesh2)
@@ -101,9 +102,9 @@ static void rna_Mesh_free_tangents(Mesh *mesh)
CustomData_free_layers(&mesh->ldata, CD_MLOOPTANGENT, mesh->totloop);
}
-static void rna_Mesh_calc_tessface(Mesh *mesh, bool free_mpoly)
+static void rna_Mesh_calc_looptri(Mesh *mesh)
{
- ED_mesh_calc_tessface(mesh, free_mpoly != 0);
+ BKE_mesh_runtime_looptri_ensure(mesh);
}
static void rna_Mesh_calc_smooth_groups(Mesh *mesh, bool use_bitflags, int *r_poly_group_len,
@@ -206,6 +207,7 @@ static void rna_Mesh_flip_normals(Mesh *mesh)
BKE_mesh_polygons_flip(mesh->mpoly, mesh->mloop, &mesh->ldata, mesh->totpoly);
BKE_mesh_tessface_clear(mesh);
BKE_mesh_calc_normals(mesh);
+ BKE_mesh_runtime_clear_geometry(mesh);
DEG_id_tag_update(&mesh->id, 0);
}
@@ -269,12 +271,8 @@ void RNA_api_mesh(StructRNA *srna)
func = RNA_def_function(srna, "free_tangents", "rna_Mesh_free_tangents");
RNA_def_function_ui_description(func, "Free tangents");
- func = RNA_def_function(srna, "calc_tessface", "rna_Mesh_calc_tessface");
- RNA_def_function_ui_description(func, "Calculate face tessellation (supports editmode too)");
- RNA_def_boolean(func, "free_mpoly", 0, "Free MPoly", "Free data used by polygons and loops. "
- "WARNING: This destructive operation removes regular faces, "
- "only used on temporary mesh data-blocks to reduce memory footprint of render "
- "engines and export scripts");
+ func = RNA_def_function(srna, "calc_loop_triangles", "rna_Mesh_calc_looptri");
+ RNA_def_function_ui_description(func, "Calculate loop triangle tessellation (supports editmode too)");
func = RNA_def_function(srna, "calc_smooth_groups", "rna_Mesh_calc_smooth_groups");
RNA_def_function_ui_description(func, "Calculate smooth groups from sharp edges");
@@ -308,7 +306,8 @@ void RNA_api_mesh(StructRNA *srna)
func = RNA_def_function(srna, "update", "ED_mesh_update");
RNA_def_boolean(func, "calc_edges", 0, "Calculate Edges", "Force recalculation of edges");
- RNA_def_boolean(func, "calc_tessface", 0, "Calculate Tessellation", "Force recalculation of tessellation faces");
+ RNA_def_boolean(func, "calc_edges_loose", 0, "Calculate Loose Edges", "Calculate the loose state of each edge");
+ RNA_def_boolean(func, "calc_loop_triangles", 0, "Calculate Triangules", "Force recalculation of triangle tessellation");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
RNA_def_function(srna, "update_gpu_tag", "rna_Mesh_update_gpu_tag");
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index d31d788633e..02bcf8f89d1 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -95,17 +95,17 @@ const EnumPropertyItem rna_enum_object_modifier_type_items[] = {
{0, "", 0, N_("Deform"), ""},
{eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""},
{eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""},
- {eModifierType_CorrectiveSmooth, "CORRECTIVE_SMOOTH", ICON_MOD_SMOOTH, "Corrective Smooth", ""},
{eModifierType_Curve, "CURVE", ICON_MOD_CURVE, "Curve", ""},
{eModifierType_Displace, "DISPLACE", ICON_MOD_DISPLACE, "Displace", ""},
{eModifierType_Hook, "HOOK", ICON_HOOK, "Hook", ""},
- {eModifierType_LaplacianSmooth, "LAPLACIANSMOOTH", ICON_MOD_SMOOTH, "Laplacian Smooth", ""},
{eModifierType_LaplacianDeform, "LAPLACIANDEFORM", ICON_MOD_MESHDEFORM, "Laplacian Deform", ""},
{eModifierType_Lattice, "LATTICE", ICON_MOD_LATTICE, "Lattice", ""},
{eModifierType_MeshDeform, "MESH_DEFORM", ICON_MOD_MESHDEFORM, "Mesh Deform", ""},
{eModifierType_Shrinkwrap, "SHRINKWRAP", ICON_MOD_SHRINKWRAP, "Shrinkwrap", ""},
{eModifierType_SimpleDeform, "SIMPLE_DEFORM", ICON_MOD_SIMPLEDEFORM, "Simple Deform", ""},
{eModifierType_Smooth, "SMOOTH", ICON_MOD_SMOOTH, "Smooth", ""},
+ {eModifierType_CorrectiveSmooth, "CORRECTIVE_SMOOTH", ICON_MOD_SMOOTH, "Smooth Corrective", ""},
+ {eModifierType_LaplacianSmooth, "LAPLACIANSMOOTH", ICON_MOD_SMOOTH, "Smooth Laplacian", ""},
{eModifierType_SurfaceDeform, "SURFACE_DEFORM", ICON_MOD_MESHDEFORM, "Surface Deform", ""},
{eModifierType_Warp, "WARP", ICON_MOD_WARP, "Warp", ""},
{eModifierType_Wave, "WAVE", ICON_MOD_WAVE, "Wave", ""},
@@ -117,11 +117,11 @@ const EnumPropertyItem rna_enum_object_modifier_type_items[] = {
{eModifierType_Fluidsim, "FLUID_SIMULATION", ICON_MOD_FLUIDSIM, "Fluid Simulation", ""},
{eModifierType_Fracture, "FRACTURE", ICON_MOD_EXPLODE, "Fracture", ""},
{eModifierType_Ocean, "OCEAN", ICON_MOD_OCEAN, "Ocean", ""},
- {eModifierType_ParticleInstance, "PARTICLE_INSTANCE", ICON_MOD_PARTICLES, "Particle Instance", ""},
+ {eModifierType_ParticleInstance, "PARTICLE_INSTANCE", ICON_MOD_PARTICLE_INSTANCE, "Particle Instance", ""},
{eModifierType_ParticleSystem, "PARTICLE_SYSTEM", ICON_MOD_PARTICLES, "Particle System", ""},
{eModifierType_Smoke, "SMOKE", ICON_MOD_SMOKE, "Smoke", ""},
{eModifierType_Softbody, "SOFT_BODY", ICON_MOD_SOFT, "Soft Body", ""},
- {eModifierType_Surface, "SURFACE", ICON_MOD_PHYSICS, "Surface", ""},
+ {eModifierType_Surface, "SURFACE", ICON_MODIFIER, "Surface", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -141,6 +141,24 @@ const EnumPropertyItem rna_enum_modifier_triangulate_ngon_method_items[] = {
{0, NULL, 0, NULL, NULL}
};
+const EnumPropertyItem rna_enum_modifier_shrinkwrap_mode_items[] = {
+ {MOD_SHRINKWRAP_ON_SURFACE, "ON_SURFACE", 0, "On Surface",
+ "The point is constrained to the surface of the target object, "
+ "with distance offset towards the original point location"},
+ {MOD_SHRINKWRAP_INSIDE, "INSIDE", 0, "Inside",
+ "The point is constrained to be inside the target object"},
+ {MOD_SHRINKWRAP_OUTSIDE, "OUTSIDE", 0, "Outside",
+ "The point is constrained to be outside the target object"},
+ {MOD_SHRINKWRAP_OUTSIDE_SURFACE, "OUTSIDE_SURFACE", 0, "Outside Surface",
+ "The point is constrained to the surface of the target object, "
+ "with distance offset always to the outside, towards or away from the original location"},
+ {MOD_SHRINKWRAP_ABOVE_SURFACE, "ABOVE_SURFACE", 0, "Above Surface",
+ "The point is constrained to the surface of the target object, "
+ "with distance offset applied exactly along the target normal"},
+ {0, NULL, 0, NULL, NULL}
+};
+
+
#ifndef RNA_RUNTIME
/* use eWarp_Falloff_*** & eHook_Falloff_***, they're in sync */
static const EnumPropertyItem modifier_warp_falloff_items[] = {
@@ -288,7 +306,6 @@ const EnumPropertyItem rna_enum_axis_flag_xyz_items[] = {
#include "BKE_cachefile.h"
#include "BKE_context.h"
-#include "BKE_library.h"
#include "BKE_mesh_runtime.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
@@ -699,15 +716,13 @@ static int rna_MultiresModifier_filepath_length(PointerRNA *ptr)
static int rna_ShrinkwrapModifier_face_cull_get(PointerRNA *ptr)
{
ShrinkwrapModifierData *swm = (ShrinkwrapModifierData *)ptr->data;
- return swm->shrinkOpts & (MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE | MOD_SHRINKWRAP_CULL_TARGET_BACKFACE);
+ return swm->shrinkOpts & MOD_SHRINKWRAP_CULL_TARGET_MASK;
}
static void rna_ShrinkwrapModifier_face_cull_set(struct PointerRNA *ptr, int value)
{
ShrinkwrapModifierData *swm = (ShrinkwrapModifierData *)ptr->data;
-
- swm->shrinkOpts =
- (swm->shrinkOpts & ~(MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE | MOD_SHRINKWRAP_CULL_TARGET_BACKFACE)) | value;
+ swm->shrinkOpts = (swm->shrinkOpts & ~MOD_SHRINKWRAP_CULL_TARGET_MASK) | value;
}
static bool rna_MeshDeformModifier_is_bound_get(PointerRNA *ptr)
@@ -823,7 +838,7 @@ static void rna_DataTransferModifier_use_data_update(Main *bmain, Scene *scene,
dtmd->data_types &= ~DT_TYPE_POLY_ALL;
}
- rna_Modifier_update(bmain, scene, ptr);
+ rna_Modifier_dependency_update(bmain, scene, ptr);
}
static void rna_DataTransferModifier_data_types_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -844,7 +859,7 @@ static void rna_DataTransferModifier_data_types_update(Main *bmain, Scene *scene
dtmd->flags |= MOD_DATATRANSFER_USE_POLY;
}
- rna_Modifier_update(bmain, scene, ptr);
+ rna_Modifier_dependency_update(bmain, scene, ptr);
}
static void rna_DataTransferModifier_verts_data_types_set(struct PointerRNA *ptr, int value)
@@ -3154,6 +3169,9 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
"Shrink the mesh to the nearest target surface along a given axis"},
{MOD_SHRINKWRAP_NEAREST_VERTEX, "NEAREST_VERTEX", 0, "Nearest Vertex",
"Shrink the mesh to the nearest target vertex"},
+ {MOD_SHRINKWRAP_TARGET_PROJECT, "TARGET_PROJECT", 0, "Target Normal Project",
+ "Shrink the mesh to the nearest target surface "
+ "along the interpolated vertex normals of the target"},
{0, NULL, 0, NULL, NULL}
};
@@ -3174,7 +3192,13 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "shrinkType");
RNA_def_property_enum_items(prop, shrink_type_items);
RNA_def_property_ui_text(prop, "Mode", "");
- RNA_def_property_update(prop, 0, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
+
+ prop = RNA_def_property(srna, "wrap_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "shrinkMode");
+ RNA_def_property_enum_items(prop, rna_enum_modifier_shrinkwrap_mode_items);
+ RNA_def_property_ui_text(prop, "Snap Mode", "Select how vertices are constrained to the target surface");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
prop = RNA_def_property(srna, "cull_face", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "shrinkOpts");
@@ -3252,9 +3276,9 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Positive", "Allow vertices to move in the positive direction of axis");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop = RNA_def_property(srna, "use_keep_above_surface", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_KEEP_ABOVE_SURFACE);
- RNA_def_property_ui_text(prop, "Keep Above Surface", "");
+ prop = RNA_def_property(srna, "use_invert_cull", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_INVERT_CULL_TARGET);
+ RNA_def_property_ui_text(prop, "Invert Cull", "When projecting in the negative direction invert the face cull mode");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "invert_vertex_group", PROP_BOOLEAN, PROP_NONE);
@@ -3317,6 +3341,13 @@ static void rna_def_modifier_mask(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MASK_INV);
RNA_def_property_ui_text(prop, "Invert", "Use vertices that are not part of region defined");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_FACTOR);
+ RNA_def_property_float_sdna(prop, NULL, "threshold");
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_range(prop, 0, 1, 0.1, 3);
+ RNA_def_property_ui_text(prop, "Threshold", "Weights over this threshold remain");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_simpledeform(BlenderRNA *brna)
@@ -5035,13 +5066,13 @@ void RNA_def_modifier(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 0);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_ON, 1);
prop = RNA_def_property(srna, "show_render", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Render);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
RNA_def_property_ui_text(prop, "Render", "Use modifier during render");
- RNA_def_property_ui_icon(prop, ICON_SCENE, 0);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_ON, 1);
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, NULL);
prop = RNA_def_property(srna, "show_in_editmode", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_movieclip.c b/source/blender/makesrna/intern/rna_movieclip.c
index 81c3c9b43b9..aedaeccc0b6 100644
--- a/source/blender/makesrna/intern/rna_movieclip.c
+++ b/source/blender/makesrna/intern/rna_movieclip.c
@@ -230,11 +230,11 @@ static void rna_def_moviecliUser(BlenderRNA *brna)
PropertyRNA *prop;
static const EnumPropertyItem clip_render_size_items[] = {
- {MCLIP_PROXY_RENDER_SIZE_25, "PROXY_25", 0, "Proxy size 25%", ""},
- {MCLIP_PROXY_RENDER_SIZE_50, "PROXY_50", 0, "Proxy size 50%", ""},
- {MCLIP_PROXY_RENDER_SIZE_75, "PROXY_75", 0, "Proxy size 75%", ""},
- {MCLIP_PROXY_RENDER_SIZE_100, "PROXY_100", 0, "Proxy size 100%", ""},
- {MCLIP_PROXY_RENDER_SIZE_FULL, "FULL", 0, "No proxy, full render", ""},
+ {MCLIP_PROXY_RENDER_SIZE_25, "PROXY_25", 0, "25%", ""},
+ {MCLIP_PROXY_RENDER_SIZE_50, "PROXY_50", 0, "50%", ""},
+ {MCLIP_PROXY_RENDER_SIZE_75, "PROXY_75", 0, "75%", ""},
+ {MCLIP_PROXY_RENDER_SIZE_100, "PROXY_100", 0, "100%", ""},
+ {MCLIP_PROXY_RENDER_SIZE_FULL, "FULL", 0, "None, full render", ""},
{0, NULL, 0, NULL, NULL}
};
diff --git a/source/blender/makesrna/intern/rna_nla.c b/source/blender/makesrna/intern/rna_nla.c
index 025bc705560..444438a230c 100644
--- a/source/blender/makesrna/intern/rna_nla.c
+++ b/source/blender/makesrna/intern/rna_nla.c
@@ -57,6 +57,9 @@
#include "ED_anim_api.h"
+#include "DEG_depsgraph_build.h"
+#include "DEG_depsgraph.h"
+
/* temp constant defined for these funcs only... */
#define NLASTRIP_MIN_LEN_THRESH 0.1f
@@ -104,11 +107,18 @@ static char *rna_NlaStrip_path(PointerRNA *ptr)
return BLI_strdup("");
}
-static void rna_NlaStrip_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
+static void rna_NlaStrip_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
{
ID *id = ptr->id.data;
- ANIM_id_update(scene, id);
+ ANIM_id_update(bmain, id);
+}
+
+static void rna_NlaStrip_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ DEG_relations_tag_update(bmain);
+
+ rna_NlaStrip_update(bmain, scene, ptr);
}
static void rna_NlaStrip_transform_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -367,7 +377,7 @@ static FCurve *rna_NlaStrip_fcurve_find(NlaStrip *strip, ReportList *reports, co
}
-static NlaStrip *rna_NlaStrip_new(NlaTrack *track, bContext *C, ReportList *reports, const char *UNUSED(name),
+static NlaStrip *rna_NlaStrip_new(ID *id, NlaTrack *track, Main *bmain, bContext *C, ReportList *reports, const char *UNUSED(name),
int start, bAction *action)
{
NlaStrip *strip = BKE_nlastrip_new(action);
@@ -383,7 +393,7 @@ static NlaStrip *rna_NlaStrip_new(NlaTrack *track, bContext *C, ReportList *repo
if (BKE_nlastrips_add_strip(&track->strips, strip) == 0) {
BKE_report(reports, RPT_ERROR,
"Unable to add strip (the track does not have any space to accommodate this new strip)");
- BKE_nlastrip_free(NULL, strip);
+ BKE_nlastrip_free(NULL, strip, true);
return NULL;
}
@@ -413,10 +423,13 @@ static NlaStrip *rna_NlaStrip_new(NlaTrack *track, bContext *C, ReportList *repo
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_ADDED, NULL);
+ DEG_relations_tag_update(bmain);
+ DEG_id_tag_update_ex(bmain, id, DEG_TAG_TIME | DEG_TAG_COPY_ON_WRITE);
+
return strip;
}
-static void rna_NlaStrip_remove(NlaTrack *track, bContext *C, ReportList *reports, PointerRNA *strip_ptr)
+static void rna_NlaStrip_remove(ID *id, NlaTrack *track, Main *bmain, bContext *C, ReportList *reports, PointerRNA *strip_ptr)
{
NlaStrip *strip = strip_ptr->data;
if (BLI_findindex(&track->strips, strip) == -1) {
@@ -424,10 +437,13 @@ static void rna_NlaStrip_remove(NlaTrack *track, bContext *C, ReportList *report
return;
}
- BKE_nlastrip_free(&track->strips, strip);
+ BKE_nlastrip_free(&track->strips, strip, true);
RNA_POINTER_INVALIDATE(strip_ptr);
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_REMOVED, NULL);
+
+ DEG_relations_tag_update(bmain);
+ DEG_id_tag_update_ex(bmain, id, DEG_TAG_TIME | DEG_TAG_COPY_ON_WRITE);
}
/* Set the 'solo' setting for the given NLA-track, making sure that it is the only one
@@ -602,7 +618,7 @@ static void rna_def_nlastrip(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT);
RNA_def_property_editable_func(prop, "rna_NlaStrip_action_editable");
RNA_def_property_ui_text(prop, "Action", "Action referenced by this strip");
- RNA_def_property_update(prop, NC_ANIMATION | ND_NLA | NA_EDITED, "rna_NlaStrip_update");
+ RNA_def_property_update(prop, NC_ANIMATION | ND_NLA | NA_EDITED, "rna_NlaStrip_dependency_update");
/* Action extents */
prop = RNA_def_property(srna, "action_frame_start", PROP_FLOAT, PROP_TIME);
@@ -735,7 +751,7 @@ static void rna_api_nlatrack_strips(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_struct_ui_text(srna, "Nla Strips", "Collection of Nla Strips");
func = RNA_def_function(srna, "new", "rna_NlaStrip_new");
- RNA_def_function_flag(func, FUNC_USE_CONTEXT | FUNC_USE_REPORTS);
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_MAIN | FUNC_USE_CONTEXT | FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Add a new Action-Clip strip to the track");
parm = RNA_def_string(func, "name", "NlaStrip", 0, "", "Name for the NLA Strips");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
@@ -749,7 +765,7 @@ static void rna_api_nlatrack_strips(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_return(func, parm);
func = RNA_def_function(srna, "remove", "rna_NlaStrip_remove");
- RNA_def_function_flag(func, FUNC_USE_CONTEXT | FUNC_USE_REPORTS);
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_MAIN | FUNC_USE_CONTEXT | FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Remove a NLA Strip");
parm = RNA_def_pointer(func, "strip", "NlaStrip", "", "NLA Strip to remove");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 0bb222b2dff..42abf76901c 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -43,7 +43,6 @@
#include "DNA_texture_types.h"
#include "BKE_animsys.h"
-#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_image.h"
#include "BKE_texture.h"
@@ -113,41 +112,35 @@ static const EnumPropertyItem node_chunksize_items[] = {
};
#endif
-#define DEF_ICON_BLANK_SKIP
-#define DEF_ICON(name) {ICON_##name, (#name), 0, (#name), ""},
-#define DEF_VICO(name)
-const EnumPropertyItem rna_enum_node_icon_items[] = {
-#include "UI_icons.h"
- {0, NULL, 0, NULL, NULL}};
-#undef DEF_ICON_BLANK_SKIP
-#undef DEF_ICON
-#undef DEF_VICO
-
const EnumPropertyItem rna_enum_node_math_items[] = {
{NODE_MATH_ADD, "ADD", 0, "Add", ""},
{NODE_MATH_SUB, "SUBTRACT", 0, "Subtract", ""},
{NODE_MATH_MUL, "MULTIPLY", 0, "Multiply", ""},
{NODE_MATH_DIVIDE, "DIVIDE", 0, "Divide", ""},
- {NODE_MATH_SIN, "SINE", 0, "Sine", ""},
- {NODE_MATH_COS, "COSINE", 0, "Cosine", ""},
- {NODE_MATH_TAN, "TANGENT", 0, "Tangent", ""},
- {NODE_MATH_ASIN, "ARCSINE", 0, "Arcsine", ""},
- {NODE_MATH_ACOS, "ARCCOSINE", 0, "Arccosine", ""},
- {NODE_MATH_ATAN, "ARCTANGENT", 0, "Arctangent", ""},
+ {0, "", ICON_NONE, NULL, NULL},
{NODE_MATH_POW, "POWER", 0, "Power", ""},
{NODE_MATH_LOG, "LOGARITHM", 0, "Logarithm", ""},
+ {NODE_MATH_SQRT, "SQRT", 0, "Square Root", ""},
+ {NODE_MATH_ABS, "ABSOLUTE", 0, "Absolute", ""},
+ {0, "", ICON_NONE, NULL, NULL},
{NODE_MATH_MIN, "MINIMUM", 0, "Minimum", ""},
{NODE_MATH_MAX, "MAXIMUM", 0, "Maximum", ""},
- {NODE_MATH_ROUND, "ROUND", 0, "Round", ""},
{NODE_MATH_LESS, "LESS_THAN", 0, "Less Than", ""},
{NODE_MATH_GREATER, "GREATER_THAN", 0, "Greater Than", ""},
- {NODE_MATH_MOD, "MODULO", 0, "Modulo", ""},
- {NODE_MATH_ABS, "ABSOLUTE", 0, "Absolute", ""},
- {NODE_MATH_ATAN2, "ARCTAN2", 0, "Arctan2", ""},
+ {0, "", ICON_NONE, NULL, NULL},
+ {NODE_MATH_ROUND, "ROUND", 0, "Round", ""},
{NODE_MATH_FLOOR, "FLOOR", 0, "Floor", ""},
{NODE_MATH_CEIL, "CEIL", 0, "Ceil", ""},
{NODE_MATH_FRACT, "FRACT", 0, "Fract", ""},
- {NODE_MATH_SQRT, "SQRT", 0, "Square Root", ""},
+ {NODE_MATH_MOD, "MODULO", 0, "Modulo", ""},
+ {0, "", ICON_NONE, NULL, NULL},
+ {NODE_MATH_SIN, "SINE", 0, "Sine", ""},
+ {NODE_MATH_COS, "COSINE", 0, "Cosine", ""},
+ {NODE_MATH_TAN, "TANGENT", 0, "Tangent", ""},
+ {NODE_MATH_ASIN, "ARCSINE", 0, "Arcsine", ""},
+ {NODE_MATH_ACOS, "ARCCOSINE", 0, "Arccosine", ""},
+ {NODE_MATH_ATAN, "ARCTANGENT", 0, "Arctangent", ""},
+ {NODE_MATH_ATAN2, "ARCTAN2", 0, "Arctan2", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -196,7 +189,6 @@ static const EnumPropertyItem prop_shader_output_target_items[] = {
#include "BKE_context.h"
#include "BKE_idprop.h"
-#include "BKE_library.h"
#include "BKE_global.h"
@@ -552,7 +544,7 @@ static bool rna_NodeTree_poll(const bContext *C, bNodeTreeType *ntreetype)
ParameterList list;
FunctionRNA *func;
void *ret;
- int visible;
+ bool visible;
RNA_pointer_create(NULL, ntreetype->ext.srna, NULL, &ptr); /* dummy */
func = &rna_NodeTree_poll_func; /* RNA_struct_find_function(&ptr, "poll"); */
@@ -6255,11 +6247,6 @@ static void def_cmp_mask(StructRNA *srna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Mask", "");
- prop = RNA_def_property(srna, "use_antialiasing", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "custom1", CMP_NODEFLAG_MASK_AA);
- RNA_def_property_ui_text(prop, "Anti-Alias", "Apply an anti-aliasing filter to the mask");
- RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
-
prop = RNA_def_property(srna, "use_feather", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "custom1", CMP_NODEFLAG_MASK_NO_FEATHER);
RNA_def_property_ui_text(prop, "Feather", "Use feather information from the mask");
@@ -7109,7 +7096,7 @@ static void rna_def_node_socket(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Node Socket", "Input or output socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_refine_func(srna, "rna_NodeSocket_refine");
- RNA_def_struct_ui_icon(srna, ICON_PLUG);
+ RNA_def_struct_ui_icon(srna, ICON_PLUGIN);
RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
RNA_def_struct_register_funcs(srna, "rna_NodeSocket_register", "rna_NodeSocket_unregister", NULL);
RNA_def_struct_idprops_func(srna, "rna_NodeSocket_idprops");
@@ -8026,7 +8013,7 @@ static void rna_def_node(BlenderRNA *brna)
prop = RNA_def_property(srna, "bl_icon", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "typeinfo->ui_icon");
- RNA_def_property_enum_items(prop, rna_enum_node_icon_items);
+ RNA_def_property_enum_items(prop, rna_enum_icon_items);
RNA_def_property_enum_default(prop, ICON_NODE);
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
RNA_def_property_ui_text(prop, "Icon", "The node icon");
@@ -8414,7 +8401,7 @@ static void rna_def_nodetree(BlenderRNA *brna)
prop = RNA_def_property(srna, "bl_icon", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "typeinfo->ui_icon");
- RNA_def_property_enum_items(prop, rna_enum_node_icon_items);
+ RNA_def_property_enum_items(prop, rna_enum_icon_items);
RNA_def_property_enum_default(prop, ICON_NODETREE);
RNA_def_property_flag(prop, PROP_REGISTER);
RNA_def_property_ui_text(prop, "Icon", "The node tree icon");
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index dc0e1b23098..b7a2b16a15f 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -110,11 +110,18 @@ const EnumPropertyItem rna_enum_object_empty_drawtype_items[] = {
{0, NULL, 0, NULL, NULL}
};
+const EnumPropertyItem rna_enum_object_empty_image_depth_items[] = {
+ {OB_EMPTY_IMAGE_DEPTH_DEFAULT, "DEFAULT", 0, "Default", ""},
+ {OB_EMPTY_IMAGE_DEPTH_FRONT, "FRONT", 0, "Front", ""},
+ {OB_EMPTY_IMAGE_DEPTH_BACK, "BACK", 0, "Back", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
const EnumPropertyItem rna_enum_object_gpencil_type_items[] = {
- { GP_EMPTY, "EMPTY", ICON_OUTLINER_OB_GREASEPENCIL, "Blank", "Create an empty grease pencil object" },
- { GP_STROKE, "STROKE", ICON_OUTLINER_OB_CURVE, "Stroke", "Create a simple stroke with basic colors" },
- { GP_MONKEY, "MONKEY", ICON_MONKEY, "Monkey", "Construct a Suzanne grease pencil object" },
- { 0, NULL, 0, NULL, NULL }
+ {GP_EMPTY, "EMPTY", ICON_GP_EMPTY, "Blank", "Create an empty grease pencil object"},
+ {GP_STROKE, "STROKE", ICON_GP_STROKE, "Stroke", "Create a simple stroke with basic colors"},
+ {GP_MONKEY, "MONKEY", ICON_MONKEY, "Monkey", "Construct a Suzanne grease pencil object"},
+ {0, NULL, 0, NULL, NULL }
};
static const EnumPropertyItem parent_type_items[] = {
@@ -374,8 +381,8 @@ static void rna_Object_data_set(PointerRNA *ptr, PointerRNA value)
return;
}
- BLI_assert(BKE_id_is_in_gobal_main(&ob->id));
- BLI_assert(BKE_id_is_in_gobal_main(id));
+ BLI_assert(BKE_id_is_in_global_main(&ob->id));
+ BLI_assert(BKE_id_is_in_global_main(id));
if (ob->type == OB_EMPTY) {
if (ob->data) {
@@ -482,7 +489,7 @@ static const EnumPropertyItem *rna_Object_parent_type_itemf(bContext *UNUSED(C),
RNA_enum_items_add_value(&item, &totitem, &parent_type_items[2], PARSKEL);
}
else if (par->type == OB_ARMATURE) {
- /* special hack: prevents this being overrided */
+ /* special hack: prevents this being overridden */
RNA_enum_items_add_value(&item, &totitem, &parent_type_items[1], PARSKEL);
RNA_enum_items_add_value(&item, &totitem, parent_type_items, PARBONE);
}
@@ -499,7 +506,7 @@ static const EnumPropertyItem *rna_Object_parent_type_itemf(bContext *UNUSED(C),
return item;
}
-static void rna_Object_empty_draw_type_set(PointerRNA *ptr, int value)
+static void rna_Object_empty_display_type_set(PointerRNA *ptr, int value)
{
Object *ob = (Object *)ptr->data;
@@ -804,8 +811,8 @@ static void rna_Object_active_material_set(PointerRNA *ptr, PointerRNA value)
Object *ob = (Object *)ptr->id.data;
DEG_id_tag_update(value.data, 0);
- BLI_assert(BKE_id_is_in_gobal_main(&ob->id));
- BLI_assert(BKE_id_is_in_gobal_main(value.data));
+ BLI_assert(BKE_id_is_in_global_main(&ob->id));
+ BLI_assert(BKE_id_is_in_global_main(value.data));
assign_material(G_MAIN, ob, value.data, ob->actcol, BKE_MAT_ASSIGN_EXISTING);
}
@@ -998,8 +1005,8 @@ static void rna_MaterialSlot_material_set(PointerRNA *ptr, PointerRNA value)
Object *ob = (Object *)ptr->id.data;
int index = (Material **)ptr->data - ob->mat;
- BLI_assert(BKE_id_is_in_gobal_main(&ob->id));
- BLI_assert(BKE_id_is_in_gobal_main(value.data));
+ BLI_assert(BKE_id_is_in_global_main(&ob->id));
+ BLI_assert(BKE_id_is_in_global_main(value.data));
assign_material(G_MAIN, ob, value.data, index + 1, BKE_MAT_ASSIGN_EXISTING);
}
@@ -2091,20 +2098,20 @@ static void rna_def_object(BlenderRNA *brna)
};
static const EnumPropertyItem drawtype_items[] = {
- {OB_BOUNDBOX, "BOUNDS", 0, "Bounds", "Draw the bounds of the object"},
- {OB_WIRE, "WIRE", 0, "Wire", "Draw the object as a wireframe"},
- {OB_SOLID, "SOLID", 0, "Solid", "Draw the object as a solid (if solid drawing is enabled in the viewport)"},
+ {OB_BOUNDBOX, "BOUNDS", 0, "Bounds", "Display the bounds of the object"},
+ {OB_WIRE, "WIRE", 0, "Wire", "Display the object as a wireframe"},
+ {OB_SOLID, "SOLID", 0, "Solid", "Display the object as a solid (if solid drawing is enabled in the viewport)"},
{OB_TEXTURE, "TEXTURED", 0, "Textured",
- "Draw the object with textures (if textures are enabled in the viewport)"},
+ "Display the object with textures (if textures are enabled in the viewport)"},
{0, NULL, 0, NULL, NULL}
};
static const EnumPropertyItem boundtype_items[] = {
- {OB_BOUND_BOX, "BOX", 0, "Box", "Draw bounds as box"},
- {OB_BOUND_SPHERE, "SPHERE", 0, "Sphere", "Draw bounds as sphere"},
- {OB_BOUND_CYLINDER, "CYLINDER", 0, "Cylinder", "Draw bounds as cylinder"},
- {OB_BOUND_CONE, "CONE", 0, "Cone", "Draw bounds as cone"},
- {OB_BOUND_CAPSULE, "CAPSULE", 0, "Capsule", "Draw bounds as capsule"},
+ {OB_BOUND_BOX, "BOX", 0, "Box", "Display bounds as box"},
+ {OB_BOUND_SPHERE, "SPHERE", 0, "Sphere", "Display bounds as sphere"},
+ {OB_BOUND_CYLINDER, "CYLINDER", 0, "Cylinder", "Display bounds as cylinder"},
+ {OB_BOUND_CONE, "CONE", 0, "Cone", "Display bounds as cone"},
+ {OB_BOUND_CAPSULE, "CAPSULE", 0, "Capsule", "Display bounds as capsule"},
{0, NULL, 0, NULL, NULL}
};
@@ -2154,12 +2161,6 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Mode", "Object interaction mode");
- prop = RNA_def_property(srna, "layers_local_view", PROP_BOOLEAN, PROP_LAYER_MEMBER);
- RNA_def_property_boolean_sdna(prop, NULL, "lay", 0x01000000);
- RNA_def_property_array(prop, 8);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Local View Layers", "3D local view layers the object is on");
-
/* for data access */
prop = RNA_def_property(srna, "bound_box", PROP_FLOAT, PROP_NONE);
RNA_def_property_multi_array(prop, 2, boundbox_dimsize);
@@ -2468,14 +2469,14 @@ static void rna_def_object(BlenderRNA *brna)
rna_def_object_face_maps(brna, prop);
/* empty */
- prop = RNA_def_property(srna, "empty_draw_type", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "empty_display_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "empty_drawtype");
RNA_def_property_enum_items(prop, rna_enum_object_empty_drawtype_items);
- RNA_def_property_enum_funcs(prop, NULL, "rna_Object_empty_draw_type_set", NULL);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_Object_empty_display_type_set", NULL);
RNA_def_property_ui_text(prop, "Empty Display Type", "Viewport display style for empties");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
- prop = RNA_def_property(srna, "empty_draw_size", PROP_FLOAT, PROP_DISTANCE);
+ prop = RNA_def_property(srna, "empty_display_size", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "empty_drawsize");
RNA_def_property_range(prop, 0.0001f, 1000.0f);
RNA_def_property_ui_range(prop, 0.01, 100, 1, 2);
@@ -2495,6 +2496,21 @@ static void rna_def_object(BlenderRNA *brna)
"Parameters defining which layer, pass and frame of the image is displayed");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
+ prop = RNA_def_property(srna, "empty_image_depth", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, rna_enum_object_empty_image_depth_items);
+ RNA_def_property_ui_text(prop, "Empty Image Depth", "Determine which other objects will occlude the image");
+ RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
+
+ prop = RNA_def_property(srna, "show_empty_image_perspective", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "empty_image_visibility_flag", OB_EMPTY_IMAGE_VISIBLE_PERSPECTIVE);
+ RNA_def_property_ui_text(prop, "Display in Perspective Mode", "Display image in perspective mode");
+ RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
+
+ prop = RNA_def_property(srna, "show_empty_image_orthographic", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "empty_image_visibility_flag", OB_EMPTY_IMAGE_VISIBLE_ORTHOGRAPHIC);
+ RNA_def_property_ui_text(prop, "Display in Orthographic Mode", "Display image in orthographic mode");
+ RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
+
/* render */
prop = RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "index");
@@ -2547,21 +2563,21 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", OB_RESTRICT_VIEW);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
RNA_def_property_ui_text(prop, "Disable View", "Disable object in the viewport");
- RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, -1);
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_hide_update");
prop = RNA_def_property(srna, "hide_select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", OB_RESTRICT_SELECT);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
RNA_def_property_ui_text(prop, "Disable Select", "Disable object selection in the viewport");
- RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, 1);
- RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, -1);
+ RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_hide_update");
prop = RNA_def_property(srna, "hide_render", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", OB_RESTRICT_RENDER);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
RNA_def_property_ui_text(prop, "Disable Render", "Disable object in renders");
- RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, -1);
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_hide_update");
prop = RNA_def_property(srna, "show_duplicator_for_render", PROP_BOOLEAN, PROP_NONE);
@@ -2662,58 +2678,58 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
/* drawing */
- prop = RNA_def_property(srna, "draw_type", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "display_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "dt");
RNA_def_property_enum_items(prop, drawtype_items);
- RNA_def_property_ui_text(prop, "Maximum Draw Type", "Maximum draw type to display object with in viewport");
+ RNA_def_property_ui_text(prop, "Display As", "How to display object in viewport");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update");
prop = RNA_def_property(srna, "show_bounds", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_DRAWBOUNDOX);
- RNA_def_property_ui_text(prop, "Draw Bounds", "Display the object's bounds");
+ RNA_def_property_ui_text(prop, "Display Bounds", "Display the object's bounds");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
- prop = RNA_def_property(srna, "draw_bounds_type", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "display_bounds_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "boundtype");
RNA_def_property_enum_items(prop, boundtype_items);
- RNA_def_property_ui_text(prop, "Draw Bounds Type", "Object boundary display type");
+ RNA_def_property_ui_text(prop, "Display Bounds Type", "Object boundary display type");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
prop = RNA_def_property(srna, "show_name", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_DRAWNAME);
- RNA_def_property_ui_text(prop, "Draw Name", "Display the object's name");
+ RNA_def_property_ui_text(prop, "Display Name", "Display the object's name");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
prop = RNA_def_property(srna, "show_axis", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_AXIS);
- RNA_def_property_ui_text(prop, "Draw Axes", "Display the object's origin and axes");
+ RNA_def_property_ui_text(prop, "Display Axes", "Display the object's origin and axes");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
prop = RNA_def_property(srna, "show_texture_space", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_TEXSPACE);
- RNA_def_property_ui_text(prop, "Draw Texture Space", "Display the object's texture space");
+ RNA_def_property_ui_text(prop, "Display Texture Space", "Display the object's texture space");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
prop = RNA_def_property(srna, "show_wire", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_DRAWWIRE);
- RNA_def_property_ui_text(prop, "Draw Wire", "Add the object's wireframe over solid drawing");
+ RNA_def_property_ui_text(prop, "Display Wire", "Add the object's wireframe over solid drawing");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
prop = RNA_def_property(srna, "show_all_edges", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_DRAW_ALL_EDGES);
- RNA_def_property_ui_text(prop, "Draw All Edges", "Display all edges for mesh objects");
+ RNA_def_property_ui_text(prop, "Display All Edges", "Display all edges for mesh objects");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
prop = RNA_def_property(srna, "show_transparent", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_DRAWTRANSP);
- RNA_def_property_ui_text(prop, "Draw Transparent",
- "Display material transparency in the object (unsupported for duplicator drawing)");
+ RNA_def_property_ui_text(prop, "Display Transparent",
+ "Display material transparency in the object");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
- prop = RNA_def_property(srna, "show_x_ray", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "show_in_front", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_DRAWXRAY);
- RNA_def_property_ui_text(prop, "X-Ray",
- "Make the object draw in front of others (unsupported for duplicator drawing)");
+ RNA_def_property_ui_text(prop, "In Front",
+ "Make the object draw in front of others");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
/* Grease Pencil */
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c
index 3adf9f790d9..17233b100c8 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -52,7 +52,7 @@
static const EnumPropertyItem space_items[] = {
{CONSTRAINT_SPACE_WORLD, "WORLD", 0, "World Space",
- "The most gobal space in Blender"},
+ "The most global space in Blender"},
{CONSTRAINT_SPACE_POSE, "POSE", 0, "Pose Space",
"The pose space of a bone (its armature's object space)"},
{CONSTRAINT_SPACE_PARLOCAL, "LOCAL_WITH_PARENT", 0, "Local With Parent",
@@ -92,9 +92,13 @@ static const EnumPropertyItem space_items[] = {
#include "MEM_guardedalloc.h"
-static void rna_Object_select_set(Object *ob, bContext *C, ReportList *reports, int action)
+static void rna_Object_select_set(
+ Object *ob, bContext *C, ReportList *reports,
+ bool select, ViewLayer *view_layer)
{
- ViewLayer *view_layer = CTX_data_view_layer(C);
+ if (view_layer == NULL) {
+ view_layer = CTX_data_view_layer(C);
+ }
Base *base = BKE_view_layer_base_find(view_layer, ob);
if (!base) {
@@ -102,24 +106,16 @@ static void rna_Object_select_set(Object *ob, bContext *C, ReportList *reports,
return;
}
- if (action == 2) { /* TOGGLE */
- if ((base->flag & BASE_SELECTED) != 0) {
- action = 1; /* DESELECT */
- }
- else {
- action = 0; /* SELECT */
- }
+ if (select) {
+ BKE_view_layer_base_select(base);
}
-
- switch (action) {
- case 1: /* DESELECT */
- base->flag &= ~BASE_SELECTED;
- break;
- case 0: /* SELECT */
- default:
- BKE_view_layer_base_select(view_layer, base);
- break;
+ else {
+ base->flag &= ~BASE_SELECTED;
}
+
+ Scene *scene = CTX_data_scene(C);
+ DEG_id_tag_update(&scene->id, DEG_TAG_SELECT_UPDATE);
+ WM_main_add_notifier(NC_SCENE | ND_OB_SELECT, scene);
}
static bool rna_Object_select_get(Object *ob, bContext *C, ReportList *reports)
@@ -224,11 +220,11 @@ static void rna_Object_camera_fit_coords(
/* settings: 0 - preview, 1 - render */
static Mesh *rna_Object_to_mesh(
Object *ob, bContext *C, ReportList *reports, Depsgraph *depsgraph,
- bool apply_modifiers, bool calc_tessface, bool calc_undeformed)
+ bool apply_modifiers, bool calc_undeformed)
{
Main *bmain = CTX_data_main(C);
- return rna_Main_meshes_new_from_object(bmain, reports, depsgraph, ob, apply_modifiers, calc_tessface, calc_undeformed);
+ return rna_Main_meshes_new_from_object(bmain, reports, depsgraph, ob, apply_modifiers, calc_undeformed);
}
static PointerRNA rna_Object_shape_key_add(Object *ob, bContext *C, ReportList *reports,
@@ -492,19 +488,13 @@ void RNA_api_object(StructRNA *srna)
};
#endif
- static EnumPropertyItem object_select_items[] = {
- {0, "SELECT", 0, "Select", "Select object from the active view layer"},
- {1, "DESELECT", 0, "Deselect", "Deselect object from the active view layer"},
- {2, "TOGGLE", 0, "Toggle", "Toggle object selection from the active view layer"},
- {0, NULL, 0, NULL, NULL}
- };
-
/* Special wrapper to access the base selection value */
func = RNA_def_function(srna, "select_set", "rna_Object_select_set");
RNA_def_function_ui_description(func, "Select the object (for the active view layer)");
RNA_def_function_flag(func, FUNC_USE_CONTEXT | FUNC_USE_REPORTS);
- parm = RNA_def_enum(func, "action", object_select_items, 0, "Action", "Select mode");
+ parm = RNA_def_boolean(func, "state", 0, "", "Selection state to define");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+ parm = RNA_def_pointer(func, "view_layer", "ViewLayer", "", "Operate on this view layer instead of the context");
func = RNA_def_function(srna, "select_get", "rna_Object_select_get");
RNA_def_function_ui_description(func, "Get the object selection for the active view layer");
@@ -521,7 +511,7 @@ void RNA_api_object(StructRNA *srna)
func = RNA_def_function(srna, "holdout_get", "rna_Object_holdout_get");
RNA_def_function_ui_description(func, "Test if object is masked in the view layer");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- parm = RNA_def_pointer(func, "view_layer", "ViewLayer", "", "");
+ parm = RNA_def_pointer(func, "view_layer", "ViewLayer", "", "View layer to check against");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
parm = RNA_def_boolean(func, "result", 0, "", "Object holdout");
RNA_def_function_return(func, parm);
@@ -529,7 +519,7 @@ void RNA_api_object(StructRNA *srna)
func = RNA_def_function(srna, "indirect_only_get", "rna_Object_indirect_only_get");
RNA_def_function_ui_description(func, "Test if object is set to contribute only indirectly (through shadows and reflections) in the view layer");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- parm = RNA_def_pointer(func, "view_layer", "ViewLayer", "", "");
+ parm = RNA_def_pointer(func, "view_layer", "ViewLayer", "", "View layer to check against");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
parm = RNA_def_boolean(func, "result", 0, "", "Object indirect only");
RNA_def_function_return(func, parm);
@@ -557,8 +547,7 @@ void RNA_api_object(StructRNA *srna)
func = RNA_def_function(srna, "calc_matrix_camera", "rna_Object_calc_matrix_camera");
RNA_def_function_ui_description(func, "Generate the camera projection matrix of this object "
"(mostly useful for Camera and Light types)");
- parm = RNA_def_pointer(func, "depsgraph", "Depsgraph", "",
- "Depsgraph to get evaluated data from");
+ parm = RNA_def_pointer(func, "depsgraph", "Depsgraph", "", "Depsgraph to get evaluated data from");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
parm = RNA_def_property(func, "result", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_multi_array(parm, 2, rna_matrix_dimsize_4x4);
@@ -567,13 +556,12 @@ void RNA_api_object(StructRNA *srna)
parm = RNA_def_int(func, "x", 1, 0, INT_MAX, "", "Width of the render area", 0, 10000);
parm = RNA_def_int(func, "y", 1, 0, INT_MAX, "", "Height of the render area", 0, 10000);
parm = RNA_def_float(func, "scale_x", 1.0f, 1.0e-6f, FLT_MAX, "", "Width scaling factor", 1.0e-2f, 100.0f);
- parm = RNA_def_float(func, "scale_y", 1.0f, 1.0e-6f, FLT_MAX, "", "height scaling factor", 1.0e-2f, 100.0f);
+ parm = RNA_def_float(func, "scale_y", 1.0f, 1.0e-6f, FLT_MAX, "", "Height scaling factor", 1.0e-2f, 100.0f);
func = RNA_def_function(srna, "camera_fit_coords", "rna_Object_camera_fit_coords");
RNA_def_function_ui_description(func, "Compute the coordinate (and scale for ortho cameras) "
"given object should be to 'see' all given coordinates");
- parm = RNA_def_pointer(func, "depsgraph", "Depsgraph", "",
- "Depsgraph to get evaluated data from");
+ parm = RNA_def_pointer(func, "depsgraph", "Depsgraph", "", "Depsgraph to get evaluated data from");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
parm = RNA_def_float_array(func, "coordinates", 1, NULL, -FLT_MAX, FLT_MAX, "", "Coordinates to fit in",
-FLT_MAX, FLT_MAX);
@@ -590,11 +578,10 @@ void RNA_api_object(StructRNA *srna)
func = RNA_def_function(srna, "to_mesh", "rna_Object_to_mesh");
RNA_def_function_ui_description(func, "Create a Mesh data-block with modifiers applied");
RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_CONTEXT);
- parm = RNA_def_pointer(func, "depsgraph", "Depsgraph", "Dependency Graph", "Evaluated dependency graph within wich to evaluate modifiers");
+ parm = RNA_def_pointer(func, "depsgraph", "Depsgraph", "Dependency Graph", "Evaluated dependency graph within which to evaluate modifiers");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
parm = RNA_def_boolean(func, "apply_modifiers", 0, "", "Apply modifiers");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
- RNA_def_boolean(func, "calc_tessface", true, "Calculate Tessellation", "Calculate tessellation faces");
RNA_def_boolean(func, "calc_undeformed", false, "Calculate Undeformed", "Calculate undeformed vertex coordinates");
parm = RNA_def_pointer(func, "mesh", "Mesh", "",
"Mesh created from object, remove it if it is only used for export");
@@ -623,21 +610,25 @@ void RNA_api_object(StructRNA *srna)
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
+
+
/* Ray Cast */
func = RNA_def_function(srna, "ray_cast", "rna_Object_ray_cast");
RNA_def_function_ui_description(func, "Cast a ray onto in object space");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
/* ray start and end */
- parm = RNA_def_float_vector(func, "origin", 3, NULL, -FLT_MAX, FLT_MAX, "", "", -1e4, 1e4);
+ parm = RNA_def_float_vector(func, "origin", 3, NULL, -FLT_MAX, FLT_MAX,
+ "", "Origin of the ray, in object space", -1e4, 1e4);
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
- parm = RNA_def_float_vector(func, "direction", 3, NULL, -FLT_MAX, FLT_MAX, "", "", -1e4, 1e4);
+ parm = RNA_def_float_vector(func, "direction", 3, NULL, -FLT_MAX, FLT_MAX,
+ "", "Direction of the ray, in object space", -1e4, 1e4);
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
RNA_def_float(func, "distance", BVH_RAYCAST_DIST_MAX, 0.0, BVH_RAYCAST_DIST_MAX,
"", "Maximum distance", 0.0, BVH_RAYCAST_DIST_MAX);
/* return location and normal */
- parm = RNA_def_boolean(func, "result", 0, "", "");
+ parm = RNA_def_boolean(func, "result", 0, "", "Wheter the ray successfully hit the geometry");
RNA_def_function_output(func, parm);
parm = RNA_def_float_vector(func, "location", 3, NULL, -FLT_MAX, FLT_MAX, "Location",
"The hit location of this ray cast", -1e4, 1e4);
@@ -650,19 +641,22 @@ void RNA_api_object(StructRNA *srna)
parm = RNA_def_int(func, "index", 0, 0, 0, "", "The face index, -1 when original data isn't available", 0, 0);
RNA_def_function_output(func, parm);
+
+
/* Nearest Point */
func = RNA_def_function(srna, "closest_point_on_mesh", "rna_Object_closest_point_on_mesh");
RNA_def_function_ui_description(func, "Find the nearest point in object space");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
/* location of point for test and max distance */
- parm = RNA_def_float_vector(func, "origin", 3, NULL, -FLT_MAX, FLT_MAX, "", "", -1e4, 1e4);
+ parm = RNA_def_float_vector(func, "origin", 3, NULL, -FLT_MAX, FLT_MAX,
+ "", "Point to find closest geometry from (in object space)", -1e4, 1e4);
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
/* default is sqrt(FLT_MAX) */
RNA_def_float(func, "distance", 1.844674352395373e+19, 0.0, FLT_MAX, "", "Maximum distance", 0.0, FLT_MAX);
/* return location and normal */
- parm = RNA_def_boolean(func, "result", 0, "", "");
+ parm = RNA_def_boolean(func, "result", 0, "", "Wheter closest point on geometry was found");
RNA_def_function_output(func, parm);
parm = RNA_def_float_vector(func, "location", 3, NULL, -FLT_MAX, FLT_MAX, "Location",
"The location on the object closest to the point", -1e4, 1e4);
@@ -676,36 +670,38 @@ void RNA_api_object(StructRNA *srna)
parm = RNA_def_int(func, "index", 0, 0, 0, "", "The face index, -1 when original data isn't available", 0, 0);
RNA_def_function_output(func, parm);
+
+
/* View */
/* utility function for checking if the object is modified */
func = RNA_def_function(srna, "is_modified", "rna_Object_is_modified");
RNA_def_function_ui_description(func, "Determine if this object is modified from the base mesh data");
- parm = RNA_def_pointer(func, "scene", "Scene", "", "");
+ parm = RNA_def_pointer(func, "scene", "Scene", "", "Scene in which to check the object");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
parm = RNA_def_enum(func, "settings", mesh_type_items, 0, "", "Modifier settings to apply");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
- parm = RNA_def_boolean(func, "result", 0, "", "Object visibility");
+ parm = RNA_def_boolean(func, "result", 0, "", "Whether the object is modified");
RNA_def_function_return(func, parm);
func = RNA_def_function(srna, "is_deform_modified", "rna_Object_is_deform_modified");
RNA_def_function_ui_description(func, "Determine if this object is modified by a deformation from the base mesh data");
- parm = RNA_def_pointer(func, "scene", "Scene", "", "");
+ parm = RNA_def_pointer(func, "scene", "Scene", "", "Scene in which to check the object");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
parm = RNA_def_enum(func, "settings", mesh_type_items, 0, "", "Modifier settings to apply");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
- parm = RNA_def_boolean(func, "result", 0, "", "Object visibility");
+ parm = RNA_def_boolean(func, "result", 0, "", "Whether the object is deform-modified");
RNA_def_function_return(func, parm);
#ifndef NDEBUG
/* mesh */
func = RNA_def_function(srna, "dm_info", "rna_Object_me_eval_info");
- RNA_def_function_ui_description(func, "Returns a string for derived mesh data");
+ RNA_def_function_ui_description(func, "Returns a string for derived mesh data (debug builds only)");
parm = RNA_def_enum(func, "type", mesh_dm_info_items, 0, "", "Modifier settings to apply");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
/* weak!, no way to return dynamic string type */
- parm = RNA_def_string(func, "result", NULL, 16384, "result", "");
+ parm = RNA_def_string(func, "result", NULL, 16384, "", "Requested informations");
RNA_def_parameter_flags(parm, PROP_THICK_WRAP, 0); /* needed for string return value */
RNA_def_function_output(func, parm);
#endif /* NDEBUG */
diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c
index 97f1985b48b..e1090a3ded5 100644
--- a/source/blender/makesrna/intern/rna_object_force.c
+++ b/source/blender/makesrna/intern/rna_object_force.c
@@ -42,10 +42,11 @@
#include "WM_types.h"
static const EnumPropertyItem effector_shape_items[] = {
- {PFIELD_SHAPE_POINT, "POINT", 0, "Point", ""},
- {PFIELD_SHAPE_PLANE, "PLANE", 0, "Plane", ""},
- {PFIELD_SHAPE_SURFACE, "SURFACE", 0, "Surface", ""},
- {PFIELD_SHAPE_POINTS, "POINTS", 0, "Every Point", ""},
+ {PFIELD_SHAPE_POINT, "POINT", 0, "Point", "Field originates from the object center"},
+ {PFIELD_SHAPE_LINE, "LINE", 0, "Line", "Field originates from the local Z axis of the object"},
+ {PFIELD_SHAPE_PLANE, "PLANE", 0, "Plane", "Field originates from the local XY plane of the object"},
+ {PFIELD_SHAPE_SURFACE, "SURFACE", 0, "Surface", "Field originates from the surface of the object"},
+ {PFIELD_SHAPE_POINTS, "POINTS", 0, "Every Point", "Field originates from all of the vertices of the object"},
{0, NULL, 0, NULL, NULL}
};
@@ -56,15 +57,17 @@ static const EnumPropertyItem effector_shape_items[] = {
/* type specific return values only used from functions */
static const EnumPropertyItem curve_shape_items[] = {
- {PFIELD_SHAPE_POINT, "POINT", 0, "Point", ""},
- {PFIELD_SHAPE_PLANE, "PLANE", 0, "Plane", ""},
- {PFIELD_SHAPE_SURFACE, "SURFACE", 0, "Curve", ""},
+ {PFIELD_SHAPE_POINT, "POINT", 0, "Point", "Field originates from the object center"},
+ {PFIELD_SHAPE_LINE, "LINE", 0, "Line", "Field originates from the local Z axis of the object"},
+ {PFIELD_SHAPE_PLANE, "PLANE", 0, "Plane", "Field originates from the local XY plane of the object"},
+ {PFIELD_SHAPE_SURFACE, "SURFACE", 0, "Curve", "Field originates from the curve itself"},
{0, NULL, 0, NULL, NULL}
};
static const EnumPropertyItem empty_shape_items[] = {
- {PFIELD_SHAPE_POINT, "POINT", 0, "Point", ""},
- {PFIELD_SHAPE_PLANE, "PLANE", 0, "Plane", ""},
+ {PFIELD_SHAPE_POINT, "POINT", 0, "Point", "Field originates from the object center"},
+ {PFIELD_SHAPE_LINE, "LINE", 0, "Line", "Field originates from the local Z axis of the object"},
+ {PFIELD_SHAPE_PLANE, "PLANE", 0, "Plane", "Field originates from the local XY plane of the object"},
{0, NULL, 0, NULL, NULL}
};
@@ -860,7 +863,7 @@ static void rna_def_pointcache_active(BlenderRNA *brna)
/* This first-level RNA pointer also has list of all caches from owning ID.
* Those caches items have exact same content as 'active' one, except for that collection,
* to prevent ugly recursive layout pattern.
- * Note: This shall probably be redone from scratch in a proper way at some poitn, but for now that will do,
+ * Note: This shall probably be redone from scratch in a proper way at some point, but for now that will do,
* and shall not break anything in the API. */
prop = RNA_def_property(srna, "point_caches", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_funcs(prop, "rna_Cache_list_begin", "rna_iterator_listbase_next",
@@ -955,6 +958,22 @@ static void rna_def_collision(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Absorption",
"How much of effector force gets lost during collision with this object (in percent)");
RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
+
+ prop = RNA_def_property(srna, "cloth_friction", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "pdef_cfrict");
+ RNA_def_property_range(prop, 0.0f, 80.0f);
+ RNA_def_property_ui_text(prop, "Friction", "Friction for cloth collisions");
+ RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
+
+ prop = RNA_def_property(srna, "use_culling", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_CLOTH_USE_CULLING);
+ RNA_def_property_ui_text(prop, "Single Sided", "Cloth collision acts with respect to the collider normals (improves penetration recovery)");
+ RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
+
+ prop = RNA_def_property(srna, "use_normal", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_CLOTH_USE_NORMAL);
+ RNA_def_property_ui_text(prop, "Override Normals", "Cloth collision impulses act in the direction of the collider normals (more reliable in some cases)");
+ RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
}
static void rna_def_effector_weight(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c
index 979e5d433e7..1abba3979f0 100644
--- a/source/blender/makesrna/intern/rna_particle.c
+++ b/source/blender/makesrna/intern/rna_particle.c
@@ -755,7 +755,7 @@ static void rna_Particle_hair_dynamics_update(Main *bmain, Scene *scene, Pointer
if (psys && !psys->clmd) {
psys->clmd = (ClothModifierData *)modifier_new(eModifierType_Cloth);
psys->clmd->sim_parms->goalspring = 0.0f;
- psys->clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_GOAL | CLOTH_SIMSETTINGS_FLAG_NO_SPRING_COMPRESS;
+ psys->clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESIST_SPRING_COMPRESS;
psys->clmd->coll_parms->flags &= ~CLOTH_COLLSETTINGS_FLAG_SELF;
rna_Particle_redo(bmain, scene, ptr);
}
@@ -1499,7 +1499,7 @@ static void rna_def_particle(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Keyed States", "");
/* */
/* float fuv[4], foffset; *//* coordinates on face/edge number "num" and depth along*/
-/* *//* face normal for volume emission */
+/* *//* face normal for volume emission */
prop = RNA_def_property(srna, "birth_time", PROP_FLOAT, PROP_TIME);
RNA_def_property_float_sdna(prop, NULL, "time");
@@ -2331,7 +2331,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_group_count", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_COUNT_GR);
- RNA_def_property_ui_text(prop, "Use Count", "Use object multiple times in the same collecton");
+ RNA_def_property_ui_text(prop, "Use Count", "Use object multiple times in the same collection");
RNA_def_property_update(prop, 0, "rna_Particle_redo_count");
prop = RNA_def_property(srna, "use_global_dupli", PROP_BOOLEAN, PROP_NONE);
@@ -2371,7 +2371,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Strand Render", "Use the strand primitive for rendering");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop = RNA_def_property(srna, "draw_method", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "display_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "draw_as");
RNA_def_property_enum_items(prop, part_draw_as_items);
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Particle_draw_as_itemf");
@@ -2385,13 +2385,14 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Particle Rendering", "How particles are rendered");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop = RNA_def_property(srna, "draw_color", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "display_color", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "draw_col");
RNA_def_property_enum_items(prop, draw_col_items);
RNA_def_property_ui_text(prop, "Draw Color", "Draw additional particle data as a color");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop = RNA_def_property(srna, "draw_size", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "display_size", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "draw_size");
RNA_def_property_range(prop, 0, 1000);
RNA_def_property_ui_range(prop, 0, 100, 1, -1);
RNA_def_property_ui_text(prop, "Draw Size", "Size of particles on viewport in BU");
@@ -2403,7 +2404,8 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Children From", "Create child particles");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
- prop = RNA_def_property(srna, "draw_step", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "display_step", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "draw_step");
RNA_def_property_range(prop, 0, 10);
RNA_def_property_ui_range(prop, 0, 7, 1, -1);
RNA_def_property_ui_text(prop, "Steps", "How many steps paths are drawn with (power of 2)");
@@ -2443,7 +2445,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 50);
RNA_def_property_ui_text(prop, "Pixel", "How many pixels path has to cover to make another render segment");
- prop = RNA_def_property(srna, "draw_percentage", PROP_INT, PROP_PERCENTAGE);
+ prop = RNA_def_property(srna, "display_percentage", PROP_INT, PROP_PERCENTAGE);
RNA_def_property_int_sdna(prop, NULL, "disp");
RNA_def_property_range(prop, 0, 100);
RNA_def_property_ui_text(prop, "Display", "Percentage of particles to display in 3D view");
diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c
index 322f5a02f57..4b6a19ab063 100644
--- a/source/blender/makesrna/intern/rna_pose.c
+++ b/source/blender/makesrna/intern/rna_pose.c
@@ -68,26 +68,26 @@ const EnumPropertyItem rna_enum_posebone_rotmode_items[] = {
/* Bone and Group Color Sets */
const EnumPropertyItem rna_enum_color_sets_items[] = {
{0, "DEFAULT", 0, "Default Colors", ""},
- {1, "THEME01", VICO_COLORSET_01_VEC, "01 - Theme Color Set", ""},
- {2, "THEME02", VICO_COLORSET_02_VEC, "02 - Theme Color Set", ""},
- {3, "THEME03", VICO_COLORSET_03_VEC, "03 - Theme Color Set", ""},
- {4, "THEME04", VICO_COLORSET_04_VEC, "04 - Theme Color Set", ""},
- {5, "THEME05", VICO_COLORSET_05_VEC, "05 - Theme Color Set", ""},
- {6, "THEME06", VICO_COLORSET_06_VEC, "06 - Theme Color Set", ""},
- {7, "THEME07", VICO_COLORSET_07_VEC, "07 - Theme Color Set", ""},
- {8, "THEME08", VICO_COLORSET_08_VEC, "08 - Theme Color Set", ""},
- {9, "THEME09", VICO_COLORSET_09_VEC, "09 - Theme Color Set", ""},
- {10, "THEME10", VICO_COLORSET_10_VEC, "10 - Theme Color Set", ""},
- {11, "THEME11", VICO_COLORSET_11_VEC, "11 - Theme Color Set", ""},
- {12, "THEME12", VICO_COLORSET_12_VEC, "12 - Theme Color Set", ""},
- {13, "THEME13", VICO_COLORSET_13_VEC, "13 - Theme Color Set", ""},
- {14, "THEME14", VICO_COLORSET_14_VEC, "14 - Theme Color Set", ""},
- {15, "THEME15", VICO_COLORSET_15_VEC, "15 - Theme Color Set", ""},
- {16, "THEME16", VICO_COLORSET_16_VEC, "16 - Theme Color Set", ""},
- {17, "THEME17", VICO_COLORSET_17_VEC, "17 - Theme Color Set", ""},
- {18, "THEME18", VICO_COLORSET_18_VEC, "18 - Theme Color Set", ""},
- {19, "THEME19", VICO_COLORSET_19_VEC, "19 - Theme Color Set", ""},
- {20, "THEME20", VICO_COLORSET_20_VEC, "20 - Theme Color Set", ""},
+ {1, "THEME01", ICON_COLORSET_01_VEC, "01 - Theme Color Set", ""},
+ {2, "THEME02", ICON_COLORSET_02_VEC, "02 - Theme Color Set", ""},
+ {3, "THEME03", ICON_COLORSET_03_VEC, "03 - Theme Color Set", ""},
+ {4, "THEME04", ICON_COLORSET_04_VEC, "04 - Theme Color Set", ""},
+ {5, "THEME05", ICON_COLORSET_05_VEC, "05 - Theme Color Set", ""},
+ {6, "THEME06", ICON_COLORSET_06_VEC, "06 - Theme Color Set", ""},
+ {7, "THEME07", ICON_COLORSET_07_VEC, "07 - Theme Color Set", ""},
+ {8, "THEME08", ICON_COLORSET_08_VEC, "08 - Theme Color Set", ""},
+ {9, "THEME09", ICON_COLORSET_09_VEC, "09 - Theme Color Set", ""},
+ {10, "THEME10", ICON_COLORSET_10_VEC, "10 - Theme Color Set", ""},
+ {11, "THEME11", ICON_COLORSET_11_VEC, "11 - Theme Color Set", ""},
+ {12, "THEME12", ICON_COLORSET_12_VEC, "12 - Theme Color Set", ""},
+ {13, "THEME13", ICON_COLORSET_13_VEC, "13 - Theme Color Set", ""},
+ {14, "THEME14", ICON_COLORSET_14_VEC, "14 - Theme Color Set", ""},
+ {15, "THEME15", ICON_COLORSET_15_VEC, "15 - Theme Color Set", ""},
+ {16, "THEME16", ICON_COLORSET_16_VEC, "16 - Theme Color Set", ""},
+ {17, "THEME17", ICON_COLORSET_17_VEC, "17 - Theme Color Set", ""},
+ {18, "THEME18", ICON_COLORSET_18_VEC, "18 - Theme Color Set", ""},
+ {19, "THEME19", ICON_COLORSET_19_VEC, "19 - Theme Color Set", ""},
+ {20, "THEME20", ICON_COLORSET_20_VEC, "20 - Theme Color Set", ""},
{-1, "CUSTOM", 0, "Custom Color Set", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -300,8 +300,8 @@ static void rna_PoseChannel_name_set(PointerRNA *ptr, const char *value)
BLI_strncpy_utf8(newname, value, sizeof(pchan->name));
BLI_strncpy(oldname, pchan->name, sizeof(pchan->name));
- BLI_assert(BKE_id_is_in_gobal_main(&ob->id));
- BLI_assert(BKE_id_is_in_gobal_main(ob->data));
+ BLI_assert(BKE_id_is_in_global_main(&ob->id));
+ BLI_assert(BKE_id_is_in_global_main(ob->data));
ED_armature_bone_rename(G_MAIN, ob->data, oldname, newname);
}
@@ -743,6 +743,25 @@ static void rna_PoseChannel_matrix_set(PointerRNA *ptr, const float *values)
BKE_pchan_apply_mat4(pchan, tmat, false); /* no compat for predictable result */
}
+static bPoseChannel *rna_PoseChannel_ensure_own_pchan(Object *ob, Object *ref_ob, bPoseChannel *ref_pchan)
+{
+ if (ref_ob != ob) {
+ /* We are trying to set a pchan from another object! Forbidden, try to find by name, or abort. */
+ if (ref_pchan != NULL) {
+ ref_pchan = BKE_pose_channel_find_name(ob->pose, ref_pchan->name);
+ }
+ }
+ return ref_pchan;
+}
+
+static void rna_PoseChannel_custom_shape_transform_set(PointerRNA *ptr, PointerRNA value)
+{
+ bPoseChannel *pchan = (bPoseChannel *)ptr->data;
+ Object *ob = (Object *)ptr->id.data;
+
+ pchan->custom_tx = rna_PoseChannel_ensure_own_pchan(ob, value.id.data, value.data);
+}
+
#else
/* common properties for Action/Bone Groups - related to color */
@@ -965,46 +984,24 @@ static void rna_def_pose_channel(BlenderRNA *brna)
rna_def_bone_curved_common(srna, true);
/* Custom BBone next/prev sources */
- prop = RNA_def_property(srna, "use_bbone_custom_handles", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "bboneflag", PCHAN_BBONE_CUSTOM_HANDLES);
- RNA_def_property_ui_text(prop, "Use Custom Handle References",
- "Use custom reference bones as handles for B-Bones instead of next/previous bones, "
- "leave these blank to use only B-Bone offset properties to control the shape");
- RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
- RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_dependency_update");
-
prop = RNA_def_property(srna, "bbone_custom_handle_start", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "bbone_prev");
RNA_def_property_struct_type(prop, "PoseBone");
- RNA_def_property_flag(prop, PROP_EDITABLE | PROP_PTR_NO_OWNERSHIP);
+ RNA_def_property_flag(prop, PROP_PTR_NO_OWNERSHIP);
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_NO_COMPARISON);
RNA_def_property_ui_text(prop, "B-Bone Start Handle",
"Bone that serves as the start handle for the B-Bone curve");
- RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_dependency_update");
- prop = RNA_def_property(srna, "use_bbone_relative_start_handle", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "bboneflag", PCHAN_BBONE_CUSTOM_START_REL);
- RNA_def_property_ui_text(prop, "Relative B-Bone Start Handle",
- "Treat custom start handle position as a relative value");
- RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
- RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
-
prop = RNA_def_property(srna, "bbone_custom_handle_end", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "bbone_next");
RNA_def_property_struct_type(prop, "PoseBone");
- RNA_def_property_flag(prop, PROP_EDITABLE | PROP_PTR_NO_OWNERSHIP);
+ RNA_def_property_flag(prop, PROP_PTR_NO_OWNERSHIP);
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_NO_COMPARISON);
RNA_def_property_ui_text(prop, "B-Bone End Handle",
"Bone that serves as the end handle for the B-Bone curve");
- RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_dependency_update");
- prop = RNA_def_property(srna, "use_bbone_relative_end_handle", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "bboneflag", PCHAN_BBONE_CUSTOM_END_REL);
- RNA_def_property_ui_text(prop, "Relative B-Bone End Handle",
- "Treat custom end handle position as a relative value");
- RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
- RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
-
/* transform matrices - should be read-only since these are set directly by AnimSys evaluation */
prop = RNA_def_property(srna, "matrix_channel", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "chan_mat");
@@ -1209,10 +1206,12 @@ static void rna_def_pose_channel(BlenderRNA *brna)
prop = RNA_def_property(srna, "custom_shape_transform", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "custom_tx");
RNA_def_property_struct_type(prop, "PoseBone");
- RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_EDITABLE | PROP_PTR_NO_OWNERSHIP);
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
RNA_def_property_ui_text(prop, "Custom Shape Transform",
"Bone that defines the display transform of this custom shape");
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_PoseChannel_custom_shape_transform_set", NULL, NULL);
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
/* bone groups */
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index f45c888edf6..46b77b80d49 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -56,7 +56,7 @@ const EnumPropertyItem rna_enum_render_pass_type_items[] = {
{SCE_PASS_DIFFUSE, "DIFFUSE", 0, "Diffuse", ""},
{SCE_PASS_SPEC, "SPECULAR", 0, "Specular", ""},
{SCE_PASS_SHADOW, "SHADOW", 0, "Shadow", ""},
- {SCE_PASS_AO, "AO", 0, "AO", ""},
+ {SCE_PASS_AO, "AO", 0, "Ambient Occlusion", ""},
{SCE_PASS_REFLECT, "REFLECTION", 0, "Reflection", ""},
{SCE_PASS_NORMAL, "NORMAL", 0, "Normal", ""},
{SCE_PASS_VECTOR, "VECTOR", 0, "Vector", ""},
@@ -87,7 +87,7 @@ const EnumPropertyItem rna_enum_render_pass_type_items[] = {
const EnumPropertyItem rna_enum_bake_pass_type_items[] = {
{SCE_PASS_COMBINED, "COMBINED", 0, "Combined", ""},
- {SCE_PASS_AO, "AO", 0, "AO", ""},
+ {SCE_PASS_AO, "AO", 0, "Ambient Occlusion", ""},
{SCE_PASS_SHADOW, "SHADOW", 0, "Shadow", ""},
{SCE_PASS_NORMAL, "NORMAL", 0, "Normal", ""},
{SCE_PASS_UV, "UV", 0, "UV", ""},
@@ -685,6 +685,9 @@ static void rna_def_render_engine(BlenderRNA *brna)
parm = RNA_def_int(func, "pixel_size", 0, 1, 8, "Pixel Size", "", 1, 8);
RNA_def_function_return(func, parm);
+ RNA_def_function(srna, "free_blender_memory", "RE_engine_free_blender_memory");
+ RNA_def_function_ui_description(func, "Free Blender side memory of render engine");
+
RNA_define_verify_sdna(0);
prop = RNA_def_property(srna, "is_animation", PROP_BOOLEAN, PROP_NONE);
@@ -725,17 +728,17 @@ static void rna_def_render_engine(BlenderRNA *brna)
func = RNA_def_function(srna, "register_pass", "RE_engine_register_pass");
RNA_def_function_ui_description(func, "Register a render pass that will be part of the render with the current settings");
- prop = RNA_def_pointer(func, "scene", "Scene", "", "");
+ parm = RNA_def_pointer(func, "scene", "Scene", "", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
- prop = RNA_def_pointer(func, "view_layer", "ViewLayer", "", "");
+ parm = RNA_def_pointer(func, "view_layer", "ViewLayer", "", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
- prop = RNA_def_string(func, "name", NULL, MAX_NAME, "Name", "");
+ parm = RNA_def_string(func, "name", NULL, MAX_NAME, "Name", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
- prop = RNA_def_int(func, "channels", 1, 1, 8, "Channels", "", 1, 4);
+ parm = RNA_def_int(func, "channels", 1, 1, 8, "Channels", "", 1, 4);
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
- prop = RNA_def_string(func, "chanid", NULL, 8, "Channel IDs", "");
+ parm = RNA_def_string(func, "chanid", NULL, 8, "Channel IDs", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
- prop = RNA_def_enum(func, "type", render_pass_type_items, SOCK_FLOAT, "Type", "");
+ parm = RNA_def_enum(func, "type", render_pass_type_items, SOCK_FLOAT, "Type", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
/* registration */
@@ -807,7 +810,7 @@ static void rna_def_render_result(BlenderRNA *brna)
RNA_def_function_ui_description(func, "Add engine-specific stamp data to the result");
parm = RNA_def_string(func, "field", NULL, 1024, "Field", "Name of the stamp field to add");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
- parm = RNA_def_string(func, "value", NULL, 1024, "Value", "Value of the stamp data");
+ parm = RNA_def_string(func, "value", NULL, 0, "Value", "Value of the stamp data");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
RNA_define_verify_sdna(0);
diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c
index 866ea771b0f..cb2ef85d713 100644
--- a/source/blender/makesrna/intern/rna_rna.c
+++ b/source/blender/makesrna/intern/rna_rna.c
@@ -121,6 +121,7 @@ const EnumPropertyItem rna_enum_property_unit_items[] = {
{PROP_UNIT_TIME, "TIME", 0, "Time", ""},
{PROP_UNIT_VELOCITY, "VELOCITY", 0, "Velocity", ""},
{PROP_UNIT_ACCELERATION, "ACCELERATION", 0, "Acceleration", ""},
+ {PROP_UNIT_MASS, "MASS", 0, "Mass", ""},
{PROP_UNIT_CAMERA, "CAMERA", 0, "Camera", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -1332,7 +1333,7 @@ int rna_property_override_diff_default(
}
}
else {
- /* Already overriden prop, we'll have to check arrays items etc. */
+ /* Already overridden prop, we'll have to check arrays items etc. */
}
}
@@ -1390,7 +1391,7 @@ int rna_property_override_diff_default(
}
}
else {
- /* Already overriden prop, we'll have to check arrays items etc. */
+ /* Already overridden prop, we'll have to check arrays items etc. */
}
}
@@ -1449,7 +1450,7 @@ int rna_property_override_diff_default(
}
}
else {
- /* Already overriden prop, we'll have to check arrays items etc. */
+ /* Already overridden prop, we'll have to check arrays items etc. */
}
}
@@ -1787,7 +1788,7 @@ bool rna_property_override_store_default(
}
/* XXX TODO About range limits.
- * Ideally, it woudl be great to get rid of RNA range in that specific case.
+ * Ideally, it would be great to get rid of RNA range in that specific case.
* However, this won't be that easy and will add yet another layer of complexity in generated code,
* not to mention that we could most likely *not* bypass custom setters anyway.
* So for now, if needed second operand value is not in valid range, we simply fall back
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 84910b6b1b3..b9876d8595f 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -185,9 +185,9 @@ const EnumPropertyItem rna_enum_snap_element_items[] = {
const EnumPropertyItem rna_enum_snap_node_element_items[] = {
{SCE_SNAP_MODE_GRID, "GRID", ICON_SNAP_GRID, "Grid", "Snap to grid"},
- {SCE_SNAP_MODE_NODE_X, "NODE_X", ICON_SNAP_EDGE, "Node X", "Snap to left/right node border"},
- {SCE_SNAP_MODE_NODE_Y, "NODE_Y", ICON_SNAP_EDGE, "Node Y", "Snap to top/bottom node border"},
- {SCE_SNAP_MODE_NODE_X | SCE_SNAP_MODE_NODE_Y, "NODE_XY", ICON_SNAP_EDGE, "Node X / Y", "Snap to any node border"},
+ {SCE_SNAP_MODE_NODE_X, "NODE_X", ICON_NODE_SIDE, "Node X", "Snap to left/right node border"},
+ {SCE_SNAP_MODE_NODE_Y, "NODE_Y", ICON_NODE_TOP, "Node Y", "Snap to top/bottom node border"},
+ {SCE_SNAP_MODE_NODE_X | SCE_SNAP_MODE_NODE_Y, "NODE_XY", ICON_NODE_CORNER, "Node X / Y", "Snap to any node border"},
{0, NULL, 0, NULL, NULL}
};
@@ -410,7 +410,7 @@ const EnumPropertyItem rna_enum_stereo3d_interlace_type_items[] = {
const EnumPropertyItem rna_enum_bake_pass_filter_type_items[] = {
{R_BAKE_PASS_FILTER_NONE, "NONE", 0, "None", ""},
- {R_BAKE_PASS_FILTER_AO, "AO", 0, "AO", ""},
+ {R_BAKE_PASS_FILTER_AO, "AO", 0, "Ambient Occlusion", ""},
{R_BAKE_PASS_FILTER_EMIT, "EMIT", 0, "Emit", ""},
{R_BAKE_PASS_FILTER_DIRECT, "DIRECT", 0, "Direct", ""},
{R_BAKE_PASS_FILTER_INDIRECT, "INDIRECT", 0, "Indirect", ""},
@@ -423,9 +423,9 @@ const EnumPropertyItem rna_enum_bake_pass_filter_type_items[] = {
};
static const EnumPropertyItem rna_enum_gizmo_items[] = {
- {SCE_MANIP_TRANSLATE, "TRANSLATE", 0, "Translate", ""},
- {SCE_MANIP_ROTATE, "ROTATE", 0, "Rotate", ""},
- {SCE_MANIP_SCALE, "SCALE", 0, "Scale", ""},
+ {SCE_GIZMO_SHOW_TRANSLATE, "TRANSLATE", 0, "Move", ""},
+ {SCE_GIZMO_SHOW_ROTATE, "ROTATE", 0, "Rotate", ""},
+ {SCE_GIZMO_SHOW_SCALE, "SCALE", 0, "Scale", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -457,27 +457,27 @@ static const EnumPropertyItem rna_enum_gpencil_interpolation_mode_items[] = {
#endif
const EnumPropertyItem rna_enum_transform_pivot_items_full[] = {
- {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_ROTATE, "Bounding Box Center",
+ {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_PIVOT_BOUNDBOX, "Bounding Box Center",
"Pivot around bounding box center of selected object(s)"},
- {V3D_AROUND_CURSOR, "CURSOR", ICON_CURSOR, "3D Cursor", "Pivot around the 3D cursor"},
- {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_ROTATECOLLECTION,
+ {V3D_AROUND_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "3D Cursor", "Pivot around the 3D cursor"},
+ {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_PIVOT_INDIVIDUAL,
"Individual Origins", "Pivot around each object's own origin"},
- {V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", ICON_ROTATECENTER, "Median Point",
+ {V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", ICON_PIVOT_MEDIAN, "Median Point",
"Pivot around the median point of selected objects"},
- {V3D_AROUND_ACTIVE, "ACTIVE_ELEMENT", ICON_ROTACTIVE, "Active Element", "Pivot around active object"},
+ {V3D_AROUND_ACTIVE, "ACTIVE_ELEMENT", ICON_PIVOT_ACTIVE, "Active Element", "Pivot around active object"},
{0, NULL, 0, NULL, NULL}
};
/* Icons could be made a consistent set of images. */
const EnumPropertyItem rna_enum_transform_orientation_items[] = {
- {V3D_MANIP_GLOBAL, "GLOBAL", ICON_SCENE_DATA, "Global", "Align the transformation axes to world space"},
- {V3D_MANIP_LOCAL, "LOCAL", ICON_MANIPUL, "Local", "Align the transformation axes to the selected objects' local space"},
- {V3D_MANIP_NORMAL, "NORMAL", ICON_SNAP_NORMAL, "Normal",
+ {V3D_MANIP_GLOBAL, "GLOBAL", ICON_ORIENTATION_GLOBAL, "Global", "Align the transformation axes to world space"},
+ {V3D_MANIP_LOCAL, "LOCAL", ICON_ORIENTATION_LOCAL, "Local", "Align the transformation axes to the selected objects' local space"},
+ {V3D_MANIP_NORMAL, "NORMAL", ICON_ORIENTATION_NORMAL, "Normal",
"Align the transformation axes to average normal of selected elements "
"(bone Y axis for pose mode)"},
- {V3D_MANIP_GIMBAL, "GIMBAL", ICON_NDOF_DOM, "Gimbal", "Align each axis to the Euler rotation axis as used for input"},
- {V3D_MANIP_VIEW, "VIEW", ICON_VISIBLE_IPO_ON, "View", "Align the transformation axes to the window"},
- {V3D_MANIP_CURSOR, "CURSOR", ICON_CURSOR, "Cursor", "Align the transformation axes to the 3D cursor"},
+ {V3D_MANIP_GIMBAL, "GIMBAL", ICON_ORIENTATION_GIMBAL, "Gimbal", "Align each axis to the Euler rotation axis as used for input"},
+ {V3D_MANIP_VIEW, "VIEW", ICON_ORIENTATION_VIEW, "View", "Align the transformation axes to the window"},
+ {V3D_MANIP_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "Cursor", "Align the transformation axes to the 3D cursor"},
// {V3D_MANIP_CUSTOM, "CUSTOM", 0, "Custom", "Use a custom transform orientation"},
{0, NULL, 0, NULL, NULL}
};
@@ -515,6 +515,7 @@ const EnumPropertyItem rna_enum_transform_orientation_items[] = {
#include "BKE_animsys.h"
#include "BKE_freestyle.h"
#include "BKE_gpencil.h"
+#include "BKE_unit.h"
#include "ED_info.h"
#include "ED_node.h"
@@ -531,6 +532,14 @@ const EnumPropertyItem rna_enum_transform_orientation_items[] = {
#include "FRS_freestyle.h"
#endif
+static void rna_ToolSettings_snap_mode_set(struct PointerRNA *ptr, int value)
+{
+ ToolSettings *ts = (ToolSettings *)ptr->data;
+ if (value != 0) {
+ ts->snap_mode = value;
+ }
+}
+
/* Grease Pencil update cache */
static void rna_GPencil_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *UNUSED(ptr))
{
@@ -578,8 +587,8 @@ static void rna_GPencilInterpolateSettings_type_set(PointerRNA *ptr, int value)
static void rna_ToolSettings_gizmo_flag_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *UNUSED(ptr))
{
ToolSettings *ts = scene->toolsettings;
- if ((ts->gizmo_flag & (SCE_MANIP_TRANSLATE | SCE_MANIP_ROTATE | SCE_MANIP_SCALE)) == 0) {
- ts->gizmo_flag |= SCE_MANIP_TRANSLATE;
+ if ((ts->gizmo_flag & (SCE_GIZMO_SHOW_TRANSLATE | SCE_GIZMO_SHOW_ROTATE | SCE_GIZMO_SHOW_SCALE)) == 0) {
+ ts->gizmo_flag |= SCE_GIZMO_SHOW_TRANSLATE;
}
}
@@ -653,20 +662,6 @@ void rna_Scene_set_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
}
}
-static void rna_Scene_layer_set(PointerRNA *ptr, const bool *values)
-{
- Scene *scene = (Scene *)ptr->data;
-
- scene->lay = ED_view3d_view_layer_set(scene->lay, values, &scene->layact);
-}
-
-static int rna_Scene_active_layer_get(PointerRNA *ptr)
-{
- Scene *scene = (Scene *)ptr->data;
-
- return (int)(log(scene->layact) / M_LN2);
-}
-
static void rna_Scene_view3d_update(Main *bmain, Scene *UNUSED(scene_unused), PointerRNA *ptr)
{
wmWindowManager *wm = bmain->wm.first;
@@ -675,17 +670,6 @@ static void rna_Scene_view3d_update(Main *bmain, Scene *UNUSED(scene_unused), Po
WM_windows_scene_data_sync(&wm->windows, scene);
}
-static void rna_Scene_layer_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *UNUSED(ptr))
-{
- /* XXX We would need do_time=true here, else we can have update issues like [#36289]...
- * However, this has too much drawbacks (like slower layer switch, undesired updates...).
- * That's TODO for future DAG updates.
- */
- DEG_on_visible_update(bmain, false);
-
- /* No need to sync scene data here (WM_windows_scene_data_sync), handled through notifier. */
-}
-
static void rna_Scene_fps_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *UNUSED(ptr))
{
BKE_sound_update_fps(scene);
@@ -1428,7 +1412,7 @@ void rna_ViewLayer_name_set(PointerRNA *ptr, const char *value)
{
Scene *scene = (Scene *)ptr->id.data;
ViewLayer *view_layer = (ViewLayer *)ptr->data;
- BLI_assert(BKE_id_is_in_gobal_main(&scene->id));
+ BLI_assert(BKE_id_is_in_global_main(&scene->id));
BKE_view_layer_rename(G_MAIN, scene, view_layer, value);
}
@@ -1459,9 +1443,10 @@ static char *rna_SceneRenderView_path(PointerRNA *ptr)
static void rna_Scene_use_nodes_update(bContext *C, PointerRNA *ptr)
{
Scene *scene = (Scene *)ptr->data;
-
- if (scene->use_nodes && scene->nodetree == NULL)
+ if (scene->use_nodes && scene->nodetree == NULL) {
ED_node_composit_default(C, scene);
+ }
+ DEG_relations_tag_update(CTX_data_main(C));
}
static void rna_Physics_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
@@ -2040,6 +2025,68 @@ const EnumPropertyItem *rna_TransformOrientation_itemf(
return item;
}
+static const EnumPropertyItem *get_unit_enum_items(int system, int type, bool *r_free)
+{
+ const void *usys;
+ int len;
+ bUnit_GetSystem(system, type, &usys, &len);
+
+ EnumPropertyItem *items = NULL;
+ int totitem = 0;
+
+ EnumPropertyItem adaptive = { 0 };
+ adaptive.identifier = "ADAPTIVE";
+ adaptive.name = "Adaptive";
+ adaptive.value = USER_UNIT_ADAPTIVE;
+ RNA_enum_item_add(&items, &totitem, &adaptive);
+
+ for (int i = 0; i < len; i++) {
+ if (!bUnit_IsSuppressed(usys, i)) {
+ EnumPropertyItem tmp = { 0 };
+ tmp.identifier = bUnit_GetName(usys, i);
+ tmp.name = bUnit_GetNameDisplay(usys, i);
+ tmp.value = i;
+ RNA_enum_item_add(&items, &totitem, &tmp);
+ }
+ }
+
+ *r_free = true;
+ return items;
+}
+
+const EnumPropertyItem *rna_get_length_unit_items(
+ bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
+{
+ UnitSettings *units = ptr->data;
+ return get_unit_enum_items(units->system, B_UNIT_LENGTH, r_free);
+}
+
+const EnumPropertyItem *rna_get_mass_unit_items(
+ bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
+{
+ UnitSettings *units = ptr->data;
+ return get_unit_enum_items(units->system, B_UNIT_MASS, r_free);
+}
+
+const EnumPropertyItem *rna_get_time_unit_items(
+ bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
+{
+ UnitSettings *units = ptr->data;
+ return get_unit_enum_items(units->system, B_UNIT_TIME, r_free);
+}
+
+static void rna_unit_system_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *UNUSED(ptr))
+{
+ UnitSettings *unit = &scene->unit;
+ if (unit->system == USER_UNIT_NONE) {
+ unit->length_unit = USER_UNIT_ADAPTIVE;
+ unit->mass_unit = USER_UNIT_ADAPTIVE;
+ }
+ else {
+ unit->length_unit = bUnit_GetBaseUnitOfType(unit->system, B_UNIT_LENGTH);
+ unit->mass_unit = bUnit_GetBaseUnitOfType(unit->system, B_UNIT_MASS);
+ }
+}
#else
@@ -2176,18 +2223,29 @@ static void rna_def_tool_settings(BlenderRNA *brna)
static const EnumPropertyItem gpencil_stroke_placement_items[] = {
{GP_PROJECT_VIEWSPACE, "ORIGIN", ICON_OBJECT_ORIGIN, "Origin", "Draw stroke at Object origin"},
- {GP_PROJECT_VIEWSPACE | GP_PROJECT_CURSOR, "CURSOR", ICON_CURSOR, "3D Cursor", "Draw stroke at 3D cursor location" },
- // {0, "VIEW", ICON_VISIBLE_IPO_ON, "View", "Stick stroke to the view "}, /* weird, GP_PROJECT_VIEWALIGN is inverted */
- {GP_PROJECT_VIEWSPACE | GP_PROJECT_DEPTH_VIEW, "SURFACE", ICON_FACESEL, "Surface", "Stick stroke to surfaces"},
- //{GP_PROJECT_VIEWSPACE | GP_PROJECT_DEPTH_STROKE, "STROKE", ICON_GREASEPENCIL, "Stroke", "Stick stroke to other strokes"},
+ {GP_PROJECT_VIEWSPACE | GP_PROJECT_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "3D Cursor", "Draw stroke at 3D cursor location" },
+ {GP_PROJECT_VIEWSPACE | GP_PROJECT_DEPTH_VIEW, "SURFACE", ICON_SNAP_FACE, "Surface", "Stick stroke to surfaces"},
+ {GP_PROJECT_VIEWSPACE | GP_PROJECT_DEPTH_STROKE, "STROKE", ICON_GP_STROKE, "Stroke", "Stick stroke to other strokes"},
+ {0, NULL, 0, NULL, NULL}
+ };
+
+ static const EnumPropertyItem gpencil_stroke_snap_items[] = {
+ {0, "NONE", 0, "All points", "No snap"},
+ {GP_PROJECT_DEPTH_STROKE_ENDPOINTS, "ENDS", 0, "End points", "Snap to first and last points and interpolate" },
+ {GP_PROJECT_DEPTH_STROKE_FIRST, "FIRST", 0, "First point", "Snap to first point" },
+ {0, NULL, 0, NULL, NULL}
+ };
+
+ static const EnumPropertyItem gpencil_selectmode_items[] = {
+ {GP_SELECTMODE_POINT, "POINT", ICON_GP_SELECT_POINTS, "Point", "Select only points"},
+ {GP_SELECTMODE_STROKE, "STROKE", ICON_GP_SELECT_STROKES, "Stroke", "Select all stroke points" },
{0, NULL, 0, NULL, NULL}
};
static const EnumPropertyItem annotation_stroke_placement_items[] = {
- {GP_PROJECT_VIEWSPACE | GP_PROJECT_CURSOR, "CURSOR", ICON_CURSOR, "3D Cursor", "Draw stroke at 3D cursor location" },
- {0, "VIEW", ICON_VISIBLE_IPO_ON, "View", "Stick stroke to the view "}, /* weird, GP_PROJECT_VIEWALIGN is inverted */
+ {GP_PROJECT_VIEWSPACE | GP_PROJECT_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "3D Cursor", "Draw stroke at 3D cursor location" },
+ {0, "VIEW", ICON_RESTRICT_VIEW_ON, "View", "Stick stroke to the view "}, /* weird, GP_PROJECT_VIEWALIGN is inverted */
{GP_PROJECT_VIEWSPACE | GP_PROJECT_DEPTH_VIEW, "SURFACE", ICON_FACESEL, "Surface", "Stick stroke to surfaces"},
- {GP_PROJECT_VIEWSPACE | GP_PROJECT_DEPTH_STROKE, "STROKE", ICON_GREASEPENCIL, "Stroke", "Stick stroke to other strokes"},
{0, NULL, 0, NULL, NULL}
};
@@ -2341,12 +2399,12 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "transform_pivot_point");
RNA_def_property_enum_items(prop, rna_enum_transform_pivot_items_full);
RNA_def_property_ui_text(prop, "Pivot Point", "Pivot center for rotation/scaling");
- RNA_def_property_update(prop, NC_SCENE, NULL);
+ RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
prop = RNA_def_property(srna, "use_transform_pivot_point_align", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "transform_flag", SCE_XFORM_AXIS_ALIGN);
RNA_def_property_ui_text(prop, "Align", "Manipulate center points (object, pose and weight paint mode only)");
- RNA_def_property_ui_icon(prop, ICON_ALIGN, 0);
+ RNA_def_property_ui_icon(prop, ICON_CENTER_ONLY, 0);
RNA_def_property_update(prop, NC_SCENE, NULL);
prop = RNA_def_property(srna, "use_mesh_automerge", PROP_BOOLEAN, PROP_NONE);
@@ -2362,20 +2420,19 @@ static void rna_def_tool_settings(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_snap_align_rotation", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP_ROTATE);
- RNA_def_property_ui_text(prop, "Snap Align Rotation", "Align rotation with the snapping target");
- RNA_def_property_ui_icon(prop, ICON_SNAP_NORMAL, 0);
+ RNA_def_property_ui_text(prop, "Align Rotation to Target", "Align rotation with the snapping target");
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
prop = RNA_def_property(srna, "use_snap_grid_absolute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP_ABS_GRID);
RNA_def_property_ui_text(prop, "Absolute Grid Snap",
"Absolute grid alignment while translating (based on the pivot center)");
- RNA_def_property_ui_icon(prop, ICON_SNAP_GRID, 0);
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
prop = RNA_def_property(srna, "snap_elements", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "snap_mode");
RNA_def_property_enum_items(prop, rna_enum_snap_element_items);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_ToolSettings_snap_mode_set", NULL);
RNA_def_property_flag(prop, PROP_ENUM_FLAG);
RNA_def_property_ui_text(prop, "Snap Element", "Type of element to snap to");
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
@@ -2403,20 +2460,17 @@ static void rna_def_tool_settings(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_snap_peel_object", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP_PEEL_OBJECT);
RNA_def_property_ui_text(prop, "Snap Peel Object", "Consider objects as whole when finding volume center");
- RNA_def_property_ui_icon(prop, ICON_SNAP_PEEL_OBJECT, 0);
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
prop = RNA_def_property(srna, "use_snap_project", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP_PROJECT);
RNA_def_property_ui_text(prop, "Project Individual Elements",
"Project individual elements on the surface of other objects");
- RNA_def_property_ui_icon(prop, ICON_RETOPO, 0);
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
prop = RNA_def_property(srna, "use_snap_self", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "snap_flag", SCE_SNAP_NO_SELF);
- RNA_def_property_ui_text(prop, "Project to Self", "Snap onto itself (editmode)");
- RNA_def_property_ui_icon(prop, ICON_ORTHO, 0);
+ RNA_def_property_ui_text(prop, "Project onto Self", "Snap onto itself (Edit Mode Only)");
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
prop = RNA_def_property(srna, "use_gizmo_mode", PROP_ENUM, PROP_NONE);
@@ -2426,13 +2480,8 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Gizmo Mode", "");
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, "rna_ToolSettings_gizmo_flag_update");
- prop = RNA_def_property(srna, "use_gizmo_apron", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "gizmo_flag", SCE_MANIP_DISABLE_APRON);
- RNA_def_property_ui_text(prop, "Click Anywhere", "Handle input not directly over the gizmo");
- RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
-
/* Grease Pencil */
- prop = RNA_def_property(srna, "use_gpencil_additive_drawing", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_gpencil_draw_additive", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gpencil_flags", GP_TOOL_FLAG_RETAIN_LAST);
RNA_def_property_ui_text(prop, "Use Additive Drawing",
"When creating new frames, the strokes from the previous/active frame "
@@ -2451,13 +2500,13 @@ static void rna_def_tool_settings(BlenderRNA *brna)
"Show compact list of color instead of thumbnails");
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
- prop = RNA_def_property(srna, "add_gpencil_weight_data", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_gpencil_weight_data_add", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gpencil_flags", GP_TOOL_FLAG_CREATE_WEIGHTS);
RNA_def_property_ui_text(prop, "Add weight data for new strokes",
"When creating new strokes, the weight data is added according to the current vertex group and weight, "
"if no vertex group selected, weight is not added");
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
-
+
prop = RNA_def_property(srna, "gpencil_sculpt", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "gp_sculpt");
RNA_def_property_struct_type(prop, "GPencilSculptSettings");
@@ -2477,11 +2526,24 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Stroke Placement (3D View)", "");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
+ prop = RNA_def_property(srna, "gpencil_stroke_snap_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "gpencil_v3d_align");
+ RNA_def_property_enum_items(prop, gpencil_stroke_snap_items);
+ RNA_def_property_ui_text(prop, "Stroke Snap", "");
+ RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
+
prop = RNA_def_property(srna, "use_gpencil_stroke_endpoints", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gpencil_v3d_align", GP_PROJECT_DEPTH_STROKE_ENDPOINTS);
RNA_def_property_ui_text(prop, "Only Endpoints", "Only use the first and last parts of the stroke for snapping");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
+ /* Grease Pencil - Select mode */
+ prop = RNA_def_property(srna, "gpencil_selectmode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "gpencil_selectmode");
+ RNA_def_property_enum_items(prop, gpencil_selectmode_items);
+ RNA_def_property_ui_text(prop, "Select Mode", "");
+ RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
+
/* Annotations - 2D Views Stroke Placement */
prop = RNA_def_property(srna, "annotation_stroke_placement_view2d", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "gpencil_v2d_align");
@@ -2541,6 +2603,12 @@ static void rna_def_tool_settings(BlenderRNA *brna)
"Automatic keyframe insertion using active Keying Set only");
RNA_def_property_ui_icon(prop, ICON_KEYINGSET, 0);
+ prop = RNA_def_property(srna, "use_keyframe_cycle_aware", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", AUTOKEY_FLAG_CYCLEAWARE);
+ RNA_def_property_ui_text(prop, "Cycle-Aware Keying",
+ "For channels with cyclic extrapolation, keyframe insertion is automatically "
+ "remapped inside the cycle time range, and keeps ends in sync");
+
/* Keyframing */
prop = RNA_def_property(srna, "keyframe_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "keyframe_type");
@@ -2557,12 +2625,12 @@ static void rna_def_tool_settings(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_uv_select_sync", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uv_flag", UV_SYNC_SELECTION);
RNA_def_property_ui_text(prop, "UV Sync Selection", "Keep UV and edit mode mesh selection in sync");
- RNA_def_property_ui_icon(prop, ICON_EDIT, 0);
+ RNA_def_property_ui_icon(prop, ICON_UV_SYNC_SELECT, 0);
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
prop = RNA_def_property(srna, "show_uv_local_view", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uv_flag", UV_SHOW_SAME_IMAGE);
- RNA_def_property_ui_text(prop, "UV Local View", "Draw only faces with the currently displayed image assigned");
+ RNA_def_property_ui_text(prop, "UV Local View", "Display only faces with the currently displayed image assigned");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
/* Mesh */
@@ -2800,9 +2868,9 @@ static void rna_def_curve_paint_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Depth", "Method of projecting depth");
static const EnumPropertyItem surface_plane_items[] = {
- {CURVE_PAINT_SURFACE_PLANE_NORMAL_VIEW, "NORMAL_VIEW", 0, "Normal/View", "Draw perpendicular to the surface"},
- {CURVE_PAINT_SURFACE_PLANE_NORMAL_SURFACE, "NORMAL_SURFACE", 0, "Normal/Surface", "Draw aligned to the surface"},
- {CURVE_PAINT_SURFACE_PLANE_VIEW, "VIEW", 0, "View", "Draw aligned to the viewport"},
+ {CURVE_PAINT_SURFACE_PLANE_NORMAL_VIEW, "NORMAL_VIEW", 0, "Normal/View", "Display perpendicular to the surface"},
+ {CURVE_PAINT_SURFACE_PLANE_NORMAL_SURFACE, "NORMAL_SURFACE", 0, "Normal/Surface", "Display aligned to the surface"},
+ {CURVE_PAINT_SURFACE_PLANE_VIEW, "VIEW", 0, "View", "Display aligned to the viewport"},
{0, NULL, 0, NULL, NULL}};
prop = RNA_def_property(srna, "surface_plane", PROP_ENUM, PROP_NONE);
@@ -2927,7 +2995,7 @@ static void rna_def_statvis(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_EditMesh_update");
}
-static void rna_def_unit_settings(BlenderRNA *brna)
+static void rna_def_unit_settings(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -2952,7 +3020,7 @@ static void rna_def_unit_settings(BlenderRNA *brna)
prop = RNA_def_property(srna, "system", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, unit_systems);
RNA_def_property_ui_text(prop, "Unit System", "The unit system to use for button display");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, NC_WINDOW, "rna_unit_system_update");
prop = RNA_def_property(srna, "system_rotation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, rotation_units);
@@ -2960,7 +3028,9 @@ static void rna_def_unit_settings(BlenderRNA *brna)
RNA_def_property_update(prop, NC_WINDOW, NULL);
prop = RNA_def_property(srna, "scale_length", PROP_FLOAT, PROP_UNSIGNED);
- RNA_def_property_ui_text(prop, "Unit Scale", "Scale to use when converting between blender units and dimensions");
+ RNA_def_property_ui_text(prop, "Unit Scale", "Scale to use when converting between blender units and dimensions."
+ " When working at microscopic or astronomical scale, a small or large unit scale"
+ " respectively can be used to avoid numerical precision problems");
RNA_def_property_range(prop, 0.00001, 100000.0);
RNA_def_property_ui_range(prop, 0.001, 100.0, 0.1, 6);
RNA_def_property_update(prop, NC_WINDOW, NULL);
@@ -2969,6 +3039,24 @@ static void rna_def_unit_settings(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_UNIT_OPT_SPLIT);
RNA_def_property_ui_text(prop, "Separate Units", "Display units in pairs (e.g. 1m 0cm)");
RNA_def_property_update(prop, NC_WINDOW, NULL);
+
+ prop = RNA_def_property(srna, "length_unit", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, DummyRNA_DEFAULT_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_get_length_unit_items");
+ RNA_def_property_ui_text(prop, "Length Unit", "Unit that will be used to display length values");
+ RNA_def_property_update(prop, NC_WINDOW, NULL);
+
+ prop = RNA_def_property(srna, "mass_unit", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, DummyRNA_DEFAULT_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_get_mass_unit_items");
+ RNA_def_property_ui_text(prop, "Mass Unit", "Unit that will be used to display mass values");
+ RNA_def_property_update(prop, NC_WINDOW, NULL);
+
+ prop = RNA_def_property(srna, "time_unit", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, DummyRNA_DEFAULT_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_get_time_unit_items");
+ RNA_def_property_ui_text(prop, "Time Unit", "Unit that will be used to display time values");
+ RNA_def_property_update(prop, NC_WINDOW, NULL);
}
void rna_def_view_layer_common(StructRNA *srna, int scene)
@@ -3037,7 +3125,7 @@ void rna_def_view_layer_common(StructRNA *srna, int scene)
prop = RNA_def_property(srna, "use_ao", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_AO);
- RNA_def_property_ui_text(prop, "AO", "Render AO in this Layer");
+ RNA_def_property_ui_text(prop, "Ambient Occlusion", "Render Ambient Occlusion in this Layer");
if (scene) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_glsl_update");
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -3116,7 +3204,7 @@ void rna_def_view_layer_common(StructRNA *srna, int scene)
prop = RNA_def_property(srna, "use_pass_ambient_occlusion", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_AO);
- RNA_def_property_ui_text(prop, "AO", "Deliver AO pass");
+ RNA_def_property_ui_text(prop, "Ambient Occlusion", "Deliver Ambient Occlusion pass");
if (scene) RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_ViewLayer_pass_update");
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -3761,7 +3849,7 @@ static void rna_def_bake_data(BlenderRNA *brna)
/* custom passes flags */
prop = RNA_def_property(srna, "use_pass_ambient_occlusion", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "pass_filter", R_BAKE_PASS_FILTER_AO);
- RNA_def_property_ui_text(prop, "AO", "Add ambient occlusion contribution");
+ RNA_def_property_ui_text(prop, "Ambient Occlusion", "Add ambient occlusion contribution");
prop = RNA_def_property(srna, "use_pass_emit", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "pass_filter", R_BAKE_PASS_FILTER_EMIT);
@@ -3852,7 +3940,7 @@ static void rna_def_gpu_dof_fx(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPUDOFSettings_update");
prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ANGLE);
- RNA_def_property_ui_text(prop, "Rotation", "Rotation of blades in apperture");
+ RNA_def_property_ui_text(prop, "Rotation", "Rotation of blades in aperture");
RNA_def_property_range(prop, -M_PI, M_PI);
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
@@ -4357,11 +4445,11 @@ static void rna_def_scene_ffmpeg_settings(BlenderRNA *brna)
#endif
static const EnumPropertyItem audio_channel_items[] = {
- {1, "MONO", 0, "Mono", "Set audio channels to mono"},
- {2, "STEREO", 0, "Stereo", "Set audio channels to stereo"},
- {4, "SURROUND4", 0, "4 Channels", "Set audio channels to 4 channels"},
- {6, "SURROUND51", 0, "5.1 Surround", "Set audio channels to 5.1 surround sound"},
- {8, "SURROUND71", 0, "7.1 Surround", "Set audio channels to 7.1 surround sound"},
+ {FFM_CHANNELS_MONO, "MONO", 0, "Mono", "Set audio channels to mono"},
+ {FFM_CHANNELS_STEREO, "STEREO", 0, "Stereo", "Set audio channels to stereo"},
+ {FFM_CHANNELS_SURROUND4, "SURROUND4", 0, "4 Channels", "Set audio channels to 4 channels"},
+ {FFM_CHANNELS_SURROUND51, "SURROUND51", 0, "5.1 Surround", "Set audio channels to 5.1 surround sound"},
+ {FFM_CHANNELS_SURROUND71, "SURROUND71", 0, "7.1 Surround", "Set audio channels to 7.1 surround sound"},
{0, NULL, 0, NULL, NULL}
};
@@ -5082,7 +5170,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_stamp_labels", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "stamp", R_STAMP_HIDE_LABELS);
- RNA_def_property_ui_text(prop, "Stamp Labels", "Draw stamp labels (\"Camera\" in front of camera name, etc.)");
+ RNA_def_property_ui_text(prop, "Stamp Labels", "Display stamp labels (\"Camera\" in front of camera name, etc.)");
RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
prop = RNA_def_property(srna, "use_stamp_strip_meta", PROP_BOOLEAN, PROP_NONE);
@@ -5139,7 +5227,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_sequencer_gl_textured_solid", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "seq_flag", R_SEQ_SOLID_TEX);
- RNA_def_property_ui_text(prop, "Textured Solid", "Draw face-assigned textures in solid draw method");
+ RNA_def_property_ui_text(prop, "Textured Solid", "Display face-assigned textures in solid draw method");
RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_SceneSequencer_update");
prop = RNA_def_property(srna, "use_sequencer_gl_dof", PROP_BOOLEAN, PROP_NONE);
@@ -5597,24 +5685,28 @@ static void rna_def_scene_eevee(BlenderRNA *brna)
prop = RNA_def_property(srna, "gi_show_irradiance", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_SHOW_IRRADIANCE);
RNA_def_property_boolean_default(prop, 0);
+ RNA_def_property_ui_icon(prop, ICON_HIDE_ON, 1);
RNA_def_property_ui_text(prop, "Show Irradiance Cache", "Display irradiance samples in the viewport");
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
prop = RNA_def_property(srna, "gi_show_cubemaps", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_SHOW_CUBEMAPS);
RNA_def_property_boolean_default(prop, 0);
+ RNA_def_property_ui_icon(prop, ICON_HIDE_ON, 1);
RNA_def_property_ui_text(prop, "Show Cubemap Cache", "Display captured cubemaps in the viewport");
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
- prop = RNA_def_property(srna, "gi_irradiance_draw_size", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "gi_irradiance_display_size", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "gi_irradiance_draw_size");
RNA_def_property_range(prop, 0.05f, 10.0f);
RNA_def_property_float_default(prop, 0.1f);
- RNA_def_property_ui_text(prop, "Irradiance Draw Size", "Size of the irradiance sample spheres to debug captured light");
+ RNA_def_property_ui_text(prop, "Irradiance Display Size", "Size of the irradiance sample spheres to debug captured light");
- prop = RNA_def_property(srna, "gi_cubemap_draw_size", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "gi_cubemap_display_size", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "gi_cubemap_draw_size");
RNA_def_property_range(prop, 0.05f, 10.0f);
RNA_def_property_float_default(prop, 0.3f);
- RNA_def_property_ui_text(prop, "Cubemap Draw Size", "Size of the cubemap spheres to debug captured light");
+ RNA_def_property_ui_text(prop, "Cubemap Display Size", "Size of the cubemap spheres to debug captured light");
prop = RNA_def_property(srna, "gi_auto_bake", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_GI_AUTOBAKE);
@@ -5668,7 +5760,7 @@ static void rna_def_scene_eevee(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_sss_separate_albedo", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_SSS_SEPARATE_ALBEDO);
RNA_def_property_boolean_default(prop, 0);
- RNA_def_property_ui_text(prop, "Separate Albedo", "Avoid albedo being blured by the subsurface scattering "
+ RNA_def_property_ui_text(prop, "Separate Albedo", "Avoid albedo being blurred by the subsurface scattering "
"but uses more video memory");
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
@@ -5693,7 +5785,7 @@ static void rna_def_scene_eevee(BlenderRNA *brna)
prop = RNA_def_property(srna, "ssr_quality", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_default(prop, 0.25f);
- RNA_def_property_ui_text(prop, "Trace Quality", "Quality of the screen space raytracing");
+ RNA_def_property_ui_text(prop, "Trace Precision", "Precision of the screen space raytracing");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
@@ -5814,7 +5906,7 @@ static void rna_def_scene_eevee(BlenderRNA *brna)
prop = RNA_def_property(srna, "gtao_quality", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_default(prop, 0.25f);
- RNA_def_property_ui_text(prop, "Trace Quality", "Quality of the horizon search");
+ RNA_def_property_ui_text(prop, "Trace Precision", "Precision of the horizon search");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
@@ -5850,7 +5942,7 @@ static void rna_def_scene_eevee(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_bloom", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_BLOOM_ENABLED);
RNA_def_property_boolean_default(prop, 0);
- RNA_def_property_ui_text(prop, "Bloom", "High brighness pixels generate a glowing effect");
+ RNA_def_property_ui_text(prop, "Bloom", "High brightness pixels generate a glowing effect");
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
prop = RNA_def_property(srna, "bloom_threshold", PROP_FLOAT, PROP_FACTOR);
@@ -5936,6 +6028,29 @@ static void rna_def_scene_eevee(BlenderRNA *brna)
RNA_def_property_boolean_default(prop, 0);
RNA_def_property_ui_text(prop, "High Bitdepth", "Use 32bit shadows");
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
+
+ prop = RNA_def_property(srna, "use_soft_shadows", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_SHADOW_SOFT);
+ RNA_def_property_boolean_default(prop, 0);
+ RNA_def_property_ui_text(prop, "Soft Shadows", "Randomize shadowmaps origin to create soft shadows");
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
+
+ /* Overscan */
+ prop = RNA_def_property(srna, "use_overscan", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_OVERSCAN);
+ RNA_def_property_boolean_default(prop, 0);
+ RNA_def_property_ui_text(prop, "Overscan", "Internally render past the image border to avoid "
+ "screen-space effects disapearing");
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
+
+ prop = RNA_def_property(srna, "overscan_size", PROP_FLOAT, PROP_PERCENTAGE);
+ RNA_def_property_float_sdna(prop, NULL, "overscan");
+ RNA_def_property_float_default(prop, 3.0f);
+ RNA_def_property_ui_text(prop, "Overscan Size", "Percentage of render size to add as overscan to the "
+ "internal render buffers");
+ RNA_def_property_range(prop, 0.0f, 50.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 2);
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
}
void RNA_def_scene(BlenderRNA *brna)
@@ -6013,22 +6128,6 @@ void RNA_def_scene(BlenderRNA *brna)
NULL, NULL, NULL, NULL);
rna_def_scene_objects(brna, prop);
- /* Layers */
- prop = RNA_def_property(srna, "layers", PROP_BOOLEAN, PROP_LAYER_MEMBER);
- /* this seems to be too much trouble with depsgraph updates/etc. currently (20110420) */
- RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
- RNA_def_property_boolean_sdna(prop, NULL, "lay", 1);
- RNA_def_property_array(prop, 20);
- RNA_def_property_boolean_funcs(prop, NULL, "rna_Scene_layer_set");
- RNA_def_property_ui_text(prop, "Layers", "Visible layers - Shift-Click/Drag to select multiple layers");
- RNA_def_property_update(prop, NC_SCENE | ND_LAYER, "rna_Scene_layer_update");
-
- /* active layer */
- prop = RNA_def_property(srna, "active_layer", PROP_INT, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
- RNA_def_property_int_funcs(prop, "rna_Scene_active_layer_get", NULL, NULL);
- RNA_def_property_ui_text(prop, "Active Layer", "Active scene layer index");
-
/* Frame Range Stuff */
prop = RNA_def_property(srna, "frame_current", PROP_INT, PROP_TIME);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c
index 5a8c9646b0b..f25e093c8a9 100644
--- a/source/blender/makesrna/intern/rna_scene_api.c
+++ b/source/blender/makesrna/intern/rna_scene_api.c
@@ -66,6 +66,8 @@ const EnumPropertyItem rna_enum_abc_compression_items[] = {
#include "BKE_scene.h"
#include "BKE_writeavi.h"
+#include "DEG_depsgraph_query.h"
+
#include "ED_transform.h"
#include "ED_transform_snap_object_context.h"
#include "ED_uvedit.h"
@@ -185,6 +187,10 @@ static void rna_Scene_ray_cast(
ED_transform_snap_object_context_destroy(sctx);
+ if (r_ob != NULL && *r_ob != NULL) {
+ *r_ob = DEG_get_original_object(*r_ob);
+ }
+
if (ret) {
*r_success = true;
}
diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c
index 5f199608f65..f4311f820ce 100644
--- a/source/blender/makesrna/intern/rna_screen.c
+++ b/source/blender/makesrna/intern/rna_screen.c
@@ -46,6 +46,7 @@ const EnumPropertyItem rna_enum_region_type_items[] = {
{RGN_TYPE_TOOLS, "TOOLS", 0, "Tools", ""},
{RGN_TYPE_TOOL_PROPS, "TOOL_PROPS", 0, "Tool Properties", ""},
{RGN_TYPE_PREVIEW, "PREVIEW", 0, "Preview", ""},
+ {RGN_TYPE_NAV_BAR, "NAVIGATION_BAR", 0, "Navigation Bar", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -322,11 +323,24 @@ static void rna_def_area_spaces(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_ui_text(prop, "Active Space", "Space currently being displayed in this area");
}
+static void rna_def_area_api(StructRNA *srna)
+{
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_function(srna, "tag_redraw", "ED_area_tag_redraw");
+
+ func = RNA_def_function(srna, "header_text_set", "ED_area_status_text");
+ RNA_def_function_ui_description(func, "Set the header status text");
+ parm = RNA_def_string(func, "text", NULL, 0, "Text", "New string for the header, None clears the text");
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+ RNA_def_property_clear_flag(parm, PROP_NEVER_NULL);
+}
+
static void rna_def_area(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
- FunctionRNA *func;
srna = RNA_def_struct(brna, "Area", NULL);
RNA_def_struct_ui_text(srna, "Area", "Area in a subdivided screen, containing an editor");
@@ -389,11 +403,7 @@ static void rna_def_area(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Height", "Area height");
- RNA_def_function(srna, "tag_redraw", "ED_area_tag_redraw");
-
- func = RNA_def_function(srna, "header_text_set", "ED_area_status_text");
- RNA_def_function_ui_description(func, "Set the header status text");
- RNA_def_string(func, "text", NULL, 0, "Text", "New string for the header, no argument clears the text");
+ rna_def_area_api(srna);
}
static void rna_def_view2d_api(StructRNA *srna)
@@ -511,7 +521,7 @@ static void rna_def_screen(BlenderRNA *brna)
srna = RNA_def_struct(brna, "Screen", "ID");
RNA_def_struct_sdna(srna, "Screen"); /* it is actually bScreen but for 2.5 the dna is patched! */
RNA_def_struct_ui_text(srna, "Screen", "Screen data-block, defining the layout of areas in a window");
- RNA_def_struct_ui_icon(srna, ICON_SPLITSCREEN);
+ RNA_def_struct_ui_icon(srna, ICON_WORKSPACE);
prop = RNA_def_property(srna, "layout_name", PROP_STRING, PROP_NONE);
RNA_def_property_string_funcs(prop, "rna_Screen_layout_name_get", "rna_Screen_layout_name_length",
diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c
index 8f09f1dac67..99c43156880 100644
--- a/source/blender/makesrna/intern/rna_sculpt_paint.c
+++ b/source/blender/makesrna/intern/rna_sculpt_paint.c
@@ -44,6 +44,7 @@
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_paint.h"
+#include "BKE_brush.h"
#include "ED_image.h"
@@ -79,16 +80,16 @@ const EnumPropertyItem rna_enum_gpencil_sculpt_brush_items[] = {
#ifndef RNA_RUNTIME
static EnumPropertyItem rna_enum_gpencil_weight_brush_items[] = {
- { GP_EDITBRUSH_TYPE_WEIGHT, "WEIGHT", ICON_GPBRUSH_WEIGHT, "Weight", "Weight Paint for Vertex Groups" },
- { 0, NULL, 0, NULL, NULL }
+ {GP_EDITBRUSH_TYPE_WEIGHT, "WEIGHT", ICON_GPBRUSH_WEIGHT, "Weight", "Weight Paint for Vertex Groups"},
+ {0, NULL, 0, NULL, NULL}
};
-static const EnumPropertyItem rna_enum_gpencil_lockaxis_items[] = {
- { GP_LOCKAXIS_NONE, "GP_LOCKAXIS_NONE", ICON_UNLOCKED, "None", "" },
- { GP_LOCKAXIS_X, "GP_LOCKAXIS_X", ICON_NDOF_DOM, "X", "Project strokes to plane locked to X" },
- { GP_LOCKAXIS_Y, "GP_LOCKAXIS_Y", ICON_NDOF_DOM, "Y", "Project strokes to plane locked to Y" },
- { GP_LOCKAXIS_Z, "GP_LOCKAXIS_Z", ICON_NDOF_DOM, "Z", "Project strokes to plane locked to Z" },
- { 0, NULL, 0, NULL, NULL }
+static const EnumPropertyItem rna_enum_gpencil_lock_axis_items[] = {
+ {GP_LOCKAXIS_VIEW, "VIEW", ICON_RESTRICT_VIEW_ON, "View", "Align strokes to current view plane"},
+ {GP_LOCKAXIS_Y, "AXIS_Y", ICON_AXIS_FRONT, "Front (X-Z)", "Project strokes to plane locked to Y"},
+ {GP_LOCKAXIS_X, "AXIS_X", ICON_AXIS_SIDE, "Side (Y-Z)", "Project strokes to plane locked to X"},
+ {GP_LOCKAXIS_Z, "AXIS_Z", ICON_AXIS_TOP, "Top (X-Y)", "Project strokes to plane locked to Z"},
+ {0, NULL, 0, NULL, NULL}
};
#endif
@@ -272,24 +273,77 @@ static char *rna_ParticleEdit_path(PointerRNA *UNUSED(ptr))
static bool rna_Brush_mode_poll(PointerRNA *ptr, PointerRNA value)
{
+ const Paint *paint = ptr->data;
+ Brush *brush = value.id.data;
+ const uint tool_offset = paint->runtime.tool_offset;
+ const eObjectMode ob_mode = paint->runtime.ob_mode;
+ UNUSED_VARS_NDEBUG(tool_offset);
+ BLI_assert(tool_offset && ob_mode);
+
+ if (brush->ob_mode & ob_mode) {
+ if (paint->brush) {
+ if (BKE_brush_tool_get(paint->brush, paint) == BKE_brush_tool_get(brush, paint)) {
+ return true;
+ }
+ }
+ else {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static bool paint_contains_brush_slot(const Paint *paint, const PaintToolSlot *tslot, int *r_index)
+{
+ if ((tslot >= paint->tool_slots) &&
+ (tslot < (paint->tool_slots + paint->tool_slots_len)))
+ {
+ *r_index = (int)(tslot - paint->tool_slots);
+ return true;
+ }
+ return false;
+}
+
+static bool rna_Brush_mode_with_tool_poll(PointerRNA *ptr, PointerRNA value)
+{
Scene *scene = (Scene *)ptr->id.data;
+ const PaintToolSlot *tslot = ptr->data;
ToolSettings *ts = scene->toolsettings;
Brush *brush = value.id.data;
int mode = 0;
+ int slot_index = 0;
- /* check the origin of the Paint struct to see which paint
- * mode to select from */
-
- if (ptr->data == &ts->imapaint)
+ if (paint_contains_brush_slot(&ts->imapaint.paint, tslot, &slot_index)) {
+ if (slot_index != brush->imagepaint_tool) {
+ return false;
+ }
mode = OB_MODE_TEXTURE_PAINT;
- else if (ptr->data == ts->sculpt)
+ }
+ else if (paint_contains_brush_slot(&ts->sculpt->paint, tslot, &slot_index)) {
+ if (slot_index != brush->sculpt_tool) {
+ return false;
+ }
mode = OB_MODE_SCULPT;
- else if (ptr->data == ts->vpaint)
+ }
+ else if (paint_contains_brush_slot(&ts->vpaint->paint, tslot, &slot_index)) {
+ if (slot_index != brush->vertexpaint_tool) {
+ return false;
+ }
mode = OB_MODE_VERTEX_PAINT;
- else if (ptr->data == ts->wpaint)
+ }
+ else if (paint_contains_brush_slot(&ts->wpaint->paint, tslot, &slot_index)) {
+ if (slot_index != brush->weightpaint_tool) {
+ return false;
+ }
mode = OB_MODE_WEIGHT_PAINT;
- else if (ptr->data == ts->gp_paint)
+ }
+ else if (paint_contains_brush_slot(&ts->gp_paint->paint, tslot, &slot_index)) {
+ if (slot_index != brush->gpencil_tool) {
+ return false;
+ }
mode = OB_MODE_GPENCIL_PAINT;
+ }
return brush->ob_mode & mode;
}
@@ -373,7 +427,7 @@ static char *rna_UvSculpt_path(PointerRNA *UNUSED(ptr))
static char *rna_GpPaint_path(PointerRNA *UNUSED(ptr))
{
- return BLI_strdup("tool_settings.gp_paint");
+ return BLI_strdup("tool_settings.gpencil_paint");
}
static char *rna_ParticleBrush_path(PointerRNA *UNUSED(ptr))
@@ -386,6 +440,8 @@ static void rna_Paint_brush_update(Main *UNUSED(bmain), Scene *UNUSED(scene), Po
Paint *paint = ptr->data;
Brush *br = paint->brush;
BKE_paint_invalidate_overlay_all();
+ /* Needed because we're not calling 'BKE_paint_brush_set' which handles this. */
+ BKE_paint_toolslots_brush_update(paint);
WM_main_add_notifier(NC_BRUSH | NA_SELECTED, br);
}
@@ -397,7 +453,7 @@ static void rna_ImaPaint_viewport_update(Main *UNUSED(bmain), Scene *UNUSED(scen
static void rna_ImaPaint_mode_update(bContext *C, PointerRNA *UNUSED(ptr))
{
- Scene *scene = CTX_data_scene(C);\
+ Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
Object *ob = OBACT(view_layer);
@@ -466,7 +522,7 @@ static PointerRNA rna_GPencilSculptSettings_brush_get(PointerRNA *ptr)
GP_EditBrush_Data *brush = NULL;
if ((gset) && (gset->flag & GP_BRUSHEDIT_FLAG_WEIGHT_MODE)) {
- if ((gset->weighttype >= GP_EDITBRUSH_TYPE_WEIGHT) && (gset->weighttype < TOT_GP_EDITBRUSH_TYPES))
+ if ((gset->weighttype >= GP_EDITBRUSH_TYPE_WEIGHT) && (gset->weighttype < GP_EDITBRUSH_TYPE_MAX))
brush = &gset->brush[gset->weighttype];
}
else {
@@ -498,6 +554,19 @@ static void rna_def_paint_curve(BlenderRNA *brna)
RNA_def_struct_ui_icon(srna, ICON_CURVE_BEZCURVE);
}
+static void rna_def_paint_tool_slot(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "PaintToolSlot", NULL);
+ RNA_def_struct_ui_text(srna, "Paint Tool Slot", "");
+
+ prop = RNA_def_property(srna, "brush", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_Brush_mode_with_tool_poll");
+ RNA_def_property_ui_text(prop, "Brush", "");
+}
static void rna_def_paint(BlenderRNA *brna)
{
@@ -514,6 +583,14 @@ static void rna_def_paint(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Brush", "Active Brush");
RNA_def_property_update(prop, 0, "rna_Paint_brush_update");
+ /* paint_tool_slots */
+ prop = RNA_def_property(srna, "tool_slots", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "tool_slots", "tool_slots_len");
+ RNA_def_property_struct_type(prop, "PaintToolSlot");
+ /* don't dereference pointer! */
+ RNA_def_property_collection_funcs(prop, NULL, NULL, NULL, "rna_iterator_array_get", NULL, NULL, NULL, NULL);
+ RNA_def_property_ui_text(prop, "Paint Tool Slots", "");
+
prop = RNA_def_property(srna, "palette", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, NULL);
@@ -789,7 +866,7 @@ static void rna_def_image_paint(BlenderRNA *brna)
{IMAGEPAINT_MODE_MATERIAL, "MATERIAL", 0,
"Material", "Detect image slots from the material"},
{IMAGEPAINT_MODE_IMAGE, "IMAGE", 0,
- "Image", "Set image for texture painting directly"},
+ "Single Image", "Set image for texture painting directly"},
{0, NULL, 0, NULL, NULL}
};
@@ -1011,10 +1088,11 @@ static void rna_def_particle_edit(BlenderRNA *brna)
RNA_def_property_pointer_funcs(prop, "rna_ParticleEdit_brush_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Brush", "");
- prop = RNA_def_property(srna, "draw_step", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "display_step", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "draw_step");
RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_property_range(prop, 1, 10);
- RNA_def_property_ui_text(prop, "Steps", "How many steps to draw the path with");
+ RNA_def_property_ui_text(prop, "Steps", "How many steps to display the path with");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_ParticleEdit_redo");
prop = RNA_def_property(srna, "fade_frames", PROP_INT, PROP_NONE);
@@ -1102,8 +1180,8 @@ static void rna_def_particle_edit(BlenderRNA *brna)
static void rna_def_gpencil_sculpt(BlenderRNA *brna)
{
static const EnumPropertyItem prop_direction_items[] = {
- {0, "ADD", ICON_ZOOMIN, "Add", "Add effect of brush"},
- {GP_EDITBRUSH_FLAG_INVERT, "SUBTRACT", ICON_ZOOMOUT, "Subtract", "Subtract effect of brush"},
+ {0, "ADD", ICON_ADD, "Add", "Add effect of brush"},
+ {GP_EDITBRUSH_FLAG_INVERT, "SUBTRACT", ICON_REMOVE, "Subtract", "Subtract effect of brush"},
{0, NULL, 0, NULL, NULL}};
StructRNA *srna;
@@ -1138,29 +1216,29 @@ static void rna_def_gpencil_sculpt(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_select_mask", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSHEDIT_FLAG_SELECT_MASK);
RNA_def_property_ui_text(prop, "Selection Mask", "Only sculpt selected stroke points");
- RNA_def_property_ui_icon(prop, ICON_VERTEXSEL, 0); // FIXME: this needs a custom icon
+ RNA_def_property_ui_icon(prop, ICON_GP_ONLY_SELECTED, 0);
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
- prop = RNA_def_property(srna, "affect_position", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_edit_position", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSHEDIT_FLAG_APPLY_POSITION);
RNA_def_property_ui_text(prop, "Affect Position", "The brush affects the position of the point");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
- prop = RNA_def_property(srna, "affect_strength", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_edit_strength", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSHEDIT_FLAG_APPLY_STRENGTH);
RNA_def_property_ui_text(prop, "Affect Strength", "The brush affects the color strength of the point");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
- prop = RNA_def_property(srna, "affect_thickness", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_edit_thickness", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSHEDIT_FLAG_APPLY_THICKNESS);
RNA_def_property_ui_text(prop, "Affect Thickness", "The brush affects the thickness of the point");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
- prop = RNA_def_property(srna, "affect_uv", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_edit_uv", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_BRUSHEDIT_FLAG_APPLY_UV);
RNA_def_property_ui_text(prop, "Affect UV", "The brush affects the UV rotation of the point");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
@@ -1182,12 +1260,12 @@ static void rna_def_gpencil_sculpt(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
/* lock axis */
- prop = RNA_def_property(srna, "lockaxis", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "lock_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "lock_axis");
- RNA_def_property_enum_items(prop, rna_enum_gpencil_lockaxis_items);
- RNA_def_property_ui_text(prop, "Lock", "");
+ RNA_def_property_enum_items(prop, rna_enum_gpencil_lock_axis_items);
+ RNA_def_property_ui_text(prop, "Lock Axis", "");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
- RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+ RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
/* brush */
srna = RNA_def_struct(brna, "GPencilSculptBrush", NULL);
@@ -1216,13 +1294,20 @@ static void rna_def_gpencil_sculpt(BlenderRNA *brna)
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
+ prop = RNA_def_property(srna, "use_pressure_radius", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_EDITBRUSH_FLAG_PRESSURE_RADIUS);
+ RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
+ RNA_def_property_ui_text(prop, "Radius Pressure", "Enable tablet pressure sensitivity for radius");
+ RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
+ RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
+
prop = RNA_def_property(srna, "use_falloff", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_EDITBRUSH_FLAG_USE_FALLOFF);
RNA_def_property_ui_text(prop, "Use Falloff", "Strength of brush decays with distance from cursor");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
- prop = RNA_def_property(srna, "affect_pressure", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "use_edit_pressure", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_EDITBRUSH_FLAG_SMOOTH_PRESSURE);
RNA_def_property_ui_text(prop, "Affect Pressure", "Affect pressure values as well when smoothing strokes");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
@@ -1268,6 +1353,7 @@ void RNA_def_sculpt_paint(BlenderRNA *brna)
/* *** Non-Animated *** */
RNA_define_animate_sdna(false);
rna_def_paint_curve(brna);
+ rna_def_paint_tool_slot(brna);
rna_def_paint(brna);
rna_def_sculpt(brna);
rna_def_uv_sculpt(brna);
diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c
index 096970095cd..4bf3ed6cce8 100644
--- a/source/blender/makesrna/intern/rna_sequencer.c
+++ b/source/blender/makesrna/intern/rna_sequencer.c
@@ -1363,31 +1363,37 @@ static void rna_def_strip_color_balance(BlenderRNA *brna)
static const EnumPropertyItem blend_mode_items[] = {
{SEQ_BLEND_REPLACE, "REPLACE", 0, "Replace", ""},
{SEQ_TYPE_CROSS, "CROSS", 0, "Cross", ""},
- {SEQ_TYPE_ADD, "ADD", 0, "Add", ""},
- {SEQ_TYPE_SUB, "SUBTRACT", 0, "Subtract", ""},
- {SEQ_TYPE_ALPHAOVER, "ALPHA_OVER", 0, "Alpha Over", ""},
- {SEQ_TYPE_ALPHAUNDER, "ALPHA_UNDER", 0, "Alpha Under", ""},
- {SEQ_TYPE_GAMCROSS, "GAMMA_CROSS", 0, "Gamma Cross", ""},
+ {0, "", ICON_NONE, NULL, NULL},
+ {SEQ_TYPE_DARKEN, "DARKEN", 0, "Darken", ""},
{SEQ_TYPE_MUL, "MULTIPLY", 0, "Multiply", ""},
- {SEQ_TYPE_OVERDROP, "OVER_DROP", 0, "Over Drop", ""},
+ {SEQ_TYPE_BURN, "BURN", 0, "Burn", ""},
+ {SEQ_TYPE_LINEAR_BURN, "LINEAR_BURN", 0, "Linear Burn", ""},
+ {0, "", ICON_NONE, NULL, NULL},
{SEQ_TYPE_LIGHTEN, "LIGHTEN", 0, "Lighten", ""},
- {SEQ_TYPE_DARKEN, "DARKEN", 0, "Darken", ""},
{SEQ_TYPE_SCREEN, "SCREEN", 0, "Screen", ""},
- {SEQ_TYPE_OVERLAY, "OVERLAY", 0, "Overlay", ""},
{SEQ_TYPE_DODGE, "DODGE", 0, "Dodge", ""},
- {SEQ_TYPE_BURN, "BURN", 0, "Burn", ""},
- {SEQ_TYPE_LINEAR_BURN, "LINEAR_BURN", 0, "Linear Burn", ""},
+ {SEQ_TYPE_ADD, "ADD", 0, "Add", ""},
+ {0, "", ICON_NONE, NULL, NULL},
+ {SEQ_TYPE_OVERLAY, "OVERLAY", 0, "Overlay", ""},
{SEQ_TYPE_SOFT_LIGHT, "SOFT_LIGHT", 0, "Soft Light", ""},
{SEQ_TYPE_HARD_LIGHT, "HARD_LIGHT", 0, "Hard Light", ""},
- {SEQ_TYPE_PIN_LIGHT, "PIN_LIGHT", 0, "Pin Light", ""},
- {SEQ_TYPE_LIN_LIGHT, "LINEAR_LIGHT", 0, "Linear Light", ""},
{SEQ_TYPE_VIVID_LIGHT, "VIVID_LIGHT", 0, "Vivid Light", ""},
- {SEQ_TYPE_BLEND_COLOR, "COLOR", 0, "Color", ""},
+ {SEQ_TYPE_LIN_LIGHT, "LINEAR_LIGHT", 0, "Linear Light", ""},
+ {SEQ_TYPE_PIN_LIGHT, "PIN_LIGHT", 0, "Pin Light", ""},
+ {0, "", ICON_NONE, NULL, NULL},
+ {SEQ_TYPE_DIFFERENCE, "DIFFERENCE", 0, "Difference", ""},
+ {SEQ_TYPE_EXCLUSION, "EXCLUSION", 0, "Exclusion", ""},
+ {SEQ_TYPE_SUB, "SUBTRACT", 0, "Subtract", ""},
+ {0, "", ICON_NONE, NULL, NULL},
{SEQ_TYPE_HUE, "HUE", 0, "Hue", ""},
{SEQ_TYPE_SATURATION, "SATURATION", 0, "Saturation", ""},
+ {SEQ_TYPE_BLEND_COLOR, "COLOR", 0, "Color", ""},
{SEQ_TYPE_VALUE, "VALUE", 0, "Value", ""},
- {SEQ_TYPE_DIFFERENCE, "DIFFERENCE", 0, "Difference", ""},
- {SEQ_TYPE_EXCLUSION, "EXCLUSION", 0, "Exclusion", ""},
+ {0, "", ICON_NONE, NULL, NULL},
+ {SEQ_TYPE_ALPHAOVER, "ALPHA_OVER", 0, "Alpha Over", ""},
+ {SEQ_TYPE_ALPHAUNDER, "ALPHA_UNDER", 0, "Alpha Under", ""},
+ {SEQ_TYPE_GAMCROSS, "GAMMA_CROSS", 0, "Gamma Cross", ""},
+ {SEQ_TYPE_OVERDROP, "OVER_DROP", 0, "Over Drop", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -1504,7 +1510,7 @@ static void rna_def_sequence(BlenderRNA *brna)
prop = RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_MUTE);
- RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, true);
+ RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, -1);
RNA_def_property_ui_text(prop, "Mute", "Disable strip so that it cannot be viewed in the output");
RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_mute_update");
@@ -2581,7 +2587,7 @@ static void rna_def_modifier(BlenderRNA *brna)
prop = RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQUENCE_MODIFIER_MUTE);
RNA_def_property_ui_text(prop, "Mute", "Mute this modifier");
- RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, -1);
RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_SequenceModifier_update");
prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_sequencer_api.c b/source/blender/makesrna/intern/rna_sequencer_api.c
index 509b6da2048..4c56f4c7ccd 100644
--- a/source/blender/makesrna/intern/rna_sequencer_api.c
+++ b/source/blender/makesrna/intern/rna_sequencer_api.c
@@ -48,9 +48,8 @@
#include "BLI_path_util.h" /* BLI_split_dirfile */
#include "BKE_image.h"
-#include "BKE_library.h" /* id_us_plus */
-#include "BKE_movieclip.h"
#include "BKE_mask.h"
+#include "BKE_movieclip.h"
#include "BKE_report.h"
#include "BKE_sequencer.h"
diff --git a/source/blender/makesrna/intern/rna_shader_fx.c b/source/blender/makesrna/intern/rna_shader_fx.c
index 4b77e504a38..c1bc9ba191e 100644
--- a/source/blender/makesrna/intern/rna_shader_fx.c
+++ b/source/blender/makesrna/intern/rna_shader_fx.c
@@ -52,9 +52,11 @@ const EnumPropertyItem rna_enum_object_shaderfx_type_items[] = {
{eShaderFxType_Blur, "FX_BLUR", ICON_SHADERFX, "Blur", "Apply Gaussian Blur to object" },
{eShaderFxType_Colorize, "FX_COLORIZE", ICON_SHADERFX, "Colorize", "Apply different tint effects" },
{eShaderFxType_Flip, "FX_FLIP", ICON_SHADERFX, "Flip", "Flip image" },
+ {eShaderFxType_Glow, "FX_GLOW", ICON_SHADERFX, "Glow", "Create a glow effect" },
{eShaderFxType_Light, "FX_LIGHT", ICON_SHADERFX, "Light", "Simulate ilumination" },
{eShaderFxType_Pixel, "FX_PIXEL", ICON_SHADERFX, "Pixelate", "Pixelate image"},
{eShaderFxType_Rim, "FX_RIM", ICON_SHADERFX, "Rim", "Add a rim to the image" },
+ {eShaderFxType_Shadow, "FX_SHADOW", ICON_SHADERFX, "Shadow", "Create a shadow effect"},
{eShaderFxType_Swirl, "FX_SWIRL", ICON_SHADERFX, "Swirl", "Create a rotation distortion"},
{eShaderFxType_Wave, "FX_WAVE", ICON_SHADERFX, "Wave Distortion", "Apply sinusoidal deformation"},
{0, NULL, 0, NULL, NULL}
@@ -70,6 +72,12 @@ static const EnumPropertyItem rna_enum_shaderfx_rim_modes_items[] = {
{0, NULL, 0, NULL, NULL }
};
+static const EnumPropertyItem rna_enum_shaderfx_glow_modes_items[] = {
+ {eShaderFxGlowMode_Luminance, "LUMINANCE", 0, "Luminance", "" },
+ {eShaderFxGlowMode_Color, "COLOR", 0, "Color", "" },
+ {0, NULL, 0, NULL, NULL }
+};
+
static const EnumPropertyItem rna_enum_shaderfx_colorize_modes_items[] = {
{eShaderFxColorizeMode_GrayScale, "GRAYSCALE", 0, "Gray Scale", "" },
{eShaderFxColorizeMode_Sepia, "SEPIA", 0, "Sepia", "" },
@@ -101,10 +109,14 @@ static StructRNA *rna_ShaderFx_refine(struct PointerRNA *ptr)
return &RNA_ShaderFxPixel;
case eShaderFxType_Rim:
return &RNA_ShaderFxRim;
+ case eShaderFxType_Shadow:
+ return &RNA_ShaderFxShadow;
case eShaderFxType_Swirl:
return &RNA_ShaderFxSwirl;
case eShaderFxType_Flip:
return &RNA_ShaderFxFlip;
+ case eShaderFxType_Glow:
+ return &RNA_ShaderFxGlow;
case eShaderFxType_Light:
return &RNA_ShaderFxLight;
/* Default */
@@ -149,7 +161,7 @@ static char *rna_ShaderFx_path(PointerRNA *ptr)
static void rna_ShaderFx_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
{
DEG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
- WM_main_add_notifier(NC_OBJECT | ND_MODIFIER | NC_GPENCIL, ptr->id.data);
+ WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, ptr->id.data);
}
static void rna_ShaderFx_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -180,6 +192,7 @@ static void rna_##_type##ShaderFx_##_prop##_set(PointerRNA *ptr, PointerRNA valu
}
RNA_FX_OBJECT_SET(Light, object, OB_EMPTY);
+RNA_FX_OBJECT_SET(Shadow, object, OB_EMPTY);
RNA_FX_OBJECT_SET(Swirl, object, OB_EMPTY);
#undef RNA_FX_OBJECT_SET
@@ -250,7 +263,7 @@ static void rna_def_shader_fx_colorize(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_float_sdna(prop, NULL, "high_color");
RNA_def_property_array(prop, 4);
- RNA_def_property_ui_text(prop, "Hight color", "Second color used for effect");
+ RNA_def_property_ui_text(prop, "Height color", "Second color used for effect");
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
@@ -382,6 +395,161 @@ static void rna_def_shader_fx_rim(BlenderRNA *brna)
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
}
+static void rna_def_shader_fx_shadow(BlenderRNA *brna)
+{
+ static EnumPropertyItem prop_shaderfx_shadow_type_items[] = {
+ { 0, "HORIZONTAL", 0, "Horizontal", "" },
+ { 1, "VERTICAL", 0, "Vertical", "" },
+ { 0, NULL, 0, NULL, NULL }
+ };
+
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "ShaderFxShadow", "ShaderFx");
+ RNA_def_struct_ui_text(srna, "Shadow Effect", "Shadow effect");
+ RNA_def_struct_sdna(srna, "ShadowShaderFxData");
+ RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
+
+ prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Object", "Object to determine center of rotation");
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_ShadowShaderFx_object_set", NULL, NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
+ RNA_def_property_update(prop, 0, "rna_ShaderFx_dependency_update");
+
+ prop = RNA_def_property(srna, "offset", PROP_INT, PROP_PIXEL);
+ RNA_def_property_int_sdna(prop, NULL, "offset");
+ RNA_def_property_range(prop, -INT_MAX, INT_MAX);
+ RNA_def_property_ui_text(prop, "Offset", "Offset of the shadow");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "scale");
+ RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
+ RNA_def_property_ui_text(prop, "Scale", "Offset of the shadow");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "shadow_color", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_float_sdna(prop, NULL, "shadow_rgba");
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Shadow Color", "Color used for Shadow");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "orientation", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "orientation");
+ RNA_def_property_enum_items(prop, prop_shaderfx_shadow_type_items);
+ RNA_def_property_ui_text(prop, "Orientation", "Direction of the wave");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "amplitude");
+ RNA_def_property_range(prop, 0, FLT_MAX);
+ RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of Wave");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "period", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "period");
+ RNA_def_property_range(prop, 0, FLT_MAX);
+ RNA_def_property_ui_text(prop, "Period", "Period of Wave");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "phase", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "phase");
+ RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
+ RNA_def_property_ui_text(prop, "Phase", "Phase Shift of Wave");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "rotation");
+ RNA_def_property_range(prop, DEG2RAD(-360), DEG2RAD(360));
+ RNA_def_property_ui_range(prop, DEG2RAD(-360), DEG2RAD(360), 5, 2);
+ RNA_def_property_ui_text(prop, "Rotation", "Rotation around center or object");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "blur", PROP_INT, PROP_PIXEL);
+ RNA_def_property_int_sdna(prop, NULL, "blur");
+ RNA_def_property_range(prop, 0, INT_MAX);
+ RNA_def_property_ui_text(prop, "Blur", "Number of pixels for bluring shadow (set to 0 to disable)");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "samples");
+ RNA_def_property_range(prop, 0, 32);
+ RNA_def_property_ui_range(prop, 0, 32, 2, -1);
+ RNA_def_property_int_default(prop, 4);
+ RNA_def_property_ui_text(prop, "Samples", "Number of Blur Samples (zero, disable blur)");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "use_object", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_SHADOW_USE_OBJECT);
+ RNA_def_property_ui_text(prop, "Use Object", "Use object as center of rotation");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "use_wave", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_SHADOW_USE_WAVE);
+ RNA_def_property_ui_text(prop, "Wave", "Use wave effect");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+}
+
+static void rna_def_shader_fx_glow(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "ShaderFxGlow", "ShaderFx");
+ RNA_def_struct_ui_text(srna, "Glow Effect", "Glow effect");
+ RNA_def_struct_sdna(srna, "GlowShaderFxData");
+ RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
+
+ prop = RNA_def_property(srna, "glow_color", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_float_sdna(prop, NULL, "glow_color");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Glow Color", "Color used for generated glow");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "select_color", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_float_sdna(prop, NULL, "select_color");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Select Color", "Color selected to apply glow");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "mode");
+ RNA_def_property_enum_items(prop, rna_enum_shaderfx_glow_modes_items);
+ RNA_def_property_ui_text(prop, "Mode", "Glow mode");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "threshold");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1f, 3);
+ RNA_def_property_ui_text(prop, "Threshold", "Limit to select color for glow effect");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ /* use blur fields to make compatible with blur filter, but only makes public first array element */
+ prop = RNA_def_property(srna, "radius", PROP_INT, PROP_PIXEL);
+ RNA_def_property_int_sdna(prop, NULL, "blur[0]");
+ RNA_def_property_range(prop, 0, INT_MAX);
+ RNA_def_property_ui_text(prop, "Radius", "Number of pixels for bluring glow (set to 0 to disable)");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "samples");
+ RNA_def_property_range(prop, 1, 32);
+ RNA_def_property_ui_range(prop, 1, 32, 2, -1);
+ RNA_def_property_int_default(prop, 4);
+ RNA_def_property_ui_text(prop, "Samples", "Number of Blur Samples");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "use_alpha_mode", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_GLOW_USE_ALPHA);
+ RNA_def_property_ui_text(prop, "Use Alpha", "Glow only areas with alpha");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+}
+
static void rna_def_shader_fx_swirl(BlenderRNA *brna)
{
StructRNA *srna;
@@ -502,13 +670,13 @@ void RNA_def_shader_fx(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
- RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 0);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_ON, 1);
prop = RNA_def_property(srna, "show_render", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", eShaderFxMode_Render);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
RNA_def_property_ui_text(prop, "Render", "Use effect during render");
- RNA_def_property_ui_icon(prop, ICON_SCENE, 0);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_ON, 1);
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, NULL);
prop = RNA_def_property(srna, "show_in_editmode", PROP_BOOLEAN, PROP_NONE);
@@ -529,6 +697,8 @@ void RNA_def_shader_fx(BlenderRNA *brna)
rna_def_shader_fx_wave(brna);
rna_def_shader_fx_pixel(brna);
rna_def_shader_fx_rim(brna);
+ rna_def_shader_fx_shadow(brna);
+ rna_def_shader_fx_glow(brna);
rna_def_shader_fx_swirl(brna);
rna_def_shader_fx_flip(brna);
rna_def_shader_fx_light(brna);
diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c
index dc450e566ad..b601843e388 100644
--- a/source/blender/makesrna/intern/rna_smoke.c
+++ b/source/blender/makesrna/intern/rna_smoke.c
@@ -514,6 +514,12 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}
};
+ static const EnumPropertyItem interp_method_item[] = {
+ {VOLUME_INTERP_LINEAR, "LINEAR", 0, "Linear", "Good smoothness and speed"},
+ {VOLUME_INTERP_CUBIC, "CUBIC", 0, "Cubic", "Smoothed high quality interpolation, but slower"},
+ {0, NULL, 0, NULL, NULL}
+ };
+
static const EnumPropertyItem axis_slice_position_items[] = {
{SLICE_AXIS_AUTO, "AUTO", 0, "Auto", "Adjust slice direction according to the view direction"},
{SLICE_AXIS_X, "X", 0, "X", "Slice along the X axis"},
@@ -523,8 +529,8 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
};
static const EnumPropertyItem vector_draw_items[] = {
- {VECTOR_DRAW_NEEDLE, "NEEDLE", 0, "Needle", "Draw vectors as needles"},
- {VECTOR_DRAW_STREAMLINE, "STREAMLINE", 0, "Streamlines", "Draw vectors as streamlines"},
+ {VECTOR_DRAW_NEEDLE, "NEEDLE", 0, "Needle", "Display vectors as needles"},
+ {VECTOR_DRAW_STREAMLINE, "STREAMLINE", 0, "Streamlines", "Display vectors as streamlines"},
{0, NULL, 0, NULL, NULL}
};
@@ -856,15 +862,21 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Thickness", "Thickness of smoke drawing in the viewport");
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, NULL);
- prop = RNA_def_property(srna, "draw_velocity", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "display_interpolation", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "interp_method");
+ RNA_def_property_enum_items(prop, interp_method_item);
+ RNA_def_property_ui_text(prop, "Interpolation", "Interpolation method to use for smoke/fire volumes in solid mode");
+ RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
+
+ prop = RNA_def_property(srna, "display_velocity", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw_velocity", 0);
- RNA_def_property_ui_text(prop, "Draw Velocity", "Toggle visualization of the velocity field as needles");
+ RNA_def_property_ui_text(prop, "Display Velocity", "Toggle visualization of the velocity field as needles");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
- prop = RNA_def_property(srna, "vector_draw_type", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "vector_display_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "vector_draw_type");
RNA_def_property_enum_items(prop, vector_draw_items);
- RNA_def_property_ui_text(prop, "Draw Type", "");
+ RNA_def_property_ui_text(prop, "Display Type", "");
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
prop = RNA_def_property(srna, "vector_scale", PROP_FLOAT, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 2e50111b01b..6db4aa5b404 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -71,8 +71,8 @@ const EnumPropertyItem rna_enum_space_type_items[] = {
/* General */
{0, "", ICON_NONE, "General", ""},
- {SPACE_VIEW3D, "VIEW_3D", ICON_VIEW3D, "3D View", "3D viewport"},
- {SPACE_IMAGE, "IMAGE_EDITOR", ICON_IMAGE_COL, "UV/Image Editor", "View and edit images and UV Maps"},
+ {SPACE_VIEW3D, "VIEW_3D", ICON_VIEW3D, "3D Viewport", "Manipulate objects in a 3D environment"},
+ {SPACE_IMAGE, "IMAGE_EDITOR", ICON_IMAGE, "UV/Image Editor", "View and edit images and UV Maps"},
{SPACE_NODE, "NODE_EDITOR", ICON_NODETREE, "Node Editor", "Editor for node-based shading and compositing tools"},
{SPACE_SEQ, "SEQUENCE_EDITOR", ICON_SEQUENCE, "Video Sequencer", "Video editing tools"},
{SPACE_CLIP, "CLIP_EDITOR", ICON_CLIP, "Movie Clip Editor", "Motion tracking tools"},
@@ -81,7 +81,7 @@ const EnumPropertyItem rna_enum_space_type_items[] = {
{0, "", ICON_NONE, "Animation", ""},
//{SPACE_ACTION, "TIMELINE", ICON_TIME, "Timeline", "Timeline and playback controls (NOTE: Switch to 'Timeline' mode)"}, /* XXX */
{SPACE_ACTION, "DOPESHEET_EDITOR", ICON_ACTION, "Dope Sheet", "Adjust timing of keyframes"},
- {SPACE_IPO, "GRAPH_EDITOR", ICON_IPO, "Graph Editor", "Edit drivers and keyframe interpolation"},
+ {SPACE_IPO, "GRAPH_EDITOR", ICON_GRAPH, "Graph Editor", "Edit drivers and keyframe interpolation"},
{SPACE_NLA, "NLA_EDITOR", ICON_NLA, "Nonlinear Animation", "Combine and layer Actions"},
/* Scripting */
@@ -99,16 +99,16 @@ const EnumPropertyItem rna_enum_space_type_items[] = {
/* Data */
{0, "", ICON_NONE, "Data", ""},
- {SPACE_OUTLINER, "OUTLINER", ICON_OOPS, "Outliner", "Overview of scene graph and all available data-blocks"},
- {SPACE_BUTS, "PROPERTIES", ICON_BUTS, "Properties", "Edit properties of active object and related data-blocks"},
- {SPACE_FILE, "FILE_BROWSER", ICON_FILESEL, "File Browser", "Browse for files and assets"},
+ {SPACE_OUTLINER, "OUTLINER", ICON_OUTLINER, "Outliner", "Overview of scene graph and all available data-blocks"},
+ {SPACE_BUTS, "PROPERTIES", ICON_PROPERTIES, "Properties", "Edit properties of active object and related data-blocks"},
+ {SPACE_FILE, "FILE_BROWSER", ICON_FILEBROWSER, "File Browser", "Browse for files and assets"},
{SPACE_USERPREF, "USER_PREFERENCES", ICON_PREFERENCES, "User Preferences",
"Edit persistent configuration settings"},
{0, NULL, 0, NULL, NULL}
};
const EnumPropertyItem rna_enum_space_graph_mode_items[] = {
- {SIPO_MODE_ANIMATION, "FCURVES", ICON_IPO, "Graph Editor",
+ {SIPO_MODE_ANIMATION, "FCURVES", ICON_GRAPH, "Graph Editor",
"Edit animation/keyframes displayed as 2D curves"},
{SIPO_MODE_DRIVERS, "DRIVERS", ICON_DRIVER, "Drivers", "Edit drivers"},
{0, NULL, 0, NULL, NULL}
@@ -168,7 +168,8 @@ const EnumPropertyItem rna_enum_space_action_mode_items[] = {
#undef SACT_ITEM_CACHEFILE
const EnumPropertyItem rna_enum_space_image_mode_items[] = {
- {SI_MODE_VIEW, "VIEW", ICON_FILE_IMAGE, "View", "View the image and UV edit in mesh editmode"},
+ {SI_MODE_VIEW, "VIEW", ICON_FILE_IMAGE, "View", "View the image"},
+ {SI_MODE_UV, "UV", ICON_GROUP_UVS, "UV Edit", "UV edit in mesh editmode"},
{SI_MODE_PAINT, "PAINT", ICON_TPAINT_HLT, "Paint", "2D image painting mode"},
{SI_MODE_MASK, "MASK", ICON_MOD_MASK, "Mask", "Mask editing"},
{0, NULL, 0, NULL, NULL}
@@ -209,13 +210,13 @@ static const EnumPropertyItem stereo3d_eye_items[] = {
};
#endif
-static const EnumPropertyItem draw_channels_items[] = {
+static const EnumPropertyItem display_channels_items[] = {
{SI_USE_ALPHA, "COLOR_ALPHA", ICON_IMAGE_RGB_ALPHA, "Color and Alpha",
- "Draw image with RGB colors and alpha transparency"},
- {0, "COLOR", ICON_IMAGE_RGB, "Color", "Draw image with RGB colors"},
- {SI_SHOW_ALPHA, "ALPHA", ICON_IMAGE_ALPHA, "Alpha", "Draw alpha transparency channel"},
+ "Display image with RGB colors and alpha transparency"},
+ {0, "COLOR", ICON_IMAGE_RGB, "Color", "Display image with RGB colors"},
+ {SI_SHOW_ALPHA, "ALPHA", ICON_IMAGE_ALPHA, "Alpha", "Display alpha transparency channel"},
{SI_SHOW_ZBUF, "Z_BUFFER", ICON_IMAGE_ZDEPTH, "Z-Buffer",
- "Draw Z-buffer associated with image (mapped from camera clip start to end)"},
+ "Display Z-buffer associated with image (mapped from camera clip start to end)"},
{SI_SHOW_R, "RED", ICON_COLOR_RED, "Red", ""},
{SI_SHOW_G, "GREEN", ICON_COLOR_GREEN, "Green", ""},
{SI_SHOW_B, "BLUE", ICON_COLOR_BLUE, "Blue", ""},
@@ -238,9 +239,10 @@ static const EnumPropertyItem autosnap_items[] = {
#endif
const EnumPropertyItem rna_enum_shading_type_items[] = {
- {OB_SOLID, "SOLID", ICON_SOLID, "Solid", "Display in solid mode"},
- {OB_MATERIAL, "MATERIAL", ICON_MATERIAL_DATA, "LookDev", "Display in LookDev mode"},
- {OB_RENDER, "RENDERED", ICON_SMOOTH, "Rendered", "Display render preview"},
+ {OB_WIRE, "WIREFRAME", ICON_SHADING_WIRE, "Wireframe", "Display the object as wire edges"},
+ {OB_SOLID, "SOLID", ICON_SHADING_SOLID, "Solid", "Display in solid mode"},
+ {OB_MATERIAL, "MATERIAL", ICON_SHADING_TEXTURE, "LookDev", "Display in LookDev mode"},
+ {OB_RENDER, "RENDERED", ICON_SHADING_RENDERED, "Rendered", "Display render preview"},
{0, NULL, 0, NULL, NULL}
};
@@ -273,20 +275,21 @@ const EnumPropertyItem rna_enum_clip_editor_mode_items[] = {
/* Actually populated dynamically trough 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", "Tool settings"},
+ {BCONTEXT_TOOL, "TOOL", ICON_TOOL_SETTINGS, "Tool", "Active Tool and Workspace settings"},
{BCONTEXT_SCENE, "SCENE", ICON_SCENE_DATA, "Scene", "Scene"},
{BCONTEXT_RENDER, "RENDER", ICON_SCENE, "Render", "Render"},
- {BCONTEXT_VIEW_LAYER, "VIEW_LAYER", ICON_RENDER_RESULT, "View Layer", "View layer"},
+ {BCONTEXT_OUTPUT, "OUTPUT", ICON_IMAGE_DATA, "Output", "Output"},
+ {BCONTEXT_VIEW_LAYER, "VIEW_LAYER", ICON_RENDER_RESULT, "View Layer", "View Layer"},
{BCONTEXT_WORLD, "WORLD", ICON_WORLD, "World", "World"},
{BCONTEXT_OBJECT, "OBJECT", ICON_OBJECT_DATA, "Object", "Object"},
- {BCONTEXT_CONSTRAINT, "CONSTRAINT", ICON_CONSTRAINT, "Constraints", "Object constraints"},
- {BCONTEXT_MODIFIER, "MODIFIER", ICON_MODIFIER, "Modifiers", "Object modifiers"},
- {BCONTEXT_DATA, "DATA", ICON_NONE, "Data", "Object data"},
+ {BCONTEXT_CONSTRAINT, "CONSTRAINT", ICON_CONSTRAINT, "Constraints", "Object Constraints"},
+ {BCONTEXT_MODIFIER, "MODIFIER", ICON_MODIFIER, "Modifiers", "Modifiers"},
+ {BCONTEXT_DATA, "DATA", ICON_NONE, "Data", "Object Data"},
{BCONTEXT_BONE, "BONE", ICON_BONE_DATA, "Bone", "Bone"},
- {BCONTEXT_BONE_CONSTRAINT, "BONE_CONSTRAINT", ICON_CONSTRAINT_BONE, "Bone Constraints", "Bone constraints"},
+ {BCONTEXT_BONE_CONSTRAINT, "BONE_CONSTRAINT", ICON_CONSTRAINT_BONE, "Bone Constraints", "Bone Constraints"},
{BCONTEXT_MATERIAL, "MATERIAL", ICON_MATERIAL, "Material", "Material"},
{BCONTEXT_TEXTURE, "TEXTURE", ICON_TEXTURE, "Texture", "Texture"},
- {BCONTEXT_PARTICLE, "PARTICLES", ICON_PARTICLES, "Particles", "Particle"},
+ {BCONTEXT_PARTICLE, "PARTICLES", ICON_PARTICLES, "Particles", "Particles"},
{BCONTEXT_PHYSICS, "PHYSICS", ICON_PHYSICS, "Physics", "Physics"},
{BCONTEXT_SHADERFX, "SHADERFX", ICON_SHADERFX, "Effects", "Object visual effects" },
{0, NULL, 0, NULL, NULL}
@@ -309,14 +312,6 @@ const EnumPropertyItem rna_enum_file_sort_items[] = {
{0, NULL, 0, NULL, NULL}
};
-static const EnumPropertyItem rna_enum_gpencil_grid_axis_items[] = {
- {V3D_GP_GRID_AXIS_LOCK, "LOCK", 0, "Lock", "Use current drawing locked axis" },
- {V3D_GP_GRID_AXIS_X, "X", 0, "X", ""},
- {V3D_GP_GRID_AXIS_Y, "Y", 0, "Y", ""},
- {V3D_GP_GRID_AXIS_Z, "Z", 0, "Z", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
#ifdef RNA_RUNTIME
#include "DNA_anim_types.h"
@@ -516,9 +511,12 @@ static void rna_SpaceView3D_lock_camera_and_layers_set(PointerRNA *ptr, bool val
if (value) {
Scene *scene = ED_screen_scene_find(sc, G_MAIN->wm.first);
- int bit;
+ /* TODO: restore local view. */
+#if 0
+ int bit;
v3d->lay = scene->lay;
+
/* seek for layact */
bit = 0;
while (bit < 32) {
@@ -528,6 +526,7 @@ static void rna_SpaceView3D_lock_camera_and_layers_set(PointerRNA *ptr, bool val
}
bit++;
}
+#endif
v3d->camera = scene->camera;
}
}
@@ -582,25 +581,6 @@ static float rna_View3DOverlay_GridScaleUnit_get(PointerRNA *ptr)
return ED_view3d_grid_scale(scene, v3d, NULL);
}
-static void rna_SpaceView3D_layer_set(PointerRNA *ptr, const bool *values)
-{
- View3D *v3d = (View3D *)(ptr->data);
-
- v3d->lay = ED_view3d_view_layer_set(v3d->lay, values, &v3d->layact);
-}
-
-static int rna_SpaceView3D_active_layer_get(PointerRNA *ptr)
-{
- View3D *v3d = (View3D *)(ptr->data);
-
- return (int)(log(v3d->layact) / M_LN2);
-}
-
-static void rna_SpaceView3D_layer_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *UNUSED(ptr))
-{
- DEG_on_visible_update(bmain, false);
-}
-
static PointerRNA rna_SpaceView3D_region_3d_get(PointerRNA *ptr)
{
View3D *v3d = (View3D *)(ptr->data);
@@ -704,6 +684,17 @@ static void rna_3DViewShading_type_update(Main *bmain, Scene *UNUSED(scene), Poi
return;
}
+ for (Material *ma = bmain->mat.first; ma; ma = ma->id.next) {
+ /* XXX Dependency graph does not support CD mask tracking,
+ * so we trigger materials shading for until it's properly supported.
+ * This is to ensure material batches are all recreated when switching
+ * shading type. In the future DEG should replace this and just tag
+ * the meshes itself.
+ * This hack just tag BKE_MESH_BATCH_DIRTY_SHADING for every mesh that
+ * have a material. (see T55059) */
+ DEG_id_tag_update(&ma->id, DEG_TAG_SHADING_UPDATE);
+ }
+
bScreen *screen = ptr->id.data;
for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
@@ -773,6 +764,7 @@ static const EnumPropertyItem *rna_3DViewShading_type_itemf(
EnumPropertyItem *item = NULL;
int totitem = 0;
+ RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_WIRE);
RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_SOLID);
if (BKE_scene_uses_blender_eevee(scene)) {
@@ -1068,7 +1060,7 @@ static void rna_SpaceImageEditor_image_set(PointerRNA *ptr, PointerRNA value)
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
- BLI_assert(BKE_id_is_in_gobal_main(value.data));
+ BLI_assert(BKE_id_is_in_global_main(value.data));
ED_space_image_set(G_MAIN, sima, scene, obedit, (Image *)value.data);
}
@@ -1079,7 +1071,7 @@ static void rna_SpaceImageEditor_mask_set(PointerRNA *ptr, PointerRNA value)
ED_space_image_set_mask(NULL, sima, (Mask *)value.data);
}
-static const EnumPropertyItem *rna_SpaceImageEditor_draw_channels_itemf(
+static const EnumPropertyItem *rna_SpaceImageEditor_display_channels_itemf(
bContext *UNUSED(C), PointerRNA *ptr,
PropertyRNA *UNUSED(prop), bool *r_free)
{
@@ -1097,24 +1089,24 @@ static const EnumPropertyItem *rna_SpaceImageEditor_draw_channels_itemf(
ED_space_image_release_buffer(sima, ibuf, lock);
if (alpha && zbuf)
- return draw_channels_items;
+ return display_channels_items;
if (alpha) {
- RNA_enum_items_add_value(&item, &totitem, draw_channels_items, SI_USE_ALPHA);
- RNA_enum_items_add_value(&item, &totitem, draw_channels_items, 0);
- RNA_enum_items_add_value(&item, &totitem, draw_channels_items, SI_SHOW_ALPHA);
+ RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_USE_ALPHA);
+ RNA_enum_items_add_value(&item, &totitem, display_channels_items, 0);
+ RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_SHOW_ALPHA);
}
else if (zbuf) {
- RNA_enum_items_add_value(&item, &totitem, draw_channels_items, 0);
- RNA_enum_items_add_value(&item, &totitem, draw_channels_items, SI_SHOW_ZBUF);
+ RNA_enum_items_add_value(&item, &totitem, display_channels_items, 0);
+ RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_SHOW_ZBUF);
}
else {
- RNA_enum_items_add_value(&item, &totitem, draw_channels_items, 0);
+ RNA_enum_items_add_value(&item, &totitem, display_channels_items, 0);
}
- RNA_enum_items_add_value(&item, &totitem, draw_channels_items, SI_SHOW_R);
- RNA_enum_items_add_value(&item, &totitem, draw_channels_items, SI_SHOW_G);
- RNA_enum_items_add_value(&item, &totitem, draw_channels_items, SI_SHOW_B);
+ RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_SHOW_R);
+ RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_SHOW_G);
+ RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_SHOW_B);
RNA_enum_item_end(&item, &totitem);
*r_free = true;
@@ -1207,10 +1199,10 @@ static const EnumPropertyItem *rna_SpaceImageEditor_pivot_itemf(
PropertyRNA *UNUSED(prop), bool *UNUSED(r_free))
{
static const EnumPropertyItem pivot_items[] = {
- {V3D_AROUND_CENTER_BOUNDS, "CENTER", ICON_ROTATE, "Bounding Box Center", ""},
- {V3D_AROUND_CENTER_MEAN, "MEDIAN", ICON_ROTATECENTER, "Median Point", ""},
- {V3D_AROUND_CURSOR, "CURSOR", ICON_CURSOR, "2D Cursor", ""},
- {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_ROTATECOLLECTION,
+ {V3D_AROUND_CENTER_BOUNDS, "CENTER", ICON_PIVOT_BOUNDBOX, "Bounding Box Center", ""},
+ {V3D_AROUND_CENTER_MEAN, "MEDIAN", ICON_PIVOT_MEDIAN, "Median Point", ""},
+ {V3D_AROUND_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "2D Cursor", ""},
+ {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_PIVOT_INDIVIDUAL,
"Individual Origins", "Pivot around each selected island's own median point"},
{0, NULL, 0, NULL, NULL}
};
@@ -1326,6 +1318,10 @@ static const EnumPropertyItem *rna_SpaceProperties_context_itemf(
RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_RENDER);
}
+ if (sbuts->pathflag & (1 << BCONTEXT_OUTPUT)) {
+ RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_OUTPUT);
+ }
+
if (sbuts->pathflag & (1 << BCONTEXT_VIEW_LAYER)) {
RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_VIEW_LAYER);
}
@@ -2112,10 +2108,10 @@ static void rna_FileBrowser_FSMenuRecent_active_range(PointerRNA *ptr, int *min,
#else
static const EnumPropertyItem dt_uv_items[] = {
- {SI_UVDT_OUTLINE, "OUTLINE", 0, "Outline", "Draw white edges with black outline"},
- {SI_UVDT_DASH, "DASH", 0, "Dash", "Draw dashed black-white edges"},
- {SI_UVDT_BLACK, "BLACK", 0, "Black", "Draw black edges"},
- {SI_UVDT_WHITE, "WHITE", 0, "White", "Draw white edges"},
+ {SI_UVDT_OUTLINE, "OUTLINE", 0, "Outline", "Display white edges with black outline"},
+ {SI_UVDT_DASH, "DASH", 0, "Dash", "Display dashed black-white edges"},
+ {SI_UVDT_BLACK, "BLACK", 0, "Black", "Display black edges"},
+ {SI_UVDT_WHITE, "WHITE", 0, "White", "Display white edges"},
{0, NULL, 0, NULL, NULL}
};
@@ -2162,15 +2158,15 @@ static void rna_def_space_mask_info(StructRNA *srna, int noteflag, const char *m
RNA_def_property_update(prop, noteflag, NULL);
/* mask drawing */
- prop = RNA_def_property(srna, "mask_draw_type", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "mask_display_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "mask_info.draw_type");
RNA_def_property_enum_items(prop, dt_uv_items);
- RNA_def_property_ui_text(prop, "Edge Draw Type", "Draw type for mask splines");
+ RNA_def_property_ui_text(prop, "Edge Display Type", "Display type for mask splines");
RNA_def_property_update(prop, noteflag, NULL);
prop = RNA_def_property(srna, "show_mask_smooth", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mask_info.draw_flag", MASK_DRAWFLAG_SMOOTH);
- RNA_def_property_ui_text(prop, "Draw Smooth Splines", "");
+ RNA_def_property_ui_text(prop, "Display Smooth Splines", "");
RNA_def_property_update(prop, noteflag, NULL);
prop = RNA_def_property(srna, "show_mask_overlay", PROP_BOOLEAN, PROP_NONE);
@@ -2205,13 +2201,6 @@ static void rna_def_space_image_uv(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}
};
- static const EnumPropertyItem other_uv_filter_items[] = {
- {SI_FILTER_ALL, "ALL", 0, "All", "No filter, show all islands from other objects"},
- {SI_FILTER_SAME_IMAGE, "SAME_IMAGE", ICON_IMAGE_DATA, "Same Image",
- "Only show others' UV islands whose active image matches image of the active face"},
- {0, NULL, 0, NULL, NULL}
- };
-
srna = RNA_def_struct(brna, "SpaceUVEditor", NULL);
RNA_def_struct_sdna(srna, "SpaceImage");
RNA_def_struct_nested(brna, srna, "SpaceImageEditor");
@@ -2226,48 +2215,43 @@ static void rna_def_space_image_uv(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
/* drawing */
- prop = RNA_def_property(srna, "edge_draw_type", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "edge_display_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "dt_uv");
RNA_def_property_enum_items(prop, dt_uv_items);
- RNA_def_property_ui_text(prop, "Edge Draw Type", "Draw type for drawing UV edges");
+ RNA_def_property_ui_text(prop, "Edge Display Type", "Display type for drawing UV edges");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
prop = RNA_def_property(srna, "show_smooth_edges", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_SMOOTH_UV);
- RNA_def_property_ui_text(prop, "Draw Smooth Edges", "Draw UV edges anti-aliased");
+ RNA_def_property_ui_text(prop, "Display Smooth Edges", "Display UV edges anti-aliased");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
prop = RNA_def_property(srna, "show_stretch", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAW_STRETCH);
- RNA_def_property_ui_text(prop, "Draw Stretch",
- "Draw faces colored according to the difference in shape between UVs and "
+ RNA_def_property_ui_text(prop, "Display Stretch",
+ "Display faces colored according to the difference in shape between UVs and "
"their 3D coordinates (blue for low distortion, red for high distortion)");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
- prop = RNA_def_property(srna, "draw_stretch_type", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "display_stretch_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "dt_uvstretch");
RNA_def_property_enum_items(prop, dt_uvstretch_items);
- RNA_def_property_ui_text(prop, "Draw Stretch Type", "Type of stretch to draw");
+ RNA_def_property_ui_text(prop, "Display Stretch Type", "Type of stretch to draw");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
prop = RNA_def_property(srna, "show_modified_edges", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAWSHADOW);
- RNA_def_property_ui_text(prop, "Draw Modified Edges", "Draw edges after modifiers are applied");
- RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
-
- prop = RNA_def_property(srna, "show_other_objects", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAW_OTHER);
- RNA_def_property_ui_text(prop, "Draw Other Objects", "Draw other selected objects that share the same image");
+ RNA_def_property_ui_text(prop, "Display Modified Edges", "Display edges after modifiers are applied");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
prop = RNA_def_property(srna, "show_metadata", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAW_METADATA);
- RNA_def_property_ui_text(prop, "Show Metadata", "Draw metadata properties of the image");
+ RNA_def_property_ui_text(prop, "Show Metadata", "Display metadata properties of the image");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
prop = RNA_def_property(srna, "show_texpaint", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SI_NO_DRAW_TEXPAINT);
- RNA_def_property_ui_text(prop, "Draw Texture Paint UVs", "Draw overlay of texture paint uv layer");
+ RNA_def_property_ui_text(prop, "Display Texture Paint UVs", "Display overlay of texture paint uv layer");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
prop = RNA_def_property(srna, "show_pixel_coords", PROP_BOOLEAN, PROP_NONE);
@@ -2278,7 +2262,12 @@ static void rna_def_space_image_uv(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_faces", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SI_NO_DRAWFACES);
- RNA_def_property_ui_text(prop, "Draw Faces", "Draw faces over the image");
+ RNA_def_property_ui_text(prop, "Display Faces", "Display faces over the image");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
+
+ prop = RNA_def_property(srna, "show_edges", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SI_NO_DRAWEDGES);
+ RNA_def_property_ui_text(prop, "Display Edges", "Display edges in vertex select mode");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
/* todo: move edge and face drawing options here from G.f */
@@ -2299,13 +2288,6 @@ static void rna_def_space_image_uv(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Live Unwrap",
"Continuously unwrap the selected UV island while transforming pinned vertices");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
-
- /* Other UV filtering */
- prop = RNA_def_property(srna, "other_uv_filter", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_items(prop, other_uv_filter_items);
- RNA_def_property_ui_text(prop, "Other UV filter",
- "Filter applied on the other object's UV to limit displayed");
- RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
}
static void rna_def_space_outliner(BlenderRNA *brna)
@@ -2319,7 +2301,7 @@ static void rna_def_space_outliner(BlenderRNA *brna)
{SO_SEQUENCE, "SEQUENCE", ICON_SEQUENCE, "Sequence", "Display sequence data-blocks"},
{SO_LIBRARIES, "LIBRARIES", ICON_FILE_BLEND, "Blender File", "Display data of current file and linked libraries"},
{SO_DATA_API, "DATA_API", ICON_RNA, "Data API", "Display low level Blender data and its properties"},
- {SO_ID_ORPHANS, "ORPHAN_DATA", ICON_EXTERNAL_DATA, "Orphan Data",
+ {SO_ID_ORPHANS, "ORPHAN_DATA", ICON_ORPHAN_DATA, "Orphan Data",
"Display data-blocks which are unused and/or will be lost when the file is reloaded"},
{0, NULL, 0, NULL, NULL}
};
@@ -2564,7 +2546,13 @@ static void rna_def_space_view3d_shading(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_xray", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_XRAY);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
- RNA_def_property_ui_text(prop, "X-Ray", "Show whole scene transparent");
+ RNA_def_property_ui_text(prop, "Show X-Ray", "Show whole scene transparent");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_xray_wireframe", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_XRAY_WIREFRAME);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_ui_text(prop, "Show X-Ray", "Show whole scene transparent");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
prop = RNA_def_property(srna, "xray_alpha", PROP_FLOAT, PROP_FACTOR);
@@ -2575,6 +2563,14 @@ static void rna_def_space_view3d_shading(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+ prop = RNA_def_property(srna, "xray_alpha_wireframe", PROP_FLOAT, PROP_FACTOR);
+ RNA_def_property_float_sdna(prop, NULL, "xray_alpha_wire");
+ RNA_def_property_float_default(prop, 0.5);
+ RNA_def_property_ui_text(prop, "X-Ray Alpha", "Amount of alpha to use");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
prop = RNA_def_property(srna, "use_scene_lights", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_SCENE_LIGHTS);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
@@ -2721,9 +2717,9 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Text", "Display overlay text");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
- prop = RNA_def_property(srna, "show_ornaments", PROP_BOOLEAN, PROP_NONE);
+ prop = RNA_def_property(srna, "show_extras", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_HIDE_OBJECT_XTRAS);
- RNA_def_property_ui_text(prop, "Ornaments", "Object details, including empty wire, cameras and other extras");
+ RNA_def_property_ui_text(prop, "Extras", "Object details, including empty wire, cameras and other visual guides");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
prop = RNA_def_property(srna, "show_bones", PROP_BOOLEAN, PROP_NONE);
@@ -2788,29 +2784,126 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Wire", "Use wireframe display in painting modes");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
- prop = RNA_def_property(srna, "show_occlude_wire", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_OCCLUDE_WIRE);
- RNA_def_property_ui_text(prop, "Hidden Wire", "Use hidden wireframe display in edit mode");
+ prop = RNA_def_property(srna, "show_wpaint_contours", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.wpaint_flag", V3D_OVERLAY_WPAINT_CONTOURS);
+ RNA_def_property_ui_text(prop, "Show Weight Contours", "Show contour lines formed by points with the same interpolated weight");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
prop = RNA_def_property(srna, "show_weight", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_WEIGHT);
- RNA_def_property_ui_text(prop, "Show Weights", "Draw weights in editmode");
+ RNA_def_property_ui_text(prop, "Show Weights", "Display weights in editmode");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_occlude_wire", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_OCCLUDE_WIRE);
+ RNA_def_property_ui_text(prop, "Hidden Wire", "Use hidden wireframe display");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
prop = RNA_def_property(srna, "show_face_normals", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACE_NORMALS);
- RNA_def_property_ui_text(prop, "Draw Normals", "Display face normals as lines");
+ RNA_def_property_ui_text(prop, "Display Normals", "Display face normals as lines");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
prop = RNA_def_property(srna, "show_vertex_normals", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_VERT_NORMALS);
- RNA_def_property_ui_text(prop, "Draw Vertex Normals", "Display vertex normals as lines");
+ RNA_def_property_ui_text(prop, "Display Vertex Normals", "Display vertex normals as lines");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
prop = RNA_def_property(srna, "show_split_normals", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_LOOP_NORMALS);
- RNA_def_property_ui_text(prop, "Draw Split Normals", "Display vertex-per-face normals as lines");
+ RNA_def_property_ui_text(prop, "Display Split Normals", "Display vertex-per-face normals as lines");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_edges", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_EDGES);
+ RNA_def_property_ui_text(prop, "Draw Edges",
+ "Display selected edges using highlights in the 3D view and UV editor");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_faces", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACES);
+ RNA_def_property_ui_text(prop, "Draw Faces", "Display all faces as shades in the 3D view and UV editor");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_face_center", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACE_DOT);
+ RNA_def_property_ui_text(prop, "Draw Face Center", "Display face center");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_edge_crease", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_CREASES);
+ RNA_def_property_ui_text(prop, "Draw Creases", "Display creases created for Subdivision Surface modifier");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_edge_bevel_weight", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_BWEIGHTS);
+ RNA_def_property_ui_text(prop, "Draw Bevel Weights", "Display weights created for the Bevel modifier");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_edge_seams", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_SEAMS);
+ RNA_def_property_ui_text(prop, "Draw Seams", "Display UV unwrapping seams");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_edge_sharp", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_SHARP);
+ RNA_def_property_ui_text(prop, "Draw Sharp", "Display sharp edges, used with the Edge Split modifier");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_freestyle_edge_marks", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FREESTYLE_EDGE);
+ RNA_def_property_ui_text(prop, "Draw Freestyle Edge Marks", "Display Freestyle edge marks, used with the Freestyle renderer");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_freestyle_face_marks", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FREESTYLE_FACE);
+ RNA_def_property_ui_text(prop, "Draw Freestyle Face Marks", "Display Freestyle face marks, used with the Freestyle renderer");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_statvis", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_STATVIS);
+ RNA_def_property_ui_text(prop, "Stat Vis", "Display statistical information about the mesh");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_extra_edge_length", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_EDGE_LEN);
+ RNA_def_property_ui_text(prop, "Edge Length",
+ "Display selected edge lengths, using global values when set in the transform panel");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_extra_edge_angle", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_EDGE_ANG);
+ RNA_def_property_ui_text(prop, "Edge Angle",
+ "Display selected edge angle, using global values when set in the transform panel");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_extra_face_angle", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACE_ANG);
+ RNA_def_property_ui_text(prop, "Face Angles",
+ "Display the angles in the selected edges, "
+ "using global values when set in the transform panel");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_extra_face_area", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACE_AREA);
+ RNA_def_property_ui_text(prop, "Face Area",
+ "Display the area of selected faces, "
+ "using global values when set in the transform panel");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_extra_indices", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_INDICES);
+ RNA_def_property_ui_text(prop, "Indices", "Display the index numbers of selected vertices, edges, and faces");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_curve_handles", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_CU_HANDLES);
+ RNA_def_property_ui_text(prop, "Draw Handles", "Display Bezier handles in editmode");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
+ prop = RNA_def_property(srna, "show_curve_normals", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_CU_NORMALS);
+ RNA_def_property_ui_text(prop, "Draw Normals", "Display 3D curve normals in editmode");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
prop = RNA_def_property(srna, "normals_length", PROP_FLOAT, PROP_FACTOR);
@@ -2847,7 +2940,7 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna)
prop = RNA_def_property(srna, "weight_paint_mode_opacity", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "overlay.weight_paint_mode_opacity");
- RNA_def_property_float_default(prop, 0.8f);
+ RNA_def_property_float_default(prop, 1.0f);
RNA_def_property_ui_text(prop, "Weight Paint Opacity", "Opacity of the weight paint mode overlay");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
@@ -2868,34 +2961,20 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_gpencil_grid", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_SHOW_GRID);
RNA_def_property_ui_text(prop, "Use Grid",
- "Draw a grid over grease pencil paper");
- RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
-
- prop = RNA_def_property(srna, "gpencil_grid_scale", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "overlay.gpencil_grid_scale");
- RNA_def_property_range(prop, 0.01f, FLT_MAX);
- RNA_def_property_float_default(prop, 1.0f);
- RNA_def_property_ui_text(prop, "Scale", "Grid scale");
- RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
-
- prop = RNA_def_property(srna, "gpencil_grid_lines", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "overlay.gpencil_grid_lines");
- RNA_def_property_range(prop, 1, INT_MAX);
- RNA_def_property_int_default(prop, GP_DEFAULT_GRID_LINES);
- RNA_def_property_ui_text(prop, "Subdivisions", "Number of subdivisions in each side of symmetry line");
+ "Display a grid over grease pencil paper");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
- prop = RNA_def_property(srna, "gpencil_grid_axis", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "overlay.gpencil_grid_axis");
- RNA_def_property_enum_items(prop, rna_enum_gpencil_grid_axis_items);
- RNA_def_property_ui_text(prop, "Axis", "Axis to display grid");
- RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+ prop = RNA_def_property(srna, "use_gpencil_fade_layers", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_FADE_NOACTIVE_LAYERS);
+ RNA_def_property_ui_text(prop, "Fade Layers",
+ "Toggle fading of Grease Pencil layers except the active one");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
prop = RNA_def_property(srna, "gpencil_grid_opacity", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "overlay.gpencil_grid_opacity");
RNA_def_property_range(prop, 0.1f, 1.0f);
RNA_def_property_float_default(prop, 0.9f);
- RNA_def_property_ui_text(prop, "Opacity", "Grid opacity");
+ RNA_def_property_ui_text(prop, "Opacity", "Canvas grid opacity");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
/* Paper opacity factor */
@@ -2906,21 +2985,30 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Opacity", "Paper opacity");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+ /* Paper opacity factor */
+ prop = RNA_def_property(srna, "gpencil_fade_layer", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "overlay.gpencil_fade_layer");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_float_default(prop, 0.5f);
+ RNA_def_property_ui_text(prop, "Opacity",
+ "Fade layer opacity for Grease Pencil layers except the active one");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
+
/* show edit lines */
prop = RNA_def_property(srna, "use_gpencil_edit_lines", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_SHOW_EDIT_LINES);
- RNA_def_property_ui_text(prop, "Edit Lines", "Show edit lines when edit strokes");
+ RNA_def_property_ui_text(prop, "Show Edit Lines", "Show edit lines when editing strokes");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
prop = RNA_def_property(srna, "use_gpencil_multiedit_line_only", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_SHOW_MULTIEDIT_LINES);
- RNA_def_property_ui_text(prop, "Lines Only", "Show only edit lines for additional frames");
+ RNA_def_property_ui_text(prop, "Lines Only", "Only show edit lines for additional frames");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
/* main grease pencil onion switch */
prop = RNA_def_property(srna, "use_gpencil_onion_skin", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_SHOW_ONION_SKIN);
- RNA_def_property_ui_text(prop, "Onion Skins", "Show ghosts of the frames before and after the current frame");
+ RNA_def_property_ui_text(prop, "Onion Skins", "Show ghosts of the keyframes before and after the current frame");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
/* vertex opacity */
@@ -3062,22 +3150,11 @@ static void rna_def_space_view3d(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Textured Solid", "Display face-assigned textures in solid view");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
- prop = RNA_def_property(srna, "show_occlude_wire", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag2", V3D_OCCLUDE_WIRE);
- RNA_def_property_ui_text(prop, "Hidden Wire", "Use hidden wireframe display");
- RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
-
prop = RNA_def_property(srna, "lock_camera", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag2", V3D_LOCK_CAMERA);
RNA_def_property_ui_text(prop, "Lock Camera to View", "Enable view navigation within the camera view");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
- prop = RNA_def_property(srna, "use_occlude_geometry", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_ZBUF_SELECT);
- RNA_def_property_ui_text(prop, "Occlude Geometry", "Limit selection to visible (clipped with depth buffer)");
- RNA_def_property_ui_icon(prop, ICON_ORTHO, 0);
- RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
-
prop = RNA_def_property(srna, "show_gizmo", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "gizmo_flag", V3D_GIZMO_HIDE);
RNA_def_property_ui_text(prop, "Show Gizmo", "Show gizmos of all types");
@@ -3106,30 +3183,6 @@ static void rna_def_space_view3d(BlenderRNA *brna)
RNA_def_property_ui_icon(prop, ICON_LOCKVIEW_OFF, 1);
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
- prop = RNA_def_property(srna, "layers", PROP_BOOLEAN, PROP_LAYER_MEMBER);
- RNA_def_property_boolean_sdna(prop, NULL, "lay", 1);
- RNA_def_property_array(prop, 20);
- RNA_def_property_boolean_funcs(prop, NULL, "rna_SpaceView3D_layer_set");
- RNA_def_property_ui_text(prop, "Visible Layers", "Layers visible in this 3D View");
- RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_SpaceView3D_layer_update");
-
- prop = RNA_def_property(srna, "active_layer", PROP_INT, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
- RNA_def_property_int_funcs(prop, "rna_SpaceView3D_active_layer_get", NULL, NULL);
- RNA_def_property_ui_text(prop, "Active Layer", "Active 3D view layer index");
-
- prop = RNA_def_property(srna, "layers_local_view", PROP_BOOLEAN, PROP_LAYER_MEMBER);
- RNA_def_property_boolean_sdna(prop, NULL, "lay", 0x01000000);
- RNA_def_property_array(prop, 8);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Local View Layers", "Local view layers visible in this 3D View");
-
- prop = RNA_def_property(srna, "layers_used", PROP_BOOLEAN, PROP_LAYER_MEMBER);
- RNA_def_property_boolean_sdna(prop, NULL, "lay_used", 1);
- RNA_def_property_array(prop, 20);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Used Layers", "Layers that contain something");
-
prop = RNA_def_property(srna, "region_3d", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "RegionView3D");
RNA_def_property_pointer_funcs(prop, "rna_SpaceView3D_region_3d_get", NULL, NULL, NULL);
@@ -3148,14 +3201,14 @@ static void rna_def_space_view3d(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Reconstruction", "Display reconstruction data from active movie clip");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
- prop = RNA_def_property(srna, "tracks_draw_size", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "tracks_display_size", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 5, 1, 3);
RNA_def_property_float_sdna(prop, NULL, "bundle_size");
RNA_def_property_ui_text(prop, "Tracks Size", "Display size of tracks from reconstructed data");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
- prop = RNA_def_property(srna, "tracks_draw_type", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "tracks_display_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "bundle_drawtype");
RNA_def_property_enum_items(prop, bundle_drawtype_items);
RNA_def_property_ui_text(prop, "Tracks Display Type", "Viewport display style for tracks");
@@ -3407,7 +3460,7 @@ static void rna_def_space_buttons(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "mainb");
RNA_def_property_enum_items(prop, buttons_context_items);
RNA_def_property_enum_funcs(prop, NULL, "rna_SpaceProperties_context_set", "rna_SpaceProperties_context_itemf");
- RNA_def_property_ui_text(prop, "Context", "Type of active data to display and edit");
+ RNA_def_property_ui_text(prop, "Context", "");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_PROPERTIES, "rna_SpaceProperties_context_update");
/* pinned data */
@@ -3475,7 +3528,7 @@ static void rna_def_space_image(BlenderRNA *brna)
/* image draw */
prop = RNA_def_property(srna, "show_repeat", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAW_TILE);
- RNA_def_property_ui_text(prop, "Draw Repeated", "Draw the image repeated outside of the main view");
+ RNA_def_property_ui_text(prop, "Display Repeated", "Display the image repeated outside of the main view");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
prop = RNA_def_property(srna, "show_annotation", PROP_BOOLEAN, PROP_NONE);
@@ -3484,11 +3537,11 @@ static void rna_def_space_image(BlenderRNA *brna)
"Show annotations for this view");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
- prop = RNA_def_property(srna, "draw_channels", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "display_channels", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
- RNA_def_property_enum_items(prop, draw_channels_items);
- RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_SpaceImageEditor_draw_channels_itemf");
- RNA_def_property_ui_text(prop, "Draw Channels", "Channels of the image to draw");
+ RNA_def_property_enum_items(prop, display_channels_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_SpaceImageEditor_display_channels_itemf");
+ RNA_def_property_ui_text(prop, "Display Channels", "Channels of the image to draw");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
prop = RNA_def_property(srna, "show_stereo_3d", PROP_BOOLEAN, PROP_NONE);
@@ -3576,7 +3629,7 @@ static void rna_def_space_sequencer(BlenderRNA *brna)
static const EnumPropertyItem view_type_items[] = {
{SEQ_VIEW_SEQUENCE, "SEQUENCER", ICON_SEQ_SEQUENCER, "Sequencer", ""},
- {SEQ_VIEW_PREVIEW, "PREVIEW", ICON_SEQ_PREVIEW, "Image Preview", ""},
+ {SEQ_VIEW_PREVIEW, "PREVIEW", ICON_SEQ_PREVIEW, "Preview", ""},
{SEQ_VIEW_SEQUENCE_PREVIEW, "SEQUENCER_PREVIEW", ICON_SEQ_SPLITVIEW, "Sequencer/Preview", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -3609,12 +3662,12 @@ static void rna_def_space_sequencer(BlenderRNA *brna)
static const EnumPropertyItem preview_channels_items[] = {
{SEQ_USE_ALPHA, "COLOR_ALPHA", ICON_IMAGE_RGB_ALPHA, "Color and Alpha",
- "Draw image with RGB colors and alpha transparency"},
- {0, "COLOR", ICON_IMAGE_RGB, "Color", "Draw image with RGB colors"},
+ "Display image with RGB colors and alpha transparency"},
+ {0, "COLOR", ICON_IMAGE_RGB, "Color", "Display image with RGB colors"},
{0, NULL, 0, NULL, NULL}
};
- static const EnumPropertyItem waveform_type_draw_items[] = {
+ static const EnumPropertyItem waveform_type_display_items[] = {
{SEQ_NO_WAVEFORMS, "NO_WAVEFORMS", 0, "Waveforms Off",
"No waveforms drawn for any sound strips"},
{SEQ_ALL_WAVEFORMS, "ALL_WAVEFORMS", 0, "Waveforms On",
@@ -3651,7 +3704,7 @@ static void rna_def_space_sequencer(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_frames", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_DRAWFRAMES);
- RNA_def_property_ui_text(prop, "Draw Frames", "Draw frames rather than seconds");
+ RNA_def_property_ui_text(prop, "Display Frames", "Display frames rather than seconds");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, NULL);
prop = RNA_def_property(srna, "use_marker_sync", PROP_BOOLEAN, PROP_NONE);
@@ -3700,16 +3753,16 @@ static void rna_def_space_sequencer(BlenderRNA *brna)
prop = RNA_def_property(srna, "preview_channels", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
RNA_def_property_enum_items(prop, preview_channels_items);
- RNA_def_property_ui_text(prop, "Draw Channels", "Channels of the preview to draw");
+ RNA_def_property_ui_text(prop, "Display Channels", "Channels of the preview to draw");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, NULL);
- prop = RNA_def_property(srna, "waveform_draw_type", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "waveform_display_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
- RNA_def_property_enum_items(prop, waveform_type_draw_items);
- RNA_def_property_ui_text(prop, "Waveform Drawing", "How Waveforms are drawn");
+ RNA_def_property_enum_items(prop, waveform_type_display_items);
+ RNA_def_property_ui_text(prop, "Waveform Displaying", "How Waveforms are drawn");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, NULL);
- prop = RNA_def_property(srna, "draw_overexposed", PROP_INT, PROP_NONE);
+ prop = RNA_def_property(srna, "show_overexposed", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "zebra");
RNA_def_property_ui_text(prop, "Show Overexposed", "Show overexposed areas with zebra stripes");
RNA_def_property_range(prop, 0, 110);
@@ -3719,7 +3772,7 @@ static void rna_def_space_sequencer(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "render_size");
RNA_def_property_enum_items(prop, proxy_render_size_items);
RNA_def_property_ui_text(prop, "Proxy Render Size",
- "Draw preview using full resolution or different proxy resolutions");
+ "Display preview using full resolution or different proxy resolutions");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, NULL);
/* grease pencil */
@@ -3769,19 +3822,19 @@ static void rna_def_space_text(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "wordwrap", 0);
RNA_def_property_boolean_funcs(prop, NULL, "rna_SpaceTextEditor_word_wrap_set");
RNA_def_property_ui_text(prop, "Word Wrap", "Wrap words if there is not enough horizontal space");
- RNA_def_property_ui_icon(prop, ICON_WORDWRAP_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_WORDWRAP_ON, 0);
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_TEXT, NULL);
prop = RNA_def_property(srna, "show_line_numbers", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "showlinenrs", 0);
RNA_def_property_ui_text(prop, "Line Numbers", "Show line numbers next to the text");
- RNA_def_property_ui_icon(prop, ICON_LINENUMBERS_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_LINENUMBERS_ON, 0);
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_TEXT, NULL);
prop = RNA_def_property(srna, "show_syntax_highlight", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "showsyntax", 0);
RNA_def_property_ui_text(prop, "Syntax Highlight", "Syntax highlight for scripting");
- RNA_def_property_ui_icon(prop, ICON_SYNTAX_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_SYNTAX_ON, 0);
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_TEXT, NULL);
prop = RNA_def_property(srna, "show_line_highlight", PROP_BOOLEAN, PROP_NONE);
@@ -3923,10 +3976,22 @@ static void rna_def_space_dopesheet(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_group_colors", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SACTION_NODRAWGCOLORS);
RNA_def_property_ui_text(prop, "Show Group Colors",
- "Draw groups and channels with colors matching their corresponding groups "
+ "Display groups and channels with colors matching their corresponding groups "
"(pose bones only currently)");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_DOPESHEET, NULL);
+ prop = RNA_def_property(srna, "show_interpolation", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SACTION_SHOW_INTERPOLATION);
+ RNA_def_property_ui_text(prop, "Show Handles And Interpolation",
+ "Display keyframe handle types and non-bezier interpolation modes");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_DOPESHEET, NULL);
+
+ prop = RNA_def_property(srna, "show_extremes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SACTION_SHOW_EXTREMES);
+ RNA_def_property_ui_text(prop, "Show Curve Extremes",
+ "Mark keyframes where the key value flow changes direction, based on comparison with adjacent keys");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_DOPESHEET, NULL);
+
/* editing */
prop = RNA_def_property(srna, "use_auto_merge_keyframes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SACTION_NOTRANSKEYCULL);
@@ -4000,9 +4065,9 @@ static void rna_def_space_graph(BlenderRNA *brna)
/* this is basically the same as the one for the 3D-View, but with some entries omitted */
static const EnumPropertyItem gpivot_items[] = {
- {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_ROTATE, "Bounding Box Center", ""},
- {V3D_AROUND_CURSOR, "CURSOR", ICON_CURSOR, "2D Cursor", ""},
- {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_ROTATECOLLECTION, "Individual Centers", ""},
+ {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_PIVOT_BOUNDBOX, "Bounding Box Center", ""},
+ {V3D_AROUND_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "2D Cursor", ""},
+ {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_PIVOT_INDIVIDUAL, "Individual Centers", ""},
/*{V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", 0, "Median Point", ""}, */
/*{V3D_AROUND_ACTIVE, "ACTIVE_ELEMENT", 0, "Active Element", ""}, */
{0, NULL, 0, NULL, NULL}
@@ -4057,15 +4122,15 @@ static void rna_def_space_graph(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_beauty_drawing", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SIPO_BEAUTYDRAW_OFF);
- RNA_def_property_ui_text(prop, "Use High Quality Drawing",
- "Draw F-Curves using Anti-Aliasing and other fancy effects "
+ RNA_def_property_ui_text(prop, "Use High Quality Display",
+ "Display F-Curves using Anti-Aliasing and other fancy effects "
"(disable for better performance)");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_GRAPH, NULL);
prop = RNA_def_property(srna, "show_group_colors", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SIPO_NODRAWGCOLORS);
RNA_def_property_ui_text(prop, "Show Group Colors",
- "Draw groups and channels with colors matching their corresponding groups");
+ "Display groups and channels with colors matching their corresponding groups");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_GRAPH, NULL);
/* editing */
@@ -4751,9 +4816,9 @@ static void rna_def_space_node(BlenderRNA *brna)
static const EnumPropertyItem backdrop_channels_items[] = {
{SNODE_USE_ALPHA, "COLOR_ALPHA", ICON_IMAGE_RGB_ALPHA, "Color and Alpha",
- "Draw image with RGB colors and alpha transparency"},
- {0, "COLOR", ICON_IMAGE_RGB, "Color", "Draw image with RGB colors"},
- {SNODE_SHOW_ALPHA, "ALPHA", ICON_IMAGE_ALPHA, "Alpha", "Draw alpha transparency channel"},
+ "Display image with RGB colors and alpha transparency"},
+ {0, "COLOR", ICON_IMAGE_RGB, "Color", "Display image with RGB colors"},
+ {SNODE_SHOW_ALPHA, "ALPHA", ICON_IMAGE_ALPHA, "Alpha", "Display alpha transparency channel"},
{SNODE_SHOW_R, "RED", ICON_COLOR_RED, "Red", ""},
{SNODE_SHOW_G, "GREEN", ICON_COLOR_GREEN, "Green", ""},
{SNODE_SHOW_B, "BLUE", ICON_COLOR_BLUE, "Blue", ""},
@@ -4860,7 +4925,7 @@ static void rna_def_space_node(BlenderRNA *brna)
prop = RNA_def_property(srna, "backdrop_channels", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
RNA_def_property_enum_items(prop, backdrop_channels_items);
- RNA_def_property_ui_text(prop, "Draw Channels", "Channels of the image to draw");
+ 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 */
@@ -4894,7 +4959,7 @@ static void rna_def_space_clip(BlenderRNA *brna)
static const EnumPropertyItem view_items[] = {
{SC_VIEW_CLIP, "CLIP", ICON_SEQUENCE, "Clip", "Show editing clip preview"},
- {SC_VIEW_GRAPH, "GRAPH", ICON_IPO, "Graph", "Show graph view for active element"},
+ {SC_VIEW_GRAPH, "GRAPH", ICON_GRAPH, "Graph", "Show graph view for active element"},
{SC_VIEW_DOPESHEET, "DOPESHEET", ICON_ACTION, "Dopesheet", "Dopesheet view for tracking data"},
{0, NULL, 0, NULL, NULL}
};
@@ -4906,12 +4971,12 @@ static void rna_def_space_clip(BlenderRNA *brna)
};
static const EnumPropertyItem pivot_items[] = {
- {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_ROTATE, "Bounding Box Center",
+ {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_PIVOT_BOUNDBOX, "Bounding Box Center",
"Pivot around bounding box center of selected object(s)"},
- {V3D_AROUND_CURSOR, "CURSOR", ICON_CURSOR, "2D Cursor", "Pivot around the 2D cursor"},
- {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_ROTATECOLLECTION,
+ {V3D_AROUND_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "2D Cursor", "Pivot around the 2D cursor"},
+ {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_CENTER_ONLY,
"Individual Origins", "Pivot around each object's own origin"},
- {V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", ICON_ROTATECENTER, "Median Point",
+ {V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", ICON_PIVOT_MEDIAN, "Median Point",
"Pivot around the median point of selected objects"},
{0, NULL, 0, NULL, NULL}
};
diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c
index 07fd20c6fc5..e9ef4bf7a8c 100644
--- a/source/blender/makesrna/intern/rna_texture.c
+++ b/source/blender/makesrna/intern/rna_texture.c
@@ -82,21 +82,26 @@ const EnumPropertyItem rna_enum_texture_type_items[] = {
#ifndef RNA_RUNTIME
static const EnumPropertyItem blend_type_items[] = {
{MTEX_BLEND, "MIX", 0, "Mix", ""},
- {MTEX_ADD, "ADD", 0, "Add", ""},
- {MTEX_SUB, "SUBTRACT", 0, "Subtract", ""},
+ {0, "", ICON_NONE, NULL, NULL},
+ {MTEX_DARK, "DARKEN", 0, "Darken", ""},
{MTEX_MUL, "MULTIPLY", 0, "Multiply", ""},
+ {0, "", ICON_NONE, NULL, NULL},
+ {MTEX_LIGHT, "LIGHTEN", 0, "Lighten", ""},
{MTEX_SCREEN, "SCREEN", 0, "Screen", ""},
+ {MTEX_ADD, "ADD", 0, "Add", ""},
+ {0, "", ICON_NONE, NULL, NULL},
{MTEX_OVERLAY, "OVERLAY", 0, "Overlay", ""},
+ {MTEX_SOFT_LIGHT, "SOFT_LIGHT", 0, "Soft Light", ""},
+ {MTEX_LIN_LIGHT, "LINEAR_LIGHT", 0, "Linear Light", ""},
+ {0, "", ICON_NONE, NULL, NULL},
{MTEX_DIFF, "DIFFERENCE", 0, "Difference", ""},
+ {MTEX_SUB, "SUBTRACT", 0, "Subtract", ""},
{MTEX_DIV, "DIVIDE", 0, "Divide", ""},
- {MTEX_DARK, "DARKEN", 0, "Darken", ""},
- {MTEX_LIGHT, "LIGHTEN", 0, "Lighten", ""},
+ {0, "", ICON_NONE, NULL, NULL},
{MTEX_BLEND_HUE, "HUE", 0, "Hue", ""},
{MTEX_BLEND_SAT, "SATURATION", 0, "Saturation", ""},
- {MTEX_BLEND_VAL, "VALUE", 0, "Value", ""},
{MTEX_BLEND_COLOR, "COLOR", 0, "Color", ""},
- {MTEX_SOFT_LIGHT, "SOFT_LIGHT", 0, "Soft Light", ""},
- {MTEX_LIN_LIGHT, "LINEAR_LIGHT", 0, "Linear Light", ""},
+ {MTEX_BLEND_VAL, "VALUE", 0, "Value", ""},
{0, NULL, 0, NULL, NULL}
};
#endif
diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c
index a271df464b7..9d395f3ec9b 100644
--- a/source/blender/makesrna/intern/rna_ui.c
+++ b/source/blender/makesrna/intern/rna_ui.c
@@ -28,6 +28,7 @@
#include <stdlib.h>
#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
#include "BLT_translation.h"
@@ -41,6 +42,7 @@
#include "UI_interface.h"
#include "WM_types.h"
+#include "WM_toolsystem.h"
/* see WM_types.h */
const EnumPropertyItem rna_enum_operator_context_items[] = {
@@ -113,7 +115,7 @@ static bool panel_poll(const bContext *C, PanelType *pt)
ParameterList list;
FunctionRNA *func;
void *ret;
- int visible;
+ bool visible;
RNA_pointer_create(NULL, pt->ext.srna, NULL, &ptr); /* dummy */
func = &rna_Panel_poll_func; /* RNA_struct_find_function(&ptr, "poll"); */
@@ -202,11 +204,16 @@ static void rna_Panel_unregister(Main *UNUSED(bmain), StructRNA *type)
BLI_freelinkN(&pt->parent->children, link);
}
+ WM_paneltype_remove(pt);
+
+ for (LinkData *link = pt->children.first; link; link = link->next) {
+ PanelType *child_pt = link->data;
+ child_pt->parent = NULL;
+ }
+
BLI_freelistN(&pt->children);
BLI_freelinkN(&art->paneltypes, pt);
- WM_paneltype_remove(pt);
-
/* update while blender is running */
WM_main_add_notifier(NC_WINDOW, NULL);
}
@@ -238,9 +245,20 @@ static StructRNA *rna_Panel_register(
return NULL;
}
- if ((dummypt.category[0] == '\0') && (dummypt.region_type == RGN_TYPE_TOOLS)) {
- /* Use a fallback, otherwise an empty value will draw the panel in every category. */
- strcpy(dummypt.category, PNL_CATEGORY_FALLBACK);
+ if ((1 << dummypt.region_type) & RGN_TYPE_HAS_CATEGORY_MASK) {
+ if (dummypt.category[0] == '\0') {
+ /* Use a fallback, otherwise an empty value will draw the panel in every category. */
+ strcpy(dummypt.category, PNL_CATEGORY_FALLBACK);
+ }
+ }
+ else {
+ if (dummypt.category[0] != '\0') {
+ if ((1 << dummypt.space_type) & WM_TOOLSYSTEM_SPACE_MASK) {
+ BKE_reportf(reports, RPT_ERROR, "Registering panel class: '%s' has category '%s' ",
+ dummypt.idname, dummypt.category);
+ return NULL;
+ }
+ }
}
if (!(art = region_type_find(reports, dummypt.space_type, dummypt.region_type)))
@@ -373,7 +391,7 @@ static void uilist_draw_item(uiList *ui_list, bContext *C, uiLayout *layout, Poi
RNA_parameter_list_free(&list);
}
-static void uilist_draw_filter(uiList *ui_list, bContext *C, uiLayout *layout)
+static void uilist_draw_filter(uiList *ui_list, bContext *C, uiLayout *layout, bool reverse)
{
extern FunctionRNA rna_UIList_draw_filter_func;
@@ -387,6 +405,7 @@ static void uilist_draw_filter(uiList *ui_list, bContext *C, uiLayout *layout)
RNA_parameter_list_create(&list, &ul_ptr, func);
RNA_parameter_set_lookup(&list, "context", &C);
RNA_parameter_set_lookup(&list, "layout", &layout);
+ RNA_parameter_set_lookup(&list, "reverse", &reverse);
ui_list->type->ext.call((bContext *)C, &ul_ptr, func, &list);
RNA_parameter_list_free(&list);
@@ -947,6 +966,26 @@ static void rna_UILayout_scale_y_set(PointerRNA *ptr, float value)
uiLayoutSetScaleY(ptr->data, value);
}
+static float rna_UILayout_units_x_get(PointerRNA *ptr)
+{
+ return uiLayoutGetUnitsX(ptr->data);
+}
+
+static void rna_UILayout_units_x_set(PointerRNA *ptr, float value)
+{
+ uiLayoutSetUnitsX(ptr->data, value);
+}
+
+static float rna_UILayout_units_y_get(PointerRNA *ptr)
+{
+ return uiLayoutGetUnitsY(ptr->data);
+}
+
+static void rna_UILayout_units_y_set(PointerRNA *ptr, float value)
+{
+ uiLayoutSetUnitsY(ptr->data, value);
+}
+
static int rna_UILayout_emboss_get(PointerRNA *ptr)
{
return uiLayoutGetEmboss(ptr->data);
@@ -1036,6 +1075,14 @@ static void rna_def_ui_layout(BlenderRNA *brna)
prop = RNA_def_property(srna, "scale_y", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_funcs(prop, "rna_UILayout_scale_y_get", "rna_UILayout_scale_y_set", NULL);
RNA_def_property_ui_text(prop, "Scale Y", "Scale factor along the Y for items in this (sub)layout");
+
+ prop = RNA_def_property(srna, "ui_units_x", PROP_FLOAT, PROP_UNSIGNED);
+ RNA_def_property_float_funcs(prop, "rna_UILayout_units_x_get", "rna_UILayout_units_x_set", NULL);
+ RNA_def_property_ui_text(prop, "Units X", "Fixed Size along the X for items in this (sub)layout");
+
+ prop = RNA_def_property(srna, "ui_units_y", PROP_FLOAT, PROP_UNSIGNED);
+ RNA_def_property_float_funcs(prop, "rna_UILayout_units_y_get", "rna_UILayout_units_y_set", NULL);
+ RNA_def_property_ui_text(prop, "Units Y", "Fixed Size along the Y for items in this (sub)layout");
RNA_api_ui_layout(srna);
prop = RNA_def_property(srna, "emboss", PROP_ENUM, PROP_NONE);
@@ -1274,6 +1321,7 @@ static void rna_def_uilist(BlenderRNA *brna)
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
parm = RNA_def_pointer(func, "layout", "UILayout", "", "Layout to draw the item");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+ RNA_def_boolean(func, "reverse", false, "", "Display items in reverse order");
/* filter */
func = RNA_def_function(srna, "filter_items", NULL);
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index bafc7dc69c1..4d361920dcb 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -47,16 +47,14 @@
#include "rna_internal.h"
-#define DEF_ICON_BLANK_SKIP
#define DEF_ICON(name) {ICON_##name, (#name), 0, (#name), ""},
-#define DEF_VICO(name) {VICO_##name, (#name), 0, (#name), ""},
+#define DEF_ICON_VECTOR(name) {ICON_##name, (#name), 0, (#name), ""},
+#define DEF_ICON_COLOR(name) {ICON_##name, (#name), 0, (#name), ""},
+#define DEF_ICON_BLANK(name)
const EnumPropertyItem rna_enum_icon_items[] = {
#include "UI_icons.h"
{0, NULL, 0, NULL, NULL}
};
-#undef DEF_ICON_BLANK_SKIP
-#undef DEF_ICON
-#undef DEF_VICO
#ifdef RNA_RUNTIME
@@ -142,6 +140,25 @@ static void rna_uiItemMenuEnumR(
uiItemMenuEnumR_prop(layout, ptr, prop, name, icon);
}
+static void rna_uiItemTabsEnumR(
+ uiLayout *layout, bContext *C,
+ struct PointerRNA *ptr, const char *propname,
+ bool icon_only)
+{
+ PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
+
+ if (!prop) {
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
+ return;
+ }
+ if (RNA_property_type(prop) != PROP_ENUM) {
+ RNA_warning("property is not an enum: %s.%s", RNA_struct_identifier(ptr->type), propname);
+ return;
+ }
+
+ uiItemTabsEnumR_prop(layout, C, ptr, prop, icon_only);
+}
+
static void rna_uiItemEnumR_string(
uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *value,
const char *name, const char *text_ctxt, bool translate, int icon)
@@ -619,6 +636,11 @@ void RNA_api_ui_layout(StructRNA *srna)
api_ui_item_rna_common(func);
api_ui_item_common(func);
+ func = RNA_def_function(srna, "prop_tabs_enum", "rna_uiItemTabsEnumR");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+ api_ui_item_rna_common(func);
+ RNA_def_boolean(func, "icon_only", false, "", "Draw only icons in tabs, no text");
+
func = RNA_def_function(srna, "prop_enum", "rna_uiItemEnumR_string");
api_ui_item_rna_common(func);
parm = RNA_def_string(func, "value", NULL, 0, "", "Enum property value");
@@ -738,8 +760,12 @@ void RNA_api_ui_layout(StructRNA *srna)
parm = RNA_def_string(func, "category", NULL, 0, "", "panel type category");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
- func = RNA_def_function(srna, "separator", "uiItemS");
+ func = RNA_def_function(srna, "separator", "uiItemS_ex");
RNA_def_function_ui_description(func, "Item. Inserts empty space into the layout between items");
+ RNA_def_float(
+ func, "factor", 1.0f, 0.0f, FLT_MAX, "Percentage",
+ "Percentage of width to space (leave unset for default space)",
+ 0.0f, FLT_MAX);
func = RNA_def_function(srna, "separator_spacer", "uiItemSpacer");
RNA_def_function_ui_description(func, "Item. Inserts horizontal spacing empty space into the layout between items");
@@ -776,6 +802,7 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_int(func, "cols", 0, 0, INT_MAX, "Number of thumbnail preview columns to display", "", 0, INT_MAX);
RNA_def_enum(func, "filter", id_template_filter_items, UI_TEMPLATE_ID_FILTER_ALL,
"", "Optionally limit the items which can be selected");
+ RNA_def_boolean(func, "hide_buttons", false, "", "Show only list, no buttons");
func = RNA_def_function(srna, "template_any_ID", "rna_uiTemplateAnyID");
parm = RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property");
@@ -791,7 +818,6 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
api_ui_item_rna_common(func);
RNA_def_string(func, "new", NULL, 0, "", "Operator identifier to create a new ID block");
- RNA_def_string(func, "open", NULL, 0, "", "Operator identifier to open a file for creating a new ID block");
RNA_def_string(func, "menu", NULL, 0, "", "Context menu identifier");
RNA_def_enum(func, "filter", id_template_filter_items, UI_TEMPLATE_ID_FILTER_ALL,
"", "Optionally limit the items which can be selected");
@@ -1027,6 +1053,7 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_int(func, "maxrows", 5, 0, INT_MAX, "", "Default maximum number of rows to display", 0, INT_MAX);
RNA_def_enum(func, "type", rna_enum_uilist_layout_type_items, UILST_LAYOUT_DEFAULT, "Type", "Type of layout to use");
RNA_def_int(func, "columns", 9, 0, INT_MAX, "", "Number of items to display per row, for GRID layout", 0, INT_MAX);
+ RNA_def_boolean(func, "reverse", false, "", "Display items in reverse order");
func = RNA_def_function(srna, "template_running_jobs", "uiTemplateRunningJobs");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
@@ -1104,6 +1131,12 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_function_ui_description(func, "Item(s). User interface for selecting cache files and their source paths");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
api_ui_item_rna_common(func);
+
+ func = RNA_def_function(srna, "template_recent_files", "uiTemplateRecentFiles");
+ RNA_def_function_ui_description(func, "Show list of recently saved .blend files");
+ RNA_def_int(func, "rows", 5, 1, INT_MAX, "", "Maximum number of items to show", 1, INT_MAX);
+ parm = RNA_def_int(func, "found", 0, 0, INT_MAX, "", "Number of items drawn", 0, INT_MAX);
+ RNA_def_function_return(func, parm);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 9db7b0b807c..1ea5c164449 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -100,7 +100,6 @@ static const EnumPropertyItem rna_enum_studio_light_orientation_items[] = {
#include "DNA_screen_types.h"
#include "BKE_blender.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
#include "BKE_idprop.h"
#include "BKE_main.h"
@@ -329,9 +328,6 @@ static void rna_UserDef_weight_color_update(Main *bmain, Scene *scene, PointerRN
{
Object *ob;
- bTheme *btheme = UI_GetTheme();
- BKE_mesh_runtime_color_band_store((U.flag & USER_CUSTOM_RANGE) ? (&U.coba_weight) : NULL, btheme->tv3d.vertex_unreferenced);
-
for (ob = bmain->object.first; ob; ob = ob->id.next) {
if (ob->mode & OB_MODE_WEIGHT_PAINT)
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
@@ -468,11 +464,7 @@ static void rna_userdef_opensubdiv_update(Main *bmain, Scene *UNUSED(scene), Poi
object;
object = object->id.next)
{
- if (object->derivedFinal != NULL &&
- object->derivedFinal->type == DM_TYPE_CCGDM)
- {
- DEG_id_tag_update(&object->id, OB_RECALC_OB);
- }
+ DEG_id_tag_update(&object->id, OB_RECALC_OB);
}
}
@@ -494,6 +486,13 @@ static const EnumPropertyItem *rna_userdef_audio_device_itemf(bContext *UNUSED(C
RNA_enum_item_add(&item, &totitem, &new_item);
}
+#ifndef NDEBUG
+ if (i == 0) {
+ EnumPropertyItem new_item = {i, "SOUND_NONE", 0, "No Sound", ""};
+ RNA_enum_item_add(&item, &totitem, &new_item);
+ }
+#endif
+
/* may be unused */
UNUSED_VARS(index, audio_device_items);
@@ -1230,6 +1229,37 @@ static void rna_def_userdef_theme_ui(BlenderRNA *brna)
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Gizmo B", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ /* Icon colors. */
+ prop = RNA_def_property(srna, "icon_collection", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "icon_collection");
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Collection", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop = RNA_def_property(srna, "icon_object", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "icon_object");
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Object", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop = RNA_def_property(srna, "icon_object_data", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "icon_object_data");
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Object Data", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop = RNA_def_property(srna, "icon_modifier", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "icon_modifier");
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Modifier", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop = RNA_def_property(srna, "icon_shading", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "icon_shading");
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Shading", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_common(StructRNA *srna)
@@ -1295,6 +1325,11 @@ static void rna_def_userdef_theme_space_common(StructRNA *srna)
RNA_def_property_ui_text(prop, "Region Text Highlight", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
+ prop = RNA_def_property(srna, "navigation_bar", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Navigation Bar Background", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
/* tabs */
prop = RNA_def_property(srna, "tab_active", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
@@ -1698,7 +1733,7 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna)
/* General Viewport options */
prop = RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
- RNA_def_property_array(prop, 3);
+ RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Grid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -1945,6 +1980,12 @@ static void rna_def_userdef_theme_space_graph(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Active Channel Group", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
+ prop = RNA_def_property(srna, "preview_range", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "anim_preview_range");
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Preview Range", "Color of preview range overlay");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
rna_def_userdef_theme_spaces_vertex(srna);
rna_def_userdef_theme_spaces_curves(srna, false, true, true, true);
}
@@ -2673,51 +2714,51 @@ static void rna_def_userdef_theme_space_action(BlenderRNA *brna)
prop = RNA_def_property(srna, "dopesheet_channel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "ds_channel");
- RNA_def_property_array(prop, 3);
+ RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Dope Sheet Channel", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
prop = RNA_def_property(srna, "dopesheet_subchannel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "ds_subchannel");
- RNA_def_property_array(prop, 3);
+ RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Dope Sheet Sub-Channel", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
prop = RNA_def_property(srna, "channels", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade2");
- RNA_def_property_array(prop, 3);
+ RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Channels", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
prop = RNA_def_property(srna, "channels_selected", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "hilite");
- RNA_def_property_array(prop, 3);
+ RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Channels Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
prop = RNA_def_property(srna, "channel_group", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "group");
- RNA_def_property_array(prop, 3);
+ RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Channel Group", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
prop = RNA_def_property(srna, "active_channels_group", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "group_active");
- RNA_def_property_array(prop, 3);
+ RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Active Channel Group", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
prop = RNA_def_property(srna, "long_key", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "strip");
- RNA_def_property_array(prop, 3);
+ RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Long Key", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
prop = RNA_def_property(srna, "long_key_selected", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "strip_select");
- RNA_def_property_array(prop, 3);
+ RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Long Key Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -2771,6 +2812,18 @@ static void rna_def_userdef_theme_space_action(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Jitter Keyframe Selected", "Color of selected jitter keyframe");
RNA_def_property_update(prop, 0, "rna_userdef_update");
+ prop = RNA_def_property(srna, "keyframe_movehold", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "keytype_movehold");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Moving Hold Keyframe", "Color of moving hold keyframe");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop = RNA_def_property(srna, "keyframe_movehold_selected", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "keytype_movehold_select");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Moving Hold Keyframe Selected", "Color of selected moving hold keyframe");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
prop = RNA_def_property(srna, "keyframe_border", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "keyborder");
RNA_def_property_array(prop, 4);
@@ -2790,12 +2843,23 @@ static void rna_def_userdef_theme_space_action(BlenderRNA *brna)
RNA_def_property_range(prop, 0.8f, 5.0f); /* Note: These limits prevent buttons overlapping (min), and excessive size... (max) */
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_DOPESHEET, "rna_userdef_update");
-
prop = RNA_def_property(srna, "summary", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "anim_active");
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Summary", "Color of summary channel");
RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop = RNA_def_property(srna, "preview_range", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "anim_preview_range");
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Preview Range", "Color of preview range overlay");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop = RNA_def_property(srna, "interpolation_line", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "ds_ipoline");
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Interpolation Line", "Color of lines showing non-bezier interpolation modes");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_nla(BlenderRNA *brna)
@@ -2835,6 +2899,12 @@ static void rna_def_userdef_theme_space_nla(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "No Active Action", "Animation data-block doesn't have active action");
RNA_def_property_update(prop, 0, "rna_userdef_update");
+ prop = RNA_def_property(srna, "preview_range", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "anim_preview_range");
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Preview Range", "Color of preview range overlay");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
prop = RNA_def_property(srna, "strips", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "strip");
RNA_def_property_array(prop, 3);
@@ -3071,22 +3141,22 @@ static void rna_def_userdef_themes(BlenderRNA *brna)
PropertyRNA *prop;
static const EnumPropertyItem active_theme_area[] = {
- {0, "USER_INTERFACE", ICON_UI, "User Interface", ""},
+ {0, "USER_INTERFACE", ICON_WORKSPACE, "User Interface", ""},
{19, "STYLE", ICON_FONTPREVIEW, "Text Style", ""},
{18, "BONE_COLOR_SETS", ICON_COLOR, "Bone Color Sets", ""},
{1, "VIEW_3D", ICON_VIEW3D, "3D View", ""},
- {3, "GRAPH_EDITOR", ICON_IPO, "Graph Editor", ""},
+ {3, "GRAPH_EDITOR", ICON_GRAPH, "Graph Editor", ""},
{4, "DOPESHEET_EDITOR", ICON_ACTION, "Dope Sheet", ""},
{5, "NLA_EDITOR", ICON_NLA, "Nonlinear Animation", ""},
- {6, "IMAGE_EDITOR", ICON_IMAGE_COL, "UV/Image Editor", ""},
+ {6, "IMAGE_EDITOR", ICON_IMAGE, "UV/Image Editor", ""},
{7, "SEQUENCE_EDITOR", ICON_SEQUENCE, "Video Sequence Editor", ""},
{8, "TEXT_EDITOR", ICON_TEXT, "Text Editor", ""},
{9, "NODE_EDITOR", ICON_NODETREE, "Node Editor", ""},
- {11, "PROPERTIES", ICON_BUTS, "Properties", ""},
- {12, "OUTLINER", ICON_OOPS, "Outliner", ""},
+ {11, "PROPERTIES", ICON_PROPERTIES, "Properties", ""},
+ {12, "OUTLINER", ICON_OUTLINER, "Outliner", ""},
{14, "USER_PREFERENCES", ICON_PREFERENCES, "User Preferences", ""},
{15, "INFO", ICON_INFO, "Info", ""},
- {16, "FILE_BROWSER", ICON_FILESEL, "File Browser", ""},
+ {16, "FILE_BROWSER", ICON_FILEBROWSER, "File Browser", ""},
{17, "CONSOLE", ICON_CONSOLE, "Python Console", ""},
{20, "CLIP_EDITOR", ICON_CLIP, "Movie Clip Editor", ""},
{21, "TOPBAR", ICON_NONE, "Top Bar", ""},
@@ -3663,8 +3733,8 @@ static void rna_def_userdef_view(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_mouse_depth_cursor", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_DEPTH_CURSOR);
- RNA_def_property_ui_text(prop, "Cursor Depth",
- "Use the depth under the mouse when placing the cursor");
+ RNA_def_property_ui_text(prop, "Cursor Surface Project",
+ "Use the surface depth for cursor placement");
prop = RNA_def_property(srna, "use_cursor_lock_adjust", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_LOCK_CURSOR_ADJUST);
@@ -3952,11 +4022,10 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
RNA_def_property_range(prop, 1, 500);
RNA_def_property_ui_text(prop, "Grease Pencil Eraser Radius", "Radius of eraser 'brush'");
-
prop = RNA_def_property(srna, "grease_pencil_default_color", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "gpencil_new_layer_col");
RNA_def_property_array(prop, 4);
- RNA_def_property_ui_text(prop, "Grease Pencil Default Color", "Color of new Grease Pencil layers");
+ RNA_def_property_ui_text(prop, "Annotation Default Color", "Color of new annotation layers");
/* sculpt and paint */
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index fd0759bfe42..7ceaa769d78 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -779,7 +779,7 @@ static void rna_workspace_screen_update(bContext *C, PointerRNA *ptr)
static PointerRNA rna_Window_view_layer_get(PointerRNA *ptr)
{
wmWindow *win = ptr->data;
- Scene *scene = WM_window_get_active_scene(win);;
+ Scene *scene = WM_window_get_active_scene(win);
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
PointerRNA scene_ptr;
diff --git a/source/blender/makesrna/intern/rna_wm_gizmo.c b/source/blender/makesrna/intern/rna_wm_gizmo.c
index 1eee5e5522f..41e3929e8ae 100644
--- a/source/blender/makesrna/intern/rna_wm_gizmo.c
+++ b/source/blender/makesrna/intern/rna_wm_gizmo.c
@@ -404,7 +404,8 @@ RNA_GIZMO_GENERIC_FLAG_RW_DEF(flag_use_draw_value, flag, WM_GIZMO_DRAW_VALUE);
RNA_GIZMO_GENERIC_FLAG_RW_DEF(flag_use_draw_offset_scale, flag, WM_GIZMO_DRAW_OFFSET_SCALE);
RNA_GIZMO_GENERIC_FLAG_NEG_RW_DEF(flag_use_draw_scale, flag, WM_GIZMO_DRAW_OFFSET_SCALE);
RNA_GIZMO_GENERIC_FLAG_RW_DEF(flag_hide, flag, WM_GIZMO_HIDDEN);
-RNA_GIZMO_GENERIC_FLAG_RW_DEF(flag_use_grab_cursor, flag, WM_GIZMO_GRAB_CURSOR);
+RNA_GIZMO_GENERIC_FLAG_RW_DEF(flag_hide_select, flag, WM_GIZMO_HIDDEN_SELECT);
+RNA_GIZMO_GENERIC_FLAG_RW_DEF(flag_use_grab_cursor, flag, WM_GIZMO_MOVE_CURSOR);
RNA_GIZMO_GENERIC_FLAG_RW_DEF(flag_use_select_background, flag, WM_GIZMO_SELECT_BACKGROUND);
/* wmGizmo.state */
@@ -547,6 +548,34 @@ static StructRNA *rna_Gizmo_refine(PointerRNA *mnp_ptr)
/** \name Gizmo Group API
* \{ */
+static wmGizmoGroupType *rna_GizmoGroupProperties_find_gizmo_group_type(PointerRNA *ptr)
+{
+ IDProperty *properties = (IDProperty *)ptr->data;
+ wmGizmoGroupType *gzgt = WM_gizmogrouptype_find(properties->name, false);
+ return gzgt;
+}
+
+static StructRNA *rna_GizmoGroupProperties_refine(PointerRNA *ptr)
+{
+ wmGizmoGroupType *gzgt = rna_GizmoGroupProperties_find_gizmo_group_type(ptr);
+
+ if (gzgt)
+ return gzgt->srna;
+ else
+ return ptr->type;
+}
+
+static IDProperty *rna_GizmoGroupProperties_idprops(PointerRNA *ptr, bool create)
+{
+ if (create && !ptr->data) {
+ IDPropertyTemplate val = {0};
+ ptr->data = IDP_New(IDP_GROUP, &val, "RNA_GizmoGroupProperties group");
+ }
+
+ return ptr->data;
+}
+
+
static wmGizmo *rna_GizmoGroup_gizmo_new(
wmGizmoGroup *gzgroup, ReportList *reports, const char *idname)
{
@@ -623,7 +652,7 @@ static bool rna_gizmogroup_poll_cb(const bContext *C, wmGizmoGroupType *gzgt)
ParameterList list;
FunctionRNA *func;
void *ret;
- int visible;
+ bool visible;
RNA_pointer_create(NULL, gzgt->ext.srna, NULL, &ptr); /* dummy */
func = &rna_GizmoGroup_poll_func; /* RNA_struct_find_function(&ptr, "poll"); */
@@ -633,7 +662,7 @@ static bool rna_gizmogroup_poll_cb(const bContext *C, wmGizmoGroupType *gzgt)
gzgt->ext.call((bContext *)C, &ptr, func, &list);
RNA_parameter_get_lookup(&list, "visible", &ret);
- visible = *(int *)ret;
+ visible = *(bool *)ret;
RNA_parameter_list_free(&list);
@@ -718,6 +747,25 @@ static void rna_gizmogroup_draw_prepare_cb(const bContext *C, wmGizmoGroup *gzgr
RNA_parameter_list_free(&list);
}
+static void rna_gizmogroup_invoke_prepare_cb(const bContext *C, wmGizmoGroup *gzgroup, wmGizmo *gz)
+{
+ extern FunctionRNA rna_GizmoGroup_invoke_prepare_func;
+
+ PointerRNA gzgroup_ptr;
+ ParameterList list;
+ FunctionRNA *func;
+
+ RNA_pointer_create(NULL, gzgroup->type->ext.srna, gzgroup, &gzgroup_ptr);
+ func = &rna_GizmoGroup_invoke_prepare_func; /* RNA_struct_find_function(&wgroupr, "invoke_prepare"); */
+
+ RNA_parameter_list_create(&list, &gzgroup_ptr, func);
+ RNA_parameter_set_lookup(&list, "context", &C);
+ RNA_parameter_set_lookup(&list, "gizmo", &gz);
+ gzgroup->type->ext.call((bContext *)C, &gzgroup_ptr, func, &list);
+
+ RNA_parameter_list_free(&list);
+}
+
void BPY_RNA_gizmogroup_wrapper(wmGizmoGroupType *gzgt, void *userdata);
static void rna_GizmoGroup_unregister(struct Main *bmain, StructRNA *type);
@@ -735,7 +783,7 @@ static StructRNA *rna_GizmoGroup_register(
PointerRNA wgptr;
/* Two sets of functions. */
- int have_function[5];
+ int have_function[6];
/* setup dummy gizmogroup & gizmogroup type to store static properties in */
dummywg.type = &dummywgt;
@@ -807,6 +855,7 @@ static StructRNA *rna_GizmoGroup_register(
dummywgt.setup = (have_function[2]) ? rna_gizmogroup_setup_cb : NULL;
dummywgt.refresh = (have_function[3]) ? rna_gizmogroup_refresh_cb : NULL;
dummywgt.draw_prepare = (have_function[4]) ? rna_gizmogroup_draw_prepare_cb : NULL;
+ dummywgt.invoke_prepare = (have_function[5]) ? rna_gizmogroup_invoke_prepare_cb : NULL;
wmGizmoGroupType *gzgt = WM_gizmogrouptype_append_ptr(
BPY_RNA_gizmogroup_wrapper, (void *)&dummywgt);
@@ -885,7 +934,8 @@ static void rna_def_gizmos(BlenderRNA *brna, PropertyRNA *cprop)
func = RNA_def_function(srna, "new", "rna_GizmoGroup_gizmo_new");
RNA_def_function_ui_description(func, "Add gizmo");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- RNA_def_string(func, "type", "Type", 0, "", "Gizmo identifier"); /* optional */
+ parm = RNA_def_string(func, "type", "Type", 0, "", "Gizmo identifier"); /* optional */
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
parm = RNA_def_pointer(func, "gizmo", "Gizmo", "", "New gizmo");
RNA_def_function_return(func, parm);
@@ -1100,7 +1150,13 @@ static void rna_def_gizmo(BlenderRNA *brna, PropertyRNA *cprop)
prop, "rna_Gizmo_flag_hide_get", "rna_Gizmo_flag_hide_set");
RNA_def_property_ui_text(prop, "Hide", "");
RNA_def_property_update(prop, NC_SCREEN | NA_EDITED, NULL);
- /* WM_GIZMO_GRAB_CURSOR */
+ /* WM_GIZMO_HIDDEN_SELECT */
+ prop = RNA_def_property(srna, "hide_select", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(
+ prop, "rna_Gizmo_flag_hide_select_get", "rna_Gizmo_flag_hide_select_set");
+ RNA_def_property_ui_text(prop, "Hide Select", "");
+ RNA_def_property_update(prop, NC_SCREEN | NA_EDITED, NULL);
+ /* WM_GIZMO_MOVE_CURSOR */
prop = RNA_def_property(srna, "use_grab_cursor", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(
prop, "rna_Gizmo_flag_use_grab_cursor_get", "rna_Gizmo_flag_use_grab_cursor_set");
@@ -1240,6 +1296,8 @@ static void rna_def_gizmogroup(BlenderRNA *brna)
""},
{WM_GIZMOGROUPTYPE_DRAW_MODAL_ALL, "SHOW_MODAL_ALL", 0, "Show Modal All",
"Show all while interacting"},
+ {WM_GIZMOGROUPTYPE_TOOL_INIT, "TOOL_INIT", 0, "Tool Init",
+ "Postpone running until tool operator run (when used with a tool)"},
{0, NULL, 0, NULL, NULL}
};
prop = RNA_def_property(srna, "bl_options", PROP_ENUM, PROP_NONE);
@@ -1294,6 +1352,14 @@ static void rna_def_gizmogroup(BlenderRNA *brna)
parm = RNA_def_pointer(func, "context", "Context", "", "");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+ func = RNA_def_function(srna, "invoke_prepare", NULL);
+ RNA_def_function_ui_description(func, "Run before invoke");
+ RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
+ parm = RNA_def_pointer(func, "context", "Context", "", "");
+ RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+ parm = RNA_def_pointer(func, "gizmo", "Gizmo", "", "");
+ RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+
/* -------------------------------------------------------------------- */
/* Instance Variables */
@@ -1326,6 +1392,12 @@ static void rna_def_gizmogroup(BlenderRNA *brna)
RNA_define_verify_sdna(1); /* not in sdna */
RNA_api_gizmogroup(srna);
+
+ srna = RNA_def_struct(brna, "GizmoGroupProperties", NULL);
+ RNA_def_struct_ui_text(srna, "Gizmo Group Properties", "Input properties of a Gizmo Group");
+ RNA_def_struct_refine_func(srna, "rna_GizmoGroupProperties_refine");
+ RNA_def_struct_idprops_func(srna, "rna_GizmoGroupProperties_idprops");
+ RNA_def_struct_flag(srna, STRUCT_NO_DATABLOCK_IDPROPERTIES);
}
void RNA_def_wm_gizmo(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_wm_gizmo_api.c b/source/blender/makesrna/intern/rna_wm_gizmo_api.c
index e8a9e585165..37c4e22b68e 100644
--- a/source/blender/makesrna/intern/rna_wm_gizmo_api.c
+++ b/source/blender/makesrna/intern/rna_wm_gizmo_api.c
@@ -67,8 +67,7 @@ static void rna_gizmo_draw_preset_circle(
static void rna_gizmo_draw_preset_facemap(
wmGizmo *gz, struct bContext *C, struct Object *ob, int facemap, int select_id)
{
- struct Scene *scene = CTX_data_scene(C);
- ED_gizmo_draw_preset_facemap(C, gz, scene, ob, facemap, select_id);
+ ED_gizmo_draw_preset_facemap(C, gz, ob, facemap, select_id);
}
/* -------------------------------------------------------------------- */
@@ -234,7 +233,8 @@ void RNA_api_gizmo(StructRNA *srna)
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
parm = RNA_def_pointer(func, "object", "Object", "", "Object");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
- RNA_def_int(func, "facemap", 0, 0, INT_MAX, "Face map index", "", 0, INT_MAX);
+ parm = RNA_def_int(func, "face_map", 0, 0, INT_MAX, "Face map index", "", 0, INT_MAX);
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
RNA_def_int(func, "select_id", -1, -1, INT_MAX, "Zero when not selecting", "", -1, INT_MAX);
diff --git a/source/blender/makesrna/intern/rna_workspace.c b/source/blender/makesrna/intern/rna_workspace.c
index b9ca6412f7a..59b1086e17e 100644
--- a/source/blender/makesrna/intern/rna_workspace.c
+++ b/source/blender/makesrna/intern/rna_workspace.c
@@ -158,6 +158,18 @@ static int rna_WorkspaceTool_has_datablock_get(PointerRNA *ptr)
return (tref->runtime) ? (tref->runtime->data_block[0] != '\0') : false;
}
+static void rna_WorkspaceTool_widget_get(PointerRNA *ptr, char *value)
+{
+ bToolRef *tref = ptr->data;
+ strcpy(value, tref->runtime ? tref->runtime->gizmo_group : "");
+}
+
+static int rna_WorkspaceTool_widget_length(PointerRNA *ptr)
+{
+ bToolRef *tref = ptr->data;
+ return tref->runtime ? strlen(tref->runtime->gizmo_group) : 0;
+}
+
#else /* RNA_RUNTIME */
static void rna_def_workspace_owner(BlenderRNA *brna)
@@ -236,6 +248,13 @@ static void rna_def_workspace_tool(BlenderRNA *brna)
RNA_def_property_enum_items(prop, rna_enum_space_type_items);
RNA_def_property_ui_text(prop, "Space Type", "");
+ prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "mode");
+ RNA_def_property_enum_items(prop, DummyRNA_DEFAULT_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_WorkSpace_tools_mode_itemf");
+ RNA_def_property_ui_text(prop, "Tool Mode", "");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
RNA_define_verify_sdna(0);
prop = RNA_def_property(srna, "has_datablock", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -243,6 +262,12 @@ static void rna_def_workspace_tool(BlenderRNA *brna)
RNA_def_property_boolean_funcs(prop, "rna_WorkspaceTool_has_datablock_get", NULL);
RNA_define_verify_sdna(1);
+ prop = RNA_def_property(srna, "widget", PROP_STRING, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Widget", "");
+ RNA_def_property_string_funcs(prop, "rna_WorkspaceTool_widget_get", "rna_WorkspaceTool_widget_length", NULL);
+ RNA_define_verify_sdna(1);
+
RNA_api_workspace_tool(srna);
}
@@ -287,7 +312,7 @@ static void rna_def_workspace(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "WorkSpace");
RNA_def_struct_ui_text(srna, "Workspace", "Workspace data-block, defining the working environment for the user");
/* TODO: real icon, just to show something */
- RNA_def_struct_ui_icon(srna, ICON_SPLITSCREEN);
+ RNA_def_struct_ui_icon(srna, ICON_WORKSPACE);
prop = RNA_def_property(srna, "screens", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "layouts", NULL);
@@ -310,14 +335,14 @@ static void rna_def_workspace(BlenderRNA *brna)
prop = RNA_def_property(srna, "tools_space_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "tools_space_type");
RNA_def_property_enum_items(prop, rna_enum_space_type_items);
- RNA_def_property_ui_text(prop, "Active Tool Space", "Tool space type");
+ RNA_def_property_ui_text(prop, "Active Tool Space", "");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
prop = RNA_def_property(srna, "tools_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "tools_mode");
RNA_def_property_enum_items(prop, DummyRNA_DEFAULT_items);
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_WorkSpace_tools_mode_itemf");
- RNA_def_property_ui_text(prop, "Active Tool Space", "Tool mode");
+ RNA_def_property_ui_text(prop, "Active Tool Mode", "");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
prop = RNA_def_property(srna, "object_mode", PROP_ENUM, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_workspace_api.c b/source/blender/makesrna/intern/rna_workspace_api.c
index aac38d05cd8..fd268c898ff 100644
--- a/source/blender/makesrna/intern/rna_workspace_api.c
+++ b/source/blender/makesrna/intern/rna_workspace_api.c
@@ -64,7 +64,7 @@ static void rna_WorkspaceTool_setup(
STRNCPY(tref_rt.keymap, keymap);
STRNCPY(tref_rt.gizmo_group, gizmo_group);
STRNCPY(tref_rt.data_block, data_block);
- STRNCPY(tref_rt.operator, operator);
+ STRNCPY(tref_rt.op, operator);
tref_rt.index = index;
WM_toolsystem_ref_set_from_runtime(C, (WorkSpace *)id, tref, &tref_rt, name);
@@ -75,57 +75,41 @@ static void rna_WorkspaceTool_refresh_from_context(
bToolRef *tref,
Main *bmain)
{
- bToolRef_Runtime *tref_rt = tref->runtime;
- if ((tref_rt == NULL) || (tref_rt->data_block[0] == '\0')) {
- return;
- }
- wmWindowManager *wm = bmain->wm.first;
- for (wmWindow *win = wm->windows.first; win; win = win->next) {
- WorkSpace *workspace = WM_window_get_active_workspace(win);
- if (&workspace->id == id) {
- Scene *scene = WM_window_get_active_scene(win);
- ToolSettings *ts = scene->toolsettings;
- ViewLayer *view_layer = WM_window_get_active_view_layer(win);
- Object *ob = OBACT(view_layer);
- if (ob == NULL) {
- /* pass */
- }
- else if (ob->mode & OB_MODE_PARTICLE_EDIT) {
- const EnumPropertyItem *items = rna_enum_particle_edit_hair_brush_items;
- const int i = RNA_enum_from_value(items, ts->particle.brushtype);
- const EnumPropertyItem *item = &items[i];
- if (!STREQ(tref_rt->data_block, item->identifier)) {
- STRNCPY(tref_rt->data_block, item->identifier);
- STRNCPY(tref->idname, item->name);
- }
- }
- else {
- Paint *paint = BKE_paint_get_active(scene, view_layer);
- if (paint) {
- const ID *brush = (ID *)paint->brush;
- if (brush) {
- if (!STREQ(tref_rt->data_block, brush->name + 2)) {
- STRNCPY(tref_rt->data_block, brush->name + 2);
- STRNCPY(tref->idname, brush->name + 2);
- }
- }
- }
- }
- }
- }
+ WM_toolsystem_ref_sync_from_context(bmain, (WorkSpace *)id, tref);
}
static PointerRNA rna_WorkspaceTool_operator_properties(
bToolRef *tref,
+ ReportList *reports,
const char *idname)
{
wmOperatorType *ot = WM_operatortype_find(idname, true);
if (ot != NULL) {
PointerRNA ptr;
- WM_toolsystem_ref_properties_ensure(tref, ot, &ptr);
+ WM_toolsystem_ref_properties_ensure_from_operator(tref, ot, &ptr);
+ return ptr;
+ }
+ else {
+ BKE_reportf(reports, RPT_ERROR, "Operator '%s' not found!", idname);
+ }
+ return PointerRNA_NULL;
+}
+
+static PointerRNA rna_WorkspaceTool_gizmo_group_properties(
+ bToolRef *tref,
+ ReportList *reports,
+ const char *idname)
+{
+ wmGizmoGroupType *gzgt = WM_gizmogrouptype_find(idname, false);
+ if (gzgt != NULL) {
+ PointerRNA ptr;
+ WM_toolsystem_ref_properties_ensure_from_gizmo_group(tref, gzgt, &ptr);
return ptr;
}
+ else {
+ BKE_reportf(reports, RPT_ERROR, "Gizmo group '%s' not found!", idname);
+ }
return PointerRNA_NULL;
}
@@ -134,11 +118,14 @@ static PointerRNA rna_WorkspaceTool_operator_properties(
void RNA_api_workspace(StructRNA *srna)
{
FunctionRNA *func;
+ PropertyRNA *parm;
func = RNA_def_function(srna, "status_text_set", "ED_workspace_status_text");
RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT);
RNA_def_function_ui_description(func, "Set the status bar text, typically key shortcuts for modal operators");
- RNA_def_string(func, "text", NULL, 0, "Text", "New string for the status bar, no argument clears the text");
+ parm = RNA_def_string(func, "text", NULL, 0, "Text", "New string for the status bar, None clears the text");
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+ RNA_def_property_clear_flag(parm, PROP_NEVER_NULL);
}
void RNA_api_workspace_tool(StructRNA *srna)
@@ -164,6 +151,7 @@ void RNA_api_workspace_tool(StructRNA *srna)
/* Access tool operator options (optionally create). */
func = RNA_def_function(srna, "operator_properties", "rna_WorkspaceTool_operator_properties");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
parm = RNA_def_string(func, "operator", NULL, 0, "", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
/* return */
@@ -171,6 +159,16 @@ void RNA_api_workspace_tool(StructRNA *srna)
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_RNAPTR);
RNA_def_function_return(func, parm);
+ /* Access gizmo-group options (optionally create). */
+ func = RNA_def_function(srna, "gizmo_group_properties", "rna_WorkspaceTool_gizmo_group_properties");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm = RNA_def_string(func, "group", NULL, 0, "", "");
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+ /* return */
+ parm = RNA_def_pointer(func, "result", "GizmoGroupProperties", "", "");
+ RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_RNAPTR);
+ RNA_def_function_return(func, parm);
+
func = RNA_def_function(srna, "refresh_from_context", "rna_WorkspaceTool_refresh_from_context");
RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_MAIN);
}
diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c
index 7fa1705249c..3209391d4bc 100644
--- a/source/blender/modifiers/intern/MOD_armature.c
+++ b/source/blender/modifiers/intern/MOD_armature.c
@@ -201,14 +201,12 @@ ModifierTypeInfo modifierType_Armature = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ deformMatrices,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ deformMatricesEM,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c
index 085f21fe138..cd2f7cc364b 100644
--- a/source/blender/modifiers/intern/MOD_array.c
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -101,9 +101,8 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
DEG_add_object_relation(ctx->node, amd->end_cap, DEG_OB_COMP_GEOMETRY, "Array Modifier End Cap");
}
if (amd->curve_ob) {
- struct Depsgraph *depsgraph = DEG_get_graph_from_handle(ctx->node);
DEG_add_object_relation(ctx->node, amd->curve_ob, DEG_OB_COMP_GEOMETRY, "Array Modifier Curve");
- DEG_add_special_eval_flag(depsgraph, &amd->curve_ob->id, DAG_EVAL_NEED_CURVE_PATH);
+ DEG_add_special_eval_flag(ctx->node, &amd->curve_ob->id, DAG_EVAL_NEED_CURVE_PATH);
}
if (amd->offset_ob != NULL) {
DEG_add_object_relation(ctx->node, amd->offset_ob, DEG_OB_COMP_TRANSFORM, "Array Modifier Offset");
@@ -505,7 +504,7 @@ static Mesh *arrayModifier_doArray(
CustomData_copy_data(&mesh->ldata, &result->ldata, 0, 0, chunk_nloops);
CustomData_copy_data(&mesh->pdata, &result->pdata, 0, 0, chunk_npolys);
- /* Subsurf for eg wont have mesh data in the custom data arrays.
+ /* Subsurf for eg won't have mesh data in the custom data arrays.
* now add mvert/medge/mpoly layers. */
if (!CustomData_has_layer(&mesh->vdata, CD_MVERT)) {
memcpy(result->mvert, mesh->mvert, sizeof(*result->mvert) * mesh->totvert);
@@ -707,7 +706,7 @@ static Mesh *arrayModifier_doArray(
int new_i = full_doubles_map[i];
if (new_i != -1) {
/* We have to follow chains of doubles (merge start/end especially is likely to create some),
- * those are not supported at all by CDDM_merge_verts! */
+ * those are not supported at all by BKE_mesh_merge_verts! */
while (!ELEM(full_doubles_map[new_i], -1, new_i)) {
new_i = full_doubles_map[new_i];
}
@@ -777,14 +776,12 @@ ModifierTypeInfo modifierType_Array = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_bevel.c b/source/blender/modifiers/intern/MOD_bevel.c
index a961208755d..d548bae96a0 100644
--- a/source/blender/modifiers/intern/MOD_bevel.c
+++ b/source/blender/modifiers/intern/MOD_bevel.c
@@ -377,6 +377,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
.add_key_index = false,
.use_shapekey = true,
.active_shapekey = ctx->object->shapenr,
+ .cd_mask_extra = CD_MASK_ORIGINDEX,
});
if ((bmd->lim_flags & MOD_BEVEL_VGROUP) && bmd->defgrp_name[0])
@@ -448,7 +449,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
if (set_wn_strength)
bevel_set_weighted_normal_face_strength(bm, scene);
- result = BKE_bmesh_to_mesh_nomain(bm, &(struct BMeshToMeshParams){0});
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BLI_assert(bm->vtoolflagpool == NULL &&
bm->etoolflagpool == NULL &&
@@ -485,14 +486,12 @@ ModifierTypeInfo modifierType_Bevel = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c
index aa10252350d..bb454f65f90 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -48,10 +48,11 @@
#include "BLI_alloca.h"
#include "BLI_math_geom.h"
-#include "BKE_material.h"
+
#include "BKE_global.h" /* only to check G.debug */
-#include "BKE_mesh.h"
#include "BKE_library.h"
+#include "BKE_material.h"
+#include "BKE_mesh.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ -105,17 +106,17 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
}
-
static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
{
BooleanModifierData *bmd = (BooleanModifierData *) md;
- Mesh* mesh_other;
- Mesh* result;
- bool mesh_other_free;
+ Mesh *result = mesh;
- if (!bmd->object) {
- return mesh;
- }
+ Mesh *mesh_other;
+ bool mesh_other_free;
+
+ if (!bmd->object) {
+ return result;
+ }
Object *ob_eval = DEG_get_evaluated_object(ctx->depsgraph, bmd->object);
mesh_other = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob_eval, &mesh_other_free);
@@ -123,16 +124,16 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
result = BKE_boolean_operation(mesh, ctx->object, mesh_other, bmd->object, bmd->operation,
bmd->double_threshold, bmd);
- if (mesh_other != NULL && mesh_other_free) {
- BKE_id_free(NULL, mesh_other);
- }
-
/* if new mesh returned, return it; otherwise there was
* an error, so delete the modifier object */
if (result == NULL)
modifier_setError(md, "Cannot execute boolean operation");
- return result;
+ if (mesh_other != NULL && mesh_other_free) {
+ BKE_id_free(NULL, mesh_other);
+ }
+
+ return result;
}
static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md))
@@ -159,14 +160,12 @@ ModifierTypeInfo modifierType_Boolean = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_build.c b/source/blender/modifiers/intern/MOD_build.c
index 902a9e7f14f..e2c13d02827 100644
--- a/source/blender/modifiers/intern/MOD_build.c
+++ b/source/blender/modifiers/intern/MOD_build.c
@@ -133,7 +133,7 @@ static Mesh *applyModifier(
for (j = 0; j < mp->totloop; j++, ml++) {
void **val_p;
- if (!BLI_ghash_ensure_p(vertHash, SET_INT_IN_POINTER(ml->v), &val_p)) {
+ if (!BLI_ghash_ensure_p(vertHash, POINTER_FROM_INT(ml->v), &val_p)) {
*val_p = (void *)hash_num;
hash_num++;
}
@@ -151,8 +151,8 @@ static Mesh *applyModifier(
for (i = 0; i < numEdge_src; i++, hash_num_alt++) {
MEdge *me = medge_src + i;
- if (BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me->v1)) &&
- BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me->v2)))
+ if (BLI_ghash_haskey(vertHash, POINTER_FROM_INT(me->v1)) &&
+ BLI_ghash_haskey(vertHash, POINTER_FROM_INT(me->v2)))
{
BLI_ghash_insert(edgeHash, (void *)hash_num, (void *)hash_num_alt);
BLI_ghash_insert(edgeHash2, (void *)hash_num_alt, (void *)hash_num);
@@ -179,11 +179,11 @@ static Mesh *applyModifier(
void **val_p;
me = medge + edgeMap[i];
- if (!BLI_ghash_ensure_p(vertHash, SET_INT_IN_POINTER(me->v1), &val_p)) {
+ if (!BLI_ghash_ensure_p(vertHash, POINTER_FROM_INT(me->v1), &val_p)) {
*val_p = (void *)hash_num;
hash_num++;
}
- if (!BLI_ghash_ensure_p(vertHash, SET_INT_IN_POINTER(me->v2), &val_p)) {
+ if (!BLI_ghash_ensure_p(vertHash, POINTER_FROM_INT(me->v2), &val_p)) {
*val_p = (void *)hash_num;
hash_num++;
}
@@ -194,10 +194,10 @@ static Mesh *applyModifier(
for (i = 0; i < numEdges_dst; i++) {
j = BLI_ghash_len(edgeHash);
- BLI_ghash_insert(edgeHash, SET_INT_IN_POINTER(j),
- SET_INT_IN_POINTER(edgeMap[i]));
- BLI_ghash_insert(edgeHash2, SET_INT_IN_POINTER(edgeMap[i]),
- SET_INT_IN_POINTER(j));
+ BLI_ghash_insert(edgeHash, POINTER_FROM_INT(j),
+ POINTER_FROM_INT(edgeMap[i]));
+ BLI_ghash_insert(edgeHash2, POINTER_FROM_INT(edgeMap[i]),
+ POINTER_FROM_INT(j));
}
}
else {
@@ -212,7 +212,7 @@ static Mesh *applyModifier(
* mapped to the new indices
*/
for (i = 0; i < numVerts; i++) {
- BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(vertMap[i]), SET_INT_IN_POINTER(i));
+ BLI_ghash_insert(vertHash, POINTER_FROM_INT(vertMap[i]), POINTER_FROM_INT(i));
}
}
@@ -225,8 +225,8 @@ static Mesh *applyModifier(
GHASH_ITER (gh_iter, vertHash) {
MVert source;
MVert *dest;
- int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(&gh_iter));
- int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(&gh_iter));
+ int oldIndex = POINTER_AS_INT(BLI_ghashIterator_getKey(&gh_iter));
+ int newIndex = POINTER_AS_INT(BLI_ghashIterator_getValue(&gh_iter));
source = mvert_src[oldIndex];
dest = &result->mvert[newIndex];
@@ -239,13 +239,13 @@ static Mesh *applyModifier(
for (i = 0; i < BLI_ghash_len(edgeHash); i++) {
MEdge source;
MEdge *dest;
- int oldIndex = GET_INT_FROM_POINTER(BLI_ghash_lookup(edgeHash, SET_INT_IN_POINTER(i)));
+ int oldIndex = POINTER_AS_INT(BLI_ghash_lookup(edgeHash, POINTER_FROM_INT(i)));
source = medge_src[oldIndex];
dest = &result->medge[i];
- source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1)));
- source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2)));
+ source.v1 = POINTER_AS_INT(BLI_ghash_lookup(vertHash, POINTER_FROM_INT(source.v1)));
+ source.v2 = POINTER_AS_INT(BLI_ghash_lookup(vertHash, POINTER_FROM_INT(source.v2)));
CustomData_copy_data(&mesh->edata, &result->edata, oldIndex, i, 1);
*dest = source;
@@ -270,8 +270,8 @@ static Mesh *applyModifier(
ml_src = mloop_src + source->loopstart;
for (j = 0; j < source->totloop; j++, k++, ml_src++, ml_dst++) {
- ml_dst->v = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(ml_src->v)));
- ml_dst->e = GET_INT_FROM_POINTER(BLI_ghash_lookup(edgeHash2, SET_INT_IN_POINTER(ml_src->e)));
+ ml_dst->v = POINTER_AS_INT(BLI_ghash_lookup(vertHash, POINTER_FROM_INT(ml_src->v)));
+ ml_dst->e = POINTER_AS_INT(BLI_ghash_lookup(edgeHash2, POINTER_FROM_INT(ml_src->e)));
}
}
@@ -307,14 +307,12 @@ ModifierTypeInfo modifierType_Build = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_cast.c b/source/blender/modifiers/intern/MOD_cast.c
index a0901b6d838..74e19f3254a 100644
--- a/source/blender/modifiers/intern/MOD_cast.c
+++ b/source/blender/modifiers/intern/MOD_cast.c
@@ -484,14 +484,12 @@ ModifierTypeInfo modifierType_Cast = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_cloth.c b/source/blender/modifiers/intern/MOD_cloth.c
index 53e71bfc1a4..55af0f04bac 100644
--- a/source/blender/modifiers/intern/MOD_cloth.c
+++ b/source/blender/modifiers/intern/MOD_cloth.c
@@ -261,14 +261,12 @@ ModifierTypeInfo modifierType_Cloth = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_collision.c b/source/blender/modifiers/intern/MOD_collision.c
index 5a73d62433b..2fddef21996 100644
--- a/source/blender/modifiers/intern/MOD_collision.c
+++ b/source/blender/modifiers/intern/MOD_collision.c
@@ -146,113 +146,108 @@ static void deformVerts(
mvert_num = mesh_src->totvert;
- if (current_time > collmd->time_xnew) {
- unsigned int i;
-
- /* check if mesh has changed */
- if (collmd->x && (mvert_num != collmd->mvert_num))
+ if (current_time < collmd->time_xnew) {
+ freeData((ModifierData *)collmd);
+ }
+ else if (current_time == collmd->time_xnew) {
+ if (mvert_num != collmd->mvert_num) {
freeData((ModifierData *)collmd);
+ }
+ }
- if (collmd->time_xnew == -1000) { /* first time */
+ /* check if mesh has changed */
+ if (collmd->x && (mvert_num != collmd->mvert_num))
+ freeData((ModifierData *)collmd);
- collmd->x = MEM_dupallocN(mesh_src->mvert); /* frame start position */
+ if (collmd->time_xnew == -1000) { /* first time */
- for (i = 0; i < mvert_num; i++) {
- /* we save global positions */
- mul_m4_v3(ob->obmat, collmd->x[i].co);
- }
+ collmd->x = MEM_dupallocN(mesh_src->mvert); /* frame start position */
- collmd->xnew = MEM_dupallocN(collmd->x); // frame end position
- collmd->current_x = MEM_dupallocN(collmd->x); // inter-frame
- collmd->current_xnew = MEM_dupallocN(collmd->x); // inter-frame
- collmd->current_v = MEM_dupallocN(collmd->x); // inter-frame
+ for (uint i = 0; i < mvert_num; i++) {
+ /* we save global positions */
+ mul_m4_v3(ob->obmat, collmd->x[i].co);
+ }
- collmd->mvert_num = mvert_num;
+ collmd->xnew = MEM_dupallocN(collmd->x); // frame end position
+ collmd->current_x = MEM_dupallocN(collmd->x); // inter-frame
+ collmd->current_xnew = MEM_dupallocN(collmd->x); // inter-frame
+ collmd->current_v = MEM_dupallocN(collmd->x); // inter-frame
- {
- const MLoop *mloop = mesh_src->mloop;
- const MLoopTri *looptri = BKE_mesh_runtime_looptri_ensure(mesh_src);
- collmd->tri_num = BKE_mesh_runtime_looptri_len(mesh_src);
- MVertTri *tri = MEM_malloc_arrayN(collmd->tri_num, sizeof(*tri), __func__);
- BKE_mesh_runtime_verttri_from_looptri(tri, mloop, looptri, collmd->tri_num);
- collmd->tri = tri;
- }
+ collmd->mvert_num = mvert_num;
- /* create bounding box hierarchy */
- collmd->bvhtree = bvhtree_build_from_mvert(
- collmd->x,
- collmd->tri, collmd->tri_num,
- ob->pd->pdef_sboft);
-
- collmd->time_x = collmd->time_xnew = current_time;
- collmd->is_static = true;
+ {
+ const MLoop *mloop = mesh_src->mloop;
+ const MLoopTri *looptri = BKE_mesh_runtime_looptri_ensure(mesh_src);
+ collmd->tri_num = BKE_mesh_runtime_looptri_len(mesh_src);
+ MVertTri *tri = MEM_mallocN(sizeof(*tri) * collmd->tri_num, __func__);
+ BKE_mesh_runtime_verttri_from_looptri(tri, mloop, looptri, collmd->tri_num);
+ collmd->tri = tri;
}
- else if (mvert_num == collmd->mvert_num) {
- /* put positions to old positions */
- tempVert = collmd->x;
- collmd->x = collmd->xnew;
- collmd->xnew = tempVert;
- collmd->time_x = collmd->time_xnew;
- memcpy(collmd->xnew, mesh_src->mvert, mvert_num * sizeof(MVert));
+ /* create bounding box hierarchy */
+ collmd->bvhtree = bvhtree_build_from_mvert(
+ collmd->x,
+ collmd->tri, collmd->tri_num,
+ ob->pd->pdef_sboft);
- bool is_static = true;
+ collmd->time_x = collmd->time_xnew = current_time;
+ collmd->is_static = true;
+ }
+ else if (mvert_num == collmd->mvert_num) {
+ /* put positions to old positions */
+ tempVert = collmd->x;
+ collmd->x = collmd->xnew;
+ collmd->xnew = tempVert;
+ collmd->time_x = collmd->time_xnew;
- for (i = 0; i < mvert_num; i++) {
- /* we save global positions */
- mul_m4_v3(ob->obmat, collmd->xnew[i].co);
+ memcpy(collmd->xnew, mesh_src->mvert, mvert_num * sizeof(MVert));
- /* detect motion */
- is_static = is_static && equals_v3v3(collmd->x[i].co, collmd->xnew[i].co);
- }
+ bool is_static = true;
- memcpy(collmd->current_xnew, collmd->x, mvert_num * sizeof(MVert));
- memcpy(collmd->current_x, collmd->x, mvert_num * sizeof(MVert));
+ for (uint i = 0; i < mvert_num; i++) {
+ /* we save global positions */
+ mul_m4_v3(ob->obmat, collmd->xnew[i].co);
- /* check if GUI setting has changed for bvh */
- if (collmd->bvhtree) {
- if (ob->pd->pdef_sboft != BLI_bvhtree_get_epsilon(collmd->bvhtree)) {
- BLI_bvhtree_free(collmd->bvhtree);
- collmd->bvhtree = bvhtree_build_from_mvert(
- collmd->current_x,
- collmd->tri, collmd->tri_num,
- ob->pd->pdef_sboft);
- }
+ /* detect motion */
+ is_static = is_static && equals_v3v3(collmd->x[i].co, collmd->xnew[i].co);
+ }
- }
+ memcpy(collmd->current_xnew, collmd->x, mvert_num * sizeof(MVert));
+ memcpy(collmd->current_x, collmd->x, mvert_num * sizeof(MVert));
- /* happens on file load (ONLY when i decomment changes in readfile.c) */
- if (!collmd->bvhtree) {
+ /* check if GUI setting has changed for bvh */
+ if (collmd->bvhtree) {
+ if (ob->pd->pdef_sboft != BLI_bvhtree_get_epsilon(collmd->bvhtree)) {
+ BLI_bvhtree_free(collmd->bvhtree);
collmd->bvhtree = bvhtree_build_from_mvert(
collmd->current_x,
collmd->tri, collmd->tri_num,
ob->pd->pdef_sboft);
}
- else if (!collmd->is_static || !is_static) {
- /* recalc static bounding boxes */
- bvhtree_update_from_mvert(
- collmd->bvhtree,
- collmd->current_x, collmd->current_xnew,
- collmd->tri, collmd->tri_num,
- true);
- }
+ }
- collmd->is_static = is_static;
- collmd->time_xnew = current_time;
+ /* happens on file load (ONLY when i decomment 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);
}
- else if (mvert_num != collmd->mvert_num) {
- freeData((ModifierData *)collmd);
+ else if (!collmd->is_static || !is_static) {
+ /* recalc static bounding boxes */
+ bvhtree_update_from_mvert(
+ collmd->bvhtree,
+ collmd->current_x, collmd->current_xnew,
+ collmd->tri, collmd->tri_num,
+ true);
}
+ collmd->is_static = is_static;
+ collmd->time_xnew = current_time;
}
- else if (current_time < collmd->time_xnew) {
+ else if (mvert_num != collmd->mvert_num) {
freeData((ModifierData *)collmd);
}
- else {
- if (mvert_num != collmd->mvert_num) {
- freeData((ModifierData *)collmd);
- }
- }
}
if (mesh_src != mesh) {
@@ -276,14 +271,12 @@ ModifierTypeInfo modifierType_Collision = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_correctivesmooth.c b/source/blender/modifiers/intern/MOD_correctivesmooth.c
index d59360896e8..777e1cbf21b 100644
--- a/source/blender/modifiers/intern/MOD_correctivesmooth.c
+++ b/source/blender/modifiers/intern/MOD_correctivesmooth.c
@@ -756,14 +756,12 @@ ModifierTypeInfo modifierType_CorrectiveSmooth = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_curve.c b/source/blender/modifiers/intern/MOD_curve.c
index b74b63e2478..73a541090e8 100644
--- a/source/blender/modifiers/intern/MOD_curve.c
+++ b/source/blender/modifiers/intern/MOD_curve.c
@@ -97,9 +97,8 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
/* TODO(sergey): Currently path is evaluated as a part of modifier stack,
* might be changed in the future.
*/
- struct Depsgraph *depsgraph = DEG_get_graph_from_handle(ctx->node);
DEG_add_object_relation(ctx->node, cmd->object, DEG_OB_COMP_GEOMETRY, "Curve Modifier");
- DEG_add_special_eval_flag(depsgraph, &cmd->object->id, DAG_EVAL_NEED_CURVE_PATH);
+ DEG_add_special_eval_flag(ctx->node, &cmd->object->id, DAG_EVAL_NEED_CURVE_PATH);
}
DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Curve Modifier");
@@ -162,14 +161,12 @@ ModifierTypeInfo modifierType_Curve = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_datatransfer.c b/source/blender/modifiers/intern/MOD_datatransfer.c
index ac45ce8732d..d3f573ec4b6 100644
--- a/source/blender/modifiers/intern/MOD_datatransfer.c
+++ b/source/blender/modifiers/intern/MOD_datatransfer.c
@@ -129,7 +129,9 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
{
DataTransferModifierData *dtmd = (DataTransferModifierData *) md;
if (dtmd->ob_source != NULL) {
- DEG_add_object_relation(ctx->node, dtmd->ob_source, DEG_OB_COMP_GEOMETRY, "DataTransfer Modifier");
+ CustomDataMask mask = BKE_object_data_transfer_dttypes_to_cdmask(dtmd->data_types);
+
+ DEG_add_object_relation_with_customdata(ctx->node, dtmd->ob_source, DEG_OB_COMP_GEOMETRY, mask, "DataTransfer Modifier");
}
}
@@ -225,14 +227,12 @@ ModifierTypeInfo modifierType_DataTransfer = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_decimate.c b/source/blender/modifiers/intern/MOD_decimate.c
index 9e35746c0a3..0159edd069b 100644
--- a/source/blender/modifiers/intern/MOD_decimate.c
+++ b/source/blender/modifiers/intern/MOD_decimate.c
@@ -152,9 +152,12 @@ static Mesh *applyModifier(
}
bm = BKE_mesh_to_bmesh_ex(
- mesh,
- &((struct BMeshCreateParams){0}),
- &((struct BMeshFromMeshParams){.calc_face_normal = calc_face_normal,}));
+ mesh,
+ &(struct BMeshCreateParams){0},
+ &(struct BMeshFromMeshParams){
+ .calc_face_normal = calc_face_normal,
+ .cd_mask_extra = CD_MASK_ORIGINDEX,
+ });
switch (dmd->mode) {
case MOD_DECIM_MODE_COLLAPSE:
@@ -186,7 +189,7 @@ static Mesh *applyModifier(
/* update for display only */
dmd->face_count = bm->totface;
- result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0}));
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BLI_assert(bm->vtoolflagpool == NULL &&
bm->etoolflagpool == NULL &&
bm->ftoolflagpool == NULL); /* make sure we never alloc'd these */
@@ -220,14 +223,12 @@ ModifierTypeInfo modifierType_Decimate = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_displace.c b/source/blender/modifiers/intern/MOD_displace.c
index 1b8b7120058..8f9ce544330 100644
--- a/source/blender/modifiers/intern/MOD_displace.c
+++ b/source/blender/modifiers/intern/MOD_displace.c
@@ -418,14 +418,12 @@ ModifierTypeInfo modifierType_Displace = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_dynamicpaint.c b/source/blender/modifiers/intern/MOD_dynamicpaint.c
index 61219096b43..2e3d164a86e 100644
--- a/source/blender/modifiers/intern/MOD_dynamicpaint.c
+++ b/source/blender/modifiers/intern/MOD_dynamicpaint.c
@@ -31,14 +31,15 @@
#include "DNA_object_types.h"
#include "DNA_object_force_types.h"
#include "DNA_scene_types.h"
+#include "DNA_mesh_types.h"
#include "BLI_utildefines.h"
-#include "BKE_cdderivedmesh.h"
#include "BKE_dynamicpaint.h"
#include "BKE_layer.h"
#include "BKE_library.h"
#include "BKE_library_query.h"
+#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "DEG_depsgraph.h"
@@ -100,18 +101,18 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
return dataMask;
}
-static DerivedMesh *applyModifier(
+static Mesh *applyModifier(
ModifierData *md, const ModifierEvalContext *ctx,
- DerivedMesh *dm)
+ Mesh *mesh)
{
DynamicPaintModifierData *pmd = (DynamicPaintModifierData *) md;
- /* dont apply dynamic paint on orco dm stack */
+ /* dont apply dynamic paint on orco mesh stack */
if (!(ctx->flag & MOD_APPLY_ORCO)) {
Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph);
- return dynamicPaint_Modifier_do(pmd, ctx->depsgraph, scene, ctx->object, dm);
+ return dynamicPaint_Modifier_do(pmd, ctx->depsgraph, scene, ctx->object, mesh);
}
- return dm;
+ return mesh;
}
static bool is_brush_cb(Object *UNUSED(ob), ModifierData *pmd)
@@ -183,15 +184,13 @@ ModifierTypeInfo modifierType_DynamicPaint = {
/* deformMatrices_DM */ NULL,
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
- /* applyModifier_DM */ applyModifier,
- /* applyModifierEM_DM */NULL,
+ /* applyModifier_DM */ NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
- /* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
+ /* applyModifier */ applyModifier,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c
index a8d4d55c5d3..f52632cdcc9 100644
--- a/source/blender/modifiers/intern/MOD_edgesplit.c
+++ b/source/blender/modifiers/intern/MOD_edgesplit.c
@@ -69,6 +69,7 @@ static Mesh *doEdgeSplit(Mesh *mesh, EdgeSplitModifierData *emd, const ModifierE
.add_key_index = false,
.use_shapekey = true,
.active_shapekey = ctx->object->shapenr,
+ .cd_mask_extra = CD_MASK_ORIGINDEX,
});
if (emd->flags & MOD_EDGESPLIT_FROMANGLE) {
@@ -106,7 +107,7 @@ static Mesh *doEdgeSplit(Mesh *mesh, EdgeSplitModifierData *emd, const ModifierE
/* BM_mesh_validate(bm); */ /* for troubleshooting */
- result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0}));
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BM_mesh_free(bm);
result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
@@ -157,14 +158,12 @@ ModifierTypeInfo modifierType_EdgeSplit = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c
index 04bfe96bc59..f736e44a4cf 100644
--- a/source/blender/modifiers/intern/MOD_explode.c
+++ b/source/blender/modifiers/intern/MOD_explode.c
@@ -36,6 +36,7 @@
#include "DNA_meshdata_types.h"
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
+#include "DNA_mesh_types.h"
#include "BLI_utildefines.h"
#include "BLI_kdtree.h"
@@ -43,9 +44,9 @@
#include "BLI_math.h"
#include "BLI_edgehash.h"
-#include "BKE_cdderivedmesh.h"
#include "BKE_deform.h"
#include "BKE_lattice.h"
+#include "BKE_library.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_particle.h"
@@ -99,7 +100,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
static void createFacepa(
ExplodeModifierData *emd,
ParticleSystemModifierData *psmd,
- DerivedMesh *dm)
+ Mesh *mesh)
{
ParticleSystem *psys = psmd->psys;
MFace *fa = NULL, *mface = NULL;
@@ -111,31 +112,32 @@ static void createFacepa(
int *facepa = NULL, *vertpa = NULL, totvert = 0, totface = 0, totpart = 0;
int i, p, v1, v2, v3, v4 = 0;
- mvert = dm->getVertArray(dm);
- mface = dm->getTessFaceArray(dm);
- totface = dm->getNumTessFaces(dm);
- totvert = dm->getNumVerts(dm);
+ mvert = mesh->mvert;
+ mface = mesh->mface;
+ totvert = mesh->totvert;
+ totface = mesh->totface;
totpart = psmd->psys->totpart;
rng = BLI_rng_new_srandom(psys->seed);
- if (emd->facepa)
+ if (emd->facepa) {
MEM_freeN(emd->facepa);
-
+ }
facepa = emd->facepa = MEM_calloc_arrayN(totface, sizeof(int), "explode_facepa");
vertpa = MEM_calloc_arrayN(totvert, sizeof(int), "explode_vertpa");
/* initialize all faces & verts to no particle */
- for (i = 0; i < totface; i++)
+ for (i = 0; i < totface; i++) {
facepa[i] = totpart;
-
- for (i = 0; i < totvert; i++)
+ }
+ for (i = 0; i < totvert; i++) {
vertpa[i] = totpart;
+ }
/* set protected verts */
if (emd->vgroup) {
- MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+ MDeformVert *dvert = CustomData_get_layer(&mesh->vdata, CD_MDEFORMVERT);
if (dvert) {
const int defgrp_index = emd->vgroup - 1;
for (i = 0; i < totvert; i++, dvert++) {
@@ -163,27 +165,40 @@ static void createFacepa(
add_v3_v3(center, mvert[fa->v4].co);
mul_v3_fl(center, 0.25);
}
- else
+ else {
mul_v3_fl(center, 1.0f / 3.0f);
+ }
p = BLI_kdtree_find_nearest(tree, center, NULL);
v1 = vertpa[fa->v1];
v2 = vertpa[fa->v2];
v3 = vertpa[fa->v3];
- if (fa->v4)
+ if (fa->v4) {
v4 = vertpa[fa->v4];
+ }
- if (v1 >= 0 && v2 >= 0 && v3 >= 0 && (fa->v4 == 0 || v4 >= 0))
+ if (v1 >= 0 && v2 >= 0 && v3 >= 0 && (fa->v4 == 0 || v4 >= 0)) {
facepa[i] = p;
+ }
- if (v1 >= 0) vertpa[fa->v1] = p;
- if (v2 >= 0) vertpa[fa->v2] = p;
- if (v3 >= 0) vertpa[fa->v3] = p;
- if (fa->v4 && v4 >= 0) vertpa[fa->v4] = p;
+ if (v1 >= 0) {
+ vertpa[fa->v1] = p;
+ }
+ if (v2 >= 0) {
+ vertpa[fa->v2] = p;
+ }
+ if (v3 >= 0) {
+ vertpa[fa->v3] = p;
+ }
+ if (fa->v4 && v4 >= 0) {
+ vertpa[fa->v4] = p;
+ }
}
- if (vertpa) MEM_freeN(vertpa);
+ if (vertpa) {
+ MEM_freeN(vertpa);
+ }
BLI_kdtree_free(tree);
BLI_rng_free(rng);
@@ -191,7 +206,7 @@ static void createFacepa(
static int edgecut_get(EdgeHash *edgehash, unsigned int v1, unsigned int v2)
{
- return GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, v1, v2));
+ return POINTER_AS_INT(BLI_edgehash_lookup(edgehash, v1, v2));
}
@@ -202,10 +217,10 @@ static const short add_faces[24] = {
1, 1, 2
};
-static MFace *get_dface(DerivedMesh *dm, DerivedMesh *split, int cur, int i, MFace *mf)
+static MFace *get_dface(Mesh *mesh, Mesh *split, int cur, int i, MFace *mf)
{
- MFace *df = CDDM_get_tessface(split, cur);
- DM_copy_tessface_data(dm, split, i, cur, 1);
+ MFace *df = &split->mface[cur];
+ CustomData_copy_data(&mesh->fdata, &split->fdata, i, cur, 1);
*df = *mf;
return df;
}
@@ -221,11 +236,11 @@ static MFace *get_dface(DerivedMesh *dm, DerivedMesh *split, int cur, int i, MFa
#define GET_ES(v1, v2) edgecut_get(eh, v1, v2)
#define INT_UV(uvf, c0, c1) mid_v2_v2v2(uvf, mf->uv[c0], mf->uv[c1])
-static void remap_faces_3_6_9_12(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
+static void remap_faces_3_6_9_12(Mesh *mesh, Mesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
{
- MFace *df1 = get_dface(dm, split, cur, i, mf);
- MFace *df2 = get_dface(dm, split, cur + 1, i, mf);
- MFace *df3 = get_dface(dm, split, cur + 2, i, mf);
+ MFace *df1 = get_dface(mesh, split, cur, i, mf);
+ MFace *df2 = get_dface(mesh, split, cur + 1, i, mf);
+ MFace *df3 = get_dface(mesh, split, cur + 2, i, mf);
facepa[cur] = vertpa[v1];
df1->v1 = v1;
@@ -249,17 +264,17 @@ static void remap_faces_3_6_9_12(DerivedMesh *dm, DerivedMesh *split, MFace *mf,
df3->flag &= ~ME_FACE_SEL;
}
-static void remap_uvs_3_6_9_12(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
+static void remap_uvs_3_6_9_12(Mesh *mesh, Mesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
{
MTFace *mf, *df1, *df2, *df3;
int l;
for (l = 0; l < numlayer; l++) {
- mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l);
+ mf = CustomData_get_layer_n(&split->fdata, CD_MTFACE, l);
df1 = mf + cur;
df2 = df1 + 1;
df3 = df1 + 2;
- mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l);
+ mf = CustomData_get_layer_n(&mesh->fdata, CD_MTFACE, l);
mf += i;
copy_v2_v2(df1->uv[0], mf->uv[c0]);
@@ -277,10 +292,10 @@ static void remap_uvs_3_6_9_12(DerivedMesh *dm, DerivedMesh *split, int numlayer
}
}
-static void remap_faces_5_10(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
+static void remap_faces_5_10(Mesh *mesh, Mesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
{
- MFace *df1 = get_dface(dm, split, cur, i, mf);
- MFace *df2 = get_dface(dm, split, cur + 1, i, mf);
+ MFace *df1 = get_dface(mesh, split, cur, i, mf);
+ MFace *df2 = get_dface(mesh, split, cur + 1, i, mf);
facepa[cur] = vertpa[v1];
df1->v1 = v1;
@@ -297,16 +312,16 @@ static void remap_faces_5_10(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int
df2->flag |= ME_FACE_SEL;
}
-static void remap_uvs_5_10(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
+static void remap_uvs_5_10(Mesh *mesh, Mesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
{
MTFace *mf, *df1, *df2;
int l;
for (l = 0; l < numlayer; l++) {
- mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l);
+ mf = CustomData_get_layer_n(&split->fdata, CD_MTFACE, l);
df1 = mf + cur;
df2 = df1 + 1;
- mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l);
+ mf = CustomData_get_layer_n(&mesh->fdata, CD_MTFACE, l);
mf += i;
copy_v2_v2(df1->uv[0], mf->uv[c0]);
@@ -322,12 +337,12 @@ static void remap_uvs_5_10(DerivedMesh *dm, DerivedMesh *split, int numlayer, in
}
}
-static void remap_faces_15(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
+static void remap_faces_15(Mesh *mesh, Mesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
{
- MFace *df1 = get_dface(dm, split, cur, i, mf);
- MFace *df2 = get_dface(dm, split, cur + 1, i, mf);
- MFace *df3 = get_dface(dm, split, cur + 2, i, mf);
- MFace *df4 = get_dface(dm, split, cur + 3, i, mf);
+ MFace *df1 = get_dface(mesh, split, cur, i, mf);
+ MFace *df2 = get_dface(mesh, split, cur + 1, i, mf);
+ MFace *df3 = get_dface(mesh, split, cur + 2, i, mf);
+ MFace *df4 = get_dface(mesh, split, cur + 3, i, mf);
facepa[cur] = vertpa[v1];
df1->v1 = v1;
@@ -358,18 +373,18 @@ static void remap_faces_15(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *
df4->flag |= ME_FACE_SEL;
}
-static void remap_uvs_15(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
+static void remap_uvs_15(Mesh *mesh, Mesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
{
MTFace *mf, *df1, *df2, *df3, *df4;
int l;
for (l = 0; l < numlayer; l++) {
- mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l);
+ mf = CustomData_get_layer_n(&split->fdata, CD_MTFACE, l);
df1 = mf + cur;
df2 = df1 + 1;
df3 = df1 + 2;
df4 = df1 + 3;
- mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l);
+ mf = CustomData_get_layer_n(&mesh->fdata, CD_MTFACE, l);
mf += i;
copy_v2_v2(df1->uv[0], mf->uv[c0]);
@@ -394,11 +409,11 @@ static void remap_uvs_15(DerivedMesh *dm, DerivedMesh *split, int numlayer, int
}
}
-static void remap_faces_7_11_13_14(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
+static void remap_faces_7_11_13_14(Mesh *mesh, Mesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
{
- MFace *df1 = get_dface(dm, split, cur, i, mf);
- MFace *df2 = get_dface(dm, split, cur + 1, i, mf);
- MFace *df3 = get_dface(dm, split, cur + 2, i, mf);
+ MFace *df1 = get_dface(mesh, split, cur, i, mf);
+ MFace *df2 = get_dface(mesh, split, cur + 1, i, mf);
+ MFace *df3 = get_dface(mesh, split, cur + 2, i, mf);
facepa[cur] = vertpa[v1];
df1->v1 = v1;
@@ -422,17 +437,17 @@ static void remap_faces_7_11_13_14(DerivedMesh *dm, DerivedMesh *split, MFace *m
df3->flag |= ME_FACE_SEL;
}
-static void remap_uvs_7_11_13_14(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
+static void remap_uvs_7_11_13_14(Mesh *mesh, Mesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
{
MTFace *mf, *df1, *df2, *df3;
int l;
for (l = 0; l < numlayer; l++) {
- mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l);
+ mf = CustomData_get_layer_n(&split->fdata, CD_MTFACE, l);
df1 = mf + cur;
df2 = df1 + 1;
df3 = df1 + 2;
- mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l);
+ mf = CustomData_get_layer_n(&mesh->fdata, CD_MTFACE, l);
mf += i;
copy_v2_v2(df1->uv[0], mf->uv[c0]);
@@ -451,10 +466,10 @@ static void remap_uvs_7_11_13_14(DerivedMesh *dm, DerivedMesh *split, int numlay
}
}
-static void remap_faces_19_21_22(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3)
+static void remap_faces_19_21_22(Mesh *mesh, Mesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3)
{
- MFace *df1 = get_dface(dm, split, cur, i, mf);
- MFace *df2 = get_dface(dm, split, cur + 1, i, mf);
+ MFace *df1 = get_dface(mesh, split, cur, i, mf);
+ MFace *df2 = get_dface(mesh, split, cur + 1, i, mf);
facepa[cur] = vertpa[v1];
df1->v1 = v1;
@@ -471,16 +486,16 @@ static void remap_faces_19_21_22(DerivedMesh *dm, DerivedMesh *split, MFace *mf,
df2->flag |= ME_FACE_SEL;
}
-static void remap_uvs_19_21_22(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2)
+static void remap_uvs_19_21_22(Mesh *mesh, Mesh *split, int numlayer, int i, int cur, int c0, int c1, int c2)
{
MTFace *mf, *df1, *df2;
int l;
for (l = 0; l < numlayer; l++) {
- mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l);
+ mf = CustomData_get_layer_n(&split->fdata, CD_MTFACE, l);
df1 = mf + cur;
df2 = df1 + 1;
- mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l);
+ mf = CustomData_get_layer_n(&mesh->fdata, CD_MTFACE, l);
mf += i;
copy_v2_v2(df1->uv[0], mf->uv[c0]);
@@ -494,11 +509,11 @@ static void remap_uvs_19_21_22(DerivedMesh *dm, DerivedMesh *split, int numlayer
}
}
-static void remap_faces_23(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3)
+static void remap_faces_23(Mesh *mesh, Mesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3)
{
- MFace *df1 = get_dface(dm, split, cur, i, mf);
- MFace *df2 = get_dface(dm, split, cur + 1, i, mf);
- MFace *df3 = get_dface(dm, split, cur + 2, i, mf);
+ MFace *df1 = get_dface(mesh, split, cur, i, mf);
+ MFace *df2 = get_dface(mesh, split, cur + 1, i, mf);
+ MFace *df3 = get_dface(mesh, split, cur + 2, i, mf);
facepa[cur] = vertpa[v1];
df1->v1 = v1;
@@ -522,16 +537,16 @@ static void remap_faces_23(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *
df3->flag &= ~ME_FACE_SEL;
}
-static void remap_uvs_23(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2)
+static void remap_uvs_23(Mesh *mesh, Mesh *split, int numlayer, int i, int cur, int c0, int c1, int c2)
{
MTFace *mf, *df1, *df2;
int l;
for (l = 0; l < numlayer; l++) {
- mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l);
+ mf = CustomData_get_layer_n(&split->fdata, CD_MTFACE, l);
df1 = mf + cur;
df2 = df1 + 1;
- mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l);
+ mf = CustomData_get_layer_n(&mesh->fdata, CD_MTFACE, l);
mf += i;
copy_v2_v2(df1->uv[0], mf->uv[c0]);
@@ -549,16 +564,16 @@ static void remap_uvs_23(DerivedMesh *dm, DerivedMesh *split, int numlayer, int
}
}
-static DerivedMesh *cutEdges(ExplodeModifierData *emd, DerivedMesh *dm)
+static Mesh *cutEdges(ExplodeModifierData *emd, Mesh *mesh)
{
- DerivedMesh *splitdm;
+ Mesh *split_m;
MFace *mf = NULL, *df1 = NULL;
- MFace *mface = dm->getTessFaceArray(dm);
+ MFace *mface = mesh->mface;
MVert *dupve, *mv;
EdgeHash *edgehash;
EdgeHashIterator *ehi;
- int totvert = dm->getNumVerts(dm);
- int totface = dm->getNumTessFaces(dm);
+ int totvert = mesh->totvert;
+ int totface = mesh->totface;
int *facesplit = MEM_calloc_arrayN(totface, sizeof(int), "explode_facesplit");
int *vertpa = MEM_calloc_arrayN(totvert, sizeof(int), "explode_vertpa2");
@@ -577,8 +592,9 @@ static DerivedMesh *cutEdges(ExplodeModifierData *emd, DerivedMesh *dm)
vertpa[mf->v1] = facepa[i];
vertpa[mf->v2] = facepa[i];
vertpa[mf->v3] = facepa[i];
- if (mf->v4)
+ if (mf->v4) {
vertpa[mf->v4] = facepa[i];
+ }
}
/* mark edges for splitting and how to split faces */
@@ -611,8 +627,9 @@ static DerivedMesh *cutEdges(ExplodeModifierData *emd, DerivedMesh *dm)
}
/* mark center vertex as a fake edge split */
- if (*fs == 15)
+ if (*fs == 15) {
BLI_edgehash_reinsert(edgehash, mf->v1, mf->v3, NULL);
+ }
}
else {
(*fs) |= 16; /* mark face as tri */
@@ -628,7 +645,7 @@ static DerivedMesh *cutEdges(ExplodeModifierData *emd, DerivedMesh *dm)
ehi = BLI_edgehashIterator_new(edgehash);
totesplit = totvert;
for (; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
- BLI_edgehashIterator_setValue(ehi, SET_INT_IN_POINTER(totesplit));
+ BLI_edgehashIterator_setValue(ehi, POINTER_FROM_INT(totesplit));
totesplit++;
}
BLI_edgehashIterator_free(ehi);
@@ -637,19 +654,19 @@ static DerivedMesh *cutEdges(ExplodeModifierData *emd, DerivedMesh *dm)
for (i = 0, fs = facesplit; i < totface; i++, fs++)
totfsplit += add_faces[*fs];
- splitdm = CDDM_from_template_ex(
- dm, totesplit, 0, totface + totfsplit, 0, 0,
- CD_MASK_DERIVEDMESH | CD_MASK_FACECORNERS);
- numlayer = CustomData_number_of_layers(&splitdm->faceData, CD_MTFACE);
+ split_m = BKE_mesh_new_nomain_from_template(
+ mesh, totesplit, 0, totface + totfsplit, 0, 0);
+
+ numlayer = CustomData_number_of_layers(&split_m->fdata, CD_MTFACE);
/* copy new faces & verts (is it really this painful with custom data??) */
for (i = 0; i < totvert; i++) {
MVert source;
MVert *dest;
- dm->getVert(dm, i, &source);
- dest = CDDM_get_vert(splitdm, i);
+ source = mesh->mvert[i];
+ dest = &split_m->mvert[i];
- DM_copy_vert_data(dm, splitdm, i, i, 1);
+ CustomData_copy_data(&mesh->vdata, &split_m->vdata, i, i, 1);
*dest = source;
}
@@ -667,15 +684,15 @@ static DerivedMesh *cutEdges(ExplodeModifierData *emd, DerivedMesh *dm)
ehi = BLI_edgehashIterator_new(edgehash);
for (; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
BLI_edgehashIterator_getKey(ehi, &ed_v1, &ed_v2);
- esplit = GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
- mv = CDDM_get_vert(splitdm, ed_v2);
- dupve = CDDM_get_vert(splitdm, esplit);
+ esplit = POINTER_AS_INT(BLI_edgehashIterator_getValue(ehi));
+ mv = &split_m->mvert[ed_v2];
+ dupve = &split_m->mvert[esplit];
- DM_copy_vert_data(splitdm, splitdm, ed_v2, esplit, 1);
+ CustomData_copy_data(&split_m->vdata, &split_m->vdata, ed_v2, esplit, 1);
*dupve = *mv;
- mv = CDDM_get_vert(splitdm, ed_v1);
+ mv = &split_m->mvert[ed_v1];
mid_v3_v3v3(dupve->co, dupve->co, mv->co);
}
@@ -685,7 +702,7 @@ static DerivedMesh *cutEdges(ExplodeModifierData *emd, DerivedMesh *dm)
curdupface = 0; //=totface;
//curdupin=totesplit;
for (i = 0, fs = facesplit; i < totface; i++, fs++) {
- mf = dm->getTessFaceData(dm, i, CD_MFACE);
+ mf = &mesh->mface[i];
switch (*fs) {
case 3:
@@ -724,50 +741,58 @@ static DerivedMesh *cutEdges(ExplodeModifierData *emd, DerivedMesh *dm)
case 6:
case 9:
case 12:
- remap_faces_3_6_9_12(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
- if (numlayer)
- remap_uvs_3_6_9_12(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
+ remap_faces_3_6_9_12(mesh, split_m, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
+ if (numlayer) {
+ remap_uvs_3_6_9_12(mesh, split_m, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
+ }
break;
case 5:
case 10:
- remap_faces_5_10(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
- if (numlayer)
- remap_uvs_5_10(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
+ remap_faces_5_10(mesh, split_m, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
+ if (numlayer) {
+ remap_uvs_5_10(mesh, split_m, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
+ }
break;
case 15:
- remap_faces_15(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
- if (numlayer)
- remap_uvs_15(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
+ remap_faces_15(mesh, split_m, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
+ if (numlayer) {
+ remap_uvs_15(mesh, split_m, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
+ }
break;
case 7:
case 11:
case 13:
case 14:
- remap_faces_7_11_13_14(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
- if (numlayer)
- remap_uvs_7_11_13_14(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
+ remap_faces_7_11_13_14(mesh, split_m, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
+ if (numlayer) {
+ remap_uvs_7_11_13_14(mesh, split_m, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
+ }
break;
case 19:
case 21:
case 22:
- remap_faces_19_21_22(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2]);
- if (numlayer)
- remap_uvs_19_21_22(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2]);
+ remap_faces_19_21_22(mesh, split_m, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2]);
+ if (numlayer) {
+ remap_uvs_19_21_22(mesh, split_m, numlayer, i, curdupface, uv[0], uv[1], uv[2]);
+ }
break;
case 23:
- remap_faces_23(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2]);
- if (numlayer)
- remap_uvs_23(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2]);
+ remap_faces_23(mesh, split_m, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2]);
+ if (numlayer) {
+ remap_uvs_23(mesh, split_m, numlayer, i, curdupface, uv[0], uv[1], uv[2]);
+ }
break;
case 0:
case 16:
- df1 = get_dface(dm, splitdm, curdupface, i, mf);
+ df1 = get_dface(mesh, split_m, curdupface, i, mf);
facepa[curdupface] = vertpa[mf->v1];
- if (df1->v4)
+ if (df1->v4) {
df1->flag |= ME_FACE_SEL;
- else
+ }
+ else {
df1->flag &= ~ME_FACE_SEL;
+ }
break;
}
@@ -775,25 +800,25 @@ static DerivedMesh *cutEdges(ExplodeModifierData *emd, DerivedMesh *dm)
}
for (i = 0; i < curdupface; i++) {
- mf = CDDM_get_tessface(splitdm, i);
- test_index_face(mf, &splitdm->faceData, i, ((mf->flag & ME_FACE_SEL) ? 4 : 3));
+ mf = &split_m->mface[i];
+ test_index_face(mf, &split_m->fdata, i, ((mf->flag & ME_FACE_SEL) ? 4 : 3));
}
BLI_edgehash_free(edgehash, NULL);
MEM_freeN(facesplit);
MEM_freeN(vertpa);
- CDDM_calc_edges_tessface(splitdm);
- CDDM_tessfaces_to_faces(splitdm); /*builds ngon faces from tess (mface) faces*/
+ BKE_mesh_calc_edges_tessface(split_m);
+ BKE_mesh_convert_mfaces_to_mpolys(split_m);
- return splitdm;
+ return split_m;
}
-static DerivedMesh *explodeMesh(
+static Mesh *explodeMesh(
ExplodeModifierData *emd,
ParticleSystemModifierData *psmd, const ModifierEvalContext *ctx, Scene *scene,
- DerivedMesh *to_explode)
+ Mesh *to_explode)
{
- DerivedMesh *explode, *dm = to_explode;
+ Mesh *explode, *mesh = to_explode;
MFace *mf = NULL, *mface;
/* ParticleSettings *part=psmd->psys->part; */ /* UNUSED */
ParticleSimulationData sim = {NULL};
@@ -811,9 +836,9 @@ static DerivedMesh *explodeMesh(
unsigned int ed_v1, ed_v2, mindex = 0;
MTFace *mtface = NULL, *mtf;
- totface = dm->getNumTessFaces(dm);
- totvert = dm->getNumVerts(dm);
- mface = dm->getTessFaceArray(dm);
+ totface = mesh->totface;
+ totvert = mesh->totvert;
+ mface = mesh->mface;
totpart = psmd->psys->totpart;
sim.depsgraph = ctx->depsgraph;
@@ -844,10 +869,12 @@ static DerivedMesh *explodeMesh(
/* do mindex + totvert to ensure the vertex index to be the first
* with BLI_edgehashIterator_getKey */
- if (facepa[i] == totpart || cfra < (pars + facepa[i])->time)
+ if (facepa[i] == totpart || cfra < (pars + facepa[i])->time) {
mindex = totvert + totpart;
- else
+ }
+ else {
mindex = totvert + facepa[i];
+ }
mf = &mface[i];
@@ -855,21 +882,23 @@ static DerivedMesh *explodeMesh(
BLI_edgehash_reinsert(vertpahash, mf->v1, mindex, NULL);
BLI_edgehash_reinsert(vertpahash, mf->v2, mindex, NULL);
BLI_edgehash_reinsert(vertpahash, mf->v3, mindex, NULL);
- if (mf->v4)
+ if (mf->v4) {
BLI_edgehash_reinsert(vertpahash, mf->v4, mindex, NULL);
+ }
}
/* make new vertice indexes & count total vertices after duplication */
ehi = BLI_edgehashIterator_new(vertpahash);
for (; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
- BLI_edgehashIterator_setValue(ehi, SET_INT_IN_POINTER(totdup));
+ BLI_edgehashIterator_setValue(ehi, POINTER_FROM_INT(totdup));
totdup++;
}
BLI_edgehashIterator_free(ehi);
/* the final duplicated vertices */
- explode = CDDM_from_template_ex(dm, totdup, 0, totface - delface, 0, 0, CD_MASK_DERIVEDMESH | CD_MASK_FACECORNERS);
- mtface = CustomData_get_layer_named(&explode->faceData, CD_MTFACE, emd->uvname);
+ explode = BKE_mesh_new_nomain_from_template(mesh, totdup, 0, totface - delface, 0, 0);
+
+ mtface = CustomData_get_layer_named(&explode->fdata, CD_MTFACE, emd->uvname);
/*dupvert = CDDM_get_verts(explode);*/
/* getting back to object space */
@@ -886,12 +915,13 @@ static DerivedMesh *explodeMesh(
/* get particle + vertex from hash */
BLI_edgehashIterator_getKey(ehi, &ed_v1, &ed_v2);
ed_v2 -= totvert;
- v = GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
+ v = POINTER_AS_INT(BLI_edgehashIterator_getValue(ehi));
- dm->getVert(dm, ed_v1, &source);
- dest = CDDM_get_vert(explode, v);
+ source = mesh->mvert[ed_v1];
+ dest = &explode->mvert[v];
+
+ CustomData_copy_data(&mesh->vdata, &explode->vdata, ed_v1, v, 1);
- DM_copy_vert_data(dm, explode, ed_v1, v, 1);
*dest = source;
if (ed_v2 != totpart) {
@@ -903,7 +933,7 @@ static DerivedMesh *explodeMesh(
state.time = cfra;
psys_get_particle_state(&sim, ed_v2, &state, 1);
- vertco = CDDM_get_vert(explode, v)->co;
+ vertco = explode->mvert[v].co;
mul_m4_v3(ctx->object->obmat, vertco);
sub_v3_v3(vertco, birth.co);
@@ -912,8 +942,9 @@ static DerivedMesh *explodeMesh(
sub_qt_qtqt(rot, state.rot, birth.rot);
mul_qt_v3(rot, vertco);
- if (emd->flag & eExplodeFlag_PaSize)
+ if (emd->flag & eExplodeFlag_PaSize) {
mul_v3_fl(vertco, pa->size);
+ }
add_v3_v3(vertco, state.co);
@@ -935,23 +966,26 @@ static DerivedMesh *explodeMesh(
if (pa->alive == PARS_DEAD && (emd->flag & eExplodeFlag_Dead) == 0) continue;
}
- dm->getTessFace(dm, i, &source);
- mf = CDDM_get_tessface(explode, u);
+ source = mesh->mface[i];
+ mf = &explode->mface[u];
orig_v4 = source.v4;
- if (facepa[i] != totpart && cfra < pa->time)
+ if (facepa[i] != totpart && cfra < pa->time) {
mindex = totvert + totpart;
- else
+ }
+ else {
mindex = totvert + facepa[i];
+ }
source.v1 = edgecut_get(vertpahash, source.v1, mindex);
source.v2 = edgecut_get(vertpahash, source.v2, mindex);
source.v3 = edgecut_get(vertpahash, source.v3, mindex);
- if (source.v4)
+ if (source.v4) {
source.v4 = edgecut_get(vertpahash, source.v4, mindex);
+ }
- DM_copy_tessface_data(dm, explode, i, u, 1);
+ CustomData_copy_data(&mesh->fdata, &explode->fdata, i, u, 1);
*mf = source;
@@ -967,7 +1001,7 @@ static DerivedMesh *explodeMesh(
mtf->uv[0][1] = mtf->uv[1][1] = mtf->uv[2][1] = mtf->uv[3][1] = 0.5f;
}
- test_index_face(mf, &explode->faceData, u, (orig_v4 ? 4 : 3));
+ test_index_face(mf, &explode->fdata, u, (orig_v4 ? 4 : 3));
u++;
}
@@ -975,9 +1009,9 @@ static DerivedMesh *explodeMesh(
BLI_edgehash_free(vertpahash, NULL);
/* finalization */
- CDDM_calc_edges_tessface(explode);
- CDDM_tessfaces_to_faces(explode);
- explode->dirty |= DM_DIRTY_NORMALS;
+ BKE_mesh_calc_edges_tessface(explode);
+ BKE_mesh_convert_mfaces_to_mpolys(explode);
+ explode->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
if (psmd->psys->lattice_deform_data) {
end_latt_deform(psmd->psys->lattice_deform_data);
@@ -993,62 +1027,67 @@ static ParticleSystemModifierData *findPrecedingParticlesystem(Object *ob, Modif
ParticleSystemModifierData *psmd = NULL;
for (md = ob->modifiers.first; emd != md; md = md->next) {
- if (md->type == eModifierType_ParticleSystem)
+ if (md->type == eModifierType_ParticleSystem) {
psmd = (ParticleSystemModifierData *) md;
+ }
}
return psmd;
}
-static DerivedMesh *applyModifier(
+static Mesh *applyModifier(
ModifierData *md, const ModifierEvalContext *ctx,
- DerivedMesh *derivedData)
+ Mesh *mesh)
{
- DerivedMesh *dm = derivedData;
ExplodeModifierData *emd = (ExplodeModifierData *) md;
ParticleSystemModifierData *psmd = findPrecedingParticlesystem(ctx->object, md);
if (psmd) {
ParticleSystem *psys = psmd->psys;
- if (psys == NULL || psys->totpart == 0) return derivedData;
- if (psys->part == NULL || psys->particles == NULL) return derivedData;
- if (psmd->mesh_final == NULL) return derivedData;
+ if (psys == NULL || psys->totpart == 0) {
+ return mesh;
+ }
+ if (psys->part == NULL || psys->particles == NULL) {
+ return mesh;
+ }
+ if (psmd->mesh_final == NULL) {
+ return mesh;
+ }
- DM_ensure_tessface(dm); /* BMESH - UNTIL MODIFIER IS UPDATED FOR MPoly */
+ BKE_mesh_tessface_ensure(mesh); /* BMESH - UNTIL MODIFIER IS UPDATED FOR MPoly */
/* 1. find faces to be exploded if needed */
if (emd->facepa == NULL ||
psmd->flag & eParticleSystemFlag_Pars ||
emd->flag & eExplodeFlag_CalcFaces ||
- MEM_allocN_len(emd->facepa) / sizeof(int) != dm->getNumTessFaces(dm))
+ MEM_allocN_len(emd->facepa) / sizeof(int) != mesh->totface)
{
- if (psmd->flag & eParticleSystemFlag_Pars)
+ if (psmd->flag & eParticleSystemFlag_Pars) {
psmd->flag &= ~eParticleSystemFlag_Pars;
-
- if (emd->flag & eExplodeFlag_CalcFaces)
+ }
+ if (emd->flag & eExplodeFlag_CalcFaces) {
emd->flag &= ~eExplodeFlag_CalcFaces;
-
- createFacepa(emd, psmd, derivedData);
+ }
+ createFacepa(emd, psmd, mesh);
}
/* 2. create new mesh */
Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph);
if (emd->flag & eExplodeFlag_EdgeCut) {
int *facepa = emd->facepa;
- DerivedMesh *splitdm = cutEdges(emd, dm);
- DerivedMesh *explode = explodeMesh(emd, psmd, ctx, scene, splitdm);
+ Mesh *split_m = cutEdges(emd, mesh);
+ Mesh *explode = explodeMesh(emd, psmd, ctx, scene, split_m);
MEM_freeN(emd->facepa);
emd->facepa = facepa;
- splitdm->release(splitdm);
+ BKE_id_free(NULL, split_m);
return explode;
}
else {
- return explodeMesh(emd, psmd, ctx, scene, derivedData);
+ return explodeMesh(emd, psmd, ctx, scene, mesh);
}
}
- return derivedData;
+ return mesh;
}
-
ModifierTypeInfo modifierType_Explode = {
/* name */ "Explode",
/* structName */ "ExplodeModifierData",
@@ -1061,15 +1100,13 @@ ModifierTypeInfo modifierType_Explode = {
/* deformMatrices_DM */ NULL,
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
- /* applyModifier_DM */ applyModifier,
- /* applyModifierEM_DM */NULL,
+ /* applyModifier_DM */ NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
- /* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
+ /* applyModifier */ applyModifier,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_fluidsim.c b/source/blender/modifiers/intern/MOD_fluidsim.c
index ebea7250d18..8b6f25ab0ab 100644
--- a/source/blender/modifiers/intern/MOD_fluidsim.c
+++ b/source/blender/modifiers/intern/MOD_fluidsim.c
@@ -154,14 +154,12 @@ ModifierTypeInfo modifierType_Fluidsim = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_fluidsim_util.c b/source/blender/modifiers/intern/MOD_fluidsim_util.c
index 44079163de5..23a62f88f77 100644
--- a/source/blender/modifiers/intern/MOD_fluidsim_util.c
+++ b/source/blender/modifiers/intern/MOD_fluidsim_util.c
@@ -47,11 +47,12 @@
#include "BLI_utildefines.h"
#include "BKE_fluidsim.h" /* ensure definitions here match */
-#include "BKE_main.h"
-#include "BKE_mesh.h"
#ifdef WITH_MOD_FLUID
# include "BKE_global.h"
#endif
+#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_mesh.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
@@ -164,7 +165,7 @@ void fluidsim_free(FluidsimModifierData *fluidmd)
}
#ifdef WITH_MOD_FLUID
-/* read .bobj.gz file into a fluidsimDerivedMesh struct */
+/* read .bobj.gz file into a fluidsimMesh struct */
static Mesh *fluidsim_read_obj(const char *filename, const MPoly *mp_example)
{
int wri = 0, i;
@@ -479,8 +480,8 @@ static Mesh *fluidsim_read_cache(
const char *strEnvName2 = "BLENDER_ELBEEMBOBJABORT"; // from blendercall.cpp
if (G.background == 1) {
- if (getenv(strEnvName2)) {
- int elevel = atoi(getenv(strEnvName2));
+ if (BLI_getenv(strEnvName2)) {
+ int elevel = atoi(BLI_getenv(strEnvName2));
if (elevel > 0) {
printf("Env. var %s set, fluid sim mesh '%s' not found, aborting render...\n",
strEnvName2, targetFile);
diff --git a/source/blender/modifiers/intern/MOD_fluidsim_util.h b/source/blender/modifiers/intern/MOD_fluidsim_util.h
index 041a67eddbd..4bb745fbd66 100644
--- a/source/blender/modifiers/intern/MOD_fluidsim_util.h
+++ b/source/blender/modifiers/intern/MOD_fluidsim_util.h
@@ -46,6 +46,6 @@ void fluidsim_free(struct FluidsimModifierData *fluidmd);
struct Mesh *fluidsimModifier_do(
struct FluidsimModifierData *fluidmd,
const struct ModifierEvalContext *ctx,
- struct Mesh *dm);
+ struct Mesh *me);
#endif
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index fd6f8a0df4d..14143f60310 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -183,7 +183,7 @@ static void freeData(ModifierData *md)
//XXX todo, simplify to copy generic stuff, maybe take shards over even, but re-init the meshisland verts as in packing system
-static void copyData(ModifierData *md_src, ModifierData *md_dst, const int flag)
+static void copyData(const ModifierData *md_src, ModifierData *md_dst, const int flag)
{
FractureModifierData *fmd_dst = (FractureModifierData *)md_dst;
@@ -370,14 +370,12 @@ ModifierTypeInfo modifierType_Fracture = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_hook.c b/source/blender/modifiers/intern/MOD_hook.c
index a1629d8c1f2..0764bba6a14 100644
--- a/source/blender/modifiers/intern/MOD_hook.c
+++ b/source/blender/modifiers/intern/MOD_hook.c
@@ -393,14 +393,12 @@ ModifierTypeInfo modifierType_Hook = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_laplaciandeform.c b/source/blender/modifiers/intern/MOD_laplaciandeform.c
index 2406739e6df..ad6c6e0163d 100644
--- a/source/blender/modifiers/intern/MOD_laplaciandeform.c
+++ b/source/blender/modifiers/intern/MOD_laplaciandeform.c
@@ -72,7 +72,7 @@ typedef struct LaplacianSystem {
float (*co)[3]; /* Original vertex coordinates */
float (*no)[3]; /* Original vertex normal */
float (*delta)[3]; /* Differential Coordinates */
- unsigned int (*tris)[3]; /* Copy of MLoopTri (tesselation triangle) v1-v3 */
+ unsigned int (*tris)[3]; /* Copy of MLoopTri (tessellation triangle) v1-v3 */
int *index_anchors; /* Static vertex index list */
int *unit_verts; /* Unit vectors of projected edges onto the plane orthogonal to n */
int *ringf_indices; /* Indices of faces per vertex */
@@ -214,7 +214,7 @@ static void createVertRingMap(
/**
* This method computes the Laplacian Matrix and Differential Coordinates for all vertex in the mesh.
* The Linear system is LV = d
- * Where L is Laplacian Matrix, V as the vertexes in Mesh, d is the differential coordinates
+ * Where L is Laplacian Matrix, V as the vertices in Mesh, d is the differential coordinates
* The Laplacian Matrix is computes as a
* Lij = sum(Wij) (if i == j)
* Lij = Wij (if i != j)
@@ -224,7 +224,7 @@ static void createVertRingMap(
* di = Vi * sum(Wij) - sum(Wij * Vj)
* Where :
* di is the Differential Coordinate i
- * sum (Wij) is the sum of all weights between vertex Vi and its vertexes neighbors (Vj)
+ * sum (Wij) is the sum of all weights between vertex Vi and its vertices neighbors (Vj)
* sum (Wij * Vj) is the sum of the product between vertex neighbor Vj and weight Wij for all neighborhood.
*
* This Laplacian Matrix is described in the paper:
@@ -566,7 +566,7 @@ static void initSystem(
mlooptri = BKE_mesh_runtime_looptri_ensure(mesh);
- mloop = mesh->mloop;;
+ mloop = mesh->mloop;
for (i = 0; i < sys->total_tris; i++) {
sys->tris[i][0] = mloop[mlooptri[i].tri[0]].v;
@@ -778,14 +778,12 @@ ModifierTypeInfo modifierType_LaplacianDeform = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_laplaciansmooth.c b/source/blender/modifiers/intern/MOD_laplaciansmooth.c
index 19838a2b637..fba4ac5d9e5 100644
--- a/source/blender/modifiers/intern/MOD_laplaciansmooth.c
+++ b/source/blender/modifiers/intern/MOD_laplaciansmooth.c
@@ -63,8 +63,8 @@ struct BLaplacianSystem {
int numLoops; /* Number of edges*/
int numPolys; /* Number of faces*/
int numVerts; /* Number of verts*/
- short *numNeFa; /* Number of neighboors faces around vertice*/
- short *numNeEd; /* Number of neighboors Edges around vertice*/
+ short *numNeFa; /* Number of neighbors faces around vertice*/
+ short *numNeEd; /* Number of neighbors Edges around vertice*/
short *zerola; /* Is zero area or length*/
/* Pointers to data*/
@@ -271,7 +271,7 @@ static void init_laplacian_matrix(LaplacianSystem *sys)
for (i = 0; i < sys->numEdges; i++) {
idv1 = sys->medges[i].v1;
idv2 = sys->medges[i].v2;
- /* if is boundary, apply scale-dependent umbrella operator only with neighboors in boundary */
+ /* if is boundary, apply scale-dependent umbrella operator only with neighbors in boundary */
if (sys->numNeEd[idv1] != sys->numNeFa[idv1] && sys->numNeEd[idv2] != sys->numNeFa[idv2]) {
sys->vlengths[idv1] += sys->eweights[i];
sys->vlengths[idv2] += sys->eweights[i];
@@ -550,14 +550,12 @@ ModifierTypeInfo modifierType_LaplacianSmooth = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ init_data,
/* requiredDataMask */ required_data_mask,
diff --git a/source/blender/modifiers/intern/MOD_lattice.c b/source/blender/modifiers/intern/MOD_lattice.c
index 3acd39bf19d..7937d1611f9 100644
--- a/source/blender/modifiers/intern/MOD_lattice.c
+++ b/source/blender/modifiers/intern/MOD_lattice.c
@@ -141,14 +141,12 @@ ModifierTypeInfo modifierType_Lattice = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_mask.c b/source/blender/modifiers/intern/MOD_mask.c
index fd833a2a322..78058277033 100644
--- a/source/blender/modifiers/intern/MOD_mask.c
+++ b/source/blender/modifiers/intern/MOD_mask.c
@@ -183,7 +183,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
for (j = 0; j < dv->totweight; j++, dw++) {
if (dw->def_nr < defbase_tot) {
if (bone_select_array[dw->def_nr]) {
- if (dw->weight != 0.0f) {
+ if (dw->weight > mmd->threshold) {
found = true;
break;
}
@@ -196,7 +196,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
}
/* add to ghash for verts (numVerts acts as counter for mapping) */
- BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numVerts));
+ BLI_ghash_insert(vertHash, POINTER_FROM_INT(i), POINTER_FROM_INT(numVerts));
numVerts++;
}
@@ -216,13 +216,13 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
/* add vertices which exist in vertexgroup into ghash for filtering */
for (i = 0, dv = dvert; i < maxVerts; i++, dv++) {
- const bool found = defvert_find_weight(dv, defgrp_index) != 0.0f;
+ const bool found = defvert_find_weight(dv, defgrp_index) > mmd->threshold;
if (found_test != found) {
continue;
}
/* add to ghash for verts (numVerts acts as counter for mapping) */
- BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numVerts));
+ BLI_ghash_insert(vertHash, POINTER_FROM_INT(i), POINTER_FROM_INT(numVerts));
numVerts++;
}
}
@@ -246,10 +246,10 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
const MEdge *me = &medge_src[i];
/* only add if both verts will be in new mesh */
- if (BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me->v1)) &&
- BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me->v2)))
+ if (BLI_ghash_haskey(vertHash, POINTER_FROM_INT(me->v1)) &&
+ BLI_ghash_haskey(vertHash, POINTER_FROM_INT(me->v2)))
{
- BLI_ghash_insert(edgeHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numEdges));
+ BLI_ghash_insert(edgeHash, POINTER_FROM_INT(i), POINTER_FROM_INT(numEdges));
numEdges++;
}
}
@@ -260,7 +260,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
int j;
for (j = 0; j < mp_src->totloop; j++, ml_src++) {
- if (!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(ml_src->v))) {
+ if (!BLI_ghash_haskey(vertHash, POINTER_FROM_INT(ml_src->v))) {
ok = false;
break;
}
@@ -268,7 +268,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
/* all verts must be available */
if (ok) {
- BLI_ghash_insert(polyHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numPolys));
+ BLI_ghash_insert(polyHash, POINTER_FROM_INT(i), POINTER_FROM_INT(numPolys));
loop_mapping[numPolys] = numLoops;
numPolys++;
numLoops += mp_src->totloop;
@@ -291,8 +291,8 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
GHASH_ITER (gh_iter, vertHash) {
const MVert *v_src;
MVert *v_dst;
- const int i_src = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(&gh_iter));
- const int i_dst = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(&gh_iter));
+ const int i_src = POINTER_AS_INT(BLI_ghashIterator_getKey(&gh_iter));
+ const int i_dst = POINTER_AS_INT(BLI_ghashIterator_getValue(&gh_iter));
v_src = &mvert_src[i_src];
v_dst = &mvert_dst[i_dst];
@@ -305,22 +305,22 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
GHASH_ITER (gh_iter, edgeHash) {
const MEdge *e_src;
MEdge *e_dst;
- const int i_src = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(&gh_iter));
- const int i_dst = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(&gh_iter));
+ const int i_src = POINTER_AS_INT(BLI_ghashIterator_getKey(&gh_iter));
+ const int i_dst = POINTER_AS_INT(BLI_ghashIterator_getValue(&gh_iter));
e_src = &medge_src[i_src];
e_dst = &medge_dst[i_dst];
CustomData_copy_data(&mesh->edata, &result->edata, i_src, i_dst, 1);
*e_dst = *e_src;
- e_dst->v1 = GET_UINT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_UINT_IN_POINTER(e_src->v1)));
- e_dst->v2 = GET_UINT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_UINT_IN_POINTER(e_src->v2)));
+ e_dst->v1 = POINTER_AS_UINT(BLI_ghash_lookup(vertHash, POINTER_FROM_UINT(e_src->v1)));
+ e_dst->v2 = POINTER_AS_UINT(BLI_ghash_lookup(vertHash, POINTER_FROM_UINT(e_src->v2)));
}
/* faces */
GHASH_ITER (gh_iter, polyHash) {
- const int i_src = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(&gh_iter));
- const int i_dst = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(&gh_iter));
+ const int i_src = POINTER_AS_INT(BLI_ghashIterator_getKey(&gh_iter));
+ const int i_dst = POINTER_AS_INT(BLI_ghashIterator_getValue(&gh_iter));
const MPoly *mp_src = &mpoly_src[i_src];
MPoly *mp_dst = &mpoly_dst[i_dst];
const int i_ml_src = mp_src->loopstart;
@@ -334,8 +334,8 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
*mp_dst = *mp_src;
mp_dst->loopstart = i_ml_dst;
for (i = 0; i < mp_src->totloop; i++) {
- ml_dst[i].v = GET_UINT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_UINT_IN_POINTER(ml_src[i].v)));
- ml_dst[i].e = GET_UINT_FROM_POINTER(BLI_ghash_lookup(edgeHash, SET_UINT_IN_POINTER(ml_src[i].e)));
+ ml_dst[i].v = POINTER_AS_UINT(BLI_ghash_lookup(vertHash, POINTER_FROM_UINT(ml_src[i].v)));
+ ml_dst[i].e = POINTER_AS_UINT(BLI_ghash_lookup(edgeHash, POINTER_FROM_UINT(ml_src[i].e)));
}
}
@@ -371,14 +371,12 @@ ModifierTypeInfo modifierType_Mask = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ NULL,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_meshcache.c b/source/blender/modifiers/intern/MOD_meshcache.c
index 3263641896f..e3aa239a713 100644
--- a/source/blender/modifiers/intern/MOD_meshcache.c
+++ b/source/blender/modifiers/intern/MOD_meshcache.c
@@ -36,10 +36,11 @@
#include "BLI_path_util.h"
#include "BLI_math.h"
-#include "BKE_scene.h"
#include "BKE_global.h"
-#include "BKE_mesh.h"
+#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_mesh.h"
+#include "BKE_scene.h"
#include "DEG_depsgraph_query.h"
@@ -305,14 +306,12 @@ ModifierTypeInfo modifierType_MeshCache = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c
index 9bfbbc4e44e..aaf6c532de0 100644
--- a/source/blender/modifiers/intern/MOD_meshdeform.c
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -299,7 +299,7 @@ static void meshdeformModifier_do(
*
* Only do this is the target object is in edit mode by itself, meaning
* we don't allow linked edit meshes here.
- * This is because editbmesh_get_derived_cage_and_final() might easily
+ * This is because editbmesh_get_mesh_cage_and_final() might easily
* conflict with the thread which evaluates object which is in the edit
* mode for this mesh.
*
@@ -325,11 +325,18 @@ static void meshdeformModifier_do(
/* progress bar redraw can make this recursive .. */
if (!recursive) {
+ /* Write binding data to original modifier. */
Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph);
+ Object *ob_orig = DEG_get_original_object(ob);
+ MeshDeformModifierData *mmd_orig = (MeshDeformModifierData *)modifiers_findByName(
+ ob_orig, mmd->modifier.name);
+
recursive = 1;
- mmd->bindfunc(scene, mmd, cagemesh, (float *)vertexCos, numVerts, cagemat);
+ mmd->bindfunc(scene, mmd_orig, cagemesh, (float *)vertexCos, numVerts, cagemat);
recursive = 0;
}
+
+ return;
}
/* verify we have compatible weights */
@@ -514,14 +521,12 @@ ModifierTypeInfo modifierType_MeshDeform = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_meshsequencecache.c b/source/blender/modifiers/intern/MOD_meshsequencecache.c
index cef55bf467b..6db78731683 100644
--- a/source/blender/modifiers/intern/MOD_meshsequencecache.c
+++ b/source/blender/modifiers/intern/MOD_meshsequencecache.c
@@ -158,8 +158,13 @@ static Mesh *applyModifier(
static bool dependsOnTime(ModifierData *md)
{
+#ifdef WITH_ALEMBIC
+ MeshSeqCacheModifierData *mcmd = (MeshSeqCacheModifierData *) md;
+ return (mcmd->cache_file != NULL);
+#else
UNUSED_VARS(md);
- return true;
+ return false;
+#endif
}
static void foreachIDLink(
@@ -196,14 +201,12 @@ ModifierTypeInfo modifierType_MeshSequenceCache = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_mirror.c b/source/blender/modifiers/intern/MOD_mirror.c
index 4b16f165a12..d4e02a437d7 100644
--- a/source/blender/modifiers/intern/MOD_mirror.c
+++ b/source/blender/modifiers/intern/MOD_mirror.c
@@ -134,7 +134,7 @@ static Mesh *doMirrorOnAxis(
CustomData_copy_data(&mesh->ldata, &result->ldata, 0, 0, maxLoops);
CustomData_copy_data(&mesh->pdata, &result->pdata, 0, 0, maxPolys);
- /* Subsurf for eg wont have mesh data in the custom data arrays.
+ /* Subsurf for eg won't have mesh data in the custom data arrays.
* now add mvert/medge/mpoly layers. */
if (!CustomData_has_layer(&mesh->vdata, CD_MVERT)) {
memcpy(result->mvert, mesh->mvert, sizeof(*result->mvert) * mesh->totvert);
@@ -359,14 +359,12 @@ ModifierTypeInfo modifierType_Mirror = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c
index 24495efa08d..73fa7aa0e0d 100644
--- a/source/blender/modifiers/intern/MOD_multires.c
+++ b/source/blender/modifiers/intern/MOD_multires.c
@@ -42,10 +42,13 @@
#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
+#include "BKE_global.h"
#include "BKE_mesh.h"
#include "BKE_multires.h"
#include "BKE_modifier.h"
#include "BKE_subdiv.h"
+#include "BKE_subdiv_ccg.h"
+#include "BKE_subdiv_mesh.h"
#include "BKE_subsurf.h"
#include "DEG_depsgraph_query.h"
@@ -64,7 +67,9 @@ static void initData(ModifierData *md)
mmd->quality = 3;
}
-static DerivedMesh *applyModifier(
+#ifndef WITH_OPENSUBDIV_MODIFIER
+
+static DerivedMesh *applyModifier_DM(
ModifierData *md, const ModifierEvalContext *ctx,
DerivedMesh *dm)
{
@@ -141,26 +146,80 @@ static DerivedMesh *applyModifier(
return result;
}
+applyModifier_DM_wrapper(applyModifier, applyModifier_DM)
+
+#endif
+
#ifdef WITH_OPENSUBDIV_MODIFIER
-static Mesh *applyModifier_subdiv(ModifierData *md,
- const ModifierEvalContext *ctx,
- Mesh *mesh)
+
+/* Subdivide into fully qualified mesh. */
+
+static Mesh *multires_as_mesh(MultiresModifierData *mmd,
+ const ModifierEvalContext *ctx,
+ Mesh *mesh,
+ Subdiv *subdiv)
{
+ Mesh *result = mesh;
const bool use_render_params = (ctx->flag & MOD_APPLY_RENDER);
const bool ignore_simplify = (ctx->flag & MOD_APPLY_IGNORE_SIMPLIFY);
const Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph);
Object *object = ctx->object;
+ SubdivToMeshSettings mesh_settings;
+ BKE_multires_subdiv_mesh_settings_init(
+ &mesh_settings, scene, object, mmd, use_render_params, ignore_simplify);
+ if (mesh_settings.resolution < 3) {
+ return result;
+ }
+ BKE_subdiv_displacement_attach_from_multires(subdiv, mesh, mmd);
+ result = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh);
+ return result;
+}
+
+/* Subdivide into CCG. */
+
+static void multires_ccg_settings_init(SubdivToCCGSettings *settings,
+ const MultiresModifierData *mmd,
+ const ModifierEvalContext *ctx,
+ Mesh *mesh)
+{
+ const bool has_mask =
+ CustomData_has_layer(&mesh->ldata, CD_GRID_PAINT_MASK);
+ const bool use_render_params = (ctx->flag & MOD_APPLY_RENDER);
+ const bool ignore_simplify = (ctx->flag & MOD_APPLY_IGNORE_SIMPLIFY);
+ const Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph);
+ Object *object = ctx->object;
+ const int level = multires_get_level(
+ scene, object, mmd, use_render_params, ignore_simplify);
+ settings->resolution = (1 << level) + 1;
+ settings->need_normal = true;
+ settings->need_mask = has_mask;
+}
+
+static Mesh *multires_as_ccg(MultiresModifierData *mmd,
+ const ModifierEvalContext *ctx,
+ Mesh *mesh,
+ Subdiv *subdiv)
+{
+ Mesh *result = mesh;
+ SubdivToCCGSettings ccg_settings;
+ multires_ccg_settings_init(&ccg_settings, mmd, ctx, mesh);
+ if (ccg_settings.resolution < 3) {
+ return result;
+ }
+ BKE_subdiv_displacement_attach_from_multires(subdiv, mesh, mmd);
+ result = BKE_subdiv_to_ccg_mesh(subdiv, &ccg_settings, mesh);
+ return result;
+}
+
+static Mesh *applyModifier_subdiv(ModifierData *md,
+ const ModifierEvalContext *ctx,
+ Mesh *mesh)
+{
Mesh *result = mesh;
MultiresModifierData *mmd = (MultiresModifierData *)md;
SubdivSettings subdiv_settings;
BKE_multires_subdiv_settings_init(&subdiv_settings, mmd);
- SubdivToMeshSettings mesh_settings;
- BKE_multires_subdiv_mesh_settings_init(
- &mesh_settings, scene, object, mmd, use_render_params, ignore_simplify);
- if (subdiv_settings.level == 0 || mesh_settings.resolution < 3) {
- /* NOTE: Shouldn't really happen, is supposed to be catched by
- * isDisabled() callback.
- */
+ if (subdiv_settings.level == 0) {
return result;
}
/* TODO(sergey): Try to re-use subdiv when possible. */
@@ -169,11 +228,23 @@ static Mesh *applyModifier_subdiv(ModifierData *md,
/* Happens on bad topology, ut also on empty input mesh. */
return result;
}
- BKE_subdiv_displacement_attach_from_multires(subdiv, mesh, mmd);
- result = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh);
- /* TODO(sergey): Cache subdiv somehow. */
- // BKE_subdiv_stats_print(&subdiv->stats);
- BKE_subdiv_free(subdiv);
+ /* NOTE: Orco needs final coordinates on CPU side, which are expected to be
+ * accessible via MVert. For this reason we do not evaluate multires to
+ * grids when orco is requested.
+ */
+ const bool for_orco = (ctx->flag & MOD_APPLY_ORCO) != 0;
+ if ((ctx->object->mode & OB_MODE_SCULPT) && !for_orco) {
+ /* NOTE: CCG takes ownership over Subdiv. */
+ result = multires_as_ccg(mmd, ctx, mesh, subdiv);
+ result->runtime.subdiv_ccg_tot_level = mmd->totlvl;
+ // BKE_subdiv_stats_print(&subdiv->stats);
+ }
+ else {
+ result = multires_as_mesh(mmd, ctx, mesh, subdiv);
+ /* TODO(sergey): Cache subdiv somehow. */
+ // BKE_subdiv_stats_print(&subdiv->stats);
+ BKE_subdiv_free(subdiv);
+ }
return result;
}
#endif
@@ -193,8 +264,7 @@ ModifierTypeInfo modifierType_Multires = {
/* deformMatrices_DM */ NULL,
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
- /* applyModifier_DM */ applyModifier,
- /* applyModifierEM_DM */NULL,
+ /* applyModifier_DM */ NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
@@ -203,9 +273,8 @@ ModifierTypeInfo modifierType_Multires = {
#ifdef WITH_OPENSUBDIV_MODIFIER
/* applyModifier */ applyModifier_subdiv,
#else
- /* applyModifier */ NULL,
+ /* applyModifier */ applyModifier,
#endif
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_none.c b/source/blender/modifiers/intern/MOD_none.c
index 7a6a5b94b8e..3946782b5ef 100644
--- a/source/blender/modifiers/intern/MOD_none.c
+++ b/source/blender/modifiers/intern/MOD_none.c
@@ -63,14 +63,12 @@ ModifierTypeInfo modifierType_None = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ NULL,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_normal_edit.c b/source/blender/modifiers/intern/MOD_normal_edit.c
index 14af389668c..f76acd3983d 100644
--- a/source/blender/modifiers/intern/MOD_normal_edit.c
+++ b/source/blender/modifiers/intern/MOD_normal_edit.c
@@ -502,7 +502,7 @@ static void initData(ModifierData *md)
static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
NormalEditModifierData *enmd = (NormalEditModifierData *)md;
- CustomDataMask dataMask = CD_CUSTOMLOOPNORMAL;
+ CustomDataMask dataMask = CD_MASK_CUSTOMLOOPNORMAL;
/* Ask for vertexgroups if we need them. */
if (enmd->defgrp_name[0]) {
@@ -561,14 +561,12 @@ ModifierTypeInfo modifierType_NormalEdit = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_ocean.c b/source/blender/modifiers/intern/MOD_ocean.c
index 12845b27166..8231745aa12 100644
--- a/source/blender/modifiers/intern/MOD_ocean.c
+++ b/source/blender/modifiers/intern/MOD_ocean.c
@@ -42,6 +42,7 @@
#include "BLI_utildefines.h"
#include "BKE_global.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
@@ -183,38 +184,6 @@ static bool dependsOnNormals(ModifierData *md)
return (omd->geometry_mode != MOD_OCEAN_GEOM_GENERATE);
}
-#if 0
-static void dm_get_bounds(DerivedMesh *dm, float *sx, float *sy, float *ox, float *oy)
-{
- /* get bounding box of underlying dm */
- int v, totvert = dm->getNumVerts(dm);
- float min[3], max[3], delta[3];
-
- MVert *mvert = dm->getVertDataArray(dm, 0);
-
- copy_v3_v3(min, mvert->co);
- copy_v3_v3(max, mvert->co);
-
- for (v = 1; v < totvert; v++, mvert++) {
- min[0] = min_ff(min[0], mvert->co[0]);
- min[1] = min_ff(min[1], mvert->co[1]);
- min[2] = min_ff(min[2], mvert->co[2]);
-
- max[0] = max_ff(max[0], mvert->co[0]);
- max[1] = max_ff(max[1], mvert->co[1]);
- max[2] = max_ff(max[2], mvert->co[2]);
- }
-
- sub_v3_v3v3(delta, max, min);
-
- *sx = delta[0];
- *sy = delta[1];
-
- *ox = min[0];
- *oy = min[1];
-}
-#endif
-
#ifdef WITH_OCEANSIM
typedef struct GenerateOceanGeometryData {
@@ -557,14 +526,12 @@ ModifierTypeInfo modifierType_Ocean = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_particleinstance.c b/source/blender/modifiers/intern/MOD_particleinstance.c
index edafcd6fcb9..2d5b520e9ca 100644
--- a/source/blender/modifiers/intern/MOD_particleinstance.c
+++ b/source/blender/modifiers/intern/MOD_particleinstance.c
@@ -543,14 +543,12 @@ ModifierTypeInfo modifierType_ParticleInstance = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_particlesystem.c b/source/blender/modifiers/intern/MOD_particlesystem.c
index 6f9a44cd9e6..1c967d4ead3 100644
--- a/source/blender/modifiers/intern/MOD_particlesystem.c
+++ b/source/blender/modifiers/intern/MOD_particlesystem.c
@@ -145,12 +145,7 @@ static void deformVerts(
}
/* make new mesh */
- BKE_id_copy_ex(NULL, &mesh_src->id, (ID **)&psmd->mesh_final,
- LIB_ID_CREATE_NO_MAIN |
- LIB_ID_CREATE_NO_USER_REFCOUNT |
- LIB_ID_CREATE_NO_DEG_TAG |
- LIB_ID_COPY_NO_PREVIEW,
- false);
+ psmd->mesh_final = BKE_mesh_copy_for_eval(mesh_src, false);
BKE_mesh_apply_vert_coords(psmd->mesh_final, vertexCos);
BKE_mesh_calc_normals(psmd->mesh_final);
@@ -167,7 +162,7 @@ static void deformVerts(
if (edit_btmesh) {
/* In edit mode get directly from the edit mesh. */
- psmd->mesh_original = BKE_bmesh_to_mesh_nomain(edit_btmesh->bm, &(struct BMeshToMeshParams){0});
+ psmd->mesh_original = BKE_mesh_from_bmesh_for_eval_nomain(edit_btmesh->bm, 0);
}
else {
/* Otherwise get regular mesh. */
@@ -182,12 +177,7 @@ static void deformVerts(
/* Make a persistent copy of the mesh. We don't actually need
* all this data, just some topology for remapping. Could be
* optimized once. */
- BKE_id_copy_ex(NULL, &mesh_original->id, (ID **)&psmd->mesh_original,
- LIB_ID_CREATE_NO_MAIN |
- LIB_ID_CREATE_NO_USER_REFCOUNT |
- LIB_ID_CREATE_NO_DEG_TAG |
- LIB_ID_COPY_NO_PREVIEW,
- false);
+ psmd->mesh_original = BKE_mesh_copy_for_eval(mesh_original, false);
}
BKE_mesh_tessface_ensure(psmd->mesh_original);
@@ -257,14 +247,12 @@ ModifierTypeInfo modifierType_ParticleSystem = {
/* deformMatrices_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c
index 39ff7620c91..6bdd348a3a5 100644
--- a/source/blender/modifiers/intern/MOD_remesh.c
+++ b/source/blender/modifiers/intern/MOD_remesh.c
@@ -228,14 +228,12 @@ ModifierTypeInfo modifierType_Remesh = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c
index 96335707082..c59be8151d4 100644
--- a/source/blender/modifiers/intern/MOD_screw.c
+++ b/source/blender/modifiers/intern/MOD_screw.c
@@ -58,7 +58,7 @@
/* used for gathering edge connectivity */
typedef struct ScrewVertConnect {
float dist; /* distance from the center axis */
- float co[3]; /* loaction relative to the transformed axis */
+ float co[3]; /* location relative to the transformed axis */
float no[3]; /* calc normal of the vertex */
unsigned int v[2]; /* 2 verts on either side of this one */
MEdge *e[2]; /* edges on either side, a bit of a waste since each edge ref's 2 edges */
@@ -297,7 +297,7 @@ static Mesh *applyModifier(
/* angle */
-#if 0 /* cant incluide this, not predictable enough, though quite fun. */
+#if 0 /* can't include this, not predictable enough, though quite fun. */
if (ltmd->flag & MOD_SCREW_OBJECT_ANGLE) {
float mtx3_tx[3][3];
copy_m3_m4(mtx3_tx, mtx_tx);
@@ -673,7 +673,7 @@ static Mesh *applyModifier(
if (tmpf1[ltmd->axis] < vc_tmp->co[ltmd->axis]) { /* best is above */
ed_loop_flip = 1;
}
- else { /* best is below or even... in even case we cant know whet to do. */
+ else { /* best is below or even... in even case we can't know what to do. */
ed_loop_flip = 0;
}
@@ -809,7 +809,7 @@ static Mesh *applyModifier(
copy_v3_v3(vc->no, vc->co);
}
- /* we wont be looping on this data again so copy normals here */
+ /* we won't be looping on this data again so copy normals here */
if ((angle < 0.0f) != do_flip)
negate_v3(vc->no);
@@ -897,7 +897,7 @@ static Mesh *applyModifier(
}
if (close) {
- /* last loop of edges, previous loop dosnt account for the last set of edges */
+ /* last loop of edges, previous loop doesn't account for the last set of edges */
const unsigned int varray_stride = (step_tot - 1) * totvert;
for (i = 0; i < totvert; i++) {
@@ -1146,14 +1146,12 @@ ModifierTypeInfo modifierType_Screw = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_shapekey.c b/source/blender/modifiers/intern/MOD_shapekey.c
index a6c7419da49..764e99866fd 100644
--- a/source/blender/modifiers/intern/MOD_shapekey.c
+++ b/source/blender/modifiers/intern/MOD_shapekey.c
@@ -137,14 +137,12 @@ ModifierTypeInfo modifierType_ShapeKey = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ deformMatrices,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ deformMatricesEM,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ NULL,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.c b/source/blender/modifiers/intern/MOD_shrinkwrap.c
index c54fbcf7f87..477c11039db 100644
--- a/source/blender/modifiers/intern/MOD_shrinkwrap.c
+++ b/source/blender/modifiers/intern/MOD_shrinkwrap.c
@@ -126,7 +126,7 @@ static void deformVertsEM(
Mesh *mesh_src = mesh;
if (mesh_src == NULL) {
- mesh_src = BKE_bmesh_to_mesh_nomain(editData->bm, &(struct BMeshToMeshParams){0});
+ mesh_src = BKE_mesh_from_bmesh_for_eval_nomain(editData->bm, 0);
}
BLI_assert(mesh_src->totvert == numVerts);
@@ -141,14 +141,27 @@ static void deformVertsEM(
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
{
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData *)md;
+ CustomDataMask mask = 0;
+
+ if (BKE_shrinkwrap_needs_normals(smd->shrinkType, smd->shrinkMode)) {
+ mask |= CD_MASK_NORMAL | CD_MASK_CUSTOMLOOPNORMAL;
+ }
+
if (smd->target != NULL) {
DEG_add_object_relation(ctx->node, smd->target, DEG_OB_COMP_TRANSFORM, "Shrinkwrap Modifier");
- DEG_add_object_relation(ctx->node, smd->target, DEG_OB_COMP_GEOMETRY, "Shrinkwrap Modifier");
+ DEG_add_object_relation_with_customdata(ctx->node, smd->target, DEG_OB_COMP_GEOMETRY, mask, "Shrinkwrap Modifier");
+ if (smd->shrinkType == MOD_SHRINKWRAP_TARGET_PROJECT) {
+ DEG_add_special_eval_flag(ctx->node, &smd->target->id, DAG_EVAL_NEED_SHRINKWRAP_BOUNDARY);
+ }
}
if (smd->auxTarget != NULL) {
DEG_add_object_relation(ctx->node, smd->auxTarget, DEG_OB_COMP_TRANSFORM, "Shrinkwrap Modifier");
- DEG_add_object_relation(ctx->node, smd->auxTarget, DEG_OB_COMP_GEOMETRY, "Shrinkwrap Modifier");
+ DEG_add_object_relation_with_customdata(ctx->node, smd->auxTarget, DEG_OB_COMP_GEOMETRY, mask, "Shrinkwrap Modifier");
+ if (smd->shrinkType == MOD_SHRINKWRAP_TARGET_PROJECT) {
+ DEG_add_special_eval_flag(ctx->node, &smd->auxTarget->id, DAG_EVAL_NEED_SHRINKWRAP_BOUNDARY);
+ }
}
+ DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Shrinkwrap Modifier");
}
static bool dependsOnNormals(ModifierData *md)
@@ -179,14 +192,12 @@ ModifierTypeInfo modifierType_Shrinkwrap = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_simpledeform.c b/source/blender/modifiers/intern/MOD_simpledeform.c
index 756ce3c83a9..86791e5bcbe 100644
--- a/source/blender/modifiers/intern/MOD_simpledeform.c
+++ b/source/blender/modifiers/intern/MOD_simpledeform.c
@@ -52,7 +52,7 @@
#define BEND_EPS 0.000001f
-/* Re-maps the indicies for X Y Z by shifting them up and wrapping, such that
+/* Re-maps the indices for X Y Z by shifting them up and wrapping, such that
* X = Y, Y = Z, Z = X (for X axis), and X = Z, Y = X, Z = Y (for Y axis). This
* exists because the deformations (excluding bend) are based on the Z axis.
* Having this helps avoid long, drawn out switches. */
@@ -200,7 +200,7 @@ static void SimpleDeformModifier_do(
/* This is historically the lock axis, _not_ the deform axis as the name would imply */
const int deform_axis = smd->deform_axis;
int lock_axis = smd->axis;
- if (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) { /* Bend mode shouln't have any lock axis */
+ if (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) { /* Bend mode shouldn't have any lock axis */
lock_axis = 0;
}
else {
@@ -264,7 +264,7 @@ static void SimpleDeformModifier_do(
}
- /* SMD values are normalized to the BV, calculate the absolut values */
+ /* SMD values are normalized to the BV, calculate the absolute values */
smd_limit[1] = lower + (upper - lower) * smd->limit[1];
smd_limit[0] = lower + (upper - lower) * smd->limit[0];
@@ -430,14 +430,12 @@ ModifierTypeInfo modifierType_SimpleDeform = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_skin.c b/source/blender/modifiers/intern/MOD_skin.c
index 31d556292f8..87d47769cdb 100644
--- a/source/blender/modifiers/intern/MOD_skin.c
+++ b/source/blender/modifiers/intern/MOD_skin.c
@@ -66,7 +66,7 @@
#include "BLI_utildefines.h"
#include "BLI_array.h"
-#include "BLI_heap.h"
+#include "BLI_heap_simple.h"
#include "BLI_math.h"
#include "BLI_stack.h"
#include "BLI_bitmap.h"
@@ -1431,10 +1431,10 @@ static void hull_merge_triangles(SkinOutput *so, const SkinModifierData *smd)
{
BMIter iter;
BMEdge *e;
- Heap *heap;
+ HeapSimple *heap;
float score;
- heap = BLI_heap_new();
+ heap = BLI_heapsimple_new();
BM_mesh_elem_hflag_disable_all(so->bm, BM_FACE, BM_ELEM_TAG, false);
@@ -1477,15 +1477,15 @@ static void hull_merge_triangles(SkinOutput *so, const SkinModifierData *smd)
continue;
}
- BLI_heap_insert(heap, -score, e);
+ BLI_heapsimple_insert(heap, -score, e);
}
}
}
- while (!BLI_heap_is_empty(heap)) {
+ while (!BLI_heapsimple_is_empty(heap)) {
BMFace *adj[2];
- e = BLI_heap_pop_min(heap);
+ e = BLI_heapsimple_pop_min(heap);
if (BM_edge_face_pair(e, &adj[0], &adj[1])) {
/* If both triangles still free, and if they don't already
@@ -1502,7 +1502,7 @@ static void hull_merge_triangles(SkinOutput *so, const SkinModifierData *smd)
}
}
- BLI_heap_free(heap, NULL);
+ BLI_heapsimple_free(heap, NULL);
BM_mesh_delete_hflag_tagged(so->bm, BM_ELEM_TAG, BM_EDGE | BM_FACE);
@@ -1880,7 +1880,7 @@ static Mesh *base_skin(Mesh *origmesh,
if (!bm)
return NULL;
- result = BKE_bmesh_to_mesh_nomain(bm, &(struct BMeshToMeshParams){0});
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BM_mesh_free(bm);
result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
@@ -1951,14 +1951,12 @@ ModifierTypeInfo modifierType_Skin = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_smoke.c b/source/blender/modifiers/intern/MOD_smoke.c
index a15c4169df3..d0db852550b 100644
--- a/source/blender/modifiers/intern/MOD_smoke.c
+++ b/source/blender/modifiers/intern/MOD_smoke.c
@@ -42,6 +42,7 @@
#include "DNA_scene_types.h"
#include "DNA_smoke_types.h"
#include "DNA_object_force_types.h"
+#include "DNA_mesh_types.h"
#include "BLI_utildefines.h"
@@ -71,12 +72,13 @@ static void initData(ModifierData *md)
smd->time = -1;
}
-static void copyData(const ModifierData *md, ModifierData *target, const int UNUSED(flag))
+static void copyData(const ModifierData *md, ModifierData *target, const int flag)
{
const SmokeModifierData *smd = (const SmokeModifierData *)md;
SmokeModifierData *tsmd = (SmokeModifierData *)target;
- smokeModifier_copy(smd, tsmd);
+ smokeModifier_free(tsmd);
+ smokeModifier_copy(smd, tsmd, flag);
}
static void freeData(ModifierData *md)
@@ -104,18 +106,18 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
return dataMask;
}
-static DerivedMesh *applyModifier(
+static Mesh *applyModifier(
ModifierData *md, const ModifierEvalContext *ctx,
- DerivedMesh *dm)
+ Mesh *me)
{
SmokeModifierData *smd = (SmokeModifierData *) md;
if (ctx->flag & MOD_APPLY_ORCO) {
- return dm;
+ return me;
}
Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph);
- return smokeModifier_do(smd, ctx->depsgraph, scene, ctx->object, dm);
+ return smokeModifier_do(smd, ctx->depsgraph, scene, ctx->object, me);
}
static bool dependsOnTime(ModifierData *UNUSED(md))
@@ -182,15 +184,13 @@ ModifierTypeInfo modifierType_Smoke = {
/* deformMatrices_DM */ NULL,
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
- /* applyModifier_DM */ applyModifier,
- /* applyModifierEM_DM */NULL,
+ /* applyModifier_DM */ NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
- /* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
+ /* applyModifier */ applyModifier,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_smooth.c b/source/blender/modifiers/intern/MOD_smooth.c
index 29508524f9c..100d49f1c89 100644
--- a/source/blender/modifiers/intern/MOD_smooth.c
+++ b/source/blender/modifiers/intern/MOD_smooth.c
@@ -232,7 +232,7 @@ static void deformVertsEM(
Mesh *mesh_src = mesh;
if (mesh_src == NULL) {
- mesh_src = BKE_bmesh_to_mesh_nomain(editData->bm, &(struct BMeshToMeshParams){0});
+ mesh_src = BKE_mesh_from_bmesh_for_eval_nomain(editData->bm, 0);
}
BLI_assert(mesh_src->totvert == numVerts);
@@ -262,14 +262,12 @@ ModifierTypeInfo modifierType_Smooth = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_softbody.c b/source/blender/modifiers/intern/MOD_softbody.c
index 55df32b0e18..3f45e37e777 100644
--- a/source/blender/modifiers/intern/MOD_softbody.c
+++ b/source/blender/modifiers/intern/MOD_softbody.c
@@ -92,14 +92,12 @@ ModifierTypeInfo modifierType_Softbody = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ NULL,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c
index 1fac637a9ef..f839f8aecf0 100644
--- a/source/blender/modifiers/intern/MOD_solidify.c
+++ b/source/blender/modifiers/intern/MOD_solidify.c
@@ -815,7 +815,7 @@ static Mesh *applyModifier(
mp->flag = mpoly[fidx].flag;
/* notice we use 'mp->totloop' which is later overwritten,
- * we could lookup the original face but theres no point since this is a copy
+ * we could lookup the original face but there's no point since this is a copy
* and will have the same value, just take care when changing order of assignment */
k1 = mpoly[fidx].loopstart + (((edge_order[eidx] - 1) + mp->totloop) % mp->totloop); /* prev loop */
k2 = mpoly[fidx].loopstart + (edge_order[eidx]);
@@ -964,14 +964,12 @@ ModifierTypeInfo modifierType_Solidify = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c
index a6e85bfb813..dee9089d7d3 100644
--- a/source/blender/modifiers/intern/MOD_subsurf.c
+++ b/source/blender/modifiers/intern/MOD_subsurf.c
@@ -44,6 +44,8 @@
#include "BKE_cdderivedmesh.h"
#include "BKE_scene.h"
#include "BKE_subdiv.h"
+#include "BKE_subdiv_ccg.h"
+#include "BKE_subdiv_mesh.h"
#include "BKE_subsurf.h"
#include "DEG_depsgraph.h"
@@ -97,7 +99,9 @@ static bool isDisabled(const Scene *scene, ModifierData *md, bool useRenderParam
return get_render_subsurf_level(&scene->r, levels, useRenderParams != 0) == 0;
}
-static DerivedMesh *applyModifier(
+#ifndef WITH_OPENSUBDIV_MODIFIER
+
+static DerivedMesh *applyModifier_DM(
ModifierData *md, const ModifierEvalContext *ctx,
DerivedMesh *derivedData)
{
@@ -131,20 +135,9 @@ static DerivedMesh *applyModifier(
return result;
}
-static DerivedMesh *applyModifierEM(
- ModifierData *md, const ModifierEvalContext *ctx,
- struct BMEditMesh *UNUSED(editData),
- DerivedMesh *derivedData)
-{
- SubsurfModifierData *smd = (SubsurfModifierData *) md;
- struct Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph);
- DerivedMesh *result;
- /* 'orco' using editmode flags would cause cache to be used twice in editbmesh_calc_modifiers */
- SubsurfFlags ss_flags = (ctx->flag & MOD_APPLY_ORCO) ? 0 : (SUBSURF_FOR_EDIT_MODE | SUBSURF_IN_EDIT_MODE);
+applyModifier_DM_wrapper(applyModifier, applyModifier_DM)
- result = subsurf_make_derived_from_derived(derivedData, smd, scene, NULL, ss_flags);
- return result;
-}
+#endif
#ifdef WITH_OPENSUBDIV_MODIFIER
static int subdiv_levels_for_modifier_get(const SubsurfModifierData *smd,
@@ -165,10 +158,13 @@ static void subdiv_settings_init(SubdivSettings *settings,
settings->is_simple = (smd->subdivType == SUBSURF_TYPE_SIMPLE);
settings->is_adaptive = !settings->is_simple;
settings->level = smd->quality;
+ settings->vtx_boundary_interpolation = SUBDIV_VTX_BOUNDARY_EDGE_ONLY;
settings->fvar_linear_interpolation =
BKE_subdiv_fvar_interpolation_from_uv_smooth(smd->uv_smooth);
}
+/* Subdivide into fully qualified mesh. */
+
static void subdiv_mesh_settings_init(SubdivToMeshSettings *settings,
const SubsurfModifierData *smd,
const ModifierEvalContext *ctx)
@@ -177,6 +173,50 @@ static void subdiv_mesh_settings_init(SubdivToMeshSettings *settings,
settings->resolution = (1 << level) + 1;
}
+static Mesh *subdiv_as_mesh(SubsurfModifierData *smd,
+ const ModifierEvalContext *ctx,
+ Mesh *mesh,
+ Subdiv *subdiv)
+{
+ Mesh *result = mesh;
+ SubdivToMeshSettings mesh_settings;
+ subdiv_mesh_settings_init(&mesh_settings, smd, ctx);
+ if (mesh_settings.resolution < 3) {
+ return result;
+ }
+ result = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh);
+ return result;
+}
+
+/* Subdivide into CCG. */
+
+static void subdiv_ccg_settings_init(SubdivToCCGSettings *settings,
+ const SubsurfModifierData *smd,
+ const ModifierEvalContext *ctx)
+{
+ const int level = subdiv_levels_for_modifier_get(smd, ctx);
+ settings->resolution = (1 << level) + 1;
+ settings->need_normal = true;
+ settings->need_mask = false;
+}
+
+static Mesh *subdiv_as_ccg(SubsurfModifierData *smd,
+ const ModifierEvalContext *ctx,
+ Mesh *mesh,
+ Subdiv *subdiv)
+{
+ Mesh *result = mesh;
+ SubdivToCCGSettings ccg_settings;
+ subdiv_ccg_settings_init(&ccg_settings, smd, ctx);
+ if (ccg_settings.resolution < 3) {
+ return result;
+ }
+ result = BKE_subdiv_to_ccg_mesh(subdiv, &ccg_settings, mesh);
+ return result;
+}
+
+/* Modifier itself. */
+
static Mesh *applyModifier_subdiv(ModifierData *md,
const ModifierEvalContext *ctx,
Mesh *mesh)
@@ -185,12 +225,7 @@ static Mesh *applyModifier_subdiv(ModifierData *md,
SubsurfModifierData *smd = (SubsurfModifierData *) md;
SubdivSettings subdiv_settings;
subdiv_settings_init(&subdiv_settings, smd);
- SubdivToMeshSettings mesh_settings;
- subdiv_mesh_settings_init(&mesh_settings, smd, ctx);
- if (subdiv_settings.level == 0 || mesh_settings.resolution < 3) {
- /* NOTE: Shouldn't really happen, is supposed to be catched by
- * isDisabled() callback.
- */
+ if (subdiv_settings.level == 0) {
return result;
}
/* TODO(sergey): Try to re-use subdiv when possible. */
@@ -199,7 +234,15 @@ static Mesh *applyModifier_subdiv(ModifierData *md,
/* Happens on bad topology, ut also on empty input mesh. */
return result;
}
- result = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh);
+ /* TODO(sergey): Decide whether we ever want to use CCG for subsurf,
+ * maybe when it is a last modifier in the stack?
+ */
+ if (true) {
+ result = subdiv_as_mesh(smd, ctx, mesh, subdiv);
+ }
+ else {
+ result = subdiv_as_ccg(smd, ctx, mesh, subdiv);
+ }
/* TODO(sergey): Cache subdiv somehow. */
// BKE_subdiv_stats_print(&subdiv->stats);
BKE_subdiv_free(subdiv);
@@ -208,7 +251,7 @@ static Mesh *applyModifier_subdiv(ModifierData *md,
#endif
ModifierTypeInfo modifierType_Subsurf = {
- /* name */ "Subsurf",
+ /* name */ "Subdivision",
/* structName */ "SubsurfModifierData",
/* structSize */ sizeof(SubsurfModifierData),
/* type */ eModifierTypeType_Constructive,
@@ -224,8 +267,7 @@ ModifierTypeInfo modifierType_Subsurf = {
/* deformMatrices_DM */ NULL,
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
- /* applyModifier_DM */ applyModifier,
- /* applyModifierEM_DM */applyModifierEM,
+ /* applyModifier_DM */ NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
@@ -234,9 +276,8 @@ ModifierTypeInfo modifierType_Subsurf = {
#ifdef WITH_OPENSUBDIV_MODIFIER
/* applyModifier */ applyModifier_subdiv,
#else
- /* applyModifier */ NULL,
+ /* applyModifier */ applyModifier,
#endif
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_surface.c b/source/blender/modifiers/intern/MOD_surface.c
index 33a6fbe6c78..f445e8d9de9 100644
--- a/source/blender/modifiers/intern/MOD_surface.c
+++ b/source/blender/modifiers/intern/MOD_surface.c
@@ -195,14 +195,12 @@ ModifierTypeInfo modifierType_Surface = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c
index 6dbeed9b4c8..18bee0d2d59 100644
--- a/source/blender/modifiers/intern/MOD_surfacedeform.c
+++ b/source/blender/modifiers/intern/MOD_surfacedeform.c
@@ -1028,7 +1028,7 @@ static bool surfacedeformBind(
}
else if (data.success == MOD_SDEF_BIND_RESULT_GENERIC_ERR) {
/* I know this message is vague, but I could not think of a way
- * to explain this whith a reasonably sized message.
+ * to explain this with a reasonably sized message.
* Though it shouldn't really matter all that much,
* because this is very unlikely to occur */
modifier_setError((ModifierData *)smd, "Target contains invalid polygons");
@@ -1217,14 +1217,12 @@ ModifierTypeInfo modifierType_SurfaceDeform = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_triangulate.c b/source/blender/modifiers/intern/MOD_triangulate.c
index d845246e1a1..0eba535ca9b 100644
--- a/source/blender/modifiers/intern/MOD_triangulate.c
+++ b/source/blender/modifiers/intern/MOD_triangulate.c
@@ -47,13 +47,16 @@ static Mesh *triangulate_mesh(Mesh *mesh, const int quad_method, const int ngon_
MEdge *me;
bm = BKE_mesh_to_bmesh_ex(
- mesh,
- &((struct BMeshCreateParams){0}),
- &((struct BMeshFromMeshParams){.calc_face_normal = true,}));
+ mesh,
+ &((struct BMeshCreateParams){0}),
+ &((struct BMeshFromMeshParams){
+ .calc_face_normal = true,
+ .cd_mask_extra = CD_MASK_ORIGINDEX,
+ }));
BM_mesh_triangulate(bm, quad_method, ngon_method, false, NULL, NULL, NULL);
- result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0}));
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BM_mesh_free(bm);
total_edges = result->totedge;
@@ -111,14 +114,12 @@ ModifierTypeInfo modifierType_Triangulate = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ NULL, //requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c
index 7899b771929..be79ed0d129 100644
--- a/source/blender/modifiers/intern/MOD_util.c
+++ b/source/blender/modifiers/intern/MOD_util.c
@@ -69,7 +69,7 @@ void MOD_init_texture(const Depsgraph *depsgraph, Tex *tex)
return;
if (tex->ima && BKE_image_is_animated(tex->ima)) {
- BKE_image_user_frame_calc(&tex->iuser, DEG_get_ctime(depsgraph), 0);
+ BKE_image_user_frame_calc(&tex->iuser, DEG_get_ctime(depsgraph));
}
}
@@ -177,7 +177,7 @@ Mesh *MOD_get_mesh_eval(
}
else if (ob->type == OB_MESH) {
if (em) {
- mesh = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0});
+ mesh = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0);
}
else {
/* TODO(sybren): after modifier conversion of DM to Mesh is done, check whether
diff --git a/source/blender/modifiers/intern/MOD_uvproject.c b/source/blender/modifiers/intern/MOD_uvproject.c
index 9a06d397be6..3aaf67792c6 100644
--- a/source/blender/modifiers/intern/MOD_uvproject.c
+++ b/source/blender/modifiers/intern/MOD_uvproject.c
@@ -336,14 +336,12 @@ ModifierTypeInfo modifierType_UVProject = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_uvwarp.c b/source/blender/modifiers/intern/MOD_uvwarp.c
index 4046e0c2142..f92056d503f 100644
--- a/source/blender/modifiers/intern/MOD_uvwarp.c
+++ b/source/blender/modifiers/intern/MOD_uvwarp.c
@@ -262,14 +262,12 @@ ModifierTypeInfo modifierType_UVWarp = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_warp.c b/source/blender/modifiers/intern/MOD_warp.c
index a8f305bcc13..bc516b8e798 100644
--- a/source/blender/modifiers/intern/MOD_warp.c
+++ b/source/blender/modifiers/intern/MOD_warp.c
@@ -332,7 +332,7 @@ static void deformVertsEM(
Mesh *mesh_src = mesh;
if (mesh_src == NULL) {
- mesh_src = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0});
+ mesh_src = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0);
}
BLI_assert(mesh_src->totvert == numVerts);
@@ -360,14 +360,12 @@ ModifierTypeInfo modifierType_Warp = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_wave.c b/source/blender/modifiers/intern/MOD_wave.c
index c569ef1554e..ea09b6400cf 100644
--- a/source/blender/modifiers/intern/MOD_wave.c
+++ b/source/blender/modifiers/intern/MOD_wave.c
@@ -354,14 +354,12 @@ ModifierTypeInfo modifierType_Wave = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ NULL,
/* applyModifier */ NULL,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_weighted_normal.c b/source/blender/modifiers/intern/MOD_weighted_normal.c
index 69c71d34dbc..0e116b2e021 100644
--- a/source/blender/modifiers/intern/MOD_weighted_normal.c
+++ b/source/blender/modifiers/intern/MOD_weighted_normal.c
@@ -218,7 +218,7 @@ static void apply_weights_vertex_normal(WeightedNormalModifierData *wnmd, Weight
items_data = MEM_calloc_arrayN((size_t)num_items, sizeof(*items_data), __func__);
/* In this first loop, we assign each WeightedNormalDataAggregateItem
- * to its smooth fan of loops (aka lnor space). */
+ * to its smooth fan of loops (aka lnor space). */
MPoly *mp;
int mp_index;
int item_index;
@@ -241,7 +241,7 @@ static void apply_weights_vertex_normal(WeightedNormalModifierData *wnmd, Weight
if (!(lnor_space->flags & MLNOR_SPACE_IS_SINGLE)) {
for (LinkNode *lnode = lnor_space->loops; lnode; lnode = lnode->next) {
- const int ml_fan_index = GET_INT_FROM_POINTER(lnode->link);
+ const int ml_fan_index = POINTER_AS_INT(lnode->link);
BLI_BITMAP_ENABLE(done_loops, ml_fan_index);
}
}
@@ -484,8 +484,8 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
Object *ob = ctx->object;
/* XXX TODO ARG GRRR XYQWNMPRXTYY
- * Once we fully switch to Mesh evaluation of modifiers, we can expect to get that flag from the COW copy.
- * But for now, it is lost in the DM intermediate step, so we need to directly check orig object's data. */
+ * Once we fully switch to Mesh evaluation of modifiers, we can expect to get that flag from the COW copy.
+ * But for now, it is lost in the DM intermediate step, so we need to directly check orig object's data. */
#if 0
if (!(mesh->flag & ME_AUTOSMOOTH)) {
#else
@@ -614,7 +614,7 @@ static void initData(ModifierData *md)
static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
WeightedNormalModifierData *wnmd = (WeightedNormalModifierData *)md;
- CustomDataMask dataMask = CD_CUSTOMLOOPNORMAL;
+ CustomDataMask dataMask = CD_MASK_CUSTOMLOOPNORMAL;
if (wnmd->defgrp_name[0]) {
dataMask |= CD_MASK_MDEFORMVERT;
@@ -649,14 +649,12 @@ ModifierTypeInfo modifierType_WeightedNormal = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c
index 47379dec99a..4bbf73caf92 100644
--- a/source/blender/modifiers/intern/MOD_weightvgedit.c
+++ b/source/blender/modifiers/intern/MOD_weightvgedit.c
@@ -289,14 +289,12 @@ ModifierTypeInfo modifierType_WeightVGEdit = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c
index ea401d01f66..c7a5d4dc70d 100644
--- a/source/blender/modifiers/intern/MOD_weightvgmix.c
+++ b/source/blender/modifiers/intern/MOD_weightvgmix.c
@@ -402,14 +402,12 @@ ModifierTypeInfo modifierType_WeightVGMix = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c
index 4a5a54642ef..bf220517342 100644
--- a/source/blender/modifiers/intern/MOD_weightvgproximity.c
+++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c
@@ -85,7 +85,7 @@ typedef struct Vert2GeomData {
float *dist[3];
} Vert2GeomData;
-/* Data which is localized to each computed chunk (i.e. thread-safe, and with continous subset of index range). */
+/* Data which is localized to each computed chunk (i.e. thread-safe, and with continuous subset of index range). */
typedef struct Vert2GeomDataChunk {
/* Read-only data */
float last_hit_co[3][3];
@@ -582,14 +582,12 @@ ModifierTypeInfo modifierType_WeightVGProximity = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_wireframe.c b/source/blender/modifiers/intern/MOD_wireframe.c
index cc846d08040..a47be7b5244 100644
--- a/source/blender/modifiers/intern/MOD_wireframe.c
+++ b/source/blender/modifiers/intern/MOD_wireframe.c
@@ -76,6 +76,7 @@ static Mesh *WireframeModifier_do(WireframeModifierData *wmd, Object *ob, Mesh *
.add_key_index = false,
.use_shapekey = true,
.active_shapekey = ob->shapenr,
+ .cd_mask_extra = CD_MASK_ORIGINDEX,
});
BM_mesh_wireframe(
@@ -93,7 +94,7 @@ static Mesh *WireframeModifier_do(WireframeModifierData *wmd, Object *ob, Mesh *
MAX2(ob->totcol - 1, 0),
false);
- result = BKE_bmesh_to_mesh_nomain(bm, &(struct BMeshToMeshParams){0});
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BM_mesh_free(bm);
result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
@@ -126,14 +127,12 @@ ModifierTypeInfo modifierType_Wireframe = {
/* deformVertsEM_DM */ NULL,
/* deformMatricesEM_DM*/NULL,
/* applyModifier_DM */ NULL,
- /* applyModifierEM_DM */NULL,
/* deformVerts */ NULL,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/nodes/composite/nodes/node_composite_image.c b/source/blender/nodes/composite/nodes/node_composite_image.c
index 78956f63e8a..3ee4e512d76 100644
--- a/source/blender/nodes/composite/nodes/node_composite_image.c
+++ b/source/blender/nodes/composite/nodes/node_composite_image.c
@@ -296,6 +296,8 @@ static void cmp_node_image_update(bNodeTree *ntree, bNode *node)
/* avoid unnecessary updates, only changes to the image/image user data are of interest */
if (node->update & NODE_UPDATE_ID)
cmp_node_image_verify_outputs(ntree, node, false);
+
+ cmp_node_update_default(ntree, node);
}
static void node_composit_init_image(bNodeTree *ntree, bNode *node)
@@ -428,6 +430,8 @@ static void node_composit_copy_rlayers(bNodeTree *UNUSED(dest_ntree), bNode *UNU
static void cmp_node_rlayers_update(bNodeTree *ntree, bNode *node)
{
cmp_node_image_verify_outputs(ntree, node, true);
+
+ cmp_node_update_default(ntree, node);
}
void register_node_type_cmp_rlayers(void)
diff --git a/source/blender/nodes/shader/node_shader_tree.c b/source/blender/nodes/shader/node_shader_tree.c
index 6f2c7835a3c..321ac1a6b76 100644
--- a/source/blender/nodes/shader/node_shader_tree.c
+++ b/source/blender/nodes/shader/node_shader_tree.c
@@ -283,6 +283,93 @@ static bNodeSocket *ntree_shader_node_find_output(bNode *node,
return ntree_shader_node_find_socket(&node->outputs, identifier);
}
+static void ntree_shader_unlink_hidden_value_sockets(bNode *group_node, bNodeSocket *isock)
+{
+ bNodeTree *group_ntree = (bNodeTree *)group_node->id;
+ bNode *node;
+ bool removed_link = false;
+
+ for (node = group_ntree->nodes.first; node; node = node->next) {
+ for (bNodeSocket *sock = node->inputs.first; sock; sock = sock->next) {
+ if ((sock->flag & SOCK_HIDE_VALUE) == 0)
+ continue;
+ /* If socket is linked to a group input node and sockets id match. */
+ if (sock && sock->link && sock->link->fromnode->type == NODE_GROUP_INPUT) {
+ if (STREQ(isock->identifier, sock->link->fromsock->identifier)) {
+ nodeRemLink(group_ntree, sock->link);
+ removed_link = true;
+ }
+ }
+ }
+ }
+
+ if (removed_link) {
+ ntreeUpdateTree(G.main, group_ntree);
+ }
+}
+
+/* Node groups once expanded looses their input sockets values.
+ * To fix this, link value/rgba nodes into the sockets and copy the group sockets values. */
+static void ntree_shader_groups_expand_inputs(bNodeTree *localtree)
+{
+ bNode *value_node, *group_node;
+ bNodeSocket *value_socket;
+ bNodeSocketValueRGBA *src_rgba, *dst_rgba;
+ bNodeSocketValueFloat *src_float, *dst_float;
+ bool link_added = false;
+
+ for (group_node = localtree->nodes.first; group_node; group_node = group_node->next) {
+
+ if (group_node->type != NODE_GROUP || group_node->id == NULL)
+ continue;
+
+ /* Do it recursively. */
+ ntree_shader_groups_expand_inputs((bNodeTree *)group_node->id);
+
+ bNodeSocket *group_socket = group_node->inputs.first;
+ for (; group_socket; group_socket = group_socket->next) {
+ if (group_socket->link != NULL)
+ continue;
+
+ /* Detect the case where an input is plugged into a hidden value socket.
+ * In this case we should just remove the link to trigger the socket default override. */
+ ntree_shader_unlink_hidden_value_sockets(group_node, group_socket);
+
+ switch (group_socket->type) {
+ case SOCK_VECTOR:
+ case SOCK_RGBA:
+ value_node = nodeAddStaticNode(NULL, localtree, SH_NODE_RGB);
+ value_socket = ntree_shader_node_find_output(value_node, "Color");
+ BLI_assert(value_socket != NULL);
+ src_rgba = group_socket->default_value;
+ dst_rgba = value_socket->default_value;
+ copy_v4_v4(dst_rgba->value, src_rgba->value);
+ break;
+ case SOCK_FLOAT:
+ value_node = nodeAddStaticNode(NULL, localtree, SH_NODE_VALUE);
+ value_socket = ntree_shader_node_find_output(value_node, "Value");
+ BLI_assert(value_socket != NULL);
+ src_float = group_socket->default_value;
+ dst_float = value_socket->default_value;
+ dst_float->value = src_float->value;
+ break;
+ default:
+ continue;
+ }
+
+ nodeAddLink(localtree,
+ value_node, value_socket,
+ group_node, group_socket);
+
+ link_added = true;
+ }
+ }
+
+ if (link_added) {
+ ntreeUpdateTree(G.main, localtree);
+ }
+}
+
/* Check whether shader has a displacement.
*
* Will also return a node and it's socket which is connected to a displacement
@@ -589,6 +676,8 @@ void ntreeGPUMaterialNodes(bNodeTree *localtree, GPUMaterial *mat, bool *has_sur
bNode *output = ntreeShaderOutputNode(localtree, SHD_OUTPUT_EEVEE);
bNodeTreeExec *exec;
+ ntree_shader_groups_expand_inputs(localtree);
+
/* Perform all needed modifications on the tree in order to support
* displacement/bump mapping.
*/
diff --git a/source/blender/nodes/shader/node_shader_util.c b/source/blender/nodes/shader/node_shader_util.c
index 80cfba00e0a..ca8286f1772 100644
--- a/source/blender/nodes/shader/node_shader_util.c
+++ b/source/blender/nodes/shader/node_shader_util.c
@@ -96,7 +96,7 @@ void node_gpu_stack_from_data(struct GPUNodeStack *gs, int type, bNodeStack *ns)
memset(gs, 0, sizeof(*gs));
if (ns == NULL) {
- /* node_get_stack() will generate NULL bNodeStack pointers for unknown/unsuported types of sockets... */
+ /* node_get_stack() will generate NULL bNodeStack pointers for unknown/unsupported types of sockets... */
zero_v4(gs->vec);
gs->link = NULL;
gs->type = GPU_NONE;
diff --git a/source/blender/nodes/shader/node_shader_util.h b/source/blender/nodes/shader/node_shader_util.h
index 7fce5ed9927..158efc5a6ab 100644
--- a/source/blender/nodes/shader/node_shader_util.h
+++ b/source/blender/nodes/shader/node_shader_util.h
@@ -64,8 +64,6 @@
#include "BKE_node.h"
#include "BKE_texture.h"
-#include "BKE_library.h"
-
#include "NOD_shader.h"
#include "node_util.h"
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 76ef257f8a3..bf5f0ec13c5 100644
--- a/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c
+++ b/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.c
@@ -47,6 +47,8 @@ static int node_shader_gpu_ambient_occlusion(GPUMaterial *mat, bNode *node, bNod
if (!in[2].link)
GPU_link(mat, "world_normals_get", &in[2].link);
+ GPU_material_flag_set(mat, GPU_MATFLAG_DIFFUSE);
+
return GPU_stack_link(mat, node, "node_ambient_occlusion", in, out);
}
diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.c
index 342b3a67ffb..bd1c5e8f348 100644
--- a/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.c
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.c
@@ -51,6 +51,9 @@ static int node_shader_gpu_bsdf_glossy(GPUMaterial *mat, bNode *node, bNodeExecD
if (!in[2].link)
GPU_link(mat, "world_normals_get", &in[2].link);
+ if (node->custom1 == SHD_GLOSSY_SHARP)
+ GPU_link(mat, "set_value_zero", &in[1].link);
+
GPU_material_flag_set(mat, GPU_MATFLAG_GLOSSY);
return GPU_stack_link(mat, node, "node_bsdf_glossy", in, out, GPU_constant(&node->ssr_id));
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 16d35c7003a..c628fd7a7f5 100644
--- a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c
@@ -103,8 +103,7 @@ static int node_shader_gpu_bsdf_principled(GPUMaterial *mat, bNode *node, bNodeE
sss_scale = in[2].link;
}
else {
- float one[3] = {1.0f, 1.0f, 1.0f};
- GPU_link(mat, "set_rgb", GPU_constant((float *)one), &sss_scale);
+ GPU_link(mat, "set_rgb_one", &sss_scale);
}
bool use_diffuse = socket_not_one(4) && socket_not_one(15);
diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.c
index b59f1c80342..0b7b50d0b0a 100644
--- a/source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.c
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.c
@@ -52,6 +52,9 @@ static int node_shader_gpu_bsdf_refraction(GPUMaterial *mat, bNode *node, bNodeE
if (!in[3].link)
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_REFRACT);
return GPU_stack_link(mat, node, "node_bsdf_refraction", in, out);
diff --git a/source/blender/nodes/shader/nodes/node_shader_bump.c b/source/blender/nodes/shader/nodes/node_shader_bump.c
index b71a59d8c11..c806827b71d 100644
--- a/source/blender/nodes/shader/nodes/node_shader_bump.c
+++ b/source/blender/nodes/shader/nodes/node_shader_bump.c
@@ -47,19 +47,13 @@ static bNodeSocketTemplate sh_node_bump_out[] = {
static int gpu_shader_bump(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out)
{
- if (!in[3].link)
- in[3].link = GPU_builtin(GPU_VIEW_NORMAL);
- else
- GPU_link(mat, "direction_transform_m4v3", in[3].link, GPU_builtin(GPU_VIEW_MATRIX), &in[3].link);
- float invert = node->custom1;
- GPU_stack_link(mat, node, "node_bump", in, out, GPU_builtin(GPU_VIEW_POSITION), GPU_constant(&invert));
- /* Other nodes are applying view matrix if the input Normal has a link.
- * We don't want normal to have view matrix applied twice, so we cancel it here.
- *
- * TODO(sergey): This is an extra multiplication which cancels each other,
- * better avoid this but that requires bigger refactor.
- */
- return GPU_link(mat, "direction_transform_m4v3", out[0].link, GPU_builtin(GPU_INVERSE_VIEW_MATRIX), &out[0].link);
+ if (!in[3].link) {
+ GPU_link(mat, "world_normals_get", &in[3].link);
+ }
+
+ float invert = (node->custom1) ? -1.0 : 1.0;
+
+ return GPU_stack_link(mat, node, "node_bump", in, out, GPU_builtin(GPU_VIEW_POSITION), GPU_constant(&invert));
}
/* node type definition */
diff --git a/source/blender/nodes/shader/nodes/node_shader_normal.c b/source/blender/nodes/shader/nodes/node_shader_normal.c
index 13335c86382..121cb9cc1a5 100644
--- a/source/blender/nodes/shader/nodes/node_shader_normal.c
+++ b/source/blender/nodes/shader/nodes/node_shader_normal.c
@@ -60,7 +60,7 @@ static void node_shader_exec_normal(void *UNUSED(data), int UNUSED(thread), bNod
static int gpu_shader_normal(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out)
{
- GPUNodeLink *vec = GPU_constant(out[0].vec);
+ GPUNodeLink *vec = GPU_uniform(out[0].vec);
return GPU_stack_link(mat, node, "normal_new_shading", in, out, vec);
}
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_brick.c b/source/blender/nodes/shader/nodes/node_shader_tex_brick.c
index 2002e3c14c9..4f488025a99 100644
--- a/source/blender/nodes/shader/nodes/node_shader_tex_brick.c
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_brick.c
@@ -73,7 +73,7 @@ static int node_shader_gpu_tex_brick(GPUMaterial *mat, bNode *node, bNodeExecDat
{
if (!in[0].link) {
in[0].link = GPU_attribute(CD_ORCO, "");
- GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+ GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
}
node_shader_gpu_tex_mapping(mat, node, in, out);
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_checker.c b/source/blender/nodes/shader/nodes/node_shader_tex_checker.c
index 4e065ffde23..52aa33c033e 100644
--- a/source/blender/nodes/shader/nodes/node_shader_tex_checker.c
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_checker.c
@@ -56,7 +56,7 @@ static int node_shader_gpu_tex_checker(GPUMaterial *mat, bNode *node, bNodeExecD
{
if (!in[0].link) {
in[0].link = GPU_attribute(CD_ORCO, "");
- GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+ GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
}
node_shader_gpu_tex_mapping(mat, node, in, out);
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_coord.c b/source/blender/nodes/shader/nodes/node_shader_tex_coord.c
index 002fdc6d3ae..58fea60f9f5 100644
--- a/source/blender/nodes/shader/nodes/node_shader_tex_coord.c
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_coord.c
@@ -46,22 +46,13 @@ static int node_shader_gpu_tex_coord(GPUMaterial *mat, bNode *node, bNodeExecDat
{
GPUNodeLink *orco = GPU_attribute(CD_ORCO, "");
GPUNodeLink *mtface = GPU_attribute(CD_MTFACE, "");
- GPUMatType type = GPU_Material_get_type(mat);
GPU_link(mat, "generated_from_orco", orco, &orco);
- if (type == GPU_MATERIAL_TYPE_WORLD) {
- return GPU_stack_link(mat, node, "node_tex_coord_background", in, out,
- GPU_builtin(GPU_VIEW_POSITION), GPU_builtin(GPU_VIEW_NORMAL),
- GPU_builtin(GPU_INVERSE_VIEW_MATRIX), GPU_builtin(GPU_INVERSE_OBJECT_MATRIX),
- GPU_builtin(GPU_CAMERA_TEXCO_FACTORS), orco, mtface);
- }
- else {
- return GPU_stack_link(mat, node, "node_tex_coord", in, out,
- GPU_builtin(GPU_VIEW_POSITION), GPU_builtin(GPU_VIEW_NORMAL),
- GPU_builtin(GPU_INVERSE_VIEW_MATRIX), GPU_builtin(GPU_INVERSE_OBJECT_MATRIX),
- GPU_builtin(GPU_CAMERA_TEXCO_FACTORS), orco, mtface);
- }
+ return GPU_stack_link(mat, node, "node_tex_coord", in, out,
+ GPU_builtin(GPU_VIEW_POSITION), GPU_builtin(GPU_VIEW_NORMAL),
+ GPU_builtin(GPU_INVERSE_VIEW_MATRIX), GPU_builtin(GPU_INVERSE_OBJECT_MATRIX),
+ GPU_builtin(GPU_CAMERA_TEXCO_FACTORS), orco, mtface);
}
/* node type definition */
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_environment.c b/source/blender/nodes/shader/nodes/node_shader_tex_environment.c
index 41860df5670..ab8ce456b05 100644
--- a/source/blender/nodes/shader/nodes/node_shader_tex_environment.c
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_environment.c
@@ -57,27 +57,44 @@ static int node_shader_gpu_tex_environment(GPUMaterial *mat, bNode *node, bNodeE
{
Image *ima = (Image *)node->id;
ImageUser *iuser = NULL;
- NodeTexImage *tex = node->storage;
+ NodeTexEnvironment *tex = node->storage;
int isdata = tex->color_space == SHD_COLORSPACE_NONE;
+ GPUNodeLink *outalpha;
if (!ima)
return GPU_stack_link(mat, node, "node_tex_environment_empty", in, out);
if (!in[0].link) {
- GPUMatType type = GPU_Material_get_type(mat);
-
- if (type == GPU_MATERIAL_TYPE_MESH)
- in[0].link = GPU_builtin(GPU_VIEW_POSITION);
- else
- GPU_link(mat, "background_transform_to_world", GPU_builtin(GPU_VIEW_POSITION), &in[0].link);
+ GPU_link(mat, "node_tex_environment_texco", GPU_builtin(GPU_VIEW_POSITION), &in[0].link);
}
node_shader_gpu_tex_mapping(mat, node, in, out);
- if (tex->projection == SHD_PROJ_EQUIRECTANGULAR)
- GPU_stack_link(mat, node, "node_tex_environment_equirectangular", in, out, GPU_image(ima, iuser, isdata));
- else
- GPU_stack_link(mat, node, "node_tex_environment_mirror_ball", in, out, GPU_image(ima, iuser, isdata));
+ /* Compute texture coordinate. */
+ if (tex->projection == SHD_PROJ_EQUIRECTANGULAR) {
+ /* To fix pole issue we clamp the v coordinate. The clamp value depends on the filter size. */
+ float clamp_size = (ELEM(tex->interpolation, SHD_INTERP_CUBIC, SHD_INTERP_SMART)) ? 1.5 : 0.5;
+ GPU_link(mat, "node_tex_environment_equirectangular", in[0].link, GPU_constant(&clamp_size),
+ GPU_image(ima, iuser, isdata), &in[0].link);
+ }
+ else {
+ GPU_link(mat, "node_tex_environment_mirror_ball", in[0].link, &in[0].link);
+ }
+
+ /* Sample texture with correct interpolation. */
+ switch (tex->interpolation) {
+ case SHD_INTERP_LINEAR:
+ /* Force the highest mipmap and don't do anisotropic filtering.
+ * This is to fix the artifact caused by derivatives discontinuity. */
+ GPU_link(mat, "node_tex_image_linear_no_mip", in[0].link, GPU_image(ima, iuser, isdata), &out[0].link, &outalpha);
+ break;
+ case SHD_INTERP_CLOSEST:
+ GPU_link(mat, "node_tex_image_nearest", in[0].link, GPU_image(ima, iuser, isdata), &out[0].link, &outalpha);
+ break;
+ default:
+ GPU_link(mat, "node_tex_image_cubic", in[0].link, GPU_image(ima, iuser, isdata), &out[0].link, &outalpha);
+ break;
+ }
ImBuf *ibuf = BKE_image_acquire_ibuf(ima, iuser, NULL);
if (ibuf && (ibuf->colormanage_flag & IMB_COLORMANAGE_IS_DATA) == 0 &&
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.c b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.c
index 750ce60e84d..404463a8fbe 100644
--- a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.c
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.c
@@ -54,7 +54,7 @@ static int node_shader_gpu_tex_gradient(GPUMaterial *mat, bNode *node, bNodeExec
{
if (!in[0].link) {
in[0].link = GPU_attribute(CD_ORCO, "");
- GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+ GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
}
node_shader_gpu_tex_mapping(mat, node, in, out);
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_image.c b/source/blender/nodes/shader/nodes/node_shader_tex_image.c
index 0b33b186dd2..524f7a5c8e2 100644
--- a/source/blender/nodes/shader/nodes/node_shader_tex_image.c
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_image.c
@@ -67,6 +67,12 @@ static int node_shader_gpu_tex_image(GPUMaterial *mat, bNode *node, bNodeExecDat
"tex_box_sample_cubic",
"tex_box_sample_smart"
};
+ static const char *names_clip[] = {
+ "tex_clip_linear",
+ "tex_clip_nearest",
+ "tex_clip_cubic",
+ "tex_clip_smart"
+ };
Image *ima = (Image *)node->id;
ImageUser *iuser = NULL;
@@ -75,8 +81,18 @@ static int node_shader_gpu_tex_image(GPUMaterial *mat, bNode *node, bNodeExecDat
? names_box[tex->interpolation]
: names[tex->interpolation];
bool do_color_correction = false;
+ bool do_texco_extend = (tex->extension != SHD_IMAGE_EXTENSION_REPEAT);
+ const bool do_texco_clip = (tex->extension == SHD_IMAGE_EXTENSION_CLIP);
+
+ if (do_texco_extend && (tex->projection != SHD_PROJ_BOX) &&
+ ELEM(tex->interpolation, SHD_INTERP_CUBIC, SHD_INTERP_SMART))
+ {
+ gpu_node_name = "node_tex_image_cubic_extend";
+ /* We do it inside the sampling function */
+ do_texco_extend = false;
+ }
- GPUNodeLink *norm, *col1, *col2, *col3;
+ GPUNodeLink *norm, *col1, *col2, *col3, *input_coords;
int isdata = tex->color_space == SHD_COLORSPACE_NONE;
float blend = tex->projection_blend;
@@ -100,6 +116,12 @@ static int node_shader_gpu_tex_image(GPUMaterial *mat, bNode *node, bNodeExecDat
switch (tex->projection) {
case SHD_PROJ_FLAT:
+ if (do_texco_clip) {
+ GPU_link(mat, "set_rgb", in[0].link, &input_coords);
+ }
+ if (do_texco_extend) {
+ GPU_link(mat, "point_texco_clamp", in[0].link, GPU_image(ima, iuser, isdata), &in[0].link);
+ }
GPU_stack_link(mat, node, gpu_node_name, in, out, GPU_image(ima, iuser, isdata));
break;
case SHD_PROJ_BOX:
@@ -124,22 +146,40 @@ static int node_shader_gpu_tex_image(GPUMaterial *mat, bNode *node, bNodeExecDat
norm,
col1, col2, col3,
GPU_image(ima, iuser, isdata),
- GPU_constant(&blend),
+ GPU_uniform(&blend),
&out[0].link,
&out[1].link);
break;
case SHD_PROJ_SPHERE:
GPU_link(mat, "point_texco_remap_square", in[0].link, &in[0].link);
GPU_link(mat, "point_map_to_sphere", in[0].link, &in[0].link);
+ if (do_texco_clip) {
+ GPU_link(mat, "set_rgb", in[0].link, &input_coords);
+ }
+ if (do_texco_extend) {
+ GPU_link(mat, "point_texco_clamp", in[0].link, GPU_image(ima, iuser, isdata), &in[0].link);
+ }
GPU_stack_link(mat, node, gpu_node_name, in, out, GPU_image(ima, iuser, isdata));
break;
case SHD_PROJ_TUBE:
GPU_link(mat, "point_texco_remap_square", in[0].link, &in[0].link);
GPU_link(mat, "point_map_to_tube", in[0].link, &in[0].link);
+ if (do_texco_clip) {
+ GPU_link(mat, "set_rgb", in[0].link, &input_coords);
+ }
+ if (do_texco_extend) {
+ GPU_link(mat, "point_texco_clamp", in[0].link, GPU_image(ima, iuser, isdata), &in[0].link);
+ }
GPU_stack_link(mat, node, gpu_node_name, in, out, GPU_image(ima, iuser, isdata));
break;
}
+ if (do_texco_clip && (tex->projection != SHD_PROJ_BOX)) {
+ GPU_link(mat, names_clip[tex->interpolation],
+ input_coords, GPU_image(ima, iuser, isdata), out[0].link,
+ &out[0].link, &out[1].link);
+ }
+
if (do_color_correction && (tex->projection != SHD_PROJ_BOX)) {
GPU_link(mat, "srgb_to_linearrgb", out[0].link, &out[0].link);
}
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_magic.c b/source/blender/nodes/shader/nodes/node_shader_tex_magic.c
index fb3012e1d2b..e24ef04bc57 100644
--- a/source/blender/nodes/shader/nodes/node_shader_tex_magic.c
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_magic.c
@@ -59,7 +59,7 @@ static int node_shader_gpu_tex_magic(GPUMaterial *mat, bNode *node, bNodeExecDat
if (!in[0].link) {
in[0].link = GPU_attribute(CD_ORCO, "");
- GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+ GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
}
node_shader_gpu_tex_mapping(mat, node, in, out);
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_musgrave.c b/source/blender/nodes/shader/nodes/node_shader_tex_musgrave.c
index 30171eea9e2..5d4f6b7c578 100644
--- a/source/blender/nodes/shader/nodes/node_shader_tex_musgrave.c
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_musgrave.c
@@ -60,7 +60,7 @@ static int node_shader_gpu_tex_musgrave(GPUMaterial *mat, bNode *node, bNodeExec
{
if (!in[0].link) {
in[0].link = GPU_attribute(CD_ORCO, "");
- GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+ GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
}
node_shader_gpu_tex_mapping(mat, node, in, out);
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_noise.c b/source/blender/nodes/shader/nodes/node_shader_tex_noise.c
index e2879528a5f..310e82d2d6b 100644
--- a/source/blender/nodes/shader/nodes/node_shader_tex_noise.c
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_noise.c
@@ -56,7 +56,7 @@ static int node_shader_gpu_tex_noise(GPUMaterial *mat, bNode *node, bNodeExecDat
{
if (!in[0].link) {
in[0].link = GPU_attribute(CD_ORCO, "");
- GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+ GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
}
node_shader_gpu_tex_mapping(mat, node, in, out);
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.c b/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.c
index 2105bbfa25a..059d6348473 100644
--- a/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.c
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.c
@@ -58,15 +58,17 @@ static int node_shader_gpu_tex_voronoi(GPUMaterial *mat, bNode *node, bNodeExecD
{
if (!in[0].link) {
in[0].link = GPU_attribute(CD_ORCO, "");
- GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+ GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
}
node_shader_gpu_tex_mapping(mat, node, in, out);
NodeTexVoronoi *tex = (NodeTexVoronoi *)node->storage;
float coloring = tex->coloring;
+ float metric = tex->distance;
+ float feature = tex->feature;
- return GPU_stack_link(mat, node, "node_tex_voronoi", in, out, GPU_constant(&coloring));
+ return GPU_stack_link(mat, node, "node_tex_voronoi", in, out, GPU_constant(&coloring), GPU_constant(&metric), GPU_constant(&feature));
}
static void node_shader_update_tex_voronoi(bNodeTree *UNUSED(ntree), bNode *node)
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_wave.c b/source/blender/nodes/shader/nodes/node_shader_tex_wave.c
index ac955b29808..db33be2bcb7 100644
--- a/source/blender/nodes/shader/nodes/node_shader_tex_wave.c
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_wave.c
@@ -58,7 +58,7 @@ static int node_shader_gpu_tex_wave(GPUMaterial *mat, bNode *node, bNodeExecData
{
if (!in[0].link) {
in[0].link = GPU_attribute(CD_ORCO, "");
- GPU_link(mat, "generated_from_orco", in[0].link, &in[0].link);
+ GPU_link(mat, "generated_texco", GPU_builtin(GPU_VIEW_POSITION), in[0].link, &in[0].link);
}
node_shader_gpu_tex_mapping(mat, node, in, out);
diff --git a/source/blender/nodes/shader/nodes/node_shader_wireframe.c b/source/blender/nodes/shader/nodes/node_shader_wireframe.c
index 11d889def31..3592f98d81d 100644
--- a/source/blender/nodes/shader/nodes/node_shader_wireframe.c
+++ b/source/blender/nodes/shader/nodes/node_shader_wireframe.c
@@ -38,6 +38,17 @@ static bNodeSocketTemplate sh_node_wireframe_out[] = {
{ -1, 0, "" }
};
+static int node_shader_gpu_wireframe(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out)
+{
+ /* node->custom1 is use_pixel_size */
+ if (node->custom1) {
+ return GPU_stack_link(mat, node, "node_wireframe_screenspace", in, out, GPU_builtin(GPU_BARYCENTRIC_TEXCO));
+ }
+ else {
+ return GPU_stack_link(mat, node, "node_wireframe", in, out, GPU_builtin(GPU_BARYCENTRIC_TEXCO), GPU_builtin(GPU_BARYCENTRIC_DIST));
+ }
+}
+
/* node type definition */
void register_node_type_sh_wireframe(void)
{
@@ -47,6 +58,7 @@ void register_node_type_sh_wireframe(void)
node_type_socket_templates(&ntype, sh_node_wireframe_in, sh_node_wireframe_out);
node_type_init(&ntype, NULL);
node_type_storage(&ntype, "", NULL, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_wireframe);
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/texture/node_texture_tree.c b/source/blender/nodes/texture/node_texture_tree.c
index 551d955c70f..6711e644d44 100644
--- a/source/blender/nodes/texture/node_texture_tree.c
+++ b/source/blender/nodes/texture/node_texture_tree.c
@@ -164,7 +164,7 @@ void register_node_tree_type_tex(void)
tt->type = NTREE_TEXTURE;
strcpy(tt->idname, "TextureNodeTree");
- strcpy(tt->ui_name, "Texture Editor");
+ strcpy(tt->ui_name, "Texture Node Editor");
tt->ui_icon = 0; /* defined in drawnode.c */
strcpy(tt->ui_description, "Texture nodes");
diff --git a/source/blender/nodes/texture/node_texture_util.h b/source/blender/nodes/texture/node_texture_util.h
index 63418248b71..6606915c3f7 100644
--- a/source/blender/nodes/texture/node_texture_util.h
+++ b/source/blender/nodes/texture/node_texture_util.h
@@ -61,7 +61,6 @@
#include "BKE_material.h"
#include "BKE_node.h"
#include "BKE_texture.h"
-#include "BKE_library.h"
#include "node_util.h"
#include "NOD_texture.h"
diff --git a/source/blender/physics/intern/BPH_mass_spring.cpp b/source/blender/physics/intern/BPH_mass_spring.cpp
index 2f24231f992..d43ce37cbfe 100644
--- a/source/blender/physics/intern/BPH_mass_spring.cpp
+++ b/source/blender/physics/intern/BPH_mass_spring.cpp
@@ -67,7 +67,7 @@ static int cloth_count_nondiag_blocks(Cloth *cloth)
for (link = cloth->springs; link; link = link->next) {
ClothSpring *spring = (ClothSpring *)link->link;
switch (spring->type) {
- case CLOTH_SPRING_TYPE_BENDING_ANG:
+ case CLOTH_SPRING_TYPE_BENDING_HAIR:
/* angular bending combines 3 vertices */
nondiag += 3;
break;
@@ -341,38 +341,75 @@ BLI_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s)
Cloth *cloth = clmd->clothObject;
ClothSimSettings *parms = clmd->sim_parms;
Implicit_Data *data = cloth->implicit;
-
- bool no_compress = parms->flags & CLOTH_SIMSETTINGS_FLAG_NO_SPRING_COMPRESS;
+ bool using_angular = parms->bending_model == CLOTH_BENDING_ANGULAR;
+ bool resist_compress = (parms->flags & CLOTH_SIMSETTINGS_FLAG_RESIST_SPRING_COMPRESS) && !using_angular;
s->flags &= ~CLOTH_SPRING_FLAG_NEEDED;
- // calculate force of structural + shear springs
- if ((s->type & CLOTH_SPRING_TYPE_STRUCTURAL) || (s->type & CLOTH_SPRING_TYPE_SHEAR) || (s->type & CLOTH_SPRING_TYPE_SEWING) ) {
-#ifdef CLOTH_FORCE_SPRING_STRUCTURAL
+ /* Calculate force of bending springs. */
+ if ((s->type & CLOTH_SPRING_TYPE_BENDING) && using_angular) {
+#ifdef CLOTH_FORCE_SPRING_BEND
float k, scaling;
s->flags |= CLOTH_SPRING_FLAG_NEEDED;
- scaling = parms->structural + s->stiffness * fabsf(parms->max_struct - parms->structural);
- k = scaling / (parms->avg_spring_len + FLT_EPSILON);
+ scaling = parms->bending + s->ang_stiffness * fabsf(parms->max_bend - parms->bending);
+ k = scaling * s->restlen * 0.1f; /* Multiplying by 0.1, just to scale the forces to more reasonable values. */
+
+ BPH_mass_spring_force_spring_angular(data, s->ij, s->kl, s->pa, s->pb, s->la, s->lb,
+ s->restang, k, parms->bending_damping);
+#endif
+ }
+
+ /* Calculate force of structural + shear springs. */
+ if (s->type & (CLOTH_SPRING_TYPE_STRUCTURAL | CLOTH_SPRING_TYPE_SEWING)) {
+#ifdef CLOTH_FORCE_SPRING_STRUCTURAL
+ float k_tension, scaling_tension;
+
+ s->flags |= CLOTH_SPRING_FLAG_NEEDED;
+
+ scaling_tension = parms->tension + s->lin_stiffness * fabsf(parms->max_tension - parms->tension);
+ k_tension = scaling_tension / (parms->avg_spring_len + FLT_EPSILON);
if (s->type & CLOTH_SPRING_TYPE_SEWING) {
// TODO: verify, half verified (couldn't see error)
// sewing springs usually have a large distance at first so clamp the force so we don't get tunnelling through colission objects
- BPH_mass_spring_force_spring_linear(data, s->ij, s->kl, s->restlen, k, parms->Cdis, no_compress, parms->max_sewing);
+ BPH_mass_spring_force_spring_linear(data, s->ij, s->kl, s->restlen,
+ k_tension, parms->tension_damp,
+ 0.0f, 0.0f, false, false, parms->max_sewing);
}
else {
- BPH_mass_spring_force_spring_linear(data, s->ij, s->kl, s->restlen, k, parms->Cdis, no_compress, 0.0f);
+ float k_compression, scaling_compression;
+ scaling_compression = parms->compression + s->lin_stiffness * fabsf(parms->max_compression - parms->compression);
+ k_compression = scaling_compression / (parms->avg_spring_len + FLT_EPSILON);
+
+ BPH_mass_spring_force_spring_linear(data, s->ij, s->kl, s->restlen,
+ k_tension, parms->tension_damp,
+ k_compression, parms->compression_damp,
+ resist_compress, using_angular, 0.0f);
}
#endif
}
+ else if (s->type & CLOTH_SPRING_TYPE_SHEAR) {
+#ifdef CLOTH_FORCE_SPRING_SHEAR
+ float k, scaling;
+
+ s->flags |= CLOTH_SPRING_FLAG_NEEDED;
+
+ scaling = parms->shear + s->lin_stiffness * fabsf(parms->max_shear - parms->shear);
+ k = scaling / (parms->avg_spring_len + FLT_EPSILON);
+
+ BPH_mass_spring_force_spring_linear(data, s->ij, s->kl, s->restlen, k, parms->shear_damp,
+ 0.0f, 0.0f, resist_compress, false, 0.0f);
+#endif
+ }
else if (s->type & CLOTH_SPRING_TYPE_BENDING) { /* calculate force of bending springs */
#ifdef CLOTH_FORCE_SPRING_BEND
float kb, cb, scaling;
s->flags |= CLOTH_SPRING_FLAG_NEEDED;
- scaling = parms->bending + s->stiffness * fabsf(parms->max_bend - parms->bending);
+ scaling = parms->bending + s->lin_stiffness * fabsf(parms->max_bend - parms->bending);
kb = scaling / (20.0f * (parms->avg_spring_len + FLT_EPSILON));
// Fix for [#45084] for cloth stiffness must have cb proportional to kb
@@ -381,7 +418,7 @@ BLI_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s)
BPH_mass_spring_force_spring_bending(data, s->ij, s->kl, s->restlen, kb, cb);
#endif
}
- else if (s->type & CLOTH_SPRING_TYPE_BENDING_ANG) {
+ else if (s->type & CLOTH_SPRING_TYPE_BENDING_HAIR) {
#ifdef CLOTH_FORCE_SPRING_BEND
float kb, cb, scaling;
@@ -391,14 +428,14 @@ BLI_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s)
* this is crap, but needed due to cloth/hair mixing ...
* max_bend factor is not even used for hair, so ...
*/
- scaling = s->stiffness * parms->bending;
+ scaling = s->lin_stiffness * parms->bending;
kb = scaling / (20.0f * (parms->avg_spring_len + FLT_EPSILON));
// Fix for [#45084] for cloth stiffness must have cb proportional to kb
cb = kb * parms->bending_damping;
/* XXX assuming same restlen for ij and jk segments here, this can be done correctly for hair later */
- BPH_mass_spring_force_spring_bending_angular(data, s->ij, s->kl, s->mn, s->target, kb, cb);
+ BPH_mass_spring_force_spring_bending_hair(data, s->ij, s->kl, s->mn, s->target, kb, cb);
#if 0
{
@@ -556,7 +593,7 @@ BLI_INLINE void cloth_get_grid_location(Implicit_Data *data, float cell_scale, c
add_v3_v3(x, cell_offset);
}
-/* returns next spring forming a continous hair sequence */
+/* returns next spring forming a continuous hair sequence */
BLI_INLINE LinkNode *hair_spring_next(LinkNode *spring_link)
{
ClothSpring *spring = (ClothSpring *)spring_link->link;
@@ -847,90 +884,41 @@ static void cloth_calc_volume_force(ClothModifierData *clmd)
}
#endif
-/* old collision stuff for cloth, use for continuity
- * until a good replacement is ready
- */
-static void cloth_collision_solve_extra(
- Depsgraph *depsgraph, Scene *scene, Object *ob, ClothModifierData *clmd, ListBase *effectors,
- float frame, float step, float dt)
+static void cloth_solve_collisions(Depsgraph *depsgraph, Object *ob, ClothModifierData *clmd, float step, float dt)
{
Cloth *cloth = clmd->clothObject;
Implicit_Data *id = cloth->implicit;
ClothVertex *verts = cloth->verts;
int mvert_num = cloth->mvert_num;
- const float spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale;
-
- bool do_extra_solve;
+ const float time_multiplier = 1.0f / (clmd->sim_parms->dt * clmd->sim_parms->timescale);
int i;
- if (!(clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED))
+ if (!(clmd->coll_parms->flags & (CLOTH_COLLSETTINGS_FLAG_ENABLED | CLOTH_COLLSETTINGS_FLAG_SELF)))
return;
+
if (!clmd->clothObject->bvhtree)
return;
- // update verts to current positions
+ BPH_mass_spring_solve_positions(id, dt);
+
+ /* Update verts to current positions. */
for (i = 0; i < mvert_num; i++) {
BPH_mass_spring_get_new_position(id, i, verts[i].tx);
sub_v3_v3v3(verts[i].tv, verts[i].tx, verts[i].txold);
- copy_v3_v3(verts[i].v, verts[i].tv);
- }
-
-#if 0 /* unused */
- for (i=0, cv=cloth->verts; i<cloth->mvert_num; i++, cv++) {
- copy_v3_v3(initial_cos[i], cv->tx);
- }
-#endif
-
- // call collision function
- // TODO: check if "step" or "step+dt" is correct - dg
- do_extra_solve = cloth_bvh_objcollision(
- depsgraph, ob, clmd, step / clmd->sim_parms->timescale, dt / clmd->sim_parms->timescale);
-
- // copy corrected positions back to simulation
- for (i = 0; i < mvert_num; i++) {
- float curx[3];
- BPH_mass_spring_get_position(id, i, curx);
- // correct velocity again, just to be sure we had to change it due to adaptive collisions
- sub_v3_v3v3(verts[i].tv, verts[i].tx, curx);
+ zero_v3(verts[i].dcvel);
}
- if (do_extra_solve) {
-// cloth_calc_helper_forces(ob, clmd, initial_cos, step/clmd->sim_parms->timescale, dt/clmd->sim_parms->timescale);
-
+ if (cloth_bvh_collision(depsgraph, ob, clmd, step / clmd->sim_parms->timescale, dt / clmd->sim_parms->timescale)) {
for (i = 0; i < mvert_num; i++) {
-
- float newv[3];
-
- if ((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) && (verts [i].flags & CLOTH_VERT_FLAG_PINNED))
+ if ((clmd->sim_parms->vgroup_mass > 0) && (verts[i].flags & CLOTH_VERT_FLAG_PINNED))
continue;
- BPH_mass_spring_set_new_position(id, i, verts[i].tx);
- mul_v3_v3fl(newv, verts[i].tv, spf);
- BPH_mass_spring_set_new_velocity(id, i, newv);
+ BPH_mass_spring_get_new_velocity(id, i, verts[i].tv);
+ madd_v3_v3fl(verts[i].tv, verts[i].dcvel, time_multiplier);
+ BPH_mass_spring_set_new_velocity(id, i, verts[i].tv);
}
}
-
- // X = Xnew;
- BPH_mass_spring_apply_result(id);
-
- if (do_extra_solve) {
- ImplicitSolverResult result;
-
- /* initialize forces to zero */
- BPH_mass_spring_clear_forces(id);
-
- // calculate forces
- cloth_calc_force(scene, clmd, frame, effectors, step);
-
- // calculate new velocity and position
- BPH_mass_spring_solve_velocities(id, dt, &result);
-// cloth_record_result(clmd, &result, clmd->sim_parms->stepsPerFrame);
-
- /* note: positions are advanced only once in the main solver step! */
-
- BPH_mass_spring_apply_result(id);
- }
}
static void cloth_clear_result(ClothModifierData *clmd)
@@ -943,7 +931,7 @@ static void cloth_clear_result(ClothModifierData *clmd)
sres->avg_iterations = 0.0f;
}
-static void cloth_record_result(ClothModifierData *clmd, ImplicitSolverResult *result, int steps)
+static void cloth_record_result(ClothModifierData *clmd, ImplicitSolverResult *result, float dt)
{
ClothSolverResult *sres = clmd->solver_result;
@@ -952,22 +940,22 @@ static void cloth_record_result(ClothModifierData *clmd, ImplicitSolverResult *r
if (result->status == BPH_SOLVER_SUCCESS) {
sres->min_error = min_ff(sres->min_error, result->error);
sres->max_error = max_ff(sres->max_error, result->error);
- sres->avg_error += result->error / (float)steps;
+ sres->avg_error += result->error * dt;
}
sres->min_iterations = min_ii(sres->min_iterations, result->iterations);
sres->max_iterations = max_ii(sres->max_iterations, result->iterations);
- sres->avg_iterations += (float)result->iterations / (float)steps;
+ sres->avg_iterations += (float)result->iterations * dt;
}
else {
/* error only makes sense for successful iterations */
if (result->status == BPH_SOLVER_SUCCESS) {
sres->min_error = sres->max_error = result->error;
- sres->avg_error += result->error / (float)steps;
+ sres->avg_error += result->error * dt;
}
sres->min_iterations = sres->max_iterations = result->iterations;
- sres->avg_iterations += (float)result->iterations / (float)steps;
+ sres->avg_iterations += (float)result->iterations * dt;
}
sres->status |= result->status;
@@ -987,7 +975,7 @@ int BPH_cloth_solve(Depsgraph *depsgraph, Object *ob, float frame, ClothModifier
Cloth *cloth = clmd->clothObject;
ClothVertex *verts = cloth->verts/*, *cv*/;
unsigned int mvert_num = cloth->mvert_num;
- float dt = clmd->sim_parms->timescale / clmd->sim_parms->stepsPerFrame;
+ float dt = clmd->sim_parms->dt * clmd->sim_parms->timescale;
Implicit_Data *id = cloth->implicit;
ColliderContacts *contacts = NULL;
int totcolliders = 0;
@@ -998,7 +986,7 @@ int BPH_cloth_solve(Depsgraph *depsgraph, Object *ob, float frame, ClothModifier
clmd->solver_result = (ClothSolverResult *)MEM_callocN(sizeof(ClothSolverResult), "cloth solver result");
cloth_clear_result(clmd);
- if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) { /* do goal stuff */
+ if (clmd->sim_parms->vgroup_mass > 0) { /* Do goal stuff. */
for (i = 0; i < mvert_num; i++) {
// update velocities with constrained velocities from pinned verts
if (verts[i].flags & CLOTH_VERT_FLAG_PINNED) {
@@ -1015,12 +1003,6 @@ int BPH_cloth_solve(Depsgraph *depsgraph, Object *ob, float frame, ClothModifier
while (step < tf) {
ImplicitSolverResult result;
- /* copy velocities for collision */
- for (i = 0; i < mvert_num; i++) {
- BPH_mass_spring_get_motion_state(id, i, NULL, verts[i].tv);
- copy_v3_v3(verts[i].v, verts[i].tv);
- }
-
if (is_hair) {
/* determine contact points */
if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED) {
@@ -1038,39 +1020,28 @@ int BPH_cloth_solve(Depsgraph *depsgraph, Object *ob, float frame, ClothModifier
/* initialize forces to zero */
BPH_mass_spring_clear_forces(id);
- // damping velocity for artistic reasons
- // this is a bad way to do it, should be removed imo - lukas_t
- if (clmd->sim_parms->vel_damping != 1.0f) {
- for (i = 0; i < mvert_num; i++) {
- float v[3];
- BPH_mass_spring_get_motion_state(id, i, NULL, v);
- mul_v3_fl(v, clmd->sim_parms->vel_damping);
- BPH_mass_spring_set_velocity(id, i, v);
- }
- }
-
// calculate forces
cloth_calc_force(scene, clmd, frame, effectors, step);
// calculate new velocity and position
BPH_mass_spring_solve_velocities(id, dt, &result);
- cloth_record_result(clmd, &result, clmd->sim_parms->stepsPerFrame);
+ cloth_record_result(clmd, &result, dt);
+
+ /* Calculate collision impulses. */
+ if (!is_hair) {
+ cloth_solve_collisions(depsgraph, ob, clmd, step, dt);
+ }
if (is_hair) {
cloth_continuum_step(clmd, dt);
}
BPH_mass_spring_solve_positions(id, dt);
-
- if (!is_hair) {
- cloth_collision_solve_extra(depsgraph, scene, ob, clmd, effectors, frame, step, dt);
- }
-
BPH_mass_spring_apply_result(id);
/* move pinned verts to correct position */
for (i = 0; i < mvert_num; i++) {
- if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) {
+ if (clmd->sim_parms->vgroup_mass > 0) {
if (verts[i].flags & CLOTH_VERT_FLAG_PINNED) {
float x[3];
/* divide by time_scale to prevent pinned vertices' delta locations from being multiplied */
diff --git a/source/blender/physics/intern/ConstrainedConjugateGradient.h b/source/blender/physics/intern/ConstrainedConjugateGradient.h
index 2d5fb41cc73..8d8dc1ae187 100644
--- a/source/blender/physics/intern/ConstrainedConjugateGradient.h
+++ b/source/blender/physics/intern/ConstrainedConjugateGradient.h
@@ -175,7 +175,7 @@ struct traits<ConstrainedConjugateGradient<_MatrixType,_UpLo,_FilterMatrixType,_
* ++i;
* } while (cg.info()!=Success && i<100);
* \endcode
- * Note that such a step by step excution is slightly slower.
+ * Note that such a step by step execution is slightly slower.
*
* \sa class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner
*/
diff --git a/source/blender/physics/intern/implicit.h b/source/blender/physics/intern/implicit.h
index 2eadd3171b0..f99812a8aa9 100644
--- a/source/blender/physics/intern/implicit.h
+++ b/source/blender/physics/intern/implicit.h
@@ -50,6 +50,7 @@ extern "C" {
#define CLOTH_FORCE_GRAVITY
#define CLOTH_FORCE_DRAG
#define CLOTH_FORCE_SPRING_STRUCTURAL
+#define CLOTH_FORCE_SPRING_SHEAR
#define CLOTH_FORCE_SPRING_BEND
#define CLOTH_FORCE_SPRING_GOAL
#define CLOTH_FORCE_EFFECTORS
@@ -114,11 +115,16 @@ void BPH_mass_spring_force_edge_wind(struct Implicit_Data *data, int v1, int v2,
void BPH_mass_spring_force_vertex_wind(struct Implicit_Data *data, int v, float radius, const float (*winvec)[3]);
/* Linear spring force between two points */
bool BPH_mass_spring_force_spring_linear(struct Implicit_Data *data, int i, int j, float restlen,
- float stiffness, float damping, bool no_compress, float clamp_force);
+ float stiffness_tension, float damping_tension,
+ float stiffness_compression, float damping_compression,
+ bool resist_compress, bool new_compress, float clamp_force);
+/* Angular spring force between two polygons */
+bool BPH_mass_spring_force_spring_angular(struct Implicit_Data *data, int i, int j, int *i_a, int *i_b, int len_a, int len_b,
+ float restang, float stiffness, float damping);
/* Bending force, forming a triangle at the base of two structural springs */
bool BPH_mass_spring_force_spring_bending(struct Implicit_Data *data, int i, int j, float restlen, float kb, float cb);
/* Angular bending force based on local target vectors */
-bool BPH_mass_spring_force_spring_bending_angular(struct Implicit_Data *data, int i, int j, int k,
+bool BPH_mass_spring_force_spring_bending_hair(struct Implicit_Data *data, int i, int j, int k,
const float target[3], float stiffness, float damping);
/* Global goal spring */
bool BPH_mass_spring_force_spring_goal(struct Implicit_Data *data, int i, const float goal_x[3], const float goal_v[3],
diff --git a/source/blender/physics/intern/implicit_blender.c b/source/blender/physics/intern/implicit_blender.c
index ddd71eb93e3..20f4a9f3163 100644
--- a/source/blender/physics/intern/implicit_blender.c
+++ b/source/blender/physics/intern/implicit_blender.c
@@ -68,14 +68,15 @@
static float I[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
static float ZERO[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
-/*
+#if 0
#define C99
#ifdef C99
#defineDO_INLINE inline
#else
#defineDO_INLINE static
#endif
-*/
+#endif /* if 0 */
+
struct Cloth;
//////////////////////////////////////////
@@ -383,14 +384,18 @@ DO_INLINE void inverse_fmatrix(float to[3][3], float from[3][3])
int i2=(i+2)%3;
int j1=(j+1)%3;
int j2=(j+2)%3;
- // reverse indexs i&j to take transpose
+ /** Reverse indexes i&j to take transpose. */
to[j][i] = (from[i1][j1]*from[i2][j2]-from[i1][j2]*from[i2][j1])/d;
- /*
- if (i==j)
- to[i][j] = 1.0f / from[i][j];
- else
- to[i][j] = 0;
- */
+ /**
+ * <pre>
+ * if (i == j) {
+ * to[i][j] = 1.0f / from[i][j];
+ * }
+ * else {
+ * to[i][j] = 0;
+ * }
+ * </pre>
+ */
}
}
@@ -923,7 +928,8 @@ DO_INLINE void BuildPPinv(fmatrix3x3 *lA, fmatrix3x3 *P, fmatrix3x3 *Pinv)
}
}
-/*
+
+#if 0
// version 1.3
static int cg_filtered_pre(lfVector *dv, fmatrix3x3 *lA, lfVector *lB, lfVector *z, fmatrix3x3 *S, fmatrix3x3 *P, fmatrix3x3 *Pinv)
{
@@ -995,7 +1001,8 @@ static int cg_filtered_pre(lfVector *dv, fmatrix3x3 *lA, lfVector *lB, lfVector
return iterations<conjgrad_looplimit;
}
-*/
+#endif
+
// version 1.4
static int cg_filtered_pre(lfVector *dv, fmatrix3x3 *lA, lfVector *lB, lfVector *z, fmatrix3x3 *S, fmatrix3x3 *P, fmatrix3x3 *Pinv, fmatrix3x3 *bigI)
{
@@ -1038,7 +1045,7 @@ static int cg_filtered_pre(lfVector *dv, fmatrix3x3 *lA, lfVector *lB, lfVector
// deltaNew = r^TP
deltaNew = dot_lfvector(r, p, numverts);
- /*
+#if 0
filter(dv, S);
add_lfvector_lfvector(dv, dv, z, numverts);
@@ -1052,7 +1059,7 @@ static int cg_filtered_pre(lfVector *dv, fmatrix3x3 *lA, lfVector *lB, lfVector
deltaNew = dot_lfvector(r, p, numverts);
delta0 = deltaNew * sqrt(conjgrad_epsilon);
- */
+#endif
#ifdef DEBUG_TIME
double start = PIL_check_seconds_timer();
@@ -1548,8 +1555,8 @@ BLI_INLINE bool spring_length(Implicit_Data *data, int i, int j, float r_extent[
*r_length = len_v3(r_extent);
if (*r_length > ALMOST_ZERO) {
- /*
- if (length>L) {
+#if 0
+ if (length > L) {
if ((clmd->sim_parms->flags & CSIMSETT_FLAG_TEARING_ENABLED) &&
( ((length-L)*100.0f/L) > clmd->sim_parms->maxspringlen ))
{
@@ -1558,7 +1565,7 @@ BLI_INLINE bool spring_length(Implicit_Data *data, int i, int j, float r_extent[
return false;
}
}
- */
+#endif
mul_v3_v3fl(r_dir, r_extent, 1.0f/(*r_length));
}
else {
@@ -1585,9 +1592,13 @@ BLI_INLINE void apply_spring(Implicit_Data *data, int i, int j, const float f[3]
}
bool BPH_mass_spring_force_spring_linear(Implicit_Data *data, int i, int j, float restlen,
- float stiffness, float damping, bool no_compress, float clamp_force)
+ float stiffness_tension, float damping_tension,
+ float stiffness_compression, float damping_compression,
+ bool resist_compress, bool new_compress, float clamp_force)
{
float extent[3], length, dir[3], vel[3];
+ float f[3], dfdx[3][3], dfdv[3][3];
+ float damping = 0;
// calculate elonglation
spring_length(data, i, j, extent, dir, &length, vel);
@@ -1595,29 +1606,41 @@ bool BPH_mass_spring_force_spring_linear(Implicit_Data *data, int i, int j, floa
/* This code computes not only the force, but also its derivative.
Zero derivative effectively disables the spring for the implicit solver.
Thus length > restlen makes cloth unconstrained at the start of simulation. */
- if ((length >= restlen && length > 0) || no_compress) {
- float stretch_force, f[3], dfdx[3][3], dfdv[3][3];
+ if ((length >= restlen && length > 0) || resist_compress) {
+ float stretch_force;
- stretch_force = stiffness * (length - restlen);
+ damping = damping_tension;
+
+ stretch_force = stiffness_tension * (length - restlen);
if (clamp_force > 0.0f && stretch_force > clamp_force) {
stretch_force = clamp_force;
}
mul_v3_v3fl(f, dir, stretch_force);
- // Ascher & Boxman, p.21: Damping only during elonglation
- // something wrong with it...
- madd_v3_v3fl(f, dir, damping * dot_v3v3(vel, dir));
+ dfdx_spring(dfdx, dir, length, restlen, stiffness_tension);
+ }
+ else if (new_compress) {
+ /* This is based on the Choi and Ko bending model, which works surprisingly well for compression. */
+ float kb = stiffness_compression;
+ float cb = kb; /* cb equal to kb seems to work, but a factor can be added if necessary */
- dfdx_spring(dfdx, dir, length, restlen, stiffness);
- dfdv_damp(dfdv, dir, damping);
+ damping = damping_compression;
- apply_spring(data, i, j, f, dfdx, dfdv);
+ mul_v3_v3fl(f, dir, fbstar(length, restlen, kb, cb));
- return true;
+ outerproduct(dfdx, dir, dir);
+ mul_m3_fl(dfdx, fbstar_jacobi(length, restlen, kb, cb));
}
else {
return false;
}
+
+ madd_v3_v3fl(f, dir, damping * dot_v3v3(vel, dir));
+ dfdv_damp(dfdv, dir, damping);
+
+ apply_spring(data, i, j, f, dfdx, dfdv);
+
+ return true;
}
/* See "Stable but Responsive Cloth" (Choi, Ko 2005) */
@@ -1648,6 +1671,114 @@ bool BPH_mass_spring_force_spring_bending(Implicit_Data *data, int i, int j, flo
}
}
+BLI_INLINE void poly_avg(lfVector *data, int *inds, int len, float r_avg[3])
+{
+ float fact = 1.0f / (float)len;
+
+ zero_v3(r_avg);
+
+ for (int i = 0; i < len; i++) {
+ madd_v3_v3fl(r_avg, data[inds[i]], fact);
+ }
+}
+
+BLI_INLINE void poly_norm(lfVector *data, int i, int j, int *inds, int len, float r_dir[3])
+{
+ float mid[3];
+
+ poly_avg(data, inds, len, mid);
+
+ normal_tri_v3(r_dir, data[i], data[j], mid);
+}
+
+BLI_INLINE void edge_avg(lfVector *data, int i, int j, float r_avg[3])
+{
+ r_avg[0] = (data[i][0] + data[j][0]) * 0.5f;
+ r_avg[1] = (data[i][1] + data[j][1]) * 0.5f;
+ r_avg[2] = (data[i][2] + data[j][2]) * 0.5f;
+}
+
+BLI_INLINE void edge_norm(lfVector *data, int i, int j, float r_dir[3])
+{
+ sub_v3_v3v3(r_dir, data[i], data[j]);
+ normalize_v3(r_dir);
+}
+
+BLI_INLINE float bend_angle(float dir_a[3], float dir_b[3], float dir_e[3])
+{
+ float cos, sin;
+ float tmp[3];
+
+ cos = dot_v3v3(dir_a, dir_b);
+
+ cross_v3_v3v3(tmp, dir_a, dir_b);
+ sin = dot_v3v3(tmp, dir_e);
+
+ return atan2f(sin, cos);
+}
+
+BLI_INLINE void spring_angle(Implicit_Data *data, int i, int j, int *i_a, int *i_b, int len_a, int len_b,
+ float r_dir_a[3], float r_dir_b[3],
+ float *r_angle, float r_vel_a[3], float r_vel_b[3])
+{
+ float dir_e[3], vel_e[3];
+
+ poly_norm(data->X, j, i, i_a, len_a, r_dir_a);
+ poly_norm(data->X, i, j, i_b, len_b, r_dir_b);
+
+ edge_norm(data->X, i, j, dir_e);
+
+ *r_angle = bend_angle(r_dir_a, r_dir_b, dir_e);
+
+ poly_avg(data->V, i_a, len_a, r_vel_a);
+ poly_avg(data->V, i_b, len_b, r_vel_b);
+
+ edge_avg(data->V, i, j, vel_e);
+
+ sub_v3_v3(r_vel_a, vel_e);
+ sub_v3_v3(r_vel_b, vel_e);
+}
+
+/* Angular springs roughly based on the bending model proposed by Baraff and Witkin in "Large Steps in Cloth Simulation". */
+bool BPH_mass_spring_force_spring_angular(Implicit_Data *data, int i, int j, int *i_a, int *i_b, int len_a, int len_b,
+ float restang, float stiffness, float damping)
+{
+ float angle, dir_a[3], dir_b[3], vel_a[3], vel_b[3];
+ float f_a[3], f_b[3], f_e[3];
+ float force;
+ int x;
+
+ spring_angle(data, i, j, i_a, i_b, len_a, len_b,
+ dir_a, dir_b, &angle, vel_a, vel_b);
+
+ /* spring force */
+ force = stiffness * (angle - restang);
+
+ /* damping force */
+ force += -damping * (dot_v3v3(vel_a, dir_a) + dot_v3v3(vel_b, dir_b));
+
+ mul_v3_v3fl(f_a, dir_a, force / len_a);
+ mul_v3_v3fl(f_b, dir_b, force / len_b);
+
+ for (x = 0; x < len_a; x++) {
+ add_v3_v3(data->F[i_a[x]], f_a);
+ }
+
+ for (x = 0; x < len_b; x++) {
+ add_v3_v3(data->F[i_b[x]], f_b);
+ }
+
+ mul_v3_v3fl(f_a, dir_a, force * 0.5f);
+ mul_v3_v3fl(f_b, dir_b, force * 0.5f);
+
+ add_v3_v3v3(f_e, f_a, f_b);
+
+ sub_v3_v3(data->F[i], f_e);
+ sub_v3_v3(data->F[j], f_e);
+
+ return true;
+}
+
/* Jacobian of a direction vector.
* Basically the part of the differential orthogonal to the direction,
* inversely proportional to the length of the edge.
@@ -1671,7 +1802,7 @@ BLI_INLINE void spring_grad_dir(Implicit_Data *data, int i, int j, float edge[3]
}
}
-BLI_INLINE void spring_angbend_forces(Implicit_Data *data, int i, int j, int k,
+BLI_INLINE void spring_hairbend_forces(Implicit_Data *data, int i, int j, int k,
const float goal[3],
float stiffness, float damping,
int q, const float dx[3], const float dv[3],
@@ -1720,7 +1851,7 @@ BLI_INLINE void spring_angbend_forces(Implicit_Data *data, int i, int j, int k,
}
/* Finite Differences method for estimating the jacobian of the force */
-BLI_INLINE void spring_angbend_estimate_dfdx(Implicit_Data *data, int i, int j, int k,
+BLI_INLINE void spring_hairbend_estimate_dfdx(Implicit_Data *data, int i, int j, int k,
const float goal[3],
float stiffness, float damping,
int q, float dfdx[3][3])
@@ -1739,11 +1870,11 @@ BLI_INLINE void spring_angbend_estimate_dfdx(Implicit_Data *data, int i, int j,
/* XXX TODO offset targets to account for position dependency */
for (a = 0; a < 3; ++a) {
- spring_angbend_forces(data, i, j, k, goal, stiffness, damping,
+ spring_hairbend_forces(data, i, j, k, goal, stiffness, damping,
q, dvec_pos[a], dvec_null[a], f);
copy_v3_v3(dfdx[a], f);
- spring_angbend_forces(data, i, j, k, goal, stiffness, damping,
+ spring_hairbend_forces(data, i, j, k, goal, stiffness, damping,
q, dvec_neg[a], dvec_null[a], f);
sub_v3_v3(dfdx[a], f);
@@ -1754,7 +1885,7 @@ BLI_INLINE void spring_angbend_estimate_dfdx(Implicit_Data *data, int i, int j,
}
/* Finite Differences method for estimating the jacobian of the force */
-BLI_INLINE void spring_angbend_estimate_dfdv(Implicit_Data *data, int i, int j, int k,
+BLI_INLINE void spring_hairbend_estimate_dfdv(Implicit_Data *data, int i, int j, int k,
const float goal[3],
float stiffness, float damping,
int q, float dfdv[3][3])
@@ -1773,11 +1904,11 @@ BLI_INLINE void spring_angbend_estimate_dfdv(Implicit_Data *data, int i, int j,
/* XXX TODO offset targets to account for position dependency */
for (a = 0; a < 3; ++a) {
- spring_angbend_forces(data, i, j, k, goal, stiffness, damping,
+ spring_hairbend_forces(data, i, j, k, goal, stiffness, damping,
q, dvec_null[a], dvec_pos[a], f);
copy_v3_v3(dfdv[a], f);
- spring_angbend_forces(data, i, j, k, goal, stiffness, damping,
+ spring_hairbend_forces(data, i, j, k, goal, stiffness, damping,
q, dvec_null[a], dvec_neg[a], f);
sub_v3_v3(dfdv[a], f);
@@ -1790,7 +1921,7 @@ BLI_INLINE void spring_angbend_estimate_dfdv(Implicit_Data *data, int i, int j,
/* Angular spring that pulls the vertex toward the local target
* See "Artistic Simulation of Curly Hair" (Pixar technical memo #12-03a)
*/
-bool BPH_mass_spring_force_spring_bending_angular(Implicit_Data *data, int i, int j, int k,
+bool BPH_mass_spring_force_spring_bending_hair(Implicit_Data *data, int i, int j, int k,
const float target[3], float stiffness, float damping)
{
float goal[3];
@@ -1806,18 +1937,18 @@ bool BPH_mass_spring_force_spring_bending_angular(Implicit_Data *data, int i, in
world_to_root_v3(data, j, goal, target);
- spring_angbend_forces(data, i, j, k, goal, stiffness, damping, k, vecnull, vecnull, fk);
+ spring_hairbend_forces(data, i, j, k, goal, stiffness, damping, k, vecnull, vecnull, fk);
negate_v3_v3(fj, fk); /* counterforce */
- spring_angbend_estimate_dfdx(data, i, j, k, goal, stiffness, damping, i, dfk_dxi);
- spring_angbend_estimate_dfdx(data, i, j, k, goal, stiffness, damping, j, dfk_dxj);
- spring_angbend_estimate_dfdx(data, i, j, k, goal, stiffness, damping, k, dfk_dxk);
+ spring_hairbend_estimate_dfdx(data, i, j, k, goal, stiffness, damping, i, dfk_dxi);
+ spring_hairbend_estimate_dfdx(data, i, j, k, goal, stiffness, damping, j, dfk_dxj);
+ spring_hairbend_estimate_dfdx(data, i, j, k, goal, stiffness, damping, k, dfk_dxk);
copy_m3_m3(dfj_dxi, dfk_dxi); negate_m3(dfj_dxi);
copy_m3_m3(dfj_dxj, dfk_dxj); negate_m3(dfj_dxj);
- spring_angbend_estimate_dfdv(data, i, j, k, goal, stiffness, damping, i, dfk_dvi);
- spring_angbend_estimate_dfdv(data, i, j, k, goal, stiffness, damping, j, dfk_dvj);
- spring_angbend_estimate_dfdv(data, i, j, k, goal, stiffness, damping, k, dfk_dvk);
+ spring_hairbend_estimate_dfdv(data, i, j, k, goal, stiffness, damping, i, dfk_dvi);
+ spring_hairbend_estimate_dfdv(data, i, j, k, goal, stiffness, damping, j, dfk_dvj);
+ spring_hairbend_estimate_dfdv(data, i, j, k, goal, stiffness, damping, k, dfk_dvk);
copy_m3_m3(dfj_dvi, dfk_dvi); negate_m3(dfj_dvi);
copy_m3_m3(dfj_dvj, dfk_dvj); negate_m3(dfj_dvj);
diff --git a/source/blender/physics/intern/implicit_eigen.cpp b/source/blender/physics/intern/implicit_eigen.cpp
index eaac63893a6..fd91df9c769 100644
--- a/source/blender/physics/intern/implicit_eigen.cpp
+++ b/source/blender/physics/intern/implicit_eigen.cpp
@@ -900,8 +900,8 @@ BLI_INLINE bool spring_length(Implicit_Data *data, int i, int j, float r_extent[
*r_length = len_v3(r_extent);
if (*r_length > ALMOST_ZERO) {
- /*
- if (length>L) {
+#if 0
+ if (length > L) {
if ((clmd->sim_parms->flags & CSIMSETT_FLAG_TEARING_ENABLED) &&
( ((length-L)*100.0f/L) > clmd->sim_parms->maxspringlen ))
{
@@ -910,7 +910,7 @@ BLI_INLINE bool spring_length(Implicit_Data *data, int i, int j, float r_extent[
return false;
}
}
- */
+#endif
mul_v3_v3fl(r_dir, r_extent, 1.0f/(*r_length));
}
else {
diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h
index 24d2ef0463d..5a2f15405c1 100644
--- a/source/blender/python/BPY_extern.h
+++ b/source/blender/python/BPY_extern.h
@@ -75,11 +75,13 @@ void BPY_thread_restore(BPy_ThreadStatePtr tstate);
bool BPY_execute_filepath(struct bContext *C, const char *filepath, struct ReportList *reports);
bool BPY_execute_text(struct bContext *C, struct Text *text, struct ReportList *reports, const bool do_jump);
-bool BPY_execute_string_as_number(struct bContext *C, const char *expr, const bool verbose, double *r_value);
-bool BPY_execute_string_as_intptr(struct bContext *C, const char *expr, const bool verbose, intptr_t *r_value);
-bool BPY_execute_string_as_string(struct bContext *C, const char *expr, const bool verbose, char **r_value);
-bool BPY_execute_string_ex(struct bContext *C, const char *expr, bool use_eval);
-bool BPY_execute_string(struct bContext *C, const char *expr);
+
+bool BPY_execute_string_as_number(struct bContext *C, const char *imports[], const char *expr, const bool verbose, double *r_value);
+bool BPY_execute_string_as_intptr(struct bContext *C, const char *imports[], const char *expr, const bool verbose, intptr_t *r_value);
+bool BPY_execute_string_as_string(struct bContext *C, const char *imports[], const char *expr, const bool verbose, char **r_value);
+
+bool BPY_execute_string_ex(struct bContext *C, const char *imports[], const char *expr, bool use_eval);
+bool BPY_execute_string(struct bContext *C, const char *imports[], const char *expr);
void BPY_text_free_code(struct Text *text);
void BPY_modules_update(struct bContext *C); // XXX - annoying, need this for pointers that get out of date
diff --git a/source/blender/python/bmesh/bmesh_py_api.c b/source/blender/python/bmesh/bmesh_py_api.c
index d6189f7c1eb..235ede1e8fd 100644
--- a/source/blender/python/bmesh/bmesh_py_api.c
+++ b/source/blender/python/bmesh/bmesh_py_api.c
@@ -113,30 +113,30 @@ static PyObject *bpy_bm_from_edit_mesh(PyObject *UNUSED(self), PyObject *value)
}
PyDoc_STRVAR(bpy_bm_update_edit_mesh_doc,
-".. method:: update_edit_mesh(mesh, tessface=True, destructive=True)\n"
+".. method:: update_edit_mesh(mesh, loop_triangles=True, destructive=True)\n"
"\n"
" Update the mesh after changes to the BMesh in editmode, \n"
" optionally recalculating n-gon tessellation.\n"
"\n"
" :arg mesh: The editmode mesh.\n"
" :type mesh: :class:`bpy.types.Mesh`\n"
-" :arg tessface: Option to recalculate n-gon tessellation.\n"
-" :type tessface: boolean\n"
+" :arg loop_triangles: Option to recalculate n-gon tessellation.\n"
+" :type loop_triangles: boolean\n"
" :arg destructive: Use when geometry has been added or removed.\n"
" :type destructive: boolean\n"
);
static PyObject *bpy_bm_update_edit_mesh(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
- static const char *kwlist[] = {"mesh", "tessface", "destructive", NULL};
+ static const char *kwlist[] = {"mesh", "loop_triangles", "destructive", NULL};
PyObject *py_me;
Mesh *me;
- bool do_tessface = true;
+ bool do_loop_triangles = true;
bool is_destructive = true;
if (!PyArg_ParseTupleAndKeywords(
args, kw, "O|O&O&:update_edit_mesh", (char **)kwlist,
&py_me,
- PyC_ParseBool, &do_tessface,
+ PyC_ParseBool, &do_loop_triangles,
PyC_ParseBool, &is_destructive))
{
return NULL;
@@ -157,7 +157,7 @@ static PyObject *bpy_bm_update_edit_mesh(PyObject *UNUSED(self), PyObject *args,
{
extern void EDBM_update_generic(BMEditMesh *em, const bool do_tessface, const bool is_destructive);
- EDBM_update_generic(me->edit_btmesh, do_tessface, is_destructive);
+ EDBM_update_generic(me->edit_btmesh, do_loop_triangles, is_destructive);
}
Py_RETURN_NONE;
@@ -191,7 +191,7 @@ PyObject *BPyInit_bmesh(void)
{
PyObject *mod;
PyObject *submodule;
- PyObject *sys_modules = PyThreadState_GET()->interp->modules;
+ PyObject *sys_modules = PyImport_GetModuleDict();
BPy_BM_init_types();
BPy_BM_init_types_select();
@@ -203,21 +203,17 @@ PyObject *BPyInit_bmesh(void)
/* bmesh.types */
PyModule_AddObject(mod, "types", (submodule = BPyInit_bmesh_types()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
/* bmesh.ops (not a real module, exposes module like access). */
PyModule_AddObject(mod, "ops", (submodule = BPyInit_bmesh_ops()));
/* PyDict_SetItemString(sys_modules, PyModule_GetNameObject(submodule), submodule); */
PyDict_SetItemString(sys_modules, "bmesh.ops", submodule); /* fake module */
- Py_INCREF(submodule);
PyModule_AddObject(mod, "utils", (submodule = BPyInit_bmesh_utils()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
PyModule_AddObject(mod, "geometry", (submodule = BPyInit_bmesh_geometry()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
return mod;
}
diff --git a/source/blender/python/bmesh/bmesh_py_ops_call.c b/source/blender/python/bmesh/bmesh_py_ops_call.c
index 74d899ba3f8..b523d1d879d 100644
--- a/source/blender/python/bmesh/bmesh_py_ops_call.c
+++ b/source/blender/python/bmesh/bmesh_py_ops_call.c
@@ -542,7 +542,7 @@ static int bpy_slot_from_py(
}
/**
- * Use for getting return values from an operator thats already executed.
+ * Use for getting return values from an operator that's already executed.
*
* \note Don't throw any exceptions and should always return a valid (PyObject *).
*/
diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c
index 394adb1dd3b..bde5bca5780 100644
--- a/source/blender/python/bmesh/bmesh_py_types.c
+++ b/source/blender/python/bmesh/bmesh_py_types.c
@@ -35,7 +35,6 @@
#include "DNA_material_types.h"
#include "BKE_customdata.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
#include "BKE_library.h"
@@ -113,7 +112,7 @@ PyDoc_STRVAR(bpy_bm_elem_seam_doc, "Seam for UV unwrapping.\n\n:type: boolean
static PyObject *bpy_bm_elem_hflag_get(BPy_BMElem *self, void *flag)
{
- const char hflag = (char)GET_INT_FROM_POINTER(flag);
+ const char hflag = (char)POINTER_AS_INT(flag);
BPY_BM_CHECK_OBJ(self);
@@ -122,7 +121,7 @@ static PyObject *bpy_bm_elem_hflag_get(BPy_BMElem *self, void *flag)
static int bpy_bm_elem_hflag_set(BPy_BMElem *self, PyObject *value, void *flag)
{
- const char hflag = (char)GET_INT_FROM_POINTER(flag);
+ const char hflag = (char)POINTER_AS_INT(flag);
int param;
BPY_BM_CHECK_INT(self);
@@ -266,7 +265,7 @@ PyDoc_STRVAR(bpy_bmloops_link_loops_doc,
static PyObject *bpy_bmelemseq_elem_get(BPy_BMElem *self, void *itype)
{
BPY_BM_CHECK_OBJ(self);
- return BPy_BMElemSeq_CreatePyObject(self->bm, self, GET_INT_FROM_POINTER(itype));
+ return BPy_BMElemSeq_CreatePyObject(self->bm, self, POINTER_AS_INT(itype));
}
@@ -614,7 +613,7 @@ static PyObject *bpy_bmelemseq_layers_get(BPy_BMElemSeq *self, void *htype)
{
BPY_BM_CHECK_OBJ(self);
- return BPy_BMLayerAccess_CreatePyObject(self->bm, GET_INT_FROM_POINTER(htype));
+ return BPy_BMLayerAccess_CreatePyObject(self->bm, POINTER_AS_INT(htype));
}
/* FaceSeq
@@ -904,7 +903,7 @@ static PyObject *bpy_bmesh_to_mesh(BPy_BMesh *self, PyObject *args)
bm = self->bm;
- BLI_assert(BKE_id_is_in_gobal_main(&me->id));
+ BLI_assert(BKE_id_is_in_global_main(&me->id));
BM_mesh_bm_to_me(
G_MAIN, /* XXX UGLY! */
bm, me,
@@ -1247,15 +1246,15 @@ static PyObject *bpy_bmesh_calc_volume(BPy_BMElem *self, PyObject *args, PyObjec
}
}
-PyDoc_STRVAR(bpy_bmesh_calc_tessface_doc,
-".. method:: calc_tessface()\n"
+PyDoc_STRVAR(bpy_bmesh_calc_loop_triangles_doc,
+".. method:: calc_loop_triangles()\n"
"\n"
" Calculate triangle tessellation from quads/ngons.\n"
"\n"
" :return: The triangulated faces.\n"
" :rtype: list of :class:`BMLoop` tuples\n"
);
-static PyObject *bpy_bmesh_calc_tessface(BPy_BMElem *self)
+static PyObject *bpy_bmesh_calc_loop_triangles(BPy_BMElem *self)
{
BMesh *bm;
@@ -2457,7 +2456,7 @@ PyDoc_STRVAR(bpy_bmelemseq_index_update_doc,
" .. note::\n"
"\n"
" Running this on sequences besides :class:`BMesh.verts`, :class:`BMesh.edges`, :class:`BMesh.faces`\n"
-" works but wont result in each element having a valid index, insted its order in the sequence will be set.\n"
+" works but wont result in each element having a valid index, instead its order in the sequence will be set.\n"
);
static PyObject *bpy_bmelemseq_index_update(BPy_BMElemSeq *self)
{
@@ -2734,7 +2733,7 @@ static struct PyMethodDef bpy_bmesh_methods[] = {
/* calculations */
{"calc_volume", (PyCFunction)bpy_bmesh_calc_volume, METH_VARARGS | METH_KEYWORDS, bpy_bmesh_calc_volume_doc},
- {"calc_tessface", (PyCFunction)bpy_bmesh_calc_tessface, METH_NOARGS, bpy_bmesh_calc_tessface_doc},
+ {"calc_loop_triangles", (PyCFunction)bpy_bmesh_calc_loop_triangles, METH_NOARGS, bpy_bmesh_calc_loop_triangles_doc},
{NULL, NULL, 0, NULL}
};
@@ -4054,7 +4053,7 @@ int BPy_BMElem_CheckHType(PyTypeObject *type, const char htype)
/**
* Use for error strings only, not thread safe,
*
- * \return a sting like '(BMVert/BMEdge/BMFace/BMLoop)'
+ * \return a string like '(BMVert/BMEdge/BMFace/BMLoop)'
*/
char *BPy_BMElem_StringFromHType_ex(const char htype, char ret[32])
{
diff --git a/source/blender/python/bmesh/bmesh_py_types_customdata.c b/source/blender/python/bmesh/bmesh_py_types_customdata.c
index 15548714113..f49766c93ab 100644
--- a/source/blender/python/bmesh/bmesh_py_types_customdata.c
+++ b/source/blender/python/bmesh/bmesh_py_types_customdata.c
@@ -131,7 +131,7 @@ PyDoc_STRVAR(bpy_bmlayeraccess_collection__freestyle_face_doc,
static PyObject *bpy_bmlayeraccess_collection_get(BPy_BMLayerAccess *self, void *flag)
{
- const int type = (int)GET_INT_FROM_POINTER(flag);
+ const int type = (int)POINTER_AS_INT(flag);
BPY_BM_CHECK_OBJ(self);
diff --git a/source/blender/python/bmesh/bmesh_py_types_meshdata.c b/source/blender/python/bmesh/bmesh_py_types_meshdata.c
index 62981798b1a..2a0f3817f35 100644
--- a/source/blender/python/bmesh/bmesh_py_types_meshdata.c
+++ b/source/blender/python/bmesh/bmesh_py_types_meshdata.c
@@ -42,7 +42,6 @@
#include "BLI_math_vector.h"
#include "BKE_deform.h"
-#include "BKE_library.h"
#include "bmesh_py_types_meshdata.h"
@@ -92,13 +91,13 @@ PyDoc_STRVAR(bpy_bmloopuv_flag__select_edge_doc,
static PyObject *bpy_bmloopuv_flag_get(BPy_BMLoopUV *self, void *flag_p)
{
- const int flag = GET_INT_FROM_POINTER(flag_p);
+ const int flag = POINTER_AS_INT(flag_p);
return PyBool_FromLong(self->data->flag & flag);
}
static int bpy_bmloopuv_flag_set(BPy_BMLoopUV *self, PyObject *value, void *flag_p)
{
- const int flag = GET_INT_FROM_POINTER(flag_p);
+ const int flag = POINTER_AS_INT(flag_p);
switch (PyC_Long_AsBool(value)) {
case true:
@@ -200,13 +199,13 @@ PyDoc_STRVAR(bpy_bmvertskin_flag__use_loose_doc,
static PyObject *bpy_bmvertskin_flag_get(BPy_BMVertSkin *self, void *flag_p)
{
- const int flag = GET_INT_FROM_POINTER(flag_p);
+ const int flag = POINTER_AS_INT(flag_p);
return PyBool_FromLong(self->data->flag & flag);
}
static int bpy_bmvertskin_flag_set(BPy_BMVertSkin *self, PyObject *value, void *flag_p)
{
- const int flag = GET_INT_FROM_POINTER(flag_p);
+ const int flag = POINTER_AS_INT(flag_p);
switch (PyC_Long_AsBool(value)) {
case true:
@@ -388,7 +387,7 @@ PyObject *BPy_BMLoopColor_CreatePyObject(struct MLoopCol *data)
* This type could eventually be used to access lattice weights.
*
* \note: Many of blender-api's dict-like-wrappers act like ordered dicts,
- * This is intentional _not_ ordered, the weights can be in any order and it wont matter,
+ * This is intentionally _not_ ordered, the weights can be in any order and it won't matter,
* the order should not be used in the api in any meaningful way (as with a python dict)
* only expose as mapping, not a sequence.
*/
diff --git a/source/blender/python/bmesh/bmesh_py_utils.c b/source/blender/python/bmesh/bmesh_py_utils.c
index ca34de219b8..701dd5fbc19 100644
--- a/source/blender/python/bmesh/bmesh_py_utils.c
+++ b/source/blender/python/bmesh/bmesh_py_utils.c
@@ -438,7 +438,7 @@ PyDoc_STRVAR(bpy_bm_utils_face_split_doc,
" :type vert_a: :class:`bmesh.types.BMVert`\n"
" :arg vert_b: Second vertex to cut in the face (face must contain the vert).\n"
" :type vert_b: :class:`bmesh.types.BMVert`\n"
-" :arg coords: Optional argument to define points inbetween *vert_a* and *vert_b*.\n"
+" :arg coords: Optional argument to define points in between *vert_a* and *vert_b*.\n"
" :type coords: sequence of float triplets\n"
" :arg use_exist: .Use an existing edge if it exists (Only used when *coords* argument is empty or omitted)\n"
" :type use_exist: boolean\n"
diff --git a/source/blender/python/generic/bgl.c b/source/blender/python/generic/bgl.c
index 8f9475822bf..6e1c28e1310 100644
--- a/source/blender/python/generic/bgl.c
+++ b/source/blender/python/generic/bgl.c
@@ -37,6 +37,8 @@
#include "GPU_glew.h"
#include "MEM_guardedalloc.h"
+#include "../generic/py_capi_utils.h"
+
#include "bgl.h"
@@ -478,29 +480,21 @@ int BGL_typeSize(int type)
static int gl_buffer_type_from_py_buffer(Py_buffer *pybuffer)
{
- char *typestr = pybuffer->format;
+ const char format = PyC_StructFmt_type_from_str(pybuffer->format);
Py_ssize_t itemsize = pybuffer->itemsize;
- if (ELEM(typestr[0], '<', '>', '|')) {
- typestr += 1;
+ if (PyC_StructFmt_type_is_float_any(format)) {
+ if (itemsize == 4) return GL_FLOAT;
+ if (itemsize == 8) return GL_DOUBLE;
}
-
- switch (typestr[0]) {
- case 't':
- case 'b':
- case 'h':
- case 'i':
- case 'l':
- if (itemsize == 1) return GL_BYTE;
- if (itemsize == 2) return GL_SHORT;
- if (itemsize == 4) return GL_INT;
- break;
- case 'f':
- case 'd':
- if (itemsize == 4) return GL_FLOAT;
- if (itemsize == 8) return GL_DOUBLE;
- break;
+ if (PyC_StructFmt_type_is_byte(format) ||
+ PyC_StructFmt_type_is_int_any(format))
+ {
+ if (itemsize == 1) return GL_BYTE;
+ if (itemsize == 2) return GL_SHORT;
+ if (itemsize == 4) return GL_INT;
}
+
return -1; /* UNKNOWN */
}
@@ -1298,6 +1292,7 @@ BGL_Wrap(UniformMatrix4x3fv, void, (GLint, GLsizei, GLboolean, GLflo
BGL_Wrap(BindFramebuffer, void, (GLenum, GLuint))
BGL_Wrap(BindRenderbuffer, void, (GLenum, GLuint))
BGL_Wrap(BindVertexArray, void, (GLuint))
+BGL_Wrap(BlitFramebuffer, void, (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum))
BGL_Wrap(CheckFramebufferStatus, GLenum, (GLenum))
BGL_Wrap(DeleteFramebuffers, void, (GLsizei, GLuintP))
BGL_Wrap(DeleteRenderbuffers, void, (GLsizei, GLuintP))
@@ -1638,6 +1633,7 @@ PyObject *BPyInit_bgl(void)
PY_MOD_ADD_METHOD(BindFramebuffer);
PY_MOD_ADD_METHOD(BindRenderbuffer);
PY_MOD_ADD_METHOD(BindVertexArray);
+ PY_MOD_ADD_METHOD(BlitFramebuffer);
PY_MOD_ADD_METHOD(CheckFramebufferStatus);
PY_MOD_ADD_METHOD(DeleteFramebuffers);
PY_MOD_ADD_METHOD(DeleteRenderbuffers);
diff --git a/source/blender/python/generic/blf_py_api.c b/source/blender/python/generic/blf_py_api.c
index 71812466477..7337706639f 100644
--- a/source/blender/python/generic/blf_py_api.c
+++ b/source/blender/python/generic/blf_py_api.c
@@ -115,7 +115,7 @@ static PyObject *py_blf_aspect(PyObject *UNUSED(self), PyObject *args)
PyDoc_STRVAR(py_blf_color_doc,
-".. function:: color(fontid, level, r, g, b, a)\n"
+".. function:: color(fontid, r, g, b, a)\n"
"\n"
" Set the color for drawing text.\n"
"\n"
diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c
index c1e5f947110..926de79d0ff 100644
--- a/source/blender/python/generic/bpy_internal_import.c
+++ b/source/blender/python/generic/bpy_internal_import.c
@@ -43,9 +43,9 @@
#include "BLI_string.h"
#include "BLI_utildefines.h"
+#include "BKE_main.h"
/* UNUSED */
#include "BKE_text.h" /* txt_to_buf */
-#include "BKE_main.h"
#include "py_capi_utils.h"
diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c
index 4d4d5232800..072c11b14e5 100644
--- a/source/blender/python/generic/idprop_py_api.c
+++ b/source/blender/python/generic/idprop_py_api.c
@@ -422,11 +422,18 @@ static IDProperty *idp_from_PyBytes(const char *name, PyObject *ob)
return IDP_New(IDP_STRING, &val, name);
}
-static int idp_array_type_from_format_char(char format)
+static int idp_array_type_from_formatstr_and_size(const char *typestr, Py_ssize_t itemsize)
{
- if (format == 'i') return IDP_INT;
- if (format == 'f') return IDP_FLOAT;
- if (format == 'd') return IDP_DOUBLE;
+ char format = PyC_StructFmt_type_from_str(typestr);
+
+ if (PyC_StructFmt_type_is_float_any(format)) {
+ if (itemsize == 4) return IDP_FLOAT;
+ if (itemsize == 8) return IDP_DOUBLE;
+ }
+ if (PyC_StructFmt_type_is_int_any(format)) {
+ if (itemsize == 4) return IDP_INT;
+ }
+
return -1;
}
@@ -443,13 +450,13 @@ static IDProperty *idp_from_PySequence_Buffer(const char *name, Py_buffer *buffe
IDProperty *prop;
IDPropertyTemplate val = {0};
- int format = idp_array_type_from_format_char(*buffer->format);
- if (format == -1) {
+ int id_type = idp_array_type_from_formatstr_and_size(buffer->format, buffer->itemsize);
+ if (id_type == -1) {
/* should never happen as the type has been checked before */
return NULL;
}
else {
- val.array.type = format;
+ val.array.type = id_type;
val.array.len = buffer->len / buffer->itemsize;
}
prop = IDP_New(IDP_ARRAY, &val, name);
@@ -533,8 +540,10 @@ static IDProperty *idp_from_PySequence(const char *name, PyObject *ob)
if (PyObject_CheckBuffer(ob)) {
PyObject_GetBuffer(ob, &buffer, PyBUF_SIMPLE | PyBUF_FORMAT);
- char format = *buffer.format;
- if (ELEM(format, 'i', 'f', 'd')) {
+ char format = PyC_StructFmt_type_from_str(buffer.format);
+ if (PyC_StructFmt_type_is_float_any(format) ||
+ (PyC_StructFmt_type_is_int_any(format) && buffer.itemsize == 4))
+ {
use_buffer = true;
}
else {
@@ -944,7 +953,7 @@ PyObject *BPy_Wrap_GetKeys(IDProperty *prop)
/* pass */
}
- if (i != prop->len) { /* if the loop didnt finish, we know the length is wrong */
+ if (i != prop->len) { /* if the loop didn't finish, we know the length is wrong */
BPy_IDGroup_CorrectListLen(prop, list, i, __func__);
Py_DECREF(list); /*free the list*/
/*call self again*/
@@ -1795,14 +1804,13 @@ PyObject *BPyInit_idprop(void)
{
PyObject *mod;
PyObject *submodule;
- PyObject *sys_modules = PyThreadState_GET()->interp->modules;
+ PyObject *sys_modules = PyImport_GetModuleDict();
mod = PyModule_Create(&IDProp_module_def);
/* idprop.types */
PyModule_AddObject(mod, "types", (submodule = BPyInit_idprop_types()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
return mod;
}
diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c
index d8d6b5c7ce7..991a035f683 100644
--- a/source/blender/python/generic/py_capi_utils.c
+++ b/source/blender/python/generic/py_capi_utils.c
@@ -46,7 +46,6 @@
#endif
#ifdef _WIN32
-#include "BLI_path_util.h" /* BLI_setenv() */
#include "BLI_math_base.h" /* isfinite() */
#endif
@@ -618,7 +617,7 @@ const char *PyC_UnicodeAsByteAndSize(PyObject *py_str, Py_ssize_t *size, PyObjec
if (result) {
/* 99% of the time this is enough but we better support non unicode
- * chars since blender doesnt limit this */
+ * chars since blender doesn't limit this */
return result;
}
else {
@@ -671,7 +670,7 @@ PyObject *PyC_UnicodeFromByteAndSize(const char *str, Py_ssize_t size)
PyObject *result = PyUnicode_FromStringAndSize(str, size);
if (result) {
/* 99% of the time this is enough but we better support non unicode
- * chars since blender doesnt limit this */
+ * chars since blender doesn't limit this */
return result;
}
else {
@@ -691,7 +690,7 @@ PyObject *PyC_UnicodeFromByte(const char *str)
* Description: This function creates a new Python dictionary object.
* note: dict is owned by sys.modules["__main__"] module, reference is borrowed
* note: important we use the dict from __main__, this is what python expects
- * for 'pickle' to work as well as strings like this...
+ * for 'pickle' to work as well as strings like this...
* >> foo = 10
* >> print(__import__("__main__").foo)
*
@@ -716,6 +715,26 @@ PyObject *PyC_DefaultNameSpace(const char *filename)
return PyModule_GetDict(mod_main);
}
+bool PyC_NameSpace_ImportArray(PyObject *py_dict, const char *imports[])
+{
+ for (int i = 0; imports[i]; i++) {
+ PyObject *name = PyUnicode_FromString(imports[i]);
+ PyObject *mod = PyImport_ImportModuleLevelObject(name, NULL, NULL, 0, 0);
+ bool ok = false;
+ if (mod) {
+ PyDict_SetItem(py_dict, name, mod);
+ ok = true;
+ Py_DECREF(mod);
+ }
+ Py_DECREF(name);
+
+ if (!ok) {
+ return false;
+ }
+ }
+ return true;
+}
+
/* restore MUST be called after this */
void PyC_MainModule_Backup(PyObject **main_mod)
{
@@ -1076,7 +1095,7 @@ PyObject *PyC_FlagSet_FromBitfield(PyC_FlagSet *items, int flag)
*
* \note it is caller's responsibility to acquire & release GIL!
*/
-bool PyC_RunString_AsNumber(const char *expr, const char *filename, double *r_value)
+bool PyC_RunString_AsNumber(const char *imports[], const char *expr, const char *filename, double *r_value)
{
PyObject *py_dict, *mod, *retval;
bool ok = true;
@@ -1096,9 +1115,10 @@ bool PyC_RunString_AsNumber(const char *expr, const char *filename, double *r_va
PyErr_Clear();
}
- retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict);
-
- if (retval == NULL) {
+ if (imports && (!PyC_NameSpace_ImportArray(py_dict, imports))) {
+ ok = false;
+ }
+ else if ((retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict)) == NULL) {
ok = false;
}
else {
@@ -1140,7 +1160,7 @@ bool PyC_RunString_AsNumber(const char *expr, const char *filename, double *r_va
return ok;
}
-bool PyC_RunString_AsIntPtr(const char *expr, const char *filename, intptr_t *r_value)
+bool PyC_RunString_AsIntPtr(const char *imports[], const char *expr, const char *filename, intptr_t *r_value)
{
PyObject *py_dict, *retval;
bool ok = true;
@@ -1150,9 +1170,10 @@ bool PyC_RunString_AsIntPtr(const char *expr, const char *filename, intptr_t *r_
py_dict = PyC_DefaultNameSpace(filename);
- retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict);
-
- if (retval == NULL) {
+ if (imports && (!PyC_NameSpace_ImportArray(py_dict, imports))) {
+ ok = false;
+ }
+ else if ((retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict)) == NULL) {
ok = false;
}
else {
@@ -1174,7 +1195,7 @@ bool PyC_RunString_AsIntPtr(const char *expr, const char *filename, intptr_t *r_
return ok;
}
-bool PyC_RunString_AsString(const char *expr, const char *filename, char **r_value)
+bool PyC_RunString_AsString(const char *imports[], const char *expr, const char *filename, char **r_value)
{
PyObject *py_dict, *retval;
bool ok = true;
@@ -1184,9 +1205,10 @@ bool PyC_RunString_AsString(const char *expr, const char *filename, char **r_val
py_dict = PyC_DefaultNameSpace(filename);
- retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict);
-
- if (retval == NULL) {
+ if (imports && (!PyC_NameSpace_ImportArray(py_dict, imports))) {
+ ok = false;
+ }
+ else if ((retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict)) == NULL) {
ok = false;
}
else {
@@ -1305,6 +1327,84 @@ uint32_t PyC_Long_AsU32(PyObject *value)
* PyC_Long_AsU64
*/
+/* -------------------------------------------------------------------- */
+
+/** \name Py_buffer Utils
+ *
+ * \{ */
+
+char PyC_StructFmt_type_from_str(const char *typestr)
+{
+ switch (typestr[0]) {
+ case '!':
+ case '<':
+ case '=':
+ case '>':
+ case '@':
+ return typestr[1];
+ default:
+ return typestr[0];
+ }
+}
+
+bool PyC_StructFmt_type_is_float_any(char format)
+{
+ switch (format) {
+ case 'f':
+ case 'd':
+ case 'e':
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool PyC_StructFmt_type_is_int_any(char format)
+{
+ switch (format) {
+ case 'i':
+ case 'I':
+ case 'l':
+ case 'L':
+ case 'h':
+ case 'H':
+ case 'b':
+ case 'B':
+ case 'q':
+ case 'Q':
+ case 'n':
+ case 'N':
+ case 'P':
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool PyC_StructFmt_type_is_byte(char format)
+{
+ switch (format) {
+ case 'c':
+ case 's':
+ case 'p':
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool PyC_StructFmt_type_is_bool(char format)
+{
+ switch (format) {
+ case '?':
+ return true;
+ default:
+ return false;
+ }
+}
+
+/** \} */
+
#ifdef __GNUC__
# pragma warning(pop)
#endif
diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h
index b962f40c180..21e4ecf2e86 100644
--- a/source/blender/python/generic/py_capi_utils.h
+++ b/source/blender/python/generic/py_capi_utils.h
@@ -30,19 +30,19 @@
#include "BLI_sys_types.h"
#include "BLI_utildefines_variadic.h"
-void PyC_ObSpit(const char *name, PyObject *var);
-void PyC_ObSpitStr(char *result, size_t result_len, PyObject *var);
-void PyC_LineSpit(void);
-void PyC_StackSpit(void);
-PyObject * PyC_ExceptionBuffer(void);
-PyObject * PyC_ExceptionBuffer_Simple(void);
-PyObject * PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...);
-PyObject * PyC_FrozenSetFromStrings(const char **strings);
-PyObject * PyC_Err_Format_Prefix(PyObject *exception_type_prefix, const char *format, ...);
-void PyC_Err_PrintWithFunc(PyObject *py_func);
-
-void PyC_FileAndNum(const char **filename, int *lineno);
-void PyC_FileAndNum_Safe(const char **filename, int *lineno); /* checks python is running */
+void PyC_ObSpit(const char *name, PyObject *var);
+void PyC_ObSpitStr(char *result, size_t result_len, PyObject *var);
+void PyC_LineSpit(void);
+void PyC_StackSpit(void);
+PyObject *PyC_ExceptionBuffer(void);
+PyObject *PyC_ExceptionBuffer_Simple(void);
+PyObject *PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...);
+PyObject *PyC_FrozenSetFromStrings(const char **strings);
+PyObject *PyC_Err_Format_Prefix(PyObject *exception_type_prefix, const char *format, ...);
+void PyC_Err_PrintWithFunc(PyObject *py_func);
+
+void PyC_FileAndNum(const char **filename, int *lineno);
+void PyC_FileAndNum_Safe(const char **filename, int *lineno); /* checks python is running */
int PyC_AsArray_FAST(
void *array, PyObject *value_fast, const Py_ssize_t length,
const PyTypeObject *type, const bool is_double, const char *error_prefix);
@@ -71,14 +71,15 @@ void PyC_Tuple_Fill(PyObject *tuple, PyObject *value);
void PyC_List_Fill(PyObject *list, PyObject *value);
/* follow http://www.python.org/dev/peps/pep-0383/ */
-PyObject * PyC_UnicodeFromByte(const char *str);
-PyObject * PyC_UnicodeFromByteAndSize(const char *str, Py_ssize_t size);
-const char * PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */
-const char * PyC_UnicodeAsByteAndSize(PyObject *py_str, Py_ssize_t *size, PyObject **coerce);
+PyObject *PyC_UnicodeFromByte(const char *str);
+PyObject *PyC_UnicodeFromByteAndSize(const char *str, Py_ssize_t size);
+const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */
+const char *PyC_UnicodeAsByteAndSize(PyObject *py_str, Py_ssize_t *size, PyObject **coerce);
/* name namespace function for bpy */
-PyObject * PyC_DefaultNameSpace(const char *filename);
-void PyC_RunQuicky(const char *filepath, int n, ...);
+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_Restore(PyObject *main_mod);
@@ -101,9 +102,9 @@ int PyC_FlagSet_ValueFromID(PyC_FlagSet *item, const char *identifier, int
int PyC_FlagSet_ToBitfield(PyC_FlagSet *items, PyObject *value, int *r_value, const char *error_prefix);
PyObject *PyC_FlagSet_FromBitfield(PyC_FlagSet *items, int flag);
-bool PyC_RunString_AsNumber(const char *expr, const char *filename, double *r_value);
-bool PyC_RunString_AsIntPtr(const char *expr, const char *filename, intptr_t *r_value);
-bool PyC_RunString_AsString(const char *expr, const char *filename, char **r_value);
+bool PyC_RunString_AsNumber(const char **imports, const char *expr, const char *filename, double *r_value);
+bool PyC_RunString_AsIntPtr(const char **imports, const char *expr, const char *filename, intptr_t *r_value);
+bool PyC_RunString_AsString(const char **imports, const char *expr, const char *filename, char **r_value);
int PyC_ParseBool(PyObject *o, void *p);
@@ -130,4 +131,11 @@ Py_LOCAL_INLINE(int32_t) PyC_Long_AsI32(PyObject *value) { return (int32_t)_PyL
Py_LOCAL_INLINE(int64_t) PyC_Long_AsI64(PyObject *value) { return (int64_t)PyLong_AsLongLong(value); }
Py_LOCAL_INLINE(uint64_t) PyC_Long_AsU64(PyObject *value) { return (uint64_t)PyLong_AsUnsignedLongLong(value); }
+/* utils for format string in `struct` module style syntax */
+char PyC_StructFmt_type_from_str(const char *typestr);
+bool PyC_StructFmt_type_is_float_any(char format);
+bool PyC_StructFmt_type_is_int_any(char format);
+bool PyC_StructFmt_type_is_byte(char format);
+bool PyC_StructFmt_type_is_bool(char format);
+
#endif /* __PY_CAPI_UTILS_H__ */
diff --git a/source/blender/python/gpu/CMakeLists.txt b/source/blender/python/gpu/CMakeLists.txt
index 141a36bbcc2..0d4dedf7c76 100644
--- a/source/blender/python/gpu/CMakeLists.txt
+++ b/source/blender/python/gpu/CMakeLists.txt
@@ -35,10 +35,28 @@ set(INC_SYS
set(SRC
gpu_py_api.c
+ gpu_py_batch.c
+ gpu_py_element.c
+ gpu_py_matrix.c
+ gpu_py_offscreen.c
+ gpu_py_primitive.c
+ gpu_py_select.c
+ gpu_py_shader.c
gpu_py_types.c
+ gpu_py_vertex_buffer.c
+ gpu_py_vertex_format.c
gpu_py_api.h
+ gpu_py_batch.h
+ gpu_py_element.h
+ gpu_py_matrix.h
+ gpu_py_offscreen.h
+ gpu_py_primitive.h
+ gpu_py_select.h
+ gpu_py_shader.h
gpu_py_types.h
+ gpu_py_vertex_buffer.h
+ gpu_py_vertex_format.h
)
add_definitions(${GL_DEFINITIONS})
diff --git a/source/blender/python/gpu/gpu_py_api.c b/source/blender/python/gpu/gpu_py_api.c
index 53285b372d8..3fad5425a6c 100644
--- a/source/blender/python/gpu/gpu_py_api.c
+++ b/source/blender/python/gpu/gpu_py_api.c
@@ -19,45 +19,67 @@
*/
/** \file blender/python/gpu/gpu_py_api.c
- * \ingroup pygpu
+ * \ingroup bpygpu
*
* Experimental Python API, not considered public yet (called '_gpu'),
* we may re-expose as public later.
+ *
+ * - Use ``bpygpu_`` for local API.
+ * - Use ``BPyGPU`` for public API.
*/
#include <Python.h>
-#include "GPU_batch.h"
-#include "GPU_vertex_format.h"
-
-#include "gpu_py_api.h"
-#include "gpu_py_types.h"
-
#include "BLI_utildefines.h"
#include "../generic/python_utildefines.h"
+#include "gpu_py_matrix.h"
+#include "gpu_py_select.h"
+#include "gpu_py_types.h"
+
+#include "gpu_py_api.h" /* own include */
+
PyDoc_STRVAR(GPU_doc,
-"This module provides access to gpu drawing functions."
+"This module provides Python wrappers for the GPU implementation in Blender. "
+"Some higher level functions can be found in the `gpu_extras` module. "
+"\n\n"
+"Submodules:\n"
+"\n"
+".. toctree::\n"
+" :maxdepth: 1\n"
+"\n"
+" gpu.types.rst\n"
+" gpu.matrix.rst\n"
+" gpu.select.rst\n"
+" gpu.shader.rst\n"
+"\n"
);
static struct PyModuleDef GPU_module_def = {
PyModuleDef_HEAD_INIT,
- .m_name = "_gpu", /* m_name */
- .m_doc = GPU_doc, /* m_doc */
+ .m_name = "gpu",
+ .m_doc = GPU_doc,
};
PyObject *BPyInit_gpu(void)
{
- PyObject *sys_modules = PyThreadState_GET()->interp->modules;
+ PyObject *sys_modules = PyImport_GetModuleDict();
PyObject *submodule;
PyObject *mod;
mod = PyModule_Create(&GPU_module_def);
- /* _gpu.types */
PyModule_AddObject(mod, "types", (submodule = BPyInit_gpu_types()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
+
+ PyModule_AddObject(mod, "matrix", (submodule = BPyInit_gpu_matrix()));
+ PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
+
+ PyModule_AddObject(mod, "select", (submodule = BPyInit_gpu_select()));
+ PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
+
+ PyModule_AddObject(mod, "shader", (submodule = BPyInit_gpu_shader()));
+ 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 387bfcab950..20eafb3d140 100644
--- a/source/blender/python/gpu/gpu_py_api.h
+++ b/source/blender/python/gpu/gpu_py_api.h
@@ -18,13 +18,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef __GPU_PY_API_H__
-#define __GPU_PY_API_H__
-
/** \file blender/python/gpu/gpu_py_api.h
- * \ingroup pygpu
+ * \ingroup bpygpu
*/
+#ifndef __GPU_PY_API_H__
+#define __GPU_PY_API_H__
+
PyObject *BPyInit_gpu(void);
#endif /* __GPU_PY_API_H__ */
diff --git a/source/blender/python/gpu/gpu_py_batch.c b/source/blender/python/gpu/gpu_py_batch.c
new file mode 100644
index 00000000000..b3bdf663621
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_batch.c
@@ -0,0 +1,368 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2015, Blender Foundation.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/gpu/gpu_py_batch.c
+ * \ingroup bpygpu
+ *
+ * This file defines the offscreen 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 "MEM_guardedalloc.h"
+
+#include "BLI_utildefines.h"
+
+#include "BKE_global.h"
+
+#include "GPU_batch.h"
+
+#include "../mathutils/mathutils.h"
+
+#include "../generic/py_capi_utils.h"
+
+#include "gpu_py_primitive.h"
+#include "gpu_py_shader.h"
+#include "gpu_py_vertex_buffer.h"
+#include "gpu_py_element.h"
+#include "gpu_py_batch.h" /* own include */
+
+
+/* -------------------------------------------------------------------- */
+/** \name Utility Functions
+ * \{ */
+
+static bool bpygpu_batch_is_program_or_error(BPyGPUBatch *self)
+{
+ if (!glIsProgram(self->batch->program)) {
+ PyErr_SetString(
+ PyExc_RuntimeError,
+ "batch does not have any program assigned to it");
+ return false;
+ }
+ return true;
+}
+
+/** \} */
+
+
+/* -------------------------------------------------------------------- */
+/** \name GPUBatch Type
+ * \{ */
+
+static PyObject *bpygpu_Batch_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
+{
+ 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};
+
+ 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,
+ &BPyGPUVertBuf_Type, &params.py_vertbuf,
+ &BPyGPUIndexBuf_Type, &params.py_indexbuf))
+ {
+ return NULL;
+ }
+
+ if (params.type_id == GPU_PRIM_NONE) {
+ PyErr_Format(PyExc_TypeError,
+ exc_str_missing_arg, _keywords[0], 1);
+ return NULL;
+ }
+
+ if (params.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);
+
+ 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);
+
+ if (params.py_indexbuf != NULL) {
+ PyList_SET_ITEM(ret->references, 1, (PyObject *)params.py_indexbuf);
+ Py_INCREF(params.py_indexbuf);
+ }
+
+ PyObject_GC_Track(ret);
+#endif
+
+ return (PyObject *)ret;
+}
+
+PyDoc_STRVAR(bpygpu_Batch_vertbuf_add_doc,
+"TODO"
+);
+static PyObject *bpygpu_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);
+ return NULL;
+ }
+
+ if (self->batch->verts[0]->vertex_len != py_buf->buf->vertex_len) {
+ PyErr_Format(PyExc_TypeError,
+ "Expected %d length, got %d",
+ self->batch->verts[0]->vertex_len, py_buf->buf->vertex_len);
+ return NULL;
+ }
+
+ if (self->batch->verts[GPU_BATCH_VBO_MAX_LEN - 1] != NULL) {
+ PyErr_SetString(
+ PyExc_RuntimeError,
+ "Maximum number of vertex buffers exceeded: " STRINGIFY(GPU_BATCH_VBO_MAX_LEN));
+ return NULL;
+ }
+
+#ifdef USE_GPU_PY_REFERENCES
+ /* Hold user */
+ PyList_Append(self->references, (PyObject *)py_buf);
+#endif
+
+ GPU_batch_vertbuf_add(self->batch, py_buf->buf);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(bpygpu_Batch_program_set_doc,
+"TODO"
+);
+static PyObject *bpygpu_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);
+ return NULL;
+ }
+
+ GPUShader *shader = py_shader->shader;
+ GPU_batch_program_set(
+ self->batch,
+ GPU_shader_get_program(shader),
+ GPU_shader_get_interface(shader));
+
+#ifdef USE_GPU_PY_REFERENCES
+ /* Remove existing user (if any), hold new user. */
+ int i = PyList_GET_SIZE(self->references);
+ while (--i != -1) {
+ PyObject *py_shader_test = PyList_GET_ITEM(self->references, i);
+ if (BPyGPUShader_Check(py_shader_test)) {
+ PyList_SET_ITEM(self->references, i, (PyObject *)py_shader);
+ Py_INCREF(py_shader);
+ Py_DECREF(py_shader_test);
+ /* Only ever reference one shader. */
+ break;
+ }
+ }
+ if (i != -1) {
+ PyList_Append(self->references, (PyObject *)py_shader);
+ }
+#endif
+
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(bpygpu_Batch_draw_doc,
+".. method:: draw(program=None)\n"
+"\n"
+" Run the drawing program with the parameters assigned to the batch.\n"
+"\n"
+" :param program: program that performs the drawing operations. \n"
+" If ``None`` is passed, the last program setted to this batch will run.\n"
+" :type program: :class:`gpu.types.GPUShader`\n"
+);
+static PyObject *bpygpu_Batch_draw(BPyGPUBatch *self, PyObject *args)
+{
+ BPyGPUShader *py_program = NULL;
+
+ if (!PyArg_ParseTuple(
+ args, "|O!:GPUBatch.draw",
+ &BPyGPUShader_Type, &py_program))
+ {
+ return NULL;
+ }
+ else if (py_program == NULL) {
+ if (!bpygpu_batch_is_program_or_error(self)) {
+ return NULL;
+ }
+ }
+ else if (self->batch->program != GPU_shader_get_program(py_program->shader)) {
+ GPU_batch_program_set(
+ self->batch,
+ GPU_shader_get_program(py_program->shader),
+ GPU_shader_get_interface(py_program->shader));
+ }
+
+ GPU_batch_draw(self->batch);
+ Py_RETURN_NONE;
+}
+
+static PyObject *bpygpu_Batch_program_use_begin(BPyGPUBatch *self)
+{
+ if (!bpygpu_batch_is_program_or_error(self)) {
+ return NULL;
+ }
+ GPU_batch_program_use_begin(self->batch);
+ Py_RETURN_NONE;
+}
+
+static PyObject *bpygpu_Batch_program_use_end(BPyGPUBatch *self)
+{
+ if (!bpygpu_batch_is_program_or_error(self)) {
+ return NULL;
+ }
+ GPU_batch_program_use_end(self->batch);
+ Py_RETURN_NONE;
+}
+
+static struct PyMethodDef bpygpu_Batch_methods[] = {
+ {"vertbuf_add", (PyCFunction)bpygpu_Batch_vertbuf_add,
+ METH_O, bpygpu_Batch_vertbuf_add_doc},
+ {"program_set", (PyCFunction)bpygpu_Batch_program_set,
+ METH_O, bpygpu_Batch_program_set_doc},
+ {"draw", (PyCFunction) bpygpu_Batch_draw,
+ METH_VARARGS, bpygpu_Batch_draw_doc},
+ {"_program_use_begin", (PyCFunction)bpygpu_Batch_program_use_begin,
+ METH_NOARGS, ""},
+ {"_program_use_end", (PyCFunction)bpygpu_Batch_program_use_end,
+ METH_NOARGS, ""},
+ {NULL, NULL, 0, NULL}
+};
+
+#ifdef USE_GPU_PY_REFERENCES
+
+static int bpygpu_Batch_traverse(BPyGPUBatch *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->references);
+ return 0;
+}
+
+static int bpygpu_Batch_clear(BPyGPUBatch *self)
+{
+ Py_CLEAR(self->references);
+ return 0;
+}
+
+#endif
+
+static void bpygpu_Batch_dealloc(BPyGPUBatch *self)
+{
+ GPU_batch_discard(self->batch);
+
+#ifdef USE_GPU_PY_REFERENCES
+ if (self->references) {
+ PyObject_GC_UnTrack(self);
+ bpygpu_Batch_clear(self);
+ Py_XDECREF(self->references);
+ }
+#endif
+
+ Py_TYPE(self)->tp_free(self);
+}
+
+PyDoc_STRVAR(py_gpu_batch_doc,
+"GPUBatch(type, buf, elem=None)\n"
+"\n"
+"Contains VAOs + VBOs + Shader representing a drawable entity."
+"\n"
+" :param type: One of these primitive types: {\n"
+" 'POINTS',\n"
+" 'LINES',\n"
+" 'TRIS',\n"
+" 'LINE_STRIP',\n"
+" 'LINE_LOOP',\n"
+" 'TRI_STRIP',\n"
+" 'TRI_FAN',\n"
+" 'LINES_ADJ',\n"
+" 'TRIS_ADJ',\n"
+" 'LINE_STRIP_ADJ'}\n"
+" :type type: `str`\n"
+" :param buf: Vertex buffer.\n"
+" :type buf: :class: `gpu.types.GPUVertBuf`\n"
+" :param elem: Optional Index buffer.\n"
+" :type elem: :class: `gpu.types.GPUIndexBuf`\n"
+);
+PyTypeObject BPyGPUBatch_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = "GPUBatch",
+ .tp_basicsize = sizeof(BPyGPUBatch),
+ .tp_dealloc = (destructor)bpygpu_Batch_dealloc,
+#ifdef USE_GPU_PY_REFERENCES
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
+ .tp_doc = py_gpu_batch_doc,
+ .tp_traverse = (traverseproc)bpygpu_Batch_traverse,
+ .tp_clear = (inquiry)bpygpu_Batch_clear,
+#else
+ .tp_flags = Py_TPFLAGS_DEFAULT,
+#endif
+ .tp_methods = bpygpu_Batch_methods,
+ .tp_new = bpygpu_Batch_new,
+};
+
+/** \} */
+
+
+/* -------------------------------------------------------------------- */
+/** \name Public API
+* \{ */
+
+PyObject *BPyGPUBatch_CreatePyObject(GPUBatch *batch)
+{
+ BPyGPUBatch *self;
+
+#ifdef USE_GPU_PY_REFERENCES
+ self = (BPyGPUBatch *)_PyObject_GC_New(&BPyGPUBatch_Type);
+ self->references = NULL;
+#else
+ self = PyObject_New(BPyGPUBatch, &BPyGPUBatch_Type);
+#endif
+
+ self->batch = batch;
+
+ return (PyObject *)self;
+}
+
+/** \} */
+
+#undef BPY_GPU_BATCH_CHECK_OBJ
diff --git a/source/blender/python/gpu/gpu_py_batch.h b/source/blender/python/gpu/gpu_py_batch.h
new file mode 100644
index 00000000000..c77574428db
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_batch.h
@@ -0,0 +1,48 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/gpu/gpu_py_batch.h
+ * \ingroup bpygpu
+ */
+
+#ifndef __GPU_PY_BATCH_H__
+#define __GPU_PY_BATCH_H__
+
+#include "BLI_compiler_attrs.h"
+
+#define USE_GPU_PY_REFERENCES
+
+extern PyTypeObject BPyGPUBatch_Type;
+
+#define BPyGPUBatch_Check(v) (Py_TYPE(v) == &BPyGPUBatch_Type)
+
+typedef struct BPyGPUBatch {
+ PyObject_VAR_HEAD
+ /* The batch is owned, we may support thin wrapped batches later. */
+ struct GPUBatch *batch;
+#ifdef USE_GPU_PY_REFERENCES
+ /* Just to keep a user to prevent freeing buf's we're using */
+ PyObject *references;
+#endif
+} BPyGPUBatch;
+
+PyObject *BPyGPUBatch_CreatePyObject(struct GPUBatch *batch) ATTR_NONNULL(1);
+
+#endif /* __GPU_PY_BATCH_H__ */
diff --git a/source/blender/python/gpu/gpu_py_element.c b/source/blender/python/gpu/gpu_py_element.c
new file mode 100644
index 00000000000..2462c222146
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_element.c
@@ -0,0 +1,241 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/gpu/gpu_py_element.c
+ * \ingroup bpygpu
+ *
+ * - Use ``bpygpu_`` for local API.
+ * - Use ``BPyGPU`` for public API.
+ */
+
+#include <Python.h>
+
+#include "GPU_element.h"
+
+#include "BLI_math.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "../generic/py_capi_utils.h"
+#include "../generic/python_utildefines.h"
+
+#include "gpu_py_primitive.h"
+#include "gpu_py_element.h" /* own include */
+
+
+/* -------------------------------------------------------------------- */
+
+/** \name IndexBuf Type
+ * \{ */
+
+static PyObject *bpygpu_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
+{
+ const char *error_prefix = "IndexBuf.__new__";
+ bool ok = true;
+
+ struct {
+ GPUPrimType type_id;
+ PyObject *seq;
+ } params;
+
+ uint verts_per_prim;
+ uint index_len;
+ GPUIndexBufBuilder builder;
+
+ 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))
+ {
+ return NULL;
+ }
+
+ verts_per_prim = GPU_indexbuf_primitive_len(params.type_id);
+ if (verts_per_prim == -1) {
+ PyErr_Format(PyExc_ValueError,
+ "The argument 'type' must be "
+ "'POINTS', 'LINES', 'TRIS' or 'LINES_ADJ'");
+ return NULL;
+ }
+
+ if (PyObject_CheckBuffer(params.seq)) {
+ Py_buffer pybuffer;
+
+ if (PyObject_GetBuffer(params.seq, &pybuffer, PyBUF_FORMAT | PyBUF_ND) == -1) {
+ /* PyObject_GetBuffer already handles error messages. */
+ return NULL;
+ }
+
+ if (pybuffer.ndim != 1 && pybuffer.shape[1] != verts_per_prim) {
+ PyErr_Format(PyExc_ValueError,
+ "Each primitive must exactly %d indices",
+ verts_per_prim);
+ return NULL;
+ }
+
+ if (pybuffer.itemsize != 4 ||
+ PyC_StructFmt_type_is_float_any(PyC_StructFmt_type_from_str(pybuffer.format)))
+ {
+ PyErr_Format(PyExc_ValueError,
+ "Each index must be an 4-bytes integer value");
+ return NULL;
+ }
+
+ index_len = pybuffer.shape[0];
+ if (pybuffer.ndim != 1) {
+ index_len *= pybuffer.shape[1];
+ }
+
+ /* 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);
+
+#if 0
+ uint *buf = pybuffer.buf;
+ for (uint i = index_len; i--; buf++) {
+ GPU_indexbuf_add_generic_vert(&builder, *buf);
+ }
+#else
+ memcpy(builder.data, pybuffer.buf, index_len * sizeof(*builder.data));
+ builder.index_len = index_len;
+#endif
+ PyBuffer_Release(&pybuffer);
+ }
+ else {
+ PyObject *seq_fast = PySequence_Fast(params.seq, error_prefix);
+
+ if (seq_fast == NULL) {
+ return false;
+ }
+
+ const uint seq_len = PySequence_Fast_GET_SIZE(seq_fast);
+
+ PyObject **seq_items = PySequence_Fast_ITEMS(seq_fast);
+
+ index_len = seq_len * verts_per_prim;
+
+ /* 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);
+
+ if (verts_per_prim == 1) {
+ for (uint i = 0; i < seq_len; i++) {
+ GPU_indexbuf_add_generic_vert(
+ &builder, PyC_Long_AsU32(seq_items[i]));
+ }
+ }
+ else {
+ int values[4];
+ for (uint i = 0; i < seq_len; i++) {
+ PyObject *seq_fast_item = PySequence_Fast(seq_items[i], error_prefix);
+ if (seq_fast_item == NULL) {
+ PyErr_Format(PyExc_TypeError,
+ "%s: expected a sequence, got %s",
+ error_prefix, Py_TYPE(seq_items[i])->tp_name);
+ ok = false;
+ goto finally;
+ }
+
+ ok = PyC_AsArray_FAST(
+ values, seq_fast_item, verts_per_prim,
+ &PyLong_Type, false, error_prefix) == 0;
+
+ if (ok) {
+ for (uint j = 0; j < verts_per_prim; j++) {
+ GPU_indexbuf_add_generic_vert(&builder, values[j]);
+ }
+ }
+ Py_DECREF(seq_fast_item);
+ }
+ }
+
+ if (PyErr_Occurred()) {
+ ok = false;
+ }
+
+finally:
+
+ Py_DECREF(seq_fast);
+ }
+
+ if (ok == false) {
+ MEM_freeN(builder.data);
+ return NULL;
+ }
+
+ return BPyGPUIndexBuf_CreatePyObject(GPU_indexbuf_build(&builder));
+}
+
+static void bpygpu_IndexBuf_dealloc(BPyGPUIndexBuf *self)
+{
+ GPU_indexbuf_discard(self->elem);
+ Py_TYPE(self)->tp_free(self);
+}
+
+PyDoc_STRVAR(py_gpu_element_doc,
+"GPUIndexBuf(type, seq)\n"
+"\n"
+"Contains a VBO."
+"\n"
+" :param prim_type:\n"
+" One of these primitive types: {\n"
+" 'POINTS',\n"
+" 'LINES',\n"
+" 'TRIS',\n"
+" 'LINE_STRIP_ADJ'}\n"
+" :type type: `str`\n"
+" :param seq: Sequence of integers.\n"
+" :type buf: `Any 1D or 2D Sequence`\n"
+);
+PyTypeObject BPyGPUIndexBuf_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = "GPUIndexBuf",
+ .tp_basicsize = sizeof(BPyGPUIndexBuf),
+ .tp_dealloc = (destructor)bpygpu_IndexBuf_dealloc,
+ .tp_flags = Py_TPFLAGS_DEFAULT,
+ .tp_doc = py_gpu_element_doc,
+ .tp_new = bpygpu_IndexBuf_new,
+};
+
+/** \} */
+
+
+/* -------------------------------------------------------------------- */
+
+/** \name Public API
+ * \{ */
+
+PyObject *BPyGPUIndexBuf_CreatePyObject(GPUIndexBuf *elem)
+{
+ BPyGPUIndexBuf *self;
+
+ self = PyObject_New(BPyGPUIndexBuf, &BPyGPUIndexBuf_Type);
+ self->elem = elem;
+
+ return (PyObject *)self;
+}
+
+/** \} */
diff --git a/source/blender/python/gpu/gpu_py_element.h b/source/blender/python/gpu/gpu_py_element.h
new file mode 100644
index 00000000000..e201a767582
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_element.h
@@ -0,0 +1,39 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/gpu/gpu_py_element.h
+ * \ingroup bpygpu
+ */
+
+#ifndef __GPU_PY_ELEMENT_H__
+#define __GPU_PY_ELEMENT_H__
+
+extern PyTypeObject BPyGPUIndexBuf_Type;
+
+#define BPyGPUIndexBuf_Check(v) (Py_TYPE(v) == &BPyGPUIndexBuf_Type)
+
+typedef struct BPyGPUIndexBuf {
+ PyObject_VAR_HEAD
+ struct GPUIndexBuf *elem;
+} BPyGPUIndexBuf;
+
+PyObject *BPyGPUIndexBuf_CreatePyObject(struct GPUIndexBuf *elem);
+
+#endif /* __GPU_PY_ELEMENT_H__ */
diff --git a/source/blender/python/intern/gpu_py_matrix.c b/source/blender/python/gpu/gpu_py_matrix.c
index 2ab6fd864eb..7fd40767fb1 100644
--- a/source/blender/python/intern/gpu_py_matrix.c
+++ b/source/blender/python/gpu/gpu_py_matrix.c
@@ -18,13 +18,16 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/python/intern/gpu_py_matrix.c
- * \ingroup pythonintern
+/** \file blender/python/gpu/gpu_py_matrix.c
+ * \ingroup bpygpu
*
* This file defines the gpu.matrix stack API.
*
* \warning While these functions attempt to ensure correct stack usage.
* Mixing Python and C functions may still crash on invalid use.
+ *
+ * - Use ``bpygpu_`` for local API.
+ * - Use ``BPyGPU`` for public API.
*/
#include <Python.h>
@@ -36,17 +39,17 @@
#include "../generic/py_capi_utils.h"
-#include "gpu.h"
-
#define USE_GPU_PY_MATRIX_API
#include "GPU_matrix.h"
#undef USE_GPU_PY_MATRIX_API
+#include "gpu_py_matrix.h" /* own include */
+
/* -------------------------------------------------------------------- */
/** \name Helper Functions
* \{ */
-static bool pygpu_stack_is_push_model_view_ok_or_error(void)
+static bool bpygpu_stack_is_push_model_view_ok_or_error(void)
{
if (GPU_matrix_stack_level_get_model_view() >= GPU_PY_MATRIX_STACK_LEN) {
PyErr_SetString(PyExc_RuntimeError,
@@ -56,7 +59,7 @@ static bool pygpu_stack_is_push_model_view_ok_or_error(void)
return true;
}
-static bool pygpu_stack_is_push_projection_ok_or_error(void)
+static bool bpygpu_stack_is_push_projection_ok_or_error(void)
{
if (GPU_matrix_stack_level_get_projection() >= GPU_PY_MATRIX_STACK_LEN) {
PyErr_SetString(PyExc_RuntimeError,
@@ -66,7 +69,7 @@ static bool pygpu_stack_is_push_projection_ok_or_error(void)
return true;
}
-static bool pygpu_stack_is_pop_model_view_ok_or_error(void)
+static bool bpygpu_stack_is_pop_model_view_ok_or_error(void)
{
if (GPU_matrix_stack_level_get_model_view() == 0) {
PyErr_SetString(PyExc_RuntimeError,
@@ -76,7 +79,7 @@ static bool pygpu_stack_is_pop_model_view_ok_or_error(void)
return true;
}
-static bool pygpu_stack_is_pop_projection_ok_or_error(void)
+static bool bpygpu_stack_is_pop_projection_ok_or_error(void)
{
if (GPU_matrix_stack_level_get_projection() == 0) {
PyErr_SetString(PyExc_RuntimeError,
@@ -92,56 +95,56 @@ static bool pygpu_stack_is_pop_projection_ok_or_error(void)
/** \name Manage Stack
* \{ */
-PyDoc_STRVAR(pygpu_matrix_push_doc,
+PyDoc_STRVAR(bpygpu_matrix_push_doc,
"push()\n"
"\n"
" Add to the model-view matrix stack.\n"
);
-static PyObject *pygpu_matrix_push(PyObject *UNUSED(self))
+static PyObject *bpygpu_matrix_push(PyObject *UNUSED(self))
{
- if (!pygpu_stack_is_push_model_view_ok_or_error()) {
+ if (!bpygpu_stack_is_push_model_view_ok_or_error()) {
return NULL;
}
GPU_matrix_push();
Py_RETURN_NONE;
}
-PyDoc_STRVAR(pygpu_matrix_pop_doc,
+PyDoc_STRVAR(bpygpu_matrix_pop_doc,
"pop()\n"
"\n"
" Remove the last model-view matrix from the stack.\n"
);
-static PyObject *pygpu_matrix_pop(PyObject *UNUSED(self))
+static PyObject *bpygpu_matrix_pop(PyObject *UNUSED(self))
{
- if (!pygpu_stack_is_pop_model_view_ok_or_error()) {
+ if (!bpygpu_stack_is_pop_model_view_ok_or_error()) {
return NULL;
}
GPU_matrix_pop();
Py_RETURN_NONE;
}
-PyDoc_STRVAR(pygpu_matrix_push_projection_doc,
+PyDoc_STRVAR(bpygpu_matrix_push_projection_doc,
"push_projection()\n"
"\n"
" Add to the projection matrix stack.\n"
);
-static PyObject *pygpu_matrix_push_projection(PyObject *UNUSED(self))
+static PyObject *bpygpu_matrix_push_projection(PyObject *UNUSED(self))
{
- if (!pygpu_stack_is_push_projection_ok_or_error()) {
+ if (!bpygpu_stack_is_push_projection_ok_or_error()) {
return NULL;
}
GPU_matrix_push_projection();
Py_RETURN_NONE;
}
-PyDoc_STRVAR(pygpu_matrix_pop_projection_doc,
+PyDoc_STRVAR(bpygpu_matrix_pop_projection_doc,
"pop_projection()\n"
"\n"
" Remove the last projection matrix from the stack.\n"
);
-static PyObject *pygpu_matrix_pop_projection(PyObject *UNUSED(self))
+static PyObject *bpygpu_matrix_pop_projection(PyObject *UNUSED(self))
{
- if (!pygpu_stack_is_pop_projection_ok_or_error()) {
+ if (!bpygpu_stack_is_pop_projection_ok_or_error()) {
return NULL;
}
GPU_matrix_pop_projection();
@@ -161,31 +164,31 @@ typedef struct {
PyObject_HEAD /* required python macro */
int type;
int level;
-} BPy_GPU_MatrixStackContext;
+} BPyGPU_MatrixStackContext;
enum {
PYGPU_MATRIX_TYPE_MODEL_VIEW = 1,
PYGPU_MATRIX_TYPE_PROJECTION = 2,
};
-static PyObject *pygpu_matrix_stack_context_enter(BPy_GPU_MatrixStackContext *self);
-static PyObject *pygpu_matrix_stack_context_exit(BPy_GPU_MatrixStackContext *self, PyObject *args);
+static PyObject *bpygpu_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self);
+static PyObject *bpygpu_matrix_stack_context_exit(BPyGPU_MatrixStackContext *self, PyObject *args);
-static PyMethodDef pygpu_matrix_stack_context_methods[] = {
- {"__enter__", (PyCFunction)pygpu_matrix_stack_context_enter, METH_NOARGS},
- {"__exit__", (PyCFunction)pygpu_matrix_stack_context_exit, METH_VARARGS},
+static PyMethodDef bpygpu_matrix_stack_context_methods[] = {
+ {"__enter__", (PyCFunction)bpygpu_matrix_stack_context_enter, METH_NOARGS},
+ {"__exit__", (PyCFunction)bpygpu_matrix_stack_context_exit, METH_VARARGS},
{NULL}
};
-static PyTypeObject pygpu_matrix_stack_context_Type = {
+static PyTypeObject BPyGPU_matrix_stack_context_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "GPUMatrixStackContext",
- .tp_basicsize = sizeof(BPy_GPU_MatrixStackContext),
+ .tp_basicsize = sizeof(BPyGPU_MatrixStackContext),
.tp_flags = Py_TPFLAGS_DEFAULT,
- .tp_methods = pygpu_matrix_stack_context_methods,
+ .tp_methods = bpygpu_matrix_stack_context_methods,
};
-static PyObject *pygpu_matrix_stack_context_enter(BPy_GPU_MatrixStackContext *self)
+static PyObject *bpygpu_matrix_stack_context_enter(BPyGPU_MatrixStackContext *self)
{
/* sanity - should never happen */
if (self->level != -1) {
@@ -194,14 +197,14 @@ static PyObject *pygpu_matrix_stack_context_enter(BPy_GPU_MatrixStackContext *se
}
if (self->type == PYGPU_MATRIX_TYPE_MODEL_VIEW) {
- if (!pygpu_stack_is_push_model_view_ok_or_error()) {
+ if (!bpygpu_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 (!pygpu_stack_is_push_projection_ok_or_error()) {
+ if (!bpygpu_stack_is_push_projection_ok_or_error()) {
return NULL;
}
GPU_matrix_push_projection();
@@ -213,7 +216,7 @@ static PyObject *pygpu_matrix_stack_context_enter(BPy_GPU_MatrixStackContext *se
Py_RETURN_NONE;
}
-static PyObject *pygpu_matrix_stack_context_exit(BPy_GPU_MatrixStackContext *self, PyObject *UNUSED(args))
+static PyObject *bpygpu_matrix_stack_context_exit(BPyGPU_MatrixStackContext *self, PyObject *UNUSED(args))
{
/* sanity - should never happen */
if (self->level == -1) {
@@ -246,32 +249,32 @@ finally:
Py_RETURN_NONE;
}
-static PyObject *pygpu_matrix_push_pop_impl(int type)
+static PyObject *bpygpu_matrix_push_pop_impl(int type)
{
- BPy_GPU_MatrixStackContext *ret = PyObject_New(BPy_GPU_MatrixStackContext, &pygpu_matrix_stack_context_Type);
+ BPyGPU_MatrixStackContext *ret = PyObject_New(BPyGPU_MatrixStackContext, &BPyGPU_matrix_stack_context_Type);
ret->type = type;
ret->level = -1;
return (PyObject *)ret;
}
-PyDoc_STRVAR(pygpu_matrix_push_pop_doc,
+PyDoc_STRVAR(bpygpu_matrix_push_pop_doc,
"push_pop()\n"
"\n"
" Context manager to ensure balanced push/pop calls, even in the case of an error.\n"
);
-static PyObject *pygpu_matrix_push_pop(PyObject *UNUSED(self))
+static PyObject *bpygpu_matrix_push_pop(PyObject *UNUSED(self))
{
- return pygpu_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_MODEL_VIEW);
+ return bpygpu_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_MODEL_VIEW);
}
-PyDoc_STRVAR(pygpu_matrix_push_pop_projection_doc,
+PyDoc_STRVAR(bpygpu_matrix_push_pop_projection_doc,
"push_pop_projection()\n"
"\n"
" Context manager to ensure balanced push/pop calls, even in the case of an error.\n"
);
-static PyObject *pygpu_matrix_push_pop_projection(PyObject *UNUSED(self))
+static PyObject *bpygpu_matrix_push_pop_projection(PyObject *UNUSED(self))
{
- return pygpu_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_PROJECTION);
+ return bpygpu_matrix_push_pop_impl(PYGPU_MATRIX_TYPE_PROJECTION);
}
/** \} */
@@ -280,7 +283,7 @@ static PyObject *pygpu_matrix_push_pop_projection(PyObject *UNUSED(self))
/** \name Manipulate State
* \{ */
-PyDoc_STRVAR(pygpu_matrix_multiply_matrix_doc,
+PyDoc_STRVAR(bpygpu_matrix_multiply_matrix_doc,
"multiply_matrix(matrix)\n"
"\n"
" Multiply the current stack matrix.\n"
@@ -288,7 +291,7 @@ PyDoc_STRVAR(pygpu_matrix_multiply_matrix_doc,
" :param matrix: A 4x4 matrix.\n"
" :type matrix: :class:`mathutils.Matrix`\n"
);
-static PyObject *pygpu_matrix_multiply_matrix(PyObject *UNUSED(self), PyObject *value)
+static PyObject *bpygpu_matrix_multiply_matrix(PyObject *UNUSED(self), PyObject *value)
{
MatrixObject *pymat;
if (!Matrix_Parse4x4(value, &pymat)) {
@@ -298,7 +301,7 @@ static PyObject *pygpu_matrix_multiply_matrix(PyObject *UNUSED(self), PyObject *
Py_RETURN_NONE;
}
-PyDoc_STRVAR(pygpu_matrix_scale_doc,
+PyDoc_STRVAR(bpygpu_matrix_scale_doc,
"scale(scale)\n"
"\n"
" Scale the current stack matrix.\n"
@@ -306,7 +309,7 @@ PyDoc_STRVAR(pygpu_matrix_scale_doc,
" :param scale: Scale the current stack matrix.\n"
" :type scale: sequence of 2 or 3 floats\n"
);
-static PyObject *pygpu_matrix_scale(PyObject *UNUSED(self), PyObject *value)
+static PyObject *bpygpu_matrix_scale(PyObject *UNUSED(self), PyObject *value)
{
float scale[3];
int len;
@@ -322,13 +325,13 @@ static PyObject *pygpu_matrix_scale(PyObject *UNUSED(self), PyObject *value)
Py_RETURN_NONE;
}
-PyDoc_STRVAR(pygpu_matrix_scale_uniform_doc,
+PyDoc_STRVAR(bpygpu_matrix_scale_uniform_doc,
"scale_uniform(scale)\n"
"\n"
" :param scale: Scale the current stack matrix.\n"
" :type scale: sequence of 2 or 3 floats\n"
);
-static PyObject *pygpu_matrix_scale_uniform(PyObject *UNUSED(self), PyObject *value)
+static PyObject *bpygpu_matrix_scale_uniform(PyObject *UNUSED(self), PyObject *value)
{
float scalar;
if ((scalar = PyFloat_AsDouble(value)) == -1.0f && PyErr_Occurred()) {
@@ -341,7 +344,7 @@ static PyObject *pygpu_matrix_scale_uniform(PyObject *UNUSED(self), PyObject *va
Py_RETURN_NONE;
}
-PyDoc_STRVAR(pygpu_matrix_translate_doc,
+PyDoc_STRVAR(bpygpu_matrix_translate_doc,
"translate(offset)\n"
"\n"
" Scale the current stack matrix.\n"
@@ -349,7 +352,7 @@ PyDoc_STRVAR(pygpu_matrix_translate_doc,
" :param offset: Translate the current stack matrix.\n"
" :type offset: sequence of 2 or 3 floats\n"
);
-static PyObject *pygpu_matrix_translate(PyObject *UNUSED(self), PyObject *value)
+static PyObject *bpygpu_matrix_translate(PyObject *UNUSED(self), PyObject *value)
{
float offset[3];
int len;
@@ -371,29 +374,29 @@ static PyObject *pygpu_matrix_translate(PyObject *UNUSED(self), PyObject *value)
/** \name Write State
* \{ */
-PyDoc_STRVAR(pygpu_matrix_reset_doc,
+PyDoc_STRVAR(bpygpu_matrix_reset_doc,
"reset()\n"
"\n"
" Empty stack and set to identity.\n"
);
-static PyObject *pygpu_matrix_reset(PyObject *UNUSED(self))
+static PyObject *bpygpu_matrix_reset(PyObject *UNUSED(self))
{
GPU_matrix_reset();
Py_RETURN_NONE;
}
-PyDoc_STRVAR(pygpu_matrix_load_identity_doc,
+PyDoc_STRVAR(bpygpu_matrix_load_identity_doc,
"load_identity()\n"
"\n"
" Empty stack and set to identity.\n"
);
-static PyObject *pygpu_matrix_load_identity(PyObject *UNUSED(self))
+static PyObject *bpygpu_matrix_load_identity(PyObject *UNUSED(self))
{
GPU_matrix_identity_set();
Py_RETURN_NONE;
}
-PyDoc_STRVAR(pygpu_matrix_load_matrix_doc,
+PyDoc_STRVAR(bpygpu_matrix_load_matrix_doc,
"load_matrix(matrix)\n"
"\n"
" Load a matrix into the stack.\n"
@@ -401,7 +404,7 @@ PyDoc_STRVAR(pygpu_matrix_load_matrix_doc,
" :param matrix: A 4x4 matrix.\n"
" :type matrix: :class:`mathutils.Matrix`\n"
);
-static PyObject *pygpu_matrix_load_matrix(PyObject *UNUSED(self), PyObject *value)
+static PyObject *bpygpu_matrix_load_matrix(PyObject *UNUSED(self), PyObject *value)
{
MatrixObject *pymat;
if (!Matrix_Parse4x4(value, &pymat)) {
@@ -411,13 +414,31 @@ static PyObject *pygpu_matrix_load_matrix(PyObject *UNUSED(self), PyObject *valu
Py_RETURN_NONE;
}
+PyDoc_STRVAR(bpygpu_matrix_load_projection_matrix_doc,
+"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 *bpygpu_matrix_load_projection_matrix(PyObject *UNUSED(self), PyObject *value)
+{
+ MatrixObject *pymat;
+ if (!Matrix_Parse4x4(value, &pymat)) {
+ return NULL;
+ }
+ GPU_matrix_projection_set(pymat->matrix);
+ Py_RETURN_NONE;
+}
+
/** \} */
/* -------------------------------------------------------------------- */
/** \name Read State
* \{ */
-PyDoc_STRVAR(pygpu_matrix_get_projection_matrix_doc,
+PyDoc_STRVAR(bpygpu_matrix_get_projection_matrix_doc,
"get_projection_matrix()\n"
"\n"
" Return a copy of the projection matrix.\n"
@@ -425,7 +446,7 @@ PyDoc_STRVAR(pygpu_matrix_get_projection_matrix_doc,
" :return: A 4x4 projection matrix.\n"
" :rtype: :class:`mathutils.Matrix`\n"
);
-static PyObject *pygpu_matrix_get_projection_matrix(PyObject *UNUSED(self))
+static PyObject *bpygpu_matrix_get_projection_matrix(PyObject *UNUSED(self))
{
float matrix[4][4];
GPU_matrix_model_view_get(matrix);
@@ -433,7 +454,7 @@ static PyObject *pygpu_matrix_get_projection_matrix(PyObject *UNUSED(self))
}
-PyDoc_STRVAR(pygpu_matrix_get_modal_view_matrix_doc,
+PyDoc_STRVAR(bpygpu_matrix_get_modal_view_matrix_doc,
"get_view_matrix()\n"
"\n"
" Return a copy of the view matrix.\n"
@@ -441,14 +462,14 @@ PyDoc_STRVAR(pygpu_matrix_get_modal_view_matrix_doc,
" :return: A 4x4 view matrix.\n"
" :rtype: :class:`mathutils.Matrix`\n"
);
-static PyObject *pygpu_matrix_get_modal_view_matrix(PyObject *UNUSED(self))
+static PyObject *bpygpu_matrix_get_modal_view_matrix(PyObject *UNUSED(self))
{
float matrix[4][4];
GPU_matrix_projection_get(matrix);
return Matrix_CreatePyObject(&matrix[0][0], 4, 4, NULL);
}
-PyDoc_STRVAR(pygpu_matrix_get_normal_matrix_doc,
+PyDoc_STRVAR(bpygpu_matrix_get_normal_matrix_doc,
"get_normal_matrix()\n"
"\n"
" Return a copy of the normal matrix.\n"
@@ -456,7 +477,7 @@ PyDoc_STRVAR(pygpu_matrix_get_normal_matrix_doc,
" :return: A 3x3 normal matrix.\n"
" :rtype: :class:`mathutils.Matrix`\n"
);
-static PyObject *pygpu_matrix_get_normal_matrix(PyObject *UNUSED(self))
+static PyObject *bpygpu_matrix_get_normal_matrix(PyObject *UNUSED(self))
{
float matrix[3][3];
GPU_matrix_normal_get(matrix);
@@ -469,80 +490,82 @@ static PyObject *pygpu_matrix_get_normal_matrix(PyObject *UNUSED(self))
/** \name Module
* \{ */
-static struct PyMethodDef BPy_GPU_matrix_methods[] = {
+static struct PyMethodDef bpygpu_matrix_methods[] = {
/* Manage Stack */
- {"push", (PyCFunction)pygpu_matrix_push,
- METH_NOARGS, pygpu_matrix_push_doc},
- {"pop", (PyCFunction)pygpu_matrix_pop,
- METH_NOARGS, pygpu_matrix_pop_doc},
+ {"push", (PyCFunction)bpygpu_matrix_push,
+ METH_NOARGS, bpygpu_matrix_push_doc},
+ {"pop", (PyCFunction)bpygpu_matrix_pop,
+ METH_NOARGS, bpygpu_matrix_pop_doc},
- {"push_projection", (PyCFunction)pygpu_matrix_push_projection,
- METH_NOARGS, pygpu_matrix_push_projection_doc},
- {"pop_projection", (PyCFunction)pygpu_matrix_pop_projection,
- METH_NOARGS, pygpu_matrix_pop_projection_doc},
+ {"push_projection", (PyCFunction)bpygpu_matrix_push_projection,
+ METH_NOARGS, bpygpu_matrix_push_projection_doc},
+ {"pop_projection", (PyCFunction)bpygpu_matrix_pop_projection,
+ METH_NOARGS, bpygpu_matrix_pop_projection_doc},
/* Stack (Context Manager) */
- {"push_pop", (PyCFunction)pygpu_matrix_push_pop,
- METH_NOARGS, pygpu_matrix_push_pop_doc},
- {"push_pop_projection", (PyCFunction)pygpu_matrix_push_pop_projection,
- METH_NOARGS, pygpu_matrix_push_pop_projection_doc},
+ {"push_pop", (PyCFunction)bpygpu_matrix_push_pop,
+ METH_NOARGS, bpygpu_matrix_push_pop_doc},
+ {"push_pop_projection", (PyCFunction)bpygpu_matrix_push_pop_projection,
+ METH_NOARGS, bpygpu_matrix_push_pop_projection_doc},
/* Manipulate State */
- {"multiply_matrix", (PyCFunction)pygpu_matrix_multiply_matrix,
- METH_O, 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},
+ {"multiply_matrix", (PyCFunction)bpygpu_matrix_multiply_matrix,
+ METH_O, bpygpu_matrix_multiply_matrix_doc},
+ {"scale", (PyCFunction)bpygpu_matrix_scale,
+ METH_O, bpygpu_matrix_scale_doc},
+ {"scale_uniform", (PyCFunction)bpygpu_matrix_scale_uniform,
+ METH_O, bpygpu_matrix_scale_uniform_doc},
+ {"translate", (PyCFunction)bpygpu_matrix_translate,
+ METH_O, bpygpu_matrix_translate_doc},
/* TODO */
#if 0
- {"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},
+ {"rotate", (PyCFunction)bpygpu_matrix_rotate,
+ METH_O, bpygpu_matrix_rotate_doc},
+ {"rotate_axis", (PyCFunction)bpygpu_matrix_rotate_axis,
+ METH_O, bpygpu_matrix_rotate_axis_doc},
+ {"look_at", (PyCFunction)bpygpu_matrix_look_at,
+ METH_O, bpygpu_matrix_look_at_doc},
#endif
/* Write State */
- {"reset", (PyCFunction)pygpu_matrix_reset,
- METH_NOARGS, pygpu_matrix_reset_doc},
- {"load_identity", (PyCFunction)pygpu_matrix_load_identity,
- METH_NOARGS, pygpu_matrix_load_identity_doc},
- {"load_matrix", (PyCFunction)pygpu_matrix_load_matrix,
- METH_O, pygpu_matrix_load_matrix_doc},
+ {"reset", (PyCFunction)bpygpu_matrix_reset,
+ METH_NOARGS, bpygpu_matrix_reset_doc},
+ {"load_identity", (PyCFunction)bpygpu_matrix_load_identity,
+ METH_NOARGS, bpygpu_matrix_load_identity_doc},
+ {"load_matrix", (PyCFunction)bpygpu_matrix_load_matrix,
+ METH_O, bpygpu_matrix_load_matrix_doc},
+ {"load_projection_matrix", (PyCFunction)bpygpu_matrix_load_projection_matrix,
+ METH_O, bpygpu_matrix_load_projection_matrix_doc},
/* Read State */
- {"get_projection_matrix", (PyCFunction)pygpu_matrix_get_projection_matrix,
- METH_NOARGS, pygpu_matrix_get_projection_matrix_doc},
- {"get_model_view_matrix", (PyCFunction)pygpu_matrix_get_modal_view_matrix,
- METH_NOARGS, pygpu_matrix_get_modal_view_matrix_doc},
- {"get_normal_matrix", (PyCFunction)pygpu_matrix_get_normal_matrix,
- METH_NOARGS, pygpu_matrix_get_normal_matrix_doc},
+ {"get_projection_matrix", (PyCFunction)bpygpu_matrix_get_projection_matrix,
+ METH_NOARGS, bpygpu_matrix_get_projection_matrix_doc},
+ {"get_model_view_matrix", (PyCFunction)bpygpu_matrix_get_modal_view_matrix,
+ METH_NOARGS, bpygpu_matrix_get_modal_view_matrix_doc},
+ {"get_normal_matrix", (PyCFunction)bpygpu_matrix_get_normal_matrix,
+ METH_NOARGS, bpygpu_matrix_get_normal_matrix_doc},
{NULL, NULL, 0, NULL}
};
-PyDoc_STRVAR(BPy_GPU_matrix_doc,
+PyDoc_STRVAR(bpygpu_matrix_doc,
"This module provides access to the matrix stack."
);
-static PyModuleDef BPy_GPU_matrix_module_def = {
+static PyModuleDef BPyGPU_matrix_module_def = {
PyModuleDef_HEAD_INIT,
.m_name = "gpu.matrix",
- .m_doc = BPy_GPU_matrix_doc,
- .m_methods = BPy_GPU_matrix_methods,
+ .m_doc = bpygpu_matrix_doc,
+ .m_methods = bpygpu_matrix_methods,
};
PyObject *BPyInit_gpu_matrix(void)
{
PyObject *submodule;
- submodule = PyModule_Create(&BPy_GPU_matrix_module_def);
+ submodule = PyModule_Create(&BPyGPU_matrix_module_def);
- if (PyType_Ready(&pygpu_matrix_stack_context_Type) < 0) {
+ if (PyType_Ready(&BPyGPU_matrix_stack_context_Type) < 0) {
return NULL;
}
diff --git a/source/blender/python/intern/gpu.h b/source/blender/python/gpu/gpu_py_matrix.h
index 92841db9027..7bd6318611d 100644
--- a/source/blender/python/intern/gpu.h
+++ b/source/blender/python/gpu/gpu_py_matrix.h
@@ -15,29 +15,16 @@
* 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) 2005 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): Benoit Bolsee.
- *
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/python/intern/gpu.h
- * \ingroup pythonintern
- *
- * Initializes the gpu Python module.
+/** \file blender/python/gpu/gpu_py_matrix.h
+ * \ingroup bpygpu
*/
-#ifndef __GPU_H__
-#define __GPU_H__
-
-PyObject *GPU_initPython(void);
+#ifndef __GPU_PY_MATRIX_H__
+#define __GPU_PY_MATRIX_H__
-PyObject *BPyInit_gpu_offscreen(void);
PyObject *BPyInit_gpu_matrix(void);
-PyObject *BPyInit_gpu_select(void);
-#endif /* __GPU_H__ */
+#endif /* __GPU_PY_MATRIX_H__ */
diff --git a/source/blender/python/gpu/gpu_py_offscreen.c b/source/blender/python/gpu/gpu_py_offscreen.c
new file mode 100644
index 00000000000..3deeb562b3b
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_offscreen.c
@@ -0,0 +1,344 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2015, Blender Foundation.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/gpu/gpu_py_offscreen.c
+ * \ingroup bpygpu
+ *
+ * This file defines the offscreen 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 "MEM_guardedalloc.h"
+
+#include "BLI_utildefines.h"
+
+#include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_scene.h"
+
+#include "DNA_screen_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_view3d_types.h"
+
+#include "GPU_framebuffer.h"
+#include "GPU_texture.h"
+
+#include "../editors/include/ED_view3d.h"
+
+#include "../mathutils/mathutils.h"
+
+#include "../generic/py_capi_utils.h"
+
+#include "gpu_py_offscreen.h" /* own include */
+
+/* -------------------------------------------------------------------- */
+
+/** \name GPUOffscreen Type
+ * \{ */
+
+static PyObject *bpygpu_offscreen_new(PyTypeObject *UNUSED(self), PyObject *args, PyObject *kwds)
+{
+ GPUOffScreen *ofs;
+ int width, height, samples = 0;
+ char err_out[256];
+
+ static const char *_keywords[] = {"width", "height", "samples", NULL};
+ static _PyArg_Parser _parser = {"ii|i:GPUOffScreen.__new__", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(
+ args, kwds, &_parser,
+ &width, &height, &samples))
+ {
+ return NULL;
+ }
+
+ ofs = GPU_offscreen_create(width, height, samples, true, false, err_out);
+
+ if (ofs == NULL) {
+ PyErr_Format(PyExc_RuntimeError,
+ "gpu.offscreen.new(...) failed with '%s'",
+ err_out[0] ? err_out : "unknown error");
+ return NULL;
+ }
+
+ return BPyGPUOffScreen_CreatePyObject(ofs);
+}
+
+static int bpygpu_offscreen_valid_check(BPyGPUOffScreen *bpygpu_ofs)
+{
+ if (UNLIKELY(bpygpu_ofs->ofs == NULL)) {
+ PyErr_SetString(PyExc_ReferenceError, "GPU offscreen was freed, no further access is valid");
+ return -1;
+ }
+ return 0;
+}
+
+#define BPY_GPU_OFFSCREEN_CHECK_OBJ(bpygpu) { \
+ if (UNLIKELY(bpygpu_offscreen_valid_check(bpygpu) == -1)) { \
+ return NULL; \
+ } \
+} ((void)0)
+
+PyDoc_STRVAR(bpygpu_offscreen_width_doc, "Texture width.\n\n:type: int");
+static PyObject *bpygpu_offscreen_width_get(BPyGPUOffScreen *self, void *UNUSED(type))
+{
+ BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
+ return PyLong_FromLong(GPU_offscreen_width(self->ofs));
+}
+
+PyDoc_STRVAR(bpygpu_offscreen_height_doc, "Texture height.\n\n:type: int");
+static PyObject *bpygpu_offscreen_height_get(BPyGPUOffScreen *self, void *UNUSED(type))
+{
+ BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
+ return PyLong_FromLong(GPU_offscreen_height(self->ofs));
+}
+
+PyDoc_STRVAR(bpygpu_offscreen_color_texture_doc, "Color texture.\n\n:type: int");
+static PyObject *bpygpu_offscreen_color_texture_get(BPyGPUOffScreen *self, void *UNUSED(type))
+{
+ BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
+ GPUTexture *texture = GPU_offscreen_color_texture(self->ofs);
+ return PyLong_FromLong(GPU_texture_opengl_bindcode(texture));
+}
+
+PyDoc_STRVAR(bpygpu_offscreen_bind_doc,
+"bind(save=True)\n"
+"\n"
+" Bind the offscreen object.\n"
+"\n"
+" :param save: save OpenGL current states.\n"
+" :type save: bool\n"
+);
+static PyObject *bpygpu_offscreen_bind(BPyGPUOffScreen *self, PyObject *args, PyObject *kwds)
+{
+ bool save = true;
+
+ BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
+
+ 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);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(bpygpu_offscreen_unbind_doc,
+"unbind(restore=True)\n"
+"\n"
+" Unbind the offscreen object.\n"
+"\n"
+" :param restore: restore OpenGL previous states.\n"
+" :type restore: bool\n"
+);
+static PyObject *bpygpu_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);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(bpygpu_offscreen_draw_view3d_doc,
+"draw_view3d(scene, view3d, region, modelview_matrix, projection_matrix)\n"
+"\n"
+" Draw the 3d viewport in the offscreen object.\n"
+"\n"
+" :param scene: Scene to draw.\n"
+" :type scene: :class:`bpy.types.Scene`\n"
+" :param view_layer: View layer to draw.\n"
+" :type view_layer: :class:`bpy.types.ViewLayer`\n"
+" :param view3d: 3D View to get the drawing settings from.\n"
+" :type view3d: :class:`bpy.types.SpaceView3D`\n"
+" :param region: Region of the 3D View.\n"
+" :type region: :class:`bpy.types.Region`\n"
+" :param view_matrix: View Matrix.\n"
+" :type view_matrix: :class:`mathutils.Matrix`\n"
+" :param projection_matrix: Projection Matrix.\n"
+" :type projection_matrix: :class:`mathutils.Matrix`\n"
+);
+static PyObject *bpygpu_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;
+
+ struct Depsgraph *depsgraph;
+ struct Scene *scene;
+ struct ViewLayer *view_layer;
+ View3D *v3d;
+ ARegion *ar;
+ struct RV3DMatrixStore *rv3d_mats;
+
+ BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
+
+ static const char *_keywords[] = {
+ "scene", "view_layer", "view3d", "region",
+ "projection_matrix", "view_matrix", NULL};
+
+ static _PyArg_Parser _parser = {"OOOOO&O&:draw_view3d", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(
+ args, kwds, &_parser,
+ &py_scene, &py_view_layer, &py_view3d, &py_region,
+ Matrix_Parse4x4, &py_mat_projection,
+ Matrix_Parse4x4, &py_mat_view) ||
+ (!(scene = PyC_RNA_AsPointer(py_scene, "Scene")) ||
+ !(view_layer = PyC_RNA_AsPointer(py_view_layer, "ViewLayer")) ||
+ !(v3d = PyC_RNA_AsPointer(py_view3d, "SpaceView3D")) ||
+ !(ar = PyC_RNA_AsPointer(py_region, "Region"))))
+ {
+ return NULL;
+ }
+
+ BLI_assert(BKE_id_is_in_global_main(&scene->id));
+
+ depsgraph = BKE_scene_get_depsgraph(scene, view_layer, true);
+
+ rv3d_mats = ED_view3d_mats_rv3d_backup(ar->regiondata);
+
+ GPU_offscreen_bind(self->ofs, true); /* bind */
+
+ ED_view3d_draw_offscreen(depsgraph,
+ scene,
+ v3d->shading.type,
+ v3d,
+ ar,
+ GPU_offscreen_width(self->ofs),
+ GPU_offscreen_height(self->ofs),
+ (float(*)[4])py_mat_view->matrix,
+ (float(*)[4])py_mat_projection->matrix,
+ false,
+ true,
+ "",
+ NULL,
+ self->ofs,
+ NULL);
+
+ GPU_offscreen_unbind(self->ofs, true); /* unbind */
+
+ ED_view3d_mats_rv3d_restore(ar->regiondata, rv3d_mats);
+ MEM_freeN(rv3d_mats);
+
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(bpygpu_offscreen_free_doc,
+"free()\n"
+"\n"
+" Free the offscreen object\n"
+" The framebuffer, texture and render objects will no longer be accessible.\n"
+);
+static PyObject *bpygpu_offscreen_free(BPyGPUOffScreen *self)
+{
+ BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
+
+ GPU_offscreen_free(self->ofs);
+ self->ofs = NULL;
+ Py_RETURN_NONE;
+}
+
+static void BPyGPUOffScreen__tp_dealloc(BPyGPUOffScreen *self)
+{
+ if (self->ofs)
+ GPU_offscreen_free(self->ofs);
+ Py_TYPE(self)->tp_free((PyObject *)self);
+}
+
+static PyGetSetDef bpygpu_offscreen_getseters[] = {
+ {(char *)"color_texture", (getter)bpygpu_offscreen_color_texture_get, (setter)NULL, bpygpu_offscreen_color_texture_doc, NULL},
+ {(char *)"width", (getter)bpygpu_offscreen_width_get, (setter)NULL, bpygpu_offscreen_width_doc, NULL},
+ {(char *)"height", (getter)bpygpu_offscreen_height_get, (setter)NULL, bpygpu_offscreen_height_doc, NULL},
+ {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+static struct PyMethodDef bpygpu_offscreen_methods[] = {
+ {"bind", (PyCFunction)bpygpu_offscreen_bind, METH_VARARGS | METH_KEYWORDS, bpygpu_offscreen_bind_doc},
+ {"unbind", (PyCFunction)bpygpu_offscreen_unbind, METH_VARARGS | METH_KEYWORDS, bpygpu_offscreen_unbind_doc},
+ {"draw_view3d", (PyCFunction)bpygpu_offscreen_draw_view3d, METH_VARARGS | METH_KEYWORDS, bpygpu_offscreen_draw_view3d_doc},
+ {"free", (PyCFunction)bpygpu_offscreen_free, METH_NOARGS, bpygpu_offscreen_free_doc},
+ {NULL, NULL, 0, NULL}
+};
+
+PyDoc_STRVAR(bpygpu_offscreen_doc,
+"GPUOffScreen(width, height, samples=0)\n"
+"\n"
+" This object gives access to off screen buffers.\n"
+"\n"
+" :param width: Horizontal dimension of the buffer.\n"
+" :type width: `int`\n"
+" :param height: Vertical dimension of the buffer.\n"
+" :type height: `int`\n"
+" :param samples: OpenGL samples to use for MSAA or zero to disable.\n"
+" :type samples: `int`\n"
+);
+PyTypeObject BPyGPUOffScreen_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = "GPUOffScreen",
+ .tp_basicsize = sizeof(BPyGPUOffScreen),
+ .tp_dealloc = (destructor)BPyGPUOffScreen__tp_dealloc,
+ .tp_flags = Py_TPFLAGS_DEFAULT,
+ .tp_doc = bpygpu_offscreen_doc,
+ .tp_methods = bpygpu_offscreen_methods,
+ .tp_getset = bpygpu_offscreen_getseters,
+ .tp_new = bpygpu_offscreen_new,
+};
+
+/** \} */
+
+
+/* -------------------------------------------------------------------- */
+
+/** \name Public API
+ * \{ */
+
+PyObject *BPyGPUOffScreen_CreatePyObject(GPUOffScreen *ofs)
+{
+ BPyGPUOffScreen *self;
+
+ self = PyObject_New(BPyGPUOffScreen, &BPyGPUOffScreen_Type);
+ self->ofs = ofs;
+
+ return (PyObject *)self;
+}
+
+/** \} */
+
+#undef BPY_GPU_OFFSCREEN_CHECK_OBJ
diff --git a/source/blender/python/gpu/gpu_py_offscreen.h b/source/blender/python/gpu/gpu_py_offscreen.h
new file mode 100644
index 00000000000..8b94671b82c
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_offscreen.h
@@ -0,0 +1,41 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/gpu/gpu_py_offscreen.h
+ * \ingroup bpygpu
+ */
+
+#ifndef __GPU_PY_OFFSCREEN_H__
+#define __GPU_PY_OFFSCREEN_H__
+
+#include "BLI_compiler_attrs.h"
+
+extern PyTypeObject BPyGPUOffScreen_Type;
+
+#define BPyGPUOffScreen_Check(v) (Py_TYPE(v) == &BPyGPUOffScreen_Type)
+
+typedef struct BPyGPUOffScreen {
+ PyObject_HEAD
+ struct GPUOffScreen *ofs;
+} BPyGPUOffScreen;
+
+PyObject *BPyGPUOffScreen_CreatePyObject(struct GPUOffScreen *ofs) ATTR_NONNULL(1);
+
+#endif /* __GPU_PY_OFFSCREEN_H__ */
diff --git a/source/blender/python/gpu/gpu_py_primitive.c b/source/blender/python/gpu/gpu_py_primitive.c
new file mode 100644
index 00000000000..798dfc050f6
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_primitive.c
@@ -0,0 +1,81 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2015, Blender Foundation.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/gpu/gpu_py_primitive.c
+ * \ingroup bpygpu
+ *
+ * - Use ``bpygpu_`` for local API.
+ * - Use ``BPyGPU`` for public API.
+ */
+
+#include <Python.h>
+
+#include "BLI_utildefines.h"
+
+#include "GPU_primitive.h"
+
+#include "gpu_py_primitive.h" /* own include */
+
+
+/* -------------------------------------------------------------------- */
+
+/** \name Primitive 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(LINE_STRIP_ADJ);
+
+#undef MATCH_ID
+ PyErr_Format(PyExc_ValueError,
+ "unknown type literal: '%s'",
+ mode_id);
+ return 0;
+
+success:
+ (*(GPUPrimType *)p) = mode;
+ return 1;
+}
diff --git a/source/blender/python/gpu/gpu_py_primitive.h b/source/blender/python/gpu/gpu_py_primitive.h
new file mode 100644
index 00000000000..d10ee01c8ad
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_primitive.h
@@ -0,0 +1,30 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/gpu/gpu_py_primitive.h
+ * \ingroup bpygpu
+ */
+
+#ifndef __GPU_PY_PRIMITIVE_H__
+#define __GPU_PY_PRIMITIVE_H__
+
+int bpygpu_ParsePrimType(PyObject *o, void *p);
+
+#endif /* __GPU_PY_PRIMITIVE_H__ */
diff --git a/source/blender/python/intern/gpu_py_select.c b/source/blender/python/gpu/gpu_py_select.c
index fcdcce24935..56b8b904464 100644
--- a/source/blender/python/intern/gpu_py_select.c
+++ b/source/blender/python/gpu/gpu_py_select.c
@@ -18,13 +18,16 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/python/intern/gpu_py_select.c
- * \ingroup pythonintern
+/** \file blender/python/gpu/gpu_py_select.c
+ * \ingroup bpygpu
*
* This file defines the gpu.select API.
*
* \note Currently only used for gizmo selection,
* will need to add begin/end and a way to access the hits.
+ *
+ * - Use ``bpygpu_`` for local API.
+ * - Use ``BPyGPU`` for public API.
*/
#include <Python.h>
@@ -33,15 +36,15 @@
#include "../generic/py_capi_utils.h"
-#include "gpu.h"
-
#include "GPU_select.h"
+#include "gpu_py_select.h" /* own include */
+
/* -------------------------------------------------------------------- */
/** \name Methods
* \{ */
-PyDoc_STRVAR(pygpu_select_load_id_doc,
+PyDoc_STRVAR(bpygpu_select_load_id_doc,
"load_id(id)\n"
"\n"
" Set the selection ID.\n"
@@ -49,7 +52,7 @@ PyDoc_STRVAR(pygpu_select_load_id_doc,
" :param id: Number (32-bit unsigned int).\n"
" :type select: int\n"
);
-static PyObject *pygpu_select_load_id(PyObject *UNUSED(self), PyObject *value)
+static PyObject *bpygpu_select_load_id(PyObject *UNUSED(self), PyObject *value)
{
uint id;
if ((id = PyC_Long_AsU32(value)) == (uint)-1) {
@@ -64,27 +67,27 @@ static PyObject *pygpu_select_load_id(PyObject *UNUSED(self), PyObject *value)
/** \name Module
* \{ */
-static struct PyMethodDef BPy_GPU_select_methods[] = {
+static struct PyMethodDef bpygpu_select_methods[] = {
/* Manage Stack */
- {"load_id", (PyCFunction)pygpu_select_load_id, METH_O, pygpu_select_load_id_doc},
+ {"load_id", (PyCFunction)bpygpu_select_load_id, METH_O, bpygpu_select_load_id_doc},
{NULL, NULL, 0, NULL}
};
-PyDoc_STRVAR(BPy_GPU_select_doc,
+PyDoc_STRVAR(bpygpu_select_doc,
"This module provides access to selection."
);
-static PyModuleDef BPy_GPU_select_module_def = {
+static PyModuleDef BPyGPU_select_module_def = {
PyModuleDef_HEAD_INIT,
.m_name = "gpu.select",
- .m_doc = BPy_GPU_select_doc,
- .m_methods = BPy_GPU_select_methods,
+ .m_doc = bpygpu_select_doc,
+ .m_methods = bpygpu_select_methods,
};
PyObject *BPyInit_gpu_select(void)
{
PyObject *submodule;
- submodule = PyModule_Create(&BPy_GPU_select_module_def);
+ submodule = PyModule_Create(&BPyGPU_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
new file mode 100644
index 00000000000..11daf2ade64
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_select.h
@@ -0,0 +1,30 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/gpu/gpu_py_select.h
+ * \ingroup bpygpu
+ */
+
+#ifndef __GPU_PY_SELECT_H__
+#define __GPU_PY_SELECT_H__
+
+PyObject *BPyInit_gpu_select(void);
+
+#endif /* __GPU_PY_SELECT_H__ */
diff --git a/source/blender/python/gpu/gpu_py_shader.c b/source/blender/python/gpu/gpu_py_shader.c
new file mode 100644
index 00000000000..4569e64eb62
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_shader.c
@@ -0,0 +1,878 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/gpu/gpu_py_shader.c
+ * \ingroup bpygpu
+ *
+ * - Use ``bpygpu_`` for local API.
+ * - Use ``BPyGPU`` for public API.
+ */
+
+#include <Python.h>
+
+#include "BLI_utildefines.h"
+
+#include "GPU_shader.h"
+#include "GPU_shader_interface.h"
+
+#include "../generic/py_capi_utils.h"
+#include "../generic/python_utildefines.h"
+#include "../mathutils/mathutils.h"
+
+#include "gpu_py_shader.h" /* own include */
+#include "gpu_py_vertex_format.h"
+
+
+ /* -------------------------------------------------------------------- */
+
+ /** \name Enum Conversion.
+ * \{ */
+
+static int bpygpu_ParseBultinShaderEnum(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 == (Py_ssize_t)strlen(STRINGIFY(id))) { \
+ if (STREQ(mode_id, STRINGIFY(id))) { \
+ mode = GPU_SHADER_##id; \
+ goto success; \
+ } \
+ } ((void)0)
+
+ GPUBuiltinShader mode;
+ MATCH_ID(2D_UNIFORM_COLOR);
+ MATCH_ID(2D_FLAT_COLOR);
+ MATCH_ID(2D_SMOOTH_COLOR);
+ MATCH_ID(2D_IMAGE);
+ MATCH_ID(3D_UNIFORM_COLOR);
+ MATCH_ID(3D_FLAT_COLOR);
+ MATCH_ID(3D_SMOOTH_COLOR);
+
+#undef MATCH_ID
+ PyErr_Format(PyExc_ValueError,
+ "unknown type literal: '%s'",
+ mode_id);
+ return 0;
+
+success:
+ (*(GPUBuiltinShader *)p) = mode;
+ return 1;
+}
+
+static int bpygpu_uniform_location_get(GPUShader *shader, const char *name, const char *error_prefix)
+{
+ int uniform = GPU_shader_get_uniform(shader, name);
+
+ if (uniform == -1) {
+ PyErr_Format(PyExc_ValueError, "%s: uniform %.32s %.32s not found", error_prefix, name);
+ }
+
+ return uniform;
+}
+
+/** \} */
+
+
+/* -------------------------------------------------------------------- */
+
+/** \name Shader Type
+ * \{ */
+
+static PyObject *bpygpu_shader_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
+{
+ struct {
+ const char *vertexcode;
+ const char *fragcode;
+ const char *geocode;
+ const char *libcode;
+ const char *defines;
+ } params = {0};
+
+ static const char *_keywords[] = {
+ "vertexcode", "fragcode", "geocode",
+ "libcode", "defines", NULL};
+
+ static _PyArg_Parser _parser = {"ss|$sss:GPUShader.__new__", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(
+ args, kwds, &_parser,
+ &params.vertexcode, &params.fragcode, &params.geocode,
+ &params.libcode, &params.defines))
+ {
+ return NULL;
+ }
+
+ GPUShader *shader = GPU_shader_create(
+ params.vertexcode,
+ params.fragcode,
+ params.geocode,
+ params.libcode,
+ params.defines,
+ NULL);
+
+ if (shader == NULL) {
+ PyErr_SetString(PyExc_Exception,
+ "Shader Compile Error, see console for more details");
+ return NULL;
+ }
+
+ return BPyGPUShader_CreatePyObject(shader, false);
+}
+
+PyDoc_STRVAR(bpygpu_shader_bind_doc,
+".. method:: bind()\n"
+"\n"
+" Bind the Shader object.\n"
+);
+static PyObject *bpygpu_shader_bind(BPyGPUShader *self)
+{
+ GPU_shader_bind(self->shader);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(bpygpu_shader_transform_feedback_enable_doc,
+".. method:: transform_feedback_enable(vbo_id)\n"
+"\n"
+" Start transform feedback operation.\n"
+"\n"
+" :return: true if transform feedback was succesfully enabled.\n"
+" :rtype: bool\n"
+);
+static PyObject *bpygpu_shader_transform_feedback_enable(
+ BPyGPUShader *self, PyObject *arg)
+{
+ uint vbo_id;
+ if ((vbo_id = PyC_Long_AsU32(arg)) == (uint)-1) {
+ return NULL;
+ }
+ return PyBool_FromLong(GPU_shader_transform_feedback_enable(self->shader, vbo_id));
+}
+
+PyDoc_STRVAR(bpygpu_shader_transform_feedback_disable_doc,
+".. method:: transform_feedback_disable()\n"
+"\n"
+" Disable transform feedback.\n"
+);
+static PyObject *bpygpu_transform_feedback_disable(BPyGPUShader *self)
+{
+ GPU_shader_transform_feedback_disable(self->shader);
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(bpygpu_shader_uniform_from_name_doc,
+".. method:: uniform_from_name(name)\n"
+"\n"
+" Get uniform location by name.\n"
+"\n"
+" :param name: name of the uniform variable whose location is to be queried.\n"
+" :type name: str\n"
+" :return: the location of the uniform variable.\n"
+" :rtype: int\n"
+);
+static PyObject *bpygpu_shader_uniform_from_name(
+ BPyGPUShader *self, PyObject *arg)
+{
+ const char *name = PyUnicode_AsUTF8(arg);
+ if (name == NULL) {
+ return NULL;
+ }
+
+ int uniform = bpygpu_uniform_location_get(
+ self->shader, name, "GPUShader.get_uniform");
+
+ if (uniform == -1) {
+ return NULL;
+ }
+
+ return PyLong_FromLong(uniform);
+}
+
+PyDoc_STRVAR(bpygpu_shader_uniform_block_from_name_doc,
+".. method:: uniform_block_from_name(name)\n"
+"\n"
+" Get uniform block location by name.\n"
+"\n"
+" :param name: name of the uniform block variable whose location is to be queried.\n"
+" :type name: str\n"
+" :return: the location of the uniform block variable.\n"
+" :rtype: int\n"
+);
+static PyObject *bpygpu_shader_uniform_block_from_name(
+ BPyGPUShader *self, PyObject *arg)
+{
+ const char *name = PyUnicode_AsUTF8(arg);
+ if (name == NULL) {
+ return NULL;
+ }
+
+ int uniform = GPU_shader_get_uniform_block(self->shader, name);
+
+ if (uniform == -1) {
+ PyErr_Format(PyExc_ValueError,
+ "GPUShader.get_uniform_block: uniform %.32s not found", name);
+ return NULL;
+ }
+
+ return PyLong_FromLong(uniform);
+}
+
+static bool bpygpu_shader_uniform_vector_imp(
+ PyObject *args, int elem_size,
+ int *r_location, int *r_length, int *r_count, Py_buffer *r_pybuffer)
+{
+ PyObject *buffer;
+
+ *r_count = 1;
+ if (!PyArg_ParseTuple(
+ args, "iOi|i:GPUShader.uniform_vector_*",
+ r_location, &buffer, r_length, r_count))
+ {
+ return false;
+ }
+
+ if (PyObject_GetBuffer(buffer, r_pybuffer, PyBUF_SIMPLE) == -1) {
+ /* PyObject_GetBuffer raise a PyExc_BufferError */
+ return false;
+ }
+
+ if (r_pybuffer->len != (*r_length * *r_count * elem_size)) {
+ PyErr_SetString(
+ PyExc_BufferError,
+ "GPUShader.uniform_vector_*: buffer size does not match.");
+ return false;
+ }
+
+ return true;
+}
+
+PyDoc_STRVAR(bpygpu_shader_uniform_vector_float_doc,
+".. method:: uniform_vector_float(location, buffer, length, count)\n"
+"\n"
+" Set the buffer to fill the uniform.\n"
+"\n"
+" :param location: location of the uniform variable to be modified.\n"
+" :type location: int\n"
+" :param buffer: buffer object with format float.\n"
+" :type buffer: buffer object\n"
+" :param length:\n"
+" size of the uniform data type:\n"
+"\n"
+" - 1: float\n"
+" - 2: vec2 or float[2]\n"
+" - 3: vec3 or float[3]\n"
+" - 4: vec4 or float[4]\n"
+" - 9: mat3\n"
+" - 16: mat4\n"
+"\n"
+" :type length: int\n"
+" :param count: specifies the number of elements, vector or matrices that are to be modified.\n"
+" :type count: int\n"
+);
+static PyObject *bpygpu_shader_uniform_vector_float(
+ BPyGPUShader *self, PyObject *args)
+{
+ int location, length, count;
+
+ Py_buffer pybuffer;
+
+ if (!bpygpu_shader_uniform_vector_imp(
+ args, sizeof(float),
+ &location, &length, &count, &pybuffer))
+ {
+ return NULL;
+ }
+
+ GPU_shader_uniform_vector(
+ self->shader, location, length,
+ count, pybuffer.buf);
+
+ PyBuffer_Release(&pybuffer);
+
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(bpygpu_shader_uniform_vector_int_doc,
+".. method:: uniform_vector_int(location, buffer, length, count)\n"
+"\n"
+" See GPUShader.uniform_vector_float(...) description.\n"
+);
+static PyObject *bpygpu_shader_uniform_vector_int(
+ BPyGPUShader *self, PyObject *args)
+{
+ int location, length, count;
+
+ Py_buffer pybuffer;
+
+ if (!bpygpu_shader_uniform_vector_imp(
+ args, sizeof(int),
+ &location, &length, &count, &pybuffer))
+ {
+ return NULL;
+ }
+
+ GPU_shader_uniform_vector_int(
+ self->shader, location, length,
+ count, pybuffer.buf);
+
+ PyBuffer_Release(&pybuffer);
+
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(bpygpu_shader_uniform_bool_doc,
+".. method:: uniform_bool(name, seq)\n"
+"\n"
+" Specify the value of a uniform variable for the current program object.\n"
+"\n"
+" :param name: name of the uniform variable whose location is to be queried.\n"
+" :type name: str\n"
+" :param seq: values that will be used to update the specified uniform variable.\n"
+" :type seq: sequence of bools\n"
+);
+static PyObject *bpygpu_shader_uniform_bool(
+ BPyGPUShader *self, PyObject *args)
+{
+ const char *error_prefix = "GPUShader.uniform_bool";
+
+ struct {
+ const char *id;
+ PyObject *seq;
+ } params;
+
+ if (!PyArg_ParseTuple(
+ args, "sO:GPUShader.uniform_bool",
+ &params.id, &params.seq))
+ {
+ return NULL;
+ }
+
+ int values[4];
+ int length;
+ int ret;
+ {
+ PyObject *seq_fast = PySequence_Fast(params.seq, error_prefix);
+ if (seq_fast == NULL) {
+ PyErr_Format(PyExc_TypeError,
+ "%s: expected a sequence, got %s",
+ error_prefix, Py_TYPE(params.seq)->tp_name);
+ ret = -1;
+ }
+ else {
+ length = PySequence_Fast_GET_SIZE(seq_fast);
+ if (length == 0 || length > 4) {
+ PyErr_Format(PyExc_TypeError,
+ "%s: invalid sequence length. expected 1..4, got %d",
+ error_prefix, length);
+ ret = -1;
+ }
+ else {
+ ret = PyC_AsArray_FAST(
+ values, seq_fast, length, &PyLong_Type,
+ false, error_prefix);
+ }
+ Py_DECREF(seq_fast);
+ }
+ }
+ if (ret == -1) {
+ return NULL;
+ }
+
+ const int location = bpygpu_uniform_location_get(
+ self->shader, params.id, error_prefix);
+
+ if (location == -1) {
+ return NULL;
+ }
+
+ GPU_shader_uniform_vector_int(self->shader, location, length, 1, values);
+
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(bpygpu_shader_uniform_float_doc,
+".. method:: uniform_float(name, value)\n"
+"\n"
+" Specify the value of a uniform variable for the current program object.\n"
+"\n"
+" :param name: name of the uniform variable whose location is to be queried.\n"
+" :type name: str\n"
+" :param value: values that will be used to update the specified uniform variable.\n"
+" :type value: single number or sequence of numbers\n"
+);
+static PyObject *bpygpu_shader_uniform_float(
+ BPyGPUShader *self, PyObject *args)
+{
+ const char *error_prefix = "GPUShader.uniform_float";
+
+ struct {
+ const char *id;
+ PyObject *seq;
+ } params;
+
+ if (!PyArg_ParseTuple(
+ args, "sO:GPUShader.uniform_float",
+ &params.id, &params.seq))
+ {
+ return NULL;
+ }
+
+ float values[16];
+ int length;
+
+ if (PyFloat_Check(params.seq)) {
+ values[0] = (float)PyFloat_AsDouble(params.seq);
+ length = 1;
+ }
+ else if (PyLong_Check(params.seq)) {
+ values[0] = (float)PyLong_AsDouble(params.seq);
+ length = 1;
+ }
+ else if (MatrixObject_Check(params.seq)) {
+ MatrixObject *mat = (MatrixObject *)params.seq;
+ if (BaseMath_ReadCallback(mat) == -1) {
+ return NULL;
+ }
+ if ((mat->num_row != mat->num_col) || !ELEM(mat->num_row, 3, 4)) {
+ PyErr_SetString(PyExc_ValueError,
+ "Expected 3x3 or 4x4 matrix");
+ return NULL;
+ }
+ length = mat->num_row * mat->num_col;
+ memcpy(values, mat->matrix, sizeof(float) * length);
+ }
+ else {
+ length = mathutils_array_parse(values, 2, 16, params.seq, "");
+ if (length == -1) {
+ return NULL;
+ }
+ }
+
+ if (!ELEM(length, 1, 2, 3, 4, 9, 16)) {
+ PyErr_SetString(PyExc_TypeError,
+ "Expected a single float or a sequence of floats of length 1..4, 9 or 16.");
+ return NULL;
+ }
+
+ const int location = bpygpu_uniform_location_get(
+ self->shader, params.id, error_prefix);
+
+ if (location == -1) {
+ return NULL;
+ }
+
+ GPU_shader_uniform_vector(self->shader, location, length, 1, values);
+
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(bpygpu_shader_uniform_int_doc,
+".. method:: uniform_int(name, seq)\n"
+"\n"
+" Specify the value of a uniform variable for the current program object.\n"
+"\n"
+" :param name: name of the uniform variable whose location is to be queried.\n"
+" :type name: str\n"
+" :param seq: values that will be used to update the specified uniform variable.\n"
+" :type seq: sequence of numbers\n"
+);
+static PyObject *bpygpu_shader_uniform_int(
+ BPyGPUShader *self, PyObject *args)
+{
+ const char *error_prefix = "GPUShader.uniform_int";
+
+ struct {
+ const char *id;
+ PyObject *seq;
+ } params;
+
+ if (!PyArg_ParseTuple(
+ args, "sO:GPUShader.uniform_int",
+ &params.id, &params.seq))
+ {
+ return NULL;
+ }
+
+ int values[4];
+ int length;
+ int ret;
+
+ if (PyLong_Check(params.seq)) {
+ values[0] = PyC_Long_AsI32(params.seq);
+ length = 1;
+ ret = 0;
+ }
+ else {
+ PyObject *seq_fast = PySequence_Fast(params.seq, error_prefix);
+ if (seq_fast == NULL) {
+ PyErr_Format(PyExc_TypeError,
+ "%s: expected a sequence, got %s",
+ error_prefix, Py_TYPE(params.seq)->tp_name);
+ ret = -1;
+ }
+ else {
+ length = PySequence_Fast_GET_SIZE(seq_fast);
+ if (length == 0 || length > 4) {
+ PyErr_Format(PyExc_TypeError,
+ "%s: invalid sequence length. expected 1..4, got %d",
+ error_prefix, length);
+ ret = -1;
+ }
+ else {
+ ret = PyC_AsArray_FAST(
+ values, seq_fast, length, &PyLong_Type,
+ false, error_prefix);
+ }
+ Py_DECREF(seq_fast);
+ }
+ }
+ if (ret == -1) {
+ return NULL;
+ }
+
+ const int location = bpygpu_uniform_location_get(
+ self->shader, params.id, error_prefix);
+
+ if (location == -1) {
+ return NULL;
+ }
+
+ GPU_shader_uniform_vector_int(self->shader, location, length, 1, values);
+
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(bpygpu_shader_attr_from_name_doc,
+".. method:: attr_from_name(name)\n"
+"\n"
+" Get attribute location by name.\n"
+"\n"
+" :param name: the name of the attribute variable whose location is to be queried.\n"
+" :type name: str\n"
+" :return: the location of an attribute variable.\n"
+" :rtype: int\n"
+);
+static PyObject *bpygpu_shader_attr_from_name(
+ BPyGPUShader *self, PyObject *arg)
+{
+ const char *name = PyUnicode_AsUTF8(arg);
+ if (name == NULL) {
+ return NULL;
+ }
+
+ int attr = GPU_shader_get_attribute(self->shader, name);
+
+ if (attr == -1) {
+ PyErr_Format(PyExc_ValueError,
+ "GPUShader.attr_from_name: attribute %.32s not found", name);
+ return NULL;
+ }
+
+ return PyLong_FromLong(attr);
+}
+
+PyDoc_STRVAR(bpygpu_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 *bpygpu_shader_calc_format(BPyGPUShader *self, PyObject *UNUSED(arg))
+{
+ BPyGPUVertFormat *ret = (BPyGPUVertFormat *)BPyGPUVertFormat_CreatePyObject(NULL);
+ GPU_vertformat_from_interface(&ret->fmt, GPU_shader_get_interface(self->shader));
+ return (PyObject *)ret;
+}
+
+static struct PyMethodDef bpygpu_shader_methods[] = {
+ {"bind", (PyCFunction)bpygpu_shader_bind,
+ METH_NOARGS, bpygpu_shader_bind_doc},
+ {"transform_feedback_enable",
+ (PyCFunction)bpygpu_shader_transform_feedback_enable,
+ METH_O, bpygpu_shader_transform_feedback_enable_doc},
+ {"transform_feedback_disable",
+ (PyCFunction)bpygpu_transform_feedback_disable,
+ METH_NOARGS, bpygpu_shader_transform_feedback_disable_doc},
+ {"uniform_from_name",
+ (PyCFunction)bpygpu_shader_uniform_from_name,
+ METH_O, bpygpu_shader_uniform_from_name_doc},
+ {"uniform_block_from_name",
+ (PyCFunction)bpygpu_shader_uniform_block_from_name,
+ METH_O, bpygpu_shader_uniform_block_from_name_doc},
+ {"uniform_vector_float",
+ (PyCFunction)bpygpu_shader_uniform_vector_float,
+ METH_VARARGS, bpygpu_shader_uniform_vector_float_doc},
+ {"uniform_vector_int",
+ (PyCFunction)bpygpu_shader_uniform_vector_int,
+ METH_VARARGS, bpygpu_shader_uniform_vector_int_doc},
+ {"uniform_bool",
+ (PyCFunction)bpygpu_shader_uniform_bool,
+ METH_VARARGS, bpygpu_shader_uniform_bool_doc},
+ {"uniform_float",
+ (PyCFunction)bpygpu_shader_uniform_float,
+ METH_VARARGS, bpygpu_shader_uniform_float_doc},
+ {"uniform_int",
+ (PyCFunction)bpygpu_shader_uniform_int,
+ METH_VARARGS, bpygpu_shader_uniform_int_doc},
+ {"attr_from_name",
+ (PyCFunction)bpygpu_shader_attr_from_name,
+ METH_O, bpygpu_shader_attr_from_name_doc},
+ {"format_calc",
+ (PyCFunction)bpygpu_shader_calc_format,
+ METH_NOARGS, bpygpu_shader_calc_format_doc},
+ {NULL, NULL, 0, NULL}
+};
+
+PyDoc_STRVAR(bpygpu_shader_program_doc,
+"The name of the program object for use by the OpenGL API (read-only).\n\n:type: int"
+);
+static PyObject *bpygpu_shader_program_get(BPyGPUShader *self, void *UNUSED(closure))
+{
+ return PyLong_FromLong(GPU_shader_get_program(self->shader));
+}
+
+static PyGetSetDef bpygpu_shader_getseters[] = {
+ {(char *)"program",
+ (getter)bpygpu_shader_program_get, (setter)NULL,
+ bpygpu_shader_program_doc, NULL},
+ {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+
+static void bpygpu_shader_dealloc(BPyGPUShader *self)
+{
+ if (self->is_builtin == false) {
+ GPU_shader_free(self->shader);
+ }
+ Py_TYPE(self)->tp_free((PyObject *)self);
+}
+
+
+PyDoc_STRVAR(bpygpu_shader_doc,
+"GPUShader(vertexcode, fragcode, geocode=None, libcode=None, defines=None)\n"
+"\n"
+"GPUShader combines multiple GLSL shaders into a program used for drawing.\n"
+"It must contain a vertex and fragment shaders, with an optional geometry shader.\n"
+"\n"
+"The GLSL #version directive is automatically included at the top of shaders, and set to 330.\n"
+"\n"
+"Some preprocessor directives are automatically added according to the Operating System or availability.\n"
+"\n"
+"These are::\n"
+"\n"
+" \"#define GPU_ATI\\n\"\n"
+" \"#define GPU_NVIDIA\\n\"\n"
+" \"#define GPU_INTEL\\n\"\n"
+"\n"
+"The following extensions are enabled by default if supported by the GPU::\n"
+"\n"
+" \"#extension GL_ARB_texture_gather: enable\\n\"\n"
+" \"#extension GL_ARB_texture_query_lod: enable\\n\"\n"
+"\n"
+"To debug shaders, use the --debug-gpu-shaders command line option"
+" to see full GLSL shader compilation and linking errors.\n"
+"\n"
+" :param vertexcode: vertex Shader Code.\n"
+" :type vertexcode: str\n"
+" :param fragcode: fragment Shader Code.\n"
+" :type value: str\n"
+" :param geocode: geometry Shader Code.\n"
+" :type value: str\n"
+" :param libcode: code with functions and presets to be shared between shaders.\n"
+" :type value: str\n"
+" :param defines: preprocessor directives.\n"
+" :type value: str\n"
+);
+PyTypeObject BPyGPUShader_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = "GPUShader",
+ .tp_basicsize = sizeof(BPyGPUShader),
+ .tp_dealloc = (destructor)bpygpu_shader_dealloc,
+ .tp_flags = Py_TPFLAGS_DEFAULT,
+ .tp_doc = bpygpu_shader_doc,
+ .tp_methods = bpygpu_shader_methods,
+ .tp_getset = bpygpu_shader_getseters,
+ .tp_new = bpygpu_shader_new,
+};
+
+/** \} */
+
+
+/* -------------------------------------------------------------------- */
+
+/** \name gpu.shader Module API
+ * \{ */
+
+PyDoc_STRVAR(bpygpu_shader_unbind_doc,
+".. function:: unbind()\n"
+"\n"
+" Unbind the bound shader object.\n"
+);
+static PyObject *bpygpu_shader_unbind(BPyGPUShader *UNUSED(self))
+{
+ GPU_shader_unbind();
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(bpygpu_shader_from_builtin_doc,
+".. function:: from_builtin(shader_name)\n"
+"\n"
+"Shaders that are embedded in the blender internal code.\n"
+"They all read the uniform 'mat4 ModelViewProjectionMatrix', which can be edited by the 'gpu.matrix' module.\n"
+"For more details, you can check the shader code with the function 'gpu.shader.code_from_builtin';\n"
+"\n"
+" :param shader_name: One of these builtin shader names: {\n"
+" '2D_UNIFORM_COLOR',\n"
+" '2D_FLAT_COLOR',\n"
+" '2D_SMOOTH_COLOR',\n"
+" '2D_IMAGE',\n"
+" '3D_UNIFORM_COLOR',\n"
+" '3D_FLAT_COLOR',\n"
+" '3D_SMOOTH_COLOR'}\n"
+" :type shader_name: str\n"
+" :return: the shader object\n"
+" :rtype: bpy.types.GPUShader\n"
+);
+static PyObject *bpygpu_shader_from_builtin(PyObject *UNUSED(self), PyObject *arg)
+{
+ GPUBuiltinShader shader_id;
+
+ if (!bpygpu_ParseBultinShaderEnum(arg, &shader_id)) {
+ return NULL;
+ }
+
+ GPUShader *shader = GPU_shader_get_builtin_shader(shader_id);
+
+ return BPyGPUShader_CreatePyObject(shader, true);
+}
+
+PyDoc_STRVAR(bpygpu_shader_code_from_builtin_doc,
+".. function:: code_from_builtin(shader_name)\n"
+"\n"
+"Exposes the internal shader code for query.\n"
+"\n"
+" :param shader_name: One of these builtin shader names: {\n"
+" '2D_UNIFORM_COLOR',\n"
+" '2D_FLAT_COLOR',\n"
+" '2D_SMOOTH_COLOR',\n"
+" '2D_IMAGE',\n"
+" '3D_UNIFORM_COLOR',\n"
+" '3D_FLAT_COLOR',\n"
+" '3D_SMOOTH_COLOR'}\n"
+" :type shader_name: str\n"
+" :return: vertex, fragment and geometry shader codes.\n"
+" :rtype: dict\n"
+);
+static PyObject *bpygpu_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyObject *arg)
+{
+ GPUBuiltinShader shader_id;
+
+ const char *vert;
+ const char *frag;
+ const char *geom;
+ const char *defines;
+
+ PyObject *item, *r_dict;
+
+ if (!bpygpu_ParseBultinShaderEnum(arg, &shader_id)) {
+ return NULL;
+ }
+
+ GPU_shader_get_builtin_shader_code(
+ shader_id, &vert, &frag, &geom, &defines);
+
+ r_dict = PyDict_New();
+
+ PyDict_SetItemString(r_dict, "vertex_shader", item = PyUnicode_FromString(vert));
+ Py_DECREF(item);
+
+ PyDict_SetItemString(r_dict, "fragment_shader", item = PyUnicode_FromString(frag));
+ Py_DECREF(item);
+
+ if (geom) {
+ PyDict_SetItemString(r_dict, "geometry_shader", item = PyUnicode_FromString(geom));
+ Py_DECREF(item);
+ }
+ if (defines) {
+ PyDict_SetItemString(r_dict, "defines", item = PyUnicode_FromString(defines));
+ Py_DECREF(item);
+ }
+ return r_dict;
+}
+
+static struct PyMethodDef bpygpu_shader_module_methods[] = {
+ {"unbind",
+ (PyCFunction)bpygpu_shader_unbind,
+ METH_NOARGS, bpygpu_shader_unbind_doc},
+ {"from_builtin",
+ (PyCFunction)bpygpu_shader_from_builtin,
+ METH_O, bpygpu_shader_from_builtin_doc},
+ {"code_from_builtin",
+ (PyCFunction)bpygpu_shader_code_from_builtin,
+ METH_O, bpygpu_shader_code_from_builtin_doc},
+ {NULL, NULL, 0, NULL}
+};
+
+PyDoc_STRVAR(bpygpu_shader_module_doc,
+"This module provides access to GPUShader internal functions."
+);
+static PyModuleDef BPyGPU_shader_module_def = {
+ PyModuleDef_HEAD_INIT,
+ .m_name = "gpu.shader",
+ .m_doc = bpygpu_shader_module_doc,
+ .m_methods = bpygpu_shader_module_methods,
+};
+
+/** \} */
+
+
+/* -------------------------------------------------------------------- */
+
+/** \name Public API
+ * \{ */
+
+PyObject *BPyGPUShader_CreatePyObject(GPUShader *shader, bool is_builtin)
+{
+ BPyGPUShader *self;
+
+ self = PyObject_New(BPyGPUShader, &BPyGPUShader_Type);
+ self->shader = shader;
+ self->is_builtin = is_builtin;
+
+ return (PyObject *)self;
+}
+
+PyObject *BPyInit_gpu_shader(void)
+{
+ PyObject *submodule;
+
+ submodule = PyModule_Create(&BPyGPU_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
new file mode 100644
index 00000000000..c038cf63e40
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_shader.h
@@ -0,0 +1,41 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/gpu/gpu_py_shader.h
+ * \ingroup bpygpu
+ */
+
+#ifndef __GPU_PY_SHADER_H__
+#define __GPU_PY_SHADER_H__
+
+extern PyTypeObject BPyGPUShader_Type;
+
+#define BPyGPUShader_Check(v) (Py_TYPE(v) == &BPyGPUShader_Type)
+
+typedef struct BPyGPUShader {
+ PyObject_VAR_HEAD
+ struct GPUShader *shader;
+ bool is_builtin;
+} BPyGPUShader;
+
+PyObject *BPyGPUShader_CreatePyObject(struct GPUShader *shader, bool is_builtin);
+PyObject *BPyInit_gpu_shader(void);
+
+#endif /* __GPU_PY_SHADER_H__ */
diff --git a/source/blender/python/gpu/gpu_py_types.c b/source/blender/python/gpu/gpu_py_types.c
index 4e564fdf849..d9ef0736f8e 100644
--- a/source/blender/python/gpu/gpu_py_types.c
+++ b/source/blender/python/gpu/gpu_py_types.c
@@ -19,7 +19,7 @@
*/
/** \file blender/python/gpu/gpu_py_types.c
- * \ingroup pygpu
+ * \ingroup bpygpu
*
* - Use ``bpygpu_`` for local API.
* - Use ``BPyGPU`` for public API.
@@ -27,765 +27,50 @@
#include <Python.h>
-#include "GPU_batch.h"
-#include "GPU_vertex_format.h"
-
-#include "BLI_math.h"
-
-#include "MEM_guardedalloc.h"
-
#include "../generic/py_capi_utils.h"
#include "../generic/python_utildefines.h"
#include "gpu_py_types.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 bpygpu_ParseVertCompType(PyObject *o, void *p)
-{
- Py_ssize_t comp_type_id_len;
- const char *comp_type_id = _PyUnicode_AsStringAndSize(o, &comp_type_id_len);
- if (comp_type_id == NULL) {
- PyErr_Format(PyExc_ValueError,
- "expected a string, got %s",
- Py_TYPE(o)->tp_name);
- return 0;
- }
-
- GPUVertCompType comp_type;
- if (comp_type_id_len == 2) {
- switch (*((ushort *)comp_type_id)) {
- case MAKE_ID2('I', '8'): { comp_type = GPU_COMP_I8; goto success; }
- case MAKE_ID2('U', '8'): { comp_type = GPU_COMP_U8; goto success; }
- }
- }
- else if (comp_type_id_len == 3) {
- switch (*((uint *)comp_type_id)) {
- case MAKE_ID3('I', '1', '6'): { comp_type = GPU_COMP_I16; goto success; }
- case MAKE_ID3('U', '1', '6'): { comp_type = GPU_COMP_U16; goto success; }
- case MAKE_ID3('I', '3', '2'): { comp_type = GPU_COMP_I32; goto success; }
- case MAKE_ID3('U', '3', '2'): { comp_type = GPU_COMP_U32; goto success; }
- case MAKE_ID3('F', '3', '2'): { comp_type = GPU_COMP_F32; goto success; }
- case MAKE_ID3('I', '1', '0'): { comp_type = GPU_COMP_I10; goto success; }
- }
- }
-
- PyErr_Format(PyExc_ValueError,
- "unknown type literal: '%s'",
- comp_type_id);
- return 0;
-
-success:
- *((GPUVertCompType *)p) = comp_type;
- return 1;
-}
-
-static int bpygpu_ParseVertFetchMode(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_FETCH_##id; \
- goto success; \
- } \
- } ((void)0)
-
- GPUVertFetchMode mode;
- MATCH_ID(FLOAT);
- MATCH_ID(INT);
- MATCH_ID(INT_TO_FLOAT_UNIT);
- MATCH_ID(INT_TO_FLOAT);
-#undef MATCH_ID
- PyErr_Format(PyExc_ValueError,
- "unknown type literal: '%s'",
- mode_id);
- return 0;
-
-success:
- (*(GPUVertFetchMode *)p) = mode;
- return 1;
-}
-
-static 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(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 Utility Functions
- * \{ */
-
-#define PY_AS_NATIVE_SWITCH(attr) \
- switch (attr->comp_type) { \
- case GPU_COMP_I8: { PY_AS_NATIVE(int8_t, PyC_Long_AsI8); break; } \
- case GPU_COMP_U8: { PY_AS_NATIVE(uint8_t, PyC_Long_AsU8); break; } \
- case GPU_COMP_I16: { PY_AS_NATIVE(int16_t, PyC_Long_AsI16); break; } \
- case GPU_COMP_U16: { PY_AS_NATIVE(uint16_t, PyC_Long_AsU16); break; } \
- case GPU_COMP_I32: { PY_AS_NATIVE(int32_t, PyC_Long_AsI32); break; } \
- case GPU_COMP_U32: { PY_AS_NATIVE(uint32_t, PyC_Long_AsU32); break; } \
- case GPU_COMP_F32: { PY_AS_NATIVE(float, PyFloat_AsDouble); break; } \
- default: \
- BLI_assert(0); \
- } ((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)
-{
-#define PY_AS_NATIVE(ty_dst, py_as_native) \
-{ \
- ty_dst *data_dst = data_dst_void; \
- *data_dst = py_as_native(py_src); \
-} ((void)0)
-
- PY_AS_NATIVE_SWITCH(attr);
-
-#undef PY_AS_NATIVE
-}
-
-/* No error checking, callers must run PyErr_Occurred */
-static void fill_format_tuple(void *data_dst_void, PyObject *py_src, const GPUVertAttr *attr)
-{
- const uint len = attr->comp_len;
-
-/**
- * Args are constants, so range checks will be optimized out if they're nop's.
- */
-#define PY_AS_NATIVE(ty_dst, py_as_native) \
- ty_dst *data_dst = data_dst_void; \
- for (uint i = 0; i < len; i++) { \
- data_dst[i] = py_as_native(PyTuple_GET_ITEM(py_src, i)); \
- } ((void)0)
-
- PY_AS_NATIVE_SWITCH(attr);
-
-#undef PY_AS_NATIVE
-}
-
-#undef PY_AS_NATIVE_SWITCH
-#undef WARN_TYPE_LIMIT_PUSH
-#undef WARN_TYPE_LIMIT_POP
-
-static bool bpygpu_vertbuf_fill_impl(
- GPUVertBuf *vbo,
- uint data_id, PyObject *seq)
-{
- bool ok = true;
- const GPUVertAttr *attr = &vbo->format.attribs[data_id];
-
- GPUVertBufRaw data_step;
- GPU_vertbuf_attr_get_raw_data(vbo, data_id, &data_step);
-
- PyObject *seq_fast = PySequence_Fast(seq, "Vertex buffer fill");
- if (seq_fast == NULL) {
- goto finally;
- }
-
- const uint seq_len = PySequence_Fast_GET_SIZE(seq_fast);
-
- if (seq_len != vbo->vertex_len) {
- PyErr_Format(PyExc_ValueError,
- "Expected a sequence of size %d, got %d",
- vbo->vertex_len, seq_len);
- }
-
- PyObject **seq_items = PySequence_Fast_ITEMS(seq_fast);
-
- if (attr->comp_len == 1) {
- 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);
- }
- }
- else {
- for (uint i = 0; i < seq_len; i++) {
- uchar *data = (uchar *)GPU_vertbuf_raw_step(&data_step);
- PyObject *item = seq_items[i];
- if (!PyTuple_CheckExact(item)) {
- PyErr_Format(PyExc_ValueError,
- "expected a tuple, got %s",
- Py_TYPE(item)->tp_name);
- ok = false;
- goto finally;
- }
- if (PyTuple_GET_SIZE(item) != attr->comp_len) {
- PyErr_Format(PyExc_ValueError,
- "expected a tuple of size %d, got %d",
- attr->comp_len, PyTuple_GET_SIZE(item));
- ok = false;
- goto finally;
- }
-
- /* May trigger error, check below */
- fill_format_tuple(data, item, attr);
- }
- }
-
- if (PyErr_Occurred()) {
- ok = false;
- }
-
-finally:
-
- Py_DECREF(seq_fast);
- return ok;
-}
-
-/* handy, but not used just now */
-#if 0
-static int bpygpu_find_id(const GPUVertFormat *fmt, const char *id)
-{
- for (int i = 0; i < fmt->attr_len; i++) {
- for (uint j = 0; j < fmt->name_len; j++) {
- if (STREQ(fmt->attribs[i].name[j], id)) {
- return i;
- }
- }
- }
- return -1;
-}
-#endif
-
-/** \} */
-
-
-/* -------------------------------------------------------------------- */
-
-/** \name VertFormat Type
- * \{ */
-
-static PyObject *bpygpu_VertFormat_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
-{
- if (PyTuple_GET_SIZE(args) || (kwds && PyDict_Size(kwds))) {
- PyErr_SetString(PyExc_TypeError,
- "VertFormat(): takes no arguments");
- return NULL;
- }
-
- BPyGPUVertFormat *ret = (BPyGPUVertFormat *)BPyGPUVertFormat_CreatePyObject(NULL);
-
- return (PyObject *)ret;
-}
-
-PyDoc_STRVAR(bpygpu_VertFormat_attr_add_doc,
-"TODO"
-);
-static PyObject *bpygpu_VertFormat_attr_add(BPyGPUVertFormat *self, PyObject *args, PyObject *kwds)
-{
- static const char *kwlist[] = {"id", "comp_type", "len", "fetch_mode", NULL};
-
- struct {
- const char *id;
- GPUVertCompType comp_type;
- uint len;
- GPUVertFetchMode fetch_mode;
- } params;
-
- if (self->fmt.attr_len == GPU_VERT_ATTR_MAX_LEN) {
- PyErr_SetString(PyExc_ValueError, "Maxumum attr reached " STRINGIFY(GPU_VERT_ATTR_MAX_LEN));
- return NULL;
- }
-
- if (!PyArg_ParseTupleAndKeywords(
- args, kwds, "$sO&IO&:attr_add", (char **)kwlist,
- &params.id,
- bpygpu_ParseVertCompType, &params.comp_type,
- &params.len,
- bpygpu_ParseVertFetchMode, &params.fetch_mode))
- {
- return NULL;
- }
-
- uint attr_id = GPU_vertformat_attr_add(&self->fmt, params.id, params.comp_type, params.len, params.fetch_mode);
- return PyLong_FromLong(attr_id);
-}
-
-static struct PyMethodDef bpygpu_VertFormat_methods[] = {
- {"attr_add", (PyCFunction)bpygpu_VertFormat_attr_add,
- METH_VARARGS | METH_KEYWORDS, bpygpu_VertFormat_attr_add_doc},
- {NULL, NULL, 0, NULL}
-};
-
-
-static void bpygpu_VertFormat_dealloc(BPyGPUVertFormat *self)
-{
- Py_TYPE(self)->tp_free(self);
-}
-
-PyTypeObject BPyGPUVertFormat_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- .tp_name = "GPUVertFormat",
- .tp_basicsize = sizeof(BPyGPUVertFormat),
- .tp_dealloc = (destructor)bpygpu_VertFormat_dealloc,
- .tp_flags = Py_TPFLAGS_DEFAULT,
- .tp_methods = bpygpu_VertFormat_methods,
- .tp_new = bpygpu_VertFormat_new,
-};
-
-/** \} */
-
-
-/* -------------------------------------------------------------------- */
-
-/** \name VertBuf Type
- * \{ */
-
-static PyObject *bpygpu_VertBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
-{
- const char * const keywords[] = {"len", "format", NULL};
-
- struct {
- BPyGPUVertFormat *py_fmt;
- uint len;
- } params;
-
- if (!PyArg_ParseTupleAndKeywords(
- args, kwds,
- "$IO!:GPUVertBuf.__new__", (char **)keywords,
- &params.len,
- &BPyGPUVertFormat_Type, &params.py_fmt))
- {
- return NULL;
- }
-
- struct GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&params.py_fmt->fmt);
-
- GPU_vertbuf_data_alloc(vbo, params.len);
-
- return BPyGPUVertBuf_CreatePyObject(vbo);
-}
-
-PyDoc_STRVAR(bpygpu_VertBuf_fill_doc,
-"TODO"
-);
-static PyObject *bpygpu_VertBuf_fill(BPyGPUVertBuf *self, PyObject *args, PyObject *kwds)
-{
- static const char *kwlist[] = {"id", "data", NULL};
-
- struct {
- uint id;
- PyObject *py_seq_data;
- } params;
-
- if (!PyArg_ParseTupleAndKeywords(
- args, kwds, "$IO:fill", (char **)kwlist,
- &params.id,
- &params.py_seq_data))
- {
- return NULL;
- }
-
- if (params.id >= self->buf->format.attr_len) {
- PyErr_Format(PyExc_ValueError,
- "Format id %d out of range",
- params.id);
- return NULL;
- }
-
- if (self->buf->data == NULL) {
- PyErr_SetString(PyExc_ValueError,
- "Can't fill, static buffer already in use");
- return NULL;
- }
-
- if (!bpygpu_vertbuf_fill_impl(self->buf, params.id, params.py_seq_data)) {
- return NULL;
- }
- Py_RETURN_NONE;
-}
-
-static struct PyMethodDef bpygpu_VertBuf_methods[] = {
- {"fill", (PyCFunction) bpygpu_VertBuf_fill,
- METH_VARARGS | METH_KEYWORDS, bpygpu_VertBuf_fill_doc},
- {NULL, NULL, 0, NULL}
-};
-
-static void bpygpu_VertBuf_dealloc(BPyGPUVertBuf *self)
-{
- GPU_vertbuf_discard(self->buf);
- Py_TYPE(self)->tp_free(self);
-}
-
-PyTypeObject BPyGPUVertBuf_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- .tp_name = "GPUVertBuf",
- .tp_basicsize = sizeof(BPyGPUVertBuf),
- .tp_dealloc = (destructor)bpygpu_VertBuf_dealloc,
- .tp_flags = Py_TPFLAGS_DEFAULT,
- .tp_methods = bpygpu_VertBuf_methods,
- .tp_new = bpygpu_VertBuf_new,
-};
-
-/** \} */
-
-
-/* -------------------------------------------------------------------- */
-
-/** \name VertBatch Type
- * \{ */
-
-static PyObject *bpygpu_Batch_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
-{
- const char * const keywords[] = {"type", "buf", NULL};
-
- struct {
- GPUPrimType type_id;
- BPyGPUVertBuf *py_buf;
- } params;
-
- if (!PyArg_ParseTupleAndKeywords(
- args, kwds,
- "$O&O!:GPUBatch.__new__", (char **)keywords,
- bpygpu_ParsePrimType, &params.type_id,
- &BPyGPUVertBuf_Type, &params.py_buf))
- {
- return NULL;
- }
-
- GPUBatch *batch = GPU_batch_create(params.type_id, params.py_buf->buf, NULL);
- BPyGPUBatch *ret = (BPyGPUBatch *)BPyGPUBatch_CreatePyObject(batch);
-
-#ifdef USE_GPU_PY_REFERENCES
- ret->references = PyList_New(1);
- PyList_SET_ITEM(ret->references, 0, (PyObject *)params.py_buf);
- Py_INCREF(params.py_buf);
- PyObject_GC_Track(ret);
-#endif
-
- return (PyObject *)ret;
-}
-
-PyDoc_STRVAR(bpygpu_VertBatch_vertbuf_add_doc,
-"TODO"
-);
-static PyObject *bpygpu_VertBatch_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);
- return NULL;
- }
-
- if (self->batch->verts[0]->vertex_len != py_buf->buf->vertex_len) {
- PyErr_Format(PyExc_TypeError,
- "Expected %d length, got %d",
- self->batch->verts[0]->vertex_len, py_buf->buf->vertex_len);
- return NULL;
- }
-
-#ifdef USE_GPU_PY_REFERENCES
- /* Hold user */
- PyList_Append(self->references, (PyObject *)py_buf);
-#endif
-
- GPU_batch_vertbuf_add(self->batch, py_buf->buf);
- Py_RETURN_NONE;
-}
-
-/* Currently magic number from Py perspective. */
-PyDoc_STRVAR(bpygpu_VertBatch_program_set_builtin_doc,
-"TODO"
-);
-static PyObject *bpygpu_VertBatch_program_set_builtin(BPyGPUBatch *self, PyObject *args, PyObject *kwds)
-{
- static const char *kwlist[] = {"id", NULL};
-
- struct {
- const char *shader;
- } params;
-
- if (!PyArg_ParseTupleAndKeywords(
- args, kwds, "s:program_set_builtin", (char **)kwlist,
- &params.shader))
- {
- return NULL;
- }
-
- GPUBuiltinShader shader;
-
-#define MATCH_ID(id) \
- if (STREQ(params.shader, STRINGIFY(id))) { \
- shader = GPU_SHADER_##id; \
- goto success; \
- } ((void)0)
-
- MATCH_ID(2D_FLAT_COLOR);
- MATCH_ID(2D_SMOOTH_COLOR);
- MATCH_ID(2D_UNIFORM_COLOR);
-
- MATCH_ID(3D_FLAT_COLOR);
- MATCH_ID(3D_SMOOTH_COLOR);
- MATCH_ID(3D_UNIFORM_COLOR);
-
-#undef MATCH_ID
-
- PyErr_SetString(PyExc_ValueError,
- "shader name not known");
- return NULL;
-
-success:
- GPU_batch_program_set_builtin(self->batch, shader);
- Py_RETURN_NONE;
-}
-
-static PyObject *bpygpu_VertBatch_uniform_bool(BPyGPUBatch *self, PyObject *args)
-{
- struct {
- const char *id;
- bool values[1];
- } params;
-
- if (!PyArg_ParseTuple(
- args, "sO&:uniform_bool",
- &params.id,
- PyC_ParseBool, &params.values[0]))
- {
- return NULL;
- }
-
- GPU_batch_uniform_1b(self->batch, params.id, params.values[0]);
- Py_RETURN_NONE;
-}
-
-static PyObject *bpygpu_VertBatch_uniform_i32(BPyGPUBatch *self, PyObject *args)
-{
- struct {
- const char *id;
- int values[1];
- } params;
-
- if (!PyArg_ParseTuple(
- args, "si:uniform_i32",
- &params.id,
- &params.values[0]))
- {
- return NULL;
- }
-
- GPU_batch_uniform_1i(self->batch, params.id, params.values[0]);
- Py_RETURN_NONE;
-}
-
-static PyObject *bpygpu_VertBatch_uniform_f32(BPyGPUBatch *self, PyObject *args)
-{
- struct {
- const char *id;
- float values[4];
- } params;
-
- if (!PyArg_ParseTuple(
- args, "sf|fff:uniform_f32",
- &params.id,
- &params.values[0], &params.values[1], &params.values[2], &params.values[3]))
- {
- return NULL;
- }
-
- switch (PyTuple_GET_SIZE(args)) {
- case 2: GPU_batch_uniform_1f(self->batch, params.id, params.values[0]); break;
- case 3: GPU_batch_uniform_2f(self->batch, params.id, UNPACK2(params.values)); break;
- case 4: GPU_batch_uniform_3f(self->batch, params.id, UNPACK3(params.values)); break;
- case 5: GPU_batch_uniform_4f(self->batch, params.id, UNPACK4(params.values)); break;
- default:
- BLI_assert(0);
- }
- Py_RETURN_NONE;
-}
-
-PyDoc_STRVAR(bpygpu_VertBatch_draw_doc,
-"TODO"
-);
-static PyObject *bpygpu_VertBatch_draw(BPyGPUBatch *self)
-{
- if (!glIsProgram(self->batch->program)) {
- PyErr_SetString(PyExc_ValueError,
- "batch program has not not set");
- }
- GPU_batch_draw(self->batch);
- Py_RETURN_NONE;
-}
-
-static PyObject *bpygpu_VertBatch_program_use_begin(BPyGPUBatch *self)
-{
- if (!glIsProgram(self->batch->program)) {
- PyErr_SetString(PyExc_ValueError,
- "batch program has not not set");
- }
- GPU_batch_program_use_begin(self->batch);
- Py_RETURN_NONE;
-}
-
-static PyObject *bpygpu_VertBatch_program_use_end(BPyGPUBatch *self)
-{
- if (!glIsProgram(self->batch->program)) {
- PyErr_SetString(PyExc_ValueError,
- "batch program has not not set");
- }
- GPU_batch_program_use_end(self->batch);
- Py_RETURN_NONE;
-}
-
-static struct PyMethodDef bpygpu_VertBatch_methods[] = {
- {"vertbuf_add", (PyCFunction)bpygpu_VertBatch_vertbuf_add,
- METH_O, bpygpu_VertBatch_vertbuf_add_doc},
- {"program_set_builtin", (PyCFunction)bpygpu_VertBatch_program_set_builtin,
- METH_VARARGS | METH_KEYWORDS, bpygpu_VertBatch_program_set_builtin_doc},
- {"uniform_bool", (PyCFunction)bpygpu_VertBatch_uniform_bool,
- METH_VARARGS, NULL},
- {"uniform_i32", (PyCFunction)bpygpu_VertBatch_uniform_i32,
- METH_VARARGS, NULL},
- {"uniform_f32", (PyCFunction)bpygpu_VertBatch_uniform_f32,
- METH_VARARGS, NULL},
- {"draw", (PyCFunction) bpygpu_VertBatch_draw,
- METH_NOARGS, bpygpu_VertBatch_draw_doc},
- {"program_use_begin", (PyCFunction)bpygpu_VertBatch_program_use_begin,
- METH_NOARGS, ""},
- {"program_use_end", (PyCFunction)bpygpu_VertBatch_program_use_end,
- METH_NOARGS, ""},
- {NULL, NULL, 0, NULL}
-};
-
-#ifdef USE_GPU_PY_REFERENCES
-
-static int bpygpu_Batch_traverse(BPyGPUBatch *self, visitproc visit, void *arg)
-{
- Py_VISIT(self->references);
- return 0;
-}
-
-static int bpygpu_Batch_clear(BPyGPUBatch *self)
-{
- Py_CLEAR(self->references);
- return 0;
-}
-
-#endif
-
-static void bpygpu_Batch_dealloc(BPyGPUBatch *self)
-{
- GPU_batch_discard(self->batch);
-
-#ifdef USE_GPU_PY_REFERENCES
- if (self->references) {
- PyObject_GC_UnTrack(self);
- bpygpu_Batch_clear(self);
- Py_XDECREF(self->references);
- }
-#endif
-
- Py_TYPE(self)->tp_free(self);
-}
-
-PyTypeObject BPyGPUBatch_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- .tp_name = "GPUBatch",
- .tp_basicsize = sizeof(BPyGPUBatch),
- .tp_dealloc = (destructor)bpygpu_Batch_dealloc,
-#ifdef USE_GPU_PY_REFERENCES
- .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
- .tp_traverse = (traverseproc)bpygpu_Batch_traverse,
- .tp_clear = (inquiry)bpygpu_Batch_clear,
-#else
- .tp_flags = Py_TPFLAGS_DEFAULT,
-#endif
- .tp_methods = bpygpu_VertBatch_methods,
- .tp_new = bpygpu_Batch_new,
-};
-
/* -------------------------------------------------------------------- */
/** \name GPU Types Module
* \{ */
-static struct PyModuleDef BPy_BM_types_module_def = {
+static struct PyModuleDef BPyGPU_types_module_def = {
PyModuleDef_HEAD_INIT,
- .m_name = "_gpu.types",
+ .m_name = "gpu.types",
};
PyObject *BPyInit_gpu_types(void)
{
PyObject *submodule;
- submodule = PyModule_Create(&BPy_BM_types_module_def);
+ submodule = PyModule_Create(&BPyGPU_types_module_def);
if (PyType_Ready(&BPyGPUVertFormat_Type) < 0)
return NULL;
if (PyType_Ready(&BPyGPUVertBuf_Type) < 0)
return NULL;
+ if (PyType_Ready(&BPyGPUIndexBuf_Type) < 0)
+ return NULL;
if (PyType_Ready(&BPyGPUBatch_Type) < 0)
return NULL;
+ if (PyType_Ready(&BPyGPUOffScreen_Type) < 0)
+ return NULL;
+ if (PyType_Ready(&BPyGPUShader_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
@@ -793,53 +78,3 @@ PyObject *BPyInit_gpu_types(void)
}
/** \} */
-
-
-/* -------------------------------------------------------------------- */
-
-/** \name Public API
- * \{ */
-
-PyObject *BPyGPUVertFormat_CreatePyObject(GPUVertFormat *fmt)
-{
- BPyGPUVertFormat *self;
-
- self = PyObject_New(BPyGPUVertFormat, &BPyGPUVertFormat_Type);
- if (fmt) {
- self->fmt = *fmt;
- }
- else {
- memset(&self->fmt, 0, sizeof(self->fmt));
- }
-
- return (PyObject *)self;
-}
-
-PyObject *BPyGPUVertBuf_CreatePyObject(GPUVertBuf *buf)
-{
- BPyGPUVertBuf *self;
-
- self = PyObject_New(BPyGPUVertBuf, &BPyGPUVertBuf_Type);
- self->buf = buf;
-
- return (PyObject *)self;
-}
-
-
-PyObject *BPyGPUBatch_CreatePyObject(GPUBatch *batch)
-{
- BPyGPUBatch *self;
-
-#ifdef USE_GPU_PY_REFERENCES
- self = (BPyGPUBatch *)_PyObject_GC_New(&BPyGPUBatch_Type);
- self->references = NULL;
-#else
- self = PyObject_New(BPyGPUBatch, &BPyGPUBatch_Type);
-#endif
-
- self->batch = batch;
-
- return (PyObject *)self;
-}
-
-/** \} */
diff --git a/source/blender/python/gpu/gpu_py_types.h b/source/blender/python/gpu/gpu_py_types.h
index f736a8f749a..dc91c579aaf 100644
--- a/source/blender/python/gpu/gpu_py_types.h
+++ b/source/blender/python/gpu/gpu_py_types.h
@@ -19,49 +19,19 @@
*/
/** \file blender/python/gpu/gpu_py_types.h
- * \ingroup pygpu
+ * \ingroup bpygpu
*/
#ifndef __GPU_PY_TYPES_H__
#define __GPU_PY_TYPES_H__
-#include "BLI_compiler_attrs.h"
-
-#define USE_GPU_PY_REFERENCES
-
-extern PyTypeObject BPyGPUVertFormat_Type;
-extern PyTypeObject BPyGPUVertBuf_Type;
-extern PyTypeObject BPyGPUBatch_Type;
-
-#define BPyGPUVertFormat_Check(v) (Py_TYPE(v) == &BPyGPUVertFormat_Type)
-#define BPyGPUVertBuf_Check(v) (Py_TYPE(v) == &BPyGPUVertBuf_Type)
-#define BPyGPUBatch_Check(v) (Py_TYPE(v) == &BPyGPUBatch_Type)
-
-typedef struct BPyGPUVertFormat {
- PyObject_VAR_HEAD
- struct GPUVertFormat fmt;
-} BPyGPUVertFormat;
-
-typedef struct BPyGPUVertBuf {
- PyObject_VAR_HEAD
- /* The buf is owned, we may support thin wrapped batches later. */
- struct GPUVertBuf *buf;
-} BPyGPUVertBuf;
-
-typedef struct BPyGPUBatch {
- PyObject_VAR_HEAD
- /* The batch is owned, we may support thin wrapped batches later. */
- struct GPUBatch *batch;
-#ifdef USE_GPU_PY_REFERENCES
- /* Just to keep a user to prevent freeing buf's we're using */
- PyObject *references;
-#endif
-} BPyGPUBatch;
+#include "gpu_py_vertex_format.h"
+#include "gpu_py_vertex_buffer.h"
+#include "gpu_py_element.h"
+#include "gpu_py_batch.h"
+#include "gpu_py_offscreen.h"
+#include "gpu_py_shader.h"
PyObject *BPyInit_gpu_types(void);
-PyObject *BPyGPUVertFormat_CreatePyObject(struct GPUVertFormat *fmt);
-PyObject *BPyGPUVertBuf_CreatePyObject(struct GPUVertBuf *vbo) ATTR_NONNULL(1);
-PyObject *BPyGPUBatch_CreatePyObject(struct GPUBatch *batch) ATTR_NONNULL(1);
-
#endif /* __GPU_PY_TYPES_H__ */
diff --git a/source/blender/python/gpu/gpu_py_vertex_buffer.c b/source/blender/python/gpu/gpu_py_vertex_buffer.c
new file mode 100644
index 00000000000..1f888597b34
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_vertex_buffer.c
@@ -0,0 +1,352 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/gpu/gpu_py_vertex_buffer.c
+ * \ingroup bpygpu
+ *
+ * - Use ``bpygpu_`` for local API.
+ * - Use ``BPyGPU`` for public API.
+ */
+
+#include <Python.h>
+
+#include "GPU_vertex_buffer.h"
+
+#include "BLI_math.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "../generic/py_capi_utils.h"
+#include "../generic/python_utildefines.h"
+
+#include "gpu_py_vertex_format.h"
+#include "gpu_py_vertex_buffer.h" /* own include */
+
+/* -------------------------------------------------------------------- */
+
+/** \name Utility Functions
+ * \{ */
+
+#define PY_AS_NATIVE_SWITCH(attr) \
+ switch (attr->comp_type) { \
+ case GPU_COMP_I8: { PY_AS_NATIVE(int8_t, PyC_Long_AsI8); break; } \
+ case GPU_COMP_U8: { PY_AS_NATIVE(uint8_t, PyC_Long_AsU8); break; } \
+ case GPU_COMP_I16: { PY_AS_NATIVE(int16_t, PyC_Long_AsI16); break; } \
+ case GPU_COMP_U16: { PY_AS_NATIVE(uint16_t, PyC_Long_AsU16); break; } \
+ case GPU_COMP_I32: { PY_AS_NATIVE(int32_t, PyC_Long_AsI32); break; } \
+ case GPU_COMP_U32: { PY_AS_NATIVE(uint32_t, PyC_Long_AsU32); break; } \
+ case GPU_COMP_F32: { PY_AS_NATIVE(float, PyFloat_AsDouble); break; } \
+ default: \
+ BLI_assert(0); \
+ } ((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)
+{
+#define PY_AS_NATIVE(ty_dst, py_as_native) \
+{ \
+ ty_dst *data_dst = data_dst_void; \
+ *data_dst = py_as_native(py_src); \
+} ((void)0)
+
+ PY_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)
+{
+ const uint len = attr->comp_len;
+ PyObject **value_fast_items = PySequence_Fast_ITEMS(py_seq_fast);
+
+/**
+ * Args are constants, so range checks will be optimized out if they're nop's.
+ */
+#define PY_AS_NATIVE(ty_dst, py_as_native) \
+ ty_dst *data_dst = data_dst_void; \
+ for (uint i = 0; i < len; i++) { \
+ data_dst[i] = py_as_native(value_fast_items[i]); \
+ } ((void)0)
+
+ PY_AS_NATIVE_SWITCH(attr);
+
+#undef PY_AS_NATIVE
+}
+
+#undef PY_AS_NATIVE_SWITCH
+#undef WARN_TYPE_LIMIT_PUSH
+#undef WARN_TYPE_LIMIT_POP
+
+static bool bpygpu_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";
+
+ bool ok = true;
+ const GPUVertAttr *attr = &vbo->format.attribs[data_id];
+
+ if (PyObject_CheckBuffer(seq)) {
+ Py_buffer pybuffer;
+
+ if (PyObject_GetBuffer(seq, &pybuffer, PyBUF_STRIDES | PyBUF_ND) == -1) {
+ /* PyObject_GetBuffer raise a PyExc_BufferError */
+ return false;
+ }
+
+ uint comp_len = pybuffer.ndim == 1 ? 1 : (uint)pybuffer.shape[1];
+
+ if (pybuffer.shape[0] != vbo->vertex_len) {
+ PyErr_Format(PyExc_ValueError, exc_str_size_mismatch,
+ "sequence", vbo->vertex_len, pybuffer.shape[0]);
+ ok = false;
+ }
+ else if (comp_len != attr->comp_len) {
+ PyErr_Format(PyExc_ValueError, exc_str_size_mismatch,
+ "component", attr->comp_len, comp_len);
+ ok = false;
+ }
+ else {
+ GPU_vertbuf_attr_fill_stride(vbo, data_id, pybuffer.strides[0], pybuffer.buf);
+ }
+
+ PyBuffer_Release(&pybuffer);
+ }
+ else {
+ GPUVertBufRaw data_step;
+ GPU_vertbuf_attr_get_raw_data(vbo, data_id, &data_step);
+
+ PyObject *seq_fast = PySequence_Fast(seq, "Vertex buffer fill");
+ if (seq_fast == NULL) {
+ return false;
+ }
+
+ const uint seq_len = PySequence_Fast_GET_SIZE(seq_fast);
+
+ if (seq_len != vbo->vertex_len) {
+ PyErr_Format(PyExc_ValueError, exc_str_size_mismatch,
+ "sequence", vbo->vertex_len, seq_len);
+ }
+
+ PyObject **seq_items = PySequence_Fast_ITEMS(seq_fast);
+
+ if (attr->comp_len == 1) {
+ 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);
+ }
+ }
+ else {
+ for (uint i = 0; i < seq_len; i++) {
+ uchar *data = (uchar *)GPU_vertbuf_raw_step(&data_step);
+ PyObject *seq_fast_item = PySequence_Fast(seq_items[i], error_prefix);
+
+ if (seq_fast_item == NULL) {
+ ok = false;
+ goto finally;
+ }
+ if (PySequence_Fast_GET_SIZE(seq_fast_item) != attr->comp_len) {
+ PyErr_Format(PyExc_ValueError, exc_str_size_mismatch,
+ "sequence", attr->comp_len, PySequence_Fast_GET_SIZE(seq_fast_item));
+ ok = false;
+ Py_DECREF(seq_fast_item);
+ goto finally;
+ }
+
+ /* May trigger error, check below */
+ fill_format_sequence(data, seq_fast_item, attr);
+ Py_DECREF(seq_fast_item);
+ }
+ }
+
+ if (PyErr_Occurred()) {
+ ok = false;
+ }
+
+finally:
+
+ Py_DECREF(seq_fast);
+ }
+ return ok;
+}
+
+static int bpygpu_attr_fill(GPUVertBuf *buf, int id, PyObject *py_seq_data, const char *error_prefix)
+{
+ if (id < 0 || id >= buf->format.attr_len) {
+ PyErr_Format(PyExc_ValueError,
+ "Format id %d out of range",
+ id);
+ return 0;
+ }
+
+ if (buf->data == NULL) {
+ PyErr_SetString(PyExc_ValueError,
+ "Can't fill, static buffer already in use");
+ return 0;
+ }
+
+ if (!bpygpu_vertbuf_fill_impl(buf, (uint)id, py_seq_data, error_prefix)) {
+ return 0;
+ }
+
+ return 1;
+}
+
+
+/** \} */
+
+
+/* -------------------------------------------------------------------- */
+
+/** \name VertBuf Type
+ * \{ */
+
+static PyObject *bpygpu_VertBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
+{
+ struct {
+ PyObject *py_fmt;
+ uint len;
+ } params;
+
+ static const char *_keywords[] = {"format", "len", NULL};
+ static _PyArg_Parser _parser = {"O!I:GPUVertBuf.__new__", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(
+ args, kwds, &_parser,
+ &BPyGPUVertFormat_Type, &params.py_fmt,
+ &params.len))
+ {
+ return NULL;
+ }
+
+ const GPUVertFormat *fmt = &((BPyGPUVertFormat *)params.py_fmt)->fmt;
+ GPUVertBuf *vbo = GPU_vertbuf_create_with_format(fmt);
+
+ GPU_vertbuf_data_alloc(vbo, params.len);
+
+ return BPyGPUVertBuf_CreatePyObject(vbo);
+}
+
+PyDoc_STRVAR(bpygpu_VertBuf_attr_fill_doc,
+"attr_fill(id, data)\n"
+"\n"
+" Insert data into the buffer for a single attribute.\n"
+"\n"
+" :param id: Either the name or the id of the attribute.\n"
+" :type id: int or str\n"
+" :param data: Sequence of data that should be stored in the buffer\n"
+" :type data: sequence of individual values or tuples\n"
+);
+static PyObject *bpygpu_VertBuf_attr_fill(BPyGPUVertBuf *self, PyObject *args, PyObject *kwds)
+{
+ PyObject *data;
+ PyObject *identifier;
+
+ static const char *_keywords[] = {"id", "data", NULL};
+ static _PyArg_Parser _parser = {"OO:attr_fill", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(
+ args, kwds, &_parser,
+ &identifier, &data))
+ {
+ return NULL;
+ }
+
+ int id;
+
+ if (PyLong_Check(identifier)) {
+ id = PyLong_AsLong(identifier);
+ }
+ else if (PyUnicode_Check(identifier)) {
+ const char *name = PyUnicode_AsUTF8(identifier);
+ id = GPU_vertformat_attr_id_get(&self->buf->format, name);
+ if (id == -1) {
+ PyErr_SetString(PyExc_ValueError,
+ "Unknown attribute name");
+ return NULL;
+ }
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError,
+ "expected int or str type as identifier");
+ return NULL;
+ }
+
+
+ if (!bpygpu_attr_fill(self->buf, id, data, "GPUVertBuf.attr_fill")) {
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
+
+
+static struct PyMethodDef bpygpu_VertBuf_methods[] = {
+ {"attr_fill", (PyCFunction) bpygpu_VertBuf_attr_fill,
+ METH_VARARGS | METH_KEYWORDS, bpygpu_VertBuf_attr_fill_doc},
+ {NULL, NULL, 0, NULL}
+};
+
+static void bpygpu_VertBuf_dealloc(BPyGPUVertBuf *self)
+{
+ GPU_vertbuf_discard(self->buf);
+ Py_TYPE(self)->tp_free(self);
+}
+
+PyDoc_STRVAR(py_gpu_vertex_buffer_doc,
+"GPUVertBuf(len, format)\n"
+"\n"
+"Contains a VBO."
+"\n"
+" :param len: number of elements to allocate\n"
+" :type type: `int`\n"
+" :param format: Vertex format.\n"
+" :type buf: `gpu.types.GPUVertFormat`\n"
+);
+PyTypeObject BPyGPUVertBuf_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = "GPUVertBuf",
+ .tp_basicsize = sizeof(BPyGPUVertBuf),
+ .tp_dealloc = (destructor)bpygpu_VertBuf_dealloc,
+ .tp_flags = Py_TPFLAGS_DEFAULT,
+ .tp_doc = py_gpu_vertex_buffer_doc,
+ .tp_methods = bpygpu_VertBuf_methods,
+ .tp_new = bpygpu_VertBuf_new,
+};
+
+/** \} */
+
+
+/* -------------------------------------------------------------------- */
+
+/** \name Public API
+ * \{ */
+
+PyObject *BPyGPUVertBuf_CreatePyObject(GPUVertBuf *buf)
+{
+ BPyGPUVertBuf *self;
+
+ self = PyObject_New(BPyGPUVertBuf, &BPyGPUVertBuf_Type);
+ self->buf = buf;
+
+ return (PyObject *)self;
+}
+
+/** \} */
diff --git a/source/blender/python/gpu/gpu_py_vertex_buffer.h b/source/blender/python/gpu/gpu_py_vertex_buffer.h
new file mode 100644
index 00000000000..6751956298c
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_vertex_buffer.h
@@ -0,0 +1,42 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/gpu/gpu_py_vertex_buffer.h
+ * \ingroup bpygpu
+ */
+
+#ifndef __GPU_PY_VERTEX_BUFFER_H__
+#define __GPU_PY_VERTEX_BUFFER_H__
+
+#include "BLI_compiler_attrs.h"
+
+extern PyTypeObject BPyGPUVertBuf_Type;
+
+#define BPyGPUVertBuf_Check(v) (Py_TYPE(v) == &BPyGPUVertBuf_Type)
+
+typedef struct BPyGPUVertBuf {
+ PyObject_VAR_HEAD
+ /* The buf is owned, we may support thin wrapped batches later. */
+ struct GPUVertBuf *buf;
+} BPyGPUVertBuf;
+
+PyObject *BPyGPUVertBuf_CreatePyObject(struct GPUVertBuf *vbo) ATTR_NONNULL(1);
+
+#endif /* __GPU_PY_VERTEX_BUFFER_H__ */
diff --git a/source/blender/python/gpu/gpu_py_vertex_format.c b/source/blender/python/gpu/gpu_py_vertex_format.c
new file mode 100644
index 00000000000..0f863d04227
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_vertex_format.c
@@ -0,0 +1,242 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/gpu/gpu_py_vertex_format.c
+ * \ingroup bpygpu
+ *
+ * - Use ``bpygpu_`` for local API.
+ * - Use ``BPyGPU`` for public API.
+ */
+
+#include <Python.h>
+
+#include "BLI_math.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "../generic/py_capi_utils.h"
+#include "../generic/python_utildefines.h"
+
+#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 bpygpu_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 bpygpu_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 bpygpu_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;
+ }
+
+ int comp_type = bpygpu_parse_component_type(str, length);
+ if (comp_type == -1) {
+ PyErr_Format(PyExc_ValueError,
+ "unkown component type: '%s",
+ str);
+ return 0;
+ }
+
+ *((GPUVertCompType *)p) = comp_type;
+ return 1;
+}
+
+static int bpygpu_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;
+ }
+
+ int fetch_mode = bpygpu_parse_fetch_mode(str, length);
+ if (fetch_mode == -1) {
+ PyErr_Format(PyExc_ValueError,
+ "unknown type literal: '%s'",
+ str);
+ return 0;
+ }
+
+ (*(GPUVertFetchMode *)p) = fetch_mode;
+ return 1;
+}
+
+/** \} */
+
+
+/* -------------------------------------------------------------------- */
+
+/** \name VertFormat Type
+ * \{ */
+
+static PyObject *bpygpu_VertFormat_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");
+ return NULL;
+ }
+ return BPyGPUVertFormat_CreatePyObject(NULL);
+}
+
+PyDoc_STRVAR(bpygpu_VertFormat_attr_add_doc,
+"TODO"
+);
+static PyObject *bpygpu_VertFormat_attr_add(BPyGPUVertFormat *self, PyObject *args, PyObject *kwds)
+{
+ struct {
+ const char *id;
+ GPUVertCompType comp_type;
+ uint len;
+ GPUVertFetchMode fetch_mode;
+ } params;
+
+ if (self->fmt.attr_len == GPU_VERT_ATTR_MAX_LEN) {
+ PyErr_SetString(PyExc_ValueError, "Maxumum attr reached " STRINGIFY(GPU_VERT_ATTR_MAX_LEN));
+ return NULL;
+ }
+
+ static const char *_keywords[] = {"id", "comp_type", "len", "fetch_mode", NULL};
+ static _PyArg_Parser _parser = {"$sO&IO&:attr_add", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(
+ args, kwds, &_parser,
+ &params.id,
+ bpygpu_ParseVertCompType, &params.comp_type,
+ &params.len,
+ bpygpu_ParseVertFetchMode, &params.fetch_mode))
+ {
+ return NULL;
+ }
+
+ uint attr_id = GPU_vertformat_attr_add(&self->fmt, params.id, params.comp_type, params.len, params.fetch_mode);
+ return PyLong_FromLong(attr_id);
+}
+
+static struct PyMethodDef bpygpu_VertFormat_methods[] = {
+ {"attr_add", (PyCFunction)bpygpu_VertFormat_attr_add,
+ METH_VARARGS | METH_KEYWORDS, bpygpu_VertFormat_attr_add_doc},
+ {NULL, NULL, 0, NULL}
+};
+
+
+static void bpygpu_VertFormat_dealloc(BPyGPUVertFormat *self)
+{
+ Py_TYPE(self)->tp_free(self);
+}
+
+PyTypeObject BPyGPUVertFormat_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = "GPUVertFormat",
+ .tp_basicsize = sizeof(BPyGPUVertFormat),
+ .tp_dealloc = (destructor)bpygpu_VertFormat_dealloc,
+ .tp_flags = Py_TPFLAGS_DEFAULT,
+ .tp_methods = bpygpu_VertFormat_methods,
+ .tp_new = bpygpu_VertFormat_new,
+};
+
+/** \} */
+
+
+/* -------------------------------------------------------------------- */
+
+/** \name Public API
+ * \{ */
+
+PyObject *BPyGPUVertFormat_CreatePyObject(GPUVertFormat *fmt)
+{
+ BPyGPUVertFormat *self;
+
+ self = PyObject_New(BPyGPUVertFormat, &BPyGPUVertFormat_Type);
+ if (fmt) {
+ self->fmt = *fmt;
+ }
+ else {
+ memset(&self->fmt, 0, sizeof(self->fmt));
+ }
+
+ return (PyObject *)self;
+}
+
+/** \} */
diff --git a/source/blender/python/gpu/gpu_py_vertex_format.h b/source/blender/python/gpu/gpu_py_vertex_format.h
new file mode 100644
index 00000000000..5b0bf1addc2
--- /dev/null
+++ b/source/blender/python/gpu/gpu_py_vertex_format.h
@@ -0,0 +1,41 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/gpu/gpu_py_vertex_format.h
+ * \ingroup bpygpu
+ */
+
+#ifndef __GPU_PY_VERTEX_FORMAT_H__
+#define __GPU_PY_VERTEX_FORMAT_H__
+
+#include "GPU_vertex_format.h"
+
+extern PyTypeObject BPyGPUVertFormat_Type;
+
+#define BPyGPUVertFormat_Check(v) (Py_TYPE(v) == &BPyGPUVertFormat_Type)
+
+typedef struct BPyGPUVertFormat {
+ PyObject_VAR_HEAD
+ struct GPUVertFormat fmt;
+} BPyGPUVertFormat;
+
+PyObject *BPyGPUVertFormat_CreatePyObject(struct GPUVertFormat *fmt);
+
+#endif /* __GPU_PY_VERTEX_FORMAT_H__ */
diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt
index 3255fb49667..b561504505b 100644
--- a/source/blender/python/intern/CMakeLists.txt
+++ b/source/blender/python/intern/CMakeLists.txt
@@ -82,10 +82,6 @@ set(SRC
bpy_traceback.c
bpy_utils_previews.c
bpy_utils_units.c
- gpu.c
- gpu_offscreen.c
- gpu_py_matrix.c
- gpu_py_select.c
stubs.c
bpy.h
@@ -120,7 +116,6 @@ set(SRC
bpy_traceback.h
bpy_utils_previews.h
bpy_utils_units.h
- gpu.h
../BPY_extern.h
../BPY_extern_clog.h
)
@@ -175,6 +170,10 @@ if(WITH_CYCLES_OSL)
add_definitions(-DWITH_CYCLES_OSL)
endif()
+if(WITH_CYCLES_EMBREE)
+ add_definitions(-DWITH_CYCLES_EMBREE)
+endif()
+
if(WITH_FREESTYLE)
list(APPEND INC
../../freestyle/intern/python
diff --git a/source/blender/python/intern/bpy_app.c b/source/blender/python/intern/bpy_app.c
index 03662102bbc..aadbb57f932 100644
--- a/source/blender/python/intern/bpy_app.c
+++ b/source/blender/python/intern/bpy_app.c
@@ -55,6 +55,7 @@
#include "BKE_appdir.h"
#include "BKE_blender_version.h"
#include "BKE_global.h"
+#include "BKE_library_override.h"
#include "DNA_ID.h"
@@ -240,13 +241,13 @@ PyDoc_STRVAR(bpy_app_debug_doc,
);
static PyObject *bpy_app_debug_get(PyObject *UNUSED(self), void *closure)
{
- const int flag = GET_INT_FROM_POINTER(closure);
+ const int flag = POINTER_AS_INT(closure);
return PyBool_FromLong(G.debug & flag);
}
static int bpy_app_debug_set(PyObject *UNUSED(self), PyObject *value, void *closure)
{
- const int flag = GET_INT_FROM_POINTER(closure);
+ const int flag = POINTER_AS_INT(closure);
const int param = PyObject_IsTrue(value);
if (param == -1) {
@@ -315,12 +316,6 @@ static int bpy_app_debug_value_set(PyObject *UNUSED(self), PyObject *value, void
return 0;
}
-static PyObject *bpy_app_global_flag_get(PyObject *UNUSED(self), void *closure)
-{
- const int flag = GET_INT_FROM_POINTER(closure);
- return PyBool_FromLong(G.f & flag);
-}
-
PyDoc_STRVAR(bpy_app_tempdir_doc,
"String, the temp directory used by blender (read-only)"
);
@@ -349,12 +344,29 @@ PyDoc_STRVAR(bpy_app_preview_render_size_doc,
);
static PyObject *bpy_app_preview_render_size_get(PyObject *UNUSED(self), void *closure)
{
- return PyLong_FromLong((long)UI_preview_render_size(GET_INT_FROM_POINTER(closure)));
+ return PyLong_FromLong((long)UI_preview_render_size(POINTER_AS_INT(closure)));
}
-static PyObject *bpy_app_autoexec_fail_message_get(PyObject *UNUSED(self), void *UNUSED(closure))
+PyDoc_STRVAR(bpy_app_use_static_override_doc,
+"Boolean, whether static override is exposed in UI or not."
+);
+static PyObject *bpy_app_use_static_override_get(PyObject *UNUSED(self), void *UNUSED(closure))
{
- return PyC_UnicodeFromByte(G.autoexec_fail);
+ return PyBool_FromLong((long)BKE_override_static_is_enabled());
+}
+
+static int bpy_app_use_static_override_set(PyObject *UNUSED(self), PyObject *value, void *UNUSED(closure))
+{
+ const int param = PyC_Long_AsBool(value);
+
+ if (param == -1 && PyErr_Occurred()) {
+ PyErr_SetString(PyExc_TypeError, "bpy.app.use_static_override must be a boolean");
+ return -1;
+ }
+
+ BKE_override_static_enable((const bool)param);
+
+ return 0;
}
@@ -374,6 +386,9 @@ static PyGetSetDef bpy_app_getsets[] = {
{(char *)"debug_depsgraph_pretty", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_DEPSGRAPH_PRETTY},
{(char *)"debug_simdata", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_SIMDATA},
{(char *)"debug_gpumem", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_GPU_MEM},
+ {(char *)"debug_io", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_IO},
+
+ {(char *)"use_static_override", bpy_app_use_static_override_get, bpy_app_use_static_override_set, (char *)bpy_app_use_static_override_doc, NULL},
{(char *)"binary_path_python", bpy_app_binary_path_python_get, NULL, (char *)bpy_app_binary_path_python_doc, NULL},
@@ -384,10 +399,6 @@ static PyGetSetDef bpy_app_getsets[] = {
{(char *)"render_icon_size", bpy_app_preview_render_size_get, NULL, (char *)bpy_app_preview_render_size_doc, (void *)ICON_SIZE_ICON},
{(char *)"render_preview_size", bpy_app_preview_render_size_get, NULL, (char *)bpy_app_preview_render_size_doc, (void *)ICON_SIZE_PREVIEW},
- /* security */
- {(char *)"autoexec_fail", bpy_app_global_flag_get, NULL, NULL, (void *)G_SCRIPT_AUTOEXEC_FAIL},
- {(char *)"autoexec_fail_quiet", bpy_app_global_flag_get, NULL, NULL, (void *)G_SCRIPT_AUTOEXEC_FAIL_QUIET},
- {(char *)"autoexec_fail_message", bpy_app_autoexec_fail_message_get, NULL, NULL, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
diff --git a/source/blender/python/intern/bpy_app_handlers.c b/source/blender/python/intern/bpy_app_handlers.c
index 883c627abed..b975a921ea0 100644
--- a/source/blender/python/intern/bpy_app_handlers.c
+++ b/source/blender/python/intern/bpy_app_handlers.c
@@ -236,7 +236,7 @@ PyObject *BPY_app_handlers_struct(void)
funcstore = &funcstore_array[pos];
funcstore->func = bpy_app_generic_callback;
funcstore->alloc = 0;
- funcstore->arg = SET_INT_IN_POINTER(pos);
+ funcstore->arg = POINTER_FROM_INT(pos);
BLI_callback_add(funcstore, pos);
}
}
@@ -295,7 +295,7 @@ void BPY_app_handlers_reset(const short do_all)
/* the actual callback - not necessarily called from py */
void bpy_app_generic_callback(struct Main *UNUSED(main), struct ID *id, void *arg)
{
- PyObject *cb_list = py_cb_array[GET_INT_FROM_POINTER(arg)];
+ PyObject *cb_list = py_cb_array[POINTER_AS_INT(arg)];
if (PyList_GET_SIZE(cb_list) > 0) {
PyGILState_STATE gilstate = PyGILState_Ensure();
diff --git a/source/blender/python/intern/bpy_app_icons.c b/source/blender/python/intern/bpy_app_icons.c
index 4bd059dd295..12315a6e112 100644
--- a/source/blender/python/intern/bpy_app_icons.c
+++ b/source/blender/python/intern/bpy_app_icons.c
@@ -101,8 +101,8 @@ PyDoc_STRVAR(bpy_app_icons_new_triangles_from_file_doc,
"\n"
" Create a new icon from triangle geometry.\n"
"\n"
-" :arg range: File path.\n"
-" :type range: string.\n"
+" :arg filename: File path.\n"
+" :type filename: string.\n"
" :return: Unique icon value (pass to interface ``icon_value`` argument).\n"
" :rtype: int\n"
);
@@ -177,7 +177,11 @@ static struct PyModuleDef M_AppIcons_module_def = {
PyObject *BPY_app_icons_module(void)
{
+ PyObject *sys_modules = PyImport_GetModuleDict();
+
PyObject *mod = PyModule_Create(&M_AppIcons_module_def);
+ PyDict_SetItem(sys_modules, PyModule_GetNameObject(mod), mod);
+
return mod;
}
diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c
index a94708c0602..f098a28d679 100644
--- a/source/blender/python/intern/bpy_driver.c
+++ b/source/blender/python/intern/bpy_driver.c
@@ -549,7 +549,7 @@ float BPY_driver_exec(struct PathResolvedRNA *anim_rna, ChannelDriver *driver, C
}
#ifdef USE_BYTECODE_WHITELIST
- if (is_recompile) {
+ if (is_recompile && expr_code) {
if (!(G.f & G_SCRIPT_AUTOEXEC)) {
if (!bpy_driver_secure_bytecode_validate(
expr_code, (PyObject *[]){
@@ -601,7 +601,7 @@ float BPY_driver_exec(struct PathResolvedRNA *anim_rna, ChannelDriver *driver, C
return (float)result;
}
else {
- fprintf(stderr, "\tBPY_driver_eval() - driver '%s' evaluates to '%f'\n", dvar->name, result);
+ fprintf(stderr, "\tBPY_driver_eval() - driver '%s' evaluates to '%f'\n", driver->expression, result);
return 0.0f;
}
}
diff --git a/source/blender/python/intern/bpy_gizmo_wrap.c b/source/blender/python/intern/bpy_gizmo_wrap.c
index 2a932cb6a99..411822ee4da 100644
--- a/source/blender/python/intern/bpy_gizmo_wrap.c
+++ b/source/blender/python/intern/bpy_gizmo_wrap.c
@@ -192,37 +192,30 @@ void BPY_RNA_gizmo_wrapper(wmGizmoType *gzt, void *userdata)
static void gizmogroup_properties_init(wmGizmoGroupType *gzgt)
{
-#ifdef USE_SRNA
PyTypeObject *py_class = gzgt->ext.data;
-#endif
RNA_struct_blender_type_set(gzgt->ext.srna, gzgt);
-#ifdef USE_SRNA
/* only call this so pyrna_deferred_register_class gives a useful error
* WM_operatortype_append_ptr will call RNA_def_struct_identifier
* later */
- RNA_def_struct_identifier(gzgt->srna, gzgt->idname);
+ RNA_def_struct_identifier_no_struct_map(gzgt->srna, gzgt->idname);
if (pyrna_deferred_register_class(gzgt->srna, py_class) != 0) {
PyErr_Print(); /* failed to register operator props */
PyErr_Clear();
}
-#endif
}
void BPY_RNA_gizmogroup_wrapper(wmGizmoGroupType *gzgt, void *userdata)
{
/* take care not to overwrite anything set in
* WM_gizmomaptype_group_link_ptr before opfunc() is called */
-#ifdef USE_SRNA
StructRNA *srna = gzgt->srna;
-#endif
*gzgt = *((wmGizmoGroupType *)userdata);
-#ifdef USE_SRNA
gzgt->srna = srna; /* restore */
-#endif
-#ifdef USE_SRNA
+ /* don't do translations here yet */
+#if 0
/* Use i18n context from ext.srna if possible (py gizmogroups). */
if (gzgt->ext.srna) {
RNA_def_struct_translation_context(gzgt->srna, RNA_struct_translation_context(gzgt->ext.srna));
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index 5a908f866a0..e17e7562f2a 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -46,7 +46,6 @@
#include "RNA_types.h"
#include "bpy.h"
-#include "gpu.h"
#include "bpy_rna.h"
#include "bpy_path.h"
#include "bpy_capi_utils.h"
@@ -59,9 +58,9 @@
#include "BKE_appdir.h"
#include "BKE_context.h"
-#include "BKE_text.h"
-#include "BKE_main.h"
#include "BKE_global.h" /* only for script checking */
+#include "BKE_main.h"
+#include "BKE_text.h"
#include "CCL_api.h"
@@ -219,7 +218,6 @@ static struct _inittab bpy_internal_modules[] = {
{"mathutils.kdtree", PyInit_mathutils_kdtree},
#endif
{"_bpy_path", BPyInit__bpy_path},
- {"_gpu", BPyInit_gpu},
{"bgl", BPyInit_bgl},
{"blf", BPyInit_blf},
{"imbuf", BPyInit_imbuf},
@@ -235,7 +233,7 @@ static struct _inittab bpy_internal_modules[] = {
#ifdef WITH_CYCLES
{"_cycles", CCL_initPython},
#endif
- {"gpu", GPU_initPython},
+ {"gpu", BPyInit_gpu},
{"idprop", BPyInit_idprop},
{NULL, NULL}
};
@@ -540,7 +538,7 @@ static bool python_script_exec(
if (py_dict) {
#ifdef PYMODULE_CLEAR_WORKAROUND
PyModuleObject *mmod = (PyModuleObject *)PyDict_GetItem(
- PyThreadState_GET()->interp->modules, bpy_intern_str___main__);
+ PyImport_GetModuleDict(), bpy_intern_str___main__);
PyObject *dict_back = mmod->md_dict;
/* freeing the module will clear the namespace,
* gives problems running classes defined in this namespace being used later. */
@@ -591,7 +589,9 @@ void BPY_DECREF_RNA_INVALIDATE(void *pyob_ptr)
/**
* \return success
*/
-bool BPY_execute_string_as_number(bContext *C, const char *expr, const bool verbose, double *r_value)
+bool BPY_execute_string_as_number(
+ bContext *C, const char *imports[],
+ const char *expr, const bool verbose, double *r_value)
{
PyGILState_STATE gilstate;
bool ok = true;
@@ -607,7 +607,7 @@ bool BPY_execute_string_as_number(bContext *C, const char *expr, const bool verb
bpy_context_set(C, &gilstate);
- ok = PyC_RunString_AsNumber(expr, "<blender button>", r_value);
+ ok = PyC_RunString_AsNumber(imports, expr, "<expr as number>", r_value);
if (ok == false) {
if (verbose) {
@@ -626,7 +626,9 @@ bool BPY_execute_string_as_number(bContext *C, const char *expr, const bool verb
/**
* \return success
*/
-bool BPY_execute_string_as_string(bContext *C, const char *expr, const bool verbose, char **r_value)
+bool BPY_execute_string_as_string(
+ bContext *C, const char *imports[],
+ const char *expr, const bool verbose, char **r_value)
{
BLI_assert(r_value && expr);
PyGILState_STATE gilstate;
@@ -639,7 +641,7 @@ bool BPY_execute_string_as_string(bContext *C, const char *expr, const bool verb
bpy_context_set(C, &gilstate);
- ok = PyC_RunString_AsString(expr, "<blender button>", r_value);
+ ok = PyC_RunString_AsString(imports, expr, "<expr as str>", r_value);
if (ok == false) {
if (verbose) {
@@ -660,7 +662,9 @@ bool BPY_execute_string_as_string(bContext *C, const char *expr, const bool verb
*
* \return success
*/
-bool BPY_execute_string_as_intptr(bContext *C, const char *expr, const bool verbose, intptr_t *r_value)
+bool BPY_execute_string_as_intptr(
+ bContext *C, const char *imports[],
+ const char *expr, const bool verbose, intptr_t *r_value)
{
BLI_assert(r_value && expr);
PyGILState_STATE gilstate;
@@ -673,7 +677,7 @@ bool BPY_execute_string_as_intptr(bContext *C, const char *expr, const bool verb
bpy_context_set(C, &gilstate);
- ok = PyC_RunString_AsIntPtr(expr, "<blender button>", r_value);
+ ok = PyC_RunString_AsIntPtr(imports, expr, "<expr as intptr>", r_value);
if (ok == false) {
if (verbose) {
@@ -689,7 +693,9 @@ bool BPY_execute_string_as_intptr(bContext *C, const char *expr, const bool verb
return ok;
}
-bool BPY_execute_string_ex(bContext *C, const char *expr, bool use_eval)
+bool BPY_execute_string_ex(
+ bContext *C, const char *imports[],
+ const char *expr, bool use_eval)
{
BLI_assert(expr);
PyGILState_STATE gilstate;
@@ -711,13 +717,18 @@ bool BPY_execute_string_ex(bContext *C, const char *expr, bool use_eval)
bmain_back = bpy_import_main_get();
bpy_import_main_set(CTX_data_main(C));
- retval = PyRun_String(expr, use_eval ? Py_eval_input : Py_file_input, py_dict, py_dict);
+ if (imports && (!PyC_NameSpace_ImportArray(py_dict, imports))) {
+ Py_DECREF(py_dict);
+ retval = NULL;
+ }
+ else {
+ retval = PyRun_String(expr, use_eval ? Py_eval_input : Py_file_input, py_dict, py_dict);
+ }
bpy_import_main_set(bmain_back);
if (retval == NULL) {
ok = false;
-
BPy_errors_to_report(CTX_wm_reports(C));
}
else {
@@ -731,9 +742,11 @@ bool BPY_execute_string_ex(bContext *C, const char *expr, bool use_eval)
return ok;
}
-bool BPY_execute_string(bContext *C, const char *expr)
+bool BPY_execute_string(
+ bContext *C, const char *imports[],
+ const char *expr)
{
- return BPY_execute_string_ex(C, expr, true);
+ return BPY_execute_string_ex(C, imports, expr, true);
}
void BPY_modules_load_user(bContext *C)
@@ -991,7 +1004,7 @@ bool BPY_string_is_keyword(const char *str)
*/
const char *kwlist[] = {
"False", "None", "True",
- "and", "as", "assert", "break",
+ "and", "as", "assert", "async", "await", "break",
"class", "continue", "def", "del", "elif", "else", "except",
"finally", "for", "from", "global", "if", "import", "in",
"is", "lambda", "nonlocal", "not", "or", "pass", "raise",
diff --git a/source/blender/python/intern/bpy_library_load.c b/source/blender/python/intern/bpy_library_load.c
index d60c44e702a..f9cd3338cde 100644
--- a/source/blender/python/intern/bpy_library_load.c
+++ b/source/blender/python/intern/bpy_library_load.c
@@ -38,11 +38,11 @@
#include "BLI_linklist.h"
#include "BLI_path_util.h"
-#include "BKE_main.h"
-#include "BKE_library.h"
+#include "BKE_context.h"
#include "BKE_idcode.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_report.h"
-#include "BKE_context.h"
#include "DNA_space_types.h" /* FILE_LINK, FILE_RELPATH */
diff --git a/source/blender/python/intern/bpy_library_write.c b/source/blender/python/intern/bpy_library_write.c
index 76b7ccf72fa..07a81a3bddb 100644
--- a/source/blender/python/intern/bpy_library_write.c
+++ b/source/blender/python/intern/bpy_library_write.c
@@ -34,7 +34,6 @@
#include "BLI_string.h"
#include "BLI_path_util.h"
-#include "BKE_library.h"
#include "BKE_blendfile.h"
#include "BKE_global.h"
#include "BKE_main.h"
diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c
index 4652da2018c..d3abaf43aef 100644
--- a/source/blender/python/intern/bpy_operator.c
+++ b/source/blender/python/intern/bpy_operator.c
@@ -64,6 +64,21 @@
/* so operators called can spawn threads which acquire the GIL */
#define BPY_RELEASE_GIL
+static wmOperatorType *ot_lookup_from_py_string(PyObject *value, const char *py_fn_id)
+{
+ const char *opname = _PyUnicode_AsString(value);
+ if (opname == NULL) {
+ PyErr_Format(PyExc_TypeError, "%s() expects a string argument", py_fn_id);
+ return NULL;
+ }
+
+ wmOperatorType *ot = WM_operatortype_find(opname, true);
+ if (ot == NULL) {
+ PyErr_Format(PyExc_KeyError, "%s(\"%s\") not found", py_fn_id, opname);
+ return NULL;
+ }
+ return ot;
+}
static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args)
{
@@ -124,7 +139,7 @@ static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args)
CTX_py_dict_set(C, (void *)context_dict);
Py_XINCREF(context_dict); /* so we done loose it */
- /* main purpose of thsi function */
+ /* main purpose of this function */
ret = WM_operator_poll_context((bContext *)C, ot, context) ? Py_True : Py_False;
/* restore with original context dict, probably NULL but need this for nested operator calls */
@@ -394,73 +409,16 @@ static PyObject *pyop_dir(PyObject *UNUSED(self))
return list;
}
-static PyObject *pyop_getrna(PyObject *UNUSED(self), PyObject *value)
+static PyObject *pyop_getrna_type(PyObject *UNUSED(self), PyObject *value)
{
wmOperatorType *ot;
- PointerRNA ptr;
- const char *opname = _PyUnicode_AsString(value);
- BPy_StructRNA *pyrna = NULL;
-
- if (opname == NULL) {
- PyErr_SetString(PyExc_TypeError, "_bpy.ops.get_rna() expects a string argument");
- return NULL;
- }
- ot = WM_operatortype_find(opname, true);
- if (ot == NULL) {
- PyErr_Format(PyExc_KeyError, "_bpy.ops.get_rna(\"%s\") not found", opname);
+ if ((ot = ot_lookup_from_py_string(value, "get_rna_type")) == NULL) {
return NULL;
}
- /* type */
- //RNA_pointer_create(NULL, &RNA_Struct, ot->srna, &ptr);
-
- /* XXX - should call WM_operator_properties_free */
- WM_operator_properties_create_ptr(&ptr, ot);
- WM_operator_properties_sanitize(&ptr, 0);
-
-
- pyrna = (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr);
-#ifdef PYRNA_FREE_SUPPORT
- pyrna->freeptr = true;
-#endif
- return (PyObject *)pyrna;
-}
-
-static PyObject *pyop_getinstance(PyObject *UNUSED(self), PyObject *value)
-{
- wmOperatorType *ot;
- wmOperator *op;
PointerRNA ptr;
- const char *opname = _PyUnicode_AsString(value);
- BPy_StructRNA *pyrna = NULL;
-
- if (opname == NULL) {
- PyErr_SetString(PyExc_TypeError, "_bpy.ops.get_instance() expects a string argument");
- return NULL;
- }
- ot = WM_operatortype_find(opname, true);
- if (ot == NULL) {
- PyErr_Format(PyExc_KeyError, "_bpy.ops.get_instance(\"%s\") not found", opname);
- return NULL;
- }
-
-#ifdef PYRNA_FREE_SUPPORT
- op = MEM_callocN(sizeof(wmOperator), __func__);
-#else
- op = PyMem_MALLOC(sizeof(wmOperator));
- memset(op, 0, sizeof(wmOperator));
-#endif
- BLI_strncpy(op->idname, ot->idname, sizeof(op->idname)); /* in case its needed */
- op->type = ot;
-
- RNA_pointer_create(NULL, &RNA_Operator, op, &ptr);
-
- pyrna = (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr);
-#ifdef PYRNA_FREE_SUPPORT
- pyrna->freeptr = true;
-#endif
- op->ptr = &pyrna->ptr;
-
+ RNA_pointer_create(NULL, &RNA_Struct, ot->srna, &ptr);
+ BPy_StructRNA *pyrna = (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr);
return (PyObject *)pyrna;
}
@@ -469,8 +427,7 @@ static struct PyMethodDef bpy_ops_methods[] = {
{"call", (PyCFunction) pyop_call, METH_VARARGS, NULL},
{"as_string", (PyCFunction) pyop_as_string, METH_VARARGS, NULL},
{"dir", (PyCFunction) pyop_dir, METH_NOARGS, NULL},
- {"get_rna", (PyCFunction) pyop_getrna, METH_O, NULL}, /* only for introspection, leaks memory */
- {"get_instance", (PyCFunction) pyop_getinstance, METH_O, NULL}, /* only for introspection, leaks memory */
+ {"get_rna_type", (PyCFunction) pyop_getrna_type, METH_O, NULL},
{"macro_define", (PyCFunction) PYOP_wrap_macro_define, METH_VARARGS, NULL},
{NULL, NULL, 0, NULL}
};
diff --git a/source/blender/python/intern/bpy_path.c b/source/blender/python/intern/bpy_path.c
index f182972ba9c..53d8f8ea954 100644
--- a/source/blender/python/intern/bpy_path.c
+++ b/source/blender/python/intern/bpy_path.c
@@ -23,7 +23,7 @@
/** \file blender/python/intern/bpy_path.c
* \ingroup pythonintern
*
- * This file defines '_bpy_path' module, Some 'C' funtionality used by 'bpy.path'
+ * This file defines '_bpy_path' module, Some 'C' functionality used by 'bpy.path'
*/
#include <Python.h>
diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c
index 9b74b551b20..fef3a0703d2 100644
--- a/source/blender/python/intern/bpy_props.c
+++ b/source/blender/python/intern/bpy_props.c
@@ -1904,7 +1904,7 @@ static void bpy_prop_callback_assign_enum(struct PropertyRNA *prop, PyObject *ge
" :type description: string\n" \
#define BPY_PROPDEF_UNIT_DOC \
-" :arg unit: Enumerator in ['NONE', 'LENGTH', 'AREA', 'VOLUME', 'ROTATION', 'TIME', 'VELOCITY', 'ACCELERATION'].\n" \
+" :arg unit: Enumerator in ['NONE', 'LENGTH', 'AREA', 'VOLUME', 'ROTATION', 'TIME', 'VELOCITY', 'ACCELERATION', 'MASS', 'CAMERA'].\n" \
" :type unit: string\n" \
#define BPY_PROPDEF_NUM_MIN_DOC \
@@ -3203,11 +3203,6 @@ PyObject *BPY_rna_props(void)
submodule = PyModule_Create(&props_module);
PyDict_SetItemString(PyImport_GetModuleDict(), props_module.m_name, submodule);
- /* INCREF since its its assumed that all these functions return the
- * module with a new ref like PyDict_New, since they are passed to
- * PyModule_AddObject which steals a ref */
- Py_INCREF(submodule);
-
/* api needs the PyObjects internally */
submodule_dict = PyModule_GetDict(submodule);
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index 9de9f6179d6..b4020c9fc8f 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -1729,7 +1729,25 @@ static int pyrna_py_to_prop(
const int subtype = RNA_property_subtype(prop);
const char *param;
- if (subtype == PROP_BYTESTRING) {
+ if (value == Py_None) {
+ if ((RNA_property_flag(prop) & PROP_NEVER_NULL) == 0) {
+ if (data) {
+ *((char **)data) = (char *)NULL;
+ }
+ else {
+ RNA_property_string_set(ptr, prop, NULL);
+ }
+ }
+ else {
+ PyC_Err_Format_Prefix(
+ PyExc_TypeError,
+ "%.200s %.200s.%.200s doesn't support None from string types",
+ error_prefix, RNA_struct_identifier(ptr->type),
+ RNA_property_identifier(prop));
+ return -1;
+ }
+ }
+ else if (subtype == PROP_BYTESTRING) {
/* Byte String */
@@ -2360,7 +2378,7 @@ static int pyrna_prop_collection_subscript_str_lib_pair_ptr(
}
else {
PyErr_Format(PyExc_KeyError,
- "%s: lib must be a sting or None, not %.200s",
+ "%s: lib must be a string or None, not %.200s",
err_prefix, Py_TYPE(keylib)->tp_name);
return -1;
}
@@ -4162,7 +4180,7 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr
* <bpy_struct, BoolProperty("foo")>
* ...rather than returning the deferred class register tuple as checked by pyrna_is_deferred_prop()
*
- * Disable for now, this is faking internal behavior in a way thats too tricky to maintain well. */
+ * 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)
StructRNA *srna = srna_from_self(cls, "StructRNA.__getattr__");
@@ -7437,15 +7455,17 @@ static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item
static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
{
- PyObject *fields_dict;
+ PyObject *annotations_dict;
PyObject *item, *key;
Py_ssize_t pos = 0;
int ret = 0;
/* in both cases PyDict_CheckExact(class_dict) will be true even
* though Operators have a metaclass dict namespace */
- if ((fields_dict = PyDict_GetItem(class_dict, bpy_intern_str___annotations__)) && PyDict_CheckExact(fields_dict)) {
- while (PyDict_Next(fields_dict, &pos, &key, &item)) {
+ if ((annotations_dict = PyDict_GetItem(class_dict, bpy_intern_str___annotations__)) &&
+ PyDict_CheckExact(annotations_dict))
+ {
+ while (PyDict_Next(annotations_dict, &pos, &key, &item)) {
ret = deferred_register_prop(srna, key, item);
if (ret != 0) {
@@ -7455,18 +7475,18 @@ static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
}
{
- /* This block can be removed once 2.8x is released and fields are in use. */
+ /* 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 properties which should be a field!\n",
+ "contains a properties which should be an annotation!\n",
RNA_struct_identifier(srna));
PyC_LineSpit();
has_warning = true;
}
- printf(" make field: %.200s.%.200s\n",
+ printf(" make annotation: %.200s.%.200s\n",
RNA_struct_identifier(srna), _PyUnicode_AsString(key));
}
ret = deferred_register_prop(srna, key, item);
@@ -8457,6 +8477,9 @@ typedef struct BPyRNA_CallBack {
static struct BPyRNA_CallBack pyrna_cb_methods[] = {
{{"draw_handler_add", (PyCFunction)pyrna_callback_classmethod_add, METH_VARARGS | METH_STATIC, ""}, &RNA_Space},
{{"draw_handler_remove", (PyCFunction)pyrna_callback_classmethod_remove, METH_VARARGS | METH_STATIC, ""}, &RNA_Space},
+
+ {{"draw_cursor_add", (PyCFunction)pyrna_callback_classmethod_add, METH_VARARGS | METH_STATIC, ""}, &RNA_WindowManager},
+ {{"draw_cursor_remove", (PyCFunction)pyrna_callback_classmethod_remove, METH_VARARGS | METH_STATIC, ""}, &RNA_WindowManager},
{{NULL, NULL, 0, NULL}, NULL}
};
diff --git a/source/blender/python/intern/bpy_rna_anim.c b/source/blender/python/intern/bpy_rna_anim.c
index 7012e04628c..3ba604d5271 100644
--- a/source/blender/python/intern/bpy_rna_anim.c
+++ b/source/blender/python/intern/bpy_rna_anim.c
@@ -275,7 +275,7 @@ PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA *self, PyObject *args, PyOb
BKE_reports_init(&reports, RPT_STORE);
- BLI_assert(BKE_id_is_in_gobal_main(id));
+ BLI_assert(BKE_id_is_in_global_main(id));
result = insert_keyframe(G_MAIN, depsgraph, &reports, id, NULL, group_name, path_full, index, cfra, keytype, options);
MEM_freeN((void *)path_full);
@@ -386,7 +386,7 @@ PyObject *pyrna_struct_keyframe_delete(BPy_StructRNA *self, PyObject *args, PyOb
BKE_reports_init(&reports, RPT_STORE);
- result = delete_keyframe(&reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0);
+ result = delete_keyframe(G.main, &reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0);
MEM_freeN((void *)path_full);
if (BPy_reports_to_error(&reports, PyExc_RuntimeError, true) == -1)
diff --git a/source/blender/python/intern/bpy_rna_callback.c b/source/blender/python/intern/bpy_rna_callback.c
index 7adb1d40fcc..3a20ba385c6 100644
--- a/source/blender/python/intern/bpy_rna_callback.c
+++ b/source/blender/python/intern/bpy_rna_callback.c
@@ -33,6 +33,7 @@
#include "RNA_types.h"
#include "BLI_utildefines.h"
+#include "BLI_listbase.h"
#include "bpy_rna.h"
#include "bpy_rna_callback.h"
@@ -47,8 +48,12 @@
#include "BKE_context.h"
#include "BKE_screen.h"
+#include "WM_api.h"
+
#include "ED_space_api.h"
+#include "../generic/python_utildefines.h"
+
/* use this to stop other capsules from being mis-used */
#define RNA_CAPSULE_ID "RNA_HANDLE"
#define RNA_CAPSULE_ID_INVALID "RNA_HANDLE_REMOVED"
@@ -82,6 +87,53 @@ static void cb_region_draw(const bContext *C, ARegion *UNUSED(ar), void *customd
bpy_context_clear((bContext *)C, &gilstate);
}
+/* We could make generic utility */
+static PyObject *PyC_Tuple_CopySized(PyObject *src, int len_dst)
+{
+ PyObject *dst = PyTuple_New(len_dst);
+ int len_src = PyTuple_GET_SIZE(src);
+ BLI_assert(len_src <= len_dst);
+ for (int i = 0; i < len_src; i++) {
+ PyObject *item = PyTuple_GET_ITEM(src, i);
+ PyTuple_SET_ITEM(dst, i, item);
+ Py_INCREF(item);
+ }
+ return dst;
+}
+
+static void cb_wm_cursor_draw(bContext *C, int x, int y, void *customdata)
+{
+ PyObject *cb_func, *cb_args, *result;
+ PyGILState_STATE gilstate;
+
+ bpy_context_set((bContext *)C, &gilstate);
+
+ cb_func = PyTuple_GET_ITEM((PyObject *)customdata, 1);
+ cb_args = PyTuple_GET_ITEM((PyObject *)customdata, 2);
+
+ const int cb_args_len = PyTuple_GET_SIZE(cb_args);
+
+ PyObject *cb_args_xy = PyTuple_New(2);
+ PyTuple_SET_ITEMS(cb_args_xy, PyLong_FromLong(x), PyLong_FromLong(y));
+
+ PyObject *cb_args_with_xy = PyC_Tuple_CopySized(cb_args, cb_args_len + 1);
+ PyTuple_SET_ITEM(cb_args_with_xy, cb_args_len, cb_args_xy);
+
+ result = PyObject_CallObject(cb_func, cb_args_with_xy);
+
+ Py_DECREF(cb_args_with_xy);
+
+ if (result) {
+ Py_DECREF(result);
+ }
+ else {
+ PyErr_Print();
+ PyErr_Clear();
+ }
+
+ bpy_context_clear((bContext *)C, &gilstate);
+}
+
#if 0
PyObject *pyrna_callback_add(BPy_StructRNA *self, PyObject *args)
{
@@ -183,10 +235,6 @@ PyObject *pyrna_callback_classmethod_add(PyObject *UNUSED(self), PyObject *args)
void *handle;
PyObject *cls;
PyObject *cb_func, *cb_args;
- const char *cb_regiontype_str;
- const char *cb_event_str;
- int cb_event;
- int cb_regiontype;
StructRNA *srna;
if (PyTuple_GET_SIZE(args) < 2) {
@@ -205,23 +253,78 @@ PyObject *pyrna_callback_classmethod_add(PyObject *UNUSED(self), PyObject *args)
}
/* class specific callbacks */
- if (RNA_struct_is_a(srna, &RNA_Space)) {
- if (!PyArg_ParseTuple(args, "OOO!ss:Space.draw_handler_add",
- &cls, &cb_func, /* already assigned, no matter */
- &PyTuple_Type, &cb_args, &cb_regiontype_str, &cb_event_str))
+
+ if (srna == &RNA_WindowManager) {
+ const char *error_prefix = "WindowManager.draw_cursor_add";
+ struct {
+ const char *space_type_str;
+ const char *region_type_str;
+
+ int space_type;
+ int region_type;
+ } params = {
+ .space_type_str = NULL,
+ .region_type_str = NULL,
+ .space_type = SPACE_TYPE_ANY,
+ .region_type = RGN_TYPE_ANY,
+ };
+
+ if (!PyArg_ParseTuple(
+ args, "OOO!|ss:WindowManager.draw_cursor_add",
+ &cls, &cb_func, /* already assigned, no matter */
+ &PyTuple_Type, &cb_args, &params.space_type_str, &params.region_type_str))
+ {
+ return NULL;
+ }
+
+ if (params.space_type_str && pyrna_enum_value_from_id(
+ rna_enum_space_type_items, params.space_type_str,
+ &params.space_type, error_prefix) == -1)
+ {
+ return NULL;
+ }
+ else if (params.region_type_str && pyrna_enum_value_from_id(
+ rna_enum_region_type_items, params.region_type_str,
+ &params.region_type, error_prefix) == -1)
+ {
+ return NULL;
+ }
+
+ bContext *C = BPy_GetContext();
+ struct wmWindowManager *wm = CTX_wm_manager(C);
+ handle = WM_paint_cursor_activate(
+ wm,
+ params.space_type, params.region_type,
+ NULL, cb_wm_cursor_draw, (void *)args);
+ }
+ else if (RNA_struct_is_a(srna, &RNA_Space)) {
+ const char *error_prefix = "Space.draw_handler_add";
+ struct {
+ const char *region_type_str;
+ const char *event_str;
+
+ int region_type;
+ int event;
+ } params;
+
+ if (!PyArg_ParseTuple(
+ args, "OOO!ss:Space.draw_handler_add",
+ &cls, &cb_func, /* already assigned, no matter */
+ &PyTuple_Type, &cb_args,
+ &params.region_type_str, &params.event_str))
{
return NULL;
}
if (pyrna_enum_value_from_id(
- region_draw_mode_items, cb_event_str,
- &cb_event, "bpy_struct.callback_add()") == -1)
+ region_draw_mode_items, params.event_str,
+ &params.event, error_prefix) == -1)
{
return NULL;
}
else if (pyrna_enum_value_from_id(
- rna_enum_region_type_items, cb_regiontype_str,
- &cb_regiontype, "bpy_struct.callback_add()") == -1)
+ rna_enum_region_type_items, params.region_type_str,
+ &params.region_type, error_prefix) == -1)
{
return NULL;
}
@@ -233,13 +336,12 @@ PyObject *pyrna_callback_classmethod_add(PyObject *UNUSED(self), PyObject *args)
}
else {
SpaceType *st = BKE_spacetype_from_id(spaceid);
- ARegionType *art = BKE_regiontype_from_id(st, cb_regiontype);
+ ARegionType *art = BKE_regiontype_from_id(st, params.region_type);
if (art == NULL) {
- PyErr_Format(PyExc_TypeError, "region type '%.200s' not in space", cb_regiontype_str);
+ PyErr_Format(PyExc_TypeError, "region type '%.200s' not in space", params.region_type_str);
return NULL;
}
- handle = ED_region_draw_cb_activate(art, cb_region_draw, (void *)args, cb_event);
- Py_INCREF(args);
+ handle = ED_region_draw_cb_activate(art, cb_region_draw, (void *)args, params.event);
}
}
}
@@ -248,7 +350,14 @@ PyObject *pyrna_callback_classmethod_add(PyObject *UNUSED(self), PyObject *args)
return NULL;
}
- return PyCapsule_New((void *)handle, RNA_CAPSULE_ID, NULL);
+ PyObject *ret = PyCapsule_New((void *)handle, RNA_CAPSULE_ID, NULL);
+
+ /* Store 'args' in context as well as the handler custom-data,
+ * because the handle may be freed by Blender (new file, new window... etc) */
+ PyCapsule_SetContext(ret, args);
+ Py_INCREF(args);
+
+ return ret;
}
PyObject *pyrna_callback_classmethod_remove(PyObject *UNUSED(self), PyObject *args)
@@ -256,10 +365,8 @@ PyObject *pyrna_callback_classmethod_remove(PyObject *UNUSED(self), PyObject *ar
PyObject *cls;
PyObject *py_handle;
void *handle;
- void *customdata;
StructRNA *srna;
- const char *cb_regiontype_str;
- int cb_regiontype;
+ bool capsule_clear = false;
if (PyTuple_GET_SIZE(args) < 2) {
PyErr_SetString(PyExc_ValueError, "callback_remove(handler): expected at least 2 args");
@@ -276,21 +383,39 @@ PyObject *pyrna_callback_classmethod_remove(PyObject *UNUSED(self), PyObject *ar
PyErr_SetString(PyExc_ValueError, "callback_remove(handler): NULL handler given, invalid or already removed");
return NULL;
}
+ PyObject *handle_args = PyCapsule_GetContext(py_handle);
- if (RNA_struct_is_a(srna, &RNA_Space)) {
- if (!PyArg_ParseTuple(args, "OO!s:Space.draw_handler_remove",
- &cls, &PyCapsule_Type, &py_handle, /* already assigned, no matter */
- &cb_regiontype_str))
+ if (srna == &RNA_WindowManager) {
+ if (!PyArg_ParseTuple(
+ args, "OO!:WindowManager.draw_cursor_remove",
+ &cls, &PyCapsule_Type, &py_handle))
+ {
+ return NULL;
+ }
+ bContext *C = BPy_GetContext();
+ struct wmWindowManager *wm = CTX_wm_manager(C);
+ WM_paint_cursor_end(wm, handle);
+ capsule_clear = true;
+ }
+ else if (RNA_struct_is_a(srna, &RNA_Space)) {
+ const char *error_prefix = "Space.draw_handler_remove";
+ struct {
+ const char *region_type_str;
+
+ int region_type;
+ } params;
+
+ if (!PyArg_ParseTuple(
+ args, "OO!s:Space.draw_handler_remove",
+ &cls, &PyCapsule_Type, &py_handle, /* already assigned, no matter */
+ &params.region_type_str))
{
return NULL;
}
-
- customdata = ED_region_draw_cb_customdata(handle);
- Py_DECREF((PyObject *)customdata);
if (pyrna_enum_value_from_id(
- rna_enum_region_type_items, cb_regiontype_str,
- &cb_regiontype, "bpy_struct.callback_remove()") == -1)
+ rna_enum_region_type_items, params.region_type_str,
+ &params.region_type, error_prefix) == -1)
{
return NULL;
}
@@ -302,12 +427,13 @@ PyObject *pyrna_callback_classmethod_remove(PyObject *UNUSED(self), PyObject *ar
}
else {
SpaceType *st = BKE_spacetype_from_id(spaceid);
- ARegionType *art = BKE_regiontype_from_id(st, cb_regiontype);
+ ARegionType *art = BKE_regiontype_from_id(st, params.region_type);
if (art == NULL) {
- PyErr_Format(PyExc_TypeError, "region type '%.200s' not in space", cb_regiontype_str);
+ PyErr_Format(PyExc_TypeError, "region type '%.200s' not in space", params.region_type_str);
return NULL;
}
ED_region_draw_cb_exit(art, handle);
+ capsule_clear = true;
}
}
}
@@ -317,7 +443,10 @@ PyObject *pyrna_callback_classmethod_remove(PyObject *UNUSED(self), PyObject *ar
}
/* don't allow reuse */
- PyCapsule_SetName(py_handle, RNA_CAPSULE_ID_INVALID);
+ if (capsule_clear) {
+ Py_DECREF(handle_args);
+ PyCapsule_SetName(py_handle, RNA_CAPSULE_ID_INVALID);
+ }
Py_RETURN_NONE;
}
diff --git a/source/blender/python/intern/bpy_rna_gizmo.c b/source/blender/python/intern/bpy_rna_gizmo.c
index cf0d88a4dc4..8189431dfc9 100644
--- a/source/blender/python/intern/bpy_rna_gizmo.c
+++ b/source/blender/python/intern/bpy_rna_gizmo.c
@@ -518,7 +518,7 @@ static PyObject *bpy_gizmo_target_get_range(PyObject *UNUSED(self), PyObject *ar
case PROP_FLOAT:
{
float range[2];
- WM_gizmo_target_property_range_get(gz, gz_prop, range);
+ WM_gizmo_target_property_float_range_get(gz, gz_prop, range);
return PyC_Tuple_PackArray_F32(range, 2);
}
default:
diff --git a/source/blender/python/intern/bpy_rna_id_collection.c b/source/blender/python/intern/bpy_rna_id_collection.c
index 4806c2266ba..0aed853c66b 100644
--- a/source/blender/python/intern/bpy_rna_id_collection.c
+++ b/source/blender/python/intern/bpy_rna_id_collection.c
@@ -35,9 +35,8 @@
#include "BLI_bitmap.h"
#include "BKE_global.h"
-#include "BKE_main.h"
-#include "BKE_library.h"
#include "BKE_library_query.h"
+#include "BKE_main.h"
#include "DNA_ID.h"
/* Those folowing are only to support hack of not listing some internal 'backward' pointers in generated user_map... */
diff --git a/source/blender/python/intern/bpy_utils_units.c b/source/blender/python/intern/bpy_utils_units.c
index 0ef689d1a5a..1d1108e1af0 100644
--- a/source/blender/python/intern/bpy_utils_units.c
+++ b/source/blender/python/intern/bpy_utils_units.c
@@ -204,7 +204,7 @@ static PyObject *bpyunits_to_value(PyObject *UNUSED(self), PyObject *args, PyObj
bUnit_ReplaceString(str, (int)str_len, uref, scale, usys, ucat);
- if (!PyC_RunString_AsNumber(str, "<bpy_units_api>", &result)) {
+ if (!PyC_RunString_AsNumber(NULL, str, "<bpy_units_api>", &result)) {
if (PyErr_Occurred()) {
PyErr_Print();
PyErr_Clear();
@@ -323,7 +323,6 @@ PyObject *BPY_utils_units(void)
submodule = PyModule_Create(&bpyunits_module);
PyDict_SetItemString(PyImport_GetModuleDict(), bpyunits_module.m_name, submodule);
- Py_INCREF(submodule);
/* Finalize our unit systems and types structseq definitions! */
diff --git a/source/blender/python/intern/gpu.c b/source/blender/python/intern/gpu.c
deleted file mode 100644
index a3de9a3a7fd..00000000000
--- a/source/blender/python/intern/gpu.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2006 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): Benoit Bolsee.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/python/intern/gpu.c
- * \ingroup pythonintern
- *
- * This file defines the 'gpu' module, used to get GLSL shader code and data
- * from blender materials.
- */
-
-#include <Python.h>
-
-#include "DNA_scene_types.h"
-#include "DNA_material_types.h"
-#include "DNA_ID.h"
-#include "DNA_customdata_types.h"
-
-#include "BLI_listbase.h"
-#include "BLI_utildefines.h"
-
-#include "RNA_access.h"
-
-#include "bpy_rna.h"
-
-#include "../generic/py_capi_utils.h"
-
-#include "GPU_material.h"
-
-#include "gpu.h"
-
-#define PY_MODULE_ADD_CONSTANT(module, name) PyModule_AddIntConstant(module, # name, name)
-
-PyDoc_STRVAR(M_gpu_doc,
-"This module provides access to GPU offscreen rendering, matrix stacks and selection."
-);
-static struct PyModuleDef gpumodule = {
- PyModuleDef_HEAD_INIT,
- "gpu", /* name of module */
- M_gpu_doc, /* module documentation */
- -1, /* size of per-interpreter state of the module,
- * or -1 if the module keeps state in global variables. */
- NULL, NULL, NULL, NULL, NULL
-};
-
-static PyObject *PyInit_gpu(void)
-{
- PyObject *m;
-
- m = PyModule_Create(&gpumodule);
- if (m == NULL)
- return NULL;
-
- /* Take care to update docs when editing: 'doc/python_api/rst/gpu.rst' */
- return m;
-}
-
-/* -------------------------------------------------------------------- */
-/* Initialize Module */
-
-PyObject *GPU_initPython(void)
-{
- PyObject *module;
- PyObject *submodule;
- PyObject *sys_modules = PyThreadState_GET()->interp->modules;
-
- module = PyInit_gpu();
-
- /* gpu.offscreen */
- PyModule_AddObject(module, "offscreen", (submodule = BPyInit_gpu_offscreen()));
- PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
-
- PyModule_AddObject(module, "matrix", (submodule = BPyInit_gpu_matrix()));
- PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
-
- PyModule_AddObject(module, "select", (submodule = BPyInit_gpu_select()));
- PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
-
- PyDict_SetItem(PyImport_GetModuleDict(), PyModule_GetNameObject(module), module);
- return module;
-}
diff --git a/source/blender/python/intern/gpu_offscreen.c b/source/blender/python/intern/gpu_offscreen.c
deleted file mode 100644
index f0bc4b79296..00000000000
--- a/source/blender/python/intern/gpu_offscreen.c
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * Copyright 2015, Blender Foundation.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/python/intern/gpu_offscreen.c
- * \ingroup pythonintern
- *
- * This file defines the offscreen functionalities of the 'gpu' module
- * used for off-screen OpenGL rendering.
- */
-
-#include <Python.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_utildefines.h"
-
-#include "WM_types.h"
-
-#include "BKE_global.h"
-#include "BKE_library.h"
-
-#include "ED_screen.h"
-
-#include "GPU_framebuffer.h"
-#include "GPU_texture.h"
-
-#include "../mathutils/mathutils.h"
-
-#include "../generic/py_capi_utils.h"
-
-#include "gpu.h"
-
-#include "ED_view3d.h"
-
-/* -------------------------------------------------------------------- */
-/* GPU Offscreen PyObject */
-
-typedef struct {
- PyObject_HEAD
- GPUOffScreen *ofs;
-} BPy_GPUOffScreen;
-
-static int bpy_gpu_offscreen_valid_check(BPy_GPUOffScreen *py_gpu_ofs)
-{
- if (UNLIKELY(py_gpu_ofs->ofs == NULL)) {
- PyErr_SetString(PyExc_ReferenceError, "GPU offscreen was freed, no further access is valid");
- return -1;
- }
- return 0;
-}
-
-#define BPY_GPU_OFFSCREEN_CHECK_OBJ(pygpu) { \
- if (UNLIKELY(bpy_gpu_offscreen_valid_check(pygpu) == -1)) { \
- return NULL; \
- } \
-} ((void)0)
-
-PyDoc_STRVAR(pygpu_offscreen_width_doc, "Texture width.\n\n:type: int");
-static PyObject *pygpu_offscreen_width_get(BPy_GPUOffScreen *self, void *UNUSED(type))
-{
- BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
- return PyLong_FromLong(GPU_offscreen_width(self->ofs));
-}
-
-PyDoc_STRVAR(pygpu_offscreen_height_doc, "Texture height.\n\n:type: int");
-static PyObject *pygpu_offscreen_height_get(BPy_GPUOffScreen *self, void *UNUSED(type))
-{
- BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
- return PyLong_FromLong(GPU_offscreen_height(self->ofs));
-}
-
-PyDoc_STRVAR(pygpu_offscreen_color_texture_doc, "Color texture.\n\n:type: int");
-static PyObject *pygpu_offscreen_color_texture_get(BPy_GPUOffScreen *self, void *UNUSED(type))
-{
- BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
- GPUTexture *texture = GPU_offscreen_color_texture(self->ofs);
- return PyLong_FromLong(GPU_texture_opengl_bindcode(texture));
-}
-
-PyDoc_STRVAR(pygpu_offscreen_bind_doc,
-"bind(save=True)\n"
-"\n"
-" Bind the offscreen object.\n"
-"\n"
-" :param save: save OpenGL current states.\n"
-" :type save: bool\n"
-);
-static PyObject *pygpu_offscreen_bind(BPy_GPUOffScreen *self, PyObject *args, PyObject *kwds)
-{
- static const char *kwlist[] = {"save", NULL};
- bool save = true;
-
- BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
-
- if (!PyArg_ParseTupleAndKeywords(
- args, kwds, "|O&:bind", (char **)(kwlist),
- PyC_ParseBool, &save))
- {
- return NULL;
- }
-
- GPU_offscreen_bind(self->ofs, save);
- Py_RETURN_NONE;
-}
-
-PyDoc_STRVAR(pygpu_offscreen_unbind_doc,
-"unbind(restore=True)\n"
-"\n"
-" Unbind the offscreen object.\n"
-"\n"
-" :param restore: restore OpenGL previous states.\n"
-" :type restore: bool\n"
-);
-static PyObject *pygpu_offscreen_unbind(BPy_GPUOffScreen *self, PyObject *args, PyObject *kwds)
-{
- static const char *kwlist[] = {"restore", NULL};
- bool restore = true;
-
- BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
-
- if (!PyArg_ParseTupleAndKeywords(
- args, kwds, "|O&:unbind", (char **)(kwlist),
- PyC_ParseBool, &restore))
- {
- return NULL;
- }
-
- GPU_offscreen_unbind(self->ofs, restore);
- Py_RETURN_NONE;
-}
-
-PyDoc_STRVAR(pygpu_offscreen_draw_view3d_doc,
-"draw_view3d(scene, view3d, region, modelview_matrix, projection_matrix)\n"
-"\n"
-" Draw the 3d viewport in the offscreen object.\n"
-"\n"
-" :param scene: Scene to draw.\n"
-" :type scene: :class:`bpy.types.Scene`\n"
-" :param view3d: 3D View to get the drawing settings from.\n"
-" :type view3d: :class:`bpy.types.SpaceView3D`\n"
-" :param region: Region of the 3D View.\n"
-" :type region: :class:`bpy.types.Region`\n"
-" :param modelview_matrix: ModelView Matrix.\n"
-" :type modelview_matrix: :class:`mathutils.Matrix`\n"
-" :param projection_matrix: Projection Matrix.\n"
-" :type projection_matrix: :class:`mathutils.Matrix`\n"
-);
-static PyObject *pygpu_offscreen_draw_view3d(BPy_GPUOffScreen *self, PyObject *args, PyObject *kwds)
-{
- /* TODO: This doesn't work currently because of missing depsgraph. */
-#if 0
- static const char *kwlist[] = {"scene", "view_layer", "view3d", "region", "projection_matrix", "modelview_matrix", NULL};
-
- MatrixObject *py_mat_modelview, *py_mat_projection;
- PyObject *py_scene, *py_view_layer, *py_region, *py_view3d;
-
- Scene *scene;
- ViewLayer *view_layer;
- View3D *v3d;
- ARegion *ar;
- GPUFX *fx;
- GPUFXSettings fx_settings;
- struct RV3DMatrixStore *rv3d_mats;
-
- BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
-
- if (!PyArg_ParseTupleAndKeywords(
- args, kwds, "OOOOO&O&:draw_view3d", (char **)(kwlist),
- &py_scene, &py_view_layer, &py_view3d, &py_region,
- Matrix_Parse4x4, &py_mat_projection,
- Matrix_Parse4x4, &py_mat_modelview) ||
- (!(scene = PyC_RNA_AsPointer(py_scene, "Scene")) ||
- !(view_layer = PyC_RNA_AsPointer(py_view_layer, "ViewLayer")) ||
- !(v3d = PyC_RNA_AsPointer(py_view3d, "SpaceView3D")) ||
- !(ar = PyC_RNA_AsPointer(py_region, "Region"))))
- {
- return NULL;
- }
-
- BLI_assert(BKE_id_is_in_gobal_main(&scene->id));
-
- fx = GPU_fx_compositor_create();
-
- fx_settings = v3d->fx_settings; /* full copy */
-
- rv3d_mats = ED_view3d_mats_rv3d_backup(ar->regiondata);
-
- GPU_offscreen_bind(self->ofs, true); /* bind */
-
- ED_view3d_draw_offscreen(
- scene, view_layer, v3d, ar, GPU_offscreen_width(self->ofs), GPU_offscreen_height(self->ofs),
- (float(*)[4])py_mat_modelview->matrix, (float(*)[4])py_mat_projection->matrix,
- false, true, true, "",
- fx, &fx_settings,
- self->ofs);
-
- GPU_fx_compositor_destroy(fx);
- GPU_offscreen_unbind(self->ofs, true); /* unbind */
-
- ED_view3d_mats_rv3d_restore(ar->regiondata, rv3d_mats);
- MEM_freeN(rv3d_mats);
-
- Py_RETURN_NONE;
-#else
- UNUSED_VARS(self, args, kwds);
-#endif
- return NULL;
-}
-
-PyDoc_STRVAR(pygpu_offscreen_free_doc,
-"free()\n"
-"\n"
-" Free the offscreen object\n"
-" The framebuffer, texture and render objects will no longer be accessible.\n"
-);
-static PyObject *pygpu_offscreen_free(BPy_GPUOffScreen *self)
-{
- BPY_GPU_OFFSCREEN_CHECK_OBJ(self);
-
- GPU_offscreen_free(self->ofs);
- self->ofs = NULL;
- Py_RETURN_NONE;
-}
-
-static void BPy_GPUOffScreen__tp_dealloc(BPy_GPUOffScreen *self)
-{
- if (self->ofs)
- GPU_offscreen_free(self->ofs);
- Py_TYPE(self)->tp_free((PyObject *)self);
-}
-
-static PyGetSetDef bpy_gpu_offscreen_getseters[] = {
- {(char *)"color_texture", (getter)pygpu_offscreen_color_texture_get, (setter)NULL, pygpu_offscreen_color_texture_doc, NULL},
- {(char *)"width", (getter)pygpu_offscreen_width_get, (setter)NULL, pygpu_offscreen_width_doc, NULL},
- {(char *)"height", (getter)pygpu_offscreen_height_get, (setter)NULL, pygpu_offscreen_height_doc, NULL},
- {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
-};
-
-static struct PyMethodDef bpy_gpu_offscreen_methods[] = {
- {"bind", (PyCFunction)pygpu_offscreen_bind, METH_VARARGS | METH_KEYWORDS, pygpu_offscreen_bind_doc},
- {"unbind", (PyCFunction)pygpu_offscreen_unbind, METH_VARARGS | METH_KEYWORDS, pygpu_offscreen_unbind_doc},
- {"draw_view3d", (PyCFunction)pygpu_offscreen_draw_view3d, METH_VARARGS | METH_KEYWORDS, pygpu_offscreen_draw_view3d_doc},
- {"free", (PyCFunction)pygpu_offscreen_free, METH_NOARGS, pygpu_offscreen_free_doc},
- {NULL, NULL, 0, NULL}
-};
-
-PyDoc_STRVAR(py_gpu_offscreen_doc,
-".. class:: GPUOffscreen"
-"\n"
-" This object gives access to off screen buffers.\n"
-);
-static PyTypeObject BPy_GPUOffScreen_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "GPUOffScreen", /* tp_name */
- sizeof(BPy_GPUOffScreen), /* tp_basicsize */
- 0, /* tp_itemsize */
- /* methods */
- (destructor)BPy_GPUOffScreen__tp_dealloc, /* tp_dealloc */
- NULL, /* tp_print */
- NULL, /* tp_getattr */
- NULL, /* tp_setattr */
- NULL, /* tp_compare */
- NULL, /* tp_repr */
- NULL, /* tp_as_number */
- NULL, /* tp_as_sequence */
- NULL, /* tp_as_mapping */
- NULL, /* tp_hash */
- NULL, /* tp_call */
- NULL, /* tp_str */
- NULL, /* tp_getattro */
- NULL, /* tp_setattro */
- NULL, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- py_gpu_offscreen_doc, /* Documentation string */
- NULL, /* tp_traverse */
- NULL, /* tp_clear */
- NULL, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- NULL, /* tp_iter */
- NULL, /* tp_iternext */
- bpy_gpu_offscreen_methods, /* tp_methods */
- NULL, /* tp_members */
- bpy_gpu_offscreen_getseters, /* tp_getset */
- NULL, /* tp_base */
- NULL, /* tp_dict */
- NULL, /* tp_descr_get */
- NULL, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- NULL, /* tp_alloc */
- NULL, /* tp_new */
- (freefunc)0, /* tp_free */
- NULL, /* tp_is_gc */
- NULL, /* tp_bases */
- NULL, /* tp_mro */
- NULL, /* tp_cache */
- NULL, /* tp_subclasses */
- NULL, /* tp_weaklist */
- (destructor) NULL /* tp_del */
-};
-
-/* -------------------------------------------------------------------- */
-/* GPU offscreen methods */
-
-static PyObject *BPy_GPU_OffScreen_CreatePyObject(GPUOffScreen *ofs)
-{
- BPy_GPUOffScreen *self;
- self = PyObject_New(BPy_GPUOffScreen, &BPy_GPUOffScreen_Type);
- self->ofs = ofs;
- return (PyObject *)self;
-}
-
-PyDoc_STRVAR(pygpu_offscreen_new_doc,
-"new(width, height, samples=0)\n"
-"\n"
-" Return a GPUOffScreen.\n"
-"\n"
-" :param width: Horizontal dimension of the buffer.\n"
-" :type width: int`\n"
-" :param height: Vertical dimension of the buffer.\n"
-" :type height: int`\n"
-" :param samples: OpenGL samples to use for MSAA or zero to disable.\n"
-" :type samples: int\n"
-" :return: Newly created off-screen buffer.\n"
-" :rtype: :class:`gpu.GPUOffscreen`\n"
-);
-static PyObject *pygpu_offscreen_new(PyObject *UNUSED(self), PyObject *args, PyObject *kwds)
-{
- static const char *kwlist[] = {"width", "height", "samples", NULL};
-
- GPUOffScreen *ofs;
- int width, height, samples = 0;
- char err_out[256];
-
- if (!PyArg_ParseTupleAndKeywords(
- args, kwds, "ii|i:new", (char **)(kwlist),
- &width, &height, &samples))
- {
- return NULL;
- }
-
- ofs = GPU_offscreen_create(width, height, samples, true, false, err_out);
-
- if (ofs == NULL) {
- PyErr_Format(PyExc_RuntimeError,
- "gpu.offscreen.new(...) failed with '%s'",
- err_out[0] ? err_out : "unknown error");
- return NULL;
- }
-
- return BPy_GPU_OffScreen_CreatePyObject(ofs);
-}
-
-static struct PyMethodDef BPy_GPU_offscreen_methods[] = {
- {"new", (PyCFunction)pygpu_offscreen_new, METH_VARARGS | METH_KEYWORDS, pygpu_offscreen_new_doc},
- {NULL, NULL, 0, NULL}
-};
-
-PyDoc_STRVAR(BPy_GPU_offscreen_doc,
-"This module provides access to offscreen rendering functions."
-);
-static PyModuleDef BPy_GPU_offscreen_module_def = {
- PyModuleDef_HEAD_INIT,
- "gpu.offscreen", /* m_name */
- BPy_GPU_offscreen_doc, /* m_doc */
- 0, /* m_size */
- BPy_GPU_offscreen_methods, /* m_methods */
- NULL, /* m_reload */
- NULL, /* m_traverse */
- NULL, /* m_clear */
- NULL, /* m_free */
-};
-
-PyObject *BPyInit_gpu_offscreen(void)
-{
- PyObject *submodule;
-
- /* Register the 'GPUOffscreen' class */
- if (PyType_Ready(&BPy_GPUOffScreen_Type)) {
- return NULL;
- }
-
- submodule = PyModule_Create(&BPy_GPU_offscreen_module_def);
-
-#define MODULE_TYPE_ADD(s, t) \
- PyModule_AddObject(s, t.tp_name, (PyObject *)&t); Py_INCREF((PyObject *)&t)
-
- MODULE_TYPE_ADD(submodule, BPy_GPUOffScreen_Type);
-
-#undef MODULE_TYPE_ADD
-
- return submodule;
-}
-
-#undef BPY_GPU_OFFSCREEN_CHECK_OBJ
diff --git a/source/blender/python/mathutils/mathutils.c b/source/blender/python/mathutils/mathutils.c
index 0c365ad192c..07905d2be89 100644
--- a/source/blender/python/mathutils/mathutils.c
+++ b/source/blender/python/mathutils/mathutils.c
@@ -405,7 +405,7 @@ int EXPP_VectorsAreEqual(const float *vecA, const float *vecB, int size, int flo
}
#ifndef MATH_STANDALONE
-/* dynstr as python string utility funcions, frees 'ds'! */
+/* dynstr as python string utility functions, frees 'ds'! */
PyObject *mathutils_dynstr_to_py(struct DynStr *ds)
{
const int ds_len = BLI_dynstr_get_len(ds); /* space for \0 */
@@ -615,7 +615,7 @@ PyMODINIT_FUNC PyInit_mathutils(void)
{
PyObject *mod;
PyObject *submodule;
- PyObject *sys_modules = PyThreadState_GET()->interp->modules;
+ PyObject *sys_modules = PyImport_GetModuleDict();
if (PyType_Ready(&vector_Type) < 0)
return NULL;
@@ -641,34 +641,29 @@ PyMODINIT_FUNC PyInit_mathutils(void)
/* submodule */
PyModule_AddObject(mod, "geometry", (submodule = PyInit_mathutils_geometry()));
- /* XXX, python doesnt do imports with this usefully yet
+ /* XXX, python doesn't do imports with this usefully yet
* 'from mathutils.geometry import PolyFill'
* ...fails without this. */
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
PyModule_AddObject(mod, "interpolate", (submodule = PyInit_mathutils_interpolate()));
/* XXX, python doesnt do imports with this usefully yet
* 'from mathutils.geometry import PolyFill'
* ...fails without this. */
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
#ifndef MATH_STANDALONE
/* Noise submodule */
PyModule_AddObject(mod, "noise", (submodule = PyInit_mathutils_noise()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
/* BVHTree submodule */
PyModule_AddObject(mod, "bvhtree", (submodule = PyInit_mathutils_bvhtree()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
/* KDTree submodule */
PyModule_AddObject(mod, "kdtree", (submodule = PyInit_mathutils_kdtree()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
#endif
mathutils_matrix_row_cb_index = Mathutils_RegisterCallback(&mathutils_matrix_row_cb);
diff --git a/source/blender/python/mathutils/mathutils.h b/source/blender/python/mathutils/mathutils.h
index 31ad75b3906..ab78009ff89 100644
--- a/source/blender/python/mathutils/mathutils.h
+++ b/source/blender/python/mathutils/mathutils.h
@@ -170,7 +170,7 @@ Py_hash_t mathutils_array_hash(const float *float_array, size_t array_len);
int column_vector_multiplication(float rvec[4], VectorObject *vec, MatrixObject *mat);
#ifndef MATH_STANDALONE
-/* dynstr as python string utility funcions */
+/* dynstr as python string utility functions */
PyObject *mathutils_dynstr_to_py(struct DynStr *ds);
#endif
diff --git a/source/blender/python/mathutils/mathutils_Color.c b/source/blender/python/mathutils/mathutils_Color.c
index 4c1163a6181..e97ed095b24 100644
--- a/source/blender/python/mathutils/mathutils_Color.c
+++ b/source/blender/python/mathutils/mathutils_Color.c
@@ -706,12 +706,12 @@ PyDoc_STRVAR(Color_channel_b_doc, "Blue color channel.\n\n:type: float");
static PyObject *Color_channel_get(ColorObject *self, void *type)
{
- return Color_item(self, GET_INT_FROM_POINTER(type));
+ return Color_item(self, POINTER_AS_INT(type));
}
static int Color_channel_set(ColorObject *self, PyObject *value, void *type)
{
- return Color_ass_item(self, GET_INT_FROM_POINTER(type), value);
+ return Color_ass_item(self, POINTER_AS_INT(type), value);
}
/* color channel (HSV), color.h/s/v */
@@ -722,7 +722,7 @@ PyDoc_STRVAR(Color_channel_hsv_v_doc, "HSV Value component in [0, 1].\n\n:type:
static PyObject *Color_channel_hsv_get(ColorObject *self, void *type)
{
float hsv[3];
- int i = GET_INT_FROM_POINTER(type);
+ int i = POINTER_AS_INT(type);
if (BaseMath_ReadCallback(self) == -1)
return NULL;
@@ -735,7 +735,7 @@ static PyObject *Color_channel_hsv_get(ColorObject *self, void *type)
static int Color_channel_hsv_set(ColorObject *self, PyObject *value, void *type)
{
float hsv[3];
- int i = GET_INT_FROM_POINTER(type);
+ int i = POINTER_AS_INT(type);
float f = PyFloat_AsDouble(value);
if (f == -1 && PyErr_Occurred()) {
diff --git a/source/blender/python/mathutils/mathutils_Euler.c b/source/blender/python/mathutils/mathutils_Euler.c
index 8be3de42226..9046bdc1aa4 100644
--- a/source/blender/python/mathutils/mathutils_Euler.c
+++ b/source/blender/python/mathutils/mathutils_Euler.c
@@ -161,7 +161,7 @@ PyDoc_STRVAR(Euler_to_matrix_doc,
"\n"
" Return a matrix representation of the euler.\n"
"\n"
-" :return: A 3x3 roation matrix representation of the euler.\n"
+" :return: A 3x3 rotation matrix representation of the euler.\n"
" :rtype: :class:`Matrix`\n"
);
static PyObject *Euler_to_matrix(EulerObject *self)
@@ -612,12 +612,12 @@ PyDoc_STRVAR(Euler_axis_doc,
);
static PyObject *Euler_axis_get(EulerObject *self, void *type)
{
- return Euler_item(self, GET_INT_FROM_POINTER(type));
+ return Euler_item(self, POINTER_AS_INT(type));
}
static int Euler_axis_set(EulerObject *self, PyObject *value, void *type)
{
- return Euler_ass_item(self, GET_INT_FROM_POINTER(type), value);
+ return Euler_ass_item(self, POINTER_AS_INT(type), value);
}
/* rotation order */
diff --git a/source/blender/python/mathutils/mathutils_Matrix.c b/source/blender/python/mathutils/mathutils_Matrix.c
index 6f4ff3216e7..de8deca35a1 100644
--- a/source/blender/python/mathutils/mathutils_Matrix.c
+++ b/source/blender/python/mathutils/mathutils_Matrix.c
@@ -2745,7 +2745,7 @@ static int Matrix_translation_set(MatrixObject *self, PyObject *value, void *UNU
}
PyDoc_STRVAR(Matrix_row_doc,
-"Access the matix by rows (default), (read-only).\n\n:type: Matrix Access"
+"Access the matrix by rows (default), (read-only).\n\n:type: Matrix Access"
);
static PyObject *Matrix_row_get(MatrixObject *self, void *UNUSED(closure))
{
@@ -2753,7 +2753,7 @@ static PyObject *Matrix_row_get(MatrixObject *self, void *UNUSED(closure))
}
PyDoc_STRVAR(Matrix_col_doc,
-"Access the matix by colums, 3x3 and 4x4 only, (read-only).\n\n:type: Matrix Access"
+"Access the matrix by columns, 3x3 and 4x4 only, (read-only).\n\n:type: Matrix Access"
);
static PyObject *Matrix_col_get(MatrixObject *self, void *UNUSED(closure))
{
@@ -2923,7 +2923,7 @@ PyDoc_STRVAR(matrix_doc,
" matrices from 2x2 up to 4x4.\n"
"\n"
" :param rows: Sequence of rows.\n"
-" When ommitted, a 4x4 identity matrix is constructed.\n"
+" When omitted, a 4x4 identity matrix is constructed.\n"
" :type rows: 2d number sequence\n"
);
PyTypeObject matrix_Type = {
diff --git a/source/blender/python/mathutils/mathutils_Quaternion.c b/source/blender/python/mathutils/mathutils_Quaternion.c
index db192167a29..c3251a28b94 100644
--- a/source/blender/python/mathutils/mathutils_Quaternion.c
+++ b/source/blender/python/mathutils/mathutils_Quaternion.c
@@ -1083,12 +1083,12 @@ PyDoc_STRVAR(Quaternion_axis_doc,
);
static PyObject *Quaternion_axis_get(QuaternionObject *self, void *type)
{
- return Quaternion_item(self, GET_INT_FROM_POINTER(type));
+ return Quaternion_item(self, POINTER_AS_INT(type));
}
static int Quaternion_axis_set(QuaternionObject *self, PyObject *value, void *type)
{
- return Quaternion_ass_item(self, GET_INT_FROM_POINTER(type), value);
+ return Quaternion_ass_item(self, POINTER_AS_INT(type), value);
}
PyDoc_STRVAR(Quaternion_magnitude_doc,
diff --git a/source/blender/python/mathutils/mathutils_Vector.c b/source/blender/python/mathutils/mathutils_Vector.c
index 860760d2b10..16a242fc718 100644
--- a/source/blender/python/mathutils/mathutils_Vector.c
+++ b/source/blender/python/mathutils/mathutils_Vector.c
@@ -847,7 +847,7 @@ static PyObject *Vector_orthogonal(VectorObject *self)
/**
* Vector.reflect(mirror): return a reflected vector on the mirror normal.
* <pre>
- * vec - ((2 * dot(vec, mirror)) * mirror)
+ * vec - ((2 * dot(vec, mirror)) * mirror)
* </pre>
*/
PyDoc_STRVAR(Vector_reflect_doc,
@@ -1650,7 +1650,7 @@ static PyObject *Vector_isub(PyObject *v1, PyObject *v2)
/**
- * column vector multiplication (Matrix * Vector)
+ * Column vector multiplication (Matrix * Vector).
* <pre>
* [1][4][7] [a]
* [2][5][8] * [b]
@@ -2224,12 +2224,12 @@ PyDoc_STRVAR(Vector_axis_w_doc, "Vector W axis (4D Vectors only).\n\n:type: floa
static PyObject *Vector_axis_get(VectorObject *self, void *type)
{
- return vector_item_internal(self, GET_INT_FROM_POINTER(type), true);
+ return vector_item_internal(self, POINTER_AS_INT(type), true);
}
static int Vector_axis_set(VectorObject *self, PyObject *value, void *type)
{
- return vector_ass_item_internal(self, GET_INT_FROM_POINTER(type), value, true);
+ return vector_ass_item_internal(self, POINTER_AS_INT(type), value, true);
}
/* vector.length */
@@ -2372,7 +2372,7 @@ static PyObject *Vector_swizzle_get(VectorObject *self, void *closure)
/* Unpack the axes from the closure into an array. */
axis_to = 0;
- swizzleClosure = GET_INT_FROM_POINTER(closure);
+ swizzleClosure = POINTER_AS_INT(closure);
while (swizzleClosure & SWIZZLE_VALID_AXIS) {
axis_from = swizzleClosure & SWIZZLE_AXIS;
if (axis_from >= self->size) {
@@ -2391,7 +2391,7 @@ static PyObject *Vector_swizzle_get(VectorObject *self, void *closure)
}
/**
- * Set the items of this vector using a swizzle.
+ * Set the items of this vector using a swizzle.
* - If value is a vector or list this operates like an array copy, except that
* the destination is effectively re-ordered as defined by the swizzle. At
* most min(len(source), len(dest)) values will be copied.
@@ -2419,7 +2419,7 @@ static int Vector_swizzle_set(VectorObject *self, PyObject *value, void *closure
/* Check that the closure can be used with this vector: even 2D vectors have
* swizzles defined for axes z and w, but they would be invalid. */
- swizzleClosure = GET_INT_FROM_POINTER(closure);
+ swizzleClosure = POINTER_AS_INT(closure);
axis_from = 0;
while (swizzleClosure & SWIZZLE_VALID_AXIS) {
@@ -2458,7 +2458,7 @@ static int Vector_swizzle_set(VectorObject *self, PyObject *value, void *closure
/* Copy vector contents onto swizzled axes. */
axis_from = 0;
- swizzleClosure = GET_INT_FROM_POINTER(closure);
+ swizzleClosure = POINTER_AS_INT(closure);
/* We must first copy current vec into tvec, else some org values may be lost.
* See [#31760].
@@ -2488,9 +2488,9 @@ static int Vector_swizzle_set(VectorObject *self, PyObject *value, void *closure
#define _SWIZZLE3(a, b, c) (_SWIZZLE2(a, b) | (((c) | SWIZZLE_VALID_AXIS) << (SWIZZLE_BITS_PER_AXIS * 2)))
#define _SWIZZLE4(a, b, c, d) (_SWIZZLE3(a, b, c) | (((d) | SWIZZLE_VALID_AXIS) << (SWIZZLE_BITS_PER_AXIS * 3)))
-#define SWIZZLE2(a, b) SET_INT_IN_POINTER(_SWIZZLE2(a, b))
-#define SWIZZLE3(a, b, c) SET_INT_IN_POINTER(_SWIZZLE3(a, b, c))
-#define SWIZZLE4(a, b, c, d) SET_INT_IN_POINTER(_SWIZZLE4(a, b, c, d))
+#define SWIZZLE2(a, b) POINTER_FROM_INT(_SWIZZLE2(a, b))
+#define SWIZZLE3(a, b, c) POINTER_FROM_INT(_SWIZZLE3(a, b, c))
+#define SWIZZLE4(a, b, c, d) POINTER_FROM_INT(_SWIZZLE4(a, b, c, d))
/*****************************************************************************/
/* Python attributes get/set structure: */
diff --git a/source/blender/python/mathutils/mathutils_bvhtree.c b/source/blender/python/mathutils/mathutils_bvhtree.c
index 4119917a33f..dba5d52846b 100644
--- a/source/blender/python/mathutils/mathutils_bvhtree.c
+++ b/source/blender/python/mathutils/mathutils_bvhtree.c
@@ -48,10 +48,14 @@
#ifndef MATH_STANDALONE
#include "DNA_object_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
#include "BKE_customdata.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_editmesh_bvh.h"
+#include "BKE_library.h"
+#include "BKE_mesh.h"
+#include "BKE_mesh_runtime.h"
#include "bmesh.h"
@@ -579,7 +583,7 @@ PyDoc_STRVAR(py_bvhtree_overlap_doc,
"\n"
" Find overlapping indices between 2 trees.\n"
"\n"
-" :arg other_tree: Other tree to preform overlap test on.\n"
+" :arg other_tree: Other tree to perform overlap test on.\n"
" :type other_tree: :class:`BVHTree`\n"
" :return: Returns a list of unique index pairs,"
" the first index referencing this tree, the second referencing the **other_tree**.\n"
@@ -1045,7 +1049,7 @@ static PyObject *C_BVHTree_FromBMesh(PyObject *UNUSED(cls), PyObject *args, PyOb
}
/* return various derived meshes based on requested settings */
-static DerivedMesh *bvh_get_derived_mesh(
+static Mesh *bvh_get_mesh(
const char *funcname, struct Scene *scene, Object *ob,
bool use_deform, bool use_render, bool use_cage)
{
@@ -1130,7 +1134,7 @@ static PyObject *C_BVHTree_FromObject(PyObject *UNUSED(cls), PyObject *args, PyO
PyObject *py_ob, *py_scene;
Object *ob;
struct Scene *scene;
- DerivedMesh *dm;
+ Mesh *mesh;
bool use_deform = true;
bool use_render = false;
bool use_cage = false;
@@ -1156,24 +1160,27 @@ static PyObject *C_BVHTree_FromObject(PyObject *UNUSED(cls), PyObject *args, PyO
return NULL;
}
- dm = bvh_get_derived_mesh("BVHTree", scene, ob, use_deform, use_render, use_cage);
- if (dm == NULL) {
+ mesh = bvh_get_mesh("BVHTree", scene, ob, use_deform, use_render, use_cage);
+ if (mesh == NULL) {
return NULL;
}
/* Get data for tessellation */
{
- lt = dm->getLoopTriArray(dm);
+ lt = BKE_mesh_runtime_looptri_ensure(mesh);
- tris_len = (unsigned int)dm->getNumLoopTri(dm);
- coords_len = (unsigned int)dm->getNumVerts(dm);
+ tris_len = (unsigned int)BKE_mesh_runtime_looptri_len(mesh);
+ coords_len = (unsigned int)mesh->totvert;
coords = MEM_mallocN(sizeof(*coords) * (size_t)coords_len, __func__);
tris = MEM_mallocN(sizeof(*tris) * (size_t)tris_len, __func__);
- dm->getVertCos(dm, coords);
+ MVert *mv = mesh->mvert;
+ for (int i = 0; i < mesh->totvert; i++, mv++) {
+ copy_v3_v3(coords[i], mv->co);
+ }
- mloop = dm->getLoopArray(dm);
+ mloop = mesh->mloop;
}
{
@@ -1186,7 +1193,8 @@ static PyObject *C_BVHTree_FromObject(PyObject *UNUSED(cls), PyObject *args, PyO
tree = BLI_bvhtree_new((int)tris_len, epsilon, PY_BVH_TREE_TYPE_DEFAULT, PY_BVH_AXIS_DEFAULT);
if (tree) {
orig_index = MEM_mallocN(sizeof(*orig_index) * (size_t)tris_len, __func__);
- orig_normal = dm->getPolyDataArray(dm, CD_NORMAL); /* can be NULL */
+ CustomData *pdata = &mesh->pdata;
+ orig_normal = CustomData_get_layer(pdata, CD_NORMAL); /* can be NULL */
if (orig_normal) {
orig_normal = MEM_dupallocN(orig_normal);
}
@@ -1209,7 +1217,7 @@ static PyObject *C_BVHTree_FromObject(PyObject *UNUSED(cls), PyObject *args, PyO
BLI_bvhtree_balance(tree);
}
- dm->release(dm);
+ BKE_id_free(NULL, mesh);
return bvhtree_CreatePyObject(
tree, epsilon,
diff --git a/source/blender/python/mathutils/mathutils_geometry.c b/source/blender/python/mathutils/mathutils_geometry.c
index d935949fd8c..c759653c5cf 100644
--- a/source/blender/python/mathutils/mathutils_geometry.c
+++ b/source/blender/python/mathutils/mathutils_geometry.c
@@ -1265,7 +1265,7 @@ static PyObject *M_Geometry_tessellate_polygon(PyObject *UNUSED(self), PyObject
BKE_displist_fill(&dispbase, &dispbase, NULL, false);
/* The faces are stored in a new DisplayList
- * thats added to the head of the listbase */
+ * that's added to the head of the listbase */
dl = dispbase.first;
tri_list = PyList_New(dl->parts);
diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h
index 1ca889f2347..faa4c8b3184 100644
--- a/source/blender/render/extern/include/RE_engine.h
+++ b/source/blender/render/extern/include/RE_engine.h
@@ -193,4 +193,6 @@ struct RenderData *RE_engine_get_render_data(struct Render *re);
void RE_bake_engine_set_engine_parameters(
struct Render *re, struct Main *bmain, struct Scene *scene);
+void RE_engine_free_blender_memory(struct RenderEngine *engine);
+
#endif /* __RE_ENGINE_H__ */
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index df8953857ee..614a1735f44 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -263,7 +263,7 @@ void RE_GetViewPlane(struct Render *re, rctf *r_viewplane, rcti *r_disprect);
/* make or free the dbase */
void RE_Database_CameraOnly(
struct Render *re, struct Main *bmain, struct Scene *scene,
- unsigned int lay, int use_camera_view);
+ int use_camera_view);
/* set the render threads based on the commandline and autothreads setting */
void RE_init_threadcount(Render *re);
@@ -278,9 +278,10 @@ bool RE_WriteRenderViewsMovie(
/* only RE_NewRender() needed, main Blender render calls */
void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene,
struct ViewLayer *single_layer, struct Object *camera_override,
- unsigned int lay_override, int frame, const bool write_still);
-void RE_BlenderAnim(struct Render *re, struct Main *bmain, struct Scene *scene, struct Object *camera_override,
- unsigned int lay_override, int sfra, int efra, int tfra);
+ int frame, const bool write_still);
+void RE_BlenderAnim(struct Render *re, struct Main *bmain, struct Scene *scene,
+ struct ViewLayer *single_layer, struct Object *camera_override,
+ int sfra, int efra, int tfra);
#ifdef WITH_FREESTYLE
void RE_RenderFreestyleStrokes(struct Render *re, struct Main *bmain, struct Scene *scene, int render);
void RE_RenderFreestyleExternal(struct Render *re);
@@ -334,8 +335,10 @@ struct RenderPass *RE_pass_find_by_type(volatile struct RenderLayer *rl, int pas
#define RE_BAKE_AO 2
void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[4][4]);
+void RE_GetCameraWindowWithOverscan(struct Render *re, float mat[4][4], float overscan);
void RE_GetCameraModelMatrix(struct Render *re, struct Object *camera, float r_mat[4][4]);
struct Scene *RE_GetScene(struct Render *re);
+void RE_SetScene(struct Render *re, struct Scene *sce);
bool RE_is_rendering_allowed(struct Scene *scene, struct ViewLayer *single_layer, struct Object *camera_override, struct ReportList *reports);
diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h
index 22a202ee675..dad88cf06fa 100644
--- a/source/blender/render/extern/include/RE_render_ext.h
+++ b/source/blender/render/extern/include/RE_render_ext.h
@@ -37,7 +37,6 @@
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* called by meshtools */
-struct DerivedMesh;
struct Depsgraph;
struct ImagePool;
struct MTex;
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index 5d5d12f028a..1467f8d9804 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -118,7 +118,6 @@ struct Render {
ListBase view_layers;
int active_view_layer;
struct Object *camera_override;
- unsigned int lay, layer_override;
ThreadRWMutex partsmutex;
ListBase parts;
diff --git a/source/blender/render/intern/source/bake_api.c b/source/blender/render/intern/source/bake_api.c
index 3aa8f586329..c6d94757ff8 100644
--- a/source/blender/render/intern/source/bake_api.c
+++ b/source/blender/render/intern/source/bake_api.c
@@ -71,11 +71,16 @@
#include "BLI_math.h"
#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
-#include "BKE_cdderivedmesh.h"
+#include "BKE_bvhutils.h"
+#include "BKE_customdata.h"
#include "BKE_image.h"
-#include "BKE_node.h"
+#include "BKE_library.h"
#include "BKE_mesh.h"
+#include "BKE_mesh_tangent.h"
+#include "BKE_mesh_runtime.h"
+#include "BKE_node.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -86,9 +91,6 @@
#include "render_types.h"
#include "zbuf.h"
-/* Remove when Cycles moves from MFace to MLoopTri */
-#define USE_MFACE_WORKAROUND
-
typedef struct BakeDataZSpan {
BakePixel *pixel_array;
int primitive_id;
@@ -393,33 +395,12 @@ static bool cast_ray_highpoly(
return hit_mesh != -1;
}
-#ifdef USE_MFACE_WORKAROUND
-/**
- * Until cycles moves to #MLoopTri, we need to keep face-rotation in sync with #test_index_face
- *
- * We only need to consider quads since #BKE_mesh_recalc_tessellation doesn't execute this on triangles.
- */
-static void test_index_face_looptri(const MPoly *mp, MLoop *mloop, MLoopTri *lt)
-{
- if (mp->totloop == 4) {
- if (UNLIKELY((mloop[mp->loopstart + 2].v == 0) ||
- (mloop[mp->loopstart + 3].v == 0)))
- {
- /* remap: (2, 3, 0, 1) */
- unsigned int l = mp->loopstart;
- ARRAY_SET_ITEMS(lt[0].tri, l + 2, l + 3, l + 0);
- ARRAY_SET_ITEMS(lt[1].tri, l + 2, l + 0, l + 1);
- }
- }
-}
-#endif
-
/**
* This function populates an array of verts for the triangles of a mesh
* Tangent and Normals are also stored
*/
static TriTessFace *mesh_calc_tri_tessface(
- Mesh *me, bool tangent, DerivedMesh *dm)
+ Mesh *me, bool tangent, Mesh *me_eval)
{
int i;
MVert *mvert;
@@ -433,19 +414,15 @@ static TriTessFace *mesh_calc_tri_tessface(
unsigned int mpoly_prev = UINT_MAX;
float no[3];
-#ifdef USE_MFACE_WORKAROUND
- unsigned int mpoly_prev_testindex = UINT_MAX;
-#endif
-
mvert = CustomData_get_layer(&me->vdata, CD_MVERT);
looptri = MEM_mallocN(sizeof(*looptri) * tottri, __func__);
triangles = MEM_mallocN(sizeof(TriTessFace) * tottri, __func__);
if (tangent) {
- DM_ensure_normals(dm);
- DM_calc_loop_tangents(dm, true, NULL, 0);
+ BKE_mesh_ensure_normals_for_display(me_eval);
+ BKE_mesh_calc_loop_tangents(me_eval, true, NULL, 0);
- tspace = dm->getLoopDataArray(dm, CD_TANGENT);
+ tspace = CustomData_get_layer(&me_eval->ldata, CD_TANGENT);
BLI_assert(tspace);
}
@@ -456,20 +433,13 @@ static TriTessFace *mesh_calc_tri_tessface(
looptri);
- const float *precomputed_normals = dm ? dm->getPolyDataArray(dm, CD_NORMAL) : NULL;
+ const float *precomputed_normals = me_eval ? CustomData_get_layer(&me_eval->pdata, CD_NORMAL) : NULL;
const bool calculate_normal = precomputed_normals ? false : true;
for (i = 0; i < tottri; i++) {
const MLoopTri *lt = &looptri[i];
const MPoly *mp = &me->mpoly[lt->poly];
-#ifdef USE_MFACE_WORKAROUND
- if (lt->poly != mpoly_prev_testindex) {
- test_index_face_looptri(mp, me->mloop, &looptri[i]);
- mpoly_prev_testindex = lt->poly;
- }
-#endif
-
triangles[i].mverts[0] = &mvert[me->mloop[lt->tri[0]].v];
triangles[i].mverts[1] = &mvert[me->mloop[lt->tri[1]].v];
triangles[i].mverts[2] = &mvert[me->mloop[lt->tri[2]].v];
@@ -510,8 +480,8 @@ bool RE_bake_pixels_populate_from_objects(
bool is_cage = me_cage != NULL;
bool result = true;
- DerivedMesh *dm_low = NULL;
- DerivedMesh **dm_highpoly;
+ Mesh *me_eval_low = NULL;
+ Mesh **me_highpoly;
BVHTreeFromMesh *treeData;
/* Note: all coordinates are in local space */
@@ -523,12 +493,12 @@ bool RE_bake_pixels_populate_from_objects(
tris_high = MEM_callocN(sizeof(TriTessFace *) * tot_highpoly, "MVerts Highpoly Mesh Array");
/* assume all highpoly tessfaces are triangles */
- dm_highpoly = MEM_mallocN(sizeof(DerivedMesh *) * tot_highpoly, "Highpoly Derived Meshes");
+ me_highpoly = MEM_mallocN(sizeof(Mesh *) * tot_highpoly, "Highpoly Derived Meshes");
treeData = MEM_callocN(sizeof(BVHTreeFromMesh) * tot_highpoly, "Highpoly BVH Trees");
if (!is_cage) {
- dm_low = CDDM_from_mesh(me_low);
- tris_low = mesh_calc_tri_tessface(me_low, true, dm_low);
+ me_eval_low = BKE_mesh_copy_for_eval(me_low, false);
+ tris_low = mesh_calc_tri_tessface(me_low, true, me_eval_low);
}
else if (is_custom_cage) {
tris_low = mesh_calc_tri_tessface(me_low, false, NULL);
@@ -543,12 +513,12 @@ bool RE_bake_pixels_populate_from_objects(
for (i = 0; i < tot_highpoly; i++) {
tris_high[i] = mesh_calc_tri_tessface(highpoly[i].me, false, NULL);
- dm_highpoly[i] = CDDM_from_mesh(highpoly[i].me);
- DM_ensure_tessface(dm_highpoly[i]);
+ me_highpoly[i] = highpoly[i].me;
+ BKE_mesh_runtime_looptri_ensure(me_highpoly[i]);
- if (dm_highpoly[i]->getNumTessFaces(dm_highpoly[i]) != 0) {
+ if (me_highpoly[i]->runtime.looptris.len != 0) {
/* Create a bvh-tree for each highpoly object */
- bvhtree_from_mesh_get(&treeData[i], dm_highpoly[i], BVHTREE_FROM_FACES, 2);
+ BKE_bvhtree_from_mesh_get(&treeData[i], me_highpoly[i], BVHTREE_FROM_FACES, 2);
if (treeData[i].tree == NULL) {
printf("Baking: out of memory while creating BHVTree for object \"%s\"\n", highpoly[i].ob->id.name + 2);
@@ -603,10 +573,6 @@ cleanup:
for (i = 0; i < tot_highpoly; i++) {
free_bvhtree_from_mesh(&treeData[i]);
- if (dm_highpoly[i]) {
- dm_highpoly[i]->release(dm_highpoly[i]);
- }
-
if (tris_high[i]) {
MEM_freeN(tris_high[i]);
}
@@ -614,10 +580,10 @@ cleanup:
MEM_freeN(tris_high);
MEM_freeN(treeData);
- MEM_freeN(dm_highpoly);
+ MEM_freeN(me_highpoly);
- if (dm_low) {
- dm_low->release(dm_low);
+ if (me_eval_low) {
+ BKE_id_free(NULL, me_eval_low);
}
if (tris_low) {
MEM_freeN(tris_low);
@@ -662,9 +628,6 @@ void RE_bake_pixels_populate(
const MLoopUV *mloopuv;
const int tottri = poly_to_tri_count(me->totpoly, me->totloop);
MLoopTri *looptri;
-#ifdef USE_MFACE_WORKAROUND
- unsigned int mpoly_prev_testindex = UINT_MAX;
-#endif
if ((uv_layer == NULL) || (uv_layer[0] == '\0')) {
mloopuv = CustomData_get_layer(&me->ldata, CD_MLOOPUV);
@@ -715,13 +678,6 @@ void RE_bake_pixels_populate(
bd.bk_image = &bake_images->data[image_id];
bd.primitive_id = ++p_id;
-#ifdef USE_MFACE_WORKAROUND
- if (lt->poly != mpoly_prev_testindex) {
- test_index_face_looptri(mp, me->mloop, &looptri[i]);
- mpoly_prev_testindex = lt->poly;
- }
-#endif
-
for (a = 0; a < 3; a++) {
const float *uv = mloopuv[lt->tri[a]].uv;
@@ -808,9 +764,9 @@ void RE_bake_normal_world_to_tangent(
TriTessFace *triangles;
- DerivedMesh *dm = CDDM_from_mesh(me);
+ Mesh *me_eval = BKE_mesh_copy_for_eval(me, false);
- triangles = mesh_calc_tri_tessface(me, true, dm);
+ triangles = mesh_calc_tri_tessface(me, true, me_eval);
BLI_assert(num_pixels >= 3);
@@ -906,8 +862,9 @@ void RE_bake_normal_world_to_tangent(
/* garbage collection */
MEM_freeN(triangles);
- if (dm)
- dm->release(dm);
+ if (me_eval) {
+ BKE_id_free(NULL, me_eval);
+ }
}
void RE_bake_normal_world_to_object(
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index 09ab3e39d5f..758600e89aa 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -459,7 +459,7 @@ rcti* RE_engine_get_current_tiles(Render *re, int *r_total_tiles, bool *r_needs_
if (pa->status == PART_STATUS_IN_PROGRESS) {
if (total_tiles >= allocation_size) {
/* Just in case we're using crazy network rendering with more
- * slaves as BLENDER_MAX_THREADS.
+ * workers than BLENDER_MAX_THREADS.
*/
allocation_size += allocation_step;
if (tiles == tiles_static) {
@@ -702,7 +702,6 @@ int RE_engine_render(Render *re, int do_all)
if (re->r.scemode & R_BUTS_PREVIEW)
engine->flag |= RE_ENGINE_PREVIEW;
engine->camera_override = re->camera_override;
- engine->layer_override = re->layer_override;
engine->resolution_x = re->winx;
engine->resolution_y = re->winy;
@@ -739,8 +738,13 @@ int RE_engine_render(Render *re, int do_all)
type->render(engine, engine->depsgraph);
- /* grease pencil render over previous render result */
- if (!RE_engine_test_break(engine)) {
+ /* Grease pencil render over previous render result.
+ *
+ * NOTE: External engine might have been requested to free its
+ * dependency graph, which is only allowed if there is no grease
+ * pencil (pipeline is taking care of that).
+ */
+ if (!RE_engine_test_break(engine) && engine->depsgraph != NULL) {
DRW_render_gpencil(engine, engine->depsgraph);
}
@@ -814,3 +818,18 @@ void RE_engine_register_pass(struct RenderEngine *engine, struct Scene *scene, s
}
}
}
+
+void RE_engine_free_blender_memory(RenderEngine *engine)
+{
+ /* Weak way to save memory, but not crash grease pencil.
+ *
+ * TODO(sergey): Find better solution for this.
+ * TODO(sergey): Try to find solution which does not involve looping over
+ * all the objects.
+ */
+ if (DRW_render_check_grease_pencil(engine->depsgraph)) {
+ return;
+ }
+ DEG_graph_free(engine->depsgraph);
+ engine->depsgraph = NULL;
+}
diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c
index 828d626f9a7..1420b8feef7 100644
--- a/source/blender/render/intern/source/initrender.c
+++ b/source/blender/render/intern/source/initrender.c
@@ -195,6 +195,25 @@ void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, flo
copy_m4_m4(mat, re->winmat);
}
+/* Must be called after RE_GetCameraWindow(), does not change re->winmat. */
+void RE_GetCameraWindowWithOverscan(struct Render *re, float mat[4][4], float overscan)
+{
+ CameraParams params;
+ params.is_ortho = re->winmat[3][3] != 0.0f;
+ params.clipsta = re->clipsta;
+ params.clipend = re->clipend;
+ params.viewplane = re->viewplane;
+
+ overscan *= max_ff(BLI_rctf_size_x(&params.viewplane), BLI_rctf_size_y(&params.viewplane));
+
+ params.viewplane.xmin -= overscan;
+ params.viewplane.xmax += overscan;
+ params.viewplane.ymin -= overscan;
+ params.viewplane.ymax += overscan;
+ BKE_camera_params_compute_matrix(&params);
+ copy_m4_m4(mat, params.winmat);
+}
+
void RE_GetCameraModelMatrix(Render *re, struct Object *camera, float r_mat[4][4])
{
BKE_camera_multiview_model_matrix(&re->r, camera, re->viewname, r_mat);
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index c6b372a53e5..a30a72d9dc8 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -70,16 +70,15 @@
#include "BKE_layer.h"
#include "BKE_library.h"
#include "BKE_library_remap.h"
-#include "BKE_main.h"
#include "BKE_modifier.h"
#include "BKE_node.h"
+#include "BKE_object.h"
#include "BKE_pointcache.h"
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_sequencer.h"
#include "BKE_sound.h"
#include "BKE_writeavi.h" /* <------ should be replaced once with generic movie module */
-#include "BKE_object.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
@@ -364,6 +363,13 @@ Scene *RE_GetScene(Render *re)
return NULL;
}
+void RE_SetScene(Render *re, Scene* sce)
+{
+ if (re) {
+ re->scene = sce;
+ }
+}
+
/**
* Same as #RE_AcquireResultImage but creating the necessary views to store the result
* fill provided result struct with a copy of thew views of what is done so far the
@@ -1202,7 +1208,6 @@ static void render_scene(Render *re, Scene *sce, int cfra)
/* still unsure entity this... */
resc->main = re->main;
resc->scene = sce;
- resc->lay = sce->lay;
/* ensure scene has depsgraph, base flags etc OK */
BKE_scene_set_background(re->main, sce);
@@ -1911,7 +1916,7 @@ const char *RE_GetActiveRenderView(Render *re)
/* evaluating scene options for general Blender render */
static int render_initialize_from_main(Render *re, RenderData *rd, Main *bmain, Scene *scene,
- ViewLayer *single_layer, Object *camera_override, unsigned int lay_override,
+ ViewLayer *single_layer, Object *camera_override,
int anim, int anim_init)
{
int winx, winy;
@@ -1941,9 +1946,6 @@ static int render_initialize_from_main(Render *re, RenderData *rd, Main *bmain,
re->main = bmain;
re->scene = scene;
re->camera_override = camera_override;
- re->lay = lay_override ? lay_override : scene->lay;
- re->layer_override = lay_override;
- re->i.localview = (re->lay & 0xFF000000) != 0;
re->viewname[0] = '\0';
/* not too nice, but it survives anim-border render */
@@ -1992,7 +1994,7 @@ void RE_SetReports(Render *re, ReportList *reports)
/* general Blender frame render call */
void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, ViewLayer *single_layer, Object *camera_override,
- unsigned int lay_override, int frame, const bool write_still)
+ int frame, const bool write_still)
{
BLI_callback_exec(re->main, (ID *)scene, BLI_CB_EVT_RENDER_INIT);
@@ -2002,7 +2004,7 @@ void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, ViewLayer *single_la
scene->r.cfra = frame;
if (render_initialize_from_main(re, &scene->r, bmain, scene, single_layer,
- camera_override, lay_override, 0, 0))
+ camera_override, 0, 0))
{
MEM_reset_peak_memory();
@@ -2045,7 +2047,7 @@ void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, ViewLayer *single_la
void RE_RenderFreestyleStrokes(Render *re, Main *bmain, Scene *scene, int render)
{
re->result_ok= 0;
- if (render_initialize_from_main(re, &scene->r, bmain, scene, NULL, NULL, scene->lay, 0, 0)) {
+ if (render_initialize_from_main(re, &scene->r, bmain, scene, NULL, NULL, 0, 0)) {
if (render)
do_render_3d(re);
}
@@ -2346,8 +2348,8 @@ static void re_movie_free_all(Render *re, bMovieHandle *mh, int totvideos)
}
/* saves images to disk */
-void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_override,
- unsigned int lay_override, int sfra, int efra, int tfra)
+void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, ViewLayer *single_layer, Object *camera_override,
+ int sfra, int efra, int tfra)
{
RenderData rd = scene->r;
bMovieHandle *mh = NULL;
@@ -2361,7 +2363,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
BLI_callback_exec(re->main, (ID *)scene, BLI_CB_EVT_RENDER_INIT);
/* do not fully call for each frame, it initializes & pops output window */
- if (!render_initialize_from_main(re, &rd, bmain, scene, NULL, camera_override, lay_override, 0, 1))
+ if (!render_initialize_from_main(re, &rd, bmain, scene, single_layer, camera_override, 0, 1))
return;
if (is_movie) {
@@ -2448,7 +2450,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
/* only border now, todo: camera lens. (ton) */
render_initialize_from_main(re, &rd, bmain, scene,
- NULL, camera_override, lay_override, 1, 0);
+ single_layer, camera_override, 1, 0);
if (nfra != scene->r.cfra) {
/* Skip this frame, but could update for physics and particles system. */
@@ -2612,7 +2614,6 @@ void RE_PreviewRender(Render *re, Main *bmain, Scene *sce)
re->main = bmain;
re->scene = sce;
- re->lay = sce->lay;
camera = RE_GetCamera(re);
RE_SetCamera(re, camera);
diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c
index 60e0a3d3843..ea5ca18d58a 100644
--- a/source/blender/render/intern/source/render_result.c
+++ b/source/blender/render/intern/source/render_result.c
@@ -45,11 +45,10 @@
#include "BLI_threads.h"
#include "BKE_appdir.h"
-#include "BKE_image.h"
+#include "BKE_camera.h"
#include "BKE_global.h"
-#include "BKE_main.h"
+#include "BKE_image.h"
#include "BKE_report.h"
-#include "BKE_camera.h"
#include "BKE_scene.h"
#include "IMB_imbuf.h"
diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c
index e24e14058ed..b41e2d7fae4 100644
--- a/source/blender/render/intern/source/render_texture.c
+++ b/source/blender/render/intern/source/render_texture.c
@@ -55,7 +55,6 @@
#include "BKE_animsys.h"
#include "BKE_colorband.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_material.h"
@@ -289,8 +288,8 @@ static int wood(Tex *tex, const float texvec[3], TexResult *texres)
static float marble_int(Tex *tex, float x, float y, float z)
{
float n, mi;
- short wf = tex->noisebasis2; /* wave form: TEX_SIN=0, TEX_SAW=1, TEX_TRI=2 */
- short mt = tex->stype; /* marble type: TEX_SOFT=0, TEX_SHARP=1,TEX_SHAPER=2 */
+ short wf = tex->noisebasis2; /* wave form: TEX_SIN=0, TEX_SAW=1, TEX_TRI=2 */
+ short mt = tex->stype; /* marble type: TEX_SOFT=0, TEX_SHARP=1, TEX_SHAPER=2 */
float (*waveform[3])(float); /* create array of pointers to waveform functions */
waveform[0] = tex_sin; /* assign address of tex_sin() function to pointer array */
diff --git a/source/blender/shader_fx/CMakeLists.txt b/source/blender/shader_fx/CMakeLists.txt
index dacc0b3f063..1807635aa8d 100644
--- a/source/blender/shader_fx/CMakeLists.txt
+++ b/source/blender/shader_fx/CMakeLists.txt
@@ -46,9 +46,11 @@ set(SRC
intern/FX_shader_blur.c
intern/FX_shader_colorize.c
intern/FX_shader_flip.c
+ intern/FX_shader_glow.c
intern/FX_shader_light.c
intern/FX_shader_pixel.c
intern/FX_shader_rim.c
+ intern/FX_shader_shadow.c
intern/FX_shader_swirl.c
intern/FX_shader_wave.c
diff --git a/source/blender/shader_fx/FX_shader_types.h b/source/blender/shader_fx/FX_shader_types.h
index b8d8f04e07f..311f5ec52e8 100644
--- a/source/blender/shader_fx/FX_shader_types.h
+++ b/source/blender/shader_fx/FX_shader_types.h
@@ -35,9 +35,11 @@ extern ShaderFxTypeInfo shaderfx_Type_None;
extern ShaderFxTypeInfo shaderfx_Type_Blur;
extern ShaderFxTypeInfo shaderfx_Type_Colorize;
extern ShaderFxTypeInfo shaderfx_Type_Flip;
+extern ShaderFxTypeInfo shaderfx_Type_Glow;
extern ShaderFxTypeInfo shaderfx_Type_Light;
extern ShaderFxTypeInfo shaderfx_Type_Pixel;
extern ShaderFxTypeInfo shaderfx_Type_Rim;
+extern ShaderFxTypeInfo shaderfx_Type_Shadow;
extern ShaderFxTypeInfo shaderfx_Type_Swirl;
extern ShaderFxTypeInfo shaderfx_Type_Wave;
diff --git a/source/blender/shader_fx/intern/FX_shader_glow.c b/source/blender/shader_fx/intern/FX_shader_glow.c
new file mode 100644
index 00000000000..cd513ed1f0a
--- /dev/null
+++ b/source/blender/shader_fx/intern/FX_shader_glow.c
@@ -0,0 +1,78 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2018, Blender Foundation
+ * This is a new part of Blender
+ *
+ * Contributor(s): Antonio Vazquez
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/** \file blender/shader_fx/intern/FX_shader_glow.c
+ * \ingroup shader_fx
+ */
+
+#include <stdio.h>
+
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_gpencil_types.h"
+
+#include "BLI_math_base.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_library_query.h"
+#include "BKE_modifier.h"
+#include "BKE_shader_fx.h"
+
+#include "FX_shader_types.h"
+
+static void initData(ShaderFxData *md)
+{
+ GlowShaderFxData *gpfx = (GlowShaderFxData *)md;
+ ARRAY_SET_ITEMS(gpfx->glow_color, 0.75f, 1.0f, 1.0f);
+ ARRAY_SET_ITEMS(gpfx->select_color, 0.0f, 0.0f, 0.0f);
+ gpfx->threshold = 0.1f;
+
+ ARRAY_SET_ITEMS(gpfx->blur, 50, 0);
+ gpfx->samples = 16;
+}
+
+static void copyData(const ShaderFxData *md, ShaderFxData *target)
+{
+ BKE_shaderfx_copyData_generic(md, target);
+}
+
+ShaderFxTypeInfo shaderfx_Type_Glow = {
+ /* name */ "Glow",
+ /* structName */ "GlowShaderFxData",
+ /* structSize */ sizeof(GlowShaderFxData),
+ /* type */ eShaderFxType_GpencilType,
+ /* flags */ 0,
+
+ /* copyData */ copyData,
+
+ /* initData */ initData,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
+ /* updateDepsgraph */ NULL,
+ /* dependsOnTime */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
+};
diff --git a/source/blender/shader_fx/intern/FX_shader_pixel.c b/source/blender/shader_fx/intern/FX_shader_pixel.c
index a3ffd3a9b0d..8c5c38d6aa7 100644
--- a/source/blender/shader_fx/intern/FX_shader_pixel.c
+++ b/source/blender/shader_fx/intern/FX_shader_pixel.c
@@ -39,7 +39,6 @@ static void initData(ShaderFxData *fx)
PixelShaderFxData *gpfx = (PixelShaderFxData *)fx;
ARRAY_SET_ITEMS(gpfx->size, 5, 5);
ARRAY_SET_ITEMS(gpfx->rgba, 0.0f, 0.0f, 0.0f, 0.9f);
- gpfx->flag |= FX_PIXEL_USE_LINES;
}
static void copyData(const ShaderFxData *md, ShaderFxData *target)
diff --git a/source/blender/shader_fx/intern/FX_shader_rim.c b/source/blender/shader_fx/intern/FX_shader_rim.c
index bea6f645033..72be2202867 100644
--- a/source/blender/shader_fx/intern/FX_shader_rim.c
+++ b/source/blender/shader_fx/intern/FX_shader_rim.c
@@ -43,7 +43,9 @@ static void initData(ShaderFxData *fx)
ARRAY_SET_ITEMS(gpfx->rim_rgb, 1.0f, 1.0f, 0.5f);
ARRAY_SET_ITEMS(gpfx->mask_rgb, 0.0f, 0.0f, 0.0f);
gpfx->mode = eShaderFxRimMode_Multiply;
- ARRAY_SET_ITEMS(gpfx->blur, 0, 0);
+
+ ARRAY_SET_ITEMS(gpfx->blur, 5, 5);
+ gpfx->samples = 2;
}
static void copyData(const ShaderFxData *md, ShaderFxData *target)
diff --git a/source/blender/shader_fx/intern/FX_shader_shadow.c b/source/blender/shader_fx/intern/FX_shader_shadow.c
new file mode 100644
index 00000000000..e3a9543fcb4
--- /dev/null
+++ b/source/blender/shader_fx/intern/FX_shader_shadow.c
@@ -0,0 +1,113 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2018, Blender Foundation
+ * This is a new part of Blender
+ *
+ * Contributor(s): Antonio Vazquez
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/** \file blender/shader_fx/intern/FX_shader_shadow.c
+ * \ingroup shader_fx
+ */
+
+#include <stdio.h>
+
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_gpencil_types.h"
+
+#include "BLI_math_base.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_library_query.h"
+#include "BKE_modifier.h"
+#include "BKE_shader_fx.h"
+
+#include "FX_shader_types.h"
+
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
+
+static void initData(ShaderFxData *md)
+{
+ ShadowShaderFxData *gpfx = (ShadowShaderFxData *)md;
+ gpfx->rotation = 0.0f;
+ ARRAY_SET_ITEMS(gpfx->offset, 15, 20);
+ ARRAY_SET_ITEMS(gpfx->scale, 1.0f, 1.0f);
+ ARRAY_SET_ITEMS(gpfx->shadow_rgba, 0.54f, 0.62f, 1.0f, 0.9f);
+
+ gpfx->amplitude = 10.0f;
+ gpfx->period = 20.0f;
+ gpfx->phase = 0.0f;
+ gpfx->orientation = 1;
+
+ ARRAY_SET_ITEMS(gpfx->blur, 5, 5);
+ gpfx->samples = 2;
+}
+
+static void copyData(const ShaderFxData *md, ShaderFxData *target)
+{
+ BKE_shaderfx_copyData_generic(md, target);
+}
+
+static void updateDepsgraph(ShaderFxData *fx, const ModifierUpdateDepsgraphContext *ctx)
+{
+ ShadowShaderFxData *fxd = (ShadowShaderFxData *)fx;
+ if (fxd->object != NULL) {
+ DEG_add_object_relation(ctx->node, fxd->object, DEG_OB_COMP_GEOMETRY, "Shadow ShaderFx");
+ DEG_add_object_relation(ctx->node, fxd->object, DEG_OB_COMP_TRANSFORM, "Shadow ShaderFx");
+ }
+ DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Shadow ShaderFx");
+}
+
+static bool isDisabled(ShaderFxData *fx, int UNUSED(userRenderParams))
+{
+ ShadowShaderFxData *fxd = (ShadowShaderFxData *)fx;
+
+ return (!fxd->object) && (fxd->flag & FX_SHADOW_USE_OBJECT);
+}
+
+static void foreachObjectLink(
+ ShaderFxData *fx, Object *ob,
+ ShaderFxObjectWalkFunc walk, void *userData)
+{
+ ShadowShaderFxData *fxd = (ShadowShaderFxData *)fx;
+
+ walk(userData, ob, &fxd->object, IDWALK_CB_NOP);
+}
+
+ShaderFxTypeInfo shaderfx_Type_Shadow = {
+ /* name */ "Shadow",
+ /* structName */ "ShadowShaderFxData",
+ /* structSize */ sizeof(ShadowShaderFxData),
+ /* type */ eShaderFxType_GpencilType,
+ /* flags */ 0,
+
+ /* copyData */ copyData,
+
+ /* initData */ initData,
+ /* freeData */ NULL,
+ /* isDisabled */ isDisabled,
+ /* updateDepsgraph */ updateDepsgraph,
+ /* dependsOnTime */ NULL,
+ /* foreachObjectLink */ foreachObjectLink,
+ /* foreachIDLink */ NULL,
+};
diff --git a/source/blender/shader_fx/intern/FX_shader_util.c b/source/blender/shader_fx/intern/FX_shader_util.c
index 64a1553adec..b74ff45b991 100644
--- a/source/blender/shader_fx/intern/FX_shader_util.c
+++ b/source/blender/shader_fx/intern/FX_shader_util.c
@@ -46,9 +46,11 @@ void shaderfx_type_init(ShaderFxTypeInfo *types[])
INIT_FX_TYPE(Blur);
INIT_FX_TYPE(Colorize);
INIT_FX_TYPE(Flip);
+ INIT_FX_TYPE(Glow);
INIT_FX_TYPE(Light);
INIT_FX_TYPE(Pixel);
INIT_FX_TYPE(Rim);
+ INIT_FX_TYPE(Shadow);
INIT_FX_TYPE(Swirl);
INIT_FX_TYPE(Wave);
#undef INIT_FX_TYPE
diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt
index edf76364503..173e32ea0bb 100644
--- a/source/blender/windowmanager/CMakeLists.txt
+++ b/source/blender/windowmanager/CMakeLists.txt
@@ -67,6 +67,7 @@ set(SRC
intern/wm_init_exit.c
intern/wm_jobs.c
intern/wm_keymap.c
+ intern/wm_keymap_utils.c
intern/wm_menu_type.c
intern/wm_operator_props.c
intern/wm_operator_type.c
@@ -91,6 +92,7 @@ set(SRC
WM_api.h
WM_keymap.h
+ WM_message.h
WM_toolsystem.h
WM_types.h
wm.h
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 39364ee27be..7628217d88f 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -29,12 +29,12 @@
/** \file blender/windowmanager/WM_api.h
* \ingroup wm
*
- * \page wmpage windowmanager
- * \section wmabout About windowmanager
- * \ref wm handles events received from \ref GHOST and manages
- * the screens, areas and input for Blender
- * \section wmnote NOTE
- * \todo document
+ * \page wmpage windowmanager
+ * \section wmabout About windowmanager
+ * \ref wm handles events received from \ref GHOST and manages
+ * the screens, areas and input for Blender
+ * \section wmnote NOTE
+ * \todo document
*/
/* dna-savable wmStructs here */
@@ -58,6 +58,7 @@ struct wmMsgSubscribeKey;
struct wmMsgSubscribeValue;
struct wmOperatorType;
struct wmOperator;
+struct wmPaintCursor;
struct rcti;
struct PointerRNA;
struct PropertyRNA;
@@ -88,6 +89,7 @@ const char *WM_init_state_app_template_get(void);
void WM_init_state_size_set (int stax, int stay, int sizx, int sizy);
void WM_init_state_fullscreen_set(void);
void WM_init_state_normal_set(void);
+void WM_init_window_focus_set(bool do_it);
void WM_init_native_pixels(bool do_it);
void WM_init (struct bContext *C, int argc, const char **argv);
@@ -169,15 +171,17 @@ void WM_cursor_grab_enable(struct wmWindow *win, bool wrap, bool hide, int boun
void WM_cursor_grab_disable(struct wmWindow *win, const int mouse_ungrab_xy[2]);
void WM_cursor_time (struct wmWindow *win, int nr);
-void *WM_paint_cursor_activate(
+struct wmPaintCursor *WM_paint_cursor_activate(
struct wmWindowManager *wm,
+ short space_type, short region_type,
bool (*poll)(struct bContext *C),
void (*draw)(struct bContext *C, int, int, void *customdata),
void *customdata);
-void WM_paint_cursor_end(struct wmWindowManager *wm, void *handle);
+bool WM_paint_cursor_end(struct wmWindowManager *wm, struct wmPaintCursor *handle);
void WM_paint_cursor_tag_redraw(struct wmWindow *win, struct ARegion *ar);
+
void WM_cursor_warp (struct wmWindow *win, int x, int y);
void WM_cursor_compatible_xy(wmWindow *win, int *x, int *y);
float WM_cursor_pressure (const struct wmWindow *win);
@@ -350,10 +354,10 @@ void WM_operator_properties_filesel(
void WM_operator_properties_border(struct wmOperatorType *ot);
void WM_operator_properties_border_to_rcti(struct wmOperator *op, struct rcti *rect);
void WM_operator_properties_border_to_rctf(struct wmOperator *op, rctf *rect);
-void WM_operator_properties_gesture_border_ex(struct wmOperatorType *ot, bool deselect, bool extend);
-void WM_operator_properties_gesture_border(struct wmOperatorType *ot);
-void WM_operator_properties_gesture_border_select(struct wmOperatorType *ot);
-void WM_operator_properties_gesture_border_zoom(struct wmOperatorType *ot);
+void WM_operator_properties_gesture_box_ex(struct wmOperatorType *ot, bool deselect, bool extend);
+void WM_operator_properties_gesture_box(struct wmOperatorType *ot);
+void WM_operator_properties_gesture_box_select(struct wmOperatorType *ot);
+void WM_operator_properties_gesture_box_zoom(struct wmOperatorType *ot);
void WM_operator_properties_gesture_lasso_ex(struct wmOperatorType *ot, bool deselect, bool extend);
void WM_operator_properties_gesture_lasso(struct wmOperatorType *ot);
void WM_operator_properties_gesture_lasso_select(struct wmOperatorType *ot);
@@ -444,9 +448,9 @@ bool WM_paneltype_add(struct PanelType *mt);
void WM_paneltype_remove(struct PanelType *mt);
/* wm_gesture_ops.c */
-int WM_gesture_border_invoke (struct bContext *C, struct wmOperator *op, const struct wmEvent *event);
-int WM_gesture_border_modal (struct bContext *C, struct wmOperator *op, const struct wmEvent *event);
-void WM_gesture_border_cancel(struct bContext *C, struct wmOperator *op);
+int WM_gesture_box_invoke (struct bContext *C, struct wmOperator *op, const struct wmEvent *event);
+int WM_gesture_box_modal (struct bContext *C, struct wmOperator *op, const struct wmEvent *event);
+void WM_gesture_box_cancel(struct bContext *C, struct wmOperator *op);
int WM_gesture_circle_invoke(struct bContext *C, struct wmOperator *op, const struct wmEvent *event);
int WM_gesture_circle_modal(struct bContext *C, struct wmOperator *op, const struct wmEvent *event);
void WM_gesture_circle_cancel(struct bContext *C, struct wmOperator *op);
@@ -624,8 +628,16 @@ bool WM_window_modal_keymap_status_draw(
struct uiLayout *layout);
/* wm_tooltip.c */
-typedef struct ARegion *(*wmTooltipInitFn)(struct bContext *, struct ARegion *, bool *);
+typedef struct ARegion *(*wmTooltipInitFn)(
+ struct bContext *C, struct ARegion *ar,
+ int *pass, double *r_pass_delay, bool *r_exit_on_event);
+void WM_tooltip_immediate_init(
+ struct bContext *C, struct wmWindow *win, struct ARegion *ar,
+ wmTooltipInitFn init);
+void WM_tooltip_timer_init_ex(
+ struct bContext *C, struct wmWindow *win, struct ARegion *ar,
+ wmTooltipInitFn init, double delay);
void WM_tooltip_timer_init(
struct bContext *C, struct wmWindow *win, struct ARegion *ar,
wmTooltipInitFn init);
@@ -633,6 +645,7 @@ void WM_tooltip_timer_clear(struct bContext *C, struct wmWindow *win);
void WM_tooltip_clear(struct bContext *C, struct wmWindow *win);
void WM_tooltip_init(struct bContext *C, struct wmWindow *win);
void WM_tooltip_refresh(struct bContext *C, struct wmWindow *win);
+double WM_tooltip_time_closed(void);
#ifdef __cplusplus
}
diff --git a/source/blender/windowmanager/WM_keymap.h b/source/blender/windowmanager/WM_keymap.h
index e184cfe9aa3..b27d6b44ab0 100644
--- a/source/blender/windowmanager/WM_keymap.h
+++ b/source/blender/windowmanager/WM_keymap.h
@@ -58,21 +58,12 @@ void WM_keyconfig_update_operatortype(void);
void WM_keymap_init (struct bContext *C);
void WM_keymap_free (struct wmKeyMap *keymap);
-wmKeyMapItem *WM_keymap_verify_item(struct wmKeyMap *keymap, const char *idname, int type,
- int val, int modifier, int keymodifier);
-wmKeyMapItem *WM_keymap_add_item(struct wmKeyMap *keymap, const char *idname, int type,
- int val, int modifier, int keymodifier);
-wmKeyMapItem *WM_keymap_add_menu(struct wmKeyMap *keymap, const char *idname, int type,
- int val, int modifier, int keymodifier);
-wmKeyMapItem *WM_keymap_add_menu_pie(struct wmKeyMap *keymap, const char *idname, int type,
- int val, int modifier, int keymodifier);
-wmKeyMapItem *WM_keymap_add_panel(struct wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier);
-wmKeyMapItem *WM_keymap_add_tool(struct wmKeyMap *keymap, const char *idname, int type,
- int val, int modifier, int keymodifier);
-
-void WM_keymap_add_context_enum_set_items(
- wmKeyMap *keymap, const struct EnumPropertyItem *items, const char *data_path,
- int type_start, int val, int modifier, int keymodifier);
+wmKeyMapItem *WM_keymap_verify_item(
+ struct wmKeyMap *keymap, const char *idname, int type,
+ int val, int modifier, int keymodifier);
+wmKeyMapItem *WM_keymap_add_item(
+ struct wmKeyMap *keymap, const char *idname, int type,
+ int val, int modifier, int keymodifier);
bool WM_keymap_remove_item(struct wmKeyMap *keymap, struct wmKeyMapItem *kmi);
int WM_keymap_item_to_string(wmKeyMapItem *kmi, const bool compact, char *result, const int result_len);
@@ -81,13 +72,36 @@ wmKeyMap *WM_keymap_list_find(ListBase *lb, const char *idname, int spaceid, int
wmKeyMap *WM_keymap_ensure(struct wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid);
wmKeyMap *WM_keymap_find_all(const struct bContext *C, const char *idname, int spaceid, int regionid);
wmKeyMap *WM_keymap_active(struct wmWindowManager *wm, struct wmKeyMap *keymap);
-wmKeyMap *WM_keymap_guess_opname(const struct bContext *C, const char *opname);
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);
+/* keymap_utils.c */
+
+/** Wrappers for #WM_keymap_add_item */
+wmKeyMapItem *WM_keymap_add_menu(
+ struct wmKeyMap *keymap, const char *idname, int type,
+ int val, int modifier, int keymodifier);
+wmKeyMapItem *WM_keymap_add_menu_pie(
+ struct wmKeyMap *keymap, const char *idname, int type,
+ int val, int modifier, int keymodifier);
+wmKeyMapItem *WM_keymap_add_panel(
+ struct wmKeyMap *keymap, const char *idname, int type,
+ int val, int modifier, int keymodifier);
+wmKeyMapItem *WM_keymap_add_tool(
+ struct wmKeyMap *keymap, const char *idname, int type,
+ int val, int modifier, int keymodifier);
+
+void WM_keymap_add_context_enum_set_items(
+ wmKeyMap *keymap, const struct EnumPropertyItem *items, const char *data_path,
+ int type_start, int val, int modifier, int keymodifier);
+
+wmKeyMap *WM_keymap_guess_opname(const struct bContext *C, const char *opname);
+
+void WM_keymap_fix_linking(void);
+
/* Modal Keymap */
int WM_modalkeymap_items_to_string(
diff --git a/source/blender/windowmanager/WM_toolsystem.h b/source/blender/windowmanager/WM_toolsystem.h
index f4505bef962..7410bf4ab09 100644
--- a/source/blender/windowmanager/WM_toolsystem.h
+++ b/source/blender/windowmanager/WM_toolsystem.h
@@ -40,9 +40,16 @@ struct wmOperatorType;
struct PointerRNA;
struct ScrArea;
struct Main;
+struct StructRNA;
+struct WorkSpace;
/* wm_toolsystem.c */
+#define WM_TOOLSYSTEM_SPACE_MASK ( \
+ (1 << SPACE_VIEW3D) | \
+ (1 << SPACE_IMAGE) \
+)
+
/* Values that define a categoey of active tool. */
typedef struct bToolKey { int space_type; int mode; } bToolKey;
@@ -52,7 +59,7 @@ bool WM_toolsystem_ref_ensure(
struct WorkSpace *workspace, const bToolKey *tkey,
struct bToolRef **r_tref);
struct bToolRef *WM_toolsystem_ref_set_by_name(
- bContext *C, struct WorkSpace *workspace, const bToolKey *tkey,
+ struct bContext *C, struct WorkSpace *workspace, const bToolKey *tkey,
const char *name, bool cycle);
struct bToolRef_Runtime *WM_toolsystem_runtime_from_context(struct bContext *C);
@@ -70,6 +77,9 @@ void WM_toolsystem_ref_set_from_runtime(
struct bContext *C, struct WorkSpace *workspace, struct bToolRef *tref,
const struct bToolRef_Runtime *tool, const char *idname);
+void WM_toolsystem_ref_sync_from_context(
+ struct Main *bmain, struct WorkSpace *workspace, struct bToolRef *tref);
+
void WM_toolsystem_init(struct bContext *C);
int WM_toolsystem_mode_from_spacetype(
@@ -88,11 +98,19 @@ void WM_toolsystem_do_msg_notify_tag_refresh(
struct bContext *C, struct wmMsgSubscribeKey *msg_key, struct wmMsgSubscribeValue *msg_val);
struct IDProperty *WM_toolsystem_ref_properties_ensure_idprops(struct bToolRef *tref);
-void WM_toolsystem_ref_properties_ensure(struct bToolRef *tref, struct wmOperatorType *ot, struct PointerRNA *ptr);
+void WM_toolsystem_ref_properties_ensure_ex(
+ struct bToolRef *tref, const char *idname, struct StructRNA *type, struct PointerRNA *r_ptr);
+
+#define WM_toolsystem_ref_properties_ensure_from_operator(tref, ot, r_ptr) \
+ WM_toolsystem_ref_properties_ensure_ex(tref, (ot)->idname, (ot)->srna, r_ptr)
+#define WM_toolsystem_ref_properties_ensure_from_gizmo_group(tref, ot, r_ptr) \
+ WM_toolsystem_ref_properties_ensure_ex(tref, (ot)->idname, (ot)->srna, r_ptr)
void WM_toolsystem_ref_properties_init_for_keymap(
struct bToolRef *tref, struct PointerRNA *dst_ptr, struct PointerRNA *src_ptr, struct wmOperatorType *ot);
+void WM_toolsystem_refresh_active(struct bContext *C);
+
void WM_toolsystem_refresh_screen_area(struct WorkSpace *workspace, struct ViewLayer *view_layer, struct ScrArea *sa);
void WM_toolsystem_refresh_screen_all(struct Main *bmain);
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index 4882741680a..0036ae7834d 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -718,9 +718,13 @@ typedef struct wmTooltipState {
/** The tooltip region. */
struct ARegion *region;
/** Create the tooltip region (assign to 'region'). */
- struct ARegion *(*init)(struct bContext *, struct ARegion *, bool *r_exit_on_event);
+ struct ARegion *(*init)(
+ struct bContext *C, struct ARegion *ar,
+ int *pass, double *pass_delay, bool *r_exit_on_event);
/** Exit on any event, not needed for buttons since their highlight state is used. */
bool exit_on_event;
+ /** Pass, use when we want multiple tips, count down to zero. */
+ int pass;
} wmTooltipState;
/* *************** migrated stuff, clean later? ************** */
diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_api.h b/source/blender/windowmanager/gizmo/WM_gizmo_api.h
index b59bdd4cf63..9f05437eaa8 100644
--- a/source/blender/windowmanager/gizmo/WM_gizmo_api.h
+++ b/source/blender/windowmanager/gizmo/WM_gizmo_api.h
@@ -212,7 +212,7 @@ void WM_gizmo_target_property_float_set_array(
struct bContext *C, const struct wmGizmo *gz, struct wmGizmoProperty *gz_prop,
const float *value);
-bool WM_gizmo_target_property_range_get(
+bool WM_gizmo_target_property_float_range_get(
const struct wmGizmo *gz, struct wmGizmoProperty *gz_prop,
float range[2]);
@@ -240,6 +240,9 @@ struct wmKeyMap *WM_gizmogroup_keymap_common(
struct wmKeyMap *WM_gizmogroup_keymap_common_select(
const struct wmGizmoGroupType *gzgt, struct wmKeyConfig *config);
+/* Sort utilities for use with 'BLI_listbase_sort'. */
+int WM_gizmo_cmp_temp_fl(const void *gz_a_ptr, const void *gz_b_ptr);
+int WM_gizmo_cmp_temp_fl_reverse(const void *gz_a_ptr, const void *gz_b_ptr);
/* -------------------------------------------------------------------- */
/* wmGizmoMap */
@@ -267,7 +270,7 @@ bool WM_gizmomap_minmax(
float r_min[3], float r_max[3]);
struct ARegion *WM_gizmomap_tooltip_init(
- struct bContext *C, struct ARegion *ar, bool *r_exit_on_event);
+ struct bContext *C, struct ARegion *ar, int *pass, double *pass_delay, bool *r_exit_on_event);
/* -------------------------------------------------------------------- */
/* wmGizmoMapType */
@@ -314,12 +317,12 @@ void WM_gizmo_group_type_add_ptr(
struct wmGizmoGroupType *gzgt);
void WM_gizmo_group_type_add(const char *idname);
-void WM_gizmo_group_type_ensure_ptr_ex(
+bool WM_gizmo_group_type_ensure_ptr_ex(
struct wmGizmoGroupType *gzgt,
struct wmGizmoMapType *gzmap_type);
-void WM_gizmo_group_type_ensure_ptr(
+bool WM_gizmo_group_type_ensure_ptr(
struct wmGizmoGroupType *gzgt);
-void WM_gizmo_group_type_ensure(const char *idname);
+bool WM_gizmo_group_type_ensure(const char *idname);
void WM_gizmo_group_type_remove_ptr_ex(
struct Main *bmain, struct wmGizmoGroupType *gzgt,
@@ -335,6 +338,14 @@ void WM_gizmo_group_type_unlink_delayed_ptr(
struct wmGizmoGroupType *gzgt);
void WM_gizmo_group_type_unlink_delayed(const char *idname);
+/* Has the result of unlinking and linking (re-initializes gizmo's). */
+void WM_gizmo_group_type_reinit_ptr_ex(
+ struct Main *bmain, struct wmGizmoGroupType *gzgt,
+ struct wmGizmoMapType *gzmap_type);
+void WM_gizmo_group_type_reinit_ptr(
+ struct Main *bmain, struct wmGizmoGroupType *gzgt);
+void WM_gizmo_group_type_reinit(struct Main *bmain, const char *idname);
+
/* Utilities */
bool WM_gizmo_context_check_drawstep(const struct bContext *C, eWM_GizmoFlagMapDrawStep step);
diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_types.h b/source/blender/windowmanager/gizmo/WM_gizmo_types.h
index 2339523db5e..c92172dff15 100644
--- a/source/blender/windowmanager/gizmo/WM_gizmo_types.h
+++ b/source/blender/windowmanager/gizmo/WM_gizmo_types.h
@@ -66,46 +66,58 @@ typedef enum eWM_GizmoFlagState {
* #wmGizmo.flag
* Flags for individual gizmos.
*/
-typedef enum eWM_GizmoFlagFlag {
- WM_GIZMO_DRAW_HOVER = (1 << 0), /* draw *only* while hovering */
- WM_GIZMO_DRAW_MODAL = (1 << 1), /* draw while dragging */
- WM_GIZMO_DRAW_VALUE = (1 << 2), /* draw an indicator for the current value while dragging */
- WM_GIZMO_HIDDEN = (1 << 3),
+typedef enum eWM_GizmoFlag {
+ WM_GIZMO_DRAW_HOVER = (1 << 0), /* draw *only* while hovering */
+ WM_GIZMO_DRAW_MODAL = (1 << 1), /* draw while dragging */
+ WM_GIZMO_DRAW_VALUE = (1 << 2), /* draw an indicator for the current value while dragging */
+ WM_GIZMO_HIDDEN = (1 << 3),
+ WM_GIZMO_HIDDEN_SELECT = (1 << 4),
/**
* When set 'scale_final' value also scales the offset.
* Use when offset is to avoid screen-space overlap instead of absolute positioning. */
- WM_GIZMO_DRAW_OFFSET_SCALE = (1 << 4),
+ WM_GIZMO_DRAW_OFFSET_SCALE = (1 << 5),
/**
* User should still use 'scale_final' for any handles and UI elements.
* This simply skips scale when calculating the final matrix.
* Needed when the gizmo needs to align with the interface underneath it. */
- WM_GIZMO_DRAW_NO_SCALE = (1 << 5),
+ WM_GIZMO_DRAW_NO_SCALE = (1 << 6),
/**
* Hide the cursor and lock it's position while interacting with this gizmo.
*/
- WM_GIZMO_GRAB_CURSOR = (1 << 6),
+ WM_GIZMO_MOVE_CURSOR = (1 << 7),
/** Don't write into the depth buffer when selecting. */
- WM_GIZMO_SELECT_BACKGROUND = (1 << 7),
-} eWM_GizmoFlagFlag;
+ WM_GIZMO_SELECT_BACKGROUND = (1 << 8),
+} eWM_GizmoFlag;
/**
* #wmGizmoGroupType.flag
* Flags that influence the behavior of all gizmos in the group.
*/
typedef enum eWM_GizmoFlagGroupTypeFlag {
- /* Mark gizmo-group as being 3D */
+ /** Mark gizmo-group as being 3D */
WM_GIZMOGROUPTYPE_3D = (1 << 0),
- /* Scale gizmos as 3D object that respects zoom (otherwise zoom independent draw size).
+ /** Scale gizmos as 3D object that respects zoom (otherwise zoom independent draw size).
* note: currently only for 3D views, 2D support needs adding. */
WM_GIZMOGROUPTYPE_SCALE = (1 << 1),
- /* Gizmos can be depth culled with scene objects (covered by other geometry - TODO) */
+ /** Gizmos can be depth culled with scene objects (covered by other geometry - TODO) */
WM_GIZMOGROUPTYPE_DEPTH_3D = (1 << 2),
- /* Gizmos can be selected */
+ /** Gizmos can be selected */
WM_GIZMOGROUPTYPE_SELECT = (1 << 3),
- /* The gizmo group is to be kept (not removed on loading a new file for eg). */
+ /** The gizmo group is to be kept (not removed on loading a new file for eg). */
WM_GIZMOGROUPTYPE_PERSISTENT = (1 << 4),
- /* Show all other gizmos when interacting. */
+ /** Show all other gizmos when interacting. */
WM_GIZMOGROUPTYPE_DRAW_MODAL_ALL = (1 << 5),
+ /**
+ * When used with tool, only run when activating the tool,
+ * instead of linking the gizmo while the tool is active.
+ *
+ * \warning this option has some limitations, we might even re-implement this differently.
+ * Currently it's quite minimal so we can see how it works out.
+ * The main issue is controlling how a gizmo is activated with a tool
+ * when a tool can activate multiple operators based on the key-map.
+ * We could even move the options into the key-map item.
+ * ~ campbell */
+ WM_GIZMOGROUPTYPE_TOOL_INIT = (1 << 6),
} eWM_GizmoFlagGroupTypeFlag;
@@ -179,7 +191,7 @@ struct wmGizmo {
struct PointerRNA *ptr;
/* flags that influence the behavior or how the gizmos are drawn */
- eWM_GizmoFlagFlag flag;
+ eWM_GizmoFlag flag;
/* state flags (active, highlighted, selected) */
eWM_GizmoFlagState state;
@@ -223,6 +235,11 @@ struct wmGizmo {
struct IDProperty *properties;
+ /* Temporary data (assume dirty). */
+ union {
+ float f;
+ } temp;
+
/* over alloc target_properties after 'wmGizmoType.struct_size' */
};
@@ -355,6 +372,8 @@ typedef struct wmGizmoGroupType {
wmGizmoGroupFnRefresh refresh;
/* refresh data for drawing, called before each redraw */
wmGizmoGroupFnDrawPrepare draw_prepare;
+ /* Initialize data for before invoke. */
+ wmGizmoGroupFnInvokePrepare invoke_prepare;
/* Keymap init callback for this gizmo-group (optional),
* will fall back to default tweak keymap when left NULL. */
@@ -370,11 +389,11 @@ typedef struct wmGizmoGroupType {
/* Only for convenient removal. */
struct wmKeyConfig *keyconf;
- /* Disable for now, maybe some day we want properties. */
-#if 0
- /* rna for properties */
+ /* Note: currently gizmo-group instances don't store properties,
+ * they're kept in the tool properties. */
+
+ /* RNA for properties */
struct StructRNA *srna;
-#endif
/* RNA integration */
ExtensionRNA ext;
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo.c
index 14deb0be725..123857f3251 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo.c
@@ -258,19 +258,19 @@ PointerRNA *WM_gizmo_operator_set(
gz->op_data_len = part_index + 1;
gz->op_data = MEM_recallocN(gz->op_data, sizeof(*gz->op_data) * gz->op_data_len);
}
- wmGizmoOpElem *mpop = &gz->op_data[part_index];
- mpop->type = ot;
+ wmGizmoOpElem *gzop = &gz->op_data[part_index];
+ gzop->type = ot;
- if (mpop->ptr.data) {
- WM_operator_properties_free(&mpop->ptr);
+ if (gzop->ptr.data) {
+ WM_operator_properties_free(&gzop->ptr);
}
- WM_operator_properties_create_ptr(&mpop->ptr, ot);
+ WM_operator_properties_create_ptr(&gzop->ptr, ot);
if (properties) {
- mpop->ptr.data = properties;
+ gzop->ptr.data = properties;
}
- return &mpop->ptr;
+ return &gzop->ptr;
}
static void wm_gizmo_set_matrix_rotation_from_z_axis__internal(
@@ -627,7 +627,7 @@ void WM_gizmo_calc_matrix_final(const wmGizmo *gz, float r_mat[4][4])
);
}
-/** \name Gizmo Propery Access
+/** \name Gizmo Property Access
*
* Matches `WM_operator_properties` conventions.
*
@@ -700,7 +700,7 @@ void WM_gizmo_properties_sanitize(PointerRNA *ptr, const bool no_context)
/** set all props to their default,
* \param do_update Only update un-initialized props.
*
- * \note, theres nothing specific to gizmos here.
+ * \note, there's nothing specific to gizmos here.
* this could be made a general function.
*/
bool WM_gizmo_properties_default(PointerRNA *ptr, const bool do_update)
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
index e46cd9049a5..90a0ff8b651 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
@@ -147,12 +147,30 @@ void wm_gizmogroup_gizmo_register(wmGizmoGroup *gzgroup, wmGizmo *gz)
gz->parent_gzgroup = gzgroup;
}
+int WM_gizmo_cmp_temp_fl(const void *gz_a_ptr, const void *gz_b_ptr)
+{
+ const wmGizmo *gz_a = gz_a_ptr;
+ const wmGizmo *gz_b = gz_b_ptr;
+ if (gz_a->temp.f < gz_b->temp.f) return -1;
+ else if (gz_a->temp.f > gz_b->temp.f) return 1;
+ else return 0;
+}
+
+int WM_gizmo_cmp_temp_fl_reverse(const void *gz_a_ptr, const void *gz_b_ptr)
+{
+ const wmGizmo *gz_a = gz_a_ptr;
+ const wmGizmo *gz_b = gz_b_ptr;
+ if (gz_a->temp.f < gz_b->temp.f) return 1;
+ else if (gz_a->temp.f > gz_b->temp.f) return -1;
+ else return 0;
+}
+
wmGizmo *wm_gizmogroup_find_intersected_gizmo(
const wmGizmoGroup *gzgroup, bContext *C, const wmEvent *event,
int *r_part)
{
for (wmGizmo *gz = gzgroup->gizmos.first; gz; gz = gz->next) {
- if (gz->type->test_select && (gz->flag & WM_GIZMO_HIDDEN) == 0) {
+ if (gz->type->test_select && (gz->flag & (WM_GIZMO_HIDDEN | WM_GIZMO_HIDDEN_SELECT)) == 0) {
if ((*r_part = gz->type->test_select(C, gz, event->mval)) != -1) {
return gz;
}
@@ -168,7 +186,7 @@ wmGizmo *wm_gizmogroup_find_intersected_gizmo(
void wm_gizmogroup_intersectable_gizmos_to_list(const wmGizmoGroup *gzgroup, ListBase *listbase)
{
for (wmGizmo *gz = gzgroup->gizmos.first; gz; gz = gz->next) {
- if ((gz->flag & WM_GIZMO_HIDDEN) == 0) {
+ if ((gz->flag & (WM_GIZMO_HIDDEN | WM_GIZMO_HIDDEN_SELECT)) == 0) {
if (((gzgroup->type->flag & WM_GIZMOGROUPTYPE_3D) && (gz->type->draw_select || gz->type->test_select)) ||
((gzgroup->type->flag & WM_GIZMOGROUPTYPE_3D) == 0 && gz->type->test_select))
{
@@ -351,20 +369,20 @@ static bool gizmo_tweak_start(
static bool gizmo_tweak_start_and_finish(
bContext *C, wmGizmoMap *gzmap, wmGizmo *gz, const wmEvent *event, bool *r_is_modal)
{
- wmGizmoOpElem *mpop = WM_gizmo_operator_get(gz, gz->highlight_part);
+ wmGizmoOpElem *gzop = WM_gizmo_operator_get(gz, gz->highlight_part);
if (r_is_modal) {
*r_is_modal = false;
}
- if (mpop && mpop->type) {
+ if (gzop && gzop->type) {
/* Undo/Redo */
- if (mpop->is_redo) {
+ if (gzop->is_redo) {
wmWindowManager *wm = CTX_wm_manager(C);
wmOperator *op = WM_operator_last_redo(C);
/* We may want to enable this, for now the gizmo can manage it's own properties. */
#if 0
- IDP_MergeGroup(mpop->ptr.data, op->properties, false);
+ IDP_MergeGroup(gzop->ptr.data, op->properties, false);
#endif
WM_operator_free_all_after(wm, op);
@@ -373,7 +391,7 @@ static bool gizmo_tweak_start_and_finish(
/* XXX temporary workaround for modal gizmo operator
* conflicting with modal operator attached to gizmo */
- if (mpop->type->modal) {
+ if (gzop->type->modal) {
/* activate highlighted gizmo */
wm_gizmomap_modal_set(gzmap, C, gz, event, true);
if (r_is_modal) {
@@ -381,8 +399,11 @@ static bool gizmo_tweak_start_and_finish(
}
}
else {
+ if (gz->parent_gzgroup->type->invoke_prepare) {
+ gz->parent_gzgroup->type->invoke_prepare(C, gz->parent_gzgroup, gz);
+ }
/* Allow for 'button' gizmos, single click to run an action. */
- WM_operator_name_call_ptr(C, mpop->type, WM_OP_INVOKE_DEFAULT, &mpop->ptr);
+ WM_operator_name_call_ptr(C, gzop->type, WM_OP_INVOKE_DEFAULT, &gzop->ptr);
}
return true;
}
@@ -545,9 +566,9 @@ static int gizmo_tweak_invoke(bContext *C, wmOperator *op, const wmEvent *event)
bool use_drag_detect = false;
#ifdef USE_DRAG_DETECT
if (use_drag_fallback) {
- wmGizmoOpElem *mpop = WM_gizmo_operator_get(gz, gz->highlight_part);
- if (mpop && mpop->type) {
- if (mpop->type->modal == NULL) {
+ wmGizmoOpElem *gzop = WM_gizmo_operator_get(gz, gz->highlight_part);
+ if (gzop && gzop->type) {
+ if (gzop->type->modal == NULL) {
use_drag_detect = true;
}
}
@@ -879,26 +900,28 @@ void WM_gizmo_group_type_add(const char *idname)
WM_gizmo_group_type_add_ptr(gzgt);
}
-void WM_gizmo_group_type_ensure_ptr_ex(
+bool WM_gizmo_group_type_ensure_ptr_ex(
wmGizmoGroupType *gzgt,
wmGizmoMapType *gzmap_type)
{
wmGizmoGroupTypeRef *gzgt_ref = WM_gizmomaptype_group_find_ptr(gzmap_type, gzgt);
if (gzgt_ref == NULL) {
WM_gizmo_group_type_add_ptr_ex(gzgt, gzmap_type);
+ return true;
}
+ return false;
}
-void WM_gizmo_group_type_ensure_ptr(
+bool WM_gizmo_group_type_ensure_ptr(
wmGizmoGroupType *gzgt)
{
wmGizmoMapType *gzmap_type = WM_gizmomaptype_ensure(&gzgt->gzmap_params);
- WM_gizmo_group_type_ensure_ptr_ex(gzgt, gzmap_type);
+ return WM_gizmo_group_type_ensure_ptr_ex(gzgt, gzmap_type);
}
-void WM_gizmo_group_type_ensure(const char *idname)
+bool WM_gizmo_group_type_ensure(const char *idname)
{
wmGizmoGroupType *gzgt = WM_gizmogrouptype_find(idname, false);
BLI_assert(gzgt != NULL);
- WM_gizmo_group_type_ensure_ptr(gzgt);
+ return WM_gizmo_group_type_ensure_ptr(gzgt);
}
void WM_gizmo_group_type_remove_ptr_ex(
@@ -921,6 +944,29 @@ void WM_gizmo_group_type_remove(struct Main *bmain, const char *idname)
WM_gizmo_group_type_remove_ptr(bmain, gzgt);
}
+void WM_gizmo_group_type_reinit_ptr_ex(
+ struct Main *bmain, wmGizmoGroupType *gzgt,
+ wmGizmoMapType *gzmap_type)
+{
+ wmGizmoGroupTypeRef *gzgt_ref = WM_gizmomaptype_group_find_ptr(gzmap_type, gzgt);
+ BLI_assert(gzgt_ref != NULL);
+ UNUSED_VARS_NDEBUG(gzgt_ref);
+ WM_gizmomaptype_group_unlink(NULL, bmain, gzmap_type, gzgt);
+ WM_gizmo_group_type_add_ptr_ex(gzgt, gzmap_type);
+}
+void WM_gizmo_group_type_reinit_ptr(
+ struct Main *bmain, wmGizmoGroupType *gzgt)
+{
+ wmGizmoMapType *gzmap_type = WM_gizmomaptype_ensure(&gzgt->gzmap_params);
+ WM_gizmo_group_type_reinit_ptr_ex(bmain, gzgt, gzmap_type);
+}
+void WM_gizmo_group_type_reinit(struct Main *bmain, const char *idname)
+{
+ wmGizmoGroupType *gzgt = WM_gizmogrouptype_find(idname, false);
+ BLI_assert(gzgt != NULL);
+ WM_gizmo_group_type_reinit_ptr(bmain, gzgt);
+}
+
/* delayed versions */
void WM_gizmo_group_type_unlink_delayed_ptr_ex(
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group_type.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group_type.c
index a44005a7d28..655d38a5206 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group_type.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group_type.c
@@ -32,6 +32,7 @@
#include "MEM_guardedalloc.h"
#include "RNA_access.h"
+#include "RNA_define.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -83,7 +84,12 @@ void WM_gizmogrouptype_iter(GHashIterator *ghi)
static wmGizmoGroupType *wm_gizmogrouptype_append__begin(void)
{
wmGizmoGroupType *gzgt = MEM_callocN(sizeof(wmGizmoGroupType), "gizmogrouptype");
-
+ gzgt->srna = RNA_def_struct_ptr(&BLENDER_RNA, "", &RNA_GizmoGroupProperties);
+#if 0
+ /* Set the default i18n context now, so that opfunc can redefine it if needed! */
+ RNA_def_struct_translation_context(ot->srna, BLT_I18NCONTEXT_OPERATOR_DEFAULT);
+ ot->translation_context = BLT_I18NCONTEXT_OPERATOR_DEFAULT;
+#endif
return gzgt;
}
static void wm_gizmogrouptype_append__end(wmGizmoGroupType *gzgt)
@@ -91,6 +97,8 @@ static void wm_gizmogrouptype_append__end(wmGizmoGroupType *gzgt)
BLI_assert(gzgt->name != NULL);
BLI_assert(gzgt->idname != NULL);
+ RNA_def_struct_identifier(&BLENDER_RNA, gzgt->srna, gzgt->idname);
+
gzgt->type_update_flag |= WM_GIZMOMAPTYPE_KEYMAP_INIT;
/* if not set, use default */
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_intern.h b/source/blender/windowmanager/gizmo/intern/wm_gizmo_intern.h
index d4a9dc4f54c..a580a063aaf 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_intern.h
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_intern.h
@@ -111,7 +111,7 @@ struct wmGizmoMap {
struct wmGizmo *modal;
/* array for all selected gizmos */
struct wmGizmoMapSelectState select;
- /* cursor location at point of entering modal (see: WM_GIZMO_GRAB_CURSOR) */
+ /* cursor location at point of entering modal (see: WM_GIZMO_MOVE_CURSOR) */
int event_xy[2];
short event_grabcursor;
/* until we have nice cursor push/pop API. */
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
index 2c0d0ff34a7..ede0f7c96ea 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
@@ -267,7 +267,7 @@ bool WM_gizmomap_minmax(
static GHash *WM_gizmomap_gizmo_hash_new(
const bContext *C, wmGizmoMap *gzmap,
bool (*poll)(const wmGizmo *, void *),
- void *data, const bool include_hidden)
+ void *data, const eWM_GizmoFlag flag_exclude)
{
GHash *hash = BLI_ghash_ptr_new(__func__);
@@ -275,7 +275,7 @@ static GHash *WM_gizmomap_gizmo_hash_new(
for (wmGizmoGroup *gzgroup = gzmap->groups.first; gzgroup; gzgroup = gzgroup->next) {
if (WM_gizmo_group_type_poll(C, gzgroup->type)) {
for (wmGizmo *gz = gzgroup->gizmos.first; gz; gz = gz->next) {
- if ((include_hidden || (gz->flag & WM_GIZMO_HIDDEN) == 0) &&
+ if (((flag_exclude == 0) || ((gz->flag & flag_exclude) == 0)) &&
(!poll || poll(gz, data)))
{
BLI_ghash_insert(hash, gz, gz);
@@ -569,7 +569,8 @@ static wmGizmo *gizmo_find_intersected_3d(
int select_id = 0;
for (LinkData *link = visible_gizmos->first; link; link = link->next, select_id++) {
wmGizmo *gz = link->data;
- if (gz->type->test_select) {
+ /* With both defined, favor the 3D, incase the gizmo can be used in 2D or 3D views. */
+ if (gz->type->test_select && (gz->type->draw_select == NULL)) {
if ((*r_part = gz->type->test_select(C, gz, co)) != -1) {
hit = select_id;
result = gz;
@@ -717,8 +718,8 @@ void wm_gizmomaps_handled_modal_update(
/* regular update for running operator */
if (modal_running) {
- wmGizmoOpElem *mpop = gz ? WM_gizmo_operator_get(gz, gz->highlight_part) : NULL;
- if (gz && mpop && (mpop->type != NULL) && (mpop->type == handler->op->type)) {
+ wmGizmoOpElem *gzop = gz ? WM_gizmo_operator_get(gz, gz->highlight_part) : NULL;
+ if (gz && gzop && (gzop->type != NULL) && (gzop->type == handler->op->type)) {
wmGizmoFnModal modal_fn = gz->custom_modal ? gz->custom_modal : gz->type->modal;
if (modal_fn != NULL) {
int retval = modal_fn(C, gz, event, 0);
@@ -786,7 +787,8 @@ static bool wm_gizmomap_select_all_intern(
* get tot_sel for allocating, once for actually selecting). Instead we collect
* selectable gizmos in hash table and use this to get tot_sel and do selection */
- GHash *hash = WM_gizmomap_gizmo_hash_new(C, gzmap, gizmo_selectable_poll, NULL, true);
+ GHash *hash = WM_gizmomap_gizmo_hash_new(
+ C, gzmap, gizmo_selectable_poll, NULL, WM_GIZMO_HIDDEN | WM_GIZMO_HIDDEN_SELECT);
GHashIterator gh_iter;
int i;
bool changed = false;
@@ -946,6 +948,9 @@ void wm_gizmomap_modal_set(
if (gz->type->invoke &&
(gz->type->modal || gz->custom_modal))
{
+ if (gz->parent_gzgroup->type->invoke_prepare) {
+ gz->parent_gzgroup->type->invoke_prepare(C, gz->parent_gzgroup, gz);
+ }
const int retval = gz->type->invoke(C, gz, event);
if ((retval & OPERATOR_RUNNING_MODAL) == 0) {
return;
@@ -955,7 +960,7 @@ void wm_gizmomap_modal_set(
gz->state |= WM_GIZMO_STATE_MODAL;
gzmap->gzmap_context.modal = gz;
- if ((gz->flag & WM_GIZMO_GRAB_CURSOR) &&
+ if ((gz->flag & WM_GIZMO_MOVE_CURSOR) &&
(event->is_motion_absolute == false))
{
WM_cursor_grab_enable(win, true, true, NULL);
@@ -966,9 +971,9 @@ void wm_gizmomap_modal_set(
gzmap->gzmap_context.event_xy[0] = INT_MAX;
}
- struct wmGizmoOpElem *mpop = WM_gizmo_operator_get(gz, gz->highlight_part);
- if (mpop && mpop->type) {
- const int retval = WM_operator_name_call_ptr(C, mpop->type, WM_OP_INVOKE_DEFAULT, &mpop->ptr);
+ struct wmGizmoOpElem *gzop = WM_gizmo_operator_get(gz, gz->highlight_part);
+ if (gzop && gzop->type) {
+ const int retval = WM_operator_name_call_ptr(C, gzop->type, WM_OP_INVOKE_DEFAULT, &gzop->ptr);
if ((retval & OPERATOR_RUNNING_MODAL) == 0) {
wm_gizmomap_modal_set(gzmap, C, gz, event, false);
}
@@ -1056,7 +1061,7 @@ void WM_gizmomap_message_subscribe(
* \{ */
struct ARegion *WM_gizmomap_tooltip_init(
- struct bContext *C, struct ARegion *ar, bool *r_exit_on_event)
+ struct bContext *C, struct ARegion *ar, int *UNUSED(r_pass), double *UNUSED(pass_delay), bool *r_exit_on_event)
{
wmGizmoMap *gzmap = ar->gizmo_map;
*r_exit_on_event = true;
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_target_props.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_target_props.c
index 536dc5329bb..12f9b529c15 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_target_props.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_target_props.c
@@ -251,7 +251,7 @@ void WM_gizmo_target_property_float_set_array(
RNA_property_update(C, &gz_prop->ptr, gz_prop->prop);
}
-bool WM_gizmo_target_property_range_get(
+bool WM_gizmo_target_property_float_range_get(
const wmGizmo *gz, wmGizmoProperty *gz_prop,
float range[2])
{
diff --git a/source/blender/windowmanager/gizmo/wm_gizmo_fn.h b/source/blender/windowmanager/gizmo/wm_gizmo_fn.h
index 88065a0fcd5..3361932c6e3 100644
--- a/source/blender/windowmanager/gizmo/wm_gizmo_fn.h
+++ b/source/blender/windowmanager/gizmo/wm_gizmo_fn.h
@@ -39,6 +39,8 @@ typedef void (*wmGizmoGroupFnRefresh)(
const struct bContext *, struct wmGizmoGroup *);
typedef void (*wmGizmoGroupFnDrawPrepare)(
const struct bContext *, struct wmGizmoGroup *);
+typedef void (*wmGizmoGroupFnInvokePrepare)(
+ const struct bContext *, struct wmGizmoGroup *, struct wmGizmo *);
typedef struct wmKeyMap *(*wmGizmoGroupFnSetupKeymap)(
const struct wmGizmoGroupType *, struct wmKeyConfig *)
ATTR_WARN_UNUSED_RESULT;
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index 7247529d02d..cf7c43ff5c0 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -46,12 +46,12 @@
#include "BLI_ghash.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "BKE_idprop.h"
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_screen.h"
#include "BKE_report.h"
-#include "BKE_global.h"
+#include "BKE_screen.h"
#include "BKE_workspace.h"
#include "WM_api.h"
diff --git a/source/blender/windowmanager/intern/wm_cursors.c b/source/blender/windowmanager/intern/wm_cursors.c
index eaeaac45f89..1a1da1ed5dd 100644
--- a/source/blender/windowmanager/intern/wm_cursors.c
+++ b/source/blender/windowmanager/intern/wm_cursors.c
@@ -292,7 +292,7 @@ bool wm_cursor_arrow_move(wmWindow *win, const wmEvent *event)
}
-/* afer this you can call restore too */
+/* after this you can call restore too */
void WM_cursor_time(wmWindow *win, int nr)
{
/* 10 8x8 digits */
diff --git a/source/blender/windowmanager/intern/wm_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c
index 73748ba6322..77e2cd772db 100644
--- a/source/blender/windowmanager/intern/wm_dragdrop.c
+++ b/source/blender/windowmanager/intern/wm_dragdrop.c
@@ -396,6 +396,7 @@ void wm_drags_draw(bContext *C, wmWindow *win, rcti *rect)
/* XXX todo, multiline drag draws... but maybe not, more types mixed wont work well */
glEnable(GL_BLEND);
for (drag = wm->drags.first; drag; drag = drag->next) {
+ const char text_col[] = {255, 255, 255, 255};
int iconsize = UI_DPI_ICON_SIZE;
int padding = 4 * UI_DPI_FAC;
@@ -420,7 +421,7 @@ void wm_drags_draw(bContext *C, wmWindow *win, rcti *rect)
if (rect)
drag_rect_minmax(rect, x, y, x + iconsize, y + iconsize);
else
- UI_icon_draw_aspect(x, y, drag->icon, 1.0f / UI_DPI_FAC, 0.8);
+ UI_icon_draw_aspect(x, y, drag->icon, 1.0f / UI_DPI_FAC, 0.8, text_col);
}
/* item name */
@@ -438,8 +439,7 @@ void wm_drags_draw(bContext *C, wmWindow *win, rcti *rect)
drag_rect_minmax(rect, x, y, x + w, y + iconsize);
}
else {
- const unsigned char col[] = {255, 255, 255, 255};
- UI_fontstyle_draw_simple(fstyle, x, y, wm_drag_name(drag), col);
+ UI_fontstyle_draw_simple(fstyle, x, y, wm_drag_name(drag), (uchar *)text_col);
}
/* operator name with roundbox */
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index c869ec90469..d760780beb8 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -85,7 +85,7 @@
/* ******************* paint cursor *************** */
-static void wm_paintcursor_draw(bContext *C, ARegion *ar)
+static void wm_paintcursor_draw(bContext *C, ScrArea *sa, ARegion *ar)
{
wmWindowManager *wm = CTX_wm_manager(C);
wmWindow *win = CTX_wm_window(C);
@@ -94,6 +94,15 @@ static void wm_paintcursor_draw(bContext *C, ARegion *ar)
if (ar->visible && ar == screen->active_region) {
for (pc = wm->paintcursors.first; pc; pc = pc->next) {
+
+ if ((pc->space_type != SPACE_TYPE_ANY) && (sa->spacetype != pc->space_type)) {
+ continue;
+ }
+
+ if ((pc->region_type != RGN_TYPE_ANY) && (ar->regiontype != pc->region_type)) {
+ continue;
+ }
+
if (pc->poll == NULL || pc->poll(C)) {
/* Prevent drawing outside region. */
glEnable(GL_SCISSOR_TEST);
@@ -452,9 +461,35 @@ void wm_draw_region_blend(ARegion *ar, int view, bool blend)
GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_2D_IMAGE_RECT_COLOR);
GPU_shader_bind(shader);
+ rcti rect_geo = ar->winrct;
+ rect_geo.xmax += 1;
+ rect_geo.ymax += 1;
+
+ rctf rect_tex;
+ rect_tex.xmin = halfx;
+ rect_tex.ymin = halfy;
+ rect_tex.xmax = 1.0f + halfx;
+ rect_tex.ymax = 1.0f + halfy;
+
+ float alpha_easing = 1.0f - alpha;
+ alpha_easing = 1.0f - alpha_easing * alpha_easing;
+
+ /* Slide vertical panels */
+ float ofs_x = BLI_rcti_size_x(&ar->winrct) * (1.0f - alpha_easing);
+ if (ar->alignment == RGN_ALIGN_RIGHT) {
+ rect_geo.xmin += ofs_x;
+ rect_tex.xmax *= alpha_easing;
+ alpha = 1.0f;
+ }
+ else if (ar->alignment == RGN_ALIGN_LEFT) {
+ rect_geo.xmax -= ofs_x;
+ rect_tex.xmin += 1.0f - alpha_easing;
+ alpha = 1.0f;
+ }
+
glUniform1i(GPU_shader_get_uniform(shader, "image"), 0);
- glUniform4f(GPU_shader_get_uniform(shader, "rect_icon"), halfx, halfy, 1.0f + halfx, 1.0f + halfy);
- glUniform4f(GPU_shader_get_uniform(shader, "rect_geom"), ar->winrct.xmin, ar->winrct.ymin, ar->winrct.xmax + 1, ar->winrct.ymax + 1);
+ glUniform4f(GPU_shader_get_uniform(shader, "rect_icon"), rect_tex.xmin, rect_tex.ymin, rect_tex.xmax, rect_tex.ymax);
+ glUniform4f(GPU_shader_get_uniform(shader, "rect_geom"), rect_geo.xmin, rect_geo.ymin, rect_geo.xmax, rect_geo.ymax);
glUniform4f(GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_COLOR), alpha, alpha, alpha, alpha);
GPU_draw_primitive(GPU_PRIM_TRI_STRIP, 4);
@@ -553,7 +588,7 @@ static void wm_draw_window_offscreen(bContext *C, wmWindow *win, bool stereo)
CTX_wm_menu_set(C, ar);
if (ar->type && ar->type->layout) {
- /* UI code reads the OpenGL state, but we have to refesh
+ /* UI code reads the OpenGL state, but we have to refresh
* the UI layout beforehand in case the menu size changes. */
wmViewport(&ar->winrct);
ar->type->layout(C, ar);
@@ -612,7 +647,7 @@ static void wm_draw_window_onscreen(bContext *C, wmWindow *win, int view)
CTX_wm_region_set(C, ar);
/* make region ready for draw, scissor, pixelspace */
- wm_paintcursor_draw(C, ar);
+ wm_paintcursor_draw(C, sa, ar);
CTX_wm_region_set(C, NULL);
CTX_wm_area_set(C, NULL);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index cd1357e85b1..129d8ab1f8e 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -299,42 +299,39 @@ static void wm_notifier_clear(wmNotifier *note)
void wm_event_do_depsgraph(bContext *C)
{
wmWindowManager *wm = CTX_wm_manager(C);
+ /* The whole idea of locked interface is to prevent viewport and whatever
+ * thread to modify the same data. Because of this, we can not perform
+ * dependency graph update.
+ */
+ if (wm->is_interface_locked) {
+ return;
+ }
+ /* Combine datamasks so 1 win doesn't disable UV's in another [#26448]. */
uint64_t win_combine_v3d_datamask = 0;
-
- /* combine datamasks so 1 win doesn't disable UV's in another [#26448] */
for (wmWindow *win = wm->windows.first; win; win = win->next) {
const Scene *scene = WM_window_get_active_scene(win);
const bScreen *screen = WM_window_get_active_screen(win);
win_combine_v3d_datamask |= ED_view3d_screen_datamask(scene, screen);
}
-
- /* cached: editor refresh callbacks now, they get context */
+ /* Update all the dependency graphs of visible vew layers. */
for (wmWindow *win = wm->windows.first; win; win = win->next) {
Scene *scene = WM_window_get_active_scene(win);
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
-
- /* XXX make lock in future, or separated derivedmesh users in scene */
- if (G.is_rendering == false) {
- /* depsgraph & animation: update tagged datablocks */
- Main *bmain = CTX_data_main(C);
-
- /* copied to set's in scene_update_tagged_recursive() */
- scene->customdata_mask = win_combine_v3d_datamask;
-
- /* XXX, hack so operators can enforce datamasks [#26482], gl render */
- scene->customdata_mask |= scene->customdata_mask_modal;
-
- /* TODO(sergey): For now all dependency graphs which are evaluated from
- * workspace are considered active. This will work all fine with "locked"
- * view layer and time across windows. This is to be granted separately,
- * and for until then we have to accept ambiguities when object is shared
- * across visible view layers and has overrides on it.
- */
- Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer, true);
- DEG_make_active(depsgraph);
- BKE_scene_graph_update_tagged(depsgraph, bmain);
- }
+ Main *bmain = CTX_data_main(C);
+ /* Copied to set's in scene_update_tagged_recursive() */
+ scene->customdata_mask = win_combine_v3d_datamask;
+ /* XXX, hack so operators can enforce datamasks [#26482], gl render */
+ scene->customdata_mask |= scene->customdata_mask_modal;
+ /* TODO(sergey): For now all dependency graphs which are evaluated from
+ * workspace are considered active. This will work all fine with "locked"
+ * view layer and time across windows. This is to be granted separately,
+ * and for until then we have to accept ambiguities when object is shared
+ * across visible view layers and has overrides on it.
+ */
+ Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer, true);
+ DEG_make_active(depsgraph);
+ BKE_scene_graph_update_tagged(depsgraph, bmain);
}
}
@@ -524,6 +521,9 @@ void wm_event_do_notifiers(bContext *C)
WM_window_cursor_keymap_status_refresh(C, win);
CTX_wm_window_set(C, NULL);
}
+
+ /* Autorun warning */
+ wm_test_autorun_warning(C);
}
static int wm_event_always_pass(const wmEvent *event)
@@ -909,8 +909,10 @@ static void wm_operator_finished(bContext *C, wmOperator *op, const bool repeat,
wm_operator_register(C, op);
WM_operator_region_active_win_set(C);
- /* Show the redo panel. */
- hud_status = SET;
+ if (WM_operator_last_redo(C) == op) {
+ /* Show the redo panel. */
+ hud_status = SET;
+ }
}
else {
WM_operator_free(op);
@@ -1465,9 +1467,21 @@ static int wm_operator_call_internal(
break;
}
}
+ else {
+ switch (context) {
+ case WM_OP_EXEC_DEFAULT:
+ case WM_OP_EXEC_REGION_WIN:
+ case WM_OP_EXEC_REGION_PREVIEW:
+ case WM_OP_EXEC_REGION_CHANNELS:
+ case WM_OP_EXEC_AREA:
+ case WM_OP_EXEC_SCREEN:
+ event = NULL;
+ default:
+ break;
+ }
+ }
switch (context) {
-
case WM_OP_EXEC_REGION_WIN:
case WM_OP_INVOKE_REGION_WIN:
case WM_OP_EXEC_REGION_CHANNELS:
@@ -2031,7 +2045,8 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
if (ot && wm_operator_check_locked_interface(C, ot)) {
bool use_last_properties = true;
PointerRNA tool_properties = {{0}};
- bool use_tool_properties = (handler->keymap_tool != NULL);
+ const bool is_tool = (handler->keymap_tool != NULL);
+ const bool use_tool_properties = is_tool;
if (use_tool_properties) {
WM_toolsystem_ref_properties_init_for_keymap(handler->keymap_tool, &tool_properties, properties, ot);
@@ -2044,6 +2059,23 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
if (use_tool_properties) {
WM_operator_properties_free(&tool_properties);
}
+
+ /* Link gizmo if 'WM_GIZMOGROUPTYPE_TOOL_INIT' is set. */
+ if (retval & OPERATOR_FINISHED) {
+ if (is_tool) {
+ bToolRef_Runtime *tref_rt = handler->keymap_tool->runtime;
+ if (tref_rt->gizmo_group[0]) {
+ const char *idname = tref_rt->gizmo_group;
+ wmGizmoGroupType *gzgt = WM_gizmogrouptype_find(idname, false);
+ if (gzgt != NULL) {
+ if ((gzgt->flag & WM_GIZMOGROUPTYPE_TOOL_INIT) != 0) {
+ WM_gizmo_group_type_ensure_ptr(gzgt);
+ }
+ }
+ }
+ }
+ }
+ /* Done linking gizmo. */
}
}
/* Finished and pass through flag as handled */
@@ -2286,7 +2318,7 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
/* modal handlers can get removed in this loop, we keep the loop this way
*
* note: check 'handlers->first' because in rare cases the handlers can be cleared
- * by the event thats called, for eg:
+ * by the event that's called, for eg:
*
* Calling a python script which changes the area.type, see [#32232] */
for (handler = handlers->first; handler && handlers->first; handler = nexthandler) {
@@ -2422,7 +2454,9 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
int part;
gz = wm_gizmomap_highlight_find(gzmap, C, event, &part);
if (wm_gizmomap_highlight_set(gzmap, C, gz, part) && gz != NULL) {
- WM_tooltip_timer_init(C, CTX_wm_window(C), region, WM_gizmomap_tooltip_init);
+ if (U.flag & USER_TOOLTIPS) {
+ WM_tooltip_timer_init(C, CTX_wm_window(C), region, WM_gizmomap_tooltip_init);
+ }
}
}
else {
@@ -2864,7 +2898,7 @@ void wm_event_do_handlers(bContext *C)
bScreen *screen = WM_window_get_active_screen(win);
wmEvent *event;
- /* some safty checks - these should always be set! */
+ /* some safety checks - these should always be set! */
BLI_assert(WM_window_get_active_scene(win));
BLI_assert(WM_window_get_active_screen(win));
BLI_assert(WM_window_get_active_workspace(win));
@@ -3142,6 +3176,9 @@ void WM_event_add_fileselect(bContext *C, wmOperator *op)
wmWindowManager *wm = CTX_wm_manager(C);
wmWindow *win = CTX_wm_window(C);
+ /* Close any popups, like when opening a file browser from the splash. */
+ UI_popup_handlers_remove_all(C, &win->modalhandlers);
+
/* only allow 1 file selector open per window */
for (handler = win->modalhandlers.first; handler; handler = handlernext) {
handlernext = handler->next;
@@ -4437,7 +4474,9 @@ void WM_window_cursor_keymap_status_refresh(bContext *C, wmWindow *win)
/* Detect changes to the state. */
{
bToolRef *tref = NULL;
- if (ar->regiontype == RGN_TYPE_WINDOW) {
+ if ((ar->regiontype == RGN_TYPE_WINDOW) &&
+ ((1 << sa->spacetype) & WM_TOOLSYSTEM_SPACE_MASK))
+ {
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
WorkSpace *workspace = WM_window_get_active_workspace(win);
const bToolKey tkey = {
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index 65f4823464a..f7971ed1b64 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -79,7 +79,6 @@
#include "BKE_blender_undo.h"
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_packedFile.h"
#include "BKE_report.h"
@@ -476,7 +475,7 @@ void wm_file_read_report(bContext *C, Main *bmain)
* Logic shared between #WM_file_read & #wm_homefile_read,
* updates to make after reading a file.
*/
-static void wm_file_read_post(bContext *C, const bool is_startup_file, const bool use_userdef)
+static void wm_file_read_post(bContext *C, const bool is_startup_file, const bool reset_app_template)
{
bool addons_loaded = false;
wmWindowManager *wm = CTX_wm_manager(C);
@@ -498,16 +497,27 @@ static void wm_file_read_post(bContext *C, const bool is_startup_file, const boo
if (is_startup_file) {
/* possible python hasn't been initialized */
if (CTX_py_init_get(C)) {
- if (use_userdef) {
+ if (reset_app_template) {
/* Only run when we have a template path found. */
if (BKE_appdir_app_template_any()) {
- BPY_execute_string(C, "__import__('bl_app_template_utils').reset()");
+ BPY_execute_string(
+ C, (const char *[]){"bl_app_template_utils", NULL},
+ "bl_app_template_utils.reset()");
}
/* sync addons, these may have changed from the defaults */
- BPY_execute_string(C, "__import__('addon_utils').reset_all()");
+ BPY_execute_string(
+ C, (const char *[]){"addon_utils", NULL},
+ "addon_utils.reset_all()");
}
BPY_python_reset(C);
addons_loaded = true;
+
+ if (!G.background) {
+ /* Load the keymap from Python, otherwise we get an empty keymap. */
+ BPY_execute_string(
+ C, (const char *[]){"bpy", NULL},
+ "bpy.utils.keyconfig_set(bpy.utils.preset_find('blender', 'keyconfig'))");
+ }
}
}
else {
@@ -516,7 +526,7 @@ static void wm_file_read_post(bContext *C, const bool is_startup_file, const boo
addons_loaded = true;
}
#else
- UNUSED_VARS(is_startup_file, use_userdef);
+ UNUSED_VARS(is_startup_file, reset_app_template);
#endif /* WITH_PYTHON */
WM_operatortype_last_properties_clear_all();
@@ -671,7 +681,7 @@ bool WM_file_read(bContext *C, const char *filepath, ReportList *reports)
struct {
char app_template[64];
bool override;
-} wm_init_state_app_template = {0};
+} wm_init_state_app_template = {{0}};
/**
* Used for setting app-template from the command line:
@@ -696,6 +706,25 @@ const char *WM_init_state_app_template_get(void)
return wm_init_state_app_template.override ? wm_init_state_app_template.app_template : NULL;
}
+
+static bool wm_app_template_has_userpref(const char *app_template)
+{
+ /* Test if app template provides a userpref.blend. If not, we will
+ * share user preferences with the rest of Blender. */
+ if (!app_template && app_template[0]) {
+ return false;
+ }
+
+ char app_template_path[FILE_MAX];
+ if (!BKE_appdir_app_template_id_search(app_template, app_template_path, sizeof(app_template_path))) {
+ return false;
+ }
+
+ char userpref_path[FILE_MAX];
+ BLI_path_join(userpref_path, sizeof(userpref_path), app_template_path, BLENDER_USERPREF_FILE, NULL);
+ return BLI_exists(userpref_path);
+}
+
/**
* Called on startup, (context entirely filled with NULLs)
* or called for 'New File' both startup.blend and userpref.blend are checked.
@@ -790,6 +819,8 @@ int wm_homefile_read(
}
const char *app_template = NULL;
+ bool update_defaults = false;
+ bool reset_app_template = false;
if (filepath_startup_override != NULL) {
/* pass */
@@ -802,6 +833,14 @@ int wm_homefile_read(
app_template = U.app_template;
}
+ if ((!app_template && U.app_template[0]) ||
+ (app_template && !STREQ(app_template, U.app_template)))
+ {
+ /* Always load UI when switching to another template. */
+ G.fileflags &= ~G_FILE_NO_UI;
+ reset_app_template = true;
+ }
+
if ((app_template != NULL) && (app_template[0] != '\0')) {
if (!BKE_appdir_app_template_id_search(app_template, app_template_system, sizeof(app_template_system))) {
/* Can safely continue with code below, just warn it's not found. */
@@ -825,6 +864,9 @@ int wm_homefile_read(
if (filepath_startup[0] == '\0') {
BLI_path_join(filepath_startup, sizeof(filepath_startup), app_template_system, BLENDER_STARTUP_FILE, NULL);
+
+ /* Update defaults only for system templates. */
+ update_defaults = true;
}
}
@@ -837,6 +879,9 @@ int wm_homefile_read(
printf("\nNote: No (valid) '%s' found, fall back to built-in default.\n\n", filepath_startup);
success = false;
}
+ if (success && update_defaults) {
+ BLO_update_defaults_startup_blend(CTX_data_main(C), app_template);
+ }
}
if (success == false && filepath_startup_override && reports) {
@@ -913,6 +958,7 @@ int wm_homefile_read(
if (use_userdef) {
/* check userdef before open window, keymaps etc */
wm_init_userdef(bmain, read_userdef_from_memory);
+ reset_app_template = true;
}
/* match the read WM with current WM */
@@ -924,7 +970,7 @@ int wm_homefile_read(
/* start with save preference untitled.blend */
G.save_over = 0;
- wm_file_read_post(C, true, use_userdef);
+ wm_file_read_post(C, true, reset_app_template);
return true;
}
@@ -985,7 +1031,7 @@ static RecentFile *wm_file_history_find(const char *filepath)
/**
* Write #BLENDER_HISTORY_FILE as-is, without checking the environment
- * (thats handled by #wm_history_file_update).
+ * (that's handled by #wm_history_file_update).
*/
static void wm_history_file_write(void)
{
@@ -1151,12 +1197,12 @@ bool write_crash_blend(void)
/**
* \see #wm_homefile_write_exec wraps #BLO_write_file in a similar way.
*/
-static int wm_file_write(bContext *C, const char *filepath, int fileflags, ReportList *reports)
+static bool wm_file_write(bContext *C, const char *filepath, int fileflags, ReportList *reports)
{
Main *bmain = CTX_data_main(C);
Library *li;
int len;
- int ret = -1;
+ int ok = false;
BlendThumbnail *thumb, *main_thumb;
ImBuf *ibuf_thumb = NULL;
@@ -1164,18 +1210,18 @@ static int wm_file_write(bContext *C, const char *filepath, int fileflags, Repor
if (len == 0) {
BKE_report(reports, RPT_ERROR, "Path is empty, cannot save");
- return ret;
+ return ok;
}
if (len >= FILE_MAX) {
BKE_report(reports, RPT_ERROR, "Path too long, cannot save");
- return ret;
+ return ok;
}
/* Check if file write permission is ok */
if (BLI_exists(filepath) && !BLI_file_is_writable(filepath)) {
BKE_reportf(reports, RPT_ERROR, "Cannot save blend file, path '%s' is not writable", filepath);
- return ret;
+ return ok;
}
/* note: used to replace the file extension (to ensure '.blend'),
@@ -1186,7 +1232,7 @@ static int wm_file_write(bContext *C, const char *filepath, int fileflags, Repor
for (li = bmain->library.first; li; li = li->id.next) {
if (BLI_path_cmp(li->filepath, filepath) == 0) {
BKE_reportf(reports, RPT_ERROR, "Cannot overwrite used library '%.240s'", filepath);
- return ret;
+ return ok;
}
}
@@ -1195,7 +1241,7 @@ static int wm_file_write(bContext *C, const char *filepath, int fileflags, Repor
/* blend file thumbnail */
/* save before exit_editmode, otherwise derivedmeshes for shared data corrupt #27765) */
- /* Main now can store a .blend thumbnail, usefull for background mode or thumbnail customization. */
+ /* Main now can store a .blend thumbnail, useful for background mode or thumbnail customization. */
main_thumb = thumb = bmain->blen_thumb;
if ((U.flag & USER_SAVE_PREVIEWS) && BLI_thread_is_main()) {
ibuf_thumb = blend_file_thumb(C, CTX_data_scene(C), CTX_wm_screen(C), &thumb);
@@ -1248,7 +1294,8 @@ static int wm_file_write(bContext *C, const char *filepath, int fileflags, Repor
ibuf_thumb = IMB_thumb_create(filepath, THB_LARGE, THB_SOURCE_BLEND, ibuf_thumb);
}
- ret = 0; /* Success. */
+ /* Success. */
+ ok = true;
}
if (ibuf_thumb) {
@@ -1260,7 +1307,7 @@ static int wm_file_write(bContext *C, const char *filepath, int fileflags, Repor
WM_cursor_wait(0);
- return ret;
+ return ok;
}
/************************ autosave ****************************/
@@ -1437,6 +1484,7 @@ void WM_file_tag_modified(void)
/**
* \see #wm_file_write wraps #BLO_write_file in a similar way.
+ * \return success.
*/
static int wm_homefile_write_exec(bContext *C, wmOperator *op)
{
@@ -1489,7 +1537,7 @@ void WM_OT_save_homefile(wmOperatorType *ot)
{
ot->name = "Save Startup File";
ot->idname = "WM_OT_save_homefile";
- ot->description = "Make the current file the default .blend file, includes preferences";
+ ot->description = "Make the current file the default .blend file";
ot->invoke = WM_operator_confirm;
ot->exec = wm_homefile_write_exec;
@@ -1543,6 +1591,7 @@ static int wm_userpref_write_exec(bContext *C, wmOperator *op)
char filepath[FILE_MAX];
const char *cfgdir;
bool ok = true;
+ bool use_template_userpref = wm_app_template_has_userpref(U.app_template);
/* update keymaps in user preferences */
WM_keyconfig_update(wm);
@@ -1550,9 +1599,8 @@ static int wm_userpref_write_exec(bContext *C, wmOperator *op)
if ((cfgdir = BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, NULL))) {
bool ok_write;
BLI_path_join(filepath, sizeof(filepath), cfgdir, BLENDER_USERPREF_FILE, NULL);
- printf("trying to save userpref at %s ", filepath);
- if (U.app_template[0]) {
+ if (use_template_userpref) {
ok_write = BKE_blendfile_userdef_write_app_template(filepath, op->reports);
}
else {
@@ -1571,11 +1619,10 @@ static int wm_userpref_write_exec(bContext *C, wmOperator *op)
BKE_report(op->reports, RPT_ERROR, "Unable to create userpref path");
}
- if (U.app_template[0]) {
+ if (use_template_userpref) {
if ((cfgdir = BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, U.app_template))) {
/* Also save app-template prefs */
BLI_path_join(filepath, sizeof(filepath), cfgdir, BLENDER_USERPREF_FILE, NULL);
- printf("trying to save app-template userpref at %s ", filepath);
if (BKE_blendfile_userdef_write(filepath, op->reports) != 0) {
printf("ok\n");
}
@@ -1595,7 +1642,7 @@ static int wm_userpref_write_exec(bContext *C, wmOperator *op)
void WM_OT_save_userpref(wmOperatorType *ot)
{
- ot->name = "Save User Settings";
+ ot->name = "Save User Preferences";
ot->idname = "WM_OT_save_userpref";
ot->description = "Save user preferences separately, overrides startup file preferences";
@@ -1664,8 +1711,9 @@ static int wm_homefile_read_exec(bContext *C, wmOperator *op)
RNA_property_string_get(op->ptr, prop_app_template, app_template_buf);
app_template = app_template_buf;
- /* Always load preferences when switching templates. */
- use_userdef = true;
+ /* Always load preferences when switching templates with own preferences. */
+ use_userdef = wm_app_template_has_userpref(app_template) ||
+ wm_app_template_has_userpref(U.app_template);
/* Turn override off, since we're explicitly loading a different app-template. */
WM_init_state_app_template_set(NULL);
@@ -1686,6 +1734,22 @@ static int wm_homefile_read_exec(bContext *C, wmOperator *op)
}
}
+static int wm_homefile_read_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *UNUSED(event))
+{
+ /* Draw menu which includes default startup and application templates. */
+ uiPopupMenu *pup = UI_popup_menu_begin(C, IFACE_("New File"), ICON_FILE_NEW);
+ uiLayout *layout = UI_popup_menu_layout(pup);
+
+ MenuType *mt = WM_menutype_find("TOPBAR_MT_file_new", false);
+ if (mt) {
+ UI_menutype_draw(C, mt, layout);
+ }
+
+ UI_popup_menu_end(C, pup);
+
+ return OPERATOR_INTERFACE;
+}
+
void WM_OT_read_homefile(wmOperatorType *ot)
{
PropertyRNA *prop;
@@ -1693,7 +1757,7 @@ void WM_OT_read_homefile(wmOperatorType *ot)
ot->idname = "WM_OT_read_homefile";
ot->description = "Open the default file (doesn't save the current file)";
- ot->invoke = WM_operator_confirm;
+ ot->invoke = wm_homefile_read_invoke;
ot->exec = wm_homefile_read_exec;
prop = RNA_def_string_file_path(ot->srna, "filepath", NULL,
@@ -2114,7 +2178,7 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
char path[FILE_MAX];
- int fileflags;
+ const bool is_save_as = (op->type->invoke == wm_save_as_mainfile_invoke);
save_set_compress(op);
@@ -2126,7 +2190,8 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op)
wm_filepath_default(path);
}
- fileflags = G.fileflags & ~G_FILE_USERPREFS;
+ const int fileflags_orig = G.fileflags;
+ int fileflags = G.fileflags & ~G_FILE_USERPREFS;
/* set compression flag */
SET_FLAG_FROM_TEST(
@@ -2141,16 +2206,24 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op)
RNA_boolean_get(op->ptr, "copy")),
G_FILE_SAVE_COPY);
- if (wm_file_write(C, path, fileflags, op->reports) != 0)
+ const bool ok = wm_file_write(C, path, fileflags, op->reports);
+
+ if ((op->flag & OP_IS_INVOKE) == 0) {
+ /* OP_IS_INVOKE is set when the operator is called from the GUI.
+ * If it is not set, the operator is called from a script and
+ * shouldn't influence G.fileflags. */
+ G.fileflags = fileflags_orig;
+ }
+
+ if (ok == false) {
return OPERATOR_CANCELLED;
+ }
WM_event_add_notifier(C, NC_WM | ND_FILESAVE, NULL);
-#if 0 /* XXX: Remove? This is not currently defined as a valid property */
- if (RNA_boolean_get(op->ptr, "exit")) {
+ if (!is_save_as && RNA_boolean_get(op->ptr, "exit")) {
wm_exit_schedule_delayed(C);
}
-#endif
return OPERATOR_FINISHED;
}
@@ -2259,3 +2332,121 @@ void WM_OT_save_mainfile(wmOperatorType *ot)
}
/** \} */
+
+/** \name Auto-execution of scripts warning popup
+ *
+ * \{ */
+
+static void wm_block_autorun_warning_ignore(bContext *C, void *arg_block, void *UNUSED(arg))
+{
+ wmWindow *win = CTX_wm_window(C);
+ UI_popup_block_close(C, win, arg_block);
+}
+
+static void wm_block_autorun_warning_allow(bContext *C, void *arg_block, void *UNUSED(arg))
+{
+ PointerRNA props_ptr;
+ wmWindow *win = CTX_wm_window(C);
+
+ UI_popup_block_close(C, win, arg_block);
+
+ /* Save user preferences for permanent execution. */
+ if ((U.flag & USER_SCRIPT_AUTOEXEC_DISABLE) == 0) {
+ WM_operator_name_call(C, "WM_OT_save_userpref", WM_OP_EXEC_DEFAULT, NULL);
+ }
+
+ /* Load file again with scripts enabled. */
+ wmOperatorType *ot = WM_operatortype_find("WM_OT_revert_mainfile", false);
+
+ WM_operator_properties_create_ptr(&props_ptr, ot);
+ RNA_boolean_set(&props_ptr, "use_scripts", true);
+ WM_operator_name_call_ptr(C, ot, WM_OP_EXEC_DEFAULT, &props_ptr);
+ WM_operator_properties_free(&props_ptr);
+}
+
+/* Build the autorun warning dialog UI */
+static uiBlock *block_create_autorun_warning(struct bContext *C, struct ARegion *ar, void *UNUSED(arg1))
+{
+ uiStyle *style = UI_style_get();
+ uiBlock *block = UI_block_begin(C, ar, "autorun_warning_popup", UI_EMBOSS);
+
+ UI_block_flag_enable(block, UI_BLOCK_KEEP_OPEN | UI_BLOCK_LOOP | UI_BLOCK_NO_WIN_CLIP | UI_BLOCK_NUMSELECT);
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
+ UI_block_emboss_set(block, UI_EMBOSS);
+
+ uiLayout *layout = UI_block_layout(
+ block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 10, 2, U.widget_unit * 24, U.widget_unit * 6, 0, style);
+
+ /* Text and some vertical space */
+ uiLayout *col = uiLayoutColumn(layout, true);
+ uiItemL(col, IFACE_("For security reasons, automatic execution of Python scripts in this file was disabled:"), ICON_ERROR);
+ uiLayout *sub = uiLayoutRow(col, true);
+ uiLayoutSetRedAlert(sub, true);
+ uiItemL(sub, G.autoexec_fail, ICON_BLANK1);
+ uiItemL(col, IFACE_("This may lead to unexpected behavior."), ICON_BLANK1);
+
+ uiItemS(layout);
+
+ PointerRNA userpref_ptr;
+ RNA_pointer_create(NULL, &RNA_UserPreferencesSystem, &U, &userpref_ptr);
+ uiItemR(layout, &userpref_ptr, "use_scripts_auto_execute", 0, IFACE_("Permanently allow execution of scripts"), ICON_NONE);
+
+ uiItemS(layout);
+
+ /* Buttons */
+ uiBut *but;
+ uiLayout *split = uiLayoutSplit(layout, 0.0f, true);
+ col = uiLayoutColumn(split, false);
+
+ /* Allow reload if we have a saved file. */
+ if (G.relbase_valid) {
+ but = uiDefIconTextBut(
+ block, UI_BTYPE_BUT, 0, ICON_NONE, IFACE_("Allow Execution"), 0, 0, 50, UI_UNIT_Y,
+ NULL, 0, 0, 0, 0, TIP_("Reload file with execution of Python scripts enabled"));
+ UI_but_func_set(but, wm_block_autorun_warning_allow, block, NULL);
+ }
+ else {
+ uiItemS(col);
+ }
+
+ /* empty space between buttons */
+ col = uiLayoutColumn(split, false);
+ uiItemS(col);
+
+ col = uiLayoutColumn(split, 1);
+ but = uiDefIconTextBut(
+ block, UI_BTYPE_BUT, 0, ICON_NONE, IFACE_("Ignore"), 0, 0, 50, UI_UNIT_Y,
+ NULL, 0, 0, 0, 0, TIP_("Continue using file without Python scripts"));
+ UI_but_func_set(but, wm_block_autorun_warning_ignore, block, NULL);
+
+ UI_block_bounds_set_centered(block, 10);
+
+ return block;
+}
+
+void wm_test_autorun_warning(bContext *C)
+{
+ /* Test if any auto-execution of scripts failed. */
+ if ((G.f & G_SCRIPT_AUTOEXEC_FAIL) == 0) {
+ return;
+ }
+
+ /* Only show the warning once. */
+ if (G.f & G_SCRIPT_AUTOEXEC_FAIL_QUIET) {
+ return;
+ }
+
+ G.f |= G_SCRIPT_AUTOEXEC_FAIL_QUIET;
+
+ wmWindowManager *wm = CTX_wm_manager(C);
+ wmWindow *win = (wm->winactive) ? wm->winactive : wm->windows.first;
+
+ if (win) {
+ wmWindow *prevwin = CTX_wm_window(C);
+ CTX_wm_window_set(C, win);
+ UI_popup_block_invoke(C, block_create_autorun_warning, NULL);
+ CTX_wm_window_set(C, prevwin);
+ }
+}
+
+/** \} */
diff --git a/source/blender/windowmanager/intern/wm_files_link.c b/source/blender/windowmanager/intern/wm_files_link.c
index fb17de26703..0b1ba6cf32d 100644
--- a/source/blender/windowmanager/intern/wm_files_link.c
+++ b/source/blender/windowmanager/intern/wm_files_link.c
@@ -59,10 +59,10 @@
#include "BLO_readfile.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "BKE_layer.h"
#include "BKE_library.h"
#include "BKE_library_remap.h"
-#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_scene.h"
@@ -106,11 +106,7 @@ static bool wm_link_append_poll(bContext *C)
static int wm_link_append_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
- if (RNA_struct_property_is_set(op->ptr, "filepath")) {
- return WM_operator_call_notest(C, op);
- }
- else {
- /* XXX TODO solve where to get last linked library from */
+ if (!RNA_struct_property_is_set(op->ptr, "filepath")) {
if (G.lib[0] != '\0') {
RNA_string_set(op->ptr, "filepath", G.lib);
}
@@ -120,9 +116,10 @@ static int wm_link_append_invoke(bContext *C, wmOperator *op, const wmEvent *UNU
BLI_parent_dir(path);
RNA_string_set(op->ptr, "filepath", path);
}
- WM_event_add_fileselect(C, op);
- return OPERATOR_RUNNING_MODAL;
}
+
+ WM_event_add_fileselect(C, op);
+ return OPERATOR_RUNNING_MODAL;
}
static short wm_link_append_flag(wmOperator *op)
@@ -404,7 +401,7 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
}
if (!BLI_ghash_haskey(libraries, libname)) {
- BLI_ghash_insert(libraries, BLI_strdup(libname), SET_INT_IN_POINTER(lib_idx));
+ BLI_ghash_insert(libraries, BLI_strdup(libname), POINTER_FROM_INT(lib_idx));
lib_idx++;
wm_link_append_data_library_add(lapp_data, libname);
}
@@ -425,7 +422,7 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
continue;
}
- lib_idx = GET_INT_FROM_POINTER(BLI_ghash_lookup(libraries, libname));
+ lib_idx = POINTER_AS_INT(BLI_ghash_lookup(libraries, libname));
item = wm_link_append_data_item_add(lapp_data, name, BKE_idcode_from_name(group), NULL);
BLI_BITMAP_ENABLE(item->libraries, lib_idx);
@@ -649,7 +646,7 @@ static void lib_relocate_do(
BKE_main_id_tag_all(bmain, LIB_TAG_PRE_EXISTING, true);
- /* We do not want any instanciation here! */
+ /* We do not want any instantiation here! */
wm_link_do(lapp_data, reports, bmain, NULL, NULL);
BKE_main_lock(bmain);
diff --git a/source/blender/windowmanager/intern/wm_gesture_ops.c b/source/blender/windowmanager/intern/wm_gesture_ops.c
index a4d811bf91b..b29da15a334 100644
--- a/source/blender/windowmanager/intern/wm_gesture_ops.c
+++ b/source/blender/windowmanager/intern/wm_gesture_ops.c
@@ -143,7 +143,7 @@ static int gesture_modal_state_from_operator(wmOperator *op)
*
* \{ */
-static bool gesture_border_apply_rect(wmOperator *op)
+static bool gesture_box_apply_rect(wmOperator *op)
{
wmGesture *gesture = op->customdata;
rcti *rect = gesture->customdata;
@@ -161,13 +161,13 @@ static bool gesture_border_apply_rect(wmOperator *op)
return 1;
}
-static bool gesture_border_apply(bContext *C, wmOperator *op)
+static bool gesture_box_apply(bContext *C, wmOperator *op)
{
wmGesture *gesture = op->customdata;
int retval;
- if (!gesture_border_apply_rect(op)) {
+ if (!gesture_box_apply_rect(op)) {
return 0;
}
@@ -179,7 +179,7 @@ static bool gesture_border_apply(bContext *C, wmOperator *op)
return 1;
}
-int WM_gesture_border_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+int WM_gesture_box_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
int modal_state = gesture_modal_state_from_operator(op);
@@ -208,7 +208,7 @@ int WM_gesture_border_invoke(bContext *C, wmOperator *op, const wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-int WM_gesture_border_modal(bContext *C, wmOperator *op, const wmEvent *event)
+int WM_gesture_box_modal(bContext *C, wmOperator *op, const wmEvent *event)
{
wmGesture *gesture = op->customdata;
rcti *rect = gesture->customdata;
@@ -222,7 +222,7 @@ int WM_gesture_border_modal(bContext *C, wmOperator *op, const wmEvent *event)
rect->xmax = event->x - gesture->winrct.xmin;
rect->ymax = event->y - gesture->winrct.ymin;
}
- gesture_border_apply_rect(op);
+ gesture_box_apply_rect(op);
wm_gesture_tag_redraw(C);
}
@@ -241,7 +241,7 @@ int WM_gesture_border_modal(bContext *C, wmOperator *op, const wmEvent *event)
if (gesture->wait_for_input) {
gesture->modal_state = event->val;
}
- if (gesture_border_apply(C, op)) {
+ if (gesture_box_apply(C, op)) {
gesture_modal_end(C, op);
return OPERATOR_FINISHED;
}
@@ -270,7 +270,7 @@ int WM_gesture_border_modal(bContext *C, wmOperator *op, const wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-void WM_gesture_border_cancel(bContext *C, wmOperator *op)
+void WM_gesture_box_cancel(bContext *C, wmOperator *op)
{
gesture_modal_end(C, op);
}
@@ -427,7 +427,7 @@ int WM_gesture_circle_modal(bContext *C, wmOperator *op, const wmEvent *event)
#if 0
/* Allow view navigation??? */
/* note, this gives issues:
- * 1) other modal ops run on top (border select),
+ * 1) other modal ops run on top (box select),
* 2) middlemouse is used now 3) tablet/trackpad? */
else {
return OPERATOR_PASS_THROUGH;
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 719544403dd..52f609700b3 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -61,16 +61,15 @@
#include "BKE_blender.h"
#include "BKE_blender_undo.h"
#include "BKE_context.h"
-#include "BKE_screen.h"
+#include "BKE_font.h"
#include "BKE_global.h"
#include "BKE_icons.h"
-#include "BKE_library.h"
#include "BKE_library_remap.h"
#include "BKE_main.h"
#include "BKE_mball_tessellate.h"
#include "BKE_node.h"
#include "BKE_report.h"
-#include "BKE_font.h"
+#include "BKE_screen.h"
#include "BKE_addon.h"
#include "BKE_appdir.h"
@@ -236,7 +235,10 @@ void WM_init(bContext *C, int argc, const char **argv)
ED_node_init_butfuncs();
BLF_init();
+
BLT_lang_init();
+ /* Must call first before doing any .blend file reading, since versionning code may create new IDs... See T57066. */
+ BLT_lang_set(NULL);
/* Init icons before reading .blend files for preview icons, which can
* get triggered by the depsgraph. This is also done in background mode
@@ -252,6 +254,7 @@ void WM_init(bContext *C, int argc, const char **argv)
/* get the default database, plus a wm */
wm_homefile_read(C, NULL, G.factory_startup, false, true, NULL, WM_init_state_app_template_get());
+ /* Call again to set from userpreferences... */
BLT_lang_set(NULL);
if (!G.background) {
diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c
index 09cde40136e..67ed19787b3 100644
--- a/source/blender/windowmanager/intern/wm_jobs.c
+++ b/source/blender/windowmanager/intern/wm_jobs.c
@@ -64,12 +64,12 @@
* - add timer notifier to handle progress
*
* Stop job
- * - signal job to end
- * on end, job will tag itself as sleeping
+ * - signal job to end
+ * on end, job will tag itself as sleeping
*
* Remove job
* - signal job to end
- * on end, job will remove itself
+ * on end, job will remove itself
*
* When job is done:
* - it puts timer to sleep (or removes?)
@@ -175,7 +175,7 @@ static wmJob *wm_job_find(wmWindowManager *wm, void *owner, const int job_type)
/* ******************* public API ***************** */
/**
- * \return current job or adds new job, but doesnt run it.
+ * \return current job or adds new job, but doesn't run it.
*
* \note every owner only gets a single job,
* adding a new one will stop running job and when stopped it starts the new one.
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index 55b00b2ef61..2bba4fc6f54 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -123,7 +123,7 @@ static void wm_keymap_item_properties_update_ot(wmKeyMapItem *kmi)
wmOperatorType *ot = WM_operatortype_find(kmi->idname, 0);
if (ot) {
if (ot->srna != kmi->ptr->type) {
- /* matches wm_keymap_item_properties_set but doesnt alloc new ptr */
+ /* matches wm_keymap_item_properties_set but doesn't alloc new ptr */
WM_operator_properties_create_ptr(kmi->ptr, ot);
/* 'kmi->ptr->data' NULL'd above, keep using existing properties.
* Note: the operators property types may have changed,
@@ -494,57 +494,6 @@ wmKeyMapItem *WM_keymap_add_item(wmKeyMap *keymap, const char *idname, int type,
return kmi;
}
-/* menu wrapper for WM_keymap_add_item */
-wmKeyMapItem *WM_keymap_add_menu(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
-{
- wmKeyMapItem *kmi = WM_keymap_add_item(keymap, "WM_OT_call_menu", type, val, modifier, keymodifier);
- RNA_string_set(kmi->ptr, "name", idname);
- return kmi;
-}
-
-wmKeyMapItem *WM_keymap_add_menu_pie(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
-{
- wmKeyMapItem *kmi = WM_keymap_add_item(keymap, "WM_OT_call_menu_pie", type, val, modifier, keymodifier);
- RNA_string_set(kmi->ptr, "name", idname);
- return kmi;
-}
-
-wmKeyMapItem *WM_keymap_add_panel(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
-{
- wmKeyMapItem *kmi = WM_keymap_add_item(keymap, "WM_OT_call_panel", type, val, modifier, keymodifier);
- RNA_string_set(kmi->ptr, "name", idname);
- /* TODO: we might want to disable this. */
- RNA_boolean_set(kmi->ptr, "keep_open", false);
- return kmi;
-}
-
-/* tool wrapper for WM_keymap_add_item */
-wmKeyMapItem *WM_keymap_add_tool(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
-{
- wmKeyMapItem *kmi = WM_keymap_add_item(keymap, "WM_OT_tool_set_by_name", type, val, modifier, keymodifier);
- RNA_string_set(kmi->ptr, "name", idname);
- return kmi;
-}
-
-/** Useful for mapping numbers to an enum. */
-void WM_keymap_add_context_enum_set_items(
- wmKeyMap *keymap, const EnumPropertyItem *items, const char *data_path,
- int type_start, int val, int modifier, int keymodifier)
-{
- for (int i = 0, type_offset = 0; items[i].identifier; i++) {
- if (items[i].identifier[0] == '\0') {
- continue;
- }
- wmKeyMapItem *kmi = WM_keymap_add_item(
- keymap, "WM_OT_context_set_enum",
- type_start + type_offset, val, modifier, keymodifier);
- RNA_string_set(kmi->ptr, "data_path", data_path);
- RNA_string_set(kmi->ptr, "value", items[i].identifier);
- type_offset += 1;
- }
-}
-
-
bool WM_keymap_remove_item(wmKeyMap *keymap, wmKeyMapItem *kmi)
{
if (BLI_findindex(&keymap->items, kmi) != -1) {
@@ -1713,261 +1662,6 @@ wmKeyMapItem *WM_keymap_item_find_id(wmKeyMap *keymap, int id)
return NULL;
}
-/* Guess an appropriate keymap from the operator name */
-/* Needs to be kept up to date with Keymap and Operator naming */
-wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname)
-{
- /* Op types purposely skipped for now:
- * BRUSH_OT
- * BOID_OT
- * BUTTONS_OT
- * CONSTRAINT_OT
- * PAINT_OT
- * ED_OT
- * FLUID_OT
- * TEXTURE_OT
- * UI_OT
- * VIEW2D_OT
- * WORLD_OT
- */
-
- wmKeyMap *km = NULL;
- SpaceLink *sl = CTX_wm_space_data(C);
-
- /* Window */
- if (STRPREFIX(opname, "WM_OT")) {
- km = WM_keymap_find_all(C, "Window", 0, 0);
- }
- /* Screen & Render */
- else if (STRPREFIX(opname, "SCREEN_OT") ||
- STRPREFIX(opname, "RENDER_OT") ||
- STRPREFIX(opname, "SOUND_OT") ||
- STRPREFIX(opname, "SCENE_OT"))
- {
- km = WM_keymap_find_all(C, "Screen", 0, 0);
- }
- /* Grease Pencil */
- else if (STRPREFIX(opname, "GPENCIL_OT")) {
- km = WM_keymap_find_all(C, "Grease Pencil", 0, 0);
- }
- /* Markers */
- else if (STRPREFIX(opname, "MARKER_OT")) {
- km = WM_keymap_find_all(C, "Markers", 0, 0);
- }
- /* Import/Export*/
- else if (STRPREFIX(opname, "IMPORT_") ||
- STRPREFIX(opname, "EXPORT_"))
- {
- km = WM_keymap_find_all(C, "Window", 0, 0);
- }
-
-
- /* 3D View */
- else if (STRPREFIX(opname, "VIEW3D_OT")) {
- km = WM_keymap_find_all(C, "3D View", sl->spacetype, 0);
- }
- else if (STRPREFIX(opname, "OBJECT_OT")) {
- /* exception, this needs to work outside object mode too */
- if (STRPREFIX(opname, "OBJECT_OT_mode_set"))
- km = WM_keymap_find_all(C, "Object Non-modal", 0, 0);
- else
- km = WM_keymap_find_all(C, "Object Mode", 0, 0);
- }
- /* Object mode related */
- else if (STRPREFIX(opname, "GROUP_OT") ||
- STRPREFIX(opname, "MATERIAL_OT") ||
- STRPREFIX(opname, "PTCACHE_OT") ||
- STRPREFIX(opname, "RIGIDBODY_OT"))
- {
- km = WM_keymap_find_all(C, "Object Mode", 0, 0);
- }
-
- /* Editing Modes */
- else if (STRPREFIX(opname, "MESH_OT")) {
- km = WM_keymap_find_all(C, "Mesh", 0, 0);
-
- /* some mesh operators are active in object mode too, like add-prim */
- if (km && !WM_keymap_poll((bContext *)C, km)) {
- km = WM_keymap_find_all(C, "Object Mode", 0, 0);
- }
- }
- else if (STRPREFIX(opname, "CURVE_OT") ||
- STRPREFIX(opname, "SURFACE_OT"))
- {
- km = WM_keymap_find_all(C, "Curve", 0, 0);
-
- /* some curve operators are active in object mode too, like add-prim */
- if (km && !WM_keymap_poll((bContext *)C, km)) {
- km = WM_keymap_find_all(C, "Object Mode", 0, 0);
- }
- }
- else if (STRPREFIX(opname, "ARMATURE_OT") ||
- STRPREFIX(opname, "SKETCH_OT"))
- {
- km = WM_keymap_find_all(C, "Armature", 0, 0);
- }
- else if (STRPREFIX(opname, "POSE_OT") ||
- STRPREFIX(opname, "POSELIB_OT"))
- {
- km = WM_keymap_find_all(C, "Pose", 0, 0);
- }
- else if (STRPREFIX(opname, "SCULPT_OT")) {
- switch (CTX_data_mode_enum(C)) {
- case OB_MODE_SCULPT:
- km = WM_keymap_find_all(C, "Sculpt", 0, 0);
- break;
- case OB_MODE_EDIT:
- km = WM_keymap_find_all(C, "UV Sculpt", 0, 0);
- break;
- }
- }
- else if (STRPREFIX(opname, "MBALL_OT")) {
- km = WM_keymap_find_all(C, "Metaball", 0, 0);
-
- /* some mball operators are active in object mode too, like add-prim */
- if (km && !WM_keymap_poll((bContext *)C, km)) {
- km = WM_keymap_find_all(C, "Object Mode", 0, 0);
- }
- }
- else if (STRPREFIX(opname, "LATTICE_OT")) {
- km = WM_keymap_find_all(C, "Lattice", 0, 0);
- }
- else if (STRPREFIX(opname, "PARTICLE_OT")) {
- km = WM_keymap_find_all(C, "Particle", 0, 0);
- }
- else if (STRPREFIX(opname, "FONT_OT")) {
- km = WM_keymap_find_all(C, "Font", 0, 0);
- }
- /* Paint Face Mask */
- else if (STRPREFIX(opname, "PAINT_OT_face_select")) {
- km = WM_keymap_find_all(C, "Face Mask", 0, 0);
- }
- else if (STRPREFIX(opname, "PAINT_OT")) {
- /* check for relevant mode */
- switch (CTX_data_mode_enum(C)) {
- case OB_MODE_WEIGHT_PAINT:
- km = WM_keymap_find_all(C, "Weight Paint", 0, 0);
- break;
- case OB_MODE_VERTEX_PAINT:
- km = WM_keymap_find_all(C, "Vertex Paint", 0, 0);
- break;
- case OB_MODE_TEXTURE_PAINT:
- km = WM_keymap_find_all(C, "Image Paint", 0, 0);
- break;
- }
- }
- /* Image Editor */
- else if (STRPREFIX(opname, "IMAGE_OT")) {
- km = WM_keymap_find_all(C, "Image", sl->spacetype, 0);
- }
- /* Clip Editor */
- else if (STRPREFIX(opname, "CLIP_OT")) {
- km = WM_keymap_find_all(C, "Clip", sl->spacetype, 0);
- }
- else if (STRPREFIX(opname, "MASK_OT")) {
- km = WM_keymap_find_all(C, "Mask Editing", 0, 0);
- }
- /* UV Editor */
- else if (STRPREFIX(opname, "UV_OT")) {
- /* Hack to allow using UV unwrapping ops from 3DView/editmode.
- * Mesh keymap is probably not ideal, but best place I could find to put those. */
- if (sl->spacetype == SPACE_VIEW3D) {
- km = WM_keymap_find_all(C, "Mesh", 0, 0);
- if (km && !WM_keymap_poll((bContext *)C, km)) {
- km = NULL;
- }
- }
- if (!km) {
- km = WM_keymap_find_all(C, "UV Editor", 0, 0);
- }
- }
- /* Node Editor */
- else if (STRPREFIX(opname, "NODE_OT")) {
- km = WM_keymap_find_all(C, "Node Editor", sl->spacetype, 0);
- }
- /* Animation Editor Channels */
- else if (STRPREFIX(opname, "ANIM_OT_channels")) {
- km = WM_keymap_find_all(C, "Animation Channels", 0, 0);
- }
- /* Animation Generic - after channels */
- else if (STRPREFIX(opname, "ANIM_OT")) {
- km = WM_keymap_find_all(C, "Animation", 0, 0);
- }
- /* Graph Editor */
- else if (STRPREFIX(opname, "GRAPH_OT")) {
- km = WM_keymap_find_all(C, "Graph Editor", sl->spacetype, 0);
- }
- /* Dopesheet Editor */
- else if (STRPREFIX(opname, "ACTION_OT")) {
- km = WM_keymap_find_all(C, "Dopesheet", sl->spacetype, 0);
- }
- /* NLA Editor */
- else if (STRPREFIX(opname, "NLA_OT")) {
- km = WM_keymap_find_all(C, "NLA Editor", sl->spacetype, 0);
- }
- /* Script */
- else if (STRPREFIX(opname, "SCRIPT_OT")) {
- km = WM_keymap_find_all(C, "Script", sl->spacetype, 0);
- }
- /* Text */
- else if (STRPREFIX(opname, "TEXT_OT")) {
- km = WM_keymap_find_all(C, "Text", sl->spacetype, 0);
- }
- /* Sequencer */
- else if (STRPREFIX(opname, "SEQUENCER_OT")) {
- km = WM_keymap_find_all(C, "Sequencer", sl->spacetype, 0);
- }
- /* Console */
- else if (STRPREFIX(opname, "CONSOLE_OT")) {
- km = WM_keymap_find_all(C, "Console", sl->spacetype, 0);
- }
- /* Console */
- else if (STRPREFIX(opname, "INFO_OT")) {
- km = WM_keymap_find_all(C, "Info", sl->spacetype, 0);
- }
- /* File browser */
- else if (STRPREFIX(opname, "FILE_OT")) {
- km = WM_keymap_find_all(C, "File Browser", sl->spacetype, 0);
- }
- /* Logic Editor */
- else if (STRPREFIX(opname, "LOGIC_OT")) {
- km = WM_keymap_find_all(C, "Logic Editor", sl->spacetype, 0);
- }
- /* Outliner */
- else if (STRPREFIX(opname, "OUTLINER_OT")) {
- km = WM_keymap_find_all(C, "Outliner", sl->spacetype, 0);
- }
- /* Transform */
- else if (STRPREFIX(opname, "TRANSFORM_OT")) {
- /* check for relevant editor */
- switch (sl->spacetype) {
- case SPACE_VIEW3D:
- km = WM_keymap_find_all(C, "3D View", sl->spacetype, 0);
- break;
- case SPACE_IPO:
- km = WM_keymap_find_all(C, "Graph Editor", sl->spacetype, 0);
- break;
- case SPACE_ACTION:
- km = WM_keymap_find_all(C, "Dopesheet", sl->spacetype, 0);
- break;
- case SPACE_NLA:
- km = WM_keymap_find_all(C, "NLA Editor", sl->spacetype, 0);
- break;
- case SPACE_IMAGE:
- km = WM_keymap_find_all(C, "UV Editor", 0, 0);
- break;
- case SPACE_NODE:
- km = WM_keymap_find_all(C, "Node Editor", sl->spacetype, 0);
- break;
- case SPACE_SEQ:
- km = WM_keymap_find_all(C, "Sequencer", sl->spacetype, 0);
- break;
- }
- }
-
- return km;
-}
-
const char *WM_bool_as_string(bool test)
{
return test ? IFACE_("ON") : IFACE_("OFF");
diff --git a/source/blender/windowmanager/intern/wm_keymap_utils.c b/source/blender/windowmanager/intern/wm_keymap_utils.c
new file mode 100644
index 00000000000..47dc07f556e
--- /dev/null
+++ b/source/blender/windowmanager/intern/wm_keymap_utils.c
@@ -0,0 +1,364 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/windowmanager/intern/wm_keymap_utils.c
+ * \ingroup wm
+ *
+ * Utilities to help define keymaps.
+ */
+
+#include <string.h>
+
+#include "DNA_object_types.h"
+#include "DNA_space_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "BLI_utildefines.h"
+
+#include "BKE_context.h"
+
+#include "RNA_access.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+/* menu wrapper for WM_keymap_add_item */
+
+/* -------------------------------------------------------------------- */
+/** \name Wrappers for #WM_keymap_add_item
+ * \{ */
+
+/* menu wrapper for WM_keymap_add_item */
+wmKeyMapItem *WM_keymap_add_menu(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
+{
+ wmKeyMapItem *kmi = WM_keymap_add_item(keymap, "WM_OT_call_menu", type, val, modifier, keymodifier);
+ RNA_string_set(kmi->ptr, "name", idname);
+ return kmi;
+}
+
+wmKeyMapItem *WM_keymap_add_menu_pie(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
+{
+ wmKeyMapItem *kmi = WM_keymap_add_item(keymap, "WM_OT_call_menu_pie", type, val, modifier, keymodifier);
+ RNA_string_set(kmi->ptr, "name", idname);
+ return kmi;
+}
+
+wmKeyMapItem *WM_keymap_add_panel(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
+{
+ wmKeyMapItem *kmi = WM_keymap_add_item(keymap, "WM_OT_call_panel", type, val, modifier, keymodifier);
+ RNA_string_set(kmi->ptr, "name", idname);
+ /* TODO: we might want to disable this. */
+ RNA_boolean_set(kmi->ptr, "keep_open", false);
+ return kmi;
+}
+
+/* tool wrapper for WM_keymap_add_item */
+wmKeyMapItem *WM_keymap_add_tool(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
+{
+ wmKeyMapItem *kmi = WM_keymap_add_item(keymap, "WM_OT_tool_set_by_name", type, val, modifier, keymodifier);
+ RNA_string_set(kmi->ptr, "name", idname);
+ return kmi;
+}
+
+/** Useful for mapping numbers to an enum. */
+void WM_keymap_add_context_enum_set_items(
+ wmKeyMap *keymap, const EnumPropertyItem *items, const char *data_path,
+ int type_start, int val, int modifier, int keymodifier)
+{
+ for (int i = 0, type_offset = 0; items[i].identifier; i++) {
+ if (items[i].identifier[0] == '\0') {
+ continue;
+ }
+ wmKeyMapItem *kmi = WM_keymap_add_item(
+ keymap, "WM_OT_context_set_enum",
+ type_start + type_offset, val, modifier, keymodifier);
+ RNA_string_set(kmi->ptr, "data_path", data_path);
+ RNA_string_set(kmi->ptr, "value", items[i].identifier);
+ type_offset += 1;
+ }
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Introspection
+ * \{ */
+
+/* Guess an appropriate keymap from the operator name */
+/* Needs to be kept up to date with Keymap and Operator naming */
+wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname)
+{
+ /* Op types purposely skipped for now:
+ * BRUSH_OT
+ * BOID_OT
+ * BUTTONS_OT
+ * CONSTRAINT_OT
+ * PAINT_OT
+ * ED_OT
+ * FLUID_OT
+ * TEXTURE_OT
+ * UI_OT
+ * VIEW2D_OT
+ * WORLD_OT
+ */
+
+ wmKeyMap *km = NULL;
+ SpaceLink *sl = CTX_wm_space_data(C);
+
+ /* Window */
+ if (STRPREFIX(opname, "WM_OT")) {
+ km = WM_keymap_find_all(C, "Window", 0, 0);
+ }
+ /* Screen & Render */
+ else if (STRPREFIX(opname, "SCREEN_OT") ||
+ STRPREFIX(opname, "RENDER_OT") ||
+ STRPREFIX(opname, "SOUND_OT") ||
+ STRPREFIX(opname, "SCENE_OT"))
+ {
+ km = WM_keymap_find_all(C, "Screen", 0, 0);
+ }
+ /* Grease Pencil */
+ else if (STRPREFIX(opname, "GPENCIL_OT")) {
+ km = WM_keymap_find_all(C, "Grease Pencil", 0, 0);
+ }
+ /* Markers */
+ else if (STRPREFIX(opname, "MARKER_OT")) {
+ km = WM_keymap_find_all(C, "Markers", 0, 0);
+ }
+ /* Import/Export*/
+ else if (STRPREFIX(opname, "IMPORT_") ||
+ STRPREFIX(opname, "EXPORT_"))
+ {
+ km = WM_keymap_find_all(C, "Window", 0, 0);
+ }
+
+
+ /* 3D View */
+ else if (STRPREFIX(opname, "VIEW3D_OT")) {
+ km = WM_keymap_find_all(C, "3D View", sl->spacetype, 0);
+ }
+ else if (STRPREFIX(opname, "OBJECT_OT")) {
+ /* exception, this needs to work outside object mode too */
+ if (STRPREFIX(opname, "OBJECT_OT_mode_set"))
+ km = WM_keymap_find_all(C, "Object Non-modal", 0, 0);
+ else
+ km = WM_keymap_find_all(C, "Object Mode", 0, 0);
+ }
+ /* Object mode related */
+ else if (STRPREFIX(opname, "GROUP_OT") ||
+ STRPREFIX(opname, "MATERIAL_OT") ||
+ STRPREFIX(opname, "PTCACHE_OT") ||
+ STRPREFIX(opname, "RIGIDBODY_OT"))
+ {
+ km = WM_keymap_find_all(C, "Object Mode", 0, 0);
+ }
+
+ /* Editing Modes */
+ else if (STRPREFIX(opname, "MESH_OT")) {
+ km = WM_keymap_find_all(C, "Mesh", 0, 0);
+
+ /* some mesh operators are active in object mode too, like add-prim */
+ if (km && !WM_keymap_poll((bContext *)C, km)) {
+ km = WM_keymap_find_all(C, "Object Mode", 0, 0);
+ }
+ }
+ else if (STRPREFIX(opname, "CURVE_OT") ||
+ STRPREFIX(opname, "SURFACE_OT"))
+ {
+ km = WM_keymap_find_all(C, "Curve", 0, 0);
+
+ /* some curve operators are active in object mode too, like add-prim */
+ if (km && !WM_keymap_poll((bContext *)C, km)) {
+ km = WM_keymap_find_all(C, "Object Mode", 0, 0);
+ }
+ }
+ else if (STRPREFIX(opname, "ARMATURE_OT") ||
+ STRPREFIX(opname, "SKETCH_OT"))
+ {
+ km = WM_keymap_find_all(C, "Armature", 0, 0);
+ }
+ else if (STRPREFIX(opname, "POSE_OT") ||
+ STRPREFIX(opname, "POSELIB_OT"))
+ {
+ km = WM_keymap_find_all(C, "Pose", 0, 0);
+ }
+ else if (STRPREFIX(opname, "SCULPT_OT")) {
+ switch (CTX_data_mode_enum(C)) {
+ case OB_MODE_SCULPT:
+ km = WM_keymap_find_all(C, "Sculpt", 0, 0);
+ break;
+ case OB_MODE_EDIT:
+ km = WM_keymap_find_all(C, "UV Sculpt", 0, 0);
+ break;
+ }
+ }
+ else if (STRPREFIX(opname, "MBALL_OT")) {
+ km = WM_keymap_find_all(C, "Metaball", 0, 0);
+
+ /* some mball operators are active in object mode too, like add-prim */
+ if (km && !WM_keymap_poll((bContext *)C, km)) {
+ km = WM_keymap_find_all(C, "Object Mode", 0, 0);
+ }
+ }
+ else if (STRPREFIX(opname, "LATTICE_OT")) {
+ km = WM_keymap_find_all(C, "Lattice", 0, 0);
+ }
+ else if (STRPREFIX(opname, "PARTICLE_OT")) {
+ km = WM_keymap_find_all(C, "Particle", 0, 0);
+ }
+ else if (STRPREFIX(opname, "FONT_OT")) {
+ km = WM_keymap_find_all(C, "Font", 0, 0);
+ }
+ /* Paint Face Mask */
+ else if (STRPREFIX(opname, "PAINT_OT_face_select")) {
+ km = WM_keymap_find_all(C, "Face Mask", 0, 0);
+ }
+ else if (STRPREFIX(opname, "PAINT_OT")) {
+ /* check for relevant mode */
+ switch (CTX_data_mode_enum(C)) {
+ case OB_MODE_WEIGHT_PAINT:
+ km = WM_keymap_find_all(C, "Weight Paint", 0, 0);
+ break;
+ case OB_MODE_VERTEX_PAINT:
+ km = WM_keymap_find_all(C, "Vertex Paint", 0, 0);
+ break;
+ case OB_MODE_TEXTURE_PAINT:
+ km = WM_keymap_find_all(C, "Image Paint", 0, 0);
+ break;
+ }
+ }
+ /* Image Editor */
+ else if (STRPREFIX(opname, "IMAGE_OT")) {
+ km = WM_keymap_find_all(C, "Image", sl->spacetype, 0);
+ }
+ /* Clip Editor */
+ else if (STRPREFIX(opname, "CLIP_OT")) {
+ km = WM_keymap_find_all(C, "Clip", sl->spacetype, 0);
+ }
+ else if (STRPREFIX(opname, "MASK_OT")) {
+ km = WM_keymap_find_all(C, "Mask Editing", 0, 0);
+ }
+ /* UV Editor */
+ else if (STRPREFIX(opname, "UV_OT")) {
+ /* Hack to allow using UV unwrapping ops from 3DView/editmode.
+ * Mesh keymap is probably not ideal, but best place I could find to put those. */
+ if (sl->spacetype == SPACE_VIEW3D) {
+ km = WM_keymap_find_all(C, "Mesh", 0, 0);
+ if (km && !WM_keymap_poll((bContext *)C, km)) {
+ km = NULL;
+ }
+ }
+ if (!km) {
+ km = WM_keymap_find_all(C, "UV Editor", 0, 0);
+ }
+ }
+ /* Node Editor */
+ else if (STRPREFIX(opname, "NODE_OT")) {
+ km = WM_keymap_find_all(C, "Node Editor", sl->spacetype, 0);
+ }
+ /* Animation Editor Channels */
+ else if (STRPREFIX(opname, "ANIM_OT_channels")) {
+ km = WM_keymap_find_all(C, "Animation Channels", 0, 0);
+ }
+ /* Animation Generic - after channels */
+ else if (STRPREFIX(opname, "ANIM_OT")) {
+ km = WM_keymap_find_all(C, "Animation", 0, 0);
+ }
+ /* Graph Editor */
+ else if (STRPREFIX(opname, "GRAPH_OT")) {
+ km = WM_keymap_find_all(C, "Graph Editor", sl->spacetype, 0);
+ }
+ /* Dopesheet Editor */
+ else if (STRPREFIX(opname, "ACTION_OT")) {
+ km = WM_keymap_find_all(C, "Dopesheet", sl->spacetype, 0);
+ }
+ /* NLA Editor */
+ else if (STRPREFIX(opname, "NLA_OT")) {
+ km = WM_keymap_find_all(C, "NLA Editor", sl->spacetype, 0);
+ }
+ /* Script */
+ else if (STRPREFIX(opname, "SCRIPT_OT")) {
+ km = WM_keymap_find_all(C, "Script", sl->spacetype, 0);
+ }
+ /* Text */
+ else if (STRPREFIX(opname, "TEXT_OT")) {
+ km = WM_keymap_find_all(C, "Text", sl->spacetype, 0);
+ }
+ /* Sequencer */
+ else if (STRPREFIX(opname, "SEQUENCER_OT")) {
+ km = WM_keymap_find_all(C, "Sequencer", sl->spacetype, 0);
+ }
+ /* Console */
+ else if (STRPREFIX(opname, "CONSOLE_OT")) {
+ km = WM_keymap_find_all(C, "Console", sl->spacetype, 0);
+ }
+ /* Console */
+ else if (STRPREFIX(opname, "INFO_OT")) {
+ km = WM_keymap_find_all(C, "Info", sl->spacetype, 0);
+ }
+ /* File browser */
+ else if (STRPREFIX(opname, "FILE_OT")) {
+ km = WM_keymap_find_all(C, "File Browser", sl->spacetype, 0);
+ }
+ /* Logic Editor */
+ else if (STRPREFIX(opname, "LOGIC_OT")) {
+ km = WM_keymap_find_all(C, "Logic Editor", sl->spacetype, 0);
+ }
+ /* Outliner */
+ else if (STRPREFIX(opname, "OUTLINER_OT")) {
+ km = WM_keymap_find_all(C, "Outliner", sl->spacetype, 0);
+ }
+ /* Transform */
+ else if (STRPREFIX(opname, "TRANSFORM_OT")) {
+ /* check for relevant editor */
+ switch (sl->spacetype) {
+ case SPACE_VIEW3D:
+ km = WM_keymap_find_all(C, "3D View", sl->spacetype, 0);
+ break;
+ case SPACE_IPO:
+ km = WM_keymap_find_all(C, "Graph Editor", sl->spacetype, 0);
+ break;
+ case SPACE_ACTION:
+ km = WM_keymap_find_all(C, "Dopesheet", sl->spacetype, 0);
+ break;
+ case SPACE_NLA:
+ km = WM_keymap_find_all(C, "NLA Editor", sl->spacetype, 0);
+ break;
+ case SPACE_IMAGE:
+ km = WM_keymap_find_all(C, "UV Editor", 0, 0);
+ break;
+ case SPACE_NODE:
+ km = WM_keymap_find_all(C, "Node Editor", sl->spacetype, 0);
+ break;
+ case SPACE_SEQ:
+ km = WM_keymap_find_all(C, "Sequencer", sl->spacetype, 0);
+ break;
+ }
+ }
+
+ return km;
+}
+
+void WM_keymap_fix_linking(void)
+{
+}
+
+/** \} */
diff --git a/source/blender/windowmanager/intern/wm_menu_type.c b/source/blender/windowmanager/intern/wm_menu_type.c
index 97ca5690954..c8bce13b27c 100644
--- a/source/blender/windowmanager/intern/wm_menu_type.c
+++ b/source/blender/windowmanager/intern/wm_menu_type.c
@@ -35,7 +35,6 @@
#include "BLI_ghash.h"
#include "BKE_context.h"
-#include "BKE_library.h"
#include "BKE_screen.h"
#include "BKE_workspace.h"
diff --git a/source/blender/windowmanager/intern/wm_operator_props.c b/source/blender/windowmanager/intern/wm_operator_props.c
index 12d3f07795f..0c3750baa4c 100644
--- a/source/blender/windowmanager/intern/wm_operator_props.c
+++ b/source/blender/windowmanager/intern/wm_operator_props.c
@@ -229,27 +229,31 @@ void WM_operator_properties_border_to_rctf(struct wmOperator *op, rctf *rect)
}
/**
- * Use with #WM_gesture_border_invoke
+ * Use with #WM_gesture_box_invoke
*/
-void WM_operator_properties_gesture_border_ex(wmOperatorType *ot, bool deselect, bool extend)
+void WM_operator_properties_gesture_box_ex(wmOperatorType *ot, bool deselect, bool extend)
{
+ PropertyRNA *prop;
+
WM_operator_properties_border(ot);
if (deselect) {
- RNA_def_boolean(ot->srna, "deselect", false, "Deselect", "Deselect rather than select items");
+ prop = RNA_def_boolean(ot->srna, "deselect", false, "Deselect", "Deselect rather than select items");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
if (extend) {
- RNA_def_boolean(ot->srna, "extend", true, "Extend", "Extend selection instead of deselecting everything first");
+ prop = RNA_def_boolean(ot->srna, "extend", true, "Extend", "Extend selection instead of deselecting everything first");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
}
-void WM_operator_properties_gesture_border_select(wmOperatorType *ot)
+void WM_operator_properties_gesture_box_select(wmOperatorType *ot)
{
- WM_operator_properties_gesture_border_ex(ot, true, true);
+ WM_operator_properties_gesture_box_ex(ot, true, true);
}
-void WM_operator_properties_gesture_border(wmOperatorType *ot)
+void WM_operator_properties_gesture_box(wmOperatorType *ot)
{
- WM_operator_properties_gesture_border_ex(ot, false, false);
+ WM_operator_properties_gesture_box_ex(ot, false, false);
}
void WM_operator_properties_select_operation(wmOperatorType *ot)
@@ -266,7 +270,7 @@ void WM_operator_properties_select_operation(wmOperatorType *ot)
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
-void WM_operator_properties_gesture_border_zoom(wmOperatorType *ot)
+void WM_operator_properties_gesture_box_zoom(wmOperatorType *ot)
{
WM_operator_properties_border(ot);
@@ -340,7 +344,8 @@ void WM_operator_properties_gesture_circle_ex(wmOperatorType *ot, bool deselect)
RNA_def_int(ot->srna, "radius", radius_default, 1, INT_MAX, "Radius", "", 1, INT_MAX);
if (deselect) {
- RNA_def_boolean(ot->srna, "deselect", false, "Deselect", "Deselect rather than select items");
+ prop = RNA_def_boolean(ot->srna, "deselect", false, "Deselect", "Deselect rather than select items");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
}
diff --git a/source/blender/windowmanager/intern/wm_operator_type.c b/source/blender/windowmanager/intern/wm_operator_type.c
index 89421ac0ab0..33613d97f03 100644
--- a/source/blender/windowmanager/intern/wm_operator_type.c
+++ b/source/blender/windowmanager/intern/wm_operator_type.c
@@ -42,7 +42,6 @@
#include "BKE_context.h"
#include "BKE_idprop.h"
-#include "BKE_library.h"
#include "RNA_access.h"
#include "RNA_define.h"
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 28a2f5398fb..303b90b387c 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -73,12 +73,12 @@
#include "BKE_blender_version.h"
#include "BKE_brush.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "BKE_icons.h"
#include "BKE_idprop.h"
#include "BKE_image.h"
#include "BKE_library.h"
#include "BKE_library_query.h"
-#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_report.h"
@@ -263,7 +263,7 @@ char *WM_operator_pystring_ex(bContext *C, wmOperator *op, const bool all_args,
}
}
else {
- /* only to get the orginal props for comparisons */
+ /* only to get the original props for comparisons */
PointerRNA opptr_default;
const bool macro_args_test = ot->macro.first ? macro_args : true;
@@ -615,7 +615,7 @@ void WM_operator_properties_sanitize(PointerRNA *ptr, const bool no_context)
/** set all props to their default,
* \param do_update Only update un-initialized props.
*
- * \note, theres nothing specific to operators here.
+ * \note, there's nothing specific to operators here.
* this could be made a general function.
*/
bool WM_operator_properties_default(PointerRNA *ptr, const bool do_update)
@@ -785,6 +785,7 @@ static uiBlock *wm_enum_search_menu(bContext *C, ARegion *ar, void *arg)
block = UI_block_begin(C, ar, "_popup", UI_EMBOSS);
UI_block_flag_enable(block, UI_BLOCK_LOOP | UI_BLOCK_MOVEMOUSE_QUIT | UI_BLOCK_SEARCH_MENU);
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
search[0] = '\0';
BLI_assert(search_menu->use_previews || (search_menu->prv_cols == 0 && search_menu->prv_rows == 0));
@@ -1027,6 +1028,8 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
block = UI_block_begin(C, ar, __func__, UI_EMBOSS);
UI_block_flag_disable(block, UI_BLOCK_LOOP);
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_REGULAR);
+
/* UI_BLOCK_NUMSELECT for layer buttons */
UI_block_flag_enable(block, UI_BLOCK_NUMSELECT | UI_BLOCK_KEEP_OPEN | UI_BLOCK_MOVEMOUSE_QUIT);
@@ -1115,6 +1118,7 @@ static uiBlock *wm_block_dialog_create(bContext *C, ARegion *ar, void *userData)
block = UI_block_begin(C, ar, __func__, UI_EMBOSS);
UI_block_flag_disable(block, UI_BLOCK_LOOP);
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_REGULAR);
/* intentionally don't use 'UI_BLOCK_MOVEMOUSE_QUIT', some dialogues have many items
* where quitting by accident is very annoying */
@@ -1159,6 +1163,7 @@ static uiBlock *wm_operator_ui_create(bContext *C, ARegion *ar, void *userData)
block = UI_block_begin(C, ar, __func__, UI_EMBOSS);
UI_block_flag_disable(block, UI_BLOCK_LOOP);
UI_block_flag_enable(block, UI_BLOCK_KEEP_OPEN | UI_BLOCK_MOVEMOUSE_QUIT);
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_REGULAR);
layout = UI_block_layout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, data->width, data->height, 0, style);
@@ -1236,7 +1241,7 @@ static int wm_operator_props_popup_ex(bContext *C, wmOperator *op,
/* if we don't have global undo, we can't do undo push for automatic redo,
* so we require manual OK clicking in this popup */
if (!do_redo || !(U.uiflag & USER_GLOBALUNDO))
- return WM_operator_props_dialog_popup(C, op, 15 * UI_UNIT_X, UI_UNIT_Y);
+ return WM_operator_props_dialog_popup(C, op, 300, 20);
UI_popup_block_ex(C, wm_block_create_redo, NULL, wm_block_redo_cancel_cb, op, op);
@@ -1275,8 +1280,8 @@ int WM_operator_props_dialog_popup(bContext *C, wmOperator *op, int width, int h
wmOpPopUp *data = MEM_callocN(sizeof(wmOpPopUp), "WM_operator_props_dialog_popup");
data->op = op;
- data->width = width;
- data->height = height;
+ data->width = width * U.dpi_fac;
+ data->height = height * U.dpi_fac;
data->free_op = true; /* if this runs and gets registered we may want not to free it */
/* op is not executed until popup OK but is clicked */
@@ -1317,7 +1322,7 @@ static int wm_debug_menu_exec(bContext *C, wmOperator *op)
static int wm_debug_menu_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
RNA_int_set(op->ptr, "debug_value", G.debug_value);
- return WM_operator_props_dialog_popup(C, op, 9 * UI_UNIT_X, UI_UNIT_Y);
+ return WM_operator_props_dialog_popup(C, op, 180, 20);
}
static void WM_OT_debug_menu(wmOperatorType *ot)
@@ -1375,39 +1380,11 @@ static void wm_block_splash_refreshmenu(bContext *C, void *UNUSED(arg_block), vo
ED_region_tag_refresh_ui(ar_menu);
}
-static int wm_resource_check_prev(void)
-{
-
- const char *res = BKE_appdir_folder_id_version(BLENDER_RESOURCE_PATH_USER, BLENDER_VERSION, true);
-
- // if (res) printf("USER: %s\n", res);
-
-#if 0 /* ignore the local folder */
- if (res == NULL) {
- /* with a local dir, copying old files isn't useful since local dir get priority for config */
- res = BKE_appdir_folder_id_version(BLENDER_RESOURCE_PATH_LOCAL, BLENDER_VERSION, true);
- }
-#endif
-
- // if (res) printf("LOCAL: %s\n", res);
- if (res) {
- return false;
- }
- else {
- return (BKE_appdir_folder_id_version(BLENDER_RESOURCE_PATH_USER, BLENDER_VERSION - 1, true) != NULL);
- }
-}
-
static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(arg))
{
uiBlock *block;
uiBut *but;
- uiLayout *layout, *split, *col;
uiStyle *style = UI_style_get();
- const struct RecentFile *recent;
- int i;
- MenuType *mt = WM_menutype_find("USERPREF_MT_splash", true);
- char url[96];
const char *version_suffix = NULL;
#ifndef WITH_HEADLESS
@@ -1439,7 +1416,7 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
#endif /* WITH_BUILDINFO */
#ifndef WITH_HEADLESS
- if (U.pixelsize == 2) {
+ if (U.dpi_fac > 1.0) {
ibuf = IMB_ibImageFromMemory((unsigned char *)datatoc_splash_2x_png,
datatoc_splash_2x_png_size, IB_rect, NULL, "<splash screen>");
}
@@ -1464,7 +1441,7 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
ibuf_template = IMB_loadiffname(splash_filepath, IB_rect, NULL);
if (ibuf_template) {
const int x_expect = ibuf->x;
- const int y_expect = 282 * (int)U.pixelsize;
+ const int y_expect = 282 * (int)U.dpi_fac;
/* don't cover the header text */
if (ibuf_template->x == x_expect && ibuf_template->y == y_expect) {
memcpy(ibuf->rect, ibuf_template->rect, ibuf_template->x * ibuf_template->y * sizeof(char[4]));
@@ -1480,20 +1457,20 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
}
#endif
- block = UI_block_begin(C, ar, "_popup", UI_EMBOSS);
+ block = UI_block_begin(C, ar, "splash", UI_EMBOSS);
/* note on UI_BLOCK_NO_WIN_CLIP, the window size is not always synchronized
* with the OS when the splash shows, window clipping in this case gives
* ugly results and clipping the splash isn't useful anyway, just disable it [#32938] */
UI_block_flag_enable(block, UI_BLOCK_LOOP | UI_BLOCK_KEEP_OPEN | UI_BLOCK_NO_WIN_CLIP);
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
- /* XXX splash scales with pixelsize, should become widget-units */
- but = uiDefBut(block, UI_BTYPE_IMAGE, 0, "", 0, 0.5f * U.widget_unit, U.pixelsize * 501, U.pixelsize * 282, ibuf, 0.0, 0.0, 0, 0, ""); /* button owns the imbuf now */
+ but = uiDefBut(block, UI_BTYPE_IMAGE, 0, "", 0, 0.5f * U.widget_unit, U.dpi_fac * 501, U.dpi_fac * 282, ibuf, 0.0, 0.0, 0, 0, ""); /* button owns the imbuf now */
UI_but_func_set(but, wm_block_splash_close, block, NULL);
UI_block_func_set(block, wm_block_splash_refreshmenu, block, NULL);
/* label for 'a' bugfix releases, or 'Release Candidate 1'...
- * avoids recreating splash for version updates */
+ * avoids recreating splash for version updates */
if (STREQ(STRINGIFY(BLENDER_VERSION_CYCLE), "alpha")) {
version_suffix = "Alpha 2";
}
@@ -1509,9 +1486,9 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
if (version_suffix != NULL && version_suffix[0]) {
/* placed after the version number in the image,
* placing y is tricky to match baseline */
- int x = 236 * U.pixelsize - (2 * UI_DPI_FAC);
- int y = 231 * U.pixelsize + (4 * UI_DPI_FAC);
- int w = 240 * U.pixelsize;
+ int x = 234 * U.dpi_fac;
+ int y = 235 * U.dpi_fac;
+ int w = 240 * U.dpi_fac;
/* hack to have text draw 'text_sel' */
UI_block_emboss_set(block, UI_EMBOSS_NONE);
@@ -1525,7 +1502,7 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
if (build_commit_timestamp != 0) {
but = uiDefBut(
block, UI_BTYPE_LABEL, 0, date_buf,
- U.pixelsize * 502 - date_width, U.pixelsize * 267,
+ U.dpi_fac * 502 - date_width, U.dpi_fac * 267,
date_width, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
/* XXX, set internal flag - UI_SELECT */
UI_but_flag_enable(but, 1);
@@ -1533,7 +1510,7 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
}
but = uiDefBut(
block, UI_BTYPE_LABEL, 0, hash_buf,
- U.pixelsize * 502 - hash_width, U.pixelsize * (267 - label_delta),
+ U.dpi_fac * 502 - hash_width, U.dpi_fac * (267 - label_delta),
hash_width, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
/* XXX, set internal flag - UI_SELECT */
UI_but_flag_enable(but, 1);
@@ -1545,66 +1522,20 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
branch_width = (int)BLF_width(style->widgetlabel.uifont_id, branch_buf, sizeof(branch_buf)) + U.widget_unit;
but = uiDefBut(
block, UI_BTYPE_LABEL, 0, branch_buf,
- U.pixelsize * 502 - branch_width, U.pixelsize * (255 - label_delta),
+ U.dpi_fac * 502 - branch_width, U.dpi_fac * (255 - label_delta),
branch_width, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
/* XXX, set internal flag - UI_SELECT */
UI_but_flag_enable(but, 1);
}
#endif /* WITH_BUILDINFO */
- layout = UI_block_layout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 10, 2, U.pixelsize * 480, U.pixelsize * 110, 0, style);
+ uiLayout *layout = UI_block_layout(
+ block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 10, 2,
+ U.dpi_fac * 480, U.dpi_fac * 110, 0, style);
- UI_block_emboss_set(block, UI_EMBOSS);
- /* show the splash menu (containing interaction presets), using python */
+ MenuType *mt = WM_menutype_find("WM_MT_splash", true);
if (mt) {
UI_menutype_draw(C, mt, layout);
-
-// uiItemM(layout, "USERPREF_MT_keyconfigs", U.keyconfigstr, ICON_NONE);
- }
-
- UI_block_emboss_set(block, UI_EMBOSS_PULLDOWN);
- uiLayoutSetOperatorContext(layout, WM_OP_EXEC_REGION_WIN);
-
- split = uiLayoutSplit(layout, 0.0f, false);
- col = uiLayoutColumn(split, false);
- uiItemL(col, IFACE_("Links"), ICON_NONE);
- uiItemStringO(col, IFACE_("Join the Development Fund"), ICON_URL, "WM_OT_url_open", "url",
- "https://www.blender.org/foundation/development-fund/");
- uiItemStringO(col, IFACE_("Donate"), ICON_URL, "WM_OT_url_open", "url",
- "https://www.blender.org/foundation/donation-payment/");
- uiItemS(col);
- uiItemStringO(col, IFACE_("Manual"), ICON_URL, "WM_OT_url_open", "url",
- "https://docs.blender.org/manual/en/dev/");
- BLI_snprintf(url, sizeof(url), "https://wiki.blender.org/wiki/Reference/Release_Notes/%d.%d",
- BLENDER_VERSION / 100, BLENDER_VERSION % 100);
- uiItemStringO(col, IFACE_("Release Notes"), ICON_URL, "WM_OT_url_open", "url", url);
- uiItemStringO(col, IFACE_("Blender Website"), ICON_URL, "WM_OT_url_open", "url", "https://www.blender.org");
- uiItemStringO(col, IFACE_("Credits"), ICON_URL, "WM_OT_url_open", "url",
- "https://www.blender.org/about/credits/");
- uiItemL(col, "", ICON_NONE);
-
- col = uiLayoutColumn(split, false);
-
- if (wm_resource_check_prev()) {
- uiItemO(col, NULL, ICON_NEW, "WM_OT_copy_prev_settings");
- uiItemS(col);
- }
-
- uiItemL(col, IFACE_("Recent"), ICON_NONE);
- for (recent = G.recent_files.first, i = 0; (i < 5) && (recent); recent = recent->next, i++) {
- const char *filename = BLI_path_basename(recent->filepath);
- uiItemStringO(col, filename,
- BLO_has_bfile_extension(filename) ? ICON_FILE_BLEND : ICON_FILE_BACKUP,
- "WM_OT_open_mainfile", "filepath", recent->filepath);
- }
-
- uiItemS(col);
- uiItemO(col, NULL, ICON_RECOVER_LAST, "WM_OT_recover_last_session");
- uiItemL(col, "", ICON_NONE);
-
- mt = WM_menutype_find("USERPREF_MT_splash_footer", false);
- if (mt) {
- UI_menutype_draw(C, mt, uiLayoutColumn(layout, false));
}
UI_block_bounds_set_centered(block, 0);
@@ -1647,6 +1578,7 @@ static uiBlock *wm_block_search_menu(bContext *C, ARegion *ar, void *userdata)
block = UI_block_begin(C, ar, "_popup", UI_EMBOSS);
UI_block_flag_enable(block, UI_BLOCK_LOOP | UI_BLOCK_MOVEMOUSE_QUIT | UI_BLOCK_SEARCH_MENU);
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
but = uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, sizeof(search), 10, 10, init_data->size[0], UI_UNIT_Y, 0, 0, "");
UI_but_func_operator_search(but);
@@ -1912,8 +1844,10 @@ static void WM_OT_console_toggle(wmOperatorType *ot)
* - draw(bContext): drawing callback for paint cursor
*/
-void *WM_paint_cursor_activate(
- wmWindowManager *wm, bool (*poll)(bContext *C),
+wmPaintCursor *WM_paint_cursor_activate(
+ wmWindowManager *wm,
+ short space_type, short region_type,
+ bool (*poll)(bContext *C),
wmPaintCursorDraw draw, void *customdata)
{
wmPaintCursor *pc = MEM_callocN(sizeof(wmPaintCursor), "paint cursor");
@@ -1924,10 +1858,13 @@ void *WM_paint_cursor_activate(
pc->poll = poll;
pc->draw = draw;
+ pc->space_type = space_type;
+ pc->region_type = region_type;
+
return pc;
}
-void WM_paint_cursor_end(wmWindowManager *wm, void *handle)
+bool WM_paint_cursor_end(wmWindowManager *wm, wmPaintCursor *handle)
{
wmPaintCursor *pc;
@@ -1935,9 +1872,10 @@ void WM_paint_cursor_end(wmWindowManager *wm, void *handle)
if (pc == (wmPaintCursor *)handle) {
BLI_remlink(&wm->paintcursors, pc);
MEM_freeN(pc);
- return;
+ return true;
}
}
+ return false;
}
/* *********************** radial control ****************** */
@@ -2121,16 +2059,16 @@ static void radial_control_paint_tex(RadialControl *rc, float radius, float alph
/* draw textured quad */
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texCoord, 0, 0);
+ immAttr2f(texCoord, 0, 0);
immVertex2f(pos, -radius, -radius);
- immAttrib2f(texCoord, 1, 0);
+ immAttr2f(texCoord, 1, 0);
immVertex2f(pos, radius, -radius);
- immAttrib2f(texCoord, 1, 1);
+ immAttr2f(texCoord, 1, 1);
immVertex2f(pos, radius, radius);
- immAttrib2f(texCoord, 0, 1);
+ immAttr2f(texCoord, 0, 1);
immVertex2f(pos, -radius, radius);
immEnd();
@@ -2505,8 +2443,11 @@ static int radial_control_invoke(bContext *C, wmOperator *op, const wmEvent *eve
BLI_listbase_clear(&wm->paintcursors);
/* add radial control paint cursor */
- rc->cursor = WM_paint_cursor_activate(wm, op->type->poll,
- radial_control_paint_cursor, rc);
+ rc->cursor = WM_paint_cursor_activate(
+ wm,
+ SPACE_TYPE_ANY, RGN_TYPE_ANY,
+ op->type->poll,
+ radial_control_paint_cursor, rc);
WM_event_add_modal_handler(C, op);
@@ -3265,41 +3206,15 @@ static void gesture_circle_modal_keymap(wmKeyConfig *keyconf)
keymap = WM_modalkeymap_add(keyconf, "View3D Gesture Circle", modal_items);
- /* items for modal map */
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, GESTURE_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_ANY, KM_ANY, 0, GESTURE_MODAL_CANCEL);
-
- WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, GESTURE_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, 0, 0, GESTURE_MODAL_CONFIRM);
-
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_SELECT);
-
- /* Note: use 'KM_ANY' for release, so the circle exits on any mouse release,
- * this is needed when circle select is activated as a tool. */
-
- /* left mouse shift for deselect too */
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_SHIFT, 0, GESTURE_MODAL_DESELECT);
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, KM_ANY, 0, GESTURE_MODAL_NOP);
-
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_DESELECT); // default 2.4x
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, KM_ANY, 0, GESTURE_MODAL_NOP); // default 2.4x
-
- WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_CIRCLE_SUB);
- WM_modalkeymap_add_item(keymap, PADMINUS, KM_PRESS, 0, 0, GESTURE_MODAL_CIRCLE_SUB);
- WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_CIRCLE_ADD);
- WM_modalkeymap_add_item(keymap, PADPLUSKEY, KM_PRESS, 0, 0, GESTURE_MODAL_CIRCLE_ADD);
- WM_modalkeymap_add_item(keymap, MOUSEPAN, 0, 0, 0, GESTURE_MODAL_CIRCLE_SIZE);
-
/* assign map to operators */
WM_modalkeymap_assign(keymap, "VIEW3D_OT_select_circle");
- WM_modalkeymap_assign(keymap, "UV_OT_circle_select");
+ WM_modalkeymap_assign(keymap, "UV_OT_select_circle");
WM_modalkeymap_assign(keymap, "CLIP_OT_select_circle");
WM_modalkeymap_assign(keymap, "MASK_OT_select_circle");
WM_modalkeymap_assign(keymap, "NODE_OT_select_circle");
WM_modalkeymap_assign(keymap, "GPENCIL_OT_select_circle");
WM_modalkeymap_assign(keymap, "GRAPH_OT_select_circle");
WM_modalkeymap_assign(keymap, "ACTION_OT_select_circle");
-
}
/* straight line modal operators */
@@ -3319,13 +3234,6 @@ static void gesture_straightline_modal_keymap(wmKeyConfig *keyconf)
keymap = WM_modalkeymap_add(keyconf, "Gesture Straight Line", modal_items);
- /* items for modal map */
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, GESTURE_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_ANY, KM_ANY, 0, GESTURE_MODAL_CANCEL);
-
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_BEGIN);
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, KM_ANY, 0, GESTURE_MODAL_SELECT);
-
/* assign map to operators */
WM_modalkeymap_assign(keymap, "IMAGE_OT_sample_line");
WM_modalkeymap_assign(keymap, "PAINT_OT_weight_gradient");
@@ -3333,8 +3241,8 @@ static void gesture_straightline_modal_keymap(wmKeyConfig *keyconf)
}
-/* borderselect-like modal operators */
-static void gesture_border_modal_keymap(wmKeyConfig *keyconf)
+/* box_select-like modal operators */
+static void gesture_box_modal_keymap(wmKeyConfig *keyconf)
{
static const EnumPropertyItem modal_items[] = {
{GESTURE_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""},
@@ -3344,59 +3252,41 @@ static void gesture_border_modal_keymap(wmKeyConfig *keyconf)
{0, NULL, 0, NULL, NULL}
};
- wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "Gesture Border");
+ wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "Gesture Box");
/* this function is called for each spacetype, only needs to add map once */
if (keymap && keymap->modal_items) return;
- keymap = WM_modalkeymap_add(keyconf, "Gesture Border", modal_items);
-
- /* items for modal map */
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, GESTURE_MODAL_CANCEL);
-
- /* Note: cancel only on press otherwise you cannot map this to RMB-gesture */
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_PRESS, KM_ANY, 0, GESTURE_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_RELEASE, KM_ANY, 0, GESTURE_MODAL_SELECT);
-
- /* allow shift leftclick for deselect too */
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_SHIFT, 0, GESTURE_MODAL_BEGIN);
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, KM_SHIFT, 0, GESTURE_MODAL_DESELECT);
-
- /* any unhandled leftclick release handles select */
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_BEGIN);
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, KM_ANY, 0, GESTURE_MODAL_SELECT);
-
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_BEGIN);
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, 0, 0, GESTURE_MODAL_DESELECT);
+ keymap = WM_modalkeymap_add(keyconf, "Gesture Box", modal_items);
/* assign map to operators */
- WM_modalkeymap_assign(keymap, "ACTION_OT_select_border");
- WM_modalkeymap_assign(keymap, "ANIM_OT_channels_select_border");
+ WM_modalkeymap_assign(keymap, "ACTION_OT_select_box");
+ WM_modalkeymap_assign(keymap, "ANIM_OT_channels_select_box");
WM_modalkeymap_assign(keymap, "ANIM_OT_previewrange_set");
- WM_modalkeymap_assign(keymap, "INFO_OT_select_border");
- WM_modalkeymap_assign(keymap, "FILE_OT_select_border");
- WM_modalkeymap_assign(keymap, "GRAPH_OT_select_border");
- WM_modalkeymap_assign(keymap, "MARKER_OT_select_border");
- WM_modalkeymap_assign(keymap, "NLA_OT_select_border");
- WM_modalkeymap_assign(keymap, "NODE_OT_select_border");
+ WM_modalkeymap_assign(keymap, "INFO_OT_select_box");
+ WM_modalkeymap_assign(keymap, "FILE_OT_select_box");
+ WM_modalkeymap_assign(keymap, "GRAPH_OT_select_box");
+ WM_modalkeymap_assign(keymap, "MARKER_OT_select_box");
+ WM_modalkeymap_assign(keymap, "NLA_OT_select_box");
+ WM_modalkeymap_assign(keymap, "NODE_OT_select_box");
WM_modalkeymap_assign(keymap, "NODE_OT_viewer_border");
WM_modalkeymap_assign(keymap, "PAINT_OT_hide_show");
- WM_modalkeymap_assign(keymap, "OUTLINER_OT_select_border");
-// WM_modalkeymap_assign(keymap, "SCREEN_OT_border_select"); // template
- WM_modalkeymap_assign(keymap, "SEQUENCER_OT_select_border");
+ WM_modalkeymap_assign(keymap, "OUTLINER_OT_select_box");
+// WM_modalkeymap_assign(keymap, "SCREEN_OT_box_select"); // template
+ WM_modalkeymap_assign(keymap, "SEQUENCER_OT_select_box");
WM_modalkeymap_assign(keymap, "SEQUENCER_OT_view_ghost_border");
- WM_modalkeymap_assign(keymap, "UV_OT_select_border");
- WM_modalkeymap_assign(keymap, "CLIP_OT_select_border");
- WM_modalkeymap_assign(keymap, "CLIP_OT_graph_select_border");
- WM_modalkeymap_assign(keymap, "MASK_OT_select_border");
+ WM_modalkeymap_assign(keymap, "UV_OT_select_box");
+ WM_modalkeymap_assign(keymap, "CLIP_OT_select_box");
+ WM_modalkeymap_assign(keymap, "CLIP_OT_graph_select_box");
+ WM_modalkeymap_assign(keymap, "MASK_OT_select_box");
WM_modalkeymap_assign(keymap, "VIEW2D_OT_zoom_border");
WM_modalkeymap_assign(keymap, "VIEW3D_OT_clip_border");
WM_modalkeymap_assign(keymap, "VIEW3D_OT_render_border");
- WM_modalkeymap_assign(keymap, "VIEW3D_OT_select_border");
+ WM_modalkeymap_assign(keymap, "VIEW3D_OT_select_box");
WM_modalkeymap_assign(keymap, "VIEW3D_OT_zoom_border"); /* XXX TODO: zoom border should perhaps map rightmouse to zoom out instead of in+cancel */
WM_modalkeymap_assign(keymap, "IMAGE_OT_render_border");
WM_modalkeymap_assign(keymap, "IMAGE_OT_view_zoom_border");
- WM_modalkeymap_assign(keymap, "GPENCIL_OT_select_border");
+ WM_modalkeymap_assign(keymap, "GPENCIL_OT_select_box");
}
/* zoom to border modal operators */
@@ -3417,16 +3307,6 @@ static void gesture_zoom_border_modal_keymap(wmKeyConfig *keyconf)
keymap = WM_modalkeymap_add(keyconf, "Gesture Zoom Border", modal_items);
- /* items for modal map */
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, GESTURE_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_ANY, KM_ANY, 0, GESTURE_MODAL_CANCEL);
-
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_BEGIN);
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, 0, 0, GESTURE_MODAL_IN);
-
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_BEGIN);
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, 0, 0, GESTURE_MODAL_OUT);
-
/* assign map to operators */
WM_modalkeymap_assign(keymap, "VIEW2D_OT_zoom_border");
WM_modalkeymap_assign(keymap, "VIEW3D_OT_zoom_border");
@@ -3436,142 +3316,15 @@ static void gesture_zoom_border_modal_keymap(wmKeyConfig *keyconf)
/* default keymap for windows and screens, only call once per WM */
void wm_window_keymap(wmKeyConfig *keyconf)
{
- wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Window", 0, 0);
- wmKeyMapItem *kmi;
-
- /* note, this doesn't replace existing keymap items */
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_verify_item(keymap, "WM_OT_window_new", WKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
-#endif
-
-#ifdef __APPLE__
- WM_keymap_add_item(keymap, "WM_OT_read_homefile", NKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_menu(keymap, "TOPBAR_MT_file_open_recent", OKEY, KM_PRESS, KM_SHIFT | KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "WM_OT_open_mainfile", OKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "WM_OT_save_mainfile", SKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "WM_OT_save_as_mainfile", SKEY, KM_PRESS, KM_SHIFT | KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "WM_OT_quit_blender", QKEY, KM_PRESS, KM_OSKEY, 0);
-#endif
- WM_keymap_add_item(keymap, "WM_OT_read_homefile", NKEY, KM_PRESS, KM_CTRL, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "WM_OT_save_homefile", UKEY, KM_PRESS, KM_CTRL, 0);
-#endif
- WM_keymap_add_menu(keymap, "TOPBAR_MT_file_open_recent", OKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
- WM_keymap_add_item(keymap, "WM_OT_open_mainfile", OKEY, KM_PRESS, KM_CTRL, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "WM_OT_open_mainfile", F1KEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "WM_OT_link", OKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- WM_keymap_add_item(keymap, "WM_OT_append", F1KEY, KM_PRESS, KM_SHIFT, 0);
-#endif
-
- WM_keymap_add_item(keymap, "WM_OT_save_mainfile", SKEY, KM_PRESS, KM_CTRL, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "WM_OT_save_mainfile", WKEY, KM_PRESS, KM_CTRL, 0);
-#endif
- WM_keymap_add_item(keymap, "WM_OT_save_as_mainfile", SKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "WM_OT_save_as_mainfile", F2KEY, KM_PRESS, 0, 0);
- kmi = WM_keymap_add_item(keymap, "WM_OT_save_as_mainfile", SKEY, KM_PRESS, KM_ALT | KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "copy", true);
-
- WM_keymap_verify_item(keymap, "WM_OT_window_fullscreen_toggle", F11KEY, KM_PRESS, KM_ALT, 0);
-#endif
-
- WM_keymap_add_item(keymap, "WM_OT_quit_blender", QKEY, KM_PRESS, KM_CTRL, 0);
-
- /* F-Keys are a hassle on some macos systems. */
-#ifdef __APPLE__
- WM_keymap_add_item(keymap, "WM_OT_search_menu", FKEY, KM_PRESS, KM_OSKEY, 0);
-#endif
-
-#ifdef USE_WM_KEYMAP_27X
- WM_keymap_add_item(keymap, "WM_OT_doc_view_manual_ui_context", F1KEY, KM_PRESS, KM_ALT, 0);
-
- /* debug/testing */
- WM_keymap_verify_item(keymap, "WM_OT_redraw_timer", TKEY, KM_PRESS, KM_ALT | KM_CTRL, 0);
- WM_keymap_verify_item(keymap, "WM_OT_debug_menu", DKEY, KM_PRESS, KM_ALT | KM_CTRL, 0);
-#else
- WM_keymap_add_item(keymap, "WM_OT_doc_view_manual_ui_context", F1KEY, KM_PRESS, 0, 0);
- WM_keymap_add_menu(keymap, "TOPBAR_MT_file_specials", F2KEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "WM_OT_search_menu", F3KEY, KM_PRESS, 0, 0);
- WM_keymap_add_menu(keymap, "TOPBAR_MT_window_specials", F4KEY, KM_PRESS, 0, 0);
-#endif
-
- /* menus that can be accessed anywhere in blender */
- WM_keymap_add_menu(keymap, "SCREEN_MT_user_menu", QKEY, KM_PRESS, 0, 0);
-
-#ifdef WITH_INPUT_NDOF
- WM_keymap_add_menu(keymap, "USERPREF_MT_ndof_settings", NDOF_BUTTON_MENU, KM_PRESS, 0, 0);
-#endif
-
- WM_keymap_add_item(keymap, "WM_OT_toolbar", SPACEKEY, KM_PRESS, 0, 0);
-
- /* Space switching */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F3KEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "area.type");
- RNA_string_set(kmi->ptr, "value", "NODE_EDITOR");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F4KEY, KM_PRESS, KM_SHIFT, 0); /* new in 2.5x, was data browser */
- RNA_string_set(kmi->ptr, "data_path", "area.type");
- RNA_string_set(kmi->ptr, "value", "CONSOLE");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F5KEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "area.type");
- RNA_string_set(kmi->ptr, "value", "VIEW_3D");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F6KEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "area.type");
- RNA_string_set(kmi->ptr, "value", "GRAPH_EDITOR");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F7KEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "area.type");
- RNA_string_set(kmi->ptr, "value", "PROPERTIES");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F8KEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "area.type");
- RNA_string_set(kmi->ptr, "value", "SEQUENCE_EDITOR");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F9KEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "area.type");
- RNA_string_set(kmi->ptr, "value", "OUTLINER");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F10KEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "area.type");
- RNA_string_set(kmi->ptr, "value", "IMAGE_EDITOR");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F11KEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "area.type");
- RNA_string_set(kmi->ptr, "value", "TEXT_EDITOR");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", F12KEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "area.type");
- RNA_string_set(kmi->ptr, "value", "DOPESHEET_EDITOR");
-
-#ifdef WITH_INPUT_NDOF
- /* ndof speed */
- const char *data_path = "user_preferences.inputs.ndof_sensitivity";
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_scale_float", NDOF_BUTTON_PLUS, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", data_path);
- RNA_float_set(kmi->ptr, "value", 1.1f);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_scale_float", NDOF_BUTTON_MINUS, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", data_path);
- RNA_float_set(kmi->ptr, "value", 1.0f / 1.1f);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_scale_float", NDOF_BUTTON_PLUS, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", data_path);
- RNA_float_set(kmi->ptr, "value", 1.5f);
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_scale_float", NDOF_BUTTON_MINUS, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", data_path);
- RNA_float_set(kmi->ptr, "value", 1.0f / 1.5f);
-#endif /* WITH_INPUT_NDOF */
+ WM_keymap_ensure(keyconf, "Window", 0, 0);
wm_gizmos_keymap(keyconf);
gesture_circle_modal_keymap(keyconf);
- gesture_border_modal_keymap(keyconf);
+ gesture_box_modal_keymap(keyconf);
gesture_zoom_border_modal_keymap(keyconf);
gesture_straightline_modal_keymap(keyconf);
+
+ WM_keymap_fix_linking();
}
/**
diff --git a/source/blender/windowmanager/intern/wm_stereo.c b/source/blender/windowmanager/intern/wm_stereo.c
index 577145aff95..6b6b3bc3cbb 100644
--- a/source/blender/windowmanager/intern/wm_stereo.c
+++ b/source/blender/windowmanager/intern/wm_stereo.c
@@ -106,16 +106,16 @@ void wm_stereo3d_draw_interlace(wmWindow *win, ARegion *ar)
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texcoord, halfx, halfy);
+ immAttr2f(texcoord, halfx, halfy);
immVertex2f(pos, ar->winrct.xmin, ar->winrct.ymin);
- immAttrib2f(texcoord, 1.0f + halfx, halfy);
+ immAttr2f(texcoord, 1.0f + halfx, halfy);
immVertex2f(pos, ar->winrct.xmax + 1, ar->winrct.ymin);
- immAttrib2f(texcoord, 1.0f + halfx, 1.0f + halfy);
+ immAttr2f(texcoord, 1.0f + halfx, 1.0f + halfy);
immVertex2f(pos, ar->winrct.xmax + 1, ar->winrct.ymax + 1);
- immAttrib2f(texcoord, halfx, 1.0f + halfy);
+ immAttr2f(texcoord, halfx, 1.0f + halfy);
immVertex2f(pos, ar->winrct.xmin, ar->winrct.ymax + 1);
immEnd();
@@ -190,16 +190,16 @@ void wm_stereo3d_draw_sidebyside(wmWindow *win, int view)
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texcoord, halfx, halfy);
+ immAttr2f(texcoord, halfx, halfy);
immVertex2f(pos, soffx, 0.0f);
- immAttrib2f(texcoord, 1.0f + halfx, halfy);
+ immAttr2f(texcoord, 1.0f + halfx, halfy);
immVertex2f(pos, soffx + (sizex * 0.5f), 0.0f);
- immAttrib2f(texcoord, 1.0f + halfx, 1.0f + halfy);
+ immAttr2f(texcoord, 1.0f + halfx, 1.0f + halfy);
immVertex2f(pos, soffx + (sizex * 0.5f), sizey);
- immAttrib2f(texcoord, halfx, 1.0f + halfy);
+ immAttr2f(texcoord, halfx, 1.0f + halfy);
immVertex2f(pos, soffx, sizey);
immEnd();
@@ -234,16 +234,16 @@ void wm_stereo3d_draw_topbottom(wmWindow *win, int view)
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texcoord, halfx, halfy);
+ immAttr2f(texcoord, halfx, halfy);
immVertex2f(pos, 0.0f, soffy);
- immAttrib2f(texcoord, 1.0f + halfx, halfy);
+ immAttr2f(texcoord, 1.0f + halfx, halfy);
immVertex2f(pos, sizex, soffy);
- immAttrib2f(texcoord, 1.0f + halfx, 1.0f + halfy);
+ immAttr2f(texcoord, 1.0f + halfx, 1.0f + halfy);
immVertex2f(pos, sizex, soffy + (sizey * 0.5f));
- immAttrib2f(texcoord, halfx, 1.0f + halfy);
+ immAttr2f(texcoord, halfx, 1.0f + halfy);
immVertex2f(pos, 0.0f, soffy + (sizey * 0.5f));
immEnd();
@@ -403,7 +403,7 @@ int wm_stereo3d_set_exec(bContext *C, wmOperator *op)
if (prev_display_mode == S3D_DISPLAY_PAGEFLIP &&
prev_display_mode != win_src->stereo3d_format->display_mode)
{
- /* in case the hardward supports pageflip but not the display */
+ /* in case the hardware supports pageflip but not the display */
if ((win_dst = wm_window_copy_test(C, win_src, false, false))) {
/* pass */
}
diff --git a/source/blender/windowmanager/intern/wm_toolsystem.c b/source/blender/windowmanager/intern/wm_toolsystem.c
index 0aa5e16a519..333b71fead6 100644
--- a/source/blender/windowmanager/intern/wm_toolsystem.c
+++ b/source/blender/windowmanager/intern/wm_toolsystem.c
@@ -41,11 +41,12 @@
#include "DNA_workspace_types.h"
#include "DNA_object_types.h"
+#include "BKE_brush.h"
#include "BKE_context.h"
+#include "BKE_idprop.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_paint.h"
-#include "BKE_idprop.h"
#include "BKE_workspace.h"
#include "RNA_access.h"
@@ -58,7 +59,7 @@
static void toolsystem_reinit_with_toolref(
bContext *C, WorkSpace *UNUSED(workspace), bToolRef *tref);
-static void toolsystem_reinit_ensure_toolref(
+static bToolRef *toolsystem_reinit_ensure_toolref(
bContext *C, WorkSpace *workspace, const bToolKey *tkey, const char *default_tool);
static void toolsystem_refresh_screen_from_active_tool(
Main *bmain, WorkSpace *workspace, bToolRef *tref);
@@ -72,6 +73,9 @@ struct bToolRef *WM_toolsystem_ref_from_context(struct bContext *C)
WorkSpace *workspace = CTX_wm_workspace(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
ScrArea *sa = CTX_wm_area(C);
+ if (((1 << sa->spacetype) & WM_TOOLSYSTEM_SPACE_MASK) == 0) {
+ return NULL;
+ }
const bToolKey tkey = {
.space_type = sa->spacetype,
.mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype),
@@ -92,6 +96,7 @@ struct bToolRef_Runtime *WM_toolsystem_runtime_from_context(struct bContext *C)
bToolRef *WM_toolsystem_ref_find(WorkSpace *workspace, const bToolKey *tkey)
{
+ BLI_assert((1 << tkey->space_type) & WM_TOOLSYSTEM_SPACE_MASK);
LISTBASE_FOREACH (bToolRef *, tref, &workspace->tools) {
if ((tref->space_type == tkey->space_type) &&
(tref->mode == tkey->mode))
@@ -169,6 +174,14 @@ void WM_toolsystem_unlink(bContext *C, WorkSpace *workspace, const bToolKey *tke
}
}
+static void toolsystem_ref_link__refresh_image_uv_sculpt(bContext *C, Scene *scene)
+{
+ PointerRNA ptr;
+ RNA_pointer_create(&scene->id, &RNA_ToolSettings, scene->toolsettings, &ptr);
+ PropertyRNA *prop = RNA_struct_find_property(&ptr, "use_uv_sculpt");
+ RNA_property_update(C, &ptr, prop);
+}
+
static void toolsystem_ref_link(bContext *C, WorkSpace *workspace, bToolRef *tref)
{
bToolRef_Runtime *tref_rt = tref->runtime;
@@ -176,7 +189,9 @@ static void toolsystem_ref_link(bContext *C, WorkSpace *workspace, bToolRef *tre
const char *idname = tref_rt->gizmo_group;
wmGizmoGroupType *gzgt = WM_gizmogrouptype_find(idname, false);
if (gzgt != NULL) {
- WM_gizmo_group_type_ensure_ptr(gzgt);
+ if ((gzgt->flag & WM_GIZMOGROUPTYPE_TOOL_INIT) == 0) {
+ WM_gizmo_group_type_ensure_ptr(gzgt);
+ }
}
else {
CLOG_WARN(WM_LOG_TOOLS, "'%s' widget not found", idname);
@@ -203,20 +218,77 @@ static void toolsystem_ref_link(bContext *C, WorkSpace *workspace, bToolRef *tre
}
}
}
+ if ((tref->space_type == SPACE_IMAGE) &&
+ (tref->mode == SI_MODE_UV))
+ {
+ /* Note that switching uv-sculpt boolean is a hack at the moment.
+ * It would be best to make this either an operator or a higher level mode (like mesh-object sculpt mode). */
+ const EnumPropertyItem *items = rna_enum_uv_sculpt_tool_items;
+ const int i = RNA_enum_from_identifier(items, tref_rt->data_block);
+ if (i != -1) {
+ const int value = items[i].value;
+ wmWindowManager *wm = bmain->wm.first;
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ if (workspace == WM_window_get_active_workspace(win)) {
+ Scene *scene = WM_window_get_active_scene(win);
+ ToolSettings *ts = scene->toolsettings;
+ ts->uv_sculpt_tool = value;
+
+ if (ts->use_uv_sculpt == false) {
+ ts->use_uv_sculpt = true;
+ toolsystem_ref_link__refresh_image_uv_sculpt(C, scene);
+ }
+ }
+ }
+ }
+ }
else {
- struct Brush *brush = (struct Brush *)BKE_libblock_find_name(bmain, ID_BR, tref_rt->data_block);
- if (brush) {
+ const ePaintMode paint_mode = BKE_paintmode_get_from_tool(tref);
+ BLI_assert(paint_mode != ePaintInvalid);
+ const EnumPropertyItem *items = BKE_paint_get_tool_enum_from_paintmode(paint_mode);
+ BLI_assert(items != NULL);
+
+ const int i = items ? RNA_enum_from_identifier(items, tref_rt->data_block) : -1;
+ if (i != -1) {
+ const int slot_index = items[i].value;
wmWindowManager *wm = bmain->wm.first;
for (wmWindow *win = wm->windows.first; win; win = win->next) {
if (workspace == WM_window_get_active_workspace(win)) {
Scene *scene = WM_window_get_active_scene(win);
- ViewLayer *view_layer = WM_window_get_active_view_layer(win);
- Paint *paint = BKE_paint_get_active(scene, view_layer);
- if (paint) {
- if (brush) {
- BKE_paint_brush_set(paint, brush);
+ Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
+ struct Brush *brush = BKE_paint_toolslots_brush_get(paint, slot_index);
+ if (brush == NULL) {
+ /* Could make into a function. */
+ brush = (struct Brush *)BKE_libblock_find_name(bmain, ID_BR, items[i].name);
+ if (brush && slot_index == BKE_brush_tool_get(brush, paint)) {
+ /* pass */
+ }
+ else {
+ brush = BKE_brush_add(bmain, items[i].name, paint->runtime.ob_mode);
+ BKE_brush_tool_set(brush, paint, slot_index);
}
+ BKE_paint_brush_set(paint, brush);
}
+ BKE_paint_brush_set(paint, brush);
+ }
+ }
+ }
+ }
+ }
+ else {
+ /* XXX, this part is weak, disables uv_sculpt when non uv-tool set. */
+ if ((tref->space_type == SPACE_IMAGE) &&
+ (tref->mode == SI_MODE_UV))
+ {
+ Main *bmain = CTX_data_main(C);
+ wmWindowManager *wm = bmain->wm.first;
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ if (workspace == WM_window_get_active_workspace(win)) {
+ Scene *scene = WM_window_get_active_scene(win);
+ ToolSettings *ts = scene->toolsettings;
+ if (ts->use_uv_sculpt == true) {
+ ts->use_uv_sculpt = false;
+ toolsystem_ref_link__refresh_image_uv_sculpt(C, scene);
}
}
}
@@ -281,6 +353,10 @@ void WM_toolsystem_reinit_all(struct bContext *C, wmWindow *win)
bScreen *screen = WM_window_get_active_screen(win);
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ if (((1 << sa->spacetype) & WM_TOOLSYSTEM_SPACE_MASK) == 0) {
+ continue;
+ }
+
WorkSpace *workspace = WM_window_get_active_workspace(win);
const bToolKey tkey = {
.space_type = sa->spacetype,
@@ -331,6 +407,77 @@ void WM_toolsystem_ref_set_from_runtime(
}
}
+/**
+ * Sync the internal active state of a tool back into the tool system,
+ * this is needed for active brushes where the real active state is not stored in the tool system.
+ */
+void WM_toolsystem_ref_sync_from_context(
+ Main *bmain, WorkSpace *workspace, bToolRef *tref)
+{
+ bToolRef_Runtime *tref_rt = tref->runtime;
+ if ((tref_rt == NULL) || (tref_rt->data_block[0] == '\0')) {
+ return;
+ }
+ wmWindowManager *wm = bmain->wm.first;
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ if (workspace != WM_window_get_active_workspace(win)) {
+ continue;
+ }
+
+ Scene *scene = WM_window_get_active_scene(win);
+ ToolSettings *ts = scene->toolsettings;
+ ViewLayer *view_layer = WM_window_get_active_view_layer(win);
+ Object *ob = OBACT(view_layer);
+ if (ob == NULL) {
+ /* pass */
+ }
+ else if ((tref->space_type == SPACE_VIEW3D) &&
+ (tref->mode == CTX_MODE_PARTICLE) &&
+ (ob->mode & OB_MODE_PARTICLE_EDIT))
+ {
+ const EnumPropertyItem *items = rna_enum_particle_edit_hair_brush_items;
+ const int i = RNA_enum_from_value(items, ts->particle.brushtype);
+ const EnumPropertyItem *item = &items[i];
+ if (!STREQ(tref_rt->data_block, item->identifier)) {
+ STRNCPY(tref_rt->data_block, item->identifier);
+ STRNCPY(tref->idname, item->name);
+ }
+ }
+ else if ((tref->space_type == SPACE_IMAGE) &&
+ (tref->mode == SI_MODE_UV) &&
+ (ob->mode &
+ OB_MODE_EDIT))
+ {
+ const EnumPropertyItem *items = rna_enum_uv_sculpt_tool_items;
+ const int i = RNA_enum_from_value(items, ts->uv_sculpt_tool);
+ const EnumPropertyItem *item = &items[i];
+ if (!STREQ(tref_rt->data_block, item->identifier)) {
+ STRNCPY(tref_rt->data_block, item->identifier);
+ STRNCPY(tref->idname, item->name);
+ }
+ }
+ else {
+ const ePaintMode paint_mode = BKE_paintmode_get_from_tool(tref);
+ Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
+ const EnumPropertyItem *items = BKE_paint_get_tool_enum_from_paintmode(paint_mode);
+ if (paint && paint->brush && items) {
+ const ID *brush = (ID *)paint->brush;
+ const char tool_type = BKE_brush_tool_get((struct Brush *)brush, paint);
+ const int i = RNA_enum_from_value(items, tool_type);
+ /* Possible when loading files from the future. */
+ if (i != -1) {
+ const char *name = items[i].name;
+ const char *identifier = items[i].identifier;
+ if (!STREQ(tref_rt->data_block, identifier)) {
+ STRNCPY(tref_rt->data_block, identifier);
+ STRNCPY(tref->idname, name);
+ }
+ }
+ }
+ }
+ }
+}
+
void WM_toolsystem_init(bContext *C)
{
Main *bmain = CTX_data_main(C);
@@ -351,6 +498,9 @@ void WM_toolsystem_init(bContext *C)
bScreen *screen = WM_window_get_active_screen(win);
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ if (((1 << sa->spacetype) & WM_TOOLSYSTEM_SPACE_MASK) == 0) {
+ continue;
+ }
const bToolKey tkey = {
.space_type = sa->spacetype,
.mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype),
@@ -362,6 +512,11 @@ void WM_toolsystem_init(bContext *C)
tref->tag = 1;
}
}
+ else {
+ /* Without this we may load a file without a default tool. */
+ tref = toolsystem_reinit_ensure_toolref(C, workspace, &tkey, NULL);
+ tref->tag = 1;
+ }
}
CTX_wm_window_set(C, NULL);
}
@@ -415,6 +570,50 @@ bool WM_toolsystem_key_from_context(
return false;
}
+/**
+ * Use to update the active tool (shown in the top bar) in the least disruptive way.
+ *
+ * This is a little involved since there may be multiple valid active tools depending on the mode and space type.
+ *
+ * Used when undoing since the active mode may have changed.
+ */
+void WM_toolsystem_refresh_active(bContext *C)
+{
+ Main *bmain = CTX_data_main(C);
+ for (wmWindowManager *wm = bmain->wm.first; wm; wm = wm->id.next) {
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ WorkSpace *workspace = WM_window_get_active_workspace(win);
+ bScreen *screen = WM_window_get_active_screen(win);
+ ViewLayer *view_layer = WM_window_get_active_view_layer(win);
+ int mode_other = 0;
+ enum { UNSET = -1, CHANGE = 0, MATCH = 1 } mode_match = UNSET;
+ /* Could skip loop for modes that don't depend on space type. */
+ for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ /* Don't change the space type of the active tool, only update it's mode. */
+ if (sa->spacetype == workspace->tools_space_type) {
+ const int mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype);
+ if (workspace->tools_mode == mode) {
+ mode_match = MATCH;
+ break;
+ }
+ else if (mode_match == -1) {
+ mode_match = CHANGE;
+ mode_other = mode;
+ }
+ }
+ }
+
+ if (mode_match == CHANGE) {
+ const bToolKey tkey = {
+ .space_type = workspace->tools_space_type,
+ .mode = mode_other,
+ };
+ toolsystem_reinit_ensure_toolref(C, workspace, &tkey, NULL);
+ }
+ }
+ }
+}
+
void WM_toolsystem_refresh_screen_area(WorkSpace *workspace, ViewLayer *view_layer, ScrArea *sa)
{
sa->runtime.tool = NULL;
@@ -498,6 +697,8 @@ bToolRef *WM_toolsystem_ref_set_by_name(
tkey = &tkey_from_context;
}
+ BLI_assert((1 << tkey->space_type) & WM_TOOLSYSTEM_SPACE_MASK);
+
RNA_enum_set(&op_props, "space_type", tkey->space_type);
RNA_boolean_set(&op_props, "cycle", cycle);
@@ -524,18 +725,53 @@ static void toolsystem_reinit_with_toolref(
WM_toolsystem_ref_set_by_name(C, workspace, &tkey, tref->idname, false);
}
+static const char *toolsystem_default_tool(const bToolKey *tkey)
+{
+ switch (tkey->space_type) {
+ case SPACE_VIEW3D:
+ switch (tkey->mode) {
+ /* Use the names of the enums for each brush tool. */
+ case CTX_MODE_SCULPT:
+ case CTX_MODE_PAINT_VERTEX:
+ case CTX_MODE_PAINT_WEIGHT:
+ case CTX_MODE_GPENCIL_WEIGHT:
+ case CTX_MODE_PAINT_TEXTURE:
+ case CTX_MODE_GPENCIL_PAINT:
+ return "Draw";
+ case CTX_MODE_GPENCIL_SCULPT:
+ return "Push";
+ /* end temporary hack. */
+
+ case CTX_MODE_PARTICLE:
+ return "Comb";
+ default:
+ /* FIXME(campbell): disable for now since this means we can't lasso select by default. */
+#if 0
+ return "Select Box";
+#endif
+ break;
+ }
+ break;
+ }
+
+ return "Cursor";
+}
+
/**
* Run after changing modes.
*/
-static void toolsystem_reinit_ensure_toolref(
+static bToolRef *toolsystem_reinit_ensure_toolref(
bContext *C, WorkSpace *workspace, const bToolKey *tkey, const char *default_tool)
{
bToolRef *tref;
if (WM_toolsystem_ref_ensure(workspace, tkey, &tref)) {
+ if (default_tool == NULL) {
+ default_tool = toolsystem_default_tool(tkey);
+ }
STRNCPY(tref->idname, default_tool);
}
-
toolsystem_reinit_with_toolref(C, workspace, tref);
+ return tref;
}
void WM_toolsystem_update_from_context_view3d(bContext *C)
@@ -547,7 +783,7 @@ void WM_toolsystem_update_from_context_view3d(bContext *C)
.space_type = space_type,
.mode = WM_toolsystem_mode_from_spacetype(view_layer, NULL, space_type),
};
- toolsystem_reinit_ensure_toolref(C, workspace, &tkey, "Cursor");
+ toolsystem_reinit_ensure_toolref(C, workspace, &tkey, NULL);
}
/**
@@ -583,21 +819,22 @@ IDProperty *WM_toolsystem_ref_properties_ensure_idprops(bToolRef *tref)
return tref->properties;
}
-void WM_toolsystem_ref_properties_ensure(bToolRef *tref, wmOperatorType *ot, PointerRNA *ptr)
+
+void WM_toolsystem_ref_properties_ensure_ex(bToolRef *tref, const char *idname, StructRNA *type, PointerRNA *r_ptr)
{
IDProperty *group = WM_toolsystem_ref_properties_ensure_idprops(tref);
- IDProperty *prop = IDP_GetPropertyFromGroup(group, ot->idname);
+ IDProperty *prop = IDP_GetPropertyFromGroup(group, idname);
if (prop == NULL) {
IDPropertyTemplate val = {0};
- prop = IDP_New(IDP_GROUP, &val, "wmOperatorProperties");
- STRNCPY(prop->name, ot->idname);
+ prop = IDP_New(IDP_GROUP, &val, "wmGenericProperties");
+ STRNCPY(prop->name, idname);
IDP_ReplaceInGroup_ex(group, prop, NULL);
}
else {
BLI_assert(prop->type == IDP_GROUP);
}
- RNA_pointer_create(NULL, ot->srna, prop, ptr);
+ RNA_pointer_create(NULL, type, prop, r_ptr);
}
void WM_toolsystem_ref_properties_init_for_keymap(
diff --git a/source/blender/windowmanager/intern/wm_tooltip.c b/source/blender/windowmanager/intern/wm_tooltip.c
index 94a44a97afd..b0d621c2e44 100644
--- a/source/blender/windowmanager/intern/wm_tooltip.c
+++ b/source/blender/windowmanager/intern/wm_tooltip.c
@@ -37,22 +37,52 @@
#include "WM_api.h"
#include "WM_types.h"
-void WM_tooltip_timer_init(
+#include "PIL_time.h"
+
+static double g_tooltip_time_closed;
+double WM_tooltip_time_closed(void)
+{
+ return g_tooltip_time_closed;
+}
+
+void WM_tooltip_immediate_init(
bContext *C, wmWindow *win, ARegion *ar,
wmTooltipInitFn init)
{
WM_tooltip_timer_clear(C, win);
bScreen *screen = WM_window_get_active_screen(win);
+ if (screen->tool_tip == NULL) {
+ screen->tool_tip = MEM_callocN(sizeof(*screen->tool_tip), __func__);
+ }
+ screen->tool_tip->region_from = ar;
+ screen->tool_tip->init = init;
+ WM_tooltip_init(C, win);
+}
+
+void WM_tooltip_timer_init_ex(
+ bContext *C, wmWindow *win, ARegion *ar,
+ wmTooltipInitFn init, double delay)
+{
+ WM_tooltip_timer_clear(C, win);
+
+ bScreen *screen = WM_window_get_active_screen(win);
wmWindowManager *wm = CTX_wm_manager(C);
if (screen->tool_tip == NULL) {
screen->tool_tip = MEM_callocN(sizeof(*screen->tool_tip), __func__);
}
screen->tool_tip->region_from = ar;
- screen->tool_tip->timer = WM_event_add_timer(wm, win, TIMER, UI_TOOLTIP_DELAY);
+ screen->tool_tip->timer = WM_event_add_timer(wm, win, TIMER, delay);
screen->tool_tip->init = init;
}
+void WM_tooltip_timer_init(
+ bContext *C, wmWindow *win, ARegion *ar,
+ wmTooltipInitFn init)
+{
+ WM_tooltip_timer_init_ex(C, win, ar, init, UI_TOOLTIP_DELAY);
+}
+
void WM_tooltip_timer_clear(bContext *C, wmWindow *win)
{
wmWindowManager *wm = CTX_wm_manager(C);
@@ -73,6 +103,7 @@ void WM_tooltip_clear(bContext *C, wmWindow *win)
if (screen->tool_tip->region) {
UI_tooltip_free(C, screen, screen->tool_tip->region);
screen->tool_tip->region = NULL;
+ g_tooltip_time_closed = PIL_check_seconds_timer();
}
MEM_freeN(screen->tool_tip);
screen->tool_tip = NULL;
@@ -87,8 +118,16 @@ void WM_tooltip_init(bContext *C, wmWindow *win)
UI_tooltip_free(C, screen, screen->tool_tip->region);
screen->tool_tip->region = NULL;
}
+ const int pass_prev = screen->tool_tip->pass;
+ double pass_delay = 0.0;
screen->tool_tip->region = screen->tool_tip->init(
- C, screen->tool_tip->region_from, &screen->tool_tip->exit_on_event);
+ C, screen->tool_tip->region_from,
+ &screen->tool_tip->pass, &pass_delay, &screen->tool_tip->exit_on_event);
+ if (pass_prev != screen->tool_tip->pass) {
+ /* The pass changed, add timer for next pass. */
+ wmWindowManager *wm = CTX_wm_manager(C);
+ screen->tool_tip->timer = WM_event_add_timer(wm, win, TIMER, pass_delay);
+ }
if (screen->tool_tip->region == NULL) {
WM_tooltip_clear(C, win);
}
diff --git a/source/blender/windowmanager/intern/wm_uilist_type.c b/source/blender/windowmanager/intern/wm_uilist_type.c
index 52619a09218..f0ffa5905fc 100644
--- a/source/blender/windowmanager/intern/wm_uilist_type.c
+++ b/source/blender/windowmanager/intern/wm_uilist_type.c
@@ -34,7 +34,6 @@
#include "BLI_ghash.h"
#include "BKE_context.h"
-#include "BKE_library.h"
#include "BKE_screen.h"
#include "WM_api.h"
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 568dfacd41c..b84b851476a 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -52,10 +52,9 @@
#include "BKE_blender.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "BKE_icons.h"
#include "BKE_layer.h"
-#include "BKE_library.h"
-#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_screen.h"
#include "BKE_workspace.h"
@@ -117,8 +116,9 @@ static struct WMInitStruct {
int windowstate;
WinOverrideFlag override_flag;
+ bool window_focus;
bool native_pixels;
-} wm_init_state = {0, 0, 0, 0, GHOST_kWindowStateNormal, 0, true};
+} wm_init_state = {0, 0, 0, 0, GHOST_kWindowStateNormal, 0, true, true};
/* ******** win open & close ************ */
@@ -377,6 +377,7 @@ static uiBlock *block_create_confirm_quit(struct bContext *C, struct ARegion *ar
uiBlock *block = UI_block_begin(C, ar, "confirm_quit_popup", UI_EMBOSS);
UI_block_flag_enable(block, UI_BLOCK_KEEP_OPEN | UI_BLOCK_LOOP | UI_BLOCK_NO_WIN_CLIP | UI_BLOCK_NUMSELECT);
+ UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
UI_block_emboss_set(block, UI_EMBOSS);
uiLayout *layout = UI_block_layout(
@@ -670,7 +671,9 @@ static void wm_window_ghostwindow_add(wmWindowManager *wm, const char *title, wm
#ifndef __APPLE__
/* set the state here, so minimized state comes up correct on windows */
- GHOST_SetWindowState(ghostwin, (GHOST_TWindowState)win->windowstate);
+ if (wm_init_state.window_focus) {
+ GHOST_SetWindowState(ghostwin, (GHOST_TWindowState)win->windowstate);
+ }
#endif
/* until screens get drawn, make it nice gray */
glClearColor(0.55, 0.55, 0.55, 0.0);
@@ -728,7 +731,9 @@ void wm_window_ghostwindows_ensure(wmWindowManager *wm)
wm_init_state.start_y = 0;
#ifdef WITH_X11 /* X11 */
- /* X11, start maximized but use default sane size */
+ /* X11, don't start maximized because we can't figure out the dimensions
+ * of a single display yet if there are multiple, due to lack of Xinerama
+ * handling in GHOST. */
wm_init_state.size_x = min_ii(wm_init_state.size_x, WM_WIN_INIT_SIZE_X);
wm_init_state.size_y = min_ii(wm_init_state.size_y, WM_WIN_INIT_SIZE_Y);
/* pad */
@@ -859,7 +864,7 @@ wmWindow *WM_window_open_temp(bContext *C, int x, int y, int sizex, int sizey, i
sizex /= native_pixel_size;
sizey /= native_pixel_size;
- /* calculate postition */
+ /* calculate position */
rcti rect;
rect.xmin = x + win_prev->posx - sizex / 2;
rect.ymin = y + win_prev->posy - sizey / 2;
@@ -1594,7 +1599,7 @@ static int wm_window_timer(const bContext *C)
else if (wt->event_type == TIMERAUTOSAVE)
wm_autosave_timer(C, wm, wt);
else if (wt->event_type == TIMERNOTIFIER)
- WM_main_add_notifier(GET_UINT_FROM_POINTER(wt->customdata), NULL);
+ WM_main_add_notifier(POINTER_AS_UINT(wt->customdata), NULL);
else if (win) {
wmEvent event;
wm_event_init_from_window(win, &event);
@@ -1681,6 +1686,8 @@ void wm_ghost_init(bContext *C)
if (wm_init_state.native_pixels) {
GHOST_UseNativePixels();
}
+
+ GHOST_UseWindowFocus(wm_init_state.window_focus);
}
}
@@ -1733,7 +1740,7 @@ wmTimer *WM_event_add_timer_notifier(wmWindowManager *wm, wmWindow *win, unsigne
wt->stime = wt->ltime;
wt->timestep = timestep;
wt->win = win;
- wt->customdata = SET_UINT_IN_POINTER(type);
+ wt->customdata = POINTER_FROM_UINT(type);
wt->flags |= WM_TIMER_NO_FREE_CUSTOM_DATA;
BLI_addtail(&wm->timers, wt);
@@ -1960,6 +1967,11 @@ void WM_init_state_normal_set(void)
wm_init_state.override_flag |= WIN_OVERRIDE_WINSTATE;
}
+void WM_init_window_focus_set(bool do_it)
+{
+ wm_init_state.window_focus = do_it;
+}
+
void WM_init_native_pixels(bool do_it)
{
wm_init_state.native_pixels = do_it;
@@ -2042,7 +2054,7 @@ void WM_window_screen_rect_calc(const wmWindow *win, rcti *r_rect)
WM_window_rect_calc(win, &window_rect);
screen_rect = window_rect;
- /* Substract global areas from screen rectangle. */
+ /* Subtract global areas from screen rectangle. */
for (ScrArea *global_area = win->global_areas.areabase.first; global_area; global_area = global_area->next) {
int height = ED_area_global_size_y(global_area) - 1;
diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h
index 04353b55334..89fd2fdf557 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -44,6 +44,9 @@ typedef struct wmPaintCursor {
bool (*poll)(struct bContext *C);
void (*draw)(bContext *C, int, int, void *customdata);
+
+ short space_type;
+ short region_type;
} wmPaintCursor;
diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h
index 1dcd0cb62d0..a0610ffcff3 100644
--- a/source/blender/windowmanager/wm_event_system.h
+++ b/source/blender/windowmanager/wm_event_system.h
@@ -40,7 +40,7 @@
struct ScrArea;
struct ARegion;
-/* wmKeyMap is in DNA_windowmanager.h, it's savable */
+/* wmKeyMap is in DNA_windowmanager.h, it's saveable */
struct wmEventHandler_KeymapFn {
void (*handle_post_fn)(wmKeyMap *keymap, wmKeyMapItem *kmi, void *user_data);
diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h
index 6a0e4882830..cfb43bf43ed 100644
--- a/source/blender/windowmanager/wm_event_types.h
+++ b/source/blender/windowmanager/wm_event_types.h
@@ -26,9 +26,8 @@
/*
- * These define have its origin at sgi, where all device defines were written down in device.h.
- * Blender copied the conventions quite some, and expanded it with internal new defines (ton)
- *
+ * These define have its origin at sgi, where all device defines were written down in device.h.
+ * Blender copied the conventions quite some, and expanded it with internal new defines (ton)
*/
@@ -449,7 +448,7 @@ enum {
GESTURE_MODAL_CIRCLE_ADD = 6, /* circle sel: larger brush */
GESTURE_MODAL_CIRCLE_SUB = 7, /* circle sel: smaller brush */
- GESTURE_MODAL_BEGIN = 8, /* border select/straight line, activate, use release to detect which button */
+ GESTURE_MODAL_BEGIN = 8, /* box select/straight line, activate, use release to detect which button */
/* Uses 'zoom_out' operator property. */
GESTURE_MODAL_IN = 9,
diff --git a/source/blender/windowmanager/wm_window.h b/source/blender/windowmanager/wm_window.h
index 4fd5d66fb43..5988c8dab17 100644
--- a/source/blender/windowmanager/wm_window.h
+++ b/source/blender/windowmanager/wm_window.h
@@ -88,6 +88,8 @@ void wm_quit_with_optional_confirmation_prompt(bContext *C, wmWindow *win) ATTR
int wm_window_new_exec(bContext *C, struct wmOperator *op);
int wm_window_new_main_exec(bContext *C, struct wmOperator *op);
+void wm_test_autorun_warning(bContext *C);
+
/* Initial (unmaximized) size to start with for
* systems that can't find it for themselves (X11).
* Clamped by real desktop limits */
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
deleted file mode 100644
index 9f34729cd2f..00000000000
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ /dev/null
@@ -1,772 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- * BKE_bad_level_calls function stubs
- */
-
-/** \file blenderplayer/bad_level_call_stubs/stubs.c
- * \ingroup blc
- */
-
-#ifdef WITH_GAMEENGINE
-
-#define ASSERT_STUBS 0
-#if ASSERT_STUBS
-# include <assert.h>
-# define STUB_ASSERT(x) (assert(x))
-#else
-# define STUB_ASSERT(x)
-#endif
-
-
-struct ARegion;
-struct ARegionType;
-struct BMEditMesh;
-struct Base;
-struct bContext;
-struct BoundBox;
-struct Brush;
-struct CSG_FaceIteratorDescriptor;
-struct CSG_VertexIteratorDescriptor;
-struct ChannelDriver;
-struct ColorBand;
-struct Context;
-struct Curve;
-struct CurveMapping;
-struct DerivedMesh;
-struct EditBone;
-struct EnvMap;
-struct FCurve;
-struct Heap;
-struct HeapNode;
-struct ID;
-struct ImBuf;
-struct Image;
-struct ImageUser;
-struct KeyingSet;
-struct KeyingSetInfo;
-struct MCol;
-struct MTex;
-struct Main;
-struct Mask;
-struct Material;
-struct MenuType;
-struct Mesh;
-struct MetaBall;
-struct Lattice;
-struct ModifierData;
-struct MovieClip;
-struct MultiresModifierData;
-struct HookModifierData;
-struct NodeBlurData;
-struct Nurb;
-struct Object;
-struct PBVHNode;
-struct PyObject;
-struct Render;
-struct RenderEngine;
-struct RenderEngineType;
-struct RenderLayer;
-struct RenderResult;
-struct Scene;
-struct Scene;
-struct ScrArea;
-struct SculptSession;
-struct ShadeInput;
-struct ShadeResult;
-struct SpaceButs;
-struct SpaceClip;
-struct SpaceImage;
-struct SpaceNode;
-struct Tex;
-struct TexResult;
-struct Text;
-struct ToolSettings;
-struct View2D;
-struct View3D;
-struct bAction;
-struct bArmature;
-struct bConstraint;
-struct bConstraintOb;
-struct bConstraintTarget;
-struct bContextDataResult;
-struct bGPDlayer;
-struct bNode;
-struct bNodeType;
-struct bNodeSocket;
-struct bNodeSocketType;
-struct bNodeTree;
-struct bNodeTreeType;
-struct bPoseChannel;
-struct bPythonConstraint;
-struct bTheme;
-struct uiLayout;
-struct wmEvent;
-struct wmKeyConfig;
-struct wmKeyMap;
-struct wmOperator;
-struct wmOperatorType;
-struct wmWindow;
-struct wmWindowManager;
-
-
-/* -------------------------------------------------------------------- */
-/* Declarations */
-
-/* may cause troubles... enable for now so args match for certain */
-#if 1
-#if defined(__GNUC__)
-# pragma GCC diagnostic error "-Wmissing-prototypes"
-# pragma GCC diagnostic ignored "-Wunused-parameter"
-#endif
-
-#include "../../intern/dualcon/dualcon.h"
-#include "../../intern/elbeem/extern/elbeem.h"
-#include "../blender/blenkernel/BKE_modifier.h"
-#include "../blender/blenkernel/BKE_paint.h"
-#include "../blender/compositor/COM_compositor.h"
-#include "../blender/editors/include/ED_armature.h"
-#include "../blender/editors/include/ED_anim_api.h"
-#include "../blender/editors/include/ED_buttons.h"
-#include "../blender/editors/include/ED_clip.h"
-#include "../blender/editors/include/ED_curve.h"
-#include "../blender/editors/include/ED_fileselect.h"
-#include "../blender/editors/include/ED_gpencil.h"
-#include "../blender/editors/include/ED_image.h"
-#include "../blender/editors/include/ED_info.h"
-#include "../blender/editors/include/ED_keyframes_edit.h"
-#include "../blender/editors/include/ED_keyframing.h"
-#include "../blender/editors/include/ED_lattice.h"
-#include "../blender/editors/include/ED_mball.h"
-#include "../blender/editors/include/ED_mesh.h"
-#include "../blender/editors/include/ED_node.h"
-#include "../blender/editors/include/ED_object.h"
-#include "../blender/editors/include/ED_particle.h"
-#include "../blender/editors/include/ED_render.h"
-#include "../blender/editors/include/ED_screen.h"
-#include "../blender/editors/include/ED_space_api.h"
-#include "../blender/editors/include/ED_text.h"
-#include "../blender/editors/include/ED_transform.h"
-#include "../blender/editors/include/ED_transform_snap_object_context.h"
-#include "../blender/editors/include/ED_uvedit.h"
-#include "../blender/editors/include/ED_view3d.h"
-#include "../blender/editors/include/UI_interface.h"
-#include "../blender/editors/include/UI_interface_icons.h"
-#include "../blender/editors/include/UI_resources.h"
-#include "../blender/editors/include/UI_view2d.h"
-#include "../blender/freestyle/FRS_freestyle.h"
-#include "../blender/python/BPY_extern.h"
-#include "../blender/render/extern/include/RE_engine.h"
-#include "../blender/render/extern/include/RE_pipeline.h"
-#include "../blender/render/extern/include/RE_render_ext.h"
-#include "../blender/render/extern/include/RE_shader_ext.h"
-#include "../blender/windowmanager/WM_api.h"
-
-
-/* -------------------------------------------------------------------- */
-/* Externs
- * (ideally we wouldn't have _any_ but we can't include all directly)
- */
-
-/* bpy_operator_wrap.h */
-extern void macro_wrapper(struct wmOperatorType *ot, void *userdata);
-extern void operator_wrapper(struct wmOperatorType *ot, void *userdata);
-/* bpy_rna.h */
-extern bool pyrna_id_FromPyObject(struct PyObject *obj, struct ID **id);
-extern const char *BPY_app_translations_py_pgettext(const char *msgctxt, const char *msgid);
-extern const char *BPY_app_translations_py_pgettext(const char *msgctxt, const char *msgid);
-extern struct PyObject *pyrna_id_CreatePyObject(struct ID *id);
-extern bool pyrna_id_CheckPyObject(struct PyObject *obj);
-/* bpy_interface.c */
-bool BPY_string_is_keyword(const char *str) { return false; }
-
-#endif
-/* end declarations */
-
-
-/* -------------------------------------------------------------------- */
-/* Return Macro's */
-
-#include <string.h> /* memset */
-#define RET_NULL {STUB_ASSERT(0); return (void *) NULL;}
-#define RET_ZERO {STUB_ASSERT(0); return 0;}
-#define RET_MINUSONE {STUB_ASSERT(0); return -1;}
-#define RET_STRUCT(t) {struct t v; STUB_ASSERT(0); memset(&v, 0, sizeof(v)); return v;}
-#define RET_ARG(arg) {STUB_ASSERT(0); return arg; }
-#define RET_NONE {STUB_ASSERT(0);}
-
-
-/* -------------------------------------------------------------------- */
-/* Stubs */
-
-/*new render funcs */
-void EDBM_selectmode_set(struct BMEditMesh *em) RET_NONE
-void EDBM_mesh_load(struct Main *bmain, struct Object *ob) RET_NONE
-void EDBM_mesh_make(struct Object *ob, const int select_mode, const bool use_key_index) RET_NONE
-void EDBM_mesh_normals_update(struct BMEditMesh *em) RET_NONE
-void *g_system;
-bool EDBM_uv_check(struct BMEditMesh *em) RET_ZERO
-
-float *RE_RenderLayerGetPass(volatile struct RenderLayer *rl, const char *name, const char *viewname) RET_NULL
-float RE_filter_value(int type, float x) RET_ZERO
-struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name) RET_NULL
-void RE_texture_rng_init() RET_NONE
-void RE_texture_rng_exit() RET_NONE
-
-bool RE_layers_have_name(struct RenderResult *result) RET_ZERO
-const char *RE_engine_active_view_get(struct RenderEngine *engine) RET_NULL
-void RE_engine_active_view_set(struct RenderEngine *engine, const char *viewname) RET_NONE
-void RE_engine_get_camera_model_matrix(struct RenderEngine *engine, struct Object *camera, bool use_spherical_stereo, float *r_modelmat) RET_NONE
-float RE_engine_get_camera_shift_x(struct RenderEngine *engine, struct Object *camera, bool use_spherical_stereo) RET_ZERO
-bool RE_engine_get_spherical_stereo(struct RenderEngine *engine, struct Object *camera) RET_ZERO
-void RE_SetActiveRenderView(struct Render *re, const char *viewname) RET_NONE
-
-struct RenderPass *RE_pass_find_by_name(volatile struct RenderLayer *rl, const char *name, const char *viewname) RET_NULL
-struct RenderPass *RE_pass_find_by_type(volatile struct RenderLayer *rl, int passtype, const char *viewname) RET_NULL
-bool RE_HasCombinedLayer(RenderResult *res) RET_ZERO
-
-/* imagetexture.c stub */
-void ibuf_sample(struct ImBuf *ibuf, float fx, float fy, float dx, float dy, float *result) RET_NONE
-
-/* Freestyle */
-bool ED_texture_context_check_linestyle(const struct bContext *C) RET_ZERO
-void FRS_free_view_map_cache(void) RET_NONE
-
-/* texture.c */
-int multitex_ext(struct Tex *tex, float texvec[3], float dxt[3], float dyt[3], int osatex, struct TexResult *texres, short thread, struct ImagePool *pool, bool scene_color_manage, const bool skip_load_image) RET_ZERO
-int multitex_ext_safe(struct Tex *tex, float texvec[3], struct TexResult *texres, struct ImagePool *pool, bool scene_color_manage, const bool skip_load_image) RET_ZERO
-int multitex_nodes(struct Tex *tex, float texvec[3], float dxt[3], float dyt[3], int osatex, struct TexResult *texres, const short thread, short which_output, struct ShadeInput *shi, struct MTex *mtex, struct ImagePool *pool) RET_ZERO
-
-struct Material *RE_sample_material_init(struct Material *orig_mat, struct Scene *scene) RET_NULL
-void RE_sample_material_free(struct Material *mat) RET_NONE
-void RE_sample_material_color(
- struct Material *mat, float color[3], float *alpha, const float volume_co[3], const float surface_co[3],
- int tri_index, struct DerivedMesh *orcoDm, struct Object *ob) RET_NONE
-/* nodes */
-struct Render *RE_GetRender(const char *name) RET_NULL
-struct Render *RE_GetSceneRender(const struct Scene *scene) RET_NULL
-struct Object *RE_GetCamera(struct Render *re) RET_NULL
-float RE_lamp_get_data(struct ShadeInput *shi, struct Object *lamp_obj, float col[4], float lv[3], float *dist, float shadow[4]) RET_ZERO
-const float (*RE_object_instance_get_matrix(struct ObjectInstanceRen *obi, int matrix_id))[4] RET_NULL
-const float (*RE_render_current_get_matrix(int matrix_id))[4] RET_NULL
-float RE_object_instance_get_object_pass_index(struct ObjectInstanceRen *obi) RET_ZERO
-float RE_object_instance_get_random_id(struct ObjectInstanceRen *obi) RET_ZERO
-
-/* blenkernel */
-bool BKE_paint_proj_mesh_data_check(struct Scene *scene, struct Object *ob, bool *uvs, bool *mat, bool *tex, bool *stencil) RET_ZERO
-
-/* render */
-void RE_FreeRenderResult(struct RenderResult *res) RET_NONE
-void RE_FreeAllRenderResults(void) RET_NONE
-struct RenderResult *RE_MultilayerConvert(void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty) RET_NULL
-struct Scene *RE_GetScene(struct Render *re) RET_NULL
-void RE_Database_Free(struct Render *re) RET_NONE
-void RE_FreeRender(struct Render *re) RET_NONE
-void RE_DataBase_GetView(struct Render *re, float mat[4][4]) RET_NONE
-int externtex(
- const struct MTex *mtex, const float vec[3], float *tin, float *tr, float *tg, float *tb, float *ta,
- const int thread, struct ImagePool *pool, const bool skip_load_image, const bool texnode_preview) RET_ZERO
-float texture_value_blend(float tex, float out, float fact, float facg, int blendtype) RET_ZERO
-void texture_rgb_blend(float in[3], const float tex[3], const float out[3], float fact, float facg, int blendtype) RET_NONE
-double elbeemEstimateMemreq(int res, float sx, float sy, float sz, int refine, char *retstr) RET_ZERO
-struct Render *RE_NewRender(const char *name) RET_NULL
-struct Render *RE_NewSceneRender(const struct Scene *scene) RET_NULL
-void RE_SwapResult(struct Render *re, struct RenderResult **rr) RET_NONE
-void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct SceneRenderLayer *srl, struct Object *camera_override, unsigned int lay_override, int frame, const bool write_still) RET_NONE
-bool RE_WriteEnvmapResult(struct ReportList *reports, struct Scene *scene, struct EnvMap *env, const char *relpath, const char imtype, float layout[12]) RET_ZERO
-
-/* rna */
-float *ED_view3d_cursor3d_get(struct Scene *scene, struct View3D *v3d) RET_NULL
-void WM_menutype_free(void) RET_NONE
-void WM_menutype_freelink(struct MenuType *mt) RET_NONE
-bool WM_menutype_add(struct MenuType *mt) RET_ZERO
-int WM_operator_props_dialog_popup(struct bContext *C, struct wmOperator *op, int width, int height) RET_ZERO
-int WM_operator_confirm(struct bContext *C, struct wmOperator *op, const struct wmEvent *event) RET_ZERO
-struct MenuType *WM_menutype_find(const char *idname, bool quiet) RET_NULL
-void WM_operator_stack_clear(struct wmWindowManager *wm) RET_NONE
-void WM_operator_handlers_clear(wmWindowManager *wm, struct wmOperatorType *ot) RET_NONE
-bool WM_operator_is_repeat(const struct bContext *C, const struct wmOperator *op) RET_ZERO;
-
-void WM_autosave_init(wmWindowManager *wm) RET_NONE
-void WM_jobs_kill_all_except(struct wmWindowManager *wm, void *owner) RET_NONE
-
-void WM_lib_reload(struct Library *lib, struct bContext *C, struct ReportList *reports) RET_NONE
-
-char *WM_clipboard_text_get(bool selection, int *r_len) RET_NULL
-char *WM_clipboard_text_get_firstline(bool selection, int *r_len) RET_NULL
-void WM_clipboard_text_set(const char *buf, bool selection) RET_NONE
-
-void WM_cursor_set(struct wmWindow *win, int curor) RET_NONE
-void WM_cursor_modal_set(struct wmWindow *win, int curor) RET_NONE
-void WM_cursor_modal_restore(struct wmWindow *win) RET_NONE
-void WM_cursor_time(struct wmWindow *win, int nr) RET_NONE
-void WM_cursor_warp(struct wmWindow *win, int x, int y) RET_NONE
-
-struct wmJob *WM_jobs_get(struct wmWindowManager *wm, struct wmWindow *win, void *owner, const char *name, int flag, int job_type) RET_NULL
-void WM_jobs_customdata_set(struct wmJob *job, void *customdata, void (*free)(void *)) RET_NONE
-void WM_jobs_timer(struct wmJob *job, double timestep, unsigned int note, unsigned int endnote) RET_NONE
-
-void WM_jobs_callbacks(struct wmJob *job,
- void (*startjob)(void *, short *, short *, float *),
- void (*initjob)(void *),
- void (*update)(void *),
- void (*endjob)(void *)) RET_NONE
-
-void WM_jobs_start(struct wmWindowManager *wm, struct wmJob *job) RET_NONE
-void WM_report(ReportType type, const char *message) RET_NONE
-
-#ifdef WITH_INPUT_NDOF
- void WM_ndof_deadzone_set(float deadzone) RET_NONE
-#endif
-
-void WM_uilisttype_init(void) RET_NONE
-struct uiListType *WM_uilisttype_find(const char *idname, bool quiet) RET_NULL
-bool WM_uilisttype_add(struct uiListType *ult) RET_ZERO
-void WM_uilisttype_freelink(struct uiListType *ult) RET_NONE
-void WM_uilisttype_free(void) RET_NONE
-
-struct wmKeyMapItem *WM_keymap_item_find_id(struct wmKeyMap *keymap, int id) RET_NULL
-struct wmKeyMapItem *WM_key_event_operator(
- const struct bContext *C, const char *opname, int opcontext,
- struct IDProperty *properties, const bool is_hotkey,
- struct wmKeyMap **r_keymap) RET_NULL
-void WM_keyconfig_update(struct wmWindowManager *wm) RET_NONE
-
-int WM_enum_search_invoke(struct bContext *C, struct wmOperator *op, const struct wmEvent *event) RET_ZERO
-void WM_event_add_notifier(const struct bContext *C, unsigned int type, void *reference) RET_NONE
-void WM_main_add_notifier(unsigned int type, void *reference) RET_NONE
-void ED_armature_bone_rename(struct Main *bmain, struct bArmature *arm, const char *oldnamep, const char *newnamep) RET_NONE
-void ED_armature_transform(struct Main *bmain, struct bArmature *arm, float mat[4][4], const bool do_props) RET_NONE
-struct wmEventHandler *WM_event_add_modal_handler(struct bContext *C, struct wmOperator *op) RET_NULL
-struct wmTimer *WM_event_add_timer(struct wmWindowManager *wm, struct wmWindow *win, int event_type, double timestep) RET_NULL
-void WM_event_remove_timer(struct wmWindowManager *wm, struct wmWindow *win, struct wmTimer *timer) RET_NONE
-float WM_event_tablet_data(const struct wmEvent *event, int *pen_flip, float tilt[2]) RET_ZERO
-bool WM_event_is_tablet(const struct wmEvent *event) RET_ZERO
-void ED_armature_ebone_remove(struct bArmature *arm, struct EditBone *exBone) RET_NONE
-void object_test_constraints(struct Main *bmain, struct Object *owner) RET_NONE
-void ED_armature_ebone_to_mat4(struct EditBone *ebone, float mat[4][4]) RET_NONE
-void ED_armature_ebone_from_mat4(EditBone *ebone, float mat[4][4]) RET_NONE
-void ED_object_parent(struct Object *ob, struct Object *par, int type, const char *substr) RET_NONE
-void ED_object_constraint_set_active(struct Object *ob, struct bConstraint *con) RET_NONE
-void ED_node_composit_default(const struct bContext *C, struct Scene *scene) RET_NONE
-void *ED_region_draw_cb_activate(struct ARegionType *art, void(*draw)(const struct bContext *, struct ARegion *, void *), void *custumdata, int type) RET_ZERO /* XXX this one looks weird */
-void *ED_region_draw_cb_customdata(void *handle) RET_ZERO /* XXX This one looks wrong also */
-void ED_region_draw_cb_exit(struct ARegionType *art, void *handle) RET_NONE
-void ED_area_headerprint(struct ScrArea *sa, const char *str) RET_NONE
-void ED_gpencil_parent_location(struct bGPDlayer *gpl, float diff_mat[4][4]) RET_NONE
-void UI_view2d_region_to_view(struct View2D *v2d, float x, float y, float *viewx, float *viewy) RET_NONE
-bool UI_view2d_view_to_region_clip(struct View2D *v2d, float x, float y, int *regionx, int *regiony) RET_ZERO
-void UI_view2d_view_to_region(struct View2D *v2d, float x, float y, int *regionx, int *region_y) RET_NONE
-void UI_view2d_sync(struct bScreen *screen, struct ScrArea *sa, struct View2D *v2dcur, int flag) RET_NONE
-
-struct EditBone *ED_armature_ebone_get_mirrored(const struct ListBase *edbo, EditBone *ebo) RET_NULL
-struct EditBone *ED_armature_ebone_add(struct bArmature *arm, const char *name) RET_NULL
-struct ListBase *get_active_constraints (struct Object *ob) RET_NULL
-struct ListBase *get_constraint_lb(struct Object *ob, struct bConstraint *con, struct bPoseChannel **r_pchan) RET_NULL
-
-bool ED_space_image_show_uvedit(struct SpaceImage *sima, struct Object *obedit) RET_ZERO
-bool ED_space_image_show_render(struct SpaceImage *sima) RET_ZERO
-bool ED_space_image_show_paint(struct SpaceImage *sima) RET_ZERO
-void ED_space_image_paint_update(struct Main *bmain, struct wmWindowManager *wm, struct Scene *scene) RET_NONE
-void ED_space_image_set(struct Main *bmain, struct SpaceImage *sima, struct Scene *scene, struct Object *obedit, struct Image *ima) RET_NONE
-void ED_space_image_uv_sculpt_update(struct Main *bmain, struct wmWindowManager *wm, struct Scene *scene) RET_NONE
-void ED_space_image_scopes_update(const struct bContext *C, struct SpaceImage *sima, struct ImBuf *ibuf, bool use_view_settings) RET_NONE
-
-void ED_uvedit_get_aspect(struct Scene *scene, struct Object *ob, struct BMesh *em, float *aspx, float *aspy) RET_NONE
-
-void ED_screen_set_scene(struct bContext *C, struct bScreen *screen, struct Scene *scene) RET_NONE
-struct MovieClip *ED_space_clip_get_clip(struct SpaceClip *sc) RET_NULL
-void ED_space_clip_set_clip(struct bContext *C, struct bScreen *screen, struct SpaceClip *sc, struct MovieClip *clip) RET_NONE
-void ED_space_clip_set_mask(struct bContext *C, struct SpaceClip *sc, struct Mask *mask) RET_NONE
-void ED_space_image_set_mask(struct bContext *C, struct SpaceImage *sima, struct Mask *mask) RET_NONE
-
-void ED_area_tag_redraw_regiontype(struct ScrArea *sa, int regiontype) RET_NONE
-void ED_render_engine_changed(struct Main *bmain) RET_NONE
-
-void ED_file_read_bookmarks(void) RET_NONE
-void ED_file_change_dir(struct bContext *C) RET_NONE
-void ED_preview_kill_jobs(struct wmWindowManager *wm, struct Main *bmain) RET_NONE
-struct FSMenu *ED_fsmenu_get(void) RET_NULL
-struct FSMenuEntry *ED_fsmenu_get_category(struct FSMenu *fsmenu, FSMenuCategory category) RET_NULL
-int ED_fsmenu_get_nentries(struct FSMenu *fsmenu, FSMenuCategory category) RET_ZERO
-struct FSMenuEntry *ED_fsmenu_get_entry(struct FSMenu *fsmenu, FSMenuCategory category, int index) RET_NULL
-char *ED_fsmenu_entry_get_path(struct FSMenuEntry *fsentry) RET_NULL
-void ED_fsmenu_entry_set_path(struct FSMenuEntry *fsentry, const char *name) RET_NONE
-char *ED_fsmenu_entry_get_name(struct FSMenuEntry *fsentry) RET_NULL
-void ED_fsmenu_entry_set_name(struct FSMenuEntry *fsentry, const char *name) RET_NONE
-
-struct PTCacheEdit *PE_get_current(struct Main *bmain, struct Scene *scene, struct Object *ob) RET_NULL
-void PE_current_changed(struct Main *bmain, struct Scene *scene, struct Object *ob) RET_NONE
-
-/* rna keymap */
-struct wmKeyMap *WM_keymap_active(struct wmWindowManager *wm, struct wmKeyMap *keymap) RET_NULL
-struct wmKeyMap *WM_keymap_ensure(struct wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid) RET_NULL
-struct wmKeyMapItem *WM_keymap_add_item(struct wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier) RET_NULL
-struct wmKeyMap *WM_keymap_list_find(ListBase *lb, const char *idname, int spaceid, int regionid) RET_NULL
-struct wmKeyConfig *WM_keyconfig_new(struct wmWindowManager *wm, const char *idname) RET_NULL
-struct wmKeyConfig *WM_keyconfig_new_user(struct wmWindowManager *wm, const char *idname) RET_NULL
-bool WM_keyconfig_remove(struct wmWindowManager *wm, struct wmKeyConfig *keyconf) RET_ZERO
-bool WM_keymap_remove(struct wmKeyConfig *keyconfig, struct wmKeyMap *keymap) RET_ZERO
-void WM_keyconfig_set_active(struct wmWindowManager *wm, const char *idname) RET_NONE
-bool WM_keymap_remove_item(struct wmKeyMap *keymap, struct wmKeyMapItem *kmi) RET_ZERO
-void WM_keymap_restore_to_default(struct wmKeyMap *keymap, struct bContext *C) RET_NONE
-void WM_keymap_restore_item_to_default(struct bContext *C, struct wmKeyMap *keymap, struct wmKeyMapItem *kmi) RET_NONE
-void WM_keymap_properties_reset(struct wmKeyMapItem *kmi, struct IDProperty *properties) RET_NONE
-void WM_keyconfig_update_tag(struct wmKeyMap *keymap, struct wmKeyMapItem *kmi) RET_NONE
-bool WM_keymap_item_compare(struct wmKeyMapItem *k1, struct wmKeyMapItem *k2) RET_ZERO
-int WM_keymap_map_type_get(struct wmKeyMapItem *kmi) RET_ZERO
-
-
-/* rna editors */
-
-struct FCurve *verify_fcurve(struct bAction *act, const char group[], struct PointerRNA *ptr, const char rna_path[], const int array_index, short add) RET_NULL
-int insert_vert_fcurve(struct FCurve *fcu, float x, float y, eBezTriple_KeyframeType keytype, eInsertKeyFlags flag) RET_ZERO
-void delete_fcurve_key(struct FCurve *fcu, int index, bool do_recalc) RET_NONE
-struct KeyingSetInfo *ANIM_keyingset_info_find_name (const char name[]) RET_NULL
-struct KeyingSet *ANIM_scene_get_active_keyingset (struct Scene *scene) RET_NULL
-int ANIM_scene_get_keyingset_index(struct Scene *scene, struct KeyingSet *ks) RET_ZERO
-void ANIM_id_update(struct Scene *scene, struct ID *id) RET_NONE
-struct ListBase builtin_keyingsets;
-void ANIM_keyingset_info_register(struct KeyingSetInfo *ksi) RET_NONE
-void ANIM_keyingset_info_unregister(struct Main *bmain, KeyingSetInfo *ksi) RET_NONE
-short ANIM_validate_keyingset(struct bContext *C, struct ListBase *dsources, struct KeyingSet *ks) RET_ZERO
-int ANIM_add_driver(struct ReportList *reports, struct ID *id, const char rna_path[], int array_index, short flag, int type) RET_ZERO
-bool ANIM_remove_driver(struct ReportList *reports, struct ID *id, const char rna_path[], int array_index, short flag) RET_ZERO
-void ED_space_image_release_buffer(struct SpaceImage *sima, struct ImBuf *ibuf, void *lock) RET_NONE
-struct ImBuf *ED_space_image_acquire_buffer(struct SpaceImage *sima, void **r_lock) RET_NULL
-void ED_space_image_get_zoom(struct SpaceImage *sima, struct ARegion *ar, float *zoomx, float *zoomy) RET_NONE
-const char *ED_info_stats_string(struct Scene *scene) RET_NULL
-void ED_area_tag_redraw(struct ScrArea *sa) RET_NONE
-void ED_area_tag_refresh(struct ScrArea *sa) RET_NONE
-void ED_area_newspace(struct bContext *C, struct ScrArea *sa, int type, const bool skip_ar_exit) RET_NONE
-void ED_region_tag_redraw(struct ARegion *ar) RET_NONE
-void WM_event_add_fileselect(struct bContext *C, struct wmOperator *op) RET_NONE
-void WM_cursor_wait(bool val) RET_NONE
-void ED_node_texture_default(const struct bContext *C, struct Tex *tex) RET_NONE
-void ED_node_tag_update_id(struct ID *id) RET_NONE
-void ED_node_tag_update_nodetree(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node) RET_NONE
-void ED_node_tree_update(const struct bContext *C) RET_NONE
-void ED_node_set_tree_type(struct SpaceNode *snode, struct bNodeTreeType *typeinfo) RET_NONE
-void ED_init_custom_node_type(struct bNodeType *ntype) RET_NONE
-void ED_init_custom_node_socket_type(struct bNodeSocketType *stype) RET_NONE
-void ED_init_standard_node_socket_type(struct bNodeSocketType *stype) RET_NONE
-void ED_init_node_socket_type_virtual(struct bNodeSocketType *stype) RET_NONE
-int ED_node_tree_path_length(struct SpaceNode *snode) RET_ZERO
-void ED_node_tree_path_get(struct SpaceNode *snode, char *value) RET_NONE
-void ED_node_tree_path_get_fixedbuf(struct SpaceNode *snode, char *value, int max_length) RET_NONE
-void ED_node_tree_start(struct SpaceNode *snode, struct bNodeTree *ntree, struct ID *id, struct ID *from) RET_NONE
-void ED_node_tree_push(struct SpaceNode *snode, struct bNodeTree *ntree, struct bNode *gnode) RET_NONE
-void ED_node_tree_pop(struct SpaceNode *snode) RET_NONE
-int ED_view3d_scene_layer_set(int lay, const bool *values, int *active) RET_ZERO
-void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar, bool do_clip) RET_NONE
-void ED_view3d_from_m4(float mat[4][4], float ofs[3], float quat[4], float *dist) RET_NONE
-struct BGpic *ED_view3d_background_image_new(struct View3D *v3d) RET_NULL
-void ED_view3d_background_image_remove(struct View3D *v3d, struct BGpic *bgpic) RET_NONE
-void ED_view3d_background_image_clear(struct View3D *v3d) RET_NONE
-void ED_view3d_update_viewmat(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, float viewmat[4][4], float winmat[4][4], const struct rcti *rect) RET_NONE
-float ED_view3d_grid_scale(struct Scene *scene, struct View3D *v3d, const char **grid_unit) RET_ZERO
-void ED_view3d_shade_update(struct Main *bmain, struct View3D *v3d, struct ScrArea *sa) RET_NONE
-void ED_node_shader_default(const struct bContext *C, struct ID *id) RET_NONE
-void ED_screen_animation_timer_update(struct bScreen *screen, int redraws, int refresh) RET_NONE
-struct bScreen *ED_screen_animation_playing(const struct wmWindowManager *wm) RET_NULL
-void ED_base_object_select(struct Base *base, short mode) RET_NONE
-bool ED_object_modifier_remove(struct ReportList *reports, struct Main *bmain, struct Object *ob, struct ModifierData *md) RET_ZERO
-struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, const char *name, int type) RET_ZERO
-void ED_object_modifier_clear(struct Main *bmain, struct Object *ob) RET_NONE
-bool ED_object_editmode_enter(struct bContext *C, int flag) RET_ZERO
-bool ED_object_editmode_exit(struct bContext *C, int flag) RET_ZERO
-bool ED_object_editmode_load(struct Main *bmain, struct Object *obedit) RET_ZERO
-void ED_object_check_force_modifiers(struct Main *bmain, struct Scene *scene, struct Object *object) RET_NONE
-bool uiLayoutGetActive(struct uiLayout *layout) RET_ZERO
-int uiLayoutGetOperatorContext(struct uiLayout *layout) RET_ZERO
-int uiLayoutGetAlignment(struct uiLayout *layout) RET_ZERO
-bool uiLayoutGetEnabled(struct uiLayout *layout) RET_ZERO
-float uiLayoutGetScaleX(struct uiLayout *layout) RET_ZERO
-float uiLayoutGetScaleY(struct uiLayout *layout) RET_ZERO
-void uiLayoutSetActive(struct uiLayout *layout, bool active) RET_NONE
-void uiLayoutSetOperatorContext(struct uiLayout *layout, int opcontext) RET_NONE
-void uiLayoutSetEnabled(uiLayout *layout, bool enabled) RET_NONE
-void uiLayoutSetAlignment(uiLayout *layout, char alignment) RET_NONE
-void uiLayoutSetScaleX(struct uiLayout *layout, float scale) RET_NONE
-void uiLayoutSetScaleY(struct uiLayout *layout, float scale) RET_NONE
-void uiTemplateIconView(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname, bool show_labels, float icon_scale) RET_NONE
-void ED_base_object_free_and_unlink(struct Main *bmain, struct Scene *scene, struct Base *base) RET_NONE
-void ED_mesh_update(struct Mesh *mesh, struct bContext *C, bool calc_edges, bool calc_tessface) RET_NONE
-void ED_mesh_vertices_add(struct Mesh *mesh, struct ReportList *reports, int count) RET_NONE
-void ED_mesh_edges_add(struct Mesh *mesh, struct ReportList *reports, int count) RET_NONE
-void ED_mesh_tessfaces_add(struct Mesh *mesh, struct ReportList *reports, int count) RET_NONE
-void ED_mesh_loops_add(struct Mesh *mesh, struct ReportList *reports, int count) RET_NONE
-void ED_mesh_polys_add(struct Mesh *mesh, struct ReportList *reports, int count) RET_NONE
-void ED_mesh_vertices_remove(struct Mesh *mesh, struct ReportList *reports, int count) RET_NONE
-void ED_mesh_edges_remove(struct Mesh *mesh, struct ReportList *reports, int count) RET_NONE
-void ED_mesh_faces_remove(struct Mesh *mesh, struct ReportList *reports, int count) RET_NONE
-int ED_mesh_color_add(struct Mesh *me, const char *name, const bool active_set) RET_MINUSONE
-int ED_mesh_uv_texture_add(struct Mesh *me, const char *name, const bool active_set) RET_MINUSONE
-bool ED_mesh_color_remove_named(struct Mesh *me, const char *name) RET_ZERO
-bool ED_mesh_uv_texture_remove_named(struct Mesh *me, const char *name) RET_ZERO
-void ED_object_constraint_dependency_update(struct Main *bmain, struct Object *ob) RET_NONE
-void ED_object_constraint_dependency_tag_update(struct Main *bmain, struct Object *ob, struct bConstraint *con) RET_NONE
-void ED_object_constraint_update(struct Main *bmain, struct Object *ob) RET_NONE
-void ED_object_constraint_tag_update(struct Main *bmain, struct Object *ob, struct bConstraint *con) RET_NONE
-void ED_vgroup_vert_add(struct Object *ob, struct bDeformGroup *dg, int vertnum, float weight, int assignmode) RET_NONE
-void ED_vgroup_vert_remove(struct Object *ob, struct bDeformGroup *dg, int vertnum) RET_NONE
-float ED_vgroup_vert_weight(struct Object *ob, struct bDeformGroup *dg, int vertnum) RET_ZERO
-int ED_mesh_mirror_topo_table(struct Object *ob, struct DerivedMesh *dm, char mode) RET_ZERO
-int ED_mesh_mirror_spatial_table(struct Object *ob, struct BMEditMesh *em, struct DerivedMesh *dm, const float co[3], char mode) RET_ZERO
-
-float ED_armature_ebone_roll_to_vector(const EditBone *bone, const float new_up_axis[3], const bool axis_only) RET_ZERO
-void ED_space_image_get_size(struct SpaceImage *sima, int *width, int *height) RET_NONE
-bool ED_space_image_check_show_maskedit(struct Scene *scene, struct SpaceImage *sima) RET_ZERO
-
-bool ED_texture_context_check_world(const struct bContext *C) RET_ZERO
-bool ED_texture_context_check_material(const struct bContext *C) RET_ZERO
-bool ED_texture_context_check_lamp(const struct bContext *C) RET_ZERO
-bool ED_texture_context_check_particles(const struct bContext *C) RET_ZERO
-bool ED_texture_context_check_others(const struct bContext *C) RET_ZERO
-
-bool ED_text_region_location_from_cursor(SpaceText *st, ARegion *ar, const int cursor_co[2], int r_pixel_co[2]) RET_ZERO
-
-SnapObjectContext *ED_transform_snap_object_context_create(
- struct Main *bmain, struct Scene *scene, int flag) RET_NULL
-SnapObjectContext *ED_transform_snap_object_context_create_view3d(
- struct Main *bmain, struct Scene *scene, int flag,
- const struct ARegion *ar, const struct View3D *v3d) RET_NULL
-void ED_transform_snap_object_context_destroy(SnapObjectContext *sctx) RET_NONE
-bool ED_transform_snap_object_project_ray_ex(
- struct SnapObjectContext *sctx,
- const struct SnapObjectParams *params,
- const float ray_start[3], const float ray_normal[3], float *ray_depth,
- /* return args */
- float r_loc[3], float r_no[3], int *r_index,
- struct Object **r_ob, float r_obmat[4][4]) RET_ZERO
-
-void ED_curve_editnurb_load(struct Main *bmain, struct Object *obedit) RET_NONE
-void ED_curve_editnurb_make(struct Object *obedit) RET_NONE
-
-void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon) RET_NONE
-
-void uiItemFullO(uiLayout *layout, const char *idname, const char *name, int icon, struct IDProperty *properties, int context, int flag, struct PointerRNA *r_opptr) RET_NONE
-void uiItemFullO_ptr(struct uiLayout *layout, struct wmOperatorType *ot, const char *name, int icon, struct IDProperty *properties, int context, int flag, struct PointerRNA *r_opptr) RET_NONE
-void uiItemFullOMenuHold_ptr( uiLayout *layout, struct wmOperatorType *ot, const char *name, int icon, struct IDProperty *properties, int context, int flag, const char *menu_id, /* extra menu arg. */ PointerRNA *r_opptr) RET_NONE
-struct uiLayout *uiLayoutRow(uiLayout *layout, bool align) RET_NULL
-struct uiLayout *uiLayoutColumn(uiLayout *layout, bool align) RET_NULL
-struct uiLayout *uiLayoutColumnFlow(uiLayout *layout, int number, bool align) RET_NULL
-struct uiLayout *uiLayoutBox(struct uiLayout *layout) RET_NULL
-struct uiLayout *uiLayoutSplit(uiLayout *layout, float percentage, bool align) RET_NULL
-bool uiLayoutGetRedAlert(struct uiLayout *layout) RET_ZERO
-void uiLayoutSetRedAlert(uiLayout *layout, bool redalert) RET_NONE
-void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname) RET_NONE
-void uiItemMenuEnumR_prop(uiLayout *layout, struct PointerRNA *ptr, PropertyRNA *prop, const char *name, int icon) RET_NONE
-void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *name, int icon) RET_NONE
-void uiItemEnumR_string_prop(uiLayout *layout, struct PointerRNA *ptr, PropertyRNA *prop, const char *value, const char *name, int icon) RET_NONE
-void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *value, const char *name, int icon) RET_NONE
-void uiItemPointerR_prop(uiLayout *layout, struct PointerRNA *ptr, PropertyRNA *prop, struct PointerRNA *searchptr, PropertyRNA *searchprop, const char *name, int icon) RET_NONE
-void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon) RET_NONE
-void uiItemsEnumO(uiLayout *layout, const char *opname, const char *propname) RET_NONE
-void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value) RET_NONE
-void uiItemMenuEnumO(uiLayout *layout, struct bContext *C, const char *opname, const char *propname, const char *name, int icon) RET_NONE
-void uiItemMenuEnumO_ptr(uiLayout *layout, struct bContext *C, struct wmOperatorType *ot, const char *propname, const char *name, int icon) RET_NONE
-void uiItemBooleanO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value) RET_NONE
-void uiItemIntO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value) RET_NONE
-void uiItemFloatO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, float value) RET_NONE
-void uiItemStringO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value) RET_NONE
-void uiItemL(struct uiLayout *layout, const char *name, int icon) RET_NONE
-void uiItemM(uiLayout *layout, const char *menuname, const char *name, int icon) RET_NONE
-void uiItemS(struct uiLayout *layout) RET_NONE
-void uiItemFullR(uiLayout *layout, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int value, int flag, const char *name, int icon) RET_NONE
-void uiLayoutSetContextPointer(uiLayout *layout, const char *name, struct PointerRNA *ptr) RET_NONE
-void UI_reinit_font(void) RET_NONE
-int UI_rnaptr_icon_get(struct bContext *C, struct PointerRNA *ptr, int rnaicon, const bool big) RET_ZERO
-struct bTheme *UI_GetTheme(void) RET_NULL
-
-/* rna template */
-void uiTemplateAnyID(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *proptypename, const char *text) RET_NONE
-void uiTemplatePathBuilder(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *root_ptr, const char *text) RET_NONE
-void uiTemplateHeader(struct uiLayout *layout, struct bContext *C) RET_NONE
-void uiTemplateID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop, int filter) RET_NONE
-struct uiLayout *uiTemplateModifier(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr) RET_NULL
-struct uiLayout *uiTemplateConstraint(struct uiLayout *layout, struct PointerRNA *ptr) RET_NULL
-void uiTemplatePreview(struct uiLayout *layout, struct bContext *C, struct ID *id, bool show_buttons, struct ID *parent,
- struct MTex *slot, const char *preview_id) RET_NONE
-void uiTemplateIDPreview(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop, int rows, int cols, int filter) RET_NONE
-void uiTemplateCurveMapping(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int type, bool levels, bool brush, bool neg_slope) RET_NONE
-void uiTemplateColorRamp(uiLayout *layout, struct PointerRNA *ptr, const char *propname, bool expand) RET_NONE
-void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, const char *propname, PointerRNA *used_ptr, const char *used_propname, int active_layer) RET_NONE
-void uiTemplateImageLayers(struct uiLayout *layout, struct bContext *C, struct Image *ima, struct ImageUser *iuser) RET_NONE
-void uiTemplateList(struct uiLayout *layout, struct bContext *C, const char *listtype_name, const char *list_id,
- PointerRNA *dataptr, const char *propname, PointerRNA *active_dataptr, const char *active_propname,
- const char *item_dyntip_propname, int rows, int maxrows, int layout_type, int columns) RET_NONE
-void uiTemplateRunningJobs(struct uiLayout *layout, struct bContext *C) RET_NONE
-void uiTemplateOperatorSearch(struct uiLayout *layout) RET_NONE
-void uiTemplateHeader3D(struct uiLayout *layout, struct bContext *C) RET_NONE
-void uiTemplateEditModeSelection(struct uiLayout *layout, struct bContext *C) RET_NONE
-void uiTemplateImage(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, struct PointerRNA *userptr, bool compact, bool multiview) RET_NONE
-void uiTemplateColorPicker(uiLayout *layout, struct PointerRNA *ptr, const char *propname, bool value_slider, bool lock, bool lock_luminosity, bool cubic) RET_NONE
-void uiTemplateHistogram(uiLayout *layout, struct PointerRNA *ptr, const char *propname) RET_NONE
-void uiTemplateReportsBanner(uiLayout *layout, struct bContext *C) RET_NONE
-void uiTemplateWaveform(uiLayout *layout, struct PointerRNA *ptr, const char *propname) RET_NONE
-void uiTemplateVectorscope(uiLayout *layout, struct PointerRNA *ptr, const char *propname) RET_NONE
-void uiTemplateNodeLink(struct uiLayout *layout, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input) RET_NONE
-void uiTemplateNodeView(struct uiLayout *layout, struct bContext *C, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input) RET_NONE
-void uiTemplateTextureUser(struct uiLayout *layout, struct bContext *C) RET_NONE
-void uiTemplateTextureShow(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop) RET_NONE
-void uiTemplateKeymapItemProperties(struct uiLayout *layout, struct PointerRNA *ptr) RET_NONE
-void uiTemplateMovieClip(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, bool compact) RET_NONE
-void uiTemplateMovieclipInformation(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *userptr) RET_NONE
-void uiTemplateTrack(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname) RET_NONE
-void uiTemplateMarker(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname, PointerRNA *userptr, PointerRNA *trackptr, bool compact) RET_NONE
-void uiTemplateImageSettings(uiLayout *layout, struct PointerRNA *imfptr, bool color_management) RET_NONE
-void uiTemplateColorspaceSettings(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname) RET_NONE
-void uiTemplateColormanagedViewSettings(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname) RET_NONE
-void uiTemplateComponentMenu(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *name) RET_NONE
-void uiTemplateNodeSocket(struct uiLayout *layout, struct bContext *C, float *color) RET_NONE
-void uiTemplatePalette(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname, bool color) RET_NONE
-void uiTemplateImageStereo3d(struct uiLayout *layout, struct PointerRNA *stereo3d_format_ptr) RET_NONE
-void uiTemplateCacheFile(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname) RET_NONE
-
-/* rna render */
-struct RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h, const char *layername, const char *viewname) RET_NULL
-struct RenderResult *RE_AcquireResultRead(struct Render *re) RET_NULL
-struct RenderResult *RE_AcquireResultWrite(struct Render *re) RET_NULL
-struct RenderResult *RE_engine_get_result(struct RenderEngine *re) RET_NULL
-struct RenderStats *RE_GetStats(struct Render *re) RET_NULL
-struct RenderData *RE_engine_get_render_data(struct Render *re) RET_NULL
-void RE_engine_update_result(struct RenderEngine *engine, struct RenderResult *result) RET_NONE
-void RE_engine_update_progress(struct RenderEngine *engine, float progress) RET_NONE
-void RE_engine_set_error_message(RenderEngine *engine, const char *msg) RET_NONE
-void RE_engine_add_pass(RenderEngine *engine, const char *name, int channels, const char *chan_id, const char *layername) RET_NONE
-void RE_engine_end_result(RenderEngine *engine, struct RenderResult *result, bool cancel, bool highlight, bool merge_results) RET_NONE
-void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info) RET_NONE
-void RE_layer_load_from_file(struct RenderLayer *layer, struct ReportList *reports, const char *filename, int x, int y) RET_NONE
-void RE_result_load_from_file(struct RenderResult *result, struct ReportList *reports, const char *filename) RET_NONE
-void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr, const int view_id) RET_NONE
-void RE_ReleaseResult(struct Render *re) RET_NONE
-void RE_ReleaseResultImage(struct Render *re) RET_NONE
-bool RE_engine_test_break(struct RenderEngine *engine) RET_ZERO
-void RE_engines_init() RET_NONE
-void RE_engines_exit() RET_NONE
-void RE_engine_report(struct RenderEngine *engine, int type, const char *msg) RET_NONE
-ListBase R_engines = {NULL, NULL};
-void RE_engine_free(struct RenderEngine *engine) RET_NONE
-struct RenderEngineType *RE_engines_find(const char *idname) RET_NULL
-void RE_engine_update_memory_stats(struct RenderEngine *engine, float mem_used, float mem_peak) RET_NONE
-struct RenderEngine *RE_engine_create(struct RenderEngineType *type) RET_NULL
-void RE_engine_frame_set(struct RenderEngine *engine, int frame, float subframe) RET_NONE
-void RE_FreePersistentData(void) RET_NONE
-void RE_point_density_cache(struct Scene *scene, struct PointDensity *pd, const bool use_render_params) RET_NONE
-void RE_point_density_minmax(struct Scene *scene, struct PointDensity *pd, const bool use_render_params, float r_min[3], float r_max[3]) RET_NONE
-void RE_point_density_sample(struct Scene *scene, struct PointDensity *pd, int resolution, const bool use_render_params, float *values) RET_NONE
-void RE_point_density_free(struct PointDensity *pd) RET_NONE
-void RE_instance_get_particle_info(struct ObjectInstanceRen *obi, float *index, float *random, float *age, float *lifetime, float co[3], float *size, float vel[3], float angvel[3]) RET_NONE
-void RE_FreeAllPersistentData(void) RET_NONE
-float RE_fresnel_dielectric(float incoming[3], float normal[3], float eta) RET_ZERO
-void RE_engine_register_pass(struct RenderEngine *engine, struct Scene *scene, struct SceneRenderLayer *srl, const char *name, int channels, const char *chanid, int type) RET_NONE
-
-/* python */
-struct wmOperatorType *WM_operatortype_find(const char *idname, bool quiet) RET_NULL
-void WM_operatortype_iter(struct GHashIterator *ghi) RET_NONE
-struct wmOperatorTypeMacro *WM_operatortype_macro_define(struct wmOperatorType *ot, const char *idname) RET_NULL
-int WM_operator_call_py(struct bContext *C, struct wmOperatorType *ot, short context, struct PointerRNA *properties, struct ReportList *reports, const bool is_undo) RET_ZERO
-void WM_operatortype_remove_ptr(struct wmOperatorType *ot) RET_NONE
-bool WM_operatortype_remove(const char *idname) RET_ZERO
-bool WM_operator_poll(struct bContext *C, struct wmOperatorType *ot) RET_ZERO
-bool WM_operator_poll_context(struct bContext *C, struct wmOperatorType *ot, short context) RET_ZERO
-int WM_operator_props_popup(struct bContext *C, struct wmOperator *op, const struct wmEvent *event) RET_ZERO
-void WM_operator_properties_free(struct PointerRNA *ptr) RET_NONE
-void WM_operator_properties_create(struct PointerRNA *ptr, const char *opstring) RET_NONE
-void WM_operator_properties_create_ptr(struct PointerRNA *ptr, struct wmOperatorType *ot) RET_NONE
-void WM_operator_properties_sanitize(struct PointerRNA *ptr, const bool no_context) RET_NONE
-void WM_operatortype_append_ptr(void (*opfunc)(struct wmOperatorType *, void *), void *userdata) RET_NONE
-void WM_operatortype_append_macro_ptr(void (*opfunc)(struct wmOperatorType *, void *), void *userdata) RET_NONE
-void WM_operator_bl_idname(char *to, const char *from) RET_NONE
-void WM_operator_py_idname(char *to, const char *from) RET_NONE
-bool WM_operator_py_idname_ok_or_report(struct ReportList *reports, const char *classname, const char *idname) RET_ZERO
-int WM_operator_ui_popup(struct bContext *C, struct wmOperator *op, int width, int height) RET_ZERO
-void update_autoflags_fcurve(struct FCurve *fcu, struct bContext *C, struct ReportList *reports, struct PointerRNA *ptr) RET_NONE
-short insert_keyframe(struct Main *bmain, struct ReportList *reports, struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, eBezTriple_KeyframeType keytype, eInsertKeyFlags flag) RET_ZERO
-short delete_keyframe(struct ReportList *reports, struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, eInsertKeyFlags flag) RET_ZERO
-struct bAction *verify_adt_action(struct Main *bmain, struct ID *id, short add) RET_NULL
-char *WM_operator_pystring_ex(struct bContext *C, struct wmOperator *op, const bool all_args, const bool macro_args, struct wmOperatorType *ot, struct PointerRNA *opptr) RET_NULL
-char *WM_operator_pystring(struct bContext *C, struct wmOperator *op, const bool all_args, const bool macro_args) RET_NULL
-struct wmKeyMapItem *WM_modalkeymap_add_item(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value) RET_NULL
-struct wmKeyMapItem *WM_modalkeymap_add_item_str(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, const char *value) RET_NULL
-struct wmKeyMap *WM_modalkeymap_add(struct wmKeyConfig *keyconf, const char *idname, const struct EnumPropertyItem *items) RET_NULL
-struct uiPopupMenu *UI_popup_menu_begin(struct bContext *C, const char *title, int icon) RET_NULL
-void UI_popup_menu_end(struct bContext *C, struct uiPopupMenu *head) RET_NONE
-struct uiLayout *UI_popup_menu_layout(struct uiPopupMenu *head) RET_NULL
-struct uiLayout *UI_pie_menu_layout(struct uiPieMenu *pie) RET_NULL
-int UI_pie_menu_invoke(struct bContext *C, const char *idname, const struct wmEvent *event) RET_ZERO
-struct uiPieMenu *UI_pie_menu_begin(struct bContext *C, const char *title, int icon, const struct wmEvent *event) RET_NULL
-void UI_pie_menu_end(struct bContext *C, uiPieMenu *pie) RET_NONE
-struct uiLayout *uiLayoutRadial(struct uiLayout *layout) RET_NULL
-int UI_pie_menu_invoke_from_operator_enum(struct bContext *C, const char *title, const char *opname,
- const char *propname, const struct wmEvent *event) RET_ZERO
-
-void ED_mesh_calc_tessface(struct Mesh *mesh, bool free_mpoly) RET_NONE
-
-/* bpy/python internal api */
-extern void BPY_RNA_operator_wrapper(struct wmOperatorType *ot, void *userdata);
-extern void BPY_RNA_operator_macro_wrapper(struct wmOperatorType *ot, void *userdata);
-void BPY_RNA_operator_wrapper(struct wmOperatorType *ot, void *userdata) RET_NONE
-void BPY_RNA_operator_macro_wrapper(struct wmOperatorType *ot, void *userdata) RET_NONE
-void BPY_text_free_code(struct Text *text) RET_NONE
-void BPY_id_release(struct ID *id) RET_NONE
-int BPY_context_member_get(struct bContext *C, const char *member, struct bContextDataResult *result) RET_ZERO
-void BPY_pyconstraint_target(struct bPythonConstraint *con, struct bConstraintTarget *ct) RET_NONE
-float BPY_driver_exec(PathResolvedRNA *anim_rna, struct ChannelDriver *driver, const float evaltime) RET_ZERO /* might need this one! */
-void BPY_DECREF(void *pyob_ptr) RET_NONE
-void BPY_DECREF_RNA_INVALIDATE(void *pyob_ptr) RET_NONE;
-void BPY_pyconstraint_exec(struct bPythonConstraint *con, struct bConstraintOb *cob, struct ListBase *targets) RET_NONE
-bool pyrna_id_FromPyObject(struct PyObject *obj, struct ID **id) RET_ZERO
-struct PyObject *pyrna_id_CreatePyObject(struct ID *id) RET_NULL
-bool pyrna_id_CheckPyObject(struct PyObject *obj) RET_ZERO
-void BPY_context_update(struct bContext *C) RET_NONE
-const char *BPY_app_translations_py_pgettext(const char *msgctxt, const char *msgid) RET_ARG(msgid)
-
-/* intern/dualcon */
-
-void *dualcon(const DualConInput *input_mesh,
- /* callbacks for output */
- DualConAllocOutput alloc_output,
- DualConAddVert add_vert,
- DualConAddQuad add_quad,
-
- DualConFlags flags,
- DualConMode mode,
- float threshold,
- float hermite_num,
- float scale,
- int depth) RET_ZERO
-
-/* compositor */
-void COM_execute(RenderData *rd, Scene *scene, bNodeTree *editingtree, int rendering,
- const ColorManagedViewSettings *viewSettings, const ColorManagedDisplaySettings *displaySettings,
- const char *viewName) RET_NONE
-
-/*multiview*/
-bool RE_RenderResult_is_stereo(RenderResult *res) RET_ZERO
-void uiTemplateImageViews(uiLayout *layout, struct PointerRNA *imfptr) RET_NONE
-
-#endif // WITH_GAMEENGINE
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index 18a8ebeac37..7d382b0f581 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -747,6 +747,19 @@ elseif(WIN32)
DESTINATION ${BLENDER_VERSION}/python/bin
CONFIGURATIONS Debug
)
+ if(WINDOWS_PYTHON_DEBUG)
+ install(
+ FILES ${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}.pdb
+ DESTINATION "."
+ CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel
+ )
+
+ install(
+ FILES ${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}_d.pdb
+ DESTINATION "."
+ CONFIGURATIONS Debug
+ )
+ endif()
endif()
unset(_PYTHON_VERSION_NO_DOTS)
@@ -1006,4 +1019,9 @@ if(WIN32 AND NOT WITH_PYTHON_MODULE)
COMPONENT Blender
DESTINATION "."
)
+ set_target_properties(
+ blender
+ PROPERTIES
+ VS_USER_PROPS "blender.Cpp.user.props"
+ )
endif()
diff --git a/source/creator/creator.c b/source/creator/creator.c
index 914211afd56..3cd3e2986f9 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -525,7 +525,7 @@ int main(
WM_main(C);
return 0;
-} /* end of int main(argc, argv) */
+} /* end of int main(argc, argv) */
#ifdef WITH_PYTHON_MODULE
void main_python_exit(void)
diff --git a/source/creator/creator_args.c b/source/creator/creator_args.c
index 5e9cec660e1..12d8cd1d5b8 100644
--- a/source/creator/creator_args.c
+++ b/source/creator/creator_args.c
@@ -53,12 +53,13 @@
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_image.h"
#include "BKE_library.h"
+#include "BKE_library_override.h"
#include "BKE_main.h"
-#include "BKE_scene.h"
#include "BKE_report.h"
+#include "BKE_scene.h"
#include "BKE_sound.h"
-#include "BKE_image.h"
#ifdef WITH_FFMPEG
#include "IMB_imbuf.h"
@@ -504,6 +505,7 @@ static int arg_handle_print_help(int UNUSED(argc), const char **UNUSED(argv), vo
BLI_argsPrintArgDoc(ba, "--window-geometry");
BLI_argsPrintArgDoc(ba, "--start-console");
BLI_argsPrintArgDoc(ba, "--no-native-pixels");
+ BLI_argsPrintArgDoc(ba, "--no-window-focus");
printf("\n");
printf("Python Options:\n");
@@ -567,6 +569,7 @@ static int arg_handle_print_help(int UNUSED(argc), const char **UNUSED(argv), vo
printf("Misc Options:\n");
BLI_argsPrintArgDoc(ba, "--app-template");
BLI_argsPrintArgDoc(ba, "--factory-startup");
+ BLI_argsPrintArgDoc(ba, "--enable-static-override");
printf("\n");
BLI_argsPrintArgDoc(ba, "--env-system-datafiles");
BLI_argsPrintArgDoc(ba, "--env-system-scripts");
@@ -883,7 +886,7 @@ static const char arg_handle_debug_mode_generic_set_doc_gpumem[] =
static int arg_handle_debug_mode_generic_set(int UNUSED(argc), const char **UNUSED(argv), void *data)
{
- G.debug |= GET_INT_FROM_POINTER(data);
+ G.debug |= POINTER_AS_INT(data);
return 0;
}
@@ -1000,6 +1003,15 @@ static int arg_handle_factory_startup_set(int UNUSED(argc), const char **UNUSED(
return 0;
}
+static const char arg_handle_enable_static_override_doc[] =
+"\n\tEnable Static Override features in the UI."
+;
+static int arg_handle_enable_static_override(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
+{
+ BKE_override_static_enable(true);
+ return 0;
+}
+
static const char arg_handle_env_system_set_doc_datafiles[] =
"\n\tSet the "STRINGIFY_ARG (BLENDER_SYSTEM_DATAFILES)" environment variable.";
static const char arg_handle_env_system_set_doc_scripts[] =
@@ -1115,6 +1127,15 @@ static int arg_handle_without_borders(int UNUSED(argc), const char **UNUSED(argv
return 0;
}
+static const char arg_handle_no_window_focus_doc[] =
+"\n\tOpen behind other windows and without taking focus."
+;
+static int arg_handle_no_window_focus(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
+{
+ WM_init_window_focus_set(false);
+ return 0;
+}
+
extern bool wm_start_with_console; /* wm_init_exit.c */
static const char arg_handle_start_with_console_doc[] =
@@ -1409,7 +1430,7 @@ static int arg_handle_render_frame(int argc, const char **argv, void *data)
}
for (int frame = frame_range_arr[i][0]; frame <= frame_range_arr[i][1]; frame++) {
- RE_BlenderAnim(re, bmain, scene, NULL, scene->lay, frame, frame, scene->r.frame_step);
+ RE_BlenderAnim(re, bmain, scene, NULL, NULL, frame, frame, scene->r.frame_step);
}
}
RE_SetReports(re, NULL);
@@ -1443,7 +1464,7 @@ static int arg_handle_render_animation(int UNUSED(argc), const char **UNUSED(arg
BLI_threaded_malloc_begin();
BKE_reports_init(&reports, RPT_STORE);
RE_SetReports(re, &reports);
- RE_BlenderAnim(re, bmain, scene, NULL, scene->lay, scene->r.sfra, scene->r.efra, scene->r.frame_step);
+ RE_BlenderAnim(re, bmain, scene, NULL, NULL, scene->r.sfra, scene->r.efra, scene->r.frame_step);
RE_SetReports(re, NULL);
BKE_reports_clear(&reports);
BLI_threaded_malloc_end();
@@ -1663,7 +1684,7 @@ static int arg_handle_python_expr_run(int argc, const char **argv, void *data)
/* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */
if (argc > 1) {
bool ok;
- BPY_CTX_SETUP(ok = BPY_execute_string_ex(C, argv[1], false));
+ BPY_CTX_SETUP(ok = BPY_execute_string_ex(C, NULL, argv[1], false));
if (!ok && app_state.exit_code_on_error.python) {
printf("\nError: script failed, expr: '%s', exiting.\n", argv[1]);
exit(app_state.exit_code_on_error.python);
@@ -1689,7 +1710,7 @@ static int arg_handle_python_console_run(int UNUSED(argc), const char **argv, vo
#ifdef WITH_PYTHON
bContext *C = data;
- BPY_CTX_SETUP(BPY_execute_string(C, "__import__('code').interact()"));
+ BPY_CTX_SETUP(BPY_execute_string(C, (const char *[]){"code", NULL}, "code.interact()"));
return 0;
#else
@@ -1745,7 +1766,7 @@ static int arg_handle_addons_set(int argc, const char **argv, void *data)
BLI_snprintf(str, slen, script_str, argv[1]);
BLI_assert(strlen(str) + 1 == slen);
- BPY_CTX_SETUP(BPY_execute_string_ex(C, str, false));
+ BPY_CTX_SETUP(BPY_execute_string_ex(C, NULL, str, false));
free(str);
#else
UNUSED_VARS(argv, data);
@@ -1917,6 +1938,7 @@ void main_args_setup(bContext *C, bArgs *ba)
BLI_argsAdd(ba, 1, NULL, "--app-template", CB(arg_handle_app_template), NULL);
BLI_argsAdd(ba, 1, NULL, "--factory-startup", CB(arg_handle_factory_startup_set), NULL);
+ BLI_argsAdd(ba, 1, NULL, "--enable-static-override", CB(arg_handle_enable_static_override), NULL);
/* TODO, add user env vars? */
BLI_argsAdd(ba, 1, NULL, "--env-system-datafiles", CB_EX(arg_handle_env_system_set, datafiles), NULL);
@@ -1927,6 +1949,7 @@ void main_args_setup(bContext *C, bArgs *ba)
BLI_argsAdd(ba, 2, "-p", "--window-geometry", CB(arg_handle_window_geometry), NULL);
BLI_argsAdd(ba, 2, "-w", "--window-border", CB(arg_handle_with_borders), NULL);
BLI_argsAdd(ba, 2, "-W", "--window-fullscreen", CB(arg_handle_without_borders), NULL);
+ BLI_argsAdd(ba, 2, NULL, "--no-window-focus", CB(arg_handle_no_window_focus), NULL);
BLI_argsAdd(ba, 2, "-con", "--start-console", CB(arg_handle_start_with_console), NULL);
BLI_argsAdd(ba, 2, "-R", NULL, CB(arg_handle_register_extension), NULL);
BLI_argsAdd(ba, 2, "-r", NULL, CB_EX(arg_handle_register_extension, silent), ba);
diff --git a/source/tools b/source/tools
-Subproject 11656ebaf7f912cdb1b5eb39c5d0a3b5d492c1a
+Subproject 5162393c104d6d5f0314183a084875fff68f28b
diff --git a/tests/gtests/alembic/abc_export_test.cc b/tests/gtests/alembic/abc_export_test.cc
index c950084ef64..ac7760d1541 100644
--- a/tests/gtests/alembic/abc_export_test.cc
+++ b/tests/gtests/alembic/abc_export_test.cc
@@ -1,12 +1,12 @@
#include "testing/testing.h"
-// Keep first since utildefines defines AT which conflicts with fucking STL
+// Keep first since utildefines defines AT which conflicts with STL
#include "intern/abc_util.h"
#include "intern/abc_exporter.h"
extern "C" {
#include "BLI_utildefines.h"
-#include "BKE_library.h"
+#include "BKE_main.h"
#include "BLI_math.h"
#include "DNA_scene_types.h"
}
diff --git a/tests/gtests/alembic/abc_matrix_test.cc b/tests/gtests/alembic/abc_matrix_test.cc
index 08bce1ed50f..49fb662c934 100644
--- a/tests/gtests/alembic/abc_matrix_test.cc
+++ b/tests/gtests/alembic/abc_matrix_test.cc
@@ -1,6 +1,6 @@
#include "testing/testing.h"
-// Keep first since utildefines defines AT which conflicts with fucking STL
+// Keep first since utildefines defines AT which conflicts with STL
#include "intern/abc_util.h"
extern "C" {
diff --git a/tests/gtests/blenlib/BLI_expr_pylike_eval_test.cc b/tests/gtests/blenlib/BLI_expr_pylike_eval_test.cc
new file mode 100644
index 00000000000..51e5b02232b
--- /dev/null
+++ b/tests/gtests/blenlib/BLI_expr_pylike_eval_test.cc
@@ -0,0 +1,310 @@
+/* Apache License, Version 2.0 */
+
+#include "testing/testing.h"
+
+#include <string.h>
+
+extern "C" {
+#include "BLI_expr_pylike_eval.h"
+#include "BLI_math.h"
+};
+
+#define TRUE_VAL 1.0
+#define FALSE_VAL 0.0
+
+static void expr_pylike_parse_fail_test(const char *str)
+{
+ ExprPyLike_Parsed *expr = BLI_expr_pylike_parse(str, NULL, 0);
+
+ EXPECT_FALSE(BLI_expr_pylike_is_valid(expr));
+
+ BLI_expr_pylike_free(expr);
+}
+
+static void expr_pylike_const_test(const char *str, double value, bool force_const)
+{
+ ExprPyLike_Parsed *expr = BLI_expr_pylike_parse(str, NULL, 0);
+
+ if (force_const) {
+ EXPECT_TRUE(BLI_expr_pylike_is_constant(expr));
+ }
+ else {
+ EXPECT_TRUE(BLI_expr_pylike_is_valid(expr));
+ EXPECT_FALSE(BLI_expr_pylike_is_constant(expr));
+ }
+
+ double result;
+ eExprPyLike_EvalStatus status = BLI_expr_pylike_eval(expr, NULL, 0, &result);
+
+ EXPECT_EQ(status, EXPR_PYLIKE_SUCCESS);
+ EXPECT_EQ(result, value);
+
+ BLI_expr_pylike_free(expr);
+}
+
+static ExprPyLike_Parsed *parse_for_eval(const char *str, bool nonconst)
+{
+ const char *names[1] = {"x"};
+ ExprPyLike_Parsed *expr = BLI_expr_pylike_parse(str, names, ARRAY_SIZE(names));
+
+ EXPECT_TRUE(BLI_expr_pylike_is_valid(expr));
+
+ if (nonconst) {
+ EXPECT_FALSE(BLI_expr_pylike_is_constant(expr));
+ }
+
+ return expr;
+}
+
+static void verify_eval_result(ExprPyLike_Parsed *expr, double x, double value)
+{
+ double result;
+ eExprPyLike_EvalStatus status = BLI_expr_pylike_eval(expr, &x, 1, &result);
+
+ EXPECT_EQ(status, EXPR_PYLIKE_SUCCESS);
+ EXPECT_EQ(result, value);
+}
+
+static void expr_pylike_eval_test(const char *str, double x, double value)
+{
+ ExprPyLike_Parsed *expr = parse_for_eval(str, true);
+ verify_eval_result(expr, x, value);
+ BLI_expr_pylike_free(expr);
+}
+
+static void expr_pylike_error_test(const char *str, double x, eExprPyLike_EvalStatus error)
+{
+ ExprPyLike_Parsed *expr = parse_for_eval(str, false);
+
+ double result;
+ eExprPyLike_EvalStatus status = BLI_expr_pylike_eval(expr, &x, 1, &result);
+
+ EXPECT_EQ(status, error);
+
+ BLI_expr_pylike_free(expr);
+}
+
+#define TEST_PARSE_FAIL(name, str) \
+ TEST(expr_pylike, ParseFail_##name) { expr_pylike_parse_fail_test(str); }
+
+TEST_PARSE_FAIL(Empty, "")
+TEST_PARSE_FAIL(ConstHex, "0x0")
+TEST_PARSE_FAIL(ConstOctal, "01")
+TEST_PARSE_FAIL(Tail, "0 0")
+TEST_PARSE_FAIL(ConstFloatExp, "0.5e+")
+TEST_PARSE_FAIL(BadId, "Pi")
+TEST_PARSE_FAIL(BadArgCount0, "sqrt")
+TEST_PARSE_FAIL(BadArgCount1, "sqrt()")
+TEST_PARSE_FAIL(BadArgCount2, "sqrt(1,2)")
+TEST_PARSE_FAIL(BadArgCount3, "pi()")
+TEST_PARSE_FAIL(BadArgCount4, "max()")
+TEST_PARSE_FAIL(BadArgCount5, "min()")
+
+TEST_PARSE_FAIL(Truncated1, "(1+2")
+TEST_PARSE_FAIL(Truncated2, "1 if 2")
+TEST_PARSE_FAIL(Truncated3, "1 if 2 else")
+TEST_PARSE_FAIL(Truncated4, "1 < 2 <")
+TEST_PARSE_FAIL(Truncated5, "1 +")
+TEST_PARSE_FAIL(Truncated6, "1 *")
+TEST_PARSE_FAIL(Truncated7, "1 and")
+TEST_PARSE_FAIL(Truncated8, "1 or")
+TEST_PARSE_FAIL(Truncated9, "sqrt(1")
+TEST_PARSE_FAIL(Truncated10, "fmod(1,")
+
+/* Constant expression with working constant folding */
+#define TEST_CONST(name, str, value) \
+ TEST(expr_pylike, Const_##name) { expr_pylike_const_test(str, value, true); }
+
+/* Constant expression but constant folding is not supported */
+#define TEST_RESULT(name, str, value) \
+ TEST(expr_pylike, Result_##name) { expr_pylike_const_test(str, value, false); }
+
+/* Expression with an argument */
+#define TEST_EVAL(name, str, x, value) \
+ TEST(expr_pylike, Eval_##name) { expr_pylike_eval_test(str, x, value); }
+
+TEST_CONST(Zero, "0", 0.0)
+TEST_CONST(Zero2, "00", 0.0)
+TEST_CONST(One, "1", 1.0)
+TEST_CONST(OneF, "1.0", 1.0)
+TEST_CONST(OneF2, "1.", 1.0)
+TEST_CONST(OneE, "1e0", 1.0)
+TEST_CONST(TenE, "1.e+1", 10.0)
+TEST_CONST(Half, ".5", 0.5)
+
+TEST_CONST(Pi, "pi", M_PI)
+TEST_CONST(True, "True", TRUE_VAL)
+TEST_CONST(False, "False", FALSE_VAL)
+
+TEST_CONST(Sqrt, "sqrt(4)", 2.0)
+TEST_EVAL(Sqrt, "sqrt(x)", 4.0, 2.0)
+
+TEST_CONST(FMod, "fmod(3.5, 2)", 1.5)
+TEST_EVAL(FMod, "fmod(x, 2)", 3.5, 1.5)
+
+TEST_CONST(Pow, "pow(4, 0.5)", 2.0)
+TEST_EVAL(Pow, "pow(4, x)", 0.5, 2.0)
+
+TEST_RESULT(Min1, "min(3,1,2)", 1.0)
+TEST_RESULT(Max1, "max(3,1,2)", 3.0)
+TEST_RESULT(Min2, "min(1,2,3)", 1.0)
+TEST_RESULT(Max2, "max(1,2,3)", 3.0)
+TEST_RESULT(Min3, "min(2,3,1)", 1.0)
+TEST_RESULT(Max3, "max(2,3,1)", 3.0)
+
+TEST_CONST(UnaryPlus, "+1", 1.0)
+
+TEST_CONST(UnaryMinus, "-1", -1.0)
+TEST_EVAL(UnaryMinus, "-x", 1.0, -1.0)
+
+TEST_CONST(BinaryPlus, "1+2", 3.0)
+TEST_EVAL(BinaryPlus, "x+2", 1, 3.0)
+
+TEST_CONST(BinaryMinus, "1-2", -1.0)
+TEST_EVAL(BinaryMinus, "1-x", 2, -1.0)
+
+TEST_CONST(BinaryMul, "2*3", 6.0)
+TEST_EVAL(BinaryMul, "x*3", 2, 6.0)
+
+TEST_CONST(BinaryDiv, "3/2", 1.5)
+TEST_EVAL(BinaryDiv, "3/x", 2, 1.5)
+
+TEST_CONST(Arith1, "1 + -2 * 3", -5.0)
+TEST_CONST(Arith2, "(1 + -2) * 3", -3.0)
+TEST_CONST(Arith3, "-1 + 2 * 3", 5.0)
+TEST_CONST(Arith4, "3 * (-2 + 1)", -3.0)
+
+TEST_EVAL(Arith1, "1 + -x * 3", 2, -5.0)
+
+TEST_CONST(Eq1, "1 == 1.0", TRUE_VAL)
+TEST_CONST(Eq2, "1 == 2.0", FALSE_VAL)
+TEST_CONST(Eq3, "True == 1", TRUE_VAL)
+TEST_CONST(Eq4, "False == 0", TRUE_VAL)
+
+TEST_EVAL(Eq1, "1 == x", 1.0, TRUE_VAL)
+TEST_EVAL(Eq2, "1 == x", 2.0, FALSE_VAL)
+
+TEST_CONST(NEq1, "1 != 1.0", FALSE_VAL)
+TEST_CONST(NEq2, "1 != 2.0", TRUE_VAL)
+
+TEST_EVAL(NEq1, "1 != x", 1.0, FALSE_VAL)
+TEST_EVAL(NEq2, "1 != x", 2.0, TRUE_VAL)
+
+TEST_CONST(Lt1, "1 < 1", FALSE_VAL)
+TEST_CONST(Lt2, "1 < 2", TRUE_VAL)
+TEST_CONST(Lt3, "2 < 1", FALSE_VAL)
+
+TEST_CONST(Le1, "1 <= 1", TRUE_VAL)
+TEST_CONST(Le2, "1 <= 2", TRUE_VAL)
+TEST_CONST(Le3, "2 <= 1", FALSE_VAL)
+
+TEST_CONST(Gt1, "1 > 1", FALSE_VAL)
+TEST_CONST(Gt2, "1 > 2", FALSE_VAL)
+TEST_CONST(Gt3, "2 > 1", TRUE_VAL)
+
+TEST_CONST(Ge1, "1 >= 1", TRUE_VAL)
+TEST_CONST(Ge2, "1 >= 2", FALSE_VAL)
+TEST_CONST(Ge3, "2 >= 1", TRUE_VAL)
+
+TEST_CONST(Cmp1, "3 == 1 + 2", TRUE_VAL)
+
+TEST_EVAL(Cmp1, "3 == x + 2", 1, TRUE_VAL)
+TEST_EVAL(Cmp1b, "3 == x + 2", 1.5, FALSE_VAL)
+
+TEST_RESULT(CmpChain1, "1 < 2 < 3", TRUE_VAL)
+TEST_RESULT(CmpChain2, "1 < 2 == 2", TRUE_VAL)
+TEST_RESULT(CmpChain3, "1 < 2 > -1", TRUE_VAL)
+TEST_RESULT(CmpChain4, "1 < 2 < 2 < 3", FALSE_VAL)
+TEST_RESULT(CmpChain5, "1 < 2 <= 2 < 3", TRUE_VAL)
+
+TEST_EVAL(CmpChain1a, "1 < x < 3", 2, TRUE_VAL)
+TEST_EVAL(CmpChain1b, "1 < x < 3", 1, FALSE_VAL)
+TEST_EVAL(CmpChain1c, "1 < x < 3", 3, FALSE_VAL)
+
+TEST_CONST(Not1, "not 2", FALSE_VAL)
+TEST_CONST(Not2, "not 0", TRUE_VAL)
+TEST_CONST(Not3, "not not 2", TRUE_VAL)
+
+TEST_EVAL(Not1, "not x", 2, FALSE_VAL)
+TEST_EVAL(Not2, "not x", 0, TRUE_VAL)
+
+TEST_RESULT(And1, "2 and 3", 3.0)
+TEST_RESULT(And2, "0 and 3", 0.0)
+
+TEST_RESULT(Or1, "2 or 3", 2.0)
+TEST_RESULT(Or2, "0 or 3", 3.0)
+
+TEST_RESULT(Bool1, "2 or 3 and 4", 2.0)
+TEST_RESULT(Bool2, "not 2 or 3 and 4", 4.0)
+
+TEST(expr_pylike, Eval_Ternary1)
+{
+ ExprPyLike_Parsed *expr = parse_for_eval("x / 2 if x < 4 else x - 2 if x < 8 else x*2 - 12", true);
+
+ for (int i = 0; i <= 10; i++) {
+ double x = i;
+ double v = (x < 4) ? (x / 2) : (x < 8) ? (x - 2) : (x*2 - 12);
+
+ verify_eval_result(expr, x, v);
+ }
+
+ BLI_expr_pylike_free(expr);
+}
+
+TEST(expr_pylike, MultipleArgs)
+{
+ const char* names[3] = {"x", "y", "x"};
+ double values[3] = {1.0, 2.0, 3.0};
+
+ ExprPyLike_Parsed *expr = BLI_expr_pylike_parse("x*10 + y", names, ARRAY_SIZE(names));
+
+ EXPECT_TRUE(BLI_expr_pylike_is_valid(expr));
+
+ double result;
+ eExprPyLike_EvalStatus status = BLI_expr_pylike_eval(expr, values, 3, &result);
+
+ EXPECT_EQ(status, EXPR_PYLIKE_SUCCESS);
+ EXPECT_EQ(result, 32.0);
+
+ BLI_expr_pylike_free(expr);
+}
+
+#define TEST_ERROR(name, str, x, code) \
+ TEST(expr_pylike, Error_##name) { expr_pylike_error_test(str, x, code); }
+
+TEST_ERROR(DivZero1, "0 / 0", 0.0, EXPR_PYLIKE_MATH_ERROR)
+TEST_ERROR(DivZero2, "1 / 0", 0.0, EXPR_PYLIKE_DIV_BY_ZERO)
+TEST_ERROR(DivZero3, "1 / x", 0.0, EXPR_PYLIKE_DIV_BY_ZERO)
+TEST_ERROR(DivZero4, "1 / x", 1.0, EXPR_PYLIKE_SUCCESS)
+
+TEST_ERROR(SqrtDomain1, "sqrt(-1)", 0.0, EXPR_PYLIKE_MATH_ERROR)
+TEST_ERROR(SqrtDomain2, "sqrt(x)", -1.0, EXPR_PYLIKE_MATH_ERROR)
+TEST_ERROR(SqrtDomain3, "sqrt(x)", 0.0, EXPR_PYLIKE_SUCCESS)
+
+TEST_ERROR(PowDomain1, "pow(-1, 0.5)", 0.0, EXPR_PYLIKE_MATH_ERROR)
+TEST_ERROR(PowDomain2, "pow(-1, x)", 0.5, EXPR_PYLIKE_MATH_ERROR)
+TEST_ERROR(PowDomain3, "pow(-1, x)", 2.0, EXPR_PYLIKE_SUCCESS)
+
+TEST_ERROR(Mixed1, "sqrt(x) + 1 / max(0, x)", -1.0, EXPR_PYLIKE_MATH_ERROR)
+TEST_ERROR(Mixed2, "sqrt(x) + 1 / max(0, x)", 0.0, EXPR_PYLIKE_DIV_BY_ZERO)
+TEST_ERROR(Mixed3, "sqrt(x) + 1 / max(0, x)", 1.0, EXPR_PYLIKE_SUCCESS)
+
+TEST(expr_pylike, Error_Invalid)
+{
+ ExprPyLike_Parsed *expr = BLI_expr_pylike_parse("", NULL, 0);
+ double result;
+
+ EXPECT_EQ(BLI_expr_pylike_eval(expr, NULL, 0, &result), EXPR_PYLIKE_INVALID);
+
+ BLI_expr_pylike_free(expr);
+}
+
+TEST(expr_pylike, Error_ArgumentCount)
+{
+ ExprPyLike_Parsed *expr = parse_for_eval("x", false);
+ double result;
+
+ EXPECT_EQ(BLI_expr_pylike_eval(expr, NULL, 0, &result), EXPR_PYLIKE_FATAL_ERROR);
+
+ BLI_expr_pylike_free(expr);
+}
diff --git a/tests/gtests/blenlib/BLI_ghash_performance_test.cc b/tests/gtests/blenlib/BLI_ghash_performance_test.cc
index 0eca99ae542..18a1f121e47 100644
--- a/tests/gtests/blenlib/BLI_ghash_performance_test.cc
+++ b/tests/gtests/blenlib/BLI_ghash_performance_test.cc
@@ -83,16 +83,16 @@ static void str_ghash_tests(GHash *ghash, const char *id)
BLI_ghash_reserve(ghash, strlen(data) / 32); /* rough estimation... */
#endif
- BLI_ghash_insert(ghash, data, SET_INT_IN_POINTER(data[0]));
+ BLI_ghash_insert(ghash, data, POINTER_FROM_INT(data[0]));
for (p = c_p = data_p, w = c_w = data_w; *c_w; c_w++, c_p++) {
if (*c_p == '.') {
*c_p = *c_w = '\0';
if (!BLI_ghash_haskey(ghash, p)) {
- BLI_ghash_insert(ghash, p, SET_INT_IN_POINTER(p[0]));
+ BLI_ghash_insert(ghash, p, POINTER_FROM_INT(p[0]));
}
if (!BLI_ghash_haskey(ghash, w)) {
- BLI_ghash_insert(ghash, w, SET_INT_IN_POINTER(w[0]));
+ BLI_ghash_insert(ghash, w, POINTER_FROM_INT(w[0]));
}
p = c_p + 1;
w = c_w + 1;
@@ -100,7 +100,7 @@ static void str_ghash_tests(GHash *ghash, const char *id)
else if (*c_w == ' ') {
*c_w = '\0';
if (!BLI_ghash_haskey(ghash, w)) {
- BLI_ghash_insert(ghash, w, SET_INT_IN_POINTER(w[0]));
+ BLI_ghash_insert(ghash, w, POINTER_FROM_INT(w[0]));
}
w = c_w + 1;
}
@@ -118,21 +118,21 @@ static void str_ghash_tests(GHash *ghash, const char *id)
TIMEIT_START(string_lookup);
v = BLI_ghash_lookup(ghash, data_bis);
- EXPECT_EQ(GET_INT_FROM_POINTER(v), data_bis[0]);
+ EXPECT_EQ(POINTER_AS_INT(v), data_bis[0]);
for (p = w = c = data_bis; *c; c++) {
if (*c == '.') {
*c = '\0';
v = BLI_ghash_lookup(ghash, w);
- EXPECT_EQ(GET_INT_FROM_POINTER(v), w[0]);
+ EXPECT_EQ(POINTER_AS_INT(v), w[0]);
v = BLI_ghash_lookup(ghash, p);
- EXPECT_EQ(GET_INT_FROM_POINTER(v), p[0]);
+ EXPECT_EQ(POINTER_AS_INT(v), p[0]);
p = w = c + 1;
}
else if (*c == ' ') {
*c = '\0';
v = BLI_ghash_lookup(ghash, w);
- EXPECT_EQ(GET_INT_FROM_POINTER(v), w[0]);
+ EXPECT_EQ(POINTER_AS_INT(v), w[0]);
w = c + 1;
}
}
@@ -180,7 +180,7 @@ static void int_ghash_tests(GHash *ghash, const char *id, const unsigned int nbr
#endif
while (i--) {
- BLI_ghash_insert(ghash, SET_UINT_IN_POINTER(i), SET_UINT_IN_POINTER(i));
+ BLI_ghash_insert(ghash, POINTER_FROM_UINT(i), POINTER_FROM_UINT(i));
}
TIMEIT_END(int_insert);
@@ -194,8 +194,8 @@ static void int_ghash_tests(GHash *ghash, const char *id, const unsigned int nbr
TIMEIT_START(int_lookup);
while (i--) {
- void *v = BLI_ghash_lookup(ghash, SET_UINT_IN_POINTER(i));
- EXPECT_EQ(GET_UINT_FROM_POINTER(v), i);
+ void *v = BLI_ghash_lookup(ghash, POINTER_FROM_UINT(i));
+ EXPECT_EQ(POINTER_AS_UINT(v), i);
}
TIMEIT_END(int_lookup);
@@ -279,7 +279,7 @@ static void randint_ghash_tests(GHash *ghash, const char *id, const unsigned int
#endif
for (i = nbr, dt = data; i--; dt++) {
- BLI_ghash_insert(ghash, SET_UINT_IN_POINTER(*dt), SET_UINT_IN_POINTER(*dt));
+ BLI_ghash_insert(ghash, POINTER_FROM_UINT(*dt), POINTER_FROM_UINT(*dt));
}
TIMEIT_END(int_insert);
@@ -291,8 +291,8 @@ static void randint_ghash_tests(GHash *ghash, const char *id, const unsigned int
TIMEIT_START(int_lookup);
for (i = nbr, dt = data; i--; dt++) {
- void *v = BLI_ghash_lookup(ghash, SET_UINT_IN_POINTER(*dt));
- EXPECT_EQ(GET_UINT_FROM_POINTER(v), *dt);
+ void *v = BLI_ghash_lookup(ghash, POINTER_FROM_UINT(*dt));
+ EXPECT_EQ(POINTER_AS_UINT(v), *dt);
}
TIMEIT_END(int_lookup);
@@ -337,7 +337,7 @@ TEST(ghash, IntRandMurmur2a50000000)
static unsigned int ghashutil_tests_nohash_p(const void *p)
{
- return GET_UINT_FROM_POINTER(p);
+ return POINTER_AS_UINT(p);
}
static bool ghashutil_tests_cmp_p(const void *a, const void *b)
@@ -390,7 +390,7 @@ static void int4_ghash_tests(GHash *ghash, const char *id, const unsigned int nb
#endif
for (i = nbr, dt = data; i--; dt++) {
- BLI_ghash_insert(ghash, *dt, SET_UINT_IN_POINTER(i));
+ BLI_ghash_insert(ghash, *dt, POINTER_FROM_UINT(i));
}
TIMEIT_END(int_v4_insert);
@@ -403,7 +403,7 @@ static void int4_ghash_tests(GHash *ghash, const char *id, const unsigned int nb
for (i = nbr, dt = data; i--; dt++) {
void *v = BLI_ghash_lookup(ghash, (void *)(*dt));
- EXPECT_EQ(GET_UINT_FROM_POINTER(v), i);
+ EXPECT_EQ(POINTER_AS_UINT(v), i);
}
TIMEIT_END(int_v4_lookup);
@@ -464,12 +464,12 @@ static void multi_small_ghash_tests_one(GHash *ghash, RNG *rng, const unsigned i
#endif
for (i = nbr, dt = data; i--; dt++) {
- BLI_ghash_insert(ghash, SET_UINT_IN_POINTER(*dt), SET_UINT_IN_POINTER(*dt));
+ BLI_ghash_insert(ghash, POINTER_FROM_UINT(*dt), POINTER_FROM_UINT(*dt));
}
for (i = nbr, dt = data; i--; dt++) {
- void *v = BLI_ghash_lookup(ghash, SET_UINT_IN_POINTER(*dt));
- EXPECT_EQ(GET_UINT_FROM_POINTER(v), *dt);
+ void *v = BLI_ghash_lookup(ghash, POINTER_FROM_UINT(*dt));
+ EXPECT_EQ(POINTER_AS_UINT(v), *dt);
}
BLI_ghash_clear(ghash, NULL, NULL);
diff --git a/tests/gtests/blenlib/BLI_ghash_test.cc b/tests/gtests/blenlib/BLI_ghash_test.cc
index f73a13ce05a..a219d3ec21a 100644
--- a/tests/gtests/blenlib/BLI_ghash_test.cc
+++ b/tests/gtests/blenlib/BLI_ghash_test.cc
@@ -59,14 +59,14 @@ TEST(ghash, InsertLookup)
init_keys(keys, 0);
for (i = TESTCASE_SIZE, k = keys; i--; k++) {
- BLI_ghash_insert(ghash, SET_UINT_IN_POINTER(*k), SET_UINT_IN_POINTER(*k));
+ BLI_ghash_insert(ghash, POINTER_FROM_UINT(*k), POINTER_FROM_UINT(*k));
}
EXPECT_EQ(BLI_ghash_len(ghash), TESTCASE_SIZE);
for (i = TESTCASE_SIZE, k = keys; i--; k++) {
- void *v = BLI_ghash_lookup(ghash, SET_UINT_IN_POINTER(*k));
- EXPECT_EQ(GET_UINT_FROM_POINTER(v), *k);
+ void *v = BLI_ghash_lookup(ghash, POINTER_FROM_UINT(*k));
+ EXPECT_EQ(POINTER_AS_UINT(v), *k);
}
BLI_ghash_free(ghash, NULL, NULL);
@@ -82,15 +82,15 @@ TEST(ghash, InsertRemove)
init_keys(keys, 10);
for (i = TESTCASE_SIZE, k = keys; i--; k++) {
- BLI_ghash_insert(ghash, SET_UINT_IN_POINTER(*k), SET_UINT_IN_POINTER(*k));
+ BLI_ghash_insert(ghash, POINTER_FROM_UINT(*k), POINTER_FROM_UINT(*k));
}
EXPECT_EQ(BLI_ghash_len(ghash), TESTCASE_SIZE);
bkt_size = BLI_ghash_buckets_len(ghash);
for (i = TESTCASE_SIZE, k = keys; i--; k++) {
- void *v = BLI_ghash_popkey(ghash, SET_UINT_IN_POINTER(*k), NULL);
- EXPECT_EQ(GET_UINT_FROM_POINTER(v), *k);
+ void *v = BLI_ghash_popkey(ghash, POINTER_FROM_UINT(*k), NULL);
+ EXPECT_EQ(POINTER_AS_UINT(v), *k);
}
EXPECT_EQ(BLI_ghash_len(ghash), 0);
@@ -110,15 +110,15 @@ TEST(ghash, InsertRemoveShrink)
init_keys(keys, 20);
for (i = TESTCASE_SIZE, k = keys; i--; k++) {
- BLI_ghash_insert(ghash, SET_UINT_IN_POINTER(*k), SET_UINT_IN_POINTER(*k));
+ BLI_ghash_insert(ghash, POINTER_FROM_UINT(*k), POINTER_FROM_UINT(*k));
}
EXPECT_EQ(BLI_ghash_len(ghash), TESTCASE_SIZE);
bkt_size = BLI_ghash_buckets_len(ghash);
for (i = TESTCASE_SIZE, k = keys; i--; k++) {
- void *v = BLI_ghash_popkey(ghash, SET_UINT_IN_POINTER(*k), NULL);
- EXPECT_EQ(GET_UINT_FROM_POINTER(v), *k);
+ void *v = BLI_ghash_popkey(ghash, POINTER_FROM_UINT(*k), NULL);
+ EXPECT_EQ(POINTER_AS_UINT(v), *k);
}
EXPECT_EQ(BLI_ghash_len(ghash), 0);
@@ -138,7 +138,7 @@ TEST(ghash, Copy)
init_keys(keys, 30);
for (i = TESTCASE_SIZE, k = keys; i--; k++) {
- BLI_ghash_insert(ghash, SET_UINT_IN_POINTER(*k), SET_UINT_IN_POINTER(*k));
+ BLI_ghash_insert(ghash, POINTER_FROM_UINT(*k), POINTER_FROM_UINT(*k));
}
EXPECT_EQ(BLI_ghash_len(ghash), TESTCASE_SIZE);
@@ -149,8 +149,8 @@ TEST(ghash, Copy)
EXPECT_EQ(BLI_ghash_buckets_len(ghash_copy), BLI_ghash_buckets_len(ghash));
for (i = TESTCASE_SIZE, k = keys; i--; k++) {
- void *v = BLI_ghash_lookup(ghash_copy, SET_UINT_IN_POINTER(*k));
- EXPECT_EQ(GET_UINT_FROM_POINTER(v), *k);
+ void *v = BLI_ghash_lookup(ghash_copy, POINTER_FROM_UINT(*k));
+ EXPECT_EQ(POINTER_AS_UINT(v), *k);
}
BLI_ghash_free(ghash, NULL, NULL);
@@ -168,7 +168,7 @@ TEST(ghash, Pop)
init_keys(keys, 30);
for (i = TESTCASE_SIZE, k = keys; i--; k++) {
- BLI_ghash_insert(ghash, SET_UINT_IN_POINTER(*k), SET_UINT_IN_POINTER(*k));
+ BLI_ghash_insert(ghash, POINTER_FROM_UINT(*k), POINTER_FROM_UINT(*k));
}
EXPECT_EQ(BLI_ghash_len(ghash), TESTCASE_SIZE);
@@ -182,7 +182,7 @@ TEST(ghash, Pop)
EXPECT_TRUE(success);
if (i % 2) {
- BLI_ghash_insert(ghash, SET_UINT_IN_POINTER(i * 4), SET_UINT_IN_POINTER(i * 4));
+ BLI_ghash_insert(ghash, POINTER_FROM_UINT(i * 4), POINTER_FROM_UINT(i * 4));
}
}
diff --git a/tests/gtests/blenlib/BLI_heap_simple_test.cc b/tests/gtests/blenlib/BLI_heap_simple_test.cc
new file mode 100644
index 00000000000..29aa8f23c49
--- /dev/null
+++ b/tests/gtests/blenlib/BLI_heap_simple_test.cc
@@ -0,0 +1,117 @@
+/* Apache License, Version 2.0 */
+
+#include "testing/testing.h"
+#include <string.h>
+
+extern "C" {
+#include "BLI_compiler_attrs.h"
+#include "BLI_heap_simple.h"
+#include "BLI_utildefines.h"
+#include "BLI_rand.h"
+
+#include "MEM_guardedalloc.h"
+};
+
+#define SIZE 1024
+
+
+static void range_fl(float *array_tar, const int size)
+{
+ float *array_pt = array_tar + (size - 1);
+ int i = size;
+ while (i--) {
+ *(array_pt--) = (float)i;
+ }
+}
+
+TEST(heap, SimpleEmpty)
+{
+ HeapSimple *heap;
+
+ heap = BLI_heapsimple_new();
+ EXPECT_TRUE(BLI_heapsimple_is_empty(heap));
+ EXPECT_EQ(BLI_heapsimple_len(heap), 0);
+ BLI_heapsimple_free(heap, NULL);
+}
+
+TEST(heap, SimpleOne)
+{
+ HeapSimple *heap;
+ const char *in = "test";
+
+ heap = BLI_heapsimple_new();
+
+ BLI_heapsimple_insert(heap, 0.0f, (void *)in);
+ EXPECT_FALSE(BLI_heapsimple_is_empty(heap));
+ EXPECT_EQ(BLI_heapsimple_len(heap), 1);
+ EXPECT_EQ(in, BLI_heapsimple_pop_min(heap));
+ EXPECT_TRUE(BLI_heapsimple_is_empty(heap));
+ EXPECT_EQ(BLI_heapsimple_len(heap), 0);
+ BLI_heapsimple_free(heap, NULL);
+}
+
+TEST(heap, SimpleRange)
+{
+ const int items_total = SIZE;
+ HeapSimple *heap = BLI_heapsimple_new();
+ for (int in = 0; in < items_total; in++) {
+ BLI_heapsimple_insert(heap, (float)in, POINTER_FROM_INT(in));
+ }
+ for (int out_test = 0; out_test < items_total; out_test++) {
+ EXPECT_EQ(out_test, POINTER_AS_INT(BLI_heapsimple_pop_min(heap)));
+
+ }
+ EXPECT_TRUE(BLI_heapsimple_is_empty(heap));
+ BLI_heapsimple_free(heap, NULL);
+}
+
+TEST(heap, SimpleRangeReverse)
+{
+ const int items_total = SIZE;
+ HeapSimple *heap = BLI_heapsimple_new();
+ for (int in = 0; in < items_total; in++) {
+ BLI_heapsimple_insert(heap, (float)-in, POINTER_FROM_INT(-in));
+ }
+ for (int out_test = items_total - 1; out_test >= 0; out_test--) {
+ EXPECT_EQ(-out_test, POINTER_AS_INT(BLI_heapsimple_pop_min(heap)));
+ }
+ EXPECT_TRUE(BLI_heapsimple_is_empty(heap));
+ BLI_heapsimple_free(heap, NULL);
+}
+
+TEST(heap, SimpleDuplicates)
+{
+ const int items_total = SIZE;
+ HeapSimple *heap = BLI_heapsimple_new();
+ for (int in = 0; in < items_total; in++) {
+ BLI_heapsimple_insert(heap, 1.0f, 0);
+ }
+ for (int out_test = 0; out_test < items_total; out_test++) {
+ EXPECT_EQ(0, POINTER_AS_INT(BLI_heapsimple_pop_min(heap)));
+ }
+ EXPECT_TRUE(BLI_heapsimple_is_empty(heap));
+ BLI_heapsimple_free(heap, NULL);
+}
+
+static void random_heapsimple_helper(
+ const int items_total,
+ const int random_seed)
+{
+ HeapSimple *heap = BLI_heapsimple_new();
+ float *values = (float *)MEM_mallocN(sizeof(float) * items_total, __func__);
+ range_fl(values, items_total);
+ BLI_array_randomize(values, sizeof(float), items_total, random_seed);
+ for (int i = 0; i < items_total; i++) {
+ BLI_heapsimple_insert(heap, values[i], POINTER_FROM_INT((int)values[i]));
+ }
+ for (int out_test = 0; out_test < items_total; out_test++) {
+ EXPECT_EQ(out_test, POINTER_AS_INT(BLI_heapsimple_pop_min(heap)));
+ }
+ EXPECT_TRUE(BLI_heapsimple_is_empty(heap));
+ BLI_heapsimple_free(heap, NULL);
+ MEM_freeN(values);
+}
+
+TEST(heap, SimpleRand1) { random_heapsimple_helper(1, 1234); }
+TEST(heap, SimpleRand2) { random_heapsimple_helper(2, 1234); }
+TEST(heap, SimpleRand100) { random_heapsimple_helper(100, 4321); }
diff --git a/tests/gtests/blenlib/BLI_heap_test.cc b/tests/gtests/blenlib/BLI_heap_test.cc
index dd0bc3451ce..26f3aa19b9f 100644
--- a/tests/gtests/blenlib/BLI_heap_test.cc
+++ b/tests/gtests/blenlib/BLI_heap_test.cc
@@ -55,10 +55,10 @@ TEST(heap, Range)
const int items_total = SIZE;
Heap *heap = BLI_heap_new();
for (int in = 0; in < items_total; in++) {
- BLI_heap_insert(heap, (float)in, SET_INT_IN_POINTER(in));
+ BLI_heap_insert(heap, (float)in, POINTER_FROM_INT(in));
}
for (int out_test = 0; out_test < items_total; out_test++) {
- EXPECT_EQ(out_test, GET_INT_FROM_POINTER(BLI_heap_pop_min(heap)));
+ EXPECT_EQ(out_test, POINTER_AS_INT(BLI_heap_pop_min(heap)));
}
EXPECT_TRUE(BLI_heap_is_empty(heap));
@@ -70,10 +70,10 @@ TEST(heap, RangeReverse)
const int items_total = SIZE;
Heap *heap = BLI_heap_new();
for (int in = 0; in < items_total; in++) {
- BLI_heap_insert(heap, (float)-in, SET_INT_IN_POINTER(-in));
+ BLI_heap_insert(heap, (float)-in, POINTER_FROM_INT(-in));
}
for (int out_test = items_total - 1; out_test >= 0; out_test--) {
- EXPECT_EQ(-out_test, GET_INT_FROM_POINTER(BLI_heap_pop_min(heap)));
+ EXPECT_EQ(-out_test, POINTER_AS_INT(BLI_heap_pop_min(heap)));
}
EXPECT_TRUE(BLI_heap_is_empty(heap));
BLI_heap_free(heap, NULL);
@@ -85,14 +85,14 @@ TEST(heap, RangeRemove)
Heap *heap = BLI_heap_new();
HeapNode **nodes = (HeapNode **)MEM_mallocN(sizeof(HeapNode *) * items_total, __func__);
for (int in = 0; in < items_total; in++) {
- nodes[in] = BLI_heap_insert(heap, (float)in, SET_INT_IN_POINTER(in));
+ nodes[in] = BLI_heap_insert(heap, (float)in, POINTER_FROM_INT(in));
}
for (int i = 0; i < items_total; i += 2) {
BLI_heap_remove(heap, nodes[i]);
nodes[i] = NULL;
}
for (int out_test = 1; out_test < items_total; out_test += 2) {
- EXPECT_EQ(out_test, GET_INT_FROM_POINTER(BLI_heap_pop_min(heap)));
+ EXPECT_EQ(out_test, POINTER_AS_INT(BLI_heap_pop_min(heap)));
}
EXPECT_TRUE(BLI_heap_is_empty(heap));
BLI_heap_free(heap, NULL);
@@ -107,7 +107,7 @@ TEST(heap, Duplicates)
BLI_heap_insert(heap, 1.0f, 0);
}
for (int out_test = 0; out_test < items_total; out_test++) {
- EXPECT_EQ(0, GET_INT_FROM_POINTER(BLI_heap_pop_min(heap)));
+ EXPECT_EQ(0, POINTER_AS_INT(BLI_heap_pop_min(heap)));
}
EXPECT_TRUE(BLI_heap_is_empty(heap));
BLI_heap_free(heap, NULL);
@@ -122,10 +122,10 @@ static void random_heap_helper(
range_fl(values, items_total);
BLI_array_randomize(values, sizeof(float), items_total, random_seed);
for (int i = 0; i < items_total; i++) {
- BLI_heap_insert(heap, values[i], SET_INT_IN_POINTER((int)values[i]));
+ BLI_heap_insert(heap, values[i], POINTER_FROM_INT((int)values[i]));
}
for (int out_test = 0; out_test < items_total; out_test++) {
- EXPECT_EQ(out_test, GET_INT_FROM_POINTER(BLI_heap_pop_min(heap)));
+ EXPECT_EQ(out_test, POINTER_AS_INT(BLI_heap_pop_min(heap)));
}
EXPECT_TRUE(BLI_heap_is_empty(heap));
BLI_heap_free(heap, NULL);
@@ -143,14 +143,14 @@ TEST(heap, ReInsertSimple)
Heap *heap = BLI_heap_new();
HeapNode **nodes = (HeapNode **)MEM_mallocN(sizeof(HeapNode *) * items_total, __func__);
for (int in = 0; in < items_total; in++) {
- nodes[in] = BLI_heap_insert(heap, (float)in, SET_INT_IN_POINTER(in));
+ nodes[in] = BLI_heap_insert(heap, (float)in, POINTER_FROM_INT(in));
}
for (int i = 0; i < items_total; i++) {
BLI_heap_node_value_update(heap, nodes[i], (float)(items_total + i));
}
for (int out_test = 0; out_test < items_total; out_test++) {
- EXPECT_EQ(out_test, GET_INT_FROM_POINTER(BLI_heap_pop_min(heap)));
+ EXPECT_EQ(out_test, POINTER_AS_INT(BLI_heap_pop_min(heap)));
}
EXPECT_TRUE(BLI_heap_is_empty(heap));
@@ -165,7 +165,7 @@ static void random_heap_reinsert_helper(
Heap *heap = BLI_heap_new();
HeapNode **nodes = (HeapNode **)MEM_mallocN(sizeof(HeapNode *) * items_total, __func__);
for (int in = 0; in < items_total; in++) {
- nodes[in] = BLI_heap_insert(heap, (float)in, SET_INT_IN_POINTER(in));
+ nodes[in] = BLI_heap_insert(heap, (float)in, POINTER_FROM_INT(in));
}
BLI_array_randomize(nodes, sizeof(HeapNode *), items_total, random_seed);
for (int i = 0; i < items_total; i++) {
@@ -176,6 +176,7 @@ static void random_heap_reinsert_helper(
for (int out_test = 0; out_test < items_total; out_test++) {
HeapNode *node_top = BLI_heap_top(heap);
float out = BLI_heap_node_value(node_top);
+ EXPECT_EQ(out, BLI_heap_top_value(heap));
EXPECT_EQ((float)out_test, out);
BLI_heap_pop_min(heap);
}
diff --git a/tests/gtests/blenlib/BLI_kdopbvh_test.cc b/tests/gtests/blenlib/BLI_kdopbvh_test.cc
index 48f4d7054da..ff4a74b8be8 100644
--- a/tests/gtests/blenlib/BLI_kdopbvh_test.cc
+++ b/tests/gtests/blenlib/BLI_kdopbvh_test.cc
@@ -52,11 +52,23 @@ TEST(kdopbvh, Single)
BLI_bvhtree_free(tree);
}
+void optimal_check_callback(void *userdata, int index, const float co[3], BVHTreeNearest *nearest)
+{
+ float (*points)[3] = (float (*)[3])userdata;
+
+ /* BVH_NEAREST_OPTIMAL_ORDER should hit the right node on the first try */
+ EXPECT_EQ(nearest->index, -1);
+ EXPECT_EQ_ARRAY(co, points[index], 3);
+
+ nearest->index = index;
+ nearest->dist_sq = len_squared_v3v3(co, points[index]);
+}
+
/**
* Note that a small epsilon is added to the BVH nodes bounds, even if we pass in zero.
* Use rounding to ensure very close nodes don't cause the wrong node to be found as nearest.
*/
-static void find_nearest_points_test(int points_len, float scale, int round, int random_seed)
+static void find_nearest_points_test(int points_len, float scale, int round, int random_seed, bool optimal = false)
{
struct RNG *rng = BLI_rng_new(random_seed);
BVHTree *tree = BLI_bvhtree_new(points_len, 0.0, 8, 8);
@@ -69,9 +81,13 @@ static void find_nearest_points_test(int points_len, float scale, int round, int
BLI_bvhtree_insert(tree, i, points[i], 1);
}
BLI_bvhtree_balance(tree);
+
/* first find each point */
+ BVHTree_NearestPointCallback callback = optimal ? optimal_check_callback : NULL;
+ int flags = optimal ? BVH_NEAREST_OPTIMAL_ORDER : 0;
+
for (int i = 0; i < points_len; i++) {
- const int j = BLI_bvhtree_find_nearest(tree, points[i], NULL, NULL, NULL);
+ const int j = BLI_bvhtree_find_nearest_ex(tree, points[i], NULL, callback, points, flags);
if (j != i) {
#if 0
const float dist = len_v3v3(points[i], points[j]);
@@ -95,3 +111,7 @@ static void find_nearest_points_test(int points_len, float scale, int round, int
TEST(kdopbvh, FindNearest_1) { find_nearest_points_test(1, 1.0, 1000, 1234); }
TEST(kdopbvh, FindNearest_2) { find_nearest_points_test(2, 1.0, 1000, 123); }
TEST(kdopbvh, FindNearest_500) { find_nearest_points_test(500, 1.0, 1000, 12); }
+
+TEST(kdopbvh, OptimalFindNearest_1) { find_nearest_points_test(1, 1.0, 1000, 1234, true); }
+TEST(kdopbvh, OptimalFindNearest_2) { find_nearest_points_test(2, 1.0, 1000, 123, true); }
+TEST(kdopbvh, OptimalFindNearest_500) { find_nearest_points_test(500, 1.0, 1000, 12, true); }
diff --git a/tests/gtests/blenlib/BLI_linklist_lockfree_test.cc b/tests/gtests/blenlib/BLI_linklist_lockfree_test.cc
index b5b790079d5..309efaee00e 100644
--- a/tests/gtests/blenlib/BLI_linklist_lockfree_test.cc
+++ b/tests/gtests/blenlib/BLI_linklist_lockfree_test.cc
@@ -74,7 +74,7 @@ void concurrent_insert(TaskPool *__restrict pool,
CHECK_NOTNULL(list);
IndexedNode *node = (IndexedNode *)MEM_mallocN(sizeof(IndexedNode),
"test node");
- node->index = GET_INT_FROM_POINTER(taskdata);
+ node->index = POINTER_AS_INT(taskdata);
BLI_linklist_lockfree_insert(list, (LockfreeLinkNode *)node);
}
@@ -95,7 +95,7 @@ TEST(LockfreeLinkList, InsertMultipleConcurrent)
for (int i = 0; i < num_nodes; ++i) {
BLI_task_pool_push(pool,
concurrent_insert,
- SET_INT_IN_POINTER(i),
+ POINTER_FROM_INT(i),
false,
TASK_PRIORITY_HIGH);
}
diff --git a/tests/gtests/blenlib/CMakeLists.txt b/tests/gtests/blenlib/CMakeLists.txt
index 7be18330ac3..e652fbecb36 100644
--- a/tests/gtests/blenlib/CMakeLists.txt
+++ b/tests/gtests/blenlib/CMakeLists.txt
@@ -43,9 +43,11 @@ endif()
BLENDER_TEST(BLI_array_store "bf_blenlib")
BLENDER_TEST(BLI_array_utils "bf_blenlib")
+BLENDER_TEST(BLI_expr_pylike_eval "bf_blenlib")
BLENDER_TEST(BLI_ghash "bf_blenlib")
BLENDER_TEST(BLI_hash_mm2a "bf_blenlib")
BLENDER_TEST(BLI_heap "bf_blenlib")
+BLENDER_TEST(BLI_heap_simple "bf_blenlib")
BLENDER_TEST(BLI_kdopbvh "bf_blenlib")
BLENDER_TEST(BLI_linklist_lockfree "bf_blenlib")
BLENDER_TEST(BLI_listbase "bf_blenlib")
diff --git a/tests/python/CMakeLists.txt b/tests/python/CMakeLists.txt
index d5ba68b9b93..9faedf93d62 100644
--- a/tests/python/CMakeLists.txt
+++ b/tests/python/CMakeLists.txt
@@ -583,7 +583,7 @@ if(WITH_OPENGL_DRAW_TESTS)
file(GLOB children RELATIVE ${TEST_SRC_DIR} ${TEST_SRC_DIR}/*)
foreach(child ${children})
if(IS_DIRECTORY ${TEST_SRC_DIR}/${child})
- file(GLOB blends ${TEST_SRC_DIR}/${child}/*.blend)
+ file(GLOB_RECURSE blends "${TEST_SRC_DIR}/${child}/*.blend")
if(blends)
add_python_test(
opengl_draw_${child}_test
diff --git a/tests/python/bl_keymap_completeness.py b/tests/python/bl_keymap_completeness.py
index 652ed449a3c..0edee3b02f0 100644
--- a/tests/python/bl_keymap_completeness.py
+++ b/tests/python/bl_keymap_completeness.py
@@ -27,12 +27,12 @@ from bpy_extras import keyconfig_utils
def check_maps():
maps = {}
- def fill_maps(ls):
- for km_name, km_space_type, km_region_type, km_sub in ls:
+ def fill_maps(seq):
+ for km_name, km_space_type, km_region_type, km_sub in seq:
maps[km_name] = (km_space_type, km_region_type)
fill_maps(km_sub)
- fill_maps(keyconfig_utils.KM_HIERARCHY)
+ fill_maps(keyconfig_utils.km_hierarchy())
import bpy
keyconf = bpy.context.window_manager.keyconfigs.active
diff --git a/tests/python/bl_mesh_modifiers.py b/tests/python/bl_mesh_modifiers.py
index f2ab6b406bd..74eaaeb7c68 100644
--- a/tests/python/bl_mesh_modifiers.py
+++ b/tests/python/bl_mesh_modifiers.py
@@ -370,7 +370,7 @@ def modifier_armature_add(scene, obj):
scene.objects.active = obj
# display options
- obj_arm.show_x_ray = True
+ obj_arm.show_in_front = True
arm_data.draw_type = 'STICK'
# apply to modifier
@@ -425,7 +425,7 @@ def modifier_hook_add(scene, obj, use_vgroup=True):
obj_hook = mod.object
obj_hook.rotation_euler = 0, math.radians(45), 0
- obj_hook.show_x_ray = True
+ obj_hook.show_in_front = True
if use_vgroup:
mod.vertex_group = obj.vertex_groups[0].name
diff --git a/tests/python/bl_run_operators.py b/tests/python/bl_run_operators.py
index aae78a84132..9a3f801b04a 100644
--- a/tests/python/bl_run_operators.py
+++ b/tests/python/bl_run_operators.py
@@ -136,7 +136,7 @@ def filter_op_list(operators):
def reset_blend():
bpy.ops.wm.read_factory_settings()
for scene in bpy.data.scenes:
- # reduce range so any bake action doesnt take too long
+ # reduce range so any bake action doesn't take too long
scene.frame_start = 1
scene.frame_end = 5
diff --git a/tests/python/bl_test.py b/tests/python/bl_test.py
index 0cb322a21b1..ceb5811438a 100644
--- a/tests/python/bl_test.py
+++ b/tests/python/bl_test.py
@@ -181,7 +181,7 @@ def main():
sys.exit(1)
if md5 != md5_new:
- print(" Running: %s\n MD5 Recieved: %s\n MD5 Expected: %s" % (run, md5_new, md5))
+ print(" Running: %s\n MD5 Received: %s\n MD5 Expected: %s" % (run, md5_new, md5))
sys.exit(1)
print(" Success: %s" % run)
diff --git a/tests/python/modules/render_report.py b/tests/python/modules/render_report.py
index 1f0022f13b6..9cff85f3dfa 100755
--- a/tests/python/modules/render_report.py
+++ b/tests/python/modules/render_report.py
@@ -51,10 +51,11 @@ def print_message(message, type=None, status=''):
def blend_list(dirpath):
- for filename in os.listdir(dirpath):
- if filename.lower().endswith(".blend"):
- filepath = os.path.join(dirpath, filename)
- yield filepath
+ for root, dirs, files in os.walk(dirpath):
+ for filename in files:
+ if filename.lower().endswith(".blend"):
+ filepath = os.path.join(root, filename)
+ yield filepath
def test_get_name(filepath):
@@ -373,7 +374,7 @@ class Report:
testname = test_get_name(filepath)
print_message(testname, 'SUCCESS', 'RUN')
time_start = time.time()
- tmp_filepath = os.path.join(self.output_dir, "tmp")
+ tmp_filepath = os.path.join(self.output_dir, "tmp_" + testname)
error = render_cb(filepath, tmp_filepath)
status = "FAIL"
diff --git a/tests/python/opengl_draw_tests.py b/tests/python/opengl_draw_tests.py
index ae7f0dabf74..b6c18e289bc 100755
--- a/tests/python/opengl_draw_tests.py
+++ b/tests/python/opengl_draw_tests.py
@@ -36,6 +36,9 @@ if inside_blender:
def render_file(filepath, output_filepath):
command = (
BLENDER,
+ "--no-window-focus",
+ "--window-geometry",
+ "0", "0", "1024", "768",
"-noaudio",
"--factory-startup",
"--enable-autoexec",
diff --git a/tests/python/view_layer/test_evaluation_selectability_a.py b/tests/python/view_layer/test_evaluation_selectability_a.py
index f862ca55c86..eaed40869c3 100644
--- a/tests/python/view_layer/test_evaluation_selectability_a.py
+++ b/tests/python/view_layer/test_evaluation_selectability_a.py
@@ -38,7 +38,7 @@ class UnitTesting(ViewLayerTesting):
layer_collection_mom.enabled = False
bpy.context.scene.update() # update depsgraph
- cube.select_set('SELECT')
+ cube.select_set(True)
self.assertTrue(cube.visible_get(), "Cube should be visible")
self.assertTrue(cube.select_get(), "Cube should be selected")
diff --git a/tests/python/view_layer/test_evaluation_selectability_b.py b/tests/python/view_layer/test_evaluation_selectability_b.py
index 91f5dc3de2b..584011c672c 100644
--- a/tests/python/view_layer/test_evaluation_selectability_b.py
+++ b/tests/python/view_layer/test_evaluation_selectability_b.py
@@ -36,7 +36,7 @@ class UnitTesting(ViewLayerTesting):
layer_collection_mom = layer.collections.link(scene_collection_mom)
layer_collection_kid = layer.collections.link(scene_collection_kid)
bpy.context.scene.update() # update depsgraph
- cube.select_set('SELECT')
+ cube.select_set(True)
layer_collection_mom.collections[layer_collection_kid.name].enabled = False
layer_collection_kid.enabled = False
diff --git a/tests/python/view_layer/test_evaluation_selectability_c.py b/tests/python/view_layer/test_evaluation_selectability_c.py
index c1ce5dba815..3eecaa06aeb 100644
--- a/tests/python/view_layer/test_evaluation_selectability_c.py
+++ b/tests/python/view_layer/test_evaluation_selectability_c.py
@@ -38,7 +38,7 @@ class UnitTesting(ViewLayerTesting):
layer_collection_mom.enabled = True
bpy.context.scene.update() # update depsgraph
- cube.select_set('SELECT')
+ cube.select_set(True)
self.assertTrue(cube.visible_get(), "Cube should be visible")
self.assertTrue(cube.select_get(), "Cube should be selected")
diff --git a/tests/python/view_layer/test_evaluation_selectability_d.py b/tests/python/view_layer/test_evaluation_selectability_d.py
index 1af8a0dbd59..c645551c5ed 100644
--- a/tests/python/view_layer/test_evaluation_selectability_d.py
+++ b/tests/python/view_layer/test_evaluation_selectability_d.py
@@ -39,7 +39,7 @@ class UnitTesting(ViewLayerTesting):
layer_collection_mom.enabled = True
bpy.context.scene.update() # update depsgraph
- cube.select_set('SELECT')
+ cube.select_set(True)
layer_collection_mom.collections[layer_collection_kid.name].selectable = False
bpy.context.scene.update() # update depsgraph
diff --git a/tests/python/view_layer/test_evaluation_selectability_e.py b/tests/python/view_layer/test_evaluation_selectability_e.py
index 54df1e9b59b..e2f0e911bbe 100644
--- a/tests/python/view_layer/test_evaluation_selectability_e.py
+++ b/tests/python/view_layer/test_evaluation_selectability_e.py
@@ -37,7 +37,7 @@ class UnitTesting(ViewLayerTesting):
layer_collection_kid = layer.collections.link(scene_collection_kid)
layer_collection_mom.enabled = True
- cube.select_set('SELECT')
+ cube.select_set(True)
layer_collection_mom.collections[layer_collection_kid.name].selectable = False
layer_collection_kid.enabled = False
diff --git a/tests/python/view_layer/test_evaluation_selectability_f.py b/tests/python/view_layer/test_evaluation_selectability_f.py
index fbc4a49fc11..a902dd1dada 100644
--- a/tests/python/view_layer/test_evaluation_selectability_f.py
+++ b/tests/python/view_layer/test_evaluation_selectability_f.py
@@ -31,7 +31,7 @@ class UnitTesting(ViewLayerTesting):
self.assertTrue(layer_collection.selectable)
bpy.context.scene.update() # update depsgraph
- cube.select_set(action='SELECT')
+ cube.select_set(True)
self.assertTrue(cube.select_get())
diff --git a/tests/python/view_layer/test_group_e.py b/tests/python/view_layer/test_group_e.py
index 566c043572e..14385411eca 100644
--- a/tests/python/view_layer/test_group_e.py
+++ b/tests/python/view_layer/test_group_e.py
@@ -51,9 +51,9 @@ class UnitTesting(ViewLayerTesting):
# we could just pass an overridden context
# but let's do it the old fashion way
view_layer.objects.active = ob
- ob.select_set('SELECT')
+ ob.select_set(True)
self.assertTrue(ob.select_get())
- empty.select_set('DESELECT')
+ empty.select_set(False)
self.assertFalse(empty.select_get())
# update depsgraph
diff --git a/tests/python/view_layer/test_make_single_user.py b/tests/python/view_layer/test_make_single_user.py
index 292c2d50605..973c191f22d 100644
--- a/tests/python/view_layer/test_make_single_user.py
+++ b/tests/python/view_layer/test_make_single_user.py
@@ -36,7 +36,7 @@ class UnitTesting(ViewLayerTesting):
master_collection.collections[0])
view_layer.collections.link(master_collection)
- ob.select_set('SELECT')
+ ob.select_set(True)
# update depsgraph
scene.update()
diff --git a/tests/python/view_layer/test_object_copy.py b/tests/python/view_layer/test_object_copy.py
index 19a7c56b989..2ca5e170192 100644
--- a/tests/python/view_layer/test_object_copy.py
+++ b/tests/python/view_layer/test_object_copy.py
@@ -46,7 +46,7 @@ class UnitTesting(ViewLayerTesting):
if mode == 'DUPLICATE':
# assuming the latest layer is the active layer
bpy.ops.object.select_all(action='DESELECT')
- three_c.select_set(action='SELECT')
+ three_c.select_set(True)
bpy.ops.object.duplicate()
elif mode == 'NAMED':
diff --git a/tests/python/view_layer/test_scene_copy_e.py b/tests/python/view_layer/test_scene_copy_e.py
index 23d01b6a84b..a2d314a037a 100644
--- a/tests/python/view_layer/test_scene_copy_e.py
+++ b/tests/python/view_layer/test_scene_copy_e.py
@@ -26,7 +26,7 @@ class UnitTesting(ViewLayerTesting):
layer = bpy.context.view_layer
original_cube = layer.objects.get('Cube')
- original_cube.select_set('SELECT')
+ original_cube.select_set(True)
self.assertTrue(original_cube.select_get())
bpy.ops.scene.new(type='FULL_COPY')
diff --git a/tests/python/view_layer/view_layer_common.py b/tests/python/view_layer/view_layer_common.py
index 25cf7c80d96..709ef4afbfe 100644
--- a/tests/python/view_layer/view_layer_common.py
+++ b/tests/python/view_layer/view_layer_common.py
@@ -416,7 +416,7 @@ class ViewLayerTesting(unittest.TestCase):
elif del_mode == 'OPERATOR':
bpy.context.scene.update() # update depsgraph
bpy.ops.object.select_all(action='DESELECT')
- ob.select_set(action='SELECT')
+ ob.select_set(True)
self.assertTrue(ob.select_get())
bpy.ops.object.delete()